From 2fd313c13986f329ba310cac2cfdf3dcd3653d24 Mon Sep 17 00:00:00 2001 From: Ilyas Date: Wed, 12 Apr 2023 13:20:03 +0200 Subject: [PATCH 01/17] [ADD] sale_commission_product_criteria --- .../README.rst | 110 +++++ .../__init__.py | 1 + .../__manifest__.py | 21 + .../demo/sale_agent_demo.xml | 65 +++ .../i18n/sale_commission_product_criteria.pot | 412 ++++++++++++++++ .../models/__init__.py | 5 + .../models/account_move.py | 27 ++ .../models/commission.py | 267 +++++++++++ .../models/sale.py | 52 ++ .../models/sale_commission_line_mixin.py | 77 +++ .../models/settlement.py | 7 + .../readme/CONTRIBUTORS.rst | 3 + .../readme/DESCRIPTION.rst | 16 + .../readme/USAGE.rst | 7 + .../security/ir.model.access.csv | 2 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 446 ++++++++++++++++++ .../tests/__init__.py | 1 + .../test_sale_commission_product_criteria.py | 200 ++++++++ .../views/views.xml | 235 +++++++++ 20 files changed, 1954 insertions(+) create mode 100644 sale_commission_product_criteria_oca/README.rst create mode 100644 sale_commission_product_criteria_oca/__init__.py create mode 100644 sale_commission_product_criteria_oca/__manifest__.py create mode 100644 sale_commission_product_criteria_oca/demo/sale_agent_demo.xml create mode 100644 sale_commission_product_criteria_oca/i18n/sale_commission_product_criteria.pot create mode 100644 sale_commission_product_criteria_oca/models/__init__.py create mode 100644 sale_commission_product_criteria_oca/models/account_move.py create mode 100644 sale_commission_product_criteria_oca/models/commission.py create mode 100644 sale_commission_product_criteria_oca/models/sale.py create mode 100644 sale_commission_product_criteria_oca/models/sale_commission_line_mixin.py create mode 100644 sale_commission_product_criteria_oca/models/settlement.py create mode 100644 sale_commission_product_criteria_oca/readme/CONTRIBUTORS.rst create mode 100644 sale_commission_product_criteria_oca/readme/DESCRIPTION.rst create mode 100644 sale_commission_product_criteria_oca/readme/USAGE.rst create mode 100644 sale_commission_product_criteria_oca/security/ir.model.access.csv create mode 100644 sale_commission_product_criteria_oca/static/description/icon.png create mode 100644 sale_commission_product_criteria_oca/static/description/index.html create mode 100644 sale_commission_product_criteria_oca/tests/__init__.py create mode 100644 sale_commission_product_criteria_oca/tests/test_sale_commission_product_criteria.py create mode 100644 sale_commission_product_criteria_oca/views/views.xml diff --git a/sale_commission_product_criteria_oca/README.rst b/sale_commission_product_criteria_oca/README.rst new file mode 100644 index 000000000..74134b4b7 --- /dev/null +++ b/sale_commission_product_criteria_oca/README.rst @@ -0,0 +1,110 @@ +================================ +Sale Commission Product Criteria +================================ + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/14.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-14-0/commission-14-0-sale_commission_product_criteria + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/165/14.0 + :alt: Try me on Runbot + +|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 Sales > Commission Management > 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 smashing 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 + +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_oca/__init__.py b/sale_commission_product_criteria_oca/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/sale_commission_product_criteria_oca/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/sale_commission_product_criteria_oca/__manifest__.py b/sale_commission_product_criteria_oca/__manifest__.py new file mode 100644 index 000000000..b642ea1ff --- /dev/null +++ b/sale_commission_product_criteria_oca/__manifest__.py @@ -0,0 +1,21 @@ +# © 2023 ooops404 +# License AGPL-3 - See https://www.gnu.org/licenses/agpl-3.0.html +{ + "name": "Sale Commission Product Criteria", + "summary": "Advanced commissions rules", + "version": "14.0.1.0.1", + "author": "Ilyas, Ooops404, Odoo Community Association (OCA)", + "maintainers": ["ilyasProgrammer"], + "website": "https://github.com/OCA/commission", + "category": "Sales Management", + "license": "AGPL-3", + "depends": ["sale_commission", "web_domain_field"], + "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_oca/demo/sale_agent_demo.xml b/sale_commission_product_criteria_oca/demo/sale_agent_demo.xml new file mode 100644 index 000000000..34d8fb019 --- /dev/null +++ b/sale_commission_product_criteria_oca/demo/sale_agent_demo.xml @@ -0,0 +1,65 @@ + + + + + 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_oca/i18n/sale_commission_product_criteria.pot b/sale_commission_product_criteria_oca/i18n/sale_commission_product_criteria.pot new file mode 100644 index 000000000..e1eaf62f7 --- /dev/null +++ b/sale_commission_product_criteria_oca/i18n/sale_commission_product_criteria.pot @@ -0,0 +1,412 @@ +# 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" +"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 +#: 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_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 "" + +#. 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 +#: code:addons/sale_commission_product_criteria/models/commission.py:0 +#, python-format +msgid "Category: %s" +msgstr "" + +#. 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 "" + +#. 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 +#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.commission_item_tree_view +msgid "Commission Items" +msgstr "" + +#. 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 "" + +#. 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,name:sale_commission_product_criteria.model_sale_commission +msgid "Commission in sales" +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_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 "" + +#. 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_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 "" + +#. module: sale_commission_product_criteria +#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_sale_commission__item_ids +msgid "Item" +msgstr "" + +#. module: sale_commission_product_criteria +#: model_terms:ir.ui.view,arch_db:sale_commission_product_criteria.sale_commission_form_lines_mod +msgid "Items" +msgstr "" + +#. 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 "" + +#. 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_sale_commission_settlement_line +msgid "Line of a commission settlement" +msgstr "" + +#. 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 "" + +#. 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 +#: 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 +#: 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 +#: 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__pricelist_id +msgid "Pricelist" +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__sale_commission__commission_type__product +msgid "Product criteria" +msgstr "" + +#. module: sale_commission_product_criteria +#: 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,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 +#: 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 +#: 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_sale_commission__commission_type +msgid "Type" +msgstr "" + +#. module: sale_commission_product_criteria +#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__use_pricelist +msgid "Use Pricelist" +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 +#: code:addons/sale_commission_product_criteria/models/commission.py:0 +#, python-format +msgid "Variant: %s" +msgstr "" diff --git a/sale_commission_product_criteria_oca/models/__init__.py b/sale_commission_product_criteria_oca/models/__init__.py new file mode 100644 index 000000000..b14568ddb --- /dev/null +++ b/sale_commission_product_criteria_oca/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_oca/models/account_move.py b/sale_commission_product_criteria_oca/models/account_move.py new file mode 100644 index 000000000..39c31b5cc --- /dev/null +++ b/sale_commission_product_criteria_oca/models/account_move.py @@ -0,0 +1,27 @@ +# © 2023 ooops404 +# 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): + 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: + super(AccountInvoiceLineAgent, line)._compute_amount() diff --git a/sale_commission_product_criteria_oca/models/commission.py b/sale_commission_product_criteria_oca/models/commission.py new file mode 100644 index 000000000..5f8dd9c71 --- /dev/null +++ b/sale_commission_product_criteria_oca/models/commission.py @@ -0,0 +1,267 @@ +# © 2023 ooops404 +# 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 = "sale.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): + 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( + "sale.commission", + string="Commission Type", + domain=[("commission_type", "=", "product")], + required=True, + ) + use_pricelist = fields.Boolean() + pricelist_id = fields.Many2one("product.pricelist") + 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")], + string="Based On", + 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("Fixed Amount", 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( + "Name", + 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 + def create(self, values): + values = self.validate_values(values) + return super(CommissionItem, self).create(values) + + def write(self, values): + values = self.validate_values(values) + res = super(CommissionItem, self).write(values) + self.invalidate_cache() + 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_oca/models/sale.py b/sale_commission_product_criteria_oca/models/sale.py new file mode 100644 index 000000000..452db8f26 --- /dev/null +++ b/sale_commission_product_criteria_oca/models/sale.py @@ -0,0 +1,52 @@ +# © 2023 ooops404 +# 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): + 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: + super(SaleOrderLineAgent, line)._compute_amount() + + +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_oca/models/sale_commission_line_mixin.py b/sale_commission_product_criteria_oca/models/sale_commission_line_mixin.py new file mode 100644 index 000000000..a7c43a1b6 --- /dev/null +++ b/sale_commission_product_criteria_oca/models/sale_commission_line_mixin.py @@ -0,0 +1,77 @@ +# © 2023 ooops404 +# License AGPL-3 - See https://www.gnu.org/licenses/agpl-3.0.html +from odoo import fields, models + + +class SaleCommissionLineMixin(models.AbstractModel): + _inherit = "sale.commission.line.mixin" + + applied_commission_id = fields.Many2one("sale.commission", readonly=True) + commission_id = fields.Many2one( + comodel_name="sale.commission", + ondelete="restrict", + required=False, + compute="_compute_commission_id", + store=True, + readonly=False, + copy=True, + ) + + def _get_commission_items(self, commission, product): + # Method replaced + categ_ids = {} + categ = product.categ_id + while categ: + categ_ids[categ.id] = True + categ = categ.parent_id + categ_ids = list(categ_ids) + # Select all suitable items. Order by best match + # (priority is: all/cat/subcat/product/variant). + self.env.cr.execute( + """ + SELECT + item.id + FROM + commission_item AS item + LEFT JOIN product_category AS categ ON item.categ_id = categ.id + WHERE + (item.product_tmpl_id IS NULL OR item.product_tmpl_id = any(%s)) + AND (item.product_id IS NULL OR item.product_id = any(%s)) + AND (item.categ_id IS NULL OR item.categ_id = any(%s)) + AND (item.commission_id = %s) + AND (item.active = TRUE) + ORDER BY + item.applied_on, categ.complete_name desc, item.id desc + """, + ( + product.product_tmpl_id.ids, + product.ids, + categ_ids, + commission._origin.id, # Added this + ), + ) + 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_oca/models/settlement.py b/sale_commission_product_criteria_oca/models/settlement.py new file mode 100644 index 000000000..ea1688f6b --- /dev/null +++ b/sale_commission_product_criteria_oca/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 = "sale.commission.settlement.line" diff --git a/sale_commission_product_criteria_oca/readme/CONTRIBUTORS.rst b/sale_commission_product_criteria_oca/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..c29a9c72e --- /dev/null +++ b/sale_commission_product_criteria_oca/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ +* `Ooops404 `__: + + * Ilyas diff --git a/sale_commission_product_criteria_oca/readme/DESCRIPTION.rst b/sale_commission_product_criteria_oca/readme/DESCRIPTION.rst new file mode 100644 index 000000000..c4a10d9e4 --- /dev/null +++ b/sale_commission_product_criteria_oca/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_oca/readme/USAGE.rst b/sale_commission_product_criteria_oca/readme/USAGE.rst new file mode 100644 index 000000000..9c5f76b87 --- /dev/null +++ b/sale_commission_product_criteria_oca/readme/USAGE.rst @@ -0,0 +1,7 @@ +To use features of this module, you need to: + +#. Go to Sales > Commission Management > 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_oca/security/ir.model.access.csv b/sale_commission_product_criteria_oca/security/ir.model.access.csv new file mode 100644 index 000000000..bb0d742a2 --- /dev/null +++ b/sale_commission_product_criteria_oca/security/ir.model.access.csv @@ -0,0 +1,2 @@ +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 diff --git a/sale_commission_product_criteria_oca/static/description/icon.png b/sale_commission_product_criteria_oca/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_oca/static/description/index.html b/sale_commission_product_criteria_oca/static/description/index.html new file mode 100644 index 000000000..cd13b63a9 --- /dev/null +++ b/sale_commission_product_criteria_oca/static/description/index.html @@ -0,0 +1,446 @@ + + + + + + +Sale Commission Product Criteria + + + +
+

