← All tests

R1.3 — Lockable POS shell + PIN unlock + beginning cash (prod)

2026-04-22 on prod. Third cycle of R1 (NIX-OS-67 Phase 3 POS): new fullscreen route /cafe/pos/register/[configId] opens in its own tab from the landing. Three-phase state machine (Locked → PreShift → Open), nix_active_cashier JWT cookie separate from the outer web session, new server actions unlockRegister / openShift / lockRegister / closeShift, NIX cafe.sessions rows mirror Odoo pos.session.

13/13 R1.3 prod click-through passed. Full three-phase flow: Lock screen with keypad → PIN entered tap-by-tap → PreShift dialog with cashier name → beginning cash $100 → Register loads in fullscreen shell (no sidebar, cashier name in top bar) → Lock → cookie cleared, session still open in DB → re-enter PIN → RESUME straight into Register, skip PreShift. DB assertion confirmed cafe.sessions row with state=open, beginning_cash=100.00, opened_by_pin_id set. Zero 5xx.
Mid-Gate-2 fix: first run timed out at "Open shift" because openShiftAction rejected unmapped registers. Get-coffee has 1 shop but 0 rows in cafe.shop_pos_configs. Added OR-fallback: if the user has exactly one accessible shop we use it automatically — same spirit as M1's shop-filter fallback. Commit 02b2847.
46/46 total prod tests green — no regressions from this push.
test-r1-3-lockable-prod.mjs13/13
test-phase1-prod.mjs11/11
test-m1-prod.mjs10/10
test-phase2-sso-outdoor-prod.mjs6/6
test-phase2-cafe-multishop-prod.mjs6/6