diff --git a/fusion-plating/fusion_plating_configurator/__init__.py b/fusion-plating/fusion_plating_configurator/__init__.py new file mode 100644 index 00000000..3c90fa80 --- /dev/null +++ b/fusion-plating/fusion_plating_configurator/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# Copyright 2026 Nexa Systems Inc. +# License OPL-1 (Odoo Proprietary License v1.0) +# Part of the Fusion Plating product family. + +from . import models diff --git a/fusion-plating/fusion_plating_configurator/__manifest__.py b/fusion-plating/fusion_plating_configurator/__manifest__.py new file mode 100644 index 00000000..ec0c97da --- /dev/null +++ b/fusion-plating/fusion_plating_configurator/__manifest__.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +# Copyright 2026 Nexa Systems Inc. +# License OPL-1 (Odoo Proprietary License v1.0) +# Part of the Fusion Plating product family. + +{ + 'name': 'Fusion Plating — Configurator', + 'version': '19.0.1.0.0', + 'category': 'Manufacturing/Plating', + 'summary': 'Quotation configurator with part catalog, coating configs, and formula-based pricing engine.', + 'description': """ +Fusion Plating — Configurator +============================== + +Part of the Fusion Plating product family by Nexa Systems Inc. + +Provides: +- Customer part catalog with geometry and material data +- Coating configuration templates (process, thickness, spec) +- Pre/post treatment library +- Formula-based pricing engine with complexity surcharges +- Configurator sessions that generate sale orders +- Custom sale order views with plating-specific fields +""", + 'author': 'Nexa Systems Inc.', + 'website': 'https://www.nexasystems.ca', + 'maintainer': 'Nexa Systems Inc.', + 'support': 'support@nexasystems.ca', + 'license': 'OPL-1', + 'price': 0.00, + 'currency': 'CAD', + 'depends': [ + 'fusion_plating', + 'sale_management', + ], + 'data': [ + 'security/fp_configurator_security.xml', + 'security/ir.model.access.csv', + 'data/fp_configurator_sequence_data.xml', + 'views/fp_treatment_views.xml', + 'views/fp_part_catalog_views.xml', + 'views/fp_coating_config_views.xml', + 'views/fp_pricing_rule_views.xml', + 'views/fp_quote_configurator_views.xml', + 'views/sale_order_views.xml', + 'views/fp_configurator_menu.xml', + ], + 'installable': True, + 'application': False, + 'auto_install': False, +} diff --git a/fusion-plating/fusion_plating_configurator/data/fp_configurator_sequence_data.xml b/fusion-plating/fusion_plating_configurator/data/fp_configurator_sequence_data.xml new file mode 100644 index 00000000..1c4a5fa5 --- /dev/null +++ b/fusion-plating/fusion_plating_configurator/data/fp_configurator_sequence_data.xml @@ -0,0 +1,17 @@ + + + + + + Fusion Plating: Configurator + fp.quote.configurator + CFG- + 5 + + + + diff --git a/fusion-plating/fusion_plating_configurator/models/__init__.py b/fusion-plating/fusion_plating_configurator/models/__init__.py new file mode 100644 index 00000000..9f0c08b4 --- /dev/null +++ b/fusion-plating/fusion_plating_configurator/models/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# Copyright 2026 Nexa Systems Inc. +# License OPL-1 (Odoo Proprietary License v1.0) +# Part of the Fusion Plating product family. + +from . import fp_treatment diff --git a/fusion-plating/fusion_plating_configurator/models/fp_treatment.py b/fusion-plating/fusion_plating_configurator/models/fp_treatment.py new file mode 100644 index 00000000..58caa78c --- /dev/null +++ b/fusion-plating/fusion_plating_configurator/models/fp_treatment.py @@ -0,0 +1,51 @@ +# -*- 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 fields, models + + +class FpTreatment(models.Model): + """Pre- or post-treatment step (bead blast, zincate, bake, passivate, etc.). + + Used by coating configurations to specify which preparation and + finishing steps are required for a given process. + """ + _name = 'fp.treatment' + _description = 'Fusion Plating — Treatment' + _order = 'treatment_type, sequence, name' + + name = fields.Char( + string='Treatment', + required=True, + help='e.g. "Bead Blast", "Zincate", "Hydrogen Embrittlement Bake"', + ) + treatment_type = fields.Selection( + [('pre', 'Pre-Treatment'), ('post', 'Post-Treatment')], + string='Type', + required=True, + default='pre', + ) + sequence = fields.Integer(string='Sequence', default=10) + default_duration_minutes = fields.Float( + string='Default Duration (min)', + help='Estimated duration per application in minutes.', + ) + currency_id = fields.Many2one( + 'res.currency', + string='Currency', + default=lambda self: self.env.company.currency_id, + ) + default_cost = fields.Monetary( + string='Default Cost', + currency_field='currency_id', + help='Default cost per application. Can be overridden on pricing rules.', + ) + description = fields.Text(string='Description') + active = fields.Boolean(string='Active', default=True) + + _sql_constraints = [ + ('fp_treatment_name_type_uniq', 'unique(name, treatment_type)', + 'Treatment name must be unique per type.'), + ] diff --git a/fusion-plating/fusion_plating_configurator/security/fp_configurator_security.xml b/fusion-plating/fusion_plating_configurator/security/fp_configurator_security.xml new file mode 100644 index 00000000..3afe5e29 --- /dev/null +++ b/fusion-plating/fusion_plating_configurator/security/fp_configurator_security.xml @@ -0,0 +1,25 @@ + + + + + + Estimator + + + + + + Shop Manager + + + + + + diff --git a/fusion-plating/fusion_plating_configurator/security/ir.model.access.csv b/fusion-plating/fusion_plating_configurator/security/ir.model.access.csv new file mode 100644 index 00000000..5a71a42f --- /dev/null +++ b/fusion-plating/fusion_plating_configurator/security/ir.model.access.csv @@ -0,0 +1,4 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_fp_treatment_operator,fp.treatment.operator,model_fp_treatment,fusion_plating.group_fusion_plating_operator,1,0,0,0 +access_fp_treatment_supervisor,fp.treatment.supervisor,model_fp_treatment,fusion_plating.group_fusion_plating_supervisor,1,1,0,0 +access_fp_treatment_manager,fp.treatment.manager,model_fp_treatment,fusion_plating.group_fusion_plating_manager,1,1,1,1 diff --git a/fusion-plating/fusion_plating_configurator/static/description/icon.png b/fusion-plating/fusion_plating_configurator/static/description/icon.png new file mode 100644 index 00000000..a61b43b7 Binary files /dev/null and b/fusion-plating/fusion_plating_configurator/static/description/icon.png differ diff --git a/fusion-plating/fusion_plating_configurator/views/fp_coating_config_views.xml b/fusion-plating/fusion_plating_configurator/views/fp_coating_config_views.xml new file mode 100644 index 00000000..85d8c23e --- /dev/null +++ b/fusion-plating/fusion_plating_configurator/views/fp_coating_config_views.xml @@ -0,0 +1,2 @@ + + diff --git a/fusion-plating/fusion_plating_configurator/views/fp_configurator_menu.xml b/fusion-plating/fusion_plating_configurator/views/fp_configurator_menu.xml new file mode 100644 index 00000000..85d8c23e --- /dev/null +++ b/fusion-plating/fusion_plating_configurator/views/fp_configurator_menu.xml @@ -0,0 +1,2 @@ + + diff --git a/fusion-plating/fusion_plating_configurator/views/fp_part_catalog_views.xml b/fusion-plating/fusion_plating_configurator/views/fp_part_catalog_views.xml new file mode 100644 index 00000000..85d8c23e --- /dev/null +++ b/fusion-plating/fusion_plating_configurator/views/fp_part_catalog_views.xml @@ -0,0 +1,2 @@ + + diff --git a/fusion-plating/fusion_plating_configurator/views/fp_pricing_rule_views.xml b/fusion-plating/fusion_plating_configurator/views/fp_pricing_rule_views.xml new file mode 100644 index 00000000..85d8c23e --- /dev/null +++ b/fusion-plating/fusion_plating_configurator/views/fp_pricing_rule_views.xml @@ -0,0 +1,2 @@ + + diff --git a/fusion-plating/fusion_plating_configurator/views/fp_quote_configurator_views.xml b/fusion-plating/fusion_plating_configurator/views/fp_quote_configurator_views.xml new file mode 100644 index 00000000..85d8c23e --- /dev/null +++ b/fusion-plating/fusion_plating_configurator/views/fp_quote_configurator_views.xml @@ -0,0 +1,2 @@ + + diff --git a/fusion-plating/fusion_plating_configurator/views/fp_treatment_views.xml b/fusion-plating/fusion_plating_configurator/views/fp_treatment_views.xml new file mode 100644 index 00000000..083402a2 --- /dev/null +++ b/fusion-plating/fusion_plating_configurator/views/fp_treatment_views.xml @@ -0,0 +1,95 @@ + + + + + + + fp.treatment.list + fp.treatment + + + + + + + + + + + + + + + fp.treatment.form + fp.treatment + +
+ + +
+
+ + + + + + + + + + + + + + + + + +
+
+
+
+ + + + fp.treatment.search + fp.treatment + + + + + + + + + + + + + + + + + + Treatments + fp.treatment + list,form + + +

+ No treatments defined yet +

+

+ Add pre-treatment steps (bead blast, zincate, acid etch) and + post-treatment steps (bake, passivate, chromate seal). +

+
+
+ +
diff --git a/fusion-plating/fusion_plating_configurator/views/sale_order_views.xml b/fusion-plating/fusion_plating_configurator/views/sale_order_views.xml new file mode 100644 index 00000000..85d8c23e --- /dev/null +++ b/fusion-plating/fusion_plating_configurator/views/sale_order_views.xml @@ -0,0 +1,2 @@ + +