# دمج النسا والتوليد في المنصة الإكلينيكية الموحّدة

> تصميم فقط — 2026-10-21. بيكمّل `design.md` (البلوكات) و`design-data-layers.md` (البيانات) و`design-visit-shell.md` (الشاشة) و`master-plan.md`. المرجع للنسا: `plans/gyn-obstetrics-module.html` (المصدر `-src/p3a…p3g`, `p4a`, `p5-bottom`) + `clinic-dynamic-fields.md` + `gyna-reference.md`. كل ادّعاء عن الكود اتفحص (file:line).

---

## 1. الخلاصة وقرارات الدمج

**النسا مش موديول بشاشة لوحده — هي أول تخصص «كبير» بيركب على المنصة زي ما هي.** تحليل النسا كان بيقترح 15 جدول + مجموعة آليات (قيم، تنبيهات، ملاحظات، ميديا، متابعة، audit، summary). بعد المطابقة مع التصاميم التلاتة: **6 منهم موجودين فعلاً في المنصة**، **4 بيتحوّلوا لمفهوم مشترك** (episodes، procedures، follow-up، summary)، و**3 بس بيفضلوا جداول خاصة بالنسا** (`obstetric_history_rows`، `pregnancies`، `treatment_cycles` + صف المتابعة). الباقي (POP-Q، PROMs، UDS، antenatal visits) بيتخزن في المخازن الموحّدة (القياسات / الإجابات / المستندات) ومفيش جداول ليه.

**قرارات الدمج الأساسية (8):**

1. **مفيش `clinical_field_values`.** القيم كلها في `patient_history_answers` (قرار data-layers §3.2) مع alias `ClinicalFieldValue`. الامتداد الوحيد المطلوب للنسا: **scope تالت = `record`** (قيم مربوطة بعملية/دورة/حمل) — تفاصيله في §4.
2. **التحكم في الشكل والحقول لكل عميل أولاً** (تعليمات المالك): `default` (كود) ← **`company`** (الأدمن) ← `doctor` **بس لو** `clinic.layout.allow_doctor_override=true` (الافتراضي `false`) ← `context`. الحقول نفسها بنفس الآليات الموجودة: `is_active/is_required` على التعريف المنسوخ للشركة + `clinic.patient_form_fields {visible,required}` + `{type}.feature.*`. **مفيش آلية جديدة.**
3. **موديولات النسا الـ 51 = كروت في الكتالوج** بتتولّد من الباقة (`module_key`)، و`show_if` بتاع الموديول هو اللي بيفتحها ويقفلها إكلينيكياً، و`gyn.feature.*` بيشيل مجموعات كاملة للعميل اللي مش محتاجها.
4. **الموديولات الأساسية بتاعة النسا (complaint/exam/imaging/dx/team) = الكروت المشتركة نفسها** + حقول L4 من باقة `gyn_ob` بـ `show_if` على اختيارات الشكوى. مش كروت نسا منفصلة — وإلا نرجّع تكرار الشكوى والتشخيص اللي بنحلّه.
5. **العمليات = `clinical_procedures` في الكور** (قرار المالك 2026-10-20، GYN §7.6)، والـ 5 جداول الكيانية المشتركة (episodes، procedures، follow_up_tasks، referral الممتد، summary) بتتبني **مرة** في مرحلة كور جديدة `C1` قبل أول مرحلة نسا.
6. **الحمل والقياسات مش بيتكرروا:** `pregnancies` جدول (كيان له حالة)، لكن زيارة المتابعة = encounter عادي في episode الحمل + قياساتها (BP/وزن/FHR/FH) في `clinical_observations`. مفيش `antenatal_visits`.
7. **الأمان مرحلتين مستقلتين (`SEC1`, `SEC2`) + مرحلة تشفير ونسخ (`SEC3`)** — كلهم قبل تشغيل عميل النسا، والأغلب platform-wide مش نسا.
8. **كود النسا في `Modules/Gyn` + `features/gyn`** (نفس نمط Dental/Nutrition)، والكور في Clinic. الباقة `packs/gyn_ob` بتتبذر بـ `updateOrCreate(company_id, code)` زي باقي الباقات.

---

## 2. جدول المطابقة — كل كيان في GYN §7 ومكانه في المنصة

**الاختبار الواحد اللي اتطبّق على كل جدول:** هو (أ) كيان له دورة حياة وحالة وتواريخ → **جدول**؛ (ب) قياس بيتكرر بالزمن → **`clinical_observations`**؛ (ج) نص بيتولّد ويتوقّع → **`clinical_documents`**؛ (د) حقول فورم → **إجابات المحرك**.

