diff --git a/addons/crm/models/crm_lead.py b/addons/crm/models/crm_lead.py index 0ce4008ae07..c44dc9dac3d 100644 --- a/addons/crm/models/crm_lead.py +++ b/addons/crm/models/crm_lead.py @@ -725,26 +725,31 @@ class Lead(models.Model): def write(self, vals): if vals.get('website'): vals['website'] = self.env['res.partner']._clean_website(vals['website']) - stage_is_won = False + + stage_updated, stage_is_won = vals.get('stage_id'), False # stage change: update date_last_stage_update - if 'stage_id' in vals: - stage_id = self.env['crm.stage'].browse(vals['stage_id']) - if stage_id.is_won: + if stage_updated: + stage = self.env['crm.stage'].browse(vals['stage_id']) + if stage.is_won: vals.update({'probability': 100, 'automated_probability': 100}) stage_is_won = True + # stage change with new stage: update probability and date_closed if vals.get('probability', 0) >= 100 or not vals.get('active', True): vals['date_closed'] = fields.Datetime.now() elif vals.get('probability', 0) > 0: vals['date_closed'] = False + elif stage_updated and not stage_is_won and not 'probability' in vals: + vals['date_closed'] = False if any(field in ['active', 'stage_id'] for field in vals): self._handle_won_lost(vals) + if not stage_is_won: return super(Lead, self).write(vals) # stage change between two won stages: does not change the date_closed - leads_already_won = self.filtered(lambda r: r.stage_id.is_won) + leads_already_won = self.filtered(lambda lead: lead.stage_id.is_won) remaining = self - leads_already_won if remaining: result = super(Lead, remaining).write(vals) diff --git a/addons/crm/tests/test_crm_lead.py b/addons/crm/tests/test_crm_lead.py index 5bc63b26cc6..1c8a66e26e2 100644 --- a/addons/crm/tests/test_crm_lead.py +++ b/addons/crm/tests/test_crm_lead.py @@ -279,6 +279,17 @@ class TestCRMLead(TestCrmCommon): self.assertEqual(won_lead.date_closed, old_date_closed, 'Should not change date') self.assertEqual(other_lead.date_closed, datetime(2020, 2, 2, 18, 0, 0)) + # back to open stage + leads.write({'stage_id': self.stage_team1_2.id}) + self.assertFalse(won_lead.date_closed) + self.assertFalse(other_lead.date_closed) + + # close with lost + with freeze_time('2020-02-02 18:00'): + leads.action_set_lost() + self.assertEqual(won_lead.date_closed, datetime(2020, 2, 2, 18, 0, 0)) + self.assertEqual(other_lead.date_closed, datetime(2020, 2, 2, 18, 0, 0)) + @users('user_sales_leads') @freeze_time("2012-01-14") def test_crm_lead_lost_date_closed(self):