# Technical Analysis — دليل مدينتي (Daleel Madinati)

> Design-led. لا يوجد brief. المصدر: ملف Figma واحد `pIFyEHCimnG9rIRh3TMnHC` (canvas **App** `#0:1`) فيه جمهوران. أي قاعدة عمل غير ظاهرة على الشاشات = `<?>`.

## 1) Overview

- **الفكرة:** سوق توظيف محلي — الباحث يبني ملفاً (نفاذ + مؤهلات + سيرة + فيديو) ويتقدّم على وظائف بنسبة توافق؛ صاحب العمل ينشر وظائف، يراجع مرشحين، ويحدد مقابلات.
- **المنصات:** تطبيق موبايل واحد (iPhone frames). لا ويب في التصميم.
- **Audiences (ONE backend + ONE DB):**
  - `user` / app — باحث عن عمل / باحث عن وظيفة.
  - `provider` / app — صاحب عمل / شركة (حساب أعمال). شاشة «من أنت؟» `#17125:2948` تعرض خيارين فقط؛ شاشة `role-selection` `#17881:2032` نفس الثنائية. المسمّى «مدير موارد بشرية» يظهر كـ **حقل** على فورم الشركة وليس جمهوراً ثالثاً في التصميم.
- **Guest mode:** شاشة «من أنت؟» فيها **تخطي** — **مُتجاهَل**. اختيار الدور إلزامي؛ لا تصفّح كضيف.
- **Auth model (مُعتمد من المطوّر):** Model A — `users` + `providers` (جدول واحد فيه `provider_type` enum) + Sanctum guard لكل جمهور (`auth:user` / `auth:provider`) على نمط `admins`. انظر `docs/build/build-auth-audience.md`.
- **تكامل ظاهر:** نفاذ الوطني — **stub** الآن (`national_id` + `nafath_id` + `nafath_raw`) والتكامل الحقيقي لاحقاً. لا بوابة دفع ولا جداول بطاقة/PAN/CVV — الباقة والاشتراك في DB فقط، والسعر يغيّره الأدمن.
- **إيراد:** باقتان (باحث + أعمال). seed أولي: تجربة 30 يوماً + 1200 هللة/سنة (12 ر.س) لكل باقة — الأدمن يغيّر السعر من لوحة التحكم. لا باقة شهرية في الـ schema.

## 2) Features (high level)

1. Auth (هاتف + OTP + نفاذ + لغة) — للجمهورين.
2. ملف باحث (نفاذ، تعليم، خبرات، مهارات، سيرة، فيديو، وظائف مستهدفة، اكتمال الملف).
3. وظائف (قائمة/تفاصيل/توافق/تقديم) + طلبات + مقابلات.
4. تطوع / تدريب — نفس جدول `jobs` بعمود `purpose`: `hire` / `volunteer` / `training`.
5. اشتراك الباحث (تجربة + باقة سنوية).
6. حساب أعمال: تسجيل شركة، نشر وظيفة (wizard)، وظائفي، مرشحون، مقابلات (جديد/مقبول/مرفوض)، طلب مرشحين.
7. إعدادات / دعم / شروط / FAQ / حذف حساب / تسجيل خروج.
8. لوحة أدمن واحدة لإدارة الكيانات (لا توجد شاشات أدمن في Figma — CRUD من الكيانات).

## 3) Screens map (FROM FIGMA)

رابط الشاشة: `https://www.figma.com/design/pIFyEHCimnG9rIRh3TMnHC/HR?node-id=<id>&m=dev` (حوّل `:` → `-`).

### 3.A — مشترك / دخول (section Login `#17652:1566`)

