Our back office involves a lot of disparate systems, database systems and
flows of data, and the macro architecture of the business seems to be in a bit
of flux. If we leave it to emerge spontaneously from our independent choices
it will make adding new components much more complex.

Most of these concepts have already been locked in but some questions have
resurfaced. In this context we need to review how we specify how we
interoperate going forward:



Modulr callback JSON

{
"name": "ModlrHook",
"type": "record",
"namespace": "intelect.modlr.avro",
"fields": [
{
"name": "Type",
"type": "string"
},
{
"name": "Payee",
"type": {
"name": "Payee",
"type": "record",
"fields": [
{
"name": "Name",
"type": "string"
},
{
"name": "Address",
"type": {
"name": "AddressFields",
"type": "record",
"fields": []
}
},
{
"name": "Identifier",
"type": {
"name": "Identifier",
"type": "record",
"fields": [
{
"name": "Type",
"type": "string"
},
{
"name": "SortCode",
"type": "string"
},
{
"name": "AccountNumber",
"type": "string"
}
]
}
}
]
}
},
{
"name": "Payer",
"type": {
"name": "Payer",
"type": "record",
"fields": [
{
"name": "Name",
"type": "string"
},
{
"name": "Address",
"type": {
"name": "Address",
"type": "record",
"fields": []
}
},
{
"name": "Identifier",
"type": {
"name": "IdentifierFields",
"type": "record",
"fields": [
{
"name": "Type",
"type": "string"
},
{
"name": "SortCode",
"type": "string"
},
{
"name": "AccountNumber",
"type": "string"
}
]
}
}
]
}
},
{
"name": "Amount",
"type": "string"
},
{
"name": "EventId",
"type": "string"
},
{
"name": "Currency",
"type": "string"
},
{
"name": "DateTime",
"type": "string",
"logicalType": "date"
},
{
"name": "AccountId",
"type": "string"
},
{
"name": "EventName",
"type": "string"
},
{
"name": "EventTime",
"type": "string",
"logicalType": "date"
},
{
"name": "PaymentAppliedTime",
"type": "string",
"logicalType": "date"
},
{
"name": "PayerName",
"type": "string"
},
{
"name": "PaymentId",
"type": "string"
},
{
"name": "SchemeInfo",
"type": {
"name": "SchemeInfo",
"type": "record",
"fields": [
{
"name": "Id",
"type": "string"
}
]
}
},
{
"name": "TransactionId",
"type": "string"
},
{
"name": "PaymentReference",
"type": "string"
},
{
"name": "AccountExternalRef",
"type": "string"
},
{
"name": "OriginatedOverseas",
"type": "boolean"
},
{
"name": "OriginatingPayment",
"type": {
"name": "OriginatingPayment",
"type": "record",
"fields": [
{
"name": "Institution",
"type": {
"name": "Institution",
"type": "record",
"fields": [
{
"name": "Id",
"type": "string"
}
]
}
}
]
}
}
]
}

AVRO is used to formally specify data packets' structure and the data within. This is in contrast with the informal data packages in JSON.
{
"Type": "PI_FAST",
"Payee": {
"Name": "Harry Potter",
"Address": {},
"Identifier": {
"Type": "SCAN",
"SortCode": "040010",
"AccountNumber": "00001457"
}
},
"Payer": {
"Name": "Hermione Granger",
"Address": {},
"Identifier": {
"Type": "SCAN",
"SortCode": "203002",
"AccountNumber": "00004588"
}
},
"Amount": "6.00",
"EventId": "7a1b81bc-5d5c-4045-9099-66b6ea841969",
"Currency": "GBP",
"DateTime": "2020-01-01T16:38:06+0000",
"AccountId": "A120C8D3",
"EventName": "PAYIN",
"EventTime": "2020-01-01T16:38:06+0000",
"PaymentAppliedTime": "2020-01-01T16:38:06+0000",
"PayerName": "Hermione Granger",
"PaymentId": "P12000MWF8",
"SchemeInfo": {
"Id": "FP00009O144093771020200101826070123"
},
"TransactionId": "T12000N5TJ",
"PaymentReference": "Payment from Hermione Granger: For herbs",
"AccountExternalRef": "HOGWARTS ACADEMY",
"OriginatedOverseas": false,
"OriginatingPayment": {
"Institution": {
"Id": "070436"
}
}
}


https://docs.confluent.io/kafka-connectors/salesforce/current/overview.html