Tab: ws://127.0.0.1:9222/devtools/page/56E54795580A2A41DA2FBA89A3624651 PASS: app shell renders PASS: login works PASS: app renamed to FrancoPOS V2 Multi-Store everywhere PASS: dashboard shows kpis PASS: menu view renders PASS: pos view adds item PASS: pos redesign: toolbar, cart header, item search PASS: orders view renders PASS: order detail opens from orders list (api params fix) PASS: api GET params reach backend (filtering fix) PASS: kot view renders kitchen cards (orders.js fix) PASS: tables view renders PASS: reports render PASS: settings renders PASS: inventory renders PASS: end-to-end create_order API PASS: ingredients tab renders seeded units/categories/list PASS: unit + ingredient category + ingredient created and shown PASS: item recipe sale decrements ingredient stock PASS: inventory adjustment adds then reverts ingredient stock PASS: inventory ingredient-stock and adjustments tabs render PASS: suppliers page renders seeded suppliers with balances PASS: purchase adds ingredient stock and drives supplier due PASS: delete supplier payment and purchase revert state PASS: supplier ledger and due report math PASS: expense item and expense recorded and listed PASS: purchases and expenses pages render with nav PASS: purchase and expense report tabs render PASS: online orders page renders (backend fix) PASS: promotions page renders and edit form prefills PASS: outlet edit form prefills (admin.js fix) PASS: modifier edit form prefills (admin.js fix) PASS: pos promo discount applied and totals math PASS: floor free-table tap starts dine-in at that table PASS: modal scrolls within short screens PASS: phase C: customers page is tabbed with due chips PASS: phase C: seeded due receive renders in its tab FAIL: phase C: seeded refund renders with order, customer and item -> refunds tab not rendered | ? Refunds + New refund REFERENCE NO DATE ORDER CUSTOMER COMMON.ITEM REFUND QTY AMOUNT PAYMENT METHOD REASON ACTIONS RFD-260925-00001 2026-09-24 ORD-260925-00096 Walk-in Crispy Calamari 1 ?9.50 credit Customer returned item x FAIL: phase C: customer due equals ledger closing balance -> JS error: ReferenceError: R is not defined at :1:33 at :1:552 :: (async function(){ const cust = await R.api("customers"); const c = cust.customers.find(function(x){ return x.due > 0.05 }); if (!c) return { err: "no customer with due" }; const led = await R.api("report_customer_ledger", { customer_id: c.id, from: "2000-01-01", to: new Date().toISOString().slice(0,10) }); const e = led.entries; const last = e.length ? e[e.length-1] : null; const kinds = e.map(function(x){ return x.title.split(" ")[0] }); return { err: "", due: c.due, bal: last ? last.balance : 0, entries: e.length, kinds: kinds.join(",") }; })() FAIL: phase C: reports customer due tab renders customers with balances -> customer due report body not rendered FAIL: phase C: due receive API round-trips customer due -> JS error: ReferenceError: R is not defined at :1:33 at :1:636 :: (async function(){ const cust = await R.api("customers"); const c = cust.customers.find(function(x){ return x.due > 0.05 }); const d0 = c.due; const saved = await R.api("save_customer_due_receive", {}, { body: { customer_id: c.id, amount: 3.5, date: new Date().toISOString().slice(0,10), payment_method: "cash", note: "smoke" } }); const d1 = (await R.api("customers")).customers.find(function(x){ return x.id === c.id }).due; await R.api("delete_customer_due_receive", {}, { body: { id: saved.id } }); const d2 = (await R.api("customers")).customers.find(function(x){ return x.id === c.id }).due; return { d0: d0, d1: d1, d2: d2 }; })() FAIL: phase C: refund save/delete round-trips due and stock -> JS error: ReferenceError: R is not defined at :1:33 at :1:1251 :: (async function(){ const cust = await R.api("customers"); window.__cc = cust.customers.find(function(x){ return x.due > 0.05 }); const c = window.__cc; const d0 = c.due; const orders = (await R.api("orders", { q: "" })).orders || []; let order = null; for (const x of orders) { const dd = await R.api("order", { id: x.id }); if (dd.order && dd.order.customer_id === c.id && dd.order.payment_method === "credit") { order = dd; break; } } if (!order) return { err: "no credit order for customer" }; const line = (order.items || []).find(function(i){ return i.item_id }); if (!line) return { err: "no item line" }; const saved = await R.api("save_refund", {}, { body: { date: new Date().toISOString().slice(0,10), order_id: order.order.id, method: "credit", reason: "smoke refund", items: [ { order_item_id: line.id, qty: 1 } ] } }); const row = (await R.api("refunds")).refunds.find(function(z){ return z.ref === saved.ref }); const d1 = (await R.api("customers")).customers.find(function(x){ return x.id === c.id }).due; await R.api("delete_refund", {}, { body: { id: saved.id } }); const d2 = (await R.api("customers")).customers.find(function(x){ return x.id === c.id }).due; return { err: "", d0: d0, d1: d1, d2: d2, amt: row ? row.amount : 0 }; })() FAIL: phase C: credit POS sale increases customer due and ledger -> JS error: ReferenceError: R is not defined at :1:33 at :1:145 :: (async function(){ const cust = await R.api("customers"); window.__cc = cust.customers.find(function(x){ return x.due > 0.05 }); return true; })() PASS: no horizontal page overflow at mobile widths PASS: zero JS errors while browsing RESULT: 39 passed, 6 failed