Módulo 13: Dashboard & Relatórios — API
Status: Rascunho Inicial Regras de negócio: ver
regras-negocio/13_dashboard.mdDomínio: verdominio/meta.md
1. Contratos de API (RESTful)
1.1 Endpoints do Dashboard (Métricas e Widgets)
Todas as chamadas abaixo validam as credenciais de segurança e aplicam filtros de escopo baseados na árvore hierárquica do usuário autenticado.
GET /api/dashboard/funil
Auth: Todos os usuários autenticados
Query: ?periodo=YYYY-MM&time_id=uuid (opcional)
Return: {
leads_novos: integer,
leads_qualificados: integer,
propostas_enviadas: integer,
contratos_ativos: integer,
taxa_conversao_pct: decimal
}
Nota: Se o usuário logado for Consultor, ignora a query time_id e filtra apenas a carteira dele.
GET /api/dashboard/metas
Auth: Todos os usuários autenticados
Query: ?periodo=YYYY-MM
Return: {
meta_valor: decimal,
realizado_valor: decimal,
percentual_atingimento: decimal,
tipo_metrica: "QUANTIDADE_CONTRATOS | RECEITA_ADESAO | RECEITA_MENSALIDADE"
}
GET /api/dashboard/ranking
Auth: Gestor | Admin
Query: ?periodo=YYYY-MM&time_id=uuid (opcional)
Return: [
{ rank: 1, consultor_id: uuid, nome: string, total_contratos: integer, volume_receita: decimal },
{ rank: 2, consultor_id: uuid, nome: string, total_contratos: integer, volume_receita: decimal }
]
1.2 Motor de Relatórios Assíncronos
Para evitar problemas de timeout em consultas na base de dados de grande volume, os relatórios são gerados assincronamente através de filas.
POST /api/relatorios/gerar
Auth: Gestor | Admin
Body:
{
"tipo": "PRODUCAO_CASCATA | DESCARTE_LEADS | VENCIMENTOS_RENOVACOES",
"filtros": {
"data_inicio": "date",
"data_fim": "date",
"time_id": "uuid | null"
},
"formato": "CSV | XLSX"
}
Return: 202 Accepted
{
"job_id": "uuid",
"status": "PROCESSANDO",
"criado_em": "datetime"
}
GET /api/relatorios/status/{job_id}
Auth: Gestor | Admin
Return:
{
"job_id": "uuid",
"status": "PROCESSANDO | CONCLUIDO | FALHOU",
"progresso_pct": integer,
"download_url": "string | null",
"erro_mensagem": "string | null"
}
2. Segurança e Boas Práticas
| Regra | Implementação |
|---|---|
| Caching no Redis | As requisições de dashboard (funil, metas) devem ser cacheadas no Redis com chaves dinâmicas mapeadas por Tenant e Usuário (ex: tenant:{id}:user:{id}:dash:funil:{periodo}). TTL padrão de 15 minutos. |
| Sanitização de Parâmetros | Bloquear e higienizar qualquer parâmetro de query SQL para evitar injeções de SQL nas queries dinâmicas de consolidação. |
| Download Expirável de Relatórios | A URL fornecida em download_url deve apontar para o Cloud Storage interno e usar assinatura com tempo de expiração curto (máximo de 15 minutos). |
| Isolamento Multitenant | Todas as queries de relatórios e dashboard devem aplicar obrigatoriamente a cláusula WHERE tenant_id = current_tenant_id logo na primeira junção de tabelas. |
| View de Hierarquia | Utilizar Views Recursivas (Common Table Expressions - CTE) ou tabelas de mapeamento de caminhos hierárquicos pré-calculados para resolver a busca de equipes apadrinhadas rapidamente na geração do ranking e relatórios. |