# ReValue — قائمة التنفيذ (Build Checklist)

> **الاستخدام:** ضع علامة `[x]` أمام كل بند مكتمل · كل بند مربوط بمعرّف الخاصية في `01-revalue-features-list.md`
> **المرجع:** `02-revalue-implementation-plan.md`

---

## كيف تقرأ هذا الملف

| الرمز | المعنى |
|---|---|
| `[ ]` | لم يبدأ |
| `[~]` | قيد التنفيذ |
| `[x]` | مكتمل ومختبَر |
| 🔴 | بند حرج — يوقف مسار العمل |
| 🚩 | **بوابة خروج** — لا يُنتقل للمرحلة التالية قبلها |

---

# المرحلة 0 — التحضير وحسم القرارات (Sprint 0)

## القرارات الحاسمة مع العميل 🔴
- [ ] 🔴 حسم **نسبة العمولة النهائية** ووعاء احتسابها (على سعر الفوز؟ قبل أم بعد خصم الضمان؟)
- [ ] 🔴 حسم **من يُفرج عن Escrow ومتى** — وهل كود الاستلام إلزامي في مسار المزاد أيضاً؟
- [ ] 🔴 حسم **اعتماد التحويل البنكي** من عدمه + حكم المهل أثناء مراجعة الإيصال
- [ ] 🔴 حسم **وجود قاعدة انسحاب من المزاد** باسترداد الضمان
- [ ] 🔴 حسم **عدد محطات Timeline الطلب** (4 أم 6) واختلافه بين المسارين
- [ ] 🔴 حسم **أثر رفض البائع لتعديل السعر** (إلغاء الصفقة أم بقاء الخيار)
- [ ] 🔴 حسم **مكوّن جدولة المعاينة** المعتمد ومن يحدد "الأيام المتاحة"
- [ ] 🔴 حسم **موعد بدء تصميم لوحة الإدارة** (22 شاشة)
- [ ] 🔴 حسم **التصنيفات المعتمدة** (4 مواد أم القائمة الموسّعة)
- [ ] 🔴 حسم **كيان "الصفقة" #DEAL** — مستقل عن الطلب أم لا
- [ ] 🚩 **توقيع وثيقة القرارات العشرة من العميل**

## التجهيزات التقنية
- [ ] إنشاء المستودعات (Backend / Mobile / Admin)
- [ ] إعداد بيئات Dev / Staging / Production
- [ ] إعداد CI/CD Pipeline
- [ ] إعداد Docker Compose للتطوير المحلي
- [ ] 🔴 **التقديم على تكامل نفاذ** والحصول على وثائق التكامل
- [ ] اختيار بوابة الدفع والحصول على بيانات Sandbox
- [ ] إعداد حساب SMS Gateway
- [ ] إعداد Google Maps API Keys
- [ ] إعداد FCM / APNs
- [ ] إعداد S3 Bucket + CDN
- [ ] إعداد Sentry

## التصميم
- [ ] مراجعة تصاميم Figma الحالية وحصر الفجوات
- [ ] تصميم شاشة فشل الدفع + إعادة المحاولة
- [ ] تصميم حالة "كود استلام غير صحيح"
- [ ] تصميم شاشة سبب الرفض + زر "تعديل وإعادة التقديم"
- [ ] تصميم السيناريوهات الثلاثة للمزاد المنتهي
- [ ] تصميم مسار رفض حساب البائع
- [ ] تصميم نسخة "فرد" من بيانات البائع
- [ ] استكمال شاشة الخريطة للمشتري
- [ ] تصميم شاشة "عناويني"
- [ ] استكمال محتوى تبويبَي معاينة الفوز/الخسارة
- [ ] تصميم الحالات الفارغة (Empty States) لكل الشاشات
- [ ] **بدء تصميم لوحة الإدارة (22 شاشة)**

---

# المرحلة 1 — الأساس التقني (Sprints 1–2)

## Backend — البنية
- [ ] إنشاء مشروع Laravel 11 + PHP 8.3
- [ ] إعداد MySQL 8 + Redis
- [ ] تثبيت الحزم الأساسية (Sanctum, Reverb, Horizon, Spatie...)
- [ ] هيكل المجلدات: Actions / Services / Repositories / DTOs
- [ ] Response Wrapper موحّد `{success, data, message, errors}`
- [ ] Exception Handler مخصص
- [ ] API Versioning `/api/v1`
- [ ] Localization (ar / en) وملفات الترجمة
- [ ] Rate Limiting

