- client/api/client.ts: shared refreshPromise prevents concurrent refresh races;
dispatches auth:logout event when refresh fails
- client/context/AuthContext.tsx: listen for auth:logout to clear user state
- server/routes/transactions.ts: POST / real-time single transaction through
payment abstraction (201 completed, 202 pending); GET /reports/shift shift
window totals with averageTransaction, shiftOpen/shiftClose timestamps
- .github/workflows/ci.yml: server typecheck+build, client typecheck+build,
Docker smoke-test on push/PR to main
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- GET /api/v1/catalog/sync?since= — delta sync for Android offline-first
- POST /api/v1/transactions/batch — idempotency-keyed batch upload (207 Multi-Status),
validates product ownership, skips duplicates silently
- GET /api/v1/transactions + /reports/summary — paginated list and aggregated
revenue/tax/top-product reporting with date range filters
- ReportsPage: stat cards, payment method breakdown, top-10 products, transaction table
- Reports added to sidebar nav and router
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>