diff --git a/addons/crm/models/crm_lead.py b/addons/crm/models/crm_lead.py
index d8c789384e1..f164919ef70 100644
--- a/addons/crm/models/crm_lead.py
+++ b/addons/crm/models/crm_lead.py
@@ -237,9 +237,10 @@ class Lead(models.Model):
index=True, ondelete='restrict', tracking=True)
# Statistics
calendar_event_ids = fields.One2many('calendar.event', 'opportunity_id', string='Meetings')
- calendar_event_count = fields.Integer('# Meetings', compute='_compute_calendar_event_count')
duplicate_lead_ids = fields.Many2many("crm.lead", compute="_compute_potential_lead_duplicates", string="Potential Duplicate Lead", context={"active_test": False})
duplicate_lead_count = fields.Integer(compute="_compute_potential_lead_duplicates", string="Potential Duplicate Lead Count")
+ meeting_display_date = fields.Date(compute="_compute_meeting_display")
+ meeting_display_label = fields.Char(compute="_compute_meeting_display")
# UX
partner_email_update = fields.Boolean('Partner Email will Update', compute='_compute_partner_email_update')
partner_phone_update = fields.Boolean('Partner Phone will Update', compute='_compute_partner_phone_update')
@@ -537,13 +538,29 @@ class Lead(models.Model):
for lead in self:
lead.recurring_revenue_prorated = (lead.recurring_revenue or 0.0) * (lead.probability or 0) / 100.0
- def _compute_calendar_event_count(self):
+ @api.depends('calendar_event_ids', 'calendar_event_ids.start')
+ def _compute_meeting_display(self):
+ now = fields.Datetime.now()
meeting_data = self.env['calendar.event'].sudo()._read_group([
- ('opportunity_id', 'in', self.ids)
- ], ['opportunity_id'], ['__count'])
- mapped_data = {opportunity.id: count for opportunity, count in meeting_data}
+ ('opportunity_id', 'in', self.ids),
+ ], ['opportunity_id'], ['start:array_agg', 'start:max'])
+ mapped_data = {
+ lead: {
+ 'last_meeting_date': last_meeting_date,
+ 'next_meeting_date': min([dt for dt in meeting_start_dates if dt > now] or [False]),
+ } for lead, meeting_start_dates, last_meeting_date in meeting_data
+ }
for lead in self:
- lead.calendar_event_count = mapped_data.get(lead.id, 0)
+ lead_meeting_info = mapped_data.get(lead)
+ if not lead_meeting_info:
+ lead.meeting_display_date = False
+ lead.meeting_display_label = _('No Meeting')
+ elif lead_meeting_info['next_meeting_date']:
+ lead.meeting_display_date = lead_meeting_info['next_meeting_date']
+ lead.meeting_display_label = _('Next Meeting')
+ else:
+ lead.meeting_display_date = lead_meeting_info['last_meeting_date']
+ lead.meeting_display_label = _('Last Meeting')
@api.depends('email_domain_criterion', 'email_normalized', 'partner_id',
'phone_sanitized')
diff --git a/addons/crm/tests/test_crm_lead.py b/addons/crm/tests/test_crm_lead.py
index 8cf4b4a20f3..7671cac18fc 100644
--- a/addons/crm/tests/test_crm_lead.py
+++ b/addons/crm/tests/test_crm_lead.py
@@ -4,6 +4,7 @@
from datetime import datetime
from freezegun import freeze_time
+from odoo import fields
from odoo.addons.base.tests.test_format_address_mixin import FormatAddressCase
from odoo.addons.crm.models.crm_lead import PARTNER_FIELDS_TO_SYNC, PARTNER_ADDRESS_FIELDS_TO_SYNC
from odoo.addons.crm.tests.common import TestCrmCommon, INCOMING_EMAIL
@@ -302,6 +303,36 @@ class TestCRMLead(TestCrmCommon):
lead.action_set_lost()
self.assertEqual(lead.date_closed, datetime.now(), "Closed date is updated after marking lead as lost")
+ @users('user_sales_manager')
+ def test_crm_lead_meeting_display_fields(self):
+ lead = self.env['crm.lead'].create({'name': 'Lead With Meetings'})
+ meeting_1, meeting_2, meeting_3 = self.env['calendar.event'].create([{
+ 'name': 'Meeting 1 of Lead',
+ 'opportunity_id': lead.id,
+ 'start': '2022-07-12 08:00:00',
+ 'stop': '2022-07-12 10:00:00',
+ }, {
+ 'name': 'Meeting 2 of Lead',
+ 'opportunity_id': lead.id,
+ 'start': '2022-07-14 08:00:00',
+ 'stop': '2022-07-14 10:00:00',
+ }, {
+ 'name': 'Meeting 3 of Lead',
+ 'opportunity_id': lead.id,
+ 'start': '2022-07-15 08:00:00',
+ 'stop': '2022-07-15 10:00:00',
+ }])
+
+ with freeze_time('2022-07-13 11:00:00'):
+ self.assertEqual(lead.meeting_display_date, fields.Date.from_string('2022-07-14'))
+ self.assertEqual(lead.meeting_display_label, 'Next Meeting')
+ (meeting_2 | meeting_3).unlink()
+ self.assertEqual(lead.meeting_display_date, fields.Date.from_string('2022-07-12'))
+ self.assertEqual(lead.meeting_display_label, 'Last Meeting')
+ meeting_1.unlink()
+ self.assertFalse(lead.meeting_display_date)
+ self.assertEqual(lead.meeting_display_label, 'No Meeting')
+
@users('user_sales_manager')
def test_crm_lead_partner_sync(self):
lead, partner = self.lead_1.with_user(self.env.user), self.contact_2
@@ -560,7 +591,7 @@ class TestCRMLead(TestCrmCommon):
'stop': '2022-07-13 10:00:00',
}
])
- self.assertEqual(lead.calendar_event_count, 1)
+ self.assertEqual(len(lead.calendar_event_ids), 1)
self.assertEqual(meetings.opportunity_id, lead)
self.assertEqual(meetings.mapped('res_id'), [lead.id, lead.id])
self.assertEqual(meetings.mapped('res_model'), ['crm.lead', 'crm.lead'])
diff --git a/addons/crm/views/crm_lead_views.xml b/addons/crm/views/crm_lead_views.xml
index 82dd3ba4f41..aaa5a2fab37 100644
--- a/addons/crm/views/crm_lead_views.xml
+++ b/addons/crm/views/crm_lead_views.xml
@@ -29,11 +29,10 @@