From 89b412374acde0892bd9be954ce8c6fca386a276 Mon Sep 17 00:00:00 2001 From: Ryan Moon Date: Mon, 30 Mar 2026 19:15:13 -0500 Subject: [PATCH] =?UTF-8?q?Expand=20POS=20planning=20=E2=80=94=20discounts?= =?UTF-8?q?,=20returns,=20cash=20management,=20training=20mode,=20customer?= =?UTF-8?q?=20display,=20quick=20keys?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- planning/28_Frontend_Strategy.md | 78 ++++++++++++++++++++++++++++++-- 1 file changed, 74 insertions(+), 4 deletions(-) diff --git a/planning/28_Frontend_Strategy.md b/planning/28_Frontend_Strategy.md index 163fea7..01a62a2 100644 --- a/planning/28_Frontend_Strategy.md +++ b/planning/28_Frontend_Strategy.md @@ -76,18 +76,88 @@ The POS terminal stays authenticated but locks between use. Staff unlock with a This gives full audit trail (who did what) without the friction of typing credentials hundreds of times a day. +**Discounts & price overrides:** +- Line item discount (percentage or flat dollar amount) +- Whole-cart discount (e.g. 10% off everything) +- Price override with reason code (item rings up wrong, manual correction) +- Manager override: cashier attempts a discount or void above their permission level, manager punches their PIN to approve without taking over the session. Logged as "approved by [manager] for [cashier]" +- Configurable discount limits per role (e.g. sales associate can give up to 10%, manager up to 25%, admin unlimited) + +**Parked carts / layaway:** +- Park a cart — customer wants to keep shopping or come back later +- Multiple parked carts, each tagged with customer name or account +- Retrieve a parked cart to resume the sale +- Layaway: park with a deposit, schedule remaining payments +- Auto-expire parked carts after configurable period (default: 7 days) + +**Gift cards & store credit:** +- Sell a gift card (physical or digital, generates a unique code) +- Redeem gift card as payment method (scan or type code) +- Check balance +- Issue store credit (returns, adjustments) — tied to an account +- Store credit appears as a payment option when account is linked to the sale + +**Returns:** +- With receipt: lookup transaction by receipt number or barcode, select items, refund to original payment method +- Without receipt: store credit only, capped amount (configurable), requires manager override +- Exchange: return + new sale in one transaction +- Restocking fee support (percentage or flat, configurable per category) +- Returned items: prompt for condition (resellable, damaged, defective) — updates inventory accordingly + +**End of day / cash management:** +- **Open session:** cashier counts starting cash, enters amount, system records +- **Cash drops:** mid-shift safe drops, logged with amount and time +- **Close session:** two modes: + - *Counted close:* cashier counts the drawer, enters totals by denomination, system calculates over/short + - *Blind close:* cashier counts and enters total without seeing expected amount — prevents fudging +- **Z report:** end-of-day summary — gross sales, net sales, tax collected, payment method breakdown (cash, card, gift card, store credit), refunds, discounts given, over/short +- **X report:** mid-day snapshot (same data as Z but doesn't close the session) +- All reports printable on receipt printer + +**Training mode:** +- Toggle per POS session — transactions don't hit real inventory or accounting +- Visually distinct: large "TRAINING MODE" banner across the screen, different background color +- Manager enables/disables via their PIN +- Training transactions are logged separately for review but don't affect reports or stock + +**Customer-facing display:** +- Second screen (or portion of a split screen) showing the customer what's being rung up +- Line items, quantities, prices, running total +- Shows payment status ("Insert card", "Approved", "Change due: $4.25") +- Some jurisdictions legally require itemized display during transaction +- Configurable: on/off, which screen, store branding/logo + +**Quick keys / favorites:** +- Configurable grid of frequently sold items (strings, picks, reeds, cables, lesson payments) +- Admin configures the grid layout (drag and drop in admin UI) +- Supports categories/tabs (e.g. "Accessories", "Lessons", "Repairs") +- Faster than searching — one tap to add to cart +- Can also map to common actions (open drawer, apply house discount, gift card sale) + +**Receipts:** +- Thermal printer via ESC/POS (USB or network) +- Browser print fallback with receipt-formatted CSS +- Email receipt option (if customer has account with email) +- Text/SMS receipt (future, via email system) +- Configurable header/footer (store name, address, return policy, social media) +- Barcode/QR on receipt for easy return lookup + **Key screens:** 1. **Lock screen** — numeric keypad, current time, store name -2. **Sale screen** — product search (left), cart (right), totals + pay button (bottom) -3. **Payment screen** — amount due, payment method selection, card terminal status, change calculation -4. **Return/exchange screen** — lookup original transaction, select items, process refund -5. **Drawer management** — open session, cash drops, close session with counts +2. **Sale screen** — product search (left), quick keys (top), cart (right), totals + pay button (bottom) +3. **Payment screen** — amount due, payment method selection, card terminal status, change calculation, tip (optional) +4. **Return/exchange screen** — lookup original transaction, select items, refund method, condition prompt +5. **Parked carts** — list of held transactions, tap to resume +6. **Drawer management** — open session, cash drops, close session with denomination counting +7. **Reports** — X report, Z report, transaction history for current session **Hardware integration:** - Barcode scanner: keyboard wedge (types into focused input, no special API) - Card reader: local network or USB terminal via Stripe Terminal SDK or Global Payments SDK - Cash drawer: triggered via receipt printer (kick pulse) or USB relay - Receipt printer: ESC/POS over USB or network, or browser `window.print()` with receipt-formatted CSS +- Customer display: secondary screen via `window.open()` or dedicated display API +- Scale (future): for items sold by weight ## 2.3 Floor App — `packages/floor`