SmartShift
Construí este sistema para resolver el dolor de cabeza que es armar horarios a mano. Automatiza la asignación de turnos cruzando disponibilidad, reglas legales y emergencias, todo en tiempo real.
El Problema real
Noté que en muchas organizaciones, coordinar turnos para docenas de empleados se hace en Excel o papel. Es un proceso lento que casi siempre termina en conflictos, horas extras innecesarias o turnos descubiertos.
Horarios manuales ineficientes
La asignación manual de turnos consume horas de trabajo administrativo y es propensa a errores humanos, generando conflictos de cobertura.
Restricciones complejas
Cruzar la disponibilidad de las personas con las leyes laborales (horas máximas) y reglas del negocio es un rompecabezas casi imposible de hacer a mano.
Ajustes de última hora
Los cambios de turno de emergencia desorganizan la planificación existente, sin herramientas para reasignar de forma eficiente y mantener el cumplimiento de restricciones.
Falta de visibilidad
Sin reportes automatizados, los administradores carecen de métricas sobre carga laboral, horas extras y distribución equitativa del trabajo entre empleados.
Mi enfoque y Solución
Para resolver esto, decidí separar completamente el frontend del backend. Necesitaba una API robusta que pudiera hacer los cálculos matemáticos de los horarios sin bloquear la interfaz del usuario.
Frontend
Interfaz responsiva construida con Blade Templates, Vite como bundler y Tailwind CSS para un diseño moderno y consistente.
Backend
API REST con Laravel, lógica de negocio para generación automática de horarios, gestión de restricciones y validación de reglas laborales.
Infraestructura
Entorno containerizado con Docker, MySQL como base de datos relacional y Redis para caché y manejo de sesiones de alto rendimiento.
psychology Retos y Trade-offs
- flag ¿Por qué Laravel y no Node.js? — El algoritmo de asignación de turnos requiere mucha lógica relacional pesada. El ORM de Laravel (Eloquent) me permitía modelar estas relaciones complejas mucho más rápido y seguro que escribiendo SQL crudo o usando ORMs de JS menos maduros.
- flag El cuello de botella de la Base de Datos — Al principio, recalcular un horario hacía demasiadas queries. El trade-off fue implementar Redis: sacrifiqué un poco de simplicidad en la arquitectura a cambio de cachear disponibilidades en memoria, reduciendo el tiempo de cálculo a milisegundos.
- check_circle Docker para reproducibilidad — Garantiza que el entorno de desarrollo sea idéntico al de producción, eliminando inconsistencias de configuración.
Stack Tecnológico
PHP
Lenguaje principal
Laravel
Framework Backend
Docker
Containerización
MySQL
Base de datos
Redis
Caché & Sesiones
Node.js
Tooling & Build
Vite
Build Tool
Tailwind CSS
Framework CSS
Características Principales
Generación automática de horarios
Algoritmo que crea horarios óptimos respetando restricciones laborales, disponibilidad de empleados y reglas de rotación configurables.
Ajustes manuales con validación
Permite modificaciones manuales que se validan en tiempo real contra las restricciones definidas, previniendo conflictos.
Gestión de empleados
Panel completo para administrar perfiles, disponibilidad, preferencias y restricciones individuales de cada trabajador.
Reportes y métricas
Generación de reportes con estadísticas de horas trabajadas, distribución equitativa y análisis de cobertura por período.
Sistema de autenticación
Control de acceso basado en roles con permisos granulares para administradores, supervisores y empleados.
Interfaz responsive
Diseño adaptable que permite consultar y gestionar turnos desde cualquier dispositivo, optimizado para escritorio y móvil.
Capturas del Proyecto
Aprendizajes y Resultados
Lo que falló al principio
Mi primer algoritmo intentaba asignar a todos al mismo tiempo. Terminaba en bucles infinitos cuando no había suficiente personal. Tuve que reescribirlo para asignar primero los turnos críticos (restricción dura) y luego los flexibles (restricción blanda).
Lógica de negocio compleja
El manejo de restricciones múltiples y validación cruzada reforzó mi capacidad para modelar problemas combinatorios en código limpio y testeable.
DevOps y containerización
La implementación de Docker y Redis me permitió profundizar en prácticas de DevOps, optimización de rendimiento y gestión de entornos reproducibles.
¿Te interesa este proyecto?
Si te interesa ver cómo estructuré el código, cómo manejé la lógica relacional en Laravel o simplemente hablar sobre arquitectura, echa un vistazo al repo o escríbeme.