Infográfico — Motor Central de Relatórios & BI

svc-report :3062 · M6 Plataforma · READ-ONLY · schema report · fonte: docs/REPORTING_BI_SPEC.md (input #16, emendado pelo input #17) · estado: P11 — aguarda ratificação, prazo dia 18

⚠️ R-REP-1 (regra dura, input #17): nenhum módulo do GORO PMP gera documentos por conta própria. Toda a exportação e todo o gráfico passam pelo motor central. Lint de arquitectura proíbe exceljs/puppeteer/geração de PDF fora de libs/report — a regra é executável, não é uma frase num documento.

1 · Fluxo do motor (pedido → documento)

1

Módulo de origem

M0–M5 pede o relatório: POST /api/report/exports com template_id + parâmetros. Nunca gera nada localmente (R-REP-1).

2

Reporting API

svc-report valida RBAC/RLS herdados, recorte organizacional via Org Engine, k-anonimato (célula <5 não desagrega). Fila assíncrona — nunca bloqueia o pedido do utilizador.

3

Dados

Read models por eventos RabbitMQ (inbox idempotente) para dashboards · snapshot imutável do run para mapas legais — reprodutíveis byte a byte.

4

Merge no template

Handlebars master.hbs: cabeçalho/rodapé/paginação corporativos + tokens de ui_themes (UIFW). O miolo é injectado — zero layouts inventados.

5

Render

PDF: Gotenberg (reutiliza M3b) · XLSX/CSV: ExcelJS · PNG: ECharts SSR (canvas headless) · XML: serializador AGT/AGD alinhado com P-06 · HTML: directo.

6

Entrega segura

Ficheiro no bucket (MinIO/Azure Blob, fronteira StoragePort) · registo em report.exports com hash SHA-256 · presigned URL 60s · evento report.export.ready → svc-notify.

Trilho de auditoria: todo o export fica registado — quem exportou o quê, quando, com que parâmetros, com que hash. Dados de RH a sair do sistema é exactamente o que um auditor quer ver.

2 · Omnicanalidade — 6 formatos, 1 motor

PDFGotenberg · HTML/CSS paged media · mapas legais + relatórios executivos
XLSXExcelJS · estilos de célula, larguras, formatos numéricos AOA
CSVExport cru para integração · UTF-8 BOM · separador configurável
HTMLMesmo template do PDF · pré-visualização no browser
PNGECharts SSR canvas headless · gráficos para e-mail/apresentações
XMLSubmissões AGT · ficheiros bancários AGD/SEPA (alinha com P-06)

3 · Regras de consistência visual e legais

Zero aleatoriedade

1 motor de gráficos (ECharts), 1 template engine (Handlebars), 1 master.hbs. ApexCharts rejeitado: 2º motor = 2ª linguagem visual = violação da própria regra.

Padronização por construção

Tokens de cor/tipografia lidos de ui_themes (UIFW) — o PDF e o dashboard usam a MESMA palete porque bebem da mesma fonte, não porque alguém copiou hex codes. ESLint no-hex-color aplica-se também aos templates.

Hierarquia executiva

Estrutura do master: KPIs no topo → tendências gráficas no meio → tabelas paginadas na base. Imposta pelo template, não deixada ao critério de quem pede o relatório.

Excepção legal (AGT / INSS)

Templates kind=legal obedecem ao layout imposto pela entidade — DR.INSS, Mapa Anual IRT. Imutáveis por tenant: só a plataforma os altera. Migram do legado os CONTRATOS DE OUTPUT aceites há anos, não a mecânica.

Privacidade

Saúde NUNCA entra em read models. K-anonimato: célula com <5 colaboradores não desagrega. RBAC/RLS herdados do pedido original — o motor não é um bypass de permissões.

Governo de templates

report.templates: corporate alterado ⇒ maker-checker (aprovador ≠ criador); legal só a plataforma toca; hbs_source versionado + tokens_snapshot.

4 · O que foi corrigido ou rejeitado do PRD (input #17)

Proposta do PRDDecisãoPorquê
Puppeteer/Playwright embutido no serviçoCorrigido → GotenbergChromium dentro do container = +400MB imagem e RAM instável em K3s single-node (zombies). Gotenberg é o mesmo Chromium, isolado e já adoptado em M3b.
Parsing automático de todos os ecrãs + criação dinâmica de modelosReformulado (2 tempos)GA: inventário manual nos manifestos Zod (verify:catalog) — ecrã sem modelo = pedido workflow ao admin. Pós-GA: builder sobre datasets governados. Builder dinâmico no GA = +8-12 dias e fuga cross-bloco de colunas salariais.
WeasyPrint · Pandas + OpenPyXL · Jinja2RejeitadoRuntime Python paralelo na stack NestJS — custo operacional permanente para ganho nulo. Handlebars/ExcelJS/Gotenberg cobrem 100% dos casos.
ApexCharts como 2º motor de gráficosRejeitadoViola a própria regra "zero aleatoriedade" do PRD — 1 motor (ECharts), 1 linguagem visual.
Centralização total + omnicanalidade + template master + excepção legalAdoptado (A1-A8)R-REP-1 executável por lint · +PNG/+XML · master.hbs com tokens ui_themes · hierarquia executiva · legais imutáveis por tenant · report.templates/report.exports.

5 · Custo revisto

FaseAntes (input #16)Agora (#16 + #17)Delta
S2+2-3 dias+3-4 dias (template engine + master.hbs + report.templates/exports)+1 dia
S5+2 dias+2-3 dias (PNG SSR + XML AGD alinhado com P-06)+0-1 dia
R30+1-2 dias+1-2 dias0
Pós-GAMetabase interno · builderBuilder com datasets governados (C2)—

Aviso: total do svc-report no GA = +6-9 dias distribuídos. A S2 não tinha folga — o +1 dia do input #17 sai da margem da S5 ou corta-se noutro lado. Decisão de ratificação: P11 (dia 18).

GORO PMP Enterprise · CHK S.A. · gerado do plano — código zero até ratificação.