@develit-services/bank 0.0.28 → 0.0.30

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.
Files changed (39) hide show
  1. package/dist/database/schema.cjs +10 -1
  2. package/dist/database/schema.d.cts +1 -1
  3. package/dist/database/schema.d.mts +1 -1
  4. package/dist/database/schema.d.ts +1 -1
  5. package/dist/database/schema.mjs +8 -1
  6. package/dist/export/worker.cjs +888 -575
  7. package/dist/export/worker.d.cts +210 -12
  8. package/dist/export/worker.d.mts +210 -12
  9. package/dist/export/worker.d.ts +210 -12
  10. package/dist/export/worker.mjs +859 -546
  11. package/dist/export/wrangler.cjs +1 -11
  12. package/dist/export/wrangler.d.cts +8 -9
  13. package/dist/export/wrangler.d.mts +8 -9
  14. package/dist/export/wrangler.d.ts +8 -9
  15. package/dist/export/wrangler.mjs +1 -11
  16. package/dist/shared/{bank.Cy_TcyKb.cjs → bank.BMRBXGF1.cjs} +347 -106
  17. package/dist/shared/{bank.CEZKAEiY.d.cts → bank.BchnXQDL.d.cts} +2 -2
  18. package/dist/shared/{bank.CEZKAEiY.d.mts → bank.BchnXQDL.d.mts} +2 -2
  19. package/dist/shared/{bank.CEZKAEiY.d.ts → bank.BchnXQDL.d.ts} +2 -2
  20. package/dist/shared/bank.CtUeOz8i.d.ts +1648 -0
  21. package/dist/shared/bank.D8o86NLF.d.mts +1648 -0
  22. package/dist/shared/bank.DUalSuEK.d.cts +1648 -0
  23. package/dist/shared/bank.DbNuuGvb.mjs +9 -0
  24. package/dist/shared/bank.DuY4d2y_.cjs +11 -0
  25. package/dist/shared/{bank.BuNG2S8h.d.cts → bank.Nf6oaNfB.d.cts} +547 -11
  26. package/dist/shared/{bank.BuNG2S8h.d.mts → bank.Nf6oaNfB.d.mts} +547 -11
  27. package/dist/shared/{bank.BuNG2S8h.d.ts → bank.Nf6oaNfB.d.ts} +547 -11
  28. package/dist/shared/{bank.DnDcNEvX.mjs → bank.YCUhOduX.mjs} +330 -107
  29. package/dist/types.cjs +32 -20
  30. package/dist/types.d.cts +496 -35
  31. package/dist/types.d.mts +496 -35
  32. package/dist/types.d.ts +496 -35
  33. package/dist/types.mjs +5 -4
  34. package/package.json +1 -1
  35. package/dist/shared/bank.BkLncGmL.d.ts +0 -122
  36. package/dist/shared/bank.C9jAvwna.mjs +0 -90
  37. package/dist/shared/bank.DWVLVMDa.d.mts +0 -122
  38. package/dist/shared/bank.DmypH3Au.d.cts +0 -122
  39. package/dist/shared/bank.P9gDUycr.cjs +0 -98
@@ -1,36 +1,15 @@
1
1
  'use strict';
2
2
 
3
3
  const backendSdk = require('@develit-io/backend-sdk');
4
- const database_schema = require('./bank.P9gDUycr.cjs');
5
4
  const drizzleOrm = require('drizzle-orm');
6
- const zod = require('zod');
7
5
  const generalCodes = require('@develit-io/general-codes');
6
+ const zod = require('zod');
8
7
  const jose = require('jose');
9
- require('superjson');
8
+ const drizzleZod = require('drizzle-zod');
9
+ const sqliteCore = require('drizzle-orm/sqlite-core');
10
10
  const dateFns = require('date-fns');
11
-
12
- const tables = database_schema.schema;
13
-
14
- const PAYMENT_TYPES = ["SEPA", "SWIFT", "IFSC", "DOMESTIC"];
15
- const PAYMENT_STATUSES = [
16
- "PREPARED",
17
- "INITIALIZED",
18
- "FAILED",
19
- "PENDING",
20
- "COMPLETED",
21
- "CREATED"
22
- ];
23
- const PAYMENT_DIRECTIONS = ["INCOMING", "OUTGOING"];
24
- const BATCH_STATUSES = [
25
- "OPEN",
26
- "WAITING_FOR_PROCESSING",
27
- "PROCESSING",
28
- "READY_TO_SIGN",
29
- "PREPARED",
30
- "COMPLETED",
31
- "FAILED"
32
- ];
33
- const COUNTRY_CODES = generalCodes.COUNTRY_CODES_2;
11
+ const relations = require('drizzle-orm/relations');
12
+ require('superjson');
34
13
 
