This page continues Errors. It lists the code constants of the business sections of src/cluster_erp/core/errors.py, from CRM to procurement, with the status, raise-site count, first site, and message found by the syntax-tree scan described there. A code with no raise site is defined but not raised by any scanned call.
Codes by business area¶
One table per comment section of the file.
CRM¶
| Code | Defined at | HTTP status | Raise sites | First site | Message at first site |
|---|---|---|---|---|---|
RFQ_INVALID_STATUS |
src/cluster_erp/core/errors.py:88 |
409 |
1 | src/cluster_erp/modules/crm/rfqs/services.py:291 |
Action '{action}' is not allowed while the RFQ is '{rfq.status}' |
RFQ_PACKAGE_INCOMPLETE |
src/cluster_erp/core/errors.py:89 |
- | 0 | - | - |
RFQ_INCOMPLETE |
src/cluster_erp/core/errors.py:90 |
409 |
1 | src/cluster_erp/modules/crm/rfqs/services.py:340 |
'RFQ is incomplete: ' + '; '.join((r.label_en for r in missing)) |
PRFQ_INVALID_STATUS |
src/cluster_erp/core/errors.py:92 |
409 |
12 | src/cluster_erp/modules/procurement/purchase_rfqs/services.py:188 |
Cannot edit an RFQ in status '{rfq.status}' |
PRFQ_INCOMPLETE |
src/cluster_erp/core/errors.py:93 |
409 |
1 | src/cluster_erp/modules/procurement/purchase_rfqs/services.py:299 |
'RFQ is incomplete: ' + '; '.join((r.label_en for r in missing)) |
PRFQ_AWARD_INVALID |
src/cluster_erp/core/errors.py:94 |
422 |
5 | src/cluster_erp/modules/procurement/purchase_rfqs/services.py:778 |
Quotation line references a line not in this RFQ |
PURQ_INVALID_STATUS |
src/cluster_erp/core/errors.py:96 |
409 |
4 | src/cluster_erp/modules/purchasing_quotations/quotations/services.py:233 |
Cannot delete a quotation in status '{q.status}' |
PURQ_INCOMPLETE |
src/cluster_erp/core/errors.py:97 |
409 |
1 | src/cluster_erp/modules/purchasing_quotations/quotations/services.py:276 |
'Quotation is incomplete: ' + '; '.join((r.label_en for r in missing)) |
PURQ_AWARD_INVALID |
src/cluster_erp/core/errors.py:98 |
422 |
2 | src/cluster_erp/modules/purchasing_quotations/quotations/services.py:305 |
Award references a line not in this quotation |
PCON_INVALID_STATUS |
src/cluster_erp/core/errors.py:100 |
409 |
3 | src/cluster_erp/modules/procurement/purchase_contracts/services.py:203 |
Cannot delete a contract in status '{c.status}' |
PCON_INCOMPLETE |
src/cluster_erp/core/errors.py:101 |
409 |
1 | src/cluster_erp/modules/procurement/purchase_contracts/services.py:246 |
'Contract is incomplete: ' + '; '.join((r.label_en for r in missing)) |
RFQ_DECLINED |
src/cluster_erp/core/errors.py:102 |
- | 0 | - | - |
RFQ_ARIBA_DUE_DATE_IMMUTABLE |
src/cluster_erp/core/errors.py:103 |
400 |
1 | src/cluster_erp/modules/crm/rfqs/services.py:225 |
Due date cannot be changed for Ariba-sourced RFQs |
RFQ_DUPLICATE_SUBJECT |
src/cluster_erp/core/errors.py:104 |
409 |
1 | src/cluster_erp/modules/crm/rfqs/services.py:521 |
An RFQ with the same subject for this customer exists within the last {window_days} days |
Quotations¶
| Code | Defined at | HTTP status | Raise sites | First site | Message at first site |
|---|---|---|---|---|---|
QUOTE_INVALID_STATUS |
src/cluster_erp/core/errors.py:107 |
400, 409 |
8 | src/cluster_erp/modules/quotations/quotes/services.py:474 |
Quote must be in pending_mgmt_approval status |
QUOTE_NOT_APPROVED |
src/cluster_erp/core/errors.py:108 |
400 |
2 | src/cluster_erp/modules/quotations/quotes/services.py:564 |
Management approval is required before sending |
QUOTE_IMMUTABLE_AFTER_SENT |
src/cluster_erp/core/errors.py:109 |
400 |
3 | src/cluster_erp/modules/quotations/line_items/services.py:266 |
Line items cannot be modified after the quote is sent |
QUOTE_ACTIVE_EXISTS |
src/cluster_erp/core/errors.py:110 |
409 |
1 | src/cluster_erp/modules/quotations/quotes/services.py:1312 |
An active quote already exists for this RFQ |
QUOTE_FEASIBILITY_NOT_DONE |
src/cluster_erp/core/errors.py:111 |
- | 0 | - | - |
QUOTE_BOM_REQUIRED |
src/cluster_erp/core/errors.py:112 |
- | 0 | - | - |
QUOTE_COSTING_REQUIRED |
src/cluster_erp/core/errors.py:113 |
- | 0 | - | - |
QUOTE_MGMT_APPROVAL_REQUIRED |
src/cluster_erp/core/errors.py:114 |
400 |
1 | src/cluster_erp/modules/quotations/quotes/services.py:505 |
Management approval meeting must be scheduled first |
QUOTE_INCOMPLETE |
src/cluster_erp/core/errors.py:117 |
409 |
1 | src/cluster_erp/modules/quotations/quotes/services.py:583 |
'Quotation is incomplete: ' + '; '.join((r.label_en for r in missing)) |
Sales orders¶
| Code | Defined at | HTTP status | Raise sites | First site | Message at first site |
|---|---|---|---|---|---|
ORDER_INVALID_STATUS |
src/cluster_erp/core/errors.py:120 |
400, 409, 422 |
25 | src/cluster_erp/modules/sales_orders/orders/services.py:194 |
Quote must be sent before a sales order can reference it |
ORDER_PO_CHECK_REQUIRED |
src/cluster_erp/core/errors.py:121 |
400 |
1 | src/cluster_erp/modules/sales_orders/orders/services.py:603 |
A passing PO check is required before accepting the order |
ORDER_ALREADY_OPENED |
src/cluster_erp/core/errors.py:122 |
- | 0 | - | - |
UNIT_LIMIT_EXCEEDED |
src/cluster_erp/core/errors.py:124 |
409, 422 |
3 | src/cluster_erp/modules/sales_orders/units/services.py:201 |
Order line {line.line_no} has a fractional quantity ({ordered}); units exist only for whol... |
UNIT_FROZEN |
src/cluster_erp/core/errors.py:125 |
409 |
1 | src/cluster_erp/modules/sales_orders/units/services.py:283 |
Unit {unit.code} is {unit.status}: its identifiers are printed on issued documents and can... |
SHIPMENT_INVALID_STATUS |
src/cluster_erp/core/errors.py:126 |
400 |
2 | src/cluster_erp/modules/sales_orders/shipments/services.py:1062 |
Cannot move shipment {shipment.code} from '{shipment.status}' to '{target}' |
SHIPMENT_CHECK_FAILED |
src/cluster_erp/core/errors.py:127 |
409, 422 |
4 | src/cluster_erp/modules/sales_orders/shipments/services.py:810 |
Unit {unit.code} is {unit.status} and cannot be shipped again |
TRADE_DOCUMENT_BLOCKED |
src/cluster_erp/core/errors.py:128 |
404, 422 |
5 | src/cluster_erp/modules/sales_orders/trade_documents/services.py:66 |
The document number template {template} needs {name} but the shipment has no value for i... |
PDF_RENDERER_UNAVAILABLE |
src/cluster_erp/core/errors.py:129 |
503 |
2 | src/cluster_erp/core/pdf_render.py:73 |
PDF rendering needs the playwright package (see pyproject) |
Projects¶
| Code | Defined at | HTTP status | Raise sites | First site | Message at first site |
|---|---|---|---|---|---|
PROJECT_INVALID_STATUS |
src/cluster_erp/core/errors.py:132 |
400 |
1 | src/cluster_erp/modules/projects/projects/services.py:305 |
Cannot transition from '{project.status}' to '{target}' |
PROJECT_KICKOFF_NOT_DONE |
src/cluster_erp/core/errors.py:133 |
- | 0 | - | - |
PROJECT_SCHEDULE_NOT_DRAFT |
src/cluster_erp/core/errors.py:134 |
400 |
4 | src/cluster_erp/modules/projects/schedules/services.py:78 |
Only draft schedules can be updated |
PROJECT_ACTION_ALREADY_CLOSED |
src/cluster_erp/core/errors.py:135 |
400 |
1 | src/cluster_erp/modules/projects/actions/services.py:161 |
Action is already in terminal status '{action.status}' |
PROJECT_ACTIVITY_INVALID |
src/cluster_erp/core/errors.py:136 |
404, 422 |
6 | src/cluster_erp/modules/projects/activities/services.py:100 |
Schedule not found |
PROJECT_ACTIVITY_CYCLE |
src/cluster_erp/core/errors.py:137 |
422 |
2 | src/cluster_erp/modules/projects/activities/services.py:186 |
An activity cannot depend on itself |
PROJECT_ACTION_INVALID_TRANSITION |
src/cluster_erp/core/errors.py:138 |
400 |
1 | src/cluster_erp/modules/projects/actions/services.py:167 |
Cannot transition from '{action.status}' to '{target}' |
PROJECT_FIXTURE_INVALID_TRANSITION |
src/cluster_erp/core/errors.py:139 |
400 |
1 | src/cluster_erp/modules/projects/fixtures/services.py:139 |
Cannot transition from '{fixture.status}' to '{target}' |
BOM¶
| Code | Defined at | HTTP status | Raise sites | First site | Message at first site |
|---|---|---|---|---|---|
BOM_INVALID_STATUS |
src/cluster_erp/core/errors.py:142 |
400 |
9 | src/cluster_erp/modules/bom/bom_versions/services.py:314 |
Only draft versions can be deleted. |
BOM_ACTIVE_VERSION_EXISTS |
src/cluster_erp/core/errors.py:143 |
400 |
1 | src/cluster_erp/modules/bom/bom_versions/services.py:439 |
This BOM already has an active version. Supersede it before activating a new one. |
BOM_ACTIVE_VERSION_LOCKED |
src/cluster_erp/core/errors.py:144 |
400 |
3 | src/cluster_erp/modules/bom/bom_items/services.py:415 |
BOM version is '{version.status}'. Only draft versions can be modified. |
BOM_LABOR_MISSING |
src/cluster_erp/core/errors.py:145 |
- | 0 | - | - |
BOM_MAX_DEPTH_EXCEEDED |
src/cluster_erp/core/errors.py:146 |
400 |
8 | src/cluster_erp/modules/bom/bom_items/services.py:174 |
Maximum BOM depth of {MAX_BOM_DEPTH} levels exceeded. |
BOM_INVALID_QTY |
src/cluster_erp/core/errors.py:147 |
400 |
4 | src/cluster_erp/modules/bom/bom_items/services.py:142 |
BOM item quantity must be greater than zero. |
BOM_TEMPLATE_EMPTY |
src/cluster_erp/core/errors.py:148 |
400 |
1 | src/cluster_erp/modules/bom/bom_versions/services.py:569 |
The template has no items to copy. |
BOM_VERSION_EMPTY |
src/cluster_erp/core/errors.py:151 |
422 |
1 | src/cluster_erp/modules/bom/bom_versions/services.py:664 |
This BOM version has no items; add components before releasing it. |
Design and engineering¶
| Code | Defined at | HTTP status | Raise sites | First site | Message at first site |
|---|---|---|---|---|---|
DESIGN_INVALID_STATUS |
src/cluster_erp/core/errors.py:154 |
400 |
3 | src/cluster_erp/modules/design_engineering/designs/services.py:230 |
Only draft designs can be deleted. |
DESIGN_LOCKED_APPROVED |
src/cluster_erp/core/errors.py:155 |
400 |
2 | src/cluster_erp/modules/design_engineering/designs/services.py:191 |
Approved designs cannot be edited. Use ECN for changes. |
DESIGN_CONCEPT_NO_APPROVAL |
src/cluster_erp/core/errors.py:156 |
400 |
1 | src/cluster_erp/modules/design_engineering/designs/services.py:284 |
Concept designs cannot be approved. They are for quotation phase only. |
DESIGN_NOT_APPROVED_FOR_BOM |
src/cluster_erp/core/errors.py:157 |
- | 0 | - | - |
ECN_INVALID_STATUS |
src/cluster_erp/core/errors.py:158 |
400 |
4 | src/cluster_erp/modules/design_engineering/ecns/services.py:151 |
Only proposed ECNs can be edited. |
ECN_DESIGN_NOT_APPROVED |
src/cluster_erp/core/errors.py:159 |
400 |
1 | src/cluster_erp/modules/design_engineering/ecns/services.py:107 |
ECN can only be created for approved designs. |
Products and materials¶
| Code | Defined at | HTTP status | Raise sites | First site | Message at first site |
|---|---|---|---|---|---|
PRODUCT_INVALID_MATERIAL_TYPE |
src/cluster_erp/core/errors.py:162 |
- | 0 | - | - |
PRODUCT_CAPABILITY_VIOLATION |
src/cluster_erp/core/errors.py:163 |
400 |
1 | src/cluster_erp/modules/products_and_services/products/services.py:679 |
Material type '{material_type}' requires {flag}={required} |
PRODUCT_NOT_PURCHASABLE |
src/cluster_erp/core/errors.py:164 |
- | 0 | - | - |
PRODUCT_NOT_SELLABLE |
src/cluster_erp/core/errors.py:165 |
- | 0 | - | - |
PRODUCT_NOT_MANUFACTURABLE |
src/cluster_erp/core/errors.py:166 |
- | 0 | - | - |
PRODUCT_NOT_STOCKABLE |
src/cluster_erp/core/errors.py:167 |
- | 0 | - | - |
PRODUCT_BLOCKED |
src/cluster_erp/core/errors.py:168 |
- | 0 | - | - |
PRODUCT_INVALID_STATUS |
src/cluster_erp/core/errors.py:169 |
- | 0 | - | - |
PRODUCT_IN_ACTIVE_BOM |
src/cluster_erp/core/errors.py:172 |
422 |
1 | src/cluster_erp/modules/products_and_services/products/services.py:620 |
The product is a component of an active BOM version; supersede or archive that BOM first. |
PRODUCT_MODEL_DEFAULT_PROTECTED |
src/cluster_erp/core/errors.py:176 |
409 |
4 | src/cluster_erp/modules/products_and_services/product_models/services.py:123 |
The default model cannot be demoted; set another model as default instead |
PRODUCT_VERSION_DEFAULT_PROTECTED |
src/cluster_erp/core/errors.py:177 |
409 |
4 | src/cluster_erp/modules/products_and_services/product_versions/services.py:102 |
The default version cannot be demoted; set another version as default instead |
PRODUCT_MODEL_PRODUCT_MISMATCH |
src/cluster_erp/core/errors.py:178 |
- | 0 | - | - |
PRODUCT_VERSION_MODEL_MISMATCH |
src/cluster_erp/core/errors.py:179 |
- | 0 | - | - |
Inventory¶
| Code | Defined at | HTTP status | Raise sites | First site | Message at first site |
|---|---|---|---|---|---|
INVENTORY_INSUFFICIENT_STOCK |
src/cluster_erp/core/errors.py:182 |
400 |
8 | src/cluster_erp/modules/inventory/stock/services.py:853 |
Insufficient stock in the source segment |
INVENTORY_INVALID_MOVEMENT_TYPE |
src/cluster_erp/core/errors.py:183 |
400 |
1 | src/cluster_erp/modules/inventory/stock/services.py:332 |
Invalid movement type: {movement_type} |
INVENTORY_INVALID_MOVEMENT |
src/cluster_erp/core/errors.py:184 |
409, 422 |
5 | src/cluster_erp/modules/inventory/stock/services.py:553 |
Source and target stock ownership are the same |
INVENTORY_PROJECT_TRANSFER_DISABLED |
src/cluster_erp/core/errors.py:185 |
403 |
1 | src/cluster_erp/modules/inventory/stock/services.py:563 |
Project-to-project stock transfer is disabled by configuration |
INVENTORY_BATCH_REQUIRED |
src/cluster_erp/core/errors.py:186 |
400 |
1 | src/cluster_erp/modules/inventory/stock/services.py:2143 |
Batch ID is required for batch-managed products |
INVENTORY_SERIAL_REQUIRED |
src/cluster_erp/core/errors.py:187 |
400 |
1 | src/cluster_erp/modules/inventory/stock/services.py:2149 |
Serial number is required for serial-tracked products |
INVENTORY_BATCH_EXPIRED |
src/cluster_erp/core/errors.py:188 |
400 |
2 | src/cluster_erp/modules/inventory/stock/services.py:2166 |
Batch is blocked |
INVENTORY_SERIAL_ALREADY_USED |
src/cluster_erp/core/errors.py:189 |
409 |
2 | src/cluster_erp/modules/inventory/batches/services.py:349 |
Serial number '{serial_number}' already exists |
INVENTORY_PRODUCT_NOT_STOCKABLE |
src/cluster_erp/core/errors.py:190 |
400 |
3 | src/cluster_erp/modules/inventory/batches/services.py:210 |
Product is not stockable |
INVENTORY_MOVEMENT_ALREADY_REVERSED |
src/cluster_erp/core/errors.py:191 |
400 |
2 | src/cluster_erp/modules/inventory/stock/services.py:1742 |
This movement has already been reversed |
INVENTORY_PO_RECEIPT_REQUIRES_PO_FLOW |
src/cluster_erp/core/errors.py:192 |
409 |
1 | src/cluster_erp/modules/inventory/stock/routes.py:174 |
Goods for a purchase order must be received via the purchase-order receive flow, not the r... |
INVENTORY_RESERVATION_NOT_FOUND |
src/cluster_erp/core/errors.py:193 |
404 |
2 | src/cluster_erp/modules/inventory/stock/services.py:1985 |
Reservation not found |
INVENTORY_RESERVATION_ALREADY_CONSUMED |
src/cluster_erp/core/errors.py:194 |
400 |
1 | src/cluster_erp/modules/inventory/stock/services.py:1992 |
Reservation already consumed |
INVENTORY_RESERVATION_ALREADY_CANCELLED |
src/cluster_erp/core/errors.py:195 |
400 |
2 | src/cluster_erp/modules/inventory/stock/services.py:1998 |
Reservation already cancelled |
INVENTORY_NEGATIVE_STOCK |
src/cluster_erp/core/errors.py:196 |
- | 0 | - | - |
INVENTORY_INVALID_STOCK_CATEGORY |
src/cluster_erp/core/errors.py:197 |
400 |
4 | src/cluster_erp/modules/inventory/stock/services.py:1211 |
Invalid source stock category: {data.from_category} |
INVENTORY_INVALID_CATEGORY_TRANSFER |
src/cluster_erp/core/errors.py:198 |
400 |
1 | src/cluster_erp/modules/inventory/stock/services.py:1223 |
Transfer from '{data.from_category}' to '{data.to_category}' is not permitted |
INVENTORY_INVALID_DECISION_CODE |
src/cluster_erp/core/errors.py:199 |
400 |
1 | src/cluster_erp/modules/inventory/stock/services.py:1502 |
Invalid decision code: {data.decision_code} |
INVENTORY_MOVEMENT_NOT_DECIDABLE |
src/cluster_erp/core/errors.py:200 |
400 |
1 | src/cluster_erp/modules/inventory/stock/services.py:1515 |
Only GR blocked or goods receipt movements can have usage decisions |
INVENTORY_DECISION_QTY_EXCEEDS |
src/cluster_erp/core/errors.py:201 |
400 |
1 | src/cluster_erp/modules/inventory/stock/services.py:1527 |
Decision quantity exceeds remaining undecided quantity |
INVENTORY_INVALID_ORIGIN_TYPE |
src/cluster_erp/core/errors.py:202 |
400 |
1 | src/cluster_erp/modules/inventory/batches/services.py:189 |
Invalid origin type: {origin_type} |
Production¶
| Code | Defined at | HTTP status | Raise sites | First site | Message at first site |
|---|---|---|---|---|---|
PRODUCTION_ORDER_INVALID_STATUS |
src/cluster_erp/core/errors.py:205 |
400, 422 |
11 | src/cluster_erp/modules/production/production_orders/services.py:450 |
Production order can only be updated in planned or released status |
PRODUCTION_WORK_ORDER_INVALID_STATUS |
src/cluster_erp/core/errors.py:206 |
422 |
5 | src/cluster_erp/modules/production/scheduling/services.py:324 |
Only pending work orders can be scheduled. |
PRODUCTION_WORK_ORDER_QTY_EXCEEDED |
src/cluster_erp/core/errors.py:207 |
422 |
2 | src/cluster_erp/modules/production/work_orders/services.py:372 |
Completed + scrapped quantity cannot exceed the work order quantity. |
CRM_RFQ_LINE_NO_PRODUCT |
src/cluster_erp/core/errors.py:208 |
422 |
1 | src/cluster_erp/modules/crm/rfq_line_materials/services.py:108 |
The RFQ line is not linked to a product (via a customer part), so no BOM can be resolved. |
PROJECTS_ITEM_NO_PRODUCT |
src/cluster_erp/core/errors.py:209 |
422 |
1 | src/cluster_erp/modules/projects/items/routes.py:119 |
The project item needs a product (with its model/version breakdown) and a positive quantit... |
PRODUCTION_ORDER_EXISTS_FOR_PROJECT_PRODUCT |
src/cluster_erp/core/errors.py:210 |
422 |
1 | src/cluster_erp/modules/production/module.py:675 |
An open production order ({existing.order_no}) already exists for this project and product... |
CRM_RFQ_BOM_MATERIALS_EMPTY |
src/cluster_erp/core/errors.py:211 |
422 |
1 | src/cluster_erp/modules/crm/rfq_line_materials/services.py:119 |
The product has no active BOM or its BOM carries no material specifications. |
SALES_ORDER_LINE_NO_PRODUCT |
src/cluster_erp/core/errors.py:214 |
422 |
1 | src/cluster_erp/modules/sales_orders/order_lines/routes.py:143 |
The order line needs a catalogue product with its model/version breakdown before a bill of... |
PRODUCTION_PRODUCT_NOT_MANUFACTURABLE |
src/cluster_erp/core/errors.py:215 |
400 |
2 | src/cluster_erp/modules/production/production_orders/services.py:152 |
Product is not manufacturable |
PRODUCTION_BOM_REQUIRED |
src/cluster_erp/core/errors.py:216 |
422 |
2 | src/cluster_erp/modules/production/routings/scaffold.py:199 |
No active BOM version exists for this product breakdown. |
PRODUCTION_BOM_EMPTY |
src/cluster_erp/core/errors.py:219 |
422 |
1 | src/cluster_erp/modules/production/routings/scaffold.py:207 |
The active BOM version has no live items. |
PRODUCTION_WORK_CENTER_REQUIRED |
src/cluster_erp/core/errors.py:220 |
- | 0 | - | - |
PRODUCTION_OPERATION_NO_MATERIAL_IO |
src/cluster_erp/core/errors.py:221 |
422 |
1 | src/cluster_erp/modules/production/component_allocations/services.py:513 |
Operation type '{op_type.code}' is a process step and does not stage material inputs/outpu... |
PRODUCTION_ROUTING_REQUIRED |
src/cluster_erp/core/errors.py:222 |
400 |
1 | src/cluster_erp/modules/production/routings/services.py:621 |
Cannot transition routing from '{routing.status}' to '{new_status}' |
PRODUCTION_ORDER_NO_COMPONENTS |
src/cluster_erp/core/errors.py:223 |
- | 0 | - | - |
PRODUCTION_MATERIAL_CONSUMPTION_FAILED |
src/cluster_erp/core/errors.py:224 |
400 |
1 | src/cluster_erp/modules/production/production_orders/services.py:798 |
Failed to issue goods from inventory: {e} |
PRODUCTION_INSUFFICIENT_MATERIAL |
src/cluster_erp/core/errors.py:225 |
400 |
1 | src/cluster_erp/modules/production/production_orders/services.py:763 |
Consumption qty exceeds remaining requirement |
PRODUCTION_ROUTING_INCOMPLETE |
src/cluster_erp/core/errors.py:230 |
422 |
2 | src/cluster_erp/modules/production/routings/scaffold.py:1703 |
The routing has no live operation to attach new inputs to. |
ROUTING_OP_NO_WORK_CENTER |
src/cluster_erp/core/errors.py:231 |
- | 0 | - | - |
ROUTING_OP_NO_TYPE |
src/cluster_erp/core/errors.py:232 |
- | 0 | - | - |
ROUTING_OP_NO_TIME |
src/cluster_erp/core/errors.py:233 |
- | 0 | - | - |
ROUTING_PREP_NO_TYPE |
src/cluster_erp/core/errors.py:238 |
- | 0 | - | - |
SCAFFOLD_PLAN_STALE |
src/cluster_erp/core/errors.py:244 |
409 |
3 | src/cluster_erp/modules/production/routings/scaffold.py:1065 |
The BOM changed after this plan was prepared. Refresh the plan. |
SCAFFOLD_ANSWER_REQUIRED |
src/cluster_erp/core/errors.py:245 |
422 |
6 | src/cluster_erp/modules/production/routings/scaffold.py:1099 |
A routing name is required to create the routing. |
SCAFFOLD_ROUTING_EXISTS |
src/cluster_erp/core/errors.py:246 |
409 |
2 | src/cluster_erp/modules/production/routings/scaffold.py:1144 |
A live routing already exists for this product breakdown. |
SCAFFOLD_CHANGE_PROTECTED |
src/cluster_erp/core/errors.py:249 |
422 |
1 | src/cluster_erp/modules/production/routings/scaffold.py:1806 |
A user-touched row can only be flagged, never overwritten. |
SCAFFOLD_TEMPLATE_AMBIGUOUS |
src/cluster_erp/core/errors.py:254 |
422 |
1 | src/cluster_erp/modules/production/routings/scaffold.py:522 |
More than one routing template matches this product at the same specificity. Disambiguate ... |
SCAFFOLD_COPY_SAME_TARGET |
src/cluster_erp/core/errors.py:258 |
422 |
1 | src/cluster_erp/modules/production/routings/scaffold.py:2124 |
The copy target is the same product breakdown the source routing already builds. |
PRODUCTION_CUT_RULE_EXISTS |
src/cluster_erp/core/errors.py:261 |
422 |
1 | src/cluster_erp/modules/production/routing_templates/services.py:268 |
A live cut technology rule already exists for this material type and stock form. |
PRODUCTION_SCHEDULE_NO_SLOT |
src/cluster_erp/core/errors.py:262 |
422 |
1 | src/cluster_erp/modules/production/scheduling/services.py:716 |
No free working-time slot was found within the search horizon. |
PRODUCTION_SCHEDULE_INVALID_RANGE |
src/cluster_erp/core/errors.py:263 |
422 |
2 | src/cluster_erp/modules/production/scheduling/routes.py:58 |
date_to must be after date_from. |
PRODUCTION_SCHEDULE_INVALID_TIMEZONE |
src/cluster_erp/core/errors.py:264 |
- | 0 | - | - |
Nesting¶
| Code | Defined at | HTTP status | Raise sites | First site | Message at first site |
|---|---|---|---|---|---|
NESTING_INVALID_STATUS |
src/cluster_erp/core/errors.py:267 |
400 |
11 | src/cluster_erp/modules/nesting/integration/services.py:179 |
Cannot import results in '{job.status}' status |
NESTING_LOW_UTILIZATION |
src/cluster_erp/core/errors.py:268 |
400 |
1 | src/cluster_erp/modules/nesting/nesting_jobs/services.py:333 |
Utilization is {job.utilization_pct}%, below {self._low_util_threshold}% threshold. Acknow... |
NESTING_PART_TOO_LARGE |
src/cluster_erp/core/errors.py:269 |
400 |
2 | src/cluster_erp/modules/nesting/nesting_parts/services.py:100 |
Part bounding box ({data.part_length_mm}x{data.part_width_mm}) exceeds usable sheet area (... |
NESTING_NO_PARTS |
src/cluster_erp/core/errors.py:270 |
400 |
1 | src/cluster_erp/modules/nesting/nesting_jobs/services.py:692 |
No source orders linked to this nesting job |
NESTING_NOT_COMPLETED |
src/cluster_erp/core/errors.py:271 |
400 |
2 | src/cluster_erp/modules/nesting/nesting_jobs/services.py:321 |
Only completed jobs can be approved |
NESTING_ALREADY_APPROVED |
src/cluster_erp/core/errors.py:272 |
400 |
1 | src/cluster_erp/modules/nesting/nesting_jobs/services.py:323 |
Job is already approved |
NESTING_ORDER_MATERIAL_MISMATCH |
src/cluster_erp/core/errors.py:273 |
400 |
1 | src/cluster_erp/modules/nesting/nesting_jobs/services.py:728 |
Order {order_data.get('order_no', order_id)} material ({order_material}/{order_thickness}m... |
NESTING_IMPORT_INVALID_PARTS |
src/cluster_erp/core/errors.py:274 |
400 |
6 | src/cluster_erp/modules/nesting/integration/services.py:91 |
Placed part {pl.nesting_part_id} extends outside the sheet |
NESTING_IMPORT_FAILED |
src/cluster_erp/core/errors.py:275 |
400 |
1 | src/cluster_erp/modules/nesting/integration/services.py:345 |
Failed to import nesting result: {exc} |
NESTING_REMNANT_INVALID_STATUS |
src/cluster_erp/core/errors.py:276 |
400 |
2 | src/cluster_erp/modules/nesting/nesting_remnants/services.py:189 |
Cannot consume remnant in '{remnant.status}' status |
NESTING_MATERIAL_NOT_RESERVED |
src/cluster_erp/core/errors.py:277 |
400 |
1 | src/cluster_erp/modules/nesting/nesting_jobs/services.py:478 |
Material must be reserved before consuming |
NESTING_MATERIAL_ALREADY_RESERVED |
src/cluster_erp/core/errors.py:278 |
400 |
1 | src/cluster_erp/modules/nesting/nesting_jobs/services.py:410 |
Material is already reserved for this job |
NESTING_MATERIAL_ALREADY_CONSUMED |
src/cluster_erp/core/errors.py:279 |
400 |
1 | src/cluster_erp/modules/nesting/nesting_jobs/services.py:476 |
Material already consumed for this job |
NESTING_COST_MISSING_UNIT_PRICE |
src/cluster_erp/core/errors.py:280 |
400 |
1 | src/cluster_erp/modules/nesting/nesting_jobs/services.py:588 |
Cost per unit area is not set and could not be derived |
Costing¶
| Code | Defined at | HTTP status | Raise sites | First site | Message at first site |
|---|---|---|---|---|---|
COSTING_NOT_FOUND |
src/cluster_erp/core/errors.py:283 |
404 |
3 | src/cluster_erp/modules/costing/costing_analyses/services.py:103 |
Costing analysis not found |
COSTING_INVALID_STATUS |
src/cluster_erp/core/errors.py:284 |
400 |
2 | src/cluster_erp/modules/costing/costing_analyses/services.py:113 |
Cannot transition from '{current}' to '{target}' |
COSTING_BOM_NOT_FOUND |
src/cluster_erp/core/errors.py:285 |
404 |
1 | src/cluster_erp/modules/costing/costing_analyses/services.py:272 |
BOM version not found or has no explosion data |
COSTING_BOM_NOT_ACTIVE |
src/cluster_erp/core/errors.py:286 |
- | 0 | - | - |
COSTING_BOM_NO_ITEMS |
src/cluster_erp/core/errors.py:287 |
400 |
1 | src/cluster_erp/modules/costing/costing_analyses/services.py:287 |
BOM explosion returned no items to cost |
COSTING_CURRENCY_MISMATCH |
src/cluster_erp/core/errors.py:288 |
422 |
1 | src/cluster_erp/modules/costing/costing_analyses/services.py:307 |
Rate currency '{r_cur}' does not match the analysis currency '{analysis.currency}'. |
AUTH_SELF_APPROVAL_FORBIDDEN |
src/cluster_erp/core/errors.py:289 |
403 |
3 | src/cluster_erp/modules/auth/approvals/services.py:314 |
You cannot decide your own approval request. |
COSTING_NOT_CALCULATED |
src/cluster_erp/core/errors.py:290 |
- | 0 | - | - |
COSTING_FINAL_PRICE_REQUIRED |
src/cluster_erp/core/errors.py:291 |
400 |
1 | src/cluster_erp/modules/costing/costing_analyses/services.py:751 |
Either final_price or suggested_price must be set before submission |
COSTING_IMMUTABLE |
src/cluster_erp/core/errors.py:292 |
400 |
2 | src/cluster_erp/modules/costing/costing_analyses/services.py:120 |
Analysis in '{analysis.status}' status cannot be modified |
COSTING_RATE_NOT_FOUND |
src/cluster_erp/core/errors.py:293 |
- | 0 | - | - |
COSTING_RATE_OVERLAP |
src/cluster_erp/core/errors.py:294 |
- | 0 | - | - |
COSTING_RATE_INVALID_DATES |
src/cluster_erp/core/errors.py:295 |
400 |
2 | src/cluster_erp/modules/costing/labor_rates/services.py:160 |
valid_to must be on or after valid_from |
COSTING_COMPARE_MIN_ITEMS |
src/cluster_erp/core/errors.py:296 |
400 |
1 | src/cluster_erp/modules/costing/costing_analyses/services.py:976 |
At least 2 analyses required for comparison |
COSTING_COMPARE_MAX_ITEMS |
src/cluster_erp/core/errors.py:297 |
400 |
1 | src/cluster_erp/modules/costing/costing_analyses/services.py:967 |
Cannot compare more than 5 analyses |
COSTING_SCENARIO_SOURCE_INVALID |
src/cluster_erp/core/errors.py:298 |
400 |
1 | src/cluster_erp/modules/costing/costing_analyses/services.py:1039 |
Source analysis must be calculated or approved |
COSTING_SUPERSEDE_SAME_BOM |
src/cluster_erp/core/errors.py:299 |
400 |
1 | src/cluster_erp/modules/costing/costing_analyses/services.py:874 |
Superseding analysis must reference the same BOM |
Procurement¶
| Code | Defined at | HTTP status | Raise sites | First site | Message at first site |
|---|---|---|---|---|---|
PR_INVALID_STATUS |
src/cluster_erp/core/errors.py:302 |
400 |
7 | src/cluster_erp/modules/procurement/purchase_requests/services.py:115 |
Cannot transition from '{current}' to '{target}' |
PR_NO_ITEMS |
src/cluster_erp/core/errors.py:303 |
400 |
1 | src/cluster_erp/modules/procurement/purchase_requests/services.py:469 |
Cannot remove the last item from a purchase request |
PR_APPROVAL_THRESHOLD |
src/cluster_erp/core/errors.py:304 |
- | 0 | - | - |
PO_INVALID_STATUS |
src/cluster_erp/core/errors.py:305 |
400, 409 |
11 | src/cluster_erp/modules/procurement/purchase_orders/services.py:86 |
Cannot transition from '{current}' to '{target}' |
PO_VENDOR_BLACKLISTED |
src/cluster_erp/core/errors.py:306 |
400 |
1 | src/cluster_erp/modules/procurement/purchase_orders/services.py:233 |
Vendor is blacklisted |
PO_NO_TECHNICAL_ATTACHMENT |
src/cluster_erp/core/errors.py:307 |
400 |
1 | src/cluster_erp/modules/procurement/purchase_orders/services.py:637 |
Purchase order requires a technical attachment before sending |
PO_NO_ORDER_DATE |
src/cluster_erp/core/errors.py:308 |
400 |
1 | src/cluster_erp/modules/procurement/purchase_orders/services.py:630 |
Purchase order requires an order date before sending |
PO_RECEIVE_QTY_EXCEEDS |
src/cluster_erp/core/errors.py:309 |
400 |
1 | src/cluster_erp/modules/procurement/purchase_orders/services.py:743 |
Received qty ({new_received}) exceeds ordered qty ({item.qty_ordered}) |
PO_ITEM_ALREADY_RECEIVED |
src/cluster_erp/core/errors.py:310 |
400 |
1 | src/cluster_erp/modules/procurement/purchase_orders/services.py:735 |
Item has already been fully received |
PO_GOODS_RECEIPT_FAILED |
src/cluster_erp/core/errors.py:311 |
400 |
2 | src/cluster_erp/modules/procurement/purchase_orders/services.py:821 |
Goods receipt posting failed |
MRP_RUN_FAILED |
src/cluster_erp/core/errors.py:312 |
400, 500 |
4 | src/cluster_erp/modules/procurement/mrp/engine.py:3931 |
Product has no default model/version breakdown; every product must carry one |
MRP_RUN_IN_PROGRESS |
src/cluster_erp/core/errors.py:313 |
409 |
3 | src/cluster_erp/modules/procurement/mrp/services.py:172 |
An MRP run is already in progress |
MRP_RUN_NOT_COMPLETED |
src/cluster_erp/core/errors.py:314 |
409 |
5 | src/cluster_erp/modules/procurement/mrp/services.py:341 |
Cannot create PR from run with status '{run.status}' |
MRP_NO_PRODUCTS_IN_SCOPE |
src/cluster_erp/core/errors.py:315 |
- | 0 | - | - |
MRP_ITEMS_ALREADY_ACTIONED |
src/cluster_erp/core/errors.py:316 |
409 |
3 | src/cluster_erp/modules/procurement/mrp/services.py:370 |
{len(actioned)} item(s) already have actions taken |
MRP_RUN_STALE |
src/cluster_erp/core/errors.py:317 |
409 |
1 | src/cluster_erp/modules/procurement/mrp/services.py:347 |
MRP run data is stale — re-run MRP before creating purchase requests |
MRP_ITEMS_ALREADY_FIRMED |
src/cluster_erp/core/errors.py:318 |
409 |
1 | src/cluster_erp/modules/procurement/mrp/services.py:1314 |
{len(already_firmed)} item(s) already firmed |
SUBSTITUTION_GROUP_DUPLICATE_PRODUCT |
src/cluster_erp/core/errors.py:319 |
409 |
1 | src/cluster_erp/modules/procurement/substitution_groups/services.py:221 |
Product already exists in this substitution group |
SUBSTITUTION_GROUP_SINGLE_MEMBER |
src/cluster_erp/core/errors.py:320 |
400 |
1 | src/cluster_erp/modules/procurement/substitution_groups/services.py:317 |
Cannot remove the last member from a substitution group |
CRITICAL_MATERIAL_ALREADY_EXISTS |
src/cluster_erp/core/errors.py:321 |
409 |
1 | src/cluster_erp/modules/procurement/critical_materials/services.py:86 |
Product is already registered as a critical material |
Related pages¶
Verified against commit 92f8051 on 2026-11-13.