From 1152e1e296ceba5e91bd4bedca30faa030a1362d Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Fri, 12 Jun 2020 17:05:10 +0200 Subject: [PATCH 01/20] [ADD] sale_commission_salesman: Sales commissions from salesman This module extends the functionality of `sale_commission` to allow you to auto-populate salesmen as commission agents without setting explicitly them on the customer. **IMPORTANT**: The salesman will be only populated if no other commission agent is set via other method, to assure that there's no overlapping commissions. Configuration ============= * Go to *Contacts*. * Search for the contact linked to the salesman user and open it. * If it's actually linked to a user, you'll see a new check in the *Agent information* page, called "Convert salesman into agent". * Check it for having that salesman automatically populated as agent. You need to assign a commission to that agent as well. Usage ===== To use this module, you need to: * Go to *Sales > Orders > Quotations* and create a new one. * Fill the customer with one with no agents set. * Select a salesman with the mark checked. * Add a line in the quotation, and you will see the salesman populated as commission agent. --- sale_commission_salesman/README.rst | 106 + sale_commission_salesman/__init__.py | 3 + sale_commission_salesman/__manifest__.py | 19 + sale_commission_salesman/i18n/es.po | 56 + .../i18n/sale_commission_salesman.pot | 48 + sale_commission_salesman/models/__init__.py | 5 + .../models/account_invoice.py | 27 + .../models/res_partner.py | 23 + sale_commission_salesman/models/sale_order.py | 27 + sale_commission_salesman/readme/CONFIGURE.rst | 6 + .../readme/CONTRIBUTORS.rst | 3 + sale_commission_salesman/readme/CREDITS.rst | 1 + .../readme/DESCRIPTION.rst | 6 + sale_commission_salesman/readme/USAGE.rst | 7 + .../static/description/icon.png | Bin 0 -> 17671 bytes .../static/description/icon.svg | 2819 +++++++++++++++++ .../static/description/index.html | 457 +++ sale_commission_salesman/tests/__init__.py | 3 + .../tests/test_sale_commission_salesman.py | 108 + .../views/res_partner_views.xml | 17 + 20 files changed, 3741 insertions(+) create mode 100644 sale_commission_salesman/README.rst create mode 100644 sale_commission_salesman/__init__.py create mode 100644 sale_commission_salesman/__manifest__.py create mode 100644 sale_commission_salesman/i18n/es.po create mode 100644 sale_commission_salesman/i18n/sale_commission_salesman.pot create mode 100644 sale_commission_salesman/models/__init__.py create mode 100644 sale_commission_salesman/models/account_invoice.py create mode 100644 sale_commission_salesman/models/res_partner.py create mode 100644 sale_commission_salesman/models/sale_order.py create mode 100644 sale_commission_salesman/readme/CONFIGURE.rst create mode 100644 sale_commission_salesman/readme/CONTRIBUTORS.rst create mode 100644 sale_commission_salesman/readme/CREDITS.rst create mode 100644 sale_commission_salesman/readme/DESCRIPTION.rst create mode 100644 sale_commission_salesman/readme/USAGE.rst create mode 100644 sale_commission_salesman/static/description/icon.png create mode 100644 sale_commission_salesman/static/description/icon.svg create mode 100644 sale_commission_salesman/static/description/index.html create mode 100644 sale_commission_salesman/tests/__init__.py create mode 100644 sale_commission_salesman/tests/test_sale_commission_salesman.py create mode 100644 sale_commission_salesman/views/res_partner_views.xml diff --git a/sale_commission_salesman/README.rst b/sale_commission_salesman/README.rst new file mode 100644 index 000000000..bb2baa494 --- /dev/null +++ b/sale_commission_salesman/README.rst @@ -0,0 +1,106 @@ +=============================== +Sales commissions from salesman +=============================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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/11.0/sale_commission_salesman + :alt: OCA/commission +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/commission-11-0/commission-11-0-sale_commission_salesman + :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/11.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module extends the functionality of `sale_commission` to allow you to +auto-populate salesmen as commission agents without setting explicitly them +on the customer. + +**IMPORTANT**: The salesman will be only populated if no other commission agent +is set via other method, to assure that there's no overlapping commissions. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +#. Go to *Contacts*. +#. Search for the contact linked to the salesman user and open it. +#. If it's actually linked to a user, you'll see a new check in the + *Agent information* page, called "Convert salesman into agent". +#. Check it for having that salesman automatically populated as agent. You + need to assign a commission to that agent as well. + +Usage +===== + +To use this module, you need to: + +#. Go to *Sales > Orders > Quotations* and create a new one. +#. Fill the customer with one with no agents set. +#. Select a salesman with the mark checked. +#. Add a line in the quotation, and you will see the salesman populated as + commission agent. + +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 +~~~~~~~ + +* Tecnativa + +Contributors +~~~~~~~~~~~~ + +* `Tecnativa `__: + + * Pedro M. Baeza + +Other credits +~~~~~~~~~~~~~ + +- Part of the icon made from Icon Fonts is licensed by CC BY 3.0 + +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. + +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_salesman/__init__.py b/sale_commission_salesman/__init__.py new file mode 100644 index 000000000..31660d6a9 --- /dev/null +++ b/sale_commission_salesman/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import models diff --git a/sale_commission_salesman/__manifest__.py b/sale_commission_salesman/__manifest__.py new file mode 100644 index 000000000..8f5bb7ddf --- /dev/null +++ b/sale_commission_salesman/__manifest__.py @@ -0,0 +1,19 @@ +# Copyright 2020 Tecnativa - Pedro M. Baeza +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Sales commissions from salesman", + "version": "11.0.1.0.0", + "author": "Tecnativa, " + "Odoo Community Association (OCA)", + "category": "Sales", + "website": "https://github.com/OCA/commission", + "license": "AGPL-3", + "depends": [ + "sale_commission", + ], + "data": [ + "views/res_partner_views.xml", + ], + "installable": True, +} diff --git a/sale_commission_salesman/i18n/es.po b/sale_commission_salesman/i18n/es.po new file mode 100644 index 000000000..a56c54aad --- /dev/null +++ b/sale_commission_salesman/i18n/es.po @@ -0,0 +1,56 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_commission_salesman +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-06-12 14:51+0000\n" +"PO-Revision-Date: 2020-06-12 16:55+0200\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: \n" +"X-Generator: Poedit 2.3\n" + +#. module: sale_commission_salesman +#: model:ir.model,name:sale_commission_salesman.model_res_partner +msgid "Contact" +msgstr "Contacto" + +#. module: sale_commission_salesman +#: model:ir.model.fields,field_description:sale_commission_salesman.field_res_partner_salesman_as_agent +#: model:ir.model.fields,field_description:sale_commission_salesman.field_res_users_salesman_as_agent +msgid "Convert salesman into agent" +msgstr "Convertir comercial a agente" + +#. module: sale_commission_salesman +#: model:ir.model.fields,help:sale_commission_salesman.field_res_partner_salesman_as_agent +#: model:ir.model.fields,help:sale_commission_salesman.field_res_users_salesman_as_agent +msgid "" +"If the user linked to this partner is put as salesman and no other " +"commission rule is triggered, this agent will be added as the commission " +"agent" +msgstr "" +"Si el usuario enlazado con este contacto se coloca como comercial y no hay " +"otra regla de comisión, este agente se añadirá como comisionista" + +#. module: sale_commission_salesman +#: model:ir.model,name:sale_commission_salesman.model_account_invoice_line +msgid "Invoice Line" +msgstr "Linea de la Factura" + +#. module: sale_commission_salesman +#: model:ir.model,name:sale_commission_salesman.model_sale_order_line +msgid "Sales Order Line" +msgstr "Línea de pedido de ventas" + +#. module: sale_commission_salesman +#: code:addons/sale_commission_salesman/models/res_partner.py:21 +#, python-format +msgid "You can't have a salesman auto-agent without commission." +msgstr "No puede tener un comercial auto-agente sin comisión definida." diff --git a/sale_commission_salesman/i18n/sale_commission_salesman.pot b/sale_commission_salesman/i18n/sale_commission_salesman.pot new file mode 100644 index 000000000..b99729ebd --- /dev/null +++ b/sale_commission_salesman/i18n/sale_commission_salesman.pot @@ -0,0 +1,48 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_commission_salesman +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.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_salesman +#: model:ir.model,name:sale_commission_salesman.model_res_partner +msgid "Contact" +msgstr "" + +#. module: sale_commission_salesman +#: model:ir.model.fields,field_description:sale_commission_salesman.field_res_partner_salesman_as_agent +#: model:ir.model.fields,field_description:sale_commission_salesman.field_res_users_salesman_as_agent +msgid "Convert salesman into agent" +msgstr "" + +#. module: sale_commission_salesman +#: model:ir.model.fields,help:sale_commission_salesman.field_res_partner_salesman_as_agent +#: model:ir.model.fields,help:sale_commission_salesman.field_res_users_salesman_as_agent +msgid "If the user linked to this partner is put as salesman and no other commission rule is triggered, this agent will be added as the commission agent" +msgstr "" + +#. module: sale_commission_salesman +#: model:ir.model,name:sale_commission_salesman.model_account_invoice_line +msgid "Invoice Line" +msgstr "" + +#. module: sale_commission_salesman +#: model:ir.model,name:sale_commission_salesman.model_sale_order_line +msgid "Sales Order Line" +msgstr "" + +#. module: sale_commission_salesman +#: code:addons/sale_commission_salesman/models/res_partner.py:21 +#, python-format +msgid "You can't have a salesman auto-agent without commission." +msgstr "" + diff --git a/sale_commission_salesman/models/__init__.py b/sale_commission_salesman/models/__init__.py new file mode 100644 index 000000000..9582ff43d --- /dev/null +++ b/sale_commission_salesman/models/__init__.py @@ -0,0 +1,5 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import account_invoice +from . import res_partner +from . import sale_order diff --git a/sale_commission_salesman/models/account_invoice.py b/sale_commission_salesman/models/account_invoice.py new file mode 100644 index 000000000..b0c687065 --- /dev/null +++ b/sale_commission_salesman/models/account_invoice.py @@ -0,0 +1,27 @@ +# Copyright 2020 Tecnativa - Pedro M. Baeza +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import models + + +class AccountInvoiceLine(models.Model): + _inherit = 'account.invoice.line' + + def _prepare_agents_vals(self, vals=None): + """Add salesman agent if configured so and no other commission + already populated. + """ + res = super()._prepare_agents_vals(vals=vals) + if not res: + partner = self.invoice_id.user_id.partner_id + if not self and vals.get("invoice_id"): + invoice = self.env["account.invoice"].browse(vals["invoice_id"]) + partner = invoice.user_id.partner_id + if partner.agent and partner.salesman_as_agent: + res = [ + (0, 0, { + 'agent': partner.id, + 'commission': partner.commission.id, + }), + ] + return res diff --git a/sale_commission_salesman/models/res_partner.py b/sale_commission_salesman/models/res_partner.py new file mode 100644 index 000000000..c76092d0e --- /dev/null +++ b/sale_commission_salesman/models/res_partner.py @@ -0,0 +1,23 @@ +# Copyright 2020 Tecnativa - Pedro M. Baeza +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import _, api, exceptions, fields, models + + +class ResPartner(models.Model): + _inherit = "res.partner" + + salesman_as_agent = fields.Boolean( + string="Convert salesman into agent", + help="If the user linked to this partner is put as salesman and no " + "other commission rule is triggered, this agent will be " + "added as the commission agent", + ) + + @api.constrains("salesman_as_agent", "commission") + def _check_salesman_as_agent(self): + for record in self: + if record.salesman_as_agent and not record.commission: + raise exceptions.ValidationError(_( + "You can't have a salesman auto-agent without commission." + )) diff --git a/sale_commission_salesman/models/sale_order.py b/sale_commission_salesman/models/sale_order.py new file mode 100644 index 000000000..4abc32ad9 --- /dev/null +++ b/sale_commission_salesman/models/sale_order.py @@ -0,0 +1,27 @@ +# Copyright 2020 Tecnativa - Pedro M. Baeza +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import models + + +class SaleOrdeLine(models.Model): + _inherit = 'sale.order.line' + + def _prepare_agents_vals(self, vals=None): + """Add salesman agent if configured so and no other commission + already populated. + """ + res = super()._prepare_agents_vals(vals=vals) + if not res: + partner = self.order_id.user_id.partner_id + if not self and vals.get("order_id"): + order = self.env["sale.order"].browse(vals["order_id"]) + partner = order.user_id.partner_id + if partner.agent and partner.salesman_as_agent: + res = [ + (0, 0, { + 'agent': partner.id, + 'commission': partner.commission.id, + }), + ] + return res diff --git a/sale_commission_salesman/readme/CONFIGURE.rst b/sale_commission_salesman/readme/CONFIGURE.rst new file mode 100644 index 000000000..dac00b397 --- /dev/null +++ b/sale_commission_salesman/readme/CONFIGURE.rst @@ -0,0 +1,6 @@ +#. Go to *Contacts*. +#. Search for the contact linked to the salesman user and open it. +#. If it's actually linked to a user, you'll see a new check in the + *Agent information* page, called "Convert salesman into agent". +#. Check it for having that salesman automatically populated as agent. You + need to assign a commission to that agent as well. diff --git a/sale_commission_salesman/readme/CONTRIBUTORS.rst b/sale_commission_salesman/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..2b13251be --- /dev/null +++ b/sale_commission_salesman/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ +* `Tecnativa `__: + + * Pedro M. Baeza diff --git a/sale_commission_salesman/readme/CREDITS.rst b/sale_commission_salesman/readme/CREDITS.rst new file mode 100644 index 000000000..4a895093c --- /dev/null +++ b/sale_commission_salesman/readme/CREDITS.rst @@ -0,0 +1 @@ +- Part of the icon made from Icon Fonts is licensed by CC BY 3.0 diff --git a/sale_commission_salesman/readme/DESCRIPTION.rst b/sale_commission_salesman/readme/DESCRIPTION.rst new file mode 100644 index 000000000..602dda7ec --- /dev/null +++ b/sale_commission_salesman/readme/DESCRIPTION.rst @@ -0,0 +1,6 @@ +This module extends the functionality of `sale_commission` to allow you to +auto-populate salesmen as commission agents without setting explicitly them +on the customer. + +**IMPORTANT**: The salesman will be only populated if no other commission agent +is set via other method, to assure that there's no overlapping commissions. diff --git a/sale_commission_salesman/readme/USAGE.rst b/sale_commission_salesman/readme/USAGE.rst new file mode 100644 index 000000000..04205310b --- /dev/null +++ b/sale_commission_salesman/readme/USAGE.rst @@ -0,0 +1,7 @@ +To use this module, you need to: + +#. Go to *Sales > Orders > Quotations* and create a new one. +#. Fill the customer with one with no agents set. +#. Select a salesman with the mark checked. +#. Add a line in the quotation, and you will see the salesman populated as + commission agent. diff --git a/sale_commission_salesman/static/description/icon.png b/sale_commission_salesman/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7ce73f84986909d76a2189c08edbbd3583680187 GIT binary patch literal 17671 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Openclipart + + + Pile of Golden Coins + 2010-04-09T03:27:45 + A pile of hypothetical golden coins, drawn in Inkscape. + https://openclipart.org/detail/43969/pile-of-golden-coins-by-j_alves + + + J_Alves + + + + + coin + currency + gold + money + thaler + + + + + + + + + + + diff --git a/sale_commission_salesman/static/description/index.html b/sale_commission_salesman/static/description/index.html new file mode 100644 index 000000000..1800fb0db --- /dev/null +++ b/sale_commission_salesman/static/description/index.html @@ -0,0 +1,457 @@ + + + + + + +Sales commissions from salesman + + + +
+