35
14
  class IBankConnector {
36
15
  }
@@ -130,6 +109,7 @@ const FINBRICKS_ENDPOINTS = {
130
109
  ACCOUNT_TRANSACTIONS: "/account/transactions",
131
110
  TRANSACTION_INIT: "/transaction/platform/init",
132
111
  TRANSACTION_STATUS: "/transaction/platform/status",
112
+ TRANSACTION_SEPA_INIT: "/transaction/platform/sepa/init",
133
113
  TRANSACTION_BATCH_INIT: "/transaction/platform/batchPayment/init",
134
114
  BATCH_STATUS: "/transaction/platform/batchPayment/status"
135
115
  };
@@ -203,6 +183,7 @@ const mapFinbricksTransactionToPayment = (tx, account) => {
203
183
  const related = tx.entryDetails?.transactionDetails?.relatedParties;
204
184
  const base = {
205
185
  id: backendSdk.uuidv4(),
186
+ connectorKey: account.connectorKey,
206
187
  bankRefId: tx.entryReference || tx.fbxReference,
207
188
  amount: tx.amount?.value || 0,
208
189
  currency: tx.amount?.currency || "CZK",
@@ -215,49 +196,65 @@ const mapFinbricksTransactionToPayment = (tx, account) => {
215
196
  ),
216
197
  debtorHolderName: isIncoming ? related?.debtor?.name || "Unknown" : "Unknown",
217
198
  creditorHolderName: isIncoming ? "Unknown" : related?.creditor?.name || "Unknown",
218
- debtorIban: isIncoming ? related?.debtorAccount?.identification?.iban || account.identification.iban : account.identification.iban,
219
- creditorIban: isIncoming ? account.identification.iban : related?.creditorAccount?.identification?.iban || account.identification.iban,
199
+ debtorIban: isIncoming ? related.debtorAccount?.identification?.iban || account.iban : account.iban,
200
+ creditorIban: isIncoming ? account.iban : related.creditorAccount?.identification?.iban || account.iban,
220
201
  direction: "INCOMING"
221
202
  // přepíšeme správným směrem níže
222
203
  };
223
- base.direction = getPaymentDirection(base, account.identification.iban);
204
+ base.direction = getPaymentDirection(base, account.iban);
224
205
  return base;
225
206
  };
226
207
 
