From cba9a6da6bd286acd411bf24792d8309903b9fbe Mon Sep 17 00:00:00 2001 From: gsinghpal Date: Tue, 12 May 2026 08:39:12 -0400 Subject: [PATCH] feat(jobs): mirror delivery_method/ship_via/invoice_strategy on fp.job Tier 3 of the SO->fp.job persistence audit. Three logistics/billing fields surface on fp.job as related read-only (not stored) mirrors: - x_fc_delivery_method - Local Delivery / Shipping Partner / Customer Pickup. Cargo classification used by logistics planning. - x_fc_ship_via - Carrier name (UPS, FedEx, customer pickup, etc.). - x_fc_invoice_strategy - Deposit / Progress / Net Terms / COD-Prepay. Read by the invoicing module's hooks; mirroring on the WO is for manager visibility only. These were intentionally chosen as related (not stored persisted) because the SO is the authoritative source - the existing downstream code (delivery + invoicing modules) already reads them off SO directly. A stored copy would risk drift. Related auto-follows SO updates. Same three fields also mirrored on sale.order.line as stored related for per-line list visibility. Closes the SO->fp.job persistence audit. All 10 operational fields identified now flow through to the WO (7 stored + populated at confirm, 3 related read-only). Co-Authored-By: Claude Opus 4.7 (1M context) --- fusion_plating/fusion_plating/__manifest__.py | 2 +- .../fusion_plating/views/fp_job_views.xml | 3 +++ .../__manifest__.py | 2 +- .../models/sale_order_line.py | 19 ++++++++++++++++++ .../fusion_plating_jobs/__manifest__.py | 2 +- .../fusion_plating_jobs/models/fp_job.py | 20 +++++++++++++++++++ 6 files changed, 45 insertions(+), 3 deletions(-) diff --git a/fusion_plating/fusion_plating/__manifest__.py b/fusion_plating/fusion_plating/__manifest__.py index 73807f6e..481acfec 100644 --- a/fusion_plating/fusion_plating/__manifest__.py +++ b/fusion_plating/fusion_plating/__manifest__.py @@ -5,7 +5,7 @@ { 'name': 'Fusion Plating', - 'version': '19.0.18.15.7', + 'version': '19.0.18.15.8', 'category': 'Manufacturing/Plating', 'summary': 'Core plating / metal finishing ERP: facilities, processes, tanks, baths, jobs, operators.', 'description': """ diff --git a/fusion_plating/fusion_plating/views/fp_job_views.xml b/fusion_plating/fusion_plating/views/fp_job_views.xml index ddc9633b..4f6f198a 100644 --- a/fusion_plating/fusion_plating/views/fp_job_views.xml +++ b/fusion_plating/fusion_plating/views/fp_job_views.xml @@ -43,6 +43,9 @@ + + + diff --git a/fusion_plating/fusion_plating_configurator/__manifest__.py b/fusion_plating/fusion_plating_configurator/__manifest__.py index 67aa5e18..9c4d5050 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.1', + 'version': '19.0.18.10.2', '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/models/sale_order_line.py b/fusion_plating/fusion_plating_configurator/models/sale_order_line.py index f272fb10..9a420184 100644 --- a/fusion_plating/fusion_plating_configurator/models/sale_order_line.py +++ b/fusion_plating/fusion_plating_configurator/models/sale_order_line.py @@ -684,3 +684,22 @@ class SaleOrderLine(models.Model): readonly=True, store=True, ) + + x_fc_delivery_method = fields.Selection( + related='order_id.x_fc_delivery_method', + string='Delivery Method', + readonly=True, + store=True, + ) + x_fc_ship_via = fields.Char( + related='order_id.x_fc_ship_via', + string='Ship Via', + readonly=True, + store=True, + ) + x_fc_invoice_strategy = fields.Selection( + related='order_id.x_fc_invoice_strategy', + string='Invoice Strategy', + readonly=True, + store=True, + ) diff --git a/fusion_plating/fusion_plating_jobs/__manifest__.py b/fusion_plating/fusion_plating_jobs/__manifest__.py index 0d7b7ab1..a0fbb61e 100644 --- a/fusion_plating/fusion_plating_jobs/__manifest__.py +++ b/fusion_plating/fusion_plating_jobs/__manifest__.py @@ -3,7 +3,7 @@ # License OPL-1 (Odoo Proprietary License v1.0) { 'name': 'Fusion Plating — Native Jobs', - 'version': '19.0.8.21.3', + 'version': '19.0.8.21.4', 'category': 'Manufacturing/Plating', 'summary': 'Native plating job model — replaces mrp.production / mrp.workorder bridge.', 'author': 'Nexa Systems Inc.', diff --git a/fusion_plating/fusion_plating_jobs/models/fp_job.py b/fusion_plating/fusion_plating_jobs/models/fp_job.py index c10d4df0..28fa0cfc 100644 --- a/fusion_plating/fusion_plating_jobs/models/fp_job.py +++ b/fusion_plating/fusion_plating_jobs/models/fp_job.py @@ -23,6 +23,26 @@ _logger = logging.getLogger(__name__) class FpJob(models.Model): _inherit = 'fp.job' + # ---- Tier 3 mirrors from sale.order ----------------------------- + # Related (not stored) — pure display mirrors. Values may change on + # the SO after job confirm (e.g. customer changes carrier preference) + # and the WO should reflect the latest; related auto-follows. + x_fc_delivery_method = fields.Selection( + related='sale_order_id.x_fc_delivery_method', + string='Delivery Method', + readonly=True, + ) + x_fc_ship_via = fields.Char( + related='sale_order_id.x_fc_ship_via', + string='Ship Via', + readonly=True, + ) + x_fc_invoice_strategy = fields.Selection( + related='sale_order_id.x_fc_invoice_strategy', + string='Invoice Strategy', + readonly=True, + ) + part_catalog_id = fields.Many2one( 'fp.part.catalog', string='Part',