@lambda-development/erp-core 0.1.10 → 0.1.12
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 +125 -123
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -173,7 +173,7 @@ const O = {
|
|
|
173
173
|
getSettings: () => E("/auth/settings"),
|
|
174
174
|
updateSettings: (t) => E("/auth/settings", { method: "PUT", body: JSON.stringify(t) }),
|
|
175
175
|
getDemoSpend: () => E("/admin/demo-spend")
|
|
176
|
-
},
|
|
176
|
+
}, Un = Ln(null);
|
|
177
177
|
function Ea({ children: t }) {
|
|
178
178
|
const [n, a] = S(null), [s, l] = S(!0);
|
|
179
179
|
se(() => {
|
|
@@ -192,14 +192,14 @@ function Ea({ children: t }) {
|
|
|
192
192
|
}
|
|
193
193
|
a(null);
|
|
194
194
|
}, []);
|
|
195
|
-
return /* @__PURE__ */ e(
|
|
195
|
+
return /* @__PURE__ */ e(Un.Provider, { value: { user: n, loading: s, login: i, register: c, logout: o }, children: t });
|
|
196
196
|
}
|
|
197
197
|
function mt() {
|
|
198
|
-
const t = In(
|
|
198
|
+
const t = In(Un);
|
|
199
199
|
if (!t) throw new Error("useAuth must be used within AuthProvider");
|
|
200
200
|
return t;
|
|
201
201
|
}
|
|
202
|
-
const
|
|
202
|
+
const Vn = Ln(null), ln = {
|
|
203
203
|
quotation: { group: "Selling", item: "Quotation" },
|
|
204
204
|
"sales-order": { group: "Selling", item: "Sales Order" },
|
|
205
205
|
"sales-invoice": { group: "Selling", item: "Sales Invoice" },
|
|
@@ -278,13 +278,13 @@ function dn(t) {
|
|
|
278
278
|
function qa() {
|
|
279
279
|
return typeof crypto < "u" && typeof crypto.randomUUID == "function" ? crypto.randomUUID() : `req-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
|
|
280
280
|
}
|
|
281
|
-
function
|
|
281
|
+
function Ue(t) {
|
|
282
282
|
if (!t) return 0;
|
|
283
283
|
const n = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/.test(t) ? t.replace(" ", "T") : t, a = new Date(n).getTime();
|
|
284
284
|
return Number.isNaN(a) ? 0 : a;
|
|
285
285
|
}
|
|
286
286
|
function za({ children: t }) {
|
|
287
|
-
const n = We(), [a, s] = S([]), [l, i] = S({}), [c, o] = S({}), [m, d] = S({}), [u, p] = S({}), [v, D] = S({}), [h, y] = S({}), [R, B] = S({}), [C, b] = S(null), [g, _] = S("connecting"), [w, N] = S(0), q = H(null), x = H(null), z = H(/* @__PURE__ */ new Map()), j = H(null),
|
|
287
|
+
const n = We(), [a, s] = S([]), [l, i] = S({}), [c, o] = S({}), [m, d] = S({}), [u, p] = S({}), [v, D] = S({}), [h, y] = S({}), [R, B] = S({}), [C, b] = S(null), [g, _] = S("connecting"), [w, N] = S(0), q = H(null), x = H(null), z = H(/* @__PURE__ */ new Map()), j = H(null), V = H({}), Y = H({}), de = H(null);
|
|
288
288
|
function P(k) {
|
|
289
289
|
for (const G of z.current.values())
|
|
290
290
|
G.reject(new Error(k));
|
|
@@ -312,25 +312,25 @@ function za({ children: t }) {
|
|
|
312
312
|
}
|
|
313
313
|
function Q(k) {
|
|
314
314
|
return [...k].sort((G, W) => {
|
|
315
|
-
const Se =
|
|
316
|
-
return (
|
|
315
|
+
const Se = Ue(V.current[G.id]) || Ue(G.last_message_at || void 0) || Ue(G.created_at);
|
|
316
|
+
return (Ue(V.current[W.id]) || Ue(W.last_message_at || void 0) || Ue(W.created_at)) - Se;
|
|
317
317
|
});
|
|
318
318
|
}
|
|
319
319
|
function ce(k) {
|
|
320
320
|
s((G) => Q(k(G)));
|
|
321
321
|
}
|
|
322
322
|
function ae(k, G) {
|
|
323
|
-
const W = G || (/* @__PURE__ */ new Date()).toISOString(), Se =
|
|
324
|
-
|
|
325
|
-
...
|
|
323
|
+
const W = G || (/* @__PURE__ */ new Date()).toISOString(), Se = V.current[k];
|
|
324
|
+
Ue(W) >= Ue(Se) && (V.current = {
|
|
325
|
+
...V.current,
|
|
326
326
|
[k]: W
|
|
327
327
|
});
|
|
328
328
|
}
|
|
329
329
|
function Be(k) {
|
|
330
|
-
const G = { ...
|
|
330
|
+
const G = { ...V.current };
|
|
331
331
|
for (const W of k)
|
|
332
332
|
W.last_message_at && !G[W.id] && (G[W.id] = W.last_message_at);
|
|
333
|
-
|
|
333
|
+
V.current = G;
|
|
334
334
|
}
|
|
335
335
|
function Pe(k) {
|
|
336
336
|
const G = q.current;
|
|
@@ -428,8 +428,8 @@ function za({ children: t }) {
|
|
|
428
428
|
const $ = { ...M };
|
|
429
429
|
return delete $[I], $;
|
|
430
430
|
});
|
|
431
|
-
const L = { ...
|
|
432
|
-
delete L[I],
|
|
431
|
+
const L = { ...V.current };
|
|
432
|
+
delete L[I], V.current = L;
|
|
433
433
|
return;
|
|
434
434
|
}
|
|
435
435
|
if (ue === "history_loaded" && I) {
|
|
@@ -684,7 +684,7 @@ function za({ children: t }) {
|
|
|
684
684
|
return k ? R[k] ?? null : null;
|
|
685
685
|
}
|
|
686
686
|
return /* @__PURE__ */ e(
|
|
687
|
-
|
|
687
|
+
Vn.Provider,
|
|
688
688
|
{
|
|
689
689
|
value: {
|
|
690
690
|
sessions: a,
|
|
@@ -711,7 +711,7 @@ function za({ children: t }) {
|
|
|
711
711
|
);
|
|
712
712
|
}
|
|
713
713
|
function tt() {
|
|
714
|
-
const t = In(
|
|
714
|
+
const t = In(Vn);
|
|
715
715
|
if (!t)
|
|
716
716
|
throw new Error("useChat must be used within ChatProvider.");
|
|
717
717
|
return t;
|
|
@@ -968,7 +968,7 @@ function Yt() {
|
|
|
968
968
|
}
|
|
969
969
|
);
|
|
970
970
|
}
|
|
971
|
-
function
|
|
971
|
+
function Ua() {
|
|
972
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 } = le({
|
|
973
973
|
queryKey: ["runtime-drafts"],
|
|
974
974
|
queryFn: () => O.listRuntimeDrafts(),
|
|
@@ -1058,7 +1058,7 @@ function Va() {
|
|
|
1058
1058
|
] })
|
|
1059
1059
|
] });
|
|
1060
1060
|
}
|
|
1061
|
-
function
|
|
1061
|
+
function Va({ group: t }) {
|
|
1062
1062
|
const [n, a] = Ht(t.label), { t: s } = Z(), { navigationFlash: l } = tt(), i = (l == null ? void 0 : l.group) === t.label, c = Jt[t.label] ?? "bg-blue-300 text-blue-950 ring-2 ring-inset ring-blue-100";
|
|
1063
1063
|
return /* @__PURE__ */ r("div", { children: [
|
|
1064
1064
|
/* @__PURE__ */ r(
|
|
@@ -1166,8 +1166,8 @@ function ja({ isMobileOpen: t = !1, onClose: n }) {
|
|
|
1166
1166
|
] }),
|
|
1167
1167
|
/* @__PURE__ */ r("nav", { className: "flex-1 overflow-y-auto py-3", children: [
|
|
1168
1168
|
/* @__PURE__ */ e($a, {}),
|
|
1169
|
-
/* @__PURE__ */ e(
|
|
1170
|
-
c.map((m) => /* @__PURE__ */ e(
|
|
1169
|
+
/* @__PURE__ */ e(Ua, {}),
|
|
1170
|
+
c.map((m) => /* @__PURE__ */ e(Va, { group: m }, m.label))
|
|
1171
1171
|
] })
|
|
1172
1172
|
]
|
|
1173
1173
|
}
|
|
@@ -1252,7 +1252,7 @@ function Ha({ children: t }) {
|
|
|
1252
1252
|
const { user: n, loading: a } = mt();
|
|
1253
1253
|
return a ? /* @__PURE__ */ e("div", { className: "flex h-dvh items-center justify-center", children: /* @__PURE__ */ e("div", { className: "text-gray-400", children: "Loading..." }) }) : n ? /* @__PURE__ */ e(Ne, { children: t }) : /* @__PURE__ */ e(da, { to: "/login", replace: !0 });
|
|
1254
1254
|
}
|
|
1255
|
-
function
|
|
1255
|
+
function U({ title: t, children: n, className: a, interactive: s }) {
|
|
1256
1256
|
return /* @__PURE__ */ r(
|
|
1257
1257
|
"div",
|
|
1258
1258
|
{
|
|
@@ -1330,7 +1330,7 @@ function Fe(t) {
|
|
|
1330
1330
|
}
|
|
1331
1331
|
function gt({ title: t, value: n, icon: a, tone: s }) {
|
|
1332
1332
|
const l = s ?? "text-brand bg-brand/10", i = Fe();
|
|
1333
|
-
return /* @__PURE__ */ e(
|
|
1333
|
+
return /* @__PURE__ */ e(U, { children: /* @__PURE__ */ r("div", { className: "flex items-start justify-between gap-4", children: [
|
|
1334
1334
|
/* @__PURE__ */ r("div", { className: "min-w-0", children: [
|
|
1335
1335
|
/* @__PURE__ */ e("p", { className: "text-sm font-medium text-fg-muted", children: t }),
|
|
1336
1336
|
/* @__PURE__ */ e("p", { className: "mt-1.5 text-2xl font-semibold tracking-tight tabular-nums text-fg", children: ((o) => Le(o, i))(n ?? 0) })
|
|
@@ -1339,7 +1339,7 @@ function gt({ title: t, value: n, icon: a, tone: s }) {
|
|
|
1339
1339
|
] }) });
|
|
1340
1340
|
}
|
|
1341
1341
|
function yt() {
|
|
1342
|
-
return /* @__PURE__ */ e(
|
|
1342
|
+
return /* @__PURE__ */ e(U, { children: /* @__PURE__ */ r("div", { className: "flex items-start justify-between gap-4", children: [
|
|
1343
1343
|
/* @__PURE__ */ r("div", { className: "min-w-0 flex-1", children: [
|
|
1344
1344
|
/* @__PURE__ */ e("div", { className: "h-4 w-24 animate-pulse rounded bg-surface-subtle" }),
|
|
1345
1345
|
/* @__PURE__ */ e("div", { className: "mt-2.5 h-7 w-32 animate-pulse rounded bg-surface-subtle" })
|
|
@@ -1433,7 +1433,7 @@ function tr() {
|
|
|
1433
1433
|
}
|
|
1434
1434
|
)
|
|
1435
1435
|
] }) }),
|
|
1436
|
-
/* @__PURE__ */ e(
|
|
1436
|
+
/* @__PURE__ */ e(U, { title: t("dashboard.recentDocuments"), children: /* @__PURE__ */ e("div", { className: "-mx-3 space-y-0.5", children: a ? /* @__PURE__ */ r(Ne, { children: [
|
|
1437
1437
|
/* @__PURE__ */ e(ot, {}),
|
|
1438
1438
|
/* @__PURE__ */ e(ot, {}),
|
|
1439
1439
|
/* @__PURE__ */ e(ot, {}),
|
|
@@ -1491,7 +1491,7 @@ function J(t, n) {
|
|
|
1491
1491
|
);
|
|
1492
1492
|
return [i, c];
|
|
1493
1493
|
}
|
|
1494
|
-
const
|
|
1494
|
+
const Ve = [
|
|
1495
1495
|
{ name: "item_code", label: "Item", type: "link", linkDoctype: "item", required: !0 },
|
|
1496
1496
|
{ name: "item_name", label: "Item Name", type: "text", readOnly: !0 },
|
|
1497
1497
|
{ name: "qty", label: "Qty", type: "number", required: !0 },
|
|
@@ -1535,7 +1535,7 @@ const Ue = [
|
|
|
1535
1535
|
{ name: "remarks", label: "Notes / Terms", type: "textarea" }
|
|
1536
1536
|
],
|
|
1537
1537
|
childTables: [
|
|
1538
|
-
{ key: "items", label: "Items", fields:
|
|
1538
|
+
{ key: "items", label: "Items", fields: Ve },
|
|
1539
1539
|
{ key: "taxes", label: "Taxes", fields: je }
|
|
1540
1540
|
],
|
|
1541
1541
|
listColumns: ["name", "customer", "transaction_date", "grand_total", "status"],
|
|
@@ -1567,7 +1567,7 @@ const Ue = [
|
|
|
1567
1567
|
{ name: "remarks", label: "Notes / Terms", type: "textarea" }
|
|
1568
1568
|
],
|
|
1569
1569
|
childTables: [
|
|
1570
|
-
{ key: "items", label: "Items", fields:
|
|
1570
|
+
{ key: "items", label: "Items", fields: Ve },
|
|
1571
1571
|
{ key: "taxes", label: "Taxes", fields: je }
|
|
1572
1572
|
],
|
|
1573
1573
|
listColumns: ["name", "customer", "transaction_date", "grand_total", "status"],
|
|
@@ -1598,7 +1598,7 @@ const Ue = [
|
|
|
1598
1598
|
{ name: "remarks", label: "Notes / Terms", type: "textarea" }
|
|
1599
1599
|
],
|
|
1600
1600
|
childTables: [
|
|
1601
|
-
{ key: "items", label: "Items", fields: [...
|
|
1601
|
+
{ key: "items", label: "Items", fields: [...Ve, { name: "income_account", label: "Income Account", type: "link", linkDoctype: "account" }] },
|
|
1602
1602
|
{ key: "taxes", label: "Taxes", fields: je }
|
|
1603
1603
|
],
|
|
1604
1604
|
listColumns: ["name", "customer", "posting_date", "grand_total", "outstanding_amount", "status"],
|
|
@@ -1625,7 +1625,7 @@ const Ue = [
|
|
|
1625
1625
|
{ name: "remarks", label: "Notes / Terms", type: "textarea" }
|
|
1626
1626
|
],
|
|
1627
1627
|
childTables: [
|
|
1628
|
-
{ key: "items", label: "Items", fields: [...
|
|
1628
|
+
{ key: "items", label: "Items", fields: [...Ve, { name: "warehouse", label: "Warehouse", type: "link", linkDoctype: "warehouse" }] },
|
|
1629
1629
|
{ key: "taxes", label: "Taxes", fields: je }
|
|
1630
1630
|
],
|
|
1631
1631
|
listColumns: ["name", "supplier", "transaction_date", "grand_total", "status"],
|
|
@@ -1667,7 +1667,7 @@ const Ue = [
|
|
|
1667
1667
|
key: "items",
|
|
1668
1668
|
label: "Items",
|
|
1669
1669
|
fields: [
|
|
1670
|
-
...
|
|
1670
|
+
...Ve,
|
|
1671
1671
|
{
|
|
1672
1672
|
name: "warehouse",
|
|
1673
1673
|
label: "Warehouse",
|
|
@@ -1870,7 +1870,7 @@ const Ue = [
|
|
|
1870
1870
|
key: "items",
|
|
1871
1871
|
label: "Items",
|
|
1872
1872
|
fields: [
|
|
1873
|
-
...
|
|
1873
|
+
...Ve,
|
|
1874
1874
|
{ name: "warehouse", label: "Warehouse", type: "link", linkDoctype: "warehouse", required: !0 }
|
|
1875
1875
|
]
|
|
1876
1876
|
},
|
|
@@ -1905,7 +1905,7 @@ const Ue = [
|
|
|
1905
1905
|
key: "items",
|
|
1906
1906
|
label: "Items",
|
|
1907
1907
|
fields: [
|
|
1908
|
-
...
|
|
1908
|
+
...Ve,
|
|
1909
1909
|
{ name: "warehouse", label: "Warehouse", type: "link", linkDoctype: "warehouse", required: !0 }
|
|
1910
1910
|
]
|
|
1911
1911
|
},
|
|
@@ -1949,7 +1949,7 @@ const Ue = [
|
|
|
1949
1949
|
key: "items",
|
|
1950
1950
|
label: "Items",
|
|
1951
1951
|
fields: [
|
|
1952
|
-
...
|
|
1952
|
+
...Ve,
|
|
1953
1953
|
{
|
|
1954
1954
|
name: "warehouse",
|
|
1955
1955
|
label: "Warehouse",
|
|
@@ -2334,7 +2334,7 @@ function dr({
|
|
|
2334
2334
|
)) })
|
|
2335
2335
|
] });
|
|
2336
2336
|
}
|
|
2337
|
-
function
|
|
2337
|
+
function Ut({
|
|
2338
2338
|
field: t,
|
|
2339
2339
|
value: n,
|
|
2340
2340
|
onChange: a,
|
|
@@ -2446,7 +2446,7 @@ function ur({
|
|
|
2446
2446
|
}, m = (d) => {
|
|
2447
2447
|
a(n.filter((u, p) => p !== d));
|
|
2448
2448
|
};
|
|
2449
|
-
return /* @__PURE__ */ r(
|
|
2449
|
+
return /* @__PURE__ */ r(U, { title: i(`tables.${t.key}`, { defaultValue: t.label }), children: [
|
|
2450
2450
|
/* @__PURE__ */ e("div", { className: "-mx-6 overflow-x-auto px-6", children: /* @__PURE__ */ r("table", { className: "min-w-full divide-y divide-line text-sm", children: [
|
|
2451
2451
|
/* @__PURE__ */ e("thead", { children: /* @__PURE__ */ r("tr", { children: [
|
|
2452
2452
|
/* @__PURE__ */ e("th", { className: "px-2 py-2 text-left text-xs font-medium uppercase tracking-wide text-fg-muted", children: "#" }),
|
|
@@ -2463,7 +2463,7 @@ function ur({
|
|
|
2463
2463
|
/* @__PURE__ */ e("tbody", { className: "divide-y divide-line", children: n.map((d, u) => /* @__PURE__ */ r("tr", { children: [
|
|
2464
2464
|
/* @__PURE__ */ e("td", { className: "px-2 py-1 text-fg-muted", children: u + 1 }),
|
|
2465
2465
|
t.fields.map((p) => /* @__PURE__ */ e("td", { className: "px-2 py-1 align-top", children: /* @__PURE__ */ e(
|
|
2466
|
-
|
|
2466
|
+
Ut,
|
|
2467
2467
|
{
|
|
2468
2468
|
field: p,
|
|
2469
2469
|
value: d[p.name],
|
|
@@ -2631,7 +2631,7 @@ function hn() {
|
|
|
2631
2631
|
g.mutate();
|
|
2632
2632
|
}, j = () => {
|
|
2633
2633
|
_.mutate();
|
|
2634
|
-
},
|
|
2634
|
+
}, V = (T) => {
|
|
2635
2635
|
w.mutate(T);
|
|
2636
2636
|
};
|
|
2637
2637
|
if (!i)
|
|
@@ -2673,13 +2673,13 @@ function hn() {
|
|
|
2673
2673
|
onSave: x,
|
|
2674
2674
|
onSubmit: z,
|
|
2675
2675
|
onCancel: j,
|
|
2676
|
-
onConvert:
|
|
2676
|
+
onConvert: V
|
|
2677
2677
|
}
|
|
2678
2678
|
)
|
|
2679
2679
|
] }),
|
|
2680
2680
|
(C.error || b.error || g.error || _.error) && /* @__PURE__ */ e("div", { className: "rounded-lg bg-rose-50 p-4 text-sm text-rose-700 ring-1 ring-rose-200", children: ((ge = C.error ?? b.error ?? g.error ?? _.error) == null ? void 0 : ge.message) ?? l("common.errorOccurred") }),
|
|
2681
|
-
/* @__PURE__ */ e(
|
|
2682
|
-
|
|
2681
|
+
/* @__PURE__ */ e(U, { children: /* @__PURE__ */ e("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3", children: ie.map((T) => /* @__PURE__ */ e(
|
|
2682
|
+
Ut,
|
|
2683
2683
|
{
|
|
2684
2684
|
field: T,
|
|
2685
2685
|
value: o[T.name],
|
|
@@ -2701,8 +2701,8 @@ function hn() {
|
|
|
2701
2701
|
},
|
|
2702
2702
|
T.key
|
|
2703
2703
|
)),
|
|
2704
|
-
oe.length > 0 && /* @__PURE__ */ e(
|
|
2705
|
-
|
|
2704
|
+
oe.length > 0 && /* @__PURE__ */ e(U, { title: l("common.totals"), children: /* @__PURE__ */ e("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-3", children: oe.map((T) => /* @__PURE__ */ e(
|
|
2705
|
+
Ut,
|
|
2706
2706
|
{
|
|
2707
2707
|
field: T,
|
|
2708
2708
|
value: o[T.name],
|
|
@@ -2732,12 +2732,12 @@ function gn(t) {
|
|
|
2732
2732
|
function vt(t) {
|
|
2733
2733
|
return new Date(t.getFullYear(), t.getMonth() + 1, 0);
|
|
2734
2734
|
}
|
|
2735
|
-
function
|
|
2735
|
+
function Vt(t) {
|
|
2736
2736
|
const n = Math.floor(t.getMonth() / 3);
|
|
2737
2737
|
return new Date(t.getFullYear(), n * 3, 1);
|
|
2738
2738
|
}
|
|
2739
2739
|
function Gt(t) {
|
|
2740
|
-
const n =
|
|
2740
|
+
const n = Vt(t);
|
|
2741
2741
|
return new Date(n.getFullYear(), n.getMonth() + 3, 0);
|
|
2742
2742
|
}
|
|
2743
2743
|
function yn(t) {
|
|
@@ -2764,7 +2764,7 @@ const hr = [
|
|
|
2764
2764
|
},
|
|
2765
2765
|
{
|
|
2766
2766
|
label: "This Quarter",
|
|
2767
|
-
range: () => [me(
|
|
2767
|
+
range: () => [me(Vt(/* @__PURE__ */ new Date())), me(Gt(/* @__PURE__ */ new Date()))]
|
|
2768
2768
|
},
|
|
2769
2769
|
{
|
|
2770
2770
|
label: "This Year",
|
|
@@ -2781,7 +2781,7 @@ const hr = [
|
|
|
2781
2781
|
label: "Last Quarter",
|
|
2782
2782
|
range: () => {
|
|
2783
2783
|
const t = /* @__PURE__ */ new Date(), n = new Date(t.getFullYear(), t.getMonth() - 3, 1);
|
|
2784
|
-
return [me(
|
|
2784
|
+
return [me(Vt(n)), me(Gt(n))];
|
|
2785
2785
|
}
|
|
2786
2786
|
},
|
|
2787
2787
|
{
|
|
@@ -2866,42 +2866,42 @@ function vr() {
|
|
|
2866
2866
|
}, [s, l, i, c, m]), { data: R, isLoading: B } = nr(n ?? "", y), C = (R == null ? void 0 : R.rows) ?? [], b = (R == null ? void 0 : R.total) ?? 0, g = Math.max(1, Math.ceil(b / c)), _ = b === 0 ? 0 : m * c + 1, w = Math.min(b, (m + 1) * c), N = Ce(() => {
|
|
2867
2867
|
if (!a) return [];
|
|
2868
2868
|
const x = zn(), z = (j) => {
|
|
2869
|
-
const
|
|
2870
|
-
return t(`fields.${
|
|
2869
|
+
const V = j.split("_").map((Y) => Y.charAt(0).toUpperCase() + Y.slice(1)).join(" ");
|
|
2870
|
+
return t(`fields.${V}`, { defaultValue: V });
|
|
2871
2871
|
};
|
|
2872
2872
|
return a.listColumns.map((j) => {
|
|
2873
2873
|
if (j === "name")
|
|
2874
2874
|
return x.accessor("name", {
|
|
2875
2875
|
header: t("fields.Name", { defaultValue: "Name" }),
|
|
2876
|
-
cell: (
|
|
2876
|
+
cell: (V) => /* @__PURE__ */ e(
|
|
2877
2877
|
ye,
|
|
2878
2878
|
{
|
|
2879
|
-
to: `/app/${a.slug}/${
|
|
2879
|
+
to: `/app/${a.slug}/${V.getValue()}`,
|
|
2880
2880
|
className: "font-medium text-brand transition-colors hover:text-brand/80",
|
|
2881
|
-
children:
|
|
2881
|
+
children: V.getValue()
|
|
2882
2882
|
}
|
|
2883
2883
|
)
|
|
2884
2884
|
});
|
|
2885
2885
|
if (j === "status")
|
|
2886
2886
|
return x.accessor("status", {
|
|
2887
2887
|
header: t("fields.Status", { defaultValue: "Status" }),
|
|
2888
|
-
cell: (
|
|
2888
|
+
cell: (V) => /* @__PURE__ */ e(Zt, { status: V.getValue() })
|
|
2889
2889
|
});
|
|
2890
2890
|
if (yr.has(j))
|
|
2891
2891
|
return x.accessor(j, {
|
|
2892
2892
|
header: z(j),
|
|
2893
|
-
cell: (
|
|
2893
|
+
cell: (V) => {
|
|
2894
2894
|
var Y;
|
|
2895
|
-
return Le(
|
|
2895
|
+
return Le(V.getValue(), ((Y = V.row.original) == null ? void 0 : Y.currency) || "USD");
|
|
2896
2896
|
}
|
|
2897
2897
|
});
|
|
2898
2898
|
if (j === "party")
|
|
2899
2899
|
return x.accessor("party", {
|
|
2900
2900
|
header: t("fields.Party", { defaultValue: "Party" }),
|
|
2901
|
-
cell: (
|
|
2902
|
-
const Y =
|
|
2901
|
+
cell: (V) => {
|
|
2902
|
+
const Y = V.getValue();
|
|
2903
2903
|
if (!Y) return "-";
|
|
2904
|
-
const de = br(
|
|
2904
|
+
const de = br(V.row.original.party_type), P = de ? $t(de, String(Y)) : null;
|
|
2905
2905
|
return P ? /* @__PURE__ */ e(
|
|
2906
2906
|
ye,
|
|
2907
2907
|
{
|
|
@@ -2914,13 +2914,13 @@ function vr() {
|
|
|
2914
2914
|
}
|
|
2915
2915
|
});
|
|
2916
2916
|
if (fn[j]) {
|
|
2917
|
-
const
|
|
2917
|
+
const V = fn[j];
|
|
2918
2918
|
return x.accessor(j, {
|
|
2919
2919
|
header: z(j),
|
|
2920
2920
|
cell: (Y) => {
|
|
2921
2921
|
const de = Y.getValue();
|
|
2922
2922
|
if (!de) return "-";
|
|
2923
|
-
const P = $t(
|
|
2923
|
+
const P = $t(V, String(de));
|
|
2924
2924
|
return P ? /* @__PURE__ */ e(
|
|
2925
2925
|
ye,
|
|
2926
2926
|
{
|
|
@@ -2935,7 +2935,7 @@ function vr() {
|
|
|
2935
2935
|
}
|
|
2936
2936
|
return fr.has(j) ? x.accessor(j, {
|
|
2937
2937
|
header: z(j),
|
|
2938
|
-
cell: (
|
|
2938
|
+
cell: (V) => Ct(V.getValue())
|
|
2939
2939
|
}) : x.accessor(j, {
|
|
2940
2940
|
header: z(j)
|
|
2941
2941
|
});
|
|
@@ -3189,6 +3189,7 @@ const kr = {
|
|
|
3189
3189
|
{ name: "customer_name", label: "Customer Name", type: "text", required: !0 },
|
|
3190
3190
|
{ name: "customer_group", label: "Customer Group", type: "select", options: ["Individual", "Commercial", "Government", "Non-Profit", "Premium"] },
|
|
3191
3191
|
{ name: "territory", label: "Territory", type: "text" },
|
|
3192
|
+
{ name: "default_currency", label: "Currency", type: "select", options: ["", "USD", "EUR", "GBP", "CHF", "JPY", "CAD", "AUD", "CNY", "INR"] },
|
|
3192
3193
|
{ name: "credit_limit", label: "Credit Limit", type: "currency" },
|
|
3193
3194
|
{ name: "email", label: "Email", type: "text" },
|
|
3194
3195
|
{ name: "phone", label: "Phone", type: "text" },
|
|
@@ -3202,6 +3203,7 @@ const kr = {
|
|
|
3202
3203
|
{ name: "name", label: "ID", type: "text", required: !0 },
|
|
3203
3204
|
{ name: "supplier_name", label: "Supplier Name", type: "text", required: !0 },
|
|
3204
3205
|
{ name: "supplier_group", label: "Supplier Group", type: "select", options: ["Local", "Distributor", "Services", "Raw Materials"] },
|
|
3206
|
+
{ name: "default_currency", label: "Currency", type: "select", options: ["", "USD", "EUR", "GBP", "CHF", "JPY", "CAD", "AUD", "CNY", "INR"] },
|
|
3205
3207
|
{ name: "email", label: "Email", type: "text" },
|
|
3206
3208
|
{ name: "phone", label: "Phone", type: "text" },
|
|
3207
3209
|
{ name: "address", label: "Address", type: "textarea" },
|
|
@@ -3320,7 +3322,7 @@ function xn() {
|
|
|
3320
3322
|
(h.error || y.error || R.error) && /* @__PURE__ */ e("div", { className: "rounded-lg bg-rose-50 p-4 text-sm text-rose-700 ring-1 ring-rose-200", children: ((w = h.error ?? y.error ?? R.error) == null ? void 0 : w.message) ?? l("common.errorOccurred") }),
|
|
3321
3323
|
_.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: _.map(d).join(", ") }) }),
|
|
3322
3324
|
u.disabled === 1 && /* @__PURE__ */ e("div", { className: "rounded-lg bg-amber-50 p-4 text-sm text-amber-800 ring-1 ring-amber-200", children: l("masterForm.disabledNotice", { label: o }) }),
|
|
3323
|
-
/* @__PURE__ */ e(
|
|
3325
|
+
/* @__PURE__ */ e(U, { children: /* @__PURE__ */ e("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: m.map((N) => {
|
|
3324
3326
|
const x = N.name === "name" && !i || N.readOnly, z = N.required && !(i && N.name === "name" && bn.has(t ?? ""));
|
|
3325
3327
|
if (N.type === "select" && N.options)
|
|
3326
3328
|
return /* @__PURE__ */ e("div", { children: /* @__PURE__ */ e(
|
|
@@ -3331,7 +3333,7 @@ function xn() {
|
|
|
3331
3333
|
value: u[N.name] ?? "",
|
|
3332
3334
|
required: z,
|
|
3333
3335
|
disabled: x,
|
|
3334
|
-
onChange: (
|
|
3336
|
+
onChange: (V) => b(N.name, V.target.value)
|
|
3335
3337
|
}
|
|
3336
3338
|
) }, N.name);
|
|
3337
3339
|
if (N.type === "textarea")
|
|
@@ -3346,7 +3348,7 @@ function xn() {
|
|
|
3346
3348
|
required: z,
|
|
3347
3349
|
readOnly: x,
|
|
3348
3350
|
disabled: x,
|
|
3349
|
-
onChange: (
|
|
3351
|
+
onChange: (V) => b(N.name, V.target.value)
|
|
3350
3352
|
}
|
|
3351
3353
|
)
|
|
3352
3354
|
] }, N.name);
|
|
@@ -3361,9 +3363,9 @@ function xn() {
|
|
|
3361
3363
|
readOnly: x,
|
|
3362
3364
|
disabled: x,
|
|
3363
3365
|
value: u[N.name] ?? "",
|
|
3364
|
-
onChange: (
|
|
3366
|
+
onChange: (V) => b(
|
|
3365
3367
|
N.name,
|
|
3366
|
-
j === "number" ? parseFloat(
|
|
3368
|
+
j === "number" ? parseFloat(V.target.value) || 0 : V.target.value
|
|
3367
3369
|
)
|
|
3368
3370
|
},
|
|
3369
3371
|
N.name
|
|
@@ -3474,9 +3476,9 @@ function ke({
|
|
|
3474
3476
|
};
|
|
3475
3477
|
return se(() => {
|
|
3476
3478
|
const x = (z) => {
|
|
3477
|
-
var
|
|
3479
|
+
var V, Y;
|
|
3478
3480
|
const j = z.target;
|
|
3479
|
-
(
|
|
3481
|
+
(V = R.current) != null && V.contains(j) || (Y = B.current) != null && Y.contains(j) || u(!1);
|
|
3480
3482
|
};
|
|
3481
3483
|
return document.addEventListener("mousedown", x), () => document.removeEventListener("mousedown", x);
|
|
3482
3484
|
}, []), l ? /* @__PURE__ */ r("div", { children: [
|
|
@@ -3569,7 +3571,7 @@ function Ir() {
|
|
|
3569
3571
|
/* @__PURE__ */ e(Dt, { onSelect: (b, g) => {
|
|
3570
3572
|
m(b), u(g), l({ from: b, to: g });
|
|
3571
3573
|
} }),
|
|
3572
|
-
y ? /* @__PURE__ */ e("p", { className: "text-fg-muted", children: t("common.loading") }) : !h || !h.rows || h.rows.length === 0 ? /* @__PURE__ */ e("p", { className: "py-8 text-center text-fg-muted", children: t("reports.noData") }) : /* @__PURE__ */ r(
|
|
3574
|
+
y ? /* @__PURE__ */ e("p", { className: "text-fg-muted", children: t("common.loading") }) : !h || !h.rows || h.rows.length === 0 ? /* @__PURE__ */ e("p", { className: "py-8 text-center text-fg-muted", children: t("reports.noData") }) : /* @__PURE__ */ r(U, { children: [
|
|
3573
3575
|
/* @__PURE__ */ e("div", { className: "overflow-x-auto", children: /* @__PURE__ */ r("table", { className: "min-w-full divide-y divide-line text-sm", children: [
|
|
3574
3576
|
/* @__PURE__ */ e("thead", { className: "bg-surface-subtle", children: /* @__PURE__ */ r("tr", { children: [
|
|
3575
3577
|
/* @__PURE__ */ e("th", { className: "px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-fg-muted", children: t("fields.Account", { defaultValue: "Account" }) }),
|
|
@@ -3608,7 +3610,7 @@ function Er() {
|
|
|
3608
3610
|
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 = (P) => m({ page: P === 0 ? null : P + 1 }), u = (P) => m({ per_page: P, page: null }), [p, v] = S(n), [D, h] = S(a), [y, R] = S(s), [B, C] = S(l), b = Fe(), g = (P) => Le(P, b), _ = Ce(() => {
|
|
3609
3611
|
const P = {};
|
|
3610
3612
|
return n && (P.account = n), a && (P.party = a), s && (P.from_date = s), l && (P.to_date = l), P.limit = String(i), P.offset = String(o * i), P;
|
|
3611
|
-
}, [n, a, s, l, i, o]), { data: w, isLoading: N, refetch: q } = Dr(_), x = (w == null ? void 0 : w.rows) ?? [], z = (w == null ? void 0 : w.total) ?? 0, j = Math.max(1, Math.ceil(z / i)),
|
|
3613
|
+
}, [n, a, s, l, i, o]), { data: w, isLoading: N, refetch: q } = Dr(_), x = (w == null ? void 0 : w.rows) ?? [], z = (w == null ? void 0 : w.total) ?? 0, j = Math.max(1, Math.ceil(z / i)), V = z === 0 ? 0 : o * i + 1, Y = Math.min(z, (o + 1) * i), de = () => {
|
|
3612
3614
|
m({
|
|
3613
3615
|
account: p || null,
|
|
3614
3616
|
party: D || null,
|
|
@@ -3663,7 +3665,7 @@ function Er() {
|
|
|
3663
3665
|
R(P), C(K), m({ from: P, to: K, page: null });
|
|
3664
3666
|
} }),
|
|
3665
3667
|
N ? /* @__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: [
|
|
3666
|
-
/* @__PURE__ */ e(
|
|
3668
|
+
/* @__PURE__ */ e(U, { children: /* @__PURE__ */ e("div", { className: "overflow-x-auto", children: /* @__PURE__ */ r("table", { className: "min-w-full divide-y divide-gray-200 text-sm", children: [
|
|
3667
3669
|
/* @__PURE__ */ e("thead", { className: "bg-gray-50", children: /* @__PURE__ */ r("tr", { children: [
|
|
3668
3670
|
/* @__PURE__ */ e("th", { className: "px-4 py-3 text-left font-medium text-gray-500", children: t("fields.Date", { defaultValue: "Date" }) }),
|
|
3669
3671
|
/* @__PURE__ */ e("th", { className: "px-4 py-3 text-left font-medium text-gray-500", children: t("fields.Account", { defaultValue: "Account" }) }),
|
|
@@ -3697,7 +3699,7 @@ function Er() {
|
|
|
3697
3699
|
t("common.showing"),
|
|
3698
3700
|
" ",
|
|
3699
3701
|
/* @__PURE__ */ r("span", { className: "font-medium text-gray-900", children: [
|
|
3700
|
-
|
|
3702
|
+
V,
|
|
3701
3703
|
"–",
|
|
3702
3704
|
Y
|
|
3703
3705
|
] }),
|
|
@@ -3785,7 +3787,7 @@ function Or() {
|
|
|
3785
3787
|
),
|
|
3786
3788
|
/* @__PURE__ */ e(ee, { onClick: h, children: t("common.apply") })
|
|
3787
3789
|
] }),
|
|
3788
|
-
v ? /* @__PURE__ */ e("p", { className: "text-gray-500", children: t("common.loading") }) : !p || !p.rows || p.rows.length === 0 ? /* @__PURE__ */ e("p", { className: "py-8 text-center text-gray-400", children: t("reports.noStockData") }) : /* @__PURE__ */ e(
|
|
3790
|
+
v ? /* @__PURE__ */ e("p", { className: "text-gray-500", children: t("common.loading") }) : !p || !p.rows || p.rows.length === 0 ? /* @__PURE__ */ e("p", { className: "py-8 text-center text-gray-400", children: t("reports.noStockData") }) : /* @__PURE__ */ e(U, { children: /* @__PURE__ */ e("div", { className: "overflow-x-auto", children: /* @__PURE__ */ r("table", { className: "min-w-full divide-y divide-gray-200 text-sm", children: [
|
|
3789
3791
|
/* @__PURE__ */ e("thead", { className: "bg-gray-50", children: /* @__PURE__ */ r("tr", { children: [
|
|
3790
3792
|
/* @__PURE__ */ e("th", { className: "px-4 py-3 text-left font-medium text-gray-500", children: t("fields.Item Code", { defaultValue: "Item Code" }) }),
|
|
3791
3793
|
/* @__PURE__ */ e("th", { className: "px-4 py-3 text-left font-medium text-gray-500", children: t("fields.Item Name", { defaultValue: "Item Name" }) }),
|
|
@@ -3827,7 +3829,7 @@ function qr() {
|
|
|
3827
3829
|
u(b), v(g), l({ from: b, to: g });
|
|
3828
3830
|
} }),
|
|
3829
3831
|
y ? /* @__PURE__ */ e("p", { className: "text-gray-500", children: t("common.loading") }) : C ? /* @__PURE__ */ r("div", { className: "space-y-4", children: [
|
|
3830
|
-
/* @__PURE__ */ r(
|
|
3832
|
+
/* @__PURE__ */ r(U, { children: [
|
|
3831
3833
|
/* @__PURE__ */ e("h3", { className: "mb-3 text-base font-semibold text-gray-800", children: t("reports.income") }),
|
|
3832
3834
|
/* @__PURE__ */ r("table", { className: "min-w-full divide-y divide-gray-200 text-sm", children: [
|
|
3833
3835
|
/* @__PURE__ */ e("thead", { className: "bg-gray-50", children: /* @__PURE__ */ r("tr", { children: [
|
|
@@ -3844,7 +3846,7 @@ function qr() {
|
|
|
3844
3846
|
] }) })
|
|
3845
3847
|
] })
|
|
3846
3848
|
] }),
|
|
3847
|
-
/* @__PURE__ */ r(
|
|
3849
|
+
/* @__PURE__ */ r(U, { children: [
|
|
3848
3850
|
/* @__PURE__ */ e("h3", { className: "mb-3 text-base font-semibold text-gray-800", children: t("reports.expenses") }),
|
|
3849
3851
|
/* @__PURE__ */ r("table", { className: "min-w-full divide-y divide-gray-200 text-sm", children: [
|
|
3850
3852
|
/* @__PURE__ */ e("thead", { className: "bg-gray-50", children: /* @__PURE__ */ r("tr", { children: [
|
|
@@ -3871,7 +3873,7 @@ function qr() {
|
|
|
3871
3873
|
}
|
|
3872
3874
|
function Et({ title: t, rows: n, total: a, totalLabel: s, currency: l }) {
|
|
3873
3875
|
const { t: i } = Z(), c = (o) => Le(o, l);
|
|
3874
|
-
return /* @__PURE__ */ r(
|
|
3876
|
+
return /* @__PURE__ */ r(U, { children: [
|
|
3875
3877
|
/* @__PURE__ */ e("h3", { className: "mb-3 text-base font-semibold text-gray-800", children: t }),
|
|
3876
3878
|
/* @__PURE__ */ r("table", { className: "min-w-full divide-y divide-gray-200 text-sm", children: [
|
|
3877
3879
|
/* @__PURE__ */ e("thead", { className: "bg-gray-50", children: /* @__PURE__ */ r("tr", { children: [
|
|
@@ -3910,7 +3912,7 @@ function zr() {
|
|
|
3910
3912
|
/* @__PURE__ */ e(Et, { title: t("reports.assets"), rows: p.assets || [], total: p.total_assets, totalLabel: t("reports.totalAssets"), currency: m }),
|
|
3911
3913
|
/* @__PURE__ */ e(Et, { title: t("reports.liabilities"), rows: p.liabilities || [], total: p.total_liabilities, totalLabel: t("reports.totalLiabilities"), currency: m }),
|
|
3912
3914
|
/* @__PURE__ */ e(Et, { title: t("reports.equity"), rows: p.equity || [], total: p.total_equity, totalLabel: t("reports.totalEquity"), currency: m }),
|
|
3913
|
-
/* @__PURE__ */ e(
|
|
3915
|
+
/* @__PURE__ */ e(U, { children: /* @__PURE__ */ r("div", { className: "flex items-center justify-between", children: [
|
|
3914
3916
|
/* @__PURE__ */ r("div", { className: "text-sm", children: [
|
|
3915
3917
|
/* @__PURE__ */ r("div", { className: "text-gray-500", children: [
|
|
3916
3918
|
t("reports.totalAssets"),
|
|
@@ -3944,7 +3946,7 @@ function Fr() {
|
|
|
3944
3946
|
/* @__PURE__ */ e(en, { onSelect: (y) => {
|
|
3945
3947
|
o(y), s({ as_of_date: y });
|
|
3946
3948
|
} }),
|
|
3947
|
-
v ? /* @__PURE__ */ e("p", { className: "text-gray-500", children: t("common.loading") }) : !p || !p.rows || p.rows.length === 0 ? /* @__PURE__ */ e("p", { className: "py-8 text-center text-gray-400", children: t("reports.noReceivables") }) : /* @__PURE__ */ e(
|
|
3949
|
+
v ? /* @__PURE__ */ e("p", { className: "text-gray-500", children: t("common.loading") }) : !p || !p.rows || p.rows.length === 0 ? /* @__PURE__ */ e("p", { className: "py-8 text-center text-gray-400", children: t("reports.noReceivables") }) : /* @__PURE__ */ e(U, { children: /* @__PURE__ */ e("div", { className: "overflow-x-auto", children: /* @__PURE__ */ r("table", { className: "min-w-full divide-y divide-gray-200 text-sm", children: [
|
|
3948
3950
|
/* @__PURE__ */ e("thead", { className: "bg-gray-50", children: /* @__PURE__ */ r("tr", { children: [
|
|
3949
3951
|
/* @__PURE__ */ e("th", { className: "px-3 py-3 text-left font-medium text-gray-500", children: t("fields.Invoice", { defaultValue: "Invoice" }) }),
|
|
3950
3952
|
/* @__PURE__ */ e("th", { className: "px-3 py-3 text-left font-medium text-gray-500", children: t("fields.Customer", { defaultValue: "Customer" }) }),
|
|
@@ -4002,7 +4004,7 @@ function Mr() {
|
|
|
4002
4004
|
/* @__PURE__ */ e(en, { onSelect: (y) => {
|
|
4003
4005
|
o(y), s({ as_of_date: y });
|
|
4004
4006
|
} }),
|
|
4005
|
-
v ? /* @__PURE__ */ e("p", { className: "text-gray-500", children: t("common.loading") }) : !p || !p.rows || p.rows.length === 0 ? /* @__PURE__ */ e("p", { className: "py-8 text-center text-gray-400", children: t("reports.noPayables") }) : /* @__PURE__ */ e(
|
|
4007
|
+
v ? /* @__PURE__ */ e("p", { className: "text-gray-500", children: t("common.loading") }) : !p || !p.rows || p.rows.length === 0 ? /* @__PURE__ */ e("p", { className: "py-8 text-center text-gray-400", children: t("reports.noPayables") }) : /* @__PURE__ */ e(U, { children: /* @__PURE__ */ e("div", { className: "overflow-x-auto", children: /* @__PURE__ */ r("table", { className: "min-w-full divide-y divide-gray-200 text-sm", children: [
|
|
4006
4008
|
/* @__PURE__ */ e("thead", { className: "bg-gray-50", children: /* @__PURE__ */ r("tr", { children: [
|
|
4007
4009
|
/* @__PURE__ */ e("th", { className: "px-3 py-3 text-left font-medium text-gray-500", children: t("fields.Invoice", { defaultValue: "Invoice" }) }),
|
|
4008
4010
|
/* @__PURE__ */ e("th", { className: "px-3 py-3 text-left font-medium text-gray-500", children: t("fields.Supplier", { defaultValue: "Supplier" }) }),
|
|
@@ -4066,7 +4068,7 @@ function $r(t) {
|
|
|
4066
4068
|
n && (self.URL || self.webkitURL).revokeObjectURL(n);
|
|
4067
4069
|
}
|
|
4068
4070
|
}
|
|
4069
|
-
function
|
|
4071
|
+
function Ur() {
|
|
4070
4072
|
const t = /* @__PURE__ */ new Date(), n = t.toISOString().slice(0, 10), a = new Date(t);
|
|
4071
4073
|
a.setMonth(a.getMonth() - 12);
|
|
4072
4074
|
const s = a.toISOString().slice(0, 10);
|
|
@@ -4137,15 +4139,15 @@ return {
|
|
|
4137
4139
|
2
|
|
4138
4140
|
);
|
|
4139
4141
|
}
|
|
4140
|
-
const Yn =
|
|
4141
|
-
function
|
|
4142
|
+
const Yn = Ur();
|
|
4143
|
+
function Vr() {
|
|
4142
4144
|
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] = S(Yn), [p, v] = S([]), [D, h] = S(null), [y, R] = S(""), [B, C] = S(!1), [b, g] = S(!1), [_, w] = S(""), N = H(null), q = H(""), x = H(""), z = H(0), j = Ce(() => !l || !i ? "" : JSON.stringify(Kr({
|
|
4143
4145
|
metric: l,
|
|
4144
4146
|
groupBy: i,
|
|
4145
4147
|
fromDate: c || void 0,
|
|
4146
4148
|
toDate: o || void 0,
|
|
4147
4149
|
company: m || void 0
|
|
4148
|
-
}), null, 2), [l, i, c, o, m]),
|
|
4150
|
+
}), null, 2), [l, i, c, o, m]), V = async (K) => {
|
|
4149
4151
|
var ge;
|
|
4150
4152
|
const ie = ++z.current, oe = () => z.current === ie;
|
|
4151
4153
|
R(""), C(!0);
|
|
@@ -4182,14 +4184,14 @@ function Ur() {
|
|
|
4182
4184
|
return s ? q.current === s ? void 0 : (g(!0), R(""), O.getRuntimeDraft(s).then((ie) => {
|
|
4183
4185
|
if (K) return;
|
|
4184
4186
|
const oe = JSON.stringify(ie.definition, null, 2);
|
|
4185
|
-
return q.current = s, x.current = oe, w(ie.source_chat_session_id || ""), u(oe),
|
|
4187
|
+
return q.current = s, x.current = oe, w(ie.source_chat_session_id || ""), u(oe), V(oe);
|
|
4186
4188
|
}).catch((ie) => {
|
|
4187
4189
|
K || (h(null), R(ie instanceof Error ? ie.message : String(ie)));
|
|
4188
4190
|
}).finally(() => {
|
|
4189
4191
|
K || g(!1);
|
|
4190
4192
|
}), () => {
|
|
4191
4193
|
K = !0;
|
|
4192
|
-
}) : (q.current = "", x.current = "", w(""), j && (x.current = j, u(j),
|
|
4194
|
+
}) : (q.current = "", x.current = "", w(""), j && (x.current = j, u(j), V(j)), () => {
|
|
4193
4195
|
K = !0;
|
|
4194
4196
|
});
|
|
4195
4197
|
}, [s, j]);
|
|
@@ -4231,7 +4233,7 @@ function Ur() {
|
|
|
4231
4233
|
Q || (Q = ((ce = n[0]) == null ? void 0 : ce.id) || ""), Q || (Q = (await a()).id), t(`/chat/${Q}`, { state: { prefillMessage: T } });
|
|
4232
4234
|
};
|
|
4233
4235
|
return /* @__PURE__ */ r("div", { className: "space-y-4", children: [
|
|
4234
|
-
/* @__PURE__ */ e(
|
|
4236
|
+
/* @__PURE__ */ e(U, { children: /* @__PURE__ */ r("div", { className: "flex flex-wrap items-center justify-between gap-3", children: [
|
|
4235
4237
|
/* @__PURE__ */ r("div", { children: [
|
|
4236
4238
|
/* @__PURE__ */ e("h2", { className: "text-lg font-semibold text-gray-900", children: "Analytics" }),
|
|
4237
4239
|
/* @__PURE__ */ e("p", { className: "text-sm text-gray-600", children: "All analytics now run through the custom runtime and semantic datasets." })
|
|
@@ -4242,11 +4244,11 @@ function Ur() {
|
|
|
4242
4244
|
s
|
|
4243
4245
|
] }) : Y ? /* @__PURE__ */ e("div", { className: "text-xs text-gray-500", children: "Loaded runtime report from legacy URL filters." }) : null,
|
|
4244
4246
|
s ? /* @__PURE__ */ e(ee, { variant: "secondary", onClick: () => void P(), children: "Fix In Chat" }) : null,
|
|
4245
|
-
/* @__PURE__ */ e(ee, { onClick: () => void
|
|
4247
|
+
/* @__PURE__ */ e(ee, { onClick: () => void V(), disabled: B, children: B ? "Running..." : "Run Report" })
|
|
4246
4248
|
] })
|
|
4247
4249
|
] }) }),
|
|
4248
|
-
b ? /* @__PURE__ */ e(
|
|
4249
|
-
p.length > 0 && /* @__PURE__ */ e(
|
|
4250
|
+
b ? /* @__PURE__ */ e(U, { children: /* @__PURE__ */ e("p", { className: "text-sm text-gray-600", children: "Loading draft..." }) }) : y ? /* @__PURE__ */ e(U, { children: /* @__PURE__ */ e("p", { className: "text-sm text-red-600", children: y }) }) : D ? /* @__PURE__ */ e(Gr, { output: D }) : /* @__PURE__ */ e(U, { children: /* @__PURE__ */ e("p", { className: "text-sm text-gray-600", children: "Edit the runtime JSON below or open a draft from chat, then run the report." }) }),
|
|
4251
|
+
p.length > 0 && /* @__PURE__ */ e(U, { title: "Fetched Datasets", children: /* @__PURE__ */ e("div", { className: "space-y-4", children: p.map((K) => /* @__PURE__ */ r("div", { className: "rounded-md border border-gray-200 p-4", children: [
|
|
4250
4252
|
/* @__PURE__ */ r("div", { className: "flex items-baseline justify-between gap-4", children: [
|
|
4251
4253
|
/* @__PURE__ */ r("div", { children: [
|
|
4252
4254
|
/* @__PURE__ */ e("div", { className: "font-medium text-gray-900", children: K.name }),
|
|
@@ -4260,7 +4262,7 @@ function Ur() {
|
|
|
4260
4262
|
] }),
|
|
4261
4263
|
/* @__PURE__ */ e("pre", { className: "mt-3 overflow-x-auto rounded bg-gray-50 p-3 text-xs text-gray-700", children: JSON.stringify(K.rows.slice(0, 5), null, 2) })
|
|
4262
4264
|
] }, K.name)) }) }),
|
|
4263
|
-
/* @__PURE__ */ r(
|
|
4265
|
+
/* @__PURE__ */ r(U, { children: [
|
|
4264
4266
|
/* @__PURE__ */ e("label", { className: "mb-2 block text-sm font-medium text-gray-700", children: "Report Definition JSON" }),
|
|
4265
4267
|
/* @__PURE__ */ e(
|
|
4266
4268
|
"textarea",
|
|
@@ -4281,7 +4283,7 @@ function Gr({ output: t }) {
|
|
|
4281
4283
|
id: i.id || `table_${c + 1}`
|
|
4282
4284
|
})), a = Zn(n);
|
|
4283
4285
|
return /* @__PURE__ */ r("div", { className: "space-y-4", children: [
|
|
4284
|
-
/* @__PURE__ */ r(
|
|
4286
|
+
/* @__PURE__ */ r(U, { children: [
|
|
4285
4287
|
/* @__PURE__ */ e("div", { className: "flex items-baseline justify-between gap-4", children: /* @__PURE__ */ r("div", { children: [
|
|
4286
4288
|
/* @__PURE__ */ e("h3", { className: "text-lg font-semibold text-gray-900", children: t.title || "Custom Report" }),
|
|
4287
4289
|
t.summary && /* @__PURE__ */ e("p", { className: "mt-1 text-sm text-gray-600", children: t.summary })
|
|
@@ -4294,9 +4296,9 @@ function Gr({ output: t }) {
|
|
|
4294
4296
|
(l = t.charts) == null ? void 0 : l.map((i, c) => {
|
|
4295
4297
|
const o = i.dataTable ? a.get(i.dataTable) : void 0, m = i.data ?? (o == null ? void 0 : o.rows) ?? [];
|
|
4296
4298
|
if (!m.length)
|
|
4297
|
-
return /* @__PURE__ */ e(
|
|
4299
|
+
return /* @__PURE__ */ e(U, { title: i.title, children: /* @__PURE__ */ e("p", { className: "text-sm text-red-600", children: "Chart has no usable data." }) }, i.id || `chart_${c + 1}`);
|
|
4298
4300
|
const d = i.type === "pie" ? [] : m.map((v) => String(v[i.x] ?? "")), u = Yr(d), p = Math.max(320, 200 + u.axisHeight);
|
|
4299
|
-
return /* @__PURE__ */ r(
|
|
4301
|
+
return /* @__PURE__ */ r(U, { children: [
|
|
4300
4302
|
/* @__PURE__ */ e("div", { className: "pb-3 text-sm font-semibold text-gray-700", children: i.title }),
|
|
4301
4303
|
/* @__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: [
|
|
4302
4304
|
/* @__PURE__ */ e(an, { strokeDasharray: "3 3", stroke: "#f3f4f6" }),
|
|
@@ -4336,7 +4338,7 @@ function Gr({ output: t }) {
|
|
|
4336
4338
|
] }) }) })
|
|
4337
4339
|
] }, i.id || `chart_${c + 1}`);
|
|
4338
4340
|
}),
|
|
4339
|
-
n.map((i) => /* @__PURE__ */ e(
|
|
4341
|
+
n.map((i) => /* @__PURE__ */ e(U, { 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: [
|
|
4340
4342
|
/* @__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)) }) }),
|
|
4341
4343
|
/* @__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)) })
|
|
4342
4344
|
] }) }) }, i.id))
|
|
@@ -4600,11 +4602,11 @@ function Xr() {
|
|
|
4600
4602
|
return /* @__PURE__ */ e("p", { className: "text-gray-500", children: "Loading..." });
|
|
4601
4603
|
if (n != null && n.setup_complete && !v)
|
|
4602
4604
|
return /* @__PURE__ */ r("div", { className: "space-y-6", children: [
|
|
4603
|
-
/* @__PURE__ */ e(
|
|
4605
|
+
/* @__PURE__ */ e(U, { title: "Companies", children: n.companies && n.companies.length > 0 ? /* @__PURE__ */ e("ul", { className: "divide-y divide-gray-100", children: n.companies.map((w, N) => /* @__PURE__ */ e("li", { className: "py-3", children: /* @__PURE__ */ e(es, { company: w }) }, N)) }) : /* @__PURE__ */ e("p", { className: "text-gray-400", children: "No companies found" }) }),
|
|
4604
4606
|
/* @__PURE__ */ e(ye, { to: "/", className: "text-blue-600 hover:text-blue-800 text-sm font-medium", children: "Go to Dashboard" })
|
|
4605
4607
|
] });
|
|
4606
4608
|
if (v)
|
|
4607
|
-
return /* @__PURE__ */ e("div", { className: "space-y-6", children: /* @__PURE__ */ e(
|
|
4609
|
+
return /* @__PURE__ */ e("div", { className: "space-y-6", children: /* @__PURE__ */ e(U, { children: /* @__PURE__ */ r("div", { className: "py-8 text-center", children: [
|
|
4608
4610
|
/* @__PURE__ */ e("p", { className: "text-lg font-semibold text-green-700", children: "Setup complete!" }),
|
|
4609
4611
|
/* @__PURE__ */ e("p", { className: "mt-2 text-sm text-gray-500", children: u === "history" ? "Your company has been created and three years of history has been simulated." : u === "quick" ? "Your company has been created and demo data has been seeded." : "Your company has been created. No demo data was added." }),
|
|
4610
4612
|
h && /* @__PURE__ */ r("div", { className: "mx-auto mt-6 max-w-sm text-left", children: [
|
|
@@ -4620,7 +4622,7 @@ function Xr() {
|
|
|
4620
4622
|
return /* @__PURE__ */ r("div", { className: "mx-auto max-w-lg space-y-6", children: [
|
|
4621
4623
|
/* @__PURE__ */ e("p", { className: "text-sm text-gray-500", children: "Set up your first company to get started." }),
|
|
4622
4624
|
_ && /* @__PURE__ */ e("div", { className: "rounded-md bg-red-50 p-4 text-sm text-red-700", children: _.message ?? "An error occurred during setup" }),
|
|
4623
|
-
/* @__PURE__ */ e(
|
|
4625
|
+
/* @__PURE__ */ e(U, { children: /* @__PURE__ */ r("div", { className: "space-y-4", children: [
|
|
4624
4626
|
/* @__PURE__ */ e(
|
|
4625
4627
|
X,
|
|
4626
4628
|
{
|
|
@@ -4926,7 +4928,7 @@ function ns() {
|
|
|
4926
4928
|
n("tutorial.caPrompt3"),
|
|
4927
4929
|
n("tutorial.caPrompt4")
|
|
4928
4930
|
];
|
|
4929
|
-
return /* @__PURE__ */ e(
|
|
4931
|
+
return /* @__PURE__ */ e(U, { className: "border-indigo-200 bg-gradient-to-br from-indigo-50 to-white", children: /* @__PURE__ */ r("div", { className: "flex flex-col gap-4 md:flex-row md:items-start", children: [
|
|
4930
4932
|
/* @__PURE__ */ e("div", { className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-indigo-100 text-lg font-bold text-indigo-700", children: "★" }),
|
|
4931
4933
|
/* @__PURE__ */ r("div", { className: "flex-1 space-y-3", children: [
|
|
4932
4934
|
/* @__PURE__ */ r("div", { children: [
|
|
@@ -4980,7 +4982,7 @@ function ns() {
|
|
|
4980
4982
|
}
|
|
4981
4983
|
function as() {
|
|
4982
4984
|
const { t } = Z(), n = (a) => t(`tutorial.chips.${a}`, { defaultValue: a });
|
|
4983
|
-
return /* @__PURE__ */ r(
|
|
4985
|
+
return /* @__PURE__ */ r(U, { children: [
|
|
4984
4986
|
/* @__PURE__ */ e("h3", { className: "text-base font-semibold text-gray-900 mb-3", children: t("tutorial.flowTitle") }),
|
|
4985
4987
|
/* @__PURE__ */ r("div", { className: "space-y-4 text-sm text-gray-600", children: [
|
|
4986
4988
|
/* @__PURE__ */ r("div", { children: [
|
|
@@ -5051,7 +5053,7 @@ function as() {
|
|
|
5051
5053
|
}
|
|
5052
5054
|
function rs() {
|
|
5053
5055
|
const { t } = Z(), n = (a) => t(`tutorial.chips.${a}`, { defaultValue: a });
|
|
5054
|
-
return /* @__PURE__ */ r(
|
|
5056
|
+
return /* @__PURE__ */ r(U, { children: [
|
|
5055
5057
|
/* @__PURE__ */ e("h3", { className: "text-base font-semibold text-gray-900 mb-3", children: t("tutorial.lifecycleTitle") }),
|
|
5056
5058
|
/* @__PURE__ */ r("div", { className: "space-y-2 text-sm text-gray-600", children: [
|
|
5057
5059
|
/* @__PURE__ */ r("div", { className: "flex flex-wrap items-center gap-2 font-mono text-xs", children: [
|
|
@@ -5114,7 +5116,7 @@ function ss() {
|
|
|
5114
5116
|
/* @__PURE__ */ e(rs, {}),
|
|
5115
5117
|
ts.map((n) => {
|
|
5116
5118
|
var a;
|
|
5117
|
-
return /* @__PURE__ */ e(
|
|
5119
|
+
return /* @__PURE__ */ e(U, { children: /* @__PURE__ */ r("div", { className: "flex gap-4", children: [
|
|
5118
5120
|
/* @__PURE__ */ e("div", { className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-blue-100 text-sm font-bold text-blue-700", children: n.number }),
|
|
5119
5121
|
/* @__PURE__ */ r("div", { className: "space-y-2", children: [
|
|
5120
5122
|
/* @__PURE__ */ e("h3", { className: "text-base font-semibold text-gray-900", children: t(`tutorial.steps.${n.number}.title`, { defaultValue: n.title }) }),
|
|
@@ -5152,7 +5154,7 @@ function ss() {
|
|
|
5152
5154
|
] })
|
|
5153
5155
|
] }) }, n.number);
|
|
5154
5156
|
}),
|
|
5155
|
-
/* @__PURE__ */ e(
|
|
5157
|
+
/* @__PURE__ */ e(U, { children: /* @__PURE__ */ r("div", { className: "flex gap-4", children: [
|
|
5156
5158
|
/* @__PURE__ */ e("div", { className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-green-100 text-sm font-bold text-green-700", children: "✓" }),
|
|
5157
5159
|
/* @__PURE__ */ r("div", { className: "space-y-2", children: [
|
|
5158
5160
|
/* @__PURE__ */ e("h3", { className: "text-base font-semibold text-gray-900", children: t("tutorial.readyTitle") }),
|
|
@@ -5216,10 +5218,10 @@ function Cn() {
|
|
|
5216
5218
|
getMessages: x,
|
|
5217
5219
|
hasMoreHistory: z,
|
|
5218
5220
|
isLoadingOlder: j,
|
|
5219
|
-
isThinking:
|
|
5221
|
+
isThinking: V,
|
|
5220
5222
|
getDemoStatus: Y,
|
|
5221
5223
|
getDemoTypingCue: de
|
|
5222
|
-
} = tt(), P = H(null), K = H(null), ie = H(null), oe = H(null), [ge, T] = S(0), Q = H(!1), ce = H(null), ae = H(0), Be = H(!0), Pe = H(null), _e = H(!1), $e = H(null), Re = x(n), he = B === "connected", xe =
|
|
5224
|
+
} = tt(), P = H(null), K = H(null), ie = H(null), oe = H(null), [ge, T] = S(0), Q = H(!1), ce = H(null), ae = H(0), Be = H(!0), Pe = H(null), _e = H(!1), $e = H(null), Re = x(n), he = B === "connected", xe = V(n), qe = Y(n), ze = de(n), Ae = i || qe === "running", nt = z(n), Qe = j(n), at = Re[Re.length - 1], _t = at ? `${at.type}:${at.timestamp || ""}:${at.content}` : "empty", He = we(() => {
|
|
5223
5225
|
_e.current = !0, $e.current !== null && window.clearTimeout($e.current), $e.current = window.setTimeout(() => {
|
|
5224
5226
|
_e.current = !1, $e.current = null;
|
|
5225
5227
|
}, 600);
|
|
@@ -5763,7 +5765,7 @@ function hs() {
|
|
|
5763
5765
|
(a == null ? void 0 : a.role) === "public_manager" && /* @__PURE__ */ e("p", { className: "mt-2 text-xs text-amber-700", children: i("login.demoBanner") })
|
|
5764
5766
|
] }),
|
|
5765
5767
|
D && /* @__PURE__ */ e("div", { className: "rounded-lg bg-rose-50 px-4 py-3 text-sm text-rose-700 ring-1 ring-rose-200", children: D }),
|
|
5766
|
-
/* @__PURE__ */ e(
|
|
5768
|
+
/* @__PURE__ */ e(U, { children: /* @__PURE__ */ r("form", { onSubmit: N, className: "space-y-4", children: [
|
|
5767
5769
|
o === "register" && /* @__PURE__ */ e(
|
|
5768
5770
|
X,
|
|
5769
5771
|
{
|
|
@@ -5805,7 +5807,7 @@ function hs() {
|
|
|
5805
5807
|
),
|
|
5806
5808
|
/* @__PURE__ */ e(ee, { type: "submit", className: "w-full", children: i(o === "register" ? d ? "login.createAdmin" : "login.register" : "login.signIn") })
|
|
5807
5809
|
] }) }),
|
|
5808
|
-
(a == null ? void 0 : a.role) === "public_manager" && /* @__PURE__ */ e(
|
|
5810
|
+
(a == null ? void 0 : a.role) === "public_manager" && /* @__PURE__ */ e(U, { children: /* @__PURE__ */ r("div", { className: "space-y-3", children: [
|
|
5809
5811
|
/* @__PURE__ */ r("div", { children: [
|
|
5810
5812
|
/* @__PURE__ */ e("h2", { className: "text-sm font-semibold text-fg", children: i("login.browsingTitle") }),
|
|
5811
5813
|
/* @__PURE__ */ e("p", { className: "mt-1 text-sm text-fg-muted", children: i("login.browsingBody") })
|
|
@@ -5909,11 +5911,11 @@ function ys() {
|
|
|
5909
5911
|
}
|
|
5910
5912
|
return /* @__PURE__ */ r("div", { className: "space-y-6", children: [
|
|
5911
5913
|
/* @__PURE__ */ e("p", { className: "text-sm text-gray-500", children: "Import balances from your previous system. Each section creates the appropriate documents (Journal Entry, Stock Entry, or Invoices) and submits them automatically." }),
|
|
5912
|
-
/* @__PURE__ */ e(
|
|
5914
|
+
/* @__PURE__ */ e(U, { title: "Common Settings", children: /* @__PURE__ */ r("div", { className: "flex flex-wrap items-end gap-4", children: [
|
|
5913
5915
|
/* @__PURE__ */ e(ke, { label: "Company", value: a, onChange: s, linkDoctype: "company", readOnly: !1 }),
|
|
5914
5916
|
/* @__PURE__ */ e(X, { label: "As-of Date", type: "date", value: l, onChange: (g) => i(g.target.value) })
|
|
5915
5917
|
] }) }),
|
|
5916
|
-
/* @__PURE__ */ r(
|
|
5918
|
+
/* @__PURE__ */ r(U, { title: "1. Account Balances", children: [
|
|
5917
5919
|
/* @__PURE__ */ e("p", { className: "mb-3 text-xs text-gray-500", children: "Enter your trial balance from the old system. The difference will be automatically balanced against Opening Balance Equity. For receivable/payable accounts, also set the party type and party." }),
|
|
5918
5920
|
/* @__PURE__ */ e("div", { children: /* @__PURE__ */ r("table", { className: "min-w-full text-sm", children: [
|
|
5919
5921
|
/* @__PURE__ */ e("thead", { className: "bg-gray-50", children: /* @__PURE__ */ r("tr", { children: [
|
|
@@ -5945,7 +5947,7 @@ function ys() {
|
|
|
5945
5947
|
] })
|
|
5946
5948
|
] })
|
|
5947
5949
|
] }),
|
|
5948
|
-
/* @__PURE__ */ r(
|
|
5950
|
+
/* @__PURE__ */ r(U, { title: "2. Stock Balances", children: [
|
|
5949
5951
|
/* @__PURE__ */ e("p", { className: "mb-3 text-xs text-gray-500", children: "Enter your current inventory. Creates a Stock Entry (Opening Stock) — posts Dr Stock In Hand / Cr Opening Balance Equity so the P&L isn't distorted by day-one inventory." }),
|
|
5950
5952
|
/* @__PURE__ */ e("div", { className: "mb-3", children: /* @__PURE__ */ e(ke, { label: "Warehouse", value: c, onChange: o, linkDoctype: "warehouse", readOnly: !1 }) }),
|
|
5951
5953
|
/* @__PURE__ */ e("div", { children: /* @__PURE__ */ r("table", { className: "min-w-full text-sm", children: [
|
|
@@ -5973,7 +5975,7 @@ function ys() {
|
|
|
5973
5975
|
] })
|
|
5974
5976
|
] })
|
|
5975
5977
|
] }),
|
|
5976
|
-
/* @__PURE__ */ r(
|
|
5978
|
+
/* @__PURE__ */ r(U, { title: "3. Outstanding Invoices", children: [
|
|
5977
5979
|
/* @__PURE__ */ e("p", { className: "mb-3 text-xs text-gray-500", children: "Enter unpaid invoices from your old system. Creates submitted Sales or Purchase Invoices with the correct outstanding amounts for AR/AP aging." }),
|
|
5978
5980
|
/* @__PURE__ */ e("div", { children: /* @__PURE__ */ r("table", { className: "min-w-full text-sm", children: [
|
|
5979
5981
|
/* @__PURE__ */ e("thead", { className: "bg-gray-50", children: /* @__PURE__ */ r("tr", { children: [
|
|
@@ -6049,7 +6051,7 @@ function fs() {
|
|
|
6049
6051
|
onSuccess: () => n.invalidateQueries({ queryKey: ["auth-users"] })
|
|
6050
6052
|
});
|
|
6051
6053
|
return (t == null ? void 0 : t.role) !== "admin" ? /* @__PURE__ */ e("p", { className: "py-8 text-center text-gray-400", children: "Admin access required" }) : /* @__PURE__ */ r("div", { className: "space-y-6", children: [
|
|
6052
|
-
/* @__PURE__ */ e(
|
|
6054
|
+
/* @__PURE__ */ e(U, { title: "Roles", children: /* @__PURE__ */ r("div", { className: "grid gap-3 text-sm sm:grid-cols-3", children: [
|
|
6053
6055
|
/* @__PURE__ */ r("div", { className: "rounded-lg border border-blue-200 bg-blue-50 p-3", children: [
|
|
6054
6056
|
/* @__PURE__ */ e("div", { className: "font-semibold text-blue-900", children: "Admin" }),
|
|
6055
6057
|
/* @__PURE__ */ e("p", { className: "mt-1 text-blue-700", children: "Full access. Can create and manage documents, masters, company setup, and users. Can invite team members and change roles." })
|
|
@@ -6063,7 +6065,7 @@ function fs() {
|
|
|
6063
6065
|
/* @__PURE__ */ e("p", { className: "mt-1 text-gray-600", children: "Read-only access to all documents, masters, and reports. Can use the AI chat. Cannot create or modify any data." })
|
|
6064
6066
|
] })
|
|
6065
6067
|
] }) }),
|
|
6066
|
-
/* @__PURE__ */ r(
|
|
6068
|
+
/* @__PURE__ */ r(U, { title: "Invite User", children: [
|
|
6067
6069
|
/* @__PURE__ */ r("div", { className: "flex flex-wrap items-end gap-4", children: [
|
|
6068
6070
|
/* @__PURE__ */ e(
|
|
6069
6071
|
X,
|
|
@@ -6106,7 +6108,7 @@ function fs() {
|
|
|
6106
6108
|
] })
|
|
6107
6109
|
] })
|
|
6108
6110
|
] }),
|
|
6109
|
-
l && l.filter((h) => !h.used).length > 0 && /* @__PURE__ */ e(
|
|
6111
|
+
l && l.filter((h) => !h.used).length > 0 && /* @__PURE__ */ e(U, { title: "Pending Invites", children: /* @__PURE__ */ r("table", { className: "min-w-full divide-y divide-gray-200 text-sm", children: [
|
|
6110
6112
|
/* @__PURE__ */ e("thead", { className: "bg-gray-50", children: /* @__PURE__ */ r("tr", { children: [
|
|
6111
6113
|
/* @__PURE__ */ e("th", { className: "px-4 py-2 text-left font-medium text-gray-500", children: "Email" }),
|
|
6112
6114
|
/* @__PURE__ */ e("th", { className: "px-4 py-2 text-left font-medium text-gray-500", children: "Role" }),
|
|
@@ -6121,7 +6123,7 @@ function fs() {
|
|
|
6121
6123
|
] }, h.token);
|
|
6122
6124
|
}) })
|
|
6123
6125
|
] }) }),
|
|
6124
|
-
/* @__PURE__ */ e(
|
|
6126
|
+
/* @__PURE__ */ e(U, { title: "Team Members", children: s ? /* @__PURE__ */ e("p", { className: "text-gray-500", children: "Loading..." }) : /* @__PURE__ */ r("table", { className: "min-w-full divide-y divide-gray-200 text-sm", children: [
|
|
6125
6127
|
/* @__PURE__ */ e("thead", { className: "bg-gray-50", children: /* @__PURE__ */ r("tr", { children: [
|
|
6126
6128
|
/* @__PURE__ */ e("th", { className: "px-4 py-2 text-left font-medium text-gray-500", children: "Name" }),
|
|
6127
6129
|
/* @__PURE__ */ e("th", { className: "px-4 py-2 text-left font-medium text-gray-500", children: "Email" }),
|
|
@@ -6178,14 +6180,14 @@ const bs = { save: "Save", saving: "Saving...", submit: "Submit", cancel: "Cance
|
|
|
6178
6180
|
fields: Ls,
|
|
6179
6181
|
tables: Bs,
|
|
6180
6182
|
tutorial: Es
|
|
6181
|
-
}, qs = { save: "Speichern", saving: "Speichern...", submit: "Buchen", cancel: "Abbrechen", cancelDoc: "Stornieren", delete: "Löschen", edit: "Bearbeiten", pdf: "PDF", addRow: "Zeile hinzufügen", loading: "Lädt...", enable: "Aktivieren", disable: "Deaktivieren", refresh: "Aktualisieren", refreshing: "Aktualisiert...", areYouSure: "Sind Sie sicher?", all: "Alle", apply: "Anwenden", new: "Neu", prev: "Zurück", next: "Weiter", perPage: "Pro Seite", page: "Seite", of: "von", showing: "Zeige", total: "Gesamt", totals: "Summen", errorOccurred: "Ein Fehler ist aufgetreten" }, zs = { title: "Sprache", help: "Wählen Sie die Sprache der Oberfläche. Ihre Auswahl wird in diesem Browser gespeichert.", label: "Sprache" }, Fs = { logout: "Abmelden", openMenu: "Menü öffnen", closeMenu: "Menü schließen", new: "Neu: {{label}}" }, Ms = { dashboard: "Dashboard", setup: "Unternehmenseinrichtung", tutorial: "Erste Schritte", chat: "Chat", reports: "Berichte", "trial-balance": "Rohbilanz", "general-ledger": "Hauptbuch", "stock-balance": "Lagerbestand", "profit-and-loss": "Gewinn- und Verlustrechnung", "balance-sheet": "Bilanz", "ar-aging": "Offene Posten Debitoren", "ap-aging": "Offene Posten Kreditoren", analytics: "Analysen" }, $s = { quotation: { one: "Angebot", other: "Angebote" }, "sales-order": { one: "Kundenauftrag", other: "Kundenaufträge" }, "sales-invoice": { one: "Ausgangsrechnung", other: "Ausgangsrechnungen" }, "pos-invoice": { one: "Kassenbeleg", other: "Kassenbelege" }, "purchase-order": { one: "Bestellung", other: "Bestellungen" }, "purchase-invoice": { one: "Eingangsrechnung", other: "Eingangsrechnungen" }, "payment-entry": { one: "Zahlung", other: "Zahlungen" }, "journal-entry": { one: "Buchungssatz", other: "Buchungssätze" }, "bank-transaction": { one: "Banktransaktion", other: "Banktransaktionen" }, budget: { one: "Budget", other: "Budgets" }, subscription: { one: "Abonnement", other: "Abonnements" }, "stock-entry": { one: "Lagerbuchung", other: "Lagerbuchungen" }, "delivery-note": { one: "Lieferschein", other: "Lieferscheine" }, "purchase-receipt": { one: "Wareneingang", other: "Wareneingänge" }, "pricing-rule": { one: "Preisregel", other: "Preisregeln" } }, Vs = { company: { one: "Unternehmen", other: "Unternehmen" }, customer: { one: "Kunde", other: "Kunden" }, supplier: { one: "Lieferant", other: "Lieferanten" }, item: { one: "Artikel", other: "Artikel" }, warehouse: { one: "Lager", other: "Lager" } }, Us = { chats: "Chats", newChat: "Neuer Chat", deleteChat: "Chat löschen", customAnalytics: "Eigene Analysen", newAnalytics: "Neue Analyse", deleteReport: "Bericht löschen", groups: { Introduction: "Einführung", Selling: "Verkauf", Buying: "Einkauf", Accounting: "Buchhaltung", Stock: "Lager", Reports: "Berichte", Masters: "Stammdaten", Settings: "Einstellungen" }, items: { "Getting Started": "Erste Schritte", "Company Setup": "Unternehmenseinrichtung", "Opening Balances": "Eröffnungsbilanzen", Quotation: "Angebot", "Sales Order": "Kundenauftrag", "Sales Invoice": "Ausgangsrechnung", "POS Invoice": "Kassenbeleg", "Purchase Order": "Bestellung", "Purchase Invoice": "Eingangsrechnung", "Payment Entry": "Zahlung", "Journal Entry": "Buchungssatz", "Bank Transaction": "Banktransaktion", Budget: "Budget", Subscription: "Abonnement", "Stock Entry": "Lagerbuchung", "Delivery Note": "Lieferschein", "Purchase Receipt": "Wareneingang", "Trial Balance": "Rohbilanz", "Profit & Loss": "Gewinn- und Verlustrechnung", "Balance Sheet": "Bilanz", "General Ledger": "Hauptbuch", "AR Aging": "Offene Posten Debitoren", "AP Aging": "Offene Posten Kreditoren", Analytics: "Analysen", "Stock Balance": "Lagerbestand", Company: "Unternehmen", Customer: "Kunde", Supplier: "Lieferant", Item: "Artikel", Warehouse: "Lager", General: "Allgemein", "Pricing Rule": "Preisregel", "Users & Team": "Benutzer & Team" } }, Gs = { taglineFirstRun: "Erstellen Sie Ihr Administratorkonto, um zu beginnen", taglineRegister: "Erstellen Sie Ihr Konto", taglineSignIn: "Melden Sie sich bei Ihrem Konto an", demoBanner: "Der Demomodus ist aktiv. Melden Sie sich mit einem Administratorkonto an, um Einstellungen zu verwalten oder den öffentlichen Zugriff zu deaktivieren.", fullName: "Vollständiger Name", email: "E-Mail", password: "Passwort", confirmPassword: "Passwort bestätigen", createAdmin: "Administratorkonto erstellen", register: "Registrieren", signIn: "Anmelden", browsingTitle: "Nur am Stöbern?", browsingBody: "Starten Sie eine neue Chat-Sitzung und sehen Sie sich die Live-Demo an.", enterDemo: "Live-Demo starten", haveInvite: "Haben Sie eine Einladung?", registerLink: "Registrieren", alreadyHaveAccount: "Haben Sie bereits ein Konto?", signInLink: "Anmelden", passwordsNoMatch: "Passwörter stimmen nicht überein", passwordTooShort: "Das Passwort muss mindestens 6 Zeichen lang sein", registrationFailed: "Registrierung fehlgeschlagen", loginFailed: "Anmeldung fehlgeschlagen" }, js = { pdfTitle: "PDF & Druck", pageSize: "Seitengröße", pdfHelp: "A4 ist international Standard (210 x 297 mm). Letter ist Standard in den USA (8,5 x 11 Zoll).", openingTitle: "Eröffnungsbilanzen", openingBody: "Auf der Seite Eröffnungsbilanzen können Kontensalden, Lagerbestände und offene Rechnungen aus einem früheren System importiert werden.", openingEnabled: "Derzeit aktiviert — erreichbar unter Einführung > Eröffnungsbilanzen.", openingDisabled: "Derzeit deaktiviert — die Seite ist in der Seitenleiste ausgeblendet.", publicTitle: "Öffentlicher Zugriff (Demomodus)", publicActive: "Aktiv", publicActiveBody: "Der öffentliche Zugriff ist aktiviert. Jeder kann die Anwendung ohne Anmeldung nutzen. Alle Besucher erhalten Manager-Rechte.", disablePublic: "Öffentlichen Zugriff deaktivieren", disabling: "Wird deaktiviert...", publicInactiveBody: "Aktivieren Sie den öffentlichen Zugriff, damit jeder die Anwendung ohne Konto nutzen kann. Nützlich für Demos und Präsentationen. Alle Besucher erhalten Manager-Rechte und teilen sich dieselbe Identität.", enablePublic: "Öffentlichen Zugriff aktivieren", enableWarning: "Dadurch kann jeder ohne Anmeldung auf die Anwendung zugreifen. Besucher können Dokumente erstellen, bearbeiten und buchen. Ihr Administratorkonto erfordert weiterhin eine Anmeldung.", yesEnable: "Ja, aktivieren", enabling: "Wird aktiviert...", demoSpendTitle: "Demo-Ausgaben" }, Ws = { Draft: "Entwurf", Open: "Offen", Submitted: "Gebucht", "To Deliver and Bill": "Zu liefern und abzurechnen", "To Deliver": "Zu liefern", "To Bill": "Abzurechnen", Completed: "Abgeschlossen", Ordered: "Bestellt", Paid: "Bezahlt", Unpaid: "Unbezahlt", Cancelled: "Storniert", Overdue: "Überfällig", Return: "Retoure", Closed: "Geschlossen" }, Ks = { balanced: "AUSGEGLICHEN", imbalanced: "NICHT AUSGEGLICHEN", income: "Erträge", expenses: "Aufwendungen", totalIncome: "Summe Erträge", totalExpenses: "Summe Aufwendungen", netProfit: "Gewinn", netLoss: "Verlust", assets: "Aktiva", liabilities: "Verbindlichkeiten", equity: "Eigenkapital", totalAssets: "Summe Aktiva", totalLiabilities: "Summe Verbindlichkeiten", totalEquity: "Summe Eigenkapital", totalLiabilitiesEquity: "Summe Verbindlichkeiten + Eigenkapital", current: "Laufend", noData: "Keine Daten gefunden", noEntries: "Keine Buchungen gefunden", noStockData: "Keine Lagerdaten gefunden", noReceivables: "Keine offenen Forderungen", noPayables: "Keine offenen Verbindlichkeiten", noDocuments: "Keine Dokumente gefunden" }, Qs = { required: "Erforderlich: {{fields}}", deleteConfirm: "Diesen Datensatz löschen: {{label}}?", disabledNotice: "Dieser Datensatz ({{label}}) ist deaktiviert. Er verbleibt im System, weil andere Datensätze noch darauf verweisen.", disabledOnDelete: "{{label}} {{name}} wurde deaktiviert statt gelöscht, da er von {{reason}} referenziert wird." }, Hs = { Account: "Konto", Amount: "Betrag", Balance: "Saldo", Credit: "Haben", Debit: "Soll", Date: "Datum", Party: "Partner", "Party Type": "Partnertyp", "Voucher Type": "Belegart", "Voucher No": "Belegnr.", Invoice: "Rechnung", Customer: "Kunde", Supplier: "Lieferant", "Due Date": "Fälligkeitsdatum", Outstanding: "Offen", "Outstanding Amount": "Offener Betrag", "Item Code": "Artikelnr.", "Item Name": "Artikelname", Item: "Artikel", Warehouse: "Lager", Qty: "Menge", "Valuation Rate": "Bewertungspreis", "Stock Value": "Lagerwert", Name: "Name", Status: "Status", Company: "Unternehmen", "From Date": "Von Datum", "To Date": "Bis Datum", "As of Date": "Stichtag", "Valid Till": "Gültig bis", "Net Total": "Nettobetrag", Tax: "Steuer", "Grand Total": "Gesamtbetrag", "Notes / Terms": "Notizen / Bedingungen", "Posting Date": "Buchungsdatum", "Transaction Date": "Belegdatum", "Delivery Date": "Lieferdatum", "% Delivered": "% geliefert", "% Billed": "% abgerechnet", "Update Stock": "Lager aktualisieren", "Payment Type": "Zahlungsart", "Paid From": "Bezahlt von", "Paid To": "Bezahlt an", "Paid Amount": "Zahlbetrag", Type: "Art", Total: "Gesamt", Allocated: "Zugeordnet", Unallocated: "Nicht zugeordnet", Remark: "Bemerkung", "Total Debit": "Summe Soll", "Total Credit": "Summe Haben", "Cost Center": "Kostenstelle", "Source Warehouse": "Quelllager", "Target Warehouse": "Ziellager", Source: "Quelle", Target: "Ziel", "Incoming Value": "Eingangswert", "Outgoing Value": "Ausgangswert", Rate: "Preis", "Income Account": "Ertragskonto", "Expense Account": "Aufwandskonto", Description: "Beschreibung", "Rate (%)": "Satz (%)", Mode: "Art", Change: "Rückgeld", Currency: "Währung", Title: "Titel", Selling: "Verkauf", Buying: "Einkauf", "Discount %": "Rabatt %", "Discount Amt": "Rabattbetrag", "Min Qty": "Mindestmenge", "Valid From": "Gültig ab", "Valid Upto": "Gültig bis", Priority: "Priorität", Enabled: "Aktiviert", "Fiscal Year": "Geschäftsjahr", "Budget Amount": "Budgetbetrag", "If Exceeded": "Bei Überschreitung", Month: "Monat", "Bank Account": "Bankkonto", Deposit: "Einzahlung", Withdrawal: "Auszahlung", "Reference No": "Referenznr.", "Matched Type": "Zugeordnete Art", "Matched Doc": "Zugeordneter Beleg", "Start Date": "Startdatum", "End Date": "Enddatum", "Billing Interval": "Abrechnungsintervall", "Current Period Start": "Aktueller Periodenbeginn", "Current Period End": "Aktuelles Periodenende", "Plan Items": "Planpositionen", "Total Amount": "Gesamtbetrag", "Stock Entry Type": "Lagerbuchungsart", "Rate Or Discount": "Preis oder Rabatt", "Discount Percentage": "Rabattprozentsatz", ID: "ID", "Customer Name": "Kundenname", "Customer Group": "Kundengruppe", Territory: "Region", "Credit Limit": "Kreditlimit", Email: "E-Mail", Phone: "Telefon", Address: "Adresse", City: "Stadt", "Zip Code": "PLZ", Country: "Land", "Tax ID": "Steuernummer", "Supplier Name": "Lieferantenname", "Supplier Group": "Lieferantengruppe", "Item Group": "Artikelgruppe", "Stock UOM": "Lagereinheit", "Standard Rate": "Standardpreis", "Warehouse Name": "Lagername", "Company Name": "Firmenname" }, Js = { items: "Positionen", taxes: "Steuern", references: "Zahlungsreferenzen", accounts: "Kontobuchungen", payments: "Zahlungen", plans: "Planpositionen", monthly_distribution: "Monatliche Verteilung" }, Ys = { "Create Sales Order": "Kundenauftrag erstellen", "Create Sales Invoice": "Ausgangsrechnung erstellen", "Create Delivery Note": "Lieferschein erstellen", "Create Purchase Invoice": "Eingangsrechnung erstellen", "Create Purchase Receipt": "Wareneingang erstellen", "Create Credit Note": "Gutschrift erstellen", "Create Debit Note": "Lastschrift erstellen", "Create Return": "Retoure erstellen" }, Zs = { totalRevenue: "Gesamtumsatz", outstandingReceivable: "Offene Forderungen", outstandingPayable: "Offene Verbindlichkeiten", totalStockValue: "Gesamter Lagerwert", recentDocuments: "Letzte Dokumente", noRecentDocuments: "Keine aktuellen Dokumente" }, Xs = { title: "Lambda ERP Chat", subtitle: "Bitten Sie mich, Dokumente zu erstellen, Daten abzurufen oder Berichte auszuführen.", s1: "Welche Kunden haben wir?", s2: "Zeig mir die Rohbilanz", s3: "Erstelle ein Angebot für 10 Bolt Pack M8", s4: "Liste alle unbezahlten Rechnungen auf", loadOlder: "Ältere Nachrichten laden", uploading: "Wird hochgeladen...", failed: "Fehlgeschlagen", remove: "Entfernen", placeholderDemo: "Live-Demo läuft...", placeholderType: "Nachricht eingeben...", placeholderConnecting: "Verbindung wird hergestellt...", attachTitle: "Datei anhängen (PDF oder Bild, max. 10 MB)", creating: "Chat wird erstellt...", dropToAttach: "Datei zum Anhängen ablegen (Bilder oder PDF, je max. 10 MB)", demoError: "Demo konnte nicht gestartet werden" }, ei = /* @__PURE__ */ JSON.parse('{"pageTitle":"Erste Schritte mit Lambda ERP","intro":"Lambda ERP ist ein KI-natives ERP-System, bei dem die gesamte Funktionalität – etwa das Erstellen von Aufträgen, das Prüfen von Beständen und das Erfassen von Zahlungen – über eine Chat-Oberfläche zugänglich ist. Es leitet an, denkt mit und prüft alle Ihre täglichen Geschäftsaufgaben.","openChat":"KI-Chat öffnen","tipLabel":"Tipp:","topTip":"Der KI-Chat kann Ihnen auch direkte Links zu Dokumenten und herunterladbaren PDFs geben. Bitten Sie ihn einfach, ein Dokument zu erstellen oder nachzuschlagen, und er fügt anklickbare Links in seine Antwort ein.","manualIntro":"Wenn Sie genau verstehen möchten, wie die Dinge unter der Haube funktionieren, oder Dinge lieber manuell erledigen, finden Sie hier einen vollständigen Geschäftszyklus Schritt für Schritt.","caTitle":"Dynamische Analysen – Chatten Sie sich zu jedem Diagramm","caBadge":"Kernfunktion","caBody":"Brauchen Sie einen Bericht, den die Vorlagen nicht liefern? Beschreiben Sie ihn einfach im Chat. Der Assistent ruft ein Code-Spezialmodell auf, das den Bericht für Sie schreibt, ihn live über Ihre ERP-Daten ausführt und einen teilbaren Link zurückgibt. Das Diagramm oder die Tabelle wird in Sekunden gerendert und als Entwurf unter „Eigene Analysen“ in der Seitenleiste gespeichert – Sie können ihn erneut öffnen, die URL mit Kollegen teilen oder den Assistenten bitten, ihn zu verfeinern.","caTryAsking":"Versuchen Sie zu fragen (zum Vorausfüllen im Chat klicken):","caPrompt1":"Zeig mir die Top 10 Kunden nach Umsatz dieses Jahr als Balkendiagramm","caPrompt2":"Monatlicher Einkaufstrend nach Lieferant über alle Monate, x-Achse mit Lieferantennamen beschriften","caPrompt3":"Bestseller-Artikel nach Menge, mit Tabelle und Diagramm","caPrompt4":"Welche Kunden schulden mir gerade am meisten?","caTryInChat":"Im Chat ausprobieren","caOpenWorkspace":"Analyse-Arbeitsbereich öffnen","flowTitle":"Überblick Dokumentenfluss","salesCycle":"Verkaufszyklus","purchaseCycle":"Einkaufszyklus","returns":"Retouren","flowShortcut":"Abkürzung: Das Angebot kann den Kundenauftrag überspringen und direkt zur Ausgangsrechnung oder zum Lieferschein führen","legendStock":"Lagerwirkung","legendGl":"Buchungswirkung","legendCash":"Geldwirkung","legendReversal":"Stornierung","lifecycleTitle":"Dokumenten-Lebenszyklus","lcDraftLabel":"Entwurf:","lcDraftDesc":"Bearbeitbar. Keine finanzielle oder Bestandswirkung.","lcSubmittedLabel":"Gebucht:","lcSubmittedDesc":"Gesperrt. Buchungen und Lagerbuchungen werden erzeugt.","lcCancelledLabel":"Storniert:","lcCancelledDesc":"Alle Buchungen storniert. Das Dokument wird dauerhaft archiviert.","lcNoDelete":"Es gibt kein Löschen. Um einen Entwurf zu verwerfen: buchen und dann stornieren.","lcCorrect":"Um ein gebuchtes Dokument zu korrigieren: stornieren und ein neues erstellen.","readyTitle":"Sie sind startklar","readyBody1":"Sie verstehen jetzt den vollständigen Zyklus. Ein typisches Praxisszenario sieht so aus: Sie erhalten einen Kundenauftrag (Angebot → Kundenauftrag), prüfen den Bestand, kaufen, was Sie brauchen (Bestellung → Wareneingang → Eingangsrechnung → Zahlung), liefern an den Kunden (Lieferschein), stellen ihm die Rechnung (Ausgangsrechnung) und ziehen die Zahlung ein (Zahlung). Kommt etwas zurück, erstellen Sie eine Gutschrift und eine Lieferschein-Retoure, um Finanzen und Bestand umzukehren. Die Rohbilanz bestätigt, dass alles ausgeglichen ist.","readyBody2":"Sie können all dies auch über den KI-Chat per natürlicher Konversation erledigen – beschreiben Sie einfach, was Sie brauchen, und er erstellt die richtigen Dokumente für Sie.","chips":{"Quotation":"Angebot","Sales Order":"Kundenauftrag","Delivery Note":"Lieferschein","Sales Invoice":"Ausgangsrechnung","Payment Entry":"Zahlung","Purchase Order":"Bestellung","Purchase Receipt":"Wareneingang","Purchase Invoice":"Eingangsrechnung","Credit Note":"Gutschrift","DN Return":"Lieferschein-Retoure","Debit Note":"Lastschrift","Draft":"Entwurf","Submitted":"Gebucht","Cancelled":"Storniert"},"links":{"Go to Setup":"Zur Einrichtung","Customers":"Kunden","Suppliers":"Lieferanten","Items":"Artikel","Warehouses":"Lager","New Quotation":"Neues Angebot","View Quotations":"Angebote anzeigen","Stock Balance":"Lagerbestand","New Purchase Order":"Neue Bestellung","Purchase Receipts":"Wareneingänge","Purchase Invoices":"Eingangsrechnungen","Delivery Notes":"Lieferscheine","Sales Invoices":"Ausgangsrechnungen","New Payment Entry":"Neue Zahlung","New Stock Entry":"Neue Lagerbuchung","New Journal Entry":"Neuer Buchungssatz","Profit & Loss":"Gewinn- und Verlustrechnung","Balance Sheet":"Bilanz","AR Aging":"Offene Posten Debitoren","AP Aging":"Offene Posten Kreditoren","Trial Balance":"Rohbilanz","General Ledger":"Hauptbuch","Open AI Chat":"KI-Chat öffnen"},"steps":{"1":{"title":"Unternehmen einrichten","description":"Erstellen Sie ein Unternehmen mit einer Basiswährung. Dadurch wird Ihr Kontenplan generiert (30 Standardkonten in den Bereichen Aktiva, Verbindlichkeiten, Eigenkapital, Erträge und Aufwendungen) sowie eine Standard-Kostenstelle. Sie können außerdem Demodaten mit Beispielkunden, -lieferanten und -artikeln anlegen, um schnell loszulegen."},"2":{"title":"Stammdaten anlegen","description":"Bevor Sie buchen können, benötigen Sie Stammdaten. Legen Sie mindestens einen Kunden, einen Lieferanten, einen Artikel (mit Standardpreis) und ein Lager an. Wenn Sie in Schritt 1 Demodaten angelegt haben, existieren diese bereits.","tip":"Artikel haben einen Standardpreis, der beim Hinzufügen zu Dokumenten automatisch ausgefüllt wird. Sie können den Preis pro Transaktion jederzeit überschreiben."},"3":{"title":"Angebot erstellen","description":"Ein Angebot ist eine unverbindliche Offerte an einen Kunden. Wählen Sie einen Kunden, fügen Sie Positionen mit Mengen und Preisen hinzu, optional Steuerzeilen, und speichern Sie. Angebote haben keine finanzielle Auswirkung – sie erzeugen keine Buchungs- oder Lagerbewegungen. Legen Sie ein Gültigkeitsdatum fest, damit das Angebot automatisch abläuft."},"4":{"title":"Buchen und in Kundenauftrag umwandeln","description":"Öffnen Sie Ihr gespeichertes Angebot und klicken Sie auf Buchen, um es zu bestätigen. Klicken Sie dann auf „Kundenauftrag erstellen“, um es umzuwandeln. Der Kundenauftrag stellt eine bestätigte Zusage des Kunden dar. Er hat weiterhin keine finanzielle Auswirkung, reserviert aber Bestand für die Planung.","tip":"Nur gebuchte Dokumente können in den nächsten Schritt umgewandelt werden. Entwurf → Buchen → Umwandeln ist der Standardablauf. Für schnelle Geschäfte können Sie den Kundenauftrag überspringen und direkt vom Angebot zur Ausgangsrechnung oder zum Lieferschein gehen."},"5":{"title":"Bestand vor der Erfüllung prüfen","description":"Bevor Sie liefern können, prüfen Sie, ob der Artikel tatsächlich auf Lager ist. Öffnen Sie den Bericht Lagerbestand und suchen Sie den Artikel. Wenn Ihr Lager eine Menge von null aufweist, müssen Sie zunächst Bestand beschaffen – entweder über eine Bestellung (Einkauf bei einem Lieferanten) oder eine Lagerbuchung (manueller Eingang).","tip":"Dies ist ein häufiges Szenario aus der Praxis: Sie verkaufen etwas und stellen dann fest, dass Sie es erst einkaufen müssen. Das ERP unterstützt beide Abläufe."},"6":{"title":"Einkaufszyklus: Bestand bei einem Lieferanten kaufen","description":"Wenn Sie Bestand einkaufen müssen, haben Sie zwei gültige Wege. Der Standardweg ist Bestellung → Wareneingang → Eingangsrechnung: Nutzen Sie ihn, wenn die Ware vor oder getrennt von der Lieferantenrechnung eintrifft. Treffen Rechnung und Wareneingang gleichzeitig ein, können Sie die Eingangsrechnung direkt erstellen und „Lager aktualisieren“ aktivieren, sodass dasselbe Dokument sowohl den Bestand vereinnahmt als auch die Verbindlichkeit erfasst.","tip":"Verwenden Sie zuerst den Wareneingang, wenn Sie Waren getrennt erhalten. Verwenden Sie die Eingangsrechnung mit „Lager aktualisieren“, wenn ein Schritt sowohl den Bestand vereinnahmen als auch die Lieferantenrechnung buchen soll. Setzen Sie in diesem direkten Weg ein Lager in jeder Bestandszeile."},"7":{"title":"Lieferschein erstellen","description":"Nachdem Sie nun Bestand haben, kehren Sie zu Ihrem gebuchten Kundenauftrag zurück und klicken Sie auf „Lieferschein erstellen“. Setzen Sie in jeder Position das Lager (von dem die Ware versendet wird) und buchen Sie. Dadurch wird Bestand aus dem Lager ausgebucht – Ihr Lagerbestand sinkt.","tip":"Der Lieferschein ist das Versanddokument. Er reduziert den Bestand, erzeugt aber keine Rechnung. Sie können Lieferung und Rechnungsstellung getrennt vornehmen."},"8":{"title":"Ausgangsrechnung erstellen und buchen","description":"Erstellen Sie aus dem gebuchten Kundenauftrag eine Ausgangsrechnung. Beim Buchen der Rechnung werden Buchungen erzeugt: Forderungen aus Lieferungen und Leistungen werden im Soll gebucht (der Kunde schuldet Ihnen Geld) und Umsatzerlöse im Haben (erzielter Ertrag). Sind Steuern konfiguriert, wird auch die Steuerverbindlichkeit im Haben gebucht. Der offene Betrag zeigt, was der Kunde noch schuldet."},"9":{"title":"Kundenzahlungen erfassen","description":"Erstellen Sie eine Zahlung, um vom Kunden erhaltenes Geld zu erfassen. Setzen Sie die Zahlungsart auf „Receive“ (Erhalten), wählen Sie den Kunden, geben Sie den Betrag an und ordnen Sie ihn der Ausgangsrechnung zu. Sie können Teilzahlungen vornehmen – der offene Betrag der Rechnung aktualisiert sich entsprechend. Erstellen Sie weitere Zahlungen, bis die Rechnung vollständig beglichen ist.","tip":"Teilzahlungen sind üblich. Eine Rechnung über 10.000 kann jetzt mit 3.000 und später mit 7.000 bezahlt werden. Jede Zahlung reduziert den offenen Betrag."},"10":{"title":"Lagerbuchungen (manuelle Bestandsführung)","description":"Verwenden Sie Lagerbuchungen für Bestandsbewegungen, die nicht mit Ein- oder Verkäufen verbunden sind. „Material Receipt“ fügt Bestand hinzu (Eröffnungsbestände, Korrekturen). „Material Issue“ bucht Bestand aus (Abschreibungen, interner Verbrauch). „Material Transfer“ verschiebt Bestand zwischen Lägern. Jede Buchung aktualisiert das Lagerbuch mit gleitender Durchschnittsbewertung.","tip":"Verwenden Sie für eingekaufte Waren Wareneingänge statt Lagerbuchungen – sie sind mit der Bestellung verknüpft und bieten einen sauberen Prüfpfad."},"11":{"title":"Buchungssätze","description":"Buchungssätze sind manuelle buchhalterische Anpassungen – Aufwandsabgrenzungen, Korrekturen, Umgliederungen, Eröffnungsbestände. Jeder Satz muss ausgeglichene Soll- und Haben-Beträge haben (Summe Soll = Summe Haben). Verwenden Sie sie, wenn kein anderer Dokumenttyp passt."},"12":{"title":"Gehaltszahlungen","description":"Lambda ERP wickelt Gehälter über die vorhandenen Buchhaltungswerkzeuge ab. Grenzen Sie zunächst den Gehaltsaufwand ab: Erstellen Sie einen Buchungssatz, der Gehaltsaufwand im Soll und Gehaltsverbindlichkeiten im Haben für den gesamten Lohnbetrag bucht. Bezahlen Sie dann die Mitarbeiter: Erstellen Sie einen weiteren Buchungssatz (oder eine Zahlung), der Gehaltsverbindlichkeiten im Soll und Ihr Bankkonto im Haben bucht. Dieser zweistufige Prozess hält Ihre Bücher korrekt – der Aufwand wird in der richtigen Periode erfasst und der Geldabfluss separat nachverfolgt.","tip":"Sie können den KI-Assistenten bitten, dies für Sie zu erledigen: „Grenze 15.000 an Gehältern für April ab“ gefolgt von „Zahle die April-Gehälter von der Bank“. Er erstellt die richtigen Buchungssätze automatisch."},"13":{"title":"Retouren und Gutschriften","description":"Wenn ein Kunde Waren zurückgibt oder Sie eine Gutschrift ausstellen müssen, erstellen Sie eine Retoure. Retouren verwenden denselben Dokumenttyp mit negativen Mengen. Öffnen Sie eine gebuchte Ausgangsrechnung und erstellen Sie eine Gutschrift (Ausgangsrechnungs-Retoure) – dies kehrt die Buchungen um und reduziert den offenen Betrag der ursprünglichen Rechnung. Erstellen Sie für den Bestand eine Lieferschein-Retoure, um Waren zurück ins Lager zu nehmen. Auf der Einkaufsseite erstellen Sie eine Lastschrift (Eingangsrechnungs-Retoure), um eine Lieferantenrechnung umzukehren, oder eine Wareneingangs-Retoure, um Waren zurückzusenden.","tip":"Eine Gutschrift ist einfach eine Ausgangsrechnung mit is_return=1 und negativen Mengen. Dieselbe Buchungslogik läuft – negative Beträge wechseln automatisch auf die richtige Soll-/Haben-Seite. Für eine vollständige Verkaufsretoure benötigen Sie sowohl eine Gutschrift (Finanzen) als auch eine Lieferschein-Retoure (Bestand)."},"14":{"title":"Berichte ausführen","description":"Prüfen Sie Ihre Bücher. Die Gewinn- und Verlustrechnung zeigt Erträge gegenüber Aufwendungen und den Periodengewinn. Die Bilanz zeigt Ihre finanzielle Lage (Aktiva = Verbindlichkeiten + Eigenkapital). Die Offenen Posten Debitoren zeigen, wer Ihnen Geld schuldet und wie überfällig es ist. Die Offenen Posten Kreditoren zeigen, was Sie Lieferanten schulden. Die Rohbilanz überprüft die doppelte Buchführung. Das Hauptbuch zeigt jede einzelne Buchung. Der Lagerbestand zeigt den aktuellen Bestand."},"15":{"title":"Arbeiten in Fremdwährungen","description":"Ihre Bücher werden in einer einzigen Basiswährung geführt (bei der Unternehmenseinrichtung gewählt), aber Sie können in jeder Währung buchen. Setzen Sie eine Währung auf einer Rechnung oder einem Beleg – oder geben Sie einem Kunden oder Lieferanten eine Standardwährung – und der Wechselkurs für dieses Datum wird automatisch ermittelt und auf dem Dokument gespeichert. Das Dokument behält seine Beträge in seiner eigenen Währung, während das Hauptbuch stets in Ihrer Basiswährung bucht. Wenn Sie später zu einem anderen Kurs einnehmen oder zahlen, wird der realisierte Währungsgewinn oder -verlust automatisch auf ein Konto Währungsgewinn/-verlust gebucht. Sie können sogar ein Fremdwährungs-Bankguthaben halten und es später zum Kurs Ihrer Bank umrechnen – die Differenz zum Buchwert wird dann realisiert. Zum Monatsende können Sie offene Fremdwährungssalden zum Stichtagskurs neu bewerten (ein unrealisierter Gewinn/Verlust, der in der nächsten Periode storniert wird), und Sie können jeden Jahresabschluss zur Anzeige in eine andere Währung umgerechnet betrachten.","tip":"Am einfachsten geht das über den KI-Chat – probieren Sie „Erstelle eine Ausgangsrechnung für Lumiere Audio in EUR“, „Zeig mir die Bilanz in EUR“ oder „Wie hoch ist unser unrealisiertes Währungsrisiko zum Monatsende?“. Die Demodaten enthalten bereits einen EUR-Kunden (Lumiere Audio SARL), dessen Rechnung zu einem anderen Kurs eingenommen wurde, sowie eine offene EUR-Lieferantenrechnung – öffnen Sie das Hauptbuch, um die realisierten Währungsbuchungen zu sehen."}}}'), ti = {
|
|
6183
|
+
}, qs = { save: "Speichern", saving: "Speichern...", submit: "Buchen", cancel: "Abbrechen", cancelDoc: "Stornieren", delete: "Löschen", edit: "Bearbeiten", pdf: "PDF", addRow: "Zeile hinzufügen", loading: "Lädt...", enable: "Aktivieren", disable: "Deaktivieren", refresh: "Aktualisieren", refreshing: "Aktualisiert...", areYouSure: "Sind Sie sicher?", all: "Alle", apply: "Anwenden", new: "Neu", prev: "Zurück", next: "Weiter", perPage: "Pro Seite", page: "Seite", of: "von", showing: "Zeige", total: "Gesamt", totals: "Summen", errorOccurred: "Ein Fehler ist aufgetreten" }, zs = { title: "Sprache", help: "Wählen Sie die Sprache der Oberfläche. Ihre Auswahl wird in diesem Browser gespeichert.", label: "Sprache" }, Fs = { logout: "Abmelden", openMenu: "Menü öffnen", closeMenu: "Menü schließen", new: "Neu: {{label}}" }, Ms = { dashboard: "Dashboard", setup: "Unternehmenseinrichtung", tutorial: "Erste Schritte", chat: "Chat", reports: "Berichte", "trial-balance": "Rohbilanz", "general-ledger": "Hauptbuch", "stock-balance": "Lagerbestand", "profit-and-loss": "Gewinn- und Verlustrechnung", "balance-sheet": "Bilanz", "ar-aging": "Offene Posten Debitoren", "ap-aging": "Offene Posten Kreditoren", analytics: "Analysen" }, $s = { quotation: { one: "Angebot", other: "Angebote" }, "sales-order": { one: "Kundenauftrag", other: "Kundenaufträge" }, "sales-invoice": { one: "Ausgangsrechnung", other: "Ausgangsrechnungen" }, "pos-invoice": { one: "Kassenbeleg", other: "Kassenbelege" }, "purchase-order": { one: "Bestellung", other: "Bestellungen" }, "purchase-invoice": { one: "Eingangsrechnung", other: "Eingangsrechnungen" }, "payment-entry": { one: "Zahlung", other: "Zahlungen" }, "journal-entry": { one: "Buchungssatz", other: "Buchungssätze" }, "bank-transaction": { one: "Banktransaktion", other: "Banktransaktionen" }, budget: { one: "Budget", other: "Budgets" }, subscription: { one: "Abonnement", other: "Abonnements" }, "stock-entry": { one: "Lagerbuchung", other: "Lagerbuchungen" }, "delivery-note": { one: "Lieferschein", other: "Lieferscheine" }, "purchase-receipt": { one: "Wareneingang", other: "Wareneingänge" }, "pricing-rule": { one: "Preisregel", other: "Preisregeln" } }, Us = { company: { one: "Unternehmen", other: "Unternehmen" }, customer: { one: "Kunde", other: "Kunden" }, supplier: { one: "Lieferant", other: "Lieferanten" }, item: { one: "Artikel", other: "Artikel" }, warehouse: { one: "Lager", other: "Lager" } }, Vs = { chats: "Chats", newChat: "Neuer Chat", deleteChat: "Chat löschen", customAnalytics: "Eigene Analysen", newAnalytics: "Neue Analyse", deleteReport: "Bericht löschen", groups: { Introduction: "Einführung", Selling: "Verkauf", Buying: "Einkauf", Accounting: "Buchhaltung", Stock: "Lager", Reports: "Berichte", Masters: "Stammdaten", Settings: "Einstellungen" }, items: { "Getting Started": "Erste Schritte", "Company Setup": "Unternehmenseinrichtung", "Opening Balances": "Eröffnungsbilanzen", Quotation: "Angebot", "Sales Order": "Kundenauftrag", "Sales Invoice": "Ausgangsrechnung", "POS Invoice": "Kassenbeleg", "Purchase Order": "Bestellung", "Purchase Invoice": "Eingangsrechnung", "Payment Entry": "Zahlung", "Journal Entry": "Buchungssatz", "Bank Transaction": "Banktransaktion", Budget: "Budget", Subscription: "Abonnement", "Stock Entry": "Lagerbuchung", "Delivery Note": "Lieferschein", "Purchase Receipt": "Wareneingang", "Trial Balance": "Rohbilanz", "Profit & Loss": "Gewinn- und Verlustrechnung", "Balance Sheet": "Bilanz", "General Ledger": "Hauptbuch", "AR Aging": "Offene Posten Debitoren", "AP Aging": "Offene Posten Kreditoren", Analytics: "Analysen", "Stock Balance": "Lagerbestand", Company: "Unternehmen", Customer: "Kunde", Supplier: "Lieferant", Item: "Artikel", Warehouse: "Lager", General: "Allgemein", "Pricing Rule": "Preisregel", "Users & Team": "Benutzer & Team" } }, Gs = { taglineFirstRun: "Erstellen Sie Ihr Administratorkonto, um zu beginnen", taglineRegister: "Erstellen Sie Ihr Konto", taglineSignIn: "Melden Sie sich bei Ihrem Konto an", demoBanner: "Der Demomodus ist aktiv. Melden Sie sich mit einem Administratorkonto an, um Einstellungen zu verwalten oder den öffentlichen Zugriff zu deaktivieren.", fullName: "Vollständiger Name", email: "E-Mail", password: "Passwort", confirmPassword: "Passwort bestätigen", createAdmin: "Administratorkonto erstellen", register: "Registrieren", signIn: "Anmelden", browsingTitle: "Nur am Stöbern?", browsingBody: "Starten Sie eine neue Chat-Sitzung und sehen Sie sich die Live-Demo an.", enterDemo: "Live-Demo starten", haveInvite: "Haben Sie eine Einladung?", registerLink: "Registrieren", alreadyHaveAccount: "Haben Sie bereits ein Konto?", signInLink: "Anmelden", passwordsNoMatch: "Passwörter stimmen nicht überein", passwordTooShort: "Das Passwort muss mindestens 6 Zeichen lang sein", registrationFailed: "Registrierung fehlgeschlagen", loginFailed: "Anmeldung fehlgeschlagen" }, js = { pdfTitle: "PDF & Druck", pageSize: "Seitengröße", pdfHelp: "A4 ist international Standard (210 x 297 mm). Letter ist Standard in den USA (8,5 x 11 Zoll).", openingTitle: "Eröffnungsbilanzen", openingBody: "Auf der Seite Eröffnungsbilanzen können Kontensalden, Lagerbestände und offene Rechnungen aus einem früheren System importiert werden.", openingEnabled: "Derzeit aktiviert — erreichbar unter Einführung > Eröffnungsbilanzen.", openingDisabled: "Derzeit deaktiviert — die Seite ist in der Seitenleiste ausgeblendet.", publicTitle: "Öffentlicher Zugriff (Demomodus)", publicActive: "Aktiv", publicActiveBody: "Der öffentliche Zugriff ist aktiviert. Jeder kann die Anwendung ohne Anmeldung nutzen. Alle Besucher erhalten Manager-Rechte.", disablePublic: "Öffentlichen Zugriff deaktivieren", disabling: "Wird deaktiviert...", publicInactiveBody: "Aktivieren Sie den öffentlichen Zugriff, damit jeder die Anwendung ohne Konto nutzen kann. Nützlich für Demos und Präsentationen. Alle Besucher erhalten Manager-Rechte und teilen sich dieselbe Identität.", enablePublic: "Öffentlichen Zugriff aktivieren", enableWarning: "Dadurch kann jeder ohne Anmeldung auf die Anwendung zugreifen. Besucher können Dokumente erstellen, bearbeiten und buchen. Ihr Administratorkonto erfordert weiterhin eine Anmeldung.", yesEnable: "Ja, aktivieren", enabling: "Wird aktiviert...", demoSpendTitle: "Demo-Ausgaben" }, Ws = { Draft: "Entwurf", Open: "Offen", Submitted: "Gebucht", "To Deliver and Bill": "Zu liefern und abzurechnen", "To Deliver": "Zu liefern", "To Bill": "Abzurechnen", Completed: "Abgeschlossen", Ordered: "Bestellt", Paid: "Bezahlt", Unpaid: "Unbezahlt", Cancelled: "Storniert", Overdue: "Überfällig", Return: "Retoure", Closed: "Geschlossen" }, Ks = { balanced: "AUSGEGLICHEN", imbalanced: "NICHT AUSGEGLICHEN", income: "Erträge", expenses: "Aufwendungen", totalIncome: "Summe Erträge", totalExpenses: "Summe Aufwendungen", netProfit: "Gewinn", netLoss: "Verlust", assets: "Aktiva", liabilities: "Verbindlichkeiten", equity: "Eigenkapital", totalAssets: "Summe Aktiva", totalLiabilities: "Summe Verbindlichkeiten", totalEquity: "Summe Eigenkapital", totalLiabilitiesEquity: "Summe Verbindlichkeiten + Eigenkapital", current: "Laufend", noData: "Keine Daten gefunden", noEntries: "Keine Buchungen gefunden", noStockData: "Keine Lagerdaten gefunden", noReceivables: "Keine offenen Forderungen", noPayables: "Keine offenen Verbindlichkeiten", noDocuments: "Keine Dokumente gefunden" }, Qs = { required: "Erforderlich: {{fields}}", deleteConfirm: "Diesen Datensatz löschen: {{label}}?", disabledNotice: "Dieser Datensatz ({{label}}) ist deaktiviert. Er verbleibt im System, weil andere Datensätze noch darauf verweisen.", disabledOnDelete: "{{label}} {{name}} wurde deaktiviert statt gelöscht, da er von {{reason}} referenziert wird." }, Hs = { Account: "Konto", Amount: "Betrag", Balance: "Saldo", Credit: "Haben", Debit: "Soll", Date: "Datum", Party: "Partner", "Party Type": "Partnertyp", "Voucher Type": "Belegart", "Voucher No": "Belegnr.", Invoice: "Rechnung", Customer: "Kunde", Supplier: "Lieferant", "Due Date": "Fälligkeitsdatum", Outstanding: "Offen", "Outstanding Amount": "Offener Betrag", "Item Code": "Artikelnr.", "Item Name": "Artikelname", Item: "Artikel", Warehouse: "Lager", Qty: "Menge", "Valuation Rate": "Bewertungspreis", "Stock Value": "Lagerwert", Name: "Name", Status: "Status", Company: "Unternehmen", "From Date": "Von Datum", "To Date": "Bis Datum", "As of Date": "Stichtag", "Valid Till": "Gültig bis", "Net Total": "Nettobetrag", Tax: "Steuer", "Grand Total": "Gesamtbetrag", "Notes / Terms": "Notizen / Bedingungen", "Posting Date": "Buchungsdatum", "Transaction Date": "Belegdatum", "Delivery Date": "Lieferdatum", "% Delivered": "% geliefert", "% Billed": "% abgerechnet", "Update Stock": "Lager aktualisieren", "Payment Type": "Zahlungsart", "Paid From": "Bezahlt von", "Paid To": "Bezahlt an", "Paid Amount": "Zahlbetrag", Type: "Art", Total: "Gesamt", Allocated: "Zugeordnet", Unallocated: "Nicht zugeordnet", Remark: "Bemerkung", "Total Debit": "Summe Soll", "Total Credit": "Summe Haben", "Cost Center": "Kostenstelle", "Source Warehouse": "Quelllager", "Target Warehouse": "Ziellager", Source: "Quelle", Target: "Ziel", "Incoming Value": "Eingangswert", "Outgoing Value": "Ausgangswert", Rate: "Preis", "Income Account": "Ertragskonto", "Expense Account": "Aufwandskonto", Description: "Beschreibung", "Rate (%)": "Satz (%)", Mode: "Art", Change: "Rückgeld", Currency: "Währung", Title: "Titel", Selling: "Verkauf", Buying: "Einkauf", "Discount %": "Rabatt %", "Discount Amt": "Rabattbetrag", "Min Qty": "Mindestmenge", "Valid From": "Gültig ab", "Valid Upto": "Gültig bis", Priority: "Priorität", Enabled: "Aktiviert", "Fiscal Year": "Geschäftsjahr", "Budget Amount": "Budgetbetrag", "If Exceeded": "Bei Überschreitung", Month: "Monat", "Bank Account": "Bankkonto", Deposit: "Einzahlung", Withdrawal: "Auszahlung", "Reference No": "Referenznr.", "Matched Type": "Zugeordnete Art", "Matched Doc": "Zugeordneter Beleg", "Start Date": "Startdatum", "End Date": "Enddatum", "Billing Interval": "Abrechnungsintervall", "Current Period Start": "Aktueller Periodenbeginn", "Current Period End": "Aktuelles Periodenende", "Plan Items": "Planpositionen", "Total Amount": "Gesamtbetrag", "Stock Entry Type": "Lagerbuchungsart", "Rate Or Discount": "Preis oder Rabatt", "Discount Percentage": "Rabattprozentsatz", ID: "ID", "Customer Name": "Kundenname", "Customer Group": "Kundengruppe", Territory: "Region", "Credit Limit": "Kreditlimit", Email: "E-Mail", Phone: "Telefon", Address: "Adresse", City: "Stadt", "Zip Code": "PLZ", Country: "Land", "Tax ID": "Steuernummer", "Supplier Name": "Lieferantenname", "Supplier Group": "Lieferantengruppe", "Item Group": "Artikelgruppe", "Stock UOM": "Lagereinheit", "Standard Rate": "Standardpreis", "Warehouse Name": "Lagername", "Company Name": "Firmenname" }, Js = { items: "Positionen", taxes: "Steuern", references: "Zahlungsreferenzen", accounts: "Kontobuchungen", payments: "Zahlungen", plans: "Planpositionen", monthly_distribution: "Monatliche Verteilung" }, Ys = { "Create Sales Order": "Kundenauftrag erstellen", "Create Sales Invoice": "Ausgangsrechnung erstellen", "Create Delivery Note": "Lieferschein erstellen", "Create Purchase Invoice": "Eingangsrechnung erstellen", "Create Purchase Receipt": "Wareneingang erstellen", "Create Credit Note": "Gutschrift erstellen", "Create Debit Note": "Lastschrift erstellen", "Create Return": "Retoure erstellen" }, Zs = { totalRevenue: "Gesamtumsatz", outstandingReceivable: "Offene Forderungen", outstandingPayable: "Offene Verbindlichkeiten", totalStockValue: "Gesamter Lagerwert", recentDocuments: "Letzte Dokumente", noRecentDocuments: "Keine aktuellen Dokumente" }, Xs = { title: "Lambda ERP Chat", subtitle: "Bitten Sie mich, Dokumente zu erstellen, Daten abzurufen oder Berichte auszuführen.", s1: "Welche Kunden haben wir?", s2: "Zeig mir die Rohbilanz", s3: "Erstelle ein Angebot für 10 Bolt Pack M8", s4: "Liste alle unbezahlten Rechnungen auf", loadOlder: "Ältere Nachrichten laden", uploading: "Wird hochgeladen...", failed: "Fehlgeschlagen", remove: "Entfernen", placeholderDemo: "Live-Demo läuft...", placeholderType: "Nachricht eingeben...", placeholderConnecting: "Verbindung wird hergestellt...", attachTitle: "Datei anhängen (PDF oder Bild, max. 10 MB)", creating: "Chat wird erstellt...", dropToAttach: "Datei zum Anhängen ablegen (Bilder oder PDF, je max. 10 MB)", demoError: "Demo konnte nicht gestartet werden" }, ei = /* @__PURE__ */ JSON.parse('{"pageTitle":"Erste Schritte mit Lambda ERP","intro":"Lambda ERP ist ein KI-natives ERP-System, bei dem die gesamte Funktionalität – etwa das Erstellen von Aufträgen, das Prüfen von Beständen und das Erfassen von Zahlungen – über eine Chat-Oberfläche zugänglich ist. Es leitet an, denkt mit und prüft alle Ihre täglichen Geschäftsaufgaben.","openChat":"KI-Chat öffnen","tipLabel":"Tipp:","topTip":"Der KI-Chat kann Ihnen auch direkte Links zu Dokumenten und herunterladbaren PDFs geben. Bitten Sie ihn einfach, ein Dokument zu erstellen oder nachzuschlagen, und er fügt anklickbare Links in seine Antwort ein.","manualIntro":"Wenn Sie genau verstehen möchten, wie die Dinge unter der Haube funktionieren, oder Dinge lieber manuell erledigen, finden Sie hier einen vollständigen Geschäftszyklus Schritt für Schritt.","caTitle":"Dynamische Analysen – Chatten Sie sich zu jedem Diagramm","caBadge":"Kernfunktion","caBody":"Brauchen Sie einen Bericht, den die Vorlagen nicht liefern? Beschreiben Sie ihn einfach im Chat. Der Assistent ruft ein Code-Spezialmodell auf, das den Bericht für Sie schreibt, ihn live über Ihre ERP-Daten ausführt und einen teilbaren Link zurückgibt. Das Diagramm oder die Tabelle wird in Sekunden gerendert und als Entwurf unter „Eigene Analysen“ in der Seitenleiste gespeichert – Sie können ihn erneut öffnen, die URL mit Kollegen teilen oder den Assistenten bitten, ihn zu verfeinern.","caTryAsking":"Versuchen Sie zu fragen (zum Vorausfüllen im Chat klicken):","caPrompt1":"Zeig mir die Top 10 Kunden nach Umsatz dieses Jahr als Balkendiagramm","caPrompt2":"Monatlicher Einkaufstrend nach Lieferant über alle Monate, x-Achse mit Lieferantennamen beschriften","caPrompt3":"Bestseller-Artikel nach Menge, mit Tabelle und Diagramm","caPrompt4":"Welche Kunden schulden mir gerade am meisten?","caTryInChat":"Im Chat ausprobieren","caOpenWorkspace":"Analyse-Arbeitsbereich öffnen","flowTitle":"Überblick Dokumentenfluss","salesCycle":"Verkaufszyklus","purchaseCycle":"Einkaufszyklus","returns":"Retouren","flowShortcut":"Abkürzung: Das Angebot kann den Kundenauftrag überspringen und direkt zur Ausgangsrechnung oder zum Lieferschein führen","legendStock":"Lagerwirkung","legendGl":"Buchungswirkung","legendCash":"Geldwirkung","legendReversal":"Stornierung","lifecycleTitle":"Dokumenten-Lebenszyklus","lcDraftLabel":"Entwurf:","lcDraftDesc":"Bearbeitbar. Keine finanzielle oder Bestandswirkung.","lcSubmittedLabel":"Gebucht:","lcSubmittedDesc":"Gesperrt. Buchungen und Lagerbuchungen werden erzeugt.","lcCancelledLabel":"Storniert:","lcCancelledDesc":"Alle Buchungen storniert. Das Dokument wird dauerhaft archiviert.","lcNoDelete":"Es gibt kein Löschen. Um einen Entwurf zu verwerfen: buchen und dann stornieren.","lcCorrect":"Um ein gebuchtes Dokument zu korrigieren: stornieren und ein neues erstellen.","readyTitle":"Sie sind startklar","readyBody1":"Sie verstehen jetzt den vollständigen Zyklus. Ein typisches Praxisszenario sieht so aus: Sie erhalten einen Kundenauftrag (Angebot → Kundenauftrag), prüfen den Bestand, kaufen, was Sie brauchen (Bestellung → Wareneingang → Eingangsrechnung → Zahlung), liefern an den Kunden (Lieferschein), stellen ihm die Rechnung (Ausgangsrechnung) und ziehen die Zahlung ein (Zahlung). Kommt etwas zurück, erstellen Sie eine Gutschrift und eine Lieferschein-Retoure, um Finanzen und Bestand umzukehren. Die Rohbilanz bestätigt, dass alles ausgeglichen ist.","readyBody2":"Sie können all dies auch über den KI-Chat per natürlicher Konversation erledigen – beschreiben Sie einfach, was Sie brauchen, und er erstellt die richtigen Dokumente für Sie.","chips":{"Quotation":"Angebot","Sales Order":"Kundenauftrag","Delivery Note":"Lieferschein","Sales Invoice":"Ausgangsrechnung","Payment Entry":"Zahlung","Purchase Order":"Bestellung","Purchase Receipt":"Wareneingang","Purchase Invoice":"Eingangsrechnung","Credit Note":"Gutschrift","DN Return":"Lieferschein-Retoure","Debit Note":"Lastschrift","Draft":"Entwurf","Submitted":"Gebucht","Cancelled":"Storniert"},"links":{"Go to Setup":"Zur Einrichtung","Customers":"Kunden","Suppliers":"Lieferanten","Items":"Artikel","Warehouses":"Lager","New Quotation":"Neues Angebot","View Quotations":"Angebote anzeigen","Stock Balance":"Lagerbestand","New Purchase Order":"Neue Bestellung","Purchase Receipts":"Wareneingänge","Purchase Invoices":"Eingangsrechnungen","Delivery Notes":"Lieferscheine","Sales Invoices":"Ausgangsrechnungen","New Payment Entry":"Neue Zahlung","New Stock Entry":"Neue Lagerbuchung","New Journal Entry":"Neuer Buchungssatz","Profit & Loss":"Gewinn- und Verlustrechnung","Balance Sheet":"Bilanz","AR Aging":"Offene Posten Debitoren","AP Aging":"Offene Posten Kreditoren","Trial Balance":"Rohbilanz","General Ledger":"Hauptbuch","Open AI Chat":"KI-Chat öffnen"},"steps":{"1":{"title":"Unternehmen einrichten","description":"Erstellen Sie ein Unternehmen mit einer Basiswährung. Dadurch wird Ihr Kontenplan generiert (30 Standardkonten in den Bereichen Aktiva, Verbindlichkeiten, Eigenkapital, Erträge und Aufwendungen) sowie eine Standard-Kostenstelle. Sie können außerdem Demodaten mit Beispielkunden, -lieferanten und -artikeln anlegen, um schnell loszulegen."},"2":{"title":"Stammdaten anlegen","description":"Bevor Sie buchen können, benötigen Sie Stammdaten. Legen Sie mindestens einen Kunden, einen Lieferanten, einen Artikel (mit Standardpreis) und ein Lager an. Wenn Sie in Schritt 1 Demodaten angelegt haben, existieren diese bereits.","tip":"Artikel haben einen Standardpreis, der beim Hinzufügen zu Dokumenten automatisch ausgefüllt wird. Sie können den Preis pro Transaktion jederzeit überschreiben."},"3":{"title":"Angebot erstellen","description":"Ein Angebot ist eine unverbindliche Offerte an einen Kunden. Wählen Sie einen Kunden, fügen Sie Positionen mit Mengen und Preisen hinzu, optional Steuerzeilen, und speichern Sie. Angebote haben keine finanzielle Auswirkung – sie erzeugen keine Buchungs- oder Lagerbewegungen. Legen Sie ein Gültigkeitsdatum fest, damit das Angebot automatisch abläuft."},"4":{"title":"Buchen und in Kundenauftrag umwandeln","description":"Öffnen Sie Ihr gespeichertes Angebot und klicken Sie auf Buchen, um es zu bestätigen. Klicken Sie dann auf „Kundenauftrag erstellen“, um es umzuwandeln. Der Kundenauftrag stellt eine bestätigte Zusage des Kunden dar. Er hat weiterhin keine finanzielle Auswirkung, reserviert aber Bestand für die Planung.","tip":"Nur gebuchte Dokumente können in den nächsten Schritt umgewandelt werden. Entwurf → Buchen → Umwandeln ist der Standardablauf. Für schnelle Geschäfte können Sie den Kundenauftrag überspringen und direkt vom Angebot zur Ausgangsrechnung oder zum Lieferschein gehen."},"5":{"title":"Bestand vor der Erfüllung prüfen","description":"Bevor Sie liefern können, prüfen Sie, ob der Artikel tatsächlich auf Lager ist. Öffnen Sie den Bericht Lagerbestand und suchen Sie den Artikel. Wenn Ihr Lager eine Menge von null aufweist, müssen Sie zunächst Bestand beschaffen – entweder über eine Bestellung (Einkauf bei einem Lieferanten) oder eine Lagerbuchung (manueller Eingang).","tip":"Dies ist ein häufiges Szenario aus der Praxis: Sie verkaufen etwas und stellen dann fest, dass Sie es erst einkaufen müssen. Das ERP unterstützt beide Abläufe."},"6":{"title":"Einkaufszyklus: Bestand bei einem Lieferanten kaufen","description":"Wenn Sie Bestand einkaufen müssen, haben Sie zwei gültige Wege. Der Standardweg ist Bestellung → Wareneingang → Eingangsrechnung: Nutzen Sie ihn, wenn die Ware vor oder getrennt von der Lieferantenrechnung eintrifft. Treffen Rechnung und Wareneingang gleichzeitig ein, können Sie die Eingangsrechnung direkt erstellen und „Lager aktualisieren“ aktivieren, sodass dasselbe Dokument sowohl den Bestand vereinnahmt als auch die Verbindlichkeit erfasst.","tip":"Verwenden Sie zuerst den Wareneingang, wenn Sie Waren getrennt erhalten. Verwenden Sie die Eingangsrechnung mit „Lager aktualisieren“, wenn ein Schritt sowohl den Bestand vereinnahmen als auch die Lieferantenrechnung buchen soll. Setzen Sie in diesem direkten Weg ein Lager in jeder Bestandszeile."},"7":{"title":"Lieferschein erstellen","description":"Nachdem Sie nun Bestand haben, kehren Sie zu Ihrem gebuchten Kundenauftrag zurück und klicken Sie auf „Lieferschein erstellen“. Setzen Sie in jeder Position das Lager (von dem die Ware versendet wird) und buchen Sie. Dadurch wird Bestand aus dem Lager ausgebucht – Ihr Lagerbestand sinkt.","tip":"Der Lieferschein ist das Versanddokument. Er reduziert den Bestand, erzeugt aber keine Rechnung. Sie können Lieferung und Rechnungsstellung getrennt vornehmen."},"8":{"title":"Ausgangsrechnung erstellen und buchen","description":"Erstellen Sie aus dem gebuchten Kundenauftrag eine Ausgangsrechnung. Beim Buchen der Rechnung werden Buchungen erzeugt: Forderungen aus Lieferungen und Leistungen werden im Soll gebucht (der Kunde schuldet Ihnen Geld) und Umsatzerlöse im Haben (erzielter Ertrag). Sind Steuern konfiguriert, wird auch die Steuerverbindlichkeit im Haben gebucht. Der offene Betrag zeigt, was der Kunde noch schuldet."},"9":{"title":"Kundenzahlungen erfassen","description":"Erstellen Sie eine Zahlung, um vom Kunden erhaltenes Geld zu erfassen. Setzen Sie die Zahlungsart auf „Receive“ (Erhalten), wählen Sie den Kunden, geben Sie den Betrag an und ordnen Sie ihn der Ausgangsrechnung zu. Sie können Teilzahlungen vornehmen – der offene Betrag der Rechnung aktualisiert sich entsprechend. Erstellen Sie weitere Zahlungen, bis die Rechnung vollständig beglichen ist.","tip":"Teilzahlungen sind üblich. Eine Rechnung über 10.000 kann jetzt mit 3.000 und später mit 7.000 bezahlt werden. Jede Zahlung reduziert den offenen Betrag."},"10":{"title":"Lagerbuchungen (manuelle Bestandsführung)","description":"Verwenden Sie Lagerbuchungen für Bestandsbewegungen, die nicht mit Ein- oder Verkäufen verbunden sind. „Material Receipt“ fügt Bestand hinzu (Eröffnungsbestände, Korrekturen). „Material Issue“ bucht Bestand aus (Abschreibungen, interner Verbrauch). „Material Transfer“ verschiebt Bestand zwischen Lägern. Jede Buchung aktualisiert das Lagerbuch mit gleitender Durchschnittsbewertung.","tip":"Verwenden Sie für eingekaufte Waren Wareneingänge statt Lagerbuchungen – sie sind mit der Bestellung verknüpft und bieten einen sauberen Prüfpfad."},"11":{"title":"Buchungssätze","description":"Buchungssätze sind manuelle buchhalterische Anpassungen – Aufwandsabgrenzungen, Korrekturen, Umgliederungen, Eröffnungsbestände. Jeder Satz muss ausgeglichene Soll- und Haben-Beträge haben (Summe Soll = Summe Haben). Verwenden Sie sie, wenn kein anderer Dokumenttyp passt."},"12":{"title":"Gehaltszahlungen","description":"Lambda ERP wickelt Gehälter über die vorhandenen Buchhaltungswerkzeuge ab. Grenzen Sie zunächst den Gehaltsaufwand ab: Erstellen Sie einen Buchungssatz, der Gehaltsaufwand im Soll und Gehaltsverbindlichkeiten im Haben für den gesamten Lohnbetrag bucht. Bezahlen Sie dann die Mitarbeiter: Erstellen Sie einen weiteren Buchungssatz (oder eine Zahlung), der Gehaltsverbindlichkeiten im Soll und Ihr Bankkonto im Haben bucht. Dieser zweistufige Prozess hält Ihre Bücher korrekt – der Aufwand wird in der richtigen Periode erfasst und der Geldabfluss separat nachverfolgt.","tip":"Sie können den KI-Assistenten bitten, dies für Sie zu erledigen: „Grenze 15.000 an Gehältern für April ab“ gefolgt von „Zahle die April-Gehälter von der Bank“. Er erstellt die richtigen Buchungssätze automatisch."},"13":{"title":"Retouren und Gutschriften","description":"Wenn ein Kunde Waren zurückgibt oder Sie eine Gutschrift ausstellen müssen, erstellen Sie eine Retoure. Retouren verwenden denselben Dokumenttyp mit negativen Mengen. Öffnen Sie eine gebuchte Ausgangsrechnung und erstellen Sie eine Gutschrift (Ausgangsrechnungs-Retoure) – dies kehrt die Buchungen um und reduziert den offenen Betrag der ursprünglichen Rechnung. Erstellen Sie für den Bestand eine Lieferschein-Retoure, um Waren zurück ins Lager zu nehmen. Auf der Einkaufsseite erstellen Sie eine Lastschrift (Eingangsrechnungs-Retoure), um eine Lieferantenrechnung umzukehren, oder eine Wareneingangs-Retoure, um Waren zurückzusenden.","tip":"Eine Gutschrift ist einfach eine Ausgangsrechnung mit is_return=1 und negativen Mengen. Dieselbe Buchungslogik läuft – negative Beträge wechseln automatisch auf die richtige Soll-/Haben-Seite. Für eine vollständige Verkaufsretoure benötigen Sie sowohl eine Gutschrift (Finanzen) als auch eine Lieferschein-Retoure (Bestand)."},"14":{"title":"Berichte ausführen","description":"Prüfen Sie Ihre Bücher. Die Gewinn- und Verlustrechnung zeigt Erträge gegenüber Aufwendungen und den Periodengewinn. Die Bilanz zeigt Ihre finanzielle Lage (Aktiva = Verbindlichkeiten + Eigenkapital). Die Offenen Posten Debitoren zeigen, wer Ihnen Geld schuldet und wie überfällig es ist. Die Offenen Posten Kreditoren zeigen, was Sie Lieferanten schulden. Die Rohbilanz überprüft die doppelte Buchführung. Das Hauptbuch zeigt jede einzelne Buchung. Der Lagerbestand zeigt den aktuellen Bestand."},"15":{"title":"Arbeiten in Fremdwährungen","description":"Ihre Bücher werden in einer einzigen Basiswährung geführt (bei der Unternehmenseinrichtung gewählt), aber Sie können in jeder Währung buchen. Setzen Sie eine Währung auf einer Rechnung oder einem Beleg – oder geben Sie einem Kunden oder Lieferanten eine Standardwährung – und der Wechselkurs für dieses Datum wird automatisch ermittelt und auf dem Dokument gespeichert. Das Dokument behält seine Beträge in seiner eigenen Währung, während das Hauptbuch stets in Ihrer Basiswährung bucht. Wenn Sie später zu einem anderen Kurs einnehmen oder zahlen, wird der realisierte Währungsgewinn oder -verlust automatisch auf ein Konto Währungsgewinn/-verlust gebucht. Sie können sogar ein Fremdwährungs-Bankguthaben halten und es später zum Kurs Ihrer Bank umrechnen – die Differenz zum Buchwert wird dann realisiert. Zum Monatsende können Sie offene Fremdwährungssalden zum Stichtagskurs neu bewerten (ein unrealisierter Gewinn/Verlust, der in der nächsten Periode storniert wird), und Sie können jeden Jahresabschluss zur Anzeige in eine andere Währung umgerechnet betrachten.","tip":"Am einfachsten geht das über den KI-Chat – probieren Sie „Erstelle eine Ausgangsrechnung für Lumiere Audio in EUR“, „Zeig mir die Bilanz in EUR“ oder „Wie hoch ist unser unrealisiertes Währungsrisiko zum Monatsende?“. Die Demodaten enthalten bereits einen EUR-Kunden (Lumiere Audio SARL), dessen Rechnung zu einem anderen Kurs eingenommen wurde, sowie eine offene EUR-Lieferantenrechnung – öffnen Sie das Hauptbuch, um die realisierten Währungsbuchungen zu sehen."}}}'), ti = {
|
|
6182
6184
|
common: qs,
|
|
6183
6185
|
language: zs,
|
|
6184
6186
|
header: Fs,
|
|
6185
6187
|
titles: Ms,
|
|
6186
6188
|
doctypes: $s,
|
|
6187
|
-
masters:
|
|
6188
|
-
nav:
|
|
6189
|
+
masters: Us,
|
|
6190
|
+
nav: Vs,
|
|
6189
6191
|
login: Gs,
|
|
6190
6192
|
settings: js,
|
|
6191
6193
|
status: Ws,
|
|
@@ -6285,7 +6287,7 @@ function Ci() {
|
|
|
6285
6287
|
// Refresh once a minute — demo spend changes slowly; no need to poll harder.
|
|
6286
6288
|
refetchInterval: 6e4
|
|
6287
6289
|
}), d = Tn.find((C) => C.value === n), u = (R = s == null ? void 0 : s.windows) == null ? void 0 : R[n], p = ((B = s == null ? void 0 : s.caps) == null ? void 0 : B.global_hourly_usd) ?? 0, v = u ? u.demo_usd / d.hours : 0, D = u ? u.total_usd / d.hours : 0, h = p > 0 ? Math.min(100, v / p * 100) : 0, y = h >= 90 ? "bg-red-500" : h >= 60 ? "bg-amber-500" : "bg-emerald-500";
|
|
6288
|
-
return /* @__PURE__ */ r(
|
|
6290
|
+
return /* @__PURE__ */ r(U, { title: t("settings.demoSpendTitle"), children: [
|
|
6289
6291
|
/* @__PURE__ */ r("div", { className: "flex flex-wrap items-end justify-between gap-4", children: [
|
|
6290
6292
|
/* @__PURE__ */ r("div", { className: "max-w-lg text-sm text-gray-600", children: [
|
|
6291
6293
|
"Token spend from LLM calls in this deployment. Only",
|
|
@@ -6457,11 +6459,11 @@ function Di() {
|
|
|
6457
6459
|
onSuccess: () => a.invalidateQueries({ queryKey: ["public-manager"] })
|
|
6458
6460
|
});
|
|
6459
6461
|
return i ? /* @__PURE__ */ e("p", { className: "text-gray-500", children: n("common.loading") }) : /* @__PURE__ */ r("div", { className: "space-y-6", children: [
|
|
6460
|
-
/* @__PURE__ */ r(
|
|
6462
|
+
/* @__PURE__ */ r(U, { title: n("language.title"), children: [
|
|
6461
6463
|
/* @__PURE__ */ e("div", { className: "flex flex-wrap items-end gap-4", children: /* @__PURE__ */ e("div", { className: "w-64", children: /* @__PURE__ */ e(wi, {}) }) }),
|
|
6462
6464
|
/* @__PURE__ */ e("p", { className: "mt-2 text-xs text-gray-400", children: n("language.help") })
|
|
6463
6465
|
] }),
|
|
6464
|
-
/* @__PURE__ */ r(
|
|
6466
|
+
/* @__PURE__ */ r(U, { title: n("settings.pdfTitle"), children: [
|
|
6465
6467
|
/* @__PURE__ */ e("div", { className: "flex flex-wrap items-end gap-4", children: s ? /* @__PURE__ */ e(
|
|
6466
6468
|
Ke,
|
|
6467
6469
|
{
|
|
@@ -6476,7 +6478,7 @@ function Di() {
|
|
|
6476
6478
|
] }) }),
|
|
6477
6479
|
/* @__PURE__ */ e("p", { className: "mt-2 text-xs text-gray-400", children: n("settings.pdfHelp") })
|
|
6478
6480
|
] }),
|
|
6479
|
-
/* @__PURE__ */ e(
|
|
6481
|
+
/* @__PURE__ */ e(U, { title: n("settings.openingTitle"), children: /* @__PURE__ */ r("div", { className: "flex items-center justify-between", children: [
|
|
6480
6482
|
/* @__PURE__ */ r("div", { children: [
|
|
6481
6483
|
/* @__PURE__ */ e("p", { className: "text-sm text-gray-700", children: n("settings.openingBody") }),
|
|
6482
6484
|
/* @__PURE__ */ e("p", { className: "mt-1 text-xs text-gray-400", children: (l == null ? void 0 : l.opening_balances_enabled) === "1" ? n("settings.openingEnabled") : n("settings.openingDisabled") })
|
|
@@ -6492,7 +6494,7 @@ function Di() {
|
|
|
6492
6494
|
}
|
|
6493
6495
|
)
|
|
6494
6496
|
] }) }),
|
|
6495
|
-
s && /* @__PURE__ */ e(
|
|
6497
|
+
s && /* @__PURE__ */ e(U, { title: n("settings.publicTitle"), children: o != null && o.active ? /* @__PURE__ */ r("div", { children: [
|
|
6496
6498
|
/* @__PURE__ */ r("div", { className: "flex items-center gap-2", children: [
|
|
6497
6499
|
/* @__PURE__ */ e("span", { className: "inline-block h-2 w-2 rounded-full bg-green-500" }),
|
|
6498
6500
|
/* @__PURE__ */ e("span", { className: "text-sm font-medium text-green-800", children: n("settings.publicActive") })
|
|
@@ -6580,7 +6582,7 @@ const Ti = [
|
|
|
6580
6582
|
{ path: "reports/balance-sheet", element: /* @__PURE__ */ e(zr, {}) },
|
|
6581
6583
|
{ path: "reports/ar-aging", element: /* @__PURE__ */ e(Fr, {}) },
|
|
6582
6584
|
{ path: "reports/ap-aging", element: /* @__PURE__ */ e(Mr, {}) },
|
|
6583
|
-
{ path: "reports/analytics", element: /* @__PURE__ */ e(
|
|
6585
|
+
{ path: "reports/analytics", element: /* @__PURE__ */ e(Vr, {}) },
|
|
6584
6586
|
// Admin
|
|
6585
6587
|
{ path: "admin/users", element: /* @__PURE__ */ e(fs, {}) },
|
|
6586
6588
|
{ path: "admin/settings", element: /* @__PURE__ */ e(Di, {}) }
|