@develit-services/bank 0.0.41 → 0.0.43
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/database/schema.cjs +2 -2
- package/dist/database/schema.d.cts +2 -1
- package/dist/database/schema.d.mts +2 -1
- package/dist/database/schema.d.ts +2 -1
- package/dist/database/schema.mjs +2 -2
- package/dist/export/worker.cjs +229 -224
- package/dist/export/worker.d.cts +1825 -46
- package/dist/export/worker.d.mts +1825 -46
- package/dist/export/worker.d.ts +1825 -46
- package/dist/export/worker.mjs +230 -225
- package/dist/shared/{bank.E-nyO12E.mjs → bank.6WoCPIFy.mjs} +1 -1
- package/dist/shared/{bank.e_XSg9KV.d.cts → bank.B7uB4cyW.d.cts} +154 -60
- package/dist/shared/{bank.e_XSg9KV.d.mts → bank.B7uB4cyW.d.mts} +154 -60
- package/dist/shared/{bank.e_XSg9KV.d.ts → bank.B7uB4cyW.d.ts} +154 -60
- package/dist/shared/{bank.DBgpADhg.cjs → bank.BPcrbUBa.cjs} +1 -1
- package/dist/shared/{bank.C2tmTjwq.cjs → bank.BVzOzXdX.cjs} +85 -51
- package/dist/shared/{bank.HuMp6uP6.mjs → bank.BWcFhTu1.mjs} +84 -52
- package/dist/shared/{bank.BmcSkaZh.d.mts → bank.B_JR9YGK.d.cts} +359 -19
- package/dist/shared/{bank.CELgdPJI.d.cts → bank.C9Z9B0Po.d.ts} +359 -19
- package/dist/shared/{bank.C_BFyEi4.d.ts → bank.Dadvg35r.d.mts} +359 -19
- package/dist/types.cjs +5 -3
- package/dist/types.d.cts +5 -4
- package/dist/types.d.mts +5 -4
- package/dist/types.d.ts +5 -4
- package/dist/types.mjs +3 -3
- package/package.json +1 -1
package/dist/export/worker.cjs
CHANGED
|
@@ -5,15 +5,15 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
5
5
|
const backendSdk = require('@develit-io/backend-sdk');
|
|
6
6
|
const cloudflare_workers = require('cloudflare:workers');
|
|
7
7
|
const d1 = require('drizzle-orm/d1');
|
|
8
|
-
const database_schema = require('../shared/bank.
|
|
8
|
+
const database_schema = require('../shared/bank.BVzOzXdX.cjs');
|
|
9
9
|
require('jose');
|
|
10
10
|
const generalCodes = require('@develit-io/general-codes');
|
|
11
11
|
const zod = require('zod');
|
|
12
12
|
const drizzleOrm = require('drizzle-orm');
|
|
13
|
-
const mockCobs_connector = require('../shared/bank.
|
|
13
|
+
const mockCobs_connector = require('../shared/bank.BPcrbUBa.cjs');
|
|
14
14
|
require('drizzle-orm/sqlite-core');
|
|
15
|
-
require('drizzle-zod');
|
|
16
15
|
require('date-fns');
|
|
16
|
+
require('drizzle-zod');
|
|
17
17
|
require('drizzle-orm/relations');
|
|
18
18
|
|
|
19
19
|
const upsertAccountCommand = (db, { account }) => {
|
|
@@ -349,20 +349,21 @@ const seperateSupportedPayments = (mappedPayments, accounts) => {
|
|
|
349
349
|
};
|
|
350
350
|
|
|
351
351
|
const sendPaymentInputSchema = zod.z.object({
|
|
352
|
+
correlationId: zod.z.string().min(1),
|
|
352
353
|
refId: zod.z.string(),
|
|
353
354
|
amount: zod.z.number().positive(),
|
|
354
355
|
paymentType: zod.z.enum(database_schema.PAYMENT_TYPES),
|
|
356
|
+
chargeBearer: zod.z.enum(database_schema.CHARGE_BEARERS),
|
|
357
|
+
executionDate: zod.z.string(),
|
|
358
|
+
instructionPriority: zod.z.enum(database_schema.INSTRUCTION_PRIORITIES),
|
|
355
359
|
currency: zod.z.enum(generalCodes.CURRENCY_CODES),
|
|
356
|
-
vs: zod.z.string().
|
|
357
|
-
ss: zod.z.string().
|
|
358
|
-
ks: zod.z.string().
|
|
359
|
-
message: zod.z.string().
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
debtorHolderName: zod.z.string(),
|
|
364
|
-
debtorAccountNumberWithBankCode: zod.z.string(),
|
|
365
|
-
debtorIban: zod.z.string()
|
|
360
|
+
vs: zod.z.string().optional(),
|
|
361
|
+
ss: zod.z.string().optional(),
|
|
362
|
+
ks: zod.z.string().optional(),
|
|
363
|
+
message: zod.z.string().optional(),
|
|
364
|
+
creditor: backendSdk.bankAccountMetadataSchema,
|
|
365
|
+
debtor: backendSdk.bankAccountMetadataSchema,
|
|
366
|
+
purpose: zod.z.string().optional()
|
|
366
367
|
});
|
|
367
368
|
|
|
368
369
|
const getAuthUriInputSchema = zod.z.object({
|
|
@@ -381,10 +382,8 @@ const simulateDepositInputSchema = zod.z.object({
|
|
|
381
382
|
bankingSs: zod.z.string().max(10).optional(),
|
|
382
383
|
bankingKs: zod.z.string().max(10).optional(),
|
|
383
384
|
message: zod.z.string(),
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
debtorIban: zod.z.string().max(34),
|
|
387
|
-
debtorHolderName: zod.z.string(),
|
|
385
|
+
creditor: backendSdk.bankAccountMetadataSchema,
|
|
386
|
+
debtor: backendSdk.bankAccountMetadataSchema,
|
|
388
387
|
connectorKey: zod.z.enum(database_schema.CONNECTOR_KEYS)
|
|
389
388
|
});
|
|
390
389
|
|
|
@@ -393,11 +392,6 @@ const setLastSyncAtInputSchema = zod.z.object({
|
|
|
393
392
|
lastSyncedAt: zod.z.coerce.date()
|
|
394
393
|
});
|
|
395
394
|
|
|
396
|
-
const initiateConnectorInputSchema = zod.z.object({
|
|
397
|
-
connectorKey: zod.z.enum(database_schema.CONNECTOR_KEYS),
|
|
398
|
-
withAuth: zod.z.boolean().default(true).optional()
|
|
399
|
-
});
|
|
400
|
-
|
|
401
395
|
const ALLOWED_BATCH_FILTERS = {
|
|
402
396
|
ACCOUNT_ID: "filterBatchAccountId",
|
|
403
397
|
STATUS: "filterBatchStatus"
|
|
@@ -447,6 +441,10 @@ const syncAccountInputSchema = zod.z.object({
|
|
|
447
441
|
accountId: zod.z.uuid()
|
|
448
442
|
});
|
|
449
443
|
|
|
444
|
+
const updateAccountInputSchema = zod.z.object({
|
|
445
|
+
account: database_schema.accountInsertSchema
|
|
446
|
+
});
|
|
447
|
+
|
|
450
448
|
var __defProp = Object.defineProperty;
|
|
451
449
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
452
450
|
var __decorateClass = (decorators, target, key, kind) => {
|
|
@@ -464,22 +462,124 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
|
|
|
464
462
|
this.allowedProviders = config.allowedProviders;
|
|
465
463
|
this.db = d1.drizzle(this.env.BANK_D1, { schema: database_schema.tables });
|
|
466
464
|
}
|
|
467
|
-
|
|
468
|
-
return this.allowedProviders;
|
|
469
|
-
}
|
|
470
|
-
async getAccounts() {
|
|
465
|
+
async _getAccounts() {
|
|
471
466
|
return await getAllAccountsQuery(this.db);
|
|
472
467
|
}
|
|
473
|
-
async
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
{
|
|
477
|
-
|
|
478
|
-
|
|
468
|
+
async _saveOrUpdatePayments(accounts) {
|
|
469
|
+
const allFetchedPayments = [];
|
|
470
|
+
const connectorKeys = new Set(
|
|
471
|
+
accounts.map(({ connectorKey }) => connectorKey)
|
|
472
|
+
);
|
|
473
|
+
for (const connectorKey of connectorKeys) {
|
|
474
|
+
await this._initiateBankConnector({ connectorKey });
|
|
475
|
+
for (const account of accounts.filter(
|
|
476
|
+
(acc) => acc.connectorKey === connectorKey
|
|
477
|
+
)) {
|
|
478
|
+
const payments = await this.bankConnector.getAllAccountPayments({
|
|
479
|
+
db: this.db,
|
|
480
|
+
env: this.env.ENVIRONMENT,
|
|
481
|
+
account
|
|
482
|
+
});
|
|
483
|
+
if (!payments || payments.length === 0) continue;
|
|
484
|
+
this.log(payments);
|
|
485
|
+
payments.forEach((payment) => {
|
|
486
|
+
payment.direction = database_schema.getPaymentDirection(payment, account.iban);
|
|
487
|
+
});
|
|
488
|
+
allFetchedPayments.push(...payments);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
if (allFetchedPayments.length < 1) return;
|
|
492
|
+
const bankRefIds = allFetchedPayments.map((payment) => payment.bankRefId).filter(Boolean);
|
|
493
|
+
const alreadyExistingPayments = await getPaymentsByBankRefIdsQuery(
|
|
494
|
+
this.db,
|
|
495
|
+
{
|
|
496
|
+
ids: bankRefIds
|
|
479
497
|
}
|
|
480
498
|
);
|
|
499
|
+
const paymentsCommands = allFetchedPayments.map((payment) => {
|
|
500
|
+
const isAlreadyExisting = alreadyExistingPayments.some(
|
|
501
|
+
(existingPayment) => existingPayment.bankRefId === payment.bankRefId
|
|
502
|
+
);
|
|
503
|
+
if (isAlreadyExisting)
|
|
504
|
+
return updatePaymentCommand(this.db, { payment }).command;
|
|
505
|
+
return createPaymentCommand(this.db, { payment }).command;
|
|
506
|
+
});
|
|
507
|
+
await this.db.batch([paymentsCommands[0], ...paymentsCommands.slice(1)]);
|
|
508
|
+
console.log("FETCHEDPAYMANETS TO SYNC", allFetchedPayments.length);
|
|
509
|
+
for (const account of accounts) {
|
|
510
|
+
const paymentsForAccount = allFetchedPayments.filter(
|
|
511
|
+
(payment) => (payment.direction === "OUTGOING" ? payment.debtorIban : payment.creditorIban) === account.iban
|
|
512
|
+
);
|
|
513
|
+
let lastSyncPayment;
|
|
514
|
+
lastSyncPayment = paymentsForAccount.filter(({ status }) => status !== "COMPLETED").sort(
|
|
515
|
+
(a, b) => (a.createdAt?.getTime() || 0) - (b.createdAt?.getTime() || 0)
|
|
516
|
+
)[0];
|
|
517
|
+
if (!lastSyncPayment) {
|
|
518
|
+
lastSyncPayment = paymentsForAccount.sort(
|
|
519
|
+
(a, b) => (b.createdAt?.getTime() || 0) - (a.createdAt?.getTime() || 0)
|
|
520
|
+
)[0];
|
|
521
|
+
}
|
|
522
|
+
if (lastSyncPayment.createdAt) {
|
|
523
|
+
await updateAccountLastSyncCommand(this.db, {
|
|
524
|
+
accountId: account.id,
|
|
525
|
+
lastSyncedAt: lastSyncPayment.createdAt
|
|
526
|
+
}).command.execute();
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
await this.pushToQueue(
|
|
530
|
+
this.env.QUEUE_BUS_QUEUE,
|
|
531
|
+
allFetchedPayments.map((payment) => ({
|
|
532
|
+
eventType: "BANK_PAYMENT",
|
|
533
|
+
eventSignal: "created",
|
|
534
|
+
bankPayment: payment,
|
|
535
|
+
metadata: {
|
|
536
|
+
correlationId: backendSdk.uuidv4(),
|
|
537
|
+
timestamp: (/* @__PURE__ */ new Date()).toDateString()
|
|
538
|
+
}
|
|
539
|
+
}))
|
|
540
|
+
);
|
|
541
|
+
}
|
|
542
|
+
async _initiateBankConnector({
|
|
543
|
+
connectorKey,
|
|
544
|
+
withAuth
|
|
545
|
+
}) {
|
|
546
|
+
if (!this.allowedProviders.includes(connectorKey)) {
|
|
547
|
+
throw backendSdk.createInternalError(null, {
|
|
548
|
+
message: `Invalid connector key: ${connectorKey}`
|
|
549
|
+
});
|
|
550
|
+
}
|
|
551
|
+
const accounts = await this._getAccounts();
|
|
552
|
+
const accountsForConnector = accounts.filter(
|
|
553
|
+
(acc) => acc.connectorKey === connectorKey
|
|
554
|
+
);
|
|
555
|
+
const accountsWithCredentials = await Promise.all(
|
|
556
|
+
accountsForConnector.map(async (acc) => {
|
|
557
|
+
const credentials = await getCredentialsByAccountId(this.db, {
|
|
558
|
+
accountId: acc.id
|
|
559
|
+
});
|
|
560
|
+
if (!credentials) {
|
|
561
|
+
throw backendSdk.createInternalError(null, {
|
|
562
|
+
message: `No credentials found for account ${acc.id}`
|
|
563
|
+
});
|
|
564
|
+
}
|
|
565
|
+
return {
|
|
566
|
+
currency: acc.currency,
|
|
567
|
+
iban: acc.iban,
|
|
568
|
+
token: credentials.value,
|
|
569
|
+
id: acc.id,
|
|
570
|
+
connectorKey: acc.connectorKey
|
|
571
|
+
};
|
|
572
|
+
})
|
|
573
|
+
);
|
|
574
|
+
this.bankConnector = initiateConnector({
|
|
575
|
+
bank: connectorKey,
|
|
576
|
+
connectedAccounts: accountsWithCredentials,
|
|
577
|
+
env: this.env
|
|
578
|
+
});
|
|
579
|
+
if (!withAuth) return;
|
|
580
|
+
await this.bankConnector.authenticate();
|
|
481
581
|
}
|
|
482
|
-
|
|
582
|
+
_accountFetchInterval(connectorKey) {
|
|
483
583
|
switch (connectorKey) {
|
|
484
584
|
case "ERSTE":
|
|
485
585
|
return database_schema.ErsteConnector.FETCH_INTERVAL;
|
|
@@ -491,10 +591,19 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
|
|
|
491
591
|
return 0;
|
|
492
592
|
}
|
|
493
593
|
}
|
|
594
|
+
async getPayments(input) {
|
|
595
|
+
return this.handleAction(
|
|
596
|
+
{ data: input, schema: getPaymentsInputSchema },
|
|
597
|
+
{ successMessage: "Payments fetched successfully" },
|
|
598
|
+
async (pagination) => {
|
|
599
|
+
return await getPaymentsWithPaginationQuery(this.db, pagination);
|
|
600
|
+
}
|
|
601
|
+
);
|
|
602
|
+
}
|
|
494
603
|
async syncAccount(input) {
|
|
495
604
|
return this.handleAction(
|
|
496
605
|
{ data: input, schema: syncAccountInputSchema },
|
|
497
|
-
{ successMessage: "" },
|
|
606
|
+
{ successMessage: "Account synchronized successfully" },
|
|
498
607
|
async ({ accountId }) => {
|
|
499
608
|
const account = await getAccountByIdQuery(this.db, {
|
|
500
609
|
accountId
|
|
@@ -505,38 +614,40 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
|
|
|
505
614
|
message: "Account not found",
|
|
506
615
|
status: 404
|
|
507
616
|
});
|
|
508
|
-
await this.
|
|
509
|
-
accounts: [account]
|
|
510
|
-
});
|
|
617
|
+
await this._saveOrUpdatePayments([account]);
|
|
511
618
|
}
|
|
512
619
|
);
|
|
513
620
|
}
|
|
514
621
|
async syncAccounts(options) {
|
|
515
|
-
return this.handleAction(
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
const
|
|
525
|
-
|
|
526
|
-
)
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
622
|
+
return this.handleAction(
|
|
623
|
+
null,
|
|
624
|
+
{ successMessage: "Accounts synchronized successfully" },
|
|
625
|
+
async () => {
|
|
626
|
+
const accountsToSync = [];
|
|
627
|
+
let accounts = options?.accounts || [];
|
|
628
|
+
if (!accounts.length) {
|
|
629
|
+
accounts = await this._getAccounts();
|
|
630
|
+
}
|
|
631
|
+
for (const account of accounts.filter(
|
|
632
|
+
(acc) => !!!acc.connectorKey.includes("MOCK")
|
|
633
|
+
)) {
|
|
634
|
+
const accountFetchInterval = this._accountFetchInterval(
|
|
635
|
+
account.connectorKey
|
|
636
|
+
);
|
|
637
|
+
const now = Date.now();
|
|
638
|
+
const lastSyncTime = account.lastSyncedAt.getTime();
|
|
639
|
+
const intervalMs = accountFetchInterval * 1e3;
|
|
640
|
+
const shouldFetch = now - lastSyncTime >= intervalMs;
|
|
641
|
+
if (!shouldFetch) continue;
|
|
642
|
+
accountsToSync.push({
|
|
643
|
+
...account
|
|
644
|
+
});
|
|
645
|
+
}
|
|
646
|
+
console.log("ACCS TO SYNC", accountsToSync.length);
|
|
647
|
+
if (accountsToSync.length <= 0) return;
|
|
648
|
+
await this._saveOrUpdatePayments(accounts);
|
|
535
649
|
}
|
|
536
|
-
|
|
537
|
-
if (accountsToSync.length <= 0) return;
|
|
538
|
-
await this.saveOrUpdatePayments(accountsToSync);
|
|
539
|
-
});
|
|
650
|
+
);
|
|
540
651
|
}
|
|
541
652
|
async scheduled(controller) {
|
|
542
653
|
if (controller.cron === this.env.CRON_PAYMENTS_PROCESSING) {
|
|
@@ -551,7 +662,7 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
|
|
|
551
662
|
async updateBatchStatuses() {
|
|
552
663
|
const pendingBatches = await getAllPendingBatchesQuery(this.db);
|
|
553
664
|
const uniqueConnectors = /* @__PURE__ */ new Set();
|
|
554
|
-
const accounts = await this.
|
|
665
|
+
const accounts = await this._getAccounts();
|
|
555
666
|
for (const batch of pendingBatches) {
|
|
556
667
|
const connectorKey = accounts.find(
|
|
557
668
|
(acc) => acc.id === batch.accountId
|
|
@@ -592,53 +703,6 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
|
|
|
592
703
|
]);
|
|
593
704
|
console.log("Batch update completed");
|
|
594
705
|
}
|
|
595
|
-
// @action('initiate-bank-connector')
|
|
596
|
-
async initiateBankConnector(input) {
|
|
597
|
-
return this.handleAction(
|
|
598
|
-
{ data: input, schema: initiateConnectorInputSchema },
|
|
599
|
-
{ successMessage: "Bank connector initiated successfully" },
|
|
600
|
-
async ({ connectorKey, withAuth }) => {
|
|
601
|
-
if (!this.allowedProviders.includes(connectorKey)) {
|
|
602
|
-
throw backendSdk.createInternalError(null, {
|
|
603
|
-
message: `Invalid connector key: ${connectorKey}`
|
|
604
|
-
});
|
|
605
|
-
}
|
|
606
|
-
const accounts = await this.getAccounts();
|
|
607
|
-
const accountsForConnector = accounts.filter(
|
|
608
|
-
(acc) => acc.connectorKey === connectorKey
|
|
609
|
-
);
|
|
610
|
-
const accountsWithCredentials = await Promise.all(
|
|
611
|
-
accountsForConnector.map(async (acc) => {
|
|
612
|
-
const credentials = await getCredentialsByAccountId(this.db, {
|
|
613
|
-
accountId: acc.id
|
|
614
|
-
});
|
|
615
|
-
if (!credentials) {
|
|
616
|
-
throw backendSdk.createInternalError(null, {
|
|
617
|
-
message: `No credentials found for account ${acc.id}`
|
|
618
|
-
});
|
|
619
|
-
}
|
|
620
|
-
return {
|
|
621
|
-
currency: acc.currency,
|
|
622
|
-
iban: acc.iban,
|
|
623
|
-
token: credentials.value,
|
|
624
|
-
id: acc.id,
|
|
625
|
-
connectorKey: acc.connectorKey
|
|
626
|
-
};
|
|
627
|
-
})
|
|
628
|
-
);
|
|
629
|
-
this.bankConnector = initiateConnector({
|
|
630
|
-
bank: connectorKey,
|
|
631
|
-
connectedAccounts: accountsWithCredentials,
|
|
632
|
-
env: this.env
|
|
633
|
-
});
|
|
634
|
-
if (!withAuth) return;
|
|
635
|
-
await this.bankConnector.authenticate();
|
|
636
|
-
}
|
|
637
|
-
);
|
|
638
|
-
}
|
|
639
|
-
batchLimit(connectorKey) {
|
|
640
|
-
return 50;
|
|
641
|
-
}
|
|
642
706
|
async addPaymentsToBatch({
|
|
643
707
|
paymentsToBatch
|
|
644
708
|
}) {
|
|
@@ -648,9 +712,8 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
|
|
|
648
712
|
(payment) => {
|
|
649
713
|
return {
|
|
650
714
|
id: backendSdk.uuidv4(),
|
|
651
|
-
|
|
715
|
+
correlationId: payment.correlationId,
|
|
652
716
|
refId: payment.refId,
|
|
653
|
-
connectorKey: "MOCK",
|
|
654
717
|
amount: payment.amount,
|
|
655
718
|
direction: "OUTGOING",
|
|
656
719
|
paymentType: payment.paymentType,
|
|
@@ -662,16 +725,14 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
|
|
|
662
725
|
ss: payment.ss || null,
|
|
663
726
|
ks: payment.ks || null,
|
|
664
727
|
message: payment.message || null,
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
debtorAccountNumberWithBankCode: payment.debtorAccountNumberWithBankCode,
|
|
670
|
-
debtorIban: payment.debtorIban
|
|
728
|
+
creditor: payment.creditor,
|
|
729
|
+
creditorIban: payment.creditor.iban || null,
|
|
730
|
+
debtor: payment.debtor,
|
|
731
|
+
debtorIban: payment.debtor.iban || null
|
|
671
732
|
};
|
|
672
733
|
}
|
|
673
734
|
);
|
|
674
|
-
const accounts = await this.
|
|
735
|
+
const accounts = await this._getAccounts();
|
|
675
736
|
const { supportedPayments, unsupportedPayments } = seperateSupportedPayments(mappedPayments, accounts);
|
|
676
737
|
if (unsupportedPayments.length > 0) {
|
|
677
738
|
this.logError({ unsupportedPayments });
|
|
@@ -682,23 +743,17 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
|
|
|
682
743
|
bankPayment: {
|
|
683
744
|
...unsupported,
|
|
684
745
|
status: "FAILED",
|
|
685
|
-
statusReason: "UNSUPPORTED_ACCOUNT"
|
|
686
|
-
paymentType: unsupported.paymentType,
|
|
687
|
-
creditorAccountNumberWithBankCode: unsupported.creditorAccountNumberWithBankCode,
|
|
688
|
-
creditorIban: unsupported.creditorIban,
|
|
689
|
-
creditorHolderName: unsupported.creditorHolderName,
|
|
690
|
-
debtorAccountNumberWithBankCode: unsupported.debtorAccountNumberWithBankCode,
|
|
691
|
-
debtorIban: unsupported.debtorIban,
|
|
692
|
-
debtorHolderName: unsupported.debtorHolderName
|
|
746
|
+
statusReason: "UNSUPPORTED_ACCOUNT"
|
|
693
747
|
},
|
|
748
|
+
eventSignal: "failed",
|
|
694
749
|
metadata: {
|
|
695
|
-
correlationId:
|
|
750
|
+
correlationId: unsupported.correlationId,
|
|
696
751
|
timestamp: (/* @__PURE__ */ new Date()).toDateString()
|
|
697
752
|
}
|
|
698
753
|
}))
|
|
699
754
|
);
|
|
700
755
|
}
|
|
701
|
-
for (const acc of
|
|
756
|
+
for (const acc of accounts) {
|
|
702
757
|
const newPayments = supportedPayments.filter(
|
|
703
758
|
(payment) => payment.debtorIban === acc.iban && payment.currency === acc.currency
|
|
704
759
|
).map((payment) => ({
|
|
@@ -716,7 +771,7 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
|
|
|
716
771
|
accountId: acc.id
|
|
717
772
|
});
|
|
718
773
|
const availableBatch = openBatches.find(
|
|
719
|
-
(batch) => batch.payments.length >=
|
|
774
|
+
(batch) => batch.payments.length >= acc.batchSizeLimit
|
|
720
775
|
);
|
|
721
776
|
this.log({
|
|
722
777
|
message: availableBatch ? `\u{1F504} Found existing OPEN batches for account ${acc.id}, merging ${availableBatch.payments.length} existing + ${newPayments.length} new payments` : `\u2728 Creating new batch for account ${acc.id} with ${newPayments.length} payments`
|
|
@@ -752,7 +807,7 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
|
|
|
752
807
|
status: "PROCESSING"
|
|
753
808
|
}
|
|
754
809
|
}).command.execute();
|
|
755
|
-
await this.
|
|
810
|
+
await this._initiateBankConnector({ connectorKey });
|
|
756
811
|
if (!this.bankConnector) {
|
|
757
812
|
await upsertBatchCommand(this.db, {
|
|
758
813
|
batch: {
|
|
@@ -881,7 +936,7 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
|
|
|
881
936
|
{ data: input, schema: getAuthUriInputSchema },
|
|
882
937
|
{ successMessage: "Auth URI obtained." },
|
|
883
938
|
async ({ connectorKey }) => {
|
|
884
|
-
await this.
|
|
939
|
+
await this._initiateBankConnector({ connectorKey, withAuth: false });
|
|
885
940
|
const ott = backendSdk.uuidv4();
|
|
886
941
|
const { command: createOneTimeToken } = createOneTimeTokenCommand(
|
|
887
942
|
this.db,
|
|
@@ -919,14 +974,14 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
|
|
|
919
974
|
status: 400
|
|
920
975
|
});
|
|
921
976
|
}
|
|
922
|
-
await this.
|
|
977
|
+
await this._initiateBankConnector({
|
|
923
978
|
connectorKey: ottRow.refId
|
|
924
979
|
});
|
|
925
980
|
const { credentials, accounts } = await this.bankConnector.authorizeAccount({
|
|
926
981
|
urlParams
|
|
927
982
|
});
|
|
928
983
|
console.log("Bank connector initiated");
|
|
929
|
-
const alreadyExistingAccounts = (await this.
|
|
984
|
+
const alreadyExistingAccounts = (await this._getAccounts()).filter(
|
|
930
985
|
(acc) => acc.connectorKey === ottRow.refId && accounts.map((item) => item.iban).includes(acc.iban)
|
|
931
986
|
);
|
|
932
987
|
const upsertAccounts = accounts.map(
|
|
@@ -953,7 +1008,7 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
|
|
|
953
1008
|
...deleteCredentials,
|
|
954
1009
|
...createAccountCredentials
|
|
955
1010
|
]);
|
|
956
|
-
const fetchedAccounts = await this.
|
|
1011
|
+
const fetchedAccounts = await this._getAccounts();
|
|
957
1012
|
if (!fetchedAccounts)
|
|
958
1013
|
throw backendSdk.createInternalError(null, {
|
|
959
1014
|
message: "Account not found",
|
|
@@ -966,79 +1021,6 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
|
|
|
966
1021
|
}
|
|
967
1022
|
);
|
|
968
1023
|
}
|
|
969
|
-
async saveOrUpdatePayments(accounts) {
|
|
970
|
-
return this.handleAction(null, {}, async () => {
|
|
971
|
-
const allFetchedPayments = [];
|
|
972
|
-
const connectorKeys = new Set(
|
|
973
|
-
accounts.map(({ connectorKey }) => connectorKey)
|
|
974
|
-
);
|
|
975
|
-
for (const connectorKey of connectorKeys) {
|
|
976
|
-
await this.initiateBankConnector({ connectorKey });
|
|
977
|
-
for (const account of accounts.filter(
|
|
978
|
-
(acc) => acc.connectorKey === connectorKey
|
|
979
|
-
)) {
|
|
980
|
-
const payments = await this.bankConnector.getAllAccountPayments({
|
|
981
|
-
db: this.db,
|
|
982
|
-
env: this.env.ENVIRONMENT,
|
|
983
|
-
account
|
|
984
|
-
});
|
|
985
|
-
if (!payments || payments.length === 0) continue;
|
|
986
|
-
this.log(payments);
|
|
987
|
-
payments.forEach((payment) => {
|
|
988
|
-
payment.direction = database_schema.getPaymentDirection(payment, account.iban);
|
|
989
|
-
});
|
|
990
|
-
allFetchedPayments.push(...payments);
|
|
991
|
-
}
|
|
992
|
-
}
|
|
993
|
-
if (allFetchedPayments.length < 1) return;
|
|
994
|
-
const bankRefIds = allFetchedPayments.map((payment) => payment.bankRefId).filter(Boolean);
|
|
995
|
-
const alreadyExistingPayments = await getPaymentsByBankRefIdsQuery(
|
|
996
|
-
this.db,
|
|
997
|
-
{ ids: bankRefIds }
|
|
998
|
-
);
|
|
999
|
-
const paymentsCommands = allFetchedPayments.map((payment) => {
|
|
1000
|
-
const isAlreadyExisting = alreadyExistingPayments.some(
|
|
1001
|
-
(existingPayment) => existingPayment.bankRefId === payment.bankRefId
|
|
1002
|
-
);
|
|
1003
|
-
if (isAlreadyExisting)
|
|
1004
|
-
return updatePaymentCommand(this.db, { payment }).command;
|
|
1005
|
-
return createPaymentCommand(this.db, { payment }).command;
|
|
1006
|
-
});
|
|
1007
|
-
await this.db.batch([paymentsCommands[0], ...paymentsCommands.slice(1)]);
|
|
1008
|
-
console.log("FETCHEDPAYMANETS TO SYNC", allFetchedPayments.length);
|
|
1009
|
-
for (const account of accounts) {
|
|
1010
|
-
const paymentsForAccount = allFetchedPayments.filter(
|
|
1011
|
-
(payment) => (payment.direction === "OUTGOING" ? payment.debtorIban : payment.creditorIban) === account.iban
|
|
1012
|
-
);
|
|
1013
|
-
let lastSyncPayment;
|
|
1014
|
-
lastSyncPayment = paymentsForAccount.filter(({ status }) => status !== "COMPLETED").sort(
|
|
1015
|
-
(a, b) => (a.createdAt?.getTime() || 0) - (b.createdAt?.getTime() || 0)
|
|
1016
|
-
)[0];
|
|
1017
|
-
if (!lastSyncPayment) {
|
|
1018
|
-
lastSyncPayment = paymentsForAccount.sort(
|
|
1019
|
-
(a, b) => (b.createdAt?.getTime() || 0) - (a.createdAt?.getTime() || 0)
|
|
1020
|
-
)[0];
|
|
1021
|
-
}
|
|
1022
|
-
if (lastSyncPayment.createdAt) {
|
|
1023
|
-
await updateAccountLastSyncCommand(this.db, {
|
|
1024
|
-
accountId: account.id,
|
|
1025
|
-
lastSyncedAt: lastSyncPayment.createdAt
|
|
1026
|
-
}).command.execute();
|
|
1027
|
-
}
|
|
1028
|
-
}
|
|
1029
|
-
await this.pushToQueue(
|
|
1030
|
-
this.env.QUEUE_BUS_QUEUE,
|
|
1031
|
-
allFetchedPayments.map((payment) => ({
|
|
1032
|
-
eventType: "BANK_PAYMENT",
|
|
1033
|
-
bankPayment: payment,
|
|
1034
|
-
metadata: {
|
|
1035
|
-
correlationId: backendSdk.uuidv4(),
|
|
1036
|
-
timestamp: (/* @__PURE__ */ new Date()).toDateString()
|
|
1037
|
-
}
|
|
1038
|
-
}))
|
|
1039
|
-
);
|
|
1040
|
-
});
|
|
1041
|
-
}
|
|
1042
1024
|
async simulateDeposit(input) {
|
|
1043
1025
|
return this.handleAction(
|
|
1044
1026
|
{ data: input, schema: simulateDepositInputSchema },
|
|
@@ -1050,14 +1032,12 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
|
|
|
1050
1032
|
bankingSs,
|
|
1051
1033
|
bankingKs,
|
|
1052
1034
|
message,
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
debtorIban,
|
|
1056
|
-
debtorHolderName,
|
|
1035
|
+
creditor,
|
|
1036
|
+
debtor,
|
|
1057
1037
|
connectorKey
|
|
1058
1038
|
}) => {
|
|
1059
1039
|
const account = await getAccountByIbanQuery(this.db, {
|
|
1060
|
-
iban:
|
|
1040
|
+
iban: debtor.iban
|
|
1061
1041
|
});
|
|
1062
1042
|
if (!account)
|
|
1063
1043
|
throw backendSdk.createInternalError(null, {
|
|
@@ -1067,6 +1047,7 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
|
|
|
1067
1047
|
});
|
|
1068
1048
|
const payment = {
|
|
1069
1049
|
id: backendSdk.uuidv4(),
|
|
1050
|
+
correlationId: backendSdk.uuidv4(),
|
|
1070
1051
|
amount,
|
|
1071
1052
|
connectorKey,
|
|
1072
1053
|
accountId: account.id,
|
|
@@ -1081,19 +1062,20 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
|
|
|
1081
1062
|
ss: bankingSs,
|
|
1082
1063
|
ks: bankingKs,
|
|
1083
1064
|
message,
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1065
|
+
creditor,
|
|
1066
|
+
creditorIban: creditor.iban,
|
|
1067
|
+
debtor,
|
|
1068
|
+
debtorIban: debtor.iban
|
|
1088
1069
|
};
|
|
1089
1070
|
const { command } = createPaymentCommand(this.db, { payment });
|
|
1090
1071
|
const createdPayment = await command.execute().then(backendSdk.first);
|
|
1091
1072
|
this.logQueuePush({ payment, isPaymentExecuted: true });
|
|
1092
1073
|
await this.pushToQueue(this.env.QUEUE_BUS_QUEUE, {
|
|
1093
1074
|
eventType: "BANK_PAYMENT",
|
|
1075
|
+
eventSignal: "completed",
|
|
1094
1076
|
bankPayment: createdPayment,
|
|
1095
1077
|
metadata: {
|
|
1096
|
-
correlationId: createdPayment.
|
|
1078
|
+
correlationId: createdPayment.correlationId,
|
|
1097
1079
|
timestamp: (/* @__PURE__ */ new Date()).toDateString()
|
|
1098
1080
|
}
|
|
1099
1081
|
});
|
|
@@ -1119,7 +1101,6 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
|
|
|
1119
1101
|
accountId: account.id,
|
|
1120
1102
|
lastSyncedAt
|
|
1121
1103
|
}).command.execute();
|
|
1122
|
-
return {};
|
|
1123
1104
|
}
|
|
1124
1105
|
);
|
|
1125
1106
|
}
|
|
@@ -1136,9 +1117,33 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
|
|
|
1136
1117
|
);
|
|
1137
1118
|
}
|
|
1138
1119
|
async getBankAccounts() {
|
|
1139
|
-
return
|
|
1140
|
-
|
|
1141
|
-
|
|
1120
|
+
return this.handleAction(
|
|
1121
|
+
null,
|
|
1122
|
+
{ successMessage: "Bank accounts retrieved successfully" },
|
|
1123
|
+
async () => await this._getAccounts()
|
|
1124
|
+
);
|
|
1125
|
+
}
|
|
1126
|
+
async updateAccount(input) {
|
|
1127
|
+
return this.handleAction(
|
|
1128
|
+
{
|
|
1129
|
+
data: input,
|
|
1130
|
+
schema: updateAccountInputSchema
|
|
1131
|
+
},
|
|
1132
|
+
{ successMessage: "Account updated successfully" },
|
|
1133
|
+
async ({ account }) => {
|
|
1134
|
+
const updatedAccount = await upsertAccountCommand(this.db, {
|
|
1135
|
+
account
|
|
1136
|
+
}).command.execute().then(backendSdk.first);
|
|
1137
|
+
if (!updatedAccount) {
|
|
1138
|
+
throw backendSdk.createInternalError(null, {
|
|
1139
|
+
message: "Account not found",
|
|
1140
|
+
code: "ACCOUNT_NOT_FOUND",
|
|
1141
|
+
status: 404
|
|
1142
|
+
});
|
|
1143
|
+
}
|
|
1144
|
+
return updatedAccount;
|
|
1145
|
+
}
|
|
1146
|
+
);
|
|
1142
1147
|
}
|
|
1143
1148
|
async getBatches(input) {
|
|
1144
1149
|
return this.handleAction(
|
|
@@ -1180,9 +1185,6 @@ __decorateClass([
|
|
|
1180
1185
|
__decorateClass([
|
|
1181
1186
|
backendSdk.action("authorize-account")
|
|
1182
1187
|
], BankServiceBase.prototype, "authorizeAccount", 1);
|
|
1183
|
-
__decorateClass([
|
|
1184
|
-
backendSdk.action("save-or-update-payments")
|
|
1185
|
-
], BankServiceBase.prototype, "saveOrUpdatePayments", 1);
|
|
1186
1188
|
__decorateClass([
|
|
1187
1189
|
backendSdk.action("simulate-deposit")
|
|
1188
1190
|
], BankServiceBase.prototype, "simulateDeposit", 1);
|
|
@@ -1195,6 +1197,9 @@ __decorateClass([
|
|
|
1195
1197
|
__decorateClass([
|
|
1196
1198
|
backendSdk.action("get-bank-accounts")
|
|
1197
1199
|
], BankServiceBase.prototype, "getBankAccounts", 1);
|
|
1200
|
+
__decorateClass([
|
|
1201
|
+
backendSdk.action("update-account")
|
|
1202
|
+
], BankServiceBase.prototype, "updateAccount", 1);
|
|
1198
1203
|
__decorateClass([
|
|
1199
1204
|
backendSdk.action("getBatches")
|
|
1200
1205
|
], BankServiceBase.prototype, "getBatches", 1);
|