Registers and shifts
Opening and closing a register, float management and variance reporting.
A register is a till session for a store. It has three states: closed, open and break. Selling is only possible while it is open.
Opening
Opening asks for the float. You can count it in by denomination rather than typing a single figure, and add a note. The opening float, denomination breakdown, note, time and the staff member who opened it are all recorded.
Break
Break suspends the session without closing it — selling stops, and Resume picks the same session back up. It is for stepping away from the counter, not for ending the day.
Closing
Closing asks you to count the drawer, again by denomination, and to enter the total from your card terminal. The expected cash is worked out as:
opening float + cash sales + cash added − cash taken out
Cash sales come from the server rather than from the browser's running tally, so reloading the page mid-shift does not turn the day's takings into a variance. Manual drawer top-ups and payouts are tracked separately from cash sales so a top-up is never counted twice.
Both the cash variance and the card variance are recorded against the closed session, along with the closing note and who closed it.
float + cash sales + cash in − cash out, with cash sales read from the server. Source: POSModule.tsx (TillPopup, expectedCash, cashVariance), DenominationCounter.tsx, pos.module.css.Closing with no open register for the store is refused with an error rather than silently reporting success.
Permissions
The access matrix lists pos.open_close_register — supervisor and above by default. It is not enforced at the API today, so treat it as a convention rather than a lock.