PLM / ECO
Engineering Change Orders with per-type stage workflows, approval gates, and BOM change line tracking. Full audit trail from Draft to Closed.
Maintenance
Equipment register with preventive/corrective maintenance requests. Auto-computed next maintenance dates. Integration with downtime tracking.
Downtime Tracking
Categorized downtime records (availability/performance/quality/external) linked to production orders and maintenance requests for OEE computation.
NCR
Non-Conformance Reports with Kanban stage pipeline, defect codes, disposition workflow, and escalation to CAPA quality alerts in Pro module.
Calibration
Instrument register with auto-computed validity status (valid/due_soon/overdue), NABL certificate storage, and calibration schedule management.
Tool & Die
Tool/die lifecycle tracking with shot/hours/cycles counters, visual progress bars, and automated retirement detection based on max life thresholds.
MPS
Master Production Schedule with weekly/monthly time buckets. Demand entry, stock-on-hand tracking, auto-computed procurement requirements.
Job Work
Subcontracting (Job Work) orders with send/return challans. Indian manufacturing compliance for external processing with full challan line items.
| Module Name | drkds_mfg_advanced |
| Display Name | DRKDS Manufacturing Advanced |
| Version | 1.0.0 |
| License | LGPL-3 |
| Category | Manufacturing |
| Depends | drkds_mfg_pro |
| Database | mfg_test |
| Install Status | ✓ Installed — zero errors, zero warnings |
| Security Groups | group_mfg_plm_user · group_mfg_plm_approver · group_mfg_maintenance · group_mfg_advanced |
ECO Stage Workflow
require_approval = True show an approval gate icon. Only users in group_mfg_plm_approver can advance the ECO past this stage. This enforces engineering sign-off discipline.ECO Types define the stage workflow for different categories of engineering changes. Each type has its own ordered list of stages.
| Field | Type | Description |
|---|---|---|
name | Char | Type name (e.g., "Design Change", "Material Substitution", "Process Change") |
stage_ids | Many2many → drkds.plm.eco.stage | Ordered stages applicable to this ECO type |
| Field | Type | Description |
|---|---|---|
name | Char (required) | Stage name displayed in Kanban and form |
sequence | Integer | Display and progression order |
fold | Boolean | Fold in Kanban view when empty |
require_approval | Boolean | Block progression until approver signs off |
is_closing | Boolean | Mark this as the final completed stage |
| Field | Type | Description |
|---|---|---|
name | Char (auto-sequence) | ECO number: ECO/YYYY/XXXXX |
title | Char (required) | Human-readable change description |
eco_type_id | Many2one → eco.type | Determines available stage workflow |
product_tmpl_id | Many2one → product.template | Product being changed (uses template, not variant) |
bom_id | Many2one → mrp.bom | Specific BOM to be modified |
stage_id | Many2one → eco.stage | Current workflow stage |
priority | Selection: 0/1/2/3 | Normal / Urgent / Very Urgent / Critical |
date_deadline | Date | Target implementation date |
description | Html | Full change description and justification |
change_ids | One2many → eco.line | BOM change lines (add/modify/remove components) |
product_tmpl_id (product template), not product_id. This is intentional — design changes apply to the template level, affecting all variants.| Field | Type | Description |
|---|---|---|
eco_id | Many2one → drkds.plm.eco | Parent ECO record |
product_id | Many2one → product.product | Component being added, modified, or removed |
new_qty | Float | New quantity (0 = remove from BOM) |
notes | Text | Reason for change, part number cross-reference, etc. |
| ● Active | In production use |
| ● Standby | Available but not running |
| ● Maintenance | Under maintenance, unavailable |
| ● Retired | Decommissioned |
| Field | Type | Description |
|---|---|---|
name | Char (required) | Equipment name/identifier |
category_id | Many2one → maintenance.category | Equipment category for filtering |
workcenter_id | Many2one → mrp.workcenter | Associated work center in manufacturing |
serial_no | Char | Manufacturer serial number |
model | Char | Equipment model designation |
manufacturer | Char | OEM / manufacturer name |
install_date | Date | Date installed in facility |
last_maintenance | Date | Date of last completed maintenance |
state | Selection | active / standby / maintenance / retired |
preventive_interval_days | Integer | Days between scheduled PM jobs |
next_maintenance | Date (computed) | last_maintenance + preventive_interval_days |
| Field | Type | Description |
|---|---|---|
name | Char (required) | Request title/description |
equipment_id | Many2one → maintenance.equipment | Equipment requiring maintenance |
maintenance_type | Selection | preventive / corrective |
technician_id | Many2one → hr.employee | Assigned maintenance technician |
date_request | Datetime | When request was raised |
date_scheduled | Datetime | Planned start of maintenance work |
duration_hrs | Float (computed) | Elapsed hours from request to done |
description | Text | Problem description / work instructions |
state | Selection | draft / assigned / in_progress / done / cancelled |
| Availability | Equipment breakdown, maintenance, setup |
| Performance | Speed loss, minor stoppages |
| Quality | Defect rework, startup rejects |
| External | Power cut, material shortage, external factors |
- Links to production_id (mrp.production)
- Links to workcenter_id (mrp.workcenter)
- Links to reason_id → category_id
- Optional link to maintenance_request_id
- Duration auto-computed from start/end time
| Field | Type | Description |
|---|---|---|
name | Char (required) | Downtime event reference |
production_id | Many2one → mrp.production | Affected manufacturing order |
workcenter_id | Many2one → mrp.workcenter | Work center where stoppage occurred |
reason_id | Many2one → downtime.reason | Specific reason (linked to category) |
start_time | Datetime | Downtime start timestamp |
end_time | Datetime | Downtime end timestamp |
duration_hours | Float (computed) | (end_time - start_time) in hours |
maintenance_request_id | Many2one → maintenance.request | Linked maintenance job (optional) |
notes | Text | Additional observations |
state | Selection | draft / confirmed |
NCR → CAPA Escalation Flow
rework | Send back for rework/repair |
scrap | Destroy and report scrap loss |
use_as_is | Concession — use despite non-conformance |
return | Return to supplier (incoming inspection failure) |
capa_alert_id M2O to quality.alert from drkds_mfg_pro module.| Field | Type | Description |
|---|---|---|
name | Char (auto-seq) | NCR/YYYY/XXXXX |
stage_id | Many2one → ncr.stage | Current Kanban stage |
ncr_type_id | Many2one → ncr.type | Type: incoming / in-process / final / customer complaint |
source_id | Many2one → ncr.source | Detection source |
defect_code_id | Many2one → defect.code | Standardized defect classification |
production_id | Many2one → mrp.production | Affected MO |
product_id | Many2one → product.product | Non-conforming product |
qty_defective | Float | Number of defective units |
description | Text | Defect description and observations |
disposition | Selection | rework / scrap / use_as_is / return |
capa_alert_id | Many2one → quality.alert | Linked CAPA in Pro module |
date_detected | Datetime | When defect was found |
date_closed | Datetime | Auto-stamped when reaching closing stage |
| ● Valid | next_calibration > today + 30 days |
| ● Due Soon | next_calibration within 30 days |
| ● Overdue | next_calibration < today |
| ● Out of Service | Manually set, instrument unavailable |
next_calibration (computed):
next_calibration = last_calibration + timedelta(days=interval_days)
Status is also computed and store=True to enable search/filter in list view.
| Field | Type | Description |
|---|---|---|
instrument_name | Char (required) | Instrument name (e.g., "Mitutoyo Vernier Caliper 300mm") |
instrument_code | Char | Asset tag / instrument ID code |
serial_no | Char | Manufacturer serial number |
manufacturer | Char | OEM name |
station_id | Many2one → mrp.workcenter | Inspection station where instrument is deployed |
last_calibration | Date | Date of last calibration |
interval_days | Integer | Calibration validity period in days |
next_calibration | Date (computed, store=True) | last_calibration + interval_days |
calibrated_by | Char | Calibrating lab / agency name |
accuracy | Char | Accuracy specification (e.g., "±0.02mm") |
status | Selection (computed, store=True) | valid / due_soon / overdue / out_of_service |
certificate | Binary | Calibration certificate PDF attachment |
next_calibration and status must be store=True since they are used in search view domains and list view grouping. Computed fields used in domains MUST be stored.Live Tool Life Progress
T-001 — Injection Die (Motor Housing) ● OK
T-002 — Press Tool (Bracket) ● Warning
T-003 — Drill Jig (PCB Holes) ● Critical
T-004 — Stamping Die (Enclosure) ● Retired
| Status | Condition | Color | Action |
|---|---|---|---|
| OK | pct_used < 70% | Green | Normal operation |
| Warning | 70% ≤ pct_used < 90% | Orange | Plan maintenance/replacement |
| Critical | 90% ≤ pct_used < 100% | Red | Immediate action required |
| Retired | is_retired = True | Grey | Decommissioned |
| Field | Type | Description |
|---|---|---|
name | Char (required) | Tool identifier / name |
tool_type_id | Many2one → tool.type | Defines unit_of_life (shots/hours/cycles/days) |
workcenter_id | Many2one → mrp.workcenter | Assigned work center |
station_id | Many2one → mrp.workcenter | Specific station within work center |
max_life | Float (required) | Maximum service life in unit_of_life units |
current_count | Float | Current accumulated count |
remaining | Float (computed) | max_life - current_count |
pct_used | Float (computed) | (current_count / max_life) × 100 |
is_retired | Boolean | Manual retirement flag |
status | Selection (computed) | ok / warning / critical / retired |
MPS Planning Grid — March 2026 (Weekly)
| Product / Metric | Wk 1 Mar 2–8 |
Wk 2 Mar 9–15 |
Wk 3 Mar 16–22 |
Wk 4 Mar 23–29 |
|---|---|---|---|---|
| Motor Driver MDU-300 | Safety Stock: 10 | Lead Time: 3 days | ||||
| Demand Qty | 30 | 40 | 50 | 35 |
| Supply Qty | 0 | 25 | 38 | 0 |
| Stock on Hand | 45 | 30 | 18 | 23 |
| To Procure | 0 | 25 | 38 | 22 |
| PCB Sub-Assembly SA-200 | Safety Stock: 5 | Lead Time: 5 days | ||||
| Demand Qty | 20 | 20 | 30 | 20 |
| Stock on Hand | 12 | 7 | 5 | 10 |
| To Procure | 13 | 18 | 28 | 15 |
to_procure = max(0, demand_qty - stock_on_hand + safety_stock)
For Wk 3 Motor Driver: max(0, 50 - 18 + 10) = 42. After subtracting pending supply of 4 units, net = 38.
drkds.mps (Header)
| Field | Type | Description |
|---|---|---|
date_from | Date | Plan start date |
date_to | Date | Plan end date |
period_type | Selection | weekly / monthly |
state | Selection | draft / confirmed |
notes | Text | Planner notes |
line_ids | One2many → mps.line | Product planning lines |
drkds.mps.bucket (Time Buckets)
| Field | Type | Description |
|---|---|---|
line_id | Many2one → mps.line | Parent product line |
date_from / date_to | Date | Bucket time period |
demand_qty | Float | Forecasted/confirmed demand |
supply_qty | Float | Planned/confirmed supply (in-progress MOs) |
stock_on_hand | Float | Current inventory snapshot |
to_procure | Float (computed) | Net requirement = demand - stock + safety |
| Field | Type | Description |
|---|---|---|
name | Char (auto-seq) | JW order number |
partner_id | Many2one → res.partner | Job work vendor / subcontractor |
product_id | Many2one → product.product | Product to be processed |
qty | Float | Quantity sent for job work |
date_out | Date | Date goods dispatched |
date_expected_return | Date | Expected return date |
state | Selection | draft / sent / in_progress / received / closed |
challan_ids | One2many → job.work.challan | Send and return challans |
| Field | Type | Description |
|---|---|---|
name | Char (auto-seq) | JWC/YYYY/XXXXX |
job_work_id | Many2one → job.work.order | Parent JW order |
challan_type | Selection | send / return |
challan_date | Date | Challan issue date |
line_ids | One2many → challan.line | Material line items |
| Model | Purpose | Sequence / Key |
|---|---|---|
drkds.plm.eco.type | ECO type with stage workflow | — |
drkds.plm.eco.stage | ECO pipeline stage | sequence ordered |
drkds.plm.eco | Engineering Change Order | ECO/YYYY/ |
drkds.plm.eco.line | BOM change line item | — |
drkds.maintenance.category | Equipment category | — |
drkds.maintenance.equipment | Equipment register | — |
drkds.maintenance.request | Maintenance work request | — |
drkds.downtime.category | Downtime loss category | — |
drkds.downtime.reason | Downtime reason code | — |
drkds.downtime | Downtime event record | — |
drkds.ncr.stage | NCR pipeline stage | sequence ordered |
drkds.ncr.type | NCR classification type | — |
drkds.ncr.source | NCR detection source | — |
drkds.defect.code | Defect code library | — |
drkds.ncr | Non-Conformance Report | NCR/YYYY/ |
drkds.calibration | Instrument calibration register | — |
drkds.tool.type | Tool type (unit of life) | — |
drkds.tool.die | Tool/die lifecycle record | — |
drkds.mps | MPS plan header | — |
drkds.mps.line | MPS product line | — |
drkds.mps.bucket | MPS time bucket | — |
drkds.job.work.order | Job work order | — |
drkds.job.work.challan | Job work challan (send/return) | JWC/YYYY/ |
drkds.job.work.challan.line | Challan line item | — |
product_tmpl_id for PLM (not product_id), @api.constrains instead of _sql_constraints, planning menu parent is drkds_mfg_pro.menu_mfg_planning, groups use drkds_mfg_core.privilege_drkds_mfg.group_ prefix so Odoo's implied_group= processing works correctly. Fields without the group_ prefix are silently ignored by the settings framework.Enable PLM / ECO
group_mfg_adv_plm — Shows ECO menu, enables ECO creation and stage workflows
Enable Maintenance
group_mfg_adv_maintenance — Equipment register, maintenance requests, categories
Enable Downtime Tracking
group_mfg_adv_downtime — Downtime event logging and OEE loss categorization
Enable NCR
group_mfg_adv_ncr — Non-Conformance Reports, defect codes, CAPA escalation
Enable Calibration
group_mfg_adv_calibration — Instrument register, calibration schedule, status tracking
Enable Tool & Die Tracking
group_mfg_adv_tools — Tool/die lifecycle, shot counters, status visualization
Enable MPS
group_mfg_adv_mps — Master Production Schedule, time buckets, procurement planning
Enable Job Work
group_mfg_adv_job_work — Job work orders, send/return challans, subcontracting
Manufacturing (top-level)
├── PLM
│ ├── ECOs
│ ├── ECO Types
│ └── ECO Stages
├── Maintenance
│ ├── Equipment
│ ├── Requests
│ └── Categories
├── Quality (extended from Pro)
│ ├── NCR
│ └── Defect Codes
├── Calibration
│ └── Instruments
├── Tool & Die
│ ├── Tools
│ └── Tool Types
├── MPS
│ └── Plans
├── Job Work
│ ├── Orders
│ └── Challans
└── Configuration
└── Settings
group_mfg_plm_user
Can create and edit ECOs, add change lines, move ECOs through non-approval stages. Cannot approve ECOs at approval-gated stages.
group_mfg_plm_approver
Extends PLM User. Can sign off ECOs at require_approval = True stages. Typically: Engineering Manager or Quality Manager.
group_mfg_maintenance
Access to equipment register, maintenance requests, calibration instruments, downtime records, tool/die tracking.
group_mfg_advanced
Full access to all Advanced features including MPS plans, job work orders, configuration, and all sub-modules.
Access Matrix (Key Models)
| Model | PLM User | PLM Approver | Maintenance | Advanced Mgr |
|---|---|---|---|---|
| drkds.plm.eco | R/W/C | R/W/C/D | R | R/W/C/D |
| drkds.plm.eco.type | R | R/W/C | — | R/W/C/D |
| drkds.maintenance.equipment | R | R | R/W/C | R/W/C/D |
| drkds.maintenance.request | R | R | R/W/C/D | R/W/C/D |
| drkds.ncr | R | R/W/C | R | R/W/C/D |
| drkds.calibration | R | R | R/W/C/D | R/W/C/D |
| drkds.tool.die | — | — | R/W/C | R/W/C/D |
| drkds.mps | — | — | R | R/W/C/D |
| drkds.job.work.order | — | — | R | R/W/C/D |
drkds_mfg_core.privilege_drkds_mfg as their privilege. Feature groups do NOT use category_id in Odoo 19 (removed — use privilege_id instead).-
1Engineer Navigate to Manufacturing → PLM → ECO Types. Create type "Design Change" with stages: Draft → Under Review → Approval (require_approval=True) → Closed (is_closing=True).
-
2Engineer Go to PLM → ECOs → New. Set Title: "Replace IGBT to 600V rated module", Type: "Design Change", Product: Motor Driver MDU-300 (template), BOM: MDU-300 BOM Rev.4, Priority: Urgent, Deadline: 2026-03-15.
-
3Engineer In the Change Lines tab, add line 1: Product = IGBT 400V (old), new_qty = 0, notes = "Remove old 400V IGBT". Add line 2: Product = IGBT 600V (new), new_qty = 4, notes = "Replace with 600V rated — thermal load specification update".
-
4Engineer Move ECO to stage "Under Review". Team discusses in chatter. Engineering supervisor reviews change lines and cost impact.
-
5Approver ECO moved to "Approval" stage (locked for non-approvers). Engineering Manager with
group_mfg_plm_approverreviews and approves. Logs approval note in chatter. -
6Engineer Move ECO to "Closed" stage (is_closing=True). Update BOM manually with change lines. ECO record preserved for audit trail. New BOM revision created as Rev.5.
-
1QC Inspector During final inspection of MO/2026/0023 (batch of 50 PCBs), finds 4 units with solder bridges on IC1 pad. Navigate to Quality → NCR → New.
-
2QC Inspector Fill NCR: Stage=Open, Type=In-Process, Source=Final Inspection, Defect Code="Solder Bridge", Production=MO/2026/0023, Product=PCB SA-200, qty_defective=4. date_detected=auto. Save → NCR/2026/00001 generated.
-
3QC Inspector Move NCR to "Investigation" stage. Team notes: stencil alignment issue on SMT line. Disposition decision: rework — all 4 units sent back to SMT operator for touch-up.
-
4QC Manager Defect is recurring (3rd time this month). Escalate to CAPA: click Create CAPA Alert. System creates
quality.alertin Pro module. NCR fieldcapa_alert_idlinked. Root cause: stencil worn out — replace. -
5QC Manager After rework verified and stencil replaced, close NCR. Stage → Closed (is_closing=True). date_closed auto-stamped. CAPA tracks corrective action completion.
-
1Maintenance Open Calibration → Instruments. Filter by Status=Overdue. Finds "Mitutoyo Vernier 300mm" (CAL-012): last_calibration=2025-11-01, interval=90 days, next_calibration=2026-01-30. Status=Overdue.
-
2Maintenance Mark instrument as "Out of Service" temporarily. Quarantine the instrument — do not use for inspection until recalibrated. Notify QC team via chatter.
-
3Maintenance Send instrument to NABL-accredited calibration lab (e.g., ETDC Bangalore). Create maintenance request linking equipment. Expected return: 5 working days.
-
4Maintenance Instrument returned with calibration certificate. Update record: last_calibration=2026-02-23, calibrated_by="ETDC Bangalore", accuracy="±0.02mm". Attach certificate PDF to
certificatebinary field. -
5Maintenance Save record. System auto-computes: next_calibration = 2026-02-23 + 90 = 2026-05-24. Status recomputed → Valid. Instrument returned to QC station for use.
-
1Planner Navigate to MPS → Plans → New. Set date_from=2026-03-02, date_to=2026-03-29, period_type=weekly. Add product line: Motor Driver MDU-300, safety_stock=10, lead_time_days=3.
-
2Planner System auto-generates 4 weekly buckets (Wk1 to Wk4). Planner enters demand_qty for each bucket: Wk1=30, Wk2=40, Wk3=50, Wk4=35 based on confirmed customer orders.
-
3Planner System reads stock_on_hand from inventory snapshot: Wk3 SOH=18. to_procure computed: max(0, 50 - 18 + 10) = 42. Adjust for pending MO supply of 4 → net = 38 units.
-
4Planner Click Confirm Plan. State → confirmed. Planner manually creates MO for 38 units of MDU-300 referencing MPS Wk3. Scheduled start: 2026-03-13 (considering 3-day lead time).
-
5Planner Update supply_qty in Wk3 bucket to 38. Subsequent weeks recalculate SOH projections forward. MPS serves as rolling 4-week production horizon for capacity and material planning.
-
1Store Navigate to Job Work → Orders → New. Set: Partner = XYZ PCBA Vendors, Product = PCB SA-200, qty = 10, date_out = 2026-02-23, date_expected_return = 2026-02-28. State = Draft.
-
2Store Confirm JW order → state = Sent. Create Send Challan (challan_type=send): Date=2026-02-23. Add line: Product=PCB SA-200 Bare Board, qty=10, UoM=Units. Challan JWC/2026/00001 generated. Print challan for transport.
-
3Store Goods dispatched. JWO state updated to In Progress. Vendor performs wave soldering. Date tracking monitored — if past date_expected_return, system can flag overdue.
-
4Store Goods received 2026-02-28. QC inspects all 10 PCBs — passed. Create Return Challan (challan_type=return): Date=2026-02-28. Add line: Product=PCB SA-200 Soldered, qty=10. JWC/2026/00002 generated.
-
5Store Manager Verify: sent qty = returned qty = 10. No shortfall. Update JWO state → Received, then → Closed. 10 processed PCBs available in stock for assembly into Motor Driver MO.