From 28b41a3246d056f68ab470799d76388fb34c7785 Mon Sep 17 00:00:00 2001 From: mafo-odoo Date: Fri, 6 May 2022 14:57:04 +0000 Subject: [PATCH] [FIX] crm: no date_closed update between 2 won stages Steps to reproduce: install crm and change a lead between two won stages Expected behavior: The date_closed does not change Current behavior: The date_closed changes opw-2839298 closes odoo/odoo#92534 X-original-commit: 0c55c0d31021abe966c453c4827d5873a7af485c Signed-off-by: Fockedey Martin (mafo) --- addons/crm/models/crm_lead.py | 18 +++++++++++++----- addons/crm/tests/test_crm_lead.py | 23 +++++++++++++++++++++++ 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/addons/crm/models/crm_lead.py b/addons/crm/models/crm_lead.py index bb1203711bf..606905b52d5 100644 --- a/addons/crm/models/crm_lead.py +++ b/addons/crm/models/crm_lead.py @@ -708,13 +708,13 @@ 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 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: 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() @@ -723,10 +723,18 @@ class Lead(models.Model): 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) - write_result = super(Lead, self).write(vals) - - return write_result + # stage change between two won stages: does not change the date_closed + leads_already_won = self.filtered(lambda r: r.stage_id.is_won) + remaining = self - leads_already_won + if remaining: + result = super(Lead, remaining).write(vals) + if leads_already_won: + vals.pop('date_closed', False) + result = super(Lead, leads_already_won).write(vals) + return result @api.model def search(self, args, offset=0, limit=None, order=None, count=False): diff --git a/addons/crm/tests/test_crm_lead.py b/addons/crm/tests/test_crm_lead.py index 1ab197bc917..900d78b0f4f 100644 --- a/addons/crm/tests/test_crm_lead.py +++ b/addons/crm/tests/test_crm_lead.py @@ -709,3 +709,26 @@ class TestCRMLead(TestCrmCommon): self.assertEqual(lead.phone, self.test_phone_data[1]) self.assertEqual(lead.mobile, self.test_phone_data[2]) self.assertFalse(lead.phone_sanitized) + + def test_no_date_closed_update_between_won_stages(self): + # Test for one won lead + stage_team1_won2 = self.env['crm.stage'].create({ + 'name': 'Won2', + 'sequence': 75, + 'team_id': self.sales_team_1.id, + 'is_won': True, + }) + won_lead = self.lead_team_1_won + date_closed = datetime.strptime('2020-02-02 15:00', '%Y-%m-%d %H:%M') + won_lead.date_closed = date_closed + with freeze_time('2020-02-02 18:00'): + won_lead.stage_id = stage_team1_won2 + self.assertEqual(won_lead.date_closed, date_closed) + + # Test for one won and one unwon lead + leads = won_lead + self.lead_1 + self.assertFalse(self.lead_1.date_closed) + with freeze_time('2020-02-02 18:00'): + leads.stage_id = self.stage_team1_won + self.assertEqual(won_lead.date_closed, date_closed) + self.assertEqual(self.lead_1.date_closed, datetime.strptime('2020-02-02 18:00', '%Y-%m-%d %H:%M'))