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