16 Módulo de Reserva de Citas MIgracion, Modelos y Relaciones en el Sistema de Odontología Clinica
Duración: 17 minDescripción
🎓 Lección 16: Módulo de Reserva de Citas - Arquitectura, Migración, Modelos y Relaciones Eloquent
Objetivo General: Construir el núcleo estructural del sistema de agendamiento conectando las entidades de pacientes, doctores y tratamientos en la tabla citas, estableciendo un esquema seguro con tokens únicos de confirmación, gestión de estados y relaciones multidireccionales en Laravel.
🚀 Pasos Clave con Timestamps
- ⏱️ 00:00 — Introducción al Corazón del Sistema: Contextualización del módulo de citas como el componente central que integra doctores, pacientes, horarios y tratamientos con validaciones anti-traslape.
- ⏱️ 01:25 — Análisis del Diagrama Entidad-Relación (ER): Explicación de la estructura de la tabla citas, incluyendo claves foráneas, token de confirmación de 12 caracteres, campo de observaciones, timestamps y auditoría de recordatorios (recordatorio_enviado_en).
- ⏱️ 04:45 — Generación de Artefactos con Artisan: Creación en simultáneo del modelo, migración y controlador de recursos mediante el comando php artisan make:model Cita -mc.
- ⏱️ 05:35 — Construcción del Esquema de Migración: Definición técnica de campos (token único, paciente_id, doctor_id, tratamiento_id, fecha, hora, estado tipo ENUM, observacion, recordatorio_enviado_en) e índice único compuesto para evitar duplicidad de agenda.
- ⏱️ 08:35 — Ejecución de Migraciones e Inspección de BD: Aplicación de php artisan migrate y validación de las referencias/llaves foráneas en el diseñador de la base de datos (22 tablas en total).
- ⏱️ 10:00 — Configuración del Modelo Cita y Filtrado $fillable: Asignación explícita de campos permitidos para asignación masiva y estructura base de metadatos.
- ⏱️ 10:45 — Definición de Relaciones Eloquent Inversas (belongsTo): Mapeo en el modelo Cita indicando su pertenencia individual a Paciente, Doctor y Tratamiento.
- ⏱️ 11:00 — Implementación de Relaciones HasMany en Modelos Relacionados: Configuración de la contraparte hasMany en los modelos Paciente, Doctor y Tratamiento para permitir la consulta multidireccional de citas acumuladas.
- ⏱️ 13:20 — Maquetación de la Landing Page de Reservas: Reemplazo de la plantilla inicial welcome.blade.php por una página de aterrizaje interactiva enfocada en la captación de pacientes y llamado a la acción para agendar citas.
- ⏱️ 15:30 — Planteamiento del Autenticador para Pacientes: Presentación del flujo de acceso/registro de pacientes previo a la reserva, proyectando la integración de login social mediante Laravel Socialite (Google, Facebook).
🛠️ Comandos y Rutas Principales
| Tipo / Capa | Comando / Ruta | Propósito |
|---|---|---|
| Terminal / Artisan | php artisan make:model Cita -mc | Crea simultáneamente el modelo Cita, su archivo de migración y su controlador. |
| Terminal / Artisan | php artisan migrate | Aplica la tabla citas con sus restricciones foráneas e índices únicos en MySQL. |
| Ruta HTTP (GET) | / | Muestra la Landing Page institucional (welcome.blade.php) enfocada en agendamiento. |
| Ruta HTTP (GET) | /login | Redirige al paciente al panel de autenticación previo a completar la reserva. |
🔒 Buenas Prácticas y Seguridad
- Tokens Ofuscados para Gestión Externa: Implementar una cadena aleatoria única de longitud fija (ej. 12 caracteres con Str::random(12)) en el campo token. Esto permite la confirmación o cancelación pública de citas desde correos sin exponer el ID autoincremental de la base de datos.
- Índices Únicos Compuestos Anti-Traslape: Prevenir el solapamiento de agendas definiendo índices combinados en la migración unique(['doctor_id', 'fecha', 'hora']) a nivel de base de datos, reforzando la regla de negocio frente a peticiones concurrentes.
- Estados Estricto mediante ENUM: Limitar los estados de la cita a valores fijos (pendiente, confirmada, en_curso, completada, cancelada) con valor predeterminado (pendiente) para garantizar la consistencia en el flujo de atención clínica.
- Protección de Registro para Pacientes: Forzar la asociación explícita paciente_id vinculando la reserva a una cuenta autenticada (mediante login tradicional o Socialite), garantizando la trazabilidad del historial médico.