--- name: Sessao 2026-05-08 — refatoracao visual + features WhatsApp/Social description: Consolidacao da sessao de 08/05 — refatoracao do design system slate em multiplas paginas, feature de popup global de transferencia WhatsApp, propagacao demanda → aprovacao social, fix bugs financeiros type: project originSessionId: ed34bd4b-73f4-4220-8560-0d7ae92866ff --- # Sessao 2026-05-08 — visao geral Sessao longa cobrindo investigacao + refatoracao visual + 2 features novas + fixes. ## Investigacao inicial: Juliana post 270 (Taro Terapeutico) - Post `social_posts.id=270` (cliente JULIANA MARIA RAIA, id 11) - Demanda vinculada: `demandas.id=2221` (titulo "Apresentando o Taro Terapeutico - JULIANA MARIA RAIA") - Post agendado 06/05 10:00 - **NAO publicou** (status=erro, `social_post_redes` vazio) - Aprovacao automatica do sistema as 16:15 do dia 07/05 (4h apos envio do link, cliente nao respondeu) - Demanda concluida 07/05 16:26 por Erick Rezende (designer) - Geramos 3 versoes de PDF de relatorio (analise_post_270, relatorio_simples, relatorio_v2 landscape) - Path PDFs: `D:/xampp/htdocs/intranet/writable/temp/` ## Features novas ### 1) Popup global de transferencia WhatsApp + retorno de cliente [[wa_transferencias_popup_global]] - tabela `whatsapp_transferencias`, polling no layout.php a cada 15s, popup SweetAlert. Tipos: `transferencia` (manual entre atendentes) e `retorno` (cliente respondeu apos encerramento auto). ### 2) Propagacao demanda → aprovacao social automatica [[social_demanda_auto_aprovacao]] - quando admin aprova demanda em "Aprovada" e ela tem `social_post_id`, o post social tambem e aprovado automaticamente. Aplicado em ambos os fluxos: `moverEtapa` e `aprovarDemanda` via funcao `propagarAprovacaoSocial`. Casos retroativos aplicados: - Demanda 2196 (CILENE - "Porque empresas pagam mais imposto") → post 250 - Demanda 2220 (MISLENE - "Citta Centrale - Localizacao") → post 262 ### 3) Status "Pago (outra conta)" no controle financeiro Quando despesa marcada como paga nao tem debito correspondente no extrato Sicoob, virou badge **verde claro** com texto "(outra conta)" - antes era vermelho de erro. Significado: pagamento valido feito por cartao/dinheiro/outra conta. ### 4) Permissao especifica `social_media_confirmar_publicacao` (id 272) Vinculada aos niveis 1-4 (Administrador, Gerente, Operador, Usuario). Permite confirmar publicacao manual / nao publicacao em posts com erro. Erick (user 8, nivel 4=Usuario) ja tem. ## Fixes importantes ### WhatsApp grupos: replies nao salvavam Bug em `WhatsApp::handleGroupWebhookMessage` - o `$groupInsert` nao incluia campos `quoted_message_id`, `quoted_text`, `quoted_from_me`, `quoted_sender_name`. Adicionada extracao de `contextInfo.stanzaId` antes do insert. Fix confirmado funcionando ao mensagem 7580 (Valeria respondeu "Esgotado"). ### Bling topbar: alerta de erro nao precisa aparecer Em `Colaborador::topbarBadges()` adicionado `whereNotIn('c.status', ['erro'])` na query de `bling_pendentes` para nao mostrar contas com erro de conexao no topbar. ### Feedbacks → Relatorio Diario A tela `/feedbacks` era NPS de cliente (vazia). Usuario queria evolucao diaria de colaborador, que ja existe em `/relatorio-diario` (258 registros). Removido item de menu "Feedback" e redirect `/feedbacks → /relatorio-diario` preservando query string. ### Servidor sob carga (load 127) - Causa: swap thrashing (MariaDB com 878MB em swap, disco 88-92% util) - Solucao paliativa: `swapoff -a && swapon -a` (rodou em background, demorou ~20min mas zerou swap) - Resultado: load 127 → 7 e sistema voltou a velocidade normal ### `/contas` pegando dados errados - Bug: `getCategoriaResumo($transacoes)` ignorava o filtro de mes (pegava `tipo='DESPESA'` de todos os tempos). Corrigido para iterar so `$transacoes` (ja filtrado). - Bug: `getInvestimentos()` (sem filtro) usado em vez de `getInvestimentosMes($mes, $ano)`. Trocado. - Saldo banco em mes passado: agora usa `extratoSicoob['saldo']` (saldo no fim do periodo) em vez de saldo atual em tempo real. Label muda para "Saldo no fim de Abril". - Filtro: `/contas` SEMPRE abre no mes atual (sem cache de sessao). Filtro virou GET (`?mes=04&ano=2026`) - sem CSRF. ## Refatoracoes visuais (padrao slate consistente) [[padrao_visual_sistema_slate]] - aplicado nas paginas: | URL | Tipo de mudanca | |-----|-----------------| | `/dados-contrato` | Visual + modal Novo Cadastro + modal Visualizar (com abas) + colunas reduzidas. Removidos cards stats/aba "Todos"/coluna ID/Status. Redirect `/show/{id}` para listagem. Coluna `publicacao_manual` + `link_publicacao` em `social_posts` | | `/social-media` | Cores erro (ambar nao vermelho), modal de erro com 3 botoes (foi/nao publicada/editar), indicador auto-aprovado com faixa lateral laranja + nome do aprovador, propagacao demanda | | `/categorias` | Tudo em modal, controller AJAX/JSON | | `/demanda-automatica` | Refatorado, modais Nova Config e Nova Data | | `/documentos/pastas` | Tudo em modal, AJAX, hierarquia | | `/produtos` | Visual slate, badges em monospace, botoes dash-btn no `getDataAjax` | | `/categorias-produtos` | Tudo em modal, com checkbox "aplicar em produtos" no editar | | `/contas` (financeiro) | KPIs claros (4 cards no mes atual, 0 em mes passado), grafico com destaque do mes filtrado (so quando filtra mes passado), seccao banco com descricoes claras, banner de periodo removido por preferencia, status "Pago (outra conta)" verde claro | ## Tabelas novas no banco - `whatsapp_transferencias` (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) - `social_posts.publicacao_manual` (TINYINT) + `link_publicacao` (VARCHAR 500) - Permissao 272: `social_media_confirmar_publicacao` ## Preferencias do usuario reforcadas - [[feedback_padrao_visual_slate]] - design system slate em TODAS as views administrativas - Recibido (status RECEITA recebida) deve ser **verde escuro com letras brancas** (classe `.recebido-strong`) - Cards de KPI **so no mes atual** em /contas - mes passado nao mostra "A pagar/A receber" - Botoes de acao: padrao `dash-btn icon-only` (cinza claro / vermelho com border vermelho pra excluir) ## Pendencias deixadas - `dados_contrato/form_interno.php` foi referenciada em rota antiga mas a view nao existe mais (deletada). Deveria deletar o metodo `new()` do controller ou criar view nova. - Fix 2 do WhatsApp (sync de grupos via `/rest/group/list/{key}`) - endpoint Baileys retorna `groups: []`. Solucao seria criar endpoint customizado no micro-server 8001 chamando `sock.groupFetchAllParticipating()`. Nao feito por exigir reload do PM2 que pode atrapalhar as 3 sessoes WhatsApp.