feat(frontend): Relatórios (Filas/Agentes/Campanhas/IA) + PHASE 28 security review

Quatro páginas novas em /app/relatorios/*, uma rota por relatório (não abas de
uma página só, pra não quebrar o realce de "ativo" da sidebar quando vários
itens de menu apontam pro mesmo relatório) — reusa os endpoints de reports
que já existiam desde as fases de CDR/AI, nenhum backend novo.

Security quality gate (agente.md secao 224): revisão dedicada sobre todo o
diff desde origin/main (billing + frontend inteiro, 7 commits) não achou
nenhuma vulnerabilidade de alta confiança. Suítes de teste de isolamento
multi-tenant, autenticação/RBAC e rating engine reexecutadas do zero e
verdes. TODO.md documenta o escopo real ainda faltando (Agentes bloqueado
por falta de endpoint de listagem de usuários, Dialplan, Monitoramento em
tempo real, Gravações, IA CRUD, Relatórios > Chamadas/Consumo) em vez de
alegar a aplicação "finalizada".

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BFaBaBSQGhyXGEgtTYZGV8
This commit is contained in:
2026-08-29 14:34:24 -03:00
parent de1e7ac49c
commit ca49504f0a
13 changed files with 528 additions and 4 deletions

73
TODO.md
View File

@@ -905,8 +905,77 @@ Troncos, Discador > Lista de Bloqueio (agente.md secao 50-51, 41-42, 71,
light, mesma decisão de escopo das últimas telas simples) —
reavaliar junto com a Sidebar quando "Agentes" ganhar tela própria
## PHASE 28+ver `agente.md` seções 140 em diante (resto do Frontend,
Security, Tests)
## PHASE 28 — Segurança, testes de regressão, Frontend: Relatórios
(agente.md secao 157-160, 119, 183-184, 202, 224)
- [x] **Security quality gate (secao 224)**: review dedicado (subagente
independente) sobre o diff completo desde `origin/main` (billing
orchestration + todo o frontend novo, 7 commits) — auth/sessão,
todos os controllers NestJS tocados, `permission.guard.ts`, RLS da
migration de billing, todas as Server Actions novas do frontend.
**Nenhum achado com confiança >= 7/10** (nem IDOR, nem bypass de
tenant, nem segredo vazado em resposta/log). Ver seção "Auditoria de
segurança" no relatório desta sessão (não persistida em arquivo —
resultado: limpo).
- [x] **Portas sensíveis (secao 184)** conferidas depois do reboot da VM:
Postgres (5432) e Redis (6379) só em `127.0.0.1`, Event Socket
(8021) não publicado no host, `apps/api` (3000) só em `127.0.0.1`.
Único listener em todas as interfaces é o `apps/frontend` (3001, dev
server) — necessário pra o usuário testar de fora da VM; token de
acesso nunca chega no browser (arquitetura desde a PHASE 23), então
isso não expõe a API real.
- [x] **Testes de regressão (secao 202)** re-executados do zero pós-reboot
pra confirmar que nada quebrou: `test:isolation` (RLS multi-tenant),
`test:auth` (login/RBAC/refresh rotation/logout), `packages/billing`
(RatingEngine, 17 casos) — todos verdes.
- [x] Frontend > Relatórios (secao 157-160, 119): 4 páginas novas —
`/app/relatorios/{filas,agentes,campanhas,ia}` — cada uma sua
própria rota (não abas de uma página só: 4 itens de menu apontando
pro mesmo `href` fariam a sidebar realçar os 4 ao mesmo tempo, ver
`components/shell/nav-list.tsx`). Reusa os endpoints que já existiam
desde a PHASE 17/21 (`GET /reports/{queues,agents,campaigns,ai-
dashboard}`), nenhum endpoint novo. Últimos 30 dias fixo, sem
seletor de período ainda (decisão deliberada, documentada na
própria tela).
- [x] Menu Tenant: "Relatórios > Agentes/Filas/Campanhas" e "IA >
Análises" saem de "em breve"; "Relatórios > Chamadas/Consumo" e o
resto do menu IA continuam pendentes.
- [x] Testado ponta a ponta contra a API real (tenant Acme, ainda sem
chamadas reais) — as 4 telas renderizam os estados vazios corretos
(honestos: `0` quando é contagem real, traço fantasma com
explicação quando é média sem dado), título/descrição da topbar
resolvidos corretamente por rota (sem a ambiguidade que teria dado
se as 4 dividissem um `href`).
- [ ] **Escopo real ainda faltando pra "aplicação finalizada" segundo o
agente.md completo** (236 seções) — não coberto nesta fase, listado
explicitamente em vez de fingir completo:
- Call Center > Agentes (frontend): bloqueado por uma lacuna de
backend, não só falta de tela — `POST /agents` exige um `userId`
de um usuário já existente do tenant, mas **não existe nenhum
endpoint pra listar/convidar usuários do tenant** ainda (só
criação de tenant/usuário via script, mesma lacuna já anotada na
PHASE 22 pra tenant/plano/assinatura). Precisa de um "Usuários"
(Administração) antes de Agentes fazer sentido na UI.
- Telefonia > Dialplan (editor estruturado, condition/actions
dinâmicos, generate/activate de versão) — backend pronto desde a
PHASE 10, zero UI.
- Monitoramento em tempo real (secao 54-55, 161) — WebSocket já
existe no backend (`RealtimeGateway`), zero cliente no frontend.
- Gravações (player de áudio, secao 121) e IA > Scorecards/Prompts/
Configurações (CRUD, secao 114-118) — backend pronto, zero UI.
- Relatórios > Chamadas (lista filtrável) e > Consumo (dashboard de
quotas, secao 139) — sem tela ainda.
- Menu Platform: Clientes/Infraestrutura/Sistema inteiros "em
breve" (só Billing > Tarifas e o dashboard existem).
- "Itens sem permissão não aparecem" (secao 169) nunca foi aplicado
— lacuna conhecida desde a PHASE 24.
- Nenhuma bateria de teste automatizado de frontend (E2E/component)
existe — toda verificação até aqui foi manual via Puppeteer +
screenshot, sessão a sessão.
- `apps/api`/`apps/frontend` continuam sem supervisor de processo
(ver "Riscos conhecidos") — não sobrevivem a um reboot sozinhos.
- nginx / TLS / domínio público (PHASE 01, pendência original)
continuam sem existir — o acesso de teste é direto na porta 3001
da VM, sem HTTPS.
---