@lambda-development/erp-core 0.1.6 → 0.1.8

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