2026-04-21. Second cycle of R1 (NIX-OS-67 Phase 3 POS): migration adds
cafe.sessions (mirror of Odoo pos.session with PIN + cash-count fields),
cafe.payment_diff_reasons (R1.6 CRUD), and cafe.pos_sequences
(R1.5 daily counter). POS landing page /cafe/pos now groups registers by shop
with per-register session summary (state, cash opening, sold today).
cafe.sessions has expected columns / FKs / indexes
(incl. partial-unique on (tenant_id, odoo_session_id) WHERE NOT NULL),
payment-diff-reasons and pos-sequences shapes match, unit test on the
fetchSessionSummariesForConfigs empty-input short-circuit, and both /cafe/pos
branches (landing vs ?config=N) SSR cleanly (307 on auth).
get-coffee.nixtech.app/cafe/pos (which has 1 shop & 1 register, unmapped
— so we'll also see the "Other registers" fallback bucket render).
cafe.sessions mirror✓ matches spec §16Loading…
cafe.payment_diff_reasons✓ ready for R1.6Loading…
cafe.pos_sequences (daily counter)✓ ready for R1.5Loading…
node migrate.js (same tenant DB).get-coffee.nixtech.app./cafe/pos → shop-grouped landing renders with summary cards (not the old flat register shell)./cafe/pos?config=N — existing in-shell register flow preserved (R1.3 will swap this to window.open).