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
exceljs/puppeteer/geração de PDF fora de libs/report — a regra é executável, não é uma frase num documento.M0–M5 pede o relatório: POST /api/report/exports com template_id + parâmetros. Nunca gera nada localmente (R-REP-1).
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.
Read models por eventos RabbitMQ (inbox idempotente) para dashboards · snapshot imutável do run para mapas legais — reprodutíveis byte a byte.
Handlebars master.hbs: cabeçalho/rodapé/paginação corporativos + tokens de ui_themes (UIFW). O miolo é injectado — zero layouts inventados.
PDF: Gotenberg (reutiliza M3b) · XLSX/CSV: ExcelJS · PNG: ECharts SSR (canvas headless) · XML: serializador AGT/AGD alinhado com P-06 · HTML: directo.
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.
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.
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.
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.
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.
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.
report.templates: corporate alterado ⇒ maker-checker (aprovador ≠ criador); legal só a plataforma toca; hbs_source versionado + tokens_snapshot.
| Proposta do PRD | Decisão | Porquê |
|---|---|---|
| Puppeteer/Playwright embutido no serviço | Corrigido → Gotenberg | Chromium 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 modelos | Reformulado (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 · Jinja2 | Rejeitado | Runtime Python paralelo na stack NestJS — custo operacional permanente para ganho nulo. Handlebars/ExcelJS/Gotenberg cobrem 100% dos casos. |
| ApexCharts como 2º motor de gráficos | Rejeitado | Viola a própria regra "zero aleatoriedade" do PRD — 1 motor (ECharts), 1 linguagem visual. |
| Centralização total + omnicanalidade + template master + excepção legal | Adoptado (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. |
| Fase | Antes (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 dias | 0 |
| Pós-GA | Metabase interno · builder | Builder 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.