From ff03b0e66e41b0d1ad72d0ad10c83a7fb157cae6 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Fri, 12 Jun 2020 17:05:10 +0200 Subject: [PATCH 01/16] [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 6145f881c8e2c8ffd2a242494b394f8762540a8c Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Mon, 27 Jul 2020 20:36:12 +0200 Subject: [PATCH 02/16] [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 e26ef3744240cd81c4978c61c9cc03a456722397 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Fri, 7 Aug 2020 19:09:54 +0200 Subject: [PATCH 03/16] [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 cee1e110e36c2815ac4cb614a53cb50dc7bcbac2 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Fri, 7 Aug 2020 20:09:43 +0200 Subject: [PATCH 04/16] [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/16] 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 37463b0463a28f74f6d5900b876a5e2fa3ab393d 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/16] 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 c0a0289bcfe60cf55ea4a83cce47172827a9bb1f 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/16] 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 f6f65d8cf3b144b7b639b66a46edd44d74f95e05 Mon Sep 17 00:00:00 2001 From: jabelchi Date: Fri, 4 Jun 2021 08:00:38 +0000 Subject: [PATCH 08/16] 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 bf242f87c73cbb3e267458fa8feac8799c8074cf Mon Sep 17 00:00:00 2001 From: aromera Date: Mon, 10 Jan 2022 14:04:46 +0100 Subject: [PATCH 09/16] [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 d7192ea8ef954c87944ab315923c536aede618ef Mon Sep 17 00:00:00 2001 From: Francesco Foresti Date: Wed, 21 Dec 2022 10:48:09 +0000 Subject: [PATCH 10/16] 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 9cf68686066af66b8d0e4ac9fe14d2a25ee18508 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/16] [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 4601b8fd3ae4a57a70f15e5325dcc0a579601241 Mon Sep 17 00:00:00 2001 From: "Omar (Comunitea)" Date: Thu, 25 May 2023 01:20:37 +0200 Subject: [PATCH 12/16] [MIG] sale_commission_salesman: Migration to 16.0 --- sale_commission_salesman/__manifest__.py | 2 +- .../odoo/addons/sale_commission_salesman | 1 + setup/sale_commission_salesman/setup.py | 6 ++++++ 3 files changed, 8 insertions(+), 1 deletion(-) create mode 120000 setup/sale_commission_salesman/odoo/addons/sale_commission_salesman create mode 100644 setup/sale_commission_salesman/setup.py 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/setup/sale_commission_salesman/odoo/addons/sale_commission_salesman b/setup/sale_commission_salesman/odoo/addons/sale_commission_salesman new file mode 120000 index 000000000..8b6e29445 --- /dev/null +++ b/setup/sale_commission_salesman/odoo/addons/sale_commission_salesman @@ -0,0 +1 @@ +../../../../sale_commission_salesman \ No newline at end of file diff --git a/setup/sale_commission_salesman/setup.py b/setup/sale_commission_salesman/setup.py new file mode 100644 index 000000000..28c57bb64 --- /dev/null +++ b/setup/sale_commission_salesman/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) From e7eda76205a19d897b7eca428b4ecf087461cba0 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Tue, 22 Aug 2023 10:50:31 +0000 Subject: [PATCH 13/16] [UPD] Update sale_commission_salesman.pot --- sale_commission_salesman/i18n/sale_commission_salesman.pot | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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." From 3cdf00bfa4942cf5702f1a58a0939b1fa963e028 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 22 Aug 2023 10:53:59 +0000 Subject: [PATCH 14/16] [UPD] addons table in README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 8421c3f4b..1076269fd 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ addon | version | maintainers | summary [commission](commission/) | 16.0.1.2.0 | [![pedrobaeza](https://github.com/pedrobaeza.png?size=30px)](https://github.com/pedrobaeza) | Commissions [hr_commission](hr_commission/) | 16.0.1.0.0 | | HR commissions [sale_commission](sale_commission/) | 16.0.1.0.1 | [![pedrobaeza](https://github.com/pedrobaeza.png?size=30px)](https://github.com/pedrobaeza) | Sales commissions +[sale_commission_salesman](sale_commission_salesman/) | 16.0.1.0.0 | | Sales commissions from salesman [//]: # (end addons) From 346b22f216f2355c0c77fa34fdc7cbdd79917a73 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 22 Aug 2023 10:54:00 +0000 Subject: [PATCH 15/16] [UPD] README.rst --- sale_commission_salesman/README.rst | 10 +++++----- sale_commission_salesman/static/description/index.html | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/sale_commission_salesman/README.rst b/sale_commission_salesman/README.rst index 6a9a73ee8..856167439 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/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 + :target: https://runbot.odoo-community.org/runbot/165/16.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -69,7 +69,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. @@ -106,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/static/description/index.html b/sale_commission_salesman/static/description/index.html index ee60fe610..a8c3de65a 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.

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

    @@ -455,7 +455,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 bd7a98689112062c3eae623e50df5607734b0ac6 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 22 Aug 2023 10:54:00 +0000 Subject: [PATCH 16/16] [ADD] setup.py --- setup/_metapackage/VERSION.txt | 2 +- setup/_metapackage/setup.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/setup/_metapackage/VERSION.txt b/setup/_metapackage/VERSION.txt index 252a39160..c000a773c 100644 --- a/setup/_metapackage/VERSION.txt +++ b/setup/_metapackage/VERSION.txt @@ -1 +1 @@ -16.0.20230814.0 \ No newline at end of file +16.0.20230822.0 \ No newline at end of file diff --git a/setup/_metapackage/setup.py b/setup/_metapackage/setup.py index 159ff7d87..0cc3ae74f 100644 --- a/setup/_metapackage/setup.py +++ b/setup/_metapackage/setup.py @@ -12,6 +12,7 @@ 'odoo-addon-commission>=16.0dev,<16.1dev', 'odoo-addon-hr_commission>=16.0dev,<16.1dev', 'odoo-addon-sale_commission>=16.0dev,<16.1dev', + 'odoo-addon-sale_commission_salesman>=16.0dev,<16.1dev', ], classifiers=[ 'Programming Language :: Python',