The design_engineering module in src/cluster_erp/modules/design_engineering/ holds designs and engineering change notes (ECN). A design belongs to a project, can name the part it describes, links its drawing, 3D model, and DXF documents, and goes through review and approval. An approved design is locked; a change goes through an ECN, which creates the next design version and supersedes the old one. Approving a design with a part makes the bom module create a BOM card.
At a glance¶
| Item | Value | Source |
|---|---|---|
| Package | src/cluster_erp/modules/design_engineering/ |
folder |
| Module class | Module |
src/cluster_erp/modules/design_engineering/module.py:15 |
name / version |
design_engineering / 0.1.0 |
src/cluster_erp/modules/design_engineering/module.py:16-22 |
| API prefix | /api/v1/design_engineering (ModuleBase.api_prefix) |
src/cluster_erp/core/module_base.py:37-38 |
| Sub-modules | 2: designs, ecns |
folder listing |
| Tables | 2: design_engineering_designs, design_engineering_ecns |
src/cluster_erp/modules/design_engineering/designs/models.py:18, src/cluster_erp/modules/design_engineering/ecns/models.py:18 |
| Entities in metadata | 2: design, ecn |
src/cluster_erp/modules/design_engineering/module.py:146-149 |
| Routes | 20 route decorators in the package | grep for @router. |
| Web app presence | Catalogue app design-engineering |
src/cluster_erp/modules/app_store/catalog.json (entry design-engineering) |
| Desktop presence | Generic widgets only; no folder in src/cluster_erp/desktop/modules/ |
folder |
What the module does¶
- Records designs of type
concept,detail, ormanufacturing, each with a number, a project, an optional part, a version number, CAD file entries, document links, specifications, and a description (src/cluster_erp/modules/design_engineering/designs/models.py:17-78,src/cluster_erp/modules/design_engineering/designs/schemas.py:9). - Moves a design through review and approval (
src/cluster_erp/modules/design_engineering/designs/services.py:37-41). - Records change notes against approved designs and implements them as new design versions (
src/cluster_erp/modules/design_engineering/ecns/services.py:94-111,src/cluster_erp/modules/design_engineering/ecns/services.py:252-314). - Answers other modules' questions about a design (
src/cluster_erp/modules/design_engineering/module.py:49-92).
Sub-modules¶
| Sub-module | Purpose | Main entities | Router | Source |
|---|---|---|---|---|
designs |
Designs and their lifecycle | Design |
/api/v1/design_engineering/designs |
src/cluster_erp/modules/design_engineering/designs/routes.py:31 |
ecns |
Engineering change notes | Ecn |
/api/v1/design_engineering/ecns |
src/cluster_erp/modules/design_engineering/ecns/routes.py:30 |
Data model¶
| Entity | Table | Key fields | Notes | Source |
|---|---|---|---|---|
Design |
design_engineering_designs |
design_no, project_id, part_id, type, status, parent_design_id, version_no, created_by_user_id, reviewed_by, approved_by, approved_at, cad_files, drawing_pdf_doc_id, model_3d_doc_id, dxf_doc_id, specs, description, extra |
design_no unique; parent_design_id points at the earlier version |
src/cluster_erp/modules/design_engineering/designs/models.py:17-78 |
Ecn |
design_engineering_ecns |
ecn_no, design_id, reason, impact, status, proposed_by, approved_by, approved_at, rejected_by, rejected_at, implemented_by, implemented_at, new_design_id, extra |
ecn_no unique |
src/cluster_erp/modules/design_engineering/ecns/models.py:17-57 |
project_id and part_id are plain UUID columns. The module asks no other module about them; a grep for query contracts constructed in the package finds none.
Screens and metadata¶
get_metadata declares a sidebar group Design & Engineering (Turkish Tasarım & Mühendislik) with two lists, Designs and Change Notes (src/cluster_erp/modules/design_engineering/module.py:109-150). Both entities accept tenant-defined fields in extra (src/cluster_erp/modules/design_engineering/designs/models.py:19-22, src/cluster_erp/modules/design_engineering/ecns/models.py:19-22).
Status and actions¶
Design statuses are draft, in_review, approved, and superseded (src/cluster_erp/modules/design_engineering/designs/schemas.py:10). ECN statuses are proposed, approved, rejected, and implemented (src/cluster_erp/modules/design_engineering/ecns/schemas.py:9).
| Action | Label | Condition | Endpoint | Permission | Source |
|---|---|---|---|---|---|
design submit_review |
Submit for Review | status is draft |
POST /designs/{id}/submit-review |
design.create |
src/cluster_erp/modules/design_engineering/designs/metadata.py:52-62, src/cluster_erp/modules/design_engineering/designs/routes.py:144-153 |
design approve |
Approve | status is in_review |
POST /designs/{id}/approve |
design.approve |
src/cluster_erp/modules/design_engineering/designs/metadata.py:63-73, src/cluster_erp/modules/design_engineering/designs/routes.py:156-165 |
design reject |
Reject | status is in_review |
POST /designs/{id}/reject |
design.approve |
src/cluster_erp/modules/design_engineering/designs/metadata.py:74-84, src/cluster_erp/modules/design_engineering/designs/routes.py:168-177 |
ECN approve |
Approve | status is proposed |
POST /ecns/{id}/approve |
ecn.approve |
src/cluster_erp/modules/design_engineering/ecns/metadata.py:52-62, src/cluster_erp/modules/design_engineering/ecns/routes.py:141-150 |
ECN reject |
Reject | status is proposed |
POST /ecns/{id}/reject |
ecn.approve |
src/cluster_erp/modules/design_engineering/ecns/metadata.py:63-73, src/cluster_erp/modules/design_engineering/ecns/routes.py:153-162 |
ECN implement |
Implement | status is approved |
POST /ecns/{id}/implement |
ecn.approve |
src/cluster_erp/modules/design_engineering/ecns/metadata.py:74-84, src/cluster_erp/modules/design_engineering/ecns/routes.py:165-174 |
The diagram shows both lifecycles.
stateDiagram-v2
state Design {
[*] --> draft
draft --> in_review: submit_review
in_review --> approved: approve
in_review --> draft: reject
approved --> superseded: ECN implement
}
state ECN {
[*] --> proposed
proposed --> approved_ecn: approve
proposed --> rejected: reject
approved_ecn --> implemented: implement
}In prose: a design starts as draft, is submitted to in_review, and is then approved or sent back to draft (src/cluster_erp/modules/design_engineering/designs/services.py:37-41). An approved design becomes superseded only when an ECN against it is implemented. An ECN starts as proposed and is approved or rejected; an approved ECN can be implemented (src/cluster_erp/modules/design_engineering/ecns/services.py:29-32). In the diagram, approved_ecn stands for the ECN status approved.
Business rules¶
- A design of type
conceptcannot be approved; the answer isDESIGN_CONCEPT_NO_APPROVAL(src/cluster_erp/modules/design_engineering/designs/services.py:282-287). - Approval commits the transaction before
DesignApprovedis emitted, so that the BOM created by the subscriber depends on a stored approval; the code comment states this reason (src/cluster_erp/modules/design_engineering/designs/services.py:298-315). - An approved or superseded design cannot be edited (
src/cluster_erp/modules/design_engineering/designs/services.py:189-199); only a draft design can be deleted (src/cluster_erp/modules/design_engineering/designs/services.py:229-233). - An ECN can be created only for an approved design (
src/cluster_erp/modules/design_engineering/ecns/services.py:94-111); only a proposed ECN can be edited or deleted (src/cluster_erp/modules/design_engineering/ecns/services.py:150-153,src/cluster_erp/modules/design_engineering/ecns/services.py:184-187). - Implementing an ECN creates a new draft design with the next version number, the same project, part, type, files, and specifications, and the old design as parent; the old design becomes
superseded; the ECN stores the new design id (src/cluster_erp/modules/design_engineering/ecns/services.py:252-314). design_noandecn_nocome from the yearly sequencesdesignandecn(src/cluster_erp/modules/design_engineering/designs/services.py:144,src/cluster_erp/modules/design_engineering/ecns/services.py:112).GET /designs/{id}/filesreturns the CAD file list and the three document ids (src/cluster_erp/modules/design_engineering/designs/services.py:108-117).
Events and queries¶
The module consumes 2 contracts and produces 6, counted as on the parties module page.
| Direction | Contract class | Handler or emitter | Source |
|---|---|---|---|
| emits | DesignCreated |
DesignService.create |
src/cluster_erp/modules/design_engineering/designs/services.py:167-175 |
| emits | DesignApproved |
DesignService.approve |
src/cluster_erp/modules/design_engineering/designs/services.py:307-315 |
| emits | DesignSuperseded |
DesignService.supersede |
src/cluster_erp/modules/design_engineering/designs/services.py:348-355 |
| emits | EcnProposed, EcnApproved, EcnImplemented |
EcnService.create, .approve, .implement |
src/cluster_erp/modules/design_engineering/ecns/services.py:128, src/cluster_erp/modules/design_engineering/ecns/services.py:227-236, src/cluster_erp/modules/design_engineering/ecns/services.py:304-312 |
| answers query | GetDesignById |
_handle_get_design |
src/cluster_erp/modules/design_engineering/module.py:53, src/cluster_erp/modules/design_engineering/module.py:56-77 |
| answers query | IsDesignApproved |
_handle_is_design_approved |
src/cluster_erp/modules/design_engineering/module.py:54, src/cluster_erp/modules/design_engineering/module.py:79-92 |
DesignApproved is consumed by the bom module, which creates a BOM card for the design's part; see BOM module. The contracts reference finds no consumer for the other five events at this commit.
Permissions¶
| Permission key | Used by | Source |
|---|---|---|
design.read |
design reads, file list, ECN list per design, ECN reads | src/cluster_erp/modules/design_engineering/designs/routes.py:52-196, src/cluster_erp/modules/design_engineering/ecns/routes.py:50-79 |
design.create |
design create, update, delete, bulk delete, submit for review | src/cluster_erp/modules/design_engineering/designs/routes.py:96-147 |
design.approve |
design approve and reject | src/cluster_erp/modules/design_engineering/designs/routes.py:159-171 |
ecn.propose |
ECN create, update, delete, bulk delete | src/cluster_erp/modules/design_engineering/ecns/routes.py:93-132 |
ecn.approve |
ECN approve, reject, implement | src/cluster_erp/modules/design_engineering/ecns/routes.py:144-168 |
Privacy, retention, and history¶
The module stores user ids of authors and approvers but no personal fields of its own, and it has no privacy_handlers.py. Changes are captured by change history.
Analytics facts¶
This module has no analytics_facts.py.
Settings and reference data¶
The module has no settings section and seeds nothing (src/cluster_erp/modules/design_engineering/module.py:28-30). Design types and statuses are fixed literals in the schemas (src/cluster_erp/modules/design_engineering/designs/schemas.py:9-10).
Tests¶
Found by a grep for design_engineering in tests/ and web-client/.
| Kind | File | Covers |
|---|---|---|
| e2e | web-client/_e2e_deseng_currencies.mjs |
the design engineering app and its actions in the web app |
| e2e | web-client/_e2e_tenant_fields_phase4b.mjs, web-client/_e2e_tenant_fields_phase4c.mjs |
tenant-defined fields on design records |
No pytest file imports the module.
Discrepancies¶
Terms introduced¶
| Term | Code identifier | Definition | Turkish term | Source |
|---|---|---|---|---|
| design | Design |
A versioned engineering design of a part within a project. | Tasarım | src/cluster_erp/modules/design_engineering/designs/models.py:17 |
| engineering change note | Ecn |
A recorded change to an approved design that, once implemented, creates its next version. | Değişiklik notu | src/cluster_erp/modules/design_engineering/ecns/models.py:17 |
| design type | type |
concept, detail, or manufacturing; concept designs cannot be approved. |
Tasarım türü | src/cluster_erp/modules/design_engineering/designs/schemas.py:9 |
Related pages¶
Verified against commit 92f8051 on 2026-11-13.