Ventanas
Cada fila deCamelloAvailability es un tramo recurrente: día de la semana (0 domingo … 6 sábado), inicio y fin en minutos desde medianoche, hora de Colombia (America/Bogota).
El camello las reemplaza todas con PUT /api/me/availability. Las reglas:
- empiezan y terminan en punto;
- el fin es posterior al inicio y cabe en el día;
- el mismo día no se solapan;
- como máximo 21 franjas.
GET /api/me/availability devuelve las del camello de la sesión. Otro rol recibe 403. Sin ficha de camello, 409.
La ficha pública muestra esos tramos («Lunes 08:00–12:00»). No muestra qué huecos ya están ocupados.
Huecos
Un hueco dura 60 minutos y se corta desde el inicio de cada ventana. El horizonte de reserva es de 14 días.GET /api/camellos/:id/slots?from=&to= lista los huecos libres de un camello ACTIVO. Lo pueden pedir el cliente y el admin. El rol CAMELLOS recibe 403.
Un hueco está libre si ningún otro trabajo de ese camello, con estado distinto de CANCELADO, solapa el intervalo. La comprobación se repite dentro de la transacción que crea o mueve la cita, para que dos reservas del mismo hueco no se pisen.
Quién reserva
- Con camello elegido (
EXPLORE), el cliente puede mandarscheduledStartal crear el trabajo. El servidor exige que sea un hueco libre de ese camello. - Sin camello, una fecha en el alta responde
400. El trabajo queda sin cita hasta que haya camello. - Después, el cliente dueño usa
POST /api/jobs/:id/schedulesi el trabajo tiene camello y estáPENDIENTEoEN_PROGRESO.
Vista
/agenda muestra la semana o el mes (?view=week o ?view=month; sin view es la semana). from=YYYY-MM-DD ancla el periodo en hora de Colombia. La rejilla del mes empieza en lunes e incluye los días vecinos atenuados; cada día enlaza a esa semana.
GET /api/agenda?from=&to= usa la misma visibilidad que la lista de trabajos: el cliente ve las suyas, el camello las de su ficha y el admin todas las del rango. El listado admite hasta 42 días, lo que cabe en una rejilla mensual. El horizonte de 14 días sigue aplicando solo a la reserva de huecos.
Recordatorio
POST /api/cron/appointment-reminders busca citas no canceladas cuya hora cae en las próximas 24 horas y que aún no tienen reminderSentAt. Avisa al cliente y al camello por la bandeja (APPOINTMENT_REMINDER) y marca la cita para no repetirla. Lo llama un cron externo con Authorization: Bearer y CRON_SECRET. Sin esa variable responde 503.