الحجوزاتتأكيد حجز نيابةً عن العميل

تأكيد حجز نيابةً عن العميل

يُطلق إجراء العميل `confirm_booking` من واجهة النشاط التجاري (يُدقَّق بوصفه business_on_behalf). استخدامان: (1) الوضع الحي — يؤكّد الموظفون فترة لعميل حجز عبر الهاتف؛ (2) بيئة الاختبار — واجهة الرمز السحري للعميل متاحة في الوضع الحي فقط (لا يمكن أبدًا أن يصل رابط عمل بيئة الاختبار إلى عميل حقيقي)، لذا فهذه هي الطريقة الوحيدة لدفع عمل اختبار في بيئة الاختبار إلى ما بعد الحجز (حجز ← تسعير ← تأكيد ← إسناد ← إنجاز). يحمل المتن قيمة scheduled_at التي اختارها العميل (تاريخ ووقت ساذج بالتوقيت المحلي للنشاط التجاري). جدول القرار — كل رمز 409 تُرجعه هذه النقطة، والخطوة التالية الصحيحة (تفرّع على error_code، لا على حالة HTTP أبدًا): • JOB_REQUEST_STAGE_CONFLICT — تغيّر العمل منذ قراءتك له (ملاحظة: كل محاولة تأكيد فاشلة ترفع أيضًا status_version عمدًا). التالي: أعد جلب العمل، وأعد المحاولة بـ status_version الجديد. • JOB_REQUEST_ACTION_NOT_PENDING — لم يعد العمل عند خطوة التأكيد (عادةً: مؤكّد بالفعل). التالي: أعد الجلب واعرض الحالة الحالية؛ لا تُعِد المحاولة. • 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 أبدًا) — عندئذٍ اختر فنّيًا/وقتًا آخر.

المعاملات

idstringpathمطلوب
معرّف طلب العمل
Idempotency-Keystringheaderاختياري
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_minutesintegerbodyاختياري
ArrivalWindowMinutes = عرض نافذة الوصول (بالدقائق) التي ينقر عليها العميل في منتقي الفترات (أي time_slot_step_minutes، الافتراضي 30). يُحفَظ ليعرض تفصيل ما بعد التأكيد النافذة الصحيحة. اختياري؛ حدوده ([5, 240]، مطابِقة لخطوة منتقي الفترات) يُتحقَّق منها في حالة الاستخدام — سلطة واحدة، ورمز خطأ واحد (JOB_REQUEST_INVALID_INPUT).
scheduled_atstringbodyاختياري
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_versionintegerbodyاختياري
Optimistic-lock fence: the status_version from your last read. Omitted/0 = fence on the row's current version (no race protection).
technician_idstringbodyاختياري
TechnicianID (تأكيد النشاط التجاري فقط — يُتجاهَل في واجهة العميل): فرض إسناد العمل إلى هذا الفنّي بدلًا من الاختيار التلقائي المرتَّب. يُتجاوَز الترتيب؛ لكن تبقى الجدوى (الساعات/الإجازات/الموقع الجغرافي/المهارات) وقاعدة TierLead وحارس الحجز المزدوج سارية — الفنّي المفروض غير المجدي يرفض التأكيد (يحصل P0 على تلميح الإزاحة).
POST/v1/job-requests/{id}/confirm
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"
}'
نص الطلب
{
"arrival_window_minutes": ,
"scheduled_at": ,
"status_version": ,
"technician_id":
}

الاستجابات