[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) <mafo@odoo.com>
This commit is contained in:
mafo-odoo
2022-06-01 08:51:46 +02:00
parent a53b468201
commit 28b41a3246
2 changed files with 36 additions and 5 deletions
+13 -5
View File
@@ -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):
+23
View File
@@ -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'))