The production module serves work centres, operation types, routings and their operations, routing templates and cut technology rules, production versions, capacity reads, component allocations, production orders, work orders, and scheduling. All 102 endpoints sit under /api/v1/production. For business meaning see the Production module page.
Group facts¶
| Item | Value | Source |
|---|---|---|
| Base path | /api/v1/production |
src/cluster_erp/core/module_base.py:37-38, src/cluster_erp/modules/production/module.py:89 |
| Routers | 11 router objects in 10 files; listed in the section Endpoint summary | src/cluster_erp/modules/production/module.py:51 |
| Endpoints | 102, counted from the route decorators and add_api_route calls of the routers that register_routes mounts |
src/cluster_erp/modules/production/capacity/routes.py, src/cluster_erp/modules/production/component_allocations/routes.py, src/cluster_erp/modules/production/operation_types/routes.py ... |
| Authentication | Bearer header or session cookie, resolved by get_current_user; see Authentication and headers |
src/cluster_erp/modules/auth/guards.py:85-167 |
| Permission guard | 102 of 102 routes declare require_permission |
src/cluster_erp/modules/auth/guards.py:205-240 |
| App entitlement gate | require_app("production") on every mounted router |
src/cluster_erp/modules/production/module.py:102 |
| Error format | JSON body {"error": {...}}; see Errors |
src/cluster_erp/server/error_handler.py:33-46 |
Endpoint summary¶
One row per sub-module folder. The router prefix is added to the base path.
| Sub-module | Routers | Endpoints | Router source |
|---|---|---|---|
work_centers |
router (/work-centers) |
8 | src/cluster_erp/modules/production/work_centers/routes.py:22 |
operation_types |
router (/operation-types) |
8 | src/cluster_erp/modules/production/operation_types/routes.py:23 |
routings |
router (/routings) |
28 | src/cluster_erp/modules/production/routings/routes.py:38 |
routing_templates |
router (/routing-templates), rules_router (/cut-technology-rules) |
16 | src/cluster_erp/modules/production/routing_templates/routes.py:29, src/cluster_erp/modules/production/routing_templates/routes.py:30 |
production_versions |
router (/production-versions) |
4 | src/cluster_erp/modules/production/production_versions/routes.py:34 |
capacity |
router (/capacity) |
2 | src/cluster_erp/modules/production/capacity/routes.py:15 |
component_allocations |
router (/component-allocations) |
6 | src/cluster_erp/modules/production/component_allocations/routes.py:23 |
production_orders |
router (/production-orders) |
17 | src/cluster_erp/modules/production/production_orders/routes.py:34 |
work_orders |
router (/work-orders) |
8 | src/cluster_erp/modules/production/work_orders/routes.py:23 |
scheduling |
router (/scheduling) |
5 | src/cluster_erp/modules/production/scheduling/routes.py:32 |
Work centres endpoints¶
Work centre records and the operation types of a work centre.
| Method | Path | Handler | Permission | Request | Query | Response | Status | Source |
|---|---|---|---|---|---|---|---|---|
GET |
/api/v1/production/work-centers/ |
list_work_centers |
work_center.read |
none | search, active_only, limit, offset |
dict |
200 (default) | src/cluster_erp/modules/production/work_centers/routes.py:25 |
POST |
/api/v1/production/work-centers/ |
create_work_center |
work_center.create |
WorkCenterCreate |
none | WorkCenterRead |
201 |
src/cluster_erp/modules/production/work_centers/routes.py:50 |
GET |
/api/v1/production/work-centers/{work_center_id} |
get_work_center |
work_center.read |
none | none | WorkCenterRead |
200 (default) | src/cluster_erp/modules/production/work_centers/routes.py:61 |
PUT |
/api/v1/production/work-centers/{work_center_id} |
update_work_center |
work_center.update |
WorkCenterUpdate |
none | WorkCenterRead |
200 (default) | src/cluster_erp/modules/production/work_centers/routes.py:74 |
GET |
/api/v1/production/work-centers/{work_center_id}/operation-types |
get_work_center_operation_types |
work_center.read |
none | none | list[str] |
200 (default) | src/cluster_erp/modules/production/work_centers/routes.py:88 |
PUT |
/api/v1/production/work-centers/{work_center_id}/operation-types |
set_work_center_operation_types |
work_center.update |
WorkCenterCapabilityUpdate |
none | list[str] |
200 (default) | src/cluster_erp/modules/production/work_centers/routes.py:101 |
POST |
/api/v1/production/work-centers/bulk-delete |
bulk_delete_work_centers |
work_center.bulk_delete |
BulkDeleteRequest |
none | BulkDeleteResponse |
200 (default) | src/cluster_erp/modules/production/work_centers/routes.py:121 |
DELETE |
/api/v1/production/work-centers/{work_center_id} |
delete_work_center |
work_center.delete |
none | none | none | 204 |
src/cluster_erp/modules/production/work_centers/routes.py:132 |
Operation types endpoints¶
Operation type records, groups, and a seed of defaults.
| Method | Path | Handler | Permission | Request | Query | Response | Status | Source |
|---|---|---|---|---|---|---|---|---|
GET |
/api/v1/production/operation-types/ |
list_operation_types |
routing.read |
none | active_only, search, limit, offset |
dict |
200 (default) | src/cluster_erp/modules/production/operation_types/routes.py:26 |
GET |
/api/v1/production/operation-types/groups |
list_operation_type_groups |
routing.read |
none | none | list[str] |
200 (default) | src/cluster_erp/modules/production/operation_types/routes.py:51 |
POST |
/api/v1/production/operation-types/ |
create_operation_type |
routing.create |
OperationTypeCreate |
none | OperationTypeRead |
201 |
src/cluster_erp/modules/production/operation_types/routes.py:61 |
GET |
/api/v1/production/operation-types/{type_id} |
get_operation_type |
routing.read |
none | none | OperationTypeRead |
200 (default) | src/cluster_erp/modules/production/operation_types/routes.py:72 |
PUT |
/api/v1/production/operation-types/{type_id} |
update_operation_type |
routing.update |
OperationTypeUpdate |
none | OperationTypeRead |
200 (default) | src/cluster_erp/modules/production/operation_types/routes.py:85 |
DELETE |
/api/v1/production/operation-types/{type_id} |
delete_operation_type |
routing.delete |
none | none | none | 204 |
src/cluster_erp/modules/production/operation_types/routes.py:99 |
POST |
/api/v1/production/operation-types/bulk-delete |
bulk_delete_operation_types |
routing.bulk_delete |
BulkDeleteRequest |
none | BulkDeleteResponse |
200 (default) | src/cluster_erp/modules/production/operation_types/routes.py:110 |
POST |
/api/v1/production/operation-types/seed-defaults |
seed_defaults |
routing.create |
none | none | dict |
200 (default) | src/cluster_erp/modules/production/operation_types/routes.py:121 |
Routings endpoints¶
Routing records, scaffold from a BOM (plan and apply), copy to, readiness, full read, status change, operations, operation inputs, and prep operations.
| Method | Path | Handler | Permission | Request | Query | Response | Status | Source |
|---|---|---|---|---|---|---|---|---|
GET |
/api/v1/production/routings/ |
list_routings |
routing.read |
none | search, product_id, status, limit, offset |
dict |
200 (default) | src/cluster_erp/modules/production/routings/routes.py:46 |
POST |
/api/v1/production/routings/ |
create_routing |
routing.create |
RoutingCreate |
none | RoutingRead |
201 |
src/cluster_erp/modules/production/routings/routes.py:74 |
POST |
/api/v1/production/routings/scaffold-from-bom |
scaffold_routing_from_bom |
routing.create |
RoutingScaffoldRequest |
none | dict |
200 (default) | src/cluster_erp/modules/production/routings/routes.py:86 |
POST |
/api/v1/production/routings/scaffold-tree-from-bom |
scaffold_routing_tree_from_bom |
routing.create |
RoutingScaffoldTreeRequest |
none | dict |
200 (default) | src/cluster_erp/modules/production/routings/routes.py:117 |
POST |
/api/v1/production/routings/scaffold-plan |
scaffold_plan |
routing.create |
ScaffoldPlanRequest |
none | dict |
200 (default) | src/cluster_erp/modules/production/routings/routes.py:155 |
POST |
/api/v1/production/routings/scaffold-apply |
scaffold_apply |
routing.create |
ScaffoldApplyRequest |
none | dict |
200 (default) | src/cluster_erp/modules/production/routings/routes.py:207 |
POST |
/api/v1/production/routings/{routing_id}/copy-to |
copy_routing_to |
routing.create |
RoutingCopyToRequest |
none | dict |
200 (default) | src/cluster_erp/modules/production/routings/routes.py:263 |
GET |
/api/v1/production/routings/for-product/{product_id} |
get_routing_for_product |
routing.read |
none | include_draft |
RoutingRead |
200 (default) | src/cluster_erp/modules/production/routings/routes.py:298 |
GET |
/api/v1/production/routings/{routing_id}/readiness |
get_routing_readiness |
routing.read |
none | none | dict |
200 (default) | src/cluster_erp/modules/production/routings/routes.py:319 |
GET |
/api/v1/production/routings/{routing_id}/full |
get_routing_full |
routing.read |
none | none | dict |
200 (default) | src/cluster_erp/modules/production/routings/routes.py:333 |
GET |
/api/v1/production/routings/{routing_id} |
get_routing |
routing.read |
none | none | RoutingRead |
200 (default) | src/cluster_erp/modules/production/routings/routes.py:344 |
PUT |
/api/v1/production/routings/{routing_id} |
update_routing |
routing.update |
RoutingUpdate |
none | RoutingRead |
200 (default) | src/cluster_erp/modules/production/routings/routes.py:358 |
POST |
/api/v1/production/routings/{routing_id}/status |
change_routing_status |
routing.update |
RoutingStatusUpdate |
none | RoutingRead |
200 (default) | src/cluster_erp/modules/production/routings/routes.py:373 |
POST |
/api/v1/production/routings/bulk-delete |
bulk_delete_routings |
routing.bulk_delete |
BulkDeleteRequest |
none | BulkDeleteResponse |
200 (default) | src/cluster_erp/modules/production/routings/routes.py:386 |
DELETE |
/api/v1/production/routings/{routing_id} |
delete_routing |
routing.delete |
none | none | none | 204 |
src/cluster_erp/modules/production/routings/routes.py:398 |
GET |
/api/v1/production/routings/operations/all |
list_all_operations |
routing.read |
none | routing_id, limit, offset |
dict |
200 (default) | src/cluster_erp/modules/production/routings/routes.py:415 |
POST |
/api/v1/production/routings/operations/ |
create_operation_flat |
routing.update |
RoutingOperationFlatCreate |
none | RoutingOperationRead |
201 |
src/cluster_erp/modules/production/routings/routes.py:463 |
PUT |
/api/v1/production/routings/operations/{operation_id} |
update_operation_flat |
routing.update |
RoutingOperationUpdate |
none | RoutingOperationRead |
200 (default) | src/cluster_erp/modules/production/routings/routes.py:475 |
DELETE |
/api/v1/production/routings/operations/{operation_id} |
delete_operation_flat |
routing.update |
none | none | none | 204 |
src/cluster_erp/modules/production/routings/routes.py:490 |
POST |
/api/v1/production/routings/{routing_id}/operations |
add_operation |
routing.update |
RoutingOperationCreate |
none | RoutingOperationRead |
201 |
src/cluster_erp/modules/production/routings/routes.py:502 |
PUT |
/api/v1/production/routings/{routing_id}/operations/{operation_id} |
update_operation |
routing.update |
RoutingOperationUpdate |
none | RoutingOperationRead |
200 (default) | src/cluster_erp/modules/production/routings/routes.py:519 |
DELETE |
/api/v1/production/routings/{routing_id}/operations/{operation_id} |
delete_operation |
routing.update |
none | none | none | 204 |
src/cluster_erp/modules/production/routings/routes.py:538 |
POST |
/api/v1/production/routings/{routing_id}/operations/{operation_id}/inputs |
add_operation_input |
routing.update |
OperationInputCreate |
none | dict |
201 |
src/cluster_erp/modules/production/routings/routes.py:559 |
DELETE |
/api/v1/production/routings/{routing_id}/operations/{operation_id}/inputs/{input_id} |
delete_operation_input |
routing.update |
none | none | none | 204 |
src/cluster_erp/modules/production/routings/routes.py:593 |
GET |
/api/v1/production/routings/{routing_id}/prep-operations |
list_prep_operations |
routing.read |
none | none | dict |
200 (default) | src/cluster_erp/modules/production/routings/routes.py:621 |
POST |
/api/v1/production/routings/{routing_id}/prep-operations |
create_prep_operation |
routing.update |
PrepOperationCreate |
none | PrepOperationRead |
201 |
src/cluster_erp/modules/production/routings/routes.py:636 |
PUT |
/api/v1/production/routings/{routing_id}/prep-operations/{prep_id} |
update_prep_operation |
routing.update |
PrepOperationUpdate |
none | PrepOperationRead |
200 (default) | src/cluster_erp/modules/production/routings/routes.py:653 |
DELETE |
/api/v1/production/routings/{routing_id}/prep-operations/{prep_id} |
delete_prep_operation |
routing.update |
none | none | none | 204 |
src/cluster_erp/modules/production/routings/routes.py:672 |
Routing templates and cut rules endpoints¶
Two routers: routing templates with template operations, and cut technology rules.
| Method | Path | Handler | Permission | Request | Query | Response | Status | Source |
|---|---|---|---|---|---|---|---|---|
GET |
/api/v1/production/routing-templates/ops/all |
list_template_ops |
routing_template_op.read |
none | template_id, limit, offset |
dict |
200 (default) | src/cluster_erp/modules/production/routing_templates/routes.py:42 |
POST |
/api/v1/production/routing-templates/ops/ |
create_template_op |
routing_template_op.create |
RoutingTemplateOpCreate |
none | RoutingTemplateOpRead |
201 |
src/cluster_erp/modules/production/routing_templates/routes.py:61 |
PUT |
/api/v1/production/routing-templates/ops/{op_id} |
update_template_op |
routing_template_op.update |
RoutingTemplateOpUpdate |
none | RoutingTemplateOpRead |
200 (default) | src/cluster_erp/modules/production/routing_templates/routes.py:74 |
DELETE |
/api/v1/production/routing-templates/ops/{op_id} |
delete_template_op |
routing_template_op.delete |
none | none | none | 204 |
src/cluster_erp/modules/production/routing_templates/routes.py:88 |
GET |
/api/v1/production/routing-templates/ |
list_routing_templates |
routing_template.read |
none | active_only, search, limit, offset |
dict |
200 (default) | src/cluster_erp/modules/production/routing_templates/routes.py:104 |
POST |
/api/v1/production/routing-templates/ |
create_routing_template |
routing_template.create |
RoutingTemplateCreate |
none | RoutingTemplateRead |
201 |
src/cluster_erp/modules/production/routing_templates/routes.py:129 |
GET |
/api/v1/production/routing-templates/{template_id} |
get_routing_template |
routing_template.read |
none | none | RoutingTemplateRead |
200 (default) | src/cluster_erp/modules/production/routing_templates/routes.py:140 |
PUT |
/api/v1/production/routing-templates/{template_id} |
update_routing_template |
routing_template.update |
RoutingTemplateUpdate |
none | RoutingTemplateRead |
200 (default) | src/cluster_erp/modules/production/routing_templates/routes.py:153 |
DELETE |
/api/v1/production/routing-templates/{template_id} |
delete_routing_template |
routing_template.delete |
none | none | none | 204 |
src/cluster_erp/modules/production/routing_templates/routes.py:167 |
POST |
/api/v1/production/routing-templates/bulk-delete |
bulk_delete_routing_templates |
routing_template.delete |
BulkDeleteRequest |
none | BulkDeleteResponse |
200 (default) | src/cluster_erp/modules/production/routing_templates/routes.py:178 |
GET |
/api/v1/production/cut-technology-rules/ |
list_cut_technology_rules |
cut_technology_rule.read |
none | limit, offset |
dict |
200 (default) | src/cluster_erp/modules/production/routing_templates/routes.py:194 |
POST |
/api/v1/production/cut-technology-rules/ |
create_cut_technology_rule |
cut_technology_rule.create |
CutTechnologyRuleCreate |
none | CutTechnologyRuleRead |
201 |
src/cluster_erp/modules/production/routing_templates/routes.py:212 |
GET |
/api/v1/production/cut-technology-rules/{rule_id} |
get_cut_technology_rule |
cut_technology_rule.read |
none | none | CutTechnologyRuleRead |
200 (default) | src/cluster_erp/modules/production/routing_templates/routes.py:223 |
PUT |
/api/v1/production/cut-technology-rules/{rule_id} |
update_cut_technology_rule |
cut_technology_rule.update |
CutTechnologyRuleUpdate |
none | CutTechnologyRuleRead |
200 (default) | src/cluster_erp/modules/production/routing_templates/routes.py:236 |
DELETE |
/api/v1/production/cut-technology-rules/{rule_id} |
delete_cut_technology_rule |
cut_technology_rule.delete |
none | none | none | 204 |
src/cluster_erp/modules/production/routing_templates/routes.py:250 |
POST |
/api/v1/production/cut-technology-rules/bulk-delete |
bulk_delete_cut_technology_rules |
cut_technology_rule.delete |
BulkDeleteRequest |
none | BulkDeleteResponse |
200 (default) | src/cluster_erp/modules/production/routing_templates/routes.py:261 |
Production versions endpoints¶
Production version records.
| Method | Path | Handler | Permission | Request | Query | Response | Status | Source |
|---|---|---|---|---|---|---|---|---|
GET |
/api/v1/production/production-versions/ |
list_production_versions |
routing.read |
none | product_id, status, limit, offset |
dict |
200 (default) | src/cluster_erp/modules/production/production_versions/routes.py:87 |
POST |
/api/v1/production/production-versions/ |
create_production_version |
routing.create |
PvCreate |
none | PvRead |
201 |
src/cluster_erp/modules/production/production_versions/routes.py:122 |
PUT |
/api/v1/production/production-versions/{pv_id} |
update_production_version |
routing.update |
PvUpdate |
none | PvRead |
200 (default) | src/cluster_erp/modules/production/production_versions/routes.py:190 |
DELETE |
/api/v1/production/production-versions/{pv_id} |
delete_production_version |
routing.update |
none | none | none | 204 |
src/cluster_erp/modules/production/production_versions/routes.py:233 |
Capacity endpoints¶
Capacity load and input-output reads.
| Method | Path | Handler | Permission | Request | Query | Response | Status | Source |
|---|---|---|---|---|---|---|---|---|
GET |
/api/v1/production/capacity/load |
capacity_load |
production_order.read |
none | weeks, mode |
dict |
200 (default) | src/cluster_erp/modules/production/capacity/routes.py:18 |
GET |
/api/v1/production/capacity/input-output |
capacity_input_output |
production_order.read |
none | weeks |
dict |
200 (default) | src/cluster_erp/modules/production/capacity/routes.py:34 |
Component allocations endpoints¶
Component allocation records.
| Method | Path | Handler | Permission | Request | Query | Response | Status | Source |
|---|---|---|---|---|---|---|---|---|
GET |
/api/v1/production/component-allocations/ |
list_allocations |
routing.read |
none | routing_id, routing_operation_id, bom_version_id, input_kind, product_id, limit, offset |
dict |
200 (default) | src/cluster_erp/modules/production/component_allocations/routes.py:29 |
POST |
/api/v1/production/component-allocations/ |
create_allocation |
routing.update |
ComponentAllocationCreate |
none | ComponentAllocationRead |
201 |
src/cluster_erp/modules/production/component_allocations/routes.py:61 |
GET |
/api/v1/production/component-allocations/{allocation_id} |
get_allocation |
routing.read |
none | none | ComponentAllocationRead |
200 (default) | src/cluster_erp/modules/production/component_allocations/routes.py:73 |
PUT |
/api/v1/production/component-allocations/{allocation_id} |
update_allocation |
routing.update |
ComponentAllocationUpdate |
none | ComponentAllocationRead |
200 (default) | src/cluster_erp/modules/production/component_allocations/routes.py:87 |
DELETE |
/api/v1/production/component-allocations/{allocation_id} |
delete_allocation |
routing.update |
none | none | none | 204 |
src/cluster_erp/modules/production/component_allocations/routes.py:102 |
POST |
/api/v1/production/component-allocations/bulk-delete |
bulk_delete_allocations |
routing.bulk_delete |
BulkDeleteRequest |
none | BulkDeleteResponse |
200 (default) | src/cluster_erp/modules/production/component_allocations/routes.py:114 |
Production orders endpoints¶
Order records, work order generation, status change, complete, cancel, hold, material consumption, order operations, and order components.
| Method | Path | Handler | Permission | Request | Query | Response | Status | Source |
|---|---|---|---|---|---|---|---|---|
GET |
/api/v1/production/production-orders/operations/all |
list_order_operations |
production_order.read |
none | production_order_id, limit, offset |
dict |
200 (default) | src/cluster_erp/modules/production/production_orders/routes.py:42 |
POST |
/api/v1/production/production-orders/{order_id}/generate-work-orders |
generate_work_orders |
work_order.create |
none | none | dict |
200 (default) | src/cluster_erp/modules/production/production_orders/routes.py:102 |
GET |
/api/v1/production/production-orders/ |
list_production_orders |
production_order.read |
none | search, product_id, project_id, status, planned_start_from, planned_start_to, limit, offset |
dict |
200 (default) | src/cluster_erp/modules/production/production_orders/routes.py:130 |
POST |
/api/v1/production/production-orders/ |
create_production_order |
production_order.create |
ProductionOrderCreate |
none | ProductionOrderRead |
201 |
src/cluster_erp/modules/production/production_orders/routes.py:164 |
GET |
/api/v1/production/production-orders/{order_id} |
get_production_order |
production_order.read |
none | none | ProductionOrderRead |
200 (default) | src/cluster_erp/modules/production/production_orders/routes.py:176 |
PUT |
/api/v1/production/production-orders/{order_id} |
update_production_order |
production_order.update |
ProductionOrderUpdate |
none | ProductionOrderRead |
200 (default) | src/cluster_erp/modules/production/production_orders/routes.py:190 |
POST |
/api/v1/production/production-orders/{order_id}/status |
change_order_status |
production_order.update |
ProductionOrderStatusUpdate |
none | ProductionOrderRead |
200 (default) | src/cluster_erp/modules/production/production_orders/routes.py:205 |
POST |
/api/v1/production/production-orders/{order_id}/complete |
complete_production_order |
production_order.update |
ProductionOrderCompleteData |
none | ProductionOrderRead |
200 (default) | src/cluster_erp/modules/production/production_orders/routes.py:218 |
POST |
/api/v1/production/production-orders/{order_id}/cancel |
cancel_production_order |
production_order.update |
ProductionOrderCancelData |
none | ProductionOrderRead |
200 (default) | src/cluster_erp/modules/production/production_orders/routes.py:231 |
POST |
/api/v1/production/production-orders/{order_id}/hold |
hold_production_order |
production_order.update |
ProductionOrderHoldData |
none | ProductionOrderRead |
200 (default) | src/cluster_erp/modules/production/production_orders/routes.py:244 |
POST |
/api/v1/production/production-orders/bulk-delete |
bulk_delete_production_orders |
production_order.bulk_delete |
BulkDeleteRequest |
none | BulkDeleteResponse |
200 (default) | src/cluster_erp/modules/production/production_orders/routes.py:257 |
DELETE |
/api/v1/production/production-orders/{order_id} |
delete_production_order |
production_order.delete |
none | none | none | 204 |
src/cluster_erp/modules/production/production_orders/routes.py:269 |
POST |
/api/v1/production/production-orders/{order_id}/consume-material |
consume_material |
production_order.update |
MaterialConsumptionCreate |
none | ProductionOrderComponentRead |
200 (default) | src/cluster_erp/modules/production/production_orders/routes.py:286 |
PUT |
/api/v1/production/production-orders/{order_id}/operations/{operation_id} |
update_operation |
production_order.update |
ProductionOrderOperationUpdate |
none | ProductionOrderOperationRead |
200 (default) | src/cluster_erp/modules/production/production_orders/routes.py:307 |
POST |
/api/v1/production/production-orders/{order_id}/components |
add_component |
production_order.update |
ProductionOrderComponentCreate |
none | ProductionOrderComponentRead |
201 |
src/cluster_erp/modules/production/production_orders/routes.py:331 |
PUT |
/api/v1/production/production-orders/{order_id}/components/{component_id} |
update_component |
production_order.update |
ProductionOrderComponentUpdate |
none | ProductionOrderComponentRead |
200 (default) | src/cluster_erp/modules/production/production_orders/routes.py:348 |
DELETE |
/api/v1/production/production-orders/{order_id}/components/{component_id} |
delete_component |
production_order.update |
none | none | none | 204 |
src/cluster_erp/modules/production/production_orders/routes.py:367 |
Work orders endpoints¶
Work order records, start, complete, and cancel.
| Method | Path | Handler | Permission | Request | Query | Response | Status | Source |
|---|---|---|---|---|---|---|---|---|
GET |
/api/v1/production/work-orders/ |
list_work_orders |
work_order.read |
none | production_order_id, work_center_id, status, assigned_employee_id, search, limit, offset |
dict |
200 (default) | src/cluster_erp/modules/production/work_orders/routes.py:26 |
POST |
/api/v1/production/work-orders/ |
create_work_order |
work_order.create |
WorkOrderCreate |
none | WorkOrderRead |
201 |
src/cluster_erp/modules/production/work_orders/routes.py:52 |
GET |
/api/v1/production/work-orders/{work_order_id} |
get_work_order |
work_order.read |
none | none | WorkOrderRead |
200 (default) | src/cluster_erp/modules/production/work_orders/routes.py:64 |
PUT |
/api/v1/production/work-orders/{work_order_id} |
update_work_order |
work_order.update |
WorkOrderUpdate |
none | WorkOrderRead |
200 (default) | src/cluster_erp/modules/production/work_orders/routes.py:78 |
DELETE |
/api/v1/production/work-orders/{work_order_id} |
delete_work_order |
work_order.delete |
none | none | none | 204 |
src/cluster_erp/modules/production/work_orders/routes.py:97 |
POST |
/api/v1/production/work-orders/{work_order_id}/start |
start_work_order |
work_order.update |
none | none | WorkOrderRead |
200 (default) | src/cluster_erp/modules/production/work_orders/routes.py:112 |
POST |
/api/v1/production/work-orders/{work_order_id}/complete |
complete_work_order |
work_order.update |
WorkOrderComplete |
none | WorkOrderRead |
200 (default) | src/cluster_erp/modules/production/work_orders/routes.py:127 |
POST |
/api/v1/production/work-orders/{work_order_id}/cancel |
cancel_work_order |
work_order.update |
none | none | WorkOrderRead |
200 (default) | src/cluster_erp/modules/production/work_orders/routes.py:144 |
Scheduling endpoints¶
The scheduling board, manual and automatic scheduling of work and production orders, and a recompute after a calendar change.
| Method | Path | Handler | Permission | Request | Query | Response | Status | Source |
|---|---|---|---|---|---|---|---|---|
GET |
/api/v1/production/scheduling/board |
scheduling_board |
work_order.read |
none | date_from, date_to, work_center_id, production_order_id, project_id, scope |
BoardResponse |
200 (default) | src/cluster_erp/modules/production/scheduling/routes.py:41 |
PUT |
/api/v1/production/scheduling/work-orders/{work_order_id}/schedule |
schedule_work_order |
work_order.update |
WorkOrderScheduleUpdate |
none | WorkOrderRead |
200 (default) | src/cluster_erp/modules/production/scheduling/routes.py:87 |
POST |
/api/v1/production/scheduling/work-orders/{work_order_id}/auto-schedule |
auto_schedule_work_order |
work_order.update |
WorkOrderAutoScheduleRequest |
none | WorkOrderRead |
200 (default) | src/cluster_erp/modules/production/scheduling/routes.py:110 |
POST |
/api/v1/production/scheduling/production-orders/{order_id}/auto-schedule |
auto_schedule_production_order |
work_order.update |
ProductionOrderAutoScheduleRequest |
none | CascadeResult |
200 (default) | src/cluster_erp/modules/production/scheduling/routes.py:136 |
POST |
/api/v1/production/scheduling/recompute |
recompute_after_calendar_change |
work_order.update |
RecomputeRequest |
none | RecomputeResult |
200 (default) | src/cluster_erp/modules/production/scheduling/routes.py:175 |
Error codes¶
The table lists the error codes that code under src/cluster_erp/modules/production/ raises, found by a syntax-tree scan for AppError(...), the factories in src/cluster_erp/core/errors.py (not_found, conflict, protected, permission_denied, privilege_escalation, check_version), and HTTPException(...). A status of 400 is the AppError default (src/cluster_erp/core/errors.py:23). Guard errors (401, 403), the entitlement codes, and validation errors (422) apply to every route and are listed on Errors.
| Code | HTTP status | Raised in | First site |
|---|---|---|---|
CONCURRENCY_VERSION_CONFLICT |
409 |
component_allocations, operation_types, production_orders, production_versions, routing_templates, scheduling, work_orders |
src/cluster_erp/modules/production/component_allocations/services.py:174 |
PRODUCTION_BOM_EMPTY |
422 |
routings |
src/cluster_erp/modules/production/routings/scaffold.py:207 |
PRODUCTION_BOM_REQUIRED |
422 |
routings |
src/cluster_erp/modules/production/routings/scaffold.py:199 |
PRODUCTION_CUT_RULE_EXISTS |
422 |
routing_templates |
src/cluster_erp/modules/production/routing_templates/services.py:268 |
PRODUCTION_INSUFFICIENT_MATERIAL |
400 |
production_orders |
src/cluster_erp/modules/production/production_orders/services.py:763 |
PRODUCTION_MATERIAL_CONSUMPTION_FAILED |
400 |
production_orders |
src/cluster_erp/modules/production/production_orders/services.py:798 |
PRODUCTION_OPERATION_NO_MATERIAL_IO |
422 |
component_allocations |
src/cluster_erp/modules/production/component_allocations/services.py:513 |
PRODUCTION_ORDER_EXISTS_FOR_PROJECT_PRODUCT |
422 |
module |
src/cluster_erp/modules/production/module.py:675 |
PRODUCTION_ORDER_INVALID_STATUS |
400, 422 |
production_orders, work_orders |
src/cluster_erp/modules/production/production_orders/services.py:450 |
PRODUCTION_PRODUCT_NOT_MANUFACTURABLE |
400 |
production_orders, routings |
src/cluster_erp/modules/production/production_orders/services.py:152 |
PRODUCTION_ROUTING_INCOMPLETE |
422 |
routings |
src/cluster_erp/modules/production/routings/scaffold.py:1703 |
PRODUCTION_ROUTING_REQUIRED |
400 |
routings |
src/cluster_erp/modules/production/routings/services.py:621 |
PRODUCTION_SCHEDULE_INVALID_RANGE |
422 |
scheduling |
src/cluster_erp/modules/production/scheduling/routes.py:58 |
PRODUCTION_SCHEDULE_NO_SLOT |
422 |
scheduling |
src/cluster_erp/modules/production/scheduling/services.py:716 |
PRODUCTION_WORK_ORDER_INVALID_STATUS |
422 |
scheduling, work_orders |
src/cluster_erp/modules/production/scheduling/services.py:324 |
PRODUCTION_WORK_ORDER_QTY_EXCEEDED |
422 |
work_orders |
src/cluster_erp/modules/production/work_orders/services.py:372 |
RESOURCE_NOT_FOUND |
404, 422 |
component_allocations, operation_types, production_orders, production_versions, routing_templates, routings, scheduling, work_centers, work_orders |
src/cluster_erp/modules/production/component_allocations/routes.py:83 |
SCAFFOLD_ANSWER_REQUIRED |
422 |
routings |
src/cluster_erp/modules/production/routings/scaffold.py:1099 |
SCAFFOLD_CHANGE_PROTECTED |
422 |
routings |
src/cluster_erp/modules/production/routings/scaffold.py:1806 |
SCAFFOLD_COPY_SAME_TARGET |
422 |
routings |
src/cluster_erp/modules/production/routings/scaffold.py:2124 |
SCAFFOLD_PLAN_STALE |
409 |
routings |
src/cluster_erp/modules/production/routings/scaffold.py:1065 |
SCAFFOLD_ROUTING_EXISTS |
409 |
routings |
src/cluster_erp/modules/production/routings/scaffold.py:1144 |
SCAFFOLD_TEMPLATE_AMBIGUOUS |
422 |
routings |
src/cluster_erp/modules/production/routings/scaffold.py:522 |
VALIDATION_ERROR |
422 |
production_versions, routing_templates |
src/cluster_erp/modules/production/production_versions/routes.py:56 |
Events emitted¶
The table lists the contract classes that code under src/cluster_erp/modules/production/ passes directly to EventBus.emit, found by a syntax-tree scan. Events built in a variable first are not counted. The contracts are described in Contracts reference.
| Contract | Sites | First site |
|---|---|---|
MaterialConsumed |
1 | src/cluster_erp/modules/production/production_orders/services.py:812 |
ProductionOrderCancelled |
1 | src/cluster_erp/modules/production/production_orders/services.py:572 |
ProductionOrderCompleted |
1 | src/cluster_erp/modules/production/production_orders/services.py:716 |
ProductionOrderCreated |
1 | src/cluster_erp/modules/production/production_orders/services.py:227 |
ProductionOrderOnHold |
1 | src/cluster_erp/modules/production/production_orders/services.py:616 |
ProductionOrderStatusChanged |
4 | src/cluster_erp/modules/production/production_orders/services.py:519 |
WorkOrderCompleted |
1 | src/cluster_erp/modules/production/work_orders/services.py:404 |
Related pages¶
Verified against commit 92f8051 on 2026-11-13.