blob: aa6df2010422232821b12c41db2589c5fab222f9 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
ISO 20022
#########
ISO 20022 is the standard that defines many XML messages for FinTech. It is
very general, and often countries/orgs define subsets (TVS, technical
validation subset) of the schema.
Documentation for message fields can be viewed at https://www.iso20022.org/standardsrepository
The primary syntax for ISO 20022 messages is XML. To avoid LibEuFin clients
having to deal with XML, we define a mapping from ISO 20022 messages into JSON.
The specifics of this mapping are:
* The JSON should be "idiomatic" and easy to process
* When possible, the highly nested structures of ISO 20022 should be flattened
* It must be possible round-trip between the LibEuFin JSON and ISO 20022
XML messages. The mapping of message types is not 1-to-1, as some ISO 20022 messages are
very similar and can be mapped to the same JSON structure.
* JSON-mapped messages are not explicitly versioned. Instead, changes
are made in a backwards-compatible way, possibly preserving old versions
of message elements in the same schema.
Cash Management (camt)
======================
LibEuFin combines camt.052, camt.053 and camt.054, as they essentially
have the same structure and serve the same purpose: Reporting transactions
on a customer's bank account.
We also flatten the hierarchy a bit and only have entries ("money movement in one go")
and transactions.
.. code-block:: typescript
interface AccountTransactionItem {
// LibEuFin-internal identifier for the transaction
nexusTransactionId: string;
// Link to the entry that contains the transaction
nexusEntryId: string;
// At least one of entryId or accountServicerRef
// must be non-null
entryId?: string;
accountServicerRef?: string;
creditDebitIndicator: "credit" | "debit";
amount: string;
currency: string;
instructedAmountDetails?: {
amount: string;
currency: string;
currencyExchange?: {
sourceCurrency: string;
targetCurrency: string;
unitCurrency: string;
exchangeRate: string;
contractId: string;
quotationDate: string;
};
};
status: "booked" | "pending" | "info";
valueDate?: string;
bookingDate?: string;
mandateId?: string;
endToEndId?: string;
messageId?: string;
creditor?: Party
creditorAgent?: FinancialInstitution;
creditorAccount?: FinancialInstitution;
debtor?: Party
debtorAgent?: FinancialInstitution;
debtorAccount?: FinancialInstitution;
unstructuredRemittanceInformation?: string;
bankTransactionCode: BankTransactionCode;
}
interface Party {
name?: string;
partyType: "private" | "organization";
otherId?: {
id: string;
schemeName?: string;
issuer?: string;
};
}
interface Account {
name?: string;
currency?: string;
otherId?: {
id: string;
schemeName?: string;
issuer?: string;
};
}
interface FinancialInstitution {
type: "financial-institution";
name?: string;
bic?: string;
otherId?: {
id: string;
schemeName?: string;
issuer?: string;
};
}
interface BankTransactionCode {
domain?: string;
family?: string;
subfamily?: string;
proprietaryIssuer?: string;
proprietaryCode?: string;
}
|