[FIX] analytic: check current company applicability

Have company A and company B
With company B:
- Create an analytic plan with default applicability 'Mandatory'
- Add an applicability: domain 'Expense', applicability 'Mandatory'
With company A:
- Open the same analytic plan
- Set default applicability 'Optional', no assigned applicability
- Add an analytc account for the plan
- Create an expense, add amount
- Create report > Submit to Mananger > Approve

Issue: Action will be blocked by Warning message
"One or more lines require a 100% analytic distribution."

This occurs because the system checks all applicabilities of the plan
without taking into account the company

opw-3709374

closes odoo/odoo#155195

Signed-off-by: William André (wan) <wan@odoo.com>
This commit is contained in:
Andrea Grazioso (agr-odoo)
2024-03-06 16:10:52 +00:00
parent f6ee5e4ad2
commit 60f053ba42
3 changed files with 27 additions and 2 deletions
+1 -1
View File
@@ -86,7 +86,7 @@ class AnalyticMixin(models.AbstractModel):
def _validate_distribution(self, **kwargs):
if self.env.context.get('validate_analytic', False):
mandatory_plans_ids = [plan['id'] for plan in self.env['account.analytic.plan'].sudo().get_relevant_plans(**kwargs) if plan['applicability'] == 'mandatory']
mandatory_plans_ids = [plan['id'] for plan in self.env['account.analytic.plan'].sudo().with_company(self.company_id).get_relevant_plans(**kwargs) if plan['applicability'] == 'mandatory']
if not mandatory_plans_ids:
return
decimal_precision = self.env['decimal.precision'].precision_get('Percentage Analytic')
+1 -1
View File
@@ -233,7 +233,7 @@ class AccountAnalyticPlan(models.Model):
else:
score = 0
applicability = self.default_applicability
for applicability_rule in self.applicability_ids:
for applicability_rule in self.applicability_ids.filtered(lambda rule: rule.company_id == self.env.company):
score_rule = applicability_rule._get_score(**kwargs)
if score_rule > score:
applicability = applicability_rule.applicability
@@ -67,3 +67,28 @@ class TestAnalyticPlanOperations(TransactionCase):
test_account.unlink()
plan.unlink()
distribution_model._validate_distribution()
def test_validate_company_plans(self):
company_2 = self.env['res.company'].create({
'name': 'company_2',
})
mandatory_plan = self.env['account.analytic.plan'].create([{
'name': 'Mandatory Plan',
'default_applicability': 'optional',
}])
mandatory_plan.with_company(company_2).write({'default_applicability': 'mandatory'})
self.env['account.analytic.applicability'].create({
'business_domain': 'general',
'analytic_plan_id': mandatory_plan.id,
'applicability': 'mandatory',
'company_id': company_2.id,
})
self.env['account.analytic.account'].create([{
'name': 'Mandatory Account',
'code': 'manda',
'plan_id': mandatory_plan.id,
}])
distribution_model = self.env['account.analytic.distribution.model'].create({}).with_context(validate_analytic=True)
# only mandatory applicability is in company_2, should not raise
distribution_model._validate_distribution(business_domain='general')