@develit-services/bank 5.0.1 → 5.1.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/dist/base.cjs +242 -176
- package/dist/base.d.cts +45 -14
- package/dist/base.d.mts +45 -14
- package/dist/base.d.ts +45 -14
- package/dist/base.mjs +140 -74
- package/dist/database/schema.d.cts +1 -1
- package/dist/database/schema.d.mts +1 -1
- package/dist/database/schema.d.ts +1 -1
- package/dist/export/workflows.cjs +202 -127
- package/dist/export/workflows.mjs +194 -119
- package/dist/shared/{bank.wFDtecu7.d.cts → bank.C-edstpR.d.cts} +1 -1
- package/dist/shared/{bank.DXU-wqnl.d.mts → bank.C6BQDtpF.d.mts} +1 -1
- package/dist/shared/{bank.BdTj54NO.mjs → bank.C_JpNoSI.mjs} +1 -1
- package/dist/shared/{bank.BSX82jhx.cjs → bank.CjEKRnVl.cjs} +263 -262
- package/dist/shared/{bank.CZ8MQDPa.mjs → bank.D5skCz3H.mjs} +263 -263
- package/dist/shared/{bank.CibQRM2D.cjs → bank.Dji7yhN_.cjs} +16 -16
- package/dist/shared/{bank.BJTq7Qw9.d.cts → bank.Do1KUeDr.d.cts} +3 -3
- package/dist/shared/{bank.BJTq7Qw9.d.mts → bank.Do1KUeDr.d.mts} +3 -3
- package/dist/shared/{bank.BJTq7Qw9.d.ts → bank.Do1KUeDr.d.ts} +3 -3
- package/dist/shared/{bank.JAN0kymF.d.ts → bank.pZQAWlIB.d.ts} +1 -1
- package/dist/types.cjs +36 -36
- package/dist/types.d.cts +4 -4
- package/dist/types.d.mts +4 -4
- package/dist/types.d.ts +4 -4
- package/dist/types.mjs +1 -1
- package/package.json +1 -1
|
@@ -1239,264 +1239,6 @@ class CsobConnector extends FinbricksConnector {
|
|
|
1239
1239
|
}
|
|
1240
1240
|
}
|
|
1241
1241
|
|
|
1242
|
-
class AirBankConnector extends FinbricksConnector {
|
|
1243
|
-
constructor(config) {
|
|
1244
|
-
super("AIRBANK", config);
|
|
1245
|
-
}
|
|
1246
|
-
supportsBatch() {
|
|
1247
|
-
return false;
|
|
1248
|
-
}
|
|
1249
|
-
}
|
|
1250
|
-
|
|
1251
|
-
class CreditasConnector extends FinbricksConnector {
|
|
1252
|
-
constructor(config) {
|
|
1253
|
-
super("CREDITAS", config);
|
|
1254
|
-
}
|
|
1255
|
-
/**
|
|
1256
|
-
* Creditas bank doesn't support batch payments at all.
|
|
1257
|
-
*/
|
|
1258
|
-
supportsBatch() {
|
|
1259
|
-
return false;
|
|
1260
|
-
}
|
|
1261
|
-
}
|
|
1262
|
-
|
|
1263
|
-
class CSASConnector extends FinbricksConnector {
|
|
1264
|
-
constructor(config) {
|
|
1265
|
-
super("CSAS", config);
|
|
1266
|
-
}
|
|
1267
|
-
supportsBatch(paymentType) {
|
|
1268
|
-
return paymentType === "DOMESTIC";
|
|
1269
|
-
}
|
|
1270
|
-
}
|
|
1271
|
-
|
|
1272
|
-
class FioConnector extends FinbricksConnector {
|
|
1273
|
-
constructor(config) {
|
|
1274
|
-
super("FIO", config);
|
|
1275
|
-
}
|
|
1276
|
-
/**
|
|
1277
|
-
* FIO supports batch only for DOMESTIC (CZK) payments.
|
|
1278
|
-
* SEPA and SWIFT batch support is planned by Finbricks.
|
|
1279
|
-
*/
|
|
1280
|
-
supportsBatch(paymentType) {
|
|
1281
|
-
return paymentType === "DOMESTIC";
|
|
1282
|
-
}
|
|
1283
|
-
}
|
|
1284
|
-
|
|
1285
|
-
class KBConnector extends FinbricksConnector {
|
|
1286
|
-
constructor(config) {
|
|
1287
|
-
super("KB", config);
|
|
1288
|
-
}
|
|
1289
|
-
supportsBatch(paymentType) {
|
|
1290
|
-
return paymentType === "DOMESTIC";
|
|
1291
|
-
}
|
|
1292
|
-
}
|
|
1293
|
-
|
|
1294
|
-
class MonetaConnector extends FinbricksConnector {
|
|
1295
|
-
constructor(config) {
|
|
1296
|
-
super("MONETA", config);
|
|
1297
|
-
}
|
|
1298
|
-
/**
|
|
1299
|
-
* MONETA supports batch only for DOMESTIC (CZK) payments.
|
|
1300
|
-
* SEPA and SWIFT batch support is planned by Finbricks.
|
|
1301
|
-
*/
|
|
1302
|
-
supportsBatch(paymentType) {
|
|
1303
|
-
return paymentType === "DOMESTIC";
|
|
1304
|
-
}
|
|
1305
|
-
/**
|
|
1306
|
-
* MONETA rejects all special characters in endToEndIdentification.
|
|
1307
|
-
* Boundaries between segments are unambiguous without a separator —
|
|
1308
|
-
* `VS`/`SS`/`KS` prefixes are alphabetic and values are always numeric,
|
|
1309
|
-
* so the parsing regex `VS[:\s]*(\d+)` extracts each value correctly.
|
|
1310
|
-
*
|
|
1311
|
-
* Format: `VS1234SS5678KS0308` (max 30 chars).
|
|
1312
|
-
* Confirmed by Finbricks support (2026-04-23).
|
|
1313
|
-
*/
|
|
1314
|
-
buildEndToEndId(payment) {
|
|
1315
|
-
return buildEndToEndId(payment, { separator: "" });
|
|
1316
|
-
}
|
|
1317
|
-
}
|
|
1318
|
-
|
|
1319
|
-
const isDeposit = (payment, creditorIban) => {
|
|
1320
|
-
return payment.creditor.iban === creditorIban;
|
|
1321
|
-
};
|
|
1322
|
-
const getPaymentDirection = (payment, iban) => {
|
|
1323
|
-
if (isDeposit(payment, iban)) return "INCOMING";
|
|
1324
|
-
return "OUTGOING";
|
|
1325
|
-
};
|
|
1326
|
-
|
|
1327
|
-
const initiateConnector = async ({
|
|
1328
|
-
bank,
|
|
1329
|
-
env,
|
|
1330
|
-
connectedAccounts,
|
|
1331
|
-
resolveCredentials
|
|
1332
|
-
}) => {
|
|
1333
|
-
switch (bank) {
|
|
1334
|
-
case "ERSTE":
|
|
1335
|
-
return new ErsteConnector({
|
|
1336
|
-
API_KEY: (await env.SECRETS_STORE.get({
|
|
1337
|
-
secretName: "BANK_SERVICE_ERSTE_API_KEY"
|
|
1338
|
-
})).data?.secretValue || "",
|
|
1339
|
-
CLIENT_ID: (await env.SECRETS_STORE.get({
|
|
1340
|
-
secretName: "BANK_SERVICE_ERSTE_CLIENT_ID"
|
|
1341
|
-
})).data?.secretValue || "",
|
|
1342
|
-
CLIENT_SECRET: (await env.SECRETS_STORE.get({
|
|
1343
|
-
secretName: "BANK_SERVICE_ERSTE_CLIENT_SECRET"
|
|
1344
|
-
})).data?.secretValue || "",
|
|
1345
|
-
REDIRECT_URI: env.REDIRECT_URI,
|
|
1346
|
-
AUTH_URI: env.ERSTE_AUTH_URI,
|
|
1347
|
-
PAYMENTS_URI: env.ERSTE_PAYMENTS_URI,
|
|
1348
|
-
ACCOUNTS_URI: env.ERSTE_ACCOUNTS_URI,
|
|
1349
|
-
connectedAccounts,
|
|
1350
|
-
resolveCredentials
|
|
1351
|
-
});
|
|
1352
|
-
case "CREDITAS":
|
|
1353
|
-
return new CreditasConnector({
|
|
1354
|
-
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
1355
|
-
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
1356
|
-
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
1357
|
-
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
1358
|
-
})).data?.secretValue || "",
|
|
1359
|
-
REDIRECT_URI: env.REDIRECT_URI,
|
|
1360
|
-
connectedAccounts,
|
|
1361
|
-
resolveCredentials
|
|
1362
|
-
});
|
|
1363
|
-
case "MOCK_COBS":
|
|
1364
|
-
return new MockCobsConnector({
|
|
1365
|
-
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
1366
|
-
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
1367
|
-
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
1368
|
-
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
1369
|
-
})).data?.secretValue || "",
|
|
1370
|
-
REDIRECT_URI: env.REDIRECT_URI,
|
|
1371
|
-
connectedAccounts,
|
|
1372
|
-
resolveCredentials
|
|
1373
|
-
});
|
|
1374
|
-
case "FIO":
|
|
1375
|
-
return new FioConnector({
|
|
1376
|
-
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
1377
|
-
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
1378
|
-
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
1379
|
-
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
1380
|
-
})).data?.secretValue || "",
|
|
1381
|
-
REDIRECT_URI: env.REDIRECT_URI,
|
|
1382
|
-
connectedAccounts,
|
|
1383
|
-
resolveCredentials
|
|
1384
|
-
});
|
|
1385
|
-
case "MONETA":
|
|
1386
|
-
return new MonetaConnector({
|
|
1387
|
-
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
1388
|
-
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
1389
|
-
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
1390
|
-
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
1391
|
-
})).data?.secretValue || "",
|
|
1392
|
-
REDIRECT_URI: env.REDIRECT_URI,
|
|
1393
|
-
connectedAccounts,
|
|
1394
|
-
resolveCredentials
|
|
1395
|
-
});
|
|
1396
|
-
case "AIRBANK":
|
|
1397
|
-
return new AirBankConnector({
|
|
1398
|
-
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
1399
|
-
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
1400
|
-
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
1401
|
-
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
1402
|
-
})).data?.secretValue || "",
|
|
1403
|
-
REDIRECT_URI: env.REDIRECT_URI,
|
|
1404
|
-
connectedAccounts,
|
|
1405
|
-
resolveCredentials
|
|
1406
|
-
});
|
|
1407
|
-
case "CSAS":
|
|
1408
|
-
return new CSASConnector({
|
|
1409
|
-
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
1410
|
-
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
1411
|
-
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
1412
|
-
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
1413
|
-
})).data?.secretValue || "",
|
|
1414
|
-
REDIRECT_URI: env.REDIRECT_URI,
|
|
1415
|
-
connectedAccounts,
|
|
1416
|
-
resolveCredentials
|
|
1417
|
-
});
|
|
1418
|
-
case "KB":
|
|
1419
|
-
return new KBConnector({
|
|
1420
|
-
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
1421
|
-
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
1422
|
-
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
1423
|
-
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
1424
|
-
})).data?.secretValue || "",
|
|
1425
|
-
REDIRECT_URI: env.REDIRECT_URI,
|
|
1426
|
-
connectedAccounts,
|
|
1427
|
-
resolveCredentials
|
|
1428
|
-
});
|
|
1429
|
-
case "CSOB":
|
|
1430
|
-
return new CsobConnector({
|
|
1431
|
-
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
1432
|
-
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
1433
|
-
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
1434
|
-
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
1435
|
-
})).data?.secretValue || "",
|
|
1436
|
-
REDIRECT_URI: env.REDIRECT_URI,
|
|
1437
|
-
connectedAccounts,
|
|
1438
|
-
resolveCredentials
|
|
1439
|
-
});
|
|
1440
|
-
case "DBU":
|
|
1441
|
-
return new DbuConnector({
|
|
1442
|
-
BASE_URL: env.DBUCS_BASE_URI,
|
|
1443
|
-
USERNAME: env.DBUCS_USERNAME,
|
|
1444
|
-
APPLICATION_CODE: env.DBUCS_APPLICATION_CODE,
|
|
1445
|
-
KV: env.BANK_KV,
|
|
1446
|
-
API: env.DBU_CBS_BACKOFFICE_DEV,
|
|
1447
|
-
REDIRECT_URI: env.REDIRECT_URI,
|
|
1448
|
-
TX_AUTH_URI: env.DBUCS_TX_AUTH_URI,
|
|
1449
|
-
connectedAccounts
|
|
1450
|
-
});
|
|
1451
|
-
default:
|
|
1452
|
-
const mockConnector = new MockConnector();
|
|
1453
|
-
mockConnector.connectedAccounts = connectedAccounts;
|
|
1454
|
-
return mockConnector;
|
|
1455
|
-
}
|
|
1456
|
-
};
|
|
1457
|
-
function mod97(string) {
|
|
1458
|
-
let checksum = string.slice(0, 2);
|
|
1459
|
-
let fragment = "";
|
|
1460
|
-
for (let offset = 2; offset < string.length; offset += 7) {
|
|
1461
|
-
fragment = checksum + string.substring(offset, offset + 7);
|
|
1462
|
-
checksum = (parseInt(fragment, 10) % 97).toString();
|
|
1463
|
-
}
|
|
1464
|
-
return parseInt(checksum, 10);
|
|
1465
|
-
}
|
|
1466
|
-
const parseCzechIban = (iban) => {
|
|
1467
|
-
const stripped = iban.replace(/\s/g, "").toUpperCase();
|
|
1468
|
-
if (!stripped.startsWith("CZ") || stripped.length !== 24) {
|
|
1469
|
-
throw new Error(`Invalid Czech IBAN: ${iban}`);
|
|
1470
|
-
}
|
|
1471
|
-
const bankCode = stripped.slice(4, 8);
|
|
1472
|
-
const prefix = stripped.slice(8, 14).replace(/^0+/, "");
|
|
1473
|
-
const main = stripped.slice(14, 24).replace(/^0+/, "");
|
|
1474
|
-
const accountNumber = prefix ? `${prefix}-${main}` : main;
|
|
1475
|
-
return { bankCode, accountNumber };
|
|
1476
|
-
};
|
|
1477
|
-
const calculateCzechIban = (accountNumber, bankCode) => {
|
|
1478
|
-
const paddedBankCode = bankCode.padStart(4, "0");
|
|
1479
|
-
let prefix = "";
|
|
1480
|
-
let mainAccount = accountNumber;
|
|
1481
|
-
if (accountNumber.includes("-")) {
|
|
1482
|
-
const parts = accountNumber.split("-");
|
|
1483
|
-
if (parts.length !== 2) {
|
|
1484
|
-
throw new Error(
|
|
1485
|
-
`Invalid account number format: expected "prefix-main" or "main", got "${accountNumber}"`
|
|
1486
|
-
);
|
|
1487
|
-
}
|
|
1488
|
-
prefix = parts[0];
|
|
1489
|
-
mainAccount = parts[1];
|
|
1490
|
-
}
|
|
1491
|
-
const paddedPrefix = prefix.padStart(6, "0");
|
|
1492
|
-
const paddedAccount = mainAccount.padStart(10, "0");
|
|
1493
|
-
const basicIban = paddedBankCode + paddedPrefix + paddedAccount;
|
|
1494
|
-
const rearranged = basicIban + "123500";
|
|
1495
|
-
const remainder = mod97(rearranged);
|
|
1496
|
-
const checkDigits = (98 - remainder).toString().padStart(2, "0");
|
|
1497
|
-
return `CZ${checkDigits}${basicIban}`;
|
|
1498
|
-
};
|
|
1499
|
-
|
|
1500
1242
|
const dbuAccountConfigSchema = zod.z.object({
|
|
1501
1243
|
with4EyeApproval: zod.z.enum(["Y", "N"]).default("Y"),
|
|
1502
1244
|
realizeImmediate: zod.z.enum(["Y", "N"]).default("Y"),
|
|
@@ -2404,10 +2146,19 @@ class ErsteConnector extends IBankConnector {
|
|
|
2404
2146
|
async getPaymentStatus(_) {
|
|
2405
2147
|
throw new Error("Erste connector: getPaymentStatus not implemented");
|
|
2406
2148
|
}
|
|
2407
|
-
parseAuthorizationCallback(_callbackUrl) {
|
|
2408
|
-
throw new Error(
|
|
2409
|
-
"Erste connector: parseAuthorizationCallback not implemented"
|
|
2410
|
-
);
|
|
2149
|
+
parseAuthorizationCallback(_callbackUrl) {
|
|
2150
|
+
throw new Error(
|
|
2151
|
+
"Erste connector: parseAuthorizationCallback not implemented"
|
|
2152
|
+
);
|
|
2153
|
+
}
|
|
2154
|
+
}
|
|
2155
|
+
|
|
2156
|
+
class KBConnector extends FinbricksConnector {
|
|
2157
|
+
constructor(config) {
|
|
2158
|
+
super("KB", config);
|
|
2159
|
+
}
|
|
2160
|
+
supportsBatch(paymentType) {
|
|
2161
|
+
return paymentType === "DOMESTIC";
|
|
2411
2162
|
}
|
|
2412
2163
|
}
|
|
2413
2164
|
|
|
@@ -2518,6 +2269,255 @@ const ottInsertSchema = zod$1.createInsertSchema(database_schema.ott);
|
|
|
2518
2269
|
const ottUpdateSchema = zod$1.createUpdateSchema(database_schema.ott);
|
|
2519
2270
|
const ottSelectSchema = zod$1.createSelectSchema(database_schema.ott);
|
|
2520
2271
|
|
|
2272
|
+
class AirBankConnector extends FinbricksConnector {
|
|
2273
|
+
constructor(config) {
|
|
2274
|
+
super("AIRBANK", config);
|
|
2275
|
+
}
|
|
2276
|
+
supportsBatch() {
|
|
2277
|
+
return false;
|
|
2278
|
+
}
|
|
2279
|
+
}
|
|
2280
|
+
|
|
2281
|
+
class CreditasConnector extends FinbricksConnector {
|
|
2282
|
+
constructor(config) {
|
|
2283
|
+
super("CREDITAS", config);
|
|
2284
|
+
}
|
|
2285
|
+
/**
|
|
2286
|
+
* Creditas bank doesn't support batch payments at all.
|
|
2287
|
+
*/
|
|
2288
|
+
supportsBatch() {
|
|
2289
|
+
return false;
|
|
2290
|
+
}
|
|
2291
|
+
}
|
|
2292
|
+
|
|
2293
|
+
class CSASConnector extends FinbricksConnector {
|
|
2294
|
+
constructor(config) {
|
|
2295
|
+
super("CSAS", config);
|
|
2296
|
+
}
|
|
2297
|
+
supportsBatch(paymentType) {
|
|
2298
|
+
return paymentType === "DOMESTIC";
|
|
2299
|
+
}
|
|
2300
|
+
}
|
|
2301
|
+
|
|
2302
|
+
class FioConnector extends FinbricksConnector {
|
|
2303
|
+
constructor(config) {
|
|
2304
|
+
super("FIO", config);
|
|
2305
|
+
}
|
|
2306
|
+
/**
|
|
2307
|
+
* FIO supports batch only for DOMESTIC (CZK) payments.
|
|
2308
|
+
* SEPA and SWIFT batch support is planned by Finbricks.
|
|
2309
|
+
*/
|
|
2310
|
+
supportsBatch(paymentType) {
|
|
2311
|
+
return paymentType === "DOMESTIC";
|
|
2312
|
+
}
|
|
2313
|
+
}
|
|
2314
|
+
|
|
2315
|
+
class MonetaConnector extends FinbricksConnector {
|
|
2316
|
+
constructor(config) {
|
|
2317
|
+
super("MONETA", config);
|
|
2318
|
+
}
|
|
2319
|
+
/**
|
|
2320
|
+
* MONETA supports batch only for DOMESTIC (CZK) payments.
|
|
2321
|
+
* SEPA and SWIFT batch support is planned by Finbricks.
|
|
2322
|
+
*/
|
|
2323
|
+
supportsBatch(paymentType) {
|
|
2324
|
+
return paymentType === "DOMESTIC";
|
|
2325
|
+
}
|
|
2326
|
+
/**
|
|
2327
|
+
* MONETA rejects all special characters in endToEndIdentification.
|
|
2328
|
+
* Boundaries between segments are unambiguous without a separator —
|
|
2329
|
+
* `VS`/`SS`/`KS` prefixes are alphabetic and values are always numeric,
|
|
2330
|
+
* so the parsing regex `VS[:\s]*(\d+)` extracts each value correctly.
|
|
2331
|
+
*
|
|
2332
|
+
* Format: `VS1234SS5678KS0308` (max 30 chars).
|
|
2333
|
+
* Confirmed by Finbricks support (2026-04-23).
|
|
2334
|
+
*/
|
|
2335
|
+
buildEndToEndId(payment) {
|
|
2336
|
+
return buildEndToEndId(payment, { separator: "" });
|
|
2337
|
+
}
|
|
2338
|
+
}
|
|
2339
|
+
|
|
2340
|
+
const isDeposit = (payment, creditorIban) => {
|
|
2341
|
+
return payment.creditor.iban === creditorIban;
|
|
2342
|
+
};
|
|
2343
|
+
const getPaymentDirection = (payment, iban) => {
|
|
2344
|
+
if (isDeposit(payment, iban)) return "INCOMING";
|
|
2345
|
+
return "OUTGOING";
|
|
2346
|
+
};
|
|
2347
|
+
|
|
2348
|
+
const initiateConnector = async ({
|
|
2349
|
+
bank,
|
|
2350
|
+
env,
|
|
2351
|
+
connectedAccounts,
|
|
2352
|
+
resolveCredentials
|
|
2353
|
+
}) => {
|
|
2354
|
+
switch (bank) {
|
|
2355
|
+
case "ERSTE":
|
|
2356
|
+
return new ErsteConnector({
|
|
2357
|
+
API_KEY: (await env.SECRETS_STORE.get({
|
|
2358
|
+
secretName: "BANK_SERVICE_ERSTE_API_KEY"
|
|
2359
|
+
})).data?.secretValue || "",
|
|
2360
|
+
CLIENT_ID: (await env.SECRETS_STORE.get({
|
|
2361
|
+
secretName: "BANK_SERVICE_ERSTE_CLIENT_ID"
|
|
2362
|
+
})).data?.secretValue || "",
|
|
2363
|
+
CLIENT_SECRET: (await env.SECRETS_STORE.get({
|
|
2364
|
+
secretName: "BANK_SERVICE_ERSTE_CLIENT_SECRET"
|
|
2365
|
+
})).data?.secretValue || "",
|
|
2366
|
+
REDIRECT_URI: env.REDIRECT_URI,
|
|
2367
|
+
AUTH_URI: env.ERSTE_AUTH_URI,
|
|
2368
|
+
PAYMENTS_URI: env.ERSTE_PAYMENTS_URI,
|
|
2369
|
+
ACCOUNTS_URI: env.ERSTE_ACCOUNTS_URI,
|
|
2370
|
+
connectedAccounts,
|
|
2371
|
+
resolveCredentials
|
|
2372
|
+
});
|
|
2373
|
+
case "CREDITAS":
|
|
2374
|
+
return new CreditasConnector({
|
|
2375
|
+
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
2376
|
+
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
2377
|
+
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
2378
|
+
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
2379
|
+
})).data?.secretValue || "",
|
|
2380
|
+
REDIRECT_URI: env.REDIRECT_URI,
|
|
2381
|
+
connectedAccounts,
|
|
2382
|
+
resolveCredentials
|
|
2383
|
+
});
|
|
2384
|
+
case "MOCK_COBS":
|
|
2385
|
+
return new MockCobsConnector({
|
|
2386
|
+
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
2387
|
+
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
2388
|
+
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
2389
|
+
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
2390
|
+
})).data?.secretValue || "",
|
|
2391
|
+
REDIRECT_URI: env.REDIRECT_URI,
|
|
2392
|
+
connectedAccounts,
|
|
2393
|
+
resolveCredentials
|
|
2394
|
+
});
|
|
2395
|
+
case "FIO":
|
|
2396
|
+
return new FioConnector({
|
|
2397
|
+
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
2398
|
+
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
2399
|
+
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
2400
|
+
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
2401
|
+
})).data?.secretValue || "",
|
|
2402
|
+
REDIRECT_URI: env.REDIRECT_URI,
|
|
2403
|
+
connectedAccounts,
|
|
2404
|
+
resolveCredentials
|
|
2405
|
+
});
|
|
2406
|
+
case "MONETA":
|
|
2407
|
+
return new MonetaConnector({
|
|
2408
|
+
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
2409
|
+
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
2410
|
+
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
2411
|
+
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
2412
|
+
})).data?.secretValue || "",
|
|
2413
|
+
REDIRECT_URI: env.REDIRECT_URI,
|
|
2414
|
+
connectedAccounts,
|
|
2415
|
+
resolveCredentials
|
|
2416
|
+
});
|
|
2417
|
+
case "AIRBANK":
|
|
2418
|
+
return new AirBankConnector({
|
|
2419
|
+
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
2420
|
+
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
2421
|
+
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
2422
|
+
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
2423
|
+
})).data?.secretValue || "",
|
|
2424
|
+
REDIRECT_URI: env.REDIRECT_URI,
|
|
2425
|
+
connectedAccounts,
|
|
2426
|
+
resolveCredentials
|
|
2427
|
+
});
|
|
2428
|
+
case "CSAS":
|
|
2429
|
+
return new CSASConnector({
|
|
2430
|
+
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
2431
|
+
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
2432
|
+
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
2433
|
+
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
2434
|
+
})).data?.secretValue || "",
|
|
2435
|
+
REDIRECT_URI: env.REDIRECT_URI,
|
|
2436
|
+
connectedAccounts,
|
|
2437
|
+
resolveCredentials
|
|
2438
|
+
});
|
|
2439
|
+
case "KB":
|
|
2440
|
+
return new KBConnector({
|
|
2441
|
+
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
2442
|
+
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
2443
|
+
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
2444
|
+
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
2445
|
+
})).data?.secretValue || "",
|
|
2446
|
+
REDIRECT_URI: env.REDIRECT_URI,
|
|
2447
|
+
connectedAccounts,
|
|
2448
|
+
resolveCredentials
|
|
2449
|
+
});
|
|
2450
|
+
case "CSOB":
|
|
2451
|
+
return new CsobConnector({
|
|
2452
|
+
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
2453
|
+
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
2454
|
+
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
2455
|
+
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
2456
|
+
})).data?.secretValue || "",
|
|
2457
|
+
REDIRECT_URI: env.REDIRECT_URI,
|
|
2458
|
+
connectedAccounts,
|
|
2459
|
+
resolveCredentials
|
|
2460
|
+
});
|
|
2461
|
+
case "DBU":
|
|
2462
|
+
return new DbuConnector({
|
|
2463
|
+
BASE_URL: env.DBUCS_BASE_URI,
|
|
2464
|
+
USERNAME: env.DBUCS_USERNAME,
|
|
2465
|
+
APPLICATION_CODE: env.DBUCS_APPLICATION_CODE,
|
|
2466
|
+
KV: env.BANK_KV,
|
|
2467
|
+
API: env.DBU_CBS_BACKOFFICE_DEV,
|
|
2468
|
+
REDIRECT_URI: env.REDIRECT_URI,
|
|
2469
|
+
TX_AUTH_URI: env.DBUCS_TX_AUTH_URI,
|
|
2470
|
+
connectedAccounts
|
|
2471
|
+
});
|
|
2472
|
+
default:
|
|
2473
|
+
const mockConnector = new MockConnector();
|
|
2474
|
+
mockConnector.connectedAccounts = connectedAccounts;
|
|
2475
|
+
return mockConnector;
|
|
2476
|
+
}
|
|
2477
|
+
};
|
|
2478
|
+
function mod97(string) {
|
|
2479
|
+
let checksum = string.slice(0, 2);
|
|
2480
|
+
let fragment = "";
|
|
2481
|
+
for (let offset = 2; offset < string.length; offset += 7) {
|
|
2482
|
+
fragment = checksum + string.substring(offset, offset + 7);
|
|
2483
|
+
checksum = (parseInt(fragment, 10) % 97).toString();
|
|
2484
|
+
}
|
|
2485
|
+
return parseInt(checksum, 10);
|
|
2486
|
+
}
|
|
2487
|
+
const parseCzechIban = (iban) => {
|
|
2488
|
+
const stripped = iban.replace(/\s/g, "").toUpperCase();
|
|
2489
|
+
if (!stripped.startsWith("CZ") || stripped.length !== 24) {
|
|
2490
|
+
throw new Error(`Invalid Czech IBAN: ${iban}`);
|
|
2491
|
+
}
|
|
2492
|
+
const bankCode = stripped.slice(4, 8);
|
|
2493
|
+
const prefix = stripped.slice(8, 14).replace(/^0+/, "");
|
|
2494
|
+
const main = stripped.slice(14, 24).replace(/^0+/, "");
|
|
2495
|
+
const accountNumber = prefix ? `${prefix}-${main}` : main;
|
|
2496
|
+
return { bankCode, accountNumber };
|
|
2497
|
+
};
|
|
2498
|
+
const calculateCzechIban = (accountNumber, bankCode) => {
|
|
2499
|
+
const paddedBankCode = bankCode.padStart(4, "0");
|
|
2500
|
+
let prefix = "";
|
|
2501
|
+
let mainAccount = accountNumber;
|
|
2502
|
+
if (accountNumber.includes("-")) {
|
|
2503
|
+
const parts = accountNumber.split("-");
|
|
2504
|
+
if (parts.length !== 2) {
|
|
2505
|
+
throw new Error(
|
|
2506
|
+
`Invalid account number format: expected "prefix-main" or "main", got "${accountNumber}"`
|
|
2507
|
+
);
|
|
2508
|
+
}
|
|
2509
|
+
prefix = parts[0];
|
|
2510
|
+
mainAccount = parts[1];
|
|
2511
|
+
}
|
|
2512
|
+
const paddedPrefix = prefix.padStart(6, "0");
|
|
2513
|
+
const paddedAccount = mainAccount.padStart(10, "0");
|
|
2514
|
+
const basicIban = paddedBankCode + paddedPrefix + paddedAccount;
|
|
2515
|
+
const rearranged = basicIban + "123500";
|
|
2516
|
+
const remainder = mod97(rearranged);
|
|
2517
|
+
const checkDigits = (98 - remainder).toString().padStart(2, "0");
|
|
2518
|
+
return `CZ${checkDigits}${basicIban}`;
|
|
2519
|
+
};
|
|
2520
|
+
|
|
2521
2521
|
exports.BASE_TERMINAL_STATUSES = BASE_TERMINAL_STATUSES;
|
|
2522
2522
|
exports.CsobConnector = CsobConnector;
|
|
2523
2523
|
exports.DbuConnector = DbuConnector;
|
|
@@ -2536,6 +2536,7 @@ exports.accountInsertSchema = accountInsertSchema;
|
|
|
2536
2536
|
exports.accountSelectSchema = accountSelectSchema;
|
|
2537
2537
|
exports.accountUpdateSchema = accountUpdateSchema;
|
|
2538
2538
|
exports.assignAccount = assignAccount;
|
|
2539
|
+
exports.calculateCzechIban = calculateCzechIban;
|
|
2539
2540
|
exports.dbuAccountConfigSchema = dbuAccountConfigSchema;
|
|
2540
2541
|
exports.getNonTerminalPaymentRequestsQuery = getNonTerminalPaymentRequestsQuery;
|
|
2541
2542
|
exports.hasPaymentAccountAssigned = hasPaymentAccountAssigned;
|