From b4558a223cdbd1495132d393a2f61c7a600ad6ae Mon Sep 17 00:00:00 2001 From: gsinghpal Date: Sun, 19 Apr 2026 20:29:52 -0400 Subject: [PATCH] feat(configurator): stub fp.direct.order.line model for multi-line direct order wizard Task A1 of the direct-order-wizard rewrite. Adds the transient line model that will hold per-part detail (part, coating, qty, price) when the wizard moves from single-line to header+lines architecture. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../security/ir.model.access.csv | 2 + .../wizard/__init__.py | 1 + .../wizard/fp_direct_order_line.py | 46 +++++++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 fusion_plating/fusion_plating_configurator/wizard/fp_direct_order_line.py diff --git a/fusion_plating/fusion_plating_configurator/security/ir.model.access.csv b/fusion_plating/fusion_plating_configurator/security/ir.model.access.csv index 083575dc..79091677 100644 --- a/fusion_plating/fusion_plating_configurator/security/ir.model.access.csv +++ b/fusion_plating/fusion_plating_configurator/security/ir.model.access.csv @@ -19,6 +19,8 @@ access_fp_quote_configurator_estimator,fp.quote.configurator.estimator,model_fp_ access_fp_quote_configurator_manager,fp.quote.configurator.manager,model_fp_quote_configurator,fusion_plating.group_fusion_plating_manager,1,1,1,1 access_fp_direct_order_wizard_estimator,fp.direct.order.wizard.estimator,model_fp_direct_order_wizard,fusion_plating_configurator.group_fp_estimator,1,1,1,1 access_fp_direct_order_wizard_manager,fp.direct.order.wizard.manager,model_fp_direct_order_wizard,fusion_plating.group_fusion_plating_manager,1,1,1,1 +access_fp_direct_order_line_estimator,fp.direct.order.line.estimator,model_fp_direct_order_line,fusion_plating_configurator.group_fp_estimator,1,1,1,1 +access_fp_direct_order_line_manager,fp.direct.order.line.manager,model_fp_direct_order_line,fusion_plating.group_fusion_plating_manager,1,1,1,1 access_fp_part_import_wizard_estimator,fp.part.catalog.import.wizard.estimator,model_fp_part_catalog_import_wizard,fusion_plating_configurator.group_fp_estimator,1,1,1,1 access_fp_part_import_wizard_manager,fp.part.catalog.import.wizard.manager,model_fp_part_catalog_import_wizard,fusion_plating.group_fusion_plating_manager,1,1,1,1 access_fp_customer_price_list_operator,fp.customer.price.list.operator,model_fp_customer_price_list,fusion_plating.group_fusion_plating_operator,1,0,0,0 diff --git a/fusion_plating/fusion_plating_configurator/wizard/__init__.py b/fusion_plating/fusion_plating_configurator/wizard/__init__.py index bc0d151d..47aa87af 100644 --- a/fusion_plating/fusion_plating_configurator/wizard/__init__.py +++ b/fusion_plating/fusion_plating_configurator/wizard/__init__.py @@ -3,4 +3,5 @@ # License OPL-1 (Odoo Proprietary License v1.0) from . import fp_direct_order_wizard +from . import fp_direct_order_line from . import fp_part_catalog_import_wizard diff --git a/fusion_plating/fusion_plating_configurator/wizard/fp_direct_order_line.py b/fusion_plating/fusion_plating_configurator/wizard/fp_direct_order_line.py new file mode 100644 index 00000000..b8bd6242 --- /dev/null +++ b/fusion_plating/fusion_plating_configurator/wizard/fp_direct_order_line.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# Copyright 2026 Nexa Systems Inc. +# License OPL-1 (Odoo Proprietary License v1.0) +# Part of the Fusion Plating product family. + +from odoo import api, fields, models + + +class FpDirectOrderLine(models.TransientModel): + _name = 'fp.direct.order.line' + _description = 'Fusion Plating - Direct Order Line' + _order = 'sequence, id' + + wizard_id = fields.Many2one( + 'fp.direct.order.wizard', + required=True, + ondelete='cascade', + ) + sequence = fields.Integer(default=10) + + part_catalog_id = fields.Many2one( + 'fp.part.catalog', + string='Part', + required=True, + ) + coating_config_id = fields.Many2one( + 'fp.coating.config', + string='Primary Treatment', + required=True, + ) + quantity = fields.Integer(string='Qty', default=1, required=True) + currency_id = fields.Many2one(related='wizard_id.currency_id') + unit_price = fields.Monetary( + string='Unit Price', + currency_field='currency_id', + ) + line_subtotal = fields.Monetary( + string='Subtotal', + currency_field='currency_id', + compute='_compute_line_subtotal', + ) + + @api.depends('quantity', 'unit_price') + def _compute_line_subtotal(self): + for rec in self: + rec.line_subtotal = (rec.quantity or 0) * (rec.unit_price or 0.0)