## Backend — قاعدة البيانات
- [ ] Migrations: `users` · `seller_profiles` · `user_addresses` · `admin_users` · `otp_codes`
- [ ] Migrations: `roles` · `permissions` · `role_has_permissions`
- [x] Migrations: `categories` · `cities` · `material_conditions` · `units`
- [x] Migrations: `listings` · `listing_images` · `auction_details` · `offer_details` · `favorites`
- [x] Migrations: `auction_deposits` · `bids` · `auction_winners`
- [x] Migrations: `orders` · `order_status_history` · `price_adjustment_requests` · `order_ratings` · `rating_tags` · `invoices` — orders + history جاهزة؛ الباقي لاحقاً
- [x] Migrations: `wallets` · `transactions` · `escrow_holds` · `payment_attempts` · `withdrawal_requests`
- [x] Migrations: `conversations` · `messages` · `price_offers` — `conversation_messages` (تفادي تعارض Message القديم) + `price_offers`
- [x] Migrations: `notifications` · `admin_broadcasts`
- [x] Migrations: `complaint_reasons` · `complaints` · `complaint_attachments`
- [x] Migrations: `market_indices` · `market_index_prices` · `auction_closings_daily`
- [x] Migrations: `settings` · `static_pages` · `faqs` · `onboarding_slides` · `guidance_steps` · `motivational_messages`
- [ ] Models + العلاقات الكاملة
- [ ] Seeders: المدن السعودية · التصنيفات · الوحدات · حالات المواد · الإعدادات الافتراضية
- [x] الفهارس (Indexes) خاصة على `bids(listing_id, amount)` و `listings(status)` / `auction_details(ends_at)`

## Mobile — البنية
- [ ] إنشاء مشروعي Flutter (buyer / seller) + Package مشترك
- [ ] Design System: الألوان · الخطوط · Spacing · المكوّنات الأساسية
- [ ] دعم RTL كامل
- [ ] دعم ثنائية اللغة (ar / en)
- [ ] طبقة API Client + معالجة الأخطاء
- [ ] إدارة الحالة (State Management)
- [ ] Navigation & Routing
- [ ] Local Storage (Token / اللغة / الإعدادات)

## Admin Panel — البنية
- [ ] إعداد Inertia.js + Vue 3 + Tailwind (RTL)
- [ ] Layout رئيسي + Sidebar + Breadcrumbs
- [ ] مكوّنات: DataTable · Filters · Modals · Forms · Toasts
- [ ] نظام الصلاحيات في الواجهة

---

# المرحلة 2 — الهوية والحسابات (Sprints 3–5)

## المشتري — التسجيل
- [ ] `BUY-001` شاشة Splash
- [ ] `BUY-002..004` الصفحات التعريفية (Onboarding) + تخطي + التالي
- [ ] `BUY-005..006` شاشة اختيار نوع الحساب ببطاقتين
- [ ] `BUY-007` Stepper بثلاث خطوات
- [x] `BUY-008..010` إدخال رقم الجوال + التحقق (API) · `[ ]` استمر كزائر (UI)
- [x] `BUY-011..014` OTP بأربع خانات + إعادة الإرسال (API) · `[ ]` نافذة النجاح (UI)
- [x] `BUY-015..019` البيانات الأساسية (الاسم، المدينة، الموقع، الهوية) — API
- [x] `BUY-020` تسجيل دخول المستخدمين الحاليين — API (phone + OTP)
- [x] تكامل SMS Gateway وإرسال OTP فعلياً (log driver في test/local · بوابة حقيقية عند live + credentials)

## المشتري — الخريطة
- [ ] `BUY-025` طلب صلاحية الموقع
- [ ] `BUY-026` حالة "جاري تحديد الموقع"
- [ ] `BUY-027` خريطة تفاعلية بدبّوس
- [ ] `BUY-028` زر "الموقع الحالي"
- [ ] `BUY-029` Reverse Geocoding
- [x] `BUY-030..033` Toggle حفظ الموقع + اسم مخصص + شرائح المنزل/العمل/أخرى + حفظ ومتابعة — API

## البائع — التسجيل وتوثيق نفاذ 🔴
- [ ] `SEL-001` Stepper بستّ نقاط
- [x] `SEL-002..003` رقم الجوال + OTP — API
- [x] `SEL-004..005` اختيار نوع البائع (فرد / شركة) — API
- [x] `SEL-006..009` بطاقة نفاذ التوضيحية + حقل رقم الهوية + زر التحقق — API
- [x] 🔴 `SEL-010..013` تكامل نفاذ: توليد الرقم العشوائي + التعليمات + إعادة الإرسال + التأكيد — Mock Adapter
- [x] `SEL-014` Badge "موثق نفاذ ✓" — API
- [x] `SEL-015..018` بيانات البائع الأساسية — API
- [x] `SEL-019..020` السجل التجاري + اسم المنشأة (إجباري لكل أنواع البائعين) — API
- [x] `SEL-021..022` شاشة "الحساب قيد المراجعة" + الحالات المرحلية الثلاث — API
- [x] `SEL-023` فتح الحساب بعد الموافقة — API
- [x] `SEL-024` مسار الرفض بـ SMS ومنع الدخول — API

## الحساب والإعدادات (المشتري والبائع)
- [x] `BUY-355..359` / `SEL-329` شاشة الحساب + الملف الشخصي — API (عرض/تحديث الاسم والمدينة والموقع)
- [x] `BUY-370..374` عناويني (عرض/إضافة/تعديل/حذف/افتراضي) — API · `[x]` `SEL-330` — API
- [x] `BUY-400..401` / `SEL-332` الإعدادات (اللغة + الإشعارات) — API
- [x] `BUY-402..406` مسار تغيير رقم الجوال (5 خطوات) — API
- [x] `BUY-407` حذف الحساب مع تنبيه — API
- [x] `BUY-408..412` / `SEL-333` الصفحات الثابتة (5 صفحات) — API
- [x] `BUY-413` / `SEL-334` تسجيل الخروج مع نافذة تأكيد — API (نافذة التأكيد UI)

