Add PocketBase collections, APIs & migration docs
Introduce PocketBase workflow support, migration tooling, server APIs and documentation. Adds a set of PocketBase collection JSONs (order_items, order_items_v2, collection_pool, delivery_notes, delivery_note_items, repairs) and a large import manifest for workflow collections; includes docs describing MCP/API layer, migration audit, order-item schema and rollout plans. Adds server-side agent/MCP endpoints and services (api/mcp, api/v1/orders, collection-pool, order-items status, health) plus helper modules (pocketbase-admin, orders-service, order-item-status, agent-auth) and a migration script to create order_items_v2/collection_pool. UI: new pages for collection-pool, delivery-notes, repairs and several updates to orders/quotes pages, sidebar, tooltip and pb helpers/types. Also updates package.json (migration script and related changes) and global styles. Required env vars and suggested migration command are documented (e.g. NEXT_PUBLIC_POCKETBASE_URL, PB_ADMIN_EMAIL, PB_ADMIN_PASSWORD, ORDER_ITEMS_COLLECTION; run npm run pb:migrate:orders-v2).
2026-05-25 16:39:33 +00:00
|
|
|
# Order Workflow Rules
|
|
|
|
|
|
|
|
|
|
## Quote to Order
|
|
|
|
|
- A quote remains in `quotes`.
|
|
|
|
|
- Quote items remain in `quote_items`.
|
|
|
|
|
- Creating an order from a quote creates one new `orders` record.
|
|
|
|
|
- The new order links back to the quote through `orders.quote`.
|
|
|
|
|
- Each quote item is copied into `order_items`.
|
|
|
|
|
- Each copied order item links back to its source quote item through `order_items.quote_item`.
|
|
|
|
|
- Creating an order from the same quote twice returns the existing order instead of duplicating it.
|
|
|
|
|
- Quote status is not changed by order creation.
|
|
|
|
|
|
|
|
|
|
## Order Items as Source of Truth
|
|
|
|
|
`order_items` is the operational source of truth after an order is created.
|
2026-06-29 11:06:01 +00:00
|
|
|
**No order-level `status` field exists.** Items are the only authoritative
|
|
|
|
|
lifecycle record; the order-level "Complete" badge in the UI is derived
|
|
|
|
|
client-side from the items (see "Order Completion" below).
|
Add PocketBase collections, APIs & migration docs
Introduce PocketBase workflow support, migration tooling, server APIs and documentation. Adds a set of PocketBase collection JSONs (order_items, order_items_v2, collection_pool, delivery_notes, delivery_note_items, repairs) and a large import manifest for workflow collections; includes docs describing MCP/API layer, migration audit, order-item schema and rollout plans. Adds server-side agent/MCP endpoints and services (api/mcp, api/v1/orders, collection-pool, order-items status, health) plus helper modules (pocketbase-admin, orders-service, order-item-status, agent-auth) and a migration script to create order_items_v2/collection_pool. UI: new pages for collection-pool, delivery-notes, repairs and several updates to orders/quotes pages, sidebar, tooltip and pb helpers/types. Also updates package.json (migration script and related changes) and global styles. Required env vars and suggested migration command are documented (e.g. NEXT_PUBLIC_POCKETBASE_URL, PB_ADMIN_EMAIL, PB_ADMIN_PASSWORD, ORDER_ITEMS_COLLECTION; run npm run pb:migrate:orders-v2).
2026-05-25 16:39:33 +00:00
|
|
|
|
|
|
|
|
Order items move through:
|
|
|
|
|
- supplier ordering / purchase order
|
|
|
|
|
- driver list / collection pool
|
2026-06-29 11:06:01 +00:00
|
|
|
- collected (back at office)
|
|
|
|
|
- picking
|
|
|
|
|
- ready for delivery
|
Add PocketBase collections, APIs & migration docs
Introduce PocketBase workflow support, migration tooling, server APIs and documentation. Adds a set of PocketBase collection JSONs (order_items, order_items_v2, collection_pool, delivery_notes, delivery_note_items, repairs) and a large import manifest for workflow collections; includes docs describing MCP/API layer, migration audit, order-item schema and rollout plans. Adds server-side agent/MCP endpoints and services (api/mcp, api/v1/orders, collection-pool, order-items status, health) plus helper modules (pocketbase-admin, orders-service, order-item-status, agent-auth) and a migration script to create order_items_v2/collection_pool. UI: new pages for collection-pool, delivery-notes, repairs and several updates to orders/quotes pages, sidebar, tooltip and pb helpers/types. Also updates package.json (migration script and related changes) and global styles. Required env vars and suggested migration command are documented (e.g. NEXT_PUBLIC_POCKETBASE_URL, PB_ADMIN_EMAIL, PB_ADMIN_PASSWORD, ORDER_ITEMS_COLLECTION; run npm run pb:migrate:orders-v2).
2026-05-25 16:39:33 +00:00
|
|
|
- delivered
|
|
|
|
|
|
|
|
|
|
Driver/collection fields use `drv_*` naming where possible, for example `drv_status` and `drv_id`.
|
|
|
|
|
|
2026-06-29 11:06:01 +00:00
|
|
|
## Item Status Lifecycle
|
|
|
|
|
|
|
|
|
|
`order_items.item_status` takes one of:
|
|
|
|
|
|
|
|
|
|
| Status | Meaning |
|
|
|
|
|
| ----------------- | -------------------------------------------------------------------- |
|
|
|
|
|
| `pending` | Item created, not yet sent to a supplier. |
|
|
|
|
|
| `processed` | Operator has reviewed/edited the line. |
|
|
|
|
|
| `po_generated` | PO created; in_stock flag determines next step. |
|
|
|
|
|
| `driver_pool` | Queued for collection (in_stock=false path). |
|
|
|
|
|
| `assigned` | A driver has picked it up. |
|
|
|
|
|
| `collected` | Back at the office (in_stock=true jumps straight here from PO). |
|
|
|
|
|
| `stock_verified` | Verified against stock count. |
|
|
|
|
|
| `picking` | Being pulled for delivery. |
|
|
|
|
|
| `ready_delivery` | Packed, on the delivery vehicle. |
|
|
|
|
|
| `delivered` | Signed for at the customer (terminal for the item). |
|
|
|
|
|
| `cancelled` | Cancelled (terminal for the item). |
|
|
|
|
|
|
|
|
|
|
## Orders List — Item-Status Tabs
|
|
|
|
|
|
|
|
|
|
The `/orders` page tabs are filtered by **item status**, not order status.
|
|
|
|
|
There are six tab groups; each one is the set of item statuses that "live"
|
|
|
|
|
on that tab. An order appears on tab X iff it has at least one item whose
|
|
|
|
|
`item_status` is in X (so an order with items in both `pending` and
|
|
|
|
|
`delivered` shows on both tabs).
|
|
|
|
|
|
|
|
|
|
| Tab | Item statuses in this tab |
|
|
|
|
|
| ---------------- | ------------------------------------------------------------------------------- |
|
|
|
|
|
| New | `pending` |
|
|
|
|
|
| Processing | `processed`, `po_generated` |
|
|
|
|
|
| Collection Pool | `driver_pool`, `assigned` |
|
|
|
|
|
| Collected | `collected`, `stock_verified`, `picking`, `ready_delivery` |
|
|
|
|
|
| Delivered | `delivered` |
|
|
|
|
|
| Cancelled | `cancelled` |
|
|
|
|
|
|
|
|
|
|
The mapping lives in `src/lib/item-status-ui.ts` (`TAB_GROUP_ITEM_STATUSES`)
|
|
|
|
|
and is the single source of truth for both the tab labels and the
|
|
|
|
|
underlying PB filter strings.
|
|
|
|
|
|
|
|
|
|
By default each row shows only items in the active tab. A "Show all items"
|
|
|
|
|
toggle per row expands to the full item list.
|
|
|
|
|
|
|
|
|
|
## Order Completion (derived, not stored)
|
|
|
|
|
|
|
|
|
|
A small helper `isOrderComplete(items)` in `src/lib/server/order-completion.ts`
|
|
|
|
|
answers the only order-level question the UI still asks: "is this order
|
|
|
|
|
done?". It returns true iff `items.length > 0 && every item is delivered`.
|
|
|
|
|
The green "Complete" badge on `/orders/[id]` and the order row header is
|
|
|
|
|
driven entirely by this helper — there is no `orders.status` field to
|
|
|
|
|
keep in sync, and therefore no flip-flop bug on refresh.
|
|
|
|
|
|
|
|
|
|
Invoiced is a separate boolean (`orders.invoiced`, set by the invoicing
|
|
|
|
|
action), intentionally independent from item lifecycle — an order can be
|
|
|
|
|
marked invoiced before, during, or after the items are all delivered.
|
|
|
|
|
|
|
|
|
|
## In-Stock Items
|
|
|
|
|
|
|
|
|
|
Each `order_items` row carries an `in_stock: bool` flag. When `true`,
|
|
|
|
|
the line bypasses the driver collection pool entirely after PO
|
|
|
|
|
generation:
|
|
|
|
|
|
|
|
|
|
- `in_stock = false` → on PO send, item transitions to `driver_pool`
|
|
|
|
|
and a `collection_pool` row is created.
|
|
|
|
|
- `in_stock = true` → on PO send, item transitions to `collected`
|
|
|
|
|
(skipping the pool).
|
|
|
|
|
|
|
|
|
|
Invoices and delivery notes ignore the flag — the item is still part of
|
|
|
|
|
the order and counted in totals.
|
|
|
|
|
|
Add PocketBase collections, APIs & migration docs
Introduce PocketBase workflow support, migration tooling, server APIs and documentation. Adds a set of PocketBase collection JSONs (order_items, order_items_v2, collection_pool, delivery_notes, delivery_note_items, repairs) and a large import manifest for workflow collections; includes docs describing MCP/API layer, migration audit, order-item schema and rollout plans. Adds server-side agent/MCP endpoints and services (api/mcp, api/v1/orders, collection-pool, order-items status, health) plus helper modules (pocketbase-admin, orders-service, order-item-status, agent-auth) and a migration script to create order_items_v2/collection_pool. UI: new pages for collection-pool, delivery-notes, repairs and several updates to orders/quotes pages, sidebar, tooltip and pb helpers/types. Also updates package.json (migration script and related changes) and global styles. Required env vars and suggested migration command are documented (e.g. NEXT_PUBLIC_POCKETBASE_URL, PB_ADMIN_EMAIL, PB_ADMIN_PASSWORD, ORDER_ITEMS_COLLECTION; run npm run pb:migrate:orders-v2).
2026-05-25 16:39:33 +00:00
|
|
|
## Driver List and Collection Pool
|
|
|
|
|
The old Django `driver_list` workflow is represented by the new `collection_pool` concept.
|
|
|
|
|
|
|
|
|
|
`collection_pool` tracks assignment and collection work, while `order_items` keeps the item lifecycle state.
|
|
|
|
|
|
|
|
|
|
## Future Stock Collection
|
|
|
|
|
Later we will add a dedicated `stock` collection.
|
|
|
|
|
|
|
|
|
|
Stock is used when:
|
|
|
|
|
- more items are collected than the order requires
|
|
|
|
|
- stock is ordered and arrives at the office
|
|
|
|
|
- collected items should be booked into stock instead of moving to invoicing
|
|
|
|
|
|
|
|
|
|
Until that collection exists, stock-related operational movement stays on `order_items`.
|
|
|
|
|
|
|
|
|
|
## Delivery Notes
|
|
|
|
|
Delivery notes should be generated from order items that are ready, loaded, or delivered.
|
|
|
|
|
|
|
|
|
|
## Repairs
|
|
|
|
|
Repairs will be rebuilt only where they connect to the practical order/quote/repair flow.
|
2026-06-29 11:06:01 +00:00
|
|
|
|