Guía técnica · ClinicOS-CRM
Cómo el sistema decide qué huecos ofrecer, cómo configurarlo para tu clínica y cómo se comportan los flujos típicos.
Contenido
Cuando el sistema valora si un hueco se puede reservar, comprueba 6 condiciones en orden. Si cualquiera falla, el hueco no se ofrece. Si las 6 pasan, el hueco es válido.
Regla 1 — Servicio ↔ Profesional
El servicio debe estar autorizado para ese profesional. Configurable en: Configuración → Servicios → botón "Especialistas". Si no marcas a nadie, el servicio lo puede hacer cualquier profesional.
Regla 2 — Servicio ↔ Gabinete
El servicio debe estar permitido en ese gabinete. Configurable en: Configuración → Servicios → botón "Cualquier sala". Si no marcas ninguna sala, se permite en cualquiera.
Regla 3 — Profesional disponible
El profesional debe estar dentro de su horario laboral, sin otra cita solapada (con overbooking opcional permite N concurrentes), y sin bloqueo de calendario (vacaciones, baja, etc.).
Regla 4 — Gabinete disponible
El gabinete debe estar activo, dentro de su horario operativo, sin otra cita solapada y sin un bloqueo de mantenimiento. Bloqueos en: Configuración → Gabinetes → botón "Bloqueos".
Regla 5 — Buffers (margen pre/post)
Una cita "ocupa" en realidad [start - pre_buffer, end + post_buffer].
Útil para limpiar instrumental, preparar la sala, etc.
Jerarquía: el buffer del servicio gana al del profesional, que gana al de la clínica.
Regla 6 — Equipamiento disponible
Para cada equipo requerido por el servicio:
· Si es fijo → debe estar instalado en el gabinete propuesto.
· Si es móvil → debe estar libre en ese rango (no asignado a otra cita simultánea).
· Si es pool (varios intercambiables) → al menos N miembros libres.
💡 Convención permisiva
Si una clínica todavía no ha configurado nada, el sistema funciona como un calendario simple: cualquier servicio se puede hacer en cualquier sala con cualquier profesional, sin equipos requeridos. A medida que vas marcando restricciones, el sistema las respeta. Empieza simple, añade reglas según las vayas necesitando.
Cuando un paciente busca cita, normalmente hay varios huecos válidos que cumplen las 6 reglas. Para decidir cuáles mostrar primero, el sistema usa una función de optimización con 5 criterios ponderables.
Los 5 scorers
| Criterio | Qué premia |
|---|---|
| Proximidad temporal | Huecos más próximos a hoy |
| Ocupación de agenda | Días ya parcialmente llenos (eficiencia) |
| Equilibrio de carga | Profesionales con menos carga esa semana |
| Preferencia del paciente | Match con doctor/sala/franja preferida del paciente |
| Minimizar huecos muertos | Huecos adyacentes a citas existentes (evita huecos sueltos) |
📍 ¿Dónde se ajustan estos pesos?
Configuración → Optimización. Cada peso entre 0 (desactivar) y 5 (manda). Si todos están a 1, todos los criterios se ponderan por igual. Si no sabes qué priorizar, deja todo a 1 — el sistema decide con un balance equilibrado.
Útil si tienes varios equipos idénticos (ej. 3 ecógrafos) y un servicio puede usar cualquiera.
scripts/report_unused_emergency_slots.php).Sillón fijo + servicios específicos por profesional
Configuración:
Resultado:
Sala genérica + equipamiento móvil compartido
Configuración:
Resultado:
Cita encadenada: técnico → médico
Configuración:
Estado actual de la UI:
El backend ya soporta cadenas atómicas (App\Core\Scheduling\ChainScheduler) pero la UI
de admin para crear paquetes encadenados está pendiente. Como workaround, el admin crea las dos
citas manualmente desde la agenda asegurándose de respetar la separación.
…un paciente me dice que no ve huecos en el portal.
…aparecen huecos donde no debería (ej. servicio en sala equivocada).
…cancelan una cita y quiero saber si hay alguien en lista de espera.
/espera donde puedes reasignar manualmente.…dos pacientes intentan reservar el mismo hueco a la vez.
El sistema usa transacciones con bloqueo pesimista. Solo uno gana, al otro se le devuelve un error "Hueco no disponible" y se le invita a elegir otro hueco. No hay "doble reserva" posible.
…la web da error 500.
Añade ?_debug=1 al final de la URL para ver el error real en pantalla.
Pásaselo a soporte (o a tu desarrollador) para que lo diagnostique.
…la web no carga del todo (timeout).
No es problema del CRM — es el hosting o el proxy (Cloudflare). Ver runbook de operaciones para los pasos de diagnóstico.
ClinicOS-CRM · Guía de Agenda avanzada · Generada para uso interno de las clínicas usuarias.
Documentación técnica detallada: docs/scheduling.md