Commit graph

19 commits

Author SHA1 Message Date
Mavis
7cf8d4b2e2 feat(order): new /order tab — stock-code picker + qty, cost preview, PDF export
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.
2026-09-19 01:13:22 +02:00
Mavis
346a60cf97 feat(payments): relax batch_ref regex to allow spaces, slashes, dots, colons, etc.
The previous rule ^[A-Za-z0-9_-]{1,50}$ rejected common bank/POP
references that include punctuation [e.g. 'Bank ref 26/09/18',
'INV/2026.09:18 #3', 'POP 12345']. New rule permits letters, digits,
space, underscore, hyphen, slash, dot, comma, colon, parens,
ampersand, hash, apostrophe, plus; length 1-100. Still rejects
characters that break filesystems/URLs [e.g. < > " ? * | \ ;].

Files updated:
- app/api/payments/create/route.ts   [inline regex + new error msg]
- app/api/payments/[id]/edit/route.ts [BATCH_REF_PATTERN + new error msg]
- app/unpaid/UnpaidClient.tsx        [HTML pattern attribute]
- app/remittance/RemittanceClient.tsx [HTML pattern attribute]
- docs/superpowers/plans/2026-09-18-jei-payments-and-remittance.md [plan doc]
2026-09-19 01:13:15 +02:00
Ysterbaard
bcc8dfdfbc feat: edit button on remittance batches (batch_ref, payment_date, notes, zar_paid) 2026-09-18 23:14:19 +02:00
Ysterbaard
551baeeb80 feat: add ZAR Paid field to JEI_payment_batches (optional) 2026-09-18 23:10:54 +02:00
Ysterbaard
ca1c6cfedd fix: invalidate Next.js router cache on payment actions (unpay/create/replace-pop) 2026-09-18 23:00:50 +02:00
Ysterbaard
a50990d88f fix: move batchRefs fetch after records is filled (linked batch ref on /invoices) 2026-09-18 20:06:40 +02:00
Ysterbaard
14586a6e4f feat: add Unpaid and Remittance nav links 2026-09-18 19:58:44 +02:00
Ysterbaard
e54b1ae223 feat: add Status column + paid/unpaid row colors on /invoices 2026-09-18 19:56:33 +02:00
Mavis
84eb542104 fix: drop -created from remittance sort (PB lacks created column) 2026-09-18 19:54:08 +02:00
Ysterbaard
39b649f035 feat: /remittance page with batch cards, Replace POP and Unpay buttons 2026-09-18 19:51:37 +02:00
Ysterbaard
29240cc051 feat: /unpaid page with selection, sticky footer, and Create Payment modal 2026-09-18 19:43:37 +02:00
Ysterbaard
3299b67442 feat: POST /api/payments/[id]/replace-pop and /unpay 2026-09-18 19:05:12 +02:00
Ysterbaard
44f17d2a6e feat: POST /api/payments/create with validation and atomic invoice patching 2026-09-18 18:37:17 +02:00
Ysterbaard
5fec004a46 feat: add PaymentBatch types and Invoice.payment_batch 2026-09-18 18:28:16 +02:00
Mavis
922cd01dd4 chore: rename JEI invoice PDFs to invoice numbers + dedupe
- 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)
2026-09-18 17:55:12 +02:00
Mavis
44f9b6957e fix: bypass Next.js fetch-cache for PB SDK calls
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.
2026-09-17 23:59:13 +02:00
Mavis
22ddfe82bf fix: avoid PB SDK filter=undefined serialization (caused 400 errors)
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.
2026-09-17 23:17:58 +02:00
Mavis
b95599fe83 fix: dashboard autocancellation - single invoice fetch + clearer error 2026-09-17 23:11:55 +02:00
Mavis
22854074ca feat: working JEI invoice tracker with PB import + UI on port 6002
- Next.js 14 + Tailwind + TypeScript scaffolded
- PocketBase v0.39.8 collections: JEI_invoices, JEI_invoice_lines, JEI_stock_codes
  (30 fields total, locked to superuser)
- PDF extraction: scripts/extract_invoices.py parses 33 PDFs -> 38 records
- Import script: scripts/import_to_pb.py idempotent push to PB
- Imported: 24 invoices, 70+ stock codes, 118 invoice lines
- Pages: /, /invoices, /invoices/[id], /stock-codes, /stock-codes/[code]
- All 5 pages verified returning 200 with real data on port 6002
2026-09-17 23:07:56 +02:00