GORO PMP Enterprise · Kubernetes (I52) · divisão CORE v2 (I49/I50 + emenda I53: Offboarding em M4) · fonte: docs/ARCHITECTURE_MACRO_V2.md
| Módulo | Serviço | Porta | Responsabilidade única | Publica |
|---|---|---|---|---|
| M0 Colaboradores | svc-hr | :3045 | Fonte única de verdade do colaborador — cadastro 360º, orgânica, contratos, documentos, self-service, escrita da cessação | hr.employee.*, hr.contract.* |
| M1 Tempo & Assiduidade | svc-time | :3051 | Biometria HMAC idempotente, consolidação raw→ponto, faltas, leave (maker-checker), turnos/escalas | time.timesheet.closed, time.absence.approved |
| M2 Payroll & Despesas | svc-payroll | :3052 | Motor por rubricas (HE, INSS, IRT Lei 28/20), fechos, recibos, despesas, alteração salarial maker-checker — consome snapshots, nunca lê BD alheia | payroll.run.approved |
| M3 Desempenho & Formação | svc-perf + svc-train | :3053 | Ciclos de avaliação, objectivos, calibração · catálogo/edições/certificados + LMS (schemas separados, extraível) | perf.review.closed |
| M4 Recrutamento & Ciclo de Talento | svc-recruit | :3054 | Vagas→ofertas→contratação + Offboarding (I53): checklist de saída, devoluções, quitação (fluxo já existente no GORO migrado). Purga PII 12m | recruit.hired, recruit.offboarding.completed |
| M5 Disciplinares | svc-discipline | :3055 | Máquina de estados LGT (nota de culpa, prescrição), validação jurista, docs WORM | discipline.sanction.applied |
| M6 Plataforma | gateway · svc-identity · svc-workflow · svc-audit · svc-notify · svc-report P11 | :443 · :3041 · :3050 · :3060 · :3061 · :3062 | Entrada única TLS/JWT/rate-limit · Keycloak/MFA/JWT v2 · motor de aprovações SoD · trilha imutável · notificações · Relatórios & BI read-only: read models por eventos, mapas legais AGT/INSS do snapshot, agregados p/ dashboards de todos os módulos (docs/REPORTING_BI_SPEC.md) | workflow.instance.* · report.export.ready |
Regra: 1 contexto = 1 schema PG próprio (hr,org,ged,time,pay,perf,train,recruit,discipline,wf,audit,report) com RLS por tenant. Tecto para 2 devs (emenda P11): 9 serviços de domínio + svc-report read-only + gateway — a excepção é defensável porque report não tem escrita de negócio nem workflow; dividir mais é nano-serviço sem retorno.
| Padrão | Quando | Tecnologia | Regras duras |
|---|---|---|---|
| Síncrono | Cliente precisa da resposta agora, operação do próprio contexto | REST via API Gateway (SPA/PWA/Manager/biometria); JWT validado localmente (JWKS) | timeout 2s + circuit breaker (opossum); proibido encadear 2+ serviços síncronos num pedido; proibido ler BD alheia |
| Síncrono interno (excepção) | Payroll puxa snapshot fechado de assiduidade no arranque da corrida | gRPC svc-payroll → svc-time (leitura imutável, idempotente) | única chamada inter-serviço síncrona autorizada |
| Assíncrono | Factos de negócio consumados, integração entre contextos | RabbitMQ (topic goro.events) — escolhido sobre Kafka: sem replay/débito que o justifique para 2 devs | Outbox na mesma transacção + Inbox idempotente + DLQ com alerta |
| Evento | Produtor | Consumidores | Efeito |
|---|---|---|---|
hr.employee.created/updated/terminated | svc-hr | time, payroll, perf, discipline | réplicas locais read-only do colaborador |
recruit.hired | svc-recruit | svc-hr | M0 cria o funcionário (recruit nunca escreve em funcionarios) |
recruit.offboarding.completed | svc-recruit | svc-hr | M0 cessa → dispara hr.employee.terminated |
time.timesheet.closed | svc-time | payroll | snapshot imutável para a corrida |
payroll.run.approved | svc-payroll | notify, contabilidade (futuro) | recibos, integração |
discipline.sanction.applied | svc-discipline | payroll, recruit, notify | desconto · despedimento → M4 inicia offboarding |
perf.review.closed | svc-perf | train, payroll (prémios por tenant) | sugestão de formação, prémios |
workflow.instance.approved/rejected | svc-workflow | serviço dono | conclusão maker-checker |
| todos | todos | svc-audit, svc-notify | trilha imutável + notificações |
| Item | Impacto |
|---|---|
| I52 — Kubernetes na S0 (revoga I40) | +3-5 dias K3s na VM DEV, Helm charts base, GHCR, cert-manager, ingress. Absorvível SE a S0 não sofrer mais acréscimos — buffer consumido. |
| P6 — cluster PROD | ✅ RATIFICADA (input #41, 30 dias antes do prazo) — HÍBRIDO: K3s no edge + Azure Arc. K3s mantém-se o runtime (edge/on-prem); ligação operacional ao Azure via Azure Arc (Azure Policy, Monitor, Defender a partir do plano central) — sem forçar workloads para AKS. Custo AKS evitado; governança Azure mantida. Esta página fica com ZERO pendentes. |
| RabbitMQ como StatefulSet | 0 dias — outbox/inbox já estavam no desenho |
| I53 — Offboarding em M4 | 0 dias agora — migração do fluxo existente na fase do M4; escrita da cessação permanece em M0 (linha vermelha) |
| GA | 20/03/2027 (I55, input #18): 120 dias dev (fim 19/01) + 30 revisões (18/02) + 15 testes (05/03) + 15 polimentos → GA. A janela de dev mantém-se 120 dias — acréscimo de escopo dentro dela continua a empurrar as fases seguintes |
Input #29: o Hélio submeteu uma imagem com uma proposta de arquitectura alternativa (v1: Python core, tendência monólito modular, Redis para eventos, shadcn/ui). Foi feita comparação critério a critério contra a v2 (NestJS+Nx microserviços). A página dedicada /arch-compare foi arquivada no input #38 (comparação fechada) — este registo preserva o resultado na fase a que respeita.
| Item | Resultado |
|---|---|
| Placar por critério | Arquitectura actual (v2) vence em 8 critérios · Proposta (v1) em 5 · Empates 2-3 |
| Veredicto | MANTER v2 — NestJS+Nx microserviços M0-M6, RabbitMQ goro.events, PG16 RLS, K3s |
| Ideias absorvidas da v1 (→ I60) | ① TimescaleDB no schema time · ② spec do Go Edge Agent antes da F2 · ③ Redis Streams SÓ para telemetria edge→M1. I60 RATIFICADA no input #37 («avança com mudanças i60-i65») |
| Recusados | Python no core · monólito modular · Redis como bus de eventos · shadcn/ui |
| Fila de espera | Expo (mobile) — reavaliar na F3 |
| Documento fonte | docs/ARCH_COMPARISON_V1_IMAGE.md (mantido no repositório) · página arquivada em tracker/archive/arch-compare.html |