Sales commissions from salesman

+ + +

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

+

This module extends the functionality of sale_commission to allow you to +auto-populate salesmen as commission agents without setting explicitly them +on the customer.

+

IMPORTANT: The salesman will be only populated if no other commission agent +is set via other method, to assure that there’s no overlapping commissions.

+

Table of contents

+ +
+

Configuration

+
    +
  1. Go to Contacts.
  2. +
  3. Search for the contact linked to the salesman user and open it.
  4. +
  5. If it’s actually linked to a user, you’ll see a new check in the +Agent information page, called “Convert salesman into agent”.
  6. +
  7. Check it for having that salesman automatically populated as agent. You +need to assign a commission to that agent as well.
  8. +
+
+
+

Usage

+

To use this module, you need to:

+
    +
  1. Go to Sales > Orders > Quotations and create a new one.
  2. +
  3. Fill the customer with one with no agents set.
  4. +
  5. Select a salesman with the mark checked.
  6. +
  7. Add a line in the quotation, and you will see the salesman populated as +commission agent.
  8. +
+
+
+

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

+
    +
  • Tecnativa
  • +
+
+
+

Contributors

+ +
+
+

Other credits

+ +
+
+

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.

+

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_salesman/tests/__init__.py b/sale_commission_salesman/tests/__init__.py new file mode 100644 index 000000000..673e9d887 --- /dev/null +++ b/sale_commission_salesman/tests/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import test_sale_commission_salesman diff --git a/sale_commission_salesman/tests/test_sale_commission_salesman.py b/sale_commission_salesman/tests/test_sale_commission_salesman.py new file mode 100644 index 000000000..fa718f12a --- /dev/null +++ b/sale_commission_salesman/tests/test_sale_commission_salesman.py @@ -0,0 +1,108 @@ +# Copyright 2020 Tecnativa - Pedro M. Baeza +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import exceptions +from odoo.tests.common import SavepointCase + + +class TestSaleCommissionSalesman(SavepointCase): + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.product = cls.env['product.product'].create({ + 'name': 'Test Product 1', + 'list_price': 100, + }) + SaleCommission = cls.env['sale.commission'] + cls.commission_1 = SaleCommission.create({ + 'name': '1% commission', + 'fix_qty': 1.0, + }) + Partner = cls.env['res.partner'] + cls.salesman = cls.env["res.users"].create({ + "name": "Test agent", + "login": "sale_comission_salesman_test", + }) + cls.agent = cls.salesman.partner_id + cls.agent.write({ + "agent": True, + "salesman_as_agent": True, + 'commission': cls.commission_1.id, + }) + cls.other_agent = Partner.create({ + 'name': 'Test other agent', + 'agent': True, + 'commission': cls.commission_1.id, + }) + cls.partner = Partner.create({ + 'name': 'Partner test', + }) + cls.sale_order = cls.env['sale.order'].create({ + 'partner_id': cls.partner.id, + 'user_id': cls.salesman.id, + }) + cls.invoice = cls.env['account.invoice'].create({ + 'partner_id': cls.partner.id, + 'user_id': cls.salesman.id, + }) + + def test_check_salesman_commission(self): + with self.assertRaises(exceptions.ValidationError): + self.agent.commission = False + + def test_sale_commission_salesman(self): + line = self.env['sale.order.line'].with_context( + partner_id=self.partner.id + ).create({ + 'order_id': self.sale_order.id, + 'product_id': self.product.id, + }) + self.assertTrue(line.agents) + self.assertTrue(line.agents.agent, self.agent) + self.assertTrue(line.agents.commission, self.commission_1) + + def test_sale_commission_salesman_no_population(self): + self.partner.agents = [(4, self.other_agent.id)] + line = self.env['sale.order.line'].with_context( + partner_id=self.partner.id + ).create({ + 'order_id': self.sale_order.id, + 'product_id': self.product.id, + }) + self.assertTrue(len(line.agents), 1) + self.assertTrue(line.agents.agent, self.other_agent) + + def test_invoice_commission_salesman(self): + line_obj = self.env['account.invoice.line'] + line = line_obj.with_context( + partner_id=self.partner.id + ).create({ + 'invoice_id': self.invoice.id, + 'product_id': self.product.id, + 'account_id': line_obj.get_invoice_line_account( + self.invoice.type, self.product, False, + self.invoice.company_id).id, + 'name': self.product.name, + 'price_unit': 1, + }) + self.assertTrue(line.agents) + self.assertTrue(line.agents.agent, self.agent) + self.assertTrue(line.agents.commission, self.commission_1) + + def test_invoice_commission_salesman_no_population(self): + self.partner.agents = [(4, self.other_agent.id)] + line_obj = self.env['account.invoice.line'] + line = line_obj.with_context( + partner_id=self.partner.id + ).create({ + 'invoice_id': self.invoice.id, + 'product_id': self.product.id, + 'account_id': line_obj.get_invoice_line_account( + self.invoice.type, self.product, False, + self.invoice.company_id).id, + 'name': self.product.name, + 'price_unit': 1, + }) + self.assertTrue(len(line.agents), 1) + self.assertTrue(line.agents.agent, self.other_agent) diff --git a/sale_commission_salesman/views/res_partner_views.xml b/sale_commission_salesman/views/res_partner_views.xml new file mode 100644 index 000000000..1477f25f7 --- /dev/null +++ b/sale_commission_salesman/views/res_partner_views.xml @@ -0,0 +1,17 @@ + + + + + + res.partner + + + + + + + + + + From 55d7c2e7473e06b83329a1dda495f1c97e75f7b7 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Mon, 27 Jul 2020 20:36:12 +0200 Subject: [PATCH 02/20] [MIG] sale_commission_salesman: Migration to 12.0 - Standard procedure. --- sale_commission_salesman/README.rst | 10 +++++----- sale_commission_salesman/__manifest__.py | 2 +- .../i18n/sale_commission_salesman.pot | 10 +++++----- sale_commission_salesman/static/description/index.html | 6 +++--- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/sale_commission_salesman/README.rst b/sale_commission_salesman/README.rst index bb2baa494..49593c5b1 100644 --- a/sale_commission_salesman/README.rst +++ b/sale_commission_salesman/README.rst @@ -14,13 +14,13 @@ Sales commissions from salesman :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/11.0/sale_commission_salesman + :target: https://github.com/OCA/commission/tree/12.0/sale_commission_salesman :alt: OCA/commission .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/commission-11-0/commission-11-0-sale_commission_salesman + :target: https://translation.odoo-community.org/projects/commission-12-0/commission-12-0-sale_commission_salesman :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/11.0 + :target: https://runbot.odoo-community.org/runbot/165/12.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -64,7 +64,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 -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -101,6 +101,6 @@ 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. -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_salesman/__manifest__.py b/sale_commission_salesman/__manifest__.py index 8f5bb7ddf..f4f0c62ae 100644 --- a/sale_commission_salesman/__manifest__.py +++ b/sale_commission_salesman/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Sales commissions from salesman", - "version": "11.0.1.0.0", + "version": "12.0.1.0.0", "author": "Tecnativa, " "Odoo Community Association (OCA)", "category": "Sales", diff --git a/sale_commission_salesman/i18n/sale_commission_salesman.pot b/sale_commission_salesman/i18n/sale_commission_salesman.pot index b99729ebd..15fb8abf2 100644 --- a/sale_commission_salesman/i18n/sale_commission_salesman.pot +++ b/sale_commission_salesman/i18n/sale_commission_salesman.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 11.0\n" +"Project-Id-Version: Odoo Server 12.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: <>\n" "Language-Team: \n" @@ -19,14 +19,14 @@ msgid "Contact" msgstr "" #. module: sale_commission_salesman -#: model:ir.model.fields,field_description:sale_commission_salesman.field_res_partner_salesman_as_agent -#: model:ir.model.fields,field_description:sale_commission_salesman.field_res_users_salesman_as_agent +#: model:ir.model.fields,field_description:sale_commission_salesman.field_res_partner__salesman_as_agent +#: model:ir.model.fields,field_description:sale_commission_salesman.field_res_users__salesman_as_agent msgid "Convert salesman into agent" msgstr "" #. module: sale_commission_salesman -#: model:ir.model.fields,help:sale_commission_salesman.field_res_partner_salesman_as_agent -#: model:ir.model.fields,help:sale_commission_salesman.field_res_users_salesman_as_agent +#: model:ir.model.fields,help:sale_commission_salesman.field_res_partner__salesman_as_agent +#: model:ir.model.fields,help:sale_commission_salesman.field_res_users__salesman_as_agent msgid "If the user linked to this partner is put as salesman and no other commission rule is triggered, this agent will be added as the commission agent" msgstr "" diff --git a/sale_commission_salesman/static/description/index.html b/sale_commission_salesman/static/description/index.html index 1800fb0db..19a4fe370 100644 --- a/sale_commission_salesman/static/description/index.html +++ b/sale_commission_salesman/static/description/index.html @@ -367,7 +367,7 @@

