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',