# Branch pricing + Packages — plan (owner request 2026-09-28, direct, not portal)

## Decisions (owner-confirmed)
1. Services stay company-wide (NO branch_id on clinic_services). Branch price has TOP priority.
2. Package = charged like any service (partial pay / debt via existing flow).
3. Package usage scope: setting default = purchase branch; overridable on package service; final at sale (branch / all).

## Phase A — branch pricing (SHIP FIRST, owner tests)
BE
- [ ] migration clinic_service_prices: branch_id (nullable FK) + is_available (bool, default true); unique incl branch_id (copy grade_id migration dance)
- [ ] ServicePrice fillable/cast/branch()
- [ ] PricingResolver::resolveWithAxis(..., ?int $branchId=null): availability gate FIRST (unavailable beats doctor row) → branch → doctor → grade → department → base
- [ ] AddServiceOrderLine: pass branchId; unavailable → ValidationException (bilingual)
- [ ] ClinicServicePriceController::upsert: scope=branch + branch_id(required_if) + is_available + remove flag (same-as-base = NO row)
- [ ] services.index: opt-in `available_in_branch` param; REMOVE DataScope::apply (clinic_services has no branch_id col)
- [ ] display price sites (resolveNatural/resolveWithAxis callers) pass DataScope::requestedBranchId
- [ ] Pest tests; local-deploy.sh; chown
FE
- [ ] branch price editor (find existing prices dialog first)
- [ ] booking picker passes available_in_branch
- [ ] i18n + I18N_VERSION; build+deploy /app
- [ ] CHANGELOG bullet

## Phase B — packages (AFTER owner OKs A)
- clinic_services: is_package, package_size, package_scope(branch|all|null); service_order_lines.package_grant_id; clinic_package_grants
- setting clinic.package_scope_default
- AddServiceOrderLine explicit package_action sell|consume; sale = session 1 (used=1) [flag to owner]
- skip FollowupResolver for packages; cancel/refund restore balance
- ASK owner: consumption lines = 0 revenue → doctor split for sessions 2..N is zero (all on sale line). Intended or prorate?

## Resume point
Phase B built + migrated + FE deployed 2026-09-28 (PackageTest 12/12). Owner answers: sale=session1 (default), doctor split prorated across sessions via split_base. Full Clinic suite run pending → check failures. NOT committed.

Phase A DONE + deployed 2026-09-28 (BE migrated on moonui3_dev_be, 62+64 tests green, /app deployed, CHANGELOG + KB updated). NOT committed/pushed.
Next: wait for owner test of A, then answer B questions (sale=session1? revenue split for sessions 2..N) → build Phase B.
