← All tests

Food Delivery Apps Settings — NIX menu-code mapping STAGING

Phase 5 — finishes the delivery surface on the merchant side. The nix-cafe “Food Delivery” section gains a Register | Settings toggle; Settings is the NIX menu-code map (NIX:101–999 → product) — the bridge that lets a delivery receipt line resolve to a product. Delivery spin chances now honor per-product eligibility the same way in-store orders do: a product set to “no chance” in Orders & Spins earns no delivery spins. Per Blueprint v1.1 the surface is virtual-printer/OCR-oriented (no per-platform API keys).

Gate 2 (staging) 11/11 on demo.staging.nixtech.app + the staging loyalty backend. Backend migration 0005 (delivery_menu_map) + GET/PUT /admin/delivery-menu-map (replace-set); ingest resolves each line’s NIX:xxx tag → product and drops disabled items. nix-cafe cb86124, backend 12ac8a1. Parked on staging for the scheduled prod promote (0005 joins the stack).

Checks:

deployed staging backend: NIX-map eligibility → 3 chances (2 enabled + 0 disabled + 1 untagged)
SSO → Food Delivery → Settings sub-tab renders (Register|Settings toggle + editor)
“How ingestion works” info card renders (virtual-printer / OCR, no secrets)
seeded NIX mappings render (101, 202) sorted
Register ↔ Settings toggle switches views
remove row + Save round-trips to the loyalty backend (“Saved.”)
persists on reload (row removed stays removed)
“Add mapping” creates a new row · no 5xx · staging smoke 5/5

The Settings surface

NIX menu-code mapping editor
Food Delivery › Settings — NIX menu-code map (code → product, active) + info card
Mapping persisted after save
After remove + Save + reload — the change round-tripped to the loyalty backend

nix-cafe loyalty-mobile-app-client.tsx + page.tsx + lib/loyalty/client.ts (cb86124, dev→staging) · nix-loyalty-backend migration 0005 + routes/delivery.ts (12ac8a1) · harness test-loyalty-delivery-settings-staging.mjs. Product dropdown = the shared Popular-Menu list (demo has no cafe products on staging → UI write path proven via remove→save).