fints-lib 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/README_advanced_usage.md +70 -0
  2. package/dist/client.d.ts +89 -0
  3. package/dist/client.js +473 -0
  4. package/dist/client.js.map +1 -0
  5. package/dist/constants.d.ts +15 -0
  6. package/dist/constants.js +19 -0
  7. package/dist/constants.js.map +1 -0
  8. package/dist/dialog.d.ts +111 -0
  9. package/dist/dialog.js +187 -0
  10. package/dist/dialog.js.map +1 -0
  11. package/dist/error-codes.d.ts +39 -0
  12. package/dist/error-codes.js +228 -0
  13. package/dist/error-codes.js.map +1 -0
  14. package/dist/errors/fints-error.d.ts +55 -0
  15. package/dist/errors/fints-error.js +131 -0
  16. package/dist/errors/fints-error.js.map +1 -0
  17. package/dist/errors/response-error.d.ts +6 -0
  18. package/dist/errors/response-error.js +20 -0
  19. package/dist/errors/response-error.js.map +1 -0
  20. package/dist/errors/tan-required-error.d.ts +40 -0
  21. package/dist/errors/tan-required-error.js +54 -0
  22. package/dist/errors/tan-required-error.js.map +1 -0
  23. package/dist/format.d.ts +81 -0
  24. package/dist/format.js +112 -0
  25. package/dist/format.js.map +1 -0
  26. package/dist/http-connection.d.ts +36 -0
  27. package/dist/http-connection.js +109 -0
  28. package/dist/http-connection.js.map +1 -0
  29. package/dist/index.d.ts +23 -0
  30. package/dist/index.js +40 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/logger.d.ts +4 -0
  33. package/dist/logger.js +13 -0
  34. package/dist/logger.js.map +1 -0
  35. package/dist/mt535.d.ts +19 -0
  36. package/dist/mt535.js +153 -0
  37. package/dist/mt535.js.map +1 -0
  38. package/dist/mt940-86-structured.d.ts +47 -0
  39. package/dist/mt940-86-structured.js +213 -0
  40. package/dist/mt940-86-structured.js.map +1 -0
  41. package/dist/pain-formats.d.ts +50 -0
  42. package/dist/pain-formats.js +7 -0
  43. package/dist/pain-formats.js.map +1 -0
  44. package/dist/pain.d.ts +21 -0
  45. package/dist/pain.js +315 -0
  46. package/dist/pain.js.map +1 -0
  47. package/dist/parse.d.ts +46 -0
  48. package/dist/parse.js +97 -0
  49. package/dist/parse.js.map +1 -0
  50. package/dist/pin-tan-client.d.ts +47 -0
  51. package/dist/pin-tan-client.js +35 -0
  52. package/dist/pin-tan-client.js.map +1 -0
  53. package/dist/request.d.ts +90 -0
  54. package/dist/request.js +102 -0
  55. package/dist/request.js.map +1 -0
  56. package/dist/response.d.ts +104 -0
  57. package/dist/response.js +197 -0
  58. package/dist/response.js.map +1 -0
  59. package/dist/return-value.d.ts +37 -0
  60. package/dist/return-value.js +31 -0
  61. package/dist/return-value.js.map +1 -0
  62. package/dist/segments/hibpa.d.ts +22 -0
  63. package/dist/segments/hibpa.js +36 -0
  64. package/dist/segments/hibpa.js.map +1 -0
  65. package/dist/segments/hiccs.d.ts +14 -0
  66. package/dist/segments/hiccs.js +28 -0
  67. package/dist/segments/hiccs.js.map +1 -0
  68. package/dist/segments/hiccss.d.ts +13 -0
  69. package/dist/segments/hiccss.js +24 -0
  70. package/dist/segments/hiccss.js.map +1 -0
  71. package/dist/segments/hicdb.d.ts +17 -0
  72. package/dist/segments/hicdb.js +62 -0
  73. package/dist/segments/hicdb.js.map +1 -0
  74. package/dist/segments/hicdbs.d.ts +16 -0
  75. package/dist/segments/hicdbs.js +28 -0
  76. package/dist/segments/hicdbs.js.map +1 -0
  77. package/dist/segments/hidse.d.ts +14 -0
  78. package/dist/segments/hidse.js +28 -0
  79. package/dist/segments/hidse.js.map +1 -0
  80. package/dist/segments/hidses.d.ts +13 -0
  81. package/dist/segments/hidses.js +24 -0
  82. package/dist/segments/hidses.js.map +1 -0
  83. package/dist/segments/hikaz.d.ts +16 -0
  84. package/dist/segments/hikaz.js +31 -0
  85. package/dist/segments/hikaz.js.map +1 -0
  86. package/dist/segments/hikazs.d.ts +16 -0
  87. package/dist/segments/hikazs.js +28 -0
  88. package/dist/segments/hikazs.js.map +1 -0
  89. package/dist/segments/hirmg.d.ts +17 -0
  90. package/dist/segments/hirmg.js +39 -0
  91. package/dist/segments/hirmg.js.map +1 -0
  92. package/dist/segments/hirms.d.ts +16 -0
  93. package/dist/segments/hirms.js +37 -0
  94. package/dist/segments/hirms.js.map +1 -0
  95. package/dist/segments/hisal.d.ts +22 -0
  96. package/dist/segments/hisal.js +33 -0
  97. package/dist/segments/hisal.js.map +1 -0
  98. package/dist/segments/hisals.d.ts +16 -0
  99. package/dist/segments/hisals.js +28 -0
  100. package/dist/segments/hisals.js.map +1 -0
  101. package/dist/segments/hispa.d.ts +16 -0
  102. package/dist/segments/hispa.js +31 -0
  103. package/dist/segments/hispa.js.map +1 -0
  104. package/dist/segments/hispas.d.ts +14 -0
  105. package/dist/segments/hispas.js +28 -0
  106. package/dist/segments/hispas.js.map +1 -0
  107. package/dist/segments/hisyn.d.ts +15 -0
  108. package/dist/segments/hisyn.js +26 -0
  109. package/dist/segments/hisyn.js.map +1 -0
  110. package/dist/segments/hitan.d.ts +18 -0
  111. package/dist/segments/hitan.js +66 -0
  112. package/dist/segments/hitan.js.map +1 -0
  113. package/dist/segments/hitans.d.ts +18 -0
  114. package/dist/segments/hitans.js +46 -0
  115. package/dist/segments/hitans.js.map +1 -0
  116. package/dist/segments/hiupd.d.ts +16 -0
  117. package/dist/segments/hiupd.js +34 -0
  118. package/dist/segments/hiupd.js.map +1 -0
  119. package/dist/segments/hiwpd.d.ts +15 -0
  120. package/dist/segments/hiwpd.js +26 -0
  121. package/dist/segments/hiwpd.js.map +1 -0
  122. package/dist/segments/hiwpds.d.ts +16 -0
  123. package/dist/segments/hiwpds.js +32 -0
  124. package/dist/segments/hiwpds.js.map +1 -0
  125. package/dist/segments/hkccs.d.ts +18 -0
  126. package/dist/segments/hkccs.js +32 -0
  127. package/dist/segments/hkccs.js.map +1 -0
  128. package/dist/segments/hkcdb.d.ts +19 -0
  129. package/dist/segments/hkcdb.js +30 -0
  130. package/dist/segments/hkcdb.js.map +1 -0
  131. package/dist/segments/hkdse.d.ts +18 -0
  132. package/dist/segments/hkdse.js +27 -0
  133. package/dist/segments/hkdse.js.map +1 -0
  134. package/dist/segments/hkend.d.ts +12 -0
  135. package/dist/segments/hkend.js +24 -0
  136. package/dist/segments/hkend.js.map +1 -0
  137. package/dist/segments/hkidn.d.ts +19 -0
  138. package/dist/segments/hkidn.js +33 -0
  139. package/dist/segments/hkidn.js.map +1 -0
  140. package/dist/segments/hkkaz.d.ts +20 -0
  141. package/dist/segments/hkkaz.js +42 -0
  142. package/dist/segments/hkkaz.js.map +1 -0
  143. package/dist/segments/hksal.d.ts +18 -0
  144. package/dist/segments/hksal.js +35 -0
  145. package/dist/segments/hksal.js.map +1 -0
  146. package/dist/segments/hkspa.d.ts +18 -0
  147. package/dist/segments/hkspa.js +31 -0
  148. package/dist/segments/hkspa.js.map +1 -0
  149. package/dist/segments/hksyn.d.ts +16 -0
  150. package/dist/segments/hksyn.js +31 -0
  151. package/dist/segments/hksyn.js.map +1 -0
  152. package/dist/segments/hktab.d.ts +17 -0
  153. package/dist/segments/hktab.js +31 -0
  154. package/dist/segments/hktab.js.map +1 -0
  155. package/dist/segments/hktan.d.ts +19 -0
  156. package/dist/segments/hktan.js +66 -0
  157. package/dist/segments/hktan.js.map +1 -0
  158. package/dist/segments/hkvvb.d.ts +17 -0
  159. package/dist/segments/hkvvb.js +39 -0
  160. package/dist/segments/hkvvb.js.map +1 -0
  161. package/dist/segments/hkwpd.d.ts +21 -0
  162. package/dist/segments/hkwpd.js +39 -0
  163. package/dist/segments/hkwpd.js.map +1 -0
  164. package/dist/segments/hnhbk.d.ts +22 -0
  165. package/dist/segments/hnhbk.js +54 -0
  166. package/dist/segments/hnhbk.js.map +1 -0
  167. package/dist/segments/hnhbs.d.ts +16 -0
  168. package/dist/segments/hnhbs.js +29 -0
  169. package/dist/segments/hnhbs.js.map +1 -0
  170. package/dist/segments/hnsha.d.ts +18 -0
  171. package/dist/segments/hnsha.js +30 -0
  172. package/dist/segments/hnsha.js.map +1 -0
  173. package/dist/segments/hnshk.d.ts +21 -0
  174. package/dist/segments/hnshk.js +44 -0
  175. package/dist/segments/hnshk.js.map +1 -0
  176. package/dist/segments/hnvsd.d.ts +25 -0
  177. package/dist/segments/hnvsd.js +31 -0
  178. package/dist/segments/hnvsd.js.map +1 -0
  179. package/dist/segments/hnvsk.d.ts +15 -0
  180. package/dist/segments/hnvsk.js +51 -0
  181. package/dist/segments/hnvsk.js.map +1 -0
  182. package/dist/segments/index.d.ts +40 -0
  183. package/dist/segments/index.js +57 -0
  184. package/dist/segments/index.js.map +1 -0
  185. package/dist/segments/segment.d.ts +60 -0
  186. package/dist/segments/segment.js +74 -0
  187. package/dist/segments/segment.js.map +1 -0
  188. package/dist/tan-method.d.ts +36 -0
  189. package/dist/tan-method.js +224 -0
  190. package/dist/tan-method.js.map +1 -0
  191. package/dist/types.d.ts +386 -0
  192. package/dist/types.js +3 -0
  193. package/dist/types.js.map +1 -0
  194. package/dist/utils.d.ts +55 -0
  195. package/dist/utils.js +178 -0
  196. package/dist/utils.js.map +1 -0
  197. package/package.json +1 -1
