On this page
For hosts, waiters and managers. Open Floor plan from the sidebar
(/pos/floor). Needs tables.view; seating, moving, merging and
splitting need tables.manage; designing the floor needs
tables.configure (sensitive).
Dining areas
Areas are tabs across the top: indoor sections, outdoor, terrace, VIP
rooms, bar seating, rooftop, garden, lakeside… Each area has a code, a
kind, a capacity, a smoking flag, an optional default service charge and a
grid (columns × rows) on which its tables are placed. Managers add areas
with + Area in the header and edit them from the area tab
(tables.configure).
Reading the plan
Each table is a tile at its position with its code, seat count and status colour:
| Status | Colour | Meaning | Set by |
|---|---|---|---|
| Available | green | free | closing/cancelling an order, Clear after cleaning |
| Occupied | saffron | an order is open on it | seating |
| Reserved | blue | held for a booking (name + time) | Reserve |
| Cleaning | grey | just vacated | closing an order |
| Bill requested | purple | guests asked for the bill | the till’s Bill |
| Blocked | dark | out of service | Block |
Merged tables show the primary table’s code (T12 + T13) and count as one.
Tiles update live from every till and floor screen of the branch.
Working a table (tap a tile)
| Action | What it does |
|---|---|
| Seat guests | choose the number of guests → opens a dine-in order on the till (sales.create) |
| Open order | jumps to the table’s order on the till |
| Reserve | name and time; the table turns blue; seating clears the reservation |
| Clear / Cleaning / Block | change the status of a free table |
| Assign waiter | choose the waiter responsible; copied to the order |
| Guests | update the guest count (also on the order) |
| Merge | pick the other tables to pull into this one: their open orders merge into (or transfer to) this table’s order and they show as merged |
| Split | un-merge: the joined tables return to their own tiles (status cleaning) |
| Transfer | move the table’s order to another free table (sales.transfer) |
An occupied table cannot be re-seated: a second host tapping Seat on the same table at the same moment gets “T5 already has an open order” — one wins, the other sees the live status.
Table turnover
The header shows today’s turnover live — Today: 18 turns · 52 covers ·
avg 47 min — and GET /api/pos/floor/turnover returns the same per
table (turns, covers, average minutes, minutes occupied). A session opens
when a table is seated and closes when its order is paid, transferred,
merged, cancelled or the table is cleared. The figures feed the reporting
phase.
Designing the floor (tables.configure)
Design switches the current area into the designer:
- Drag a table to move it; the grid snaps to whole cells and keeps tables inside the area.
- + Table — code, name, shape (square, round, rectangle, bar seat, booth), minimum and maximum seats, size in cells, rotation.
- Edit / Archive a table (an occupied table cannot be archived).
- Save layout writes all positions at once and is audited
(
tables.layout_saved); Cancel discards the drag changes.
Codes are unique within an area (T1, B3, VIP-2); names are what the
guests see on receipts.