From 60f053ba423ef02400bb8c2b5eef6019f8a6c766 Mon Sep 17 00:00:00 2001 From: "Andrea Grazioso (agr-odoo)" Date: Fri, 23 Feb 2024 12:46:51 +0100 Subject: [PATCH] [FIX] analytic: check current company applicability MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- addons/analytic/models/analytic_mixin.py | 2 +- addons/analytic/models/analytic_plan.py | 2 +- addons/analytic/tests/test_plan_operations.py | 25 +++++++++++++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/addons/analytic/models/analytic_mixin.py b/addons/analytic/models/analytic_mixin.py index 5577237923a..4f56de03a81 100644 --- a/addons/analytic/models/analytic_mixin.py +++ b/addons/analytic/models/analytic_mixin.py @@ -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') diff --git a/addons/analytic/models/analytic_plan.py b/addons/analytic/models/analytic_plan.py index 8b63f8bc911..4d25a3fe9a1 100644 --- a/addons/analytic/models/analytic_plan.py +++ b/addons/analytic/models/analytic_plan.py @@ -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 diff --git a/addons/analytic/tests/test_plan_operations.py b/addons/analytic/tests/test_plan_operations.py index 5a4a75f63c6..408afd28810 100644 --- a/addons/analytic/tests/test_plan_operations.py +++ b/addons/analytic/tests/test_plan_operations.py @@ -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')