Summary Mapping
Las summaries son "proyecciones" de una unidad de trabajo y se basan en datos recibidos por ODS. Representan el estado actual de una unidad de trabajo y se pueden buscar por varios campos.
Estos datos se "mapean" a campos de summary predefinidos y, por extensión, a algunos campos de búsqueda indexados, mediante una combinación de mapeos core, predeterminados y personalizados.
-
Los core mappings suelen ser esenciales para la funcionalidad de ODS y no pueden anularse ni personalizarse.
-
Los default mappings son los que proporciona ODS out-of-the-box y se aplican a tipos MDS ISO20022 y tipos PDS.
-
Los custom mappings son específicos de la solución y pueden anular mapeos predeterminados.
| Source Data | Core Mappings | Default Mappings | Customisable |
|---|---|---|---|
ISO20022 MDS |
Yes |
Yes |
Yes |
IPF PDS |
Yes |
Yes |
Yes |
Custom PDS |
No |
No |
Yes |
IPF Processing Data |
Yes |
No |
No |
Tanto los mapeos MDS/PDS tienen valores predeterminados como mapeos personalizados.
Core Mappings
ISO20022 MDS
| Field Name | Source | Notes | Sequence |
|---|---|---|---|
instructionReceivedAt |
pain.001 (source event timestamp) pacs.008 (source event timestamp) pacs.004 (source event timestamp) camt.029 ( camt.056 ( |
Populated on receipt of each message |
Earliest |
executionStartedAt |
pacs.008 (source event timestamp) |
Populated on receipt of each message |
Earliest |
settlementCompletedAt |
pacs.002 (source event timestamp) |
Populated on receipt of each message |
Latest |
IPF PDS
| Field Name | Source | Sequence |
|---|---|---|
journeyType |
|
Always updates if there’s a change |
paymentType |
|
Latest |
csm |
|
Latest |
timeZone |
|
Latest |
priority |
|
Latest |
relatedUnitOfWorkId |
|
Always updates if there’s a change, but shouldn’t change over the lifetime of a unit of work |
Process Flow Event
| Field Name | Source | Sequence | Notes |
|---|---|---|---|
journeyType |
|
Always updates if there’s a change |
Deprecated |
paymentType |
|
Latest |
Deprecated |
csm |
|
Latest |
Deprecated |
timeZone |
|
Latest |
Deprecated |
priority |
|
Latest |
Deprecated |
relatedUnitOfWorkId |
|
Always updates if there’s a change, but shouldn’t change over the lifetime of a unit of work |
Deprecated |
reasonText |
|
Latest |
|
reasonCode |
|
Latest |
|
startedAt |
|
Earliest |
Typically the timestamp of the first event |
terminal |
|
Latest |
Looks up the process flow status from process flow definitions to determine if the state change is terminal |
failure |
|
Latest |
Looks up the process flow status from process flow definitions to determine if the state change is a failure |
Default Mappings
| Summary Field | Sources |
|---|---|
acceptanceDateTime |
CreditTransferTransaction{pain.001.001.09}@[/accptncDtTm] CreditTransferTransaction{pacs.008.001.08}@[/accptncDtTm] |
batchBooking |
PaymentInstruction{pain.001.001.09}@[/btchBookg] |
cancellationId |
PaymentTransaction{camt.056.001.08}@[/cxlId] |
chargeAmount |
PaymentTransaction{pacs.004.001.09}@[/chrgsInf/0/amt/value] |
chargeAmountCurrency |
PaymentTransaction{pacs.004.001.09}@[/chrgsInf/0/amt/ccy] |
controlSum |
CustomerCreditTransferInitiation{pain.001.001.09}@[/grpHdr/ctrlSum] PaymentInstruction{pain.001.001.09}@[/ctrlSum] |
convertedTransactionAmount |
Fx@[/convertedCurrencyAndAmount/value] |
convertedTransactionAmountCurrency |
Fx@[/convertedCurrencyAndAmount/ccy] |
creditAccount |
AccountNotification{camt.054.001.10}@[/acct/id/othr/id or /acct/prxy/id or /acct/id/iban] when @[/ntry/0/cdtDbtInd] == "CRDT" |
creditAmount |
AccountNotification{camt.054.001.10}@[/ntry/0/ntryDtls/0/txDtls/0/amtDtls/anncdPstngAmt/amt/value] when @[/ntry/0/cdtDbtInd] == "CRDT" |
creditAmountCurrency |
AccountNotification{camt.054.001.10}@[/ntry/0/ntryDtls/0/txDtls/0/amtDtls/anncdPstngAmt/amt/ccy] when @[/ntry/0/cdtDbtInd] == "CRDT" |
creditorAccount |
CreditTransferTransaction{pain.001.001.09}@[/cdtrAcct/id/iban or /cdtrAcct/id/othr/id] CreditTransferTransaction{pacs.008.001.08}@[/cdtrAcct/id/iban or /cdtrAcct/id/othr/id] PaymentTransaction{pacs.004.001.09}@[/orgnlTxRef/cdtrAcct/id/iban or /orgnlTxRef/cdtrAcct/id/othr/id] PaymentTransaction{camt.029.001.09}@[/orgnlTxRef/cdtrAcct/id/iban or /orgnlTxRef/cdtrAcct/id/othr/id] PaymentTransaction{camt.056.001.08}@[/orgnlTxRef/cdtrAcct/id/iban or /orgnlTxRef/cdtrAcct/id/othr/id] RequestToModifyPayment{camt.087.001.06}@[/mod/cdtrAcct/id/iban or /mod/cdtrAcct/id/othr/id] |
creditorAgentBIC |
CreditTransferTransaction{pain.001.001.09}@[/cdtrAgt/finInstnId/bicfi] CreditTransferTransaction{pacs.008.001.08}@[/cdtrAgt/finInstnId/bicfi] PaymentTransaction{pacs.004.001.09}@[/orgnlTxRef/cdtrAgt/finInstnId/bicfi] PaymentTransaction{camt.029.001.09}@[/orgnlTxRef/cdtrAgt/finInstnId/bicfi] PaymentTransaction{camt.056.001.08}@[/orgnlTxRef/cdtrAgt/finInstnId/bicfi] |
creditorBIC |
CreditTransferTransaction{pain.001.001.09}@[/cdtr/id/orgId/anyBIC] CreditTransferTransaction{pacs.008.001.08}@[/cdtr/id/orgId/anyBIC] RequestToModifyPayment{camt.087.001.06}@[/mod/cdtr/id/orgId/anyBIC] |
creditorName |
CreditTransferTransaction{pain.001.001.09}@[/cdtr/nm] CreditTransferTransaction{pacs.008.001.08}@[/cdtr/nm] PaymentTransaction{pacs.004.001.09}@[/orgnlTxRef/cdtr/pty/nm] PaymentTransaction{camt.029.001.09}@[/orgnlTxRef/cdtr/pty/nm] PaymentTransaction{camt.056.001.08}@[/orgnlTxRef/cdtr/pty/nm] RequestToModifyPayment{camt.087.001.06}@[/mod/cdtr/nm] |
csm |
Csm@[/value] |
debitAccount |
AccountNotification{camt.054.001.10}@[/acct/id/othr/id or /acct/prxy/id or /acct/id/iban] when @[/ntry/0/cdtDbtInd] == "DBIT" |
debitAmount |
AccountNotification{camt.054.001.10}@[/ntry/0/ntryDtls/0/txDtls/0/amtDtls/anncdPstngAmt/amt/value] when @[/ntry/0/cdtDbtInd] == "DBIT" |
debitAmountCurrency |
AccountNotification{camt.054.001.10}@[/ntry/0/ntryDtls/0/txDtls/0/amtDtls/anncdPstngAmt/amt/ccy] when @[/ntry/0/cdtDbtInd] == "DBIT" |
debtorAccount |
CreditTransferTransaction{pain.001.001.09}@[/dbtrAcct/id/iban or /dbtrAcct/id/othr/id] PaymentInstruction{pain.001.001.09}@[/dbtrAcct/id/iban or /dbtrAcct/id/othr/id] CreditTransferTransaction{pacs.008.001.08}@[/dbtrAcct/id/iban or /dbtrAcct/id/othr/id] PaymentTransaction{pacs.004.001.09}@[/orgnlTxRef/dbtrAcct/id/iban or /orgnlTxRef/dbtrAcct/id/othr/id] PaymentTransaction{camt.029.001.09}@[/orgnlTxRef/dbtrAcct/id/iban or /orgnlTxRef/dbtrAcct/id/othr/id] PaymentTransaction{camt.056.001.08}@[/orgnlTxRef/dbtrAcct/id/iban or /orgnlTxRef/dbtrAcct/id/othr/id] RequestToModifyPayment{camt.087.001.06}@[/mod/dbtrAcct/id/iban or /mod/dbtrAcct/id/othr/id] |
debtorAgentBIC |
CreditTransferTransaction{pain.001.001.09}@[/dbtrAgt/finInstnId/bicfi] PaymentInstruction{pain.001.001.09}@[/dbtrAgt/finInstnId/bicfi] CreditTransferTransaction{pacs.008.001.08}@[/dbtrAgt/finInstnId/bicfi] PaymentTransaction{pacs.004.001.09}@[/orgnlTxRef/dbtrAgt/finInstnId/bicfi] PaymentTransaction{camt.029.001.09}@[/orgnlTxRef/dbtrAgt/finInstnId/bicfi] PaymentTransaction{camt.056.001.08}@[/orgnlTxRef/dbtrAgt/finInstnId/bicfi] |
debtorBIC |
CreditTransferTransaction{pain.001.001.09}@[/dbtr/id/orgId/anyBIC] PaymentInstruction{pain.001.001.09}@[/dbtr/id/orgId/anyBIC] CreditTransferTransaction{pacs.008.001.08}@[/dbtr/id/orgId/anyBIC] RequestToModifyPayment{camt.087.001.06}@[/mod/dbtr/id/orgId/anyBIC] |
debtorName |
CreditTransferTransaction{pain.001.001.09}@[/dbtr/nm] PaymentInstruction{pain.001.001.09}@[/dbtr/nm or /dbtrAcct/nm] CreditTransferTransaction{pacs.008.001.08}@[/dbtr/nm] PaymentTransaction{pacs.004.001.09}@[/orgnlTxRef/dbtr/pty/nm] PaymentTransaction{camt.029.001.09}@[/orgnlTxRef/dbtr/pty/nm] PaymentTransaction{camt.056.001.08}@[/orgnlTxRef/dbtr/pty/nm] RequestToModifyPayment{camt.087.001.06}@[/mod/dbtr/nm] |
exchangeRate |
Fx@[/exchangeRate] |
initiatingPartyName |
CustomerCreditTransferInitiation{pain.001.001.09}@[/grpHdr/initgPty/nm] |
instructedAgent |
FIToFICustomerCreditTransfer{pacs.008.001.08}@[/grpHdr/instdAgt/finInstnId/bicfi] PaymentReturn{pacs.004.001.09}@[/grpHdr/instdAgt/finInstnId/bicfi] PaymentTransaction{pacs.004.001.09}@[/instdAgt/finInstnId/bicfi] |
instructedAmount |
CreditTransferTransaction{pain.001.001.09}@[/amt/instdAmt/value] CreditTransferTransaction{pacs.008.001.08}@[/amt/instdAmt/value] AccountNotification{camt.054.001.10}@[/ntry/0/ntryDtls/0/txDtls/0/amtDtls/instdAmt/amt/value] RequestToModifyPayment{camt.087.001.06}@[/mod/amt/instdAmt/value] |
instructedAmountCurrency |
CreditTransferTransaction{pain.001.001.09}@[/amt/instdAmt/ccy] CreditTransferTransaction{pacs.008.001.08}@[/amt/instdAmt/ccy] AccountNotification{camt.054.001.10}@[/ntry/0/ntryDtls/0/txDtls/0/amtDtls/instdAmt/amt/ccy] RequestToModifyPayment{camt.087.001.06}@[/mod/amt/instdAmt/ccy] |
instructedParty |
FIToFIPaymentCancellationRequest{camt.056.001.08}@[/assgnmt/assgne/agt/finInstnId/bicfi or /assgnmt/assgne/agt/finInstnId/lei or /assgnmt/assgne/agt/finInstnId/nm or /assgnmt/assgne/pty/id/orgId/anyBIC] |
instructingAgent |
FIToFICustomerCreditTransfer{pacs.008.001.08}@[/grpHdr/instgAgt/finInstnId/bicfi] PaymentReturn{pacs.004.001.09}@[/grpHdr/instgAgt/finInstnId/bicfi] PaymentTransaction{pacs.004.001.09}@[/instgAgt/finInstnId/bicfi] |
instructingParty |
FIToFIPaymentCancellationRequest{camt.056.001.08}@[/assgnmt/assgnr/agt/finInstnId/bicfi or /assgnmt/assgnr/agt/finInstnId/lei or /assgnmt/assgnr/agt/finInstnId/nm or /assgnmt/assgnr/pty/id/orgId/anyBIC] |
instructionId |
CreditTransferTransaction{pain.001.001.09}@[/pmtId/instrId] CreditTransferTransaction{pacs.008.001.08}@[/pmtId/instrId] RequestToModifyPayment{camt.087.001.06}@[/mod/instrId] |
interbankSettlementDate |
CreditTransferTransaction{pain.001.001.09}@[/intrBkSttlmDt] FIToFICustomerCreditTransfer{pacs.008.001.08}@[/grpHdr/intrBkSttlmDt] CreditTransferTransaction{pacs.008.001.08}@[/intrBkSttlmDt] PaymentReturn{pacs.004.001.09}@[/grpHdr/intrBkSttlmDt] RequestToModifyPayment{camt.087.001.06}@[/mod/intrBkSttlmDt] |
journeyType |
JourneyType@[/value] |
messageId |
CustomerCreditTransferInitiation{pain.001.001.09}@[/grpHdr/msgId] FIToFICustomerCreditTransfer{pacs.008.001.08}@[/grpHdr/msgId] PaymentReturn{pacs.004.001.09}@[/grpHdr/msgId] |
numberOfTransactions |
CustomerCreditTransferInitiation{pain.001.001.09}@[/grpHdr/nbOfTxs] PaymentInstruction{pain.001.001.09}@[/nbOfTxs] FIToFICustomerCreditTransfer{pacs.008.001.08}@[/grpHdr/nbOfTxs] |
originalEndToEndId |
PaymentTransaction{pacs.004.001.09}@[/orgnlEndToEndId] PaymentTransaction{camt.029.001.09}@[/orgnlEndToEndId] PaymentTransaction{camt.056.001.08}@[/orgnlEndToEndId] RequestToModifyPayment{camt.087.001.06}@[/undrlyg/initn/orgnlEndToEndId or /undrlyg/intrBk/orgnlEndToEndId] |
originalInstructionId |
PaymentTransaction{pacs.004.001.09}@[/orgnlInstrId] PaymentTransaction{camt.029.001.09}@[/orgnlInstrId] PaymentTransaction{camt.056.001.08}@[/orgnlInstrId] RequestToModifyPayment{camt.087.001.06}@[/undrlyg/initn/orgnlInstrId or /undrlyg/intrBk/orgnlInstrId] |
originalInterbankSettlementDate |
PaymentTransaction{pacs.004.001.09}@[/orgnlTxRef/intrBkSttlmDt or /orgnlIntrBkSttlmDt] PaymentTransaction{camt.029.001.09}@[/orgnlTxRef/intrBkSttlmDt or /orgnlIntrBkSttlmDt] PaymentTransaction{camt.056.001.08}@[/orgnlTxRef/intrBkSttlmDt or /orgnlIntrBkSttlmDt] RequestToModifyPayment{camt.087.001.06}@[/undrlyg/intrBk/orgnlIntrBkSttlmDt] |
originalMessageId |
PaymentReturn{pacs.004.001.09}@[/orgnlGrpInf/orgnlMsgId] PaymentTransaction{pacs.004.001.09}@[/orgnlMsgId or /orgnlGrpInf/orgnlMsgId] PaymentTransaction{camt.029.001.09}@[/orgnlMsgId or /orgnlGrpInf/orgnlMsgId] PaymentTransaction{camt.056.001.08}@[/orgnlMsgId or /orgnlGrpInf/orgnlMsgId] RequestToModifyPayment{camt.087.001.06}@[/undrlyg/initn/orgnlGrpInf/orgnlMsgId or /undrlyg/intrBk/orgnlGrpInf/orgnlMsgId] |
originalTransactionAmount |
PaymentTransaction{pacs.004.001.09}@[/orgnlTxRef/intrBkSttlmAmt/value or /orgnlIntrBkSttlmAmt/value] PaymentTransaction{camt.029.001.09}@[/orgnlTxRef/intrBkSttlmAmt/value or /orgnlIntrBkSttlmAmt/value] PaymentTransaction{camt.056.001.08}@[/orgnlTxRef/intrBkSttlmAmt/value or /orgnlIntrBkSttlmAmt/value] RequestToModifyPayment{camt.087.001.06}@[/undrlyg/intrBk/orgnlIntrBkSttlmAmt/value] |
originalTransactionAmountCurrency |
PaymentTransaction{pacs.004.001.09}@[/orgnlTxRef/intrBkSttlmAmt/ccy or /orgnlIntrBkSttlmAmt/ccy] PaymentTransaction{camt.029.001.09}@[/orgnlTxRef/intrBkSttlmAmt/ccy or /orgnlIntrBkSttlmAmt/ccy] PaymentTransaction{camt.056.001.08}@[/orgnlTxRef/intrBkSttlmAmt/ccy or /orgnlIntrBkSttlmAmt/ccy] RequestToModifyPayment{camt.087.001.06}@[/undrlyg/intrBk/orgnlIntrBkSttlmAmt/ccy] |
originalTransactionId |
PaymentTransaction{pacs.004.001.09}@[/orgnlTxId] PaymentTransaction{camt.029.001.09}@[/orgnlTxId] PaymentTransaction{camt.056.001.08}@[/orgnlTxId] RequestToModifyPayment{camt.087.001.06}@[/undrlyg/intrBk/orgnlTxId] |
paymentInformationId |
PaymentInstruction{pain.001.001.09}@[/pmtInfId] |
paymentType |
PaymentType@[/value] |
priority |
Priority@[/value] |
relatedUnitOfWork |
RelatedUnitOfWork@[/value] |
requestedExecutionDate |
PaymentInstruction{pain.001.001.09}@[/reqdExctnDt/dtTm or /reqdExctnDt/dt] RequestToModifyPayment{camt.087.001.06}@[/mod/reqdExctnDt/dtTm or /mod/reqdExctnDt/dt] |
returnId |
PaymentTransaction{pacs.004.001.09}@[/rtrId] |
returnedAmount |
PaymentTransaction{pacs.004.001.09}@[/rtrdIntrBkSttlmAmt/value] |
returnedAmountCurrency |
PaymentTransaction{pacs.004.001.09}@[/rtrdIntrBkSttlmAmt/ccy] |
timeZone |
TimeZone@[/value] |
totalAmount |
FIToFICustomerCreditTransfer{pacs.008.001.08}@[/grpHdr/ttlIntrBkSttlmAmt/value] |
totalAmountCurrency |
FIToFICustomerCreditTransfer{pacs.008.001.08}@[/grpHdr/ttlIntrBkSttlmAmt/ccy] |
transactionAmount |
CreditTransferTransaction{pain.001.001.09}@[/intrBkSttlmAmt/value] CreditTransferTransaction{pacs.008.001.08}@[/intrBkSttlmAmt/value] AccountNotification{camt.054.001.10}@[/ntry/0/ntryDtls/0/txDtls/0/amtDtls/txAmt/amt/value] RequestToModifyPayment{camt.087.001.06}@[/mod/intrBkSttlmAmt/value] Fx@[/originalCurrencyAndAmount/value] |
transactionAmountCurrency |
CreditTransferTransaction{pain.001.001.09}@[/intrBkSttlmAmt/ccy] CreditTransferTransaction{pacs.008.001.08}@[/intrBkSttlmAmt/ccy] AccountNotification{camt.054.001.10}@[/ntry/0/ntryDtls/0/txDtls/0/amtDtls/txAmt/amt/ccy] RequestToModifyPayment{camt.087.001.06}@[/mod/intrBkSttlmAmt/ccy] Fx@[/originalCurrencyAndAmount/ccy] |
transactionId |
CreditTransferTransaction{pain.001.001.09}@[/pmtId/txId] CreditTransferTransaction{pacs.008.001.08}@[/pmtId/txId] RequestToModifyPayment{camt.087.001.06}@[/mod/txId] |
uetr |
CreditTransferTransaction{pain.001.001.09}@[/pmtId/uetr] CreditTransferTransaction{pacs.008.001.08}@[/pmtId/uetr] |
Customisation
Personalizar campos y mapeos de summary requiere construir tu propio JAR que contenga los campos y mapeos personalizados e incluirlo dentro de una aplicación ODS Ingestion desplegable para que forme parte del classpath.
Es posible personalizar los mapeos predeterminados para campos de summary existentes y también definir campos de summary completamente nuevos, para los cuales necesitas definir tus propios mapeos.
Personalizar mapeos para campos de summary existentes
Todos los default mappings pueden personalizarse/anularse. Cuando un mapeo personalizado apunta al mismo campo que un mapeo predeterminado, el mapeo predeterminado se deshabilita. Un mapeo personalizado para un campo de summary podría deshabilitar uno o más mapeos predeterminados.
Dado que el campo messageId se mapea por defecto desde un pain.001 CustomerCreditTransferInitiation, un pacs.008 FIToFICustomerCreditTransfer o un pacs.004 PaymentReturn, si se definiera un mapeo personalizado que apunte al mismo campo messageId, se deshabilitarían los tres mapeos predeterminados.
Todos los mapeos, incluidos los personalizados, se definen en código, con una única fuente y un único campo objetivo de summary; hay dos tipos de mappers.
- ::INFO
-
Cuando sea posible, prefiere los mapeadores JSON. Los mapeadores de objeto directo incurren en un coste adicional de deserialización y requieren que el tipo objetivo esté disponible en tiempo de ejecución. El mapeo de objeto directo es apropiado cuando el valor debe transformarse antes de aplicarse a la summary.
JSON Mappings
El mapeo JSON es una forma flexible de mapear a campos de summary desde objetos MDS y PDS recibidos por ODS. Con este enfoque, los tipos concretos no necesitan estar disponibles en tiempo de ejecución.
Los mapeos hacen uso de JsonPointer, que es una ruta a un campo específico dentro de un objeto JSON, p. ej., /grpHdr/msgId. El recorrido de la ruta es resistente a campos null/ausentes y el campo dentro del objeto JSON en la ruta designada se convierte/coacciona al tipo del campo de summary objetivo cuando es necesario.
-
ej., un mapper de PaymentTransaction espera un objeto MDS con el nombre de tipo "PaymentTransaction" y que el objeto de mensaje original sea un pacs.004
new JsonMdsMapper<>("PaymentTransaction", MessageNameSpecs.pacs004(), summaryFields.chargeAmount(), from("/chrgsInf/0/amt/value"));
El mapeo se aplicará a cualquier "PaymentTransaction" que se originó en un pacs.004.
Es posible mapear desde un PaymentTransaction que se originó en cualquier objeto de mensaje, p. ej., un pacs.004 o un camt.056 o un camt.029
new JsonMdsMapper<>("PaymentTransaction", MessageNameSpecs.any(), summaryFields.originalTransactionId(), from("/orgnlTxId"));
Y lo mismo puede expresarse más explícitamente
new JsonMdsMapper<>("PaymentTransaction", pacs004().or(camt056()).or(camt029()), summaryFields.originalTransactionId(), from("/orgnlTxId"));
Los mapeos también pueden ser conscientes de la versión, utilizando la versión del objeto de mensaje original, p. ej., cuando el objeto de mensaje original es un pacs.004.xxx.09.
new JsonMdsMapper<>("PaymentTransaction", pacs004().atVersion("09"), summaryFields.interbankSettlementDate(), from("/grpHdr/intrBkSttlmDt"));
Direct Object Mappings
Los mapeos de objeto directo requieren que el tipo de objeto de origen esté disponible en tiempo de ejecución, y el objeto recibido se convierte al tipo requerido cuando el nombre del tipo coincide. Esto permite que los mapeos personalizados llamen directamente a métodos sobre el objeto de origen.
-
ej., un mapper de pacs.008 espera el origen
FIToFICustomerCreditTransferV08y apunta al campo de summarymessageId.
new MdsMapper<>(FIToFICustomerCreditTransferV08.class, summaryFields.messageId(), it -> it.getGrpHdr().getMsgId());
El mismo enfoque se usa para mapeos PDS personalizados, p. ej., un mapper que espera un tipo PDS específico del cliente y apunta al campo messageId de la summary.
new PdsMapper<>(ClientSpecificPdsType.class, "ClientSpecificPdsType", summaryFields.messageId(), it -> ClientSpecificPdsType::getValue);
Configurar mapeos personalizados
Para aplicar mapeos personalizados debes proporcionar un JAR que contenga autoconfiguración de Spring que proporcione un bean com.iconsolutions.ipf.ods.summary.SummaryMappingConfigurer.
Definir un bean de configurer de summary
package com.client.ods;
import com.iconsolutions.ipf.ods.summary.MapperRegistry;
import com.iconsolutions.ipf.ods.summary.SummaryFields;
import com.iconsolutions.ipf.ods.summary.SummaryMappingConfigurer;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.context.annotation.Bean;
@AutoConfiguration
class CustomSummaryMappingConfig {
@Bean
SummaryMappingConfigurer customSummaryMappingConfigurer() {
return new SummaryMappingConfigurer() {
@Override
public void configure(final MapperRegistry registry, final SummaryFields summaryFields) {
registry
.register(new PdsMapper<>(CustomPdsType.class, "CustomPdsType", summaryFields.messageId(), CustomPdsType::getFieldA))
.register(new JsonPdsMapper<>("CustomPdsType", summaryFields.transactionId(), from("/fieldB")));
}
};
}
static final class CustomPdsType {
private String fieldA;
private String fieldB;
public String getFieldA() {
return fieldA;
}
public void setFieldA(final String fieldA) {
this.fieldA = fieldA;
}
public String getFieldB() {
return fieldB;
}
public void setFieldB(final String fieldB) {
this.fieldB = fieldB;
}
}
}
Crear archivo de Imports de Autoconfiguración de Spring
com.client.ods.CustomSummaryMappingConfig
Crear campos de summary personalizados
Es posible definir tus propios campos de summary y mapear a esos campos con tus propios mapeos personalizados. Tus campos personalizados y los mapeos que apuntan a esos campos son visibles en el summary layout.
Para crear campos de summary personalizados y mapeos personalizados, debes proporcionar un JAR que contenga autoconfiguración de Spring que proporcione un bean com.iconsolutions.ipf.ods.summary.CustomSummaryMappingConfigurer.
Definir una interfaz de campos de summary personalizados
package com.client.ods;
import com.iconsolutions.ipf.ods.summary.CustomSummaryFields;
import com.iconsolutions.ipf.ods.summary.Searchable;
import com.iconsolutions.ipf.ods.summary.SummaryField;
/**
* This interface MUST directly extend CustomSummaryFields. You do not need to implement this interface.
*/
public interface MyCustomSummaryFields extends CustomSummaryFields {
/**
* Only fields of type StringField may be searchable. Annotating a field that is not of type StringField will
* result in an exception at startup.
*/
@Searchable
SummaryField.StringField someSearchableId();
SummaryField.StringField someName();
SummaryField.BooleanField someFlag();
SummaryField.LongField someLong();
SummaryField.IntegerField someCount();
SummaryField.BigDecimalField someAmount();
SummaryField.DateField someDate();
SummaryField.DateTimeField someTimestamp();
SummaryField.DateOrDateTimeField someDateOrDateTime();
}
Definir un bean de configurer de summary personalizado
package com.client.ods;
import com.iconsolutions.ipf.ods.summary.MapperRegistry;
import com.iconsolutions.ipf.ods.summary.SummaryFields;
import com.iconsolutions.ipf.ods.summary.CustomSummaryMappingConfigurer;
import com.iconsolutions.ipf.ods.summary.TypeReference;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.context.annotation.Bean;
@AutoConfiguration
class CustomSummaryMappingConfig {
private static final TypeReference<CustomPdsType> customPdsType = new TypeReference<>() {
};
private static final String CUSTOM_PDS_TYPE = "CustomPdsType";
/**
* Your instance of CustomSummaryMappingConfigurer MUST be typed to your CustomSummaryFields subtype, in this
* case it is MyCustomSummaryFields.
*/
@Bean
CustomSummaryMappingConfigurer<MyCustomSummaryFields> customSummaryMappingConfigurer() {
return new SummaryMappingConfigurer() {
@Override
public void configure(final MapperRegistry registry, final MyCustomSummaryFields summaryFields) {
registry
//This mapping targets an existing summary field
.register(new PdsMapper<>(customPdsType, CUSTOM_PDS_TYPE, summaryFields.messageId(), CustomPdsType::getFieldA))
//This mapping targets a custom summary field
.register(new JsonPdsMapper<>(CUSTOM_PDS_TYPE, summaryFields.someSearchableId(), from("/fieldB")));
}
@Override
public Class<MyCustomSummaryFields> getSummaryFieldsType() {
return MyCustomSummaryFields.class;
}
};
}
static final class CustomPdsType {
private String fieldA;
private String fieldB;
public String getFieldA() {
return fieldA;
}
public void setFieldA(final String fieldA) {
this.fieldA = fieldA;
}
public String getFieldB() {
return fieldB;
}
public void setFieldB(final String fieldB) {
this.fieldB = fieldB;
}
}
}
Crear archivo de Imports de Autoconfiguración de Spring
com.client.ods.CustomSummaryMappingConfig
Los tipos de campos que definas están limitados en su tipo; el conjunto soportado actualmente es:
| Type | Searchable? | Description |
|---|---|---|
|
Yes |
|
|
No |
|
|
No |
|
|
No |
|
|
No |
|
|
No |
The underlying type is |
|
No |
A type that represents a date and time. Factory methods are present to aid creating instances from |
|
No |
A type that can represent either a date, or a date time. Factory methods are present to aid creating instances from |
Los campos de summary buscables personalizados deben estar indexados. En ODS los campos buscables en una summary se poblarán bajo searchFields, p. ej., searchFields.someId.
|
Despliegue de personalizaciones
Imagen Docker personalizada de ODS Ingestion
Un método para personalizar ODS es construir una imagen docker personalizada de ODS Ingestion, usando la imagen ODS Ingestion predeterminada como base. Se pueden incluir JARs adicionales en esta imagen personalizada que contengan los mapeos de summary personalizados.
Un ejemplo de tal personalización se puede ver en el repositorio ODS. Para aplicar mapeos personalizados debes proporcionar un JAR que contenga autoconfiguración de Spring que proporcione los beans SummaryMappingConfigurer y CustomSUmmaryMappingConfigurer
ODS normalmente no es consciente de tipos PDS personalizados, pero en esta configuración, tu proyecto puede incluir los tipos personalizados en código o a través de dependencias externas, y estarán disponibles en el classpath.
Los tipos PDS personalizados son recibidos por ODS como un mapa de propiedades. El tipo es en realidad Map<String, Object>. ODS convertirá este mapa al tipo deseado e invocará el mapper personalizado con el valor convertido.
| Cualquier dependencia de terceros requerida por tu JAR de mapeo personalizado también deberá incluirse en la imagen docker personalizada. Dependencias como Spring/Spring Boot/Lombok, etc. no necesitarán proporcionarse, ya que ya las proporciona ODS. |
| Evita tener más dependencias para tus mapeadores de las absolutamente necesarias. Esto ayudará a evitar problemas de classpath. |
El conjunto de dependencias recomendado del que debería depender tu JAR de mapeo personalizado es
<dependencies>
<dependency>
<groupId>com.iconsolutions.ipf.ods</groupId>
<artifactId>ods-summary-mapping-api</artifactId>
<version>${ods.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<!-- Optional: Only required if customising ISO20022 MDS Mappings -->
<dependency>
<groupId>com.iconsolutions.iso20022.model</groupId>
<artifactId>message-model-types</artifactId>
<version>${iso-model.version}</version>
</dependency>
</dependencies>
Estas no necesitarán añadirse a tu imagen docker personalizada; ya estarán presentes.
Además de estas, puede que necesites depender de otras librerías que proporcionen tus tipos PDS personalizados objetivo. Estas deberán incluirse en la imagen docker personalizada junto con tus mapeadores personalizados.
| Si tus tipos PDS personalizados son pequeños, puedes optar por duplicarlos junto a tus mapeadores personalizados en lugar de añadir otra dependencia. ODS podrá convertir a los tipos requeridos antes de invocar tus mapeadores. |
Summary Layout
El summary layout, es decir, el conjunto de campos de summary predeterminados y personalizados, los mapeos MDS y PDS personalizados, cualquier mapeo predeterminado deshabilitado y el conjunto final de mapeos, está disponible en tiempo de ejecución.
Logging
El summary layout se registra al inicio.
Ejemplo de log de summary layout
2023-10-04 15:02:57.270 INFO 1 --- [ main] c.i.ipf.ods.summary.SummaryLayoutLogger :
-------------------------------------------------------------------------------------
Summary Layout
-------------------------------------------------------------------------------------
---------------------------------------------------------------------------------
Disabled MDS Mappings
---------------------------------------------------------------------------------
Target Field Source Type
---------------------------------------------------------------------------------
debtorName PaymentInstruction30
CreditTransferTransaction39
PaymentTransaction112
PaymentTransaction102
PaymentTransaction106
messageId CustomerCreditTransferInitiationV09
FIToFICustomerCreditTransferV08
PaymentReturnV09
transactionId CreditTransferTransaction39
PaymentTransaction112
PaymentTransaction102
PaymentTransaction106
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
Custom PDS Mappings
---------------------------------------------------------------------------------
Target Field Source Type
---------------------------------------------------------------------------------
debtorName CustomPdsType
messageId CustomPdsType
transactionId CustomPdsType
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
Final Mappings
---------------------------------------------------------------------------------
Target Field Source Type
---------------------------------------------------------------------------------
acceptanceDateTime CreditTransferTransaction39
batchBooking PaymentInstruction30
cancellationId PaymentTransaction106
chargeAmount PaymentTransaction112
chargeAmountCurrency PaymentTransaction112
controlSum CustomerCreditTransferInitiationV09
PaymentInstruction30
creditAccount AccountNotification20
creditAmount AccountNotification20
creditAmountCurrency AccountNotification20
creditorAccount CreditTransferTransaction34
CreditTransferTransaction39
PaymentTransaction112
PaymentTransaction102
PaymentTransaction106
creditorAgentBIC CreditTransferTransaction34
CreditTransferTransaction39
PaymentTransaction112
PaymentTransaction102
PaymentTransaction106
creditorBIC CreditTransferTransaction34
CreditTransferTransaction39
creditorName CreditTransferTransaction34
CreditTransferTransaction39
PaymentTransaction112
PaymentTransaction102
PaymentTransaction106
debitAccount AccountNotification20
debitAmount AccountNotification20
debitAmountCurrency AccountNotification20
debtorAccount PaymentInstruction30
CreditTransferTransaction39
PaymentTransaction112
PaymentTransaction102
PaymentTransaction106
debtorAgentBIC PaymentInstruction30
CreditTransferTransaction39
PaymentTransaction112
PaymentTransaction102
PaymentTransaction106
debtorBIC PaymentInstruction30
CreditTransferTransaction39
debtorName CustomPdsType
initiatingPartyName CustomerCreditTransferInitiationV09
instructedAgent FIToFICustomerCreditTransferV08
PaymentReturnV09
PaymentTransaction112
instructedAmount CreditTransferTransaction34
AccountNotification20
instructedAmountCurrency CreditTransferTransaction34
AccountNotification20
instructedParty FIToFIPaymentCancellationRequestV08
instructingAgent FIToFICustomerCreditTransferV08
PaymentReturnV09
PaymentTransaction112
instructingParty FIToFIPaymentCancellationRequestV08
instructionId CreditTransferTransaction34
CreditTransferTransaction39
PaymentTransaction112
PaymentTransaction102
PaymentTransaction106
interbankSettlementDate FIToFICustomerCreditTransferV08
CreditTransferTransaction39
PaymentReturnV09
messageId CustomPdsType
numberOfTransactions PaymentInstruction30
FIToFICustomerCreditTransferV08
originalEndToEndId PaymentTransaction112
PaymentTransaction102
PaymentTransaction106
originalInterbankSettlementDate PaymentTransaction112
PaymentTransaction102
PaymentTransaction106
originalMessageId PaymentReturnV09
PaymentTransaction112
PaymentTransaction102
PaymentTransaction106
paymentInformationId PaymentInstruction30
requestedExecutionDate PaymentInstruction30
returnId PaymentTransaction112
returnedAmount PaymentTransaction112
returnedAmountCurrency PaymentTransaction112
totalAmount FIToFICustomerCreditTransferV08
totalAmountCurrency FIToFICustomerCreditTransferV08
transactionAmount CreditTransferTransaction39
PaymentTransaction112
PaymentTransaction102
PaymentTransaction106
AccountNotification20
transactionAmountCurrency CreditTransferTransaction39
PaymentTransaction112
PaymentTransaction102
PaymentTransaction106
AccountNotification20
transactionId CustomPdsType
uetr CreditTransferTransaction34
CreditTransferTransaction39
---------------------------------------------------------------------------------
Actuator Endpoint
El summary layout está disponible como un endpoint personalizado de Spring Boot Actuator en /actuator/summary-layout. No está habilitado por defecto.
Configura management.endpoints.web.exposure.include para incluir summary-layout, para habilitar el endpoint de summary layout, o con * para habilitar todos los endpoints de actuator.
-
ej.
management.endpoints.web.exposure.include = [health, info, prometheus, summary-layout].
Ejemplo de respuesta de summary layout
{
"finalMappings": {
"debtorAccount": [
"PaymentInstruction30",
"CreditTransferTransaction39",
"PaymentTransaction112",
"PaymentTransaction102",
"PaymentTransaction106"
],
"debitAccount": [
"AccountNotification20"
],
"creditorName": [
"CreditTransferTransaction34",
"CreditTransferTransaction39",
"PaymentTransaction112",
"PaymentTransaction102",
"PaymentTransaction106"
],
"chargeAmountCurrency": [
"PaymentTransaction112"
],
"instructedAmountCurrency": [
"CreditTransferTransaction34",
"AccountNotification20"
],
"batchBooking": [
"PaymentInstruction30"
],
"instructingAgent": [
"FIToFICustomerCreditTransferV08",
"PaymentReturnV09",
"PaymentTransaction112"
],
"cancellationId": [
"PaymentTransaction106"
],
"totalAmountCurrency": [
"FIToFICustomerCreditTransferV08"
],
"creditorBIC": [
"CreditTransferTransaction34",
"CreditTransferTransaction39"
],
"numberOfTransactions": [
"PaymentInstruction30",
"FIToFICustomerCreditTransferV08"
],
"controlSum": [
"CustomerCreditTransferInitiationV09",
"PaymentInstruction30"
],
"instructedParty": [
"FIToFIPaymentCancellationRequestV08"
],
"debtorBIC": [
"PaymentInstruction30",
"CreditTransferTransaction39"
],
"debitAmountCurrency": [
"AccountNotification20"
],
"returnedAmountCurrency": [
"PaymentTransaction112"
],
"transactionAmount": [
"CreditTransferTransaction39",
"PaymentTransaction112",
"PaymentTransaction102",
"PaymentTransaction106",
"AccountNotification20"
],
"returnId": [
"PaymentTransaction112"
],
"instructingParty": [
"FIToFIPaymentCancellationRequestV08"
],
"chargeAmount": [
"PaymentTransaction112"
],
"acceptanceDateTime": [
"CreditTransferTransaction39"
],
"instructedAmount": [
"CreditTransferTransaction34",
"AccountNotification20"
],
"originalMessageId": [
"PaymentReturnV09",
"PaymentTransaction112",
"PaymentTransaction102",
"PaymentTransaction106"
],
"creditAmountCurrency": [
"AccountNotification20"
],
"originalEndToEndId": [
"PaymentTransaction112",
"PaymentTransaction102",
"PaymentTransaction106"
],
"creditAccount": [
"AccountNotification20"
],
"paymentInformationId": [
"PaymentInstruction30"
],
"instructedAgent": [
"FIToFICustomerCreditTransferV08",
"PaymentReturnV09",
"PaymentTransaction112"
],
"messageId": [
"CustomPdsType"
],
"transactionAmountCurrency": [
"CreditTransferTransaction39",
"PaymentTransaction112",
"PaymentTransaction102",
"PaymentTransaction106",
"AccountNotification20"
],
"debtorName": [
"PaymentInstruction30",
"CreditTransferTransaction39",
"PaymentTransaction112",
"PaymentTransaction102",
"PaymentTransaction106"
],
"debitAmount": [
"AccountNotification20"
],
"transactionId": [
"CustomPdsType"
],
"totalAmount": [
"FIToFICustomerCreditTransferV08"
],
"requestedExecutionDate": [
"PaymentInstruction30"
],
"creditorAccount": [
"CreditTransferTransaction34",
"CreditTransferTransaction39",
"PaymentTransaction112",
"PaymentTransaction102",
"PaymentTransaction106"
],
"uetr": [
"CreditTransferTransaction34",
"CreditTransferTransaction39"
],
"originalInterbankSettlementDate": [
"PaymentTransaction112",
"PaymentTransaction102",
"PaymentTransaction106"
],
"instructionId": [
"CreditTransferTransaction34",
"CreditTransferTransaction39",
"PaymentTransaction112",
"PaymentTransaction102",
"PaymentTransaction106"
],
"creditorAgentBIC": [
"CreditTransferTransaction34",
"CreditTransferTransaction39",
"PaymentTransaction112",
"PaymentTransaction102",
"PaymentTransaction106"
],
"creditAmount": [
"AccountNotification20"
],
"returnedAmount": [
"PaymentTransaction112"
],
"initiatingPartyName": [
"CustomerCreditTransferInitiationV09"
],
"interbankSettlementDate": [
"FIToFICustomerCreditTransferV08",
"CreditTransferTransaction39",
"PaymentReturnV09"
],
"debtorAgentBIC": [
"PaymentInstruction30",
"CreditTransferTransaction39",
"PaymentTransaction112",
"PaymentTransaction102",
"PaymentTransaction106"
]
},
"customMdsMappings": {},
"customPdsMappings": {
"messageId": [
"CustomPdsType"
],
"transactionId": [
"CustomPdsType"
]
},
"disabledMdsMappings": {
"messageId": [
"CustomerCreditTransferInitiationV09",
"FIToFICustomerCreditTransferV08",
"PaymentReturnV09"
],
"transactionId": [
"CreditTransferTransaction39",
"PaymentTransaction112",
"PaymentTransaction102",
"PaymentTransaction106"
]
}
}