@lambda-development/erp-core 0.1.28 → 0.1.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -9,9 +9,9 @@ import { createColumnHelper as Wn, useReactTable as Hn, getCoreRowModel as Qn, f
9
9
  import { createPortal as Fa } from "react-dom";
10
10
  import { ResponsiveContainer as Ma, LineChart as za, CartesianGrid as un, XAxis as mn, YAxis as pn, Tooltip as zt, Line as $a, PieChart as Ua, Pie as Va, Cell as ja, BarChart as Ga, Bar as Ka } from "recharts";
11
11
  import Jn from "i18next";
12
- import { default as No } from "i18next";
12
+ import { default as wo } from "i18next";
13
13
  let yt = "/api";
14
- function co(t) {
14
+ function uo(t) {
15
15
  yt = t.replace(/\/+$/, "");
16
16
  }
17
17
  class Ge extends Error {
@@ -843,7 +843,7 @@ const lt = [
843
843
  function Za() {
844
844
  return lt;
845
845
  }
846
- function uo(t, n) {
846
+ function mo(t, n) {
847
847
  const a = lt.findIndex((s) => s.label === t.label);
848
848
  if (a >= 0) {
849
849
  lt[a] = t;
@@ -851,12 +851,12 @@ function uo(t, n) {
851
851
  }
852
852
  (n == null ? void 0 : n.index) != null ? lt.splice(n.index, 0, t) : lt.push(t);
853
853
  }
854
- function mo(t, n) {
854
+ function po(t, n) {
855
855
  const a = lt.find((s) => s.label === t);
856
856
  a ? a.items.push(n) : lt.push({ label: t, icon: null, items: [n] });
857
857
  }
858
858
  let Wt = { appName: "Lambda ERP" };
859
- function po(t) {
859
+ function ho(t) {
860
860
  if (Wt = { ...Wt, ...t }, !(typeof document > "u") && (t.appName && (document.title = t.appName), t.tokens)) {
861
861
  const n = document.documentElement;
862
862
  for (const [a, s] of Object.entries(t.tokens))
@@ -1533,7 +1533,7 @@ function ne(t, n) {
1533
1533
  );
1534
1534
  return [i, c];
1535
1535
  }
1536
- const tt = [
1536
+ const at = [
1537
1537
  { name: "item_code", label: "Item", type: "link", linkDoctype: "item", required: !0 },
1538
1538
  { name: "item_name", label: "Item Name", type: "text", readOnly: !0 },
1539
1539
  // Per-line description/blurb. Defaults from the Item master on save (an empty
@@ -1543,13 +1543,22 @@ const tt = [
1543
1543
  { name: "qty", label: "Qty", type: "number", required: !0 },
1544
1544
  { name: "rate", label: "Rate", type: "currency", required: !0 },
1545
1545
  { name: "amount", label: "Amount", type: "currency", readOnly: !0 }
1546
- ], nt = {
1546
+ ], yr = [
1547
+ ...at,
1548
+ {
1549
+ name: "frequency",
1550
+ label: "Frequency",
1551
+ type: "select",
1552
+ options: ["One-time", "Monthly", "Quarterly", "Half-Yearly", "Yearly"],
1553
+ default: "One-time"
1554
+ }
1555
+ ], tt = {
1547
1556
  name: "currency",
1548
1557
  label: "Currency",
1549
1558
  type: "select",
1550
1559
  optionsSource: "currency",
1551
1560
  hint: "The currency this document is transacted in. Defaults from the party's (or the company's) default currency. The ledger still posts in the company base currency, translated at this document's exchange rate."
1552
- }, at = [
1561
+ }, nt = [
1553
1562
  {
1554
1563
  name: "charge_type",
1555
1564
  label: "Type",
@@ -1574,15 +1583,15 @@ const tt = [
1574
1583
  { name: "transaction_date", label: "Date", type: "date", required: !0 },
1575
1584
  { name: "valid_till", label: "Valid Till", type: "date" },
1576
1585
  { name: "company", label: "Company", type: "link", linkDoctype: "company", required: !0 },
1577
- nt,
1586
+ tt,
1578
1587
  { name: "net_total", label: "Net Total", type: "currency", readOnly: !0 },
1579
1588
  { name: "total_taxes_and_charges", label: "Tax", type: "currency", readOnly: !0 },
1580
1589
  { name: "grand_total", label: "Grand Total", type: "currency", readOnly: !0 },
1581
1590
  { name: "remarks", label: "Notes / Terms", type: "textarea" }
1582
1591
  ],
1583
1592
  childTables: [
1584
- { key: "items", label: "Items", fields: tt },
1585
- { key: "taxes", label: "Taxes", fields: at }
1593
+ { key: "items", label: "Items", fields: yr },
1594
+ { key: "taxes", label: "Taxes", fields: nt }
1586
1595
  ],
1587
1596
  listColumns: ["name", "customer", "transaction_date", "grand_total", "status"],
1588
1597
  canSubmit: !0,
@@ -1621,7 +1630,7 @@ const tt = [
1621
1630
  { name: "transaction_date", label: "Date", type: "date", required: !0 },
1622
1631
  { name: "delivery_date", label: "Delivery Date", type: "date" },
1623
1632
  { name: "company", label: "Company", type: "link", linkDoctype: "company", required: !0 },
1624
- nt,
1633
+ tt,
1625
1634
  { name: "per_delivered", label: "% Delivered", type: "number", readOnly: !0 },
1626
1635
  { name: "per_billed", label: "% Billed", type: "number", readOnly: !0 },
1627
1636
  { name: "net_total", label: "Net Total", type: "currency", readOnly: !0 },
@@ -1629,8 +1638,8 @@ const tt = [
1629
1638
  { name: "remarks", label: "Notes / Terms", type: "textarea" }
1630
1639
  ],
1631
1640
  childTables: [
1632
- { key: "items", label: "Items", fields: tt },
1633
- { key: "taxes", label: "Taxes", fields: at }
1641
+ { key: "items", label: "Items", fields: at },
1642
+ { key: "taxes", label: "Taxes", fields: nt }
1634
1643
  ],
1635
1644
  listColumns: ["name", "customer", "transaction_date", "grand_total", "status"],
1636
1645
  canSubmit: !0,
@@ -1652,7 +1661,7 @@ const tt = [
1652
1661
  { name: "posting_date", label: "Posting Date", type: "date", required: !0 },
1653
1662
  { name: "due_date", label: "Due Date", type: "date" },
1654
1663
  { name: "company", label: "Company", type: "link", linkDoctype: "company", required: !0 },
1655
- nt,
1664
+ tt,
1656
1665
  { name: "net_total", label: "Net Total", type: "currency", readOnly: !0 },
1657
1666
  { name: "total_taxes_and_charges", label: "Tax", type: "currency", readOnly: !0 },
1658
1667
  { name: "grand_total", label: "Grand Total", type: "currency", readOnly: !0 },
@@ -1660,8 +1669,8 @@ const tt = [
1660
1669
  { name: "remarks", label: "Notes / Terms", type: "textarea" }
1661
1670
  ],
1662
1671
  childTables: [
1663
- { key: "items", label: "Items", fields: [...tt, { name: "income_account", label: "Income Account", type: "link", linkDoctype: "account" }] },
1664
- { key: "taxes", label: "Taxes", fields: at }
1672
+ { key: "items", label: "Items", fields: [...at, { name: "income_account", label: "Income Account", type: "link", linkDoctype: "account" }] },
1673
+ { key: "taxes", label: "Taxes", fields: nt }
1665
1674
  ],
1666
1675
  listColumns: ["name", "customer", "posting_date", "grand_total", "outstanding_amount", "status"],
1667
1676
  canSubmit: !0,
@@ -1681,14 +1690,14 @@ const tt = [
1681
1690
  { name: "supplier", label: "Supplier", type: "link", linkDoctype: "supplier", required: !0 },
1682
1691
  { name: "transaction_date", label: "Date", type: "date", required: !0 },
1683
1692
  { name: "company", label: "Company", type: "link", linkDoctype: "company", required: !0 },
1684
- nt,
1693
+ tt,
1685
1694
  { name: "net_total", label: "Net Total", type: "currency", readOnly: !0 },
1686
1695
  { name: "grand_total", label: "Grand Total", type: "currency", readOnly: !0 },
1687
1696
  { name: "remarks", label: "Notes / Terms", type: "textarea" }
1688
1697
  ],
1689
1698
  childTables: [
1690
- { key: "items", label: "Items", fields: [...tt, { name: "warehouse", label: "Warehouse", type: "link", linkDoctype: "warehouse" }] },
1691
- { key: "taxes", label: "Taxes", fields: at }
1699
+ { key: "items", label: "Items", fields: [...at, { name: "warehouse", label: "Warehouse", type: "link", linkDoctype: "warehouse" }] },
1700
+ { key: "taxes", label: "Taxes", fields: nt }
1692
1701
  ],
1693
1702
  listColumns: ["name", "supplier", "transaction_date", "grand_total", "status"],
1694
1703
  canSubmit: !0,
@@ -1710,7 +1719,7 @@ const tt = [
1710
1719
  { name: "posting_date", label: "Posting Date", type: "date", required: !0 },
1711
1720
  { name: "due_date", label: "Due Date", type: "date" },
1712
1721
  { name: "company", label: "Company", type: "link", linkDoctype: "company", required: !0 },
1713
- nt,
1722
+ tt,
1714
1723
  {
1715
1724
  name: "update_stock",
1716
1725
  label: "Update Stock",
@@ -1729,7 +1738,7 @@ const tt = [
1729
1738
  key: "items",
1730
1739
  label: "Items",
1731
1740
  fields: [
1732
- ...tt,
1741
+ ...at,
1733
1742
  {
1734
1743
  name: "warehouse",
1735
1744
  label: "Warehouse",
@@ -1740,7 +1749,7 @@ const tt = [
1740
1749
  { name: "expense_account", label: "Expense Account", type: "link", linkDoctype: "account" }
1741
1750
  ]
1742
1751
  },
1743
- { key: "taxes", label: "Taxes", fields: at }
1752
+ { key: "taxes", label: "Taxes", fields: nt }
1744
1753
  ],
1745
1754
  listColumns: ["name", "supplier", "posting_date", "grand_total", "outstanding_amount", "status"],
1746
1755
  canSubmit: !0,
@@ -1921,7 +1930,7 @@ const tt = [
1921
1930
  { name: "customer", label: "Customer", type: "link", linkDoctype: "customer", required: !0 },
1922
1931
  { name: "posting_date", label: "Posting Date", type: "date", required: !0 },
1923
1932
  { name: "company", label: "Company", type: "link", linkDoctype: "company", required: !0 },
1924
- nt,
1933
+ tt,
1925
1934
  { name: "net_total", label: "Net Total", type: "currency", readOnly: !0 },
1926
1935
  { name: "total_taxes_and_charges", label: "Tax", type: "currency", readOnly: !0 },
1927
1936
  { name: "grand_total", label: "Grand Total", type: "currency", readOnly: !0 },
@@ -1932,11 +1941,11 @@ const tt = [
1932
1941
  key: "items",
1933
1942
  label: "Items",
1934
1943
  fields: [
1935
- ...tt,
1944
+ ...at,
1936
1945
  { name: "warehouse", label: "Warehouse", type: "link", linkDoctype: "warehouse", required: !0 }
1937
1946
  ]
1938
1947
  },
1939
- { key: "taxes", label: "Taxes", fields: at }
1948
+ { key: "taxes", label: "Taxes", fields: nt }
1940
1949
  ],
1941
1950
  listColumns: ["name", "customer", "posting_date", "grand_total", "status"],
1942
1951
  canSubmit: !0,
@@ -1956,7 +1965,7 @@ const tt = [
1956
1965
  { name: "supplier", label: "Supplier", type: "link", linkDoctype: "supplier", required: !0 },
1957
1966
  { name: "posting_date", label: "Posting Date", type: "date", required: !0 },
1958
1967
  { name: "company", label: "Company", type: "link", linkDoctype: "company", required: !0 },
1959
- nt,
1968
+ tt,
1960
1969
  { name: "net_total", label: "Net Total", type: "currency", readOnly: !0 },
1961
1970
  { name: "total_taxes_and_charges", label: "Tax", type: "currency", readOnly: !0 },
1962
1971
  { name: "grand_total", label: "Grand Total", type: "currency", readOnly: !0 },
@@ -1967,11 +1976,11 @@ const tt = [
1967
1976
  key: "items",
1968
1977
  label: "Items",
1969
1978
  fields: [
1970
- ...tt,
1979
+ ...at,
1971
1980
  { name: "warehouse", label: "Warehouse", type: "link", linkDoctype: "warehouse", required: !0 }
1972
1981
  ]
1973
1982
  },
1974
- { key: "taxes", label: "Taxes", fields: at }
1983
+ { key: "taxes", label: "Taxes", fields: nt }
1975
1984
  ],
1976
1985
  listColumns: ["name", "supplier", "posting_date", "grand_total", "status"],
1977
1986
  canSubmit: !0,
@@ -1991,7 +2000,7 @@ const tt = [
1991
2000
  { name: "customer", label: "Customer", type: "link", linkDoctype: "customer", required: !0 },
1992
2001
  { name: "posting_date", label: "Posting Date", type: "date", required: !0 },
1993
2002
  { name: "company", label: "Company", type: "link", linkDoctype: "company", required: !0 },
1994
- nt,
2003
+ tt,
1995
2004
  {
1996
2005
  name: "update_stock",
1997
2006
  label: "Update Stock",
@@ -2011,7 +2020,7 @@ const tt = [
2011
2020
  key: "items",
2012
2021
  label: "Items",
2013
2022
  fields: [
2014
- ...tt,
2023
+ ...at,
2015
2024
  {
2016
2025
  name: "warehouse",
2017
2026
  label: "Warehouse",
@@ -2021,7 +2030,7 @@ const tt = [
2021
2030
  }
2022
2031
  ]
2023
2032
  },
2024
- { key: "taxes", label: "Taxes", fields: at },
2033
+ { key: "taxes", label: "Taxes", fields: nt },
2025
2034
  {
2026
2035
  key: "payments",
2027
2036
  label: "Payments",
@@ -2171,13 +2180,13 @@ const tt = [
2171
2180
  function aa(t) {
2172
2181
  return on[t];
2173
2182
  }
2174
- function ho(t) {
2183
+ function go(t) {
2175
2184
  on[t.slug] = t;
2176
2185
  }
2177
- function go() {
2186
+ function yo() {
2178
2187
  return Object.values(on);
2179
2188
  }
2180
- const yr = {
2189
+ const fr = {
2181
2190
  // Primary: brand-coloured fill + a 1px inset top highlight for depth
2182
2191
  // (button-highlight shadow). On press, the button shifts down 1px —
2183
2192
  // tiny detail, large perceived "this is responsive".
@@ -2185,7 +2194,7 @@ const yr = {
2185
2194
  secondary: "bg-surface text-fg ring-1 ring-line hover:bg-surface-subtle active:translate-y-px focus-visible:ring-fg/20",
2186
2195
  danger: "bg-red-600 text-white shadow-button-highlight hover:bg-red-700 active:translate-y-px focus-visible:ring-red-500/40",
2187
2196
  ghost: "bg-transparent text-fg-muted hover:bg-surface-subtle hover:text-fg focus-visible:ring-fg/20"
2188
- }, fr = {
2197
+ }, br = {
2189
2198
  sm: "h-8 px-3 text-sm",
2190
2199
  md: "h-10 px-4 text-sm",
2191
2200
  lg: "h-11 px-5 text-sm"
@@ -2213,8 +2222,8 @@ function J({
2213
2222
  "transition-all duration-150",
2214
2223
  "focus-visible:outline-none focus-visible:ring-2",
2215
2224
  "disabled:cursor-not-allowed disabled:opacity-50 disabled:active:translate-y-0",
2216
- yr[t],
2217
- fr[n],
2225
+ fr[t],
2226
+ br[n],
2218
2227
  i
2219
2228
  ),
2220
2229
  children: o
@@ -2267,7 +2276,7 @@ function X({ label: t, hint: n, error: a, className: s, id: o, ...i }) {
2267
2276
  )
2268
2277
  ] });
2269
2278
  }
2270
- function br(t) {
2279
+ function xr(t) {
2271
2280
  return typeof t == "string" ? { value: t, label: t } : t;
2272
2281
  }
2273
2282
  function rt({ label: t, options: n, value: a, onChange: s, className: o, required: i, disabled: c }) {
@@ -2301,7 +2310,7 @@ function rt({ label: t, options: n, value: a, onChange: s, className: o, require
2301
2310
  children: [
2302
2311
  /* @__PURE__ */ e("option", { value: "", children: "Select..." }),
2303
2312
  n.map((g) => {
2304
- const { value: d, label: p } = br(g);
2313
+ const { value: d, label: p } = xr(g);
2305
2314
  return /* @__PURE__ */ e("option", { value: d, children: p }, d);
2306
2315
  })
2307
2316
  ]
@@ -2309,7 +2318,7 @@ function rt({ label: t, options: n, value: a, onChange: s, className: o, require
2309
2318
  )
2310
2319
  ] });
2311
2320
  }
2312
- function xr({ text: t }) {
2321
+ function vr({ text: t }) {
2313
2322
  const [n, a] = v(!1);
2314
2323
  return /* @__PURE__ */ r("span", { className: "relative ml-1 inline-flex", children: [
2315
2324
  /* @__PURE__ */ e(
@@ -2329,7 +2338,7 @@ function xr({ text: t }) {
2329
2338
  ] })
2330
2339
  ] });
2331
2340
  }
2332
- function vr() {
2341
+ function Nr() {
2333
2342
  const { t } = ae(), [n, a] = v(!1), s = [
2334
2343
  ["# Heading", t("notesMarkup.heading", { defaultValue: "bold heading" })],
2335
2344
  ["*italic* **bold**", t("notesMarkup.emphasis", { defaultValue: "italic / bold" })],
@@ -2371,7 +2380,7 @@ function vr() {
2371
2380
  }
2372
2381
  );
2373
2382
  }
2374
- function Nr(t, n = !0) {
2383
+ function wr(t, n = !0) {
2375
2384
  const { data: a } = le({
2376
2385
  queryKey: ["currencies", ""],
2377
2386
  queryFn: () => L.currencies(t),
@@ -2380,23 +2389,23 @@ function Nr(t, n = !0) {
2380
2389
  });
2381
2390
  return (a == null ? void 0 : a.currencies) ?? [];
2382
2391
  }
2383
- const wr = /* @__PURE__ */ new Set([
2392
+ const kr = /* @__PURE__ */ new Set([
2384
2393
  "customer",
2385
2394
  "supplier",
2386
2395
  "item",
2387
2396
  "warehouse"
2388
2397
  ]);
2389
2398
  function Qt(t, n) {
2390
- return !t || !n ? null : wr.has(t) ? `/masters/${t}/${encodeURIComponent(n)}` : t === "account" ? `/reports/general-ledger?account=${encodeURIComponent(n)}` : null;
2399
+ return !t || !n ? null : kr.has(t) ? `/masters/${t}/${encodeURIComponent(n)}` : t === "account" ? `/reports/general-ledger?account=${encodeURIComponent(n)}` : null;
2391
2400
  }
2392
2401
  function vn({ label: t, hint: n, extra: a }) {
2393
2402
  return /* @__PURE__ */ r("label", { className: "mb-1.5 block text-sm font-medium text-fg", children: [
2394
2403
  t,
2395
- n && /* @__PURE__ */ e(xr, { text: n }),
2404
+ n && /* @__PURE__ */ e(vr, { text: n }),
2396
2405
  a
2397
2406
  ] });
2398
2407
  }
2399
- function kr({
2408
+ function Sr({
2400
2409
  field: t,
2401
2410
  value: n,
2402
2411
  onChange: a,
@@ -2449,7 +2458,7 @@ function At({
2449
2458
  currency: c = "USD"
2450
2459
  }) {
2451
2460
  var S;
2452
- const { t: l } = ae(), g = s || !!t.readOnly, d = () => i ? null : /* @__PURE__ */ e(vn, { label: l(`fields.${t.label}`, { defaultValue: t.label }), hint: t.hint }), p = t.type === "select" && t.optionsSource === "currency", m = Nr(void 0, p);
2461
+ const { t: l } = ae(), g = s || !!t.readOnly, d = () => i ? null : /* @__PURE__ */ e(vn, { label: l(`fields.${t.label}`, { defaultValue: t.label }), hint: t.hint }), p = t.type === "select" && t.optionsSource === "currency", m = wr(void 0, p);
2453
2462
  if (g) {
2454
2463
  if (t.type === "link" && n) {
2455
2464
  const y = t.linkDoctypeField && o ? String(o[t.linkDoctypeField] ?? "").toLowerCase().replace(/\s+/g, "-") : t.linkDoctype, P = Qt(y, String(n));
@@ -2477,7 +2486,7 @@ function At({
2477
2486
  return /* @__PURE__ */ r("div", { children: [
2478
2487
  /* @__PURE__ */ e(d, {}),
2479
2488
  /* @__PURE__ */ e(
2480
- kr,
2489
+ Sr,
2481
2490
  {
2482
2491
  field: x,
2483
2492
  value: n ?? "",
@@ -2510,7 +2519,7 @@ function At({
2510
2519
  {
2511
2520
  label: l(`fields.${t.label}`, { defaultValue: t.label }),
2512
2521
  hint: t.hint,
2513
- extra: x ? /* @__PURE__ */ e(vr, {}) : void 0
2522
+ extra: x ? /* @__PURE__ */ e(Nr, {}) : void 0
2514
2523
  }
2515
2524
  ),
2516
2525
  /* @__PURE__ */ e(
@@ -2540,7 +2549,7 @@ function At({
2540
2549
  )
2541
2550
  ] });
2542
2551
  }
2543
- function Sr({
2552
+ function Cr({
2544
2553
  tableDef: t,
2545
2554
  rows: n,
2546
2555
  onChange: a,
@@ -2602,7 +2611,7 @@ function Sr({
2602
2611
  !s && /* @__PURE__ */ e("div", { className: "mt-2", children: /* @__PURE__ */ e(J, { variant: "secondary", size: "sm", onClick: l, children: i("common.addRow") }) })
2603
2612
  ] });
2604
2613
  }
2605
- function Cr({
2614
+ function Dr({
2606
2615
  isNew: t,
2607
2616
  doctype: n,
2608
2617
  name: a,
@@ -2809,7 +2818,7 @@ function wn() {
2809
2818
  )
2810
2819
  ] }),
2811
2820
  /* @__PURE__ */ e(
2812
- Cr,
2821
+ Dr,
2813
2822
  {
2814
2823
  isNew: c,
2815
2824
  doctype: t,
@@ -2854,7 +2863,7 @@ function wn() {
2854
2863
  )) })
2855
2864
  ] }),
2856
2865
  i.childTables.map((I) => /* @__PURE__ */ e(
2857
- Sr,
2866
+ Cr,
2858
2867
  {
2859
2868
  tableDef: I,
2860
2869
  rows: l[I.key] ?? [],
@@ -2885,7 +2894,7 @@ function ra(t) {
2885
2894
  const n = new Date(t), a = n.getDay(), s = a === 0 ? 6 : a - 1;
2886
2895
  return n.setDate(n.getDate() - s), n;
2887
2896
  }
2888
- function Dr(t) {
2897
+ function _r(t) {
2889
2898
  const n = ra(t);
2890
2899
  return n.setDate(n.getDate() + 6), n;
2891
2900
  }
@@ -2909,7 +2918,7 @@ function Sn(t) {
2909
2918
  function Lt(t) {
2910
2919
  return new Date(t.getFullYear(), 11, 31);
2911
2920
  }
2912
- const _r = [
2921
+ const Pr = [
2913
2922
  {
2914
2923
  label: "Today",
2915
2924
  range: () => {
@@ -2919,7 +2928,7 @@ const _r = [
2919
2928
  },
2920
2929
  {
2921
2930
  label: "This Week",
2922
- range: () => [fe(ra(/* @__PURE__ */ new Date())), fe(Dr(/* @__PURE__ */ new Date()))]
2931
+ range: () => [fe(ra(/* @__PURE__ */ new Date())), fe(_r(/* @__PURE__ */ new Date()))]
2923
2932
  },
2924
2933
  {
2925
2934
  label: "This Month",
@@ -2956,7 +2965,7 @@ const _r = [
2956
2965
  }
2957
2966
  ];
2958
2967
  function Ft({ onSelect: t }) {
2959
- return /* @__PURE__ */ e("div", { className: "flex flex-wrap gap-1.5", children: _r.map((n) => /* @__PURE__ */ e(
2968
+ return /* @__PURE__ */ e("div", { className: "flex flex-wrap gap-1.5", children: Pr.map((n) => /* @__PURE__ */ e(
2960
2969
  "button",
2961
2970
  {
2962
2971
  type: "button",
@@ -2992,14 +3001,14 @@ function ln({ onSelect: t }) {
2992
3001
  a.label
2993
3002
  )) });
2994
3003
  }
2995
- const Pr = ["All", "Draft", "Submitted", "Cancelled"], Tr = /* @__PURE__ */ new Set([
3004
+ const Tr = ["All", "Draft", "Submitted", "Cancelled"], Ar = /* @__PURE__ */ new Set([
2996
3005
  "grand_total",
2997
3006
  "outstanding_amount",
2998
3007
  "paid_amount",
2999
3008
  "total_debit",
3000
3009
  "total_amount",
3001
3010
  "net_total"
3002
- ]), Ar = /* @__PURE__ */ new Set([
3011
+ ]), Rr = /* @__PURE__ */ new Set([
3003
3012
  "transaction_date",
3004
3013
  "posting_date",
3005
3014
  "due_date",
@@ -3016,13 +3025,13 @@ const Pr = ["All", "Draft", "Submitted", "Cancelled"], Tr = /* @__PURE__ */ new
3016
3025
  account: "account",
3017
3026
  cost_center: "cost-center"
3018
3027
  };
3019
- function Rr(t) {
3028
+ function Ir(t) {
3020
3029
  if (typeof t != "string") return null;
3021
3030
  const n = t.toLowerCase();
3022
3031
  return n === "customer" ? "customer" : n === "supplier" ? "supplier" : null;
3023
3032
  }
3024
- const Ir = ["25", "50", "100", "200"];
3025
- function Lr() {
3033
+ const Lr = ["25", "50", "100", "200"];
3034
+ function Br() {
3026
3035
  const { t } = ae(), { doctype: n } = ft(), a = aa(n ?? ""), [s] = ne("status", "All"), [o] = ne("from", ""), [i] = ne("to", ""), [c] = ne("discarded", ""), [l] = ne("per_page", 50), [g] = ne("page", 1), d = g - 1, p = Qe(), m = (w) => p({ page: w === 0 ? null : w + 1 }), f = (w) => p({ status: w === "All" ? null : w, page: null }), S = (w) => p({ from: w || null, page: null }), x = (w) => p({ to: w || null, page: null }), y = (w) => p({ discarded: w ? "1" : null, page: null }), P = (w) => p({ per_page: w, page: null }), D = Ie(() => {
3027
3036
  const w = {};
3028
3037
  return s !== "All" && (w.status = s), o && (w.from_date = o), i && (w.to_date = i), c && (w.include_discarded = "true"), w.limit = l, w.offset = d * l, w;
@@ -3050,7 +3059,7 @@ function Lr() {
3050
3059
  header: t("fields.Status", { defaultValue: "Status" }),
3051
3060
  cell: (B) => /* @__PURE__ */ e(sn, { status: B.getValue() })
3052
3061
  });
3053
- if (Tr.has(N))
3062
+ if (Ar.has(N))
3054
3063
  return w.accessor(N, {
3055
3064
  header: K(N),
3056
3065
  cell: (B) => {
@@ -3064,7 +3073,7 @@ function Lr() {
3064
3073
  cell: (B) => {
3065
3074
  const C = B.getValue();
3066
3075
  if (!C) return "-";
3067
- const F = Rr(B.row.original.party_type), Z = F ? Qt(F, String(C)) : null;
3076
+ const F = Ir(B.row.original.party_type), Z = F ? Qt(F, String(C)) : null;
3068
3077
  return Z ? /* @__PURE__ */ e(
3069
3078
  Ne,
3070
3079
  {
@@ -3096,7 +3105,7 @@ function Lr() {
3096
3105
  }
3097
3106
  });
3098
3107
  }
3099
- return Ar.has(N) ? w.accessor(N, {
3108
+ return Rr.has(N) ? w.accessor(N, {
3100
3109
  header: K(N),
3101
3110
  cell: (B) => qt(B.getValue())
3102
3111
  }) : w.accessor(N, {
@@ -3115,7 +3124,7 @@ function Lr() {
3115
3124
  rt,
3116
3125
  {
3117
3126
  label: t("fields.Status", { defaultValue: "Status" }),
3118
- options: Pr.map((w) => ({
3127
+ options: Tr.map((w) => ({
3119
3128
  value: w,
3120
3129
  label: w === "All" ? t("common.all") : t(`status.${w}`, { defaultValue: w })
3121
3130
  })),
@@ -3196,7 +3205,7 @@ function Lr() {
3196
3205
  value: l,
3197
3206
  onChange: (w) => P(Number(w.target.value)),
3198
3207
  className: "h-8 rounded-md bg-surface px-2 text-sm text-fg ring-1 ring-line transition-all focus:outline-none focus:ring-2 focus:ring-brand/30",
3199
- children: Ir.map((w) => /* @__PURE__ */ e("option", { value: w, children: w }, w))
3208
+ children: Lr.map((w) => /* @__PURE__ */ e("option", { value: w, children: w }, w))
3200
3209
  }
3201
3210
  )
3202
3211
  ] }),
@@ -3343,7 +3352,7 @@ const Tt = () => ({
3343
3352
  position_title: "",
3344
3353
  position_blurb: "",
3345
3354
  is_recommended: 0
3346
- }), Br = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
3355
+ }), Er = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
3347
3356
  function Dn() {
3348
3357
  const { name: t } = ft(), n = !t, a = Oe(), s = We(), { t: o } = ae(), i = (N, B) => o(N, { defaultValue: B }), [c, l] = v({
3349
3358
  title: "Offerte",
@@ -3483,7 +3492,7 @@ function Dn() {
3483
3492
  ] }),
3484
3493
  g.map((N, B) => /* @__PURE__ */ r("div", { className: "rounded-lg p-3 ring-1 ring-line", children: [
3485
3494
  /* @__PURE__ */ r("div", { className: "mb-2 flex items-center gap-2", children: [
3486
- /* @__PURE__ */ e("span", { className: "flex h-6 w-6 items-center justify-center rounded-full bg-brand/10 text-sm font-bold text-brand", children: Br[B] ?? B + 1 }),
3495
+ /* @__PURE__ */ e("span", { className: "flex h-6 w-6 items-center justify-center rounded-full bg-brand/10 text-sm font-bold text-brand", children: Er[B] ?? B + 1 }),
3487
3496
  /* @__PURE__ */ e("div", { className: "flex-1", children: /* @__PURE__ */ e(ke, { label: "", value: N.quotation, onChange: (C) => k(B, { quotation: C }), linkDoctype: "quotation", readOnly: !1 }) }),
3488
3497
  /* @__PURE__ */ e("button", { type: "button", onClick: () => z(B, -1), disabled: B === 0, className: "px-1 text-fg-muted disabled:opacity-30", children: "↑" }),
3489
3498
  /* @__PURE__ */ e("button", { type: "button", onClick: () => z(B, 1), disabled: B === g.length - 1, className: "px-1 text-fg-muted disabled:opacity-30", children: "↓" }),
@@ -3518,8 +3527,8 @@ function Dn() {
3518
3527
  ] })
3519
3528
  ] });
3520
3529
  }
3521
- const Er = ["25", "50", "100", "200"];
3522
- function Or() {
3530
+ const Or = ["25", "50", "100", "200"];
3531
+ function qr() {
3523
3532
  var u;
3524
3533
  const { type: t } = ft(), n = Oe(), s = (u = Ct().state) == null ? void 0 : u.notice, [o] = ne("per_page", 50), [i] = ne("page", 1), c = i - 1, l = Qe(), g = (h) => l({ page: h === 0 ? null : h + 1 }), d = (h) => l({ per_page: h, page: null }), { data: p, isLoading: m } = le({
3525
3534
  queryKey: ["masters", t, c, o],
@@ -3607,7 +3616,7 @@ function Or() {
3607
3616
  value: o,
3608
3617
  onChange: (h) => d(Number(h.target.value)),
3609
3618
  className: "h-8 rounded-md bg-surface px-2 text-sm text-fg ring-1 ring-line transition-all focus:outline-none focus:ring-2 focus:ring-brand/30",
3610
- children: Er.map((h) => /* @__PURE__ */ e("option", { value: h, children: h }, h))
3619
+ children: Or.map((h) => /* @__PURE__ */ e("option", { value: h, children: h }, h))
3611
3620
  }
3612
3621
  )
3613
3622
  ] }),
@@ -3641,7 +3650,7 @@ function Or() {
3641
3650
  ] })
3642
3651
  ] });
3643
3652
  }
3644
- const qr = {
3653
+ const Fr = {
3645
3654
  customer: [
3646
3655
  { name: "name", label: "ID", type: "text", required: !0 },
3647
3656
  { name: "customer_name", label: "Customer Name", type: "text", required: !0 },
@@ -3702,7 +3711,7 @@ const qr = {
3702
3711
  { name: "tax_id", label: "Tax ID", type: "text" },
3703
3712
  { name: "iban", label: "IBAN", type: "text" }
3704
3713
  ]
3705
- }, Fr = {
3714
+ }, Mr = {
3706
3715
  customer: "Customer",
3707
3716
  supplier: "Supplier",
3708
3717
  item: "Item",
@@ -3711,7 +3720,7 @@ const qr = {
3711
3720
  }, _n = /* @__PURE__ */ new Set(["customer", "supplier", "item", "warehouse"]);
3712
3721
  function Pn() {
3713
3722
  var R;
3714
- const { type: t, name: n } = ft(), a = Oe(), s = We(), { t: o } = ae(), i = !n || n === "new", c = Fr[t ?? ""] ?? t ?? "", l = o(`masters.${t}.one`, { defaultValue: c }), g = qr[t ?? ""] ?? [], d = (k) => o(`fields.${k.label}`, { defaultValue: k.label }), [p, m] = v({}), { data: f, isLoading: S } = le({
3723
+ const { type: t, name: n } = ft(), a = Oe(), s = We(), { t: o } = ae(), i = !n || n === "new", c = Mr[t ?? ""] ?? t ?? "", l = o(`masters.${t}.one`, { defaultValue: c }), g = Fr[t ?? ""] ?? [], d = (k) => o(`fields.${k.label}`, { defaultValue: k.label }), [p, m] = v({}), { data: f, isLoading: S } = le({
3715
3724
  queryKey: ["master", t, n],
3716
3725
  queryFn: () => L.getMaster(t, n),
3717
3726
  enabled: !!t && !!n && !i
@@ -3835,60 +3844,60 @@ function Pn() {
3835
3844
  }) }) })
3836
3845
  ] });
3837
3846
  }
3838
- function Mr(t) {
3847
+ function zr(t) {
3839
3848
  const { data: n, isLoading: a, error: s, refetch: o } = le({
3840
3849
  queryKey: ["report", "trial-balance", t],
3841
3850
  queryFn: () => L.trialBalance(t)
3842
3851
  });
3843
3852
  return { data: n, isLoading: a, error: s, refetch: o };
3844
3853
  }
3845
- function zr(t) {
3854
+ function $r(t) {
3846
3855
  const { data: n, isLoading: a, error: s, refetch: o } = le({
3847
3856
  queryKey: ["report", "general-ledger", t],
3848
3857
  queryFn: () => L.generalLedger(t)
3849
3858
  });
3850
3859
  return { data: n, isLoading: a, error: s, refetch: o };
3851
3860
  }
3852
- function $r(t) {
3861
+ function Ur(t) {
3853
3862
  const { data: n, isLoading: a, error: s, refetch: o } = le({
3854
3863
  queryKey: ["report", "stock-balance", t],
3855
3864
  queryFn: () => L.stockBalance(t)
3856
3865
  });
3857
3866
  return { data: n, isLoading: a, error: s, refetch: o };
3858
3867
  }
3859
- function Ur(t) {
3868
+ function Vr(t) {
3860
3869
  const { data: n, isLoading: a, error: s, refetch: o } = le({
3861
3870
  queryKey: ["report", "profit-and-loss", t],
3862
3871
  queryFn: () => L.profitAndLoss(t)
3863
3872
  });
3864
3873
  return { data: n, isLoading: a, error: s, refetch: o };
3865
3874
  }
3866
- function Vr(t) {
3875
+ function jr(t) {
3867
3876
  const { data: n, isLoading: a, error: s, refetch: o } = le({
3868
3877
  queryKey: ["report", "balance-sheet", t],
3869
3878
  queryFn: () => L.balanceSheet(t)
3870
3879
  });
3871
3880
  return { data: n, isLoading: a, error: s, refetch: o };
3872
3881
  }
3873
- function jr(t) {
3882
+ function Gr(t) {
3874
3883
  const { data: n, isLoading: a, error: s, refetch: o } = le({
3875
3884
  queryKey: ["report", "ar-aging", t],
3876
3885
  queryFn: () => L.arAging(t)
3877
3886
  });
3878
3887
  return { data: n, isLoading: a, error: s, refetch: o };
3879
3888
  }
3880
- function Gr(t) {
3889
+ function Kr(t) {
3881
3890
  const { data: n, isLoading: a, error: s, refetch: o } = le({
3882
3891
  queryKey: ["report", "ap-aging", t],
3883
3892
  queryFn: () => L.apAging(t)
3884
3893
  });
3885
3894
  return { data: n, isLoading: a, error: s, refetch: o };
3886
3895
  }
3887
- function Kr() {
3896
+ function Wr() {
3888
3897
  const { t } = ae(), [n] = ne("company", ""), [a] = ne("from", ""), [s] = ne("to", ""), o = Qe(), [i, c] = v(n), [l, g] = v(a), [d, p] = v(s), m = He(i), f = (u) => qe(u, m), S = Ie(() => {
3889
3898
  const u = {};
3890
3899
  return n && (u.company = n), a && (u.from_date = a), s && (u.to_date = s), u;
3891
- }, [n, a, s]), { data: x, isLoading: y, refetch: P } = Mr(S), D = () => {
3900
+ }, [n, a, s]), { data: x, isLoading: y, refetch: P } = zr(S), D = () => {
3892
3901
  o({
3893
3902
  company: i || null,
3894
3903
  from: l || null,
@@ -3961,15 +3970,15 @@ function Kr() {
3961
3970
  ] })
3962
3971
  ] });
3963
3972
  }
3964
- function Wr(t) {
3973
+ function Hr(t) {
3965
3974
  return t.toLowerCase().replace(/\s+/g, "-");
3966
3975
  }
3967
- const Hr = ["25", "50", "100", "200"];
3968
- function Qr() {
3976
+ const Qr = ["25", "50", "100", "200"];
3977
+ function Jr() {
3969
3978
  const { t } = ae(), [n] = ne("account", ""), [a] = ne("party", ""), [s] = ne("from", ""), [o] = ne("to", ""), [i] = ne("per_page", 50), [c] = ne("page", 1), l = c - 1, g = Qe(), d = (C) => g({ page: C === 0 ? null : C + 1 }), p = (C) => g({ per_page: C, page: null }), [m, f] = v(n), [S, x] = v(a), [y, P] = v(s), [D, T] = v(o), u = He(), h = (C) => qe(C, u), A = Ie(() => {
3970
3979
  const C = {};
3971
3980
  return n && (C.account = n), a && (C.party = a), s && (C.from_date = s), o && (C.to_date = o), C.limit = String(i), C.offset = String(l * i), C;
3972
- }, [n, a, s, o, i, l]), { data: R, isLoading: k, refetch: H } = zr(A), $ = (R == null ? void 0 : R.rows) ?? [], z = (R == null ? void 0 : R.total) ?? 0, w = Math.max(1, Math.ceil(z / i)), K = z === 0 ? 0 : l * i + 1, N = Math.min(z, (l + 1) * i), B = () => {
3981
+ }, [n, a, s, o, i, l]), { data: R, isLoading: k, refetch: H } = $r(A), $ = (R == null ? void 0 : R.rows) ?? [], z = (R == null ? void 0 : R.total) ?? 0, w = Math.max(1, Math.ceil(z / i)), K = z === 0 ? 0 : l * i + 1, N = Math.min(z, (l + 1) * i), B = () => {
3973
3982
  g({
3974
3983
  account: m || null,
3975
3984
  party: S || null,
@@ -4046,7 +4055,7 @@ function Qr() {
4046
4055
  /* @__PURE__ */ e("td", { className: "px-4 py-2", children: C.voucher_type && C.voucher_no ? /* @__PURE__ */ e(
4047
4056
  Ne,
4048
4057
  {
4049
- to: `/app/${Wr(C.voucher_type)}/${C.voucher_no}`,
4058
+ to: `/app/${Hr(C.voucher_type)}/${C.voucher_no}`,
4050
4059
  className: "font-medium text-blue-600 hover:text-blue-800",
4051
4060
  children: C.voucher_no
4052
4061
  }
@@ -4076,7 +4085,7 @@ function Qr() {
4076
4085
  value: i,
4077
4086
  onChange: (C) => p(Number(C.target.value)),
4078
4087
  className: "rounded border border-gray-300 bg-white px-2 py-1 text-sm",
4079
- children: Hr.map((C) => /* @__PURE__ */ e("option", { value: C, children: C }, C))
4088
+ children: Qr.map((C) => /* @__PURE__ */ e("option", { value: C, children: C }, C))
4080
4089
  }
4081
4090
  )
4082
4091
  ] }),
@@ -4112,11 +4121,11 @@ function Qr() {
4112
4121
  ] })
4113
4122
  ] });
4114
4123
  }
4115
- function Jr() {
4124
+ function Yr() {
4116
4125
  const { t } = ae(), [n] = ne("item_code", ""), [a] = ne("warehouse", ""), s = Qe(), [o, i] = v(n), [c, l] = v(a), g = He(), d = (y) => qe(y, g), p = Ie(() => {
4117
4126
  const y = {};
4118
4127
  return n && (y.item_code = n), a && (y.warehouse = a), y;
4119
- }, [n, a]), { data: m, isLoading: f, refetch: S } = $r(p), x = () => {
4128
+ }, [n, a]), { data: m, isLoading: f, refetch: S } = Ur(p), x = () => {
4120
4129
  s({
4121
4130
  item_code: o || null,
4122
4131
  warehouse: c || null
@@ -4166,11 +4175,11 @@ function Jr() {
4166
4175
  ] }) }) })
4167
4176
  ] });
4168
4177
  }
4169
- function Yr() {
4178
+ function Zr() {
4170
4179
  const { t } = ae(), [n] = ne("company", ""), [a] = ne("from", ""), [s] = ne("to", ""), o = Qe(), [i, c] = v(n), l = He(i), g = (u) => qe(u, l), [d, p] = v(a), [m, f] = v(s), S = Ie(() => {
4171
4180
  const u = {};
4172
4181
  return n && (u.company = n), a && (u.from_date = a), s && (u.to_date = s), u;
4173
- }, [n, a, s]), { data: x, isLoading: y, refetch: P } = Ur(S), D = () => {
4182
+ }, [n, a, s]), { data: x, isLoading: y, refetch: P } = Vr(S), D = () => {
4174
4183
  o({
4175
4184
  company: i || null,
4176
4185
  from: d || null,
@@ -4250,12 +4259,12 @@ function Vt({ title: t, rows: n, total: a, totalLabel: s, currency: o }) {
4250
4259
  ] })
4251
4260
  ] });
4252
4261
  }
4253
- function Zr() {
4262
+ function Xr() {
4254
4263
  var D, T, u;
4255
4264
  const { t } = ae(), [n] = ne("company", ""), [a] = ne("as_of_date", ""), s = Qe(), [o, i] = v(n), [c, l] = v(a), g = He(o), d = (h) => qe(h, g), p = Ie(() => {
4256
4265
  const h = {};
4257
4266
  return n && (h.company = n), a && (h.as_of_date = a), h;
4258
- }, [n, a]), { data: m, isLoading: f, refetch: S } = Vr(p), x = () => {
4267
+ }, [n, a]), { data: m, isLoading: f, refetch: S } = jr(p), x = () => {
4259
4268
  s({ company: o || null, as_of_date: c || null }), S();
4260
4269
  }, y = m && (((D = m.assets) == null ? void 0 : D.length) > 0 || ((T = m.liabilities) == null ? void 0 : T.length) > 0 || ((u = m.equity) == null ? void 0 : u.length) > 0), P = m ? Math.abs(m.total_assets - m.total_liabilities_and_equity) < 0.01 : !1;
4261
4270
  return /* @__PURE__ */ r("div", { className: "space-y-4", children: [
@@ -4289,11 +4298,11 @@ function Zr() {
4289
4298
  ] }) : /* @__PURE__ */ e("p", { className: "py-8 text-center text-gray-400", children: t("reports.noData") })
4290
4299
  ] });
4291
4300
  }
4292
- function Xr() {
4301
+ function es() {
4293
4302
  const { t } = ae(), [n] = ne("company", ""), [a] = ne("as_of_date", ""), s = Qe(), [o, i] = v(n), [c, l] = v(a), g = He(o), d = (y) => qe(y, g), p = Ie(() => {
4294
4303
  const y = {};
4295
4304
  return n && (y.company = n), a && (y.as_of_date = a), y;
4296
- }, [n, a]), { data: m, isLoading: f, refetch: S } = jr(p), x = () => {
4305
+ }, [n, a]), { data: m, isLoading: f, refetch: S } = Gr(p), x = () => {
4297
4306
  s({ company: o || null, as_of_date: c || null }), S();
4298
4307
  };
4299
4308
  return /* @__PURE__ */ r("div", { className: "space-y-4", children: [
@@ -4347,11 +4356,11 @@ function Xr() {
4347
4356
  ] }) }) })
4348
4357
  ] });
4349
4358
  }
4350
- function es() {
4359
+ function ts() {
4351
4360
  const { t } = ae(), [n] = ne("company", ""), [a] = ne("as_of_date", ""), s = Qe(), [o, i] = v(n), [c, l] = v(a), g = He(o), d = (y) => qe(y, g), p = Ie(() => {
4352
4361
  const y = {};
4353
4362
  return n && (y.company = n), a && (y.as_of_date = a), y;
4354
- }, [n, a]), { data: m, isLoading: f, refetch: S } = Gr(p), x = () => {
4363
+ }, [n, a]), { data: m, isLoading: f, refetch: S } = Kr(p), x = () => {
4355
4364
  s({ company: o || null, as_of_date: c || null }), S();
4356
4365
  };
4357
4366
  return /* @__PURE__ */ r("div", { className: "space-y-4", children: [
@@ -4406,7 +4415,7 @@ function es() {
4406
4415
  ] });
4407
4416
  }
4408
4417
  const sa = '(function(){"use strict";function u(r,t){const e=Number(r??0)||0;return t==null?e:Number(e.toFixed(t))}const p={flt:u,sum(r,t){return r.reduce((e,a)=>typeof t=="function"?e+u(t(a)):typeof t=="string"?e+u(a[t]):e+u(a),0)},count(r){return r.length},sortBy(r,t,e="asc"){const n=(e===!0?"desc":e===!1?"asc":e)==="desc"?-1:1;return[...r].sort((s,i)=>{const c=s[t],o=i[t];return c==null&&o==null?0:c==null?1:o==null?-1:c<o?-1*n:c>o?1*n:0})},topN(r,t,e=10){return typeof t=="number"?r.slice(0,t):p.sortBy(r,t,"desc").slice(0,e)},group(r,t,e){if(typeof t=="function"){const s=new Map;for(const i of r){const c=t(i),o=JSON.stringify(c);s.has(o)||s.set(o,{key:c,rows:[]}),s.get(o).rows.push(i)}return Array.from(s.values())}const a=t,n=new Map;for(const s of r){const i=a.map(f=>s[f]),c=JSON.stringify(i);if(!n.has(c)){const f={};a.forEach((l,m)=>{f[l]=i[m]});for(const[l,[m]]of Object.entries(e||{}))f[l]=0;n.set(c,f)}const o=n.get(c);for(const[f,[l,m]]of Object.entries(e||{}))l==="count"?o[f]=u(o[f])+1:o[f]=u(o[f])+u(s[m||f])}return Array.from(n.values())},leftJoin(r,t,e,a=e){const n=new Map(t.map(s=>[s[a],s]));return r.map(s=>({...s,...n.get(s[e])||{}}))},monthKey(r){return String(r??"").slice(0,7)},quarterKey(r){const t=String(r??""),e=t.slice(0,4),a=Number(t.slice(5,7));return!e||!a?"":`${e}-Q${Math.floor((a+2)/3)}`},yearKey(r){return String(r??"").slice(0,4)},pivot(r,t,e,a){const n=new Map;for(const s of r){const i=String(s[t]??"—"),c=String(s[e]??"—");n.has(i)||n.set(i,{[t]:i});const o=n.get(i);o[c]=u(o[c])+u(s[a])}return Array.from(n.values())}};function y(r){if(!r||typeof r!="object")throw new Error("Transform must return an object");if(r.tables&&!Array.isArray(r.tables))throw new Error("tables must be an array");if(r.charts&&!Array.isArray(r.charts))throw new Error("charts must be an array");if(r.kpis&&!Array.isArray(r.kpis))throw new Error("kpis must be an array");return r}self.onmessage=r=>{try{const t=Object.fromEntries(r.data.datasets.map(s=>[s.name,s.rows])),e=r.data.datasets.map(s=>s.name).filter(s=>/^[$A-Z_][0-9A-Z_$]*$/i.test(s)).map(s=>`const ${s} = datasets[${JSON.stringify(s)}];`).join(`\n`),n=new Function("datasets","params","helpers",`"use strict";\n${e}\n${r.data.transformJs}`)(t,r.data.params||{},p);self.postMessage({ok:!0,output:y(n)})}catch(t){self.postMessage({ok:!1,error:t instanceof Error?t.message:String(t)})}}})();\n//# sourceMappingURL=report-runtime.worker-DrBTCfV6.js.map\n', Tn = typeof self < "u" && self.Blob && new Blob([sa], { type: "text/javascript;charset=utf-8" });
4409
- function ts(t) {
4418
+ function ns(t) {
4410
4419
  let n;
4411
4420
  try {
4412
4421
  if (n = Tn && (self.URL || self.webkitURL).createObjectURL(Tn), !n) throw "";
@@ -4427,7 +4436,7 @@ function ts(t) {
4427
4436
  n && (self.URL || self.webkitURL).revokeObjectURL(n);
4428
4437
  }
4429
4438
  }
4430
- function ns() {
4439
+ function as() {
4431
4440
  const t = /* @__PURE__ */ new Date(), n = t.toISOString().slice(0, 10), a = new Date(t);
4432
4441
  a.setMonth(a.getMonth() - 12);
4433
4442
  const s = a.toISOString().slice(0, 10);
@@ -4498,9 +4507,9 @@ return {
4498
4507
  2
4499
4508
  );
4500
4509
  }
4501
- const ia = ns();
4502
- function as() {
4503
- const t = Oe(), { sessions: n, createSession: a } = ct(), [s] = ne("report_id", ""), [o] = ne("metric", ""), [i] = ne("group_by", ""), [c] = ne("from", ""), [l] = ne("to", ""), [g] = ne("company", ""), [d, p] = v(ia), [m, f] = v([]), [S, x] = v(null), [y, P] = v(""), [D, T] = v(!1), [u, h] = v(!1), [A, R] = v(""), k = ee(null), H = ee(""), $ = ee(""), z = ee(0), w = Ie(() => !o || !i ? "" : JSON.stringify(os({
4510
+ const ia = as();
4511
+ function rs() {
4512
+ const t = Oe(), { sessions: n, createSession: a } = ct(), [s] = ne("report_id", ""), [o] = ne("metric", ""), [i] = ne("group_by", ""), [c] = ne("from", ""), [l] = ne("to", ""), [g] = ne("company", ""), [d, p] = v(ia), [m, f] = v([]), [S, x] = v(null), [y, P] = v(""), [D, T] = v(!1), [u, h] = v(!1), [A, R] = v(""), k = ee(null), H = ee(""), $ = ee(""), z = ee(0), w = Ie(() => !o || !i ? "" : JSON.stringify(ls({
4504
4513
  metric: o,
4505
4514
  groupBy: i,
4506
4515
  fromDate: c || void 0,
@@ -4514,7 +4523,7 @@ function as() {
4514
4523
  const _e = JSON.parse(F ?? d), me = await L.runtimeData({ requests: _e.data_requests || [] });
4515
4524
  if (!re()) return;
4516
4525
  f(me.datasets), (he = k.current) == null || he.terminate();
4517
- const ye = new ts();
4526
+ const ye = new ns();
4518
4527
  k.current = ye;
4519
4528
  const ze = await new Promise((I, te) => {
4520
4529
  const Ae = window.setTimeout(() => {
@@ -4554,7 +4563,7 @@ function as() {
4554
4563
  F = !0;
4555
4564
  });
4556
4565
  }, [s, w]);
4557
- const N = !!(!s && w), B = Ie(() => is(S), [S]), C = async () => {
4566
+ const N = !!(!s && w), B = Ie(() => os(S), [S]), C = async () => {
4558
4567
  var me;
4559
4568
  const F = d.trim() !== $.current.trim(), Z = s || "unsaved-runtime-report", re = m.map((ye) => ({
4560
4569
  name: ye.name,
@@ -4606,7 +4615,7 @@ function as() {
4606
4615
  /* @__PURE__ */ e(J, { onClick: () => void K(), disabled: D, children: D ? "Running..." : "Run Report" })
4607
4616
  ] })
4608
4617
  ] }) }),
4609
- u ? /* @__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 }) }) : S ? /* @__PURE__ */ e(rs, { output: S }) : /* @__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." }) }),
4618
+ u ? /* @__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 }) }) : S ? /* @__PURE__ */ e(ss, { output: S }) : /* @__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." }) }),
4610
4619
  m.length > 0 && /* @__PURE__ */ e(U, { title: "Fetched Datasets", children: /* @__PURE__ */ e("div", { className: "space-y-4", children: m.map((F) => /* @__PURE__ */ r("div", { className: "rounded-md border border-gray-200 p-4", children: [
4611
4620
  /* @__PURE__ */ r("div", { className: "flex items-baseline justify-between gap-4", children: [
4612
4621
  /* @__PURE__ */ r("div", { children: [
@@ -4635,7 +4644,7 @@ function as() {
4635
4644
  ] })
4636
4645
  ] });
4637
4646
  }
4638
- function rs({ output: t }) {
4647
+ function ss({ output: t }) {
4639
4648
  var s, o;
4640
4649
  const n = (t.tables ?? []).map((i, c) => ({
4641
4650
  ...i,
@@ -4656,7 +4665,7 @@ function rs({ output: t }) {
4656
4665
  const l = i.dataTable ? a.get(i.dataTable) : void 0, g = i.data ?? (l == null ? void 0 : l.rows) ?? [];
4657
4666
  if (!g.length)
4658
4667
  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}`);
4659
- const d = i.type === "pie" ? [] : g.map((f) => String(f[i.x] ?? "")), p = us(d), m = Math.max(320, 200 + p.axisHeight);
4668
+ const d = i.type === "pie" ? [] : g.map((f) => String(f[i.x] ?? "")), p = ms(d), m = Math.max(320, 200 + p.axisHeight);
4660
4669
  return /* @__PURE__ */ r(U, { children: [
4661
4670
  /* @__PURE__ */ e("div", { className: "pb-3 text-sm font-semibold text-gray-700", children: i.title }),
4662
4671
  /* @__PURE__ */ e("div", { style: { height: m }, className: "w-full", children: /* @__PURE__ */ e(Ma, { width: "100%", height: "100%", children: i.type === "line" ? /* @__PURE__ */ r(za, { data: g, margin: { top: 10, right: 20, left: 0, bottom: 0 }, children: [
@@ -4703,7 +4712,7 @@ function rs({ output: t }) {
4703
4712
  ] }) }) }, i.id))
4704
4713
  ] });
4705
4714
  }
4706
- function ss(t) {
4715
+ function is(t) {
4707
4716
  return t.replace(/_/g, " ").replace(/\b\w/g, (n) => n.toUpperCase());
4708
4717
  }
4709
4718
  function oa(t) {
@@ -4712,7 +4721,7 @@ function oa(t) {
4712
4721
  n.set(a.id, a), a.title && n.set(a.title, a);
4713
4722
  return n;
4714
4723
  }
4715
- function is(t) {
4724
+ function os(t) {
4716
4725
  if (!t) return [];
4717
4726
  const n = (t.tables ?? []).map((o, i) => ({
4718
4727
  ...o,
@@ -4728,8 +4737,8 @@ function is(t) {
4728
4737
  }
4729
4738
  return s;
4730
4739
  }
4731
- function os(t) {
4732
- const n = `${ls(t.metric)} by ${ss(t.groupBy)}`, a = t.groupBy === "month" ? "helpers.monthKey" : t.groupBy === "quarter" ? "helpers.quarterKey" : "helpers.yearKey";
4740
+ function ls(t) {
4741
+ const n = `${cs(t.metric)} by ${is(t.groupBy)}`, a = t.groupBy === "month" ? "helpers.monthKey" : t.groupBy === "quarter" ? "helpers.quarterKey" : "helpers.yearKey";
4733
4742
  if (t.metric === "sales_revenue")
4734
4743
  return gt({
4735
4744
  title: n,
@@ -4888,7 +4897,7 @@ return {
4888
4897
  };`
4889
4898
  };
4890
4899
  }
4891
- function ls(t) {
4900
+ function cs(t) {
4892
4901
  return {
4893
4902
  sales_revenue: "Sales Revenue",
4894
4903
  sales_returns: "Sales Returns",
@@ -4911,24 +4920,24 @@ function An(t) {
4911
4920
  const n = Math.abs(t);
4912
4921
  return n >= 1e6 ? `${(t / 1e6).toFixed(1)}M` : n >= 1e3 ? `${(t / 1e3).toFixed(0)}k` : String(t);
4913
4922
  }
4914
- const Rn = ["#3b82f6", "#10b981", "#f59e0b", "#ef4444", "#8b5cf6", "#06b6d4"], cs = '12px -apple-system, system-ui, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif';
4923
+ const Rn = ["#3b82f6", "#10b981", "#f59e0b", "#ef4444", "#8b5cf6", "#06b6d4"], ds = '12px -apple-system, system-ui, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif';
4915
4924
  let Gt = null;
4916
- function ds(t, n = cs) {
4925
+ function us(t, n = ds) {
4917
4926
  if (typeof document > "u") return t.length * 7;
4918
4927
  Gt || (Gt = document.createElement("canvas"));
4919
4928
  const a = Gt.getContext("2d");
4920
4929
  return a ? (a.font = n, a.measureText(t).width) : t.length * 7;
4921
4930
  }
4922
- function us(t) {
4931
+ function ms(t) {
4923
4932
  if (!t.length) return { angle: 0, axisHeight: 30, maxWidth: 0 };
4924
- const n = t.map((l) => ds(l)), a = Math.max(1, ...n);
4933
+ const n = t.map((l) => us(l)), a = Math.max(1, ...n);
4925
4934
  let s = 0;
4926
4935
  a > 55 && (s = -30), a > 110 && (s = -45), a > 200 && (s = -60), a > 300 && (s = -90);
4927
4936
  const o = Math.abs(s) * Math.PI / 180, i = s === 0 ? 20 : Math.abs(s) === 90 ? a : Math.ceil(a * Math.sin(o)), c = Math.min(280, Math.max(30, i + 18));
4928
4937
  return { angle: s, axisHeight: c, maxWidth: a };
4929
4938
  }
4930
- const ms = ["USD", "EUR", "GBP", "CHF", "JPY", "CAD", "AUD", "CNY", "INR"];
4931
- function ps() {
4939
+ const ps = ["USD", "EUR", "GBP", "CHF", "JPY", "CAD", "AUD", "CNY", "INR"];
4940
+ function hs() {
4932
4941
  const t = We(), { data: n, isLoading: a } = le({
4933
4942
  queryKey: ["setup-status"],
4934
4943
  queryFn: () => L.setupStatus()
@@ -4961,7 +4970,7 @@ function ps() {
4961
4970
  return /* @__PURE__ */ e("p", { className: "text-gray-500", children: "Loading..." });
4962
4971
  if (n != null && n.setup_complete && !f)
4963
4972
  return /* @__PURE__ */ r("div", { className: "space-y-6", children: [
4964
- /* @__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((R, k) => /* @__PURE__ */ e("li", { className: "py-3", children: /* @__PURE__ */ e(hs, { company: R }) }, k)) }) : /* @__PURE__ */ e("p", { className: "text-gray-400", children: "No companies found" }) }),
4973
+ /* @__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((R, k) => /* @__PURE__ */ e("li", { className: "py-3", children: /* @__PURE__ */ e(gs, { company: R }) }, k)) }) : /* @__PURE__ */ e("p", { className: "text-gray-400", children: "No companies found" }) }),
4965
4974
  /* @__PURE__ */ e(Ne, { to: "/", className: "text-blue-600 hover:text-blue-800 text-sm font-medium", children: "Go to Dashboard" })
4966
4975
  ] });
4967
4976
  if (f)
@@ -4996,7 +5005,7 @@ function ps() {
4996
5005
  rt,
4997
5006
  {
4998
5007
  label: "Currency",
4999
- options: ms,
5008
+ options: ps,
5000
5009
  value: i,
5001
5010
  onChange: (R) => c(R.target.value)
5002
5011
  }
@@ -5091,7 +5100,7 @@ function ps() {
5091
5100
  ] }) })
5092
5101
  ] });
5093
5102
  }
5094
- function hs({ company: t }) {
5103
+ function gs({ company: t }) {
5095
5104
  const n = [
5096
5105
  [t.city, t.zip_code].filter(Boolean).join(" "),
5097
5106
  t.country
@@ -5132,7 +5141,7 @@ function hs({ company: t }) {
5132
5141
  t.default_currency && /* @__PURE__ */ e("span", { className: "shrink-0 rounded-full bg-gray-100 px-2 py-0.5 text-xs font-medium text-gray-600", children: t.default_currency })
5133
5142
  ] });
5134
5143
  }
5135
- const gs = [
5144
+ const ys = [
5136
5145
  {
5137
5146
  number: 1,
5138
5147
  title: "Set Up Your Company",
@@ -5269,7 +5278,7 @@ const gs = [
5269
5278
  ]
5270
5279
  }
5271
5280
  ];
5272
- function ys() {
5281
+ function fs() {
5273
5282
  const t = Oe(), { t: n } = ae(), { sessions: a, createSession: s } = ct(), o = async (c) => {
5274
5283
  var g;
5275
5284
  let l = ((g = a[0]) == null ? void 0 : g.id) || "";
@@ -5339,7 +5348,7 @@ function ys() {
5339
5348
  ] })
5340
5349
  ] }) });
5341
5350
  }
5342
- function fs() {
5351
+ function bs() {
5343
5352
  const { t } = ae(), n = (a) => t(`tutorial.chips.${a}`, { defaultValue: a });
5344
5353
  return /* @__PURE__ */ r(U, { children: [
5345
5354
  /* @__PURE__ */ e("h3", { className: "text-base font-semibold text-gray-900 mb-3", children: t("tutorial.flowTitle") }),
@@ -5410,7 +5419,7 @@ function fs() {
5410
5419
  ] })
5411
5420
  ] });
5412
5421
  }
5413
- function bs() {
5422
+ function xs() {
5414
5423
  const { t } = ae(), n = (a) => t(`tutorial.chips.${a}`, { defaultValue: a });
5415
5424
  return /* @__PURE__ */ r(U, { children: [
5416
5425
  /* @__PURE__ */ e("h3", { className: "text-base font-semibold text-gray-900 mb-3", children: t("tutorial.lifecycleTitle") }),
@@ -5446,7 +5455,7 @@ function bs() {
5446
5455
  ] })
5447
5456
  ] });
5448
5457
  }
5449
- function xs() {
5458
+ function vs() {
5450
5459
  const { t } = ae();
5451
5460
  return /* @__PURE__ */ r("div", { className: "mx-auto max-w-3xl space-y-6", children: [
5452
5461
  /* @__PURE__ */ r("div", { children: [
@@ -5470,10 +5479,10 @@ function xs() {
5470
5479
  ] }),
5471
5480
  /* @__PURE__ */ e("p", { className: "mt-4 text-sm text-gray-500", children: t("tutorial.manualIntro") })
5472
5481
  ] }),
5473
- /* @__PURE__ */ e(ys, {}),
5474
5482
  /* @__PURE__ */ e(fs, {}),
5475
5483
  /* @__PURE__ */ e(bs, {}),
5476
- gs.map((n) => {
5484
+ /* @__PURE__ */ e(xs, {}),
5485
+ ys.map((n) => {
5477
5486
  var a;
5478
5487
  return /* @__PURE__ */ e(U, { children: /* @__PURE__ */ r("div", { className: "flex gap-4", children: [
5479
5488
  /* @__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 }),
@@ -5534,17 +5543,17 @@ function xs() {
5534
5543
  ] }) })
5535
5544
  ] });
5536
5545
  }
5537
- const Kt = 5, vs = 10 * 1024 * 1024, Ns = /* @__PURE__ */ new Set([
5546
+ const Kt = 5, Ns = 10 * 1024 * 1024, ws = /* @__PURE__ */ new Set([
5538
5547
  "image/png",
5539
5548
  "image/jpeg",
5540
5549
  "image/gif",
5541
5550
  "image/webp",
5542
5551
  "application/pdf"
5543
5552
  ]);
5544
- function ws(t) {
5553
+ function ks(t) {
5545
5554
  return new Promise((n) => window.setTimeout(n, t));
5546
5555
  }
5547
- function ks(t) {
5556
+ function Ss(t) {
5548
5557
  return new Promise((n, a) => {
5549
5558
  const s = new FileReader();
5550
5559
  s.onloadend = () => {
@@ -5692,7 +5701,7 @@ function Bn() {
5692
5701
  l("");
5693
5702
  for (const ht of M) {
5694
5703
  if (pe !== Ce.current) return;
5695
- l((Ve) => Ve + ht), await ws(Y);
5704
+ l((Ve) => Ve + ht), await ks(Y);
5696
5705
  }
5697
5706
  pe === Ce.current && j.current(b, ce);
5698
5707
  }
@@ -5711,11 +5720,11 @@ function Bn() {
5711
5720
  S(`Maximum ${Kt} attachments per message.`);
5712
5721
  break;
5713
5722
  }
5714
- if (!Ns.has(pe.type)) {
5723
+ if (!ws.has(pe.type)) {
5715
5724
  S(`Unsupported file type: ${pe.type || pe.name}`);
5716
5725
  continue;
5717
5726
  }
5718
- if (pe.size > vs) {
5727
+ if (pe.size > Ns) {
5719
5728
  S(`"${pe.name}" is too large (max 10 MB).`);
5720
5729
  continue;
5721
5730
  }
@@ -5800,7 +5809,7 @@ function Bn() {
5800
5809
  const ce = M.mimeType || ((ht = Y[0]) == null ? void 0 : ht.type) || "audio/webm", pe = new Blob(Y, { type: ce }), Xe = (ce.split(";")[0].split("/")[1] || "webm").toLowerCase();
5801
5810
  D("transcribing");
5802
5811
  try {
5803
- const Ve = await ks(pe), ot = await N(Ve, Xe, n);
5812
+ const Ve = await Ss(pe), ot = await N(Ve, Xe, n);
5804
5813
  Ze(ot);
5805
5814
  } catch (Ve) {
5806
5815
  S(Ve instanceof Error ? Ve.message : t("chat.transcribeFailed"));
@@ -5868,7 +5877,7 @@ function Bn() {
5868
5877
  b
5869
5878
  )) })
5870
5879
  ] }),
5871
- Je.map((b, M) => /* @__PURE__ */ e(Cs, { message: b }, M)),
5880
+ Je.map((b, M) => /* @__PURE__ */ e(Ds, { message: b }, M)),
5872
5881
  /* @__PURE__ */ e("div", { ref: _e })
5873
5882
  ]
5874
5883
  }
@@ -6001,7 +6010,7 @@ function Bn() {
6001
6010
  }
6002
6011
  ) : /* @__PURE__ */ e("div", { className: "flex h-full items-center justify-center text-fg-muted", children: t("chat.creating") });
6003
6012
  }
6004
- function Ss({ attachments: t }) {
6013
+ function Cs({ attachments: t }) {
6005
6014
  return !t || t.length === 0 ? null : /* @__PURE__ */ e("div", { className: "mt-1 flex flex-wrap gap-1.5", children: t.map((n) => {
6006
6015
  const a = L.getChatAttachmentUrl(n.id), s = n.mime_type.startsWith("image/");
6007
6016
  return /* @__PURE__ */ r(
@@ -6021,13 +6030,13 @@ function Ss({ attachments: t }) {
6021
6030
  );
6022
6031
  }) });
6023
6032
  }
6024
- function Cs({ message: t }) {
6033
+ function Ds({ message: t }) {
6025
6034
  return t.type === "user" ? /* @__PURE__ */ e("div", { className: "flex justify-end", children: /* @__PURE__ */ r("div", { className: "max-w-[80%] break-words rounded-2xl rounded-br-md bg-gradient-to-b from-brand to-brand/90 px-4 py-2.5 text-sm text-brand-fg ring-1 ring-black/10 shadow-bubble-user", children: [
6026
6035
  t.content,
6027
- /* @__PURE__ */ e(Ss, { attachments: t.attachments }),
6036
+ /* @__PURE__ */ e(Cs, { attachments: t.attachments }),
6028
6037
  t.timestamp && /* @__PURE__ */ e("div", { className: "mt-1 text-right text-[10px] text-brand-fg/70", title: Ln(t.timestamp), children: In(t.timestamp) })
6029
6038
  ] }) }) : t.type === "assistant" ? /* @__PURE__ */ e("div", { className: "flex justify-start", children: /* @__PURE__ */ r("div", { className: "max-w-[80%] break-words rounded-2xl rounded-bl-md bg-surface px-4 py-2.5 text-sm text-fg ring-1 ring-line shadow-card", children: [
6030
- /* @__PURE__ */ e(Ds, { content: t.content }),
6039
+ /* @__PURE__ */ e(_s, { content: t.content }),
6031
6040
  t.timestamp && /* @__PURE__ */ e("div", { className: "mt-1 text-right text-[10px] text-fg-muted", title: Ln(t.timestamp), children: In(t.timestamp) })
6032
6041
  ] }) }) : t.type === "thinking" ? /* @__PURE__ */ e("div", { className: "flex justify-start", children: /* @__PURE__ */ r("div", { className: "flex items-center gap-2 rounded-full bg-surface px-3 py-1.5 text-xs text-fg-muted ring-1 ring-line shadow-card", children: [
6033
6042
  /* @__PURE__ */ e("span", { className: "inline-block h-1.5 w-1.5 animate-pulse rounded-full bg-brand" }),
@@ -6067,7 +6076,7 @@ function Cs({ message: t }) {
6067
6076
  }
6068
6077
  ) }) : t.type === "error" ? /* @__PURE__ */ e("div", { className: "flex justify-start", children: /* @__PURE__ */ e("div", { className: "max-w-[80%] rounded-2xl rounded-bl-md bg-rose-50 px-4 py-2.5 text-sm text-rose-700 ring-1 ring-rose-200 shadow-card", children: t.content }) }) : null;
6069
6078
  }
6070
- function Ds({ content: t }) {
6079
+ function _s({ content: t }) {
6071
6080
  const n = t.split(`
6072
6081
  `), a = [];
6073
6082
  let s = !1, o = [];
@@ -6125,7 +6134,7 @@ function la(t, n, a) {
6125
6134
  a
6126
6135
  );
6127
6136
  }
6128
- const _s = /(https?:\/\/[^\s)\]}"'<>]+|\/(?:reports|app|masters|admin|chat|setup|tutorial)[^\s)\]}"'<>]*)/g;
6137
+ const Ps = /(https?:\/\/[^\s)\]}"'<>]+|\/(?:reports|app|masters|admin|chat|setup|tutorial)[^\s)\]}"'<>]*)/g;
6129
6138
  function Bt(t) {
6130
6139
  return t.split(/(\[[^\]]+\]\([^)]+\)|\*\*[^*]+?\*\*|`[^`]+`)/g).flatMap((a, s) => {
6131
6140
  const o = a.match(/^\[([^\]]+)\]\(([^)]+)\)$/);
@@ -6140,13 +6149,13 @@ function Bt(t) {
6140
6149
  children: a.slice(1, -1)
6141
6150
  },
6142
6151
  s
6143
- ) : Ps(a, `${s}`);
6152
+ ) : Ts(a, `${s}`);
6144
6153
  });
6145
6154
  }
6146
- function Ps(t, n) {
6155
+ function Ts(t, n) {
6147
6156
  const a = [];
6148
6157
  let s = 0, o;
6149
- const i = new RegExp(_s.source, "g");
6158
+ const i = new RegExp(Ps.source, "g");
6150
6159
  let c = 0;
6151
6160
  for (; (o = i.exec(t)) !== null; ) {
6152
6161
  const l = o.index;
@@ -6157,7 +6166,7 @@ function Ps(t, n) {
6157
6166
  }
6158
6167
  return s < t.length && a.push(t.slice(s)), a.length > 0 ? a : [t];
6159
6168
  }
6160
- function Ts() {
6169
+ function As() {
6161
6170
  const t = Oe(), [n] = Ot(), { user: a, login: s, register: o } = bt(), { t: i } = ae(), c = n.get("invite") || "", [l, g] = v(c ? "register" : "login"), [d, p] = v(!1), [m, f] = v(!1), [S, x] = v(!0), [y, P] = v(""), [D, T] = v(""), [u, h] = v(""), [A, R] = v(""), [k, H] = v("");
6162
6171
  ie(() => {
6163
6172
  a && a.role !== "public_manager" && t("/", { replace: !0 });
@@ -6264,7 +6273,7 @@ function Ts() {
6264
6273
  ] }) })
6265
6274
  ] }) });
6266
6275
  }
6267
- function As() {
6276
+ function Rs() {
6268
6277
  const t = Oe(), n = ee(!1), [a, s] = v("");
6269
6278
  return ie(() => {
6270
6279
  n.current || (n.current = !0, L.createChatSession().then((o) => {
@@ -6296,7 +6305,7 @@ function On() {
6296
6305
  function qn() {
6297
6306
  return { type: "sales", party: "", amount: "", due_date: "", remarks: "" };
6298
6307
  }
6299
- function Rs() {
6308
+ function Is() {
6300
6309
  const t = Oe(), n = We(), [a, s] = v(""), [o, i] = v((/* @__PURE__ */ new Date()).toISOString().split("T")[0]), [c, l] = v(""), [g, d] = v([En()]), [p, m] = v([On()]), [f, S] = v([qn()]), [x, y] = v({}), P = oe({
6301
6310
  mutationFn: () => L.importAccountBalances({
6302
6311
  company: a,
@@ -6462,7 +6471,7 @@ function Rs() {
6462
6471
  ] })
6463
6472
  ] });
6464
6473
  }
6465
- function Is() {
6474
+ function Ls() {
6466
6475
  const { user: t } = bt(), n = We(), { data: a, isLoading: s } = le({
6467
6476
  queryKey: ["auth-users"],
6468
6477
  queryFn: () => L.authListUsers()
@@ -6623,83 +6632,83 @@ function Is() {
6623
6632
  ] }) })
6624
6633
  ] });
6625
6634
  }
6626
- const Ls = { save: "Save", saving: "Saving...", submit: "Submit", cancel: "Cancel", cancelDoc: "Cancel", cancelDocAbort: "Don't cancel", cancelDocConfirmBtn: "Yes, cancel document", discardDraft: "Discard draft", keepDraft: "Keep", discardDraftConfirm: "Discard draft", showDiscarded: "Show discarded", delete: "Delete", edit: "Edit", pdf: "PDF", addRow: "Add Row", loading: "Loading...", enable: "Enable", disable: "Disable", refresh: "Refresh", refreshing: "Refreshing", areYouSure: "Are you sure?", all: "All", apply: "Apply", new: "New", prev: "Prev", next: "Next", perPage: "Per page", page: "Page", of: "of", showing: "Showing", total: "Total", totals: "Totals", errorOccurred: "An error occurred" }, Bs = { title: "Language", help: "Choose the language for the interface. Your choice is saved in this browser.", label: "Language" }, Es = { logout: "Logout", openMenu: "Open menu", closeMenu: "Close menu", new: "New {{label}}" }, Os = { dashboard: "Dashboard", setup: "Company Setup", tutorial: "Getting Started", chat: "Chat", reports: "Reports", "trial-balance": "Trial Balance", "general-ledger": "General Ledger", "stock-balance": "Stock Balance", "profit-and-loss": "Profit & Loss", "balance-sheet": "Balance Sheet", "ar-aging": "Accounts Receivable Aging", "ap-aging": "Accounts Payable Aging", analytics: "Analytics" }, qs = { quotation: { one: "Quotation", other: "Quotations" }, proposal: { one: "Proposal", other: "Proposals" }, "sales-order": { one: "Sales Order", other: "Sales Orders" }, "sales-invoice": { one: "Sales Invoice", other: "Sales Invoices" }, "pos-invoice": { one: "POS Invoice", other: "POS Invoices" }, "purchase-order": { one: "Purchase Order", other: "Purchase Orders" }, "purchase-invoice": { one: "Purchase Invoice", other: "Purchase Invoices" }, "payment-entry": { one: "Payment Entry", other: "Payment Entries" }, "journal-entry": { one: "Journal Entry", other: "Journal Entries" }, "bank-transaction": { one: "Bank Transaction", other: "Bank Transactions" }, budget: { one: "Budget", other: "Budgets" }, subscription: { one: "Subscription", other: "Subscriptions" }, "stock-entry": { one: "Stock Entry", other: "Stock Entries" }, "delivery-note": { one: "Delivery Note", other: "Delivery Notes" }, "purchase-receipt": { one: "Purchase Receipt", other: "Purchase Receipts" }, "pricing-rule": { one: "Pricing Rule", other: "Pricing Rules" } }, Fs = { company: { one: "Company", other: "Companies" }, customer: { one: "Customer", other: "Customers" }, supplier: { one: "Supplier", other: "Suppliers" }, item: { one: "Item", other: "Items" }, warehouse: { one: "Warehouse", other: "Warehouses" } }, Ms = { chats: "Chats", newChat: "New Chat", deleteChat: "Delete chat", customAnalytics: "Custom Analytics", newAnalytics: "New Analytics", deleteReport: "Delete report", groups: { Introduction: "Introduction", Selling: "Selling", Buying: "Buying", Accounting: "Accounting", Stock: "Stock", Reports: "Reports", Masters: "Masters", Settings: "Settings" }, items: { "Getting Started": "Getting Started", "Company Setup": "Company Setup", "Opening Balances": "Opening Balances", Quotation: "Quotation", Proposal: "Proposals", "Sales Order": "Sales Order", "Sales Invoice": "Sales Invoice", "POS Invoice": "POS Invoice", "Purchase Order": "Purchase Order", "Purchase Invoice": "Purchase Invoice", "Payment Entry": "Payment Entry", "Journal Entry": "Journal Entry", "Bank Transaction": "Bank Transaction", Budget: "Budget", Subscription: "Subscription", "Stock Entry": "Stock Entry", "Delivery Note": "Delivery Note", "Purchase Receipt": "Purchase Receipt", "Trial Balance": "Trial Balance", "Profit & Loss": "Profit & Loss", "Balance Sheet": "Balance Sheet", "General Ledger": "General Ledger", "AR Aging": "AR Aging", "AP Aging": "AP Aging", Analytics: "Analytics", "Stock Balance": "Stock Balance", Company: "Company", Customer: "Customer", Supplier: "Supplier", Item: "Item", Warehouse: "Warehouse", General: "General", "Pricing Rule": "Pricing Rule", "Users & Team": "Users & Team" } }, zs = { taglineFirstRun: "Create your admin account to get started", taglineRegister: "Create your account", taglineSignIn: "Sign in to your account", demoBanner: "Demo mode is active. Sign in with an admin account to manage settings or disable public access.", fullName: "Full Name", email: "Email", password: "Password", confirmPassword: "Confirm Password", createAdmin: "Create Admin Account", register: "Register", signIn: "Sign In", browsingTitle: "Just browsing?", browsingBody: "Start a fresh chat session and watch the live demo.", enterDemo: "Enter Live Demo", haveInvite: "Have an invite?", noAccountPrompt: "Need an account?", registerLink: "Register", alreadyHaveAccount: "Already have an account?", signInLink: "Sign in", passwordsNoMatch: "Passwords do not match", passwordTooShort: "Password must be at least 6 characters", registrationFailed: "Registration failed", loginFailed: "Login failed" }, $s = { pdfTitle: "PDF & Print", pageSize: "Page Size", pdfHelp: "A4 is standard internationally (210 x 297 mm). Letter is standard in the US (8.5 x 11 in).", passwordTitle: "Change Password", currentPassword: "Current password", newPassword: "New password", confirmNewPassword: "Confirm new password", changePassword: "Change password", changingPassword: "Changing...", passwordChanged: "Password changed.", openingTitle: "Opening Balances", openingBody: "The Opening Balances page allows importing account balances, stock, and outstanding invoices from a previous system.", openingEnabled: "Currently enabled — accessible under Introduction > Opening Balances.", openingDisabled: "Currently disabled — the page is hidden from the sidebar.", signupTitle: "Public Signup", signupBody: "Allow anyone to create their own account (as a viewer) without an invite. When off, new users can only join via an invite link.", signupEnabled: "Currently enabled — anyone with the URL can register as a viewer.", signupDisabled: "Currently disabled — registration is invite-only.", publicTitle: "Public Access (Demo Mode)", publicActive: "Active", publicActiveBody: "Public access is enabled. Anyone can use the application without logging in. All visitors get manager-level permissions.", disablePublic: "Disable Public Access", disabling: "Disabling...", publicInactiveBody: "Enable public access to let anyone use the application without an account. Useful for demos and showcases. All visitors get manager-level permissions and share the same identity.", enablePublic: "Enable Public Access", enableWarning: "This will allow anyone to access the application without logging in. They will be able to create, edit, and submit documents. Your admin account still requires login.", yesEnable: "Yes, Enable", enabling: "Enabling...", tokenSpendTitle: "Token Spend" }, Us = { Draft: "Draft", Open: "Open", Submitted: "Submitted", "To Deliver and Bill": "To Deliver and Bill", "To Deliver": "To Deliver", "To Bill": "To Bill", Completed: "Completed", Ordered: "Ordered", Paid: "Paid", Unpaid: "Unpaid", Cancelled: "Cancelled", Discarded: "Discarded", Overdue: "Overdue", Return: "Return", Closed: "Closed" }, Vs = { balanced: "BALANCED", imbalanced: "IMBALANCED", income: "Income", expenses: "Expenses", totalIncome: "Total Income", totalExpenses: "Total Expenses", netProfit: "Net Profit", netLoss: "Net Loss", assets: "Assets", liabilities: "Liabilities", equity: "Equity", totalAssets: "Total Assets", totalLiabilities: "Total Liabilities", totalEquity: "Total Equity", totalLiabilitiesEquity: "Total Liabilities + Equity", current: "Current", noData: "No data found", noEntries: "No entries found", noStockData: "No stock data found", noReceivables: "No outstanding receivables", noPayables: "No outstanding payables", noDocuments: "No documents found" }, js = { required: "Required: {{fields}}", deleteConfirm: "Delete this {{label}}?", disabledNotice: "This {{label}} is disabled. It remains in the system because other records still reference it.", disabledOnDelete: "{{label}} {{name}} was disabled instead of deleted because it is referenced by {{reason}}." }, Gs = { totalRevenue: "Total Revenue", outstandingReceivable: "Outstanding Receivable", outstandingPayable: "Outstanding Payable", totalStockValue: "Total Stock Value", recentDocuments: "Recent Documents", noRecentDocuments: "No recent documents" }, Ks = { title: "Lambda ERP Chat", subtitle: "Ask me to create documents, look up data, or run reports.", s1: "What customers do we have?", s2: "Show me the trial balance", s3: "Create a quotation for 10 Bolt Pack M8", s4: "List all unpaid invoices", loadOlder: "Load older messages", uploading: "Uploading...", failed: "Failed", remove: "Remove", placeholderDemo: "Running live demo...", placeholderType: "Type a message...", placeholderConnecting: "Connecting...", attachTitle: "Attach file (PDF or image, max 10 MB)", creating: "Creating chat...", dropToAttach: "Drop file to attach (images or PDF, max 10 MB each)", demoError: "Could not start demo", voiceStart: "Record voice message", voiceStop: "Stop recording", voiceTranscribing: "Transcribing...", micDenied: "Microphone access was denied.", transcribeFailed: "Transcription failed. Please try again." }, Ws = { "Create Credit Note": "Create Credit Note", "Create Debit Note": "Create Debit Note", "Create Delivery Note": "Create Delivery Note", "Create Purchase Invoice": "Create Purchase Invoice", "Create Purchase Receipt": "Create Purchase Receipt", "Create Return": "Create Return", "Create Sales Invoice": "Create Sales Invoice", "Create Sales Order": "Create Sales Order" }, Hs = { "% Billed": "% Billed", "% Delivered": "% Delivered", Account: "Account", Address: "Address", Allocated: "Allocated", Amount: "Amount", "As of Date": "As of Date", Balance: "Balance", "Bank Account": "Bank Account", "Billing Interval": "Billing Interval", "Budget Amount": "Budget Amount", Buying: "Buying", Change: "Change", City: "City", Company: "Company", "Company Name": "Company Name", "Cost Center": "Cost Center", Country: "Country", Credit: "Credit", "Credit Limit": "Credit Limit", Currency: "Currency", "Current Period End": "Current Period End", "Contact Person": "Contact Person", "Contact Email": "Contact Email", "Contact Phone": "Contact Phone", "Current Period Start": "Current Period Start", Customer: "Customer", "Customer Group": "Customer Group", "Customer Name": "Customer Name", Date: "Date", Debit: "Debit", "Delivery Date": "Delivery Date", Deposit: "Deposit", Description: "Description", "Discount %": "Discount %", "Discount Amt": "Discount Amt", "Discount Percentage": "Discount Percentage", "Due Date": "Due Date", Email: "Email", Enabled: "Enabled", "End Date": "End Date", "Expense Account": "Expense Account", "Fiscal Year": "Fiscal Year", "From Date": "From Date", "Grand Total": "Grand Total", ID: "ID", "If Exceeded": "If Exceeded", "Income Account": "Income Account", "Incoming Value": "Incoming Value", Invoice: "Invoice", Item: "Item", "Item Code": "Item Code", "Item Group": "Item Group", "Item Name": "Item Name", "Matched Doc": "Matched Doc", "Matched Type": "Matched Type", "Min Qty": "Min Qty", Mode: "Mode", Month: "Month", Name: "Name", "Net Total": "Net Total", "Notes / Terms": "Notes / Terms", "Outgoing Value": "Outgoing Value", Outstanding: "Outstanding", "Outstanding Amount": "Outstanding Amount", "Paid Amount": "Paid Amount", "Paid From": "Paid From", "Paid To": "Paid To", Party: "Party", "Party Type": "Party Type", "Payment Type": "Payment Type", Phone: "Phone", "Plan Items": "Plan Items", "Posting Date": "Posting Date", Priority: "Priority", Qty: "Qty", Rate: "Rate", "Rate (%)": "Rate (%)", "Rate Or Discount": "Rate Or Discount", "Reference No": "Reference No", Remark: "Remark", Selling: "Selling", Source: "Source", "Source Warehouse": "Source Warehouse", "Standard Rate": "Standard Rate", "Start Date": "Start Date", Status: "Status", "Stock Entry Type": "Stock Entry Type", "Stock UOM": "Stock UOM", "Stock Value": "Stock Value", Supplier: "Supplier", "Supplier Group": "Supplier Group", "Supplier Name": "Supplier Name", Target: "Target", "Target Warehouse": "Target Warehouse", Tax: "Tax", "Tax ID": "Tax ID", Territory: "Territory", Title: "Title", "To Date": "To Date", Total: "Total", "Total Amount": "Total Amount", "Total Credit": "Total Credit", "Total Debit": "Total Debit", "Transaction Date": "Transaction Date", Type: "Type", Unallocated: "Unallocated", "Update Stock": "Update Stock", "Valid From": "Valid From", "Valid Till": "Valid Till", "Valid Upto": "Valid Upto", "Valuation Rate": "Valuation Rate", "Voucher No": "Voucher No", "Voucher Type": "Voucher Type", Warehouse: "Warehouse", "Warehouse Name": "Warehouse Name", Withdrawal: "Withdrawal", "Zip Code": "Zip Code" }, Qs = { accounts: "accounts", items: "items", monthly_distribution: "monthly_distribution", payments: "payments", plans: "plans", references: "references", taxes: "taxes" }, Js = /* @__PURE__ */ JSON.parse(`{"chips":{"Cancelled":"Cancelled","Credit Note":"Credit Note","DN Return":"DN Return","Debit Note":"Debit Note","Delivery Note":"Delivery Note","Draft":"Draft","Payment Entry":"Payment Entry","Purchase Invoice":"Purchase Invoice","Purchase Order":"Purchase Order","Purchase Receipt":"Purchase Receipt","Quotation":"Quotation","Sales Invoice":"Sales Invoice","Sales Order":"Sales Order","Submitted":"Submitted"},"links":{"AP Aging":"AP Aging","AR Aging":"AR Aging","Balance Sheet":"Balance Sheet","Customers":"Customers","Delivery Notes":"Delivery Notes","General Ledger":"General Ledger","Go to Setup":"Go to Setup","Items":"Items","New Journal Entry":"New Journal Entry","New Payment Entry":"New Payment Entry","New Purchase Order":"New Purchase Order","New Quotation":"New Quotation","New Stock Entry":"New Stock Entry","Open AI Chat":"Open AI Chat","Profit & Loss":"Profit & Loss","Purchase Invoices":"Purchase Invoices","Purchase Receipts":"Purchase Receipts","Sales Invoices":"Sales Invoices","Stock Balance":"Stock Balance","Suppliers":"Suppliers","Trial Balance":"Trial Balance","View Quotations":"View Quotations","Warehouses":"Warehouses"},"steps":{"1":{"title":"Set Up Your Company","description":"Create a company with a base currency. This generates your Chart of Accounts (30 standard accounts across Assets, Liabilities, Equity, Income, and Expenses) and a default Cost Center. You can also seed demo data with sample customers, suppliers, and items to get started quickly."},"2":{"title":"Create Master Data","description":"Before you can transact, you need master records. Create at least one Customer, one Supplier, one Item (with a standard rate), and one Warehouse. If you seeded demo data in Step 1, these already exist.","tip":"Items have a standard rate that auto-fills when you add them to documents. You can always override the rate per transaction."},"3":{"title":"Create a Quotation","description":"A Quotation is a non-binding offer to a customer. Select a customer, add line items with quantities and rates, optionally add tax rows, then save. Quotations have no financial impact — they don't create accounting or stock entries. Set a validity date so the offer expires automatically."},"4":{"title":"Submit and Convert to Sales Order","description":"Open your saved Quotation and click Submit to confirm it. Then click “Create Sales Order” to convert it. The Sales Order represents a confirmed commitment from the customer. It still has no financial impact, but it reserves stock for planning purposes.","tip":"Only submitted documents can be converted to the next step. Draft → Submit → Convert is the standard flow. For quick deals, you can skip the Sales Order and go directly from Quotation to Sales Invoice or Delivery Note."},"5":{"title":"Check Stock Before Fulfilling","description":"Before you can deliver, check if you actually have the item in stock. Go to the Stock Balance report and look up the item. If your warehouse has zero quantity, you’ll need to bring stock in first — either through a Purchase Order (buying from a supplier) or a Stock Entry (manual receipt).","tip":"This is a common real-world scenario: you sell something, then realize you need to buy it first. The ERP handles both flows."},"6":{"title":"Purchase Cycle: Buy Stock from a Supplier","description":"If you need to buy stock, you have two valid paths. The standard path is Purchase Order -> Purchase Receipt -> Purchase Invoice: use this when goods arrive before or separately from the supplier bill. If the bill and receipt happen together, you can create the Purchase Invoice directly and enable Update Stock so the same document both receives inventory and records Accounts Payable.","tip":"Use Purchase Receipt first when receiving goods separately. Use Purchase Invoice with Update Stock when one step should both receive stock and book the supplier bill. In that direct path, set a warehouse on each stock item row."},"7":{"title":"Create a Delivery Note","description":"Now that you have stock, go back to your submitted Sales Order and click “Create Delivery Note.” Set the warehouse on each item row (where the goods ship from), then submit. This moves inventory out of the warehouse — your stock balance decreases.","tip":"The Delivery Note is the shipping document. It reduces stock but doesn’t create an invoice. You can deliver and invoice separately."},"8":{"title":"Create and Submit the Sales Invoice","description":"From the submitted Sales Order, create a Sales Invoice. When you submit the invoice, GL entries are posted: Accounts Receivable is debited (the customer owes you) and Sales Revenue is credited (income earned). If taxes are configured, Tax Payable is also credited. The outstanding amount shows what the customer still owes."},"9":{"title":"Record Customer Payments","description":"Create a Payment Entry to record money received from the customer. Set the payment type to “Receive,” select the customer, specify the amount, and allocate it against the Sales Invoice. You can make partial payments — the invoice’s outstanding amount updates accordingly. Create additional Payment Entries until the invoice is fully paid.","tip":"Partial payments are common. A 10,000 invoice might be paid as 3,000 now and 7,000 later. Each Payment Entry reduces the outstanding amount."},"10":{"title":"Stock Entries (Manual Inventory)","description":"Use Stock Entries for inventory movements that aren’t tied to purchases or sales. Material Receipt adds stock (opening balances, adjustments). Material Issue removes stock (write-offs, internal consumption). Material Transfer moves stock between warehouses. Each entry updates the stock ledger with moving-average valuation.","tip":"For purchased goods, use Purchase Receipts instead of Stock Entries — they link to the Purchase Order and give you a proper audit trail."},"11":{"title":"Journal Entries","description":"Journal Entries are manual accounting adjustments — expense accruals, corrections, reclassifications, opening balances. Each entry must have balanced debits and credits (total debit = total credit). Use these when no other document type fits."},"12":{"title":"Salary Payments","description":"Lambda ERP handles salaries through the existing accounting tools. First, accrue the salary expense: create a Journal Entry that debits Salary Expense and credits Salary Payable for the total payroll amount. Then pay the employees: create another Journal Entry (or Payment Entry) that debits Salary Payable and credits your bank account. This two-step process keeps your books accurate — the expense is recorded in the right period, and the cash outflow is tracked separately.","tip":"You can ask the AI assistant to do this for you: “Accrue 15,000 in salaries for April” followed by “Pay the April salaries from bank.” It will create the right journal entries automatically."},"13":{"title":"Returns and Credit Notes","description":"When a customer returns goods or you need to issue a credit, create a return. Returns use the same document type with negative quantities. Open a submitted Sales Invoice and create a Credit Note (Sales Invoice return) — this reverses the GL entries and reduces the original invoice’s outstanding amount. For stock, create a Delivery Note return to bring goods back into the warehouse. On the buying side, create a Debit Note (Purchase Invoice return) to reverse a supplier bill, or a Purchase Receipt return to send goods back.","tip":"A Credit Note is just a Sales Invoice with is_return=1 and negative quantities. The same GL logic runs — negative amounts automatically flip to the correct debit/credit sides. For a full sales return, you need both a Credit Note (financials) and a Delivery Note return (stock)."},"14":{"title":"Run Reports","description":"Check your books. The Profit & Loss shows income vs expenses and net profit for a period. The Balance Sheet shows your financial position (assets = liabilities + equity). AR Aging shows who owes you money and how overdue it is. AP Aging shows what you owe suppliers. The Trial Balance verifies double-entry integrity. The General Ledger shows every individual posting. Stock Balance shows current inventory."},"15":{"title":"Working in Foreign Currencies","description":"Your books are kept in a single base currency (chosen at company setup), but you can transact in any currency. Set a currency on an invoice or bill — or give a customer or supplier a default currency — and the exchange rate for that date is looked up automatically and stored on the document. The document keeps its amounts in its own currency, while the General Ledger always posts in your base currency. When you later collect or pay at a different rate, the realized exchange gain or loss is booked automatically to an Exchange Gain/Loss account. You can even hold a foreign-currency bank balance and convert it later at your bank’s rate — the difference versus its carried value is realized then. At month end you can revalue open foreign balances to the closing rate (an unrealized gain/loss that reverses next period), and you can view any financial statement translated into another currency for display.","tip":"This is easiest through the AI chat — try “Create a sales invoice for Lumiere Audio in EUR,” “Show me the balance sheet in EUR,” or “What’s our unrealized FX exposure at month end?” The seeded demo already includes a EUR customer (Lumiere Audio SARL) whose invoice was collected at a different rate, plus an open EUR supplier bill — open the General Ledger to see the realized FX postings."}},"caTitle":"Dynamic Analytics — Chat Your Way to Any Chart","caBadge":"Signature Feature","caBody":"Need a report the presets can’t give you? Just describe it in chat. The assistant calls a code-specialist model that writes the report for you, runs it live over your ERP data, and returns a sharable link. The chart or table renders in seconds and is saved as a draft under Custom Analytics in the sidebar — you can reopen it, share the URL with teammates, or ask the assistant to refine it.","caTryAsking":"Try asking (click to prefill in chat):","caPrompt1":"Show me top 10 customers by revenue this year as a bar chart","caPrompt2":"Monthly purchases trend by supplier over all months and label x-axis with supplier name","caPrompt3":"Best selling items by quantity, with a table and a chart","caPrompt4":"Which customers owe me the most right now?","caTryInChat":"Try it in chat","caOpenWorkspace":"Open Analytics workspace","flowTitle":"Document Flow Overview","salesCycle":"Sales Cycle","flowShortcut":"Shortcut: Quotation can skip Sales Order and go directly to Sales Invoice or Delivery Note","purchaseCycle":"Purchase Cycle","returns":"Returns","legendStock":"stock impact","legendGl":"GL impact","legendCash":"cash impact","legendReversal":"reversal","lifecycleTitle":"Document Lifecycle","lcDraftLabel":"Draft:","lcDraftDesc":"Editable. No financial or stock impact.","lcSubmittedLabel":"Submitted:","lcSubmittedDesc":"Locked. GL entries and stock ledger entries are posted.","lcCancelledLabel":"Cancelled:","lcCancelledDesc":"All entries reversed. Document is permanently archived.","lcNoDelete":"There is no delete. To void a draft: submit it, then cancel it.","lcCorrect":"To correct a submitted document: cancel it and create a new one.","pageTitle":"Getting Started with Lambda ERP","intro":"Lambda ERP is an AI Native ERP System, with all functionality — like creating orders, checking inventory, recording payments — being accessible through a chat interface. It instructs, reasons and checks all your daily business tasks.","openChat":"Open AI Chat","tipLabel":"Tip:","topTip":"The AI chat can also give you direct links to documents and downloadable PDFs. Just ask it to create or look up a document and it will include clickable links in its response.","manualIntro":"If you want to fully understand how things work under the hood, or prefer to do things manually, here’s a full business cycle step by step.","readyTitle":"You're Ready","readyBody1":"You now understand the full cycle. A typical real-world scenario looks like this: you receive a customer order (Quotation → Sales Order), check stock, buy what you need (Purchase Order → Purchase Receipt → Purchase Invoice → Payment), deliver to the customer (Delivery Note), bill them (Sales Invoice), and collect payment (Payment Entry). If something comes back, create a Credit Note and Delivery Note return to reverse the financials and stock. The Trial Balance confirms everything is balanced.","readyBody2":"You can also use the AI chat to do all of this through natural conversation — just describe what you need and it will create the right documents for you."}`), Ys = { title: "Formatting help", intro: "The Notes / Terms text supports light formatting on the PDF:", heading: "bold heading", emphasis: "italic / bold", price: "right-aligned price beside the text above (e.g. Monthly | CHF 380.—)", block: "Separate blocks with a blank line." }, Zs = {
6627
- common: Ls,
6628
- language: Bs,
6629
- header: Es,
6630
- titles: Os,
6631
- doctypes: qs,
6632
- masters: Fs,
6633
- nav: Ms,
6634
- login: zs,
6635
- settings: $s,
6636
- status: Us,
6637
- reports: Vs,
6638
- masterForm: js,
6639
- dashboard: Gs,
6640
- chat: Ks,
6641
- conversions: Ws,
6642
- fields: Hs,
6643
- tables: Qs,
6644
- tutorial: Js,
6645
- notesMarkup: Ys
6646
- }, Xs = { save: "Speichern", saving: "Speichern...", submit: "Buchen", cancel: "Abbrechen", cancelDoc: "Stornieren", cancelDocAbort: "Nicht stornieren", cancelDocConfirmBtn: "Definitiv stornieren", discardDraft: "Entwurf verwerfen", keepDraft: "Behalten", discardDraftConfirm: "Verwerfen", showDiscarded: "Verworfene anzeigen", 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" }, ei = { title: "Sprache", help: "Wählen Sie die Sprache der Oberfläche. Ihre Auswahl wird in diesem Browser gespeichert.", label: "Sprache" }, ti = { logout: "Abmelden", openMenu: "Menü öffnen", closeMenu: "Menü schließen", new: "Neu: {{label}}" }, ni = { 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" }, ai = { quotation: { one: "Angebot", other: "Angebote" }, proposal: { one: "Sammelofferte", other: "Sammelofferten" }, "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" } }, ri = { 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" } }, si = { 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", Proposal: "Sammelofferte", "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" } }, ii = { 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?", noAccountPrompt: "Noch kein Konto?", 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" }, oi = { 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).", passwordTitle: "Passwort ändern", currentPassword: "Aktuelles Passwort", newPassword: "Neues Passwort", confirmNewPassword: "Neues Passwort bestätigen", changePassword: "Passwort ändern", changingPassword: "Wird geändert...", passwordChanged: "Passwort geändert.", 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.", signupTitle: "Öffentliche Registrierung", signupBody: "Erlauben Sie es jedem, ohne Einladung ein eigenes Konto (als Betrachter) zu erstellen. Wenn deaktiviert, können neue Benutzer nur über einen Einladungslink beitreten.", signupEnabled: "Derzeit aktiviert — jeder mit der URL kann sich als Betrachter registrieren.", signupDisabled: "Derzeit deaktiviert — die Registrierung erfolgt nur per Einladung.", 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...", tokenSpendTitle: "Token-Ausgaben" }, li = { 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", Discarded: "Verworfen", Overdue: "Überfällig", Return: "Retoure", Closed: "Geschlossen" }, ci = { 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" }, di = { 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." }, ui = { 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", "Contact Person": "Ansprechperson", "Contact Email": "E-Mail Ansprechperson", "Contact Phone": "Telefon Ansprechperson", "Supplier Name": "Lieferantenname", "Supplier Group": "Lieferantengruppe", "Item Group": "Artikelgruppe", "Stock UOM": "Lagereinheit", "Standard Rate": "Standardpreis", "Warehouse Name": "Lagername", "Company Name": "Firmenname" }, mi = { items: "Positionen", taxes: "Steuern", references: "Zahlungsreferenzen", accounts: "Kontobuchungen", payments: "Zahlungen", plans: "Planpositionen", monthly_distribution: "Monatliche Verteilung" }, pi = { "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" }, hi = { totalRevenue: "Gesamtumsatz", outstandingReceivable: "Offene Forderungen", outstandingPayable: "Offene Verbindlichkeiten", totalStockValue: "Gesamter Lagerwert", recentDocuments: "Letzte Dokumente", noRecentDocuments: "Keine aktuellen Dokumente" }, gi = { 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", voiceStart: "Sprachnachricht aufnehmen", voiceStop: "Aufnahme stoppen", voiceTranscribing: "Wird transkribiert...", micDenied: "Zugriff auf das Mikrofon wurde verweigert.", transcribeFailed: "Transkription fehlgeschlagen. Bitte erneut versuchen." }, yi = /* @__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."}}}'), fi = { title: "Formatierungshilfe", intro: "Der Text unter Notizen / Konditionen unterstützt eine einfache Formatierung im PDF:", heading: "fette Überschrift", emphasis: "kursiv / fett", price: "rechtsbündiger Preis neben dem Text darüber (z. B. Monatlich | CHF 380.—)", block: "Trennen Sie Blöcke durch eine Leerzeile." }, bi = {
6647
- common: Xs,
6648
- language: ei,
6649
- header: ti,
6650
- titles: ni,
6651
- doctypes: ai,
6652
- masters: ri,
6653
- nav: si,
6654
- login: ii,
6655
- settings: oi,
6656
- status: li,
6657
- reports: ci,
6658
- masterForm: di,
6659
- fields: ui,
6660
- tables: mi,
6661
- conversions: pi,
6662
- dashboard: hi,
6663
- chat: gi,
6664
- tutorial: yi,
6665
- notesMarkup: fi
6666
- }, xi = { save: "Enregistrer", saving: "Enregistrement...", submit: "Valider", cancel: "Annuler", cancelDoc: "Annuler", cancelDocAbort: "Ne pas annuler", cancelDocConfirmBtn: "Annuler définitivement", discardDraft: "Supprimer le brouillon", keepDraft: "Conserver", discardDraftConfirm: "Supprimer", showDiscarded: "Afficher les supprimés", delete: "Supprimer", edit: "Modifier", pdf: "PDF", addRow: "Ajouter une ligne", loading: "Chargement...", enable: "Activer", disable: "Désactiver", refresh: "Actualiser", refreshing: "Actualisation", areYouSure: "Êtes-vous sûr ?", all: "Tous", apply: "Appliquer", new: "Nouveau", prev: "Précédent", next: "Suivant", perPage: "Par page", page: "Page", of: "sur", showing: "Affichage", total: "Total", totals: "Totaux", errorOccurred: "Une erreur s'est produite" }, vi = { title: "Langue", help: "Choisissez la langue de l'interface. Votre choix est enregistré dans ce navigateur.", label: "Langue" }, Ni = { logout: "Déconnexion", openMenu: "Ouvrir le menu", closeMenu: "Fermer le menu", new: "Nouveau : {{label}}" }, wi = { dashboard: "Tableau de bord", setup: "Configuration de l'entreprise", tutorial: "Premiers pas", chat: "Chat", reports: "Rapports", "trial-balance": "Balance comptable", "general-ledger": "Grand livre", "stock-balance": "Solde de stock", "profit-and-loss": "Compte de résultat", "balance-sheet": "Bilan", "ar-aging": "Balance âgée clients", "ap-aging": "Balance âgée fournisseurs", analytics: "Analyses" }, ki = { quotation: { one: "Devis", other: "Devis" }, proposal: { one: "Offre groupée", other: "Offres groupées" }, "sales-order": { one: "Commande client", other: "Commandes client" }, "sales-invoice": { one: "Facture de vente", other: "Factures de vente" }, "pos-invoice": { one: "Ticket de caisse", other: "Tickets de caisse" }, "purchase-order": { one: "Bon de commande", other: "Bons de commande" }, "purchase-invoice": { one: "Facture d'achat", other: "Factures d'achat" }, "payment-entry": { one: "Paiement", other: "Paiements" }, "journal-entry": { one: "Écriture comptable", other: "Écritures comptables" }, "bank-transaction": { one: "Transaction bancaire", other: "Transactions bancaires" }, budget: { one: "Budget", other: "Budgets" }, subscription: { one: "Abonnement", other: "Abonnements" }, "stock-entry": { one: "Mouvement de stock", other: "Mouvements de stock" }, "delivery-note": { one: "Bon de livraison", other: "Bons de livraison" }, "purchase-receipt": { one: "Bon de réception", other: "Bons de réception" }, "pricing-rule": { one: "Règle de prix", other: "Règles de prix" } }, Si = { company: { one: "Société", other: "Sociétés" }, customer: { one: "Client", other: "Clients" }, supplier: { one: "Fournisseur", other: "Fournisseurs" }, item: { one: "Article", other: "Articles" }, warehouse: { one: "Entrepôt", other: "Entrepôts" } }, Ci = { chats: "Discussions", newChat: "Nouvelle discussion", deleteChat: "Supprimer la discussion", customAnalytics: "Analyses personnalisées", newAnalytics: "Nouvelle analyse", deleteReport: "Supprimer le rapport", groups: { Introduction: "Introduction", Selling: "Ventes", Buying: "Achats", Accounting: "Comptabilité", Stock: "Stock", Reports: "Rapports", Masters: "Données de base", Settings: "Paramètres" }, items: { "Getting Started": "Premiers pas", "Company Setup": "Configuration de l'entreprise", "Opening Balances": "Soldes d'ouverture", Quotation: "Devis", Proposal: "Offre groupée", "Sales Order": "Commande client", "Sales Invoice": "Facture de vente", "POS Invoice": "Ticket de caisse", "Purchase Order": "Bon de commande", "Purchase Invoice": "Facture d'achat", "Payment Entry": "Paiement", "Journal Entry": "Écriture comptable", "Bank Transaction": "Transaction bancaire", Budget: "Budget", Subscription: "Abonnement", "Stock Entry": "Mouvement de stock", "Delivery Note": "Bon de livraison", "Purchase Receipt": "Bon de réception", "Trial Balance": "Balance comptable", "Profit & Loss": "Compte de résultat", "Balance Sheet": "Bilan", "General Ledger": "Grand livre", "AR Aging": "Balance âgée clients", "AP Aging": "Balance âgée fournisseurs", Analytics: "Analyses", "Stock Balance": "Solde de stock", Company: "Société", Customer: "Client", Supplier: "Fournisseur", Item: "Article", Warehouse: "Entrepôt", General: "Général", "Pricing Rule": "Règle de prix", "Users & Team": "Utilisateurs et équipe" } }, Di = { taglineFirstRun: "Créez votre compte administrateur pour commencer", taglineRegister: "Créez votre compte", taglineSignIn: "Connectez-vous à votre compte", demoBanner: "Le mode démo est actif. Connectez-vous avec un compte administrateur pour gérer les paramètres ou désactiver l'accès public.", fullName: "Nom complet", email: "E-mail", password: "Mot de passe", confirmPassword: "Confirmer le mot de passe", createAdmin: "Créer un compte administrateur", register: "S'inscrire", signIn: "Se connecter", browsingTitle: "Simple visite ?", browsingBody: "Démarrez une nouvelle session de chat et regardez la démo en direct.", enterDemo: "Lancer la démo", haveInvite: "Vous avez une invitation ?", noAccountPrompt: "Besoin d'un compte ?", registerLink: "S'inscrire", alreadyHaveAccount: "Vous avez déjà un compte ?", signInLink: "Se connecter", passwordsNoMatch: "Les mots de passe ne correspondent pas", passwordTooShort: "Le mot de passe doit comporter au moins 6 caractères", registrationFailed: "Échec de l'inscription", loginFailed: "Échec de la connexion" }, _i = { pdfTitle: "PDF et impression", pageSize: "Format de page", pdfHelp: "A4 est la norme internationale (210 x 297 mm). Letter est la norme aux États-Unis (8,5 x 11 po).", passwordTitle: "Changer le mot de passe", currentPassword: "Mot de passe actuel", newPassword: "Nouveau mot de passe", confirmNewPassword: "Confirmer le nouveau mot de passe", changePassword: "Changer le mot de passe", changingPassword: "Modification...", passwordChanged: "Mot de passe modifié.", openingTitle: "Soldes d'ouverture", openingBody: "La page Soldes d'ouverture permet d'importer les soldes des comptes, le stock et les factures impayées d'un système précédent.", openingEnabled: "Actuellement activé — accessible sous Introduction > Soldes d'ouverture.", openingDisabled: "Actuellement désactivé — la page est masquée dans la barre latérale.", signupTitle: "Inscription publique", signupBody: "Permettre à quiconque de créer son propre compte (en tant que lecteur) sans invitation. Lorsque désactivé, les nouveaux utilisateurs ne peuvent rejoindre que via un lien d'invitation.", signupEnabled: "Actuellement activé — toute personne disposant de l'URL peut s'inscrire en tant que lecteur.", signupDisabled: "Actuellement désactivé — l'inscription se fait uniquement sur invitation.", publicTitle: "Accès public (mode démo)", publicActive: "Actif", publicActiveBody: "L'accès public est activé. N'importe qui peut utiliser l'application sans se connecter. Tous les visiteurs obtiennent des autorisations de niveau gestionnaire.", disablePublic: "Désactiver l'accès public", disabling: "Désactivation...", publicInactiveBody: "Activez l'accès public pour permettre à quiconque d'utiliser l'application sans compte. Utile pour les démos et présentations. Tous les visiteurs obtiennent des autorisations de niveau gestionnaire et partagent la même identité.", enablePublic: "Activer l'accès public", enableWarning: "Cela permettra à quiconque d'accéder à l'application sans se connecter. Ils pourront créer, modifier et valider des documents. Votre compte administrateur nécessite toujours une connexion.", yesEnable: "Oui, activer", enabling: "Activation...", tokenSpendTitle: "Dépenses de jetons" }, Pi = { Draft: "Brouillon", Open: "Ouvert", Submitted: "Validé", "To Deliver and Bill": "À livrer et facturer", "To Deliver": "À livrer", "To Bill": "À facturer", Completed: "Terminé", Ordered: "Commandé", Paid: "Payé", Unpaid: "Impayé", Cancelled: "Annulé", Discarded: "Supprimé", Overdue: "En retard", Return: "Retour", Closed: "Clôturé" }, Ti = { balanced: "ÉQUILIBRÉ", imbalanced: "DÉSÉQUILIBRÉ", income: "Produits", expenses: "Charges", totalIncome: "Total des produits", totalExpenses: "Total des charges", netProfit: "Bénéfice", netLoss: "Perte", assets: "Actif", liabilities: "Passif", equity: "Capitaux propres", totalAssets: "Total de l'actif", totalLiabilities: "Total du passif", totalEquity: "Total des capitaux propres", totalLiabilitiesEquity: "Total passif + capitaux propres", current: "Non échu", noData: "Aucune donnée trouvée", noEntries: "Aucune écriture trouvée", noStockData: "Aucune donnée de stock trouvée", noReceivables: "Aucune créance en cours", noPayables: "Aucune dette en cours", noDocuments: "Aucun document trouvé" }, Ai = { required: "Requis : {{fields}}", deleteConfirm: "Supprimer ce {{label}} ?", disabledNotice: "Ce {{label}} est désactivé. Il reste dans le système car d'autres enregistrements y font référence.", disabledOnDelete: "{{label}} {{name}} a été désactivé au lieu d'être supprimé car il est référencé par {{reason}}." }, Ri = { Account: "Compte", Amount: "Montant", Balance: "Solde", Credit: "Crédit", Debit: "Débit", Date: "Date", Party: "Tiers", "Party Type": "Type de tiers", "Voucher Type": "Type de pièce", "Voucher No": "N° de pièce", Invoice: "Facture", Customer: "Client", Supplier: "Fournisseur", "Due Date": "Date d'échéance", Outstanding: "Encours", "Outstanding Amount": "Montant dû", "Item Code": "Code article", "Item Name": "Nom de l'article", Item: "Article", Warehouse: "Entrepôt", Qty: "Qté", "Valuation Rate": "Coût unitaire", "Stock Value": "Valeur du stock", Name: "Nom", Status: "Statut", Company: "Société", "From Date": "Date de début", "To Date": "Date de fin", "As of Date": "À la date", "Valid Till": "Valable jusqu'au", "Net Total": "Total net", Tax: "Taxe", "Grand Total": "Total TTC", "Notes / Terms": "Notes / Conditions", "Posting Date": "Date de comptabilisation", "Transaction Date": "Date de transaction", "Delivery Date": "Date de livraison", "% Delivered": "% livré", "% Billed": "% facturé", "Update Stock": "Mettre à jour le stock", "Payment Type": "Type de paiement", "Paid From": "Payé depuis", "Paid To": "Payé à", "Paid Amount": "Montant payé", Type: "Type", Total: "Total", Allocated: "Affecté", Unallocated: "Non affecté", Remark: "Remarque", "Total Debit": "Total débit", "Total Credit": "Total crédit", "Cost Center": "Centre de coûts", "Source Warehouse": "Entrepôt source", "Target Warehouse": "Entrepôt cible", Source: "Source", Target: "Cible", "Incoming Value": "Valeur entrante", "Outgoing Value": "Valeur sortante", Rate: "Prix unitaire", "Income Account": "Compte de produits", "Expense Account": "Compte de charges", Description: "Description", "Rate (%)": "Taux (%)", Mode: "Mode", Change: "Monnaie rendue", Currency: "Devise", Title: "Titre", Selling: "Vente", Buying: "Achat", "Discount %": "Remise %", "Discount Amt": "Montant remise", "Min Qty": "Qté min", "Valid From": "Valable à partir du", "Valid Upto": "Valable jusqu'au", Priority: "Priorité", Enabled: "Activé", "Fiscal Year": "Exercice", "Budget Amount": "Montant du budget", "If Exceeded": "Si dépassé", Month: "Mois", "Bank Account": "Compte bancaire", Deposit: "Dépôt", Withdrawal: "Retrait", "Reference No": "N° de référence", "Matched Type": "Type rapproché", "Matched Doc": "Pièce rapprochée", "Start Date": "Date de début", "End Date": "Date de fin", "Billing Interval": "Intervalle de facturation", "Current Period Start": "Début période actuelle", "Current Period End": "Fin période actuelle", "Plan Items": "Articles du plan", "Total Amount": "Montant total", "Stock Entry Type": "Type de mouvement de stock", "Rate Or Discount": "Prix ou remise", "Discount Percentage": "Pourcentage de remise", ID: "ID", "Customer Name": "Nom du client", "Customer Group": "Groupe de clients", Territory: "Territoire", "Credit Limit": "Limite de crédit", Email: "E-mail", Phone: "Téléphone", Address: "Adresse", City: "Ville", "Zip Code": "Code postal", Country: "Pays", "Tax ID": "N° de TVA", "Contact Person": "Personne de contact", "Contact Email": "E-mail du contact", "Contact Phone": "Téléphone du contact", "Supplier Name": "Nom du fournisseur", "Supplier Group": "Groupe de fournisseurs", "Item Group": "Groupe d'articles", "Stock UOM": "Unité de stock", "Standard Rate": "Prix standard", "Warehouse Name": "Nom de l'entrepôt", "Company Name": "Nom de la société" }, Ii = { items: "Lignes", taxes: "Taxes", references: "Références de paiement", accounts: "Écritures de compte", payments: "Paiements", plans: "Articles du plan", monthly_distribution: "Répartition mensuelle" }, Li = { "Create Sales Order": "Créer une commande client", "Create Sales Invoice": "Créer une facture de vente", "Create Delivery Note": "Créer un bon de livraison", "Create Purchase Invoice": "Créer une facture d'achat", "Create Purchase Receipt": "Créer un bon de réception", "Create Credit Note": "Créer un avoir", "Create Debit Note": "Créer une note de débit", "Create Return": "Créer un retour" }, Bi = { totalRevenue: "Chiffre d'affaires total", outstandingReceivable: "Créances en cours", outstandingPayable: "Dettes en cours", totalStockValue: "Valeur totale du stock", recentDocuments: "Documents récents", noRecentDocuments: "Aucun document récent" }, Ei = { title: "Chat Lambda ERP", subtitle: "Demandez-moi de créer des documents, de consulter des données ou d'exécuter des rapports.", s1: "Quels clients avons-nous ?", s2: "Affiche la balance comptable", s3: "Crée un devis pour 10 Bolt Pack M8", s4: "Liste toutes les factures impayées", loadOlder: "Charger les messages plus anciens", uploading: "Téléversement...", failed: "Échec", remove: "Supprimer", placeholderDemo: "Démo en direct en cours...", placeholderType: "Tapez un message...", placeholderConnecting: "Connexion...", attachTitle: "Joindre un fichier (PDF ou image, max 10 Mo)", creating: "Création du chat...", dropToAttach: "Déposez un fichier à joindre (images ou PDF, max 10 Mo chacun)", demoError: "Impossible de démarrer la démo", voiceStart: "Enregistrer un message vocal", voiceStop: "Arrêter l'enregistrement", voiceTranscribing: "Transcription...", micDenied: "L'accès au microphone a été refusé.", transcribeFailed: "Échec de la transcription. Veuillez réessayer." }, Oi = /* @__PURE__ */ JSON.parse(`{"pageTitle":"Premiers pas avec Lambda ERP","intro":"Lambda ERP est un système ERP nativement IA, où toutes les fonctionnalités – comme créer des commandes, vérifier l'inventaire ou enregistrer des paiements – sont accessibles via une interface de chat. Il guide, raisonne et vérifie toutes vos tâches quotidiennes.","openChat":"Ouvrir le chat IA","tipLabel":"Astuce :","topTip":"Le chat IA peut aussi vous donner des liens directs vers des documents et des PDF téléchargeables. Demandez-lui simplement de créer ou de rechercher un document et il inclura des liens cliquables dans sa réponse.","manualIntro":"Si vous souhaitez comprendre pleinement le fonctionnement interne, ou préférez procéder manuellement, voici un cycle commercial complet étape par étape.","caTitle":"Analyses dynamiques – discutez pour obtenir n'importe quel graphique","caBadge":"Fonctionnalité phare","caBody":"Besoin d'un rapport que les modèles prédéfinis ne fournissent pas ? Décrivez-le simplement dans le chat. L'assistant appelle un modèle spécialiste du code qui écrit le rapport pour vous, l'exécute en direct sur vos données ERP et renvoie un lien partageable. Le graphique ou le tableau s'affiche en quelques secondes et est enregistré comme brouillon sous « Analyses personnalisées » dans la barre latérale – vous pouvez le rouvrir, partager l'URL avec vos collègues ou demander à l'assistant de l'affiner.","caTryAsking":"Essayez de demander (cliquez pour préremplir dans le chat) :","caPrompt1":"Montre-moi les 10 meilleurs clients par chiffre d'affaires cette année en diagramme à barres","caPrompt2":"Tendance mensuelle des achats par fournisseur sur tous les mois, étiquette l'axe des x avec le nom du fournisseur","caPrompt3":"Articles les plus vendus par quantité, avec un tableau et un graphique","caPrompt4":"Quels clients me doivent le plus en ce moment ?","caTryInChat":"Essayer dans le chat","caOpenWorkspace":"Ouvrir l'espace d'analyse","flowTitle":"Aperçu du flux des documents","salesCycle":"Cycle de vente","purchaseCycle":"Cycle d'achat","returns":"Retours","flowShortcut":"Raccourci : le devis peut ignorer la commande client et aller directement à la facture de vente ou au bon de livraison","legendStock":"impact stock","legendGl":"impact comptable","legendCash":"impact trésorerie","legendReversal":"annulation","lifecycleTitle":"Cycle de vie du document","lcDraftLabel":"Brouillon :","lcDraftDesc":"Modifiable. Aucun impact financier ni sur le stock.","lcSubmittedLabel":"Validé :","lcSubmittedDesc":"Verrouillé. Les écritures comptables et de stock sont générées.","lcCancelledLabel":"Annulé :","lcCancelledDesc":"Toutes les écritures sont inversées. Le document est archivé définitivement.","lcNoDelete":"Il n'y a pas de suppression. Pour annuler un brouillon : validez-le, puis annulez-le.","lcCorrect":"Pour corriger un document validé : annulez-le et créez-en un nouveau.","readyTitle":"Vous êtes prêt","readyBody1":"Vous comprenez maintenant le cycle complet. Un scénario réel typique ressemble à ceci : vous recevez une commande client (Devis → Commande client), vérifiez le stock, achetez ce dont vous avez besoin (Bon de commande → Bon de réception → Facture d'achat → Paiement), livrez au client (Bon de livraison), facturez-le (Facture de vente) et encaissez le paiement (Paiement). Si quelque chose revient, créez un avoir et un retour de bon de livraison pour inverser les finances et le stock. La Balance comptable confirme que tout est équilibré.","readyBody2":"Vous pouvez aussi tout faire via le chat IA en conversation naturelle – décrivez simplement ce dont vous avez besoin et il créera les bons documents pour vous.","chips":{"Quotation":"Devis","Sales Order":"Commande client","Delivery Note":"Bon de livraison","Sales Invoice":"Facture de vente","Payment Entry":"Paiement","Purchase Order":"Bon de commande","Purchase Receipt":"Bon de réception","Purchase Invoice":"Facture d'achat","Credit Note":"Avoir","DN Return":"Retour BL","Debit Note":"Note de débit","Draft":"Brouillon","Submitted":"Validé","Cancelled":"Annulé"},"links":{"Go to Setup":"Aller à la configuration","Customers":"Clients","Suppliers":"Fournisseurs","Items":"Articles","Warehouses":"Entrepôts","New Quotation":"Nouveau devis","View Quotations":"Voir les devis","Stock Balance":"Solde de stock","New Purchase Order":"Nouveau bon de commande","Purchase Receipts":"Bons de réception","Purchase Invoices":"Factures d'achat","Delivery Notes":"Bons de livraison","Sales Invoices":"Factures de vente","New Payment Entry":"Nouveau paiement","New Stock Entry":"Nouveau mouvement de stock","New Journal Entry":"Nouvelle écriture de journal","Profit & Loss":"Compte de résultat","Balance Sheet":"Bilan","AR Aging":"Balance âgée clients","AP Aging":"Balance âgée fournisseurs","Trial Balance":"Balance comptable","General Ledger":"Grand livre","Open AI Chat":"Ouvrir le chat IA"},"steps":{"1":{"title":"Configurer votre société","description":"Créez une société avec une devise de base. Cela génère votre plan comptable (30 comptes standard répartis entre Actif, Passif, Capitaux propres, Produits et Charges) ainsi qu'un centre de coûts par défaut. Vous pouvez aussi charger des données de démonstration avec des clients, fournisseurs et articles d'exemple pour démarrer rapidement."},"2":{"title":"Créer les données de base","description":"Avant de pouvoir effectuer des transactions, vous avez besoin de fiches de base. Créez au moins un client, un fournisseur, un article (avec un prix standard) et un entrepôt. Si vous avez chargé les données de démonstration à l'étape 1, elles existent déjà.","tip":"Les articles ont un prix standard qui se remplit automatiquement lorsque vous les ajoutez à des documents. Vous pouvez toujours modifier le prix par transaction."},"3":{"title":"Créer un devis","description":"Un devis est une offre non contraignante adressée à un client. Sélectionnez un client, ajoutez des lignes avec quantités et prix, éventuellement des lignes de taxe, puis enregistrez. Les devis n'ont aucun impact financier – ils ne créent ni écritures comptables ni mouvements de stock. Définissez une date de validité pour que l'offre expire automatiquement."},"4":{"title":"Valider et convertir en commande client","description":"Ouvrez votre devis enregistré et cliquez sur Valider pour le confirmer. Cliquez ensuite sur « Créer une commande client » pour le convertir. La commande client représente un engagement confirmé du client. Elle n'a toujours aucun impact financier, mais réserve du stock à des fins de planification.","tip":"Seuls les documents validés peuvent être convertis à l'étape suivante. Brouillon → Valider → Convertir est le flux standard. Pour les affaires rapides, vous pouvez ignorer la commande client et passer directement du devis à la facture de vente ou au bon de livraison."},"5":{"title":"Vérifier le stock avant l'exécution","description":"Avant de pouvoir livrer, vérifiez si vous avez réellement l'article en stock. Ouvrez le rapport Solde de stock et recherchez l'article. Si votre entrepôt affiche une quantité nulle, vous devrez d'abord approvisionner le stock – soit par un bon de commande (achat auprès d'un fournisseur), soit par un mouvement de stock (réception manuelle).","tip":"C'est un scénario courant dans la pratique : vous vendez quelque chose, puis réalisez que vous devez d'abord l'acheter. L'ERP gère les deux flux."},"6":{"title":"Cycle d'achat : acheter du stock à un fournisseur","description":"Si vous devez acheter du stock, vous avez deux chemins valides. Le chemin standard est Bon de commande → Bon de réception → Facture d'achat : utilisez-le lorsque les marchandises arrivent avant ou séparément de la facture du fournisseur. Si la facture et la réception arrivent ensemble, vous pouvez créer directement la facture d'achat et activer « Mettre à jour le stock » afin que le même document réceptionne le stock et enregistre la dette fournisseur.","tip":"Utilisez d'abord le bon de réception lorsque vous recevez les marchandises séparément. Utilisez la facture d'achat avec « Mettre à jour le stock » lorsqu'une seule étape doit à la fois réceptionner le stock et comptabiliser la facture fournisseur. Dans ce chemin direct, indiquez un entrepôt sur chaque ligne d'article en stock."},"7":{"title":"Créer un bon de livraison","description":"Maintenant que vous avez du stock, revenez à votre commande client validée et cliquez sur « Créer un bon de livraison ». Indiquez l'entrepôt sur chaque ligne d'article (d'où partent les marchandises), puis validez. Cela sort le stock de l'entrepôt – votre solde de stock diminue.","tip":"Le bon de livraison est le document d'expédition. Il réduit le stock mais ne crée pas de facture. Vous pouvez livrer et facturer séparément."},"8":{"title":"Créer et valider la facture de vente","description":"À partir de la commande client validée, créez une facture de vente. Lorsque vous validez la facture, des écritures comptables sont générées : les Clients (créances) sont débités (le client vous doit de l'argent) et les Produits des ventes crédités (revenu acquis). Si des taxes sont configurées, la TVA collectée est également créditée. Le montant dû indique ce que le client doit encore."},"9":{"title":"Enregistrer les paiements clients","description":"Créez un paiement pour enregistrer l'argent reçu du client. Définissez le type de paiement sur « Receive » (Recevoir), sélectionnez le client, indiquez le montant et affectez-le à la facture de vente. Vous pouvez effectuer des paiements partiels – le montant dû de la facture se met à jour en conséquence. Créez des paiements supplémentaires jusqu'à ce que la facture soit entièrement réglée.","tip":"Les paiements partiels sont courants. Une facture de 10 000 peut être payée 3 000 maintenant et 7 000 plus tard. Chaque paiement réduit le montant dû."},"10":{"title":"Mouvements de stock (inventaire manuel)","description":"Utilisez les mouvements de stock pour les mouvements d'inventaire non liés aux achats ou aux ventes. « Material Receipt » ajoute du stock (soldes d'ouverture, ajustements). « Material Issue » sort du stock (pertes, consommation interne). « Material Transfer » déplace du stock entre entrepôts. Chaque mouvement met à jour le livre de stock avec une valorisation au coût moyen pondéré.","tip":"Pour les marchandises achetées, utilisez des bons de réception plutôt que des mouvements de stock – ils sont liés au bon de commande et offrent une piste d'audit appropriée."},"11":{"title":"Écritures de journal","description":"Les écritures de journal sont des ajustements comptables manuels – charges à payer, corrections, reclassements, soldes d'ouverture. Chaque écriture doit avoir des débits et crédits équilibrés (total débit = total crédit). Utilisez-les lorsqu'aucun autre type de document ne convient."},"12":{"title":"Paiements des salaires","description":"Lambda ERP gère les salaires à l'aide des outils comptables existants. Comptabilisez d'abord la charge salariale : créez une écriture de journal qui débite la Charge salariale et crédite les Salaires à payer pour le montant total de la paie. Payez ensuite les employés : créez une autre écriture de journal (ou un paiement) qui débite les Salaires à payer et crédite votre compte bancaire. Ce processus en deux étapes garde vos comptes exacts – la charge est enregistrée dans la bonne période et la sortie de trésorerie est suivie séparément.","tip":"Vous pouvez demander à l'assistant IA de le faire pour vous : « Comptabilise 15 000 de salaires pour avril » suivi de « Paie les salaires d'avril depuis la banque ». Il créera automatiquement les bonnes écritures de journal."},"13":{"title":"Retours et avoirs","description":"Lorsqu'un client retourne des marchandises ou que vous devez émettre un avoir, créez un retour. Les retours utilisent le même type de document avec des quantités négatives. Ouvrez une facture de vente validée et créez un avoir (retour de facture de vente) – cela inverse les écritures comptables et réduit le montant dû de la facture d'origine. Pour le stock, créez un retour de bon de livraison pour réintégrer les marchandises en entrepôt. Côté achats, créez une note de débit (retour de facture d'achat) pour inverser une facture fournisseur, ou un retour de bon de réception pour renvoyer des marchandises.","tip":"Un avoir est simplement une facture de vente avec is_return=1 et des quantités négatives. La même logique comptable s'applique – les montants négatifs basculent automatiquement du bon côté débit/crédit. Pour un retour de vente complet, vous avez besoin à la fois d'un avoir (financier) et d'un retour de bon de livraison (stock)."},"14":{"title":"Exécuter les rapports","description":"Vérifiez vos comptes. Le Compte de résultat montre les produits face aux charges et le résultat net d'une période. Le Bilan montre votre situation financière (actif = passif + capitaux propres). La Balance âgée clients montre qui vous doit de l'argent et le retard. La Balance âgée fournisseurs montre ce que vous devez aux fournisseurs. La Balance comptable vérifie l'intégrité de la partie double. Le Grand livre montre chaque écriture individuelle. Le Solde de stock montre l'inventaire actuel."},"15":{"title":"Travailler en devises étrangères","description":"Vos comptes sont tenus dans une seule devise de base (choisie à la configuration de la société), mais vous pouvez effectuer des transactions dans n'importe quelle devise. Définissez une devise sur une facture ou un effet – ou attribuez une devise par défaut à un client ou un fournisseur – et le taux de change de cette date est recherché automatiquement et enregistré sur le document. Le document conserve ses montants dans sa propre devise, tandis que le Grand livre comptabilise toujours dans votre devise de base. Lorsque vous encaissez ou payez ultérieurement à un taux différent, le gain ou la perte de change réalisé est comptabilisé automatiquement sur un compte Gain/Perte de change. Vous pouvez même détenir un solde bancaire en devise étrangère et le convertir plus tard au taux de votre banque – l'écart par rapport à sa valeur comptable est alors réalisé. En fin de mois, vous pouvez réévaluer les soldes en devises ouverts au taux de clôture (un gain/perte latent qui s'inverse à la période suivante), et vous pouvez consulter n'importe quel état financier converti dans une autre devise pour l'affichage.","tip":"Le plus simple est de passer par le chat IA – essayez « Crée une facture de vente pour Lumiere Audio en EUR », « Montre-moi le bilan en EUR » ou « Quelle est notre exposition de change latente en fin de mois ? ». Les données de démonstration incluent déjà un client EUR (Lumiere Audio SARL) dont la facture a été encaissée à un taux différent, ainsi qu'une facture fournisseur EUR ouverte – ouvrez le Grand livre pour voir les écritures de change réalisées."}}}`), qi = { title: "Aide au formatage", intro: "Le texte des Notes / Conditions prend en charge une mise en forme légère sur le PDF :", heading: "titre en gras", emphasis: "italique / gras", price: "prix aligné à droite à côté du texte ci-dessus (p. ex. Mensuel | CHF 380.—)", block: "Séparez les blocs par une ligne vide." }, Fi = {
6667
- common: xi,
6668
- language: vi,
6669
- header: Ni,
6670
- titles: wi,
6671
- doctypes: ki,
6672
- masters: Si,
6673
- nav: Ci,
6674
- login: Di,
6675
- settings: _i,
6676
- status: Pi,
6677
- reports: Ti,
6678
- masterForm: Ai,
6679
- fields: Ri,
6680
- tables: Ii,
6681
- conversions: Li,
6682
- dashboard: Bi,
6683
- chat: Ei,
6684
- tutorial: Oi,
6685
- notesMarkup: qi
6635
+ const Bs = { save: "Save", saving: "Saving...", submit: "Submit", cancel: "Cancel", cancelDoc: "Cancel", cancelDocAbort: "Don't cancel", cancelDocConfirmBtn: "Yes, cancel document", discardDraft: "Discard draft", keepDraft: "Keep", discardDraftConfirm: "Discard draft", showDiscarded: "Show discarded", delete: "Delete", edit: "Edit", pdf: "PDF", addRow: "Add Row", loading: "Loading...", enable: "Enable", disable: "Disable", refresh: "Refresh", refreshing: "Refreshing", areYouSure: "Are you sure?", all: "All", apply: "Apply", new: "New", prev: "Prev", next: "Next", perPage: "Per page", page: "Page", of: "of", showing: "Showing", total: "Total", totals: "Totals", errorOccurred: "An error occurred" }, Es = { title: "Language", help: "Choose the language for the interface. Your choice is saved in this browser.", label: "Language" }, Os = { logout: "Logout", openMenu: "Open menu", closeMenu: "Close menu", new: "New {{label}}" }, qs = { dashboard: "Dashboard", setup: "Company Setup", tutorial: "Getting Started", chat: "Chat", reports: "Reports", "trial-balance": "Trial Balance", "general-ledger": "General Ledger", "stock-balance": "Stock Balance", "profit-and-loss": "Profit & Loss", "balance-sheet": "Balance Sheet", "ar-aging": "Accounts Receivable Aging", "ap-aging": "Accounts Payable Aging", analytics: "Analytics" }, Fs = { quotation: { one: "Quotation", other: "Quotations" }, proposal: { one: "Proposal", other: "Proposals" }, "sales-order": { one: "Sales Order", other: "Sales Orders" }, "sales-invoice": { one: "Sales Invoice", other: "Sales Invoices" }, "pos-invoice": { one: "POS Invoice", other: "POS Invoices" }, "purchase-order": { one: "Purchase Order", other: "Purchase Orders" }, "purchase-invoice": { one: "Purchase Invoice", other: "Purchase Invoices" }, "payment-entry": { one: "Payment Entry", other: "Payment Entries" }, "journal-entry": { one: "Journal Entry", other: "Journal Entries" }, "bank-transaction": { one: "Bank Transaction", other: "Bank Transactions" }, budget: { one: "Budget", other: "Budgets" }, subscription: { one: "Subscription", other: "Subscriptions" }, "stock-entry": { one: "Stock Entry", other: "Stock Entries" }, "delivery-note": { one: "Delivery Note", other: "Delivery Notes" }, "purchase-receipt": { one: "Purchase Receipt", other: "Purchase Receipts" }, "pricing-rule": { one: "Pricing Rule", other: "Pricing Rules" } }, Ms = { company: { one: "Company", other: "Companies" }, customer: { one: "Customer", other: "Customers" }, supplier: { one: "Supplier", other: "Suppliers" }, item: { one: "Item", other: "Items" }, warehouse: { one: "Warehouse", other: "Warehouses" } }, zs = { chats: "Chats", newChat: "New Chat", deleteChat: "Delete chat", customAnalytics: "Custom Analytics", newAnalytics: "New Analytics", deleteReport: "Delete report", groups: { Introduction: "Introduction", Selling: "Selling", Buying: "Buying", Accounting: "Accounting", Stock: "Stock", Reports: "Reports", Masters: "Masters", Settings: "Settings" }, items: { "Getting Started": "Getting Started", "Company Setup": "Company Setup", "Opening Balances": "Opening Balances", Quotation: "Quotation", Proposal: "Proposals", "Sales Order": "Sales Order", "Sales Invoice": "Sales Invoice", "POS Invoice": "POS Invoice", "Purchase Order": "Purchase Order", "Purchase Invoice": "Purchase Invoice", "Payment Entry": "Payment Entry", "Journal Entry": "Journal Entry", "Bank Transaction": "Bank Transaction", Budget: "Budget", Subscription: "Subscription", "Stock Entry": "Stock Entry", "Delivery Note": "Delivery Note", "Purchase Receipt": "Purchase Receipt", "Trial Balance": "Trial Balance", "Profit & Loss": "Profit & Loss", "Balance Sheet": "Balance Sheet", "General Ledger": "General Ledger", "AR Aging": "AR Aging", "AP Aging": "AP Aging", Analytics: "Analytics", "Stock Balance": "Stock Balance", Company: "Company", Customer: "Customer", Supplier: "Supplier", Item: "Item", Warehouse: "Warehouse", General: "General", "Pricing Rule": "Pricing Rule", "Users & Team": "Users & Team" } }, $s = { taglineFirstRun: "Create your admin account to get started", taglineRegister: "Create your account", taglineSignIn: "Sign in to your account", demoBanner: "Demo mode is active. Sign in with an admin account to manage settings or disable public access.", fullName: "Full Name", email: "Email", password: "Password", confirmPassword: "Confirm Password", createAdmin: "Create Admin Account", register: "Register", signIn: "Sign In", browsingTitle: "Just browsing?", browsingBody: "Start a fresh chat session and watch the live demo.", enterDemo: "Enter Live Demo", haveInvite: "Have an invite?", noAccountPrompt: "Need an account?", registerLink: "Register", alreadyHaveAccount: "Already have an account?", signInLink: "Sign in", passwordsNoMatch: "Passwords do not match", passwordTooShort: "Password must be at least 6 characters", registrationFailed: "Registration failed", loginFailed: "Login failed" }, Us = { pdfTitle: "PDF & Print", pageSize: "Page Size", pdfHelp: "A4 is standard internationally (210 x 297 mm). Letter is standard in the US (8.5 x 11 in).", passwordTitle: "Change Password", currentPassword: "Current password", newPassword: "New password", confirmNewPassword: "Confirm new password", changePassword: "Change password", changingPassword: "Changing...", passwordChanged: "Password changed.", openingTitle: "Opening Balances", openingBody: "The Opening Balances page allows importing account balances, stock, and outstanding invoices from a previous system.", openingEnabled: "Currently enabled — accessible under Introduction > Opening Balances.", openingDisabled: "Currently disabled — the page is hidden from the sidebar.", signupTitle: "Public Signup", signupBody: "Allow anyone to create their own account (as a viewer) without an invite. When off, new users can only join via an invite link.", signupEnabled: "Currently enabled — anyone with the URL can register as a viewer.", signupDisabled: "Currently disabled — registration is invite-only.", publicTitle: "Public Access (Demo Mode)", publicActive: "Active", publicActiveBody: "Public access is enabled. Anyone can use the application without logging in. All visitors get manager-level permissions.", disablePublic: "Disable Public Access", disabling: "Disabling...", publicInactiveBody: "Enable public access to let anyone use the application without an account. Useful for demos and showcases. All visitors get manager-level permissions and share the same identity.", enablePublic: "Enable Public Access", enableWarning: "This will allow anyone to access the application without logging in. They will be able to create, edit, and submit documents. Your admin account still requires login.", yesEnable: "Yes, Enable", enabling: "Enabling...", tokenSpendTitle: "Token Spend" }, Vs = { Draft: "Draft", Open: "Open", Submitted: "Submitted", "To Deliver and Bill": "To Deliver and Bill", "To Deliver": "To Deliver", "To Bill": "To Bill", Completed: "Completed", Ordered: "Ordered", Paid: "Paid", Unpaid: "Unpaid", Cancelled: "Cancelled", Discarded: "Discarded", Overdue: "Overdue", Return: "Return", Closed: "Closed" }, js = { balanced: "BALANCED", imbalanced: "IMBALANCED", income: "Income", expenses: "Expenses", totalIncome: "Total Income", totalExpenses: "Total Expenses", netProfit: "Net Profit", netLoss: "Net Loss", assets: "Assets", liabilities: "Liabilities", equity: "Equity", totalAssets: "Total Assets", totalLiabilities: "Total Liabilities", totalEquity: "Total Equity", totalLiabilitiesEquity: "Total Liabilities + Equity", current: "Current", noData: "No data found", noEntries: "No entries found", noStockData: "No stock data found", noReceivables: "No outstanding receivables", noPayables: "No outstanding payables", noDocuments: "No documents found" }, Gs = { required: "Required: {{fields}}", deleteConfirm: "Delete this {{label}}?", disabledNotice: "This {{label}} is disabled. It remains in the system because other records still reference it.", disabledOnDelete: "{{label}} {{name}} was disabled instead of deleted because it is referenced by {{reason}}." }, Ks = { totalRevenue: "Total Revenue", outstandingReceivable: "Outstanding Receivable", outstandingPayable: "Outstanding Payable", totalStockValue: "Total Stock Value", recentDocuments: "Recent Documents", noRecentDocuments: "No recent documents" }, Ws = { title: "Lambda ERP Chat", subtitle: "Ask me to create documents, look up data, or run reports.", s1: "What customers do we have?", s2: "Show me the trial balance", s3: "Create a quotation for 10 Bolt Pack M8", s4: "List all unpaid invoices", loadOlder: "Load older messages", uploading: "Uploading...", failed: "Failed", remove: "Remove", placeholderDemo: "Running live demo...", placeholderType: "Type a message...", placeholderConnecting: "Connecting...", attachTitle: "Attach file (PDF or image, max 10 MB)", creating: "Creating chat...", dropToAttach: "Drop file to attach (images or PDF, max 10 MB each)", demoError: "Could not start demo", voiceStart: "Record voice message", voiceStop: "Stop recording", voiceTranscribing: "Transcribing...", micDenied: "Microphone access was denied.", transcribeFailed: "Transcription failed. Please try again." }, Hs = { "Create Credit Note": "Create Credit Note", "Create Debit Note": "Create Debit Note", "Create Delivery Note": "Create Delivery Note", "Create Purchase Invoice": "Create Purchase Invoice", "Create Purchase Receipt": "Create Purchase Receipt", "Create Return": "Create Return", "Create Sales Invoice": "Create Sales Invoice", "Create Sales Order": "Create Sales Order" }, Qs = { "% Billed": "% Billed", "% Delivered": "% Delivered", Account: "Account", Address: "Address", Allocated: "Allocated", Amount: "Amount", "As of Date": "As of Date", Balance: "Balance", "Bank Account": "Bank Account", "Billing Interval": "Billing Interval", "Budget Amount": "Budget Amount", Buying: "Buying", Change: "Change", City: "City", Company: "Company", "Company Name": "Company Name", "Cost Center": "Cost Center", Country: "Country", Credit: "Credit", "Credit Limit": "Credit Limit", Currency: "Currency", "Current Period End": "Current Period End", "Contact Person": "Contact Person", "Contact Email": "Contact Email", "Contact Phone": "Contact Phone", "Current Period Start": "Current Period Start", Customer: "Customer", "Customer Group": "Customer Group", "Customer Name": "Customer Name", Date: "Date", Debit: "Debit", "Delivery Date": "Delivery Date", Deposit: "Deposit", Description: "Description", "Discount %": "Discount %", "Discount Amt": "Discount Amt", "Discount Percentage": "Discount Percentage", "Due Date": "Due Date", Email: "Email", Enabled: "Enabled", "End Date": "End Date", "Expense Account": "Expense Account", "Fiscal Year": "Fiscal Year", "From Date": "From Date", "Grand Total": "Grand Total", Frequency: "Frequency", ID: "ID", "If Exceeded": "If Exceeded", "Income Account": "Income Account", "Incoming Value": "Incoming Value", Invoice: "Invoice", Item: "Item", "Item Code": "Item Code", "Item Group": "Item Group", "Item Name": "Item Name", "Matched Doc": "Matched Doc", "Matched Type": "Matched Type", "Min Qty": "Min Qty", Mode: "Mode", Month: "Month", Name: "Name", "Net Total": "Net Total", "Notes / Terms": "Notes / Terms", "Outgoing Value": "Outgoing Value", Outstanding: "Outstanding", "Outstanding Amount": "Outstanding Amount", "Paid Amount": "Paid Amount", "Paid From": "Paid From", "Paid To": "Paid To", Party: "Party", "Party Type": "Party Type", "Payment Type": "Payment Type", Phone: "Phone", "Plan Items": "Plan Items", "Posting Date": "Posting Date", Priority: "Priority", Qty: "Qty", Rate: "Rate", "Rate (%)": "Rate (%)", "Rate Or Discount": "Rate Or Discount", "Reference No": "Reference No", Remark: "Remark", Selling: "Selling", Source: "Source", "Source Warehouse": "Source Warehouse", "Standard Rate": "Standard Rate", "Start Date": "Start Date", Status: "Status", "Stock Entry Type": "Stock Entry Type", "Stock UOM": "Stock UOM", "Stock Value": "Stock Value", Supplier: "Supplier", "Supplier Group": "Supplier Group", "Supplier Name": "Supplier Name", Target: "Target", "Target Warehouse": "Target Warehouse", Tax: "Tax", "Tax ID": "Tax ID", Territory: "Territory", Title: "Title", "To Date": "To Date", Total: "Total", "Total Amount": "Total Amount", "Total Credit": "Total Credit", "Total Debit": "Total Debit", "Transaction Date": "Transaction Date", Type: "Type", Unallocated: "Unallocated", "Update Stock": "Update Stock", "Valid From": "Valid From", "Valid Till": "Valid Till", "Valid Upto": "Valid Upto", "Valuation Rate": "Valuation Rate", "Voucher No": "Voucher No", "Voucher Type": "Voucher Type", Warehouse: "Warehouse", "Warehouse Name": "Warehouse Name", Withdrawal: "Withdrawal", "Zip Code": "Zip Code" }, Js = { accounts: "accounts", items: "items", monthly_distribution: "monthly_distribution", payments: "payments", plans: "plans", references: "references", taxes: "taxes" }, Ys = /* @__PURE__ */ JSON.parse(`{"chips":{"Cancelled":"Cancelled","Credit Note":"Credit Note","DN Return":"DN Return","Debit Note":"Debit Note","Delivery Note":"Delivery Note","Draft":"Draft","Payment Entry":"Payment Entry","Purchase Invoice":"Purchase Invoice","Purchase Order":"Purchase Order","Purchase Receipt":"Purchase Receipt","Quotation":"Quotation","Sales Invoice":"Sales Invoice","Sales Order":"Sales Order","Submitted":"Submitted"},"links":{"AP Aging":"AP Aging","AR Aging":"AR Aging","Balance Sheet":"Balance Sheet","Customers":"Customers","Delivery Notes":"Delivery Notes","General Ledger":"General Ledger","Go to Setup":"Go to Setup","Items":"Items","New Journal Entry":"New Journal Entry","New Payment Entry":"New Payment Entry","New Purchase Order":"New Purchase Order","New Quotation":"New Quotation","New Stock Entry":"New Stock Entry","Open AI Chat":"Open AI Chat","Profit & Loss":"Profit & Loss","Purchase Invoices":"Purchase Invoices","Purchase Receipts":"Purchase Receipts","Sales Invoices":"Sales Invoices","Stock Balance":"Stock Balance","Suppliers":"Suppliers","Trial Balance":"Trial Balance","View Quotations":"View Quotations","Warehouses":"Warehouses"},"steps":{"1":{"title":"Set Up Your Company","description":"Create a company with a base currency. This generates your Chart of Accounts (30 standard accounts across Assets, Liabilities, Equity, Income, and Expenses) and a default Cost Center. You can also seed demo data with sample customers, suppliers, and items to get started quickly."},"2":{"title":"Create Master Data","description":"Before you can transact, you need master records. Create at least one Customer, one Supplier, one Item (with a standard rate), and one Warehouse. If you seeded demo data in Step 1, these already exist.","tip":"Items have a standard rate that auto-fills when you add them to documents. You can always override the rate per transaction."},"3":{"title":"Create a Quotation","description":"A Quotation is a non-binding offer to a customer. Select a customer, add line items with quantities and rates, optionally add tax rows, then save. Quotations have no financial impact — they don't create accounting or stock entries. Set a validity date so the offer expires automatically."},"4":{"title":"Submit and Convert to Sales Order","description":"Open your saved Quotation and click Submit to confirm it. Then click “Create Sales Order” to convert it. The Sales Order represents a confirmed commitment from the customer. It still has no financial impact, but it reserves stock for planning purposes.","tip":"Only submitted documents can be converted to the next step. Draft → Submit → Convert is the standard flow. For quick deals, you can skip the Sales Order and go directly from Quotation to Sales Invoice or Delivery Note."},"5":{"title":"Check Stock Before Fulfilling","description":"Before you can deliver, check if you actually have the item in stock. Go to the Stock Balance report and look up the item. If your warehouse has zero quantity, you’ll need to bring stock in first — either through a Purchase Order (buying from a supplier) or a Stock Entry (manual receipt).","tip":"This is a common real-world scenario: you sell something, then realize you need to buy it first. The ERP handles both flows."},"6":{"title":"Purchase Cycle: Buy Stock from a Supplier","description":"If you need to buy stock, you have two valid paths. The standard path is Purchase Order -> Purchase Receipt -> Purchase Invoice: use this when goods arrive before or separately from the supplier bill. If the bill and receipt happen together, you can create the Purchase Invoice directly and enable Update Stock so the same document both receives inventory and records Accounts Payable.","tip":"Use Purchase Receipt first when receiving goods separately. Use Purchase Invoice with Update Stock when one step should both receive stock and book the supplier bill. In that direct path, set a warehouse on each stock item row."},"7":{"title":"Create a Delivery Note","description":"Now that you have stock, go back to your submitted Sales Order and click “Create Delivery Note.” Set the warehouse on each item row (where the goods ship from), then submit. This moves inventory out of the warehouse — your stock balance decreases.","tip":"The Delivery Note is the shipping document. It reduces stock but doesn’t create an invoice. You can deliver and invoice separately."},"8":{"title":"Create and Submit the Sales Invoice","description":"From the submitted Sales Order, create a Sales Invoice. When you submit the invoice, GL entries are posted: Accounts Receivable is debited (the customer owes you) and Sales Revenue is credited (income earned). If taxes are configured, Tax Payable is also credited. The outstanding amount shows what the customer still owes."},"9":{"title":"Record Customer Payments","description":"Create a Payment Entry to record money received from the customer. Set the payment type to “Receive,” select the customer, specify the amount, and allocate it against the Sales Invoice. You can make partial payments — the invoice’s outstanding amount updates accordingly. Create additional Payment Entries until the invoice is fully paid.","tip":"Partial payments are common. A 10,000 invoice might be paid as 3,000 now and 7,000 later. Each Payment Entry reduces the outstanding amount."},"10":{"title":"Stock Entries (Manual Inventory)","description":"Use Stock Entries for inventory movements that aren’t tied to purchases or sales. Material Receipt adds stock (opening balances, adjustments). Material Issue removes stock (write-offs, internal consumption). Material Transfer moves stock between warehouses. Each entry updates the stock ledger with moving-average valuation.","tip":"For purchased goods, use Purchase Receipts instead of Stock Entries — they link to the Purchase Order and give you a proper audit trail."},"11":{"title":"Journal Entries","description":"Journal Entries are manual accounting adjustments — expense accruals, corrections, reclassifications, opening balances. Each entry must have balanced debits and credits (total debit = total credit). Use these when no other document type fits."},"12":{"title":"Salary Payments","description":"Lambda ERP handles salaries through the existing accounting tools. First, accrue the salary expense: create a Journal Entry that debits Salary Expense and credits Salary Payable for the total payroll amount. Then pay the employees: create another Journal Entry (or Payment Entry) that debits Salary Payable and credits your bank account. This two-step process keeps your books accurate — the expense is recorded in the right period, and the cash outflow is tracked separately.","tip":"You can ask the AI assistant to do this for you: “Accrue 15,000 in salaries for April” followed by “Pay the April salaries from bank.” It will create the right journal entries automatically."},"13":{"title":"Returns and Credit Notes","description":"When a customer returns goods or you need to issue a credit, create a return. Returns use the same document type with negative quantities. Open a submitted Sales Invoice and create a Credit Note (Sales Invoice return) — this reverses the GL entries and reduces the original invoice’s outstanding amount. For stock, create a Delivery Note return to bring goods back into the warehouse. On the buying side, create a Debit Note (Purchase Invoice return) to reverse a supplier bill, or a Purchase Receipt return to send goods back.","tip":"A Credit Note is just a Sales Invoice with is_return=1 and negative quantities. The same GL logic runs — negative amounts automatically flip to the correct debit/credit sides. For a full sales return, you need both a Credit Note (financials) and a Delivery Note return (stock)."},"14":{"title":"Run Reports","description":"Check your books. The Profit & Loss shows income vs expenses and net profit for a period. The Balance Sheet shows your financial position (assets = liabilities + equity). AR Aging shows who owes you money and how overdue it is. AP Aging shows what you owe suppliers. The Trial Balance verifies double-entry integrity. The General Ledger shows every individual posting. Stock Balance shows current inventory."},"15":{"title":"Working in Foreign Currencies","description":"Your books are kept in a single base currency (chosen at company setup), but you can transact in any currency. Set a currency on an invoice or bill — or give a customer or supplier a default currency — and the exchange rate for that date is looked up automatically and stored on the document. The document keeps its amounts in its own currency, while the General Ledger always posts in your base currency. When you later collect or pay at a different rate, the realized exchange gain or loss is booked automatically to an Exchange Gain/Loss account. You can even hold a foreign-currency bank balance and convert it later at your bank’s rate — the difference versus its carried value is realized then. At month end you can revalue open foreign balances to the closing rate (an unrealized gain/loss that reverses next period), and you can view any financial statement translated into another currency for display.","tip":"This is easiest through the AI chat — try “Create a sales invoice for Lumiere Audio in EUR,” “Show me the balance sheet in EUR,” or “What’s our unrealized FX exposure at month end?” The seeded demo already includes a EUR customer (Lumiere Audio SARL) whose invoice was collected at a different rate, plus an open EUR supplier bill — open the General Ledger to see the realized FX postings."}},"caTitle":"Dynamic Analytics — Chat Your Way to Any Chart","caBadge":"Signature Feature","caBody":"Need a report the presets can’t give you? Just describe it in chat. The assistant calls a code-specialist model that writes the report for you, runs it live over your ERP data, and returns a sharable link. The chart or table renders in seconds and is saved as a draft under Custom Analytics in the sidebar — you can reopen it, share the URL with teammates, or ask the assistant to refine it.","caTryAsking":"Try asking (click to prefill in chat):","caPrompt1":"Show me top 10 customers by revenue this year as a bar chart","caPrompt2":"Monthly purchases trend by supplier over all months and label x-axis with supplier name","caPrompt3":"Best selling items by quantity, with a table and a chart","caPrompt4":"Which customers owe me the most right now?","caTryInChat":"Try it in chat","caOpenWorkspace":"Open Analytics workspace","flowTitle":"Document Flow Overview","salesCycle":"Sales Cycle","flowShortcut":"Shortcut: Quotation can skip Sales Order and go directly to Sales Invoice or Delivery Note","purchaseCycle":"Purchase Cycle","returns":"Returns","legendStock":"stock impact","legendGl":"GL impact","legendCash":"cash impact","legendReversal":"reversal","lifecycleTitle":"Document Lifecycle","lcDraftLabel":"Draft:","lcDraftDesc":"Editable. No financial or stock impact.","lcSubmittedLabel":"Submitted:","lcSubmittedDesc":"Locked. GL entries and stock ledger entries are posted.","lcCancelledLabel":"Cancelled:","lcCancelledDesc":"All entries reversed. Document is permanently archived.","lcNoDelete":"There is no delete. To void a draft: submit it, then cancel it.","lcCorrect":"To correct a submitted document: cancel it and create a new one.","pageTitle":"Getting Started with Lambda ERP","intro":"Lambda ERP is an AI Native ERP System, with all functionality — like creating orders, checking inventory, recording payments — being accessible through a chat interface. It instructs, reasons and checks all your daily business tasks.","openChat":"Open AI Chat","tipLabel":"Tip:","topTip":"The AI chat can also give you direct links to documents and downloadable PDFs. Just ask it to create or look up a document and it will include clickable links in its response.","manualIntro":"If you want to fully understand how things work under the hood, or prefer to do things manually, here’s a full business cycle step by step.","readyTitle":"You're Ready","readyBody1":"You now understand the full cycle. A typical real-world scenario looks like this: you receive a customer order (Quotation → Sales Order), check stock, buy what you need (Purchase Order → Purchase Receipt → Purchase Invoice → Payment), deliver to the customer (Delivery Note), bill them (Sales Invoice), and collect payment (Payment Entry). If something comes back, create a Credit Note and Delivery Note return to reverse the financials and stock. The Trial Balance confirms everything is balanced.","readyBody2":"You can also use the AI chat to do all of this through natural conversation — just describe what you need and it will create the right documents for you."}`), Zs = { title: "Formatting help", intro: "The Notes / Terms text supports light formatting on the PDF:", heading: "bold heading", emphasis: "italic / bold", price: "right-aligned price beside the text above (e.g. Monthly | CHF 380.—)", block: "Separate blocks with a blank line." }, Xs = {
6636
+ common: Bs,
6637
+ language: Es,
6638
+ header: Os,
6639
+ titles: qs,
6640
+ doctypes: Fs,
6641
+ masters: Ms,
6642
+ nav: zs,
6643
+ login: $s,
6644
+ settings: Us,
6645
+ status: Vs,
6646
+ reports: js,
6647
+ masterForm: Gs,
6648
+ dashboard: Ks,
6649
+ chat: Ws,
6650
+ conversions: Hs,
6651
+ fields: Qs,
6652
+ tables: Js,
6653
+ tutorial: Ys,
6654
+ notesMarkup: Zs
6655
+ }, ei = { save: "Speichern", saving: "Speichern...", submit: "Buchen", cancel: "Abbrechen", cancelDoc: "Stornieren", cancelDocAbort: "Nicht stornieren", cancelDocConfirmBtn: "Definitiv stornieren", discardDraft: "Entwurf verwerfen", keepDraft: "Behalten", discardDraftConfirm: "Verwerfen", showDiscarded: "Verworfene anzeigen", 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" }, ti = { title: "Sprache", help: "Wählen Sie die Sprache der Oberfläche. Ihre Auswahl wird in diesem Browser gespeichert.", label: "Sprache" }, ni = { logout: "Abmelden", openMenu: "Menü öffnen", closeMenu: "Menü schließen", new: "Neu: {{label}}" }, ai = { 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" }, ri = { quotation: { one: "Angebot", other: "Angebote" }, proposal: { one: "Sammelofferte", other: "Sammelofferten" }, "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" } }, si = { 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" } }, ii = { 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", Proposal: "Sammelofferte", "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" } }, oi = { 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?", noAccountPrompt: "Noch kein Konto?", 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" }, li = { 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).", passwordTitle: "Passwort ändern", currentPassword: "Aktuelles Passwort", newPassword: "Neues Passwort", confirmNewPassword: "Neues Passwort bestätigen", changePassword: "Passwort ändern", changingPassword: "Wird geändert...", passwordChanged: "Passwort geändert.", 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.", signupTitle: "Öffentliche Registrierung", signupBody: "Erlauben Sie es jedem, ohne Einladung ein eigenes Konto (als Betrachter) zu erstellen. Wenn deaktiviert, können neue Benutzer nur über einen Einladungslink beitreten.", signupEnabled: "Derzeit aktiviert — jeder mit der URL kann sich als Betrachter registrieren.", signupDisabled: "Derzeit deaktiviert — die Registrierung erfolgt nur per Einladung.", 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...", tokenSpendTitle: "Token-Ausgaben" }, ci = { 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", Discarded: "Verworfen", Overdue: "Überfällig", Return: "Retoure", Closed: "Geschlossen" }, di = { 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" }, ui = { 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." }, mi = { 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", Frequency: "Frequenz", "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", "Contact Person": "Ansprechperson", "Contact Email": "E-Mail Ansprechperson", "Contact Phone": "Telefon Ansprechperson", "Supplier Name": "Lieferantenname", "Supplier Group": "Lieferantengruppe", "Item Group": "Artikelgruppe", "Stock UOM": "Lagereinheit", "Standard Rate": "Standardpreis", "Warehouse Name": "Lagername", "Company Name": "Firmenname" }, pi = { items: "Positionen", taxes: "Steuern", references: "Zahlungsreferenzen", accounts: "Kontobuchungen", payments: "Zahlungen", plans: "Planpositionen", monthly_distribution: "Monatliche Verteilung" }, hi = { "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" }, gi = { totalRevenue: "Gesamtumsatz", outstandingReceivable: "Offene Forderungen", outstandingPayable: "Offene Verbindlichkeiten", totalStockValue: "Gesamter Lagerwert", recentDocuments: "Letzte Dokumente", noRecentDocuments: "Keine aktuellen Dokumente" }, yi = { 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", voiceStart: "Sprachnachricht aufnehmen", voiceStop: "Aufnahme stoppen", voiceTranscribing: "Wird transkribiert...", micDenied: "Zugriff auf das Mikrofon wurde verweigert.", transcribeFailed: "Transkription fehlgeschlagen. Bitte erneut versuchen." }, fi = /* @__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."}}}'), bi = { title: "Formatierungshilfe", intro: "Der Text unter Notizen / Konditionen unterstützt eine einfache Formatierung im PDF:", heading: "fette Überschrift", emphasis: "kursiv / fett", price: "rechtsbündiger Preis neben dem Text darüber (z. B. Monatlich | CHF 380.—)", block: "Trennen Sie Blöcke durch eine Leerzeile." }, xi = {
6656
+ common: ei,
6657
+ language: ti,
6658
+ header: ni,
6659
+ titles: ai,
6660
+ doctypes: ri,
6661
+ masters: si,
6662
+ nav: ii,
6663
+ login: oi,
6664
+ settings: li,
6665
+ status: ci,
6666
+ reports: di,
6667
+ masterForm: ui,
6668
+ fields: mi,
6669
+ tables: pi,
6670
+ conversions: hi,
6671
+ dashboard: gi,
6672
+ chat: yi,
6673
+ tutorial: fi,
6674
+ notesMarkup: bi
6675
+ }, vi = { save: "Enregistrer", saving: "Enregistrement...", submit: "Valider", cancel: "Annuler", cancelDoc: "Annuler", cancelDocAbort: "Ne pas annuler", cancelDocConfirmBtn: "Annuler définitivement", discardDraft: "Supprimer le brouillon", keepDraft: "Conserver", discardDraftConfirm: "Supprimer", showDiscarded: "Afficher les supprimés", delete: "Supprimer", edit: "Modifier", pdf: "PDF", addRow: "Ajouter une ligne", loading: "Chargement...", enable: "Activer", disable: "Désactiver", refresh: "Actualiser", refreshing: "Actualisation", areYouSure: "Êtes-vous sûr ?", all: "Tous", apply: "Appliquer", new: "Nouveau", prev: "Précédent", next: "Suivant", perPage: "Par page", page: "Page", of: "sur", showing: "Affichage", total: "Total", totals: "Totaux", errorOccurred: "Une erreur s'est produite" }, Ni = { title: "Langue", help: "Choisissez la langue de l'interface. Votre choix est enregistré dans ce navigateur.", label: "Langue" }, wi = { logout: "Déconnexion", openMenu: "Ouvrir le menu", closeMenu: "Fermer le menu", new: "Nouveau : {{label}}" }, ki = { dashboard: "Tableau de bord", setup: "Configuration de l'entreprise", tutorial: "Premiers pas", chat: "Chat", reports: "Rapports", "trial-balance": "Balance comptable", "general-ledger": "Grand livre", "stock-balance": "Solde de stock", "profit-and-loss": "Compte de résultat", "balance-sheet": "Bilan", "ar-aging": "Balance âgée clients", "ap-aging": "Balance âgée fournisseurs", analytics: "Analyses" }, Si = { quotation: { one: "Devis", other: "Devis" }, proposal: { one: "Offre groupée", other: "Offres groupées" }, "sales-order": { one: "Commande client", other: "Commandes client" }, "sales-invoice": { one: "Facture de vente", other: "Factures de vente" }, "pos-invoice": { one: "Ticket de caisse", other: "Tickets de caisse" }, "purchase-order": { one: "Bon de commande", other: "Bons de commande" }, "purchase-invoice": { one: "Facture d'achat", other: "Factures d'achat" }, "payment-entry": { one: "Paiement", other: "Paiements" }, "journal-entry": { one: "Écriture comptable", other: "Écritures comptables" }, "bank-transaction": { one: "Transaction bancaire", other: "Transactions bancaires" }, budget: { one: "Budget", other: "Budgets" }, subscription: { one: "Abonnement", other: "Abonnements" }, "stock-entry": { one: "Mouvement de stock", other: "Mouvements de stock" }, "delivery-note": { one: "Bon de livraison", other: "Bons de livraison" }, "purchase-receipt": { one: "Bon de réception", other: "Bons de réception" }, "pricing-rule": { one: "Règle de prix", other: "Règles de prix" } }, Ci = { company: { one: "Société", other: "Sociétés" }, customer: { one: "Client", other: "Clients" }, supplier: { one: "Fournisseur", other: "Fournisseurs" }, item: { one: "Article", other: "Articles" }, warehouse: { one: "Entrepôt", other: "Entrepôts" } }, Di = { chats: "Discussions", newChat: "Nouvelle discussion", deleteChat: "Supprimer la discussion", customAnalytics: "Analyses personnalisées", newAnalytics: "Nouvelle analyse", deleteReport: "Supprimer le rapport", groups: { Introduction: "Introduction", Selling: "Ventes", Buying: "Achats", Accounting: "Comptabilité", Stock: "Stock", Reports: "Rapports", Masters: "Données de base", Settings: "Paramètres" }, items: { "Getting Started": "Premiers pas", "Company Setup": "Configuration de l'entreprise", "Opening Balances": "Soldes d'ouverture", Quotation: "Devis", Proposal: "Offre groupée", "Sales Order": "Commande client", "Sales Invoice": "Facture de vente", "POS Invoice": "Ticket de caisse", "Purchase Order": "Bon de commande", "Purchase Invoice": "Facture d'achat", "Payment Entry": "Paiement", "Journal Entry": "Écriture comptable", "Bank Transaction": "Transaction bancaire", Budget: "Budget", Subscription: "Abonnement", "Stock Entry": "Mouvement de stock", "Delivery Note": "Bon de livraison", "Purchase Receipt": "Bon de réception", "Trial Balance": "Balance comptable", "Profit & Loss": "Compte de résultat", "Balance Sheet": "Bilan", "General Ledger": "Grand livre", "AR Aging": "Balance âgée clients", "AP Aging": "Balance âgée fournisseurs", Analytics: "Analyses", "Stock Balance": "Solde de stock", Company: "Société", Customer: "Client", Supplier: "Fournisseur", Item: "Article", Warehouse: "Entrepôt", General: "Général", "Pricing Rule": "Règle de prix", "Users & Team": "Utilisateurs et équipe" } }, _i = { taglineFirstRun: "Créez votre compte administrateur pour commencer", taglineRegister: "Créez votre compte", taglineSignIn: "Connectez-vous à votre compte", demoBanner: "Le mode démo est actif. Connectez-vous avec un compte administrateur pour gérer les paramètres ou désactiver l'accès public.", fullName: "Nom complet", email: "E-mail", password: "Mot de passe", confirmPassword: "Confirmer le mot de passe", createAdmin: "Créer un compte administrateur", register: "S'inscrire", signIn: "Se connecter", browsingTitle: "Simple visite ?", browsingBody: "Démarrez une nouvelle session de chat et regardez la démo en direct.", enterDemo: "Lancer la démo", haveInvite: "Vous avez une invitation ?", noAccountPrompt: "Besoin d'un compte ?", registerLink: "S'inscrire", alreadyHaveAccount: "Vous avez déjà un compte ?", signInLink: "Se connecter", passwordsNoMatch: "Les mots de passe ne correspondent pas", passwordTooShort: "Le mot de passe doit comporter au moins 6 caractères", registrationFailed: "Échec de l'inscription", loginFailed: "Échec de la connexion" }, Pi = { pdfTitle: "PDF et impression", pageSize: "Format de page", pdfHelp: "A4 est la norme internationale (210 x 297 mm). Letter est la norme aux États-Unis (8,5 x 11 po).", passwordTitle: "Changer le mot de passe", currentPassword: "Mot de passe actuel", newPassword: "Nouveau mot de passe", confirmNewPassword: "Confirmer le nouveau mot de passe", changePassword: "Changer le mot de passe", changingPassword: "Modification...", passwordChanged: "Mot de passe modifié.", openingTitle: "Soldes d'ouverture", openingBody: "La page Soldes d'ouverture permet d'importer les soldes des comptes, le stock et les factures impayées d'un système précédent.", openingEnabled: "Actuellement activé — accessible sous Introduction > Soldes d'ouverture.", openingDisabled: "Actuellement désactivé — la page est masquée dans la barre latérale.", signupTitle: "Inscription publique", signupBody: "Permettre à quiconque de créer son propre compte (en tant que lecteur) sans invitation. Lorsque désactivé, les nouveaux utilisateurs ne peuvent rejoindre que via un lien d'invitation.", signupEnabled: "Actuellement activé — toute personne disposant de l'URL peut s'inscrire en tant que lecteur.", signupDisabled: "Actuellement désactivé — l'inscription se fait uniquement sur invitation.", publicTitle: "Accès public (mode démo)", publicActive: "Actif", publicActiveBody: "L'accès public est activé. N'importe qui peut utiliser l'application sans se connecter. Tous les visiteurs obtiennent des autorisations de niveau gestionnaire.", disablePublic: "Désactiver l'accès public", disabling: "Désactivation...", publicInactiveBody: "Activez l'accès public pour permettre à quiconque d'utiliser l'application sans compte. Utile pour les démos et présentations. Tous les visiteurs obtiennent des autorisations de niveau gestionnaire et partagent la même identité.", enablePublic: "Activer l'accès public", enableWarning: "Cela permettra à quiconque d'accéder à l'application sans se connecter. Ils pourront créer, modifier et valider des documents. Votre compte administrateur nécessite toujours une connexion.", yesEnable: "Oui, activer", enabling: "Activation...", tokenSpendTitle: "Dépenses de jetons" }, Ti = { Draft: "Brouillon", Open: "Ouvert", Submitted: "Validé", "To Deliver and Bill": "À livrer et facturer", "To Deliver": "À livrer", "To Bill": "À facturer", Completed: "Terminé", Ordered: "Commandé", Paid: "Payé", Unpaid: "Impayé", Cancelled: "Annulé", Discarded: "Supprimé", Overdue: "En retard", Return: "Retour", Closed: "Clôturé" }, Ai = { balanced: "ÉQUILIBRÉ", imbalanced: "DÉSÉQUILIBRÉ", income: "Produits", expenses: "Charges", totalIncome: "Total des produits", totalExpenses: "Total des charges", netProfit: "Bénéfice", netLoss: "Perte", assets: "Actif", liabilities: "Passif", equity: "Capitaux propres", totalAssets: "Total de l'actif", totalLiabilities: "Total du passif", totalEquity: "Total des capitaux propres", totalLiabilitiesEquity: "Total passif + capitaux propres", current: "Non échu", noData: "Aucune donnée trouvée", noEntries: "Aucune écriture trouvée", noStockData: "Aucune donnée de stock trouvée", noReceivables: "Aucune créance en cours", noPayables: "Aucune dette en cours", noDocuments: "Aucun document trouvé" }, Ri = { required: "Requis : {{fields}}", deleteConfirm: "Supprimer ce {{label}} ?", disabledNotice: "Ce {{label}} est désactivé. Il reste dans le système car d'autres enregistrements y font référence.", disabledOnDelete: "{{label}} {{name}} a été désactivé au lieu d'être supprimé car il est référencé par {{reason}}." }, Ii = { Account: "Compte", Amount: "Montant", Balance: "Solde", Credit: "Crédit", Debit: "Débit", Date: "Date", Party: "Tiers", "Party Type": "Type de tiers", "Voucher Type": "Type de pièce", "Voucher No": "N° de pièce", Invoice: "Facture", Customer: "Client", Supplier: "Fournisseur", "Due Date": "Date d'échéance", Outstanding: "Encours", "Outstanding Amount": "Montant dû", "Item Code": "Code article", "Item Name": "Nom de l'article", Item: "Article", Warehouse: "Entrepôt", Qty: "Qté", "Valuation Rate": "Coût unitaire", "Stock Value": "Valeur du stock", Name: "Nom", Status: "Statut", Company: "Société", "From Date": "Date de début", "To Date": "Date de fin", "As of Date": "À la date", "Valid Till": "Valable jusqu'au", "Net Total": "Total net", Tax: "Taxe", "Grand Total": "Total TTC", Frequency: "Fréquence", "Notes / Terms": "Notes / Conditions", "Posting Date": "Date de comptabilisation", "Transaction Date": "Date de transaction", "Delivery Date": "Date de livraison", "% Delivered": "% livré", "% Billed": "% facturé", "Update Stock": "Mettre à jour le stock", "Payment Type": "Type de paiement", "Paid From": "Payé depuis", "Paid To": "Payé à", "Paid Amount": "Montant payé", Type: "Type", Total: "Total", Allocated: "Affecté", Unallocated: "Non affecté", Remark: "Remarque", "Total Debit": "Total débit", "Total Credit": "Total crédit", "Cost Center": "Centre de coûts", "Source Warehouse": "Entrepôt source", "Target Warehouse": "Entrepôt cible", Source: "Source", Target: "Cible", "Incoming Value": "Valeur entrante", "Outgoing Value": "Valeur sortante", Rate: "Prix unitaire", "Income Account": "Compte de produits", "Expense Account": "Compte de charges", Description: "Description", "Rate (%)": "Taux (%)", Mode: "Mode", Change: "Monnaie rendue", Currency: "Devise", Title: "Titre", Selling: "Vente", Buying: "Achat", "Discount %": "Remise %", "Discount Amt": "Montant remise", "Min Qty": "Qté min", "Valid From": "Valable à partir du", "Valid Upto": "Valable jusqu'au", Priority: "Priorité", Enabled: "Activé", "Fiscal Year": "Exercice", "Budget Amount": "Montant du budget", "If Exceeded": "Si dépassé", Month: "Mois", "Bank Account": "Compte bancaire", Deposit: "Dépôt", Withdrawal: "Retrait", "Reference No": "N° de référence", "Matched Type": "Type rapproché", "Matched Doc": "Pièce rapprochée", "Start Date": "Date de début", "End Date": "Date de fin", "Billing Interval": "Intervalle de facturation", "Current Period Start": "Début période actuelle", "Current Period End": "Fin période actuelle", "Plan Items": "Articles du plan", "Total Amount": "Montant total", "Stock Entry Type": "Type de mouvement de stock", "Rate Or Discount": "Prix ou remise", "Discount Percentage": "Pourcentage de remise", ID: "ID", "Customer Name": "Nom du client", "Customer Group": "Groupe de clients", Territory: "Territoire", "Credit Limit": "Limite de crédit", Email: "E-mail", Phone: "Téléphone", Address: "Adresse", City: "Ville", "Zip Code": "Code postal", Country: "Pays", "Tax ID": "N° de TVA", "Contact Person": "Personne de contact", "Contact Email": "E-mail du contact", "Contact Phone": "Téléphone du contact", "Supplier Name": "Nom du fournisseur", "Supplier Group": "Groupe de fournisseurs", "Item Group": "Groupe d'articles", "Stock UOM": "Unité de stock", "Standard Rate": "Prix standard", "Warehouse Name": "Nom de l'entrepôt", "Company Name": "Nom de la société" }, Li = { items: "Lignes", taxes: "Taxes", references: "Références de paiement", accounts: "Écritures de compte", payments: "Paiements", plans: "Articles du plan", monthly_distribution: "Répartition mensuelle" }, Bi = { "Create Sales Order": "Créer une commande client", "Create Sales Invoice": "Créer une facture de vente", "Create Delivery Note": "Créer un bon de livraison", "Create Purchase Invoice": "Créer une facture d'achat", "Create Purchase Receipt": "Créer un bon de réception", "Create Credit Note": "Créer un avoir", "Create Debit Note": "Créer une note de débit", "Create Return": "Créer un retour" }, Ei = { totalRevenue: "Chiffre d'affaires total", outstandingReceivable: "Créances en cours", outstandingPayable: "Dettes en cours", totalStockValue: "Valeur totale du stock", recentDocuments: "Documents récents", noRecentDocuments: "Aucun document récent" }, Oi = { title: "Chat Lambda ERP", subtitle: "Demandez-moi de créer des documents, de consulter des données ou d'exécuter des rapports.", s1: "Quels clients avons-nous ?", s2: "Affiche la balance comptable", s3: "Crée un devis pour 10 Bolt Pack M8", s4: "Liste toutes les factures impayées", loadOlder: "Charger les messages plus anciens", uploading: "Téléversement...", failed: "Échec", remove: "Supprimer", placeholderDemo: "Démo en direct en cours...", placeholderType: "Tapez un message...", placeholderConnecting: "Connexion...", attachTitle: "Joindre un fichier (PDF ou image, max 10 Mo)", creating: "Création du chat...", dropToAttach: "Déposez un fichier à joindre (images ou PDF, max 10 Mo chacun)", demoError: "Impossible de démarrer la démo", voiceStart: "Enregistrer un message vocal", voiceStop: "Arrêter l'enregistrement", voiceTranscribing: "Transcription...", micDenied: "L'accès au microphone a été refusé.", transcribeFailed: "Échec de la transcription. Veuillez réessayer." }, qi = /* @__PURE__ */ JSON.parse(`{"pageTitle":"Premiers pas avec Lambda ERP","intro":"Lambda ERP est un système ERP nativement IA, où toutes les fonctionnalités – comme créer des commandes, vérifier l'inventaire ou enregistrer des paiements – sont accessibles via une interface de chat. Il guide, raisonne et vérifie toutes vos tâches quotidiennes.","openChat":"Ouvrir le chat IA","tipLabel":"Astuce :","topTip":"Le chat IA peut aussi vous donner des liens directs vers des documents et des PDF téléchargeables. Demandez-lui simplement de créer ou de rechercher un document et il inclura des liens cliquables dans sa réponse.","manualIntro":"Si vous souhaitez comprendre pleinement le fonctionnement interne, ou préférez procéder manuellement, voici un cycle commercial complet étape par étape.","caTitle":"Analyses dynamiques – discutez pour obtenir n'importe quel graphique","caBadge":"Fonctionnalité phare","caBody":"Besoin d'un rapport que les modèles prédéfinis ne fournissent pas ? Décrivez-le simplement dans le chat. L'assistant appelle un modèle spécialiste du code qui écrit le rapport pour vous, l'exécute en direct sur vos données ERP et renvoie un lien partageable. Le graphique ou le tableau s'affiche en quelques secondes et est enregistré comme brouillon sous « Analyses personnalisées » dans la barre latérale – vous pouvez le rouvrir, partager l'URL avec vos collègues ou demander à l'assistant de l'affiner.","caTryAsking":"Essayez de demander (cliquez pour préremplir dans le chat) :","caPrompt1":"Montre-moi les 10 meilleurs clients par chiffre d'affaires cette année en diagramme à barres","caPrompt2":"Tendance mensuelle des achats par fournisseur sur tous les mois, étiquette l'axe des x avec le nom du fournisseur","caPrompt3":"Articles les plus vendus par quantité, avec un tableau et un graphique","caPrompt4":"Quels clients me doivent le plus en ce moment ?","caTryInChat":"Essayer dans le chat","caOpenWorkspace":"Ouvrir l'espace d'analyse","flowTitle":"Aperçu du flux des documents","salesCycle":"Cycle de vente","purchaseCycle":"Cycle d'achat","returns":"Retours","flowShortcut":"Raccourci : le devis peut ignorer la commande client et aller directement à la facture de vente ou au bon de livraison","legendStock":"impact stock","legendGl":"impact comptable","legendCash":"impact trésorerie","legendReversal":"annulation","lifecycleTitle":"Cycle de vie du document","lcDraftLabel":"Brouillon :","lcDraftDesc":"Modifiable. Aucun impact financier ni sur le stock.","lcSubmittedLabel":"Validé :","lcSubmittedDesc":"Verrouillé. Les écritures comptables et de stock sont générées.","lcCancelledLabel":"Annulé :","lcCancelledDesc":"Toutes les écritures sont inversées. Le document est archivé définitivement.","lcNoDelete":"Il n'y a pas de suppression. Pour annuler un brouillon : validez-le, puis annulez-le.","lcCorrect":"Pour corriger un document validé : annulez-le et créez-en un nouveau.","readyTitle":"Vous êtes prêt","readyBody1":"Vous comprenez maintenant le cycle complet. Un scénario réel typique ressemble à ceci : vous recevez une commande client (Devis → Commande client), vérifiez le stock, achetez ce dont vous avez besoin (Bon de commande → Bon de réception → Facture d'achat → Paiement), livrez au client (Bon de livraison), facturez-le (Facture de vente) et encaissez le paiement (Paiement). Si quelque chose revient, créez un avoir et un retour de bon de livraison pour inverser les finances et le stock. La Balance comptable confirme que tout est équilibré.","readyBody2":"Vous pouvez aussi tout faire via le chat IA en conversation naturelle – décrivez simplement ce dont vous avez besoin et il créera les bons documents pour vous.","chips":{"Quotation":"Devis","Sales Order":"Commande client","Delivery Note":"Bon de livraison","Sales Invoice":"Facture de vente","Payment Entry":"Paiement","Purchase Order":"Bon de commande","Purchase Receipt":"Bon de réception","Purchase Invoice":"Facture d'achat","Credit Note":"Avoir","DN Return":"Retour BL","Debit Note":"Note de débit","Draft":"Brouillon","Submitted":"Validé","Cancelled":"Annulé"},"links":{"Go to Setup":"Aller à la configuration","Customers":"Clients","Suppliers":"Fournisseurs","Items":"Articles","Warehouses":"Entrepôts","New Quotation":"Nouveau devis","View Quotations":"Voir les devis","Stock Balance":"Solde de stock","New Purchase Order":"Nouveau bon de commande","Purchase Receipts":"Bons de réception","Purchase Invoices":"Factures d'achat","Delivery Notes":"Bons de livraison","Sales Invoices":"Factures de vente","New Payment Entry":"Nouveau paiement","New Stock Entry":"Nouveau mouvement de stock","New Journal Entry":"Nouvelle écriture de journal","Profit & Loss":"Compte de résultat","Balance Sheet":"Bilan","AR Aging":"Balance âgée clients","AP Aging":"Balance âgée fournisseurs","Trial Balance":"Balance comptable","General Ledger":"Grand livre","Open AI Chat":"Ouvrir le chat IA"},"steps":{"1":{"title":"Configurer votre société","description":"Créez une société avec une devise de base. Cela génère votre plan comptable (30 comptes standard répartis entre Actif, Passif, Capitaux propres, Produits et Charges) ainsi qu'un centre de coûts par défaut. Vous pouvez aussi charger des données de démonstration avec des clients, fournisseurs et articles d'exemple pour démarrer rapidement."},"2":{"title":"Créer les données de base","description":"Avant de pouvoir effectuer des transactions, vous avez besoin de fiches de base. Créez au moins un client, un fournisseur, un article (avec un prix standard) et un entrepôt. Si vous avez chargé les données de démonstration à l'étape 1, elles existent déjà.","tip":"Les articles ont un prix standard qui se remplit automatiquement lorsque vous les ajoutez à des documents. Vous pouvez toujours modifier le prix par transaction."},"3":{"title":"Créer un devis","description":"Un devis est une offre non contraignante adressée à un client. Sélectionnez un client, ajoutez des lignes avec quantités et prix, éventuellement des lignes de taxe, puis enregistrez. Les devis n'ont aucun impact financier – ils ne créent ni écritures comptables ni mouvements de stock. Définissez une date de validité pour que l'offre expire automatiquement."},"4":{"title":"Valider et convertir en commande client","description":"Ouvrez votre devis enregistré et cliquez sur Valider pour le confirmer. Cliquez ensuite sur « Créer une commande client » pour le convertir. La commande client représente un engagement confirmé du client. Elle n'a toujours aucun impact financier, mais réserve du stock à des fins de planification.","tip":"Seuls les documents validés peuvent être convertis à l'étape suivante. Brouillon → Valider → Convertir est le flux standard. Pour les affaires rapides, vous pouvez ignorer la commande client et passer directement du devis à la facture de vente ou au bon de livraison."},"5":{"title":"Vérifier le stock avant l'exécution","description":"Avant de pouvoir livrer, vérifiez si vous avez réellement l'article en stock. Ouvrez le rapport Solde de stock et recherchez l'article. Si votre entrepôt affiche une quantité nulle, vous devrez d'abord approvisionner le stock – soit par un bon de commande (achat auprès d'un fournisseur), soit par un mouvement de stock (réception manuelle).","tip":"C'est un scénario courant dans la pratique : vous vendez quelque chose, puis réalisez que vous devez d'abord l'acheter. L'ERP gère les deux flux."},"6":{"title":"Cycle d'achat : acheter du stock à un fournisseur","description":"Si vous devez acheter du stock, vous avez deux chemins valides. Le chemin standard est Bon de commande → Bon de réception → Facture d'achat : utilisez-le lorsque les marchandises arrivent avant ou séparément de la facture du fournisseur. Si la facture et la réception arrivent ensemble, vous pouvez créer directement la facture d'achat et activer « Mettre à jour le stock » afin que le même document réceptionne le stock et enregistre la dette fournisseur.","tip":"Utilisez d'abord le bon de réception lorsque vous recevez les marchandises séparément. Utilisez la facture d'achat avec « Mettre à jour le stock » lorsqu'une seule étape doit à la fois réceptionner le stock et comptabiliser la facture fournisseur. Dans ce chemin direct, indiquez un entrepôt sur chaque ligne d'article en stock."},"7":{"title":"Créer un bon de livraison","description":"Maintenant que vous avez du stock, revenez à votre commande client validée et cliquez sur « Créer un bon de livraison ». Indiquez l'entrepôt sur chaque ligne d'article (d'où partent les marchandises), puis validez. Cela sort le stock de l'entrepôt – votre solde de stock diminue.","tip":"Le bon de livraison est le document d'expédition. Il réduit le stock mais ne crée pas de facture. Vous pouvez livrer et facturer séparément."},"8":{"title":"Créer et valider la facture de vente","description":"À partir de la commande client validée, créez une facture de vente. Lorsque vous validez la facture, des écritures comptables sont générées : les Clients (créances) sont débités (le client vous doit de l'argent) et les Produits des ventes crédités (revenu acquis). Si des taxes sont configurées, la TVA collectée est également créditée. Le montant dû indique ce que le client doit encore."},"9":{"title":"Enregistrer les paiements clients","description":"Créez un paiement pour enregistrer l'argent reçu du client. Définissez le type de paiement sur « Receive » (Recevoir), sélectionnez le client, indiquez le montant et affectez-le à la facture de vente. Vous pouvez effectuer des paiements partiels – le montant dû de la facture se met à jour en conséquence. Créez des paiements supplémentaires jusqu'à ce que la facture soit entièrement réglée.","tip":"Les paiements partiels sont courants. Une facture de 10 000 peut être payée 3 000 maintenant et 7 000 plus tard. Chaque paiement réduit le montant dû."},"10":{"title":"Mouvements de stock (inventaire manuel)","description":"Utilisez les mouvements de stock pour les mouvements d'inventaire non liés aux achats ou aux ventes. « Material Receipt » ajoute du stock (soldes d'ouverture, ajustements). « Material Issue » sort du stock (pertes, consommation interne). « Material Transfer » déplace du stock entre entrepôts. Chaque mouvement met à jour le livre de stock avec une valorisation au coût moyen pondéré.","tip":"Pour les marchandises achetées, utilisez des bons de réception plutôt que des mouvements de stock – ils sont liés au bon de commande et offrent une piste d'audit appropriée."},"11":{"title":"Écritures de journal","description":"Les écritures de journal sont des ajustements comptables manuels – charges à payer, corrections, reclassements, soldes d'ouverture. Chaque écriture doit avoir des débits et crédits équilibrés (total débit = total crédit). Utilisez-les lorsqu'aucun autre type de document ne convient."},"12":{"title":"Paiements des salaires","description":"Lambda ERP gère les salaires à l'aide des outils comptables existants. Comptabilisez d'abord la charge salariale : créez une écriture de journal qui débite la Charge salariale et crédite les Salaires à payer pour le montant total de la paie. Payez ensuite les employés : créez une autre écriture de journal (ou un paiement) qui débite les Salaires à payer et crédite votre compte bancaire. Ce processus en deux étapes garde vos comptes exacts – la charge est enregistrée dans la bonne période et la sortie de trésorerie est suivie séparément.","tip":"Vous pouvez demander à l'assistant IA de le faire pour vous : « Comptabilise 15 000 de salaires pour avril » suivi de « Paie les salaires d'avril depuis la banque ». Il créera automatiquement les bonnes écritures de journal."},"13":{"title":"Retours et avoirs","description":"Lorsqu'un client retourne des marchandises ou que vous devez émettre un avoir, créez un retour. Les retours utilisent le même type de document avec des quantités négatives. Ouvrez une facture de vente validée et créez un avoir (retour de facture de vente) – cela inverse les écritures comptables et réduit le montant dû de la facture d'origine. Pour le stock, créez un retour de bon de livraison pour réintégrer les marchandises en entrepôt. Côté achats, créez une note de débit (retour de facture d'achat) pour inverser une facture fournisseur, ou un retour de bon de réception pour renvoyer des marchandises.","tip":"Un avoir est simplement une facture de vente avec is_return=1 et des quantités négatives. La même logique comptable s'applique – les montants négatifs basculent automatiquement du bon côté débit/crédit. Pour un retour de vente complet, vous avez besoin à la fois d'un avoir (financier) et d'un retour de bon de livraison (stock)."},"14":{"title":"Exécuter les rapports","description":"Vérifiez vos comptes. Le Compte de résultat montre les produits face aux charges et le résultat net d'une période. Le Bilan montre votre situation financière (actif = passif + capitaux propres). La Balance âgée clients montre qui vous doit de l'argent et le retard. La Balance âgée fournisseurs montre ce que vous devez aux fournisseurs. La Balance comptable vérifie l'intégrité de la partie double. Le Grand livre montre chaque écriture individuelle. Le Solde de stock montre l'inventaire actuel."},"15":{"title":"Travailler en devises étrangères","description":"Vos comptes sont tenus dans une seule devise de base (choisie à la configuration de la société), mais vous pouvez effectuer des transactions dans n'importe quelle devise. Définissez une devise sur une facture ou un effet – ou attribuez une devise par défaut à un client ou un fournisseur – et le taux de change de cette date est recherché automatiquement et enregistré sur le document. Le document conserve ses montants dans sa propre devise, tandis que le Grand livre comptabilise toujours dans votre devise de base. Lorsque vous encaissez ou payez ultérieurement à un taux différent, le gain ou la perte de change réalisé est comptabilisé automatiquement sur un compte Gain/Perte de change. Vous pouvez même détenir un solde bancaire en devise étrangère et le convertir plus tard au taux de votre banque – l'écart par rapport à sa valeur comptable est alors réalisé. En fin de mois, vous pouvez réévaluer les soldes en devises ouverts au taux de clôture (un gain/perte latent qui s'inverse à la période suivante), et vous pouvez consulter n'importe quel état financier converti dans une autre devise pour l'affichage.","tip":"Le plus simple est de passer par le chat IA – essayez « Crée une facture de vente pour Lumiere Audio en EUR », « Montre-moi le bilan en EUR » ou « Quelle est notre exposition de change latente en fin de mois ? ». Les données de démonstration incluent déjà un client EUR (Lumiere Audio SARL) dont la facture a été encaissée à un taux différent, ainsi qu'une facture fournisseur EUR ouverte – ouvrez le Grand livre pour voir les écritures de change réalisées."}}}`), Fi = { title: "Aide au formatage", intro: "Le texte des Notes / Conditions prend en charge une mise en forme légère sur le PDF :", heading: "titre en gras", emphasis: "italique / gras", price: "prix aligné à droite à côté du texte ci-dessus (p. ex. Mensuel | CHF 380.—)", block: "Séparez les blocs par une ligne vide." }, Mi = {
6676
+ common: vi,
6677
+ language: Ni,
6678
+ header: wi,
6679
+ titles: ki,
6680
+ doctypes: Si,
6681
+ masters: Ci,
6682
+ nav: Di,
6683
+ login: _i,
6684
+ settings: Pi,
6685
+ status: Ti,
6686
+ reports: Ai,
6687
+ masterForm: Ri,
6688
+ fields: Ii,
6689
+ tables: Li,
6690
+ conversions: Bi,
6691
+ dashboard: Ei,
6692
+ chat: Oi,
6693
+ tutorial: qi,
6694
+ notesMarkup: Fi
6686
6695
  }, ca = [
6687
6696
  { code: "en", label: "English" },
6688
6697
  { code: "de", label: "Deutsch" },
6689
6698
  { code: "fr", label: "Français" }
6690
6699
  ], da = "lambda-erp:language";
6691
- function Mi(t) {
6700
+ function zi(t) {
6692
6701
  return !!t && ca.some((n) => n.code === t);
6693
6702
  }
6694
- function zi() {
6703
+ function $i() {
6695
6704
  try {
6696
6705
  const t = localStorage.getItem(da);
6697
- if (Mi(t)) return t;
6706
+ if (zi(t)) return t;
6698
6707
  } catch {
6699
6708
  }
6700
6709
  return "en";
6701
6710
  }
6702
- function $i(t) {
6711
+ function Ui(t) {
6703
6712
  try {
6704
6713
  localStorage.setItem(da, t);
6705
6714
  } catch {
@@ -6707,11 +6716,11 @@ function $i(t) {
6707
6716
  }
6708
6717
  Jn.use(Ca).init({
6709
6718
  resources: {
6710
- en: { translation: Zs },
6711
- de: { translation: bi },
6712
- fr: { translation: Fi }
6719
+ en: { translation: Xs },
6720
+ de: { translation: xi },
6721
+ fr: { translation: Mi }
6713
6722
  },
6714
- lng: zi(),
6723
+ lng: $i(),
6715
6724
  fallbackLng: "en",
6716
6725
  // any key missing in de/fr falls back to the English value
6717
6726
  interpolation: { escapeValue: !1 },
@@ -6719,8 +6728,8 @@ Jn.use(Ca).init({
6719
6728
  react: { useSuspense: !1 }
6720
6729
  // resources are bundled synchronously — no Suspense needed
6721
6730
  });
6722
- Jn.on("languageChanged", $i);
6723
- function Ui({ label: t }) {
6731
+ Jn.on("languageChanged", Ui);
6732
+ function Vi({ label: t }) {
6724
6733
  var o;
6725
6734
  const { t: n, i18n: a } = ae(), s = ((o = a.language) == null ? void 0 : o.split("-")[0]) ?? "en";
6726
6735
  return /* @__PURE__ */ e(
@@ -6744,7 +6753,7 @@ const Fn = [
6744
6753
  function je(t) {
6745
6754
  return t === 0 ? "$0.00" : t < 0.01 ? `$${t.toFixed(4)}` : `$${t.toFixed(2)}`;
6746
6755
  }
6747
- function Vi({ demoActive: t }) {
6756
+ function ji({ demoActive: t }) {
6748
6757
  var D, T;
6749
6758
  const { t: n } = ae(), [a, s] = v("1h"), { data: o, isLoading: i, isFetching: c, error: l, refetch: g, dataUpdatedAt: d } = le({
6750
6759
  queryKey: ["demo-spend"],
@@ -6928,7 +6937,7 @@ function St({ label: t, value: n }) {
6928
6937
  /* @__PURE__ */ e("div", { className: "mt-0.5 text-sm font-semibold tabular-nums text-gray-900", children: n })
6929
6938
  ] });
6930
6939
  }
6931
- function ji() {
6940
+ function Gi() {
6932
6941
  const { t } = ae(), { user: n } = bt(), [a, s] = v(""), [o, i] = v(""), [c, l] = v(""), [g, d] = v(""), [p, m] = v(!1), f = oe({
6933
6942
  mutationFn: () => L.authChangePassword(a, o),
6934
6943
  onSuccess: () => {
@@ -7005,7 +7014,7 @@ function ji() {
7005
7014
  /* @__PURE__ */ e(J, { type: "submit", disabled: f.isPending || !a || !o || !c, children: f.isPending ? t("settings.changingPassword") : t("settings.changePassword") })
7006
7015
  ] }) });
7007
7016
  }
7008
- function Gi() {
7017
+ function Ki() {
7009
7018
  const { user: t } = bt(), { t: n } = ae(), a = We(), s = (t == null ? void 0 : t.role) === "admin", { data: o, isLoading: i } = le({
7010
7019
  queryKey: ["settings"],
7011
7020
  queryFn: () => L.getSettings()
@@ -7026,10 +7035,10 @@ function Gi() {
7026
7035
  });
7027
7036
  return i ? /* @__PURE__ */ e("p", { className: "text-gray-500", children: n("common.loading") }) : /* @__PURE__ */ r("div", { className: "space-y-6", children: [
7028
7037
  /* @__PURE__ */ r(U, { title: n("language.title"), children: [
7029
- /* @__PURE__ */ e("div", { className: "flex flex-wrap items-end gap-4", children: /* @__PURE__ */ e("div", { className: "w-64", children: /* @__PURE__ */ e(Ui, {}) }) }),
7038
+ /* @__PURE__ */ e("div", { className: "flex flex-wrap items-end gap-4", children: /* @__PURE__ */ e("div", { className: "w-64", children: /* @__PURE__ */ e(Vi, {}) }) }),
7030
7039
  /* @__PURE__ */ e("p", { className: "mt-2 text-xs text-gray-400", children: n("language.help") })
7031
7040
  ] }),
7032
- (t == null ? void 0 : t.role) !== "public_manager" && /* @__PURE__ */ e(ji, {}),
7041
+ (t == null ? void 0 : t.role) !== "public_manager" && /* @__PURE__ */ e(Gi, {}),
7033
7042
  /* @__PURE__ */ r(U, { title: n("settings.pdfTitle"), children: [
7034
7043
  /* @__PURE__ */ e("div", { className: "flex flex-wrap items-end gap-4", children: s ? /* @__PURE__ */ e(
7035
7044
  rt,
@@ -7077,7 +7086,7 @@ function Gi() {
7077
7086
  }
7078
7087
  )
7079
7088
  ] }) }),
7080
- s && /* @__PURE__ */ e(Vi, { demoActive: !!(l != null && l.active) }),
7089
+ s && /* @__PURE__ */ e(ji, { demoActive: !!(l != null && l.active) }),
7081
7090
  s && /* @__PURE__ */ e(U, { title: n("settings.publicTitle"), children: l != null && l.active ? /* @__PURE__ */ r("div", { children: [
7082
7091
  /* @__PURE__ */ r("div", { className: "flex items-center gap-2", children: [
7083
7092
  /* @__PURE__ */ e("span", { className: "inline-block h-2 w-2 rounded-full bg-green-500" }),
@@ -7129,24 +7138,24 @@ function Gi() {
7129
7138
  ] });
7130
7139
  }
7131
7140
  const ua = {};
7132
- function yo(t, n) {
7141
+ function fo(t, n) {
7133
7142
  ua[t] = n;
7134
7143
  }
7135
- function Ki(t, n) {
7144
+ function Wi(t, n) {
7136
7145
  return ua[t] ?? n;
7137
7146
  }
7138
- function Wi() {
7139
- const t = Ki("Dashboard", hr);
7147
+ function Hi() {
7148
+ const t = Wi("Dashboard", hr);
7140
7149
  return /* @__PURE__ */ e(t, {});
7141
7150
  }
7142
- const Hi = [
7143
- { path: "/login", element: /* @__PURE__ */ e(Ts, {}) },
7144
- { path: "/demo", element: /* @__PURE__ */ e(As, {}) }
7145
- ], Qi = [
7146
- { index: !0, element: /* @__PURE__ */ e(Wi, {}) },
7147
- { path: "setup", element: /* @__PURE__ */ e(ps, {}) },
7148
- { path: "setup/opening-balances", element: /* @__PURE__ */ e(Rs, {}) },
7149
- { path: "tutorial", element: /* @__PURE__ */ e(xs, {}) },
7151
+ const Qi = [
7152
+ { path: "/login", element: /* @__PURE__ */ e(As, {}) },
7153
+ { path: "/demo", element: /* @__PURE__ */ e(Rs, {}) }
7154
+ ], Ji = [
7155
+ { index: !0, element: /* @__PURE__ */ e(Hi, {}) },
7156
+ { path: "setup", element: /* @__PURE__ */ e(hs, {}) },
7157
+ { path: "setup/opening-balances", element: /* @__PURE__ */ e(Is, {}) },
7158
+ { path: "tutorial", element: /* @__PURE__ */ e(vs, {}) },
7150
7159
  { path: "chat", element: /* @__PURE__ */ e(Bn, {}) },
7151
7160
  { path: "chat/:sessionId", element: /* @__PURE__ */ e(Bn, {}) },
7152
7161
  // Proposal (Sammelofferte) — a custom builder; the list reuses the generic
@@ -7155,27 +7164,27 @@ const Hi = [
7155
7164
  { path: "app/proposal/new", element: /* @__PURE__ */ e(Dn, {}) },
7156
7165
  { path: "app/proposal/:name", element: /* @__PURE__ */ e(Dn, {}) },
7157
7166
  // Documents
7158
- { path: "app/:doctype", element: /* @__PURE__ */ e(Lr, {}) },
7167
+ { path: "app/:doctype", element: /* @__PURE__ */ e(Br, {}) },
7159
7168
  { path: "app/:doctype/new", element: /* @__PURE__ */ e(wn, {}) },
7160
7169
  { path: "app/:doctype/:name", element: /* @__PURE__ */ e(wn, {}) },
7161
7170
  // Masters (reuse same routes - the components detect whether it's a doctype or master)
7162
- { path: "masters/:type", element: /* @__PURE__ */ e(Or, {}) },
7171
+ { path: "masters/:type", element: /* @__PURE__ */ e(qr, {}) },
7163
7172
  { path: "masters/:type/new", element: /* @__PURE__ */ e(Pn, {}) },
7164
7173
  { path: "masters/:type/:name", element: /* @__PURE__ */ e(Pn, {}) },
7165
7174
  // Reports
7166
- { path: "reports/trial-balance", element: /* @__PURE__ */ e(Kr, {}) },
7167
- { path: "reports/general-ledger", element: /* @__PURE__ */ e(Qr, {}) },
7168
- { path: "reports/stock-balance", element: /* @__PURE__ */ e(Jr, {}) },
7169
- { path: "reports/profit-and-loss", element: /* @__PURE__ */ e(Yr, {}) },
7170
- { path: "reports/balance-sheet", element: /* @__PURE__ */ e(Zr, {}) },
7171
- { path: "reports/ar-aging", element: /* @__PURE__ */ e(Xr, {}) },
7172
- { path: "reports/ap-aging", element: /* @__PURE__ */ e(es, {}) },
7173
- { path: "reports/analytics", element: /* @__PURE__ */ e(as, {}) },
7175
+ { path: "reports/trial-balance", element: /* @__PURE__ */ e(Wr, {}) },
7176
+ { path: "reports/general-ledger", element: /* @__PURE__ */ e(Jr, {}) },
7177
+ { path: "reports/stock-balance", element: /* @__PURE__ */ e(Yr, {}) },
7178
+ { path: "reports/profit-and-loss", element: /* @__PURE__ */ e(Zr, {}) },
7179
+ { path: "reports/balance-sheet", element: /* @__PURE__ */ e(Xr, {}) },
7180
+ { path: "reports/ar-aging", element: /* @__PURE__ */ e(es, {}) },
7181
+ { path: "reports/ap-aging", element: /* @__PURE__ */ e(ts, {}) },
7182
+ { path: "reports/analytics", element: /* @__PURE__ */ e(rs, {}) },
7174
7183
  // Admin
7175
- { path: "admin/users", element: /* @__PURE__ */ e(Is, {}) },
7176
- { path: "admin/settings", element: /* @__PURE__ */ e(Gi, {}) }
7184
+ { path: "admin/users", element: /* @__PURE__ */ e(Ls, {}) },
7185
+ { path: "admin/settings", element: /* @__PURE__ */ e(Ki, {}) }
7177
7186
  ], ma = [], pa = [];
7178
- function fo(t, n) {
7187
+ function bo(t, n) {
7179
7188
  (n == null ? void 0 : n.area) === "top" ? ma.push(t) : pa.push(t);
7180
7189
  }
7181
7190
  const Mn = (t) => t.index ? "__index__" : t.path ?? "";
@@ -7187,28 +7196,28 @@ function zn(t, n) {
7187
7196
  }
7188
7197
  return a;
7189
7198
  }
7190
- function Ji() {
7199
+ function Yi() {
7191
7200
  return [
7192
- ...zn(Hi, ma),
7201
+ ...zn(Qi, ma),
7193
7202
  {
7194
7203
  path: "/",
7195
7204
  element: /* @__PURE__ */ e(lr, { children: /* @__PURE__ */ e(ir, {}) }),
7196
- children: zn(Qi, pa)
7205
+ children: zn(Ji, pa)
7197
7206
  }
7198
7207
  ];
7199
7208
  }
7200
- function Yi() {
7209
+ function Zi() {
7201
7210
  return new va({
7202
7211
  defaultOptions: {
7203
7212
  queries: { retry: 1, refetchOnWindowFocus: !1 }
7204
7213
  }
7205
7214
  });
7206
7215
  }
7207
- function bo(t = {}) {
7216
+ function xo(t = {}) {
7208
7217
  const n = t.rootElement ?? document.getElementById("root");
7209
7218
  if (!n)
7210
7219
  throw new Error('bootstrap: no mount element (pass rootElement or add <div id="root">)');
7211
- const a = t.queryClient ?? Yi(), s = ka(Ji());
7220
+ const a = t.queryClient ?? Zi(), s = ka(Yi());
7212
7221
  ba(n).render(
7213
7222
  /* @__PURE__ */ e(fa, { children: /* @__PURE__ */ e(xa, { client: a, children: /* @__PURE__ */ e(Ha, { children: /* @__PURE__ */ e(Sa, { router: s }) }) }) })
7214
7223
  );
@@ -7219,23 +7228,23 @@ export {
7219
7228
  Ha as AuthProvider,
7220
7229
  ca as SUPPORTED_LANGUAGES,
7221
7230
  L as api,
7222
- bo as bootstrap,
7223
- Ji as buildRoutes,
7224
- co as configureApiBase,
7225
- po as configureBranding,
7226
- Yi as createAppQueryClient,
7227
- go as getAllDoctypeConfigs,
7231
+ xo as bootstrap,
7232
+ Yi as buildRoutes,
7233
+ uo as configureApiBase,
7234
+ ho as configureBranding,
7235
+ Zi as createAppQueryClient,
7236
+ yo as getAllDoctypeConfigs,
7228
7237
  Xa as getBranding,
7229
- Ki as getComponent,
7238
+ Wi as getComponent,
7230
7239
  aa as getDoctypeConfig,
7231
7240
  Za as getNavGroups,
7232
- zi as getStoredLanguage,
7233
- No as i18n,
7234
- yo as registerComponent,
7235
- ho as registerDoctype,
7236
- uo as registerNavGroup,
7237
- mo as registerNavItem,
7238
- fo as registerRoute,
7241
+ $i as getStoredLanguage,
7242
+ wo as i18n,
7243
+ fo as registerComponent,
7244
+ go as registerDoctype,
7245
+ mo as registerNavGroup,
7246
+ po as registerNavItem,
7247
+ bo as registerRoute,
7239
7248
  O as request,
7240
7249
  bt as useAuth
7241
7250
  };