12 Módulo Horarios de Atención para Citas Migración, Modelo, Relación, Rutas, Controladores y Vistas

Duración: 27 min
Módulo: Horarios de Atención & Agenda Médica Lección 1 de 2

Descripció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ósitoComando Terminal / ArtisanRuta HTTP / Nombre de Ruta
Generar Factory de Doctorphp artisan make:factory DoctorFactoryN/A
Generar Módulo de Horariosphp artisan make:model Horario -mc --resourceN/A
Refrescar Base de Datos con Seedersphp artisan migrate:fresh --seedN/A
Listado de HorariosN/AGET /admin/horarios (admin.horarios.index)
Formulario de RegistroN/AGET /admin/horarios/create (admin.horarios.create)
Almacenar HorarioN/APOST /admin/horarios (admin.horarios.store)
Detalle de HorarioN/AGET /admin/horarios/{horario} (admin.horarios.show)
Formulario de EdiciónN/AGET /admin/horarios/{horario}/edit (admin.horarios.edit)
Actualizar HorarioN/APUT/PATCH /admin/horarios/{horario} (admin.horarios.update)
Eliminar HorarioN/ADELETE /admin/horarios/{horario} (admin.horarios.destroy)

🔒 Buenas Prácticas y Seguridad

  1. 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.
  2. 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.
  3. 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.
  4. 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.