@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/i18n/locales/de.json.d.ts +1 -0
- package/dist/i18n/locales/en.json.d.ts +1 -0
- package/dist/i18n/locales/fr.json.d.ts +1 -0
- package/dist/index.js +283 -274
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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
|
|
12
|
+
import { default as wo } from "i18next";
|
|
13
13
|
let yt = "/api";
|
|
14
|
-
function
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
],
|
|
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
|
-
},
|
|
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
|
-
|
|
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:
|
|
1585
|
-
{ key: "taxes", label: "Taxes", fields:
|
|
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
|
-
|
|
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:
|
|
1633
|
-
{ key: "taxes", label: "Taxes", fields:
|
|
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
|
-
|
|
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: [...
|
|
1664
|
-
{ key: "taxes", label: "Taxes", fields:
|
|
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
|
-
|
|
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: [...
|
|
1691
|
-
{ key: "taxes", label: "Taxes", fields:
|
|
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
|
-
|
|
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
|
-
...
|
|
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:
|
|
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
|
-
|
|
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
|
-
...
|
|
1944
|
+
...at,
|
|
1936
1945
|
{ name: "warehouse", label: "Warehouse", type: "link", linkDoctype: "warehouse", required: !0 }
|
|
1937
1946
|
]
|
|
1938
1947
|
},
|
|
1939
|
-
{ key: "taxes", label: "Taxes", fields:
|
|
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
|
-
|
|
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
|
-
...
|
|
1979
|
+
...at,
|
|
1971
1980
|
{ name: "warehouse", label: "Warehouse", type: "link", linkDoctype: "warehouse", required: !0 }
|
|
1972
1981
|
]
|
|
1973
1982
|
},
|
|
1974
|
-
{ key: "taxes", label: "Taxes", fields:
|
|
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
|
-
|
|
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
|
-
...
|
|
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:
|
|
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
|
|
2183
|
+
function go(t) {
|
|
2175
2184
|
on[t.slug] = t;
|
|
2176
2185
|
}
|
|
2177
|
-
function
|
|
2186
|
+
function yo() {
|
|
2178
2187
|
return Object.values(on);
|
|
2179
2188
|
}
|
|
2180
|
-
const
|
|
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
|
-
},
|
|
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
|
-
|
|
2217
|
-
|
|
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
|
|
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 } =
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 :
|
|
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(
|
|
2404
|
+
n && /* @__PURE__ */ e(vr, { text: n }),
|
|
2396
2405
|
a
|
|
2397
2406
|
] });
|
|
2398
2407
|
}
|
|
2399
|
-
function
|
|
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 =
|
|
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
|
-
|
|
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(
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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(
|
|
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:
|
|
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
|
|
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
|
-
]),
|
|
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
|
|
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
|
|
3025
|
-
function
|
|
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 (
|
|
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 =
|
|
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
|
|
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:
|
|
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:
|
|
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
|
-
}),
|
|
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:
|
|
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
|
|
3522
|
-
function
|
|
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:
|
|
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
|
|
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
|
-
},
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 } =
|
|
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
|
|
3973
|
+
function Hr(t) {
|
|
3965
3974
|
return t.toLowerCase().replace(/\s+/g, "-");
|
|
3966
3975
|
}
|
|
3967
|
-
const
|
|
3968
|
-
function
|
|
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 } =
|
|
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/${
|
|
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:
|
|
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
|
|
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 } =
|
|
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
|
|
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 } =
|
|
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
|
|
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 } =
|
|
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
|
|
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 } =
|
|
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
|
|
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 } =
|
|
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
|
|
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
|
|
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 =
|
|
4502
|
-
function
|
|
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(
|
|
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
|
|
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(() =>
|
|
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(
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
4732
|
-
const n = `${
|
|
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
|
|
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"],
|
|
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
|
|
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
|
|
4931
|
+
function ms(t) {
|
|
4923
4932
|
if (!t.length) return { angle: 0, axisHeight: 30, maxWidth: 0 };
|
|
4924
|
-
const n = t.map((l) =>
|
|
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
|
|
4931
|
-
function
|
|
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(
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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,
|
|
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
|
|
5553
|
+
function ks(t) {
|
|
5545
5554
|
return new Promise((n) => window.setTimeout(n, t));
|
|
5546
5555
|
}
|
|
5547
|
-
function
|
|
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
|
|
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 (!
|
|
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 >
|
|
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
|
|
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(
|
|
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
|
|
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
|
|
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(
|
|
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(
|
|
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
|
|
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
|
|
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
|
-
) :
|
|
6152
|
+
) : Ts(a, `${s}`);
|
|
6144
6153
|
});
|
|
6145
6154
|
}
|
|
6146
|
-
function
|
|
6155
|
+
function Ts(t, n) {
|
|
6147
6156
|
const a = [];
|
|
6148
6157
|
let s = 0, o;
|
|
6149
|
-
const i = new RegExp(
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
6628
|
-
language:
|
|
6629
|
-
header:
|
|
6630
|
-
titles:
|
|
6631
|
-
doctypes:
|
|
6632
|
-
masters:
|
|
6633
|
-
nav:
|
|
6634
|
-
login:
|
|
6635
|
-
settings:
|
|
6636
|
-
status:
|
|
6637
|
-
reports:
|
|
6638
|
-
masterForm:
|
|
6639
|
-
dashboard:
|
|
6640
|
-
chat:
|
|
6641
|
-
conversions:
|
|
6642
|
-
fields:
|
|
6643
|
-
tables:
|
|
6644
|
-
tutorial:
|
|
6645
|
-
notesMarkup:
|
|
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:
|
|
6648
|
-
language:
|
|
6649
|
-
header:
|
|
6650
|
-
titles:
|
|
6651
|
-
doctypes:
|
|
6652
|
-
masters:
|
|
6653
|
-
nav:
|
|
6654
|
-
login:
|
|
6655
|
-
settings:
|
|
6656
|
-
status:
|
|
6657
|
-
reports:
|
|
6658
|
-
masterForm:
|
|
6659
|
-
fields:
|
|
6660
|
-
tables:
|
|
6661
|
-
conversions:
|
|
6662
|
-
dashboard:
|
|
6663
|
-
chat:
|
|
6664
|
-
tutorial:
|
|
6665
|
-
notesMarkup:
|
|
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:
|
|
6668
|
-
language:
|
|
6669
|
-
header:
|
|
6670
|
-
titles:
|
|
6671
|
-
doctypes:
|
|
6672
|
-
masters:
|
|
6673
|
-
nav:
|
|
6674
|
-
login:
|
|
6675
|
-
settings:
|
|
6676
|
-
status:
|
|
6677
|
-
reports:
|
|
6678
|
-
masterForm:
|
|
6679
|
-
fields:
|
|
6680
|
-
tables:
|
|
6681
|
-
conversions:
|
|
6682
|
-
dashboard:
|
|
6683
|
-
chat:
|
|
6684
|
-
tutorial:
|
|
6685
|
-
notesMarkup:
|
|
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
|
|
6700
|
+
function zi(t) {
|
|
6692
6701
|
return !!t && ca.some((n) => n.code === t);
|
|
6693
6702
|
}
|
|
6694
|
-
function
|
|
6703
|
+
function $i() {
|
|
6695
6704
|
try {
|
|
6696
6705
|
const t = localStorage.getItem(da);
|
|
6697
|
-
if (
|
|
6706
|
+
if (zi(t)) return t;
|
|
6698
6707
|
} catch {
|
|
6699
6708
|
}
|
|
6700
6709
|
return "en";
|
|
6701
6710
|
}
|
|
6702
|
-
function
|
|
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:
|
|
6711
|
-
de: { translation:
|
|
6712
|
-
fr: { translation:
|
|
6719
|
+
en: { translation: Xs },
|
|
6720
|
+
de: { translation: xi },
|
|
6721
|
+
fr: { translation: Mi }
|
|
6713
6722
|
},
|
|
6714
|
-
lng:
|
|
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",
|
|
6723
|
-
function
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
7141
|
+
function fo(t, n) {
|
|
7133
7142
|
ua[t] = n;
|
|
7134
7143
|
}
|
|
7135
|
-
function
|
|
7144
|
+
function Wi(t, n) {
|
|
7136
7145
|
return ua[t] ?? n;
|
|
7137
7146
|
}
|
|
7138
|
-
function
|
|
7139
|
-
const t =
|
|
7147
|
+
function Hi() {
|
|
7148
|
+
const t = Wi("Dashboard", hr);
|
|
7140
7149
|
return /* @__PURE__ */ e(t, {});
|
|
7141
7150
|
}
|
|
7142
|
-
const
|
|
7143
|
-
{ path: "/login", element: /* @__PURE__ */ e(
|
|
7144
|
-
{ path: "/demo", element: /* @__PURE__ */ e(
|
|
7145
|
-
],
|
|
7146
|
-
{ index: !0, element: /* @__PURE__ */ e(
|
|
7147
|
-
{ path: "setup", element: /* @__PURE__ */ e(
|
|
7148
|
-
{ path: "setup/opening-balances", element: /* @__PURE__ */ e(
|
|
7149
|
-
{ path: "tutorial", element: /* @__PURE__ */ e(
|
|
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(
|
|
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(
|
|
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(
|
|
7167
|
-
{ path: "reports/general-ledger", element: /* @__PURE__ */ e(
|
|
7168
|
-
{ path: "reports/stock-balance", element: /* @__PURE__ */ e(
|
|
7169
|
-
{ path: "reports/profit-and-loss", element: /* @__PURE__ */ e(
|
|
7170
|
-
{ path: "reports/balance-sheet", element: /* @__PURE__ */ e(
|
|
7171
|
-
{ path: "reports/ar-aging", element: /* @__PURE__ */ e(
|
|
7172
|
-
{ path: "reports/ap-aging", element: /* @__PURE__ */ e(
|
|
7173
|
-
{ path: "reports/analytics", element: /* @__PURE__ */ e(
|
|
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(
|
|
7176
|
-
{ path: "admin/settings", element: /* @__PURE__ */ e(
|
|
7184
|
+
{ path: "admin/users", element: /* @__PURE__ */ e(Ls, {}) },
|
|
7185
|
+
{ path: "admin/settings", element: /* @__PURE__ */ e(Ki, {}) }
|
|
7177
7186
|
], ma = [], pa = [];
|
|
7178
|
-
function
|
|
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
|
|
7199
|
+
function Yi() {
|
|
7191
7200
|
return [
|
|
7192
|
-
...zn(
|
|
7201
|
+
...zn(Qi, ma),
|
|
7193
7202
|
{
|
|
7194
7203
|
path: "/",
|
|
7195
7204
|
element: /* @__PURE__ */ e(lr, { children: /* @__PURE__ */ e(ir, {}) }),
|
|
7196
|
-
children: zn(
|
|
7205
|
+
children: zn(Ji, pa)
|
|
7197
7206
|
}
|
|
7198
7207
|
];
|
|
7199
7208
|
}
|
|
7200
|
-
function
|
|
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
|
|
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 ??
|
|
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
|
-
|
|
7223
|
-
|
|
7224
|
-
|
|
7225
|
-
|
|
7226
|
-
|
|
7227
|
-
|
|
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
|
-
|
|
7238
|
+
Wi as getComponent,
|
|
7230
7239
|
aa as getDoctypeConfig,
|
|
7231
7240
|
Za as getNavGroups,
|
|
7232
|
-
|
|
7233
|
-
|
|
7234
|
-
|
|
7235
|
-
|
|
7236
|
-
|
|
7237
|
-
|
|
7238
|
-
|
|
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
|
};
|