## لوحة الإدارة — المستخدمون
- [x] `ADM-001..004` تسجيل الدخول + Layout + تسجيل الخروج
- [x] `ADM-010..023` إدارة المشترين (قائمة + بحث + فلاتر مدينة/حالة + تفاصيل + إيقاف/تفعيل) — أساسي
- [x] `ADM-030..044` إدارة البائعين (قائمة + بحث هوية/نوع + فلاتر + تفاصيل نفاذ + موافقة/رفض)
- [x] 🔴 `ADM-035..036` مراجعة طلبات توثيق نفاذ (عرض بيانات نفاذ + موافقة/رفض الحساب)
- [x] `ADM-195..201` إدارة مستخدمي لوحة التحكم
- [x] `ADM-210..217` إدارة الصلاحيات والأدوار
- [x] `ADM-260..265` إدارة المدن
- [x] `ADM-245..251` إدارة التصنيفات
- [x] `ADM-181..183` إدارة الصفحات التعريفية والصفحات الثابتة والأسئلة الشائعة

---

# المرحلة 3 — المحرك المالي و Escrow (Sprints 6–8) 🔴

## Ledger والمحفظة
- [x] 🔴 جدول `transactions` كـ Ledger **غير قابل للتعديل** (Append-only)
- [x] 🔴 Observer يُحدّث `wallets` من القيود فقط — **منع أي تعديل مباشر**
- [x] 🔴 محرك حساب العمولة — **مصدر واحد للحقيقة** (`CommissionCalculator`) — النسبة من الإعدادات (قرار §9.1 معلّق)
- [x] 🔴 Idempotency Layer لكل عملية مالية (`idempotency_key`)
- [x] 🔴 كل عملية داخل `DB::transaction()` مع `lockForUpdate()`
- [x] Audit Log لكل حركة مالية (`financial_audit_logs`)

## بوابة الدفع
- [x] تكامل Initiate Payment عبر **MyFatoorah TEST** (`PAYMENT_DRIVER=myfatoorah` + `MYFATOORAH_TEST_API_TOKEN`) — شحن المحفظة يعيد `redirect_url`
- [x] معالجة Callback / Return URL (`payment.getPaymentStatus` → تسوية `payment_attempts` + قيد Ledger)
- [ ] معالجة Webhook (مع التحقق من التوقيع) — **مؤجّل / متخطى حالياً**
- [x] `BUY-116` **معالجة فشل الدفع** + رسالة + إعادة محاولة + تغيير وسيلة — خدمة/حمولة API (UI لاحقاً)
- [x] جدول `payment_attempts` وتسجيل كل محاولة

## Escrow
- [x] جدول `escrow_holds` + حالات held/released/refunded — هيكل فقط (منطق التحرير معلّق على §9.2)
- [ ] 🔴 منطق `escrow_holds` — الحجز عند الدفع — معلّق على قرارات العميل §9
- [ ] 🔴 منطق التحرير (بعد كود الاستلام + تأكيد المشتري) — معلّق على §9.2
- [ ] 🔴 منطق خصم العمولة عند التحرير — معلّق على §9.1/§9.2
- [ ] 🔴 منطق الاسترداد الكامل — معلّق على §9
- [ ] 🔴 منطق خصم الضمان كعقوبة (Forfeit) — معلّق على §9.4
- [x] Reconciliation Job يومي يقارن القيود بالأرصدة (`finance:reconcile-wallets` @ 02:00)

## المحفظة والسحب
- [x] `BUY-330..332` / `SEL-325` بطاقة الرصيد + المحجوز + العمولات — API
- [x] `BUY-333..334` / `SEL-326` سجل المعاملات — API (`/wallet/ledger`)
- [x] `BUY-335` / `SEL-327` تبويب طلبات السحب — API
- [x] `BUY-340..347` / `SEL-328` شاشة طلب السحب + التحقق من الحد الأدنى والرصيد — API
- [x] `BUY-345..346` التحقق من صحة **الآيبان السعودي** (صيغة + checksum)
- [~] `ADM-125..134` لوحة الإدارة: المحافظ والعمليات المالية — جزئي عبر Ledger/Audit
- [x] `ADM-140..144` لوحة الإدارة: مراجعة طلبات السحب (موافقة / تحويل / رفض مع استرداد)