| كيان GYN §7 | القرار | مكانه | المرحلة |
|---|---|---|---|
| `clinical_field_values` | **alias** | `patient_history_answers` + `repeat_index/value_json/source` (D0) + scope `record` (E1) | D0/E1 |
| `show_if / repeat / calc / module_key / lookup_key / is_private` | **موجود في تصميم المحرك** — بس grammar الـ `show_if` بتتبنّى من النسا لأنها الأشمل | `history_questions` أعمدة §3.1 | D0/E1 |
| `gyn_episodes` | **يتعمّم** → `clinical_episodes` (`patient_id, clinical_type, kind, categories json, opened/closed_at, status, primary_doctor_id, team json`) + `encounters.episode_id` nullable. التقويم والبرنامج الغذائي والإقامة كلهم «حلقات» | Clinic core | C1 |
| `patient_alerts` | **موجود (D2)**. أكواد النسا (`dvt_pe, thrombophilia, anticoag, transfusion, airway`) = خيارات في `clinic_history_options` بـ `is_alert` — يعني موديول «alerts» = تعريفات `storage=alert\|condition` في الـ intake المشترك | Clinic | D2 |
| `obstetric_history_rows` | **جدول نسا** (كارت + بيغذّي G/P/A/L في الهيدر + تقارير) | `Modules/Gyn` | G1 |
| `pregnancies` | **جدول نسا** (كيان: lmp/edd/dating/risk/categories/status) + بيملى حقل الكور `pregnant` L3 بـ `source=derived` read-only | Gyn | G5 |
| `antenatal_visits` | **يتشال.** الزيارة = encounter في episode الحمل؛ BP/وزن/FHR/FH/EFW/AFI = observations (`clinical_type=gyn_ob`)؛ urine/sx/fm/presentation = إجابات L4. الإدخال الرجعي من الورق = observation set بـ `encounter_id=NULL` (مسموح أصلاً). كارت الـ flowsheet = view على الـ sets | Clinic observations | D1 + G5 |
| `treatment_cycles` + `cycle_visits` + `follicles` | **جدولين نسا:** `treatment_cycles` (كارت لكل دورة + إحصائيات) + `cycle_monitoring` (صف لكل يوم متابعة: `cycle_id, encounter_id?, cd, et_mm, follicles json [{side,size}], decision`). `follicles` كجدول تالت زيادة — الـ dashboard محتاج lead follicle بس (محسوب) | Gyn | G3 |
| `operations` + `operation_procedures` | **كور:** `clinical_procedures` (§7.6: `patient_id, episode_id, performed_at, place, status, procedure_codes json → hospital_operations, approach, anesthesia, surgeon_id/name, hospital_surgery_id?, signed_at/by`) + حقول القالب كإجابات `scope=record`. `hospital_operations.clinical_template` + `clinic.procedures.mode`. مفيش جدول بنود | Clinic core (+ Hospital عمود واحد) | C1 (الكيان) / G4 (قوالب النسا) |
| `popq_measurements` | **يتشال** → observation set (9 تعريفات `aa,ba,c,d,ap,bp,tvl,gh,pb` + `popq_stage` محسوب على الـ set). قبل/بعد = مقارنة `observed_at` بتاريخ الـ procedure | Clinic observations | G6 |
| `prom_scores` | **يتشال** → نوع `score`: البنود في `value_json` على الزيارة + الإجمالي observation محسوب (`iciq_total, udi6_total, pgii, oabq_total, fsfi_total, fsds_total`) → baseline vs follow-up من الـ series | Clinic | G6/G7 |
| `urodynamic_studies` | **يتشال** → إجابات موديول `uds` على الزيارة + `clinical_documents doc_type=uds_report` (قالب، تعديل قبل التوقيع، PDF) | Clinic documents | G6 |
| `team_referrals` | **تمديد `ClinicReferral`** (`clinic_referrals`: موجود بـ `referred_to_name/specialty/reason/notes` بس — `ClinicReferral.php:28-38`): `+ kind (external\|team\|mdt)`, `+ episode_id`, `+ team`, `+ member_user_id`, `+ status (requested\|seen\|opinion\|joint\|back)`, `+ plan`. نطاق «حالاته» = عضوية الفريق من هنا ومن `clinical_episodes.team` | Clinic | C1 |
| `follow_up_tasks` | **كور** (`patient_id, source_type/id morph, clinical_type, due_at, template json, status, done_encounter_id`) + قواعد لكل تخصص في الـ registry (`followup_rules`). بيوحّد `dental_recalls` + `admissions.follow_up_on` + متابعة التغذية لاحقاً | Clinic | C1 |
| `clinical_notes` | **موجود (D2)** + `is_private` + `module_key` + `record morph`. الخاص = صلاحية | Clinic | D2 |
| `media` | **موجود (P0)**: `clinic_patient_attachments` morph + `kind (photo\|video\|link\|pdf)` + `external_url` + `is_private` + `module_key`. التحميل بيتسجّل في SEC2 | Clinic | P0 (+SEC2) |
| `access_audit` | **كور** في SEC2 (مش نسا) | Core/Clinic | SEC2 |
| Summary generator | **`ClinicalSummaryService` واحد** في Clinic: قوالب لكل `module_key` (الـ 51 دالة `sum` بتتنقل من JS لـ PHP + مرآة TS للملخص الحي) + أنواع من الـ registry (`clinic, fertility, operative, antenatal, delivery, discharge, followup, uds, urogyn, couple`). الخاص مستبعد إلا بـ `include_private` + صلاحية. الناتج = `clinical_documents doc_type=summary` (snapshot يتطبع) | Clinic | C1 (المحرك) / كل G (قوالبها) |
| `GET /gyn/definitions` · `/record` · `PUT values` | **الـ endpoints المشتركة**: `GET clinic/fields?clinical_type=gyn_ob` (D0) · `GET clinic/patients/{p}/record?sections=` + `PatientRecordService::extend('gyn_ob')` (يتقدّم من P4 لـ C1) · upsert الإجابات الموجود + scope record | Clinic | D0/C1 |
| صلاحيات `gyn.*` | المشترك بيبقى `clinic.*`: `notes.private`, `media.upload/download/share`, `export.identified/deidentified`, `alerts.manage`, `lookups.manage`, `summary.generate`, `procedures.view/edit/sign`, `episodes.manage`. النسا بس: `gyn.cycles.*`, `gyn.pregnancy.*`, `gyn.urogyn.*`, `gyn.uds.sign`, `gyn.sexual.view/edit`. الأدوار المبذورة زي §7.3 | Gyn seeder | G1 |
| Timeline | **كارت مشترك** بيقرا encounters + episodes + procedures + documents + referrals + follow_up_tasks. مش كومبوننت نسا | Clinic FE | C1 |

