diff --git a/fusion_plating/fusion_plating_configurator/__manifest__.py b/fusion_plating/fusion_plating_configurator/__manifest__.py index 2472a0ab..48c40aab 100644 --- a/fusion_plating/fusion_plating_configurator/__manifest__.py +++ b/fusion_plating/fusion_plating_configurator/__manifest__.py @@ -5,7 +5,7 @@ { 'name': 'Fusion Plating — Configurator', - 'version': '19.0.18.10.3', + 'version': '19.0.18.10.4', 'category': 'Manufacturing/Plating', 'summary': 'Quotation configurator with part catalog, coating configs, and formula-based pricing engine.', 'description': """ diff --git a/fusion_plating/fusion_plating_configurator/controllers/fp_part_composer_controller.py b/fusion_plating/fusion_plating_configurator/controllers/fp_part_composer_controller.py index cd7373ef..44306e38 100644 --- a/fusion_plating/fusion_plating_configurator/controllers/fp_part_composer_controller.py +++ b/fusion_plating/fusion_plating_configurator/controllers/fp_part_composer_controller.py @@ -124,6 +124,15 @@ def _clone_subtree(env, source, part, parent): new_node = Node.create(vals) + # Copy operator-input prompts (temperature reading, visual inspection, + # etc.) onto the cloned node. Without this, "Load Template" copies the + # step structure but loses every custom prompt the recipe author set up + # — operators end up with empty data-capture screens. .copy() handles + # every field on the input model (kind, target_min/max/unit, + # compliance_tag, sequence, hint, …) and rebinds node_id via override. + for src_input in source.input_ids: + src_input.copy({'node_id': new_node.id}) + # Recurse into children in deterministic sequence order. for child in source.child_ids.sorted('sequence'): _clone_subtree(env, child, part, new_node)