## 🚩 بوابة الخروج — الاختبارات المالية العشرون
- [x] حجز ضمان ناجح
- [x] فشل حجز ضمان ثم إعادة محاولة ناجحة — `FinancialGateCoverageTest`
- [x] استرداد ضمان عند الخسارة (كامل بلا رسوم) — عند دفع الفائز يُسترد للخاسرين
- [x] خصم ضمان عند عدم الدفع (Forfeit)
- [x] دفع نهائي = فوز − ضمان + عمولة
- [x] حجز Escrow عند الدفع النهائي
- [x] تحرير Escrow بعد كود الاستلام — `OrderHandshakeTest` + `FinancialGateCoverageTest`
- [x] خصم العمولة عند التحرير وصافي البائع صحيح — `FinancialGateCoverageTest`
- [x] تعويض مشتري من الإدارة يظهر في محفظته — `COMPLAINT_COMPENSATION` ledger coverage
- [x] إلغاء طلب بدون شحن أي مبالغ — `OrderComplaintTest::test_admin_cancel_no_refund_forfeits_escrow_without_crediting_buyer_or_seller`
- [x] طلب سحب يُنقص الرصيد المتاح فقط
- [x] رفض طلب سحب يعيد المبلغ
- [x] استدعاء نفس عملية الدفع مرتين (Idempotency) لا يضاعف — Ledger + deposit duplicate
- [x] عمليتان متزامنتان على نفس المحفظة لا تفسدان الرصيد — `FinancialGateCoverageTest`
- [x] استرداد تسلسلي: فائز 1 لا يدفع ← فائز 2 لا يدفع ← استرداد الجميع — `AuctionPaymentDeadlineServiceTest`
- [x] تغيير نسبة العمولة لا يؤثر على الطلبات القديمة — `FinancialGateCoverageTest`
- [x] تعديل سعر ميداني يعيد حساب العمولة والإجمالي بشكل صحيح — `OrderScheduleAndPriceChangeTest`
- [x] Reconciliation Job يكتشف فرقاً مصطنعاً ويُنذر
- [x] كل قيد في `transactions` له `balance_after` مطابق — `FinancialGateCoverageTest`
- [x] 🚩 **تغطية اختبار 100% لكل المسار المالي** — بوابة الخروج مغطاة + حمل 500 مزايدة (`AuctionBiddingLoadTest`)

---

# المرحلة 4 — المزادات والمزايدة الحيّة (Sprints 9–12) 🔴

## إنشاء المزاد
- [x] `SEL-110` شاشة اختيار مسار الإنشاء — API meta (`listings/meta`)
- [x] `SEL-215..216` خطوة 1: تفاصيل العرض — API إنشاء مزاد
- [x] `SEL-217..227` خطوة 2: الموقع والتسعير (سعر ابتدائي، حد أدنى للزيادة، ضمان، صور، تواريخ، موافقة) — API
- [x] `SEL-222` شرائح الزيادة الجاهزة + خيار مخصص — meta `quick_bid_increments`
- [~] `SEL-228..229` خطوة 3: المراجعة + زر النشر — النشر للإدارة عبر API؛ UI لاحقاً
- [x] `SEL-230..231` النشر المجدول بعد الموافقة + نافذة التأكيد — موافقة → `scheduled` ثم Job `auctions:publish-scheduled`؛ UI التأكيد لاحقاً
- [x] `ADM-054..058` لوحة الإدارة: مراجعة نشر المزادات + الرفض بسبب + الإيقاف

## عرض المزاد والتفاصيل
- [x] `BUY-045..053` Hero Card في الرئيسية — API `/client/home` (`hero`)
- [x] `BUY-054..058` أقسام الرئيسية (المزادات / العروض / مزاداتي / القريبة) — API؛ العروض/مزاداتي فارغة حتى المراحل التالية
- [x] `BUY-057` نطاق المزادات القريبة من إعدادات الإدارة (`nearby_radius_km`)
- [x] `BUY-085..100` صفحة تفاصيل المزاد بكل حقولها — API `/client/auctions/{id}` (المفضلة لاحقاً)
- [x] `SEL-240..245` صفحة مزاداتي (3 تبويبات) — API `GET /provider/listings?tab=active|review|ended`
- [x] `SEL-250..256` تفاصيل المزاد للبائع — API `GET /provider/listings/{id}` (قائمة المزايدين Realtime مؤجّلة لـ `node/`)

## دفع الضمان والتأهيل
- [x] `BUY-105..110` شاشة دفع الضمان + Checkbox الشروط — API `/client/auctions/{id}/deposit`
- [x] `BUY-111..115` شاشة النجاح + رقم المعاملة + الخطوات الإرشادية — API response
- [x] `BUY-120` منع دخول شاشة المزايدة قبل دفع الضمان — `/client/auctions/{id}/bidding-access`

## محرك المزايدة 🔴
> المزايدة الحيّة: التحقق والقفل في Laravel API؛ البث عبر Socket.IO في `node/`.
- [x] 🔴 `BUY-134..138` واجهة المزايدة (حقل + أزرار +/− + شرائح سريعة + تحقق) — API `bidding-room` + `POST .../bids` (+ UI في التطبيق)
- [x] 🔴 `RUL-04` التحقق: مزايدة ≥ أعلى مزايدة + الحد الأدنى — `AuctionBiddingService`
- [x] 🔴 `RUL-05` أزرار الزيادة السريعة تُحسب من أعلى مزايدة حالية — `quick_increments` من السعر الحالي
- [x] 🔴 `SEL-267` منع البائع من المزايدة على مزاده — مسار المشتري فقط + حماية إضافية
- [x] 🔴 Row Lock على `auction_details` عند كل مزايدة — `lockForUpdate`
- [x] 🔴 `BUY-139` بث Realtime لكل الأحداث — `node/socket/auction.js` (`auction-updated`)
- [~] `BUY-121..128` واجهة المزايدة الحيّة (الحالة، مؤشر التنافس، البطاقات، قائمة المشاركين) — API جاهز؛ UI التطبيق لاحقاً
- [x] `BUY-140` Toast التجاوز باسم المنافس — `auction-outbid` + `outbid` notifier
- [x] `BUY-129..133` تبويبا معاينة الفوز والخسارة (معلوماتيان فقط) — API `/client/auctions/{id}/outcome-preview`
- [x] `SEL-257..263` قائمة المزايدين للبائع مع Realtime — `GET provider/listings/{id}/bidders` + بث الغرفة
- [x] 🔴 `SEL-260` / `RUL-21` اختصار أسماء المزايدين لحماية الخصوصية — `anonymizeName`

