diff --git a/sale_commission_product_criteria_price_compliance/README.rst b/sale_commission_product_criteria_price_compliance/README.rst new file mode 100644 index 000000000..56aeddc1c --- /dev/null +++ b/sale_commission_product_criteria_price_compliance/README.rst @@ -0,0 +1,128 @@ +=================================================== +Sale Commission Product Criteria - Price Compliance +=================================================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:5a14698bcd8b8675afc30805436f3ec9a21fc98576a90920f63e2200c73dc933 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png + :target: https://odoo-community.org/page/development-status + :alt: Alpha +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fcommission-lightgray.png?logo=github + :target: https://github.com/OCA/commission/tree/16.0/sale_commission_product_criteria_price_compliance + :alt: OCA/commission +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/commission-16-0/commission-16-0-sale_commission_product_criteria_price_compliance + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/commission&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module extends the functionality of commissions to support adding +Price Compliance Tiers to the Commission rules and to allow you to +manage Price Compliances commissions in this way. + +.. IMPORTANT:: + This is an alpha version, the data model and design can change at any time without warning. + Only for development or testing purpose, do not use in production. + `More details on development status `_ + +**Table of contents** + +.. contents:: + :local: + +Use Cases / Context +=================== + +This module was developed because we need to introduce Price Compliance +tiers on commissions. + +It will be useful for you if you want to define commisions based on how +are doing our agents with Compliant Pricing. + +Configuration +============= + +To configure this module, you need to setup Commissions and Price +Compliance Tiers. + +See documentation of Commission and Sale Price Compliance modules. + +Usage +===== + +To use this module, you need to: + +1. Go to Commissions App > Configuration > Commision types. +2. Create a new Commission Type and set **Product criteria** on field + Type. +3. On rules, select the rule that you want and choose Product Criteria + Tier. +4. Create a Sale with an Agent and change price to change Product + Criteria Tier. +5. Continue with the main workflow to create an effective settlement + from a Sale. +6. Print settlement Report to see the Product Criteria Tier on each + Settlement Line. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Moduon + +Contributors +------------ + +- Eduardo de Miguel (`Moduon `__) + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-Shide| image:: https://github.com/Shide.png?size=40px + :target: https://github.com/Shide + :alt: Shide +.. |maintainer-rafaelbn| image:: https://github.com/rafaelbn.png?size=40px + :target: https://github.com/rafaelbn + :alt: rafaelbn + +Current `maintainers `__: + +|maintainer-Shide| |maintainer-rafaelbn| + +This module is part of the `OCA/commission `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/sale_commission_product_criteria_price_compliance/__init__.py b/sale_commission_product_criteria_price_compliance/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/sale_commission_product_criteria_price_compliance/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/sale_commission_product_criteria_price_compliance/__manifest__.py b/sale_commission_product_criteria_price_compliance/__manifest__.py new file mode 100644 index 000000000..edfc38ff1 --- /dev/null +++ b/sale_commission_product_criteria_price_compliance/__manifest__.py @@ -0,0 +1,27 @@ +# Copyright 2026 Moduon Team S.L. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl-3.0) + +{ + "name": "Sale Commission Product Criteria - Price Compliance", + "summary": "Commision rules for Pricing Compliance", + "version": "16.0.1.0.0", + "development_status": "Alpha", + "category": "Sales", + "website": "https://github.com/OCA/commission", + "author": "Moduon, Odoo Community Association (OCA)", + "maintainers": ["Shide", "rafaelbn"], + "license": "AGPL-3", + "application": False, + "installable": True, + "depends": [ + "sale_commission_product_criteria", + "sale_price_compliance", + ], + "data": [ + "views/commission_view.xml", + "views/commission_item_view.xml", + "views/commission_settlement_view.xml", + "views/commission_settlement_line_view.xml", + "report/report_settlement_templates.xml", + ], +} diff --git a/sale_commission_product_criteria_price_compliance/i18n/es.po b/sale_commission_product_criteria_price_compliance/i18n/es.po new file mode 100644 index 000000000..be9e294b9 --- /dev/null +++ b/sale_commission_product_criteria_price_compliance/i18n/es.po @@ -0,0 +1,60 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_commission_product_criteria_price_compliance +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-02-19 11:13+0000\n" +"PO-Revision-Date: 2026-02-19 12:14+0100\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.6\n" + +#. module: sale_commission_product_criteria_price_compliance +#: model:ir.model,name:sale_commission_product_criteria_price_compliance.model_commission_item +msgid "Commission Item" +msgstr "Detalle de la comisión" + +#. module: sale_commission_product_criteria_price_compliance +#: model:ir.model.fields,help:sale_commission_product_criteria_price_compliance.field_commission_item__price_compliance_tier +#: model:ir.model.fields,help:sale_commission_product_criteria_price_compliance.field_commission_settlement_line__price_compliance_tier +msgid "" +"Indicates the Tier of Price Compliance based on the unit price and applied " +"discount compared to defined thresholds." +msgstr "" +"Indica el tramo del Cumplimiento de Precios basado en el precio unitario y " +"el descuento aplicado comparado con los tramos definidos." + +#. module: sale_commission_product_criteria_price_compliance +#: model:ir.model,name:sale_commission_product_criteria_price_compliance.model_commission_settlement_line +msgid "Line of a commission settlement" +msgstr "Línea de liquidación de una comisión" + +#. module: sale_commission_product_criteria_price_compliance +#: model:ir.model,name:sale_commission_product_criteria_price_compliance.model_commission_line_mixin +msgid "" +"Mixin model for having commission agent lines in any object inheriting from " +"this one" +msgstr "" +"Modelo de mezclador para tener líneas de comisionista en cualquier objeto " +"que herede de éste" + +#. module: sale_commission_product_criteria_price_compliance +#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria_price_compliance.report_settlement_document +msgid "Price Compliance" +msgstr "Cumplimiento de Precios" + +#. module: sale_commission_product_criteria_price_compliance +#: model:ir.model.fields,field_description:sale_commission_product_criteria_price_compliance.field_commission_item__price_compliance_tier +#: model:ir.model.fields,field_description:sale_commission_product_criteria_price_compliance.field_commission_settlement_line__price_compliance_tier +#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria_price_compliance.commission_item_search +#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria_price_compliance.view_settlement_line_search +msgid "Price Compliance Tier" +msgstr "Nivel de cumplimiento de precios" diff --git a/sale_commission_product_criteria_price_compliance/i18n/sale_commission_product_criteria_price_compliance.pot b/sale_commission_product_criteria_price_compliance/i18n/sale_commission_product_criteria_price_compliance.pot new file mode 100644 index 000000000..9feec362e --- /dev/null +++ b/sale_commission_product_criteria_price_compliance/i18n/sale_commission_product_criteria_price_compliance.pot @@ -0,0 +1,54 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_commission_product_criteria_price_compliance +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-02-19 11:13+0000\n" +"PO-Revision-Date: 2026-02-19 11:13+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: sale_commission_product_criteria_price_compliance +#: model:ir.model,name:sale_commission_product_criteria_price_compliance.model_commission_item +msgid "Commission Item" +msgstr "" + +#. module: sale_commission_product_criteria_price_compliance +#: model:ir.model.fields,help:sale_commission_product_criteria_price_compliance.field_commission_item__price_compliance_tier +#: model:ir.model.fields,help:sale_commission_product_criteria_price_compliance.field_commission_settlement_line__price_compliance_tier +msgid "" +"Indicates the Tier of Price Compliance based on the unit price and applied " +"discount compared to defined thresholds." +msgstr "" + +#. module: sale_commission_product_criteria_price_compliance +#: model:ir.model,name:sale_commission_product_criteria_price_compliance.model_commission_settlement_line +msgid "Line of a commission settlement" +msgstr "" + +#. module: sale_commission_product_criteria_price_compliance +#: model:ir.model,name:sale_commission_product_criteria_price_compliance.model_commission_line_mixin +msgid "" +"Mixin model for having commission agent lines in any object inheriting from " +"this one" +msgstr "" + +#. module: sale_commission_product_criteria_price_compliance +#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria_price_compliance.report_settlement_document +msgid "Price Compliance" +msgstr "" + +#. module: sale_commission_product_criteria_price_compliance +#: model:ir.model.fields,field_description:sale_commission_product_criteria_price_compliance.field_commission_item__price_compliance_tier +#: model:ir.model.fields,field_description:sale_commission_product_criteria_price_compliance.field_commission_settlement_line__price_compliance_tier +#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria_price_compliance.commission_item_search +#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria_price_compliance.view_settlement_line_search +msgid "Price Compliance Tier" +msgstr "" diff --git a/sale_commission_product_criteria_price_compliance/models/__init__.py b/sale_commission_product_criteria_price_compliance/models/__init__.py new file mode 100644 index 000000000..84742e5e1 --- /dev/null +++ b/sale_commission_product_criteria_price_compliance/models/__init__.py @@ -0,0 +1,3 @@ +from . import commission_item +from . import commission_settlement_line +from . import sale_commission_line_mixin diff --git a/sale_commission_product_criteria_price_compliance/models/commission_item.py b/sale_commission_product_criteria_price_compliance/models/commission_item.py new file mode 100644 index 000000000..2d4f6e556 --- /dev/null +++ b/sale_commission_product_criteria_price_compliance/models/commission_item.py @@ -0,0 +1,19 @@ +# Copyright 2026 Moduon Team S.L. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl-3.0) + +from odoo import api, fields, models + + +class CommissionItem(models.Model): + _name = "commission.item" + _inherit = ["commission.item", "product.price.compliance.threshold.tier.mixin"] + _order = "applied_on, based_on, categ_id desc, price_compliance_tier asc, id desc" + + price_compliance_tier = fields.Selection( + readonly=False, + ) + + @api.model + def _get_price_compliance_selection_tiers(self): + """Dislay texts on selection instead of icon colors.""" + return self._get_price_compliance_selection_tiers_text() diff --git a/sale_commission_product_criteria_price_compliance/models/commission_settlement_line.py b/sale_commission_product_criteria_price_compliance/models/commission_settlement_line.py new file mode 100644 index 000000000..c8cffc333 --- /dev/null +++ b/sale_commission_product_criteria_price_compliance/models/commission_settlement_line.py @@ -0,0 +1,29 @@ +# Copyright 2026 Moduon Team S.L. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl-3.0) + +from odoo import api, fields, models + + +class CommissionSettlementLine(models.AbstractModel): + _name = "commission.settlement.line" + _inherit = [ + "commission.settlement.line", + "product.price.compliance.threshold.tier.mixin", + ] + + price_compliance_tier = fields.Selection( + compute="_compute_price_compliance_tier", + store=True, + ) + + @api.model + def _get_price_compliance_selection_tiers(self): + """Dislay texts on selection instead of icon colors.""" + return self._get_price_compliance_selection_tiers_text() + + @api.depends("invoice_line_id") + def _compute_price_compliance_tier(self): + for settlement_line in self: + # Get the first one + sale_line = settlement_line.invoice_line_id.sale_line_ids[:1] + settlement_line.price_compliance_tier = sale_line.price_compliance_tier diff --git a/sale_commission_product_criteria_price_compliance/models/sale_commission_line_mixin.py b/sale_commission_product_criteria_price_compliance/models/sale_commission_line_mixin.py new file mode 100644 index 000000000..087bf0ab3 --- /dev/null +++ b/sale_commission_product_criteria_price_compliance/models/sale_commission_line_mixin.py @@ -0,0 +1,34 @@ +# Copyright 2026 Moduon Team S.L. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl-3.0) + +from odoo import models + + +class SaleCommissionLineMixin(models.AbstractModel): + _inherit = "commission.line.mixin" + + def _commission_items_query_params(self, commission, product): + res = super()._commission_items_query_params(commission, product) + # Find the sale.order.line related to its price_compliance_tier + sale_line = None + if self.object_id._name == "sale.order.line": + sale_line = self.object_id + elif self.object_id._name == "account.move.line": + sale_line = self.object_id.sale_line_ids[:1] # Choose the first one + res["price_compliance_tier"] = ( + sale_line and sale_line.price_compliance_tier or None + ) + return res + + def _commission_items_where(self): + res = super()._commission_items_where() + res = f"""{res} AND ( + item.price_compliance_tier IS NULL + OR item.price_compliance_tier = %(price_compliance_tier)s + )""" # noqa: E202 + return res + + def _commission_items_order(self): + res = super()._commission_items_order() + res = f"item.price_compliance_tier asc, {res}" + return res diff --git a/sale_commission_product_criteria_price_compliance/readme/CONFIGURE.md b/sale_commission_product_criteria_price_compliance/readme/CONFIGURE.md new file mode 100644 index 000000000..3f0fe694c --- /dev/null +++ b/sale_commission_product_criteria_price_compliance/readme/CONFIGURE.md @@ -0,0 +1,3 @@ +To configure this module, you need to setup Commissions and Price Compliance Tiers. + +See documentation of Commission and Sale Price Compliance modules. diff --git a/sale_commission_product_criteria_price_compliance/readme/CONTEXT.md b/sale_commission_product_criteria_price_compliance/readme/CONTEXT.md new file mode 100644 index 000000000..494093c43 --- /dev/null +++ b/sale_commission_product_criteria_price_compliance/readme/CONTEXT.md @@ -0,0 +1,3 @@ +This module was developed because we need to introduce Price Compliance tiers on commissions. + +It will be useful for you if you want to define commisions based on how are doing our agents with Compliant Pricing. diff --git a/sale_commission_product_criteria_price_compliance/readme/CONTRIBUTORS.md b/sale_commission_product_criteria_price_compliance/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..290347f42 --- /dev/null +++ b/sale_commission_product_criteria_price_compliance/readme/CONTRIBUTORS.md @@ -0,0 +1 @@ +- Eduardo de Miguel ([Moduon](https://www.moduon.team/)) diff --git a/sale_commission_product_criteria_price_compliance/readme/DESCRIPTION.md b/sale_commission_product_criteria_price_compliance/readme/DESCRIPTION.md new file mode 100644 index 000000000..e38110669 --- /dev/null +++ b/sale_commission_product_criteria_price_compliance/readme/DESCRIPTION.md @@ -0,0 +1,2 @@ + +This module extends the functionality of commissions to support adding Price Compliance Tiers to the Commission rules and to allow you to manage Price Compliances commissions in this way. diff --git a/sale_commission_product_criteria_price_compliance/readme/USAGE.md b/sale_commission_product_criteria_price_compliance/readme/USAGE.md new file mode 100644 index 000000000..5c7c8abac --- /dev/null +++ b/sale_commission_product_criteria_price_compliance/readme/USAGE.md @@ -0,0 +1,9 @@ +To use this module, you need to: + +1. Go to Commissions App > Configuration > Commision types. +1. Create a new Commission Type and set **Product criteria** on field Type. +1. On rules, select the rule that you want and choose Product Criteria Tier. +1. Create a Sale with an Agent and change price to change Product Criteria Tier. +1. Continue with the main workflow to create an effective settlement from a Sale. +1. Print settlement Report to see the Product Criteria Tier on each Settlement Line. + diff --git a/sale_commission_product_criteria_price_compliance/report/report_settlement_templates.xml b/sale_commission_product_criteria_price_compliance/report/report_settlement_templates.xml new file mode 100644 index 000000000..366a0c092 --- /dev/null +++ b/sale_commission_product_criteria_price_compliance/report/report_settlement_templates.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/sale_commission_product_criteria_price_compliance/static/description/icon.png b/sale_commission_product_criteria_price_compliance/static/description/icon.png new file mode 100644 index 000000000..3a0328b51 Binary files /dev/null and b/sale_commission_product_criteria_price_compliance/static/description/icon.png differ diff --git a/sale_commission_product_criteria_price_compliance/static/description/index.html b/sale_commission_product_criteria_price_compliance/static/description/index.html new file mode 100644 index 000000000..570e1f085 --- /dev/null +++ b/sale_commission_product_criteria_price_compliance/static/description/index.html @@ -0,0 +1,466 @@ + + + + + +Sale Commission Product Criteria - Price Compliance + + + +
+