| # | Audience / platform | Screen (Figma) | Fields / lists | Actions / states | Entity / API |
|---|---------------------|----------------|----------------|------------------|--------------|
| 1 | shared / app | Splash `#17004:5488` | لوجو دليل مدينتي | عرض فقط | — |
| 2 | shared / app | Login `#17004:5493` | لغة، جوال +966، نفاذ | تسجيل الدخول · الدخول عبر نفاذ · تسجيل جديد · اللغة | `POST /auth/login` · Nafath start |
| 3 | shared / app | Login 5 `#18111:3677` | نفس Login (variant HTML-import) | نفس Login | reuse |
| 4 | shared / app | Forgot Password `#17004:5570` | جوال | إرسال رمز | `POST /forgot-password/request-code` |
| 5 | shared / app | Forgot Password 2 `#17004:5632` | OTP | تحقق | `POST /forgot-password/verify-code` |
| 6 | shared / app | OTP Verification `#17004:5665` | OTP | تحقق · إعادة إرسال | `POST /auth/verify-otp` |
| 7 | shared / app | Activate `#17004:5706` | OTP نجاح/تفعيل | متابعة | `POST /auth/activate` |
| 8 | user / app | Register `#17004:5748` | صورة اختيارية، جوال، إيميل اختياري، مدينة، موقع، جنس، جنسية، تاريخ ميلاد (ي/ش/س)، موافقة شروط | إنشاء حساب · تسجيل الدخول | `POST /user/register` |
| 9 | shared / app | English `#17004:6152` | اختيار لغة | تأكيد اللغة | `PATCH /settings/locale` |
| 10 | shared / app | Welcome `#17004:6197` | ترحيب | متابعة | — |
| 11 | shared / app | Manage `#17004:6203` | sheet قصير | إغلاق/متابعة | variant قائمة/إدارة — لا كيان جديد |
| 12 | user / app | Personal Info 3 `#17119:411` | بيانات شخصية (variant) | حفظ | profile |
| 13 | user / app | Confirm `#17119:657` | تأكيد بيانات | تأكيد | profile confirm |
| 14 | user / app | Personal Info 4 `#17119:855` | بيانات (variant) | حفظ | profile |
| 15 | shared / app | من أنت؟ `#17125:2948` | صاحب شركة / باحث عن عمل · متابعة · تخطي | اختيار دور | يحفظ audience قبل التسجيل |
| 16 | shared / app | role-selection `#17881:2032` | باحث عن وظيفة · صاحب عمل/شركة | اختيار نوع الحساب | نفس #15 (النسخة النهائية للبراند) |

### 3.B — استكمال ملف الباحث + اشتراك (Personal Info `#17652:1658`)

| # | Audience | Screen | Fields / lists | Actions | Entity / API |
|---|----------|--------|----------------|---------|--------------|
| 17 | user | Personal Info `#17060:642` | من نفاذ: اسم، هوية، ميلاد، جنس، جنسية، مدينة، جوال، إيميل · مؤهلات (درجة، جامعة، معدل، سنة) · شهادات مهنية (اسم، جهة، سنة) | تأكيد البيانات · تعديل البيانات | Nafath profile confirm / update |
| 18 | user | Subscription `#17068:685` | تجربة 30 يوم · 12 ر.س/سنة · 5.75 ر.س/شهر · مزايا · اسم حامل البطاقة، رقم، انتهاء، CVV · موافقة | طلب إصدار سيرة ذاتية · تخطي الآن | `plans` + `subscriptions` (بدون charge الآن) |
| 19 | user | Manage 2 `#17072:1896` | إدارة باقة/ملف | متابعة | subscription / profile |
| 20 | user | Create `#17073:2706` | إنشاء (sheet) | إنشاء | variant إضافة قسم ملف / تقديم |
| 21 | user | Personal Info 2 `#17073:4366` | بيانات (variant) | حفظ | profile |
| 22 | user | 72 `#17076:5136` | variant تدفق | — | reuse تدفق موجود |
| 23 | user | 89 `#17077:5716` | variant تدفق | — | reuse تدفق موجود |
| 24 | user | Intro Video `#17084:387` | رفع/تسجيل فيديو | حفظ | user intro_video (media) |
| 25 | provider | Register 2 `#17084:883` | تسجيل شركة (أطول من Register) | إنشاء حساب | `POST /provider/register` |
| 26 | provider | Login 2 `#17143:484` | دخول أعمال | تسجيل الدخول | `POST /provider/auth/login` |
| 27 | user | Confirm Subscription `#17150:501` | toast تأكيد اشتراك | إغلاق | subscription |

### 3.C — الرئيسية والوظائف (الباحث) (home `#17652:1735`)