package/dist/pain.js ADDED
@@ -0,0 +1,315 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.selectPain001Descriptor = selectPain001Descriptor;
4
+ exports.selectPain008Descriptor = selectPain008Descriptor;
5
+ exports.buildPain008 = buildPain008;
6
+ exports.buildPain001 = buildPain001;
7
+ exports.buildDirectDebitSubmission = buildDirectDebitSubmission;
8
+ exports.buildCreditTransferSubmission = buildCreditTransferSubmission;
9
+ const date_fns_1 = require("date-fns");
10
+ const utils_1 = require("./utils");
11
+ const DEFAULT_DIRECT_DEBIT_SEQUENCE = "OOFF";
12
+ const DEFAULT_LOCAL_INSTRUMENT = "CORE";
13
+ const DEFAULT_CURRENCY = "EUR";
14
+ function escapeXml(value) {
15
+ return value
16
+ .replace(/&/g, "&")
17
+ .replace(/</g, "&lt;")
18
+ .replace(/>/g, "&gt;")
19
+ .replace(/"/g, "&quot;")
20
+ .replace(/'/g, "&apos;");
21
+ }
22
+ function formatDate(date) {
23
+ return (0, date_fns_1.format)(date, "yyyy-MM-dd");
24
+ }
25
+ function formatDateTime(date) {
26
+ return (0, date_fns_1.format)(date, "yyyy-MM-dd'T'HH:mm:ss");
27
+ }
28
+ function formatAmount(amount) {
29
+ return amount.toFixed(2);
30
+ }
31
+ function ensurePositiveAmount(amount) {
32
+ if (!(amount > 0)) {
33
+ throw new Error("Direct debit amount must be greater than zero.");
34
+ }
35
+ }
36
+ function ensureDate(value, description) {
37
+ if (!(value instanceof Date) || isNaN(value.getTime())) {
38
+ throw new Error(`${description} must be a valid date.`);
39
+ }
40
+ }
41
+ function ensureText(value, description) {
42
+ if (!value || value.trim().length === 0) {
43
+ throw new Error(`${description} must be provided.`);
44
+ }
45
+ }
46
+ function namespaceFromDescriptor(descriptor) {
47
+ const unescaped = (0, utils_1.unescapeFinTS)(descriptor);
48
+ const versionMatch = unescaped.match(/pain\.008\.\d{3}\.\d{2}/);
49
+ if (versionMatch) {
50
+ return `urn:iso:std:iso:20022:tech:xsd:${versionMatch[0]}`;
51
+ }
52
+ return unescaped.replace(/\.xsd$/i, "");
53
+ }
54
+ function namespaceFromDescriptorPain001(descriptor) {
55
+ const unescaped = (0, utils_1.unescapeFinTS)(descriptor);
56
+ const versionMatch = unescaped.match(/pain\.001\.\d{3}\.\d{2}/);
57
+ if (versionMatch) {
58
+ return `urn:iso:std:iso:20022:tech:xsd:${versionMatch[0]}`;
59
+ }
60
+ return unescaped.replace(/\.xsd$/i, "");
61
+ }
62
+ function selectPain001Descriptor(painFormats) {
63
+ const preferredVersions = ["pain.001.003.03", "pain.001.001.03", "pain.001.003.02", "pain.001.001.02"];
64
+ for (const version of preferredVersions) {
65
+ const descriptor = painFormats.find((candidate) => candidate.includes(version));
66
+ if (descriptor) {
67
+ return descriptor;
68
+ }
69
+ }
70
+ const fallback = painFormats.find((candidate) => candidate.includes("pain.001"));
71
+ if (fallback) {
72
+ return fallback;
73
+ }
74
+ throw new Error("Bank does not advertise support for pain.001 credit transfer messages.");
75
+ }
76
+ function selectPain008Descriptor(painFormats) {
77
+ const preferredVersions = ["pain.008.003.02", "pain.008.003.01", "pain.008.002.02", "pain.008.001.02"];
78
+ for (const version of preferredVersions) {
79
+ const descriptor = painFormats.find((candidate) => candidate.includes(version));
80
+ if (descriptor) {
81
+ return descriptor;
82
+ }
83
+ }
84
+ const fallback = painFormats.find((candidate) => candidate.includes("pain.008"));
85
+ if (fallback) {
86
+ return fallback;
87
+ }
88
+ throw new Error("Bank does not advertise support for pain.008 direct debit messages.");
89
+ }
90
+ function buildPain008(request, account, descriptor) {
91
+ var _a, _b;
92
+ ensureText(account.iban, "Creditor IBAN");
93
+ ensureText(account.bic, "Creditor BIC");
94
+ ensureText(request.creditorName, "Creditor name");
95
+ ensureText(request.creditorId, "Creditor identifier");
96
+ ensureText((_a = request.debtor) === null || _a === void 0 ? void 0 : _a.name, "Debtor name");
97
+ ensureText((_b = request.debtor) === null || _b === void 0 ? void 0 : _b.iban, "Debtor IBAN");
98
+ ensureText(request.mandateId, "Mandate identifier");
99
+ ensurePositiveAmount(request.amount);
100
+ ensureDate(request.mandateSignatureDate, "Mandate signature date");
101
+ ensureDate(request.requestedCollectionDate, "Requested collection date");
102
+ const createdAt = request.creationDateTime ? new Date(request.creationDateTime) : new Date();
103
+ const messageId = request.messageId || `DD-${(0, date_fns_1.format)(createdAt, "yyyyMMddHHmmssSSS")}`;
104
+ const paymentInformationId = request.paymentInformationId || messageId;
105
+ const endToEndId = request.endToEndId || "NOTPROVIDED";
106
+ const currency = request.currency || DEFAULT_CURRENCY;
107
+ const sequenceType = request.sequenceType || DEFAULT_DIRECT_DEBIT_SEQUENCE;
108
+ const localInstrument = request.localInstrument || DEFAULT_LOCAL_INSTRUMENT;
109
+ const batchBooking = request.batchBooking === true;
110
+ const namespace = namespaceFromDescriptor(descriptor);
111
+ const debtorBic = request.debtor.bic;
112
+ const amount = formatAmount(request.amount);
113
+ const creditorName = request.creditorName.trim();
114
+ const debtorName = request.debtor.name.trim();
115
+ const xmlParts = [
116
+ '<?xml version="1.0" encoding="UTF-8"?>',
117
+ `<Document xmlns="${escapeXml(namespace)}">`,
118
+ " <CstmrDrctDbtInitn>",
119
+ " <GrpHdr>",
120
+ ` <MsgId>${escapeXml(messageId)}</MsgId>`,
121
+ ` <CreDtTm>${formatDateTime(createdAt)}</CreDtTm>`,
122
+ " <NbOfTxs>1</NbOfTxs>",
123
+ ` <CtrlSum>${amount}</CtrlSum>`,
124
+ " <InitgPty>",
125
+ ` <Nm>${escapeXml(creditorName)}</Nm>`,
126
+ " </InitgPty>",
127
+ " </GrpHdr>",
128
+ " <PmtInf>",
129
+ ` <PmtInfId>${escapeXml(paymentInformationId)}</PmtInfId>`,
130
+ " <PmtMtd>DD</PmtMtd>",
131
+ ` <BtchBookg>${batchBooking ? "true" : "false"}</BtchBookg>`,
132
+ " <NbOfTxs>1</NbOfTxs>",
133
+ ` <CtrlSum>${amount}</CtrlSum>`,
134
+ " <PmtTpInf>",
135
+ " <SvcLvl>",
136
+ " <Cd>SEPA</Cd>",
137
+ " </SvcLvl>",
138
+ " <LclInstrm>",
139
+ ` <Cd>${escapeXml(localInstrument)}</Cd>`,
140
+ " </LclInstrm>",
141
+ ` <SeqTp>${escapeXml(sequenceType)}</SeqTp>`,
142
+ " </PmtTpInf>",
143
+ ` <ReqdColltnDt>${formatDate(request.requestedCollectionDate)}</ReqdColltnDt>`,
144
+ " <Cdtr>",
145
+ ` <Nm>${escapeXml(creditorName)}</Nm>`,
146
+ " </Cdtr>",
147
+ " <CdtrAcct>",
148
+ " <Id>",
149
+ ` <IBAN>${escapeXml(account.iban)}</IBAN>`,
150
+ " </Id>",
151
+ " </CdtrAcct>",
152
+ " <CdtrAgt>",
153
+ " <FinInstnId>",
154
+ ` <BIC>${escapeXml(account.bic)}</BIC>`,
155
+ " </FinInstnId>",
156
+ " </CdtrAgt>",
157
+ " <ChrgBr>SLEV</ChrgBr>",
158
+ " <CdtrSchmeId>",
159
+ " <Id>",
160
+ " <PrvtId>",
161
+ " <Othr>",
162
+ ` <Id>${escapeXml(request.creditorId)}</Id>`,
163
+ " <SchmeNm>",
164
+ " <Prtry>SEPA</Prtry>",
165
+ " </SchmeNm>",
166
+ " </Othr>",
167
+ " </PrvtId>",
168
+ " </Id>",
169
+ " </CdtrSchmeId>",
170
+ " <DrctDbtTxInf>",
171
+ " <PmtId>",
172
+ ` <EndToEndId>${escapeXml(endToEndId)}</EndToEndId>`,
173
+ " </PmtId>",
174
+ ` <InstdAmt Ccy="${escapeXml(currency)}">${amount}</InstdAmt>`,
175
+ " <DrctDbtTx>",
176
+ " <MndtRltdInf>",
177
+ ` <MndtId>${escapeXml(request.mandateId)}</MndtId>`,
178
+ ` <DtOfSgntr>${formatDate(request.mandateSignatureDate)}</DtOfSgntr>`,
179
+ " </MndtRltdInf>",
180
+ " </DrctDbtTx>",
181
+ ];
182
+ if (debtorBic) {
183
+ xmlParts.push(" <DbtrAgt>", " <FinInstnId>", ` <BIC>${escapeXml(debtorBic)}</BIC>`, " </FinInstnId>", " </DbtrAgt>");
184
+ }
185
+ xmlParts.push(" <Dbtr>", ` <Nm>${escapeXml(debtorName)}</Nm>`, " </Dbtr>", " <DbtrAcct>", " <Id>", ` <IBAN>${escapeXml(request.debtor.iban)}</IBAN>`, " </Id>", " </DbtrAcct>");
186
+ if (request.purposeCode) {
187
+ xmlParts.push(" <Purp>", ` <Cd>${escapeXml(request.purposeCode)}</Cd>`, " </Purp>");
188
+ }
189
+ if (request.remittanceInformation) {
190
+ xmlParts.push(" <RmtInf>", ` <Ustrd>${escapeXml(request.remittanceInformation)}</Ustrd>`, " </RmtInf>");
191
+ }
192
+ xmlParts.push(" </DrctDbtTxInf>", " </PmtInf>", " </CstmrDrctDbtInitn>", "</Document>");
193
+ const xml = xmlParts.join(" ");
194
+ return {
195
+ xml,
196
+ messageId,
197
+ paymentInformationId,
198
+ endToEndId,
199
+ namespace,
200
+ };
201
+ }
202
+ function buildPain001(request, account, descriptor) {
203
+ var _a, _b;
204
+ ensureText(account.iban, "Debtor IBAN");
205
+ ensureText(account.bic, "Debtor BIC");
206
+ ensureText(request.debtorName, "Debtor name");
207
+ ensureText((_a = request.creditor) === null || _a === void 0 ? void 0 : _a.name, "Creditor name");
208
+ ensureText((_b = request.creditor) === null || _b === void 0 ? void 0 : _b.iban, "Creditor IBAN");
209
+ ensurePositiveAmount(request.amount);
210
+ if (request.executionDate) {
211
+ ensureDate(request.executionDate, "Requested execution date");
212
+ }
213
+ const createdAt = request.creationDateTime ? new Date(request.creationDateTime) : new Date();
214
+ const executionDate = request.executionDate ? new Date(request.executionDate) : new Date();
215
+ ensureDate(executionDate, "Requested execution date");
216
+ const messageId = request.messageId || `CT-${(0, date_fns_1.format)(createdAt, "yyyyMMddHHmmssSSS")}`;
217
+ const paymentInformationId = request.paymentInformationId || messageId;
218
+ const endToEndId = request.endToEndId || "NOTPROVIDED";
219
+ const currency = request.currency || DEFAULT_CURRENCY;
220
+ const batchBooking = request.batchBooking === true;
221
+ const namespace = namespaceFromDescriptorPain001(descriptor);
222
+ const creditorBic = request.creditor.bic;
223
+ const amount = formatAmount(request.amount);
224
+ const debtorName = request.debtorName.trim();
225
+ const creditorName = request.creditor.name.trim();
226
+ const xmlParts = [
227
+ '<?xml version="1.0" encoding="UTF-8"?>',
228
+ `<Document xmlns="${escapeXml(namespace)}">`,
229
+ " <CstmrCdtTrfInitn>",
230
+ " <GrpHdr>",
231
+ ` <MsgId>${escapeXml(messageId)}</MsgId>`,
232
+ ` <CreDtTm>${formatDateTime(createdAt)}</CreDtTm>`,
233
+ " <NbOfTxs>1</NbOfTxs>",
234
+ ` <CtrlSum>${amount}</CtrlSum>`,
235
+ " <InitgPty>",
236
+ ` <Nm>${escapeXml(debtorName)}</Nm>`,
237
+ " </InitgPty>",
238
+ " </GrpHdr>",
239
+ " <PmtInf>",
240
+ ` <PmtInfId>${escapeXml(paymentInformationId)}</PmtInfId>`,
241
+ " <PmtMtd>TRF</PmtMtd>",
242
+ ` <BtchBookg>${batchBooking ? "true" : "false"}</BtchBookg>`,
243
+ " <NbOfTxs>1</NbOfTxs>",
244
+ ` <CtrlSum>${amount}</CtrlSum>`,
245
+ " <PmtTpInf>",
246
+ " <SvcLvl>",
247
+ " <Cd>SEPA</Cd>",
248
+ " </SvcLvl>",
249
+ " </PmtTpInf>",
250
+ ` <ReqdExctnDt>${formatDate(executionDate)}</ReqdExctnDt>`,
251
+ " <Dbtr>",
252
+ ` <Nm>${escapeXml(debtorName)}</Nm>`,
253
+ " </Dbtr>",
254
+ " <DbtrAcct>",
255
+ " <Id>",
256
+ ` <IBAN>${escapeXml(account.iban)}</IBAN>`,
257
+ " </Id>",
258
+ " </DbtrAcct>",
259
+ " <DbtrAgt>",
260
+ " <FinInstnId>",
261
+ ` <BIC>${escapeXml(account.bic)}</BIC>`,
262
+ " </FinInstnId>",
263
+ " </DbtrAgt>",
264
+ " <ChrgBr>SLEV</ChrgBr>",
265
+ " <CdtTrfTxInf>",
266
+ " <PmtId>",
267
+ ` <EndToEndId>${escapeXml(endToEndId)}</EndToEndId>`,
268
+ " </PmtId>",
269
+ " <Amt>",
270
+ ` <InstdAmt Ccy="${escapeXml(currency)}">${amount}</InstdAmt>`,
271
+ " </Amt>",
272
+ ];
273
+ if (creditorBic) {
274
+ xmlParts.push(" <CdtrAgt>", " <FinInstnId>", ` <BIC>${escapeXml(creditorBic)}</BIC>`, " </FinInstnId>", " </CdtrAgt>");
275
+ }
276
+ xmlParts.push(" <Cdtr>", ` <Nm>${escapeXml(creditorName)}</Nm>`, " </Cdtr>", " <CdtrAcct>", " <Id>", ` <IBAN>${escapeXml(request.creditor.iban)}</IBAN>`, " </Id>", " </CdtrAcct>");
277
+ if (request.purposeCode) {
278
+ xmlParts.push(" <Purp>", ` <Cd>${escapeXml(request.purposeCode)}</Cd>`, " </Purp>");
279
+ }
280
+ if (request.remittanceInformation) {
281
+ xmlParts.push(" <RmtInf>", ` <Ustrd>${escapeXml(request.remittanceInformation)}</Ustrd>`, " </RmtInf>");
282
+ }
283
+ xmlParts.push(" </CdtTrfTxInf>", " </PmtInf>", " </CstmrCdtTrfInitn>", "</Document>");
284
+ const xml = xmlParts.join(" ");
285
+ return {
286
+ xml,
287
+ messageId,
288
+ paymentInformationId,
289
+ endToEndId,
290
+ namespace,
291
+ };
292
+ }
293
+ function buildDirectDebitSubmission(request, account, descriptor) {
294
+ const { xml, messageId, paymentInformationId, endToEndId } = buildPain008(request, account, descriptor);
295
+ return {
296
+ taskId: undefined,
297
+ messageId,
298
+ paymentInformationId,
299
+ endToEndId,
300
+ painDescriptor: descriptor,
301
+ xml,
302
+ };
303
+ }
304
+ function buildCreditTransferSubmission(request, account, descriptor) {
305
+ const { xml, messageId, paymentInformationId, endToEndId } = buildPain001(request, account, descriptor);
306
+ return {
307
+ taskId: undefined,
308
+ messageId,
309
+ paymentInformationId,
310
+ endToEndId,
311
+ painDescriptor: descriptor,
312
+ xml,
313
+ };
314
+ }
315
+ //# sourceMappingURL=pain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pain.js","sourceRoot":"","sources":["../src/pain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * A set of utilities for parsing data from the fints data formats.
3
+ */
4
+ export declare const Parse: {
5
+ /**
6
+ * Parse a boolean (JN).
7
+ *
8
+ * @param str The string to parse.
9
+ *
10
+ * @return The parsed boolean.
11
+ */
12
+ bool(str: string): boolean;
13
+ /**
14
+ * Parse a number.
15
+ *
16
+ * @param str The string to parse.
17
+ *
18
+ * @return The parsed number.
19
+ */
20
+ num(str: string): number;
21
+ /**
22
+ * Parse a set of digits.
23
+ *
24
+ * @param str The string to parse.
25
+ *
26
+ * @return The parsed number.
27
+ */
28
+ dig(str: string): number;
29
+ /**
30
+ * Parse a date.
31
+ *
32
+ * @param str The string or date to parse.
33
+ *
34
+ * @return The parsed date.
35
+ */
36
+ date(str: string): Date;
37
+ /**
38
+ * Parse a xml document to an object.
39
+ *
40
+ * @param str The xml parse.
41
+ *
42
+ * @return The parsed object.
43
+ */
44
+ xml(str: string): unknown;
45
+ challengeHhdUc(str: string[][]): [string, Buffer];
46
+ };
package/dist/parse.js ADDED
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Parse = void 0;
7
+ const date_fns_1 = require("date-fns");
8
+ const fast_xml_parser_1 = require("fast-xml-parser");
9
+ const iconv_lite_1 = __importDefault(require("iconv-lite"));
10
+ /**
11
+ * A set of utilities for parsing data from the fints data formats.
12
+ */
13
+ exports.Parse = {
14
+ /**
15
+ * Parse a boolean (JN).
16
+ *
17
+ * @param str The string to parse.
18
+ *
19
+ * @return The parsed boolean.
20
+ */
21
+ bool(str) {
22
+ if (str === "J") {
23
+ return true;
24
+ }
25
+ return false;
26
+ },
27
+ /**
28
+ * Parse a number.
29
+ *
30
+ * @param str The string to parse.
31
+ *
32
+ * @return The parsed number.
33
+ */
34
+ num(str) {
35
+ if (typeof str === "undefined") {
36
+ return;
37
+ }
38
+ return Number(str.replace(/,/, "."));
39
+ },
40
+ /**
41
+ * Parse a set of digits.
42
+ *
43
+ * @param str The string to parse.
44
+ *
45
+ * @return The parsed number.
46
+ */
47
+ dig(str) {
48
+ if (str === "0") {
49
+ return 0;
50
+ }
51
+ while (str.startsWith("0")) {
52
+ str = str.substr(1, str.length);
53
+ }
54
+ return Number(str);
55
+ },
56
+ /**
57
+ * Parse a date.
58
+ *
59
+ * @param str The string or date to parse.
60
+ *
61
+ * @return The parsed date.
62
+ */
63
+ date(str) {
64
+ return (0, date_fns_1.parse)(str, "yyyyMMdd", new Date());
65
+ },
66
+ /**
67
+ * Parse a xml document to an object.
68
+ *
69
+ * @param str The xml parse.
70
+ *
71
+ * @return The parsed object.
72
+ */
73
+ xml(str) {
74
+ const parser = new fast_xml_parser_1.XMLParser();
75
+ return parser.parse(str);
76
+ },
77
+ challengeHhdUc(str) {
78
+ // tslint:disable-next-line:max-line-length
79
+ // Documentation: https://www.hbci-zka.de/dokumente/spezifikation_deutsch/hhd/Belegungsrichtlinien%20TANve1.5%20FV%20vom%202018-04-16.pdf
80
+ // II.3
81
+ // Matrix-Format:
82
+ // 2 bytes = length of mime type
83
+ // mime type as string
84
+ // 2 bytes = length of data
85
+ if (str && str[0]) {
86
+ const buffer = iconv_lite_1.default.encode(str[0][0], "ISO-8859-1");
87
+ const mediaTypeLength = buffer.readUIntBE(0, 2);
88
+ const mediaType = buffer.toString("utf8", 2, 2 + mediaTypeLength);
89
+ const imageLength = buffer.readUIntBE(2 + mediaTypeLength, 2);
90
+ return [mediaType, buffer.slice(2 + mediaTypeLength + 2, 2 + mediaTypeLength + 2 + imageLength)];
91
+ }
92
+ else {
93
+ return ["", Buffer.alloc(0)];
94
+ }
95
+ },
96
+ };
97
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":";;;;;;AAAA,uCAA8C;AAC9C,qDAA4C;AAC5C,4DAA+B;AAE/B;;GAEG;AACU,QAAA,KAAK,GAAG;IACjB;;;;;;OAMG;IACH,IAAI,CAAC,GAAW;QACZ,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;YACd,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IACD;;;;;;OAMG;IACH,GAAG,CAAC,GAAW;QACX,IAAI,OAAO,GAAG,KAAK,WAAW,EAAE,CAAC;YAC7B,OAAO;QACX,CAAC;QACD,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACzC,CAAC;IACD;;;;;;OAMG;IACH,GAAG,CAAC,GAAW;QACX,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,CAAC;QACb,CAAC;QACD,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IACD;;;;;;OAMG;IACH,IAAI,CAAC,GAAW;QACZ,OAAO,IAAA,gBAAS,EAAC,GAAG,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IACD;;;;;;OAMG;IACH,GAAG,CAAC,GAAW;QACX,MAAM,MAAM,GAAG,IAAI,2BAAS,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,cAAc,CAAC,GAAe;QAC1B,2CAA2C;QAC3C,yIAAyI;QACzI,OAAO;QAEP,iBAAiB;QACjB,gCAAgC;QAChC,sBAAsB;QACtB,2BAA2B;QAE3B,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,oBAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;YACrD,MAAM,eAAe,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChD,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC;YAClE,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,eAAe,EAAE,CAAC,CAAC,CAAC;YAC9D,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,eAAe,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;QACrG,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC;IACL,CAAC;CACJ,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { Client } from "./client";
2
+ import { Dialog, DialogConfig } from "./dialog";
3
+ import { Request } from "./request";
4
+ import { ConnectionConfig } from "./http-connection";
5
+ import { Segment } from "./segments";
6
+ /**
7
+ * Set of options needed to construct a `PinTanClient`.
8
+ */
9
+ export interface PinTanClientConfig extends Partial<ConnectionConfig> {
10
+ /**
11
+ * The fints product identification.
12
+ */
13
+ productId?: string;
14
+ /**
15
+ * The banks identification number (Bankleitzahl).
16
+ */
17
+ blz: string;
18
+ /**
19
+ * The username or identification number.
20
+ */
21
+ name: string;
22
+ /**
23
+ * The pin code or password used for authenticating with the fints server.
24
+ */
25
+ pin: string;
26
+ /**
27
+ * The URL to reach the server at.
28
+ */
29
+ url: string;
30
+ /**
31
+ * If set to `true`, will log all requests performed and responses received.
32
+ */
33
+ debug?: boolean;
34
+ }
35
+ export declare class PinTanClient extends Client {
36
+ /**
37
+ * Connection used to reach the server.
38
+ */
39
+ private connection;
40
+ /**
41
+ * Configuration for connecting and authenticating.
42
+ */
43
+ protected config: PinTanClientConfig;
44
+ constructor(config: PinTanClientConfig);
45
+ createDialog(dialogConfig?: DialogConfig): Dialog;
46
+ createRequest(dialog: Dialog, segments: Segment<any>[], tan?: string): Request;
47
+ }
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PinTanClient = void 0;
4
+ const client_1 = require("./client");
5
+ const dialog_1 = require("./dialog");
6
+ const request_1 = require("./request");
7
+ const http_connection_1 = require("./http-connection");
8
+ const constants_1 = require("./constants");
9
+ class PinTanClient extends client_1.Client {
10
+ constructor(config) {
11
+ super();
12
+ this.config = config;
13
+ const { url, debug, timeout, maxRetries, retryDelay } = config;
14
+ const connectionConfig = {
15
+ url,
16
+ debug: debug !== null && debug !== void 0 ? debug : false,
17
+ timeout: timeout !== null && timeout !== void 0 ? timeout : 30000,
18
+ maxRetries: maxRetries !== null && maxRetries !== void 0 ? maxRetries : 3,
19
+ retryDelay: retryDelay !== null && retryDelay !== void 0 ? retryDelay : 1000,
20
+ };
21
+ this.connection = new http_connection_1.HttpConnection(connectionConfig);
22
+ }
23
+ createDialog(dialogConfig) {
24
+ const { blz, name, pin, productId = constants_1.PRODUCT_NAME } = this.config;
25
+ const { connection } = this;
26
+ return new dialog_1.Dialog(dialogConfig ? dialogConfig : { blz, name, pin, systemId: "0", productId }, connection);
27
+ }
28
+ createRequest(dialog, segments, tan) {
29
+ const { blz, name, pin } = this.config;
30
+ const { systemId, dialogId, msgNo, tanMethods } = dialog;
31
+ return new request_1.Request({ blz, name, pin, systemId, dialogId, msgNo, segments, tanMethods, tan });
32
+ }
33
+ }
34
+ exports.PinTanClient = PinTanClient;
35
+ //# sourceMappingURL=pin-tan-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pin-tan-client.js","sourceRoot":"","sources":["../src/pin-tan-client.ts"],"names":[],"mappings":";;;AAAA,qCAAkC;AAClC,qCAAgD;AAChD,uCAAoC;AACpC,uDAAqE;AAGrE,2CAA2C;AAgC3C,MAAa,YAAa,SAAQ,eAAM;IAUpC,YAAY,MAA0B;QAClC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;QAC/D,MAAM,gBAAgB,GAAqB;YACvC,GAAG;YACH,KAAK,EAAE,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,KAAK;YACrB,OAAO,EAAE,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,KAAK;YACzB,UAAU,EAAE,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,CAAC;YAC3B,UAAU,EAAE,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,IAAI;SACjC,CAAC;QACF,IAAI,CAAC,UAAU,GAAG,IAAI,gCAAc,CAAC,gBAAgB,CAAC,CAAC;IAC3D,CAAC;IAEM,YAAY,CAAC,YAA2B;QAC3C,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,GAAG,wBAAY,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QACjE,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;QAC5B,OAAO,IAAI,eAAM,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,UAAU,CAAC,CAAC;IAC9G,CAAC;IAEM,aAAa,CAAC,MAAc,EAAE,QAAwB,EAAE,GAAY;QACvE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QACvC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;QACzD,OAAO,IAAI,iBAAO,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;IACjG,CAAC;CACJ;AAnCD,oCAmCC"}
@@ -0,0 +1,90 @@
1
+ import { Segment } from "./segments";
2
+ import { TanMethod } from "./tan-method";
3
+ /**
4
+ * Properties used to constructe a `Request`.
5
+ */
6
+ export declare class RequestConfig {
7
+ /**
8
+ * The banks identification number (Bankleitzahl).
9
+ */
10
+ blz: string;
11
+ /**
12
+ * The username or identification number.
13
+ */
14
+ name: string;
15
+ /**
16
+ * The pin code or password used for authenticating with the fints server.
17
+ */
18
+ pin: string;
19
+ /**
20
+ * An optional TAN for performing this request.
21
+ * Can be omitted if no TAN is needed to perform the request.
22
+ */
23
+ tan: string;
24
+ /**
25
+ * The system's id. This id needs to be stored across all dialogs and will be assigned
26
+ * by the server at the first request.
27
+ */
28
+ systemId: string;
29
+ /**
30
+ * The unique id of the message's dialog.
31
+ */
32
+ dialogId: string;
33
+ /**
34
+ * All messages sent within a dialog are numbered.
35
+ * This requests number.
36
+ */
37
+ msgNo: number;
38
+ /**
39
+ * A list of allowed TAN methods as configured by the server.
40
+ */
41
+ tanMethods: TanMethod[];
42
+ /**
43
+ * All segments that should be transmitted in the HNVSD segment of the request.
44
+ */
45
+ segments: Segment<any>[];
46
+ }
47
+ /**
48
+ * A single request holding multiple segments.
49
+ * Will likely embedded in a dialog.
50
+ */
51
+ export declare class Request extends RequestConfig {
52
+ /**
53
+ * A unique identifier for linking a signature header to its footer.
54
+ * Needs to be randomly generated and unique per dialog.
55
+ * All references in all segments need to be equal per message.
56
+ */
57
+ secRef: number;
58
+ constructor(config: Partial<RequestConfig>);
59
+ /**
60
+ * Determines if a TAN method with a "999" security function is available.
61
+ * This determines whether profile version 2 can be used.
62
+ */
63
+ private get hasNo999SecurityFunction();
64
+ /**
65
+ * Use security profile version 2 if the server supports it.
66
+ * Will be `1` or `2`, depending on the server's capabilities.
67
+ */
68
+ private get profileVersion();
69
+ /**
70
+ * Determines the security function to use. Will default to the first one if the "999" security function is
71
+ * unavailable.
72
+ */
73
+ private get securityFunction();
74
+ /**
75
+ * Returns the total number of segments in this request, including all header meta segments.
76
+ */
77
+ private get segmentCount();
78
+ /**
79
+ * An array of all segments, including the HNVSD segment wrapping the user payload segments.
80
+ */
81
+ private get fullSegments();
82
+ /**
83
+ * Generate a textual representation for debug purposes.
84
+ */
85
+ get debugString(): string;
86
+ /**
87
+ * Serialize the whole request into a string that can be sent to the server.
88
+ */
89
+ toString(): string;
90
+ }