Odoo Mindscape. Understand Odoo faster. Explore modules, fields, dependencies and version differences in one place instead of digging through the source code.

Module: Manufacturing

Entity: mrp.workorder

Compute Method: _compute_state

View 19.0 View 20.0
Inputs Method Outputs
  • product_uom_id
  • state
  • qty_ready
  • uom_id
  • blocked_by_workorder_ids
  • production_bom_id
  • production_bom_id.continuous
  • qty_remaining
  • qty_produced
for workorder in self:
-             if not workorder.product_uom_id or workorder.state not in ('blocked', 'ready'):
+             if not workorder.uom_id or workorder.state not in ('blocked', 'ready'):
                continue
-             has_qty_ready = workorder.product_uom_id.compare(workorder.qty_ready, 0) > 0
-             if has_qty_ready:
-                 workorder.write({'state': 'ready'})
+             all_blocked_by_workorders_done = not workorder.blocked_by_workorder_ids or all(wo.state in ('cancel', 'done') for wo in workorder.blocked_by_workorder_ids)
+             has_qty_ready = workorder.uom_id.compare(workorder.qty_ready, 0) > 0
+             continuous_production = not workorder.blocked_by_workorder_ids or workorder.production_bom_id.continuous
+             has_all_qties_ready = workorder.uom_id.compare(workorder.qty_ready, workorder.qty_remaining) == 0 and continuous_production
+             if workorder.qty_produced and workorder.state != 'blocked':
+                 workorder.state = 'progress'
+             elif all_blocked_by_workorders_done or has_all_qties_ready or (has_qty_ready and continuous_production):
+                 workorder.state = 'ready'
            else:
-                 workorder.write({'state': 'blocked'})
+                 workorder.state = 'blocked'
  • state

Back to entity