[FIX] sale: analytic plan with applicability on invoice

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) <wan@odoo.com>
This commit is contained in:
Yolann Sabaux
2023-01-17 21:54:46 +01:00
parent 9d7236334a
commit 45dd909fae
2 changed files with 39 additions and 5 deletions
+5 -5
View File
@@ -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:
+34
View File
@@ -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',