From de10f6093fab6bbb6fc6b2a1afb579cb790ff43f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Fran=C3=A7ois?= Date: Wed, 1 Sep 2021 08:39:45 +0000 Subject: [PATCH] [FIX] crm: Fix lead multicompany issue MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Context ------- Leads get assigned a different company than the one defined on the salesman after being merged with another lead. This happens because some leads assigned to a user_id have no company set. They are merged with leads that receive self.env.company during assigment to the to the team and then get merged with the lead without company. So the company of the new lead is written on the old one. Behavior before this PR ----------------------- When the crm.team have the field company_id = False With the following flow 1) Create a lead without a user_id and a team_id 2) Assign a team to the lead 3) Assign a user_id The status of the company field on the lead is the following 1) set the company of the env.user 2) Keep the company of the lead 3) set the user company if the current company is not one of the allowed company of the user Behavior after this PR ---------------------- 1) set the company of the env.user 2) set the company of the team even if it's False (so erase the company if the team has no company set) 3) set the user company if the current company is not one of the allowed company of the user Other changes ------------- When resetting team and user: void company to avoid having leads without any information but a company set. It eases assignment. Task-2520276 closes odoo/odoo#78860 X-original-commit: ff2a6949c3a59be98cd1849e7a2e38c6ccc3187e Signed-off-by: Thibault Delavallee (tde) Co-authored-by: Thibault Delavallée Co-authored-by: Thibault François --- addons/crm/models/crm_lead.py | 30 ++++++++++++------- .../crm/tests/test_crm_lead_multicompany.py | 21 ++++++------- 2 files changed, 28 insertions(+), 23 deletions(-) diff --git a/addons/crm/models/crm_lead.py b/addons/crm/models/crm_lead.py index 0e5ce514c78..eb4c57aca69 100644 --- a/addons/crm/models/crm_lead.py +++ b/addons/crm/models/crm_lead.py @@ -273,20 +273,28 @@ class Lead(models.Model): for lead in self: proposal = lead.company_id - # invalidate wrong configuration: company not in responsible companies or in team company if set - if proposal and lead.user_id and proposal not in lead.user_id.company_ids: - proposal = False - if proposal and lead.team_id.company_id and proposal != lead.team_id.company_id: - proposal = False + # invalidate wrong configuration + if proposal: + # company not in responsible companies + if lead.user_id and proposal not in lead.user_id.company_ids: + proposal = False + # inconsistent + if lead.team_id.company_id and proposal != lead.team_id.company_id: + proposal = False + # void company on team and no assignee + if lead.team_id and not lead.team_id.company_id and not lead.user_id: + proposal = False + # no user and no team -> void company and let assignment do its job + if not lead.team_id and not lead.user_id: + proposal = False # propose a new company based on responsible, limited by team if not proposal: - if not lead.user_id or lead.user_id == self.env.user: - proposal = self.env.company - elif lead.user_id: - proposal = lead.user_id.company_id - - if lead.team_id.company_id and proposal != lead.team_id.company_id: + if lead.user_id: + proposal = lead.team_id.company_id or lead.user_id.company_id + elif lead.team_id: + proposal = lead.team_id.company_id + else: proposal = False # set a new company diff --git a/addons/crm/tests/test_crm_lead_multicompany.py b/addons/crm/tests/test_crm_lead_multicompany.py index 035df831521..657d34800f5 100644 --- a/addons/crm/tests/test_crm_lead_multicompany.py +++ b/addons/crm/tests/test_crm_lead_multicompany.py @@ -31,8 +31,7 @@ class TestCRMLeadMultiCompany(TestCrmCommon): 'team_id': False, 'user_id': False, }) - # self.assertFalse(lead_no_team.company_id) FIXME: should not limit company - self.assertEqual(lead_no_team.company_id, self.user_sales_manager_mc.company_id) + self.assertFalse(lead_no_team.company_id) self.assertFalse(lead_no_team.team_id) self.assertFalse(lead_no_team.user_id) @@ -47,8 +46,7 @@ class TestCRMLeadMultiCompany(TestCrmCommon): # Update team wo company: reset lead company also lead_team_c2.team_id = self.sales_team_1 - # self.assertFalse(lead_team_c2.company_id) FIXME: currently kept - self.assertEqual(lead_team_c2.company_id, self.company_2) + self.assertFalse(lead_team_c2.company_id) # Lead with global team has no company lead_team_no_company = self.env['crm.lead'].create({ @@ -56,8 +54,7 @@ class TestCRMLeadMultiCompany(TestCrmCommon): 'team_id': self.sales_team_1.id, 'user_id': False, }) - # self.assertFalse(lead_no_team.company_id) FIXME: should not limit company - self.assertEqual(lead_no_team.company_id, self.user_sales_manager_mc.company_id) + self.assertFalse(lead_no_team.company_id) # Update team w company updates company lead_team_no_company.team_id = self.team_company2 @@ -88,12 +85,14 @@ class TestCRMLeadMultiCompany(TestCrmCommon): self.assertEqual(crm_lead_form.user_id, self.user_sales_manager_mc) self.assertEqual(crm_lead_form.team_id, self.env['crm.team']) - # remove both + # remove both: void company to ease assignment crm_lead_form.user_id = self.env['res.users'] - self.assertEqual(crm_lead_form.company_id, self.company_2) + self.assertEqual(crm_lead_form.company_id, self.env['res.company']) self.assertEqual(crm_lead_form.user_id, self.env['res.users']) self.assertEqual(crm_lead_form.team_id, self.env['crm.team']) + # force company manually + crm_lead_form.company_id = self.company_2 lead = crm_lead_form.save() # user_sales_manager cannot read it due to MC rules @@ -125,12 +124,10 @@ class TestCRMLeadMultiCompany(TestCrmCommon): 'team_id': False, }) crm_lead_form = Form(lead) - # self.assertEqual(crm_lead_form.company_id, self.env['res.company']) FIXME - self.assertEqual(crm_lead_form.company_id, self.company_2) + self.assertEqual(crm_lead_form.company_id, self.env['res.company']) crm_lead_form.team_id = self.sales_team_1 - # self.assertEqual(crm_lead_form.company_id, self.env['res.company']) # FIXME - self.assertEqual(crm_lead_form.company_id, self.company_2) + self.assertEqual(crm_lead_form.company_id, self.env['res.company']) crm_lead_form.user_id = self.env.user # self.assertEqual(crm_lead_form.company_id, self.env['res.company']) # FIXME