Reservas›Confirmar una reserva en nombre del cliente
Confirmar una reserva en nombre del cliente
Dispara la acción `confirm_booking` del actor cliente desde la superficie del NEGOCIO (auditada como business_on_behalf). Dos usos: (1) LIVE — el personal confirma una franja para un cliente que reservó por teléfono; (2) SANDBOX — la superficie de magic-token del cliente es solo live (el enlace de un trabajo de sandbox nunca puede llegar a un cliente real), así que esta es la ÚNICA forma de hacer avanzar un trabajo de prueba de sandbox más allá de la reserva (book → quote → confirm → assign → complete). El cuerpo lleva el scheduled_at elegido por el cliente (datetime naive en hora local del negocio).
TABLA DE DECISIÓN — cada 409 que devuelve este endpoint y el PRÓXIMO PASO correcto (ramifique según error_code, nunca según el estado HTTP):
• JOB_REQUEST_STAGE_CONFLICT — el trabajo cambió desde que lo leyó (NOTA: cada intento FALLIDO de confirmación también incrementa status_version por diseño). Siguiente: vuelva a hacer GET del trabajo, reintente con el status_version actualizado.
• JOB_REQUEST_ACTION_NOT_PENDING — el trabajo ya no está en el paso de confirmación (normalmente: ya confirmado). Siguiente: vuelva a hacer GET y muestre el estado actual; no reintente.
• JOB_REQUEST_NO_TECHNICIAN_AVAILABLE — la HORA es inviable para todos (fuera del horario de trabajo / de la ventana del cliente, o nadie cualifica). Siguiente: elija otra hora mediante booking-windows / time-segments. NO es un caso de emergencia — el desplazamiento no puede crear capacidad.
• JOB_REQUEST_TECH_INFEASIBLE — el técnico FORZADO nunca puede asumir el trabajo entonces; `data.reason` dice por qué: cannot_arrive_in_time (desplazamiento/inicio de turno — `data.earliest_feasible_at` (RFC3339 UTC) es la primera hora del mismo día en que PUEDE estar in situ → ofrézcala) | missing_required_skills | not_available_today | not_lead_tier. Siguiente: mantenga al técnico y reprograme a earliest_feasible_at+, O mantenga la hora y quite technician_id (selección automática) / elija otro técnico desde time-segments. NO es un caso de emergencia.
• JOB_REQUEST_P0_REQUIRES_DISPLACEMENT — el ÚNICO código que enruta al flujo de EMERGENCIA: el trabajo es P0, el técnico cualifica, pero el carril está genuinamente ocupado. Siguiente: POST emergency/candidates → preview → commit (el commit auto-confirma). Advertencia: si los trabajos que ocupan son a su vez P0, la vista previa rechazará con EMERGENCY_RESCHEDULE_SLOT_OCCUPIED (P0 nunca desplaza a P0) — entonces elija otro técnico/hora.
Argumentos
idstringpathobligatorio
ID de la solicitud de trabajo
Idempotency-Keystringheaderopcional
Unique key making retries safe: a repeat send with the same key replays the original response (header Idempotent-Replayed: true) instead of re-running the operation. Reusing a key with a different body returns 422 IDEMPOTENCY_KEY_REUSE.
arrival_window_minutesintegerbodyopcional
ArrivalWindowMinutes = ancho (minutos) de la ventana de llegada que el cliente pulsa en el
selector de franjas (es el time_slot_step_minutes, por defecto 30). Se persiste para que
el detalle posterior a la confirmación vuelva a renderizar la ventana correcta. Opcional; los límites ([5, 240],
que coinciden con el paso del selector de franjas) se validan en el caso de uso — autoridad única, un solo
código de error (JOB_REQUEST_INVALID_INPUT).
scheduled_atstringbodyopcional
Chosen start time — business-local naive datetime, no offset (the business_time.datetime value from the time-segments picker). The server converts to UTC using the job's business timezone.
status_versionintegerbodyopcional
Optimistic-lock fence: the status_version from your last read. Omitted/0 = fence on the row's current version (no race protection).
technician_idstringbodyopcional
TechnicianID (solo confirmación de NEGOCIO — ignorado en la superficie del cliente):
forzar la asignación del trabajo a este técnico en lugar de la selección automática clasificada.
Se omite la clasificación; la viabilidad (horas/permisos/geo/habilidades), la
regla TierLead y la protección contra doble reserva siguen aplicando — un técnico
forzado inviable rechaza la confirmación (P0 recibe la pista de desplazamiento).