# 🩺 م3 (Patient File & Registration) — EXECUTING

**STATUS: 🔄 قيد التنفيذ 2026-07-03.** م2 كودها خلص. **حكم Fable الكامل = عقد التنفيذ في `fable-ruling.md` (نفس المجلد) — اقرأه أولًا.**

## قرارات التصعيد الـ4 (Fable ديفولتات — ماشي بيها back-to-back، المالك يعترض في الباتش)
1. **باقة co4 = OBGYN/مصر** (عشان تست القومي→الميلاد) — ديفولت: نعم.
2. **حذف المريض = LIS-only** (الكلينك تعطيل `is_active` فقط) — ديفولت: نعم.
3. **حذف الدكتور = soft-delete مسموح + التعطيل هو الأساس UI** — ديفولت: الاتنين.
4. **important_note** يعدّله حامل `clinic.patients.update` — ديفولت: نعم.

## WP DAG (Ruling 7 — كاتب واحد لكل ريبو، BE ‖ FE، عقود مقفولة في الـ ruling)
- **BE:** WP-B1 (دلتا المحرك: 3 migrations + HistoryService patient-scope + HistoryQuestion Store/Update/Resource + profile endpoints) → WP-B2 (باب كتابة المريض: `LabPatientWriteService` + rules مشروطة + Clinic store/update + duplicate-check + 4 صلاحيات + **Pest صفر-انحدار LIS**) → WP-B3 (أطباء CRUD + تعريفا الإعدادين + `ClinicProfilePackSeeder` + تحديث presets م2).
- **FE:** WP-F1 (أساسات: registries + `ProfileFormConfigService` + `<clinic-patient-search>` + حذف الميت) → WP-F2 (شاشة `clinic/patients` + NID→DOB + تحذير تكرار + حقول إضافية، يعتمد B1+B2) → WP-F3 (أطباء + تبويب «نماذج الملفات» + تطبيق باقة، يعتمد B3).
- **migrations:** M1 history_questions · M2 patient_history_answers (nullable+scope_key+unique swap atomic) · M3 important_note — **تُشغَّل نفس خطوة شحن BE على moonui_dev_be** (درس 1054). + seeders (settings/perms/packs).

## 🚩 أعلام حمراء (بنود بوابة صريحة)
انحدار LIS عبر التحقق الشرطي = فخ فلوس م3 (Pest صريح: `POST /lis/patients` بلا إعداد = سلوك اليوم) · زحف نطاق المحرك (unit/danger/normal/value_num/vitals) = رفض فوري (م6) · الصلاحيات الـ4 لازم تتوصّل في presets م2+Dependencies · ماتفكش حراسة شِيم Patient · UI teal+app-form-dialog+reactive.

## ▶️ التنفيذ: WP-B1 (BE) ‖ WP-F1 (FE) بدأوا بالتوازي → بوابة native+Codex لكل WP.

---
_(الخرايط + الحكم الكامل في نفس المجلد: `fable-ruling.md` · `scout-{a,b,c}.md`)_

<details><summary>خرايط pre-scout (مطوية)</summary>

## خرايط الـ3 scouts (هنا في نفس المجلد)
- `scout-a-be-patient.md` — الباك: **مفيش patient store للكلينك** (بيستخدم LIS `LabPatient` عبر `LabPatientController::store`؛ Clinic `PatientController` GET بس). NID موجود+required · mrn=رقم الملف. **مفقود:** auto-DOB من NID · حزمة الزوج/gyna · draft-resume · form-field config. **Duplicate = 422 submit-time على NID بس** (مفيش live). **Doctors CRUD gap مؤكد** (index/show/updateIdentity بس — لا store/edit/destroy؛ الكامل في LIS LabDoctorController).
- `scout-b-fe-registration.md` — الفرونت: **مفيش شاشة مرضى** — quick-add dialog في CreateVisit بـ **4 حقول بس** (name/name_ar/phone/gender). `ClinicPatientService` مفيهوش create/update/delete. **3 typeaheads مكررة**. Doctors = Add+Edit-identity بس. أفضل clone: `ClinicPatientHeaderComponent` (teal `#0f766e`).
- `scout-c-kb-spec.md` — المرجع: gyna legacy ~41 حقل vs Moon ~16. **تبنّي:** husband/marital كـ **dynamic-fields package** · NID→DOB + important-note **core** · blood_group hideable · **draft-resume مؤجّل**. **نموذج الإدارة:** FE registries (`PATIENT_FORM_REGISTRY`/`DOCTOR_FORM_REGISTRY`) + إعدادين JSON per-company (`clinic.patient_form_fields`/`clinic.doctor_form_fields`، hidden≠required server-enforced) + dynamic engine (scope=patient, category=profile جديد) + specialty presets. **Doctors:** CRUD كامل + hide/show (دين م1). **Duplicate:** 5-axis soft on-blur + توحيد الـ typeaheads.

## ⚠️ التعارض المفتوح لـ Fable (يُحسم قبل scoping م3)
`clinic-dynamic-fields.md` بيحط **schema محرك الحقول الكامل في «م3 core»**، لكن `clinic-execution-phases.md` (المُعدَّل 2026-07-03) بيحصر م3 في **reuse لـ category=profile بس** ويؤجّل محرك vitals/danger-range لـ **م6**. → **Fable يحسم حدود م3/م6 للـ schema.** (+ ملاحظة: ترقيم `clinic-test-scenarios.md` قديم/مختلف — ماتخلطش.)

## تست المالك لـ م3 (من execution-phases سطر 73)
سجّل بالرقم القومي → الميلاد يتملى · نفس التليفون → تحذير تكرار · أخفِ حقول الزوج من الإعدادات → تختفي من الفورم.

## ▶️ الاستئناف: أول ما م2 كوده يخلص → استشر Fable (بالتعارض أعلاه + النطاق) → SDD.
