--- name: WhatsApp Chat - Correções 2026-03-26 description: Admin acompanha em tempo real, boas-vindas 1x, auto-encerrar 15min, permissões atendentes, status diferenciados type: project --- ## WhatsApp Chat - Correções 2026-03-26 ### Permissões WA adicionadas para atendentes - **Crismária (5), Valeria (7), Erick (8)**: receberam 8 permissões básicas de atendente - Permissões: `acessar_whatsapp_chat` (215), `enviar_whatsapp_chat` (217), `visualizar_conversas_whatsapp` (218), `wa_acessar_chat` (220), `wa_enviar_mensagem` (221), `wa_ver_conversas` (222), `wa_ver_sem_dono` (224), `wa_ver_historico` (234) - **NÃO têm**: `wa_ver_todas_conversas`, `wa_transferir_conversa`, `wa_gerenciar_contatos`, `wa_limpar_chat`, `wa_apagar_conversa`, `wa_gerenciar_grupos`, `wa_configuracoes`, `wa_admin` - **Why:** Antes nenhum atendente tinha permissão WA, ícone nem aparecia na navbar ### Admin acompanha atendimentos em tempo real - `IS_ADMIN` (JS) derivado de `$isAdmin` (PHP via `isAdminChat()`) - Admin clica em qualquer conversa e abre direto (sem modal "Puxar atendimento") - Admin vê conversas de outros atendentes sem interferir - `isAdminChat()`: `gerenciar_whatsapp_chat || wa_ver_todas_conversas || wa_admin` - **Why:** Admin não conseguia ver conversas em andamento, sistema pedia puxar ### Boas-vindas só 1x por sessão de atendimento - `puxarAtendimento()` agora verifica se já enviou boas-vindas neste ciclo - Busca última msg outgoing com "vou te atender" e verifica se tem msg incoming depois - Se não houve msg incoming nova após boas-vindas, não reenvia - Só reenvia se: atendimento foi encerrado E cliente mandou nova mensagem E atendente puxou novamente - **Why:** Boas-vindas repetia cada vez que clicava no contato ### Auto-encerramento: 5min → 15min - Config `wa_auto_encerrar_minutos` alterado de 5 para 15 - **Why:** 5 minutos muito curto, encerrava no meio de conversas ativas ### Status diferenciados na lista de contatos - **Encerrado auto** (amarelo, ícone relógio): `encerrado_auto = true` quando última msg = `[Atendimento encerrado automaticamente]` - **Encerrado - Nome** (azul): encerramento manual pelo atendente - Campo `encerrado_auto` adicionado no controller ao carregar contatos ### Encerramento manual salva `last_attended_by` - `encerrarAtendimento()` agora salva `last_attended_by = userId` antes de limpar `assigned_to` - **Why:** Antes só o auto-encerramento salvava, manual não