⚡
SMARTPOS Terminal Engine
👤
{{ selectedCustomer.name }} {{ consoleMode }}
{{ selectedCustomer.phone }} | {{ selectedCustomer.gstin }}
Khata Due ₹{{ Number(selectedCustomer.credit_balance || 0).toFixed(2) }}
Online Order 🔒 LOCKED ({{ cart.length }})
{{ isOnline ? 'ONLINE' : 'OFFLINE' }}
|
{{ isSyncing ? 'Syncing...' : lastSyncedText }}
{{ outboxCount }} Q
Pending Orders
Customer checkout requests awaiting billing
No online orders waiting for approval.
{{ order.customer_name || 'Walk-in Customer' }}
{{ order.customer_phone || 'No phone' }}
₹{{ Number(order.grand_total || 0).toFixed(2) }}
{{ order.status }}
{{ order.items?.length || 0 }} item(s) · {{ new Date(order.created_at).toLocaleString([], { dateStyle: 'medium', timeStyle: 'short' }) }}
{{ line.name }} × {{ line.quantity }} ₹{{ Number(line.line_total || 0).toFixed(2) }}
{{ currentTime }}
{{ activeRegister }} ACTIVE
Active cart restored automatically after unexpected tab shutdown.
AUTOFOCUS LOCKED
{{ item.barcode || item.sku || '—' }}
{{ item.name }} ({{ item.name_regional }})
Pack: {{ item.pack_qty || 1 }} {{ item.pack_uom || item.uom || 'PCS' }} • {{ item.category || 'General' }} • {{ item.brand }}
MRP: ₹{{ Number(item.mrp || 0).toFixed(2) }}
₹{{ Number(getSuggestedItemPrice(item)).toFixed(2) }}
{{ Number(item.stock_qty || 0).toFixed(0) }} left
[↑ / ↓] Navigate [ENTER] Add to Bill [ESC] Dismiss
{{ item.name }}
{{ item.name_regional }}
{{ item.brand }}
Pack: {{ item.pack_qty || item.pack_size || 1 }} {{ item.pack_uom || item.uom || 'PCS' }} · MRP ₹{{ Number(item.mrp || item.unit_price || 0).toFixed(2) }}
{{ item.tier_name }}
₹{{ Number(item.unit_price).toFixed(2) }} each · GST ₹{{ getCartLineAmounts(item).taxAmount.toFixed(2) }} ₹{{ getCartLineAmounts(item).grossTotal.toFixed(2) }}
🛒
Billing Cart Empty
Scan or search an item to begin
👤 CUSTOMER MANAGEMENT
NAME PHONE TYPE GSTIN / ADDRESS ACTION
{{ c.name }} {{ c.phone }} {{ c.billing_type }} [{{ c.gstin }}] {{ c.address || '—' }}
No customer found with that phone, name or GSTIN.
👤

Confirm Billing Type

{{ customerPrompt.customer?.name }} ({{ customerPrompt.customer?.phone }})

Customer is registered for: {{ customerPrompt.customer?.billing_type }} B2{{ customerPrompt.customer?.billing_type === 'wholesale' ? 'B' : 'C' }}.

GSTIN: {{ customerPrompt.customer.gstin }}

Choose to bill under the customer's registered profile or override to the alternate mode. The terminal will lock to your selection:

Rate Selection Required SKU: {{ rateModal.product?.sku || rateModal.product?.barcode }}

{{ rateModal.product?.name }}

Available Stock: {{ Number(rateModal.product?.stock_qty || 0).toFixed(0) }} {{ rateModal.product?.pack_uom || rateModal.product?.uom || 'PCS' }} • Mode: {{ consoleMode }}
Press 1–{{ rateModal.rates.length }} or Enter to select Press Esc to abort

Cashier / Staff Login

Use your assigned staff PIN. Contact the manager for a reset.
🔍 INVOICE SEARCH & REPRINT Archive
INVOICE # CUSTOMER LANE DATE / TIME CONSOLE TOTAL ACTION
{{ inv.invoice_no }} {{ inv.customer_name }} Walk-in {{ inv.register_code || 'REG-01' }} {{ String(inv.client_created_at).slice(0, 19).replace('T', ' ') }} {{ inv.console_mode }} ₹{{ Number(inv.grand_total).toFixed(2) }}
No matching invoices found.

Multi-Tender & Split Settlement

