12 Módulo Horarios de Atención para Citas Migración, Modelo, Relación, Rutas, Controladores y Vistas
Duración: 27 minDescripción
🎓 Lección 12: Módulo de Horarios de Atención para Citas (Migración, Modelo, Relación, Rutas, Controladores y Vistas)
Objetivo General: Diseñar e implementar el módulo de horarios de atención para doctores en Laravel, integrando datos de prueba mediante Factories y Seeders, validaciones para evitar traslapes de turnos, y la visualización tabular y matricial de horarios semanales con Tabler UI.
🚀 Pasos Clave con Timestamps
- ⏱️ 00:00 📌 Introducción y Contexto del Módulo: Justificación del módulo de horarios como requisito previo a la gestión de citas médicas y planificación de datos de prueba para doctores.
- ⏱️ 01:23 🏭 Creación y Configuración del DoctorFactory: Generación del factory para el modelo Doctor usando Faker, sembrando usuarios, asignando el rol correspondiente y poblando campos del perfil profesional.
- ⏱️ 03:22 🌱 Integración de Seeding y Generación Masiva de Datos: Configuración del trait HasFactory en los modelos y ejecución de php artisan migrate:fresh --seed para poblar la base de datos de prueba.
- ⏱️ 06:17 🛠️ Generación de Componentes para Horarios: Creación del modelo Horario, archivo de migración, controlador de recursos y archivo Factory mediante el comando Artisan.
- ⏱️ 07:10 📐 Diseño de la Tabla y Definición del Esquema DB: Configuración de columnas en la migración (doctor_id, dia_semana, turno, hora_inicio, hora_fin, activo), clave foránea con borrado en cascada y restricciones.
- ⏱️ 12:55 🔗 Configuración de Relaciones Eloquent: Definición de $fillable y de las relaciones belongsTo (Horario -> Doctor) y hasMany (Doctor -> Horarios).
- ⏱️ 14:54 🌐 Rutas HTTP y Menú de Navegación: Declaración de las rutas protegidas para el CRUD de horarios y registro de la nueva opción en el menú de config/tabler.php.
- ⏱️ 16:26 🎨 Creación de Vistas Blade y Renderizado de Horarios: Estructuración de plantillas (index, create, show, edit) con Tabler UI, dividiendo la interfaz entre el listado general y el cuadrante semanal por doctor.
- ⏱️ 18:24 🧠 Lógica del Controlador y Control de Choque de Horarios: Implementación de validaciones en HorarioController@store para detectar traslapes existentes en el mismo día y turno antes de la persistencia.
- ⏱️ 21:29 🧪 Pruebas de Integración con HorarioFactory: Verificación del comportamiento del sistema con 100+ registros sembrados y prueba de las restricciones contra duplicidad en la interfaz.
🛠️ Comandos y Rutas Principales
| Tipo / Propósito | Comando Terminal / Artisan | Ruta HTTP / Nombre de Ruta |
|---|---|---|
| Generar Factory de Doctor | php artisan make:factory DoctorFactory | N/A |
| Generar Módulo de Horarios | php artisan make:model Horario -mc --resource | N/A |
| Refrescar Base de Datos con Seeders | php artisan migrate:fresh --seed | N/A |
| Listado de Horarios | N/A | GET /admin/horarios (admin.horarios.index) |
| Formulario de Registro | N/A | GET /admin/horarios/create (admin.horarios.create) |
| Almacenar Horario | N/A | POST /admin/horarios (admin.horarios.store) |
| Detalle de Horario | N/A | GET /admin/horarios/{horario} (admin.horarios.show) |
| Formulario de Edición | N/A | GET /admin/horarios/{horario}/edit (admin.horarios.edit) |
| Actualizar Horario | N/A | PUT/PATCH /admin/horarios/{horario} (admin.horarios.update) |
| Eliminar Horario | N/A | DELETE /admin/horarios/{horario} (admin.horarios.destroy) |
🔒 Buenas Prácticas y Seguridad
- Prevención de Traslapes de Horario (Overlap Check): Antes de almacenar un nuevo registro en HorarioController@store, consultar la base de datos filtrando por doctor_id, dia_semana y turno. Si ya existe una coincidencia, retornar una respuesta de validación amigable evitando registros contradictorios.
- Uso de Campos String Estándar para Caracteres Especiales: Preferir tipos de datos string (VARCHAR) en lugar de tipos ENUM restrictivos cuando los valores contengan acentos o tildes (ej. Miércoles, Sábado), facilitando la compatibilidad de codificación UTF-8 en el motor de base de datos.
- Integridad Referencial con Eliminación en Cascada: Definir la clave foránea doctor_id con onDelete('cascade') en la migración. De esta forma, si se elimina un doctor del sistema, sus bloques de horario asociados se removerán automáticamente sin dejar datos huérfanos.
- Optimización del Carga de Datos (Seeders / Factories): Limitar la cantidad de registros generados en los Seeders durante la fase de desarrollo para evitar tiempos prolongados en comandos como migrate:fresh --seed, garantizando entornos de desarrollo ágiles.