Shipped 2026-05-15. Migration applied to prod Supabase immediately after push;
backfill of 9 existing rows on prod (5 get-coffee + 4 lumiere-coffee) verified clean — every
row has type matching the legacy is_cash bool. Both Pro and Starter
Settings now share a single CRUD form; Pro POS reads cafe.payment_methods
directly with no Odoo POS round-trip on the request path.
cafe.payment_methods with the right
type + is_cash sync, list view reflects it after a fresh page load.
Two probe rows (one per tenant) created + removed cleanly via teardown — prod state unchanged.
One idempotent migration (20260515140000_cafe_payment_methods_type_description_shop),
applied via node migrate.js against prod Supabase from local immediately after
push. Existing 9 rows backfilled by the UPDATE ... CASE WHEN is_cash THEN 'cash'
ELSE 'bank' END step:
Card-type rows (Visa/etc.) come later — admins re-classify via the new form. The backfill can only deduce cash/bank from the legacy boolean.
The Pro/Starter branch in page.tsx is gone; both tiers render the new
client.tsx with the same form. Verified end-to-end on both:
SLICE-F-PROBE-PRO with type=card, description filled in. DB row landed correctly (type=card, is_cash=false, description preserved); appears in the "All shops" section with the Card chip after a fresh page load.SLICE-F-PROBE-STARTER with type=bank. DB row landed correctly. Same shared form, no Starter-specific copy.The "Read-only — managed in your backend" copy from Pro's old Odoo-mirror view is gone (asserted in the prod test).
Both /cafe/pos (in-app landing) and /cafe/pos/register/6 (lockable
fullscreen) load on prod with no 5xx after the read-path swap. Same on lumiere-coffee
Starter. Full pay-flow verification was deemed redundant: Slice E2 already exercised the
cafe.order_payments insert end-to-end, and Slice F's only path change there is the
server-side UUID → odoo_payment_method_id lookup, which the existing 5 get-coffee rows
(all carrying their Odoo IDs) cover unchanged.
/api/cafe/orders → 401 JSON (Slice B auth contract intact)Raw: result.json
| 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 |
Settings list doesn't refresh in-place after save. The action's
revalidatePath('/settings/payment-methods') + the client's
router.refresh() together don't reliably propagate a fresh row to the list
view on prod cold workers — the prod test had to fall back to a hard navigation to see the
just-created row. The data IS saved correctly (DB confirms immediately). Suspect: a Next 15
RSC payload caching path that bypasses both Hyperdrive (which the DAO's
db.transaction wrap handles) and the manual revalidatePath. Real
admin UX: save → row appears on next click / reload. Worth a polish-slice investigation but
not customer-blocking.
Pro POS shows every tenant method on every register. Per-register filtering waits on H2.3's banking-flow diagram. Acceptable interim per the slice scope.
Newly-created methods land with NULL odoo_payment_method_id.
Orders paid with them sync to Odoo without per-payment attribution. Pre-existing
get-coffee rows preserve their Odoo IDs. Per the "Pro = Starter + Odoo accounting only"
architecture.
nix-outdoor-sales-backend — commit 3b39d91
migrations/20260515140000_cafe_payment_methods_type_description_shop.ts ·
migrate.js
nix-cafe — commit 5d18634
lib/db/schema.ts · lib/db/payment_methods.ts ·
lib/db/orders.ts · lib/db/pos_configs.ts ·
lib/actions/payment_methods.ts · app/api/cafe/orders/route.ts
app/(authed)/settings/payment-methods/page.tsx ·
app/(authed)/settings/payment-methods/client.tsx (new) ·
starter-client.tsx (deleted)
app/(pos-fullscreen)/pos/register/[configId]/page.tsx ·
lockable-shell.tsx
app/(authed)/pos/page.tsx · starter-register-page.tsx
app/(authed)/pos/_adapters/pro-handlers.ts · starter-handlers.ts
app/(authed)/pos/_components/types.ts · pay-dialog.tsx ·
pro-register-mount.tsx · starter-register-mount.tsx ·
starter-lockable-shell.tsx
scripts/backfill-pro-tenant-payment-methods.ts ·
scripts/seed-supabase-lumiere-demo.ts ·
scripts/test-same-session-partial-refund-local.ts