208
+ const mapFinbricksAccountInsert = ({
209
+ account,
210
+ connectorKey,
211
+ status
212
+ }) => ({
213
+ id: account.id,
214
+ connectorKey,
215
+ status,
216
+ sync: false,
217
+ currency: account.currency,
218
+ number: account.identification.accountNumber,
219
+ bankCode: account.servicer.bankCode,
220
+ // For now we are using CZE as fallback because finbricks does not provide country code 100% of the time
221
+ countryCode: account.servicer.countryCode || "CZE",
222
+ holderName: account.ownersNames.join(", "),
223
+ iban: account.identification.iban
224
+ });
225
+
227
226
  class FinbricksConnector extends IBankConnector {
228
227
  constructor(provider, {
229
228
  BASE_URI,
230
229
  MERCHANT_ID,
231
230
  PRIVATE_KEY_PEM,
232
231
  REDIRECT_URI,
233
- KV
232
+ connectedAccounts
234
233
  }) {
235
234
  super();
236
235
  this.connectorKey = "FINBRICKS";
237
- this._clientIds = {};
236
+ this.connectedAccounts = [];
238
237
  this.PROVIDER = provider;
239
- this.kv = KV;
240
238
  this.finbricks = new FinbricksClient(
241
239
  BASE_URI,
242
240
  MERCHANT_ID,
243
241
  PRIVATE_KEY_PEM,
244
242
  REDIRECT_URI
245
243
  );
244
+ this.connectedAccounts = connectedAccounts;
246
245
  }
247
246
  static {
248
247
  this.FETCH_INTERVAL = 60 * 60 * 5;
249
248
  }
250
- async getAuthUri({
251
- accountId,
252
- ott
253
- }) {
249
+ async getAuthUri({ ott }) {
254
250
  const clientId = backendSdk.uuidv4();
255
251
  const body = {
256
252
  merchantId: this.finbricks.MERCHANT_ID,
257
253
  clientId,
258
254
  paymentProvider: this.PROVIDER,
259
255
  scope: "AISP_PISP",
260
- callbackUrl: `${this.finbricks.REDIRECT_URI}?clientId=${clientId}&accountId=${accountId}&ott=${ott}`
256
+ // finbricks automatically adds the clientId to the callbackUrl
257
+ callbackUrl: `${this.finbricks.REDIRECT_URI}?ott=${ott}`
261
258
  };
262
259
  const [response, error] = await backendSdk.useResult(
263
260
  this.finbricks.request({
@@ -273,35 +270,13 @@ class FinbricksConnector extends IBankConnector {
273
270
  }
274
271
  return response.redirectUrl;
275
272
  }
276
- get storageKey() {
277
- return `${this.connectorKey}:auth`;
278
- }
279
- async getClientIds() {
280
- let saved = await this.kv.get(this.storageKey);
281
- if (!saved) {
282
- const empty = Object.fromEntries(database_schema.CONNECTOR_KEYS.map((v) => [v, ""]));
283
- empty["FIO"] = "d32a83cf-d352-41f3-96d7-4d2961336ddc";
284
- await this.kv.put(this.storageKey, JSON.stringify(empty));
285
- saved = JSON.stringify(empty);
286
- }
287
- this._clientIds = JSON.parse(saved);
288
- return this._clientIds;
289
- }
290
- async setClientIds(value) {
291
- this._clientIds = value;
292
- void this.kv.put(this.storageKey, JSON.stringify(value));
293
- }
294
- async authorizeAccount({
295
- urlParams
296
- }) {
273
+ async authorizeAccount({ urlParams }) {
297
274
  const params = new URLSearchParams(urlParams);
298
275
  const clientId = params.get("clientId");
299
276
  if (!clientId)
300
277
  throw backendSdk.createInternalError(null, {
301
278
  message: "Finbricks: clientId is missing"
302
279
  });
303
- let savedClientIds = await this.getClientIds();
304
- await this.setClientIds({ ...savedClientIds, [this.PROVIDER]: clientId });
305
280
  const expired = await this.isClientIdExpired({ clientId });
306
281
  if (expired) {
307
282
  throw backendSdk.createInternalError(null, {
@@ -310,7 +285,34 @@ class FinbricksConnector extends IBankConnector {
310
285
  status: 401
311
286
  });
312
287
  }
313
- return true;
288
+ const accounts = await this.getAccountsForClient({ clientId });
289
+ console.log(accounts, "accs finbricks");
290
+ const credentials = accounts.map((acc) => ({
291
+ accountId: acc.id,
292
+ connectorKey: this.PROVIDER,
293
+ expiresAt: new Date(Date.now() + 36e5),
294
+ type: "CLIENT_ID",
295
+ value: clientId
296
+ }));
297
+ this.connectedAccounts.push(
298
+ ...accounts.map((acc) => ({
299
+ connectorKey: this.PROVIDER,
300
+ currency: acc.currency,
301
+ iban: acc.identification.iban,
302
+ id: acc.id,
303
+ token: clientId
304
+ }))
305
+ );
306
+ return {
307
+ credentials,
308
+ accounts: accounts.map(
309
+ (account) => mapFinbricksAccountInsert({
310
+ account,
311
+ connectorKey: this.PROVIDER,
312
+ status: "AUTHORIZED"
313
+ })
314
+ )
315
+ };
314
316
  }
315
317
  async authenticate(code) {
316
318
  return "";
@@ -358,13 +360,9 @@ class FinbricksConnector extends IBankConnector {
358
360
  const validTo = new Date(record.validTo);
359
361
  return validTo.getTime() < Date.now();
360
362
  }
361
- async listAccounts() {
362
- if (!this._clientIds) {
363
- throw backendSdk.createInternalError(null, {
364
- message: "Finbricks: missing valid clientId",
365
- code: "FINBRICKS_CLIENT_ID_MISSING"
366
- });
367
- }
363
+ async getAccountsForClient({
364
+ clientId
365
+ }) {
368
366
  const [response, error] = await backendSdk.useResult(
369
367
  this.finbricks.request({
370
368
  endpoint: FINBRICKS_ENDPOINTS.ACCOUNT_LIST,
@@ -372,17 +370,40 @@ class FinbricksConnector extends IBankConnector {
372
370
  query: {
373
371
  merchantId: this.finbricks.MERCHANT_ID,
374
372
  paymentProvider: this.PROVIDER,
375
- clientId: this._clientIds[this.PROVIDER]
373
+ clientId
376
374
  }
377
375
  })
378
376
  );
379
377
  if (error || !response) {
378
+ console.log(error, "err");
379
+ console.log(response, "res");
380
380
  throw backendSdk.createInternalError(error, {
381
381
  message: "Finbricks: failed to list accounts"
382
382
  });
383
383
  }
384
384
  return response.accounts;
385
385
  }
386
+ async listAccounts() {
387
+ const accounts = (await Promise.all(
388
+ this.connectedAccounts.map(
389
+ (acc) => this.getAccountsForClient({ clientId: acc.token })
390
+ )
391
+ )).flat();
392
+ const uniqueAccounts = Array.from(
393
+ new Map(accounts.map((acc) => [acc.identification.iban, acc])).values()
394
+ );
395
+ return uniqueAccounts.map((acc) => ({
396
+ connectorKey: this.connectorKey,
397
+ currency: acc.currency,
398
+ sync: false,
399
+ status: "AUTHORIZED",
400
+ countryCode: acc.servicer.countryCode,
401
+ bankCode: acc.servicer.bankCode,
402
+ number: acc.identification.accountNumber,
403
+ iban: acc.identification.iban,
404
+ holderName: acc.ownersNames.join(", ")
405
+ }));
406
+ }
386
407
  async preparePayment(payment) {
387
408
  const bankRefId = backendSdk.uuidv4();
388
409
  return {
@@ -399,6 +420,13 @@ class FinbricksConnector extends IBankConnector {
399
420
  payments
400
421
  }) {
401
422
  const batchId = backendSdk.uuidv4();
423
+ const authorizedClient = this.connectedAccounts.find(
424
+ (acc) => acc.iban === payments[0].debtorIban
425
+ );
426
+ if (!authorizedClient)
427
+ throw backendSdk.createInternalError(null, {
428
+ message: `Batch for unauthorized client with iban: ${payments[0].debtorIban}`
429
+ });
402
430
  const [response, error] = await backendSdk.useResult(
403
431
  this.finbricks.request({
404
432
  endpoint: FINBRICKS_ENDPOINTS.TRANSACTION_BATCH_INIT,
@@ -407,7 +435,7 @@ class FinbricksConnector extends IBankConnector {
407
435
  batchPaymentIdentification: {
408
436
  merchantId: this.finbricks.MERCHANT_ID,
409
437
  debtorAccountIban: payments[0].debtorIban,
410
- clientId: this._clientIds[this.PROVIDER],
438
+ clientId: authorizedClient.token,
411
439
  callbackUrl: "https://example.com/callback",
412
440
  merchantBatchId: batchId
413
441
  },
@@ -430,6 +458,47 @@ class FinbricksConnector extends IBankConnector {
430
458
  payments: payments.map((p) => ({ ...p, status: "INITIALIZED" }))
431
459
  };
432
460
  }
461
+ async initiateSEPAPayment(payment) {
462
+ const [response, error] = await backendSdk.useResult(
463
+ this.finbricks.request({
464
+ endpoint: FINBRICKS_ENDPOINTS.TRANSACTION_SEPA_INIT,
465
+ method: "POST",
466
+ body: {
467
+ merchantIdentification: {
468
+ merchantId: this.finbricks.MERCHANT_ID,
469
+ clientId: this.connectedAccounts.find(
470
+ (acc) => acc.iban === payment.debtorIban
471
+ ).token
472
+ },
473
+ paymentIdentification: {
474
+ merchantTransactionId: payment.bankRefId
475
+ },
476
+ amount: payment.amount,
477
+ debtor: {
478
+ debtorAccountIban: payment.debtorIban,
479
+ debtorName: payment.debtorHolderName || "Devizov\xE1 burza",
480
+ paymentProvider: this.PROVIDER
481
+ },
482
+ creditor: {
483
+ creditorAccountIban: payment.creditorIban,
484
+ creditorName: payment.creditorHolderName
485
+ },
486
+ callbackUrl: "https://www.example.com"
487
+ }
488
+ })
489
+ );
490
+ if (error || !response) {
491
+ console.log(error, "err");
492
+ console.log(response, "res");
493
+ throw backendSdk.createInternalError(error, {
494
+ message: "Finbricks: failed to initiate SEPA payment"
495
+ });
496
+ }
497
+ return {
498
+ authorizationUrl: response.redirectUrl,
499
+ payment: { ...payment, status: "INITIALIZED" }
500
+ };
501
+ }
433
502
  async initiateSinglePayment(payment) {
434
503
  const [response, error] = await backendSdk.useResult(
435
504
  this.finbricks.request({
@@ -442,14 +511,16 @@ class FinbricksConnector extends IBankConnector {
442
511
  debtorAccountIban: payment.debtorIban,
443
512
  creditorAccountIban: payment.creditorIban,
444
513
  creditorName: payment.creditorHolderName,
445
- description: payment.message || "",
446
- variableSymbol: payment.vs || "",
514
+ description: payment.message,
515
+ variableSymbol: payment.vs,
447
516
  callbackUrl: "https://example.com/callback",
448
517
  paymentProvider: this.PROVIDER
449
518
  }
450
519
  })
451
520
  );
452
521
  if (error || !response) {
522
+ console.log(error, "err");
523
+ console.log(response, "res");
453
524
  throw backendSdk.createInternalError(error, {
454
525
  message: "Finbricks: failed to initiate payment"
455
526
  });
@@ -475,11 +546,11 @@ class FinbricksConnector extends IBankConnector {
475
546
  endpoint: FINBRICKS_ENDPOINTS.ACCOUNT_TRANSACTIONS,
476
547
  query: {
477
548
  merchantId: this.finbricks.MERCHANT_ID,
478
- // TODO: Desperate times require desperate solution. Don't forget to remove this.
479
- clientId: "d32a83cf-d352-41f3-96d7-4d2961336ddc",
480
- // clientId: this._clientIds[this.PROVIDER],
549
+ clientId: this.connectedAccounts.find(
550
+ (acc) => acc.iban === account.iban
551
+ ).token,
481
552
  paymentProvider: this.PROVIDER,
482
- bankAccountId: account.identification.number,
553
+ bankAccountId: account.id,
483
554
  dateFrom,
484
555
  dateTo,
485
556
  currency: account.currency,
@@ -566,17 +637,17 @@ class ErsteConnector extends IBankConnector {
566
637
  this.AUTH_URI = config.AUTH_URI;
567
638
  this.PAYMENTS_URI = config.PAYMENTS_URI;
568
639
  this.ACCOUNTS_URI = config.ACCOUNTS_URI;
569
- this.kv = config.KV;
640
+ this.connectedAccounts = config.connectedAccounts;
641
+ }
642
+ initiateSEPAPayment(payment) {
643
+ throw new Error("Method not implemented.");
570
644
  }
571
645
  static {
572
646
  this.FETCH_INTERVAL = 60 * 60 * 5;
573
647
  }
574
- async getAuthUri({
575
- accountId,
576
- ott
577
- }) {
648
+ async getAuthUri({ ott }) {
578
649
  const params = new URLSearchParams({
579
- redirect_uri: `${this.REDIRECT_URI}?accountId=${accountId}&ott=${ott}`,
650
+ redirect_uri: `${this.REDIRECT_URI}?&ott=${ott}`,
580
651
  client_id: this.CLIENT_ID,
581
652
  response_type: "code",
582
653
  access_type: "offline",
@@ -585,17 +656,25 @@ class ErsteConnector extends IBankConnector {
585
656
  });
586
657
  return `${this.AUTH_URI}/auth?${params.toString()}`;
587
658
  }
588
- async authorizeAccount({
589
- urlParams
590
- }) {
659
+ async authorizeAccount({ urlParams }) {
591
660
  const params = new URLSearchParams(urlParams);
592
661
  const code = params.get("code");
593
662
  if (!code)
594
663
  throw backendSdk.createInternalError(null, {
595
664
  message: "Missing code in params"
596
665
  });
597
- await this.kv.put(`${this.connectorKey}:auth`, code);
598
- return true;
666
+ return {
667
+ accounts: [],
668
+ credentials: [
669
+ {
670
+ accountId: "",
671
+ connectorKey: this.connectorKey,
672
+ type: "AUTH_TOKEN",
673
+ expiresAt: new Date(Date.now() + 1e3 * 60 * 60 * 24 * 30),
674
+ value: code
675
+ }
676
+ ]
677
+ };
599
678
  }
600
679
  async authenticate(tokens) {
601
680
  const grantType = tokens?.refreshToken ? "refresh_token" : "authorization_code";
@@ -604,11 +683,10 @@ class ErsteConnector extends IBankConnector {
604
683
  client_secret: this.CLIENT_SECRET,
605
684
  grant_type: grantType
606
685
  };
607
- const token = await this.kv.get(`${this.connectorKey}:auth`);
608
- if (token) {
686
+ if (tokens?.token) {
609
687
  bodyParams = {
610
688
  ...bodyParams,
611
- code: token,
689
+ code: tokens.token,
612
690
  redirect_uri: this.REDIRECT_URI
613
691
  };
614
692
  }
@@ -789,6 +867,7 @@ class ErsteConnector extends IBankConnector {
789
867
  const symbols = mapReferencesToPayment(reference);
790
868
  const paymentInsert = {
791
869
  id: backendSdk.uuidv4(),
870
+ connectorKey: "ERSTE",
792
871
  bankRefId: payment.entryReference,
793
872
  amount: payment.amount.value,
794
873
  currency: payment.amount.currency.code,
@@ -809,10 +888,7 @@ class ErsteConnector extends IBankConnector {
809
888
  };
810
889
  return {
811
890
  ...paymentInsert,
812
- direction: getPaymentDirection(
813
- paymentInsert,
814
- account.identification.iban
815
- )
891
+ direction: getPaymentDirection(paymentInsert, account.iban)
816
892
  };
817
893
  });
818
894
  return payments;
@@ -826,10 +902,13 @@ class ErsteConnector extends IBankConnector {
826
902
  }
827
903
 
828
904
  class MockConnector extends IBankConnector {
829
- constructor(kv) {
905
+ constructor() {
830
906
  super();
831
907
  this.connectorKey = "MOCK";
832
- this.kv = kv;
908
+ this.connectedAccounts = [];
909
+ }
910
+ initiateSEPAPayment(payment) {
911
+ throw new Error("Method not implemented.");
833
912
  }
834
913
  static {
835
914
  this.FETCH_INTERVAL = 60 * 60 * 5;
@@ -841,13 +920,15 @@ class MockConnector extends IBankConnector {
841
920
  return [];
842
921
  }
843
922
  async getAuthUri({
844
- accountId,
845
- ott
923
+ accountId
846
924
  }) {
847
925
  return `<base-uri>/auth?ott=ott&accountId=${accountId}`;
848
926
  }
849
- async authorizeAccount() {
850
- return true;
927
+ async authorizeAccount({}) {
928
+ return {
929
+ credentials: [],
930
+ accounts: []
931
+ };
851
932
  }
852
933
  async preparePayment(payment) {
853
934
  const bankRefId = backendSdk.uuidv4();
@@ -904,11 +985,27 @@ class MockConnector extends IBankConnector {
904
985
  }
905
986
  }
906
987
 
907
- class MockCobsConnector extends FinbricksConnector {
908
- constructor(config) {
909
- super("MOCK_COBS", config);
910
- }
911
- }
988
+ const PAYMENT_TYPES = ["SEPA", "SWIFT", "IFSC", "DOMESTIC"];
989
+ const PAYMENT_STATUSES = [
990
+ "PREPARED",
991
+ "INITIALIZED",
992
+ "FAILED",
993
+ "PENDING",
994
+ "COMPLETED",
995
+ "CREATED"
996
+ ];
997
+ const PAYMENT_DIRECTIONS = ["INCOMING", "OUTGOING"];
998
+ const BATCH_STATUSES = [
999
+ "OPEN",
1000
+ "PROCESSING",
1001
+ "READY_TO_SIGN",
1002
+ "WAITING_FOR_PROCESSING",
1003
+ "PREPARED",
1004
+ "COMPLETED",
1005
+ "FAILED"
1006
+ ];
1007
+ const ACCOUNT_STATUSES = ["AUTHORIZED", "DISABLED", "EXPIRED"];
1008
+ const COUNTRY_CODES = generalCodes.COUNTRY_CODES_2;
912
1009
 
913
1010
  const paymentInsertTypeZod = zod.z.object({
914
1011
  refId: zod.z.string(),
@@ -931,20 +1028,164 @@ const paymentInsertTypeZod = zod.z.object({
931
1028
  debtorHolderName: zod.z.string().nullable()
932
1029
  });
933
1030
 
1031
+ const CONNECTOR_KEYS = [
1032
+ "ERSTE",
1033
+ "FINBRICKS",
1034
+ "MOCK",
1035
+ "CREDITAS",
1036
+ "MOCK_COBS",
1037
+ "FIO",
1038
+ "MONETA"
1039
+ ];
1040
+ const CREDENTIALS_TYPES = [
1041
+ "AUTH_TOKEN",
1042
+ "REFRESH_TOKEN",
1043
+ "CLIENT_ID",
1044
+ "API_KEY"
1045
+ ];
1046
+ const TOKEN_TYPES = ["ACCOUNT_AUTHORIZATION"];
1047
+
1048
+ const account = sqliteCore.sqliteTable(
1049
+ "account",
1050
+ {
1051
+ ...backendSdk.base,
1052
+ ...backendSdk.bankAccount,
1053
+ connectorKey: sqliteCore.text("connector_key", {
1054
+ enum: CONNECTOR_KEYS
1055
+ }).$type().notNull(),
1056
+ status: sqliteCore.text("status", { enum: ACCOUNT_STATUSES }).$type().notNull(),
1057
+ sync: sqliteCore.integer("sync", { mode: "boolean" }).default(false).notNull(),
1058
+ syncPeriod: sqliteCore.integer("sync_period"),
1059
+ lastSyncedAt: sqliteCore.integer("last_synced_at", { mode: "timestamp_ms" })
1060
+ },
1061
+ (t) => [sqliteCore.unique().on(t.iban)]
1062
+ );
1063
+
1064
+ const accountInsertSchema = drizzleZod.createInsertSchema(account);
1065
+ const accountUpdateSchema = drizzleZod.createUpdateSchema(account);
1066
+ const accountSelectSchema = drizzleZod.createSelectSchema(account);
1067
+
1068
+ const accountCredentials = sqliteCore.sqliteTable("account_credentials", {
1069
+ ...backendSdk.base,
1070
+ accountId: sqliteCore.text("account_id").references(() => account.id).notNull(),
1071
+ connectorKey: sqliteCore.text("connector_key", {
1072
+ enum: CONNECTOR_KEYS
1073
+ }).$type().notNull(),
1074
+ type: sqliteCore.text("type", {
1075
+ enum: CREDENTIALS_TYPES
1076
+ }).$type().notNull(),
1077
+ value: sqliteCore.text("value").notNull(),
1078
+ expiresAt: sqliteCore.integer("expires_at", { mode: "timestamp_ms" }).notNull()
1079
+ });
1080
+
1081
+ const accountCredentialsInsertSchema = drizzleZod.createInsertSchema(accountCredentials);
1082
+ const accountCredentialsUpdateSchema = drizzleZod.createUpdateSchema(accountCredentials);
1083
+ const accountCredentialsSelectSchema = drizzleZod.createSelectSchema(accountCredentials);
1084
+
1085
+ const ott = sqliteCore.sqliteTable("ott", {
1086
+ ...backendSdk.base,
1087
+ oneTimeToken: sqliteCore.text("one_time_token").notNull(),
1088
+ refId: sqliteCore.text("ref_id").notNull(),
1089
+ tokenType: sqliteCore.text("token_type", { enum: TOKEN_TYPES }).$type().notNull(),
1090
+ expiresAt: sqliteCore.integer("expires_at", { mode: "timestamp_ms" }).notNull()
1091
+ });
1092
+
1093
+ const ottInsertSchema = drizzleZod.createInsertSchema(ott);
1094
+ const ottUpdateSchema = drizzleZod.createUpdateSchema(ott);
1095
+ const ottSelectSchema = drizzleZod.createSelectSchema(ott);
1096
+
1097
+ const batch = sqliteCore.sqliteTable("batch", {
1098
+ ...backendSdk.base,
1099
+ batchPaymentInitiatedAt: sqliteCore.integer("batch_payment_initiated_at", {
1100
+ mode: "timestamp_ms"
1101
+ }),
1102
+ authorizationUrls: sqliteCore.text("authorization_urls", { mode: "json" }).$type(),
1103
+ accountId: sqliteCore.text("account_id"),
1104
+ status: sqliteCore.text("status", { enum: BATCH_STATUSES }).$type(),
1105
+ payments: sqliteCore.text("payments", { mode: "json" }).$type().notNull(),
1106
+ metadata: sqliteCore.text("metadata", { mode: "json" }).$type()
1107
+ });
1108
+
1109
+ const payment = sqliteCore.sqliteTable("payment", {
1110
+ ...backendSdk.base,
1111
+ refId: sqliteCore.text("ref_id"),
1112
+ bankRefId: sqliteCore.text("bank_ref_id"),
1113
+ accountId: sqliteCore.text("account_id").references(() => account.id).notNull(),
1114
+ connectorKey: sqliteCore.text("connector_key", { enum: CONNECTOR_KEYS }).$type().notNull(),
1115
+ amount: sqliteCore.real("amount").notNull(),
1116
+ direction: sqliteCore.text("direction").$type().notNull(),
1117
+ paymentType: sqliteCore.text("payment_type").$type(),
1118
+ currency: sqliteCore.text("currency").$type().notNull(),
1119
+ status: sqliteCore.text("status").$type().notNull(),
1120
+ statusReason: sqliteCore.text("status_reason"),
1121
+ batchId: sqliteCore.text("bank_execution_batch_id"),
1122
+ initiatedAt: sqliteCore.integer("initiated_at", {
1123
+ mode: "timestamp_ms"
1124
+ }),
1125
+ vs: sqliteCore.text("vs"),
1126
+ ss: sqliteCore.text("ss"),
1127
+ ks: sqliteCore.text("ks"),
1128
+ message: sqliteCore.text("message"),
1129
+ processedAt: sqliteCore.integer("processed_at", {
1130
+ mode: "timestamp_ms"
1131
+ }),
1132
+ creditorHolderName: sqliteCore.text("creditor_holder_name").notNull(),
1133
+ creditorAccountNumberWithBankCode: sqliteCore.text(
1134
+ "creditor_account_number_with_bank_code"
1135
+ ),
1136
+ creditorIban: sqliteCore.text("creditor_iban"),
1137
+ debtorIban: sqliteCore.text("debtor_iban"),
1138
+ debtorHolderName: sqliteCore.text("debtor_holder_name"),
1139
+ debtorAccountNumberWithBankCode: sqliteCore.text("debtor_account_number_with_bank_code")
1140
+ });
1141
+ const paymentRelations = relations.relations(payment, ({ one }) => ({
1142
+ batch: one(batch, { fields: [payment.batchId], references: [batch.id] })
1143
+ }));
1144
+
1145
+ const schema = {
1146
+ __proto__: null,
1147
+ account: account,
1148
+ accountCredentials: accountCredentials,
1149
+ batch: batch,
1150
+ ott: ott,
1151
+ payment: payment,
1152
+ paymentRelations: paymentRelations
1153
+ };
1154
+
1155
+ const tables = schema;
1156
+
1157
+ exports.ACCOUNT_STATUSES = ACCOUNT_STATUSES;
934
1158
  exports.BATCH_STATUSES = BATCH_STATUSES;
1159
+ exports.CONNECTOR_KEYS = CONNECTOR_KEYS;
935
1160
  exports.COUNTRY_CODES = COUNTRY_CODES;
1161
+ exports.CREDENTIALS_TYPES = CREDENTIALS_TYPES;
936
1162
  exports.ErsteConnector = ErsteConnector;
937
1163
  exports.FINBRICKS_ENDPOINTS = FINBRICKS_ENDPOINTS;
938
1164
  exports.FinbricksClient = FinbricksClient;
939
1165
  exports.FinbricksConnector = FinbricksConnector;
940
1166
  exports.IBankConnector = IBankConnector;
941
- exports.MockCobsConnector = MockCobsConnector;
942
1167
  exports.MockConnector = MockConnector;
943
1168
  exports.PAYMENT_DIRECTIONS = PAYMENT_DIRECTIONS;
944
1169
  exports.PAYMENT_STATUSES = PAYMENT_STATUSES;
945
1170
  exports.PAYMENT_TYPES = PAYMENT_TYPES;
1171
+ exports.TOKEN_TYPES = TOKEN_TYPES;
1172
+ exports.account = account;
1173
+ exports.accountCredentials = accountCredentials;
1174
+ exports.accountCredentialsInsertSchema = accountCredentialsInsertSchema;
1175
+ exports.accountCredentialsSelectSchema = accountCredentialsSelectSchema;
1176
+ exports.accountCredentialsUpdateSchema = accountCredentialsUpdateSchema;
1177
+ exports.accountInsertSchema = accountInsertSchema;
1178
+ exports.accountSelectSchema = accountSelectSchema;
1179
+ exports.accountUpdateSchema = accountUpdateSchema;
1180
+ exports.batch = batch;
946
1181
  exports.getPaymentDirection = getPaymentDirection;
1182
+ exports.ott = ott;
1183
+ exports.ottInsertSchema = ottInsertSchema;
1184
+ exports.ottSelectSchema = ottSelectSchema;
1185
+ exports.ottUpdateSchema = ottUpdateSchema;
1186
+ exports.payment = payment;
947
1187
  exports.paymentInsertTypeZod = paymentInsertTypeZod;
1188
+ exports.paymentRelations = paymentRelations;
948
1189
  exports.signFinbricksJws = signFinbricksJws;
949
1190
  exports.tables = tables;
950
1191
  exports.useFinbricksFetch = useFinbricksFetch;