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.

CampoSignificado
duration_minDuración del servicio
step_minGrilla de inicio (cada 15, 30 minutos…)
buffer_before_min / buffer_after_minTiempo de preparación o limpieza bloqueado alrededor de la reserva
price_cents, currencyPrecio que informa el bot (siempre desde la base de datos)
deposit_centsSeña por Pix necesaria para confirmar
lead_time_minAnticipación mínima (por ejemplo 60 minutos)
max_advance_daysCon cuánta anticipación máxima se puede reservar
window_modeEl slot es una ventana fija (entregas: 14:00–16:00)
fulfillment_modescheduled (default, con horario) o queue (despacho por cola, sin horario fijo)
intake_formJSON Schema de datos extra a pedir (obra social, dirección…)
requirementsQué 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, con window_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_min en 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

  1. Expandir los horarios para el rango pedido, en la zona horaria de cada recurso.
  2. Restar reservas y pre-reservas activas (más los buffers) y bloqueos manuales.
  3. Cortar en slots candidatos según la duración y la grilla del servicio.
  4. Aplicar anticipación mínima y máxima, reglas de corte y tamaño del grupo.
  5. Cruzar todos los requisitos, probando los miembros de cada grupo según la estrategia de asignación.
  6. 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é.