Pre-cutover blocker: when bypass_odoo_pos=true, the legacy R5-era pos.order push queues MUST be gated off for that tenant, or every order double-books (once via pos.order, once via the close-move). 3 legacy DAOs gain an innerJoin against cafe.tenant_config with bypass_odoo_pos=false. Product/customer push queues stay open — Odoo still needs the product catalog + res.partner records for accounting reporting; just no pos.order writes. With this in place, the R11 arc is formally complete on the code side — only the operational cutover (SQL flip + Narong's shift close + 1-week accountant soak) remains.
4dab227 (cafe) — 3 DAOs gated: listPendingCreates, listPendingRefunds, listPendingPartialRefunds. 29 insertions across 2 files. No migration.bypass_odoo_pos=false → behavior unchanged for them. Cutover-ready.bypass_odoo_pos=true, which doesn't happen until the actual cutover (operator-driven SQL flip). pos.order push path runs unchanged for all 3 tenants since bypass=false everywhere on prod. Regression-only sweep confirms the DAO change didn't break the legacy push for non-bypass tenants.
| Suite | Result | Notes |
|---|---|---|
| test-launchpad-fix-prod.mjs | 8/8 | Outdoor SSO bridge fix sanity |
| test-r7-prod.mjs | 14/14 | Dashboard + manager-live |
| test-r8-prod.mjs | 4/4 | Auth/security trio |
| test-cash-carryover-prod.mjs | 9/9 | cafe.sessions read path |
| test-phase2-cafe-multishop-prod.mjs | 6/6 | Cafe multi-shop |
✅ R11.1 — Recon spike (read-only Odoo dump; corrected scoping memo) ✅ R11.2 — Schema (bypass flag + 3 IDs + cafe.sessions.odoo_move_id + partial index) ✅ R11.3 — Direct account.move writer + auto-provision (helpers + drain loop) ✅ R11.4 — Cross-session refund aggregator (Option B per Narong) ✅ R11.5 — Bypass gate on legacy pos.order push (this ship — blocker closed) ⏳ R11.5 cutover (operational, not code): - Pre-flip: SQL set 3 IDs explicitly on get-coffee - Flip: bypass_odoo_pos=true on get-coffee - Narong closes a real shift - wrangler tail confirms drain fires - Verify the account.move in Odoo backoffice - 1-week accountant soak - Rollback via flag flip if anything drifts
-- Pre-populate the 3 Odoo IDs explicitly to skip lazy-resolve on first close: UPDATE cafe.tenant_config SET odoo_sales_income_account_id = 162, odoo_ar_pos_account_id = 107, odoo_session_close_journal_id = 48 WHERE tenant_id = (SELECT id FROM tenants WHERE code='get-coffee'); -- Flip the flag (single statement): UPDATE cafe.tenant_config SET bypass_odoo_pos = true WHERE tenant_id = (SELECT id FROM tenants WHERE code='get-coffee'); -- Rollback if needed: UPDATE cafe.tenant_config SET bypass_odoo_pos = false WHERE tenant_id = (SELECT id FROM tenants WHERE code='get-coffee');