@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 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 ut, useNavigate as Oe, Outlet as ca, Navigate as ua, Link as ye, useSearchParams as wt, useParams as dt, createBrowserRouter as da, RouterProvider as ma } from "react-router-dom";
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((d) => a(d)).catch(() => a(null)).finally(() => l(!1));
180
+ O.authMe().then((m) => a(m)).catch(() => a(null)).finally(() => l(!1));
181
181
  }, []);
182
- const i = we(async (d, u) => {
183
- const m = await O.authLogin(d, u);
184
- return a(m), m;
185
- }, []), c = we(async (d, u, m, p) => {
186
- const v = await O.authRegister({ email: d, full_name: u, password: m, invite_token: p });
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 un(t) {
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({}), [d, u] = N({}), [m, 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);
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, ue = typeof F.type == "string" ? F.type : null, P = typeof F.session_id == "string" ? F.session_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 && (ue === "error" ? (z.current.delete(Ye), R.reject(new Error(String(F.content || "Request failed.")))) : ue === R.expectedType && (z.current.delete(Ye), R.resolve(F)));
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 (ue === "sessions_list") {
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 ? (un(be), null) : f;
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 (ue === "session_created") {
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 (ue === "session_deleted" && P) {
409
- un(P), oe((M) => M.filter(($) => $.id !== P)), i((M) => {
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
- }), u((M) => {
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 (ue === "history_loaded" && P) {
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]: $ })), u((f) => ({ ...f, [P]: Te })), p((f) => ({ ...f, [P]: !1 }));
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 (ue === "history_cleared" && P) {
458
- i((R) => ({ ...R, [P]: [] })), o((R) => ({ ...R, [P]: !1 })), u((R) => ({ ...R, [P]: null })), p((R) => ({ ...R, [P]: !1 })), se(P, !1), le(P, "idle"), ge(P, null);
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 (ue === "message_added" && P) {
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 (ue === "demo_started" && P) {
470
+ if (de === "demo_started" && P) {
471
471
  le(P, "running"), ge(P, null);
472
472
  return;
473
473
  }
474
- if (ue === "demo_typing" && P) {
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 (ue === "demo_replay_complete" && P) {
482
+ if (de === "demo_replay_complete" && P) {
483
483
  le(P, "complete"), ge(P, null);
484
484
  return;
485
485
  }
486
- if (ue === "navigation_flash") {
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 (ue === "session_title_updated" && P) {
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 (ue === "thinking" && P) {
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 (ue === "llm_provider" && P) {
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 (ue === "tool_call" && P) {
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 (ue === "tool_result" && P) {
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 (ue === "complete" && P) {
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 (ue === "error") {
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 (m[S]) return;
636
- const G = d[S];
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 ? !!m[S] : !1;
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 dn(t) {
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), dn(c), !i;
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), dn(c), !0;
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 = ut(), s = Oe(), { t: l } = Z(), { sessions: i, createSession: c, deleteSession: o } = tt(), d = async () => {
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 m = await c();
897
- s(`/chat/${m.id}`);
896
+ const u = await c();
897
+ s(`/chat/${u.id}`);
898
898
  } catch {
899
899
  }
900
- }, u = async (m, p) => {
901
- m.preventDefault(), m.stopPropagation();
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: d,
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((m) => {
934
- const p = a.pathname === `/chat/${m.id}`;
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/${m.id}`,
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: m.title
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) => u(v, m.id),
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
- ] }, m.id);
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 = ut(), l = Oe(), i = We(), { t: c } = Z(), { navigationFlash: o, sessions: d, createSession: u } = tt(), m = (o == null ? void 0 : o.group) === "Custom Analytics", p = Jt["Custom Analytics"], { data: v } = ie({
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 = d[0]) == null ? void 0 : b.id) || "";
990
+ let C = ((b = m[0]) == null ? void 0 : b.id) || "";
991
991
  if (!C)
992
992
  try {
993
- C = (await u()).id;
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
- m && p
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) => /* @__PURE__ */ e("li", { className: "relative", children: /* @__PURE__ */ e(
1081
- kt,
1082
- {
1083
- to: o.path,
1084
- className: ({ isActive: d }) => De(
1085
- "relative block px-4 py-1.5 pl-10 text-sm transition-all duration-300",
1086
- !d && "text-fg-muted hover:bg-surface-subtle hover:text-fg",
1087
- d && "bg-surface-subtle font-medium text-fg",
1088
- (l == null ? void 0 : l.group) === t.label && (l == null ? void 0 : l.item) === o.label && c
1089
- ),
1090
- children: ({ isActive: d }) => /* @__PURE__ */ r(Ne, { children: [
1091
- d && /* @__PURE__ */ e(Yt, {}),
1092
- s(`nav.items.${o.label}`, { defaultValue: o.label })
1093
- ] })
1094
- }
1095
- ) }, o.path)) })
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
- const d = Fa();
1113
- return a ? d.map((u) => ({
1114
- ...u,
1115
- items: u.items.filter((m) => {
1116
- const p = Ga[m.path];
1117
- return p ? a[p] !== "0" : !0;
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((d) => /* @__PURE__ */ e(Ua, { group: d }, d.label))
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 } = ut(), { user: n, logout: a } = mt(), { navigationFlash: s } = tt(), { t: l } = Z(), i = Wa(t, l), [c, o] = N(!1);
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 d = s ? Jt[s.group] : null;
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
- d
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(ua, { to: "/login", replace: !0 });
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
- (d) => {
1480
- const u = new URLSearchParams(d);
1481
- return o === n || o === "" || o == null ? u.delete(t) : u.set(t, String(o)), u;
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((d) => {
2238
- const { value: u, label: m } = sr(d);
2239
- return /* @__PURE__ */ e("option", { value: u, children: m }, u);
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 ur({
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, d] = N(!1), { data: u } = ie({
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: (m) => {
2314
- c(m.target.value), d(!0);
2317
+ onChange: (u) => {
2318
+ c(u.target.value), m(!0);
2315
2319
  },
2316
- onFocus: () => d(!0),
2317
- onBlur: () => setTimeout(() => d(!1), 200)
2320
+ onFocus: () => m(!0),
2321
+ onBlur: () => setTimeout(() => m(!1), 200)
2318
2322
  }
2319
2323
  ),
2320
- o && u && u.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: u.map((m) => /* @__PURE__ */ e(
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(m.name), c(m.name), d(!1);
2329
+ a(u.name), c(u.name), m(!1);
2326
2330
  },
2327
- children: m.name
2331
+ children: u.name
2328
2332
  },
2329
- m.name
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(), d = s || !!t.readOnly, u = () => i ? null : /* @__PURE__ */ e(cr, { label: o(`fields.${t.label}`, { defaultValue: t.label }), hint: t.hint }), m = t.type === "select" && t.optionsSource === "currency", p = lr(void 0, m);
2344
- if (d) {
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(u, {}),
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(u, {}),
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(u, {}),
2373
+ /* @__PURE__ */ e(d, {}),
2370
2374
  /* @__PURE__ */ e(
2371
- ur,
2375
+ dr,
2372
2376
  {
2373
2377
  field: g,
2374
2378
  value: n ?? "",
2375
2379
  onChange: a,
2376
- disabled: d,
2380
+ disabled: m,
2377
2381
  hideLabel: !0
2378
2382
  }
2379
2383
  )
2380
2384
  ] });
2381
2385
  }
2382
- if (t.type === "select" && (t.options || m)) {
2383
- const g = m ? n && !p.includes(n) ? [n, ...p] : p : t.options;
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(u, {}),
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(u, {}),
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(u, {}),
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 dr({
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 = (u, m, p) => {
2436
+ const { t: i } = Z(), c = (d, u, p) => {
2433
2437
  const v = n.map(
2434
- (w, g) => g === u ? { ...w, [m]: p } : w
2438
+ (w, g) => g === d ? { ...w, [u]: p } : w
2435
2439
  );
2436
2440
  a(v);
2437
2441
  }, o = () => {
2438
- const u = {};
2439
- t.fields.forEach((m) => {
2440
- u[m.name] = m.default ?? (m.type === "number" || m.type === "currency" ? 0 : "");
2441
- }), a([...n, u]);
2442
- }, d = (u) => {
2443
- a(n.filter((m, p) => p !== u));
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((u) => /* @__PURE__ */ e(
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.${u.label}`, { defaultValue: u.label })
2457
+ children: i(`fields.${d.label}`, { defaultValue: d.label })
2454
2458
  },
2455
- u.name
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((u, m) => /* @__PURE__ */ r("tr", { children: [
2460
- /* @__PURE__ */ e("td", { className: "px-2 py-1 text-fg-muted", children: m + 1 }),
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: u[p.name],
2466
- onChange: (v) => c(m, p.name, v),
2469
+ value: d[p.name],
2470
+ onChange: (v) => c(u, p.name, v),
2467
2471
  readOnly: s,
2468
- rowData: u,
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: () => d(m),
2482
+ onClick: () => m(u),
2479
2483
  children: "Remove"
2480
2484
  }
2481
2485
  ) })
2482
- ] }, m)) })
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: d,
2497
- onConvert: u
2500
+ onCancel: m,
2501
+ onConvert: d
2498
2502
  }) {
2499
- const { t: m } = Z();
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: m("common.pdf") }),
2504
- s < 1 && /* @__PURE__ */ e(X, { onClick: c, disabled: l, children: m(l ? "common.saving" : "common.save") }),
2505
- !t && i.canSubmit && s === 0 && /* @__PURE__ */ e(X, { variant: "secondary", onClick: o, children: m("common.submit") }),
2506
- !t && i.canCancel && s === 1 && /* @__PURE__ */ e(X, { variant: "danger", onClick: d, children: m("common.cancelDoc") }),
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: () => u(v.targetDoctype),
2512
- children: m(`conversions.${v.label}`, { defaultValue: v.label })
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 } = dt(), a = Oe(), s = We(), { t: l } = Z(), i = Qn(t ?? ""), c = !n, [o, d] = N({}), [u, m] = N(!1), { data: p, isLoading: v } = ie({
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 || u) return;
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 && d((Q) => ({ ...Q, currency: _ }));
2567
+ _ && _ !== o.currency && m((Q) => ({ ...Q, currency: _ }));
2564
2568
  }, [
2565
2569
  c,
2566
2570
  w,
2567
- u,
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, d(_);
2580
- } else p && d(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] }), d(_);
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
- d(_), s.invalidateQueries({ queryKey: ["document", t, n] }), s.invalidateQueries({ queryKey: ["documents", t] });
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
- d(_), s.invalidateQueries({ queryKey: ["document", t, n] }), s.invalidateQueries({ queryKey: ["documents", t] });
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" && m(!0), d((oe) => {
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
- d((oe) => {
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
- dr,
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 de(t) {
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 = de(/* @__PURE__ */ new Date());
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: () => [de(Hn(/* @__PURE__ */ new Date())), de(pr(/* @__PURE__ */ new Date()))]
2759
+ range: () => [ue(Hn(/* @__PURE__ */ new Date())), ue(pr(/* @__PURE__ */ new Date()))]
2756
2760
  },
2757
2761
  {
2758
2762
  label: "This Month",
2759
- range: () => [de(gn(/* @__PURE__ */ new Date())), de(vt(/* @__PURE__ */ new Date()))]
2763
+ range: () => [ue(gn(/* @__PURE__ */ new Date())), ue(vt(/* @__PURE__ */ new Date()))]
2760
2764
  },
2761
2765
  {
2762
2766
  label: "This Quarter",
2763
- range: () => [de(Ut(/* @__PURE__ */ new Date())), de(Gt(/* @__PURE__ */ new Date()))]
2767
+ range: () => [ue(Ut(/* @__PURE__ */ new Date())), ue(Gt(/* @__PURE__ */ new Date()))]
2764
2768
  },
2765
2769
  {
2766
2770
  label: "This Year",
2767
- range: () => [de(yn(/* @__PURE__ */ new Date())), de(Nt(/* @__PURE__ */ new Date()))]
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 [de(gn(n)), de(vt(n))];
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 [de(Ut(n)), de(Gt(n))];
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 [de(yn(t)), de(Nt(t))];
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: () => de(/* @__PURE__ */ new Date()) },
2809
- { label: "End of This Month", value: () => de(vt(/* @__PURE__ */ new Date())) },
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 de(vt(new Date(a.getFullYear(), a.getMonth() - 1, 1)));
2816
+ return ue(vt(new Date(a.getFullYear(), a.getMonth() - 1, 1)));
2813
2817
  } },
2814
- { label: "End of This Quarter", value: () => de(Gt(/* @__PURE__ */ new Date())) },
2815
- { label: "End of This Year", value: () => de(Nt(/* @__PURE__ */ new Date())) },
2816
- { label: "End of Last Year", value: () => de(Nt(new Date((/* @__PURE__ */ new Date()).getFullYear() - 1, 0, 1))) }
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 } = dt(), a = Qn(n ?? ""), [s] = J("status", "All"), [l] = J("from", ""), [i] = J("to", ""), [c] = J("per_page", 50), [o] = J("page", 1), d = o - 1, u = Me(), m = (x) => u({ page: x === 0 ? null : x + 1 }), p = (x) => u({ status: x === "All" ? null : x, page: null }), v = (x) => u({ from: x || null, page: null }), w = (x) => u({ to: x || null, page: null }), g = (x) => u({ per_page: x, page: null }), y = Ce(() => {
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 = d * c, x;
2862
- }, [s, l, i, c, d]), { 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 : d * c + 1, B = Math.min(b, (d + 1) * c), k = Ce(() => {
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) => u({ from: x, to: z, page: null }) }),
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: () => m(Math.max(0, d - 1)),
3028
- disabled: d === 0,
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: d + 1 }),
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: () => m(Math.min(h - 1, d + 1)),
3046
- disabled: d >= h - 1,
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 } = dt(), n = Oe(), s = (b = ut().state) == null ? void 0 : b.notice, [l] = J("per_page", 50), [i] = J("page", 1), c = i - 1, o = Me(), d = (h) => o({ page: h === 0 ? null : h + 1 }), u = (h) => o({ per_page: h, page: null }), { data: m, isLoading: p } = ie({
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 = (m == null ? void 0 : m.rows) ?? [], w = (m == null ? void 0 : m.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(() => {
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) => u(Number(h.target.value)),
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: () => d(Math.max(0, c - 1)),
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: () => d(Math.min(g - 1, c + 1)),
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 } = dt(), a = Oe(), s = We(), { t: l } = Z(), i = !n || n === "new", c = wr[t ?? ""] ?? t ?? "", o = l(`masters.${t}.one`, { defaultValue: c }), d = kr[t ?? ""] ?? [], u = (k) => l(`fields.${k.label}`, { defaultValue: k.label }), [m, p] = N({}), { data: v, isLoading: w } = ie({
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
- d.forEach((q) => {
3258
+ m.forEach((q) => {
3255
3259
  k[q.name] = q.default ?? "";
3256
3260
  }), p(k);
3257
3261
  } else v && p(v);
3258
- }, [i, v, d]);
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" && !m.name ? { ...m, name: m.company_name } : m;
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 = d.filter((k) => {
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 = m[k.name];
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(u).join(", ") }) }),
3318
- m.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 }) }),
3319
- /* @__PURE__ */ e(V, { children: /* @__PURE__ */ e("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: d.map((k) => {
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: u(k),
3329
+ label: d(k),
3326
3330
  options: k.options,
3327
- value: m[k.name] ?? "",
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: u(k) }),
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: m[k.name] ?? "",
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: u(k),
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: m[k.name] ?? "",
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, d] = N([]), [u, m] = N(!1), [p, v] = N(!1), [w, g] = N({}), y = H(null), I = H(null), L = H(null), C = H(null), b = H(!1);
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
- d(z), m(!0);
3451
+ m(z), u(!0);
3448
3452
  } catch {
3449
- d([]);
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), m(!1), d([]);
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
- m(!1), i !== n && a(i);
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) || m(!1);
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
- u && o.length > 0 && Ca(
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, d] = N(a), [u, m] = N(s), p = Fe(i), v = (b) => Le(b, p), w = Ce(() => {
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: u || null
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) => d(b.target.value)
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: u,
3560
- onChange: (b) => m(b.target.value)
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
- d(b), m(h), l({ from: b, to: h });
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, d = Me(), u = (T) => d({ page: T === 0 ? null : T + 1 }), m = (T) => d({ 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(() => {
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
- d({
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), d({ from: T, to: K, page: null });
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) => m(Number(T.target.value)),
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: () => u(Math.max(0, o - 1)),
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: () => u(Math.min(j - 1, o + 1)),
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), d = Fe(), u = (y) => Le(y, d), m = Ce(() => {
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(m), g = () => {
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: u(y.valuation_rate) }),
3799
- /* @__PURE__ */ e("td", { className: "px-4 py-2 text-right font-medium", children: u(y.stock_value) })
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), d = (b) => Le(b, o), [u, m] = N(a), [p, v] = N(s), w = Ce(() => {
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: u || null,
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: u, onChange: (b) => m(b.target.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
- m(b), v(h), l({ from: b, to: h });
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: d(b.amount) })
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: d(g.total_income) })
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: d(b.amount) })
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: d(g.total_expense) })
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
- d(Math.abs(g.net_profit))
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, d) => /* @__PURE__ */ r("tr", { className: "hover:bg-gray-50", children: [
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
- ] }, d)) }),
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), d = Fe(l), u = (h) => Le(h, d), m = Ce(() => {
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(m), g = () => {
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: d }),
3907
- /* @__PURE__ */ e(Et, { title: t("reports.liabilities"), rows: p.liabilities || [], total: p.total_liabilities, totalLabel: t("reports.totalLiabilities"), currency: d }),
3908
- /* @__PURE__ */ e(Et, { title: t("reports.equity"), rows: p.equity || [], total: p.total_equity, totalLabel: t("reports.totalEquity"), currency: d }),
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: u(p.total_assets) })
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: u(p.total_liabilities_and_equity) })
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), d = Fe(l), u = (y) => Le(y, d), m = Ce(() => {
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(m), g = () => {
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: u(y.outstanding) }),
3967
- /* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.current ? u(y.current) : "" }),
3968
- /* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.b1_30 ? u(y.b1_30) : "" }),
3969
- /* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.b31_60 ? u(y.b31_60) : "" }),
3970
- /* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.b61_90 ? u(y.b61_90) : "" }),
3971
- /* @__PURE__ */ e("td", { className: "px-3 py-2 text-right text-red-600", children: y.b90_plus ? u(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: u(p.totals.outstanding) }),
3976
- /* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children: u(p.totals.current) }),
3977
- /* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children: u(p.totals.b1_30) }),
3978
- /* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children: u(p.totals.b31_60) }),
3979
- /* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children: u(p.totals.b61_90) }),
3980
- /* @__PURE__ */ e("td", { className: "px-3 py-3 text-right text-red-600", children: u(p.totals.b90_plus) })
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), d = Fe(l), u = (y) => Le(y, d), m = Ce(() => {
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(m), g = () => {
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: u(y.outstanding) }),
4025
- /* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.current ? u(y.current) : "" }),
4026
- /* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.b1_30 ? u(y.b1_30) : "" }),
4027
- /* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.b31_60 ? u(y.b31_60) : "" }),
4028
- /* @__PURE__ */ e("td", { className: "px-3 py-2 text-right", children: y.b61_90 ? u(y.b61_90) : "" }),
4029
- /* @__PURE__ */ e("td", { className: "px-3 py-2 text-right text-red-600", children: y.b90_plus ? u(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: u(p.totals.outstanding) }),
4034
- /* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children: u(p.totals.current) }),
4035
- /* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children: u(p.totals.b1_30) }),
4036
- /* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children: u(p.totals.b31_60) }),
4037
- /* @__PURE__ */ e("td", { className: "px-3 py-3 text-right", children: u(p.totals.b61_90) }),
4038
- /* @__PURE__ */ e("td", { className: "px-3 py-3 text-right text-red-600", children: u(p.totals.b90_plus) })
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", ""), [d] = J("company", ""), [u, m] = 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({
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: d || void 0
4144
- }), null, 2), [l, i, c, o, d]), U = async (K) => {
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 ?? u), oe = await O.runtimeData({ requests: Q.data_requests || [] });
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 || ""), m(le), U(le);
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, m(j), U(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 = u.trim() !== x.current.trim(), se = s || "unsaved-runtime-report", le = p.map((ne) => ({
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
- u,
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: u,
4266
- onChange: (K) => m(K.target.value),
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, d = i.data ?? (o == null ? void 0 : o.rows) ?? [];
4292
- if (!d.length)
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 u = i.type === "pie" ? [] : d.map((v) => String(v[i.x] ?? "")), m = Yr(u), p = Math.max(320, 200 + m.axisHeight);
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: d, margin: { top: 10, right: 20, left: 0, bottom: 0 }, children: [
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: m.angle,
4306
- textAnchor: m.angle === 0 ? "middle" : "end",
4307
- height: m.axisHeight
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: d, dataKey: i.y, nameKey: i.x, outerRadius: 110, children: d.map((v, w) => /* @__PURE__ */ e(Ra, { fill: Sn[w % Sn.length] }, w)) })
4316
- ] }) : /* @__PURE__ */ r(Ia, { data: d, margin: { top: 10, right: 20, left: 0, bottom: 0 }, children: [
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: m.angle,
4325
- textAnchor: m.angle === 0 ? "middle" : "end",
4326
- height: m.axisHeight
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((d) => /* @__PURE__ */ e("td", { className: "px-4 py-1.5 text-gray-900", children: ct(c[d.key], d.type) }, d.key)) }, o)) })
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, d] = N("quick"), [u, m] = N(!1), [p, v] = N(null), w = me({
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
- await g.mutateAsync();
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 && !u)
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 (u)
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: p ? "Your company has been created and three years of history has been simulated." : "Your company has been created and demo data has been seeded." }),
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: () => d("quick"),
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: () => d("history"),
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 d;
4861
- let o = ((d = a[0]) == null ? void 0 : d.id) || "";
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 } = dt(), a = Oe(), s = ut(), [l] = wt(), i = l.get("demo") === "1", [c, o] = N(""), [d, u] = N(""), [m, p] = N([]), [v, w] = N(""), [g, y] = N(!1), I = H(null), {
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
- u(""), oe.current = null, ne.current += 1, n && Wn(n);
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, u(""), h(n).catch((f) => {
5253
- oe.current = null, u(f instanceof Error ? f.message : t("chat.demoError"));
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
- }, ue = (f) => {
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 = m.some((f) => f.uploading), M = m.some((f) => f.error), $ = m.filter((f) => f.uploadedId && !f.error).map((f) => f.uploadedId);
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 m)
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: ue,
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
- d && /* @__PURE__ */ e("div", { className: "rounded-md bg-rose-50 px-4 py-3 text-sm text-rose-700 ring-1 ring-rose-200", children: d }),
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(us, { message: f }, D)),
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
- m.length > 0 && /* @__PURE__ */ e("div", { className: "mb-2 flex flex-wrap gap-2", children: m.map((f) => /* @__PURE__ */ r(
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 || m.length >= zt,
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 us({ message: t }) {
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(ds, { content: t.content }),
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 ds({ content: t }) {
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 d = l[0], u = "";
5668
- for (; d.length > 0 && /[.,;:!?]$/.test(d); )
5669
- u = d.slice(-1) + u, d = d.slice(0, -1);
5670
- o > s && a.push(t.slice(s, o)), a.push(Xn(d, d, `${n}-u${c}`)), u && a.push(u), s = o + l[0].length, c += 1;
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, d] = N(c ? "register" : "login"), [u, m] = N(!1), [p, v] = N(!0), [w, g] = N(""), [y, I] = N(""), [L, C] = N(""), [b, h] = N(""), [A, B] = N("");
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
- m(q.registration_open), q.registration_open && d("register");
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(u ? "login.taglineFirstRun" : o === "register" ? "login.taglineRegister" : "login.taglineSignIn") }),
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" ? u ? "login.createAdmin" : "login.register" : "login.signIn") })
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
- !u && !c && /* @__PURE__ */ e("p", { className: "text-center text-sm text-fg-muted", children: o === "login" ? /* @__PURE__ */ r(Ne, { children: [
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: () => d("register"), className: "font-medium text-brand transition-colors hover:text-brand/80", children: i("login.registerLink") })
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: () => d("login"), className: "font-medium text-brand transition-colors hover:text-brand/80", children: i("login.signInLink") })
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(""), [d, u] = N([Dn()]), [m, p] = N([_n()]), [v, w] = N([An()]), [g, y] = N({}), I = me({
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: d.filter((h) => h.account && (h.debit || h.credit)).map((h) => ({
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: m.filter((h) => h.item_code && h.qty).map((h) => ({
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: d.map((h, A) => /* @__PURE__ */ r("tr", { children: [
5874
- /* @__PURE__ */ e("td", { className: "px-2 py-1", children: /* @__PURE__ */ e(ke, { value: h.account, onChange: (B) => b(d, u, A, "account", B), linkDoctype: "account", readOnly: !1, label: "" }) }),
5875
- /* @__PURE__ */ e("td", { className: "px-2 py-1", children: /* @__PURE__ */ r("select", { value: h.party_type, onChange: (B) => b(d, u, A, "party_type", B.target.value), className: "w-full rounded border border-gray-300 px-2 py-1.5 text-sm", children: [
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(d, u, A, "party", B), linkDoctype: h.party_type.toLowerCase(), readOnly: !1 }) : /* @__PURE__ */ e("span", { className: "text-gray-300 text-xs", children: "set party type first" }) }),
5881
- /* @__PURE__ */ e("td", { className: "px-2 py-1", children: /* @__PURE__ */ e("input", { type: "number", value: h.debit, onChange: (B) => b(d, u, 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" }) }),
5882
- /* @__PURE__ */ e("td", { className: "px-2 py-1", children: /* @__PURE__ */ e("input", { type: "number", value: h.credit, onChange: (B) => b(d, u, 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" }) })
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: () => u([...d, Dn()]), className: "text-xs text-blue-600 hover:text-blue-800", children: "+ Add Row" }) }),
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: m.map((h, A) => /* @__PURE__ */ r("tr", { children: [
5905
- /* @__PURE__ */ e("td", { className: "px-2 py-1", children: /* @__PURE__ */ e(ke, { label: "", value: h.item_code, onChange: (B) => b(m, p, A, "item_code", B), linkDoctype: "item", readOnly: !1 }) }),
5906
- /* @__PURE__ */ e("td", { className: "px-2 py-1", children: /* @__PURE__ */ e("input", { type: "number", value: h.qty, onChange: (B) => b(m, 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" }) }),
5907
- /* @__PURE__ */ e("td", { className: "px-2 py-1", children: /* @__PURE__ */ e("input", { type: "number", value: h.rate, onChange: (B) => b(m, 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" }) })
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([...m, _n()]), className: "text-xs text-blue-600 hover:text-blue-800", children: "+ Add Row" }) }),
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, d] = N("viewer"), [u, m] = N(null), p = me({
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
- m(g), c(""), n.invalidateQueries({ queryKey: ["auth-invites"] });
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) => d(g.target.value)
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
- u && /* @__PURE__ */ r("div", { className: "mt-3 rounded-md bg-green-50 px-4 py-3 text-sm", children: [
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
- u.link
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: ui,
6157
- status: di,
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: d } = ie({
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
- }), u = Tn.find((C) => C.value === n), m = (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 = m ? m.demo_usd / u.hours : 0, w = m ? m.total_usd / u.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";
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: d ? `Last updated ${new Date(d).toLocaleTimeString()}` : "Refresh now",
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
- m && /* @__PURE__ */ r("div", { className: "mt-5 space-y-5", children: [
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
- u.label.toLowerCase(),
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(m.total_usd),
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(m.demo_usd) }),
6332
- /* @__PURE__ */ e(ft, { label: "Calls", value: m.call_count.toLocaleString() }),
6333
- /* @__PURE__ */ e(ft, { label: "Unique IPs", value: m.unique_ips.toLocaleString() }),
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: `${m.prompt_tokens.toLocaleString()} / ${m.completion_tokens.toLocaleString()}`
6358
+ value: `${u.prompt_tokens.toLocaleString()} / ${u.completion_tokens.toLocaleString()}`
6339
6359
  }
6340
6360
  )
6341
6361
  ] }),
6342
- Object.keys(m.by_provider).length > 0 && /* @__PURE__ */ r("div", { children: [
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(m.by_provider).map(([C, b]) => /* @__PURE__ */ r("tr", { children: [
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
- }), [d, u] = N(!1), m = me({
6417
+ }), [m, d] = N(!1), u = me({
6398
6418
  mutationFn: () => O.createPublicManager(),
6399
6419
  onSuccess: () => {
6400
- a.invalidateQueries({ queryKey: ["public-manager"] }), u(!1);
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
- d ? /* @__PURE__ */ r("div", { className: "mt-3 rounded-lg border border-red-200 bg-red-50 p-4", children: [
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: () => m.mutate(),
6467
- disabled: m.isPending,
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: m.isPending ? n("settings.enabling") : n("settings.yesEnable")
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: () => u(!1),
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: () => u(!0),
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 = da(Ri());
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
  );