Reading a sale
Reached from: the eye icon on any row of Direct sales
1. What the drawer shows
| Section | Contents |
|---|---|
| Header | Invoice reference, date, customer name and phone |
| Payment | The method pill |
| Lines | Product, variation, quantity, unit price, line total |
| Totals | Subtotal, discount, tax, grand total |
Everything except the lines is decoded from the remarks field of the underlying ledger rows — there are no dedicated columns for any of it.
2. What groups an invoice
| Field | Role |
|---|---|
batch_id | The real grouping key. A UUID generated per Complete, never displayed |
reference_no | Your invoice number. Human-readable, not unique |
remarks | The encoded customer/payment/discount/tax block, repeated on every line |
Nothing enforces uniqueness on reference_no. The default value is derived from the clock —
INV-<yyyymmdd>-<seconds since midnight> — so collisions are unlikely but possible, and editing the
field removes even that protection.
3. What you cannot do
| Not available | Why |
|---|---|
| Edit a posted sale | No edit path exists |
| Void or refund | No such permission and no such action |
| Print or email an invoice | Not in this module — storefront orders have printing, direct sales do not |
| Link the sale to a customer record | The name and phone are free text |
Direct sales produce a ledger entry, not a document. If a printed receipt matters, the storefront order path has order printing; this screen has nothing equivalent.
4. Correcting a mistake
The ledger is append-only, so the remedy is a counter-entry:
| Mistake | Fix |
|---|---|
| Wrong quantity | Post a stock adjustment for the difference |
| Entirely wrong sale | Post an adjustment reversing every line |
| Wrong customer or payment method | Cannot be corrected — the remarks are immutable |
Both the error and the correction stay visible, which is the point of an audit trail even when it is inconvenient.
5. Troubleshooting
| Symptom | Cause |
|---|---|
| Customer shows blank | No name was entered when the sale was posted |
| Totals do not match the line sum | Discount and tax are applied to the cart, not per line |
| Two rows for one sale | Two separate posts; each Complete is its own batch |
| The ledger shows this sale as several rows | Correct — one row per line, sharing a batch_id |
| Customer name visible in the ledger's Remarks | The ledger does not decode the [CUST:…] tag — see Reading a movement |