# Client mtw39 requests — RESUME

**Status (2026-10-24):** all 22 requests implemented, Fable-reviewed (FIN + UI), fixes applied, committed on `hazemdev3` (pushed + merged to main via /fullpush), deployed to moonui3 `/app` (main-CNOSVESU.js, I18N `20261024mtw4`) — **merged to main 2026-10-24** (BE d76fd096b, FE c0319092). **Fable FINAL: APPROVE** (no P0/P1) — `design/FABLE-FINAL.md`. Source: WhatsApp screenshots `design/client-msg-1..5.png`; decisions in `LEDGER.md`.

## Commits
- **BE:** fdfa9566a (booking receipt/gate/free visits) · f3ac96ee6 (nutrition station) · 7a59f395b (commission split) · e14145b26 (POS blind close) · 56955a7c1 (purchases) · 94ee90573 (GL review fixes) · 03e92fd98 (transfers + inventory reports) · a91f63fd3 (shared registries) · c988b878d (loyalty rewards) · c648d2588 (loyalty fix) · 1d7dbfb19 (Fable FIN fixes) · 2a7ec4a5d (CHANGELOG) · e7b870d60 (visit-shell Fable FINAL NEW-1).
- **FE:** 61b71507 · 8d09bf01 · c2719fbb · 3d6a63cc · 7dba7139 · 323988df · 014aa5cc · 6a6b46e6 · 079b3bfa (new tab) · fd3d451e (loyalty) · ae6a7aa3 + ba9ce1d2 + 381a8f57 (fixes) + I18N bumps.

## Request → where it is
| # | Request | Delivered |
|---|---|---|
| 1 | Booking receipt with add-visit | 80mm receipt on every save (barcode, appointment, paid/remaining, weights for nutrition, phones + instructions editable in place «✎ نص الإيصال»), reprint in bookings list |
| 2 | No consult without payment unless manager | `clinic.encounter.require_payment_before_start` (ON on dev co1) + «موافقة على البدء بدون دفع» (perm `clinic.encounters.approve_unpaid_start`) |
| 3 | Doctor N free visits/month | doctor field «كشوفات مجانية/شهر» + «كشف مجاني» toggle on booking |
| 4 | Doctor/performer % or fixed | revenue split role «المنفّذ», quick editor, «مستحقات الأطباء», optional GL (`clinic.split.post_to_gl`, off) |
| 5 | Separate measurements page | `/clinic/stations/measurements` «القياسات» (nutrition.visit.measure) |
| 6 | Ramadan print | fasting shape: فطار→سحور, غداء→إفطار, no dinner |
| 7 | Weights notes | notes visible + measurement notes column |
| 8 | Loyalty redeem for a service | «نقاط الاستبدال» per service, «استبدال بالنقاط» at cashier + booking; dev co1 switched to unified loyalty |
| 9 | Packages → deferred revenue | was built; turned ON on dev co1 (per_session, acct 2105) |
| 10 | Reorder on dashboard | «المخازن» dashboard card |
| 11 | Demand forecast | «توقع الطلب» tab + draft PR |
| 12 | Look up other warehouses | perm `inventory.stock.lookup_all`, dialog from balances / pickers / POS / Ctrl+K |
| 13 | Transfer request + manager routes | «طلبات التحويل» |
| 14 | Intermediate (transit) warehouse | «بضاعة بالطريق» (setting use_transit, default on; production requisitions excluded) |
| 15 | Sent/received differences | «فروق التحويلات» resolve in place |
| 16 | Expiring products report | on-hand lots, period chips, print/Excel |
| 17 | Perpetual inventory entries review | `reports/inventory-gl-review.md`, 6 P1 fixed; count auto-approve setting; dashboard GL alert |
| 18 | Attach image to PR/PO | attachments on PR/PO/bill (camera) |
| 19 | Supplier advance | «دفعة مقدمة لمورد» + «تسوية دفعة مقدمة» on bill |
| 20 | Open in new tab | real links in menus + document numbers (22 lists) |
| 21–22 | Shift-account receipt + blind close | POS blind close (default ON), handover JE to main treasury, «حساب الوردية» 80mm; clinic Z print aligned |

## Dev config done
co1: package per_session + acct 40 (2105); payment gate ON; over/short acct 116 (5217); POS drawer leaf acct 120 (110102) as `pos.cash_receiving_account_id`; transit WH id 2 + acct 119 (1114); loyalty unified (pv 0.1, 1 pt/10 EGP, expense acct 121 5304); reward 500 pts on services 14, 42.

## Not verified (owner click-through)
Nothing was clicked in a browser. Prints on a real 80mm printer. POS close as a **cashier-role** user (owner/admin/manager see expected = not blind) — dev has no POS terminal. GL paths with `inventory.post_to_gl` / `clinic.split.post_to_gl` / supplier advance account ON (all off on dev → SQLite tests only). Transfer request → route → ship → short receive → resolve on real stock (dev has no tracked stock). Loyalty redeem through the real cashier. No full suite run (targeted files only — all green; `MaterialRequisitionFlowTest` 8 failures: CreateMaterialRequisition + the test are untouched this wave (`git diff c5ed456c9 HEAD` empty) — stale test vs owner's 2026-10-03 release rule).

## Decisions to confirm with owner
POS blind close ON by default for all installs · **transit warehouse ON for every existing company** (`inventory.transfers.use_transit` default true; migration 400006 creates the transit warehouse + account) · **booking receipt prints on every save, paid or not** (`clinic.booking.print_receipt` default on) · collection receipt now 80mm by default · points-paid lines earn no doctor share (setting) · package sessions in on_sale mode now earn commission (visible in dues report).

## Screens
New screens are granted via the screen bridge `2026_11_25_900002` (BE 4c8a52665): «القياسات» → receptionist/nurse/admin, «طلبات التحويل» → storekeeper/manager/admin (verified on dev).

## Leftovers / deferrals
LIS cashier blind close · POS cashier role still has pos.reports.view (sees takings) · per-warehouse reorder thresholds · forecast seasonality / unit conversion of on-order · statements' navigateToSource not linkable · LOY P2s (follow-up variant reward fallback, cancel-booking prompt to void points receipt, reward on discounted lines rule) · UI P2-18 (gate 422 has no order id → cashier deep link) · Fable FINAL P2-6: POS overage handover when the over/short account is unset (variance not posted) over-credits the drawer by the variance — set the account (auto-provisioned) · other FINAL P2s in design/FABLE-FINAL.md.