Sales commissions from salesman

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

+

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

This module extends the functionality of sale_commission to allow you to auto-populate salesmen as commission agents without setting explicitly them on the customer.

@@ -415,7 +415,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 -feedback.

+feedback.

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

@@ -448,7 +448,7 @@

Maintainers

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.

-

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.

From 6bb049f491eb811ed1c69c76d051f5a7cdccbb94 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Fri, 7 Aug 2020 19:09:54 +0200 Subject: [PATCH 03/20] [IMP] sale_commission_salesman: black, isort, prettier --- sale_commission_salesman/__manifest__.py | 11 +- .../models/account_invoice.py | 7 +- .../models/res_partner.py | 10 +- sale_commission_salesman/models/sale_order.py | 7 +- .../tests/test_sale_commission_salesman.py | 138 +++++++++--------- .../views/res_partner_views.xml | 13 +- 6 files changed, 85 insertions(+), 101 deletions(-) diff --git a/sale_commission_salesman/__manifest__.py b/sale_commission_salesman/__manifest__.py index f4f0c62ae..29d54726a 100644 --- a/sale_commission_salesman/__manifest__.py +++ b/sale_commission_salesman/__manifest__.py @@ -4,16 +4,11 @@ { "name": "Sales commissions from salesman", "version": "12.0.1.0.0", - "author": "Tecnativa, " - "Odoo Community Association (OCA)", + "author": "Tecnativa, " "Odoo Community Association (OCA)", "category": "Sales", "website": "https://github.com/OCA/commission", "license": "AGPL-3", - "depends": [ - "sale_commission", - ], - "data": [ - "views/res_partner_views.xml", - ], + "depends": ["sale_commission",], + "data": ["views/res_partner_views.xml",], "installable": True, } diff --git a/sale_commission_salesman/models/account_invoice.py b/sale_commission_salesman/models/account_invoice.py index b0c687065..164cc4048 100644 --- a/sale_commission_salesman/models/account_invoice.py +++ b/sale_commission_salesman/models/account_invoice.py @@ -5,7 +5,7 @@ class AccountInvoiceLine(models.Model): - _inherit = 'account.invoice.line' + _inherit = "account.invoice.line" def _prepare_agents_vals(self, vals=None): """Add salesman agent if configured so and no other commission @@ -19,9 +19,6 @@ def _prepare_agents_vals(self, vals=None): partner = invoice.user_id.partner_id if partner.agent and partner.salesman_as_agent: res = [ - (0, 0, { - 'agent': partner.id, - 'commission': partner.commission.id, - }), + (0, 0, {"agent": partner.id, "commission": partner.commission.id,}), ] return res diff --git a/sale_commission_salesman/models/res_partner.py b/sale_commission_salesman/models/res_partner.py index c76092d0e..2ba9a9a3d 100644 --- a/sale_commission_salesman/models/res_partner.py +++ b/sale_commission_salesman/models/res_partner.py @@ -10,14 +10,14 @@ class ResPartner(models.Model): salesman_as_agent = fields.Boolean( string="Convert salesman into agent", help="If the user linked to this partner is put as salesman and no " - "other commission rule is triggered, this agent will be " - "added as the commission agent", + "other commission rule is triggered, this agent will be " + "added as the commission agent", ) @api.constrains("salesman_as_agent", "commission") def _check_salesman_as_agent(self): for record in self: if record.salesman_as_agent and not record.commission: - raise exceptions.ValidationError(_( - "You can't have a salesman auto-agent without commission." - )) + raise exceptions.ValidationError( + _("You can't have a salesman auto-agent without commission.") + ) diff --git a/sale_commission_salesman/models/sale_order.py b/sale_commission_salesman/models/sale_order.py index 4abc32ad9..74bd6b776 100644 --- a/sale_commission_salesman/models/sale_order.py +++ b/sale_commission_salesman/models/sale_order.py @@ -5,7 +5,7 @@ class SaleOrdeLine(models.Model): - _inherit = 'sale.order.line' + _inherit = "sale.order.line" def _prepare_agents_vals(self, vals=None): """Add salesman agent if configured so and no other commission @@ -19,9 +19,6 @@ def _prepare_agents_vals(self, vals=None): partner = order.user_id.partner_id if partner.agent and partner.salesman_as_agent: res = [ - (0, 0, { - 'agent': partner.id, - 'commission': partner.commission.id, - }), + (0, 0, {"agent": partner.id, "commission": partner.commission.id,}), ] return res diff --git a/sale_commission_salesman/tests/test_sale_commission_salesman.py b/sale_commission_salesman/tests/test_sale_commission_salesman.py index fa718f12a..073e62160 100644 --- a/sale_commission_salesman/tests/test_sale_commission_salesman.py +++ b/sale_commission_salesman/tests/test_sale_commission_salesman.py @@ -6,103 +6,97 @@ class TestSaleCommissionSalesman(SavepointCase): - @classmethod def setUpClass(cls): super().setUpClass() - cls.product = cls.env['product.product'].create({ - 'name': 'Test Product 1', - 'list_price': 100, - }) - SaleCommission = cls.env['sale.commission'] - cls.commission_1 = SaleCommission.create({ - 'name': '1% commission', - 'fix_qty': 1.0, - }) - Partner = cls.env['res.partner'] - cls.salesman = cls.env["res.users"].create({ - "name": "Test agent", - "login": "sale_comission_salesman_test", - }) + cls.product = cls.env["product.product"].create( + {"name": "Test Product 1", "list_price": 100,} + ) + SaleCommission = cls.env["sale.commission"] + cls.commission_1 = SaleCommission.create( + {"name": "1% commission", "fix_qty": 1.0,} + ) + Partner = cls.env["res.partner"] + cls.salesman = cls.env["res.users"].create( + {"name": "Test agent", "login": "sale_comission_salesman_test",} + ) cls.agent = cls.salesman.partner_id - cls.agent.write({ - "agent": True, - "salesman_as_agent": True, - 'commission': cls.commission_1.id, - }) - cls.other_agent = Partner.create({ - 'name': 'Test other agent', - 'agent': True, - 'commission': cls.commission_1.id, - }) - cls.partner = Partner.create({ - 'name': 'Partner test', - }) - cls.sale_order = cls.env['sale.order'].create({ - 'partner_id': cls.partner.id, - 'user_id': cls.salesman.id, - }) - cls.invoice = cls.env['account.invoice'].create({ - 'partner_id': cls.partner.id, - 'user_id': cls.salesman.id, - }) + cls.agent.write( + { + "agent": True, + "salesman_as_agent": True, + "commission": cls.commission_1.id, + } + ) + cls.other_agent = Partner.create( + { + "name": "Test other agent", + "agent": True, + "commission": cls.commission_1.id, + } + ) + cls.partner = Partner.create({"name": "Partner test",}) + cls.sale_order = cls.env["sale.order"].create( + {"partner_id": cls.partner.id, "user_id": cls.salesman.id,} + ) + cls.invoice = cls.env["account.invoice"].create( + {"partner_id": cls.partner.id, "user_id": cls.salesman.id,} + ) def test_check_salesman_commission(self): with self.assertRaises(exceptions.ValidationError): self.agent.commission = False def test_sale_commission_salesman(self): - line = self.env['sale.order.line'].with_context( - partner_id=self.partner.id - ).create({ - 'order_id': self.sale_order.id, - 'product_id': self.product.id, - }) + line = ( + self.env["sale.order.line"] + .with_context(partner_id=self.partner.id) + .create({"order_id": self.sale_order.id, "product_id": self.product.id,}) + ) self.assertTrue(line.agents) self.assertTrue(line.agents.agent, self.agent) self.assertTrue(line.agents.commission, self.commission_1) def test_sale_commission_salesman_no_population(self): self.partner.agents = [(4, self.other_agent.id)] - line = self.env['sale.order.line'].with_context( - partner_id=self.partner.id - ).create({ - 'order_id': self.sale_order.id, - 'product_id': self.product.id, - }) + line = ( + self.env["sale.order.line"] + .with_context(partner_id=self.partner.id) + .create({"order_id": self.sale_order.id, "product_id": self.product.id,}) + ) self.assertTrue(len(line.agents), 1) self.assertTrue(line.agents.agent, self.other_agent) def test_invoice_commission_salesman(self): - line_obj = self.env['account.invoice.line'] - line = line_obj.with_context( - partner_id=self.partner.id - ).create({ - 'invoice_id': self.invoice.id, - 'product_id': self.product.id, - 'account_id': line_obj.get_invoice_line_account( - self.invoice.type, self.product, False, - self.invoice.company_id).id, - 'name': self.product.name, - 'price_unit': 1, - }) + line_obj = self.env["account.invoice.line"] + line = line_obj.with_context(partner_id=self.partner.id).create( + { + "invoice_id": self.invoice.id, + "product_id": self.product.id, + "account_id": line_obj.get_invoice_line_account( + self.invoice.type, self.product, False, self.invoice.company_id + ).id, + "name": self.product.name, + "price_unit": 1, + } + ) self.assertTrue(line.agents) self.assertTrue(line.agents.agent, self.agent) self.assertTrue(line.agents.commission, self.commission_1) def test_invoice_commission_salesman_no_population(self): self.partner.agents = [(4, self.other_agent.id)] - line_obj = self.env['account.invoice.line'] - line = line_obj.with_context( - partner_id=self.partner.id - ).create({ - 'invoice_id': self.invoice.id, - 'product_id': self.product.id, - 'account_id': line_obj.get_invoice_line_account( - self.invoice.type, self.product, False, - self.invoice.company_id).id, - 'name': self.product.name, - 'price_unit': 1, - }) + line_obj = self.env["account.invoice.line"] + line = line_obj.with_context(partner_id=self.partner.id).create( + { + "invoice_id": self.invoice.id, + "product_id": self.product.id, + "account_id": line_obj.get_invoice_line_account( + self.invoice.type, self.product, False, self.invoice.company_id + ).id, + "name": self.product.name, + "price_unit": 1, + } + ) self.assertTrue(len(line.agents), 1) self.assertTrue(line.agents.agent, self.other_agent) diff --git a/sale_commission_salesman/views/res_partner_views.xml b/sale_commission_salesman/views/res_partner_views.xml index 1477f25f7..719563ca2 100644 --- a/sale_commission_salesman/views/res_partner_views.xml +++ b/sale_commission_salesman/views/res_partner_views.xml @@ -1,17 +1,18 @@ - + - res.partner - + - - + + - From 51b7969c1f7e84df53cef5cd0f118151eca1d06a Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Fri, 7 Aug 2020 20:09:43 +0200 Subject: [PATCH 04/20] [MIG] sale_commission_salesman: Migration to 13.0 * Standard procedure * Adapt account.invoice > account.move * Adapt tests --- sale_commission_salesman/README.rst | 10 +- sale_commission_salesman/__manifest__.py | 6 +- sale_commission_salesman/i18n/es.po | 19 ++-- .../i18n/sale_commission_salesman.pot | 18 ++-- sale_commission_salesman/models/__init__.py | 2 +- .../models/account_invoice.py | 24 ----- .../models/account_move.py | 23 +++++ .../models/res_partner.py | 4 +- sale_commission_salesman/models/sale_order.py | 16 +--- .../static/description/index.html | 6 +- .../tests/test_sale_commission_salesman.py | 96 ++++++++----------- .../views/res_partner_views.xml | 2 +- 12 files changed, 105 insertions(+), 121 deletions(-) delete mode 100644 sale_commission_salesman/models/account_invoice.py create mode 100644 sale_commission_salesman/models/account_move.py diff --git a/sale_commission_salesman/README.rst b/sale_commission_salesman/README.rst index 49593c5b1..e0af1ac39 100644 --- a/sale_commission_salesman/README.rst +++ b/sale_commission_salesman/README.rst @@ -14,13 +14,13 @@ Sales commissions from salesman :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/12.0/sale_commission_salesman + :target: https://github.com/OCA/commission/tree/13.0/sale_commission_salesman :alt: OCA/commission .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/commission-12-0/commission-12-0-sale_commission_salesman + :target: https://translation.odoo-community.org/projects/commission-13-0/commission-13-0-sale_commission_salesman :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/12.0 + :target: https://runbot.odoo-community.org/runbot/165/13.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -64,7 +64,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 -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -101,6 +101,6 @@ 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. -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_salesman/__manifest__.py b/sale_commission_salesman/__manifest__.py index 29d54726a..b9ea9acaa 100644 --- a/sale_commission_salesman/__manifest__.py +++ b/sale_commission_salesman/__manifest__.py @@ -3,12 +3,12 @@ { "name": "Sales commissions from salesman", - "version": "12.0.1.0.0", + "version": "13.0.1.0.0", "author": "Tecnativa, " "Odoo Community Association (OCA)", "category": "Sales", "website": "https://github.com/OCA/commission", "license": "AGPL-3", - "depends": ["sale_commission",], - "data": ["views/res_partner_views.xml",], + "depends": ["sale_commission"], + "data": ["views/res_partner_views.xml"], "installable": True, } diff --git a/sale_commission_salesman/i18n/es.po b/sale_commission_salesman/i18n/es.po index a56c54aad..2c2c21923 100644 --- a/sale_commission_salesman/i18n/es.po +++ b/sale_commission_salesman/i18n/es.po @@ -23,14 +23,14 @@ msgid "Contact" msgstr "Contacto" #. module: sale_commission_salesman -#: model:ir.model.fields,field_description:sale_commission_salesman.field_res_partner_salesman_as_agent -#: model:ir.model.fields,field_description:sale_commission_salesman.field_res_users_salesman_as_agent +#: model:ir.model.fields,field_description:sale_commission_salesman.field_res_partner__salesman_as_agent +#: model:ir.model.fields,field_description:sale_commission_salesman.field_res_users__salesman_as_agent msgid "Convert salesman into agent" msgstr "Convertir comercial a agente" #. module: sale_commission_salesman -#: model:ir.model.fields,help:sale_commission_salesman.field_res_partner_salesman_as_agent -#: model:ir.model.fields,help:sale_commission_salesman.field_res_users_salesman_as_agent +#: model:ir.model.fields,help:sale_commission_salesman.field_res_partner__salesman_as_agent +#: model:ir.model.fields,help:sale_commission_salesman.field_res_users__salesman_as_agent msgid "" "If the user linked to this partner is put as salesman and no other " "commission rule is triggered, this agent will be added as the commission " @@ -40,9 +40,9 @@ msgstr "" "otra regla de comisión, este agente se añadirá como comisionista" #. module: sale_commission_salesman -#: model:ir.model,name:sale_commission_salesman.model_account_invoice_line -msgid "Invoice Line" -msgstr "Linea de la Factura" +#: model:ir.model,name:sale_commission_salesman.model_account_move_line +msgid "Journal Item" +msgstr "" #. module: sale_commission_salesman #: model:ir.model,name:sale_commission_salesman.model_sale_order_line @@ -50,7 +50,10 @@ msgid "Sales Order Line" msgstr "Línea de pedido de ventas" #. module: sale_commission_salesman -#: code:addons/sale_commission_salesman/models/res_partner.py:21 +#: code:addons/sale_commission_salesman/models/res_partner.py:0 #, python-format msgid "You can't have a salesman auto-agent without commission." msgstr "No puede tener un comercial auto-agente sin comisión definida." + +#~ msgid "Invoice Line" +#~ msgstr "Linea de la Factura" diff --git a/sale_commission_salesman/i18n/sale_commission_salesman.pot b/sale_commission_salesman/i18n/sale_commission_salesman.pot index 15fb8abf2..2a4bb22e6 100644 --- a/sale_commission_salesman/i18n/sale_commission_salesman.pot +++ b/sale_commission_salesman/i18n/sale_commission_salesman.pot @@ -1,12 +1,12 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * sale_commission_salesman +# * sale_commission_salesman # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 12.0\n" +"Project-Id-Version: Odoo Server 13.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: <>\n" +"Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -27,12 +27,15 @@ msgstr "" #. module: sale_commission_salesman #: model:ir.model.fields,help:sale_commission_salesman.field_res_partner__salesman_as_agent #: model:ir.model.fields,help:sale_commission_salesman.field_res_users__salesman_as_agent -msgid "If the user linked to this partner is put as salesman and no other commission rule is triggered, this agent will be added as the commission agent" +msgid "" +"If the user linked to this partner is put as salesman and no other " +"commission rule is triggered, this agent will be added as the commission " +"agent" msgstr "" #. module: sale_commission_salesman -#: model:ir.model,name:sale_commission_salesman.model_account_invoice_line -msgid "Invoice Line" +#: model:ir.model,name:sale_commission_salesman.model_account_move_line +msgid "Journal Item" msgstr "" #. module: sale_commission_salesman @@ -41,8 +44,7 @@ msgid "Sales Order Line" msgstr "" #. module: sale_commission_salesman -#: code:addons/sale_commission_salesman/models/res_partner.py:21 +#: code:addons/sale_commission_salesman/models/res_partner.py:0 #, python-format msgid "You can't have a salesman auto-agent without commission." msgstr "" - diff --git a/sale_commission_salesman/models/__init__.py b/sale_commission_salesman/models/__init__.py index 9582ff43d..50fe8eac5 100644 --- a/sale_commission_salesman/models/__init__.py +++ b/sale_commission_salesman/models/__init__.py @@ -1,5 +1,5 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from . import account_invoice +from . import account_move from . import res_partner from . import sale_order diff --git a/sale_commission_salesman/models/account_invoice.py b/sale_commission_salesman/models/account_invoice.py deleted file mode 100644 index 164cc4048..000000000 --- a/sale_commission_salesman/models/account_invoice.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright 2020 Tecnativa - Pedro M. Baeza -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). - -from odoo import models - - -class AccountInvoiceLine(models.Model): - _inherit = "account.invoice.line" - - def _prepare_agents_vals(self, vals=None): - """Add salesman agent if configured so and no other commission - already populated. - """ - res = super()._prepare_agents_vals(vals=vals) - if not res: - partner = self.invoice_id.user_id.partner_id - if not self and vals.get("invoice_id"): - invoice = self.env["account.invoice"].browse(vals["invoice_id"]) - partner = invoice.user_id.partner_id - if partner.agent and partner.salesman_as_agent: - res = [ - (0, 0, {"agent": partner.id, "commission": partner.commission.id,}), - ] - return res diff --git a/sale_commission_salesman/models/account_move.py b/sale_commission_salesman/models/account_move.py new file mode 100644 index 000000000..e0028f089 --- /dev/null +++ b/sale_commission_salesman/models/account_move.py @@ -0,0 +1,23 @@ +# Copyright 2020 Tecnativa - Pedro M. Baeza +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import models + + +class AccountMoveLine(models.Model): + _inherit = "account.move.line" + + def _compute_agent_ids(self): + """Add salesman agent if configured so and no other commission + already populated. + """ + super()._compute_agent_ids() + for record in self.filtered( + lambda x: x.move_id.partner_id + and x.move_id.type[:3] == "out" + and x.product_id + and not x.agent_ids + ): + partner = self.move_id.invoice_user_id.partner_id + if partner.agent and partner.salesman_as_agent: + record.agent_ids = [(0, 0, self._prepare_agent_vals(partner))] diff --git a/sale_commission_salesman/models/res_partner.py b/sale_commission_salesman/models/res_partner.py index 2ba9a9a3d..3f284bd4e 100644 --- a/sale_commission_salesman/models/res_partner.py +++ b/sale_commission_salesman/models/res_partner.py @@ -14,10 +14,10 @@ class ResPartner(models.Model): "added as the commission agent", ) - @api.constrains("salesman_as_agent", "commission") + @api.constrains("salesman_as_agent", "commission_id") def _check_salesman_as_agent(self): for record in self: - if record.salesman_as_agent and not record.commission: + if record.salesman_as_agent and not record.commission_id: raise exceptions.ValidationError( _("You can't have a salesman auto-agent without commission.") ) diff --git a/sale_commission_salesman/models/sale_order.py b/sale_commission_salesman/models/sale_order.py index 74bd6b776..cddbb9665 100644 --- a/sale_commission_salesman/models/sale_order.py +++ b/sale_commission_salesman/models/sale_order.py @@ -7,18 +7,12 @@ class SaleOrdeLine(models.Model): _inherit = "sale.order.line" - def _prepare_agents_vals(self, vals=None): + def _compute_agent_ids(self): """Add salesman agent if configured so and no other commission already populated. """ - res = super()._prepare_agents_vals(vals=vals) - if not res: + super()._compute_agent_ids() + for record in self.filtered(lambda x: x.order_id.partner_id): partner = self.order_id.user_id.partner_id - if not self and vals.get("order_id"): - order = self.env["sale.order"].browse(vals["order_id"]) - partner = order.user_id.partner_id - if partner.agent and partner.salesman_as_agent: - res = [ - (0, 0, {"agent": partner.id, "commission": partner.commission.id,}), - ] - return res + if not record.agent_ids and partner.agent and partner.salesman_as_agent: + record.agent_ids = [(0, 0, self._prepare_agent_vals(partner))] diff --git a/sale_commission_salesman/static/description/index.html b/sale_commission_salesman/static/description/index.html index 19a4fe370..2a0da26f1 100644 --- a/sale_commission_salesman/static/description/index.html +++ b/sale_commission_salesman/static/description/index.html @@ -367,7 +367,7 @@

