Motor de Disponibilidad
AppointmentAvailabilityEngine concentra la lógica que decide si una cita o un slot es válido para un empleado, servicio y fecha determinados.
Responsabilidades actuales
- Cargar una configuración activa por
organización.organización con fallback a organización0. - Leer duración, precio e intervalo del servicio.
- Aplicar overrides de precio y duración por empleado-servicio.
- Validar que el empleado pueda prestar el servicio.
- Validar días libres de la organización.
- Validar días libres del empleado.
- Validar cobertura del horario semanal del empleado.
- Detectar conflictos con citas existentes pendientes o aprobadas.
- Aplicar límites diarios por empleado cuando correspondan.
- Crear slots persistentes para la UI de iDempiere.
Regla de conflicto
Una cita se considera en conflicto cuando otra cita activa del mismo empleado se cruza con el rango nuevo y tiene estado pendiente o aprobado.
existing.StartDateTime < newEnd
AND existing.EndDateTime > newStart
AND existing.Status IN ('PE', 'AP')
AND existing.IsActive = 'Y'
Generación de slots
La generación actual es específica por empleado. El proceso no genera para todos los empleados ni autoasigna el recurso; parte de una selección explícita de empleado, servicio y fecha.
Nota: esta decisión hace que el flujo de UI sea más claro: primero se elige quién atiende, luego qué servicio presta, después se generan horarios disponibles.
Reglas actuales vs reglas esperadas
| Regla | Estado actual | Comportamiento esperado |
|---|---|---|
| Empleado presta servicio | Implementado con CDS_EmployeeService. | Se mantiene como regla obligatoria. |
| Día libre de organización | Implementado por organización. Aunque CDS_OrgDayOff tiene CDS_AppointmentConfig_ID, el motor actual no filtra por configuración. | Debe filtrar por configuración cuando el servicio resuelva una configuración específica. |
| Día libre de empleado | Implementado con CDS_EmployeeDayOff. | Se mantiene como bloqueo específico del empleado. |
| Horario del empleado | Implementado con CDS_EmployeeScheduleLine. | Debe validarse después del horario macro de la configuración. |
| Horario macro de agenda | Pendiente. No existe aún una tabla equivalente a horario de configuración. | Debe definir los días y rangos generales permitidos, por encima del horario del empleado. |
| Anticipación mínima | Pendiente. Existe MinAdvanceHours, pero no se valida todavía. | Debe bloquear citas creadas con menos horas de anticipación que las configuradas. |
| Anticipación máxima | Pendiente. Existe MaxAdvanceDays, pero no se valida todavía. | Debe bloquear citas demasiado futuras. |
| Conflictos con citas existentes | Implementado para estados Pending y Approved. | Se mantiene como validación obligatoria. |
| Aprobación automática o forzada | Pendiente. Existen campos de configuración y servicio, pero no se aplican en el evento. | Debe resolverse en BeforeNew usando configuración y servicio. |
Roadmap del motor
- Resolver la configuración desde el servicio seleccionado, no solo desde la organización.
- Agregar validación de horario macro de configuración antes del horario del empleado.
- Aplicar
MinAdvanceHoursyMaxAdvanceDaysal generar slots y al guardar citas. - Filtrar días libres de organización por configuración cuando exista relación.
- Aplicar reglas de aprobación en el evento antes de validar el estado final de la cita.