--- name: WhatsApp Chat - Admin abre sem puxar + botão Puxar description: Admin vê mensagens sem iniciar atendimento, botão Puxar na toolbar, lógica encerrar/puxar type: project --- ## WhatsApp Chat - Fluxo Admin (2026-03-31) ### Comportamento Admin - Admin abre QUALQUER conversa direto (inclusive "Aguardando") sem modal de puxar - Vê as mensagens sem precisar iniciar atendimento - Botão "Puxar" (verde, classe `.wa-btn-puxar`) na toolbar ao lado dos outros botões - Se sem dono: mostra **Puxar E Encerrar** (admin pode fazer ambos) - Se tem atendente: mostra só **Encerrar**, esconde Puxar - Usuários normais continuam com modal obrigatório ### Lógica dos Botões (abrirChatDireto) - `temAtendente` = atendenteNome OU contatoAtivo.meu OU de_outro - `realSemDono` = prioriza dados da lista (atualizados) sobre parâmetros passados - Admin + semDono → mostra ambos (Puxar + Encerrar) ### Bug corrigido: atendente_nome - **WhatsappContactModel.php linha 76**: `atendente_nome` usava `last_attended_by` como fallback - Isso mostrava "Atendido por: X" em conversas sem dono (já atendidas antes) - **Fix**: `atendente_nome` só preenche quando `assigned_to` não é NULL ### Bug corrigido: arquivos/áudios LID - `enviarArquivo()` e `enviarAudio()` removiam prefixo `lid_` via `formatarTelefone()` - Mensagens salvas sem `lid_` não apareciam no polling (phone mismatch) - **Fix**: preserva `lid_` prefix se existia no phone original ### Mensagem fora do horário - Webhook `handleIncomingWebhookMessage` → `verificarEnviarMsgForaHorario()` - Configs em `site_configuracoes` grupo 'whatsapp': - `wa_fora_horario_ativo` (boolean) - `wa_horario_inicio` / `wa_horario_fim` (HH:MM) - `wa_dias_atendimento` (1,2,3,4,5 = seg-sex) - `wa_msg_fora_horario` (texto com variáveis {horario_inicio} {horario_fim}) - Anti-spam: 1x por contato por dia (status='system_auto') - Tabela `site_configuracoes` convertida para utf8mb4 para acentos