Files
parking_solution/packages/devices/src/index.ts
T
julian e14e31a840 feat(tills): per-till activity log, wash bucket on the booth Z-report, wash-desk printer role
Closes the three known follow-ups of the Tills decision (venue-modules.md):

- Activity log per till: `tillOfEvent(type, payload)` in @parking/shared (money events
  by payload till, other events by their owning module's till, everything else booth),
  applied by `/api/events?till=` in SQL and passed by the hub log, the Drawer "today"
  panel and the booth feed (history + live pushes). The events route admits a role that
  holds a module feed permission without event:read and returns only that module's
  event types — the live-socket rule.
- Booth Z-report: `chargesByModuleMinor` sums the chargeLines on the till's payments by
  module; the ticket bucket excludes them (Bileta = parking only); printed
  "Lavazh (në biletë)" only when any was taken. The wash till's slip prints "Lavazh:".
- Printer role `wash-desk`: the wash till's Z-report and vouchers print there, falling
  back to the booth printer; nothing falls back to the desk. `printerRoleOf()` is the
  one reading of the role field (the entry/booth loaders treated any non-booth role as
  an entry dispenser). Footer label "at wash desk".

Also: `GET /api/carwash/settings` opens to carwash:read OR site:read (new
requireAnyPermission) — the Wash operator job could not load the desk's category and
service pickers. Tests for all four; wiki (shift, printer-roles-failover, venue-modules,
log) updated.

Claude-Session: https://claude.ai/code/session_01FWncR69HgGPuei1dLrW3cU
2026-09-06 12:37:26 +02:00

34 lines
1.2 KiB
TypeScript

// @parking/devices — device-agnostic adapters + the driver registry that lets
// an admin select between supported devices at first-run setup.
//
// See wiki/concepts/device-adapter-pattern.md and device-registry.md.
export * from "./interfaces.js";
export * from "./registry.js";
export { setDeviceLogSink, type DeviceLogSink } from "./drivers/common.js";
// Built-in drivers: the registrar plus the individual driver objects (used by
// hardware test scripts and any direct/programmatic device access).
export {
registerBuiltinDrivers,
dingtianDriver,
stubAccessDriver,
wiegandReaderDriver,
tcpipReaderDriver,
dingtianQrReaderDriver,
hikvisionDriver,
dahuaDriver,
rongtaDriver,
escposDriver,
} from "./drivers/index.js";
export { isPrinter, type PrinterRole } from "./drivers/printer-rongta.js";
// Albanian human date/time for printed slips (receipts, tickets, shift Z-report),
// kept in one place so all printed output formats dates identically.
export { stamp as formatStampSq } from "./drivers/printer-escpos.js";
export {
orderForRole,
printWithFailover,
printerRoleOf,
NoPrinterAvailableError,
type PrinterInstance,
} from "./printer-routing.js";