@develit-services/bank 0.0.41 → 0.0.42
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 +1 -1
- 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 +1 -1
- package/dist/export/worker.cjs +214 -209
- package/dist/export/worker.d.cts +1177 -52
- package/dist/export/worker.d.mts +1177 -52
- package/dist/export/worker.d.ts +1177 -52
- package/dist/export/worker.mjs +215 -210
- package/dist/shared/{bank.BmcSkaZh.d.mts → bank.B42VDp4J.d.ts} +352 -12
- package/dist/shared/{bank.HuMp6uP6.mjs → bank.C4RJkRzZ.mjs} +8 -8
- package/dist/shared/{bank.CELgdPJI.d.cts → bank.CZ3ewB_T.d.cts} +352 -12
- package/dist/shared/{bank.C2tmTjwq.cjs → bank.Cw5xzUgM.cjs} +9 -7
- package/dist/shared/{bank.DBgpADhg.cjs → bank.DSXZph4D.cjs} +1 -1
- package/dist/shared/{bank.e_XSg9KV.d.mts → bank.PvYf5Bqd.d.cts} +158 -64
- package/dist/shared/{bank.e_XSg9KV.d.cts → bank.PvYf5Bqd.d.mts} +158 -64
- package/dist/shared/{bank.e_XSg9KV.d.ts → bank.PvYf5Bqd.d.ts} +158 -64
- package/dist/shared/{bank.E-nyO12E.mjs → bank.WJE512Ly.mjs} +1 -1
- package/dist/shared/{bank.C_BFyEi4.d.ts → bank.k9J_kqIm.d.mts} +352 -12
- package/dist/types.cjs +4 -2
- 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 +2 -2
- package/package.json +4 -1
package/dist/export/worker.mjs
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { uuidv4, develitWorker, createInternalError, first,
|
|
1
|
+
import { uuidv4, bankAccountMetadataSchema, develitWorker, createInternalError, first, action, service } from '@develit-io/backend-sdk';
|
|
2
2
|
import { WorkerEntrypoint } from 'cloudflare:workers';
|
|
3
3
|
import { drizzle } from 'drizzle-orm/d1';
|
|
4
|
-
import { t as tables, F as FinbricksConnector, M as MockConnector, E as ErsteConnector, P as PAYMENT_TYPES,
|
|
4
|
+
import { t as tables, F as FinbricksConnector, M as MockConnector, E as ErsteConnector, c as INSTRUCTION_PRIORITIES, C as CHARGE_BEARERS, P as PAYMENT_TYPES, g as CONNECTOR_KEYS, B as BATCH_STATUSES, d as PAYMENT_STATUSES, e as PAYMENT_DIRECTIONS, i as accountInsertSchema, v as getPaymentDirection } from '../shared/bank.C4RJkRzZ.mjs';
|
|
5
5
|
import 'jose';
|
|
6
6
|
import { CURRENCY_CODES } from '@develit-io/general-codes';
|
|
7
7
|
import { z } from 'zod';
|
|
8
8
|
import { eq, inArray, and, sql, asc, desc, gte, lte } from 'drizzle-orm';
|
|
9
|
-
import { M as MockCobsConnector } from '../shared/bank.
|
|
9
|
+
import { M as MockCobsConnector } from '../shared/bank.WJE512Ly.mjs';
|
|
10
10
|
import 'drizzle-orm/sqlite-core';
|
|
11
11
|
import 'drizzle-zod';
|
|
12
12
|
import 'date-fns';
|
|
@@ -345,20 +345,21 @@ const seperateSupportedPayments = (mappedPayments, accounts) => {
|
|
|
345
345
|
};
|
|
346
346
|
|
|
347
347
|
const sendPaymentInputSchema = z.object({
|
|
348
|
+
correlationId: z.string().min(1),
|
|
348
349
|
refId: z.string(),
|
|
349
350
|
amount: z.number().positive(),
|
|
350
351
|
paymentType: z.enum(PAYMENT_TYPES),
|
|
352
|
+
chargeBearer: z.enum(CHARGE_BEARERS),
|
|
353
|
+
executionDate: z.string(),
|
|
354
|
+
instructionPriority: z.enum(INSTRUCTION_PRIORITIES),
|
|
351
355
|
currency: z.enum(CURRENCY_CODES),
|
|
352
|
-
vs: z.string().
|
|
353
|
-
ss: z.string().
|
|
354
|
-
ks: z.string().
|
|
355
|
-
message: z.string().
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
debtorHolderName: z.string(),
|
|
360
|
-
debtorAccountNumberWithBankCode: z.string(),
|
|
361
|
-
debtorIban: z.string()
|
|
356
|
+
vs: z.string().optional(),
|
|
357
|
+
ss: z.string().optional(),
|
|
358
|
+
ks: z.string().optional(),
|
|
359
|
+
message: z.string().optional(),
|
|
360
|
+
creditor: bankAccountMetadataSchema,
|
|
361
|
+
debtor: bankAccountMetadataSchema,
|
|
362
|
+
purpose: z.string().optional()
|
|
362
363
|
});
|
|
363
364
|
|
|
364
365
|
const getAuthUriInputSchema = z.object({
|
|
@@ -389,11 +390,6 @@ const setLastSyncAtInputSchema = z.object({
|
|
|
389
390
|
lastSyncedAt: z.coerce.date()
|
|
390
391
|
});
|
|
391
392
|
|
|
392
|
-
const initiateConnectorInputSchema = z.object({
|
|
393
|
-
connectorKey: z.enum(CONNECTOR_KEYS),
|
|
394
|
-
withAuth: z.boolean().default(true).optional()
|
|
395
|
-
});
|
|
396
|
-
|
|
397
393
|
const ALLOWED_BATCH_FILTERS = {
|
|
398
394
|
ACCOUNT_ID: "filterBatchAccountId",
|
|
399
395
|
STATUS: "filterBatchStatus"
|
|
@@ -443,6 +439,10 @@ const syncAccountInputSchema = z.object({
|
|
|
443
439
|
accountId: z.uuid()
|
|
444
440
|
});
|
|
445
441
|
|
|
442
|
+
const updateAccountInputSchema = z.object({
|
|
443
|
+
account: accountInsertSchema
|
|
444
|
+
});
|
|
445
|
+
|
|
446
446
|
var __defProp = Object.defineProperty;
|
|
447
447
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
448
448
|
var __decorateClass = (decorators, target, key, kind) => {
|
|
@@ -460,22 +460,123 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
460
460
|
this.allowedProviders = config.allowedProviders;
|
|
461
461
|
this.db = drizzle(this.env.BANK_D1, { schema: tables });
|
|
462
462
|
}
|
|
463
|
-
|
|
464
|
-
return this.allowedProviders;
|
|
465
|
-
}
|
|
466
|
-
async getAccounts() {
|
|
463
|
+
async _getAccounts() {
|
|
467
464
|
return await getAllAccountsQuery(this.db);
|
|
468
465
|
}
|
|
469
|
-
async
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
{
|
|
473
|
-
|
|
474
|
-
|
|
466
|
+
async _saveOrUpdatePayments(accounts) {
|
|
467
|
+
const allFetchedPayments = [];
|
|
468
|
+
const connectorKeys = new Set(
|
|
469
|
+
accounts.map(({ connectorKey }) => connectorKey)
|
|
470
|
+
);
|
|
471
|
+
for (const connectorKey of connectorKeys) {
|
|
472
|
+
await this._initiateBankConnector({ connectorKey });
|
|
473
|
+
for (const account of accounts.filter(
|
|
474
|
+
(acc) => acc.connectorKey === connectorKey
|
|
475
|
+
)) {
|
|
476
|
+
const payments = await this.bankConnector.getAllAccountPayments({
|
|
477
|
+
db: this.db,
|
|
478
|
+
env: this.env.ENVIRONMENT,
|
|
479
|
+
account
|
|
480
|
+
});
|
|
481
|
+
if (!payments || payments.length === 0) continue;
|
|
482
|
+
this.log(payments);
|
|
483
|
+
payments.forEach((payment) => {
|
|
484
|
+
payment.direction = getPaymentDirection(payment, account.iban);
|
|
485
|
+
});
|
|
486
|
+
allFetchedPayments.push(...payments);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
if (allFetchedPayments.length < 1) return;
|
|
490
|
+
const bankRefIds = allFetchedPayments.map((payment) => payment.bankRefId).filter(Boolean);
|
|
491
|
+
const alreadyExistingPayments = await getPaymentsByBankRefIdsQuery(
|
|
492
|
+
this.db,
|
|
493
|
+
{
|
|
494
|
+
ids: bankRefIds
|
|
475
495
|
}
|
|
476
496
|
);
|
|
497
|
+
const paymentsCommands = allFetchedPayments.map((payment) => {
|
|
498
|
+
const isAlreadyExisting = alreadyExistingPayments.some(
|
|
499
|
+
(existingPayment) => existingPayment.bankRefId === payment.bankRefId
|
|
500
|
+
);
|
|
501
|
+
if (isAlreadyExisting)
|
|
502
|
+
return updatePaymentCommand(this.db, { payment }).command;
|
|
503
|
+
return createPaymentCommand(this.db, { payment }).command;
|
|
504
|
+
});
|
|
505
|
+
await this.db.batch([paymentsCommands[0], ...paymentsCommands.slice(1)]);
|
|
506
|
+
console.log("FETCHEDPAYMANETS TO SYNC", allFetchedPayments.length);
|
|
507
|
+
for (const account of accounts) {
|
|
508
|
+
const paymentsForAccount = allFetchedPayments.filter(
|
|
509
|
+
(payment) => (payment.direction === "OUTGOING" ? payment.debtorIban : payment.creditorIban) === account.iban
|
|
510
|
+
);
|
|
511
|
+
let lastSyncPayment;
|
|
512
|
+
lastSyncPayment = paymentsForAccount.filter(({ status }) => status !== "COMPLETED").sort(
|
|
513
|
+
(a, b) => (a.createdAt?.getTime() || 0) - (b.createdAt?.getTime() || 0)
|
|
514
|
+
)[0];
|
|
515
|
+
if (!lastSyncPayment) {
|
|
516
|
+
lastSyncPayment = paymentsForAccount.sort(
|
|
517
|
+
(a, b) => (b.createdAt?.getTime() || 0) - (a.createdAt?.getTime() || 0)
|
|
518
|
+
)[0];
|
|
519
|
+
}
|
|
520
|
+
if (lastSyncPayment.createdAt) {
|
|
521
|
+
await updateAccountLastSyncCommand(this.db, {
|
|
522
|
+
accountId: account.id,
|
|
523
|
+
lastSyncedAt: lastSyncPayment.createdAt
|
|
524
|
+
}).command.execute();
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
await this.pushToQueue(
|
|
528
|
+
this.env.QUEUE_BUS_QUEUE,
|
|
529
|
+
allFetchedPayments.map((payment) => ({
|
|
530
|
+
eventType: "BANK_PAYMENT",
|
|
531
|
+
bankPayment: payment,
|
|
532
|
+
metadata: {
|
|
533
|
+
correlationId: uuidv4(),
|
|
534
|
+
timestamp: (/* @__PURE__ */ new Date()).toDateString()
|
|
535
|
+
}
|
|
536
|
+
}))
|
|
537
|
+
);
|
|
538
|
+
}
|
|
539
|
+
async _initiateBankConnector({
|
|
540
|
+
connectorKey,
|
|
541
|
+
withAuth
|
|
542
|
+
}) {
|
|
543
|
+
if (!this.allowedProviders.includes(connectorKey)) {
|
|
544
|
+
throw createInternalError(null, {
|
|
545
|
+
message: `Invalid connector key: ${connectorKey}`
|
|
546
|
+
});
|
|
547
|
+
}
|
|
548
|
+
const accounts = await this._getAccounts();
|
|
549
|
+
const accountsForConnector = accounts.filter(
|
|
550
|
+
(acc) => acc.connectorKey === connectorKey
|
|
551
|
+
);
|
|
552
|
+
const accountsWithCredentials = await Promise.all(
|
|
553
|
+
accountsForConnector.map(async (acc) => {
|
|
554
|
+
const credentials = await getCredentialsByAccountId(this.db, {
|
|
555
|
+
accountId: acc.id
|
|
556
|
+
});
|
|
557
|
+
if (!credentials) {
|
|
558
|
+
throw createInternalError(null, {
|
|
559
|
+
message: `No credentials found for account ${acc.id}`
|
|
560
|
+
});
|
|
561
|
+
}
|
|
562
|
+
return {
|
|
563
|
+
currency: acc.currency,
|
|
564
|
+
iban: acc.iban,
|
|
565
|
+
token: credentials.value,
|
|
566
|
+
id: acc.id,
|
|
567
|
+
connectorKey: acc.connectorKey
|
|
568
|
+
};
|
|
569
|
+
})
|
|
570
|
+
);
|
|
571
|
+
this.bankConnector = initiateConnector({
|
|
572
|
+
bank: connectorKey,
|
|
573
|
+
connectedAccounts: accountsWithCredentials,
|
|
574
|
+
env: this.env
|
|
575
|
+
});
|
|
576
|
+
if (!withAuth) return;
|
|
577
|
+
await this.bankConnector.authenticate();
|
|
477
578
|
}
|
|
478
|
-
|
|
579
|
+
_accountFetchInterval(connectorKey) {
|
|
479
580
|
switch (connectorKey) {
|
|
480
581
|
case "ERSTE":
|
|
481
582
|
return ErsteConnector.FETCH_INTERVAL;
|
|
@@ -487,10 +588,19 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
487
588
|
return 0;
|
|
488
589
|
}
|
|
489
590
|
}
|
|
591
|
+
async getPayments(input) {
|
|
592
|
+
return this.handleAction(
|
|
593
|
+
{ data: input, schema: getPaymentsInputSchema },
|
|
594
|
+
{ successMessage: "Payments fetched successfully" },
|
|
595
|
+
async (pagination) => {
|
|
596
|
+
return await getPaymentsWithPaginationQuery(this.db, pagination);
|
|
597
|
+
}
|
|
598
|
+
);
|
|
599
|
+
}
|
|
490
600
|
async syncAccount(input) {
|
|
491
601
|
return this.handleAction(
|
|
492
602
|
{ data: input, schema: syncAccountInputSchema },
|
|
493
|
-
{ successMessage: "" },
|
|
603
|
+
{ successMessage: "Account synchronized successfully" },
|
|
494
604
|
async ({ accountId }) => {
|
|
495
605
|
const account = await getAccountByIdQuery(this.db, {
|
|
496
606
|
accountId
|
|
@@ -501,38 +611,40 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
501
611
|
message: "Account not found",
|
|
502
612
|
status: 404
|
|
503
613
|
});
|
|
504
|
-
await this.
|
|
505
|
-
accounts: [account]
|
|
506
|
-
});
|
|
614
|
+
await this._saveOrUpdatePayments([account]);
|
|
507
615
|
}
|
|
508
616
|
);
|
|
509
617
|
}
|
|
510
618
|
async syncAccounts(options) {
|
|
511
|
-
return this.handleAction(
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
const
|
|
521
|
-
|
|
522
|
-
)
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
619
|
+
return this.handleAction(
|
|
620
|
+
null,
|
|
621
|
+
{ successMessage: "Accounts synchronized successfully" },
|
|
622
|
+
async () => {
|
|
623
|
+
const accountsToSync = [];
|
|
624
|
+
let accounts = options?.accounts || [];
|
|
625
|
+
if (!accounts.length) {
|
|
626
|
+
accounts = await this._getAccounts();
|
|
627
|
+
}
|
|
628
|
+
for (const account of accounts.filter(
|
|
629
|
+
(acc) => !!!acc.connectorKey.includes("MOCK")
|
|
630
|
+
)) {
|
|
631
|
+
const accountFetchInterval = this._accountFetchInterval(
|
|
632
|
+
account.connectorKey
|
|
633
|
+
);
|
|
634
|
+
const now = Date.now();
|
|
635
|
+
const lastSyncTime = account.lastSyncedAt.getTime();
|
|
636
|
+
const intervalMs = accountFetchInterval * 1e3;
|
|
637
|
+
const shouldFetch = now - lastSyncTime >= intervalMs;
|
|
638
|
+
if (!shouldFetch) continue;
|
|
639
|
+
accountsToSync.push({
|
|
640
|
+
...account
|
|
641
|
+
});
|
|
642
|
+
}
|
|
643
|
+
console.log("ACCS TO SYNC", accountsToSync.length);
|
|
644
|
+
if (accountsToSync.length <= 0) return;
|
|
645
|
+
await this._saveOrUpdatePayments(accounts);
|
|
531
646
|
}
|
|
532
|
-
|
|
533
|
-
if (accountsToSync.length <= 0) return;
|
|
534
|
-
await this.saveOrUpdatePayments(accountsToSync);
|
|
535
|
-
});
|
|
647
|
+
);
|
|
536
648
|
}
|
|
537
649
|
async scheduled(controller) {
|
|
538
650
|
if (controller.cron === this.env.CRON_PAYMENTS_PROCESSING) {
|
|
@@ -547,7 +659,7 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
547
659
|
async updateBatchStatuses() {
|
|
548
660
|
const pendingBatches = await getAllPendingBatchesQuery(this.db);
|
|
549
661
|
const uniqueConnectors = /* @__PURE__ */ new Set();
|
|
550
|
-
const accounts = await this.
|
|
662
|
+
const accounts = await this._getAccounts();
|
|
551
663
|
for (const batch of pendingBatches) {
|
|
552
664
|
const connectorKey = accounts.find(
|
|
553
665
|
(acc) => acc.id === batch.accountId
|
|
@@ -588,53 +700,6 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
588
700
|
]);
|
|
589
701
|
console.log("Batch update completed");
|
|
590
702
|
}
|
|
591
|
-
// @action('initiate-bank-connector')
|
|
592
|
-
async initiateBankConnector(input) {
|
|
593
|
-
return this.handleAction(
|
|
594
|
-
{ data: input, schema: initiateConnectorInputSchema },
|
|
595
|
-
{ successMessage: "Bank connector initiated successfully" },
|
|
596
|
-
async ({ connectorKey, withAuth }) => {
|
|
597
|
-
if (!this.allowedProviders.includes(connectorKey)) {
|
|
598
|
-
throw createInternalError(null, {
|
|
599
|
-
message: `Invalid connector key: ${connectorKey}`
|
|
600
|
-
});
|
|
601
|
-
}
|
|
602
|
-
const accounts = await this.getAccounts();
|
|
603
|
-
const accountsForConnector = accounts.filter(
|
|
604
|
-
(acc) => acc.connectorKey === connectorKey
|
|
605
|
-
);
|
|
606
|
-
const accountsWithCredentials = await Promise.all(
|
|
607
|
-
accountsForConnector.map(async (acc) => {
|
|
608
|
-
const credentials = await getCredentialsByAccountId(this.db, {
|
|
609
|
-
accountId: acc.id
|
|
610
|
-
});
|
|
611
|
-
if (!credentials) {
|
|
612
|
-
throw createInternalError(null, {
|
|
613
|
-
message: `No credentials found for account ${acc.id}`
|
|
614
|
-
});
|
|
615
|
-
}
|
|
616
|
-
return {
|
|
617
|
-
currency: acc.currency,
|
|
618
|
-
iban: acc.iban,
|
|
619
|
-
token: credentials.value,
|
|
620
|
-
id: acc.id,
|
|
621
|
-
connectorKey: acc.connectorKey
|
|
622
|
-
};
|
|
623
|
-
})
|
|
624
|
-
);
|
|
625
|
-
this.bankConnector = initiateConnector({
|
|
626
|
-
bank: connectorKey,
|
|
627
|
-
connectedAccounts: accountsWithCredentials,
|
|
628
|
-
env: this.env
|
|
629
|
-
});
|
|
630
|
-
if (!withAuth) return;
|
|
631
|
-
await this.bankConnector.authenticate();
|
|
632
|
-
}
|
|
633
|
-
);
|
|
634
|
-
}
|
|
635
|
-
batchLimit(connectorKey) {
|
|
636
|
-
return 50;
|
|
637
|
-
}
|
|
638
703
|
async addPaymentsToBatch({
|
|
639
704
|
paymentsToBatch
|
|
640
705
|
}) {
|
|
@@ -644,9 +709,8 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
644
709
|
(payment) => {
|
|
645
710
|
return {
|
|
646
711
|
id: uuidv4(),
|
|
647
|
-
|
|
712
|
+
correlationId: payment.correlationId,
|
|
648
713
|
refId: payment.refId,
|
|
649
|
-
connectorKey: "MOCK",
|
|
650
714
|
amount: payment.amount,
|
|
651
715
|
direction: "OUTGOING",
|
|
652
716
|
paymentType: payment.paymentType,
|
|
@@ -658,16 +722,14 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
658
722
|
ss: payment.ss || null,
|
|
659
723
|
ks: payment.ks || null,
|
|
660
724
|
message: payment.message || null,
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
debtorAccountNumberWithBankCode: payment.debtorAccountNumberWithBankCode,
|
|
666
|
-
debtorIban: payment.debtorIban
|
|
725
|
+
creditor: payment.creditor,
|
|
726
|
+
creditorIban: payment.creditor.iban || null,
|
|
727
|
+
debtor: payment.debtor,
|
|
728
|
+
debtorIban: payment.debtor.iban || null
|
|
667
729
|
};
|
|
668
730
|
}
|
|
669
731
|
);
|
|
670
|
-
const accounts = await this.
|
|
732
|
+
const accounts = await this._getAccounts();
|
|
671
733
|
const { supportedPayments, unsupportedPayments } = seperateSupportedPayments(mappedPayments, accounts);
|
|
672
734
|
if (unsupportedPayments.length > 0) {
|
|
673
735
|
this.logError({ unsupportedPayments });
|
|
@@ -678,23 +740,16 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
678
740
|
bankPayment: {
|
|
679
741
|
...unsupported,
|
|
680
742
|
status: "FAILED",
|
|
681
|
-
statusReason: "UNSUPPORTED_ACCOUNT"
|
|
682
|
-
paymentType: unsupported.paymentType,
|
|
683
|
-
creditorAccountNumberWithBankCode: unsupported.creditorAccountNumberWithBankCode,
|
|
684
|
-
creditorIban: unsupported.creditorIban,
|
|
685
|
-
creditorHolderName: unsupported.creditorHolderName,
|
|
686
|
-
debtorAccountNumberWithBankCode: unsupported.debtorAccountNumberWithBankCode,
|
|
687
|
-
debtorIban: unsupported.debtorIban,
|
|
688
|
-
debtorHolderName: unsupported.debtorHolderName
|
|
743
|
+
statusReason: "UNSUPPORTED_ACCOUNT"
|
|
689
744
|
},
|
|
690
745
|
metadata: {
|
|
691
|
-
correlationId:
|
|
746
|
+
correlationId: unsupported.correlationId,
|
|
692
747
|
timestamp: (/* @__PURE__ */ new Date()).toDateString()
|
|
693
748
|
}
|
|
694
749
|
}))
|
|
695
750
|
);
|
|
696
751
|
}
|
|
697
|
-
for (const acc of
|
|
752
|
+
for (const acc of accounts) {
|
|
698
753
|
const newPayments = supportedPayments.filter(
|
|
699
754
|
(payment) => payment.debtorIban === acc.iban && payment.currency === acc.currency
|
|
700
755
|
).map((payment) => ({
|
|
@@ -712,7 +767,7 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
712
767
|
accountId: acc.id
|
|
713
768
|
});
|
|
714
769
|
const availableBatch = openBatches.find(
|
|
715
|
-
(batch) => batch.payments.length >=
|
|
770
|
+
(batch) => batch.payments.length >= acc.batchSizeLimit
|
|
716
771
|
);
|
|
717
772
|
this.log({
|
|
718
773
|
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`
|
|
@@ -748,7 +803,7 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
748
803
|
status: "PROCESSING"
|
|
749
804
|
}
|
|
750
805
|
}).command.execute();
|
|
751
|
-
await this.
|
|
806
|
+
await this._initiateBankConnector({ connectorKey });
|
|
752
807
|
if (!this.bankConnector) {
|
|
753
808
|
await upsertBatchCommand(this.db, {
|
|
754
809
|
batch: {
|
|
@@ -877,7 +932,7 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
877
932
|
{ data: input, schema: getAuthUriInputSchema },
|
|
878
933
|
{ successMessage: "Auth URI obtained." },
|
|
879
934
|
async ({ connectorKey }) => {
|
|
880
|
-
await this.
|
|
935
|
+
await this._initiateBankConnector({ connectorKey, withAuth: false });
|
|
881
936
|
const ott = uuidv4();
|
|
882
937
|
const { command: createOneTimeToken } = createOneTimeTokenCommand(
|
|
883
938
|
this.db,
|
|
@@ -915,14 +970,14 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
915
970
|
status: 400
|
|
916
971
|
});
|
|
917
972
|
}
|
|
918
|
-
await this.
|
|
973
|
+
await this._initiateBankConnector({
|
|
919
974
|
connectorKey: ottRow.refId
|
|
920
975
|
});
|
|
921
976
|
const { credentials, accounts } = await this.bankConnector.authorizeAccount({
|
|
922
977
|
urlParams
|
|
923
978
|
});
|
|
924
979
|
console.log("Bank connector initiated");
|
|
925
|
-
const alreadyExistingAccounts = (await this.
|
|
980
|
+
const alreadyExistingAccounts = (await this._getAccounts()).filter(
|
|
926
981
|
(acc) => acc.connectorKey === ottRow.refId && accounts.map((item) => item.iban).includes(acc.iban)
|
|
927
982
|
);
|
|
928
983
|
const upsertAccounts = accounts.map(
|
|
@@ -949,7 +1004,7 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
949
1004
|
...deleteCredentials,
|
|
950
1005
|
...createAccountCredentials
|
|
951
1006
|
]);
|
|
952
|
-
const fetchedAccounts = await this.
|
|
1007
|
+
const fetchedAccounts = await this._getAccounts();
|
|
953
1008
|
if (!fetchedAccounts)
|
|
954
1009
|
throw createInternalError(null, {
|
|
955
1010
|
message: "Account not found",
|
|
@@ -962,79 +1017,6 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
962
1017
|
}
|
|
963
1018
|
);
|
|
964
1019
|
}
|
|
965
|
-
async saveOrUpdatePayments(accounts) {
|
|
966
|
-
return this.handleAction(null, {}, async () => {
|
|
967
|
-
const allFetchedPayments = [];
|
|
968
|
-
const connectorKeys = new Set(
|
|
969
|
-
accounts.map(({ connectorKey }) => connectorKey)
|
|
970
|
-
);
|
|
971
|
-
for (const connectorKey of connectorKeys) {
|
|
972
|
-
await this.initiateBankConnector({ connectorKey });
|
|
973
|
-
for (const account of accounts.filter(
|
|
974
|
-
(acc) => acc.connectorKey === connectorKey
|
|
975
|
-
)) {
|
|
976
|
-
const payments = await this.bankConnector.getAllAccountPayments({
|
|
977
|
-
db: this.db,
|
|
978
|
-
env: this.env.ENVIRONMENT,
|
|
979
|
-
account
|
|
980
|
-
});
|
|
981
|
-
if (!payments || payments.length === 0) continue;
|
|
982
|
-
this.log(payments);
|
|
983
|
-
payments.forEach((payment) => {
|
|
984
|
-
payment.direction = getPaymentDirection(payment, account.iban);
|
|
985
|
-
});
|
|
986
|
-
allFetchedPayments.push(...payments);
|
|
987
|
-
}
|
|
988
|
-
}
|
|
989
|
-
if (allFetchedPayments.length < 1) return;
|
|
990
|
-
const bankRefIds = allFetchedPayments.map((payment) => payment.bankRefId).filter(Boolean);
|
|
991
|
-
const alreadyExistingPayments = await getPaymentsByBankRefIdsQuery(
|
|
992
|
-
this.db,
|
|
993
|
-
{ ids: bankRefIds }
|
|
994
|
-
);
|
|
995
|
-
const paymentsCommands = allFetchedPayments.map((payment) => {
|
|
996
|
-
const isAlreadyExisting = alreadyExistingPayments.some(
|
|
997
|
-
(existingPayment) => existingPayment.bankRefId === payment.bankRefId
|
|
998
|
-
);
|
|
999
|
-
if (isAlreadyExisting)
|
|
1000
|
-
return updatePaymentCommand(this.db, { payment }).command;
|
|
1001
|
-
return createPaymentCommand(this.db, { payment }).command;
|
|
1002
|
-
});
|
|
1003
|
-
await this.db.batch([paymentsCommands[0], ...paymentsCommands.slice(1)]);
|
|
1004
|
-
console.log("FETCHEDPAYMANETS TO SYNC", allFetchedPayments.length);
|
|
1005
|
-
for (const account of accounts) {
|
|
1006
|
-
const paymentsForAccount = allFetchedPayments.filter(
|
|
1007
|
-
(payment) => (payment.direction === "OUTGOING" ? payment.debtorIban : payment.creditorIban) === account.iban
|
|
1008
|
-
);
|
|
1009
|
-
let lastSyncPayment;
|
|
1010
|
-
lastSyncPayment = paymentsForAccount.filter(({ status }) => status !== "COMPLETED").sort(
|
|
1011
|
-
(a, b) => (a.createdAt?.getTime() || 0) - (b.createdAt?.getTime() || 0)
|
|
1012
|
-
)[0];
|
|
1013
|
-
if (!lastSyncPayment) {
|
|
1014
|
-
lastSyncPayment = paymentsForAccount.sort(
|
|
1015
|
-
(a, b) => (b.createdAt?.getTime() || 0) - (a.createdAt?.getTime() || 0)
|
|
1016
|
-
)[0];
|
|
1017
|
-
}
|
|
1018
|
-
if (lastSyncPayment.createdAt) {
|
|
1019
|
-
await updateAccountLastSyncCommand(this.db, {
|
|
1020
|
-
accountId: account.id,
|
|
1021
|
-
lastSyncedAt: lastSyncPayment.createdAt
|
|
1022
|
-
}).command.execute();
|
|
1023
|
-
}
|
|
1024
|
-
}
|
|
1025
|
-
await this.pushToQueue(
|
|
1026
|
-
this.env.QUEUE_BUS_QUEUE,
|
|
1027
|
-
allFetchedPayments.map((payment) => ({
|
|
1028
|
-
eventType: "BANK_PAYMENT",
|
|
1029
|
-
bankPayment: payment,
|
|
1030
|
-
metadata: {
|
|
1031
|
-
correlationId: uuidv4(),
|
|
1032
|
-
timestamp: (/* @__PURE__ */ new Date()).toDateString()
|
|
1033
|
-
}
|
|
1034
|
-
}))
|
|
1035
|
-
);
|
|
1036
|
-
});
|
|
1037
|
-
}
|
|
1038
1020
|
async simulateDeposit(input) {
|
|
1039
1021
|
return this.handleAction(
|
|
1040
1022
|
{ data: input, schema: simulateDepositInputSchema },
|
|
@@ -1115,7 +1097,6 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
1115
1097
|
accountId: account.id,
|
|
1116
1098
|
lastSyncedAt
|
|
1117
1099
|
}).command.execute();
|
|
1118
|
-
return {};
|
|
1119
1100
|
}
|
|
1120
1101
|
);
|
|
1121
1102
|
}
|
|
@@ -1132,9 +1113,33 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
1132
1113
|
);
|
|
1133
1114
|
}
|
|
1134
1115
|
async getBankAccounts() {
|
|
1135
|
-
return
|
|
1136
|
-
|
|
1137
|
-
|
|
1116
|
+
return this.handleAction(
|
|
1117
|
+
null,
|
|
1118
|
+
{ successMessage: "Bank accounts retrieved successfully" },
|
|
1119
|
+
async () => await this._getAccounts()
|
|
1120
|
+
);
|
|
1121
|
+
}
|
|
1122
|
+
async updateAccount(input) {
|
|
1123
|
+
return this.handleAction(
|
|
1124
|
+
{
|
|
1125
|
+
data: input,
|
|
1126
|
+
schema: updateAccountInputSchema
|
|
1127
|
+
},
|
|
1128
|
+
{ successMessage: "Account updated successfully" },
|
|
1129
|
+
async ({ account }) => {
|
|
1130
|
+
const updatedAccount = await upsertAccountCommand(this.db, {
|
|
1131
|
+
account
|
|
1132
|
+
}).command.execute().then(first);
|
|
1133
|
+
if (!updatedAccount) {
|
|
1134
|
+
throw createInternalError(null, {
|
|
1135
|
+
message: "Account not found",
|
|
1136
|
+
code: "ACCOUNT_NOT_FOUND",
|
|
1137
|
+
status: 404
|
|
1138
|
+
});
|
|
1139
|
+
}
|
|
1140
|
+
return updatedAccount;
|
|
1141
|
+
}
|
|
1142
|
+
);
|
|
1138
1143
|
}
|
|
1139
1144
|
async getBatches(input) {
|
|
1140
1145
|
return this.handleAction(
|
|
@@ -1176,9 +1181,6 @@ __decorateClass([
|
|
|
1176
1181
|
__decorateClass([
|
|
1177
1182
|
action("authorize-account")
|
|
1178
1183
|
], BankServiceBase.prototype, "authorizeAccount", 1);
|
|
1179
|
-
__decorateClass([
|
|
1180
|
-
action("save-or-update-payments")
|
|
1181
|
-
], BankServiceBase.prototype, "saveOrUpdatePayments", 1);
|
|
1182
1184
|
__decorateClass([
|
|
1183
1185
|
action("simulate-deposit")
|
|
1184
1186
|
], BankServiceBase.prototype, "simulateDeposit", 1);
|
|
@@ -1191,6 +1193,9 @@ __decorateClass([
|
|
|
1191
1193
|
__decorateClass([
|
|
1192
1194
|
action("get-bank-accounts")
|
|
1193
1195
|
], BankServiceBase.prototype, "getBankAccounts", 1);
|
|
1196
|
+
__decorateClass([
|
|
1197
|
+
action("update-account")
|
|
1198
|
+
], BankServiceBase.prototype, "updateAccount", 1);
|
|
1194
1199
|
__decorateClass([
|
|
1195
1200
|
action("getBatches")
|
|
1196
1201
|
], BankServiceBase.prototype, "getBatches", 1);
|