# Visión General

Resumen funcional y arquitectura general del plugin de citas.

# Resumen del Plugin

El plugin `com.cdsoftware.appointment` agrega a iDempiere 12 un módulo reutilizable para gestionar citas, servicios, empleados, horarios, días no disponibles y disponibilidad de agenda.

> **Idea clave:** la disponibilidad no depende solo de la interfaz. La validación queda centralizada en backend para proteger tanto las citas creadas desde ventanas iDempiere como las creadas desde REST/API.

## Objetivo

El objetivo es permitir que una organización configure servicios agendables, defina qué empleados pueden atender cada servicio, establezca horarios de atención y bloquee días o rangos no disponibles. Con esa información, el sistema genera slots disponibles y valida cada cita antes de guardarla.

## Alcance funcional

<table id="bkmrk-%C3%81reaqu%C3%A9-cubreconfigu" 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;">Área</th><th style="border:1px solid #d8dee9;padding:12px;background:#eef2f7;text-align:left;">Qué cubre</th></tr></thead><tbody><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Configuración**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Parámetros generales por organización, límites de anticipación, reglas de aprobación e intervalos de slots.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Servicios**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Servicios agendables con precio, duración, intervalo, capacidad y requerimiento de aprobación.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Empleados**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Personas o usuarios disponibles para atender citas, vinculados a terceros y opcionalmente a usuarios iDempiere.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Disponibilidad**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Horarios semanales, días libres de empleado, días libres de organización y validación de conflictos.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">**Citas**</td><td style="border:1px solid #d8dee9;padding:12px;vertical-align:top;">Registro principal de la cita con cliente, empleado, servicio, fecha, hora, duración, precio, estado y slot seleccionado.</td></tr></tbody></table>

## Principios de diseño

- El plugin es genérico y no depende del proyecto IEA.
- La creación desde REST/API usa la tabla estándar `CDS_Appointment`.
- Las reglas críticas se validan en eventos de modelo, no solo en callouts.
- Los modelos generados `I_CDS_*` y `X_CDS_*` son la fuente de constantes de tabla, columnas y valores.
- El campo `R_Request_ID` puede existir como referencia manual, pero el código del plugin no depende de solicitudes.

# 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>

# Flujo de Configuración y Cita

Esta página describe el flujo objetivo para preparar una agenda y poder crear citas válidas. El flujo parte de una configuración general, continúa con servicios y empleados, y termina con la creación de una cita validada por backend.

<p class="callout warning">**Importante:** parte de este flujo representa el comportamiento objetivo. Algunas reglas todavía deben implementarse en el modelo y en `AppointmentModelValidator` para que sean obligatorias tanto desde la UI como desde REST/API.</p>

## Flujo objetivo

<div drawio-diagram="178"><img src="https://docs.primware.net/uploads/images/drawio/2026-05/yoFttEn6HSRcxnol-drawing-1-1779470586.png" alt=""/></div>

## Secuencia funcional

1. Crear una configuración de agenda por organización o por alcance operativo.
2. Definir reglas generales como anticipación mínima, anticipación máxima, regla de asignación y política de aprobación.
3. Definir el horario macro de la agenda. Por ejemplo: lunes a viernes de 8:00 a 17:00.
4. Relacionar cada servicio con una sola configuración de agenda.
5. Configurar cada servicio con duración, precio, intervalo de slot y si requiere aprobación.
6. Configurar empleados y definir qué servicios puede atender cada uno.
7. Definir horario laboral y días libres del empleado.
8. Crear la cita seleccionando empleado, servicio, fecha y slot.
9. Validar primero la configuración de agenda y luego las reglas del empleado.
10. Guardar la cita como pendiente o aprobada según las reglas de aprobación.

## Jerarquía de disponibilidad esperada

<table id="bkmrk-nivelreglaprioridadc" 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;">Nivel</th><th style="border: 1px solid #d8dee9; padding: 12px; background: #eef2f7; text-align: left;">Regla</th><th style="border: 1px solid #d8dee9; padding: 12px; background: #eef2f7; text-align: left;">Prioridad</th></tr></thead><tbody><tr><td style="border: 1px solid #d8dee9; padding: 12px; vertical-align: top;">**Configuración de agenda**</td><td style="border: 1px solid #d8dee9; padding: 12px; vertical-align: top;">Define el marco general de operación: anticipación, días permitidos, horarios macro y aprobación.</td><td style="border: 1px solid #d8dee9; padding: 12px; vertical-align: top;">Debe estar por encima del empleado. Si la agenda general está cerrada, ningún empleado puede abrir disponibilidad.</td></tr><tr><td style="border: 1px solid #d8dee9; padding: 12px; vertical-align: top;">**Servicio**</td><td style="border: 1px solid #d8dee9; padding: 12px; vertical-align: top;">Define duración, precio, intervalo y si requiere aprobación.</td><td style="border: 1px solid #d8dee9; padding: 12px; vertical-align: top;">Debe resolver qué configuración aplica.</td></tr><tr><td style="border: 1px solid #d8dee9; padding: 12px; vertical-align: top;">**Empleado**</td><td style="border: 1px solid #d8dee9; padding: 12px; vertical-align: top;">Define servicios que puede atender, horario propio y bloqueos personales.</td><td style="border: 1px solid #d8dee9; padding: 12px; vertical-align: top;">Solo puede reducir o especializar la disponibilidad de la configuración, no ampliarla.</td></tr><tr><td style="border: 1px solid #d8dee9; padding: 12px; vertical-align: top;">**Cita**</td><td style="border: 1px solid #d8dee9; padding: 12px; vertical-align: top;">Consume empleado, servicio, configuración, slot y reglas de conflicto.</td><td style="border: 1px solid #d8dee9; padding: 12px; vertical-align: top;">Debe ser validada por evento antes de guardarse.</td></tr></tbody></table>

## Reglas pendientes para completar el flujo

- Relacionar cada servicio con una configuración de agenda.
- Validar que un servicio no pertenezca a más de una configuración.
- Agregar horario macro de configuración, similar al horario del empleado.
- Validar anticipación mínima y máxima desde la configuración.
- Aplicar la política de aprobación automática o forzada en `BeforeNew`.
- Hacer que los días libres de organización puedan aplicar por configuración cuando corresponda.