# Arquitectura y Componentes

La arquitectura del plugin separa la definición de modelos, la disponibilidad, la experiencia de ventana iDempiere y la validación obligatoria antes de guardar citas.

## Componentes principales

<table id="bkmrk-componenteresponsabi" style="width:100%;border-collapse:collapse;margin:12px 0 20px 0;"><thead><tr><th style="border:1px solid #d8dee9;padding:12px;background:#eef2f7;text-align:left;">Componente</th><th style="border:1px solid #d8dee9;padding:12px;background:#eef2f7;text-align:left;">Responsabilidad</th></tr></thead><tbody><tr><td style="border:1px solid #d8dee9;padding:12px;">`AppointmentAvailabilityEngine`</td><td style="border:1px solid #d8dee9;padding:12px;">Centraliza cálculo de disponibilidad, validación de horarios, días libres, conflictos y generación de slots.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;">`AppointmentModelValidator`</td><td style="border:1px solid #d8dee9;padding:12px;">Valida citas antes de crear o modificar registros, incluyendo consistencia del slot y conflictos de agenda.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;">`CalloutAppointment`</td><td style="border:1px solid #d8dee9;padding:12px;">Apoya la captura en ventana iDempiere copiando precio, duración, empleado y horas desde servicio o slot.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;">`GenerateAppointmentSlots`</td><td style="border:1px solid #d8dee9;padding:12px;">Genera registros `CDS_AppointmentSlot` para un empleado, servicio y fecha específicos.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;">`ReopenAppointment`</td><td style="border:1px solid #d8dee9;padding:12px;">Permite reabrir una cita procesada de forma controlada.</td></tr></tbody></table>

## Flujo general

1. El usuario configura servicios, empleados, capacidades, horarios y días no disponibles.
2. Desde una cita se selecciona empleado, servicio y fecha.
3. El proceso de generación crea slots disponibles para esa combinación.
4. El usuario selecciona un slot y el callout copia datos a la cita.
5. Al guardar, el evento valida disponibilidad, consistencia y conflictos.
6. Los clientes REST/API pueden crear la cita directamente y reciben la misma validación por evento.

<p class="callout info">**Nota:** los callouts mejoran la experiencia de captura, pero no son la capa de seguridad. La regla final vive en `AppointmentModelValidator`.</p>