From 4b7c7fc9ee588ebe43a18f874ebba0dc359d7d24 Mon Sep 17 00:00:00 2001
From: Amjith Titus
Date: Thu, 14 Aug 2025 20:14:58 +0530
Subject: [PATCH 1/4] initital commit
---
sale_commission_product_criteria/README.rst | 116 +++++
sale_commission_product_criteria/__init__.py | 1 +
.../__manifest__.py | 22 +
.../demo/sale_agent_demo.xml | 69 +++
sale_commission_product_criteria/i18n/es.po | 421 ++++++++++++++++
sale_commission_product_criteria/i18n/it.po | 427 ++++++++++++++++
.../i18n/pt_BR.po | 397 +++++++++++++++
.../i18n/sale_commission_product_criteria.pot | 396 +++++++++++++++
.../models/__init__.py | 5 +
.../models/account_move.py | 30 ++
.../models/commission.py | 268 +++++++++++
.../models/sale.py | 55 +++
.../models/sale_commission_line_mixin.py | 91 ++++
.../models/settlement.py | 7 +
.../readme/CONTRIBUTORS.rst | 6 +
.../readme/DESCRIPTION.rst | 16 +
.../readme/USAGE.rst | 7 +
.../security/ir.model.access.csv | 3 +
.../static/description/icon.png | Bin 0 -> 9455 bytes
.../static/description/index.html | 454 ++++++++++++++++++
.../tests/__init__.py | 1 +
.../test_sale_commission_product_criteria.py | 220 +++++++++
.../views/views.xml | 239 +++++++++
23 files changed, 3251 insertions(+)
create mode 100644 sale_commission_product_criteria/README.rst
create mode 100644 sale_commission_product_criteria/__init__.py
create mode 100644 sale_commission_product_criteria/__manifest__.py
create mode 100644 sale_commission_product_criteria/demo/sale_agent_demo.xml
create mode 100644 sale_commission_product_criteria/i18n/es.po
create mode 100644 sale_commission_product_criteria/i18n/it.po
create mode 100644 sale_commission_product_criteria/i18n/pt_BR.po
create mode 100644 sale_commission_product_criteria/i18n/sale_commission_product_criteria.pot
create mode 100644 sale_commission_product_criteria/models/__init__.py
create mode 100644 sale_commission_product_criteria/models/account_move.py
create mode 100644 sale_commission_product_criteria/models/commission.py
create mode 100644 sale_commission_product_criteria/models/sale.py
create mode 100644 sale_commission_product_criteria/models/sale_commission_line_mixin.py
create mode 100644 sale_commission_product_criteria/models/settlement.py
create mode 100644 sale_commission_product_criteria/readme/CONTRIBUTORS.rst
create mode 100644 sale_commission_product_criteria/readme/DESCRIPTION.rst
create mode 100644 sale_commission_product_criteria/readme/USAGE.rst
create mode 100644 sale_commission_product_criteria/security/ir.model.access.csv
create mode 100644 sale_commission_product_criteria/static/description/icon.png
create mode 100644 sale_commission_product_criteria/static/description/index.html
create mode 100644 sale_commission_product_criteria/tests/__init__.py
create mode 100644 sale_commission_product_criteria/tests/test_sale_commission_product_criteria.py
create mode 100644 sale_commission_product_criteria/views/views.xml
diff --git a/sale_commission_product_criteria/README.rst b/sale_commission_product_criteria/README.rst
new file mode 100644
index 000000000..bfc58066c
--- /dev/null
+++ b/sale_commission_product_criteria/README.rst
@@ -0,0 +1,116 @@
+================================
+Sale Commission Product Criteria
+================================
+
+..
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! This file is generated by oca-gen-addon-readme !!
+ !! changes will be overwritten. !!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! source digest: sha256:4bd16205ce53357916f35f63494314b7c39a51d4b787e42f7e13b0eb69fc90f0
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
+ :target: https://odoo-community.org/page/development-status
+ :alt: Beta
+.. |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
+ :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
+ :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 allows to set in the same Commission Type different commission rates according to the product on SO/invoice line.
+
+This is made possible since this module adds a new "Product criteria" type to Commission Type and applies commission rates with the same logic of sale pricelist items.
+
+For example, such a Commission Type can grant:
+
+10% on a specific Product A,
+10$ on Product B,
+4% on products in Category 1 and
+5$ on all other products.
+
+In SO/invoice, system will apply different commissions based on variant/product/category or global, applied hierarchically. This means that for the example above, if product A is assigned to Category 1, commission assigned is 10%, as per variant/product/category/global rule application order.
+
+Furthermore, these commission type items can be accessed and created by a specific menu, to facilitate their management in environments with lots of records.
+
+The form for commission type item can be extended by future modules with further conditions to decide when to apply a specific item.
+
+**Table of contents**
+
+.. contents::
+ :local:
+
+Usage
+=====
+
+To use features of this module, you need to:
+
+#. Go to Commissions > Configuration > Commission Types.
+#. Create a Commission Type with type = "Product criteria".
+#. Create multiple rules based on variant/product/category or global
+#. These rules will be sorted according to the same logic of sale pricelist.
+#. Rest flow is according to OCA sale_commission module.
+
+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
+~~~~~~~
+
+* Ilyas
+* Ooops404
+
+Contributors
+~~~~~~~~~~~~
+
+* `Ooops404 `__:
+
+ * Ilyas
+* `Aion Tech `_:
+
+ * Simone Rubino
+
+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-ilyasProgrammer| image:: https://github.com/ilyasProgrammer.png?size=40px
+ :target: https://github.com/ilyasProgrammer
+ :alt: ilyasProgrammer
+
+Current `maintainer `__:
+
+|maintainer-ilyasProgrammer|
+
+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/__init__.py b/sale_commission_product_criteria/__init__.py
new file mode 100644
index 000000000..0650744f6
--- /dev/null
+++ b/sale_commission_product_criteria/__init__.py
@@ -0,0 +1 @@
+from . import models
diff --git a/sale_commission_product_criteria/__manifest__.py b/sale_commission_product_criteria/__manifest__.py
new file mode 100644
index 000000000..49a959d4d
--- /dev/null
+++ b/sale_commission_product_criteria/__manifest__.py
@@ -0,0 +1,22 @@
+# © 2023 ooops404
+# Copyright 2023 Simone Rubino - Aion Tech
+# License AGPL-3 - See https://www.gnu.org/licenses/agpl-3.0.html
+{
+ "name": "Sale Commission Product Criteria",
+ "summary": "Advanced commissions rules",
+ "version": "16.0.2.0.0",
+ "author": "Ilyas, Ooops404, Odoo Community Association (OCA)",
+ "maintainers": ["ilyasProgrammer"],
+ "website": "https://github.com/OCA/commission",
+ "category": "Sales Management",
+ "license": "AGPL-3",
+ "depends": ["sale_commission"],
+ "data": [
+ "views/views.xml",
+ "security/ir.model.access.csv",
+ ],
+ "demo": ["demo/sale_agent_demo.xml"],
+ "application": False,
+ "installable": True,
+ "auto_install": False,
+}
diff --git a/sale_commission_product_criteria/demo/sale_agent_demo.xml b/sale_commission_product_criteria/demo/sale_agent_demo.xml
new file mode 100644
index 000000000..caffc6e4a
--- /dev/null
+++ b/sale_commission_product_criteria/demo/sale_agent_demo.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+ Based on Rules
+ product
+
+
+
+
+
+ sol
+ 3_global
+ fixed
+ 10
+
+
+
+
+
+ sol
+ 2_product_category
+ fixed
+ 20
+
+
+
+
+
+
+ sol
+ 1_product
+ percentage
+ 5
+
+
+
+
+
+
+ sol
+ 0_product_variant
+ percentage
+ 15
+
+
+
+
+ Agent Rules
+ True
+ True
+
+
+
+
+
+
+
+
diff --git a/sale_commission_product_criteria/i18n/es.po b/sale_commission_product_criteria/i18n/es.po
new file mode 100644
index 000000000..79e19b76d
--- /dev/null
+++ b/sale_commission_product_criteria/i18n/es.po
@@ -0,0 +1,421 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * sale_commission_product_criteria
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 16.0\n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: 2024-05-09 15:35+0000\n"
+"Last-Translator: Sergio Ariel Ameghino \n"
+"Language-Team: none\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__active
+msgid "Active"
+msgstr "Activo"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model,name:sale_commission_product_criteria.model_account_invoice_line_agent
+msgid "Agent detail of commission line in invoice lines"
+msgstr "Detalle del agente en línea de comisión en líneas de factura"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model,name:sale_commission_product_criteria.model_sale_order_line_agent
+msgid "Agent detail of commission line in order lines"
+msgstr "Detalle del agente en línea de comisión en líneas de pedido"
+
+#. module: sale_commission_product_criteria
+#. odoo-python
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission_item__applied_on__3_global
+#, python-format
+msgid "All Products"
+msgstr "Todos los productos"
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_sale_order_line_tree_mod
+msgid "Amount (%)"
+msgstr "Importe (%)"
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_sale_order_line_tree_mod
+msgid "Amount (fixed)"
+msgstr "Importe (fijo)"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission_item__based_on__sol
+msgid "Any Sale Order Line"
+msgstr "Cualquier línea de pedido de venta"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_account_invoice_line_agent__applied_commission_id
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_line_mixin__applied_commission_id
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__applied_commission_id
+msgid "Applied Commission"
+msgstr "Comisión aplicada"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_account_invoice_line_agent__applied_commission_item_id
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__applied_commission_item_id
+msgid "Applied Commission Item"
+msgstr "Detalle de comisión aplicada"
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_sale_order_line_tree_mod
+msgid "Applied Disc. (%)"
+msgstr "Desc. aplicado (%)"
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.sale_commission_form_lines_mod
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_sale_order_line_tree_mod
+msgid "Applied On"
+msgstr "Aplicado en"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__applied_on
+msgid "Apply On"
+msgstr "Aplicar sobre"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__based_on
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__based_on
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_sale_order_line_tree_mod
+msgid "Based On"
+msgstr "Basado en"
+
+#. module: sale_commission_product_criteria
+#. odoo-python
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid "Category: %s"
+msgstr "Categoría: %s"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model,name:sale_commission_product_criteria.model_commission
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_account_invoice_line_agent__commission_id
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__commission_id
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_line_mixin__commission_id
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__commission_id
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.commission_item_search
+msgid "Commission"
+msgstr "Comisión"
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.commission_item_form_view
+msgid "Commission Computation"
+msgstr "Cálculo de la comisión"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model,name:sale_commission_product_criteria.model_commission_item
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.commission_item_form_view
+msgid "Commission Item"
+msgstr "Detalle de la comisión"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,help:sale_commission_product_criteria.field_commission_item__applied_on
+msgid "Commission Item applicable on selected option"
+msgstr "Detalle de la comisión aplicable en la opción seleccionada"
+
+#. module: sale_commission_product_criteria
+#: model:ir.actions.act_window,name:sale_commission_product_criteria.commission_item_action
+#: model:ir.actions.act_window,name:sale_commission_product_criteria.commission_item_action_tree
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.commission_item_search
+msgid "Commission Items"
+msgstr "Detalles de la comisión"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__commission_type
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__commission_type
+msgid "Commission Type"
+msgstr "Tipo de comisión"
+
+#. module: sale_commission_product_criteria
+#: model:ir.ui.menu,name:sale_commission_product_criteria.menu_sale_commissions_items
+msgid "Commission Type Items"
+msgstr "Detalles del tipo de comisión"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__company_id
+msgid "Company"
+msgstr "Compañía"
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.commission_item_form_view
+msgid "Compute Price"
+msgstr "Calcular precio"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__create_uid
+msgid "Created by"
+msgstr "Creado por"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__create_date
+msgid "Created on"
+msgstr "Creado el"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__currency_id
+msgid "Currency"
+msgstr "Moneda"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__discount
+msgid "Discount (%)"
+msgstr "Descuento (%)"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__display_name
+msgid "Display Name"
+msgstr "Nombre mostrado"
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_order_agent_form_inherit_sale_commission_product_criteria_mod
+msgid "Edit agents"
+msgstr "Editar agentes"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,help:sale_commission_product_criteria.field_commission_item__name
+#: model:ir.model.fields,help:sale_commission_product_criteria.field_sale_order_line_agent__applied_on_name
+msgid "Explicit rule name for this commission line."
+msgstr "Nombre de regla explícito para esta línea de comisión."
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_sale_order_line_tree_mod
+msgid "Final Amount"
+msgstr "Importe final"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission_item__commission_type__fixed
+msgid "Fixed"
+msgstr "Fijo"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__fixed_amount
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__fixed_amount
+msgid "Fixed Amount"
+msgstr "Importe fijo"
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.commission_item_search
+msgid "Group By"
+msgstr "Agrupar por"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__id
+msgid "ID"
+msgstr "ID"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission__item_ids
+msgid "Item"
+msgstr "Detalle"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item____last_update
+msgid "Last Modified on"
+msgstr "Última modificación el"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__write_uid
+msgid "Last Updated by"
+msgstr "Última actualización por"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__write_date
+msgid "Last Updated on"
+msgstr "Última actualización el"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model,name:sale_commission_product_criteria.model_commission_settlement_line
+msgid "Line of a commission settlement"
+msgstr "Línea de liquidación de comisón"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model,name:sale_commission_product_criteria.model_commission_line_mixin
+msgid ""
+"Mixin model for having commission agent lines in any object inheriting from "
+"this one"
+msgstr ""
+"Modelo Mix para tener líneas de agente de comisión en cualquier objeto "
+"heredado de este"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__name
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__applied_on_name
+msgid "Name"
+msgstr "Nombre"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission_item__commission_type__percentage
+msgid "Percentage"
+msgstr "Porcentaje"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__percent_amount
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__percent_amount
+msgid "Percentage Amount"
+msgstr "Importe porcentual"
+
+#. module: sale_commission_product_criteria
+#. odoo-python
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid "Please specify the category for which this rule should be applied"
+msgstr ""
+"Por favor especifique la categoría para la cual se debe aplicar esta regla"
+
+#. module: sale_commission_product_criteria
+#. odoo-python
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid "Please specify the product for which this rule should be applied"
+msgstr ""
+"Por favor especifique el producto para el cual se debe aplicar esta regla"
+
+#. module: sale_commission_product_criteria
+#. odoo-python
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid ""
+"Please specify the product variant for which this rule should be applied"
+msgstr ""
+"Por favor especifique la variante del producto para la que se debe aplicar "
+"esta regla"
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_sale_order_line_tree_mod
+msgid "Price Type"
+msgstr "Tipo de precio"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__product_tmpl_id
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission_item__applied_on__1_product
+msgid "Product"
+msgstr "Producto"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__categ_id
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission_item__applied_on__2_product_category
+msgid "Product Category"
+msgstr "Categoría de producto"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__product_id
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission_item__applied_on__0_product_variant
+msgid "Product Variant"
+msgstr "Variante de producto"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission__commission_type__product
+msgid "Product criteria"
+msgstr "Criterios de producto"
+
+#. module: sale_commission_product_criteria
+#. odoo-python
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid "Product: %s"
+msgstr "Producto: %s"
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.sale_commission_form_lines_mod
+msgid "Rules"
+msgstr "Reglas"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model,name:sale_commission_product_criteria.model_sale_order_line
+msgid "Sales Order Line"
+msgstr "Línea de orden de venta"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,help:sale_commission_product_criteria.field_commission__commission_type
+msgid ""
+"Select the percentage type of the commission:\n"
+"* 'Fixed percentage': all commissions are computed with a fixed percentage. You can fill the percentage in the field \"Fixed percentage\".\n"
+"* 'By sections': percentage varies depending amount intervals. You can fill intervals and percentages in the section \"Rate definition\"."
+msgstr ""
+"Seleccione el tipo de porcentaje de la comisión:\n"
+"* 'Porcentaje fijo': todas las comisiones se computan con un porcentaje "
+"fijo. Puede completar el porcentaje en el campo \"Porcentaje fijo\".\n"
+"* 'Por tramos': el porcentaje varía según intervalos de importe. Puede "
+"rellenar intervalos y porcentajes en el apartado \"Definición de tarifas\"."
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__sequence
+msgid "Sequence"
+msgstr "Secuencia"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,help:sale_commission_product_criteria.field_commission_item__categ_id
+msgid ""
+"Specify a product category if this rule only applies to products belonging "
+"to this category or its children categories. Keep empty otherwise."
+msgstr ""
+"Especifique una categoría de producto si esta regla solo se aplica a "
+"productos que pertenecen a esta categoría o sus categorías secundarias. De "
+"lo contrario, manténgalo vacío."
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,help:sale_commission_product_criteria.field_commission_item__product_id
+msgid ""
+"Specify a product if this rule only applies to one product. Keep empty "
+"otherwise."
+msgstr ""
+"Especifique un producto si esta regla solo se aplica a un producto. De lo "
+"contrario, manténgalo vacío."
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,help:sale_commission_product_criteria.field_commission_item__product_tmpl_id
+msgid ""
+"Specify a template if this rule only applies to one product template. Keep "
+"empty otherwise."
+msgstr ""
+"Especifique una plantilla si esta regla solo se aplica a una plantilla de "
+"producto. De lo contrario, manténgalo vacío."
+
+#. module: sale_commission_product_criteria
+#. odoo-python
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid ""
+"There is done Sale Orders with this commission. Commission type change is "
+"not allowed."
+msgstr ""
+"Se realizan órdenes de venta con esta comisión. No se permite el cambio de "
+"tipo de comisión."
+
+#. module: sale_commission_product_criteria
+#. odoo-python
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid ""
+"There is posted Account Move Lines with this commission. Commission type "
+"change is not allowed."
+msgstr ""
+"Hay líneas de movimiento de cuenta publicadas con esta comisión. No se "
+"permite el cambio de tipo de comisión."
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission__commission_type
+msgid "Type"
+msgstr "Tipo"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__commission_value
+msgid "Value"
+msgstr "Valor"
+
+#. module: sale_commission_product_criteria
+#. odoo-python
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid "Variant: %s"
+msgstr "Variante: %s"
diff --git a/sale_commission_product_criteria/i18n/it.po b/sale_commission_product_criteria/i18n/it.po
new file mode 100644
index 000000000..4c728064b
--- /dev/null
+++ b/sale_commission_product_criteria/i18n/it.po
@@ -0,0 +1,427 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * sale_commission_product_criteria
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 14.0\n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: 2025-03-05 12:06+0000\n"
+"Last-Translator: mymage \n"
+"Language-Team: none\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 5.10.2\n"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__active
+msgid "Active"
+msgstr "Attivo"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model,name:sale_commission_product_criteria.model_account_invoice_line_agent
+msgid "Agent detail of commission line in invoice lines"
+msgstr "Dettaglio riga provvigione agente nelle righe fattura"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model,name:sale_commission_product_criteria.model_sale_order_line_agent
+msgid "Agent detail of commission line in order lines"
+msgstr "Dettaglio riga provvigione agente nelle righe ordine"
+
+#. module: sale_commission_product_criteria
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission_item__applied_on__3_global
+#, python-format
+msgid "All Products"
+msgstr "Tutti i prodotti"
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_sale_order_line_tree_mod
+msgid "Amount (%)"
+msgstr "Importo (%)"
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_sale_order_line_tree_mod
+msgid "Amount (fixed)"
+msgstr "Importo (fisso)"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission_item__based_on__sol
+msgid "Any Sale Order Line"
+msgstr "Qualsiasi riga ordine di vendita"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_account_invoice_line_agent__applied_commission_id
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_commission_line_mixin__applied_commission_id
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__applied_commission_id
+msgid "Applied Commission"
+msgstr "Provvigione applicata"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_account_invoice_line_agent__applied_commission_item_id
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__applied_commission_item_id
+msgid "Applied Commission Item"
+msgstr "Riga provvigione applicata"
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_sale_order_line_tree_mod
+msgid "Applied Disc. (%)"
+msgstr "Sc. applicato (%)"
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.sale_commission_form_lines_mod
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_sale_order_line_tree_mod
+msgid "Applied On"
+msgstr "Applicato a"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__applied_on
+msgid "Apply On"
+msgstr "Applica a"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__based_on
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__based_on
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_sale_order_line_tree_mod
+msgid "Based On"
+msgstr "Basato su"
+
+#. module: sale_commission_product_criteria
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid "Category: %s"
+msgstr "Categoria: %s"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_account_invoice_line_agent__commission_id
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_commission_line_mixin__commission_id
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__commission_id
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.commission_item_search
+msgid "Commission"
+msgstr "Provvigione"
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.commission_item_form_view
+msgid "Commission Computation"
+msgstr "Calcolo provvigione"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model,name:sale_commission_product_criteria.model_commission_item
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.commission_item_form_view
+msgid "Commission Item"
+msgstr "Riga provvigione"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,help:sale_commission_product_criteria.field_commission_item__applied_on
+msgid "Commission Item applicable on selected option"
+msgstr "Riga provvigione applicabile all'opzione selezionata"
+
+#. module: sale_commission_product_criteria
+#: model:ir.actions.act_window,name:sale_commission_product_criteria.commission_item_action
+#: model:ir.actions.act_window,name:sale_commission_product_criteria.commission_item_action_tree
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.commission_item_search
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.commission_item_tree_view
+msgid "Commission Items"
+msgstr "Righe provvigione"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__commission_id
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__commission_type
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__commission_type
+msgid "Commission Type"
+msgstr "Tipo di provvigione"
+
+#. module: sale_commission_product_criteria
+#: model:ir.ui.menu,name:sale_commission_product_criteria.menu_sale_commissions_items
+msgid "Commission Type Items"
+msgstr "Righe tipi di provvigione"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model,name:sale_commission_product_criteria.model_sale_commission
+msgid "Commission in sales"
+msgstr "Provvigione nelle vendite"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__company_id
+msgid "Company"
+msgstr "Azienda"
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.commission_item_form_view
+msgid "Compute Price"
+msgstr "Calcola prezzo"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__create_uid
+msgid "Created by"
+msgstr "Creato da"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__create_date
+msgid "Created on"
+msgstr "Creato il"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__currency_id
+msgid "Currency"
+msgstr "Valuta"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__discount
+msgid "Discount (%)"
+msgstr "Sconto (%)"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_account_invoice_line_agent__display_name
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__display_name
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_commission__display_name
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_commission_line_mixin__display_name
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_commission_settlement_line__display_name
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line__display_name
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__display_name
+msgid "Display Name"
+msgstr "Nome visualizzato"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,help:sale_commission_product_criteria.field_commission_item__name
+#: model:ir.model.fields,help:sale_commission_product_criteria.field_sale_order_line_agent__applied_on_name
+msgid "Explicit rule name for this commission line."
+msgstr "Nome esplicito regola per questa riga provvigione."
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_sale_order_line_tree_mod
+msgid "Final Amount"
+msgstr "Importo finale"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission_item__commission_type__fixed
+msgid "Fixed"
+msgstr "Fisso"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__fixed_amount
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__fixed_amount
+msgid "Fixed Amount"
+msgstr "Importo fisso"
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.commission_item_search
+msgid "Group By"
+msgstr "Raggruppa per"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_account_invoice_line_agent__id
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__id
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_commission__id
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_commission_line_mixin__id
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_commission_settlement_line__id
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line__id
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__id
+msgid "ID"
+msgstr "ID"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_commission__item_ids
+msgid "Item"
+msgstr "Riga"
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.sale_commission_form_lines_mod
+msgid "Items"
+msgstr "Righe"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_account_invoice_line_agent____last_update
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item____last_update
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_commission____last_update
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_commission_line_mixin____last_update
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_commission_settlement_line____last_update
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line____last_update
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent____last_update
+msgid "Last Modified on"
+msgstr "Ultima modifica il"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__write_uid
+msgid "Last Updated by"
+msgstr "Ultimo aggiornamento di"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__write_date
+msgid "Last Updated on"
+msgstr "Ultimo aggiornamento il"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model,name:sale_commission_product_criteria.model_sale_commission_settlement_line
+msgid "Line of a commission settlement"
+msgstr "Riga di regolazione provvigione"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model,name:sale_commission_product_criteria.model_sale_commission_line_mixin
+msgid ""
+"Mixin model for having commission agent lines in any object inheriting from "
+"this one"
+msgstr ""
+"Modello mixin per avere righe di provvigione agente in qualsiasi oggetto che "
+"erediti dall'attuale"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__name
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__applied_on_name
+msgid "Name"
+msgstr "Nome"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission_item__commission_type__percentage
+msgid "Percentage"
+msgstr "Percentuale"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__percent_amount
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__percent_amount
+msgid "Percentage Amount"
+msgstr "Importo percentuale"
+
+#. module: sale_commission_product_criteria
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid "Please specify the category for which this rule should be applied"
+msgstr ""
+"Specifica la categoria per la quale questa regola deve essere applicata"
+
+#. module: sale_commission_product_criteria
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid "Please specify the product for which this rule should be applied"
+msgstr "Specifica il prodotto per la quale questa regola deve essere applicata"
+
+#. module: sale_commission_product_criteria
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid ""
+"Please specify the product variant for which this rule should be applied"
+msgstr ""
+"Specifica la variante prodotto per la quale questa regola deve essere "
+"applicata"
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_sale_order_line_tree_mod
+msgid "Price Type"
+msgstr "Tipo prezzo"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__product_tmpl_id
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission_item__applied_on__1_product
+msgid "Product"
+msgstr "Prodotto"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__categ_id
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission_item__applied_on__2_product_category
+msgid "Product Category"
+msgstr "Categoria prodotto"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__product_id
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission_item__applied_on__0_product_variant
+msgid "Product Variant"
+msgstr "Variante prodotto"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__sale_commission__commission_type__product
+msgid "Product criteria"
+msgstr "Criteri prodotto"
+
+#. module: sale_commission_product_criteria
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid "Product: %s"
+msgstr "Prodotto: %s"
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.sale_commission_form_lines_mod
+msgid "Rules"
+msgstr "Regole"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model,name:sale_commission_product_criteria.model_sale_order_line
+msgid "Sales Order Line"
+msgstr "Riga ordine di vendita"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__sequence
+msgid "Sequence"
+msgstr "Sequenza"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,help:sale_commission_product_criteria.field_commission_item__categ_id
+msgid ""
+"Specify a product category if this rule only applies to products belonging "
+"to this category or its children categories. Keep empty otherwise."
+msgstr ""
+"Specificare una categoria prodotto se questa regola si applica solo ai "
+"prodotti appartenenti a questa categoria o alle sue categorie figlie, "
+"altrimenti lasciare vuoto."
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,help:sale_commission_product_criteria.field_commission_item__product_id
+msgid ""
+"Specify a product if this rule only applies to one product. Keep empty "
+"otherwise."
+msgstr ""
+"Specificare un prodotto se questa regola si applica solo ad un prodotto, "
+"altrimenti lasciare vuoto."
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,help:sale_commission_product_criteria.field_commission_item__product_tmpl_id
+msgid ""
+"Specify a template if this rule only applies to one product template. Keep "
+"empty otherwise."
+msgstr ""
+"Specificare un modello prodotto se questa regola si applica solo ad un "
+"modello prodotto, altrimenti lasciare vuoto."
+
+#. module: sale_commission_product_criteria
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid ""
+"There is done Sale Orders with this commission. Commission type change is "
+"not allowed."
+msgstr ""
+"Esistono ordini di vendita che usano questo tipo di provvigione. Non è "
+"possibile modificare il tipo."
+
+#. module: sale_commission_product_criteria
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid ""
+"There is posted Account Move Lines with this commission. Commission type "
+"change is not allowed."
+msgstr ""
+"Esistono righe fattura che usano questo tipo di provvigione. Non è possibile "
+"modificare il tipo."
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_commission__commission_type
+msgid "Type"
+msgstr "Tipo"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__commission_value
+msgid "Value"
+msgstr "Valore"
+
+#. module: sale_commission_product_criteria
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid "Variant: %s"
+msgstr "Variante: %s"
+
+#~ msgid "Pricelist"
+#~ msgstr "Listino prezzi"
+
+#~ msgid "Use Pricelist"
+#~ msgstr "Usa listino prezzi"
diff --git a/sale_commission_product_criteria/i18n/pt_BR.po b/sale_commission_product_criteria/i18n/pt_BR.po
new file mode 100644
index 000000000..edaeb6c1a
--- /dev/null
+++ b/sale_commission_product_criteria/i18n/pt_BR.po
@@ -0,0 +1,397 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * sale_commission_product_criteria
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 16.0\n"
+"Report-Msgid-Bugs-To: \n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__active
+msgid "Active"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model,name:sale_commission_product_criteria.model_account_invoice_line_agent
+msgid "Agent detail of commission line in invoice lines"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model,name:sale_commission_product_criteria.model_sale_order_line_agent
+msgid "Agent detail of commission line in order lines"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#. odoo-python
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission_item__applied_on__3_global
+#, python-format
+msgid "All Products"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_sale_order_line_tree_mod
+msgid "Amount (%)"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_sale_order_line_tree_mod
+msgid "Amount (fixed)"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission_item__based_on__sol
+msgid "Any Sale Order Line"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_account_invoice_line_agent__applied_commission_id
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_line_mixin__applied_commission_id
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__applied_commission_id
+msgid "Applied Commission"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_account_invoice_line_agent__applied_commission_item_id
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__applied_commission_item_id
+msgid "Applied Commission Item"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_sale_order_line_tree_mod
+msgid "Applied Disc. (%)"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.sale_commission_form_lines_mod
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_sale_order_line_tree_mod
+msgid "Applied On"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__applied_on
+msgid "Apply On"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__based_on
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__based_on
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_sale_order_line_tree_mod
+msgid "Based On"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#. odoo-python
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid "Category: %s"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model,name:sale_commission_product_criteria.model_commission
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_account_invoice_line_agent__commission_id
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__commission_id
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_line_mixin__commission_id
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__commission_id
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.commission_item_search
+msgid "Commission"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.commission_item_form_view
+msgid "Commission Computation"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model,name:sale_commission_product_criteria.model_commission_item
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.commission_item_form_view
+msgid "Commission Item"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,help:sale_commission_product_criteria.field_commission_item__applied_on
+msgid "Commission Item applicable on selected option"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.actions.act_window,name:sale_commission_product_criteria.commission_item_action
+#: model:ir.actions.act_window,name:sale_commission_product_criteria.commission_item_action_tree
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.commission_item_search
+msgid "Commission Items"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__commission_type
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__commission_type
+msgid "Commission Type"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.ui.menu,name:sale_commission_product_criteria.menu_sale_commissions_items
+msgid "Commission Type Items"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__company_id
+msgid "Company"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.commission_item_form_view
+msgid "Compute Price"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__create_uid
+msgid "Created by"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__create_date
+msgid "Created on"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__currency_id
+msgid "Currency"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__discount
+msgid "Discount (%)"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_order_agent_form_inherit_sale_commission_product_criteria_mod
+msgid "Edit agents"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,help:sale_commission_product_criteria.field_commission_item__name
+#: model:ir.model.fields,help:sale_commission_product_criteria.field_sale_order_line_agent__applied_on_name
+msgid "Explicit rule name for this commission line."
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_sale_order_line_tree_mod
+msgid "Final Amount"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission_item__commission_type__fixed
+msgid "Fixed"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__fixed_amount
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__fixed_amount
+msgid "Fixed Amount"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.commission_item_search
+msgid "Group By"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__id
+msgid "ID"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission__item_ids
+msgid "Item"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item____last_update
+msgid "Last Modified on"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__write_uid
+msgid "Last Updated by"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__write_date
+msgid "Last Updated on"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model,name:sale_commission_product_criteria.model_commission_settlement_line
+msgid "Line of a commission settlement"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model,name:sale_commission_product_criteria.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
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__name
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__applied_on_name
+msgid "Name"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission_item__commission_type__percentage
+msgid "Percentage"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__percent_amount
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__percent_amount
+msgid "Percentage Amount"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#. odoo-python
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid "Please specify the category for which this rule should be applied"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#. odoo-python
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid "Please specify the product for which this rule should be applied"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#. odoo-python
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid ""
+"Please specify the product variant for which this rule should be applied"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_sale_order_line_tree_mod
+msgid "Price Type"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__product_tmpl_id
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission_item__applied_on__1_product
+msgid "Product"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__categ_id
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission_item__applied_on__2_product_category
+msgid "Product Category"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__product_id
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission_item__applied_on__0_product_variant
+msgid "Product Variant"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission__commission_type__product
+msgid "Product criteria"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#. odoo-python
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid "Product: %s"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.sale_commission_form_lines_mod
+msgid "Rules"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model,name:sale_commission_product_criteria.model_sale_order_line
+msgid "Sales Order Line"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,help:sale_commission_product_criteria.field_commission__commission_type
+msgid ""
+"Select the percentage type of the commission:\n"
+"* 'Fixed percentage': all commissions are computed with a fixed percentage. You can fill the percentage in the field \"Fixed percentage\".\n"
+"* 'By sections': percentage varies depending amount intervals. You can fill intervals and percentages in the section \"Rate definition\"."
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__sequence
+msgid "Sequence"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,help:sale_commission_product_criteria.field_commission_item__categ_id
+msgid ""
+"Specify a product category if this rule only applies to products belonging "
+"to this category or its children categories. Keep empty otherwise."
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,help:sale_commission_product_criteria.field_commission_item__product_id
+msgid ""
+"Specify a product if this rule only applies to one product. Keep empty "
+"otherwise."
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,help:sale_commission_product_criteria.field_commission_item__product_tmpl_id
+msgid ""
+"Specify a template if this rule only applies to one product template. Keep "
+"empty otherwise."
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#. odoo-python
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid ""
+"There is done Sale Orders with this commission. Commission type change is "
+"not allowed."
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#. odoo-python
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid ""
+"There is posted Account Move Lines with this commission. Commission type "
+"change is not allowed."
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission__commission_type
+msgid "Type"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__commission_value
+msgid "Value"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#. odoo-python
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid "Variant: %s"
+msgstr ""
diff --git a/sale_commission_product_criteria/i18n/sale_commission_product_criteria.pot b/sale_commission_product_criteria/i18n/sale_commission_product_criteria.pot
new file mode 100644
index 000000000..b636d0ac7
--- /dev/null
+++ b/sale_commission_product_criteria/i18n/sale_commission_product_criteria.pot
@@ -0,0 +1,396 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * sale_commission_product_criteria
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 16.0\n"
+"Report-Msgid-Bugs-To: \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
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__active
+msgid "Active"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model,name:sale_commission_product_criteria.model_account_invoice_line_agent
+msgid "Agent detail of commission line in invoice lines"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model,name:sale_commission_product_criteria.model_sale_order_line_agent
+msgid "Agent detail of commission line in order lines"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#. odoo-python
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission_item__applied_on__3_global
+#, python-format
+msgid "All Products"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_sale_order_line_tree_mod
+msgid "Amount (%)"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_sale_order_line_tree_mod
+msgid "Amount (fixed)"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission_item__based_on__sol
+msgid "Any Sale Order Line"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_account_invoice_line_agent__applied_commission_id
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_line_mixin__applied_commission_id
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__applied_commission_id
+msgid "Applied Commission"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_account_invoice_line_agent__applied_commission_item_id
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__applied_commission_item_id
+msgid "Applied Commission Item"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_sale_order_line_tree_mod
+msgid "Applied Disc. (%)"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.sale_commission_form_lines_mod
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_sale_order_line_tree_mod
+msgid "Applied On"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__applied_on
+msgid "Apply On"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__based_on
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__based_on
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_sale_order_line_tree_mod
+msgid "Based On"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#. odoo-python
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid "Category: %s"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model,name:sale_commission_product_criteria.model_commission
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_account_invoice_line_agent__commission_id
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__commission_id
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_line_mixin__commission_id
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__commission_id
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.commission_item_search
+msgid "Commission"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.commission_item_form_view
+msgid "Commission Computation"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model,name:sale_commission_product_criteria.model_commission_item
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.commission_item_form_view
+msgid "Commission Item"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,help:sale_commission_product_criteria.field_commission_item__applied_on
+msgid "Commission Item applicable on selected option"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.actions.act_window,name:sale_commission_product_criteria.commission_item_action
+#: model:ir.actions.act_window,name:sale_commission_product_criteria.commission_item_action_tree
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.commission_item_search
+msgid "Commission Items"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__commission_type
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__commission_type
+msgid "Commission Type"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.ui.menu,name:sale_commission_product_criteria.menu_sale_commissions_items
+msgid "Commission Type Items"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__company_id
+msgid "Company"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.commission_item_form_view
+msgid "Compute Price"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__create_uid
+msgid "Created by"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__create_date
+msgid "Created on"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__currency_id
+msgid "Currency"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__discount
+msgid "Discount (%)"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_order_agent_form_inherit_sale_commission_product_criteria_mod
+msgid "Edit agents"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,help:sale_commission_product_criteria.field_commission_item__name
+#: model:ir.model.fields,help:sale_commission_product_criteria.field_sale_order_line_agent__applied_on_name
+msgid "Explicit rule name for this commission line."
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_sale_order_line_tree_mod
+msgid "Final Amount"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission_item__commission_type__fixed
+msgid "Fixed"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__fixed_amount
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__fixed_amount
+msgid "Fixed Amount"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.commission_item_search
+msgid "Group By"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__id
+msgid "ID"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission__item_ids
+msgid "Item"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item____last_update
+msgid "Last Modified on"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__write_uid
+msgid "Last Updated by"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__write_date
+msgid "Last Updated on"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model,name:sale_commission_product_criteria.model_commission_settlement_line
+msgid "Line of a commission settlement"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model,name:sale_commission_product_criteria.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
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__name
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__applied_on_name
+msgid "Name"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission_item__commission_type__percentage
+msgid "Percentage"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__percent_amount
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_order_line_agent__percent_amount
+msgid "Percentage Amount"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#. odoo-python
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid "Please specify the category for which this rule should be applied"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#. odoo-python
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid "Please specify the product for which this rule should be applied"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#. odoo-python
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid ""
+"Please specify the product variant for which this rule should be applied"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.view_sale_order_line_tree_mod
+msgid "Price Type"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__product_tmpl_id
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission_item__applied_on__1_product
+msgid "Product"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__categ_id
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission_item__applied_on__2_product_category
+msgid "Product Category"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__product_id
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission_item__applied_on__0_product_variant
+msgid "Product Variant"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields.selection,name:sale_commission_product_criteria.selection__commission__commission_type__product
+msgid "Product criteria"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#. odoo-python
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid "Product: %s"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.sale_commission_form_lines_mod
+msgid "Rules"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model,name:sale_commission_product_criteria.model_sale_order_line
+msgid "Sales Order Line"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,help:sale_commission_product_criteria.field_commission__commission_type
+msgid ""
+"Select the percentage type of the commission:\n"
+"* 'Fixed percentage': all commissions are computed with a fixed percentage. You can fill the percentage in the field \"Fixed percentage\".\n"
+"* 'By sections': percentage varies depending amount intervals. You can fill intervals and percentages in the section \"Rate definition\"."
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__sequence
+msgid "Sequence"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,help:sale_commission_product_criteria.field_commission_item__categ_id
+msgid ""
+"Specify a product category if this rule only applies to products belonging "
+"to this category or its children categories. Keep empty otherwise."
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,help:sale_commission_product_criteria.field_commission_item__product_id
+msgid ""
+"Specify a product if this rule only applies to one product. Keep empty "
+"otherwise."
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,help:sale_commission_product_criteria.field_commission_item__product_tmpl_id
+msgid ""
+"Specify a template if this rule only applies to one product template. Keep "
+"empty otherwise."
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#. odoo-python
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid ""
+"There is done Sale Orders with this commission. Commission type change is "
+"not allowed."
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#. odoo-python
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid ""
+"There is posted Account Move Lines with this commission. Commission type "
+"change is not allowed."
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission__commission_type
+msgid "Type"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__commission_value
+msgid "Value"
+msgstr ""
+
+#. module: sale_commission_product_criteria
+#. odoo-python
+#: code:addons/sale_commission_product_criteria/models/commission.py:0
+#, python-format
+msgid "Variant: %s"
+msgstr ""
diff --git a/sale_commission_product_criteria/models/__init__.py b/sale_commission_product_criteria/models/__init__.py
new file mode 100644
index 000000000..b14568ddb
--- /dev/null
+++ b/sale_commission_product_criteria/models/__init__.py
@@ -0,0 +1,5 @@
+from . import sale_commission_line_mixin
+from . import commission
+from . import sale
+from . import account_move
+from . import settlement
diff --git a/sale_commission_product_criteria/models/account_move.py b/sale_commission_product_criteria/models/account_move.py
new file mode 100644
index 000000000..2b8cda490
--- /dev/null
+++ b/sale_commission_product_criteria/models/account_move.py
@@ -0,0 +1,30 @@
+# © 2023 ooops404
+# Copyright 2023 Simone Rubino - Aion Tech
+# License AGPL-3 - See https://www.gnu.org/licenses/agpl-3.0.html
+from odoo import api, fields, models
+
+
+class AccountInvoiceLineAgent(models.Model):
+ _inherit = "account.invoice.line.agent"
+
+ applied_commission_item_id = fields.Many2one("commission.item")
+
+ @api.depends(
+ "object_id.price_subtotal",
+ "object_id.product_id.commission_free",
+ "commission_id",
+ )
+ def _compute_amount(self):
+ res = None
+ for line in self:
+ if line.commission_id and line.commission_id.commission_type == "product":
+ inv_line = line.object_id
+ line.amount = line._get_single_commission_amount(
+ line.commission_id,
+ inv_line.price_subtotal,
+ inv_line.product_id,
+ inv_line.quantity,
+ )
+ else:
+ res = super(AccountInvoiceLineAgent, line)._compute_amount()
+ return res
diff --git a/sale_commission_product_criteria/models/commission.py b/sale_commission_product_criteria/models/commission.py
new file mode 100644
index 000000000..cb46a41c7
--- /dev/null
+++ b/sale_commission_product_criteria/models/commission.py
@@ -0,0 +1,268 @@
+# © 2023 ooops404
+# Copyright 2023 Simone Rubino - Aion Tech
+# License AGPL-3 - See https://www.gnu.org/licenses/agpl-3.0.html
+from odoo import _, api, fields, models
+from odoo.exceptions import ValidationError
+from odoo.tools import float_repr
+
+
+class SaleCommission(models.Model):
+ _inherit = "commission"
+
+ commission_type = fields.Selection(
+ selection_add=[("product", "Product criteria")],
+ ondelete={"product": "set default"},
+ )
+ item_ids = fields.One2many("commission.item", "commission_id", copy=True)
+
+ def action_unarchive(self):
+ res = super().action_unarchive()
+ items = (
+ self.env["commission.item"]
+ .with_context(active_test=False)
+ .search([("commission_id", "=", self.id)])
+ )
+ if items:
+ items.write({"active": True})
+ return res
+
+ @api.onchange("commission_type")
+ def onchange_commission_type(self):
+ # Prevent commission_type change in certain cases
+ self.check_type_change_allowed_sale()
+ self.check_type_change_allowed_moves()
+
+ def check_type_change_allowed_sale(self):
+ sola_ids = self.env["sale.order.line.agent"].search(
+ [("commission_id", "=", self._origin.id)]
+ )
+ done_so_ids = sola_ids.filtered(lambda x: x.object_id.state in ["done", "sale"])
+ if done_so_ids:
+ raise ValidationError(
+ _(
+ "There is done Sale Orders with this commission. "
+ "Commission type change is not allowed."
+ )
+ )
+
+ def check_type_change_allowed_moves(self):
+ if not self._origin:
+ return
+ aila_ids = self.env["account.invoice.line.agent"].search(
+ [("commission_id", "=", self._origin.id)]
+ )
+ done_move_ids = aila_ids.filtered(
+ lambda x: x.object_id.parent_state == "posted"
+ )
+ if done_move_ids:
+ raise ValidationError(
+ _(
+ "There is posted Account Move Lines with this commission. "
+ "Commission type change is not allowed."
+ )
+ )
+
+
+class CommissionItem(models.Model):
+ _name = "commission.item"
+ _description = "Commission Item"
+ _order = "applied_on, based_on, categ_id desc, id desc"
+
+ sequence = fields.Integer(default=10)
+ active = fields.Boolean(default=True)
+ commission_id = fields.Many2one(
+ "commission",
+ string="Commission",
+ domain=[("commission_type", "=", "product")],
+ required=True,
+ )
+ product_tmpl_id = fields.Many2one(
+ "product.template",
+ "Product",
+ ondelete="cascade",
+ check_company=True,
+ help="Specify a template if this rule only applies to one "
+ "product template. Keep empty otherwise.",
+ )
+ product_id = fields.Many2one(
+ "product.product",
+ "Product Variant",
+ ondelete="cascade",
+ check_company=True,
+ help="Specify a product if this rule only applies "
+ "to one product. Keep empty otherwise.",
+ )
+ categ_id = fields.Many2one(
+ "product.category",
+ "Product Category",
+ ondelete="cascade",
+ help="Specify a product category if this rule only applies to "
+ "products belonging to this category or its children categories. "
+ "Keep empty otherwise.",
+ )
+ based_on = fields.Selection(
+ [("sol", "Any Sale Order Line")],
+ required=True,
+ default="sol",
+ )
+ applied_on = fields.Selection(
+ [
+ ("3_global", "All Products"),
+ ("2_product_category", "Product Category"),
+ ("1_product", "Product"),
+ ("0_product_variant", "Product Variant"),
+ ],
+ "Apply On",
+ default="3_global",
+ required=True,
+ help="Commission Item applicable on selected option",
+ )
+ commission_type = fields.Selection(
+ [("fixed", "Fixed"), ("percentage", "Percentage")],
+ index=True,
+ default="fixed",
+ required=True,
+ )
+ fixed_amount = fields.Float(digits="Product Price")
+ percent_amount = fields.Float("Percentage Amount")
+ company_id = fields.Many2one(
+ "res.company",
+ "Company",
+ default=lambda self: self.env.company,
+ readonly=True,
+ )
+ currency_id = fields.Many2one(
+ "res.currency",
+ related="company_id.currency_id",
+ readonly=True,
+ )
+ name = fields.Char(
+ compute="_compute_commission_item_name_value",
+ help="Explicit rule name for this commission line.",
+ )
+ commission_value = fields.Char(
+ "Value",
+ compute="_compute_commission_item_name_value",
+ )
+
+ @api.depends(
+ "applied_on",
+ "categ_id",
+ "product_tmpl_id",
+ "product_id",
+ "commission_type",
+ "fixed_amount",
+ "percent_amount",
+ )
+ def _compute_commission_item_name_value(self):
+ for item in self:
+ if item.categ_id and item.applied_on == "2_product_category":
+ item.name = _("Category: %s") % (item.categ_id.display_name)
+ elif item.product_tmpl_id and item.applied_on == "1_product":
+ item.name = _("Product: %s") % (item.product_tmpl_id.display_name)
+ elif item.product_id and item.applied_on == "0_product_variant":
+ item.name = _("Variant: %s") % (
+ item.product_id.with_context(
+ display_default_code=False
+ ).display_name
+ )
+ else:
+ item.name = _("All Products")
+
+ if item.commission_type == "fixed":
+ decimal_places = self.env["decimal.precision"].precision_get(
+ "Product Price"
+ )
+ if item.currency_id.position == "after":
+ item.commission_value = "%s %s" % (
+ float_repr(
+ item.fixed_amount,
+ decimal_places,
+ ),
+ item.currency_id.symbol or "",
+ )
+ else:
+ item.commission_value = "%s %s" % (
+ item.currency_id.symbol or "",
+ float_repr(
+ item.fixed_amount,
+ decimal_places,
+ ),
+ )
+ elif item.commission_type == "percentage":
+ item.commission_value = str(item.percent_amount) + " %"
+
+ @api.constrains("product_id", "product_tmpl_id", "categ_id")
+ def _check_product_consistency(self):
+ for item in self:
+ if item.applied_on == "2_product_category" and not item.categ_id:
+ raise ValidationError(
+ _(
+ "Please specify the category for which this rule should "
+ "be applied"
+ )
+ )
+ elif item.applied_on == "1_product" and not item.product_tmpl_id:
+ raise ValidationError(
+ _(
+ "Please specify the product for which this rule should "
+ "be applied"
+ )
+ )
+ elif item.applied_on == "0_product_variant" and not item.product_id:
+ raise ValidationError(
+ _(
+ "Please specify the product variant for "
+ "which this rule should be applied"
+ )
+ )
+
+ @api.onchange("product_id")
+ def _onchange_product_id(self):
+ has_product_id = self.filtered("product_id")
+ for item in has_product_id:
+ item.product_tmpl_id = item.product_id.product_tmpl_id
+ if self.env.context.get("default_applied_on", False) == "1_product":
+ # If a product variant is specified, apply on variants instead
+ # Reset if product variant is removed
+ has_product_id.update({"applied_on": "0_product_variant"})
+ (self - has_product_id).update({"applied_on": "1_product"})
+
+ @api.onchange("product_tmpl_id")
+ def _onchange_product_tmpl_id(self):
+ has_tmpl_id = self.filtered("product_tmpl_id")
+ for item in has_tmpl_id:
+ if (
+ item.product_id
+ and item.product_id.product_tmpl_id != item.product_tmpl_id
+ ):
+ item.product_id = None
+
+ @api.model_create_multi
+ def create(self, values_list):
+ new_values_list = []
+ for values in values_list:
+ values = self.validate_values(values)
+ new_values_list.append(values)
+ return super(CommissionItem, self).create(new_values_list)
+
+ def write(self, values):
+ values = self.validate_values(values)
+ res = super(CommissionItem, self).write(values)
+ return res
+
+ def validate_values(self, values):
+ if values.get("applied_on", False):
+ # Ensure item consistency for later searches.
+ applied_on = values["applied_on"]
+ if applied_on == "3_global":
+ values.update(
+ dict(product_id=None, product_tmpl_id=None, categ_id=None)
+ )
+ elif applied_on == "2_product_category":
+ values.update(dict(product_id=None, product_tmpl_id=None))
+ elif applied_on == "1_product":
+ values.update(dict(product_id=None, categ_id=None))
+ elif applied_on == "0_product_variant":
+ values.update(dict(categ_id=None))
+ return values
diff --git a/sale_commission_product_criteria/models/sale.py b/sale_commission_product_criteria/models/sale.py
new file mode 100644
index 000000000..b7018e573
--- /dev/null
+++ b/sale_commission_product_criteria/models/sale.py
@@ -0,0 +1,55 @@
+# © 2023 ooops404
+# Copyright 2023 Simone Rubino - Aion Tech
+# License AGPL-3 - See https://www.gnu.org/licenses/agpl-3.0.html
+from odoo import api, fields, models
+
+
+class SaleOrderLineAgent(models.Model):
+ _inherit = "sale.order.line.agent"
+
+ discount = fields.Float(related="object_id.discount")
+ applied_commission_item_id = fields.Many2one("commission.item")
+ based_on = fields.Selection(related="applied_commission_item_id.based_on")
+ applied_on_name = fields.Char(related="applied_commission_item_id.name")
+ commission_type = fields.Selection(
+ related="applied_commission_item_id.commission_type"
+ )
+ fixed_amount = fields.Float(related="applied_commission_item_id.fixed_amount")
+ percent_amount = fields.Float(related="applied_commission_item_id.percent_amount")
+
+ @api.depends(
+ "object_id.price_subtotal", "object_id.product_id", "object_id.product_uom_qty"
+ )
+ def _compute_amount(self):
+ res = None
+ for line in self:
+ if line.commission_id and line.commission_id.commission_type == "product":
+ order_line = line.object_id
+ line.amount = line._get_single_commission_amount(
+ line.commission_id,
+ order_line.price_subtotal,
+ order_line.product_id,
+ order_line.product_uom_qty,
+ )
+ else:
+ res = super(SaleOrderLineAgent, line)._compute_amount()
+ return res
+
+
+class SaleOrderLine(models.Model):
+ _inherit = "sale.order.line"
+
+ def _prepare_invoice_line(self, **optional_values):
+ vals = super()._prepare_invoice_line(**optional_values)
+ vals["agent_ids"] = [
+ (
+ 0,
+ 0,
+ {
+ "agent_id": x.agent_id.id,
+ "commission_id": x.commission_id.id,
+ },
+ )
+ for x in self.agent_ids
+ ]
+ return vals
diff --git a/sale_commission_product_criteria/models/sale_commission_line_mixin.py b/sale_commission_product_criteria/models/sale_commission_line_mixin.py
new file mode 100644
index 000000000..dd88d9a06
--- /dev/null
+++ b/sale_commission_product_criteria/models/sale_commission_line_mixin.py
@@ -0,0 +1,91 @@
+# © 2023 ooops404
+# Copyright 2023 Simone Rubino - Aion Tech
+# License AGPL-3 - See https://www.gnu.org/licenses/agpl-3.0.html
+from odoo import fields, models
+
+
+class SaleCommissionLineMixin(models.AbstractModel):
+ _inherit = "commission.line.mixin"
+
+ applied_commission_id = fields.Many2one("commission", readonly=True)
+ commission_id = fields.Many2one(
+ comodel_name="commission",
+ ondelete="restrict",
+ required=False,
+ compute="_compute_commission_id",
+ store=True,
+ readonly=False,
+ copy=True,
+ )
+
+ def _commission_items_from(self):
+ return """ commission_item AS item
+ LEFT JOIN product_category AS categ ON item.categ_id = categ.id
+ """
+
+ def _commission_items_where(self):
+ return """ (item.product_tmpl_id IS NULL OR item.product_tmpl_id = any(%(prod_tmpls)s))
+ AND (item.product_id IS NULL OR item.product_id = any(%(prod_prods)s))
+ AND (item.categ_id IS NULL OR item.categ_id = any(%(categs)s))
+ AND (item.commission_id = %(commission)s)
+ AND (item.active = TRUE)
+ """
+
+ def _commission_items_order(self):
+ return """item.applied_on,
+ item.based_on,
+ categ.complete_name desc
+ """
+
+ def _commission_items_query(self):
+ return f"""
+ SELECT item.id
+ FROM {self._commission_items_from()}
+ WHERE {self._commission_items_where()}
+ ORDER BY {self._commission_items_order()}
+ """
+
+ def _commission_items_query_params(self, commission, product):
+ categ_ids = {}
+ categ = product.categ_id
+ while categ:
+ categ_ids[categ.id] = True
+ categ = categ.parent_id
+ categ_ids = list(categ_ids)
+ return {
+ "prod_tmpls": product.product_tmpl_id.ids,
+ "prod_prods": product.ids,
+ "categs": categ_ids,
+ "commission": commission._origin.id,
+ }
+
+ def _get_commission_items(self, commission, product):
+ self.env.cr.execute(
+ self._commission_items_query(),
+ self._commission_items_query_params(commission, product),
+ )
+ item_ids = [x[0] for x in self.env.cr.fetchall()]
+ return item_ids
+
+ def _get_single_commission_amount(self, commission, subtotal, product, quantity):
+ self.ensure_one()
+ item_ids = self._get_commission_items(commission, product)
+ if not item_ids:
+ return 0.0
+ commission_item = self.env["commission.item"].browse(item_ids[0])
+ if commission.amount_base_type == "net_amount":
+ # If subtotal (sale_price * quantity) is less than
+ # standard_price * quantity, it means that we are selling at
+ # lower price than we bought, so set amount_base to 0
+ subtotal = max([0, subtotal - product.standard_price * quantity])
+ self.applied_commission_item_id = commission_item
+ # if self.agent_id.use_multi_type_commissions:
+ self.applied_commission_id = commission_item.commission_id
+ if commission_item.commission_type == "fixed":
+ return commission_item.fixed_amount
+ elif commission_item.commission_type == "percentage":
+ return subtotal * (commission_item.percent_amount / 100.0)
+
+ def _get_discount_value(self, commission_item):
+ # Will be overridden
+ return self.object_id.discount
diff --git a/sale_commission_product_criteria/models/settlement.py b/sale_commission_product_criteria/models/settlement.py
new file mode 100644
index 000000000..a7a9f032f
--- /dev/null
+++ b/sale_commission_product_criteria/models/settlement.py
@@ -0,0 +1,7 @@
+# © 2023 ooops404
+# License AGPL-3 - See https://www.gnu.org/licenses/agpl-3.0.html
+from odoo import models
+
+
+class SettlementLine(models.Model):
+ _inherit = "commission.settlement.line"
diff --git a/sale_commission_product_criteria/readme/CONTRIBUTORS.rst b/sale_commission_product_criteria/readme/CONTRIBUTORS.rst
new file mode 100644
index 000000000..898ef9dd2
--- /dev/null
+++ b/sale_commission_product_criteria/readme/CONTRIBUTORS.rst
@@ -0,0 +1,6 @@
+* `Ooops404 `__:
+
+ * Ilyas
+* `Aion Tech `_:
+
+ * Simone Rubino
diff --git a/sale_commission_product_criteria/readme/DESCRIPTION.rst b/sale_commission_product_criteria/readme/DESCRIPTION.rst
new file mode 100644
index 000000000..c4a10d9e4
--- /dev/null
+++ b/sale_commission_product_criteria/readme/DESCRIPTION.rst
@@ -0,0 +1,16 @@
+This module allows to set in the same Commission Type different commission rates according to the product on SO/invoice line.
+
+This is made possible since this module adds a new "Product criteria" type to Commission Type and applies commission rates with the same logic of sale pricelist items.
+
+For example, such a Commission Type can grant:
+
+10% on a specific Product A,
+10$ on Product B,
+4% on products in Category 1 and
+5$ on all other products.
+
+In SO/invoice, system will apply different commissions based on variant/product/category or global, applied hierarchically. This means that for the example above, if product A is assigned to Category 1, commission assigned is 10%, as per variant/product/category/global rule application order.
+
+Furthermore, these commission type items can be accessed and created by a specific menu, to facilitate their management in environments with lots of records.
+
+The form for commission type item can be extended by future modules with further conditions to decide when to apply a specific item.
diff --git a/sale_commission_product_criteria/readme/USAGE.rst b/sale_commission_product_criteria/readme/USAGE.rst
new file mode 100644
index 000000000..bdd3fd9bd
--- /dev/null
+++ b/sale_commission_product_criteria/readme/USAGE.rst
@@ -0,0 +1,7 @@
+To use features of this module, you need to:
+
+#. Go to Commissions > Configuration > Commission Types.
+#. Create a Commission Type with type = "Product criteria".
+#. Create multiple rules based on variant/product/category or global
+#. These rules will be sorted according to the same logic of sale pricelist.
+#. Rest flow is according to OCA sale_commission module.
diff --git a/sale_commission_product_criteria/security/ir.model.access.csv b/sale_commission_product_criteria/security/ir.model.access.csv
new file mode 100644
index 000000000..0958b9904
--- /dev/null
+++ b/sale_commission_product_criteria/security/ir.model.access.csv
@@ -0,0 +1,3 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_commission_item_manager,access_commission_item_manager,model_commission_item,sales_team.group_sale_manager,1,1,1,1
+access_commission_item_salesman,access_commission_item_salesman,model_commission_item,sales_team.group_sale_salesman,1,0,0,0
diff --git a/sale_commission_product_criteria/static/description/icon.png b/sale_commission_product_criteria/static/description/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d
GIT binary patch
literal 9455
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
z
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
Xviia!U7SGha1wx#SCgwmn*{w2TRX*I
literal 0
HcmV?d00001
diff --git a/sale_commission_product_criteria/static/description/index.html b/sale_commission_product_criteria/static/description/index.html
new file mode 100644
index 000000000..91d45c827
--- /dev/null
+++ b/sale_commission_product_criteria/static/description/index.html
@@ -0,0 +1,454 @@
+
+
+
+
+
+Sale Commission Product Criteria
+
+
+
+
+
Sale Commission Product Criteria
+
+
+
+
This module allows to set in the same Commission Type different commission rates according to the product on SO/invoice line.
+
This is made possible since this module adds a new “Product criteria” type to Commission Type and applies commission rates with the same logic of sale pricelist items.
+
For example, such a Commission Type can grant:
+
10% on a specific Product A,
+10$ on Product B,
+4% on products in Category 1 and
+5$ on all other products.
+
In SO/invoice, system will apply different commissions based on variant/product/category or global, applied hierarchically. This means that for the example above, if product A is assigned to Category 1, commission assigned is 10%, as per variant/product/category/global rule application order.
+
Furthermore, these commission type items can be accessed and created by a specific menu, to facilitate their management in environments with lots of records.
+
The form for commission type item can be extended by future modules with further conditions to decide when to apply a specific item.
+
Table of contents
+
+
+
+
To use features of this module, you need to:
+
+Go to Commissions > Configuration > Commission Types.
+Create a Commission Type with type = “Product criteria”.
+Create multiple rules based on variant/product/category or global
+These rules will be sorted according to the same logic of sale pricelist.
+Rest flow is according to OCA sale_commission module.
+
+
+
+
+
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.
+
+
+
+
+
+
+
+
This module is maintained by the OCA.
+
+
+
+
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 maintainer :
+
+
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/tests/__init__.py b/sale_commission_product_criteria/tests/__init__.py
new file mode 100644
index 000000000..9a20f675a
--- /dev/null
+++ b/sale_commission_product_criteria/tests/__init__.py
@@ -0,0 +1 @@
+from . import test_sale_commission_product_criteria
diff --git a/sale_commission_product_criteria/tests/test_sale_commission_product_criteria.py b/sale_commission_product_criteria/tests/test_sale_commission_product_criteria.py
new file mode 100644
index 000000000..b016128be
--- /dev/null
+++ b/sale_commission_product_criteria/tests/test_sale_commission_product_criteria.py
@@ -0,0 +1,220 @@
+# © 2023 ooops404
+# Copyright 2023 Simone Rubino - Aion Tech
+# License AGPL-3 - See https://www.gnu.org/licenses/agpl-3.0.html
+
+
+from odoo.exceptions import ValidationError
+from odoo.tests.common import Form, TransactionCase
+
+
+class TestSaleCommission(TransactionCase):
+ @classmethod
+ def setUpClass(cls):
+ super().setUpClass()
+ cls.commission_model = cls.env["commission"]
+ cls.company = cls.env.ref("base.main_company")
+ cls.res_partner_model = cls.env["res.partner"]
+ cls.partner = cls.env.ref("base.res_partner_12")
+ cls.partner2 = cls.env.ref("base.res_partner_10")
+ cls.sale_order_model = cls.env["sale.order"]
+ cls.advance_inv_model = cls.env["sale.advance.payment.inv"]
+ cls.settle_model = cls.env["commission.settlement"]
+ cls.make_settle_model = cls.env["commission.make.settle"]
+ cls.make_inv_model = cls.env["commission.make.invoice"]
+ cls.product_1 = cls.env.ref("product.product_product_1")
+ cls.product_4 = cls.env.ref("product.product_product_4")
+ cls.product_5 = cls.env.ref("product.product_product_5")
+ cls.product_6 = cls.env.ref("product.product_product_6")
+ cls.product_1.write({"invoice_policy": "order"})
+ cls.product_4.write({"invoice_policy": "order"})
+ cls.product_5.write({"invoice_policy": "order"})
+ cls.product_6.write({"commission_free": True})
+ cls.product_template_4 = cls.env.ref(
+ "product.product_product_4_product_template"
+ )
+ cls.product_template_4.write({"invoice_policy": "order"})
+ cls.journal = cls.env["account.journal"].search(
+ [("type", "=", "purchase")], limit=1
+ )
+ cls.rules_commission_id = cls.env.ref(
+ "sale_commission_product_criteria.demo_commission_rules"
+ )
+ cls.com_item_1 = cls.env.ref(
+ "sale_commission_product_criteria.demo_commission_rules_item_1"
+ )
+ cls.com_item_2 = cls.env.ref(
+ "sale_commission_product_criteria.demo_commission_rules_item_2"
+ )
+ cls.com_item_3 = cls.env.ref(
+ "sale_commission_product_criteria.demo_commission_rules_item_3"
+ )
+ cls.com_item_4 = cls.env.ref(
+ "sale_commission_product_criteria.demo_commission_rules_item_4"
+ )
+
+ def _create_sale_order(self, product, partner):
+ return self.sale_order_model.create(
+ {
+ "partner_id": partner.id,
+ "order_line": [
+ (
+ 0,
+ 0,
+ {
+ "name": product.name,
+ "product_id": product.id,
+ "product_uom_qty": 1.0,
+ "product_uom": product.uom_id.id,
+ "price_unit": 1000,
+ },
+ )
+ ],
+ }
+ )
+
+ def _invoice_sale_order(self, sale_order, date=None):
+ old_invoices = sale_order.invoice_ids
+ wizard = self.advance_inv_model.with_context(
+ **{
+ "active_model": "sale.order",
+ "active_ids": [sale_order.id],
+ "active_id": sale_order.id,
+ }
+ ).create(
+ {
+ "advance_payment_method": "delivered",
+ }
+ )
+ wizard.create_invoices()
+ invoice = sale_order.invoice_ids - old_invoices
+ return invoice
+
+ def test_sale_commission_product_criteria_items(self):
+ # items names
+ self.com_item_1._compute_commission_item_name_value()
+ self.com_item_1.currency_id.position = "after"
+ self.com_item_1._compute_commission_item_name_value()
+ self.assertEqual(self.com_item_1.name, "All Products")
+ self.com_item_1.write({"applied_on": "3_global"})
+ self.com_item_2._compute_commission_item_name_value()
+ self.assertEqual(
+ self.com_item_2.name, "Category: All / Saleable / Office Furniture"
+ )
+ self.com_item_2.write({"applied_on": "2_product_category"})
+ self.com_item_3._compute_commission_item_name_value()
+ self.assertEqual(self.com_item_3.name, "Product: Customizable Desk")
+ self.com_item_3.write({"applied_on": "1_product"})
+ self.com_item_4._compute_commission_item_name_value()
+ self.assertEqual(
+ self.com_item_4.name, "Variant: Customizable Desk (Steel, White)"
+ )
+ self.com_item_4.write({"applied_on": "0_product_variant"})
+
+ # 3_global
+ so_1 = self._create_sale_order(self.product_1, self.partner)
+ so_1.recompute_lines_agents()
+ self.assertEqual(so_1.partner_agent_ids.name, "Agent Rules")
+ self.assertEqual(so_1.order_line.agent_ids.amount, 10)
+ so_1.action_confirm()
+ invoice = self._invoice_sale_order(so_1)
+ invoice.recompute_lines_agents()
+ invoice.action_post()
+
+ # 2_product_category
+ so = self._create_sale_order(self.product_5, self.partner)
+ so.recompute_lines_agents()
+ self.assertEqual(so.partner_agent_ids.name, "Agent Rules")
+ self.assertEqual(so.order_line.agent_ids.amount, 20)
+ so.action_confirm()
+ invoice = self._invoice_sale_order(so)
+ invoice.recompute_lines_agents()
+
+ # 1_product 5 %
+ pp4 = self.product_template_4.product_variant_id
+ so = self._create_sale_order(pp4, self.partner)
+ so.recompute_lines_agents()
+ self.assertEqual(so.partner_agent_ids.name, "Agent Rules")
+ self.assertEqual(so.order_line.agent_ids.amount, 50)
+ so.action_confirm()
+ invoice = self._invoice_sale_order(so)
+ invoice.recompute_lines_agents()
+
+ # 0_product_variant 15 %
+ so = self._create_sale_order(self.product_4, self.partner)
+ so.recompute_lines_agents()
+ self.assertEqual(so.partner_agent_ids.name, "Agent Rules")
+ self.assertEqual(so.order_line.agent_ids.amount, 150)
+ so.action_confirm()
+ invoice = self._invoice_sale_order(so)
+ invoice.recompute_lines_agents()
+
+ # Commission free product
+ so = self._create_sale_order(self.product_6, self.partner)
+ so.recompute_lines_agents()
+
+ # Type != product
+ so = self._create_sale_order(self.product_4, self.partner2)
+ so.recompute_lines_agents()
+
+ # net amount
+ self.rules_commission_id.amount_base_type = "net_amount"
+ so = self._create_sale_order(self.product_4, self.partner)
+ so.order_line.agent_ids._compute_amount()
+
+ # archive
+ self.rules_commission_id.action_archive()
+ self.rules_commission_id.action_unarchive()
+
+ # copy
+ new_rule = self.rules_commission_id.copy()
+ self.assertEqual(len(new_rule.item_ids), len(self.rules_commission_id.item_ids))
+
+ # change commission_type
+ self.rules_commission_id.commission_type = "fixed"
+ with self.assertRaises(ValidationError):
+ self.rules_commission_id.check_type_change_allowed_moves()
+ with self.assertRaises(ValidationError):
+ self.rules_commission_id.check_type_change_allowed_sale()
+
+ # no rule found
+ self.env.ref(
+ "sale_commission_product_criteria.demo_commission_rules_item_1"
+ ).unlink()
+ so = self._create_sale_order(self.product_1, self.partner)
+ so.order_line.agent_ids._compute_amount()
+
+ # _check_product_consistency
+ with self.assertRaises(ValidationError):
+ self.com_item_2.categ_id = False
+ with self.assertRaises(ValidationError):
+ self.com_item_3.product_tmpl_id = False
+ with self.assertRaises(ValidationError):
+ self.com_item_4.product_id = False
+
+ # _onchange_product_id
+ self.com_item_4.product_id = self.product_1
+ self.com_item_4._onchange_product_id()
+ self.com_item_4.with_context(
+ default_applied_on="1_product"
+ )._onchange_product_id()
+ self.com_item_4.product_tmpl_id = self.product_template_4
+ self.com_item_4._onchange_product_id()
+ self.com_item_4.product_tmpl_id = self.product_template_4
+ with self.assertRaises(ValidationError):
+ self.com_item_4._onchange_product_tmpl_id()
+
+ def test_on_create_check(self):
+ f = Form(self.commission_model)
+ f.name = "New commission type"
+ f.save()
+
+ so = self._create_sale_order(self.product_4, self.partner)
+ self.assertEqual(
+ so.order_line.agent_ids.commission_id, self.rules_commission_id
+ )
+ self.assertEqual(self.rules_commission_id.commission_type, "product")
+
+ so.action_confirm()
+ with self.assertRaises(ValidationError):
+ self.rules_commission_id.commission_type = "fixed"
+ self.rules_commission_id.onchange_commission_type()
diff --git a/sale_commission_product_criteria/views/views.xml b/sale_commission_product_criteria/views/views.xml
new file mode 100644
index 000000000..dc555fd83
--- /dev/null
+++ b/sale_commission_product_criteria/views/views.xml
@@ -0,0 +1,239 @@
+
+
+
+
+
+ sale.agent.order.inherit.form.sale_commission_product_criteria.mod
+ sale.order
+
+
+
+
+
+
+
+
+
+
+ commission.form.view.inherit
+ commission
+
+
+
+ {'invisible': [('commission_type', '=', 'product')]}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ sale.order.line.agent.mod
+ sale.order.line.agent
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ commission.item.form
+ commission.item
+
+
+
+
+
+
+ commission.item.tree
+ commission.item
+
+
+
+
+
+
+
+
+
+
+
+
+ commission.item.search.view
+ commission.item
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Commission Items
+ ir.actions.act_window
+ commission.item
+ tree,form
+
+ {"hide_commission_id":1, 'search_default_group_by_commission': 1,}
+
+
+
+
+ Commission Items
+ ir.actions.act_window
+ commission.item
+ tree,form
+
+ {"hide_commission_id":0, 'search_default_group_by_commission': 1,}
+
+
+
+
+
+
From 35328632ebc1fc2ef0094f5e50fc5ced878c9a64 Mon Sep 17 00:00:00 2001
From: Amjith Titus
Date: Mon, 18 Aug 2025 12:09:13 +0530
Subject: [PATCH 2/4] Uprgrade sale_commission_product_criteria from 16.0 to
18.0
---
.../__manifest__.py | 4 +-
.../views/views.xml | 72 ++++++++++---------
2 files changed, 40 insertions(+), 36 deletions(-)
diff --git a/sale_commission_product_criteria/__manifest__.py b/sale_commission_product_criteria/__manifest__.py
index 49a959d4d..55aa8e183 100644
--- a/sale_commission_product_criteria/__manifest__.py
+++ b/sale_commission_product_criteria/__manifest__.py
@@ -4,13 +4,13 @@
{
"name": "Sale Commission Product Criteria",
"summary": "Advanced commissions rules",
- "version": "16.0.2.0.0",
+ "version": "18.0.1.0.2",
"author": "Ilyas, Ooops404, Odoo Community Association (OCA)",
"maintainers": ["ilyasProgrammer"],
"website": "https://github.com/OCA/commission",
"category": "Sales Management",
"license": "AGPL-3",
- "depends": ["sale_commission"],
+ "depends": ["sale_commission_oca"],
"data": [
"views/views.xml",
"security/ir.model.access.csv",
diff --git a/sale_commission_product_criteria/views/views.xml b/sale_commission_product_criteria/views/views.xml
index dc555fd83..1c196df28 100644
--- a/sale_commission_product_criteria/views/views.xml
+++ b/sale_commission_product_criteria/views/views.xml
@@ -14,14 +14,14 @@
>sale.agent.order.inherit.form.sale_commission_product_criteria.mod
sale.order
-
+
@@ -31,32 +31,25 @@
commission.form.view.inherit
commission
-
+
- {'invisible': [('commission_type', '=', 'product')]}
+ commission_type == 'product'
-
-
-
-
-
-
-
+ view_mode="list"
+ views="[(5, 0, 0), (0, 0, {'view_mode': 'list', 'view_id': ref('commission_item_embedded_list_view')})]"
+ />
@@ -66,7 +59,7 @@
sale.order.line.agent.mod
sale.order.line.agent
-
+
1
@@ -108,23 +101,20 @@
@@ -144,19 +134,19 @@
%%
@@ -167,17 +157,31 @@
-
+
commission.item.tree
commission.item
-
+
-
+
+
+
+
+
+ commission.item.embedded.tree
+ commission.item
+
+
+
+
+
+
+
+
@@ -223,7 +227,7 @@
@@ -232,7 +236,7 @@
name="Commission Type Items"
id="menu_sale_commissions_items"
action="commission_item_action_tree"
- parent="commission.menu_commission_management"
+ parent="commission_oca.menu_commission_management"
groups="sales_team.group_sale_manager"
sequence="10"
/>
From 3999e41f350f8d7893369bfa70f0dad8edc3d94b Mon Sep 17 00:00:00 2001
From: Amjith Titus
Date: Mon, 18 Aug 2025 12:37:04 +0530
Subject: [PATCH 3/4] Pre commit check fix
---
sale_commission_product_criteria/README.rst | 62 +++++++++++--------
.../demo/sale_agent_demo.xml | 2 -
.../models/commission.py | 24 +++----
.../models/sale_commission_line_mixin.py | 3 +-
.../pyproject.toml | 3 +
.../readme/CONTRIBUTORS.md | 4 ++
.../readme/CONTRIBUTORS.rst | 6 --
.../readme/DESCRIPTION.md | 24 +++++++
.../readme/DESCRIPTION.rst | 16 -----
.../readme/USAGE.md | 8 +++
.../readme/USAGE.rst | 7 ---
.../static/description/index.html | 35 +++++++----
.../views/views.xml | 22 ++++---
13 files changed, 120 insertions(+), 96 deletions(-)
create mode 100644 sale_commission_product_criteria/pyproject.toml
create mode 100644 sale_commission_product_criteria/readme/CONTRIBUTORS.md
delete mode 100644 sale_commission_product_criteria/readme/CONTRIBUTORS.rst
create mode 100644 sale_commission_product_criteria/readme/DESCRIPTION.md
delete mode 100644 sale_commission_product_criteria/readme/DESCRIPTION.rst
create mode 100644 sale_commission_product_criteria/readme/USAGE.md
delete mode 100644 sale_commission_product_criteria/readme/USAGE.rst
diff --git a/sale_commission_product_criteria/README.rst b/sale_commission_product_criteria/README.rst
index bfc58066c..df4097a47 100644
--- a/sale_commission_product_criteria/README.rst
+++ b/sale_commission_product_criteria/README.rst
@@ -17,33 +17,41 @@ Sale Commission Product Criteria
: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
+ :target: https://github.com/OCA/commission/tree/18.0/sale_commission_product_criteria
: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
+ :target: https://translation.odoo-community.org/projects/commission-18-0/commission-18-0-sale_commission_product_criteria
: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
+ :target: https://runboat.odoo-community.org/builds?repo=OCA/commission&target_branch=18.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
-This module allows to set in the same Commission Type different commission rates according to the product on SO/invoice line.
+This module allows to set in the same Commission Type different
+commission rates according to the product on SO/invoice line.
-This is made possible since this module adds a new "Product criteria" type to Commission Type and applies commission rates with the same logic of sale pricelist items.
+This is made possible since this module adds a new "Product criteria"
+type to Commission Type and applies commission rates with the same logic
+of sale pricelist items.
For example, such a Commission Type can grant:
-10% on a specific Product A,
-10$ on Product B,
-4% on products in Category 1 and
-5$ on all other products.
+10% on a specific Product A, 10$ on Product B, 4% on products in
+Category 1 and 5$ on all other products.
-In SO/invoice, system will apply different commissions based on variant/product/category or global, applied hierarchically. This means that for the example above, if product A is assigned to Category 1, commission assigned is 10%, as per variant/product/category/global rule application order.
+In SO/invoice, system will apply different commissions based on
+variant/product/category or global, applied hierarchically. This means
+that for the example above, if product A is assigned to Category 1,
+commission assigned is 10%, as per variant/product/category/global rule
+application order.
-Furthermore, these commission type items can be accessed and created by a specific menu, to facilitate their management in environments with lots of records.
+Furthermore, these commission type items can be accessed and created by
+a specific menu, to facilitate their management in environments with
+lots of records.
-The form for commission type item can be extended by future modules with further conditions to decide when to apply a specific item.
+The form for commission type item can be extended by future modules with
+further conditions to decide when to apply a specific item.
**Table of contents**
@@ -55,11 +63,12 @@ Usage
To use features of this module, you need to:
-#. Go to Commissions > Configuration > Commission Types.
-#. Create a Commission Type with type = "Product criteria".
-#. Create multiple rules based on variant/product/category or global
-#. These rules will be sorted according to the same logic of sale pricelist.
-#. Rest flow is according to OCA sale_commission module.
+1. Go to Commissions > Configuration > Commission Types.
+2. Create a Commission Type with type = "Product criteria".
+3. Create multiple rules based on variant/product/category or global
+4. These rules will be sorted according to the same logic of sale
+ pricelist.
+5. Rest flow is according to OCA sale_commission module.
Bug Tracker
===========
@@ -67,7 +76,7 @@ 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 `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -75,23 +84,24 @@ Credits
=======
Authors
-~~~~~~~
+-------
* Ilyas
* Ooops404
Contributors
-~~~~~~~~~~~~
+------------
-* `Ooops404 `__:
+- `Ooops404 `__:
- * Ilyas
-* `Aion Tech `_:
+ - Ilyas
- * Simone Rubino
+- `Aion Tech `__:
+
+ - Simone Rubino
Maintainers
-~~~~~~~~~~~
+-----------
This module is maintained by the OCA.
@@ -111,6 +121,6 @@ Current `maintainer `__:
|maintainer-ilyasProgrammer|
-This module is part of the `OCA/commission `_ project on GitHub.
+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/demo/sale_agent_demo.xml b/sale_commission_product_criteria/demo/sale_agent_demo.xml
index caffc6e4a..c1fbe969c 100644
--- a/sale_commission_product_criteria/demo/sale_agent_demo.xml
+++ b/sale_commission_product_criteria/demo/sale_agent_demo.xml
@@ -4,7 +4,6 @@
~ License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
-->
-
Based on Rules
product
@@ -65,5 +64,4 @@
eval="[(6, 0, [ref('sale_commission_product_criteria.demo_agent_rules')])]"
/>
-
diff --git a/sale_commission_product_criteria/models/commission.py b/sale_commission_product_criteria/models/commission.py
index cb46a41c7..addf6cf28 100644
--- a/sale_commission_product_criteria/models/commission.py
+++ b/sale_commission_product_criteria/models/commission.py
@@ -174,21 +174,13 @@ def _compute_commission_item_name_value(self):
"Product Price"
)
if item.currency_id.position == "after":
- item.commission_value = "%s %s" % (
- float_repr(
- item.fixed_amount,
- decimal_places,
- ),
- item.currency_id.symbol or "",
- )
+ amount_str = float_repr(item.fixed_amount, decimal_places)
+ symbol = item.currency_id.symbol or ""
+ item.commission_value = f"{amount_str} {symbol}"
else:
- item.commission_value = "%s %s" % (
- item.currency_id.symbol or "",
- float_repr(
- item.fixed_amount,
- decimal_places,
- ),
- )
+ amount_str = float_repr(item.fixed_amount, decimal_places)
+ symbol = item.currency_id.symbol or ""
+ item.commission_value = f"{symbol} {amount_str}"
elif item.commission_type == "percentage":
item.commission_value = str(item.percent_amount) + " %"
@@ -244,11 +236,11 @@ def create(self, values_list):
for values in values_list:
values = self.validate_values(values)
new_values_list.append(values)
- return super(CommissionItem, self).create(new_values_list)
+ return super().create(new_values_list)
def write(self, values):
values = self.validate_values(values)
- res = super(CommissionItem, self).write(values)
+ res = super().write(values)
return res
def validate_values(self, values):
diff --git a/sale_commission_product_criteria/models/sale_commission_line_mixin.py b/sale_commission_product_criteria/models/sale_commission_line_mixin.py
index dd88d9a06..6e81e0bf5 100644
--- a/sale_commission_product_criteria/models/sale_commission_line_mixin.py
+++ b/sale_commission_product_criteria/models/sale_commission_line_mixin.py
@@ -24,7 +24,8 @@ def _commission_items_from(self):
"""
def _commission_items_where(self):
- return """ (item.product_tmpl_id IS NULL OR item.product_tmpl_id = any(%(prod_tmpls)s))
+ return """
+ (item.product_tmpl_id IS NULL OR item.product_tmpl_id = any(%(prod_tmpls)s))
AND (item.product_id IS NULL OR item.product_id = any(%(prod_prods)s))
AND (item.categ_id IS NULL OR item.categ_id = any(%(categs)s))
AND (item.commission_id = %(commission)s)
diff --git a/sale_commission_product_criteria/pyproject.toml b/sale_commission_product_criteria/pyproject.toml
new file mode 100644
index 000000000..4231d0ccc
--- /dev/null
+++ b/sale_commission_product_criteria/pyproject.toml
@@ -0,0 +1,3 @@
+[build-system]
+requires = ["whool"]
+build-backend = "whool.buildapi"
diff --git a/sale_commission_product_criteria/readme/CONTRIBUTORS.md b/sale_commission_product_criteria/readme/CONTRIBUTORS.md
new file mode 100644
index 000000000..528076b7f
--- /dev/null
+++ b/sale_commission_product_criteria/readme/CONTRIBUTORS.md
@@ -0,0 +1,4 @@
+- [Ooops404](https://www.ooops404.com):
+ - Ilyas \
+- [Aion Tech](https://aiontech.company/):
+ - Simone Rubino \
diff --git a/sale_commission_product_criteria/readme/CONTRIBUTORS.rst b/sale_commission_product_criteria/readme/CONTRIBUTORS.rst
deleted file mode 100644
index 898ef9dd2..000000000
--- a/sale_commission_product_criteria/readme/CONTRIBUTORS.rst
+++ /dev/null
@@ -1,6 +0,0 @@
-* `Ooops404 `__:
-
- * Ilyas
-* `Aion Tech `_:
-
- * Simone Rubino
diff --git a/sale_commission_product_criteria/readme/DESCRIPTION.md b/sale_commission_product_criteria/readme/DESCRIPTION.md
new file mode 100644
index 000000000..8eed5afd4
--- /dev/null
+++ b/sale_commission_product_criteria/readme/DESCRIPTION.md
@@ -0,0 +1,24 @@
+This module allows to set in the same Commission Type different
+commission rates according to the product on SO/invoice line.
+
+This is made possible since this module adds a new "Product criteria"
+type to Commission Type and applies commission rates with the same logic
+of sale pricelist items.
+
+For example, such a Commission Type can grant:
+
+10% on a specific Product A, 10\$ on Product B, 4% on products in
+Category 1 and 5\$ on all other products.
+
+In SO/invoice, system will apply different commissions based on
+variant/product/category or global, applied hierarchically. This means
+that for the example above, if product A is assigned to Category 1,
+commission assigned is 10%, as per variant/product/category/global rule
+application order.
+
+Furthermore, these commission type items can be accessed and created by
+a specific menu, to facilitate their management in environments with
+lots of records.
+
+The form for commission type item can be extended by future modules with
+further conditions to decide when to apply a specific item.
diff --git a/sale_commission_product_criteria/readme/DESCRIPTION.rst b/sale_commission_product_criteria/readme/DESCRIPTION.rst
deleted file mode 100644
index c4a10d9e4..000000000
--- a/sale_commission_product_criteria/readme/DESCRIPTION.rst
+++ /dev/null
@@ -1,16 +0,0 @@
-This module allows to set in the same Commission Type different commission rates according to the product on SO/invoice line.
-
-This is made possible since this module adds a new "Product criteria" type to Commission Type and applies commission rates with the same logic of sale pricelist items.
-
-For example, such a Commission Type can grant:
-
-10% on a specific Product A,
-10$ on Product B,
-4% on products in Category 1 and
-5$ on all other products.
-
-In SO/invoice, system will apply different commissions based on variant/product/category or global, applied hierarchically. This means that for the example above, if product A is assigned to Category 1, commission assigned is 10%, as per variant/product/category/global rule application order.
-
-Furthermore, these commission type items can be accessed and created by a specific menu, to facilitate their management in environments with lots of records.
-
-The form for commission type item can be extended by future modules with further conditions to decide when to apply a specific item.
diff --git a/sale_commission_product_criteria/readme/USAGE.md b/sale_commission_product_criteria/readme/USAGE.md
new file mode 100644
index 000000000..986929327
--- /dev/null
+++ b/sale_commission_product_criteria/readme/USAGE.md
@@ -0,0 +1,8 @@
+To use features of this module, you need to:
+
+1. Go to Commissions \> Configuration \> Commission Types.
+2. Create a Commission Type with type = "Product criteria".
+3. Create multiple rules based on variant/product/category or global
+4. These rules will be sorted according to the same logic of sale
+ pricelist.
+5. Rest flow is according to OCA sale_commission module.
diff --git a/sale_commission_product_criteria/readme/USAGE.rst b/sale_commission_product_criteria/readme/USAGE.rst
deleted file mode 100644
index bdd3fd9bd..000000000
--- a/sale_commission_product_criteria/readme/USAGE.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-To use features of this module, you need to:
-
-#. Go to Commissions > Configuration > Commission Types.
-#. Create a Commission Type with type = "Product criteria".
-#. Create multiple rules based on variant/product/category or global
-#. These rules will be sorted according to the same logic of sale pricelist.
-#. Rest flow is according to OCA sale_commission module.
diff --git a/sale_commission_product_criteria/static/description/index.html b/sale_commission_product_criteria/static/description/index.html
index 91d45c827..d6e568598 100644
--- a/sale_commission_product_criteria/static/description/index.html
+++ b/sale_commission_product_criteria/static/description/index.html
@@ -369,17 +369,25 @@ Sale Commission Product Criteria
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:4bd16205ce53357916f35f63494314b7c39a51d4b787e42f7e13b0eb69fc90f0
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-
-This module allows to set in the same Commission Type different commission rates according to the product on SO/invoice line.
-This is made possible since this module adds a new “Product criteria” type to Commission Type and applies commission rates with the same logic of sale pricelist items.
+
+This module allows to set in the same Commission Type different
+commission rates according to the product on SO/invoice line.
+This is made possible since this module adds a new “Product criteria”
+type to Commission Type and applies commission rates with the same logic
+of sale pricelist items.
For example, such a Commission Type can grant:
-10% on a specific Product A,
-10$ on Product B,
-4% on products in Category 1 and
-5$ on all other products.
-In SO/invoice, system will apply different commissions based on variant/product/category or global, applied hierarchically. This means that for the example above, if product A is assigned to Category 1, commission assigned is 10%, as per variant/product/category/global rule application order.
-Furthermore, these commission type items can be accessed and created by a specific menu, to facilitate their management in environments with lots of records.
-The form for commission type item can be extended by future modules with further conditions to decide when to apply a specific item.
+10% on a specific Product A, 10$ on Product B, 4% on products in
+Category 1 and 5$ on all other products.
+In SO/invoice, system will apply different commissions based on
+variant/product/category or global, applied hierarchically. This means
+that for the example above, if product A is assigned to Category 1,
+commission assigned is 10%, as per variant/product/category/global rule
+application order.
+Furthermore, these commission type items can be accessed and created by
+a specific menu, to facilitate their management in environments with
+lots of records.
+The form for commission type item can be extended by future modules with
+further conditions to decide when to apply a specific item.
Table of contents
@@ -400,7 +408,8 @@
Go to Commissions > Configuration > Commission Types.
Create a Commission Type with type = “Product criteria”.
Create multiple rules based on variant/product/category or global
-These rules will be sorted according to the same logic of sale pricelist.
+These rules will be sorted according to the same logic of sale
+pricelist.
Rest flow is according to OCA sale_commission module.
@@ -409,7 +418,7 @@
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 .
+feedback .
Do not contact contributors directly about support or help with technical issues.
diff --git a/sale_commission_product_criteria/views/views.xml b/sale_commission_product_criteria/views/views.xml
index 1c196df28..f4cb6af93 100644
--- a/sale_commission_product_criteria/views/views.xml
+++ b/sale_commission_product_criteria/views/views.xml
@@ -14,7 +14,10 @@
>sale.agent.order.inherit.form.sale_commission_product_criteria.mod
sale.order
-
+
-
+
+ name="percent_amount"
+ class="oe_inline"
+ invisible="commission_type != 'percentage'"
+ />
%%
@@ -179,7 +180,10 @@
-
+
From e67ee4c6cb4b731f0dbf37712ca8e8f68dd1e6e3 Mon Sep 17 00:00:00 2001
From: Amjith Titus
Date: Mon, 18 Aug 2025 13:35:26 +0530
Subject: [PATCH 4/4] Fix test
---
.../tests/test_sale_commission_product_criteria.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sale_commission_product_criteria/tests/test_sale_commission_product_criteria.py b/sale_commission_product_criteria/tests/test_sale_commission_product_criteria.py
index b016128be..c1159e8ed 100644
--- a/sale_commission_product_criteria/tests/test_sale_commission_product_criteria.py
+++ b/sale_commission_product_criteria/tests/test_sale_commission_product_criteria.py
@@ -4,7 +4,7 @@
from odoo.exceptions import ValidationError
-from odoo.tests.common import Form, TransactionCase
+from odoo.tests import Form, TransactionCase
class TestSaleCommission(TransactionCase):