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
|
@@ -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
|
+
}
|
package/dist/message.js
ADDED
|
@@ -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
|
+
}
|