diff --git a/addons/event_crm/models/event_registration.py b/addons/event_crm/models/event_registration.py index 6adb00cd0acca11031f0d000e013be722bdd93b0..c61a8e741db5e2d4b61ce936ed0f8df4a655f73e 100644 --- a/addons/event_crm/models/event_registration.py +++ b/addons/event_crm/models/event_registration.py @@ -4,6 +4,7 @@ from collections import defaultdict from odoo import api, fields, models, tools, _ +from odoo.addons.phone_validation.tools import phone_validation class EventRegistration(models.Model): @@ -196,8 +197,8 @@ class EventRegistration(models.Model): ) # CHECKME: broader than just public partner # mono registration mode: keep partner only if email and phone matches; - # otherwise registration > partner. Note that email format has to be - # taken into account in comparison + # otherwise registration > partner. Note that email format and phone + # formatting have to taken into account in comparison if len(self) == 1 and valid_partner: # compare emails: email_normalized or raw if self.email and valid_partner.email: @@ -206,9 +207,26 @@ class EventRegistration(models.Model): elif not valid_partner.email_normalized and valid_partner.email != self.email: valid_partner = self.env['res.partner'] - # compare phone - if valid_partner and valid_partner.phone and self.phone and valid_partner.phone != self.phone: - valid_partner = self.env['res.partner'] + # compare phone, taking into account formatting + if valid_partner and self.phone and valid_partner.phone: + phone_formatted = phone_validation.phone_format( + self.phone, + valid_partner.country_id.code or None, + valid_partner.country_id.phone_code or None, + force_format='E164', + raise_exception=False + ) + partner_phone_formatted = phone_validation.phone_format( + valid_partner.phone, + valid_partner.country_id.code or None, + valid_partner.country_id.phone_code or None, + force_format='E164', + raise_exception=False + ) + if phone_formatted and partner_phone_formatted and phone_formatted != partner_phone_formatted: + valid_partner = self.env['res.partner'] + if (not phone_formatted or not partner_phone_formatted) and self.phone != valid_partner.phone: + valid_partner = self.env['res.partner'] if valid_partner: contact_vals = self.env['crm.lead']._prepare_values_from_partner(valid_partner) diff --git a/addons/event_crm/tests/test_event_crm_flow.py b/addons/event_crm/tests/test_event_crm_flow.py index 4c5f928f1c069d5e0a625599aeaa24541c5e8442..075619bd58204b20df231d45d62a4e39894e0905 100644 --- a/addons/event_crm/tests/test_event_crm_flow.py +++ b/addons/event_crm/tests/test_event_crm_flow.py @@ -144,7 +144,7 @@ class TestEventCrmFlow(TestEventCrmCommon): (False, False, self.event_customer, self.event_customer), # should take partner info ('"Other Name" <constantin@test.example.com>', False, self.event_customer, self.event_customer), # same email normalized ('other.email@test.example.com', False, self.event_customer, self.env['res.partner']), # not same email -> no partner on lead - (False, '+32485112233', self.event_customer, self.env['res.partner']), # same phone but differently formatted -> currently not supported + (False, '+32485112233', self.event_customer, self.event_customer), # same phone but differently formatted (False, '0485112244', self.event_customer, self.env['res.partner']), # other phone -> no partner on lead ('other.email@test.example.com', '0485112244', self.event_customer2, self.event_customer2), # mail / phone update from registration as void on partner ]: