Chapter 11 — Point of Sale
Module code: POS
Features: pos_dashboard, pos_config, pos_session, pos_register
Home: /pos/
11.1 What the module is for
Point of Sale is counter selling: a cashier scans or searches for products, takes payment, and hands over a printed receipt. Behind that single action the system moves the stock out of the shop, posts a customer invoice, records the cash received, and reconciles the two.
It is separate from the Sales module (Chapter 6), which handles quotations and orders for named customers over time, and from Merchandising (Chapter 16), which is field visits rather than counter sales.
11.2 Concepts
| Concept | Meaning |
|---|---|
| Shop | A selling point. Carries its warehouse, its sales journal, its payment journal and its walk-in customer. |
| Session | One cash period at one shop — a shift or a day. Opened with a float, closed with a count. |
| Ticket | One sale. Becomes a posted invoice and a stock movement. |
| Expected cash | Opening float + cash taken − cash refunded, for that session |
| Difference | Counted cash − expected cash. Positive is over, negative is short. |
Only one session may be open per shop at a time. This is what makes the cash figure meaningful.
11.3 Setup
Creating a shop
/pos/shops/ list
/pos/shops/new/ create
/pos/shops/<id>/edit/ edit
- Select New shop.
- Enter:
| Field | Purpose |
|---|---|
| Name | The shop as staff know it |
| Warehouse | Where stock is sold out of. Sales relieve this warehouse. |
| Sales journal | Where the customer invoices post |
| Payment journal | The cash or bank journal money is received into. It must have a default account. |
| Default customer | The walk-in customer used when no named customer is given. It must have a receivable account, or the sales journal must have a default account. |
- Save.
Before the first sale
[ ] Items exist, are marked sellable, and carry a barcode if you scan
[ ] Items have a sales price and a sales tax
[ ] Stock is on hand in the shop's warehouse
[ ] The walk-in customer has a receivable account
[ ] Cashiers have create rights on pos_register
Two limitations to know before going live: the register does not sell services (there is nothing to move out of stock), and it refuses items tracked by lot or serial number, because a counter sale has no place to choose a batch. Sell those through the Sales module.
11.4 Opening a session
Screen: /pos/sessions/
- Go to
/pos/sessions/. - Select Open session for your shop.
- Enter the opening float — the cash physically in the drawer at the start.
- Confirm.
If the shop already has an open session, you are taken to it. If the shop is archived, a session cannot be opened.
11.5 Selling
Screen: /pos/register/
- Open the register. It works against your shop's open session.
- Add products: - Scan a barcode — an exact barcode match adds the line immediately. - Or search by name or code and select from the results.
- Adjust the quantity on any line, or remove it.
- Choose a customer if this is a named customer; otherwise the shop's walk-in customer is used.
- Select Pay.
- Enter the payment. Split across more than one method if the customer pays partly in cash and partly by card. The payments must add up to the ticket total including tax — the sale will not complete otherwise.
- Confirm.
In one step the system:
1. Creates the ticket and marks it paid
2. Moves the goods out of the shop's warehouse
3. Posts a customer invoice on the shop's sales journal
4. Records the money into the shop's payment journal and
reconciles it against that invoice
5. Adds cash payments to the session's expected cash
Printing the receipt
Screen: /pos/orders/<id>/receipt/
After payment, select Print receipt. The receipt is an 80 mm slip formatted for a thermal printer, and the browser's print dialog opens automatically.
There is no direct thermal-printer driver. Printing goes through the operating system's own printer dialog, which works with any 80 mm thermal printer installed on the machine — and lets you save the receipt as a PDF where that is more useful.
11.6 Returns and refunds
Screen: /pos/register/ → Return
- In the register, choose Return.
- Look the original ticket up by its number.
- Enter the quantity being returned on each line. Partial returns are allowed, and a ticket can be returned against more than once — the screen shows what is still returnable.
- Take the refund payment method and confirm.
The system then:
1. Creates a refund ticket linked to the original
2. Brings the goods back into the shop's warehouse
3. Posts a credit note to the customer
4. Takes the cash out of the drawer and reconciles it
against the credit note
5. Subtracts cash refunds from the session's expected cash
The original ticket stays marked paid — it was paid, and history should say so. The refund is its own document.
11.7 Closing a session
- Go to
/pos/sessions/and select Close on the open session. - Count the cash physically in the drawer and enter the counted amount.
- Confirm.
The difference between counted and expected is calculated and recorded. You are taken straight to the session report.
Do not close a session with a difference you have not investigated. A short drawer recorded and explained on the day is a manageable event; the same figure found a month later is not.
11.8 The session report
Screen: /pos/sessions/<id>/
Printable: /pos/sessions/<id>/print/
Works for open sessions as well as closed ones, so a supervisor can check a shift in progress.
| Section | Shows |
|---|---|
| Cash strip | Opening float, expected cash (live while open), counted, difference |
| Sales and refunds | Totals for each |
| Tender mix | Value by payment method: sales positive, refunds negative, and the net |
| Tickets | Every ticket in the session, each linking to its posted invoice or credit note and to its 80 mm receipt |
Tax authority status
Where the workspace uses FBR (Pakistan) or ZATCA (Saudi Arabia) e-invoicing, each ticket carries a read-only status badge for the linked invoice.
The point of sale does not submit to a tax authority by itself. The badge reports what has happened; submission and validation are done from the accounting invoice form (Chapter 12), where the invoice can be checked first. The badge links straight there.
FBR status never applies to a refund credit note. ZATCA can appear on both invoices and refunds when the company's provider is active.
11.9 Permissions
| Feature | Right | Allows |
|---|---|---|
pos_dashboard |
view | The Point of Sale dashboard |
pos_config |
view / create / edit | Shops |
pos_session |
view | Session list and session report |
| create | Opening and closing sessions | |
pos_register |
view | Browsing, searching, printing a receipt |
| create | Taking a sale or a return |
A cashier who can search products but gets an error on Pay has view rights without
create rights on pos_register.
11.10 Daily routine
Opening
[ ] Count the float and open the session with that figure
[ ] Confirm the register loads and a test search returns products
During the shift
[ ] Take sales; print a receipt for every one
[ ] Process returns against the original ticket, never as a negative sale
Closing
[ ] Count the drawer
[ ] Close the session with the counted figure
[ ] Read the session report; investigate any difference before leaving
[ ] Print the session report if your cash procedure requires a paper copy
11.11 Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| Pay is refused | No create right on pos_register |
Grant it |
| "No open session" | The session was never opened, or was closed | Open a session for the shop |
| Cannot open a session | One is already open for that shop, or the shop is archived | Close the open one; unarchive the shop |
| An item cannot be added | It is a service, or it is lot/serial tracked | Sell it through the Sales module |
| "Insufficient stock" | Stock is not on hand in the shop's warehouse | Transfer stock in, or correct it by adjustment |
| Payment is refused | The payments do not equal the ticket total including tax | Correct the amounts |
| Invoice is not created | The walk-in customer has no receivable account, or the sales journal has no default account | Set one of the two |
| Cash is not recorded | The shop has no payment journal, or its journal has no default account | Set the payment journal on the shop |
| Expected cash looks wrong | Non-cash tenders are excluded by design; only cash-like methods count | Read the tender mix on the session report |
| Receipt does not print | No printer selected in the browser's print dialog | Choose the thermal printer, or save as PDF |
| FBR/ZATCA badge stays blank | The point of sale does not submit | Submit from the accounting invoice (Chapter 12) |