Saltar al contenido principal
El modelo de datos fue diseñado para garantizar integridad transaccional, rastreabilidad de auditoría y flexibilidad para soportar los diferentes flujos de transferencia. Las entidades se almacenan en PostgreSQL.

Entidades principales


Transfer

La entidad Transfer es el registro central para cualquier tipo de transferencia (TED OUT, TED IN, P2P). Almacena los detalles del remitente y destinatario, valores y el estado actual de la transacción. Campos principales:
CampoTipoDescripción
transferIdUUID (PK)Identificador único de la transferencia
organizationIdUUID (FK)Aislamiento multi-tenant
ledgerIdUUIDDel CRM (Midaz multi-tenant)
senderAccountIdUUIDCuenta Midaz del remitente
recipientAccountIdUUID (nullable)Solo para P2P
recipientDetailsJSONBISPB, sucursal, cuenta, titular
amountDecimalValor sin tarifa
feeAmountDecimalTarifa cobrada
totalAmountDecimalamount + fee (calculado)
typeEnumTED_OUT, TED_IN, P2P
statusEnumEstado actual de la transferencia
confirmationNumberStringNúmero legible, único por organización
controlNumberStringJD SPB NumCtrlIF
midazTransactionIdUUIDReferencia de transacción Midaz

Máquinas de estado

CREATED → PENDING → PROCESSING → COMPLETED
                               → REJECTED (4xx de JD)
                               → FAILED (5xx/timeout)
        → CANCELLED (usuario cancela antes del procesamiento)

PaymentInitiation

Utilizada en el flujo de dos etapas del TED OUT, almacena los detalles de la transferencia para que el cliente revise las tarifas antes de confirmar. Una iniciación expira en 24 horas si no es procesada. Campos principales:
CampoTipoDescripción
initiationIdUUID (PK)Identificador único
organizationIdUUID (FK)Aislamiento multi-tenant
senderAccountIdUUIDCuenta del remitente
recipientDetailsJSONBDatos del destinatario
amountDecimalValor de la transferencia
feeAmountDecimalCalculado por plugin-fees
totalAmountDecimalamount + fee
statusEnumPENDING_CONFIRMATION, PROCESSED, EXPIRED
transferIdUUID (FK)Completado cuando PROCESSED
expiresAtTimestamp24h desde la creación
Ciclo de vida:
Creado → Usuario revisa tarifa → ProcessTransfer → PROCESSED
                                                 → EXPIRED (después de 24h)

TransferStatusHistory

Log de auditoría inmutable que registra cada transición de estado de la entidad Transfer. Fundamental para rastreabilidad y cumplimiento con la exigencia del BACEN de retener datos por 5 años. Campos principales:
CampoTipoDescripción
historyIdUUID (PK)Identificador único
transferIdUUID (FK)Referencia a Transfer
oldStatusEnum (nullable)Estado anterior
newStatusEnumNuevo estado
reasonString (nullable)Motivo (para casos de error)
changedAtTimestampFecha/hora del cambio
changedByEnumsystem, user, admin
Retención: 5 años conforme requisito regulatorio del BACEN (Resolución 4.753/2019).

JDIncomingMessage

Persiste los mensajes brutos recibidos del sistema de JD Consultores antes de cualquier procesamiento. Garantiza que ninguna transferencia de entrada (TED IN) sea perdida en caso de falla, implementando garantía de entrega at-least-once. La deduplicación se maneja mediante la restricción única de sequenceNumber. Campos principales:
CampoTipoDescripción
organizationIdUUID (FK)Aislamiento multi-tenant
sequenceNumberString (unique)JD NumCabSeq (usado para deduplicación)
controlNumberString (nullable)NumCtrlIF
messageCodeEnumSTR0008R2, STR0010R2
returnTypeEnumP=Processed, E=Error, R=Receipt, C=Cancelled
rawXmlTextMensaje JD completo (auditoría)
processedBooleanfalse inicialmente
transferIdUUID (FK)Completado después del procesamiento
Garantía crítica: El mensaje es persistido ANTES del procesamiento, garantizando que ninguna transferencia sea perdida en caso de falla. Los mensajes duplicados se manejan mediante la restricción única de sequenceNumber.

OrganizationConfig

Almacena las configuraciones específicas de cada cliente (tenant), como credenciales de JD (encriptadas), URL de webhook y configuraciones de tarifas. Campos principales:
CampoTipoDescripción
organizationIdUUID (PK)Mismo que JWT tenantId
jdCredentialsJSONB (encrypted)legacyCode, userCode, password, privateKey
jdIspbString8 dígitos (ISPB de la institución)
webhookUrlStringURL HTTPS para notificaciones
webhookSecretStringSecreto HMAC para validación
feeEnabledBooleanHabilita cobro de tarifa
duplicateWindowSecIntegerVentana de deduplicación (10-300, default 60)
tenantModeEnumDATABASE, SCHEMA, SINGLE

Relación entre entidades


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

JDIncomingMessage (1) ──< creates >── (0..1) Transfer (de tipo TED_IN)
Propiedad de datos: Cada entidad es propiedad de UN componente, siguiendo los principios de la Arquitectura Hexagonal.

Índices y rendimiento


Índices principales

TablaÍndicePropósito
transfers(organization_id, created_at)Listado paginado por fecha
transfers(organization_id, status)Filtro por estado
transfers(control_number)Búsqueda por número JD
jd_incoming_message(sequence_number)Deduplicación at-least-once
transfer_status_history(transfer_id, changed_at)Auditoría cronológica

Particionamiento

Las tablas de auditoría están particionadas por mes para mejor rendimiento en consultas históricas y facilitar la gestión de retención de datos.

Campos para reconciliación


CampoUso
controlNumberNúmero de control del JD SPB (único por transferencia)
transferIdIdentificador interno de Lerian
confirmationNumberNúmero legible para el usuario final
createdAtTimestamp de creación
completedAtTimestamp de conclusión
El historial de transferencias se mantiene por 5 años, conforme requisitos regulatorios del BACEN.