---

## 3. الموديولات ككروت + التحكم لكل عميل

**تلات آليات رؤية، كل واحدة ليها دور ما يتداخلش مع التانية:**

| الآلية | بتتحكم في | مين بيظبطها |
|---|---|---|
| `gyn.feature.{fertility, obstetrics, urogyn, sexual, oncology, operations}` (نمط `dental.feature.*` — `DentalSettings.php:20`) | **وجود مجموعة كاملة** للعميل: chips التصنيفات + كروت الموديولات + الصلاحيات + قوالب الـ summary | أدمن العيادة (إعدادات) |
| layout JSON `clinic.layout.gyn_ob` | ترتيب/حجم/طي/إخفاء **كروت الـ shell** | أدمن (`clinic.layout.manage`)؛ الدكتور لو `allow_doctor_override` |
| `show_if` على الموديول والحقل | **الرؤية الإكلينيكية** جوه الزيارة (اختيار بيفتح موديول) | التصميم — مش إعداد |
| `is_active` / `is_required` على التعريف المنسوخ للشركة + `clinic.patient_form_fields` | **حقل بعينه** مخفي/إلزامي لعميل | أدمن (شاشة الحقول — CRUD موجود) |

**تصحيح لازم في D0:** `ClinicProfilePackService.php:78-79` بيكتب `is_active=true, is_required=false` جوه قيم الـ `updateOrCreate` → أي إعادة تطبيق للباقة (تحديث MoonStack أو زرار «تطبيق باقة») **بترجّع الحقول اللي العيادة خبّتها**. القاعدة: الأعمدة دي تتكتب عند الإنشاء بس.

**إزاي الـ 51 موديول بيبقوا كروت:** الباقة بتبذر التعريفات بـ `module_key`، والـ registry بيولّد `CardDef` لكل `module_key` (`kind:'spec', spec:'gyn_ob', feature:'gyn.feature.X', showIf:<module show_if>`). الكارت بيتعرض بـ `app-clinic-dynamic-field-renderer` مفلتر بالـ module — **مفيش كومبوننت لكل موديول**. اللي ليه كومبوننت خاص: `obhx` (جدول الحمل السابق)، `oi/ivf` (كروت الدورات)، `antenatal` (flowsheet)، `popq` (ودجت)، `operation` (شاشة الـ procedure)، `team` (الإحالات)، `timeline`.

**الـ layout الافتراضي `gyn_ob`:** عمود ١ `flow:true` (محطات): القياسات 🔗 → الشكوى 🔗 (+ أسئلة النسا الشرطية) → **التصنيفات** (`gyn_categories` — chips لكل مجموعة مفعّلة؛ `required`) → الفحص 🔗 (+ فحص النسا) → الفحوصات المنظّمة (`gyn_imaging`) → التشخيص 🔗 → التحاليل/الأشعة/الروشتة 🔗 (الروشتة بـ `subjectEnabled`) → الإحالة/الفريق → المتابعة. عمود ٢ (`flow:false`): **كروت الموديولات** اللي `show_if` بتاعها صحيح، بترتيب المجموعات؛ الدورات والعمليات والحمل كروت **قابلة للتكرار** (صف لكل كيان). السكة: الهيدر فيه G/P/A/L + EDD/GA + التنبيهات؛ الـ timeline؛ الملخص الحي. **فين الـ `cat`:** اختيارات التصنيفات بتتخزن كإجابات L4 `gyn_cat_{group}` على الزيارة ∪ `categories` بتاعة الحلقات المفتوحة — وده اللي الـ evaluator بيقرا منه (النموذج كان بيحطها في state عام بلا بيت).

