Skip to main content
O plugin de TED conecta sua operação ao SPB através do PSTI JD Consultores, oferecendo uma API unificada para gerenciar todas as modalidades de transferência bancária.

Padrão arquitetural


A arquitetura do plugin adota o padrão Hexagonal (Portas e Adaptadores) combinado com CQRS (Command Query Responsibility Segregation) e um design Multi-Tenant. A arquitetura hexagonal isola a lógica de negócio de detalhes de infraestrutura, como APIs, bancos de dados e clientes de serviços externos. A comunicação entre o core e o mundo exterior ocorre através de portas (interfaces) e adaptadores (implementações). O CQRS separa operações de escrita (Commands) das operações de leitura (Queries), permitindo otimizar cada lado de forma independente.
┌─────────────────────────────────────────────────────────────────┐
│                        HTTP REST API                            │
│  POST /v1/transfers/initiate  |  POST /v1/transfers/process     │
│  GET  /v1/transfers/{id}      |  GET  /v1/transfers             │
│  POST /v1/transfers/{id}/cancel                                 │
└────────────────────────┬────────────────────────────────────────┘

         ┌───────────────┴───────────────┐
         │   Transfer Management         │
         │   (Commands + Queries)        │
         └───────────┬───────────────────┘

     ┌───────────────┼───────────────┬──────────────┐
     │               │               │              │
┌────▼────┐    ┌────▼────┐    ┌────▼────┐    ┌───▼────┐
│ Midaz   │    │   JD    │    │  CRM    │    │ Fees   │
│ Ledger  │    │  SPB    │    │(Midaz)  │    │(Plugin)│
│ (SDK)   │    │ (SOAP)  │    │ (HTTP)  │    │ (HTTP) │
└─────────┘    └─────────┘    └─────────┘    └────────┘

Componentes principais


ComponenteResponsabilidadeTecnologia
Gestão de TransferênciasOrquestra os fluxos de TED OUT, TED IN e P2PGo, Hexagonal + CQRS
Validação e ConformidadeAplica regras de horário, limites e prevenção de duplicadosRedis (operações atômicas)
Adaptador JD SPBComunicação com o sistema da JD Consultores via SOAP/XMLgowsdl, encoding/xml, crypto/rsa
Adaptador Midaz LedgerOperações de saldo: validação, provisionamento e efetivaçãomidaz-sdk-golang/v2 (gRPC/HTTP)
Adaptador CRMValida contas e recupera informações de ledgerHTTP REST client
Adaptador de TaxasCalcula taxas de transferênciaHTTP REST client
Worker de PollingDetecta novas transferências de entrada (TED IN)Goroutine (intervalo de 30s)
Publicador de WebhooksNotifica sistemas externos sobre mudanças de statusHTTP POST com retentativas e DLQ

Fluxo em duas etapas


O plugin implementa um fluxo de duas etapas para transferências de saída, permitindo que o usuário visualize a tarifa antes de confirmar:

Etapa 1: Iniciar (Initiate)

POST /v1/transfers/initiate
Calcula a tarifa e cria uma intenção de transferência válida por 24 horas. O que acontece:
  • Valida a conta de origem no CRM
  • Verifica horário de funcionamento
  • Detecta duplicatas (janela de 60 segundos)
  • Calcula tarifa via plugin-fees
  • Retorna initiationId e valores calculados

Etapa 2: Processar (Process)

POST /v1/transfers/process
Confirma a transferência e inicia o processamento. O que acontece:
  • Valida limites de uso (diário/mensal)
  • Verifica saldo disponível
  • Reserva fundos no Midaz (hold)
  • Envia mensagem ao SPB (TED OUT) ou executa transferência interna (P2P)
  • Retorna transferId e número de confirmação

Estados da transferência


Cada transferência passa por estados bem definidos:
CREATED → PENDING → PROCESSING → COMPLETED
                               → REJECTED (4xx da JD)
                               → FAILED (5xx/timeout)
        → CANCELLED (usuário cancela antes do processamento)
