Quick order-builder for the user. Pick a stock code, set a qty, hit Add.
Default unit price is the HIGHEST price ever paid for each code (worst-
case budget), with the reference invoice [no + date] shown in the table
so the price source is auditable. Ties broken by most-recent date so
the source reflects current market, not an old historical peak.
UI:
- Stock code dropdown shows code, description, default price, ref inv
- Inline-editable qty + unit price per row
- Running grand total at bottom
- Clear button (with confirm) wipes the list
- Export PDF button calls window.print() — browser "Save as PDF" gives
a clean table with no chrome (header/nav/controls hidden via @media
print stylesheet)
Persistence:
- List kept in localStorage key 'jei:order-list' across reloads
Files:
- app/order/page.tsx [server: fetches stock codes + lines, builds highest-price map]
- app/order/OrderClient.tsx [client: UI, state, print stylesheet]
- app/layout.tsx [nav: added Order link]
PB query note: when using `fields=...` to limit the response, you must
also include 'expand.invoice.invoice_no' and 'expand.invoice.invoice_date'
in the field selector, otherwise PB drops the expand data entirely.
- 22 files renamed to <invoice_no>.pdf (154923.pdf, 151778.pdf, etc.)
- 5 duplicate files moved to invoices/_non_jei/
- 7 files left as-is (multi-invoice PDFs or unscannable:
1.Invoice_29.05.pdf, Invoice.pdf, JEI Drilling Invoices.pdf,
JEI SA Invoice 147842.pdf, JEI SA Proforma 148931.pdf,
newdoc10018920260413143327_001.pdf, Supplier Invoice.pdf,
Supplier Invoices.pdf)
Next.js patches the global fetch with a cache layer that was returning
stale PB responses (showing description_goods as the code itself because
the snapshot was from before the import fixed the descriptions).
Wrap the SDK with a custom fetch using cache: no-store so every page
request gets fresh data from PocketBase.
The PB JS SDK serializes `filter: undefined` as the literal string
undefined in the URL, which PB rejects with 400 Bad Request.
Switched to conditionally including filter only when non-empty.