diff --git a/README.md b/README.md index 600f3ca25..7f6d0e4ff 100644 --- a/README.md +++ b/README.md @@ -21,11 +21,11 @@ Available addons ---------------- addon | version | maintainers | summary --- | --- | --- | --- -[account_commission](account_commission/) | 16.0.2.2.0 | [![pedrobaeza](https://github.com/pedrobaeza.png?size=30px)](https://github.com/pedrobaeza) | Account commissions +[account_commission](account_commission/) | 16.0.2.2.1 | [![pedrobaeza](https://github.com/pedrobaeza.png?size=30px)](https://github.com/pedrobaeza) | Account commissions [commission](commission/) | 16.0.2.1.0 | [![pedrobaeza](https://github.com/pedrobaeza.png?size=30px)](https://github.com/pedrobaeza) | Commissions [commission_formula](commission_formula/) | 16.0.1.0.0 | | Commissions computed by formulas [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](sale_commission/) | 16.0.1.0.2 | [![pedrobaeza](https://github.com/pedrobaeza.png?size=30px)](https://github.com/pedrobaeza) | Sales commissions [sale_commission_product_criteria](sale_commission_product_criteria/) | 16.0.1.0.0 | [![ilyasProgrammer](https://github.com/ilyasProgrammer.png?size=30px)](https://github.com/ilyasProgrammer) | Advanced commissions rules [sale_commission_salesman](sale_commission_salesman/) | 16.0.1.0.0 | | Sales commissions from salesman diff --git a/account_commission/README.rst b/account_commission/README.rst index eb47edde7..7370a3c5a 100644 --- a/account_commission/README.rst +++ b/account_commission/README.rst @@ -7,7 +7,7 @@ Account commissions !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:aebcf65d67c56dd22612b39b8beddce430bbf62d966760b7e5381d914fe4cb14 + !! source digest: sha256:77299b3b65fc7979bfd7818c3aed06a5912134599c1e0469f00ed5f220b2b5be !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -47,7 +47,9 @@ For selecting invoice status in commissions: #. Edit or create a new record to select the invoice status for settling the commissions. * **Invoice Based**: Commissions are settled when the invoice is issued. - * **Payment Based**: Commissions are settled when the invoice is paid. + * **Payment Based**: Commissions are settled when the invoice is paid or refunded. + Note that when refunding an invoice, the corresponding reversed commission will + be settled as well, resulting in a 0 net commission between both operations. Usage ===== diff --git a/account_commission/__manifest__.py b/account_commission/__manifest__.py index 71703c2cc..0e630c324 100644 --- a/account_commission/__manifest__.py +++ b/account_commission/__manifest__.py @@ -3,7 +3,7 @@ # Copyright 2014-2022 Tecnativa - Pedro M. Baeza { "name": "Account commissions", - "version": "16.0.2.2.0", + "version": "16.0.2.2.1", "author": "Tecnativa, Odoo Community Association (OCA)", "category": "Sales Management", "license": "AGPL-3", diff --git a/account_commission/i18n/account_commission.pot b/account_commission/i18n/account_commission.pot index f49c0c6a5..96dd6f6aa 100644 --- a/account_commission/i18n/account_commission.pot +++ b/account_commission/i18n/account_commission.pot @@ -439,7 +439,7 @@ msgstr "" msgid "" "Select the invoice status for settling the commissions:\n" "* 'Invoice Based': Commissions are settled when the invoice is issued.\n" -"* 'Payment Based': Commissions are settled when the invoice is paid." +"* 'Payment Based': Commissions are settled when the invoice is paid (or refunded)." msgstr "" #. module: account_commission diff --git a/account_commission/i18n/es.po b/account_commission/i18n/es.po index 9f0d98afd..f98c53aee 100644 --- a/account_commission/i18n/es.po +++ b/account_commission/i18n/es.po @@ -442,12 +442,9 @@ msgstr "Facturas de Ventas" msgid "" "Select the invoice status for settling the commissions:\n" "* 'Invoice Based': Commissions are settled when the invoice is issued.\n" -"* 'Payment Based': Commissions are settled when the invoice is paid." +"* 'Payment Based': Commissions are settled when the invoice is paid (or " +"refunded)." msgstr "" -"Seleccione el estado de la factura para liquidar las comisiones:\n" -"* 'Basado en factura': Las comisiones se liquidan cuando se emite la " -"factura.\n" -"* Pago\": Las comisiones se liquidan cuando se paga la factura." #. module: account_commission #: model:ir.model.fields,field_description:account_commission.field_account_invoice_line_agent__settled @@ -595,5 +592,15 @@ msgstr "Análisis de comisión facturada" msgid "invoices Commission Analysis" msgstr "Análisis de Comisiones facturadas" +#~ msgid "" +#~ "Select the invoice status for settling the commissions:\n" +#~ "* 'Invoice Based': Commissions are settled when the invoice is issued.\n" +#~ "* 'Payment Based': Commissions are settled when the invoice is paid." +#~ msgstr "" +#~ "Seleccione el estado de la factura para liquidar las comisiones:\n" +#~ "* 'Basado en factura': Las comisiones se liquidan cuando se emite la " +#~ "factura.\n" +#~ "* Pago\": Las comisiones se liquidan cuando se paga la factura." + #~ msgid "_Cancel" #~ msgstr "_Cancelar" diff --git a/account_commission/i18n/hr.po b/account_commission/i18n/hr.po index c71e8053b..2b237bec3 100644 --- a/account_commission/i18n/hr.po +++ b/account_commission/i18n/hr.po @@ -441,7 +441,8 @@ msgstr "" msgid "" "Select the invoice status for settling the commissions:\n" "* 'Invoice Based': Commissions are settled when the invoice is issued.\n" -"* 'Payment Based': Commissions are settled when the invoice is paid." +"* 'Payment Based': Commissions are settled when the invoice is paid (or " +"refunded)." msgstr "" #. module: account_commission diff --git a/account_commission/i18n/it.po b/account_commission/i18n/it.po index 9e89c9974..f6123f907 100644 --- a/account_commission/i18n/it.po +++ b/account_commission/i18n/it.po @@ -451,7 +451,8 @@ msgstr "Fatture di vendita" msgid "" "Select the invoice status for settling the commissions:\n" "* 'Invoice Based': Commissions are settled when the invoice is issued.\n" -"* 'Payment Based': Commissions are settled when the invoice is paid." +"* 'Payment Based': Commissions are settled when the invoice is paid (or " +"refunded)." msgstr "" #. module: account_commission diff --git a/account_commission/i18n/ja.po b/account_commission/i18n/ja.po index 8d7ac5fbe..adcc0c294 100644 --- a/account_commission/i18n/ja.po +++ b/account_commission/i18n/ja.po @@ -442,7 +442,8 @@ msgstr "販売請求書" msgid "" "Select the invoice status for settling the commissions:\n" "* 'Invoice Based': Commissions are settled when the invoice is issued.\n" -"* 'Payment Based': Commissions are settled when the invoice is paid." +"* 'Payment Based': Commissions are settled when the invoice is paid (or " +"refunded)." msgstr "" #. module: account_commission diff --git a/account_commission/i18n/pt.po b/account_commission/i18n/pt.po index 82050c0ed..cf1ccadbd 100644 --- a/account_commission/i18n/pt.po +++ b/account_commission/i18n/pt.po @@ -442,7 +442,8 @@ msgstr "Faturas de Vendas" msgid "" "Select the invoice status for settling the commissions:\n" "* 'Invoice Based': Commissions are settled when the invoice is issued.\n" -"* 'Payment Based': Commissions are settled when the invoice is paid." +"* 'Payment Based': Commissions are settled when the invoice is paid (or " +"refunded)." msgstr "" #. module: account_commission diff --git a/account_commission/i18n/pt_BR.po b/account_commission/i18n/pt_BR.po index de33a6f0e..2c3df8e15 100644 --- a/account_commission/i18n/pt_BR.po +++ b/account_commission/i18n/pt_BR.po @@ -442,7 +442,8 @@ msgstr "Faturas de Vendas" msgid "" "Select the invoice status for settling the commissions:\n" "* 'Invoice Based': Commissions are settled when the invoice is issued.\n" -"* 'Payment Based': Commissions are settled when the invoice is paid." +"* 'Payment Based': Commissions are settled when the invoice is paid (or " +"refunded)." msgstr "" #. module: account_commission diff --git a/account_commission/models/commission.py b/account_commission/models/commission.py index 5367c96db..964bf63bb 100644 --- a/account_commission/models/commission.py +++ b/account_commission/models/commission.py @@ -12,5 +12,5 @@ class Commission(models.Model): default="open", help="Select the invoice status for settling the commissions:\n" "* 'Invoice Based': Commissions are settled when the invoice is issued.\n" - "* 'Payment Based': Commissions are settled when the invoice is paid.", + "* 'Payment Based': Commissions are settled when the invoice is paid (or refunded).", ) diff --git a/account_commission/readme/CONFIGURE.rst b/account_commission/readme/CONFIGURE.rst index 78d97059d..04e0739b6 100644 --- a/account_commission/readme/CONFIGURE.rst +++ b/account_commission/readme/CONFIGURE.rst @@ -3,4 +3,6 @@ For selecting invoice status in commissions: #. Edit or create a new record to select the invoice status for settling the commissions. * **Invoice Based**: Commissions are settled when the invoice is issued. - * **Payment Based**: Commissions are settled when the invoice is paid. + * **Payment Based**: Commissions are settled when the invoice is paid or refunded. + Note that when refunding an invoice, the corresponding reversed commission will + be settled as well, resulting in a 0 net commission between both operations. diff --git a/account_commission/static/description/index.html b/account_commission/static/description/index.html index 92324729f..37a0eb141 100644 --- a/account_commission/static/description/index.html +++ b/account_commission/static/description/index.html @@ -366,7 +366,7 @@

Account commissions

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:aebcf65d67c56dd22612b39b8beddce430bbf62d966760b7e5381d914fe4cb14 +!! source digest: sha256:77299b3b65fc7979bfd7818c3aed06a5912134599c1e0469f00ed5f220b2b5be !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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

This module adds the function to calculate commissions in invoices (account moves).

@@ -392,7 +392,9 @@

Configuration

  1. Edit or create a new record to select the invoice status for settling the commissions.
diff --git a/account_commission/tests/test_account_commission.py b/account_commission/tests/test_account_commission.py index 203421216..f232642c4 100644 --- a/account_commission/tests/test_account_commission.py +++ b/account_commission/tests/test_account_commission.py @@ -7,7 +7,7 @@ from odoo import fields from odoo.exceptions import UserError, ValidationError -from odoo.tests import tagged +from odoo.tests import Form, tagged from odoo.addons.commission.tests.test_commission import TestCommissionBase @@ -532,3 +532,130 @@ def test_multi_currency(self): ] ) self.assertEqual(2, len(settlements)) + + def test_invoice_partial_refund(self): + commission = self.commission_net_paid + agent = self.agent_monthly + today = fields.Date.today() + # Create an invoice + invoice = self._create_invoice(agent, commission, today, currency=None) + invoice.action_post() + # Register payment for invoice + payment_journal = self.env["account.journal"].search( + [("type", "=", "cash"), ("company_id", "=", invoice.company_id.id)], + limit=1, + ) + register_payments = ( + self.env["account.payment.register"] + .with_context(active_ids=invoice.id, active_model="account.move") + .create({"journal_id": payment_journal.id}) + ) + register_payments.action_create_payments() + # Make a parcial refund for the invoice + move_reversal = ( + self.env["account.move.reversal"] + .with_context(active_model="account.move", active_ids=invoice.id) + .create( + { + "reason": "no reason", + "refund_method": "refund", + "journal_id": invoice.journal_id.id, + } + ) + ) + refund_form = Form( + self.env["account.move"].browse(move_reversal.reverse_moves()["res_id"]) + ) + with refund_form.invoice_line_ids.edit(0) as line: + line.price_unit -= 2 + refund = refund_form.save() + refund.action_post() + # Register payment for the refund + register_payments = ( + self.env["account.payment.register"] + .with_context(active_ids=refund.id, active_model="account.move") + .create({"journal_id": payment_journal.id}) + ) + register_payments.action_create_payments() + # check settlement creation. The commission must be (5 - 3) * 0.2 = 0.4 + self._settle_agent_invoice(agent, 1) + settlements = self.settle_model.search([("agent_id", "=", agent.id)]) + self.assertEqual(2, len(settlements.line_ids)) + self.assertEqual(0.4, sum(settlements.mapped("total"))) + + def test_invoice_full_refund(self): + commission = self.commission_net_paid + agent = self.agent_monthly + today = fields.Date.today() + # Create an invoice and refund it + invoice = self._create_invoice(agent, commission, today, currency=None) + invoice.action_post() + move_reversal = ( + self.env["account.move.reversal"] + .with_context(active_model="account.move", active_ids=invoice.id) + .create( + { + "reason": "no reason", + "refund_method": "cancel", + "journal_id": invoice.journal_id.id, + } + ) + ) + move_reversal.reverse_moves() + # check settlement creation. The commission must be: (5 - 5) * 0.2 = 0 + self._settle_agent_invoice(agent, 1) + settlements = self.settle_model.search( + [ + ("agent_id", "=", agent.id), + ] + ) + self.assertEqual(2, len(settlements.line_ids)) + self.assertEqual(0, sum(settlements.mapped("total"))) + + def test_invoice_modify_refund(self): + commission = self.commission_net_paid + agent = self.agent_monthly + today = fields.Date.today() + # Create an invoice + invoice = self._create_invoice(agent, commission, today, currency=None) + invoice.action_post() + # Create a full refund and a new invoice + move_reversal = ( + self.env["account.move.reversal"] + .with_context(active_model="account.move", active_ids=invoice.id) + .create( + { + "reason": "no reason", + "refund_method": "modify", + "journal_id": invoice.journal_id.id, + } + ) + ) + invoice2_form = Form( + self.env["account.move"].browse(move_reversal.reverse_moves()["res_id"]) + ) + with invoice2_form.invoice_line_ids.edit(0) as line: + line.price_unit -= 2 + invoice2 = invoice2_form.save() + invoice2.action_post() + # Register payment for the new invoice + payment_journal = self.env["account.journal"].search( + [("type", "=", "cash"), ("company_id", "=", invoice.company_id.id)], + limit=1, + ) + register_payments = ( + self.env["account.payment.register"] + .with_context(active_ids=invoice2.id, active_model="account.move") + .create({"journal_id": payment_journal.id}) + ) + register_payments.action_create_payments() + + # check settlement creation. The commission must be (5 - 5 + 3) * 0.2 = 0.6 + self._settle_agent_invoice(agent, 1) + settlements = self.settle_model.search( + [ + ("agent_id", "=", agent.id), + ] + ) + self.assertEqual(3, len(settlements.line_ids)) + self.assertAlmostEqual(0.6, sum(settlements.mapped("total")), 2) diff --git a/sale_commission/README.rst b/sale_commission/README.rst index c32daaf8e..df25f5083 100644 --- a/sale_commission/README.rst +++ b/sale_commission/README.rst @@ -7,7 +7,7 @@ Sales commissions !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:a831cdad5c12c2d94dc2a206d7e1fc2c869856f49b059bad263749394cc2e5bd + !! source digest: sha256:577b62db7c9362b9b324a6f77220633f88541e4216de3a5ec56a6ba16c98d09c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/sale_commission/__manifest__.py b/sale_commission/__manifest__.py index f8f8f2b18..e063d09a3 100644 --- a/sale_commission/__manifest__.py +++ b/sale_commission/__manifest__.py @@ -3,7 +3,7 @@ # Copyright 2014-2022 Tecnativa - Pedro M. Baeza { "name": "Sales commissions", - "version": "16.0.1.0.1", + "version": "16.0.1.0.2", "author": "Tecnativa, Odoo Community Association (OCA)", "category": "Sales Management", "license": "AGPL-3", diff --git a/sale_commission/static/description/index.html b/sale_commission/static/description/index.html index 6413c8843..fae7408c3 100644 --- a/sale_commission/static/description/index.html +++ b/sale_commission/static/description/index.html @@ -1,4 +1,3 @@ - @@ -367,7 +366,7 @@

Sales commissions

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:a831cdad5c12c2d94dc2a206d7e1fc2c869856f49b059bad263749394cc2e5bd +!! source digest: sha256:577b62db7c9362b9b324a6f77220633f88541e4216de3a5ec56a6ba16c98d09c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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

This module adds the function to calculate commissions in sales orders.

diff --git a/sale_commission/tests/test_sale_commission.py b/sale_commission/tests/test_sale_commission.py index 735b93481..f3898f52c 100644 --- a/sale_commission/tests/test_sale_commission.py +++ b/sale_commission/tests/test_sale_commission.py @@ -15,6 +15,13 @@ class TestSaleCommission(TestAccountCommission): @classmethod def setUpClass(cls): super().setUpClass() + cls.pricelist = cls.env["product.pricelist"].create( + { + "name": "Pricelist for tests", + "currency_id": cls.company.currency_id.id, + } + ) + cls.partner.property_product_pricelist = cls.pricelist cls.sale_order_model = cls.env["sale.order"] cls.advance_inv_model = cls.env["sale.advance.payment.inv"] cls.product.write({"invoice_policy": "order"})