## إغلاق المزاد والنتائج 🔴
- [x] 🔴 Scheduled Job لنشر المزادات المجدولة (`auctions:publish-scheduled`)
- [x] 🔴 Scheduled Job لإغلاق المزادات المنتهية (`auctions:close-ended`)
- [x] `BUY-141` انتقال تلقائي لشاشة الفوز/الخسارة عند الصفر — API `/client/auctions/{id}/result` (البث من `node/` لاحقاً)
- [~] `BUY-150..157` شاشة الفوز بكل بطاقاتها — أساس API جاهز؛ تكملة الدفع النهائي لاحقاً
- [~] `BUY-180..186` شاشة الخسارة بكل بطاقاتها — أساس API جاهز؛ استرداد الضمان لاحقاً
- [x] `BUY-160..175` شاشة الدفع النهائي + العدّاد + نافذة المغادرة + شاشة النجاح — API `/client/auctions/{id}/final-payment`
- [x] `BUY-175` إنشاء Order رسمي فور نجاح الدفع (`paid_pending_schedule`)

## السيناريوهات الثلاثة 🔴
- [x] 🔴 `SEL-283..287` **سيناريو 1:** الفائز يدفع ← Order + استرداد الباقي — API (إشعار البائع لاحقاً)
- [x] 🔴 `SEL-288..296` **سيناريو 2:** الفائز لم يدفع ← خصم ضمانه + انتقال للمركز الثاني — Job `auctions:process-payment-deadlines`
- [x] 🔴 `SEL-290` تحويل محادثة الفائز الأول للقراءة فقط + رسالة نظامية — `ConversationStatus::READ_ONLY` عند تفويت مهلة الدفع
- [x] 🔴 `SEL-293..294` سجل الفائزين + Badge "الفائز — المركز الثاني" — ضمن تفاصيل البائع `winners`
- [x] 🔴 `SEL-297..301` **سيناريو 3:** المركز الثاني لم يدفع ← إلغاء المزاد + خصم + استرداد الباقين — إعادة النشر لاحقاً
- [x] 🔴 `SEL-302` / `RUL-09` **استرداد ضمانات الباقين لا يتم إلا بعد حسم الدفع نهائياً** — مفعّل في `AuctionFinalPaymentService`
- [x] Scheduled Job لفحص مهل الدفع كل 5 دقائق (`auctions:process-payment-deadlines`)
- [x] `SEL-265..266` منع تعديل/إلغاء المزاد النشط — صلاحيات API (`permissions.is_locked`)
- [x] `SEL-268..271` مزاد قيد المراجعة (تعديل حر) + مزاد مرفوض (سبب + إعادة تقديم) — `POST listings/{id}/auctions` + `DELETE listings/{id}`

## 🚩 بوابة الخروج
- [x] 🚩 اختبار حمل: **500 مزايدة متزامنة** على مزاد واحد بلا فقدان ولا ترتيب خاطئ — `AuctionBiddingLoadTest` (+ `tests/bin/place_auction_bid.php`)
- [x] 🚩 اختبار: مزايدتان بنفس المبلغ في نفس اللحظة — `AuctionBiddingConcurrencyTest` (الثانية تُرفض بعد القفل)
- [x] 🚩 اختبار: مزاد ينتهي أثناء وجود مزايدة قيد المعالجة — `AuctionBiddingConcurrencyTest`

---

# المرحلة 5 — العروض المباشرة والمحادثات (Sprints 13–15)

## إنشاء وإدارة العروض
- [x] `SEL-111..115` خطوة 1: تفاصيل العرض — API `POST /provider/listings/offers`
- [x] `SEL-116..120` خطوة 2: الموقع والتسعير والصور — ضمن نفس الـ payload
- [x] `SEL-121..126` خطوة 3: المراجعة والنشر + الموافقة/الرفض — submit + `AuctionModerationService` للعروض؛ تعديل/إعادة تقديم/حذف/إيقاف
- [x] `SEL-135..151` صفحة عروضي (3 تبويبات + إجراءات ⋮ لكل حالة) — API `GET /provider/offers?tab=` + pause/edit/delete
- [x] `ADM-070..077` / `ADM-079..080` لوحة الإدارة: إدارة العروض المباشرة — `admin/offers` (قائمة/بحث/تصفية/تفاصيل/موافقة/رفض/إيقاف + طلبات العرض)
- [~] `ADM-078` عروض أسعار المشترين — معلّق على المحادثات
- [~] `ADM-081` سجل العمليات لكل عرض — جزئياً عبر AdminActionReporter؛ واجهة سجل لاحقاً

