lib-fints 1.0.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 (306) hide show
  1. package/LICENSE +504 -0
  2. package/README.md +216 -0
  3. package/dist/accountBalance.js +1 -0
  4. package/dist/bankAccount.js +34 -0
  5. package/dist/bankAnswer.js +1 -0
  6. package/dist/bankTransaction.js +1 -0
  7. package/dist/bankingInformation.js +1 -0
  8. package/dist/bpd.js +1 -0
  9. package/dist/client.js +165 -0
  10. package/dist/codes.js +79 -0
  11. package/dist/config.js +181 -0
  12. package/dist/dataElements/AlphaNumeric.js +24 -0
  13. package/dist/dataElements/Amount.js +6 -0
  14. package/dist/dataElements/Binary.js +20 -0
  15. package/dist/dataElements/Country.js +6 -0
  16. package/dist/dataElements/Currency.js +6 -0
  17. package/dist/dataElements/Dat.js +18 -0
  18. package/dist/dataElements/DataElement.js +37 -0
  19. package/dist/dataElements/Digits.js +23 -0
  20. package/dist/dataElements/Float.js +21 -0
  21. package/dist/dataElements/Identification.js +6 -0
  22. package/dist/dataElements/Numeric.js +26 -0
  23. package/dist/dataElements/Text.js +21 -0
  24. package/dist/dataElements/Time.js +18 -0
  25. package/dist/dataElements/YesNo.js +18 -0
  26. package/dist/dataGroups/Account.js +12 -0
  27. package/dist/dataGroups/Balance.js +15 -0
  28. package/dist/dataGroups/BankIdentification.js +8 -0
  29. package/dist/dataGroups/DataGroup.js +54 -0
  30. package/dist/dataGroups/InternationalAccount.js +15 -0
  31. package/dist/dataGroups/Money.js +8 -0
  32. package/dist/dataGroups/RefMessage.js +8 -0
  33. package/dist/dataGroups/TimeStamp.js +8 -0
  34. package/dist/decoder.js +97 -0
  35. package/dist/dialog.js +189 -0
  36. package/dist/encoder.js +47 -0
  37. package/dist/format.js +6 -0
  38. package/dist/httpClient.js +41 -0
  39. package/dist/httpClientNode.js +59 -0
  40. package/dist/index.js +15 -0
  41. package/dist/interactions/balanceInteraction.js +47 -0
  42. package/dist/interactions/customerInteraction.js +55 -0
  43. package/dist/interactions/initDialogInteraction.js +155 -0
  44. package/dist/interactions/statementInteraction.js +44 -0
  45. package/dist/interactions/tanMediaInteraction.js +27 -0
  46. package/dist/message.js +198 -0
  47. package/dist/mt940parser.js +307 -0
  48. package/dist/parser.js +30 -0
  49. package/dist/partedSegment.js +8 -0
  50. package/dist/segment.js +59 -0
  51. package/dist/segmentDefinition.js +11 -0
  52. package/dist/segmentHeader.js +13 -0
  53. package/dist/segments/HIBPA.js +23 -0
  54. package/dist/segments/HIKAZ.js +13 -0
  55. package/dist/segments/HIKAZS.js +13 -0
  56. package/dist/segments/HIKIM.js +11 -0
  57. package/dist/segments/HIKOM.js +23 -0
  58. package/dist/segments/HIPINS.js +22 -0
  59. package/dist/segments/HIRMG.js +20 -0
  60. package/dist/segments/HIRMS.js +20 -0
  61. package/dist/segments/HISAL.js +31 -0
  62. package/dist/segments/HISYN.js +16 -0
  63. package/dist/segments/HITAB.js +37 -0
  64. package/dist/segments/HITAN.js +23 -0
  65. package/dist/segments/HITANS.js +48 -0
  66. package/dist/segments/HIUPA.js +18 -0
  67. package/dist/segments/HIUPD.js +34 -0
  68. package/dist/segments/HKEND.js +11 -0
  69. package/dist/segments/HKIDN.js +18 -0
  70. package/dist/segments/HKKAZ.js +24 -0
  71. package/dist/segments/HKSAL.js +21 -0
  72. package/dist/segments/HKSYN.js +11 -0
  73. package/dist/segments/HKTAB.js +12 -0
  74. package/dist/segments/HKTAN.js +35 -0
  75. package/dist/segments/HKVVB.js +18 -0
  76. package/dist/segments/HNHBK.js +20 -0
  77. package/dist/segments/HNHBS.js +11 -0
  78. package/dist/segments/HNSHA.js +17 -0
  79. package/dist/segments/HNSHK.js +43 -0
  80. package/dist/segments/HNVSD.js +11 -0
  81. package/dist/segments/HNVSK.js +45 -0
  82. package/dist/segments/businessTransactionParameter.js +20 -0
  83. package/dist/segments/registry.js +71 -0
  84. package/dist/tanMethod.js +1 -0
  85. package/dist/tests/HIBPA.test.js +26 -0
  86. package/dist/tests/HIPINS.test.js +14 -0
  87. package/dist/tests/HIRMG.test.js +24 -0
  88. package/dist/tests/HITAB.test.js +19 -0
  89. package/dist/tests/HITANS.test.js +19 -0
  90. package/dist/tests/HIUPA.test.js +11 -0
  91. package/dist/tests/HIUPD.test.js +11 -0
  92. package/dist/tests/HKIDN.test.js +22 -0
  93. package/dist/tests/HKSAL.test.js +45 -0
  94. package/dist/tests/HKTAN.test.js +21 -0
  95. package/dist/tests/HNSHK.test.js +11 -0
  96. package/dist/tests/HNVSK.test.js +11 -0
  97. package/dist/tests/client.test.js +33 -0
  98. package/dist/tests/datatypes.test.js +8 -0
  99. package/dist/tests/message.test.js +80 -0
  100. package/dist/tests/mt940parser.test.js +56 -0
  101. package/dist/tests/parser.test.js +20 -0
  102. package/dist/types/accountBalance.d.ts +9 -0
  103. package/dist/types/accountBalance.d.ts.map +1 -0
  104. package/dist/types/bankAccount.d.ts +27 -0
  105. package/dist/types/bankAccount.d.ts.map +1 -0
  106. package/dist/types/bankAnswer.d.ts +6 -0
  107. package/dist/types/bankAnswer.d.ts.map +1 -0
  108. package/dist/types/bankTransaction.d.ts +6 -0
  109. package/dist/types/bankTransaction.d.ts.map +1 -0
  110. package/dist/types/bankingInformation.d.ts +20 -0
  111. package/dist/types/bankingInformation.d.ts.map +1 -0
  112. package/dist/types/bpd.d.ts +17 -0
  113. package/dist/types/bpd.d.ts.map +1 -0
  114. package/dist/types/client.d.ts +86 -0
  115. package/dist/types/client.d.ts.map +1 -0
  116. package/dist/types/codes.d.ts +68 -0
  117. package/dist/types/codes.d.ts.map +1 -0
  118. package/dist/types/config.d.ts +99 -0
  119. package/dist/types/config.d.ts.map +1 -0
  120. package/dist/types/dataElements/AlphaNumeric.d.ts +8 -0
  121. package/dist/types/dataElements/AlphaNumeric.d.ts.map +1 -0
  122. package/dist/types/dataElements/Amount.d.ts +5 -0
  123. package/dist/types/dataElements/Amount.d.ts.map +1 -0
  124. package/dist/types/dataElements/Binary.d.ts +8 -0
  125. package/dist/types/dataElements/Binary.d.ts.map +1 -0
  126. package/dist/types/dataElements/Country.d.ts +5 -0
  127. package/dist/types/dataElements/Country.d.ts.map +1 -0
  128. package/dist/types/dataElements/Currency.d.ts +5 -0
  129. package/dist/types/dataElements/Currency.d.ts.map +1 -0
  130. package/dist/types/dataElements/Dat.d.ts +8 -0
  131. package/dist/types/dataElements/Dat.d.ts.map +1 -0
  132. package/dist/types/dataElements/DataElement.d.ts +14 -0
  133. package/dist/types/dataElements/DataElement.d.ts.map +1 -0
  134. package/dist/types/dataElements/Digits.d.ts +8 -0
  135. package/dist/types/dataElements/Digits.d.ts.map +1 -0
  136. package/dist/types/dataElements/Float.d.ts +8 -0
  137. package/dist/types/dataElements/Float.d.ts.map +1 -0
  138. package/dist/types/dataElements/Identification.d.ts +5 -0
  139. package/dist/types/dataElements/Identification.d.ts.map +1 -0
  140. package/dist/types/dataElements/Numeric.d.ts +9 -0
  141. package/dist/types/dataElements/Numeric.d.ts.map +1 -0
  142. package/dist/types/dataElements/Text.d.ts +8 -0
  143. package/dist/types/dataElements/Text.d.ts.map +1 -0
  144. package/dist/types/dataElements/Time.d.ts +8 -0
  145. package/dist/types/dataElements/Time.d.ts.map +1 -0
  146. package/dist/types/dataElements/YesNo.d.ts +7 -0
  147. package/dist/types/dataElements/YesNo.d.ts.map +1 -0
  148. package/dist/types/dataGroups/Account.d.ts +14 -0
  149. package/dist/types/dataGroups/Account.d.ts.map +1 -0
  150. package/dist/types/dataGroups/Balance.d.ts +12 -0
  151. package/dist/types/dataGroups/Balance.d.ts.map +1 -0
  152. package/dist/types/dataGroups/BankIdentification.d.ts +5 -0
  153. package/dist/types/dataGroups/BankIdentification.d.ts.map +1 -0
  154. package/dist/types/dataGroups/DataGroup.d.ts +10 -0
  155. package/dist/types/dataGroups/DataGroup.d.ts.map +1 -0
  156. package/dist/types/dataGroups/InternationalAccount.d.ts +13 -0
  157. package/dist/types/dataGroups/InternationalAccount.d.ts.map +1 -0
  158. package/dist/types/dataGroups/Money.d.ts +9 -0
  159. package/dist/types/dataGroups/Money.d.ts.map +1 -0
  160. package/dist/types/dataGroups/RefMessage.d.ts +9 -0
  161. package/dist/types/dataGroups/RefMessage.d.ts.map +1 -0
  162. package/dist/types/dataGroups/TimeStamp.d.ts +9 -0
  163. package/dist/types/dataGroups/TimeStamp.d.ts.map +1 -0
  164. package/dist/types/decoder.d.ts +4 -0
  165. package/dist/types/decoder.d.ts.map +1 -0
  166. package/dist/types/dialog.d.ts +21 -0
  167. package/dist/types/dialog.d.ts.map +1 -0
  168. package/dist/types/encoder.d.ts +3 -0
  169. package/dist/types/encoder.d.ts.map +1 -0
  170. package/dist/types/format.d.ts +3 -0
  171. package/dist/types/format.d.ts.map +1 -0
  172. package/dist/types/httpClient.d.ts +8 -0
  173. package/dist/types/httpClient.d.ts.map +1 -0
  174. package/dist/types/httpClientNode.d.ts +8 -0
  175. package/dist/types/httpClientNode.d.ts.map +1 -0
  176. package/dist/types/index.d.ts +17 -0
  177. package/dist/types/index.d.ts.map +1 -0
  178. package/dist/types/interactions/balanceInteraction.d.ts +15 -0
  179. package/dist/types/interactions/balanceInteraction.d.ts.map +1 -0
  180. package/dist/types/interactions/customerInteraction.d.ts +41 -0
  181. package/dist/types/interactions/customerInteraction.d.ts.map +1 -0
  182. package/dist/types/interactions/initDialogInteraction.d.ts +16 -0
  183. package/dist/types/interactions/initDialogInteraction.d.ts.map +1 -0
  184. package/dist/types/interactions/statementInteraction.d.ts +17 -0
  185. package/dist/types/interactions/statementInteraction.d.ts.map +1 -0
  186. package/dist/types/interactions/tanMediaInteraction.d.ts +13 -0
  187. package/dist/types/interactions/tanMediaInteraction.d.ts.map +1 -0
  188. package/dist/types/message.d.ts +30 -0
  189. package/dist/types/message.d.ts.map +1 -0
  190. package/dist/types/mt940parser.d.ts +83 -0
  191. package/dist/types/mt940parser.d.ts.map +1 -0
  192. package/dist/types/parser.d.ts +2 -0
  193. package/dist/types/parser.d.ts.map +1 -0
  194. package/dist/types/partedSegment.d.ts +14 -0
  195. package/dist/types/partedSegment.d.ts.map +1 -0
  196. package/dist/types/segment.d.ts +11 -0
  197. package/dist/types/segment.d.ts.map +1 -0
  198. package/dist/types/segmentDefinition.d.ts +11 -0
  199. package/dist/types/segmentDefinition.d.ts.map +1 -0
  200. package/dist/types/segmentHeader.d.ts +11 -0
  201. package/dist/types/segmentHeader.d.ts.map +1 -0
  202. package/dist/types/segments/HIBPA.d.ts +27 -0
  203. package/dist/types/segments/HIBPA.d.ts.map +1 -0
  204. package/dist/types/segments/HIKAZ.d.ts +16 -0
  205. package/dist/types/segments/HIKAZ.d.ts.map +1 -0
  206. package/dist/types/segments/HIKAZS.d.ts +16 -0
  207. package/dist/types/segments/HIKAZS.d.ts.map +1 -0
  208. package/dist/types/segments/HIKIM.d.ts +17 -0
  209. package/dist/types/segments/HIKIM.d.ts.map +1 -0
  210. package/dist/types/segments/HIKOM.d.ts +27 -0
  211. package/dist/types/segments/HIKOM.d.ts.map +1 -0
  212. package/dist/types/segments/HIPINS.d.ts +23 -0
  213. package/dist/types/segments/HIPINS.d.ts.map +1 -0
  214. package/dist/types/segments/HIRMG.d.ts +22 -0
  215. package/dist/types/segments/HIRMG.d.ts.map +1 -0
  216. package/dist/types/segments/HIRMS.d.ts +17 -0
  217. package/dist/types/segments/HIRMS.d.ts.map +1 -0
  218. package/dist/types/segments/HISAL.d.ts +32 -0
  219. package/dist/types/segments/HISAL.d.ts.map +1 -0
  220. package/dist/types/segments/HISYN.d.ts +19 -0
  221. package/dist/types/segments/HISYN.d.ts.map +1 -0
  222. package/dist/types/segments/HITAB.d.ts +39 -0
  223. package/dist/types/segments/HITAB.d.ts.map +1 -0
  224. package/dist/types/segments/HITAN.d.ts +25 -0
  225. package/dist/types/segments/HITAN.d.ts.map +1 -0
  226. package/dist/types/segments/HITANS.d.ts +41 -0
  227. package/dist/types/segments/HITANS.d.ts.map +1 -0
  228. package/dist/types/segments/HIUPA.d.ts +21 -0
  229. package/dist/types/segments/HIUPA.d.ts.map +1 -0
  230. package/dist/types/segments/HIUPD.d.ts +42 -0
  231. package/dist/types/segments/HIUPD.d.ts.map +1 -0
  232. package/dist/types/segments/HKEND.d.ts +16 -0
  233. package/dist/types/segments/HKEND.d.ts.map +1 -0
  234. package/dist/types/segments/HKIDN.d.ts +22 -0
  235. package/dist/types/segments/HKIDN.d.ts.map +1 -0
  236. package/dist/types/segments/HKKAZ.d.ts +25 -0
  237. package/dist/types/segments/HKKAZ.d.ts.map +1 -0
  238. package/dist/types/segments/HKSAL.d.ts +22 -0
  239. package/dist/types/segments/HKSAL.d.ts.map +1 -0
  240. package/dist/types/segments/HKSYN.d.ts +17 -0
  241. package/dist/types/segments/HKSYN.d.ts.map +1 -0
  242. package/dist/types/segments/HKTAB.d.ts +19 -0
  243. package/dist/types/segments/HKTAB.d.ts.map +1 -0
  244. package/dist/types/segments/HKTAN.d.ts +39 -0
  245. package/dist/types/segments/HKTAN.d.ts.map +1 -0
  246. package/dist/types/segments/HKVVB.d.ts +22 -0
  247. package/dist/types/segments/HKVVB.d.ts.map +1 -0
  248. package/dist/types/segments/HNHBK.d.ts +23 -0
  249. package/dist/types/segments/HNHBK.d.ts.map +1 -0
  250. package/dist/types/segments/HNHBS.d.ts +16 -0
  251. package/dist/types/segments/HNHBS.d.ts.map +1 -0
  252. package/dist/types/segments/HNSHA.d.ts +24 -0
  253. package/dist/types/segments/HNSHA.d.ts.map +1 -0
  254. package/dist/types/segments/HNSHK.d.ts +66 -0
  255. package/dist/types/segments/HNSHK.d.ts.map +1 -0
  256. package/dist/types/segments/HNVSD.d.ts +20 -0
  257. package/dist/types/segments/HNVSD.d.ts.map +1 -0
  258. package/dist/types/segments/HNVSK.d.ts +40 -0
  259. package/dist/types/segments/HNVSK.d.ts.map +1 -0
  260. package/dist/types/segments/businessTransactionParameter.d.ts +18 -0
  261. package/dist/types/segments/businessTransactionParameter.d.ts.map +1 -0
  262. package/dist/types/segments/registry.d.ts +4 -0
  263. package/dist/types/segments/registry.d.ts.map +1 -0
  264. package/dist/types/tanMethod.d.ts +10 -0
  265. package/dist/types/tanMethod.d.ts.map +1 -0
  266. package/dist/types/tests/HIBPA.test.d.ts +2 -0
  267. package/dist/types/tests/HIBPA.test.d.ts.map +1 -0
  268. package/dist/types/tests/HIPINS.test.d.ts +2 -0
  269. package/dist/types/tests/HIPINS.test.d.ts.map +1 -0
  270. package/dist/types/tests/HIRMG.test.d.ts +2 -0
  271. package/dist/types/tests/HIRMG.test.d.ts.map +1 -0
  272. package/dist/types/tests/HITAB.test.d.ts +2 -0
  273. package/dist/types/tests/HITAB.test.d.ts.map +1 -0
  274. package/dist/types/tests/HITANS.test.d.ts +2 -0
  275. package/dist/types/tests/HITANS.test.d.ts.map +1 -0
  276. package/dist/types/tests/HIUPA.test.d.ts +2 -0
  277. package/dist/types/tests/HIUPA.test.d.ts.map +1 -0
  278. package/dist/types/tests/HIUPD.test.d.ts +2 -0
  279. package/dist/types/tests/HIUPD.test.d.ts.map +1 -0
  280. package/dist/types/tests/HKIDN.test.d.ts +2 -0
  281. package/dist/types/tests/HKIDN.test.d.ts.map +1 -0
  282. package/dist/types/tests/HKSAL.test.d.ts +2 -0
  283. package/dist/types/tests/HKSAL.test.d.ts.map +1 -0
  284. package/dist/types/tests/HKTAN.test.d.ts +2 -0
  285. package/dist/types/tests/HKTAN.test.d.ts.map +1 -0
  286. package/dist/types/tests/HNSHK.test.d.ts +2 -0
  287. package/dist/types/tests/HNSHK.test.d.ts.map +1 -0
  288. package/dist/types/tests/HNVSK.test.d.ts +2 -0
  289. package/dist/types/tests/HNVSK.test.d.ts.map +1 -0
  290. package/dist/types/tests/client.test.d.ts +2 -0
  291. package/dist/types/tests/client.test.d.ts.map +1 -0
  292. package/dist/types/tests/datatypes.test.d.ts +2 -0
  293. package/dist/types/tests/datatypes.test.d.ts.map +1 -0
  294. package/dist/types/tests/message.test.d.ts +2 -0
  295. package/dist/types/tests/message.test.d.ts.map +1 -0
  296. package/dist/types/tests/mt940parser.test.d.ts +2 -0
  297. package/dist/types/tests/mt940parser.test.d.ts.map +1 -0
  298. package/dist/types/tests/parser.test.d.ts +2 -0
  299. package/dist/types/tests/parser.test.d.ts.map +1 -0
  300. package/dist/types/unknownSegment.d.ts +14 -0
  301. package/dist/types/unknownSegment.d.ts.map +1 -0
  302. package/dist/types/upd.d.ts +8 -0
  303. package/dist/types/upd.d.ts.map +1 -0
  304. package/dist/unknownSegment.js +8 -0
  305. package/dist/upd.js +1 -0
  306. package/package.json +45 -0
