Live on prod 2026-05-20. Second piece of the H5 Reports arc — Odoo-pivot-modeled
Order Analysis tree at /cafe/reports/order-analysis. Hierarchy
Total → Month → Store → Session with expandable rows; columns
Order count / Product quantity / Total price. Filter bar: month picker (prev/next
+ popover w/ native type="month" input) + multi-select stores.
Validated on get-coffee (Pro, multi-month real data) + lumiere-coffee (Starter).
nix-cafe (fca0065) — clean ship, no follow-up fix
needed (R1's usePathname() lesson applied from day 1). No backend
migration, no new deps. usePathname() wired correctly so all
nav assertions passed on the first prod run.
/cafe/reports/cafe/reports/order-analysis (no 5xx)?month=2026-04?month=2026-03aggregateOrderAnalysis against prod DBsum(stores) == total, sum(sessions) == store| test-phase1-prod.mjs | 11/11 |
| test-phase2-sso-outdoor-prod.mjs | 6/6 |
| test-phase2-cafe-multishop-prod.mjs | 6/6 |
| test-m1-prod.mjs | 10/10 |
| test-r7-prod.mjs | 14/14 |
| test-r8-prod.mjs | 4/4 |



?month=2026-04; tree reflows
?month=2026-03; tree reflows

Session numbering — current label is
posConfigName • opened_at. Odoo's pivot shows
00080-style 5-digit session numbers; that identifier doesn't exist
directly in cafe.* schema. Can derive a per-shop-per-day sequence if Narong wants
the Odoo shape exactly.
Multi-month view — current filter is single-month per spec. Multi-month would flatten "Month" into expandable rows.
PDF export — stub button only.
Cross-month sessions — rare edge case where a session opened outside the filter month but has orders inside it. Renders under "—" store label.
Both pieces of the H5 Reports section from the v0.2 Notion doc (restructured 2026-05-18) now live on prod:
H5.12 (Odoo mapping interface) still parked in "Future Release" — separate scoping needed.