دورة حياة الطلب

تتحكم في حالة الطلب آلة حالات صريحة واحدة (order-state-machine.ts): ‏29 انتقالًا مسموحًا، لكل منها قائمة بمن يحق له تنفيذه والشروط التي تحرسه. لا شيء يكتب الحالة مباشرة. وتتحرك مجموعة طلب كل بائع بين هذه الحالات مستقلة.

مخطط حالات الطلب الحالات من انتظار الدفع حتى الاكتمال أو الاسترداد، مع مسارات الإلغاء والتسليم الفاشل والإرجاع والنزاع. PENDING_PAYMENT PAID CONFIRMED PROCESSING READY_FOR_PICKUP PAYMENT_FAILED CANCELLED PICKED_UP IN_TRANSIT OUT_FOR_DELIVERY DELIVERED COMPLETED FAILED_DELIVERY CANCELLED RETURN_REQUESTED RETURN_APPROVED RETURN_IN_TRANSIT RETURN_RECEIVED REFUNDED DISPUTED تحصيل الدفع قبول البائع تجهيز جاهز فشل الدفع إعادة إلغاء استلام السائق انتهاء مهلة الإرجاع فشل التسليم إعادة (3 حد أقصى) نفاد المحاولات طلب إرجاع رفض البائع نزاع لصالح البائع لصالح المشتري
الأسهم المتصلة: المسار الأمامي. الأسهم الحمراء المتقطعة: مسارات الإلغاء والفشل والنزاع. رُسمت حالة CANCELLED مرتين لتسهيل القراءة فقط.

قواعد أساسية

  • الإلغاء ممكن فقط قبل READY_FOR_PICKUP، وينتهي حق المشتري في الإلغاء بمجرد قبول البائع. بعد الاستلام يصبح طريق المشتري هو الإرجاع.
  • التسليم الفاشل يمكن إعادته حتى 3 مرات؛ ثم يُلغى الطلب.
  • التسليم يتطلب إثبات تسليم مُتحققًا منه (ما لم يتجاوزه الموظفون).
  • الإرجاع متاح لمدة 14 يومًا بعد التسليم.
  • حالة COMPLETED ليست نهائية عمدًا: يمكن لاسترجاع بنكي أو مطالبة متأخرة إعادة فتحها كنزاع. الحالتان النهائيتان فقط هما CANCELLED وREFUNDED.

ثلاثة أنواع من الرفض

رمز الخطأالمعنى
order.ILLEGAL_TRANSITIONالانتقال غير موجود (مثل PAID ← DELIVERED).
auth.FORBIDDENالانتقال موجود لكن هذا الطرف لا يحق له تنفيذه (لا يستطيع المشتري تحديد طلبه كمدفوع).
order.CANCELLATION_WINDOW_CLOSED، order.RETURN_WINDOW_CLOSED، delivery.PROOF_INVALIDالانتقال مسموح مبدئيًا، لكن أحد الشروط لم يتحقق.

من يحق له تنفيذ كل انتقال

«الموظفون» تعني المسؤولين والمسؤولين الأعلى.

الانتقالمن يحق له
PENDING_PAYMENT → PAID / PAYMENT_FAILEDالنظام (نتيجة الدفع)
PAYMENT_FAILED → PENDING_PAYMENTالمشتري، النظام (إعادة المحاولة)
PAID → CONFIRMED → PROCESSING → READY_FOR_PICKUPالبائع، الموظفون
… → CANCELLED (before pickup)المشتري (حتى قبول البائع فقط)، البائع، النظام، الموظفون
READY_FOR_PICKUP → PICKED_UP → IN_TRANSIT → OUT_FOR_DELIVERYالسائق، النظام، الموظفون
OUT_FOR_DELIVERY → DELIVEREDالسائق (بإثبات مُتحقَّق)، الموظفون
OUT_FOR_DELIVERY → FAILED_DELIVERYالسائق، النظام، الموظفون
FAILED_DELIVERY → OUT_FOR_DELIVERY / CANCELLEDالمرسِل، النظام، الموظفون
DELIVERED → COMPLETEDالنظام، الموظفون
DELIVERED → RETURN_REQUESTEDالمشتري (خلال 14 يومًا)، الموظفون
RETURN_REQUESTED → RETURN_APPROVEDالبائع، الموظفون
RETURN_REQUESTED → DISPUTEDالبائع، المشتري، الموظفون
RETURN_APPROVED → RETURN_IN_TRANSITالمشتري، السائق، النظام، الموظفون
RETURN_IN_TRANSIT → RETURN_RECEIVEDالبائع، الموظفون
RETURN_RECEIVED → REFUNDEDالنظام، الموظفون
COMPLETED → DISPUTEDالمشتري، الموظفون
DISPUTED → COMPLETED / REFUNDEDالموظفون فقط
معلومة مهمة

انتقال DELIVERED ← COMPLETED معرّف للنظام، لكن لا توجد مهمة مجدولة في العامل الخلفي تنفّذه اليوم؛ تبقى الطلبات في حالة DELIVERED حتى يكملها الموظفون. وتعامل المرتجعات والتقييمات الحالتين DELIVERED وCOMPLETED بالطريقة نفسها.