고객을 대신하여 예약 확정
비즈니스 화면에서 고객 액터의 `confirm_booking` 액션을 실행합니다(business_on_behalf로 감사 기록됨). 두 가지 용도: (1) 라이브 — 전화로 예약한 고객을 위해 스태프가 슬롯을 확정; (2) 샌드박스 — 고객 매직 토큰 화면은 라이브 전용이므로(샌드박스 작업의 링크는 실제 고객에게 도달할 수 없음) 샌드박스 테스트 작업을 예약 이후 단계로 진행시키는 유일한 방법입니다(book → quote → confirm → assign → complete). 본문에는 고객이 선택한 scheduled_at(비즈니스 로컬 naive datetime)이 담깁니다. 결정 표 — 이 엔드포인트가 반환하는 모든 409와 올바른 다음 단계(HTTP 상태가 아니라 error_code로 분기하세요): • JOB_REQUEST_STAGE_CONFLICT — 읽은 이후 작업이 바뀜(참고: 실패한 confirm 시도도 설계상 status_version을 증가시킵니다). 다음: 작업을 다시 GET하고, 최신 status_version으로 재시도하세요. • JOB_REQUEST_ACTION_NOT_PENDING — 작업이 더 이상 confirm 단계가 아님(보통 이미 확정됨). 다음: 다시 GET하여 현재 상태를 표시; 재시도하지 마세요. • JOB_REQUEST_NO_TECHNICIAN_AVAILABLE — 그 시각이 모두에게 불가능함(근무 시간/고객 창을 벗어났거나, 자격을 갖춘 사람이 없음). 다음: booking-windows / time-segments로 다른 시각을 선택하세요. 긴급 상황이 아닙니다 — 밀어내기는 없는 여유를 만들어내지 못합니다. • JOB_REQUEST_TECH_INFEASIBLE — 강제 지정된 기사가 그때는 절대 작업을 맡을 수 없음; `data.reason`이 이유를 알려줍니다: cannot_arrive_in_time(통근/근무 시작 — `data.earliest_feasible_at`(RFC3339 UTC)가 그들이 현장에 있을 수 있는 같은 날의 가장 이른 시각 → 제안하세요) | missing_required_skills | not_available_today | not_lead_tier. 다음: 기사를 유지하고 earliest_feasible_at 이후로 재조정하거나, 시각을 유지하고 technician_id를 빼세요(자동 선택) / time-segments에서 다른 기사를 선택하세요. 긴급 상황이 아닙니다. • JOB_REQUEST_P0_REQUIRES_DISPLACEMENT — 긴급 플로우로 라우팅되는 유일한 코드: 작업이 P0이고 기사는 자격이 있지만 레인이 실제로 점유됨. 다음: POST emergency/candidates → preview → commit(커밋이 자동 확정함). 주의: 점유 중인 작업들이 스스로 P0라면 미리보기가 EMERGENCY_RESCHEDULE_SLOT_OCCUPIED로 거부됩니다(P0는 절대 P0를 밀어내지 않음) — 그러면 다른 기사/시각을 선택하세요.
인수
curl -X POST "https://api.crisphive.com/v1/job-requests/9b2f6c3e-1a4d-4f0a-8f2e-7c5d1b3a9e01/confirm" \ -H "Authorization: Bearer chsk_test_4eC8xQ9mZ2pL7Ka0rT" \ -H "Content-Type: application/json" \ -d '{ "arrival_window_minutes": 1, "scheduled_at": "2030-06-14T09:00:00", "status_version": 2, "technician_id": "9b2f6c3e-1a4d-4f0a-8f2e-7c5d1b3a9e01" }'