@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.mjs
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
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.BWcFhTu1.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.6WoCPIFy.mjs';
|
|
10
10
|
import 'drizzle-orm/sqlite-core';
|
|
11
|
-
import 'drizzle-zod';
|
|
12
11
|
import 'date-fns';
|
|
12
|
+
import 'drizzle-zod';
|
|
13
13
|
import 'drizzle-orm/relations';
|
|
14
14
|
|
|
15
15
|
const upsertAccountCommand = (db, { account }) => {
|
|
@@ -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({
|
|
@@ -377,10 +378,8 @@ const simulateDepositInputSchema = z.object({
|
|
|
377
378
|
bankingSs: z.string().max(10).optional(),
|
|
378
379
|
bankingKs: z.string().max(10).optional(),
|
|
379
380
|
message: z.string(),
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
debtorIban: z.string().max(34),
|
|
383
|
-
debtorHolderName: z.string(),
|
|
381
|
+
creditor: bankAccountMetadataSchema,
|
|
382
|
+
debtor: bankAccountMetadataSchema,
|
|
384
383
|
connectorKey: z.enum(CONNECTOR_KEYS)
|
|
385
384
|
});
|
|
386
385
|
|
|
@@ -389,11 +388,6 @@ const setLastSyncAtInputSchema = z.object({
|
|
|
389
388
|
lastSyncedAt: z.coerce.date()
|
|
390
389
|
});
|
|
391
390
|
|
|
392
|
-
const initiateConnectorInputSchema = z.object({
|
|
393
|
-
connectorKey: z.enum(CONNECTOR_KEYS),
|
|
394
|
-
withAuth: z.boolean().default(true).optional()
|
|
395
|
-
});
|
|
396
|
-
|
|
397
391
|
const ALLOWED_BATCH_FILTERS = {
|
|
398
392
|
ACCOUNT_ID: "filterBatchAccountId",
|
|
399
393
|
STATUS: "filterBatchStatus"
|
|
@@ -443,6 +437,10 @@ const syncAccountInputSchema = z.object({
|
|
|
443
437
|
accountId: z.uuid()
|
|
444
438
|
});
|
|
445
439
|
|
|
440
|
+
const updateAccountInputSchema = z.object({
|
|
441
|
+
account: accountInsertSchema
|
|
442
|
+
});
|
|
443
|
+
|
|
446
444
|
var __defProp = Object.defineProperty;
|
|
447
445
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
448
446
|
var __decorateClass = (decorators, target, key, kind) => {
|
|
@@ -460,22 +458,124 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
460
458
|
this.allowedProviders = config.allowedProviders;
|
|
461
459
|
this.db = drizzle(this.env.BANK_D1, { schema: tables });
|
|
462
460
|
}
|
|
463
|
-
|
|
464
|
-
return this.allowedProviders;
|
|
465
|
-
}
|
|
466
|
-
async getAccounts() {
|
|
461
|
+
async _getAccounts() {
|
|
467
462
|
return await getAllAccountsQuery(this.db);
|
|
468
463
|
}
|
|
469
|
-
async
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
{
|
|
473
|
-
|
|
474
|
-
|
|
464
|
+
async _saveOrUpdatePayments(accounts) {
|
|
465
|
+
const allFetchedPayments = [];
|
|
466
|
+
const connectorKeys = new Set(
|
|
467
|
+
accounts.map(({ connectorKey }) => connectorKey)
|
|
468
|
+
);
|
|
469
|
+
for (const connectorKey of connectorKeys) {
|
|
470
|
+
await this._initiateBankConnector({ connectorKey });
|
|
471
|
+
for (const account of accounts.filter(
|
|
472
|
+
(acc) => acc.connectorKey === connectorKey
|
|
473
|
+
)) {
|
|
474
|
+
const payments = await this.bankConnector.getAllAccountPayments({
|
|
475
|
+
db: this.db,
|
|
476
|
+
env: this.env.ENVIRONMENT,
|
|
477
|
+
account
|
|
478
|
+
});
|
|
479
|
+
if (!payments || payments.length === 0) continue;
|
|
480
|
+
this.log(payments);
|
|
481
|
+
payments.forEach((payment) => {
|
|
482
|
+
payment.direction = getPaymentDirection(payment, account.iban);
|
|
483
|
+
});
|
|
484
|
+
allFetchedPayments.push(...payments);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
if (allFetchedPayments.length < 1) return;
|
|
488
|
+
const bankRefIds = allFetchedPayments.map((payment) => payment.bankRefId).filter(Boolean);
|
|
489
|
+
const alreadyExistingPayments = await getPaymentsByBankRefIdsQuery(
|
|
490
|
+
this.db,
|
|
491
|
+
{
|
|
492
|
+
ids: bankRefIds
|
|
475
493
|
}
|
|
476
494
|
);
|
|
495
|
+
const paymentsCommands = allFetchedPayments.map((payment) => {
|
|
496
|
+
const isAlreadyExisting = alreadyExistingPayments.some(
|
|
497
|
+
(existingPayment) => existingPayment.bankRefId === payment.bankRefId
|
|
498
|
+
);
|
|
499
|
+
if (isAlreadyExisting)
|
|
500
|
+
return updatePaymentCommand(this.db, { payment }).command;
|
|
501
|
+
return createPaymentCommand(this.db, { payment }).command;
|
|
502
|
+
});
|
|
503
|
+
await this.db.batch([paymentsCommands[0], ...paymentsCommands.slice(1)]);
|
|
504
|
+
console.log("FETCHEDPAYMANETS TO SYNC", allFetchedPayments.length);
|
|
505
|
+
for (const account of accounts) {
|
|
506
|
+
const paymentsForAccount = allFetchedPayments.filter(
|
|
507
|
+
(payment) => (payment.direction === "OUTGOING" ? payment.debtorIban : payment.creditorIban) === account.iban
|
|
508
|
+
);
|
|
509
|
+
let lastSyncPayment;
|
|
510
|
+
lastSyncPayment = paymentsForAccount.filter(({ status }) => status !== "COMPLETED").sort(
|
|
511
|
+
(a, b) => (a.createdAt?.getTime() || 0) - (b.createdAt?.getTime() || 0)
|
|
512
|
+
)[0];
|
|
513
|
+
if (!lastSyncPayment) {
|
|
514
|
+
lastSyncPayment = paymentsForAccount.sort(
|
|
515
|
+
(a, b) => (b.createdAt?.getTime() || 0) - (a.createdAt?.getTime() || 0)
|
|
516
|
+
)[0];
|
|
517
|
+
}
|
|
518
|
+
if (lastSyncPayment.createdAt) {
|
|
519
|
+
await updateAccountLastSyncCommand(this.db, {
|
|
520
|
+
accountId: account.id,
|
|
521
|
+
lastSyncedAt: lastSyncPayment.createdAt
|
|
522
|
+
}).command.execute();
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
await this.pushToQueue(
|
|
526
|
+
this.env.QUEUE_BUS_QUEUE,
|
|
527
|
+
allFetchedPayments.map((payment) => ({
|
|
528
|
+
eventType: "BANK_PAYMENT",
|
|
529
|
+
eventSignal: "created",
|
|
530
|
+
bankPayment: payment,
|
|
531
|
+
metadata: {
|
|
532
|
+
correlationId: uuidv4(),
|
|
533
|
+
timestamp: (/* @__PURE__ */ new Date()).toDateString()
|
|
534
|
+
}
|
|
535
|
+
}))
|
|
536
|
+
);
|
|
537
|
+
}
|
|
538
|
+
async _initiateBankConnector({
|
|
539
|
+
connectorKey,
|
|
540
|
+
withAuth
|
|
541
|
+
}) {
|
|
542
|
+
if (!this.allowedProviders.includes(connectorKey)) {
|
|
543
|
+
throw createInternalError(null, {
|
|
544
|
+
message: `Invalid connector key: ${connectorKey}`
|
|
545
|
+
});
|
|
546
|
+
}
|
|
547
|
+
const accounts = await this._getAccounts();
|
|
548
|
+
const accountsForConnector = accounts.filter(
|
|
549
|
+
(acc) => acc.connectorKey === connectorKey
|
|
550
|
+
);
|
|
551
|
+
const accountsWithCredentials = await Promise.all(
|
|
552
|
+
accountsForConnector.map(async (acc) => {
|
|
553
|
+
const credentials = await getCredentialsByAccountId(this.db, {
|
|
554
|
+
accountId: acc.id
|
|
555
|
+
});
|
|
556
|
+
if (!credentials) {
|
|
557
|
+
throw createInternalError(null, {
|
|
558
|
+
message: `No credentials found for account ${acc.id}`
|
|
559
|
+
});
|
|
560
|
+
}
|
|
561
|
+
return {
|
|
562
|
+
currency: acc.currency,
|
|
563
|
+
iban: acc.iban,
|
|
564
|
+
token: credentials.value,
|
|
565
|
+
id: acc.id,
|
|
566
|
+
connectorKey: acc.connectorKey
|
|
567
|
+
};
|
|
568
|
+
})
|
|
569
|
+
);
|
|
570
|
+
this.bankConnector = initiateConnector({
|
|
571
|
+
bank: connectorKey,
|
|
572
|
+
connectedAccounts: accountsWithCredentials,
|
|
573
|
+
env: this.env
|
|
574
|
+
});
|
|
575
|
+
if (!withAuth) return;
|
|
576
|
+
await this.bankConnector.authenticate();
|
|
477
577
|
}
|
|
478
|
-
|
|
578
|
+
_accountFetchInterval(connectorKey) {
|
|
479
579
|
switch (connectorKey) {
|
|
480
580
|
case "ERSTE":
|
|
481
581
|
return ErsteConnector.FETCH_INTERVAL;
|
|
@@ -487,10 +587,19 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
487
587
|
return 0;
|
|
488
588
|
}
|
|
489
589
|
}
|
|
590
|
+
async getPayments(input) {
|
|
591
|
+
return this.handleAction(
|
|
592
|
+
{ data: input, schema: getPaymentsInputSchema },
|
|
593
|
+
{ successMessage: "Payments fetched successfully" },
|
|
594
|
+
async (pagination) => {
|
|
595
|
+
return await getPaymentsWithPaginationQuery(this.db, pagination);
|
|
596
|
+
}
|
|
597
|
+
);
|
|
598
|
+
}
|
|
490
599
|
async syncAccount(input) {
|
|
491
600
|
return this.handleAction(
|
|
492
601
|
{ data: input, schema: syncAccountInputSchema },
|
|
493
|
-
{ successMessage: "" },
|
|
602
|
+
{ successMessage: "Account synchronized successfully" },
|
|
494
603
|
async ({ accountId }) => {
|
|
495
604
|
const account = await getAccountByIdQuery(this.db, {
|
|
496
605
|
accountId
|
|
@@ -501,38 +610,40 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
501
610
|
message: "Account not found",
|
|
502
611
|
status: 404
|
|
503
612
|
});
|
|
504
|
-
await this.
|
|
505
|
-
accounts: [account]
|
|
506
|
-
});
|
|
613
|
+
await this._saveOrUpdatePayments([account]);
|
|
507
614
|
}
|
|
508
615
|
);
|
|
509
616
|
}
|
|
510
617
|
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
|
-
|
|
618
|
+
return this.handleAction(
|
|
619
|
+
null,
|
|
620
|
+
{ successMessage: "Accounts synchronized successfully" },
|
|
621
|
+
async () => {
|
|
622
|
+
const accountsToSync = [];
|
|
623
|
+
let accounts = options?.accounts || [];
|
|
624
|
+
if (!accounts.length) {
|
|
625
|
+
accounts = await this._getAccounts();
|
|
626
|
+
}
|
|
627
|
+
for (const account of accounts.filter(
|
|
628
|
+
(acc) => !!!acc.connectorKey.includes("MOCK")
|
|
629
|
+
)) {
|
|
630
|
+
const accountFetchInterval = this._accountFetchInterval(
|
|
631
|
+
account.connectorKey
|
|
632
|
+
);
|
|
633
|
+
const now = Date.now();
|
|
634
|
+
const lastSyncTime = account.lastSyncedAt.getTime();
|
|
635
|
+
const intervalMs = accountFetchInterval * 1e3;
|
|
636
|
+
const shouldFetch = now - lastSyncTime >= intervalMs;
|
|
637
|
+
if (!shouldFetch) continue;
|
|
638
|
+
accountsToSync.push({
|
|
639
|
+
...account
|
|
640
|
+
});
|
|
641
|
+
}
|
|
642
|
+
console.log("ACCS TO SYNC", accountsToSync.length);
|
|
643
|
+
if (accountsToSync.length <= 0) return;
|
|
644
|
+
await this._saveOrUpdatePayments(accounts);
|
|
531
645
|
}
|
|
532
|
-
|
|
533
|
-
if (accountsToSync.length <= 0) return;
|
|
534
|
-
await this.saveOrUpdatePayments(accountsToSync);
|
|
535
|
-
});
|
|
646
|
+
);
|
|
536
647
|
}
|
|
537
648
|
async scheduled(controller) {
|
|
538
649
|
if (controller.cron === this.env.CRON_PAYMENTS_PROCESSING) {
|
|
@@ -547,7 +658,7 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
547
658
|
async updateBatchStatuses() {
|
|
548
659
|
const pendingBatches = await getAllPendingBatchesQuery(this.db);
|
|
549
660
|
const uniqueConnectors = /* @__PURE__ */ new Set();
|
|
550
|
-
const accounts = await this.
|
|
661
|
+
const accounts = await this._getAccounts();
|
|
551
662
|
for (const batch of pendingBatches) {
|
|
552
663
|
const connectorKey = accounts.find(
|
|
553
664
|
(acc) => acc.id === batch.accountId
|
|
@@ -588,53 +699,6 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
588
699
|
]);
|
|
589
700
|
console.log("Batch update completed");
|
|
590
701
|
}
|
|
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
702
|
async addPaymentsToBatch({
|
|
639
703
|
paymentsToBatch
|
|
640
704
|
}) {
|
|
@@ -644,9 +708,8 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
644
708
|
(payment) => {
|
|
645
709
|
return {
|
|
646
710
|
id: uuidv4(),
|
|
647
|
-
|
|
711
|
+
correlationId: payment.correlationId,
|
|
648
712
|
refId: payment.refId,
|
|
649
|
-
connectorKey: "MOCK",
|
|
650
713
|
amount: payment.amount,
|
|
651
714
|
direction: "OUTGOING",
|
|
652
715
|
paymentType: payment.paymentType,
|
|
@@ -658,16 +721,14 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
658
721
|
ss: payment.ss || null,
|
|
659
722
|
ks: payment.ks || null,
|
|
660
723
|
message: payment.message || null,
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
debtorAccountNumberWithBankCode: payment.debtorAccountNumberWithBankCode,
|
|
666
|
-
debtorIban: payment.debtorIban
|
|
724
|
+
creditor: payment.creditor,
|
|
725
|
+
creditorIban: payment.creditor.iban || null,
|
|
726
|
+
debtor: payment.debtor,
|
|
727
|
+
debtorIban: payment.debtor.iban || null
|
|
667
728
|
};
|
|
668
729
|
}
|
|
669
730
|
);
|
|
670
|
-
const accounts = await this.
|
|
731
|
+
const accounts = await this._getAccounts();
|
|
671
732
|
const { supportedPayments, unsupportedPayments } = seperateSupportedPayments(mappedPayments, accounts);
|
|
672
733
|
if (unsupportedPayments.length > 0) {
|
|
673
734
|
this.logError({ unsupportedPayments });
|
|
@@ -678,23 +739,17 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
678
739
|
bankPayment: {
|
|
679
740
|
...unsupported,
|
|
680
741
|
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
|
|
742
|
+
statusReason: "UNSUPPORTED_ACCOUNT"
|
|
689
743
|
},
|
|
744
|
+
eventSignal: "failed",
|
|
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 },
|
|
@@ -1046,14 +1028,12 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
1046
1028
|
bankingSs,
|
|
1047
1029
|
bankingKs,
|
|
1048
1030
|
message,
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
debtorIban,
|
|
1052
|
-
debtorHolderName,
|
|
1031
|
+
creditor,
|
|
1032
|
+
debtor,
|
|
1053
1033
|
connectorKey
|
|
1054
1034
|
}) => {
|
|
1055
1035
|
const account = await getAccountByIbanQuery(this.db, {
|
|
1056
|
-
iban:
|
|
1036
|
+
iban: debtor.iban
|
|
1057
1037
|
});
|
|
1058
1038
|
if (!account)
|
|
1059
1039
|
throw createInternalError(null, {
|
|
@@ -1063,6 +1043,7 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
1063
1043
|
});
|
|
1064
1044
|
const payment = {
|
|
1065
1045
|
id: uuidv4(),
|
|
1046
|
+
correlationId: uuidv4(),
|
|
1066
1047
|
amount,
|
|
1067
1048
|
connectorKey,
|
|
1068
1049
|
accountId: account.id,
|
|
@@ -1077,19 +1058,20 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
1077
1058
|
ss: bankingSs,
|
|
1078
1059
|
ks: bankingKs,
|
|
1079
1060
|
message,
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1061
|
+
creditor,
|
|
1062
|
+
creditorIban: creditor.iban,
|
|
1063
|
+
debtor,
|
|
1064
|
+
debtorIban: debtor.iban
|
|
1084
1065
|
};
|
|
1085
1066
|
const { command } = createPaymentCommand(this.db, { payment });
|
|
1086
1067
|
const createdPayment = await command.execute().then(first);
|
|
1087
1068
|
this.logQueuePush({ payment, isPaymentExecuted: true });
|
|
1088
1069
|
await this.pushToQueue(this.env.QUEUE_BUS_QUEUE, {
|
|
1089
1070
|
eventType: "BANK_PAYMENT",
|
|
1071
|
+
eventSignal: "completed",
|
|
1090
1072
|
bankPayment: createdPayment,
|
|
1091
1073
|
metadata: {
|
|
1092
|
-
correlationId: createdPayment.
|
|
1074
|
+
correlationId: createdPayment.correlationId,
|
|
1093
1075
|
timestamp: (/* @__PURE__ */ new Date()).toDateString()
|
|
1094
1076
|
}
|
|
1095
1077
|
});
|
|
@@ -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);
|