# PB Schema Audit — Unused / Legacy Fields Generated by `scripts/audit-pb-fields.py`. For every non-system field in every business collection, counts references in the Next.js app source (`src/`, `scripts/` — `pb-exports/` is a schema dump and is excluded). A file is considered to "touch" a collection if it contains the collection name as a string literal (e.g. `pb.collection("orders")`) or the collection's PB id (`pbc_3527180448`). ## Summary - **Total fields audited:** 347 - **Unused fields (0 references):** 49 - **Single-reference fields:** 1 - **Dead collections (never referenced by app):** 3 - `driver_locations` (base) — 8 fields all dead - `masterdrilling_consignment` (base) — 8 fields all dead - `pos` (base) — 16 fields all dead ## `categories` (`base`) | field | type | required | refs | used where | |---|---|---|---|---| | `match_brands` | text | no | ✅ 4 | scripts/migrations/2026-07-02-add-sprint-categories-and-claims.ts | | `match_keywords` | text | no | ✅ 5 | scripts/migrations/2026-07-02-add-sprint-categories-and-claims.ts | | `match_supplier_tags` | text | no | ✅ 5 | scripts/migrations/2026-07-02-add-sprint-categories-and-claims.ts | | `display_order` | number | no | ✅ 7 | src/app/(app)/sprint/page.tsx
scripts/migrations/2026-07-02-add-sprint-categories-and-claims.ts | | `is_active` | bool | no | ✅ 7 | src/app/(app)/sprint/page.tsx
scripts/migrations/2026-07-02-add-sprint-categories-and-claims.ts | | `color` | text | no | ✅ 9 | src/app/(app)/sprint/page.tsx
scripts/migrations/2026-07-02-add-sprint-categories-and-claims.ts | | `slug` | text | yes | ✅ 12 | src/app/(app)/sprint/page.tsx
scripts/migrations/2026-07-02-add-sprint-categories-and-claims.ts | | `name` | text | yes | ✅ 26 | src/app/(app)/sprint/page.tsx
scripts/migrations/2026-07-02-add-sprint-categories-and-claims.ts | ## `companies` (`base`) | field | type | required | refs | used where | |---|---|---|---|---| | `company_email` | email | no | ✅ 16 | src/app/(app)/companies/page.tsx
src/app/(app)/companies/[id]/page.tsx
src/components/company-form.tsx
src/lib/pb-helpers.ts | | `company_tel` | number | no | ✅ 16 | src/app/(app)/companies/page.tsx
src/app/(app)/companies/[id]/page.tsx
src/components/company-form.tsx
src/lib/pb-helpers.ts | | `vendor` | text | no | ✅ 41 | src/app/(app)/companies/page.tsx
src/app/(app)/companies/[id]/page.tsx
src/app/api/v1/companies/route.ts
src/app/api/v1/companies/[id]/route.ts
src/app/api/mcp/route.ts
... +9 more | | `address` | text | no | ✅ 52 | src/app/(app)/companies/page.tsx
src/app/(app)/companies/[id]/page.tsx
src/app/api/v1/companies/route.ts
src/app/api/v1/companies/[id]/route.ts
src/app/api/mcp/route.ts
... +8 more | | `coordinates` | geoPoint | no | ✅ 109 | src/app/(app)/companies/[id]/page.tsx
src/app/api/v1/companies/route.ts
src/app/api/v1/companies/[id]/route.ts
src/app/api/mcp/route.ts
src/components/company-form.tsx
... +8 more | | `company` | text | no | ✅ 403 | src/app/(app)/companies/page.tsx
src/app/(app)/companies/[id]/page.tsx
src/app/api/v1/companies/route.ts
src/app/api/v1/companies/[id]/route.ts
src/app/api/mcp/route.ts
... +13 more | ## `customers` (`base`) | field | type | required | refs | used where | |---|---|---|---|---| | `lastvisiteddate` | date | no | ✅ 12 | src/components/customer-form.tsx
src/lib/pdf/render.test.ts
src/lib/server/quotes-service.test.ts
src/lib/server/management-service.ts
scripts/setup-pocketbase.ts
... +4 more | | `dateadded` | date | no | ✅ 16 | src/app/(app)/customers/[id]/page.tsx
src/components/customer-form.tsx
src/lib/pdf/render.test.ts
src/lib/server/quotes-service.ts
src/lib/server/quotes-service.test.ts
... +6 more | | `buyer_email` | text | no | ✅ 33 | src/app/(app)/customers/[id]/page.tsx
src/app/api/v1/customers/route.ts
src/app/api/v1/customers/[id]/route.ts
src/app/api/mcp/route.ts
src/components/customer-form.tsx
... +8 more | | `alternative_email` | text | no | ✅ 34 | src/app/(app)/customers/[id]/page.tsx
src/app/api/v1/customers/route.ts
src/app/api/v1/customers/[id]/route.ts
src/app/api/mcp/route.ts
src/components/customer-form.tsx
... +8 more | | `coordinates` | geoPoint | no | ✅ 100 | src/app/(app)/customers/[id]/page.tsx
src/app/api/v1/customers/route.ts
src/app/api/v1/customers/[id]/route.ts
src/app/api/mcp/route.ts
src/components/customer-form.tsx
... +10 more | | `rep` | relation | no | ✅ 121 | src/app/(app)/customers/page.tsx
src/app/(app)/customers/[id]/page.tsx
src/app/api/v1/customers/route.ts
src/app/api/v1/customers/[id]/route.ts
src/app/api/mcp/route.ts
... +11 more | | `description` | text | no | ✅ 158 | src/app/(app)/customers/page.tsx
src/app/(app)/customers/[id]/page.tsx
src/app/api/v1/customers/route.ts
src/app/api/v1/customers/[id]/route.ts
src/app/api/v1/quotes/[id]/pdf/route.ts
... +16 more | | `number` | text | no | ✅ 228 | src/app/(app)/customers/page.tsx
src/app/(app)/customers/[id]/page.tsx
src/app/(app)/dashboard/page.tsx
src/app/api/v1/customers/route.ts
src/app/api/v1/customers/[id]/route.ts
... +19 more | | `company` | relation | no | ✅ 396 | src/app/(app)/customers/page.tsx
src/app/(app)/customers/[id]/page.tsx
src/app/api/v1/customers/route.ts
src/app/api/v1/customers/[id]/route.ts
src/app/api/v1/delivery-notes/route.ts
... +17 more | | `customer` | text | no | ✅ 542 | src/app/(app)/customers/page.tsx
src/app/(app)/customers/[id]/page.tsx
src/app/(app)/dashboard/page.tsx
src/app/api/v1/customers/route.ts
src/app/api/v1/customers/[id]/route.ts
... +20 more | ## `delivery_notes` (`base`) | field | type | required | refs | used where | |---|---|---|---|---| | `delivery_date` | date | no | ✅ 6 | src/lib/server/delivery-notes-service.ts
src/lib/server/delivery-notes-service.test.ts
scripts/migrations/2026-07-19-create-delivery-notes.ts | | `created_by` | relation | no | ✅ 10 | src/app/api/invoicing/delivery-note/route.ts
src/lib/pb-helpers.ts
src/lib/server/delivery-notes-service.ts
src/lib/server/delivery-notes-service.test.ts
scripts/migrations/2026-07-19-create-delivery-notes.ts | | `customer_po` | text | no | ✅ 12 | src/lib/server/delivery-notes-service.ts
src/lib/server/delivery-notes-service.test.ts
scripts/migrations/2026-07-19-create-delivery-notes.ts | | `signed_copy` | file | no | ✅ 23 | src/app/api/v1/delivery-notes/[id]/signed-copy/route.ts
src/lib/server/delivery-notes-service.ts
scripts/migrations/2026-07-19-delivery-notes-signed-copy.ts | | `delivery_note_number` | text | yes | ✅ 57 | src/app/api/invoicing/delivery-note/route.ts
src/lib/pb-helpers.ts
src/lib/server/delivery-notes-service.ts
src/lib/server/delivery-notes-service.test.ts
scripts/migrations/2026-07-19-create-delivery-notes.ts | | `notes` | text | no | ✅ 69 | src/app/api/v1/delivery-notes/[id]/signed-copy/route.ts
src/app/api/invoicing/delivery-note/route.ts
src/lib/pb-helpers.ts
src/lib/server/delivery-notes-service.ts
src/lib/server/delivery-notes-service.test.ts
... +2 more | | `company` | relation | no | ✅ 88 | src/app/api/invoicing/delivery-note/route.ts
src/lib/pb-helpers.ts
src/lib/server/delivery-notes-service.ts
src/lib/server/delivery-notes-service.test.ts
scripts/migrations/2026-07-19-create-delivery-notes.ts | | `order` | relation | no | ✅ 132 | src/app/api/invoicing/delivery-note/route.ts
src/lib/pb-helpers.ts
src/lib/server/delivery-notes-service.ts
src/lib/server/delivery-notes-service.test.ts
scripts/migrations/2026-07-19-create-delivery-notes.ts | | `customer` | relation | no | ✅ 138 | src/app/api/invoicing/delivery-note/route.ts
src/lib/pb-helpers.ts
src/lib/server/delivery-notes-service.ts
src/lib/server/delivery-notes-service.test.ts
scripts/migrations/2026-07-19-delivery-notes-signed-copy.ts
... +1 more | | `status` | select | yes | ✅ 168 | src/app/api/v1/delivery-notes/[id]/signed-copy/route.ts
src/app/api/invoicing/delivery-note/route.ts
src/lib/pb-helpers.ts
src/lib/server/delivery-notes-service.ts
src/lib/server/delivery-notes-service.test.ts
... +1 more | ## `driver_locations` (`base`) ⚰️ **DEAD COLLECTION** | field | type | required | refs | used where | |---|---|---|---|---| | `accuracy` | number | no | **❌ unused** | — | | `geoPoint` | geoPoint | no | **❌ unused** | — | | `heading` | number | no | **❌ unused** | — | | `latitude` | number | no | **❌ unused** | — | | `longitude` | number | no | **❌ unused** | — | | `relation` | relation | no | **❌ unused** | — | | `speed` | number | no | **❌ unused** | — | | `timestamp` | date | no | **❌ unused** | — | ## `dupicate_custmers` (`view`) ⚰️ **DEAD COLLECTION** | field | type | required | refs | used where | |---|---|---|---|---| | `customer` | text | no | **❌ unused** | — | | `total_count` | number | no | **❌ unused** | — | ## `letterhead_settings` (`base`) | field | type | required | refs | used where | |---|---|---|---|---| | `address` | text | no | ✅ 4 | src/lib/letterhead.ts
src/lib/pdf/render.test.ts
scripts/dev/debug-image-test.tsx
scripts/dev/generate-sample-pdf.ts | | `bank_branch_code` | text | no | ✅ 4 | src/lib/letterhead.ts
src/lib/pdf/render.test.ts
scripts/dev/debug-image-test.tsx
scripts/dev/generate-sample-pdf.ts | | `bank_name` | text | no | ✅ 4 | src/lib/letterhead.ts
src/lib/pdf/render.test.ts
scripts/dev/debug-image-test.tsx
scripts/dev/generate-sample-pdf.ts | | `default_markup_percent` | number | no | ✅ 4 | src/lib/letterhead.ts
src/lib/pdf/render.test.ts
scripts/dev/debug-image-test.tsx
scripts/dev/generate-sample-pdf.ts | | `footer_text` | text | no | ✅ 4 | src/lib/letterhead.ts
src/lib/pdf/render.test.ts
scripts/dev/debug-image-test.tsx
scripts/dev/generate-sample-pdf.ts | | `is_active` | bool | no | ✅ 4 | src/lib/letterhead.ts
src/lib/pdf/render.test.ts
scripts/dev/debug-image-test.tsx
scripts/dev/generate-sample-pdf.ts | | `phone` | text | no | ✅ 4 | src/lib/letterhead.ts
src/lib/pdf/render.test.ts
scripts/dev/debug-image-test.tsx
scripts/dev/generate-sample-pdf.ts | | `bank_account_number` | text | no | ✅ 5 | src/lib/letterhead.ts
src/lib/pdf/render.test.ts
scripts/dev/debug-image-test.tsx
scripts/dev/generate-sample-pdf.ts | | `registration_number` | text | no | ✅ 5 | src/lib/letterhead.ts
src/lib/pdf/render.test.ts
scripts/dev/debug-image-test.tsx
scripts/dev/generate-sample-pdf.ts | | `vat_number` | text | no | ✅ 5 | src/lib/letterhead.ts
src/lib/pdf/render.test.ts
scripts/dev/debug-image-test.tsx
scripts/dev/generate-sample-pdf.ts | | `terms` | text | no | ✅ 7 | src/lib/letterhead.ts
src/lib/pdf/render.test.ts
scripts/dev/debug-image-test.tsx
scripts/dev/generate-sample-pdf.ts | | `accent_color` | text | no | ✅ 9 | src/lib/letterhead.ts
src/lib/pdf/render.test.ts
scripts/dev/debug-image-test.tsx
scripts/dev/generate-sample-pdf.ts | | `display_name` | text | no | ✅ 9 | src/lib/letterhead.ts
src/lib/pdf/render.test.ts
scripts/dev/debug-image-test.tsx
scripts/dev/generate-sample-pdf.ts | | `company` | text | no | ✅ 14 | src/lib/letterhead.ts
src/lib/pdf/render.test.ts
scripts/dev/debug-image-test.tsx
scripts/dev/generate-sample-pdf.ts | | `logo` | file | no | ✅ 16 | src/lib/letterhead.ts
src/lib/pdf/render.test.ts
scripts/dev/debug-image-test.tsx
scripts/dev/generate-sample-pdf.ts | ## `masterdrilling_consignment` (`base`) ⚰️ **DEAD COLLECTION** | field | type | required | refs | used where | |---|---|---|---|---| | `category` | select | no | **❌ unused** | — | | `cost_price` | text | no | **❌ unused** | — | | `description` | text | no | **❌ unused** | — | | `markup` | text | no | **❌ unused** | — | | `product_code` | number | no | **❌ unused** | — | | `product_code_descrip` | text | no | **❌ unused** | — | | `selling_price` | text | no | **❌ unused** | — | | `supplier` | relation | no | **❌ unused** | — | ## `order_counters` (`base`) | field | type | required | refs | used where | |---|---|---|---|---| | `last_seq` | number | no | ✅ 13 | src/lib/server/orders-service.ts
src/lib/server/orders-service.test.ts
scripts/migrations/2026-07-10-restore-counters.ts | | `year` | number | yes | ✅ 61 | src/lib/server/orders-service.ts
src/lib/server/orders-service.test.ts
scripts/migrations/2026-07-10-restore-counters.ts | | `month` | number | yes | ✅ 77 | src/lib/server/orders-service.ts
src/lib/server/orders-service.test.ts
scripts/migrations/2026-07-10-restore-counters.ts | ## `order_items` (`base`) | field | type | required | refs | used where | |---|---|---|---|---| | `delivered_at` | date | no | **❌ unused** | — | | `delivery_status` | select | no | **❌ unused** | — | | `drv_assigned_at` | date | no | **❌ unused** | — | | `invoice_status` | select | no | **❌ unused** | — | | `qb_invoice_pdf_` | text | no | **❌ unused** | — | | `qty_assigned` | number | no | **❌ unused** | — | | `qty_delivered` | number | no | **❌ unused** | — | | `qty_processed` | number | no | **❌ unused** | — | | `legacy_order_item_id` | text | no | ⚠️ 1 ref | scripts/migrations/2026-07-20-delivery-tracking.ts | | `markup_percent` | number | no | ✅ 3 | src/lib/pb-helpers.ts
src/lib/server/orders-service.ts
src/lib/server/orders-service.test.ts | | `driver_status` | select | no | ✅ 4 | src/app/api/v1/order-items/[id]/status/route.test.ts
src/app/api/mcp/route.test.ts
src/lib/pb-helpers.ts | | `drv_collected_at` | date | no | ✅ 4 | src/app/(app)/collection-confirm/page.tsx
scripts/migrations/2026-07-07-order-items-collection-photo.ts | | `qb_invoice_pdf` | file | no | ✅ 9 | src/app/(app)/invoicing/page.tsx
src/app/api/invoicing/print-bundle/route.ts | | `order_item_attachements` | file | no | ✅ 16 | src/app/(app)/collection-confirm/page.tsx
src/app/api/invoicing/delivery-note-print/route.ts
src/app/api/invoicing/delivery-note/route.ts
src/app/api/invoicing/delivery-note-pdf/route.ts | | `markup` | number | no | ✅ 19 | src/lib/pb-helpers.ts
src/lib/server/orders-service.ts
src/lib/server/order-completion.test.ts
src/lib/server/orders-service.test.ts
scripts/setup-pocketbase.ts | | `problem_notes` | text | no | ✅ 19 | src/app/(app)/collection-confirm/page.tsx
src/app/api/v1/driver/stops/route.test.ts
src/app/api/v1/driver/stops/[id]/status/route.test.ts
src/lib/server/driver-stops.ts | | `quote_item` | relation | no | ✅ 19 | src/app/(app)/orders/[id]/process/page.tsx
src/lib/pb-helpers.ts
src/lib/server/orders-service.ts
src/lib/server/delivery-notes-service.ts
src/lib/server/orders-service.test.ts
... +1 more | | `matched_price_list_id` | text | no | ✅ 21 | src/app/(app)/orders/[id]/process/page.tsx
scripts/migrations/2026-07-06-order-items-pricing-fields.ts | | `pricing_notes` | text | no | ✅ 23 | src/app/(app)/orders/[id]/process/page.tsx
src/app/api/mcp/route.test.ts
scripts/migrations/2026-07-06-order-items-pricing-fields.ts | | `drv_status` | select | no | ✅ 25 | src/app/(app)/collection-pool/page.tsx
src/app/(app)/collection-map/page.tsx
src/app/(app)/orders/[id]/page.tsx
src/app/api/v1/order-items/[id]/status/route.test.ts
src/app/api/mcp/route.test.ts
... +5 more | | `order_item_details` | json | no | ✅ 28 | src/app/(app)/collection-confirm/page.tsx
src/app/(app)/invoicing/page.tsx
src/app/api/invoicing/delivery-note-print/route.ts
src/app/api/invoicing/delivery-note-print-tracking/route.ts
src/app/api/invoicing/delivery-note/route.ts
... +2 more | | `problem_flag` | bool | no | ✅ 28 | src/app/(app)/collection-confirm/page.tsx
src/app/api/v1/driver/stops/route.test.ts
src/app/api/v1/driver/stops/[id]/status/route.test.ts
src/lib/pb-helpers.ts
src/lib/server/driver-stops.ts | | `problem_type` | select | no | ✅ 28 | src/app/(app)/collection-confirm/page.tsx
src/app/api/v1/driver/stops/route.test.ts
src/app/api/v1/driver/stops/[id]/status/route.test.ts
src/lib/pb-helpers.ts
src/lib/server/driver-stops.ts | | `stock_booked_from` | relation | no | ✅ 31 | src/app/(app)/collection-confirm/page.tsx
src/app/(app)/orders/[id]/process/page.tsx
src/app/api/v1/stock/fulfill/route.test.ts
src/app/api/v1/stock/fulfill/route.ts
src/app/api/v1/stock/surplus-book/route.test.ts
... +2 more | | `pricing_source` | text | no | ✅ 33 | src/app/(app)/orders/[id]/process/page.tsx
src/lib/server/delivery-notes-service.ts
src/lib/server/delivery-notes-service.test.ts
scripts/migrations/2026-07-06-order-items-pricing-fields.ts | | `ready_for_collection` | bool | no | ✅ 41 | src/app/(app)/collection-pool/page.test.tsx
src/app/(app)/collection-pool/page.tsx
src/app/(app)/collection-map/page.tsx
src/app/api/v1/driver/stops/route.test.ts
src/lib/server/purchase-orders-service.ts
... +3 more | | `po_description` | text | no | ✅ 46 | src/app/(app)/collection-confirm/page.tsx
src/app/(app)/orders/page.tsx
src/app/(app)/orders/new/page.tsx
src/app/(app)/orders/[id]/page.tsx
src/app/(app)/orders/[id]/process/page.tsx
... +9 more | | `assigned_at` | date | no | ✅ 63 | src/app/(app)/collection-confirm/page.tsx
src/app/(app)/collection-pool/page.test.tsx
src/app/(app)/collection-pool/page.tsx
src/app/(app)/collection-map/page.tsx
src/app/(app)/orders/[id]/process/page.tsx
... +6 more | | `delivery_note_number` | text | no | ✅ 70 | src/app/(app)/invoicing/page.tsx
src/app/api/invoicing/delivery-note-print/route.ts
src/app/api/invoicing/delivery-note-print-tracking/route.ts
src/app/api/invoicing/delivery-note/route.ts
src/app/api/invoicing/delivery-note-pdf/route.ts
... +5 more | | `surplus_qty` | number | no | ✅ 70 | src/app/(app)/collection-confirm/page.tsx
src/app/api/v1/stock/surplus-book/route.test.ts
src/app/api/v1/stock/surplus-book/route.ts
src/lib/server/stock-surplus.test.ts
src/lib/server/stock-surplus.ts
... +1 more | | `purchase_order` | relation | no | ✅ 71 | src/app/(app)/collection-confirm/page.tsx
src/app/(app)/collection-pool/page.test.tsx
src/app/(app)/collection-pool/page.tsx
src/app/(app)/collection-map/page.tsx
src/app/(app)/orders/[id]/page.tsx
... +16 more | | `drv_id` | relation | no | ✅ 72 | src/app/(app)/collection-pool/page.test.tsx
src/app/(app)/collection-pool/page.tsx
src/app/(app)/collection-map/page.tsx
src/app/(app)/orders/[id]/process/page.tsx
src/app/api/v1/driver/stops/route.test.ts
... +9 more | | `qty_collected` | number | no | ✅ 76 | src/app/(app)/collection-confirm/page.tsx
src/app/(app)/invoicing/page.tsx
src/app/api/v1/driver/stops/route.test.ts
src/app/api/v1/driver/stops/[id]/status/route.test.ts
src/app/api/v1/stock/surplus-book/route.test.ts
... +7 more | | `order_qty` | number | no | ✅ 87 | src/app/(app)/collection-confirm/page.tsx
src/app/(app)/collection-pool/page.tsx
src/app/(app)/orders/[id]/process/page.tsx
src/app/(app)/invoicing/page.tsx
src/app/api/v1/driver/stops/route.test.ts
... +17 more | | `sku` | text | no | ✅ 87 | src/app/(app)/collection-confirm/page.tsx
src/app/(app)/collection-pool/page.tsx
src/app/(app)/collection-map/page.tsx
src/app/(app)/orders/new/page.tsx
src/app/(app)/orders/[id]/process/page.tsx
... +11 more | | `driver` | relation | no | ✅ 105 | src/app/(app)/collection-confirm/page.tsx
src/app/(app)/collection-pool/page.test.tsx
src/app/(app)/collection-pool/page.tsx
src/app/(app)/collection-map/page.tsx
src/app/(app)/orders/[id]/process/page.tsx
... +11 more | | `cost_price` | number | no | ✅ 109 | src/app/(app)/collection-confirm/page.tsx
src/app/(app)/orders/page.tsx
src/app/(app)/orders/new/page.tsx
src/app/(app)/orders/[id]/page.tsx
src/app/(app)/orders/[id]/process/page.tsx
... +14 more | | `selling_price` | number | no | ✅ 132 | src/app/(app)/orders/page.tsx
src/app/(app)/orders/new/page.tsx
src/app/(app)/orders/[id]/page.tsx
src/app/(app)/orders/[id]/process/page.tsx
src/app/(app)/invoicing/page.tsx
... +12 more | | `quantity` | number | no | ✅ 215 | src/app/(app)/collection-confirm/page.tsx
src/app/(app)/collection-pool/page.tsx
src/app/(app)/collection-map/page.tsx
src/app/(app)/orders/page.tsx
src/app/(app)/orders/new/page.tsx
... +24 more | | `item_status` | select | yes | ✅ 227 | src/app/(app)/collection-confirm/page.tsx
src/app/(app)/collection-pool/page.test.tsx
src/app/(app)/collection-pool/page.tsx
src/app/(app)/collection-map/page.tsx
src/app/(app)/orders/page.tsx
... +38 more | | `notes` | text | no | ✅ 232 | src/app/(app)/collection-confirm/page.tsx
src/app/(app)/collection-pool/page.test.tsx
src/app/(app)/orders/new/page.tsx
src/app/(app)/orders/[id]/page.tsx
src/app/(app)/orders/[id]/process/page.tsx
... +21 more | | `description` | text | yes | ✅ 296 | src/app/(app)/collection-confirm/page.tsx
src/app/(app)/collection-pool/page.test.tsx
src/app/(app)/collection-pool/page.tsx
src/app/(app)/collection-map/page.tsx
src/app/(app)/orders/page.tsx
... +26 more | | `supplier` | relation | no | ✅ 467 | src/app/(app)/collection-confirm/page.tsx
src/app/(app)/collection-pool/page.test.tsx
src/app/(app)/collection-pool/page.tsx
src/app/(app)/collection-map/page.tsx
src/app/(app)/orders/new/page.tsx
... +33 more | | `order` | relation | no | ✅ 628 | src/app/(app)/collection-confirm/page.tsx
src/app/(app)/collection-pool/page.test.tsx
src/app/(app)/collection-pool/page.tsx
src/app/(app)/collection-map/page.tsx
src/app/(app)/orders/page.tsx
... +40 more | ## `orders` (`base`) | field | type | required | refs | used where | |---|---|---|---|---| | `order_attachements` | file | no | **❌ unused** | — | | `quote_match_confidence` | number | no | ✅ 3 | src/lib/pb-helpers.ts
src/lib/server/orders-service.ts
scripts/setup-pocketbase.ts | | `is_repair_order` | bool | no | ✅ 4 | src/lib/pb-helpers.ts
src/lib/server/orders-service.ts
src/lib/server/orders-service.test.ts
scripts/setup-pocketbase.ts | | `potential_quote_confidence` | number | no | ✅ 12 | src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/orders/[id]/page.tsx
src/lib/pb-helpers.ts
src/lib/server/orders-service.ts
scripts/setup-pocketbase.ts
... +1 more | | `quote_match_method` | text | no | ✅ 12 | src/app/(app)/orders/[id]/page.tsx
src/lib/pb-helpers.ts
scripts/migrations/2026-06-27-add-order-quote-match-fields.ts | | `quote_matching_attempted` | bool | no | ✅ 12 | src/app/(app)/orders/new/page.tsx
src/app/(app)/orders/[id]/page.tsx
src/lib/pb-helpers.ts
src/lib/server/orders-service.ts
src/lib/server/orders-service.test.ts
... +1 more | | `invoiced` | bool | no | ✅ 22 | src/app/(app)/customers/[id]/page.tsx
src/app/(app)/orders/new/page.tsx
src/app/(app)/orders/[id]/page.tsx
src/lib/pb-helpers.ts
src/lib/server/orders-service.ts
... +4 more | | `quote_reference_text` | text | no | ✅ 22 | src/app/(app)/orders/new/page.tsx
src/app/(app)/orders/[id]/page.tsx
src/lib/pb-helpers.ts
scripts/migrations/2026-06-27-add-order-quote-match-fields.ts
scripts/dev/seed-and-test-matcher.ts | | `potential_quote` | relation | no | ✅ 30 | src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/orders/page.tsx
src/app/(app)/orders/[id]/page.tsx
src/app/api/v1/orders/[id]/matched-attachments/route.ts
src/lib/pb-helpers.ts
... +3 more | | `order_number` | text | yes | ✅ 79 | src/app/(app)/customers/[id]/page.tsx
src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/orders/page.tsx
src/app/(app)/orders/new/page.tsx
src/app/(app)/orders/[id]/page.tsx
... +9 more | | `notes` | text | no | ✅ 111 | src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/orders/new/page.tsx
src/app/(app)/orders/[id]/page.tsx
src/app/api/v1/orders/[id]/matched-attachments/route.ts
src/app/api/mcp/route.ts
... +7 more | | `company` | relation | yes | ✅ 244 | src/app/(app)/customers/[id]/page.tsx
src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/orders/page.tsx
src/app/(app)/orders/new/page.tsx
src/app/(app)/orders/[id]/page.tsx
... +11 more | | `customer` | relation | no | ✅ 327 | src/app/(app)/customers/[id]/page.tsx
src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/dashboard/page.tsx
src/app/(app)/orders/page.tsx
src/app/(app)/orders/new/page.tsx
... +12 more | | `quote` | relation | no | ✅ 510 | src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/dashboard/page.tsx
src/app/(app)/orders/page.tsx
src/app/(app)/orders/new/page.tsx
src/app/(app)/orders/[id]/page.tsx
... +13 more | ## `pos` (`base`) ⚰️ **DEAD COLLECTION** | field | type | required | refs | used where | |---|---|---|---|---| | `brand` | text | no | **❌ unused** | — | | `category` | text | no | **❌ unused** | — | | `cost_price` | number | no | **❌ unused** | — | | `description` | text | no | **❌ unused** | — | | `markup` | number | no | **❌ unused** | — | | `search_text` | text | no | **❌ unused** | — | | `selling_price` | number | no | **❌ unused** | — | | `sku` | text | no | **❌ unused** | — | | `sku_normalised` | text | no | **❌ unused** | — | | `source_file` | text | no | **❌ unused** | — | | `source_file_id` | relation | no | **❌ unused** | — | | `specifications` | json | no | **❌ unused** | — | | `stock_qty` | number | no | **❌ unused** | — | | `subcategory` | text | no | **❌ unused** | — | | `supplier` | text | no | **❌ unused** | — | | `unit` | text | no | **❌ unused** | — | ## `price_list` (`base`) | field | type | required | refs | used where | |---|---|---|---|---| | `source_file_id` | relation | no | **❌ unused** | — | | `stock_qty` | number | no | **❌ unused** | — | | `source_file` | text | no | ✅ 16 | src/components/pricelist-catalogue.tsx
src/lib/pb-helpers.ts
scripts/migrations/2026-06-30-backfill-price-list-search-text.ts
scripts/migrations/2026-06-30-add-price-list-source-file.ts | | `markup` | number | no | ✅ 21 | src/components/pricelist-catalogue.tsx
src/lib/pb-helpers.ts
scripts/dev/seed-test-grinders.ts | | `specifications` | json | no | ✅ 21 | src/lib/pb-helpers.ts
src/lib/server/price-list-match.ts
scripts/migrations/2026-06-30-backfill-price-list-search-text.ts
scripts/migrations/2026-06-30-add-price-list-search-text.ts
scripts/dev/seed-test-grinders.ts | | `subcategory` | text | no | ✅ 21 | src/components/pricelist-catalogue.tsx
src/lib/pb-helpers.ts
src/lib/server/price-list-match.ts
scripts/migrations/2026-06-30-add-price-list-search-text.ts
scripts/utils/resolve-price-list-ids.ts
... +1 more | | `sku_normalised` | text | no | ✅ 26 | src/lib/pb-helpers.ts
src/lib/server/price-list-match.ts
scripts/migrations/2026-06-30-add-price-list-sku-normalised.ts
scripts/utils/resolve-price-list-ids.ts
scripts/dev/seed-test-grinders.ts | | `cost_price` | number | no | ✅ 29 | src/components/pricelist-catalogue.tsx
src/lib/pb-helpers.ts
src/lib/server/price-list-match.ts
scripts/utils/resolve-price-list-ids.ts
scripts/dev/seed-test-grinders.ts | | `unit` | text | no | ✅ 31 | src/components/pricelist-catalogue.tsx
src/lib/pb-helpers.ts
src/lib/server/price-list-match.ts
scripts/utils/resolve-price-list-ids.ts
scripts/dev/seed-test-grinders.ts | | `selling_price` | number | no | ✅ 33 | src/components/pricelist-catalogue.tsx
src/lib/pb-helpers.ts
src/lib/server/price-list-match.ts
scripts/utils/resolve-price-list-ids.ts
scripts/dev/seed-test-grinders.ts | | `search_text` | text | no | ✅ 39 | src/lib/pb-helpers.ts
src/lib/server/price-list-match.ts
scripts/migrations/2026-06-30-backfill-price-list-search-text.ts
scripts/migrations/2026-06-30-add-price-list-search-text.ts
scripts/dev/seed-test-grinders.ts | | `category` | text | no | ✅ 59 | src/components/pricelist-catalogue.tsx
src/lib/pb-helpers.ts
src/lib/server/price-list-match.ts
scripts/migrations/2026-07-02-add-sprint-categories-and-claims.ts
scripts/migrations/2026-06-30-add-price-list-search-text.ts
... +2 more | | `sku` | text | no | ✅ 64 | src/components/pricelist-catalogue.tsx
src/lib/pb-helpers.ts
src/lib/server/price-list-match.ts
scripts/migrations/2026-06-30-add-price-list-sku-normalised.ts
scripts/migrations/2026-06-30-add-price-list-search-text.ts
... +2 more | | `description` | text | no | ✅ 65 | src/components/pricelist-catalogue.tsx
src/lib/pb-helpers.ts
src/lib/server/price-list-match.ts
scripts/migrations/2026-07-02-add-sprint-categories-and-claims.ts
scripts/migrations/2026-06-30-add-price-list-search-text.ts
... +2 more | | `brand` | text | no | ✅ 67 | src/components/pricelist-catalogue.tsx
src/lib/pb-helpers.ts
src/lib/server/price-list-match.ts
scripts/migrations/2026-07-02-add-sprint-categories-and-claims.ts
scripts/migrations/2026-06-30-add-price-list-search-text.ts
... +2 more | | `supplier` | text | no | ✅ 77 | src/components/pricelist-catalogue.tsx
src/lib/pb-helpers.ts
src/lib/server/price-list-match.ts
scripts/migrations/2026-06-30-backfill-price-list-search-text.ts
scripts/migrations/2026-07-02-add-sprint-categories-and-claims.ts
... +3 more | ## `purchase_orders` (`base`) | field | type | required | refs | used where | |---|---|---|---|---| | `last_reply_at` | date | no | ✅ 5 | scripts/setup-pocketbase.ts
scripts/migrations/2026-07-06-purchase-orders-send-fields.ts | | `email_message_id` | text | no | ✅ 7 | src/lib/server/purchase-orders-service.ts
scripts/migrations/2026-07-06-purchase-orders-send-fields.ts | | `total_amount` | number | no | ✅ 8 | src/app/(app)/orders/[id]/page.tsx
src/app/(app)/orders/[id]/process/page.tsx
src/app/api/v1/purchase-orders/[id]/pdf/route.ts
scripts/setup-pocketbase.ts
scripts/migrations/2026-06-28-add-purchase-order-pdfs.ts | | `email_error` | text | no | ✅ 14 | src/app/(app)/orders/[id]/page.tsx
src/app/api/v1/purchase-orders/[id]/send-email/route.ts
src/lib/server/purchase-orders-service.ts
scripts/migrations/2026-07-06-purchase-orders-send-fields.ts | | `email_payload` | json | no | ✅ 24 | src/app/(app)/orders/[id]/page.tsx
src/app/api/v1/purchase-orders/[id]/send-email/route.ts
src/lib/server/purchase-orders-service.ts
scripts/migrations/2026-07-06-purchase-orders-send-fields.ts | | `order_item` | relation | no | ✅ 24 | src/app/(app)/orders/[id]/process/page.tsx
src/lib/pb-helpers.ts
src/lib/server/purchase-orders-service.ts
scripts/backfill-po-items.mjs | | `po_number` | text | yes | ✅ 27 | src/app/(app)/orders/[id]/page.tsx
src/app/(app)/orders/[id]/process/page.tsx
src/app/api/v1/purchase-orders/[id]/pdf/route.ts
src/app/api/v1/purchase-orders/[id]/send-email/route.ts
src/lib/pb-helpers.ts
... +3 more | | `documents_history` | json | no | ✅ 41 | src/app/(app)/orders/[id]/page.tsx
src/app/api/v1/purchase-orders/[id]/pdf/route.ts
src/app/api/v1/purchase-orders/[id]/send-email/route.ts
scripts/migrations/2026-07-06-purchase-orders-documents-field.ts
scripts/migrations/2026-07-09-po-additional-attachments.ts
... +1 more | | `documents` | file | no | ✅ 75 | src/app/(app)/orders/[id]/page.tsx
src/app/api/v1/purchase-orders/[id]/pdf/route.ts
src/app/api/v1/purchase-orders/[id]/send-email/route.ts
src/app/api/v1/purchase-orders/[id]/attachments/upload/route.ts
src/app/api/v1/files/[collection]/[recordId]/[filename]/route.ts
... +3 more | | `order` | relation | yes | ✅ 211 | src/app/(app)/orders/[id]/page.tsx
src/app/(app)/orders/[id]/process/page.tsx
src/app/api/v1/purchase-orders/[id]/pdf/route.ts
src/app/api/v1/purchase-orders/[id]/send-email/outcome/route.ts
src/app/api/mcp/route.ts
... +4 more | | `supplier` | relation | yes | ✅ 230 | src/app/(app)/orders/[id]/page.tsx
src/app/(app)/orders/[id]/process/page.tsx
src/app/api/v1/purchase-orders/[id]/pdf/route.ts
src/app/api/v1/purchase-orders/[id]/send-email/route.ts
src/app/api/v1/purchase-orders/[id]/attachments/upload/route.ts
... +7 more | | `status` | select | no | ✅ 234 | src/app/(app)/orders/[id]/page.tsx
src/app/(app)/orders/[id]/process/page.tsx
src/app/api/v1/purchase-orders/[id]/pdf/route.ts
src/app/api/v1/purchase-orders/[id]/send-email/route.ts
src/app/api/v1/purchase-orders/[id]/send-email/outcome/route.ts
... +11 more | ## `quote_attachments` (`base`) | field | type | required | refs | used where | |---|---|---|---|---| | `uploaded_at` | autodate | no | ✅ 22 | src/app/(app)/quotes/[id]/page.tsx
src/app/api/v1/quotes/[id]/attachments/route.ts
src/app/api/v1/orders/[id]/matched-attachments/route.ts
src/components/delivery-notes/preview-dialog.tsx
src/lib/pb-helpers.ts
... +2 more | | `size_bytes` | number | no | ✅ 25 | src/app/(app)/quotes/[id]/page.tsx
src/app/api/v1/quotes/[id]/pdf/route.ts
src/app/api/v1/quotes/[id]/attachments/route.ts
src/app/api/v1/quotes/[id]/attachments/upload/route.ts
src/app/api/v1/orders/[id]/matched-attachments/route.ts
... +3 more | | `quote_item` | relation | no | ✅ 26 | src/app/api/v1/orders/[id]/matched-attachments/route.ts
src/lib/pb-helpers.ts
src/lib/server/delivery-notes-service.ts
scripts/migrations/2026-07-06-quote-attachments-quote-item-and-kind.ts | | `content_type` | text | no | ✅ 29 | src/app/(app)/quotes/[id]/page.tsx
src/app/api/v1/quotes/[id]/pdf/route.ts
src/app/api/v1/quotes/[id]/attachments/route.ts
src/app/api/v1/quotes/[id]/attachments/upload/route.ts
src/app/api/v1/orders/[id]/matched-attachments/route.ts
... +3 more | | `email_message_id` | text | no | ✅ 31 | src/app/(app)/quotes/[id]/page.tsx
src/app/api/v1/quotes/[id]/pdf/route.ts
src/app/api/v1/quotes/[id]/attachments/upload/route.ts
src/lib/server/quotes-service.ts
src/lib/server/quotes-service.test.ts
... +2 more | | `direction` | select | no | ✅ 55 | src/app/(app)/quotes/[id]/page.tsx
src/app/api/v1/quotes/[id]/attachments/route.ts
src/app/api/v1/quotes/[id]/attachments/upload/route.ts
src/app/api/v1/orders/[id]/matched-attachments/route.ts
src/lib/pb-helpers.ts
... +3 more | | `filename` | text | yes | ✅ 81 | src/app/(app)/quotes/[id]/page.tsx
src/app/api/v1/quotes/[id]/pdf/route.ts
src/app/api/v1/quotes/[id]/attachments/route.ts
src/app/api/v1/quotes/[id]/attachments/upload/route.ts
src/app/api/v1/files/[collection]/[recordId]/[filename]/route.ts
... +6 more | | `kind` | select | no | ✅ 95 | src/app/(app)/quotes/[id]/page.tsx
src/app/api/v1/quotes/[id]/pdf/route.ts
src/app/api/v1/quotes/[id]/attachments/upload/route.ts
src/app/api/v1/orders/[id]/matched-attachments/route.ts
src/components/delivery-notes/preview-dialog.tsx
... +6 more | | `file` | file | yes | ✅ 110 | src/app/(app)/quotes/[id]/page.tsx
src/app/api/v1/quotes/[id]/pdf/route.ts
src/app/api/v1/quotes/[id]/attachments/route.ts
src/app/api/v1/quotes/[id]/attachments/upload/route.ts
src/app/api/v1/files/[collection]/[recordId]/[filename]/route.ts
... +8 more | | `quote` | relation | no | ✅ 675 | src/app/(app)/quotes/[id]/page.tsx
src/app/api/v1/quotes/[id]/pdf/route.ts
src/app/api/v1/quotes/[id]/attachments/route.ts
src/app/api/v1/quotes/[id]/attachments/upload/route.ts
src/app/api/v1/orders/[id]/matched-attachments/route.ts
... +10 more | ## `quote_counters` (`base`) | field | type | required | refs | used where | |---|---|---|---|---| | `last_seq` | number | no | ✅ 11 | src/lib/server/quotes-service.ts
scripts/migrations/2026-07-10-restore-counters.ts | | `year` | number | yes | ✅ 46 | src/lib/server/quotes-service.ts
src/lib/server/quotes-service.test.ts
scripts/migrations/create-quote-attachments-and-replies.ts
scripts/migrations/2026-07-10-restore-counters.ts | | `month` | number | yes | ✅ 51 | src/lib/server/quotes-service.ts
src/lib/server/quotes-service.test.ts
scripts/migrations/create-quote-attachments-and-replies.ts
scripts/migrations/2026-07-10-restore-counters.ts | ## `quote_item_attachments` (`base`) | field | type | required | refs | used where | |---|---|---|---|---| | `uploaded_at` | autodate | no | ✅ 4 | src/app/api/v1/sprint/items/[id]/attachments/route.ts | | `content_type` | text | no | ✅ 9 | src/app/api/v1/quotes/items/[id]/attachments/upload/route.ts
src/app/api/v1/sprint/items/[id]/attachments/route.ts
src/app/api/v1/sprint/items/[id]/attachments/upload/route.ts | | `size_bytes` | number | no | ✅ 9 | src/app/api/v1/quotes/items/[id]/attachments/upload/route.ts
src/app/api/v1/sprint/items/[id]/attachments/route.ts
src/app/api/v1/sprint/items/[id]/attachments/upload/route.ts | | `notes` | text | no | ✅ 10 | src/app/api/v1/quotes/items/[id]/attachments/upload/route.ts
src/app/api/v1/sprint/items/[id]/attachments/route.ts
src/app/api/v1/sprint/items/[id]/attachments/upload/route.ts | | `quote_item` | relation | yes | ✅ 10 | src/app/api/v1/quotes/items/[id]/attachments/upload/route.ts
src/app/api/v1/sprint/attachment-counts/route.ts
src/app/api/v1/sprint/items/[id]/attachments/route.ts
src/app/api/v1/sprint/items/[id]/attachments/upload/route.ts | | `filename` | text | yes | ✅ 17 | src/app/api/v1/quotes/items/[id]/attachments/upload/route.ts
src/app/api/v1/files/[collection]/[recordId]/[filename]/route.ts
src/app/api/v1/sprint/items/[id]/attachments/route.ts
src/app/api/v1/sprint/items/[id]/attachments/upload/route.ts | | `source` | select | yes | ✅ 23 | src/app/api/v1/quotes/items/[id]/attachments/upload/route.ts
src/app/api/v1/files/[collection]/[recordId]/[filename]/route.ts
src/app/api/v1/sprint/items/[id]/attachments/route.ts
src/app/api/v1/sprint/items/[id]/attachments/upload/route.ts | | `file` | file | yes | ✅ 37 | src/app/api/v1/quotes/items/[id]/attachments/upload/route.ts
src/app/api/v1/files/[collection]/[recordId]/[filename]/route.ts
src/app/api/v1/sprint/items/[id]/attachments/route.ts
src/app/api/v1/sprint/items/[id]/attachments/upload/route.ts | ## `quote_items` (`base`) | field | type | required | refs | used where | |---|---|---|---|---| | `supplier_reply_count` | number | no | ✅ 3 | scripts/migrations/2026-07-02-add-sprint-categories-and-claims.ts | | `outbound_sent_at` | date | no | ✅ 4 | src/app/(app)/sprint/page.tsx
scripts/migrations/2026-07-02-add-sprint-categories-and-claims.ts | | `supplier_replied_at` | date | no | ✅ 4 | src/app/(app)/sprint/page.tsx
scripts/migrations/2026-07-02-add-sprint-categories-and-claims.ts | | `outbound_message_id` | text | no | ✅ 5 | src/app/(app)/sprint/page.tsx
scripts/migrations/2026-07-02-add-sprint-categories-and-claims.ts | | `quote_pdf_id` | text | no | ✅ 5 | src/lib/pdf/render.test.ts
scripts/setup-pocketbase.ts
scripts/dev/debug-logo.ts
scripts/dev/generate-sample-pdf.ts | | `quote_description` | text | no | ✅ 7 | src/app/(app)/sprint/page.tsx
src/components/sprint-item-pricing-modal.tsx | | `claimed_at` | date | no | ✅ 15 | src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/sprint/page.tsx
src/app/api/v1/sprint/items/[id]/claim/route.ts
src/components/sprint-item-pricing-modal.tsx
scripts/migrations/2026-07-02-add-sprint-categories-and-claims.ts | | `claim_expires_at` | date | no | ✅ 22 | src/app/(app)/sprint/page.tsx
src/app/api/v1/sprint/items/[id]/claim/route.ts
src/components/sprint-item-pricing-modal.tsx
scripts/migrations/2026-07-02-add-sprint-categories-and-claims.ts | | `quote_reference` | text | no | ✅ 23 | src/app/(app)/quotes/[id]/process/page.tsx
src/app/api/v1/quotes/[id]/create-from-template/route.ts
src/app/api/v1/quotes/[id]/save-as-template/route.ts
src/app/api/v1/quotes/[id]/clone/route.ts
src/lib/pb-helpers.ts
... +5 more | | `matched_price_list_id` | text | no | ✅ 28 | src/app/(app)/quotes/[id]/process/page.tsx
src/app/api/v1/quotes/[id]/re-price/route.ts
src/app/api/v1/quotes/[id]/items/[itemId]/lookup/route.ts
src/app/api/mcp/route.ts
src/lib/pdf/render.test.ts
... +3 more | | `claim_status` | select | no | ✅ 32 | src/app/(app)/sprint/page.tsx
src/app/api/v1/sprint/items/[id]/claim/route.ts
src/components/sprint-item-pricing-modal.tsx
scripts/migrations/2026-07-02-add-sprint-categories-and-claims.ts | | `claimed_by` | text | no | ✅ 40 | src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/sprint/page.tsx
src/app/api/v1/sprint/items/[id]/claim/route.ts
src/components/sprint-item-pricing-modal.tsx
src/lib/pdf/render.test.ts
... +4 more | | `pricing_notes` | text | no | ✅ 40 | src/app/(app)/quotes/[id]/process/page.tsx
src/app/api/v1/quotes/[id]/re-price/route.ts
src/app/api/v1/quotes/[id]/items/[itemId]/lookup/route.ts
src/app/api/mcp/route.ts
src/lib/pdf/render.test.ts
... +2 more | | `user_edited` | bool | no | ✅ 42 | src/app/(app)/quotes/[id]/process/page.tsx
src/app/(app)/sprint/page.tsx
src/app/api/v1/quotes/items/rewrite/route.ts
src/app/api/mcp/route.ts
src/components/rewrite-quote-modal.tsx
... +8 more | | `is_processed` | bool | no | ✅ 43 | src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/quotes/[id]/process/page.tsx
src/app/(app)/sprint/page.tsx
src/app/api/v1/quotes/[id]/save-as-template/route.ts
src/app/api/v1/quotes/[id]/pdf/route.ts
... +9 more | | `pricing_source` | text | no | ✅ 50 | src/app/(app)/quotes/[id]/process/page.tsx
src/app/(app)/sprint/page.tsx
src/app/api/v1/quotes/[id]/re-price/route.ts
src/app/api/v1/quotes/[id]/items/[itemId]/lookup/route.ts
src/app/api/mcp/route.ts
... +7 more | | `category` | relation | no | ✅ 51 | src/app/(app)/quotes/[id]/process/page.tsx
src/app/(app)/sprint/page.tsx
src/app/api/v1/quotes/[id]/items/[itemId]/lookup/route.ts
src/lib/pb-helpers.ts
scripts/migrations/2026-07-02-add-sprint-categories-and-claims.ts
... +1 more | | `quantity` | number | no | ✅ 92 | src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/quotes/[id]/process/page.tsx
src/app/(app)/sprint/page.tsx
src/app/api/v1/quotes/[id]/create-from-template/route.ts
src/app/api/v1/quotes/[id]/save-as-template/route.ts
... +17 more | | `quote_number` | text | no | ✅ 107 | src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/quotes/[id]/process/page.tsx
src/app/(app)/sprint/page.tsx
src/app/api/v1/quotes/[id]/create-from-template/route.ts
src/app/api/v1/quotes/[id]/save-as-template/route.ts
... +15 more | | `markup` | number | no | ✅ 118 | src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/quotes/[id]/process/page.tsx
src/app/(app)/sprint/page.tsx
src/app/api/v1/quotes/[id]/create-from-template/route.ts
src/app/api/v1/quotes/[id]/save-as-template/route.ts
... +14 more | | `sku` | text | no | ✅ 118 | src/app/(app)/quotes/[id]/process/page.tsx
src/app/(app)/sprint/page.tsx
src/app/api/v1/quotes/[id]/re-price/route.ts
src/app/api/v1/quotes/[id]/items/[itemId]/lookup/route.ts
src/app/api/mcp/route.ts
... +7 more | | `notes` | text | no | ✅ 151 | src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/quotes/[id]/process/page.tsx
src/app/(app)/sprint/page.tsx
src/app/api/v1/quotes/items/rewrite/route.ts
src/app/api/v1/quotes/[id]/create-from-template/route.ts
... +21 more | | `cost_price` | number | no | ✅ 170 | src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/quotes/[id]/process/page.tsx
src/app/(app)/sprint/page.tsx
src/app/api/v1/quotes/[id]/create-from-template/route.ts
src/app/api/v1/quotes/[id]/save-as-template/route.ts
... +22 more | | `selling_price` | number | no | ✅ 178 | src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/quotes/[id]/process/page.tsx
src/app/(app)/sprint/page.tsx
src/app/api/v1/quotes/[id]/create-from-template/route.ts
src/app/api/v1/quotes/[id]/save-as-template/route.ts
... +22 more | | `supplier` | relation | no | ✅ 216 | src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/quotes/[id]/process/page.tsx
src/app/(app)/sprint/page.tsx
src/app/api/v1/quotes/[id]/create-from-template/route.ts
src/app/api/v1/quotes/[id]/save-as-template/route.ts
... +24 more | | `description` | text | no | ✅ 341 | src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/quotes/[id]/process/page.tsx
src/app/(app)/sprint/page.tsx
src/app/api/v1/quotes/items/rewrite/route.ts
src/app/api/v1/quotes/[id]/create-from-template/route.ts
... +29 more | | `quote` | relation | yes | ✅ 901 | src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/quotes/[id]/process/page.tsx
src/app/(app)/sprint/page.tsx
src/app/api/v1/quotes/items/rewrite/route.ts
src/app/api/v1/quotes/[id]/create-from-template/route.ts
... +28 more | ## `quote_replies` (`base`) | field | type | required | refs | used where | |---|---|---|---|---| | `quoted_text` | text | no | ✅ 5 | src/lib/server/quotes-service.ts
src/lib/server/quotes-service.test.ts | | `body_html` | text | no | ✅ 6 | src/lib/server/quotes-service.ts
src/lib/server/quotes-service.test.ts | | `from_name` | text | no | ✅ 9 | src/lib/server/quotes-service.ts
src/lib/server/quotes-service.test.ts | | `in_reply_to` | text | no | ✅ 12 | src/lib/server/quotes-service.ts
src/lib/server/quotes-service.test.ts | | `received_at` | date | yes | ✅ 15 | src/lib/server/quotes-service.ts
src/lib/server/quotes-service.test.ts | | `body_plain` | text | no | ✅ 19 | src/lib/server/quotes-service.ts
src/lib/server/quotes-service.test.ts | | `email_message_id` | text | no | ✅ 23 | src/lib/server/quotes-service.ts
src/lib/server/quotes-service.test.ts
scripts/migrations/create-quote-attachments-and-replies.ts | | `from_email` | email | yes | ✅ 37 | src/lib/server/quotes-service.ts
src/lib/server/quotes-service.test.ts | | `subject` | text | yes | ✅ 74 | src/lib/server/quotes-service.ts
src/lib/server/quotes-service.test.ts | | `quote` | relation | yes | ✅ 197 | src/lib/server/quotes-service.ts
src/lib/server/quotes-service.test.ts
scripts/migrations/create-quote-attachments-and-replies.ts | ## `quotes` (`base`) | field | type | required | refs | used where | |---|---|---|---|---| | `email_tracking_id` | text | no | ✅ 4 | src/lib/pdf/render.test.ts
scripts/setup-pocketbase.ts
scripts/dev/debug-logo.ts
scripts/dev/generate-sample-pdf.ts | | `email_opened_at` | date | no | ✅ 5 | src/app/(app)/quotes/[id]/page.tsx
src/lib/pdf/render.test.ts
scripts/setup-pocketbase.ts
scripts/dev/debug-logo.ts
scripts/dev/generate-sample-pdf.ts | | `email_bcc` | text | no | ✅ 6 | src/app/(app)/quotes/[id]/page.tsx
src/lib/pdf/render.test.ts
src/lib/server/quotes-service.ts
scripts/migrations/2026-06-23-add-quote-email-composition-fields.ts | | `email_message` | text | no | ✅ 6 | src/app/(app)/quotes/[id]/page.tsx
src/lib/pdf/render.test.ts
src/lib/server/quotes-service.ts
scripts/migrations/2026-06-23-add-quote-email-composition-fields.ts | | `attach_auth_letters` | bool | no | ✅ 7 | src/app/(app)/quotes/[id]/page.tsx
src/lib/pdf/render.test.ts
src/lib/server/quotes-service.ts
src/lib/server/quotes-service.test.ts
scripts/migrations/2026-06-23-add-quote-email-composition-fields.ts | | `email_body` | text | no | ✅ 7 | src/app/(app)/quotes/[id]/page.tsx
src/lib/pdf/render.test.ts
src/lib/server/quotes-service.ts
src/lib/server/quotes-service.test.ts
scripts/setup-pocketbase.ts
... +2 more | | `email_cc` | text | no | ✅ 7 | src/app/(app)/quotes/[id]/page.tsx
src/lib/pdf/render.test.ts
src/lib/server/quotes-service.ts
src/lib/server/quotes-service.test.ts
scripts/migrations/2026-06-23-add-quote-email-composition-fields.ts | | `email_delivered_at` | date | no | ✅ 7 | src/app/(app)/quotes/[id]/page.tsx
src/lib/pdf/render.test.ts
src/lib/server/quotes-service.ts
src/lib/server/quotes-service.test.ts
scripts/setup-pocketbase.ts
... +2 more | | `email_subject_outbound` | text | no | ✅ 7 | src/app/(app)/quotes/[id]/page.tsx
src/lib/pdf/render.test.ts
src/lib/server/quotes-service.ts
src/lib/server/quotes-service.test.ts
scripts/migrations/2026-06-23-add-quote-email-composition-fields.ts | | `has_new_reply` | bool | no | ✅ 7 | src/lib/pdf/render.test.ts
src/lib/server/quotes-service.ts
src/lib/server/quotes-service.test.ts
scripts/setup-pocketbase.ts
scripts/dev/debug-logo.ts
... +1 more | | `email_outbound_attachment_ids` | text | no | ✅ 8 | src/lib/pdf/render.test.ts
src/lib/server/quotes-service.ts
src/lib/server/quotes-service.test.ts
scripts/migrations/2026-06-23-add-quote-outbound-email-fields.ts | | `approved_by` | text | no | ✅ 9 | src/app/(app)/quotes/approvals/page.tsx
src/app/(app)/quotes/[id]/page.tsx
src/lib/pdf/render.test.ts
scripts/setup-pocketbase.ts
scripts/dev/debug-logo.ts
... +1 more | | `email_opened` | bool | no | ✅ 9 | src/app/(app)/quotes/[id]/page.tsx
src/app/api/v1/quotes/[id]/save-as-template/route.ts
src/app/api/v1/quotes/[id]/clone/route.ts
src/lib/pdf/render.test.ts
scripts/setup-pocketbase.ts
... +2 more | | `email_outbound_message_id` | text | no | ✅ 9 | src/lib/pdf/render.test.ts
src/lib/server/quotes-service.ts
src/lib/server/quotes-service.test.ts
scripts/migrations/2026-06-23-add-quote-outbound-email-fields.ts | | `template_source_id` | relation | no | ✅ 9 | src/app/api/v1/quotes/[id]/save-as-template/route.ts
src/app/api/v1/quotes/[id]/clone/route.ts
src/lib/pb-helpers.ts
src/lib/pdf/render.test.ts
scripts/migrations/2026-06-23-add-quote-template-fields.ts
... +1 more | | `generated_from_template_id` | relation | no | ✅ 10 | src/app/api/v1/quotes/[id]/create-from-template/route.ts
src/app/api/v1/quotes/[id]/save-as-template/route.ts
src/app/api/v1/quotes/[id]/clone/route.ts
src/lib/pb-helpers.ts
src/lib/pdf/render.test.ts
... +2 more | | `email_delivered` | bool | no | ✅ 11 | src/app/(app)/quotes/[id]/page.tsx
src/app/api/v1/quotes/[id]/save-as-template/route.ts
src/app/api/v1/quotes/[id]/clone/route.ts
src/lib/pdf/render.test.ts
src/lib/server/quotes-service.ts
... +4 more | | `email_sender` | email | no | ✅ 12 | src/app/(app)/quotes/[id]/page.tsx
src/lib/pdf/render.test.ts
src/lib/server/quotes-service.ts
src/lib/server/quotes-service.test.ts
scripts/setup-pocketbase.ts
... +2 more | | `last_reply_at` | date | no | ✅ 13 | src/app/(app)/quotes/page.tsx
src/app/(app)/quotes/[id]/page.tsx
src/lib/pdf/render.test.ts
src/lib/server/quotes-service.ts
src/lib/server/quotes-service.test.ts
... +3 more | | `pdf_generated_at` | date | no | ✅ 13 | src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/quotes/[id]/process/page.tsx
src/app/api/v1/quotes/[id]/save-as-template/route.ts
src/app/api/v1/quotes/[id]/pdf/route.ts
src/app/api/v1/quotes/[id]/clone/route.ts
... +4 more | | `email_subject` | text | no | ✅ 15 | src/app/(app)/quotes/[id]/page.tsx
src/lib/pdf/render.test.ts
src/lib/server/quotes-service.ts
src/lib/server/quotes-service.test.ts
scripts/setup-pocketbase.ts
... +3 more | | `has_attachments` | bool | no | ✅ 15 | src/lib/pdf/render.test.ts
src/lib/server/quotes-service.ts
src/lib/server/quotes-service.test.ts
scripts/setup-pocketbase.ts
scripts/smoke/upload-attachment.ts
... +2 more | | `email_failed_at` | date | no | ✅ 16 | src/app/(app)/quotes/[id]/page.tsx
src/lib/pdf/render.test.ts
src/lib/server/quotes-service.ts
src/lib/server/quotes-service.test.ts
scripts/setup-pocketbase.ts
... +2 more | | `external_number` | text | no | ✅ 18 | src/app/api/v1/quotes/lookup/route.ts
src/app/api/v1/quotes/[id]/create-from-template/route.ts
src/app/api/v1/quotes/[id]/save-as-template/route.ts
src/app/api/v1/quotes/[id]/clone/route.ts
src/lib/pb-helpers.ts
... +5 more | | `company_letterhead` | select | no | ✅ 19 | src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/quotes/[id]/process/page.tsx
src/app/api/v1/quotes/[id]/create-from-template/route.ts
src/app/api/v1/quotes/[id]/save-as-template/route.ts
src/app/api/v1/quotes/[id]/clone/route.ts
... +8 more | | `sending_started_at` | date | no | ✅ 22 | src/app/(app)/quotes/[id]/page.tsx
src/lib/pdf/render.test.ts
src/lib/server/quotes-service.ts
src/lib/server/quotes-service.test.ts
scripts/migrations/2026-06-23-add-quote-outbound-email-fields.ts | | `email_error` | text | no | ✅ 23 | src/app/(app)/quotes/[id]/page.tsx
src/lib/pdf/render.test.ts
src/lib/server/quotes-service.ts
src/lib/server/quotes-service.test.ts
scripts/migrations/2026-06-23-add-quote-outbound-email-fields.ts | | `quote_date` | date | no | ✅ 25 | src/app/(app)/quotes/[id]/page.tsx
src/app/api/v1/quotes/[id]/create-from-template/route.ts
src/app/api/v1/quotes/[id]/save-as-template/route.ts
src/app/api/v1/quotes/[id]/clone/route.ts
src/lib/pb-helpers.ts
... +4 more | | `validity_days` | number | no | ✅ 26 | src/app/(app)/quotes/[id]/page.tsx
src/app/api/v1/quotes/[id]/create-from-template/route.ts
src/app/api/v1/quotes/[id]/save-as-template/route.ts
src/app/api/v1/quotes/[id]/clone/route.ts
src/lib/pb-helpers.ts
... +5 more | | `email_message_id` | text | no | ✅ 28 | src/app/(app)/quotes/[id]/page.tsx
src/app/api/v1/quotes/[id]/pdf/route.ts
src/lib/pdf/render.test.ts
src/lib/server/quotes-service.ts
src/lib/server/quotes-service.test.ts
... +3 more | | `quote_reference` | text | no | ✅ 28 | src/app/(app)/quotes/[id]/process/page.tsx
src/app/api/v1/quotes/lookup/route.ts
src/app/api/v1/quotes/[id]/create-from-template/route.ts
src/app/api/v1/quotes/[id]/save-as-template/route.ts
src/app/api/v1/quotes/[id]/clone/route.ts
... +6 more | | `claimed_by` | text | no | ✅ 32 | src/app/(app)/quotes/page.tsx
src/app/(app)/quotes/[id]/page.tsx
src/lib/pdf/render.test.ts
scripts/setup-pocketbase.ts
scripts/dev/debug-logo.ts
... +1 more | | `follow_up_due` | date | no | ✅ 32 | src/app/(app)/quotes/page.tsx
src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/dashboard/page.tsx
src/app/api/v1/quotes/[id]/save-as-template/route.ts
src/app/api/v1/quotes/[id]/clone/route.ts
... +4 more | | `rfq_number` | text | no | ✅ 39 | src/app/(app)/quotes/approvals/page.tsx
src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/quotes/[id]/process/page.tsx
src/app/api/v1/quotes/lookup/route.ts
src/app/api/v1/quotes/[id]/create-from-template/route.ts
... +11 more | | `is_template` | bool | no | ✅ 46 | src/app/(app)/quotes/page.tsx
src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/dashboard/page.tsx
src/app/api/v1/quotes/lookup/route.ts
src/app/api/v1/quotes/[id]/create-from-template/route.ts
... +6 more | | `delivery_note` | relation | no | ✅ 81 | src/app/(app)/quotes/page.tsx
src/app/(app)/quotes/[id]/page.tsx
src/lib/pb-helpers.ts
src/lib/server/quotes-service.ts
src/lib/server/delivery-notes-service.ts
... +2 more | | `markup` | number | no | ✅ 97 | src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/quotes/[id]/process/page.tsx
src/app/api/v1/quotes/[id]/create-from-template/route.ts
src/app/api/v1/quotes/[id]/save-as-template/route.ts
src/app/api/v1/quotes/[id]/re-price/route.ts
... +10 more | | `quote_number` | text | no | ✅ 132 | src/app/(app)/customers/[id]/page.tsx
src/app/(app)/quotes/page.tsx
src/app/(app)/quotes/approvals/page.tsx
src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/quotes/[id]/process/page.tsx
... +23 more | | `notes` | text | no | ✅ 149 | src/app/(app)/quotes/page.tsx
src/app/(app)/quotes/approvals/page.tsx
src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/quotes/[id]/process/page.tsx
src/app/api/v1/quotes/[id]/create-from-template/route.ts
... +19 more | | `description` | text | no | ✅ 230 | src/app/(app)/customers/[id]/page.tsx
src/app/(app)/quotes/page.tsx
src/app/(app)/quotes/approvals/page.tsx
src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/quotes/[id]/process/page.tsx
... +21 more | | `company` | relation | no | ✅ 289 | src/app/(app)/customers/[id]/page.tsx
src/app/(app)/quotes/page.tsx
src/app/(app)/quotes/approvals/page.tsx
src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/quotes/[id]/process/page.tsx
... +19 more | | `status` | select | no | ✅ 474 | src/app/(app)/customers/[id]/page.tsx
src/app/(app)/quotes/page.tsx
src/app/(app)/quotes/approvals/page.tsx
src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/quotes/[id]/process/page.tsx
... +27 more | | `customer` | relation | yes | ✅ 519 | src/app/(app)/customers/[id]/page.tsx
src/app/(app)/quotes/page.tsx
src/app/(app)/quotes/approvals/page.tsx
src/app/(app)/quotes/[id]/page.tsx
src/app/(app)/quotes/[id]/process/page.tsx
... +24 more | ## `raw_price_list` (`base`) | field | type | required | refs | used where | |---|---|---|---|---| | `log_summary` | text | no | ✅ 8 | src/app/(app)/pricelist/page.tsx
src/lib/pb-helpers.ts | | `file_name` | text | no | ✅ 9 | src/app/(app)/pricelist/page.tsx
scripts/migrations/2026-06-30-add-pricelist-notes.ts | | `supplier_file` | file | no | ✅ 10 | src/app/(app)/pricelist/page.tsx
src/lib/pb-helpers.ts
scripts/migrations/2026-06-30-add-raw-price-list.ts | | `supplier_name` | relation | no | ✅ 16 | src/app/(app)/pricelist/page.tsx
src/lib/pb-helpers.ts
scripts/migrations/2026-06-30-backfill-price-list-search-text.ts
scripts/migrations/2026-06-30-add-raw-price-list.ts | | `notes` | text | no | ✅ 41 | src/app/(app)/pricelist/page.tsx
src/lib/pb-helpers.ts
scripts/migrations/2026-06-30-add-pricelist-notes.ts | | `status` | select | no | ✅ 79 | src/app/(app)/pricelist/page.tsx
src/app/api/v1/files/[collection]/[recordId]/[filename]/route.ts
src/lib/pb-helpers.ts | ## `repairs` (`base`) | field | type | required | refs | used where | |---|---|---|---|---| | `fault_description` | text | yes | ✅ 4 | src/lib/pb-helpers.ts | | `item_description` | text | yes | ✅ 4 | src/lib/pb-helpers.ts | | `repair_number` | text | yes | ✅ 5 | src/lib/pb-helpers.ts | | `notes` | text | no | ✅ 12 | src/lib/pb-helpers.ts | | `company` | relation | no | ✅ 53 | src/lib/pb-helpers.ts | | `status` | select | yes | ✅ 56 | src/lib/pb-helpers.ts | | `customer` | relation | no | ✅ 64 | src/lib/pb-helpers.ts | | `order` | relation | no | ✅ 81 | src/lib/pb-helpers.ts | ## `rfq_outbound` (`base`) | field | type | required | refs | used where | |---|---|---|---|---| | `email_body` | text | no | ✅ 2 | scripts/migrations/2026-06-30-create-rfq-outbound.ts | | `email_subject` | text | yes | ✅ 2 | scripts/migrations/2026-06-30-create-rfq-outbound.ts | | `raw_email_id` | text | no | ✅ 2 | scripts/migrations/2026-06-30-create-rfq-outbound.ts | | `sent_at` | date | no | ✅ 2 | scripts/migrations/2026-06-30-create-rfq-outbound.ts | | `email_message_id` | text | no | ✅ 3 | scripts/migrations/2026-06-30-create-rfq-outbound.ts | | `quote_item` | relation | yes | ✅ 4 | scripts/migrations/2026-06-30-create-rfq-outbound.ts | | `status` | text | no | ✅ 4 | scripts/migrations/2026-06-30-create-rfq-outbound.ts | | `supplier` | relation | no | ✅ 5 | scripts/migrations/2026-06-30-create-rfq-outbound.ts | ## `stock_items` (`base`) | field | type | required | refs | used where | |---|---|---|---|---| | `location` | text | no | ✅ 33 | src/app/(app)/collection-confirm/page.tsx
src/app/(app)/stock-orders/new/page.tsx
src/app/(app)/stock/page.test.tsx
src/app/(app)/stock/page.tsx
src/app/(app)/stock/[id]/page.tsx
... +5 more | | `target_qty` | number | no | ✅ 40 | src/app/(app)/stock-orders/reorder/page.tsx
src/app/(app)/stock-orders/new/page.tsx
src/app/(app)/stock/page.tsx
src/app/(app)/stock/[id]/page.tsx
scripts/migrations/2026-07-15-add-stock-items-target-qty.ts | | `is_active` | bool | no | ✅ 50 | src/app/(app)/collection-confirm/page.tsx
src/app/(app)/stock-orders/reorder/page.tsx
src/app/(app)/stock-orders/new/page.tsx
src/app/(app)/stock/page.test.tsx
src/app/(app)/stock/page.tsx
... +16 more | | `unit` | text | no | ✅ 50 | src/app/(app)/collection-confirm/page.tsx
src/app/(app)/stock-orders/reorder/page.tsx
src/app/(app)/stock-orders/new/page.tsx
src/app/(app)/stock-orders/[id]/page.tsx
src/app/(app)/stock/page.test.tsx
... +14 more | | `min_qty` | number | no | ✅ 56 | src/app/(app)/stock-orders/reorder/page.tsx
src/app/(app)/stock-orders/new/page.tsx
src/app/(app)/stock/page.test.tsx
src/app/(app)/stock/page.tsx
src/app/(app)/stock/[id]/page.tsx
... +8 more | | `sku` | text | no | ✅ 101 | src/app/(app)/collection-confirm/page.test.tsx
src/app/(app)/collection-confirm/page.tsx
src/app/(app)/stock-orders/new/page.tsx
src/app/(app)/stock/page.test.tsx
src/app/(app)/stock/page.tsx
... +12 more | | `notes` | text | no | ✅ 179 | src/app/(app)/collection-confirm/page.test.tsx
src/app/(app)/collection-confirm/page.tsx
src/app/(app)/stock-orders/new/page.tsx
src/app/(app)/stock-orders/[id]/page.tsx
src/app/(app)/stock/page.test.tsx
... +18 more | | `current_qty` | number | no | ✅ 184 | src/app/(app)/collection-confirm/page.test.tsx
src/app/(app)/collection-confirm/page.tsx
src/app/(app)/stock-orders/reorder/page.tsx
src/app/(app)/stock-orders/new/page.tsx
src/app/(app)/stock-orders/[id]/page.tsx
... +20 more | | `description` | text | no | ✅ 201 | src/app/(app)/collection-confirm/page.test.tsx
src/app/(app)/collection-confirm/page.tsx
src/app/(app)/stock-orders/new/page.tsx
src/app/(app)/stock-orders/[id]/page.tsx
src/app/(app)/stock/page.test.tsx
... +21 more | | `supplier` | relation | no | ✅ 293 | src/app/(app)/collection-confirm/page.test.tsx
src/app/(app)/collection-confirm/page.tsx
src/app/(app)/stock-orders/reorder/page.tsx
src/app/(app)/stock-orders/new/page.tsx
src/app/(app)/stock-orders/[id]/page.tsx
... +22 more | | `name` | text | yes | ✅ 447 | src/app/(app)/collection-confirm/page.test.tsx
src/app/(app)/collection-confirm/page.tsx
src/app/(app)/stock-orders/reorder/page.tsx
src/app/(app)/stock-orders/new/page.tsx
src/app/(app)/stock/page.test.tsx
... +21 more | ## `stock_ledger` (`base`) | field | type | required | refs | used where | |---|---|---|---|---| | `reference_id` | text | no | ✅ 25 | src/app/(app)/collection-confirm/page.tsx
src/app/(app)/stock-orders/[id]/page.tsx
src/app/(app)/stock/[id]/page.tsx
src/app/api/v1/stock/fulfill/route.test.ts
src/app/api/v1/stock/fulfill/route.ts
... +9 more | | `reference_type` | text | no | ✅ 27 | src/app/(app)/collection-confirm/page.tsx
src/app/(app)/stock-orders/[id]/page.tsx
src/app/(app)/stock/[id]/page.tsx
src/app/api/v1/stock/fulfill/route.test.ts
src/app/api/v1/stock/fulfill/route.ts
... +9 more | | `created_by` | relation | no | ✅ 28 | src/app/(app)/collection-confirm/page.tsx
src/app/(app)/stock-orders/[id]/page.tsx
src/app/(app)/stock/[id]/page.tsx
src/app/api/v1/stock/fulfill/route.ts
src/app/api/v1/stock/surplus-book/route.test.ts
... +8 more | | `change_qty` | number | yes | ✅ 39 | src/app/(app)/collection-confirm/page.tsx
src/app/(app)/stock-orders/[id]/page.tsx
src/app/(app)/stock/[id]/page.tsx
src/app/api/v1/stock/fulfill/route.test.ts
src/app/api/v1/stock/fulfill/route.ts
... +9 more | | `stock_item` | relation | yes | ✅ 105 | src/app/(app)/collection-confirm/page.test.tsx
src/app/(app)/collection-confirm/page.tsx
src/app/(app)/stock-orders/[id]/page.tsx
src/app/(app)/stock/page.tsx
src/app/(app)/stock/[id]/page.tsx
... +12 more | | `notes` | text | no | ✅ 107 | src/app/(app)/collection-confirm/page.test.tsx
src/app/(app)/collection-confirm/page.tsx
src/app/(app)/stock-orders/[id]/page.tsx
src/app/(app)/stock/page.tsx
src/app/(app)/stock/[id]/page.tsx
... +10 more | | `reason` | select | no | ✅ 158 | src/app/(app)/collection-confirm/page.tsx
src/app/(app)/stock-orders/[id]/page.tsx
src/app/(app)/stock/[id]/page.tsx
src/app/api/v1/stock/fulfill/route.test.ts
src/app/api/v1/stock/fulfill/route.ts
... +9 more | ## `stock_purchase_items` (`base`) | field | type | required | refs | used where | |---|---|---|---|---| | `problem_notes` | text | no | ✅ 22 | src/app/(app)/collection-confirm/page.tsx
src/app/api/v1/driver/stops/route.test.ts
src/app/api/v1/driver/stops/[id]/status/route.test.ts
src/lib/server/driver-stops.ts
scripts/migrations/2026-07-17-add-stock-purchase-problem-fields.ts | | `problem_type` | text | no | ✅ 32 | src/app/(app)/collection-confirm/page.tsx
src/app/api/v1/driver/stops/route.test.ts
src/app/api/v1/driver/stops/[id]/status/route.test.ts
src/lib/server/driver-stops.ts
scripts/migrations/2026-07-17-add-stock-purchase-problem-fields.ts | | `problem_flag` | bool | no | ✅ 33 | src/app/(app)/collection-confirm/page.test.tsx
src/app/(app)/collection-confirm/page.tsx
src/app/api/v1/driver/stops/route.test.ts
src/app/api/v1/driver/stops/[id]/status/route.test.ts
src/lib/server/driver-stops.ts
... +1 more | | `cost_price` | number | no | ✅ 35 | src/app/(app)/collection-confirm/page.test.tsx
src/app/(app)/collection-confirm/page.tsx
src/app/(app)/stock-orders/new/page.tsx
src/app/(app)/stock-orders/[id]/page.tsx
src/app/(app)/stock/[id]/page.tsx
... +5 more | | `assigned_at` | date | no | ✅ 57 | src/app/(app)/collection-confirm/page.tsx
src/app/(app)/collection-pool/page.test.tsx
src/app/(app)/collection-pool/page.tsx
src/app/(app)/collection-map/page.tsx
src/app/api/v1/driver/stops/route.test.ts
... +3 more | | `drv_id` | relation | no | ✅ 67 | src/app/(app)/collection-pool/page.test.tsx
src/app/(app)/collection-pool/page.tsx
src/app/(app)/collection-map/page.tsx
src/app/api/v1/driver/stops/route.test.ts
src/app/api/v1/driver/stops/[id]/status/route.test.ts
... +3 more | | `quantity_received` | number | no | ✅ 73 | src/app/(app)/collection-confirm/page.test.tsx
src/app/(app)/collection-confirm/page.tsx
src/app/(app)/stock-orders/new/page.tsx
src/app/(app)/stock-orders/[id]/page.tsx
src/app/(app)/stock/[id]/page.tsx
... +7 more | | `quantity` | number | yes | ✅ 108 | src/app/(app)/collection-confirm/page.test.tsx
src/app/(app)/collection-confirm/page.tsx
src/app/(app)/collection-pool/page.tsx
src/app/(app)/collection-map/page.tsx
src/app/(app)/stock-orders/new/page.tsx
... +10 more | | `notes` | text | no | ✅ 109 | src/app/(app)/collection-confirm/page.test.tsx
src/app/(app)/collection-confirm/page.tsx
src/app/(app)/collection-pool/page.test.tsx
src/app/(app)/stock-orders/new/page.tsx
src/app/(app)/stock-orders/[id]/page.tsx
... +8 more | | `stock_item` | relation | yes | ✅ 117 | src/app/(app)/collection-confirm/page.test.tsx
src/app/(app)/collection-confirm/page.tsx
src/app/(app)/collection-pool/page.tsx
src/app/(app)/collection-map/page.tsx
src/app/(app)/stock-orders/new/page.tsx
... +10 more | | `description` | text | yes | ✅ 123 | src/app/(app)/collection-confirm/page.test.tsx
src/app/(app)/collection-confirm/page.tsx
src/app/(app)/collection-pool/page.test.tsx
src/app/(app)/collection-pool/page.tsx
src/app/(app)/collection-map/page.tsx
... +10 more | | `purchase` | relation | yes | ✅ 241 | src/app/(app)/collection-confirm/page.test.tsx
src/app/(app)/collection-confirm/page.tsx
src/app/(app)/collection-pool/page.tsx
src/app/(app)/collection-map/page.tsx
src/app/(app)/stock-orders/page.tsx
... +13 more | | `status` | select | no | ✅ 281 | src/app/(app)/collection-confirm/page.test.tsx
src/app/(app)/collection-confirm/page.tsx
src/app/(app)/collection-pool/page.tsx
src/app/(app)/collection-map/page.tsx
src/app/(app)/stock-orders/page.tsx
... +12 more | ## `stock_purchases` (`base`) | field | type | required | refs | used where | |---|---|---|---|---| | `email_message_id` | text | no | ✅ 10 | src/lib/server/stock-purchases-migration.test.ts
src/lib/server/stock-purchases-service.ts
scripts/migrations/2026-07-14-create-stock-purchases.ts | | `documents_history` | json | no | ✅ 14 | src/app/api/v1/stock-purchases/[id]/pdf/route.ts
src/app/api/v1/stock-purchases/[id]/send-email/route.ts
scripts/migrations/2026-07-16-add-stock-purchase-documents-history.ts | | `email_error` | text | no | ✅ 17 | src/app/api/v1/stock-purchases/[id]/send-email/route.ts
src/lib/server/stock-purchases-migration.test.ts
src/lib/server/stock-purchases-service.ts
scripts/migrations/2026-07-14-create-stock-purchases.ts | | `email_payload` | json | no | ✅ 20 | src/app/api/v1/stock-purchases/[id]/send-email/route.ts
src/lib/server/stock-purchases-migration.test.ts
src/lib/server/stock-purchases-service.ts
scripts/migrations/2026-07-14-create-stock-purchases.ts | | `documents` | file | no | ✅ 30 | src/app/api/v1/stock-purchases/[id]/pdf/route.ts
src/app/api/v1/stock-purchases/[id]/send-email/route.ts
src/app/api/v1/files/[collection]/[recordId]/[filename]/route.ts
src/lib/server/stock-purchases-service.ts
scripts/migrations/2026-07-15-stock-purchase-line-state.ts
... +1 more | | `purchase_number` | text | yes | ✅ 63 | src/app/(app)/collection-confirm/page.test.tsx
src/app/(app)/collection-confirm/page.tsx
src/app/(app)/stock-orders/page.tsx
src/app/(app)/stock-orders/new/page.tsx
src/app/(app)/stock-orders/[id]/page.tsx
... +6 more | | `notes` | text | no | ✅ 71 | src/app/(app)/collection-confirm/page.test.tsx
src/app/(app)/collection-confirm/page.tsx
src/app/(app)/stock-orders/new/page.tsx
src/app/(app)/stock-orders/[id]/page.tsx
src/app/api/v1/stock-purchases/[id]/pdf/route.ts
... +4 more | | `supplier` | relation | yes | ✅ 171 | src/app/(app)/collection-confirm/page.test.tsx
src/app/(app)/collection-confirm/page.tsx
src/app/(app)/stock-orders/page.tsx
src/app/(app)/stock-orders/new/page.tsx
src/app/(app)/stock-orders/[id]/page.tsx
... +8 more | | `status` | select | yes | ✅ 248 | src/app/(app)/collection-confirm/page.test.tsx
src/app/(app)/collection-confirm/page.tsx
src/app/(app)/stock-orders/page.tsx
src/app/(app)/stock-orders/new/page.tsx
src/app/(app)/stock-orders/[id]/page.tsx
... +11 more | ## `suppliers` (`base`) | field | type | required | refs | used where | |---|---|---|---|---| | `geoPoint` | geoPoint | no | ✅ 13 | src/app/api/v1/suppliers/route.ts
src/app/api/mcp/route.ts
src/lib/server/management-service.ts
scripts/setup-pocketbase.ts
scripts/smoke/management-flow.ts | | `closingtime` | text | no | ✅ 19 | src/app/api/v1/suppliers/route.ts
src/app/api/v1/suppliers/[id]/route.ts
src/app/api/mcp/route.ts
src/components/supplier-form.tsx
src/lib/pb-helpers.ts
... +3 more | | `supplieraddress` | text | no | ✅ 27 | src/app/(app)/suppliers/page.tsx
src/app/api/v1/suppliers/route.ts
src/app/api/v1/suppliers/[id]/route.ts
src/app/api/mcp/route.ts
src/components/supplier-map.tsx
... +5 more | | `suppliernumber` | text | no | ✅ 33 | src/app/(app)/suppliers/page.tsx
src/app/api/v1/suppliers/route.ts
src/app/api/v1/suppliers/[id]/route.ts
src/app/api/mcp/route.ts
src/components/supplier-map.tsx
... +5 more | | `supply_tags` | text | no | ✅ 34 | src/app/(app)/suppliers/page.tsx
src/app/api/v1/suppliers/route.ts
src/app/api/v1/suppliers/[id]/route.ts
src/app/api/mcp/route.ts
src/components/supplier-map.tsx
... +5 more | | `suppliername` | text | no | ✅ 87 | src/app/(app)/suppliers/page.tsx
src/app/(app)/quotes/[id]/process/page.tsx
src/app/(app)/collection-map/page.tsx
src/app/(app)/stock-orders/new/page.tsx
src/app/(app)/stock/page.tsx
... +19 more | | `coordinates` | text | no | ✅ 96 | src/app/(app)/collection-map/page.tsx
src/app/api/v1/suppliers/route.ts
src/app/api/v1/suppliers/[id]/route.ts
src/app/api/mcp/route.ts
src/components/supplier-map.tsx
... +5 more | ## `users` (`auth`) | field | type | required | refs | used where | |---|---|---|---|---| | `accont_status` | bool | no | **❌ unused** | — | | `avatar` | file | no | **❌ unused** | — | | `permissions` | select | no | **❌ unused** | — | | `user_type` | select | no | **❌ unused** | — | | `name` | text | no | ✅ 309 | src/app/api/v1/users/lookup/route.ts
src/components/auth-provider.tsx
src/components/ui/user-search.tsx
src/lib/server/management-service.ts
scripts/setup-pocketbase.ts
... +7 more | ## Unused fields only (candidates for removal) | collection | field | type | required | |---|---|---|---| | `driver_locations` | `accuracy` | number | no | | `driver_locations` | `geoPoint` | geoPoint | no | | `driver_locations` | `heading` | number | no | | `driver_locations` | `latitude` | number | no | | `driver_locations` | `longitude` | number | no | | `driver_locations` | `relation` | relation | no | | `driver_locations` | `speed` | number | no | | `driver_locations` | `timestamp` | date | no | | `dupicate_custmers` | `customer` | text | no | | `dupicate_custmers` | `total_count` | number | no | | `masterdrilling_consignment` | `category` | select | no | | `masterdrilling_consignment` | `cost_price` | text | no | | `masterdrilling_consignment` | `description` | text | no | | `masterdrilling_consignment` | `markup` | text | no | | `masterdrilling_consignment` | `product_code` | number | no | | `masterdrilling_consignment` | `product_code_descrip` | text | no | | `masterdrilling_consignment` | `selling_price` | text | no | | `masterdrilling_consignment` | `supplier` | relation | no | | `order_items` | `delivered_at` | date | no | | `order_items` | `delivery_status` | select | no | | `order_items` | `drv_assigned_at` | date | no | | `order_items` | `invoice_status` | select | no | | `order_items` | `qb_invoice_pdf_` | text | no | | `order_items` | `qty_assigned` | number | no | | `order_items` | `qty_delivered` | number | no | | `order_items` | `qty_processed` | number | no | | `orders` | `order_attachements` | file | no | | `pos` | `brand` | text | no | | `pos` | `category` | text | no | | `pos` | `cost_price` | number | no | | `pos` | `description` | text | no | | `pos` | `markup` | number | no | | `pos` | `search_text` | text | no | | `pos` | `selling_price` | number | no | | `pos` | `sku` | text | no | | `pos` | `sku_normalised` | text | no | | `pos` | `source_file` | text | no | | `pos` | `source_file_id` | relation | no | | `pos` | `specifications` | json | no | | `pos` | `stock_qty` | number | no | | `pos` | `subcategory` | text | no | | `pos` | `supplier` | text | no | | `pos` | `unit` | text | no | | `price_list` | `source_file_id` | relation | no | | `price_list` | `stock_qty` | number | no | | `users` | `accont_status` | bool | no | | `users` | `avatar` | file | no | | `users` | `permissions` | select | no | | `users` | `user_type` | select | no | ## Single-reference fields (likely legacy / dead-code) | collection | field | type | file | |---|---|---|---| | `order_items` | `legacy_order_item_id` | text | `scripts/migrations/2026-07-20-delivery-tracking.ts` | ## Dead collections (never referenced anywhere in the app) These collections exist in PB but no app file touches them. Every non-system field on them is unused. Safe to inspect for deletion once you confirm the data is not needed by anything external (n8n flows, MCP, manual admin, etc). - `driver_locations` (base, 8 user fields) - `masterdrilling_consignment` (base, 8 user fields) - `pos` (base, 16 user fields)