@develit-services/bank 0.0.28 → 0.0.29
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 +762 -575
- package/dist/export/worker.d.cts +52 -12
- package/dist/export/worker.d.mts +52 -12
- package/dist/export/worker.d.ts +52 -12
- package/dist/export/worker.mjs +732 -545
- package/dist/export/wrangler.cjs +1 -1
- package/dist/export/wrangler.d.cts +2 -3
- package/dist/export/wrangler.d.mts +2 -3
- package/dist/export/wrangler.d.ts +2 -3
- package/dist/export/wrangler.mjs +1 -1
- package/dist/shared/{bank.BuNG2S8h.d.cts → bank.07oMM145.d.cts} +528 -11
- package/dist/shared/{bank.BuNG2S8h.d.mts → bank.07oMM145.d.mts} +528 -11
- package/dist/shared/{bank.BuNG2S8h.d.ts → bank.07oMM145.d.ts} +528 -11
- package/dist/shared/bank.5CiXtVIb.mjs +9 -0
- 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.BeJh7l2V.cjs +11 -0
- package/dist/shared/bank.By8Vh0l5.d.ts +1648 -0
- package/dist/shared/bank.CWt0unt2.d.cts +1648 -0
- package/dist/shared/{bank.DnDcNEvX.mjs → bank.Ce4ZEpjD.mjs} +329 -107
- package/dist/shared/bank.DS18_iuS.d.mts +1648 -0
- package/dist/shared/{bank.Cy_TcyKb.cjs → bank.DXzEZPsO.cjs} +346 -106
- 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
package/dist/export/worker.mjs
CHANGED
|
@@ -1,74 +1,31 @@
|
|
|
1
1
|
import { uuidv4, useResult, createInternalError, develitWorker, first, RPCResponse, action, service } from '@develit-io/backend-sdk';
|
|
2
|
-
import {
|
|
2
|
+
import { t as tables, F as FinbricksConnector, M as MockConnector, E as ErsteConnector, P as PAYMENT_TYPES, e as CONNECTOR_KEYS, q as getPaymentDirection } from '../shared/bank.Ce4ZEpjD.mjs';
|
|
3
3
|
import { WorkerEntrypoint } from 'cloudflare:workers';
|
|
4
4
|
import { drizzle } from 'drizzle-orm/d1';
|
|
5
5
|
import { z } from 'zod';
|
|
6
6
|
import { CURRENCY_CODES } from '@develit-io/general-codes';
|
|
7
|
-
import { C as CONNECTOR_KEYS } from '../shared/bank.C9jAvwna.mjs';
|
|
8
7
|
import 'jose';
|
|
9
8
|
import { eq, and, inArray, desc, sql } from 'drizzle-orm';
|
|
9
|
+
import { M as MockCobsConnector } from '../shared/bank.5CiXtVIb.mjs';
|
|
10
10
|
import superjson from 'superjson';
|
|
11
|
-
import '
|
|
11
|
+
import 'drizzle-zod';
|
|
12
12
|
import 'drizzle-orm/sqlite-core';
|
|
13
|
+
import 'date-fns';
|
|
13
14
|
import 'drizzle-orm/relations';
|
|
14
15
|
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
debtorAccountNumberWithBankCode: z.string(),
|
|
29
|
-
debtorIban: z.string()
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
const getAuthUriInputSchema = z.object({
|
|
33
|
-
accountId: z.string()
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
const authorizeAccountInputSchema = z.object({
|
|
37
|
-
ott: z.string(),
|
|
38
|
-
urlParams: z.string()
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
const simulateDepositInputSchema = z.object({
|
|
42
|
-
amount: z.number(),
|
|
43
|
-
currency: z.enum(CURRENCY_CODES),
|
|
44
|
-
bankingVs: z.string().max(10),
|
|
45
|
-
bankingSs: z.string().max(10).optional(),
|
|
46
|
-
bankingKs: z.string().max(10).optional(),
|
|
47
|
-
message: z.string(),
|
|
48
|
-
creditorIban: z.string().max(34),
|
|
49
|
-
creditorHolderName: z.string(),
|
|
50
|
-
debtorIban: z.string().max(34),
|
|
51
|
-
debtorHolderName: z.string()
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
const setLastSyncAtInputSchema = z.object({
|
|
55
|
-
iban: z.string(),
|
|
56
|
-
lastSyncedAt: z.coerce.date()
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
const initiateConnectorInputSchema = z.object({
|
|
60
|
-
connectorKey: z.enum(CONNECTOR_KEYS)
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
const getBatchesInputSchema = z.object({
|
|
64
|
-
limit: z.number().positive().optional().default(100),
|
|
65
|
-
offset: z.number().min(0).optional().default(0)
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
const processBatchInputSchema = z.object({
|
|
69
|
-
connectorKey: z.enum(CONNECTOR_KEYS),
|
|
70
|
-
batch: z.custom()
|
|
71
|
-
});
|
|
16
|
+
const upsertAccountCommand = (db, { account }) => {
|
|
17
|
+
const id = account.id || uuidv4();
|
|
18
|
+
const command = db.insert(tables.account).values({ ...account, id }).onConflictDoUpdate({
|
|
19
|
+
target: tables.account.iban,
|
|
20
|
+
set: {
|
|
21
|
+
...account
|
|
22
|
+
}
|
|
23
|
+
}).returning();
|
|
24
|
+
return {
|
|
25
|
+
id,
|
|
26
|
+
command
|
|
27
|
+
};
|
|
28
|
+
};
|
|
72
29
|
|
|
73
30
|
const createPaymentCommand = (db, { payment }) => {
|
|
74
31
|
return {
|
|
@@ -101,7 +58,7 @@ const upsertBatchCommand = (db, { batch }) => {
|
|
|
101
58
|
|
|
102
59
|
const createOneTimeTokenCommand = (db, {
|
|
103
60
|
ott,
|
|
104
|
-
|
|
61
|
+
refId,
|
|
105
62
|
tokenType
|
|
106
63
|
}) => {
|
|
107
64
|
const id = uuidv4();
|
|
@@ -110,13 +67,38 @@ const createOneTimeTokenCommand = (db, {
|
|
|
110
67
|
id,
|
|
111
68
|
oneTimeToken: ott,
|
|
112
69
|
tokenType,
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
expiresAt
|
|
70
|
+
expiresAt,
|
|
71
|
+
refId
|
|
116
72
|
}).returning();
|
|
117
73
|
return { id, command };
|
|
118
74
|
};
|
|
119
75
|
|
|
76
|
+
const expireOneTimeTokenCommand = (db, {
|
|
77
|
+
ott
|
|
78
|
+
}) => {
|
|
79
|
+
return {
|
|
80
|
+
command: db.update(tables.ott).set({
|
|
81
|
+
expiresAt: /* @__PURE__ */ new Date()
|
|
82
|
+
}).where(eq(tables.ott.oneTimeToken, ott))
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const createAccountCredentialsCommand = (db, { credentials }) => {
|
|
87
|
+
const id = credentials.id || uuidv4();
|
|
88
|
+
const command = db.insert(tables.accountCredentials).values({ ...credentials, id }).returning();
|
|
89
|
+
return {
|
|
90
|
+
id,
|
|
91
|
+
command
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const deleteAccountCredentialsCommand = (db, { accountId }) => {
|
|
96
|
+
const command = db.delete(tables.accountCredentials).where(eq(tables.accountCredentials.accountId, accountId));
|
|
97
|
+
return {
|
|
98
|
+
command
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
|
|
120
102
|
const getPaymentByRefIdQuery = async (db, { refId }) => {
|
|
121
103
|
const payment = await db.select().from(tables.payment).where(eq(tables.payment.refId, refId)).limit(1).get();
|
|
122
104
|
return payment;
|
|
@@ -140,6 +122,25 @@ const getOttQuery = async (db, { ott }) => {
|
|
|
140
122
|
return await db.select().from(tables.ott).where(eq(tables.ott.oneTimeToken, ott)).get();
|
|
141
123
|
};
|
|
142
124
|
|
|
125
|
+
const getAllPendingBatchesQuery = (db) => {
|
|
126
|
+
return db.select().from(tables.batch).where(
|
|
127
|
+
inArray(tables.batch.status, [
|
|
128
|
+
"PROCESSING",
|
|
129
|
+
"READY_TO_SIGN",
|
|
130
|
+
"WAITING_FOR_PROCESSING"
|
|
131
|
+
])
|
|
132
|
+
);
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
const getCredentialsByAccountId = async (db, { accountId }) => {
|
|
136
|
+
const cred = await db.select().from(tables.accountCredentials).where(eq(tables.accountCredentials.accountId, accountId)).get();
|
|
137
|
+
return cred;
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
const getAccountByIbanQuery = async (db, { iban }) => {
|
|
141
|
+
return await db.select().from(tables.account).where(eq(tables.account.iban, iban)).get();
|
|
142
|
+
};
|
|
143
|
+
|
|
143
144
|
class CreditasConnector extends FinbricksConnector {
|
|
144
145
|
constructor(config) {
|
|
145
146
|
super("CREDITAS", config);
|
|
@@ -158,53 +159,57 @@ class MonetaConnector extends FinbricksConnector {
|
|
|
158
159
|
}
|
|
159
160
|
}
|
|
160
161
|
|
|
161
|
-
const initiateConnector = (
|
|
162
|
+
const initiateConnector = ({
|
|
163
|
+
bank,
|
|
164
|
+
env,
|
|
165
|
+
connectedAccounts
|
|
166
|
+
}) => {
|
|
162
167
|
switch (bank) {
|
|
163
168
|
case "ERSTE":
|
|
164
169
|
return new ErsteConnector({
|
|
165
170
|
API_KEY: env.ERSTE_API_KEY,
|
|
166
171
|
CLIENT_ID: env.ERSTE_CLIENT_ID,
|
|
167
172
|
CLIENT_SECRET: env.ERSTE_CLIENT_SECRET,
|
|
168
|
-
REDIRECT_URI: env.
|
|
173
|
+
REDIRECT_URI: env.REDIRECT_URI,
|
|
169
174
|
AUTH_URI: env.ERSTE_AUTH_URI,
|
|
170
175
|
PAYMENTS_URI: env.ERSTE_PAYMENTS_URI,
|
|
171
176
|
ACCOUNTS_URI: env.ERSTE_ACCOUNTS_URI,
|
|
172
|
-
|
|
177
|
+
connectedAccounts
|
|
173
178
|
});
|
|
174
179
|
case "CREDITAS":
|
|
175
180
|
return new CreditasConnector({
|
|
176
181
|
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
177
182
|
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
178
183
|
PRIVATE_KEY_PEM: env.FINBRICKS_PRIVATE_KEY_PEM,
|
|
179
|
-
REDIRECT_URI: env.
|
|
180
|
-
|
|
184
|
+
REDIRECT_URI: env.REDIRECT_URI,
|
|
185
|
+
connectedAccounts
|
|
181
186
|
});
|
|
182
187
|
case "MOCK_COBS":
|
|
183
188
|
return new MockCobsConnector({
|
|
184
189
|
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
185
190
|
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
186
191
|
PRIVATE_KEY_PEM: env.FINBRICKS_PRIVATE_KEY_PEM,
|
|
187
|
-
REDIRECT_URI: env.
|
|
188
|
-
|
|
192
|
+
REDIRECT_URI: env.REDIRECT_URI,
|
|
193
|
+
connectedAccounts
|
|
189
194
|
});
|
|
190
195
|
case "FIO":
|
|
191
196
|
return new FioConnector({
|
|
192
197
|
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
193
198
|
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
194
199
|
PRIVATE_KEY_PEM: env.FINBRICKS_PRIVATE_KEY_PEM,
|
|
195
|
-
REDIRECT_URI: env.
|
|
196
|
-
|
|
200
|
+
REDIRECT_URI: env.REDIRECT_URI,
|
|
201
|
+
connectedAccounts
|
|
197
202
|
});
|
|
198
203
|
case "MONETA":
|
|
199
204
|
return new MonetaConnector({
|
|
200
205
|
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
201
206
|
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
202
207
|
PRIVATE_KEY_PEM: env.FINBRICKS_PRIVATE_KEY_PEM,
|
|
203
|
-
REDIRECT_URI: env.
|
|
204
|
-
|
|
208
|
+
REDIRECT_URI: env.REDIRECT_URI,
|
|
209
|
+
connectedAccounts
|
|
205
210
|
});
|
|
206
211
|
default:
|
|
207
|
-
return new MockConnector(
|
|
212
|
+
return new MockConnector();
|
|
208
213
|
}
|
|
209
214
|
};
|
|
210
215
|
|
|
@@ -213,7 +218,7 @@ const useSync = (kv) => {
|
|
|
213
218
|
account
|
|
214
219
|
}) => {
|
|
215
220
|
const [rawSync, rawSyncError] = await useResult(
|
|
216
|
-
kv.get(`sync-log:${account.
|
|
221
|
+
kv.get(`sync-log:${account.iban}:${account.currency}`)
|
|
217
222
|
);
|
|
218
223
|
if (rawSyncError) throw createInternalError(rawSyncError);
|
|
219
224
|
if (!rawSync) return null;
|
|
@@ -225,7 +230,7 @@ const useSync = (kv) => {
|
|
|
225
230
|
}) => {
|
|
226
231
|
const [_, error] = await useResult(
|
|
227
232
|
kv.put(
|
|
228
|
-
`sync-log:${account.
|
|
233
|
+
`sync-log:${account.iban}:${account.currency}`,
|
|
229
234
|
superjson.stringify(log)
|
|
230
235
|
)
|
|
231
236
|
);
|
|
@@ -241,7 +246,7 @@ const seperateSupportedPayments = (mappedPayments, accounts) => {
|
|
|
241
246
|
const [supportedPayments, unsupportedPayments] = mappedPayments.reduce(
|
|
242
247
|
([valid, invalid], payment) => {
|
|
243
248
|
const isValid = accounts.some(
|
|
244
|
-
(acc) => acc.
|
|
249
|
+
(acc) => acc.iban === payment.debtorIban && acc.currency === payment.currency
|
|
245
250
|
);
|
|
246
251
|
if (isValid) {
|
|
247
252
|
valid.push(payment);
|
|
@@ -258,6 +263,66 @@ const seperateSupportedPayments = (mappedPayments, accounts) => {
|
|
|
258
263
|
};
|
|
259
264
|
};
|
|
260
265
|
|
|
266
|
+
const sendPaymentInputSchema = z.object({
|
|
267
|
+
refId: z.string(),
|
|
268
|
+
amount: z.number().positive(),
|
|
269
|
+
paymentType: z.enum(PAYMENT_TYPES),
|
|
270
|
+
currency: z.enum(CURRENCY_CODES),
|
|
271
|
+
vs: z.string().nullable().optional(),
|
|
272
|
+
ss: z.string().nullable().optional(),
|
|
273
|
+
ks: z.string().nullable().optional(),
|
|
274
|
+
message: z.string().nullable().optional(),
|
|
275
|
+
creditorHolderName: z.string(),
|
|
276
|
+
creditorAccountNumberWithBankCode: z.string(),
|
|
277
|
+
creditorIban: z.string(),
|
|
278
|
+
debtorHolderName: z.string(),
|
|
279
|
+
debtorAccountNumberWithBankCode: z.string(),
|
|
280
|
+
debtorIban: z.string()
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
const getAuthUriInputSchema = z.object({
|
|
284
|
+
connectorKey: z.enum(CONNECTOR_KEYS)
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
const authorizeAccountInputSchema = z.object({
|
|
288
|
+
ott: z.string(),
|
|
289
|
+
urlParams: z.string()
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
const simulateDepositInputSchema = z.object({
|
|
293
|
+
amount: z.number(),
|
|
294
|
+
currency: z.enum(CURRENCY_CODES),
|
|
295
|
+
bankingVs: z.string().max(10),
|
|
296
|
+
bankingSs: z.string().max(10).optional(),
|
|
297
|
+
bankingKs: z.string().max(10).optional(),
|
|
298
|
+
message: z.string(),
|
|
299
|
+
creditorIban: z.string().max(34),
|
|
300
|
+
creditorHolderName: z.string(),
|
|
301
|
+
debtorIban: z.string().max(34),
|
|
302
|
+
debtorHolderName: z.string(),
|
|
303
|
+
connectorKey: z.enum(CONNECTOR_KEYS)
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
const setLastSyncAtInputSchema = z.object({
|
|
307
|
+
iban: z.string(),
|
|
308
|
+
lastSyncedAt: z.coerce.date()
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
const initiateConnectorInputSchema = z.object({
|
|
312
|
+
connectorKey: z.enum(CONNECTOR_KEYS),
|
|
313
|
+
withAuth: z.boolean().default(true).optional()
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
const getBatchesInputSchema = z.object({
|
|
317
|
+
limit: z.number().positive().optional().default(100),
|
|
318
|
+
offset: z.number().min(0).optional().default(0)
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
const processBatchInputSchema = z.object({
|
|
322
|
+
connectorKey: z.enum(CONNECTOR_KEYS),
|
|
323
|
+
batch: z.custom()
|
|
324
|
+
});
|
|
325
|
+
|
|
261
326
|
var __defProp = Object.defineProperty;
|
|
262
327
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
263
328
|
var __decorateClass = (decorators, target, key, kind) => {
|
|
@@ -269,13 +334,17 @@ var __decorateClass = (decorators, target, key, kind) => {
|
|
|
269
334
|
return result;
|
|
270
335
|
};
|
|
271
336
|
let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
272
|
-
constructor(ctx, env,
|
|
337
|
+
constructor(ctx, env, config) {
|
|
273
338
|
super(ctx, env);
|
|
274
|
-
this.
|
|
339
|
+
this.allowedProviders = [];
|
|
340
|
+
this.allowedProviders = config.allowedProviders;
|
|
275
341
|
this.db = drizzle(this.env.BANK_D1, { schema: tables });
|
|
276
342
|
}
|
|
277
|
-
|
|
278
|
-
return this.
|
|
343
|
+
getAllowedProviders() {
|
|
344
|
+
return this.allowedProviders;
|
|
345
|
+
}
|
|
346
|
+
async getAccounts() {
|
|
347
|
+
return await this.db.select().from(tables.account);
|
|
279
348
|
}
|
|
280
349
|
accountFetchInterval(connectorKey) {
|
|
281
350
|
switch (connectorKey) {
|
|
@@ -293,16 +362,17 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
293
362
|
return this.handleAction(null, {}, async () => {
|
|
294
363
|
const accountsToSync = [];
|
|
295
364
|
const { getLastSync } = useSync(this.env.BANK_KV);
|
|
296
|
-
|
|
365
|
+
const accounts = await this.getAccounts();
|
|
366
|
+
for (const account of accounts.filter(
|
|
297
367
|
(acc) => !!!acc.connectorKey.includes("MOCK")
|
|
298
368
|
)) {
|
|
299
|
-
let lastSync = await getLastSync({ account });
|
|
369
|
+
let lastSync = await getLastSync({ account: { ...account, token: "" } });
|
|
300
370
|
if (!lastSync) {
|
|
301
371
|
await this.setLastSyncAt({
|
|
302
|
-
iban: account.
|
|
303
|
-
lastSyncedAt: account.
|
|
372
|
+
iban: account.iban,
|
|
373
|
+
lastSyncedAt: account.lastSyncedAt || /* @__PURE__ */ new Date()
|
|
304
374
|
});
|
|
305
|
-
lastSync = await getLastSync({ account });
|
|
375
|
+
lastSync = await getLastSync({ account: { ...account, token: "" } });
|
|
306
376
|
if (!lastSync) continue;
|
|
307
377
|
}
|
|
308
378
|
const accountFetchInterval = this.accountFetchInterval(
|
|
@@ -315,7 +385,8 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
315
385
|
if (!shouldFetch) continue;
|
|
316
386
|
accountsToSync.push({
|
|
317
387
|
...account,
|
|
318
|
-
lastSyncAt: lastSync
|
|
388
|
+
lastSyncAt: lastSync,
|
|
389
|
+
token: ""
|
|
319
390
|
});
|
|
320
391
|
}
|
|
321
392
|
console.log("ACCS TO SYNC", accountsToSync.length);
|
|
@@ -328,16 +399,95 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
328
399
|
console.log("Scheduled CRON payments processing");
|
|
329
400
|
await this.syncAccounts();
|
|
330
401
|
}
|
|
402
|
+
if (controller.cron === this.env.CRON_BATCH_STATUSES) {
|
|
403
|
+
console.log("Scheduled CRON batch statuses");
|
|
404
|
+
await this.updateBatchStatuses();
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
async updateBatchStatuses() {
|
|
408
|
+
const pendingBatches = await getAllPendingBatchesQuery(this.db);
|
|
409
|
+
const uniqueConnectors = /* @__PURE__ */ new Set();
|
|
410
|
+
const accounts = await this.getAccounts();
|
|
411
|
+
for (const batch of pendingBatches) {
|
|
412
|
+
const connectorKey = accounts.find(
|
|
413
|
+
(acc) => acc.id === batch.accountId
|
|
414
|
+
).connectorKey;
|
|
415
|
+
if (!uniqueConnectors.has(connectorKey)) {
|
|
416
|
+
uniqueConnectors.add(connectorKey);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
const finalBatches = [];
|
|
420
|
+
for (const connectorKey of uniqueConnectors) {
|
|
421
|
+
const accs = accounts.filter((acc) => acc.connectorKey === connectorKey);
|
|
422
|
+
const updatedBatches = await Promise.all(
|
|
423
|
+
accs.map(async (account) => {
|
|
424
|
+
const batch = pendingBatches.find((acc) => acc.id === account.id);
|
|
425
|
+
const newStatus = await this.bankConnector.getBatchStatus({
|
|
426
|
+
batchId: batch.id
|
|
427
|
+
});
|
|
428
|
+
return {
|
|
429
|
+
...batch,
|
|
430
|
+
status: newStatus
|
|
431
|
+
};
|
|
432
|
+
})
|
|
433
|
+
);
|
|
434
|
+
finalBatches.push(...updatedBatches);
|
|
435
|
+
}
|
|
436
|
+
const updateBatchesCommands = finalBatches.map((batch) => {
|
|
437
|
+
const { command } = upsertBatchCommand(this.db, {
|
|
438
|
+
batch: {
|
|
439
|
+
...batch
|
|
440
|
+
}
|
|
441
|
+
});
|
|
442
|
+
return command;
|
|
443
|
+
});
|
|
444
|
+
console.log("Updated batches", finalBatches);
|
|
445
|
+
await this.db.batch([
|
|
446
|
+
updateBatchesCommands[0],
|
|
447
|
+
...updateBatchesCommands.slice(1)
|
|
448
|
+
]);
|
|
449
|
+
console.log("Batch update completed");
|
|
331
450
|
}
|
|
332
451
|
// @action('initiate-bank-connector')
|
|
333
452
|
async initiateBankConnector(input) {
|
|
334
453
|
return this.handleAction(
|
|
335
454
|
{ data: input, schema: initiateConnectorInputSchema },
|
|
336
455
|
{ successMessage: "Bank connector initiated successfully" },
|
|
337
|
-
async ({ connectorKey }) => {
|
|
338
|
-
this.
|
|
339
|
-
|
|
340
|
-
|
|
456
|
+
async ({ connectorKey, withAuth }) => {
|
|
457
|
+
if (!this.allowedProviders.includes(connectorKey)) {
|
|
458
|
+
throw createInternalError(null, {
|
|
459
|
+
message: `Invalid connector key: ${connectorKey}`
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
const accounts = await this.getAccounts();
|
|
463
|
+
const accountsForConnector = accounts.filter(
|
|
464
|
+
(acc) => acc.connectorKey === connectorKey
|
|
465
|
+
);
|
|
466
|
+
const accountsWithCredentials = await Promise.all(
|
|
467
|
+
accountsForConnector.map(async (acc) => {
|
|
468
|
+
const credentials = await getCredentialsByAccountId(this.db, {
|
|
469
|
+
accountId: acc.id
|
|
470
|
+
});
|
|
471
|
+
if (!credentials) {
|
|
472
|
+
throw createInternalError(null, {
|
|
473
|
+
message: `No credentials found for account ${acc.id}`
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
return {
|
|
477
|
+
currency: acc.currency,
|
|
478
|
+
iban: acc.iban,
|
|
479
|
+
token: credentials.value,
|
|
480
|
+
id: acc.id,
|
|
481
|
+
connectorKey: acc.connectorKey
|
|
482
|
+
};
|
|
483
|
+
})
|
|
484
|
+
);
|
|
485
|
+
this.bankConnector = initiateConnector({
|
|
486
|
+
bank: connectorKey,
|
|
487
|
+
connectedAccounts: accountsWithCredentials,
|
|
488
|
+
env: this.env
|
|
489
|
+
});
|
|
490
|
+
if (!withAuth) return;
|
|
341
491
|
await this.bankConnector.authenticate();
|
|
342
492
|
}
|
|
343
493
|
);
|
|
@@ -351,6 +501,7 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
351
501
|
(payment) => ({
|
|
352
502
|
id: uuidv4(),
|
|
353
503
|
refId: payment.refId,
|
|
504
|
+
connectorKey: "MOCK",
|
|
354
505
|
amount: payment.amount,
|
|
355
506
|
direction: "OUTGOING",
|
|
356
507
|
paymentType: payment.paymentType,
|
|
@@ -370,7 +521,10 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
370
521
|
debtorIban: payment.debtorIban
|
|
371
522
|
})
|
|
372
523
|
);
|
|
373
|
-
const { supportedPayments, unsupportedPayments } = seperateSupportedPayments(
|
|
524
|
+
const { supportedPayments, unsupportedPayments } = seperateSupportedPayments(
|
|
525
|
+
mappedPayments,
|
|
526
|
+
this.bankConnector.connectedAccounts
|
|
527
|
+
);
|
|
374
528
|
if (unsupportedPayments.length > 0) {
|
|
375
529
|
this.logError({ unsupportedPayments });
|
|
376
530
|
await this.pushToQueue(
|
|
@@ -396,15 +550,18 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
396
550
|
}))
|
|
397
551
|
);
|
|
398
552
|
}
|
|
399
|
-
for (const acc of this.
|
|
553
|
+
for (const acc of this.bankConnector.connectedAccounts) {
|
|
400
554
|
const newPayments = supportedPayments.filter(
|
|
401
|
-
(payment) => payment.debtorIban === acc.
|
|
402
|
-
)
|
|
555
|
+
(payment) => payment.debtorIban === acc.iban && payment.currency === acc.currency
|
|
556
|
+
).map((payment) => ({
|
|
557
|
+
...payment,
|
|
558
|
+
connectorKey: acc.connectorKey
|
|
559
|
+
}));
|
|
403
560
|
if (newPayments.length === 0) {
|
|
404
561
|
continue;
|
|
405
562
|
}
|
|
406
563
|
this.log({
|
|
407
|
-
message: `\u{1F4B0} Processing ${newPayments.length} payments for account
|
|
564
|
+
message: `\u{1F4B0} Processing ${newPayments.length} payments for account (${acc.iban}, ${acc.currency})`
|
|
408
565
|
});
|
|
409
566
|
const existingBatch = await getOpenBatchByAccountIdQuery(this.db, {
|
|
410
567
|
accountId: acc.id
|
|
@@ -576,26 +733,19 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
576
733
|
return this.handleAction(
|
|
577
734
|
{ data: input, schema: getAuthUriInputSchema },
|
|
578
735
|
{ successMessage: "Auth URI obtained." },
|
|
579
|
-
async ({
|
|
580
|
-
|
|
581
|
-
if (!account)
|
|
582
|
-
throw createInternalError(null, {
|
|
583
|
-
message: "Account not found",
|
|
584
|
-
code: "ACCOUNT_NOT_FOUND",
|
|
585
|
-
status: 404
|
|
586
|
-
});
|
|
587
|
-
this.bankConnector = initiateConnector(account.connectorKey, this.env);
|
|
736
|
+
async ({ connectorKey }) => {
|
|
737
|
+
await this.initiateBankConnector({ connectorKey, withAuth: false });
|
|
588
738
|
const ott = uuidv4();
|
|
589
|
-
const { command:
|
|
739
|
+
const { command: createOneTimeToken } = createOneTimeTokenCommand(
|
|
590
740
|
this.db,
|
|
591
741
|
{
|
|
592
742
|
ott,
|
|
593
|
-
|
|
743
|
+
refId: connectorKey,
|
|
594
744
|
tokenType: "ACCOUNT_AUTHORIZATION"
|
|
595
745
|
}
|
|
596
746
|
);
|
|
597
|
-
await
|
|
598
|
-
const uri = await this.bankConnector.getAuthUri({
|
|
747
|
+
await createOneTimeToken.execute();
|
|
748
|
+
const uri = await this.bankConnector.getAuthUri({ ott });
|
|
599
749
|
return { uri };
|
|
600
750
|
}
|
|
601
751
|
);
|
|
@@ -622,11 +772,50 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
622
772
|
status: 400
|
|
623
773
|
});
|
|
624
774
|
}
|
|
625
|
-
this.
|
|
626
|
-
|
|
775
|
+
await this.initiateBankConnector({
|
|
776
|
+
connectorKey: ottRow.refId
|
|
777
|
+
});
|
|
778
|
+
const { credentials, accounts } = await this.bankConnector.authorizeAccount({
|
|
627
779
|
urlParams
|
|
628
780
|
});
|
|
629
|
-
|
|
781
|
+
console.log("Bank connector initiated");
|
|
782
|
+
const alreadyExistingAccounts = (await this.getAccounts()).filter(
|
|
783
|
+
(acc) => acc.connectorKey === ottRow.refId && accounts.map((item) => item.iban).includes(acc.iban)
|
|
784
|
+
);
|
|
785
|
+
const upsertAccounts = accounts.map(
|
|
786
|
+
(acc) => upsertAccountCommand(this.db, {
|
|
787
|
+
account: acc
|
|
788
|
+
}).command
|
|
789
|
+
);
|
|
790
|
+
const deleteCredentials = alreadyExistingAccounts.map(
|
|
791
|
+
(acc) => deleteAccountCredentialsCommand(this.db, {
|
|
792
|
+
accountId: acc.id
|
|
793
|
+
}).command
|
|
794
|
+
);
|
|
795
|
+
const createAccountCredentials = credentials.map(
|
|
796
|
+
(cr) => createAccountCredentialsCommand(this.db, {
|
|
797
|
+
credentials: cr
|
|
798
|
+
}).command
|
|
799
|
+
);
|
|
800
|
+
const { command: updateOtt } = expireOneTimeTokenCommand(this.db, {
|
|
801
|
+
ott
|
|
802
|
+
});
|
|
803
|
+
await this.db.batch([
|
|
804
|
+
updateOtt,
|
|
805
|
+
...upsertAccounts,
|
|
806
|
+
...deleteCredentials,
|
|
807
|
+
...createAccountCredentials
|
|
808
|
+
]);
|
|
809
|
+
const fetchedAccounts = await this.getAccounts();
|
|
810
|
+
if (!fetchedAccounts)
|
|
811
|
+
throw createInternalError(null, {
|
|
812
|
+
message: "Account not found",
|
|
813
|
+
code: "NOT_FOUND",
|
|
814
|
+
status: 404
|
|
815
|
+
});
|
|
816
|
+
return {
|
|
817
|
+
accounts: fetchedAccounts
|
|
818
|
+
};
|
|
630
819
|
}
|
|
631
820
|
);
|
|
632
821
|
}
|
|
@@ -652,10 +841,7 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
652
841
|
if (!payments || payments.length === 0) continue;
|
|
653
842
|
this.log(payments);
|
|
654
843
|
payments.forEach((payment) => {
|
|
655
|
-
payment.direction = getPaymentDirection(
|
|
656
|
-
payment,
|
|
657
|
-
account.identification.iban
|
|
658
|
-
);
|
|
844
|
+
payment.direction = getPaymentDirection(payment, account.iban);
|
|
659
845
|
});
|
|
660
846
|
allFetchedPayments.push(...payments);
|
|
661
847
|
}
|
|
@@ -678,7 +864,7 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
678
864
|
console.log("FETCHEDPAYMANETS TO SYNC", allFetchedPayments.length);
|
|
679
865
|
for (const account of accounts) {
|
|
680
866
|
const paymentsForAccount = allFetchedPayments.filter(
|
|
681
|
-
(payment) => (payment.direction === "OUTGOING" ? payment.debtorIban : payment.creditorIban) === account.
|
|
867
|
+
(payment) => (payment.direction === "OUTGOING" ? payment.debtorIban : payment.creditorIban) === account.iban
|
|
682
868
|
);
|
|
683
869
|
let lastSyncPayment;
|
|
684
870
|
lastSyncPayment = paymentsForAccount.filter(({ status }) => status !== "COMPLETED").sort(
|
|
@@ -725,11 +911,13 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
725
911
|
creditorIban,
|
|
726
912
|
creditorHolderName,
|
|
727
913
|
debtorIban,
|
|
728
|
-
debtorHolderName
|
|
914
|
+
debtorHolderName,
|
|
915
|
+
connectorKey
|
|
729
916
|
}) => {
|
|
730
917
|
const payment = {
|
|
731
918
|
id: uuidv4(),
|
|
732
919
|
amount,
|
|
920
|
+
connectorKey,
|
|
733
921
|
direction: "INCOMING",
|
|
734
922
|
paymentType: "DOMESTIC",
|
|
735
923
|
currency,
|
|
@@ -767,10 +955,10 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
767
955
|
{ successMessage: "Last sync set." },
|
|
768
956
|
async ({ iban, lastSyncedAt }) => {
|
|
769
957
|
const { setLastSync } = useSync(this.env.BANK_KV);
|
|
770
|
-
const
|
|
771
|
-
|
|
772
|
-
);
|
|
773
|
-
if (!
|
|
958
|
+
const account = await getAccountByIbanQuery(this.db, {
|
|
959
|
+
iban
|
|
960
|
+
});
|
|
961
|
+
if (!account) {
|
|
774
962
|
throw createInternalError(null, {
|
|
775
963
|
status: 404,
|
|
776
964
|
message: "Account for this organization does not exist."
|
|
@@ -780,7 +968,7 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
780
968
|
log: {
|
|
781
969
|
lastSyncedAt
|
|
782
970
|
},
|
|
783
|
-
account:
|
|
971
|
+
account: { ...account, token: "" }
|
|
784
972
|
});
|
|
785
973
|
return {};
|
|
786
974
|
}
|
|
@@ -800,7 +988,7 @@ let BankServiceBase = class extends develitWorker(WorkerEntrypoint) {
|
|
|
800
988
|
}
|
|
801
989
|
async getBankAccounts() {
|
|
802
990
|
return RPCResponse.ok("Bank accounts retrieved successfully", {
|
|
803
|
-
data: this.
|
|
991
|
+
data: await this.getAccounts()
|
|
804
992
|
});
|
|
805
993
|
}
|
|
806
994
|
async getBatches(input) {
|
|
@@ -827,6 +1015,9 @@ __decorateClass([
|
|
|
827
1015
|
__decorateClass([
|
|
828
1016
|
action("scheduled")
|
|
829
1017
|
], BankServiceBase.prototype, "scheduled", 1);
|
|
1018
|
+
__decorateClass([
|
|
1019
|
+
action("update-batch-statuses")
|
|
1020
|
+
], BankServiceBase.prototype, "updateBatchStatuses", 1);
|
|
830
1021
|
__decorateClass([
|
|
831
1022
|
action("add-payments-to-batch")
|
|
832
1023
|
], BankServiceBase.prototype, "addPaymentsToBatch", 1);
|
|
@@ -864,433 +1055,429 @@ BankServiceBase = __decorateClass([
|
|
|
864
1055
|
service("bank")
|
|
865
1056
|
], BankServiceBase);
|
|
866
1057
|
function defineBankService({
|
|
867
|
-
|
|
1058
|
+
config
|
|
868
1059
|
}) {
|
|
869
1060
|
return class BankService extends BankServiceBase {
|
|
870
1061
|
constructor(ctx, env) {
|
|
871
|
-
super(ctx, env,
|
|
1062
|
+
super(ctx, env, config);
|
|
872
1063
|
}
|
|
873
1064
|
};
|
|
874
1065
|
}
|
|
875
1066
|
|
|
876
|
-
const monthAgo = new Date(
|
|
877
|
-
Date.now() - 30 * 24 * 60 * 60 * 1e3
|
|
878
|
-
// 30 days ago
|
|
879
|
-
);
|
|
880
1067
|
const BankService = defineBankService({
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
],
|
|
948
|
-
productionAccounts: [
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
]
|
|
1068
|
+
config: {
|
|
1069
|
+
allowedProviders: []
|
|
1070
|
+
// {
|
|
1071
|
+
// connectorKey: 'MOCK_COBS',
|
|
1072
|
+
// id: 'staging-czk',
|
|
1073
|
+
// identification: {
|
|
1074
|
+
// number: '1234567890',
|
|
1075
|
+
// bankCode: '5051',
|
|
1076
|
+
// iban: 'CZ0350510000000000000449',
|
|
1077
|
+
// holderName: 'Devizová Burza a.s.',
|
|
1078
|
+
// },
|
|
1079
|
+
// fallbackLastSync: monthAgo,
|
|
1080
|
+
// currency: 'CZK',
|
|
1081
|
+
// production: false,
|
|
1082
|
+
// },
|
|
1083
|
+
// {
|
|
1084
|
+
// connectorKey: 'MOCK_COBS',
|
|
1085
|
+
// id: 'staging-eur',
|
|
1086
|
+
// identification: {
|
|
1087
|
+
// number: '2345678901',
|
|
1088
|
+
// bankCode: '5051',
|
|
1089
|
+
// iban: 'CZ0750510000000000000668',
|
|
1090
|
+
// holderName: 'Devizová Burza a.s.',
|
|
1091
|
+
// },
|
|
1092
|
+
// fallbackLastSync: monthAgo,
|
|
1093
|
+
// currency: 'EUR',
|
|
1094
|
+
// production: false,
|
|
1095
|
+
// },
|
|
1096
|
+
// {
|
|
1097
|
+
// connectorKey: 'FIO',
|
|
1098
|
+
// id: 'kleinpetr-test',
|
|
1099
|
+
// identification: {
|
|
1100
|
+
// number: '2502130437',
|
|
1101
|
+
// bankCode: '2010',
|
|
1102
|
+
// iban: 'CZ8520100000002502130437',
|
|
1103
|
+
// holderName: 'Petr Klein',
|
|
1104
|
+
// },
|
|
1105
|
+
// fallbackLastSync: monthAgo,
|
|
1106
|
+
// currency: 'CZK',
|
|
1107
|
+
// production: true,
|
|
1108
|
+
// },
|
|
1109
|
+
// {
|
|
1110
|
+
// connectorKey: 'MOCK',
|
|
1111
|
+
// id: 'id-test',
|
|
1112
|
+
// identification: {
|
|
1113
|
+
// number: '777777777',
|
|
1114
|
+
// bankCode: '0800',
|
|
1115
|
+
// iban: 'PL0000000000002444430437',
|
|
1116
|
+
// holderName: 'Test Test',
|
|
1117
|
+
// },
|
|
1118
|
+
// fallbackLastSync: monthAgo,
|
|
1119
|
+
// currency: 'PLN',
|
|
1120
|
+
// production: false,
|
|
1121
|
+
// },
|
|
1122
|
+
// {
|
|
1123
|
+
// connectorKey: 'MOCK_COBS',
|
|
1124
|
+
// id: 'staging-usd',
|
|
1125
|
+
// identification: {
|
|
1126
|
+
// iban: 'CZ3456789012345678901234',
|
|
1127
|
+
// accountNumberWithBankCode: '3456789012/3456',
|
|
1128
|
+
// },
|
|
1129
|
+
// currency: 'USD',
|
|
1130
|
+
// bankCode: '0800',
|
|
1131
|
+
// accountNumber: '3456789012',
|
|
1132
|
+
// production: false,
|
|
1133
|
+
// },
|
|
1134
|
+
// ],
|
|
1135
|
+
// productionAccounts: [
|
|
1136
|
+
// // Banka CREDITAS (2250)
|
|
1137
|
+
// {
|
|
1138
|
+
// connectorKey: 'CREDITAS',
|
|
1139
|
+
// id: '2250-CZK',
|
|
1140
|
+
// identification: {
|
|
1141
|
+
// number: '100602391',
|
|
1142
|
+
// bankCode: '2250',
|
|
1143
|
+
// iban: 'CZ5122500000000100602391',
|
|
1144
|
+
// holderName: 'Devizová Burza a.s.',
|
|
1145
|
+
// },
|
|
1146
|
+
// fallbackLastSync: monthAgo,
|
|
1147
|
+
// currency: 'CZK',
|
|
1148
|
+
// production: true,
|
|
1149
|
+
// },
|
|
1150
|
+
// {
|
|
1151
|
+
// connectorKey: 'CREDITAS',
|
|
1152
|
+
// id: '2250-EUR',
|
|
1153
|
+
// identification: {
|
|
1154
|
+
// number: '100602404',
|
|
1155
|
+
// bankCode: '2250',
|
|
1156
|
+
// iban: 'CZ8822500000000100602404',
|
|
1157
|
+
// holderName: 'Devizová Burza a.s.',
|
|
1158
|
+
// },
|
|
1159
|
+
// fallbackLastSync: monthAgo,
|
|
1160
|
+
// currency: 'EUR',
|
|
1161
|
+
// production: true,
|
|
1162
|
+
// },
|
|
1163
|
+
// {
|
|
1164
|
+
// connectorKey: 'CREDITAS',
|
|
1165
|
+
// id: '2250-USD',
|
|
1166
|
+
// identification: {
|
|
1167
|
+
// number: '100602412',
|
|
1168
|
+
// bankCode: '2250',
|
|
1169
|
+
// iban: 'CZ6622500000000100602412',
|
|
1170
|
+
// holderName: 'Devizová Burza a.s.',
|
|
1171
|
+
// },
|
|
1172
|
+
// fallbackLastSync: monthAgo,
|
|
1173
|
+
// currency: 'USD',
|
|
1174
|
+
// production: true,
|
|
1175
|
+
// },
|
|
1176
|
+
// {
|
|
1177
|
+
// connectorKey: 'CREDITAS',
|
|
1178
|
+
// id: '2250-GBP',
|
|
1179
|
+
// identification: {
|
|
1180
|
+
// number: '100602420',
|
|
1181
|
+
// bankCode: '2250',
|
|
1182
|
+
// iban: 'CZ4422500000000100602420',
|
|
1183
|
+
// holderName: 'Devizová Burza a.s.',
|
|
1184
|
+
// },
|
|
1185
|
+
// fallbackLastSync: monthAgo,
|
|
1186
|
+
// currency: 'GBP',
|
|
1187
|
+
// production: true,
|
|
1188
|
+
// },
|
|
1189
|
+
// {
|
|
1190
|
+
// connectorKey: 'CREDITAS',
|
|
1191
|
+
// id: '2250-CHF',
|
|
1192
|
+
// identification: {
|
|
1193
|
+
// number: '100602439',
|
|
1194
|
+
// bankCode: '2250',
|
|
1195
|
+
// iban: 'CZ1622500000000100602439',
|
|
1196
|
+
// holderName: 'Devizová Burza a.s.',
|
|
1197
|
+
// },
|
|
1198
|
+
// fallbackLastSync: monthAgo,
|
|
1199
|
+
// currency: 'CHF',
|
|
1200
|
+
// production: true,
|
|
1201
|
+
// },
|
|
1202
|
+
// {
|
|
1203
|
+
// connectorKey: 'CREDITAS',
|
|
1204
|
+
// id: '2250-PLN',
|
|
1205
|
+
// identification: {
|
|
1206
|
+
// number: '100602447',
|
|
1207
|
+
// bankCode: '2250',
|
|
1208
|
+
// iban: 'CZ9122500000000100602447',
|
|
1209
|
+
// holderName: 'Devizová Burza a.s.',
|
|
1210
|
+
// },
|
|
1211
|
+
// fallbackLastSync: monthAgo,
|
|
1212
|
+
// currency: 'PLN',
|
|
1213
|
+
// production: true,
|
|
1214
|
+
// },
|
|
1215
|
+
// // Fio banka (2010)
|
|
1216
|
+
// {
|
|
1217
|
+
// connectorKey: 'FINBRICKS',
|
|
1218
|
+
// id: '2010-CZK',
|
|
1219
|
+
// identification: {
|
|
1220
|
+
// number: '2500845869',
|
|
1221
|
+
// bankCode: '2010',
|
|
1222
|
+
// iban: 'CZ0420100000002500845869',
|
|
1223
|
+
// holderName: 'Devizová Burza a.s.',
|
|
1224
|
+
// },
|
|
1225
|
+
// fallbackLastSync: monthAgo,
|
|
1226
|
+
// currency: 'CZK',
|
|
1227
|
+
// production: true,
|
|
1228
|
+
// },
|
|
1229
|
+
// {
|
|
1230
|
+
// connectorKey: 'FINBRICKS',
|
|
1231
|
+
// id: '2010-EUR',
|
|
1232
|
+
// identification: {
|
|
1233
|
+
// number: '2600884128',
|
|
1234
|
+
// bankCode: '2010',
|
|
1235
|
+
// iban: 'CZ0820100000002600884128',
|
|
1236
|
+
// holderName: 'Devizová Burza a.s.',
|
|
1237
|
+
// },
|
|
1238
|
+
// fallbackLastSync: monthAgo,
|
|
1239
|
+
// currency: 'EUR',
|
|
1240
|
+
// production: true,
|
|
1241
|
+
// },
|
|
1242
|
+
// {
|
|
1243
|
+
// connectorKey: 'FINBRICKS',
|
|
1244
|
+
// id: '2010-USD',
|
|
1245
|
+
// identification: {
|
|
1246
|
+
// number: '2700884133',
|
|
1247
|
+
// bankCode: '2010',
|
|
1248
|
+
// iban: 'CZ1420100000002700884133',
|
|
1249
|
+
// holderName: 'Devizová Burza a.s.',
|
|
1250
|
+
// },
|
|
1251
|
+
// fallbackLastSync: monthAgo,
|
|
1252
|
+
// currency: 'USD',
|
|
1253
|
+
// production: true,
|
|
1254
|
+
// },
|
|
1255
|
+
// {
|
|
1256
|
+
// connectorKey: 'FINBRICKS',
|
|
1257
|
+
// id: '2010-CHF',
|
|
1258
|
+
// identification: {
|
|
1259
|
+
// number: '2401098351',
|
|
1260
|
+
// bankCode: '2010',
|
|
1261
|
+
// iban: 'CZ0920100000002401098351',
|
|
1262
|
+
// holderName: 'Devizová Burza a.s.',
|
|
1263
|
+
// },
|
|
1264
|
+
// fallbackLastSync: monthAgo,
|
|
1265
|
+
// currency: 'CHF',
|
|
1266
|
+
// production: true,
|
|
1267
|
+
// },
|
|
1268
|
+
// {
|
|
1269
|
+
// connectorKey: 'FINBRICKS',
|
|
1270
|
+
// id: '2010-GBP',
|
|
1271
|
+
// identification: {
|
|
1272
|
+
// number: '2400884131',
|
|
1273
|
+
// bankCode: '2010',
|
|
1274
|
+
// iban: 'CZ3320100000002400884131',
|
|
1275
|
+
// holderName: 'Devizová Burza a.s.',
|
|
1276
|
+
// },
|
|
1277
|
+
// fallbackLastSync: monthAgo,
|
|
1278
|
+
// currency: 'GBP',
|
|
1279
|
+
// production: true,
|
|
1280
|
+
// },
|
|
1281
|
+
// {
|
|
1282
|
+
// connectorKey: 'FINBRICKS',
|
|
1283
|
+
// id: '2010-PLN',
|
|
1284
|
+
// identification: {
|
|
1285
|
+
// number: '2701098353',
|
|
1286
|
+
// bankCode: '2010',
|
|
1287
|
+
// iban: 'CZ8720100000002701098353',
|
|
1288
|
+
// holderName: 'Devizová Burza a.s.',
|
|
1289
|
+
// },
|
|
1290
|
+
// fallbackLastSync: monthAgo,
|
|
1291
|
+
// currency: 'PLN',
|
|
1292
|
+
// production: true,
|
|
1293
|
+
// },
|
|
1294
|
+
// {
|
|
1295
|
+
// connectorKey: 'FINBRICKS',
|
|
1296
|
+
// id: '2010-CAD',
|
|
1297
|
+
// identification: {
|
|
1298
|
+
// number: '2701478102',
|
|
1299
|
+
// bankCode: '2010',
|
|
1300
|
+
// iban: 'CZ5520100000002701478102',
|
|
1301
|
+
// holderName: 'Devizová Burza a.s.',
|
|
1302
|
+
// },
|
|
1303
|
+
// fallbackLastSync: monthAgo,
|
|
1304
|
+
// currency: 'CAD',
|
|
1305
|
+
// production: true,
|
|
1306
|
+
// },
|
|
1307
|
+
// // Komerční banka (0100)
|
|
1308
|
+
// {
|
|
1309
|
+
// connectorKey: 'FINBRICKS',
|
|
1310
|
+
// id: '0100-CZK',
|
|
1311
|
+
// identification: {
|
|
1312
|
+
// number: '115-1483630297',
|
|
1313
|
+
// bankCode: '0100',
|
|
1314
|
+
// iban: 'CZ5901000001151483630297',
|
|
1315
|
+
// holderName: 'Devizová Burza a.s.',
|
|
1316
|
+
// },
|
|
1317
|
+
// fallbackLastSync: monthAgo,
|
|
1318
|
+
// currency: 'CZK',
|
|
1319
|
+
// production: true,
|
|
1320
|
+
// },
|
|
1321
|
+
// {
|
|
1322
|
+
// connectorKey: 'FINBRICKS',
|
|
1323
|
+
// id: '0100-EUR',
|
|
1324
|
+
// identification: {
|
|
1325
|
+
// number: '115-1484940297',
|
|
1326
|
+
// bankCode: '0100',
|
|
1327
|
+
// iban: 'CZ4201000001151484940297',
|
|
1328
|
+
// holderName: 'Devizová Burza a.s.',
|
|
1329
|
+
// },
|
|
1330
|
+
// fallbackLastSync: monthAgo,
|
|
1331
|
+
// currency: 'EUR',
|
|
1332
|
+
// production: true,
|
|
1333
|
+
// },
|
|
1334
|
+
// {
|
|
1335
|
+
// connectorKey: 'FINBRICKS',
|
|
1336
|
+
// id: '0100-USD',
|
|
1337
|
+
// identification: {
|
|
1338
|
+
// number: '115-1483960237',
|
|
1339
|
+
// bankCode: '0100',
|
|
1340
|
+
// iban: 'CZ6201000001151483960237',
|
|
1341
|
+
// holderName: 'Devizová Burza a.s.',
|
|
1342
|
+
// },
|
|
1343
|
+
// fallbackLastSync: monthAgo,
|
|
1344
|
+
// currency: 'USD',
|
|
1345
|
+
// production: true,
|
|
1346
|
+
// },
|
|
1347
|
+
// {
|
|
1348
|
+
// connectorKey: 'FINBRICKS',
|
|
1349
|
+
// id: '0100-PLN',
|
|
1350
|
+
// identification: {
|
|
1351
|
+
// number: '115-6674290267',
|
|
1352
|
+
// bankCode: '0100',
|
|
1353
|
+
// iban: 'CZ3501000001156674290267',
|
|
1354
|
+
// holderName: 'Devizová Burza a.s.',
|
|
1355
|
+
// },
|
|
1356
|
+
// fallbackLastSync: monthAgo,
|
|
1357
|
+
// currency: 'PLN',
|
|
1358
|
+
// production: true,
|
|
1359
|
+
// },
|
|
1360
|
+
// {
|
|
1361
|
+
// connectorKey: 'FINBRICKS',
|
|
1362
|
+
// id: '0100-SEK',
|
|
1363
|
+
// identification: {
|
|
1364
|
+
// number: '115-9578110207',
|
|
1365
|
+
// bankCode: '0100',
|
|
1366
|
+
// iban: 'CZ2401000001159578110207',
|
|
1367
|
+
// holderName: 'Devizová Burza a.s.',
|
|
1368
|
+
// },
|
|
1369
|
+
// fallbackLastSync: monthAgo,
|
|
1370
|
+
// currency: 'SEK',
|
|
1371
|
+
// production: true,
|
|
1372
|
+
// },
|
|
1373
|
+
// // Česká spořitelna (0800)
|
|
1374
|
+
// {
|
|
1375
|
+
// connectorKey: 'ERSTE',
|
|
1376
|
+
// id: '0800-CZK',
|
|
1377
|
+
// identification: {
|
|
1378
|
+
// number: '4413926379',
|
|
1379
|
+
// bankCode: '0800',
|
|
1380
|
+
// iban: 'CZ7908000000004413926379',
|
|
1381
|
+
// holderName: 'Devizová Burza a.s.',
|
|
1382
|
+
// },
|
|
1383
|
+
// fallbackLastSync: monthAgo,
|
|
1384
|
+
// currency: 'CZK',
|
|
1385
|
+
// production: true,
|
|
1386
|
+
// },
|
|
1387
|
+
// {
|
|
1388
|
+
// connectorKey: 'ERSTE',
|
|
1389
|
+
// id: '0800-EUR',
|
|
1390
|
+
// identification: {
|
|
1391
|
+
// number: '1966646293',
|
|
1392
|
+
// bankCode: '0800',
|
|
1393
|
+
// iban: 'CZ2308000000001966646293',
|
|
1394
|
+
// holderName: 'Devizová Burza a.s.',
|
|
1395
|
+
// },
|
|
1396
|
+
// fallbackLastSync: monthAgo,
|
|
1397
|
+
// currency: 'EUR',
|
|
1398
|
+
// production: true,
|
|
1399
|
+
// },
|
|
1400
|
+
// {
|
|
1401
|
+
// connectorKey: 'ERSTE',
|
|
1402
|
+
// id: '0800-USD',
|
|
1403
|
+
// identification: {
|
|
1404
|
+
// number: '1978982243',
|
|
1405
|
+
// bankCode: '0800',
|
|
1406
|
+
// iban: 'CZ1908000000001978982243',
|
|
1407
|
+
// holderName: 'Devizová Burza a.s.',
|
|
1408
|
+
// },
|
|
1409
|
+
// fallbackLastSync: monthAgo,
|
|
1410
|
+
// currency: 'USD',
|
|
1411
|
+
// production: true,
|
|
1412
|
+
// },
|
|
1413
|
+
// {
|
|
1414
|
+
// connectorKey: 'ERSTE',
|
|
1415
|
+
// id: '0800-HUF',
|
|
1416
|
+
// identification: {
|
|
1417
|
+
// number: '13461252',
|
|
1418
|
+
// bankCode: '0800',
|
|
1419
|
+
// iban: 'CZ1908000000000013461252',
|
|
1420
|
+
// holderName: 'Devizová Burza a.s.',
|
|
1421
|
+
// },
|
|
1422
|
+
// fallbackLastSync: monthAgo,
|
|
1423
|
+
// currency: 'HUF',
|
|
1424
|
+
// production: true,
|
|
1425
|
+
// },
|
|
1426
|
+
// // MONETA Money Bank (0600)
|
|
1427
|
+
// {
|
|
1428
|
+
// connectorKey: 'FINBRICKS',
|
|
1429
|
+
// id: '0600-CZK',
|
|
1430
|
+
// identification: {
|
|
1431
|
+
// number: '224252186',
|
|
1432
|
+
// bankCode: '0600',
|
|
1433
|
+
// iban: 'CZ5906000000000224252186',
|
|
1434
|
+
// holderName: 'Devizová Burza a.s.',
|
|
1435
|
+
// },
|
|
1436
|
+
// fallbackLastSync: monthAgo,
|
|
1437
|
+
// currency: 'CZK',
|
|
1438
|
+
// production: true,
|
|
1439
|
+
// },
|
|
1440
|
+
// {
|
|
1441
|
+
// connectorKey: 'FINBRICKS',
|
|
1442
|
+
// id: '0600-EUR',
|
|
1443
|
+
// identification: {
|
|
1444
|
+
// number: '224252231',
|
|
1445
|
+
// bankCode: '0600',
|
|
1446
|
+
// iban: 'CZ0806000000000224252231',
|
|
1447
|
+
// holderName: 'Devizová Burza a.s.',
|
|
1448
|
+
// },
|
|
1449
|
+
// fallbackLastSync: monthAgo,
|
|
1450
|
+
// currency: 'EUR',
|
|
1451
|
+
// production: true,
|
|
1452
|
+
// },
|
|
1453
|
+
// {
|
|
1454
|
+
// connectorKey: 'FINBRICKS',
|
|
1455
|
+
// id: '0600-USD',
|
|
1456
|
+
// identification: {
|
|
1457
|
+
// number: '224252290',
|
|
1458
|
+
// bankCode: '0600',
|
|
1459
|
+
// iban: 'CZ6406000000000224252290',
|
|
1460
|
+
// holderName: 'Devizová Burza a.s.',
|
|
1461
|
+
// },
|
|
1462
|
+
// fallbackLastSync: monthAgo,
|
|
1463
|
+
// currency: 'USD',
|
|
1464
|
+
// production: true,
|
|
1465
|
+
// },
|
|
1466
|
+
// // NEY spořitelní družstvo (2260)
|
|
1467
|
+
// {
|
|
1468
|
+
// connectorKey: 'FINBRICKS',
|
|
1469
|
+
// id: '2260-CZK',
|
|
1470
|
+
// identification: {
|
|
1471
|
+
// number: '1702700014',
|
|
1472
|
+
// bankCode: '2260',
|
|
1473
|
+
// iban: 'CZ7422600000001702700014',
|
|
1474
|
+
// holderName: 'Devizová Burza a.s.',
|
|
1475
|
+
// },
|
|
1476
|
+
// fallbackLastSync: monthAgo,
|
|
1477
|
+
// currency: 'CZK',
|
|
1478
|
+
// production: true,
|
|
1479
|
+
// },
|
|
1480
|
+
// ],
|
|
1294
1481
|
}
|
|
1295
1482
|
});
|
|
1296
1483
|
|