๐ Retail POS
Opening a shift
At start of day, a cashier opens the shift โ declares the opening cash float in the drawer. This is required before any sale can be posted (per-terminal setting).
- Go to POS โ Shift Ops or click your name at top-right โ Open Shift
- Enter opening cash count (โน1,000 typical for a small store)
- Click Open. Terminal status turns green. You can now sell.
RequireShiftOpen=0 so you can sell immediately without opening. On-prem stores enforce shift open.A basic sale
Discounts & promotions
Line discount
Click the line in cart โ Discount button in function bar. Enter % or โน amount. Applies to that line only.
Bill-level discount
Click Invoice Discount in function bar. Enter โน off the total.
Automatic promotions
The 5 seeded promotions apply automatically when their conditions match:
- WEEKEND10 โ 10% off if bill > โน500 on Sat/Sun
- BOGO โ Buy 1 Get 1 free (matches specific SKUs)
- WELCOME50 โ โน50 off first-time customer's bill > โน300
- LOYAL5 โ 5% off if loyalty card attached (stackable)
- BULK10 โ 10% off any line qty โฅ 10
Manage at POS โ Promotions. Add/edit/expire.
Loyalty cards
SolvexaRetail Loyalty is a 3-tier program (Silver / Gold / Platinum). Points earned per โน spent, redeemable โน1 per point after 100 min balance.
Enroll customer as loyalty member: Customers โ search โ Loyalty tab โ Enroll. Card number auto-generated.
Split tender
Customer wants to pay โน300 cash + โน500 card? Easy:
- At tender screen, click Cash, enter โน300, click Apply
- Then click Card, enter โน500, click Apply
- Bill totals to โน800. Click Complete.
Returns
Suspend & resume
Customer forgot their wallet? Suspend the sale, serve the next customer, come back to it.
- F9 or click Suspend โ cart saved with a token
- To resume: F10 or Resume, pick from suspended list
- Suspended sales auto-expire at end of day if not resumed
Reprint & email/WhatsApp
- Reprint last โ function key or Ctrl+P
- Reprint older โ POS โ Sale Register โ search receipt โ Print
- Email bill โ after tender, click Email. Uses customer's email.
- WhatsApp bill โ click WhatsApp. Uses customer's WhatsApp phone (opt-in required โ see WhatsApp guide)
End of day (EOD) posting — deep dive
At close of business the cashier runs Day-End. Explanation of what actually happens under the hood:
What EOD posting does, step by step
- Cash count. Cashier enters the actual cash they counted in the drawer. System compares against Expected Cash = Opening Float + Cash Sales - Cash Refunds - Cash Payouts. Any variance is logged with a reason.
- Prepare summary. System groups every POSTransaction posted for that terminal + business date into a single POSDayEnd record: gross sales, item discount, invoice discount, promotion discount, tax collected (CGST/SGST/IGST split), tender totals per Cash/UPI/Card/Voucher, and refunds.
- Approve (optional). If your tenant has enabled EOD approval, the summary sits as Draft until a supervisor reviews and approves. Otherwise it goes straight to Posted.
- Post to GL. Clicking Close Day / Post fires
sp_POS_PostDayEnd. It writes one GLBatch (numbered POS-000001, POS-000002, ...) containing the full double-entry set:- Dr Cash-in-Register (or Bank Deposit account) — total cash received
- Dr Bank Merchant Account — total UPI/card received
- Dr Voucher Redemption — total gift-voucher redeemed
- Cr Sales Revenue — net-of-tax sales
- Cr Output CGST/SGST/IGST — tax collected
- Cr Discount Given — item + invoice + promotion discounts
- Cr Cash Rounding Off — any rounding differences
tr_glentry_enforcebalancerefuses the batch otherwise. - BOM explosion. For every hospitality menu item sold that has a BOM (Recipe), the raw ingredients are auto-decremented. E.g. selling 1 Butter Chicken deducts 200g chicken + 50g butter + 5g garam masala from stock via ItemLedgerEntry rows tagged 'Consumption'. This runs inline in sp_POS_PostDayEnd.
- Inventory relief. Non-BOM items are relieved from stock as individual ILE 'Sale' rows — QtyOnHand drops by the sold quantity per SKU.
- ARS transfers. If Auto-Replenishment (ARS) is enabled for the store, sold-through items are flagged for reorder from the HQ / warehouse.
- Dimension stamping. Every GLEntry row is tagged with the store's + terminal's default dimensions so P&L can slice by cost centre / branch afterwards.
- Modifier BOM deltas. Any menu modifiers used (e.g. "extra cheese" adds 20g cheese consumption) get the incremental BOM effect posted via
sp_POS_ApplyModifierBOMDeltas.
What blocks EOD from posting
- Open shifts on the same terminal — close them first.
- Unbalanced tender total (cash + UPI + card ≠ bill total) — check the POSDayEnd draft for the offending transaction.
- Missing Cash Rounding Off GL account — set it on Finance → Rounding Setup.
- Missing POS posting group on Store — set it on Store → edit → Posting Group.
Reversing a posted EOD
Solvexa refuses to delete posted DayEnds directly (audit protection). To reverse:
- Go to POS → Day End → History. Pick the DayEnd to reverse.
- Click Reverse. Requires manager PIN. A reversing GLBatch is generated (all Dr/Cr flipped).
- Original DayEnd stays visible with status Reversed. New reversing batch is auditable in Finance → General Ledger.
- Re-run EOD after fixing the underlying transaction.
Terminal Type โ Retail / Hospitality / Kiosk / Pharma
Every POSTerminal has a Terminal Type that determines which POS surface the launcher opens:
- Retail POS โ
/POS/POSScreen(this page) - Hospitality POS โ
/Hospitality/HospPOS(dining tables, KOT, split bill) - Kiosk โ
/Hospitality/HospKiosk(self-serve customer-facing) - ๐ Pharmacy POS โ
/Pharma/PharmacyPOS(batch/expiry/Rx, shelf lookup)
Set it at /POS/POSTerminal โ edit terminal โ Terminal Type dropdown โ Save. The .bat launcher token routes to the right URL automatically when double-clicked. See the Pharmacy manual for the dedicated pharma POS.
One-click launcher (.bat)
Each terminal can be launched with ONE double-click. Cashier doesn't type login/password every morning โ the launcher auto-logs the assigned user in and lands directly on POS.
- /POS/POSTerminal โ pick your terminal โ click the purple ๐ฅ Silent-Print Launcher button. A file called
Solvexa-POS-<code>-<token>.batdownloads. - Save it to the terminal PC's Desktop.
- Make sure a user is bound to the terminal at /POS/TerminalAssignment. The launcher auto-logs in as that user.
- Double-click the .bat. Full-screen chromeless Edge/Chrome opens straight on POS. Cashier starts ringing sales.
- Exit kiosk with Alt+F4 (or Ctrl+W). Reopen with another double-click.
Solvexa-POS-TERM-01-Kx7m2p.bat). If you Rotate the token, the new file has a DIFFERENT fingerprint โ instantly tells you which .bat is fresh vs stale.Rotate the launcher token
If a POS PC is lost or a cashier is fired, invalidate the old .bat immediately:
- /POS/POSTerminal โ pick the terminal โ red ๐ Rotate Token button โ confirm.
- Old .bat stops working AT ONCE. A new .bat auto-downloads.
- Redistribute the new .bat to any cashier PC that legitimately needs it.
Silent print (kiosk mode)
The launcher runs Chrome/Edge with --kiosk --kiosk-printing --user-data-dir=<isolated>. What that does:
- Full-screen kiosk โ no address bar, no tabs, no title bar. Prevents cashier from browsing away.
- Silent print โ
window.print()goes STRAIGHT to the Windows Default Printer. No print dialog. No confirmation. Paper comes out. - Isolated profile โ flags apply reliably even if the user has Edge open for normal browsing.
Session locks โ takeover prompts
POS enforces two locks across browser sessions to prevent accidental double-cashiering.
Terminal lock
Only ONE browser can own a specific terminal at a time. Open POSScreen for TERM-01 in a second browser and you'll see:
- Yes โ the old browser gets kicked to /Login on its next action; you own TERM-01.
- No โ you continue anyway but a toast warns you may see stale state.
Staff lock (cross-terminal)
If the same cashier badge is swiped in at two terminals, the second swipe prompts:
Release paths
- Logout โ releases both terminal + staff.
- Swap Cashier button on POS (mid-shift hand-off) โ releases staff only, keeps terminal.
- 10-minute stale window โ a walked-away browser doesn't block a legit re-open.
Hardware setup โ receipt printer, cash drawer, scale, scanner
Every POS terminal can be paired with peripherals. Configure once per terminal at POS → POS Terminal → edit terminal → Hardware tab, then all cashier stations that use that terminal inherit the setup.
Receipt printer setup
- Install the manufacturer's ESC/POS driver on Windows (XPrinter XP-80, Epson TM-T88, Star TSP143 all supported). Do not use Windows' Generic/Text Only driver — browser silent-print silently drops jobs through it.
- Set that printer as the Windows Default Printer. Notepad → type "TEST" → Ctrl+P should produce paper before you touch Solvexa.
- In Solvexa: POS → POS Terminal → edit. Set Has Printer = Yes. Toggle Prints Receipt on. Save.
- Use the .bat launcher instead of a plain browser tab — it opens Chrome/Edge with
--kiosk-printingwhich routeswindow.print()straight to the default printer with no dialog. - Test: ring one dummy sale, tender it, print the receipt. If paper doesn't come out, check Windows print queue for stuck jobs and confirm the driver is not Generic/Text Only.
Cash drawer
- Connect the cash drawer to the receipt printer via RJ11 (standard for all POS-grade printers).
- In Solvexa: POS Terminal → Has Cash Drawer = Yes. Save.
- Drawer opens automatically at the end of any sale that took a Cash tender (or was tendered via Split Tender including cash). It also opens on manual "No Sale" → Open Drawer from the action strip.
- If drawer doesn't kick: your printer driver may need "Open drawer on cut" enabled in its Windows properties.
Barcode scanner
Any USB or Bluetooth keyboard-emulation scanner works — no driver, no config. Point it at the POS scan box (which auto-focuses on cart-idle) and scan an item barcode; the SKU is looked up and added to the cart. Toggle Has Scanner on the terminal record purely for reporting/inventory.
Weighing scale
- Connect scale via USB (label-printing scales like DIGI SM-100 include a keyboard-emulation mode).
- Set Has Scale = Yes on the POS Terminal.
- Configure the scale's PLU field (item code) on Setup → Scale PLU Field so weight-on-label items are recognised.
- At POS, either scan the scale-printed label (PLU + weight) or press the item's tile and the cart picks up live weight from the scale for the quantity.
Customer display (2nd screen)
Solvexa supports a per-terminal secondary display for showing the customer the running total and UPI QR at pay-time. See POS Screen Design → Customer Display for the full setup (BroadcastChannel, dual monitor arrangement, UPI overlay).
POS Button Designer — deep dive
The POS Screen you see the cashier tapping is built entirely from a per-terminal button grid you own. Add / remove / rename / reorder buttons without any code. Different terminals can have completely different button layouts.
What are POS buttons?
Each button on the POS grid maps to ONE of these actions:
- Item tile — taps add that specific SKU to the cart (fast for hospitality menus).
- Category tile — opens a sub-menu of items in that category.
- Command tile — runs a POS command: Discount, Void Line, Suspend, Refund, No Sale, Open Drawer, Manager Override, Change Cashier, Print Last Receipt, Cancel Sale, End Shift, Lock, etc.
- Tender tile — short-cut to a specific payment mode (Cash, UPI, Card).
- Deal tile — a pre-configured combo (Biryani Combo ₹550, Family Pack ₹1200 etc).
Design a button layout
- Go to Setup → POS Design (or Admin → POS Screen Design). Pick your Menu Profile.
- Set Layout Mode: Retail Clean, Retail Full, Hospitality Grid, Kiosk Big, Pharmacy Batch, etc. Each mode picks a default column count and button size.
- Toggle Show Bottom Bar on/off. Show it for hospitality (Send KOT / Print Bill / Table Ops); hide it for kiosks.
- In the button grid, drag-drop buttons to reorder. Click a button to open its detail panel:
- Label — text shown (icon + short text; long labels wrap).
- Icon — emoji or path to an image asset.
- Action — from the dropdown: item.add, item.category, cmd.discount, cmd.void, tender.cash, deal.apply, etc.
- Payload — e.g. for item.add it's the SKU; for cmd.discount it's the % or amount; for deal.apply it's the DealCode.
- Span — button size (1x1, 2x1, 2x2 for double-width or big kiosk tiles).
- Colour — per-button colour for grouping (all Beverages green, all Desserts orange).
- Manager Auth required — if on, tapping the button prompts for manager PIN before executing. Use for Discount, Void, Refund, Cancel Sale.
- Save. Refresh POSScreen — the new layout is live for every cashier bound to that terminal.
Sub-menus and popups
A Category tile can open a sub-menu of Item tiles. Nest as deep as you like. For hospitality menus, this is how you keep the top-level clean ("Mains", "Drinks", "Desserts") while each sub-menu holds 30+ items.
Terminal-specific layouts
Each POSTerminal record points to a MenuProfile. So Cashier-01 and Cashier-02 can share the same profile (identical buttons), while your Pharmacy terminal points to a completely different profile that shows batch + expiry entry fields instead of the standard beverage tiles.
Offline mode (Store install)
The cloud demo needs internet. For real store deployment, install the Solvexa Store App on the shop's PC (see Setup Guide). Store App:
- Runs fully offline โ no internet needed to ring sales
- Syncs to HO cloud when internet is up (typically every 30s)
- Push masters (items, price changes) from HO down to Store
- Push bills (sales, day-end) from Store up to HO