@develit-services/bank 5.0.1 → 5.2.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.
@@ -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"),
@@ -1541,80 +1283,119 @@ class DbuConnector extends IBankConnector {
1541
1283
  }
1542
1284
  async makeRequest(endpoint, requestId, options = {}) {
1543
1285
  const { method = "GET", headers = {}, query = {}, body } = options;
1544
- if (method === "POST" && !this.allowedPostEndpoints.includes(endpoint)) {
1545
- throw createInternalError(null, {
1546
- message: `DBU API endpoint ${endpoint} does not support POST method`,
1547
- code: "DBU_INVALID_METHOD"
1286
+ let url;
1287
+ let response;
1288
+ try {
1289
+ if (method === "POST" && !this.allowedPostEndpoints.includes(endpoint)) {
1290
+ throw createInternalError(null, {
1291
+ message: `DBU API endpoint ${endpoint} does not support POST method`,
1292
+ code: "DBU_INVALID_METHOD"
1293
+ });
1294
+ }
1295
+ const defaultHeaders = {
1296
+ "x-dcs-username": this.username,
1297
+ "x-dcs-session-id": `session-${this.sessionId}`,
1298
+ "x-dcs-request-id": `request-${requestId}`,
1299
+ "Content-Type": "application/json",
1300
+ ...headers
1301
+ };
1302
+ const baseUrl = this.baseUrl.endsWith("/") ? this.baseUrl.slice(0, -1) : this.baseUrl;
1303
+ const cleanEndpoint = endpoint.startsWith("/") ? endpoint.slice(1) : endpoint;
1304
+ url = new URL(`${baseUrl}/${cleanEndpoint}`);
1305
+ Object.entries(query).forEach(([key, value]) => {
1306
+ if (value !== void 0 && value !== null) {
1307
+ url.searchParams.append(key, value);
1308
+ }
1548
1309
  });
1549
- }
1550
- const defaultHeaders = {
1551
- "x-dcs-username": this.username,
1552
- "x-dcs-session-id": `session-${this.sessionId}`,
1553
- "x-dcs-request-id": `request-${requestId}`,
1554
- "Content-Type": "application/json",
1555
- ...headers
1556
- };
1557
- const baseUrl = this.baseUrl.endsWith("/") ? this.baseUrl.slice(0, -1) : this.baseUrl;
1558
- const cleanEndpoint = endpoint.startsWith("/") ? endpoint.slice(1) : endpoint;
1559
- const url = new URL(`${baseUrl}/${cleanEndpoint}`);
1560
- Object.entries(query).forEach(([key, value]) => {
1561
- if (value !== void 0 && value !== null) {
1562
- url.searchParams.append(key, value);
1310
+ const fetchOptions = {
1311
+ method,
1312
+ headers: defaultHeaders
1313
+ };
1314
+ if (body && method !== "GET") {
1315
+ fetchOptions.body = JSON.stringify(body);
1563
1316
  }
1564
- });
1565
- const fetchOptions = {
1566
- method,
1567
- headers: defaultHeaders
1568
- };
1569
- if (body && method !== "GET") {
1570
- fetchOptions.body = JSON.stringify(body);
1571
- }
1572
- console.log(
1573
- "[DBU] request",
1574
- JSON.stringify(
1575
- {
1576
- method,
1317
+ console.log(
1318
+ "[DBU] request",
1319
+ JSON.stringify(
1320
+ {
1321
+ method,
1322
+ url: url.toString(),
1323
+ requestId,
1324
+ headers: defaultHeaders,
1325
+ body: body ?? null
1326
+ },
1327
+ null,
1328
+ 2
1329
+ )
1330
+ );
1331
+ response = await this.api.fetch(url.toString(), fetchOptions);
1332
+ const responseText = await response.text().catch(() => "unable to read response");
1333
+ if (!response.ok) {
1334
+ let parsedBody = responseText;
1335
+ try {
1336
+ parsedBody = JSON.parse(responseText);
1337
+ } catch {
1338
+ }
1339
+ console.error("[DBU] error response", {
1340
+ status: response.status,
1341
+ statusText: response.statusText,
1577
1342
  url: url.toString(),
1578
1343
  requestId,
1579
- headers: defaultHeaders,
1580
- body: body ?? null
1581
- },
1582
- null,
1583
- 2
1584
- )
1585
- );
1586
- const response = await this.api.fetch(url.toString(), fetchOptions);
1587
- if (!response.ok) {
1588
- const errorBody = await response.text().catch(() => "unable to read body");
1589
- console.error("[DBU] error response", {
1590
- status: response.status,
1591
- statusText: response.statusText,
1592
- url: url.toString(),
1344
+ body: parsedBody
1345
+ });
1346
+ const errorMessage = typeof parsedBody === "string" ? parsedBody : JSON.stringify(parsedBody);
1347
+ throw createInternalError(
1348
+ new Error(`DBU API error: ${response.status}`),
1349
+ {
1350
+ message: `DBU request failed [${response.status}]: ${errorMessage}`
1351
+ }
1352
+ );
1353
+ }
1354
+ let data;
1355
+ try {
1356
+ data = JSON.parse(responseText);
1357
+ } catch (parseError) {
1358
+ console.error("[DBU] JSON parse error", {
1359
+ url: url.toString(),
1360
+ requestId,
1361
+ status: response.status,
1362
+ responseTextPreview: responseText.substring(0, 500),
1363
+ parseError: parseError instanceof Error ? parseError.message : String(parseError)
1364
+ });
1365
+ throw createInternalError(parseError, {
1366
+ message: "Failed to parse DBU response as JSON"
1367
+ });
1368
+ }
1369
+ console.log(
1370
+ "[DBU] response",
1371
+ JSON.stringify(
1372
+ {
1373
+ status: response.status,
1374
+ url: url.toString(),
1375
+ requestId,
1376
+ body: data
1377
+ },
1378
+ null,
1379
+ 2
1380
+ )
1381
+ );
1382
+ return data;
1383
+ } catch (error) {
1384
+ console.error("[DBU] makeRequest failed", {
1385
+ endpoint,
1593
1386
  requestId,
1594
- body: errorBody
1595
- });
1596
- throw createInternalError(
1597
- new Error(`DBU API error: ${response.status}`),
1598
- {
1599
- message: `DBU request failed [${response.status}]: ${errorBody}`
1387
+ method,
1388
+ url: url?.toString(),
1389
+ responseStatus: response?.status,
1390
+ responseStatusText: response?.statusText,
1391
+ error: {
1392
+ message: error instanceof Error ? error.message : String(error),
1393
+ name: error instanceof Error ? error.name : "Unknown",
1394
+ stack: error instanceof Error ? error.stack : void 0
1600
1395
  }
1601
- );
1396
+ });
1397
+ throw error;
1602
1398
  }
1603
- const data = await response.json();
1604
- console.log(
1605
- "[DBU] response",
1606
- JSON.stringify(
1607
- {
1608
- status: response.status,
1609
- url: url.toString(),
1610
- requestId,
1611
- body: data
1612
- },
1613
- null,
1614
- 2
1615
- )
1616
- );
1617
- return data;
1618
1399
  }
1619
1400
  mapDbuCurrencyCode(dbuCurrency) {
1620
1401
  const currency = dbuCurrency.toUpperCase();
@@ -2402,10 +2183,19 @@ class ErsteConnector extends IBankConnector {
2402
2183
  async getPaymentStatus(_) {
2403
2184
  throw new Error("Erste connector: getPaymentStatus not implemented");
2404
2185
  }
2405
- parseAuthorizationCallback(_callbackUrl) {
2406
- throw new Error(
2407
- "Erste connector: parseAuthorizationCallback not implemented"
2408
- );
2186
+ parseAuthorizationCallback(_callbackUrl) {
2187
+ throw new Error(
2188
+ "Erste connector: parseAuthorizationCallback not implemented"
2189
+ );
2190
+ }
2191
+ }
2192
+
2193
+ class KBConnector extends FinbricksConnector {
2194
+ constructor(config) {
2195
+ super("KB", config);
2196
+ }
2197
+ supportsBatch(paymentType) {
2198
+ return paymentType === "DOMESTIC";
2409
2199
  }
2410
2200
  }
2411
2201
 
@@ -2516,4 +2306,253 @@ const ottInsertSchema = createInsertSchema(ott);
2516
2306
  const ottUpdateSchema = createUpdateSchema(ott);
2517
2307
  const ottSelectSchema = createSelectSchema(ott);
2518
2308
 
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, 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 };
2309
+ class AirBankConnector extends FinbricksConnector {
2310
+ constructor(config) {
2311
+ super("AIRBANK", config);
2312
+ }
2313
+ supportsBatch() {
2314
+ return false;
2315
+ }
2316
+ }
2317
+
2318
+ class CreditasConnector extends FinbricksConnector {
2319
+ constructor(config) {
2320
+ super("CREDITAS", config);
2321
+ }
2322
+ /**
2323
+ * Creditas bank doesn't support batch payments at all.
2324
+ */
2325
+ supportsBatch() {
2326
+ return false;
2327
+ }
2328
+ }
2329
+
2330
+ class CSASConnector extends FinbricksConnector {
2331
+ constructor(config) {
2332
+ super("CSAS", config);
2333
+ }
2334
+ supportsBatch(paymentType) {
2335
+ return paymentType === "DOMESTIC";
2336
+ }
2337
+ }
2338
+
2339
+ class FioConnector extends FinbricksConnector {
2340
+ constructor(config) {
2341
+ super("FIO", config);
2342
+ }
2343
+ /**
2344
+ * FIO supports batch only for DOMESTIC (CZK) payments.
2345
+ * SEPA and SWIFT batch support is planned by Finbricks.
2346
+ */
2347
+ supportsBatch(paymentType) {
2348
+ return paymentType === "DOMESTIC";
2349
+ }
2350
+ }
2351
+
2352
+ class MonetaConnector extends FinbricksConnector {
2353
+ constructor(config) {
2354
+ super("MONETA", config);
2355
+ }
2356
+ /**
2357
+ * MONETA supports batch only for DOMESTIC (CZK) payments.
2358
+ * SEPA and SWIFT batch support is planned by Finbricks.
2359
+ */
2360
+ supportsBatch(paymentType) {
2361
+ return paymentType === "DOMESTIC";
2362
+ }
2363
+ /**
2364
+ * MONETA rejects all special characters in endToEndIdentification.
2365
+ * Boundaries between segments are unambiguous without a separator —
2366
+ * `VS`/`SS`/`KS` prefixes are alphabetic and values are always numeric,
2367
+ * so the parsing regex `VS[:\s]*(\d+)` extracts each value correctly.
2368
+ *
2369
+ * Format: `VS1234SS5678KS0308` (max 30 chars).
2370
+ * Confirmed by Finbricks support (2026-04-23).
2371
+ */
2372
+ buildEndToEndId(payment) {
2373
+ return buildEndToEndId(payment, { separator: "" });
2374
+ }
2375
+ }
2376
+
2377
+ const isDeposit = (payment, creditorIban) => {
2378
+ return payment.creditor.iban === creditorIban;
2379
+ };
2380
+ const getPaymentDirection = (payment, iban) => {
2381
+ if (isDeposit(payment, iban)) return "INCOMING";
2382
+ return "OUTGOING";
2383
+ };
2384
+
2385
+ const initiateConnector = async ({
2386
+ bank,
2387
+ env,
2388
+ connectedAccounts,
2389
+ resolveCredentials
2390
+ }) => {
2391
+ switch (bank) {
2392
+ case "ERSTE":
2393
+ return new ErsteConnector({
2394
+ API_KEY: (await env.SECRETS_STORE.get({
2395
+ secretName: "BANK_SERVICE_ERSTE_API_KEY"
2396
+ })).data?.secretValue || "",
2397
+ CLIENT_ID: (await env.SECRETS_STORE.get({
2398
+ secretName: "BANK_SERVICE_ERSTE_CLIENT_ID"
2399
+ })).data?.secretValue || "",
2400
+ CLIENT_SECRET: (await env.SECRETS_STORE.get({
2401
+ secretName: "BANK_SERVICE_ERSTE_CLIENT_SECRET"
2402
+ })).data?.secretValue || "",
2403
+ REDIRECT_URI: env.REDIRECT_URI,
2404
+ AUTH_URI: env.ERSTE_AUTH_URI,
2405
+ PAYMENTS_URI: env.ERSTE_PAYMENTS_URI,
2406
+ ACCOUNTS_URI: env.ERSTE_ACCOUNTS_URI,
2407
+ connectedAccounts,
2408
+ resolveCredentials
2409
+ });
2410
+ case "CREDITAS":
2411
+ return new CreditasConnector({
2412
+ BASE_URI: env.FINBRICKS_BASE_URI,
2413
+ MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
2414
+ PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
2415
+ secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
2416
+ })).data?.secretValue || "",
2417
+ REDIRECT_URI: env.REDIRECT_URI,
2418
+ connectedAccounts,
2419
+ resolveCredentials
2420
+ });
2421
+ case "MOCK_COBS":
2422
+ return new MockCobsConnector({
2423
+ BASE_URI: env.FINBRICKS_BASE_URI,
2424
+ MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
2425
+ PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
2426
+ secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
2427
+ })).data?.secretValue || "",
2428
+ REDIRECT_URI: env.REDIRECT_URI,
2429
+ connectedAccounts,
2430
+ resolveCredentials
2431
+ });
2432
+ case "FIO":
2433
+ return new FioConnector({
2434
+ BASE_URI: env.FINBRICKS_BASE_URI,
2435
+ MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
2436
+ PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
2437
+ secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
2438
+ })).data?.secretValue || "",
2439
+ REDIRECT_URI: env.REDIRECT_URI,
2440
+ connectedAccounts,
2441
+ resolveCredentials
2442
+ });
2443
+ case "MONETA":
2444
+ return new MonetaConnector({
2445
+ BASE_URI: env.FINBRICKS_BASE_URI,
2446
+ MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
2447
+ PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
2448
+ secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
2449
+ })).data?.secretValue || "",
2450
+ REDIRECT_URI: env.REDIRECT_URI,
2451
+ connectedAccounts,
2452
+ resolveCredentials
2453
+ });
2454
+ case "AIRBANK":
2455
+ return new AirBankConnector({
2456
+ BASE_URI: env.FINBRICKS_BASE_URI,
2457
+ MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
2458
+ PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
2459
+ secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
2460
+ })).data?.secretValue || "",
2461
+ REDIRECT_URI: env.REDIRECT_URI,
2462
+ connectedAccounts,
2463
+ resolveCredentials
2464
+ });
2465
+ case "CSAS":
2466
+ return new CSASConnector({
2467
+ BASE_URI: env.FINBRICKS_BASE_URI,
2468
+ MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
2469
+ PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
2470
+ secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
2471
+ })).data?.secretValue || "",
2472
+ REDIRECT_URI: env.REDIRECT_URI,
2473
+ connectedAccounts,
2474
+ resolveCredentials
2475
+ });
2476
+ case "KB":
2477
+ return new KBConnector({
2478
+ BASE_URI: env.FINBRICKS_BASE_URI,
2479
+ MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
2480
+ PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
2481
+ secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
2482
+ })).data?.secretValue || "",
2483
+ REDIRECT_URI: env.REDIRECT_URI,
2484
+ connectedAccounts,
2485
+ resolveCredentials
2486
+ });
2487
+ case "CSOB":
2488
+ return new CsobConnector({
2489
+ BASE_URI: env.FINBRICKS_BASE_URI,
2490
+ MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
2491
+ PRIVATE_KEY_PEM: (await env.SECRETS_STORE.get({
2492
+ secretName: "BANK_SERVICE_FINBRICKS_PRIVATE_KEY_PEM"
2493
+ })).data?.secretValue || "",
2494
+ REDIRECT_URI: env.REDIRECT_URI,
2495
+ connectedAccounts,
2496
+ resolveCredentials
2497
+ });
2498
+ case "DBU":
2499
+ return new DbuConnector({
2500
+ BASE_URL: env.DBUCS_BASE_URI,
2501
+ USERNAME: env.DBUCS_USERNAME,
2502
+ APPLICATION_CODE: env.DBUCS_APPLICATION_CODE,
2503
+ KV: env.BANK_KV,
2504
+ API: env.DBU_CBS_BACKOFFICE_DEV,
2505
+ REDIRECT_URI: env.REDIRECT_URI,
2506
+ TX_AUTH_URI: env.DBUCS_TX_AUTH_URI,
2507
+ connectedAccounts
2508
+ });
2509
+ default:
2510
+ const mockConnector = new MockConnector();
2511
+ mockConnector.connectedAccounts = connectedAccounts;
2512
+ return mockConnector;
2513
+ }
2514
+ };
2515
+ function mod97(string) {
2516
+ let checksum = string.slice(0, 2);
2517
+ let fragment = "";
2518
+ for (let offset = 2; offset < string.length; offset += 7) {
2519
+ fragment = checksum + string.substring(offset, offset + 7);
2520
+ checksum = (parseInt(fragment, 10) % 97).toString();
2521
+ }
2522
+ return parseInt(checksum, 10);
2523
+ }
2524
+ const parseCzechIban = (iban) => {
2525
+ const stripped = iban.replace(/\s/g, "").toUpperCase();
2526
+ if (!stripped.startsWith("CZ") || stripped.length !== 24) {
2527
+ throw new Error(`Invalid Czech IBAN: ${iban}`);
2528
+ }
2529
+ const bankCode = stripped.slice(4, 8);
2530
+ const prefix = stripped.slice(8, 14).replace(/^0+/, "");
2531
+ const main = stripped.slice(14, 24).replace(/^0+/, "");
2532
+ const accountNumber = prefix ? `${prefix}-${main}` : main;
2533
+ return { bankCode, accountNumber };
2534
+ };
2535
+ const calculateCzechIban = (accountNumber, bankCode) => {
2536
+ const paddedBankCode = bankCode.padStart(4, "0");
2537
+ let prefix = "";
2538
+ let mainAccount = accountNumber;
2539
+ if (accountNumber.includes("-")) {
2540
+ const parts = accountNumber.split("-");
2541
+ if (parts.length !== 2) {
2542
+ throw new Error(
2543
+ `Invalid account number format: expected "prefix-main" or "main", got "${accountNumber}"`
2544
+ );
2545
+ }
2546
+ prefix = parts[0];
2547
+ mainAccount = parts[1];
2548
+ }
2549
+ const paddedPrefix = prefix.padStart(6, "0");
2550
+ const paddedAccount = mainAccount.padStart(10, "0");
2551
+ const basicIban = paddedBankCode + paddedPrefix + paddedAccount;
2552
+ const rearranged = basicIban + "123500";
2553
+ const remainder = mod97(rearranged);
2554
+ const checkDigits = (98 - remainder).toString().padStart(2, "0");
2555
+ return `CZ${checkDigits}${basicIban}`;
2556
+ };
2557
+
2558
+ 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 };