**عميلين مختلفين:** مركز A بيطفّي `gyn.feature.urogyn` و`gyn.feature.sexual` → chips الـ uro/sex وكروت الـ 13 موديول وصلاحيات `gyn.sexual.*` وقوالب الـ summary بتاعتهم بتختفي، ومفيش حاجة تتمسح. مركز B سايبهم. وجوّه نفس المركز، الأدمن يخفي حقل «Ferriman-Gallwey» بـ `is_active=false`، ويخلّي «الزواج السابق» إلزامي بـ `is_required`.

---

## 4. ملاءمة المحرك — الأنواع والشروط والحسابات

**الأنواع** (عدّ فعلي من الـ schema): chips 286 · seg 242 · text 145 · num 107 · bool 81 · date 56 · sel 53 · calc 42 · repeat 16 · area 8 · table 5 · media 5 · score 3 · popq 2 · figo 1.

| نوع GYN | في المحرك | ملاحظة |
|---|---|---|
| chips / seg / sel / bool / num / text | `multi_select` / `single_select` / `boolean` / `numeric` / `text` — **موجود** | seg و sel نفس النوع بـ `meta.render=segmented\|dropdown` |
| date · area · calc | **جديد:** `date`, `textarea`, `computed` | `computed` = `is_computed + computed_key` (موجودين) |
| repeat · table | `repeat_group` + `value_json` + `repeat_index` (D0) | `table` = repeat بـ `meta.render=grid` |
| score | **جديد** `score`: `meta.items` + البنود `value_json` + الإجمالي observation محسوب | §2 |
| media | **مش حقل** — كارت المرفقات مفلتر بـ `module_key` | P0 morph |
| popq | **جديد** ودجت بيكتب observation set من 9 قيم + `popq_stage` | G6 |
| figo | `single_select` بـ `meta.render=figo` | G2 |

**الفجوة الوحيدة في الأعمدة:** `meta json null` (w/cols/items/render/card) — مش في قائمة data-layers §3.1، يتضاف في E1.

**الـ `show_if`:** الاستخدام الفعلي: `k` 337 · `has` 206 · `any` 111 · `eq` 93 · `in` 39 · `cat` 20 · `mod` 18 (35 مرجع فريد عبر الموديولات) · `truthy` 14 · `all` 4 · `gt` 3. **القرار: grammar النسا هي grammar المنصة** (أشمل من `{field,op,value}` في data-layers): المرجع `k` (نفس الموديول) أو `mod:'m.k'` أو `patient.*` أو `encounter.*`؛ العمليات `eq\|in\|has\|nothas\|gt\|truthy`؛ التركيب `any\|all`؛ و`cat`. مفسّر واحد `ShowIfEvaluator` في PHP (التحقق + الـ summary) وTS (العرض) بنفس حالات الاختبار. الـ `mod:` بيتحل من إجابات نفس الزيارة + الحلقة + المريض حسب scope التعريف المرجعي.

**scope `record` (الامتداد الوحيد على القيم):** `scope_key` عمود عادي بيساوي `COALESCE(encounter_id,0)` من `saving()` (migration `2026_07_03_100001:17-24,43-47`)، والـ unique `(patient_id, history_question_id, scope_key)`. الإضافة: `record_type varchar(24) NOT NULL default ''` + `record_id` nullable؛ الـ hook يبقى `scope_key = record_id ?? encounter_id ?? 0`؛ الـ unique `(patient_id, history_question_id, record_type, scope_key, repeat_index)`. كده قيم العملية/الدورة/الحمل بتتخزن بنفس الجدول بلا عمود nullable في المفتاح.

**الحسابات (30 مفتاح في الـ schema):**
- **مرايا مش حسابات (7):** `from:imaging.pap/hpv/amh/fsh/afc_total`, `from:profile.rh`, `from:uroexam.pvr` → `computed_key=mirror` + `meta.ref`.
- **قالب ملخص مش حساب (1):** `udsReport` → `ClinicalSummaryService` نوع `uds`. **نص ثابت (1):** `muiNote` → `meta.hint`.
- **27 حساب حقيقي** في `ComputedRegistry` (PHP — موجود له `bmi`/`news2`) + مرآة TS: `age, bmi, bmiProfile, gpal, utvol, afc, rasrm, rotterdam, rmi, semenTotal, semenWho, fertRate, edd, ga, gaAt, gdm, vte, bishop, pph, iciq, diary, diaryFrom, npi, popq, promChange, fsfi, fsds, oabClass, ufSum`. البعض محتاج بيانات برّه الموديول: `age/bmi` (المريض)، `gpal` (obstetric rows + pregnancies)، `edd/ga/gaAt` (pregnancies)، `popq` (observation set)، `promChange` (series)، `vte` (BMI/السن/parity مشتقين). الـ BE هو الحاكم عند الحفظ (بيكتب القيمة `source=derived` للبحث والملخص)، والـ FE للعرض الحي.

