Proposta de Arquitetura Baseada em Domínios¶
1. Visão Geral¶
Esta proposta adota os princípios de Domain-Driven Design (DDD) e arquitetura de microsserviços para o ConectaFAPES. Cada domínio identificado no discovery torna-se um serviço independente, com seu próprio modelo de dados, API e ciclo de deploy.
O objetivo é alinhar os limites técnicos (bounded contexts) aos limites de negócio, garantindo autonomia de times, escalabilidade seletiva e conformidade regulatória por domínio.
2. Domínios → Serviços¶
| Serviço | Domínio | Fase Principal | Responsabilidade Central |
|---|---|---|---|
grantor-service |
Grantor | Pré-Award / Award | Publicação de editais (FOA/RFP), avaliação, parametrização de modalidades e programas |
grantee-service |
Grantee Institution / Grantee | Award / Pós-Award | Gestão de instituições receptoras e coordenadores de projeto |
subrecipient-service |
Subrecipient | Pós-Award | Gestão de bolsistas, subawards e obrigações de equipe auxiliar |
financial-service |
Financial Management | Award / Pós-Award | Execução orçamentária, desembolsos e prestação de contas |
payments-service |
Payments | Pós-Award | Folha de bolsistas, controle de acúmulo e histórico de pagamentos |
compliance-service |
Compliance | Todas | Auditoria, relatórios regulatórios e regras de conformidade (TCU/CGE) |
identity-service |
IAM (Grantor) | Transversal | Autenticação via Acesso Cidadão (PRODEST) e autorização (AuthN/AuthZ) |
3. Diagrama de Arquitetura¶
graph TB
subgraph Portais de Acesso
GP[Grantor Portal\nFAPES Admin]
AP[Applicant Portal\nPesquisadores / Bolsistas]
end
subgraph API Gateway
GW[API Gateway + PEP\nRoteamento / AuthZ]
end
subgraph Serviços de Domínio
GR[grantor-service\nEditais · Avaliação · Programas]
GE[grantee-service\nInstituições · Coordenadores]
SR[subrecipient-service\nBolsistas · Subawards]
FM[financial-service\nOrçamento · Prestação de Contas]
PM[payments-service\nFolha · Desembolsos]
CO[compliance-service\nAuditoria · Relatórios]
ID[identity-service\nIAM · Acesso Cidadão]
end
subgraph Infraestrutura Compartilhada
EB[Event Bus\nDomainEvents]
DB1[(grantor-db)]
DB2[(grantee-db)]
DB3[(subrecipient-db)]
DB4[(financial-db)]
DB5[(payments-db)]
DB6[(compliance-db)]
end
GP --> GW
AP --> GW
GW --> ID
GW --> GR
GW --> GE
GW --> SR
GW --> FM
GW --> PM
GW --> CO
GR --> DB1
GE --> DB2
SR --> DB3
FM --> DB4
PM --> DB5
CO --> DB6
GR -- AwardCreated --> EB
EB --> GE
EB --> FM
GE -- SubawardAllocated --> EB
EB --> SR
FM -- PaymentApproved --> EB
EB --> PM
PM -- PaymentExecuted --> EB
EB --> CO
4. Princípios de Comunicação¶
4.1 Síncrona (REST/gRPC)¶
Usada para consultas e ações que exigem resposta imediata:
- Portal → API Gateway → Serviço de domínio
- identity-service é chamado sincronamente pelo Gateway em toda requisição
4.2 Assíncrona (Event Bus / Mensageria)¶
Usada para propagação de Domain Events entre serviços, garantindo desacoplamento total. Nenhum serviço chama diretamente outro via HTTP para comunicação orientada a eventos.
| Evento | Produtor | Consumidores |
|---|---|---|
AwardCreated |
grantor-service |
grantee-service, financial-service |
ProposalApproved |
grantor-service |
grantee-service |
SubawardAllocated |
grantee-service |
subrecipient-service |
BudgetReserved |
financial-service |
grantee-service |
PaymentApproved |
financial-service |
payments-service |
PaymentExecuted |
payments-service |
compliance-service, subrecipient-service |
ReportSubmitted |
grantee-service |
compliance-service |
ComplianceViolation |
compliance-service |
grantor-service, financial-service |
UserSuspended |
identity-service |
grantor-service, grantee-service, payments-service |
4.3 Topologia de Mensageria Detalhada¶
Tecnologia: RabbitMQ com Exchanges por Domínio¶
Cada serviço publica em seu próprio topic exchange. Os consumidores criam queues com bindings específicos, garantindo que cada domínio processe apenas os eventos de seu interesse.
graph LR
subgraph grantor-service
G_PUB[Publisher]
end
subgraph grantee-service
GE_PUB[Publisher]
GE_SUB[Consumer]
end
subgraph financial-service
FM_PUB[Publisher]
FM_SUB[Consumer]
end
subgraph payments-service
PM_PUB[Publisher]
PM_SUB[Consumer]
end
subgraph subrecipient-service
SR_SUB[Consumer]
end
subgraph compliance-service
CO_SUB[Consumer]
end
subgraph RabbitMQ Exchanges
EX_GR[exchange: grantor.events\ntopic]
EX_GE[exchange: grantee.events\ntopic]
EX_FM[exchange: financial.events\ntopic]
EX_PM[exchange: payments.events\ntopic]
EX_ID[exchange: identity.events\ntopic]
end
subgraph Queues
Q1[queue: grantee.from-grantor]
Q2[queue: financial.from-grantor]
Q3[queue: subrecipient.from-grantee]
Q4[queue: financial.from-grantee]
Q5[queue: payments.from-financial]
Q6[queue: compliance.from-payments]
Q7[queue: compliance.from-grantee]
Q8[queue: all.from-identity]
end
G_PUB --> EX_GR
GE_PUB --> EX_GE
FM_PUB --> EX_FM
PM_PUB --> EX_PM
EX_GR -->|award.#| Q1
EX_GR -->|award.#| Q2
EX_GE -->|subaward.#| Q3
EX_GE -->|report.#| Q4
EX_FM -->|payment.approved| Q5
EX_PM -->|payment.executed| Q6
EX_GE -->|report.submitted| Q7
EX_ID -->|user.#| Q8
Q1 --> GE_SUB
Q2 --> FM_SUB
Q3 --> SR_SUB
Q5 --> PM_SUB
Q6 --> CO_SUB
Q7 --> CO_SUB
Convenção de Routing Keys¶
{dominio}.{agregado}.{evento}
Exemplos:
grantor.award.created
grantor.proposal.approved
grantee.subaward.allocated
grantee.report.submitted
financial.payment.approved
payments.payment.executed
compliance.violation.detected
identity.user.suspended
4.4 Envelope de Mensagem (Message Schema)¶
Todos os eventos seguem um envelope padronizado para garantir rastreabilidade e idempotência:
{
"messageId": "uuid-v4",
"correlationId": "uuid-v4",
"eventType": "grantor.award.created",
"occurredAt": "2026-03-01T21:00:00Z",
"producedBy": "grantor-service",
"version": "1.0",
"payload": {
"awardId": "AWARD-2026-0042",
"granteeInstitutionId": "UFES-001",
"coordinatorId": "USER-99",
"totalAmount": 150000.00,
"currency": "BRL",
"startDate": "2026-04-01",
"endDate": "2028-03-31"
}
}
| Campo | Obrigatório | Descrição |
|---|---|---|
messageId |
✅ | ID único da mensagem (usado para idempotência) |
correlationId |
✅ | ID da transação de negócio rastreável entre serviços |
eventType |
✅ | Routing key no formato dominio.agregado.evento |
occurredAt |
✅ | Timestamp UTC do evento de domínio |
producedBy |
✅ | Serviço produtor |
version |
✅ | Versão do schema do payload |
payload |
✅ | Dados específicos do evento |
4.5 Padrões de Confiabilidade¶
Outbox Pattern (Garantia de Entrega)¶
Cada serviço persiste o evento na própria base de dados antes de publicar no broker, eliminando o risco de perda em caso de falha:
sequenceDiagram
participant App as grantor-service
participant DB as grantor-db
participant Relay as Outbox Relay
participant MQ as RabbitMQ
App->>DB: BEGIN TRANSACTION
App->>DB: INSERT award (tabela awards)
App->>DB: INSERT event (tabela outbox)
App->>DB: COMMIT
Relay-->>DB: Polling / CDC (a cada 1s)
Relay->>MQ: Publish event
Relay->>DB: Mark event as published
Idempotência no Consumidor¶
Todo consumidor verifica o messageId antes de processar:
1. Busca messageId na tabela processed_messages
2. Se já existe → descarta silenciosamente
3. Se não existe → processa e registra o messageId
Dead Letter Queue (DLQ)¶
Mensagens que falham após 3 tentativas com backoff exponencial (1s → 2s → 4s) são enviadas para a DLQ do domínio:
queue: {dominio}.dlq
Ex: financial.dlq
payments.dlq
Alertas automáticos são disparados via Grafana quando a DLQ acumula mensagens, notificando o time responsável.
4.6 Fluxo Completo: Award → Pagamento¶
Exemplo end-to-end mostrando a comunicação por mensageria:
sequenceDiagram
actor Admin as FAPES Admin
participant GR as grantor-service
participant MQ as RabbitMQ
participant GE as grantee-service
participant FM as financial-service
participant PM as payments-service
participant CO as compliance-service
Admin->>GR: Publica resultado do edital
GR->>GR: Cria Award no banco
GR->>MQ: grantor.award.created
MQ-->>GE: Recebe AwardCreated
GE->>GE: Cria projeto e vincula coordenador
GE->>MQ: grantee.subaward.allocated
MQ-->>FM: Recebe SubawardAllocated
FM->>FM: Reserva orçamento
FM->>MQ: financial.payment.approved
MQ-->>PM: Recebe PaymentApproved
PM->>PM: Executa desembolso na folha
PM->>MQ: payments.payment.executed
MQ-->>CO: Recebe PaymentExecuted
CO->>CO: Registra trilha de auditoria
5. Alinhamento com o Ciclo de Vida do Grant¶
PRÉ-AWARD │ AWARD │ PÓS-AWARD
───────────────────┼──────────────────────────┼──────────────────────────
grantor-service │ grantor-service │ financial-service
identity-service │ grantee-service │ payments-service
│ financial-service │ subrecipient-service
│ identity-service │ compliance-service
│ │ identity-service
6. Autonomia de Times (Team Topology)¶
| Time | Serviço(s) | Fase |
|---|---|---|
| Time Fomento | grantor-service |
Pré-Award |
| Time Pesquisadores | grantee-service + subrecipient-service |
Award / Pós-Award |
| Time Financeiro | financial-service + payments-service |
Pós-Award |
| Time Governança | compliance-service |
Todas |
| Time Plataforma | identity-service + API Gateway + Event Bus |
Transversal |
7. Stack Tecnológica Sugerida¶
| Camada | Tecnologia |
|---|---|
| APIs | REST (OpenAPI 3.x) ou gRPC |
| Autenticação | Acesso Cidadão (PRODEST) + OAuth2/OIDC |
| Autorização | OpenFGA (RBAC/ReBAC) |
| Event Bus | RabbitMQ ou Kafka |
| Banco de Dados | PostgreSQL por serviço (isolamento total) |
| Observabilidade | OpenTelemetry + Grafana |
| Deploy | Kubernetes (por namespace de domínio) |
8. Considerações de Evolução¶
- Fase 1 (MVP): Iniciar com
grantor-service+grantee-service+identity-servicecomo monólito modular, separando gradualmente. - Fase 2: Extrair
financial-serviceepayments-serviceà medida que o volume de transações crescer. - Fase 3:
compliance-servicededicado para atender auditoria do TCU/CGE com trilhas de auditoria completas.
9. Garantia de Entrega e Observabilidade de Eventos¶
Como saber que um evento saiu? Chegou? Foi processado com sucesso?
9.1 Ciclo de Vida de um Evento¶
stateDiagram-v2
[*] --> PENDING : Evento criado na outbox
PENDING --> PUBLISHED : Relay publicou no broker
PUBLISHED --> DELIVERED : Broker confirmou (ack)
DELIVERED --> PROCESSING : Consumidor recebeu
PROCESSING --> PROCESSED : Consumidor processou com sucesso
PROCESSING --> FAILED : Erro no processamento
FAILED --> PROCESSING : Retry (backoff exponencial)
FAILED --> DEAD : Esgotou tentativas → DLQ
DEAD --> [*] : Alerta + intervenção manual
Cada transição de estado é persistida na tabela outbox do serviço produtor e na tabela processed_messages do consumidor, formando uma trilha auditável completa.
9.2 Tabela Outbox (Produtor)¶
CREATE TABLE outbox (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
message_id UUID NOT NULL UNIQUE, -- idempotência
event_type TEXT NOT NULL, -- ex: grantor.award.created
payload JSONB NOT NULL,
status TEXT NOT NULL DEFAULT 'PENDING', -- PENDING | PUBLISHED | DELIVERED
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
published_at TIMESTAMPTZ,
attempts INT NOT NULL DEFAULT 0
);
9.3 Tabela Processed Messages (Consumidor)¶
CREATE TABLE processed_messages (
message_id UUID PRIMARY KEY,
event_type TEXT NOT NULL,
processed_at TIMESTAMPTZ NOT NULL DEFAULT now(),
consumer TEXT NOT NULL -- ex: financial-service
);
Se message_id já existe → descarta silenciosamente (idempotência garantida).
9.3b Tabela Inbox (Consumidor — Serviços Críticos)¶
O inbox é o equivalente do outbox no lado do consumidor. Em vez de processar a mensagem diretamente ao receber do broker, o consumidor primeiro persiste na tabela inbox e só então processa. Isso elimina a janela de falha entre o ACK e o processamento.
Problema que resolve:
Sem inbox:
Broker → Consumer recebe → ACK ✅ → 💥 CRASH → mensagem perdida para sempre
Com inbox:
Broker → Consumer persiste na inbox (na mesma transação) → ACK ✅
Worker interno lê da inbox → Processa → Marca como PROCESSED
(Se crashar antes de processar, o worker reprocessa na próxima subida)
CREATE TABLE inbox (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
message_id UUID NOT NULL UNIQUE, -- idempotência
event_type TEXT NOT NULL,
payload JSONB NOT NULL,
status TEXT NOT NULL DEFAULT 'RECEIVED', -- RECEIVED | PROCESSING | PROCESSED | FAILED
received_at TIMESTAMPTZ NOT NULL DEFAULT now(),
processed_at TIMESTAMPTZ,
attempts INT NOT NULL DEFAULT 0
);
Fluxo com inbox:
sequenceDiagram
participant MQ as RabbitMQ
participant C as Consumer Handler
participant DB as inbox (DB)
participant W as Worker Interno
MQ->>C: Entrega mensagem
C->>DB: INSERT INTO inbox (RECEIVED)
C->>MQ: ACK ✅
W-->>DB: Polling inbox WHERE status = RECEIVED
W->>W: Processa lógica de negócio
W->>DB: UPDATE inbox SET status = PROCESSED
Quando usar cada abordagem:
| Serviço | Padrão recomendado | Justificativa |
|---|---|---|
grantor-service |
processed_messages |
Operações reversíveis |
grantee-service |
processed_messages |
Operações reversíveis |
financial-service |
inbox |
Reservas de orçamento são irreversíveis |
payments-service |
inbox |
Pagamentos de bolsistas são críticos |
compliance-service |
processed_messages |
Auditoria apenas (sem efeito financeiro) |
O correlationId é criado no ponto de origem (ex: quando o Admin publica o edital) e propagado em todos os eventos subsequentes da mesma transação de negócio:
sequenceDiagram
actor Admin
participant GR as grantor-service
participant GE as grantee-service
participant FM as financial-service
Admin->>GR: POST /awards [correlationId: abc-123]
GR->>GR: outbox: {correlationId: abc-123, event: AwardCreated}
GR-->>GE: AwardCreated {correlationId: abc-123}
GE->>GE: outbox: {correlationId: abc-123, event: SubawardAllocated}
GE-->>FM: SubawardAllocated {correlationId: abc-123}
Com isso, qualquer log ou trace com correlationId: abc-123 no Grafana/Jaeger mostra toda a cadeia de eventos de ponta a ponta.
9.5 Dashboard de Observabilidade (Grafana)¶
| Painel | Métrica | Alerta |
|---|---|---|
| Eventos publicados/min | outbox.published_count |
— |
| Eventos pendentes (backlog) | outbox{status=PENDING} > 5min |
🔴 Crítico |
| Taxa de falha por serviço | processed_messages.failed_rate |
> 5% → 🟡 Warning |
| DLQ acumulada | dlq.message_count > 0 |
🔴 Crítico |
| Latência produtor → consumidor | event.e2e_latency_ms |
> 30s → 🟡 Warning |
9.6 Saga Pattern para Transações Distribuídas¶
Quando um fluxo envolve múltiplos serviços e pode falhar no meio, utiliza-se o padrão Choreography-based Saga com eventos compensatórios:
sequenceDiagram
participant GR as grantor-service
participant FM as financial-service
participant PM as payments-service
GR->>FM: AwardCreated (reservar orçamento)
FM-->>GR: BudgetReserved ✅
FM->>PM: PaymentApproved (executar pagamento)
PM--xFM: ❌ Falha (conta bloqueada)
PM->>FM: PaymentFailed (compensação)
FM->>FM: Libera orçamento reservado
FM->>GR: BudgetReleased (compensação)
GR->>GR: Marca Award como suspenso
| Evento Compensatório | Triggered por | Ação |
|---|---|---|
PaymentFailed |
payments-service |
financial-service libera orçamento |
BudgetReleased |
financial-service |
grantor-service suspende Award |
SubawardRevoked |
grantee-service |
subrecipient-service encerra bolsista |
10. Relação de Entidades Entre Domínios¶
Como um serviço referencia entidades de outro domínio sem criar acoplamento?
10.1 Princípio: Referência por ID, Não por Objeto¶
Cada domínio mantém apenas o ID canônico de entidades externas. Nunca importa o objeto completo de outro serviço — apenas o identificador globalmente único.
grantor-service → emite AwardId
grantee-service → armazena AwardId como referência
financial-service → armazena AwardId + GranteeId como referências
payments-service → armazena SubrecipiendId + AwardId como referências
10.2 Mapa de IDs Canônicos por Domínio¶
| ID Canônico | Dono (Produtor) | Quem Referencia |
|---|---|---|
AwardId |
grantor-service |
grantee-service, financial-service, compliance-service |
FoaId (EditalId) |
grantor-service |
grantee-service |
GranteeInstitutionId |
grantee-service |
grantor-service (read-only), financial-service |
ProjectId |
grantee-service |
subrecipient-service, financial-service |
SubrecipiendId |
subrecipient-service |
payments-service |
PaymentOrderId |
financial-service |
payments-service, compliance-service |
UserId |
identity-service |
Todos os serviços |
10.3 Local Cache / Read Model¶
Quando um serviço precisa exibir dados de outro domínio (ex: nome do coordenador no relatório financeiro), ele mantém um read model local atualizado via eventos:
graph LR
GE[grantee-service] -- "CoordinatorUpdated\n{userId, name, email}" --> MQ[RabbitMQ]
MQ --> FM_RM[(financial-service\nread_model: coordinators)]
MQ --> CO_RM[(compliance-service\nread_model: coordinators)]
O financial-service nunca chama a API do grantee-service para buscar o nome do coordenador. Ele lê do seu próprio read model, que é atualizado de forma assíncrona. Isso garante:
- Autonomia de deploy (sem dependência em tempo de execução)
- Resiliência (funciona mesmo se grantee-service estiver fora do ar)
- Performance (leitura local, sem latência de rede extra)
10.4 Anti-Corruption Layer (ACL)¶
Quando dados externos precisam ser transformados para o modelo interno do domínio, usa-se uma camada de Anti-Corruption:
Evento externo recebido
↓
ACL / Translator ← Traduz para o modelo do domínio
↓
Modelo interno do domínio
↓
Lógica de negócio
Exemplo: financial-service recebe AwardCreated do grantor-service. O evento usa o modelo do Grantor. A ACL do Financial traduz para BudgetAllocationRequested, com os campos específicos do domínio financeiro.
10.5 Resumo: Regras de Ouro entre Domínios¶
| ✅ Permitido | ❌ Proibido |
|---|---|
| Referenciar entidade externa por ID | Importar model class de outro serviço |
| Manter read model local via eventos | Chamar API de outro domínio para ler dado de suporte |
| Publicar evento com dados suficientes para consumidores | Fazer JOIN entre bancos de dados de domínios distintos |
| Usar ACL para traduzir eventos externos | Compartilhar banco de dados entre serviços |
| Saga com eventos compensatórios | Transação distribuída síncrona (2PC) |
11. Portais e sua Relação com os Serviços¶
Os portais são frontends especializados por papel no ciclo de Grant Management. Cada portal se comunica exclusivamente com o API Gateway — nunca diretamente com os serviços de domínio.
11.1 Visão Geral dos Portais¶
| Portal | Usuários | Fase Predominante |
|---|---|---|
| Grantor Portal | Servidores FAPES, gestores, revisores | Pré-Award + Award + supervisão Pós-Award |
| Grantee Portal | Instituições, coordenadores, bolsistas | Award + Pós-Award |
11.2 Diagrama Completo: Portais → Gateway → Serviços¶
graph TB
subgraph Grantor Portal
GP1[Gestão de Editais]
GP2[Avaliação de Propostas]
GP3[Aprovação de Pagamentos]
GP4[Relatórios e KPIs]
GP5[Gestão de Usuários]
end
subgraph Grantee Portal
AP1[Submissão de Propostas]
AP2[Acompanhamento do Projeto]
AP3[Gestão de Bolsistas]
AP4[Prestação de Contas]
AP5[Extrato de Pagamentos]
end
subgraph API Gateway + BFF
GW[API Gateway\nAuthn · AuthZ · Rate Limit]
BFF_G[BFF Grantor\nagrupa chamadas]
BFF_A[BFF Grantee\nagrupa chamadas]
end
subgraph Serviços de Domínio
GR[grantor-service]
GE[grantee-service]
SR[subrecipient-service]
FM[financial-service]
PM[payments-service]
CO[compliance-service]
ID[identity-service]
end
GP1 & GP2 & GP3 & GP4 & GP5 --> GW
AP1 & AP2 & AP3 & AP4 & AP5 --> GW
GW --> ID
GW --> BFF_G
GW --> BFF_A
BFF_G --> GR
BFF_G --> FM
BFF_G --> CO
BFF_G --> GE
BFF_A --> GE
BFF_A --> SR
BFF_A --> PM
BFF_A --> FM
11.3 Grantor Portal — Telas × Serviços¶
| Tela / Funcionalidade | Serviços Chamados | Tipo |
|---|---|---|
| Login / Autenticação | identity-service |
Síncrono |
| Criar / publicar Edital (FOA) | grantor-service |
Síncrono |
| Listar propostas submetidas | grantor-service |
Síncrono |
| Distribuir para revisores (Ad-Hoc) | grantor-service |
Síncrono |
| Registrar parecer de mérito | grantor-service |
Síncrono |
| Publicar resultado / gerar Award | grantor-service → evento AwardCreated |
Síncrono + Evento |
| Dashboard financeiro do award | financial-service + payments-service |
Síncrono (BFF agrega) |
| Aprovar pagamento em lote | financial-service → evento PaymentApproved |
Síncrono + Evento |
| Relatório de conformidade | compliance-service |
Síncrono |
| Suspender usuário inadimplente | identity-service → evento UserSuspended |
Síncrono + Evento |
11.4 Grantee Portal — Telas × Serviços¶
| Tela / Funcionalidade | Serviços Chamados | Tipo |
|---|---|---|
| Login / Autenticação | identity-service |
Síncrono |
| Submeter proposta | grantor-service |
Síncrono |
| Acompanhar status da proposta | grantor-service |
Síncrono |
| Visualizar Award e termos | grantee-service |
Síncrono |
| Alocar bolsistas (subaward) | grantee-service → evento SubawardAllocated |
Síncrono + Evento |
| Gerenciar equipe (bolsistas) | subrecipient-service |
Síncrono |
| Extrato de pagamentos do bolsista | payments-service |
Síncrono |
| Submeter relatório de progresso | grantee-service → evento ReportSubmitted |
Síncrono + Evento |
| Prestação de contas financeira | financial-service |
Síncrono |
| Histórico de auditoria | compliance-service (read-only) |
Síncrono |
11.5 Padrão BFF (Backend for Frontend)¶
Cada portal tem seu próprio BFF responsável por: - Agregar chamadas a múltiplos serviços em uma única resposta - Adaptar o payload para o formato exato que a tela consome - Evitar que o frontend faça múltiplas chamadas para montar uma tela
Exemplo — Tela "Dashboard do Award" no Grantor Portal:
sequenceDiagram
participant GP as Grantor Portal
participant BFF as BFF Grantor
participant GR as grantor-service
participant FM as financial-service
participant PM as payments-service
GP->>BFF: GET /dashboard/award/{awardId}
BFF->>GR: GET /awards/{awardId}
BFF->>FM: GET /budgets/{awardId}
BFF->>PM: GET /payments/summary/{awardId}
BFF-->>GP: Resposta consolidada em um único JSON
Sem BFF, o Grantor Portal precisaria fazer 3 chamadas separadas e montar os dados no frontend. Com BFF, 1 chamada retorna tudo pronto.
11.6 Autorização por Portal¶
O identity-service (AuthZ via OpenFGA) garante que cada usuário acessa apenas o que lhe é permitido:
| Perfil | Portal | Permissões |
|---|---|---|
| Servidor FAPES | Grantor Portal | CRUD editais, aprovação, relatórios |
| Revisor Ad-Hoc | Grantor Portal | Read-only propostas + submeter parecer |
| Coordenador | Grantee Portal | Gerenciar projeto, alocar bolsistas, submeter relatório |
| Bolsista | Grantee Portal | Read-only: próprio extrato de pagamentos |
| Gestor Institucional | Grantee Portal | Visão agregada de todos os projetos da instituição |
12. Feature List por Portal (baseado nos Backlogs de Domínio)¶
12.1 Grantor Portal¶
Portal usado por servidores FAPES, gestores de programa e revisores. Concentra as funcionalidades dos domínios Grantor, Grantee Institution, Financial Management, Payments e Compliance.
🏛️ IAM / Gestão de Acesso (grantor-service)¶
| Feature | Domínio Origem |
|---|---|
| Login via Acesso Cidadão (PRODEST) | Grantor |
| Cadastro automático de perfil (back-office) | Grantor |
| Sincronização com organograma estadual | Grantor |
| Suspender perfil de usuário inadimplente | Grantor |
📋 Parâmetros e Configurações (grantor-service)¶
| Feature | Domínio Origem |
|---|---|
| Cadastrar Área Técnica | Grantor |
| Cadastrar Cidades e Regiões | Grantor |
| Cadastrar Áreas de Conhecimento (CNPq/CAPES) | Grantor |
| Cadastrar Modalidade de Fomento | Grantor |
| Cadastrar Nível de Bolsa (Mestrado, Doutorado, PQ) | Grantor |
| Atualizar tabela de valores de bolsas | Grantor |
| Cadastrar Resoluções e base legal | Grantor |
| Cadastrar Requisitos de Elegibilidade | Grantor |
🗂️ Planejamento Estratégico e Programas (grantor-service)¶
| Feature | Domínio Origem |
|---|---|
| Cadastrar Plano Estratégico (quadrienal) | Grantor |
| Cadastrar Eixo Estratégico | Grantor |
| Registrar Objetivos Estratégicos | Grantor |
| Configurar Indicadores de Impacto | Grantor |
| Cadastrar Programa de Fomento | Grantor |
| Associar Programa a Eixo Estratégico | Grantor |
| Cadastrar Comitê Gestor | Grantor |
| Adicionar Recursos Financeiros ao Programa | Grantor |
| Visualizar volume de propostas por programa | Grantor |
📢 Gestão de Editais / Capitação (grantor-service)¶
| Feature | Domínio Origem |
|---|---|
| Criar e configurar Edital (FOA/RFP) | Grantor |
| Gerir Templates dinâmicos de formulário | Grantor |
| Configurar etapas, datas e critérios de pontuação | Grantor |
| Instanciar / abrir Edital para submissões | Grantor |
| Associar Edital ao Programa | Grantor |
| Associar regras e documento oficial (FOA) | Grantor |
| Cadastrar e gerir Revisores Ad-Hoc | Grantor |
| Gerir filas de review e prazos | Grantor |
| Sugestão automática de avaliadores (Lattes keywords) | Grantor |
| Realizar Avaliação de Habilitação documental | Grantor |
| Realizar Avaliação de Mérito | Grantor |
| Avaliar qualidade dos pareceres dos revisores | Grantor |
| Publicar resultado (aprovados e suplentes) | Grantor |
| Receber e gerir recursos administrativos | Grantor |
| Gerar Award Agreement automaticamente | Grantor |
| Mudar status da proposta para "Contratada" | Grantor |
| Cadastrar Review Panels (Câmaras de Assessoramento) | Grantor |
| Vincular membros e histórico dos Panels | Grantor |
| Emitir certificados de participação em painéis | Grantor |
🏢 Gestão de Instituições Beneficiárias (grantee-service)¶
| Feature | Domínio Origem |
|---|---|
| Cadastrar Grantee Institution (Universidade / Empresa) | Grantee Institution |
| Cadastrar Unidades e Subunidades | Grantee Institution |
| Cadastrar Reitor e Responsáveis Legais | Grantee Institution |
| Vincular Responsável Legal à instituição | Grantee Institution |
| Portal executivo para Reitores/Diretores | Grantee Institution |
💰 Gestão Financeira (financial-service)¶
| Feature | Domínio Origem |
|---|---|
| Cadastrar Contas Contábeis (rubricas) | Financial Management |
| Associar Contas Contábeis a Editais/Convênios | Financial Management |
| Cadastrar Management Units (UGs) | Financial Management |
| Cadastrar Fontes de Recurso (Tesouro, FUNCITEC) | Financial Management |
| Cadastrar Subcontas | Financial Management |
| Cadastrar Saldo Inicial por subconta | Financial Management |
| Cadastrar Allocation Plans (cronograma de desembolso) | Financial Management |
| Definir divisão e tetos de gastos por modalidade | Financial Management |
| Relatório de Fluxo de Caixa | Financial Management |
| Monitoramento de Saldo em tempo real (Orçado × Empenhado × Pago) | Financial Management |
💳 Pagamentos e Folha (payments-service)¶
| Feature | Domínio Origem |
|---|---|
| Gerir Marcos de Pagamento (milestones) | Payments |
| Aprovar parcelas antes do envio ao banco | Payments |
| Execução de pagamento de parcelas | Payments |
| Emissão de Guias de autorização de saque | Payments |
| Geração automática da Folha mensal de bolsistas | Payments |
| Indexação de gastos de bolsas por edital | Payments |
| Alertas antecipados de prazos de vigência | Payments |
| Monitorar status da folha no processamento bancário | Payments |
| Integração @-EDI com Banestes e Bandes | Payments |
| Verificação automática de adimplência (SEFAZ/RFB) | Payments |
| Bloqueio automático por certidão vencida | Payments |
🔍 Compliance e Auditoria (compliance-service)¶
| Feature | Domínio Origem |
|---|---|
| BI simplificado para tomada de decisão | Compliance |
| Análise de Resultados (metas × alcançado) | Compliance |
| Dashboard do Programa (execução financeira pública) | Compliance |
| Dashboard de Iniciativas (mapa de calor) | Compliance |
| Dashboard Unitário de saúde financeira do grant | Compliance |
| Analisar Prestação de Contas | Compliance |
| Geração de Relatórios para TCU/SIGEF | Compliance |
| Rule Engine (bloqueio de remanejamentos proibidos) | Compliance |
| Detecção de Plágio em propostas e relatórios | Compliance |
| Verificador de Overlap / acúmulo de bolsas | Compliance |
| Validação automática de certidões | Compliance |
| Serviço de Importação de dados legados (SIGFAPES) | Compliance |
12.2 Grantee Portal¶
Portal usado por coordenadores de projeto (Grantee), bolsistas (Subrecipient) e gestores institucionais. Concentra as funcionalidades dos domínios Grantee, Subrecipient, Payments e leitura do Compliance.
🔐 Acesso e Perfil (identity-service)¶
| Feature | Domínio Origem |
|---|---|
| Login via Acesso Cidadão (PRODEST) | Grantor / IAM |
| Cadastro automático no primeiro login (front-office) | Grantor / IAM |
| Atualização de dados cadastrais e Lattes | Grantee |
| Alternar idioma da interface | Grantee |
| Ajuda contextual e base de conhecimento | Grantee |
📝 Pré-Award — Submissão de Proposta (grantor-service)¶
| Feature | Domínio Origem |
|---|---|
| Submeter Proposal (técnica + orçamento + cronograma) | Grantee |
| Upload de anexos com labeling por categoria | Grantee |
| Alertas e validação em tempo real do formulário | Grantee |
| Acompanhar status da proposta submetida | Grantee |
| Visualizar resultado da avaliação | Grantee |
📂 Post-Award — Gestão da Iniciativa (grantee-service)¶
| Feature | Domínio Origem |
|---|---|
| Overview das Iniciativas (dashboard central) | Grantee |
| Assinar Award Agreement (assinatura digital) | Grantee |
| Abrir conta do projeto (integração Banestes) | Grantee |
| Timeline visual do workflow do projeto | Grantee |
| Alerta automático ao atingir 60% de execução | Grantee |
| Solicitar mudanças em metas, prazos ou equipe | Grantee |
| Submeter resultados (artigos, protótipos, relatórios) | Grantee |
| Solicitar Suspensão do Projeto | Grantee |
| Cancelar Suspensão | Grantee |
| Solicitar Finalização do Projeto | Grantee |
| Cancelar Finalização | Grantee |
💰 Gestão Financeira do Projeto (financial-service + grantee-service)¶
| Feature | Domínio Origem |
|---|---|
| Solicitar adição orçamentária | Grantee |
| Solicitar nova Conta Contábil (rubrica) | Grantee |
| Solicitar Remanejamento de Orçamento | Grantee |
| Leitura automática de extrato bancário | Grantee |
| Submeter Reporting (prestação de contas) | Grantee |
| Contestar Reporting (recurso contra glosas) | Grantee |
| Assinatura digital de documentos financeiros | Grantee |
| Solicitar Pagamento de parcela | Payments |
| Upload de evidências via mobile (fotos/vídeos) | Grantee |
👥 Gestão de Equipe (grantee-service + subrecipient-service)¶
| Feature | Domínio Origem |
|---|---|
| Solicitar Grant (indicar novo bolsista) | Grantee |
| Criar Plano de Trabalho individual por bolsista | Grantee |
| Remanejar tipo de bolsa dentro da equipe | Grantee |
| Cancelar solicitação de bolsa | Grantee |
| Suspender solicitação de bolsa | Grantee |
| Gerir Voluntários (sem remuneração FAPES) | Grantee |
| Gerir Administrador (delegar gestão orçamentária) | Grantee |
| Workflow simplificado para envio de frequências | Grantee |
| Notificações automáticas de aceite para novos membros | Grantee |
| Dashboard institucional (todos os projetos da IES) | Grantee Institution |
🎓 Visão do Bolsista / Subrecipient (subrecipient-service + payments-service)¶
| Feature | Domínio Origem |
|---|---|
| Submeter documentos pessoais e acadêmicos (implementação) | Subrecipient |
| Assinar Termos digitalmente | Subrecipient |
| Visualizar status da indicação pelo coordenador | Subrecipient |
| Visualizar datas e status de pagamentos mensais | Subrecipient |
| Histórico consolidado de Disbursements | Subrecipient |
| Emissão de Informe de Rendimentos (IR) | Subrecipient |
| Enviar Relatórios e Frequências mensais | Subrecipient |
| Visualizar Plano de Trabalho individual | Subrecipient |
| Assinatura digital do aceite da grant (onboarding) | Subrecipient |
| Instruções guiadas de contratação (onboarding) | Subrecipient |
| Ofício automático de abertura de conta bancária | Subrecipient |
📊 Transparência e Auditoria (read-only, compliance-service)¶
| Feature | Domínio Origem |
|---|---|
| Consultar histórico de auditoria do projeto | Compliance |
| Visualizar Dashboard Unitário do projeto | Compliance |