Sale Commission Product Criteria

+ + +

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

+

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 Sales > Commission Management > 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 smashing it by providing a detailed and welcomed +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Ilyas
  • +
  • Ooops404
  • +
+
+ +
+

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_oca/tests/__init__.py b/sale_commission_product_criteria_oca/tests/__init__.py new file mode 100644 index 000000000..9a20f675a --- /dev/null +++ b/sale_commission_product_criteria_oca/tests/__init__.py @@ -0,0 +1 @@ +from . import test_sale_commission_product_criteria diff --git a/sale_commission_product_criteria_oca/tests/test_sale_commission_product_criteria.py b/sale_commission_product_criteria_oca/tests/test_sale_commission_product_criteria.py new file mode 100644 index 000000000..128e6118e --- /dev/null +++ b/sale_commission_product_criteria_oca/tests/test_sale_commission_product_criteria.py @@ -0,0 +1,200 @@ +# © 2023 ooops404 +# License AGPL-3 - See https://www.gnu.org/licenses/agpl-3.0.html + + +from odoo.exceptions import ValidationError +from odoo.tests.common import SavepointCase + + +class TestSaleCommission(SavepointCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.commission_model = cls.env["sale.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["sale.commission.settlement"] + cls.make_settle_model = cls.env["sale.commission.make.settle"] + cls.make_inv_model = cls.env["sale.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 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 (CONFIG)") + 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 (CONFIG) (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 _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.create({"advance_payment_method": "delivered"}) + wizard.with_context( + { + "active_model": "sale.order", + "active_ids": [sale_order.id], + "active_id": sale_order.id, + } + ).create_invoices() + invoice = sale_order.invoice_ids - old_invoices + invoice.flush() + return invoice diff --git a/sale_commission_product_criteria_oca/views/views.xml b/sale_commission_product_criteria_oca/views/views.xml new file mode 100644 index 000000000..e1ae96d44 --- /dev/null +++ b/sale_commission_product_criteria_oca/views/views.xml @@ -0,0 +1,235 @@ + + + + + sale.agent.order.inherit.form.sale_commission_product_criteria.mod + sale.order + + + + + + + + + sale.commission.form.view.inherit + sale.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 c4a4bf3777d97675f93f0b58f0a478840f5902c2 Mon Sep 17 00:00:00 2001 From: Francesco Foresti Date: Wed, 24 May 2023 09:03:42 +0000 Subject: [PATCH 02/17] Added translation using Weblate (Italian) --- .../i18n/it.po | 430 ++++++++++++++++++ 1 file changed, 430 insertions(+) create mode 100644 sale_commission_product_criteria_oca/i18n/it.po diff --git a/sale_commission_product_criteria_oca/i18n/it.po b/sale_commission_product_criteria_oca/i18n/it.po new file mode 100644 index 000000000..cb2e59cd4 --- /dev/null +++ b/sale_commission_product_criteria_oca/i18n/it.po @@ -0,0 +1,430 @@ +# 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: 2023-05-24 12:10+0000\n" +"Last-Translator: Francesco Foresti \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 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 "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__pricelist_id +msgid "Pricelist" +msgstr "Listino prezzi" + +#. 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 "" +"Specifica una categoria prodotto se questa regola si applica solo ai " +"prodotti appartenenti a questa categoria o alle sue categorie figlie, " +"altrimenti lascia 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 "" +"Specifica un prodotto se questa regola si applica solo ad un prodotto, " +"altrimenti lascia 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 "" +"Specifica un modello prodotto se questa regola si applica solo ad un modello " +"prodotto, altrimenti lascia 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__use_pricelist +msgid "Use Pricelist" +msgstr "Usa listino prezzi" + +#. 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" From 84d35649f7e9783c6e149acc713d3d914dfd0616 Mon Sep 17 00:00:00 2001 From: Ilyas Date: Thu, 22 Jun 2023 16:31:51 +0200 Subject: [PATCH 03/17] [FIX] sale_commission_product_criteria: removed pricelist_id feild. --- .../__manifest__.py | 2 +- .../i18n/it.po | 19 ++++++++----------- .../i18n/sale_commission_product_criteria.pot | 10 ---------- .../models/commission.py | 2 -- .../views/views.xml | 2 -- 5 files changed, 9 insertions(+), 26 deletions(-) diff --git a/sale_commission_product_criteria_oca/__manifest__.py b/sale_commission_product_criteria_oca/__manifest__.py index b642ea1ff..129cf7db1 100644 --- a/sale_commission_product_criteria_oca/__manifest__.py +++ b/sale_commission_product_criteria_oca/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Sale Commission Product Criteria", "summary": "Advanced commissions rules", - "version": "14.0.1.0.1", + "version": "14.0.1.0.2", "author": "Ilyas, Ooops404, Odoo Community Association (OCA)", "maintainers": ["ilyasProgrammer"], "website": "https://github.com/OCA/commission", diff --git a/sale_commission_product_criteria_oca/i18n/it.po b/sale_commission_product_criteria_oca/i18n/it.po index cb2e59cd4..68496f24e 100644 --- a/sale_commission_product_criteria_oca/i18n/it.po +++ b/sale_commission_product_criteria_oca/i18n/it.po @@ -289,7 +289,8 @@ msgstr "Importo percentuale" #: 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" +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 @@ -311,11 +312,6 @@ msgstr "" msgid "Price Type" msgstr "Tipo prezzo" -#. module: sale_commission_product_criteria -#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__pricelist_id -msgid "Pricelist" -msgstr "Listino prezzi" - #. 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 @@ -413,11 +409,6 @@ msgstr "" msgid "Type" msgstr "Tipo" -#. module: sale_commission_product_criteria -#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__use_pricelist -msgid "Use Pricelist" -msgstr "Usa listino prezzi" - #. module: sale_commission_product_criteria #: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__commission_value msgid "Value" @@ -428,3 +419,9 @@ msgstr "Valore" #, 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_oca/i18n/sale_commission_product_criteria.pot b/sale_commission_product_criteria_oca/i18n/sale_commission_product_criteria.pot index e1eaf62f7..707b4241b 100644 --- a/sale_commission_product_criteria_oca/i18n/sale_commission_product_criteria.pot +++ b/sale_commission_product_criteria_oca/i18n/sale_commission_product_criteria.pot @@ -304,11 +304,6 @@ msgstr "" msgid "Price Type" msgstr "" -#. module: sale_commission_product_criteria -#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__pricelist_id -msgid "Pricelist" -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 @@ -395,11 +390,6 @@ msgstr "" msgid "Type" msgstr "" -#. module: sale_commission_product_criteria -#: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__use_pricelist -msgid "Use Pricelist" -msgstr "" - #. module: sale_commission_product_criteria #: model:ir.model.fields,field_description:sale_commission_product_criteria.field_commission_item__commission_value msgid "Value" diff --git a/sale_commission_product_criteria_oca/models/commission.py b/sale_commission_product_criteria_oca/models/commission.py index 5f8dd9c71..b43e87979 100644 --- a/sale_commission_product_criteria_oca/models/commission.py +++ b/sale_commission_product_criteria_oca/models/commission.py @@ -73,8 +73,6 @@ class CommissionItem(models.Model): domain=[("commission_type", "=", "product")], required=True, ) - use_pricelist = fields.Boolean() - pricelist_id = fields.Many2one("product.pricelist") product_tmpl_id = fields.Many2one( "product.template", "Product", diff --git a/sale_commission_product_criteria_oca/views/views.xml b/sale_commission_product_criteria_oca/views/views.xml index e1ae96d44..a03d6e5ee 100644 --- a/sale_commission_product_criteria_oca/views/views.xml +++ b/sale_commission_product_criteria_oca/views/views.xml @@ -103,7 +103,6 @@ /> - - From 5d461bce791a3869af6b3aa21de9eedf2c2cdba3 Mon Sep 17 00:00:00 2001 From: Ilyas Date: Wed, 5 Jul 2023 11:03:58 +0200 Subject: [PATCH 04/17] [IMP] sale_commission_product_criteria: added commission items search fields --- sale_commission_product_criteria_oca/__manifest__.py | 2 +- sale_commission_product_criteria_oca/views/views.xml | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/sale_commission_product_criteria_oca/__manifest__.py b/sale_commission_product_criteria_oca/__manifest__.py index 129cf7db1..e2a22d705 100644 --- a/sale_commission_product_criteria_oca/__manifest__.py +++ b/sale_commission_product_criteria_oca/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Sale Commission Product Criteria", "summary": "Advanced commissions rules", - "version": "14.0.1.0.2", + "version": "14.0.1.0.3", "author": "Ilyas, Ooops404, Odoo Community Association (OCA)", "maintainers": ["ilyasProgrammer"], "website": "https://github.com/OCA/commission", diff --git a/sale_commission_product_criteria_oca/views/views.xml b/sale_commission_product_criteria_oca/views/views.xml index a03d6e5ee..b40929b20 100644 --- a/sale_commission_product_criteria_oca/views/views.xml +++ b/sale_commission_product_criteria_oca/views/views.xml @@ -184,6 +184,9 @@ + + + Date: Tue, 15 Aug 2023 10:18:20 +0200 Subject: [PATCH 05/17] [IMP] sale_commission_product_criteria: no need to order items by id --- sale_commission_product_criteria_oca/__manifest__.py | 2 +- .../models/sale_commission_line_mixin.py | 2 +- sale_commission_product_criteria_oca/views/views.xml | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/sale_commission_product_criteria_oca/__manifest__.py b/sale_commission_product_criteria_oca/__manifest__.py index e2a22d705..4ebf96322 100644 --- a/sale_commission_product_criteria_oca/__manifest__.py +++ b/sale_commission_product_criteria_oca/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Sale Commission Product Criteria", "summary": "Advanced commissions rules", - "version": "14.0.1.0.3", + "version": "14.0.1.1.0", "author": "Ilyas, Ooops404, Odoo Community Association (OCA)", "maintainers": ["ilyasProgrammer"], "website": "https://github.com/OCA/commission", diff --git a/sale_commission_product_criteria_oca/models/sale_commission_line_mixin.py b/sale_commission_product_criteria_oca/models/sale_commission_line_mixin.py index a7c43a1b6..5f97b5859 100644 --- a/sale_commission_product_criteria_oca/models/sale_commission_line_mixin.py +++ b/sale_commission_product_criteria_oca/models/sale_commission_line_mixin.py @@ -41,7 +41,7 @@ def _get_commission_items(self, commission, product): AND (item.commission_id = %s) AND (item.active = TRUE) ORDER BY - item.applied_on, categ.complete_name desc, item.id desc + item.applied_on, categ.complete_name desc """, ( product.product_tmpl_id.ids, diff --git a/sale_commission_product_criteria_oca/views/views.xml b/sale_commission_product_criteria_oca/views/views.xml index b40929b20..7f7673066 100644 --- a/sale_commission_product_criteria_oca/views/views.xml +++ b/sale_commission_product_criteria_oca/views/views.xml @@ -99,7 +99,6 @@ name="commission_id" invisible="context.get('hide_commission_id')" options="{'no_create': True, 'no_open': 1}" - domain="[('commission_type', '=', 'product')]" /> From e8d1504d84691d0ce890ca23ea8d3299ec0f07e9 Mon Sep 17 00:00:00 2001 From: Ilyas Date: Tue, 22 Aug 2023 16:24:30 +0700 Subject: [PATCH 06/17] [IMP] sale_commission_product_criteria: correct sorting in SQL --- .../README.rst | 15 ++++--- .../__manifest__.py | 2 +- .../models/sale_commission_line_mixin.py | 2 +- .../static/description/index.html | 40 ++++++++++--------- 4 files changed, 32 insertions(+), 27 deletions(-) diff --git a/sale_commission_product_criteria_oca/README.rst b/sale_commission_product_criteria_oca/README.rst index 74134b4b7..47d931f50 100644 --- a/sale_commission_product_criteria_oca/README.rst +++ b/sale_commission_product_criteria_oca/README.rst @@ -2,10 +2,13 @@ Sale Commission Product Criteria ================================ -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:97ee88194e36ff800080fd49f0c1f40de43dcc41d56865262c169f525125d960 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status @@ -19,11 +22,11 @@ Sale Commission Product Criteria .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png :target: https://translation.odoo-community.org/projects/commission-14-0/commission-14-0-sale_commission_product_criteria :alt: Translate me on Weblate -.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/165/14.0 - :alt: Try me on Runbot +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/commission&target_branch=14.0 + :alt: Try me on Runboat -|badge1| |badge2| |badge3| |badge4| |badge5| +|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. @@ -63,7 +66,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 smashing it by providing a detailed and welcomed +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. diff --git a/sale_commission_product_criteria_oca/__manifest__.py b/sale_commission_product_criteria_oca/__manifest__.py index 4ebf96322..4ba14d4f9 100644 --- a/sale_commission_product_criteria_oca/__manifest__.py +++ b/sale_commission_product_criteria_oca/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Sale Commission Product Criteria", "summary": "Advanced commissions rules", - "version": "14.0.1.1.0", + "version": "14.0.1.1.1", "author": "Ilyas, Ooops404, Odoo Community Association (OCA)", "maintainers": ["ilyasProgrammer"], "website": "https://github.com/OCA/commission", diff --git a/sale_commission_product_criteria_oca/models/sale_commission_line_mixin.py b/sale_commission_product_criteria_oca/models/sale_commission_line_mixin.py index 5f97b5859..cdea718f9 100644 --- a/sale_commission_product_criteria_oca/models/sale_commission_line_mixin.py +++ b/sale_commission_product_criteria_oca/models/sale_commission_line_mixin.py @@ -41,7 +41,7 @@ def _get_commission_items(self, commission, product): AND (item.commission_id = %s) AND (item.active = TRUE) ORDER BY - item.applied_on, categ.complete_name desc + item.applied_on, item.based_on, categ.complete_name desc """, ( product.product_tmpl_id.ids, diff --git a/sale_commission_product_criteria_oca/static/description/index.html b/sale_commission_product_criteria_oca/static/description/index.html index cd13b63a9..2c322c42e 100644 --- a/sale_commission_product_criteria_oca/static/description/index.html +++ b/sale_commission_product_criteria_oca/static/description/index.html @@ -1,20 +1,20 @@ - + - + Sale Commission Product Criteria -
-

