-
Notifications
You must be signed in to change notification settings - Fork 0
Supervisor Guide
This is for a shift lead who already knows the Cashier Guide's flows. Everything here is a permission a cashier doesn't have — the actions that let money or stock leave the business without a customer noticing (see the Getting Started chapter's Roles section).
Every button in this chapter is gated by a permission tied to whoever is currently clocked in at that specific register — it isn't a password prompt layered on top of a cashier's own session. If a screen shows Void, Discount, Refunds, Transfer, or Approve variance, it's because the person signed in right now, at this till, holds the supervisor role at this location — roles are assigned per location, so being a supervisor at one store doesn't carry over to another (see Getting Started).
In practice: a cashier who hits something that needs you taps Clock out, you clock in with your own PIN to do the one thing, then clock out again so they can sign back in. The shift itself — the open drawer — isn't touched by any of this; only the PIN session changes hands.
A line:
- Tap Void on the cart row.
- Type why in Reason for the void… (required).
- Tap Confirm void — or Keep to back out without voiding it.
The whole order:
- Tap Void order, below the cart.
- Type why in Reason for voiding the whole order….
- Tap Void order to confirm — or Keep to back out.
Note: voiding a line or an order restocks whatever tracked stock those lines took out — the exact reverse of adding a line, which decremented it. A line that's already voided answers with a conflict rather than voiding twice.
- Tap Discount.
- Type a reason into Reason (required)… — every discount button stays disabled until you do.
- Tap the discount by name to apply it to the whole order.
To take one off, tap the ✕ next to it in the cart.
Note: this picker only offers your location's order-wide discounts — there's no per-line discount picker at the till in this version. Whatever you apply here covers the whole order, not a single item.
Tap Refunds in the top bar (only visible if you can refund) to open Refund a sale.
- Type the receipt number into Receipt number and tap Find order.
- For each line being returned, type the quantity to refund in its box. Leave Restock checked to put that stock back, or clear it if the goods are damaged or otherwise unsellable.
- Type a Reason.
- Tap Refund cash.
The refund always comes out of this drawer as cash, whatever the sale was originally paid with — a card sale can't be refunded to the card, since that money never passed through this till in the first place.
Note: only a closed order can be refunded. Looking up one that isn't answers with something like "Order GRC-20260716-0001 is open — only closed orders can be refunded." — find the right receipt number, or let the order close first.
On the Floor screen, each of your own tabs carries a Transfer chip (visible only if you can transfer, and only when another till is available to receive it).
- Tap Transfer under the tab.
- Under Send to, tap the destination till.
Note: only registers with an open shift right now show up as a destination. The target's drawer has to already be open, because the transfer moves the tab's money onto that shift's ledger the instant it lands — not just to a different person.
The permission and the underlying action exist (order.line.update, same rule a void
uses: decreasing a course's quantity once it's already Cooking or Ready needs
the same authority as voiding it outright, since shrinking a sent course is the same
fraud surface). Increasing a fired line's quantity needs no such gate — a kitchen
being asked for more of something isn't a fraud path.
The same authority gates the other direction on the prep chip, too: sending a Ready (or Cooking) course back a step is a downgrade out of a fired state, so it takes the void permission exactly like the quantity decrease above — a cashier's own tap on that chip only ever moves it forward.
Note: this version's register screen has no on-screen field for changing an existing line's quantity — only Void (remove it entirely) and the prep chip (move it through Pending / Cooking / Ready) are exposed here. A quantity correction on a fired line currently has to go through whoever operates the system directly against the API (see
03-api.md's Lines section), not a till button.
Paid-ins, payouts, and drops against the drawer are real, audited actions
(shift.cash_movement), and they're what fill in the Z-report's Paid in,
Payouts, and Drops rows once you read them.
Note: like the fired-line quantity change above, this version's register has no on-screen form to record one — the drawer only displays what's already been recorded. Recording a movement goes through the API directly (
03-api.md's Shifts section: a kind, an amount, and a reason) rather than a till button, until a screen for it ships.
The top bar carries a No sale button (only visible if you can open the drawer this
way, and only in the desktop shell — a browser tab has no drawer to pop, so it doesn't
show the button there; see Getting Started's
desktop shell note). It's for opening the
drawer with nothing being sold — making change for another till, say — and it's gated
exactly like everything else in this chapter: by the drawer.no_sale permission, held by
whoever's clocked in at this till right now (see
How an override actually happens at the till,
above).
- Tap No sale in the top bar.
- Type why in Reason for opening the drawer… (required) — the confirm button won't submit without one.
- Tap Open drawer to confirm. This is the No sale form's own confirm button, not the Open drawer button that starts a shift in the Cashier Guide — tapping this one only pops the drawer, it has nothing to do with opening or closing a shift.
Note: the server records the opening — who did it, at which register, and when — before the drawer actually pops, and that row shows up in the back office's audit log (
drawer.no_sale) exactly like a void or a discount does. There's no way to pop the drawer this way and leave no trace.
Once a shift closes, its result screen shows a Z-report: Sales — cash, Sales — external_card (one row per tender actually used that shift), the same broken down for Refunds, then Paid in, Payouts, Drops, and Orders closed / Orders voided / Orders split.
Note: a split shows up under Orders split, never Orders voided — even though splitting a check does technically void the original order server-side, to make room for the checks it becomes. That's bookkeeping, not the fraud-relevant kind this report is watching for, which is exactly why it's counted separately: reading Orders voided as "genuine voids for the day" stays safe.
When a shift closes outside the store's variance threshold, its own result screen shows Variance exceeds the threshold — needs supervisor approval. with an Approve variance button. Tapping it right there always fails: closing a shift immediately revokes every staff session tied to that register, so the very screen showing that button is already running on a dead session — the click lands as a session error and signs you straight back out to Enter PIN.
The rule behind it is real and correctly location-scoped: approval is checked against
the location, not a specific terminal, so a different, still-open till at the same
location is allowed to approve it. But like the two gaps above, no register screen
exists yet for that — each till's screen only ever knows about its own currently open
shift (GET /api/v1/shifts/current), never a different till's. Nothing here lists
another till's shift or renders an Approve button for it.
Today, approving from elsewhere means calling the API directly —
POST /api/v1/shifts/{id}/approve-variance, using a staff session from that other till
— the same way scripts/e2e-lunch-service.sh does it, not a button anywhere in this
app yet.
Note: this is expected behavior, not a bug to route around — see the Operator Guide's Troubleshooting for the same rule from the other side of the counter. The revocation itself is deliberate (
docs/06-roadmap.md's M5 notes); it's the register screen for reaching the approval from elsewhere that doesn't exist yet.
Once a manager closes the store's business day in the back office, Open drawer at any till in that location is refused for that date with "The business day is closed. Reopen it before opening a shift." Nothing at the till can lift that — reopening is Admin only, so a supervisor's override PIN doesn't apply here the way it does to a void or a discount. Get an admin to reopen the day (Manager Guide's End of Day); shifts open again the moment they do.
Two things worth knowing before the day gets closed on you:
- Every shift has to be closed first. A manager can't close the day while any drawer at the location is still open, so an abandoned open till is what's holding up their close — not a system fault.
- Your unapproved variances show up on their screen. A drawer that came up over or short past the threshold and hasn't been signed off is counted on the End of Day screen as an unapproved variance. It doesn't block the close — but it is visible, and it stays attached to that day. Approving it before the day closes is the tidy path, with the caveat in the section above about where you can approve from.
- Cashier Guide — the sale, tab, and close-shift flows this chapter builds on.
- Manager Guide — catalog, staff, and reports, once you need the back office.
Synced from docs/ at 49febb9 — edit in the repo, not here.
User Manual
Technical Documentation