# م8 — الكاشير والفلوس — RESUME (مكتملة، ⏳ نشر WP7) 2026-07-08

> نقطة الرجوع الشاملة لـم8. العقد + تعديلات architect (R1-R5) في `LEDGER.md`، الخريطة `SCOUT.md`. المرجع: `topics/clinic-tightening-plan.md` ملحق أ (تدقيق C1-M6). ⚠️ **أخطر مرحلة ماليًا** — Fable معطّلة → architect راجع العقد (اصطاد خطأ WritePatientLedgerEntries الحرج) + **Codex مزدوج على WP1/WP2**.

## الحالة: ✅ 7/7 مكتملة، منشورة /app `main-N3TBWD76.js` + hazemdev (BE `2872d255d`/FE `7025172`)، بانتظار تست المالك

**السويت الكامل: 676 نجاح / 1 فشل = ClinicRoomTest HRM معطوب مسبقًا (صفر regression من م8؛ ملفات م8 = 23 نجاح).** ⛔ المالك: merge→main + ship + تست.

الفكرة الحاكمة (المالك): **درج صادق 100% وكل بند له طريق.**

## الأعمال + الـSHAs
| WP | المحتوى | SHA |
|----|---------|-----|
| WP1 | **performed lifecycle + net + close/cancel [CRITICAL]:** collect يقبل ordered+performed (٣ بوابات + repayment classifier + **`WritePatientLedgerEntries` whereIn = حارس الاعتراف-مرة**) · `refunded_total`/`net_collected` accessors (paid_total gross) · close عند fully-billed+net-outstanding≤0 · cancel عند all-cancelled (draft فاضي يفضل open). ثغرتا gross-vs-net مُصلحتان (repayment `$outstanding` + AppointmentResource). 7 Pest (ledger nets 0.000، collect تاني مرفوض، net-vs-gross) + 69 regression. | BE `6a2cee0c8` |
| WP2 | **money-truth surface [CRITICAL]:** `refunded_total`+`net` على ServiceOrderResource (paid_total gross) + dashboard `resolveCollected`/`revenueLastDays` يخصموا credit-notes posted بنفس grain التاريخ+scope (بلا double-net). 4 Pest + 33 regression. | BE `a049845b8` |
| WP3 | **Cashier queue endpoint:** `GET /clinic/cashier/queue` (send_to_cashier + owed: collectable-line أو net-outstanding>0، يستثني closed/net-zero) + CashierQueueResource. 9 Pest + 45 regression. | BE `fbf558276` |
| WP4 | **Cashier queue screen FE:** شاشة `/clinic/cashier-queue` (list من WP3، waited حي، Open→collect). خدمة جديدة page-walked. | FE `5390b41` (مع WP5) |
| WP5 | **money-truth display + performed-selectable + blind-count FE:** performed قابل للتحديد (orderedLines/isLineSelectable) · «محصّل−مسترد=صافي» (cashier/rail، fullyPaid صادق، closed=settled) · close dialog blind counted_cash + ملخّص over/short من BE. | FE `5390b41` |
| WP6 | **Receipt print FE:** «Collect & print» يطبع إيصال FE-HTML حقيقي (HTML-escaped، ليترهيد+بنود+مدفوع/وسيلة/باقٍ/صافي)، قبل reload. reprint مؤجّل (يحتاج receipt-by-id). | FE `7025172` |
| WP7 | **Ship:** CHANGELOG ✅ + KB ✅ + نشر /app ⏳ + push ⏳ + السويت الكامل ⏳. | — |

## تعديلات architect (بديل Fable) — كلها مُطبَّقة
**R1 [CRITICAL]:** الـflip (ordered→billed) + Charge في **`WritePatientLedgerEntries`** مش PostReceiptJournalEntry — الـflip = حارس الاعتراف-مرة؛ بدونه performed محصّل = ليدجر سالب + double-collection. **R2:** ٣ بوابات + repayment classifier (وإلا performed يتصنّف repayment→خسارة صامتة). **R3:** ابنِ net قبل close؛ close على net-outstanding مش gross. **R4:** «collectable ⇔ ordered|performed» عقد مشترك ٤ مواقع. **R5:** dashboard net بالتاريخ، بلا double-net، paid_total gross.

## مراجعات Codex (bugs مُصلَحة)
- WP1: أكّد سلامة الاعتراف-مرة/double-collect/cancel؛ لقى ثغرتَي **gross-vs-net** (repayment `$outstanding` سطر 88 + AppointmentResource payment_status) → مُصلحتان بـ`net_collected`. · WP2/WP3/WP5: صفر (approve).

## ملاحظة سلوكية مهمة
**الأوردر المدفوع بالكامل بقى `closed` بدل `billed`** (رياضيًا: fully-billed + net-outstanding≤0). فحوصات حالة **السطر** (refund/void/cancel على سطر billed) مااتأثرتش. FE بيعامل closed كـsettled/success (WP5). اختبارات موجودة اتحدّثت للـrelabel.

## المؤجّلات (م8)
- Z-report كامل بالفئات → م11. التأمين (H1-H4/M5/M6) → م9. رصيد المريض الدائن/over-payment → لاحقًا. M2 pending rescue → moot. **L1 cross-session refund Z-attribution** → ثغرة معروفة مؤجّلة. reprint إيصال (يحتاج receipt-by-id endpoint) → follow-up. طباعة BE-PDF → لاحقًا.

## التالي
م9 (التأمين) — **يشمل تنظيف عنقود التأمين H1-H4/M5/M6** من تدقيق الفلوس (double-recognition، adjudicated-not-submitted، manual adjudication، caps، H4 commissions). 3 مراحل متبقية (م9–م11). النقطة الشاملة: `plans/CLINIC-MODULE-FREEZE-RESUME.md`.
