From c9ad78ec71619c87390d2f554ccdfdfbc7e3064e Mon Sep 17 00:00:00 2001 From: bonamin Date: Sat, 2 May 2026 21:08:53 +0300 Subject: [PATCH] Waiter PWA fixes, and extra feautures. Also added Emergency Mode, search etc --- CLAUDE_DESIGN/.design-canvas.state.json | 2 +- CLAUDE_DESIGN/Table Grid Densities.html | 39 + CLAUDE_DESIGN/design-canvas.jsx | 241 +++++- CLAUDE_DESIGN/table-cards-densities.jsx | 375 ++++++++++ CLAUDE_DESIGN/tables-app.jsx | 167 +++++ CLAUDE_DESIGN/tables-data.jsx | 47 ++ .../uploads/pasted-1777645261768-0.png | Bin 0 -> 260110 bytes .../uploads/pasted-1777645330082-0.png | Bin 0 -> 64251 bytes local_backend/main.py | 23 + local_backend/models/flag.py | 3 +- local_backend/models/order.py | 8 +- local_backend/print_size_test.py | 137 ++++ local_backend/routers/flags.py | 6 +- local_backend/routers/messages.py | 18 +- local_backend/routers/orders.py | 107 ++- local_backend/routers/settings.py | 33 +- local_backend/routers/sse.py | 60 ++ local_backend/routers/system.py | 9 + local_backend/routers/tables.py | 2 + local_backend/schemas/flag.py | 3 + local_backend/schemas/order.py | 12 + local_backend/services/printer_service.py | 490 ++++++++++--- local_backend/services/sse_bus.py | 84 +++ .../src/pages/OrderDetailPage.jsx | 64 +- .../src/pages/Settings/tabs/AppInfoTab.jsx | 19 +- .../src/pages/Settings/tabs/PrintFontsTab.jsx | 351 +++++++-- waiter_pwa/dev-dist/sw.js | 2 +- waiter_pwa/package-lock.json | 7 + waiter_pwa/package.json | 1 + waiter_pwa/src/App.jsx | 43 +- .../src/components/ConnectionLostModal.jsx | 100 +++ waiter_pwa/src/components/EmergencyBar.jsx | 40 + .../src/components/ItemOptionsModal.jsx | 10 +- waiter_pwa/src/components/OrderDrawer.jsx | 12 +- waiter_pwa/src/components/ProductPicker.jsx | 14 +- waiter_pwa/src/components/TableCard.jsx | 652 ++++++++++++++--- waiter_pwa/src/components/UserMenu.jsx | 6 + .../src/context/NotificationContext.jsx | 59 +- waiter_pwa/src/context/SSEContext.jsx | 189 +++++ waiter_pwa/src/db/posdb.js | 15 + waiter_pwa/src/hooks/useSSE.js | 94 +++ waiter_pwa/src/index.css | 79 +- waiter_pwa/src/pages/AddItemsPage.jsx | 260 ++++++- waiter_pwa/src/pages/LoginPage.jsx | 33 +- waiter_pwa/src/pages/SettingsPage.jsx | 345 +++++++++ waiter_pwa/src/pages/TableListPage.jsx | 688 +++++++++++++----- waiter_pwa/src/services/offlinePayments.js | 61 ++ waiter_pwa/src/store/connectionStore.js | 33 + waiter_pwa/src/store/tableViewStore.js | 39 + waiter_pwa/vite.config.js | 2 +- 50 files changed, 4441 insertions(+), 643 deletions(-) create mode 100644 CLAUDE_DESIGN/Table Grid Densities.html create mode 100644 CLAUDE_DESIGN/table-cards-densities.jsx create mode 100644 CLAUDE_DESIGN/tables-app.jsx create mode 100644 CLAUDE_DESIGN/tables-data.jsx create mode 100644 CLAUDE_DESIGN/uploads/pasted-1777645261768-0.png create mode 100644 CLAUDE_DESIGN/uploads/pasted-1777645330082-0.png create mode 100644 local_backend/print_size_test.py create mode 100644 local_backend/routers/sse.py create mode 100644 local_backend/services/sse_bus.py create mode 100644 waiter_pwa/src/components/ConnectionLostModal.jsx create mode 100644 waiter_pwa/src/components/EmergencyBar.jsx create mode 100644 waiter_pwa/src/context/SSEContext.jsx create mode 100644 waiter_pwa/src/db/posdb.js create mode 100644 waiter_pwa/src/hooks/useSSE.js create mode 100644 waiter_pwa/src/pages/SettingsPage.jsx create mode 100644 waiter_pwa/src/services/offlinePayments.js create mode 100644 waiter_pwa/src/store/connectionStore.js create mode 100644 waiter_pwa/src/store/tableViewStore.js diff --git a/CLAUDE_DESIGN/.design-canvas.state.json b/CLAUDE_DESIGN/.design-canvas.state.json index 6b13e20..2a63473 100644 --- a/CLAUDE_DESIGN/.design-canvas.state.json +++ b/CLAUDE_DESIGN/.design-canvas.state.json @@ -1 +1 @@ -{"sections":{"v1":{"labels":{"v1-grid":"Grid of 8 tables — mixed statuses"}}}} \ No newline at end of file +{"sections":{"v1":{"labels":{"v1-grid":"Grid of 8 tables — mixed statuses"}},"desktop":{"labels":{"desktop-main":"1440×900 — full operational view, mid-shift"}}}} \ No newline at end of file diff --git a/CLAUDE_DESIGN/Table Grid Densities.html b/CLAUDE_DESIGN/Table Grid Densities.html new file mode 100644 index 0000000..d29c56b --- /dev/null +++ b/CLAUDE_DESIGN/Table Grid Densities.html @@ -0,0 +1,39 @@ + + + + + +Table Grid Densities — SimplePOS + + + + + + +
+ + + + + + + + + + + + diff --git a/CLAUDE_DESIGN/design-canvas.jsx b/CLAUDE_DESIGN/design-canvas.jsx index 9f3fc61..043475f 100644 --- a/CLAUDE_DESIGN/design-canvas.jsx +++ b/CLAUDE_DESIGN/design-canvas.jsx @@ -1,10 +1,10 @@ // DesignCanvas.jsx — Figma-ish design canvas wrapper // Warm gray grid bg + Sections + Artboards + PostIt notes. -// Artboards are reorderable (grip-drag), labels/titles are inline-editable, -// and any artboard can be opened in a fullscreen focus overlay (←/→/Esc). -// State persists to a .design-canvas.state.json sidecar via the host -// bridge. No assets, no deps. +// Artboards are reorderable (grip-drag), deletable, labels/titles are +// inline-editable, and any artboard can be opened in a fullscreen focus +// overlay (←/→/Esc). State persists to a .design-canvas.state.json sidecar +// via the host bridge. No assets, no deps. // // Usage: // @@ -39,17 +39,58 @@ if (typeof document !== 'undefined' && !document.getElementById('dc-styles')) { '.dc-card{transition:box-shadow .15s,transform .15s}', '.dc-card *{scrollbar-width:none}', '.dc-card *::-webkit-scrollbar{display:none}', - '.dc-labelrow{display:flex;align-items:center;gap:4px;height:24px}', - '.dc-grip{cursor:grab;display:flex;align-items:center;padding:5px 4px;border-radius:4px;transition:background .12s}', + // Per-artboard header: grip + label on the left, delete/expand on the + // right. Single flex row; when the artboard's on-screen width is too + // narrow for both the label yields (ellipsis, then hidden entirely below + // ~4ch via the container query) and the buttons stay on the row. + '.dc-header{position:absolute;bottom:100%;left:-4px;margin-bottom:calc(4px * var(--dc-inv-zoom,1));z-index:2;', + ' display:flex;align-items:center;container-type:inline-size}', + '.dc-labelrow{display:flex;align-items:center;gap:4px;height:24px;flex:1 1 auto;min-width:0}', + '.dc-grip{flex:0 0 auto;cursor:grab;display:flex;align-items:center;padding:5px 4px;border-radius:4px;transition:background .12s,opacity .12s}', '.dc-grip:hover{background:rgba(0,0,0,.08)}', '.dc-grip:active{cursor:grabbing}', - '.dc-labeltext{cursor:pointer;border-radius:4px;padding:3px 6px;display:flex;align-items:center;transition:background .12s}', + '.dc-labeltext{flex:1 1 auto;min-width:0;cursor:pointer;border-radius:4px;padding:3px 6px;', + ' display:flex;align-items:center;transition:background .12s;overflow:hidden}', + // Below ~4ch of label room: hide the label entirely, and drop the grip to + // hover-only (same reveal rule as .dc-btns) so a narrow header is clean + // until the card is moused. + '@container (max-width: 110px){', + ' .dc-labeltext{display:none}', + ' .dc-grip{opacity:0}', + ' [data-dc-slot]:hover .dc-grip{opacity:1}', + '}', '.dc-labeltext:hover{background:rgba(0,0,0,.05)}', - '.dc-expand{position:absolute;bottom:100%;right:0;margin-bottom:5px;z-index:2;opacity:0;transition:opacity .12s,background .12s;', - ' width:22px;height:22px;border-radius:5px;border:none;cursor:pointer;padding:0;', - ' background:transparent;color:rgba(60,50,40,.7);display:flex;align-items:center;justify-content:center}', + '.dc-labeltext .dc-editable{overflow:hidden;text-overflow:ellipsis;max-width:100%}', + '.dc-labeltext .dc-editable:focus{overflow:visible;text-overflow:clip}', + '.dc-btns{flex:0 0 auto;margin-left:auto;display:flex;gap:2px;opacity:0;transition:opacity .12s}', + '[data-dc-slot]:hover .dc-btns,.dc-btns:has(.dc-confirm){opacity:1}', + '.dc-expand,.dc-delete{width:22px;height:22px;border-radius:5px;border:none;cursor:pointer;padding:0;', + ' background:transparent;color:rgba(60,50,40,.7);display:flex;align-items:center;justify-content:center;', + ' font:inherit;transition:background .12s,color .12s}', '.dc-expand:hover{background:rgba(0,0,0,.06);color:#2a251f}', - '[data-dc-slot]:hover .dc-expand{opacity:1}', + '.dc-delete:hover{background:rgba(201,100,66,.12);color:#c96442}', + '.dc-delete.dc-confirm{width:auto;padding:0 7px;gap:5px;background:#c96442;color:#fff;', + ' font-size:12px;font-weight:500}', + '.dc-delete.dc-confirm:hover{background:#b5563a}', + // Chrome (titles / labels / buttons) counter-scales against the viewport + // zoom so it stays a constant on-screen size. --dc-inv-zoom is set by + // DCViewport on every transform update and inherits to all descendants — + // any overlay inside the world (e.g. a TweaksPanel on an artboard) can use + // it the same way. + // + // The header uses transform:scale (out-of-flow, so layout impact doesn't + // matter) with its world-space width set to card-width / inv-zoom so that + // after counter-scaling its on-screen width exactly matches the card's — + // that's what lets the container query + text-overflow behave against the + // card's visible edge at every zoom level. + // + // The section head uses CSS zoom instead of transform so its layout box + // grows with the counter-scale, pushing the card row down — otherwise the + // constant-screen-size title would overflow into the (shrinking) world- + // space gap and overlap the artboard headers at low zoom. + '.dc-header{width:calc((100% + 4px) / var(--dc-inv-zoom,1));', + ' transform:scale(var(--dc-inv-zoom,1));transform-origin:bottom left}', + '.dc-sectionhead{zoom:var(--dc-inv-zoom,1)}', ].join('\n'); document.head.appendChild(s); } @@ -58,8 +99,9 @@ const DCCtx = React.createContext(null); // ───────────────────────────────────────────────────────────── // DesignCanvas — stateful wrapper around the pan/zoom viewport. -// Owns runtime state (per-section order, renamed titles/labels, focused -// artboard). Order/titles/labels persist to a .design-canvas.state.json +// Owns runtime state (per-section order, renamed titles/labels, hidden +// artboards, focused artboard). Order/titles/labels/hidden persist to a +// .design-canvas.state.json // sidecar next to the HTML. Reads go via plain fetch() so the saved // arrangement is visible anywhere the HTML + sidecar are served together // (omelette preview, direct link, downloaded zip). Writes go through the @@ -115,11 +157,19 @@ function DesignCanvas({ children, minScale, maxScale, style }) { if (!sid) return; sectionOrder.push(sid); const persisted = state.sections[sid] || {}; - const srcIds = []; + const abs = []; React.Children.forEach(sec.props.children, (ab) => { if (!ab || ab.type !== DCArtboard) return; const aid = ab.props.id ?? ab.props.label; - if (!aid) return; + if (aid) abs.push([aid, ab]); + }); + // hidden is scoped to one source revision — when the agent regenerates + // (artboard-ID set changes), prior deletes don't apply to new content. + const srcKey = abs.map(([k]) => k).join('\x1f'); + const hidden = persisted.srcKey === srcKey ? (persisted.hidden || []) : []; + const srcIds = []; + abs.forEach(([aid, ab]) => { + if (hidden.includes(aid)) return; registry[`${sid}/${aid}`] = { sectionId: sid, artboard: ab }; srcIds.push(aid); }); @@ -183,11 +233,48 @@ function DCViewport({ children, minScale = 0.1, maxScale = 8, style = {} }) { const vpRef = React.useRef(null); const worldRef = React.useRef(null); const tf = React.useRef({ x: 0, y: 0, scale: 1 }); + // Persist viewport across reloads so the user lands back where they were + // after an agent edit or browser refresh. The sandbox origin is already + // per-project; pathname keeps multiple canvas files in one project apart. + const tfKey = 'dc-viewport:' + location.pathname; + const saveT = React.useRef(0); + const lastPostedScale = React.useRef(); const apply = React.useCallback(() => { const { x, y, scale } = tf.current; const el = worldRef.current; - if (el) el.style.transform = `translate3d(${x}px, ${y}px, 0) scale(${scale})`; + if (!el) return; + el.style.transform = `translate3d(${x}px, ${y}px, 0) scale(${scale})`; + // Exposed for zoom-invariant chrome (labels, buttons, TweaksPanel). + el.style.setProperty('--dc-inv-zoom', String(1 / scale)); + // Keep the host toolbar's % readout in sync with the canvas scale. Pan + // ticks leave scale unchanged — skip the cross-frame post for those. + if (lastPostedScale.current !== scale) { + lastPostedScale.current = scale; + window.parent.postMessage({ type: '__dc_zoom', scale }, '*'); + } + clearTimeout(saveT.current); + saveT.current = setTimeout(() => { + try { localStorage.setItem(tfKey, JSON.stringify(tf.current)); } catch {} + }, 200); + }, [tfKey]); + + React.useLayoutEffect(() => { + const flush = () => { + clearTimeout(saveT.current); + try { localStorage.setItem(tfKey, JSON.stringify(tf.current)); } catch {} + }; + try { + const s = JSON.parse(localStorage.getItem(tfKey) || 'null'); + if (s && Number.isFinite(s.x) && Number.isFinite(s.y) && Number.isFinite(s.scale)) { + tf.current = { x: s.x, y: s.y, scale: Math.min(maxScale, Math.max(minScale, s.scale)) }; + apply(); + } + } catch {} + // Flush on pagehide and unmount so a reload within the 200ms debounce + // window doesn't drop the last pan/zoom. + window.addEventListener('pagehide', flush); + return () => { window.removeEventListener('pagehide', flush); flush(); }; }, []); React.useEffect(() => { @@ -272,6 +359,36 @@ function DCViewport({ children, minScale = 0.1, maxScale = 8, style = {} }) { vp.style.cursor = ''; }; + // Host-driven zoom (toolbar % menu). Zooms around viewport centre so the + // visible midpoint stays fixed — matching the host's iframe-zoom feel. + const onHostMsg = (e) => { + const d = e.data; + if (d && d.type === '__dc_set_zoom' && typeof d.scale === 'number') { + const r = vp.getBoundingClientRect(); + zoomAt(r.left + r.width / 2, r.top + r.height / 2, d.scale / tf.current.scale); + } else if (d && d.type === '__dc_probe') { + // Host's [readyGen] reset asks whether a canvas is present; it + // fires on the iframe's native 'load', which for canvases with + // images/fonts is after our mount-time announce, so re-announce. + // Clear the pan-tick guard so apply() re-posts the current scale + // even if it's unchanged — the host just reset dcScale to 1. + window.parent.postMessage({ type: '__dc_present' }, '*'); + lastPostedScale.current = undefined; + apply(); + } + }; + window.addEventListener('message', onHostMsg); + // Announce canvas mode so the host toolbar proxies its % control here + // instead of scaling the iframe element (which would just shrink the + // viewport window of an infinite canvas). The apply() that follows emits + // the initial __dc_zoom so the toolbar % is correct before first pinch. + // lastPostedScale reset mirrors the __dc_probe handler: the layout + // effect's restore-path apply() may already have posted the restored + // scale (before __dc_present), so clear the guard to re-post it in order. + window.parent.postMessage({ type: '__dc_present' }, '*'); + lastPostedScale.current = undefined; + apply(); + vp.addEventListener('wheel', onWheel, { passive: false }); vp.addEventListener('gesturestart', onGestureStart, { passive: false }); vp.addEventListener('gesturechange', onGestureChange, { passive: false }); @@ -281,6 +398,7 @@ function DCViewport({ children, minScale = 0.1, maxScale = 8, style = {} }) { vp.addEventListener('pointerup', onPointerUp); vp.addEventListener('pointercancel', onPointerUp); return () => { + window.removeEventListener('message', onHostMsg); vp.removeEventListener('wheel', onWheel); vp.removeEventListener('gesturestart', onGestureStart); vp.removeEventListener('gesturechange', onGestureChange); @@ -336,8 +454,13 @@ function DCSection({ id, title, subtitle, children, gap = 48 }) { const all = React.Children.toArray(children); const artboards = all.filter((c) => c && c.type === DCArtboard); const rest = all.filter((c) => !(c && c.type === DCArtboard)); - const srcOrder = artboards.map((a) => a.props.id ?? a.props.label); const sec = (ctx && sid && ctx.section(sid)) || {}; + // Must match DesignCanvas's srcKey computation exactly (it filters falsy + // IDs), or onDelete persists a srcKey that DesignCanvas never recognizes. + const allIds = artboards.map((a) => a.props.id ?? a.props.label).filter(Boolean); + const srcKey = allIds.join('\x1f'); + const hidden = sec.srcKey === srcKey ? (sec.hidden || []) : []; + const srcOrder = allIds.filter((k) => !hidden.includes(k)); const order = React.useMemo(() => { const kept = (sec.order || []).filter((k) => srcOrder.includes(k)); @@ -346,13 +469,22 @@ function DCSection({ id, title, subtitle, children, gap = 48 }) { const byId = Object.fromEntries(artboards.map((a) => [a.props.id ?? a.props.label, a])); + // marginBottom counter-scales so the on-screen gap between sections stays + // constant — otherwise at low zoom the (world-space) gap collapses while + // the screen-constant sectionhead below it doesn't, and the title reads as + // belonging to the section above. paddingBottom below is just enough for + // the 24px artboard-header (abs-positioned above each card) plus ~8px, so + // the title sits tight against its own row at every zoom. return ( -
-
- ctx && sid && ctx.patchSection(sid, { title: v })} - style={{ fontSize: 28, fontWeight: 600, color: DC.title, letterSpacing: -0.4, marginBottom: 6, display: 'inline-block' }} /> - {subtitle &&
{subtitle}
} +
+
+
+ ctx && sid && ctx.patchSection(sid, { title: v })} + style={{ fontSize: 28, fontWeight: 600, color: DC.title, letterSpacing: -0.4, marginBottom: 6, display: 'inline-block' }} /> + {subtitle &&
{subtitle}
} +
{order.map((k) => ( @@ -360,6 +492,10 @@ function DCSection({ id, title, subtitle, children, gap = 48 }) { label={(sec.labels || {})[k] ?? byId[k].props.label} onRename={(v) => ctx && ctx.patchSection(sid, (x) => ({ labels: { ...x.labels, [k]: v } }))} onReorder={(next) => ctx && ctx.patchSection(sid, { order: next })} + onDelete={() => ctx && ctx.patchSection(sid, (x) => ({ + hidden: [...(x.srcKey === srcKey ? (x.hidden || []) : []), k], + srcKey, + }))} onFocus={() => ctx && ctx.setFocus(`${sid}/${k}`)} /> ))}
@@ -371,10 +507,22 @@ function DCSection({ id, title, subtitle, children, gap = 48 }) { // DCArtboard — marker; rendered by DCArtboardFrame via DCSection. function DCArtboard() { return null; } -function DCArtboardFrame({ sectionId, artboard, label, order, onRename, onReorder, onFocus }) { +function DCArtboardFrame({ sectionId, artboard, label, order, onRename, onReorder, onFocus, onDelete }) { const { id: rawId, label: rawLabel, width = 260, height = 480, children, style = {} } = artboard.props; const id = rawId ?? rawLabel; const ref = React.useRef(null); + const delRef = React.useRef(null); + const [confirming, setConfirming] = React.useState(false); + + // Two-click delete: first click arms the button (turns into an inline + // "Delete?" pill), second click commits. Any pointerdown outside the + // button disarms. + React.useEffect(() => { + if (!confirming) return; + const off = (e) => { if (!delRef.current || !delRef.current.contains(e.target)) setConfirming(false); }; + document.addEventListener('pointerdown', off, true); + return () => document.removeEventListener('pointerdown', off, true); + }, [confirming]); // Live drag-reorder: dragged card sticks to cursor; siblings slide into // their would-be slots in real time via transforms. DOM order only @@ -440,18 +588,32 @@ function DCArtboardFrame({ sectionId, artboard, label, order, onRename, onReorde return (
-
-
- +
e.stopPropagation()}> +
+
+ +
+
+ e.stopPropagation()} + style={{ fontSize: 15, fontWeight: 500, color: DC.label, lineHeight: 1 }} /> +
-
- e.stopPropagation()} - style={{ fontSize: 15, fontWeight: 500, color: DC.label, lineHeight: 1 }} /> +
+ +
-
{children ||
{id}
} @@ -489,9 +651,14 @@ function DCFocusOverlay({ entry, sectionMeta, sectionOrder }) { const go = (d) => { const n = peers[(idx + d + peers.length) % peers.length]; if (n) ctx.setFocus(`${sectionId}/${n}`); }; const goSection = (d) => { - const ns = sectionOrder[(secIdx + d + sectionOrder.length) % sectionOrder.length]; - const first = sectionMeta[ns] && sectionMeta[ns].slotIds[0]; - if (first) ctx.setFocus(`${ns}/${first}`); + // Sections whose artboards are all deleted have slotIds:[] — step past + // them to the next non-empty section so ↑/↓ doesn't dead-end. + const n = sectionOrder.length; + for (let i = 1; i < n; i++) { + const ns = sectionOrder[(((secIdx + d * i) % n) + n) % n]; + const first = sectionMeta[ns] && sectionMeta[ns].slotIds[0]; + if (first) { ctx.setFocus(`${ns}/${first}`); return; } + } }; React.useEffect(() => { @@ -548,7 +715,7 @@ function DCFocusOverlay({ entry, sectionMeta, sectionOrder }) { {ddOpen && (
- {sectionOrder.map((sid) => ( + {sectionOrder.filter((sid) => sectionMeta[sid].slotIds.length).map((sid) => ( + ))} +
+ ); +} + +function Header({ density }) { + return ( +
+
Tables
+ +
+ dimitris + +
+
+ ); +} + +function DensityScreen({ densityKey }) { + const d = DENSITIES[densityKey]; + // Compute card width: phone interior is ~370px wide, padding 12px each side + const padding = 12; + const innerW = 370 - padding * 2; + const cardW = (innerW - d.gap * (d.cols - 1)) / d.cols; + const cardH = cardW * (d.aspectH / d.aspectW); + + return ( +
+
+ +
+
+ {TABLES.map(t => ( + + ))} +
+
+
+ ); +} + +function App() { + const order = ['1x1', '2x1', '2x2', '4x1', '4x2']; + return ( + + + {order.map(k => { + const d = DENSITIES[k]; + return ( + +
+ + + +
+
+ ); + })} +
+
+ ); +} + +const root = ReactDOM.createRoot(document.getElementById('root')); +root.render(); diff --git a/CLAUDE_DESIGN/tables-data.jsx b/CLAUDE_DESIGN/tables-data.jsx new file mode 100644 index 0000000..b42bede --- /dev/null +++ b/CLAUDE_DESIGN/tables-data.jsx @@ -0,0 +1,47 @@ +// Table grid data + status palette + +// Statuses — bold colors, high contrast for fast reading +const TABLE_STATUS = { + free: { label: 'Free', bg: '#e9ebee', fg: '#3a3f45', pillBg: '#d3d6db', pillFg: '#3a3f45' }, + open: { label: 'Open', bg: '#f5b740', fg: '#3a2a05', pillBg: '#3a2a05', pillFg: '#ffe7b2' }, + partial: { label: 'Partial', bg: '#3b86e6', fg: '#ffffff', pillBg: 'rgba(0,0,0,0.25)', pillFg: '#ffffff' }, + paid: { label: 'Paid', bg: '#3aa961', fg: '#ffffff', pillBg: 'rgba(0,0,0,0.25)', pillFg: '#ffffff' }, + reserved: { label: 'Reserved', bg: '#8b5cd6', fg: '#ffffff', pillBg: 'rgba(0,0,0,0.25)', pillFg: '#ffffff' }, + attention: { label: 'Needs you', bg: '#e64545', fg: '#ffffff', pillBg: 'rgba(0,0,0,0.3)', pillFg: '#ffffff' }, + mine: { label: 'Mine', bg: '#1f1f24', fg: '#ffffff', pillBg: '#f5b740', pillFg: '#3a2a05' }, +}; + +// Badge dictionary — icon + tone for each flag +const TABLE_BADGES = { + cleaning: { label: 'Cleaning', icon: '🧹', tone: '#8a6d2b' }, + waiter: { label: 'Waiter', icon: '🔔', tone: '#d94b26' }, + vip: { label: 'VIP', icon: '⭐', tone: '#a76b00' }, + allergy: { label: 'Allergy', icon: '⚠', tone: '#a5361b' }, + birthday: { label: 'Birthday', icon: '🎂', tone: '#a8276b' }, +}; + +// 24 demo tables across statuses + sections +const TABLES = [ + { name: 'A-1', section: 'Terrace', status: 'open', amount: 84.50, waiters: ['Marco Riva'], badges: [] }, + { name: 'A-2', section: 'Terrace', status: 'mine', amount: 127.20, waiters: ['You'], badges: ['vip'] }, + { name: 'A-3', section: 'Terrace', status: 'free', amount: 0, waiters: [], badges: [] }, + { name: 'A-4', section: 'Terrace', status: 'attention', amount: 56.00, waiters: ['Luca'], badges: ['waiter'] }, + { name: 'A-5', section: 'Terrace', status: 'reserved', amount: 0, waiters: ['Elena'], badges: ['birthday'] }, + { name: 'A-6', section: 'Terrace', status: 'paid', amount: 0, waiters: ['Marco Riva'], badges: [] }, + + { name: 'B-1', section: 'Hall', status: 'partial', amount: 38.00, waiters: ['Sofia'], badges: [] }, + { name: 'B-2', section: 'Hall', status: 'open', amount: 212.80, waiters: ['Marco', 'Sofia', 'Luca', 'Elena'], badges: ['vip', 'allergy', 'birthday', 'waiter'] }, + { name: 'B-3', section: 'Hall', status: 'free', amount: 0, waiters: [], badges: ['cleaning'] }, + { name: 'B-4', section: 'Hall', status: 'mine', amount: 16.30, waiters: ['You', 'Billy'], badges: [] }, + { name: 'B-5', section: 'Hall', status: 'open', amount: 72.80, waiters: ['Sofia'], badges: ['allergy'] }, + { name: 'B-6', section: 'Hall', status: 'free', amount: 0, waiters: [], badges: [] }, + + { name: 'C-1', section: 'Bar', status: 'partial', amount: 24.50, waiters: ['Elena'], badges: [] }, + { name: 'C-2', section: 'Bar', status: 'free', amount: 0, waiters: [], badges: [] }, + { name: 'C-3', section: 'Bar', status: 'paid', amount: 0, waiters: ['Luca'], badges: [] }, + { name: 'C-4', section: 'Bar', status: 'reserved', amount: 0, waiters: ['Sofia'], badges: [] }, +]; + +window.TABLE_STATUS = TABLE_STATUS; +window.TABLE_BADGES = TABLE_BADGES; +window.TABLES = TABLES; diff --git a/CLAUDE_DESIGN/uploads/pasted-1777645261768-0.png b/CLAUDE_DESIGN/uploads/pasted-1777645261768-0.png new file mode 100644 index 0000000000000000000000000000000000000000..eaa2b509bccffb4b523c73712532606b744d799f GIT binary patch literal 260110 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 z%0D&^xo6^({N{g#Ccr}x4AhlMbK+Nv?>!2f`aN12l>?Qa z%0cG;*kQn##OY}Y)}CA`UgZB$1bz}2NQ=)PnMc5YB9|(AeD$i%`7^PfSQ7e=YS5~Z z;Wf|gA&PTv0>&bVgJbV{(Vl7QlR$}th)6j4f4!?Gh=+XYlmg&h-Er0`+v0n zY^4U>lJ_X z{J+A>)Bp8d&iAlBhco>4xzV4*;DE4ieD{y8^SMyVc{xE|?3BWZfM%IB5BICzXI(&@ zB$;vZhu@2b<7W*t34$(R>m>`= zCsMA1>0BJ>+*94+8c zgh$PME|-4y5X$=m+?h8h=Nl|XFIxlhSvPvFcl>GF^IOP>TR#jsroa1#I{*B7K30U- z)@>8eTc&iz>u+kE!$!>|8QW)wA%oUlS+?YOxOtV&{@l z`em>4H~;$#?5V?>2n|+2Yh#2cW1n0{$Z5;p86wjD}b{liH6u@46#)_Bshqgx^m@+7?P`CV3 z#q%|e2;e9hByRsp$PH-NAaShM>WCS?v;LP-23t>Hegoe0=j8IlFH=(Ey*pPsTGIq7 zFE!%kBKZ4lfO{!r@p`DC!1W~`^!GoBb>~k{#ExHf+B@a{=Lky0uwE_|cMR(kgZcnj z`16+z!wN@#zhNW)pH~f&2Cn`Pw!ZM+tH1AU`Y-xe<{eR1K2<$aUcBcr@wspCG65MNF|-%%755>*n--DR$>(X ztvd|N|6;h{U(*tBKM{e$e+mcs`Us#ZVE=-N;-9w%N_R5?s*>WdA>nj|_zjNbxwU}L zMeNe1wvWmE_gs3{hti@KV^b07j6?94J8%v&R`7;oIQUkr8kJFZZVT7l^!I`3P-_q& z$K602Ts#6|N;W|OwzYoaHgz!P-%EvBcL$(hTROm>y-2;zuk&6YKz*+EreZt4Yvn>R z`v)GjwQLt#r9UOzO@9-ZZf;3YbW``wZN!vU2?$WQK!f8Es8c!-{dywX+9?t6;9mu; zl2$If#tTNjR`s;{^+(`p&;jtQ15c)!FSdU##o`6~cbCy80+q&)9NorN9ZpFJ_u1_H zgnbF@x4?KSJV1@;Oy3p#DV=~=0eE~^>QsE-KSfyqkGpO3o&@;Td~V4_&D)^4{CucI4X+j K3I+Epg8v8j8UXbG literal 0 HcmV?d00001 diff --git a/CLAUDE_DESIGN/uploads/pasted-1777645330082-0.png b/CLAUDE_DESIGN/uploads/pasted-1777645330082-0.png new file mode 100644 index 0000000000000000000000000000000000000000..c7fd8309d0e2db27b097b32298245692ee11ce2f GIT binary patch literal 64251 zcmaHSRX|+95+x2nf_snz2*KSQf?G1UyA#}9g1Zx3h5&=RySux)L$JYNhxhhTtGmvrstNm{Ac=-dgbW1*g(fZa9RLLd9SsEqtBC{yd4s9S&j$sC0VVxiMA;4c zH1mU(w#w4mMdqJTIWSQAF1fyTa#|FHfzN!2HocP!LquF02NU;)@b|7D{D0!cKjCnH zcJAR~h=_ozLxnX~rl*t3Ymbr{Ex-ab&mFE=LqlVy($qt8`=bX7Y!mL|j^hFct_nVm z<82AEn6pe{ex|}~vBjuPP7hqFzczFhj+t*{*>VUcQH?oak&2T+qgh|p_#nMH4LfH6 zCR4FBZ#SJBuo_){>nbLF>_-Zg2o7ofIhgEnVizFPmuXaU1lDY529-ZTlFcD${{9B! zvYH%XFS7vLJQ3ZW(0udh=0o_(2gP+h$0uf#xijZ0UzT`ftrrfdL2IH-WY4K;250*8Uc&YA|j#xn+mYF-=whX$FK z+>wy^whc6z`Dv|YRDUz&PS9>N;Cj5{@TzPD#Fj7Fw1U!BGQ8HbK%qDah3vf0hE5K! z?P$4qjwp9KSt|(JaX#{6#;{c0P(`20!5$OFfjz`QE?7mH=U8})luy1gH;N^M>`COS zwjLu2LFgpS5sT&RVn^1DC!K*2^GvA+OylnOi&@rHzU%Mo#Pqgto7)JkevMzI!M}tsEkUUL=$XTS=LTgYaNs*|F zTB~0Ae4$0c#`yS%*)868xv=W6p|jb1eaC@1;UA)a+o7OjDva1~wpryXNZc{G*!)W} zU^V+5IoW{msLH2Db+puPXbA@kqbpsCqSQ$gy}t+IaJGM%Wfz zVfjBT2KoAGAmosiTd3^83Sxjs|`xM_1w#a4OE zLs=%J5@Z;ky)Ig(j(wRb!Sb3o5!?H8Bk{bQGt z{_4_3oi+c#1Ua7_f#=XhcE^)j!x_w2h3?yfY<6+$R<52pF`bq_CkL$OP-n8-y>532 zS8xpdLfbrBMpnpyRqy<5Cy}{;U)gY!;X-yM7lEJ_zIcZG32*u)(sIv#P2CK+E;@G z*@9HP7au}=&aw`Et?WjRRp>l5{h0cEp!3)nE@5K;?jP2k8&HURs zS#(~P=^#ZZlr5P@dA3PcgnHC_!hdCS?RAr>muFmyVwtV``*ZfqjgR6x>9)#ck9``! zRj=R+Z#VZvpDV3gVlB}0rI7nh+RIR;bH#ETVZT!U5_|hG^?(wF#O=#QlUbYg%{qMl zu_vPk`MKKAUpWHj?Ks3-C7H6xVxi|96HVSbCCT`YaMP43bmu~6-JV&t8D2v%woOMP zh=dpX4o3kI7aO0B|3w!v@xDAtswrnUj47VCyIpO!wA&vklD;mO8f^z<3l@1K9NgRb zS}+H5!dnXtJ%UY5pO3__fz6lmr>2U{ zkNXMXgMIz+d@(;?c-nTR=op)~510fmxD+0?3nlx@bK27UnPIgOXr}ls(Ej0<>Uv*F z_oRZ49_C46b~=2-Rw+h+7V~8>Lx>vCDC70YlBfTKvDz{pXz2KP4Q~Yo##`@Si-n3c zZ~I5^shi6jyW$aI8W>Pni5gIPukcOw|0X&}Tc(sUN0bgyrod=`r`yM@YcaweuLE?71Z!Fk;c4^HuO(M&^oa%tu_xzcK zzg70jCyI&oy`>Sb-qkhA-N9+_;ss^<r+hR};9o z8(7!7-+5D$4w5HxaN2M!t>gNd@;{d_HC(s}9F2Q`nxnEG?D z*6PtErl>vHfY!Bs!yMFXkq8P($@1A7i)jV#!g6KZ_f3|Spv17E-f7@xDj6!jJx1s? zZu?8xybd2QdHlT!w!$M=d38D}Xb>cNv1gg%^{MbZ?5Fd&x{)y+Uq)hjo>I(mdktF1 z@;#2D8*kd4Sn1Dl;EiFMU-vo3XMDWHp6IA4W}z3teZpuxzr65{F}-`cS~wtlT`1?i z9!@9AneXGexW7Tu+t_eBTEO?ZP^_3Icq||c9qRmjY1Hvl79nkv9G)@ssd^?29r7bYq?w!uMK{SzHqTZk0~Pd(fRy0^n?2cr&Z0`5-&zU$tT@`}&r z@ev(9E0+}Yt*iMR935sREm{-l#9v8jwKP~>7%}nvR zdz7v4HIHL)H}q$@9C3ZSPJ6&!Q>l0bkIQyAY>9+qxu2D+ekAsMox>lcE!Vjkjfk*{ ziaS^n9UXk^yW4nuQbQScKO8z?e0WqzIbCSo{j)G1QV=C;WsdNL@P533(Z_Mi2<8S! z1?CXnZ8ulXku2oPbKD%Nm?uJ-zmLq^WkcQ#y7sj92Jh@h9ya6K+>`8OM-});i}BCQ zwR}Jvwa)D+pTS!ScxV28@%q9$T%+R*dltp}qn8`RL1bq9bb5{<%P+D#Qjtu!jTG1$ z=y+nDHJuBY=y=<8E>zxTNb|g8u$|nTKGLgH5sHq|_8+!^noNR|s&N;Klu9zxY{y`<~^}>M$PKEGHYl zvH2pi2a}ZtaGGE?C1K`CvLneSJj908YEaR$o7xM|d)E@ZnkF`Y}E7$A*E6VDpfAKp@&DM)2ljmB48~nw0^7%iD|A>D@S5Ab&^CMW9a| zq)*~}|G9}}HImds6G)pcS;SWeft;wY5M+uLC_O6%dG>vOe&ZRR$2|72La>HF#_G6S z`FG5yL^ugZDrU=nDu9exB$x!4P>7}f2O2YDETJ=~#6=#qzJqdq$e7_y=_#FeQ2hlm z2zMxS+zNtu2?za>L8uvt{wMJ^8f>v;@BQZg%)HE_?&82|f*dTHZ}mA~mxdv|tTTDm zY{!K42nUbd7*sR_yqmAn{Iv~)WmU>YYe@@D$ste~kTf?_$X7u)hzk+<>`d9cGus;m^{LRui$J;8r} z-UU-EQkCZCkN&JUt+?Wb)s9ubPjK2eV z!Xb#*kr{YvG!R|oa6y*xxXyJHoA5jLHzh}a{4|Ws)A^6KSaJ$zXH37}NkS$G?ShOV z0Gg*j6vwQL+S^i|400Pa?|9dv$h&@Wh9-61$;CEHB|czoZo28R7>s^yt>X4<@WUPY{1yyi!V59X2N)jQ?`ecRE=Sl8LkbK78VWd(d(%P~J6LEZ35} za7O=6oqw_lr`R#|D-d_@V6Vk7rP*fvYL(Fp)XEc_%7y2Z%Z0wn^HjjOwsY#Zr+;1F zKM?av&m{%(@Ysg3a3iq2KDwZRu~7p( zb%jRX%7d1L8haXyetyU1r9-{1Z=ZhMvh9sl_(NHyG*uf)J+U|F*sl}*BPCdi#Gzm- zshe1o%vSCn9^){O3mo`&Df=O^MbI$1+;NV~@Uc#b;862ck|l4($2avm7YDt-^K9QI z{KqWeK10vj#acnX?lVk@ zoi7A)HUBX1a&masmpqD&jD#E57g3Et%9*W} z({o+Y8$M0F_dVQ^Hj#Ww3X^mB9V8h}+xP(o|BD6Of{qQi4Fi@kzcP8y+Tt<~~chP>tYg zmVD#?9n#nSl5~a{s1D{9|HIljng}Y9ym0lKx|CUKuG&-c<){G1sJN!$sd^>4>f24L z&APUno3E(Y5+J&H9I3&r^w77w1j^^Wb=i-&ti;HJjI`^EK;_2MuH%_WmO%!XTra;T z)~+&1y)0bJm5rz;Xjmd~EK1jFOQ$?nA5ivxgNP7@>%7K#m)M_{!p`2@XBiE)LgjqZ z+x*5u>|cQnB`xbbh>V+-5imxsLQn z#>f$+U_rSJxyPfw|xpZ#%7TQMT2ivTaKMxmY7kE|+H)IXpa^-kdmxbxs5 z@CZfo@fhEoc6$U=&uZ3}_cPPtXYi(F$2ZHTyM%;b@<#Gk4i2l{eYzBFxeM8ArQm$> z;(SPE=-N7NUDB+qN40)xaYdfa$-rq=%yg)XPe%K2$e34l+MVWHpI;j(j$lP{wZ7$d~E8VRSNs*(z;e+G`#cY9MuaV{RbouIzqUTfB-P)pP&#D0&8!)aQ zzbG`sxO>O5m1GrO> zZvUWnOn^LLMj9$uBCkUCSX4=p2Q;*%`auVxT2ryco-usQPd?qr$v^RZ&+$&UHLmZV z?+-=M5E9aBb*teKxng zqqEYGn7OM_l{j3TYCoko>EV}9tEYe4yK)hv6%%5fp8)=3JyJdiF<1={w_T6+Z1N;87_1nakm44d2_KO#BpL37>{nD8SwN=-YH~@EXuU96?s)0!`U% zw!TbtXtwF&PJT3g{~8`vqZZK5Z)=i?e77buaPV^sHF=F)oeUWLxv zh;Ga%*ar{L;-!~g&*Y`glkK%v6N5x!(dc2`-)1BkT*I<%EQxO9(8Fl>hMO7ad`Cm zR8ef@HxVaauyeZU0})S3F>IVlox9qE$O=*Ww>nh4Ut)`al?iCS>Y6VUFKo7wRdq|Nim2Rvo{uc)uEboPTA=reCU*IWj@I)T_A0pxV6s}} zNWumB_ziH^r>LtUi0NKE?n;#{z%{XXLw%Pkx}o_mAL04Z?9bDzMI>f?TckHaRc|E2*? z$zQ%#*Tu0%PD+e^BkD6VIh_3(!y&qYQBoXh@Ihl2YRON%{GT{JIofCNd@Gp;Di)S} zeihZY^g4(K>dlxwDLcyJ6FnOv7oI2utEep1C$jcjyklP-3Ri+%Yd$EF$T{P$vPlN5 z%r(c+LM~DFv@zH8pWKA?M>tgGUGdAu$y7|8TBn~y-Q=QteOpH=+v_S1x~!J@hFb?N z;r^BMBU_IUejMIzm_&2#LE0Ej8jzchLZEo%3N-Z|YK}5o+x+C-y_B8#%~?;2(_OIs zIaU1Xry;%P&DIIonnj{h%D=|67T~IULpj0Y*Pm|o6OVv~?6Tjhtrz79_7`nZPkTKL zZ%_FqQ4$ZQ8f$v-$Q$CC^-qUZ`t0g~nQR+GqSe><~os_LhANQEZUR!R* zC{A=IG8~)i$ISv&;|HuQwRLMdN6mbkoeDr$HdSxA04iRMa&DBByOjQIeB$ z=FDAPZZ;oLlS6`$N!p`y0}_j)RwBN&M3T18D}bvbk!saXLomUu&sHmYPuaOnBO5%A zQ&bPzb75=Lxcs@yvVEfBxtnK9zpY24g;kB_Q`|Ihh)Z986o(?oMlthr3@$v2*55|a zK5smH;#y|V3ZS4Nd@-ThKecj;z9vaS!<7w8esgU2ordg=*0WzYR>{`0K6$7GJgC1( zV^e7T+AF4LCieZZXcmbO6u!rTsztFz%~xU?>R6(&_q}6x-20mfs-j?COP7sI@p{jC z0MBQwa`B;@99Ojt>|^HQQCsv6TkS!Q6~PwHlbWI%588^^Vq%AN{G~e`m!&>d&D` zW~w%fJ}?3#4#_f_h9oE$k^zS`SXOSL<(3T@5xHf)^2iiQux+Bl}{XEsyu|~UVQr#-`JPI;G8@$ntj*f)^l-q zHNd^z8!^rzWH^hfH=N5ja4+TDxHPC`mLh~E#p z$~xNU*cQ3e>LmiJy>P#nWpI1b3 z`_;U!WQWN6`w-9DSh|C0tKZgn42$4h?L=bMQ*%xAlNyKNZ*|6G1zAu0;-slJQB(<{?>&wuN9!5l_MKcFx3{?4JE_>)J2 z<;6|GHz6e4)-GK}rG+DuTGvOh)`Dg(LWgx;?_^PqI%igUX~9+Z+fF?|2+7|3{MjqoWltr6pyxLV_W)=MWNnK`=a26jK`6XV8LMX|P3? zohu3lyyu|)!*C13Qu zwc=4e4b&XeQ}ZGKsxVY>8;2)e2NX31pAuj#Mje$|zEk&$2Eb3Rfc4gx#gDa8={pEe zkcJn?4&x*{Ikz;mG_^jp{x_}-l{s)UU+$YluXcioyR;=&*-u;UYV@jLT zQ5Fg;J#ohbwWACX%bKwUY5X$Usd8+*vUsh+{KrQ)O|3K{OV@?-W!(-lH6tB)r594Z zG-68*$R~a>Hed@JrKlOoV67Qts#N6V9FYaI_%nol`(lMy2EAL{R8?+s_pu3Mp^hTq zXxbYa;q*Fath#tjM@OwDzbW_QrD3?g_j=WT*91y2s$ibQ<4%6qynE72JJzr)lSeD% z50BRcAR42F7Zpr~_`3Z3vZVFeI`$nouRn_g%js08%>SL& zXr&8jFdl}5vd-*sacX(hPvLVwuQ{p_!gD)gy;?^7DK8bB|4*Y>7!!SJVXWf#v}wFz zk_?nmh5K8{yjb>UB|(Ni_WNt?sFj3GKmz3L&vk)lIA4N}i$rLL%#zLEBb9Bl;S>AuJ4xgkMhw-Wf zx%Et%eq`xPZY`+FGU+sgvfOpi;xQt!FBo2jtB3KtPu>qs{bgZx&fH0)PgSJi-?c~q zs7B5_EAs*RoBb~qkV*2Z*L;^A*6W9TI)LE=3l6by63I*`oeEaju@O>ZU5xPi^2yNi zP;?^6aK-<~gMn_$a1zXee=uVtqS-oO_0H=?K;*cbiJzC;EU=36h|r)->{zVP#-Ql@ zgP?N)aP*NXp*d;HfBlkJ9)yJM+={y6kq`oZw!{s{-2gb40~h z$WKJ(5omHkaY99ggUR&G%@Oqd>ZYdFY2Ss7{}QIWbTX5t>*yj{JLaLULb>S=csctG z_q=NwS5XoXG__DQ5DPj~{pSZfsjgU-fYCl8s&Y^btdAoWNdf0CvTX$Fx+h{(ImMw3_)sOZ5H8nk7?_wczJ9}`q@zlA)4pZLv zS{{{NqEt~rffx;~3U38#7Z#dGzj>XIha>Vlf4qh+aCLfT(|R{u;ybRLV7Oz@Pa|KD zIX+%4e&IbRW7IYU(|D7%;^Q`Q@p^foc0!Z}un-wQ{RTUl4};(RRX+SXAjuGWY9VKP z8hyd%?e7Nv%^+KP{i*(u6e_|}$LkLK{1~6CD%RImAWa-o>*M%U(n*5Ev0tuc;?-+{jI6@eTwzrZ+I8*jFcAGt)9uFc zF3Tf%@@@6Cb9jyzyCJr(Kx4((r!xU85T{I4_K9ip#iYddErnW3bH^t0+qUCX5?6As zRoA)XCh5b0tfIgjZ^``m0@%(lr>tzJ0sZAV5cgzzjP-S|WWJ_Gp_0w8Pw09&@0Pfs z-w1)j>t-m0I9+oa-rTpJbrP}IkOasYS+?RT@Z2k!%`~K^O}_aj$QCOjXKX)NRdv1Y z&GCZHmfp1BYv`=FSfB8=iU^I=GM8bN8@R5Hn3FncwYK1KDP{eOpsBI^ub%3p6XmHc z#BWStET!bhPw#2Tcl(y9NY| zh1ZJ|2Z5d@g60T7?jQc`QrSq|8E4(li+bd)h0ks=9a%@5X;#p>6l*&jxnp z{#2T}#8w#JS4^~}OQWL9nbjpjqM|`s;iUi4d<#Ua6wFIT6r>m?te^rb6-Cl!3Ro>4 zOuXRG1{T%=k%-aj{S>*us)mxlC&f&+5p<@PhnV)T(Y2>*tG|jXk}#T@%e=gNeWncZ z1Y9!KnIEZO>EjaBkY41ZL7}pk3}wI2q6D}EsUt~vEVc4pV`>GdzpEM2R+W0lQAxi8VX|7+-i z_@5!+;^XRAX$yJ|&A^X-D~Qmb=FVzc%*n}T4lGnGcBDJHB%G6+b44i})K z(+)I%BezV^aRL`c^R4>m_g2IOqE?zddq2|_Ph9w3JuF-_Ura4GOBjrvjqkknnInjk|aq5Wue-pbFx4PIX*QPV)J|7l65fG5Bzf8Ct!<2j_#uv}&QKqSNA@Y}yS z{tL%+J@_LPq!Twub=2?P3+C%v5yPZ-;bTuRJret zspH?jCN>S*?I{ZvmROhK;RC^-du~S3 zST2%~WTFdRjfT&WU2h>U4{j?%uWpV`+!d8_IwbhN6rL;Ts+RV*d+j}T2)r6PM%*Uh z1FZQ$kk$3CdK>ThR+f3s-%gZHS~}o|k01NR-!9%V!O{x8AoyR#6z_`q#(la8t1d?X z!+G8D__D#&w$JG&GS3X`B|mM>dM*kQ6@sm38!oJ}1j`T=oL1N+XW=9M>j9zuypI zM%N{_^i?OCqs(Wc5(v{wDwUmL$q|g)QCg>qEM4`_BL~?o-Bpf8$(CjxSv%t!ce~ll zCNlP!dpe-8<+~wA@nyd6pc*ZP5o_WxYQ^QO99IjH8}f&aqn%-oN##2+TkzfKp2*;L z-zK}V{6=HrytM-ukn756SWGo^c$_<{`5dM8n5iYEIPhtI zi9kl#ANw=@a2_r@P9c%OGIPe~a>Ae@XBzD9C=8TwqZzy#7kZ36>F}Id6MAB7!0NQM zeOixN@Hv~sj>(fU1SmFnilYRy*gi1c?Yz6EnjmPwwp5M!-PQKi3$T?*^F{MfxUJX2 zsfE(lA8BsnW*J_k%F-FS4qJc1R;CIF2Ror;R1l(7U8Uc%8G!d}#!>H)jTJ(5g8wU6 zQ&z?I&&=&RX%R6NmYpMyFJpR7W!|Jf=*)|W!om!Md?3X6v&+skqiMaqbQ1?0==#XM z5L#a{>CRuv4sJiVy4rn@Yh$!NU96K72VkP-*moyp6XaAA*tWN<9^7HaFkqlNpDBbF zEzYlBPWx{3;9&@>&y%O~5p}g{e%Lk(|6@)_Rx^Y;3@1I@D;)<{(!6bqMHQ(mjwPll zY;~5I35-ull(LYo2D+IucS|!o8g;;(gb;k;KnQpj%SVa&s#D$WI81V=;Wl+j$MZNm z0{NJT=**EPuXT48Vk2&lb8Bghb$b0^WqI7Eu`pSC(^D5h;s6y#JtkCYx$?Z=O^%~u((NQ>&y^i10oLz3T;G@ByzVr)!&{cG|2y?f-l}rClN%wgJypj*sQ0F|mgh%jL?K1mX z^BFgX&g1NQ($Nhs)(<*#5u#(YUH~uOg;LKy6G|etT1dmem-(f$%}5rBh@PB~9`~zgC)W0`m+34Ado`@#N}ejrYijIfal$|e zyhQpL2?=;JJ})b#2uCPkUF#83N3*RxJo!O8alSW9uO7@@C`URltWjr*4aWFP&6p0U z3!sQ-s}gn@tPGtGWwhR?O1~ZG?k2=8Wfl~bR7p%p!OgcB#4{*WOC}Lt^i$-i7@&|X zEYJO5BBG~Ghtmg}-EjKvDCrn0ZnzkH<`fwtDM8qET{SKK|Hz?@`J})g`n1l)rWiJn2&`q6mRo-kV)^KObos8jnGI)$=VS7`W5?2Y4 zSb!F$c%-g~PQjTPdcrPXP>K9Fh>VPe;P>TU4Un5x55z1Lp_Zf~KpvsrMPPx`8#-NBf7bGL_0rcpl;c%k@uFnnpN61508 z5Urt1)ztU%C@Qe@3!NLYM5s=J-jx6rmXuf>)yGRFEBY8I?fqST=FGlj5a$3b&$lM= zMPzHSftNUTK$dG?)Mw#ozeWWogV^JX(}@I8cTc4-h@8U5X3Hf8W~{!_udA*fDdu7E zrSUVB6JMVvV@eS_TR;OdJ1H}zo^G82-($M{tbV;Y9EY>>9(Rr>{g8^c!u2^^K3TmN zx6#hCvRdT=L3~~S8*>IBMy4ppQd9eFiMxIV|1M^Az{o&Jr|U!|KS{F>DmJ#>{rv*LEdz|07}x8xfr6Ok!JkGA$qRGNg>=8>~6`lsDSRsrkvpMdcRH>BTC<3GU4z4Yt58VNcJeLjl{q-Mo+L9pE zGpI3hr9{=)g_XJDv&y$}*J(FDSa*ZeIiYzrmz(O}Gy7>K9k@zF76P~O zSxU~YA9&q=tyLRc_cQ$MIlOu*5nR`-GhpiyFXI?c-Uz|;2PpEPA%6*fOqm1B39YjN zlh1=q^=%0;IPAGU5#*z2eMuv3+NmoSw!5~P@ch(oOZIfF#@L?YGZRuLi@$b1lD%&x{Rc%%HV1~Q;DnmY*n=`*F;NYAbM>a?Yg{HjZkZrH@9ef&tZyu zY&inlKM$zmIz4Jm^WW-(3V@j`Zf$KHey(52cPaS^uXFwguXg${Eyl<6K(TmPC)DaW zH<6;}PF=6RAl`A5Y8M;s${SE4X_KFMbBuFl^?(16(TP##(6YuRahl5e<@m3PB`OJz z%}HngBM^BjUnEwuZTF`pDBclB0l71>Ad0EP-QEn=93#=F^A-2bmN;{Oiy_tH$ZhmL zKE#oq($ChE`czs#8&8(GfV%q?_8W>YXc60;KZ_?R9i6ykZ0Dx1yZ=6Z9{Wy%uL>9z zUQ5m^ZdE)h&mtkK68`;&d93rF8I(P=6z)Hdwx{GdZ_DX$SjltRtKOGm9GNzadQ5sHICg4ohVJ-p zB8LKlZ7Pq$1m;eC2Cw_xl+ltL$Ns^ACqJnrTCBnp4}(f@Re!g~|;LPL|AY(zIdujf^ge6xc|!F-H;zJHbVMpaN``H$naCmX`7R z9&d<_0m&v{R5fdi3A?aiJQ^u&0U^FcE6~&3c`0u!Uw4grzb?vXeND5;)YV?6Wai>d z_J_yYz8Sk~;1`vtlsVG(`$36N*kh8!50#@HVSNn%J`AUss35s}t-q?{=u>eHB0fP@ zJEwQA0bPY9VQ1^G`HYo&)keAruR#+fCxf8BsB)DM4$2@*68RnG2-1O2-l`0<_vQ+I zW!eWBN+vvY5K9U+xI9NoAWln&gV1{icfk7OjDJ^V|C=;XMj+=B%)S@{#o5{x-@uP5 z^S0&>UEfGz&oAKoh&yJFmnjqMGcP{I*5Pd=Lp`Kj>VkTN!64e*zm?DDIk_#~5b1II zwNr%ViCnBe!9G`bEFFmW9pr}5>F96$9nkL7*~tAYw!4En=Q*O;+Wj z82{G7t~>DBVn17Mx*(hZH$$(&-%9`O+c#QT+R9lvnSCdm(7`KEAZXjJl)fKw?$U(kg( zA08ewX1A;_Xn$W{c7iEA5k(K$beUj>)<6H(H(K@TMh85pp4{O~;h-S|cC}f{t0)#K zS8Xb{X#8r_F1LP*9mRWn&?n{``RZ99!ycqFcW!z&AI$EhP_d$v+yv+g%QQ)05c(|r zbmY(!-+$=WW~R?wM(6`q{fPasczIPl!%2ZD!)4;`<8#+q_WkKz$jbz!+8k0%IZ)ur zmtk$`wAjjdTA%qwX4#Y$+G0h8MX^|$Ny~6?+Dulhra8OEddc|6PSgX-n5;IRW-6I> zW69;ZJ>`?`^G4OL6V11C!Zy2+OSV@PVtS@i%Lv`yEm|mXAamai0gD8X&z-Q^DI#oh zxG8xX#24n2kC9X?iK<U{1IwLzMin#uGUS2lN64_AAcne)DO-(FQpRHX~;0XH^x5wvhW!V|vui6rYkC(7iw z+1V^sitxwVY_#iuq>>Y%x}n64;TPT5S!1F1W%s2397+UkQUwzP#<)dwW)oR=8@^;h z(7;8vN}71)y)gC9^t8!%DwL7R{Il>=bM_z62b05VXD+1v1x=7ec7SHJViX8P@(o4S z|2U&3xof2l%br+Cs^Hx|D%$)`u4lym1v7N+&ASPp(#c>p=-$d*I9;mQJ2w&&3!FHx zvb8nymO`}<7w>~KtTs8if8_VLF`rkGKMeY;fhTWaLGu%l%!`>Jw&2SqCMxN({%WJW zn;$#3^YQHCqen8mK7)*zovNDJ&SyCaSi(@A+))ahBpg^fHT(He4LM$Yg+G@80Wis^ zC*e56=n3N<3C!~nDk``Iv+#)k%)$7cd?Fz1_w8H{9UYP=Y`mYD(*}Y1%;!IBvYe!) zbps7jB|0lNnOn^s4>Ioh``4aqZPRMkx#mJWf_%dW%VZ{Pl*{0vMdCq+q?OC+$oCpz zK$b36S|+9qTn~fTUzV1JYCNW+1lw_~!^1N3pJ*jGp?P_E8^b#H8oybk%tv;DjQ=E9KKU4I1i#F5r~lsdI3IVi7cC2}*fYGQYs9=(ty}ZPt9kqy?)B z$$+aeShj8ZUcXXoA`K;AD*Vj#yIkF75;XAYC$(;fxZ*A2982^Gn$%^<5|9E=nK6PV zPV08-){9yIA>sD zT2H9r)J`*#O0$5mXrz;zS=fFZOT}oIm2$$tPkp8v4vNF+>+8c9UeA((vl)mcVedBl zl8&t2QdU;B>Or0gvE2H8T^4=KicmZ|LQ~!a)S0ouv{8H-&aBXg{t>K+v9Fvz;H;Ob zgU;gV`KycdnMw*B!am2ah*jA4$zuvwe878c21{CLnGx6LZzz%JJOc)XFyp|bToZan zzqTclRL@>@IZaH-RHYn>S;qv~7fR^rQ6-tdi++giNZ2QlM}-+^m}G|E@HzEaFkw$a zxSx@Wu%0MD*gf@RZ4`6`+)K4Ph=Z}*5cV$G^ph&{b6-Dp^pvgVfS(1p6no~h>S@ig z_jk3mxeR4+TjeTZXW)4yR;m+u1HPSvU)a7Wc0q5B#%kv_wt`_iBTqM$a-kCe1YR2l zc^}?)FN?ZH@~Pg-dHSQaTurqC^5fmfT7+PQ!ah3Uq6I-8mvw(5Z3RTBe7%*R&rpykkLdWj}f+>Nm*5VrYgXPz$S2Io{&v z=GMvFDGl$8>oN-fxbYvc?L|O;lg~dXeR3a=`MQVBkkWA|q;m>))Rpgw=Mhl*6@W`J zM9R4QXEs3!MBvxf&bCz1hn8MwaX4E^7~ze8*d48oTRI+E!kroBlOCUaHu|F^RQHa0 zB+Y>PrT7oD^SuG$Axip~n1l_u`LXFNl{3%4QUfhsQi&ZY4-vnO(lA(DS&mZWw+uG0 z(||Xl{JU>rNVeTMlktT$i*9FI%+}qvGPbwY^w0Pt6Z51f zIN-D2>6s84{3N~&SqlDr458i}dfjqE>rrf+O0A#rWv+N2%LfDLAC%-!f$TKfGD)Bc z)MW?HR^W$DYRU-{x9WaHPtLrirav~0sq)McIzWQT3dH#jkgTpgl6EyX#RBJC|Lo54L< z(4g2h5G2M&^){`Wc?jJyHsWMgn^)f7+p|Y4{f11+=Q6g+!e=CiU5jq#C4FL#%{BU| zDwFzZ*11WW-2}aI#oY$o@*4^TFa2`Fo) zDoM$qw5H8rg;>18tA!b~-bUOIQoq**(-=Aaz9AQehlhV!=JLP&Uo0Sz{S&XpOh6dj z>&9$Bc2@Osq<2a-i^6kwA4wZ!1&vJdgD3@!a46Pi)BQc%~A4CO^p^cTYMwMnU{8F#H zBvy?6FBS%8YG>?j7k_hVP#z)G8&awO*$27*d*y-rOz%hH+=hTWKnUB=i!;dF7zTEf zAddp0Ynwlm78(^^88z;UpA^UsF0%p8uP07_iLyvGF3|TwPI;7pq>o6|N{Ou|mA=g) z9?QjOyElvehclq zr68(3e%LSS6j}ta(#DT@pT&V6`nTTm6J_S*NHG0wPS+<(wrJ*(#I>YDOC?=xA)xUVOI$W1B1IM$&!#rkC!qJp+( zUV4qrbV^!RhRI-l$i=nyiTC zZYQ9VKW^?uZT@D;%ZDoy=VV1oYa`o>UpA5dskxV`X;u|zy0jQ*`N~;msa2}Qj9X;s zIkwJJUL}%JbsJ)Um7Ic;tmcqAC5BiZ&$wo87=Q=$Cy|a;0(PXG@7lDp(i3IUnOcN-_HY-8zjes5z%QQGb)cU{@2SNxX@fq<+s7hW`-+CH=`$ zT%c#0Rx?&9wNTLl0zlmwEp^)ll}(?LsB)1 zkB4B9gr;YM9^HvM`|e{#W2{v^b(OYN(R7~@2yQm>JE~M>$$X}tU?dd7x>e+TuB?W@ zEuH4KQGnv9!~{^#We;mfDwJ##pp0( zzj&G zb+VtjVUiNc=wZ-M#g7hxRi{f{A&f?|ySkf#C868&SMeqS(m0~Rs0bDXm{uIAE>NwmF8J8LbmYLnAbul<>eb4v&-Na!2Fb$ z_uNaP?+!+;0bf=XqR7D}AtDHq!;agHz{S@b2TL4QEhA+fFaamB2|xysfGKoUuq{NJ zUQ0qYbpbX_@8d?|@jIY$#2~I^us3^PmI7?(NH7!;(PEMNsSt;q#E_yZ%mSoL=;qOW z7}bHHa(2U*JO_44CBL#7IeS(`*uoM)w+WKlu9XtO%vBiPc!*#VaV#!DNCW8CigCaC zX`EV3b56zzFoD1rBNVf0t%XLCjuI&JjiYk~N9s0}6q8^XhWMR8rwFC0PVnDCQ+Nd>)u>Sk&a4n!yE3;&gBo_)5 za_uWaZ5DjKE9zogd59ylxAl<(?t>ZyY)-aeKGyUx+OQwibrsA~r!Y-~=-?*gLZjF( zZxeS-O$&Pqd*Zw+X#^as8Q{-8z{G&v)ve*tM|YtC1_FInE@hXrbgf$+npR3p^w{JS z4hn*JvHf~%Bzx_8gN;b@Dl>KAOK<6AxD9k8pFbJ_O>CC<+0^W(zS*+C z;SxO)=+q>6VHJc8d-uTlt8pzX>lE;;=D#)< zcbb{MW@R$SA?xa9$~OETc*L4QyGLW0uKVg;u8OtWY({^Hnd8HN6Qh8Co%iQ2v%x@m zFy%qA(zTjZp!WfYL=N3%Z*v*rj*UgJ_CaRj?#21<-*Pp_qg{Qdeiw`aKw`~*0*S%K zy~Z-t>snp(mmDsK%mx9#}dtBeGF8Mo4t zko>*8w}IsZ@8a1<*2`Nv(wEYJ%|VJqS(vP}j_aH4Q15(~&aa*C9yn8PhGSsY6DO-U zkWKhZ+PVu4HE`+?U^={BqTHH;NfUD*4-rb`MM>*SoRU zZM|~Y>_?M;Wpm^ji~xK;h;%ZFu~xR-`*IK4zxa@H$gUsXHIam(*X%x-%aT{AE~j^^ zFU__eb`kgy*E5`s5yE^0NWVrpW?XMjua~aUStW18?vxT}z&y1whj#L+Y_qBE2KuB_ zLs=}TNAZ!pa>49J^MGU$nIP2?G;&;|GJ2x!wTQa~Gsh$LRJ?-|3s`#iK*c}?@on~S zRi&RH0l0wIXW`@twJF3bAi3L1(OLv47n;Bz5u#E>F_#nx07PpkzyQQH9>GW^c`h|c zof*p7y+d4GgpCBLhRDQFG9uAi85HfeF*oNe4KV|QX+Z_hRTJB|ZEzz=X-+EOV+e(; zB%clk`Ol4j1o&^@ny7W0lHh*8quEl!Tta9=E;LL>_{#B#r?M@@Dn2Z}K?|d_Zt?u8 z`P53!{N93h2=AW(U|cud-&}ICW-h<2mm6`5Z0qWkn$k!}GG%{rw^8dviv87`CLp*WRbp?1z2h`)8k-);<~% z=g{6V16#0G-1r1&A3xHv8|z@?#*Ce0hme~W;% zv$fy#X6+s7T1}B$M=xCuVy6`-Vg2HY-lJH~xtgIgxpmd9CWDw(vRAX_HHk?OXy_ z4~qbw@O?c~aF$uMC-T`Y0*pD=YrD6|a)DF(48UYt+y8do`|ZKQS0v%w{P8s~v(5T> z4OZ7t5?4~p3b>dqUf;c*#j*4o%hXxIYUl_vg|7~8hFpV)-Cgeo`7v2;0%YF_kwXvp z99}LZ&b;kh;_m=v$<~&z%l9CgxZ-Ol=fH^|h*bp9ovz5?cA_qBuB4tU+EWu1W;v+J z$q`pQ122dAJPt4LC~Q)rP_l%sxIL=j;UagR8<(_6#RUBK369_HuJIE=z5(=V%&X zq*WT1imCbR5R?DSP)L*Rv0LZt?&1b@l++R$@9A;BUGYq1+DeG&C+|+!9p-U`kDvFe z(yLnDCywpj51VT*OWd%Tv^#tyqDRDWPkt$Wa-2vL*j?AIE<)$+^nd)Wr|{>sQ+4hz zhb8VwS&C83WyOloWe1Fx#Vm@ysm>!I;u6;9+}7u+6!lEV)Q!W==PFn~ZlDxG`bt7c z%=C0nhIs9LUu^NuFDT5I{!s6=9KY7M(+$>N~Dq<)7hZ?c3 zx28jDg1?MV+!w-6uH4&SFLy?p8T%K8-C)Svq$I{Ncb!6r2bkGy_;3->FGpgPI_k~) z8l7$jvC0L{P8zaw^7SLvpD&7diTkB~03*#fvr@X7Bwj+sfiK<~qbVy`bdkc?)FA-| zWnr1z3^ys|0S3&9i&|?7^A&ur%r41ehB=+J=5*H`S?Ifz=)Qfy`kzlPN5avOV47D8 z5EP(VcHV}&^y);(6T|KHih<)j$iXq_l-2Rb}2jQM|Jf;%UvF~5K?KWRZO;mX1cDmGPei&*U z`bnwJLx*4R-4f44Mk4c7J&CJ2jzIPJkTN7wHKv8czg*2H`)_p1&w+irpvs7v~}sk34RU& zC{tOLt3>fByl!Bd&HJ>(%8)E}@fF(Gt5dR^flb+CfaIA%<;L>$BH^E^m+3;44|6kO znmyeuEXj9%o%JS^=`_1NAQm+PR!Svw_Rt`)aQihdAeVJz7y|~tR?5paN-WEijrY|t zCr>8$9*$;Sl)!@N<*}xgn#x-R2JQGZbgz<){XFN3iC!=95bgPn1vRp6{E1R;`6Sga z$${LPr7wZT)?* z*zRFt!~cBHyXxt3O}qI#0jx{VU?WNHBbW3G&o~*(N6Yi$v`qU;4|$Hr{*S-T%{%>% z62XEi=*Uj`Y^&+lUOrND(um6cdo7@iSimuf@csVI)l*)nJvrC+Gt{)aY>jO``J=17G4*He&r|ijp1qCL7W^h+b!WZns=Q@x3G+LEWkpoZ z(i@SyD&MZ8305!NN#{KC?q0T#81z-$!^Pm#cwDpD>TaE{a1(ll$_ad^<@LRDM_4me zrnG?KI@4=)+t*H*2O7{IZSQmOxVe3@3*1R@3xSx=m?VY$+jM9N@4={gRofGF*V}@t zJKz14cHmj{#Ydk_KVyk|9{WKXX1)z6T+#CE=i)AxQe zy5xh;+j0s_TJJRX#YRbZFg$8%^(VXY{!yA`nVLgFex3UXh?5!o&S@BF2c$IwPXOeZ zl6v_#+8ZLpaD6|)Ko94xj_bbLwsq@stD-7VCz}e(m6w&Yt{2Pc z`8Is62$f((5&))y`&vDhu3`^)_6%CUscW-2UNsYmJ#$m>JRm)#KBaGO&T^GN@ z`eMKHRehnwIgMHmIBwUg2YWrA2~(WRXeuf@;Z!p!$gO#1v`mqNmff3rbNTnnE&rRs3#3!GDP6wqF?Tmv zj0hMrwQe?O`@1arHtUZP(l`KIz0c05xk5T?;EZakG;WWE-)p`5`$?NB?ESjet*eI5 zWgO(a##O2`FAr5dF0N4NNQvXo1QH+Q6G9r`$^y7iu!QpT1t8=)1In;-VJTe&`B`A% z0EiS)vI@{N#_=K{-AFd7BD43k`hudu$Vdg6Whl%0b01J2(l)>0;hgh2W!)&fNSr<6 z{Z5FGAd@1GIB|s+FgT$OLs$HVD(#n&M(S4NcI%o<#)%;p=oQgzOH`(dVOTqFIn?h3 zsL~&UB+OI)f=r+95$)lCZjc-Y>)n~DOKtIWXwKK~J^h^V-QAsHFh50dT$4)K^p3U7nf%P zF8CcZH%YFKs~w)uG!R6>q1C3p_srq#4oh%QOQF(>^4SGnBDEwj8k-iYNuB2J7NxHx zB4Xwm)!m;~OCpJVR9|_zNtCtxjMw^H8CES->U0pjod!NClgMv_W0eyuG`cs^QA3i7 z8>8V4-+O_w3_xHn=&o^^4jJ65V$2@httdUzB*Gm3!5KcBxJPXE9)j5e41rvc`TZd< z2Q<4Zk833+NPoBhy}_lT@5_?(N`LS>Kqh;y+0CdZ@K}j@{x%H#7~nisa-n~dN`DA| zon0j>Xq85rg*?iT>&!67a>M{ zBW>65k`eSo>ZrBG;+R(%BRV*7>oDPZN$@PoMCxIURVhmZRKFxR@Ap6pmiWlC zRbRVg$xIX)NJ*H`(t}xSZ3;Ib8*Q!C6@b3|a1+RY+M_}p%f!Th&Yw4a7lY!R3?Qjp zV=T^3CS^8%Oio))S`JSqW%pv8erG{I-9xdVbVuvKpuQedH2=3v~On z_gj3Fiu+8W;3U{5A!HK)==nwjVo2t#YvbwhSSFDHAx)W#=0svk-RT;Cuia}4d&N~0 zv2UQ0NeNJoz81HN7C60`k7pP11bsis^`#*J#|HpHx^BY=^5g(r)J5C#gTFVSjO~|q zb$53YVQeJeZo~3rz_80wq&|*x<)fO?y2S@>n?m(rgzcdIC4%s#-LDeW1u_^p86fWR)=quIEdWVhLgN zLbhkTGu}#nN13kNLiOA9l>oU}X?kP$@Z2O`X*lc=F+`b^>Me0z_gO%>OFb~ycP*fG_xNJ7 z(DD&hfvofg&(eVsx};GAO0^qiNqJzUZd)MbXlS*fXFqp znS;P}qsA(Pjwt9c)yAH|1axQ$fJa6G(H`$y&6-0dPyC z20*`p7AG*qSQ?s-hYJPDY=-##gaP{0I*@y9Wsf&^3p!93bRbDw1ye2_ZYL7b!Z2_k z_Usc6=s-PC@l36AmozPj{u<7P5zP@dM9Df>8{s z_Fo>sfl+4CA>l&cAwkCCF#|pQ*d*|wdk?Hl&RB+^1ZnP2r`pZ2ZTEFc+b+c|<;YCQClP^|H#)^`2YBW?jVJ0+%&JP_> z4DmygFHSVxn7St?QPRzz?464nZbZZ|rEY-(d9Z?v?{$66lK7lUe-dUGJSx z0HRL%gDhMrYhq$zcQiFJ(dBmnB?AM4Y7cf;Xe&u8k9>5Gi9vUvG)%qOP@Z7>TV-K- z_BE`}wy>}?qByVY;z5G%zz3$&tLAs$X*Y{GrEUZ_x<+fpf(uPiA6u(XoWQek(=+Dj54WMpIv zaTPT+wIpR6MLO60iOkVpKE5(x9w7>%vc>uNY3_LRdD?m0k1#M&WqGi{IW3v%MR)j6 zh|ysvVHaq@ZVkX#KzhA>yODSOi*J}_+qJE-7CH27<@~^U1cZC(tV^yVkU^N6q3l_M zkb`dJTeB<1$KKiKrWWB#E+98GPGJP*YiV!KL`O$95QD>GIYW^>89EYY^dY1nIVB|m zLrqSi4a#6r%+<3*;`ZvwNi_Nav;0G8ydF%5Y}t~m>(graollrSE;=jSo#>F< zJ8LM@Hz~e?ZIfUTieA+;!I3xLu!RYj6;j!$Eo+f7su*sx%(`dGIJ3alug&$BJ6{w$ z#ipT3t>H8B7r7W($mD6~4@uYph!cQ}hP&*QhrXur_3D}q zb*B4^{eb6O#rO#qk(;Qjm6w34?z7cdi5d}7LEJ3yrXexwH;HZrH%hCL8E=AY`kSN= zgP)U-akv&KWsAdcnJYC!!KylR*uv0@nPbcX2v(i8KZI{#E0dt1p|%2?Q?G|S&NT9G zC#H;axg?BWGe^kC;9SgHeeOUWvxto>suDZYS+@;bgYX|_M`{T&$(DDyzYY-dp+El7 z)4%t}tiA7{5`!S}+xIE}rxrtPcchd@k`5m#g*cIa36R|WJTl$emAV!P9#%{?9}bKA zsj1@&*p_O&#J|@9{HlV4qXNjtz+vLqC6SP4=$jrWXZ%zPB*|GIi1Fa!8j)0VHr<2u-5w#vWzc2R4t$;&>3D%sR%sr)u zgt%!$4Np-L)fPKLM;M7wEr`MTj*%gfe76ei%n`7z9_zIGfyfY2%58o6Wa`;mb4 ziJq#esx6ijaKi6>)7cv~QWR?FBN|79`_d0M&{o<_yS;AtmGz}njb1|gtlIeI0IzY< z;VOEXn=zrc@m>RKe7!TyPa9)G(_80)Und;BKwDmVyRkC1AZiQy%Jr{!Mk(5`WB!5Gsu8Jr@)O@hCwjMo7 zB+0b5wKXMy4=Ihrg!HuILKF%3@ZaRjO7k|&43vRJW4Yz*U>a)K9X)Z1!9L*G{H1Q9 zk6Q5o46*=BWRv+3P3~&Hgd656e|>IlF5_;on@h6!kk5*8XWr5XX33pbm;YFp0n4<% zoJgcB?|2iO&pV6d=^LN9UwhMuA16s4>K(XMIuJlHP^;nm>W}_yvxlkBPC?o_1UpFc zA#WAGlx@?=JM&Muk>fWsC3O975~jwI$#jv-76Yd@M67Qaa9tC7R6w+60kWK|=YkfR z$i8zn`5;Cu2-{^E2%V+tcPD`P5^4bE2r;4jgey|dzXeQDG)u6t;*4zn#jSwk4sjK% z!x$n9iTW1HPx^Lj-K-8y3Tq9WGNx%;bLWlfAFF4>eP#tfL#QZOG1QFgyG6FUq2dTcMfPOOZz@4b1kmUt;le{da|4AFCV<8w1 zn|2n7ARLxRqfEBGxO4gWJ8s>ic}JG>)Z{0`#24hr{?x@n&3-UIk}~=6l@?HfOnEDP zEr&+!Q=$!lxSV4}uFom?Mu7dz@-G}D-}^3kM6n+|SW2K4h7k?MFdc6Zx<;95LkGMK zNh$@QzSkyn=pWy?f=Gm`5!H6i5MszNrus1*ww*Cv#F(UHusMSdOPJ`yRi;1IgL-=t zt_t*#)flYFfe1QVvc77XzUr8S>Li2#$B!cXc+0z`5xiMR-~qWj8?pRc$OsIuLgo3+ zx5?jH4c@Jb)coq0x6a`QPXgV{=>Nm^Qn}Z0?{uI^tuA!$L1t7zHcL^M+0N%~=xC{Q z2zS=Vo54ud_UZ7x!aM-p)%*I9osORN+M`{TE79)9!W`SQTS@N!3n+<%MDk)Yp1Uj_ zYq`tod%KzMdw1*Ux%b)2;pM1H1viWHG~xXDZ;HhL@6Odgi^nugy$l;E#8Qi>{(iLV zIBu|l3n%s)LS%&WXyoW8L>URplq4L?R7(?XNch$vB-UhE3qM1aY;o4v3OoZj-}8YS zYA zvwk3i?yHfGnu`3gPN@d7Z1L6gD|5h|h{NTGv1gmErzbwJa+tM>e9$zzb+S=s*h3LQ z?#NPD!3JVKx(&TGi9+Z5YM2@xhI!Sx+W5ISSW^P^uCdZaFWP^$hhF9Or=3j+HqxDh ztWinV;gYEGX2caLO=Y^nG01nAkx-UTS&w{~#XIvOPDPfX1W%B`O8$odQRe;P>%7?m z=RQqZJ|RsgUkp9M&iXTOihbaRfP{zHA+L%}s1~Xlq_$AO8VSe*#HT(&>D8yjd=ttV zjbt8R>BKYJVq-GiFRPM3XH{1w83>RgXwu{vbk;wL#35ip+J~dABe*K9D3_3JcrBFc zjN-&e^mZ^f|7IMZP?!pt(eXrc)mOjhDAu<;0PT}^Bm;2hSt=(+>>d-&QyQMmBR-cd_sgmnma*hwk`K+GZNSH7ei zS5ts+_;hiDy|UP>4vd4R!K4u)jhMv1f@KP8Hxg@X+4UHQW&kXK0c2fifTR$E5FaO6 zIz7oK7K;;RpXrh;nM$d6A7&!72jIjZSw+3kECX>R0mp`rwZ9?i0=q9>f(N1)B|t@4 z)r>LypNnFzO9Q8hFI5#Wi1-b`w**EIcMAJNrFJ(OHop6du8GhC^Tf~AoEy?=ftjo| zLSmewDFBxRqu>s=R*lyL>x6-(m=lm$K{-prr`g$n2V>+b{99Lrr#!8MR3}tdfPe{} zJTGp>+WisSdxK&$1Hwj#wsgb@?9!nB8{Gg{f1ETgu1TPY6c!BxAhwD!4X}i`JCjPW zgkB0zR!$xO+wPGhER{~S(gKj8soaT}yQY+)qNkO?)-*Ww`Exv*gHLyWG3$|R^dGE* zjeup*MAHy}CTw`gAcn;QQeKgf2d%4N&Yq($XNjS!TW225un_jtG^~K%pjBNz-1HTyNYS3x|OO{ziOHk{7q{_@e@FjQSwa7Op)5g1}|$CX*l0!;3kj zhClVgh|GfMDz(7Pckqwsk)n0svwxMbrWrNCGr<_feZbB)cepn1sXG%G#{qCobFaC| z3>J8BLu!H*L`f>Q88#OtsS4?${i!8)m{rgm*|UBp{c7yNTH_+MSwsM-;m6yuEkZ>& z4A3O)|3Qaj+4=J!wW{%(V7UOZ@phS zt5g|tj6?7s$9U`Q^^umWqE4=pqq}ghJ1qaWmDA0O+p%0M3c|j>Nmk#Ywc1lsY~qj$ zr%9F-q;+7~OwB0{@f*|5TLPWxNj=P0cp+rLKslwFA}Ws|Te`0VpNEAm+`HiE{Wi3a zd@*Ua=&Dqw^F-r}LJcShPi+Zp8Mrx|eu6wzJz8jM?*@>wSqY~-ulIPau1QvZ*&(~$ zbteKLl`s98eEt{>K3}#P^hH{FugY8 zMcS4MSW*^4oQqdQvgw|oD34D^5{*r}?JiR!5wa`)gc@>qpZ-3rFBd=%jRu@7?RcS% z8HzMDFq)KBToxp`k_Jhx^fh1sibV)F?v}(l7!!axjN)KY7~$OxOd&tu8^Q!dZVV|$ ziX!oa18Cz(a&Tb4#(uqbL*@>^u>`?)f!S2{Hd;GnQ1ZXP!30^WYa^2PrqdGuqdn~& z$ktY##Kxjg=YKR)B7pF!XQyX!VtuJ|?QGGli8Zd%FP+z|hWRTIN#49gEJ7HmnsU(* zjmQfiz3Mj!aD|{DgT{rZ7ZYT~rgFhIBe8gPg>F<$LPv@4iUa@?+FL2`?8I$ZmeYd+ zpX)VL`(MYo_PXvvlp1RY%)^~c7M9l9-VxDg>K*la04&l01mKFGg~&mI7cRSn?0E;a z8_=*5Og9`D8w&{1N~4<@8g6NHDqkMt=db%X-y~4xr!rCw4659W+bgHF5E=pU>MFI! zh)bo*haHe{1aee}q`Mc*ffQ+`02rOna-#bp(=om}oZj0%jf=$c)mx6nOiWxfUpPDZNz?>bkjUr(7j-5(bx$jc+(K#nUq0z;eSCTk73O71n!DmH~jQ7Ol*gLv|o z4Bm1e0D0BVavdx1w?@RQt|I|A6NLft&ef<{TSRYuEbm9R-Jkr?3NeOm;bmXw2EPQkt z6eLu2U!tYvKu&A#T5RW!sTA| zd%X0FIx`Xv?l)d?uJsgPrTJ9TW$J+Tmb?+a4ZK=6la|b0Md;uX6Qh0DsU!8p4PBYfL zkK&8N1{dxBj9d%5N=DJlFK_jOg$m40?>DCT-z^`hclbZwHTl09M2+S z@$foh<^O)W%vbolMRPV3{2_+Fp`ihe+QQa)(Ok%5*zLjnMvLO?v$M|gSvk!2XbDpm zh(`W|^3bo9!e>7`Zl@IOPJ$kI+xcS73cc4{Av9xjxjkDh$ zUMTqdbN|~1Tx0;xuo14w?`!sIT!L4=|MM&4(~Aptjj#8R|9d*gR~%CT$gS*0cDI|F zU{o4LIz{A#1&+6)d;cy#GzbQxsV2JQC_${Or{!}T%h(3cUnf6!y`LIrcO;^b>?;6` zmG7nCd5)vS0$|4~Ek}Jnm;L_z@s7!=G^H_K7pZ~&I?8^wC`%x{$olD~j`wUcOd^6% zVCXxU4*_R`z}?ri!qk;6zV98+e-n8(e7P`<957sB2tRR_R+mW&J_LtWh(8rt^|mNw z^O_6KjH7@9h)Kw%$Bkng-|jbZQ)4VRm~8*uO#AoE2~hU~#Nfr$tq57%&340-YhBYi zkaEZwx*nqik9zcP!dhhJpPIYSiFHlxTkh60_$mK>j`1JG_AYIzj}N?&!J_}jV?HQ` zlQGEPcJgC$>VEfHfp=@^7mG~tb(klcg0@3LA9`CNEOE<*B{k8wt|wM?^oeQC&Nx>( zaM!*sRKj<1OIyzBx;F}5%gz|`3`Mi8t!*S69$ne5rZhyL3_HLWm3Qm8;XiU4omFJ( zzDFYpI$!+_H@@oFYEwEX04!~M`!|ox>kiBD*JkJ`4_^S`-&kU7$6K3z7MHn~lHr5m zq1(P(Cf{2+PPX&1m^ry;xb_ri*#N&`KL}Cl?E-dVrE#IN^tpU&VZ2l>U5m&gK-owc zFWz{rB#SyE5R9QfS!T$D6%wGe-(eKv&NKaQNEiL@^VmVW`Zuk$Q|iO6a5?b1z~wyB~I$VbL3d*td`c7A(oi{W?M z|MTllAVgaXpVQ>BdHsGK`+xwKjyoY1beq6s_}zY%Ol=;@=vNpR#WGg6u~uUsN+kp& zSQOG77sf&x?Ei8*bcokb~(0dY~IU0;fS*G0%C&`FnB z!@b+3KHxANKaLArzO?aj=MC$nlKy|OgMl~>gV(j2NG8UoK`toh{cI*2EdMRa)D~1; zS-y$O9mLKDG5EweHvdjcshYA+^5?~Z42A`C3Al9-TF#T1GIW|!;YkY=G7+ILHqE<*yAdTQ_kv!kdUt?&#!%s|&Z!NH1wblx{j!MG1BIFS{AuRu`4ZAqE zQljV)$nGjC%Azl^w$OUoTIoai900;C)EjL>58#kfFmaS|1aaBQAPmrG8Hk-9Y%~ts zbtp$0Eo^s+F8p1|K|BXQ0$$Bv?3$23Spyp`bv9aS6M5u3x_5nO5O^xlnR{yeJiC9- zD;|p-ThLjl9d6^ln`~e{Y2W+7rghECFc$;y2HJdodjKkNdq@QFjgU9UPmt)P(*IFr zKY_Bq_WjL0r?BuiKi0vm{SMy{m`YZas+7jS#sLzs(JtHc+eOP4KM>3DW$fZhQ4|#* znsWXsH(pt3d&+i~E@~Nkih3R&9Rd}LuNl)ystuK+nNKH?1JE2J1((JJaCm8-eMhR& zwC+SPDaABWQFG}TQTzoz@%ZiC{Dz`oh(wvn>M`m5Y$jV%JKbfSn%|!BDzh!~A!-3F zm@giJ@9pSl;(oo4s*sj%i3YvNdN8WM76WN)d)q)mqy1d!ADRPC?O%`yRv8H9a9#Og zjd0bGjAd%0-K4fiK@z^$KqM$)Z|pFugZ4iFZ?HU|EPXNOw>l#=*ftfB#U=)ABnEb{=!tni5m9@DM`5#37-mWYj~|-5cWcVTTim=q>)`IM&9AERjot)5QzmuBY@IYzl2b3uy&K%+H-}-6|Fs#X zA_kTG%g5LL*+v&ytv&gLG^pc-4G_$<^z4v@QF4u=Mc!KDJ9O5%Zr&Z{S08OO#9o%y z-d=(0D$)dpE7(-mksnM3%)I7~ZatQi4Hr4sbLkHd=|nh*=4$0#!zFk50IQsoD-`0q z$g|?VRAZ_EeV7t-;B7=z$21Ha858Z0C=Qe9L%$ifkt72M>k^IJgBwU4XmD&{j*dQl z|4xSlvW*3`kg$}o7m*I}cv0#m;O^S^KUrRqc)}51QEO(Rpn-k|2YOf6`ioP;ujDt! zfWH)2nhz6fGOzCCj2KrnHN}(uWBI)ZWz1aaEJ*kd> zRYuyUT!Y-)FP?*rq4o`zh^u#A4_JC#5=R%p zE&OgZTe}Uo>se~)5>`MZeUcsx!FA-Po?3{!a|R{9Ak5StUpQ;=Vz?4R-Ld> z+Wl7KC-=*r-+I7MA3Vl};-$Mk@Wj~v$^McnDmMp|Y`-KzD$=hQVNk34<(EZ|Z$G-t z5Y26t69UjhXWdWN9lF$M?l^tq3okG_GRT(@BXRwO?K)7J4fbWAn-tJ@*-yB*DL{Ba z41?&4rB9AfiJ{g2xq?g32o|y?C1x2&X6Z0e;K=@6ZsaZ$%m%uy0gPF7)a2AQ0c%qg zi>0JDH+Iwz5iSm3j@ThH&pQ^K-d|6$p!mQ=bGb3fK49-NdA69{*GKmJ2hg#a?Vp92 z&bjMJ+ysWIrYfe@2Ln==_0wWW6*4aNVownpQG6}7GzT8f$#-vuFdUG5vEcl9egF_r zMqF@62O<#+0OrA}25<2n%i|Mh+qHjbp#TvX;Jb-0>oJqpR{$sjTu~5wLALy)4C)#D zfozmk%Je0+naT677WsNP+&x>q1{j z@v+J0fY5O4ss2Cu*%flP~2*X-Q4UikQ;x7Ima^wGoYOp#muGIkrP6-0_`Mrtp$)t#j=Lb>)ZW5bRUj=t5;kzXFp-wN|7=Um1RU9j z^Y^gqpO$5bdsXK6DtmYg;xa@)oBWYd=<90%jVYN76j91rxC6REQV=|emQc;qagTI> z?eraZ>lf>+S4LW3g&9y|b%pG+b~6$UP#r(9RSp3th!u>H^t@j5@UD|5ACWzFCy=na zX4l*o?e*g@q#P@gENXy4z~0X0XU%DXOp< z5^v0dlPU(C9OgRWup`C#XzqryL_2awXr&;+7VbITBlR~=*X-d~tAM$2DBz_(}oYb?8bl5eoJ4>1;PF?-D!gbA)9_R;l33%!ql=Ak6>fZ^?9#d?{D2 z?1kZ`^=f_=!-Ak0kV5Y!k)iODrc~tP=CWBLA(CnaC=N9W89-wgKvoA~!-tPIDm2a2 zspNCo_@^(02-{~1(WB;C@YVA2`cKWn$R}`^Zkk_PFn|R{5_@M;#tut5au zbQWJTfEd*^98+8R7yDa=P!Wm~i1QFI?ETg!QoUSnK3aJn5&{D(jjpf9-2A7W1rZTZ zB9FmV(C7Yb?|OtE~XmcD)$_05;80yggQ z^72dcqWD0h9CS0O@I$vYKrOz=Pt=D;r11Qy`hnB7&Zf`e^;n<4zVq|aH0g3!gqd(4 z+s#W%N+F!uRhGk-n%a1+ISzgz)$j#ipzpvfws~bXNmXb4=%gG?YGM#qKixF5R93d%z!U=Sr zogLYCmIeZ*@sLqf_}zQCI8qOXq3; z!sstpn0`>W2J(n&Y0PYlMQjJVZIfL|EYjC>!q}lM*YfHz1UX@y`Q^*gf3F3Q5nMd; z>iMrVJLWsTc(^G9u4wh`A7kxYYfk7fk}Ikhd-0v52g%7PV|0g=05?NniAhZ()-RK0 z${rrVe;ScYe7F|Tl$M@e)P)9Pw^uU4$n6|O0+9N|!~KaN)`OaGauysffD? zO}p*lKVH$O#S-$QPhv~t$3~JrP4m_%e^WsTz$6vfj*?t9am<(I0dg^@$;8c{#{w)n z$gH-G?$d->Gj@h}={|WuykKbRjF%Mk~@c!XBQUMuC5uV)yd!P7G^{tq~{(&#xwt9Co_I;d~={>z4>WaC}WgmR9P>0rGzj+`OV z=$S?OuhL}(afPaZN2;WhSu+zrj=Bsl)D%jSYSNt}gceDH$4N`r{CkPP>A`q_t>+K3 zN##RA%%3uhYGvZvOb*V?+F~e>#y^nFH_a$6%a}c}uqj(w|6oa@#chfG$(p<%GBdaz z3;MDkrq84NgbDGvhdugzSsWzbS;#TF{7qE2;+ z+~_Y8!WNH3k3Qu3@OeRA;`dGl`|J1jVYX|+!EB@Y9#SDb3zX=Z@q;~6lGmv#ZR;N( zL$zWv?F}|z{j`1eDOZ1VKO1Y(GZ*qNmXACT{Wd3>B+VJGicTsQhoEDJIss*2ZM}2H z88iTH6~IC=KI=?`c*LL_=uj z-}*&p$|B$0cJqMGkpn552EY>RaDIPGDvY*PYYM}$$K&oDj{X<~z0T6(S(}$2mObZ( z=gQfQ9{y}St5Oim9kw&oX<;zS_yU|=hn{d}>RIKz&?3gfpn!SpZvj ze(>T_5-sl2RMat}dQQVqV+Vl^y!Dg#%qGG=sEpY~n2>~N%&$YQ1~uQA9)2-N2FN={ z2X;FS5o~m3e2)VRAbSO=s$!v9a-r?GZY?^V-ziQ1d_~4OqR_xK82ssOw$X`OWBT%6 zEC-vzw8qO51suockj+DLD1V2JQq?kVO*rJg{gN4j$#mYnHoPrl&pr#*N|xV0G5zMM z#L(AE1$Gb^YvkCe;sX#41AUAoBnmRhav{FPuN8xjI1lzunhrB2+Z@0Ubb#{hQ#FE) zBc%#JTHuvXl7<)sRMdesd65=dP49+rl2Q(}#7;?a`si>-a2ip)W$|B|-LRe0b1SPu zDE7%2sEGQsq!{9d5}$RQzjbqU;?2G97U$VN;0;g)UJLH~UrY{K7Sm=L;nm;<;8(4w zPy7%E(#4yDY++N`WfSKNdH&d;h6d%;A-MbHj-EPlXCy5JH)awd-5eG6Z8?Cn0BoZ# ztfMhg-w29s7d|bp&#yRfd#NWaKbvBGKhiq=5wp3x|L}g1bH1SeF!5}2u_;nv4}*<~ zOB5@f!isj|6%5=;<`Y+$jw$a$g17v49v9oyX#)cbF7gWE4Bg!{z`|H=kYTelP^6P8`OA}hiPJe;j=PrpC z_qUmch307En8u>d4LXtm9Jd`f!G^fpQAzqh{bblTZI5UJysViebbr;S?PEOBnS z*_2#{MmSBhtmHQ8$o$=wob12g z68cuEX2^BIsgy7PrmU-6$BsZzK72S28^Hk+4j!5o)QK>q= z$66i%Y>{InQDXnczR;Ux@Ic5e5bBWK7|$RkL%xU^;wJSM6*R6}$*lob4YcSAa-G{0 zez$R9%&_SWoNEYKw5&M^y9&B>2>n{hZ!AddK(#TRGKTvDx0vt$Gs!947}$ z$hdVyk{L{`&AA}oDUZ;e|7XfW1WcUL=U+M`{`)Ea8#*NKj%5A&e?DQaq6q%KF)JLa z(L_i7|Atn;^xoA_V9V5Sd%!-0YPe$kFGH7x#46qMn`eZ*H2RqmxJ%MOojwT`fOu7Qk3S|kv{?2>xJdc3`p+d$ zp5b-ge27-C>=D*Ye(C-CFFBv(uvVHe0LFJPUPVV2;f7$`zH3@YE`E9vYX9t^2{@5; zSsidg*Au)8y)d%9|7-r#&Y{#y?ZwZi-xY8(QfyVRu`|@z@^hcVp}tU`S^G-j>yC1^P!Gsh}dpD+O9aP8qnh-Sy>Uq3589?W@8x zJ5?KJFqf7?IgjNcpEW$dzQq1tWzFyPlZlNpg z0iw-yiM8jQ%WKzz#EVi=vyia5`jD#v5EqRyqT0-0A)jr^4`fPlKzLEaL0BIk1;7(z zlI9YdWU&9F3p?mG;RlRhLC~m-D1|W0> z+X$ZJdMr;9ObY`g)GQp~^m~8RReAOS9x!DZ55%Et0Vu$HmAe2LNL5!rwV$Sa*%JC@h{sDZWP!fLO|L-!71AuhEs{u#{bo(p4B>%)003fNSk_kaz zqZ$YzKeTf^IiA}v3P|`Q&5E~4BU1ZJ?HY#(D03y02a|I`!I9t2b?%-ng;wR^ze}a* zV5^8CutF_?WnejJW9y4^fI$L)2_rm!d9bR9+La|dCCng%_RL-q=mJiOtUcawA>?#Q ztyRprveCvWj%CJD;&{d(fQ*QJT!cE3>;PugAOLenzr!3JJJ0Xvh>6HTP$jY&CQKPszU* z^txjq7OvEXq|;r|vkgandhFM?XfM?@6h{xQ>Xv8%^VIU4<>MOfq0-Lx8bVq>>&(Vc z2$aSwl}7o!Xz!k!l7+@cuX+>D#$Cm-p_*!8%x~m_d(np)IfpjXH$4iB>@iOIVb`*nLmTSgQ0;^7* zrdZ*T`M*l^K2tBJ9)(dx`7(3bENA1bnbvTvgX=B}!CgQ0@5vt53D1z7kpN(isZmH1uW{RO z@|}fEDrc?Xd&DAwKxIS$Qs54B;snQ^(Y_GT?z(H;o!gygw{F(2>kRX*_?c{d=ub?M z_{K%TSEshNJXE;xiu&a_zDG>kW-;z#O$N4YgkM@SasBpppB=jI08tO#n@xO-4Zy>0 zTt0G|apagY5)TmQ8qg<=FR1#pS6I(t;;*!7pB4FZe9B81^mGUX{7q{C{_tY z3reKMsH*S0?Z;7P$^^s$(dDqw`#-iD)aFLLXWv4j0suN+Ew0gp>jyHhA79-BW%h4> zyh~i_^F_z`U5+0iVJy8thaJ~90U*Wgb{l;<+0Ws%y+pY`;mk`U83JvU!`Xk^|JND>Q9s=?VU+>!Gh>;Tms4GZ&_=Zw&%JV>yuHQQ@u({i{a}^AqaQsZnx_h z7JaGz_CdoCH=u$6^j!ZfAOf%U1eOmuT@UyxNk9LvlEDk(lV;6WUJ?zvLxHNScIEr)pFa5hT0a`Ii z-bo~1){ntZBm5svsMOLb$w|xJ88N#)LX@MFIYpbjHG`J1+DcKfm_w%mUV<>2R~s87 z{#W%EFWaLh{*SM)6<6;sMMr>Rnz^Uc-Ap~yRfu}DxStg<>V!^~#HQun;iZEyc!Fuk zzR-Yb<|gR{9#o9j;gc`^j}0X;1j{d+#R3G%l3q3*4x1ad*f5{~9r{|H6q5$CZtMY* zDp#eNJKpmzhw9bFDO)5qL~n+NCs`HVGif~d>RrEF^drnRt5Yg{u5BH;T7or7uELF2 zDOOS_vMjM7E!OWlj@pLAdE zL0_XX&^J0rw5)p#5p&$H;^x>oDy}XMi?kJ$`}$0EIz2e05GHkYrz+vlN<#Si)K~>> zCpMcHCP=YBrWC2Bh9!PIYO2yUivEigesBRCGI?mp}v*dTZ)MMkDQ+K`*rN6r z7F{yRT8okl6HIq{ajh;DcgrZZWFx@% z^0ql8k1O*6*aWzVJD$N2WUzFE7-KnWJ_MNBq2YVqPEgk{>9yI6p>R6?MidB$bIp;D?x!$ z{f)!h3DPrnxrO*{3i-~MZ`=YF%p8En_&L&KWefK& zHy$D5Ic5a^8hXo5wn=qYT`kRRrdq!y6)eEeTmRz$*Y2ny<#r3Go%o$>yNt>E#6+l) z5B9>I@w^?1n{xl8?)uX@TcVhTW+3mwo)ZudPwyWYfW*|kwpnLzKtefq1{<` zplG(-TnYB`Cv@HK4=2V}(Z(DFN(Q6$Wcc^Apl7rccX7h7hmFBsXjfbm7 zLicS9-L8Pq7{jPMam?j5BRyj(kJZz=gW$VY9L?3zC#3`Ew~N9HL-*dfksXWsV7o6p zf{zcB4jp&4--t^6=E=Wsv~lj>!PSI7%@G8Ep15fDlOhkbk4o2Jyz*1|jqFIQ|gr@0g;Q`WSpM7$R{` zdtVzMBM0mirvUO|YE*LH-nU4L4}#$?s6oR6FJKcQ#qY+|vsNsnlDRSN>xUC6|4aV^6b_T5uN z@?=$iVoOF4!*1ZnAHZq57F}j&Q3c+SmFsJeV22)V`AEQs|5HkZ-#s)kF0VKiNxSTpr|N?of_C0KvR(|XZub&` ziXIM&!ZU10fc-odz?Uchh~;87{~b$sjV!C4I8wSK!lgonplFx8q@23vWr4&J;6A6Y zLeraDR)!5eI_6>`9hBS}VKA0&)=2wL2$ot=`h46NvH-;&z3&#zM5jW|W!v%6mUzh)QgyYeiOk zxH-2))Mm6XNj z%dW}ouu?6^7JZ-WCsCtSQ! zCXrekQ4aNVT1#mwB0^fL%YGqmj#G*FVkSkw37>93JK%?KD_RAIxtGrBhgDB~Ujj@y zDx(h8+KOl6N9u7L^*-==maA@?QNFEDhTKIJw3cM+Y6C%nF&YpgQ+bT1-iHwS*bM8I zHUXze!%{&M-0EvAC1F9?92+7X^dD_%>BQv*GaYgjV+0uhJ34$qzVBmS?h3Vza}~M0 z%b9VvokwL=j}?!GJB|PEG(L8Qv=)}nQ=~sd5F;1$Zyv;8Bm_AB`kAn2+wyC2{U%y- z6>yWg?1)YF75Jt9^0rqaCHVtqy-Vd z&%;L&ZV~nFZV>=XiMI$7$izcURWDbDVC^bORDG$CXc?|Yi%cF7O#Fw!!fzT~a3xLj zAbO&w7NRB)Soo=WdC>Euh?mV3Ao4bFF581Cf)zoT$8YlGHQ}4B`^SXf?-UkJ7Vs)e z(_~D_X`C_tBQj(iAVW}&0Wt&#%^(x&vY85zcS#8dfPb*)r8;7^gokX)fP7~cz^Sx( zs(?UU7zxDeBU82JcLfb3vUmI;?$dhXd(3BsVK*wD;Zj?Vc|RI>CkD4iW(@$dB^2N^ zXRGR487@fOaiB29?2b=|Z6pQ2_KImWYQaN|_e!nbE4{fnoP3`%eu9$ew?s?cXN-L| zjKyY2Rqu}JI} zG@xT#a8yd-{vR3gV@s;;FJS$dD=JwAox7V}MM*CPK*Pv$i37B4Cz6FdYmG|Pm z)pkb|sguWxg@5Lk>e9I{GCKeJVn6TyG<*K$^>s?~t+MmaRyyhL_UpyBhL@b!xlhlk zCxSo!zLEt>4wxv%kQn2{d! zwITpEXA4p`L_o|sX`5?)Q$J=*|5;tWtlg1+`#qc?v+IO(KYLyK?|o>$3B&3EEX2ZW zPru0v!vvyz@sl>s>}NhA6!);Sg$k2dQt1_`?HfF)Cp~%nW?;|g4GrUDmza`2n8osv zms8+xqt=^b$YbFTY#B(7wT!jb`L`alaIY;c)o$$w@Cs;i8x$q8%NylsI;cNJ`yG%Y zg)K5#kPv5JUD0}tS<#TrFBPNPc0d%l$?Q7{E9}sRRD5v&+k^Umu;nBrxmN7Zw$T&@Vw;so+Xz50$Z{ zA|XX+kbm%^L^5jFBDP%$>Ejp`(LL>3KZw+FIGc(dz{P*%7OzicxT$&CkjkCFyS6F# ztJ1e<9=F~w{IE$lSiJEKP}`R8vb6K3_{3mHnU@@D`;$&_6V;g{mTmO$mc{q;uJ7eK@`>Q!mld(70r+E-r>y2fS#4z_>U$W$+XMbr@AS1Cg@1ECCN@REn!o zm?N-w&r(BeZRs5eDUA{hGbcPetTOs^6XasQ@U7tsYR%#?4B`sL8&pXbY(lOYLPb*D z$F_UqdfqC9LsCCEbY74s_wIQTnlh6n!MaS%p-IMacQ-_xAR}2(IX~XxV4u&R+0|%F-=e=Lvo|>iXp8+Xy9c)$lCY zW1nK)c@E-P8ZIUC)bkD`V|kf=gl6r>jK@%BYX8ot)NZA-T5JMR8)BwhU|5=t(>`QM z)4;G^+95e|j^-lXff$s?*+Nm`LcNvwvcJ@!94Qi;svJynxpjD_8}ul!x9- zD{WhE+bOjezrpD;GxK3(byd!-!&V=5FO zBO`H@Mgaw1Winfitsx%#m-CbHhxkKWrQDdb?dB5r^3}e^bsiXnlO%6I-bK=9eIjjL zs`B2Lk+$ncGyYh&ZI}kRf?#chcaPc!HY$45RYqYsuv?~ss?fhVX%s)_V;cwNiXL1W1xVGm4=INY5sZ&M`=+NdCv70nzTmk&D} z)`TxF%M5T&EFqG$IXIW8xdl#|S`4v5oJr+!gns;P@Vc*XZt(UrI9@={T*CJI_Lm8? zvNTWq*BjN?n6A7$Kl7pUh-&+!tO{D+#>1$M6klro`e{x7!h06xlJL8_d=XcLZA}xs z8VTDdAywCm$KbUNhhU?d zrfXqZ-d7YHUWS2&?N)ILz7+lHnmAlaDqFH?{A$NpUE76By8LXCz@yl=#cH4gnTLN= zCfvNaLYHkJHOlhs=*{&P3(A+bu?(wya!r(#NQ1OnWB2Z`p2iY$QN!$2)+$X2RRt&O z&-V8Awzemyr{-n}(Ye=T`-hDj=>dYxL#KYK5whu6F`noE!xd)7A`s6B|CdQ>mAk-A zy*PjLuu_&i_>@J8FjGn1TF}d~$ZD$faYLZ`l00QO$<=(eGm@FU>xS$?-mtkZ>)Y=% z6pre-rNtn8?_Yk0>-{RjV+~!`RrPGh?$p4uXs1w*?kc>W3sep6zI{d7>JQli%keZ$875B{-iy0P1#TM2Kxss55AL6 z$7d5ADMy@qq4Kr7%0iebP_e3!96=c*djR+>r$S%totDzr*DpGJVn|pi?=Kf-b7{bo%Ps-Ql07MfMz-`5RQ)xYN zuG^c6#VvSg?F0Ql>wvDOf8sx;QY#`Ds7>ddsNNROV3=&MdtuqZXPt2P;haX&oOa=! zD~YM>%Sd4O`PlWsXXj7zcHxH&GyCGT>RtW;zyJ&HQx6#%a-W4&hE&2VAoMjNL4NnJUB(+RtkXvQQTCw>Z%O2|_)5D8mpGyd zU~p24x8MS1iF~M)v%^X1`XE9KF|j-qsTemfR}@++SM`;?jjYtY;@26yyE<`(Bd~CB z+)%8b&lIRIXKwcYykKJNRe~`Pw!^=~!8zD#)kTVm(*PmYYDS=A0{TTHatvUoba6j) zd5)4}0+)HY>I1=NPth4UBM-dK1y8tf2tO!iyFC-3N=sTb%b+{E2EvW26c`RBkwi9;Klrsj-(Bo|+b zuxc34ruBeq>Xm+`@3A5W!yA8)0inMQy!%oC@G-v`o-bhhEnI^d>< z(ShNTd<>CXI6l!uPNwb~!uT(TE91_F6$OqOzZvC|K|^e(Wa_R^<_S(11>1SnXd#&u zam#l%6#${jNw>VfW!kJQF~<%o!AWuR>4YBG^KxK`C+N!t*UoOwZ5h{B>6vQ)(}DRc z8SY2qD`Qm<=HoIfBD!T-68J)wOT|vMqNi4vt;TwJoKM`L%`PXSbuD z1bF{sEI@?mVB8h`d0Q611Zy3o-&pKy_P$W^pd}ZeLR$bMuXjWdhEf$F`lV`RzJ`z8 z{7pCsJ%y(ll#f!{g8WB{C?)L+kz_o$YNF&FT2n18Mnc?8m$rxI`hB}wdG}Y}ieoLe zlD78pXRNo(SN{Wn4d*F7x8wF^{@zQmex^B-6I~F^49r*qFK9SaP4OENlb^vwd93UC zeaPfX_e|aXSj6WWusX`X{&;H)b$Dh~ngud4cM{&-gR~u}1S&SCOpzUhuh3@e#=Et33 z=`B;}g2`Oa#RpB#;N7752EB=8l{)RwQ=vR}cBeWK`A2 z(f@|bCazInY|wXqNVBn$Ksz5N{f^CD$EP(D3>rVI%pEB-?l_an_PirG)Y9mHr3q%l zoIFjYP2(<eE^-S%(g?4+8>z4x(A<=5zVNM zZc0c)Y6pR9Y=fE3or;_bPbIG)5yyJ^O;|F-2gK@Sh(9akOjE;Hroom_DF#74jMiU7 zUSu;!B&|9^;)KwF5HfEbsJO|Us+KMmM~;>LX`Fu9ppEAWBtfr@6T$chV#C0LV1X`5 zrr&2*7YA7{VG>P4%}5YTLo2AuT6lx-z_r5*gfE#GPA*8zeMDQsN}G}uOPyu_}`N_K*~ev*L3_8GR}vA zx5thS=lTSSj)SvVh2y!N=B%}1m816A3rHg%LKkRLXxV}Q*h)2L=c0%*U6@+I+6*V~ z&N4n z2cXSDS#N@&SSx{lXV$EQ)j_Q#A%ZJ`w=SNw3Cs5u5`hXYSpIlb1V7yaPBhI3tpgzi ze!3;Xt0?jvn>?cY4os9PaUTPYO%VixvI*M9Vr^BkV4=+1)5Ugxj1H*MHryg%RSgPm ziWuxCVD6EU32w9x&hWA(SmMAdN+`b+kvKhM-wH)+`9S_X;rj=2{K7d^I7JbT zB!!r08YxUl2wpT{+}#Jai8@ED9`8#zBc*WSpYK zX_k^?gdngjdWL1lVE82gg%WkB#99b3Bx?#qOb7``I%42Da{NHsl_>lM`|QK-;nvmC zX?u?%Yuijlw+Gxz;?ru;SD$ z3mLdPp+Ih#% z#l?wwx!Rf`F}K9`R1Dy`OneDvsRoAzZZBNCXtYA)KdHOt=brKW!{nbrOEU>cHk&@1 zTZ?RG;E~ktpd1iLu0R=L4ajR+8>T}{x=|73bc#dzc4?L7XIEQ70;Pp>q0^qfK1A9E zQUs85<5H{j=!ncy#?l4qXc4-0f4>AH73*9lei1S_8aK$>1xuilSb-vmrYMrLlt38f z2+9la!-%0J_=RYFk$DAHN3-3(z6&OS0Xbq3N~H*j7Nt+x9t`-7H5lQw9T30Odmdv@ zPyqiO1`PwyNhBN252M$-!*U|*3xX8PpyzKV7#BiCyWi>s7r@`#XCD#k`?Z=I*$yG3 zfd4j5njjZ*d+$m!G9A^7`6?okq#F{&9a^HDM(S2)XZVD z>VTZ4LYp`|{B0?a;XubNn9&0Y?9>lMHK=~ipwKNZ*~R=i+GOB`Si3Bm?1oegz%#T(UXK|Kd_)t6nt(@f z1us{~DLF%=h(w7fdV4(zNfmT)@fdB|>b`MLPC@P!->reK4g;A^p$m8>qK3gzky7!* zfeB&2iT*i5wekxS69T~wBR{%BQz(*OT4T{^-Wgjelq57sJqq4~J&I^a@CF!GsiVK9 z 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 b4g?|L%(i12@##T;N08*ClqE~V4Fmoc_BA-m literal 0 HcmV?d00001 diff --git a/local_backend/main.py b/local_backend/main.py index 05e5692..1094f53 100644 --- a/local_backend/main.py +++ b/local_backend/main.py @@ -26,6 +26,7 @@ from routers import shifts as shifts_router from routers import settings as settings_router from routers import flags as flags_router from routers import messages as messages_router +from routers import sse as sse_router def _run_migrations(): @@ -111,10 +112,13 @@ def _run_migrations(): name VARCHAR NOT NULL, emoji VARCHAR, color VARCHAR DEFAULT '#6b7280', + text_color VARCHAR DEFAULT NULL, sort_order INTEGER NOT NULL DEFAULT 0, is_active INTEGER NOT NULL DEFAULT 1, created_at DATETIME DEFAULT CURRENT_TIMESTAMP )""", + # Migration: add text_color if upgrading from older schema + "ALTER TABLE table_flag_defs ADD COLUMN text_color VARCHAR DEFAULT NULL", """CREATE TABLE IF NOT EXISTS table_flag_assignments ( id INTEGER PRIMARY KEY AUTOINCREMENT, table_id INTEGER NOT NULL REFERENCES tables(id), @@ -181,6 +185,21 @@ def _run_migrations(): "ALTER TABLE printers ADD COLUMN protocol VARCHAR NOT NULL DEFAULT 'escpos_tcp'", # Compact (half-width) display flag for quick options "ALTER TABLE product_quick_options ADD COLUMN is_compact INTEGER NOT NULL DEFAULT 0", + # Print layout + per-type font settings + "INSERT OR IGNORE INTO pos_settings (key, value, updated_at) VALUES ('print.ticket_mode', 'detailed', CURRENT_TIMESTAMP)", + "INSERT OR IGNORE INTO pos_settings (key, value, updated_at) VALUES ('print.font_order_number', '48:1:0', CURRENT_TIMESTAMP)", + "INSERT OR IGNORE INTO pos_settings (key, value, updated_at) VALUES ('print.font_meta', '0:0:0', CURRENT_TIMESTAMP)", + "INSERT OR IGNORE INTO pos_settings (key, value, updated_at) VALUES ('print.font_item_name', '16:1:0', CURRENT_TIMESTAMP)", + "INSERT OR IGNORE INTO pos_settings (key, value, updated_at) VALUES ('print.font_quick', '0:0:0', CURRENT_TIMESTAMP)", + "INSERT OR IGNORE INTO pos_settings (key, value, updated_at) VALUES ('print.font_pref', '0:0:0', CURRENT_TIMESTAMP)", + "INSERT OR IGNORE INTO pos_settings (key, value, updated_at) VALUES ('print.font_extra', '0:0:0', CURRENT_TIMESTAMP)", + "INSERT OR IGNORE INTO pos_settings (key, value, updated_at) VALUES ('print.font_ingredient', '0:0:0', CURRENT_TIMESTAMP)", + "INSERT OR IGNORE INTO pos_settings (key, value, updated_at) VALUES ('print.font_item_note', '0:0:0', CURRENT_TIMESTAMP)", + "INSERT OR IGNORE INTO pos_settings (key, value, updated_at) VALUES ('print.font_order_note', '0:1:0', CURRENT_TIMESTAMP)", + # Offline/emergency payment tracking + "ALTER TABLE order_audit_log ADD COLUMN offline_uuid VARCHAR", + "ALTER TABLE order_audit_log ADD COLUMN offline_at VARCHAR", + "ALTER TABLE order_audit_log ADD COLUMN is_duplicate INTEGER NOT NULL DEFAULT 0", ] for sql in migrations: try: @@ -193,6 +212,9 @@ def _run_migrations(): @asynccontextmanager async def lifespan(app: FastAPI): + import asyncio + from services.sse_bus import init_loop + init_loop(asyncio.get_running_loop()) Base.metadata.create_all(bind=engine) _run_migrations() sync_task = await start_cloud_sync() @@ -232,3 +254,4 @@ app.include_router(shifts_router.router, prefix="/api/shifts", tag app.include_router(settings_router.router, prefix="/api/settings", tags=["settings"]) app.include_router(flags_router.router, prefix="/api/flags", tags=["flags"]) app.include_router(messages_router.router, prefix="/api/messages", tags=["messages"]) +app.include_router(sse_router.router, prefix="/api/sse", tags=["sse"]) diff --git a/local_backend/models/flag.py b/local_backend/models/flag.py index 6dc893a..b6914b7 100644 --- a/local_backend/models/flag.py +++ b/local_backend/models/flag.py @@ -15,7 +15,8 @@ class TableFlagDef(Base): id = Column(Integer, primary_key=True, index=True) name = Column(String, nullable=False) emoji = Column(String, nullable=True) - color = Column(String, nullable=True, default="#6b7280") # hex + color = Column(String, nullable=True, default="#6b7280") # hex background + text_color = Column(String, nullable=True, default=None) # hex text; None = white sort_order = Column(Integer, default=0, nullable=False) is_active = Column(Boolean, default=True, nullable=False) created_at = Column(DateTime(timezone=True), default=_utcnow) diff --git a/local_backend/models/order.py b/local_backend/models/order.py index 628466d..d214f57 100644 --- a/local_backend/models/order.py +++ b/local_backend/models/order.py @@ -93,13 +93,17 @@ class OrderAuditLog(Base): id = Column(Integer, primary_key=True, index=True) order_id = Column(Integer, ForeignKey("orders.id"), nullable=False) event_type = Column(String, nullable=False) - # ORDER_OPENED | ITEMS_ADDED | PAYMENT | ORDER_CLOSED | ORDER_CANCELLED | ITEM_CANCELLED + # ORDER_OPENED | ITEMS_ADDED | PAYMENT | PAYMENT_OFFLINE | ORDER_CLOSED | ORDER_CANCELLED | ITEM_CANCELLED waiter_id = Column(Integer, ForeignKey("users.id"), nullable=True) - item_ids = Column(Text, nullable=True) # JSON list of OrderItem ids (for ITEMS_ADDED, PAYMENT, ITEM_CANCELLED) + item_ids = Column(Text, nullable=True) # JSON list of OrderItem ids amount = Column(Float, nullable=True) # total value for PAYMENT events payment_method = Column(String, nullable=True) note = Column(Text, nullable=True) created_at = Column(DateTime(timezone=True), default=_utcnow) + # Emergency offline payment fields + offline_uuid = Column(String, nullable=True) # client-generated UUID for dedup + offline_at = Column(String, nullable=True) # ISO timestamp from client + is_duplicate = Column(Integer, nullable=False, default=0) # 1 = duplicate payment flagged order = relationship("Order", back_populates="audit_logs") waiter = relationship("User") diff --git a/local_backend/print_size_test.py b/local_backend/print_size_test.py new file mode 100644 index 0000000..1c4df82 --- /dev/null +++ b/local_backend/print_size_test.py @@ -0,0 +1,137 @@ +""" +Font size comparison test — Jolimark TP850UE +Usage: python print_size_test.py [IP] [PORT] +Default: 10.98.20.25:9100 + +Prints a single page showing all available size options side by side, +to help decide which sizes to expose in the settings UI. + +Hardware facts: + ESC ! (0x1B 0x21 n): + 0x10 = double-height only (tall + narrow — breaks aspect ratio) + 0x20 = double-width only (short + wide — breaks aspect ratio) + 0x30 = double-height + double-width (2x in both axes — correct aspect ratio) + There is NO 1.5x in ESC/POS hardware. + GS ! (0x1D 0x21 n) can go 3x, 4x … 8x but they are extremely large. +""" +import sys + +PRINTER_IP = sys.argv[1] if len(sys.argv) > 1 else "10.98.20.25" +PRINTER_PORT = int(sys.argv[2]) if len(sys.argv) > 2 else 9100 + +try: + from escpos.printer import Network +except ImportError: + print("escpos not installed. Run: pip install python-escpos") + sys.exit(1) + +def gr(text): + return text.encode('cp737', errors='replace') + +def raw(p, b): + p._raw(b) + +def section(p, title): + raw(p, b'\x1b\x21\x00') + raw(p, b'\x1b\x45\x00') + raw(p, b'\x1b\x61\x01') + p._raw(gr(f"--- {title} ---\n")) + raw(p, b'\x1b\x61\x00') + +def print_sample(p, esc_bang, gs_size, label_en, label_gr): + """Print one size sample with label.""" + # Label at normal size + raw(p, b'\x1b\x21\x00') + raw(p, b'\x1b\x45\x00') + p._raw(gr(f"{label_en}:\n")) + + # Apply size via ESC ! and/or GS ! + if gs_size is not None: + raw(p, bytes([0x1d, 0x21, gs_size])) + raw(p, bytes([0x1b, 0x21, esc_bang])) + + p._raw(gr(f"Club Sandwich. x1\n")) + p._raw(gr(f"* Χωρις αλατι\n")) + p._raw(gr(f"+ Extra Bacon x2\n")) + + # Reset + raw(p, b'\x1d\x21\x00') + raw(p, b'\x1b\x21\x00') + raw(p, b'\n') + +def divider(p): + raw(p, b'\x1b\x21\x00') + p._raw(gr("-" * 48 + "\n")) + +print(f"Connecting to {PRINTER_IP}:{PRINTER_PORT}...") +p = Network(PRINTER_IP, PRINTER_PORT, timeout=10) +raw(p, b'\x1b\x40') # ESC @ reset +raw(p, b'\x1b\x74\x1d') # CP737 Greek + +raw(p, b'\x1b\x61\x01') +raw(p, b'\x1b\x21\x30') +raw(p, b'\x1b\x45\x01') +p._raw(gr("SIZE COMPARISON TEST\n")) +raw(p, b'\x1b\x21\x00') +raw(p, b'\x1b\x45\x00') +raw(p, b'\x1b\x61\x00') +p._raw(gr("Which sizes look good for ticket printing?\n\n")) + +# ── Section 1: The two aspect-ratio-correct options ─────────────────────── +section(p, "CORRECT ASPECT RATIO") +p._raw(gr("\n")) + +print_sample(p, + esc_bang=0x00, gs_size=None, + label_en="[1] SMALL (1x1 — normal)", + label_gr="") + +print_sample(p, + esc_bang=0x30, gs_size=None, + label_en="[2] LARGE (2x2 — double height+width)", + label_gr="") + +# ── Section 2: The broken single-axis options (for comparison) ──────────── +divider(p) +section(p, "BROKEN ASPECT RATIO (for comparison)") +p._raw(gr("These scale only ONE axis — shown so\nyou can confirm they look wrong.\n\n")) + +print_sample(p, + esc_bang=0x10, gs_size=None, + label_en="[3] Tall only (2x height, 1x width)", + label_gr="") + +print_sample(p, + esc_bang=0x20, gs_size=None, + label_en="[4] Wide only (1x height, 2x width)", + label_gr="") + +# ── Section 3: GS ! options — 3x and beyond ────────────────────────────── +divider(p) +section(p, "GS! LARGER SIZES (3x3, 4x4)") +p._raw(gr("These are technically available but\nvery large. Shown for completeness.\n\n")) + +print_sample(p, + esc_bang=0x00, gs_size=0x22, + label_en="[5] GS! 3x3", + label_gr="") + +print_sample(p, + esc_bang=0x00, gs_size=0x33, + label_en="[6] GS! 4x4", + label_gr="") + +# ── Conclusion ──────────────────────────────────────────────────────────── +divider(p) +raw(p, b'\x1b\x61\x01') +raw(p, b'\x1b\x21\x00') +p._raw(gr("CONCLUSION:\n")) +p._raw(gr("[1] Small = use for modifiers/notes\n")) +p._raw(gr("[2] Large = use for item names/headers\n")) +p._raw(gr("No true 1.5x exists in hardware.\n")) +p._raw(gr("GS! 3x3/4x4 available if desired.\n")) + +raw(p, b'\n\n\n') +p.cut() +p.close() +print("Done.") diff --git a/local_backend/routers/flags.py b/local_backend/routers/flags.py index 935bdf8..4bc10c5 100644 --- a/local_backend/routers/flags.py +++ b/local_backend/routers/flags.py @@ -7,6 +7,7 @@ from models.flag import TableFlagDef, TableFlagAssignment from schemas.flag import FlagDefCreate, FlagDefUpdate, FlagDefOut, FlagAssignmentOut, SetTableFlagsRequest from routers.deps import get_current_user, require_manager from models.user import User +from services.sse_bus import broadcast_sync router = APIRouter() @@ -124,9 +125,11 @@ def set_table_flags( )) db.commit() - return db.query(TableFlagAssignment).filter( + result = db.query(TableFlagAssignment).filter( TableFlagAssignment.table_id == table_id ).all() + broadcast_sync("table_flags_changed", {"table_id": table_id, "flag_ids": body.flag_ids}) + return result @router.delete("/table/{table_id}/all", status_code=status.HTTP_204_NO_CONTENT) @@ -139,3 +142,4 @@ def clear_table_flags( TableFlagAssignment.table_id == table_id ).delete(synchronize_session=False) db.commit() + broadcast_sync("table_flags_changed", {"table_id": table_id, "flag_ids": []}) diff --git a/local_backend/routers/messages.py b/local_backend/routers/messages.py index 47406e5..ece8894 100644 --- a/local_backend/routers/messages.py +++ b/local_backend/routers/messages.py @@ -11,6 +11,7 @@ from schemas.message import ( QuickTemplateCreate, QuickTemplateUpdate, QuickTemplateOut, ) from routers.deps import get_current_user, require_manager +from services.sse_bus import broadcast_sync router = APIRouter() @@ -113,7 +114,22 @@ def send_message( db.add(msg) db.commit() msg = _load_msg(db, msg.id) - return _message_out(msg) + out = _message_out(msg) + # Broadcast to targeted users (empty list = all connected users) + target_ids = body.target_waiter_ids if body.target_waiter_ids else None + broadcast_sync( + "message_sent", + { + "id": out.id, + "sender_id": out.sender_id, + "sender_name": out.sender_name, + "body": out.body, + "table_ids": out.table_ids, + "created_at": out.created_at.isoformat() if out.created_at else None, + }, + user_ids=target_ids, + ) + return out @router.get("/unread", response_model=List[StaffMessageOut]) diff --git a/local_backend/routers/orders.py b/local_backend/routers/orders.py index fb30983..d157f3f 100644 --- a/local_backend/routers/orders.py +++ b/local_backend/routers/orders.py @@ -9,7 +9,7 @@ from models.order import Order, OrderItem, OrderWaiter, OrderAuditLog from models.user import User, WaiterZone from models.table import Table from models.product import Product -from schemas.order import OrderCreate, OrderOut, OrderItemOut, AddItemsRequest, AddItemsResponse, PayItemsRequest, AssignWaiterRequest, OrderWaiterOut +from schemas.order import OrderCreate, OrderOut, OrderItemOut, AddItemsRequest, AddItemsResponse, PayItemsRequest, OfflinePaymentRequest, AssignWaiterRequest, OrderWaiterOut from pydantic import BaseModel class PrintOrderRequest(BaseModel): @@ -33,6 +33,7 @@ class MoveItemsRequest(BaseModel): from routers.deps import get_current_user, require_manager from services.printer_service import route_and_print, route_and_print_sync, print_order_receipt, print_order_synopsis +from services.sse_bus import broadcast_sync router = APIRouter() @@ -159,6 +160,7 @@ def open_order(body: OrderCreate, db: Session = Depends(get_db), user: User = De _audit(db, order.id, "ORDER_OPENED", waiter_id=user.id) db.commit() db.refresh(order) + broadcast_sync("order_updated", {"order_id": order.id, "table_id": order.table_id, "status": order.status, "action": "opened"}) return order @@ -209,7 +211,7 @@ def add_items( db.refresh(order) print_results = route_and_print_sync(order_id, new_item_ids, db) - + broadcast_sync("order_updated", {"order_id": order.id, "table_id": order.table_id, "status": order.status, "action": "items_added", "item_ids": new_item_ids}) return {"order": order, "print_results": print_results} @@ -295,6 +297,7 @@ def pay_items(order_id: int, body: PayItemsRequest, db: Session = Depends(get_db _audit(db, order_id, "PAYMENT", waiter_id=user.id, item_ids=paid_ids, amount=total_paid, payment_method=body.payment_method) db.commit() + broadcast_sync("order_paid", {"order_id": order_id, "table_id": order.table_id, "status": order.status, "paid_item_ids": paid_ids, "amount": total_paid, "payment_method": body.payment_method}) return {"status": order.status, "paid_item_ids": paid_ids} @@ -312,9 +315,105 @@ def close_order(order_id: int, db: Session = Depends(get_db), user: User = Depen order.closed_by = user.id _audit(db, order_id, "ORDER_CLOSED", waiter_id=user.id) db.commit() + broadcast_sync("order_closed", {"order_id": order_id, "table_id": order.table_id}) return {"status": "closed"} +@router.post("/{order_id}/pay-offline") +def pay_items_offline( + order_id: int, + body: OfflinePaymentRequest, + db: Session = Depends(get_db), + user: User = Depends(get_current_user), +): + """ + Sync an emergency payment that was taken while the server was offline. + The UUID prevents double-processing. If a payment with the same UUID already + exists on this order, the duplicate is logged in red (is_duplicate=1) rather + than silently dropped — so managers can reconcile. + """ + order = db.query(Order).filter(Order.id == order_id).first() + if not order: + raise HTTPException(status_code=404, detail="Order not found") + if not _can_access_order(order, user, db): + raise HTTPException(status_code=403, detail="Access denied") + + # Check for duplicate UUID on this order + existing_uuid = db.query(OrderAuditLog).filter( + OrderAuditLog.order_id == order_id, + OrderAuditLog.offline_uuid == body.uuid, + ).first() + is_duplicate = existing_uuid is not None + + from models.shift import WaiterShift + items = db.query(OrderItem).filter( + OrderItem.id.in_(body.item_ids), + OrderItem.order_id == order_id, + OrderItem.status == "active", + ).all() + + # Reject empty payments — client had no offline snapshot for this table + if not items and not is_duplicate: + raise HTTPException(status_code=400, detail="No active items found — payment rejected") + + # Use the client-recorded offline timestamp as paid_at so audit reflects real payment time + try: + paid_at = datetime.fromisoformat(body.offline_at.replace("Z", "+00:00")) if body.offline_at else datetime.now(timezone.utc) + except (ValueError, AttributeError): + paid_at = datetime.now(timezone.utc) + + active_shift = db.query(WaiterShift).filter( + WaiterShift.waiter_id == user.id, + WaiterShift.ended_at == None, + ).first() + + total_paid = 0.0 + paid_ids = [] + if not is_duplicate: + for item in items: + item.status = "paid" + item.paid_by = user.id + item.paid_at = paid_at + item.payment_method = body.payment_method + item.paid_in_shift_id = active_shift.id if active_shift else None + total_paid += item.unit_price * item.quantity + paid_ids.append(item.id) + + db.flush() + active_remaining = db.query(OrderItem).filter( + OrderItem.order_id == order_id, OrderItem.status == "active" + ).count() + order.status = "paid" if active_remaining == 0 else "partially_paid" + else: + # Duplicate — compute total for audit record without changing item state + total_paid = sum(i.unit_price * i.quantity for i in items) + paid_ids = [i.id for i in items] + + # Always write audit log — duplicate flag makes it visible in red in manager dashboard + db.add(OrderAuditLog( + order_id=order_id, + event_type="PAYMENT_OFFLINE", + waiter_id=user.id, + item_ids=json.dumps(paid_ids), + amount=total_paid, + payment_method=body.payment_method, + note=f"Emergency offline payment (uuid={body.uuid}){' — DUPLICATE' if is_duplicate else ''}", + offline_uuid=body.uuid, + offline_at=body.offline_at, + is_duplicate=1 if is_duplicate else 0, + )) + db.commit() + + if not is_duplicate: + broadcast_sync("order_paid", {"order_id": order_id, "table_id": order.table_id, "status": order.status, "paid_item_ids": paid_ids, "amount": total_paid, "payment_method": body.payment_method}) + + return { + "status": order.status if not is_duplicate else "duplicate", + "paid_item_ids": paid_ids, + "is_duplicate": is_duplicate, + } + + @router.delete("/{order_id}", status_code=status.HTTP_204_NO_CONTENT) def cancel_order(order_id: int, db: Session = Depends(get_db), user: User = Depends(require_manager)): order = db.query(Order).filter(Order.id == order_id).first() @@ -325,6 +424,7 @@ def cancel_order(order_id: int, db: Session = Depends(get_db), user: User = Depe order.closed_by = user.id _audit(db, order_id, "ORDER_CANCELLED", waiter_id=user.id) db.commit() + broadcast_sync("order_closed", {"order_id": order_id, "table_id": order.table_id}) @router.put("/{order_id}/assign-waiter") @@ -444,6 +544,7 @@ def transfer_order( note=f"Transferred from table {old_table_id} to table {body.target_table_id}") db.commit() db.refresh(order) + broadcast_sync("order_updated", {"order_id": order.id, "table_id": order.table_id, "old_table_id": old_table_id, "status": order.status, "action": "transferred"}) return order @@ -517,6 +618,8 @@ def merge_order( db.commit() db.refresh(target) + broadcast_sync("order_updated", {"order_id": target.id, "table_id": target.table_id, "status": target.status, "action": "merged"}) + broadcast_sync("order_closed", {"order_id": source.id, "table_id": source.table_id}) return target diff --git a/local_backend/routers/settings.py b/local_backend/routers/settings.py index 933738a..22cc038 100644 --- a/local_backend/routers/settings.py +++ b/local_backend/routers/settings.py @@ -17,13 +17,19 @@ VALID_SETTINGS = { "system.timezone": "IANA timezone name used by the backend container (e.g. Europe/Athens). Requires container restart to take effect.", "ui.table_colours": "JSON blob of table card colour scheme (light + dark modes) for the Waiter PWA.", "dev.spoof_printing": "When enabled, all print jobs are silently dropped. Devices behave as if printing succeeded.", - # Print font settings — values are "SIZE:BOLD" where SIZE is ESC ! base byte (0/16/32/48) and BOLD is 0 or 1 - "print.font_item_name": "Font for item name lines: SIZE:BOLD (e.g. '16:0')", - "print.font_options": "Font for option/modifier lines: SIZE:BOLD", - "print.font_table": "Font for table/waiter header lines: SIZE:BOLD", - "print.font_order_number": "Font for order number header: SIZE:BOLD", - "print.font_header": "Font for top header block: SIZE:BOLD", + # Print layout + "print.ticket_mode": "Kitchen ticket layout mode: 'detailed' or 'compact'", "print.divider_style": "Divider character used between sections: dash, equals, star, or empty", + # Print font settings — values are "SIZE:BOLD:CAPS" where SIZE is ESC ! base byte (0/16/32/48), BOLD 0|1, CAPS 0|1 + "print.font_order_number": "Font for order number header: SIZE:BOLD:CAPS", + "print.font_meta": "Font for table/waiter/time header block: SIZE:BOLD:CAPS", + "print.font_item_name": "Font for item name lines: SIZE:BOLD:CAPS", + "print.font_quick": "Font for quick option lines (* marker): SIZE:BOLD:CAPS", + "print.font_pref": "Font for preference choice lines (> marker): SIZE:BOLD:CAPS", + "print.font_extra": "Font for extra/option lines (+ marker): SIZE:BOLD:CAPS", + "print.font_ingredient": "Font for removed ingredient lines (- marker): SIZE:BOLD:CAPS", + "print.font_item_note": "Font for per-item note lines: SIZE:BOLD:CAPS", + "print.font_order_note": "Font for order-level notes: SIZE:BOLD:CAPS", } DEFAULTS = { @@ -33,12 +39,17 @@ DEFAULTS = { "system.timezone": "Europe/Athens", "ui.table_colours": "", "dev.spoof_printing": "false", - "print.font_item_name": "16:0", # double-height, no bold - "print.font_options": "0:0", # normal - "print.font_table": "16:0", # double-height - "print.font_order_number": "48:1", # double-height + double-width + bold - "print.font_header": "48:1", # double-height + double-width + bold + "print.ticket_mode": "detailed", "print.divider_style": "dash", + "print.font_order_number": "48:1:0", + "print.font_meta": "0:0:0", + "print.font_item_name": "16:1:0", + "print.font_quick": "0:0:0", + "print.font_pref": "0:0:0", + "print.font_extra": "0:0:0", + "print.font_ingredient": "0:0:0", + "print.font_item_note": "0:0:0", + "print.font_order_note": "0:1:0", } diff --git a/local_backend/routers/sse.py b/local_backend/routers/sse.py new file mode 100644 index 0000000..6ad6910 --- /dev/null +++ b/local_backend/routers/sse.py @@ -0,0 +1,60 @@ +""" +SSE stream endpoint — one long-lived GET per connected phone. + +Authentication: token passed as query param ?token= +(EventSource API in browsers cannot set custom headers, so query param is the standard pattern.) + +The client receives a stream of JSON lines: + data: {"type": "...", "data": {...}}\n\n + +A keepalive comment (": ping") is sent every 25 seconds to prevent proxy timeouts. +""" + +import asyncio +from fastapi import APIRouter, Query +from fastapi.responses import StreamingResponse + +from routers.deps import decode_token +from services.sse_bus import subscribe, unsubscribe + +router = APIRouter() + +KEEPALIVE_INTERVAL = 25 # seconds + + +async def _event_stream(user_id: int): + q = await subscribe(user_id) + try: + while True: + try: + payload = await asyncio.wait_for(q.get(), timeout=KEEPALIVE_INTERVAL) + yield f"data: {payload}\n\n" + except asyncio.TimeoutError: + # keepalive — prevents nginx/proxies from closing idle connections + yield ": ping\n\n" + except asyncio.CancelledError: + pass + finally: + await unsubscribe(user_id, q) + + +@router.get("/stream") +async def sse_stream(token: str = Query(...)): + """ + Open an SSE stream for the authenticated user. + The phone connects once on login and stays connected. + On reconnect (after network drop) it does a full GET first, then reconnects here. + """ + # decode_token raises HTTPException on invalid/expired — no manual check needed + payload = decode_token(token) + user_id: int = int(payload["sub"]) + + return StreamingResponse( + _event_stream(user_id), + media_type="text/event-stream", + headers={ + "Cache-Control": "no-cache", + "X-Accel-Buffering": "no", # disable nginx buffering + "Connection": "keep-alive", + }, + ) diff --git a/local_backend/routers/system.py b/local_backend/routers/system.py index 939fad4..fbc9eaf 100644 --- a/local_backend/routers/system.py +++ b/local_backend/routers/system.py @@ -61,6 +61,15 @@ def test_printer(printer_id: int, db: Session = Depends(get_db), user: User = De return {"success": success, "error": error} +@router.post("/printers/test-order") +def test_order_print(printer_id: int, db: Session = Depends(get_db), user: User = Depends(require_manager)): + printer = db.query(Printer).filter(Printer.id == printer_id).first() + if not printer: + raise HTTPException(status_code=404, detail="Printer not found") + success, error = printer_service.send_test_order_print(printer.ip_address, printer.port, db) + return {"success": success, "error": error} + + @router.put("/printers/{printer_id}", response_model=PrinterOut) def update_printer(printer_id: int, body: PrinterUpdate, db: Session = Depends(get_db), user: User = Depends(require_manager)): printer = db.query(Printer).filter(Printer.id == printer_id).first() diff --git a/local_backend/routers/tables.py b/local_backend/routers/tables.py index dd021b0..c02b2ae 100644 --- a/local_backend/routers/tables.py +++ b/local_backend/routers/tables.py @@ -12,6 +12,7 @@ from schemas.table import ( TableBatchCreate, ) from routers.deps import get_current_user, require_manager +from services.sse_bus import broadcast_sync router = APIRouter() @@ -105,6 +106,7 @@ def create_table(body: TableCreate, db: Session = Depends(get_db), user: User = db.add(table) db.commit() db.refresh(table) + broadcast_sync("table_list_changed", {"action": "created", "table_id": table.id}) return table diff --git a/local_backend/schemas/flag.py b/local_backend/schemas/flag.py index 505c87c..19bea65 100644 --- a/local_backend/schemas/flag.py +++ b/local_backend/schemas/flag.py @@ -7,6 +7,7 @@ class FlagDefCreate(BaseModel): name: str emoji: Optional[str] = None color: Optional[str] = "#6b7280" + text_color: Optional[str] = None sort_order: Optional[int] = 0 @@ -14,6 +15,7 @@ class FlagDefUpdate(BaseModel): name: Optional[str] = None emoji: Optional[str] = None color: Optional[str] = None + text_color: Optional[str] = None sort_order: Optional[int] = None is_active: Optional[bool] = None @@ -23,6 +25,7 @@ class FlagDefOut(BaseModel): name: str emoji: Optional[str] = None color: Optional[str] = None + text_color: Optional[str] = None sort_order: int is_active: bool diff --git a/local_backend/schemas/order.py b/local_backend/schemas/order.py index 5da7633..3fef693 100644 --- a/local_backend/schemas/order.py +++ b/local_backend/schemas/order.py @@ -9,6 +9,9 @@ class SelectedOptionInput(BaseModel): name: Optional[str] = None price_delta: Optional[float] = None extra_cost: Optional[float] = None + # type tags: "quick" | "pref" | "pref_sub" | "extra" | "extra_sub" + # Omitted by old clients — print code falls back gracefully. + type: Optional[str] = None class OrderItemInput(BaseModel): @@ -73,6 +76,13 @@ class PayItemsRequest(BaseModel): payment_method: Optional[str] = None # 'cash' | 'card' | 'other' — optional for now +class OfflinePaymentRequest(BaseModel): + uuid: str # client-generated UUID, used for duplicate detection + item_ids: List[int] + payment_method: Optional[str] = None + offline_at: Optional[str] = None # ISO timestamp of when payment was taken offline + + class AssignWaiterRequest(BaseModel): waiter_id: int @@ -93,6 +103,8 @@ class AuditLogOut(BaseModel): payment_method: Optional[str] = None note: Optional[str] = None created_at: UTCDatetime + offline_at: Optional[str] = None + is_duplicate: int = 0 model_config = {"from_attributes": True} diff --git a/local_backend/services/printer_service.py b/local_backend/services/printer_service.py index c146c76..7a730de 100644 --- a/local_backend/services/printer_service.py +++ b/local_backend/services/printer_service.py @@ -54,13 +54,32 @@ _DIVIDER_CHARS = { "empty": "", } -_PRINT_FONT_DEFAULTS = { - "print.font_item_name": "16:0", - "print.font_options": "0:0", - "print.font_table": "16:0", - "print.font_order_number": "48:1", - "print.font_header": "48:1", +_PRINT_SETTING_KEYS = [ + "print.ticket_mode", + "print.divider_style", + "print.font_order_number", + "print.font_meta", + "print.font_item_name", + "print.font_quick", + "print.font_pref", + "print.font_extra", + "print.font_ingredient", + "print.font_item_note", + "print.font_order_note", +] + +_PRINT_SETTING_DEFAULTS = { + "print.ticket_mode": "detailed", "print.divider_style": "dash", + "print.font_order_number": "48:1:0", + "print.font_meta": "0:0:0", + "print.font_item_name": "16:1:0", + "print.font_quick": "0:0:0", + "print.font_pref": "0:0:0", + "print.font_extra": "0:0:0", + "print.font_ingredient": "0:0:0", + "print.font_item_note": "0:0:0", + "print.font_order_note": "0:1:0", } # SIZE byte values (ESC ! base, no bold bit): @@ -68,27 +87,28 @@ _PRINT_FONT_DEFAULTS = { # 16 = double-height (bit4) # 32 = double-width (bit5) # 48 = double-height + double-width (bits 4+5) -# Bold is applied separately via ESC E. +# Bold applied via ESC E, caps applied in software before encoding. -def _decode_font(value: str) -> tuple[int, bool]: - """Parse 'SIZE:BOLD' string → (esc_bang_byte, bold_flag).""" +def _decode_font(value: str) -> tuple[int, bool, bool]: + """Parse 'SIZE:BOLD:CAPS' string → (esc_bang_byte, bold_flag, caps_flag).""" try: parts = str(value).split(":") size = int(parts[0]) bold = len(parts) > 1 and parts[1] == "1" - return size, bold + caps = len(parts) > 2 and parts[2] == "1" + return size, bold, caps except (ValueError, AttributeError): - return 0, False + return 0, False, False -def _load_print_fonts(db: Session) -> dict: +def _load_print_settings(db: Session) -> dict: rows = db.query(PosSettings).filter( - PosSettings.key.in_(_PRINT_FONT_DEFAULTS.keys()) + PosSettings.key.in_(_PRINT_SETTING_KEYS) ).all() - fonts = dict(_PRINT_FONT_DEFAULTS) + settings = dict(_PRINT_SETTING_DEFAULTS) for row in rows: - fonts[row.key] = row.value - return fonts + settings[row.key] = row.value + return settings def _divider(p: Network, style: str = "dash"): @@ -100,14 +120,42 @@ def _divider(p: Network, style: str = "dash"): p._raw(b'\n') -def _item_line(name: str, qty: int) -> str: - """Build a dot-leader line: 'Club Sandwich . . . . 1' at 48 chars.""" - qty_str = str(qty) - gap = LINE_WIDTH - len(name) - len(qty_str) - if gap < 3: - return f"{name} {qty_str}" - dots = (". " * ((gap // 2) + 1))[:gap] - return f"{name}{dots}{qty_str}" +def _item_line(name: str, qty: int, line_width: int = LINE_WIDTH) -> str: + """Build a dot-leader line ending with 'xN'. + line_width must reflect the effective width at the chosen font size + (double-width fonts halve the available char count to 24).""" + suffix = f"x{qty}" + available = line_width - len(name) - len(suffix) + if available < 2: + # Name alone is too long — put qty on same line with a single space + return f"{name} {suffix}" + dots = (". " * ((available // 2) + 1))[:available] + return f"{name}{dots}{suffix}" + + +def _apply_font(p: Network, size: int, bold: bool): + p._raw(bytes([0x1b, 0x21, size])) + p._raw(b'\x1b\x45\x01' if bold else b'\x1b\x45\x00') + + +def _reset_font(p: Network): + p._raw(b'\x1b\x21\x00') + p._raw(b'\x1b\x45\x00') + + +def _print_line(p: Network, text: str, size: int, bold: bool, caps: bool, + align: bytes = b'\x1b\x61\x00'): + """Apply font, optionally capitalize, print text + newline, reset font.""" + p._raw(align) + _apply_font(p, size, bold) + out = text.upper() if caps else text + _raw_text(p, out + "\n") + _reset_font(p) + + +def _greek_date(dt: datetime.datetime) -> str: + """Return date/time string in Greek format: HH:MM DD-MM-YYYY""" + return dt.strftime("%H:%M %d-%m-%Y") def check_printer(ip: str, port: int) -> bool: @@ -152,88 +200,368 @@ def send_test_print(ip: str, port: int, name: str) -> Tuple[bool, str]: return False, str(e) +def send_test_order_print(ip: str, port: int, db: Session) -> Tuple[bool, str]: + """Print a fake order using the current font/layout settings — for settings preview.""" + if _is_spoof_mode(db): + logger.info("Spoof printing ON — dropping test order print") + return True, "" + + # ── Fake data structures (no DB writes) ────────────────────────────────── + class _Table: + label = "O2" + number = 2 + + class _User: + nickname = "bonamin" + username = "bonamin" + + class _Order: + id = 99 + table = _Table() + opener = _User() + table_id = 2 + opened_by = 1 + notes = "Χωρις καψαλισμα παρακαλω" + + class _Item: + def __init__(self, product_id, quantity, selected_options, removed_ingredients, notes): + self.product_id = product_id + self.quantity = quantity + self.selected_options = selected_options + self.removed_ingredients = removed_ingredients + self.notes = notes + + import json as _json + + items = [ + # Item 1: Freddo Espresso — quick options + preference + note + _Item( + product_id=1001, + quantity=2, + selected_options=_json.dumps([ + {"name": "Διπλος", "price_delta": 0.5, "type": "quick"}, + {"name": "Εξτρα ζαχαρη", "price_delta": 0.0, "type": "quick"}, + {"name": "Παγωμενος", "price_delta": 0.0, "type": "quick"}, + {"name": "Γαλα", "price_delta": 0.0, "type": "pref"}, + {"name": "Βρωμης", "price_delta": 0.3, "type": "pref_sub"}, + ]), + removed_ingredients=None, + notes="Πολυ κρυο παρακαλω", + ), + # Item 2: Club Sandwich — extra with sub + removed ingredients + _Item( + product_id=1002, + quantity=1, + selected_options=_json.dumps([ + {"name": "Extra Bacon", "price_delta": 1.5, "type": "extra"}, + {"name": "Τραγανο", "price_delta": 0.0, "type": "extra_sub"}, + {"name": "Extra Bacon", "price_delta": 1.5, "type": "extra"}, + {"name": "Τραγανο", "price_delta": 0.0, "type": "extra_sub"}, + {"name": "Ψωμι", "price_delta": 0.0, "type": "pref"}, + {"name": "Σικαλεως", "price_delta": 0.0, "type": "pref_sub"}, + ]), + removed_ingredients=_json.dumps(["Ντοματα", "Μουσταρδα"]), + notes=None, + ), + # Item 3: Margherita — quick + extra + removed + _Item( + product_id=1003, + quantity=3, + selected_options=_json.dumps([ + {"name": "Well Done", "price_delta": 0.0, "type": "quick"}, + {"name": "Extra Τυρι", "price_delta": 1.0, "type": "extra"}, + {"name": "Extra Τυρι", "price_delta": 1.0, "type": "extra"}, + {"name": "Extra Τυρι", "price_delta": 1.0, "type": "extra"}, + ]), + removed_ingredients=_json.dumps(["Ελιες", "Κρεμμυδι"]), + notes=None, + ), + ] + + # Patch product lookup so _print_kitchen_ticket gets real names + _FAKE_NAMES = {1001: "Freddo Espresso", 1002: "Club Sandwich", 1003: "Margherita Pizza"} + + # Monkey-patch db.query for Product only inside this call + _orig_query = db.query + + class _FakeQuery: + def __init__(self, model): + self._model = model + self._filter_id = None + def filter(self, *args): + # extract id from the filter expression value + for arg in args: + try: + self._filter_id = arg.right.value + except Exception: + pass + return self + def first(self): + if self._model.__name__ == "Product" and self._filter_id in _FAKE_NAMES: + class _P: + name = _FAKE_NAMES[self._filter_id] + return _P() + return _orig_query(self._model).filter(self._model.id == self._filter_id).first() + + class _PatchedDB: + def query(self, model): + from models.product import Product as _Product + if model is _Product: + return _FakeQuery(model) + return _orig_query(model) + # delegate everything else to real db + def __getattr__(self, name): + return getattr(db, name) + + try: + p = _get_printer(ip, port) + _print_kitchen_ticket(p, _Order(), items, _PatchedDB()) + p.close() + return True, "" + except Exception as e: + logger.error("Test order print failed for %s:%s — %s", ip, port, e) + return False, str(e) + + # ── Receipt formatting ─────────────────────────────────────────────────────── -def _font(p: Network, byte_val: int, bold: bool = False): - p._raw(bytes([0x1b, 0x21, byte_val])) - p._raw(b'\x1b\x45\x01' if bold else b'\x1b\x45\x00') +def _parse_options(item: OrderItem) -> dict: + """ + Parse selected_options JSON into grouped dict: + { 'quick': [(name, qty)], 'pref': [(name, sub|None)], + 'extra': [(name, sub|None, qty)], 'unknown': [name] } + Falls back gracefully when type tags are absent (old data). + """ + result = {"quick": [], "pref": [], "extra": [], "unknown": []} + if not item.selected_options: + return result + + try: + raw = json.loads(item.selected_options) + except (json.JSONDecodeError, TypeError): + return result + + if not isinstance(raw, list): + return result + + i = 0 + while i < len(raw): + entry = raw[i] + if not isinstance(entry, dict): + i += 1 + continue + name = entry.get("name") or "" + etype = entry.get("type") + + # Peek at next entry to collect sub-choice + sub = None + if i + 1 < len(raw): + nxt = raw[i + 1] + if isinstance(nxt, dict) and nxt.get("type") in ("pref_sub", "extra_sub"): + sub = nxt.get("name") or "" + i += 1 # consume sub + + if etype == "quick": + # Collapse repeated quick entries into a single (name, qty) tuple + existing = next((q for q in result["quick"] if q[0] == name), None) + if existing: + result["quick"][result["quick"].index(existing)] = (name, existing[1] + 1) + else: + result["quick"].append((name, 1)) + elif etype == "pref": + result["pref"].append((name, sub)) + elif etype == "extra": + # Collapse repeated extra entries (same name+sub) → (name, sub, qty) + existing = next((e for e in result["extra"] if e[0] == name and e[1] == sub), None) + if existing: + result["extra"][result["extra"].index(existing)] = (name, sub, existing[2] + 1) + else: + result["extra"].append((name, sub, 1)) + else: + # Legacy data without type tag — treat as unknown, display plainly + if name: + result["unknown"].append(name + (f" · {sub}" if sub else "")) + + i += 1 + + return result def _print_kitchen_ticket(p: Network, order: Order, items: List[OrderItem], db: Session): - fonts = _load_print_fonts(db) - div = fonts["print.divider_style"] + cfg = _load_print_settings(db) + mode = cfg.get("print.ticket_mode", "detailed") + div = cfg.get("print.divider_style", "dash") + compact = (mode == "compact") - sz_order, bold_order = _decode_font(fonts["print.font_order_number"]) - sz_table, bold_table = _decode_font(fonts["print.font_table"]) - sz_item, bold_item = _decode_font(fonts["print.font_item_name"]) - sz_opt, bold_opt = _decode_font(fonts["print.font_options"]) + sz_ord, b_ord, c_ord = _decode_font(cfg["print.font_order_number"]) + sz_meta, b_meta, c_meta = _decode_font(cfg["print.font_meta"]) + sz_item, b_item, c_item = _decode_font(cfg["print.font_item_name"]) + sz_qk, b_qk, c_qk = _decode_font(cfg["print.font_quick"]) + sz_pr, b_pr, c_pr = _decode_font(cfg["print.font_pref"]) + sz_ex, b_ex, c_ex = _decode_font(cfg["print.font_extra"]) + sz_ing, b_ing, c_ing = _decode_font(cfg["print.font_ingredient"]) + sz_note, b_note, c_note = _decode_font(cfg["print.font_item_note"]) + sz_onote,b_onote,c_onote= _decode_font(cfg["print.font_order_note"]) - # Header — order number - p._raw(b'\x1b\x61\x01') - _font(p, sz_order, bold_order) - _raw_text(p, f"Παραγγελια #{order.id}\n") - p._raw(b'\x1b\x21\x00') - p._raw(b'\x1b\x45\x00') - _divider(p, div) + # Resolve display names + table_name = order.table.label or str(order.table.number) if order.table else str(order.table_id) + waiter_nick = (order.opener.nickname or order.opener.username) if order.opener else str(order.opened_by) + now_str = _greek_date(datetime.datetime.now()) - # Meta — table / waiter / time - p._raw(b'\x1b\x61\x00') - _font(p, sz_table, bold_table) - now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M") - _raw_text(p, f"Date: {now}\n") - _raw_text(p, f"Table: {order.table_id}\n") - _raw_text(p, f"Waiter: {order.opened_by}\n") - p._raw(b'\x1b\x21\x00') - p._raw(b'\x1b\x45\x00') - _divider(p, div) + # ── COMPACT header — single line ──────────────────────────────────────── + if compact: + p._raw(b'\x1b\x61\x00') + _apply_font(p, sz_ord, b_ord) + header = f"Παρ. #{order.id} | Τρ. {table_name} | {now_str} | {waiter_nick}" + _raw_text(p, (header.upper() if c_ord else header) + "\n") + _reset_font(p) + _divider(p, div) + + # ── DETAILED header ────────────────────────────────────────────────────── + else: + _print_line(p, f"Παραγγελια #{order.id}", sz_ord, b_ord, c_ord, + align=b'\x1b\x61\x01') + _divider(p, div) + p._raw(b'\x1b\x61\x00') + _apply_font(p, sz_meta, b_meta) + _raw_text(p, ("ΤΡΑΠΕΖΙ:" if c_meta else "Τραπεζι:") + f" Τραπεζι {table_name}\n") + _raw_text(p, ("ΗΜΕΡΟΜΗΝΙΑ:" if c_meta else "Ημερομηνια:") + f" {now_str}\n") + _raw_text(p, ("ΣΕΡΒΙΤΟΡΟΣ:" if c_meta else "Σερβιτορος:") + f" {waiter_nick}\n") + _reset_font(p) + _divider(p, div) + + # ── Items ──────────────────────────────────────────────────────────────── + # Double-width fonts halve the effective character width + item_line_width = LINE_WIDTH // 2 if sz_item in (32, 48) else LINE_WIDTH - # Items for item in items: product = db.query(Product).filter(Product.id == item.product_id).first() - name = product.name if product else f"Product #{item.product_id}" + raw_name = product.name if product else f"Product #{item.product_id}" + item_name = raw_name.upper() if c_item else raw_name - _font(p, sz_item, bold_item) - _raw_text(p, _item_line(name, item.quantity) + "\n") - p._raw(b'\x1b\x21\x00') - p._raw(b'\x1b\x45\x00') + p._raw(b'\x1b\x61\x00') + _apply_font(p, sz_item, b_item) + _raw_text(p, _item_line(item_name, item.quantity, item_line_width) + "\n") + _reset_font(p) - _font(p, sz_opt, bold_opt) + opts = _parse_options(item) + + # Quick options (* marker) + if opts["quick"]: + if compact: + parts = [] + for name, qty in opts["quick"]: + n = name.upper() if c_qk else name + parts.append(f"{n} x{qty}" if qty > 1 else n) + _apply_font(p, sz_qk, b_qk) + _raw_text(p, "* " + " | ".join(parts) + "\n") + _reset_font(p) + else: + for name, qty in opts["quick"]: + n = name.upper() if c_qk else name + line = f"* {n} x{qty}" if qty > 1 else f"* {n}" + _apply_font(p, sz_qk, b_qk) + _raw_text(p, line + "\n") + _reset_font(p) + + # Preferences (> marker) + if opts["pref"]: + if compact: + parts = [] + for name, sub in opts["pref"]: + n = name.upper() if c_pr else name + s = (sub.upper() if c_pr else sub) if sub else None + parts.append(f"{n} · {s}" if s else n) + _apply_font(p, sz_pr, b_pr) + _raw_text(p, "> " + " | ".join(parts) + "\n") + _reset_font(p) + else: + for name, sub in opts["pref"]: + n = name.upper() if c_pr else name + s = (sub.upper() if c_pr else sub) if sub else None + line = f"> {n} · {s}" if s else f"> {n}" + _apply_font(p, sz_pr, b_pr) + _raw_text(p, line + "\n") + _reset_font(p) + + # Extras (+ marker) + if opts["extra"]: + if compact: + parts = [] + for name, sub, qty in opts["extra"]: + n = name.upper() if c_ex else name + s = (sub.upper() if c_ex else sub) if sub else None + part = f"{n} · {s}" if s else n + if qty > 1: + part += f" · x{qty}" + parts.append(part) + _apply_font(p, sz_ex, b_ex) + _raw_text(p, "+ " + " | ".join(parts) + "\n") + _reset_font(p) + else: + for name, sub, qty in opts["extra"]: + n = name.upper() if c_ex else name + s = (sub.upper() if c_ex else sub) if sub else None + line = f"+ {n}" + if s: + line += f" · {s}" + if qty > 1: + line += f" · x{qty}" + _apply_font(p, sz_ex, b_ex) + _raw_text(p, line + "\n") + _reset_font(p) + + # Legacy untagged options + for entry in opts["unknown"]: + _apply_font(p, sz_ex, b_ex) + _raw_text(p, f"+ {entry}\n") + _reset_font(p) + + # Removed ingredients (- marker) if item.removed_ingredients: try: - removed_ids = json.loads(item.removed_ingredients) - if removed_ids: - _raw_text(p, f" - χωρις: {', '.join(str(i) for i in removed_ids)}\n") - except (json.JSONDecodeError, TypeError): - pass - - if item.selected_options: - try: - option_ids = json.loads(item.selected_options) - if option_ids: - _raw_text(p, f" + επιλογες: {', '.join(str(i) for i in option_ids)}\n") + removed = json.loads(item.removed_ingredients) + if removed: + names = [n.upper() if c_ing else n for n in removed] + joined = " · ".join(names) + _apply_font(p, sz_ing, b_ing) + _raw_text(p, f"- ΧΩΡΙΣ: {joined}\n") + _reset_font(p) except (json.JSONDecodeError, TypeError): pass + # Per-item note if item.notes: - _raw_text(p, f" (i) {item.notes}\n") + note_text = item.notes.upper() if c_note else item.notes + _apply_font(p, sz_note, b_note) + if compact: + _raw_text(p, f"! {note_text}\n") + else: + _raw_text(p, f"\n(!) {note_text}\n\n") + _reset_font(p) - p._raw(b'\x1b\x21\x00') - p._raw(b'\x1b\x45\x00') + # Blank line between items in detailed mode + if not compact: + p._raw(b'\n') _divider(p, div) + # Order-level notes if order.notes: - p._raw(b'\x1b\x21\x30') - _raw_text(p, "Σημειωσεις:\n") - p._raw(b'\x1b\x21\x10') - _raw_text(p, f"{order.notes}\n") - p._raw(b'\x1b\x21\x00') - _divider(p) + note_text = order.notes.upper() if c_onote else order.notes + _apply_font(p, sz_onote, b_onote) + _raw_text(p, f"Σημ: {note_text}\n") + _reset_font(p) + if not compact: + _divider(p, div) + + # Footer (detailed only) + if not compact: + p._raw(b'\x1b\x61\x01') + p._raw(b'\x1b\x21\x30') + _raw_text(p, "Τελος Παραγγελιας\n") + p._raw(b'\x1b\x21\x00') - p._raw(b'\x1b\x61\x01') - p._raw(b'\x1b\x21\x30') - _raw_text(p, "Τελος Παραγγελιας\n") - p._raw(b'\x1b\x21\x00') p._raw(b'\n\n\n') p.cut() diff --git a/local_backend/services/sse_bus.py b/local_backend/services/sse_bus.py new file mode 100644 index 0000000..6680f6c --- /dev/null +++ b/local_backend/services/sse_bus.py @@ -0,0 +1,84 @@ +""" +SSE Event Bus — in-memory broadcaster for Server-Sent Events. + +All routers import `broadcast_sync()` to push events from sync routes. +The SSE endpoint imports `subscribe()` / `unsubscribe()` to manage per-client queues. + +Event shape (JSON-serialisable dict): + { "type": "", "data": { ... } } + +Supported event types: + order_updated — order created / item added / transferred / merged + order_paid — items paid on an order + order_closed — order closed or cancelled + table_list_changed — table added/removed + table_flags_changed — flags set/cleared on a table + message_sent — new staff message (targeted or broadcast) + shift_changed — shift started / ended by manager + business_day_changed — business day opened / closed +""" + +import asyncio +import json +from typing import Dict, Set + +# Captured once at startup by init_loop() called from lifespan. +# Sync route threads use this to schedule coroutines safely. +_main_loop: asyncio.AbstractEventLoop | None = None + +# waiter_id → set of asyncio.Queue (one per SSE connection for that user) +_queues: Dict[int, Set[asyncio.Queue]] = {} + + +def init_loop(loop: asyncio.AbstractEventLoop) -> None: + """Call once from the FastAPI lifespan (async context) to capture the event loop.""" + global _main_loop + _main_loop = loop + + +async def subscribe(user_id: int) -> asyncio.Queue: + q: asyncio.Queue = asyncio.Queue(maxsize=256) + if user_id not in _queues: + _queues[user_id] = set() + _queues[user_id].add(q) + return q + + +async def unsubscribe(user_id: int, q: asyncio.Queue) -> None: + if user_id in _queues: + _queues[user_id].discard(q) + if not _queues[user_id]: + del _queues[user_id] + + +def broadcast_sync(event_type: str, data: dict, *, user_ids: list[int] | None = None) -> None: + """ + Fire-and-forget broadcast from a synchronous FastAPI route (thread-pool worker). + Uses call_soon_threadsafe so the coroutine runs on the main event loop, not the thread. + """ + if _main_loop is None: + return + _main_loop.call_soon_threadsafe( + _main_loop.create_task, + broadcast(event_type, data, user_ids=user_ids), + ) + + +async def broadcast(event_type: str, data: dict, *, user_ids: list[int] | None = None) -> None: + """ + Push an event to connected clients. + user_ids=None → broadcast to ALL connected users + user_ids=[...] → send only to those specific user IDs + """ + payload = json.dumps({"type": event_type, "data": data}) + targets = ( + {uid: qs for uid, qs in _queues.items() if uid in user_ids} + if user_ids is not None + else dict(_queues) + ) + for qs in targets.values(): + for q in list(qs): + try: + q.put_nowait(payload) + except asyncio.QueueFull: + pass # slow client — drop rather than block diff --git a/manager_dashboard/src/pages/OrderDetailPage.jsx b/manager_dashboard/src/pages/OrderDetailPage.jsx index 44718ff..f210347 100644 --- a/manager_dashboard/src/pages/OrderDetailPage.jsx +++ b/manager_dashboard/src/pages/OrderDetailPage.jsx @@ -49,6 +49,7 @@ const EVENT_LABELS = { ORDER_OPENED: 'Άνοιγμα', ITEMS_ADDED: 'Προσθήκη', PAYMENT: 'Πληρωμή', + PAYMENT_OFFLINE: 'Πληρωμή (Offline)', ORDER_CLOSED: 'Κλείσιμο', ORDER_CANCELLED: 'Ακύρωση', ITEM_CANCELLED: 'Ακύρωση αντ.', @@ -60,30 +61,47 @@ function AuditTab({ order, waiterMap }) { } return (

- {order.audit_logs.map(log => ( -
-
- - {EVENT_LABELS[log.event_type] ?? log.event_type} - + {order.audit_logs.map(log => { + const isDuplicate = log.is_duplicate === 1 || log.is_duplicate === true + const isPayment = log.event_type === 'PAYMENT' || log.event_type === 'PAYMENT_OFFLINE' + const badgeClass = isDuplicate + ? 'bg-red-100 text-red-700' + : isPayment ? 'bg-green-100 text-green-700' + : log.event_type.includes('CANCEL') ? 'bg-red-100 text-red-600' + : log.event_type === 'ORDER_CLOSED' ? 'bg-gray-100 text-gray-600' + : 'bg-blue-100 text-blue-700' + // Show offline_at (real payment time) when available, else server created_at + const displayTime = log.offline_at ? formatDate(log.offline_at) : formatDate(log.created_at) + return ( +
+
+ + {EVENT_LABELS[log.event_type] ?? log.event_type} + + {isDuplicate && ( + ΔΙΠΛΗ + )} +
+
+ {log.waiter_name ?? waiterMap[log.waiter_id] ?? `#${log.waiter_id}`} + {log.amount != null && ( + + €{log.amount.toFixed(2)} + + )} + {log.payment_method && ( + ({log.payment_method}) + )} +
+
+ {displayTime} + {log.offline_at && ( + offline + )} +
-
- {log.waiter_name ?? waiterMap[log.waiter_id] ?? `#${log.waiter_id}`} - {log.amount != null && ( - €{log.amount.toFixed(2)} - )} - {log.payment_method && ( - ({log.payment_method}) - )} -
- {formatDate(log.created_at)} -
- ))} + ) + })}
) } diff --git a/manager_dashboard/src/pages/Settings/tabs/AppInfoTab.jsx b/manager_dashboard/src/pages/Settings/tabs/AppInfoTab.jsx index 3032623..a0be4c1 100644 --- a/manager_dashboard/src/pages/Settings/tabs/AppInfoTab.jsx +++ b/manager_dashboard/src/pages/Settings/tabs/AppInfoTab.jsx @@ -270,7 +270,7 @@ function FlagDefsSection() { const qc = useQueryClient() const [editingId, setEditingId] = useState(null) const [editForm, setEditForm] = useState({}) - const [newForm, setNewForm] = useState({ name: '', emoji: '', color: '#6b7280' }) + const [newForm, setNewForm] = useState({ name: '', emoji: '', color: '#6b7280', text_color: null }) const [showNew, setShowNew] = useState(false) const { data: flags = [], isLoading } = useQuery({ queryKey: ['flag-defs'], @@ -279,7 +279,7 @@ function FlagDefsSection() { }) const createMut = useMutation({ mutationFn: (body) => client.post('/api/flags/defs', body), - onSuccess: () => { toast.success('Δημιουργήθηκε'); qc.invalidateQueries({ queryKey: ['flag-defs'] }); setShowNew(false); setNewForm({ name: '', emoji: '', color: '#6b7280' }) }, + onSuccess: () => { toast.success('Δημιουργήθηκε'); qc.invalidateQueries({ queryKey: ['flag-defs'] }); setShowNew(false); setNewForm({ name: '', emoji: '', color: '#6b7280', text_color: null }) }, onError: () => toast.error('Σφάλμα'), }) const updateMut = useMutation({ @@ -294,7 +294,7 @@ function FlagDefsSection() { }) function startEdit(flag) { setEditingId(flag.id) - setEditForm({ name: flag.name, emoji: flag.emoji || '', color: flag.color || '#6b7280', sort_order: flag.sort_order }) + setEditForm({ name: flag.name, emoji: flag.emoji || '', color: flag.color || '#6b7280', text_color: flag.text_color || null, sort_order: flag.sort_order }) } const rowStyle = { display: 'flex', alignItems: 'center', gap: 10, padding: '10px 20px', borderBottom: '1px solid #f4f4f2' } return ( @@ -320,6 +320,13 @@ function FlagDefsSection() { style={{ width: 24, height: 24, borderRadius: '50%', background: c, border: newForm.color === c ? '3px solid #111' : '2px solid transparent', cursor: 'pointer' }} /> ))}
+
+ Χρώμα γραφής: + {[{ val: null, label: 'Α', bg: newForm.color || '#6b7280', text: '#ffffff' }, { val: '#000000', label: 'Α', bg: newForm.color || '#6b7280', text: '#000000' }].map(opt => ( + + ))} +
@@ -342,6 +349,12 @@ function FlagDefsSection() { style={{ width: 20, height: 20, borderRadius: '50%', background: c, border: editForm.color === c ? '3px solid #111' : '2px solid transparent', cursor: 'pointer' }} /> ))}
+
+ {[{ val: null, text: '#ffffff' }, { val: '#000000', text: '#000000' }].map(opt => ( + + ))} +
+ ) +} - function handleSize(e) { onChange(field.key, encodeFont(e.target.value, bold)) } - function handleBold() { onChange(field.key, encodeFont(size, !bold)) } +// ── Single font row ──────────────────────────────────────────────────────── +function FontRow({ field, value, onChange, isPending, nested = false }) { + const { size, bold, caps } = decodeFont(value) + + function handleSize(e) { onChange(field.key, encodeFont(e.target.value, bold, caps)) } + function handleBold() { onChange(field.key, encodeFont(size, !bold, caps)) } + function handleCaps() { onChange(field.key, encodeFont(size, bold, !caps)) } return (
+ {nested && ( + + )} {/* Label */}
- + {field.label} - {field.sub} + {field.sub && ( + {field.sub} + )}
{/* Size dropdown */} @@ -123,31 +153,28 @@ function FontRow({ field, value, onChange, isPending }) { {/* Bold toggle */} - + + + {/* Caps toggle */} + {/* Preview */} - + +
+ ) +} + +// ── Subgroup header row ──────────────────────────────────────────────────── +function SubgroupHeader({ label }) { + return ( +
+ + {label} +
) } @@ -181,10 +208,10 @@ function DividerRow({ value, onChange, isPending }) { ))} - {/* spacer to align with bold button column */} -
+ {/* spacer to align with bold+caps column */} +
- {/* Preview — same fixed size as font previews */} + {/* Preview */}
{ + if (printers.length > 0 && !selectedPrinter) { + const first = printers.find(p => p.is_active) ?? printers[0] + setSelectedPrinter(first.id) + } + }, [printers]) + + async function handleTestOrder() { + if (!selectedPrinter) return + setPrinting(true) + try { + const res = await client.post(`/api/system/printers/test-order?printer_id=${selectedPrinter}`) + if (res.data.success) toast.success('Test order στάλθηκε!') + else toast.error(`Σφάλμα: ${res.data.error}`) + } catch { + toast.error('Σφάλμα επικοινωνίας') + } finally { + setPrinting(false) + } + } + + return ( +
+
+

Τύπος Εκτύπωσης

+

+ Επιλέξτε πόσο λεπτομερές θα είναι κάθε ticket κουζίνας. +

+
+
+ {[ + { + key: 'detailed', + title: 'Αναλυτικό', + desc: 'Κάθε επιλογή σε ξεχωριστή γραμμή. Περισσότερος χώρος, μέγιστη ευκρίνεια.', + }, + { + key: 'compact', + title: 'Συμπαγές', + desc: 'Ίδιου τύπου επιλογές στην ίδια γραμμή, διαχωρισμένες με |. Λιγότερο χαρτί.', + }, + ].map(opt => { + const active = value === opt.key + return ( + + ) + })} + + {/* Test order button */} + +
+
+ ) +} + // ── Printers section ─────────────────────────────────────────────────────── const PROTOCOLS = [{ value: 'escpos_tcp', label: 'ESC/POS TCP (standard)' }] - const EMPTY_FORM = { name: '', ip_address: '', port: 9100, protocol: 'escpos_tcp', is_active: true } function PrinterForm({ initial, onSave, onCancel, isPending }) { @@ -284,7 +428,6 @@ function PrinterRow({ printer, onEdit, onDelete, onTest, onToggle, testPending } opacity: printer.is_active ? 1 : 0.5, flexWrap: 'wrap', }}> - {/* Enable/disable toggle */} - {/* Name + connection info */}
{printer.name} @@ -306,7 +448,6 @@ function PrinterRow({ printer, onEdit, onDelete, onTest, onToggle, testPending } — {printer.protocol}
- {/* Reachability badge */} - {/* Actions */} +
+ +

+ Αυτόματη επανάληψη κάθε 10 δευτερόλεπτα +

+
+
+ ) +} diff --git a/waiter_pwa/src/components/EmergencyBar.jsx b/waiter_pwa/src/components/EmergencyBar.jsx new file mode 100644 index 0000000..5d27e1c --- /dev/null +++ b/waiter_pwa/src/components/EmergencyBar.jsx @@ -0,0 +1,40 @@ +import { useEffect, useState } from 'react' +import useConnectionStore from '../store/connectionStore' + +export default function EmergencyBar() { + const { status, lostAt } = useConnectionStore() + const [elapsed, setElapsed] = useState('') + + useEffect(() => { + if (status !== 'emergency' || !lostAt) return + function tick() { + const secs = Math.floor((Date.now() - lostAt.getTime()) / 1000) + const m = Math.floor(secs / 60) + const s = secs % 60 + setElapsed(`${m}:${String(s).padStart(2, '0')}`) + } + tick() + const id = setInterval(tick, 1000) + return () => clearInterval(id) + }, [status, lostAt]) + + if (status !== 'emergency') return null + + return ( +
+ EMERGENCY MODE + {elapsed && ( + ({elapsed}) + )} +
+ ) +} diff --git a/waiter_pwa/src/components/ItemOptionsModal.jsx b/waiter_pwa/src/components/ItemOptionsModal.jsx index f3d3e2b..d10040f 100644 --- a/waiter_pwa/src/components/ItemOptionsModal.jsx +++ b/waiter_pwa/src/components/ItemOptionsModal.jsx @@ -147,20 +147,20 @@ export default function ItemOptionsModal({ product, onAdd, onClose }) { const prefChoices = preferenceSets.flatMap(ps => { const choice = selectedPreferences[ps.id] if (!choice) return [] - const entries = [{ id: choice.id, name: choice.name, price_delta: choice.extra_cost ?? 0 }] + const entries = [{ id: choice.id, name: choice.name, price_delta: choice.extra_cost ?? 0, type: 'pref' }] const inlineSub = choice.sub_choices?.length > 0 ? (selectedSubChoices[choice.id] ?? null) : null - if (inlineSub) entries.push({ id: null, name: inlineSub.name, price_delta: inlineSub.extra_cost ?? 0 }) + if (inlineSub) entries.push({ id: null, name: inlineSub.name, price_delta: inlineSub.extra_cost ?? 0, type: 'pref_sub' }) if (ps.shared_subset?.choices?.length > 0 && !choice.disables_subset) { const sharedSub = selectedSharedSubs[ps.id] ?? null - if (sharedSub) entries.push({ id: null, name: sharedSub.name, price_delta: sharedSub.extra_cost ?? 0 }) + if (sharedSub) entries.push({ id: null, name: sharedSub.name, price_delta: sharedSub.extra_cost ?? 0, type: 'pref_sub' }) } return entries }) const optionEntries = selectedOptions.flatMap(o => { - const entries = [{ id: o.id, name: o.name, price_delta: o.price_delta ?? 0 }] + const entries = [{ id: o.id, name: o.name, price_delta: o.price_delta ?? 0, type: 'extra' }] const sub = selectedOptionSubs[o.id] - if (sub) entries.push({ id: null, name: sub.name, price_delta: sub.extra_cost ?? 0 }) + if (sub) entries.push({ id: null, name: sub.name, price_delta: sub.extra_cost ?? 0, type: 'extra_sub' }) return entries }) diff --git a/waiter_pwa/src/components/OrderDrawer.jsx b/waiter_pwa/src/components/OrderDrawer.jsx index de796df..252b018 100644 --- a/waiter_pwa/src/components/OrderDrawer.jsx +++ b/waiter_pwa/src/components/OrderDrawer.jsx @@ -715,9 +715,9 @@ export default function OrderDrawer({ product, isOpen, onClose, onAdd, initialSt && (!sharedSub || sharedSub.name === defaultSharedSub?.name) if (isFullyDefault) return [] - const entries = [{ id: choice.id, name: choice.name, price_delta: choice.extra_cost ?? 0 }] - if (inlineSub) entries.push({ id: null, name: inlineSub.name, price_delta: inlineSub.extra_cost ?? 0 }) - if (sharedSub) entries.push({ id: null, name: sharedSub.name, price_delta: sharedSub.extra_cost ?? 0 }) + const entries = [{ id: choice.id, name: choice.name, price_delta: choice.extra_cost ?? 0, type: 'pref' }] + if (inlineSub) entries.push({ id: null, name: inlineSub.name, price_delta: inlineSub.extra_cost ?? 0, type: 'pref_sub' }) + if (sharedSub) entries.push({ id: null, name: sharedSub.name, price_delta: sharedSub.extra_cost ?? 0, type: 'pref_sub' }) return entries }) @@ -727,8 +727,8 @@ export default function OrderDrawer({ product, isOpen, onClose, onAdd, initialSt const sub = opt.sub_choices?.find(s => s.name === sel.subName) const entries = [] for (let i = 0; i < sel.qty; i++) { - entries.push({ id: opt.id, name: opt.name, price_delta: opt.extra_cost ?? 0 }) - if (sub) entries.push({ id: null, name: sub.name, price_delta: sub.extra_cost ?? 0 }) + entries.push({ id: opt.id, name: opt.name, price_delta: opt.extra_cost ?? 0, type: 'extra' }) + if (sub) entries.push({ id: null, name: sub.name, price_delta: sub.extra_cost ?? 0, type: 'extra_sub' }) } return entries }) @@ -736,7 +736,7 @@ export default function OrderDrawer({ product, isOpen, onClose, onAdd, initialSt const quickEntries = quickOptions.flatMap(opt => { const q = quickState[opt.id] || 0 if (q === 0) return [] - return Array.from({ length: q }, () => ({ id: null, name: opt.name, price_delta: opt.price ?? 0 })) + return Array.from({ length: q }, () => ({ id: null, name: opt.name, price_delta: opt.price ?? 0, type: 'quick' })) }) const removedNames = ingredients.filter(ing => removedState[ing.id]).map(ing => ing.name) diff --git a/waiter_pwa/src/components/ProductPicker.jsx b/waiter_pwa/src/components/ProductPicker.jsx index 9fef5c1..ccfbe76 100644 --- a/waiter_pwa/src/components/ProductPicker.jsx +++ b/waiter_pwa/src/components/ProductPicker.jsx @@ -73,12 +73,11 @@ function buildSections(parent, subcategories, directProducts) { return sections.sort((a, b) => a.sort_order - b.sort_order) } -export default function ProductPicker({ categories, products, onAdd }) { +export default function ProductPicker({ categories, products, onAdd, viewAllOpen, setViewAllOpen }) { const topLevel = categories.filter(c => !c.parent_id).sort((a, b) => a.sort_order - b.sort_order) const initialCatId = topLevel[0]?.id ?? null const [activeCat, setActiveCat] = useState(initialCatId) const [drawerProduct, setDrawerProduct] = useState(null) - const [viewAllOpen, setViewAllOpen] = useState(false) // Track which sub-category sections are expanded (by sub-cat id or '__general__') const [expandedSubs, setExpandedSubs] = useState(() => { if (!initialCatId) return {} @@ -125,18 +124,7 @@ export default function ProductPicker({ categories, products, onAdd }) { return (
-
- -
-
-
{topLevel.map(cat => { const isActive = activeCat === cat.id diff --git a/waiter_pwa/src/components/TableCard.jsx b/waiter_pwa/src/components/TableCard.jsx index a11fc01..e94beba 100644 --- a/waiter_pwa/src/components/TableCard.jsx +++ b/waiter_pwa/src/components/TableCard.jsx @@ -2,6 +2,8 @@ import { useRef, useState } from 'react' import useThemeStore from '../store/themeStore' import useTableColourStore from '../store/tableColourStore' +const API_URL = import.meta.env.VITE_API_URL || '' + const STATUS_LABELS = { free: 'ΕΛΕΥΘΕΡΟ', open: 'ΑΝΟΙΧΤΟ', @@ -13,7 +15,555 @@ const STATUS_LABELS = { const DRAG_THRESHOLD = 8 const HOLD_MS = 480 -export default function TableCard({ table, order, isMine, flags = [], groupName = '', onClick, onLongPress }) { +// ─── Avatar helpers ─────────────────────────────────────────────────────────── + +const AVATAR_PALETTE = ['#3758c9', '#7a44c9', '#2f9e5e', '#d94b26', '#8a6d2b', '#0d7a8a', '#c93775', '#1d6f3a'] + +function avatarColor(name = '') { + let h = 0 + for (let i = 0; i < name.length; i++) h = (h * 31 + name.charCodeAt(i)) >>> 0 + return AVATAR_PALETTE[h % AVATAR_PALETTE.length] +} + +function WaiterAvatar({ waiter, size = 22, ring }) { + const displayName = waiter.nickname || waiter.full_name || waiter.username || '?' + const initials = displayName.trim().split(' ').map(p => p[0]).slice(0, 2).join('').toUpperCase() + const ringStyle = ring ? { boxShadow: `0 0 0 2px ${ring}` } : {} + + if (waiter.avatar_url) { + return ( + {displayName} + ) + } + return ( +
{initials}
+ ) +} + +// Renders [icon] Name, [icon] Name inline. Falls back to icons + "X Waiters" if they don't fit +// (we approximate "don't fit" as > 2 waiters for the compact footer height). +function WaiterRow({ waiters, size = 22, cfg }) { + if (!waiters?.length) return null + const textColor = cfg.nameText + + // ≤ 2 waiters: show icon + name pairs + if (waiters.length <= 2) { + return ( +
+ {waiters.map((w, i) => { + const name = w.nickname || w.full_name || w.username || '?' + return ( +
+ {i > 0 && ·} + + {name} +
+ ) + })} +
+ ) + } + + // > 2 waiters: icons only + "X Waiters" label + return ( +
+ {waiters.slice(0, 3).map((w, i) => ( +
+ +
+ ))} + {waiters.length > 3 && ( +
+{waiters.length - 3}
+ )} + + {waiters.length} σερβιτόροι + +
+ ) +} + +// ─── Status pill ────────────────────────────────────────────────────────────── + +function StatusPill({ label, badgeBg, badgeText, small }) { + return ( + {label} + ) +} + +// ─── Flag dot ───────────────────────────────────────────────────────────────── + +function FlagDot({ flag, size = 22 }) { + const textColor = flag.text_color || '#ffffff' + return ( +
+ {flag.emoji || '🏷️'} +
+ ) +} + +// ─── Flag overflow row: show up to maxShow dots, then +N bubble ─────────────── + +function FlagDots({ flags, size, maxShow }) { + if (!flags.length) return null + const visible = flags.slice(0, maxShow) + const overflow = flags.length - maxShow + return ( +
+ {visible.map(f => )} + {overflow > 0 && ( +
+{overflow}
+ )} +
+ ) +} + +// ─── Flag chip (icon + label) ───────────────────────────────────────────────── + +function FlagChip({ flag }) { + const textColor = flag.text_color || '#ffffff' + return ( +
+ {flag.emoji || '🏷️'} + + {flag.name} + +
+ ) +} + +// ─── Amount display ─────────────────────────────────────────────────────────── + +function Amount({ value, size = 22, color }) { + const s = Number(value || 0).toFixed(2) + const [whole, cents] = s.split('.') + const isNum = typeof size === 'number' + const centsSize = isNum ? size * 0.56 : `calc(${size} * 0.56)` + return ( +
+ {whole} + .{cents}€ +
+ ) +} + +// ─── Card variants ──────────────────────────────────────────────────────────── + +// 1x1 — square-ish, 4 per row. Badges top (up to 2 + +N), name center, status bottom. +function Card1x1({ table, order, flags, waiterObjects, cfg, statusKey }) { + return ( +
+ {/* top strip: badges up to 2, then +N */} +
+ +
+ + {/* center: name */} +
+ {table.label || `T${table.number}`} +
+ + {/* bottom strip: status */} +
+ + {STATUS_LABELS[statusKey]} + +
+
+ ) +} + +// 2x1 — half width, compact horizontal. Name left, status + badges (up to 3 + +N) right. +function Card2x1({ table, order, flags, waiterObjects, cfg, statusKey }) { + return ( +
+
+ {table.label || `T${table.number}`} +
+ +
+ + {flags.length > 0 && ( + + )} +
+
+ ) +} + +// 2x2 — current-style square. Name top-left, status (slightly smaller) below, amount bottom-left, flags right. +function Card2x2({ table, order, flags, waiterObjects, cfg, statusKey }) { + const isFree = !order + const total = order?.items?.filter(i => i.status === 'active').reduce((s, i) => s + i.unit_price * i.quantity, 0) ?? 0 + const showAmount = !isFree + + return ( +
+ {/* left column */} +
+ + {table.label || `T${table.number}`} + +
+ +
+
+ {showAmount && } +
+
+ + {/* right column: flags — show 2, then +N */} + {flags.length > 0 && ( +
+ +
+ )} +
+ ) +} + +// 4x1 — full width horizontal. Name + amount left-center, badges (up to 3 + +N) + status right. +function Card4x1({ table, order, flags, waiterObjects, cfg, statusKey }) { + const isFree = !order + const total = order?.items?.filter(i => i.status === 'active').reduce((s, i) => s + i.unit_price * i.quantity, 0) ?? 0 + const showAmount = !isFree + + return ( +
+ {/* name */} +
+ {table.label || `T${table.number}`} +
+ + {/* separator dot */} + · + + {/* amount */} +
+ {showAmount && } +
+ + {/* flags up to 3 + +N */} + {flags.length > 0 && ( + + )} + + {/* status */} + +
+ ) +} + +// 4x2 — full width, tall. One main row: name+zone left, status center, amount+flags right. Flag chips below. Waiter footer. +function Card4x2({ table, order, flags, waiterObjects, groupName, cfg, statusKey }) { + const isFree = !order + const total = order?.items?.filter(i => i.status === 'active').reduce((s, i) => s + i.unit_price * i.quantity, 0) ?? 0 + const showAmount = !isFree + const showWaiters = !isFree && waiterObjects.length > 0 + + return ( +
+ {/* main body */} +
+ {/* top row: name LEFT | status CENTER | amount RIGHT — all top-aligned */} +
+ {/* left: name + zone */} +
+
+ {table.label || `T${table.number}`} +
+ {groupName && ( +
+ {groupName} +
+ )} +
+ + {/* center: status pill — top-aligned via paddingTop to optically align with name cap */} +
+ +
+ + {/* right: amount — top-aligned */} + {showAmount && ( +
+ +
+ )} +
+ + {/* flag chips row — right-aligned */} + {flags.length > 0 && ( +
+ {flags.slice(0, 4).map(f => )} + {flags.length > 4 && ( +
+{flags.length - 4}
+ )} +
+ )} +
+ + {/* footer: waiters */} +
+ {showWaiters + ? + : + } +
+
+ ) +} + +// 4x3 — full width, two-column detail card. Left: name/zone/status/amount. Right: order items list. Footer: waiters. +function Card4x3({ table, order, flags, waiterObjects, groupName, cfg, statusKey }) { + const isFree = !order + const activeItems = order?.items?.filter(i => i.status === 'active') ?? [] + const total = activeItems.reduce((s, i) => s + i.unit_price * i.quantity, 0) + const showWaiters = !isFree && waiterObjects.length > 0 + + return ( +
+
+ {/* left column: name, zone, amount, status, flags */} +
+
+
+ {table.label || `T${table.number}`} +
+ {groupName && ( +
+ {groupName} +
+ )} +
+ +
+ {!isFree && } +
+ +
+ +
+ + {flags.length > 0 && ( +
+ +
+ )} +
+ + {/* divider */} +
+ + {/* right column: order items */} +
+ {isFree ? ( +
+ Ελεύθερο +
+ ) : activeItems.length === 0 ? ( +
+ Κανένα είδος +
+ ) : ( +
+ {activeItems.slice(0, 7).map(item => ( +
+ {item.quantity}× + {item.product?.name || `#${item.product_id}`} + + {(item.unit_price * item.quantity).toFixed(2)}€ + +
+ ))} + {activeItems.length > 7 && ( +
+ +{activeItems.length - 7} ακόμα… +
+ )} +
+ )} +
+
+ + {/* footer: waiters */} +
+ {showWaiters + ? + : + } +
+
+ ) +} + +// ─── Main export ────────────────────────────────────────────────────────────── + +export default function TableCard({ + table, + order, + isMine, + flags = [], + groupName = '', + waiterObjects = [], + density = '2x2', + onClick, + onLongPress, +}) { const holdTimer = useRef(null) const startPos = useRef({ x: 0, y: 0 }) const didFire = useRef(false) @@ -31,8 +581,6 @@ export default function TableCard({ table, order, isMine, flags = [], groupName const mode = dark ? 'dark' : 'light' const cfg = colours[mode][statusKey] - const displayName = table.label || `T${table.number}` - function cancel() { clearTimeout(holdTimer.current) holdTimer.current = null @@ -57,10 +605,7 @@ export default function TableCard({ table, order, isMine, flags = [], groupName if (dx > DRAG_THRESHOLD || dy > DRAG_THRESHOLD) cancel() } - function onTouchEnd() { - cancel() - setShowTip(false) - } + function onTouchEnd() { cancel(); setShowTip(false) } function onMouseDown(e) { startPos.current = { x: e.clientX, y: e.clientY } @@ -85,11 +630,21 @@ export default function TableCard({ table, order, isMine, flags = [], groupName onClick?.() } + const cardProps = { table, order, flags, waiterObjects, groupName, cfg, statusKey } + + const CardComponent = { + '1x1': Card1x1, + '2x1': Card2x1, + '2x2': Card2x2, + '4x1': Card4x1, + '4x2': Card4x2, + '4x3': Card4x3, + }[density] || Card2x2 + return ( -
+
- {/* Flag name tooltip on long-press (only when no onLongPress handler) */} {showTip && flags.length > 0 && (
{flags.map(f => (
diff --git a/waiter_pwa/src/components/UserMenu.jsx b/waiter_pwa/src/components/UserMenu.jsx index cc1d8c3..32c79ed 100644 --- a/waiter_pwa/src/components/UserMenu.jsx +++ b/waiter_pwa/src/components/UserMenu.jsx @@ -168,6 +168,12 @@ export default function UserMenu() { {dark ? 'Φωτεινό θέμα' : 'Σκοτεινό θέμα'} + {/* ── Settings ──────────────────────────────────────── */} + +
{isNewTable ? 'Νέα Παραγγελία' : 'Προσθήκη'} - {/* Cart icon with badge — opens side drawer */} - +
+ {/* Search button */} + + {/* Categories button */} + + {/* Cart button with badge */} + +
{/* Product picker takes all remaining space */} {categories.length > 0 && ( - + )} {/* ── Bottom bar: floating mini-cart + full-width ΑΠΟΣΤΟΛΗ ─────────────── */} @@ -382,17 +410,12 @@ export default function AddItemsPage() { className="btn btn--primary btn--lg" style={{ width: '100%', opacity: cart.length === 0 ? 0.4 : 1 }} onClick={sendOrder} - disabled={cart.length === 0 || sending} + disabled={cart.length === 0 || sending || !!printAck?.allOk} > {sending ? 'Αποστολή…' : `ΑΠΟΣΤΟΛΗ${cart.length > 0 ? ` (${cart.length})` : ''}`} {error &&

{error}

} - {printAck?.allOk && ( -
- ✓ Εκτυπώθηκε επιτυχώς — μεταφορά… -
- )}
{/* ── Cart side drawer ────────────────────────────────────────────────── */} @@ -465,7 +488,7 @@ export default function AddItemsPage() { className="btn btn--primary btn--lg" style={{ width: '100%' }} onClick={sendOrder} - disabled={cart.length === 0 || sending} + disabled={cart.length === 0 || sending || !!printAck?.allOk} > {sending ? 'Αποστολή…' : `Αποστολή Παραγγελίας (${cart.length})`} @@ -483,6 +506,46 @@ export default function AddItemsPage() { initialState={editItem.drawerState} /> )} + + {/* ── Search modal ─────────────────────────────────────────────────────── */} + {searchOpen && ( + setSearchOpen(false)} + onAdd={item => { addToCart(item); setSearchOpen(false) }} + /> + )} + + {/* Full-screen success overlay — blocks all interaction while navigating */} + {printAck?.allOk && ( +
+
+ + + + + + Εκτυπώθηκε Επιτυχώς + +
+ +
+ )}
) } @@ -638,3 +701,144 @@ function CartItem({ item, product, summaryLines, sections, onEdit, onRemove, onC
) } + +// ── Search Modal ────────────────────────────────────────────────────────────── + +const API_URL = import.meta.env.VITE_API_URL || '' + +function SearchModal({ products, query, setQuery, onClose, onAdd }) { + const [drawerProduct, setDrawerProduct] = useState(null) + const activeProducts = products.filter(p => p.lifecycle_status !== 'archived') + + const results = query.trim().length === 0 + ? [] + : activeProducts.filter(p => + p.name.toLowerCase().includes(query.trim().toLowerCase()) + ) + + function openProduct(p) { + // Blur the input first so the keyboard dismisses, then open the drawer + document.activeElement?.blur() + setDrawerProduct(p) + } + + // The modal is position:fixed anchored to bottom:0. + // When the soft keyboard opens on mobile the browser shrinks the visual + // viewport and fixed elements reposition automatically — the panel sits + // right on top of the keyboard without any JS measurement needed. + return ( + <> + {/* Dim backdrop — tap to close */} +
+ + {/* Panel: fixed to bottom, grows upward, capped at 60vh so results don't + push the input off screen on short viewports */} +
+ {/* Results scroll area — flex:1 so it takes space above the input */} +
+ {query.trim().length === 0 ? ( +

+ Πληκτρολογήστε για αναζήτηση… +

+ ) : results.length === 0 ? ( +

+ Δεν βρέθηκαν προϊόντα για «{query}» +

+ ) : results.map(p => { + const initials = p.name.trim().split(/\s+/).slice(0, 2).map(w => w[0]).join('').toUpperCase() + return ( + + ) + })} +
+ + {/* Search input — pinned at the bottom of the panel, above the keyboard */} +
+ + + + + setQuery(e.target.value)} + placeholder="Αναζήτηση προϊόντος…" + style={{ + flex: 1, height: 44, background: 'var(--bg2)', + border: '1px solid var(--border)', borderRadius: 12, + padding: '0 12px', fontSize: 16, color: 'var(--text)', + fontFamily: 'inherit', outline: 'none', + }} + /> + +
+
+ + {/* Product drawer — closes search modal when item is added */} + {drawerProduct && ( + setDrawerProduct(null)} + onAdd={item => { onAdd(item); setDrawerProduct(null); onClose() }} + /> + )} + + ) +} diff --git a/waiter_pwa/src/pages/LoginPage.jsx b/waiter_pwa/src/pages/LoginPage.jsx index 92024cd..64f01cf 100644 --- a/waiter_pwa/src/pages/LoginPage.jsx +++ b/waiter_pwa/src/pages/LoginPage.jsx @@ -81,14 +81,19 @@ export default function LoginPage() { const [waiters, setWaiters] = useState([]) const [loadingWaiters, setLoadingWaiters] = useState(true) + const [serverUnreachable, setServerUnreachable] = useState(false) const [selectedWaiter, setSelectedWaiter] = useState(null) const [error, setError] = useState('') const [loading, setLoading] = useState(false) useEffect(() => { client.get('/api/auth/waiters') - .then(r => setWaiters(r.data)) - .catch(() => setWaiters([])) + .then(r => { setWaiters(r.data); setServerUnreachable(false) }) + .catch(err => { + // No response = network error = server unreachable + if (!err.response) setServerUnreachable(true) + setWaiters([]) + }) .finally(() => setLoadingWaiters(false)) }, []) @@ -130,6 +135,30 @@ export default function LoginPage() {
{loadingWaiters ? (

Φόρτωση…

+ ) : serverUnreachable ? ( +
+
🔌
+

+ Δεν βρέθηκε ο Server +

+

+ Δεν είναι δυνατή η σύνδεση με τον Manager.
+ Δεν μπορεί να ξεκινήσει βάρδια χωρίς σύνδεση. +

+ +
) : waiters.length === 0 ? (

Δεν βρέθηκαν σερβιτόροι

) : ( diff --git a/waiter_pwa/src/pages/SettingsPage.jsx b/waiter_pwa/src/pages/SettingsPage.jsx new file mode 100644 index 0000000..6dfd2c0 --- /dev/null +++ b/waiter_pwa/src/pages/SettingsPage.jsx @@ -0,0 +1,345 @@ +import { useState } from 'react' +import { useNavigate } from 'react-router-dom' +import useTableViewStore from '../store/tableViewStore' +import useThemeStore from '../store/themeStore' + +// ─── Tab definitions (stub future tabs here) ────────────────────────────────── + +const TABS = [ + { key: 'layout', label: 'Εμφάνιση' }, + { key: 'favorites', label: 'Αγαπημένα', disabled: true }, +] + +// ─── Density option data ────────────────────────────────────────────────────── + +const DENSITY_OPTIONS = [ + { + key: '1x1', + label: '1×1', + desc: '4 ανά σειρά — μόνο όνομα', + preview: , + }, + { + key: '2x1', + label: '2×1', + desc: '2 ανά σειρά — όνομα + κατάσταση', + preview: , + }, + { + key: '2x2', + label: '2×2', + desc: '2 ανά σειρά — συμπαγής κάρτα', + preview: , + }, + { + key: '4x1', + label: '4×1', + desc: '1 ανά σειρά — οριζόντια λίστα', + preview: , + }, + { + key: '4x2', + label: '4×2', + desc: '1 ανά σειρά — πλήρης κάρτα', + preview: , + }, + { + key: '4x3', + label: '4×3', + desc: '1 ανά σειρά — κάρτα με λίστα παραγγελίας', + preview: , + }, +] + +// ─── Mini grid preview SVGs ─────────────────────────────────────────────────── + +function Grid4() { + return ( + + {[0,1,2,3].map(i => ( + + ))} + {[0,1,2,3].map(i => ( + + ))} + {[0,1,2,3].map(i => ( + + ))} + + ) +} + +function Grid2H() { + return ( + + {[0,1].map(i => ( + + ))} + {[0,1].map(i => ( + + ))} + {[0,1].map(i => ( + + ))} + + ) +} + +function Grid2() { + return ( + + + + + + + ) +} + +function Grid1H() { + return ( + + + + + + ) +} + +function Grid1() { + return ( + + + + + ) +} + +function Grid1Detail() { + return ( + + + {/* left section lines */} + + + + {/* vertical divider */} + + {/* right section lines */} + + + + + + ) +} + +// ─── Layout tab ─────────────────────────────────────────────────────────────── + +function LayoutTab() { + const { density, setDensity } = useTableViewStore() + const { dark, toggle } = useThemeStore() + + return ( +
+ + {/* Card density */} +
+

Κάρτες τραπεζιών

+

Επίλεξε πόσα στοιχεία εμφανίζονται σε κάθε κάρτα.

+ +
+ {DENSITY_OPTIONS.map(opt => { + const active = density === opt.key + return ( + + ) + })} +
+
+ + {/* Theme */} +
+

Θέμα

+ +
+ {[ + { key: false, icon: '☀️', label: 'Φωτεινό' }, + { key: true, icon: '🌙', label: 'Σκοτεινό' }, + ].map(opt => { + const active = dark === opt.key + return ( + + ) + })} +
+
+
+ ) +} + +const sectionTitle = { + fontSize: 13, fontWeight: 700, color: 'var(--muted)', + letterSpacing: 0.8, textTransform: 'uppercase', marginBottom: 4, +} +const sectionSub = { + fontSize: 14, color: 'var(--muted)', lineHeight: 1.5, +} + +// ─── Favorites stub tab ─────────────────────────────────────────────────────── + +function FavoritesTab() { + return ( +
+ +

Σύντομα διαθέσιμο

+

+ Τα αγαπημένα προϊόντα θα εμφανίζονται εδώ για γρήγορη παραγγελία. +

+
+ ) +} + +// ─── Main page ──────────────────────────────────────────────────────────────── + +export default function SettingsPage() { + const navigate = useNavigate() + const [activeTab, setActiveTab] = useState('layout') + + return ( +
+ {/* Top bar */} +
+ + Ρυθμίσεις + {/* spacer to balance the back button */} +
+
+ + {/* Tab strip */} +
+ {TABS.map(tab => ( + + ))} +
+ + {/* Tab body */} +
+ {activeTab === 'layout' && } + {activeTab === 'favorites' && } +
+
+ ) +} + diff --git a/waiter_pwa/src/pages/TableListPage.jsx b/waiter_pwa/src/pages/TableListPage.jsx index 257366d..f6ca1e6 100644 --- a/waiter_pwa/src/pages/TableListPage.jsx +++ b/waiter_pwa/src/pages/TableListPage.jsx @@ -1,22 +1,34 @@ -import { useEffect, useRef, useState } from 'react' +import { useEffect, useRef, useState, useCallback } from 'react' import { useNavigate } from 'react-router-dom' import TableCard from '../components/TableCard' import ConnectionBanner from '../components/ConnectionBanner' +import EmergencyBar from '../components/EmergencyBar' import UserMenu from '../components/UserMenu' import useAuthStore from '../store/authStore' import useTableColourStore from '../store/tableColourStore' +import useConnectionStore from '../store/connectionStore' +import useTableViewStore from '../store/tableViewStore' import client from '../api/client' +import db from '../db/posdb' +import { queueOfflinePayment } from '../services/offlinePayments' import { useNotifications } from '../context/NotificationContext' import { FlagsIcon, TransferIcon, MergeIcon, PrintIcon, WaiterIcon } from '../components/Icons' -const FILTERS = ['all', 'mine', 'free'] -const FILTER_LABELS = { all: 'Όλα', mine: 'Δικά μου', free: 'Ελεύθερα' } - function fmtPrice(v) { return Number(v || 0).toFixed(2) + ' €' } -// ─── Notification history drawer ───────────────────────────────────────────── +// ─── Icons ──────────────────────────────────────────────────────────────────── -function NotificationDrawer({ messages, onClose, onAck }) { +function FilterIcon({ size = 20 }) { + return ( + + + + ) +} + +// ─── Notification drawer ────────────────────────────────────────────────────── + +function NotificationDrawer({ messages, onClose }) { return (
e.stopPropagation()} style={{ maxHeight: '80svh' }}> @@ -37,9 +49,7 @@ function NotificationDrawer({ messages, onClose, onAck }) { 📢
{msg.sender_name && ( -
- {msg.sender_name} -
+
{msg.sender_name}
)}
{msg.body}
{tableIds.length > 0 && ( @@ -59,7 +69,7 @@ function NotificationDrawer({ messages, onClose, onAck }) { ) } -// ─── Table quick-view + actions popup (long-press) ──────────────────────────── +// ─── Table quick-view modal (long press) ────────────────────────────────────── const QUICK_ACTIONS = [ { Icon: FlagsIcon, label: 'Ενδείξεις Τραπεζιού', key: 'flags', color: '#fac823', iconBg: 'rgba(251,191,36,0.15)' }, @@ -77,25 +87,18 @@ function TableQuickModal({ table, order, flags, onClose, onNavigate, onAction }) const due = Math.max(0, total - paid) const statusLabel = { - open: 'Ανοιχτό', - partially_paid: 'Μερικώς πληρωμένο', - paid: 'Πληρωμένο', + open: 'Ανοιχτό', partially_paid: 'Μερικώς πληρωμένο', paid: 'Πληρωμένο', }[order?.status] || 'Ελεύθερο' return (
- {/* Status overview card */}
e.stopPropagation()}> -
+
{tableName} {statusLabel}
- {order ? (
@@ -116,7 +119,6 @@ function TableQuickModal({ table, order, flags, onClose, onNavigate, onAction }) ) : (

Δεν υπάρχει ενεργή παραγγελία

)} - {flags.length > 0 && (
{flags.map(f => ( @@ -132,47 +134,24 @@ function TableQuickModal({ table, order, flags, onClose, onNavigate, onAction }) ))}
)} - -
- - {/* Quick actions card */} -
-

- ACTIONS -

+
+

ACTIONS

{QUICK_ACTIONS.map((a, i) => { const disabled = !order && a.key !== 'flags' return ( - + +
+
+
+ ) +} + +// ─── Filters modal ──────────────────────────────────────────────────────────── + +function FiltersModal({ groups, onClose }) { + const { + ownerFilter, statusFilter, zoneFilter, + setOwnerFilter, setStatusFilter, setZoneFilter, + clearFilters, setActiveZoneTab, + } = useTableViewStore() + + function toggleZone(id) { + const next = zoneFilter.includes(id) + ? zoneFilter.filter(z => z !== id) + : [...zoneFilter, id] + setZoneFilter(next) + // if we remove a zone that is the active tab, reset to 'all' + if (!next.length) setActiveZoneTab('all') + } + + const hasActiveFilters = ownerFilter !== 'all' || statusFilter !== 'all' || zoneFilter.length > 0 + + return ( +
+
e.stopPropagation()} + style={{ borderRadius: '20px 20px 0 0', paddingBottom: 40, gap: 20 }} + > +
+ +
+ Φίλτρα + {hasActiveFilters && ( + + )} +
+ + {/* Owner: ALL | MINE */} +
+

Ανάθεση

+
+ {[['all', 'Όλα'], ['mine', 'Δικά μου']].map(([key, lbl]) => ( + + ))} +
+
+ + {/* Status: ALL | FREE | OPEN | PAID */} +
+

Κατάσταση

+
+ {[['all', 'Όλα'], ['free', 'Ελεύθερα'], ['open', 'Ανοιχτά'], ['paid', 'Πληρωμένα']].map(([key, lbl]) => ( + + ))} +
+
+ + {/* Zones: multi-select, one segmented container per zone */} + {groups.length > 0 && ( +
+

Ζώνες {zoneFilter.length > 0 ? `(${zoneFilter.length} επιλεγμένες)` : ''}

+
+ {groups.map(g => { + const active = zoneFilter.includes(g.id) + return ( +
+ +
+ ) + })} +
+
+ )} + + +
+
+ ) +} + +const sectionLabel = { fontSize: 11, fontWeight: 700, color: 'var(--muted)', letterSpacing: 0.8, textTransform: 'uppercase', marginBottom: 8 } +const segmentedWrap = { display: 'flex', gap: 6, background: 'var(--bg3)', borderRadius: 12, padding: 4 } +function segBtn(active) { + return { + flex: 1, padding: '9px 8px', borderRadius: 9, border: 'none', + cursor: 'pointer', fontWeight: 600, fontSize: 14, + background: active ? 'var(--accent)' : 'transparent', + color: active ? 'var(--accent-fg)' : 'var(--muted)', + transition: 'background 0.12s', + } +} + // ─── Main page ──────────────────────────────────────────────────────────────── export default function TableListPage() { const { user } = useAuthStore() + const { status: connStatus } = useConnectionStore() + const isEmergency = connStatus === 'emergency' + const [tables, setTables] = useState([]) const [groups, setGroups] = useState([]) const [orders, setOrders] = useState([]) const [flagDefs, setFlagDefs] = useState([]) const [flagAssignments, setFlagAssignments] = useState([]) - const [filter, setFilter] = useState('all') + const [waiters, setWaiters] = useState([]) // waiter objects for avatar lookup const [offline, setOffline] = useState(false) - const [zoneOpen, setZoneOpen] = useState(false) - const [selectedZones, setSelectedZones] = useState(new Set()) const [showNotifs, setShowNotifs] = useState(false) - const [quickModal, setQuickModal] = useState(null) // { table, order, flags } - const zoneRef = useRef(null) - const navigate = useNavigate() + const [showFilters, setShowFilters] = useState(false) + const [quickModal, setQuickModal] = useState(null) + const [emergencyPayModal, setEmergencyPayModal] = useState(null) + const [localPaidOrderIds, setLocalPaidOrderIds] = useState(new Set()) - const { unreadCount, recentMessages, ackMessage, fetchRecent } = useNotifications() || {} + // pull-to-refresh state + const [pulling, setPulling] = useState(false) + const [pullY, setPullY] = useState(0) + const [refreshing, setRefreshing] = useState(false) + const pullStart = useRef(null) + const scrollRef = useRef(null) + const PULL_THRESHOLD = 72 + + const navigate = useNavigate() + const filterBtnRef = useRef(null) + + const { unreadCount, recentMessages, fetchRecent } = useNotifications() || {} const loadFromBackend = useTableColourStore(s => s.loadFromBackend) + const { + density, ownerFilter, statusFilter, zoneFilter, activeZoneTab, setActiveZoneTab, + } = useTableViewStore() + + // ── Load from IndexedDB when offline ────────────────────────────────────── + const loadFromDB = useCallback(async () => { + const [dbTables, dbOrders] = await Promise.all([db.tables.toArray(), db.orders.toArray()]) + setTables(dbTables.filter(t => t.is_active !== false)) + setOrders(dbOrders) + setOffline(true) + }, []) + + useEffect(() => { if (isEmergency) loadFromDB() }, [isEmergency]) + useEffect(() => { const handler = () => setOffline(true) window.addEventListener('backend-offline', handler) @@ -215,28 +392,37 @@ export default function TableListPage() { }, []) useEffect(() => { - function onClick(e) { - if (zoneRef.current && !zoneRef.current.contains(e.target)) setZoneOpen(false) - } - document.addEventListener('mousedown', onClick) - return () => document.removeEventListener('mousedown', onClick) + const handler = () => load() + window.addEventListener('sse-reconnected', handler) + return () => window.removeEventListener('sse-reconnected', handler) }, []) + useEffect(() => { if (connStatus === 'online') setOffline(false) }, [connStatus]) + async function load() { try { - const [tablesRes, ordersRes, groupsRes, flagDefsRes, flagAssignRes, settingsRes] = await Promise.all([ + const [tablesRes, ordersRes, groupsRes, flagDefsRes, flagAssignRes, settingsRes, waitersRes] = await Promise.all([ client.get('/api/tables/'), client.get('/api/orders/active'), client.get('/api/tables/groups'), client.get('/api/flags/defs'), client.get('/api/flags/assignments'), client.get('/api/settings/'), + client.get('/api/waiters/on-shift'), ]) setTables(tablesRes.data) - setOrders(ordersRes.data) + const fullOrders = await Promise.all( + ordersRes.data.map(o => + client.get(`/api/orders/${o.id}`) + .then(r => ({ ...r.data, waiter_ids: r.data.waiters?.map(w => w.waiter_id) ?? o.waiter_ids ?? [] })) + .catch(() => o) + ) + ) + setOrders(fullOrders) setGroups(groupsRes.data) setFlagDefs(flagDefsRes.data) setFlagAssignments(flagAssignRes.data) + setWaiters(waitersRes.data) const raw = settingsRes.data?.['ui.table_colours']?.value if (raw) loadFromBackend(raw) setOffline(false) @@ -245,6 +431,48 @@ export default function TableListPage() { useEffect(() => { load() }, []) + // ── SSE live updates ─────────────────────────────────────────────────────── + useEffect(() => { + if (isEmergency) return + function onSSE(e) { + const { type, data } = e.detail + if (type === 'order_updated' || type === 'order_paid') { + client.get(`/api/orders/${data.order_id}`) + .then(r => { + const full = { ...r.data, waiter_ids: r.data.waiters?.map(w => w.waiter_id) ?? [] } + setOrders(prev => { + const exists = prev.find(o => o.id === data.order_id) + return exists ? prev.map(o => o.id === data.order_id ? full : o) : [...prev, full] + }) + }) + .catch(() => { + setOrders(prev => { + const existing = prev.find(o => o.id === data.order_id) + if (existing) return prev.map(o => o.id === data.order_id ? { ...o, status: data.status, table_id: data.table_id } : o) + return [...prev, { id: data.order_id, table_id: data.table_id, status: data.status, waiter_ids: [] }] + }) + }) + } else if (type === 'order_closed') { + setOrders(prev => prev.filter(o => o.id !== data.order_id)) + } else if (type === 'table_flags_changed') { + client.get('/api/flags/assignments').then(r => setFlagAssignments(r.data)).catch(() => {}) + } else if (type === 'table_list_changed') { + client.get('/api/tables/').then(r => setTables(r.data)).catch(() => {}) + } + } + window.addEventListener('sse-event', onSSE) + return () => window.removeEventListener('sse-event', onSSE) + }, [isEmergency]) + + // ── Emergency payment ────────────────────────────────────────────────────── + async function handleEmergencyPay(orderId, itemIds, paymentMethod) { + await queueOfflinePayment({ orderId, itemIds, paymentMethod }) + setLocalPaidOrderIds(prev => new Set([...prev, orderId])) + setOrders(prev => prev.map(o => o.id === orderId ? { ...o, status: 'paid' } : o)) + await db.orders.where('id').equals(orderId).modify({ status: 'paid' }) + } + + // ── Derived maps ─────────────────────────────────────────────────────────── const flagDefMap = Object.fromEntries(flagDefs.map(f => [f.id, f])) const tableFlagsMap = {} flagAssignments.forEach(a => { @@ -252,36 +480,88 @@ export default function TableListPage() { const def = flagDefMap[a.flag_id] if (def) tableFlagsMap[a.table_id].push(def) }) + const waiterMap = Object.fromEntries(waiters.map(w => [w.id, w])) - function getOrder(tableId) { - return orders.find(o => o.table_id === tableId) + function getOrder(tableId) { return orders.find(o => o.table_id === tableId) } + function isMyOrder(order) { return !!(order && user && order.waiter_ids?.includes(user.id)) } + function getOrderWaiters(order) { + if (!order) return [] + return (order.waiter_ids || []).map(id => waiterMap[id]).filter(Boolean) } - function isMyOrder(order) { - if (!order || !user) return false - return order.waiter_ids?.includes(user.id) - } + // ── Filtering logic ──────────────────────────────────────────────────────── + // Zones visible in top bar = those allowed by zoneFilter (or all if empty) + const allowedZoneIds = zoneFilter.length > 0 ? new Set(zoneFilter) : null - function toggleZone(id) { - setSelectedZones(prev => { - const next = new Set(prev) - if (next.has(id)) next.delete(id); else next.add(id) - return next - }) - } + // visibleGroups = groups shown in the top bar + const visibleGroups = groups.filter(g => !allowedZoneIds || allowedZoneIds.has(g.id)) + + // Validate activeZoneTab against current allowedZoneIds + // If the active tab is no longer visible, reset to 'all' + const effectiveZoneTab = ( + activeZoneTab === 'all' || + visibleGroups.some(g => g.id === activeZoneTab) + ) ? activeZoneTab : 'all' const filtered = tables.filter(t => { const order = getOrder(t.id) - if (filter === 'free' && order) return false - if (filter === 'mine' && !isMyOrder(order)) return false - if (selectedZones.size > 0 && !selectedZones.has(t.group_id ?? 'none')) return false + + // Status filter + if (statusFilter === 'free' && order) return false + if (statusFilter === 'open' && (!order || order.status === 'paid' || order.status === 'partially_paid')) return false + if (statusFilter === 'paid' && order?.status !== 'paid' && order?.status !== 'partially_paid') return false + + // Owner filter + if (ownerFilter === 'mine' && !isMyOrder(order)) return false + + // Zone filter from modal (multi-select restricts which zones are allowed) + if (allowedZoneIds && !allowedZoneIds.has(t.group_id ?? 'none')) return false + + // Active zone tab (secondary, single-select within allowed) + if (effectiveZoneTab !== 'all' && t.group_id !== effectiveZoneTab) return false + return true }) - const zoneActive = selectedZones.size > 0 + // ── Pull-to-refresh handlers ─────────────────────────────────────────────── + function onPullTouchStart(e) { + if (scrollRef.current?.scrollTop > 0) return + pullStart.current = e.touches[0].clientY + } + function onPullTouchMove(e) { + if (pullStart.current === null) return + const dy = e.touches[0].clientY - pullStart.current + if (dy > 0 && scrollRef.current?.scrollTop <= 0) { + e.preventDefault() + setPulling(true) + setPullY(Math.min(dy, PULL_THRESHOLD * 1.5)) + } + } + async function onPullTouchEnd() { + if (!pulling) return + if (pullY >= PULL_THRESHOLD) { + setRefreshing(true) + await load() + setRefreshing(false) + } + setPulling(false) + setPullY(0) + pullStart.current = null + } + + // ── Grid columns per density ─────────────────────────────────────────────── + const gridCols = { + '1x1': 'repeat(4, 1fr)', + '2x1': 'repeat(2, 1fr)', + '2x2': 'repeat(2, 1fr)', + '4x1': '1fr', + '4x2': '1fr', + '4x3': '1fr', + }[density] || 'repeat(2, 1fr)' + + const hasActiveFilters = ownerFilter !== 'all' || statusFilter !== 'all' || zoneFilter.length > 0 function handleQuickAction(tableId, actionKey) { - // Navigate to table then trigger action via URL param so TableDetailPage can handle it navigate(`/tables/${tableId}?action=${actionKey}`) } @@ -299,15 +579,14 @@ export default function TableListPage() { display: 'inline-flex', alignItems: 'center', justifyContent: 'center', }} > - - - - + + + + {(unreadCount || 0) > 0 && ( @@ -319,109 +598,135 @@ export default function TableListPage() { - {offline && } + {isEmergency ? : (offline && )} -
- {FILTERS.map(f => ( - + {/* ── Zone tab bar ─────────────────────────────────────────────────────── */} +
+ {/* ALL tab */} + setActiveZoneTab('all')} + /> + + {/* Per-zone tabs */} + {visibleGroups.map(g => ( + setActiveZoneTab(effectiveZoneTab === g.id ? 'all' : g.id)} + /> ))} - -
- - {zoneOpen && ( -
- - {groups.map(g => ( - - ))} - {tables.some(t => !t.group_id) && ( - - )} -
- )} -
-
-
+ {/* ── Table grid ───────────────────────────────────────────────────────── */} +
+ {/* Pull-to-refresh indicator */} + {(pulling || refreshing) && ( +
+ {refreshing ? '⟳ Ανανέωση…' : pullY >= PULL_THRESHOLD ? '↑ Αφήστε για ανανέωση' : '↓ Τραβήξτε για ανανέωση'} +
+ )} + +
{filtered.map(t => { const order = getOrder(t.id) const tableFlags = tableFlagsMap[t.id] || [] const grp = groups.find(g => g.id === t.group_id) - // Free tables go straight to the item picker; occupied tables go to detail - const destination = order - ? `/tables/${t.id}` - : `/tables/${t.id}/add?new=1` + const alreadyPaidLocally = order && localPaidOrderIds.has(order.id) + const orderWaiters = getOrderWaiters(order) + + function handleClick() { + if (isEmergency) { + if (order && !alreadyPaidLocally && order.status !== 'paid' && order.status !== 'closed') { + setEmergencyPayModal({ table: t, order }) + } + return + } + const destination = order ? `/tables/${t.id}` : `/tables/${t.id}/add?new=1` + navigate(destination) + } + return ( navigate(destination)} - onLongPress={() => setQuickModal({ table: t, order, flags: tableFlags })} + waiterObjects={orderWaiters} + density={density} + onClick={handleClick} + onLongPress={isEmergency ? undefined : () => setQuickModal({ table: t, order, flags: tableFlags })} /> ) })}
- -
+ {/* ── Filter FAB ───────────────────────────────────────────────────────── */} + + + {/* ── Modals ────────────────────────────────────────────────────────────── */} {showNotifs && ( - setShowNotifs(false)} - onAck={ackMessage} - /> + setShowNotifs(false)} /> + )} + + {showFilters && ( + setShowFilters(false)} anchorRef={filterBtnRef} /> )} {quickModal && ( @@ -434,6 +739,43 @@ export default function TableListPage() { onAction={(key) => handleQuickAction(quickModal.table.id, key)} /> )} + + {emergencyPayModal && ( + setEmergencyPayModal(null)} + onPay={handleEmergencyPay} + /> + )}
) } + +// ─── Zone tab pill ──────────────────────────────────────────────────────────── + +function ZoneTab({ label, color, active, onClick }) { + return ( + + ) +} diff --git a/waiter_pwa/src/services/offlinePayments.js b/waiter_pwa/src/services/offlinePayments.js new file mode 100644 index 0000000..f959c47 --- /dev/null +++ b/waiter_pwa/src/services/offlinePayments.js @@ -0,0 +1,61 @@ +import db from '../db/posdb' +import client from '../api/client' + +/** + * Queue an emergency payment locally. + * Called in Emergency Mode when the server is unreachable. + */ +export async function queueOfflinePayment({ orderId, itemIds, paymentMethod }) { + const uuid = crypto.randomUUID() + await db.offline_payments.add({ + uuid, + orderId, + itemIds, + paymentMethod, + offlineAt: new Date().toISOString(), + synced: 0, + isDuplicate: 0, + }) + return uuid +} + +/** + * Flush all unsynced offline payments to the server. + * Called when the server comes back online. + * Returns a summary of { synced, duplicates, failed }. + */ +export async function flushOfflinePayments() { + // Boolean is not a valid IndexedDB key — load all and filter in JS + const all = await db.offline_payments.toArray() + const pending = all.filter(p => !p.synced) + const results = { synced: 0, duplicates: 0, failed: 0 } + + for (const payment of pending) { + try { + const res = await client.post(`/api/orders/${payment.orderId}/pay-offline`, { + uuid: payment.uuid, + item_ids: payment.itemIds, + payment_method: payment.paymentMethod, + offline_at: payment.offlineAt, + }) + const isDuplicate = res.data.is_duplicate + await db.offline_payments.update(payment.localId, { + synced: 1, + isDuplicate: isDuplicate ? 1 : 0, + }) + isDuplicate ? results.duplicates++ : results.synced++ + } catch { + results.failed++ + } + } + + return results +} + +/** + * Count unsynced pending payments (to show badge / warning). + */ +export async function pendingPaymentCount() { + const all = await db.offline_payments.toArray() + return all.filter(p => !p.synced).length +} diff --git a/waiter_pwa/src/store/connectionStore.js b/waiter_pwa/src/store/connectionStore.js new file mode 100644 index 0000000..e9262ac --- /dev/null +++ b/waiter_pwa/src/store/connectionStore.js @@ -0,0 +1,33 @@ +import { create } from 'zustand' + +/** + * Tracks the live connection state and emergency mode flag. + * + * States: + * 'online' — server reachable, SSE connected, normal operation + * 'lost' — server unreachable, modal shown (Wait / Emergency) + * 'emergency' — user chose emergency mode, working from IndexedDB snapshot + */ +const useConnectionStore = create((set, get) => ({ + status: 'online', // 'online' | 'lost' | 'emergency' + lostAt: null, // Date when connection was lost + + setLost: () => { + if (get().status === 'online') { + set({ status: 'lost', lostAt: new Date() }) + } + }, + + setOnline: () => set({ status: 'online', lostAt: null }), + + enterEmergency: () => set({ status: 'emergency' }), + + // Called when server comes back while in emergency mode — triggers sync then go online + exitEmergency: () => set({ status: 'online', lostAt: null }), + + isOnline: () => get().status === 'online', + isLost: () => get().status === 'lost', + isEmergency: () => get().status === 'emergency', +})) + +export default useConnectionStore diff --git a/waiter_pwa/src/store/tableViewStore.js b/waiter_pwa/src/store/tableViewStore.js new file mode 100644 index 0000000..3e2c76c --- /dev/null +++ b/waiter_pwa/src/store/tableViewStore.js @@ -0,0 +1,39 @@ +import { create } from 'zustand' +import { persist } from 'zustand/middleware' + +// density: '1x1' | '2x1' | '2x2' | '4x1' | '4x2' | '4x3' +// ownerFilter: 'all' | 'mine' +// statusFilter: 'all' | 'free' | 'open' | 'paid' +// zoneFilter: Set of zone IDs (serialized as array in localStorage) +// activeZoneTab: zone id string or 'all' + +const useTableViewStore = create( + persist( + (set, get) => ({ + density: '2x2', + ownerFilter: 'all', + statusFilter: 'all', + zoneFilter: [], // array of zone ids (serialized fine in JSON) + activeZoneTab: 'all', + + setDensity: (density) => set({ density }), + setOwnerFilter: (ownerFilter) => set({ ownerFilter }), + setStatusFilter: (statusFilter) => set({ statusFilter }), + setZoneFilter: (zoneFilter) => set({ zoneFilter }), + setActiveZoneTab: (activeZoneTab) => set({ activeZoneTab }), + + clearFilters: () => set({ + ownerFilter: 'all', + statusFilter: 'all', + zoneFilter: [], + activeZoneTab: 'all', + }), + }), + { + name: 'table-view-prefs', + // future: could sync to backend here + } + ) +) + +export default useTableViewStore diff --git a/waiter_pwa/vite.config.js b/waiter_pwa/vite.config.js index 6be36ea..105d5e6 100644 --- a/waiter_pwa/vite.config.js +++ b/waiter_pwa/vite.config.js @@ -4,7 +4,7 @@ import { VitePWA } from 'vite-plugin-pwa' export default defineConfig({ server: { - allowedHosts: 'all', + allowedHosts: ['all','pos-waiter.bonamin.gr'], }, plugins: [ react(),