Skip to main content

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 con fallback a organización 0.
  • 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

ReglaEstado actualComportamiento esperado
Empleado presta servicioImplementado con CDS_EmployeeService.Se mantiene como regla obligatoria.
Día libre de organizaciónImplementado 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 empleadoImplementado con CDS_EmployeeDayOff.Se mantiene como bloqueo específico del empleado.
Horario del empleadoImplementado con CDS_EmployeeScheduleLine.Debe validarse después del horario macro de la configuración.
Horario macro de agendaPendiente. 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ínimaPendiente. Existe MinAdvanceHours, pero no se valida todavía.Debe bloquear citas creadas con menos horas de anticipación que las configuradas.
Anticipación máximaPendiente. Existe MaxAdvanceDays, pero no se valida todavía.Debe bloquear citas demasiado futuras.
Conflictos con citas existentesImplementado para estados Pending y Approved.Se mantiene como validación obligatoria.
Aprobación automática o forzadaPendiente. 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 MinAdvanceHours y MaxAdvanceDays al 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.