Sale Commission Product Criteria

+
+

Sale Commission Product Criteria OCA

-

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

+

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” @@ -418,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.

@@ -441,6 +441,7 @@

Contributors

  • Simone Rubino <simone.rubino@aion-tech.it>
  • +
  • Akretion
  • @@ -454,7 +455,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_oca/tests/test_sale_commission_product_criteria.py b/sale_commission_product_criteria_oca/tests/test_sale_commission_product_criteria.py index b016128be..c7a40e024 100644 --- a/sale_commission_product_criteria_oca/tests/test_sale_commission_product_criteria.py +++ b/sale_commission_product_criteria_oca/tests/test_sale_commission_product_criteria.py @@ -4,13 +4,14 @@ from odoo.exceptions import ValidationError -from odoo.tests.common import Form, TransactionCase +from odoo.tests import Form, TransactionCase class TestSaleCommission(TransactionCase): @classmethod def setUpClass(cls): super().setUpClass() + cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True)) cls.commission_model = cls.env["commission"] cls.company = cls.env.ref("base.main_company") cls.res_partner_model = cls.env["res.partner"] @@ -37,19 +38,19 @@ def setUpClass(cls): [("type", "=", "purchase")], limit=1 ) cls.rules_commission_id = cls.env.ref( - "sale_commission_product_criteria.demo_commission_rules" + "sale_commission_product_criteria_oca.demo_commission_rules" ) cls.com_item_1 = cls.env.ref( - "sale_commission_product_criteria.demo_commission_rules_item_1" + "sale_commission_product_criteria_oca.demo_commission_rules_item_1" ) cls.com_item_2 = cls.env.ref( - "sale_commission_product_criteria.demo_commission_rules_item_2" + "sale_commission_product_criteria_oca.demo_commission_rules_item_2" ) cls.com_item_3 = cls.env.ref( - "sale_commission_product_criteria.demo_commission_rules_item_3" + "sale_commission_product_criteria_oca.demo_commission_rules_item_3" ) cls.com_item_4 = cls.env.ref( - "sale_commission_product_criteria.demo_commission_rules_item_4" + "sale_commission_product_criteria_oca.demo_commission_rules_item_4" ) def _create_sale_order(self, product, partner): @@ -178,7 +179,7 @@ def test_sale_commission_product_criteria_items(self): # no rule found self.env.ref( - "sale_commission_product_criteria.demo_commission_rules_item_1" + "sale_commission_product_criteria_oca.demo_commission_rules_item_1" ).unlink() so = self._create_sale_order(self.product_1, self.partner) so.order_line.agent_ids._compute_amount() diff --git a/sale_commission_product_criteria_oca/views/views.xml b/sale_commission_product_criteria_oca/views/views.xml index 2c3f2ad7c..d0f664f34 100644 --- a/sale_commission_product_criteria_oca/views/views.xml +++ b/sale_commission_product_criteria_oca/views/views.xml @@ -14,14 +14,17 @@ >sale.agent.order.inherit.form.sale_commission_product_criteria.mod
    sale.order - + @@ -31,18 +34,16 @@ commission.form.view.inherit commission - + - {'invisible': [('commission_type', '=', 'product')]} + commission_type == "product" - - + + - - + + @@ -66,7 +67,7 @@ sale.order.line.agent.mod sale.order.line.agent - + 1 @@ -108,23 +109,20 @@
    @@ -144,22 +142,18 @@ @@ -168,16 +162,16 @@ - commission.item.tree + commission.item.list commission.item - + - + @@ -203,27 +197,29 @@ + commission_item Commission Items ir.actions.act_window commission.item - tree,form + list,form {"hide_commission_id":1, 'search_default_group_by_commission': 1,} + commision_item Commission Items ir.actions.act_window commission.item - tree,form + list,form {"hide_commission_id":0, 'search_default_group_by_commission': 1,} @@ -232,7 +228,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" />