Sale Commission Product Criteria - Price Compliance

+ + +

Alpha License: AGPL-3 OCA/commission Translate me on Weblate Try me on Runboat

+

This module extends the functionality of commissions to support adding +Price Compliance Tiers to the Commission rules and to allow you to +manage Price Compliances commissions in this way.

+
+

Important

+

This is an alpha version, the data model and design can change at any time without warning. +Only for development or testing purpose, do not use in production. +More details on development status

+
+

Table of contents

+ +
+

Use Cases / Context

+

This module was developed because we need to introduce Price Compliance +tiers on commissions.

+

It will be useful for you if you want to define commisions based on how +are doing our agents with Compliant Pricing.

+
+
+

Configuration

+

To configure this module, you need to setup Commissions and Price +Compliance Tiers.

+

See documentation of Commission and Sale Price Compliance modules.

+
+
+

Usage

+

To use this module, you need to:

+
    +
  1. Go to Commissions App > Configuration > Commision types.
  2. +
  3. Create a new Commission Type and set Product criteria on field +Type.
  4. +
  5. On rules, select the rule that you want and choose Product Criteria +Tier.
  6. +
  7. Create a Sale with an Agent and change price to change Product +Criteria Tier.
  8. +
  9. Continue with the main workflow to create an effective settlement +from a Sale.
  10. +
  11. Print settlement Report to see the Product Criteria Tier on each +Settlement Line.
  12. +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Moduon
  • +
