@lambda-development/erp-core 0.1.7 → 0.1.9
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 +392 -372
- 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" }),
|
|
@@ -1077,22 +1077,28 @@ function Ua({ group: t }) {
|
|
|
1077
1077
|
]
|
|
1078
1078
|
}
|
|
1079
1079
|
),
|
|
1080
|
-
n && /* @__PURE__ */ e("ul", { className: "mb-1", children: t.items.map((o) =>
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1080
|
+
n && /* @__PURE__ */ e("ul", { className: "mb-1", children: t.items.map((o) => {
|
|
1081
|
+
const m = t.items.some(
|
|
1082
|
+
(d) => d.path !== o.path && d.path.startsWith(o.path + "/")
|
|
1083
|
+
);
|
|
1084
|
+
return /* @__PURE__ */ e("li", { className: "relative", children: /* @__PURE__ */ e(
|
|
1085
|
+
kt,
|
|
1086
|
+
{
|
|
1087
|
+
to: o.path,
|
|
1088
|
+
end: m,
|
|
1089
|
+
className: ({ isActive: d }) => De(
|
|
1090
|
+
"relative block px-4 py-1.5 pl-10 text-sm transition-all duration-300",
|
|
1091
|
+
!d && "text-fg-muted hover:bg-surface-subtle hover:text-fg",
|
|
1092
|
+
d && "bg-surface-subtle font-medium text-fg",
|
|
1093
|
+
(l == null ? void 0 : l.group) === t.label && (l == null ? void 0 : l.item) === o.label && c
|
|
1094
|
+
),
|
|
1095
|
+
children: ({ isActive: d }) => /* @__PURE__ */ r(Ne, { children: [
|
|
1096
|
+
d && /* @__PURE__ */ e(Yt, {}),
|
|
1097
|
+
s(`nav.items.${o.label}`, { defaultValue: o.label })
|
|
1098
|
+
] })
|
|
1099
|
+
}
|
|
1100
|
+
) }, o.path);
|
|
1101
|
+
}) })
|
|
1096
1102
|
] });
|
|
1097
1103
|
}
|
|
1098
1104
|
const Ga = {
|
|
@@ -1108,16 +1114,14 @@ function ja({ isMobileOpen: t = !1, onClose: n }) {
|
|
|
1108
1114
|
queryKey: ["setup-status"],
|
|
1109
1115
|
queryFn: () => O.setupStatus(),
|
|
1110
1116
|
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]);
|
|
1117
|
+
}), 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) => ({
|
|
1118
|
+
...d,
|
|
1119
|
+
items: d.items.filter((u) => {
|
|
1120
|
+
if (u.path === "/setup" && (s != null && s.setup_complete)) return !1;
|
|
1121
|
+
const p = Ga[u.path];
|
|
1122
|
+
return !p || !a ? !0 : a[p] !== "0";
|
|
1123
|
+
})
|
|
1124
|
+
})), [a, s]);
|
|
1121
1125
|
return /* @__PURE__ */ r(
|
|
1122
1126
|
"aside",
|
|
1123
1127
|
{
|
|
@@ -1163,7 +1167,7 @@ function ja({ isMobileOpen: t = !1, onClose: n }) {
|
|
|
1163
1167
|
/* @__PURE__ */ r("nav", { className: "flex-1 overflow-y-auto py-3", children: [
|
|
1164
1168
|
/* @__PURE__ */ e($a, {}),
|
|
1165
1169
|
/* @__PURE__ */ e(Va, {}),
|
|
1166
|
-
c.map((
|
|
1170
|
+
c.map((m) => /* @__PURE__ */ e(Ua, { group: m }, m.label))
|
|
1167
1171
|
] })
|
|
1168
1172
|
]
|
|
1169
1173
|
}
|
|
@@ -1193,11 +1197,11 @@ function Ka() {
|
|
|
1193
1197
|
return /* @__PURE__ */ e(za, { children: /* @__PURE__ */ e(Qa, {}) });
|
|
1194
1198
|
}
|
|
1195
1199
|
function Qa() {
|
|
1196
|
-
const { pathname: t } =
|
|
1200
|
+
const { pathname: t } = dt(), { user: n, logout: a } = mt(), { navigationFlash: s } = tt(), { t: l } = Z(), i = Wa(t, l), [c, o] = N(!1);
|
|
1197
1201
|
re(() => {
|
|
1198
1202
|
o(!1);
|
|
1199
1203
|
}, [t]);
|
|
1200
|
-
const
|
|
1204
|
+
const m = s ? Jt[s.group] : null;
|
|
1201
1205
|
return /* @__PURE__ */ r("div", { className: "flex h-dvh bg-surface-muted", children: [
|
|
1202
1206
|
/* @__PURE__ */ e(ja, { isMobileOpen: c, onClose: () => o(!1) }),
|
|
1203
1207
|
c && /* @__PURE__ */ e(
|
|
@@ -1217,7 +1221,7 @@ function Qa() {
|
|
|
1217
1221
|
onClick: () => o(!0),
|
|
1218
1222
|
className: De(
|
|
1219
1223
|
"rounded p-1 text-gray-500 transition-all duration-300 hover:bg-gray-100 hover:text-gray-900 md:hidden",
|
|
1220
|
-
|
|
1224
|
+
m
|
|
1221
1225
|
),
|
|
1222
1226
|
"aria-label": l("header.openMenu"),
|
|
1223
1227
|
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 +1250,7 @@ function Qa() {
|
|
|
1246
1250
|
}
|
|
1247
1251
|
function Ha({ children: t }) {
|
|
1248
1252
|
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(
|
|
1253
|
+
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
1254
|
}
|
|
1251
1255
|
function V({ title: t, children: n, className: a, interactive: s }) {
|
|
1252
1256
|
return /* @__PURE__ */ r(
|
|
@@ -1476,9 +1480,9 @@ function J(t, n) {
|
|
|
1476
1480
|
const c = we(
|
|
1477
1481
|
(o) => {
|
|
1478
1482
|
s(
|
|
1479
|
-
(
|
|
1480
|
-
const
|
|
1481
|
-
return o === n || o === "" || o == null ?
|
|
1483
|
+
(m) => {
|
|
1484
|
+
const d = new URLSearchParams(m);
|
|
1485
|
+
return o === n || o === "" || o == null ? d.delete(t) : d.set(t, String(o)), d;
|
|
1482
1486
|
},
|
|
1483
1487
|
{ replace: !0 }
|
|
1484
1488
|
);
|
|
@@ -2234,9 +2238,9 @@ function Ke({ label: t, options: n, value: a, onChange: s, className: l, require
|
|
|
2234
2238
|
),
|
|
2235
2239
|
children: [
|
|
2236
2240
|
/* @__PURE__ */ e("option", { value: "", children: "Select..." }),
|
|
2237
|
-
n.map((
|
|
2238
|
-
const { value:
|
|
2239
|
-
return /* @__PURE__ */ e("option", { value:
|
|
2241
|
+
n.map((m) => {
|
|
2242
|
+
const { value: d, label: u } = sr(m);
|
|
2243
|
+
return /* @__PURE__ */ e("option", { value: d, children: u }, d);
|
|
2240
2244
|
})
|
|
2241
2245
|
]
|
|
2242
2246
|
}
|
|
@@ -2287,14 +2291,14 @@ function cr({ label: t, hint: n }) {
|
|
|
2287
2291
|
n && /* @__PURE__ */ e(ir, { text: n })
|
|
2288
2292
|
] });
|
|
2289
2293
|
}
|
|
2290
|
-
function
|
|
2294
|
+
function dr({
|
|
2291
2295
|
field: t,
|
|
2292
2296
|
value: n,
|
|
2293
2297
|
onChange: a,
|
|
2294
2298
|
disabled: s,
|
|
2295
2299
|
hideLabel: l
|
|
2296
2300
|
}) {
|
|
2297
|
-
const [i, c] = N(n ?? ""), [o,
|
|
2301
|
+
const [i, c] = N(n ?? ""), [o, m] = N(!1), { data: d } = ie({
|
|
2298
2302
|
queryKey: ["link-search", t.linkDoctype, i],
|
|
2299
2303
|
queryFn: () => O.searchLink(t.linkDoctype, i),
|
|
2300
2304
|
enabled: !!t.linkDoctype && o
|
|
@@ -2310,23 +2314,23 @@ function ur({
|
|
|
2310
2314
|
{
|
|
2311
2315
|
label: l ? void 0 : t.label,
|
|
2312
2316
|
value: i,
|
|
2313
|
-
onChange: (
|
|
2314
|
-
c(
|
|
2317
|
+
onChange: (u) => {
|
|
2318
|
+
c(u.target.value), m(!0);
|
|
2315
2319
|
},
|
|
2316
|
-
onFocus: () =>
|
|
2317
|
-
onBlur: () => setTimeout(() =>
|
|
2320
|
+
onFocus: () => m(!0),
|
|
2321
|
+
onBlur: () => setTimeout(() => m(!1), 200)
|
|
2318
2322
|
}
|
|
2319
2323
|
),
|
|
2320
|
-
o &&
|
|
2324
|
+
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
2325
|
"li",
|
|
2322
2326
|
{
|
|
2323
2327
|
className: "cursor-pointer px-3 py-2 text-sm text-fg transition-colors hover:bg-surface-subtle",
|
|
2324
2328
|
onMouseDown: () => {
|
|
2325
|
-
a(
|
|
2329
|
+
a(u.name), c(u.name), m(!1);
|
|
2326
2330
|
},
|
|
2327
|
-
children:
|
|
2331
|
+
children: u.name
|
|
2328
2332
|
},
|
|
2329
|
-
|
|
2333
|
+
u.name
|
|
2330
2334
|
)) })
|
|
2331
2335
|
] });
|
|
2332
2336
|
}
|
|
@@ -2340,13 +2344,13 @@ function Vt({
|
|
|
2340
2344
|
currency: c = "USD"
|
|
2341
2345
|
}) {
|
|
2342
2346
|
var w;
|
|
2343
|
-
const { t: o } = Z(),
|
|
2344
|
-
if (
|
|
2347
|
+
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);
|
|
2348
|
+
if (m) {
|
|
2345
2349
|
if (t.type === "link" && n) {
|
|
2346
2350
|
const y = t.linkDoctypeField && l ? String(l[t.linkDoctypeField] ?? "").toLowerCase().replace(/\s+/g, "-") : t.linkDoctype, I = $t(y, String(n));
|
|
2347
2351
|
if (I)
|
|
2348
2352
|
return /* @__PURE__ */ r("div", { children: [
|
|
2349
|
-
/* @__PURE__ */ e(
|
|
2353
|
+
/* @__PURE__ */ e(d, {}),
|
|
2350
2354
|
/* @__PURE__ */ e("p", { className: i ? "text-sm" : "py-2 text-sm", children: /* @__PURE__ */ e(
|
|
2351
2355
|
ye,
|
|
2352
2356
|
{
|
|
@@ -2359,30 +2363,30 @@ function Vt({
|
|
|
2359
2363
|
}
|
|
2360
2364
|
let g = n ?? "-";
|
|
2361
2365
|
return t.type === "currency" && typeof n == "number" && (g = Le(n, c)), /* @__PURE__ */ r("div", { children: [
|
|
2362
|
-
/* @__PURE__ */ e(
|
|
2366
|
+
/* @__PURE__ */ e(d, {}),
|
|
2363
2367
|
/* @__PURE__ */ e("p", { className: i ? "text-sm text-fg" : "py-2 text-sm text-fg", children: g })
|
|
2364
2368
|
] });
|
|
2365
2369
|
}
|
|
2366
2370
|
if (t.type === "link") {
|
|
2367
2371
|
const g = t.linkDoctypeField && l ? { ...t, linkDoctype: (w = l[t.linkDoctypeField]) == null ? void 0 : w.toLowerCase().replace(/\s+/g, "-") } : t;
|
|
2368
2372
|
return /* @__PURE__ */ r("div", { children: [
|
|
2369
|
-
/* @__PURE__ */ e(
|
|
2373
|
+
/* @__PURE__ */ e(d, {}),
|
|
2370
2374
|
/* @__PURE__ */ e(
|
|
2371
|
-
|
|
2375
|
+
dr,
|
|
2372
2376
|
{
|
|
2373
2377
|
field: g,
|
|
2374
2378
|
value: n ?? "",
|
|
2375
2379
|
onChange: a,
|
|
2376
|
-
disabled:
|
|
2380
|
+
disabled: m,
|
|
2377
2381
|
hideLabel: !0
|
|
2378
2382
|
}
|
|
2379
2383
|
)
|
|
2380
2384
|
] });
|
|
2381
2385
|
}
|
|
2382
|
-
if (t.type === "select" && (t.options ||
|
|
2383
|
-
const g =
|
|
2386
|
+
if (t.type === "select" && (t.options || u)) {
|
|
2387
|
+
const g = u ? n && !p.includes(n) ? [n, ...p] : p : t.options;
|
|
2384
2388
|
return /* @__PURE__ */ r("div", { children: [
|
|
2385
|
-
/* @__PURE__ */ e(
|
|
2389
|
+
/* @__PURE__ */ e(d, {}),
|
|
2386
2390
|
/* @__PURE__ */ e(
|
|
2387
2391
|
Ke,
|
|
2388
2392
|
{
|
|
@@ -2395,7 +2399,7 @@ function Vt({
|
|
|
2395
2399
|
}
|
|
2396
2400
|
if (t.type === "textarea")
|
|
2397
2401
|
return /* @__PURE__ */ r("div", { children: [
|
|
2398
|
-
/* @__PURE__ */ e(
|
|
2402
|
+
/* @__PURE__ */ e(d, {}),
|
|
2399
2403
|
/* @__PURE__ */ e(
|
|
2400
2404
|
"textarea",
|
|
2401
2405
|
{
|
|
@@ -2408,7 +2412,7 @@ function Vt({
|
|
|
2408
2412
|
] });
|
|
2409
2413
|
const v = t.type === "number" || t.type === "currency" ? "number" : t.type === "date" ? "date" : "text";
|
|
2410
2414
|
return /* @__PURE__ */ r("div", { children: [
|
|
2411
|
-
/* @__PURE__ */ e(
|
|
2415
|
+
/* @__PURE__ */ e(d, {}),
|
|
2412
2416
|
/* @__PURE__ */ e(
|
|
2413
2417
|
pe,
|
|
2414
2418
|
{
|
|
@@ -2422,50 +2426,50 @@ function Vt({
|
|
|
2422
2426
|
)
|
|
2423
2427
|
] });
|
|
2424
2428
|
}
|
|
2425
|
-
function
|
|
2429
|
+
function ur({
|
|
2426
2430
|
tableDef: t,
|
|
2427
2431
|
rows: n,
|
|
2428
2432
|
onChange: a,
|
|
2429
2433
|
readOnly: s,
|
|
2430
2434
|
currency: l = "USD"
|
|
2431
2435
|
}) {
|
|
2432
|
-
const { t: i } = Z(), c = (
|
|
2436
|
+
const { t: i } = Z(), c = (d, u, p) => {
|
|
2433
2437
|
const v = n.map(
|
|
2434
|
-
(w, g) => g ===
|
|
2438
|
+
(w, g) => g === d ? { ...w, [u]: p } : w
|
|
2435
2439
|
);
|
|
2436
2440
|
a(v);
|
|
2437
2441
|
}, o = () => {
|
|
2438
|
-
const
|
|
2439
|
-
t.fields.forEach((
|
|
2440
|
-
u
|
|
2441
|
-
}), a([...n,
|
|
2442
|
-
},
|
|
2443
|
-
a(n.filter((
|
|
2442
|
+
const d = {};
|
|
2443
|
+
t.fields.forEach((u) => {
|
|
2444
|
+
d[u.name] = u.default ?? (u.type === "number" || u.type === "currency" ? 0 : "");
|
|
2445
|
+
}), a([...n, d]);
|
|
2446
|
+
}, m = (d) => {
|
|
2447
|
+
a(n.filter((u, p) => p !== d));
|
|
2444
2448
|
};
|
|
2445
2449
|
return /* @__PURE__ */ r(V, { title: i(`tables.${t.key}`, { defaultValue: t.label }), children: [
|
|
2446
2450
|
/* @__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
2451
|
/* @__PURE__ */ e("thead", { children: /* @__PURE__ */ r("tr", { children: [
|
|
2448
2452
|
/* @__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((
|
|
2453
|
+
t.fields.map((d) => /* @__PURE__ */ e(
|
|
2450
2454
|
"th",
|
|
2451
2455
|
{
|
|
2452
2456
|
className: "px-2 py-2 text-left text-xs font-medium uppercase tracking-wide text-fg-muted",
|
|
2453
|
-
children: i(`fields.${
|
|
2457
|
+
children: i(`fields.${d.label}`, { defaultValue: d.label })
|
|
2454
2458
|
},
|
|
2455
|
-
|
|
2459
|
+
d.name
|
|
2456
2460
|
)),
|
|
2457
2461
|
!s && /* @__PURE__ */ e("th", { className: "px-2 py-2 text-left text-xs font-medium uppercase tracking-wide text-fg-muted" })
|
|
2458
2462
|
] }) }),
|
|
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:
|
|
2463
|
+
/* @__PURE__ */ e("tbody", { className: "divide-y divide-line", children: n.map((d, u) => /* @__PURE__ */ r("tr", { children: [
|
|
2464
|
+
/* @__PURE__ */ e("td", { className: "px-2 py-1 text-fg-muted", children: u + 1 }),
|
|
2461
2465
|
t.fields.map((p) => /* @__PURE__ */ e("td", { className: "px-2 py-1 align-top", children: /* @__PURE__ */ e(
|
|
2462
2466
|
Vt,
|
|
2463
2467
|
{
|
|
2464
2468
|
field: p,
|
|
2465
|
-
value:
|
|
2466
|
-
onChange: (v) => c(
|
|
2469
|
+
value: d[p.name],
|
|
2470
|
+
onChange: (v) => c(u, p.name, v),
|
|
2467
2471
|
readOnly: s,
|
|
2468
|
-
rowData:
|
|
2472
|
+
rowData: d,
|
|
2469
2473
|
hideLabel: !0,
|
|
2470
2474
|
currency: l
|
|
2471
2475
|
}
|
|
@@ -2475,11 +2479,11 @@ function dr({
|
|
|
2475
2479
|
{
|
|
2476
2480
|
variant: "ghost",
|
|
2477
2481
|
size: "sm",
|
|
2478
|
-
onClick: () =>
|
|
2482
|
+
onClick: () => m(u),
|
|
2479
2483
|
children: "Remove"
|
|
2480
2484
|
}
|
|
2481
2485
|
) })
|
|
2482
|
-
] },
|
|
2486
|
+
] }, u)) })
|
|
2483
2487
|
] }) }),
|
|
2484
2488
|
!s && /* @__PURE__ */ e("div", { className: "mt-2", children: /* @__PURE__ */ e(X, { variant: "secondary", size: "sm", onClick: o, children: i("common.addRow") }) })
|
|
2485
2489
|
] });
|
|
@@ -2493,23 +2497,23 @@ function mr({
|
|
|
2493
2497
|
config: i,
|
|
2494
2498
|
onSave: c,
|
|
2495
2499
|
onSubmit: o,
|
|
2496
|
-
onCancel:
|
|
2497
|
-
onConvert:
|
|
2500
|
+
onCancel: m,
|
|
2501
|
+
onConvert: d
|
|
2498
2502
|
}) {
|
|
2499
|
-
const { t:
|
|
2503
|
+
const { t: u } = Z();
|
|
2500
2504
|
if (!i) return null;
|
|
2501
2505
|
const p = !t && n && a ? `/api/documents/${n}/${encodeURIComponent(a)}/pdf` : null;
|
|
2502
2506
|
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:
|
|
2507
|
+
p && /* @__PURE__ */ e(X, { variant: "secondary", onClick: () => window.open(p, "_blank"), children: u("common.pdf") }),
|
|
2508
|
+
s < 1 && /* @__PURE__ */ e(X, { onClick: c, disabled: l, children: u(l ? "common.saving" : "common.save") }),
|
|
2509
|
+
!t && i.canSubmit && s === 0 && /* @__PURE__ */ e(X, { variant: "secondary", onClick: o, children: u("common.submit") }),
|
|
2510
|
+
!t && i.canCancel && s === 1 && /* @__PURE__ */ e(X, { variant: "danger", onClick: m, children: u("common.cancelDoc") }),
|
|
2507
2511
|
!t && s === 1 && i.conversions.map((v) => /* @__PURE__ */ e(
|
|
2508
2512
|
X,
|
|
2509
2513
|
{
|
|
2510
2514
|
variant: "secondary",
|
|
2511
|
-
onClick: () =>
|
|
2512
|
-
children:
|
|
2515
|
+
onClick: () => d(v.targetDoctype),
|
|
2516
|
+
children: u(`conversions.${v.label}`, { defaultValue: v.label })
|
|
2513
2517
|
},
|
|
2514
2518
|
v.targetDoctype
|
|
2515
2519
|
))
|
|
@@ -2539,7 +2543,7 @@ function pn(t, n) {
|
|
|
2539
2543
|
}
|
|
2540
2544
|
function hn() {
|
|
2541
2545
|
var ge;
|
|
2542
|
-
const { doctype: t, name: n } =
|
|
2546
|
+
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
2547
|
queryKey: ["document", t, n],
|
|
2544
2548
|
queryFn: () => O.getDocument(t, n),
|
|
2545
2549
|
enabled: !!t && !!n && !c
|
|
@@ -2553,18 +2557,18 @@ function hn() {
|
|
|
2553
2557
|
staleTime: 300 * 1e3
|
|
2554
2558
|
});
|
|
2555
2559
|
re(() => {
|
|
2556
|
-
if (!c || !w ||
|
|
2560
|
+
if (!c || !w || d) return;
|
|
2557
2561
|
let _;
|
|
2558
2562
|
if (y) {
|
|
2559
2563
|
if (!L) return;
|
|
2560
2564
|
_ = L.default_currency || I;
|
|
2561
2565
|
} else
|
|
2562
2566
|
_ = I;
|
|
2563
|
-
_ && _ !== o.currency &&
|
|
2567
|
+
_ && _ !== o.currency && m((Q) => ({ ...Q, currency: _ }));
|
|
2564
2568
|
}, [
|
|
2565
2569
|
c,
|
|
2566
2570
|
w,
|
|
2567
|
-
|
|
2571
|
+
d,
|
|
2568
2572
|
y,
|
|
2569
2573
|
L,
|
|
2570
2574
|
I,
|
|
@@ -2576,8 +2580,8 @@ function hn() {
|
|
|
2576
2580
|
Q.type === "date" ? _[Q.name] = (/* @__PURE__ */ new Date()).toISOString().split("T")[0] : _[Q.name] = Q.default ?? "";
|
|
2577
2581
|
}), i.childTables.forEach((Q) => {
|
|
2578
2582
|
_[Q.key] = [];
|
|
2579
|
-
}), _.docstatus = 0,
|
|
2580
|
-
} else p &&
|
|
2583
|
+
}), _.docstatus = 0, m(_);
|
|
2584
|
+
} else p && m(p);
|
|
2581
2585
|
}, [c, p, i]);
|
|
2582
2586
|
const C = me({
|
|
2583
2587
|
mutationFn: (_) => O.createDocument(t, _),
|
|
@@ -2587,17 +2591,17 @@ function hn() {
|
|
|
2587
2591
|
}), b = me({
|
|
2588
2592
|
mutationFn: (_) => O.updateDocument(t, n, _),
|
|
2589
2593
|
onSuccess: (_) => {
|
|
2590
|
-
s.invalidateQueries({ queryKey: ["document", t, n] }), s.invalidateQueries({ queryKey: ["documents", t] }),
|
|
2594
|
+
s.invalidateQueries({ queryKey: ["document", t, n] }), s.invalidateQueries({ queryKey: ["documents", t] }), m(_);
|
|
2591
2595
|
}
|
|
2592
2596
|
}), h = me({
|
|
2593
2597
|
mutationFn: () => O.submitDocument(t, n),
|
|
2594
2598
|
onSuccess: (_) => {
|
|
2595
|
-
|
|
2599
|
+
m(_), s.invalidateQueries({ queryKey: ["document", t, n] }), s.invalidateQueries({ queryKey: ["documents", t] });
|
|
2596
2600
|
}
|
|
2597
2601
|
}), A = me({
|
|
2598
2602
|
mutationFn: () => O.cancelDocument(t, n),
|
|
2599
2603
|
onSuccess: (_) => {
|
|
2600
|
-
|
|
2604
|
+
m(_), s.invalidateQueries({ queryKey: ["document", t, n] }), s.invalidateQueries({ queryKey: ["documents", t] });
|
|
2601
2605
|
}
|
|
2602
2606
|
}), B = me({
|
|
2603
2607
|
mutationFn: (_) => O.convertDocument(t, n, _),
|
|
@@ -2607,7 +2611,7 @@ function hn() {
|
|
|
2607
2611
|
}
|
|
2608
2612
|
}), k = we(
|
|
2609
2613
|
(_, Q) => {
|
|
2610
|
-
_ === "currency" &&
|
|
2614
|
+
_ === "currency" && u(!0), m((oe) => {
|
|
2611
2615
|
const ne = { ...oe, [_]: Q };
|
|
2612
2616
|
return _ === "currency" && (ne.conversion_rate = 0), pn(ne, i);
|
|
2613
2617
|
});
|
|
@@ -2615,7 +2619,7 @@ function hn() {
|
|
|
2615
2619
|
[i]
|
|
2616
2620
|
), q = we(
|
|
2617
2621
|
(_, Q) => {
|
|
2618
|
-
|
|
2622
|
+
m((oe) => {
|
|
2619
2623
|
const ne = { ...oe, [_]: Q };
|
|
2620
2624
|
return pn(ne, i);
|
|
2621
2625
|
});
|
|
@@ -2687,7 +2691,7 @@ function hn() {
|
|
|
2687
2691
|
_.name
|
|
2688
2692
|
)) }) }),
|
|
2689
2693
|
i.childTables.map((_) => /* @__PURE__ */ e(
|
|
2690
|
-
|
|
2694
|
+
ur,
|
|
2691
2695
|
{
|
|
2692
2696
|
tableDef: _,
|
|
2693
2697
|
rows: o[_.key] ?? [],
|
|
@@ -2711,7 +2715,7 @@ function hn() {
|
|
|
2711
2715
|
)) }) })
|
|
2712
2716
|
] });
|
|
2713
2717
|
}
|
|
2714
|
-
function
|
|
2718
|
+
function ue(t) {
|
|
2715
2719
|
return t.toISOString().split("T")[0];
|
|
2716
2720
|
}
|
|
2717
2721
|
function Hn(t) {
|
|
@@ -2746,45 +2750,45 @@ const hr = [
|
|
|
2746
2750
|
{
|
|
2747
2751
|
label: "Today",
|
|
2748
2752
|
range: () => {
|
|
2749
|
-
const t =
|
|
2753
|
+
const t = ue(/* @__PURE__ */ new Date());
|
|
2750
2754
|
return [t, t];
|
|
2751
2755
|
}
|
|
2752
2756
|
},
|
|
2753
2757
|
{
|
|
2754
2758
|
label: "This Week",
|
|
2755
|
-
range: () => [
|
|
2759
|
+
range: () => [ue(Hn(/* @__PURE__ */ new Date())), ue(pr(/* @__PURE__ */ new Date()))]
|
|
2756
2760
|
},
|
|
2757
2761
|
{
|
|
2758
2762
|
label: "This Month",
|
|
2759
|
-
range: () => [
|
|
2763
|
+
range: () => [ue(gn(/* @__PURE__ */ new Date())), ue(vt(/* @__PURE__ */ new Date()))]
|
|
2760
2764
|
},
|
|
2761
2765
|
{
|
|
2762
2766
|
label: "This Quarter",
|
|
2763
|
-
range: () => [
|
|
2767
|
+
range: () => [ue(Ut(/* @__PURE__ */ new Date())), ue(Gt(/* @__PURE__ */ new Date()))]
|
|
2764
2768
|
},
|
|
2765
2769
|
{
|
|
2766
2770
|
label: "This Year",
|
|
2767
|
-
range: () => [
|
|
2771
|
+
range: () => [ue(yn(/* @__PURE__ */ new Date())), ue(Nt(/* @__PURE__ */ new Date()))]
|
|
2768
2772
|
},
|
|
2769
2773
|
{
|
|
2770
2774
|
label: "Last Month",
|
|
2771
2775
|
range: () => {
|
|
2772
2776
|
const t = /* @__PURE__ */ new Date(), n = new Date(t.getFullYear(), t.getMonth() - 1, 1);
|
|
2773
|
-
return [
|
|
2777
|
+
return [ue(gn(n)), ue(vt(n))];
|
|
2774
2778
|
}
|
|
2775
2779
|
},
|
|
2776
2780
|
{
|
|
2777
2781
|
label: "Last Quarter",
|
|
2778
2782
|
range: () => {
|
|
2779
2783
|
const t = /* @__PURE__ */ new Date(), n = new Date(t.getFullYear(), t.getMonth() - 3, 1);
|
|
2780
|
-
return [
|
|
2784
|
+
return [ue(Ut(n)), ue(Gt(n))];
|
|
2781
2785
|
}
|
|
2782
2786
|
},
|
|
2783
2787
|
{
|
|
2784
2788
|
label: "Last Year",
|
|
2785
2789
|
range: () => {
|
|
2786
2790
|
const t = new Date((/* @__PURE__ */ new Date()).getFullYear() - 1, 6, 1);
|
|
2787
|
-
return [
|
|
2791
|
+
return [ue(yn(t)), ue(Nt(t))];
|
|
2788
2792
|
}
|
|
2789
2793
|
}
|
|
2790
2794
|
];
|
|
@@ -2805,15 +2809,15 @@ function Dt({ onSelect: t }) {
|
|
|
2805
2809
|
}
|
|
2806
2810
|
function en({ onSelect: t }) {
|
|
2807
2811
|
return /* @__PURE__ */ e("div", { className: "flex flex-wrap gap-1.5", children: [
|
|
2808
|
-
{ label: "Today", value: () =>
|
|
2809
|
-
{ label: "End of This Month", value: () =>
|
|
2812
|
+
{ label: "Today", value: () => ue(/* @__PURE__ */ new Date()) },
|
|
2813
|
+
{ label: "End of This Month", value: () => ue(vt(/* @__PURE__ */ new Date())) },
|
|
2810
2814
|
{ label: "End of Last Month", value: () => {
|
|
2811
2815
|
const a = /* @__PURE__ */ new Date();
|
|
2812
|
-
return
|
|
2816
|
+
return ue(vt(new Date(a.getFullYear(), a.getMonth() - 1, 1)));
|
|
2813
2817
|
} },
|
|
2814
|
-
{ label: "End of This Quarter", value: () =>
|
|
2815
|
-
{ label: "End of This Year", value: () =>
|
|
2816
|
-
{ label: "End of Last Year", value: () =>
|
|
2818
|
+
{ label: "End of This Quarter", value: () => ue(Gt(/* @__PURE__ */ new Date())) },
|
|
2819
|
+
{ label: "End of This Year", value: () => ue(Nt(/* @__PURE__ */ new Date())) },
|
|
2820
|
+
{ label: "End of Last Year", value: () => ue(Nt(new Date((/* @__PURE__ */ new Date()).getFullYear() - 1, 0, 1))) }
|
|
2817
2821
|
].map((a) => /* @__PURE__ */ e(
|
|
2818
2822
|
"button",
|
|
2819
2823
|
{
|
|
@@ -2856,10 +2860,10 @@ function br(t) {
|
|
|
2856
2860
|
}
|
|
2857
2861
|
const xr = ["25", "50", "100", "200"];
|
|
2858
2862
|
function vr() {
|
|
2859
|
-
const { t } = Z(), { doctype: n } =
|
|
2863
|
+
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
2864
|
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,
|
|
2865
|
+
return s !== "All" && (x.status = s), l && (x.from_date = l), i && (x.to_date = i), x.limit = c, x.offset = m * c, x;
|
|
2866
|
+
}, [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
2867
|
if (!a) return [];
|
|
2864
2868
|
const x = zn(), z = (j) => {
|
|
2865
2869
|
const U = j.split("_").map((Y) => Y.charAt(0).toUpperCase() + Y.slice(1)).join(" ");
|
|
@@ -2975,7 +2979,7 @@ function vr() {
|
|
|
2975
2979
|
}
|
|
2976
2980
|
)
|
|
2977
2981
|
] }),
|
|
2978
|
-
/* @__PURE__ */ e(Dt, { onSelect: (x, z) =>
|
|
2982
|
+
/* @__PURE__ */ e(Dt, { onSelect: (x, z) => d({ from: x, to: z, page: null }) }),
|
|
2979
2983
|
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
2984
|
/* @__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
2985
|
/* @__PURE__ */ e("thead", { className: "bg-surface-subtle", children: q.getHeaderGroups().map((x) => /* @__PURE__ */ e("tr", { children: x.headers.map((z) => /* @__PURE__ */ e(
|
|
@@ -3024,8 +3028,8 @@ function vr() {
|
|
|
3024
3028
|
/* @__PURE__ */ e(
|
|
3025
3029
|
"button",
|
|
3026
3030
|
{
|
|
3027
|
-
onClick: () =>
|
|
3028
|
-
disabled:
|
|
3031
|
+
onClick: () => u(Math.max(0, m - 1)),
|
|
3032
|
+
disabled: m === 0,
|
|
3029
3033
|
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
3034
|
children: t("common.prev")
|
|
3031
3035
|
}
|
|
@@ -3033,7 +3037,7 @@ function vr() {
|
|
|
3033
3037
|
/* @__PURE__ */ r("span", { className: "text-xs", children: [
|
|
3034
3038
|
t("common.page"),
|
|
3035
3039
|
" ",
|
|
3036
|
-
/* @__PURE__ */ e("span", { className: "font-medium text-fg", children:
|
|
3040
|
+
/* @__PURE__ */ e("span", { className: "font-medium text-fg", children: m + 1 }),
|
|
3037
3041
|
" ",
|
|
3038
3042
|
t("common.of"),
|
|
3039
3043
|
" ",
|
|
@@ -3042,8 +3046,8 @@ function vr() {
|
|
|
3042
3046
|
/* @__PURE__ */ e(
|
|
3043
3047
|
"button",
|
|
3044
3048
|
{
|
|
3045
|
-
onClick: () =>
|
|
3046
|
-
disabled:
|
|
3049
|
+
onClick: () => u(Math.min(h - 1, m + 1)),
|
|
3050
|
+
disabled: m >= h - 1,
|
|
3047
3051
|
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
3052
|
children: t("common.next")
|
|
3049
3053
|
}
|
|
@@ -3059,7 +3063,7 @@ function vr() {
|
|
|
3059
3063
|
const Nr = ["25", "50", "100", "200"];
|
|
3060
3064
|
function Sr() {
|
|
3061
3065
|
var b;
|
|
3062
|
-
const { type: t } =
|
|
3066
|
+
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
3067
|
queryKey: ["masters", t, c, l],
|
|
3064
3068
|
queryFn: () => O.listMasters(t, {
|
|
3065
3069
|
include_disabled: 1,
|
|
@@ -3067,7 +3071,7 @@ function Sr() {
|
|
|
3067
3071
|
offset: c * l
|
|
3068
3072
|
}),
|
|
3069
3073
|
enabled: !!t
|
|
3070
|
-
}), v = (
|
|
3074
|
+
}), 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
3075
|
if (!v || v.length === 0) return [];
|
|
3072
3076
|
const h = zn();
|
|
3073
3077
|
return Object.keys(v[0]).map(
|
|
@@ -3143,7 +3147,7 @@ function Sr() {
|
|
|
3143
3147
|
"select",
|
|
3144
3148
|
{
|
|
3145
3149
|
value: l,
|
|
3146
|
-
onChange: (h) =>
|
|
3150
|
+
onChange: (h) => d(Number(h.target.value)),
|
|
3147
3151
|
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
3152
|
children: Nr.map((h) => /* @__PURE__ */ e("option", { value: h, children: h }, h))
|
|
3149
3153
|
}
|
|
@@ -3152,7 +3156,7 @@ function Sr() {
|
|
|
3152
3156
|
/* @__PURE__ */ e(
|
|
3153
3157
|
"button",
|
|
3154
3158
|
{
|
|
3155
|
-
onClick: () =>
|
|
3159
|
+
onClick: () => m(Math.max(0, c - 1)),
|
|
3156
3160
|
disabled: c === 0,
|
|
3157
3161
|
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
3162
|
children: "Prev"
|
|
@@ -3168,7 +3172,7 @@ function Sr() {
|
|
|
3168
3172
|
/* @__PURE__ */ e(
|
|
3169
3173
|
"button",
|
|
3170
3174
|
{
|
|
3171
|
-
onClick: () =>
|
|
3175
|
+
onClick: () => m(Math.min(g - 1, c + 1)),
|
|
3172
3176
|
disabled: c >= g - 1,
|
|
3173
3177
|
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
3178
|
children: "Next"
|
|
@@ -3243,7 +3247,7 @@ const kr = {
|
|
|
3243
3247
|
}, bn = /* @__PURE__ */ new Set(["customer", "supplier", "item", "warehouse"]);
|
|
3244
3248
|
function xn() {
|
|
3245
3249
|
var B;
|
|
3246
|
-
const { type: t, name: n } =
|
|
3250
|
+
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
3251
|
queryKey: ["master", t, n],
|
|
3248
3252
|
queryFn: () => O.getMaster(t, n),
|
|
3249
3253
|
enabled: !!t && !!n && !i
|
|
@@ -3251,11 +3255,11 @@ function xn() {
|
|
|
3251
3255
|
re(() => {
|
|
3252
3256
|
if (i) {
|
|
3253
3257
|
const k = {};
|
|
3254
|
-
|
|
3258
|
+
m.forEach((q) => {
|
|
3255
3259
|
k[q.name] = q.default ?? "";
|
|
3256
3260
|
}), p(k);
|
|
3257
3261
|
} else v && p(v);
|
|
3258
|
-
}, [i, v,
|
|
3262
|
+
}, [i, v, m]);
|
|
3259
3263
|
const g = me({
|
|
3260
3264
|
mutationFn: (k) => O.createMaster(t, k),
|
|
3261
3265
|
onSuccess: (k) => {
|
|
@@ -3286,7 +3290,7 @@ function xn() {
|
|
|
3286
3290
|
}
|
|
3287
3291
|
}), L = () => {
|
|
3288
3292
|
if (A.length > 0) return;
|
|
3289
|
-
const k = t === "company" && !
|
|
3293
|
+
const k = t === "company" && !u.name ? { ...u, name: u.company_name } : u;
|
|
3290
3294
|
i ? g.mutate(k) : y.mutate(k);
|
|
3291
3295
|
}, C = () => {
|
|
3292
3296
|
window.confirm(l("masterForm.deleteConfirm", { label: o })) && I.mutate();
|
|
@@ -3295,9 +3299,9 @@ function xn() {
|
|
|
3295
3299
|
};
|
|
3296
3300
|
if (!i && w)
|
|
3297
3301
|
return /* @__PURE__ */ e("p", { className: "text-fg-muted", children: l("common.loading") });
|
|
3298
|
-
const h = g.isPending || y.isPending, A =
|
|
3302
|
+
const h = g.isPending || y.isPending, A = m.filter((k) => {
|
|
3299
3303
|
if (!k.required || k.readOnly || i && k.name === "name" && bn.has(t ?? "")) return !1;
|
|
3300
|
-
const q =
|
|
3304
|
+
const q = u[k.name];
|
|
3301
3305
|
return q == null || String(q).trim() === "";
|
|
3302
3306
|
});
|
|
3303
3307
|
return /* @__PURE__ */ r("div", { className: "space-y-6", children: [
|
|
@@ -3314,17 +3318,17 @@ function xn() {
|
|
|
3314
3318
|
)
|
|
3315
3319
|
] }) }),
|
|
3316
3320
|
(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:
|
|
3321
|
+
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(", ") }) }),
|
|
3322
|
+
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 }) }),
|
|
3323
|
+
/* @__PURE__ */ e(V, { children: /* @__PURE__ */ e("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: m.map((k) => {
|
|
3320
3324
|
const x = k.name === "name" && !i || k.readOnly, z = k.required && !(i && k.name === "name" && bn.has(t ?? ""));
|
|
3321
3325
|
if (k.type === "select" && k.options)
|
|
3322
3326
|
return /* @__PURE__ */ e("div", { children: /* @__PURE__ */ e(
|
|
3323
3327
|
Ke,
|
|
3324
3328
|
{
|
|
3325
|
-
label:
|
|
3329
|
+
label: d(k),
|
|
3326
3330
|
options: k.options,
|
|
3327
|
-
value:
|
|
3331
|
+
value: u[k.name] ?? "",
|
|
3328
3332
|
required: z,
|
|
3329
3333
|
disabled: x,
|
|
3330
3334
|
onChange: (U) => b(k.name, U.target.value)
|
|
@@ -3332,13 +3336,13 @@ function xn() {
|
|
|
3332
3336
|
) }, k.name);
|
|
3333
3337
|
if (k.type === "textarea")
|
|
3334
3338
|
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:
|
|
3339
|
+
/* @__PURE__ */ e("label", { className: "mb-1.5 block text-sm font-medium text-fg", children: d(k) }),
|
|
3336
3340
|
/* @__PURE__ */ e(
|
|
3337
3341
|
"textarea",
|
|
3338
3342
|
{
|
|
3339
3343
|
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
3344
|
rows: 3,
|
|
3341
|
-
value:
|
|
3345
|
+
value: u[k.name] ?? "",
|
|
3342
3346
|
required: z,
|
|
3343
3347
|
readOnly: x,
|
|
3344
3348
|
disabled: x,
|
|
@@ -3350,13 +3354,13 @@ function xn() {
|
|
|
3350
3354
|
return /* @__PURE__ */ e(
|
|
3351
3355
|
pe,
|
|
3352
3356
|
{
|
|
3353
|
-
label:
|
|
3357
|
+
label: d(k),
|
|
3354
3358
|
type: j,
|
|
3355
3359
|
step: k.type === "currency" ? "0.01" : void 0,
|
|
3356
3360
|
required: z,
|
|
3357
3361
|
readOnly: x,
|
|
3358
3362
|
disabled: x,
|
|
3359
|
-
value:
|
|
3363
|
+
value: u[k.name] ?? "",
|
|
3360
3364
|
onChange: (U) => b(
|
|
3361
3365
|
k.name,
|
|
3362
3366
|
j === "number" ? parseFloat(U.target.value) || 0 : U.target.value
|
|
@@ -3423,7 +3427,7 @@ function ke({
|
|
|
3423
3427
|
linkDoctype: s,
|
|
3424
3428
|
readOnly: l
|
|
3425
3429
|
}) {
|
|
3426
|
-
const [i, c] = N(n ?? ""), [o,
|
|
3430
|
+
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
3431
|
re(() => {
|
|
3428
3432
|
c(n ?? "");
|
|
3429
3433
|
}, [n]);
|
|
@@ -3444,9 +3448,9 @@ function ke({
|
|
|
3444
3448
|
v(!0);
|
|
3445
3449
|
try {
|
|
3446
3450
|
const z = await O.searchLink(s, x);
|
|
3447
|
-
|
|
3451
|
+
m(z), u(!0);
|
|
3448
3452
|
} catch {
|
|
3449
|
-
|
|
3453
|
+
m([]);
|
|
3450
3454
|
} finally {
|
|
3451
3455
|
v(!1);
|
|
3452
3456
|
}
|
|
@@ -3458,21 +3462,21 @@ function ke({
|
|
|
3458
3462
|
c(z), A(z);
|
|
3459
3463
|
}, k = (x) => {
|
|
3460
3464
|
const z = x.name ?? x.id ?? String(x);
|
|
3461
|
-
c(z), a(z),
|
|
3465
|
+
c(z), a(z), u(!1), m([]);
|
|
3462
3466
|
}, q = () => {
|
|
3463
3467
|
setTimeout(() => {
|
|
3464
3468
|
if (b.current) {
|
|
3465
3469
|
b.current = !1;
|
|
3466
3470
|
return;
|
|
3467
3471
|
}
|
|
3468
|
-
|
|
3472
|
+
u(!1), i !== n && a(i);
|
|
3469
3473
|
}, 150);
|
|
3470
3474
|
};
|
|
3471
3475
|
return re(() => {
|
|
3472
3476
|
const x = (z) => {
|
|
3473
3477
|
var U, Y;
|
|
3474
3478
|
const j = z.target;
|
|
3475
|
-
(U = I.current) != null && U.contains(j) || (Y = L.current) != null && Y.contains(j) ||
|
|
3479
|
+
(U = I.current) != null && U.contains(j) || (Y = L.current) != null && Y.contains(j) || u(!1);
|
|
3476
3480
|
};
|
|
3477
3481
|
return document.addEventListener("mousedown", x), () => document.removeEventListener("mousedown", x);
|
|
3478
3482
|
}, []), l ? /* @__PURE__ */ r("div", { children: [
|
|
@@ -3498,7 +3502,7 @@ function ke({
|
|
|
3498
3502
|
)
|
|
3499
3503
|
}
|
|
3500
3504
|
),
|
|
3501
|
-
|
|
3505
|
+
d && o.length > 0 && Ca(
|
|
3502
3506
|
/* @__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
3507
|
const j = x.name ?? x.id ?? String(x);
|
|
3504
3508
|
return /* @__PURE__ */ e(
|
|
@@ -3520,14 +3524,14 @@ function ke({
|
|
|
3520
3524
|
] });
|
|
3521
3525
|
}
|
|
3522
3526
|
function Ir() {
|
|
3523
|
-
const { t } = Z(), [n] = J("company", ""), [a] = J("from", ""), [s] = J("to", ""), l = Me(), [i, c] = N(n), [o,
|
|
3527
|
+
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
3528
|
const b = {};
|
|
3525
3529
|
return n && (b.company = n), a && (b.from_date = a), s && (b.to_date = s), b;
|
|
3526
3530
|
}, [n, a, s]), { data: g, isLoading: y, refetch: I } = Cr(w), L = () => {
|
|
3527
3531
|
l({
|
|
3528
3532
|
company: i || null,
|
|
3529
3533
|
from: o || null,
|
|
3530
|
-
to:
|
|
3534
|
+
to: d || null
|
|
3531
3535
|
}), I();
|
|
3532
3536
|
}, C = g ? g.difference === 0 : !1;
|
|
3533
3537
|
return /* @__PURE__ */ r("div", { className: "space-y-4", children: [
|
|
@@ -3548,7 +3552,7 @@ function Ir() {
|
|
|
3548
3552
|
label: t("fields.From Date", { defaultValue: "From Date" }),
|
|
3549
3553
|
type: "date",
|
|
3550
3554
|
value: o,
|
|
3551
|
-
onChange: (b) =>
|
|
3555
|
+
onChange: (b) => m(b.target.value)
|
|
3552
3556
|
}
|
|
3553
3557
|
),
|
|
3554
3558
|
/* @__PURE__ */ e(
|
|
@@ -3556,14 +3560,14 @@ function Ir() {
|
|
|
3556
3560
|
{
|
|
3557
3561
|
label: t("fields.To Date", { defaultValue: "To Date" }),
|
|
3558
3562
|
type: "date",
|
|
3559
|
-
value:
|
|
3560
|
-
onChange: (b) =>
|
|
3563
|
+
value: d,
|
|
3564
|
+
onChange: (b) => u(b.target.value)
|
|
3561
3565
|
}
|
|
3562
3566
|
),
|
|
3563
3567
|
/* @__PURE__ */ e(X, { onClick: L, children: t("common.apply") })
|
|
3564
3568
|
] }),
|
|
3565
3569
|
/* @__PURE__ */ e(Dt, { onSelect: (b, h) => {
|
|
3566
|
-
|
|
3570
|
+
m(b), u(h), l({ from: b, to: h });
|
|
3567
3571
|
} }),
|
|
3568
3572
|
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
3573
|
/* @__PURE__ */ e("div", { className: "overflow-x-auto", children: /* @__PURE__ */ r("table", { className: "min-w-full divide-y divide-line text-sm", children: [
|
|
@@ -3601,11 +3605,11 @@ function Lr(t) {
|
|
|
3601
3605
|
}
|
|
3602
3606
|
const Br = ["25", "50", "100", "200"];
|
|
3603
3607
|
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,
|
|
3608
|
+
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
3609
|
const T = {};
|
|
3606
3610
|
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
3611
|
}, [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
|
-
|
|
3612
|
+
m({
|
|
3609
3613
|
account: p || null,
|
|
3610
3614
|
party: w || null,
|
|
3611
3615
|
from: y || null,
|
|
@@ -3656,7 +3660,7 @@ function Er() {
|
|
|
3656
3660
|
/* @__PURE__ */ e(X, { onClick: ce, children: t("common.apply") })
|
|
3657
3661
|
] }),
|
|
3658
3662
|
/* @__PURE__ */ e(Dt, { onSelect: (T, K) => {
|
|
3659
|
-
I(T), C(K),
|
|
3663
|
+
I(T), C(K), m({ from: T, to: K, page: null });
|
|
3660
3664
|
} }),
|
|
3661
3665
|
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
3666
|
/* @__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 +3713,7 @@ function Er() {
|
|
|
3709
3713
|
"select",
|
|
3710
3714
|
{
|
|
3711
3715
|
value: i,
|
|
3712
|
-
onChange: (T) =>
|
|
3716
|
+
onChange: (T) => u(Number(T.target.value)),
|
|
3713
3717
|
className: "rounded border border-gray-300 bg-white px-2 py-1 text-sm",
|
|
3714
3718
|
children: Br.map((T) => /* @__PURE__ */ e("option", { value: T, children: T }, T))
|
|
3715
3719
|
}
|
|
@@ -3718,7 +3722,7 @@ function Er() {
|
|
|
3718
3722
|
/* @__PURE__ */ e(
|
|
3719
3723
|
"button",
|
|
3720
3724
|
{
|
|
3721
|
-
onClick: () =>
|
|
3725
|
+
onClick: () => d(Math.max(0, o - 1)),
|
|
3722
3726
|
disabled: o === 0,
|
|
3723
3727
|
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
3728
|
children: t("common.prev")
|
|
@@ -3736,7 +3740,7 @@ function Er() {
|
|
|
3736
3740
|
/* @__PURE__ */ e(
|
|
3737
3741
|
"button",
|
|
3738
3742
|
{
|
|
3739
|
-
onClick: () =>
|
|
3743
|
+
onClick: () => d(Math.min(j - 1, o + 1)),
|
|
3740
3744
|
disabled: o >= j - 1,
|
|
3741
3745
|
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
3746
|
children: t("common.next")
|
|
@@ -3748,10 +3752,10 @@ function Er() {
|
|
|
3748
3752
|
] });
|
|
3749
3753
|
}
|
|
3750
3754
|
function Or() {
|
|
3751
|
-
const { t } = Z(), [n] = J("item_code", ""), [a] = J("warehouse", ""), s = Me(), [l, i] = N(n), [c, o] = N(a),
|
|
3755
|
+
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
3756
|
const y = {};
|
|
3753
3757
|
return n && (y.item_code = n), a && (y.warehouse = a), y;
|
|
3754
|
-
}, [n, a]), { data: p, isLoading: v, refetch: w } = _r(
|
|
3758
|
+
}, [n, a]), { data: p, isLoading: v, refetch: w } = _r(u), g = () => {
|
|
3755
3759
|
s({
|
|
3756
3760
|
item_code: l || null,
|
|
3757
3761
|
warehouse: c || null
|
|
@@ -3795,32 +3799,32 @@ function Or() {
|
|
|
3795
3799
|
/* @__PURE__ */ e("td", { className: "px-4 py-2 text-gray-700", children: y.item_name }),
|
|
3796
3800
|
/* @__PURE__ */ e("td", { className: "px-4 py-2 text-gray-700", children: y.warehouse }),
|
|
3797
3801
|
/* @__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:
|
|
3802
|
+
/* @__PURE__ */ e("td", { className: "px-4 py-2 text-right", children: d(y.valuation_rate) }),
|
|
3803
|
+
/* @__PURE__ */ e("td", { className: "px-4 py-2 text-right font-medium", children: d(y.stock_value) })
|
|
3800
3804
|
] }, I)) })
|
|
3801
3805
|
] }) }) })
|
|
3802
3806
|
] });
|
|
3803
3807
|
}
|
|
3804
3808
|
function qr() {
|
|
3805
|
-
const { t } = Z(), [n] = J("company", ""), [a] = J("from", ""), [s] = J("to", ""), l = Me(), [i, c] = N(n), o = Fe(i),
|
|
3809
|
+
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
3810
|
const b = {};
|
|
3807
3811
|
return n && (b.company = n), a && (b.from_date = a), s && (b.to_date = s), b;
|
|
3808
3812
|
}, [n, a, s]), { data: g, isLoading: y, refetch: I } = Ar(w), L = () => {
|
|
3809
3813
|
l({
|
|
3810
3814
|
company: i || null,
|
|
3811
|
-
from:
|
|
3815
|
+
from: d || null,
|
|
3812
3816
|
to: p || null
|
|
3813
3817
|
}), I();
|
|
3814
3818
|
}, C = g && (g.income && g.income.length > 0 || g.expense && g.expense.length > 0);
|
|
3815
3819
|
return /* @__PURE__ */ r("div", { className: "space-y-4", children: [
|
|
3816
3820
|
/* @__PURE__ */ r("div", { className: "flex flex-wrap items-end gap-4", children: [
|
|
3817
3821
|
/* @__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:
|
|
3822
|
+
/* @__PURE__ */ e(pe, { label: t("fields.From Date", { defaultValue: "From Date" }), type: "date", value: d, onChange: (b) => u(b.target.value) }),
|
|
3819
3823
|
/* @__PURE__ */ e(pe, { label: t("fields.To Date", { defaultValue: "To Date" }), type: "date", value: p, onChange: (b) => v(b.target.value) }),
|
|
3820
3824
|
/* @__PURE__ */ e(X, { onClick: L, children: t("common.apply") })
|
|
3821
3825
|
] }),
|
|
3822
3826
|
/* @__PURE__ */ e(Dt, { onSelect: (b, h) => {
|
|
3823
|
-
|
|
3827
|
+
u(b), v(h), l({ from: b, to: h });
|
|
3824
3828
|
} }),
|
|
3825
3829
|
y ? /* @__PURE__ */ e("p", { className: "text-gray-500", children: t("common.loading") }) : C ? /* @__PURE__ */ r("div", { className: "space-y-4", children: [
|
|
3826
3830
|
/* @__PURE__ */ r(V, { children: [
|
|
@@ -3832,11 +3836,11 @@ function qr() {
|
|
|
3832
3836
|
] }) }),
|
|
3833
3837
|
/* @__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
3838
|
/* @__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:
|
|
3839
|
+
/* @__PURE__ */ e("td", { className: "px-4 py-2 text-right", children: m(b.amount) })
|
|
3836
3840
|
] }, h)) }),
|
|
3837
3841
|
/* @__PURE__ */ e("tfoot", { className: "border-t-2 border-gray-300 bg-gray-50 font-semibold", children: /* @__PURE__ */ r("tr", { children: [
|
|
3838
3842
|
/* @__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:
|
|
3843
|
+
/* @__PURE__ */ e("td", { className: "px-4 py-3 text-right", children: m(g.total_income) })
|
|
3840
3844
|
] }) })
|
|
3841
3845
|
] })
|
|
3842
3846
|
] }),
|
|
@@ -3849,18 +3853,18 @@ function qr() {
|
|
|
3849
3853
|
] }) }),
|
|
3850
3854
|
/* @__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
3855
|
/* @__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:
|
|
3856
|
+
/* @__PURE__ */ e("td", { className: "px-4 py-2 text-right", children: m(b.amount) })
|
|
3853
3857
|
] }, h)) }),
|
|
3854
3858
|
/* @__PURE__ */ e("tfoot", { className: "border-t-2 border-gray-300 bg-gray-50 font-semibold", children: /* @__PURE__ */ r("tr", { children: [
|
|
3855
3859
|
/* @__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:
|
|
3860
|
+
/* @__PURE__ */ e("td", { className: "px-4 py-3 text-right", children: m(g.total_expense) })
|
|
3857
3861
|
] }) })
|
|
3858
3862
|
] })
|
|
3859
3863
|
] }),
|
|
3860
3864
|
/* @__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
3865
|
g.net_profit >= 0 ? t("reports.netProfit") : t("reports.netLoss"),
|
|
3862
3866
|
": ",
|
|
3863
|
-
|
|
3867
|
+
m(Math.abs(g.net_profit))
|
|
3864
3868
|
] }) })
|
|
3865
3869
|
] }) : /* @__PURE__ */ e("p", { className: "py-8 text-center text-gray-400", children: t("reports.noData") })
|
|
3866
3870
|
] });
|
|
@@ -3874,10 +3878,10 @@ function Et({ title: t, rows: n, total: a, totalLabel: s, currency: l }) {
|
|
|
3874
3878
|
/* @__PURE__ */ e("th", { className: "px-4 py-3 text-left font-medium text-gray-500", children: i("fields.Account", { defaultValue: "Account" }) }),
|
|
3875
3879
|
/* @__PURE__ */ e("th", { className: "px-4 py-3 text-right font-medium text-gray-500", children: i("fields.Balance", { defaultValue: "Balance" }) })
|
|
3876
3880
|
] }) }),
|
|
3877
|
-
/* @__PURE__ */ e("tbody", { className: "divide-y divide-gray-100", children: n.map((o,
|
|
3881
|
+
/* @__PURE__ */ e("tbody", { className: "divide-y divide-gray-100", children: n.map((o, m) => /* @__PURE__ */ r("tr", { className: "hover:bg-gray-50", children: [
|
|
3878
3882
|
/* @__PURE__ */ e("td", { className: "px-4 py-2 text-gray-900", children: o.account }),
|
|
3879
3883
|
/* @__PURE__ */ e("td", { className: "px-4 py-2 text-right", children: c(o.balance) })
|
|
3880
|
-
] },
|
|
3884
|
+
] }, m)) }),
|
|
3881
3885
|
/* @__PURE__ */ e("tfoot", { className: "border-t-2 border-gray-300 bg-gray-50 font-semibold", children: /* @__PURE__ */ r("tr", { children: [
|
|
3882
3886
|
/* @__PURE__ */ e("td", { className: "px-4 py-3 text-gray-900", children: s }),
|
|
3883
3887
|
/* @__PURE__ */ e("td", { className: "px-4 py-3 text-right", children: c(a) })
|
|
@@ -3887,10 +3891,10 @@ function Et({ title: t, rows: n, total: a, totalLabel: s, currency: l }) {
|
|
|
3887
3891
|
}
|
|
3888
3892
|
function zr() {
|
|
3889
3893
|
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),
|
|
3894
|
+
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
3895
|
const h = {};
|
|
3892
3896
|
return n && (h.company = n), a && (h.as_of_date = a), h;
|
|
3893
|
-
}, [n, a]), { data: p, isLoading: v, refetch: w } = Tr(
|
|
3897
|
+
}, [n, a]), { data: p, isLoading: v, refetch: w } = Tr(u), g = () => {
|
|
3894
3898
|
s({ company: l || null, as_of_date: c || null }), w();
|
|
3895
3899
|
}, 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
3900
|
return /* @__PURE__ */ r("div", { className: "space-y-4", children: [
|
|
@@ -3903,20 +3907,20 @@ function zr() {
|
|
|
3903
3907
|
o(h), s({ as_of_date: h });
|
|
3904
3908
|
} }),
|
|
3905
3909
|
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:
|
|
3910
|
+
/* @__PURE__ */ e(Et, { title: t("reports.assets"), rows: p.assets || [], total: p.total_assets, totalLabel: t("reports.totalAssets"), currency: m }),
|
|
3911
|
+
/* @__PURE__ */ e(Et, { title: t("reports.liabilities"), rows: p.liabilities || [], total: p.total_liabilities, totalLabel: t("reports.totalLiabilities"), currency: m }),
|
|
3912
|
+
/* @__PURE__ */ e(Et, { title: t("reports.equity"), rows: p.equity || [], total: p.total_equity, totalLabel: t("reports.totalEquity"), currency: m }),
|
|
3909
3913
|
/* @__PURE__ */ e(V, { children: /* @__PURE__ */ r("div", { className: "flex items-center justify-between", children: [
|
|
3910
3914
|
/* @__PURE__ */ r("div", { className: "text-sm", children: [
|
|
3911
3915
|
/* @__PURE__ */ r("div", { className: "text-gray-500", children: [
|
|
3912
3916
|
t("reports.totalAssets"),
|
|
3913
3917
|
": ",
|
|
3914
|
-
/* @__PURE__ */ e("span", { className: "font-semibold text-gray-900", children:
|
|
3918
|
+
/* @__PURE__ */ e("span", { className: "font-semibold text-gray-900", children: d(p.total_assets) })
|
|
3915
3919
|
] }),
|
|
3916
3920
|
/* @__PURE__ */ r("div", { className: "text-gray-500", children: [
|
|
3917
3921
|
t("reports.totalLiabilitiesEquity"),
|
|
3918
3922
|
": ",
|
|
3919
|
-
/* @__PURE__ */ e("span", { className: "font-semibold text-gray-900", children:
|
|
3923
|
+
/* @__PURE__ */ e("span", { className: "font-semibold text-gray-900", children: d(p.total_liabilities_and_equity) })
|
|
3920
3924
|
] })
|
|
3921
3925
|
] }),
|
|
3922
3926
|
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 +3929,10 @@ function zr() {
|
|
|
3925
3929
|
] });
|
|
3926
3930
|
}
|
|
3927
3931
|
function Fr() {
|
|
3928
|
-
const { t } = Z(), [n] = J("company", ""), [a] = J("as_of_date", ""), s = Me(), [l, i] = N(n), [c, o] = N(a),
|
|
3932
|
+
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
3933
|
const y = {};
|
|
3930
3934
|
return n && (y.company = n), a && (y.as_of_date = a), y;
|
|
3931
|
-
}, [n, a]), { data: p, isLoading: v, refetch: w } = Pr(
|
|
3935
|
+
}, [n, a]), { data: p, isLoading: v, refetch: w } = Pr(u), g = () => {
|
|
3932
3936
|
s({ company: l || null, as_of_date: c || null }), w();
|
|
3933
3937
|
};
|
|
3934
3938
|
return /* @__PURE__ */ r("div", { className: "space-y-4", children: [
|
|
@@ -3963,30 +3967,30 @@ function Fr() {
|
|
|
3963
3967
|
) }),
|
|
3964
3968
|
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-gray-900", children: y.customer_name }),
|
|
3965
3969
|
/* @__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 ?
|
|
3970
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right font-medium", children: d(y.outstanding) }),
|
|
3971
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.current ? d(y.current) : "" }),
|
|
3972
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.b1_30 ? d(y.b1_30) : "" }),
|
|
3973
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.b31_60 ? d(y.b31_60) : "" }),
|
|
3974
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.b61_90 ? d(y.b61_90) : "" }),
|
|
3975
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right text-red-600", children: y.b90_plus ? d(y.b90_plus) : "" })
|
|
3972
3976
|
] }, I)) }),
|
|
3973
3977
|
/* @__PURE__ */ e("tfoot", { className: "border-t-2 border-gray-300 bg-gray-50 font-semibold", children: /* @__PURE__ */ r("tr", { children: [
|
|
3974
3978
|
/* @__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:
|
|
3979
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children: d(p.totals.outstanding) }),
|
|
3980
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children: d(p.totals.current) }),
|
|
3981
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children: d(p.totals.b1_30) }),
|
|
3982
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children: d(p.totals.b31_60) }),
|
|
3983
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children: d(p.totals.b61_90) }),
|
|
3984
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right text-red-600", children: d(p.totals.b90_plus) })
|
|
3981
3985
|
] }) })
|
|
3982
3986
|
] }) }) })
|
|
3983
3987
|
] });
|
|
3984
3988
|
}
|
|
3985
3989
|
function Mr() {
|
|
3986
|
-
const { t } = Z(), [n] = J("company", ""), [a] = J("as_of_date", ""), s = Me(), [l, i] = N(n), [c, o] = N(a),
|
|
3990
|
+
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
3991
|
const y = {};
|
|
3988
3992
|
return n && (y.company = n), a && (y.as_of_date = a), y;
|
|
3989
|
-
}, [n, a]), { data: p, isLoading: v, refetch: w } = Rr(
|
|
3993
|
+
}, [n, a]), { data: p, isLoading: v, refetch: w } = Rr(u), g = () => {
|
|
3990
3994
|
s({ company: l || null, as_of_date: c || null }), w();
|
|
3991
3995
|
};
|
|
3992
3996
|
return /* @__PURE__ */ r("div", { className: "space-y-4", children: [
|
|
@@ -4021,21 +4025,21 @@ function Mr() {
|
|
|
4021
4025
|
) }),
|
|
4022
4026
|
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-gray-900", children: y.supplier_name }),
|
|
4023
4027
|
/* @__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 ?
|
|
4028
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right font-medium", children: d(y.outstanding) }),
|
|
4029
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.current ? d(y.current) : "" }),
|
|
4030
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.b1_30 ? d(y.b1_30) : "" }),
|
|
4031
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.b31_60 ? d(y.b31_60) : "" }),
|
|
4032
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.b61_90 ? d(y.b61_90) : "" }),
|
|
4033
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right text-red-600", children: y.b90_plus ? d(y.b90_plus) : "" })
|
|
4030
4034
|
] }, I)) }),
|
|
4031
4035
|
/* @__PURE__ */ e("tfoot", { className: "border-t-2 border-gray-300 bg-gray-50 font-semibold", children: /* @__PURE__ */ r("tr", { children: [
|
|
4032
4036
|
/* @__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:
|
|
4037
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children: d(p.totals.outstanding) }),
|
|
4038
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children: d(p.totals.current) }),
|
|
4039
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children: d(p.totals.b1_30) }),
|
|
4040
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children: d(p.totals.b31_60) }),
|
|
4041
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children: d(p.totals.b61_90) }),
|
|
4042
|
+
/* @__PURE__ */ e("td", { className: "px-3 py-3 text-right text-red-600", children: d(p.totals.b90_plus) })
|
|
4039
4043
|
] }) })
|
|
4040
4044
|
] }) }) })
|
|
4041
4045
|
] });
|
|
@@ -4135,18 +4139,18 @@ return {
|
|
|
4135
4139
|
}
|
|
4136
4140
|
const Yn = Vr();
|
|
4137
4141
|
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", ""), [
|
|
4142
|
+
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
4143
|
metric: l,
|
|
4140
4144
|
groupBy: i,
|
|
4141
4145
|
fromDate: c || void 0,
|
|
4142
4146
|
toDate: o || void 0,
|
|
4143
|
-
company:
|
|
4144
|
-
}), null, 2), [l, i, c, o,
|
|
4147
|
+
company: m || void 0
|
|
4148
|
+
}), null, 2), [l, i, c, o, m]), U = async (K) => {
|
|
4145
4149
|
var ge;
|
|
4146
4150
|
const se = ++z.current, le = () => z.current === se;
|
|
4147
4151
|
I(""), C(!0);
|
|
4148
4152
|
try {
|
|
4149
|
-
const Q = JSON.parse(K ??
|
|
4153
|
+
const Q = JSON.parse(K ?? d), oe = await O.runtimeData({ requests: Q.data_requests || [] });
|
|
4150
4154
|
if (!le()) return;
|
|
4151
4155
|
v(oe.datasets), (ge = k.current) == null || ge.terminate();
|
|
4152
4156
|
const ne = new $r();
|
|
@@ -4178,20 +4182,20 @@ function Ur() {
|
|
|
4178
4182
|
return s ? q.current === s ? void 0 : (h(!0), I(""), O.getRuntimeDraft(s).then((se) => {
|
|
4179
4183
|
if (K) return;
|
|
4180
4184
|
const le = JSON.stringify(se.definition, null, 2);
|
|
4181
|
-
return q.current = s, x.current = le, B(se.source_chat_session_id || ""),
|
|
4185
|
+
return q.current = s, x.current = le, B(se.source_chat_session_id || ""), u(le), U(le);
|
|
4182
4186
|
}).catch((se) => {
|
|
4183
4187
|
K || (g(null), I(se instanceof Error ? se.message : String(se)));
|
|
4184
4188
|
}).finally(() => {
|
|
4185
4189
|
K || h(!1);
|
|
4186
4190
|
}), () => {
|
|
4187
4191
|
K = !0;
|
|
4188
|
-
}) : (q.current = "", x.current = "", B(""), j && (x.current = j,
|
|
4192
|
+
}) : (q.current = "", x.current = "", B(""), j && (x.current = j, u(j), U(j)), () => {
|
|
4189
4193
|
K = !0;
|
|
4190
4194
|
});
|
|
4191
4195
|
}, [s, j]);
|
|
4192
4196
|
const Y = !!(!s && j), ce = Ce(() => Wr(w), [w]), T = async () => {
|
|
4193
4197
|
var oe;
|
|
4194
|
-
const K =
|
|
4198
|
+
const K = d.trim() !== x.current.trim(), se = s || "unsaved-runtime-report", le = p.map((ne) => ({
|
|
4195
4199
|
name: ne.name,
|
|
4196
4200
|
dataset: ne.dataset,
|
|
4197
4201
|
row_count: ne.row_count,
|
|
@@ -4209,7 +4213,7 @@ function Ur() {
|
|
|
4209
4213
|
"",
|
|
4210
4214
|
"The analytics editor contains unsaved local changes. Use this JSON as the source of truth when repairing the draft:",
|
|
4211
4215
|
"```json",
|
|
4212
|
-
|
|
4216
|
+
d,
|
|
4213
4217
|
"```"
|
|
4214
4218
|
) : ge.push(
|
|
4215
4219
|
"",
|
|
@@ -4262,8 +4266,8 @@ function Ur() {
|
|
|
4262
4266
|
"textarea",
|
|
4263
4267
|
{
|
|
4264
4268
|
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) =>
|
|
4269
|
+
value: d,
|
|
4270
|
+
onChange: (K) => u(K.target.value),
|
|
4267
4271
|
spellCheck: !1
|
|
4268
4272
|
}
|
|
4269
4273
|
)
|
|
@@ -4288,13 +4292,13 @@ function Gr({ output: t }) {
|
|
|
4288
4292
|
] }, `${i.label}-${c}`)) }) : null
|
|
4289
4293
|
] }),
|
|
4290
4294
|
(l = t.charts) == null ? void 0 : l.map((i, c) => {
|
|
4291
|
-
const o = i.dataTable ? a.get(i.dataTable) : void 0,
|
|
4292
|
-
if (!
|
|
4295
|
+
const o = i.dataTable ? a.get(i.dataTable) : void 0, m = i.data ?? (o == null ? void 0 : o.rows) ?? [];
|
|
4296
|
+
if (!m.length)
|
|
4293
4297
|
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
|
|
4298
|
+
const d = i.type === "pie" ? [] : m.map((v) => String(v[i.x] ?? "")), u = Yr(d), p = Math.max(320, 200 + u.axisHeight);
|
|
4295
4299
|
return /* @__PURE__ */ r(V, { children: [
|
|
4296
4300
|
/* @__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:
|
|
4301
|
+
/* @__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
4302
|
/* @__PURE__ */ e(an, { strokeDasharray: "3 3", stroke: "#f3f4f6" }),
|
|
4299
4303
|
/* @__PURE__ */ e(
|
|
4300
4304
|
rn,
|
|
@@ -4302,9 +4306,9 @@ function Gr({ output: t }) {
|
|
|
4302
4306
|
dataKey: i.x,
|
|
4303
4307
|
tick: { fill: "#6b7280", fontSize: 12 },
|
|
4304
4308
|
interval: 0,
|
|
4305
|
-
angle:
|
|
4306
|
-
textAnchor:
|
|
4307
|
-
height:
|
|
4309
|
+
angle: u.angle,
|
|
4310
|
+
textAnchor: u.angle === 0 ? "middle" : "end",
|
|
4311
|
+
height: u.axisHeight
|
|
4308
4312
|
}
|
|
4309
4313
|
),
|
|
4310
4314
|
/* @__PURE__ */ e(sn, { tick: { fill: "#6b7280", fontSize: 12 }, tickFormatter: Nn }),
|
|
@@ -4312,8 +4316,8 @@ function Gr({ output: t }) {
|
|
|
4312
4316
|
/* @__PURE__ */ e(Aa, { type: "monotone", dataKey: i.y, stroke: "#3b82f6", strokeWidth: 2, dot: { r: 3 } })
|
|
4313
4317
|
] }) : i.type === "pie" ? /* @__PURE__ */ r(Ta, { children: [
|
|
4314
4318
|
/* @__PURE__ */ e(It, { formatter: (v) => ct(v, Ot(o, i.y)) }),
|
|
4315
|
-
/* @__PURE__ */ e(Pa, { data:
|
|
4316
|
-
] }) : /* @__PURE__ */ r(Ia, { data:
|
|
4319
|
+
/* @__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)) })
|
|
4320
|
+
] }) : /* @__PURE__ */ r(Ia, { data: m, margin: { top: 10, right: 20, left: 0, bottom: 0 }, children: [
|
|
4317
4321
|
/* @__PURE__ */ e(an, { strokeDasharray: "3 3", stroke: "#f3f4f6" }),
|
|
4318
4322
|
/* @__PURE__ */ e(
|
|
4319
4323
|
rn,
|
|
@@ -4321,9 +4325,9 @@ function Gr({ output: t }) {
|
|
|
4321
4325
|
dataKey: i.x,
|
|
4322
4326
|
tick: { fill: "#6b7280", fontSize: 12 },
|
|
4323
4327
|
interval: 0,
|
|
4324
|
-
angle:
|
|
4325
|
-
textAnchor:
|
|
4326
|
-
height:
|
|
4328
|
+
angle: u.angle,
|
|
4329
|
+
textAnchor: u.angle === 0 ? "middle" : "end",
|
|
4330
|
+
height: u.axisHeight
|
|
4327
4331
|
}
|
|
4328
4332
|
),
|
|
4329
4333
|
/* @__PURE__ */ e(sn, { tick: { fill: "#6b7280", fontSize: 12 }, tickFormatter: Nn }),
|
|
@@ -4334,7 +4338,7 @@ function Gr({ output: t }) {
|
|
|
4334
4338
|
}),
|
|
4335
4339
|
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
4340
|
/* @__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((
|
|
4341
|
+
/* @__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
4342
|
] }) }) }, i.id))
|
|
4339
4343
|
] });
|
|
4340
4344
|
}
|
|
@@ -4567,7 +4571,7 @@ function Xr() {
|
|
|
4567
4571
|
const t = We(), { data: n, isLoading: a } = ie({
|
|
4568
4572
|
queryKey: ["setup-status"],
|
|
4569
4573
|
queryFn: () => O.setupStatus()
|
|
4570
|
-
}), [s, l] = N(""), [i, c] = N("USD"), [o,
|
|
4574
|
+
}), [s, l] = N(""), [i, c] = N("USD"), [o, m] = N("quick"), [d, u] = N(!1), [p, v] = N(null), w = me({
|
|
4571
4575
|
mutationFn: () => O.createCompany({ name: s, currency: i })
|
|
4572
4576
|
}), g = me({
|
|
4573
4577
|
mutationFn: () => O.seedDemo()
|
|
@@ -4579,23 +4583,22 @@ function Xr() {
|
|
|
4579
4583
|
if (await w.mutateAsync(), o === "history") {
|
|
4580
4584
|
const b = await y.mutateAsync();
|
|
4581
4585
|
v(b.stats);
|
|
4582
|
-
} else
|
|
4583
|
-
|
|
4584
|
-
t.invalidateQueries({ queryKey: ["setup-status"] }), m(!0);
|
|
4586
|
+
} else o === "quick" && await g.mutateAsync();
|
|
4587
|
+
t.invalidateQueries({ queryKey: ["setup-status"] }), u(!0);
|
|
4585
4588
|
} catch {
|
|
4586
4589
|
}
|
|
4587
4590
|
};
|
|
4588
4591
|
if (a)
|
|
4589
4592
|
return /* @__PURE__ */ e("p", { className: "text-gray-500", children: "Loading..." });
|
|
4590
|
-
if (n != null && n.setup_complete && !
|
|
4593
|
+
if (n != null && n.setup_complete && !d)
|
|
4591
4594
|
return /* @__PURE__ */ r("div", { className: "space-y-6", children: [
|
|
4592
4595
|
/* @__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
4596
|
/* @__PURE__ */ e(ye, { to: "/", className: "text-blue-600 hover:text-blue-800 text-sm font-medium", children: "Go to Dashboard" })
|
|
4594
4597
|
] });
|
|
4595
|
-
if (
|
|
4598
|
+
if (d)
|
|
4596
4599
|
return /* @__PURE__ */ e("div", { className: "space-y-6", children: /* @__PURE__ */ e(V, { children: /* @__PURE__ */ r("div", { className: "py-8 text-center", children: [
|
|
4597
4600
|
/* @__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:
|
|
4601
|
+
/* @__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
4602
|
p && /* @__PURE__ */ r("div", { className: "mx-auto mt-6 max-w-sm text-left", children: [
|
|
4600
4603
|
/* @__PURE__ */ e("p", { className: "mb-2 text-sm font-medium text-gray-700", children: "Generated documents:" }),
|
|
4601
4604
|
/* @__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 +4642,7 @@ function Xr() {
|
|
|
4639
4642
|
name: "seed-mode",
|
|
4640
4643
|
value: "quick",
|
|
4641
4644
|
checked: o === "quick",
|
|
4642
|
-
onChange: () =>
|
|
4645
|
+
onChange: () => m("quick"),
|
|
4643
4646
|
className: "mt-1"
|
|
4644
4647
|
}
|
|
4645
4648
|
),
|
|
@@ -4656,7 +4659,7 @@ function Xr() {
|
|
|
4656
4659
|
name: "seed-mode",
|
|
4657
4660
|
value: "history",
|
|
4658
4661
|
checked: o === "history",
|
|
4659
|
-
onChange: () =>
|
|
4662
|
+
onChange: () => m("history"),
|
|
4660
4663
|
className: "mt-1"
|
|
4661
4664
|
}
|
|
4662
4665
|
),
|
|
@@ -4664,6 +4667,23 @@ function Xr() {
|
|
|
4664
4667
|
/* @__PURE__ */ e("div", { className: "text-sm font-medium text-gray-900", children: "Simulate 3 years of history" }),
|
|
4665
4668
|
/* @__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
4669
|
] })
|
|
4670
|
+
] }),
|
|
4671
|
+
/* @__PURE__ */ r("label", { className: "flex cursor-pointer items-start gap-3 rounded-md border border-gray-200 p-3 hover:bg-gray-50", children: [
|
|
4672
|
+
/* @__PURE__ */ e(
|
|
4673
|
+
"input",
|
|
4674
|
+
{
|
|
4675
|
+
type: "radio",
|
|
4676
|
+
name: "seed-mode",
|
|
4677
|
+
value: "none",
|
|
4678
|
+
checked: o === "none",
|
|
4679
|
+
onChange: () => m("none"),
|
|
4680
|
+
className: "mt-1"
|
|
4681
|
+
}
|
|
4682
|
+
),
|
|
4683
|
+
/* @__PURE__ */ r("div", { children: [
|
|
4684
|
+
/* @__PURE__ */ e("div", { className: "text-sm font-medium text-gray-900", children: "Create empty company, no demo data" }),
|
|
4685
|
+
/* @__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." })
|
|
4686
|
+
] })
|
|
4667
4687
|
] })
|
|
4668
4688
|
] }),
|
|
4669
4689
|
/* @__PURE__ */ e("div", { className: "pt-2", children: /* @__PURE__ */ e(
|
|
@@ -4671,7 +4691,7 @@ function Xr() {
|
|
|
4671
4691
|
{
|
|
4672
4692
|
onClick: I,
|
|
4673
4693
|
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"
|
|
4694
|
+
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
4695
|
}
|
|
4676
4696
|
) })
|
|
4677
4697
|
] }) })
|
|
@@ -4857,8 +4877,8 @@ const ts = [
|
|
|
4857
4877
|
];
|
|
4858
4878
|
function ns() {
|
|
4859
4879
|
const t = Oe(), { t: n } = Z(), { sessions: a, createSession: s } = tt(), l = async (c) => {
|
|
4860
|
-
var
|
|
4861
|
-
let o = ((
|
|
4880
|
+
var m;
|
|
4881
|
+
let o = ((m = a[0]) == null ? void 0 : m.id) || "";
|
|
4862
4882
|
if (!o)
|
|
4863
4883
|
try {
|
|
4864
4884
|
o = (await s()).id;
|
|
@@ -5151,7 +5171,7 @@ function wn(t) {
|
|
|
5151
5171
|
});
|
|
5152
5172
|
}
|
|
5153
5173
|
function Cn() {
|
|
5154
|
-
const { t } = Z(), { sessionId: n } =
|
|
5174
|
+
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
5175
|
connectionStatus: L,
|
|
5156
5176
|
connectionVersion: C,
|
|
5157
5177
|
createSession: b,
|
|
@@ -5215,7 +5235,7 @@ function Cn() {
|
|
|
5215
5235
|
});
|
|
5216
5236
|
}, [n, Qe, nt, k]), S = H(null);
|
|
5217
5237
|
re(() => {
|
|
5218
|
-
|
|
5238
|
+
d(""), oe.current = null, ne.current += 1, n && Wn(n);
|
|
5219
5239
|
const f = s.state;
|
|
5220
5240
|
f != null && f.prefillMessage && S.current !== f ? (S.current = f, o(f.prefillMessage), window.setTimeout(() => {
|
|
5221
5241
|
var D;
|
|
@@ -5249,8 +5269,8 @@ function Cn() {
|
|
|
5249
5269
|
Be.current = ee < 80;
|
|
5250
5270
|
}
|
|
5251
5271
|
re(() => {
|
|
5252
|
-
!n || !he || !i || oe.current !== n && (oe.current = n,
|
|
5253
|
-
oe.current = null,
|
|
5272
|
+
!n || !he || !i || oe.current !== n && (oe.current = n, d(""), h(n).catch((f) => {
|
|
5273
|
+
oe.current = null, d(f instanceof Error ? f.message : t("chat.demoError"));
|
|
5254
5274
|
}));
|
|
5255
5275
|
}, [n, he, i, h]), re(() => {
|
|
5256
5276
|
!n || !i || qe !== "complete" || (o(""), a(`/chat/${n}`, { replace: !0 }));
|
|
@@ -5323,7 +5343,7 @@ function Cn() {
|
|
|
5323
5343
|
}, Ye = (f) => {
|
|
5324
5344
|
const D = f.relatedTarget;
|
|
5325
5345
|
(!D || !f.currentTarget.contains(D)) && y(!1);
|
|
5326
|
-
},
|
|
5346
|
+
}, de = (f) => {
|
|
5327
5347
|
f.preventDefault(), y(!1), f.dataTransfer.files && f.dataTransfer.files.length > 0 && ve(f.dataTransfer.files);
|
|
5328
5348
|
}, P = (f) => {
|
|
5329
5349
|
const D = [];
|
|
@@ -5333,11 +5353,11 @@ function Cn() {
|
|
|
5333
5353
|
ae && D.push(ae);
|
|
5334
5354
|
}
|
|
5335
5355
|
D.length > 0 && (f.preventDefault(), ve(D));
|
|
5336
|
-
}, R =
|
|
5356
|
+
}, R = u.some((f) => f.uploading), M = u.some((f) => f.error), $ = u.filter((f) => f.uploadedId && !f.error).map((f) => f.uploadedId);
|
|
5337
5357
|
function Te() {
|
|
5338
5358
|
const f = c.trim();
|
|
5339
5359
|
if (n && !(!f && $.length === 0) && !R && q(n, f, $.length > 0 ? $ : void 0)) {
|
|
5340
|
-
for (const D of
|
|
5360
|
+
for (const D of u)
|
|
5341
5361
|
D.previewUrl && URL.revokeObjectURL(D.previewUrl);
|
|
5342
5362
|
p([]), w(""), o("");
|
|
5343
5363
|
}
|
|
@@ -5351,7 +5371,7 @@ function Cn() {
|
|
|
5351
5371
|
className: "relative -m-4 h-[calc(100%+2rem)] overflow-hidden md:-m-6 md:h-[calc(100%+3rem)]",
|
|
5352
5372
|
onDragOver: F,
|
|
5353
5373
|
onDragLeave: Ye,
|
|
5354
|
-
onDrop:
|
|
5374
|
+
onDrop: de,
|
|
5355
5375
|
children: [
|
|
5356
5376
|
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
5377
|
/* @__PURE__ */ e(
|
|
@@ -5375,7 +5395,7 @@ function Cn() {
|
|
|
5375
5395
|
children: t(Qe ? "common.loading" : "chat.loadOlder")
|
|
5376
5396
|
}
|
|
5377
5397
|
) }),
|
|
5378
|
-
|
|
5398
|
+
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
5399
|
Re.length === 0 && qe !== "running" && !i && /* @__PURE__ */ r("div", { className: "py-20 text-center", children: [
|
|
5380
5400
|
/* @__PURE__ */ e("h3", { className: "text-lg font-semibold text-fg-muted", children: t("chat.title") }),
|
|
5381
5401
|
/* @__PURE__ */ e("p", { className: "mt-2 text-sm text-fg-muted", children: t("chat.subtitle") }),
|
|
@@ -5397,7 +5417,7 @@ function Cn() {
|
|
|
5397
5417
|
f
|
|
5398
5418
|
)) })
|
|
5399
5419
|
] }),
|
|
5400
|
-
Re.map((f, D) => /* @__PURE__ */ e(
|
|
5420
|
+
Re.map((f, D) => /* @__PURE__ */ e(ds, { message: f }, D)),
|
|
5401
5421
|
/* @__PURE__ */ e("div", { ref: K })
|
|
5402
5422
|
]
|
|
5403
5423
|
}
|
|
@@ -5410,7 +5430,7 @@ function Cn() {
|
|
|
5410
5430
|
ref: le,
|
|
5411
5431
|
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
5432
|
children: /* @__PURE__ */ r("div", { className: "mx-auto max-w-3xl", children: [
|
|
5413
|
-
|
|
5433
|
+
u.length > 0 && /* @__PURE__ */ e("div", { className: "mb-2 flex flex-wrap gap-2", children: u.map((f) => /* @__PURE__ */ r(
|
|
5414
5434
|
"div",
|
|
5415
5435
|
{
|
|
5416
5436
|
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 +5494,7 @@ function Cn() {
|
|
|
5474
5494
|
var f;
|
|
5475
5495
|
return (f = I.current) == null ? void 0 : f.click();
|
|
5476
5496
|
},
|
|
5477
|
-
disabled: !he || !n || xe || Ae ||
|
|
5497
|
+
disabled: !he || !n || xe || Ae || u.length >= zt,
|
|
5478
5498
|
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
5499
|
title: t("chat.attachTitle"),
|
|
5480
5500
|
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 +5555,13 @@ function cs({ attachments: t }) {
|
|
|
5535
5555
|
);
|
|
5536
5556
|
}) });
|
|
5537
5557
|
}
|
|
5538
|
-
function
|
|
5558
|
+
function ds({ message: t }) {
|
|
5539
5559
|
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
5560
|
t.content,
|
|
5541
5561
|
/* @__PURE__ */ e(cs, { attachments: t.attachments }),
|
|
5542
5562
|
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
5563
|
] }) }) : 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(
|
|
5564
|
+
/* @__PURE__ */ e(us, { content: t.content }),
|
|
5545
5565
|
t.timestamp && /* @__PURE__ */ e("div", { className: "mt-1 text-right text-[10px] text-fg-muted", title: wn(t.timestamp), children: kn(t.timestamp) })
|
|
5546
5566
|
] }) }) : 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
5567
|
/* @__PURE__ */ e("span", { className: "inline-block h-1.5 w-1.5 animate-pulse rounded-full bg-brand" }),
|
|
@@ -5581,7 +5601,7 @@ function us({ message: t }) {
|
|
|
5581
5601
|
}
|
|
5582
5602
|
) }) : 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
5603
|
}
|
|
5584
|
-
function
|
|
5604
|
+
function us({ content: t }) {
|
|
5585
5605
|
const n = t.split(`
|
|
5586
5606
|
`), a = [];
|
|
5587
5607
|
let s = !1, l = [];
|
|
@@ -5664,20 +5684,20 @@ function ps(t, n) {
|
|
|
5664
5684
|
let c = 0;
|
|
5665
5685
|
for (; (l = i.exec(t)) !== null; ) {
|
|
5666
5686
|
const o = l.index;
|
|
5667
|
-
let
|
|
5668
|
-
for (;
|
|
5669
|
-
|
|
5670
|
-
o > s && a.push(t.slice(s, o)), a.push(Xn(
|
|
5687
|
+
let m = l[0], d = "";
|
|
5688
|
+
for (; m.length > 0 && /[.,;:!?]$/.test(m); )
|
|
5689
|
+
d = m.slice(-1) + d, m = m.slice(0, -1);
|
|
5690
|
+
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
5691
|
}
|
|
5672
5692
|
return s < t.length && a.push(t.slice(s)), a.length > 0 ? a : [t];
|
|
5673
5693
|
}
|
|
5674
5694
|
function hs() {
|
|
5675
|
-
const t = Oe(), [n] = wt(), { user: a, login: s, register: l } = mt(), { t: i } = Z(), c = n.get("invite") || "", [o,
|
|
5695
|
+
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
5696
|
re(() => {
|
|
5677
5697
|
a && a.role !== "public_manager" && t("/", { replace: !0 });
|
|
5678
5698
|
}, [a, t]), re(() => {
|
|
5679
5699
|
O.authSetupStatus().then((q) => {
|
|
5680
|
-
|
|
5700
|
+
u(q.registration_open), q.registration_open && m("register");
|
|
5681
5701
|
}).catch(() => {
|
|
5682
5702
|
}).finally(() => v(!1));
|
|
5683
5703
|
}, []);
|
|
@@ -5706,7 +5726,7 @@ function hs() {
|
|
|
5706
5726
|
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
5727
|
/* @__PURE__ */ r("div", { className: "text-center", children: [
|
|
5708
5728
|
/* @__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(
|
|
5729
|
+
/* @__PURE__ */ e("p", { className: "mt-1 text-sm text-fg-muted", children: i(d ? "login.taglineFirstRun" : o === "register" ? "login.taglineRegister" : "login.taglineSignIn") }),
|
|
5710
5730
|
(a == null ? void 0 : a.role) === "public_manager" && /* @__PURE__ */ e("p", { className: "mt-2 text-xs text-amber-700", children: i("login.demoBanner") })
|
|
5711
5731
|
] }),
|
|
5712
5732
|
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 +5770,7 @@ function hs() {
|
|
|
5750
5770
|
required: !0
|
|
5751
5771
|
}
|
|
5752
5772
|
),
|
|
5753
|
-
/* @__PURE__ */ e(X, { type: "submit", className: "w-full", children: i(o === "register" ?
|
|
5773
|
+
/* @__PURE__ */ e(X, { type: "submit", className: "w-full", children: i(o === "register" ? d ? "login.createAdmin" : "login.register" : "login.signIn") })
|
|
5754
5774
|
] }) }),
|
|
5755
5775
|
(a == null ? void 0 : a.role) === "public_manager" && /* @__PURE__ */ e(V, { children: /* @__PURE__ */ r("div", { className: "space-y-3", children: [
|
|
5756
5776
|
/* @__PURE__ */ r("div", { children: [
|
|
@@ -5767,14 +5787,14 @@ function hs() {
|
|
|
5767
5787
|
}
|
|
5768
5788
|
)
|
|
5769
5789
|
] }) }),
|
|
5770
|
-
!
|
|
5790
|
+
!d && !c && /* @__PURE__ */ e("p", { className: "text-center text-sm text-fg-muted", children: o === "login" ? /* @__PURE__ */ r(Ne, { children: [
|
|
5771
5791
|
i("login.haveInvite"),
|
|
5772
5792
|
" ",
|
|
5773
|
-
/* @__PURE__ */ e("button", { onClick: () =>
|
|
5793
|
+
/* @__PURE__ */ e("button", { onClick: () => m("register"), className: "font-medium text-brand transition-colors hover:text-brand/80", children: i("login.registerLink") })
|
|
5774
5794
|
] }) : /* @__PURE__ */ r(Ne, { children: [
|
|
5775
5795
|
i("login.alreadyHaveAccount"),
|
|
5776
5796
|
" ",
|
|
5777
|
-
/* @__PURE__ */ e("button", { onClick: () =>
|
|
5797
|
+
/* @__PURE__ */ e("button", { onClick: () => m("login"), className: "font-medium text-brand transition-colors hover:text-brand/80", children: i("login.signInLink") })
|
|
5778
5798
|
] }) })
|
|
5779
5799
|
] }) });
|
|
5780
5800
|
}
|
|
@@ -5811,11 +5831,11 @@ function An() {
|
|
|
5811
5831
|
return { type: "sales", party: "", amount: "", due_date: "", remarks: "" };
|
|
5812
5832
|
}
|
|
5813
5833
|
function ys() {
|
|
5814
|
-
const t = Oe(), n = We(), [a, s] = N(""), [l, i] = N((/* @__PURE__ */ new Date()).toISOString().split("T")[0]), [c, o] = N(""), [
|
|
5834
|
+
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
5835
|
mutationFn: () => O.importAccountBalances({
|
|
5816
5836
|
company: a,
|
|
5817
5837
|
posting_date: l,
|
|
5818
|
-
entries:
|
|
5838
|
+
entries: m.filter((h) => h.account && (h.debit || h.credit)).map((h) => ({
|
|
5819
5839
|
account: h.account,
|
|
5820
5840
|
debit: parseFloat(h.debit) || 0,
|
|
5821
5841
|
credit: parseFloat(h.credit) || 0,
|
|
@@ -5829,7 +5849,7 @@ function ys() {
|
|
|
5829
5849
|
company: a,
|
|
5830
5850
|
posting_date: l,
|
|
5831
5851
|
warehouse: c,
|
|
5832
|
-
items:
|
|
5852
|
+
items: u.filter((h) => h.item_code && h.qty).map((h) => ({
|
|
5833
5853
|
item_code: h.item_code,
|
|
5834
5854
|
qty: parseFloat(h.qty) || 0,
|
|
5835
5855
|
rate: parseFloat(h.rate) || 0
|
|
@@ -5870,19 +5890,19 @@ function ys() {
|
|
|
5870
5890
|
/* @__PURE__ */ e("th", { className: "px-2 py-2 text-right font-medium text-gray-500", children: "Debit" }),
|
|
5871
5891
|
/* @__PURE__ */ e("th", { className: "px-2 py-2 text-right font-medium text-gray-500", children: "Credit" })
|
|
5872
5892
|
] }) }),
|
|
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(
|
|
5893
|
+
/* @__PURE__ */ e("tbody", { children: m.map((h, A) => /* @__PURE__ */ r("tr", { children: [
|
|
5894
|
+
/* @__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: "" }) }),
|
|
5895
|
+
/* @__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
5896
|
/* @__PURE__ */ e("option", { value: "", children: "—" }),
|
|
5877
5897
|
/* @__PURE__ */ e("option", { value: "Customer", children: "Customer" }),
|
|
5878
5898
|
/* @__PURE__ */ e("option", { value: "Supplier", children: "Supplier" })
|
|
5879
5899
|
] }) }),
|
|
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(
|
|
5900
|
+
/* @__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" }) }),
|
|
5901
|
+
/* @__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" }) }),
|
|
5902
|
+
/* @__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
5903
|
] }, A)) })
|
|
5884
5904
|
] }) }),
|
|
5885
|
-
/* @__PURE__ */ e("div", { className: "mt-2 flex gap-2", children: /* @__PURE__ */ e("button", { onClick: () =>
|
|
5905
|
+
/* @__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
5906
|
/* @__PURE__ */ r("div", { className: "mt-3 flex items-center gap-3", children: [
|
|
5887
5907
|
/* @__PURE__ */ e(X, { onClick: () => I.mutate(), disabled: !a || I.isPending, children: I.isPending ? "Importing..." : "Import Account Balances" }),
|
|
5888
5908
|
I.error && /* @__PURE__ */ e("span", { className: "text-xs text-red-600", children: I.error.message }),
|
|
@@ -5901,13 +5921,13 @@ function ys() {
|
|
|
5901
5921
|
/* @__PURE__ */ e("th", { className: "px-2 py-2 text-right font-medium text-gray-500", children: "Qty" }),
|
|
5902
5922
|
/* @__PURE__ */ e("th", { className: "px-2 py-2 text-right font-medium text-gray-500", children: "Rate" })
|
|
5903
5923
|
] }) }),
|
|
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(
|
|
5924
|
+
/* @__PURE__ */ e("tbody", { children: u.map((h, A) => /* @__PURE__ */ r("tr", { children: [
|
|
5925
|
+
/* @__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 }) }),
|
|
5926
|
+
/* @__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" }) }),
|
|
5927
|
+
/* @__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
5928
|
] }, A)) })
|
|
5909
5929
|
] }) }),
|
|
5910
|
-
/* @__PURE__ */ e("div", { className: "mt-2", children: /* @__PURE__ */ e("button", { onClick: () => p([...
|
|
5930
|
+
/* @__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
5931
|
/* @__PURE__ */ r("div", { className: "mt-3 flex items-center gap-3", children: [
|
|
5912
5932
|
/* @__PURE__ */ e(X, { onClick: () => L.mutate(), disabled: !a || !c || L.isPending, children: L.isPending ? "Importing..." : "Import Stock Balances" }),
|
|
5913
5933
|
L.error && /* @__PURE__ */ e("span", { className: "text-xs text-red-600", children: L.error.message }),
|
|
@@ -5983,10 +6003,10 @@ function fs() {
|
|
|
5983
6003
|
}), { data: l } = ie({
|
|
5984
6004
|
queryKey: ["auth-invites"],
|
|
5985
6005
|
queryFn: () => O.authListInvites()
|
|
5986
|
-
}), [i, c] = N(""), [o,
|
|
6006
|
+
}), [i, c] = N(""), [o, m] = N("viewer"), [d, u] = N(null), p = me({
|
|
5987
6007
|
mutationFn: () => O.authInvite(i, o),
|
|
5988
6008
|
onSuccess: (g) => {
|
|
5989
|
-
|
|
6009
|
+
u(g), c(""), n.invalidateQueries({ queryKey: ["auth-invites"] });
|
|
5990
6010
|
}
|
|
5991
6011
|
}), v = me({
|
|
5992
6012
|
mutationFn: ({ name: g, role: y }) => O.authChangeRole(g, y),
|
|
@@ -6028,7 +6048,7 @@ function fs() {
|
|
|
6028
6048
|
label: "Role",
|
|
6029
6049
|
options: ["viewer", "manager", "admin"],
|
|
6030
6050
|
value: o,
|
|
6031
|
-
onChange: (g) =>
|
|
6051
|
+
onChange: (g) => m(g.target.value)
|
|
6032
6052
|
}
|
|
6033
6053
|
),
|
|
6034
6054
|
/* @__PURE__ */ e(
|
|
@@ -6041,14 +6061,14 @@ function fs() {
|
|
|
6041
6061
|
)
|
|
6042
6062
|
] }),
|
|
6043
6063
|
p.error && /* @__PURE__ */ e("p", { className: "mt-2 text-sm text-red-600", children: p.error.message }),
|
|
6044
|
-
|
|
6064
|
+
d && /* @__PURE__ */ r("div", { className: "mt-3 rounded-md bg-green-50 px-4 py-3 text-sm", children: [
|
|
6045
6065
|
/* @__PURE__ */ e("p", { className: "font-medium text-green-800", children: "Invite created!" }),
|
|
6046
6066
|
/* @__PURE__ */ r("p", { className: "mt-1 text-green-700", children: [
|
|
6047
6067
|
"Share this link:",
|
|
6048
6068
|
" ",
|
|
6049
6069
|
/* @__PURE__ */ r("code", { className: "rounded bg-green-100 px-2 py-0.5 text-xs font-mono", children: [
|
|
6050
6070
|
window.location.origin,
|
|
6051
|
-
|
|
6071
|
+
d.link
|
|
6052
6072
|
] })
|
|
6053
6073
|
] })
|
|
6054
6074
|
] })
|
|
@@ -6144,7 +6164,7 @@ const bs = { save: "Save", saving: "Saving...", submit: "Submit", cancel: "Cance
|
|
|
6144
6164
|
dashboard: Zs,
|
|
6145
6165
|
chat: Xs,
|
|
6146
6166
|
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 = {
|
|
6167
|
+
}, 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
6168
|
common: ni,
|
|
6149
6169
|
language: ai,
|
|
6150
6170
|
header: ri,
|
|
@@ -6153,8 +6173,8 @@ const bs = { save: "Save", saving: "Saving...", submit: "Submit", cancel: "Cance
|
|
|
6153
6173
|
masters: li,
|
|
6154
6174
|
nav: oi,
|
|
6155
6175
|
login: ci,
|
|
6156
|
-
settings:
|
|
6157
|
-
status:
|
|
6176
|
+
settings: di,
|
|
6177
|
+
status: ui,
|
|
6158
6178
|
reports: mi,
|
|
6159
6179
|
masterForm: pi,
|
|
6160
6180
|
fields: hi,
|
|
@@ -6226,12 +6246,12 @@ function Ze(t) {
|
|
|
6226
6246
|
}
|
|
6227
6247
|
function Ci() {
|
|
6228
6248
|
var I, L;
|
|
6229
|
-
const { t } = Z(), [n, a] = N("1h"), { data: s, isLoading: l, isFetching: i, error: c, refetch: o, dataUpdatedAt:
|
|
6249
|
+
const { t } = Z(), [n, a] = N("1h"), { data: s, isLoading: l, isFetching: i, error: c, refetch: o, dataUpdatedAt: m } = ie({
|
|
6230
6250
|
queryKey: ["demo-spend"],
|
|
6231
6251
|
queryFn: () => O.getDemoSpend(),
|
|
6232
6252
|
// Refresh once a minute — demo spend changes slowly; no need to poll harder.
|
|
6233
6253
|
refetchInterval: 6e4
|
|
6234
|
-
}),
|
|
6254
|
+
}), 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
6255
|
return /* @__PURE__ */ r(V, { title: t("settings.demoSpendTitle"), children: [
|
|
6236
6256
|
/* @__PURE__ */ r("div", { className: "flex flex-wrap items-end justify-between gap-4", children: [
|
|
6237
6257
|
/* @__PURE__ */ r("div", { className: "max-w-lg text-sm text-gray-600", children: [
|
|
@@ -6259,7 +6279,7 @@ function Ci() {
|
|
|
6259
6279
|
type: "button",
|
|
6260
6280
|
onClick: () => o(),
|
|
6261
6281
|
disabled: i,
|
|
6262
|
-
title:
|
|
6282
|
+
title: m ? `Last updated ${new Date(m).toLocaleTimeString()}` : "Refresh now",
|
|
6263
6283
|
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
6284
|
children: [
|
|
6265
6285
|
/* @__PURE__ */ e(
|
|
@@ -6290,13 +6310,13 @@ function Ci() {
|
|
|
6290
6310
|
"Failed to load spend data: ",
|
|
6291
6311
|
c.message
|
|
6292
6312
|
] }),
|
|
6293
|
-
|
|
6313
|
+
u && /* @__PURE__ */ r("div", { className: "mt-5 space-y-5", children: [
|
|
6294
6314
|
/* @__PURE__ */ r("div", { children: [
|
|
6295
6315
|
/* @__PURE__ */ r("div", { className: "flex items-baseline justify-between", children: [
|
|
6296
6316
|
/* @__PURE__ */ r("div", { children: [
|
|
6297
6317
|
/* @__PURE__ */ r("div", { className: "text-xs font-medium uppercase tracking-wide text-gray-500", children: [
|
|
6298
6318
|
"Demo spend (avg/hr over ",
|
|
6299
|
-
|
|
6319
|
+
d.label.toLowerCase(),
|
|
6300
6320
|
")"
|
|
6301
6321
|
] }),
|
|
6302
6322
|
/* @__PURE__ */ r("div", { className: "mt-1 text-2xl font-semibold text-gray-900", children: [
|
|
@@ -6311,7 +6331,7 @@ function Ci() {
|
|
|
6311
6331
|
/* @__PURE__ */ r("div", { className: "text-right", children: [
|
|
6312
6332
|
/* @__PURE__ */ e("div", { className: "text-xs font-medium uppercase tracking-wide text-gray-500", children: "Total (all roles)" }),
|
|
6313
6333
|
/* @__PURE__ */ r("div", { className: "mt-1 text-lg font-semibold text-gray-700", children: [
|
|
6314
|
-
Ze(
|
|
6334
|
+
Ze(u.total_usd),
|
|
6315
6335
|
/* @__PURE__ */ r("span", { className: "ml-1 text-xs font-normal text-gray-500", children: [
|
|
6316
6336
|
"(",
|
|
6317
6337
|
Ze(w),
|
|
@@ -6328,18 +6348,18 @@ function Ci() {
|
|
|
6328
6348
|
] })
|
|
6329
6349
|
] }),
|
|
6330
6350
|
/* @__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:
|
|
6351
|
+
/* @__PURE__ */ e(ft, { label: "Demo spend", value: Ze(u.demo_usd) }),
|
|
6352
|
+
/* @__PURE__ */ e(ft, { label: "Calls", value: u.call_count.toLocaleString() }),
|
|
6353
|
+
/* @__PURE__ */ e(ft, { label: "Unique IPs", value: u.unique_ips.toLocaleString() }),
|
|
6334
6354
|
/* @__PURE__ */ e(
|
|
6335
6355
|
ft,
|
|
6336
6356
|
{
|
|
6337
6357
|
label: "Tokens (in/out)",
|
|
6338
|
-
value: `${
|
|
6358
|
+
value: `${u.prompt_tokens.toLocaleString()} / ${u.completion_tokens.toLocaleString()}`
|
|
6339
6359
|
}
|
|
6340
6360
|
)
|
|
6341
6361
|
] }),
|
|
6342
|
-
Object.keys(
|
|
6362
|
+
Object.keys(u.by_provider).length > 0 && /* @__PURE__ */ r("div", { children: [
|
|
6343
6363
|
/* @__PURE__ */ e("div", { className: "mb-2 text-xs font-medium uppercase tracking-wide text-gray-500", children: "By provider" }),
|
|
6344
6364
|
/* @__PURE__ */ e("div", { className: "overflow-hidden rounded-md border border-gray-200", children: /* @__PURE__ */ r("table", { className: "w-full text-sm", children: [
|
|
6345
6365
|
/* @__PURE__ */ e("thead", { className: "bg-gray-50 text-xs uppercase tracking-wide text-gray-500", children: /* @__PURE__ */ r("tr", { children: [
|
|
@@ -6349,7 +6369,7 @@ function Ci() {
|
|
|
6349
6369
|
/* @__PURE__ */ e("th", { className: "px-3 py-2 text-right font-medium", children: "Prompt tok" }),
|
|
6350
6370
|
/* @__PURE__ */ e("th", { className: "px-3 py-2 text-right font-medium", children: "Completion tok" })
|
|
6351
6371
|
] }) }),
|
|
6352
|
-
/* @__PURE__ */ e("tbody", { className: "divide-y divide-gray-100", children: Object.entries(
|
|
6372
|
+
/* @__PURE__ */ e("tbody", { className: "divide-y divide-gray-100", children: Object.entries(u.by_provider).map(([C, b]) => /* @__PURE__ */ r("tr", { children: [
|
|
6353
6373
|
/* @__PURE__ */ e("td", { className: "px-3 py-2 font-medium text-gray-900", children: C }),
|
|
6354
6374
|
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right tabular-nums", children: Ze(b.cost_usd) }),
|
|
6355
6375
|
/* @__PURE__ */ e("td", { className: "px-3 py-2 text-right tabular-nums", children: b.call_count.toLocaleString() }),
|
|
@@ -6394,10 +6414,10 @@ function Di() {
|
|
|
6394
6414
|
}), { data: o } = ie({
|
|
6395
6415
|
queryKey: ["public-manager"],
|
|
6396
6416
|
queryFn: () => O.getPublicManagerStatus()
|
|
6397
|
-
}), [
|
|
6417
|
+
}), [m, d] = N(!1), u = me({
|
|
6398
6418
|
mutationFn: () => O.createPublicManager(),
|
|
6399
6419
|
onSuccess: () => {
|
|
6400
|
-
a.invalidateQueries({ queryKey: ["public-manager"] }),
|
|
6420
|
+
a.invalidateQueries({ queryKey: ["public-manager"] }), d(!1);
|
|
6401
6421
|
}
|
|
6402
6422
|
}), p = me({
|
|
6403
6423
|
mutationFn: () => O.removePublicManager(),
|
|
@@ -6456,23 +6476,23 @@ function Di() {
|
|
|
6456
6476
|
)
|
|
6457
6477
|
] }) : /* @__PURE__ */ r("div", { children: [
|
|
6458
6478
|
/* @__PURE__ */ e("p", { className: "text-sm text-gray-600", children: n("settings.publicInactiveBody") }),
|
|
6459
|
-
|
|
6479
|
+
m ? /* @__PURE__ */ r("div", { className: "mt-3 rounded-lg border border-red-200 bg-red-50 p-4", children: [
|
|
6460
6480
|
/* @__PURE__ */ e("p", { className: "text-sm font-medium text-red-800", children: n("common.areYouSure") }),
|
|
6461
6481
|
/* @__PURE__ */ e("p", { className: "mt-1 text-xs text-red-600", children: n("settings.enableWarning") }),
|
|
6462
6482
|
/* @__PURE__ */ r("div", { className: "mt-3 flex gap-2", children: [
|
|
6463
6483
|
/* @__PURE__ */ e(
|
|
6464
6484
|
"button",
|
|
6465
6485
|
{
|
|
6466
|
-
onClick: () =>
|
|
6467
|
-
disabled:
|
|
6486
|
+
onClick: () => u.mutate(),
|
|
6487
|
+
disabled: u.isPending,
|
|
6468
6488
|
className: "rounded-lg bg-red-600 px-4 py-1.5 text-sm font-medium text-white hover:bg-red-700",
|
|
6469
|
-
children:
|
|
6489
|
+
children: u.isPending ? n("settings.enabling") : n("settings.yesEnable")
|
|
6470
6490
|
}
|
|
6471
6491
|
),
|
|
6472
6492
|
/* @__PURE__ */ e(
|
|
6473
6493
|
"button",
|
|
6474
6494
|
{
|
|
6475
|
-
onClick: () =>
|
|
6495
|
+
onClick: () => d(!1),
|
|
6476
6496
|
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
6497
|
children: n("common.cancel")
|
|
6478
6498
|
}
|
|
@@ -6481,7 +6501,7 @@ function Di() {
|
|
|
6481
6501
|
] }) : /* @__PURE__ */ e(
|
|
6482
6502
|
"button",
|
|
6483
6503
|
{
|
|
6484
|
-
onClick: () =>
|
|
6504
|
+
onClick: () => d(!0),
|
|
6485
6505
|
className: "mt-3 rounded-lg bg-red-600 px-4 py-2 text-sm font-medium text-white hover:bg-red-700",
|
|
6486
6506
|
children: n("settings.enablePublic")
|
|
6487
6507
|
}
|
|
@@ -6565,7 +6585,7 @@ function Zi(t = {}) {
|
|
|
6565
6585
|
const n = t.rootElement ?? document.getElementById("root");
|
|
6566
6586
|
if (!n)
|
|
6567
6587
|
throw new Error('bootstrap: no mount element (pass rootElement or add <div id="root">)');
|
|
6568
|
-
const a = t.queryClient ?? Ii(), s =
|
|
6588
|
+
const a = t.queryClient ?? Ii(), s = ua(Ri());
|
|
6569
6589
|
ia(n).render(
|
|
6570
6590
|
/* @__PURE__ */ e(sa, { children: /* @__PURE__ */ e(la, { client: a, children: /* @__PURE__ */ e(Ea, { children: /* @__PURE__ */ e(ma, { router: s }) }) }) })
|
|
6571
6591
|
);
|