@buzztech/boi-ui 0.2.0 → 0.2.1
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/README.md +2 -2
- package/dist/boi-ui.js +609 -594
- package/dist/boi-ui.js.map +1 -1
- package/dist/boi-ui.umd.cjs +1 -1
- package/dist/boi-ui.umd.cjs.map +1 -1
- package/package.json +1 -1
package/dist/boi-ui.js
CHANGED
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
const
|
|
1
|
+
import { defineComponent as Y, openBlock as p, createElementBlock as m, normalizeClass as R, renderSlot as ne, createTextVNode as W, toDisplayString as T, unref as M, ref as A, computed as I, Fragment as J, createElementVNode as l, renderList as ae, createVNode as te, withDirectives as oe, vModelText as re, createCommentVNode as O, watch as de, onMounted as ke, onUnmounted as xe, nextTick as Ee, vShow as Oe, withCtx as Fe } from "vue";
|
|
2
|
+
const De = /* @__PURE__ */ Y({
|
|
3
3
|
__name: "BoiButton",
|
|
4
4
|
props: {
|
|
5
5
|
label: {},
|
|
6
6
|
variant: {}
|
|
7
7
|
},
|
|
8
8
|
setup(n) {
|
|
9
|
-
return (
|
|
9
|
+
return (h, e) => (p(), m("button", {
|
|
10
10
|
type: "button",
|
|
11
|
-
class:
|
|
11
|
+
class: R(["boi-button", [n.variant ? `boi-button--${n.variant}` : "boi-button--primary"]])
|
|
12
12
|
}, [
|
|
13
|
-
ne(
|
|
14
|
-
|
|
13
|
+
ne(h.$slots, "default", {}, () => [
|
|
14
|
+
W(T(n.label), 1)
|
|
15
15
|
], !0)
|
|
16
16
|
], 2));
|
|
17
17
|
}
|
|
18
|
-
}),
|
|
18
|
+
}), Te = (n, h) => {
|
|
19
19
|
const e = n.__vccOpts || n;
|
|
20
|
-
for (const [
|
|
21
|
-
e[
|
|
20
|
+
for (const [g, d] of h)
|
|
21
|
+
e[g] = d;
|
|
22
22
|
return e;
|
|
23
|
-
},
|
|
23
|
+
}, je = /* @__PURE__ */ Te(De, [["__scopeId", "data-v-96425342"]]);
|
|
24
24
|
function ie(...n) {
|
|
25
25
|
return n.flat(1 / 0).filter(Boolean).join(" ");
|
|
26
26
|
}
|
|
27
|
-
const
|
|
27
|
+
const Me = "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", Le = {
|
|
28
28
|
default: "bg-primary text-white shadow-xs hover:bg-primary/90",
|
|
29
29
|
destructive: "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
|
|
30
30
|
outline: "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
|
|
31
31
|
secondary: "bg-secondary text-white shadow-xs hover:bg-secondary/80",
|
|
32
32
|
ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
|
|
33
33
|
link: "text-primary underline-offset-4 hover:underline"
|
|
34
|
-
},
|
|
34
|
+
}, ze = {
|
|
35
35
|
default: "h-9 px-4 py-2 has-[>svg]:px-3",
|
|
36
36
|
sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
|
|
37
37
|
lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
|
|
38
38
|
icon: "size-9"
|
|
39
39
|
};
|
|
40
|
-
function
|
|
41
|
-
const
|
|
42
|
-
return [
|
|
40
|
+
function Re(n = {}) {
|
|
41
|
+
const h = n.variant ?? "default", e = n.size ?? "default";
|
|
42
|
+
return [Me, Le[h], ze[e]].join(" ");
|
|
43
43
|
}
|
|
44
|
-
const
|
|
44
|
+
const Ne = ["type", "disabled"], Ke = /* @__PURE__ */ Y({
|
|
45
45
|
__name: "Button",
|
|
46
46
|
props: {
|
|
47
47
|
type: { default: "button" },
|
|
@@ -51,35 +51,35 @@ const ze = ["type", "disabled"], Re = /* @__PURE__ */ q({
|
|
|
51
51
|
disabled: { type: Boolean, default: !1 }
|
|
52
52
|
},
|
|
53
53
|
setup(n) {
|
|
54
|
-
const
|
|
55
|
-
return (e,
|
|
54
|
+
const h = n;
|
|
55
|
+
return (e, g) => (p(), m("button", {
|
|
56
56
|
type: n.type,
|
|
57
57
|
disabled: n.disabled,
|
|
58
58
|
"data-slot": "button",
|
|
59
|
-
class:
|
|
60
|
-
|
|
61
|
-
|
|
59
|
+
class: R(M(ie)(
|
|
60
|
+
M(Re)({ variant: h.variant, size: h.size }),
|
|
61
|
+
h.class
|
|
62
62
|
))
|
|
63
63
|
}, [
|
|
64
64
|
ne(e.$slots, "default")
|
|
65
|
-
], 10,
|
|
65
|
+
], 10, Ne));
|
|
66
66
|
}
|
|
67
|
-
}),
|
|
67
|
+
}), q = {
|
|
68
68
|
getBanks: () => "/api/edoc/banks",
|
|
69
69
|
initializeConsent: () => "/api/edoc/consent/initialize",
|
|
70
70
|
attachAccount: () => "/api/edoc/consent/attach-account",
|
|
71
71
|
getTransactions: () => "/api/edoc/consent/transactions",
|
|
72
72
|
manualUpload: () => "/api/edoc/manual-upload"
|
|
73
|
-
},
|
|
73
|
+
}, Xe = { class: "boi-emts-integration space-y-4" }, We = { key: 0 }, Ge = { class: "boi-emts-instructions rounded-lg border border-amber-200 bg-amber-50 p-4 text-sm" }, He = { class: "list-inside list-decimal space-y-1 text-amber-800" }, Je = ["disabled"], Qe = {
|
|
74
74
|
key: 1,
|
|
75
75
|
class: "boi-emts-otp space-y-3 rounded-lg border-2 border-primary bg-primary/5 p-4"
|
|
76
|
-
},
|
|
76
|
+
}, qe = { class: "flex flex-wrap items-end gap-3" }, Ye = { class: "min-w-[140px]" }, Ze = ["disabled"], et = {
|
|
77
77
|
key: 1,
|
|
78
78
|
class: "text-sm text-red-600"
|
|
79
|
-
},
|
|
79
|
+
}, tt = {
|
|
80
80
|
key: 2,
|
|
81
81
|
class: "text-sm text-amber-600"
|
|
82
|
-
},
|
|
82
|
+
}, be = "inline-flex items-center justify-center rounded-md bg-black px-3 py-1.5 text-xs font-medium text-white shadow-sm hover:bg-neutral-900 focus:outline-none focus:ring-2 focus:ring-black focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50", at = /* @__PURE__ */ Y({
|
|
83
83
|
__name: "EmtsIntegration",
|
|
84
84
|
props: {
|
|
85
85
|
account: {},
|
|
@@ -93,42 +93,42 @@ const ze = ["type", "disabled"], Re = /* @__PURE__ */ q({
|
|
|
93
93
|
integrationBaseUrl: { default: "" }
|
|
94
94
|
},
|
|
95
95
|
emits: ["update:consentId", "statement-retrieved", "error"],
|
|
96
|
-
setup(n, { emit:
|
|
96
|
+
setup(n, { emit: h }) {
|
|
97
97
|
const e = n;
|
|
98
|
-
function
|
|
99
|
-
const
|
|
100
|
-
if (!
|
|
101
|
-
const
|
|
102
|
-
return `${
|
|
98
|
+
function g(i) {
|
|
99
|
+
const s = (e.integrationBaseUrl ?? "").replace(/\/$/, "");
|
|
100
|
+
if (!s) return i;
|
|
101
|
+
const c = i.startsWith("/") ? i : `/${i}`;
|
|
102
|
+
return `${s}${c}`;
|
|
103
103
|
}
|
|
104
|
-
const d =
|
|
105
|
-
function
|
|
106
|
-
const
|
|
107
|
-
return [(
|
|
104
|
+
const d = h, _ = A(!1), $ = A(!1);
|
|
105
|
+
function v(i) {
|
|
106
|
+
const s = e.bankOptions.find((c) => c.value === i);
|
|
107
|
+
return [(s == null ? void 0 : s.label) ?? "", ...(s == null ? void 0 : s.searchKeywords) ?? []].filter(Boolean);
|
|
108
108
|
}
|
|
109
|
-
function
|
|
110
|
-
if (!
|
|
111
|
-
const
|
|
112
|
-
return e.edocBanks.find((
|
|
113
|
-
const
|
|
114
|
-
var
|
|
115
|
-
return (
|
|
109
|
+
function w(i, s = !1) {
|
|
110
|
+
if (!i || !e.edocBanks.length) return;
|
|
111
|
+
const c = v(i);
|
|
112
|
+
return e.edocBanks.find((y) => {
|
|
113
|
+
const j = y.bankCode === i || y.code === i, P = c.some((K) => {
|
|
114
|
+
var X;
|
|
115
|
+
return (X = y.name) == null ? void 0 : X.toLowerCase().includes(K.toLowerCase());
|
|
116
116
|
});
|
|
117
|
-
return (
|
|
117
|
+
return (j || P) && (!s || y.enabled !== !1);
|
|
118
118
|
});
|
|
119
119
|
}
|
|
120
|
-
const
|
|
121
|
-
var
|
|
122
|
-
return !!((
|
|
123
|
-
}),
|
|
124
|
-
var
|
|
125
|
-
const
|
|
126
|
-
return !!
|
|
127
|
-
}),
|
|
128
|
-
var
|
|
129
|
-
return ((
|
|
130
|
-
}, G = (
|
|
131
|
-
email:
|
|
120
|
+
const V = (i) => w(i, !1), C = (i) => !!w(i, !0), U = I(() => {
|
|
121
|
+
var i, s;
|
|
122
|
+
return !!((s = (i = V(e.account.bank)) == null ? void 0 : i.bankInstructions) != null && s.length);
|
|
123
|
+
}), x = I(() => {
|
|
124
|
+
var s;
|
|
125
|
+
const i = e.account;
|
|
126
|
+
return !!i.bank && ((s = i.account_number) == null ? void 0 : s.length) === 10 && !_.value && !$.value;
|
|
127
|
+
}), S = I(() => !!e.account.otp && !$.value), B = (i) => {
|
|
128
|
+
var s, c, y;
|
|
129
|
+
return ((c = (s = i == null ? void 0 : i.response) == null ? void 0 : s.data) == null ? void 0 : c.message) ?? ((y = i == null ? void 0 : i.data) == null ? void 0 : y.message) ?? (i == null ? void 0 : i.message) ?? "An unexpected error occurred";
|
|
130
|
+
}, G = (i) => ({
|
|
131
|
+
email: i,
|
|
132
132
|
referenceId: `loan_${e.applicationId ?? "new"}_${e.account.id}`,
|
|
133
133
|
firstName: "Company",
|
|
134
134
|
lastName: "Account",
|
|
@@ -138,101 +138,101 @@ const ze = ["type", "disabled"], Re = /* @__PURE__ */ q({
|
|
|
138
138
|
redirectionUrl: typeof window < "u" ? window.location.origin + "/loan-application" : "",
|
|
139
139
|
industrialSector: e.industrialSector ?? void 0
|
|
140
140
|
});
|
|
141
|
-
async function
|
|
142
|
-
var
|
|
143
|
-
const
|
|
144
|
-
if (!(
|
|
145
|
-
const
|
|
146
|
-
if (!
|
|
147
|
-
return d("update:consentId",
|
|
148
|
-
consentId:
|
|
149
|
-
bankId:
|
|
141
|
+
async function N(i) {
|
|
142
|
+
var P, K;
|
|
143
|
+
const s = e.account.email || e.companyEmail || "", c = await e.api.post(g(q.initializeConsent()), G(s)), y = c == null ? void 0 : c.data;
|
|
144
|
+
if (!(y != null && y.success)) throw new Error((y == null ? void 0 : y.message) ?? "Failed to initialize consent");
|
|
145
|
+
const j = (K = (P = y == null ? void 0 : y.data) == null ? void 0 : P.data) == null ? void 0 : K.consentId;
|
|
146
|
+
if (!j) throw new Error("No consent ID returned");
|
|
147
|
+
return d("update:consentId", j), await e.api.post(g(q.attachAccount()), {
|
|
148
|
+
consentId: j,
|
|
149
|
+
bankId: i.bankId,
|
|
150
150
|
accountNumber: e.account.account_number,
|
|
151
151
|
accountType: "Business",
|
|
152
152
|
statementDuration: "12",
|
|
153
153
|
monthType: "Period",
|
|
154
154
|
uploadType: "Digital"
|
|
155
|
-
}),
|
|
155
|
+
}), j;
|
|
156
156
|
}
|
|
157
|
-
async function
|
|
158
|
-
var
|
|
159
|
-
const
|
|
157
|
+
async function k() {
|
|
158
|
+
var s;
|
|
159
|
+
const i = V(e.account.bank);
|
|
160
160
|
if (!e.account.bank) return d("error", "Please select a bank");
|
|
161
|
-
if (((
|
|
162
|
-
if (!
|
|
163
|
-
|
|
161
|
+
if (((s = e.account.account_number) == null ? void 0 : s.length) !== 10) return d("error", "Please provide a valid 10-digit account number");
|
|
162
|
+
if (!i) return d("error", "Selected bank does not support electronic statement retrieval");
|
|
163
|
+
_.value = !0;
|
|
164
164
|
try {
|
|
165
|
-
await
|
|
166
|
-
} catch (
|
|
167
|
-
d("error",
|
|
165
|
+
await N(i);
|
|
166
|
+
} catch (c) {
|
|
167
|
+
d("error", B(c));
|
|
168
168
|
} finally {
|
|
169
|
-
|
|
169
|
+
_.value = !1;
|
|
170
170
|
}
|
|
171
171
|
}
|
|
172
|
-
async function
|
|
173
|
-
var
|
|
172
|
+
async function u() {
|
|
173
|
+
var i;
|
|
174
174
|
if (!e.account.otp || !e.account.consent_id) return d("error", "Please enter OTP");
|
|
175
|
-
|
|
175
|
+
$.value = !0;
|
|
176
176
|
try {
|
|
177
|
-
const
|
|
177
|
+
const s = await e.api.post(g(q.getTransactions()), {
|
|
178
178
|
consentId: e.account.consent_id,
|
|
179
179
|
verificationCode: e.account.otp,
|
|
180
180
|
bankStatementId: e.account.id
|
|
181
|
-
}),
|
|
182
|
-
if (!(
|
|
183
|
-
(
|
|
184
|
-
} catch (
|
|
185
|
-
d("error",
|
|
181
|
+
}), c = s == null ? void 0 : s.data;
|
|
182
|
+
if (!(c != null && c.success)) return d("error", (c == null ? void 0 : c.message) ?? "Failed to retrieve transactions");
|
|
183
|
+
(i = c.data) != null && i.statement && d("statement-retrieved", c.data.statement);
|
|
184
|
+
} catch (s) {
|
|
185
|
+
d("error", B(s));
|
|
186
186
|
} finally {
|
|
187
|
-
|
|
187
|
+
$.value = !1;
|
|
188
188
|
}
|
|
189
189
|
}
|
|
190
|
-
async function
|
|
191
|
-
var
|
|
192
|
-
const
|
|
193
|
-
if (!e.account.bank || ((
|
|
190
|
+
async function b() {
|
|
191
|
+
var s, c;
|
|
192
|
+
const i = V(e.account.bank);
|
|
193
|
+
if (!e.account.bank || ((s = e.account.account_number) == null ? void 0 : s.length) !== 10)
|
|
194
194
|
return d("error", "Please select a bank and provide a valid 10-digit account number");
|
|
195
|
-
if (!
|
|
196
|
-
|
|
195
|
+
if (!i) return d("error", "Selected bank does not support electronic statement retrieval");
|
|
196
|
+
$.value = !0;
|
|
197
197
|
try {
|
|
198
|
-
const
|
|
199
|
-
consentId:
|
|
198
|
+
const y = await N(i), j = await e.api.post(g(q.getTransactions()), {
|
|
199
|
+
consentId: y,
|
|
200
200
|
verificationCode: "",
|
|
201
201
|
bankStatementId: e.account.id
|
|
202
|
-
}),
|
|
203
|
-
if (!(
|
|
204
|
-
(
|
|
205
|
-
} catch (
|
|
206
|
-
d("error",
|
|
202
|
+
}), P = j == null ? void 0 : j.data;
|
|
203
|
+
if (!(P != null && P.success)) return d("error", (P == null ? void 0 : P.message) ?? "Failed to retrieve transactions");
|
|
204
|
+
(c = P.data) != null && c.statement && d("statement-retrieved", P.data.statement);
|
|
205
|
+
} catch (y) {
|
|
206
|
+
d("error", B(y));
|
|
207
207
|
} finally {
|
|
208
|
-
|
|
208
|
+
$.value = !1;
|
|
209
209
|
}
|
|
210
210
|
}
|
|
211
|
-
return (
|
|
212
|
-
var
|
|
213
|
-
return
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
l("div",
|
|
217
|
-
|
|
218
|
-
l("ol",
|
|
219
|
-
(
|
|
211
|
+
return (i, s) => {
|
|
212
|
+
var c;
|
|
213
|
+
return p(), m("div", Xe, [
|
|
214
|
+
C(n.account.bank) ? (p(), m("div", We, [
|
|
215
|
+
U.value && !n.account.statement_generated ? (p(), m(J, { key: 0 }, [
|
|
216
|
+
l("div", Ge, [
|
|
217
|
+
s[1] || (s[1] = l("p", { class: "mb-2 font-semibold text-amber-900" }, "Bank-specific instructions", -1)),
|
|
218
|
+
l("ol", He, [
|
|
219
|
+
(p(!0), m(J, null, ae((c = V(n.account.bank)) == null ? void 0 : c.bankInstructions, (y, j) => (p(), m("li", { key: j }, T(y), 1))), 128))
|
|
220
220
|
])
|
|
221
221
|
]),
|
|
222
|
-
|
|
223
|
-
label:
|
|
222
|
+
te(je, {
|
|
223
|
+
label: $.value ? "Retrieving…" : "Retrieve statement",
|
|
224
224
|
variant: "primary",
|
|
225
|
-
disabled: !
|
|
226
|
-
onClick:
|
|
225
|
+
disabled: !x.value || n.disabled,
|
|
226
|
+
onClick: b
|
|
227
227
|
}, null, 8, ["label", "disabled"])
|
|
228
|
-
], 64)) : !
|
|
229
|
-
n.account.showOtpInput ? (
|
|
230
|
-
|
|
231
|
-
l("div",
|
|
232
|
-
l("div",
|
|
233
|
-
|
|
228
|
+
], 64)) : !U.value && !n.account.statement_generated ? (p(), m(J, { key: 1 }, [
|
|
229
|
+
n.account.showOtpInput ? (p(), m("div", Qe, [
|
|
230
|
+
s[3] || (s[3] = l("p", { class: "text-sm font-medium text-gray-700" }, "Enter the OTP sent to your bank-registered email.", -1)),
|
|
231
|
+
l("div", qe, [
|
|
232
|
+
l("div", Ye, [
|
|
233
|
+
s[2] || (s[2] = l("label", { class: "mb-1 block text-xs font-medium text-gray-600" }, "OTP code", -1)),
|
|
234
234
|
oe(l("input", {
|
|
235
|
-
"onUpdate:modelValue":
|
|
235
|
+
"onUpdate:modelValue": s[0] || (s[0] = (y) => n.account.otp = y),
|
|
236
236
|
type: "text",
|
|
237
237
|
maxlength: "6",
|
|
238
238
|
placeholder: "6-digit OTP",
|
|
@@ -243,132 +243,132 @@ const ze = ["type", "disabled"], Re = /* @__PURE__ */ q({
|
|
|
243
243
|
]),
|
|
244
244
|
l("button", {
|
|
245
245
|
type: "button",
|
|
246
|
-
class:
|
|
247
|
-
disabled: !
|
|
248
|
-
onClick:
|
|
249
|
-
}, " Verify OTP ", 8,
|
|
246
|
+
class: R(be),
|
|
247
|
+
disabled: !S.value || n.disabled,
|
|
248
|
+
onClick: u
|
|
249
|
+
}, " Verify OTP ", 8, Ze)
|
|
250
250
|
])
|
|
251
|
-
])) : (
|
|
251
|
+
])) : (p(), m("button", {
|
|
252
252
|
key: 0,
|
|
253
253
|
type: "button",
|
|
254
|
-
class:
|
|
255
|
-
disabled: !
|
|
256
|
-
onClick:
|
|
257
|
-
},
|
|
258
|
-
], 64)) :
|
|
259
|
-
])) :
|
|
260
|
-
n.account.edoc_status === "failed" ? (
|
|
261
|
-
n.account.edoc_status === "processing" ? (
|
|
254
|
+
class: R(be),
|
|
255
|
+
disabled: !x.value || n.disabled,
|
|
256
|
+
onClick: k
|
|
257
|
+
}, T(_.value ? "Sending OTP…" : "Send OTP"), 9, Je))
|
|
258
|
+
], 64)) : O("", !0)
|
|
259
|
+
])) : O("", !0),
|
|
260
|
+
n.account.edoc_status === "failed" ? (p(), m("div", et, "Statement retrieval failed. Please try again or upload manually.")) : O("", !0),
|
|
261
|
+
n.account.edoc_status === "processing" ? (p(), m("div", tt, "Processing…")) : O("", !0)
|
|
262
262
|
]);
|
|
263
263
|
};
|
|
264
264
|
}
|
|
265
265
|
});
|
|
266
|
-
function
|
|
266
|
+
function nt(n) {
|
|
267
267
|
if (!n || typeof n != "object") return [];
|
|
268
|
-
const
|
|
268
|
+
const h = n, e = h.success ? h.data : h.data ?? h;
|
|
269
269
|
return Array.isArray(e) ? e : e && typeof e == "object" && Array.isArray(e.data) ? e.data : [];
|
|
270
270
|
}
|
|
271
|
-
function
|
|
272
|
-
return n === void 0 ?
|
|
271
|
+
function ge(n, h) {
|
|
272
|
+
return n === void 0 ? h : typeof n == "function" ? n() : n;
|
|
273
273
|
}
|
|
274
|
-
function
|
|
275
|
-
const { get:
|
|
276
|
-
let
|
|
274
|
+
function ot(n) {
|
|
275
|
+
const { get: h, getBanksUrl: e, fallbackBanksUrl: g } = n, d = A([]), _ = A([]), $ = A(!1), v = A(null);
|
|
276
|
+
let w = null;
|
|
277
277
|
return {
|
|
278
278
|
edocBanks: d,
|
|
279
|
-
banks:
|
|
280
|
-
loading:
|
|
281
|
-
error:
|
|
282
|
-
loadBanksForStatement: async () => d.value.length > 0 ? d.value :
|
|
283
|
-
var
|
|
279
|
+
banks: _,
|
|
280
|
+
loading: $,
|
|
281
|
+
error: v,
|
|
282
|
+
loadBanksForStatement: async () => d.value.length > 0 ? d.value : w || ($.value = !0, v.value = null, w = (async () => {
|
|
283
|
+
var U, x;
|
|
284
284
|
try {
|
|
285
|
-
const
|
|
286
|
-
if (
|
|
287
|
-
return d.value =
|
|
285
|
+
const S = await h(ge(e, q.getBanks())), B = nt(S == null ? void 0 : S.data);
|
|
286
|
+
if (B.length)
|
|
287
|
+
return d.value = _.value = B, B;
|
|
288
288
|
} catch {
|
|
289
289
|
}
|
|
290
|
-
const
|
|
291
|
-
if (
|
|
290
|
+
const C = g != null ? ge(g, "") : "";
|
|
291
|
+
if (C)
|
|
292
292
|
try {
|
|
293
|
-
const
|
|
294
|
-
return d.value =
|
|
295
|
-
} catch (
|
|
296
|
-
throw
|
|
293
|
+
const S = await h(C), B = Array.isArray(S == null ? void 0 : S.data) ? S.data : [];
|
|
294
|
+
return d.value = _.value = B, B;
|
|
295
|
+
} catch (S) {
|
|
296
|
+
throw v.value = ((x = (U = S == null ? void 0 : S.response) == null ? void 0 : U.data) == null ? void 0 : x.message) ?? "Failed to load banks", S;
|
|
297
297
|
}
|
|
298
298
|
return [];
|
|
299
299
|
})().finally(() => {
|
|
300
|
-
|
|
301
|
-
}),
|
|
300
|
+
$.value = !1, w = null;
|
|
301
|
+
}), w),
|
|
302
302
|
invalidateCache: () => {
|
|
303
|
-
d.value =
|
|
303
|
+
d.value = _.value = [], w = null, v.value = null;
|
|
304
304
|
}
|
|
305
305
|
};
|
|
306
306
|
}
|
|
307
|
-
const
|
|
308
|
-
function
|
|
309
|
-
const
|
|
310
|
-
const
|
|
311
|
-
return
|
|
307
|
+
const Q = A({});
|
|
308
|
+
function st(n) {
|
|
309
|
+
const h = () => typeof n == "function" && n.length === 0 ? n() : n, e = (v) => `${v.bank ?? ""}_${v.account_number ?? ""}`, g = (v) => {
|
|
310
|
+
const w = e(v);
|
|
311
|
+
return Q.value[w] ?? {
|
|
312
312
|
isLoading: !1,
|
|
313
313
|
isSuccess: !1,
|
|
314
314
|
isError: !1
|
|
315
315
|
};
|
|
316
|
-
}, d = (
|
|
317
|
-
|
|
318
|
-
},
|
|
319
|
-
const
|
|
320
|
-
if (!
|
|
321
|
-
delete
|
|
316
|
+
}, d = (v) => {
|
|
317
|
+
v.account_name = "";
|
|
318
|
+
}, _ = async (v) => {
|
|
319
|
+
const w = v.bank, V = v.account_number, C = e(v), U = h();
|
|
320
|
+
if (!U || !w || !V || V.length !== 10) {
|
|
321
|
+
delete Q.value[C], (V == null ? void 0 : V.length) !== 10 && d(v);
|
|
322
322
|
return;
|
|
323
323
|
}
|
|
324
|
-
d(
|
|
324
|
+
d(v), Q.value[C] = { isLoading: !0, isSuccess: !1, isError: !1 };
|
|
325
325
|
try {
|
|
326
|
-
const
|
|
327
|
-
|
|
326
|
+
const x = await U(V, w), S = (x == null ? void 0 : x.account_name) ?? (x == null ? void 0 : x.accountName) ?? "";
|
|
327
|
+
S ? (v.account_name = S, Q.value[C] = { isLoading: !1, isSuccess: !0, isError: !1 }) : Q.value[C] = {
|
|
328
328
|
isLoading: !1,
|
|
329
329
|
isSuccess: !1,
|
|
330
330
|
isError: !0,
|
|
331
331
|
errorMessage: "Account verification failed"
|
|
332
332
|
};
|
|
333
|
-
} catch (
|
|
334
|
-
|
|
333
|
+
} catch (x) {
|
|
334
|
+
Q.value[C] = {
|
|
335
335
|
isLoading: !1,
|
|
336
336
|
isSuccess: !1,
|
|
337
337
|
isError: !0,
|
|
338
|
-
errorMessage:
|
|
338
|
+
errorMessage: x instanceof Error ? x.message : "Verification failed"
|
|
339
339
|
};
|
|
340
340
|
}
|
|
341
341
|
};
|
|
342
342
|
return {
|
|
343
|
-
handleAccountVerification:
|
|
344
|
-
retryVerification: (
|
|
345
|
-
getVerificationState:
|
|
343
|
+
handleAccountVerification: _,
|
|
344
|
+
retryVerification: (v) => _(v),
|
|
345
|
+
getVerificationState: g,
|
|
346
346
|
clearAccountName: d
|
|
347
347
|
};
|
|
348
348
|
}
|
|
349
|
-
const
|
|
350
|
-
function
|
|
351
|
-
const e =
|
|
349
|
+
const ye = "/api/loan-applications";
|
|
350
|
+
function it(n, h = "") {
|
|
351
|
+
const e = h ? `${h.replace(/\/$/, "")}${ye}` : ye, g = String(n);
|
|
352
352
|
return {
|
|
353
|
-
index: `${e}/${
|
|
354
|
-
store: `${e}/${
|
|
355
|
-
update: (d) => `${e}/${
|
|
356
|
-
destroy: (d) => `${e}/${
|
|
357
|
-
uploadToEdoc: (d) => `${e}/${
|
|
353
|
+
index: `${e}/${g}/bank-statements`,
|
|
354
|
+
store: `${e}/${g}/bank-statements`,
|
|
355
|
+
update: (d) => `${e}/${g}/bank-statements/${d}`,
|
|
356
|
+
destroy: (d) => `${e}/${g}/bank-statements/${d}`,
|
|
357
|
+
uploadToEdoc: (d) => `${e}/${g}/bank-statements/${d}/upload-to-edoc`
|
|
358
358
|
};
|
|
359
359
|
}
|
|
360
|
-
const
|
|
361
|
-
urls:
|
|
362
|
-
},
|
|
363
|
-
upload: () => `${
|
|
364
|
-
view: (n) => `${
|
|
365
|
-
},
|
|
360
|
+
const lt = {
|
|
361
|
+
urls: it
|
|
362
|
+
}, he = "", le = {
|
|
363
|
+
upload: () => `${he}/api/files/upload`,
|
|
364
|
+
view: (n) => `${he}/api/files/view?path=${encodeURIComponent(n)}`
|
|
365
|
+
}, rt = ["id", "disabled"], dt = { class: "truncate text-left" }, ut = {
|
|
366
366
|
key: 0,
|
|
367
367
|
class: "absolute z-[1000] mt-1 w-full rounded-lg border border-gray-200 bg-white shadow-lg"
|
|
368
|
-
},
|
|
368
|
+
}, ct = { class: "border-b border-gray-100 p-2" }, pt = { class: "relative" }, mt = { class: "max-h-48 overflow-auto py-1" }, ft = ["onClick"], vt = {
|
|
369
369
|
key: 0,
|
|
370
370
|
class: "px-3 py-2 text-center text-sm italic text-gray-500"
|
|
371
|
-
},
|
|
371
|
+
}, bt = /* @__PURE__ */ Y({
|
|
372
372
|
__name: "BankSelect",
|
|
373
373
|
props: {
|
|
374
374
|
modelValue: {},
|
|
@@ -378,94 +378,94 @@ const st = {
|
|
|
378
378
|
id: {}
|
|
379
379
|
},
|
|
380
380
|
emits: ["update:modelValue"],
|
|
381
|
-
setup(n, { emit:
|
|
382
|
-
const e = n,
|
|
383
|
-
function
|
|
384
|
-
if (!
|
|
385
|
-
const
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
...
|
|
389
|
-
].filter((
|
|
390
|
-
if (
|
|
391
|
-
const
|
|
392
|
-
return
|
|
381
|
+
setup(n, { emit: h }) {
|
|
382
|
+
const e = n, g = h, d = A(!1), _ = A(null), $ = A(null), v = A(""), w = A(-1);
|
|
383
|
+
function V(k, u) {
|
|
384
|
+
if (!u) return !0;
|
|
385
|
+
const b = [
|
|
386
|
+
k.label,
|
|
387
|
+
k.shortName,
|
|
388
|
+
...k.searchKeywords ?? []
|
|
389
|
+
].filter((s) => s != null && String(s).trim() !== "").map((s) => String(s).toLowerCase());
|
|
390
|
+
if (b.some((s) => s.includes(u))) return !0;
|
|
391
|
+
const i = u.split(/\s+/).filter(Boolean);
|
|
392
|
+
return i.length > 1 ? i.every((s) => b.some((c) => c.includes(s))) : b.some((s) => s.startsWith(u));
|
|
393
393
|
}
|
|
394
|
-
const
|
|
395
|
-
var
|
|
396
|
-
if (!((
|
|
397
|
-
if (!
|
|
398
|
-
const
|
|
399
|
-
return e.options.filter((
|
|
400
|
-
}),
|
|
394
|
+
const C = I(() => {
|
|
395
|
+
var u;
|
|
396
|
+
if (!((u = e.options) != null && u.length)) return [];
|
|
397
|
+
if (!v.value.trim()) return e.options;
|
|
398
|
+
const k = v.value.toLowerCase().trim();
|
|
399
|
+
return e.options.filter((b) => V(b, k));
|
|
400
|
+
}), U = I(
|
|
401
401
|
() => {
|
|
402
|
-
var
|
|
403
|
-
return ((
|
|
402
|
+
var k;
|
|
403
|
+
return ((k = e.options) == null ? void 0 : k.find((u) => String(u.value) === String(e.modelValue))) ?? null;
|
|
404
404
|
}
|
|
405
|
-
),
|
|
406
|
-
var
|
|
407
|
-
return ((
|
|
405
|
+
), x = I(() => {
|
|
406
|
+
var k;
|
|
407
|
+
return ((k = U.value) == null ? void 0 : k.label) ?? e.placeholder;
|
|
408
408
|
});
|
|
409
|
-
function
|
|
410
|
-
e.disabled || (d.value = !d.value, d.value && (
|
|
411
|
-
var
|
|
412
|
-
return (
|
|
409
|
+
function S() {
|
|
410
|
+
e.disabled || (d.value = !d.value, d.value && (v.value = "", w.value = C.value.length ? 0 : -1, Ee(() => {
|
|
411
|
+
var k;
|
|
412
|
+
return (k = $.value) == null ? void 0 : k.focus();
|
|
413
413
|
})));
|
|
414
414
|
}
|
|
415
|
-
function
|
|
416
|
-
|
|
415
|
+
function B(k) {
|
|
416
|
+
g("update:modelValue", String(k.value)), d.value = !1, v.value = "";
|
|
417
417
|
}
|
|
418
|
-
function G(
|
|
418
|
+
function G(k) {
|
|
419
419
|
if (!d.value) return;
|
|
420
|
-
const
|
|
421
|
-
switch (
|
|
420
|
+
const u = C.value;
|
|
421
|
+
switch (k.key) {
|
|
422
422
|
case "ArrowDown":
|
|
423
|
-
|
|
423
|
+
k.preventDefault(), w.value = Math.min(w.value + 1, u.length - 1);
|
|
424
424
|
break;
|
|
425
425
|
case "ArrowUp":
|
|
426
|
-
|
|
426
|
+
k.preventDefault(), w.value = Math.max(w.value - 1, 0);
|
|
427
427
|
break;
|
|
428
428
|
case "Enter":
|
|
429
|
-
|
|
429
|
+
k.preventDefault(), w.value >= 0 && u[w.value] && B(u[w.value]);
|
|
430
430
|
break;
|
|
431
431
|
case "Escape":
|
|
432
|
-
|
|
432
|
+
k.preventDefault(), d.value = !1;
|
|
433
433
|
break;
|
|
434
434
|
}
|
|
435
435
|
}
|
|
436
|
-
function
|
|
437
|
-
|
|
436
|
+
function N(k) {
|
|
437
|
+
_.value && !_.value.contains(k.target) && (d.value = !1);
|
|
438
438
|
}
|
|
439
|
-
return de(
|
|
440
|
-
|
|
441
|
-
}), he(() => {
|
|
442
|
-
typeof document < "u" && document.addEventListener("click", y);
|
|
439
|
+
return de(v, () => {
|
|
440
|
+
w.value = C.value.length ? 0 : -1;
|
|
443
441
|
}), ke(() => {
|
|
444
|
-
typeof document < "u" && document.
|
|
445
|
-
}), (
|
|
442
|
+
typeof document < "u" && document.addEventListener("click", N);
|
|
443
|
+
}), xe(() => {
|
|
444
|
+
typeof document < "u" && document.removeEventListener("click", N);
|
|
445
|
+
}), (k, u) => (p(), m("div", {
|
|
446
446
|
ref_key: "selectRef",
|
|
447
|
-
ref:
|
|
447
|
+
ref: _,
|
|
448
448
|
class: "relative"
|
|
449
449
|
}, [
|
|
450
450
|
l("button", {
|
|
451
451
|
type: "button",
|
|
452
452
|
id: n.id,
|
|
453
453
|
disabled: n.disabled,
|
|
454
|
-
class:
|
|
454
|
+
class: R(M(ie)(
|
|
455
455
|
"flex h-9 w-full min-w-0 items-center justify-between rounded-lg border border-gray-300 bg-white px-3 py-2.5 text-sm transition-colors outline-none",
|
|
456
456
|
"focus:border-[var(--boi-primary)] focus:ring-1 focus:ring-[var(--boi-primary)]",
|
|
457
457
|
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
458
|
-
!
|
|
458
|
+
!U.value && "text-gray-500"
|
|
459
459
|
)),
|
|
460
|
-
onClick:
|
|
460
|
+
onClick: S
|
|
461
461
|
}, [
|
|
462
|
-
l("span",
|
|
463
|
-
(
|
|
464
|
-
class:
|
|
462
|
+
l("span", dt, T(x.value), 1),
|
|
463
|
+
(p(), m("svg", {
|
|
464
|
+
class: R(["h-4 w-4 shrink-0 text-gray-400", { "rotate-180": d.value }]),
|
|
465
465
|
fill: "none",
|
|
466
466
|
stroke: "currentColor",
|
|
467
467
|
viewBox: "0 0 24 24"
|
|
468
|
-
}, [...
|
|
468
|
+
}, [...u[1] || (u[1] = [
|
|
469
469
|
l("path", {
|
|
470
470
|
"stroke-linecap": "round",
|
|
471
471
|
"stroke-linejoin": "round",
|
|
@@ -473,11 +473,11 @@ const st = {
|
|
|
473
473
|
d: "M19 9l-7 7-7-7"
|
|
474
474
|
}, null, -1)
|
|
475
475
|
])], 2))
|
|
476
|
-
], 10,
|
|
477
|
-
d.value ? (
|
|
478
|
-
l("div",
|
|
479
|
-
l("div",
|
|
480
|
-
|
|
476
|
+
], 10, rt),
|
|
477
|
+
d.value ? (p(), m("div", ut, [
|
|
478
|
+
l("div", ct, [
|
|
479
|
+
l("div", pt, [
|
|
480
|
+
u[2] || (u[2] = l("svg", {
|
|
481
481
|
class: "absolute left-2.5 top-1/2 h-4 w-4 -translate-y-1/2 text-gray-400",
|
|
482
482
|
fill: "none",
|
|
483
483
|
stroke: "currentColor",
|
|
@@ -492,40 +492,40 @@ const st = {
|
|
|
492
492
|
], -1)),
|
|
493
493
|
oe(l("input", {
|
|
494
494
|
ref_key: "searchRef",
|
|
495
|
-
ref:
|
|
496
|
-
"onUpdate:modelValue":
|
|
495
|
+
ref: $,
|
|
496
|
+
"onUpdate:modelValue": u[0] || (u[0] = (b) => v.value = b),
|
|
497
497
|
type: "text",
|
|
498
498
|
placeholder: "Type to search...",
|
|
499
499
|
class: "w-full rounded-md border-0 bg-gray-50 py-2 pl-9 pr-3 text-sm focus:bg-white focus:ring-1 focus:ring-[var(--boi-primary)]",
|
|
500
500
|
onKeydown: G
|
|
501
501
|
}, null, 544), [
|
|
502
|
-
[re,
|
|
502
|
+
[re, v.value]
|
|
503
503
|
])
|
|
504
504
|
])
|
|
505
505
|
]),
|
|
506
|
-
l("div",
|
|
507
|
-
(
|
|
508
|
-
key:
|
|
506
|
+
l("div", mt, [
|
|
507
|
+
(p(!0), m(J, null, ae(C.value, (b, i) => (p(), m("button", {
|
|
508
|
+
key: b.value,
|
|
509
509
|
type: "button",
|
|
510
|
-
class:
|
|
510
|
+
class: R(M(ie)(
|
|
511
511
|
"w-full cursor-pointer px-3 py-2.5 text-left text-sm transition-colors text-gray-900",
|
|
512
|
-
|
|
513
|
-
String(
|
|
512
|
+
i === w.value ? "bg-gray-100" : "hover:bg-gray-50",
|
|
513
|
+
String(b.value) === String(n.modelValue) && n.modelValue !== "" && n.modelValue !== void 0 && "font-semibold text-[#016837]"
|
|
514
514
|
)),
|
|
515
|
-
onClick: (
|
|
516
|
-
},
|
|
517
|
-
|
|
515
|
+
onClick: (s) => B(b)
|
|
516
|
+
}, T(b.label), 11, ft))), 128)),
|
|
517
|
+
C.value.length === 0 ? (p(), m("p", vt, ' No options found for "' + T(v.value) + '" ', 1)) : O("", !0)
|
|
518
518
|
])
|
|
519
|
-
])) :
|
|
519
|
+
])) : O("", !0)
|
|
520
520
|
], 512));
|
|
521
521
|
}
|
|
522
|
-
}),
|
|
522
|
+
}), gt = { class: "boi-file-input w-full space-y-2" }, yt = ["accept", "disabled", "id"], ht = { class: "truncate text-sm text-gray-600" }, kt = {
|
|
523
523
|
key: 0,
|
|
524
524
|
class: "text-sm text-red-600"
|
|
525
|
-
},
|
|
525
|
+
}, xt = {
|
|
526
526
|
key: 1,
|
|
527
527
|
class: "text-xs text-gray-500"
|
|
528
|
-
},
|
|
528
|
+
}, wt = ["href"], _t = /* @__PURE__ */ Y({
|
|
529
529
|
__name: "FileInput",
|
|
530
530
|
props: {
|
|
531
531
|
modelValue: { default: "" },
|
|
@@ -556,8 +556,8 @@ const st = {
|
|
|
556
556
|
post: {}
|
|
557
557
|
},
|
|
558
558
|
emits: ["update:modelValue", "validation-error", "validation-success", "uploaded"],
|
|
559
|
-
setup(n, { emit:
|
|
560
|
-
const e = n,
|
|
559
|
+
setup(n, { emit: h }) {
|
|
560
|
+
const e = n, g = h, d = A(), _ = A(!1), $ = A(""), v = A(""), w = {
|
|
561
561
|
"application/pdf": "PDF",
|
|
562
562
|
"image/jpeg": "JPG",
|
|
563
563
|
"image/jpg": "JPG",
|
|
@@ -568,7 +568,7 @@ const st = {
|
|
|
568
568
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": "XLSX",
|
|
569
569
|
"text/plain": "TXT",
|
|
570
570
|
"text/csv": "CSV"
|
|
571
|
-
},
|
|
571
|
+
}, V = {
|
|
572
572
|
pdf: ["application/pdf"],
|
|
573
573
|
jpg: ["image/jpeg", "image/jpg"],
|
|
574
574
|
jpeg: ["image/jpeg", "image/jpg"],
|
|
@@ -579,153 +579,159 @@ const st = {
|
|
|
579
579
|
xlsx: ["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],
|
|
580
580
|
txt: ["text/plain"],
|
|
581
581
|
csv: ["text/csv"]
|
|
582
|
-
},
|
|
583
|
-
() => [...new Set(e.allowedTypes.map((
|
|
584
|
-
var
|
|
585
|
-
return
|
|
582
|
+
}, C = I(
|
|
583
|
+
() => [...new Set(e.allowedTypes.map((b) => {
|
|
584
|
+
var i;
|
|
585
|
+
return w[b] || ((i = b.split("/")[1]) == null ? void 0 : i.toUpperCase()) || b;
|
|
586
586
|
}))].join(", ")
|
|
587
|
-
),
|
|
588
|
-
const
|
|
589
|
-
return
|
|
590
|
-
}), G =
|
|
591
|
-
const
|
|
592
|
-
if (!
|
|
593
|
-
const
|
|
594
|
-
return
|
|
587
|
+
), U = I(() => Math.round(e.maxSize / (1024 * 1024))), x = I(() => e.disabled || _.value), S = I(() => String(e.viewApiBase ?? "").trim().replace(/\/$/, "")), B = I(() => {
|
|
588
|
+
const b = String(e.viewStoragePath ?? "").trim();
|
|
589
|
+
return b || String(e.modelValue ?? "").trim();
|
|
590
|
+
}), G = I(() => {
|
|
591
|
+
const b = B.value;
|
|
592
|
+
if (!b || !e.uploadToServer) return "#";
|
|
593
|
+
const i = encodeURIComponent(b), s = S.value;
|
|
594
|
+
return s ? `${s}/api/files/view?path=${i}` : le.view(b);
|
|
595
595
|
});
|
|
596
|
-
function
|
|
597
|
-
var
|
|
598
|
-
if (
|
|
599
|
-
const
|
|
600
|
-
return
|
|
596
|
+
function N(b) {
|
|
597
|
+
var i;
|
|
598
|
+
if (v.value = "", b.size > e.maxSize) {
|
|
599
|
+
const s = `File size must be less than ${U.value}MB`;
|
|
600
|
+
return v.value = s, g("validation-error", s), !1;
|
|
601
601
|
}
|
|
602
602
|
if (e.allowedTypes.length) {
|
|
603
|
-
const
|
|
604
|
-
if (!(e.allowedTypes.includes(
|
|
605
|
-
const
|
|
606
|
-
return
|
|
603
|
+
const s = ((i = b.name.split(".").pop()) == null ? void 0 : i.toLowerCase()) || "";
|
|
604
|
+
if (!(e.allowedTypes.includes(b.type) || (V[s] || []).some((y) => e.allowedTypes.includes(y)))) {
|
|
605
|
+
const y = `Only ${C.value} files are allowed`;
|
|
606
|
+
return v.value = y, g("validation-error", y), !1;
|
|
607
607
|
}
|
|
608
608
|
}
|
|
609
609
|
return !0;
|
|
610
610
|
}
|
|
611
|
-
async function
|
|
612
|
-
var
|
|
613
|
-
|
|
614
|
-
const
|
|
615
|
-
if (!
|
|
616
|
-
|
|
611
|
+
async function k(b) {
|
|
612
|
+
var c, y, j, P;
|
|
613
|
+
v.value = "";
|
|
614
|
+
const i = b.target, s = (c = i.files) == null ? void 0 : c[0];
|
|
615
|
+
if (!s) {
|
|
616
|
+
$.value = "", g("update:modelValue", "");
|
|
617
617
|
return;
|
|
618
618
|
}
|
|
619
|
-
if (!
|
|
620
|
-
|
|
619
|
+
if (!N(s)) {
|
|
620
|
+
i.value = "", $.value = "", g("update:modelValue", "");
|
|
621
621
|
return;
|
|
622
622
|
}
|
|
623
623
|
if (e.uploadToServer && e.post) {
|
|
624
|
-
|
|
625
|
-
const
|
|
626
|
-
|
|
624
|
+
_.value = !0;
|
|
625
|
+
const K = e.uploadUrl ?? le.upload(), X = new FormData();
|
|
626
|
+
X.append("file", s), X.append("folder", "documents"), e.uploadContext && X.append("context", e.uploadContext);
|
|
627
627
|
try {
|
|
628
|
-
const L = await e.post(
|
|
629
|
-
if (
|
|
630
|
-
|
|
628
|
+
const L = await e.post(K, X, { headers: { "Content-Type": "multipart/form-data" } }), E = L == null ? void 0 : L.data;
|
|
629
|
+
if (E != null && E.success && (E != null && E.path))
|
|
630
|
+
$.value = s.name, E.url && console.log("[FileInput] S3 URL:", E.url), g("update:modelValue", E.path), g("validation-success", "File uploaded successfully"), g("uploaded", E.path), (y = e.afterUpload) == null || y.call(e, E.path);
|
|
631
631
|
else {
|
|
632
|
-
const
|
|
633
|
-
|
|
632
|
+
const H = (E == null ? void 0 : E.message) ?? "Upload failed";
|
|
633
|
+
v.value = H, g("validation-error", H), i.value = "", $.value = "", g("update:modelValue", "");
|
|
634
634
|
}
|
|
635
635
|
} catch (L) {
|
|
636
|
-
const
|
|
637
|
-
|
|
636
|
+
const E = ((P = (j = L == null ? void 0 : L.response) == null ? void 0 : j.data) == null ? void 0 : P.message) ?? (L == null ? void 0 : L.message) ?? "Upload failed";
|
|
637
|
+
v.value = E, g("validation-error", E), i.value = "", $.value = "", g("update:modelValue", "");
|
|
638
638
|
} finally {
|
|
639
|
-
|
|
639
|
+
_.value = !1;
|
|
640
640
|
}
|
|
641
641
|
} else
|
|
642
|
-
|
|
642
|
+
$.value = s.name, g("update:modelValue", s.name), g("uploaded", s.name);
|
|
643
643
|
}
|
|
644
|
-
function
|
|
645
|
-
!
|
|
644
|
+
function u() {
|
|
645
|
+
!x.value && d.value && d.value.click();
|
|
646
646
|
}
|
|
647
|
-
return de(() => e.modelValue, (
|
|
648
|
-
|
|
649
|
-
}, { immediate: !0 }), (
|
|
647
|
+
return de(() => e.modelValue, (b) => {
|
|
648
|
+
$.value = (typeof b == "string" && b ? b.split("/").pop() : "") || "";
|
|
649
|
+
}, { immediate: !0 }), (b, i) => (p(), m("div", gt, [
|
|
650
650
|
l("input", {
|
|
651
651
|
ref_key: "fileInput",
|
|
652
652
|
ref: d,
|
|
653
653
|
type: "file",
|
|
654
654
|
accept: n.accept,
|
|
655
|
-
disabled:
|
|
655
|
+
disabled: x.value,
|
|
656
656
|
id: n.id,
|
|
657
657
|
class: "hidden",
|
|
658
|
-
onChange:
|
|
659
|
-
}, null, 40,
|
|
658
|
+
onChange: k
|
|
659
|
+
}, null, 40, yt),
|
|
660
660
|
l("div", {
|
|
661
|
-
class:
|
|
661
|
+
class: R([
|
|
662
662
|
"flex w-full items-center justify-between rounded-md border border-gray-300 bg-white px-3 py-2 transition-colors",
|
|
663
|
-
|
|
664
|
-
|
|
663
|
+
x.value ? "cursor-not-allowed opacity-50" : "cursor-pointer hover:bg-gray-50",
|
|
664
|
+
v.value ? "border-red-500" : ""
|
|
665
665
|
]),
|
|
666
|
-
onClick:
|
|
666
|
+
onClick: u
|
|
667
667
|
}, [
|
|
668
|
-
l("span",
|
|
669
|
-
|
|
668
|
+
l("span", ht, T(_.value ? "Uploading..." : $.value || n.placeholder), 1),
|
|
669
|
+
i[0] || (i[0] = l("span", { class: "text-gray-400" }, "📎", -1))
|
|
670
670
|
], 2),
|
|
671
|
-
|
|
672
|
-
n.showRequirements ? (
|
|
673
|
-
|
|
671
|
+
v.value ? (p(), m("p", kt, T(v.value), 1)) : O("", !0),
|
|
672
|
+
n.showRequirements ? (p(), m("p", xt, "Max " + T(U.value) + " MB. Allowed: " + T(C.value) + ".", 1)) : O("", !0),
|
|
673
|
+
B.value && !_.value && n.uploadToServer ? (p(), m("a", {
|
|
674
674
|
key: 2,
|
|
675
675
|
href: G.value,
|
|
676
676
|
target: "_blank",
|
|
677
677
|
rel: "noopener noreferrer",
|
|
678
678
|
class: "text-sm text-blue-600 hover:underline"
|
|
679
|
-
}, " View document >>> ", 8,
|
|
679
|
+
}, " View document >>> ", 8, wt)) : O("", !0)
|
|
680
680
|
]));
|
|
681
681
|
}
|
|
682
|
-
}),
|
|
682
|
+
}), St = ["disabled"], $t = { class: "px-4 pb-4 md:px-6 md:pb-6" }, Bt = { class: "mb-6 rounded-lg border border-blue-200 bg-blue-50 p-4 text-sm" }, Ct = { class: "text-blue-900" }, At = {
|
|
683
683
|
key: 0,
|
|
684
684
|
class: "mt-3 rounded-md bg-white/80 border border-blue-100 p-3"
|
|
685
|
-
},
|
|
685
|
+
}, It = { class: "list-inside list-disc space-y-0.5 text-xs text-blue-800 columns-2 gap-x-4" }, Vt = {
|
|
686
686
|
key: 1,
|
|
687
687
|
class: "mt-2 text-xs text-blue-700"
|
|
688
|
-
},
|
|
688
|
+
}, Ut = {
|
|
689
|
+
key: 2,
|
|
690
|
+
class: "mt-2 text-xs text-red-700"
|
|
691
|
+
}, Pt = {
|
|
692
|
+
key: 3,
|
|
693
|
+
class: "mt-2 text-xs text-blue-700"
|
|
694
|
+
}, Et = {
|
|
689
695
|
key: 0,
|
|
690
696
|
class: "flex items-center justify-center py-10"
|
|
691
|
-
},
|
|
697
|
+
}, Ot = {
|
|
692
698
|
key: 0,
|
|
693
699
|
class: "flex overflow-x-auto pb-2 gap-1 -mx-1"
|
|
694
|
-
},
|
|
700
|
+
}, Ft = ["onClick"], Dt = { class: "flex items-center justify-between gap-4" }, Tt = { class: "border-b-2 border-primary pb-1 text-base font-semibold text-slate-900" }, jt = ["disabled", "onClick"], Mt = { class: "grid grid-cols-1 gap-4 md:grid-cols-3" }, Lt = ["onUpdate:modelValue", "onBlur"], zt = ["value"], Rt = {
|
|
695
701
|
key: 0,
|
|
696
702
|
class: "mt-1.5 flex flex-wrap items-center gap-2 text-xs"
|
|
697
|
-
},
|
|
703
|
+
}, Nt = {
|
|
698
704
|
key: 0,
|
|
699
705
|
class: "text-blue-600"
|
|
700
|
-
},
|
|
706
|
+
}, Kt = {
|
|
701
707
|
key: 1,
|
|
702
708
|
class: "text-green-600"
|
|
703
|
-
},
|
|
709
|
+
}, Xt = {
|
|
704
710
|
key: 2,
|
|
705
711
|
class: "flex items-center gap-1"
|
|
706
|
-
},
|
|
712
|
+
}, Wt = { class: "text-red-600" }, Gt = ["onClick"], Ht = {
|
|
707
713
|
key: 0,
|
|
708
714
|
class: "boi-emts-wrapper"
|
|
709
|
-
},
|
|
715
|
+
}, Jt = {
|
|
710
716
|
key: 0,
|
|
711
717
|
class: "mt-3 text-sm font-medium text-green-800"
|
|
712
|
-
},
|
|
718
|
+
}, Qt = {
|
|
713
719
|
key: 1,
|
|
714
720
|
class: "rounded-lg border border-gray-200 bg-white p-4"
|
|
715
|
-
},
|
|
721
|
+
}, qt = { class: "rounded-lg py-3" }, Yt = { class: "flex items-center gap-2" }, Zt = {
|
|
716
722
|
key: 0,
|
|
717
723
|
class: "inline-block h-3.5 w-3.5 animate-spin rounded-full border-2 border-current border-t-transparent",
|
|
718
724
|
"aria-hidden": "true"
|
|
719
|
-
},
|
|
725
|
+
}, ea = {
|
|
720
726
|
key: 0,
|
|
721
727
|
class: "mt-1.5 text-sm text-amber-700"
|
|
722
|
-
},
|
|
728
|
+
}, ta = {
|
|
723
729
|
key: 1,
|
|
724
730
|
class: "mt-1.5 text-sm text-red-600"
|
|
725
|
-
},
|
|
731
|
+
}, aa = {
|
|
726
732
|
key: 2,
|
|
727
733
|
class: "rounded-lg border border-red-200 bg-red-50 p-4 flex items-start gap-3"
|
|
728
|
-
},
|
|
734
|
+
}, na = { class: "flex-1 text-sm text-red-800" }, oa = { class: "flex justify-center" }, la = /* @__PURE__ */ Y({
|
|
729
735
|
__name: "BankStatementIntegration",
|
|
730
736
|
props: {
|
|
731
737
|
applicationId: {},
|
|
@@ -743,84 +749,89 @@ const st = {
|
|
|
743
749
|
pollEdocStatus: { type: Boolean, default: !0 }
|
|
744
750
|
},
|
|
745
751
|
emits: ["error"],
|
|
746
|
-
setup(n, { emit:
|
|
747
|
-
const e = n,
|
|
752
|
+
setup(n, { emit: h }) {
|
|
753
|
+
const e = n, g = h;
|
|
748
754
|
function d(t) {
|
|
749
755
|
const a = (e.integrationBaseUrl ?? "").replace(/\/$/, "");
|
|
750
756
|
if (!a) return t;
|
|
751
|
-
const
|
|
752
|
-
return `${a}${
|
|
757
|
+
const o = t.startsWith("/") ? t : `/${t}`;
|
|
758
|
+
return `${a}${o}`;
|
|
753
759
|
}
|
|
754
|
-
const {
|
|
760
|
+
const {
|
|
761
|
+
edocBanks: _,
|
|
762
|
+
loadBanksForStatement: $,
|
|
763
|
+
loading: v,
|
|
764
|
+
error: w
|
|
765
|
+
} = ot({
|
|
755
766
|
get: e.api.get,
|
|
756
|
-
getBanksUrl: () => d(
|
|
767
|
+
getBanksUrl: () => d(q.getBanks())
|
|
757
768
|
}), {
|
|
758
|
-
handleAccountVerification:
|
|
759
|
-
retryVerification:
|
|
760
|
-
getVerificationState:
|
|
761
|
-
} =
|
|
762
|
-
function
|
|
769
|
+
handleAccountVerification: V,
|
|
770
|
+
retryVerification: C,
|
|
771
|
+
getVerificationState: U
|
|
772
|
+
} = st(() => e.verifyBankAccount), x = A(0), S = A(""), B = A(!1), G = A(null);
|
|
773
|
+
function N() {
|
|
763
774
|
var t;
|
|
764
775
|
(t = e.blockAutoSave) == null || t.call(e);
|
|
765
776
|
}
|
|
766
|
-
function
|
|
777
|
+
function k() {
|
|
767
778
|
setTimeout(() => {
|
|
768
779
|
var a;
|
|
769
|
-
const t =
|
|
780
|
+
const t = G.value;
|
|
770
781
|
t && !t.contains(document.activeElement) && ((a = e.unblockAutoSave) == null || a.call(e));
|
|
771
782
|
}, 0);
|
|
772
783
|
}
|
|
773
|
-
const
|
|
774
|
-
let
|
|
775
|
-
const
|
|
784
|
+
const u = A([]), b = A(!1);
|
|
785
|
+
let i = null;
|
|
786
|
+
const s = I(
|
|
776
787
|
() => {
|
|
777
788
|
var t, a;
|
|
778
789
|
return ((t = e.integrationBaseUrl) == null ? void 0 : t.replace(/\/$/, "")) || ((a = e.baseUrl) == null ? void 0 : a.replace(/\/$/, "")) || "";
|
|
779
790
|
}
|
|
780
|
-
),
|
|
781
|
-
() => e.applicationId ?
|
|
782
|
-
),
|
|
791
|
+
), c = I(
|
|
792
|
+
() => e.applicationId ? lt.urls(e.applicationId, s.value) : null
|
|
793
|
+
), y = I(
|
|
783
794
|
() => e.integrationBaseUrl ? d(le.upload()) : void 0
|
|
784
|
-
),
|
|
785
|
-
() =>
|
|
786
|
-
),
|
|
795
|
+
), j = I(() => (e.integrationBaseUrl ?? "").trim().replace(/\/$/, "")), P = I(
|
|
796
|
+
() => u.value.slice(0, e.maxAccounts)
|
|
797
|
+
), K = I(() => u.value.length < e.maxAccounts), X = I(() => u.value.length > 0), L = I(() => {
|
|
787
798
|
var t;
|
|
788
799
|
return ((t = e.formData) == null ? void 0 : t.email) ?? "";
|
|
789
800
|
});
|
|
790
|
-
function
|
|
791
|
-
var
|
|
792
|
-
const t = (
|
|
801
|
+
function E() {
|
|
802
|
+
var o, f;
|
|
803
|
+
const t = (o = e.formData) == null ? void 0 : o.industrial_sector_id;
|
|
793
804
|
if (t == null) return;
|
|
794
|
-
const a = (
|
|
805
|
+
const a = (f = e.industrialSectorOptions) == null ? void 0 : f.find(
|
|
795
806
|
(r) => r.value === t || r.id === t || r.value === String(t)
|
|
796
807
|
);
|
|
797
808
|
return (a == null ? void 0 : a.label) ?? (a == null ? void 0 : a.name);
|
|
798
809
|
}
|
|
799
|
-
function
|
|
810
|
+
function H(t) {
|
|
800
811
|
if (t == null || t === "") return !1;
|
|
801
812
|
const a = t.trim().toLowerCase();
|
|
802
813
|
return a.includes("edoc/statements/") && a.endsWith(".csv");
|
|
803
814
|
}
|
|
804
|
-
function
|
|
815
|
+
function ue(t) {
|
|
805
816
|
const a = (t ?? "").trim();
|
|
806
|
-
return !a ||
|
|
817
|
+
return !a || H(a) ? "" : a;
|
|
807
818
|
}
|
|
808
|
-
function
|
|
809
|
-
var
|
|
810
|
-
const a = (
|
|
819
|
+
function we(t) {
|
|
820
|
+
var f, r;
|
|
821
|
+
const a = (f = t.uploaded_statement_path) == null ? void 0 : f.trim();
|
|
811
822
|
if (a) return a;
|
|
812
|
-
const
|
|
813
|
-
return
|
|
823
|
+
const o = ((r = t.bank_statement) == null ? void 0 : r.trim()) ?? "";
|
|
824
|
+
return o && !H(o) ? o : "";
|
|
814
825
|
}
|
|
815
|
-
function
|
|
816
|
-
t.uploaded_statement_path = a.trim(),
|
|
826
|
+
function _e(t, a) {
|
|
827
|
+
t.uploaded_statement_path = a.trim(), ee(t);
|
|
817
828
|
}
|
|
818
|
-
function
|
|
829
|
+
function ce(t, a) {
|
|
819
830
|
var r;
|
|
820
|
-
const
|
|
821
|
-
return
|
|
831
|
+
const o = ((r = e.bankOptions.find((F) => F.value === t.bank)) == null ? void 0 : r.label) ?? "", f = t.account_number ?? "";
|
|
832
|
+
return o && f ? `${o} (${f})` : o || (f ? `Account (${f})` : `Account ${a + 1}`);
|
|
822
833
|
}
|
|
823
|
-
function
|
|
834
|
+
function Se(t) {
|
|
824
835
|
const a = {
|
|
825
836
|
pending: "bg-gray-100 text-gray-800",
|
|
826
837
|
processing: "bg-amber-100 text-amber-800",
|
|
@@ -829,72 +840,72 @@ const st = {
|
|
|
829
840
|
};
|
|
830
841
|
return a[t] ?? a.pending;
|
|
831
842
|
}
|
|
832
|
-
async function
|
|
833
|
-
if (
|
|
843
|
+
async function $e() {
|
|
844
|
+
if (c.value)
|
|
834
845
|
try {
|
|
835
|
-
|
|
836
|
-
const t = await e.api.get(
|
|
837
|
-
a != null && a.success && Array.isArray(a.data) && (
|
|
838
|
-
...
|
|
846
|
+
b.value = !0;
|
|
847
|
+
const t = await e.api.get(c.value.index), a = t == null ? void 0 : t.data;
|
|
848
|
+
a != null && a.success && Array.isArray(a.data) && (u.value = a.data.map((o) => ({
|
|
849
|
+
...o,
|
|
839
850
|
otp: "",
|
|
840
851
|
showOtpInput: !1,
|
|
841
|
-
uploaded_statement_path:
|
|
852
|
+
uploaded_statement_path: ue(o.bank_statement)
|
|
842
853
|
})));
|
|
843
854
|
} catch (t) {
|
|
844
855
|
console.error("Failed to load bank statements", t);
|
|
845
856
|
} finally {
|
|
846
|
-
|
|
857
|
+
b.value = !1;
|
|
847
858
|
}
|
|
848
859
|
}
|
|
849
|
-
async function
|
|
850
|
-
if (
|
|
860
|
+
async function Be() {
|
|
861
|
+
if (c.value)
|
|
851
862
|
try {
|
|
852
|
-
const t = await e.api.get(
|
|
863
|
+
const t = await e.api.get(c.value.index), a = t == null ? void 0 : t.data;
|
|
853
864
|
if (!(a != null && a.success) || !Array.isArray(a.data)) return;
|
|
854
|
-
const
|
|
855
|
-
|
|
856
|
-
const r = a.data.find((
|
|
857
|
-
if (!r) return
|
|
858
|
-
const
|
|
859
|
-
for (const
|
|
860
|
-
|
|
861
|
-
let
|
|
865
|
+
const o = ["edoc_status", "consent_id", "csv_url", "statement_generated"];
|
|
866
|
+
u.value = u.value.map((f) => {
|
|
867
|
+
const r = a.data.find((D) => D.id === f.id);
|
|
868
|
+
if (!r) return f;
|
|
869
|
+
const F = {};
|
|
870
|
+
for (const D of o)
|
|
871
|
+
D in r && (F[D] = r[D]);
|
|
872
|
+
let z = f.uploaded_statement_path ?? "";
|
|
862
873
|
if ("bank_statement" in r && r.bank_statement !== void 0) {
|
|
863
|
-
const
|
|
864
|
-
|
|
874
|
+
const D = String(r.bank_statement ?? "");
|
|
875
|
+
F.bank_statement = r.bank_statement, D && !H(D) ? z = D : D && H(D) && z || D || (z = "");
|
|
865
876
|
}
|
|
866
|
-
return
|
|
877
|
+
return F.uploaded_statement_path = z, { ...f, ...F };
|
|
867
878
|
});
|
|
868
879
|
} catch (t) {
|
|
869
880
|
console.error("Sync statements failed", t);
|
|
870
881
|
}
|
|
871
882
|
}
|
|
872
|
-
function
|
|
873
|
-
|
|
874
|
-
if (!
|
|
875
|
-
|
|
883
|
+
function pe() {
|
|
884
|
+
Z(), i = setInterval(() => {
|
|
885
|
+
if (!u.value.some((a) => a.edoc_status === "processing")) {
|
|
886
|
+
Z();
|
|
876
887
|
return;
|
|
877
888
|
}
|
|
878
|
-
|
|
889
|
+
Be();
|
|
879
890
|
}, 5e3);
|
|
880
891
|
}
|
|
881
|
-
function
|
|
882
|
-
|
|
892
|
+
function Z() {
|
|
893
|
+
i && (clearInterval(i), i = null);
|
|
883
894
|
}
|
|
884
895
|
de(
|
|
885
|
-
() =>
|
|
896
|
+
() => u.value.some((t) => t.edoc_status === "processing"),
|
|
886
897
|
(t) => {
|
|
887
898
|
if (!e.pollEdocStatus) {
|
|
888
|
-
|
|
899
|
+
Z();
|
|
889
900
|
return;
|
|
890
901
|
}
|
|
891
|
-
t ?
|
|
902
|
+
t ? pe() : Z();
|
|
892
903
|
}
|
|
893
904
|
);
|
|
894
|
-
async function
|
|
895
|
-
if (!(!
|
|
905
|
+
async function ee(t) {
|
|
906
|
+
if (!(!c.value || t.id < 0))
|
|
896
907
|
try {
|
|
897
|
-
await e.api.put(
|
|
908
|
+
await e.api.put(c.value.update(t.id), {
|
|
898
909
|
bank: t.bank,
|
|
899
910
|
account_number: t.account_number,
|
|
900
911
|
account_name: t.account_name,
|
|
@@ -907,8 +918,8 @@ const st = {
|
|
|
907
918
|
console.error("Failed to save bank statement", a);
|
|
908
919
|
}
|
|
909
920
|
}
|
|
910
|
-
async function
|
|
911
|
-
if (!
|
|
921
|
+
async function Ce() {
|
|
922
|
+
if (!c.value || !K.value) return;
|
|
912
923
|
const t = -Date.now(), a = {
|
|
913
924
|
id: t,
|
|
914
925
|
loan_application_id: Number(e.applicationId),
|
|
@@ -917,7 +928,7 @@ const st = {
|
|
|
917
928
|
account_name: "",
|
|
918
929
|
account_type: "",
|
|
919
930
|
bvn: "",
|
|
920
|
-
email:
|
|
931
|
+
email: L.value,
|
|
921
932
|
bank_statement: "",
|
|
922
933
|
csv_url: "",
|
|
923
934
|
consent_id: "",
|
|
@@ -927,144 +938,148 @@ const st = {
|
|
|
927
938
|
showOtpInput: !1,
|
|
928
939
|
uploaded_statement_path: ""
|
|
929
940
|
};
|
|
930
|
-
|
|
941
|
+
u.value.push(a), x.value = u.value.length - 1;
|
|
931
942
|
try {
|
|
932
|
-
const
|
|
933
|
-
if (
|
|
934
|
-
const r =
|
|
935
|
-
r !== -1 && (
|
|
936
|
-
...
|
|
943
|
+
const o = await e.api.post(c.value.store, { email: L.value }), f = o == null ? void 0 : o.data;
|
|
944
|
+
if (f != null && f.success && f.data) {
|
|
945
|
+
const r = u.value.findIndex((F) => F.id === t);
|
|
946
|
+
r !== -1 && (u.value[r] = {
|
|
947
|
+
...f.data,
|
|
937
948
|
otp: "",
|
|
938
949
|
showOtpInput: !1,
|
|
939
|
-
uploaded_statement_path:
|
|
950
|
+
uploaded_statement_path: ue(f.data.bank_statement)
|
|
940
951
|
});
|
|
941
952
|
} else
|
|
942
|
-
|
|
943
|
-
} catch (
|
|
944
|
-
|
|
953
|
+
u.value = u.value.filter((r) => r.id !== t), x.value = Math.max(0, u.value.length - 1);
|
|
954
|
+
} catch (o) {
|
|
955
|
+
u.value = u.value.filter((f) => f.id !== t), x.value = Math.max(0, u.value.length - 1), g("error", (o == null ? void 0 : o.message) ?? "Failed to add account");
|
|
945
956
|
}
|
|
946
957
|
}
|
|
947
|
-
async function
|
|
948
|
-
if (!
|
|
949
|
-
const a =
|
|
950
|
-
if (
|
|
958
|
+
async function Ae(t) {
|
|
959
|
+
if (!c.value) return;
|
|
960
|
+
const a = u.value.findIndex((r) => r.id === t.id), o = { ...t }, f = t.id < 0;
|
|
961
|
+
if (u.value = u.value.filter((r) => r.id !== t.id), x.value = Math.min(x.value, Math.max(0, u.value.length - 1)), !f)
|
|
951
962
|
try {
|
|
952
|
-
await e.api.delete(
|
|
963
|
+
await e.api.delete(c.value.destroy(t.id));
|
|
953
964
|
} catch (r) {
|
|
954
|
-
|
|
965
|
+
u.value = u.value.slice(0, a).concat(o, u.value.slice(a)), g("error", (r == null ? void 0 : r.message) ?? "Failed to remove account");
|
|
955
966
|
}
|
|
956
967
|
}
|
|
957
|
-
function
|
|
958
|
-
t.consent_id = a, t.showOtpInput = !0,
|
|
968
|
+
function Ie(t, a) {
|
|
969
|
+
t.consent_id = a, t.showOtpInput = !0, ee(t);
|
|
959
970
|
}
|
|
960
|
-
function
|
|
961
|
-
Object.assign(t, a),
|
|
971
|
+
function Ve(t, a) {
|
|
972
|
+
Object.assign(t, a), ee(t);
|
|
962
973
|
}
|
|
963
|
-
function
|
|
964
|
-
|
|
974
|
+
function Ue(t) {
|
|
975
|
+
S.value = t, g("error", t);
|
|
965
976
|
}
|
|
966
|
-
function
|
|
967
|
-
|
|
977
|
+
function Pe() {
|
|
978
|
+
S.value = "";
|
|
968
979
|
}
|
|
969
|
-
function
|
|
980
|
+
function me(t) {
|
|
970
981
|
return (a) => {
|
|
971
982
|
var r;
|
|
972
|
-
if (!
|
|
983
|
+
if (!c.value) return;
|
|
973
984
|
(r = e.blockAutoSave) == null || r.call(e), t.edoc_status = "processing";
|
|
974
|
-
const
|
|
985
|
+
const o = E(), f = () => {
|
|
975
986
|
setTimeout(() => {
|
|
976
|
-
var
|
|
977
|
-
return (
|
|
987
|
+
var F;
|
|
988
|
+
return (F = e.unblockAutoSave) == null ? void 0 : F.call(e);
|
|
978
989
|
}, 3e3);
|
|
979
990
|
};
|
|
980
|
-
e.api.post(
|
|
981
|
-
var
|
|
982
|
-
const
|
|
983
|
-
if (
|
|
984
|
-
const
|
|
985
|
-
Object.assign(t,
|
|
991
|
+
e.api.post(c.value.uploadToEdoc(t.id), { filePath: a, industrialSector: o }).then((F) => {
|
|
992
|
+
var D;
|
|
993
|
+
const z = (D = F == null ? void 0 : F.data) == null ? void 0 : D.data;
|
|
994
|
+
if (z) {
|
|
995
|
+
const ve = t.uploaded_statement_path ?? "";
|
|
996
|
+
Object.assign(t, z), ve && z.bank_statement && H(String(z.bank_statement)) && (t.uploaded_statement_path = ve);
|
|
986
997
|
}
|
|
987
|
-
|
|
998
|
+
pe();
|
|
988
999
|
}).catch(() => {
|
|
989
1000
|
t.edoc_status = "failed";
|
|
990
|
-
}).finally(
|
|
1001
|
+
}).finally(f);
|
|
991
1002
|
};
|
|
992
1003
|
}
|
|
993
|
-
const
|
|
994
|
-
if (!t ||
|
|
995
|
-
const a = e.bankOptions.find((
|
|
996
|
-
return
|
|
997
|
-
const r =
|
|
998
|
-
var
|
|
999
|
-
return (
|
|
1004
|
+
const fe = (t) => {
|
|
1005
|
+
if (!t || !_.value.length) return !1;
|
|
1006
|
+
const a = e.bankOptions.find((f) => f.value === t), o = [(a == null ? void 0 : a.label) ?? "", ...(a == null ? void 0 : a.searchKeywords) ?? []].filter(Boolean);
|
|
1007
|
+
return _.value.some((f) => {
|
|
1008
|
+
const r = f.bankCode === t || f.code === t, F = o.some((z) => {
|
|
1009
|
+
var D;
|
|
1010
|
+
return (D = f.name) == null ? void 0 : D.toLowerCase().includes(z.toLowerCase());
|
|
1000
1011
|
});
|
|
1001
|
-
return (r ||
|
|
1012
|
+
return (r || F) && f.enabled !== !1;
|
|
1002
1013
|
});
|
|
1003
|
-
}, se =
|
|
1004
|
-
() => (
|
|
1014
|
+
}, se = I(
|
|
1015
|
+
() => (_.value || []).filter((t) => t.enabled !== !1).map((t) => t.name || t.bankCode || "Unknown").sort((t, a) => t.localeCompare(a))
|
|
1005
1016
|
);
|
|
1006
|
-
return
|
|
1007
|
-
|
|
1008
|
-
}),
|
|
1009
|
-
|
|
1010
|
-
}), (t, a) => (
|
|
1017
|
+
return ke(async () => {
|
|
1018
|
+
$(), e.applicationId && await $e();
|
|
1019
|
+
}), xe(() => {
|
|
1020
|
+
Z();
|
|
1021
|
+
}), (t, a) => (p(), m("fieldset", {
|
|
1011
1022
|
ref_key: "rootRef",
|
|
1012
|
-
ref:
|
|
1023
|
+
ref: G,
|
|
1013
1024
|
disabled: n.isFormDisabled,
|
|
1014
1025
|
class: "boi-bank-statement-integration rounded-xl border border-gray-200 bg-white shadow-sm",
|
|
1015
|
-
onFocusin:
|
|
1016
|
-
onFocusout:
|
|
1026
|
+
onFocusin: N,
|
|
1027
|
+
onFocusout: k
|
|
1017
1028
|
}, [
|
|
1018
|
-
a[
|
|
1029
|
+
a[14] || (a[14] = l("div", { class: "border-b border-gray-100 px-4 py-3 md:px-6 md:py-4" }, [
|
|
1019
1030
|
l("h2", { class: "text-lg font-bold text-slate-900" }, "Company Bank Statements")
|
|
1020
1031
|
], -1)),
|
|
1021
|
-
l("div",
|
|
1022
|
-
l("div",
|
|
1023
|
-
l("p",
|
|
1024
|
-
a[1] || (a[1] =
|
|
1032
|
+
l("div", $t, [
|
|
1033
|
+
l("div", Bt, [
|
|
1034
|
+
l("p", Ct, [
|
|
1035
|
+
a[1] || (a[1] = W(" Some banks support ", -1)),
|
|
1025
1036
|
a[2] || (a[2] = l("strong", null, "Electronic Bank Statement Retrieval", -1)),
|
|
1026
|
-
a[3] || (a[3] =
|
|
1037
|
+
a[3] || (a[3] = W(", so you may not need to upload a PDF. ", -1)),
|
|
1027
1038
|
l("button", {
|
|
1028
1039
|
type: "button",
|
|
1029
|
-
onClick: a[0] || (a[0] = (
|
|
1040
|
+
onClick: a[0] || (a[0] = (o) => B.value = !B.value),
|
|
1030
1041
|
class: "ml-1 font-semibold text-blue-700 underline hover:text-blue-800 focus:outline-none focus:ring-2 focus:ring-blue-300 rounded"
|
|
1031
|
-
},
|
|
1032
|
-
|
|
1042
|
+
}, T(B.value ? "Hide" : "See"), 1),
|
|
1043
|
+
W(" " + T(B.value ? "" : " supported banks."), 1)
|
|
1033
1044
|
]),
|
|
1034
|
-
|
|
1045
|
+
B.value && se.value.length ? (p(), m("div", At, [
|
|
1035
1046
|
a[4] || (a[4] = l("p", { class: "mb-2 text-xs font-semibold text-blue-900" }, "Banks that support electronic statement retrieval:", -1)),
|
|
1036
|
-
l("ul",
|
|
1037
|
-
(
|
|
1047
|
+
l("ul", It, [
|
|
1048
|
+
(p(!0), m(J, null, ae(se.value, (o, f) => (p(), m("li", { key: f }, T(o), 1))), 128))
|
|
1038
1049
|
])
|
|
1039
|
-
])) :
|
|
1050
|
+
])) : B.value && M(v) ? (p(), m("p", Vt, " Loading supported banks… ")) : B.value && M(w) ? (p(), m("p", Ut, [...a[5] || (a[5] = [
|
|
1051
|
+
W(" Could not load the EDOC bank list. Check boi-api / ", -1),
|
|
1052
|
+
l("code", { class: "rounded bg-red-50 px-0.5" }, "/api/boi-api", -1),
|
|
1053
|
+
W(" proxy and network errors. ", -1)
|
|
1054
|
+
])])) : B.value && !se.value.length ? (p(), m("p", Pt, " No banks are returned for electronic retrieval (EDOC list is empty on the API). ")) : O("", !0)
|
|
1040
1055
|
]),
|
|
1041
|
-
|
|
1056
|
+
b.value ? (p(), m("div", Et, [...a[6] || (a[6] = [
|
|
1042
1057
|
l("span", {
|
|
1043
1058
|
class: "inline-block h-5 w-5 animate-spin rounded-full border-2 border-slate-300 border-t-slate-600 mr-2",
|
|
1044
1059
|
"aria-hidden": "true"
|
|
1045
1060
|
}, null, -1),
|
|
1046
1061
|
l("span", { class: "text-sm text-slate-600" }, "Loading bank statements…", -1)
|
|
1047
|
-
])])) : (
|
|
1048
|
-
|
|
1049
|
-
(
|
|
1050
|
-
key:
|
|
1062
|
+
])])) : (p(), m(J, { key: 1 }, [
|
|
1063
|
+
P.value.length ? (p(), m("div", Ot, [
|
|
1064
|
+
(p(!0), m(J, null, ae(P.value, (o, f) => (p(), m("button", {
|
|
1065
|
+
key: o.id,
|
|
1051
1066
|
type: "button",
|
|
1052
|
-
class:
|
|
1053
|
-
onClick: (r) =>
|
|
1054
|
-
},
|
|
1055
|
-
])) :
|
|
1056
|
-
(
|
|
1057
|
-
key:
|
|
1067
|
+
class: R(["shrink-0 rounded-lg px-4 py-2 text-sm font-medium whitespace-nowrap transition-colors", x.value === f ? "bg-primary text-white shadow-sm" : "bg-slate-100 text-slate-700 hover:bg-slate-200"]),
|
|
1068
|
+
onClick: (r) => x.value = f
|
|
1069
|
+
}, T(ce(o, f)), 11, Ft))), 128))
|
|
1070
|
+
])) : O("", !0),
|
|
1071
|
+
(p(!0), m(J, null, ae(P.value, (o, f) => oe((p(), m("div", {
|
|
1072
|
+
key: o.id,
|
|
1058
1073
|
class: "mt-6 space-y-6 rounded-xl border border-gray-100 bg-gray-50/50 p-4 md:p-6"
|
|
1059
1074
|
}, [
|
|
1060
|
-
l("div",
|
|
1061
|
-
l("h4",
|
|
1075
|
+
l("div", Dt, [
|
|
1076
|
+
l("h4", Tt, T(ce(o, f)), 1),
|
|
1062
1077
|
l("button", {
|
|
1063
1078
|
type: "button",
|
|
1064
1079
|
class: "inline-flex items-center rounded-lg px-3 py-2 text-sm font-medium text-red-600 hover:bg-red-50 disabled:opacity-50 transition-colors",
|
|
1065
|
-
disabled: !
|
|
1066
|
-
onClick: (r) =>
|
|
1067
|
-
}, [...a[
|
|
1080
|
+
disabled: !X.value || n.isFormDisabled,
|
|
1081
|
+
onClick: (r) => Ae(o)
|
|
1082
|
+
}, [...a[7] || (a[7] = [
|
|
1068
1083
|
l("svg", {
|
|
1069
1084
|
class: "w-4 h-4 mr-1.5",
|
|
1070
1085
|
fill: "none",
|
|
@@ -1078,142 +1093,142 @@ const st = {
|
|
|
1078
1093
|
d: "M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"
|
|
1079
1094
|
})
|
|
1080
1095
|
], -1),
|
|
1081
|
-
|
|
1082
|
-
])], 8,
|
|
1096
|
+
W(" Remove account ", -1)
|
|
1097
|
+
])], 8, jt)
|
|
1083
1098
|
]),
|
|
1084
1099
|
ne(t.$slots, "account-fields", {
|
|
1085
|
-
account:
|
|
1100
|
+
account: o,
|
|
1086
1101
|
bankOptions: n.bankOptions,
|
|
1087
|
-
verificationState:
|
|
1088
|
-
onVerify: () =>
|
|
1089
|
-
onRetry: () =>
|
|
1102
|
+
verificationState: M(U)(o),
|
|
1103
|
+
onVerify: () => M(V)(o),
|
|
1104
|
+
onRetry: () => M(C)(o)
|
|
1090
1105
|
}, () => [
|
|
1091
|
-
l("div",
|
|
1106
|
+
l("div", Mt, [
|
|
1092
1107
|
l("div", null, [
|
|
1093
|
-
a[
|
|
1094
|
-
|
|
1095
|
-
"model-value":
|
|
1108
|
+
a[8] || (a[8] = l("label", { class: "mb-1.5 block text-sm font-medium text-gray-700" }, "Bank", -1)),
|
|
1109
|
+
te(bt, {
|
|
1110
|
+
"model-value": o.bank,
|
|
1096
1111
|
options: n.bankOptions,
|
|
1097
1112
|
placeholder: "Select bank",
|
|
1098
1113
|
disabled: !!n.isFormDisabled,
|
|
1099
1114
|
"onUpdate:modelValue": (r) => {
|
|
1100
|
-
|
|
1115
|
+
o.bank = r, M(V)(o), ee(o);
|
|
1101
1116
|
}
|
|
1102
1117
|
}, null, 8, ["model-value", "options", "disabled", "onUpdate:modelValue"])
|
|
1103
1118
|
]),
|
|
1104
1119
|
l("div", null, [
|
|
1105
|
-
a[
|
|
1120
|
+
a[9] || (a[9] = l("label", { class: "mb-1.5 block text-sm font-medium text-gray-700" }, "Account number", -1)),
|
|
1106
1121
|
oe(l("input", {
|
|
1107
|
-
"onUpdate:modelValue": (r) =>
|
|
1122
|
+
"onUpdate:modelValue": (r) => o.account_number = r,
|
|
1108
1123
|
type: "text",
|
|
1109
1124
|
maxlength: "10",
|
|
1110
1125
|
inputmode: "numeric",
|
|
1111
1126
|
class: "w-full rounded-lg border border-gray-300 bg-white px-3 py-2.5 text-sm focus:border-primary focus:ring-1 focus:ring-primary",
|
|
1112
1127
|
placeholder: "10 digits",
|
|
1113
1128
|
onBlur: (r) => {
|
|
1114
|
-
|
|
1129
|
+
M(V)(o), ee(o);
|
|
1115
1130
|
}
|
|
1116
|
-
}, null, 40,
|
|
1117
|
-
[re,
|
|
1131
|
+
}, null, 40, Lt), [
|
|
1132
|
+
[re, o.account_number]
|
|
1118
1133
|
])
|
|
1119
1134
|
]),
|
|
1120
1135
|
l("div", null, [
|
|
1121
|
-
a[
|
|
1136
|
+
a[10] || (a[10] = l("label", { class: "mb-1.5 block text-sm font-medium text-gray-700" }, "Account name", -1)),
|
|
1122
1137
|
l("input", {
|
|
1123
|
-
value:
|
|
1138
|
+
value: o.account_name,
|
|
1124
1139
|
type: "text",
|
|
1125
1140
|
readonly: "",
|
|
1126
1141
|
class: "w-full cursor-default rounded-lg border border-gray-200 bg-gray-50 px-3 py-2.5 text-sm text-gray-700",
|
|
1127
1142
|
placeholder: "Enter bank and account number to verify"
|
|
1128
|
-
}, null, 8,
|
|
1129
|
-
n.verifyBankAccount ? (
|
|
1130
|
-
|
|
1131
|
-
l("span",
|
|
1143
|
+
}, null, 8, zt),
|
|
1144
|
+
n.verifyBankAccount ? (p(), m("div", Rt, [
|
|
1145
|
+
M(U)(o).isLoading ? (p(), m("span", Nt, "Verifying…")) : M(U)(o).isSuccess ? (p(), m("span", Kt, "Account verified")) : M(U)(o).isError ? (p(), m("span", Xt, [
|
|
1146
|
+
l("span", Wt, T(M(U)(o).errorMessage), 1),
|
|
1132
1147
|
l("button", {
|
|
1133
1148
|
type: "button",
|
|
1134
1149
|
class: "rounded px-2 py-0.5 text-gray-600 hover:bg-gray-100",
|
|
1135
|
-
onClick: (r) =>
|
|
1136
|
-
}, "Retry", 8,
|
|
1137
|
-
])) :
|
|
1138
|
-
])) :
|
|
1150
|
+
onClick: (r) => M(C)(o)
|
|
1151
|
+
}, "Retry", 8, Gt)
|
|
1152
|
+
])) : O("", !0)
|
|
1153
|
+
])) : O("", !0)
|
|
1139
1154
|
])
|
|
1140
1155
|
])
|
|
1141
1156
|
]),
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
account:
|
|
1145
|
-
"edoc-banks":
|
|
1157
|
+
fe(o.bank) ? (p(), m("div", Ht, [
|
|
1158
|
+
te(at, {
|
|
1159
|
+
account: o,
|
|
1160
|
+
"edoc-banks": M(_),
|
|
1146
1161
|
"bank-options": n.bankOptions,
|
|
1147
1162
|
api: { get: n.api.get, post: n.api.post },
|
|
1148
|
-
"company-email":
|
|
1149
|
-
"industrial-sector":
|
|
1163
|
+
"company-email": L.value,
|
|
1164
|
+
"industrial-sector": E(),
|
|
1150
1165
|
"application-id": n.applicationId,
|
|
1151
1166
|
"integration-base-url": n.integrationBaseUrl,
|
|
1152
1167
|
disabled: n.isFormDisabled,
|
|
1153
|
-
"onUpdate:consentId": (r) =>
|
|
1154
|
-
onStatementRetrieved: (r) =>
|
|
1155
|
-
onError:
|
|
1168
|
+
"onUpdate:consentId": (r) => Ie(o, r),
|
|
1169
|
+
onStatementRetrieved: (r) => Ve(o, r),
|
|
1170
|
+
onError: Ue
|
|
1156
1171
|
}, null, 8, ["account", "edoc-banks", "bank-options", "api", "company-email", "industrial-sector", "application-id", "integration-base-url", "disabled", "onUpdate:consentId", "onStatementRetrieved"]),
|
|
1157
|
-
|
|
1158
|
-
])) :
|
|
1159
|
-
|
|
1160
|
-
a[
|
|
1172
|
+
o.statement_generated || o.edoc_status === "completed" ? (p(), m("p", Jt, " Succeeded. ")) : O("", !0)
|
|
1173
|
+
])) : O("", !0),
|
|
1174
|
+
fe(o.bank) ? O("", !0) : (p(), m("div", Qt, [
|
|
1175
|
+
a[12] || (a[12] = l("p", { class: "mb-3 text-sm font-medium text-gray-700" }, "Upload bank statement (PDF)", -1)),
|
|
1161
1176
|
ne(t.$slots, "file-upload", {
|
|
1162
|
-
account:
|
|
1163
|
-
afterUpload:
|
|
1177
|
+
account: o,
|
|
1178
|
+
afterUpload: me(o)
|
|
1164
1179
|
}, () => [
|
|
1165
|
-
|
|
1166
|
-
modelValue:
|
|
1167
|
-
"onUpdate:modelValue": (r) =>
|
|
1168
|
-
"view-storage-path":
|
|
1169
|
-
post: (r,
|
|
1170
|
-
"upload-url":
|
|
1171
|
-
"view-api-base":
|
|
1180
|
+
te(_t, {
|
|
1181
|
+
modelValue: o.bank_statement,
|
|
1182
|
+
"onUpdate:modelValue": (r) => o.bank_statement = r,
|
|
1183
|
+
"view-storage-path": we(o),
|
|
1184
|
+
post: (r, F, z) => n.api.post(r, F, z),
|
|
1185
|
+
"upload-url": y.value,
|
|
1186
|
+
"view-api-base": j.value || void 0,
|
|
1172
1187
|
placeholder: "Choose 12 months bank statement (PDF)",
|
|
1173
1188
|
accept: ".pdf",
|
|
1174
1189
|
"max-size": 20 * 1024 * 1024,
|
|
1175
1190
|
"allowed-types": ["application/pdf"],
|
|
1176
1191
|
"upload-context": "bank_statement",
|
|
1177
|
-
"after-upload":
|
|
1192
|
+
"after-upload": me(o),
|
|
1178
1193
|
disabled: n.isFormDisabled,
|
|
1179
|
-
onUploaded: (r) =>
|
|
1194
|
+
onUploaded: (r) => _e(o, String(r))
|
|
1180
1195
|
}, null, 8, ["modelValue", "onUpdate:modelValue", "view-storage-path", "post", "upload-url", "view-api-base", "after-upload", "disabled", "onUploaded"]),
|
|
1181
|
-
l("div",
|
|
1182
|
-
l("div",
|
|
1183
|
-
a[
|
|
1196
|
+
l("div", qt, [
|
|
1197
|
+
l("div", Yt, [
|
|
1198
|
+
a[11] || (a[11] = l("span", { class: "text-sm font-medium text-gray-600" }, "Bank statement status:", -1)),
|
|
1184
1199
|
l("span", {
|
|
1185
|
-
class:
|
|
1200
|
+
class: R([Se(o.edoc_status || "pending"), "inline-flex items-center gap-1.5 rounded-full px-3 py-1 text-xs font-medium capitalize"])
|
|
1186
1201
|
}, [
|
|
1187
|
-
|
|
1188
|
-
|
|
1202
|
+
o.edoc_status === "processing" ? (p(), m("span", Zt)) : O("", !0),
|
|
1203
|
+
W(" " + T(o.edoc_status || "pending"), 1)
|
|
1189
1204
|
], 2)
|
|
1190
1205
|
]),
|
|
1191
|
-
|
|
1192
|
-
|
|
1206
|
+
o.edoc_status === "processing" ? (p(), m("p", ea, " Processing in progress. Please wait… ")) : O("", !0),
|
|
1207
|
+
o.edoc_status === "failed" ? (p(), m("p", ta, " Processing failed. Please re-upload a valid bank statement or try another method. ")) : O("", !0)
|
|
1193
1208
|
])
|
|
1194
1209
|
])
|
|
1195
1210
|
])),
|
|
1196
|
-
|
|
1197
|
-
l("p",
|
|
1211
|
+
S.value ? (p(), m("div", aa, [
|
|
1212
|
+
l("p", na, T(S.value), 1),
|
|
1198
1213
|
l("button", {
|
|
1199
1214
|
type: "button",
|
|
1200
1215
|
class: "shrink-0 rounded p-1 text-red-600 hover:bg-red-100",
|
|
1201
|
-
onClick:
|
|
1216
|
+
onClick: Pe,
|
|
1202
1217
|
"aria-label": "Dismiss"
|
|
1203
1218
|
}, "×")
|
|
1204
|
-
])) :
|
|
1219
|
+
])) : O("", !0)
|
|
1205
1220
|
])), [
|
|
1206
|
-
[
|
|
1221
|
+
[Oe, x.value === f]
|
|
1207
1222
|
])), 128)),
|
|
1208
|
-
l("div",
|
|
1209
|
-
|
|
1223
|
+
l("div", oa, [
|
|
1224
|
+
te(Ke, {
|
|
1210
1225
|
type: "button",
|
|
1211
1226
|
variant: "default",
|
|
1212
1227
|
size: "lg",
|
|
1213
|
-
disabled: !
|
|
1214
|
-
onClick:
|
|
1228
|
+
disabled: !K.value || n.isFormDisabled || !n.applicationId,
|
|
1229
|
+
onClick: Ce
|
|
1215
1230
|
}, {
|
|
1216
|
-
default:
|
|
1231
|
+
default: Fe(() => [...a[13] || (a[13] = [
|
|
1217
1232
|
l("svg", {
|
|
1218
1233
|
class: "w-4 h-4",
|
|
1219
1234
|
fill: "none",
|
|
@@ -1227,35 +1242,35 @@ const st = {
|
|
|
1227
1242
|
d: "M12 4v16m8-8H4"
|
|
1228
1243
|
})
|
|
1229
1244
|
], -1),
|
|
1230
|
-
|
|
1245
|
+
W(" Add account ", -1)
|
|
1231
1246
|
])]),
|
|
1232
1247
|
_: 1
|
|
1233
1248
|
}, 8, ["disabled"])
|
|
1234
1249
|
])
|
|
1235
1250
|
], 64))
|
|
1236
1251
|
])
|
|
1237
|
-
], 40,
|
|
1252
|
+
], 40, St));
|
|
1238
1253
|
}
|
|
1239
1254
|
});
|
|
1240
|
-
function
|
|
1255
|
+
function sa(n) {
|
|
1241
1256
|
}
|
|
1242
|
-
const
|
|
1243
|
-
install:
|
|
1257
|
+
const ra = {
|
|
1258
|
+
install: sa
|
|
1244
1259
|
};
|
|
1245
1260
|
export {
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1261
|
+
bt as BankSelect,
|
|
1262
|
+
la as BankStatementIntegration,
|
|
1263
|
+
je as BoiButton,
|
|
1264
|
+
Ke as Button,
|
|
1265
|
+
at as EmtsIntegration,
|
|
1266
|
+
_t as FileInput,
|
|
1267
|
+
lt as bankStatementsApi,
|
|
1268
|
+
it as bankStatementsUrls,
|
|
1269
|
+
ra as default,
|
|
1270
|
+
q as edocApi,
|
|
1256
1271
|
le as filesApi,
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1272
|
+
sa as install,
|
|
1273
|
+
st as useAccountVerification,
|
|
1274
|
+
ot as useEdocBanks
|
|
1260
1275
|
};
|
|
1261
1276
|
//# sourceMappingURL=boi-ui.js.map
|