@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
|
@@ -1237,264 +1237,6 @@ class CsobConnector extends FinbricksConnector {
|
|
|
1237
1237
|
}
|
|
1238
1238
|
}
|
|
1239
1239
|
|
|
1240
|
-
class AirBankConnector extends FinbricksConnector {
|
|
1241
|
-
constructor(config) {
|
|
1242
|
-
super("AIRBANK", config);
|
|
1243
|
-
}
|
|
1244
|
-
supportsBatch() {
|
|
1245
|
-
return false;
|
|
1246
|
-
}
|
|
1247
|
-
}
|
|
1248
|
-
|
|
1249
|
-
class CreditasConnector extends FinbricksConnector {
|
|
1250
|
-
constructor(config) {
|
|
1251
|
-
super("CREDITAS", config);
|
|
1252
|
-
}
|
|
1253
|
-
/**
|
|
1254
|
-
* Creditas bank doesn't support batch payments at all.
|
|
1255
|
-
*/
|
|
1256
|
-
supportsBatch() {
|
|
1257
|
-
return false;
|
|
1258
|
-
}
|
|
1259
|
-
}
|
|
1260
|
-
|
|
1261
|
-
class CSASConnector extends FinbricksConnector {
|
|
1262
|
-
constructor(config) {
|
|
1263
|
-
super("CSAS", config);
|
|
1264
|
-
}
|
|
1265
|
-
supportsBatch(paymentType) {
|
|
1266
|
-
return paymentType === "DOMESTIC";
|
|
1267
|
-
}
|
|
1268
|
-
}
|
|
1269
|
-
|
|
1270
|
-
class FioConnector extends FinbricksConnector {
|
|
1271
|
-
constructor(config) {
|
|
1272
|
-
super("FIO", config);
|
|
1273
|
-
}
|
|
1274
|
-
/**
|
|
1275
|
-
* FIO supports batch only for DOMESTIC (CZK) payments.
|
|
1276
|
-
* SEPA and SWIFT batch support is planned by Finbricks.
|
|
1277
|
-
*/
|
|
1278
|
-
supportsBatch(paymentType) {
|
|
1279
|
-
return paymentType === "DOMESTIC";
|
|
1280
|
-
}
|
|
1281
|
-
}
|
|
1282
|
-
|
|
1283
|
-
class KBConnector extends FinbricksConnector {
|
|
1284
|
-
constructor(config) {
|
|
1285
|
-
super("KB", config);
|
|
1286
|
-
}
|
|
1287
|
-
supportsBatch(paymentType) {
|
|
1288
|
-
return paymentType === "DOMESTIC";
|
|
1289
|
-
}
|
|
1290
|
-
}
|
|
1291
|
-
|
|
1292
|
-
class MonetaConnector extends FinbricksConnector {
|
|
1293
|
-
constructor(config) {
|
|
1294
|
-
super("MONETA", config);
|
|
1295
|
-
}
|
|
1296
|
-
/**
|
|
1297
|
-
* MONETA supports batch only for DOMESTIC (CZK) payments.
|
|
1298
|
-
* SEPA and SWIFT batch support is planned by Finbricks.
|
|
1299
|
-
*/
|
|
1300
|
-
supportsBatch(paymentType) {
|
|
1301
|
-
return paymentType === "DOMESTIC";
|
|
1302
|
-
}
|
|
1303
|
-
/**
|
|
1304
|
-
* MONETA rejects all special characters in endToEndIdentification.
|
|
1305
|
-
* Boundaries between segments are unambiguous without a separator —
|
|
1306
|
-
* `VS`/`SS`/`KS` prefixes are alphabetic and values are always numeric,
|
|
1307
|
-
* so the parsing regex `VS[:\s]*(\d+)` extracts each value correctly.
|
|
1308
|
-
*
|
|
1309
|
-
* Format: `VS1234SS5678KS0308` (max 30 chars).
|
|
1310
|
-
* Confirmed by Finbricks support (2026-04-23).
|
|
1311
|
-
*/
|
|
1312
|
-
buildEndToEndId(payment) {
|
|
1313
|
-
return buildEndToEndId(payment, { separator: "" });
|
|
1314
|
-
}
|
|
1315
|
-
}
|
|
1316
|
-
|
|
1317
|
-
const isDeposit = (payment, creditorIban) => {
|
|
1318
|
-
return payment.creditor.iban === creditorIban;
|
|
1319
|
-
};
|
|
1320
|
-
const getPaymentDirection = (payment, iban) => {
|
|
1321
|
-
if (isDeposit(payment, iban)) return "INCOMING";
|
|
1322
|
-
return "OUTGOING";
|
|
1323
|
-
};
|
|
1324
|
-
|
|
1325
|
-
const initiateConnector = async ({
|
|
1326
|
-
bank,
|
|
1327
|
-
env,
|
|
1328
|
-
connectedAccounts,
|
|
1329
|
-
resolveCredentials
|
|
1330
|
-
}) => {
|
|
1331
|
-
switch (bank) {
|
|
1332
|
-
case "ERSTE":
|
|
1333
|
-
return new ErsteConnector({
|
|
1334
|
-
API_KEY: (await env.SECRETS_STORE.get({
|
|
1335
|
-
secretName: "BANK_SERVICE_ERSTE_API_KEY"
|
|
1336
|
-
})).data?.secretValue || "",
|
|
1337
|
-
CLIENT_ID: (await env.SECRETS_STORE.get({
|
|
1338
|
-
secretName: "BANK_SERVICE_ERSTE_CLIENT_ID"
|
|
1339
|
-
})).data?.secretValue || "",
|
|
1340
|
-
CLIENT_SECRET: (await env.SECRETS_STORE.get({
|
|
1341
|
-
secretName: "BANK_SERVICE_ERSTE_CLIENT_SECRET"
|
|
1342
|
-
})).data?.secretValue || "",
|
|
1343
|
-
REDIRECT_URI: env.REDIRECT_URI,
|
|
1344
|
-
AUTH_URI: env.ERSTE_AUTH_URI,
|
|
1345
|
-
PAYMENTS_URI: env.ERSTE_PAYMENTS_URI,
|
|
1346
|
-
ACCOUNTS_URI: env.ERSTE_ACCOUNTS_URI,
|
|
1347
|
-
connectedAccounts,
|
|
1348
|
-
resolveCredentials
|
|
1349
|
-
});
|
|
1350
|
-
case "CREDITAS":
|
|
1351
|
-
return new CreditasConnector({
|
|
1352
|
-
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
1353
|
-
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
1354
|
-
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
1355
|
-
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
1356
|
-
})).data?.secretValue || "",
|
|
1357
|
-
REDIRECT_URI: env.REDIRECT_URI,
|
|
1358
|
-
connectedAccounts,
|
|
1359
|
-
resolveCredentials
|
|
1360
|
-
});
|
|
1361
|
-
case "MOCK_COBS":
|
|
1362
|
-
return new MockCobsConnector({
|
|
1363
|
-
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
1364
|
-
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
1365
|
-
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
1366
|
-
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
1367
|
-
})).data?.secretValue || "",
|
|
1368
|
-
REDIRECT_URI: env.REDIRECT_URI,
|
|
1369
|
-
connectedAccounts,
|
|
1370
|
-
resolveCredentials
|
|
1371
|
-
});
|
|
1372
|
-
case "FIO":
|
|
1373
|
-
return new FioConnector({
|
|
1374
|
-
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
1375
|
-
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
1376
|
-
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
1377
|
-
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
1378
|
-
})).data?.secretValue || "",
|
|
1379
|
-
REDIRECT_URI: env.REDIRECT_URI,
|
|
1380
|
-
connectedAccounts,
|
|
1381
|
-
resolveCredentials
|
|
1382
|
-
});
|
|
1383
|
-
case "MONETA":
|
|
1384
|
-
return new MonetaConnector({
|
|
1385
|
-
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
1386
|
-
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
1387
|
-
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
1388
|
-
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
1389
|
-
})).data?.secretValue || "",
|
|
1390
|
-
REDIRECT_URI: env.REDIRECT_URI,
|
|
1391
|
-
connectedAccounts,
|
|
1392
|
-
resolveCredentials
|
|
1393
|
-
});
|
|
1394
|
-
case "AIRBANK":
|
|
1395
|
-
return new AirBankConnector({
|
|
1396
|
-
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
1397
|
-
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
1398
|
-
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
1399
|
-
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
1400
|
-
})).data?.secretValue || "",
|
|
1401
|
-
REDIRECT_URI: env.REDIRECT_URI,
|
|
1402
|
-
connectedAccounts,
|
|
1403
|
-
resolveCredentials
|
|
1404
|
-
});
|
|
1405
|
-
case "CSAS":
|
|
1406
|
-
return new CSASConnector({
|
|
1407
|
-
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
1408
|
-
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
1409
|
-
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
1410
|
-
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
1411
|
-
})).data?.secretValue || "",
|
|
1412
|
-
REDIRECT_URI: env.REDIRECT_URI,
|
|
1413
|
-
connectedAccounts,
|
|
1414
|
-
resolveCredentials
|
|
1415
|
-
});
|
|
1416
|
-
case "KB":
|
|
1417
|
-
return new KBConnector({
|
|
1418
|
-
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
1419
|
-
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
1420
|
-
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
1421
|
-
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
1422
|
-
})).data?.secretValue || "",
|
|
1423
|
-
REDIRECT_URI: env.REDIRECT_URI,
|
|
1424
|
-
connectedAccounts,
|
|
1425
|
-
resolveCredentials
|
|
1426
|
-
});
|
|
1427
|
-
case "CSOB":
|
|
1428
|
-
return new CsobConnector({
|
|
1429
|
-
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
1430
|
-
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
1431
|
-
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
1432
|
-
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
1433
|
-
})).data?.secretValue || "",
|
|
1434
|
-
REDIRECT_URI: env.REDIRECT_URI,
|
|
1435
|
-
connectedAccounts,
|
|
1436
|
-
resolveCredentials
|
|
1437
|
-
});
|
|
1438
|
-
case "DBU":
|
|
1439
|
-
return new DbuConnector({
|
|
1440
|
-
BASE_URL: env.DBUCS_BASE_URI,
|
|
1441
|
-
USERNAME: env.DBUCS_USERNAME,
|
|
1442
|
-
APPLICATION_CODE: env.DBUCS_APPLICATION_CODE,
|
|
1443
|
-
KV: env.BANK_KV,
|
|
1444
|
-
API: env.DBU_CBS_BACKOFFICE_DEV,
|
|
1445
|
-
REDIRECT_URI: env.REDIRECT_URI,
|
|
1446
|
-
TX_AUTH_URI: env.DBUCS_TX_AUTH_URI,
|
|
1447
|
-
connectedAccounts
|
|
1448
|
-
});
|
|
1449
|
-
default:
|
|
1450
|
-
const mockConnector = new MockConnector();
|
|
1451
|
-
mockConnector.connectedAccounts = connectedAccounts;
|
|
1452
|
-
return mockConnector;
|
|
1453
|
-
}
|
|
1454
|
-
};
|
|
1455
|
-
function mod97(string) {
|
|
1456
|
-
let checksum = string.slice(0, 2);
|
|
1457
|
-
let fragment = "";
|
|
1458
|
-
for (let offset = 2; offset < string.length; offset += 7) {
|
|
1459
|
-
fragment = checksum + string.substring(offset, offset + 7);
|
|
1460
|
-
checksum = (parseInt(fragment, 10) % 97).toString();
|
|
1461
|
-
}
|
|
1462
|
-
return parseInt(checksum, 10);
|
|
1463
|
-
}
|
|
1464
|
-
const parseCzechIban = (iban) => {
|
|
1465
|
-
const stripped = iban.replace(/\s/g, "").toUpperCase();
|
|
1466
|
-
if (!stripped.startsWith("CZ") || stripped.length !== 24) {
|
|
1467
|
-
throw new Error(`Invalid Czech IBAN: ${iban}`);
|
|
1468
|
-
}
|
|
1469
|
-
const bankCode = stripped.slice(4, 8);
|
|
1470
|
-
const prefix = stripped.slice(8, 14).replace(/^0+/, "");
|
|
1471
|
-
const main = stripped.slice(14, 24).replace(/^0+/, "");
|
|
1472
|
-
const accountNumber = prefix ? `${prefix}-${main}` : main;
|
|
1473
|
-
return { bankCode, accountNumber };
|
|
1474
|
-
};
|
|
1475
|
-
const calculateCzechIban = (accountNumber, bankCode) => {
|
|
1476
|
-
const paddedBankCode = bankCode.padStart(4, "0");
|
|
1477
|
-
let prefix = "";
|
|
1478
|
-
let mainAccount = accountNumber;
|
|
1479
|
-
if (accountNumber.includes("-")) {
|
|
1480
|
-
const parts = accountNumber.split("-");
|
|
1481
|
-
if (parts.length !== 2) {
|
|
1482
|
-
throw new Error(
|
|
1483
|
-
`Invalid account number format: expected "prefix-main" or "main", got "${accountNumber}"`
|
|
1484
|
-
);
|
|
1485
|
-
}
|
|
1486
|
-
prefix = parts[0];
|
|
1487
|
-
mainAccount = parts[1];
|
|
1488
|
-
}
|
|
1489
|
-
const paddedPrefix = prefix.padStart(6, "0");
|
|
1490
|
-
const paddedAccount = mainAccount.padStart(10, "0");
|
|
1491
|
-
const basicIban = paddedBankCode + paddedPrefix + paddedAccount;
|
|
1492
|
-
const rearranged = basicIban + "123500";
|
|
1493
|
-
const remainder = mod97(rearranged);
|
|
1494
|
-
const checkDigits = (98 - remainder).toString().padStart(2, "0");
|
|
1495
|
-
return `CZ${checkDigits}${basicIban}`;
|
|
1496
|
-
};
|
|
1497
|
-
|
|
1498
1240
|
const dbuAccountConfigSchema = z.object({
|
|
1499
1241
|
with4EyeApproval: z.enum(["Y", "N"]).default("Y"),
|
|
1500
1242
|
realizeImmediate: z.enum(["Y", "N"]).default("Y"),
|
|
@@ -2402,10 +2144,19 @@ class ErsteConnector extends IBankConnector {
|
|
|
2402
2144
|
async getPaymentStatus(_) {
|
|
2403
2145
|
throw new Error("Erste connector: getPaymentStatus not implemented");
|
|
2404
2146
|
}
|
|
2405
|
-
parseAuthorizationCallback(_callbackUrl) {
|
|
2406
|
-
throw new Error(
|
|
2407
|
-
"Erste connector: parseAuthorizationCallback not implemented"
|
|
2408
|
-
);
|
|
2147
|
+
parseAuthorizationCallback(_callbackUrl) {
|
|
2148
|
+
throw new Error(
|
|
2149
|
+
"Erste connector: parseAuthorizationCallback not implemented"
|
|
2150
|
+
);
|
|
2151
|
+
}
|
|
2152
|
+
}
|
|
2153
|
+
|
|
2154
|
+
class KBConnector extends FinbricksConnector {
|
|
2155
|
+
constructor(config) {
|
|
2156
|
+
super("KB", config);
|
|
2157
|
+
}
|
|
2158
|
+
supportsBatch(paymentType) {
|
|
2159
|
+
return paymentType === "DOMESTIC";
|
|
2409
2160
|
}
|
|
2410
2161
|
}
|
|
2411
2162
|
|
|
@@ -2516,4 +2267,253 @@ const ottInsertSchema = createInsertSchema(ott);
|
|
|
2516
2267
|
const ottUpdateSchema = createUpdateSchema(ott);
|
|
2517
2268
|
const ottSelectSchema = createSelectSchema(ott);
|
|
2518
2269
|
|
|
2519
|
-
|
|
2270
|
+
class AirBankConnector extends FinbricksConnector {
|
|
2271
|
+
constructor(config) {
|
|
2272
|
+
super("AIRBANK", config);
|
|
2273
|
+
}
|
|
2274
|
+
supportsBatch() {
|
|
2275
|
+
return false;
|
|
2276
|
+
}
|
|
2277
|
+
}
|
|
2278
|
+
|
|
2279
|
+
class CreditasConnector extends FinbricksConnector {
|
|
2280
|
+
constructor(config) {
|
|
2281
|
+
super("CREDITAS", config);
|
|
2282
|
+
}
|
|
2283
|
+
/**
|
|
2284
|
+
* Creditas bank doesn't support batch payments at all.
|
|
2285
|
+
*/
|
|
2286
|
+
supportsBatch() {
|
|
2287
|
+
return false;
|
|
2288
|
+
}
|
|
2289
|
+
}
|
|
2290
|
+
|
|
2291
|
+
class CSASConnector extends FinbricksConnector {
|
|
2292
|
+
constructor(config) {
|
|
2293
|
+
super("CSAS", config);
|
|
2294
|
+
}
|
|
2295
|
+
supportsBatch(paymentType) {
|
|
2296
|
+
return paymentType === "DOMESTIC";
|
|
2297
|
+
}
|
|
2298
|
+
}
|
|
2299
|
+
|
|
2300
|
+
class FioConnector extends FinbricksConnector {
|
|
2301
|
+
constructor(config) {
|
|
2302
|
+
super("FIO", config);
|
|
2303
|
+
}
|
|
2304
|
+
/**
|
|
2305
|
+
* FIO supports batch only for DOMESTIC (CZK) payments.
|
|
2306
|
+
* SEPA and SWIFT batch support is planned by Finbricks.
|
|
2307
|
+
*/
|
|
2308
|
+
supportsBatch(paymentType) {
|
|
2309
|
+
return paymentType === "DOMESTIC";
|
|
2310
|
+
}
|
|
2311
|
+
}
|
|
2312
|
+
|
|
2313
|
+
class MonetaConnector extends FinbricksConnector {
|
|
2314
|
+
constructor(config) {
|
|
2315
|
+
super("MONETA", config);
|
|
2316
|
+
}
|
|
2317
|
+
/**
|
|
2318
|
+
* MONETA supports batch only for DOMESTIC (CZK) payments.
|
|
2319
|
+
* SEPA and SWIFT batch support is planned by Finbricks.
|
|
2320
|
+
*/
|
|
2321
|
+
supportsBatch(paymentType) {
|
|
2322
|
+
return paymentType === "DOMESTIC";
|
|
2323
|
+
}
|
|
2324
|
+
/**
|
|
2325
|
+
* MONETA rejects all special characters in endToEndIdentification.
|
|
2326
|
+
* Boundaries between segments are unambiguous without a separator —
|
|
2327
|
+
* `VS`/`SS`/`KS` prefixes are alphabetic and values are always numeric,
|
|
2328
|
+
* so the parsing regex `VS[:\s]*(\d+)` extracts each value correctly.
|
|
2329
|
+
*
|
|
2330
|
+
* Format: `VS1234SS5678KS0308` (max 30 chars).
|
|
2331
|
+
* Confirmed by Finbricks support (2026-04-23).
|
|
2332
|
+
*/
|
|
2333
|
+
buildEndToEndId(payment) {
|
|
2334
|
+
return buildEndToEndId(payment, { separator: "" });
|
|
2335
|
+
}
|
|
2336
|
+
}
|
|
2337
|
+
|
|
2338
|
+
const isDeposit = (payment, creditorIban) => {
|
|
2339
|
+
return payment.creditor.iban === creditorIban;
|
|
2340
|
+
};
|
|
2341
|
+
const getPaymentDirection = (payment, iban) => {
|
|
2342
|
+
if (isDeposit(payment, iban)) return "INCOMING";
|
|
2343
|
+
return "OUTGOING";
|
|
2344
|
+
};
|
|
2345
|
+
|
|
2346
|
+
const initiateConnector = async ({
|
|
2347
|
+
bank,
|
|
2348
|
+
env,
|
|
2349
|
+
connectedAccounts,
|
|
2350
|
+
resolveCredentials
|
|
2351
|
+
}) => {
|
|
2352
|
+
switch (bank) {
|
|
2353
|
+
case "ERSTE":
|
|
2354
|
+
return new ErsteConnector({
|
|
2355
|
+
API_KEY: (await env.SECRETS_STORE.get({
|
|
2356
|
+
secretName: "BANK_SERVICE_ERSTE_API_KEY"
|
|
2357
|
+
})).data?.secretValue || "",
|
|
2358
|
+
CLIENT_ID: (await env.SECRETS_STORE.get({
|
|
2359
|
+
secretName: "BANK_SERVICE_ERSTE_CLIENT_ID"
|
|
2360
|
+
})).data?.secretValue || "",
|
|
2361
|
+
CLIENT_SECRET: (await env.SECRETS_STORE.get({
|
|
2362
|
+
secretName: "BANK_SERVICE_ERSTE_CLIENT_SECRET"
|
|
2363
|
+
})).data?.secretValue || "",
|
|
2364
|
+
REDIRECT_URI: env.REDIRECT_URI,
|
|
2365
|
+
AUTH_URI: env.ERSTE_AUTH_URI,
|
|
2366
|
+
PAYMENTS_URI: env.ERSTE_PAYMENTS_URI,
|
|
2367
|
+
ACCOUNTS_URI: env.ERSTE_ACCOUNTS_URI,
|
|
2368
|
+
connectedAccounts,
|
|
2369
|
+
resolveCredentials
|
|
2370
|
+
});
|
|
2371
|
+
case "CREDITAS":
|
|
2372
|
+
return new CreditasConnector({
|
|
2373
|
+
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
2374
|
+
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
2375
|
+
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
2376
|
+
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
2377
|
+
})).data?.secretValue || "",
|
|
2378
|
+
REDIRECT_URI: env.REDIRECT_URI,
|
|
2379
|
+
connectedAccounts,
|
|
2380
|
+
resolveCredentials
|
|
2381
|
+
});
|
|
2382
|
+
case "MOCK_COBS":
|
|
2383
|
+
return new MockCobsConnector({
|
|
2384
|
+
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
2385
|
+
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
2386
|
+
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
2387
|
+
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
2388
|
+
})).data?.secretValue || "",
|
|
2389
|
+
REDIRECT_URI: env.REDIRECT_URI,
|
|
2390
|
+
connectedAccounts,
|
|
2391
|
+
resolveCredentials
|
|
2392
|
+
});
|
|
2393
|
+
case "FIO":
|
|
2394
|
+
return new FioConnector({
|
|
2395
|
+
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
2396
|
+
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
2397
|
+
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
2398
|
+
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
2399
|
+
})).data?.secretValue || "",
|
|
2400
|
+
REDIRECT_URI: env.REDIRECT_URI,
|
|
2401
|
+
connectedAccounts,
|
|
2402
|
+
resolveCredentials
|
|
2403
|
+
});
|
|
2404
|
+
case "MONETA":
|
|
2405
|
+
return new MonetaConnector({
|
|
2406
|
+
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
2407
|
+
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
2408
|
+
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
2409
|
+
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
2410
|
+
})).data?.secretValue || "",
|
|
2411
|
+
REDIRECT_URI: env.REDIRECT_URI,
|
|
2412
|
+
connectedAccounts,
|
|
2413
|
+
resolveCredentials
|
|
2414
|
+
});
|
|
2415
|
+
case "AIRBANK":
|
|
2416
|
+
return new AirBankConnector({
|
|
2417
|
+
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
2418
|
+
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
2419
|
+
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
2420
|
+
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
2421
|
+
})).data?.secretValue || "",
|
|
2422
|
+
REDIRECT_URI: env.REDIRECT_URI,
|
|
2423
|
+
connectedAccounts,
|
|
2424
|
+
resolveCredentials
|
|
2425
|
+
});
|
|
2426
|
+
case "CSAS":
|
|
2427
|
+
return new CSASConnector({
|
|
2428
|
+
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
2429
|
+
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
2430
|
+
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
2431
|
+
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
2432
|
+
})).data?.secretValue || "",
|
|
2433
|
+
REDIRECT_URI: env.REDIRECT_URI,
|
|
2434
|
+
connectedAccounts,
|
|
2435
|
+
resolveCredentials
|
|
2436
|
+
});
|
|
2437
|
+
case "KB":
|
|
2438
|
+
return new KBConnector({
|
|
2439
|
+
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
2440
|
+
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
2441
|
+
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
2442
|
+
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
2443
|
+
})).data?.secretValue || "",
|
|
2444
|
+
REDIRECT_URI: env.REDIRECT_URI,
|
|
2445
|
+
connectedAccounts,
|
|
2446
|
+
resolveCredentials
|
|
2447
|
+
});
|
|
2448
|
+
case "CSOB":
|
|
2449
|
+
return new CsobConnector({
|
|
2450
|
+
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
2451
|
+
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
2452
|
+
PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
|
|
2453
|
+
secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
|
|
2454
|
+
})).data?.secretValue || "",
|
|
2455
|
+
REDIRECT_URI: env.REDIRECT_URI,
|
|
2456
|
+
connectedAccounts,
|
|
2457
|
+
resolveCredentials
|
|
2458
|
+
});
|
|
2459
|
+
case "DBU":
|
|
2460
|
+
return new DbuConnector({
|
|
2461
|
+
BASE_URL: env.DBUCS_BASE_URI,
|
|
2462
|
+
USERNAME: env.DBUCS_USERNAME,
|
|
2463
|
+
APPLICATION_CODE: env.DBUCS_APPLICATION_CODE,
|
|
2464
|
+
KV: env.BANK_KV,
|
|
2465
|
+
API: env.DBU_CBS_BACKOFFICE_DEV,
|
|
2466
|
+
REDIRECT_URI: env.REDIRECT_URI,
|
|
2467
|
+
TX_AUTH_URI: env.DBUCS_TX_AUTH_URI,
|
|
2468
|
+
connectedAccounts
|
|
2469
|
+
});
|
|
2470
|
+
default:
|
|
2471
|
+
const mockConnector = new MockConnector();
|
|
2472
|
+
mockConnector.connectedAccounts = connectedAccounts;
|
|
2473
|
+
return mockConnector;
|
|
2474
|
+
}
|
|
2475
|
+
};
|
|
2476
|
+
function mod97(string) {
|
|
2477
|
+
let checksum = string.slice(0, 2);
|
|
2478
|
+
let fragment = "";
|
|
2479
|
+
for (let offset = 2; offset < string.length; offset += 7) {
|
|
2480
|
+
fragment = checksum + string.substring(offset, offset + 7);
|
|
2481
|
+
checksum = (parseInt(fragment, 10) % 97).toString();
|
|
2482
|
+
}
|
|
2483
|
+
return parseInt(checksum, 10);
|
|
2484
|
+
}
|
|
2485
|
+
const parseCzechIban = (iban) => {
|
|
2486
|
+
const stripped = iban.replace(/\s/g, "").toUpperCase();
|
|
2487
|
+
if (!stripped.startsWith("CZ") || stripped.length !== 24) {
|
|
2488
|
+
throw new Error(`Invalid Czech IBAN: ${iban}`);
|
|
2489
|
+
}
|
|
2490
|
+
const bankCode = stripped.slice(4, 8);
|
|
2491
|
+
const prefix = stripped.slice(8, 14).replace(/^0+/, "");
|
|
2492
|
+
const main = stripped.slice(14, 24).replace(/^0+/, "");
|
|
2493
|
+
const accountNumber = prefix ? `${prefix}-${main}` : main;
|
|
2494
|
+
return { bankCode, accountNumber };
|
|
2495
|
+
};
|
|
2496
|
+
const calculateCzechIban = (accountNumber, bankCode) => {
|
|
2497
|
+
const paddedBankCode = bankCode.padStart(4, "0");
|
|
2498
|
+
let prefix = "";
|
|
2499
|
+
let mainAccount = accountNumber;
|
|
2500
|
+
if (accountNumber.includes("-")) {
|
|
2501
|
+
const parts = accountNumber.split("-");
|
|
2502
|
+
if (parts.length !== 2) {
|
|
2503
|
+
throw new Error(
|
|
2504
|
+
`Invalid account number format: expected "prefix-main" or "main", got "${accountNumber}"`
|
|
2505
|
+
);
|
|
2506
|
+
}
|
|
2507
|
+
prefix = parts[0];
|
|
2508
|
+
mainAccount = parts[1];
|
|
2509
|
+
}
|
|
2510
|
+
const paddedPrefix = prefix.padStart(6, "0");
|
|
2511
|
+
const paddedAccount = mainAccount.padStart(10, "0");
|
|
2512
|
+
const basicIban = paddedBankCode + paddedPrefix + paddedAccount;
|
|
2513
|
+
const rearranged = basicIban + "123500";
|
|
2514
|
+
const remainder = mod97(rearranged);
|
|
2515
|
+
const checkDigits = (98 - remainder).toString().padStart(2, "0");
|
|
2516
|
+
return `CZ${checkDigits}${basicIban}`;
|
|
2517
|
+
};
|
|
2518
|
+
|
|
2519
|
+
export { useFinbricksFetch as A, BASE_TERMINAL_STATUSES as B, CsobConnector as C, DbuConnector as D, ErsteConnector as E, FINBRICKS_ENDPOINTS as F, tables as G, relations as H, IBankConnector as I, initiateConnector as J, KBConnector as K, getNonTerminalPaymentRequestsQuery as L, MockCobsConnector as M, calculateCzechIban as N, FinbricksClient as a, FinbricksConnector as b, MockConnector as c, accountCredentialsInsertSchema as d, accountCredentialsSelectSchema as e, accountCredentialsUpdateSchema as f, accountInsertSchema as g, accountSelectSchema as h, accountUpdateSchema as i, assignAccount as j, dbuAccountConfigSchema as k, hasPaymentAccountAssigned as l, isPaymentCompleted as m, isPendingStatus as n, isProcessedStatus as o, isTerminalStatus as p, ottInsertSchema as q, ottSelectSchema as r, ottUpdateSchema as s, signFinbricksJws as t, toBatchedPayment as u, toBatchedPaymentFromPaymentRequest as v, toCompletedPayment as w, toIncomingPayment as x, toPaymentRequestInsert as y, toPreparedPayment as z };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
const drizzleOrm = require('drizzle-orm');
|
|
4
|
-
const
|
|
4
|
+
const bank = require('./bank.CjEKRnVl.cjs');
|
|
5
5
|
const backendSdk = require('@develit-io/backend-sdk');
|
|
6
6
|
require('./bank.9Yw4KHyl.cjs');
|
|
7
7
|
require('date-fns');
|
|
@@ -11,16 +11,16 @@ const node_crypto = require('node:crypto');
|
|
|
11
11
|
|
|
12
12
|
const createPaymentCommand = (db, { payment }) => {
|
|
13
13
|
return {
|
|
14
|
-
command: db.insert(
|
|
14
|
+
command: db.insert(bank.tables.payment).values({
|
|
15
15
|
...payment,
|
|
16
16
|
creditorIban: payment.creditor.iban,
|
|
17
17
|
debtorIban: payment.debtor.iban
|
|
18
18
|
}).onConflictDoUpdate({
|
|
19
19
|
// Unique index: (connector_key, account_id, bank_ref_id)
|
|
20
20
|
target: [
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
bank.tables.payment.connectorKey,
|
|
22
|
+
bank.tables.payment.accountId,
|
|
23
|
+
bank.tables.payment.bankRefId
|
|
24
24
|
],
|
|
25
25
|
set: {
|
|
26
26
|
status: drizzleOrm.sql`excluded.status`,
|
|
@@ -38,11 +38,11 @@ const createPaymentCommand = (db, { payment }) => {
|
|
|
38
38
|
|
|
39
39
|
const upsertBatchCommand = (db, { batch }) => {
|
|
40
40
|
const id = batch.id || backendSdk.uuidv4();
|
|
41
|
-
const command = db.insert(
|
|
41
|
+
const command = db.insert(bank.tables.batch).values({
|
|
42
42
|
...batch,
|
|
43
43
|
id
|
|
44
44
|
}).onConflictDoUpdate({
|
|
45
|
-
target:
|
|
45
|
+
target: bank.tables.batch.id,
|
|
46
46
|
set: {
|
|
47
47
|
...batch
|
|
48
48
|
}
|
|
@@ -56,25 +56,25 @@ const upsertBatchCommand = (db, { batch }) => {
|
|
|
56
56
|
const updatePaymentRequestStatusCommand = (db, values) => {
|
|
57
57
|
const { id, ...set } = values;
|
|
58
58
|
return {
|
|
59
|
-
command: db.update(
|
|
59
|
+
command: db.update(bank.tables.paymentRequest).set(set).where(
|
|
60
60
|
drizzleOrm.and(
|
|
61
|
-
drizzleOrm.eq(
|
|
62
|
-
drizzleOrm.isNull(
|
|
61
|
+
drizzleOrm.eq(bank.tables.paymentRequest.id, id),
|
|
62
|
+
drizzleOrm.isNull(bank.tables.paymentRequest.deletedAt)
|
|
63
63
|
)
|
|
64
64
|
).returning()
|
|
65
65
|
};
|
|
66
66
|
};
|
|
67
67
|
|
|
68
68
|
const getAccountByIdQuery = async (db, { accountId }) => {
|
|
69
|
-
return await db.select().from(
|
|
69
|
+
return await db.select().from(bank.tables.account).where(drizzleOrm.eq(bank.tables.account.id, accountId)).get();
|
|
70
70
|
};
|
|
71
71
|
|
|
72
72
|
const getBatchByIdQuery = async (db, { batchId }) => {
|
|
73
|
-
return await db.select().from(
|
|
73
|
+
return await db.select().from(bank.tables.batch).where(drizzleOrm.eq(bank.tables.batch.id, batchId)).get();
|
|
74
74
|
};
|
|
75
75
|
|
|
76
76
|
const getCredentialsByAccountId = async (db, encryptionKey, { accountId }) => {
|
|
77
|
-
const cred = await db.select().from(
|
|
77
|
+
const cred = await db.select().from(bank.tables.accountCredentials).where(drizzleOrm.eq(bank.tables.accountCredentials.accountId, accountId)).get();
|
|
78
78
|
return cred ? {
|
|
79
79
|
...cred,
|
|
80
80
|
value: await decrypt(cred.value, encryptionKey)
|
|
@@ -82,10 +82,10 @@ const getCredentialsByAccountId = async (db, encryptionKey, { accountId }) => {
|
|
|
82
82
|
};
|
|
83
83
|
|
|
84
84
|
const getPaymentRequestsByBatchIdQuery = async (db, { batchId }) => {
|
|
85
|
-
return await db.select().from(
|
|
85
|
+
return await db.select().from(bank.tables.paymentRequest).where(
|
|
86
86
|
drizzleOrm.and(
|
|
87
|
-
drizzleOrm.eq(
|
|
88
|
-
drizzleOrm.isNull(
|
|
87
|
+
drizzleOrm.eq(bank.tables.paymentRequest.batchId, batchId),
|
|
88
|
+
drizzleOrm.isNull(bank.tables.paymentRequest.deletedAt)
|
|
89
89
|
)
|
|
90
90
|
);
|
|
91
91
|
};
|
|
@@ -2144,7 +2144,7 @@ declare const batch: drizzle_orm_sqlite_core.SQLiteTableWithColumns<{
|
|
|
2144
2144
|
name: string;
|
|
2145
2145
|
tableName: "batch";
|
|
2146
2146
|
dataType: "string enum";
|
|
2147
|
-
data: "AUTHORIZED" | "
|
|
2147
|
+
data: "AUTHORIZED" | "PROCESSING" | "READY_TO_SIGN" | "COMPLETED" | "FAILED";
|
|
2148
2148
|
driverParam: string;
|
|
2149
2149
|
notNull: false;
|
|
2150
2150
|
hasDefault: false;
|
|
@@ -2415,7 +2415,7 @@ declare const payment: drizzle_orm_sqlite_core.SQLiteTableWithColumns<{
|
|
|
2415
2415
|
name: string;
|
|
2416
2416
|
tableName: "payment";
|
|
2417
2417
|
dataType: "string enum";
|
|
2418
|
-
data: "
|
|
2418
|
+
data: "PROCESSING" | "PENDING" | "BOOKED" | "CANCELLED" | "REJECTED" | "SCHEDULED" | "HOLD" | "INFO";
|
|
2419
2419
|
driverParam: string;
|
|
2420
2420
|
notNull: true;
|
|
2421
2421
|
hasDefault: false;
|
|
@@ -2814,7 +2814,7 @@ declare const paymentRequest: drizzle_orm_sqlite_core.SQLiteTableWithColumns<{
|
|
|
2814
2814
|
name: string;
|
|
2815
2815
|
tableName: "payment_request";
|
|
2816
2816
|
dataType: "string enum";
|
|
2817
|
-
data: "
|
|
2817
|
+
data: "AUTHORIZED" | "COMPLETED" | "BOOKED" | "REJECTED" | "OPENED" | "SETTLED" | "CLOSED";
|
|
2818
2818
|
driverParam: string;
|
|
2819
2819
|
notNull: true;
|
|
2820
2820
|
hasDefault: false;
|
|
@@ -2144,7 +2144,7 @@ declare const batch: drizzle_orm_sqlite_core.SQLiteTableWithColumns<{
|
|
|
2144
2144
|
name: string;
|
|
2145
2145
|
tableName: "batch";
|
|
2146
2146
|
dataType: "string enum";
|
|
2147
|
-
data: "AUTHORIZED" | "
|
|
2147
|
+
data: "AUTHORIZED" | "PROCESSING" | "READY_TO_SIGN" | "COMPLETED" | "FAILED";
|
|
2148
2148
|
driverParam: string;
|
|
2149
2149
|
notNull: false;
|
|
2150
2150
|
hasDefault: false;
|
|
@@ -2415,7 +2415,7 @@ declare const payment: drizzle_orm_sqlite_core.SQLiteTableWithColumns<{
|
|
|
2415
2415
|
name: string;
|
|
2416
2416
|
tableName: "payment";
|
|
2417
2417
|
dataType: "string enum";
|
|
2418
|
-
data: "
|
|
2418
|
+
data: "PROCESSING" | "PENDING" | "BOOKED" | "CANCELLED" | "REJECTED" | "SCHEDULED" | "HOLD" | "INFO";
|
|
2419
2419
|
driverParam: string;
|
|
2420
2420
|
notNull: true;
|
|
2421
2421
|
hasDefault: false;
|
|
@@ -2814,7 +2814,7 @@ declare const paymentRequest: drizzle_orm_sqlite_core.SQLiteTableWithColumns<{
|
|
|
2814
2814
|
name: string;
|
|
2815
2815
|
tableName: "payment_request";
|
|
2816
2816
|
dataType: "string enum";
|
|
2817
|
-
data: "
|
|
2817
|
+
data: "AUTHORIZED" | "COMPLETED" | "BOOKED" | "REJECTED" | "OPENED" | "SETTLED" | "CLOSED";
|
|
2818
2818
|
driverParam: string;
|
|
2819
2819
|
notNull: true;
|
|
2820
2820
|
hasDefault: false;
|