+
+
+

Contributors

+
    +
  • Eduardo de Miguel (Moduon)
  • +
+
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

Current maintainers:

+

Shide rafaelbn

+

This module is part of the OCA/commission project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/sale_commission_product_criteria_price_compliance/tests/__init__.py b/sale_commission_product_criteria_price_compliance/tests/__init__.py new file mode 100644 index 000000000..54d6d38f8 --- /dev/null +++ b/sale_commission_product_criteria_price_compliance/tests/__init__.py @@ -0,0 +1 @@ +from . import test_sale_commission_product_criteria_price_compliance diff --git a/sale_commission_product_criteria_price_compliance/tests/test_sale_commission_product_criteria_price_compliance.py b/sale_commission_product_criteria_price_compliance/tests/test_sale_commission_product_criteria_price_compliance.py new file mode 100644 index 000000000..86418fa7f --- /dev/null +++ b/sale_commission_product_criteria_price_compliance/tests/test_sale_commission_product_criteria_price_compliance.py @@ -0,0 +1,100 @@ +# Copyright 2026 Moduon Team S.L. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl-3.0) + +from odoo import Command +from odoo.tests.common import TransactionCase + + +class TestSaleCommissionProductCriteriaPriceCompliance(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + # Create commission + cls.commission = cls.env["commission"].create( + { + "name": "Test Commission", + "commission_type": "product", + "item_ids": [ + # Inverse order to test non secuencial items + Command.create( + { + "sequence": 1, + "applied_on": "3_global", + "price_compliance_tier": "t2", + "commission_type": "fixed", + "fixed_amount": 5.0, + } + ), + Command.create( + { + "sequence": 2, + "applied_on": "3_global", + "price_compliance_tier": "t1", + "commission_type": "fixed", + "fixed_amount": 10.0, + } + ), + ], + } + ) + # Create partner and agent + cls.partner = cls.env["res.partner"].create({"name": "Test Partner"}) + cls.agent = cls.env["res.partner"].create( + { + "name": "Test Agent", + "is_company": True, + "agent": True, + "agent_type": "agent", + "commission_id": cls.commission.id, + "settlement": "monthly", + } + ) + # Create product with Price Compliance + cls.product = cls.env["product.product"].create( + { + "name": "Test Product", + "type": "service", + "list_price": 100.0, + "use_price_compliance_threshold": True, + "price_compliance_threshold_t1": 0.1, # 10% + "price_compliance_threshold_t2": 0.2, # 20% + "price_compliance_threshold_t3": 0.0, # Not used + } + ) + + def _create_sale_order(self, partner, product): + return self.env["sale.order"].create( + { + "partner_id": partner.id, + "order_line": [Command.create({"product_id": product.id})], + "user_id": False, + } + ) + + def test_commission_price_compliance_tiers(self): + sale = self._create_sale_order(self.partner, self.product) + sale.recompute_lines_agents() + # Clear agents + sale.order_line.agent_ids.unlink() + # Create sale order line agent and let recomputation happens + self.env["sale.order.line.agent"].create( + { + "object_id": sale.order_line.id, + "agent_id": self.agent.id, + } + ) + # Commision Item Tier 1 discount + sale.order_line.discount = 5.0 + sale.recompute_lines_agents_amount() + self.assertEqual(sale.order_line.price_compliance_tier, "t1") + self.assertEqual(sale.order_line.agent_ids.amount, 10.0) + # Commision Item Tier 2 discount + sale.order_line.discount = 15.0 + sale.recompute_lines_agents_amount() + self.assertEqual(sale.order_line.price_compliance_tier, "t2") + self.assertEqual(sale.order_line.agent_ids.amount, 5.0) + # No item defined for Non Compliance Tier + sale.order_line.discount = 25.0 + sale.recompute_lines_agents_amount() + self.assertEqual(sale.order_line.price_compliance_tier, "non_compliant") + self.assertEqual(sale.order_line.agent_ids.amount, 0.0) diff --git a/sale_commission_product_criteria_price_compliance/views/commission_item_view.xml b/sale_commission_product_criteria_price_compliance/views/commission_item_view.xml new file mode 100644 index 000000000..8db311fa8 --- /dev/null +++ b/sale_commission_product_criteria_price_compliance/views/commission_item_view.xml @@ -0,0 +1,46 @@ + + + + + commission.item + + + + + + + + + commission.item + + + + + + + + + commission.item + + + + + + + + diff --git a/sale_commission_product_criteria_price_compliance/views/commission_settlement_line_view.xml b/sale_commission_product_criteria_price_compliance/views/commission_settlement_line_view.xml new file mode 100644 index 000000000..803592e60 --- /dev/null +++ b/sale_commission_product_criteria_price_compliance/views/commission_settlement_line_view.xml @@ -0,0 +1,28 @@ + + + + + commission.settlement.line + + + + + + + + + commission.settlement.line + + + + + + + + diff --git a/sale_commission_product_criteria_price_compliance/views/commission_settlement_view.xml b/sale_commission_product_criteria_price_compliance/views/commission_settlement_view.xml new file mode 100644 index 000000000..3dca7fe8d --- /dev/null +++ b/sale_commission_product_criteria_price_compliance/views/commission_settlement_view.xml @@ -0,0 +1,17 @@ + + + + + commission.settlement + + + + + + + + diff --git a/sale_commission_product_criteria_price_compliance/views/commission_view.xml b/sale_commission_product_criteria_price_compliance/views/commission_view.xml new file mode 100644 index 000000000..e47843293 --- /dev/null +++ b/sale_commission_product_criteria_price_compliance/views/commission_view.xml @@ -0,0 +1,20 @@ + + + + + commission + + + + + + + + diff --git a/setup/sale_commission_product_criteria_price_compliance/odoo/addons/sale_commission_product_criteria_price_compliance b/setup/sale_commission_product_criteria_price_compliance/odoo/addons/sale_commission_product_criteria_price_compliance new file mode 120000 index 000000000..df4c940d1 --- /dev/null +++ b/setup/sale_commission_product_criteria_price_compliance/odoo/addons/sale_commission_product_criteria_price_compliance @@ -0,0 +1 @@ +../../../../sale_commission_product_criteria_price_compliance \ No newline at end of file diff --git a/setup/sale_commission_product_criteria_price_compliance/setup.py b/setup/sale_commission_product_criteria_price_compliance/setup.py new file mode 100644 index 000000000..28c57bb64 --- /dev/null +++ b/setup/sale_commission_product_criteria_price_compliance/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) diff --git a/test-requirements.txt b/test-requirements.txt new file mode 100644 index 000000000..e7632fc7f --- /dev/null +++ b/test-requirements.txt @@ -0,0 +1,2 @@ +odoo_test_helper +odoo-addon-sale_price_compliance @ git+https://github.com/OCA/sale-workflow.git@refs/pull/4115/head#subdirectory=sale_price_compliance