feat(bridge_mrp): Sub 3 — _resolve_mo_process_tree helper; walker prefers part-cloned tree (Task 3)
This commit is contained in:
@@ -495,8 +495,8 @@ class MrpProduction(models.Model):
|
|||||||
"""
|
"""
|
||||||
WorkOrder = self.env['mrp.workorder']
|
WorkOrder = self.env['mrp.workorder']
|
||||||
for production in self:
|
for production in self:
|
||||||
if not production.x_fc_recipe_id:
|
if not production._resolve_mo_process_tree():
|
||||||
continue # No recipe assigned
|
continue # No recipe / part tree assigned
|
||||||
if production.workorder_ids:
|
if production.workorder_ids:
|
||||||
continue # WOs already exist — don't duplicate
|
continue # WOs already exist — don't duplicate
|
||||||
|
|
||||||
@@ -679,7 +679,11 @@ class MrpProduction(models.Model):
|
|||||||
# 'step' nodes at top level are handled by their parent operation
|
# 'step' nodes at top level are handled by their parent operation
|
||||||
|
|
||||||
# Start walking from recipe root
|
# Start walking from recipe root
|
||||||
walk_node(production.x_fc_recipe_id)
|
# Sub 3 — resolve via helper (part-cloned tree preferred,
|
||||||
|
# recipe_id fallback)
|
||||||
|
root = production._resolve_mo_process_tree()
|
||||||
|
if root:
|
||||||
|
walk_node(root)
|
||||||
|
|
||||||
# Bulk create work orders
|
# Bulk create work orders
|
||||||
if wo_vals_list:
|
if wo_vals_list:
|
||||||
@@ -699,7 +703,7 @@ class MrpProduction(models.Model):
|
|||||||
)
|
)
|
||||||
production.message_post(
|
production.message_post(
|
||||||
body=_('%d work orders generated from recipe "%s".') % (
|
body=_('%d work orders generated from recipe "%s".') % (
|
||||||
len(wo_vals_list), production.x_fc_recipe_id.name),
|
len(wo_vals_list), (root.name if root else '')),
|
||||||
)
|
)
|
||||||
|
|
||||||
# ------------------------------------------------------------------
|
# ------------------------------------------------------------------
|
||||||
@@ -1146,6 +1150,37 @@ class MrpProduction(models.Model):
|
|||||||
'target': 'current',
|
'target': 'current',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------
|
||||||
|
# Sub 3 — Process tree resolution (single source for WO walker)
|
||||||
|
# ------------------------------------------------------------------
|
||||||
|
def _resolve_mo_process_tree(self):
|
||||||
|
"""Resolve which process-tree root to walk for this MO.
|
||||||
|
|
||||||
|
Sub 3 — prefers the linked part's cloned tree
|
||||||
|
(SO line's x_fc_part_catalog_id.default_process_id); falls back
|
||||||
|
to the legacy x_fc_recipe_id for MOs without a linked part or
|
||||||
|
without a composed part tree.
|
||||||
|
|
||||||
|
Single entry point so Sub 4 / Sub 5 updates touch one method.
|
||||||
|
"""
|
||||||
|
self.ensure_one()
|
||||||
|
# Resolve part via SO lines (MO's origin → sale.order → first
|
||||||
|
# line's part). mrp.production has no direct part link; the
|
||||||
|
# relationship lives on sale.order.line.
|
||||||
|
part = False
|
||||||
|
if self.origin:
|
||||||
|
so = self.env['sale.order'].search(
|
||||||
|
[('name', '=', self.origin)], limit=1,
|
||||||
|
)
|
||||||
|
if so and so.order_line:
|
||||||
|
first_line = so.order_line[0]
|
||||||
|
if 'x_fc_part_catalog_id' in first_line._fields:
|
||||||
|
part = first_line.x_fc_part_catalog_id
|
||||||
|
if part and part.default_process_id:
|
||||||
|
return part.default_process_id
|
||||||
|
# Fallback — legacy recipe lookup (coating config / product match)
|
||||||
|
return self.x_fc_recipe_id
|
||||||
|
|
||||||
# ------------------------------------------------------------------
|
# ------------------------------------------------------------------
|
||||||
# Sub 2 — Certificate requirement resolution (single source)
|
# Sub 2 — Certificate requirement resolution (single source)
|
||||||
# ------------------------------------------------------------------
|
# ------------------------------------------------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user