WFDASH-WEBAPP/public
Dave a499265b26 feat(pos): raise a system delivery note on an account sale
An account sale at the till used to produce a delivery-note-shaped slip that
was rendered entirely on the device and printed on the 80mm thermal printer.
Nothing reached the server, so the paperwork the client signed had no record
behind it. Cash / card / EFT are untouched and still get the thermal slip.

An account sale now creates a real `delivery_notes` record. The DN is raised
server-side INSIDE `checkoutSale` rather than by a follow-up call from the
till, because the offline queue (`flushQueue`) re-posts `/checkout` and
nothing else — a client-side second call would be silently dropped for every
sale taken while the network was down, which is exactly when a till is
flakiest.

`pos_sales.delivery_note` is the idempotency anchor that makes it
exactly-once: on a replay it hands back the existing DN instead of making a
second one, and a sale whose first attempt left the field blank retries. It
self-heals.

Deliberately non-fatal: if the DN can't be created the sale still succeeds.
The money and the stock movement are real by then; failing the checkout would
leave the drawer disagreeing with the stock ledger. The till is told instead.

Also in here:
  - DN number collision retry. The generator reads the highest existing number
    and adds one, which is not atomic, while PB holds a unique index on it. The
    POS adds a second concurrent writer, so two creates could collide and 500
    on a benign condition.
  - GET /api/v1/pos/sales now expands customer, customer.company and
    delivery_note so history.html can rebuild the DN card on a reprint. The
    nested customer.company matters — customer.company is itself a relation,
    so without it the card printed a raw PB id where the name belongs.
  - "Print slip" is hidden for account sales; that tender produces a delivery
    note, not a slip.

New GET /api/v1/pos/delivery-note/[number]/pdf streams the A4 original behind
assertPosAuth, so the till's bearer key stays its only credential. It does not
point at the CRM's unauthenticated invoicing route.

Verified end to end against a live note: DN26100401, correct company, both
lines with pricing, PDF attached, stock decremented once, and a replay of the
same client_ref returned the same DN without a duplicate.
2026-10-04 13:15:29 +02:00
..
icons feat: add picking slips, bulk print tracking, supplier map 2026-07-10 10:47:11 +02:00
letterhead feat: add branded quote PDF generation and in-app viewer 2026-06-23 08:30:38 +02:00
pos feat(pos): raise a system delivery note on an account sale 2026-10-04 13:15:29 +02:00
android-chrome-192x192.png feat(dashboard): add multi-theme system and supporting improvements 2026-06-26 17:59:40 +02:00
android-chrome-512x512.png feat(dashboard): add multi-theme system and supporting improvements 2026-06-26 17:59:40 +02:00
apple-touch-icon.png feat(dashboard): add multi-theme system and supporting improvements 2026-06-26 17:59:40 +02:00
favicon-16x16.png feat(dashboard): add multi-theme system and supporting improvements 2026-06-26 17:59:40 +02:00
favicon-32x32.png feat(dashboard): add multi-theme system and supporting improvements 2026-06-26 17:59:40 +02:00
favicon-96x96.png feat(dashboard): add multi-theme system and supporting improvements 2026-06-26 17:59:40 +02:00
favicon.ico feat(dashboard): add multi-theme system and supporting improvements 2026-06-26 17:59:40 +02:00
file.svg feat: add UI components for separator, sheet, sonner, switch, table, tabs, textarea, tooltip 2026-05-24 16:31:01 +02:00
globe.svg feat: add UI components for separator, sheet, sonner, switch, table, tabs, textarea, tooltip 2026-05-24 16:31:01 +02:00
manifest-counter.json feat(counter): add standalone counter order PWA 2026-08-13 09:27:20 +02:00
manifest-mobile.json fix(boss-dashboard): make /m installable as a PWA 2026-08-31 22:14:48 +02:00
manifest-rep.json feat(rep): visit check-in PWA — phone GPS, offline outbox 2026-09-06 21:09:27 +02:00
manifest.json feat(dashboard): add multi-theme system and supporting improvements 2026-06-26 17:59:40 +02:00
next.svg feat: add UI components for separator, sheet, sonner, switch, table, tabs, textarea, tooltip 2026-05-24 16:31:01 +02:00
og-image.png feat(dashboard): add multi-theme system and supporting improvements 2026-06-26 17:59:40 +02:00
og-square.png feat(dashboard): add multi-theme system and supporting improvements 2026-06-26 17:59:40 +02:00
sw-counter.js feat(counter): add standalone counter order PWA 2026-08-13 09:27:20 +02:00
sw-mobile.js feat: implement per-route service worker selection 2026-09-02 07:49:38 +02:00
sw-rep.js feat(rep): visit check-in PWA — phone GPS, offline outbox 2026-09-06 21:09:27 +02:00
sw.js chore: standardize line endings and add full test + config scaffolding 2026-06-11 20:30:02 +02:00
twitter-image.png feat(dashboard): add multi-theme system and supporting improvements 2026-06-26 17:59:40 +02:00
vercel.svg feat: add UI components for separator, sheet, sonner, switch, table, tabs, textarea, tooltip 2026-05-24 16:31:01 +02:00
wfdash-logo-icon.png chore: add logos, opencode config and build assets 2026-07-27 08:21:20 +02:00
wfdash-logo-mark.png chore: add logos, opencode config and build assets 2026-07-27 08:21:20 +02:00
wfdash-logo.png chore: add logos, opencode config and build assets 2026-07-27 08:21:20 +02:00
window.svg feat: add UI components for separator, sheet, sonner, switch, table, tabs, textarea, tooltip 2026-05-24 16:31:01 +02:00