Sales commissions from salesman

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

+

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

This module extends the functionality of sale_commission to allow you to auto-populate salesmen as commission agents without setting explicitly them on the customer.

@@ -415,7 +415,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 -feedback.

+feedback.

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

@@ -448,7 +448,7 @@

Maintainers

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.

-

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_salesman/tests/test_sale_commission_salesman.py b/sale_commission_salesman/tests/test_sale_commission_salesman.py index 073e62160..cc9a8ac17 100644 --- a/sale_commission_salesman/tests/test_sale_commission_salesman.py +++ b/sale_commission_salesman/tests/test_sale_commission_salesman.py @@ -2,7 +2,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo import exceptions -from odoo.tests.common import SavepointCase +from odoo.tests.common import Form, SavepointCase class TestSaleCommissionSalesman(SavepointCase): @@ -10,93 +10,79 @@ class TestSaleCommissionSalesman(SavepointCase): def setUpClass(cls): super().setUpClass() cls.product = cls.env["product.product"].create( - {"name": "Test Product 1", "list_price": 100,} + {"name": "Test Product 1", "list_price": 100} ) SaleCommission = cls.env["sale.commission"] cls.commission_1 = SaleCommission.create( - {"name": "1% commission", "fix_qty": 1.0,} + {"name": "1% commission", "fix_qty": 1.0} ) Partner = cls.env["res.partner"] cls.salesman = cls.env["res.users"].create( - {"name": "Test agent", "login": "sale_comission_salesman_test",} + {"name": "Test agent", "login": "sale_comission_salesman_test"} ) cls.agent = cls.salesman.partner_id cls.agent.write( { "agent": True, "salesman_as_agent": True, - "commission": cls.commission_1.id, + "commission_id": cls.commission_1.id, } ) cls.other_agent = Partner.create( { "name": "Test other agent", "agent": True, - "commission": cls.commission_1.id, + "commission_id": cls.commission_1.id, } ) - cls.partner = Partner.create({"name": "Partner test",}) + cls.partner = Partner.create({"name": "Partner test"}) cls.sale_order = cls.env["sale.order"].create( - {"partner_id": cls.partner.id, "user_id": cls.salesman.id,} + {"partner_id": cls.partner.id, "user_id": cls.salesman.id} ) - cls.invoice = cls.env["account.invoice"].create( - {"partner_id": cls.partner.id, "user_id": cls.salesman.id,} + cls.invoice = cls.env["account.move"].create( + { + "partner_id": cls.partner.id, + "invoice_user_id": cls.salesman.id, + "type": "out_invoice", + } ) def test_check_salesman_commission(self): with self.assertRaises(exceptions.ValidationError): - self.agent.commission = False + self.agent.commission_id = False def test_sale_commission_salesman(self): - line = ( - self.env["sale.order.line"] - .with_context(partner_id=self.partner.id) - .create({"order_id": self.sale_order.id, "product_id": self.product.id,}) + line = self.env["sale.order.line"].create( + {"order_id": self.sale_order.id, "product_id": self.product.id} ) - self.assertTrue(line.agents) - self.assertTrue(line.agents.agent, self.agent) - self.assertTrue(line.agents.commission, self.commission_1) + self.assertTrue(line.agent_ids) + self.assertTrue(line.agent_ids.agent_id, self.agent) + self.assertTrue(line.agent_ids.commission_id, self.commission_1) def test_sale_commission_salesman_no_population(self): - self.partner.agents = [(4, self.other_agent.id)] - line = ( - self.env["sale.order.line"] - .with_context(partner_id=self.partner.id) - .create({"order_id": self.sale_order.id, "product_id": self.product.id,}) + self.partner.agent_ids = [(4, self.other_agent.id)] + line = self.env["sale.order.line"].create( + {"order_id": self.sale_order.id, "product_id": self.product.id} ) - self.assertTrue(len(line.agents), 1) - self.assertTrue(line.agents.agent, self.other_agent) + self.assertTrue(len(line.agent_ids), 1) + self.assertTrue(line.agent_ids.agent_id, self.other_agent) def test_invoice_commission_salesman(self): - line_obj = self.env["account.invoice.line"] - line = line_obj.with_context(partner_id=self.partner.id).create( - { - "invoice_id": self.invoice.id, - "product_id": self.product.id, - "account_id": line_obj.get_invoice_line_account( - self.invoice.type, self.product, False, self.invoice.company_id - ).id, - "name": self.product.name, - "price_unit": 1, - } - ) - self.assertTrue(line.agents) - self.assertTrue(line.agents.agent, self.agent) - self.assertTrue(line.agents.commission, self.commission_1) + invoice_form = Form(self.invoice) + with invoice_form.invoice_line_ids.new() as line_form: + line_form.product_id = self.product + invoice_form.save() + line = self.invoice.invoice_line_ids + self.assertTrue(line.agent_ids) + self.assertTrue(line.agent_ids.agent_id, self.agent) + self.assertTrue(line.agent_ids.commission_id, self.commission_1) def test_invoice_commission_salesman_no_population(self): - self.partner.agents = [(4, self.other_agent.id)] - line_obj = self.env["account.invoice.line"] - line = line_obj.with_context(partner_id=self.partner.id).create( - { - "invoice_id": self.invoice.id, - "product_id": self.product.id, - "account_id": line_obj.get_invoice_line_account( - self.invoice.type, self.product, False, self.invoice.company_id - ).id, - "name": self.product.name, - "price_unit": 1, - } - ) - self.assertTrue(len(line.agents), 1) - self.assertTrue(line.agents.agent, self.other_agent) + self.partner.agent_ids = [(4, self.other_agent.id)] + invoice_form = Form(self.invoice) + with invoice_form.invoice_line_ids.new() as line_form: + line_form.product_id = self.product + invoice_form.save() + line = self.invoice.invoice_line_ids + self.assertTrue(line.agent_ids) + self.assertTrue(line.agent_ids.agent_id, self.other_agent) diff --git a/sale_commission_salesman/views/res_partner_views.xml b/sale_commission_salesman/views/res_partner_views.xml index 719563ca2..055161624 100644 --- a/sale_commission_salesman/views/res_partner_views.xml +++ b/sale_commission_salesman/views/res_partner_views.xml @@ -6,7 +6,7 @@ res.partner - + Date: Sat, 12 Sep 2020 21:11:02 +0000 Subject: [PATCH 05/20] Added translation using Weblate (Spanish (Argentina)) --- sale_commission_salesman/i18n/es.po | 10 ++--- sale_commission_salesman/i18n/es_AR.po | 56 ++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 sale_commission_salesman/i18n/es_AR.po diff --git a/sale_commission_salesman/i18n/es.po b/sale_commission_salesman/i18n/es.po index 2c2c21923..25861d32d 100644 --- a/sale_commission_salesman/i18n/es.po +++ b/sale_commission_salesman/i18n/es.po @@ -7,15 +7,15 @@ msgstr "" "Project-Id-Version: Odoo Server 11.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-06-12 14:51+0000\n" -"PO-Revision-Date: 2020-06-12 16:55+0200\n" -"Last-Translator: <>\n" +"PO-Revision-Date: 2021-03-17 15:45+0000\n" +"Last-Translator: Ana Suárez \n" "Language-Team: \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: \n" -"X-Generator: Poedit 2.3\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.3.2\n" #. module: sale_commission_salesman #: model:ir.model,name:sale_commission_salesman.model_res_partner @@ -42,7 +42,7 @@ msgstr "" #. module: sale_commission_salesman #: model:ir.model,name:sale_commission_salesman.model_account_move_line msgid "Journal Item" -msgstr "" +msgstr "Apunte contable" #. module: sale_commission_salesman #: model:ir.model,name:sale_commission_salesman.model_sale_order_line diff --git a/sale_commission_salesman/i18n/es_AR.po b/sale_commission_salesman/i18n/es_AR.po new file mode 100644 index 000000000..53edc3574 --- /dev/null +++ b/sale_commission_salesman/i18n/es_AR.po @@ -0,0 +1,56 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_commission_salesman +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2020-10-05 20:16+0000\n" +"Last-Translator: Ignacio Buioli \n" +"Language-Team: none\n" +"Language: es_AR\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 3.10\n" + +#. module: sale_commission_salesman +#: model:ir.model,name:sale_commission_salesman.model_res_partner +msgid "Contact" +msgstr "Contacto" + +#. module: sale_commission_salesman +#: model:ir.model.fields,field_description:sale_commission_salesman.field_res_partner__salesman_as_agent +#: model:ir.model.fields,field_description:sale_commission_salesman.field_res_users__salesman_as_agent +msgid "Convert salesman into agent" +msgstr "Convertir vendedor en agente" + +#. module: sale_commission_salesman +#: model:ir.model.fields,help:sale_commission_salesman.field_res_partner__salesman_as_agent +#: model:ir.model.fields,help:sale_commission_salesman.field_res_users__salesman_as_agent +msgid "" +"If the user linked to this partner is put as salesman and no other " +"commission rule is triggered, this agent will be added as the commission " +"agent" +msgstr "" +"Si el usuario vinculado a este socio se pone como vendedor y no se activa " +"ninguna otra regla de comisión, este agente se agregará como el agente de " +"comisión" + +#. module: sale_commission_salesman +#: model:ir.model,name:sale_commission_salesman.model_account_move_line +msgid "Journal Item" +msgstr "Apunte contable" + +#. module: sale_commission_salesman +#: model:ir.model,name:sale_commission_salesman.model_sale_order_line +msgid "Sales Order Line" +msgstr "Línea de Orden de Ventas" + +#. module: sale_commission_salesman +#: code:addons/sale_commission_salesman/models/res_partner.py:0 +#, python-format +msgid "You can't have a salesman auto-agent without commission." +msgstr "No puede tener un agente automático de ventas sin comisión." From 0aa7578e85b60be3306ccb40f0f19f99dc6467d7 Mon Sep 17 00:00:00 2001 From: sinerkiaid <30922659+sinerkiaid@users.noreply.github.com> Date: Tue, 30 Mar 2021 14:29:21 +0200 Subject: [PATCH 06/20] Solution for error #274 Solves [13.0] sale_commission_pricelist - sale_commission_salesman error #274 --- sale_commission_salesman/models/sale_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sale_commission_salesman/models/sale_order.py b/sale_commission_salesman/models/sale_order.py index cddbb9665..3e663560b 100644 --- a/sale_commission_salesman/models/sale_order.py +++ b/sale_commission_salesman/models/sale_order.py @@ -15,4 +15,4 @@ def _compute_agent_ids(self): for record in self.filtered(lambda x: x.order_id.partner_id): partner = self.order_id.user_id.partner_id if not record.agent_ids and partner.agent and partner.salesman_as_agent: - record.agent_ids = [(0, 0, self._prepare_agent_vals(partner))] + record.agent_ids = [(0, 0, record._prepare_agent_vals(partner))] From 4bc370dc0a9d38f54c48c7774771966274fd88f7 Mon Sep 17 00:00:00 2001 From: sinerkiaid <30922659+sinerkiaid@users.noreply.github.com> Date: Fri, 2 Apr 2021 15:11:58 +0200 Subject: [PATCH 07/20] Apply suggestions from code review Co-authored-by: Bhavesh Odedra --- sale_commission_salesman/__manifest__.py | 2 +- sale_commission_salesman/models/sale_order.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sale_commission_salesman/__manifest__.py b/sale_commission_salesman/__manifest__.py index b9ea9acaa..3058e06ff 100644 --- a/sale_commission_salesman/__manifest__.py +++ b/sale_commission_salesman/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Sales commissions from salesman", - "version": "13.0.1.0.0", + "version": "13.0.1.0.1", "author": "Tecnativa, " "Odoo Community Association (OCA)", "category": "Sales", "website": "https://github.com/OCA/commission", diff --git a/sale_commission_salesman/models/sale_order.py b/sale_commission_salesman/models/sale_order.py index 3e663560b..37b9581da 100644 --- a/sale_commission_salesman/models/sale_order.py +++ b/sale_commission_salesman/models/sale_order.py @@ -13,6 +13,6 @@ def _compute_agent_ids(self): """ super()._compute_agent_ids() for record in self.filtered(lambda x: x.order_id.partner_id): - partner = self.order_id.user_id.partner_id + partner = record.order_id.user_id.partner_id if not record.agent_ids and partner.agent and partner.salesman_as_agent: record.agent_ids = [(0, 0, record._prepare_agent_vals(partner))] From cff2b8b3adfbc26f99a5f5e1e02f62e10ad78b89 Mon Sep 17 00:00:00 2001 From: jabelchi Date: Fri, 4 Jun 2021 08:00:38 +0000 Subject: [PATCH 08/20] Added translation using Weblate (Catalan) --- sale_commission_salesman/i18n/ca.po | 55 +++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 sale_commission_salesman/i18n/ca.po diff --git a/sale_commission_salesman/i18n/ca.po b/sale_commission_salesman/i18n/ca.po new file mode 100644 index 000000000..553e16449 --- /dev/null +++ b/sale_commission_salesman/i18n/ca.po @@ -0,0 +1,55 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_commission_salesman +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2021-06-04 10:48+0000\n" +"Last-Translator: jabelchi \n" +"Language-Team: none\n" +"Language: ca\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.3.2\n" + +#. module: sale_commission_salesman +#: model:ir.model,name:sale_commission_salesman.model_res_partner +msgid "Contact" +msgstr "Contacte" + +#. module: sale_commission_salesman +#: model:ir.model.fields,field_description:sale_commission_salesman.field_res_partner__salesman_as_agent +#: model:ir.model.fields,field_description:sale_commission_salesman.field_res_users__salesman_as_agent +msgid "Convert salesman into agent" +msgstr "Convertir venedor en agent" + +#. module: sale_commission_salesman +#: model:ir.model.fields,help:sale_commission_salesman.field_res_partner__salesman_as_agent +#: model:ir.model.fields,help:sale_commission_salesman.field_res_users__salesman_as_agent +msgid "" +"If the user linked to this partner is put as salesman and no other " +"commission rule is triggered, this agent will be added as the commission " +"agent" +msgstr "" +"Si l'usuari enllaçat a aquest contacte es posa com a comercial i no s'activa " +"cap altra regla de comissions, aquest agent s'afegirà com a comissionista" + +#. module: sale_commission_salesman +#: model:ir.model,name:sale_commission_salesman.model_account_move_line +msgid "Journal Item" +msgstr "Apunt comptable" + +#. module: sale_commission_salesman +#: model:ir.model,name:sale_commission_salesman.model_sale_order_line +msgid "Sales Order Line" +msgstr "Línia de comanda de venda" + +#. module: sale_commission_salesman +#: code:addons/sale_commission_salesman/models/res_partner.py:0 +#, python-format +msgid "You can't have a salesman auto-agent without commission." +msgstr "No podeu tenir un comercial auto-agent sense comissió." From 6884947fa46a8133752ed5605933eddb23c12c7a Mon Sep 17 00:00:00 2001 From: aromera Date: Mon, 10 Jan 2022 14:04:46 +0100 Subject: [PATCH 09/20] [MIG] sale_commission_salesman: Migration to 14.0 --- sale_commission_salesman/README.rst | 10 ++++---- sale_commission_salesman/__manifest__.py | 2 +- .../i18n/sale_commission_salesman.pot | 23 ++++++++++++++++++- .../models/account_move.py | 2 +- .../static/description/index.html | 6 ++--- .../tests/test_sale_commission_salesman.py | 2 +- 6 files changed, 33 insertions(+), 12 deletions(-) diff --git a/sale_commission_salesman/README.rst b/sale_commission_salesman/README.rst index e0af1ac39..2caa26fb2 100644 --- a/sale_commission_salesman/README.rst +++ b/sale_commission_salesman/README.rst @@ -14,13 +14,13 @@ Sales commissions from salesman :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/13.0/sale_commission_salesman + :target: https://github.com/OCA/commission/tree/14.0/sale_commission_salesman :alt: OCA/commission .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/commission-13-0/commission-13-0-sale_commission_salesman + :target: https://translation.odoo-community.org/projects/commission-14-0/commission-14-0-sale_commission_salesman :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/13.0 + :target: https://runbot.odoo-community.org/runbot/165/14.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -64,7 +64,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 -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -101,6 +101,6 @@ 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. -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_salesman/__manifest__.py b/sale_commission_salesman/__manifest__.py index 3058e06ff..3dd37f0cf 100644 --- a/sale_commission_salesman/__manifest__.py +++ b/sale_commission_salesman/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Sales commissions from salesman", - "version": "13.0.1.0.1", + "version": "14.0.1.0.0", "author": "Tecnativa, " "Odoo Community Association (OCA)", "category": "Sales", "website": "https://github.com/OCA/commission", diff --git a/sale_commission_salesman/i18n/sale_commission_salesman.pot b/sale_commission_salesman/i18n/sale_commission_salesman.pot index 2a4bb22e6..646cfc674 100644 --- a/sale_commission_salesman/i18n/sale_commission_salesman.pot +++ b/sale_commission_salesman/i18n/sale_commission_salesman.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 13.0\n" +"Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -24,6 +24,20 @@ msgstr "" msgid "Convert salesman into agent" msgstr "" +#. module: sale_commission_salesman +#: model:ir.model.fields,field_description:sale_commission_salesman.field_account_move_line__display_name +#: model:ir.model.fields,field_description:sale_commission_salesman.field_res_partner__display_name +#: model:ir.model.fields,field_description:sale_commission_salesman.field_sale_order_line__display_name +msgid "Display Name" +msgstr "" + +#. module: sale_commission_salesman +#: model:ir.model.fields,field_description:sale_commission_salesman.field_account_move_line__id +#: model:ir.model.fields,field_description:sale_commission_salesman.field_res_partner__id +#: model:ir.model.fields,field_description:sale_commission_salesman.field_sale_order_line__id +msgid "ID" +msgstr "" + #. module: sale_commission_salesman #: model:ir.model.fields,help:sale_commission_salesman.field_res_partner__salesman_as_agent #: model:ir.model.fields,help:sale_commission_salesman.field_res_users__salesman_as_agent @@ -38,6 +52,13 @@ msgstr "" msgid "Journal Item" msgstr "" +#. module: sale_commission_salesman +#: model:ir.model.fields,field_description:sale_commission_salesman.field_account_move_line____last_update +#: model:ir.model.fields,field_description:sale_commission_salesman.field_res_partner____last_update +#: model:ir.model.fields,field_description:sale_commission_salesman.field_sale_order_line____last_update +msgid "Last Modified on" +msgstr "" + #. module: sale_commission_salesman #: model:ir.model,name:sale_commission_salesman.model_sale_order_line msgid "Sales Order Line" diff --git a/sale_commission_salesman/models/account_move.py b/sale_commission_salesman/models/account_move.py index e0028f089..4238c982a 100644 --- a/sale_commission_salesman/models/account_move.py +++ b/sale_commission_salesman/models/account_move.py @@ -14,7 +14,7 @@ def _compute_agent_ids(self): super()._compute_agent_ids() for record in self.filtered( lambda x: x.move_id.partner_id - and x.move_id.type[:3] == "out" + and x.move_id.move_type[:3] == "out" and x.product_id and not x.agent_ids ): diff --git a/sale_commission_salesman/static/description/index.html b/sale_commission_salesman/static/description/index.html index 2a0da26f1..27104d0bc 100644 --- a/sale_commission_salesman/static/description/index.html +++ b/sale_commission_salesman/static/description/index.html @@ -367,7 +367,7 @@

Sales commissions from salesman

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

+

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

This module extends the functionality of sale_commission to allow you to auto-populate salesmen as commission agents without setting explicitly them on the customer.

@@ -415,7 +415,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 -feedback.

+feedback.

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

@@ -448,7 +448,7 @@

Maintainers

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.

-

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_salesman/tests/test_sale_commission_salesman.py b/sale_commission_salesman/tests/test_sale_commission_salesman.py index cc9a8ac17..377cefde4 100644 --- a/sale_commission_salesman/tests/test_sale_commission_salesman.py +++ b/sale_commission_salesman/tests/test_sale_commission_salesman.py @@ -43,7 +43,7 @@ def setUpClass(cls): { "partner_id": cls.partner.id, "invoice_user_id": cls.salesman.id, - "type": "out_invoice", + "move_type": "out_invoice", } ) From 500d55b6846e9ec51630ec45bca915db3a3cd2da Mon Sep 17 00:00:00 2001 From: Francesco Foresti Date: Wed, 21 Dec 2022 10:48:09 +0000 Subject: [PATCH 10/20] Added translation using Weblate (Italian) --- sale_commission_salesman/i18n/it.po | 74 +++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 sale_commission_salesman/i18n/it.po diff --git a/sale_commission_salesman/i18n/it.po b/sale_commission_salesman/i18n/it.po new file mode 100644 index 000000000..2fecdc9d6 --- /dev/null +++ b/sale_commission_salesman/i18n/it.po @@ -0,0 +1,74 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_commission_salesman +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2022-12-21 13:44+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.14.1\n" + +#. module: sale_commission_salesman +#: model:ir.model,name:sale_commission_salesman.model_res_partner +msgid "Contact" +msgstr "Contatto" + +#. module: sale_commission_salesman +#: model:ir.model.fields,field_description:sale_commission_salesman.field_res_partner__salesman_as_agent +#: model:ir.model.fields,field_description:sale_commission_salesman.field_res_users__salesman_as_agent +msgid "Convert salesman into agent" +msgstr "" + +#. module: sale_commission_salesman +#: model:ir.model.fields,field_description:sale_commission_salesman.field_account_move_line__display_name +#: model:ir.model.fields,field_description:sale_commission_salesman.field_res_partner__display_name +#: model:ir.model.fields,field_description:sale_commission_salesman.field_sale_order_line__display_name +msgid "Display Name" +msgstr "" + +#. module: sale_commission_salesman +#: model:ir.model.fields,field_description:sale_commission_salesman.field_account_move_line__id +#: model:ir.model.fields,field_description:sale_commission_salesman.field_res_partner__id +#: model:ir.model.fields,field_description:sale_commission_salesman.field_sale_order_line__id +msgid "ID" +msgstr "" + +#. module: sale_commission_salesman +#: model:ir.model.fields,help:sale_commission_salesman.field_res_partner__salesman_as_agent +#: model:ir.model.fields,help:sale_commission_salesman.field_res_users__salesman_as_agent +msgid "" +"If the user linked to this partner is put as salesman and no other " +"commission rule is triggered, this agent will be added as the commission " +"agent" +msgstr "" + +#. module: sale_commission_salesman +#: model:ir.model,name:sale_commission_salesman.model_account_move_line +msgid "Journal Item" +msgstr "" + +#. module: sale_commission_salesman +#: model:ir.model.fields,field_description:sale_commission_salesman.field_account_move_line____last_update +#: model:ir.model.fields,field_description:sale_commission_salesman.field_res_partner____last_update +#: model:ir.model.fields,field_description:sale_commission_salesman.field_sale_order_line____last_update +msgid "Last Modified on" +msgstr "" + +#. module: sale_commission_salesman +#: model:ir.model,name:sale_commission_salesman.model_sale_order_line +msgid "Sales Order Line" +msgstr "" + +#. module: sale_commission_salesman +#: code:addons/sale_commission_salesman/models/res_partner.py:0 +#, python-format +msgid "You can't have a salesman auto-agent without commission." +msgstr "" From d367c529921faa9163bd3d04a67310a510db3ee3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20Ernesto=20Garc=C3=ADa=20Medina?= Date: Thu, 23 Feb 2023 17:40:35 -0600 Subject: [PATCH 11/20] [MIG] sale_commission_salesman: Migration to 15.0 --- sale_commission_salesman/README.rst | 15 +- sale_commission_salesman/__manifest__.py | 2 +- .../i18n/sale_commission_salesman.pot | 23 +- .../models/account_move.py | 3 +- sale_commission_salesman/models/sale_order.py | 3 +- sale_commission_salesman/readme/ROADMAP.rst | 1 + .../static/description/icon.png | Bin 17671 -> 7968 bytes .../static/description/icon.svg | 2882 +---------------- .../static/description/index.html | 37 +- .../tests/test_sale_commission_salesman.py | 6 +- .../views/res_partner_views.xml | 2 +- 11 files changed, 193 insertions(+), 2781 deletions(-) create mode 100644 sale_commission_salesman/readme/ROADMAP.rst diff --git a/sale_commission_salesman/README.rst b/sale_commission_salesman/README.rst index 2caa26fb2..6a9a73ee8 100644 --- a/sale_commission_salesman/README.rst +++ b/sale_commission_salesman/README.rst @@ -14,13 +14,13 @@ Sales commissions from salesman :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_salesman + :target: https://github.com/OCA/commission/tree/15.0/sale_commission_salesman :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_salesman + :target: https://translation.odoo-community.org/projects/commission-15-0/commission-15-0-sale_commission_salesman :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 + :target: https://runbot.odoo-community.org/runbot/165/15.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -58,13 +58,18 @@ To use this module, you need to: #. Add a line in the quotation, and you will see the salesman populated as commission agent. +Known issues / Roadmap +====================== + +- This module can be split into 2: account_commission_salesman and sale_commission_salesman. + 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 `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -101,6 +106,6 @@ 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. -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_salesman/__manifest__.py b/sale_commission_salesman/__manifest__.py index 3dd37f0cf..6a44af52b 100644 --- a/sale_commission_salesman/__manifest__.py +++ b/sale_commission_salesman/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Sales commissions from salesman", - "version": "14.0.1.0.0", + "version": "15.0.1.0.0", "author": "Tecnativa, " "Odoo Community Association (OCA)", "category": "Sales", "website": "https://github.com/OCA/commission", diff --git a/sale_commission_salesman/i18n/sale_commission_salesman.pot b/sale_commission_salesman/i18n/sale_commission_salesman.pot index 646cfc674..6a81efd62 100644 --- a/sale_commission_salesman/i18n/sale_commission_salesman.pot +++ b/sale_commission_salesman/i18n/sale_commission_salesman.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 14.0\n" +"Project-Id-Version: Odoo Server 15.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -24,20 +24,6 @@ msgstr "" msgid "Convert salesman into agent" msgstr "" -#. module: sale_commission_salesman -#: model:ir.model.fields,field_description:sale_commission_salesman.field_account_move_line__display_name -#: model:ir.model.fields,field_description:sale_commission_salesman.field_res_partner__display_name -#: model:ir.model.fields,field_description:sale_commission_salesman.field_sale_order_line__display_name -msgid "Display Name" -msgstr "" - -#. module: sale_commission_salesman -#: model:ir.model.fields,field_description:sale_commission_salesman.field_account_move_line__id -#: model:ir.model.fields,field_description:sale_commission_salesman.field_res_partner__id -#: model:ir.model.fields,field_description:sale_commission_salesman.field_sale_order_line__id -msgid "ID" -msgstr "" - #. module: sale_commission_salesman #: model:ir.model.fields,help:sale_commission_salesman.field_res_partner__salesman_as_agent #: model:ir.model.fields,help:sale_commission_salesman.field_res_users__salesman_as_agent @@ -52,13 +38,6 @@ msgstr "" msgid "Journal Item" msgstr "" -#. module: sale_commission_salesman -#: model:ir.model.fields,field_description:sale_commission_salesman.field_account_move_line____last_update -#: model:ir.model.fields,field_description:sale_commission_salesman.field_res_partner____last_update -#: model:ir.model.fields,field_description:sale_commission_salesman.field_sale_order_line____last_update -msgid "Last Modified on" -msgstr "" - #. module: sale_commission_salesman #: model:ir.model,name:sale_commission_salesman.model_sale_order_line msgid "Sales Order Line" diff --git a/sale_commission_salesman/models/account_move.py b/sale_commission_salesman/models/account_move.py index 4238c982a..ea33b7203 100644 --- a/sale_commission_salesman/models/account_move.py +++ b/sale_commission_salesman/models/account_move.py @@ -11,7 +11,7 @@ def _compute_agent_ids(self): """Add salesman agent if configured so and no other commission already populated. """ - super()._compute_agent_ids() + result = super()._compute_agent_ids() for record in self.filtered( lambda x: x.move_id.partner_id and x.move_id.move_type[:3] == "out" @@ -21,3 +21,4 @@ def _compute_agent_ids(self): partner = self.move_id.invoice_user_id.partner_id if partner.agent and partner.salesman_as_agent: record.agent_ids = [(0, 0, self._prepare_agent_vals(partner))] + return result diff --git a/sale_commission_salesman/models/sale_order.py b/sale_commission_salesman/models/sale_order.py index 37b9581da..822df325e 100644 --- a/sale_commission_salesman/models/sale_order.py +++ b/sale_commission_salesman/models/sale_order.py @@ -11,8 +11,9 @@ def _compute_agent_ids(self): """Add salesman agent if configured so and no other commission already populated. """ - super()._compute_agent_ids() + result = super()._compute_agent_ids() for record in self.filtered(lambda x: x.order_id.partner_id): partner = record.order_id.user_id.partner_id if not record.agent_ids and partner.agent and partner.salesman_as_agent: record.agent_ids = [(0, 0, record._prepare_agent_vals(partner))] + return result diff --git a/sale_commission_salesman/readme/ROADMAP.rst b/sale_commission_salesman/readme/ROADMAP.rst new file mode 100644 index 000000000..dd5698294 --- /dev/null +++ b/sale_commission_salesman/readme/ROADMAP.rst @@ -0,0 +1 @@ +- This module can be split into 2: account_commission_salesman and sale_commission_salesman. diff --git a/sale_commission_salesman/static/description/icon.png b/sale_commission_salesman/static/description/icon.png index 7ce73f84986909d76a2189c08edbbd3583680187..3be6cf23a07ae5c37aec612c151b1dd74f292b52 100644 GIT binary patch literal 7968 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 - - + inkscape:export-xdpi="192" + inkscape:export-ydpi="192" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + + + id="defs7"> + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="filter3869" + x="-0.028125" + y="-0.031229825" + width="1.0679687" + height="1.0754721"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + fill="none" + fill-rule="nonzero" + stroke="none" + stroke-width="1" + stroke-linecap="butt" + stroke-linejoin="miter" + stroke-miterlimit="10" + stroke-dasharray="" + stroke-dashoffset="0" + font-family="none" + font-weight="none" + font-size="none" + text-anchor="none" + style="mix-blend-mode: normal" + id="g15"> + + + + + + + + + + - - - - image/svg+xml - - - - - Openclipart - - - Pile of Golden Coins - 2010-04-09T03:27:45 - A pile of hypothetical golden coins, drawn in Inkscape. - https://openclipart.org/detail/43969/pile-of-golden-coins-by-j_alves - - - J_Alves - - - - - coin - currency - gold - money - thaler - - - - - - - - - - diff --git a/sale_commission_salesman/static/description/index.html b/sale_commission_salesman/static/description/index.html index 27104d0bc..ee60fe610 100644 --- a/sale_commission_salesman/static/description/index.html +++ b/sale_commission_salesman/static/description/index.html @@ -367,7 +367,7 @@

Sales commissions from salesman

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

+

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

This module extends the functionality of sale_commission to allow you to auto-populate salesmen as commission agents without setting explicitly them on the customer.

@@ -378,12 +378,13 @@

Sales commissions from salesman

  • Configuration
  • Usage
  • -
  • Bug Tracker
  • -
  • Credits @@ -410,24 +411,30 @@

    Usage

    commission agent.
  • +
    +

    Known issues / Roadmap

    +
      +
    • This module can be split into 2: account_commission_salesman and sale_commission_salesman.
    • +
    +
    -

    Bug Tracker

    +

    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.

    +feedback.

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

    -

    Credits

    +

    Credits

    -

    Authors

    +

    Authors

    • Tecnativa
    -

    Contributors

    +

    Contributors

    -

    Other credits

    +

    Other credits

    -

    Maintainers

    +

    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.

    -

    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_salesman/tests/test_sale_commission_salesman.py b/sale_commission_salesman/tests/test_sale_commission_salesman.py index 377cefde4..86bd5f290 100644 --- a/sale_commission_salesman/tests/test_sale_commission_salesman.py +++ b/sale_commission_salesman/tests/test_sale_commission_salesman.py @@ -2,17 +2,17 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo import exceptions -from odoo.tests.common import Form, SavepointCase +from odoo.tests import Form, TransactionCase -class TestSaleCommissionSalesman(SavepointCase): +class TestSaleCommissionSalesman(TransactionCase): @classmethod def setUpClass(cls): super().setUpClass() cls.product = cls.env["product.product"].create( {"name": "Test Product 1", "list_price": 100} ) - SaleCommission = cls.env["sale.commission"] + SaleCommission = cls.env["commission"] cls.commission_1 = SaleCommission.create( {"name": "1% commission", "fix_qty": 1.0} ) diff --git a/sale_commission_salesman/views/res_partner_views.xml b/sale_commission_salesman/views/res_partner_views.xml index 055161624..28a8bc2a8 100644 --- a/sale_commission_salesman/views/res_partner_views.xml +++ b/sale_commission_salesman/views/res_partner_views.xml @@ -4,7 +4,7 @@ res.partner - + From dd13a03ba2115420feb80fa8251492ac1990b2fb Mon Sep 17 00:00:00 2001 From: "Omar (Comunitea)" Date: Thu, 25 May 2023 01:20:37 +0200 Subject: [PATCH 12/20] [MIG] sale_commission_salesman: Migration to 16.0 --- sale_commission_salesman/README.rst | 23 ++++---- sale_commission_salesman/__manifest__.py | 2 +- sale_commission_salesman/i18n/ca.po | 1 + sale_commission_salesman/i18n/es.po | 1 + sale_commission_salesman/i18n/es_AR.po | 1 + sale_commission_salesman/i18n/it.po | 22 +------- .../i18n/sale_commission_salesman.pot | 3 +- .../static/description/index.html | 54 ++++++++++--------- 8 files changed, 48 insertions(+), 59 deletions(-) diff --git a/sale_commission_salesman/README.rst b/sale_commission_salesman/README.rst index 6a9a73ee8..3dcabc55d 100644 --- a/sale_commission_salesman/README.rst +++ b/sale_commission_salesman/README.rst @@ -2,10 +2,13 @@ Sales commissions from salesman =============================== -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:63e532cf8e93589c8c91d5903713b79d7d760883004843c2471c51c0ca350e3f + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status @@ -14,16 +17,16 @@ Sales commissions from salesman :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/15.0/sale_commission_salesman + :target: https://github.com/OCA/commission/tree/16.0/sale_commission_salesman :alt: OCA/commission .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/commission-15-0/commission-15-0-sale_commission_salesman + :target: https://translation.odoo-community.org/projects/commission-16-0/commission-16-0-sale_commission_salesman :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/15.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=16.0 + :alt: Try me on Runboat -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| This module extends the functionality of `sale_commission` to allow you to auto-populate salesmen as commission agents without setting explicitly them @@ -68,8 +71,8 @@ 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 `_. +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. @@ -106,6 +109,6 @@ 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. -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_salesman/__manifest__.py b/sale_commission_salesman/__manifest__.py index 6a44af52b..7d186350b 100644 --- a/sale_commission_salesman/__manifest__.py +++ b/sale_commission_salesman/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Sales commissions from salesman", - "version": "15.0.1.0.0", + "version": "16.0.1.0.0", "author": "Tecnativa, " "Odoo Community Association (OCA)", "category": "Sales", "website": "https://github.com/OCA/commission", diff --git a/sale_commission_salesman/i18n/ca.po b/sale_commission_salesman/i18n/ca.po index 553e16449..86668a8ff 100644 --- a/sale_commission_salesman/i18n/ca.po +++ b/sale_commission_salesman/i18n/ca.po @@ -49,6 +49,7 @@ msgid "Sales Order Line" msgstr "Línia de comanda de venda" #. module: sale_commission_salesman +#. odoo-python #: code:addons/sale_commission_salesman/models/res_partner.py:0 #, python-format msgid "You can't have a salesman auto-agent without commission." diff --git a/sale_commission_salesman/i18n/es.po b/sale_commission_salesman/i18n/es.po index 25861d32d..edfa087b5 100644 --- a/sale_commission_salesman/i18n/es.po +++ b/sale_commission_salesman/i18n/es.po @@ -50,6 +50,7 @@ msgid "Sales Order Line" msgstr "Línea de pedido de ventas" #. module: sale_commission_salesman +#. odoo-python #: code:addons/sale_commission_salesman/models/res_partner.py:0 #, python-format msgid "You can't have a salesman auto-agent without commission." diff --git a/sale_commission_salesman/i18n/es_AR.po b/sale_commission_salesman/i18n/es_AR.po index 53edc3574..1ee1711a5 100644 --- a/sale_commission_salesman/i18n/es_AR.po +++ b/sale_commission_salesman/i18n/es_AR.po @@ -50,6 +50,7 @@ msgid "Sales Order Line" msgstr "Línea de Orden de Ventas" #. module: sale_commission_salesman +#. odoo-python #: code:addons/sale_commission_salesman/models/res_partner.py:0 #, python-format msgid "You can't have a salesman auto-agent without commission." diff --git a/sale_commission_salesman/i18n/it.po b/sale_commission_salesman/i18n/it.po index 2fecdc9d6..ac695ca6b 100644 --- a/sale_commission_salesman/i18n/it.po +++ b/sale_commission_salesman/i18n/it.po @@ -27,20 +27,6 @@ msgstr "Contatto" msgid "Convert salesman into agent" msgstr "" -#. module: sale_commission_salesman -#: model:ir.model.fields,field_description:sale_commission_salesman.field_account_move_line__display_name -#: model:ir.model.fields,field_description:sale_commission_salesman.field_res_partner__display_name -#: model:ir.model.fields,field_description:sale_commission_salesman.field_sale_order_line__display_name -msgid "Display Name" -msgstr "" - -#. module: sale_commission_salesman -#: model:ir.model.fields,field_description:sale_commission_salesman.field_account_move_line__id -#: model:ir.model.fields,field_description:sale_commission_salesman.field_res_partner__id -#: model:ir.model.fields,field_description:sale_commission_salesman.field_sale_order_line__id -msgid "ID" -msgstr "" - #. module: sale_commission_salesman #: model:ir.model.fields,help:sale_commission_salesman.field_res_partner__salesman_as_agent #: model:ir.model.fields,help:sale_commission_salesman.field_res_users__salesman_as_agent @@ -55,19 +41,13 @@ msgstr "" msgid "Journal Item" msgstr "" -#. module: sale_commission_salesman -#: model:ir.model.fields,field_description:sale_commission_salesman.field_account_move_line____last_update -#: model:ir.model.fields,field_description:sale_commission_salesman.field_res_partner____last_update -#: model:ir.model.fields,field_description:sale_commission_salesman.field_sale_order_line____last_update -msgid "Last Modified on" -msgstr "" - #. module: sale_commission_salesman #: model:ir.model,name:sale_commission_salesman.model_sale_order_line msgid "Sales Order Line" msgstr "" #. module: sale_commission_salesman +#. odoo-python #: code:addons/sale_commission_salesman/models/res_partner.py:0 #, python-format msgid "You can't have a salesman auto-agent without commission." diff --git a/sale_commission_salesman/i18n/sale_commission_salesman.pot b/sale_commission_salesman/i18n/sale_commission_salesman.pot index 6a81efd62..5e0a280ea 100644 --- a/sale_commission_salesman/i18n/sale_commission_salesman.pot +++ b/sale_commission_salesman/i18n/sale_commission_salesman.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 15.0\n" +"Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -44,6 +44,7 @@ msgid "Sales Order Line" msgstr "" #. module: sale_commission_salesman +#. odoo-python #: code:addons/sale_commission_salesman/models/res_partner.py:0 #, python-format msgid "You can't have a salesman auto-agent without commission." diff --git a/sale_commission_salesman/static/description/index.html b/sale_commission_salesman/static/description/index.html index ee60fe610..2c635dd2f 100644 --- a/sale_commission_salesman/static/description/index.html +++ b/sale_commission_salesman/static/description/index.html @@ -1,20 +1,20 @@ - + - + Sales commissions from salesman -
    -

    Sales commissions from salesman

    +
    + + +Odoo Community Association + +
    +

    Sales commissions from salesman

    -

    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 extends the functionality of sale_commission to allow you to auto-populate salesmen as commission agents without setting explicitly them on the customer.

    @@ -393,7 +398,7 @@

    Sales commissions from salesman

-

Configuration

+

Configuration

  1. Go to Contacts.
  2. Search for the contact linked to the salesman user and open it.
  3. @@ -404,7 +409,7 @@

    Configuration

-

Usage

+

Usage

To use this module, you need to:

  1. Go to Sales > Orders > Quotations and create a new one.
  2. @@ -415,30 +420,30 @@

    Usage

-

Known issues / Roadmap

+

Known issues / Roadmap

  • This module can be split into 2: account_commission_salesman and sale_commission_salesman.
-

Bug Tracker

+

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.

-

Credits

+

Credits

-

Authors

+

Authors

  • Tecnativa
-

Contributors

+

Contributors

-

Other credits

+

Other credits

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -463,10 +468,11 @@

Maintainers

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.

-

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_salesman/tests/test_sale_commission_salesman.py b/sale_commission_salesman/tests/test_sale_commission_salesman.py index 86bd5f290..c1f1689a7 100644 --- a/sale_commission_salesman/tests/test_sale_commission_salesman.py +++ b/sale_commission_salesman/tests/test_sale_commission_salesman.py @@ -2,10 +2,12 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo import exceptions -from odoo.tests import Form, TransactionCase +from odoo.tests import Form +from odoo.addons.base.tests.common import BaseCommon -class TestSaleCommissionSalesman(TransactionCase): + +class TestSaleCommissionSalesman(BaseCommon): @classmethod def setUpClass(cls): super().setUpClass() diff --git a/sale_commission_salesman/views/res_partner_views.xml b/sale_commission_salesman/views/res_partner_views.xml index 6873e599d..3d0442a36 100644 --- a/sale_commission_salesman/views/res_partner_views.xml +++ b/sale_commission_salesman/views/res_partner_views.xml @@ -4,7 +4,7 @@ res.partner - + From 8085f5f8ded6fef6b6482e074d91ce6545d3a6c0 Mon Sep 17 00:00:00 2001 From: "Omar (Comunitea)" Date: Mon, 9 Mar 2026 17:35:49 +0100 Subject: [PATCH 20/20] [MIG] sale_commission_salesman: Migration to 19.0 --- sale_commission_salesman/README.rst | 24 +++++++++---------- sale_commission_salesman/__manifest__.py | 2 +- .../static/description/index.html | 6 ++--- .../tests/test_sale_commission_salesman.py | 4 ++-- .../views/res_partner_views.xml | 1 - 5 files changed, 18 insertions(+), 19 deletions(-) diff --git a/sale_commission_salesman/README.rst b/sale_commission_salesman/README.rst index fce741789..a8542653b 100644 --- a/sale_commission_salesman/README.rst +++ b/sale_commission_salesman/README.rst @@ -21,13 +21,13 @@ Sales commissions from salesman :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/18.0/sale_commission_salesman + :target: https://github.com/OCA/commission/tree/19.0/sale_commission_salesman :alt: OCA/commission .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/commission-18-0/commission-18-0-sale_commission_salesman + :target: https://translation.odoo-community.org/projects/commission-19-0/commission-19-0-sale_commission_salesman :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/commission&target_branch=18.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/commission&target_branch=19.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -69,8 +69,8 @@ To use this module, you need to: Known issues / Roadmap ====================== -- This module can be split into 2: account_commission_salesman and - sale_commission_salesman. +- This module can be split into 2: account_commission_salesman and + sale_commission_salesman. Bug Tracker =========== @@ -78,7 +78,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. @@ -93,16 +93,16 @@ Authors Contributors ------------ -- `Tecnativa `__: +- `Tecnativa `__: - - Pedro M. Baeza + - Pedro M. Baeza Other credits ------------- -- Part of the icon made from Icon Fonts is licensed - by CC BY 3.0 +- Part of the icon made from Icon Fonts is licensed + by CC BY 3.0 Maintainers ----------- @@ -117,6 +117,6 @@ 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. -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_salesman/__manifest__.py b/sale_commission_salesman/__manifest__.py index de4623399..c7177361d 100644 --- a/sale_commission_salesman/__manifest__.py +++ b/sale_commission_salesman/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Sales commissions from salesman", - "version": "18.0.1.0.0", + "version": "19.0.1.0.0", "author": "Tecnativa, Odoo Community Association (OCA)", "category": "Sales", "website": "https://github.com/OCA/commission", diff --git a/sale_commission_salesman/static/description/index.html b/sale_commission_salesman/static/description/index.html index 3dabebb1e..b149ab022 100644 --- a/sale_commission_salesman/static/description/index.html +++ b/sale_commission_salesman/static/description/index.html @@ -374,7 +374,7 @@

Sales commissions from salesman

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:ba31b1a5050119c8e6c5131c1c014ac4b82839834d368be7b34bd7eedff3f23d !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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 extends the functionality of sale_commission to allow you to auto-populate salesmen as commission agents without setting explicitly them on the customer.

@@ -431,7 +431,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.

@@ -468,7 +468,7 @@

Maintainers

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.

-

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_salesman/tests/test_sale_commission_salesman.py b/sale_commission_salesman/tests/test_sale_commission_salesman.py index c1f1689a7..99038789a 100644 --- a/sale_commission_salesman/tests/test_sale_commission_salesman.py +++ b/sale_commission_salesman/tests/test_sale_commission_salesman.py @@ -62,7 +62,7 @@ def test_sale_commission_salesman(self): self.assertTrue(line.agent_ids.commission_id, self.commission_1) def test_sale_commission_salesman_no_population(self): - self.partner.agent_ids = [(4, self.other_agent.id)] + self.partner.commission_agent_ids = [(4, self.other_agent.id)] line = self.env["sale.order.line"].create( {"order_id": self.sale_order.id, "product_id": self.product.id} ) @@ -80,7 +80,7 @@ def test_invoice_commission_salesman(self): self.assertTrue(line.agent_ids.commission_id, self.commission_1) def test_invoice_commission_salesman_no_population(self): - self.partner.agent_ids = [(4, self.other_agent.id)] + self.partner.commission_agent_ids = [(4, self.other_agent.id)] invoice_form = Form(self.invoice) with invoice_form.invoice_line_ids.new() as line_form: line_form.product_id = self.product diff --git a/sale_commission_salesman/views/res_partner_views.xml b/sale_commission_salesman/views/res_partner_views.xml index 3d0442a36..42267c53d 100644 --- a/sale_commission_salesman/views/res_partner_views.xml +++ b/sale_commission_salesman/views/res_partner_views.xml @@ -7,7 +7,6 @@ -