--- name: WhatsApp - popup global de transferencia + retorno de cliente description: Sistema de notificacao em qualquer pagina do sistema quando usuario recebe transferencia ou cliente retorna apos encerramento auto type: project originSessionId: ed34bd4b-73f4-4220-8560-0d7ae92866ff --- # Popup global de transferencia/retorno WhatsApp (2026-05-08) ## Como funciona Polling JS no `app/Views/layout.php` (a cada 15s) consulta `/whatsapp-chat/transferencias-pendentes` e abre **SweetAlert bloqueante** (com beep) quando o usuario logado tem transferencia pendente. **Why:** o usuario pediu "popup em cima de todas as telas" para ele atender transferencia mais rapido. **How to apply:** funciona em qualquer pagina que carrega `app/Views/layout.php` (a maioria das views administrativas). Para paginas standalone (chat, contas, etc), o popup nao aparece porque nao incluem o layout - mas eles tem a sidebar do chat que ja destaca conversas transferidas. ## Tabela `whatsapp_transferencias` ```sql id, session_id, contact_id, phone_number, from_user_id, to_user_id, tipo enum('transferencia','retorno'), motivo, atendido_em, atendido_por, recusado_em, created_at ``` Pendencia ativa = `atendido_em IS NULL AND recusado_em IS NULL`. ## Tipos - **transferencia**: criada quando alguem chama `WhatsAppChat::transferirConversa()` (tabela `whatsapp_contatos.assigned_to` muda) - **retorno**: criada automaticamente pelo `WhatsApp::handleIncomingWebhookMessage` quando contato com `assigned_to=NULL` mas `last_attended_by` preenchido recebe nova mensagem (cliente voltou apos encerramento auto) ## Endpoints - `GET /whatsapp-chat/transferencias-pendentes` - lista pendentes do user logado (ultimas 24h) - `POST /whatsapp-chat/marcar-transferencia-atendida` - marca atendida ou recusada (action: 'atendido' | 'recusado') ## Acoes do popup - **Atender agora** (transferencia) / **Continuar atendimento** (retorno): marca atendida e redireciona pra `/whatsapp-chat?phone=X` - **Mais tarde**: armazena no sessionStorage (`waTransfDismissed`) - nao volta a notificar nessa sessao do navegador - Cada transferencia ja vista fica em `waTransfSeen` para nao repetir ## Caso retroativo aplicado Inserido manualmente para Fabiane (553196713478) → Crismaria (user 5) tipo `retorno`, motivo "Cliente respondeu apos encerramento automatico (retroativo)".