diff --git a/addons/crm/models/crm_lead.py b/addons/crm/models/crm_lead.py index c28cbe080f7..5b15a87d5ad 100644 --- a/addons/crm/models/crm_lead.py +++ b/addons/crm/models/crm_lead.py @@ -84,15 +84,24 @@ class Lead(models.Model): 'format.address.mixin', ] _primary_email = 'email_from' + _check_company_auto = True # Description name = fields.Char( 'Opportunity', index=True, required=True, compute='_compute_name', readonly=False, store=True) - user_id = fields.Many2one('res.users', string='Salesperson', index=True, tracking=True, default=lambda self: self.env.user) + user_id = fields.Many2one( + 'res.users', string='Salesperson', default=lambda self: self.env.user, + domain="['&', ('share', '=', False), ('company_ids', 'in', user_company_ids)]", + check_company=True, index=True, tracking=True) + user_company_ids = fields.Many2many( + 'res.company', compute='_compute_user_company_ids', + help='UX: Limit to lead company or all if no company') user_email = fields.Char('User Email', related='user_id.email', readonly=True) user_login = fields.Char('User Login', related='user_id.login', readonly=True) - company_id = fields.Many2one('res.company', string='Company', index=True, default=lambda self: self.env.company.id) + company_id = fields.Many2one( + 'res.company', string='Company', index=True, + compute='_compute_company_id', readonly=False, store=True) referred = fields.Char('Referred By') description = fields.Text('Notes') active = fields.Boolean('Active', default=True, tracking=True) @@ -104,7 +113,8 @@ class Lead(models.Model): crm_stage.AVAILABLE_PRIORITIES, string='Priority', index=True, default=crm_stage.AVAILABLE_PRIORITIES[0][0]) team_id = fields.Many2one( - 'crm.team', string='Sales Team', index=True, tracking=True, + 'crm.team', string='Sales Team', check_company=True, index=True, tracking=True, + domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]", compute='_compute_team_id', readonly=False, store=True) stage_id = fields.Many2one( 'crm.stage', string='Stage', index=True, tracking=True, @@ -149,7 +159,7 @@ class Lead(models.Model): date_deadline = fields.Date('Expected Closing', help="Estimate of the date on which the opportunity will be won.") # Customer / contact partner_id = fields.Many2one( - 'res.partner', string='Customer', index=True, tracking=10, + 'res.partner', string='Customer', check_company=True, index=True, tracking=10, domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]", help="Linked partner (optional). Usually created when converting the lead. You can find a partner by its Name, TIN, Email or Internal Reference.") partner_is_blacklisted = fields.Boolean('Partner is blacklisted', related='partner_id.is_blacklisted', readonly=True) @@ -240,6 +250,15 @@ class Lead(models.Model): def _search_activity_date_deadline_my(self, operator, operand): return ['&', ('activity_ids.user_id', '=', self._uid), ('activity_ids.date_deadline', operator, operand)] + @api.depends('company_id') + def _compute_user_company_ids(self): + all_companies = self.env['res.company'].search([]) + for lead in self: + if not lead.company_id: + lead.user_company_ids = all_companies + else: + lead.user_company_ids = lead.company_id + @api.depends('user_id', 'type') def _compute_team_id(self): """ When changing the user, also set a team_id or restrict team id @@ -255,6 +274,32 @@ class Lead(models.Model): team = self.env['crm.team']._get_default_team_id(user_id=user.id, domain=team_domain) lead.team_id = team.id + @api.depends('user_id', 'team_id') + def _compute_company_id(self): + """ Compute company_id coherency. """ + 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 + + # 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: + proposal = False + + # set a new company + if lead.company_id != proposal: + lead.company_id = proposal + @api.depends('team_id', 'type') def _compute_stage_id(self): for lead in self: diff --git a/addons/crm/tests/test_crm_lead_convert_mass.py b/addons/crm/tests/test_crm_lead_convert_mass.py index 82126f9a821..f22679f8ef0 100644 --- a/addons/crm/tests/test_crm_lead_convert_mass.py +++ b/addons/crm/tests/test_crm_lead_convert_mass.py @@ -24,7 +24,7 @@ class TestLeadConvertMass(crm_common.TestLeadConvertMassCommon): with self.assertQueryCount(user_sales_manager=0): test_leads = self.env['crm.lead'].browse(test_leads.ids) - with self.assertQueryCount(user_sales_manager=254): # crm only: 251 + with self.assertQueryCount(user_sales_manager=254): # crm only: 252 test_leads._handle_salesmen_assignment(user_ids=user_ids, team_id=False) self.assertEqual(test_leads.team_id, self.sales_team_convert | self.sales_team_1) @@ -42,7 +42,7 @@ class TestLeadConvertMass(crm_common.TestLeadConvertMassCommon): with self.assertQueryCount(user_sales_manager=0): test_leads = self.env['crm.lead'].browse(test_leads.ids) - with self.assertQueryCount(user_sales_manager=220): # crm only: 215 + with self.assertQueryCount(user_sales_manager=220): # crm only: 218 test_leads._handle_salesmen_assignment(user_ids=user_ids, team_id=team_id) self.assertEqual(test_leads.team_id, self.sales_team_convert) @@ -166,7 +166,7 @@ class TestLeadConvertMass(crm_common.TestLeadConvertMassCommon): test_leads = self._create_leads_batch(count=50, user_ids=[False]) user_ids = self.assign_users.ids - with self.assertQueryCount(user_sales_manager=1364): # crm only: 1353 + with self.assertQueryCount(user_sales_manager=1367): # crm only: 1357 mass_convert = self.env['crm.lead2opportunity.partner.mass'].with_context({ 'active_model': 'crm.lead', 'active_ids': test_leads.ids, diff --git a/addons/crm/views/crm_lead_views.xml b/addons/crm/views/crm_lead_views.xml index a729075970b..6d5de8beea6 100644 --- a/addons/crm/views/crm_lead_views.xml +++ b/addons/crm/views/crm_lead_views.xml @@ -213,10 +213,9 @@ - - + @@ -227,6 +226,7 @@ + @@ -338,7 +338,9 @@ - + + @@ -443,6 +445,7 @@ + @@ -669,7 +672,9 @@ - + +