BOM and work order endpoints
| Method & path | Body | Permission | ||||
|---|---|---|---|---|---|---|
GET /boms · GET /boms/:id | — | bom.read | ||||
POST /boms | parent_item_id, revision, notes?, lines[{ component_item_id, quantity_per, scrap_percent?, notes? }] | bom.write | ||||
PUT /boms/:id | same (drafts only — bom_immutable) | bom.write | ||||
POST /boms/:id/release | — (obsoletes the previous released revision) | bom.write | ||||
GET /work-orders · GET /work-orders/:id | list filters: status, item_id, due_from, due_to, search | jobs.read | ||||
GET /work-orders/:id/cost | { material, labour, total, per_unit, completed_quantity } | jobs.read | ||||
GET /work-orders/:id/movements | the job's JIS / JRT documents | jobs.read | ||||
POST /work-orders | item_id, quantity, due_date?, customer_reference?, notes?, operations? → JOB-… draft | jobs.write | ||||
PATCH /work-orders/:id | quantity?, due_date?, customer_reference?, notes?, labour_hours?, labour_rate?, operations? | jobs.write | ||||
| `POST /work-orders/:id/release | start | complete | close | cancel` | complete takes completed_quantity | jobs.write |
POST /work-orders/:id/issues | idempotency_key, movement_date, from_warehouse_id, reason?, lines[{ component_item_id, quantity }] | jobs.issue | ||||
POST /work-orders/:id/returns | idempotency_key, movement_date, to_warehouse_id, reason?, lines[…] (≤ issued — return_exceeds_issued) | jobs.issue | ||||
GET /work-orders/:id/steps · PUT /work-orders/:id/steps | steps[{ name, work_center_id, planned_hours }] | jobs.read / jobs.write | ||||
| `POST /work-orders/:id/steps/:stepId/start | complete` | — (in order) | jobs.write | |||
GET /work-centers · POST · PATCH /:id · `POST /:id/deactivate | reactivate` | code, name, machine_type?, hourly_rate | jobs.read / jobs.write |
Last updated