# Sprint 5 — حجوزات المزوّد (Provider bookings & operations)

> جانب المزوّد التشغيلي (غير مُصمّم في Figma — من منطق المجال): استقبال الحجوزات وتغيير حالاتها، التقييمات، الإحصائيات.
> المرجع: [`../analysis.md`](../analysis.md) §1/§6 + نموذج حالة الحجز.

## النطاق
- **API provider — bookings (واردة):**
  - `GET /provider/bookings?status=` (ملكية: حجوزات هذا المزوّد فقط)
  - `GET /provider/bookings/{id}`
  - `POST /provider/bookings/{id}/confirm` (pending→confirmed)
  - `POST /provider/bookings/{id}/start` (confirmed→in_progress)
  - `POST /provider/bookings/{id}/complete` (in_progress→completed)
  - `POST /provider/bookings/{id}/reject` (pending/confirmed→cancelled + سبب)
- **API provider — reviews:** `GET /provider/reviews` (تقييمات هذا المزوّد).
- **API provider — dashboard:** `GET /provider/dashboard` (حجوزات حسب الحالة، الإيراد، متوسط التقييم، الأكثر طلباً).

## الاعتماديات
- Sprint 4 (bookings + حالات + transactions) — DONE. Sprint 2 (provider API).

## فكّر-الأول
- **لبنات Laravel:** **State machine** لانتقالات الحجز (نفس حرّاس Sprint 4، مُعاد استخدامها) · Policies (anti-IDOR: المزوّد لا يرى/يغيّر حجز غيره) · Events+Jobs للإشعارات (booking_status_update/service_completed/rate_request) · scopes (byStatus, revenue).
- **قواعد أعمال:** الانتقالات الصالحة فقط (رفض انتقال غير صالح سيرفر-side) · إكمال الخدمة يطلق rate_request للمستخدم · المزوّد `approved` فقط يستقبل/يدير.
- **حواف:** تأكيد حجز غير مدفوع · إكمال حجز غير مؤكد · رفض بعد الدفع (يستلزم استرداد — علّم payment_status=refunded + معاملة استرداد) · تزامن (قفل الحالة).

## design pattern (اقتراح)
- **State** (مشترك مع Sprint 4) لانتقالات الحجز — خدمة `BookingTransitionService` بحرّاس صريحة. موافقة عند التنفيذ.

## نتيجة الإنجاز (DoD)
```
migrate:fresh --seed: ⬜ · pint: ⬜ · dump-autoload -o: ⬜ · schema:check: ⬜ · test: ⬜ · smoke: ⬜ · commit: <hash>
```
