En Desarrollo

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.

person
Rol Full Stack Developer
calendar_month
Duración 4 meses
school
Tipo Proyecto personal
engineering
Estado En Desarrollo

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.

schedule

Horarios manuales ineficientes

La asignación manual de turnos consume horas de trabajo administrativo y es propensa a errores humanos, generando conflictos de cobertura.

warning

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.

edit_note

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.

assessment

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.

desktop_windows

Frontend

Interfaz responsiva construida con Blade Templates, Vite como bundler y Tailwind CSS para un diseño moderno y consistente.

Blade Vite Tailwind JavaScript
dns

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.

PHP Laravel Node.js
storage

Infraestructura

Entorno containerizado con Docker, MySQL como base de datos relacional y Redis para caché y manejo de sesiones de alto rendimiento.

Docker MySQL Redis

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

PHP

Lenguaje principal

Laravel

Laravel

Framework Backend

Docker

Docker

Containerización

MySQL

MySQL

Base de datos

Redis

Redis

Caché & Sesiones

Node.js

Node.js

Tooling & Build

Vite

Vite

Build Tool

Tailwind CSS

Tailwind CSS

Framework CSS

Características Principales

auto_awesome

Generación automática de horarios

Algoritmo que crea horarios óptimos respetando restricciones laborales, disponibilidad de empleados y reglas de rotación configurables.

tune

Ajustes manuales con validación

Permite modificaciones manuales que se validan en tiempo real contra las restricciones definidas, previniendo conflictos.

groups

Gestión de empleados

Panel completo para administrar perfiles, disponibilidad, preferencias y restricciones individuales de cada trabajador.

bar_chart

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.

shield

Sistema de autenticación

Control de acceso basado en roles con permisos granulares para administradores, supervisores y empleados.

devices

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

bug_report

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).

psychology

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.

rocket_launch

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.

lock Código Privado
mail Contactar