| # | Audience | Screen | Fields / lists | Actions | Entity / API |
|---|----------|--------|----------------|---------|--------------|
| 28 | user | home `#17002:1378` | اكتمال الملف % · بانر · إجراءات: تطوع/تدريب/رفع فيديو/إرفاق سيرة · وظائف مقترحة (توافق، عنوان، شركة·مدينة، راتب، نوع دوام) · دعوات مقابلات (عن بعد/حضوري، تاريخ، وقت) · تبويب: رئيسية/طلباتي/وظائف/حسابي | عرض الكل · فتح وظيفة · فتح مقابلة | `GET /home` · jobs · interviews |
| 29 | user | Tasks `#17003:5023` | تفاصيل وظيفة: توافق، نوع دوام، شركة، خبرة، موقع، راتب، وصف، مهام، مهارات، مزايا، خريطة | التقديم الآن | `GET /jobs/{id}` · `POST /jobs/{id}/apply` |
| 30 | user | Order `#17004:6267` | sheet تقديم | تأكيد تقديم | apply |
| 31 | user | My Orders `#17063:1043` | قائمة طلبات | فتح طلب | `GET /applications` |
| 32 | user | My Account `#17070:1112` | حسابي (قائمة) | تنقّل | profile |
| 33 | user | Service `#17070:1542` | فلتر/خدمة | تطبيق فلتر | jobs filter |
| 34 | user | Tasks 2 `#17078:6085` | تفاصيل وظيفة (variant) | تقديم | jobs |

### 3.D — حسابي / المزيد (الباحث) (more `#17652:1792`)

| # | Audience | Screen | Fields / lists | Actions | Entity / API |
|---|----------|--------|----------------|---------|--------------|
| 35 | user | more `#17121:1444` | رأس ملف · معلومات شخصية · مؤهلات · خبرات · مهارات · سيرة · فيديو · وظائف مستهدفة · اشتراكاتي · إعدادات | فتح كل قسم | profile sections |
| 36 | user | My Subscriptions `#17123:2411` | باقة حالية | إدارة/إلغاء | subscriptions |
| 37 | user | Confirm 2 `#17123:2821` | تأكيد | نعم/لا | confirm dialog |
| 38 | user | Order 2 `#17123:2932` | sheet | تأكيد | confirm dialog |
| 39 | user | Personal Info 6 `#17502:5710` | تعديل بيانات شخصية | حفظ | `PUT /me` |
| 40 | user | المؤهلات التعليمية `#17503:5805` | قائمة مؤهلات (sheet) | إضافة/تعديل | educations |
| 41 | user | Tasks 7 `#17503:5822` | sheet خبرات | إضافة/تعديل | experiences |
| 42 | user | CSS `#17503:6103` | sheet مهارات (اسم الشاشة مضلل) | إضافة مهارات | skills |
| 43 | user | السيرة الذاتية `#17503:6675` | رفع PDF | رفع/حذف | media: cv |
| 44 | user | Intro Video 2 `#17503:6706` | فيديو | رفع/حذف | media: intro_video |
| 45 | user | الوظائف المستهدفة `#17503:6732` | مسمّى + مدينة + نوع دوام | حفظ | target_jobs |

### 3.E — إعدادات ودعم وخروج (الباحث)

Settings `#17652:1869` · Technical Support 2 `#17652:1931` · Logout 2 `#17652:1983`

| # | Audience | Screen | Fields | Actions | API |
|---|----------|--------|--------|---------|-----|
| 46 | user | Settings `#17325:1042` | لغة، إشعارات، تغيير جوال/إيميل/كلمة، شروط | تبديل · فتح تدفق | settings + change-* |
| 47 | user | Settings variants `#18139:4310` / `#18139:4475` | إشعارات | toggle `is_notify` | `PATCH /me/notify` |
| 48 | user | Edit Profile `#17325:1368` / `#18177:1356` | تعديل ملف | حفظ | `PUT /me` |
| 49 | user | English 2 `#17325:1749` | لغة | حفظ | locale |
| 50 | user | Change `#17325:1848` | جوال/إيميل جديد | إرسال رمز للحالي | change-phone/email step 1 |
| 51–52 | user | OTP Verification 3/4 | رمز الحالي / رمز الجديد | تحقق | `OLD_*` / `NEW_*` OTP |
| 53 | user | Phone Number Changed `#17325:2071` | نجاح | إغلاق | — |
| 54 | user | Terms & Conditions `#17325:2082` | محتوى صفحة | — | `GET /pages/terms` |
| 55–60 | user | Technical Support 2, Terms 3, FAQ 3/4, Info 2, Send 2 | تذكرة/FAQ/نجاح إرسال | إرسال شكوى | complaints / faqs / pages |
| 61–63 | user | Logout 2, Delete Account 2, Delete 2 | تأكيد خروج/حذف | خروج · حذف · إلغاء | logout · `DELETE /me` |

### 3.F — حساب الأعمال (Account `#17652:2020` + My Account 2 `#17652:2159`)