**المفردات:** `V` (tube/hsgUt/tvsUt/endo/ovary/cx/pelvis/lap*…) و`PROC_LIB` (60 إجراء) و`CATS` → `clinic_history_options` بـ `lookup_key` + إضافة inline بتترسّخ + **favorites لكل دكتور** (جينا — `clinic_favorites` موجود). `PROC_LIB` بالذات → صفوف في `hospital_operations` (`specialty=gyn`) لأنه الكتالوج الواحد (§7.6).

**الشبكة القصوى للتحاليل** (GYN §7.5 + جينا): تعديل في الكومبوننت المشترك `app-clinic-lab-orders` (وضع `grid` بفئات + «حدد الفئة» + حارة favorites) — WP مشترك أول مستهلكه النسا، مش كود نسا.

---

## 5. الأمان «قبل التشغيل» — مراحل SEC

القائمة المرجعية = فجوات المنصة المسجّلة في `clinic-dynamic-fields.md:168` + GYN §9. التقسيم:

| المرحلة | المحتوى | platform / نسا |
|---|---|---|
| **SEC1 — الجلسات والهوية** (M) | `sanctum.expiration` (دلوقتي `null` — `config/sanctum.php:50`) + خروج تلقائي للـ FE بعد خمول (`auth.idle_minutes`, افتراضي 15 على الموبايل) · **شيل `?token=`** (`ResolveAuthToken.php:24`) — لازم **روابط موقّعة قصيرة العمر** للتحميل تتعمل في نفس المرحلة وإلا كل روابط التحميل تتكسر · إيقاف المستخدم = إلغاء كل الـ tokens فوراً + قفل جلسة جهاز بعينه · حذف المستخدمين soft · throttle عام على الـ API + على login (موجود بس على `app-info`) · MFA بـ TOTP (Authenticator) — إلزامي للأدوار اللي ليها `clinic.*` طبي، اختياري للباقي | platform |
| **SEC2 — الاطلاع والتصدير** (M) | جدول `access_audit` (`user_id, patient_id, action view\|download\|upload\|export\|share\|print, record morph, ip, at`) بيتكتب من middleware على endpoints الملف + listener على المرفقات والـ PDF · `LogsActivity` على موديلات Clinic (صفر دلوقتي) + ظهورها في شاشة الـ activity log · دور `admin` ما ياخدش `*.view` الطبي تلقائياً · DataScope على `PatientController@index` · صلاحيات منفصلة `clinic.media.upload/download/share` + `clinic.export.identified/deidentified` + export جداول الـ FE بصلاحية · **De-identified export** (اسم/تليفون/قومي/عنوان بتتشال، التواريخ → سنة) | platform |
| **SEC3 — التشفير والنسخ** (M) | `encrypted` casts على `national_id, phone, address` + **blind index** (hash) للبحث بالتليفون/القومي · الملاحظات الخاصة والـ `value_json` الحساسة مشفّرة · الـ backup يشمل الـ private disk + مشفّر + خارج السيرفر + **تجربة استرجاع** (RPO يوم / RTO 4 ساعات) · DPA | platform (ops) |
| **خاص بالنسا** (جوه G1/G7) | موديولات `priv:true` (sexhx/sexexam/sextx) بصلاحية `gyn.sexual.view` — الافتراضي الطبيبة المعالجة بس · الملاحظة الخاصة مستبعدة من أي summary/export إلا `include_private` بصلاحية · **Couple summary** نوع منفصل بلا خاص · نطاق «حالاته» للفريق من `clinic_referrals.member_user_id` + `clinical_episodes.team` | نسا |

**قرار مطلوب:** تشفير **الاسم** بيكسر البحث بالاسم (أهم بحث في الاستقبال). التوصية: الاسم يفضل plain، والتشفير على القومي/التليفون/العنوان بـ blind index.

**الترتيب للتشغيل الآمن:** SEC1 بدري (مستقلة عن الشغل الإكلينيكي، ممكن تتعمل جنب P0/D0) ← SEC2 بعد C1/G1 (عشان تغطي الـ endpoints الجديدة) ← SEC3 آخر حاجة قبل الـ go-live.

---

## 6. المراحل الموحّدة v3 (منصة + نسا + أمان)

**P** بلوكات · **D** بيانات · **S** شاشة · **E** محرك · **C** كيانات كور · **G** نسا · **SEC** أمان. ★ = لازمة لتشغيل عميل النسا (MVP: عيادة بوضع `procedures.mode=external`).

