Pular para o conteúdo principal
O modelo de dados foi projetado para garantir integridade transacional, rastreabilidade de auditoria e flexibilidade para suportar os diferentes fluxos de transferência. As entidades são armazenadas em PostgreSQL.

Entidades principais


Transfer

A entidade Transfer é o registro central para qualquer tipo de transferência (TED OUT, TED IN, P2P). Armazena os detalhes do remetente e destinatário, valores e o estado atual da transação. Campos principais:
CampoTipoDescrição
transferIdUUID (PK)Identificador único da transferência
organizationIdUUID (FK)Isolamento multi-tenant
ledgerIdUUIDDo CRM (Midaz multi-tenant)
senderAccountIdUUIDConta Midaz do remetente
recipientAccountIdUUID (nullable)Apenas para P2P
recipientDetailsJSONBISPB, agência, conta, titular
amountDecimalValor sem taxa
feeAmountDecimalTaxa cobrada
totalAmountDecimalamount + fee (calculado)
typeEnumTED_OUT, TED_IN, P2P
statusEnumEstado atual da transferência
confirmationNumberStringNúmero legível, único por organização
controlNumberStringJD SPB NumCtrlIF
midazTransactionIdUUIDReferência de transação Midaz

Máquinas de estado

CREATED → PENDING → PROCESSING → COMPLETED
                               → REJECTED (4xx da JD)
                               → FAILED (5xx/timeout)
        → CANCELLED (usuário cancela antes do processamento)

PaymentInitiation

Utilizada no fluxo de duas etapas do TED OUT, armazena os detalhes da transferência para que o cliente revise as taxas antes de confirmar. Uma iniciação expira em 24 horas se não for processada. Campos principais:
CampoTipoDescrição
initiationIdUUID (PK)Identificador único
organizationIdUUID (FK)Isolamento multi-tenant
senderAccountIdUUIDConta do remetente
recipientDetailsJSONBDados do destinatário
amountDecimalValor da transferência
feeAmountDecimalCalculado por plugin-fees
totalAmountDecimalamount + fee
statusEnumPENDING_CONFIRMATION, PROCESSED, EXPIRED
transferIdUUID (FK)Preenchido quando PROCESSED
expiresAtTimestamp24h da criação
Ciclo de vida:
Criado → Usuário revisa taxa → ProcessTransfer → PROCESSED
                                              → EXPIRED (após 24h)

TransferStatusHistory

Log de auditoria imutável que registra cada transição de estado da entidade Transfer. Fundamental para rastreabilidade e conformidade com a exigência do BACEN de reter dados por 5 anos. Campos principais:
CampoTipoDescrição
historyIdUUID (PK)Identificador único
transferIdUUID (FK)Referência para Transfer
oldStatusEnum (nullable)Estado anterior
newStatusEnumNovo estado
reasonString (nullable)Motivo (para casos de erro)
changedAtTimestampData/hora da mudança
changedByEnumsystem, user, admin
Retenção: 5 anos conforme requisito regulatório do BACEN (Resolução 4.753/2019).

JDIncomingMessage

Persiste as mensagens brutas recebidas do sistema da JD Consultores antes de qualquer processamento. Garante que nenhuma transferência de entrada (TED IN) seja perdida em caso de falha, implementando garantia de entrega at-most-once. Campos principais:
CampoTipoDescrição
organizationIdUUID (FK)Isolamento multi-tenant
sequenceNumberString (unique)JD NumCabSeq
controlNumberString (nullable)NumCtrlIF
messageCodeEnumSTR0008R2, STR0010R2
returnTypeEnumP=Processed, E=Error, R=Receipt, C=Cancelled
rawXmlTextMensagem JD completa (auditoria)
processedBooleanfalse inicialmente
transferIdUUID (FK)Preenchido após processamento
Garantia crítica: A mensagem é persistida ANTES do processamento, garantindo que nenhuma transferência seja perdida em caso de falha.

OrganizationConfig

Armazena as configurações específicas de cada cliente (tenant), como credenciais da JD (criptografadas), URL de webhook e configurações de taxas. Campos principais:
CampoTipoDescrição
organizationIdUUID (PK)Mesmo que JWT tenantId
jdCredentialsJSONB (encrypted)legacyCode, userCode, password, privateKey
jdIspbString8 dígitos (ISPB da instituição)
webhookUrlStringURL HTTPS para notificações
webhookSecretStringSegredo HMAC para validação
feeEnabledBooleanHabilita cobrança de tarifa
duplicateWindowSecIntegerJanela de deduplicação (10-300, padrão 60)
tenantModeEnumDATABASE, SCHEMA, SINGLE

Relacionamento entre entidades


OrganizationConfig (1) ──< has many >── (*) Transfer
                                           ├─< has many >─ (*) TransferStatusHistory
                                           └─< originates from >─ (0..1) PaymentInitiation

JDIncomingMessage (1) ──< creates >── (0..1) Transfer (do tipo TED_IN)
Propriedade de dados: Cada entidade é de propriedade de UM componente, seguindo os princípios da Arquitetura Hexagonal.

Índices e performance


Índices principais

TabelaÍndicePropósito
transfers(organization_id, created_at)Listagem paginada por data
transfers(organization_id, status)Filtro por status
transfers(control_number)Lookup por número JD
jd_incoming_message(sequence_number)Deduplicação at-most-once
transfer_status_history(transfer_id, changed_at)Auditoria cronológica

Particionamento

Tabelas de auditoria são particionadas por mês para melhor performance em consultas históricas e facilitar a gestão de retenção de dados.

Campos para reconciliação


CampoUso
controlNumberNúmero de controle do JD SPB (único por transferência)
transferIdIdentificador interno da Lerian
confirmationNumberNúmero legível para o usuário final
createdAtTimestamp de criação
completedAtTimestamp de conclusão
O histórico de transferências é mantido por 5 anos, conforme requisitos regulatórios do BACEN.