| # | Audience | Screen | Fields / lists | Actions | Entity / API |
|---|----------|--------|----------------|---------|--------------|
| 64 | provider | Account `#17257:692` | صورة شركة اختيارية، جوال، إيميل، مدينة، موقع، رقم تواصل، موعد مقابلة (تجاهل — خلط mock)، رقم ضريبي، اسم شركة، الاسم الكامل + المسمّى الوظيفي، شروط | إنشاء حساب | `POST /provider/register` |
| 65 | provider | Account 2 `#17258:978` | القطاع، حجم الشركة | تأكيد | نفس `POST /provider/register` |
| 66–67 | provider | Account 3, OTP 2 | مراجعة وتأكيد / OTP أعمال | تحقق | provider auth |
| 68 | provider | Order 3 `#17261:2301` | تفاصيل طلب/وظيفة أعمال | إجراءات | jobs/applications |
| 69–70 | provider | Profile / Profile 2 | ملف شركة | حفظ | provider profile |
| 71 | provider | المرشحين للوظيفة `#17430:1067` | قائمة مرشحين | فتح ملف | job applications |
| 72 | provider | Login 3/4 | دخول أعمال | login | provider auth |
| 73 | provider | وظائفي المنشورة `#17502:1993` | قائمة وظائف | فتح/تعديل | `GET /provider/jobs` |
| 74 | provider | Service 2 / Service 3 | فلتر | تطبيق | jobs filter |
| 75 | provider | OTP Verification 7 | OTP | تحقق | provider otp |
| 76 | provider | My Account 2 `#17263:3269` | تبويب مقابلات: جديد / مقبول / مرفوض · كروت وظيفة (حالة نشط، مسمّى، قسم·مدينة، خبرة، نوع، راتب، ينتهي) | فلتر · فتح | interviews + jobs |
| 77 | provider | My Account 7/8/9 | variants قوائم | — | reuse |
| 78 | provider | Category `#17487:2826` | نشر وظيفة: مسمّى، قسم، مدينة | التالي | job create step 1 |
| 79 | provider | Details `#17502:1697` | تفاصيل إضافية (راتب/نوع/خبرة…) | التالي | job create step 2 |
| 80 | provider | Description `#17502:1898` | وصف/مهام/مهارات/مزايا | نشر | job create step 3 |
| 81 | provider | تم نشر الوظيفة بنجاح `#17502:1981` | نجاح | إغلاق | — |
| 82 | provider | Confirm Subscription 2 `#17561:1350` | اشتراك أعمال | تأكيد | provider subscription |

### 3.G — مقابلات ومرشحون وطلب مرشحين

Interviews `#17652:2211` · Tasks 3 `#17652:2253` · Request for Candidates `#17652:2355`

| # | Audience | Screen | Fields | Actions | API |
|---|----------|--------|--------|---------|-----|
| 83–85 | provider | Interviews ×3 `#17502:2828` / `#17502:3709` / `#17502:3882` | قائمة/تفاصيل مقابلة | قبول · رفض · جدولة | interview transitions |
| 86 | provider | My Account 6 `#17502:4055` | variant | — | reuse |
| 87 | provider | Tasks 3 `#17428:814` | تفاصيل وظيفة أعمال | إدارة | provider job |
| 88–97 | provider | المرشحين 2–5، Profile 4–7، Tasks 4–6، Add/Add 2–4 | قائمة مرشحين + ملف مرشح + إضافة ملاحظة/دعوة | دعوة مقابلة · قبول · رفض · إضافة | candidates + interviews |
| 98 | provider | Request for Candidates `#17430:1388` | طلب ترشيح | إنشاء | candidate_requests |
| 99 | provider | Search `#17430:1582` | بحث مرشحين | بحث | `GET /provider/candidates/search` |
| 100 | provider | Profile 3 / Profile 8 | ملف مرشح | دعوة | user public profile |
| 101 | provider | Order 5 `#17430:1908` | تأكيد إرسال | إرسال | invite |
| 102 | provider | Appointment `#17438:1920` | تاريخ/وقت/نوع مقابلة | حفظ | `POST /interviews` |

### 3.H — المزيد/إعدادات الأعمال

more `#17652:2402` · Edit Profile 2 `#17652:2459` · Technical Support `#17652:2516`

| # | Audience | Screen | Fields | Actions | API |
|---|----------|--------|--------|---------|-----|
| 103 | provider | more `#17486:839` | قائمة حساب أعمال | تنقّل | provider me |
| 104–106 | provider | My Subscriptions 3/4, Confirm 3, Order 6 | اشتراك أعمال | إدارة | provider subscriptions |
| 107–109 | provider | Logout / Delete Account / Delete | خروج/حذف | تأكيد | provider logout/delete |
| 110–116 | provider | Edit Profile 2, English 3, Change 2, OTP 5/6, Phone Changed 2, Settings 2 | إعدادات أعمال | نفس تدفق الباحث | provider settings |
| 117–121 | provider | Technical Support, Send, Terms 2, Info, FAQ/FAQ 2 | دعم | إرسال | complaints (morph) |