Counter: {{ activeRegister }} • Cashier: {{ activeUser.full_name }}
Total Payable (Net) ₹{{ grandTotal.toFixed(2) }}
Customer Khata Outstanding ₹{{ Number(customerKhataOutstanding).toFixed(2) }}
💵 Cash
📱 UPI / QR
💳 Card POS
📒 Khata Due Credit Sale
* Link a registered customer [F1] to enable Credit / Khata billing.
{{ splitBalanceRemaining <= 0.005 ? 'Change / Settle Status' : 'Remaining To Pay' }} {{ splitBalanceRemaining <= 0.005 ? (splitBalanceRemaining < -0.005 ? 'Change: ₹' + Math.abs(splitBalanceRemaining).toFixed(2) : 'Exact Total') : '₹' + splitBalanceRemaining.toFixed(2) }}

Invoice Slip Ready

TAX INVOICE
Bill No. {{ formatReceiptBillNumber(lastOrder?.invoice_no) }}
{{ formatReceiptDate(lastOrder?.client_created_at) }}
{{ formatReceiptTime(lastOrder?.client_created_at) }}
Customer: {{ lastOrder.customer_name }} · {{ lastOrder.customer_phone }}
GSTIN: {{ lastOrder.customer_gstin }}
MRP
Disc
Rate
Qty
Amount
{{ item.name_regional || item.name }} {{ Number(item.pack_qty || 1) }}{{ String(item.pack_uom || item.uom || 'PCS').toUpperCase() }}
{{ formatReceiptMoney(receiptItemMRP(item)) }}
{{ formatReceiptMoney(receiptItemDiscount(item)) }}
{{ formatReceiptMoney(item.unit_price) }}
{{ Number(item.quantity || 0).toFixed(1) }}
{{ formatReceiptMoney(item.line_total ?? (Number(item.unit_price || 0) * Number(item.quantity || 0))) }}
Customer Save: Rs {{ formatReceiptMoney(receiptItemDiscount(item)) }} / unit
Net Amount: ₹ {{ formatReceiptMoney(lastOrder?.grand_total) }}
GST Summary
Taxable
CGST
SGST
IGST
CESS
Tax Am
{{ slab.label }}
{{ formatReceiptMoney(slab.taxable) }}
{{ formatReceiptMoney(slab.cgst) }}
{{ formatReceiptMoney(slab.sgst) }}
0.00
0.00
{{ formatReceiptMoney(slab.taxAmount) }}
{{ formatReceiptMoney(receiptGSTSummary.totals.taxable) }}
{{ formatReceiptMoney(receiptGSTSummary.totals.cgst) }}
{{ formatReceiptMoney(receiptGSTSummary.totals.sgst) }}
0.00
0.00
{{ formatReceiptMoney(receiptGSTSummary.totals.taxAmount) }}
InWord: {{ numberToWordsINR(lastOrder?.grand_total) }}
Counter - {{ String(lastOrder?.register_code || activeRegister).replace(/[^0-9]/g, '') || '1' }}
User: {{ lastOrder?.cashier_name || activeUser.full_name }}
{{ lastOrder?.payment_method || 'CASH' }} · {{ formatReceiptMoney(lastOrder?.grand_total) }}
Tot Qty: {{ Number(receiptTotalUnits).toFixed(1) }}
Total Customer Saved: Rs {{ formatReceiptMoney(receiptTotalSaved) }}
*** THANK YOU. VISIT AGAIN ***

⏸️ Parked Sales / On-Hold Carts {{ parkedSales.length }} Active

Resume an on-hold cart when the customer returns to checkout

{{ parked.customer?.name || 'Walk-in Customer' }} ({{ parked.customer.phone }}) {{ parked.consoleMode }}
{{ parked.items.length }} Items • Held at {{ parked.parkedTime }} ({{ parked.timeAgo }})
{{ parked.items.map(item => item.name).slice(0, 3).join(', ') }}{{ parked.items.length > 3 ? '...' : '' }}
Total
₹{{ Number(parked.totalAmount).toFixed(2) }}
No sales are currently held on park.
Shortcut: Press F6 to Park or View Holds

🖥️ Terminal Configuration

Assign this device to a billing lane

Strict mode blocks credit tenders while this terminal is offline.

🛡️

Manager Authorization

{{ overrideModal.reason }}

{{ toast.icon }} {{ toast.message }}