feat(configurator): fp.additional.charge.type model + config menu + seed
This commit is contained in:
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
'name': 'Fusion Plating — Configurator',
|
'name': 'Fusion Plating — Configurator',
|
||||||
'version': '19.0.22.8.0',
|
'version': '19.0.23.0.0',
|
||||||
'category': 'Manufacturing/Plating',
|
'category': 'Manufacturing/Plating',
|
||||||
'summary': 'Quotation configurator with part catalog, coating configs, and formula-based pricing engine.',
|
'summary': 'Quotation configurator with part catalog, coating configs, and formula-based pricing engine.',
|
||||||
'description': """
|
'description': """
|
||||||
@@ -44,6 +44,7 @@ Provides:
|
|||||||
'views/fp_part_catalog_views.xml',
|
'views/fp_part_catalog_views.xml',
|
||||||
'views/fp_process_node_part_scoped_views.xml',
|
'views/fp_process_node_part_scoped_views.xml',
|
||||||
'views/fp_pricing_rule_views.xml',
|
'views/fp_pricing_rule_views.xml',
|
||||||
|
'views/fp_additional_charge_type_views.xml',
|
||||||
'views/fp_quote_configurator_views.xml',
|
'views/fp_quote_configurator_views.xml',
|
||||||
'views/sale_order_views.xml',
|
'views/sale_order_views.xml',
|
||||||
'views/res_partner_views.xml',
|
'views/res_partner_views.xml',
|
||||||
@@ -59,6 +60,7 @@ Provides:
|
|||||||
'views/fp_configurator_menu.xml',
|
'views/fp_configurator_menu.xml',
|
||||||
'views/fp_so_job_sort_views.xml',
|
'views/fp_so_job_sort_views.xml',
|
||||||
'data/fp_sale_description_template_data.xml',
|
'data/fp_sale_description_template_data.xml',
|
||||||
|
'data/fp_additional_charge_type_data.xml',
|
||||||
],
|
],
|
||||||
'assets': {
|
'assets': {
|
||||||
'web.assets_backend': [
|
'web.assets_backend': [
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo noupdate="1">
|
||||||
|
<record id="charge_type_tooling" model="fp.additional.charge.type">
|
||||||
|
<field name="name">Tooling Charge</field>
|
||||||
|
<field name="sequence">1</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
||||||
@@ -9,6 +9,7 @@ from . import fp_pricing_complexity_surcharge
|
|||||||
from . import fp_pricing_rule
|
from . import fp_pricing_rule
|
||||||
from . import fp_sale_description_template
|
from . import fp_sale_description_template
|
||||||
from . import fp_part_description_version
|
from . import fp_part_description_version
|
||||||
|
from . import fp_additional_charge_type
|
||||||
from . import fp_so_job_sort
|
from . import fp_so_job_sort
|
||||||
from . import fp_quote_configurator
|
from . import fp_quote_configurator
|
||||||
from . import fp_serial
|
from . import fp_serial
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
# -*- 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 FpAdditionalChargeType(models.Model):
|
||||||
|
"""A configurable, reusable 'additional charge' label (Tooling, Rush,
|
||||||
|
Setup, …) picked on the order-entry summary. Searchable + quick-create.
|
||||||
|
|
||||||
|
Spec: docs/superpowers/specs/2026-05-29-configurable-charge-tax-lot-pricing-design.md
|
||||||
|
"""
|
||||||
|
_name = 'fp.additional.charge.type'
|
||||||
|
_description = 'Fusion Plating — Additional Charge Type'
|
||||||
|
_order = 'sequence, name'
|
||||||
|
|
||||||
|
name = fields.Char(string='Charge Type', required=True)
|
||||||
|
default_amount = fields.Monetary(
|
||||||
|
string='Default Amount', currency_field='currency_id',
|
||||||
|
help='Optional amount pre-filled when this type is picked on an '
|
||||||
|
'order. The operator can override it.',
|
||||||
|
)
|
||||||
|
currency_id = fields.Many2one(
|
||||||
|
'res.currency', default=lambda self: self.env.company.currency_id,
|
||||||
|
)
|
||||||
|
active = fields.Boolean(default=True)
|
||||||
|
sequence = fields.Integer(default=10)
|
||||||
@@ -47,3 +47,6 @@ access_fp_so_job_sort_manager,fp.so.job.sort.manager,model_fp_so_job_sort,fusion
|
|||||||
access_fp_part_description_version_user,fp.part.description.version.user,model_fp_part_description_version,base.group_user,1,0,0,0
|
access_fp_part_description_version_user,fp.part.description.version.user,model_fp_part_description_version,base.group_user,1,0,0,0
|
||||||
access_fp_part_description_version_estimator,fp.part.description.version.estimator,model_fp_part_description_version,fusion_plating.group_fp_sales_rep,1,1,1,0
|
access_fp_part_description_version_estimator,fp.part.description.version.estimator,model_fp_part_description_version,fusion_plating.group_fp_sales_rep,1,1,1,0
|
||||||
access_fp_part_description_version_manager,fp.part.description.version.manager,model_fp_part_description_version,fusion_plating.group_fp_manager,1,1,1,1
|
access_fp_part_description_version_manager,fp.part.description.version.manager,model_fp_part_description_version,fusion_plating.group_fp_manager,1,1,1,1
|
||||||
|
access_fp_additional_charge_type_user,fp.additional.charge.type.user,model_fp_additional_charge_type,base.group_user,1,0,0,0
|
||||||
|
access_fp_additional_charge_type_estimator,fp.additional.charge.type.estimator,model_fp_additional_charge_type,fusion_plating.group_fp_sales_rep,1,1,1,0
|
||||||
|
access_fp_additional_charge_type_manager,fp.additional.charge.type.manager,model_fp_additional_charge_type,fusion_plating.group_fp_manager,1,1,1,1
|
||||||
|
|||||||
|
@@ -8,3 +8,4 @@ from . import test_express_so_line_fields
|
|||||||
from . import test_express_sale_order_fields
|
from . import test_express_sale_order_fields
|
||||||
from . import test_express_wizard_fields
|
from . import test_express_wizard_fields
|
||||||
from . import test_part_description_history
|
from . import test_part_description_history
|
||||||
|
from . import test_charge_tax_lot
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright 2026 Nexa Systems Inc.
|
||||||
|
# License OPL-1 (Odoo Proprietary License v1.0)
|
||||||
|
"""Configurable charge + order-level tax + lot pricing (spec 2026-05-29)."""
|
||||||
|
from odoo.tests.common import TransactionCase, tagged
|
||||||
|
|
||||||
|
|
||||||
|
@tagged('post_install', '-at_install', 'fp_charge_tax_lot')
|
||||||
|
class TestChargeTaxLot(TransactionCase):
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(cls):
|
||||||
|
super().setUpClass()
|
||||||
|
cls.partner = cls.env['res.partner'].create({'name': 'ChargeCust'})
|
||||||
|
cls.tax13 = cls.env['account.tax'].create({
|
||||||
|
'name': 'FP Test 13%',
|
||||||
|
'amount': 13.0,
|
||||||
|
'amount_type': 'percent',
|
||||||
|
'type_tax_use': 'sale',
|
||||||
|
})
|
||||||
|
|
||||||
|
# ----- Task 1: charge type model -----
|
||||||
|
def test_charge_type_quick_create_and_default(self):
|
||||||
|
ct = self.env['fp.additional.charge.type'].create({
|
||||||
|
'name': 'Rush Fee', 'default_amount': 75.0,
|
||||||
|
})
|
||||||
|
self.assertEqual(ct.name, 'Rush Fee')
|
||||||
|
self.assertEqual(ct.default_amount, 75.0)
|
||||||
|
cid, cname = self.env['fp.additional.charge.type'].name_create('Setup')
|
||||||
|
self.assertTrue(cid)
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<record id="view_fp_additional_charge_type_list" model="ir.ui.view">
|
||||||
|
<field name="name">fp.additional.charge.type.list</field>
|
||||||
|
<field name="model">fp.additional.charge.type</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<list editable="bottom">
|
||||||
|
<field name="sequence" widget="handle"/>
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="default_amount" widget="monetary"
|
||||||
|
options="{'currency_field': 'currency_id'}"/>
|
||||||
|
<field name="active" widget="boolean_toggle"/>
|
||||||
|
<field name="currency_id" column_invisible="1"/>
|
||||||
|
</list>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="action_fp_additional_charge_type" model="ir.actions.act_window">
|
||||||
|
<field name="name">Additional Charge Types</field>
|
||||||
|
<field name="res_model">fp.additional.charge.type</field>
|
||||||
|
<field name="view_mode">list</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<menuitem id="menu_fp_additional_charge_type"
|
||||||
|
name="Additional Charge Types"
|
||||||
|
parent="fusion_plating.menu_fp_config_pricing_billing"
|
||||||
|
action="action_fp_additional_charge_type"
|
||||||
|
sequence="30"/>
|
||||||
|
</odoo>
|
||||||
Reference in New Issue
Block a user