**Total screens analyzed:** **121** صف (بعضها variants لنفس التدفق). لا نضاعف الميزات بين variants. نفس الجمهور على منصة واحدة = endpoints واحدة.

## 4) Entities — REUSE / ALTER / NEW

| Entity | Class | Key fields | Translatable | Files | Relations | Soft-delete | Enums |
|--------|-------|------------|--------------|-------|-----------|-------------|-------|
| `users` | ALTER | + `national_id` string index, `gender` enum, `nationality` string, `city_id` FK, `birth_date` date, `location` string nullable, `job_title` string nullable, `profile_completion` tinyInteger, `nafath_raw` json nullable | — | image (موجود) + media: `cv`, `intro_video` | city, educations, experiences, skills, applications, interviews, subscriptions | yes (موجود) | Gender: male,female |
| `providers` | NEW | name, image, phone, phone_normalized, country_code, email, password nullable, `provider_type` enum nullable, `company_name`, `tax_number`, `job_title` (مسمّى المسؤول), `contact_phone`, `city_id`, `location`, is_blocked, is_notify, is_active, is_complete_info, phone/email verified | — | image + media | city, jobs, subscriptions | yes | ProviderType: `hr_staff`, `company_owner`, `recruitment_company`, `volunteer_hours`, `training_course`, `training_job`, `job_ad` |
| `otps` | REUSE | polymorphic otpable | — | — | — | no | OtpType موجود |
| `media` | REUSE | Spatie | — | — | — | — | — |
| `pages` / `faqs` / `settings` / `notifications` / `complaints` / `contact_messages` | REUSE | — | pages/faqs translatable | — | morph complaints | — | — |
| `countries` / `cities` | REUSE | مدينة التسجيل من `cities` | yes | — | — | — | — |
| `job_categories` | NEW | slug, is_active | name | — | jobs | yes | — |
| `job_posts` | NEW | كان اسمه `jobs` في المسودة — أُعيد تسميته لأن Laravel يملك جدول `jobs` للطابور. provider_id, category_id, city_id, `purpose`, experience_min/max, salary_min/max, work_type, location_text, lat/lng nullable, status, expires_at, published_at | title, description, duties, benefits (Astrotomic) | — | provider, category, city, skills, applications | yes | JobPurpose: hire,volunteer,training · WorkType: full_time, part_time, remote, hybrid · JobStatus: draft,active,closed,expired |
| `job_skill` pivot / `skills` | NEW | — | name | — | jobs, users | no | — |
| `job_applications` | NEW | user_id, job_id, status, match_percent, cover nullable | — | — | user, job | yes | ApplicationStatus: pending,reviewed,accepted,rejected,withdrawn |
| `interviews` | NEW | application_id, provider_id, user_id, type, status, scheduled_at, location/link, notes | — | — | application, user, provider | yes | InterviewType: remote,onsite · InterviewStatus: new,accepted,rejected,done,cancelled |
| `educations` | NEW | user_id, degree, major, institution, gpa decimal nullable, graduated_at year | — | — | user | yes | — |
| `experiences` | NEW | user_id, title, company, years/from-to, description | — | — | user | yes | — |
| `user_skills` | NEW | user_id, skill_id | — | — | — | no | — |
| `certificates` | NEW | user_id, title, issuer, year, score nullable | — | media: file | user | yes | — |
| `target_jobs` | NEW | user_id, title, city_id nullable, work_type | — | — | user | yes | WorkType |
| `plans` | NEW | code, price_minor (هللة), interval, trial_days, audience (user/provider), is_active | name, description, features | — | subscriptions | yes | PlanInterval: yearly,monthly |
| `subscriptions` | NEW | morph owner (user/provider), plan_id, status, trial_ends_at, starts_at, ends_at, cancelled_at | — | — | plan | yes | SubscriptionStatus: trial,active,cancelled,expired |
| `candidate_requests` | NEW | provider_id, filters json, status | — | — | provider | yes | CandidateRequestStatus: pending,processing,done,cancelled |
| تطوع/تدريب | ALTER `jobs` | عمود `jobs.purpose` — ليست جداول منفصلة | — | — | — | — | JobPurpose: hire,volunteer,training |

