WFDASH-WEBAPP/src/app
Dave 89e52bbd9d feat(orders): AI fills order lines from the matched quote
The assistant now prices the order's lines from the quote they are
paired with, as purple drafts a person then reviews.

- order-assistant-core.ts: isOrderLineWritable + buildOrderLineFillPatch.
  Only a pending line with no cost of its own, no person-set pricing
  source and no reviewed fill may be written. Supplier / SKU /
  matched_price_list_id only when the line has none; selling_price only
  when the line has none; markup + markup_percent written together.
  pricing_source becomes "ai_quote". A customer price that differs
  from the quoted price by more than 5% becomes a doubt.
- order-assistant-lines.ts (new): the shared, cycle-free helpers —
  idFilter, aiQuotePairs, writeAiPairs, clearAiPairs and
  fillOrderFromQuote. It lives in its own module so orders-service.ts
  can use it without an import cycle, since order-assistant-service.ts
  already imports setOrderQuote.
- The fill re-reads every line right before writing it, so a cost a
  person typed in the meantime wins. It stays quiet until the migration
  has added order_items.ai_fill — PB rejects a projection that names a
  column the collection does not have.
- setOrderQuote writes the AI's line pairs before pairOrderLines runs,
  so the AI's pairing wins over word matching, then fills the lines.
  A failure there is logged and never fails the link.
- The tick gains a second pass that fills the lines of orders already
  linked to a quote. Only orders the fill actually wrote to count
  towards the budget, so a skipped order cannot block the run.
- The run route fills after the match and reports the counts.

PocketBase filters have no IN operator, so every id list is an
OR-chain. fetchQuoteItemsForQuotesAdmin no longer tries an IN filter
first — that was a guaranteed 400 on every call.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 14:24:56 +02:00
..
(app) feat(orders): Settings → AI order assistant section 2026-10-24 13:16:09 +02:00
(auth) fix: preserve destination through the login redirect 2026-09-01 15:47:27 +02:00
(counter) fix(pwa): restore apple-mobile-web-app-capable so iOS installs standalone 2026-09-06 21:56:01 +02:00
(mobile) feat(mobile-dashboard): add light/dark toggle, switch accent to red, bigger numbers 2026-09-07 15:02:10 +02:00
(print) feat: implement discount functionality in POS system 2026-09-03 12:19:21 +02:00
(rep)/rep feat(rep): add /rep/visits map with heatmap, per-customer clusters 2026-09-20 23:50:03 +02:00
(tv) feat(tv-dashboard): enhance TV dashboard with driver stops and performance metrics 2026-08-19 10:16:49 +02:00
api feat(orders): AI fills order lines from the matched quote 2026-10-24 14:24:56 +02:00
fonts fix(build): self-host the app fonts so the build doesn't need Google 2026-10-20 18:35:27 +02:00
scan fix(scan): speed up QR recognition and keep scanning 2026-10-05 09:43:53 +02:00
favicon.ico
globals.css feat(quote-assistant): ai colour token, marker, fill button 2026-10-16 19:45:44 +02:00
layout.tsx fix(build): self-host the app fonts so the build doesn't need Google 2026-10-20 18:35:27 +02:00
offline.tsx
page.tsx