| # | المرحلة | التسليم | حجم | يعتمد على | المالك يختبر على /app |
|---|---|---|---|---|---|
| **P0** ★ | الأساس | (design.md P0) + المرفقات morph بـ `kind/external_url/is_private/module_key` | S–M | — | زيارة موقّعة ترفض روشتة من الـ API · شكل صيدلي inline |
| **SEC1** ★ | الجلسات والهوية | انتهاء tokens · خروج تلقائي · روابط موقّعة بدل `?token=` · إيقاف = إلغاء الجلسات · soft delete · throttle · MFA | M | — (موازية) | يوقف مستخدم وجلسته تقع فوراً · MFA على دكتور · تحميل مرفق بلينك موقّع |
| **D0** ★ | المحرك والعزل | (data-layers D0) + **تصحيح الباقة ما ترجّعش `is_active/is_required`** + `gyn_ob` case | M | P0 | تسجيل في عيادة عامة بلا حقول تغذية · حقل مخفي يفضل مخفي بعد إعادة تطبيق الباقة |
| **E1** ★ | محرك v2 | grammar `show_if` الكاملة (PHP+TS) · `module_key` · `repeat_group/value_json` · scope `record` · أنواع `date/textarea/computed/score/table/figo` + `meta` · `ComputedRegistry` + مرآة TS · lookups بإضافة inline + favorites لكل دكتور · `is_private` بصلاحية من الـ registry | M–L | D0 | حقل يفتح لما يختار chip · صف متكرر · محسوب بيتحدّث live وبيتخزن · favorites |
| **S1** ★ | هيكل الزيارة + الكروت | (visit-shell §11-1,2) بالحل **default ← company ← doctor(لو `allow_doctor_override`) ← context** + `{type}.feature.*` بتسقط كروت | M–L | P0, D0 | كشف عام من الهيكل · الأدمن يرتّب للعيادة · الدكتور ما يقدرش يعدّل إلا لو الإعداد مفتوح |
| **P1** ★ | روشتة v2 | (design.md P1) + `subject=spouse` + PDF | M | P0 | روشتة بجملة جاهزة · روشتة للزوج |
| **D1** ★ | مخزن القياسات | (data-layers D1) + قياسات النسا (`fundal_height, fetal_hr`) | M–L | D0 | طول prefill · trend |
| **D2** ★ | الحقائق + الهيدر | (data-layers D2) + أكواد تنبيهات النسا في الكتالوج + `clinical_notes.is_private/module_key/record` | L (3 WPs) | D1, P1 | «بياخد سيولة» أحمر في كل عيادة · ملاحظة خاصة ما تظهرش لغير صاحبها |
| **C1** ★ | الكيانات الإكلينيكية المشتركة | `clinical_episodes` + `encounters.episode_id` · `clinical_procedures` + `hospital_operations.clinical_template` + `clinic.procedures.mode` · `follow_up_tasks` + قواعد الـ registry · تمديد `ClinicReferral` (kind/team/status/member/plan) · `ClinicalSummaryService` + `doc_type=summary` · `PatientRecordService::extend` (يتقدّم من P4) · كارت Timeline | M–L | E1, D2 | يفتح حلقة · يسجّل عملية برّه (external) · مهمة متابعة بتتولّد · إحالة لفريق بحالة · ملخص يتطبع |
| **G1** ★ | نسا — الملف والأساس | باقة `gyn_ob` (profile/الزوج، alerts، history، menstrual، `obstetric_history_rows` + G/P/A/L في الهيدر، امتدادات الشكوى/الفحص/الفحوصات/التشخيص، التصنيفات، الفريق) · layout افتراضي · `gyn.feature.*` · صلاحيات وأدوار · خطوة intake نسا · summary `clinic` · **شبكة التحاليل القصوى** (مشترك) | M–L | C1, S1 | مريضة جديدة: الاستقبال يملا الزوج، التمريض التاريخ، الدكتورة تلاقي G/P/A/L في الهيدر · اختيار «AUB» يفتح كارته · مركز بيطفّي urogyn فالـ chips تختفي |
| **G2** ★ | نسا — GYN core | fibroid (FIGO)، aub، endometriosis، adenomyosis، polyp، pcos، pelvic_pain، adnexal (RMI)، onc + MDT، cervical، vulval · قوالب الـ summary بتاعتهم | M | G1 | Myoma 1..n بـ FIGO وملخص مجمّع · RMI ≥200 يقترح تحويل أورام |
| **SEC2** ★ | الاطلاع والتصدير | `access_audit` · `LogsActivity` على Clinic · admin بلا طبي · DataScope على المرضى · صلاحيات media/export · de-identified export | M | C1, G1 | مين فتح ملف المريضة ومين حمّل · export بلا هوية |
| **SEC3** ★ | التشفير والنسخ | casts مشفّرة + blind index · backup بالميديا مشفّر + استرجاع مجرّب | M | SEC2 | بحث بالتليفون شغال رغم التشفير · استرجاع نسخة على بيئة تجريبية |
| — | **▲ نقطة تشغيل عميل النسا** (مرهونة بقرار الدكتورة Q7: لو «التوليد الأول» G5 تتقدّم مكان G3) | | | | |
| **G3** | نسا — الخصوبة | infertility، semen (WHO 2021)، prev_art، `treatment_cycles` + `cycle_monitoring` (OI/IUI/IVF/FET كروت)، diag_lap · الزوج كمريض مرتبط | M–L | G2 | دورة OI كارت بمتابعاتها · تفسير السائل المنوي · IVF بالنتيجة |
| **P5** | المستندات | (design.md P5) + `doc_type=uds_report\|summary` | S–M | P0 | إجازة مرضية برقم |
| **G4** | نسا — العمليات | قوالب الإجراءات (`gyn_tlh, gyn_mus, gyn_cs, vnotes, burch…`) على `clinical_procedures` · findings/Clavien/عيّنات/ميديا · discharge document + أدوية جاهزة · follow-up تلقائي · operative summary · وضع center/hospital (ربط `hospital_surgeries`) | M–L | C1, P5 | تقرير عملية من القالب · المتابعات 1w/1m/3m/6m اتولّدت · نفس الشاشة لما الوضع يبقى مركز |
| **D3** | أول زيارة | (data-layers D3) | M | D2 | مريضة جديدة تملا الخطوة النسائية بس |
| **G5** | نسا — التوليد | `pregnancies` (+ `pregnant` derived) · flowsheet من observations · highrisk · VTE (score + تنبيه) · labour/vd/cs/postpartum (scope record) · تقرير المواليد المتوقعة · delivery/discharge summary | L | G1, D1 | EDD/GA في الهيدر · زيارة متابعة تظهر في الـ flowsheet · VTE ≥4 ينبّه |
| **S2** | التخصصات ككروت | التغذية والأسنان كافتراضيات زي ما هم | M–L | S1 | شاشة التغذية والأسنان شبه النهارده |
| **P2** | أدوية الإقامة | (design.md P2) | M–L | P1 | MAR من الروشتة |
| **S3** | سياق الإقامة | (visit-shell) | M | P2, S1 | محطات التمريض من الهيكل |
| **P3** | منفّذ الطلبات + الأشعة | (design.md P3) | L (4 WPs) | P0 | أشعة طلب ← تقرير ← جاهز |
| **G6** | نسا — Urogyn | luts، sui، oab + bladder diary، uroexam، POP-Q (observation set widget)، uds (document)، voiding، fistula، meshc، urofu (PROMs baseline vs follow-up) | L | G2, D1, P5 | POP-Q stage تلقائي ومقارنة قبل/بعد · تقرير UDS يتعدّل ويتوقّع |
| **P4** | النتائج والسجل | نتائج بلا زيارة · تاريخ التحاليل · تقرير أشعة PDF · `sbscs_code` | M | P3 | تحليل walk-in في الكشف |
| **G7** | نسا — Sexual health + بحث | sexhx/sexexam/sextx (خاص)، FSFI/FSDS-R، couple summary، export بحثي بلا هوية، مواد تعليمية | M | G2, SEC2 | الموديول ما يظهرش لغير الطبيبة · couple summary بلا الخاص |
| **D4** | طي التخصصات | (data-layers D4) | M | D1 | جولة تمريض في الـ trend |
| **P6** | صرف الصيدلية | (design.md P6) | M | P3, P1 | روشتة ← POS ← «اتصرفت» |

