Files
whatsapp/migrations/20260811_bsuid_identidad_whatsapp.sql
Lizandro GuarnizoandClaude Opus 5 92179af56a Atender a quien oculta su teléfono en WhatsApp (BSUID)
Meta desplegó los nombres de usuario: quien oculta su teléfono llega al
webhook sin `from` ni `wa_id`, identificado solo por su BSUID con la forma
"CO.1761088155094242". El webhook exigía teléfono y descartaba el mensaje
en silencio, sin guardarlo ni dejar rastro: 221 mensajes de 65 personas
ignorados por completo, ya el 3-6% de lo que entra cada día y subiendo.

- webhook.php lee `from_user_id` cuando no llega el teléfono, y rescata el
  nombre del contacto indexando también por `user_id`.
- WhatsAppService responde por BSUID: Meta exige el campo `recipient` en
  lugar de `to`. Se traduce en sendMessage(), el punto por donde pasan todos
  los envíos, en vez de en los diez métodos que arman payloads.
- formatPhoneNumber() devuelve el BSUID intacto; antes le quitaba el punto
  y las letras y lo dejaba en un destinatario inexistente.
- Las cuatro columnas del flujo pasan a varchar(32): los BSUID de Meta
  llegan a 23 caracteres y se truncaban en silencio en varchar(20).

De estas personas no tendremos el teléfono; si un flujo lo necesita, hay
que identificarlas por documento.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 19:41:10 -05:00

20 lines
1.0 KiB
SQL

-- 20260811_bsuid_identidad_whatsapp.sql
--
-- Meta desplegó los nombres de usuario de WhatsApp: quien oculta su teléfono
-- llega al webhook sin `from` ni `wa_id`, identificado solo por su BSUID
-- (identificador de usuario por empresa), con la forma "CO.1761088155094242".
--
-- Ese identificador ocupa el lugar del teléfono en el flujo del bot, pero no
-- cabe en varchar(20): los BSUID de Meta llegan a 23 caracteres, así que se
-- truncarían en silencio y la persona quedaría imposible de responder.
--
-- Se amplían a varchar(32) las cuatro tablas por donde circula.
-- Las vistas (scheduled_messages_view, v_paciente_resumen) heredan el tipo.
-- lab_pacientes.telefono se deja igual: ahí va el teléfono real del paciente,
-- y de estas personas justamente no lo tenemos.
ALTER TABLE users MODIFY phone_number VARCHAR(32) NOT NULL;
ALTER TABLE user_states MODIFY phone_number VARCHAR(32) NOT NULL;
ALTER TABLE terms_acceptance MODIFY phone_number VARCHAR(32) NOT NULL;
ALTER TABLE file_requests MODIFY phone_number VARCHAR(32) NOT NULL;