# Callouts y Flujo de UI

`CalloutAppointment` ayuda al usuario a capturar una cita desde iDempiere sin reemplazar la validación final del backend.

## Comportamiento de callouts

<table id="bkmrk-campocomportamientoc" 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;">Campo</th><th style="border:1px solid #d8dee9;padding:12px;background:#eef2f7;text-align:left;">Comportamiento</th></tr></thead><tbody><tr><td style="border:1px solid #d8dee9;padding:12px;">`CDS_AppointmentService_ID`</td><td style="border:1px solid #d8dee9;padding:12px;">Copia precio y duración efectivos. Si existe empleado seleccionado, usa override de `CDS_EmployeeService`. Limpia slot y horas, pero no limpia empleado.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;">`AppointmentDate`</td><td style="border:1px solid #d8dee9;padding:12px;">Limpia slot, hora inicial y hora final. No limpia empleado ni servicio.</td></tr><tr><td style="border:1px solid #d8dee9;padding:12px;">`CDS_AppointmentSlot_ID`</td><td style="border:1px solid #d8dee9;padding:12px;">Copia empleado, hora inicial, hora final, precio y duración desde el slot seleccionado.</td></tr></tbody></table>

## Flujo recomendado en ventana

1. Seleccionar el empleado que atenderá la cita.
2. Seleccionar el servicio filtrado para ese empleado.
3. Seleccionar la fecha de la cita.
4. Ejecutar el proceso de generación de slots.
5. Seleccionar el slot generado.
6. Guardar la cita.

<p class="callout warning">**Importante:** si un usuario modifica manualmente horas, precio o duración, el evento de modelo vuelve a validar la consistencia antes de guardar.</p>