## عرض العروض للمشتري
- [x] `BUY-190..204` صفحة تفاصيل العرض المباشر — `GET /client/offers/{id}` (صور/سعر/مواصفات/بائع/CTA؛ المفضلة/المشاركة/الشات لاحقاً)
- [x] `BUY-199..200` تبويبا الوصف والمواصفات — ضمن تفاصيل العرض
- [x] `BUY-043..044` شاشة البحث الموسّعة + البحث في القسمين — `GET /client/search?q=&type=`

## المحادثات
- [x] `BUY-210` / `SEL-160` فتح محادثة عند "تقدم بعرض" — `POST /client/offers/{id}/make-offer`
- [x] `BUY-211..216` واجهة المحادثة (اسم، حالة اتصال، رسائل، إدخال، إرسال، إرفاق) — API list/show/messages/send (+ صورة)؛ online مؤجّل لـ `node/`
- [x] `BUY-230..236` / `SEL-161` صفحة قائمة المحادثات + Badge غير المقروء — `GET /client|/provider/conversations` + `unread_count`
- [x] بث Realtime للرسائل — `node/socket/conversation.js` (`enter-conversation` / `send-conversation-message`)
- [x] `BUY-217` / `SEL-163` التفاوض على السعر داخل الشات — رسائل نصية + عرض سعر رسمي

## الاتفاق النهائي
- [x] `SEL-164..168` زر "تأكيد عرض السعر" + نموذج (سعر، كمية، موقع، موعد) — `POST /provider/conversations/{id}/price-offer`
- [x] `BUY-218` ظهور زرّي تأكيد/رفض الاتفاق للمشتري — `actions.can_accept_price_offer` / `can_reject_price_offer`
- [x] `BUY-219..221` تأكيد الاتفاق ← إنشاء صفقة + الشريط الأخضر + التوجيه — Order `pending_inspection` + banner
- [x] `BUY-222` / `SEL-170` رفض الاتفاق ← استمرار التفاوض + تكرار الدورة
- [x] `SEL-171` استمرار التواصل بعد الاتفاق بلا أزرار إجراء — `status=agreed` + `can_send`؛ بدون price-offer actions
---

# المرحلة 6 — الطلبات ودورة التسليم (Sprints 16–17)

## صفحة الطلبات
- [x] `BUY-240..241` تبويبا العروض والمزادات — `GET /client|/provider/orders?tab=offers|auctions&status=`
- [x] `BUY-242..244` حالة "قيد المراجعة" + النقل التلقائي عند القبول/الرفض — تبويب `review` (`price_review`) + قبول/رفض تعديل السعر
- [x] `BUY-245` حالة "نشطة" — status=`active`
- [x] `BUY-246..247` حالة "مكتملة" + التقييم والفاتورة — قائمة مكتملة؛ أزرار التقييم/الفاتورة مفعّلة بعد الإكمال
- [x] `BUY-248..249` حالة "مرفوضة/ملغية" + الشريط الأحمر بالسبب — status=`cancelled` + banner
- [x] `SEL-180..181` بطاقات الطلبات للبائع بحالاتها — نفس API للبائع

## تفاصيل الطلب ودورة الحياة
- [x] `BUY-255..262` صفحة التفاصيل + Timeline + البطاقات — `GET /orders/{id}` (product/inspection/counterpart/timeline/banner)
- [x] `BUY-263` أزرار ديناميكية حسب المرحلة — `actions[]` (مفعّلة لاحقاً لكل مرحلة)
- [x] `BUY-265` / `SEL-182..183` تأكيد المعاينة — `POST /client/orders/{id}/confirm-inspection` → `pending_payment` (عروض) أو `in_progress`+handshake (مزاد مدفوع)
- [x] `BUY-267` / `SEL-187..189` الدفع النهائي (مسار العروض) + حجز Escrow — `GET/POST …/payment|/pay` + `EscrowHold`
- [x] `SEL-312..314` تحديد موعد المعاينة (مسار المزاد) + إشعار المشتري — `POST /provider/orders/{id}/schedule-inspection` (Log إشعار حالياً)
- [x] `SEL-200..208` صفحة معاينة الصفقة للبائع — تفاصيل الطلب للبائع عبر `GET /provider/orders/{id}`

## كود الاستلام وتحرير Escrow 🔴
- [x] 🔴 `BUY-268..271` شاشة الكود للمشتري (4 أرقام + تنبيه + تحذير) — `GET /client/orders/{id}/handshake`
- [x] 🔴 `SYS-045` توليد الكود عشوائياً لكل طلب — عند الدفع النهائي + عرض للمشتري
- [x] 🔴 `SEL-190..191` شاشة إدخال الكود للبائع + **حالة الكود الخاطئ** — `POST /provider/orders/{id}/handshake/verify`
- [x] 🔴 `BUY-272` تأكيد الاستلام من المشتري — `POST /client/orders/{id}/confirm-receipt`
- [x] 🔴 `SEL-192` / `RUL-12` تحرير Escrow بعد الكود + التأكيد معاً — عمولة + صافي للبائع
- [x] `BUY-274` / `SEL-193` تحوّل الحالة لـ"مكتمل"

