tableplan.json — layout format¶
The table plan lives as a JSON file next to the plugin jar:
<POS data directory>/POSPlugins/AP/tableplan.json. If it does not exist,
the plugin adopts a tableplan.seed.json lying next to it on startup (so a
rollout mechanism can ship an initial plan read-only).
The file is read at runtime: when the table plan tab is opened, the UI fetches the current state, so a change takes effect immediately, without a POS restart.
The plan is edited in three ways, all writing the same format: at the POS (table plan tab → "Plan bearbeiten", edit plan), in the Table Plan Hub (one plan for all POS systems of a business), or with the Table Plan Editor included with every release (see Installation). So the file never has to be written by hand; this reference helps with checking, backing up or generating it programmatically.
Structure¶
{
"version": 1,
"revision": 7,
"title": "Tischplan",
"plans": [
{
"tableArea": "Default",
"name": "Gastraum",
"size": { "width": 1200, "height": 800 },
"background": { "color": "#f7f4ee" },
"elements": [ ... ],
"tables": [ ... ]
}
]
}
| Field | Meaning |
|---|---|
version |
Format version, currently 1. |
revision |
Increments with every save. Whoever saves must state which revision they based their change on; if it no longer matches, the save is rejected instead of overwriting someone else's changes. Hand-written files without revision count as 0. |
title |
Caption of the tab in the table overview (default: "Tischplan"; the POS renders tabs in upper case). |
plans[] |
One plan per table area. The plan whose tableArea matches the area selected at the bottom left is shown; if none matches, the first plan is shown. Floors are modeled with table areas: one area per floor, one plan per area. |
Plan¶
| Field | Meaning |
|---|---|
tableArea |
id of the table area from the CCO Manager (for example "Default"). |
name |
Display name (informational only). |
size |
Logical coordinate system (width/height). The plan scales responsively and the unit is up to you; as a rule of thumb, ~10 px per 10 cm of room. |
background.color |
Optional room background color. |
tables[] — the clickable tables¶
{ "id": "7", "x": 540, "y": 180, "width": 130, "height": 130,
"shape": "round", "seats": 6, "label": "Stammtisch", "rotation": 0,
"groupId": "g1" }
| Field | Meaning |
|---|---|
id |
Table number as in CCO (what you would type at "Neuer Tisch", new table). Clicking a free table opens exactly this table; clicking an occupied one opens its receipt. |
x, y, width, height |
Position/size in the plan's coordinate system. |
shape |
"rect" (default) or "round". |
seats |
Optional, shown on free tables ("4 Pl.", short for 4 seats). |
label |
Optional caption (default: id). |
rotation |
Optional, degrees around the center. |
groupId |
Optional. Tables with the same group id are combined: a shared frame with a shared label ("3+4"), shared selection when moving, and in operation a tap treats them as one table (receipts of all members are offered for selection; if the unit is free, the lowest number opens). A group with fewer than two members dissolves on its own. Purely graphical; CCO still keeps one receipt per table. |
Occupied tables that do not appear in the plan show up below the plan as clickable chips ("Nicht im Plan", not on the plan), so no table is ever lost.
elements[] — decoration/structure (not clickable)¶
{ "type": "rect", "style": "wall|bar|zone", "x": 0, "y": 0,
"width": 1200, "height": 12, "rx": 0, "label": "Bar", "color": "#..." }
{ "type": "line", "x1": 0, "y1": 0, "x2": 100, "y2": 0 }
{ "type": "label", "x": 600, "y": 40, "text": "Terrasse", "fontSize": 18 }
style controls the look (wall dark, bar brown, zone dashed frame);
color overrides the fill color.
Status colors at runtime¶
- white = free (the table exists only in the layout, no open receipt)
- green = your own table (an open receipt of the logged-in waiter), with the amount
- orange = another waiter's table, with the waiter's name at the bottom
of the table; the amount only with the permission
TABLE_SEE_AMOUNT_OF_OTHER_TABLES - red badge = several open receipts on the table (a click asks which one)