Wiki ๐Ÿ” Search

QIIUB โ€” Floating Shifts

Explained simply · sales-floating-shifts-cash-management · April 2026 · BCPOS

1. How it works today in RMH

In RMH the shift is called a Batch and it is tied to the register (terminal). When you open a batch on Register 1, everything that happens there belongs to Batch #47 — no matter who is operating it.

Key concept: In RMH, the batch belongs to the terminal, not the employee.

The problem: Maria works 8am–4pm and gets moved between terminals

TimeRegisterBatchAction on switch
8:00 – 10:30Register 1Batch #47Close + count cash drawer
10:30 – 2:00Register 5Batch #48Close + count cash drawer
2:00 – 4:00Register 9Batch #49Close + count cash drawer

Result:

The overnight-batch pain

RMH auto-creates the next batch when you close the previous one. If you close on Monday at 10pm, the new batch opens with Monday's date. But that batch is used all day Tuesday. When SAP/accounting reads the open date, it thinks the batch is Monday's. A familiar accounting headache.

2. How it works in QIIUB (Floating Shifts)

Key concept: In QIIUB, the shift belongs to the employee, not the terminal. The terminal is just infrastructure — it's where things happen, not who is responsible.

Shift + ShiftSegment

Two new concepts:

Same scenario, different outcome

RMH 3 separate batches

Batch #47 → Register 1 (8:00–10:30)

Batch #48 → Register 5 (10:30–2:00)

Batch #49 → Register 9 (2:00–4:00)

3 counts, 3 reports, 0 unified view

QIIUB 1 shift, 3 segments

Segment 1 → Terminal 1 (8:00–10:30)

Segment 2 → Terminal 5 (10:30–2:00)

Segment 3 → Terminal 9 (2:00–4:00)

1 count, 1 report, 1 owner

At the end of the day Maria counts once: "$347.50". The system expected $345.00. Over/short: +$2.50. One line in the report. One productivity view.

The overnight-batch fix

QIIUB has a BusinessDate field that is computed from the first sale of the shift (adjusted by the Location's BusinessDayEndTime). SAP/accounting reads BusinessDate, not OpenedAtUtc. Problem solved — the wall-clock time the shift opened no longer matters.

3. Cash drawer policies

Not every business handles the cash drawer the same way. QIIUB supports 3 policies per terminal:

PolicyHow it worksCash trackingTypical industry
CarryDrawer The cashier carries the cash drawer tray with them when they switch terminals. A single pool of cash. At Shift level only Supermarkets, retail, pharmacies, gas stations
FixedDrawer The cash drawer stays fixed on the terminal. When the employee arrives or leaves, a handoff count is performed. Per-segment snapshot (StartingCash / EndingCash) High-volume chains, hardware stores, bars
NoDrawer No physical cash drawer. The server carries their own cash, or the terminal is card-only. None at terminal level. Server bank reconciled at close. Restaurants (servers), kiosks, card-only terminals

The policy is configured per terminal (TerminalSetting.CashDrawerPolicy) with a default per location. Same schema, different behavior depending on the business.

4. What happens when they're offline?

This is the most interesting part of the design. QIIUB's POS is offline-first: each terminal has its own local database and can operate without internet.

Scenario: Maria moves to a terminal that is offline
  1. Maria is on Terminal 1 (Shift open, Segment 1 active).
  2. The manager tells her: "go to Terminal 5".
  3. Terminal 5 is offline — it cannot see Maria's open shift.
  4. Maria authenticates on Terminal 5 with her PIN.
  5. Terminal 5 finds no open local shift creates a new local shift.
  6. Maria works normally. Sales are written to the local database.
  7. When connectivity returns sync uploads everything to the cloud.
  8. The cloud detects: "there are 2 shifts for Maria, same location, overlapping times".
  9. Automatic merge:
    • The older shift (Terminal 1) is the canonical one.
    • The Terminal 5 shift is marked as Merged (tombstone).
    • Its sales, segments and cash movements are re-assigned to the canonical shift.
  10. Final result: Maria has 1 shift with 2 segments, as if the disconnect never happened.
Merge properties: idempotent (running twice yields the same result), auditable (recorded in AuditEntry), reversible (the merged shift is a tombstone, never deleted), and excludes Connector data (RMH/RMS don't float).

5. Existing customers on RMH/RMS — the Connector

Important: Floating shifts only applies to customers on the new native QIIUB POS. Customers still on RMH or RMS connect through the Connector, and their data looks different in QIIUB.

How RMH data looks in QIIUB

The Connector translates each RMH batch into a QIIUB shift, but in a simple, 1:1 way:

RMHQIIUB (via Connector)
1 Batch1 Shift + 1 ShiftSegment
BatchStatus (bitmask)ShiftStatus enum + IsBlindClose + IsExported
OpeningTimeOpenedAtUtc
CashierIDEmployeeId
RegisterIDCurrentTerminalId + ShiftSegment.TerminalId
(does not exist)BusinessDate (computed from first sale)
(does not exist)SourceSystem = ConnectorRMH, SourceId = "Batch#48"

Connector rules

What does NOT change for RMH/RMS customers
What RMH/RMS customers DO gain in QIIUB

6. Closeout types

QIIUB supports 3 closeout patterns, configurable per location and terminal:

TypeWhat happensWho countsFinal status
Full Close The cashier sees the expected amount, counts the cash drawer, enters the actual amount. The cashier Closed
Blind Close The POS hides the expected amount. The cashier counts blind and enters their count. The cashier (without seeing expected) Closed + IsBlindClose
Deferred Count
(Bargain City pattern)
The cashier does NOT count at the terminal. The cash drawer goes straight to the safe. The manager counts later. The manager (from the safe) PendingCount Closed

If a shift stays in PendingCount longer than MaxPendingCountHours (default: 24h), the system raises an alert.

7. Shift lifecycle

A shift can move through these states:

StateMeaningAllowed transitions
OpenEmployee actively working, can ring salesSuspended, PendingCount, Closed, Voided
SuspendedOn break or lunch. Can resume on the same or a different terminal.Open (resume)
PendingCountBlind closeout — cash drawer in the safe, awaiting manager countClosed (manager counts)
ClosedFully reconciled, close amount enteredFinal state — does not change
MergedAbsorbed by another shift during offline reconciliation (tombstone)Final state — does not change
VoidedCancelled by manager — only allowed if it has zero transactionsFinal state — does not change

Summary

RMH: the batch belongs to the terminal. 3 terminals = 3 batches = 3 counts.

Native QIIUB: the shift belongs to the employee. 3 terminals = 1 shift, 3 segments, 1 count.

RMH via Connector: each batch becomes 1 simple shift (read-only, no floating).
But they gain corrected BusinessDate, explicit fields, and unified reports.

Floating = once they migrate to the native QIIUB POS.

Companion: Technical diagrams (sales-floating-shifts-cash-management)