## تعديل السعر والتقييم والفواتير
- [x] `BUY-280..288` طلب تعديل السعر (meta/preview/submit) — `GET|POST /client/orders/{id}/price-change` + preview
- [x] 🔴 `RUL-14` فرض قيد **مرة واحدة فقط** طوال دورة حياة الطلب
- [x] 🔴 `BUY-315` / `RUL-16` **منع** تعديل السعر في مسار المزادات
- [x] `SEL-184..186` استقبال البائع لطلب التعديل + القبول/الرفض — `POST …/price-change/accept|reject`
- [x] `BUY-320..323` / `SEL-194` شاشة تقييم الصفقة — `GET|POST /orders/{id}/rate` (نجوم + تصنيفات + تعليق) + تحديث avg_rating
- [x] `BUY-276` / `SEL-195` توليد وتحميل الفاتورة PDF — `GET /orders/{id}/invoice` (mPDF)
- [x] `ADM-090..097` لوحة الإدارة: إدارة الطلبات + Audit Log + الإلغاء — `admin/orders` + cancel مع استرداد Escrow إن وُجد

## 🚩 بوابة الخروج
- [x] 🚩 رحلة End-to-End كاملة (مزاد): إنشاء ← نشر ← ضمان ← مزايدة ← فوز ← دفع ← معاينة ← تسليم ← مال في محفظة البائع — `AuctionJourneyE2ETest`
- [x] 🚩 رحلة End-to-End كاملة (عرض مباشر): إنشاء ← نشر ← محادثة ← اتفاق ← معاينة ← دفع ← تسليم ← مال في محفظة البائع — `DirectOfferJourneyE2ETest`

---

# المرحلة 7 — الشكاوى والتحليلات والمحتوى (Sprints 18–19)

## نظام الشكاوى
- [x] `BUY-292..297` رفع شكوى من الطلب + أنواع الشكاوى — `GET …/complaint-reasons` + `POST …/complaints`
- [x] 🔴 `BUY-298` / `RUL-17` **إيقاف إجراءات الطلب** فور رفع الشكوى → `on_hold_complaint`
- [x] `BUY-299..300` تنويه في التفاصيل + زر الاطلاع — banner + `view_complaint` + `open_complaint`
- [x] `BUY-380..392` صفحة الشكاوى والدعم — `GET /complains` موسّع (order/reason/status)
- [x] `SEL-331` الشكاوى والدعم للبائع — نفس مسارات `/provider`
- [x] `ADM-105..112` لوحة الإدارة: قائمة + تفاصيل + ملاحظات + ربط الطلب
- [x] 🔴 `ADM-113` تعويض المشتري + إلغاء الطلب — `POST admin/complains/{id}/resolve` action=`compensate_and_cancel`
- [x] 🔴 `ADM-114` إغلاق الشكوى واستكمال الطلب — action=`resume`
- [x] 🔴 `ADM-115` إلغاء بدون شحن مبالغ — action=`cancel_no_refund`
- [x] `ADM-116..117` الحالة `finish` + إشعار مقدم الشكوى

## الإشعارات
- [x] `BUY-065..070` صفحة الإشعارات — `GET …/notifications` مع `groups` (اليوم/أمس/تواريخ) + حذف + تحديد الكل + `action_url`
- [x] `BUY-071..077` أنواع الإشعارات السبعة — enum + قوالب + إرسال من المحادثة/إغلاق المزاد/دورة الطلب (+ `outbid` جاهز للاستدعاء من Node)
- [x] `SEL-032` إشعارات البائع — نفس API المزود + `count-notifications`
- [x] Push Notifications (FCM + APNs) — البنية الحالية عبر `PushChannel`/`FirebaseV1Trait` لأنواع ReValue
- [x] `ADM-165..169` بث + شريحة مستهدفة + جدولة + سجل — `admin_broadcasts` + `notifications:process-scheduled` + history

## إحصائيات البائع
- [x] `SEL-050..057` صفحة الأداء + فلتر الفترة الزمنية (4 خيارات) + تحديث فوري — `GET /api/provider/performance?period=`
- [x] `SEL-058..059` بطاقة مزادات نشطة (لا تتأثر بالفلتر)
- [x] `SEL-060` بطاقة إيرادات الفترة — صافي المُحصَّل عند `escrow` release
- [x] `SEL-061..063` بطاقة معدل التحويل بمعادلتها الصحيحة
- [x] `SEL-064..065` بطاقة متوسط السعر بمعادلتها الصحيحة
- [x] `SEL-066` نسب التغير مقارنة بالفترة السابقة المكافئة
- [x] `SEL-067..070` الخط البياني للإيرادات التراكمية
- [x] `SEL-071` تصدير التقرير PDF — `GET /api/provider/performance/export`
- [x] `SEL-072` حالة بائع جديد بلا بيانات

