diff --git a/app/services/whatsapp/phone_normalizers/mexico_phone_normalizer.rb b/app/services/whatsapp/phone_normalizers/mexico_phone_normalizer.rb new file mode 100644 index 000000000..9af5ff385 --- /dev/null +++ b/app/services/whatsapp/phone_normalizers/mexico_phone_normalizer.rb @@ -0,0 +1,17 @@ +# Handles Mexico phone number normalization +# +# WhatsApp may include a "1" after Mexico's country code (521), while contacts +# can already be stored without it (52). Normalize to the stored E.164 format. +class Whatsapp::PhoneNormalizers::MexicoPhoneNormalizer < Whatsapp::PhoneNormalizers::BasePhoneNormalizer + def normalize(waid) + return waid unless handles_country?(waid) + + waid.sub(/^521/, '52') + end + + private + + def country_code_pattern + /^52/ + end +end diff --git a/app/services/whatsapp/phone_number_normalization_service.rb b/app/services/whatsapp/phone_number_normalization_service.rb index 1e52d9b02..853c7d24e 100644 --- a/app/services/whatsapp/phone_number_normalization_service.rb +++ b/app/services/whatsapp/phone_number_normalization_service.rb @@ -1,5 +1,5 @@ # Service to handle phone number normalization for WhatsApp messages -# Currently supports Brazil and Argentina phone number format variations +# Currently supports Brazil, Argentina, and Mexico phone number format variations # Supports both WhatsApp Cloud API and Twilio WhatsApp providers class Whatsapp::PhoneNumberNormalizationService def initialize(inbox) @@ -64,6 +64,7 @@ class Whatsapp::PhoneNumberNormalizationService NORMALIZERS = [ Whatsapp::PhoneNormalizers::BrazilPhoneNormalizer, - Whatsapp::PhoneNormalizers::ArgentinaPhoneNormalizer + Whatsapp::PhoneNormalizers::ArgentinaPhoneNormalizer, + Whatsapp::PhoneNormalizers::MexicoPhoneNormalizer ].freeze end diff --git a/spec/services/twilio/incoming_message_service_spec.rb b/spec/services/twilio/incoming_message_service_spec.rb index 190a6c45a..59df55333 100644 --- a/spec/services/twilio/incoming_message_service_spec.rb +++ b/spec/services/twilio/incoming_message_service_spec.rb @@ -626,6 +626,57 @@ describe Twilio::IncomingMessageService do expect(whatsapp_twilio_channel.inbox.contact_inboxes.first.source_id).to eq('whatsapp:+541123456789') end end + + describe 'When the incoming number is a Mexican WhatsApp number with 1 after country code' do + let!(:whatsapp_twilio_channel) do + create(:channel_twilio_sms, :whatsapp, account: account, account_sid: 'ACxxx', + inbox: create(:inbox, account: account, greeting_enabled: false)) + end + + it 'appends to existing contact when contact inbox exists without the extra 1' do + contact = create(:contact, account: account, phone_number: '+525512345678') + contact_inbox = create(:contact_inbox, + source_id: 'whatsapp:+525512345678', + contact: contact, + inbox: whatsapp_twilio_channel.inbox) + last_conversation = create(:conversation, inbox: whatsapp_twilio_channel.inbox, contact_inbox: contact_inbox) + + params = { + SmsSid: 'SMxx', + From: 'whatsapp:+5215512345678', + AccountSid: 'ACxxx', + MessagingServiceSid: whatsapp_twilio_channel.messaging_service_sid, + Body: 'Test message from Mexico', + ProfileName: 'Maria Lopez' + } + + described_class.new(params: params).perform + + expect(whatsapp_twilio_channel.inbox.conversations.count).to eq(1) + expect(last_conversation.messages.last.content).to eq('Test message from Mexico') + expect(whatsapp_twilio_channel.inbox.contact_inboxes.first.source_id) + .to eq('whatsapp:+525512345678') + end + + it 'creates contact inbox with incoming number when no existing contact matches' do + params = { + SmsSid: 'SMxx', + From: 'whatsapp:+5215512345678', + AccountSid: 'ACxxx', + MessagingServiceSid: whatsapp_twilio_channel.messaging_service_sid, + Body: 'Test message from Mexico', + ProfileName: 'Maria Lopez' + } + + described_class.new(params: params).perform + + expect(whatsapp_twilio_channel.inbox.conversations.count).not_to eq(0) + expect(whatsapp_twilio_channel.inbox.contacts.first.name).to eq('Maria Lopez') + expect(whatsapp_twilio_channel.inbox.messages.first.content).to eq('Test message from Mexico') + expect(whatsapp_twilio_channel.inbox.contact_inboxes.first.source_id) + .to eq('whatsapp:+5215512345678') + end + end end end end