User guide · Modules

POS terminal

The touch till for restaurant and bar outlets: shifts, tables, tickets, modifiers, sending to the kitchen, voids, discounts, split bills and tenders including charge-to-room.
Whole guide

Purpose and who uses it

Restaurant MgrAccountantHotel Manager

Waiters and bar staff ring up orders; supervisors authorise sensitive discounts; managers open and close shifts.

The POS terminal is the screen a server stands at. Each hotel has one or more outlets (a restaurant, a bar) with their own menu, tables and service-charge rate. A sale is a ticket of lines; lines are sent to the kitchen, adjusted, voided with a reason, discounted, split, and finally settled by a tender, cash, mobile money, card, or a charge to an in-house guest's room folio.

The terminal sits under the Payments permission module. Anyone with Payments at Can edit can ring and settle; Payments at View only sees the ticket and totals but no buttons. Discounts flagged as needing authorisation ask for the email and password of a supervisor who holds Payments or Settings at Full.

Screen anatomy

Outlet and shift bar on top, category rail on the left, menu grid in the middle, the ticket on the right.

POS terminal
1726345
  1. 1
    Outlet switch and shift chip
    One button per outlet (fork icon for restaurants, glass for bars). When a shift is open a chip shows its code and “Shift open · <opener>”. New ticket sits at the right end.
  2. 7
    Category rail
    Popular (starred items) first, then each menu category with its item count. Typing in the search box overrides the rail.
  3. 2
    Menu grid
    One tile per item: name, “N options” when it has modifier groups, price, a star if popular. Unavailable items are dimmed and marked 86'd.
  4. 6
    Search
    “Search the <outlet> menu…” filters every category by name; the count of shown items sits beside it.
  5. 3
    Ticket head
    Pick table (or the assigned table number), the TKT-… code, a badge with “N to send” or the kitchen status, Covers stepper, and a Room · guest banner when the ticket belongs to an in-house room.
  6. 4
    Ticket lines
    Name, modifiers, kitchen note, quantity stepper, a “sent” tag once fired, the void bin icon, and the line total with unit price.
  7. 5
    Totals and actions
    Discount select, Split, then Subtotal · discount · Service N% · VAT · Total due, and the two big buttons Send (N) and Pay.

If the hotel has no outlet the page shows “No POS outlet configured for this hotel.” Outlets, tables and menus are seeded per hotel; the per-outlet service % and the discount and void-reason lists are edited in Settings → Ops config.

Shifts

Restaurant MgrAccountant

One open shift per outlet; the shift report totals tenders, discounts and voids at close.

A shift (code SHF-…) is opened per outlet with an opening float and closed with an optional cash count. Only one shift can be open per outlet at a time, the server locks the outlet while it checks, and a database constraint backs it up, so two managers opening at once get one shift, not two.

  1. 1
    Open
    POST /pos/shifts/open with the outlet and the opening float (whole shillings, ≥ 0). The terminal then shows the green shift chip with the code and who opened it.
  2. 2
    Trade
    Tickets are not blocked by the absence of a shift; the chip is informational. Everything closed between open and close belongs to the shift.
  3. 3
    Close
    POST /pos/shifts/:id/close with optional closing notes and a denomination count (note value × count). The stored report holds ticket count, gross sales, total discounts, void count and value, totals per tender method, and the counted cash.

Building a ticket

Restaurant Mgr

Tap items to add them, pick a table or room, set covers, adjust quantities; a ticket is created the first time you need one.

  1. 1
    Start
    Tap a menu tile, click Pick table, or click New ticket. If no open ticket is selected, the first tap creates one (TKT-…, 1 cover) on the current outlet. The terminal reopens the most recent open ticket for the outlet when you return.
  2. 2
    Table or walk-in
    Pick table opens the floor by zone; each tile shows the number, seats and status. Choose a table, or Walk-in / no table. The table turns “open”; moving the ticket elsewhere frees the old table.
  3. 3
    Room service
    A ticket created against an in-house room (roomId) is linked to that guest's booking and shows a Room N · guest banner. The link is also made at payment time if you choose Charge to Room.
  4. 4
    Add items
    Tapping a plain item adds one straight away (“Added <name>”). Items with options open the modifier sheet.
  5. 5
    Quantities
    Use the − / + stepper on a line (1–99). Taking an unsent line to zero deletes it; taking a sent line to zero opens the void dialog instead.
  6. 6
    Covers
    The Covers stepper (1–20) sets how many guests; it also decides how many ways Split evenly divides the bill.

The modifier sheet

Titled with the item name and “Choose options · UGX … base”. Each modifier group is a row of chips; a group marked · required must have a choice (single-choice required groups preselect the first option), · choose any allows several. Price deltas show as +2K / −1K on the chip. Below is theKitchen / bar note (“e.g. allergy, no peanuts”), a quantity stepper and the running unit × qty price. Add to ticket stays disabled until every required group has a choice.

Sending to the kitchen and voiding

Restaurant Mgr

Send fires every unsent line and starts the kitchen ticket; voiding a sent line needs a reason and is audited.

Send

  1. 1
    Check the badge
    The ticket head shows “N to send” in purple while unsent lines exist; once everything is fired it shows the kitchen status instead.
  2. 2
    Click Send (N)
    All unsent, non-voided lines are marked sent; the ticket's kitchen status moves from new to preparing if it was new. Toast: “N items sent to kitchen”. The kitchen sees it on the Restaurant order board immediately.
  3. 3
    Add more later
    New lines start unsent; Send fires just those. Send is disabled when nothing is waiting (“No unsent lines” if forced).

Void a line

Click the bin icon on a line (or step a sent line to zero). The Void item dialog shows “2 × Chicken curry · UGX 48,000” and the reason list from Settings (defaults: Guest changed mind · Wrong item rung · Item unavailable / 86'd · Quality complaint · Duplicate entry · Manager comp).Keep item cancels; Void item confirms.

Discounts and split bills

Restaurant Mgr

Whole-ticket percentage discounts, some needing a supervisor; split evenly by covers or move items to a new ticket.

Discounts

The select under the lines lists the hotel's discounts (defaults: No discount · Staff meal 30% (auth) · Happy hour 20% · Loyalty member 10% · Manager comp 100% (auth)). A discount applies to the whole ticket subtotal and shows as a red line with its label; the ticket copies the label and % so later edits to the list do not change old tickets.

  1. 1
    Pick a discount
    Ones without “(auth)” apply immediately.
  2. 2
    Supervisor authorisation
    Ones marked “(auth)” open “Discount authorization, Enter supervisor credentials to continue” with Supervisor email and Password. Authorize sends them with the request.
  3. 3
    Server check
    The supervisor must be an active user of this hotel with Payments or Settings at Full access. On success the toast says “Discount applied”.

Split bill

Split opens “Split bill · TKT-… · table · UGX … due” with two modes.Split evenly divides every line by the number of covers (minimum 2), creating one child ticket per extra guest with the same table, room and discount; the original keeps its share. Split by itemlets you tick lines and Move to new ticket; the panel shows what goes to the new ticket and what stays. Each child is a normal ticket that is sent and paid separately.

Taking payment

Restaurant MgrAccountant

Pay opens the tender drawer; settling closes the ticket, prints the receipt, depletes stock and, for room charge, posts to the folio.

Pay (enabled once the ticket has a live line) opens the Take payment drawer: “TKT-… · table · outlet”, four tender tiles, the Balance due card and a right-hand panel that changes with the tender.

Tender types (as offered by the terminal)
FieldTypeNotes
CashUGX drawerQuick-cash chips 10K · 20K · 50K · 100K · 200K and Exact, plus a numpad. Entering more than due shows Change and the button reads “Settle · change UGX …”.
Mobile MoneyMTN / AirtelProvider select (MTN Mobile Money · Airtel Money) and Reference / phone. Settle needs at least 3 characters of reference.
CardVisa · MastercardCard auth reference (“Auth code or last 4 digits”), at least 3 characters.
Charge to RoomPosts to folioCharge to room select listing every in-house room as “Room N · guest”. “Posts to the guest folio as an F&B charge. Amount settles at check-out.”
  1. 1
    Choose the tender and fill its field
    The Settle button stays disabled until the tender's rule is met.
  2. 2
    Settle UGX …
    The ticket is recalculated, a tender row is written for the full total (one tender per ticket, no mixed tenders), the ticket closes, its table goes to “bill”, and the audit log gets pos.ticket.closed with method and total.
  3. 3
    Receipt
    The receipt PDF opens in a new tab (/api/pos/tickets/<id>/pdf): outlet, table or room, covers, server, live lines with modifiers and notes, discount, service, VAT, total and the tender. Toast: “Ticket settled” or “Posted to guest folio”.
  4. 4
    Stock
    Every live line with a recipe depletes its stock items. Stock never goes below zero: the decrement is clamped to what is on hand, the movement records what was actually taken, and any shortfall raises the notification “Stock short: <item>” (“TKT-… needed 6 but only 4 was on hand · count and adjust”). The sale itself is never blocked.

Ticket, kitchen and table statuses

A ticket is open or closed; its kitchen status runs new → preparing → ready → served; tables carry their own status.

Ticket status
Ticket statusSettle (any tender)OpenClosed
  • OpenClosed (Settle (any tender))

Every edit, lines, covers, table, void, discount, split, send, needs the ticket to be Open; a closed ticket answers “Ticket is closed”. Closing a ticket with a kitchen status of new moves it topreparing so the kitchen still sees it. The kitchen flow itself (new → preparing → ready → served) is driven from the Restaurant & kitchen boards.

Table statuses
FieldTypeNotes
freeNo ticket. Grey border in the picker.
seatedGuests sat, no ticket opened yet (blue).
openA ticket is attached to the table (purple). Set when a ticket is created on or moved to the table.
billThe ticket has been settled (amber). Set when the ticket closes.
dirtyNeeds clearing before reuse (red).

The terminal itself only writes free, open and bill; seated and dirtyexist for the floor picker's colours and for seeded data.

Ticket and line fields

What a ticket and a line carry, and the limits the server enforces.

Ticket
FieldTypeNotes
Outlet *Chosen in the top bar; fixes the menu, tables and service %.
TableOptional; from Pick table. One outlet's tables only.
Room / bookingOptional; links the ticket to an in-house guest for room charge and the Room banner.
Covers1–20Default 1. Drives Split evenly.
Note≤ 300 charsTicket-level note (API).
DiscountOne of the configured discounts; label and % are copied onto the ticket.
Line
FieldTypeNotes
Menu item *Must be available (not 86'd). Name and price are copied at the time of adding.
Qty1–99Line total = (price + modifier deltas) × qty.
ModifiersLabel and price delta per chosen option; required groups enforced on the sheet.
Note≤ 200 charsKitchen / bar note printed on the receipt and shown on the kitchen card.
Void reason *≤ 200 charsRequired when voiding; chosen from the Settings list.

Permissions

The terminal is guarded by the Payments module: View to look, Can edit to ring and settle, Full to authorise discounts.

Payments and Settings levels per role (default)
RolePaymentsSettings
Super AdminFullFull
Hotel ManagerFullEdit
ReceptionistViewNone
AccountantFullNone
Housekeeping MgrNoneNone
MaintenanceNoneNone
Restaurant MgrEditNone
HR ManagerViewView
SecurityNoneNone
None No accessView View onlyEdit Can editFull Full access
  • See the terminal, menu, tables, tickets, shift and receipts: Payments · View only.
  • New ticket, add/adjust/remove lines, table, covers, Send, void, discount, split, Pay, open and close shifts, kitchen status: Payments · Can edit.
  • Authorise an “(auth)” discount: the supervisor whose credentials are entered needs Payments · Full or Settings · Full.
  • Edit discounts, void reasons and outlet service %: Settings · Can edit, in Settings → Ops config.

Tips

Popular tab, search, live refresh, receipts and the audit trail.

Errors you may see

Every message the POS API can return, verbatim.

409Ticket is closed
Why
You edited a ticket that has already been settled.
Fix
Start a New ticket; closed tickets are read-only.
409Ticket already closed
Why
Pay was pressed twice, or another till settled the same ticket.
Fix
Nothing to do; reprint the receipt if needed.
400Add items before closing
Why
Every line on the ticket is voided or the ticket is empty.
Fix
Add at least one live line, or abandon the ticket.
400Menu item unavailable
Why
The item is 86'd or was deleted.
Fix
Mark it available in Restaurant → Menu, or ring a different item.
409Line is voided
Why
Quantity change on a voided line.
Fix
Add the item again as a new line.
409Line already voided
Why
Void requested twice on the same line.
Fix
Nothing to do.
409Use void-line for sent items
Why
A sent line was removed with the stepper instead of the void dialog (the screen normally routes this for you).
Fix
Use the bin icon and give a reason.
400No unsent lines
Why
Send was called with nothing waiting.
Fix
Add lines first; the button is disabled in this state.
400Unknown discount
Why
The discount was deactivated in Settings while your terminal was open.
Fix
Reload; pick one of the current discounts.
403Supervisor credentials required for this discount
Why
An “(auth)” discount was sent without email and password.
Fix
Fill in the Discount authorization dialog.
403Supervisor credentials invalid
Why
No active user with that email in this hotel, or wrong password.
Fix
Re-enter; the supervisor must use their own sign-in email.
403Supervisor must have Payments or Settings at Full level
Why
The credentials were right but that user is not a supervisor.
Fix
Ask an Accountant, Hotel Manager or Super Admin.
400No active lines to split
Why
Split on an empty or fully voided ticket.
Fix
Add lines first.
400lineIds required for by_item split
Why
Split by item with nothing ticked (the button is disabled on screen).
Fix
Tick at least one line.
400No matching lines
Why
The ticked lines were voided or moved by another till in the meantime.
Fix
Reload and split again.
409Cannot move KDS from <from> to <to>
Why
Kitchen status can only advance one step: new → preparing → ready → served.
Fix
Advance step by step on the Restaurant board.
400Select the mobile money network
Why
Mobile Money tender without a provider.
Fix
Choose MTN or Airtel.
400Room or booking required for room charge
Why
Charge to Room without a room selected.
Fix
Pick a room in the Charge to room select.
409No checked-in guest in that room
Why
The chosen room has no checked-in booking (guest left, or not yet arrived).
Fix
Choose another room or a different tender.
400Booking required for room charge
Why
Neither room nor booking could be resolved (API).
Fix
Send a roomId or bookingId.
409No open folio for this booking. Check the guest in first
Why
The guest is checked in but has no open folio, or checked out already.
Fix
Check the guest in, or settle by cash, mobile money or card.
409Folio is closed
Why
The folio closed at check-out before the charge posted.
Fix
Settle by another tender; hand the receipt to Payments if it must be billed later.
409Shift SHF-… is already open for this outlet
Why
One open shift per outlet.
Fix
Close the open shift first (it shows in the terminal chip).
409Shift already open for this outlet
Why
Two opens raced; the database constraint refused the second.
Fix
Use the shift that won.
409Shift already closed
Why
Close called twice.
Fix
Read the report from /pos/shifts/:id/report.
400outletId required
Why
The current-shift query was called without an outlet (API).
Fix
Pass the outlet id.
403Your role (<role>) has "View only" on Payments; this action needs "Can edit".
Why
Your Payments level is too low for the button.
Fix
See User Roles; ask a Restaurant Manager or Accountant.

Terms

Outlet, ticket, cover, 86'd, tender, room charge, shift.

Outlet
A selling point (restaurant, bar) with its own menu, tables, service % and shifts.
Ticket
One bill (TKT-…): lines, discount, totals, one tender. Open until settled.
Cover
A guest at the table; sets how many ways Split evenly divides.
86'd
Kitchen slang for “sold out / off the menu”. An unavailable item cannot be rung.
Tender
How a ticket is settled. The terminal offers Cash, Mobile Money, Card and Charge to Room; the shared tender enum also lists cash, momo, card, room, voucher, staff for reporting.
Room charge
A tender that posts the ticket to the in-house guest's open folio; settled at check-out.
Shift
An opened/closed trading period per outlet (SHF-…) with a float and a close report.