@@ -0,0 +1,155 @@
1
+ import { CustomerInteraction } from './customerInteraction.js';
2
+ import { HKIDN } from '../segments/HKIDN.js';
3
+ import { HKVVB } from '../segments/HKVVB.js';
4
+ import { Language, SyncMode } from '../codes.js';
5
+ import { HKSYN } from '../segments/HKSYN.js';
6
+ import { HISYN } from '../segments/HISYN.js';
7
+ import { HIBPA } from '../segments/HIBPA.js';
8
+ import { HITANS } from '../segments/HITANS.js';
9
+ import { HIKOM } from '../segments/HIKOM.js';
10
+ import { HIPINS } from '../segments/HIPINS.js';
11
+ import { HIUPA } from '../segments/HIUPA.js';
12
+ import { finTsAccountTypeToEnum } from '../bankAccount.js';
13
+ import { HIKIM } from '../segments/HIKIM.js';
14
+ import { HIUPD } from '../segments/HIUPD.js';
15
+ export class InitDialogInteraction extends CustomerInteraction {
16
+ init;
17
+ syncSystemId;
18
+ constructor(init, syncSystemId = false) {
19
+ super(HKIDN.Id);
20
+ this.init = init;
21
+ this.syncSystemId = syncSystemId;
22
+ }
23
+ createSegments(init) {
24
+ const segments = [];
25
+ const hkidn = {
26
+ header: { segId: HKIDN.Id, segNr: 0, version: HKIDN.Version },
27
+ bank: { country: init.countryCode, bankId: init.bankId },
28
+ customerId: init.customerId ?? init.userId ?? '9999999999',
29
+ systemId: init.bankingInformation.systemId,
30
+ systemIdRequired: this.init.userId ? 1 : 0,
31
+ };
32
+ segments.push(hkidn);
33
+ const hkvvb = {
34
+ header: { segId: HKVVB.Id, segNr: 0, version: HKVVB.Version },
35
+ bpdVersion: init.bankingInformation.bpd?.version ?? 0,
36
+ updVersion: init.bankingInformation.upd?.version ?? 0,
37
+ dialogLanguage: Language.Default,
38
+ productId: init.productId,
39
+ productVersion: init.productVersion,
40
+ };
41
+ segments.push(hkvvb);
42
+ if (this.syncSystemId && this.init.userId && init.bankingInformation.systemId === '0') {
43
+ const hksyn = {
44
+ header: { segId: HKSYN.Id, segNr: 0, version: HKSYN.Version },
45
+ mode: SyncMode.NewSystemId,
46
+ };
47
+ segments.push(hksyn);
48
+ }
49
+ return segments;
50
+ }
51
+ handleResponse(response, clientResponse) {
52
+ const currentBankingInformationSnapshot = JSON.stringify(this.init.bankingInformation);
53
+ const hisyn = response.findSegment(HISYN.Id);
54
+ if (hisyn && hisyn.systemId) {
55
+ this.init.bankingInformation.systemId = hisyn.systemId;
56
+ }
57
+ const bankAnswers = clientResponse.bankAnswers;
58
+ const hibpa = response.findSegment(HIBPA.Id);
59
+ if (hibpa) {
60
+ const hitansSegments = response.findAllSegments(HITANS.Id);
61
+ const supportedTanMethods = [];
62
+ hitansSegments.forEach((hitans) => {
63
+ supportedTanMethods.push(...(hitans?.params.tanMethods.map((t) => ({
64
+ id: t.secFunc,
65
+ name: t.methodName,
66
+ version: hitans.header.version,
67
+ activeTanMediaCount: t.activeTanMedia,
68
+ activeTanMedia: [],
69
+ tanMediaRequirement: t.tanMediaRequired,
70
+ })) ?? []));
71
+ });
72
+ let bankingUrl = this.init.bankingUrl;
73
+ const hikom = response.findSegment(HIKOM.Id);
74
+ if (hikom) {
75
+ bankingUrl = hikom?.comParams.address;
76
+ if (!bankingUrl.toLowerCase().startsWith('https://')) {
77
+ bankingUrl = 'https://' + bankingUrl;
78
+ }
79
+ }
80
+ const hipins = response.findSegment(HIPINS.Id);
81
+ if (!hipins) {
82
+ throw new Error('Bank does not support PIN/TAN transactions (HIPINS segment not found in BPA)');
83
+ }
84
+ const bankTransactions = hipins.params.transactions.map((t) => {
85
+ return { transId: t.transId, tanRequired: t.tanRequired, versions: [] };
86
+ });
87
+ bankTransactions.forEach((transaction) => {
88
+ if (transaction.transId.startsWith('HK') || transaction.transId.startsWith('DK')) {
89
+ const paramSegId = 'HI' + transaction.transId.slice(2) + 'S';
90
+ const paramSegments = [
91
+ ...response.findAllSegments(paramSegId),
92
+ ...response.findAllUnknownSegments(paramSegId),
93
+ ];
94
+ paramSegments.forEach((paramSegment) => {
95
+ if (paramSegment) {
96
+ transaction.versions.push(paramSegment.header.version);
97
+ }
98
+ });
99
+ }
100
+ });
101
+ const bpd = {
102
+ version: hibpa?.bpdVersion,
103
+ countryCode: hibpa?.bank.country,
104
+ bankId: hibpa?.bank.bankId,
105
+ bankName: hibpa?.bankName,
106
+ maxTransactionsPerMessage: hibpa?.maxNumTransactions,
107
+ supportedLanguages: hibpa?.supportedLanguages,
108
+ supportedHbciVersions: hibpa?.supportedHbciVersions,
109
+ url: bankingUrl,
110
+ supportedTanMethods: supportedTanMethods,
111
+ availableTanMethodIds: [],
112
+ allowedTransactions: bankTransactions,
113
+ };
114
+ this.init.bankingInformation.bpd = bpd;
115
+ }
116
+ const tanMethodMessaqe = bankAnswers.find((answer) => answer.code === 3920);
117
+ let availableTanMethodIds = [];
118
+ if (tanMethodMessaqe && this.init.bankingInformation.bpd) {
119
+ this.init.bankingInformation.bpd.availableTanMethodIds =
120
+ tanMethodMessaqe.params?.map((p) => Number.parseInt(p)) ?? [];
121
+ }
122
+ const hiupa = response.findSegment(HIUPA.Id);
123
+ if (hiupa) {
124
+ const hiupds = response.findAllSegments(HIUPD.Id);
125
+ const accounts = hiupds.map((upd) => {
126
+ return {
127
+ accountNumber: upd.account.accountNumber,
128
+ subAccountId: upd.account.subAccountId,
129
+ bank: upd.account.bank,
130
+ iban: upd.iban,
131
+ customerId: upd.customerId,
132
+ accountType: finTsAccountTypeToEnum(upd.accountType),
133
+ currency: upd.currency,
134
+ holder1: upd.accountHolder1,
135
+ holder2: upd.accountHolder2,
136
+ product: upd.accountProduct,
137
+ limit: upd.accountLimit,
138
+ allowedTransactions: upd.allowedTransactions?.filter((t) => !!t),
139
+ };
140
+ });
141
+ const upd = {
142
+ version: hiupa.updVersion,
143
+ usage: hiupa.updUsage,
144
+ bankAccounts: accounts,
145
+ };
146
+ this.init.bankingInformation.upd = upd;
147
+ }
148
+ const hikimSegments = response.findAllSegments(HIKIM.Id);
149
+ const bankMessages = hikimSegments.map((s) => ({ subject: s.subject, text: s.text }));
150
+ this.init.bankingInformation.bankMessages = bankMessages;
151
+ clientResponse.bankingInformation = this.init.bankingInformation;
152
+ clientResponse.bankingInformationUpdated =
153
+ currentBankingInformationSnapshot !== JSON.stringify(this.init.bankingInformation);
154
+ }
155
+ }
@@ -0,0 +1,44 @@
1
+ import { CustomerOrderInteraction } from './customerInteraction.js';
2
+ import { HKKAZ } from '../segments/HKKAZ.js';
3
+ import { HIKAZ } from '../segments/HIKAZ.js';
4
+ import { Mt940Parser } from '../mt940parser.js';
5
+ export class StatementInteraction extends CustomerOrderInteraction {
6
+ accountNumber;
7
+ from;
8
+ to;
9
+ constructor(accountNumber, from, to) {
10
+ super(HKKAZ.Id, HIKAZ.Id);
11
+ this.accountNumber = accountNumber;
12
+ this.from = from;
13
+ this.to = to;
14
+ }
15
+ createSegments(init) {
16
+ const bankAccount = init.getBankAccount(this.accountNumber);
17
+ if (!init.isAccountTransactionSupported(this.accountNumber, this.segId)) {
18
+ throw Error(`Account ${this.accountNumber} does not support business transaction '${this.segId}'`);
19
+ }
20
+ const account = { ...bankAccount, iban: undefined };
21
+ const version = init.getMaxSupportedTransactionVersion(HKKAZ.Id);
22
+ if (!version) {
23
+ throw Error(`There is no supported version for business transaction '${HKKAZ.Id}`);
24
+ }
25
+ const hkkaz = {
26
+ header: { segId: HKKAZ.Id, segNr: 0, version: version },
27
+ account,
28
+ allAccounts: false,
29
+ from: this.from,
30
+ to: this.to,
31
+ };
32
+ return [hkkaz];
33
+ }
34
+ handleResponse(response, clientResponse) {
35
+ const hikaz = response.findSegment(HIKAZ.Id);
36
+ if (hikaz) {
37
+ const parser = new Mt940Parser(hikaz.bookedTransactions);
38
+ clientResponse.statements = parser.parse();
39
+ }
40
+ else {
41
+ clientResponse.statements = [];
42
+ }
43
+ }
44
+ }
@@ -0,0 +1,27 @@
1
+ import { CustomerOrderInteraction } from './customerInteraction.js';
2
+ import { HKTAB } from '../segments/HKTAB.js';
3
+ import { HITAB } from '../segments/HITAB.js';
4
+ import { TanMediaClass, TanMediaType } from '../codes.js';
5
+ export class TanMediaInteraction extends CustomerOrderInteraction {
6
+ constructor() {
7
+ super(HKTAB.Id, HITAB.Id);
8
+ }
9
+ createSegments(init) {
10
+ const version = init.getMaxSupportedTransactionVersion(HKTAB.Id);
11
+ if (!version) {
12
+ throw Error(`There is no supported version for business transaction '${HKTAB.Id}`);
13
+ }
14
+ const hktab = {
15
+ header: { segId: HKTAB.Id, segNr: 0, version: version },
16
+ mediaType: TanMediaType.Active,
17
+ mediaClass: TanMediaClass.All,
18
+ };
19
+ return [hktab];
20
+ }
21
+ handleResponse(response, clientResponse) {
22
+ const hitab = response.findSegment(HITAB.Id);
23
+ if (hitab) {
24
+ clientResponse.tanMediaList = hitab.mediaList.map((media) => media.name).filter((name) => name);
25
+ }
26
+ }
27
+ }
@@ -0,0 +1,198 @@
1
+ import { HashAlgorithm } from './codes.js';
2
+ import { splitBySeparator } from './parser.js';
3
+ import { HNHBS } from './segments/HNHBS.js';
4
+ import { HNHBK } from './segments/HNHBK.js';
5
+ import { HNVSK } from './segments/HNVSK.js';
6
+ import { HNSHK } from './segments/HNSHK.js';
7
+ import { HNVSD } from './segments/HNVSD.js';
8
+ import { HNSHA } from './segments/HNSHA.js';
9
+ import { HIRMS } from './segments/HIRMS.js';
10
+ import { HIRMG } from './segments/HIRMG.js';
11
+ import { UnkownId } from './unknownSegment.js';
12
+ import { decode, encode, segmentToString } from './segment.js';
13
+ import { SegmentDefinition } from './segmentDefinition.js';
14
+ import { PARTED } from './partedSegment.js';
15
+ import { getSegmentDefinition } from './segments/registry.js';
16
+ export class Message {
17
+ segments;
18
+ constructor(segments) {
19
+ this.segments = segments;
20
+ }
21
+ findSegment(segmentId) {
22
+ const segments = this.findAllSegments(segmentId);
23
+ return segments.length > 0 ? segments[0] : undefined;
24
+ }
25
+ findAllSegments(segmentId) {
26
+ return this.segments.filter((segment) => segment.header.segId === segmentId);
27
+ }
28
+ findAllUnknownSegments(segmentId) {
29
+ const unknownSegments = this.segments.filter((segment) => segment.header.segId === UnkownId);
30
+ return unknownSegments.filter((segment) => segment.originalId === segmentId);
31
+ }
32
+ hasReturnCode(code) {
33
+ const hirmg = this.findSegment(HIRMG.Id);
34
+ const hirmsList = this.findAllSegments(HIRMS.Id);
35
+ return ((hirmg && hirmg.answers.some((answer) => answer.code === code)) ||
36
+ hirmsList.some((hirms) => hirms.answers.some((answer) => answer.code === code)));
37
+ }
38
+ getHighestReturnCode() {
39
+ const hirmg = this.findSegment(HIRMG.Id);
40
+ const hirmsList = this.findAllSegments(HIRMS.Id);
41
+ const allAnswers = hirmg ? [...hirmg.answers] : [];
42
+ hirmsList.forEach((hirms) => allAnswers.push(...hirms.answers));
43
+ return allAnswers.reduce((max, answer) => (answer.code > max ? answer.code : max), 0);
44
+ }
45
+ getBankAnswers() {
46
+ let bankAnswers = [];
47
+ const hirmgSegments = this.findAllSegments(HIRMG.Id);
48
+ hirmgSegments.forEach((hirmg) => bankAnswers.push(...hirmg.answers.map((message) => ({ code: message.code, text: message.text, params: message.params }))));
49
+ const hirmsSegments = this.findAllSegments(HIRMS.Id);
50
+ hirmsSegments.forEach((hirms) => bankAnswers.push(...hirms.answers.map((message) => ({ code: message.code, text: message.text, params: message.params }))));
51
+ return bankAnswers;
52
+ }
53
+ static decode(text, partedResponseSegId) {
54
+ const segmentTexts = splitBySeparator(text, "'").filter((text) => !!text);
55
+ let segments = segmentTexts.map((text) => Message.decodeSegment(text, partedResponseSegId));
56
+ const hnvskIndex = segments.findIndex((segment) => segment.header.segId === HNVSK.Id);
57
+ const hnvsdIndex = segments.findIndex((segment) => segment.header.segId === HNVSD.Id);
58
+ const isEncrypted = hnvskIndex !== -1 && hnvsdIndex !== -1 && hnvsdIndex - hnvskIndex === 1;
59
+ if (isEncrypted) {
60
+ const hnvsd = segments[hnvsdIndex];
61
+ const hnvsdSegmentTexts = splitBySeparator(hnvsd.encryptedData, "'").filter((text) => !!text);
62
+ const hnvsdSegments = hnvsdSegmentTexts.map((text) => Message.decodeSegment(text, partedResponseSegId));
63
+ segments.splice(hnvskIndex, 2, ...hnvsdSegments);
64
+ }
65
+ const message = new Message(segments);
66
+ return message;
67
+ }
68
+ static decodeSegment(text, partedResponseSegId) {
69
+ if (partedResponseSegId && text.startsWith(partedResponseSegId)) {
70
+ const partedSegment = {
71
+ header: { ...SegmentDefinition.header.decode(text, 1), segId: PARTED.Id },
72
+ originalId: partedResponseSegId,
73
+ rawData: text,
74
+ };
75
+ return partedSegment;
76
+ }
77
+ return decode(text);
78
+ }
79
+ toString(includeUnknown = false) {
80
+ let text = `Message with ${this.segments.length} segments:\n`;
81
+ text += this.segments
82
+ .filter((segment) => includeUnknown || segment.header.segId !== UnkownId)
83
+ .map((segment) => segmentToString(segment))
84
+ .join('\n');
85
+ return text;
86
+ }
87
+ }
88
+ export class CustomerMessage extends Message {
89
+ lastSignatureNumber = 0;
90
+ constructor(dialogId = '0', msgNr = 1) {
91
+ const hnhbk = {
92
+ header: { segId: HNHBK.Id, segNr: 0, version: HNHBK.Version },
93
+ messageLength: 0,
94
+ hbciVersion: 300,
95
+ dialogId: dialogId,
96
+ msgNr: msgNr,
97
+ };
98
+ const hnhbs = {
99
+ header: { segId: HNHBS.Id, segNr: 0, version: HNHBS.Version },
100
+ msgNr: msgNr,
101
+ };
102
+ super([hnhbk, hnhbs]);
103
+ }
104
+ encode() {
105
+ if (this.segments.length < 3) {
106
+ throw new Error('a message must contain at least three segments');
107
+ }
108
+ if (this.segments[0].header.segId !== HNHBK.Id) {
109
+ throw new Error('the first segment in a message must always be of type HNHBK');
110
+ }
111
+ if (this.segments[this.segments.length - 1].header.segId !== HNHBS.Id) {
112
+ throw new Error('the last segment in a message must always be of type HNHBS');
113
+ }
114
+ let segmentNumber = 1;
115
+ this.segments.forEach((segment) => {
116
+ segment.header.segNr = segmentNumber++;
117
+ });
118
+ let segments = this.segments;
119
+ if (this.lastSignatureNumber > 0) {
120
+ const firstSignature = this.findSegment(HNSHK.Id);
121
+ const now = new Date();
122
+ const hnvsk = {
123
+ header: { segId: HNVSK.Id, segNr: 998, version: HNVSK.Version },
124
+ secProfile: { secMethod: 'PIN', secVersion: 1 },
125
+ secFunc: 998,
126
+ secRole: 1,
127
+ secId: { partyType: 1, partyId: firstSignature.secId.partyId },
128
+ dateTime: { type: 1, date: now, time: now },
129
+ encryption: { use: 2, mode: 2, algorithm: 13, keyParamValue: '00000000', keyParamName: 5, initParamName: 1 },
130
+ key: {
131
+ bank: firstSignature.key.bank,
132
+ userId: firstSignature.key.userId,
133
+ keyType: 'S',
134
+ keyNr: 0,
135
+ keyVersion: 0,
136
+ },
137
+ compressMethod: 0,
138
+ };
139
+ const innerSegments = segments.slice(1, -1);
140
+ const hnvsd = {
141
+ header: { segId: HNVSD.Id, segNr: 999, version: HNVSD.Version },
142
+ encryptedData: innerSegments.map((segment) => encode(segment)).join(''),
143
+ };
144
+ segments = [this.segments[0], hnvsk, hnvsd, this.segments[this.segments.length - 1]];
145
+ }
146
+ const encodedMessage = segments.map((segment) => encode(segment)).join('');
147
+ const messageHeader = segments[0];
148
+ messageHeader.messageLength = encodedMessage.length;
149
+ const encodedHeader = encode(messageHeader);
150
+ return encodedHeader + encodedMessage.substring(encodedHeader.length);
151
+ }
152
+ sign(countryCode, bankId, userId, pin, systemId, tanMethodId, tan) {
153
+ const now = new Date();
154
+ this.lastSignatureNumber++;
155
+ const hnshk = {
156
+ header: { segId: HNSHK.Id, segNr: 0, version: HNSHK.Version },
157
+ secProfile: { secMethod: 'PIN', secVersion: tanMethodId ? 2 : 1 },
158
+ secFunc: tanMethodId ?? 999,
159
+ secControlRef: this.lastSignatureNumber.toString(),
160
+ secArea: 1,
161
+ secRole: 1,
162
+ secId: { partyType: 1, partyId: systemId ?? '0' },
163
+ secRefNum: 1,
164
+ dateTime: { type: 1, date: now, time: now },
165
+ hash: { use: 1, algorithm: HashAlgorithm.SHA256, paramName: 1 },
166
+ signature: { use: 6, algorithm: 10, mode: 16 },
167
+ key: { bank: { country: countryCode, bankId: bankId }, userId: userId, keyType: 'S', keyNr: 0, keyVersion: 0 },
168
+ };
169
+ this.segments.splice(1, 0, hnshk);
170
+ const pinTan = { pin: pin, tan: tan };
171
+ const hnsha = {
172
+ header: { segId: HNSHA.Id, segNr: 0, version: HNSHA.Version },
173
+ secControlRef: this.lastSignatureNumber.toString(),
174
+ customSignature: pinTan,
175
+ };
176
+ this.segments.splice(this.segments.length - 1, 0, hnsha);
177
+ }
178
+ addSegment(segment) {
179
+ let firstSignatureEndIndex = this.segments.findIndex((segment) => segment.header.segId === HNSHA.Id);
180
+ if (firstSignatureEndIndex === -1) {
181
+ firstSignatureEndIndex = this.segments.length - 1;
182
+ }
183
+ this.segments.splice(firstSignatureEndIndex, 0, segment);
184
+ }
185
+ }
186
+ export class CustomerOrderMessage extends CustomerMessage {
187
+ orderSegId;
188
+ orderResponseSegId;
189
+ constructor(orderSegId, orderResponseSegId, dialogId = '0', msgNr = 1) {
190
+ super(dialogId, msgNr);
191
+ this.orderSegId = orderSegId;
192
+ this.orderResponseSegId = orderResponseSegId;
193
+ }
194
+ get supportsPartedResponseSegments() {
195
+ const definition = getSegmentDefinition(this.orderSegId);
196
+ return definition?.elements.some((element) => element.name === 'continuationMark') ?? false;
197
+ }
198
+ }