--- name: WhatsApp Chat - nome do contato preferencialmente vem de clientes.nome description: Webhook usa clientes.nome (match por telefone) em vez de pushName do WhatsApp Business; estrategia 7 de LID nao claima quando ha pushName type: project originSessionId: 2858844d-38d3-482c-bbfa-0843be5ee19d --- # WhatsApp Chat - prioridade clientes.nome sobre pushName Aplicado em 2026-05-11 apos relato de "SS Qualita" mostrar nome de perfil business em vez de "JULIANA MARIA RAIA" (cliente real), e "Ana" mostrar "SILVANA COLCHOES E CIA". **Why:** O `pushName` do WhatsApp Business reflete o perfil da empresa (ex: "SS Qualita") e nao a pessoa real. Quando ha cliente cadastrado em `clientes` com o mesmo telefone, faz mais sentido mostrar o nome do cliente no chat (a pessoa identifica de cara). **How to apply:** - Em `WhatsApp.php::handleIncomingWebhookMessage()`, na criacao/atualizacao de contato com phone real (`55...`), chamar `buscarNomeClientePorTelefone($phone)` antes de cair no `pushName`. - Na atualizacao, so sobrescrever `nome` se atual for automatico (vazio, phone, lid_, pushName/verifiedBizName anterior). Renomeacoes manuais do atendente NAO devem ser sobrescritas. - A estrategia 7 (LID resolvido por unica conversa recente) so executa quando `$pushName` esta vazio — evita reincidencia do caso Bruna/Monique (2026-05-07) onde LID da Monique foi roubado pelo contato da Bruna. **Helper novo em WhatsApp.php (proximo a `gerarVariantesPhone`):** ``` private function buscarNomeClientePorTelefone($phone) ``` - Normaliza telefone (strip nao-digitos, requer prefixo `55`, gera variantes com/sem 9o digito) - Query em `clientes.telefone` (REPLACE de `( ) - . espaco`) - Retorna `clientes.nome` ou null **Migracao retroativa (2026-05-11):** 11 contatos foram renomeados para clientes.nome. Casos pulados (cliente eh TESTE ou nomes totalmente diferentes do contato manual). Duplicatas LID (108+488 SS Qualita, 1+180 Jesiel, 302+310 JSF SOLUCOES) sofreram merge de mensagens e soft-delete; contato Bruna (519) teve `lid` limpo pois a LID 36661991833747 era da Monique (513). **Endurecimento das estrategias 5 e 6 (2026-05-11):** - Estrategia 5 (pushName exato): NAO claima LID se houver multiplos contatos com mesmo nome (era `->first()` antes, podia roubar de quem nao era). - Estrategia 5 e 6: ignoram contatos que ja possuem outro LID associado (evita sobrescrita). - Estrategia 6 (parcial): substring exige minimo 4 chars (evita falso positivo "Ana" matching "Mariana"). - Estrategia 7 (unica conversa recente): so executa quando NAO ha pushName. **Caso especial Juliana/Clarice:** WhatsApp Business `SS Qualita` (553196001399) eh compartilhado entre Juliana Maria Raia e Clarice. Cliente 30 teve `responsavel` atualizado para "Juliana Raia / Clarice" para deixar isso claro. **Bug critico corrigido (2026-05-11): `@s.whatsapp.net` no phone_number das mensagens** - `WhatsApp::enviarMensagemTexto()` salvava `$telefoneFormatado` (com sufixo `@s.whatsapp.net`) no `whatsapp_messages.phone_number` em vez do telefone limpo. 382 mensagens automaticas de aprovacao de cronograma/publicacao ficaram invisiveis no chat (phone do contato e sem sufixo). - Fix: `enviarMensagemTexto()` agora insere com phone limpo `$telefone` e busca `contact_id` antes. `WhatsappMessageModel::createMessage()` ganhou strip defensivo de `@s.whatsapp.net` no phone. - Migracao: 382 msgs corrigidas via `UPDATE whatsapp_messages SET phone_number=REPLACE(phone_number,'@s.whatsapp.net','')`. **Limpeza last_attended_by orfao (2026-05-11):** 49 contatos referenciavam usuario id 10 que nao existe (usuarios sao 1,5,7,8). Setado NULL. **Limite:** Se cliente.telefone for atualizado em `clientes`, o `whatsapp_contatos.nome` nao se atualiza automaticamente. So sincroniza no proximo webhook (e se nome atual ainda for automatico). Para forcar sincronizar em massa, rodar script similar ao usado em 2026-05-11 (logica em PHP, comparar com `nomesParecidos`/`ehNomeAutomatico`). **Arquivos:** - `app/Controllers/WhatsApp.php::buscarNomeClientePorTelefone()` (novo) - `app/Controllers/WhatsApp.php::handleIncomingWebhookMessage()` (create + update paths + LID temp update + estrategia 7)