The terminal's badge only looked at navigator.onLine, so it said Online
while the server was down. It now also reflects whether the last sync or
health check reached the server. The cart badge no longer covers the
product name.
docs/PILOT_READINESS.md records what changed against the PRD review, the
decisions taken (offline sales may take stock negative, transfers may
not, server price wins but differences are flagged), rollout notes, and
what is still open.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Terminal (PRD 5.3/5.5):
- Opens with no network: a service worker caches the app shell and build
assets, and the last confirmed session and product list are kept on the
phone. Only a definitive 401/403 sends the cashier to the login page.
- The offline queue is keyed by cashier and branch, sends only the
signed-in cashier's sales, chunks to the server's batch limit, and acts
on the per-sale result: synced, or rejected with the reason shown and
never retried. Rows from the old queue are adopted on first sync.
- Several products per sale (tap to add), optional customer details, and
a printable receipt. The banner shows sales waiting to sync and any
that need attention; sign-out warns about unsynced sales.
- M-Pesa only appears when FEATURE_MPESA is on. A timed-out prompt now
tells the cashier not to take cash until the payment is checked,
instead of reporting it as failed.
Admin:
- New Stock page: stock per branch with low/out flags, physical counts
and adjustments, inter-branch transfers, morning dispatch and evening
count entry, and recent movements.
- Dashboard shows stock on hand per branch and links to Stock.
- Staff page can deactivate and reactivate accounts.
- Products page is read-only for branch managers and edits the low-stock
alert level.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>