POS Customer Display
The screen the shopper faces while the cashier rings up a sale: the lines as they are added, the subtotal, tax, discount, rounding, total and change, and between sales an idle screen with the branch name, a clock, your message and a carousel of images. It is read-only and creates nothing. It reads the cash bill POS General keeps in the browser, so it works only in the same browser profile on the same machine as the till — usually a second window on a second monitor; opened on another device or in a private window it stays on the idle screen for ever.
Your job, and the screen for it
| The job | Screen or tab | Read |
|---|---|---|
| Show the shopper the sale as it is rung up — open it in the same browser profile as the till, on the same machine | Cash Bill, in a second window of the till’s browser | Lifecycle and effects |
| Explain a figure to a shopper — a return shows minus signs, and rounding and a points discount arrive as lines of their own | Cash Bill line grid (Item panel) | Fields |
| Set the idle-screen message — left unset, it shows a blank line, not Welcome | Settings › Application Settings › Display Settings › Idle Screen Settings | Applet settings |
| Put images on the idle carousel — tick rows and press DEFAULT; anything uploaded is readable by anyone with the link | Settings › Attachment Settings | Applet settings |
| Set up the till it mirrors | POS General applet, in the same browser | Before you can use it |
Overview
POS Customer Display is the screen the shopper looks at while the cashier rings up a sale. It shows the cash bill’s lines as they are added, the running subtotal, tax, discount, rounding, total, amount paying and change, and — when the counter has nothing in the basket — an idle screen with the branch name, the date and time, a message you choose and a carousel of images you upload.
It is read-only. It creates nothing, settles nothing, and never calls a document endpoint. Everything it shows comes from the POS General Applet’s local draft, read out of the same browser database.
Where it fits
| Upstream | This applet | Downstream |
|---|---|---|
POS General Applet writing the current cash bill into its offline draft (draft_hdr, draft_line) in the browser’s IndexedDB database POS_<tenantCode> | Reads the same database live and renders it | The shopper’s eyes. Nothing else. |
The branch and sales-agent rows POS General stores in its settings table | The idle screen’s store name and sales-agent name | — |
| Images uploaded in Settings → Attachment Settings | The idle carousel | — |
new Dexie('POS_' + tenantCode), which is why the display must share the till’s browser profile on the same machine; a separate device, browser or private window sees an empty database (Troubleshooting).Screens and menus
| Menu | Route | What it shows |
|---|---|---|
| Cash Bill | pos | The display itself. Three panels are registered: POS Main (totals), Item (the line grid) and Message (the idle screen). The container switches to Item when the draft has at least one line and to Message when it has none. |
| Settings → Application Settings | settings/application-settings | Display Settings → Idle Screen Settings: a single MESSAGE field |
| Settings → Attachment Settings | settings/attachment-settings | The image library for the idle carousel |
| Personalization → Default Selection | personalization/personal-default-selection | Default Branch and Default Location |
Totals panel (POS Main): SUBTOTAL, TAX, DISCOUNT, ROUNDING, TOTAL, PAYING, CHANGE, all formatted to two decimals, plus the image carousel.
Line grid (Item): NAME, UNIT PRICE, QTY, AMOUNT, with an expandable child row carrying the same four columns for make-to-order component lines.
Idle screen (Message): the branch name and the sales-agent name from the POS settings row, a clock that ticks every second, and the configured message.
The shared settings navigation also renders links to Permission Wizard, Permission Set, User Permission, Role Permission and Release Notes, because the settings menu is shared. None of those screens exists in this applet — it has only Application Settings and Attachment Settings — so each of those links opens the applet’s 404 page.
Configuration
Before you can use it
| Prerequisite | Where | Why |
|---|---|---|
| POS General installed and in use in the same browser | POS General Applet | It is the only writer of the POS_<tenantCode> database this applet reads. |
| A signed-in session with an e-mail in local storage | Platform login | Without a signed-in e-mail in the browser, the display opens nothing and every panel stays empty. |
| A POS settings row (branch, sales agent) written by POS General | POS General → its own Default Selection | The idle screen’s store name and sales-agent name come from that row, not from this applet’s Default Selection. |
Applet settings
| Setting | Where it is set | What it controls | Default | Effect when changed |
|---|---|---|---|---|
MESSAGE | Settings → Application Settings → Display Settings → Idle Screen Settings | The line of text on the idle screen | none | Takes effect on the next settings load. The component initialises the field to "Welcome" but then overwrites it with whatever the setting holds — including nothing — so an unset MESSAGE shows a blank line rather than Welcome. |
POS_ATTACHMENT_GUID | Settings → Attachment Settings — tick rows in the Default Selection column, then press DEFAULT | A comma-separated list of attachment GUIDs; the display builds one carousel slide per GUID, in the order of the list | none | Ticking alone saves nothing: DEFAULT replaces the whole list with the rows ticked at that moment, sorted by Sort Code. Pressing it with nothing ticked empties the carousel. |
Both are tenant-wide applet settings. There is no branch-level or per-terminal variation.
Personalization → Default Selection offers Default Branch and Default Location. The screen is not connected — it cannot load or save. Nothing in the applet reads DEFAULT_BRANCH or DEFAULT_LOCATION either.
Attachment Settings maintains the slides: Sort Code, Code, Description, the uploaded file and its upload date, with Save, Delete and a file-replace action. The form treats Code and Description as required, but ADD and SAVE do not wait for them, and neither is shown to the shopper. What ADD and SAVE wait for is the file: they light only for a file whose name ends in lower-case .jpg, .jpeg, .png or .gif, so a camera’s IMG_0412.JPG is refused until you rename it.
Sort Code sets the carousel order, compared as text — 10 comes before 9, so pad them (01, 02 … 10). The order is fixed when DEFAULT is pressed: change a Sort Code later and the carousel keeps its old order until you tick the rows and press DEFAULT again. Slides are shown through a public link that needs no sign-in. Treat anything you upload here as publicly readable by anyone who has the link.
Feature visibility / permissions
The applet has no client-side permissions and reads no HIDE_* / SHOW_* keys, so there is nothing to gate — and there is no Feature Visibility screen here in any case.
Server-side, only the attachment library is behind permissions: TNT_API_DM_ERP_POS_CUSTOMER_VIEW_ATTACHMENT_READ / _CREATE / _UPDATE / _DELETE (with _OWNER and _ADMIN as the broad grants). The display itself calls no authenticated endpoint at all — it reads the local database and the anonymous image URLs.
Fields
Settings → Attachment Settings → Edit Attachment
| Field | Meaning | Required | Notes |
|---|---|---|---|
| File | The image itself | To have anything to show | Preview shown; a delete icon removes the file, a separate Delete removes the whole record |
Display line grid. NAME, UNIT PRICE, QTY and AMOUNT are copied from each till line at the moment POS General adds it: the item name, the unit price in the bill’s currency, the quantity in base units and the line amount. What a shopper may ask about:
- A returned item shows minus signs in all three number columns — quantity, unit price and amount are each multiplied by the line’s sign.
- The rounding adjustment and a points discount arrive as lines of their own, under the name of the item your tenant uses for each. Give those items names a shopper understands, because the shopper reads them.
- Discount and rounding lines sit at the top, then the items, newest first (the grid sorts on the till’s line position, highest first; read, not run).
Child rows are the line’s own components — the active component lines of a made-to-order item, or the line’s child items — with the component’s own name, unit price, base quantity and amount.
Lifecycle and effects
There is no document, no server document type, no signum, no journal and no stock movement. This applet writes exactly one kind of record — the slides — and otherwise only reads.
How the live figures arrive. The display reads the cash bill in progress from the browser’s own storage on the same device, where POS General writes it. The totals panel changes the moment the till writes them; the line grid is re-read from the browser once a second. Neither calls the server, so the display cannot mirror a till on another device (Troubleshooting).
The idle carousel. The slides chosen in POS_ATTACHMENT_GUID are shown in turn, each through its public link.
Related applets
- POS General Applet — the counter this display mirrors, and the only writer of the database it reads.
- Organisation Applet — the branch whose name appears on the idle screen.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| The display never leaves the idle screen while the cashier is ringing up a sale | The two applets are not sharing an IndexedDB — a different browser, a different device, a different profile, or a private window. | Open the display in a second window of the same browser profile as POS General, on the same machine. |
| Every panel is blank, including the idle screen | The browser had no signed-in e-mail stored, so the display opened nothing. | Sign out and sign back in on that browser. |
| The idle screen shows the branch and clock but no message | MESSAGE has never been saved. The component’s built-in Welcome default is overwritten with the empty setting. | Set a message in Settings → Application Settings. |
| The carousel is empty | No attachment row was saved as a default, so POS_ATTACHMENT_GUID is empty — ticking a row without pressing DEFAULT saves nothing, and DEFAULT with nothing ticked empties it. | Tick at least one row in Settings → Attachment Settings and press DEFAULT. |
| An image is ticked but does not render | The row has no file, or the file was deleted while the attachment record remained. | Re-upload the file on the Edit Attachment screen. |
| ADD or SAVE stays grey on an attachment although the image is chosen | The file name does not end in lower-case .jpg, .jpeg, .png or .gif — .JPG, .webp and .svg are all refused. | Rename the file (IMG_0412.jpg) or convert it, then choose it again. |
| Settings → Permission Set (or any permission link, or Release Notes) shows the 404 page | Those links are hard-coded in the shared settings navigation; this applet registers no such routes. | Manage permissions from an applet that does route them. |
| Personalization → Default Selection will not save | The component is routed directly, so the output that would carry the save is unbound. | Nothing to do — the two keys are not read by this applet anyway. |
| A carousel image URL was shared and opens for someone outside the tenant | The image endpoint is anonymous by design. | Only upload material you are content to publish. |
Related documentation
- Point of Sale module
- Cash Sales Workflow — the cashier’s shift the display runs beside