WFDASH-WEBAPP/src/app
SJCoetz d33bb41a59 feat(orders): move delivered+cancelled to dedicated /orders/archive page
The 'Delivered' tab on /orders was broken \u2014 4,326 of 4,514 orders
(96%) have at least one delivered item. The old tab tried to
build a WHERE id IN (...) filter with 4,326 ids (~120 KB),
blowing past PB's ~4 KB filter cap and 400ing. This commit
moves historical orders to a dedicated page so:
  - The main /orders view is fast (22-28 active orders, not 4.5k
    historical)
  - The archive can be honest about its pagination ('Page 1 of
    217' is expected when looking for something from last month)
  - The badge counts on the main page stop being dominated by
    'Delivered (4,326)' / 'Cancelled (111)'

# Measured against the live PB

  /api/v1/orders/archive?page=1&perPage=2 \u2014 15.2s cold, 6.5 KB
  response. The 15s is the order_items.getFullList over 13,256
  items (the bottleneck; PB paginates over many round-trips).
  Per-row payload is the standard 5-6 KB for orders with deep
  expand. Subsequent pages within the same minute would be much
  faster since PB caches the order_items query.

# Service layer

- getOrdersArchiveData(params) in src/lib/server/orders-service.ts
  - Returns paginated list of orders with \u22651 item in
    (delivered, cancelled) status, plus per-status distinct
    counts for the header totals
  - Strategy: getFullList on order_items (ids + status only),
    dedupe + per-status counts in one pass, chunk the order ids
    by 100 (PB's URL/filter cap is between 4.5-6.7 KB) and fire
    parallel getFullList queries on orders with deep expand
  - Search hits order_number, company, customer, contact_name
  - Sort defaults to -created, override via the sort param

- /api/v1/orders/archive thin route: page, perPage, search, sort
  (no tab, no nocache \u2014 archive is one bucket, not a tab split)

# Page

- /orders/archive/page.tsx: card list with header counts
  (delivered / cancelled badges), search input, pagination
  footer. Click an order to open /orders/[id] in detail.

# Main /orders updates

- Delivered + Cancelled removed from the tab strip (passed
  tabKeys=['new','processing','collection_pool','collected'] to
  ItemStatusTabs)
- Counts on the main page now exclude delivered + cancelled
- 'Archive' button in the page header takes the operator to
  /orders/archive
- Safety useEffect: if activeTab is delivered/cancelled (e.g.
  stale URL or local state), reset to 'new'

# Tests

4 new tests in orders-service.test.ts:
  - Returns orders with \u22651 delivered/cancelled item, plus counts
  - Dedupe: one order with multiple matching items counts as 1
  - Search by order_number and contact_name
  - Empty result when no orders match

Full suite: 1321/1321 pass.

Co-authored-by: Orca <help@stably.ai>
2026-08-04 19:58:43 +02:00
..
(app) feat(orders): move delivered+cancelled to dedicated /orders/archive page 2026-08-04 19:58:43 +02:00
(auth) feat: collection-map updates, todays-stops, quote/approval rework, buyer-tasks, e2e 2026-08-03 09:33:45 +02:00
api feat(orders): move delivered+cancelled to dedicated /orders/archive page 2026-08-04 19:58:43 +02:00
favicon.ico feat(item-history): add getItemHistory service with 5 PB queries 2026-07-29 14:51:58 +02:00
globals.css feat(item-history): add getItemHistory service with 5 PB queries 2026-07-29 14:51:58 +02:00
layout.tsx feat(item-history): add getItemHistory service with 5 PB queries 2026-07-29 14:51:58 +02:00
offline.tsx feat(item-history): add getItemHistory service with 5 PB queries 2026-07-29 14:51:58 +02:00
page.tsx feat(item-history): add getItemHistory service with 5 PB queries 2026-07-29 14:51:58 +02:00