diff --git a/addons/crm/models/crm_lead.py b/addons/crm/models/crm_lead.py index 94c46dc62c9..3b6ce1aeb4b 100644 --- a/addons/crm/models/crm_lead.py +++ b/addons/crm/models/crm_lead.py @@ -304,14 +304,15 @@ class Lead(models.Model): (not lead.partner_id or lead.partner_id.company_id != proposal): proposal = False - # propose a new company based on responsible, limited by team + # propose a new company based on team > user (respecting context) > partner if not proposal: - if lead.user_id and lead.team_id.company_id: + if lead.team_id.company_id: proposal = lead.team_id.company_id elif lead.user_id: - proposal = lead.user_id.company_id & self.env.companies - elif lead.team_id: - proposal = lead.team_id.company_id + if self.env.company in lead.user_id.company_ids: + proposal = self.env.company + else: + proposal = lead.user_id.company_id & self.env.companies elif lead.partner_id: proposal = lead.partner_id.company_id else: diff --git a/addons/crm/tests/test_crm_lead_multicompany.py b/addons/crm/tests/test_crm_lead_multicompany.py index 9cdab1aa562..583bfee4032 100644 --- a/addons/crm/tests/test_crm_lead_multicompany.py +++ b/addons/crm/tests/test_crm_lead_multicompany.py @@ -90,32 +90,94 @@ class TestCRMLeadMultiCompany(TestCrmCommon): @users('user_sales_manager_mc') def test_lead_mc_company_computation_env_user_restrict(self): """ Check that the computed company is allowed (aka in self.env.companies). - User is logged in company_main even their default default company is - company_2. """ + If the assigned team has a set company, the lead has the same one. Otherwise, use one + allowed by user, preferentially choose env current company, user's company otherwise.""" + # User is logged in company_main even their default company is company_2 LeadUnsyncCids = self.env['crm.lead'].with_context(allowed_company_ids=[self.company_main.id]) self.assertEqual(LeadUnsyncCids.env.company, self.company_main) self.assertEqual(LeadUnsyncCids.env.companies, self.company_main) self.assertEqual(LeadUnsyncCids.env.user.company_id, self.company_2) # simulate auto-creation through sudo (assignment-like) - lead = LeadUnsyncCids.sudo().create({ - 'name': 'My Lead MC', + lead_1_auto = LeadUnsyncCids.sudo().create({ + 'name': 'My Lead MC 1 Auto', }) - self.assertFalse(lead.company_id, - 'Lead: due to MC rule, avoid setting a company when it would cause crashes') - self.assertEqual(lead.team_id, self.sales_team_1, - 'Lead: due to MC rule, took first availability in other company') - self.assertEqual(lead.user_id, self.user_sales_manager_mc) - + self.assertEqual(lead_1_auto.team_id, self.sales_team_1, + '[Auto/1] First available team in current company should have been assigned (fallback as user in no team in Main Company).') + self.assertEqual(lead_1_auto.company_id, self.company_main, + '[Auto/1] Current company should be set on the lead as no company was assigned given by team and company is allowed for user.') + self.assertEqual(lead_1_auto.user_id, self.user_sales_manager_mc, '[Auto/1] Current user should have been assigned.') # manual creation - lead = LeadUnsyncCids.create({ + lead_1_manual = LeadUnsyncCids.create({ 'name': 'My Lead MC', }) - self.assertFalse(lead.company_id, - 'Lead: due to MC rule, avoid setting a company when it would cause crashes') - self.assertEqual(lead.team_id, self.sales_team_1) - self.assertEqual(lead.user_id, self.user_sales_manager_mc) + self.assertEqual(lead_1_manual.team_id, self.sales_team_1, + '[Auto/1] First available team in current company should have been assigned (fallback as user in no team in Main Company).') + self.assertEqual(lead_1_manual.company_id, self.company_main, + '[Auto/1] Current company should be set on the lead as no company was given by team and company is allowed for user.') + self.assertEqual(lead_1_manual.user_id, self.user_sales_manager_mc, '[Manual/1] Current user should have been assigned.') + # Logged on other company will use that one for the lead company with sales_team_2 as is assigned to company_2 + LeadUnsyncCids = self.env['crm.lead'].with_context(allowed_company_ids=[self.company_main.id, self.company_2.id]) + LeadUnsyncCids = LeadUnsyncCids.with_company(self.company_2) + self.assertEqual(LeadUnsyncCids.env.company, self.company_2) + + lead_2_auto = LeadUnsyncCids.sudo().create({ + 'name': 'My Lead MC 2 Auto', + }) + self.assertEqual(lead_2_auto.team_id, self.team_company2, + '[Auto/2] First available team user is a member of, in current company, should have been assigned.') + self.assertEqual(lead_2_auto.company_id, self.company_2, + '[Auto/2] Current company should be set on the lead as company was assigned on team.') + self.assertEqual(lead_2_auto.user_id, self.user_sales_manager_mc, '[Auto/2] Current user should have been assigned.') + lead_2_manual = LeadUnsyncCids.create({ + 'name': 'My Lead MC 2 Manual', + }) + self.assertEqual(lead_2_manual.team_id, self.team_company2, + '[Manual/2] First available team user is a member of, in current company, should have been assigned.') + self.assertEqual(lead_2_manual.company_id, self.company_2, + '[Manual/2] Current company should be set on the lead as company was assigned on team.') + self.assertEqual(lead_2_manual.user_id, self.user_sales_manager_mc, '[Manual/2] Current user should have been assigned.') + + # If assigned team has no company, use company + self.team_company2.write({'company_id': False}) + lead_3_auto = LeadUnsyncCids.sudo().create({ + 'name': 'My Lead MC 3 Auto', + }) + self.assertEqual(lead_3_auto.team_id, self.team_company2, + '[Auto/3] First available team user is a member of should have been assigned (fallback as no team with same company defined).') + self.assertEqual(lead_3_auto.company_id, self.company_2, + '[Auto/3] Current company should be set on the lead as no company was given by team and company is allowed for user.') + self.assertEqual(lead_3_auto.user_id, self.user_sales_manager_mc, '[Auto/3] Current user should have been assigned.') + lead_3_manual = LeadUnsyncCids.create({ + 'name': 'My Lead MC 3 Manual', + }) + self.assertEqual(lead_3_manual.company_id, self.company_2, + '[Auto/3] First available team user is a member of should have been assigned (fallback as no team with same company defined).') + self.assertEqual(lead_3_manual.team_id, self.team_company2, + '[Auto/3] Current company should be set on the lead as no company was given by team and company is allowed for user.') + self.assertEqual(lead_3_manual.user_id, self.user_sales_manager_mc, '[Manual/3] Current user should have been assigned.') + + # If all teams have no company and don't have user as member, the first sales team is used. + self.team_company2.write({'member_ids': [(3, self.user_sales_manager_mc.id)]}) + + lead_4_auto = LeadUnsyncCids.sudo().create({ + 'name': 'My Lead MC 4 Auto', + }) + self.assertEqual(lead_4_auto.team_id, self.sales_team_1, + '[Auto/4] As no team has current user as member nor current company as company_id, first available team should have been assigned.') + self.assertEqual(lead_4_auto.company_id, self.company_2, + '[Auto/4] Current company should be set on the lead as no company was given by team and company is allowed for user.') + self.assertEqual(lead_4_auto.user_id, self.user_sales_manager_mc, '[Auto/4] Current user should have been assigned.') + lead_4_manual = LeadUnsyncCids.create({ + 'name': 'My Lead MC 4 Manual', + }) + self.assertEqual(lead_4_manual.company_id, self.company_2, + '[Manual/4] As no team has current user as member nor current company as company_id, first available team should have been assigned.') + self.assertEqual(lead_4_manual.team_id, self.sales_team_1, + '[Manual/4] Current company should be set on the lead as no company was given by team and company is allowed for user.') + self.assertEqual(lead_4_manual.user_id, self.user_sales_manager_mc, + '[Manual/4] Current user should have been assigned.') @users('user_sales_manager_mc') def test_lead_mc_company_computation_partner_restrict(self): diff --git a/addons/crm/tests/test_performances.py b/addons/crm/tests/test_performances.py index b0103b90406..20d148ba372 100644 --- a/addons/crm/tests/test_performances.py +++ b/addons/crm/tests/test_performances.py @@ -175,7 +175,7 @@ class TestLeadAssignPerf(TestLeadAssignCommon): leads.flush_recordset() with self.with_user('user_sales_manager'): - with self.assertQueryCount(user_sales_manager=6279): + with self.assertQueryCount(user_sales_manager=6280): self.env['crm.team'].browse(sales_teams.ids)._action_assign_leads(work_days=30) # teams assign diff --git a/addons/test_event_full/tests/test_performance.py b/addons/test_event_full/tests/test_performance.py index 1b8254d8d92..c7b6b157927 100644 --- a/addons/test_event_full/tests/test_performance.py +++ b/addons/test_event_full/tests/test_performance.py @@ -234,7 +234,7 @@ class TestRegistrationPerformance(EventPerformanceCase): """ event = self.env['event.event'].browse(self.test_event.ids) - with freeze_time(self.reference_now), self.assertQueryCount(event_user=686): # tef only: 639 - com runbot 681 + with freeze_time(self.reference_now), self.assertQueryCount(event_user=687): # tef only: 640 - com runbot 682 self.env.cr._now = self.reference_now # force create_date to check schedulers registration_values = [ dict(reg_data, @@ -280,7 +280,7 @@ class TestRegistrationPerformance(EventPerformanceCase): form like) """ event = self.env['event.event'].browse(self.test_event.ids) - with freeze_time(self.reference_now), self.assertQueryCount(event_user=697): # tef only: 650 - com runbot 692 + with freeze_time(self.reference_now), self.assertQueryCount(event_user=698): # tef only: 651 - com runbot 693 self.env.cr._now = self.reference_now # force create_date to check schedulers registration_values = [ dict(reg_data, @@ -301,7 +301,7 @@ class TestRegistrationPerformance(EventPerformanceCase): """ Test a single registration creation using Form """ event = self.env['event.event'].browse(self.test_event.ids) - with freeze_time(self.reference_now), self.assertQueryCount(event_user=202): # tef only: 184 - com runbot: 189 + with freeze_time(self.reference_now), self.assertQueryCount(event_user=203): # tef only: 185 - com runbot: 190 self.env.cr._now = self.reference_now # force create_date to check schedulers with Form(self.env['event.registration']) as reg_form: reg_form.event_id = event @@ -317,7 +317,7 @@ class TestRegistrationPerformance(EventPerformanceCase): """ Test a single registration creation using Form """ event = self.env['event.event'].browse(self.test_event.ids) - with freeze_time(self.reference_now), self.assertQueryCount(event_user=209): # tef only: 188 - com runbot: 193 + with freeze_time(self.reference_now), self.assertQueryCount(event_user=210): # tef only: 189 - com runbot: 194 self.env.cr._now = self.reference_now # force create_date to check schedulers with Form(self.env['event.registration']) as reg_form: reg_form.event_id = event @@ -330,7 +330,7 @@ class TestRegistrationPerformance(EventPerformanceCase): """ Test a single registration creation using Form """ event = self.env['event.event'].browse(self.test_event.ids) - with freeze_time(self.reference_now), self.assertQueryCount(event_user=124): # tef only: 120? - com runbot 108 - ent runbot 122 + with freeze_time(self.reference_now), self.assertQueryCount(event_user=125): # tef only: 121? - com runbot 109 self.env.cr._now = self.reference_now # force create_date to check schedulers with Form(self.env['event.registration'].with_context(event_lead_rule_skip=True)) as reg_form: reg_form.event_id = event @@ -344,7 +344,7 @@ class TestRegistrationPerformance(EventPerformanceCase): event = self.env['event.event'].browse(self.test_event.ids) # simple customer data - with freeze_time(self.reference_now), self.assertQueryCount(event_user=125): # tef only: 106 - com runbot: 122 + with freeze_time(self.reference_now), self.assertQueryCount(event_user=126): # tef only: 107 - com runbot: 123 self.env.cr._now = self.reference_now # force create_date to check schedulers registration_values = dict( self.customer_data[0], @@ -358,7 +358,7 @@ class TestRegistrationPerformance(EventPerformanceCase): event = self.env['event.event'].browse(self.test_event.ids) # partner-based customer - with freeze_time(self.reference_now), self.assertQueryCount(event_user=129): # tef only: 118 - com runbot: 125 + with freeze_time(self.reference_now), self.assertQueryCount(event_user=130): # tef only: 119 - com runbot: 126 self.env.cr._now = self.reference_now # force create_date to check schedulers registration_values = { 'event_id': event.id, @@ -373,7 +373,7 @@ class TestRegistrationPerformance(EventPerformanceCase): event = self.env['event.event'].browse(self.test_event.ids) # partner-based customer - with freeze_time(self.reference_now), self.assertQueryCount(event_user=46): # tef only: 40 - com runbot: 42 + with freeze_time(self.reference_now), self.assertQueryCount(event_user=47): # tef only: 40 - com runbot: 42 self.env.cr._now = self.reference_now # force create_date to check schedulers registration_values = { 'event_id': event.id, @@ -388,7 +388,7 @@ class TestRegistrationPerformance(EventPerformanceCase): event = self.env['event.event'].browse(self.test_event.ids) # website customer data - with freeze_time(self.reference_now), self.assertQueryCount(event_user=135): # tef only: 124 - com runbot: 128 + with freeze_time(self.reference_now), self.assertQueryCount(event_user=136): # tef only: 125 - com runbot: 129 self.env.cr._now = self.reference_now # force create_date to check schedulers registration_values = dict( self.website_customer_data[0],