EstadoDescrição
CREATEDTransferência criada, aguardando processamento
PENDINGFundos reservados, aguardando envio ao SPB
PROCESSINGMensagem enviada ao SPB, aguardando confirmação
COMPLETEDTransferência concluída
REJECTEDRejeitada pelo SPB ou destinatário não encontrado
FAILEDFalha técnica (timeout, indisponibilidade)
CANCELLEDCancelada pelo usuário antes do processamento
RECEIVEDTED IN detectado, aguardando crédito

Detecção de duplicatas


O plugin detecta transferências duplicadas comparando:
  • Conta de origem
  • Dados do destinatário (ISPB, agência, conta)
  • Valor
Se uma transferência idêntica for enviada dentro da janela configurável (padrão: 60 segundos), o plugin retorna erro BTF-0012. Mecanismo:
  • Chave de idempotência: SHA256(organizationId + senderAccountId + recipient + amount)
  • Armazenamento: Redis com TTL configurável
  • Ação: Rejeitar requisições duplicadas com código 409 Conflict

Tarifas


O plugin integra-se ao plugin-fees para cálculo de tarifas em duas direções:
OperaçãoTipo de tarifa
TED OUTCashout (débito + envio)
TED INCashin (recebimento)
P2PConfigurável por organização
A tarifa é calculada na etapa de iniciação e exibida ao usuário antes da confirmação.

Comportamento em caso de indisponibilidade

ConfiguraçãoComportamento
Fail-open (padrão)Continua sem tarifa se plugin-fees indisponível
Fail-closedRejeita a operação se tarifa não puder ser calculada

Suporte multi-tenant


O plugin foi projetado para operar em diferentes modelos de implantação, garantindo isolamento de dados e configuração por cliente (tenant).

Identificação do tenant

O tenantId é extraído de um claim JWT e validado contra o cabeçalho HTTP X-Organization-Id. Essa dupla validação garante que o contexto do tenant seja propagado corretamente por toda a pilha de execução.

Isolamento de dados

Todas as consultas ao banco de dados são filtradas por organization_id, garantindo que um tenant nunca acesse dados de outro. O cache em Redis também utiliza prefixos por tenant (tenant:{tenantId}:{key}), prevenindo colisões e vazamento de informações.

Modelos de implantação

ModeloDescriçãoCaso de usoOverhead
SaaS Multi-TenantMúltiplos clientes compartilhando a mesma infraestruturaClientes Lerian em ambiente gerenciado~5-10ms
BYOC Single-TenantUm único cliente em infraestrutura dedicadaGrandes clientes com requisitos específicos<1ms
BYOC Multi-TenantCliente principal gerenciando subsidiáriasClientes que operam como plataforma~2-5ms
Flexibilidade: Um único código-base suporta todos os três modelos através de configuração, sem necessidade de branches separados.

Configuração por organização

Cada organização possui configuração independente:
  • Credenciais JD SPB (criptografadas)
  • ISPB próprio
  • URL de webhook e segredo HMAC
  • Configurações de tarifa
  • Janela de detecção de duplicatas
  • Modo de isolamento de dados (DATABASE, SCHEMA, SINGLE)

Observabilidade


O plugin expõe métricas, logs e traces para monitoramento completo.

Métricas (Prometheus)

transfer_initiated_total        # Contador de transferências iniciadas
transfer_completed_total        # Contador de transferências concluídas
transfer_failed_total           # Contador de falhas
transfer_duration_seconds       # Histograma de duração
jd_api_latency_seconds          # Latência de chamadas à JD

Logs estruturados

Todos os logs seguem formato JSON com campos contextuais:
  • tenantId: identificação do tenant
  • transferId: identificação da transferência
  • correlationId: correlação entre operações
Dados sensíveis (CPF/CNPJ) são hasheados com SHA-256.

Traces (OpenTelemetry)

Propagação de contexto entre serviços (Midaz, CRM, Fees, JD) para rastreamento distribuído.

Próximos passos