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

+ + +

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

+

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

+ +
+

Usage

+

To use features of this module, you need to:

+
    +
  1. Go to Commissions > Configuration > Commission Types.
  2. +
  3. Create a Commission Type with type = “Product criteria”.
  4. +
  5. Create multiple rules based on variant/product/category or global
  6. +
  7. These rules will be sorted according to the same logic of sale pricelist.
  8. +
  9. Rest flow is according to OCA sale_commission module.
  10. +
+
+
+

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

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

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

+

Current 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/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 @@ - + 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 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

-

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.

+

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

+

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 @@

    Usage

  • 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 @@

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.

@@ -445,7 +454,7 @@

Maintainers

promote its widespread use.

Current 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/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 - +