@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/database/schema.cjs
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export { f as account, g as accountCredentials, c as batch, o as ott, d as payment, e as paymentRelations } from '../shared/bank.
|
|
1
|
+
export { f as account, g as accountCredentials, c as batch, o as ott, d as payment, e as paymentRelations } from '../shared/bank.PvYf5Bqd.cjs';
|
|
2
2
|
import 'drizzle-orm/sqlite-core';
|
|
3
3
|
import 'drizzle-orm';
|
|
4
4
|
import 'zod';
|
|
5
|
+
import '@develit-io/backend-sdk';
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export { f as account, g as accountCredentials, c as batch, o as ott, d as payment, e as paymentRelations } from '../shared/bank.
|
|
1
|
+
export { f as account, g as accountCredentials, c as batch, o as ott, d as payment, e as paymentRelations } from '../shared/bank.PvYf5Bqd.mjs';
|
|
2
2
|
import 'drizzle-orm/sqlite-core';
|
|
3
3
|
import 'drizzle-orm';
|
|
4
4
|
import 'zod';
|
|
5
|
+
import '@develit-io/backend-sdk';
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export { f as account, g as accountCredentials, c as batch, o as ott, d as payment, e as paymentRelations } from '../shared/bank.
|
|
1
|
+
export { f as account, g as accountCredentials, c as batch, o as ott, d as payment, e as paymentRelations } from '../shared/bank.PvYf5Bqd.js';
|
|
2
2
|
import 'drizzle-orm/sqlite-core';
|
|
3
3
|
import 'drizzle-orm';
|
|
4
4
|
import 'zod';
|
|
5
|
+
import '@develit-io/backend-sdk';
|
package/dist/database/schema.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { D as account, G as accountCredentials, w as batch, z as ott, x as payment, y as paymentRelations } from '../shared/bank.C4RJkRzZ.mjs';
|
|
2
2
|
import '@develit-io/backend-sdk';
|
|
3
3
|
import 'drizzle-orm/sqlite-core';
|
|
4
4
|
import 'drizzle-orm';
|
package/dist/export/worker.cjs
CHANGED
|
@@ -5,12 +5,12 @@ 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.Cw5xzUgM.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.DSXZph4D.cjs');
|
|
14
14
|
require('drizzle-orm/sqlite-core');
|
|
15
15
|
require('drizzle-zod');
|
|
16
16
|
require('date-fns');
|
|
@@ -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({
|
|
@@ -393,11 +394,6 @@ const setLastSyncAtInputSchema = zod.z.object({
|
|
|
393
394
|
lastSyncedAt: zod.z.coerce.date()
|
|
394
395
|
});
|
|
395
396
|
|
|
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
397
|
const ALLOWED_BATCH_FILTERS = {
|
|
402
398
|
ACCOUNT_ID: "filterBatchAccountId",
|
|
403
399
|
STATUS: "filterBatchStatus"
|
|
@@ -447,6 +443,10 @@ const syncAccountInputSchema = zod.z.object({
|
|
|
447
443
|
accountId: zod.z.uuid()
|
|
448
444
|
});
|
|
449
445
|
|
|
446
|
+
const updateAccountInputSchema = zod.z.object({
|
|
447
|
+
account: database_schema.accountInsertSchema
|
|
448
|
+
});
|
|
449
|
+
|
|
450
450
|
var __defProp = Object.defineProperty;
|
|
451
451
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
452
452
|
var __decorateClass = (decorators, target, key, kind) => {
|
|
@@ -464,22 +464,123 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
|
|
|
464
464
|
this.allowedProviders = config.allowedProviders;
|
|
465
465
|
this.db = d1.drizzle(this.env.BANK_D1, { schema: database_schema.tables });
|
|
466
466
|
}
|
|
467
|
-
|
|
468
|
-
return this.allowedProviders;
|
|
469
|
-
}
|
|
470
|
-
async getAccounts() {
|
|
467
|
+
async _getAccounts() {
|
|
471
468
|
return await getAllAccountsQuery(this.db);
|
|
472
469
|
}
|
|
473
|
-
async
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
{
|
|
477
|
-
|
|
478
|
-
|
|
470
|
+
async _saveOrUpdatePayments(accounts) {
|
|
471
|
+
const allFetchedPayments = [];
|
|
472
|
+
const connectorKeys = new Set(
|
|
473
|
+
accounts.map(({ connectorKey }) => connectorKey)
|
|
474
|
+
);
|
|
475
|
+
for (const connectorKey of connectorKeys) {
|
|
476
|
+
await this._initiateBankConnector({ connectorKey });
|
|
477
|
+
for (const account of accounts.filter(
|
|
478
|
+
(acc) => acc.connectorKey === connectorKey
|
|
479
|
+
)) {
|
|
480
|
+
const payments = await this.bankConnector.getAllAccountPayments({
|
|
481
|
+
db: this.db,
|
|
482
|
+
env: this.env.ENVIRONMENT,
|
|
483
|
+
account
|
|
484
|
+
});
|
|
485
|
+
if (!payments || payments.length === 0) continue;
|
|
486
|
+
this.log(payments);
|
|
487
|
+
payments.forEach((payment) => {
|
|
488
|
+
payment.direction = database_schema.getPaymentDirection(payment, account.iban);
|
|
489
|
+
});
|
|
490
|
+
allFetchedPayments.push(...payments);
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
if (allFetchedPayments.length < 1) return;
|
|
494
|
+
const bankRefIds = allFetchedPayments.map((payment) => payment.bankRefId).filter(Boolean);
|
|
495
|
+
const alreadyExistingPayments = await getPaymentsByBankRefIdsQuery(
|
|
496
|
+
this.db,
|
|
497
|
+
{
|
|
498
|
+
ids: bankRefIds
|
|
479
499
|
}
|
|
480
500
|
);
|
|
501
|
+
const paymentsCommands = allFetchedPayments.map((payment) => {
|
|
502
|
+
const isAlreadyExisting = alreadyExistingPayments.some(
|
|
503
|
+
(existingPayment) => existingPayment.bankRefId === payment.bankRefId
|
|
504
|
+
);
|
|
505
|
+
if (isAlreadyExisting)
|
|
506
|
+
return updatePaymentCommand(this.db, { payment }).command;
|
|
507
|
+
return createPaymentCommand(this.db, { payment }).command;
|
|
508
|
+
});
|
|
509
|
+
await this.db.batch([paymentsCommands[0], ...paymentsCommands.slice(1)]);
|
|
510
|
+
console.log("FETCHEDPAYMANETS TO SYNC", allFetchedPayments.length);
|
|
511
|
+
for (const account of accounts) {
|
|
512
|
+
const paymentsForAccount = allFetchedPayments.filter(
|
|
513
|
+
(payment) => (payment.direction === "OUTGOING" ? payment.debtorIban : payment.creditorIban) === account.iban
|
|
514
|
+
);
|
|
515
|
+
let lastSyncPayment;
|
|
516
|
+
lastSyncPayment = paymentsForAccount.filter(({ status }) => status !== "COMPLETED").sort(
|
|
517
|
+
(a, b) => (a.createdAt?.getTime() || 0) - (b.createdAt?.getTime() || 0)
|
|
518
|
+
)[0];
|
|
519
|
+
if (!lastSyncPayment) {
|
|
520
|
+
lastSyncPayment = paymentsForAccount.sort(
|
|
521
|
+
(a, b) => (b.createdAt?.getTime() || 0) - (a.createdAt?.getTime() || 0)
|
|
522
|
+
)[0];
|
|
523
|
+
}
|
|
524
|
+
if (lastSyncPayment.createdAt) {
|
|
525
|
+
await updateAccountLastSyncCommand(this.db, {
|
|
526
|
+
accountId: account.id,
|
|
527
|
+
lastSyncedAt: lastSyncPayment.createdAt
|
|
528
|
+
}).command.execute();
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
await this.pushToQueue(
|
|
532
|
+
this.env.QUEUE_BUS_QUEUE,
|
|
533
|
+
allFetchedPayments.map((payment) => ({
|
|
534
|
+
eventType: "BANK_PAYMENT",
|
|
535
|
+
bankPayment: payment,
|
|
536
|
+
metadata: {
|
|
537
|
+
correlationId: backendSdk.uuidv4(),
|
|
538
|
+
timestamp: (/* @__PURE__ */ new Date()).toDateString()
|
|
539
|
+
}
|
|
540
|
+
}))
|
|
541
|
+
);
|
|
542
|
+
}
|
|
543
|
+
async _initiateBankConnector({
|
|
544
|
+
connectorKey,
|
|
545
|
+
withAuth
|
|
546
|
+
}) {
|
|
547
|
+
if (!this.allowedProviders.includes(connectorKey)) {
|
|
548
|
+
throw backendSdk.createInternalError(null, {
|
|
549
|
+
message: `Invalid connector key: ${connectorKey}`
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
const accounts = await this._getAccounts();
|
|
553
|
+
const accountsForConnector = accounts.filter(
|
|
554
|
+
(acc) => acc.connectorKey === connectorKey
|
|
555
|
+
);
|
|
556
|
+
const accountsWithCredentials = await Promise.all(
|
|
557
|
+
accountsForConnector.map(async (acc) => {
|
|
558
|
+
const credentials = await getCredentialsByAccountId(this.db, {
|
|
559
|
+
accountId: acc.id
|
|
560
|
+
});
|
|
561
|
+
if (!credentials) {
|
|
562
|
+
throw backendSdk.createInternalError(null, {
|
|
563
|
+
message: `No credentials found for account ${acc.id}`
|
|
564
|
+
});
|
|
565
|
+
}
|
|
566
|
+
return {
|
|
567
|
+
currency: acc.currency,
|
|
568
|
+
iban: acc.iban,
|
|
569
|
+
token: credentials.value,
|
|
570
|
+
id: acc.id,
|
|
571
|
+
connectorKey: acc.connectorKey
|
|
572
|
+
};
|
|
573
|
+
})
|
|
574
|
+
);
|
|
575
|
+
this.bankConnector = initiateConnector({
|
|
576
|
+
bank: connectorKey,
|
|
577
|
+
connectedAccounts: accountsWithCredentials,
|
|
578
|
+
env: this.env
|
|
579
|
+
});
|
|
580
|
+
if (!withAuth) return;
|
|
581
|
+
await this.bankConnector.authenticate();
|
|
481
582
|
}
|
|
482
|
-
|
|
583
|
+
_accountFetchInterval(connectorKey) {
|
|
483
584
|
switch (connectorKey) {
|
|
484
585
|
case "ERSTE":
|
|
485
586
|
return database_schema.ErsteConnector.FETCH_INTERVAL;
|
|
@@ -491,10 +592,19 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
|
|
|
491
592
|
return 0;
|
|
492
593
|
}
|
|
493
594
|
}
|
|
595
|
+
async getPayments(input) {
|
|
596
|
+
return this.handleAction(
|
|
597
|
+
{ data: input, schema: getPaymentsInputSchema },
|
|
598
|
+
{ successMessage: "Payments fetched successfully" },
|
|
599
|
+
async (pagination) => {
|
|
600
|
+
return await getPaymentsWithPaginationQuery(this.db, pagination);
|
|
601
|
+
}
|
|
602
|
+
);
|
|
603
|
+
}
|
|
494
604
|
async syncAccount(input) {
|
|
495
605
|
return this.handleAction(
|
|
496
606
|
{ data: input, schema: syncAccountInputSchema },
|
|
497
|
-
{ successMessage: "" },
|
|
607
|
+
{ successMessage: "Account synchronized successfully" },
|
|
498
608
|
async ({ accountId }) => {
|
|
499
609
|
const account = await getAccountByIdQuery(this.db, {
|
|
500
610
|
accountId
|
|
@@ -505,38 +615,40 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
|
|
|
505
615
|
message: "Account not found",
|
|
506
616
|
status: 404
|
|
507
617
|
});
|
|
508
|
-
await this.
|
|
509
|
-
accounts: [account]
|
|
510
|
-
});
|
|
618
|
+
await this._saveOrUpdatePayments([account]);
|
|
511
619
|
}
|
|
512
620
|
);
|
|
513
621
|
}
|
|
514
622
|
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
|
-
|
|
623
|
+
return this.handleAction(
|
|
624
|
+
null,
|
|
625
|
+
{ successMessage: "Accounts synchronized successfully" },
|
|
626
|
+
async () => {
|
|
627
|
+
const accountsToSync = [];
|
|
628
|
+
let accounts = options?.accounts || [];
|
|
629
|
+
if (!accounts.length) {
|
|
630
|
+
accounts = await this._getAccounts();
|
|
631
|
+
}
|
|
632
|
+
for (const account of accounts.filter(
|
|
633
|
+
(acc) => !!!acc.connectorKey.includes("MOCK")
|
|
634
|
+
)) {
|
|
635
|
+
const accountFetchInterval = this._accountFetchInterval(
|
|
636
|
+
account.connectorKey
|
|
637
|
+
);
|
|
638
|
+
const now = Date.now();
|
|
639
|
+
const lastSyncTime = account.lastSyncedAt.getTime();
|
|
640
|
+
const intervalMs = accountFetchInterval * 1e3;
|
|
641
|
+
const shouldFetch = now - lastSyncTime >= intervalMs;
|
|
642
|
+
if (!shouldFetch) continue;
|
|
643
|
+
accountsToSync.push({
|
|
644
|
+
...account
|
|
645
|
+
});
|
|
646
|
+
}
|
|
647
|
+
console.log("ACCS TO SYNC", accountsToSync.length);
|
|
648
|
+
if (accountsToSync.length <= 0) return;
|
|
649
|
+
await this._saveOrUpdatePayments(accounts);
|
|
535
650
|
}
|
|
536
|
-
|
|
537
|
-
if (accountsToSync.length <= 0) return;
|
|
538
|
-
await this.saveOrUpdatePayments(accountsToSync);
|
|
539
|
-
});
|
|
651
|
+
);
|
|
540
652
|
}
|
|
541
653
|
async scheduled(controller) {
|
|
542
654
|
if (controller.cron === this.env.CRON_PAYMENTS_PROCESSING) {
|
|
@@ -551,7 +663,7 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
|
|
|
551
663
|
async updateBatchStatuses() {
|
|
552
664
|
const pendingBatches = await getAllPendingBatchesQuery(this.db);
|
|
553
665
|
const uniqueConnectors = /* @__PURE__ */ new Set();
|
|
554
|
-
const accounts = await this.
|
|
666
|
+
const accounts = await this._getAccounts();
|
|
555
667
|
for (const batch of pendingBatches) {
|
|
556
668
|
const connectorKey = accounts.find(
|
|
557
669
|
(acc) => acc.id === batch.accountId
|
|
@@ -592,53 +704,6 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
|
|
|
592
704
|
]);
|
|
593
705
|
console.log("Batch update completed");
|
|
594
706
|
}
|
|
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
707
|
async addPaymentsToBatch({
|
|
643
708
|
paymentsToBatch
|
|
644
709
|
}) {
|
|
@@ -648,9 +713,8 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
|
|
|
648
713
|
(payment) => {
|
|
649
714
|
return {
|
|
650
715
|
id: backendSdk.uuidv4(),
|
|
651
|
-
|
|
716
|
+
correlationId: payment.correlationId,
|
|
652
717
|
refId: payment.refId,
|
|
653
|
-
connectorKey: "MOCK",
|
|
654
718
|
amount: payment.amount,
|
|
655
719
|
direction: "OUTGOING",
|
|
656
720
|
paymentType: payment.paymentType,
|
|
@@ -662,16 +726,14 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
|
|
|
662
726
|
ss: payment.ss || null,
|
|
663
727
|
ks: payment.ks || null,
|
|
664
728
|
message: payment.message || null,
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
debtorAccountNumberWithBankCode: payment.debtorAccountNumberWithBankCode,
|
|
670
|
-
debtorIban: payment.debtorIban
|
|
729
|
+
creditor: payment.creditor,
|
|
730
|
+
creditorIban: payment.creditor.iban || null,
|
|
731
|
+
debtor: payment.debtor,
|
|
732
|
+
debtorIban: payment.debtor.iban || null
|
|
671
733
|
};
|
|
672
734
|
}
|
|
673
735
|
);
|
|
674
|
-
const accounts = await this.
|
|
736
|
+
const accounts = await this._getAccounts();
|
|
675
737
|
const { supportedPayments, unsupportedPayments } = seperateSupportedPayments(mappedPayments, accounts);
|
|
676
738
|
if (unsupportedPayments.length > 0) {
|
|
677
739
|
this.logError({ unsupportedPayments });
|
|
@@ -682,23 +744,16 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
|
|
|
682
744
|
bankPayment: {
|
|
683
745
|
...unsupported,
|
|
684
746
|
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
|
|
747
|
+
statusReason: "UNSUPPORTED_ACCOUNT"
|
|
693
748
|
},
|
|
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 },
|
|
@@ -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);
|