# م10 (الطباعة/الخروج/المتابعة) — عقد Fable + ليدجر (2026-07-09)

> عقد Fable المُلزِم. السكاوت في نفس المجلد (تحت). **مرحلة غير مالية بالكامل** — كل WP standard tier. البوابتان الصعبتان: WP2 diff بصري للطباعة الموجودة، WP7 regression لـFollowupPricingTest.

## قرارات Fable (مُلزِمة)
1. **نحتفظ بطباعة الكلينك hand-rolled** + `ClinicPrintShellService` رفيع يقرأ `clinic.print.*` (الشيرد PrintService invoice-shaped، الهجرة تخاطر بطباعة م7/م8 الشغّالة).
2. **FE-rendered** (HTML من JSON) لكل طباعة م10.
3. **الخروج = ديالوج PrimeNG بعد التوقيع** على شاشة الكشف — بلا route/شاشة جديدة.
4. **MUST:** ملخص زيارة · استهلاك إعدادات الطباعة (=الروشتة المحسّنة) · توقيع per-doctor · تحويل مبسّط مُخزَّن · CTA متابعة عند الخروج. **مؤجّل:** مكتبة تعليمات المريض.
5. **متابعة عند الخروج = زر «احجز متابعة» deep-link لـ`booking/create-visit` prefilled بـpatientId+doctorId + chip صلاحية.** **صفر تغيير في FollowupResolver/AddServiceOrderLine/التسعير.**
- header balance = **جاهز** (ClinicPatientHeaderComponent) — WP7 يتحقّق فقط.

## 📊 ليدجر
| WP | المحتوى | يعتمد | مراجعة | الحالة |
|----|---------|-------|--------|--------|
| WP1 | ✅ `c94c75c6a` **BE توقيع per-doctor:** migration `signature_path` على `lab_doctors` + LabDoctor appends `signature_url` (نمط Branch) + `POST/DELETE doctors/{doctor}/images/signature` (نمط BranchController) + expose في LabDoctorResource + doctor داخل EncounterResource (يحيي الـdead read في lis-print-report). Pest. | — | native+Codex (schema) | ⬜ |
| WP2 | ✅ `3066744` **FE ClinicPrintShellService:** يقرأ 5 مفاتيح `clinic.print.*` عبر setting.service · `wrap(title,body,shell)` (letterhead+logo/header/footer/paper/RTL) + `openAndPrint`. Refactor letterhead/footer/paper فقط في ClinicOrderPrintService+ClinicReceiptPrintService+ClinicPrescriptionService.print (body يفضل مكافئ بصريًا). show_diagnosis معروض للمستهلكين. | — | standard + **diff بصري** | ⬜ |
| WP3 | ✅ `78c3354` **FE رفع توقيع** في فورم دكتور clinic/doctors (picker+preview+remove، نمط رفع صورة الفرع). | WP1 | standard | ⬜ |
| WP4 | ✅ `87173e9` **FE ملخص الزيارة:** clinic-visit-summary-print.service `print(encounterId)` — fetch EncounterResource + render عبر shell (ديموغرافيا+تاريخ+دكتور+توقيع · شكاوى · تشخيصات[gated show_diagnosis] · vitals · روشتة · lab/rad أسماء · signed-at). بلا BE/persistence. | WP1,WP2 | standard | ⬜ |
| WP5 | ✅ `b633337ac` **BE تحويل مبسّط:** migration `clinic_referrals` (encounter_id/patient_id/doctor_id/referred_to_name/specialty?/reason/notes?/created_by) + Model + Action CreateReferral (encounter Signed/Done + company) + `POST/GET encounters/{encounter}/referrals` (perms `clinic.referrals.create|view`) + ClinicReferralResource. Pest. | — | native+Codex (schema) | ⬜ |
| WP6 | ✅ `026784e` **FE ديالوج تحويل + طباعة:** clinic-referral.service + ReferralDialogComponent (to-name/specialty/reason/notes → save → render خطاب عبر shell، diagnosis gated) + قائمة تحويلات الزيارة. | WP2,WP5 | standard | ⬜ |
| WP7 | ✅ `42d0d8f` **FE ديالوج الخروج + CTA متابعة:** بعد doSign() افتح Discharge dialog (وزر Discharge وقت Signed): launcher طباعة (summary/rx/lab/rad/referral، تعطيل لو مفيش أوردر) + block متابعة (chip صلاحية لو followup_window_days>0 + زر Book follow-up → create-visit prefilled) + sendToCashier موجود. create-visit يقبل patientId+doctorId queryParams (يوسّع قراءة الـorder snapshot). **صفر تغيير تسعير.** | WP4,WP6 | standard + **FollowupPricingTest regression** | ⬜ |
| WP8 | **بوابة الريليس:** سويت BE خضراء (تجاهل pre-existing) · ng build · تست المالك · CHANGELOG ثنائي م10 · migrations WP1+WP5 على dev · KB. | الكل | — | ⬜ |

**DAG:** WP1 ∥ WP2 ∥ WP5 → (WP1→WP3, WP1+WP2→WP4, WP2+WP5→WP6) → WP7 → WP8.

## مؤجّل رسميًا خارج م10
مكتبة تعليمات المريض · هجرة لـshared PrintService · route/شاشة خروج مخصّصة + worklist استقبال · إدارة تحويلات (list/edit/cancel) · إضافات روشتة (QR/تفاعلات/BE-PDF) · أي تغيير في منطق تسعير المتابعة.

## ✅ م10 مكتملة (2026-07-09)
كل الـ7 WP + إصلاحات Fable whole-review. **مراجعة Fable اصطادت بلوكرين حقيقيين** (أخطاء ربط عبر-WP): (1) خطاب التحويل يطبع دكتور «—» بلا توقيع (`referralDoctor` بيقرا name_ar الغلط + signature_url:null — الـEncounterResource بيرجّع {id,name,signature_url}؛ صلّحت الـinterface + الاستهلاك، BE `e57fb02`) (2) `clinic.print.*`+`followup_window_days` مش في PUBLIC_READ_KEYS → إعدادات ماتوصلش لأدوار الطبيب/الكاشير (show_diagnosis=false يتجاهل=تسريب، CTA ميت؛ BE `e24c8b0f4`) + should: patient fallback لـencounter.patient + OR-perm للتوقيع. **مدفوع:** BE `306e181d0`+FE `e57fb02`. **منشور /app `main-I76B3RBZ.js`.** سويت الكلينك 720/1 (HRM pre-existing). صلاحيات referrals موجودة على dev (منح الأدوار via RolePermissionSeeder وقت العميل — ثغرة [C]).
⚠️ **درس:** مراجعة Fable الكاملة للمرحلة (مش per-WP بس) ضرورية — أخطاء الربط عبر-WP (interface mismatch + PUBLIC_READ_KEYS) ماكانتش تتكشف بمراجعة WP منفصلة. تطابق إصرار المالك على Fable المحوري.
