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.
- package/LICENSE +504 -0
- package/README.md +216 -0
- package/dist/accountBalance.js +1 -0
- package/dist/bankAccount.js +34 -0
- package/dist/bankAnswer.js +1 -0
- package/dist/bankTransaction.js +1 -0
- package/dist/bankingInformation.js +1 -0
- package/dist/bpd.js +1 -0
- package/dist/client.js +165 -0
- package/dist/codes.js +79 -0
- package/dist/config.js +181 -0
- package/dist/dataElements/AlphaNumeric.js +24 -0
- package/dist/dataElements/Amount.js +6 -0
- package/dist/dataElements/Binary.js +20 -0
- package/dist/dataElements/Country.js +6 -0
- package/dist/dataElements/Currency.js +6 -0
- package/dist/dataElements/Dat.js +18 -0
- package/dist/dataElements/DataElement.js +37 -0
- package/dist/dataElements/Digits.js +23 -0
- package/dist/dataElements/Float.js +21 -0
- package/dist/dataElements/Identification.js +6 -0
- package/dist/dataElements/Numeric.js +26 -0
- package/dist/dataElements/Text.js +21 -0
- package/dist/dataElements/Time.js +18 -0
- package/dist/dataElements/YesNo.js +18 -0
- package/dist/dataGroups/Account.js +12 -0
- package/dist/dataGroups/Balance.js +15 -0
- package/dist/dataGroups/BankIdentification.js +8 -0
- package/dist/dataGroups/DataGroup.js +54 -0
- package/dist/dataGroups/InternationalAccount.js +15 -0
- package/dist/dataGroups/Money.js +8 -0
- package/dist/dataGroups/RefMessage.js +8 -0
- package/dist/dataGroups/TimeStamp.js +8 -0
- package/dist/decoder.js +97 -0
- package/dist/dialog.js +189 -0
- package/dist/encoder.js +47 -0
- package/dist/format.js +6 -0
- package/dist/httpClient.js +41 -0
- package/dist/httpClientNode.js +59 -0
- package/dist/index.js +15 -0
- package/dist/interactions/balanceInteraction.js +47 -0
- package/dist/interactions/customerInteraction.js +55 -0
- package/dist/interactions/initDialogInteraction.js +155 -0
- package/dist/interactions/statementInteraction.js +44 -0
- package/dist/interactions/tanMediaInteraction.js +27 -0
- package/dist/message.js +198 -0
- package/dist/mt940parser.js +307 -0
- package/dist/parser.js +30 -0
- package/dist/partedSegment.js +8 -0
- package/dist/segment.js +59 -0
- package/dist/segmentDefinition.js +11 -0
- package/dist/segmentHeader.js +13 -0
- package/dist/segments/HIBPA.js +23 -0
- package/dist/segments/HIKAZ.js +13 -0
- package/dist/segments/HIKAZS.js +13 -0
- package/dist/segments/HIKIM.js +11 -0
- package/dist/segments/HIKOM.js +23 -0
- package/dist/segments/HIPINS.js +22 -0
- package/dist/segments/HIRMG.js +20 -0
- package/dist/segments/HIRMS.js +20 -0
- package/dist/segments/HISAL.js +31 -0
- package/dist/segments/HISYN.js +16 -0
- package/dist/segments/HITAB.js +37 -0
- package/dist/segments/HITAN.js +23 -0
- package/dist/segments/HITANS.js +48 -0
- package/dist/segments/HIUPA.js +18 -0
- package/dist/segments/HIUPD.js +34 -0
- package/dist/segments/HKEND.js +11 -0
- package/dist/segments/HKIDN.js +18 -0
- package/dist/segments/HKKAZ.js +24 -0
- package/dist/segments/HKSAL.js +21 -0
- package/dist/segments/HKSYN.js +11 -0
- package/dist/segments/HKTAB.js +12 -0
- package/dist/segments/HKTAN.js +35 -0
- package/dist/segments/HKVVB.js +18 -0
- package/dist/segments/HNHBK.js +20 -0
- package/dist/segments/HNHBS.js +11 -0
- package/dist/segments/HNSHA.js +17 -0
- package/dist/segments/HNSHK.js +43 -0
- package/dist/segments/HNVSD.js +11 -0
- package/dist/segments/HNVSK.js +45 -0
- package/dist/segments/businessTransactionParameter.js +20 -0
- package/dist/segments/registry.js +71 -0
- package/dist/tanMethod.js +1 -0
- package/dist/tests/HIBPA.test.js +26 -0
- package/dist/tests/HIPINS.test.js +14 -0
- package/dist/tests/HIRMG.test.js +24 -0
- package/dist/tests/HITAB.test.js +19 -0
- package/dist/tests/HITANS.test.js +19 -0
- package/dist/tests/HIUPA.test.js +11 -0
- package/dist/tests/HIUPD.test.js +11 -0
- package/dist/tests/HKIDN.test.js +22 -0
- package/dist/tests/HKSAL.test.js +45 -0
- package/dist/tests/HKTAN.test.js +21 -0
- package/dist/tests/HNSHK.test.js +11 -0
- package/dist/tests/HNVSK.test.js +11 -0
- package/dist/tests/client.test.js +33 -0
- package/dist/tests/datatypes.test.js +8 -0
- package/dist/tests/message.test.js +80 -0
- package/dist/tests/mt940parser.test.js +56 -0
- package/dist/tests/parser.test.js +20 -0
- package/dist/types/accountBalance.d.ts +9 -0
- package/dist/types/accountBalance.d.ts.map +1 -0
- package/dist/types/bankAccount.d.ts +27 -0
- package/dist/types/bankAccount.d.ts.map +1 -0
- package/dist/types/bankAnswer.d.ts +6 -0
- package/dist/types/bankAnswer.d.ts.map +1 -0
- package/dist/types/bankTransaction.d.ts +6 -0
- package/dist/types/bankTransaction.d.ts.map +1 -0
- package/dist/types/bankingInformation.d.ts +20 -0
- package/dist/types/bankingInformation.d.ts.map +1 -0
- package/dist/types/bpd.d.ts +17 -0
- package/dist/types/bpd.d.ts.map +1 -0
- package/dist/types/client.d.ts +86 -0
- package/dist/types/client.d.ts.map +1 -0
- package/dist/types/codes.d.ts +68 -0
- package/dist/types/codes.d.ts.map +1 -0
- package/dist/types/config.d.ts +99 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/dataElements/AlphaNumeric.d.ts +8 -0
- package/dist/types/dataElements/AlphaNumeric.d.ts.map +1 -0
- package/dist/types/dataElements/Amount.d.ts +5 -0
- package/dist/types/dataElements/Amount.d.ts.map +1 -0
- package/dist/types/dataElements/Binary.d.ts +8 -0
- package/dist/types/dataElements/Binary.d.ts.map +1 -0
- package/dist/types/dataElements/Country.d.ts +5 -0
- package/dist/types/dataElements/Country.d.ts.map +1 -0
- package/dist/types/dataElements/Currency.d.ts +5 -0
- package/dist/types/dataElements/Currency.d.ts.map +1 -0
- package/dist/types/dataElements/Dat.d.ts +8 -0
- package/dist/types/dataElements/Dat.d.ts.map +1 -0
- package/dist/types/dataElements/DataElement.d.ts +14 -0
- package/dist/types/dataElements/DataElement.d.ts.map +1 -0
- package/dist/types/dataElements/Digits.d.ts +8 -0
- package/dist/types/dataElements/Digits.d.ts.map +1 -0
- package/dist/types/dataElements/Float.d.ts +8 -0
- package/dist/types/dataElements/Float.d.ts.map +1 -0
- package/dist/types/dataElements/Identification.d.ts +5 -0
- package/dist/types/dataElements/Identification.d.ts.map +1 -0
- package/dist/types/dataElements/Numeric.d.ts +9 -0
- package/dist/types/dataElements/Numeric.d.ts.map +1 -0
- package/dist/types/dataElements/Text.d.ts +8 -0
- package/dist/types/dataElements/Text.d.ts.map +1 -0
- package/dist/types/dataElements/Time.d.ts +8 -0
- package/dist/types/dataElements/Time.d.ts.map +1 -0
- package/dist/types/dataElements/YesNo.d.ts +7 -0
- package/dist/types/dataElements/YesNo.d.ts.map +1 -0
- package/dist/types/dataGroups/Account.d.ts +14 -0
- package/dist/types/dataGroups/Account.d.ts.map +1 -0
- package/dist/types/dataGroups/Balance.d.ts +12 -0
- package/dist/types/dataGroups/Balance.d.ts.map +1 -0
- package/dist/types/dataGroups/BankIdentification.d.ts +5 -0
- package/dist/types/dataGroups/BankIdentification.d.ts.map +1 -0
- package/dist/types/dataGroups/DataGroup.d.ts +10 -0
- package/dist/types/dataGroups/DataGroup.d.ts.map +1 -0
- package/dist/types/dataGroups/InternationalAccount.d.ts +13 -0
- package/dist/types/dataGroups/InternationalAccount.d.ts.map +1 -0
- package/dist/types/dataGroups/Money.d.ts +9 -0
- package/dist/types/dataGroups/Money.d.ts.map +1 -0
- package/dist/types/dataGroups/RefMessage.d.ts +9 -0
- package/dist/types/dataGroups/RefMessage.d.ts.map +1 -0
- package/dist/types/dataGroups/TimeStamp.d.ts +9 -0
- package/dist/types/dataGroups/TimeStamp.d.ts.map +1 -0
- package/dist/types/decoder.d.ts +4 -0
- package/dist/types/decoder.d.ts.map +1 -0
- package/dist/types/dialog.d.ts +21 -0
- package/dist/types/dialog.d.ts.map +1 -0
- package/dist/types/encoder.d.ts +3 -0
- package/dist/types/encoder.d.ts.map +1 -0
- package/dist/types/format.d.ts +3 -0
- package/dist/types/format.d.ts.map +1 -0
- package/dist/types/httpClient.d.ts +8 -0
- package/dist/types/httpClient.d.ts.map +1 -0
- package/dist/types/httpClientNode.d.ts +8 -0
- package/dist/types/httpClientNode.d.ts.map +1 -0
- package/dist/types/index.d.ts +17 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/interactions/balanceInteraction.d.ts +15 -0
- package/dist/types/interactions/balanceInteraction.d.ts.map +1 -0
- package/dist/types/interactions/customerInteraction.d.ts +41 -0
- package/dist/types/interactions/customerInteraction.d.ts.map +1 -0
- package/dist/types/interactions/initDialogInteraction.d.ts +16 -0
- package/dist/types/interactions/initDialogInteraction.d.ts.map +1 -0
- package/dist/types/interactions/statementInteraction.d.ts +17 -0
- package/dist/types/interactions/statementInteraction.d.ts.map +1 -0
- package/dist/types/interactions/tanMediaInteraction.d.ts +13 -0
- package/dist/types/interactions/tanMediaInteraction.d.ts.map +1 -0
- package/dist/types/message.d.ts +30 -0
- package/dist/types/message.d.ts.map +1 -0
- package/dist/types/mt940parser.d.ts +83 -0
- package/dist/types/mt940parser.d.ts.map +1 -0
- package/dist/types/parser.d.ts +2 -0
- package/dist/types/parser.d.ts.map +1 -0
- package/dist/types/partedSegment.d.ts +14 -0
- package/dist/types/partedSegment.d.ts.map +1 -0
- package/dist/types/segment.d.ts +11 -0
- package/dist/types/segment.d.ts.map +1 -0
- package/dist/types/segmentDefinition.d.ts +11 -0
- package/dist/types/segmentDefinition.d.ts.map +1 -0
- package/dist/types/segmentHeader.d.ts +11 -0
- package/dist/types/segmentHeader.d.ts.map +1 -0
- package/dist/types/segments/HIBPA.d.ts +27 -0
- package/dist/types/segments/HIBPA.d.ts.map +1 -0
- package/dist/types/segments/HIKAZ.d.ts +16 -0
- package/dist/types/segments/HIKAZ.d.ts.map +1 -0
- package/dist/types/segments/HIKAZS.d.ts +16 -0
- package/dist/types/segments/HIKAZS.d.ts.map +1 -0
- package/dist/types/segments/HIKIM.d.ts +17 -0
- package/dist/types/segments/HIKIM.d.ts.map +1 -0
- package/dist/types/segments/HIKOM.d.ts +27 -0
- package/dist/types/segments/HIKOM.d.ts.map +1 -0
- package/dist/types/segments/HIPINS.d.ts +23 -0
- package/dist/types/segments/HIPINS.d.ts.map +1 -0
- package/dist/types/segments/HIRMG.d.ts +22 -0
- package/dist/types/segments/HIRMG.d.ts.map +1 -0
- package/dist/types/segments/HIRMS.d.ts +17 -0
- package/dist/types/segments/HIRMS.d.ts.map +1 -0
- package/dist/types/segments/HISAL.d.ts +32 -0
- package/dist/types/segments/HISAL.d.ts.map +1 -0
- package/dist/types/segments/HISYN.d.ts +19 -0
- package/dist/types/segments/HISYN.d.ts.map +1 -0
- package/dist/types/segments/HITAB.d.ts +39 -0
- package/dist/types/segments/HITAB.d.ts.map +1 -0
- package/dist/types/segments/HITAN.d.ts +25 -0
- package/dist/types/segments/HITAN.d.ts.map +1 -0
- package/dist/types/segments/HITANS.d.ts +41 -0
- package/dist/types/segments/HITANS.d.ts.map +1 -0
- package/dist/types/segments/HIUPA.d.ts +21 -0
- package/dist/types/segments/HIUPA.d.ts.map +1 -0
- package/dist/types/segments/HIUPD.d.ts +42 -0
- package/dist/types/segments/HIUPD.d.ts.map +1 -0
- package/dist/types/segments/HKEND.d.ts +16 -0
- package/dist/types/segments/HKEND.d.ts.map +1 -0
- package/dist/types/segments/HKIDN.d.ts +22 -0
- package/dist/types/segments/HKIDN.d.ts.map +1 -0
- package/dist/types/segments/HKKAZ.d.ts +25 -0
- package/dist/types/segments/HKKAZ.d.ts.map +1 -0
- package/dist/types/segments/HKSAL.d.ts +22 -0
- package/dist/types/segments/HKSAL.d.ts.map +1 -0
- package/dist/types/segments/HKSYN.d.ts +17 -0
- package/dist/types/segments/HKSYN.d.ts.map +1 -0
- package/dist/types/segments/HKTAB.d.ts +19 -0
- package/dist/types/segments/HKTAB.d.ts.map +1 -0
- package/dist/types/segments/HKTAN.d.ts +39 -0
- package/dist/types/segments/HKTAN.d.ts.map +1 -0
- package/dist/types/segments/HKVVB.d.ts +22 -0
- package/dist/types/segments/HKVVB.d.ts.map +1 -0
- package/dist/types/segments/HNHBK.d.ts +23 -0
- package/dist/types/segments/HNHBK.d.ts.map +1 -0
- package/dist/types/segments/HNHBS.d.ts +16 -0
- package/dist/types/segments/HNHBS.d.ts.map +1 -0
- package/dist/types/segments/HNSHA.d.ts +24 -0
- package/dist/types/segments/HNSHA.d.ts.map +1 -0
- package/dist/types/segments/HNSHK.d.ts +66 -0
- package/dist/types/segments/HNSHK.d.ts.map +1 -0
- package/dist/types/segments/HNVSD.d.ts +20 -0
- package/dist/types/segments/HNVSD.d.ts.map +1 -0
- package/dist/types/segments/HNVSK.d.ts +40 -0
- package/dist/types/segments/HNVSK.d.ts.map +1 -0
- package/dist/types/segments/businessTransactionParameter.d.ts +18 -0
- package/dist/types/segments/businessTransactionParameter.d.ts.map +1 -0
- package/dist/types/segments/registry.d.ts +4 -0
- package/dist/types/segments/registry.d.ts.map +1 -0
- package/dist/types/tanMethod.d.ts +10 -0
- package/dist/types/tanMethod.d.ts.map +1 -0
- package/dist/types/tests/HIBPA.test.d.ts +2 -0
- package/dist/types/tests/HIBPA.test.d.ts.map +1 -0
- package/dist/types/tests/HIPINS.test.d.ts +2 -0
- package/dist/types/tests/HIPINS.test.d.ts.map +1 -0
- package/dist/types/tests/HIRMG.test.d.ts +2 -0
- package/dist/types/tests/HIRMG.test.d.ts.map +1 -0
- package/dist/types/tests/HITAB.test.d.ts +2 -0
- package/dist/types/tests/HITAB.test.d.ts.map +1 -0
- package/dist/types/tests/HITANS.test.d.ts +2 -0
- package/dist/types/tests/HITANS.test.d.ts.map +1 -0
- package/dist/types/tests/HIUPA.test.d.ts +2 -0
- package/dist/types/tests/HIUPA.test.d.ts.map +1 -0
- package/dist/types/tests/HIUPD.test.d.ts +2 -0
- package/dist/types/tests/HIUPD.test.d.ts.map +1 -0
- package/dist/types/tests/HKIDN.test.d.ts +2 -0
- package/dist/types/tests/HKIDN.test.d.ts.map +1 -0
- package/dist/types/tests/HKSAL.test.d.ts +2 -0
- package/dist/types/tests/HKSAL.test.d.ts.map +1 -0
- package/dist/types/tests/HKTAN.test.d.ts +2 -0
- package/dist/types/tests/HKTAN.test.d.ts.map +1 -0
- package/dist/types/tests/HNSHK.test.d.ts +2 -0
- package/dist/types/tests/HNSHK.test.d.ts.map +1 -0
- package/dist/types/tests/HNVSK.test.d.ts +2 -0
- package/dist/types/tests/HNVSK.test.d.ts.map +1 -0
- package/dist/types/tests/client.test.d.ts +2 -0
- package/dist/types/tests/client.test.d.ts.map +1 -0
- package/dist/types/tests/datatypes.test.d.ts +2 -0
- package/dist/types/tests/datatypes.test.d.ts.map +1 -0
- package/dist/types/tests/message.test.d.ts +2 -0
- package/dist/types/tests/message.test.d.ts.map +1 -0
- package/dist/types/tests/mt940parser.test.d.ts +2 -0
- package/dist/types/tests/mt940parser.test.d.ts.map +1 -0
- package/dist/types/tests/parser.test.d.ts +2 -0
- package/dist/types/tests/parser.test.d.ts.map +1 -0
- package/dist/types/unknownSegment.d.ts +14 -0
- package/dist/types/unknownSegment.d.ts.map +1 -0
- package/dist/types/upd.d.ts +8 -0
- package/dist/types/upd.d.ts.map +1 -0
- package/dist/unknownSegment.js +8 -0
- package/dist/upd.js +1 -0
- package/package.json +45 -0
package/dist/decoder.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
export function decodeElements(text, elements, separator, version, context) {
|
|
2
|
+
const isResultArray = elements.length === 1 && elements[0].maxCount > 1;
|
|
3
|
+
let result = isResultArray ? [] : {};
|
|
4
|
+
const textValues = splitBySeparator(text, separator);
|
|
5
|
+
let valueIndex = 0;
|
|
6
|
+
let elementIndex = 0;
|
|
7
|
+
let elementCount = 0;
|
|
8
|
+
while (elementIndex < elements.length) {
|
|
9
|
+
const element = elements[elementIndex];
|
|
10
|
+
if (element.isInVersion(version)) {
|
|
11
|
+
let textValue;
|
|
12
|
+
if (separator === ':') {
|
|
13
|
+
textValue = textValues.slice(valueIndex, valueIndex + element.maxValueCount(version)).join(':');
|
|
14
|
+
valueIndex += element.maxValueCount(version);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
textValue = textValues[valueIndex];
|
|
18
|
+
valueIndex++;
|
|
19
|
+
}
|
|
20
|
+
let value;
|
|
21
|
+
if (!textValue) {
|
|
22
|
+
value = undefined;
|
|
23
|
+
if (elementCount < element.minCount) {
|
|
24
|
+
throw new Error(`Mandatory value is missing for element '${element.name}' in '${context}'`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
value = element.decode(textValue, version);
|
|
29
|
+
}
|
|
30
|
+
if (isResultArray) {
|
|
31
|
+
if (element.maxCount > 1) {
|
|
32
|
+
if (elements.length === 1) {
|
|
33
|
+
result = [...result, value];
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
result[elementIndex] = result[elementIndex] ? [...result[elementIndex], value] : [value];
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
result[elementIndex] = value;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
if (element.maxCount > 1) {
|
|
45
|
+
result[element.name] = result[element.name] ? [...result[element.name], value] : [value];
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
result[element.name] = value;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
elementCount++;
|
|
53
|
+
if (valueIndex >= textValues.length) {
|
|
54
|
+
if (elements.slice(elementIndex + 1).some((element) => element.isInVersion(version) && element.minCount > 0)) {
|
|
55
|
+
throw new Error(`Not all mandatory values are present in '${context}', expected a value for element '${elements[elementIndex + 1].name}'`);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (elementCount >= element.maxCount) {
|
|
62
|
+
elementIndex++;
|
|
63
|
+
elementCount = 0;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
export function splitBySeparator(text, separator) {
|
|
69
|
+
const result = [];
|
|
70
|
+
let pos = 0;
|
|
71
|
+
for (let index = 0; index < text.length; index++) {
|
|
72
|
+
const char = text[index];
|
|
73
|
+
if (char === '@' && !isEscaped(text, index)) {
|
|
74
|
+
const next = text.indexOf('@', index + 1);
|
|
75
|
+
const size = Number.parseInt(text.slice(index + 1, next));
|
|
76
|
+
if (size) {
|
|
77
|
+
index = next + size;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else if (char === separator && !isEscaped(text, index)) {
|
|
81
|
+
result.push(text.slice(pos, index));
|
|
82
|
+
pos = index + 1;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (pos < text.length) {
|
|
86
|
+
result.push(text.slice(pos));
|
|
87
|
+
}
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
function isEscaped(text, pos) {
|
|
91
|
+
let count = 0;
|
|
92
|
+
while (pos > 0 && text[pos - 1] === '?') {
|
|
93
|
+
count++;
|
|
94
|
+
pos--;
|
|
95
|
+
}
|
|
96
|
+
return count % 2 === 1;
|
|
97
|
+
}
|
package/dist/dialog.js
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { TanMediaRequirement } from './codes.js';
|
|
2
|
+
import { HttpClient } from './httpClient.js';
|
|
3
|
+
import { CustomerMessage, CustomerOrderMessage } from './message.js';
|
|
4
|
+
import { HKEND } from './segments/HKEND.js';
|
|
5
|
+
import { HKIDN } from './segments/HKIDN.js';
|
|
6
|
+
import { HKTAN } from './segments/HKTAN.js';
|
|
7
|
+
import { HNHBK } from './segments/HNHBK.js';
|
|
8
|
+
import { decode } from './segment.js';
|
|
9
|
+
import { PARTED } from './partedSegment.js';
|
|
10
|
+
import { HttpClientNode } from './httpClientNode.js';
|
|
11
|
+
export class Dialog {
|
|
12
|
+
config;
|
|
13
|
+
dialogId = '0';
|
|
14
|
+
lastMessageNumber = 0;
|
|
15
|
+
isInitialized = false;
|
|
16
|
+
hasEnded = false;
|
|
17
|
+
httpClient;
|
|
18
|
+
constructor(config) {
|
|
19
|
+
this.config = config;
|
|
20
|
+
if (!this.config) {
|
|
21
|
+
throw new Error('configuration must be provided');
|
|
22
|
+
}
|
|
23
|
+
this.httpClient = this.getHttpClient();
|
|
24
|
+
}
|
|
25
|
+
async initialize(interaction) {
|
|
26
|
+
if (this.isInitialized) {
|
|
27
|
+
throw new Error('dialog has already been initialized');
|
|
28
|
+
}
|
|
29
|
+
if (this.hasEnded) {
|
|
30
|
+
throw Error('cannot initialize a dialog that has already ended');
|
|
31
|
+
}
|
|
32
|
+
if (this.lastMessageNumber > 0) {
|
|
33
|
+
throw new Error('dialog initialization must be the first message in a dialog');
|
|
34
|
+
}
|
|
35
|
+
interaction.dialog = this;
|
|
36
|
+
this.lastMessageNumber++;
|
|
37
|
+
const message = new CustomerMessage(this.dialogId, this.lastMessageNumber);
|
|
38
|
+
const tanMethod = this.config.selectedTanMethod;
|
|
39
|
+
const isScaSupported = tanMethod && tanMethod.version >= 6;
|
|
40
|
+
if (this.config.userId && this.config.pin) {
|
|
41
|
+
message.sign(this.config.countryCode, this.config.bankId, this.config.userId, this.config.pin, this.config.bankingInformation.systemId, isScaSupported ? this.config.tanMethodId : undefined);
|
|
42
|
+
}
|
|
43
|
+
const segments = interaction.getSegments(this.config);
|
|
44
|
+
segments.forEach((segment) => message.addSegment(segment));
|
|
45
|
+
if (this.config.userId && this.config.pin && isScaSupported) {
|
|
46
|
+
const hktan = {
|
|
47
|
+
header: { segId: HKTAN.Id, segNr: 0, version: tanMethod.version },
|
|
48
|
+
tanProcess: 4,
|
|
49
|
+
segId: HKIDN.Id,
|
|
50
|
+
};
|
|
51
|
+
message.addSegment(hktan);
|
|
52
|
+
}
|
|
53
|
+
const initResponse = await this.httpClient.sendMessage(message);
|
|
54
|
+
const clientResponse = interaction.getClientResponse(initResponse);
|
|
55
|
+
this.dialogId = clientResponse.dialogId;
|
|
56
|
+
if (clientResponse.success && !clientResponse.requiresTan) {
|
|
57
|
+
this.isInitialized = true;
|
|
58
|
+
}
|
|
59
|
+
this.checkEnded(initResponse);
|
|
60
|
+
return clientResponse;
|
|
61
|
+
}
|
|
62
|
+
async end() {
|
|
63
|
+
if (!this.isInitialized || this.hasEnded) {
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
const tanMethod = this.config.selectedTanMethod;
|
|
67
|
+
const isScaSupported = tanMethod && tanMethod.version >= 6;
|
|
68
|
+
if (this.config.tanMethodId && !tanMethod) {
|
|
69
|
+
throw new Error('given tanMethodId is not available according to the BPD');
|
|
70
|
+
}
|
|
71
|
+
this.lastMessageNumber++;
|
|
72
|
+
const message = new CustomerMessage(this.dialogId, this.lastMessageNumber);
|
|
73
|
+
if (this.config.userId && this.config.pin) {
|
|
74
|
+
message.sign(this.config.countryCode, this.config.bankId, this.config.userId, this.config.pin, this.config.bankingInformation.systemId, isScaSupported ? this.config.tanMethodId : undefined);
|
|
75
|
+
}
|
|
76
|
+
const hkend = {
|
|
77
|
+
header: { segId: HKEND.Id, segNr: 0, version: HKEND.Version },
|
|
78
|
+
dialogId: this.dialogId,
|
|
79
|
+
};
|
|
80
|
+
message.addSegment(hkend);
|
|
81
|
+
const responseMessage = await this.httpClient.sendMessage(message);
|
|
82
|
+
this.checkEnded(responseMessage);
|
|
83
|
+
return this.hasEnded;
|
|
84
|
+
}
|
|
85
|
+
async startCustomerOrderInteraction(interaction) {
|
|
86
|
+
if (!this.isInitialized) {
|
|
87
|
+
throw Error('dialog must be initialized before sending a customer order');
|
|
88
|
+
}
|
|
89
|
+
if (this.hasEnded) {
|
|
90
|
+
throw Error('cannot send a customer message when dialog has already ended');
|
|
91
|
+
}
|
|
92
|
+
const bankTransaction = this.config.bankingInformation.bpd?.allowedTransactions.find((t) => t.transId === interaction.segId);
|
|
93
|
+
if (!bankTransaction) {
|
|
94
|
+
throw Error(`transaction ${interaction.segId} is not supported according to the BPD`);
|
|
95
|
+
}
|
|
96
|
+
interaction.dialog = this;
|
|
97
|
+
this.lastMessageNumber++;
|
|
98
|
+
const message = new CustomerOrderMessage(interaction.segId, interaction.responseSegId, this.dialogId, this.lastMessageNumber);
|
|
99
|
+
if (this.config.userId && this.config.pin) {
|
|
100
|
+
message.sign(this.config.countryCode, this.config.bankId, this.config.userId, this.config.pin, this.config.bankingInformation.systemId, this.config.selectedTanMethod && (bankTransaction.tanRequired || this.config.selectedTanMethod.version >= 6)
|
|
101
|
+
? this.config.tanMethodId
|
|
102
|
+
: undefined);
|
|
103
|
+
}
|
|
104
|
+
const segments = interaction.getSegments(this.config);
|
|
105
|
+
segments.forEach((segment) => message.addSegment(segment));
|
|
106
|
+
if (bankTransaction.tanRequired) {
|
|
107
|
+
if (this.config.userId && this.config.pin && this.config.tanMethodId) {
|
|
108
|
+
const hktan = {
|
|
109
|
+
header: { segId: HKTAN.Id, segNr: 0, version: this.config.selectedTanMethod.version },
|
|
110
|
+
tanProcess: 4,
|
|
111
|
+
segId: interaction.segId,
|
|
112
|
+
tanMedia: this.config.tanMediaName,
|
|
113
|
+
};
|
|
114
|
+
message.addSegment(hktan);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
let responseMessage = await this.httpClient.sendMessage(message);
|
|
118
|
+
let partedSegment = responseMessage.findSegment(PARTED.Id);
|
|
119
|
+
if (partedSegment) {
|
|
120
|
+
while (responseMessage.hasReturnCode(3040)) {
|
|
121
|
+
const answers = responseMessage.getBankAnswers();
|
|
122
|
+
const segmentWithContinuation = segments.find((s) => s.header.segId === interaction.segId);
|
|
123
|
+
if (!segmentWithContinuation) {
|
|
124
|
+
throw new Error(`Response contains segment with further information, but corresponding segment could not be found or is not specified`);
|
|
125
|
+
}
|
|
126
|
+
segmentWithContinuation.continuationMark = answers.find((a) => a.code === 3040).params[0];
|
|
127
|
+
message.findSegment(HNHBK.Id).msgNr = ++this.lastMessageNumber;
|
|
128
|
+
const nextResponseMessage = await this.httpClient.sendMessage(message);
|
|
129
|
+
const nextPartedSegment = nextResponseMessage.findSegment(PARTED.Id);
|
|
130
|
+
if (nextPartedSegment) {
|
|
131
|
+
nextPartedSegment.rawData =
|
|
132
|
+
partedSegment.rawData + nextPartedSegment.rawData.slice(nextPartedSegment.rawData.indexOf('+') + 1);
|
|
133
|
+
partedSegment = nextPartedSegment;
|
|
134
|
+
}
|
|
135
|
+
responseMessage = nextResponseMessage;
|
|
136
|
+
}
|
|
137
|
+
const completeSegment = decode(partedSegment.rawData);
|
|
138
|
+
const index = responseMessage.segments.indexOf(partedSegment);
|
|
139
|
+
responseMessage.segments.splice(index, 1, completeSegment);
|
|
140
|
+
}
|
|
141
|
+
this.checkEnded(responseMessage);
|
|
142
|
+
return interaction.getClientResponse(responseMessage);
|
|
143
|
+
}
|
|
144
|
+
async sendTanMessage(refSegId, tanOrderReference, tan) {
|
|
145
|
+
if (!refSegId || !tanOrderReference || !tan) {
|
|
146
|
+
throw Error('refSegId, tanOrderReference and TAN must be provided to send a TAN message');
|
|
147
|
+
}
|
|
148
|
+
if (!this.isInitialized) {
|
|
149
|
+
throw Error('dialog must be initialized before sending a TAN message');
|
|
150
|
+
}
|
|
151
|
+
if (this.hasEnded) {
|
|
152
|
+
throw Error('cannot send a TAN message when dialog has alreay ended');
|
|
153
|
+
}
|
|
154
|
+
this.lastMessageNumber++;
|
|
155
|
+
const message = new CustomerMessage(this.dialogId, this.lastMessageNumber);
|
|
156
|
+
if (this.config.userId && this.config.pin) {
|
|
157
|
+
message.sign(this.config.countryCode, this.config.bankId, this.config.userId, this.config.pin, this.config.bankingInformation.systemId, this.config.tanMethodId, tan);
|
|
158
|
+
}
|
|
159
|
+
if (this.config.userId && this.config.pin && this.config.tanMethodId) {
|
|
160
|
+
const hktan = {
|
|
161
|
+
header: { segId: HKTAN.Id, segNr: 0, version: this.config.selectedTanMethod.version },
|
|
162
|
+
tanProcess: 2,
|
|
163
|
+
segId: refSegId,
|
|
164
|
+
orderRef: tanOrderReference,
|
|
165
|
+
nextTan: false,
|
|
166
|
+
tanMedia: this.config.selectedTanMethod.tanMediaRequirement >= TanMediaRequirement.Optional
|
|
167
|
+
? this.config.tanMediaName
|
|
168
|
+
: undefined,
|
|
169
|
+
};
|
|
170
|
+
message.addSegment(hktan);
|
|
171
|
+
}
|
|
172
|
+
const responseMessage = await this.httpClient.sendMessage(message);
|
|
173
|
+
this.checkEnded(responseMessage);
|
|
174
|
+
return responseMessage;
|
|
175
|
+
}
|
|
176
|
+
checkEnded(initResponse) {
|
|
177
|
+
if (initResponse.hasReturnCode(100) || initResponse.hasReturnCode(9800)) {
|
|
178
|
+
this.hasEnded = true;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
getHttpClient() {
|
|
182
|
+
if (typeof fetch === 'function') {
|
|
183
|
+
return new HttpClient(this.config.bankingUrl, this.config.debugEnabled);
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
return new HttpClientNode(this.config.bankingUrl, this.config.debugEnabled);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
package/dist/encoder.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export function encodeElements(values, elements, separator, version, context) {
|
|
2
|
+
const isArray = Array.isArray(values);
|
|
3
|
+
if (!values || (isArray && values.length === 0) || (!isArray && Object.keys(values).length === 0)) {
|
|
4
|
+
if (context.length >= 3) {
|
|
5
|
+
return separator.repeat(elements.reduce((sum, element) => sum + element.maxValueCount(version), 0) - 1);
|
|
6
|
+
}
|
|
7
|
+
return '';
|
|
8
|
+
}
|
|
9
|
+
if (isArray && values.length !== elements.length) {
|
|
10
|
+
throw new Error(`Values to encode don't match number of elements (${values.length} <> ${elements.length}) when encoding '${context.join('->')}'`);
|
|
11
|
+
}
|
|
12
|
+
let textValues = [];
|
|
13
|
+
let elementIndex = 0;
|
|
14
|
+
while (elementIndex < elements.length) {
|
|
15
|
+
const element = elements[elementIndex];
|
|
16
|
+
if (!element.isInVersion(version)) {
|
|
17
|
+
elementIndex++;
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
if (isArray) {
|
|
21
|
+
if (elementIndex >= values.length) {
|
|
22
|
+
if (elementIndex < element.minCount) {
|
|
23
|
+
throw new Error(`There are not enough values for all mandatory elements when encoding '${context.join('->')}'`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (element.maxCount > 1) {
|
|
27
|
+
textValues.push(values[elementIndex]?.map((value) => element.encode(value, context, version)).join(separator));
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
textValues.push(element.encode(values[elementIndex], context, version));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
if (element.maxCount > 1) {
|
|
35
|
+
textValues.push(values[element.name]?.map((value) => element.encode(value, context, version)).join(separator));
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
textValues.push(element.encode(values[element.name], context, version));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
elementIndex++;
|
|
42
|
+
}
|
|
43
|
+
if (context.length < 3) {
|
|
44
|
+
textValues.splice(textValues.findLastIndex((text) => !!text && text !== ':') + 1);
|
|
45
|
+
}
|
|
46
|
+
return textValues.join(separator);
|
|
47
|
+
}
|
package/dist/format.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Message } from './message.js';
|
|
2
|
+
export class HttpClient {
|
|
3
|
+
url;
|
|
4
|
+
debug;
|
|
5
|
+
constructor(url, debug = false) {
|
|
6
|
+
this.url = url;
|
|
7
|
+
this.debug = debug;
|
|
8
|
+
}
|
|
9
|
+
async sendMessage(message) {
|
|
10
|
+
const encodedMessage = message.encode();
|
|
11
|
+
const requestBuffer = Buffer.from(encodedMessage);
|
|
12
|
+
if (this.debug) {
|
|
13
|
+
console.log('Request Message:\n' + message.toString());
|
|
14
|
+
}
|
|
15
|
+
const response = await fetch(this.url, {
|
|
16
|
+
method: 'POST',
|
|
17
|
+
headers: { 'Content-Type': 'text/plain' },
|
|
18
|
+
body: requestBuffer.toString('base64'),
|
|
19
|
+
});
|
|
20
|
+
if (response.ok) {
|
|
21
|
+
const responseBuffer = Buffer.from(await response.text(), 'base64');
|
|
22
|
+
const responseText = responseBuffer.toString('latin1');
|
|
23
|
+
try {
|
|
24
|
+
const customerOrderMessage = message;
|
|
25
|
+
const responseMessage = Message.decode(responseText, customerOrderMessage.supportsPartedResponseSegments ? customerOrderMessage.orderResponseSegId : undefined);
|
|
26
|
+
if (this.debug) {
|
|
27
|
+
console.log('Response Message:\n' + responseMessage.toString(true) + '\n');
|
|
28
|
+
}
|
|
29
|
+
return responseMessage;
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
console.error('Error decoding response message:', error);
|
|
33
|
+
console.error('Response Message Content:\n', responseText.split("'").join('\n'));
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
throw Error(`Request failed with status code ${response.status}: ${await response.text()}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Message } from './message.js';
|
|
2
|
+
import * as https from 'https';
|
|
3
|
+
export class HttpClientNode {
|
|
4
|
+
url;
|
|
5
|
+
debug;
|
|
6
|
+
constructor(url, debug = false) {
|
|
7
|
+
this.url = url;
|
|
8
|
+
this.debug = debug;
|
|
9
|
+
}
|
|
10
|
+
async sendMessage(message) {
|
|
11
|
+
const encodedMessage = message.encode();
|
|
12
|
+
const requestBuffer = Buffer.from(encodedMessage).toString('base64');
|
|
13
|
+
if (this.debug) {
|
|
14
|
+
console.log('Request Message:\n' + message.toString());
|
|
15
|
+
}
|
|
16
|
+
const requestOptions = {
|
|
17
|
+
method: 'POST',
|
|
18
|
+
headers: { 'Content-Type': 'text/plain' },
|
|
19
|
+
};
|
|
20
|
+
return new Promise((resolve, reject) => {
|
|
21
|
+
const req = https.request(this.url, requestOptions, (res) => {
|
|
22
|
+
let data = '';
|
|
23
|
+
res.on('data', (chunk) => {
|
|
24
|
+
data += chunk;
|
|
25
|
+
});
|
|
26
|
+
res.on('end', () => {
|
|
27
|
+
if (res.statusCode === 200) {
|
|
28
|
+
const responseBuffer = Buffer.from(data, 'base64');
|
|
29
|
+
const responseText = responseBuffer.toString('latin1');
|
|
30
|
+
try {
|
|
31
|
+
const customerOrderMessage = message;
|
|
32
|
+
const responseMessage = Message.decode(responseText, customerOrderMessage.supportsPartedResponseSegments
|
|
33
|
+
? customerOrderMessage.orderResponseSegId
|
|
34
|
+
: undefined);
|
|
35
|
+
if (this.debug) {
|
|
36
|
+
console.log('Response Message:\n' + responseMessage.toString(true) + '\n');
|
|
37
|
+
}
|
|
38
|
+
resolve(responseMessage);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
console.error('Error decoding response message:', error);
|
|
42
|
+
console.error('Response Message Content:\n', responseText.split("'").join('\n'));
|
|
43
|
+
reject(error);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
reject(new Error(`Request failed with status code ${res.statusCode}: ${data}`));
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
req.on('error', (error) => {
|
|
52
|
+
console.error('Request error:', error);
|
|
53
|
+
reject(error);
|
|
54
|
+
});
|
|
55
|
+
req.write(requestBuffer);
|
|
56
|
+
req.end();
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { registerSegments } from './segments/registry.js';
|
|
2
|
+
registerSegments();
|
|
3
|
+
export * from './client.js';
|
|
4
|
+
export * from './config.js';
|
|
5
|
+
export * from './segment.js';
|
|
6
|
+
export * from './message.js';
|
|
7
|
+
export * from './dialog.js';
|
|
8
|
+
export * from './httpClient.js';
|
|
9
|
+
export * from './bankAnswer.js';
|
|
10
|
+
export * from './bankAccount.js';
|
|
11
|
+
export * from './bankingInformation.js';
|
|
12
|
+
export * from './accountBalance.js';
|
|
13
|
+
export * from './bpd.js';
|
|
14
|
+
export * from './upd.js';
|
|
15
|
+
export * from './mt940parser.js';
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { CustomerOrderInteraction } from './customerInteraction.js';
|
|
2
|
+
import { CreditDebit } from '../codes.js';
|
|
3
|
+
import { HISAL } from '../segments/HISAL.js';
|
|
4
|
+
import { HKSAL } from '../segments/HKSAL.js';
|
|
5
|
+
export class BalanceInteraction extends CustomerOrderInteraction {
|
|
6
|
+
accountNumber;
|
|
7
|
+
constructor(accountNumber) {
|
|
8
|
+
super(HKSAL.Id, HISAL.Id);
|
|
9
|
+
this.accountNumber = accountNumber;
|
|
10
|
+
}
|
|
11
|
+
createSegments(init) {
|
|
12
|
+
const bankAccount = init.getBankAccount(this.accountNumber);
|
|
13
|
+
if (!init.isAccountTransactionSupported(this.accountNumber, this.segId)) {
|
|
14
|
+
throw Error(`Account ${this.accountNumber} does not support business transaction '${this.segId}'`);
|
|
15
|
+
}
|
|
16
|
+
const account = { ...bankAccount, iban: undefined };
|
|
17
|
+
const version = init.getMaxSupportedTransactionVersion(HKSAL.Id);
|
|
18
|
+
if (!version) {
|
|
19
|
+
throw Error(`There is no supported version for business transaction '${HKSAL.Id}`);
|
|
20
|
+
}
|
|
21
|
+
const hksal = {
|
|
22
|
+
header: { segId: HKSAL.Id, segNr: 0, version: version },
|
|
23
|
+
account,
|
|
24
|
+
allAccounts: false,
|
|
25
|
+
};
|
|
26
|
+
return [hksal];
|
|
27
|
+
}
|
|
28
|
+
handleResponse(response, clientResponse) {
|
|
29
|
+
const hisal = response.findSegment(HISAL.Id);
|
|
30
|
+
if (hisal) {
|
|
31
|
+
clientResponse.balance = {
|
|
32
|
+
date: hisal.balance.date,
|
|
33
|
+
currency: hisal.currency,
|
|
34
|
+
balance: balanceToValue(hisal.balance),
|
|
35
|
+
notedBalance: balanceToValue(hisal.notedBalance),
|
|
36
|
+
creditLimit: hisal.creditLimit?.value,
|
|
37
|
+
availableAmount: hisal.availableAmount?.value,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function balanceToValue(balance) {
|
|
43
|
+
if (!balance) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
return balance.creditDebit === CreditDebit.Credit ? balance.amount.value : -balance.amount.value;
|
|
47
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { HITAN } from '../segments/HITAN.js';
|
|
2
|
+
import { HNHBK } from '../segments/HNHBK.js';
|
|
3
|
+
export class CustomerInteraction {
|
|
4
|
+
segId;
|
|
5
|
+
dialog;
|
|
6
|
+
constructor(segId) {
|
|
7
|
+
this.segId = segId;
|
|
8
|
+
}
|
|
9
|
+
getSegments(init) {
|
|
10
|
+
return this.createSegments(init);
|
|
11
|
+
}
|
|
12
|
+
getClientResponse(response) {
|
|
13
|
+
const clientResponse = this.handleBaseResponse(response);
|
|
14
|
+
if (clientResponse.success && !clientResponse.requiresTan) {
|
|
15
|
+
this.handleResponse(response, clientResponse);
|
|
16
|
+
}
|
|
17
|
+
return clientResponse;
|
|
18
|
+
}
|
|
19
|
+
handleBaseResponse(response) {
|
|
20
|
+
const hnhbk = response.findSegment(HNHBK.Id);
|
|
21
|
+
const dialogId = hnhbk?.dialogId ?? '';
|
|
22
|
+
if (response.hasReturnCode(30)) {
|
|
23
|
+
const hitan = response.findSegment(HITAN.Id);
|
|
24
|
+
if (hitan) {
|
|
25
|
+
return {
|
|
26
|
+
dialogId,
|
|
27
|
+
success: true,
|
|
28
|
+
bankingInformationUpdated: false,
|
|
29
|
+
bankAnswers: response.getBankAnswers(),
|
|
30
|
+
requiresTan: true,
|
|
31
|
+
tanReference: hitan.orderReference,
|
|
32
|
+
tanChallenge: hitan.challenge,
|
|
33
|
+
tanMediaName: hitan.tanMedia,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
throw new Error('HITAN segment not found in response, despite return code 30');
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
dialogId,
|
|
42
|
+
success: response.getHighestReturnCode() < 9000,
|
|
43
|
+
bankingInformationUpdated: false,
|
|
44
|
+
bankAnswers: response.getBankAnswers(),
|
|
45
|
+
requiresTan: false,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export class CustomerOrderInteraction extends CustomerInteraction {
|
|
50
|
+
responseSegId;
|
|
51
|
+
constructor(segId, responseSegId) {
|
|
52
|
+
super(segId);
|
|
53
|
+
this.responseSegId = responseSegId;
|
|
54
|
+
}
|
|
55
|
+
}
|