From 45dd909fae4a4ee22e70b4e22f7105edc6981e62 Mon Sep 17 00:00:00 2001 From: Yolann Sabaux Date: Tue, 17 Jan 2023 08:28:16 +0000 Subject: [PATCH] [FIX] sale: analytic plan with applicability on invoice MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Steps to reproduce * Create an analytic plan with the domain as `invoice` * Create an analytic account for the above plan * Create an analytic distribution model and include condition as account prefix (4000), and product. * Create a sale order, confirm and create an invoice Issue During the conversion from the Sale Order to the Invoice, the analytic plan is not applied Cause The analytic distribution is set even where there is none. Therefore, the compute is not trigger opw-3109003 closes odoo/odoo#110202 X-original-commit: fd5249ea8687f24e7c9c2a2a3bcbb8cc14333efd Signed-off-by: William André (wan) --- addons/sale/models/sale_order_line.py | 10 +++---- addons/sale/tests/test_sale_to_invoice.py | 34 +++++++++++++++++++++++ 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/addons/sale/models/sale_order_line.py b/addons/sale/models/sale_order_line.py index b50f610b893..1e6adcb837d 100644 --- a/addons/sale/models/sale_order_line.py +++ b/addons/sale/models/sale_order_line.py @@ -1081,17 +1081,17 @@ class SaleOrderLine(models.Model): 'discount': self.discount, 'price_unit': self.price_unit, 'tax_ids': [Command.set(self.tax_id.ids)], - 'analytic_distribution': self.analytic_distribution, 'sale_line_ids': [Command.link(self.id)], 'is_downpayment': self.is_downpayment, } analytic_account_id = self.order_id.analytic_account_id.id + if self.analytic_distribution and not self.display_type: + res['analytic_distribution'] = self.analytic_distribution if analytic_account_id and not self.display_type: - res['analytic_distribution'] = res['analytic_distribution'] or {} - if self.analytic_distribution: - res['analytic_distribution'][analytic_account_id] = self.analytic_distribution.get(analytic_account_id, 0) + 100 + if 'analytic_distribution' in res: + res['analytic_distribution'][analytic_account_id] = res['analytic_distribution'].get(analytic_account_id, 0) + 100 else: - res['analytic_distribution'][analytic_account_id] = 100 + res['analytic_distribution'] = {analytic_account_id: 100} if optional_values: res.update(optional_values) if self.display_type: diff --git a/addons/sale/tests/test_sale_to_invoice.py b/addons/sale/tests/test_sale_to_invoice.py index a7851b69451..7fd395c334a 100644 --- a/addons/sale/tests/test_sale_to_invoice.py +++ b/addons/sale/tests/test_sale_to_invoice.py @@ -494,6 +494,40 @@ class TestSaleToInvoice(TestSaleCommon): aml = self.env['account.move.line'].search([('move_id', 'in', so.invoice_ids.ids)])[0] self.assertRecordValues(aml, [{'analytic_distribution': {str(analytic_account_default.id): 100, str(analytic_account_so.id): 100}}]) + def test_invoice_analytic_rule_with_account_prefix(self): + """ + Test whether, when an analytic account rule is set within the scope (applicability) of invoice + and with an account prefix set, + the default analytic account is correctly set during the conversion from so to invoice + """ + self.env.user.groups_id += self.env.ref('analytic.group_analytic_accounting') + analytic_plan_default = self.env['account.analytic.plan'].create({ + 'name': 'default', + 'applicability_ids': [Command.create({ + 'business_domain': 'invoice', + 'applicability': 'optional', + })] + }) + analytic_account_default = self.env['account.analytic.account'].create({'name': 'default', 'plan_id': analytic_plan_default.id}) + + analytic_distribution_model = self.env['account.analytic.distribution.model'].create({ + 'account_prefix': '400000', + 'analytic_distribution': {analytic_account_default.id: 100}, + 'product_id': self.product_a.id, + }) + + so = self.env['sale.order'].create({'partner_id': self.partner_a.id}) + self.env['sale.order.line'].create({ + 'order_id': so.id, + 'name': 'test', + 'product_id': self.product_a.id + }) + self.assertFalse(so.order_line.analytic_distribution, "There should be no tag set.") + so.action_confirm() + so.order_line.qty_delivered = 1 + aml = so._create_invoices().invoice_line_ids + self.assertRecordValues(aml, [{'analytic_distribution': analytic_distribution_model.analytic_distribution}]) + def test_invoice_after_product_return_price_not_default(self): so = self.env['sale.order'].create({ 'name': 'Sale order',