**الإجمالي:** الـ MVP (13 مرحلة ★) ≈ 3–3.5 شهور متصلة؛ الكل ≈ 6–7 شهور. SEC1 ممكن تتعمل بالتوازي مع P0/D0 لأنها ما بتلمسش ملفات العيادة.

---

## 7. القرارات للمالك — القائمة المدمجة

✅ = اتقرر · ⏳ = مستني

| # | القرار | التوصية | الحالة |
|---|---|---|---|
| 1 | مكان الكور: Clinic + `app/Clinical/` | Clinic | ⏳ |
| 2 | السياق = `encounters.kind` مش polymorphic | أيوه | ⏳ |
| 3 | المستشفى سياق مش تخصص | أيوه | ⏳ |
| 4 | مخزنين (حقائق + قياسات) | اتنين | ⏳ |
| 5 | المزمن/الحساسية/الأدوية الخارجية جداول منظّمة + chips | أيوه | ⏳ |
| 6 | الحمل حقل زيارة مشترك prefill 30 يوم، و`pregnancies` تملاه derived لما تيجي | أيوه | ⏳ |
| 7 | الحد الأدنى للـ intake = حساسية + مزمن + أدوية | أيوه | ⏳ |
| 8 | الشاشة الجديدة جنب القديمة خلف إعداد | أيوه | ⏳ |
| 8ب | تشخيص التغذية مع التأمين: تحذير مش منع | تحذير | ⏳ (معلّق) |
| 8ج | **التحكم في الشكل لكل عميل أولاً**؛ الدكتور بس لو `clinic.layout.allow_doctor_override` (افتراضي مطفي) | أيوه | ✅ (تعليمات المالك) |
| 9 | أدوية المستشفى على الروشتة (P2) | أيوه | ⏳ |
| 10 | الطباعة PDF من السيرفر | أيوه | ⏳ |
| 11 | أشعة الأسنان صور على السنة | أيوه | ⏳ |
| 12 | الصرف من POS بعد P3 | أيوه | ⏳ |
| 13 | ننفذ فين | moonui3، وmoonui متوقف | ✅ |
| 14 | تعديلات التغذية (القياسات/التشخيص/الحساسية الغذائية) **تتعمل هنا** بما إن moonui واقف — بموافقة المالك قبل D1. **ده بيغيّر** `design.md §5` و`design-data-layers.md §7` اللي كانوا بيقولوا «بالاتفاق مش بتعديل كودهم من هنا» | أيوه | ⏳ |
| 15 | التغذية والأسنان: الشاشات الحالية هي الافتراضي | أيوه | ✅ |
| 16 | **النسا = `Modules/Gyn` + `features/gyn`**، والكيانات المشتركة في Clinic (C1) | أيوه | ⏳ |
| 17 | **`gyn_episodes` → `clinical_episodes` عام** | أيوه | ⏳ |
| 18 | **زيارة المتابعة الحملية = encounter + observations، مفيش `antenatal_visits`** | أيوه | ⏳ |
| 19 | **POP-Q وPROMs = observations؛ UDS = إجابات + مستند** — بلا جداول | أيوه | ⏳ |
| 20 | **الإحالة للفريق = تمديد `ClinicReferral`** مش جدول جديد | أيوه | ⏳ |
| 21 | **الزوج كمريض:** تحاليل السائل المنوي محتاجة صف `lab_patients` للزوج مربوط بـ `spouse_patient_id`، والطلب بيتعمل من زيارتها (`subject=spouse` على الروشتة بس مش كفاية للـ LIS). **بيت واحد لبيانات الزوج:** في الـ MVP إجابات L2 (`gyn_spouse_*`) هي السجل؛ من G3 صف `lab_patients` هو المصدر وإجابات الزوج تبقى مرايا (`computed_key=mirror`) — نفس آلية `from:x.y` | أيوه | ⏳ |
| 22 | **الاسم ما يتشفّرش** (البحث)؛ القومي/التليفون/العنوان بـ blind index | أيوه | ⏳ |
| 23 | **MFA إلزامي** للأدوار الطبية، اختياري للباقي | أيوه | ⏳ |
| 24 | Sexual module: الافتراضي الطبيبة المعالجة بس، والـ couple summary نوع منفصل | أيوه | ⏳ |
| 25 | **الأمان قبل تشغيل النسا:** SEC1 + SEC2 + SEC3 ضمن الـ ★ | أيوه | ⏳ |
| G1 | الاستضافة: سيرفر العيادة ولا سيرفر مخصص عندنا + أسماء اللي ليهم دخول | سيرفر العيادة | ⏳ (الدكتورة) |
| G2 | الأدوار الفعلية ومين له Export/Download | جدول §9 كبداية | ⏳ (الدكتورة) |
| G3 | التصنيفات المعتمدة (rASRM/#Enzian/EFI · IOTA/O-RADS · Robson · Clavien) | كلها متاحة، تتفعّل بالإعداد | ⏳ (الدكتورة) |
| G4 | جداول المتابعة الافتراضية (عمليات 1w/1m/3m/6m · urogyn 6w/3/6/12m · حمل بالخطورة) | زي ما هي كـ `followup_rules` | ⏳ (الدكتورة) |
| G5 | الاستبيانات المستخدمة فعلاً (ICIQ/UDI-6/PGI-I/OAB-q/FSFI/FSDS-R) | تتبذر كلها، تتطفّي بـ `is_active` | ⏳ (الدكتورة) |
| G6 | لغة الـ summary والطباعة | English طبي بعناوين عربية + هيدر `clinic.print.*` | ⏳ (الدكتورة) |
| G7 | أولوية المراحل بعد G2: الخصوبة ← العمليات ← التوليد ← Urogyn ← Sexual، ولا التوليد الأول؟ | زي الترتيب في §6 (G5 تتقدّم لو التوليد أهم) | ⏳ (الدكتورة) |
| G8 | الموبايل: متصفح | متصفح دلوقتي | ⏳ (الدكتورة) |
| G9 | `clinic.procedures.mode` للعيادة دلوقتي: external ولا center؟ | external في الـ MVP (G4 بيضيف center) | ⏳ (الدكتورة) |

القرارات التفصيلية التانية موجودة في كل تصميم (13 للبلوكات، 13 للبيانات).