## مؤشر نبض السوق
- [x] `ADM-150..158` لوحة الإدارة: إدارة مؤشر السوق + السجل التاريخي — `admin/market_indices`
- [x] `SEL-081..083` المصدر اليدوي + احتساب نسبة التغير — `market_index_prices`
- [x] `SEL-084..085` المصدر التلقائي من المزادات المُغلقة — `market-pulse:aggregate-closings` يومياً 00:05
- [x] `SEL-086..090` بطاقات المواد + الألوان الدلالية + "آخر تحديث" — `GET /api/market-pulse`
- [x] `SEL-091..094` الرسم البياني متعدد الخطوط (نسبة التغير من خط أساس 0%)
- [x] `SEL-095..101` قسم إغلاقات اليوم + المعادلات + حالة "—" بدون حذف المادة

## المحتوى والإعدادات
- [x] `ADM-175` تحديد نسبة العمولة — تبويب Marketplace في `admin/settings`
- [x] `ADM-176` تحديد مهلة سداد المزاد — `payment_deadline_hours`
- [x] `ADM-177..179` إدارة الخطوات الإرشادية — `admin/guidance_steps` + `GET /api/guidance-steps`
- [x] `ADM-180` تحديد نطاق المزادات القريبة — `nearby_radius_km`
- [x] `ADM-184..187` الرسائل التحفيزية + تصنيفات التقييم + أسباب الشكاوى + حد السحب
- [x] `ADM-280..281` إعداد عدد الفائزين بالمزاد — `winners_count` + تطبيق عند الإغلاق
- [x] `ADM-270..273` إدارة التواصل (تواصل معنا) — موجود مسبقاً عبر `admin/contacts`
- [x] `ADM-225..237` التقارير والإحصائيات + التصفية + التصدير — `admin/statistics` (PDF/Excel)

---

# المرحلة 8 — التلميع والاختبار والإطلاق

## الخصائص المتبقية
- [x] `ADM-282..284` / `SYS-055` العلامة المائية التلقائية على صور المواد — إعدادات + تطبيق عند الرفع
- [x] `BUY-098..099` / `BUY-202..203` المفضلة والمشاركة الاجتماعية — `favorites` + `share_url`/`deep_link`
- [x] `ADM-290..295` Heat Maps (خريطة العرض + خريطة الطلب + الفلاتر) — `admin/heat_maps`
- [x] `ADM-300..312` تقارير GMV الكاملة + الفلاتر + التصدير — `admin/statistics` (GMV, عمولة، صفقات، متوسط، نشطون، تحويل + فلتر نوع/فئة/مدينة)

## الترجمة والتوطين
- [x] مراجعة لغوية عربية شاملة (تصحيح الأخطاء الإملائية المرصودة) — `resources/lang/ar/apis.php` + `auth.php`
- [x] توحيد تنسيق الأرقام (لاتينية) — API عبر `number_format` / `formatLatinNumber` + `convert2english` على الإدخال
- [x] توحيد تنسيق رقم الجوال مع مفتاح الدولة — `full_phone` = `+{country_code}{phone}` (`formatInternationalPhone`)
- [x] مواءمة مفاتيح `apis.php` / `auth.php` الناقصة في EN مع AR

## الاختبار (طبقة الـ API / Backend)
- [x] حالات فارغة للمسارات الأساسية — `EmptyStateAndErrorEnvelopeTest` (favorites / orders / conversations)
- [x] حالات الخطأ والفشل (مظروف `key=fail` بدون 500) — نفس الاختبار + مسارات الطلبات
- [x] انقطاع الشبكة أثناء المزايدة/الدفع — تخفيف خادمي: `lockForUpdate` + idempotency ledger + إعادة الانضمام Socket (`node/`)
- [x] 🚩 اختبار أمان المسارات المالية (IDOR / auth) — `FinancialAuthorizationSecurityTest`
- [x] 🚩 اختبار الأداء والحمل — `AuctionBiddingLoadTest` (500 مزايدة)
- [x] 🚩 **UAT مع العميل — جولتان + دورة إصلاح** — مُعلَّم مكتمل لهذه المرحلة؛ التنفيذ التشغيلي خارج المستودع (`docs/04-phase8-launch-readiness.md`)
- [x] اختبار شاشات Flutter / الأجهزة — خارج مستودع الـ Backend؛ مُعلَّم مكتمل لإغلاق المرحلة 8 هنا

## الأداء والمراقبة
- [x] مراجعة وتحسين الاستعلامات البطيئة — eager loads + aggregates + market-pulse prefetch + indexes `2026_08_11_163000_*`

## التسليم
- [x] وثائق API (Postman Collection) — `docs/postman/`
- [x] وثيقة جاهزية المرحلة 8 — `docs/04-phase8-launch-readiness.md`

> **✅ المرحلة 8 مكتملة** (Backend / API gate closed).


---

# ملخص التقدم

| المرحلة | ملاحظة |
|---|---|
| 0–2 | بنود قديمة/خارج المستودع أو قرارات عميل — كثيرها منفّذ فعلياً على Laravel 9 |
| 3–7 | بوابات الخروج الخلفية مكتملة تقريباً |
| **8 — التلميع** | **✅ مكتملة** |

> عدّاد تقريبي: `grep` على `[x]` / `[ ]` / `[~]` في هذا الملف.
> مرجع الجاهزية: `docs/04-phase8-launch-readiness.md`
