@lambda-development/erp-core 0.1.7 → 0.1.8
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/index.js +375 -361
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import { jsx as e, jsxs as r, Fragment as Ne } from "react/jsx-runtime";
|
|
|
2
2
|
import { useState as N, useEffect as re, useCallback as we, useContext as In, createContext as Ln, useRef as H, useMemo as Ce, useLayoutEffect as tn, StrictMode as sa } from "react";
|
|
3
3
|
import { createRoot as ia } from "react-dom/client";
|
|
4
4
|
import { useQueryClient as We, useQuery as ie, useMutation as me, QueryClientProvider as la, QueryClient as oa } from "@tanstack/react-query";
|
|
5
|
-
import { NavLink as kt, useLocation as
|
|
5
|
+
import { NavLink as kt, useLocation as dt, useNavigate as Oe, Outlet as ca, Navigate as da, Link as ye, useSearchParams as wt, useParams as ut, createBrowserRouter as ua, RouterProvider as ma } from "react-router-dom";
|
|
6
6
|
import { useTranslation as Z, initReactI18next as pa } from "react-i18next";
|
|
7
7
|
import { BookOpen as ha, ShoppingCart as Bn, CreditCard as ga, FileText as jt, Package as En, BarChart3 as ya, Database as fa, Settings as ba, MessageCircle as xa, ChevronDown as Wt, ChevronRight as Kt, Plus as On, Trash2 as qn, LineChart as va, TrendingUp as Na, ArrowDownRight as Sa, ArrowUpRight as ka, Wallet as wa, Receipt as nn } from "lucide-react";
|
|
8
8
|
import { createColumnHelper as zn, useReactTable as Fn, getCoreRowModel as Mn, flexRender as bt } from "@tanstack/react-table";
|
|
@@ -177,13 +177,13 @@ const O = {
|
|
|
177
177
|
function Ea({ children: t }) {
|
|
178
178
|
const [n, a] = N(null), [s, l] = N(!0);
|
|
179
179
|
re(() => {
|
|
180
|
-
O.authMe().then((
|
|
180
|
+
O.authMe().then((m) => a(m)).catch(() => a(null)).finally(() => l(!1));
|
|
181
181
|
}, []);
|
|
182
|
-
const i = we(async (
|
|
183
|
-
const
|
|
184
|
-
return a(
|
|
185
|
-
}, []), c = we(async (d, u,
|
|
186
|
-
const v = await O.authRegister({ email:
|
|
182
|
+
const i = we(async (m, d) => {
|
|
183
|
+
const u = await O.authLogin(m, d);
|
|
184
|
+
return a(u), u;
|
|
185
|
+
}, []), c = we(async (m, d, u, p) => {
|
|
186
|
+
const v = await O.authRegister({ email: m, full_name: d, password: u, invite_token: p });
|
|
187
187
|
return a(v), v;
|
|
188
188
|
}, []), o = we(async () => {
|
|
189
189
|
try {
|
|
@@ -271,7 +271,7 @@ function Wn(t) {
|
|
|
271
271
|
const n = Qt();
|
|
272
272
|
n.has(t) || (n.add(t), jn(n));
|
|
273
273
|
}
|
|
274
|
-
function
|
|
274
|
+
function dn(t) {
|
|
275
275
|
const n = Qt();
|
|
276
276
|
n.delete(t) && jn(n);
|
|
277
277
|
}
|
|
@@ -284,7 +284,7 @@ function Ve(t) {
|
|
|
284
284
|
return Number.isNaN(a) ? 0 : a;
|
|
285
285
|
}
|
|
286
286
|
function za({ children: t }) {
|
|
287
|
-
const n = We(), [a, s] = N([]), [l, i] = N({}), [c, o] = N({}), [
|
|
287
|
+
const n = We(), [a, s] = N([]), [l, i] = N({}), [c, o] = N({}), [m, d] = N({}), [u, p] = N({}), [v, w] = N({}), [g, y] = N({}), [I, L] = N({}), [C, b] = N(null), [h, A] = N("connecting"), [B, k] = N(0), q = H(null), x = H(null), z = H(/* @__PURE__ */ new Map()), j = H(null), U = H({}), Y = H({}), ce = H(null);
|
|
288
288
|
function T(S) {
|
|
289
289
|
for (const G of z.current.values())
|
|
290
290
|
G.reject(new Error(S));
|
|
@@ -368,12 +368,12 @@ function za({ children: t }) {
|
|
|
368
368
|
}, fe.onmessage = (ve) => {
|
|
369
369
|
var Je;
|
|
370
370
|
try {
|
|
371
|
-
const F = JSON.parse(ve.data), Ye = typeof F.request_id == "string" ? F.request_id : null,
|
|
371
|
+
const F = JSON.parse(ve.data), Ye = typeof F.request_id == "string" ? F.request_id : null, de = typeof F.type == "string" ? F.type : null, P = typeof F.session_id == "string" ? F.session_id : null;
|
|
372
372
|
if (Ye) {
|
|
373
373
|
const R = z.current.get(Ye);
|
|
374
|
-
R && (
|
|
374
|
+
R && (de === "error" ? (z.current.delete(Ye), R.reject(new Error(String(F.content || "Request failed.")))) : de === R.expectedType && (z.current.delete(Ye), R.resolve(F)));
|
|
375
375
|
}
|
|
376
|
-
if (
|
|
376
|
+
if (de === "sessions_list") {
|
|
377
377
|
const R = Array.isArray(F.sessions) ? F.sessions : [];
|
|
378
378
|
Be(R), s(
|
|
379
379
|
Q(
|
|
@@ -385,7 +385,7 @@ function za({ children: t }) {
|
|
|
385
385
|
Te.map(async (be) => {
|
|
386
386
|
try {
|
|
387
387
|
const f = await O.getChatSession(be);
|
|
388
|
-
return !f || f.detail || !f.id ? (
|
|
388
|
+
return !f || f.detail || !f.id ? (dn(be), null) : f;
|
|
389
389
|
} catch {
|
|
390
390
|
return null;
|
|
391
391
|
}
|
|
@@ -399,14 +399,14 @@ function za({ children: t }) {
|
|
|
399
399
|
});
|
|
400
400
|
return;
|
|
401
401
|
}
|
|
402
|
-
if (
|
|
402
|
+
if (de === "session_created") {
|
|
403
403
|
const R = F.session;
|
|
404
404
|
if (!R) return;
|
|
405
405
|
Wn(R.id), Be([R]), oe((M) => [R, ...M.filter(($) => $.id !== R.id)]);
|
|
406
406
|
return;
|
|
407
407
|
}
|
|
408
|
-
if (
|
|
409
|
-
|
|
408
|
+
if (de === "session_deleted" && P) {
|
|
409
|
+
dn(P), oe((M) => M.filter(($) => $.id !== P)), i((M) => {
|
|
410
410
|
const $ = { ...M };
|
|
411
411
|
return delete $[P], $;
|
|
412
412
|
}), w((M) => {
|
|
@@ -421,7 +421,7 @@ function za({ children: t }) {
|
|
|
421
421
|
}), o((M) => {
|
|
422
422
|
const $ = { ...M };
|
|
423
423
|
return delete $[P], $;
|
|
424
|
-
}),
|
|
424
|
+
}), d((M) => {
|
|
425
425
|
const $ = { ...M };
|
|
426
426
|
return delete $[P], $;
|
|
427
427
|
}), p((M) => {
|
|
@@ -432,7 +432,7 @@ function za({ children: t }) {
|
|
|
432
432
|
delete R[P], U.current = R;
|
|
433
433
|
return;
|
|
434
434
|
}
|
|
435
|
-
if (
|
|
435
|
+
if (de === "history_loaded" && P) {
|
|
436
436
|
const R = Array.isArray(F.messages) ? F.messages.map(cn) : [], M = F.before_id != null, $ = !!F.has_more, Te = typeof F.oldest_id == "number" ? F.oldest_id : null;
|
|
437
437
|
i((f) => {
|
|
438
438
|
if (M) {
|
|
@@ -444,7 +444,7 @@ function za({ children: t }) {
|
|
|
444
444
|
return { ...f, [P]: [...ae, ...D] };
|
|
445
445
|
}
|
|
446
446
|
return { ...f, [P]: R };
|
|
447
|
-
}), o((f) => ({ ...f, [P]: $ })),
|
|
447
|
+
}), o((f) => ({ ...f, [P]: $ })), d((f) => ({ ...f, [P]: Te })), p((f) => ({ ...f, [P]: !1 }));
|
|
448
448
|
const be = typeof F.title == "string" ? F.title : null;
|
|
449
449
|
if (be && oe(
|
|
450
450
|
(f) => f.map((D) => D.id === P ? { ...D, title: be } : D)
|
|
@@ -454,11 +454,11 @@ function za({ children: t }) {
|
|
|
454
454
|
}
|
|
455
455
|
return;
|
|
456
456
|
}
|
|
457
|
-
if (
|
|
458
|
-
i((R) => ({ ...R, [P]: [] })), o((R) => ({ ...R, [P]: !1 })),
|
|
457
|
+
if (de === "history_cleared" && P) {
|
|
458
|
+
i((R) => ({ ...R, [P]: [] })), o((R) => ({ ...R, [P]: !1 })), d((R) => ({ ...R, [P]: null })), p((R) => ({ ...R, [P]: !1 })), se(P, !1), le(P, "idle"), ge(P, null);
|
|
459
459
|
return;
|
|
460
460
|
}
|
|
461
|
-
if (
|
|
461
|
+
if (de === "message_added" && P) {
|
|
462
462
|
const R = F.message;
|
|
463
463
|
if (!R) return;
|
|
464
464
|
ne(P, R.created_at), R.role === "user" && ge(P, null), K(P, (M) => [
|
|
@@ -467,11 +467,11 @@ function za({ children: t }) {
|
|
|
467
467
|
]), oe((M) => M);
|
|
468
468
|
return;
|
|
469
469
|
}
|
|
470
|
-
if (
|
|
470
|
+
if (de === "demo_started" && P) {
|
|
471
471
|
le(P, "running"), ge(P, null);
|
|
472
472
|
return;
|
|
473
473
|
}
|
|
474
|
-
if (
|
|
474
|
+
if (de === "demo_typing" && P) {
|
|
475
475
|
le(P, "running"), ge(P, {
|
|
476
476
|
content: String(F.content || ""),
|
|
477
477
|
seq: Math.max(0, Number(F.seq || 0)),
|
|
@@ -479,23 +479,23 @@ function za({ children: t }) {
|
|
|
479
479
|
});
|
|
480
480
|
return;
|
|
481
481
|
}
|
|
482
|
-
if (
|
|
482
|
+
if (de === "demo_replay_complete" && P) {
|
|
483
483
|
le(P, "complete"), ge(P, null);
|
|
484
484
|
return;
|
|
485
485
|
}
|
|
486
|
-
if (
|
|
486
|
+
if (de === "navigation_flash") {
|
|
487
487
|
const R = typeof F.group == "string" ? F.group : "", M = typeof F.item == "string" ? F.item : void 0;
|
|
488
488
|
R && _(R, M);
|
|
489
489
|
return;
|
|
490
490
|
}
|
|
491
|
-
if (
|
|
491
|
+
if (de === "session_title_updated" && P) {
|
|
492
492
|
const R = typeof F.title == "string" ? F.title : "";
|
|
493
493
|
oe(
|
|
494
494
|
(M) => M.map(($) => $.id === P ? { ...$, title: R } : $)
|
|
495
495
|
);
|
|
496
496
|
return;
|
|
497
497
|
}
|
|
498
|
-
if (
|
|
498
|
+
if (de === "thinking" && P) {
|
|
499
499
|
se(P, !0), K(P, (R) => {
|
|
500
500
|
const M = R.find(($) => $.type === "thinking");
|
|
501
501
|
return [
|
|
@@ -510,7 +510,7 @@ function za({ children: t }) {
|
|
|
510
510
|
});
|
|
511
511
|
return;
|
|
512
512
|
}
|
|
513
|
-
if (
|
|
513
|
+
if (de === "llm_provider" && P) {
|
|
514
514
|
const R = typeof F.provider == "string" ? F.provider : void 0, M = typeof F.model == "string" ? F.model : void 0, Te = (typeof F.role == "string" ? F.role : void 0) === "code_specialist" ? "Delegating to code specialist..." : void 0;
|
|
515
515
|
se(P, !0), K(P, (be) => be.some((D) => D.type === "thinking") ? be.map((D) => D.type === "thinking" ? {
|
|
516
516
|
...D,
|
|
@@ -528,7 +528,7 @@ function za({ children: t }) {
|
|
|
528
528
|
]);
|
|
529
529
|
return;
|
|
530
530
|
}
|
|
531
|
-
if (
|
|
531
|
+
if (de === "tool_call" && P) {
|
|
532
532
|
Y.current = {
|
|
533
533
|
...Y.current,
|
|
534
534
|
[P]: {
|
|
@@ -546,7 +546,7 @@ function za({ children: t }) {
|
|
|
546
546
|
]);
|
|
547
547
|
return;
|
|
548
548
|
}
|
|
549
|
-
if (
|
|
549
|
+
if (de === "tool_result" && P) {
|
|
550
550
|
const R = Y.current[P];
|
|
551
551
|
if (R && R.tool === String(F.tool || "") && F.success)
|
|
552
552
|
if (R.tool === "create_custom_analytics_report" || R.tool === "update_custom_analytics_report") {
|
|
@@ -570,11 +570,11 @@ function za({ children: t }) {
|
|
|
570
570
|
]);
|
|
571
571
|
return;
|
|
572
572
|
}
|
|
573
|
-
if (
|
|
573
|
+
if (de === "complete" && P) {
|
|
574
574
|
se(P, !1), K(P, (R) => R.filter((M) => M.type !== "thinking"));
|
|
575
575
|
return;
|
|
576
576
|
}
|
|
577
|
-
if (
|
|
577
|
+
if (de === "error") {
|
|
578
578
|
if (Ye)
|
|
579
579
|
return;
|
|
580
580
|
P && (se(P, !1), K(P, (R) => [
|
|
@@ -632,8 +632,8 @@ function za({ children: t }) {
|
|
|
632
632
|
await _e("load_history", { session_id: S }, "history_loaded");
|
|
633
633
|
}
|
|
634
634
|
async function ze(S) {
|
|
635
|
-
if (
|
|
636
|
-
const G =
|
|
635
|
+
if (u[S]) return;
|
|
636
|
+
const G = m[S];
|
|
637
637
|
if (G != null && c[S]) {
|
|
638
638
|
p((W) => ({ ...W, [S]: !0 }));
|
|
639
639
|
try {
|
|
@@ -675,7 +675,7 @@ function za({ children: t }) {
|
|
|
675
675
|
return S ? !!c[S] : !1;
|
|
676
676
|
}
|
|
677
677
|
function He(S) {
|
|
678
|
-
return S ? !!
|
|
678
|
+
return S ? !!u[S] : !1;
|
|
679
679
|
}
|
|
680
680
|
function pt(S) {
|
|
681
681
|
return S ? g[S] ?? "idle" : "idle";
|
|
@@ -861,20 +861,20 @@ function Bt() {
|
|
|
861
861
|
return /* @__PURE__ */ new Set();
|
|
862
862
|
}
|
|
863
863
|
}
|
|
864
|
-
function
|
|
864
|
+
function un(t) {
|
|
865
865
|
localStorage.setItem(Kn, JSON.stringify([...t]));
|
|
866
866
|
}
|
|
867
867
|
function Ht(t) {
|
|
868
868
|
const [n, a] = N(() => !Bt().has(t)), s = we(() => {
|
|
869
869
|
a((i) => {
|
|
870
870
|
const c = Bt();
|
|
871
|
-
return i ? c.add(t) : c.delete(t),
|
|
871
|
+
return i ? c.add(t) : c.delete(t), un(c), !i;
|
|
872
872
|
});
|
|
873
873
|
}, [t]), l = we(() => {
|
|
874
874
|
a((i) => {
|
|
875
875
|
if (i) return i;
|
|
876
876
|
const c = Bt();
|
|
877
|
-
return c.delete(t),
|
|
877
|
+
return c.delete(t), un(c), !0;
|
|
878
878
|
});
|
|
879
879
|
}, [t]);
|
|
880
880
|
return [n, s, l];
|
|
@@ -891,14 +891,14 @@ const Jt = {
|
|
|
891
891
|
"Custom Analytics": "bg-indigo-300 text-indigo-950 ring-2 ring-inset ring-indigo-100"
|
|
892
892
|
};
|
|
893
893
|
function $a() {
|
|
894
|
-
const [t, n] = Ht("chats"), a =
|
|
894
|
+
const [t, n] = Ht("chats"), a = dt(), s = Oe(), { t: l } = Z(), { sessions: i, createSession: c, deleteSession: o } = tt(), m = async () => {
|
|
895
895
|
try {
|
|
896
|
-
const
|
|
897
|
-
s(`/chat/${
|
|
896
|
+
const u = await c();
|
|
897
|
+
s(`/chat/${u.id}`);
|
|
898
898
|
} catch {
|
|
899
899
|
}
|
|
900
|
-
},
|
|
901
|
-
|
|
900
|
+
}, d = async (u, p) => {
|
|
901
|
+
u.preventDefault(), u.stopPropagation();
|
|
902
902
|
try {
|
|
903
903
|
await o(p), window.location.pathname === `/chat/${p}` && s("/");
|
|
904
904
|
} catch {
|
|
@@ -922,7 +922,7 @@ function $a() {
|
|
|
922
922
|
/* @__PURE__ */ e("li", { children: /* @__PURE__ */ r(
|
|
923
923
|
"button",
|
|
924
924
|
{
|
|
925
|
-
onClick:
|
|
925
|
+
onClick: m,
|
|
926
926
|
className: "flex w-full items-center gap-2 px-4 py-1.5 pl-10 text-sm text-brand transition-colors hover:bg-brand/5",
|
|
927
927
|
children: [
|
|
928
928
|
/* @__PURE__ */ e(On, { className: "h-3.5 w-3.5" }),
|
|
@@ -930,31 +930,31 @@ function $a() {
|
|
|
930
930
|
]
|
|
931
931
|
}
|
|
932
932
|
) }),
|
|
933
|
-
i.map((
|
|
934
|
-
const p = a.pathname === `/chat/${
|
|
933
|
+
i.map((u) => {
|
|
934
|
+
const p = a.pathname === `/chat/${u.id}`;
|
|
935
935
|
return /* @__PURE__ */ r("li", { className: "group relative", children: [
|
|
936
936
|
/* @__PURE__ */ e(
|
|
937
937
|
kt,
|
|
938
938
|
{
|
|
939
|
-
to: `/chat/${
|
|
939
|
+
to: `/chat/${u.id}`,
|
|
940
940
|
className: De(
|
|
941
941
|
"relative block truncate px-4 py-1.5 pl-10 pr-8 text-sm transition-colors",
|
|
942
942
|
p ? "bg-surface-subtle font-medium text-fg" : "text-fg-muted hover:bg-surface-subtle hover:text-fg"
|
|
943
943
|
),
|
|
944
|
-
children:
|
|
944
|
+
children: u.title
|
|
945
945
|
}
|
|
946
946
|
),
|
|
947
947
|
p && /* @__PURE__ */ e(Yt, {}),
|
|
948
948
|
/* @__PURE__ */ e(
|
|
949
949
|
"button",
|
|
950
950
|
{
|
|
951
|
-
onClick: (v) =>
|
|
951
|
+
onClick: (v) => d(v, u.id),
|
|
952
952
|
className: "absolute right-2 top-1/2 -translate-y-1/2 rounded p-0.5 text-fg-muted opacity-0 transition-opacity hover:text-red-500 group-hover:opacity-100",
|
|
953
953
|
title: l("nav.deleteChat"),
|
|
954
954
|
children: /* @__PURE__ */ e(qn, { className: "h-3.5 w-3.5" })
|
|
955
955
|
}
|
|
956
956
|
)
|
|
957
|
-
] },
|
|
957
|
+
] }, u.id);
|
|
958
958
|
})
|
|
959
959
|
] })
|
|
960
960
|
] });
|
|
@@ -969,7 +969,7 @@ function Yt() {
|
|
|
969
969
|
);
|
|
970
970
|
}
|
|
971
971
|
function Va() {
|
|
972
|
-
const [t, n, a] = Ht("custom-analytics"), s =
|
|
972
|
+
const [t, n, a] = Ht("custom-analytics"), s = dt(), l = Oe(), i = We(), { t: c } = Z(), { navigationFlash: o, sessions: m, createSession: d } = tt(), u = (o == null ? void 0 : o.group) === "Custom Analytics", p = Jt["Custom Analytics"], { data: v } = ie({
|
|
973
973
|
queryKey: ["runtime-drafts"],
|
|
974
974
|
queryFn: () => O.listRuntimeDrafts(),
|
|
975
975
|
staleTime: 3e4
|
|
@@ -987,10 +987,10 @@ function Va() {
|
|
|
987
987
|
}, I = async () => {
|
|
988
988
|
var b;
|
|
989
989
|
const L = "Build me a custom analytics report: <describe what you want — e.g. top 10 customers by revenue for the last quarter, or monthly purchases trend by supplier>";
|
|
990
|
-
let C = ((b =
|
|
990
|
+
let C = ((b = m[0]) == null ? void 0 : b.id) || "";
|
|
991
991
|
if (!C)
|
|
992
992
|
try {
|
|
993
|
-
C = (await
|
|
993
|
+
C = (await d()).id;
|
|
994
994
|
} catch {
|
|
995
995
|
l("/reports/analytics");
|
|
996
996
|
return;
|
|
@@ -1005,7 +1005,7 @@ function Va() {
|
|
|
1005
1005
|
onClick: n,
|
|
1006
1006
|
className: De(
|
|
1007
1007
|
"flex w-full items-center gap-2 px-4 py-2 text-xs font-semibold uppercase tracking-wider text-fg-muted transition-all duration-300 hover:text-fg",
|
|
1008
|
-
|
|
1008
|
+
u && p
|
|
1009
1009
|
),
|
|
1010
1010
|
children: [
|
|
1011
1011
|
/* @__PURE__ */ e(va, { className: "h-4 w-4" }),
|
|
@@ -1081,14 +1081,14 @@ function Ua({ group: t }) {
|
|
|
1081
1081
|
kt,
|
|
1082
1082
|
{
|
|
1083
1083
|
to: o.path,
|
|
1084
|
-
className: ({ isActive:
|
|
1084
|
+
className: ({ isActive: m }) => De(
|
|
1085
1085
|
"relative block px-4 py-1.5 pl-10 text-sm transition-all duration-300",
|
|
1086
|
-
!
|
|
1087
|
-
|
|
1086
|
+
!m && "text-fg-muted hover:bg-surface-subtle hover:text-fg",
|
|
1087
|
+
m && "bg-surface-subtle font-medium text-fg",
|
|
1088
1088
|
(l == null ? void 0 : l.group) === t.label && (l == null ? void 0 : l.item) === o.label && c
|
|
1089
1089
|
),
|
|
1090
|
-
children: ({ isActive:
|
|
1091
|
-
|
|
1090
|
+
children: ({ isActive: m }) => /* @__PURE__ */ r(Ne, { children: [
|
|
1091
|
+
m && /* @__PURE__ */ e(Yt, {}),
|
|
1092
1092
|
s(`nav.items.${o.label}`, { defaultValue: o.label })
|
|
1093
1093
|
] })
|
|
1094
1094
|
}
|
|
@@ -1108,16 +1108,14 @@ function ja({ isMobileOpen: t = !1, onClose: n }) {
|
|
|
1108
1108
|
queryKey: ["setup-status"],
|
|
1109
1109
|
queryFn: () => O.setupStatus(),
|
|
1110
1110
|
staleTime: 6e4
|
|
1111
|
-
}), l = (o = s == null ? void 0 : s.companies) == null ? void 0 : o[0], i = (l == null ? void 0 : l.company_name) || (l == null ? void 0 : l.name) || Ma().appName, c = Ce(() => {
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
})) : d;
|
|
1120
|
-
}, [a]);
|
|
1111
|
+
}), l = (o = s == null ? void 0 : s.companies) == null ? void 0 : o[0], i = (l == null ? void 0 : l.company_name) || (l == null ? void 0 : l.name) || Ma().appName, c = Ce(() => Fa().map((d) => ({
|
|
1112
|
+
...d,
|
|
1113
|
+
items: d.items.filter((u) => {
|
|
1114
|
+
if (u.path === "/setup" && (s != null && s.setup_complete)) return !1;
|
|
1115
|
+
const p = Ga[u.path];
|
|
1116
|
+
return !p || !a ? !0 : a[p] !== "0";
|
|
1117
|
+
})
|
|
1118
|
+
})), [a, s]);
|
|
1121
1119
|
return /* @__PURE__ */ r(
|
|
1122
1120
|
"aside",
|
|
1123
1121
|
{
|
|
@@ -1163,7 +1161,7 @@ function ja({ isMobileOpen: t = !1, onClose: n }) {
|
|
|
1163
1161
|
/* @__PURE__ */ r("nav", { className: "flex-1 overflow-y-auto py-3", children: [
|
|
1164
1162
|
/* @__PURE__ */ e($a, {}),
|
|
1165
1163
|
/* @__PURE__ */ e(Va, {}),
|
|
1166
|
-
c.map((
|
|
1164
|
+
c.map((m) => /* @__PURE__ */ e(Ua, { group: m }, m.label))
|
|
1167
1165
|
] })
|
|
1168
1166
|
]
|
|
1169
1167
|
}
|
|
@@ -1193,11 +1191,11 @@ function Ka() {
|
|
|
1193
1191
|
return /* @__PURE__ */ e(za, { children: /* @__PURE__ */ e(Qa, {}) });
|
|
1194
1192
|
}
|
|
1195
1193
|
function Qa() {
|
|
1196
|
-
const { pathname: t } =
|
|
1194
|
+
const { pathname: t } = dt(), { user: n, logout: a } = mt(), { navigationFlash: s } = tt(), { t: l } = Z(), i = Wa(t, l), [c, o] = N(!1);
|
|
1197
1195
|
re(() => {
|
|
1198
1196
|
o(!1);
|
|
1199
1197
|
}, [t]);
|
|
1200
|
-
const
|
|
1198
|
+
const m = s ? Jt[s.group] : null;
|
|
1201
1199
|
return /* @__PURE__ */ r("div", { className: "flex h-dvh bg-surface-muted", children: [
|
|
1202
1200
|
/* @__PURE__ */ e(ja, { isMobileOpen: c, onClose: () => o(!1) }),
|
|
1203
1201
|
c && /* @__PURE__ */ e(
|
|
@@ -1217,7 +1215,7 @@ function Qa() {
|
|
|
1217
1215
|
onClick: () => o(!0),
|
|
1218
1216
|
className: De(
|
|
1219
1217
|
"rounded p-1 text-gray-500 transition-all duration-300 hover:bg-gray-100 hover:text-gray-900 md:hidden",
|
|
1220
|
-
|
|
1218
|
+
m
|
|
1221
1219
|
),
|
|
1222
1220
|
"aria-label": l("header.openMenu"),
|
|
1223
1221
|
children: /* @__PURE__ */ e("svg", { viewBox: "0 0 20 20", fill: "currentColor", width: "22", height: "22", children: /* @__PURE__ */ e("path", { d: "M6.835 4c-.451.004-.82.012-1.137.038-.386.032-.659.085-.876.162l-.2.086c-.44.224-.807.564-1.063.982l-.103.184c-.126.247-.206.562-.248 1.076-.043.523-.043 1.19-.043 2.135v2.664c0 .944 0 1.612.043 2.135.042.515.122.829.248 1.076l.103.184c.256.418.624.758 1.063.982l.2.086c.217.077.49.13.876.162.316.026.685.034 1.136.038zm11.33 7.327c0 .922 0 1.654-.048 2.243-.043.522-.125.977-.305 1.395l-.082.177a4 4 0 0 1-1.473 1.593l-.276.155c-.465.237-.974.338-1.57.387-.59.048-1.322.048-2.244.048H7.833c-.922 0-1.654 0-2.243-.048-.522-.042-.977-.126-1.395-.305l-.176-.082a4 4 0 0 1-1.594-1.473l-.154-.275c-.238-.466-.34-.975-.388-1.572-.048-.589-.048-1.32-.048-2.243V8.663c0-.922 0-1.654.048-2.243.049-.597.15-1.106.388-1.571l.154-.276a4 4 0 0 1 1.594-1.472l.176-.083c.418-.18.873-.263 1.395-.305.589-.048 1.32-.048 2.243-.048h4.334c.922 0 1.654 0 2.243.048.597.049 1.106.15 1.571.388l.276.154a4 4 0 0 1 1.473 1.594l.082.176c.18.418.262.873.305 1.395.048.589.048 1.32.048 2.243zm-10 4.668h4.002c.944 0 1.612 0 2.135-.043.514-.042.829-.122 1.076-.248l.184-.103c.418-.256.758-.624.982-1.063l.086-.2c.077-.217.13-.49.162-.876.043-.523.043-1.19.043-2.135V8.663c0-.944 0-1.612-.043-2.135-.032-.386-.085-.659-.162-.876l-.086-.2a2.67 2.67 0 0 0-.982-1.063l-.184-.103c-.247-.126-.562-.206-1.076-.248-.523-.043-1.19-.043-2.135-.043H8.164L8.165 4z" }) })
|
|
@@ -1246,7 +1244,7 @@ function Qa() {
|
|
|
1246
1244
|
}
|
|
1247
1245
|
function Ha({ children: t }) {
|
|
1248
1246
|
const { user: n, loading: a } = mt();
|
|
1249
|
-
return a ? /* @__PURE__ */ e("div", { className: "flex h-dvh items-center justify-center", children: /* @__PURE__ */ e("div", { className: "text-gray-400", children: "Loading..." }) }) : n ? /* @__PURE__ */ e(Ne, { children: t }) : /* @__PURE__ */ e(
|
|
1247
|
+
return a ? /* @__PURE__ */ e("div", { className: "flex h-dvh items-center justify-center", children: /* @__PURE__ */ e("div", { className: "text-gray-400", children: "Loading..." }) }) : n ? /* @__PURE__ */ e(Ne, { children: t }) : /* @__PURE__ */ e(da, { to: "/login", replace: !0 });
|
|
1250
1248
|
}
|
|
1251
1249
|
function V({ title: t, children: n, className: a, interactive: s }) {
|
|
1252
1250
|
return /* @__PURE__ */ r(
|
|
@@ -1476,9 +1474,9 @@ function J(t, n) {
|
|
|
1476
1474
|
const c = we(
|
|
1477
1475
|
(o) => {
|
|
1478
1476
|
s(
|
|
1479
|
-
(
|
|
1480
|
-
const
|
|
1481
|
-
return o === n || o === "" || o == null ?
|
|
1477
|
+
(m) => {
|
|
1478
|
+
const d = new URLSearchParams(m);
|
|
1479
|
+
return o === n || o === "" || o == null ? d.delete(t) : d.set(t, String(o)), d;
|
|
1482
1480
|
},
|
|
1483
1481
|
{ replace: !0 }
|
|
1484
1482
|
);
|
|
@@ -2234,9 +2232,9 @@ function Ke({ label: t, options: n, value: a, onChange: s, className: l, require
|
|
|
2234
2232
|
),
|
|
2235
2233
|
children: [
|
|
2236
2234
|
/* @__PURE__ */ e("option", { value: "", children: "Select..." }),
|
|
2237
|
-
n.map((
|
|
2238
|
-
const { value:
|
|
2239
|
-
return /* @__PURE__ */ e("option", { value:
|
|
2235
|
+
n.map((m) => {
|
|
2236
|
+
const { value: d, label: u } = sr(m);
|
|
2237
|
+
return /* @__PURE__ */ e("option", { value: d, children: u }, d);
|
|
2240
2238
|
})
|
|
2241
2239
|
]
|
|
2242
2240
|
}
|
|
@@ -2287,14 +2285,14 @@ function cr({ label: t, hint: n }) {
|
|
|
2287
2285
|
n && /* @__PURE__ */ e(ir, { text: n })
|
|
2288
2286
|
] });
|
|
2289
2287
|
}
|
|
2290
|
-
function
|
|
2288
|
+
function dr({
|
|
2291
2289
|
field: t,
|
|
2292
2290
|
value: n,
|
|
2293
2291
|
onChange: a,
|
|
2294
2292
|
disabled: s,
|
|
2295
2293
|
hideLabel: l
|
|
2296
2294
|
}) {
|
|
2297
|
-
const [i, c] = N(n ?? ""), [o,
|
|
2295
|
+
const [i, c] = N(n ?? ""), [o, m] = N(!1), { data: d } = ie({
|
|
2298
2296
|
queryKey: ["link-search", t.linkDoctype, i],
|
|
2299
2297
|
queryFn: () => O.searchLink(t.linkDoctype, i),
|
|
2300
2298
|
enabled: !!t.linkDoctype && o
|
|
@@ -2310,23 +2308,23 @@ function ur({
|
|
|
2310
2308
|
{
|
|
2311
2309
|
label: l ? void 0 : t.label,
|
|
2312
2310
|
value: i,
|
|
2313
|
-
onChange: (
|
|
2314
|
-
c(
|
|
2311
|
+
onChange: (u) => {
|
|
2312
|
+
c(u.target.value), m(!0);
|
|
2315
2313
|
},
|
|
2316
|
-
onFocus: () =>
|
|
2317
|
-
onBlur: () => setTimeout(() =>
|
|
2314
|
+
onFocus: () => m(!0),
|
|
2315
|
+
onBlur: () => setTimeout(() => m(!1), 200)
|
|
2318
2316
|
}
|
|
2319
2317
|
),
|
|
2320
|
-
o &&
|
|
2318
|
+
o && d && d.length > 0 && /* @__PURE__ */ e("ul", { className: "absolute z-10 mt-1 max-h-40 w-full overflow-auto rounded-lg bg-surface ring-1 ring-line shadow-card-hover", children: d.map((u) => /* @__PURE__ */ e(
|
|
2321
2319
|
"li",
|
|
2322
2320
|
{
|
|
2323
2321
|
className: "cursor-pointer px-3 py-2 text-sm text-fg transition-colors hover:bg-surface-subtle",
|
|
2324
2322
|
onMouseDown: () => {
|
|
2325
|
-
a(
|
|
2323
|
+
a(u.name), c(u.name), m(!1);
|
|
2326
2324
|
},
|
|
2327
|
-
children:
|
|
2325
|
+
children: u.name
|
|
2328
2326
|
},
|
|
2329
|
-
|
|
2327
|
+
u.name
|
|
2330
2328
|
)) })
|
|
2331
2329
|
] });
|
|
2332
2330
|
}
|
|
@@ -2340,13 +2338,13 @@ function Vt({
|
|
|
2340
2338
|
currency: c = "USD"
|
|
2341
2339
|
}) {
|
|
2342
2340
|
var w;
|
|
2343
|
-
const { t: o } = Z(),
|
|
2344
|
-
if (
|
|
2341
|
+
const { t: o } = Z(), m = s || !!t.readOnly, d = () => i ? null : /* @__PURE__ */ e(cr, { label: o(`fields.${t.label}`, { defaultValue: t.label }), hint: t.hint }), u = t.type === "select" && t.optionsSource === "currency", p = lr(void 0, u);
|
|
2342
|
+
if (m) {
|
|
2345
2343
|
if (t.type === "link" && n) {
|
|
2346
2344
|
const y = t.linkDoctypeField && l ? String(l[t.linkDoctypeField] ?? "").toLowerCase().replace(/\s+/g, "-") : t.linkDoctype, I = $t(y, String(n));
|
|
2347
2345
|
if (I)
|
|
2348
2346
|
return /* @__PURE__ */ r("div", { children: [
|
|
2349
|
-
/* @__PURE__ */ e(
|
|
2347
|
+
/* @__PURE__ */ e(d, {}),
|
|
2350
2348
|
/* @__PURE__ */ e("p", { className: i ? "text-sm" : "py-2 text-sm", children: /* @__PURE__ */ e(
|
|
2351
2349
|
ye,
|
|
2352
2350
|
{
|
|
@@ -2359,30 +2357,30 @@ function Vt({
|
|
|
2359
2357
|
}
|
|
2360
2358
|
let g = n ?? "-";
|
|
2361
2359
|
return t.type === "currency" && typeof n == "number" && (g = Le(n, c)), /* @__PURE__ */ r("div", { children: [
|
|
2362
|
-
/* @__PURE__ */ e(
|
|
2360
|
+
/* @__PURE__ */ e(d, {}),
|
|
2363
2361
|
/* @__PURE__ */ e("p", { className: i ? "text-sm text-fg" : "py-2 text-sm text-fg", children: g })
|
|
2364
2362
|
] });
|
|
2365
2363
|
}
|
|
2366
2364
|
if (t.type === "link") {
|
|
2367
2365
|
const g = t.linkDoctypeField && l ? { ...t, linkDoctype: (w = l[t.linkDoctypeField]) == null ? void 0 : w.toLowerCase().replace(/\s+/g, "-") } : t;
|
|
2368
2366
|
return /* @__PURE__ */ r("div", { children: [
|
|
2369
|
-
/* @__PURE__ */ e(
|
|
2367
|
+
/* @__PURE__ */ e(d, {}),
|
|
2370
2368
|
/* @__PURE__ */ e(
|
|
2371
|
-
|
|
2369
|
+
dr,
|
|
2372
2370
|
{
|
|
2373
2371
|
field: g,
|
|
2374
2372
|
value: n ?? "",
|
|
2375
2373
|
onChange: a,
|
|
2376
|
-
disabled:
|
|
2374
|
+
disabled: m,
|
|
2377
2375
|
hideLabel: !0
|
|
2378
2376
|
}
|
|
2379
2377
|
)
|
|
2380
2378
|
] });
|
|
2381
2379
|
}
|
|
2382
|
-
if (t.type === "select" && (t.options ||
|
|
2383
|
-
const g =
|
|
2380
|
+
if (t.type === "select" && (t.options || u)) {
|
|
2381
|
+
const g = u ? n && !p.includes(n) ? [n, ...p] : p : t.options;
|
|
2384
2382
|
return /* @__PURE__ */ r("div", { children: [
|
|
2385
|
-
/* @__PURE__ */ e(
|
|
2383
|
+
/* @__PURE__ */ e(d, {}),
|
|
2386
2384
|
/* @__PURE__ */ e(
|
|
2387
2385
|
Ke,
|
|
2388
2386
|
{
|
|
@@ -2395,7 +2393,7 @@ function Vt({
|
|
|
2395
2393
|
}
|
|
2396
2394
|
if (t.type === "textarea")
|
|
2397
2395
|
return /* @__PURE__ */ r("div", { children: [
|
|
2398
|
-
/* @__PURE__ */ e(
|
|
2396
|
+
/* @__PURE__ */ e(d, {}),
|
|
2399
2397
|
/* @__PURE__ */ e(
|
|
2400
2398
|
"textarea",
|
|
2401
2399
|
{
|
|
@@ -2408,7 +2406,7 @@ function Vt({
|
|
|
2408
2406
|
] });
|
|
2409
2407
|
const v = t.type === "number" || t.type === "currency" ? "number" : t.type === "date" ? "date" : "text";
|
|
2410
2408
|
return /* @__PURE__ */ r("div", { children: [
|
|
2411
|
-
/* @__PURE__ */ e(
|
|
2409
|
+
/* @__PURE__ */ e(d, {}),
|
|
2412
2410
|
/* @__PURE__ */ e(
|
|
2413
2411
|
pe,
|
|
2414
2412
|
{
|
|
@@ -2422,50 +2420,50 @@ function Vt({
|
|
|
2422
2420
|
)
|
|
2423
2421
|
] });
|
|
2424
2422
|
}
|
|
2425
|
-
function
|
|
2423
|
+
function ur({
|
|
2426
2424
|
tableDef: t,
|
|
2427
2425
|
rows: n,
|
|
2428
2426
|
onChange: a,
|
|
2429
2427
|
readOnly: s,
|
|
2430
2428
|
currency: l = "USD"
|
|
2431
2429
|
}) {
|
|
2432
|
-
const { t: i } = Z(), c = (
|
|
2430
|
+
const { t: i } = Z(), c = (d, u, p) => {
|
|
2433
2431
|
const v = n.map(
|
|
2434
|
-
(w, g) => g ===
|
|
2432
|
+
(w, g) => g === d ? { ...w, [u]: p } : w
|
|
2435
2433
|
);
|
|
2436
2434
|
a(v);
|
|
2437
2435
|
}, o = () => {
|
|
2438
|
-
const
|
|
2439
|
-
t.fields.forEach((
|
|
2440
|
-
u
|
|
2441
|
-
}), a([...n,
|
|
2442
|
-
},
|
|
2443
|
-
a(n.filter((
|
|
2436
|
+
const d = {};
|
|
2437
|
+
t.fields.forEach((u) => {
|
|
2438
|
+
d[u.name] = u.default ?? (u.type === "number" || u.type === "currency" ? 0 : "");
|
|
2439
|
+
}), a([...n, d]);
|
|
2440
|
+
}, m = (d) => {
|
|
2441
|
+
a(n.filter((u, p) => p !== d));
|
|
2444
2442
|
};
|
|
2445
2443
|
return /* @__PURE__ */ r(V, { title: i(`tables.${t.key}`, { defaultValue: t.label }), children: [
|
|
2446
2444
|
/* @__PURE__ */ e("div", { className: "-mx-6 overflow-x-auto px-6", children: /* @__PURE__ */ r("table", { className: "min-w-full divide-y divide-line text-sm", children: [
|
|
2447
2445
|
/* @__PURE__ */ e("thead", { children: /* @__PURE__ */ r("tr", { children: [
|
|
2448
2446
|
/* @__PURE__ */ e("th", { className: "px-2 py-2 text-left text-xs font-medium uppercase tracking-wide text-fg-muted", children: "#" }),
|
|
2449
|
-
t.fields.map((
|
|
2447
|
+
t.fields.map((d) => /* @__PURE__ */ e(
|
|
2450
2448
|
"th",
|
|
2451
2449
|
{
|
|
2452
2450
|
className: "px-2 py-2 text-left text-xs font-medium uppercase tracking-wide text-fg-muted",
|
|
2453
|
-
children: i(`fields.${
|
|
2451
|
+
children: i(`fields.${d.label}`, { defaultValue: d.label })
|
|
2454
2452
|
},
|
|
2455
|
-
|
|
2453
|
+
d.name
|
|
2456
2454
|
)),
|
|
2457
2455
|
!s && /* @__PURE__ */ e("th", { className: "px-2 py-2 text-left text-xs font-medium uppercase tracking-wide text-fg-muted" })
|
|
2458
2456
|
] }) }),
|
|
2459
|
-
/* @__PURE__ */ e("tbody", { className: "divide-y divide-line", children: n.map((
|
|
2460
|
-
/* @__PURE__ */ e("td", { className: "px-2 py-1 text-fg-muted", children:
|
|
2457
|
+
/* @__PURE__ */ e("tbody", { className: "divide-y divide-line", children: n.map((d, u) => /* @__PURE__ */ r("tr", { children: [
|
|
2458
|
+
/* @__PURE__ */ e("td", { className: "px-2 py-1 text-fg-muted", children: u + 1 }),
|
|
2461
2459
|
t.fields.map((p) => /* @__PURE__ */ e("td", { className: "px-2 py-1 align-top", children: /* @__PURE__ */ e(
|
|
2462
2460
|
Vt,
|
|
2463
2461
|
{
|
|
2464
2462
|
field: p,
|
|
2465
|
-
value:
|
|
2466
|
-
onChange: (v) => c(
|
|
2463
|
+
value: d[p.name],
|
|
2464
|
+
onChange: (v) => c(u, p.name, v),
|
|
2467
2465
|
readOnly: s,
|
|
2468
|
-
rowData:
|
|
2466
|
+
rowData: d,
|
|
2469
2467
|
hideLabel: !0,
|
|
2470
2468
|
currency: l
|
|
2471
2469
|
}
|
|
@@ -2475,11 +2473,11 @@ function dr({
|
|
|
2475
2473
|
{
|
|
2476
2474
|
variant: "ghost",
|
|
2477
2475
|
size: "sm",
|
|
2478
|
-
onClick: () =>
|
|
2476
|
+
onClick: () => m(u),
|
|
2479
2477
|
children: "Remove"
|
|
2480
2478
|
}
|
|
2481
2479
|
) })
|
|
2482
|
-
] },
|
|
2480
|
+
] }, u)) })
|
|
2483
2481
|
] }) }),
|
|
2484
2482
|
!s && /* @__PURE__ */ e("div", { className: "mt-2", children: /* @__PURE__ */ e(X, { variant: "secondary", size: "sm", onClick: o, children: i("common.addRow") }) })
|
|
2485
2483
|
] });
|
|
@@ -2493,23 +2491,23 @@ function mr({
|
|
|
2493
2491
|
config: i,
|
|
2494
2492
|
onSave: c,
|
|
2495
2493
|
onSubmit: o,
|
|
2496
|
-
onCancel:
|
|
2497
|
-
onConvert:
|
|
2494
|
+
onCancel: m,
|
|
2495
|
+
onConvert: d
|
|
2498
2496
|
}) {
|
|
2499
|
-
const { t:
|
|
2497
|
+
const { t: u } = Z();
|
|
2500
2498
|
if (!i) return null;
|
|
2501
2499
|
const p = !t && n && a ? `/api/documents/${n}/${encodeURIComponent(a)}/pdf` : null;
|
|
2502
2500
|
return /* @__PURE__ */ r("div", { className: "flex flex-wrap gap-2", children: [
|
|
2503
|
-
p && /* @__PURE__ */ e(X, { variant: "secondary", onClick: () => window.open(p, "_blank"), children:
|
|
2504
|
-
s < 1 && /* @__PURE__ */ e(X, { onClick: c, disabled: l, children:
|
|
2505
|
-
!t && i.canSubmit && s === 0 && /* @__PURE__ */ e(X, { variant: "secondary", onClick: o, children:
|
|
2506
|
-
!t && i.canCancel && s === 1 && /* @__PURE__ */ e(X, { variant: "danger", onClick:
|
|
2501
|
+
p && /* @__PURE__ */ e(X, { variant: "secondary", onClick: () => window.open(p, "_blank"), children: u("common.pdf") }),
|
|
2502
|
+
s < 1 && /* @__PURE__ */ e(X, { onClick: c, disabled: l, children: u(l ? "common.saving" : "common.save") }),
|
|
2503
|
+
!t && i.canSubmit && s === 0 && /* @__PURE__ */ e(X, { variant: "secondary", onClick: o, children: u("common.submit") }),
|
|
2504
|
+
!t && i.canCancel && s === 1 && /* @__PURE__ */ e(X, { variant: "danger", onClick: m, children: u("common.cancelDoc") }),
|
|
2507
2505
|
!t && s === 1 && i.conversions.map((v) => /* @__PURE__ */ e(
|
|
2508
2506
|
X,
|
|
2509
2507
|
{
|
|
2510
2508
|
variant: "secondary",
|
|
2511
|
-
onClick: () =>
|
|
2512
|
-
children:
|
|
2509
|
+
onClick: () => d(v.targetDoctype),
|
|
2510
|
+
children: u(`conversions.${v.label}`, { defaultValue: v.label })
|
|
2513
2511
|
},
|
|
2514
2512
|
v.targetDoctype
|
|
2515
2513
|
))
|
|
@@ -2539,7 +2537,7 @@ function pn(t, n) {
|
|
|
2539
2537
|
}
|
|
2540
2538
|
function hn() {
|
|
2541
2539
|
var ge;
|
|
2542
|
-
const { doctype: t, name: n } =
|
|
2540
|
+
const { doctype: t, name: n } = ut(), a = Oe(), s = We(), { t: l } = Z(), i = Qn(t ?? ""), c = !n, [o, m] = N({}), [d, u] = N(!1), { data: p, isLoading: v } = ie({
|
|
2543
2541
|
queryKey: ["document", t, n],
|
|
2544
2542
|
queryFn: () => O.getDocument(t, n),
|
|
2545
2543
|
enabled: !!t && !!n && !c
|
|
@@ -2553,18 +2551,18 @@ function hn() {
|
|
|
2553
2551
|
staleTime: 300 * 1e3
|
|
2554
2552
|
});
|
|
2555
2553
|
re(() => {
|
|
2556
|
-
if (!c || !w ||
|
|
2554
|
+
if (!c || !w || d) return;
|
|
2557
2555
|
let _;
|
|
2558
2556
|
if (y) {
|
|
2559
2557
|
if (!L) return;
|
|
2560
2558
|
_ = L.default_currency || I;
|
|
2561
2559
|
} else
|
|
2562
2560
|
_ = I;
|
|
2563
|
-
_ && _ !== o.currency &&
|
|
2561
|
+
_ && _ !== o.currency && m((Q) => ({ ...Q, currency: _ }));
|
|
2564
2562
|
}, [
|
|
2565
2563
|
c,
|
|
2566
2564
|
w,
|
|
2567
|
-
|
|
2565
|
+
d,
|
|
2568
2566
|
y,
|
|
2569
2567
|
L,
|
|
2570
2568
|
I,
|
|
@@ -2576,8 +2574,8 @@ function hn() {
|
|
|
2576
2574
|
Q.type === "date" ? _[Q.name] = (/* @__PURE__ */ new Date()).toISOString().split("T")[0] : _[Q.name] = Q.default ?? "";
|
|
2577
2575
|
}), i.childTables.forEach((Q) => {
|
|
2578
2576
|
_[Q.key] = [];
|
|
2579
|
-
}), _.docstatus = 0,
|
|
2580
|
-
} else p &&
|
|
2577
|
+
}), _.docstatus = 0, m(_);
|
|
2578
|
+
} else p && m(p);
|
|
2581
2579
|
}, [c, p, i]);
|
|
2582
2580
|
const C = me({
|
|
2583
2581
|
mutationFn: (_) => O.createDocument(t, _),
|
|
@@ -2587,17 +2585,17 @@ function hn() {
|
|
|
2587
2585
|
}), b = me({
|
|
2588
2586
|
mutationFn: (_) => O.updateDocument(t, n, _),
|
|
2589
2587
|
onSuccess: (_) => {
|
|
2590
|
-
s.invalidateQueries({ queryKey: ["document", t, n] }), s.invalidateQueries({ queryKey: ["documents", t] }),
|
|
2588
|
+
s.invalidateQueries({ queryKey: ["document", t, n] }), s.invalidateQueries({ queryKey: ["documents", t] }), m(_);
|
|
2591
2589
|
}
|
|
2592
2590
|
}), h = me({
|
|
2593
2591
|
mutationFn: () => O.submitDocument(t, n),
|
|
2594
2592
|
onSuccess: (_) => {
|
|
2595
|
-
|
|
2593
|
+
m(_), s.invalidateQueries({ queryKey: ["document", t, n] }), s.invalidateQueries({ queryKey: ["documents", t] });
|
|
2596
2594
|
}
|
|
2597
2595
|
}), A = me({
|
|
2598
2596
|
mutationFn: () => O.cancelDocument(t, n),
|
|
2599
2597
|
onSuccess: (_) => {
|
|
2600
|
-
|
|
2598
|
+
m(_), s.invalidateQueries({ queryKey: ["document", t, n] }), s.invalidateQueries({ queryKey: ["documents", t] });
|
|
2601
2599
|
}
|
|
2602
2600
|
}), B = me({
|
|
2603
2601
|
mutationFn: (_) => O.convertDocument(t, n, _),
|
|
@@ -2607,7 +2605,7 @@ function hn() {
|
|
|
2607
2605
|
}
|
|
2608
2606
|
}), k = we(
|
|
2609
2607
|
(_, Q) => {
|
|
2610
|
-
_ === "currency" &&
|
|
2608
|
+
_ === "currency" && u(!0), m((oe) => {
|
|
2611
2609
|
const ne = { ...oe, [_]: Q };
|
|
2612
2610
|
return _ === "currency" && (ne.conversion_rate = 0), pn(ne, i);
|
|
2613
2611
|
});
|
|
@@ -2615,7 +2613,7 @@ function hn() {
|
|
|
2615
2613
|
[i]
|
|
2616
2614
|
), q = we(
|
|
2617
2615
|
(_, Q) => {
|
|
2618
|
-
|
|
2616
|
+
m((oe) => {
|
|
2619
2617
|
const ne = { ...oe, [_]: Q };
|
|
2620
2618
|
return pn(ne, i);
|
|
2621
2619
|
});
|
|
@@ -2687,7 +2685,7 @@ function hn() {
|
|
|
2687
2685
|
_.name
|
|
2688
2686
|
)) }) }),
|
|
2689
2687
|
i.childTables.map((_) => /* @__PURE__ */ e(
|
|
2690
|
-
|
|
2688
|
+
ur,
|
|
2691
2689
|
{
|
|
2692
2690
|
tableDef: _,
|
|
2693
2691
|
rows: o[_.key] ?? [],
|
|
@@ -2711,7 +2709,7 @@ function hn() {
|
|
|
2711
2709
|
)) }) })
|
|
2712
2710
|
] });
|
|
2713
2711
|
}
|
|
2714
|
-
function
|
|
2712
|
+
function ue(t) {
|
|
2715
2713
|
return t.toISOString().split("T")[0];
|
|
2716
2714
|
}
|
|
2717
2715
|
function Hn(t) {
|
|
@@ -2746,45 +2744,45 @@ const hr = [
|
|
|
2746
2744
|
{
|
|
2747
2745
|
label: "Today",
|
|
2748
2746
|
range: () => {
|
|
2749
|
-
const t =
|
|
2747
|
+
const t = ue(/* @__PURE__ */ new Date());
|
|
2750
2748
|
return [t, t];
|
|
2751
2749
|
}
|
|
2752
2750
|
},
|
|
2753
2751
|
{
|
|
2754
2752
|
label: "This Week",
|
|
2755
|
-
range: () => [
|
|
2753
|
+
range: () => [ue(Hn(/* @__PURE__ */ new Date())), ue(pr(/* @__PURE__ */ new Date()))]
|
|
2756
2754
|
},
|
|
2757
2755
|
{
|
|
2758
2756
|
label: "This Month",
|
|
2759
|
-
range: () => [
|
|
2757
|
+
range: () => [ue(gn(/* @__PURE__ */ new Date())), ue(vt(/* @__PURE__ */ new Date()))]
|
|
2760
2758
|
},
|
|
2761
2759
|
{
|
|
2762
2760
|
label: "This Quarter",
|
|
2763
|
-
range: () => [
|
|
2761
|
+
range: () => [ue(Ut(/* @__PURE__ */ new Date())), ue(Gt(/* @__PURE__ */ new Date()))]
|
|
2764
2762
|
},
|
|
2765
2763
|
{
|
|
2766
2764
|
label: "This Year",
|
|
2767
|
-
range: () => [
|
|
2765
|
+
range: () => [ue(yn(/* @__PURE__ */ new Date())), ue(Nt(/* @__PURE__ */ new Date()))]
|
|
2768
2766
|
},
|
|
2769
2767
|
{
|
|
2770
2768
|
label: "Last Month",
|
|
2771
2769
|
range: () => {
|
|
2772
2770
|
const t = /* @__PURE__ */ new Date(), n = new Date(t.getFullYear(), t.getMonth() - 1, 1);
|
|
2773
|
-
return [
|
|
2771
|
+
return [ue(gn(n)), ue(vt(n))];
|
|
2774
2772
|
}
|
|
2775
2773
|
},
|
|
2776
2774
|
{
|
|
2777
2775
|
label: "Last Quarter",
|
|
2778
2776
|
range: () => {
|
|
2779
2777
|
const t = /* @__PURE__ */ new Date(), n = new Date(t.getFullYear(), t.getMonth() - 3, 1);
|
|
2780
|
-
return [
|
|
2778
|
+
return [ue(Ut(n)), ue(Gt(n))];
|
|
2781
2779
|
}
|
|
2782
2780
|
},
|
|
2783
2781
|
{
|
|
2784
2782
|
label: "Last Year",
|
|
2785
2783
|
range: () => {
|
|
2786
2784
|
const t = new Date((/* @__PURE__ */ new Date()).getFullYear() - 1, 6, 1);
|
|
2787
|
-
return [
|
|
2785
|
+
return [ue(yn(t)), ue(Nt(t))];
|
|
2788
2786
|
}
|
|
2789
2787
|
}
|
|
2790
2788
|
];
|
|
@@ -2805,15 +2803,15 @@ function Dt({ onSelect: t }) {
|
|
|
2805
2803
|
}
|
|
2806
2804
|
function en({ onSelect: t }) {
|
|
2807
2805
|
return /* @__PURE__ */ e("div", { className: "flex flex-wrap gap-1.5", children: [
|
|
2808
|
-
{ label: "Today", value: () =>
|
|
2809
|
-
{ label: "End of This Month", value: () =>
|
|
2806
|
+
{ label: "Today", value: () => ue(/* @__PURE__ */ new Date()) },
|
|
2807
|
+
{ label: "End of This Month", value: () => ue(vt(/* @__PURE__ */ new Date())) },
|
|
2810
2808
|
{ label: "End of Last Month", value: () => {
|
|
2811
2809
|
const a = /* @__PURE__ */ new Date();
|
|
2812
|
-
return
|
|
2810
|
+
return ue(vt(new Date(a.getFullYear(), a.getMonth() - 1, 1)));
|
|
2813
2811
|
} },
|
|
2814
|
-
{ label: "End of This Quarter", value: () =>
|
|
2815
|
-
{ label: "End of This Year", value: () =>
|
|
2816
|
-
{ label: "End of Last Year", value: () =>
|
|
2812
|
+
{ label: "End of This Quarter", value: () => ue(Gt(/* @__PURE__ */ new Date())) },
|
|
2813
|
+
{ label: "End of This Year", value: () => ue(Nt(/* @__PURE__ */ new Date())) },
|
|
2814
|
+
{ label: "End of Last Year", value: () => ue(Nt(new Date((/* @__PURE__ */ new Date()).getFullYear() - 1, 0, 1))) }
|
|
2817
2815
|
].map((a) => /* @__PURE__ */ e(
|
|
2818
2816
|
"button",
|
|
2819
2817
|
{
|
|
@@ -2856,10 +2854,10 @@ function br(t) {
|
|
|
2856
2854
|
}
|
|
2857
2855
|
const xr = ["25", "50", "100", "200"];
|
|
2858
2856
|
function vr() {
|
|
2859
|
-
const { t } = Z(), { doctype: n } =
|
|
2857
|
+
const { t } = Z(), { doctype: n } = ut(), a = Qn(n ?? ""), [s] = J("status", "All"), [l] = J("from", ""), [i] = J("to", ""), [c] = J("per_page", 50), [o] = J("page", 1), m = o - 1, d = Me(), u = (x) => d({ page: x === 0 ? null : x + 1 }), p = (x) => d({ status: x === "All" ? null : x, page: null }), v = (x) => d({ from: x || null, page: null }), w = (x) => d({ to: x || null, page: null }), g = (x) => d({ per_page: x, page: null }), y = Ce(() => {
|
|
2860
2858
|
const x = {};
|
|
2861
|
-
return s !== "All" && (x.status = s), l && (x.from_date = l), i && (x.to_date = i), x.limit = c, x.offset =
|
|
2862
|
-
}, [s, l, i, c,
|
|
2859
|
+
return s !== "All" && (x.status = s), l && (x.from_date = l), i && (x.to_date = i), x.limit = c, x.offset = m * c, x;
|
|
2860
|
+
}, [s, l, i, c, m]), { data: I, isLoading: L } = nr(n ?? "", y), C = (I == null ? void 0 : I.rows) ?? [], b = (I == null ? void 0 : I.total) ?? 0, h = Math.max(1, Math.ceil(b / c)), A = b === 0 ? 0 : m * c + 1, B = Math.min(b, (m + 1) * c), k = Ce(() => {
|
|
2863
2861
|
if (!a) return [];
|
|
2864
2862
|
const x = zn(), z = (j) => {
|
|
2865
2863
|
const U = j.split("_").map((Y) => Y.charAt(0).toUpperCase() + Y.slice(1)).join(" ");
|
|
@@ -2975,7 +2973,7 @@ function vr() {
|
|
|
2975
2973
|
}
|
|
2976
2974
|
)
|
|
2977
2975
|
] }),
|
|
2978
|
-
/* @__PURE__ */ e(Dt, { onSelect: (x, z) =>
|
|
2976
|
+
/* @__PURE__ */ e(Dt, { onSelect: (x, z) => d({ from: x, to: z, page: null }) }),
|
|
2979
2977
|
L ? /* @__PURE__ */ e("p", { className: "text-fg-muted", children: t("common.loading") }) : C.length === 0 ? /* @__PURE__ */ e("p", { className: "py-8 text-center text-fg-muted", children: t("reports.noDocuments") }) : /* @__PURE__ */ r(Ne, { children: [
|
|
2980
2978
|
/* @__PURE__ */ e("div", { className: "overflow-x-auto rounded-xl bg-surface ring-1 ring-line shadow-card", children: /* @__PURE__ */ r("table", { className: "min-w-full divide-y divide-line text-sm", children: [
|
|
2981
2979
|
/* @__PURE__ */ e("thead", { className: "bg-surface-subtle", children: q.getHeaderGroups().map((x) => /* @__PURE__ */ e("tr", { children: x.headers.map((z) => /* @__PURE__ */ e(
|
|
@@ -3024,8 +3022,8 @@ function vr() {
|
|
|
3024
3022
|
/* @__PURE__ */ e(
|
|
3025
3023
|
"button",
|
|
3026
3024
|
{
|
|
3027
|
-
onClick: () =>
|
|
3028
|
-
disabled:
|
|
3025
|
+
onClick: () => u(Math.max(0, m - 1)),
|
|
3026
|
+
disabled: m === 0,
|
|
3029
3027
|
className: "rounded-md bg-surface px-3 py-1 text-sm text-fg ring-1 ring-line transition-colors hover:bg-surface-subtle disabled:cursor-not-allowed disabled:opacity-40",
|
|
3030
3028
|
children: t("common.prev")
|
|
3031
3029
|
}
|
|
@@ -3033,7 +3031,7 @@ function vr() {
|
|
|
3033
3031
|
/* @__PURE__ */ r("span", { className: "text-xs", children: [
|
|
3034
3032
|
t("common.page"),
|
|
3035
3033
|
" ",
|
|
3036
|
-
/* @__PURE__ */ e("span", { className: "font-medium text-fg", children:
|
|
3034
|
+
/* @__PURE__ */ e("span", { className: "font-medium text-fg", children: m + 1 }),
|
|
3037
3035
|
" ",
|
|
3038
3036
|
t("common.of"),
|
|
3039
3037
|
" ",
|
|
@@ -3042,8 +3040,8 @@ function vr() {
|
|
|
3042
3040
|
/* @__PURE__ */ e(
|
|
3043
3041
|
"button",
|
|
3044
3042
|
{
|
|
3045
|
-
onClick: () =>
|
|
3046
|
-
disabled:
|
|
3043
|
+
onClick: () => u(Math.min(h - 1, m + 1)),
|
|
3044
|
+
disabled: m >= h - 1,
|
|
3047
3045
|
className: "rounded-md bg-surface px-3 py-1 text-sm text-fg ring-1 ring-line transition-colors hover:bg-surface-subtle disabled:cursor-not-allowed disabled:opacity-40",
|
|
3048
3046
|
children: t("common.next")
|
|
3049
3047
|
}
|
|
@@ -3059,7 +3057,7 @@ function vr() {
|
|
|
3059
3057
|
const Nr = ["25", "50", "100", "200"];
|
|
3060
3058
|
function Sr() {
|
|
3061
3059
|
var b;
|
|
3062
|
-
const { type: t } =
|
|
3060
|
+
const { type: t } = ut(), n = Oe(), s = (b = dt().state) == null ? void 0 : b.notice, [l] = J("per_page", 50), [i] = J("page", 1), c = i - 1, o = Me(), m = (h) => o({ page: h === 0 ? null : h + 1 }), d = (h) => o({ per_page: h, page: null }), { data: u, isLoading: p } = ie({
|
|
3063
3061
|
queryKey: ["masters", t, c, l],
|
|
3064
3062
|
queryFn: () => O.listMasters(t, {
|
|
3065
3063
|
include_disabled: 1,
|
|
@@ -3067,7 +3065,7 @@ function Sr() {
|
|
|
3067
3065
|
offset: c * l
|
|
3068
3066
|
}),
|
|
3069
3067
|
enabled: !!t
|
|
3070
|
-
}), v = (
|
|
3068
|
+
}), v = (u == null ? void 0 : u.rows) ?? [], w = (u == null ? void 0 : u.total) ?? 0, g = Math.max(1, Math.ceil(w / l)), y = w === 0 ? 0 : c * l + 1, I = Math.min(w, (c + 1) * l), L = Ce(() => {
|
|
3071
3069
|
if (!v || v.length === 0) return [];
|
|
3072
3070
|
const h = zn();
|
|
3073
3071
|
return Object.keys(v[0]).map(
|
|
@@ -3143,7 +3141,7 @@ function Sr() {
|
|
|
3143
3141
|
"select",
|
|
3144
3142
|
{
|
|
3145
3143
|
value: l,
|
|
3146
|
-
onChange: (h) =>
|
|
3144
|
+
onChange: (h) => d(Number(h.target.value)),
|
|
3147
3145
|
className: "h-8 rounded-md bg-surface px-2 text-sm text-fg ring-1 ring-line transition-all focus:outline-none focus:ring-2 focus:ring-brand/30",
|
|
3148
3146
|
children: Nr.map((h) => /* @__PURE__ */ e("option", { value: h, children: h }, h))
|
|
3149
3147
|
}
|
|
@@ -3152,7 +3150,7 @@ function Sr() {
|
|
|
3152
3150
|
/* @__PURE__ */ e(
|
|
3153
3151
|
"button",
|
|
3154
3152
|
{
|
|
3155
|
-
onClick: () =>
|
|
3153
|
+
onClick: () => m(Math.max(0, c - 1)),
|
|
3156
3154
|
disabled: c === 0,
|
|
3157
3155
|
className: "rounded-md bg-surface px-3 py-1 text-sm text-fg ring-1 ring-line transition-colors hover:bg-surface-subtle disabled:cursor-not-allowed disabled:opacity-40",
|
|
3158
3156
|
children: "Prev"
|
|
@@ -3168,7 +3166,7 @@ function Sr() {
|
|
|
3168
3166
|
/* @__PURE__ */ e(
|
|
3169
3167
|
"button",
|
|
3170
3168
|
{
|
|
3171
|
-
onClick: () =>
|
|
3169
|
+
onClick: () => m(Math.min(g - 1, c + 1)),
|
|
3172
3170
|
disabled: c >= g - 1,
|
|
3173
3171
|
className: "rounded-md bg-surface px-3 py-1 text-sm text-fg ring-1 ring-line transition-colors hover:bg-surface-subtle disabled:cursor-not-allowed disabled:opacity-40",
|
|
3174
3172
|
children: "Next"
|
|
@@ -3243,7 +3241,7 @@ const kr = {
|
|
|
3243
3241
|
}, bn = /* @__PURE__ */ new Set(["customer", "supplier", "item", "warehouse"]);
|
|
3244
3242
|
function xn() {
|
|
3245
3243
|
var B;
|
|
3246
|
-
const { type: t, name: n } =
|
|
3244
|
+
const { type: t, name: n } = ut(), a = Oe(), s = We(), { t: l } = Z(), i = !n || n === "new", c = wr[t ?? ""] ?? t ?? "", o = l(`masters.${t}.one`, { defaultValue: c }), m = kr[t ?? ""] ?? [], d = (k) => l(`fields.${k.label}`, { defaultValue: k.label }), [u, p] = N({}), { data: v, isLoading: w } = ie({
|
|
3247
3245
|
queryKey: ["master", t, n],
|
|
3248
3246
|
queryFn: () => O.getMaster(t, n),
|
|
3249
3247
|
enabled: !!t && !!n && !i
|
|
@@ -3251,11 +3249,11 @@ function xn() {
|
|
|
3251
3249
|
re(() => {
|
|
3252
3250
|
if (i) {
|
|
3253
3251
|
const k = {};
|
|
3254
|
-
|
|
3252
|
+
m.forEach((q) => {
|
|
3255
3253
|
k[q.name] = q.default ?? "";
|
|
3256
3254
|
}), p(k);
|
|
3257
3255
|
} else v && p(v);
|
|
3258
|
-
}, [i, v,
|
|
3256
|
+
}, [i, v, m]);
|
|
3259
3257
|
const g = me({
|
|
3260
3258
|
mutationFn: (k) => O.createMaster(t, k),
|
|
3261
3259
|
onSuccess: (k) => {
|
|
@@ -3286,7 +3284,7 @@ function xn() {
|
|
|
3286
3284
|
}
|
|
3287
3285
|
}), L = () => {
|
|
3288
3286
|
if (A.length > 0) return;
|
|
3289
|
-
const k = t === "company" && !
|
|
3287
|
+
const k = t === "company" && !u.name ? { ...u, name: u.company_name } : u;
|
|
3290
3288
|
i ? g.mutate(k) : y.mutate(k);
|
|
3291
3289
|
}, C = () => {
|
|
3292
3290
|
window.confirm(l("masterForm.deleteConfirm", { label: o })) && I.mutate();
|
|
@@ -3295,9 +3293,9 @@ function xn() {
|
|
|
3295
3293
|
};
|
|
3296
3294
|
if (!i && w)
|
|
3297
3295
|
return /* @__PURE__ */ e("p", { className: "text-fg-muted", children: l("common.loading") });
|
|
3298
|
-
const h = g.isPending || y.isPending, A =
|
|
3296
|
+
const h = g.isPending || y.isPending, A = m.filter((k) => {
|
|
3299
3297
|
if (!k.required || k.readOnly || i && k.name === "name" && bn.has(t ?? "")) return !1;
|
|
3300
|
-
const q =
|
|
3298
|
+
const q = u[k.name];
|
|
3301
3299
|
return q == null || String(q).trim() === "";
|
|
3302
3300
|
});
|
|
3303
3301
|
return /* @__PURE__ */ r("div", { className: "space-y-6", children: [
|
|
@@ -3314,17 +3312,17 @@ function xn() {
|
|
|
3314
3312
|
)
|
|
3315
3313
|
] }) }),
|
|
3316
3314
|
(g.error || y.error || I.error) && /* @__PURE__ */ e("div", { className: "rounded-lg bg-rose-50 p-4 text-sm text-rose-700 ring-1 ring-rose-200", children: ((B = g.error ?? y.error ?? I.error) == null ? void 0 : B.message) ?? l("common.errorOccurred") }),
|
|
3317
|
-
A.length > 0 && /* @__PURE__ */ e("div", { className: "rounded-lg bg-amber-50 p-4 text-sm text-amber-800 ring-1 ring-amber-200", children: l("masterForm.required", { fields: A.map(
|
|
3318
|
-
|
|
3319
|
-
/* @__PURE__ */ e(V, { children: /* @__PURE__ */ e("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children:
|
|
3315
|
+
A.length > 0 && /* @__PURE__ */ e("div", { className: "rounded-lg bg-amber-50 p-4 text-sm text-amber-800 ring-1 ring-amber-200", children: l("masterForm.required", { fields: A.map(d).join(", ") }) }),
|
|
3316
|
+
u.disabled === 1 && /* @__PURE__ */ e("div", { className: "rounded-lg bg-amber-50 p-4 text-sm text-amber-800 ring-1 ring-amber-200", children: l("masterForm.disabledNotice", { label: o }) }),
|
|
3317
|
+
/* @__PURE__ */ e(V, { children: /* @__PURE__ */ e("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: m.map((k) => {
|
|
3320
3318
|
const x = k.name === "name" && !i || k.readOnly, z = k.required && !(i && k.name === "name" && bn.has(t ?? ""));
|
|
3321
3319
|
if (k.type === "select" && k.options)
|
|
3322
3320
|
return /* @__PURE__ */ e("div", { children: /* @__PURE__ */ e(
|
|
3323
3321
|
Ke,
|
|
3324
3322
|
{
|
|
3325
|
-
label:
|
|
3323
|
+
label: d(k),
|
|
3326
3324
|
options: k.options,
|
|
3327
|
-
value:
|
|
3325
|
+
value: u[k.name] ?? "",
|
|
3328
3326
|
required: z,
|
|
3329
3327
|
disabled: x,
|
|
3330
3328
|
onChange: (U) => b(k.name, U.target.value)
|
|
@@ -3332,13 +3330,13 @@ function xn() {
|
|
|
3332
3330
|
) }, k.name);
|
|
3333
3331
|
if (k.type === "textarea")
|
|
3334
3332
|
return /* @__PURE__ */ r("div", { className: "sm:col-span-2", children: [
|
|
3335
|
-
/* @__PURE__ */ e("label", { className: "mb-1.5 block text-sm font-medium text-fg", children:
|
|
3333
|
+
/* @__PURE__ */ e("label", { className: "mb-1.5 block text-sm font-medium text-fg", children: d(k) }),
|
|
3336
3334
|
/* @__PURE__ */ e(
|
|
3337
3335
|
"textarea",
|
|
3338
3336
|
{
|
|
3339
3337
|
className: "block w-full rounded-lg bg-surface px-3 py-2 text-sm text-fg ring-1 ring-line transition-all placeholder:text-fg-muted/70 focus:outline-none focus:ring-2 focus:ring-brand/30 disabled:bg-surface-subtle disabled:text-fg-muted",
|
|
3340
3338
|
rows: 3,
|
|
3341
|
-
value:
|
|
3339
|
+
value: u[k.name] ?? "",
|
|
3342
3340
|
required: z,
|
|
3343
3341
|
readOnly: x,
|
|
3344
3342
|
disabled: x,
|
|
@@ -3350,13 +3348,13 @@ function xn() {
|
|
|
3350
3348
|
return /* @__PURE__ */ e(
|
|
3351
3349
|
pe,
|
|
3352
3350
|
{
|
|
3353
|
-
label:
|
|
3351
|
+
label: d(k),
|
|
3354
3352
|
type: j,
|
|
3355
3353
|
step: k.type === "currency" ? "0.01" : void 0,
|
|
3356
3354
|
required: z,
|
|
3357
3355
|
readOnly: x,
|
|
3358
3356
|
disabled: x,
|
|
3359
|
-
value:
|
|
3357
|
+
value: u[k.name] ?? "",
|
|
3360
3358
|
onChange: (U) => b(
|
|
3361
3359
|
k.name,
|
|
3362
3360
|
j === "number" ? parseFloat(U.target.value) || 0 : U.target.value
|
|
@@ -3423,7 +3421,7 @@ function ke({
|
|
|
3423
3421
|
linkDoctype: s,
|
|
3424
3422
|
readOnly: l
|
|
3425
3423
|
}) {
|
|
3426
|
-
const [i, c] = N(n ?? ""), [o,
|
|
3424
|
+
const [i, c] = N(n ?? ""), [o, m] = N([]), [d, u] = N(!1), [p, v] = N(!1), [w, g] = N({}), y = H(null), I = H(null), L = H(null), C = H(null), b = H(!1);
|
|
3427
3425
|
re(() => {
|
|
3428
3426
|
c(n ?? "");
|
|
3429
3427
|
}, [n]);
|
|
@@ -3444,9 +3442,9 @@ function ke({
|
|
|
3444
3442
|
v(!0);
|
|
3445
3443
|
try {
|
|
3446
3444
|
const z = await O.searchLink(s, x);
|
|
3447
|
-
|
|
3445
|
+
m(z), u(!0);
|
|
3448
3446
|
} catch {
|
|
3449
|
-
|
|
3447
|
+
m([]);
|
|
3450
3448
|
} finally {
|
|
3451
3449
|
v(!1);
|
|
3452
3450
|
}
|
|
@@ -3458,21 +3456,21 @@ function ke({
|
|
|
3458
3456
|
c(z), A(z);
|
|
3459
3457
|
}, k = (x) => {
|
|
3460
3458
|
const z = x.name ?? x.id ?? String(x);
|
|
3461
|
-
c(z), a(z),
|
|
3459
|
+
c(z), a(z), u(!1), m([]);
|
|
3462
3460
|
}, q = () => {
|
|
3463
3461
|
setTimeout(() => {
|
|
3464
3462
|
if (b.current) {
|
|
3465
3463
|
b.current = !1;
|
|
3466
3464
|
return;
|
|
3467
3465
|
}
|
|
3468
|
-
|
|
3466
|
+
u(!1), i !== n && a(i);
|
|
3469
3467
|
}, 150);
|
|
3470
3468
|
};
|
|
3471
3469
|
return re(() => {
|
|
3472
3470
|
const x = (z) => {
|
|
3473
3471
|
var U, Y;
|
|
3474
3472
|
const j = z.target;
|
|
3475
|
-
(U = I.current) != null && U.contains(j) || (Y = L.current) != null && Y.contains(j) ||
|
|
3473
|
+
(U = I.current) != null && U.contains(j) || (Y = L.current) != null && Y.contains(j) || u(!1);
|
|
3476
3474
|
};
|
|
3477
3475
|
return document.addEventListener("mousedown", x), () => document.removeEventListener("mousedown", x);
|
|
3478
3476
|
}, []), l ? /* @__PURE__ */ r("div", { children: [
|
|
@@ -3498,7 +3496,7 @@ function ke({
|
|
|
3498
3496
|
)
|
|
3499
3497
|
}
|
|
3500
3498
|
),
|
|
3501
|
-
|
|
3499
|
+
d && o.length > 0 && Ca(
|
|
3502
3500
|
/* @__PURE__ */ e("div", { ref: L, style: w, className: "max-h-48 overflow-y-auto rounded-lg bg-surface ring-1 ring-line shadow-card-hover", children: o.map((x, z) => {
|
|
3503
3501
|
const j = x.name ?? x.id ?? String(x);
|
|
3504
3502
|
return /* @__PURE__ */ e(
|
|
@@ -3520,14 +3518,14 @@ function ke({
|
|
|
3520
3518
|
] });
|
|
3521
3519
|
}
|
|
3522
3520
|
function Ir() {
|
|
3523
|
-
const { t } = Z(), [n] = J("company", ""), [a] = J("from", ""), [s] = J("to", ""), l = Me(), [i, c] = N(n), [o,
|
|
3521
|
+
const { t } = Z(), [n] = J("company", ""), [a] = J("from", ""), [s] = J("to", ""), l = Me(), [i, c] = N(n), [o, m] = N(a), [d, u] = N(s), p = Fe(i), v = (b) => Le(b, p), w = Ce(() => {
|
|
3524
3522
|
const b = {};
|
|
3525
3523
|
return n && (b.company = n), a && (b.from_date = a), s && (b.to_date = s), b;
|
|
3526
3524
|
}, [n, a, s]), { data: g, isLoading: y, refetch: I } = Cr(w), L = () => {
|
|
3527
3525
|
l({
|
|
3528
3526
|
company: i || null,
|
|
3529
3527
|
from: o || null,
|
|
3530
|
-
to:
|
|
3528
|
+
to: d || null
|
|
3531
3529
|
}), I();
|
|
3532
3530
|
}, C = g ? g.difference === 0 : !1;
|
|
3533
3531
|
return /* @__PURE__ */ r("div", { className: "space-y-4", children: [
|
|
@@ -3548,7 +3546,7 @@ function Ir() {
|
|
|
3548
3546
|
label: t("fields.From Date", { defaultValue: "From Date" }),
|
|
3549
3547
|
type: "date",
|
|
3550
3548
|
value: o,
|
|
3551
|
-
onChange: (b) =>
|
|
3549
|
+
onChange: (b) => m(b.target.value)
|
|
3552
3550
|
}
|
|
3553
3551
|
),
|
|
3554
3552
|
/* @__PURE__ */ e(
|
|
@@ -3556,14 +3554,14 @@ function Ir() {
|
|
|
3556
3554
|
{
|
|
3557
3555
|
label: t("fields.To Date", { defaultValue: "To Date" }),
|
|
3558
3556
|
type: "date",
|
|
3559
|
-
value:
|
|
3560
|
-
onChange: (b) =>
|
|
3557
|
+
value: d,
|
|
3558
|
+
onChange: (b) => u(b.target.value)
|
|
3561
3559
|
}
|
|
3562
3560
|
),
|
|
3563
3561
|
/* @__PURE__ */ e(X, { onClick: L, children: t("common.apply") })
|
|
3564
3562
|
] }),
|
|
3565
3563
|
/* @__PURE__ */ e(Dt, { onSelect: (b, h) => {
|
|
3566
|
-
|
|
3564
|
+
m(b), u(h), l({ from: b, to: h });
|
|
3567
3565
|
} }),
|
|
3568
3566
|
y ? /* @__PURE__ */ e("p", { className: "text-fg-muted", children: t("common.loading") }) : !g || !g.rows || g.rows.length === 0 ? /* @__PURE__ */ e("p", { className: "py-8 text-center text-fg-muted", children: t("reports.noData") }) : /* @__PURE__ */ r(V, { children: [
|
|
3569
3567
|
/* @__PURE__ */ e("div", { className: "overflow-x-auto", children: /* @__PURE__ */ r("table", { className: "min-w-full divide-y divide-line text-sm", children: [
|
|
@@ -3601,11 +3599,11 @@ function Lr(t) {
|
|
|
3601
3599
|
}
|
|
3602
3600
|
const Br = ["25", "50", "100", "200"];
|
|
3603
3601
|
function Er() {
|
|
3604
|
-
const { t } = Z(), [n] = J("account", ""), [a] = J("party", ""), [s] = J("from", ""), [l] = J("to", ""), [i] = J("per_page", 50), [c] = J("page", 1), o = c - 1,
|
|
3602
|
+
const { t } = Z(), [n] = J("account", ""), [a] = J("party", ""), [s] = J("from", ""), [l] = J("to", ""), [i] = J("per_page", 50), [c] = J("page", 1), o = c - 1, m = Me(), d = (T) => m({ page: T === 0 ? null : T + 1 }), u = (T) => m({ per_page: T, page: null }), [p, v] = N(n), [w, g] = N(a), [y, I] = N(s), [L, C] = N(l), b = Fe(), h = (T) => Le(T, b), A = Ce(() => {
|
|
3605
3603
|
const T = {};
|
|
3606
3604
|
return n && (T.account = n), a && (T.party = a), s && (T.from_date = s), l && (T.to_date = l), T.limit = String(i), T.offset = String(o * i), T;
|
|
3607
3605
|
}, [n, a, s, l, i, o]), { data: B, isLoading: k, refetch: q } = Dr(A), x = (B == null ? void 0 : B.rows) ?? [], z = (B == null ? void 0 : B.total) ?? 0, j = Math.max(1, Math.ceil(z / i)), U = z === 0 ? 0 : o * i + 1, Y = Math.min(z, (o + 1) * i), ce = () => {
|
|
3608
|
-
|
|
3606
|
+
m({
|
|
3609
3607
|
account: p || null,
|
|
3610
3608
|
party: w || null,
|
|
3611
3609
|
from: y || null,
|
|
@@ -3656,7 +3654,7 @@ function Er() {
|
|
|
3656
3654
|
/* @__PURE__ */ e(X, { onClick: ce, children: t("common.apply") })
|
|
3657
3655
|
] }),
|
|
3658
3656
|
/* @__PURE__ */ e(Dt, { onSelect: (T, K) => {
|
|
3659
|
-
I(T), C(K),
|
|
3657
|
+
I(T), C(K), m({ from: T, to: K, page: null });
|
|
3660
3658
|
} }),
|
|
3661
3659
|
k ? /* @__PURE__ */ e("p", { className: "text-gray-500", children: t("common.loading") }) : x.length === 0 ? /* @__PURE__ */ e("p", { className: "py-8 text-center text-gray-400", children: t("reports.noEntries") }) : /* @__PURE__ */ r(Ne, { children: [
|
|
3662
3660
|
/* @__PURE__ */ e(V, { children: /* @__PURE__ */ e("div", { className: "overflow-x-auto", children: /* @__PURE__ */ r("table", { className: "min-w-full divide-y divide-gray-200 text-sm", children: [
|
|
@@ -3709,7 +3707,7 @@ function Er() {
|
|
|
3709
3707
|
"select",
|
|
3710
3708
|
{
|
|
3711
3709
|
value: i,
|
|
3712
|
-
onChange: (T) =>
|
|
3710
|
+
onChange: (T) => u(Number(T.target.value)),
|
|
3713
3711
|
className: "rounded border border-gray-300 bg-white px-2 py-1 text-sm",
|
|
3714
3712
|
children: Br.map((T) => /* @__PURE__ */ e("option", { value: T, children: T }, T))
|
|
3715
3713
|
}
|
|
@@ -3718,7 +3716,7 @@ function Er() {
|
|
|
3718
3716
|
/* @__PURE__ */ e(
|
|
3719
3717
|
"button",
|
|
3720
3718
|
{
|
|
3721
|
-
onClick: () =>
|
|
3719
|
+
onClick: () => d(Math.max(0, o - 1)),
|
|
3722
3720
|
disabled: o === 0,
|
|
3723
3721
|
className: "rounded border border-gray-300 bg-white px-3 py-1 text-sm text-gray-700 hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-40",
|
|
3724
3722
|
children: t("common.prev")
|
|
@@ -3736,7 +3734,7 @@ function Er() {
|
|
|
3736
3734
|
/* @__PURE__ */ e(
|
|
3737
3735
|
"button",
|
|
3738
3736
|
{
|
|
3739
|
-
onClick: () =>
|
|
3737
|
+
onClick: () => d(Math.min(j - 1, o + 1)),
|
|
3740
3738
|
disabled: o >= j - 1,
|
|
3741
3739
|
className: "rounded border border-gray-300 bg-white px-3 py-1 text-sm text-gray-700 hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-40",
|
|
3742
3740
|
children: t("common.next")
|
|
@@ -3748,10 +3746,10 @@ function Er() {
|
|
|
3748
3746
|
] });
|
|
3749
3747
|
}
|
|
3750
3748
|
function Or() {
|
|
3751
|
-
const { t } = Z(), [n] = J("item_code", ""), [a] = J("warehouse", ""), s = Me(), [l, i] = N(n), [c, o] = N(a),
|
|
3749
|
+
const { t } = Z(), [n] = J("item_code", ""), [a] = J("warehouse", ""), s = Me(), [l, i] = N(n), [c, o] = N(a), m = Fe(), d = (y) => Le(y, m), u = Ce(() => {
|
|
3752
3750
|
const y = {};
|
|
3753
3751
|
return n && (y.item_code = n), a && (y.warehouse = a), y;
|
|
3754
|
-
}, [n, a]), { data: p, isLoading: v, refetch: w } = _r(
|
|
3752
|
+
}, [n, a]), { data: p, isLoading: v, refetch: w } = _r(u), g = () => {
|
|
3755
3753
|
s({
|
|
3756
3754
|
item_code: l || null,
|
|
3757
3755
|
warehouse: c || null
|
|
@@ -3795,32 +3793,32 @@ function Or() {
|
|
|
3795
3793
|
/* @__PURE__ */ e("td", { className: "px-4 py-2 text-gray-700", children: y.item_name }),
|
|
3796
3794
|
/* @__PURE__ */ e("td", { className: "px-4 py-2 text-gray-700", children: y.warehouse }),
|
|
3797
3795
|
/* @__PURE__ */ e("td", { className: "px-4 py-2 text-right", children: Mt(y.actual_qty) }),
|
|
3798
|
-
/* @__PURE__ */ e("td", { className: "px-4 py-2 text-right", children:
|
|
3799
|
-
/* @__PURE__ */ e("td", { className: "px-4 py-2 text-right font-medium", children:
|
|
3796
|
+
/* @__PURE__ */ e("td", { className: "px-4 py-2 text-right", children: d(y.valuation_rate) }),
|
|
3797
|
+
/* @__PURE__ */ e("td", { className: "px-4 py-2 text-right font-medium", children: d(y.stock_value) })
|
|
3800
3798
|
] }, I)) })
|
|
3801
3799
|
] }) }) })
|
|
3802
3800
|
] });
|
|
3803
3801
|
}
|
|
3804
3802
|
function qr() {
|
|
3805
|
-
const { t } = Z(), [n] = J("company", ""), [a] = J("from", ""), [s] = J("to", ""), l = Me(), [i, c] = N(n), o = Fe(i),
|
|
3803
|
+
const { t } = Z(), [n] = J("company", ""), [a] = J("from", ""), [s] = J("to", ""), l = Me(), [i, c] = N(n), o = Fe(i), m = (b) => Le(b, o), [d, u] = N(a), [p, v] = N(s), w = Ce(() => {
|
|
3806
3804
|
const b = {};
|
|
3807
3805
|
return n && (b.company = n), a && (b.from_date = a), s && (b.to_date = s), b;
|
|
3808
3806
|
}, [n, a, s]), { data: g, isLoading: y, refetch: I } = Ar(w), L = () => {
|
|
3809
3807
|
l({
|
|
3810
3808
|
company: i || null,
|
|
3811
|
-
from:
|
|
3809
|
+
from: d || null,
|
|
3812
3810
|
to: p || null
|
|
3813
3811
|
}), I();
|
|
3814
3812
|
}, C = g && (g.income && g.income.length > 0 || g.expense && g.expense.length > 0);
|
|
3815
3813
|
return /* @__PURE__ */ r("div", { className: "space-y-4", children: [
|
|
3816
3814
|
/* @__PURE__ */ r("div", { className: "flex flex-wrap items-end gap-4", children: [
|
|
3817
3815
|
/* @__PURE__ */ e(ke, { label: t("fields.Company", { defaultValue: "Company" }), value: i, onChange: c, linkDoctype: "company", readOnly: !1 }),
|
|
3818
|
-
/* @__PURE__ */ e(pe, { label: t("fields.From Date", { defaultValue: "From Date" }), type: "date", value:
|
|
3816
|
+
/* @__PURE__ */ e(pe, { label: t("fields.From Date", { defaultValue: "From Date" }), type: "date", value: d, onChange: (b) => u(b.target.value) }),
|
|
3819
3817
|
/* @__PURE__ */ e(pe, { label: t("fields.To Date", { defaultValue: "To Date" }), type: "date", value: p, onChange: (b) => v(b.target.value) }),
|
|
3820
3818
|
/* @__PURE__ */ e(X, { onClick: L, children: t("common.apply") })
|
|
3821
3819
|
] }),
|
|
3822
3820
|
/* @__PURE__ */ e(Dt, { onSelect: (b, h) => {
|
|
3823
|
-
|
|
3821
|
+
u(b), v(h), l({ from: b, to: h });
|
|
3824
3822
|
} }),
|
|
3825
3823
|
y ? /* @__PURE__ */ e("p", { className: "text-gray-500", children: t("common.loading") }) : C ? /* @__PURE__ */ r("div", { className: "space-y-4", children: [
|
|
3826
3824
|
/* @__PURE__ */ r(V, { children: [
|
|
@@ -3832,11 +3830,11 @@ function qr() {
|
|
|
3832
3830
|
] }) }),
|
|
3833
3831
|
/* @__PURE__ */ e("tbody", { className: "divide-y divide-gray-100", children: (g.income || []).map((b, h) => /* @__PURE__ */ r("tr", { className: "hover:bg-gray-50", children: [
|
|
3834
3832
|
/* @__PURE__ */ e("td", { className: "px-4 py-2 text-gray-900", children: b.account }),
|
|
3835
|
-
/* @__PURE__ */ e("td", { className: "px-4 py-2 text-right", children:
|
|
3833
|
+
/* @__PURE__ */ e("td", { className: "px-4 py-2 text-right", children: m(b.amount) })
|
|
3836
3834
|
] }, h)) }),
|
|
3837
3835
|
/* @__PURE__ */ e("tfoot", { className: "border-t-2 border-gray-300 bg-gray-50 font-semibold", children: /* @__PURE__ */ r("tr", { children: [
|
|
3838
3836
|
/* @__PURE__ */ e("td", { className: "px-4 py-3 text-gray-900", children: t("reports.totalIncome") }),
|
|
3839
|
-
/* @__PURE__ */ e("td", { className: "px-4 py-3 text-right", children:
|
|
3837
|
+
/* @__PURE__ */ e("td", { className: "px-4 py-3 text-right", children: m(g.total_income) })
|
|
3840
3838
|
] }) })
|
|
3841
3839
|
] })
|
|
3842
3840
|
] }),
|
|
@@ -3849,18 +3847,18 @@ function qr() {
|
|
|
3849
3847
|
] }) }),
|
|
3850
3848
|
/* @__PURE__ */ e("tbody", { className: "divide-y divide-gray-100", children: (g.expense || []).map((b, h) => /* @__PURE__ */ r("tr", { className: "hover:bg-gray-50", children: [
|
|
3851
3849
|
/* @__PURE__ */ e("td", { className: "px-4 py-2 text-gray-900", children: b.account }),
|
|
3852
|
-
/* @__PURE__ */ e("td", { className: "px-4 py-2 text-right", children:
|
|
3850
|
+
/* @__PURE__ */ e("td", { className: "px-4 py-2 text-right", children: m(b.amount) })
|
|
3853
3851
|
] }, h)) }),
|
|
3854
3852
|
/* @__PURE__ */ e("tfoot", { className: "border-t-2 border-gray-300 bg-gray-50 font-semibold", children: /* @__PURE__ */ r("tr", { children: [
|
|
3855
3853
|
/* @__PURE__ */ e("td", { className: "px-4 py-3 text-gray-900", children: t("reports.totalExpenses") }),
|
|
3856
|
-
/* @__PURE__ */ e("td", { className: "px-4 py-3 text-right", children:
|
|
3854
|
+
/* @__PURE__ */ e("td", { className: "px-4 py-3 text-right", children: m(g.total_expense) })
|
|
3857
3855
|
] }) })
|
|
3858
3856
|
] })
|
|
3859
3857
|
] }),
|
|
3860
3858
|
/* @__PURE__ */ e("div", { className: "text-center", children: /* @__PURE__ */ r("span", { className: `inline-flex items-center rounded-full px-5 py-2 text-sm font-semibold ${g.net_profit >= 0 ? "bg-green-100 text-green-800" : "bg-red-100 text-red-800"}`, children: [
|
|
3861
3859
|
g.net_profit >= 0 ? t("reports.netProfit") : t("reports.netLoss"),
|
|
3862
3860
|
": ",
|
|
3863
|
-
|
|
3861
|
+
m(Math.abs(g.net_profit))
|
|
3864
3862
|
] }) })
|
|
3865
3863
|
] }) : /* @__PURE__ */ e("p", { className: "py-8 text-center text-gray-400", children: t("reports.noData") })
|
|
3866
3864
|
] });
|
|
@@ -3874,10 +3872,10 @@ function Et({ title: t, rows: n, total: a, totalLabel: s, currency: l }) {
|
|
|
3874
3872
|
/* @__PURE__ */ e("th", { className: "px-4 py-3 text-left font-medium text-gray-500", children: i("fields.Account", { defaultValue: "Account" }) }),
|
|
3875
3873
|
/* @__PURE__ */ e("th", { className: "px-4 py-3 text-right font-medium text-gray-500", children: i("fields.Balance", { defaultValue: "Balance" }) })
|
|
3876
3874
|
] }) }),
|
|
3877
|
-
/* @__PURE__ */ e("tbody", { className: "divide-y divide-gray-100", children: n.map((o,
|
|
3875
|
+
/* @__PURE__ */ e("tbody", { className: "divide-y divide-gray-100", children: n.map((o, m) => /* @__PURE__ */ r("tr", { className: "hover:bg-gray-50", children: [
|
|
3878
3876
|
/* @__PURE__ */ e("td", { className: "px-4 py-2 text-gray-900", children: o.account }),
|
|
3879
3877
|
/* @__PURE__ */ e("td", { className: "px-4 py-2 text-right", children: c(o.balance) })
|
|
3880
|
-
] },
|
|
3878
|
+
] }, m)) }),
|
|
3881
3879
|
/* @__PURE__ */ e("tfoot", { className: "border-t-2 border-gray-300 bg-gray-50 font-semibold", children: /* @__PURE__ */ r("tr", { children: [
|
|
3882
3880
|
/* @__PURE__ */ e("td", { className: "px-4 py-3 text-gray-900", children: s }),
|
|
3883
3881
|
/* @__PURE__ */ e("td", { className: "px-4 py-3 text-right", children: c(a) })
|
|
@@ -3887,10 +3885,10 @@ function Et({ title: t, rows: n, total: a, totalLabel: s, currency: l }) {
|
|
|
3887
3885
|
}
|
|
3888
3886
|
function zr() {
|
|
3889
3887
|
var L, C, b;
|
|
3890
|
-
const { t } = Z(), [n] = J("company", ""), [a] = J("as_of_date", ""), s = Me(), [l, i] = N(n), [c, o] = N(a),
|
|
3888
|
+
const { t } = Z(), [n] = J("company", ""), [a] = J("as_of_date", ""), s = Me(), [l, i] = N(n), [c, o] = N(a), m = Fe(l), d = (h) => Le(h, m), u = Ce(() => {
|
|
3891
3889
|
const h = {};
|
|
3892
3890
|
return n && (h.company = n), a && (h.as_of_date = a), h;
|
|
3893
|
-
}, [n, a]), { data: p, isLoading: v, refetch: w } = Tr(
|
|
3891
|
+
}, [n, a]), { data: p, isLoading: v, refetch: w } = Tr(u), g = () => {
|
|
3894
3892
|
s({ company: l || null, as_of_date: c || null }), w();
|
|
3895
3893
|
}, y = p && (((L = p.assets) == null ? void 0 : L.length) > 0 || ((C = p.liabilities) == null ? void 0 : C.length) > 0 || ((b = p.equity) == null ? void 0 : b.length) > 0), I = p ? Math.abs(p.total_assets - p.total_liabilities_and_equity) < 0.01 : !1;
|
|
3896
3894
|
return /* @__PURE__ */ r("div", { className: "space-y-4", children: [
|
|
@@ -3903,20 +3901,20 @@ function zr() {
|
|
|
3903
3901
|
o(h), s({ as_of_date: h });
|
|
3904
3902
|
} }),
|
|
3905
3903
|
v ? /* @__PURE__ */ e("p", { className: "text-gray-500", children: t("common.loading") }) : y ? /* @__PURE__ */ r("div", { className: "space-y-4", children: [
|
|
3906
|
-
/* @__PURE__ */ e(Et, { title: t("reports.assets"), rows: p.assets || [], total: p.total_assets, totalLabel: t("reports.totalAssets"), currency:
|
|
3907
|
-
/* @__PURE__ */ e(Et, { title: t("reports.liabilities"), rows: p.liabilities || [], total: p.total_liabilities, totalLabel: t("reports.totalLiabilities"), currency:
|
|
3908
|
-
/* @__PURE__ */ e(Et, { title: t("reports.equity"), rows: p.equity || [], total: p.total_equity, totalLabel: t("reports.totalEquity"), currency:
|
|
3904
|
+
/* @__PURE__ */ e(Et, { title: t("reports.assets"), rows: p.assets || [], total: p.total_assets, totalLabel: t("reports.totalAssets"), currency: m }),
|
|
3905
|
+
/* @__PURE__ */ e(Et, { title: t("reports.liabilities"), rows: p.liabilities || [], total: p.total_liabilities, totalLabel: t("reports.totalLiabilities"), currency: m }),
|
|
3906
|
+
/* @__PURE__ */ e(Et, { title: t("reports.equity"), rows: p.equity || [], total: p.total_equity, totalLabel: t("reports.totalEquity"), currency: m }),
|
|
3909
3907
|
/* @__PURE__ */ e(V, { children: /* @__PURE__ */ r("div", { className: "flex items-center justify-between", children: [
|
|
3910
3908
|
/* @__PURE__ */ r("div", { className: "text-sm", children: [
|
|
3911
3909
|
/* @__PURE__ */ r("div", { className: "text-gray-500", children: [
|
|
3912
3910
|
t("reports.totalAssets"),
|
|
3913
3911
|
": ",
|
|
3914
|
-
/* @__PURE__ */ e("span", { className: "font-semibold text-gray-900", children:
|
|
3912
|
+
/* @__PURE__ */ e("span", { className: "font-semibold text-gray-900", children: d(p.total_assets) })
|
|
3915
3913
|
] }),
|
|
3916
3914
|
/* @__PURE__ */ r("div", { className: "text-gray-500", children: [
|
|
3917
3915
|
t("reports.totalLiabilitiesEquity"),
|
|
3918
3916
|
": ",
|
|
3919
|
-
/* @__PURE__ */ e("span", { className: "font-semibold text-gray-900", children:
|
|
3917
|
+
/* @__PURE__ */ e("span", { className: "font-semibold text-gray-900", children: d(p.total_liabilities_and_equity) })
|
|
3920
3918
|
] })
|
|
3921
3919
|
] }),
|
|
3922
3920
|
I ? /* @__PURE__ */ e("span", { className: "inline-flex items-center rounded-full bg-green-100 px-4 py-1.5 text-sm font-semibold text-green-800", children: t("reports.balanced") }) : /* @__PURE__ */ e("span", { className: "inline-flex items-center rounded-full bg-red-100 px-4 py-1.5 text-sm font-semibold text-red-800", children: t("reports.imbalanced") })
|
|
@@ -3925,10 +3923,10 @@ function zr() {
|
|
|
3925
3923
|
] });
|
|
3926
3924
|
}
|
|
3927
3925
|
function Fr() {
|
|
3928
|
-
const { t } = Z(), [n] = J("company", ""), [a] = J("as_of_date", ""), s = Me(), [l, i] = N(n), [c, o] = N(a),
|
|
3926
|
+
const { t } = Z(), [n] = J("company", ""), [a] = J("as_of_date", ""), s = Me(), [l, i] = N(n), [c, o] = N(a), m = Fe(l), d = (y) => Le(y, m), u = Ce(() => {
|
|
3929
3927
|
const y = {};
|
|
3930
3928
|
return n && (y.company = n), a && (y.as_of_date = a), y;
|
|
3931
|
-
}, [n, a]), { data: p, isLoading: v, refetch: w } = Pr(
|
|
3929
|
+
}, [n, a]), { data: p, isLoading: v, refetch: w } = Pr(u), g = () => {
|
|
3932
3930
|
s({ company: l || null, as_of_date: c || null }), w();
|
|
3933
3931
|
};
|
|
3934
3932
|
return /* @__PURE__ */ r("div", { className: "space-y-4", children: [
|
|
@@ -3963,30 +3961,30 @@ function Fr() {
|
|
|
3963
3961
|
) }),
|
|
3964
3962
|
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-gray-900", children: y.customer_name }),
|
|
3965
3963
|
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-gray-600", children: y.due_date }),
|
|
3966
|
-
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right font-medium", children:
|
|
3967
|
-
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.current ?
|
|
3968
|
-
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.b1_30 ?
|
|
3969
|
-
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.b31_60 ?
|
|
3970
|
-
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.b61_90 ?
|
|
3971
|
-
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right text-red-600", children: y.b90_plus ?
|
|
3964
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right font-medium", children: d(y.outstanding) }),
|
|
3965
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.current ? d(y.current) : "" }),
|
|
3966
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.b1_30 ? d(y.b1_30) : "" }),
|
|
3967
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.b31_60 ? d(y.b31_60) : "" }),
|
|
3968
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.b61_90 ? d(y.b61_90) : "" }),
|
|
3969
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right text-red-600", children: y.b90_plus ? d(y.b90_plus) : "" })
|
|
3972
3970
|
] }, I)) }),
|
|
3973
3971
|
/* @__PURE__ */ e("tfoot", { className: "border-t-2 border-gray-300 bg-gray-50 font-semibold", children: /* @__PURE__ */ r("tr", { children: [
|
|
3974
3972
|
/* @__PURE__ */ e("td", { className: "px-3 py-3", colSpan: 3, children: t("common.total") }),
|
|
3975
|
-
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children:
|
|
3976
|
-
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children:
|
|
3977
|
-
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children:
|
|
3978
|
-
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children:
|
|
3979
|
-
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children:
|
|
3980
|
-
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right text-red-600", children:
|
|
3973
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children: d(p.totals.outstanding) }),
|
|
3974
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children: d(p.totals.current) }),
|
|
3975
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children: d(p.totals.b1_30) }),
|
|
3976
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children: d(p.totals.b31_60) }),
|
|
3977
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children: d(p.totals.b61_90) }),
|
|
3978
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right text-red-600", children: d(p.totals.b90_plus) })
|
|
3981
3979
|
] }) })
|
|
3982
3980
|
] }) }) })
|
|
3983
3981
|
] });
|
|
3984
3982
|
}
|
|
3985
3983
|
function Mr() {
|
|
3986
|
-
const { t } = Z(), [n] = J("company", ""), [a] = J("as_of_date", ""), s = Me(), [l, i] = N(n), [c, o] = N(a),
|
|
3984
|
+
const { t } = Z(), [n] = J("company", ""), [a] = J("as_of_date", ""), s = Me(), [l, i] = N(n), [c, o] = N(a), m = Fe(l), d = (y) => Le(y, m), u = Ce(() => {
|
|
3987
3985
|
const y = {};
|
|
3988
3986
|
return n && (y.company = n), a && (y.as_of_date = a), y;
|
|
3989
|
-
}, [n, a]), { data: p, isLoading: v, refetch: w } = Rr(
|
|
3987
|
+
}, [n, a]), { data: p, isLoading: v, refetch: w } = Rr(u), g = () => {
|
|
3990
3988
|
s({ company: l || null, as_of_date: c || null }), w();
|
|
3991
3989
|
};
|
|
3992
3990
|
return /* @__PURE__ */ r("div", { className: "space-y-4", children: [
|
|
@@ -4021,21 +4019,21 @@ function Mr() {
|
|
|
4021
4019
|
) }),
|
|
4022
4020
|
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-gray-900", children: y.supplier_name }),
|
|
4023
4021
|
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-gray-600", children: y.due_date }),
|
|
4024
|
-
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right font-medium", children:
|
|
4025
|
-
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.current ?
|
|
4026
|
-
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.b1_30 ?
|
|
4027
|
-
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.b31_60 ?
|
|
4028
|
-
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.b61_90 ?
|
|
4029
|
-
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right text-red-600", children: y.b90_plus ?
|
|
4022
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right font-medium", children: d(y.outstanding) }),
|
|
4023
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.current ? d(y.current) : "" }),
|
|
4024
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.b1_30 ? d(y.b1_30) : "" }),
|
|
4025
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.b31_60 ? d(y.b31_60) : "" }),
|
|
4026
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.b61_90 ? d(y.b61_90) : "" }),
|
|
4027
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right text-red-600", children: y.b90_plus ? d(y.b90_plus) : "" })
|
|
4030
4028
|
] }, I)) }),
|
|
4031
4029
|
/* @__PURE__ */ e("tfoot", { className: "border-t-2 border-gray-300 bg-gray-50 font-semibold", children: /* @__PURE__ */ r("tr", { children: [
|
|
4032
4030
|
/* @__PURE__ */ e("td", { className: "px-3 py-3", colSpan: 3, children: t("common.total") }),
|
|
4033
|
-
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children:
|
|
4034
|
-
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children:
|
|
4035
|
-
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children:
|
|
4036
|
-
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children:
|
|
4037
|
-
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children:
|
|
4038
|
-
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right text-red-600", children:
|
|
4031
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children: d(p.totals.outstanding) }),
|
|
4032
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children: d(p.totals.current) }),
|
|
4033
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children: d(p.totals.b1_30) }),
|
|
4034
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children: d(p.totals.b31_60) }),
|
|
4035
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children: d(p.totals.b61_90) }),
|
|
4036
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right text-red-600", children: d(p.totals.b90_plus) })
|
|
4039
4037
|
] }) })
|
|
4040
4038
|
] }) }) })
|
|
4041
4039
|
] });
|
|
@@ -4135,18 +4133,18 @@ return {
|
|
|
4135
4133
|
}
|
|
4136
4134
|
const Yn = Vr();
|
|
4137
4135
|
function Ur() {
|
|
4138
|
-
const t = Oe(), { sessions: n, createSession: a } = tt(), [s] = J("report_id", ""), [l] = J("metric", ""), [i] = J("group_by", ""), [c] = J("from", ""), [o] = J("to", ""), [
|
|
4136
|
+
const t = Oe(), { sessions: n, createSession: a } = tt(), [s] = J("report_id", ""), [l] = J("metric", ""), [i] = J("group_by", ""), [c] = J("from", ""), [o] = J("to", ""), [m] = J("company", ""), [d, u] = N(Yn), [p, v] = N([]), [w, g] = N(null), [y, I] = N(""), [L, C] = N(!1), [b, h] = N(!1), [A, B] = N(""), k = H(null), q = H(""), x = H(""), z = H(0), j = Ce(() => !l || !i ? "" : JSON.stringify(Kr({
|
|
4139
4137
|
metric: l,
|
|
4140
4138
|
groupBy: i,
|
|
4141
4139
|
fromDate: c || void 0,
|
|
4142
4140
|
toDate: o || void 0,
|
|
4143
|
-
company:
|
|
4144
|
-
}), null, 2), [l, i, c, o,
|
|
4141
|
+
company: m || void 0
|
|
4142
|
+
}), null, 2), [l, i, c, o, m]), U = async (K) => {
|
|
4145
4143
|
var ge;
|
|
4146
4144
|
const se = ++z.current, le = () => z.current === se;
|
|
4147
4145
|
I(""), C(!0);
|
|
4148
4146
|
try {
|
|
4149
|
-
const Q = JSON.parse(K ??
|
|
4147
|
+
const Q = JSON.parse(K ?? d), oe = await O.runtimeData({ requests: Q.data_requests || [] });
|
|
4150
4148
|
if (!le()) return;
|
|
4151
4149
|
v(oe.datasets), (ge = k.current) == null || ge.terminate();
|
|
4152
4150
|
const ne = new $r();
|
|
@@ -4178,20 +4176,20 @@ function Ur() {
|
|
|
4178
4176
|
return s ? q.current === s ? void 0 : (h(!0), I(""), O.getRuntimeDraft(s).then((se) => {
|
|
4179
4177
|
if (K) return;
|
|
4180
4178
|
const le = JSON.stringify(se.definition, null, 2);
|
|
4181
|
-
return q.current = s, x.current = le, B(se.source_chat_session_id || ""),
|
|
4179
|
+
return q.current = s, x.current = le, B(se.source_chat_session_id || ""), u(le), U(le);
|
|
4182
4180
|
}).catch((se) => {
|
|
4183
4181
|
K || (g(null), I(se instanceof Error ? se.message : String(se)));
|
|
4184
4182
|
}).finally(() => {
|
|
4185
4183
|
K || h(!1);
|
|
4186
4184
|
}), () => {
|
|
4187
4185
|
K = !0;
|
|
4188
|
-
}) : (q.current = "", x.current = "", B(""), j && (x.current = j,
|
|
4186
|
+
}) : (q.current = "", x.current = "", B(""), j && (x.current = j, u(j), U(j)), () => {
|
|
4189
4187
|
K = !0;
|
|
4190
4188
|
});
|
|
4191
4189
|
}, [s, j]);
|
|
4192
4190
|
const Y = !!(!s && j), ce = Ce(() => Wr(w), [w]), T = async () => {
|
|
4193
4191
|
var oe;
|
|
4194
|
-
const K =
|
|
4192
|
+
const K = d.trim() !== x.current.trim(), se = s || "unsaved-runtime-report", le = p.map((ne) => ({
|
|
4195
4193
|
name: ne.name,
|
|
4196
4194
|
dataset: ne.dataset,
|
|
4197
4195
|
row_count: ne.row_count,
|
|
@@ -4209,7 +4207,7 @@ function Ur() {
|
|
|
4209
4207
|
"",
|
|
4210
4208
|
"The analytics editor contains unsaved local changes. Use this JSON as the source of truth when repairing the draft:",
|
|
4211
4209
|
"```json",
|
|
4212
|
-
|
|
4210
|
+
d,
|
|
4213
4211
|
"```"
|
|
4214
4212
|
) : ge.push(
|
|
4215
4213
|
"",
|
|
@@ -4262,8 +4260,8 @@ function Ur() {
|
|
|
4262
4260
|
"textarea",
|
|
4263
4261
|
{
|
|
4264
4262
|
className: "min-h-[520px] w-full rounded-md border border-gray-300 p-3 font-mono text-xs text-gray-900 outline-none focus:border-blue-500 focus:ring-1 focus:ring-blue-500",
|
|
4265
|
-
value:
|
|
4266
|
-
onChange: (K) =>
|
|
4263
|
+
value: d,
|
|
4264
|
+
onChange: (K) => u(K.target.value),
|
|
4267
4265
|
spellCheck: !1
|
|
4268
4266
|
}
|
|
4269
4267
|
)
|
|
@@ -4288,13 +4286,13 @@ function Gr({ output: t }) {
|
|
|
4288
4286
|
] }, `${i.label}-${c}`)) }) : null
|
|
4289
4287
|
] }),
|
|
4290
4288
|
(l = t.charts) == null ? void 0 : l.map((i, c) => {
|
|
4291
|
-
const o = i.dataTable ? a.get(i.dataTable) : void 0,
|
|
4292
|
-
if (!
|
|
4289
|
+
const o = i.dataTable ? a.get(i.dataTable) : void 0, m = i.data ?? (o == null ? void 0 : o.rows) ?? [];
|
|
4290
|
+
if (!m.length)
|
|
4293
4291
|
return /* @__PURE__ */ e(V, { title: i.title, children: /* @__PURE__ */ e("p", { className: "text-sm text-red-600", children: "Chart has no usable data." }) }, i.id || `chart_${c + 1}`);
|
|
4294
|
-
const
|
|
4292
|
+
const d = i.type === "pie" ? [] : m.map((v) => String(v[i.x] ?? "")), u = Yr(d), p = Math.max(320, 200 + u.axisHeight);
|
|
4295
4293
|
return /* @__PURE__ */ r(V, { children: [
|
|
4296
4294
|
/* @__PURE__ */ e("div", { className: "pb-3 text-sm font-semibold text-gray-700", children: i.title }),
|
|
4297
|
-
/* @__PURE__ */ e("div", { style: { height: p }, className: "w-full", children: /* @__PURE__ */ e(Da, { width: "100%", height: "100%", children: i.type === "line" ? /* @__PURE__ */ r(_a, { data:
|
|
4295
|
+
/* @__PURE__ */ e("div", { style: { height: p }, className: "w-full", children: /* @__PURE__ */ e(Da, { width: "100%", height: "100%", children: i.type === "line" ? /* @__PURE__ */ r(_a, { data: m, margin: { top: 10, right: 20, left: 0, bottom: 0 }, children: [
|
|
4298
4296
|
/* @__PURE__ */ e(an, { strokeDasharray: "3 3", stroke: "#f3f4f6" }),
|
|
4299
4297
|
/* @__PURE__ */ e(
|
|
4300
4298
|
rn,
|
|
@@ -4302,9 +4300,9 @@ function Gr({ output: t }) {
|
|
|
4302
4300
|
dataKey: i.x,
|
|
4303
4301
|
tick: { fill: "#6b7280", fontSize: 12 },
|
|
4304
4302
|
interval: 0,
|
|
4305
|
-
angle:
|
|
4306
|
-
textAnchor:
|
|
4307
|
-
height:
|
|
4303
|
+
angle: u.angle,
|
|
4304
|
+
textAnchor: u.angle === 0 ? "middle" : "end",
|
|
4305
|
+
height: u.axisHeight
|
|
4308
4306
|
}
|
|
4309
4307
|
),
|
|
4310
4308
|
/* @__PURE__ */ e(sn, { tick: { fill: "#6b7280", fontSize: 12 }, tickFormatter: Nn }),
|
|
@@ -4312,8 +4310,8 @@ function Gr({ output: t }) {
|
|
|
4312
4310
|
/* @__PURE__ */ e(Aa, { type: "monotone", dataKey: i.y, stroke: "#3b82f6", strokeWidth: 2, dot: { r: 3 } })
|
|
4313
4311
|
] }) : i.type === "pie" ? /* @__PURE__ */ r(Ta, { children: [
|
|
4314
4312
|
/* @__PURE__ */ e(It, { formatter: (v) => ct(v, Ot(o, i.y)) }),
|
|
4315
|
-
/* @__PURE__ */ e(Pa, { data:
|
|
4316
|
-
] }) : /* @__PURE__ */ r(Ia, { data:
|
|
4313
|
+
/* @__PURE__ */ e(Pa, { data: m, dataKey: i.y, nameKey: i.x, outerRadius: 110, children: m.map((v, w) => /* @__PURE__ */ e(Ra, { fill: Sn[w % Sn.length] }, w)) })
|
|
4314
|
+
] }) : /* @__PURE__ */ r(Ia, { data: m, margin: { top: 10, right: 20, left: 0, bottom: 0 }, children: [
|
|
4317
4315
|
/* @__PURE__ */ e(an, { strokeDasharray: "3 3", stroke: "#f3f4f6" }),
|
|
4318
4316
|
/* @__PURE__ */ e(
|
|
4319
4317
|
rn,
|
|
@@ -4321,9 +4319,9 @@ function Gr({ output: t }) {
|
|
|
4321
4319
|
dataKey: i.x,
|
|
4322
4320
|
tick: { fill: "#6b7280", fontSize: 12 },
|
|
4323
4321
|
interval: 0,
|
|
4324
|
-
angle:
|
|
4325
|
-
textAnchor:
|
|
4326
|
-
height:
|
|
4322
|
+
angle: u.angle,
|
|
4323
|
+
textAnchor: u.angle === 0 ? "middle" : "end",
|
|
4324
|
+
height: u.axisHeight
|
|
4327
4325
|
}
|
|
4328
4326
|
),
|
|
4329
4327
|
/* @__PURE__ */ e(sn, { tick: { fill: "#6b7280", fontSize: 12 }, tickFormatter: Nn }),
|
|
@@ -4334,7 +4332,7 @@ function Gr({ output: t }) {
|
|
|
4334
4332
|
}),
|
|
4335
4333
|
n.map((i) => /* @__PURE__ */ e(V, { title: i.title, children: /* @__PURE__ */ e("div", { className: "overflow-x-auto", children: /* @__PURE__ */ r("table", { className: "min-w-full divide-y divide-gray-200 text-sm", children: [
|
|
4336
4334
|
/* @__PURE__ */ e("thead", { className: "bg-gray-50", children: /* @__PURE__ */ e("tr", { children: i.columns.map((c) => /* @__PURE__ */ e("th", { className: "px-4 py-2 text-left font-medium text-gray-500", children: c.label }, c.key)) }) }),
|
|
4337
|
-
/* @__PURE__ */ e("tbody", { className: "divide-y divide-gray-100", children: i.rows.map((c, o) => /* @__PURE__ */ e("tr", { className: "hover:bg-gray-50", children: i.columns.map((
|
|
4335
|
+
/* @__PURE__ */ e("tbody", { className: "divide-y divide-gray-100", children: i.rows.map((c, o) => /* @__PURE__ */ e("tr", { className: "hover:bg-gray-50", children: i.columns.map((m) => /* @__PURE__ */ e("td", { className: "px-4 py-1.5 text-gray-900", children: ct(c[m.key], m.type) }, m.key)) }, o)) })
|
|
4338
4336
|
] }) }) }, i.id))
|
|
4339
4337
|
] });
|
|
4340
4338
|
}
|
|
@@ -4567,7 +4565,7 @@ function Xr() {
|
|
|
4567
4565
|
const t = We(), { data: n, isLoading: a } = ie({
|
|
4568
4566
|
queryKey: ["setup-status"],
|
|
4569
4567
|
queryFn: () => O.setupStatus()
|
|
4570
|
-
}), [s, l] = N(""), [i, c] = N("USD"), [o,
|
|
4568
|
+
}), [s, l] = N(""), [i, c] = N("USD"), [o, m] = N("quick"), [d, u] = N(!1), [p, v] = N(null), w = me({
|
|
4571
4569
|
mutationFn: () => O.createCompany({ name: s, currency: i })
|
|
4572
4570
|
}), g = me({
|
|
4573
4571
|
mutationFn: () => O.seedDemo()
|
|
@@ -4579,23 +4577,22 @@ function Xr() {
|
|
|
4579
4577
|
if (await w.mutateAsync(), o === "history") {
|
|
4580
4578
|
const b = await y.mutateAsync();
|
|
4581
4579
|
v(b.stats);
|
|
4582
|
-
} else
|
|
4583
|
-
|
|
4584
|
-
t.invalidateQueries({ queryKey: ["setup-status"] }), m(!0);
|
|
4580
|
+
} else o === "quick" && await g.mutateAsync();
|
|
4581
|
+
t.invalidateQueries({ queryKey: ["setup-status"] }), u(!0);
|
|
4585
4582
|
} catch {
|
|
4586
4583
|
}
|
|
4587
4584
|
};
|
|
4588
4585
|
if (a)
|
|
4589
4586
|
return /* @__PURE__ */ e("p", { className: "text-gray-500", children: "Loading..." });
|
|
4590
|
-
if (n != null && n.setup_complete && !
|
|
4587
|
+
if (n != null && n.setup_complete && !d)
|
|
4591
4588
|
return /* @__PURE__ */ r("div", { className: "space-y-6", children: [
|
|
4592
4589
|
/* @__PURE__ */ e(V, { title: "Companies", children: n.companies && n.companies.length > 0 ? /* @__PURE__ */ e("ul", { className: "divide-y divide-gray-100", children: n.companies.map((b, h) => /* @__PURE__ */ e("li", { className: "py-3", children: /* @__PURE__ */ e(es, { company: b }) }, h)) }) : /* @__PURE__ */ e("p", { className: "text-gray-400", children: "No companies found" }) }),
|
|
4593
4590
|
/* @__PURE__ */ e(ye, { to: "/", className: "text-blue-600 hover:text-blue-800 text-sm font-medium", children: "Go to Dashboard" })
|
|
4594
4591
|
] });
|
|
4595
|
-
if (
|
|
4592
|
+
if (d)
|
|
4596
4593
|
return /* @__PURE__ */ e("div", { className: "space-y-6", children: /* @__PURE__ */ e(V, { children: /* @__PURE__ */ r("div", { className: "py-8 text-center", children: [
|
|
4597
4594
|
/* @__PURE__ */ e("p", { className: "text-lg font-semibold text-green-700", children: "Setup complete!" }),
|
|
4598
|
-
/* @__PURE__ */ e("p", { className: "mt-2 text-sm text-gray-500", children:
|
|
4595
|
+
/* @__PURE__ */ e("p", { className: "mt-2 text-sm text-gray-500", children: o === "history" ? "Your company has been created and three years of history has been simulated." : o === "quick" ? "Your company has been created and demo data has been seeded." : "Your company has been created. No demo data was added." }),
|
|
4599
4596
|
p && /* @__PURE__ */ r("div", { className: "mx-auto mt-6 max-w-sm text-left", children: [
|
|
4600
4597
|
/* @__PURE__ */ e("p", { className: "mb-2 text-sm font-medium text-gray-700", children: "Generated documents:" }),
|
|
4601
4598
|
/* @__PURE__ */ e("ul", { className: "divide-y divide-gray-100 text-sm", children: Object.entries(p).sort(([b], [h]) => b.localeCompare(h)).map(([b, h]) => /* @__PURE__ */ r("li", { className: "flex justify-between py-1", children: [
|
|
@@ -4639,7 +4636,7 @@ function Xr() {
|
|
|
4639
4636
|
name: "seed-mode",
|
|
4640
4637
|
value: "quick",
|
|
4641
4638
|
checked: o === "quick",
|
|
4642
|
-
onChange: () =>
|
|
4639
|
+
onChange: () => m("quick"),
|
|
4643
4640
|
className: "mt-1"
|
|
4644
4641
|
}
|
|
4645
4642
|
),
|
|
@@ -4656,7 +4653,7 @@ function Xr() {
|
|
|
4656
4653
|
name: "seed-mode",
|
|
4657
4654
|
value: "history",
|
|
4658
4655
|
checked: o === "history",
|
|
4659
|
-
onChange: () =>
|
|
4656
|
+
onChange: () => m("history"),
|
|
4660
4657
|
className: "mt-1"
|
|
4661
4658
|
}
|
|
4662
4659
|
),
|
|
@@ -4664,6 +4661,23 @@ function Xr() {
|
|
|
4664
4661
|
/* @__PURE__ */ e("div", { className: "text-sm font-medium text-gray-900", children: "Simulate 3 years of history" }),
|
|
4665
4662
|
/* @__PURE__ */ e("div", { className: "text-xs text-gray-500", children: "Walks business days (skips weekends + US holidays) and generates quotations, orders, deliveries, invoices, payments, and reorder-driven purchasing. Seasonality + YoY growth baked in. Takes ~3 minutes." })
|
|
4666
4663
|
] })
|
|
4664
|
+
] }),
|
|
4665
|
+
/* @__PURE__ */ r("label", { className: "flex cursor-pointer items-start gap-3 rounded-md border border-gray-200 p-3 hover:bg-gray-50", children: [
|
|
4666
|
+
/* @__PURE__ */ e(
|
|
4667
|
+
"input",
|
|
4668
|
+
{
|
|
4669
|
+
type: "radio",
|
|
4670
|
+
name: "seed-mode",
|
|
4671
|
+
value: "none",
|
|
4672
|
+
checked: o === "none",
|
|
4673
|
+
onChange: () => m("none"),
|
|
4674
|
+
className: "mt-1"
|
|
4675
|
+
}
|
|
4676
|
+
),
|
|
4677
|
+
/* @__PURE__ */ r("div", { children: [
|
|
4678
|
+
/* @__PURE__ */ e("div", { className: "text-sm font-medium text-gray-900", children: "Create empty company, no demo data" }),
|
|
4679
|
+
/* @__PURE__ */ e("div", { className: "text-xs text-gray-500", children: "Just the company and its chart of accounts. Add your own customers, suppliers, items, and transactions from scratch." })
|
|
4680
|
+
] })
|
|
4667
4681
|
] })
|
|
4668
4682
|
] }),
|
|
4669
4683
|
/* @__PURE__ */ e("div", { className: "pt-2", children: /* @__PURE__ */ e(
|
|
@@ -4671,7 +4685,7 @@ function Xr() {
|
|
|
4671
4685
|
{
|
|
4672
4686
|
onClick: I,
|
|
4673
4687
|
disabled: L || !s.trim(),
|
|
4674
|
-
children: L ? o === "history" ? "Simulating three years..." : "Setting up..." : o === "history" ? "Create Company & Simulate History" : "Create Company & Seed Demo Data"
|
|
4688
|
+
children: L ? o === "history" ? "Simulating three years..." : "Setting up..." : o === "history" ? "Create Company & Simulate History" : o === "quick" ? "Create Company & Seed Demo Data" : "Create Company"
|
|
4675
4689
|
}
|
|
4676
4690
|
) })
|
|
4677
4691
|
] }) })
|
|
@@ -4857,8 +4871,8 @@ const ts = [
|
|
|
4857
4871
|
];
|
|
4858
4872
|
function ns() {
|
|
4859
4873
|
const t = Oe(), { t: n } = Z(), { sessions: a, createSession: s } = tt(), l = async (c) => {
|
|
4860
|
-
var
|
|
4861
|
-
let o = ((
|
|
4874
|
+
var m;
|
|
4875
|
+
let o = ((m = a[0]) == null ? void 0 : m.id) || "";
|
|
4862
4876
|
if (!o)
|
|
4863
4877
|
try {
|
|
4864
4878
|
o = (await s()).id;
|
|
@@ -5151,7 +5165,7 @@ function wn(t) {
|
|
|
5151
5165
|
});
|
|
5152
5166
|
}
|
|
5153
5167
|
function Cn() {
|
|
5154
|
-
const { t } = Z(), { sessionId: n } =
|
|
5168
|
+
const { t } = Z(), { sessionId: n } = ut(), a = Oe(), s = dt(), [l] = wt(), i = l.get("demo") === "1", [c, o] = N(""), [m, d] = N(""), [u, p] = N([]), [v, w] = N(""), [g, y] = N(!1), I = H(null), {
|
|
5155
5169
|
connectionStatus: L,
|
|
5156
5170
|
connectionVersion: C,
|
|
5157
5171
|
createSession: b,
|
|
@@ -5215,7 +5229,7 @@ function Cn() {
|
|
|
5215
5229
|
});
|
|
5216
5230
|
}, [n, Qe, nt, k]), S = H(null);
|
|
5217
5231
|
re(() => {
|
|
5218
|
-
|
|
5232
|
+
d(""), oe.current = null, ne.current += 1, n && Wn(n);
|
|
5219
5233
|
const f = s.state;
|
|
5220
5234
|
f != null && f.prefillMessage && S.current !== f ? (S.current = f, o(f.prefillMessage), window.setTimeout(() => {
|
|
5221
5235
|
var D;
|
|
@@ -5249,8 +5263,8 @@ function Cn() {
|
|
|
5249
5263
|
Be.current = ee < 80;
|
|
5250
5264
|
}
|
|
5251
5265
|
re(() => {
|
|
5252
|
-
!n || !he || !i || oe.current !== n && (oe.current = n,
|
|
5253
|
-
oe.current = null,
|
|
5266
|
+
!n || !he || !i || oe.current !== n && (oe.current = n, d(""), h(n).catch((f) => {
|
|
5267
|
+
oe.current = null, d(f instanceof Error ? f.message : t("chat.demoError"));
|
|
5254
5268
|
}));
|
|
5255
5269
|
}, [n, he, i, h]), re(() => {
|
|
5256
5270
|
!n || !i || qe !== "complete" || (o(""), a(`/chat/${n}`, { replace: !0 }));
|
|
@@ -5323,7 +5337,7 @@ function Cn() {
|
|
|
5323
5337
|
}, Ye = (f) => {
|
|
5324
5338
|
const D = f.relatedTarget;
|
|
5325
5339
|
(!D || !f.currentTarget.contains(D)) && y(!1);
|
|
5326
|
-
},
|
|
5340
|
+
}, de = (f) => {
|
|
5327
5341
|
f.preventDefault(), y(!1), f.dataTransfer.files && f.dataTransfer.files.length > 0 && ve(f.dataTransfer.files);
|
|
5328
5342
|
}, P = (f) => {
|
|
5329
5343
|
const D = [];
|
|
@@ -5333,11 +5347,11 @@ function Cn() {
|
|
|
5333
5347
|
ae && D.push(ae);
|
|
5334
5348
|
}
|
|
5335
5349
|
D.length > 0 && (f.preventDefault(), ve(D));
|
|
5336
|
-
}, R =
|
|
5350
|
+
}, R = u.some((f) => f.uploading), M = u.some((f) => f.error), $ = u.filter((f) => f.uploadedId && !f.error).map((f) => f.uploadedId);
|
|
5337
5351
|
function Te() {
|
|
5338
5352
|
const f = c.trim();
|
|
5339
5353
|
if (n && !(!f && $.length === 0) && !R && q(n, f, $.length > 0 ? $ : void 0)) {
|
|
5340
|
-
for (const D of
|
|
5354
|
+
for (const D of u)
|
|
5341
5355
|
D.previewUrl && URL.revokeObjectURL(D.previewUrl);
|
|
5342
5356
|
p([]), w(""), o("");
|
|
5343
5357
|
}
|
|
@@ -5351,7 +5365,7 @@ function Cn() {
|
|
|
5351
5365
|
className: "relative -m-4 h-[calc(100%+2rem)] overflow-hidden md:-m-6 md:h-[calc(100%+3rem)]",
|
|
5352
5366
|
onDragOver: F,
|
|
5353
5367
|
onDragLeave: Ye,
|
|
5354
|
-
onDrop:
|
|
5368
|
+
onDrop: de,
|
|
5355
5369
|
children: [
|
|
5356
5370
|
g && /* @__PURE__ */ e("div", { className: "pointer-events-none absolute inset-3 z-50 flex items-center justify-center rounded-lg border-2 border-dashed border-brand bg-brand/5 text-sm font-medium text-brand", children: t("chat.dropToAttach") }),
|
|
5357
5371
|
/* @__PURE__ */ e(
|
|
@@ -5375,7 +5389,7 @@ function Cn() {
|
|
|
5375
5389
|
children: t(Qe ? "common.loading" : "chat.loadOlder")
|
|
5376
5390
|
}
|
|
5377
5391
|
) }),
|
|
5378
|
-
|
|
5392
|
+
m && /* @__PURE__ */ e("div", { className: "rounded-md bg-rose-50 px-4 py-3 text-sm text-rose-700 ring-1 ring-rose-200", children: m }),
|
|
5379
5393
|
Re.length === 0 && qe !== "running" && !i && /* @__PURE__ */ r("div", { className: "py-20 text-center", children: [
|
|
5380
5394
|
/* @__PURE__ */ e("h3", { className: "text-lg font-semibold text-fg-muted", children: t("chat.title") }),
|
|
5381
5395
|
/* @__PURE__ */ e("p", { className: "mt-2 text-sm text-fg-muted", children: t("chat.subtitle") }),
|
|
@@ -5397,7 +5411,7 @@ function Cn() {
|
|
|
5397
5411
|
f
|
|
5398
5412
|
)) })
|
|
5399
5413
|
] }),
|
|
5400
|
-
Re.map((f, D) => /* @__PURE__ */ e(
|
|
5414
|
+
Re.map((f, D) => /* @__PURE__ */ e(ds, { message: f }, D)),
|
|
5401
5415
|
/* @__PURE__ */ e("div", { ref: K })
|
|
5402
5416
|
]
|
|
5403
5417
|
}
|
|
@@ -5410,7 +5424,7 @@ function Cn() {
|
|
|
5410
5424
|
ref: le,
|
|
5411
5425
|
className: "absolute bottom-0 left-0 right-0 bg-surface-muted px-4 pb-[max(0.75rem,env(safe-area-inset-bottom))] md:right-6 md:pl-6 md:pr-0",
|
|
5412
5426
|
children: /* @__PURE__ */ r("div", { className: "mx-auto max-w-3xl", children: [
|
|
5413
|
-
|
|
5427
|
+
u.length > 0 && /* @__PURE__ */ e("div", { className: "mb-2 flex flex-wrap gap-2", children: u.map((f) => /* @__PURE__ */ r(
|
|
5414
5428
|
"div",
|
|
5415
5429
|
{
|
|
5416
5430
|
className: "relative flex items-center gap-2 rounded-lg bg-surface px-2 py-1.5 text-xs ring-1 ring-line shadow-card",
|
|
@@ -5474,7 +5488,7 @@ function Cn() {
|
|
|
5474
5488
|
var f;
|
|
5475
5489
|
return (f = I.current) == null ? void 0 : f.click();
|
|
5476
5490
|
},
|
|
5477
|
-
disabled: !he || !n || xe || Ae ||
|
|
5491
|
+
disabled: !he || !n || xe || Ae || u.length >= zt,
|
|
5478
5492
|
className: "flex h-11 w-11 shrink-0 items-center justify-center rounded-lg text-fg-muted transition-all hover:bg-surface-subtle hover:text-fg disabled:cursor-not-allowed disabled:opacity-40 md:h-10 md:w-10",
|
|
5479
5493
|
title: t("chat.attachTitle"),
|
|
5480
5494
|
children: /* @__PURE__ */ e("svg", { viewBox: "0 0 24 24", width: "20", height: "20", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ e("path", { d: "M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48" }) })
|
|
@@ -5535,13 +5549,13 @@ function cs({ attachments: t }) {
|
|
|
5535
5549
|
);
|
|
5536
5550
|
}) });
|
|
5537
5551
|
}
|
|
5538
|
-
function
|
|
5552
|
+
function ds({ message: t }) {
|
|
5539
5553
|
return t.type === "user" ? /* @__PURE__ */ e("div", { className: "flex justify-end", children: /* @__PURE__ */ r("div", { className: "max-w-[80%] break-words rounded-2xl rounded-br-md bg-gradient-to-b from-brand to-brand/90 px-4 py-2.5 text-sm text-brand-fg ring-1 ring-black/10 shadow-bubble-user", children: [
|
|
5540
5554
|
t.content,
|
|
5541
5555
|
/* @__PURE__ */ e(cs, { attachments: t.attachments }),
|
|
5542
5556
|
t.timestamp && /* @__PURE__ */ e("div", { className: "mt-1 text-right text-[10px] text-brand-fg/70", title: wn(t.timestamp), children: kn(t.timestamp) })
|
|
5543
5557
|
] }) }) : t.type === "assistant" ? /* @__PURE__ */ e("div", { className: "flex justify-start", children: /* @__PURE__ */ r("div", { className: "max-w-[80%] break-words rounded-2xl rounded-bl-md bg-surface px-4 py-2.5 text-sm text-fg ring-1 ring-line shadow-card", children: [
|
|
5544
|
-
/* @__PURE__ */ e(
|
|
5558
|
+
/* @__PURE__ */ e(us, { content: t.content }),
|
|
5545
5559
|
t.timestamp && /* @__PURE__ */ e("div", { className: "mt-1 text-right text-[10px] text-fg-muted", title: wn(t.timestamp), children: kn(t.timestamp) })
|
|
5546
5560
|
] }) }) : t.type === "thinking" ? /* @__PURE__ */ e("div", { className: "flex justify-start", children: /* @__PURE__ */ r("div", { className: "flex items-center gap-2 rounded-full bg-surface px-3 py-1.5 text-xs text-fg-muted ring-1 ring-line shadow-card", children: [
|
|
5547
5561
|
/* @__PURE__ */ e("span", { className: "inline-block h-1.5 w-1.5 animate-pulse rounded-full bg-brand" }),
|
|
@@ -5581,7 +5595,7 @@ function us({ message: t }) {
|
|
|
5581
5595
|
}
|
|
5582
5596
|
) }) : t.type === "error" ? /* @__PURE__ */ e("div", { className: "flex justify-start", children: /* @__PURE__ */ e("div", { className: "max-w-[80%] rounded-2xl rounded-bl-md bg-rose-50 px-4 py-2.5 text-sm text-rose-700 ring-1 ring-rose-200 shadow-card", children: t.content }) }) : null;
|
|
5583
5597
|
}
|
|
5584
|
-
function
|
|
5598
|
+
function us({ content: t }) {
|
|
5585
5599
|
const n = t.split(`
|
|
5586
5600
|
`), a = [];
|
|
5587
5601
|
let s = !1, l = [];
|
|
@@ -5664,20 +5678,20 @@ function ps(t, n) {
|
|
|
5664
5678
|
let c = 0;
|
|
5665
5679
|
for (; (l = i.exec(t)) !== null; ) {
|
|
5666
5680
|
const o = l.index;
|
|
5667
|
-
let
|
|
5668
|
-
for (;
|
|
5669
|
-
|
|
5670
|
-
o > s && a.push(t.slice(s, o)), a.push(Xn(
|
|
5681
|
+
let m = l[0], d = "";
|
|
5682
|
+
for (; m.length > 0 && /[.,;:!?]$/.test(m); )
|
|
5683
|
+
d = m.slice(-1) + d, m = m.slice(0, -1);
|
|
5684
|
+
o > s && a.push(t.slice(s, o)), a.push(Xn(m, m, `${n}-u${c}`)), d && a.push(d), s = o + l[0].length, c += 1;
|
|
5671
5685
|
}
|
|
5672
5686
|
return s < t.length && a.push(t.slice(s)), a.length > 0 ? a : [t];
|
|
5673
5687
|
}
|
|
5674
5688
|
function hs() {
|
|
5675
|
-
const t = Oe(), [n] = wt(), { user: a, login: s, register: l } = mt(), { t: i } = Z(), c = n.get("invite") || "", [o,
|
|
5689
|
+
const t = Oe(), [n] = wt(), { user: a, login: s, register: l } = mt(), { t: i } = Z(), c = n.get("invite") || "", [o, m] = N(c ? "register" : "login"), [d, u] = N(!1), [p, v] = N(!0), [w, g] = N(""), [y, I] = N(""), [L, C] = N(""), [b, h] = N(""), [A, B] = N("");
|
|
5676
5690
|
re(() => {
|
|
5677
5691
|
a && a.role !== "public_manager" && t("/", { replace: !0 });
|
|
5678
5692
|
}, [a, t]), re(() => {
|
|
5679
5693
|
O.authSetupStatus().then((q) => {
|
|
5680
|
-
|
|
5694
|
+
u(q.registration_open), q.registration_open && m("register");
|
|
5681
5695
|
}).catch(() => {
|
|
5682
5696
|
}).finally(() => v(!1));
|
|
5683
5697
|
}, []);
|
|
@@ -5706,7 +5720,7 @@ function hs() {
|
|
|
5706
5720
|
return p ? /* @__PURE__ */ e("div", { className: "flex h-dvh items-center justify-center bg-surface-muted", children: /* @__PURE__ */ e("div", { className: "text-fg-muted", children: i("common.loading") }) }) : /* @__PURE__ */ e("div", { className: "flex min-h-dvh items-center justify-center bg-surface-muted px-4", children: /* @__PURE__ */ r("div", { className: "w-full max-w-sm space-y-6", children: [
|
|
5707
5721
|
/* @__PURE__ */ r("div", { className: "text-center", children: [
|
|
5708
5722
|
/* @__PURE__ */ e("h1", { className: "text-2xl font-bold text-brand", children: "Lambda ERP" }),
|
|
5709
|
-
/* @__PURE__ */ e("p", { className: "mt-1 text-sm text-fg-muted", children: i(
|
|
5723
|
+
/* @__PURE__ */ e("p", { className: "mt-1 text-sm text-fg-muted", children: i(d ? "login.taglineFirstRun" : o === "register" ? "login.taglineRegister" : "login.taglineSignIn") }),
|
|
5710
5724
|
(a == null ? void 0 : a.role) === "public_manager" && /* @__PURE__ */ e("p", { className: "mt-2 text-xs text-amber-700", children: i("login.demoBanner") })
|
|
5711
5725
|
] }),
|
|
5712
5726
|
w && /* @__PURE__ */ e("div", { className: "rounded-lg bg-rose-50 px-4 py-3 text-sm text-rose-700 ring-1 ring-rose-200", children: w }),
|
|
@@ -5750,7 +5764,7 @@ function hs() {
|
|
|
5750
5764
|
required: !0
|
|
5751
5765
|
}
|
|
5752
5766
|
),
|
|
5753
|
-
/* @__PURE__ */ e(X, { type: "submit", className: "w-full", children: i(o === "register" ?
|
|
5767
|
+
/* @__PURE__ */ e(X, { type: "submit", className: "w-full", children: i(o === "register" ? d ? "login.createAdmin" : "login.register" : "login.signIn") })
|
|
5754
5768
|
] }) }),
|
|
5755
5769
|
(a == null ? void 0 : a.role) === "public_manager" && /* @__PURE__ */ e(V, { children: /* @__PURE__ */ r("div", { className: "space-y-3", children: [
|
|
5756
5770
|
/* @__PURE__ */ r("div", { children: [
|
|
@@ -5767,14 +5781,14 @@ function hs() {
|
|
|
5767
5781
|
}
|
|
5768
5782
|
)
|
|
5769
5783
|
] }) }),
|
|
5770
|
-
!
|
|
5784
|
+
!d && !c && /* @__PURE__ */ e("p", { className: "text-center text-sm text-fg-muted", children: o === "login" ? /* @__PURE__ */ r(Ne, { children: [
|
|
5771
5785
|
i("login.haveInvite"),
|
|
5772
5786
|
" ",
|
|
5773
|
-
/* @__PURE__ */ e("button", { onClick: () =>
|
|
5787
|
+
/* @__PURE__ */ e("button", { onClick: () => m("register"), className: "font-medium text-brand transition-colors hover:text-brand/80", children: i("login.registerLink") })
|
|
5774
5788
|
] }) : /* @__PURE__ */ r(Ne, { children: [
|
|
5775
5789
|
i("login.alreadyHaveAccount"),
|
|
5776
5790
|
" ",
|
|
5777
|
-
/* @__PURE__ */ e("button", { onClick: () =>
|
|
5791
|
+
/* @__PURE__ */ e("button", { onClick: () => m("login"), className: "font-medium text-brand transition-colors hover:text-brand/80", children: i("login.signInLink") })
|
|
5778
5792
|
] }) })
|
|
5779
5793
|
] }) });
|
|
5780
5794
|
}
|
|
@@ -5811,11 +5825,11 @@ function An() {
|
|
|
5811
5825
|
return { type: "sales", party: "", amount: "", due_date: "", remarks: "" };
|
|
5812
5826
|
}
|
|
5813
5827
|
function ys() {
|
|
5814
|
-
const t = Oe(), n = We(), [a, s] = N(""), [l, i] = N((/* @__PURE__ */ new Date()).toISOString().split("T")[0]), [c, o] = N(""), [
|
|
5828
|
+
const t = Oe(), n = We(), [a, s] = N(""), [l, i] = N((/* @__PURE__ */ new Date()).toISOString().split("T")[0]), [c, o] = N(""), [m, d] = N([Dn()]), [u, p] = N([_n()]), [v, w] = N([An()]), [g, y] = N({}), I = me({
|
|
5815
5829
|
mutationFn: () => O.importAccountBalances({
|
|
5816
5830
|
company: a,
|
|
5817
5831
|
posting_date: l,
|
|
5818
|
-
entries:
|
|
5832
|
+
entries: m.filter((h) => h.account && (h.debit || h.credit)).map((h) => ({
|
|
5819
5833
|
account: h.account,
|
|
5820
5834
|
debit: parseFloat(h.debit) || 0,
|
|
5821
5835
|
credit: parseFloat(h.credit) || 0,
|
|
@@ -5829,7 +5843,7 @@ function ys() {
|
|
|
5829
5843
|
company: a,
|
|
5830
5844
|
posting_date: l,
|
|
5831
5845
|
warehouse: c,
|
|
5832
|
-
items:
|
|
5846
|
+
items: u.filter((h) => h.item_code && h.qty).map((h) => ({
|
|
5833
5847
|
item_code: h.item_code,
|
|
5834
5848
|
qty: parseFloat(h.qty) || 0,
|
|
5835
5849
|
rate: parseFloat(h.rate) || 0
|
|
@@ -5870,19 +5884,19 @@ function ys() {
|
|
|
5870
5884
|
/* @__PURE__ */ e("th", { className: "px-2 py-2 text-right font-medium text-gray-500", children: "Debit" }),
|
|
5871
5885
|
/* @__PURE__ */ e("th", { className: "px-2 py-2 text-right font-medium text-gray-500", children: "Credit" })
|
|
5872
5886
|
] }) }),
|
|
5873
|
-
/* @__PURE__ */ e("tbody", { children:
|
|
5874
|
-
/* @__PURE__ */ e("td", { className: "px-2 py-1", children: /* @__PURE__ */ e(ke, { value: h.account, onChange: (B) => b(
|
|
5875
|
-
/* @__PURE__ */ e("td", { className: "px-2 py-1", children: /* @__PURE__ */ r("select", { value: h.party_type, onChange: (B) => b(
|
|
5887
|
+
/* @__PURE__ */ e("tbody", { children: m.map((h, A) => /* @__PURE__ */ r("tr", { children: [
|
|
5888
|
+
/* @__PURE__ */ e("td", { className: "px-2 py-1", children: /* @__PURE__ */ e(ke, { value: h.account, onChange: (B) => b(m, d, A, "account", B), linkDoctype: "account", readOnly: !1, label: "" }) }),
|
|
5889
|
+
/* @__PURE__ */ e("td", { className: "px-2 py-1", children: /* @__PURE__ */ r("select", { value: h.party_type, onChange: (B) => b(m, d, A, "party_type", B.target.value), className: "w-full rounded border border-gray-300 px-2 py-1.5 text-sm", children: [
|
|
5876
5890
|
/* @__PURE__ */ e("option", { value: "", children: "—" }),
|
|
5877
5891
|
/* @__PURE__ */ e("option", { value: "Customer", children: "Customer" }),
|
|
5878
5892
|
/* @__PURE__ */ e("option", { value: "Supplier", children: "Supplier" })
|
|
5879
5893
|
] }) }),
|
|
5880
|
-
/* @__PURE__ */ e("td", { className: "px-2 py-1", children: h.party_type ? /* @__PURE__ */ e(ke, { label: "", value: h.party, onChange: (B) => b(
|
|
5881
|
-
/* @__PURE__ */ e("td", { className: "px-2 py-1", children: /* @__PURE__ */ e("input", { type: "number", value: h.debit, onChange: (B) => b(
|
|
5882
|
-
/* @__PURE__ */ e("td", { className: "px-2 py-1", children: /* @__PURE__ */ e("input", { type: "number", value: h.credit, onChange: (B) => b(
|
|
5894
|
+
/* @__PURE__ */ e("td", { className: "px-2 py-1", children: h.party_type ? /* @__PURE__ */ e(ke, { label: "", value: h.party, onChange: (B) => b(m, d, A, "party", B), linkDoctype: h.party_type.toLowerCase(), readOnly: !1 }) : /* @__PURE__ */ e("span", { className: "text-gray-300 text-xs", children: "set party type first" }) }),
|
|
5895
|
+
/* @__PURE__ */ e("td", { className: "px-2 py-1", children: /* @__PURE__ */ e("input", { type: "number", value: h.debit, onChange: (B) => b(m, d, A, "debit", B.target.value), className: "w-24 rounded border border-gray-300 px-2 py-1.5 text-right text-sm", placeholder: "0.00" }) }),
|
|
5896
|
+
/* @__PURE__ */ e("td", { className: "px-2 py-1", children: /* @__PURE__ */ e("input", { type: "number", value: h.credit, onChange: (B) => b(m, d, A, "credit", B.target.value), className: "w-24 rounded border border-gray-300 px-2 py-1.5 text-right text-sm", placeholder: "0.00" }) })
|
|
5883
5897
|
] }, A)) })
|
|
5884
5898
|
] }) }),
|
|
5885
|
-
/* @__PURE__ */ e("div", { className: "mt-2 flex gap-2", children: /* @__PURE__ */ e("button", { onClick: () =>
|
|
5899
|
+
/* @__PURE__ */ e("div", { className: "mt-2 flex gap-2", children: /* @__PURE__ */ e("button", { onClick: () => d([...m, Dn()]), className: "text-xs text-blue-600 hover:text-blue-800", children: "+ Add Row" }) }),
|
|
5886
5900
|
/* @__PURE__ */ r("div", { className: "mt-3 flex items-center gap-3", children: [
|
|
5887
5901
|
/* @__PURE__ */ e(X, { onClick: () => I.mutate(), disabled: !a || I.isPending, children: I.isPending ? "Importing..." : "Import Account Balances" }),
|
|
5888
5902
|
I.error && /* @__PURE__ */ e("span", { className: "text-xs text-red-600", children: I.error.message }),
|
|
@@ -5901,13 +5915,13 @@ function ys() {
|
|
|
5901
5915
|
/* @__PURE__ */ e("th", { className: "px-2 py-2 text-right font-medium text-gray-500", children: "Qty" }),
|
|
5902
5916
|
/* @__PURE__ */ e("th", { className: "px-2 py-2 text-right font-medium text-gray-500", children: "Rate" })
|
|
5903
5917
|
] }) }),
|
|
5904
|
-
/* @__PURE__ */ e("tbody", { children:
|
|
5905
|
-
/* @__PURE__ */ e("td", { className: "px-2 py-1", children: /* @__PURE__ */ e(ke, { label: "", value: h.item_code, onChange: (B) => b(
|
|
5906
|
-
/* @__PURE__ */ e("td", { className: "px-2 py-1", children: /* @__PURE__ */ e("input", { type: "number", value: h.qty, onChange: (B) => b(
|
|
5907
|
-
/* @__PURE__ */ e("td", { className: "px-2 py-1", children: /* @__PURE__ */ e("input", { type: "number", value: h.rate, onChange: (B) => b(
|
|
5918
|
+
/* @__PURE__ */ e("tbody", { children: u.map((h, A) => /* @__PURE__ */ r("tr", { children: [
|
|
5919
|
+
/* @__PURE__ */ e("td", { className: "px-2 py-1", children: /* @__PURE__ */ e(ke, { label: "", value: h.item_code, onChange: (B) => b(u, p, A, "item_code", B), linkDoctype: "item", readOnly: !1 }) }),
|
|
5920
|
+
/* @__PURE__ */ e("td", { className: "px-2 py-1", children: /* @__PURE__ */ e("input", { type: "number", value: h.qty, onChange: (B) => b(u, p, A, "qty", B.target.value), className: "w-24 rounded border border-gray-300 px-2 py-1.5 text-right text-sm", placeholder: "0" }) }),
|
|
5921
|
+
/* @__PURE__ */ e("td", { className: "px-2 py-1", children: /* @__PURE__ */ e("input", { type: "number", value: h.rate, onChange: (B) => b(u, p, A, "rate", B.target.value), className: "w-24 rounded border border-gray-300 px-2 py-1.5 text-right text-sm", placeholder: "0.00" }) })
|
|
5908
5922
|
] }, A)) })
|
|
5909
5923
|
] }) }),
|
|
5910
|
-
/* @__PURE__ */ e("div", { className: "mt-2", children: /* @__PURE__ */ e("button", { onClick: () => p([...
|
|
5924
|
+
/* @__PURE__ */ e("div", { className: "mt-2", children: /* @__PURE__ */ e("button", { onClick: () => p([...u, _n()]), className: "text-xs text-blue-600 hover:text-blue-800", children: "+ Add Row" }) }),
|
|
5911
5925
|
/* @__PURE__ */ r("div", { className: "mt-3 flex items-center gap-3", children: [
|
|
5912
5926
|
/* @__PURE__ */ e(X, { onClick: () => L.mutate(), disabled: !a || !c || L.isPending, children: L.isPending ? "Importing..." : "Import Stock Balances" }),
|
|
5913
5927
|
L.error && /* @__PURE__ */ e("span", { className: "text-xs text-red-600", children: L.error.message }),
|
|
@@ -5983,10 +5997,10 @@ function fs() {
|
|
|
5983
5997
|
}), { data: l } = ie({
|
|
5984
5998
|
queryKey: ["auth-invites"],
|
|
5985
5999
|
queryFn: () => O.authListInvites()
|
|
5986
|
-
}), [i, c] = N(""), [o,
|
|
6000
|
+
}), [i, c] = N(""), [o, m] = N("viewer"), [d, u] = N(null), p = me({
|
|
5987
6001
|
mutationFn: () => O.authInvite(i, o),
|
|
5988
6002
|
onSuccess: (g) => {
|
|
5989
|
-
|
|
6003
|
+
u(g), c(""), n.invalidateQueries({ queryKey: ["auth-invites"] });
|
|
5990
6004
|
}
|
|
5991
6005
|
}), v = me({
|
|
5992
6006
|
mutationFn: ({ name: g, role: y }) => O.authChangeRole(g, y),
|
|
@@ -6028,7 +6042,7 @@ function fs() {
|
|
|
6028
6042
|
label: "Role",
|
|
6029
6043
|
options: ["viewer", "manager", "admin"],
|
|
6030
6044
|
value: o,
|
|
6031
|
-
onChange: (g) =>
|
|
6045
|
+
onChange: (g) => m(g.target.value)
|
|
6032
6046
|
}
|
|
6033
6047
|
),
|
|
6034
6048
|
/* @__PURE__ */ e(
|
|
@@ -6041,14 +6055,14 @@ function fs() {
|
|
|
6041
6055
|
)
|
|
6042
6056
|
] }),
|
|
6043
6057
|
p.error && /* @__PURE__ */ e("p", { className: "mt-2 text-sm text-red-600", children: p.error.message }),
|
|
6044
|
-
|
|
6058
|
+
d && /* @__PURE__ */ r("div", { className: "mt-3 rounded-md bg-green-50 px-4 py-3 text-sm", children: [
|
|
6045
6059
|
/* @__PURE__ */ e("p", { className: "font-medium text-green-800", children: "Invite created!" }),
|
|
6046
6060
|
/* @__PURE__ */ r("p", { className: "mt-1 text-green-700", children: [
|
|
6047
6061
|
"Share this link:",
|
|
6048
6062
|
" ",
|
|
6049
6063
|
/* @__PURE__ */ r("code", { className: "rounded bg-green-100 px-2 py-0.5 text-xs font-mono", children: [
|
|
6050
6064
|
window.location.origin,
|
|
6051
|
-
|
|
6065
|
+
d.link
|
|
6052
6066
|
] })
|
|
6053
6067
|
] })
|
|
6054
6068
|
] })
|
|
@@ -6144,7 +6158,7 @@ const bs = { save: "Save", saving: "Saving...", submit: "Submit", cancel: "Cance
|
|
|
6144
6158
|
dashboard: Zs,
|
|
6145
6159
|
chat: Xs,
|
|
6146
6160
|
tutorial: ei
|
|
6147
|
-
}, ni = { save: "Enregistrer", saving: "Enregistrement...", submit: "Valider", cancel: "Annuler", cancelDoc: "Annuler", delete: "Supprimer", edit: "Modifier", pdf: "PDF", addRow: "Ajouter une ligne", loading: "Chargement...", enable: "Activer", disable: "Désactiver", refresh: "Actualiser", refreshing: "Actualisation", areYouSure: "Êtes-vous sûr ?", all: "Tous", apply: "Appliquer", new: "Nouveau", prev: "Précédent", next: "Suivant", perPage: "Par page", page: "Page", of: "sur", showing: "Affichage", total: "Total", totals: "Totaux", errorOccurred: "Une erreur s'est produite" }, ai = { title: "Langue", help: "Choisissez la langue de l'interface. Votre choix est enregistré dans ce navigateur.", label: "Langue" }, ri = { logout: "Déconnexion", openMenu: "Ouvrir le menu", closeMenu: "Fermer le menu", new: "Nouveau : {{label}}" }, si = { dashboard: "Tableau de bord", setup: "Configuration de l'entreprise", tutorial: "Premiers pas", chat: "Chat", reports: "Rapports", "trial-balance": "Balance comptable", "general-ledger": "Grand livre", "stock-balance": "Solde de stock", "profit-and-loss": "Compte de résultat", "balance-sheet": "Bilan", "ar-aging": "Balance âgée clients", "ap-aging": "Balance âgée fournisseurs", analytics: "Analyses" }, ii = { quotation: { one: "Devis", other: "Devis" }, "sales-order": { one: "Commande client", other: "Commandes client" }, "sales-invoice": { one: "Facture de vente", other: "Factures de vente" }, "pos-invoice": { one: "Ticket de caisse", other: "Tickets de caisse" }, "purchase-order": { one: "Bon de commande", other: "Bons de commande" }, "purchase-invoice": { one: "Facture d'achat", other: "Factures d'achat" }, "payment-entry": { one: "Paiement", other: "Paiements" }, "journal-entry": { one: "Écriture comptable", other: "Écritures comptables" }, "bank-transaction": { one: "Transaction bancaire", other: "Transactions bancaires" }, budget: { one: "Budget", other: "Budgets" }, subscription: { one: "Abonnement", other: "Abonnements" }, "stock-entry": { one: "Mouvement de stock", other: "Mouvements de stock" }, "delivery-note": { one: "Bon de livraison", other: "Bons de livraison" }, "purchase-receipt": { one: "Bon de réception", other: "Bons de réception" }, "pricing-rule": { one: "Règle de prix", other: "Règles de prix" } }, li = { company: { one: "Société", other: "Sociétés" }, customer: { one: "Client", other: "Clients" }, supplier: { one: "Fournisseur", other: "Fournisseurs" }, item: { one: "Article", other: "Articles" }, warehouse: { one: "Entrepôt", other: "Entrepôts" } }, oi = { chats: "Discussions", newChat: "Nouvelle discussion", deleteChat: "Supprimer la discussion", customAnalytics: "Analyses personnalisées", newAnalytics: "Nouvelle analyse", deleteReport: "Supprimer le rapport", groups: { Introduction: "Introduction", Selling: "Ventes", Buying: "Achats", Accounting: "Comptabilité", Stock: "Stock", Reports: "Rapports", Masters: "Données de base", Settings: "Paramètres" }, items: { "Getting Started": "Premiers pas", "Company Setup": "Configuration de l'entreprise", "Opening Balances": "Soldes d'ouverture", Quotation: "Devis", "Sales Order": "Commande client", "Sales Invoice": "Facture de vente", "POS Invoice": "Ticket de caisse", "Purchase Order": "Bon de commande", "Purchase Invoice": "Facture d'achat", "Payment Entry": "Paiement", "Journal Entry": "Écriture comptable", "Bank Transaction": "Transaction bancaire", Budget: "Budget", Subscription: "Abonnement", "Stock Entry": "Mouvement de stock", "Delivery Note": "Bon de livraison", "Purchase Receipt": "Bon de réception", "Trial Balance": "Balance comptable", "Profit & Loss": "Compte de résultat", "Balance Sheet": "Bilan", "General Ledger": "Grand livre", "AR Aging": "Balance âgée clients", "AP Aging": "Balance âgée fournisseurs", Analytics: "Analyses", "Stock Balance": "Solde de stock", Company: "Société", Customer: "Client", Supplier: "Fournisseur", Item: "Article", Warehouse: "Entrepôt", General: "Général", "Pricing Rule": "Règle de prix", "Users & Team": "Utilisateurs et équipe" } }, ci = { taglineFirstRun: "Créez votre compte administrateur pour commencer", taglineRegister: "Créez votre compte", taglineSignIn: "Connectez-vous à votre compte", demoBanner: "Le mode démo est actif. Connectez-vous avec un compte administrateur pour gérer les paramètres ou désactiver l'accès public.", fullName: "Nom complet", email: "E-mail", password: "Mot de passe", confirmPassword: "Confirmer le mot de passe", createAdmin: "Créer un compte administrateur", register: "S'inscrire", signIn: "Se connecter", browsingTitle: "Simple visite ?", browsingBody: "Démarrez une nouvelle session de chat et regardez la démo en direct.", enterDemo: "Lancer la démo", haveInvite: "Vous avez une invitation ?", registerLink: "S'inscrire", alreadyHaveAccount: "Vous avez déjà un compte ?", signInLink: "Se connecter", passwordsNoMatch: "Les mots de passe ne correspondent pas", passwordTooShort: "Le mot de passe doit comporter au moins 6 caractères", registrationFailed: "Échec de l'inscription", loginFailed: "Échec de la connexion" }, ui = { pdfTitle: "PDF et impression", pageSize: "Format de page", pdfHelp: "A4 est la norme internationale (210 x 297 mm). Letter est la norme aux États-Unis (8,5 x 11 po).", openingTitle: "Soldes d'ouverture", openingBody: "La page Soldes d'ouverture permet d'importer les soldes des comptes, le stock et les factures impayées d'un système précédent.", openingEnabled: "Actuellement activé — accessible sous Introduction > Soldes d'ouverture.", openingDisabled: "Actuellement désactivé — la page est masquée dans la barre latérale.", publicTitle: "Accès public (mode démo)", publicActive: "Actif", publicActiveBody: "L'accès public est activé. N'importe qui peut utiliser l'application sans se connecter. Tous les visiteurs obtiennent des autorisations de niveau gestionnaire.", disablePublic: "Désactiver l'accès public", disabling: "Désactivation...", publicInactiveBody: "Activez l'accès public pour permettre à quiconque d'utiliser l'application sans compte. Utile pour les démos et présentations. Tous les visiteurs obtiennent des autorisations de niveau gestionnaire et partagent la même identité.", enablePublic: "Activer l'accès public", enableWarning: "Cela permettra à quiconque d'accéder à l'application sans se connecter. Ils pourront créer, modifier et valider des documents. Votre compte administrateur nécessite toujours une connexion.", yesEnable: "Oui, activer", enabling: "Activation...", demoSpendTitle: "Dépenses démo" }, di = { Draft: "Brouillon", Open: "Ouvert", Submitted: "Validé", "To Deliver and Bill": "À livrer et facturer", "To Deliver": "À livrer", "To Bill": "À facturer", Completed: "Terminé", Ordered: "Commandé", Paid: "Payé", Unpaid: "Impayé", Cancelled: "Annulé", Overdue: "En retard", Return: "Retour", Closed: "Clôturé" }, mi = { balanced: "ÉQUILIBRÉ", imbalanced: "DÉSÉQUILIBRÉ", income: "Produits", expenses: "Charges", totalIncome: "Total des produits", totalExpenses: "Total des charges", netProfit: "Bénéfice", netLoss: "Perte", assets: "Actif", liabilities: "Passif", equity: "Capitaux propres", totalAssets: "Total de l'actif", totalLiabilities: "Total du passif", totalEquity: "Total des capitaux propres", totalLiabilitiesEquity: "Total passif + capitaux propres", current: "Non échu", noData: "Aucune donnée trouvée", noEntries: "Aucune écriture trouvée", noStockData: "Aucune donnée de stock trouvée", noReceivables: "Aucune créance en cours", noPayables: "Aucune dette en cours", noDocuments: "Aucun document trouvé" }, pi = { required: "Requis : {{fields}}", deleteConfirm: "Supprimer ce {{label}} ?", disabledNotice: "Ce {{label}} est désactivé. Il reste dans le système car d'autres enregistrements y font référence.", disabledOnDelete: "{{label}} {{name}} a été désactivé au lieu d'être supprimé car il est référencé par {{reason}}." }, hi = { Account: "Compte", Amount: "Montant", Balance: "Solde", Credit: "Crédit", Debit: "Débit", Date: "Date", Party: "Tiers", "Party Type": "Type de tiers", "Voucher Type": "Type de pièce", "Voucher No": "N° de pièce", Invoice: "Facture", Customer: "Client", Supplier: "Fournisseur", "Due Date": "Date d'échéance", Outstanding: "Encours", "Outstanding Amount": "Montant dû", "Item Code": "Code article", "Item Name": "Nom de l'article", Item: "Article", Warehouse: "Entrepôt", Qty: "Qté", "Valuation Rate": "Coût unitaire", "Stock Value": "Valeur du stock", Name: "Nom", Status: "Statut", Company: "Société", "From Date": "Date de début", "To Date": "Date de fin", "As of Date": "À la date", "Valid Till": "Valable jusqu'au", "Net Total": "Total net", Tax: "Taxe", "Grand Total": "Total TTC", "Notes / Terms": "Notes / Conditions", "Posting Date": "Date de comptabilisation", "Transaction Date": "Date de transaction", "Delivery Date": "Date de livraison", "% Delivered": "% livré", "% Billed": "% facturé", "Update Stock": "Mettre à jour le stock", "Payment Type": "Type de paiement", "Paid From": "Payé depuis", "Paid To": "Payé à", "Paid Amount": "Montant payé", Type: "Type", Total: "Total", Allocated: "Affecté", Unallocated: "Non affecté", Remark: "Remarque", "Total Debit": "Total débit", "Total Credit": "Total crédit", "Cost Center": "Centre de coûts", "Source Warehouse": "Entrepôt source", "Target Warehouse": "Entrepôt cible", Source: "Source", Target: "Cible", "Incoming Value": "Valeur entrante", "Outgoing Value": "Valeur sortante", Rate: "Prix unitaire", "Income Account": "Compte de produits", "Expense Account": "Compte de charges", Description: "Description", "Rate (%)": "Taux (%)", Mode: "Mode", Change: "Monnaie rendue", Currency: "Devise", Title: "Titre", Selling: "Vente", Buying: "Achat", "Discount %": "Remise %", "Discount Amt": "Montant remise", "Min Qty": "Qté min", "Valid From": "Valable à partir du", "Valid Upto": "Valable jusqu'au", Priority: "Priorité", Enabled: "Activé", "Fiscal Year": "Exercice", "Budget Amount": "Montant du budget", "If Exceeded": "Si dépassé", Month: "Mois", "Bank Account": "Compte bancaire", Deposit: "Dépôt", Withdrawal: "Retrait", "Reference No": "N° de référence", "Matched Type": "Type rapproché", "Matched Doc": "Pièce rapprochée", "Start Date": "Date de début", "End Date": "Date de fin", "Billing Interval": "Intervalle de facturation", "Current Period Start": "Début période actuelle", "Current Period End": "Fin période actuelle", "Plan Items": "Articles du plan", "Total Amount": "Montant total", "Stock Entry Type": "Type de mouvement de stock", "Rate Or Discount": "Prix ou remise", "Discount Percentage": "Pourcentage de remise", ID: "ID", "Customer Name": "Nom du client", "Customer Group": "Groupe de clients", Territory: "Territoire", "Credit Limit": "Limite de crédit", Email: "E-mail", Phone: "Téléphone", Address: "Adresse", City: "Ville", "Zip Code": "Code postal", Country: "Pays", "Tax ID": "N° de TVA", "Supplier Name": "Nom du fournisseur", "Supplier Group": "Groupe de fournisseurs", "Item Group": "Groupe d'articles", "Stock UOM": "Unité de stock", "Standard Rate": "Prix standard", "Warehouse Name": "Nom de l'entrepôt", "Company Name": "Nom de la société" }, gi = { items: "Lignes", taxes: "Taxes", references: "Références de paiement", accounts: "Écritures de compte", payments: "Paiements", plans: "Articles du plan", monthly_distribution: "Répartition mensuelle" }, yi = { "Create Sales Order": "Créer une commande client", "Create Sales Invoice": "Créer une facture de vente", "Create Delivery Note": "Créer un bon de livraison", "Create Purchase Invoice": "Créer une facture d'achat", "Create Purchase Receipt": "Créer un bon de réception", "Create Credit Note": "Créer un avoir", "Create Debit Note": "Créer une note de débit", "Create Return": "Créer un retour" }, fi = { totalRevenue: "Chiffre d'affaires total", outstandingReceivable: "Créances en cours", outstandingPayable: "Dettes en cours", totalStockValue: "Valeur totale du stock", recentDocuments: "Documents récents", noRecentDocuments: "Aucun document récent" }, bi = { title: "Chat Lambda ERP", subtitle: "Demandez-moi de créer des documents, de consulter des données ou d'exécuter des rapports.", s1: "Quels clients avons-nous ?", s2: "Affiche la balance comptable", s3: "Crée un devis pour 10 Bolt Pack M8", s4: "Liste toutes les factures impayées", loadOlder: "Charger les messages plus anciens", uploading: "Téléversement...", failed: "Échec", remove: "Supprimer", placeholderDemo: "Démo en direct en cours...", placeholderType: "Tapez un message...", placeholderConnecting: "Connexion...", attachTitle: "Joindre un fichier (PDF ou image, max 10 Mo)", creating: "Création du chat...", dropToAttach: "Déposez un fichier à joindre (images ou PDF, max 10 Mo chacun)", demoError: "Impossible de démarrer la démo" }, xi = /* @__PURE__ */ JSON.parse(`{"pageTitle":"Premiers pas avec Lambda ERP","intro":"Lambda ERP est un système ERP nativement IA, où toutes les fonctionnalités – comme créer des commandes, vérifier l'inventaire ou enregistrer des paiements – sont accessibles via une interface de chat. Il guide, raisonne et vérifie toutes vos tâches quotidiennes.","openChat":"Ouvrir le chat IA","tipLabel":"Astuce :","topTip":"Le chat IA peut aussi vous donner des liens directs vers des documents et des PDF téléchargeables. Demandez-lui simplement de créer ou de rechercher un document et il inclura des liens cliquables dans sa réponse.","manualIntro":"Si vous souhaitez comprendre pleinement le fonctionnement interne, ou préférez procéder manuellement, voici un cycle commercial complet étape par étape.","caTitle":"Analyses dynamiques – discutez pour obtenir n'importe quel graphique","caBadge":"Fonctionnalité phare","caBody":"Besoin d'un rapport que les modèles prédéfinis ne fournissent pas ? Décrivez-le simplement dans le chat. L'assistant appelle un modèle spécialiste du code qui écrit le rapport pour vous, l'exécute en direct sur vos données ERP et renvoie un lien partageable. Le graphique ou le tableau s'affiche en quelques secondes et est enregistré comme brouillon sous « Analyses personnalisées » dans la barre latérale – vous pouvez le rouvrir, partager l'URL avec vos collègues ou demander à l'assistant de l'affiner.","caTryAsking":"Essayez de demander (cliquez pour préremplir dans le chat) :","caPrompt1":"Montre-moi les 10 meilleurs clients par chiffre d'affaires cette année en diagramme à barres","caPrompt2":"Tendance mensuelle des achats par fournisseur sur tous les mois, étiquette l'axe des x avec le nom du fournisseur","caPrompt3":"Articles les plus vendus par quantité, avec un tableau et un graphique","caPrompt4":"Quels clients me doivent le plus en ce moment ?","caTryInChat":"Essayer dans le chat","caOpenWorkspace":"Ouvrir l'espace d'analyse","flowTitle":"Aperçu du flux des documents","salesCycle":"Cycle de vente","purchaseCycle":"Cycle d'achat","returns":"Retours","flowShortcut":"Raccourci : le devis peut ignorer la commande client et aller directement à la facture de vente ou au bon de livraison","legendStock":"impact stock","legendGl":"impact comptable","legendCash":"impact trésorerie","legendReversal":"annulation","lifecycleTitle":"Cycle de vie du document","lcDraftLabel":"Brouillon :","lcDraftDesc":"Modifiable. Aucun impact financier ni sur le stock.","lcSubmittedLabel":"Validé :","lcSubmittedDesc":"Verrouillé. Les écritures comptables et de stock sont générées.","lcCancelledLabel":"Annulé :","lcCancelledDesc":"Toutes les écritures sont inversées. Le document est archivé définitivement.","lcNoDelete":"Il n'y a pas de suppression. Pour annuler un brouillon : validez-le, puis annulez-le.","lcCorrect":"Pour corriger un document validé : annulez-le et créez-en un nouveau.","readyTitle":"Vous êtes prêt","readyBody1":"Vous comprenez maintenant le cycle complet. Un scénario réel typique ressemble à ceci : vous recevez une commande client (Devis → Commande client), vérifiez le stock, achetez ce dont vous avez besoin (Bon de commande → Bon de réception → Facture d'achat → Paiement), livrez au client (Bon de livraison), facturez-le (Facture de vente) et encaissez le paiement (Paiement). Si quelque chose revient, créez un avoir et un retour de bon de livraison pour inverser les finances et le stock. La Balance comptable confirme que tout est équilibré.","readyBody2":"Vous pouvez aussi tout faire via le chat IA en conversation naturelle – décrivez simplement ce dont vous avez besoin et il créera les bons documents pour vous.","chips":{"Quotation":"Devis","Sales Order":"Commande client","Delivery Note":"Bon de livraison","Sales Invoice":"Facture de vente","Payment Entry":"Paiement","Purchase Order":"Bon de commande","Purchase Receipt":"Bon de réception","Purchase Invoice":"Facture d'achat","Credit Note":"Avoir","DN Return":"Retour BL","Debit Note":"Note de débit","Draft":"Brouillon","Submitted":"Validé","Cancelled":"Annulé"},"links":{"Go to Setup":"Aller à la configuration","Customers":"Clients","Suppliers":"Fournisseurs","Items":"Articles","Warehouses":"Entrepôts","New Quotation":"Nouveau devis","View Quotations":"Voir les devis","Stock Balance":"Solde de stock","New Purchase Order":"Nouveau bon de commande","Purchase Receipts":"Bons de réception","Purchase Invoices":"Factures d'achat","Delivery Notes":"Bons de livraison","Sales Invoices":"Factures de vente","New Payment Entry":"Nouveau paiement","New Stock Entry":"Nouveau mouvement de stock","New Journal Entry":"Nouvelle écriture de journal","Profit & Loss":"Compte de résultat","Balance Sheet":"Bilan","AR Aging":"Balance âgée clients","AP Aging":"Balance âgée fournisseurs","Trial Balance":"Balance comptable","General Ledger":"Grand livre","Open AI Chat":"Ouvrir le chat IA"},"steps":{"1":{"title":"Configurer votre société","description":"Créez une société avec une devise de base. Cela génère votre plan comptable (30 comptes standard répartis entre Actif, Passif, Capitaux propres, Produits et Charges) ainsi qu'un centre de coûts par défaut. Vous pouvez aussi charger des données de démonstration avec des clients, fournisseurs et articles d'exemple pour démarrer rapidement."},"2":{"title":"Créer les données de base","description":"Avant de pouvoir effectuer des transactions, vous avez besoin de fiches de base. Créez au moins un client, un fournisseur, un article (avec un prix standard) et un entrepôt. Si vous avez chargé les données de démonstration à l'étape 1, elles existent déjà.","tip":"Les articles ont un prix standard qui se remplit automatiquement lorsque vous les ajoutez à des documents. Vous pouvez toujours modifier le prix par transaction."},"3":{"title":"Créer un devis","description":"Un devis est une offre non contraignante adressée à un client. Sélectionnez un client, ajoutez des lignes avec quantités et prix, éventuellement des lignes de taxe, puis enregistrez. Les devis n'ont aucun impact financier – ils ne créent ni écritures comptables ni mouvements de stock. Définissez une date de validité pour que l'offre expire automatiquement."},"4":{"title":"Valider et convertir en commande client","description":"Ouvrez votre devis enregistré et cliquez sur Valider pour le confirmer. Cliquez ensuite sur « Créer une commande client » pour le convertir. La commande client représente un engagement confirmé du client. Elle n'a toujours aucun impact financier, mais réserve du stock à des fins de planification.","tip":"Seuls les documents validés peuvent être convertis à l'étape suivante. Brouillon → Valider → Convertir est le flux standard. Pour les affaires rapides, vous pouvez ignorer la commande client et passer directement du devis à la facture de vente ou au bon de livraison."},"5":{"title":"Vérifier le stock avant l'exécution","description":"Avant de pouvoir livrer, vérifiez si vous avez réellement l'article en stock. Ouvrez le rapport Solde de stock et recherchez l'article. Si votre entrepôt affiche une quantité nulle, vous devrez d'abord approvisionner le stock – soit par un bon de commande (achat auprès d'un fournisseur), soit par un mouvement de stock (réception manuelle).","tip":"C'est un scénario courant dans la pratique : vous vendez quelque chose, puis réalisez que vous devez d'abord l'acheter. L'ERP gère les deux flux."},"6":{"title":"Cycle d'achat : acheter du stock à un fournisseur","description":"Si vous devez acheter du stock, vous avez deux chemins valides. Le chemin standard est Bon de commande → Bon de réception → Facture d'achat : utilisez-le lorsque les marchandises arrivent avant ou séparément de la facture du fournisseur. Si la facture et la réception arrivent ensemble, vous pouvez créer directement la facture d'achat et activer « Mettre à jour le stock » afin que le même document réceptionne le stock et enregistre la dette fournisseur.","tip":"Utilisez d'abord le bon de réception lorsque vous recevez les marchandises séparément. Utilisez la facture d'achat avec « Mettre à jour le stock » lorsqu'une seule étape doit à la fois réceptionner le stock et comptabiliser la facture fournisseur. Dans ce chemin direct, indiquez un entrepôt sur chaque ligne d'article en stock."},"7":{"title":"Créer un bon de livraison","description":"Maintenant que vous avez du stock, revenez à votre commande client validée et cliquez sur « Créer un bon de livraison ». Indiquez l'entrepôt sur chaque ligne d'article (d'où partent les marchandises), puis validez. Cela sort le stock de l'entrepôt – votre solde de stock diminue.","tip":"Le bon de livraison est le document d'expédition. Il réduit le stock mais ne crée pas de facture. Vous pouvez livrer et facturer séparément."},"8":{"title":"Créer et valider la facture de vente","description":"À partir de la commande client validée, créez une facture de vente. Lorsque vous validez la facture, des écritures comptables sont générées : les Clients (créances) sont débités (le client vous doit de l'argent) et les Produits des ventes crédités (revenu acquis). Si des taxes sont configurées, la TVA collectée est également créditée. Le montant dû indique ce que le client doit encore."},"9":{"title":"Enregistrer les paiements clients","description":"Créez un paiement pour enregistrer l'argent reçu du client. Définissez le type de paiement sur « Receive » (Recevoir), sélectionnez le client, indiquez le montant et affectez-le à la facture de vente. Vous pouvez effectuer des paiements partiels – le montant dû de la facture se met à jour en conséquence. Créez des paiements supplémentaires jusqu'à ce que la facture soit entièrement réglée.","tip":"Les paiements partiels sont courants. Une facture de 10 000 peut être payée 3 000 maintenant et 7 000 plus tard. Chaque paiement réduit le montant dû."},"10":{"title":"Mouvements de stock (inventaire manuel)","description":"Utilisez les mouvements de stock pour les mouvements d'inventaire non liés aux achats ou aux ventes. « Material Receipt » ajoute du stock (soldes d'ouverture, ajustements). « Material Issue » sort du stock (pertes, consommation interne). « Material Transfer » déplace du stock entre entrepôts. Chaque mouvement met à jour le livre de stock avec une valorisation au coût moyen pondéré.","tip":"Pour les marchandises achetées, utilisez des bons de réception plutôt que des mouvements de stock – ils sont liés au bon de commande et offrent une piste d'audit appropriée."},"11":{"title":"Écritures de journal","description":"Les écritures de journal sont des ajustements comptables manuels – charges à payer, corrections, reclassements, soldes d'ouverture. Chaque écriture doit avoir des débits et crédits équilibrés (total débit = total crédit). Utilisez-les lorsqu'aucun autre type de document ne convient."},"12":{"title":"Paiements des salaires","description":"Lambda ERP gère les salaires à l'aide des outils comptables existants. Comptabilisez d'abord la charge salariale : créez une écriture de journal qui débite la Charge salariale et crédite les Salaires à payer pour le montant total de la paie. Payez ensuite les employés : créez une autre écriture de journal (ou un paiement) qui débite les Salaires à payer et crédite votre compte bancaire. Ce processus en deux étapes garde vos comptes exacts – la charge est enregistrée dans la bonne période et la sortie de trésorerie est suivie séparément.","tip":"Vous pouvez demander à l'assistant IA de le faire pour vous : « Comptabilise 15 000 de salaires pour avril » suivi de « Paie les salaires d'avril depuis la banque ». Il créera automatiquement les bonnes écritures de journal."},"13":{"title":"Retours et avoirs","description":"Lorsqu'un client retourne des marchandises ou que vous devez émettre un avoir, créez un retour. Les retours utilisent le même type de document avec des quantités négatives. Ouvrez une facture de vente validée et créez un avoir (retour de facture de vente) – cela inverse les écritures comptables et réduit le montant dû de la facture d'origine. Pour le stock, créez un retour de bon de livraison pour réintégrer les marchandises en entrepôt. Côté achats, créez une note de débit (retour de facture d'achat) pour inverser une facture fournisseur, ou un retour de bon de réception pour renvoyer des marchandises.","tip":"Un avoir est simplement une facture de vente avec is_return=1 et des quantités négatives. La même logique comptable s'applique – les montants négatifs basculent automatiquement du bon côté débit/crédit. Pour un retour de vente complet, vous avez besoin à la fois d'un avoir (financier) et d'un retour de bon de livraison (stock)."},"14":{"title":"Exécuter les rapports","description":"Vérifiez vos comptes. Le Compte de résultat montre les produits face aux charges et le résultat net d'une période. Le Bilan montre votre situation financière (actif = passif + capitaux propres). La Balance âgée clients montre qui vous doit de l'argent et le retard. La Balance âgée fournisseurs montre ce que vous devez aux fournisseurs. La Balance comptable vérifie l'intégrité de la partie double. Le Grand livre montre chaque écriture individuelle. Le Solde de stock montre l'inventaire actuel."},"15":{"title":"Travailler en devises étrangères","description":"Vos comptes sont tenus dans une seule devise de base (choisie à la configuration de la société), mais vous pouvez effectuer des transactions dans n'importe quelle devise. Définissez une devise sur une facture ou un effet – ou attribuez une devise par défaut à un client ou un fournisseur – et le taux de change de cette date est recherché automatiquement et enregistré sur le document. Le document conserve ses montants dans sa propre devise, tandis que le Grand livre comptabilise toujours dans votre devise de base. Lorsque vous encaissez ou payez ultérieurement à un taux différent, le gain ou la perte de change réalisé est comptabilisé automatiquement sur un compte Gain/Perte de change. Vous pouvez même détenir un solde bancaire en devise étrangère et le convertir plus tard au taux de votre banque – l'écart par rapport à sa valeur comptable est alors réalisé. En fin de mois, vous pouvez réévaluer les soldes en devises ouverts au taux de clôture (un gain/perte latent qui s'inverse à la période suivante), et vous pouvez consulter n'importe quel état financier converti dans une autre devise pour l'affichage.","tip":"Le plus simple est de passer par le chat IA – essayez « Crée une facture de vente pour Lumiere Audio en EUR », « Montre-moi le bilan en EUR » ou « Quelle est notre exposition de change latente en fin de mois ? ». Les données de démonstration incluent déjà un client EUR (Lumiere Audio SARL) dont la facture a été encaissée à un taux différent, ainsi qu'une facture fournisseur EUR ouverte – ouvrez le Grand livre pour voir les écritures de change réalisées."}}}`), vi = {
|
|
6161
|
+
}, ni = { save: "Enregistrer", saving: "Enregistrement...", submit: "Valider", cancel: "Annuler", cancelDoc: "Annuler", delete: "Supprimer", edit: "Modifier", pdf: "PDF", addRow: "Ajouter une ligne", loading: "Chargement...", enable: "Activer", disable: "Désactiver", refresh: "Actualiser", refreshing: "Actualisation", areYouSure: "Êtes-vous sûr ?", all: "Tous", apply: "Appliquer", new: "Nouveau", prev: "Précédent", next: "Suivant", perPage: "Par page", page: "Page", of: "sur", showing: "Affichage", total: "Total", totals: "Totaux", errorOccurred: "Une erreur s'est produite" }, ai = { title: "Langue", help: "Choisissez la langue de l'interface. Votre choix est enregistré dans ce navigateur.", label: "Langue" }, ri = { logout: "Déconnexion", openMenu: "Ouvrir le menu", closeMenu: "Fermer le menu", new: "Nouveau : {{label}}" }, si = { dashboard: "Tableau de bord", setup: "Configuration de l'entreprise", tutorial: "Premiers pas", chat: "Chat", reports: "Rapports", "trial-balance": "Balance comptable", "general-ledger": "Grand livre", "stock-balance": "Solde de stock", "profit-and-loss": "Compte de résultat", "balance-sheet": "Bilan", "ar-aging": "Balance âgée clients", "ap-aging": "Balance âgée fournisseurs", analytics: "Analyses" }, ii = { quotation: { one: "Devis", other: "Devis" }, "sales-order": { one: "Commande client", other: "Commandes client" }, "sales-invoice": { one: "Facture de vente", other: "Factures de vente" }, "pos-invoice": { one: "Ticket de caisse", other: "Tickets de caisse" }, "purchase-order": { one: "Bon de commande", other: "Bons de commande" }, "purchase-invoice": { one: "Facture d'achat", other: "Factures d'achat" }, "payment-entry": { one: "Paiement", other: "Paiements" }, "journal-entry": { one: "Écriture comptable", other: "Écritures comptables" }, "bank-transaction": { one: "Transaction bancaire", other: "Transactions bancaires" }, budget: { one: "Budget", other: "Budgets" }, subscription: { one: "Abonnement", other: "Abonnements" }, "stock-entry": { one: "Mouvement de stock", other: "Mouvements de stock" }, "delivery-note": { one: "Bon de livraison", other: "Bons de livraison" }, "purchase-receipt": { one: "Bon de réception", other: "Bons de réception" }, "pricing-rule": { one: "Règle de prix", other: "Règles de prix" } }, li = { company: { one: "Société", other: "Sociétés" }, customer: { one: "Client", other: "Clients" }, supplier: { one: "Fournisseur", other: "Fournisseurs" }, item: { one: "Article", other: "Articles" }, warehouse: { one: "Entrepôt", other: "Entrepôts" } }, oi = { chats: "Discussions", newChat: "Nouvelle discussion", deleteChat: "Supprimer la discussion", customAnalytics: "Analyses personnalisées", newAnalytics: "Nouvelle analyse", deleteReport: "Supprimer le rapport", groups: { Introduction: "Introduction", Selling: "Ventes", Buying: "Achats", Accounting: "Comptabilité", Stock: "Stock", Reports: "Rapports", Masters: "Données de base", Settings: "Paramètres" }, items: { "Getting Started": "Premiers pas", "Company Setup": "Configuration de l'entreprise", "Opening Balances": "Soldes d'ouverture", Quotation: "Devis", "Sales Order": "Commande client", "Sales Invoice": "Facture de vente", "POS Invoice": "Ticket de caisse", "Purchase Order": "Bon de commande", "Purchase Invoice": "Facture d'achat", "Payment Entry": "Paiement", "Journal Entry": "Écriture comptable", "Bank Transaction": "Transaction bancaire", Budget: "Budget", Subscription: "Abonnement", "Stock Entry": "Mouvement de stock", "Delivery Note": "Bon de livraison", "Purchase Receipt": "Bon de réception", "Trial Balance": "Balance comptable", "Profit & Loss": "Compte de résultat", "Balance Sheet": "Bilan", "General Ledger": "Grand livre", "AR Aging": "Balance âgée clients", "AP Aging": "Balance âgée fournisseurs", Analytics: "Analyses", "Stock Balance": "Solde de stock", Company: "Société", Customer: "Client", Supplier: "Fournisseur", Item: "Article", Warehouse: "Entrepôt", General: "Général", "Pricing Rule": "Règle de prix", "Users & Team": "Utilisateurs et équipe" } }, ci = { taglineFirstRun: "Créez votre compte administrateur pour commencer", taglineRegister: "Créez votre compte", taglineSignIn: "Connectez-vous à votre compte", demoBanner: "Le mode démo est actif. Connectez-vous avec un compte administrateur pour gérer les paramètres ou désactiver l'accès public.", fullName: "Nom complet", email: "E-mail", password: "Mot de passe", confirmPassword: "Confirmer le mot de passe", createAdmin: "Créer un compte administrateur", register: "S'inscrire", signIn: "Se connecter", browsingTitle: "Simple visite ?", browsingBody: "Démarrez une nouvelle session de chat et regardez la démo en direct.", enterDemo: "Lancer la démo", haveInvite: "Vous avez une invitation ?", registerLink: "S'inscrire", alreadyHaveAccount: "Vous avez déjà un compte ?", signInLink: "Se connecter", passwordsNoMatch: "Les mots de passe ne correspondent pas", passwordTooShort: "Le mot de passe doit comporter au moins 6 caractères", registrationFailed: "Échec de l'inscription", loginFailed: "Échec de la connexion" }, di = { pdfTitle: "PDF et impression", pageSize: "Format de page", pdfHelp: "A4 est la norme internationale (210 x 297 mm). Letter est la norme aux États-Unis (8,5 x 11 po).", openingTitle: "Soldes d'ouverture", openingBody: "La page Soldes d'ouverture permet d'importer les soldes des comptes, le stock et les factures impayées d'un système précédent.", openingEnabled: "Actuellement activé — accessible sous Introduction > Soldes d'ouverture.", openingDisabled: "Actuellement désactivé — la page est masquée dans la barre latérale.", publicTitle: "Accès public (mode démo)", publicActive: "Actif", publicActiveBody: "L'accès public est activé. N'importe qui peut utiliser l'application sans se connecter. Tous les visiteurs obtiennent des autorisations de niveau gestionnaire.", disablePublic: "Désactiver l'accès public", disabling: "Désactivation...", publicInactiveBody: "Activez l'accès public pour permettre à quiconque d'utiliser l'application sans compte. Utile pour les démos et présentations. Tous les visiteurs obtiennent des autorisations de niveau gestionnaire et partagent la même identité.", enablePublic: "Activer l'accès public", enableWarning: "Cela permettra à quiconque d'accéder à l'application sans se connecter. Ils pourront créer, modifier et valider des documents. Votre compte administrateur nécessite toujours une connexion.", yesEnable: "Oui, activer", enabling: "Activation...", demoSpendTitle: "Dépenses démo" }, ui = { Draft: "Brouillon", Open: "Ouvert", Submitted: "Validé", "To Deliver and Bill": "À livrer et facturer", "To Deliver": "À livrer", "To Bill": "À facturer", Completed: "Terminé", Ordered: "Commandé", Paid: "Payé", Unpaid: "Impayé", Cancelled: "Annulé", Overdue: "En retard", Return: "Retour", Closed: "Clôturé" }, mi = { balanced: "ÉQUILIBRÉ", imbalanced: "DÉSÉQUILIBRÉ", income: "Produits", expenses: "Charges", totalIncome: "Total des produits", totalExpenses: "Total des charges", netProfit: "Bénéfice", netLoss: "Perte", assets: "Actif", liabilities: "Passif", equity: "Capitaux propres", totalAssets: "Total de l'actif", totalLiabilities: "Total du passif", totalEquity: "Total des capitaux propres", totalLiabilitiesEquity: "Total passif + capitaux propres", current: "Non échu", noData: "Aucune donnée trouvée", noEntries: "Aucune écriture trouvée", noStockData: "Aucune donnée de stock trouvée", noReceivables: "Aucune créance en cours", noPayables: "Aucune dette en cours", noDocuments: "Aucun document trouvé" }, pi = { required: "Requis : {{fields}}", deleteConfirm: "Supprimer ce {{label}} ?", disabledNotice: "Ce {{label}} est désactivé. Il reste dans le système car d'autres enregistrements y font référence.", disabledOnDelete: "{{label}} {{name}} a été désactivé au lieu d'être supprimé car il est référencé par {{reason}}." }, hi = { Account: "Compte", Amount: "Montant", Balance: "Solde", Credit: "Crédit", Debit: "Débit", Date: "Date", Party: "Tiers", "Party Type": "Type de tiers", "Voucher Type": "Type de pièce", "Voucher No": "N° de pièce", Invoice: "Facture", Customer: "Client", Supplier: "Fournisseur", "Due Date": "Date d'échéance", Outstanding: "Encours", "Outstanding Amount": "Montant dû", "Item Code": "Code article", "Item Name": "Nom de l'article", Item: "Article", Warehouse: "Entrepôt", Qty: "Qté", "Valuation Rate": "Coût unitaire", "Stock Value": "Valeur du stock", Name: "Nom", Status: "Statut", Company: "Société", "From Date": "Date de début", "To Date": "Date de fin", "As of Date": "À la date", "Valid Till": "Valable jusqu'au", "Net Total": "Total net", Tax: "Taxe", "Grand Total": "Total TTC", "Notes / Terms": "Notes / Conditions", "Posting Date": "Date de comptabilisation", "Transaction Date": "Date de transaction", "Delivery Date": "Date de livraison", "% Delivered": "% livré", "% Billed": "% facturé", "Update Stock": "Mettre à jour le stock", "Payment Type": "Type de paiement", "Paid From": "Payé depuis", "Paid To": "Payé à", "Paid Amount": "Montant payé", Type: "Type", Total: "Total", Allocated: "Affecté", Unallocated: "Non affecté", Remark: "Remarque", "Total Debit": "Total débit", "Total Credit": "Total crédit", "Cost Center": "Centre de coûts", "Source Warehouse": "Entrepôt source", "Target Warehouse": "Entrepôt cible", Source: "Source", Target: "Cible", "Incoming Value": "Valeur entrante", "Outgoing Value": "Valeur sortante", Rate: "Prix unitaire", "Income Account": "Compte de produits", "Expense Account": "Compte de charges", Description: "Description", "Rate (%)": "Taux (%)", Mode: "Mode", Change: "Monnaie rendue", Currency: "Devise", Title: "Titre", Selling: "Vente", Buying: "Achat", "Discount %": "Remise %", "Discount Amt": "Montant remise", "Min Qty": "Qté min", "Valid From": "Valable à partir du", "Valid Upto": "Valable jusqu'au", Priority: "Priorité", Enabled: "Activé", "Fiscal Year": "Exercice", "Budget Amount": "Montant du budget", "If Exceeded": "Si dépassé", Month: "Mois", "Bank Account": "Compte bancaire", Deposit: "Dépôt", Withdrawal: "Retrait", "Reference No": "N° de référence", "Matched Type": "Type rapproché", "Matched Doc": "Pièce rapprochée", "Start Date": "Date de début", "End Date": "Date de fin", "Billing Interval": "Intervalle de facturation", "Current Period Start": "Début période actuelle", "Current Period End": "Fin période actuelle", "Plan Items": "Articles du plan", "Total Amount": "Montant total", "Stock Entry Type": "Type de mouvement de stock", "Rate Or Discount": "Prix ou remise", "Discount Percentage": "Pourcentage de remise", ID: "ID", "Customer Name": "Nom du client", "Customer Group": "Groupe de clients", Territory: "Territoire", "Credit Limit": "Limite de crédit", Email: "E-mail", Phone: "Téléphone", Address: "Adresse", City: "Ville", "Zip Code": "Code postal", Country: "Pays", "Tax ID": "N° de TVA", "Supplier Name": "Nom du fournisseur", "Supplier Group": "Groupe de fournisseurs", "Item Group": "Groupe d'articles", "Stock UOM": "Unité de stock", "Standard Rate": "Prix standard", "Warehouse Name": "Nom de l'entrepôt", "Company Name": "Nom de la société" }, gi = { items: "Lignes", taxes: "Taxes", references: "Références de paiement", accounts: "Écritures de compte", payments: "Paiements", plans: "Articles du plan", monthly_distribution: "Répartition mensuelle" }, yi = { "Create Sales Order": "Créer une commande client", "Create Sales Invoice": "Créer une facture de vente", "Create Delivery Note": "Créer un bon de livraison", "Create Purchase Invoice": "Créer une facture d'achat", "Create Purchase Receipt": "Créer un bon de réception", "Create Credit Note": "Créer un avoir", "Create Debit Note": "Créer une note de débit", "Create Return": "Créer un retour" }, fi = { totalRevenue: "Chiffre d'affaires total", outstandingReceivable: "Créances en cours", outstandingPayable: "Dettes en cours", totalStockValue: "Valeur totale du stock", recentDocuments: "Documents récents", noRecentDocuments: "Aucun document récent" }, bi = { title: "Chat Lambda ERP", subtitle: "Demandez-moi de créer des documents, de consulter des données ou d'exécuter des rapports.", s1: "Quels clients avons-nous ?", s2: "Affiche la balance comptable", s3: "Crée un devis pour 10 Bolt Pack M8", s4: "Liste toutes les factures impayées", loadOlder: "Charger les messages plus anciens", uploading: "Téléversement...", failed: "Échec", remove: "Supprimer", placeholderDemo: "Démo en direct en cours...", placeholderType: "Tapez un message...", placeholderConnecting: "Connexion...", attachTitle: "Joindre un fichier (PDF ou image, max 10 Mo)", creating: "Création du chat...", dropToAttach: "Déposez un fichier à joindre (images ou PDF, max 10 Mo chacun)", demoError: "Impossible de démarrer la démo" }, xi = /* @__PURE__ */ JSON.parse(`{"pageTitle":"Premiers pas avec Lambda ERP","intro":"Lambda ERP est un système ERP nativement IA, où toutes les fonctionnalités – comme créer des commandes, vérifier l'inventaire ou enregistrer des paiements – sont accessibles via une interface de chat. Il guide, raisonne et vérifie toutes vos tâches quotidiennes.","openChat":"Ouvrir le chat IA","tipLabel":"Astuce :","topTip":"Le chat IA peut aussi vous donner des liens directs vers des documents et des PDF téléchargeables. Demandez-lui simplement de créer ou de rechercher un document et il inclura des liens cliquables dans sa réponse.","manualIntro":"Si vous souhaitez comprendre pleinement le fonctionnement interne, ou préférez procéder manuellement, voici un cycle commercial complet étape par étape.","caTitle":"Analyses dynamiques – discutez pour obtenir n'importe quel graphique","caBadge":"Fonctionnalité phare","caBody":"Besoin d'un rapport que les modèles prédéfinis ne fournissent pas ? Décrivez-le simplement dans le chat. L'assistant appelle un modèle spécialiste du code qui écrit le rapport pour vous, l'exécute en direct sur vos données ERP et renvoie un lien partageable. Le graphique ou le tableau s'affiche en quelques secondes et est enregistré comme brouillon sous « Analyses personnalisées » dans la barre latérale – vous pouvez le rouvrir, partager l'URL avec vos collègues ou demander à l'assistant de l'affiner.","caTryAsking":"Essayez de demander (cliquez pour préremplir dans le chat) :","caPrompt1":"Montre-moi les 10 meilleurs clients par chiffre d'affaires cette année en diagramme à barres","caPrompt2":"Tendance mensuelle des achats par fournisseur sur tous les mois, étiquette l'axe des x avec le nom du fournisseur","caPrompt3":"Articles les plus vendus par quantité, avec un tableau et un graphique","caPrompt4":"Quels clients me doivent le plus en ce moment ?","caTryInChat":"Essayer dans le chat","caOpenWorkspace":"Ouvrir l'espace d'analyse","flowTitle":"Aperçu du flux des documents","salesCycle":"Cycle de vente","purchaseCycle":"Cycle d'achat","returns":"Retours","flowShortcut":"Raccourci : le devis peut ignorer la commande client et aller directement à la facture de vente ou au bon de livraison","legendStock":"impact stock","legendGl":"impact comptable","legendCash":"impact trésorerie","legendReversal":"annulation","lifecycleTitle":"Cycle de vie du document","lcDraftLabel":"Brouillon :","lcDraftDesc":"Modifiable. Aucun impact financier ni sur le stock.","lcSubmittedLabel":"Validé :","lcSubmittedDesc":"Verrouillé. Les écritures comptables et de stock sont générées.","lcCancelledLabel":"Annulé :","lcCancelledDesc":"Toutes les écritures sont inversées. Le document est archivé définitivement.","lcNoDelete":"Il n'y a pas de suppression. Pour annuler un brouillon : validez-le, puis annulez-le.","lcCorrect":"Pour corriger un document validé : annulez-le et créez-en un nouveau.","readyTitle":"Vous êtes prêt","readyBody1":"Vous comprenez maintenant le cycle complet. Un scénario réel typique ressemble à ceci : vous recevez une commande client (Devis → Commande client), vérifiez le stock, achetez ce dont vous avez besoin (Bon de commande → Bon de réception → Facture d'achat → Paiement), livrez au client (Bon de livraison), facturez-le (Facture de vente) et encaissez le paiement (Paiement). Si quelque chose revient, créez un avoir et un retour de bon de livraison pour inverser les finances et le stock. La Balance comptable confirme que tout est équilibré.","readyBody2":"Vous pouvez aussi tout faire via le chat IA en conversation naturelle – décrivez simplement ce dont vous avez besoin et il créera les bons documents pour vous.","chips":{"Quotation":"Devis","Sales Order":"Commande client","Delivery Note":"Bon de livraison","Sales Invoice":"Facture de vente","Payment Entry":"Paiement","Purchase Order":"Bon de commande","Purchase Receipt":"Bon de réception","Purchase Invoice":"Facture d'achat","Credit Note":"Avoir","DN Return":"Retour BL","Debit Note":"Note de débit","Draft":"Brouillon","Submitted":"Validé","Cancelled":"Annulé"},"links":{"Go to Setup":"Aller à la configuration","Customers":"Clients","Suppliers":"Fournisseurs","Items":"Articles","Warehouses":"Entrepôts","New Quotation":"Nouveau devis","View Quotations":"Voir les devis","Stock Balance":"Solde de stock","New Purchase Order":"Nouveau bon de commande","Purchase Receipts":"Bons de réception","Purchase Invoices":"Factures d'achat","Delivery Notes":"Bons de livraison","Sales Invoices":"Factures de vente","New Payment Entry":"Nouveau paiement","New Stock Entry":"Nouveau mouvement de stock","New Journal Entry":"Nouvelle écriture de journal","Profit & Loss":"Compte de résultat","Balance Sheet":"Bilan","AR Aging":"Balance âgée clients","AP Aging":"Balance âgée fournisseurs","Trial Balance":"Balance comptable","General Ledger":"Grand livre","Open AI Chat":"Ouvrir le chat IA"},"steps":{"1":{"title":"Configurer votre société","description":"Créez une société avec une devise de base. Cela génère votre plan comptable (30 comptes standard répartis entre Actif, Passif, Capitaux propres, Produits et Charges) ainsi qu'un centre de coûts par défaut. Vous pouvez aussi charger des données de démonstration avec des clients, fournisseurs et articles d'exemple pour démarrer rapidement."},"2":{"title":"Créer les données de base","description":"Avant de pouvoir effectuer des transactions, vous avez besoin de fiches de base. Créez au moins un client, un fournisseur, un article (avec un prix standard) et un entrepôt. Si vous avez chargé les données de démonstration à l'étape 1, elles existent déjà.","tip":"Les articles ont un prix standard qui se remplit automatiquement lorsque vous les ajoutez à des documents. Vous pouvez toujours modifier le prix par transaction."},"3":{"title":"Créer un devis","description":"Un devis est une offre non contraignante adressée à un client. Sélectionnez un client, ajoutez des lignes avec quantités et prix, éventuellement des lignes de taxe, puis enregistrez. Les devis n'ont aucun impact financier – ils ne créent ni écritures comptables ni mouvements de stock. Définissez une date de validité pour que l'offre expire automatiquement."},"4":{"title":"Valider et convertir en commande client","description":"Ouvrez votre devis enregistré et cliquez sur Valider pour le confirmer. Cliquez ensuite sur « Créer une commande client » pour le convertir. La commande client représente un engagement confirmé du client. Elle n'a toujours aucun impact financier, mais réserve du stock à des fins de planification.","tip":"Seuls les documents validés peuvent être convertis à l'étape suivante. Brouillon → Valider → Convertir est le flux standard. Pour les affaires rapides, vous pouvez ignorer la commande client et passer directement du devis à la facture de vente ou au bon de livraison."},"5":{"title":"Vérifier le stock avant l'exécution","description":"Avant de pouvoir livrer, vérifiez si vous avez réellement l'article en stock. Ouvrez le rapport Solde de stock et recherchez l'article. Si votre entrepôt affiche une quantité nulle, vous devrez d'abord approvisionner le stock – soit par un bon de commande (achat auprès d'un fournisseur), soit par un mouvement de stock (réception manuelle).","tip":"C'est un scénario courant dans la pratique : vous vendez quelque chose, puis réalisez que vous devez d'abord l'acheter. L'ERP gère les deux flux."},"6":{"title":"Cycle d'achat : acheter du stock à un fournisseur","description":"Si vous devez acheter du stock, vous avez deux chemins valides. Le chemin standard est Bon de commande → Bon de réception → Facture d'achat : utilisez-le lorsque les marchandises arrivent avant ou séparément de la facture du fournisseur. Si la facture et la réception arrivent ensemble, vous pouvez créer directement la facture d'achat et activer « Mettre à jour le stock » afin que le même document réceptionne le stock et enregistre la dette fournisseur.","tip":"Utilisez d'abord le bon de réception lorsque vous recevez les marchandises séparément. Utilisez la facture d'achat avec « Mettre à jour le stock » lorsqu'une seule étape doit à la fois réceptionner le stock et comptabiliser la facture fournisseur. Dans ce chemin direct, indiquez un entrepôt sur chaque ligne d'article en stock."},"7":{"title":"Créer un bon de livraison","description":"Maintenant que vous avez du stock, revenez à votre commande client validée et cliquez sur « Créer un bon de livraison ». Indiquez l'entrepôt sur chaque ligne d'article (d'où partent les marchandises), puis validez. Cela sort le stock de l'entrepôt – votre solde de stock diminue.","tip":"Le bon de livraison est le document d'expédition. Il réduit le stock mais ne crée pas de facture. Vous pouvez livrer et facturer séparément."},"8":{"title":"Créer et valider la facture de vente","description":"À partir de la commande client validée, créez une facture de vente. Lorsque vous validez la facture, des écritures comptables sont générées : les Clients (créances) sont débités (le client vous doit de l'argent) et les Produits des ventes crédités (revenu acquis). Si des taxes sont configurées, la TVA collectée est également créditée. Le montant dû indique ce que le client doit encore."},"9":{"title":"Enregistrer les paiements clients","description":"Créez un paiement pour enregistrer l'argent reçu du client. Définissez le type de paiement sur « Receive » (Recevoir), sélectionnez le client, indiquez le montant et affectez-le à la facture de vente. Vous pouvez effectuer des paiements partiels – le montant dû de la facture se met à jour en conséquence. Créez des paiements supplémentaires jusqu'à ce que la facture soit entièrement réglée.","tip":"Les paiements partiels sont courants. Une facture de 10 000 peut être payée 3 000 maintenant et 7 000 plus tard. Chaque paiement réduit le montant dû."},"10":{"title":"Mouvements de stock (inventaire manuel)","description":"Utilisez les mouvements de stock pour les mouvements d'inventaire non liés aux achats ou aux ventes. « Material Receipt » ajoute du stock (soldes d'ouverture, ajustements). « Material Issue » sort du stock (pertes, consommation interne). « Material Transfer » déplace du stock entre entrepôts. Chaque mouvement met à jour le livre de stock avec une valorisation au coût moyen pondéré.","tip":"Pour les marchandises achetées, utilisez des bons de réception plutôt que des mouvements de stock – ils sont liés au bon de commande et offrent une piste d'audit appropriée."},"11":{"title":"Écritures de journal","description":"Les écritures de journal sont des ajustements comptables manuels – charges à payer, corrections, reclassements, soldes d'ouverture. Chaque écriture doit avoir des débits et crédits équilibrés (total débit = total crédit). Utilisez-les lorsqu'aucun autre type de document ne convient."},"12":{"title":"Paiements des salaires","description":"Lambda ERP gère les salaires à l'aide des outils comptables existants. Comptabilisez d'abord la charge salariale : créez une écriture de journal qui débite la Charge salariale et crédite les Salaires à payer pour le montant total de la paie. Payez ensuite les employés : créez une autre écriture de journal (ou un paiement) qui débite les Salaires à payer et crédite votre compte bancaire. Ce processus en deux étapes garde vos comptes exacts – la charge est enregistrée dans la bonne période et la sortie de trésorerie est suivie séparément.","tip":"Vous pouvez demander à l'assistant IA de le faire pour vous : « Comptabilise 15 000 de salaires pour avril » suivi de « Paie les salaires d'avril depuis la banque ». Il créera automatiquement les bonnes écritures de journal."},"13":{"title":"Retours et avoirs","description":"Lorsqu'un client retourne des marchandises ou que vous devez émettre un avoir, créez un retour. Les retours utilisent le même type de document avec des quantités négatives. Ouvrez une facture de vente validée et créez un avoir (retour de facture de vente) – cela inverse les écritures comptables et réduit le montant dû de la facture d'origine. Pour le stock, créez un retour de bon de livraison pour réintégrer les marchandises en entrepôt. Côté achats, créez une note de débit (retour de facture d'achat) pour inverser une facture fournisseur, ou un retour de bon de réception pour renvoyer des marchandises.","tip":"Un avoir est simplement une facture de vente avec is_return=1 et des quantités négatives. La même logique comptable s'applique – les montants négatifs basculent automatiquement du bon côté débit/crédit. Pour un retour de vente complet, vous avez besoin à la fois d'un avoir (financier) et d'un retour de bon de livraison (stock)."},"14":{"title":"Exécuter les rapports","description":"Vérifiez vos comptes. Le Compte de résultat montre les produits face aux charges et le résultat net d'une période. Le Bilan montre votre situation financière (actif = passif + capitaux propres). La Balance âgée clients montre qui vous doit de l'argent et le retard. La Balance âgée fournisseurs montre ce que vous devez aux fournisseurs. La Balance comptable vérifie l'intégrité de la partie double. Le Grand livre montre chaque écriture individuelle. Le Solde de stock montre l'inventaire actuel."},"15":{"title":"Travailler en devises étrangères","description":"Vos comptes sont tenus dans une seule devise de base (choisie à la configuration de la société), mais vous pouvez effectuer des transactions dans n'importe quelle devise. Définissez une devise sur une facture ou un effet – ou attribuez une devise par défaut à un client ou un fournisseur – et le taux de change de cette date est recherché automatiquement et enregistré sur le document. Le document conserve ses montants dans sa propre devise, tandis que le Grand livre comptabilise toujours dans votre devise de base. Lorsque vous encaissez ou payez ultérieurement à un taux différent, le gain ou la perte de change réalisé est comptabilisé automatiquement sur un compte Gain/Perte de change. Vous pouvez même détenir un solde bancaire en devise étrangère et le convertir plus tard au taux de votre banque – l'écart par rapport à sa valeur comptable est alors réalisé. En fin de mois, vous pouvez réévaluer les soldes en devises ouverts au taux de clôture (un gain/perte latent qui s'inverse à la période suivante), et vous pouvez consulter n'importe quel état financier converti dans une autre devise pour l'affichage.","tip":"Le plus simple est de passer par le chat IA – essayez « Crée une facture de vente pour Lumiere Audio en EUR », « Montre-moi le bilan en EUR » ou « Quelle est notre exposition de change latente en fin de mois ? ». Les données de démonstration incluent déjà un client EUR (Lumiere Audio SARL) dont la facture a été encaissée à un taux différent, ainsi qu'une facture fournisseur EUR ouverte – ouvrez le Grand livre pour voir les écritures de change réalisées."}}}`), vi = {
|
|
6148
6162
|
common: ni,
|
|
6149
6163
|
language: ai,
|
|
6150
6164
|
header: ri,
|
|
@@ -6153,8 +6167,8 @@ const bs = { save: "Save", saving: "Saving...", submit: "Submit", cancel: "Cance
|
|
|
6153
6167
|
masters: li,
|
|
6154
6168
|
nav: oi,
|
|
6155
6169
|
login: ci,
|
|
6156
|
-
settings:
|
|
6157
|
-
status:
|
|
6170
|
+
settings: di,
|
|
6171
|
+
status: ui,
|
|
6158
6172
|
reports: mi,
|
|
6159
6173
|
masterForm: pi,
|
|
6160
6174
|
fields: hi,
|
|
@@ -6226,12 +6240,12 @@ function Ze(t) {
|
|
|
6226
6240
|
}
|
|
6227
6241
|
function Ci() {
|
|
6228
6242
|
var I, L;
|
|
6229
|
-
const { t } = Z(), [n, a] = N("1h"), { data: s, isLoading: l, isFetching: i, error: c, refetch: o, dataUpdatedAt:
|
|
6243
|
+
const { t } = Z(), [n, a] = N("1h"), { data: s, isLoading: l, isFetching: i, error: c, refetch: o, dataUpdatedAt: m } = ie({
|
|
6230
6244
|
queryKey: ["demo-spend"],
|
|
6231
6245
|
queryFn: () => O.getDemoSpend(),
|
|
6232
6246
|
// Refresh once a minute — demo spend changes slowly; no need to poll harder.
|
|
6233
6247
|
refetchInterval: 6e4
|
|
6234
|
-
}),
|
|
6248
|
+
}), d = Tn.find((C) => C.value === n), u = (I = s == null ? void 0 : s.windows) == null ? void 0 : I[n], p = ((L = s == null ? void 0 : s.caps) == null ? void 0 : L.global_hourly_usd) ?? 0, v = u ? u.demo_usd / d.hours : 0, w = u ? u.total_usd / d.hours : 0, g = p > 0 ? Math.min(100, v / p * 100) : 0, y = g >= 90 ? "bg-red-500" : g >= 60 ? "bg-amber-500" : "bg-emerald-500";
|
|
6235
6249
|
return /* @__PURE__ */ r(V, { title: t("settings.demoSpendTitle"), children: [
|
|
6236
6250
|
/* @__PURE__ */ r("div", { className: "flex flex-wrap items-end justify-between gap-4", children: [
|
|
6237
6251
|
/* @__PURE__ */ r("div", { className: "max-w-lg text-sm text-gray-600", children: [
|
|
@@ -6259,7 +6273,7 @@ function Ci() {
|
|
|
6259
6273
|
type: "button",
|
|
6260
6274
|
onClick: () => o(),
|
|
6261
6275
|
disabled: i,
|
|
6262
|
-
title:
|
|
6276
|
+
title: m ? `Last updated ${new Date(m).toLocaleTimeString()}` : "Refresh now",
|
|
6263
6277
|
className: "inline-flex h-[38px] items-center gap-1.5 rounded-md border border-gray-300 bg-white px-3 text-sm font-medium text-gray-700 shadow-sm hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-60",
|
|
6264
6278
|
children: [
|
|
6265
6279
|
/* @__PURE__ */ e(
|
|
@@ -6290,13 +6304,13 @@ function Ci() {
|
|
|
6290
6304
|
"Failed to load spend data: ",
|
|
6291
6305
|
c.message
|
|
6292
6306
|
] }),
|
|
6293
|
-
|
|
6307
|
+
u && /* @__PURE__ */ r("div", { className: "mt-5 space-y-5", children: [
|
|
6294
6308
|
/* @__PURE__ */ r("div", { children: [
|
|
6295
6309
|
/* @__PURE__ */ r("div", { className: "flex items-baseline justify-between", children: [
|
|
6296
6310
|
/* @__PURE__ */ r("div", { children: [
|
|
6297
6311
|
/* @__PURE__ */ r("div", { className: "text-xs font-medium uppercase tracking-wide text-gray-500", children: [
|
|
6298
6312
|
"Demo spend (avg/hr over ",
|
|
6299
|
-
|
|
6313
|
+
d.label.toLowerCase(),
|
|
6300
6314
|
")"
|
|
6301
6315
|
] }),
|
|
6302
6316
|
/* @__PURE__ */ r("div", { className: "mt-1 text-2xl font-semibold text-gray-900", children: [
|
|
@@ -6311,7 +6325,7 @@ function Ci() {
|
|
|
6311
6325
|
/* @__PURE__ */ r("div", { className: "text-right", children: [
|
|
6312
6326
|
/* @__PURE__ */ e("div", { className: "text-xs font-medium uppercase tracking-wide text-gray-500", children: "Total (all roles)" }),
|
|
6313
6327
|
/* @__PURE__ */ r("div", { className: "mt-1 text-lg font-semibold text-gray-700", children: [
|
|
6314
|
-
Ze(
|
|
6328
|
+
Ze(u.total_usd),
|
|
6315
6329
|
/* @__PURE__ */ r("span", { className: "ml-1 text-xs font-normal text-gray-500", children: [
|
|
6316
6330
|
"(",
|
|
6317
6331
|
Ze(w),
|
|
@@ -6328,18 +6342,18 @@ function Ci() {
|
|
|
6328
6342
|
] })
|
|
6329
6343
|
] }),
|
|
6330
6344
|
/* @__PURE__ */ r("div", { className: "grid grid-cols-2 gap-3 sm:grid-cols-4", children: [
|
|
6331
|
-
/* @__PURE__ */ e(ft, { label: "Demo spend", value: Ze(
|
|
6332
|
-
/* @__PURE__ */ e(ft, { label: "Calls", value:
|
|
6333
|
-
/* @__PURE__ */ e(ft, { label: "Unique IPs", value:
|
|
6345
|
+
/* @__PURE__ */ e(ft, { label: "Demo spend", value: Ze(u.demo_usd) }),
|
|
6346
|
+
/* @__PURE__ */ e(ft, { label: "Calls", value: u.call_count.toLocaleString() }),
|
|
6347
|
+
/* @__PURE__ */ e(ft, { label: "Unique IPs", value: u.unique_ips.toLocaleString() }),
|
|
6334
6348
|
/* @__PURE__ */ e(
|
|
6335
6349
|
ft,
|
|
6336
6350
|
{
|
|
6337
6351
|
label: "Tokens (in/out)",
|
|
6338
|
-
value: `${
|
|
6352
|
+
value: `${u.prompt_tokens.toLocaleString()} / ${u.completion_tokens.toLocaleString()}`
|
|
6339
6353
|
}
|
|
6340
6354
|
)
|
|
6341
6355
|
] }),
|
|
6342
|
-
Object.keys(
|
|
6356
|
+
Object.keys(u.by_provider).length > 0 && /* @__PURE__ */ r("div", { children: [
|
|
6343
6357
|
/* @__PURE__ */ e("div", { className: "mb-2 text-xs font-medium uppercase tracking-wide text-gray-500", children: "By provider" }),
|
|
6344
6358
|
/* @__PURE__ */ e("div", { className: "overflow-hidden rounded-md border border-gray-200", children: /* @__PURE__ */ r("table", { className: "w-full text-sm", children: [
|
|
6345
6359
|
/* @__PURE__ */ e("thead", { className: "bg-gray-50 text-xs uppercase tracking-wide text-gray-500", children: /* @__PURE__ */ r("tr", { children: [
|
|
@@ -6349,7 +6363,7 @@ function Ci() {
|
|
|
6349
6363
|
/* @__PURE__ */ e("th", { className: "px-3 py-2 text-right font-medium", children: "Prompt tok" }),
|
|
6350
6364
|
/* @__PURE__ */ e("th", { className: "px-3 py-2 text-right font-medium", children: "Completion tok" })
|
|
6351
6365
|
] }) }),
|
|
6352
|
-
/* @__PURE__ */ e("tbody", { className: "divide-y divide-gray-100", children: Object.entries(
|
|
6366
|
+
/* @__PURE__ */ e("tbody", { className: "divide-y divide-gray-100", children: Object.entries(u.by_provider).map(([C, b]) => /* @__PURE__ */ r("tr", { children: [
|
|
6353
6367
|
/* @__PURE__ */ e("td", { className: "px-3 py-2 font-medium text-gray-900", children: C }),
|
|
6354
6368
|
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right tabular-nums", children: Ze(b.cost_usd) }),
|
|
6355
6369
|
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right tabular-nums", children: b.call_count.toLocaleString() }),
|
|
@@ -6394,10 +6408,10 @@ function Di() {
|
|
|
6394
6408
|
}), { data: o } = ie({
|
|
6395
6409
|
queryKey: ["public-manager"],
|
|
6396
6410
|
queryFn: () => O.getPublicManagerStatus()
|
|
6397
|
-
}), [
|
|
6411
|
+
}), [m, d] = N(!1), u = me({
|
|
6398
6412
|
mutationFn: () => O.createPublicManager(),
|
|
6399
6413
|
onSuccess: () => {
|
|
6400
|
-
a.invalidateQueries({ queryKey: ["public-manager"] }),
|
|
6414
|
+
a.invalidateQueries({ queryKey: ["public-manager"] }), d(!1);
|
|
6401
6415
|
}
|
|
6402
6416
|
}), p = me({
|
|
6403
6417
|
mutationFn: () => O.removePublicManager(),
|
|
@@ -6456,23 +6470,23 @@ function Di() {
|
|
|
6456
6470
|
)
|
|
6457
6471
|
] }) : /* @__PURE__ */ r("div", { children: [
|
|
6458
6472
|
/* @__PURE__ */ e("p", { className: "text-sm text-gray-600", children: n("settings.publicInactiveBody") }),
|
|
6459
|
-
|
|
6473
|
+
m ? /* @__PURE__ */ r("div", { className: "mt-3 rounded-lg border border-red-200 bg-red-50 p-4", children: [
|
|
6460
6474
|
/* @__PURE__ */ e("p", { className: "text-sm font-medium text-red-800", children: n("common.areYouSure") }),
|
|
6461
6475
|
/* @__PURE__ */ e("p", { className: "mt-1 text-xs text-red-600", children: n("settings.enableWarning") }),
|
|
6462
6476
|
/* @__PURE__ */ r("div", { className: "mt-3 flex gap-2", children: [
|
|
6463
6477
|
/* @__PURE__ */ e(
|
|
6464
6478
|
"button",
|
|
6465
6479
|
{
|
|
6466
|
-
onClick: () =>
|
|
6467
|
-
disabled:
|
|
6480
|
+
onClick: () => u.mutate(),
|
|
6481
|
+
disabled: u.isPending,
|
|
6468
6482
|
className: "rounded-lg bg-red-600 px-4 py-1.5 text-sm font-medium text-white hover:bg-red-700",
|
|
6469
|
-
children:
|
|
6483
|
+
children: u.isPending ? n("settings.enabling") : n("settings.yesEnable")
|
|
6470
6484
|
}
|
|
6471
6485
|
),
|
|
6472
6486
|
/* @__PURE__ */ e(
|
|
6473
6487
|
"button",
|
|
6474
6488
|
{
|
|
6475
|
-
onClick: () =>
|
|
6489
|
+
onClick: () => d(!1),
|
|
6476
6490
|
className: "rounded-lg bg-white px-4 py-1.5 text-sm font-medium text-gray-700 hover:bg-gray-50 border border-gray-300",
|
|
6477
6491
|
children: n("common.cancel")
|
|
6478
6492
|
}
|
|
@@ -6481,7 +6495,7 @@ function Di() {
|
|
|
6481
6495
|
] }) : /* @__PURE__ */ e(
|
|
6482
6496
|
"button",
|
|
6483
6497
|
{
|
|
6484
|
-
onClick: () =>
|
|
6498
|
+
onClick: () => d(!0),
|
|
6485
6499
|
className: "mt-3 rounded-lg bg-red-600 px-4 py-2 text-sm font-medium text-white hover:bg-red-700",
|
|
6486
6500
|
children: n("settings.enablePublic")
|
|
6487
6501
|
}
|
|
@@ -6565,7 +6579,7 @@ function Zi(t = {}) {
|
|
|
6565
6579
|
const n = t.rootElement ?? document.getElementById("root");
|
|
6566
6580
|
if (!n)
|
|
6567
6581
|
throw new Error('bootstrap: no mount element (pass rootElement or add <div id="root">)');
|
|
6568
|
-
const a = t.queryClient ?? Ii(), s =
|
|
6582
|
+
const a = t.queryClient ?? Ii(), s = ua(Ri());
|
|
6569
6583
|
ia(n).render(
|
|
6570
6584
|
/* @__PURE__ */ e(sa, { children: /* @__PURE__ */ e(la, { client: a, children: /* @__PURE__ */ e(Ea, { children: /* @__PURE__ */ e(ma, { router: s }) }) }) })
|
|
6571
6585
|
);
|