Servicios y disponibilidad
Servicios, requisitos con varios recursos, horarios y cómo se calculan los slots.
Servicios
Un servicio es lo que reserva el cliente.
| Campo | Significado |
|---|---|
duration_min | Duración del servicio |
step_min | Grilla de inicio (cada 15, 30 minutos…) |
buffer_before_min / buffer_after_min | Tiempo de preparación o limpieza bloqueado alrededor de la reserva |
price_cents, currency | Precio que informa el bot (siempre desde la base de datos) |
deposit_cents | Seña por Pix necesaria para confirmar |
lead_time_min | Anticipación mínima (por ejemplo 60 minutos) |
max_advance_days | Con cuánta anticipación máxima se puede reservar |
window_mode | El slot es una ventana fija (entregas: 14:00–16:00) |
fulfillment_mode | scheduled (default, con horario) o queue (despacho por cola, sin horario fijo) |
intake_form | JSON Schema de datos extra a pedir (obra social, dirección…) |
requirements | Qué recursos necesita el servicio al mismo tiempo |
Ventana o despacho: dos modos de cumplimiento
Cada servicio define cómo se cumple lo reservado (fulfillment_mode):
scheduled(el default): la reserva ocupa un rango de tiempo conocido — un horario fijo o, conwindow_mode, una ventana (entregas de 14:00 a 16:00, con cupo por zona).queue(despacho, para agua, gas o delivery on-demand): la reserva no tiene horario fijo — entra en la cola de pendientes de un repartidor. El motor la asigna al repartidor con menos tareas activas y cada repartidor tiene un cupo de tareas activas a la vez, garantizado en la base de datos. La cola usa los mismos estados que una reserva: pendiente → aceptada → iniciada → finalizada (o fallida).
Así, un mismo negocio de entregas puede ofrecer ventanas programadas, despacho inmediato o ambos.
Requisitos
Un requisito dice: de este grupo, necesito tantas unidades. Un servicio puede tener varios; un slot existe solo si todos están libres.
{
"name": "Depilación láser",
"duration_min": 45,
"buffer_after_min": 10,
"requirements": [
{ "resource_group_id": "grp_professionals", "units": 1 },
{ "resource_group_id": "grp_lasers", "units": 1 },
{ "resource_group_id": "grp_rooms", "units": 1 }
]
}
Con dos profesionales y un solo láser, Wagend nunca ofrece dos sesiones de láser superpuestas.
Opciones avanzadas:
units: "party_size"— consume tantas unidades como personas (restaurantes, clases).offset_min/duration_minen un requisito — usa un recurso solo en parte del servicio (por ejemplo el lavacabezas en los últimos 15 minutos de un color).
Horarios
Cada recurso tiene un horario: reglas semanales en la zona horaria del recurso más excepciones para fechas puntuales (cerrado u horario especial).
{
"tz": "America/Argentina/Buenos_Aires",
"weekly": { "tue": [["09:00", "19:00"]], "sat": [["08:00", "12:00"], ["13:00", "16:00"]] },
"overrides": [{ "date": "2026-12-24", "ranges": [["09:00", "13:00"]] }, { "date": "2026-12-25", "closed": true }]
}
Cómo se calculan los slots
- Expandir los horarios para el rango pedido, en la zona horaria de cada recurso.
- Restar reservas y pre-reservas activas (más los buffers) y bloqueos manuales.
- Cortar en slots candidatos según la duración y la grilla del servicio.
- Aplicar anticipación mínima y máxima, reglas de corte y tamaño del grupo.
- Cruzar todos los requisitos, probando los miembros de cada grupo según la estrategia de asignación.
- Devolver una lista corta y ordenada.
Cuando no hay nada disponible, la respuesta trae unavailable_reason (closed, no_staff, no_equipment, no_space, lead_time, max_advance, cutoff, full) para que el bot explique por qué.