Sales and purchasing endpoints
| Method & path | Body | Permission | |||
|---|---|---|---|---|---|
GET /customers · POST · PATCH /:id · `POST /:id/deactivate | reactivate` | name, email?, phone?, billing_address?, shipping_address?, notes? | sales.read / sales.write | ||
GET /sales-orders · GET /sales-orders/:id | filters status, customer_id, from, to, search | sales.read | |||
GET /sales-orders/reservations | reserved quantity per item from confirmed orders | sales.read | |||
POST /sales-orders | customer_id, order_date, due_date?, customer_reference?, notes?, lines[{ item_id, quantity, unit_price, notes? }] → QT-… | sales.write | |||
PUT /sales-orders/:id | same (draft / sent only) | sales.write | |||
| `POST /sales-orders/:id/send | confirm | fulfil | cancel` | — (confirm allocates SO-… and reserves stock) | sales.write |
GET /vendors · POST · PATCH /:id · `POST /:id/deactivate | reactivate` | name, email?, phone?, address?, payment_terms?, notes? | purchasing.read / purchasing.write | ||
GET /purchase-orders · GET /purchase-orders/:id | filters status, vendor_id, from, to, search | purchasing.read | |||
POST /purchase-orders | vendor_id, order_date, expected_date?, vendor_reference?, notes?, lines[{ item_id, quantity, unit_cost, notes? }] → PO-… | purchasing.write | |||
PUT /purchase-orders/:id | same (drafts) | purchasing.write | |||
| `POST /purchase-orders/:id/send | cancel` | — | purchasing.write | ||
POST /purchase-orders/:id/receive | warehouse_id, movement_date, idempotency_key, lines[{ line_id, quantity }] → posts RCV; partial allowed | stock.post | |||
GET /planning/requirements | per item: demand, supply, shortage, make-or-buy | planning.read | |||
POST /planning/purchase-orders | vendor_id, item_ids[], order_date? → draft PO from shortages | purchasing.write |
Last updated