You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
sims-hq/docs/03-FRONTEND.md

5.5 KiB

03 — Frontend Plan

Four surfaces, one design system, one TypeScript codebase philosophy.

Surfaces

Surface Tech Mode Users
POS Counter (desktop) Electron + React Local-first, offline always Cashiers, supervisors
Back Office (web) React SPA Online (tolerates it) Owner, manager, purchaser, accountant
Owner App (mobile) React Native, Android-first Online + cached Owner on the move
Customer Display Second window/screen from POS Local The person in the queue

The counter creed (UX principles for POS)

  1. Keyboard is king. Every billing action reachable without a mouse. Classic users' muscle memory is the migration moat — publish the keymap, keep it configurable, offer a "Classic keys" preset that mirrors the old Oracle Forms bindings.
  2. The scan line is sacred. Focus always returns to the scan/search box. No dialog, toast, or sync event may steal focus mid-bill. Ever.
  3. One screen, no navigation. Billing is a single screen: item entry, bill lines, totals, payment. Payment is an overlay, not a page. Target: close a cash bill with one keystroke from the last scanned item.
  4. Errors never trap. Unknown barcode → inline quick-add or skip, keep billing. Printer jam → bill saves, reprint later. Sync down → icon changes color, nothing else.
  5. Speed is visible. Show per-bill timing internally (telemetry); we optimize what we measure. The queue is the enemy.
  6. Touch is secondary but real — large hit targets on the right rail for touch-counter deployments; never at the cost of keyboard flow.
  7. Language switch per user — cashier sees Hindi/regional, owner sees English, same install.
  8. Every state is recoverable — power cut mid-bill → app reopens with the bill intact (journaled local writes).

POS screen inventory

Screen Notes
Login / shift open PIN-fast; denomination count on open
Billing (the screen) Scan box, lines grid, totals, customer picker (phone), hold/resume tray, payment overlay (cash/UPI-QR/card/khata/split), quick-keys row for loose produce
Returns/exchange Lookup by bill no / phone / scan of e-bill QR
Bill history & reprint Day-scoped by default
Item quick-add Minimal fields, flagged for back-office completion
Shift close / day-end Cash count, variance, day report print
Supervisor overlay PIN-gated: void, discount override, price change
Settings/diagnostics Printers, scale, display, sync status, keymap

Back office screen inventory (by module)

  • Dashboard: today across counters/stores, alerts (low stock, near expiry, khata due, sync health).
  • Catalog: items list (bulk edit, import), item editor, categories, price lists, schemes, label printing queue.
  • Purchases: purchase list, entry form, Purchase Inbox review queue (parsed draft ⇄ source PDF side-by-side, item-match confirmations), supplier ledger, GSTR-2B reconciliation.
  • Inventory: stock view (filters: store/category/batch/expiry), adjustments, transfers, stock-take sessions.
  • Sales: bill browser, returns, customer profiles, loyalty, khata & collections (WhatsApp reminder actions).
  • Accounting: vouchers, ledgers, day book, P&L/BS, Tally export, GST returns (GSTR-1/3B), e-Invoice/e-Way queues.
  • HO console (Enterprise): store comparison, central pricing pushes, consolidated GST.
  • Admin: users/roles/permission matrix, audit log browser, stores & counters, subscription/plan, backup status.

Owner app (v1 scope, deliberately small)

Today's sales (live), payments breakdown, top items, stock alerts, khata outstanding, approval requests (big discounts/voids), daily digest notification. Read-mostly; one write action: approve/deny.

Design system

  • Tokens first (color/spacing/type in one package) — POS, web, and mobile consume the same tokens; theme per surface (POS: high-contrast, dense; back office: comfortable).
  • Dark and light from day one (night-shift counters love dark).
  • Numerals: tabular figures everywhere money appears; ₹ formatting with Indian digit grouping (1,23,456.78) in one shared formatter.
  • Grid/table component gets the most investment — half the back office is tables. Virtualized, keyboard-navigable, exportable.
  • Print templates (thermal 2"/3", A4/A5 invoice, labels) as data-driven templates with a visual preview editor in settings — per-tenant customization without code. This was a Reports-era pain point; make it a strength.
  • Component stack suggestion: Radix primitives + Tailwind + our tokens (or Mantine if speed beats control). Icon set: Lucide. Charts: lightweight (recharts) in back office only.

Frontend engineering rules

  • Local SQLite is the POS source of truth; UI reads via a thin repository layer — no component ever awaits the network on the billing path.
  • State: keep it boring — TanStack Query for server state (back office), Zustand for POS session state; no global state kitchen-sink.
  • Every screen testable headless: business logic in plain TS modules, UI is a shell. Billing engine (pricing, tax, rounding, schemes) is a pure, versioned package with golden-file tests — the same engine runs in POS, back office, and cloud so a bill computes identically everywhere.
  • Feature flags evaluated client-side from the license token; locked features render as discoverable upsells, not hidden.
  • i18n from the first commit (string files, no literals) — retrofitting is misery.