diff --git a/fusion_plating/fusion_plating_configurator/wizard/fp_direct_order_wizard.py b/fusion_plating/fusion_plating_configurator/wizard/fp_direct_order_wizard.py index b513d54d..b1e68727 100644 --- a/fusion_plating/fusion_plating_configurator/wizard/fp_direct_order_wizard.py +++ b/fusion_plating/fusion_plating_configurator/wizard/fp_direct_order_wizard.py @@ -716,6 +716,12 @@ class FpDirectOrderWizard(models.Model): 'x_fc_serial_id': line.serial_id.id or False, 'x_fc_job_number': line.job_number or False, 'x_fc_thickness_range': line.thickness_range or False, + # Express Orders per-line flags (2026-05-26) — carry to + # the SO line so the override-application helper can read + # them at job creation time. + 'x_fc_customer_line_ref': line.customer_line_ref or False, + 'x_fc_masking_enabled': line.masking_enabled, + 'x_fc_bake_instructions': line.bake_instructions or False, # Sub 9 — explicit tax override from the wizard line. # When blank, Odoo will compute taxes from the product # defaults at SO-line save time (the standard behaviour). @@ -762,6 +768,28 @@ class FpDirectOrderWizard(models.Model): continue if line.thickness_range and not part.x_fc_default_thickness_range: part.x_fc_default_thickness_range = line.thickness_range + + # Express Orders part-default write-back (2026-05-26). + # Always-on (no push_to_defaults check): the spec says type-once, + # saves to part. Empty cells DON'T clobber existing defaults + # (otherwise an empty bake cell would erase a part's bake default + # — bad UX). Masking is a Boolean so always written. + for line in self.line_ids: + if line.is_one_off: + continue + part = resolved_parts.get(line.id) or line.part_catalog_id + if not part: + continue + wb_vals = {} + if line.line_description and not part.default_specification_text: + wb_vals['default_specification_text'] = line.line_description + if line.bake_instructions and not part.default_bake_instructions: + wb_vals['default_bake_instructions'] = line.bake_instructions + # Masking is always written (Boolean has no notion of empty). + if part.default_masking_enabled != line.masking_enabled: + wb_vals['default_masking_enabled'] = line.masking_enabled + if wb_vals: + part.sudo().write(wb_vals) so.message_post(body=_( 'Quotation created from PO %s with %d line(s). ' 'Review and confirm manually when ready.'