## 5) Files & media decision

Spatie `media` على الموديل (افتراضي القاعدة):

- `users`: collection `avatar` (عمود `image` الموجود عبر FILES) + `cv` (PDF) + `intro_video`
- `providers`: `avatar` / شعار الشركة
- `certificates`: `file` إن وُجد مرفق
- لا جدول `*_files` إلا إذا احتجنا ترتيب/نوع لكل ملف — غير ظاهر في التصميم.

## 6) APIs needed — by audience

**shared**

- لغة التطبيق، صفحات terms/privacy/faqs، دول/مدن.

**user → auth:** request-code, verify-otp, nafath-start/callback, register, login, logout, activate, forgot-password (3 steps), change-phone/email (verify-current → set-new → verify-new), change-password.

**user → profile:** me, update, educations CRUD, experiences CRUD, skills sync, certificates CRUD, cv upload, intro-video upload, target-jobs, complete-profile.

**user → jobs:** home, list/filter, show, apply, applications list/show, withdraw.

**user → interviews:** list, show, accept/reject invite.

**user → billing:** plans, subscribe (بدون charge), skip-trial, my-subscription, cancel.

**provider → auth/profile:** register, login, otp, me, update company.

**provider → jobs:** create (3 steps), list mine, show, update, close.

**provider → candidates:** list by job, show profile, accept/reject, search, candidate-request.

**provider → interviews:** schedule, list (new/accepted/rejected), accept/reject (من جهة الشركة إن لزم).

**كلاهما:** complaints create, notifications, delete-account.

## 7) Dashboard CRUDs needed

- Users (موجود — ALTER أعمدة) · Providers (جديد) · Job categories · Jobs · Applications · Interviews · Plans · Subscriptions · Skills · Complaints/Pages/Faqs/Settings (موجود) · Candidate requests · dashboard-home + reports (وظائف/تقديمات/اشتراكات).

## 8) Real seed data

- مدن: الرياض، جدة، الدمام (من `cities` القاعدة).
- باحث: محمد بن أحمد العلي · هوية 110*****34 · 1992-05-15 · ذكر · سعودي · 05xxxxxxxx · m.alali@email.com · بكالوريوس حاسب كس · ماجستير إدارة أعمال · PMP / Udacity / Google / IELTS 7.5.
- وظائف: مطور واجهات أمامية · مدير تسويق رقمي · محلل بيانات — راتب 15000–20000 · دوام كامل/عن بعد · توافق 92%.
- شركة: شركة تقنية سعودية · الرقم الضريبي تجريبي · مسؤول: محمد العلي / مدير موارد بشرية.
- باقة باحث: تجربة 30 يوم + 1200 هللة/سنة (12 ر.س) — الأدمن يغيّر السعر.
- باقة أعمال: نفس الـ seed الأولي (30 يوم + 1200 هللة/سنة) — الأدمن يغيّر السعر. لا جداول بطاقة.

## 9) Decisions (كانت `<?>` — مُغلقة)

| السؤال | القرار |
|--------|--------|
| أنواع مقدم الخدمة | `company` / `employer` / `hr_staff` / `other` |
| زر تخطي في «من أنت؟» | تجاهل — اختيار الدور إلزامي |
| نفاذ | stub: أعمدة جاهزة، التكامل لاحقاً |
| تطوع/تدريب | نفس `jobs` + `purpose` |
| نصوص الوظيفة | Astrotomic (`title`/`description`/`duties`/`benefits`) |
| الباقات | باقتان (user + provider) — السعر من الأدمن |
| السعر الأولي | سنوي 12 ر.س = 1200 هللة + 30 يوم تجربة (لا شهري) |
| حقول البطاقة على الشاشة | لا جداول بطاقة/PAN/CVV |
| موعد مقابلة على فورم تسجيل الشركة | تجاهل (خلط mock) |

## 10) Dependency-ordered backlog (مسودة — الخطط بعد طبقة DB فقط عندما تقول «كمل»)

| Sprint | Includes | Depends on |
|--------|----------|-----------|
| 1 | Auth user+provider + Nafath stub + ALTER users + providers | — |
| 2 | Profile sections + media cv/video | 1 |
| 3 | Jobs + applications + match % | 2 |
| 4 | Interviews + candidate search/request | 3 |
| 5 | Plans/subscriptions (بدون بوابة) | 1 |
| 6 | Admin CRUDs + dashboard home/reports | 3–5 |
