@lambda-development/erp-core 1.4.8 → 1.4.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js
CHANGED
|
@@ -2280,7 +2280,14 @@ const ft = [
|
|
|
2280
2280
|
{ name: "description", label: "Description", type: "textarea" },
|
|
2281
2281
|
{ name: "qty", label: "Qty", type: "number", required: !0 },
|
|
2282
2282
|
{ name: "rate", label: "Rate", type: "currency", default: null, hint: "Leave blank to resolve the customer or company price on save. Enter 0 for a free line." },
|
|
2283
|
-
{ name: "amount", label: "Amount", type: "currency", readOnly: !0 }
|
|
2283
|
+
{ name: "amount", label: "Amount", type: "currency", readOnly: !0 },
|
|
2284
|
+
{
|
|
2285
|
+
name: "price_source",
|
|
2286
|
+
label: "Price Source",
|
|
2287
|
+
type: "text",
|
|
2288
|
+
readOnly: !0,
|
|
2289
|
+
hint: "Where the price came from: Item Price, Standard Rate, Entered, Manual (changed by hand; no longer repriced) or None (no price found)."
|
|
2290
|
+
}
|
|
2284
2291
|
], ji = [
|
|
2285
2292
|
...ft,
|
|
2286
2293
|
{
|
|
@@ -3043,11 +3050,14 @@ const ft = [
|
|
|
3043
3050
|
{ name: "apply_on", label: "Apply On", type: "select", options: ["Item Code", "Item Group"], default: "Item Code", required: !0 },
|
|
3044
3051
|
{ name: "item_code", label: "Item", type: "link", linkDoctype: "item", hint: "Required when Apply On is Item Code." },
|
|
3045
3052
|
{ name: "item_group", label: "Item Group", type: "text", hint: "Required when Apply On is Item Group." },
|
|
3046
|
-
{ name: "
|
|
3053
|
+
{ name: "apply_on_value", label: "Apply On Value", type: "text", hint: "Only for an Apply On key added by your deployment (for example a price family): the value the rule is for." },
|
|
3054
|
+
{ name: "applicable_for", label: "Applicable For", type: "select", options: ["Customer", "Customer Group", "Territory", "Supplier", "Supplier Group"], hint: "Leave blank to apply to everyone. Otherwise fill the matching field below." },
|
|
3047
3055
|
{ name: "customer", label: "Customer", type: "link", linkDoctype: "customer" },
|
|
3048
3056
|
{ name: "customer_group", label: "Customer Group", type: "text" },
|
|
3049
3057
|
{ name: "territory", label: "Territory", type: "text" },
|
|
3050
3058
|
{ name: "supplier", label: "Supplier", type: "link", linkDoctype: "supplier" },
|
|
3059
|
+
{ name: "supplier_group", label: "Supplier Group", type: "text" },
|
|
3060
|
+
{ name: "applicable_for_value", label: "Applicable For Value", type: "text", hint: "Only for an Applicable For key added by your deployment (for example a purchasing group): the value the rule is for." },
|
|
3051
3061
|
{ name: "selling", label: "Selling", type: "select", options: ["1", "0"], default: "1" },
|
|
3052
3062
|
{ name: "buying", label: "Buying", type: "select", options: ["1", "0"], default: "0" },
|
|
3053
3063
|
{ name: "rate_or_discount", label: "Type", type: "select", options: ["Discount Percentage", "Discount Amount", "Rate"], default: "Discount Percentage" },
|
|
@@ -3060,7 +3070,7 @@ const ft = [
|
|
|
3060
3070
|
{ name: "max_amt", label: "Max Amount", type: "currency", hint: "Zero means no upper limit." },
|
|
3061
3071
|
{ name: "valid_from", label: "Valid From", type: "date" },
|
|
3062
3072
|
{ name: "valid_upto", label: "Valid Upto", type: "date" },
|
|
3063
|
-
{ name: "priority", label: "Priority", type: "number" },
|
|
3073
|
+
{ name: "priority", label: "Priority", type: "number", hint: "The rule with the highest priority applies. Among equals: the more specific match, the higher Min Qty, the narrower validity, the newer Valid From, then the name." },
|
|
3064
3074
|
{ name: "company", label: "Company", type: "link", linkDoctype: "company" },
|
|
3065
3075
|
{ name: "currency", label: "Currency", type: "select", optionsSource: "currency", hint: "Rate and Discount Amount apply only to documents in this currency. Defaults to the company currency." },
|
|
3066
3076
|
{ name: "enabled", label: "Enabled", type: "select", options: ["1", "0"], default: "1" }
|
|
@@ -9568,7 +9578,7 @@ function Il(e, n) {
|
|
|
9568
9578
|
}
|
|
9569
9579
|
return s < e.length && a.push(e.slice(s)), a.length > 0 ? a : [e];
|
|
9570
9580
|
}
|
|
9571
|
-
const Ll = { incomplete: "Draft saved; PDF output requires Customer, Company and at least one Quotation." }, El = { save: "Save", saving: "Saving...", saved: "Saved", unsavedTitle: "Leave without saving?", unsavedBody: "Your changes on this page have not been saved and will be lost.", unsavedLeave: "Discard changes", unsavedStay: "Keep editing", submit: "Submit", cancel: "Cancel", cancelDoc: "Cancel", cancelDocAbort: "Don't cancel", cancelDocConfirmBtn: "Yes, cancel document", cancelBooking: "Cancel booking", cancelBookingConfirm: "Yes, cancel booking", keepBooking: "Keep booking", discardDraft: "Discard draft", keepDraft: "Keep", discardDraftConfirm: "Discard draft", showDiscarded: "Show discarded", showDisabled: "Show disabled", columns: "Columns", searchPlaceholder: "Search…", noRecords: "No records found", active: "Active", disabled: "Disabled", sortByColumn: "Sort by this column", 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" }, Fl = { today: "Today", thisWeek: "This Week", thisMonth: "This Month", thisQuarter: "This Quarter", thisYear: "This Year", lastMonth: "Last Month", lastQuarter: "Last Quarter", lastYear: "Last Year", endOfThisMonth: "End of This Month", endOfLastMonth: "End of Last Month", endOfThisQuarter: "End of This Quarter", endOfThisYear: "End of This Year", endOfLastYear: "End of Last Year" }, Ol = { title: "Bank statement import", subtitle: "Preview and import ISO 20022 CAMT statements without posting to the ledger.", selectFiles: "CAMT files", chooseFiles: "Choose XML or ZIP files", dropFiles: "Drop XML or ZIP files here", unsupportedFiles: "Only CAMT XML or ZIP files are supported: {{files}}", fileHint: "camt.053.001.04 and camt.053.001.08 · multiple files supported", preview: "Show preview", noPosting: "Previewing and importing do not post accounting entries.", alreadyImported: "Already imported", period: "Period", openingBalance: "Opening balance", closingBalance: "Closing balance", entries: "Entries", credits: "Credits", debits: "Debits", details: "Transaction details", batches: "batches", qrReferences: "QR references", mapping: "Bank account mapping", selectBankAccount: "Select a Bank Account…", noBankAccounts: "No Bank Account has been configured yet.", createBankAccount: "Create Bank Account", mappingRequired: "Map every new statement to a Bank Account before importing.", import: "Import bank statements", importComplete: "Import completed", importCounts: "{{imported}} entries imported, {{duplicates}} duplicates skipped", history: "Recent imports", importId: "Import", bankAccount: "Bank account", source: "Source file", openReconciliation: "Open bank reconciliation" }, zl = { title: "Bank reconciliation", subtitle: "Match imported bank transactions to posted vouchers, open invoices, or ledger accounts.", status: "Status", unreconciled: "Unreconciled", reconciled: "Reconciled", transactions: "Bank transactions", empty: "No bank transactions in this view.", remittance: "Remittance information", reference: "Reference", openTransaction: "Open bank transaction", conversionRate: "Exchange rate (1 {{currency}} in {{base}})", conversionRateHint: "Required when no exchange rate exists for the transaction date.", existingVouchers: "Existing accounting entries", existingVouchersHint: "These submitted vouchers contain an exact movement on this bank account. Matching does not post them again.", match: "Match", openInvoices: "Open invoices", openInvoicesHint: "Select one or more invoices belonging to the same party. Confirmation creates and submits a Payment Entry.", outstanding: "Outstanding", allocation: "Allocation", noInvoiceSuggestions: "No plausible open invoice was found.", allocated: "Allocated {{amount}} of {{total}}", createPayment: "Create payment and reconcile", directPosting: "Post to a ledger account", directPostingHint: "For fees, interest and other non-invoice movements. Receivable, payable, bank and cash control accounts are intentionally excluded.", counterpartyAccount: "Counter account", remarks: "Remarks", createJournal: "Create journal entry and reconcile", activeMatch: "Active reconciliation", undo: "Undo reconciliation", confirmExistingTitle: "Match existing entry?", confirmExistingBody: "Match {{transaction}} to {{voucher}}? No new ledger entry will be posted.", confirmGroupBody: "Match all {{count}} transactions totalling {{amount}} to {{voucher}}? No new ledger entry will be posted.", groupedTransactions: "{{count}} grouped transactions", confirmPaymentTitle: "Post payment and reconcile?", confirmPaymentBody: "This submits a payment of {{amount}} for {{transaction}} and allocates it across {{count}} invoice(s).", onAccountWarning: "{{amount}} will remain as an on-account payment for this party.", confirmJournalTitle: "Post journal entry and reconcile?", confirmJournalBody: "This posts {{amount}} for {{transaction}} against {{account}}.", postAndReconcile: "Post and reconcile", undoTitle: "Undo reconciliation?", undoCreatedBody: "The voucher created by this reconciliation will be cancelled, its ledger entries reversed, and invoice allocations restored.", undoExistingBody: "The existing voucher will only be unlinked. It remains submitted and its ledger entries are not changed.", undoExistingGroupBody: "All {{count}} grouped transactions ({{transactions}}) will be unlinked together. The existing voucher remains submitted and its ledger entries are not changed.", reconciledNotice: "Bank transaction reconciled.", groupReconciledNotice: "{{count}} bank transactions reconciled as one group.", undoneNotice: "Reconciliation reversed." }, ql = { placeholder: "Search or enter field:value…", search: "Search", addFilter: "+ Filter", availableFields: "Available fields", fieldHelp: "Choose a field or type its technical name followed by a colon.", field: "Field", valueFor: "Value for {{label}}", allFields: "All fields", typeForValues: "Start typing to find values in this field.", noValues: "No matching values found.", noFields: "No matching fields found.", useValue: "Use “{{value}}”", removeFilter: "Remove {{label}} filter", types: { text: "Text", textarea: "Long text", select: "Selection", link: "Linked record", date: "Date", datetime: "Date and time", number: "Number", currency: "Amount" } }, Ml = { title: "Language", help: "Choose the language for the interface. Your choice is saved in this browser.", label: "Language" }, $l = { back: "Back", backToChat: "Back to chat", logout: "Logout", openMenu: "Open menu", closeMenu: "Close menu", new: "New {{label}}" }, Vl = { 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", "chart-of-accounts": "Chart of Accounts", "batch-stock": "Batch Stock", "stock-detail": "Stock by Location & Batch", "stock-availability": "Stock Availability" }, Ul = { 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" }, "bank-account": { one: "Bank Account", other: "Bank Accounts" }, 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" }, reservation: { one: "Reservation", other: "Reservations" } }, Kl = { 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" } }, Wl = { 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", Rentals: "Rentals" }, 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", "Bank Account": "Bank Accounts", "Bank Statement Import": "Bank Statement Import", "Bank Reconciliation": "Bank Reconciliation", 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", "Chart of Accounts": "Chart of Accounts", "Fleet Calendar": "Fleet Calendar", "Fleet (Assets)": "Fleet (Assets)", Reservations: "Reservations", Menu: "Menu", "PDF Templates": "PDF Templates", Batch: "Batch", "Batch Stock": "Batch Stock", "Storage Location": "Storage Location", "Stock by Location & Batch": "Stock by Location & Batch", "Stock Reservation": "Stock Reservation", "Stock Availability": "Stock Availability" } }, jl = { 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", orContinueWith: "or continue with", continueWithProvider: "Continue with {{provider}}", oauthError: { generic: "Sign-in failed. Please try again.", email_exists: "An account with this email already exists. Sign in, then link this provider from your account settings.", email_unverified: "Your provider did not confirm a verified email, so we can't sign you in.", registration_closed: "This email has no account yet and registration is invite-only.", invite_invalid: "That invite is invalid, already used, or issued for a different email.", identity_taken: "That provider account is already linked to a different user.", account_disabled: "This account has been disabled.", token_exchange_failed: "Sign-in failed while contacting the provider. Please try again." } }, Gl = { 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.", setPasswordTitle: "Set a Password", setPasswordBody: "Your account signs in with Google. Set a password to also sign in with email and password — a handy fallback if you ever lose access to your Google account.", setPassword: "Set password", passwordSet: "Password set.", linkedAccountsTitle: "Linked Accounts", linkedAccountsBody: "Link a Google or Apple account to sign in without a password.", linked: "Linked", linkProvider: "Link {{provider}}", 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.", chatApiTitle: "Chat API", apiTitle: "Programmatic API", restApiBody: "Allow apps and scripts to access this ERP through REST or MCP, using API keys or OAuth account linking. Disabled by default.", restApiEnabled: "Currently enabled — issued keys can call /api/documents, /api/masters, and the rest of the REST API.", restApiDisabled: "Currently disabled — the REST API only accepts the session cookie; keys are rejected.", restApiDeactivateTitle: "Deactivate the REST API?", restApiDeactivateBody: "Bearer-key access to the REST API will be switched off — connectors and scripts are rejected until you turn it back on. The web app (session cookie) is unaffected, and your API keys are NOT deleted: they start working again the instant you re-enable the API.", chatApiBody: "Let external applications talk to this ERP's chat agent over an HTTP API, using Bearer API keys. Off by default.", chatApiEnabled: "Currently enabled — issued keys can call POST /api/v1/chat.", chatApiDisabled: "Currently disabled — the API returns 404 and keys don't work.", chatApiDeactivateTitle: "Deactivate the chat API?", chatApiDeactivateBody: "The chat API will be switched off — every programmatic request (Bearer API keys) is rejected until you turn it back on. Your API keys are NOT deleted: they stay saved and start working again the instant you re-enable the API.", chatApiDeactivateConfirm: "Deactivate API", chatApiKeysTitle: "Apps and API keys", chatApiTokenOnce: "Copy this token now — it won't be shown again.", chatApiCopy: "Copy", chatApiDismiss: "Dismiss", chatApiRevoked: "revoked", chatApiRevoke: "Revoke", chatApiNoKeys: "No connections yet.", chatApiName: "Name", chatApiRole: "Role", chatApiCreate: "Create key", chatApiWarn: "A key acts with your identity and at most your role — treat it like a password. Revoke first, then delete.", 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", chatApiDelete: "Delete", chatApiYourKeys: "Your connections", chatApiYouBadge: "you", chatApiUnknownUser: "Unknown user", chatApiAdminAllNote: "As an administrator, you can manage everyone’s connections. Your own connections appear first.", chatApiConfirmTitle: "This connection belongs to another user", chatApiConfirmRevokeBody: "“{{key}}” belongs to {{name}}. Revoking it will immediately disconnect their app. Continue?", chatApiConfirmDeleteBody: "“{{key}}” belongs to {{name}}. Permanently remove this revoked connection?", chatApiPersonal: "Connect apps using your ERP account. Access never exceeds your current permissions.", version: "Version {{version}}" }, Hl = { 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" }, Ql = { periodRange: "Reporting period: {{from}} – {{to}}", periodFrom: "Reporting period from {{from}}", periodThrough: "Reporting period through {{to}}", asOfDate: "As of: {{date}}", 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", noBatchStock: "No batch stock found", batchMovements: "Movements of batch {{batch}} ({{item}})", withoutBatch: "without batch", showMovements: "Movements", expired: "expired" }, Yl = { 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}}." }, Jl = { totalRevenue: "Total Revenue", outstandingReceivable: "Outstanding Receivable", outstandingPayable: "Outstanding Payable", totalStockValue: "Total Stock Value", recentDocuments: "Recent Documents", noRecentDocuments: "No recent documents" }, Zl = { 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." }, Xl = { "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" }, ec = { "Last modified": "Last modified", Created: "Created", "% 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", Website: "Website", "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", "Amount only": "Amount only", "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", "Item (type)": "Item (type)", "Asset Tag / Plate": "Asset Tag / Plate", "Home Yard": "Home Yard", "Purchase Value": "Purchase Value", "Meter Reading": "Meter Reading", "Meter Unit": "Meter Unit", Yard: "Yard", "Asset (specific unit)": "Asset (specific unit)", Allocation: "Allocation", From: "From", To: "To", Purpose: "Purpose", "Purchase Date": "Purchase Date", Notes: "Notes", "Printed notes / terms": "Printed notes / terms", "PDF Layout": "PDF Layout", "Intro text": "Intro text", "Closing text / terms": "Closing text / terms", Batch: "Batch", "Expiry Date": "Expiry Date", "Manufacturing Date": "Manufacturing Date", "Batch-tracked": "Batch-tracked", "Has Expiry Date": "Has Expiry Date", "Item starts with": "Item starts with", "Expiring before": "Expiring before", Document: "Document", "Storage Location": "Storage Location", "Storage Locations": "Storage Locations", "Source Location": "Source Location", "Target Location": "Target Location", "Reserve Stock": "Reserve Stock", "Shelf Life Exception": "Shelf Life Exception", "Reserved Qty": "Reserved Qty", "Sales Order Line": "Sales Order Line", "Reserved By": "Reserved By", "Min. Shelf Life (days)": "Min. Shelf Life (days)", Blocked: "Blocked", "Blocked Reason": "Blocked Reason", "In Stock": "In Stock", Reserved: "Reserved", Available: "Available", "Open Sales Orders": "Open Sales Orders", "On Purchase Order": "On Purchase Order" }, tc = { accounts: "accounts", items: "items", monthly_distribution: "monthly_distribution", payments: "payments", plans: "plans", references: "references", taxes: "taxes" }, nc = /* @__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 report-specialist model that creates a validated declarative report 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.","setupTitle":"Set Up Your Company — Guided by AI","setupBadge":"Start Here","setupBody":"Tell the assistant what kind of business you run, and it builds your chart of accounts for you — tailored to your sector, with the right accounts and sensible defaults already wired up. It explains each decision and only creates anything once you approve.","setupSectors":"Tailored for services, retail & POS, hospitality, wholesale & distribution, import/export, manufacturing, and construction.","setupGetStarted":"Get started in chat","setupManual":"Prefer a manual form? Use the classic setup.","setupManualLink":"Classic setup","setupPrompt":"I'd like to set up my company. Can you guide me through it?"}`), ac = { title: "Formatting help", intro: "The printed notes / terms text supports light formatting on the PDF:", heading: "bold heading", emphasis: "italic / bold", rule: "horizontal divider line", price: "right-aligned price beside the text above (e.g. Monthly | CHF 380.—)", block: "Separate blocks with a blank line." }, rc = { period: "Period", allTime: "All time", semantics: "Balance-sheet accounts: closing balance at period end. P&L accounts: movement within the period. Click an account for its ledger.", empty: "No accounts found. Complete the company setup first.", disabled: "disabled", rootType: { Asset: "Assets", Liability: "Liabilities", Equity: "Equity", Income: "Income", Expense: "Expenses" } }, sc = { fleetCalendar: "Fleet Calendar", yard: "Yard", machineType: "Machine type", prev: "Prev", today: "Today", next: "Next", weeks: "weeks", newBooking: "New booking", reserved: "Reserved", onHire: "On Hire", machine: "Machine", loadError: "Could not load the fleet calendar.", noAssets: "No assets to show. Add machines under Rentals → Fleet.", pooledNote: "{{count}} pool booking(s) awaiting assignment", unassigned: "Pool — unassigned", poolWarning: "Pool capacity is reserved. No specific machine has been assigned yet; assign a machine before dispatch." }, ic = { Unit: "Specific machine", Pool: "Pool – assign machine later", Available: "Available", "On Hire": "On Hire", Out: "Out", Maintenance: "Maintenance", Retired: "Retired", Reserved: "Reserved", Returned: "Returned", Cancelled: "Cancelled", Customer: "Customer", Supplier: "Supplier" }, oc = { asset: { item_code: "The Item is the machine TYPE and carries the rate; an Asset is one physical unit of it. The Item must have is_asset_tracked = 1.", asset_tag: "Plate or serial — must be unique across assets.", status: "The unit's state today (not a date range). Retired units leave the pool.", meter_reading: "Operating hours / km." }, reservation: { item_code: "Pooled booking ('a 1.7t excavator'): set Item + Yard + Qty. For a specific machine, set Asset instead.", asset: "Book one specific machine. A unit booking also consumes a slot of its Item+Yard pool.", from_datetime: "Exact start — date and time (e.g. 14:27). A bare date means 00:00.", to_datetime: "Exact end. Windows are half-open [from, to): a hire ending 09:00 and the next starting 09:00 do NOT clash.", pdf_template: "How the reservation confirmation looks." }, quotation: { pdf_template: "How the offer's PDF looks. Fixed when the offer is submitted.", intro_text: "Printed above the line items (where exactly is up to the PDF layout). New offers start with the default from Settings → PDF Templates.", remarks: "Printed after the totals (where exactly is up to the PDF layout). New offers start with the default from Settings → PDF Templates." }, "sales-order": { pdf_template: "How the PDF looks. Fixed when the document is submitted.", intro_text: "Printed above the line items (where exactly is up to the PDF layout). New documents start with the default from Settings → PDF Templates." }, "sales-invoice": { pdf_template: "How the PDF looks. Fixed when the document is submitted.", intro_text: "Printed above the line items (where exactly is up to the PDF layout). New documents start with the default from Settings → PDF Templates." }, "purchase-order": { pdf_template: "How the PDF looks. Fixed when the document is submitted.", intro_text: "Printed above the line items (where exactly is up to the PDF layout). New documents start with the default from Settings → PDF Templates." }, "delivery-note": { pdf_template: "How the PDF looks. Fixed when the document is submitted.", intro_text: "Printed above the line items (where exactly is up to the PDF layout). New documents start with the default from Settings → PDF Templates." } }, lc = { label: "Default sales tax", none: "No automatic tax application", hint: "Applied to new quotations, orders and invoices when taxes are not explicitly provided. Existing documents remain unchanged. Use Save to apply.", saveFirst: "Save the company first, then select one of its sales tax templates.", loadError: "Tax templates could not be loaded. The saved selection is preserved.", retry: "Try again", unavailable: "The saved template is not available as a sales tax template for this company. Please check the selection.", empty: "This company has no sales tax templates yet." }, cc = { title: "Connect an app", subtitle: "Choose where you want to use Lambda ERP. We’ll show only the setup you need.", other: "Something else", customName: "Custom integration", signIn: "Sign in", apiKey: "API key", access: "Access", role_viewer: "View data", role_manager: "Create and edit", role_admin: "Full administrative access", roleHelp: "Access is always limited by your own ERP permissions. Choose only what this app needs.", copied: "Copied", copyFailed: "Could not copy automatically. Select the text and copy it manually.", retry: "Try again", interface: "Connection type", chatDisabled: "Chat API access is disabled. Ask an administrator to enable it in the API settings above.", restDisabled: "REST API / MCP access is disabled. An administrator must enable it in the API settings before this app can connect.", chatgptStep: "Open chatgpt.com in your browser. Select Plugins in the left sidebar, click Add (+) at the top right, then choose Create MCP App. Give it a name, such as Lambda ERP, and a short description.", chatgptDeveloperMode: "If Create MCP App is unavailable, check that Developer mode is enabled under Settings → Security and login. If it is already enabled, go straight to Plugins. Workspace permissions may also apply.", claudeStep: "In Claude Desktop, open Settings → Connectors and choose Add custom connector.", urlStep: "Paste this server URL. Use OAuth sign-in; leave optional client ID and client secret fields empty.", approveStep: "Connect, sign in to Lambda ERP, and approve the access you want to grant.", noKeyNeeded: "No API key or custom header is needed. Access is chosen on the approval screen.", officialGuide: "Open the app’s setup guide", copyUrl: "Copy server URL", keyReady: "Your connection key is ready", copySetup: "Copy setup", copyHeader: "Copy authorization header", cliStep: "Run this command in your terminal, then open /mcp in Claude Code to check the connection.", codexStep: "Add this entry to your Codex configuration, then restart Codex and check /mcp.", done: "Done — hide secret", existing: "Existing connections", refresh: "Refresh", lastUsed: "Last used", notUsed: "Not used yet", consentTitle: "Connect to Lambda ERP", expired: "This connection request is missing or expired. Start again in your app.", loginFirst: "Sign in to your ERP account to review this app’s request.", consentBody: "“{{app}}” is requesting access to your ERP. Choose the access you want to allow.", returnTo: "After approval, you will return to", revokeHelp: "You can revoke this connection at any time in Settings → API access.", deny: "Cancel", allow: "Allow connection", explain_viewer: "The app can read ERP records and reports and generate document PDFs. It cannot edit business records.", explain_manager: "The app can also create, edit, submit and cancel business documents and update master data.", explain_admin: "The app can use all available ERP tools, including administrative actions and deleting master data." }, dc = { title: "Mentions", note: "Internal note", placeholder: "Write a note… use @ to mention a colleague", colleagues: "Colleagues", loading: "Loading…", noUsers: "No matching colleagues", hint: "Write @Name or choose a colleague. People mentioned in the text are notified when you save.", remove: "Remove mention of {{name}}", close: "Close", open: "Open", unread: "Unread", done: "Done", retry: "Retry", empty: "No mentions here.", mentionedYou: "mentioned you", reopen: "Reopen", markDone: "Done", markUnread: "Mark unread", markRead: "Mark read", previous: "Previous", next: "Next" }, uc = { title: "Internal notes", private: "Private to your team · never printed", add: "Add note", placeholder: "Write an internal note… type @ to notify a colleague", save: "Save note", empty: "No internal notes yet.", edited: "edited", older: "Show older notes", printedBadge: "Printed on the PDF", count_one: "{{count}} internal note", count_other: "{{count}} internal notes" }, mc = { title: "Your menu", intro: "Drag groups and items into the order you want and hide the ones you don't use, then save. This only changes your own menu: other people keep theirs, and hidden pages stay reachable by link.", chatHint: 'You can also ask the chat, e.g. "hide the rentals section" or "move CRM to the top".', reset: "Reset to default", hide: "Hide {{name}}", show: "Show {{name}}", locked: "Always shown: this page edits the menu", drag: "Drag to reorder {{name}} (or focus it and use the arrow keys)", discard: "Discard changes", unsaved: "Unsaved changes" }, pc = { title: "PDF templates", intro: "The layouts documents print with: offers, sales orders, invoices, purchase orders, delivery notes, proposals and reservation confirmations, each type with its own templates and default. Edit a template as often as you like: saving only changes its working copy, and publishing makes it the layout documents print with. A submitted document keeps the layout and the PDF it was issued with.", chatHint: 'You can also ask the chat, e.g. "put our logo top right and use a larger font in the item table".', new: "New template", newTitle: "New PDF template", newBody: "Starts as a copy of {{name}}.", copyOf: "Copy of {{name}}", create: "Create", standard: "Standard", standardDescription: "The built-in layout. Read-only: duplicate it to change the look.", default: "Default", builtIn: "Built-in", notPublished: "Not published", unpublishedChanges: "Unpublished changes", archived: "Archived", usedBy_one: "Used by {{count}} offer", usedBy_other: "Used by {{count}} offers", makeDefault: "Make default", duplicate: "Duplicate", archive: "Archive", restore: "Restore", deleteTitle: "Delete {{name}}?", deleteBody: "No offer has used this template, so nothing depends on it.", showArchived: "Show archived templates", name: "Name", editHint: "Save as often as you like: only the working copy changes. Publish when the preview looks right; documents print with the published layout.", publish: "Publish", revert: "Discard unpublished changes", revertTitle: "Discard unpublished changes?", revertBody: "The working copy goes back to the published layout.", publishedNotice: "Published. Checked against {{document}}.", source: "HTML and CSS", lines_one: "{{count}} line", lines_other: "{{count}} lines", preview: "Preview", previewWith: "Preview with document", refresh: "Refresh", show_draft: "Working copy", show_live: "Published", previewShowsSaved: "The preview shows the last saved version.", blocked: "Not loaded (only uploaded assets are allowed): {{urls}}", assets_one: "Images and fonts ({{count}})", assets_other: "Images and fonts ({{count}})", assetsHint: 'Reference an uploaded file by its name, e.g. <img src="logo.png">. Links to other websites are blocked.', upload: "Upload file", versions_one: "Issued versions ({{count}})", versions_other: "Issued versions ({{count}})", versionsHint: "A version is recorded when a document is submitted with a layout. Documents keep the version they were issued with.", noVersions: "No offer has been issued with this template yet.", firstUsed: "first used {{date}}", reference: "Available fields", standardEditHint: "To change this layout, duplicate it on the", defaultOption: "Default ({{name}})", textDefaults: "Default texts for offers", textDefaultsIntro: "New offers start with these texts; they can be changed on each offer. Changing a default doesn’t change existing offers.", textDefaultsPlaceholders: "Placeholders, filled in when the PDF prints: {{placeholders}}", saveTexts: "Save texts", textsSaved: "Saved.", publishWarnings: "Note: {{warnings}}", uploading: "Uploading…", dropHint: "or drag images and fonts here (PNG, JPG, SVG, WebP, GIF, TTF, OTF, WOFF, WOFF2)", textDefaultsFor: "Default texts for {{type}}", textDefaultsIntroFor: "New {{type}} start with these texts; they can be changed on each document. Changing them here doesn’t change existing documents.", newTitleFor: "New PDF template ({{type}})", newFor: "New template: {{type}}", fromOtherType: "Start from another type’s template…", usedByIssued_one: "Used by {{count}} issued document", usedByIssued_other: "Used by {{count}} issued documents" }, hc = { pdf_intro_text_not_printed: "The PDF layout “{{template}}” doesn’t print the intro text; the PDF shows it without.", pdf_remarks_not_printed: "The PDF layout “{{template}}” doesn’t print the closing text / terms; the PDF shows it without.", pdf_line_deduction_not_printed: "The PDF layout “{{template}}” doesn’t print line deductions; those lines show only their net amount.", pdf_variable_not_printed: "The PDF layout “{{template}}” doesn’t print the {{label}}; the PDF shows it without." }, gc = { defaultLabel: "Deduction", add: "+ Deduction", remove: "Remove deduction", label: "Deduction text", labelPlaceholder: "e.g. Less already invoiced (invoice SINV-0003)", perUnit: "Deduction per unit, printed under the line; the line counts the rest." }, fc = {
|
|
9581
|
+
const Ll = { incomplete: "Draft saved; PDF output requires Customer, Company and at least one Quotation." }, El = { save: "Save", saving: "Saving...", saved: "Saved", unsavedTitle: "Leave without saving?", unsavedBody: "Your changes on this page have not been saved and will be lost.", unsavedLeave: "Discard changes", unsavedStay: "Keep editing", submit: "Submit", cancel: "Cancel", cancelDoc: "Cancel", cancelDocAbort: "Don't cancel", cancelDocConfirmBtn: "Yes, cancel document", cancelBooking: "Cancel booking", cancelBookingConfirm: "Yes, cancel booking", keepBooking: "Keep booking", discardDraft: "Discard draft", keepDraft: "Keep", discardDraftConfirm: "Discard draft", showDiscarded: "Show discarded", showDisabled: "Show disabled", columns: "Columns", searchPlaceholder: "Search…", noRecords: "No records found", active: "Active", disabled: "Disabled", sortByColumn: "Sort by this column", 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" }, Fl = { today: "Today", thisWeek: "This Week", thisMonth: "This Month", thisQuarter: "This Quarter", thisYear: "This Year", lastMonth: "Last Month", lastQuarter: "Last Quarter", lastYear: "Last Year", endOfThisMonth: "End of This Month", endOfLastMonth: "End of Last Month", endOfThisQuarter: "End of This Quarter", endOfThisYear: "End of This Year", endOfLastYear: "End of Last Year" }, Ol = { title: "Bank statement import", subtitle: "Preview and import ISO 20022 CAMT statements without posting to the ledger.", selectFiles: "CAMT files", chooseFiles: "Choose XML or ZIP files", dropFiles: "Drop XML or ZIP files here", unsupportedFiles: "Only CAMT XML or ZIP files are supported: {{files}}", fileHint: "camt.053.001.04 and camt.053.001.08 · multiple files supported", preview: "Show preview", noPosting: "Previewing and importing do not post accounting entries.", alreadyImported: "Already imported", period: "Period", openingBalance: "Opening balance", closingBalance: "Closing balance", entries: "Entries", credits: "Credits", debits: "Debits", details: "Transaction details", batches: "batches", qrReferences: "QR references", mapping: "Bank account mapping", selectBankAccount: "Select a Bank Account…", noBankAccounts: "No Bank Account has been configured yet.", createBankAccount: "Create Bank Account", mappingRequired: "Map every new statement to a Bank Account before importing.", import: "Import bank statements", importComplete: "Import completed", importCounts: "{{imported}} entries imported, {{duplicates}} duplicates skipped", history: "Recent imports", importId: "Import", bankAccount: "Bank account", source: "Source file", openReconciliation: "Open bank reconciliation" }, zl = { title: "Bank reconciliation", subtitle: "Match imported bank transactions to posted vouchers, open invoices, or ledger accounts.", status: "Status", unreconciled: "Unreconciled", reconciled: "Reconciled", transactions: "Bank transactions", empty: "No bank transactions in this view.", remittance: "Remittance information", reference: "Reference", openTransaction: "Open bank transaction", conversionRate: "Exchange rate (1 {{currency}} in {{base}})", conversionRateHint: "Required when no exchange rate exists for the transaction date.", existingVouchers: "Existing accounting entries", existingVouchersHint: "These submitted vouchers contain an exact movement on this bank account. Matching does not post them again.", match: "Match", openInvoices: "Open invoices", openInvoicesHint: "Select one or more invoices belonging to the same party. Confirmation creates and submits a Payment Entry.", outstanding: "Outstanding", allocation: "Allocation", noInvoiceSuggestions: "No plausible open invoice was found.", allocated: "Allocated {{amount}} of {{total}}", createPayment: "Create payment and reconcile", directPosting: "Post to a ledger account", directPostingHint: "For fees, interest and other non-invoice movements. Receivable, payable, bank and cash control accounts are intentionally excluded.", counterpartyAccount: "Counter account", remarks: "Remarks", createJournal: "Create journal entry and reconcile", activeMatch: "Active reconciliation", undo: "Undo reconciliation", confirmExistingTitle: "Match existing entry?", confirmExistingBody: "Match {{transaction}} to {{voucher}}? No new ledger entry will be posted.", confirmGroupBody: "Match all {{count}} transactions totalling {{amount}} to {{voucher}}? No new ledger entry will be posted.", groupedTransactions: "{{count}} grouped transactions", confirmPaymentTitle: "Post payment and reconcile?", confirmPaymentBody: "This submits a payment of {{amount}} for {{transaction}} and allocates it across {{count}} invoice(s).", onAccountWarning: "{{amount}} will remain as an on-account payment for this party.", confirmJournalTitle: "Post journal entry and reconcile?", confirmJournalBody: "This posts {{amount}} for {{transaction}} against {{account}}.", postAndReconcile: "Post and reconcile", undoTitle: "Undo reconciliation?", undoCreatedBody: "The voucher created by this reconciliation will be cancelled, its ledger entries reversed, and invoice allocations restored.", undoExistingBody: "The existing voucher will only be unlinked. It remains submitted and its ledger entries are not changed.", undoExistingGroupBody: "All {{count}} grouped transactions ({{transactions}}) will be unlinked together. The existing voucher remains submitted and its ledger entries are not changed.", reconciledNotice: "Bank transaction reconciled.", groupReconciledNotice: "{{count}} bank transactions reconciled as one group.", undoneNotice: "Reconciliation reversed." }, ql = { placeholder: "Search or enter field:value…", search: "Search", addFilter: "+ Filter", availableFields: "Available fields", fieldHelp: "Choose a field or type its technical name followed by a colon.", field: "Field", valueFor: "Value for {{label}}", allFields: "All fields", typeForValues: "Start typing to find values in this field.", noValues: "No matching values found.", noFields: "No matching fields found.", useValue: "Use “{{value}}”", removeFilter: "Remove {{label}} filter", types: { text: "Text", textarea: "Long text", select: "Selection", link: "Linked record", date: "Date", datetime: "Date and time", number: "Number", currency: "Amount" } }, Ml = { title: "Language", help: "Choose the language for the interface. Your choice is saved in this browser.", label: "Language" }, $l = { back: "Back", backToChat: "Back to chat", logout: "Logout", openMenu: "Open menu", closeMenu: "Close menu", new: "New {{label}}" }, Vl = { 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", "chart-of-accounts": "Chart of Accounts", "batch-stock": "Batch Stock", "stock-detail": "Stock by Location & Batch", "stock-availability": "Stock Availability" }, Ul = { 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" }, "bank-account": { one: "Bank Account", other: "Bank Accounts" }, 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" }, reservation: { one: "Reservation", other: "Reservations" } }, Kl = { 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" } }, Wl = { 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", Rentals: "Rentals" }, 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", "Bank Account": "Bank Accounts", "Bank Statement Import": "Bank Statement Import", "Bank Reconciliation": "Bank Reconciliation", 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", "Chart of Accounts": "Chart of Accounts", "Fleet Calendar": "Fleet Calendar", "Fleet (Assets)": "Fleet (Assets)", Reservations: "Reservations", Menu: "Menu", "PDF Templates": "PDF Templates", Batch: "Batch", "Batch Stock": "Batch Stock", "Storage Location": "Storage Location", "Stock by Location & Batch": "Stock by Location & Batch", "Stock Reservation": "Stock Reservation", "Stock Availability": "Stock Availability" } }, jl = { 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", orContinueWith: "or continue with", continueWithProvider: "Continue with {{provider}}", oauthError: { generic: "Sign-in failed. Please try again.", email_exists: "An account with this email already exists. Sign in, then link this provider from your account settings.", email_unverified: "Your provider did not confirm a verified email, so we can't sign you in.", registration_closed: "This email has no account yet and registration is invite-only.", invite_invalid: "That invite is invalid, already used, or issued for a different email.", identity_taken: "That provider account is already linked to a different user.", account_disabled: "This account has been disabled.", token_exchange_failed: "Sign-in failed while contacting the provider. Please try again." } }, Gl = { 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.", setPasswordTitle: "Set a Password", setPasswordBody: "Your account signs in with Google. Set a password to also sign in with email and password — a handy fallback if you ever lose access to your Google account.", setPassword: "Set password", passwordSet: "Password set.", linkedAccountsTitle: "Linked Accounts", linkedAccountsBody: "Link a Google or Apple account to sign in without a password.", linked: "Linked", linkProvider: "Link {{provider}}", 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.", chatApiTitle: "Chat API", apiTitle: "Programmatic API", restApiBody: "Allow apps and scripts to access this ERP through REST or MCP, using API keys or OAuth account linking. Disabled by default.", restApiEnabled: "Currently enabled — issued keys can call /api/documents, /api/masters, and the rest of the REST API.", restApiDisabled: "Currently disabled — the REST API only accepts the session cookie; keys are rejected.", restApiDeactivateTitle: "Deactivate the REST API?", restApiDeactivateBody: "Bearer-key access to the REST API will be switched off — connectors and scripts are rejected until you turn it back on. The web app (session cookie) is unaffected, and your API keys are NOT deleted: they start working again the instant you re-enable the API.", chatApiBody: "Let external applications talk to this ERP's chat agent over an HTTP API, using Bearer API keys. Off by default.", chatApiEnabled: "Currently enabled — issued keys can call POST /api/v1/chat.", chatApiDisabled: "Currently disabled — the API returns 404 and keys don't work.", chatApiDeactivateTitle: "Deactivate the chat API?", chatApiDeactivateBody: "The chat API will be switched off — every programmatic request (Bearer API keys) is rejected until you turn it back on. Your API keys are NOT deleted: they stay saved and start working again the instant you re-enable the API.", chatApiDeactivateConfirm: "Deactivate API", chatApiKeysTitle: "Apps and API keys", chatApiTokenOnce: "Copy this token now — it won't be shown again.", chatApiCopy: "Copy", chatApiDismiss: "Dismiss", chatApiRevoked: "revoked", chatApiRevoke: "Revoke", chatApiNoKeys: "No connections yet.", chatApiName: "Name", chatApiRole: "Role", chatApiCreate: "Create key", chatApiWarn: "A key acts with your identity and at most your role — treat it like a password. Revoke first, then delete.", 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", chatApiDelete: "Delete", chatApiYourKeys: "Your connections", chatApiYouBadge: "you", chatApiUnknownUser: "Unknown user", chatApiAdminAllNote: "As an administrator, you can manage everyone’s connections. Your own connections appear first.", chatApiConfirmTitle: "This connection belongs to another user", chatApiConfirmRevokeBody: "“{{key}}” belongs to {{name}}. Revoking it will immediately disconnect their app. Continue?", chatApiConfirmDeleteBody: "“{{key}}” belongs to {{name}}. Permanently remove this revoked connection?", chatApiPersonal: "Connect apps using your ERP account. Access never exceeds your current permissions.", version: "Version {{version}}" }, Hl = { 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" }, Ql = { periodRange: "Reporting period: {{from}} – {{to}}", periodFrom: "Reporting period from {{from}}", periodThrough: "Reporting period through {{to}}", asOfDate: "As of: {{date}}", 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", noBatchStock: "No batch stock found", batchMovements: "Movements of batch {{batch}} ({{item}})", withoutBatch: "without batch", showMovements: "Movements", expired: "expired" }, Yl = { 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}}." }, Jl = { totalRevenue: "Total Revenue", outstandingReceivable: "Outstanding Receivable", outstandingPayable: "Outstanding Payable", totalStockValue: "Total Stock Value", recentDocuments: "Recent Documents", noRecentDocuments: "No recent documents" }, Zl = { 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." }, Xl = { "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" }, ec = { "Last modified": "Last modified", Created: "Created", "% 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", Website: "Website", "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", "Amount only": "Amount only", "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", "Item (type)": "Item (type)", "Asset Tag / Plate": "Asset Tag / Plate", "Home Yard": "Home Yard", "Purchase Value": "Purchase Value", "Meter Reading": "Meter Reading", "Meter Unit": "Meter Unit", Yard: "Yard", "Asset (specific unit)": "Asset (specific unit)", Allocation: "Allocation", From: "From", To: "To", Purpose: "Purpose", "Purchase Date": "Purchase Date", Notes: "Notes", "Printed notes / terms": "Printed notes / terms", "PDF Layout": "PDF Layout", "Intro text": "Intro text", "Closing text / terms": "Closing text / terms", Batch: "Batch", "Expiry Date": "Expiry Date", "Manufacturing Date": "Manufacturing Date", "Batch-tracked": "Batch-tracked", "Has Expiry Date": "Has Expiry Date", "Item starts with": "Item starts with", "Expiring before": "Expiring before", Document: "Document", "Storage Location": "Storage Location", "Storage Locations": "Storage Locations", "Source Location": "Source Location", "Target Location": "Target Location", "Reserve Stock": "Reserve Stock", "Shelf Life Exception": "Shelf Life Exception", "Reserved Qty": "Reserved Qty", "Sales Order Line": "Sales Order Line", "Reserved By": "Reserved By", "Min. Shelf Life (days)": "Min. Shelf Life (days)", Blocked: "Blocked", "Blocked Reason": "Blocked Reason", "In Stock": "In Stock", Reserved: "Reserved", Available: "Available", "Open Sales Orders": "Open Sales Orders", "On Purchase Order": "On Purchase Order", "Price Source": "Price Source", "Apply On Value": "Apply On Value", "Applicable For Value": "Applicable For Value" }, tc = { accounts: "accounts", items: "items", monthly_distribution: "monthly_distribution", payments: "payments", plans: "plans", references: "references", taxes: "taxes" }, nc = /* @__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 report-specialist model that creates a validated declarative report 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.","setupTitle":"Set Up Your Company — Guided by AI","setupBadge":"Start Here","setupBody":"Tell the assistant what kind of business you run, and it builds your chart of accounts for you — tailored to your sector, with the right accounts and sensible defaults already wired up. It explains each decision and only creates anything once you approve.","setupSectors":"Tailored for services, retail & POS, hospitality, wholesale & distribution, import/export, manufacturing, and construction.","setupGetStarted":"Get started in chat","setupManual":"Prefer a manual form? Use the classic setup.","setupManualLink":"Classic setup","setupPrompt":"I'd like to set up my company. Can you guide me through it?"}`), ac = { title: "Formatting help", intro: "The printed notes / terms text supports light formatting on the PDF:", heading: "bold heading", emphasis: "italic / bold", rule: "horizontal divider line", price: "right-aligned price beside the text above (e.g. Monthly | CHF 380.—)", block: "Separate blocks with a blank line." }, rc = { period: "Period", allTime: "All time", semantics: "Balance-sheet accounts: closing balance at period end. P&L accounts: movement within the period. Click an account for its ledger.", empty: "No accounts found. Complete the company setup first.", disabled: "disabled", rootType: { Asset: "Assets", Liability: "Liabilities", Equity: "Equity", Income: "Income", Expense: "Expenses" } }, sc = { fleetCalendar: "Fleet Calendar", yard: "Yard", machineType: "Machine type", prev: "Prev", today: "Today", next: "Next", weeks: "weeks", newBooking: "New booking", reserved: "Reserved", onHire: "On Hire", machine: "Machine", loadError: "Could not load the fleet calendar.", noAssets: "No assets to show. Add machines under Rentals → Fleet.", pooledNote: "{{count}} pool booking(s) awaiting assignment", unassigned: "Pool — unassigned", poolWarning: "Pool capacity is reserved. No specific machine has been assigned yet; assign a machine before dispatch." }, ic = { Unit: "Specific machine", Pool: "Pool – assign machine later", Available: "Available", "On Hire": "On Hire", Out: "Out", Maintenance: "Maintenance", Retired: "Retired", Reserved: "Reserved", Returned: "Returned", Cancelled: "Cancelled", Customer: "Customer", Supplier: "Supplier" }, oc = { asset: { item_code: "The Item is the machine TYPE and carries the rate; an Asset is one physical unit of it. The Item must have is_asset_tracked = 1.", asset_tag: "Plate or serial — must be unique across assets.", status: "The unit's state today (not a date range). Retired units leave the pool.", meter_reading: "Operating hours / km." }, reservation: { item_code: "Pooled booking ('a 1.7t excavator'): set Item + Yard + Qty. For a specific machine, set Asset instead.", asset: "Book one specific machine. A unit booking also consumes a slot of its Item+Yard pool.", from_datetime: "Exact start — date and time (e.g. 14:27). A bare date means 00:00.", to_datetime: "Exact end. Windows are half-open [from, to): a hire ending 09:00 and the next starting 09:00 do NOT clash.", pdf_template: "How the reservation confirmation looks." }, quotation: { pdf_template: "How the offer's PDF looks. Fixed when the offer is submitted.", intro_text: "Printed above the line items (where exactly is up to the PDF layout). New offers start with the default from Settings → PDF Templates.", remarks: "Printed after the totals (where exactly is up to the PDF layout). New offers start with the default from Settings → PDF Templates." }, "sales-order": { pdf_template: "How the PDF looks. Fixed when the document is submitted.", intro_text: "Printed above the line items (where exactly is up to the PDF layout). New documents start with the default from Settings → PDF Templates." }, "sales-invoice": { pdf_template: "How the PDF looks. Fixed when the document is submitted.", intro_text: "Printed above the line items (where exactly is up to the PDF layout). New documents start with the default from Settings → PDF Templates." }, "purchase-order": { pdf_template: "How the PDF looks. Fixed when the document is submitted.", intro_text: "Printed above the line items (where exactly is up to the PDF layout). New documents start with the default from Settings → PDF Templates." }, "delivery-note": { pdf_template: "How the PDF looks. Fixed when the document is submitted.", intro_text: "Printed above the line items (where exactly is up to the PDF layout). New documents start with the default from Settings → PDF Templates." } }, lc = { label: "Default sales tax", none: "No automatic tax application", hint: "Applied to new quotations, orders and invoices when taxes are not explicitly provided. Existing documents remain unchanged. Use Save to apply.", saveFirst: "Save the company first, then select one of its sales tax templates.", loadError: "Tax templates could not be loaded. The saved selection is preserved.", retry: "Try again", unavailable: "The saved template is not available as a sales tax template for this company. Please check the selection.", empty: "This company has no sales tax templates yet." }, cc = { title: "Connect an app", subtitle: "Choose where you want to use Lambda ERP. We’ll show only the setup you need.", other: "Something else", customName: "Custom integration", signIn: "Sign in", apiKey: "API key", access: "Access", role_viewer: "View data", role_manager: "Create and edit", role_admin: "Full administrative access", roleHelp: "Access is always limited by your own ERP permissions. Choose only what this app needs.", copied: "Copied", copyFailed: "Could not copy automatically. Select the text and copy it manually.", retry: "Try again", interface: "Connection type", chatDisabled: "Chat API access is disabled. Ask an administrator to enable it in the API settings above.", restDisabled: "REST API / MCP access is disabled. An administrator must enable it in the API settings before this app can connect.", chatgptStep: "Open chatgpt.com in your browser. Select Plugins in the left sidebar, click Add (+) at the top right, then choose Create MCP App. Give it a name, such as Lambda ERP, and a short description.", chatgptDeveloperMode: "If Create MCP App is unavailable, check that Developer mode is enabled under Settings → Security and login. If it is already enabled, go straight to Plugins. Workspace permissions may also apply.", claudeStep: "In Claude Desktop, open Settings → Connectors and choose Add custom connector.", urlStep: "Paste this server URL. Use OAuth sign-in; leave optional client ID and client secret fields empty.", approveStep: "Connect, sign in to Lambda ERP, and approve the access you want to grant.", noKeyNeeded: "No API key or custom header is needed. Access is chosen on the approval screen.", officialGuide: "Open the app’s setup guide", copyUrl: "Copy server URL", keyReady: "Your connection key is ready", copySetup: "Copy setup", copyHeader: "Copy authorization header", cliStep: "Run this command in your terminal, then open /mcp in Claude Code to check the connection.", codexStep: "Add this entry to your Codex configuration, then restart Codex and check /mcp.", done: "Done — hide secret", existing: "Existing connections", refresh: "Refresh", lastUsed: "Last used", notUsed: "Not used yet", consentTitle: "Connect to Lambda ERP", expired: "This connection request is missing or expired. Start again in your app.", loginFirst: "Sign in to your ERP account to review this app’s request.", consentBody: "“{{app}}” is requesting access to your ERP. Choose the access you want to allow.", returnTo: "After approval, you will return to", revokeHelp: "You can revoke this connection at any time in Settings → API access.", deny: "Cancel", allow: "Allow connection", explain_viewer: "The app can read ERP records and reports and generate document PDFs. It cannot edit business records.", explain_manager: "The app can also create, edit, submit and cancel business documents and update master data.", explain_admin: "The app can use all available ERP tools, including administrative actions and deleting master data." }, dc = { title: "Mentions", note: "Internal note", placeholder: "Write a note… use @ to mention a colleague", colleagues: "Colleagues", loading: "Loading…", noUsers: "No matching colleagues", hint: "Write @Name or choose a colleague. People mentioned in the text are notified when you save.", remove: "Remove mention of {{name}}", close: "Close", open: "Open", unread: "Unread", done: "Done", retry: "Retry", empty: "No mentions here.", mentionedYou: "mentioned you", reopen: "Reopen", markDone: "Done", markUnread: "Mark unread", markRead: "Mark read", previous: "Previous", next: "Next" }, uc = { title: "Internal notes", private: "Private to your team · never printed", add: "Add note", placeholder: "Write an internal note… type @ to notify a colleague", save: "Save note", empty: "No internal notes yet.", edited: "edited", older: "Show older notes", printedBadge: "Printed on the PDF", count_one: "{{count}} internal note", count_other: "{{count}} internal notes" }, mc = { title: "Your menu", intro: "Drag groups and items into the order you want and hide the ones you don't use, then save. This only changes your own menu: other people keep theirs, and hidden pages stay reachable by link.", chatHint: 'You can also ask the chat, e.g. "hide the rentals section" or "move CRM to the top".', reset: "Reset to default", hide: "Hide {{name}}", show: "Show {{name}}", locked: "Always shown: this page edits the menu", drag: "Drag to reorder {{name}} (or focus it and use the arrow keys)", discard: "Discard changes", unsaved: "Unsaved changes" }, pc = { title: "PDF templates", intro: "The layouts documents print with: offers, sales orders, invoices, purchase orders, delivery notes, proposals and reservation confirmations, each type with its own templates and default. Edit a template as often as you like: saving only changes its working copy, and publishing makes it the layout documents print with. A submitted document keeps the layout and the PDF it was issued with.", chatHint: 'You can also ask the chat, e.g. "put our logo top right and use a larger font in the item table".', new: "New template", newTitle: "New PDF template", newBody: "Starts as a copy of {{name}}.", copyOf: "Copy of {{name}}", create: "Create", standard: "Standard", standardDescription: "The built-in layout. Read-only: duplicate it to change the look.", default: "Default", builtIn: "Built-in", notPublished: "Not published", unpublishedChanges: "Unpublished changes", archived: "Archived", usedBy_one: "Used by {{count}} offer", usedBy_other: "Used by {{count}} offers", makeDefault: "Make default", duplicate: "Duplicate", archive: "Archive", restore: "Restore", deleteTitle: "Delete {{name}}?", deleteBody: "No offer has used this template, so nothing depends on it.", showArchived: "Show archived templates", name: "Name", editHint: "Save as often as you like: only the working copy changes. Publish when the preview looks right; documents print with the published layout.", publish: "Publish", revert: "Discard unpublished changes", revertTitle: "Discard unpublished changes?", revertBody: "The working copy goes back to the published layout.", publishedNotice: "Published. Checked against {{document}}.", source: "HTML and CSS", lines_one: "{{count}} line", lines_other: "{{count}} lines", preview: "Preview", previewWith: "Preview with document", refresh: "Refresh", show_draft: "Working copy", show_live: "Published", previewShowsSaved: "The preview shows the last saved version.", blocked: "Not loaded (only uploaded assets are allowed): {{urls}}", assets_one: "Images and fonts ({{count}})", assets_other: "Images and fonts ({{count}})", assetsHint: 'Reference an uploaded file by its name, e.g. <img src="logo.png">. Links to other websites are blocked.', upload: "Upload file", versions_one: "Issued versions ({{count}})", versions_other: "Issued versions ({{count}})", versionsHint: "A version is recorded when a document is submitted with a layout. Documents keep the version they were issued with.", noVersions: "No offer has been issued with this template yet.", firstUsed: "first used {{date}}", reference: "Available fields", standardEditHint: "To change this layout, duplicate it on the", defaultOption: "Default ({{name}})", textDefaults: "Default texts for offers", textDefaultsIntro: "New offers start with these texts; they can be changed on each offer. Changing a default doesn’t change existing offers.", textDefaultsPlaceholders: "Placeholders, filled in when the PDF prints: {{placeholders}}", saveTexts: "Save texts", textsSaved: "Saved.", publishWarnings: "Note: {{warnings}}", uploading: "Uploading…", dropHint: "or drag images and fonts here (PNG, JPG, SVG, WebP, GIF, TTF, OTF, WOFF, WOFF2)", textDefaultsFor: "Default texts for {{type}}", textDefaultsIntroFor: "New {{type}} start with these texts; they can be changed on each document. Changing them here doesn’t change existing documents.", newTitleFor: "New PDF template ({{type}})", newFor: "New template: {{type}}", fromOtherType: "Start from another type’s template…", usedByIssued_one: "Used by {{count}} issued document", usedByIssued_other: "Used by {{count}} issued documents" }, hc = { pdf_intro_text_not_printed: "The PDF layout “{{template}}” doesn’t print the intro text; the PDF shows it without.", pdf_remarks_not_printed: "The PDF layout “{{template}}” doesn’t print the closing text / terms; the PDF shows it without.", pdf_line_deduction_not_printed: "The PDF layout “{{template}}” doesn’t print line deductions; those lines show only their net amount.", pdf_variable_not_printed: "The PDF layout “{{template}}” doesn’t print the {{label}}; the PDF shows it without." }, gc = { defaultLabel: "Deduction", add: "+ Deduction", remove: "Remove deduction", label: "Deduction text", labelPlaceholder: "e.g. Less already invoiced (invoice SINV-0003)", perUnit: "Deduction per unit, printed under the line; the line counts the rest." }, fc = {
|
|
9572
9582
|
proposal: Ll,
|
|
9573
9583
|
common: El,
|
|
9574
9584
|
datePresets: Fl,
|
|
@@ -9605,7 +9615,7 @@ const Ll = { incomplete: "Draft saved; PDF output requires Customer, Company and
|
|
|
9605
9615
|
pdfTemplates: pc,
|
|
9606
9616
|
documentWarnings: hc,
|
|
9607
9617
|
deductions: gc
|
|
9608
|
-
}, yc = { incomplete: "Entwurf gespeichert. Für das PDF werden Kunde, Unternehmen und mindestens ein Angebot benötigt." }, bc = { save: "Speichern", saving: "Speichern...", saved: "Gespeichert", unsavedTitle: "Ohne Speichern verlassen?", unsavedBody: "Ihre Änderungen auf dieser Seite sind nicht gespeichert und gehen verloren.", unsavedLeave: "Änderungen verwerfen", unsavedStay: "Weiter bearbeiten", submit: "Buchen", cancel: "Abbrechen", cancelDoc: "Stornieren", cancelDocAbort: "Nicht stornieren", cancelDocConfirmBtn: "Definitiv stornieren", cancelBooking: "Buchung stornieren", cancelBookingConfirm: "Ja, stornieren", keepBooking: "Behalten", discardDraft: "Entwurf verwerfen", keepDraft: "Behalten", discardDraftConfirm: "Verwerfen", showDiscarded: "Verworfene anzeigen", showDisabled: "Deaktivierte anzeigen", columns: "Spalten", searchPlaceholder: "Suchen…", noRecords: "Keine Einträge gefunden", active: "Aktiv", disabled: "Deaktiviert", sortByColumn: "Nach dieser Spalte sortieren", 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" }, vc = { today: "Heute", thisWeek: "Diese Woche", thisMonth: "Dieser Monat", thisQuarter: "Dieses Quartal", thisYear: "Dieses Jahr", lastMonth: "Letzter Monat", lastQuarter: "Letztes Quartal", lastYear: "Letztes Jahr", endOfThisMonth: "Ende dieses Monats", endOfLastMonth: "Ende des letzten Monats", endOfThisQuarter: "Ende dieses Quartals", endOfThisYear: "Ende dieses Jahres", endOfLastYear: "Ende des letzten Jahres" }, xc = { title: "Kontoauszug importieren", subtitle: "ISO-20022-CAMT-Kontoauszüge prüfen und ohne automatische Verbuchung importieren.", selectFiles: "CAMT-Dateien", chooseFiles: "XML- oder ZIP-Dateien auswählen", dropFiles: "XML- oder ZIP-Dateien hier ablegen", unsupportedFiles: "Es werden nur CAMT-XML- oder ZIP-Dateien unterstützt: {{files}}", fileHint: "camt.053.001.04 und camt.053.001.08 · mehrere Dateien möglich", preview: "Vorschau anzeigen", noPosting: "Vorschau und Import erzeugen keine Buchungssätze.", alreadyImported: "Bereits importiert", period: "Zeitraum", openingBalance: "Anfangssaldo", closingBalance: "Endsaldo", entries: "Buchungen", credits: "Gutschriften", debits: "Belastungen", details: "Transaktionsdetails", batches: "Sammelbuchungen", qrReferences: "QR-Referenzen", mapping: "Bankkonto-Zuordnung", selectBankAccount: "Bankkonto auswählen…", noBankAccounts: "Es wurde noch kein Bankkonto eingerichtet.", createBankAccount: "Bankkonto einrichten", mappingRequired: "Ordnen Sie vor dem Import jeden neuen Auszug einem Bankkonto zu.", import: "Kontoauszüge importieren", importComplete: "Import abgeschlossen", importCounts: "{{imported}} Buchungen importiert, {{duplicates}} Duplikate übersprungen", history: "Letzte Importe", importId: "Import", bankAccount: "Bankkonto", source: "Quelldatei", openReconciliation: "Bankabstimmung öffnen" }, kc = { title: "Bankabstimmung", subtitle: "Importierte Banktransaktionen mit Buchungen, offenen Rechnungen oder Sachkonten abstimmen.", status: "Status", unreconciled: "Nicht abgestimmt", reconciled: "Abgestimmt", transactions: "Banktransaktionen", empty: "In dieser Ansicht sind keine Banktransaktionen vorhanden.", remittance: "Zahlungsinformation", reference: "Referenz", openTransaction: "Banktransaktion öffnen", conversionRate: "Wechselkurs (1 {{currency}} in {{base}})", conversionRateHint: "Erforderlich, wenn für das Transaktionsdatum kein Wechselkurs hinterlegt ist.", existingVouchers: "Bestehende Buchungen", existingVouchersHint: "Diese eingereichten Belege enthalten eine exakt passende Bewegung auf diesem Bankkonto. Bei der Zuordnung wird nichts erneut gebucht.", match: "Zuordnen", openInvoices: "Offene Rechnungen", openInvoicesHint: "Wähle eine oder mehrere Rechnungen derselben Partei. Nach der Bestätigung wird eine Zahlung erstellt und eingereicht.", outstanding: "Offen", allocation: "Zuweisung", noInvoiceSuggestions: "Es wurde keine plausible offene Rechnung gefunden.", allocated: "{{amount}} von {{total}} zugewiesen", createPayment: "Zahlung erstellen und abstimmen", directPosting: "Auf ein Sachkonto buchen", directPostingHint: "Für Gebühren, Zinsen und andere Bewegungen ohne Rechnung. Debitoren-, Kreditoren-, Bank- und Kassenkonten sind bewusst ausgeschlossen.", counterpartyAccount: "Gegenkonto", remarks: "Bemerkung", createJournal: "Buchungssatz erstellen und abstimmen", activeMatch: "Aktive Abstimmung", undo: "Abstimmung rückgängig machen", confirmExistingTitle: "Bestehende Buchung zuordnen?", confirmExistingBody: "{{transaction}} mit {{voucher}} abstimmen? Es wird kein neuer Buchungssatz erzeugt.", confirmGroupBody: "Alle {{count}} Transaktionen über insgesamt {{amount}} mit {{voucher}} abstimmen? Es wird kein neuer Buchungssatz erzeugt.", groupedTransactions: "{{count}} gruppierte Transaktionen", confirmPaymentTitle: "Zahlung buchen und abstimmen?", confirmPaymentBody: "Damit wird für {{transaction}} eine Zahlung über {{amount}} eingereicht und auf {{count}} Rechnung(en) verteilt.", onAccountWarning: "{{amount}} bleibt als nicht zugewiesene Zahlung bei dieser Partei bestehen.", confirmJournalTitle: "Buchungssatz erstellen und abstimmen?", confirmJournalBody: "Damit werden {{amount}} für {{transaction}} gegen {{account}} gebucht.", postAndReconcile: "Buchen und abstimmen", undoTitle: "Abstimmung rückgängig machen?", undoCreatedBody: "Der durch diese Abstimmung erstellte Beleg wird storniert, seine Hauptbuchungen werden umgekehrt und Rechnungszuweisungen wiederhergestellt.", undoExistingBody: "Der bestehende Beleg wird nur von der Banktransaktion getrennt. Er bleibt eingereicht und seine Buchungen werden nicht verändert.", undoExistingGroupBody: "Alle {{count}} gruppierten Banktransaktionen ({{transactions}}) werden gemeinsam vom Beleg getrennt. Der bestehende Beleg bleibt eingereicht und seine Buchungen werden nicht verändert.", reconciledNotice: "Banktransaktion wurde abgestimmt.", groupReconciledNotice: "{{count}} Banktransaktionen wurden als Gruppe abgestimmt.", undoneNotice: "Abstimmung wurde rückgängig gemacht." }, Nc = { placeholder: "Suchen oder Feld:Wert eingeben…", search: "Suchen", addFilter: "+ Filter", availableFields: "Verfügbare Felder", fieldHelp: "Feld auswählen oder den technischen Namen mit Doppelpunkt eingeben.", field: "Feld", valueFor: "Wert für {{label}}", allFields: "Alle Felder", typeForValues: "Tippen, um Werte in diesem Feld zu finden.", noValues: "Keine passenden Werte gefunden.", noFields: "Keine passenden Felder gefunden.", useValue: "„{{value}}“ verwenden", removeFilter: "Filter {{label}} entfernen", types: { text: "Text", textarea: "Langtext", select: "Auswahl", link: "Verknüpfter Eintrag", date: "Datum", datetime: "Datum und Uhrzeit", number: "Zahl", currency: "Betrag" } }, wc = { title: "Sprache", help: "Wählen Sie die Sprache der Oberfläche. Ihre Auswahl wird in diesem Browser gespeichert.", label: "Sprache" }, Sc = { back: "Zurück", backToChat: "Zurück zum Chat", logout: "Abmelden", openMenu: "Menü öffnen", closeMenu: "Menü schließen", new: "Neu: {{label}}" }, Cc = { 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", "chart-of-accounts": "Kontenplan", "batch-stock": "Chargenbestand", "stock-detail": "Bestand nach Lagerplatz & Charge", "stock-availability": "Verfügbarkeit" }, _c = { 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" }, "bank-account": { one: "Bankkonto", other: "Bankkonten" }, 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" }, reservation: { one: "Reservation", other: "Reservationen" } }, Dc = { 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" } }, Pc = { 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", Rentals: "Vermietung" }, 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", "Bank Account": "Bankkonten", "Bank Statement Import": "Kontoauszug importieren", "Bank Reconciliation": "Bankabstimmung", 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", "Chart of Accounts": "Kontenplan", "Fleet Calendar": "Flottenkalender", "Fleet (Assets)": "Flotte (Geräte)", Reservations: "Reservationen", Menu: "Menü", "PDF Templates": "PDF-Vorlagen", Batch: "Charge", "Batch Stock": "Chargenbestand", "Storage Location": "Lagerplatz", "Stock by Location & Batch": "Bestand nach Lagerplatz & Charge", "Stock Reservation": "Bestandsreservierung", "Stock Availability": "Verfügbarkeit" } }, Ac = { 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", orContinueWith: "oder weiter mit", continueWithProvider: "Weiter mit {{provider}}", oauthError: { generic: "Anmeldung fehlgeschlagen. Bitte erneut versuchen.", email_exists: "Ein Konto mit dieser E-Mail existiert bereits. Melden Sie sich an und verknüpfen Sie diesen Anbieter in den Kontoeinstellungen.", email_unverified: "Ihr Anbieter hat keine bestätigte E-Mail übermittelt, daher ist keine Anmeldung möglich.", registration_closed: "Für diese E-Mail besteht noch kein Konto und die Registrierung ist nur per Einladung möglich.", invite_invalid: "Diese Einladung ist ungültig, bereits verwendet oder für eine andere E-Mail ausgestellt.", identity_taken: "Dieses Anbieterkonto ist bereits mit einem anderen Benutzer verknüpft.", account_disabled: "Dieses Konto wurde deaktiviert.", token_exchange_failed: "Anmeldung beim Anbieter fehlgeschlagen. Bitte erneut versuchen." } }, Tc = { 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.", setPasswordTitle: "Passwort festlegen", setPasswordBody: "Ihr Konto meldet sich mit Google an. Legen Sie ein Passwort fest, um sich auch mit E-Mail und Passwort anzumelden — ein praktischer Rückfall, falls Sie den Zugang zu Ihrem Google-Konto verlieren.", setPassword: "Passwort festlegen", passwordSet: "Passwort festgelegt.", linkedAccountsTitle: "Verknüpfte Konten", linkedAccountsBody: "Verknüpfen Sie ein Google- oder Apple-Konto, um sich ohne Passwort anzumelden.", linked: "Verknüpft", linkProvider: "{{provider}} verknüpfen", 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.", chatApiTitle: "Chat-API", apiTitle: "Programmatische API", restApiBody: "Apps und Skripten den Zugriff auf dieses ERP über REST oder MCP erlauben — mit API-Schlüsseln oder OAuth-Anmeldung. Standardmässig deaktiviert.", restApiEnabled: "Derzeit aktiviert — ausgestellte Schlüssel können /api/documents, /api/masters und die übrige REST-API aufrufen.", restApiDisabled: "Derzeit deaktiviert — die REST-API akzeptiert nur das Sitzungs-Cookie; Schlüssel werden abgewiesen.", restApiDeactivateTitle: "REST-API deaktivieren?", restApiDeactivateBody: "Der Bearer-Schlüssel-Zugriff auf die REST-API wird abgeschaltet — Konnektoren und Skripte werden abgewiesen, bis Sie ihn wieder einschalten. Die Web-App (Sitzungs-Cookie) ist nicht betroffen, und Ihre API-Schlüssel werden NICHT gelöscht: Sie funktionieren wieder, sobald Sie die API erneut aktivieren.", chatApiBody: "Externen Anwendungen erlauben, über eine HTTP-API mit dem Chat-Agenten dieses ERPs zu sprechen — per Bearer-API-Schlüssel. Standardmäßig deaktiviert.", chatApiEnabled: "Derzeit aktiviert — ausgestellte Schlüssel können POST /api/v1/chat aufrufen.", chatApiDisabled: "Derzeit deaktiviert — die API liefert 404 und Schlüssel funktionieren nicht.", chatApiDeactivateTitle: "Chat-API deaktivieren?", chatApiDeactivateBody: "Die Chat-API wird abgeschaltet — jede programmatische Anfrage (Bearer-API-Schlüssel) wird abgewiesen, bis Sie sie wieder einschalten. Ihre API-Schlüssel werden NICHT gelöscht: Sie bleiben gespeichert und funktionieren wieder, sobald Sie die API erneut aktivieren.", chatApiDeactivateConfirm: "API deaktivieren", chatApiKeysTitle: "Apps und API-Schlüssel", chatApiTokenOnce: "Kopieren Sie diesen Token jetzt — er wird nicht erneut angezeigt.", chatApiCopy: "Kopieren", chatApiDismiss: "Schließen", chatApiRevoked: "widerrufen", chatApiRevoke: "Widerrufen", chatApiNoKeys: "Noch keine Verbindungen.", chatApiName: "Name", chatApiRole: "Rolle", chatApiCreate: "Schlüssel erstellen", chatApiWarn: "Ein Key handelt mit Ihrer Identität und höchstens Ihrer Rolle — wie ein Passwort behandeln. Erst widerrufen, dann löschen.", 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", chatApiDelete: "Löschen", chatApiYourKeys: "Ihre Verbindungen", chatApiYouBadge: "Sie", chatApiUnknownUser: "Unbekannter Benutzer", chatApiAdminAllNote: "Als Administrator können Sie die Verbindungen aller Benutzer verwalten. Ihre eigenen Verbindungen stehen zuerst.", chatApiConfirmTitle: "Diese Verbindung gehört einem anderen Benutzer", chatApiConfirmRevokeBody: "«{{key}}» gehört {{name}}. Ein Widerruf trennt die App sofort. Fortfahren?", chatApiConfirmDeleteBody: "«{{key}}» gehört {{name}}. Diese widerrufene Verbindung endgültig entfernen?", chatApiPersonal: "Verbinden Sie Apps mit Ihrem ERP-Konto. Der Zugriff überschreitet niemals Ihre aktuellen Berechtigungen.", version: "Version {{version}}" }, Rc = { 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" }, Bc = { periodRange: "Berichtszeitraum: {{from}} – {{to}}", periodFrom: "Berichtszeitraum ab {{from}}", periodThrough: "Berichtszeitraum bis {{to}}", asOfDate: "Stichtag: {{date}}", 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", noBatchStock: "Kein Chargenbestand gefunden", batchMovements: "Bewegungen der Charge {{batch}} ({{item}})", withoutBatch: "ohne Charge", showMovements: "Bewegungen", expired: "abgelaufen" }, Ic = { 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." }, Lc = { "Last modified": "Zuletzt geändert", Created: "Erstellt", 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", "Amount only": "Nur Betrag", "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", Website: "Webseite", "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", "Item (type)": "Artikel (Typ)", "Asset Tag / Plate": "Kennung / Kennzeichen", "Home Yard": "Heimdepot", "Purchase Value": "Kaufwert", "Meter Reading": "Zählerstand", "Meter Unit": "Zählereinheit", Yard: "Depot", "Asset (specific unit)": "Gerät (bestimmte Einheit)", Allocation: "Zuweisung", From: "Von", To: "Bis", Purpose: "Zweck", "Purchase Date": "Kaufdatum", Notes: "Notizen", "Printed notes / terms": "Gedruckte Notizen / Konditionen", "PDF Layout": "PDF-Layout", "Intro text": "Einleitungstext", "Closing text / terms": "Schlusstext / Konditionen", Batch: "Charge", "Expiry Date": "Ablaufdatum", "Manufacturing Date": "Herstelldatum", "Batch-tracked": "Chargenpflichtig", "Has Expiry Date": "Mit Ablaufdatum", "Item starts with": "Artikel beginnt mit", "Expiring before": "Ablauf vor", Document: "Beleg", "Storage Location": "Lagerplatz", "Storage Locations": "Lagerplätze", "Source Location": "Von Lagerplatz", "Target Location": "Nach Lagerplatz", "Reserve Stock": "Bestand reservieren", "Shelf Life Exception": "Ausnahme Restlaufzeit", "Reserved Qty": "Reservierte Menge", "Sales Order Line": "Auftragsposition", "Reserved By": "Reserviert von", "Min. Shelf Life (days)": "Mindestrestlaufzeit (Tage)", Blocked: "Gesperrt", "Blocked Reason": "Sperrgrund", "In Stock": "Am Lager", Reserved: "Reserviert", Available: "Verfügbar", "Open Sales Orders": "Offene Aufträge", "On Purchase Order": "In Bestellung" }, Ec = { items: "Positionen", taxes: "Steuern", references: "Zahlungsreferenzen", accounts: "Kontobuchungen", payments: "Zahlungen", plans: "Planpositionen", monthly_distribution: "Monatliche Verteilung" }, Fc = { "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" }, Oc = { totalRevenue: "Gesamtumsatz", outstandingReceivable: "Offene Forderungen", outstandingPayable: "Offene Verbindlichkeiten", totalStockValue: "Gesamter Lagerwert", recentDocuments: "Letzte Dokumente", noRecentDocuments: "Keine aktuellen Dokumente" }, zc = { 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." }, qc = /* @__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."}},"setupTitle":"Richten Sie Ihr Unternehmen ein — KI-geführt","setupBadge":"Hier starten","setupBody":"Sagen Sie dem Assistenten, welche Art von Unternehmen Sie führen, und er erstellt Ihren Kontenplan für Sie — zugeschnitten auf Ihre Branche, mit den passenden Konten und sinnvollen Voreinstellungen. Er erklärt jede Entscheidung und legt erst dann etwas an, wenn Sie zustimmen.","setupSectors":"Zugeschnitten auf Dienstleistungen, Einzelhandel & POS, Gastronomie, Großhandel & Distribution, Import/Export, Fertigung und Bauwesen.","setupGetStarted":"Im Chat loslegen","setupManual":"Lieber ein manuelles Formular? Nutzen Sie die klassische Einrichtung.","setupManualLink":"Klassische Einrichtung","setupPrompt":"Ich möchte mein Unternehmen einrichten. Können Sie mich durch den Prozess führen?"}'), Mc = { title: "Formatierungshilfe", intro: "Der Text unter Gedruckte Notizen / Konditionen unterstützt eine einfache Formatierung im PDF:", heading: "fette Überschrift", emphasis: "kursiv / fett", rule: "horizontale Trennlinie", price: "rechtsbündiger Preis neben dem Text darüber (z. B. Monatlich | CHF 380.—)", block: "Trennen Sie Blöcke durch eine Leerzeile." }, $c = { period: "Periode", allTime: "Gesamter Zeitraum", semantics: "Bilanzkonten: Saldo per Periodenende. Erfolgskonten: Bewegung innerhalb der Periode. Konto anklicken für den Kontoauszug.", empty: "Keine Konten gefunden. Zuerst die Firmeneinrichtung abschliessen.", disabled: "deaktiviert", rootType: { Asset: "Aktiven", Liability: "Passiven", Equity: "Eigenkapital", Income: "Ertrag", Expense: "Aufwand" } }, Vc = { fleetCalendar: "Flottenkalender", yard: "Depot", machineType: "Maschinentyp", prev: "Zurück", today: "Heute", next: "Weiter", weeks: "Wochen", newBooking: "Neue Reservation", reserved: "Reserviert", onHire: "Vermietet", machine: "Maschine", loadError: "Flottenkalender konnte nicht geladen werden.", noAssets: "Keine Geräte vorhanden. Maschinen unter Vermietung → Flotte hinzufügen.", pooledNote: "{{count}} Pool-Reservation(en) noch ohne Maschinenzuordnung", unassigned: "Pool — noch nicht zugeordnet", poolWarning: "Die Pool-Kapazität ist reserviert. Eine konkrete Maschine ist noch nicht zugeordnet; vor der Ausgabe eine Maschine auswählen." }, Uc = { Unit: "Bestimmte Maschine", Pool: "Pool – Maschine später zuweisen", Available: "Verfügbar", "On Hire": "Vermietet", Out: "Ausgeliefert", Maintenance: "Wartung", Retired: "Ausgemustert", Reserved: "Reserviert", Returned: "Zurückgegeben", Cancelled: "Storniert", Customer: "Kunde", Supplier: "Lieferant" }, Kc = { asset: { item_code: "Der Artikel ist der Maschinen-TYP und trägt den Tarif; ein Gerät ist eine physische Einheit davon. Der Artikel muss is_asset_tracked = 1 haben.", asset_tag: "Kennzeichen oder Seriennummer — muss über alle Geräte eindeutig sein.", status: "Aktueller Zustand der Einheit (kein Zeitraum). Ausgemusterte Einheiten verlassen den Pool.", meter_reading: "Betriebsstunden / km." }, reservation: { item_code: "Pool-Reservation ('ein 1.7t-Bagger'): Artikel + Depot + Menge setzen. Für eine bestimmte Maschine stattdessen Gerät setzen.", asset: "Eine bestimmte Maschine buchen. Eine Einheiten-Buchung belegt auch einen Platz im Artikel+Depot-Pool.", from_datetime: "Genauer Beginn — Datum und Uhrzeit (z. B. 14:27). Ein reines Datum bedeutet 00:00.", to_datetime: "Genaues Ende. Fenster sind halboffen [von, bis): eine Miete, die um 09:00 endet, und die nächste um 09:00 beginnende, kollidieren NICHT.", pdf_template: "Wie die Reservationsbestätigung aussieht." }, quotation: { pdf_template: "Wie das PDF der Offerte aussieht. Wird beim Buchen der Offerte festgehalten.", intro_text: "Wird über den Positionen gedruckt (wo genau, bestimmt das PDF-Layout). Neue Offerten starten mit dem Standardtext aus Einstellungen → PDF-Vorlagen.", remarks: "Wird nach den Summen gedruckt (wo genau, bestimmt das PDF-Layout). Neue Offerten starten mit dem Standardtext aus Einstellungen → PDF-Vorlagen." }, "sales-order": { pdf_template: "Wie das PDF aussieht. Wird beim Buchen festgehalten.", intro_text: "Wird über den Positionen gedruckt (wo genau, bestimmt das PDF-Layout). Neue Belege starten mit dem Standardtext aus Einstellungen → PDF-Vorlagen." }, "sales-invoice": { pdf_template: "Wie das PDF aussieht. Wird beim Buchen festgehalten.", intro_text: "Wird über den Positionen gedruckt (wo genau, bestimmt das PDF-Layout). Neue Belege starten mit dem Standardtext aus Einstellungen → PDF-Vorlagen." }, "purchase-order": { pdf_template: "Wie das PDF aussieht. Wird beim Buchen festgehalten.", intro_text: "Wird über den Positionen gedruckt (wo genau, bestimmt das PDF-Layout). Neue Belege starten mit dem Standardtext aus Einstellungen → PDF-Vorlagen." }, "delivery-note": { pdf_template: "Wie das PDF aussieht. Wird beim Buchen festgehalten.", intro_text: "Wird über den Positionen gedruckt (wo genau, bestimmt das PDF-Layout). Neue Belege starten mit dem Standardtext aus Einstellungen → PDF-Vorlagen." } }, Wc = { label: "Standard-Verkaufssteuer", none: "Keine automatische Übernahme", hint: "Wird bei neuen Offerten, Aufträgen und Rechnungen übernommen, sofern keine Steuern ausdrücklich vorgegeben werden. Bestehende Belege bleiben unverändert. Mit „Speichern“ übernehmen.", saveFirst: "Firma zuerst speichern. Anschliessend können Sie eine ihrer Verkaufsteuervorlagen auswählen.", loadError: "Steuervorlagen konnten nicht geladen werden. Die gespeicherte Auswahl bleibt erhalten.", retry: "Erneut versuchen", unavailable: "Die gespeicherte Vorlage ist für diese Firma nicht als Verkaufsteuervorlage verfügbar. Bitte prüfen Sie die Auswahl.", empty: "Für diese Firma sind noch keine Verkaufsteuervorlagen hinterlegt." }, jc = { title: "App verbinden", subtitle: "Wählen Sie, wo Sie Lambda ERP nutzen möchten. Wir zeigen Ihnen die passende Einrichtung.", other: "Etwas anderes", customName: "Eigene Integration", signIn: "Anmelden", apiKey: "API-Schlüssel", access: "Zugriff", role_viewer: "Daten ansehen", role_manager: "Erstellen und bearbeiten", role_admin: "Voller administrativer Zugriff", roleHelp: "Der Zugriff ist immer durch Ihre eigenen ERP-Berechtigungen begrenzt. Wählen Sie nur, was diese App benötigt.", copied: "Kopiert", copyFailed: "Automatisches Kopieren fehlgeschlagen. Markieren und kopieren Sie den Text manuell.", retry: "Erneut versuchen", interface: "Verbindungsart", chatDisabled: "Der Chat-API-Zugriff ist deaktiviert. Ein Administrator kann ihn oben in den API-Einstellungen aktivieren.", restDisabled: "Der REST-API-/MCP-Zugriff ist deaktiviert. Ein Administrator muss ihn in den API-Einstellungen aktivieren, bevor sich diese App verbinden kann.", chatgptStep: "Öffnen Sie chatgpt.com im Browser. Wählen Sie «Plugins» in der linken Seitenleiste, klicken Sie oben rechts auf «Add» (+) und wählen Sie «Create MCP App». Geben Sie einen Namen, etwa Lambda ERP, und eine kurze Beschreibung ein.", chatgptDeveloperMode: "Falls «Create MCP App» nicht verfügbar ist, prüfen Sie unter «Settings» → «Security and login», ob «Developer mode» aktiviert ist. Ist er bereits aktiviert, gehen Sie direkt zu «Plugins». Zusätzlich können Workspace-Berechtigungen erforderlich sein.", claudeStep: "Öffnen Sie in Claude Desktop «Settings» → «Connectors» und wählen Sie «Add custom connector».", urlStep: "Fügen Sie diese Server-URL ein. Verwenden Sie die OAuth-Anmeldung; lassen Sie optionale Felder für Client-ID und Client-Secret leer.", approveStep: "Verbinden Sie die App, melden Sie sich bei Lambda ERP an und bestätigen Sie den gewünschten Zugriff.", noKeyNeeded: "Sie benötigen weder API-Schlüssel noch eigene Header. Den Zugriff wählen Sie auf der Bestätigungsseite.", officialGuide: "Einrichtungsanleitung der App öffnen", copyUrl: "Server-URL kopieren", keyReady: "Ihr Verbindungsschlüssel ist bereit", copySetup: "Einrichtung kopieren", copyHeader: "Autorisierungsheader kopieren", cliStep: "Führen Sie diesen Befehl im Terminal aus. Prüfen Sie die Verbindung anschliessend mit /mcp in Claude Code.", codexStep: "Fügen Sie diesen Eintrag Ihrer Codex-Konfiguration hinzu. Starten Sie Codex neu und prüfen Sie /mcp.", done: "Fertig — Schlüssel ausblenden", existing: "Bestehende Verbindungen", refresh: "Aktualisieren", lastUsed: "Zuletzt verwendet", notUsed: "Noch nicht verwendet", consentTitle: "Mit Lambda ERP verbinden", expired: "Diese Verbindungsanfrage fehlt oder ist abgelaufen. Starten Sie erneut in Ihrer App.", loginFirst: "Melden Sie sich bei Ihrem ERP-Konto an, um die Anfrage dieser App zu prüfen.", consentBody: "«{{app}}» möchte auf Ihr ERP zugreifen. Wählen Sie den Zugriff, den Sie erlauben möchten.", returnTo: "Nach der Bestätigung kehren Sie hierhin zurück", revokeHelp: "Sie können diese Verbindung jederzeit unter Einstellungen → API-Zugriff widerrufen.", deny: "Abbrechen", allow: "Verbindung erlauben", explain_viewer: "Die App kann ERP-Datensätze und Berichte lesen sowie Beleg-PDFs erstellen. Sie kann keine Geschäftsdaten bearbeiten.", explain_manager: "Die App kann zusätzlich Belege erstellen, bearbeiten, buchen und stornieren sowie Stammdaten aktualisieren.", explain_admin: "Die App kann alle verfügbaren ERP-Werkzeuge nutzen, einschliesslich administrativer Aktionen und dem Löschen von Stammdaten." }, Gc = { title: "Erwähnungen", note: "Interne Notiz", placeholder: "Notiz schreiben… mit @ jemanden erwähnen", colleagues: "Kolleginnen und Kollegen", loading: "Laden…", noUsers: "Keine passenden Personen", hint: "Schreibe @Name oder wähle eine Person. Im Text erwähnte Personen werden beim Speichern benachrichtigt.", remove: "Erwähnung von {{name}} entfernen", close: "Schliessen", open: "Offen", unread: "Ungelesen", done: "Erledigt", retry: "Erneut versuchen", empty: "Hier gibt es keine Erwähnungen.", mentionedYou: "hat dich erwähnt", reopen: "Wieder öffnen", markDone: "Erledigt", markUnread: "Als ungelesen markieren", markRead: "Als gelesen markieren", previous: "Zurück", next: "Weiter" }, Hc = { title: "Interne Notizen", private: "Nur für Ihr Team · wird nie gedruckt", add: "Notiz hinzufügen", placeholder: "Interne Notiz schreiben … mit @ jemanden aus dem Team benachrichtigen", save: "Notiz speichern", empty: "Noch keine internen Notizen.", edited: "bearbeitet", older: "Ältere Notizen anzeigen", printedBadge: "Erscheint auf dem PDF", count_one: "{{count}} interne Notiz", count_other: "{{count}} interne Notizen" }, Qc = { title: "Ihr Menü", intro: "Ziehen Sie Gruppen und Einträge in die gewünschte Reihenfolge, blenden Sie aus, was Sie nicht brauchen, und speichern Sie. Das ändert nur Ihr eigenes Menü: andere behalten ihres, und ausgeblendete Seiten bleiben per Link erreichbar.", chatHint: "Das geht auch im Chat, z. B. „Blende die Vermietung aus“ oder „Schiebe CRM nach oben“.", reset: "Auf Standard zurücksetzen", hide: "{{name}} ausblenden", show: "{{name}} einblenden", locked: "Immer sichtbar: Hier wird das Menü bearbeitet", drag: "{{name}} ziehen, um die Reihenfolge zu ändern (oder auswählen und Pfeiltasten nutzen)", discard: "Änderungen verwerfen", unsaved: "Nicht gespeicherte Änderungen" }, Yc = { title: "PDF-Vorlagen", intro: "Die Layouts, mit denen Belege gedruckt werden: Offerten, Aufträge, Rechnungen, Bestellungen, Lieferscheine, Sammelofferten und Reservationsbestätigungen, jeder Typ mit eigenen Vorlagen und eigenem Standard. Bearbeite eine Vorlage so oft du willst: Speichern ändert nur den Entwurf, Veröffentlichen macht ihn zum Layout der Belege. Ein gebuchter Beleg behält das Layout und das PDF, mit dem er ausgestellt wurde.", chatHint: "Du kannst auch den Chat fragen, z. B. „setz unser Logo oben rechts und nimm eine grössere Schrift in der Positionstabelle“.", new: "Neue Vorlage", newTitle: "Neue PDF-Vorlage", newBody: "Startet als Kopie von {{name}}.", copyOf: "Kopie von {{name}}", create: "Erstellen", standard: "Standard", standardDescription: "Das eingebaute Layout. Nur lesbar: dupliziere es, um das Aussehen zu ändern.", default: "Standardvorlage", builtIn: "Eingebaut", notPublished: "Nicht veröffentlicht", unpublishedChanges: "Unveröffentlichte Änderungen", archived: "Archiviert", usedBy_one: "Von {{count}} Offerte verwendet", usedBy_other: "Von {{count}} Offerten verwendet", makeDefault: "Als Standard setzen", duplicate: "Duplizieren", archive: "Archivieren", restore: "Wiederherstellen", deleteTitle: "{{name}} löschen?", deleteBody: "Keine Offerte hat diese Vorlage verwendet, es hängt also nichts davon ab.", showArchived: "Archivierte Vorlagen anzeigen", name: "Name", editHint: "Speichere so oft du willst: Es ändert sich nur der Entwurf. Veröffentliche, wenn die Vorschau stimmt; Belege drucken mit dem veröffentlichten Layout.", publish: "Veröffentlichen", revert: "Unveröffentlichte Änderungen verwerfen", revertTitle: "Unveröffentlichte Änderungen verwerfen?", revertBody: "Der Entwurf wird auf das veröffentlichte Layout zurückgesetzt.", publishedNotice: "Veröffentlicht. Geprüft mit {{document}}.", source: "HTML und CSS", lines_one: "{{count}} Zeile", lines_other: "{{count}} Zeilen", preview: "Vorschau", previewWith: "Vorschau mit Beleg", refresh: "Aktualisieren", show_draft: "Entwurf", show_live: "Veröffentlicht", previewShowsSaved: "Die Vorschau zeigt den zuletzt gespeicherten Stand.", blocked: "Nicht geladen (nur hochgeladene Dateien sind erlaubt): {{urls}}", assets_one: "Bilder und Schriften ({{count}})", assets_other: "Bilder und Schriften ({{count}})", assetsHint: 'Verweise auf eine hochgeladene Datei mit ihrem Namen, z. B. <img src="logo.png">. Links auf andere Websites werden blockiert.', upload: "Datei hochladen", versions_one: "Ausgestellte Versionen ({{count}})", versions_other: "Ausgestellte Versionen ({{count}})", versionsHint: "Eine Version entsteht, wenn ein Beleg mit einem Layout gebucht wird. Belege behalten die Version, mit der sie ausgestellt wurden.", noVersions: "Mit dieser Vorlage wurde noch keine Offerte ausgestellt.", firstUsed: "zuerst verwendet am {{date}}", reference: "Verfügbare Felder", standardEditHint: "Um dieses Layout zu ändern, dupliziere es auf der Seite", defaultOption: "Standard ({{name}})", textDefaults: "Standardtexte für Offerten", textDefaultsIntro: "Neue Offerten starten mit diesen Texten; sie lassen sich pro Offerte ändern. Eine Änderung hier ändert bestehende Offerten nicht.", textDefaultsPlaceholders: "Platzhalter, beim Drucken ersetzt: {{placeholders}}", saveTexts: "Texte speichern", textsSaved: "Gespeichert.", publishWarnings: "Hinweis: {{warnings}}", uploading: "Wird hochgeladen…", dropHint: "oder Bilder und Schriften hierher ziehen (PNG, JPG, SVG, WebP, GIF, TTF, OTF, WOFF, WOFF2)", textDefaultsFor: "Standardtexte für {{type}}", textDefaultsIntroFor: "Neue {{type}} starten mit diesen Texten; sie lassen sich pro Beleg ändern. Eine Änderung hier ändert bestehende Belege nicht.", newTitleFor: "Neue PDF-Vorlage ({{type}})", newFor: "Neue Vorlage: {{type}}", fromOtherType: "Aus Vorlage eines anderen Typs…", usedByIssued_one: "Von {{count}} gebuchten Beleg verwendet", usedByIssued_other: "Von {{count}} gebuchten Belegen verwendet" }, Jc = { pdf_intro_text_not_printed: "Das PDF-Layout «{{template}}» druckt den Einleitungstext nicht; das PDF erscheint ohne ihn.", pdf_remarks_not_printed: "Das PDF-Layout «{{template}}» druckt den Schlusstext / die Konditionen nicht; das PDF erscheint ohne sie.", pdf_line_deduction_not_printed: "Das PDF-Layout «{{template}}» druckt keine Abzüge auf Positionen; diese Positionen erscheinen nur mit dem Nettobetrag.", pdf_variable_not_printed: "Das PDF-Layout «{{template}}» druckt {{label}} nicht; das PDF erscheint ohne." }, Zc = { defaultLabel: "Abzug", add: "+ Abzug", remove: "Abzug entfernen", label: "Text des Abzugs", labelPlaceholder: "z. B. Abzüglich bereits verrechnet (Rechnung SINV-0003)", perUnit: "Abzug pro Einheit, wird unter der Position gedruckt; die Position zählt den Rest." }, Xc = {
|
|
9618
|
+
}, yc = { incomplete: "Entwurf gespeichert. Für das PDF werden Kunde, Unternehmen und mindestens ein Angebot benötigt." }, bc = { save: "Speichern", saving: "Speichern...", saved: "Gespeichert", unsavedTitle: "Ohne Speichern verlassen?", unsavedBody: "Ihre Änderungen auf dieser Seite sind nicht gespeichert und gehen verloren.", unsavedLeave: "Änderungen verwerfen", unsavedStay: "Weiter bearbeiten", submit: "Buchen", cancel: "Abbrechen", cancelDoc: "Stornieren", cancelDocAbort: "Nicht stornieren", cancelDocConfirmBtn: "Definitiv stornieren", cancelBooking: "Buchung stornieren", cancelBookingConfirm: "Ja, stornieren", keepBooking: "Behalten", discardDraft: "Entwurf verwerfen", keepDraft: "Behalten", discardDraftConfirm: "Verwerfen", showDiscarded: "Verworfene anzeigen", showDisabled: "Deaktivierte anzeigen", columns: "Spalten", searchPlaceholder: "Suchen…", noRecords: "Keine Einträge gefunden", active: "Aktiv", disabled: "Deaktiviert", sortByColumn: "Nach dieser Spalte sortieren", 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" }, vc = { today: "Heute", thisWeek: "Diese Woche", thisMonth: "Dieser Monat", thisQuarter: "Dieses Quartal", thisYear: "Dieses Jahr", lastMonth: "Letzter Monat", lastQuarter: "Letztes Quartal", lastYear: "Letztes Jahr", endOfThisMonth: "Ende dieses Monats", endOfLastMonth: "Ende des letzten Monats", endOfThisQuarter: "Ende dieses Quartals", endOfThisYear: "Ende dieses Jahres", endOfLastYear: "Ende des letzten Jahres" }, xc = { title: "Kontoauszug importieren", subtitle: "ISO-20022-CAMT-Kontoauszüge prüfen und ohne automatische Verbuchung importieren.", selectFiles: "CAMT-Dateien", chooseFiles: "XML- oder ZIP-Dateien auswählen", dropFiles: "XML- oder ZIP-Dateien hier ablegen", unsupportedFiles: "Es werden nur CAMT-XML- oder ZIP-Dateien unterstützt: {{files}}", fileHint: "camt.053.001.04 und camt.053.001.08 · mehrere Dateien möglich", preview: "Vorschau anzeigen", noPosting: "Vorschau und Import erzeugen keine Buchungssätze.", alreadyImported: "Bereits importiert", period: "Zeitraum", openingBalance: "Anfangssaldo", closingBalance: "Endsaldo", entries: "Buchungen", credits: "Gutschriften", debits: "Belastungen", details: "Transaktionsdetails", batches: "Sammelbuchungen", qrReferences: "QR-Referenzen", mapping: "Bankkonto-Zuordnung", selectBankAccount: "Bankkonto auswählen…", noBankAccounts: "Es wurde noch kein Bankkonto eingerichtet.", createBankAccount: "Bankkonto einrichten", mappingRequired: "Ordnen Sie vor dem Import jeden neuen Auszug einem Bankkonto zu.", import: "Kontoauszüge importieren", importComplete: "Import abgeschlossen", importCounts: "{{imported}} Buchungen importiert, {{duplicates}} Duplikate übersprungen", history: "Letzte Importe", importId: "Import", bankAccount: "Bankkonto", source: "Quelldatei", openReconciliation: "Bankabstimmung öffnen" }, kc = { title: "Bankabstimmung", subtitle: "Importierte Banktransaktionen mit Buchungen, offenen Rechnungen oder Sachkonten abstimmen.", status: "Status", unreconciled: "Nicht abgestimmt", reconciled: "Abgestimmt", transactions: "Banktransaktionen", empty: "In dieser Ansicht sind keine Banktransaktionen vorhanden.", remittance: "Zahlungsinformation", reference: "Referenz", openTransaction: "Banktransaktion öffnen", conversionRate: "Wechselkurs (1 {{currency}} in {{base}})", conversionRateHint: "Erforderlich, wenn für das Transaktionsdatum kein Wechselkurs hinterlegt ist.", existingVouchers: "Bestehende Buchungen", existingVouchersHint: "Diese eingereichten Belege enthalten eine exakt passende Bewegung auf diesem Bankkonto. Bei der Zuordnung wird nichts erneut gebucht.", match: "Zuordnen", openInvoices: "Offene Rechnungen", openInvoicesHint: "Wähle eine oder mehrere Rechnungen derselben Partei. Nach der Bestätigung wird eine Zahlung erstellt und eingereicht.", outstanding: "Offen", allocation: "Zuweisung", noInvoiceSuggestions: "Es wurde keine plausible offene Rechnung gefunden.", allocated: "{{amount}} von {{total}} zugewiesen", createPayment: "Zahlung erstellen und abstimmen", directPosting: "Auf ein Sachkonto buchen", directPostingHint: "Für Gebühren, Zinsen und andere Bewegungen ohne Rechnung. Debitoren-, Kreditoren-, Bank- und Kassenkonten sind bewusst ausgeschlossen.", counterpartyAccount: "Gegenkonto", remarks: "Bemerkung", createJournal: "Buchungssatz erstellen und abstimmen", activeMatch: "Aktive Abstimmung", undo: "Abstimmung rückgängig machen", confirmExistingTitle: "Bestehende Buchung zuordnen?", confirmExistingBody: "{{transaction}} mit {{voucher}} abstimmen? Es wird kein neuer Buchungssatz erzeugt.", confirmGroupBody: "Alle {{count}} Transaktionen über insgesamt {{amount}} mit {{voucher}} abstimmen? Es wird kein neuer Buchungssatz erzeugt.", groupedTransactions: "{{count}} gruppierte Transaktionen", confirmPaymentTitle: "Zahlung buchen und abstimmen?", confirmPaymentBody: "Damit wird für {{transaction}} eine Zahlung über {{amount}} eingereicht und auf {{count}} Rechnung(en) verteilt.", onAccountWarning: "{{amount}} bleibt als nicht zugewiesene Zahlung bei dieser Partei bestehen.", confirmJournalTitle: "Buchungssatz erstellen und abstimmen?", confirmJournalBody: "Damit werden {{amount}} für {{transaction}} gegen {{account}} gebucht.", postAndReconcile: "Buchen und abstimmen", undoTitle: "Abstimmung rückgängig machen?", undoCreatedBody: "Der durch diese Abstimmung erstellte Beleg wird storniert, seine Hauptbuchungen werden umgekehrt und Rechnungszuweisungen wiederhergestellt.", undoExistingBody: "Der bestehende Beleg wird nur von der Banktransaktion getrennt. Er bleibt eingereicht und seine Buchungen werden nicht verändert.", undoExistingGroupBody: "Alle {{count}} gruppierten Banktransaktionen ({{transactions}}) werden gemeinsam vom Beleg getrennt. Der bestehende Beleg bleibt eingereicht und seine Buchungen werden nicht verändert.", reconciledNotice: "Banktransaktion wurde abgestimmt.", groupReconciledNotice: "{{count}} Banktransaktionen wurden als Gruppe abgestimmt.", undoneNotice: "Abstimmung wurde rückgängig gemacht." }, Nc = { placeholder: "Suchen oder Feld:Wert eingeben…", search: "Suchen", addFilter: "+ Filter", availableFields: "Verfügbare Felder", fieldHelp: "Feld auswählen oder den technischen Namen mit Doppelpunkt eingeben.", field: "Feld", valueFor: "Wert für {{label}}", allFields: "Alle Felder", typeForValues: "Tippen, um Werte in diesem Feld zu finden.", noValues: "Keine passenden Werte gefunden.", noFields: "Keine passenden Felder gefunden.", useValue: "„{{value}}“ verwenden", removeFilter: "Filter {{label}} entfernen", types: { text: "Text", textarea: "Langtext", select: "Auswahl", link: "Verknüpfter Eintrag", date: "Datum", datetime: "Datum und Uhrzeit", number: "Zahl", currency: "Betrag" } }, wc = { title: "Sprache", help: "Wählen Sie die Sprache der Oberfläche. Ihre Auswahl wird in diesem Browser gespeichert.", label: "Sprache" }, Sc = { back: "Zurück", backToChat: "Zurück zum Chat", logout: "Abmelden", openMenu: "Menü öffnen", closeMenu: "Menü schließen", new: "Neu: {{label}}" }, Cc = { 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", "chart-of-accounts": "Kontenplan", "batch-stock": "Chargenbestand", "stock-detail": "Bestand nach Lagerplatz & Charge", "stock-availability": "Verfügbarkeit" }, _c = { 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" }, "bank-account": { one: "Bankkonto", other: "Bankkonten" }, 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" }, reservation: { one: "Reservation", other: "Reservationen" } }, Dc = { 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" } }, Pc = { 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", Rentals: "Vermietung" }, 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", "Bank Account": "Bankkonten", "Bank Statement Import": "Kontoauszug importieren", "Bank Reconciliation": "Bankabstimmung", 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", "Chart of Accounts": "Kontenplan", "Fleet Calendar": "Flottenkalender", "Fleet (Assets)": "Flotte (Geräte)", Reservations: "Reservationen", Menu: "Menü", "PDF Templates": "PDF-Vorlagen", Batch: "Charge", "Batch Stock": "Chargenbestand", "Storage Location": "Lagerplatz", "Stock by Location & Batch": "Bestand nach Lagerplatz & Charge", "Stock Reservation": "Bestandsreservierung", "Stock Availability": "Verfügbarkeit" } }, Ac = { 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", orContinueWith: "oder weiter mit", continueWithProvider: "Weiter mit {{provider}}", oauthError: { generic: "Anmeldung fehlgeschlagen. Bitte erneut versuchen.", email_exists: "Ein Konto mit dieser E-Mail existiert bereits. Melden Sie sich an und verknüpfen Sie diesen Anbieter in den Kontoeinstellungen.", email_unverified: "Ihr Anbieter hat keine bestätigte E-Mail übermittelt, daher ist keine Anmeldung möglich.", registration_closed: "Für diese E-Mail besteht noch kein Konto und die Registrierung ist nur per Einladung möglich.", invite_invalid: "Diese Einladung ist ungültig, bereits verwendet oder für eine andere E-Mail ausgestellt.", identity_taken: "Dieses Anbieterkonto ist bereits mit einem anderen Benutzer verknüpft.", account_disabled: "Dieses Konto wurde deaktiviert.", token_exchange_failed: "Anmeldung beim Anbieter fehlgeschlagen. Bitte erneut versuchen." } }, Tc = { 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.", setPasswordTitle: "Passwort festlegen", setPasswordBody: "Ihr Konto meldet sich mit Google an. Legen Sie ein Passwort fest, um sich auch mit E-Mail und Passwort anzumelden — ein praktischer Rückfall, falls Sie den Zugang zu Ihrem Google-Konto verlieren.", setPassword: "Passwort festlegen", passwordSet: "Passwort festgelegt.", linkedAccountsTitle: "Verknüpfte Konten", linkedAccountsBody: "Verknüpfen Sie ein Google- oder Apple-Konto, um sich ohne Passwort anzumelden.", linked: "Verknüpft", linkProvider: "{{provider}} verknüpfen", 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.", chatApiTitle: "Chat-API", apiTitle: "Programmatische API", restApiBody: "Apps und Skripten den Zugriff auf dieses ERP über REST oder MCP erlauben — mit API-Schlüsseln oder OAuth-Anmeldung. Standardmässig deaktiviert.", restApiEnabled: "Derzeit aktiviert — ausgestellte Schlüssel können /api/documents, /api/masters und die übrige REST-API aufrufen.", restApiDisabled: "Derzeit deaktiviert — die REST-API akzeptiert nur das Sitzungs-Cookie; Schlüssel werden abgewiesen.", restApiDeactivateTitle: "REST-API deaktivieren?", restApiDeactivateBody: "Der Bearer-Schlüssel-Zugriff auf die REST-API wird abgeschaltet — Konnektoren und Skripte werden abgewiesen, bis Sie ihn wieder einschalten. Die Web-App (Sitzungs-Cookie) ist nicht betroffen, und Ihre API-Schlüssel werden NICHT gelöscht: Sie funktionieren wieder, sobald Sie die API erneut aktivieren.", chatApiBody: "Externen Anwendungen erlauben, über eine HTTP-API mit dem Chat-Agenten dieses ERPs zu sprechen — per Bearer-API-Schlüssel. Standardmäßig deaktiviert.", chatApiEnabled: "Derzeit aktiviert — ausgestellte Schlüssel können POST /api/v1/chat aufrufen.", chatApiDisabled: "Derzeit deaktiviert — die API liefert 404 und Schlüssel funktionieren nicht.", chatApiDeactivateTitle: "Chat-API deaktivieren?", chatApiDeactivateBody: "Die Chat-API wird abgeschaltet — jede programmatische Anfrage (Bearer-API-Schlüssel) wird abgewiesen, bis Sie sie wieder einschalten. Ihre API-Schlüssel werden NICHT gelöscht: Sie bleiben gespeichert und funktionieren wieder, sobald Sie die API erneut aktivieren.", chatApiDeactivateConfirm: "API deaktivieren", chatApiKeysTitle: "Apps und API-Schlüssel", chatApiTokenOnce: "Kopieren Sie diesen Token jetzt — er wird nicht erneut angezeigt.", chatApiCopy: "Kopieren", chatApiDismiss: "Schließen", chatApiRevoked: "widerrufen", chatApiRevoke: "Widerrufen", chatApiNoKeys: "Noch keine Verbindungen.", chatApiName: "Name", chatApiRole: "Rolle", chatApiCreate: "Schlüssel erstellen", chatApiWarn: "Ein Key handelt mit Ihrer Identität und höchstens Ihrer Rolle — wie ein Passwort behandeln. Erst widerrufen, dann löschen.", 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", chatApiDelete: "Löschen", chatApiYourKeys: "Ihre Verbindungen", chatApiYouBadge: "Sie", chatApiUnknownUser: "Unbekannter Benutzer", chatApiAdminAllNote: "Als Administrator können Sie die Verbindungen aller Benutzer verwalten. Ihre eigenen Verbindungen stehen zuerst.", chatApiConfirmTitle: "Diese Verbindung gehört einem anderen Benutzer", chatApiConfirmRevokeBody: "«{{key}}» gehört {{name}}. Ein Widerruf trennt die App sofort. Fortfahren?", chatApiConfirmDeleteBody: "«{{key}}» gehört {{name}}. Diese widerrufene Verbindung endgültig entfernen?", chatApiPersonal: "Verbinden Sie Apps mit Ihrem ERP-Konto. Der Zugriff überschreitet niemals Ihre aktuellen Berechtigungen.", version: "Version {{version}}" }, Rc = { 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" }, Bc = { periodRange: "Berichtszeitraum: {{from}} – {{to}}", periodFrom: "Berichtszeitraum ab {{from}}", periodThrough: "Berichtszeitraum bis {{to}}", asOfDate: "Stichtag: {{date}}", 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", noBatchStock: "Kein Chargenbestand gefunden", batchMovements: "Bewegungen der Charge {{batch}} ({{item}})", withoutBatch: "ohne Charge", showMovements: "Bewegungen", expired: "abgelaufen" }, Ic = { 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." }, Lc = { "Last modified": "Zuletzt geändert", Created: "Erstellt", 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", "Amount only": "Nur Betrag", "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", Website: "Webseite", "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", "Item (type)": "Artikel (Typ)", "Asset Tag / Plate": "Kennung / Kennzeichen", "Home Yard": "Heimdepot", "Purchase Value": "Kaufwert", "Meter Reading": "Zählerstand", "Meter Unit": "Zählereinheit", Yard: "Depot", "Asset (specific unit)": "Gerät (bestimmte Einheit)", Allocation: "Zuweisung", From: "Von", To: "Bis", Purpose: "Zweck", "Purchase Date": "Kaufdatum", Notes: "Notizen", "Printed notes / terms": "Gedruckte Notizen / Konditionen", "PDF Layout": "PDF-Layout", "Intro text": "Einleitungstext", "Closing text / terms": "Schlusstext / Konditionen", Batch: "Charge", "Expiry Date": "Ablaufdatum", "Manufacturing Date": "Herstelldatum", "Batch-tracked": "Chargenpflichtig", "Has Expiry Date": "Mit Ablaufdatum", "Item starts with": "Artikel beginnt mit", "Expiring before": "Ablauf vor", Document: "Beleg", "Storage Location": "Lagerplatz", "Storage Locations": "Lagerplätze", "Source Location": "Von Lagerplatz", "Target Location": "Nach Lagerplatz", "Reserve Stock": "Bestand reservieren", "Shelf Life Exception": "Ausnahme Restlaufzeit", "Reserved Qty": "Reservierte Menge", "Sales Order Line": "Auftragsposition", "Reserved By": "Reserviert von", "Min. Shelf Life (days)": "Mindestrestlaufzeit (Tage)", Blocked: "Gesperrt", "Blocked Reason": "Sperrgrund", "In Stock": "Am Lager", Reserved: "Reserviert", Available: "Verfügbar", "Open Sales Orders": "Offene Aufträge", "On Purchase Order": "In Bestellung", "Price Source": "Preisquelle", "Apply On Value": "Wert zu „Anwenden auf“", "Applicable For Value": "Wert zu „Gilt für“" }, Ec = { items: "Positionen", taxes: "Steuern", references: "Zahlungsreferenzen", accounts: "Kontobuchungen", payments: "Zahlungen", plans: "Planpositionen", monthly_distribution: "Monatliche Verteilung" }, Fc = { "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" }, Oc = { totalRevenue: "Gesamtumsatz", outstandingReceivable: "Offene Forderungen", outstandingPayable: "Offene Verbindlichkeiten", totalStockValue: "Gesamter Lagerwert", recentDocuments: "Letzte Dokumente", noRecentDocuments: "Keine aktuellen Dokumente" }, zc = { 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." }, qc = /* @__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."}},"setupTitle":"Richten Sie Ihr Unternehmen ein — KI-geführt","setupBadge":"Hier starten","setupBody":"Sagen Sie dem Assistenten, welche Art von Unternehmen Sie führen, und er erstellt Ihren Kontenplan für Sie — zugeschnitten auf Ihre Branche, mit den passenden Konten und sinnvollen Voreinstellungen. Er erklärt jede Entscheidung und legt erst dann etwas an, wenn Sie zustimmen.","setupSectors":"Zugeschnitten auf Dienstleistungen, Einzelhandel & POS, Gastronomie, Großhandel & Distribution, Import/Export, Fertigung und Bauwesen.","setupGetStarted":"Im Chat loslegen","setupManual":"Lieber ein manuelles Formular? Nutzen Sie die klassische Einrichtung.","setupManualLink":"Klassische Einrichtung","setupPrompt":"Ich möchte mein Unternehmen einrichten. Können Sie mich durch den Prozess führen?"}'), Mc = { title: "Formatierungshilfe", intro: "Der Text unter Gedruckte Notizen / Konditionen unterstützt eine einfache Formatierung im PDF:", heading: "fette Überschrift", emphasis: "kursiv / fett", rule: "horizontale Trennlinie", price: "rechtsbündiger Preis neben dem Text darüber (z. B. Monatlich | CHF 380.—)", block: "Trennen Sie Blöcke durch eine Leerzeile." }, $c = { period: "Periode", allTime: "Gesamter Zeitraum", semantics: "Bilanzkonten: Saldo per Periodenende. Erfolgskonten: Bewegung innerhalb der Periode. Konto anklicken für den Kontoauszug.", empty: "Keine Konten gefunden. Zuerst die Firmeneinrichtung abschliessen.", disabled: "deaktiviert", rootType: { Asset: "Aktiven", Liability: "Passiven", Equity: "Eigenkapital", Income: "Ertrag", Expense: "Aufwand" } }, Vc = { fleetCalendar: "Flottenkalender", yard: "Depot", machineType: "Maschinentyp", prev: "Zurück", today: "Heute", next: "Weiter", weeks: "Wochen", newBooking: "Neue Reservation", reserved: "Reserviert", onHire: "Vermietet", machine: "Maschine", loadError: "Flottenkalender konnte nicht geladen werden.", noAssets: "Keine Geräte vorhanden. Maschinen unter Vermietung → Flotte hinzufügen.", pooledNote: "{{count}} Pool-Reservation(en) noch ohne Maschinenzuordnung", unassigned: "Pool — noch nicht zugeordnet", poolWarning: "Die Pool-Kapazität ist reserviert. Eine konkrete Maschine ist noch nicht zugeordnet; vor der Ausgabe eine Maschine auswählen." }, Uc = { Unit: "Bestimmte Maschine", Pool: "Pool – Maschine später zuweisen", Available: "Verfügbar", "On Hire": "Vermietet", Out: "Ausgeliefert", Maintenance: "Wartung", Retired: "Ausgemustert", Reserved: "Reserviert", Returned: "Zurückgegeben", Cancelled: "Storniert", Customer: "Kunde", Supplier: "Lieferant" }, Kc = { asset: { item_code: "Der Artikel ist der Maschinen-TYP und trägt den Tarif; ein Gerät ist eine physische Einheit davon. Der Artikel muss is_asset_tracked = 1 haben.", asset_tag: "Kennzeichen oder Seriennummer — muss über alle Geräte eindeutig sein.", status: "Aktueller Zustand der Einheit (kein Zeitraum). Ausgemusterte Einheiten verlassen den Pool.", meter_reading: "Betriebsstunden / km." }, reservation: { item_code: "Pool-Reservation ('ein 1.7t-Bagger'): Artikel + Depot + Menge setzen. Für eine bestimmte Maschine stattdessen Gerät setzen.", asset: "Eine bestimmte Maschine buchen. Eine Einheiten-Buchung belegt auch einen Platz im Artikel+Depot-Pool.", from_datetime: "Genauer Beginn — Datum und Uhrzeit (z. B. 14:27). Ein reines Datum bedeutet 00:00.", to_datetime: "Genaues Ende. Fenster sind halboffen [von, bis): eine Miete, die um 09:00 endet, und die nächste um 09:00 beginnende, kollidieren NICHT.", pdf_template: "Wie die Reservationsbestätigung aussieht." }, quotation: { pdf_template: "Wie das PDF der Offerte aussieht. Wird beim Buchen der Offerte festgehalten.", intro_text: "Wird über den Positionen gedruckt (wo genau, bestimmt das PDF-Layout). Neue Offerten starten mit dem Standardtext aus Einstellungen → PDF-Vorlagen.", remarks: "Wird nach den Summen gedruckt (wo genau, bestimmt das PDF-Layout). Neue Offerten starten mit dem Standardtext aus Einstellungen → PDF-Vorlagen." }, "sales-order": { pdf_template: "Wie das PDF aussieht. Wird beim Buchen festgehalten.", intro_text: "Wird über den Positionen gedruckt (wo genau, bestimmt das PDF-Layout). Neue Belege starten mit dem Standardtext aus Einstellungen → PDF-Vorlagen." }, "sales-invoice": { pdf_template: "Wie das PDF aussieht. Wird beim Buchen festgehalten.", intro_text: "Wird über den Positionen gedruckt (wo genau, bestimmt das PDF-Layout). Neue Belege starten mit dem Standardtext aus Einstellungen → PDF-Vorlagen." }, "purchase-order": { pdf_template: "Wie das PDF aussieht. Wird beim Buchen festgehalten.", intro_text: "Wird über den Positionen gedruckt (wo genau, bestimmt das PDF-Layout). Neue Belege starten mit dem Standardtext aus Einstellungen → PDF-Vorlagen." }, "delivery-note": { pdf_template: "Wie das PDF aussieht. Wird beim Buchen festgehalten.", intro_text: "Wird über den Positionen gedruckt (wo genau, bestimmt das PDF-Layout). Neue Belege starten mit dem Standardtext aus Einstellungen → PDF-Vorlagen." } }, Wc = { label: "Standard-Verkaufssteuer", none: "Keine automatische Übernahme", hint: "Wird bei neuen Offerten, Aufträgen und Rechnungen übernommen, sofern keine Steuern ausdrücklich vorgegeben werden. Bestehende Belege bleiben unverändert. Mit „Speichern“ übernehmen.", saveFirst: "Firma zuerst speichern. Anschliessend können Sie eine ihrer Verkaufsteuervorlagen auswählen.", loadError: "Steuervorlagen konnten nicht geladen werden. Die gespeicherte Auswahl bleibt erhalten.", retry: "Erneut versuchen", unavailable: "Die gespeicherte Vorlage ist für diese Firma nicht als Verkaufsteuervorlage verfügbar. Bitte prüfen Sie die Auswahl.", empty: "Für diese Firma sind noch keine Verkaufsteuervorlagen hinterlegt." }, jc = { title: "App verbinden", subtitle: "Wählen Sie, wo Sie Lambda ERP nutzen möchten. Wir zeigen Ihnen die passende Einrichtung.", other: "Etwas anderes", customName: "Eigene Integration", signIn: "Anmelden", apiKey: "API-Schlüssel", access: "Zugriff", role_viewer: "Daten ansehen", role_manager: "Erstellen und bearbeiten", role_admin: "Voller administrativer Zugriff", roleHelp: "Der Zugriff ist immer durch Ihre eigenen ERP-Berechtigungen begrenzt. Wählen Sie nur, was diese App benötigt.", copied: "Kopiert", copyFailed: "Automatisches Kopieren fehlgeschlagen. Markieren und kopieren Sie den Text manuell.", retry: "Erneut versuchen", interface: "Verbindungsart", chatDisabled: "Der Chat-API-Zugriff ist deaktiviert. Ein Administrator kann ihn oben in den API-Einstellungen aktivieren.", restDisabled: "Der REST-API-/MCP-Zugriff ist deaktiviert. Ein Administrator muss ihn in den API-Einstellungen aktivieren, bevor sich diese App verbinden kann.", chatgptStep: "Öffnen Sie chatgpt.com im Browser. Wählen Sie «Plugins» in der linken Seitenleiste, klicken Sie oben rechts auf «Add» (+) und wählen Sie «Create MCP App». Geben Sie einen Namen, etwa Lambda ERP, und eine kurze Beschreibung ein.", chatgptDeveloperMode: "Falls «Create MCP App» nicht verfügbar ist, prüfen Sie unter «Settings» → «Security and login», ob «Developer mode» aktiviert ist. Ist er bereits aktiviert, gehen Sie direkt zu «Plugins». Zusätzlich können Workspace-Berechtigungen erforderlich sein.", claudeStep: "Öffnen Sie in Claude Desktop «Settings» → «Connectors» und wählen Sie «Add custom connector».", urlStep: "Fügen Sie diese Server-URL ein. Verwenden Sie die OAuth-Anmeldung; lassen Sie optionale Felder für Client-ID und Client-Secret leer.", approveStep: "Verbinden Sie die App, melden Sie sich bei Lambda ERP an und bestätigen Sie den gewünschten Zugriff.", noKeyNeeded: "Sie benötigen weder API-Schlüssel noch eigene Header. Den Zugriff wählen Sie auf der Bestätigungsseite.", officialGuide: "Einrichtungsanleitung der App öffnen", copyUrl: "Server-URL kopieren", keyReady: "Ihr Verbindungsschlüssel ist bereit", copySetup: "Einrichtung kopieren", copyHeader: "Autorisierungsheader kopieren", cliStep: "Führen Sie diesen Befehl im Terminal aus. Prüfen Sie die Verbindung anschliessend mit /mcp in Claude Code.", codexStep: "Fügen Sie diesen Eintrag Ihrer Codex-Konfiguration hinzu. Starten Sie Codex neu und prüfen Sie /mcp.", done: "Fertig — Schlüssel ausblenden", existing: "Bestehende Verbindungen", refresh: "Aktualisieren", lastUsed: "Zuletzt verwendet", notUsed: "Noch nicht verwendet", consentTitle: "Mit Lambda ERP verbinden", expired: "Diese Verbindungsanfrage fehlt oder ist abgelaufen. Starten Sie erneut in Ihrer App.", loginFirst: "Melden Sie sich bei Ihrem ERP-Konto an, um die Anfrage dieser App zu prüfen.", consentBody: "«{{app}}» möchte auf Ihr ERP zugreifen. Wählen Sie den Zugriff, den Sie erlauben möchten.", returnTo: "Nach der Bestätigung kehren Sie hierhin zurück", revokeHelp: "Sie können diese Verbindung jederzeit unter Einstellungen → API-Zugriff widerrufen.", deny: "Abbrechen", allow: "Verbindung erlauben", explain_viewer: "Die App kann ERP-Datensätze und Berichte lesen sowie Beleg-PDFs erstellen. Sie kann keine Geschäftsdaten bearbeiten.", explain_manager: "Die App kann zusätzlich Belege erstellen, bearbeiten, buchen und stornieren sowie Stammdaten aktualisieren.", explain_admin: "Die App kann alle verfügbaren ERP-Werkzeuge nutzen, einschliesslich administrativer Aktionen und dem Löschen von Stammdaten." }, Gc = { title: "Erwähnungen", note: "Interne Notiz", placeholder: "Notiz schreiben… mit @ jemanden erwähnen", colleagues: "Kolleginnen und Kollegen", loading: "Laden…", noUsers: "Keine passenden Personen", hint: "Schreibe @Name oder wähle eine Person. Im Text erwähnte Personen werden beim Speichern benachrichtigt.", remove: "Erwähnung von {{name}} entfernen", close: "Schliessen", open: "Offen", unread: "Ungelesen", done: "Erledigt", retry: "Erneut versuchen", empty: "Hier gibt es keine Erwähnungen.", mentionedYou: "hat dich erwähnt", reopen: "Wieder öffnen", markDone: "Erledigt", markUnread: "Als ungelesen markieren", markRead: "Als gelesen markieren", previous: "Zurück", next: "Weiter" }, Hc = { title: "Interne Notizen", private: "Nur für Ihr Team · wird nie gedruckt", add: "Notiz hinzufügen", placeholder: "Interne Notiz schreiben … mit @ jemanden aus dem Team benachrichtigen", save: "Notiz speichern", empty: "Noch keine internen Notizen.", edited: "bearbeitet", older: "Ältere Notizen anzeigen", printedBadge: "Erscheint auf dem PDF", count_one: "{{count}} interne Notiz", count_other: "{{count}} interne Notizen" }, Qc = { title: "Ihr Menü", intro: "Ziehen Sie Gruppen und Einträge in die gewünschte Reihenfolge, blenden Sie aus, was Sie nicht brauchen, und speichern Sie. Das ändert nur Ihr eigenes Menü: andere behalten ihres, und ausgeblendete Seiten bleiben per Link erreichbar.", chatHint: "Das geht auch im Chat, z. B. „Blende die Vermietung aus“ oder „Schiebe CRM nach oben“.", reset: "Auf Standard zurücksetzen", hide: "{{name}} ausblenden", show: "{{name}} einblenden", locked: "Immer sichtbar: Hier wird das Menü bearbeitet", drag: "{{name}} ziehen, um die Reihenfolge zu ändern (oder auswählen und Pfeiltasten nutzen)", discard: "Änderungen verwerfen", unsaved: "Nicht gespeicherte Änderungen" }, Yc = { title: "PDF-Vorlagen", intro: "Die Layouts, mit denen Belege gedruckt werden: Offerten, Aufträge, Rechnungen, Bestellungen, Lieferscheine, Sammelofferten und Reservationsbestätigungen, jeder Typ mit eigenen Vorlagen und eigenem Standard. Bearbeite eine Vorlage so oft du willst: Speichern ändert nur den Entwurf, Veröffentlichen macht ihn zum Layout der Belege. Ein gebuchter Beleg behält das Layout und das PDF, mit dem er ausgestellt wurde.", chatHint: "Du kannst auch den Chat fragen, z. B. „setz unser Logo oben rechts und nimm eine grössere Schrift in der Positionstabelle“.", new: "Neue Vorlage", newTitle: "Neue PDF-Vorlage", newBody: "Startet als Kopie von {{name}}.", copyOf: "Kopie von {{name}}", create: "Erstellen", standard: "Standard", standardDescription: "Das eingebaute Layout. Nur lesbar: dupliziere es, um das Aussehen zu ändern.", default: "Standardvorlage", builtIn: "Eingebaut", notPublished: "Nicht veröffentlicht", unpublishedChanges: "Unveröffentlichte Änderungen", archived: "Archiviert", usedBy_one: "Von {{count}} Offerte verwendet", usedBy_other: "Von {{count}} Offerten verwendet", makeDefault: "Als Standard setzen", duplicate: "Duplizieren", archive: "Archivieren", restore: "Wiederherstellen", deleteTitle: "{{name}} löschen?", deleteBody: "Keine Offerte hat diese Vorlage verwendet, es hängt also nichts davon ab.", showArchived: "Archivierte Vorlagen anzeigen", name: "Name", editHint: "Speichere so oft du willst: Es ändert sich nur der Entwurf. Veröffentliche, wenn die Vorschau stimmt; Belege drucken mit dem veröffentlichten Layout.", publish: "Veröffentlichen", revert: "Unveröffentlichte Änderungen verwerfen", revertTitle: "Unveröffentlichte Änderungen verwerfen?", revertBody: "Der Entwurf wird auf das veröffentlichte Layout zurückgesetzt.", publishedNotice: "Veröffentlicht. Geprüft mit {{document}}.", source: "HTML und CSS", lines_one: "{{count}} Zeile", lines_other: "{{count}} Zeilen", preview: "Vorschau", previewWith: "Vorschau mit Beleg", refresh: "Aktualisieren", show_draft: "Entwurf", show_live: "Veröffentlicht", previewShowsSaved: "Die Vorschau zeigt den zuletzt gespeicherten Stand.", blocked: "Nicht geladen (nur hochgeladene Dateien sind erlaubt): {{urls}}", assets_one: "Bilder und Schriften ({{count}})", assets_other: "Bilder und Schriften ({{count}})", assetsHint: 'Verweise auf eine hochgeladene Datei mit ihrem Namen, z. B. <img src="logo.png">. Links auf andere Websites werden blockiert.', upload: "Datei hochladen", versions_one: "Ausgestellte Versionen ({{count}})", versions_other: "Ausgestellte Versionen ({{count}})", versionsHint: "Eine Version entsteht, wenn ein Beleg mit einem Layout gebucht wird. Belege behalten die Version, mit der sie ausgestellt wurden.", noVersions: "Mit dieser Vorlage wurde noch keine Offerte ausgestellt.", firstUsed: "zuerst verwendet am {{date}}", reference: "Verfügbare Felder", standardEditHint: "Um dieses Layout zu ändern, dupliziere es auf der Seite", defaultOption: "Standard ({{name}})", textDefaults: "Standardtexte für Offerten", textDefaultsIntro: "Neue Offerten starten mit diesen Texten; sie lassen sich pro Offerte ändern. Eine Änderung hier ändert bestehende Offerten nicht.", textDefaultsPlaceholders: "Platzhalter, beim Drucken ersetzt: {{placeholders}}", saveTexts: "Texte speichern", textsSaved: "Gespeichert.", publishWarnings: "Hinweis: {{warnings}}", uploading: "Wird hochgeladen…", dropHint: "oder Bilder und Schriften hierher ziehen (PNG, JPG, SVG, WebP, GIF, TTF, OTF, WOFF, WOFF2)", textDefaultsFor: "Standardtexte für {{type}}", textDefaultsIntroFor: "Neue {{type}} starten mit diesen Texten; sie lassen sich pro Beleg ändern. Eine Änderung hier ändert bestehende Belege nicht.", newTitleFor: "Neue PDF-Vorlage ({{type}})", newFor: "Neue Vorlage: {{type}}", fromOtherType: "Aus Vorlage eines anderen Typs…", usedByIssued_one: "Von {{count}} gebuchten Beleg verwendet", usedByIssued_other: "Von {{count}} gebuchten Belegen verwendet" }, Jc = { pdf_intro_text_not_printed: "Das PDF-Layout «{{template}}» druckt den Einleitungstext nicht; das PDF erscheint ohne ihn.", pdf_remarks_not_printed: "Das PDF-Layout «{{template}}» druckt den Schlusstext / die Konditionen nicht; das PDF erscheint ohne sie.", pdf_line_deduction_not_printed: "Das PDF-Layout «{{template}}» druckt keine Abzüge auf Positionen; diese Positionen erscheinen nur mit dem Nettobetrag.", pdf_variable_not_printed: "Das PDF-Layout «{{template}}» druckt {{label}} nicht; das PDF erscheint ohne." }, Zc = { defaultLabel: "Abzug", add: "+ Abzug", remove: "Abzug entfernen", label: "Text des Abzugs", labelPlaceholder: "z. B. Abzüglich bereits verrechnet (Rechnung SINV-0003)", perUnit: "Abzug pro Einheit, wird unter der Position gedruckt; die Position zählt den Rest." }, Xc = {
|
|
9609
9619
|
proposal: yc,
|
|
9610
9620
|
common: bc,
|
|
9611
9621
|
datePresets: vc,
|
|
@@ -9642,7 +9652,7 @@ const Ll = { incomplete: "Draft saved; PDF output requires Customer, Company and
|
|
|
9642
9652
|
pdfTemplates: Yc,
|
|
9643
9653
|
documentWarnings: Jc,
|
|
9644
9654
|
deductions: Zc
|
|
9645
|
-
}, ed = { incomplete: "Brouillon enregistré. Le PDF nécessite un client, une entreprise et au moins une offre." }, td = { save: "Enregistrer", saving: "Enregistrement...", saved: "Enregistré", unsavedTitle: "Quitter sans enregistrer ?", unsavedBody: "Vos modifications sur cette page ne sont pas enregistrées et seront perdues.", unsavedLeave: "Abandonner les modifications", unsavedStay: "Continuer la modification", submit: "Valider", cancel: "Annuler", cancelDoc: "Annuler", cancelDocAbort: "Ne pas annuler", cancelDocConfirmBtn: "Annuler définitivement", cancelBooking: "Annuler la réservation", cancelBookingConfirm: "Oui, annuler", keepBooking: "Conserver", discardDraft: "Supprimer le brouillon", keepDraft: "Conserver", discardDraftConfirm: "Supprimer", showDiscarded: "Afficher les supprimés", showDisabled: "Afficher les désactivés", columns: "Colonnes", searchPlaceholder: "Rechercher…", noRecords: "Aucun enregistrement trouvé", active: "Actif", disabled: "Désactivé", sortByColumn: "Trier par cette colonne", 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" }, nd = { today: "Aujourd’hui", thisWeek: "Cette semaine", thisMonth: "Ce mois-ci", thisQuarter: "Ce trimestre", thisYear: "Cette année", lastMonth: "Mois dernier", lastQuarter: "Trimestre dernier", lastYear: "Année dernière", endOfThisMonth: "Fin du mois en cours", endOfLastMonth: "Fin du mois dernier", endOfThisQuarter: "Fin du trimestre en cours", endOfThisYear: "Fin de l’année en cours", endOfLastYear: "Fin de l’année dernière" }, ad = { title: "Importer un relevé bancaire", subtitle: "Prévisualisez et importez des relevés ISO 20022 CAMT sans écriture comptable automatique.", selectFiles: "Fichiers CAMT", chooseFiles: "Choisir des fichiers XML ou ZIP", dropFiles: "Déposez les fichiers XML ou ZIP ici", unsupportedFiles: "Seuls les fichiers CAMT XML ou ZIP sont acceptés : {{files}}", fileHint: "camt.053.001.04 et camt.053.001.08 · plusieurs fichiers acceptés", preview: "Afficher l’aperçu", noPosting: "L’aperçu et l’importation ne génèrent aucune écriture comptable.", alreadyImported: "Déjà importé", period: "Période", openingBalance: "Solde initial", closingBalance: "Solde final", entries: "Opérations", credits: "Crédits", debits: "Débits", details: "Détails des transactions", batches: "lots", qrReferences: "Références QR", mapping: "Affectation du compte bancaire", selectBankAccount: "Sélectionner un compte bancaire…", noBankAccounts: "Aucun compte bancaire n’a encore été configuré.", createBankAccount: "Configurer un compte bancaire", mappingRequired: "Affectez chaque nouveau relevé à un compte bancaire avant l’importation.", import: "Importer les relevés", importComplete: "Importation terminée", importCounts: "{{imported}} opérations importées, {{duplicates}} doublons ignorés", history: "Importations récentes", importId: "Importation", bankAccount: "Compte bancaire", source: "Fichier source", openReconciliation: "Ouvrir le rapprochement bancaire" }, rd = { title: "Rapprochement bancaire", subtitle: "Rapprochez les transactions importées avec des écritures, des factures ouvertes ou des comptes comptables.", status: "Statut", unreconciled: "Non rapprochée", reconciled: "Rapprochée", transactions: "Transactions bancaires", empty: "Aucune transaction bancaire dans cette vue.", remittance: "Information de paiement", reference: "Référence", openTransaction: "Ouvrir la transaction bancaire", conversionRate: "Taux de change (1 {{currency}} en {{base}})", conversionRateHint: "Requis si aucun taux de change n’existe à la date de la transaction.", existingVouchers: "Écritures existantes", existingVouchersHint: "Ces pièces validées contiennent un mouvement exact sur ce compte bancaire. Le rapprochement ne les comptabilise pas une seconde fois.", match: "Rapprocher", openInvoices: "Factures ouvertes", openInvoicesHint: "Sélectionnez une ou plusieurs factures du même tiers. La confirmation crée et valide un paiement.", outstanding: "Solde ouvert", allocation: "Affectation", noInvoiceSuggestions: "Aucune facture ouverte plausible n’a été trouvée.", allocated: "{{amount}} affectés sur {{total}}", createPayment: "Créer le paiement et rapprocher", directPosting: "Comptabiliser sur un compte", directPostingHint: "Pour les frais, intérêts et autres mouvements sans facture. Les comptes clients, fournisseurs, bancaires et de caisse sont volontairement exclus.", counterpartyAccount: "Compte de contrepartie", remarks: "Remarque", createJournal: "Créer l’écriture et rapprocher", activeMatch: "Rapprochement actif", undo: "Annuler le rapprochement", confirmExistingTitle: "Rapprocher l’écriture existante ?", confirmExistingBody: "Rapprocher {{transaction}} avec {{voucher}} ? Aucune nouvelle écriture ne sera comptabilisée.", confirmGroupBody: "Rapprocher les {{count}} transactions, pour un total de {{amount}}, avec {{voucher}} ? Aucune nouvelle écriture ne sera comptabilisée.", groupedTransactions: "{{count}} transactions groupées", confirmPaymentTitle: "Comptabiliser le paiement et rapprocher ?", confirmPaymentBody: "Cette action valide un paiement de {{amount}} pour {{transaction}} et l’affecte à {{count}} facture(s).", onAccountWarning: "{{amount}} resteront comme paiement non affecté pour ce tiers.", confirmJournalTitle: "Comptabiliser l’écriture et rapprocher ?", confirmJournalBody: "Cette action comptabilise {{amount}} pour {{transaction}} sur {{account}}.", postAndReconcile: "Comptabiliser et rapprocher", undoTitle: "Annuler le rapprochement ?", undoCreatedBody: "La pièce créée par ce rapprochement sera annulée, ses écritures extournées et les affectations aux factures restaurées.", undoExistingBody: "La pièce existante sera uniquement dissociée. Elle restera validée et ses écritures ne seront pas modifiées.", undoExistingGroupBody: "Les {{count}} transactions groupées ({{transactions}}) seront toutes dissociées ensemble. La pièce existante restera validée et ses écritures ne seront pas modifiées.", reconciledNotice: "Transaction bancaire rapprochée.", groupReconciledNotice: "{{count}} transactions bancaires ont été rapprochées en groupe.", undoneNotice: "Rapprochement annulé." }, sd = { placeholder: "Rechercher ou saisir champ:valeur…", search: "Rechercher", addFilter: "+ Filtre", availableFields: "Champs disponibles", fieldHelp: "Choisissez un champ ou saisissez son nom technique suivi de deux-points.", field: "Champ", valueFor: "Valeur pour {{label}}", allFields: "Tous les champs", typeForValues: "Commencez à saisir pour rechercher des valeurs dans ce champ.", noValues: "Aucune valeur correspondante.", noFields: "Aucun champ correspondant.", useValue: "Utiliser « {{value}} »", removeFilter: "Supprimer le filtre {{label}}", types: { text: "Texte", textarea: "Texte long", select: "Sélection", link: "Enregistrement lié", date: "Date", datetime: "Date et heure", number: "Nombre", currency: "Montant" } }, id = { title: "Langue", help: "Choisissez la langue de l'interface. Votre choix est enregistré dans ce navigateur.", label: "Langue" }, od = { back: "Retour", backToChat: "Retour au chat", logout: "Déconnexion", openMenu: "Ouvrir le menu", closeMenu: "Fermer le menu", new: "Nouveau : {{label}}" }, ld = { 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", "chart-of-accounts": "Plan comptable", "batch-stock": "Stock par lot", "stock-detail": "Stock par emplacement et lot", "stock-availability": "Disponibilité du stock" }, cd = { 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" }, "bank-account": { one: "Compte bancaire", other: "Comptes 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" }, reservation: { one: "Réservation", other: "Réservations" } }, dd = { 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" } }, ud = { 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", Rentals: "Locations" }, 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", "Bank Account": "Comptes bancaires", "Bank Statement Import": "Importer un relevé bancaire", "Bank Reconciliation": "Rapprochement 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", "Chart of Accounts": "Plan comptable", "Fleet Calendar": "Calendrier de flotte", "Fleet (Assets)": "Flotte (matériel)", Reservations: "Réservations", Menu: "Menu", "PDF Templates": "Modèles PDF", Batch: "Lot", "Batch Stock": "Stock par lot", "Storage Location": "Emplacement", "Stock by Location & Batch": "Stock par emplacement et lot", "Stock Reservation": "Réservation de stock", "Stock Availability": "Disponibilité du stock" } }, md = { 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", orContinueWith: "ou continuer avec", continueWithProvider: "Continuer avec {{provider}}", oauthError: { generic: "Échec de la connexion. Veuillez réessayer.", email_exists: "Un compte avec cet e-mail existe déjà. Connectez-vous, puis liez ce fournisseur depuis les paramètres du compte.", email_unverified: "Votre fournisseur n'a pas confirmé d'e-mail vérifié, la connexion est donc impossible.", registration_closed: "Cet e-mail n'a pas encore de compte et l'inscription se fait uniquement sur invitation.", invite_invalid: "Cette invitation est invalide, déjà utilisée ou émise pour un autre e-mail.", identity_taken: "Ce compte fournisseur est déjà lié à un autre utilisateur.", account_disabled: "Ce compte a été désactivé.", token_exchange_failed: "Échec de la connexion auprès du fournisseur. Veuillez réessayer." } }, pd = { 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é.", setPasswordTitle: "Définir un mot de passe", setPasswordBody: "Votre compte se connecte avec Google. Définissez un mot de passe pour vous connecter aussi avec e-mail et mot de passe — un recours pratique si vous perdez l'accès à votre compte Google.", setPassword: "Définir le mot de passe", passwordSet: "Mot de passe défini.", linkedAccountsTitle: "Comptes liés", linkedAccountsBody: "Liez un compte Google ou Apple pour vous connecter sans mot de passe.", linked: "Lié", linkProvider: "Lier {{provider}}", 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.", chatApiTitle: "API de chat", apiTitle: "API programmatique", restApiBody: "Autoriser les applications et scripts à accéder à cet ERP via REST ou MCP, avec des clés API ou une connexion OAuth. Désactivé par défaut.", restApiEnabled: "Actuellement activé — les clés émises peuvent appeler /api/documents, /api/masters et le reste de l'API REST.", restApiDisabled: "Actuellement désactivé — l'API REST n'accepte que le cookie de session ; les clés sont rejetées.", restApiDeactivateTitle: "Désactiver l'API REST ?", restApiDeactivateBody: "L'accès par clé Bearer à l'API REST sera désactivé — les connecteurs et scripts sont rejetés jusqu'à sa réactivation. L'application web (cookie de session) n'est pas affectée, et vos clés API ne sont PAS supprimées : elles fonctionnent à nouveau dès que vous réactivez l'API.", chatApiBody: "Permettre à des applications externes de dialoguer avec l'agent de chat de cet ERP via une API HTTP, à l'aide de clés API Bearer. Désactivé par défaut.", chatApiEnabled: "Actuellement activé — les clés émises peuvent appeler POST /api/v1/chat.", chatApiDisabled: "Actuellement désactivé — l'API renvoie 404 et les clés ne fonctionnent pas.", chatApiDeactivateTitle: "Désactiver l'API chat ?", chatApiDeactivateBody: "L'API chat sera désactivée — toute requête programmatique (clés API Bearer) est rejetée jusqu'à sa réactivation. Vos clés API ne sont PAS supprimées : elles restent enregistrées et fonctionnent à nouveau dès que vous réactivez l'API.", chatApiDeactivateConfirm: "Désactiver l'API", chatApiKeysTitle: "Applications et clés API", chatApiTokenOnce: "Copiez ce jeton maintenant — il ne sera plus affiché.", chatApiCopy: "Copier", chatApiDismiss: "Fermer", chatApiRevoked: "révoquée", chatApiRevoke: "Révoquer", chatApiNoKeys: "Aucune connexion pour le moment.", chatApiName: "Nom", chatApiRole: "Rôle", chatApiCreate: "Créer une clé", chatApiWarn: "Une clé agit avec votre identité et au plus votre rôle — à traiter comme un mot de passe. Révoquer d'abord, puis supprimer.", 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", chatApiDelete: "Supprimer", chatApiYourKeys: "Vos connexions", chatApiYouBadge: "vous", chatApiUnknownUser: "Utilisateur inconnu", chatApiAdminAllNote: "En tant qu’administrateur, vous pouvez gérer les connexions de tous les utilisateurs. Les vôtres apparaissent en premier.", chatApiConfirmTitle: "Cette connexion appartient à un autre utilisateur", chatApiConfirmRevokeBody: "« {{key}} » appartient à {{name}}. La révocation déconnectera immédiatement son application. Continuer ?", chatApiConfirmDeleteBody: "« {{key}} » appartient à {{name}}. Supprimer définitivement cette connexion révoquée ?", chatApiPersonal: "Connectez des applications à votre compte ERP. L’accès ne dépasse jamais vos droits actuels.", version: "Version {{version}}" }, hd = { 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é" }, gd = { periodRange: "Période du rapport : {{from}} – {{to}}", periodFrom: "Période du rapport à partir du {{from}}", periodThrough: "Période du rapport jusqu’au {{to}}", asOfDate: "Date de référence : {{date}}", 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é", noBatchStock: "Aucun stock par lot trouvé", batchMovements: "Mouvements du lot {{batch}} ({{item}})", withoutBatch: "sans lot", showMovements: "Mouvements", expired: "périmé" }, fd = { 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}}." }, yd = { "Last modified": "Dernière modification", Created: "Créé", 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", "Amount only": "Montant seul", "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", Website: "Site web", "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é", "Item (type)": "Article (type)", "Asset Tag / Plate": "Étiquette / plaque", "Home Yard": "Dépôt d'attache", "Purchase Value": "Valeur d'achat", "Meter Reading": "Relevé compteur", "Meter Unit": "Unité compteur", Yard: "Dépôt", "Asset (specific unit)": "Équipement (unité spécifique)", Allocation: "Affectation", From: "Du", To: "Au", Purpose: "Objet", "Purchase Date": "Date d'achat", Notes: "Notes", "Printed notes / terms": "Notes / conditions imprimées", "PDF Layout": "Mise en page PDF", "Intro text": "Texte d'introduction", "Closing text / terms": "Texte final / conditions", Batch: "Lot", "Expiry Date": "Date de péremption", "Manufacturing Date": "Date de fabrication", "Batch-tracked": "Géré par lot", "Has Expiry Date": "Avec date de péremption", "Item starts with": "Article commençant par", "Expiring before": "Péremption avant", Document: "Document", "Storage Location": "Emplacement", "Storage Locations": "Emplacements", "Source Location": "Emplacement d'origine", "Target Location": "Emplacement de destination", "Reserve Stock": "Réserver le stock", "Shelf Life Exception": "Exception de durée de vie", "Reserved Qty": "Quantité réservée", "Sales Order Line": "Ligne de commande", "Reserved By": "Réservé par", "Min. Shelf Life (days)": "Durée de vie min. (jours)", Blocked: "Bloqué", "Blocked Reason": "Motif du blocage", "In Stock": "En stock", Reserved: "Réservé", Available: "Disponible", "Open Sales Orders": "Commandes ouvertes", "On Purchase Order": "En commande" }, bd = { 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" }, vd = { "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" }, xd = { 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" }, kd = { 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." }, Nd = /* @__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."}},"setupTitle":"Configurez votre entreprise — guidé par l'IA","setupBadge":"Commencez ici","setupBody":"Dites à l'assistant quel type d'entreprise vous dirigez, et il construit votre plan comptable pour vous — adapté à votre secteur, avec les bons comptes et des valeurs par défaut cohérentes déjà en place. Il explique chaque décision et ne crée quoi que ce soit qu'après votre approbation.","setupSectors":"Adapté aux services, au commerce de détail & POS, à l'hôtellerie-restauration, au commerce de gros & distribution, à l'import/export, à la fabrication et à la construction.","setupGetStarted":"Commencer dans le chat","setupManual":"Vous préférez un formulaire manuel ? Utilisez la configuration classique.","setupManualLink":"Configuration classique","setupPrompt":"Je souhaite configurer mon entreprise. Pouvez-vous me guider ?"}`), wd = { title: "Aide au formatage", intro: "Le texte des notes / conditions imprimées prend en charge une mise en forme légère sur le PDF :", heading: "titre en gras", emphasis: "italique / gras", rule: "ligne de séparation horizontale", price: "prix aligné à droite à côté du texte ci-dessus (p. ex. Mensuel | CHF 380.—)", block: "Séparez les blocs par une ligne vide." }, Sd = { period: "Période", allTime: "Toute la période", semantics: "Comptes de bilan : solde à la fin de la période. Comptes de résultat : mouvement de la période. Cliquez sur un compte pour son grand livre.", empty: "Aucun compte trouvé. Terminez d'abord la configuration de l'entreprise.", disabled: "désactivé", rootType: { Asset: "Actifs", Liability: "Passifs", Equity: "Capitaux propres", Income: "Produits", Expense: "Charges" } }, Cd = { fleetCalendar: "Calendrier de flotte", yard: "Dépôt", machineType: "Type de machine", prev: "Préc.", today: "Aujourd'hui", next: "Suiv.", weeks: "semaines", newBooking: "Nouvelle réservation", reserved: "Réservé", onHire: "En location", machine: "Machine", loadError: "Impossible de charger le calendrier de flotte.", noAssets: "Aucun équipement à afficher. Ajoutez des machines sous Locations → Flotte.", pooledNote: "{{count}} réservation(s) en attente d’attribution", unassigned: "Pool — non attribué", poolWarning: "La capacité est réservée. Aucune machine précise n’est encore attribuée ; attribuez une machine avant la sortie." }, _d = { Unit: "Machine spécifique", Pool: "Pool – machine à affecter", Available: "Disponible", "On Hire": "En location", Out: "Sorti", Maintenance: "Maintenance", Retired: "Retiré", Reserved: "Réservé", Returned: "Retourné", Cancelled: "Annulé", Customer: "Client", Supplier: "Fournisseur" }, Dd = { asset: { item_code: "L'article est le TYPE de machine et porte le tarif ; un équipement en est une unité physique. L'article doit avoir is_asset_tracked = 1.", asset_tag: "Plaque ou numéro de série — doit être unique sur tous les équipements.", status: "État actuel de l'unité (pas une période). Les unités retirées quittent le pool.", meter_reading: "Heures de fonctionnement / km." }, reservation: { item_code: "Réservation de pool ('une pelle de 1,7 t') : renseigner Article + Dépôt + Qté. Pour une machine précise, renseigner Équipement.", asset: "Réserver une machine précise. Une réservation d'unité consomme aussi une place du pool Article+Dépôt.", from_datetime: "Début exact — date et heure (p. ex. 14:27). Une date seule signifie 00:00.", to_datetime: "Fin exacte. Les fenêtres sont semi-ouvertes [de, à) : une location finissant à 09:00 et la suivante commençant à 09:00 ne se chevauchent PAS.", pdf_template: "L’aspect de la confirmation de réservation." }, quotation: { pdf_template: "L'apparence du PDF de l'offre. Figée lorsque l'offre est validée.", intro_text: "Imprimé au-dessus des positions (l'emplacement exact dépend de la mise en page PDF). Les nouvelles offres reprennent le texte par défaut de Paramètres → Modèles PDF.", remarks: "Imprimé après les totaux (l'emplacement exact dépend de la mise en page PDF). Les nouvelles offres reprennent le texte par défaut de Paramètres → Modèles PDF." }, "sales-order": { pdf_template: "L’aspect du PDF. Fixé lors de la validation du document.", intro_text: "Imprimé au-dessus des lignes (l’endroit exact dépend de la mise en page PDF). Les nouveaux documents commencent avec le texte par défaut des Paramètres → Modèles PDF." }, "sales-invoice": { pdf_template: "L’aspect du PDF. Fixé lors de la validation du document.", intro_text: "Imprimé au-dessus des lignes (l’endroit exact dépend de la mise en page PDF). Les nouveaux documents commencent avec le texte par défaut des Paramètres → Modèles PDF." }, "purchase-order": { pdf_template: "L’aspect du PDF. Fixé lors de la validation du document.", intro_text: "Imprimé au-dessus des lignes (l’endroit exact dépend de la mise en page PDF). Les nouveaux documents commencent avec le texte par défaut des Paramètres → Modèles PDF." }, "delivery-note": { pdf_template: "L’aspect du PDF. Fixé lors de la validation du document.", intro_text: "Imprimé au-dessus des lignes (l’endroit exact dépend de la mise en page PDF). Les nouveaux documents commencent avec le texte par défaut des Paramètres → Modèles PDF." } }, Pd = { label: "Taxe de vente par défaut", none: "Aucune application automatique", hint: "Appliquée aux nouveaux devis, commandes et factures si les taxes ne sont pas explicitement définies. Les documents existants restent inchangés. Cliquez sur Enregistrer pour appliquer.", saveFirst: "Enregistrez d’abord l’entreprise, puis sélectionnez un de ses modèles de taxes de vente.", loadError: "Impossible de charger les modèles de taxes. La sélection enregistrée est conservée.", retry: "Réessayer", unavailable: "Le modèle enregistré n’est pas disponible comme modèle de taxes de vente pour cette entreprise. Vérifiez la sélection.", empty: "Aucun modèle de taxes de vente n’est encore défini pour cette entreprise." }, Ad = { title: "Connecter une application", subtitle: "Choisissez où utiliser Lambda ERP. Nous afficherons la configuration adaptée.", other: "Autre application", customName: "Intégration personnalisée", signIn: "Se connecter", apiKey: "Clé API", access: "Accès", role_viewer: "Consulter les données", role_manager: "Créer et modifier", role_admin: "Accès administratif complet", roleHelp: "L’accès est toujours limité par vos propres droits ERP. Accordez uniquement ce dont cette application a besoin.", copied: "Copié", copyFailed: "La copie automatique a échoué. Sélectionnez le texte et copiez-le manuellement.", retry: "Réessayer", interface: "Type de connexion", chatDisabled: "L’accès à l’API de chat est désactivé. Demandez à un administrateur de l’activer dans les paramètres API ci-dessus.", restDisabled: "L’accès REST API / MCP est désactivé. Un administrateur doit l’activer dans les paramètres API avant de connecter cette application.", chatgptStep: "Ouvrez chatgpt.com dans votre navigateur. Sélectionnez « Plugins » dans la barre latérale gauche, cliquez sur « Add » (+) en haut à droite, puis choisissez « Create MCP App ». Saisissez un nom, par exemple Lambda ERP, et une courte description.", chatgptDeveloperMode: "Si « Create MCP App » n’est pas disponible, vérifiez que « Developer mode » est activé dans « Settings » → « Security and login ». S’il est déjà activé, allez directement dans « Plugins ». Des autorisations de l’espace de travail peuvent aussi être nécessaires.", claudeStep: "Dans Claude Desktop, ouvrez « Settings » → « Connectors » puis choisissez « Add custom connector ».", urlStep: "Collez cette URL de serveur. Utilisez la connexion OAuth ; laissez les champs facultatifs Client ID et Client Secret vides.", approveStep: "Connectez l’application, identifiez-vous dans Lambda ERP et approuvez l’accès souhaité.", noKeyNeeded: "Aucune clé API ni en-tête personnalisé n’est nécessaire. Choisissez l’accès sur l’écran d’autorisation.", officialGuide: "Ouvrir le guide de configuration", copyUrl: "Copier l’URL du serveur", keyReady: "Votre clé de connexion est prête", copySetup: "Copier la configuration", copyHeader: "Copier l’en-tête d’autorisation", cliStep: "Exécutez cette commande dans votre terminal, puis vérifiez la connexion avec /mcp dans Claude Code.", codexStep: "Ajoutez cette entrée à votre configuration Codex, puis redémarrez Codex et vérifiez /mcp.", done: "Terminé — masquer la clé", existing: "Connexions existantes", refresh: "Actualiser", lastUsed: "Dernière utilisation", notUsed: "Pas encore utilisée", consentTitle: "Se connecter à Lambda ERP", expired: "Cette demande de connexion est absente ou expirée. Recommencez depuis votre application.", loginFirst: "Connectez-vous à votre compte ERP pour examiner la demande de cette application.", consentBody: "« {{app}} » demande l’accès à votre ERP. Choisissez l’accès que vous souhaitez autoriser.", returnTo: "Après autorisation, vous retournerez vers", revokeHelp: "Vous pouvez révoquer cette connexion à tout moment dans Paramètres → Accès API.", deny: "Annuler", allow: "Autoriser la connexion", explain_viewer: "L’application peut lire les données et rapports ERP et générer des PDF. Elle ne peut pas modifier les données métier.", explain_manager: "L’application peut aussi créer, modifier, valider et annuler des documents et mettre à jour les données de base.", explain_admin: "L’application peut utiliser tous les outils ERP disponibles, y compris les actions administratives et la suppression de données de base." }, Td = { title: "Mentions", note: "Note interne", placeholder: "Écrire une note… utiliser @ pour mentionner un collègue", colleagues: "Collègues", loading: "Chargement…", noUsers: "Aucun collègue correspondant", hint: "Écrivez @Nom ou choisissez une personne. Les personnes mentionnées dans le texte seront averties à l’enregistrement.", remove: "Retirer la mention de {{name}}", close: "Fermer", open: "À traiter", unread: "Non lues", done: "Terminées", retry: "Réessayer", empty: "Aucune mention ici.", mentionedYou: "vous a mentionné", reopen: "Rouvrir", markDone: "Terminer", markUnread: "Marquer comme non lue", markRead: "Marquer comme lue", previous: "Précédent", next: "Suivant" }, Rd = { title: "Notes internes", private: "Réservées à votre équipe · jamais imprimées", add: "Ajouter une note", placeholder: "Écrire une note interne… tapez @ pour prévenir un collègue", save: "Enregistrer la note", empty: "Aucune note interne pour l’instant.", edited: "modifiée", older: "Afficher les notes plus anciennes", printedBadge: "Imprimé sur le PDF", count_one: "{{count}} note interne", count_other: "{{count}} notes internes" }, Bd = { title: "Votre menu", intro: "Glissez les groupes et les entrées dans l'ordre voulu et masquez ceux dont vous ne vous servez pas, puis enregistrez. Seul votre menu change : les autres gardent le leur, et les pages masquées restent accessibles par lien.", chatHint: "Vous pouvez aussi le demander au chat, p. ex. « masque les Locations » ou « mets le CRM en haut ».", reset: "Rétablir par défaut", hide: "Masquer {{name}}", show: "Afficher {{name}}", locked: "Toujours affiché : cette page modifie le menu", drag: "Glisser pour déplacer {{name}} (ou le sélectionner et utiliser les flèches)", discard: "Annuler les modifications", unsaved: "Modifications non enregistrées" }, Id = { title: "Modèles PDF", intro: "Les mises en page utilisées pour imprimer les documents : offres, commandes, factures, commandes fournisseur, bons de livraison, propositions et confirmations de réservation, chaque type avec ses modèles et son modèle par défaut. Modifiez un modèle autant que vous voulez : enregistrer ne change que le brouillon, publier en fait la mise en page des documents. Un document validé conserve la mise en page et le PDF avec lesquels il a été émis.", chatHint: "Vous pouvez aussi demander au chat, p. ex. « mets notre logo en haut à droite et agrandis la police du tableau des articles ».", new: "Nouveau modèle", newTitle: "Nouveau modèle PDF", newBody: "Commence comme copie de {{name}}.", copyOf: "Copie de {{name}}", create: "Créer", standard: "Standard", standardDescription: "La mise en page intégrée. Lecture seule : dupliquez-la pour changer l'apparence.", default: "Par défaut", builtIn: "Intégré", notPublished: "Non publié", unpublishedChanges: "Modifications non publiées", archived: "Archivé", usedBy_one: "Utilisé par {{count}} offre", usedBy_other: "Utilisé par {{count}} offres", makeDefault: "Définir par défaut", duplicate: "Dupliquer", archive: "Archiver", restore: "Restaurer", deleteTitle: "Supprimer {{name}} ?", deleteBody: "Aucune offre n'a utilisé ce modèle, rien n'en dépend.", showArchived: "Afficher les modèles archivés", name: "Nom", editHint: "Enregistrez autant que vous voulez : seul le brouillon change. Publiez quand l’aperçu convient ; les documents s’impriment avec la mise en page publiée.", publish: "Publier", revert: "Annuler les modifications non publiées", revertTitle: "Annuler les modifications non publiées ?", revertBody: "Le brouillon revient à la mise en page publiée.", publishedNotice: "Publié. Vérifié avec {{document}}.", source: "HTML et CSS", lines_one: "{{count}} ligne", lines_other: "{{count}} lignes", preview: "Aperçu", previewWith: "Aperçu avec le document", refresh: "Actualiser", show_draft: "Brouillon", show_live: "Publié", previewShowsSaved: "L'aperçu montre la dernière version enregistrée.", blocked: "Non chargé (seuls les fichiers téléversés sont autorisés) : {{urls}}", assets_one: "Images et polices ({{count}})", assets_other: "Images et polices ({{count}})", assetsHint: `Référencez un fichier téléversé par son nom, p. ex. <img src="logo.png">. Les liens vers d'autres sites sont bloqués.`, upload: "Téléverser un fichier", versions_one: "Versions émises ({{count}})", versions_other: "Versions émises ({{count}})", versionsHint: "Une version est enregistrée lorsqu’un document est validé avec une mise en page. Les documents conservent la version avec laquelle ils ont été émis.", noVersions: "Aucune offre n'a encore été émise avec ce modèle.", firstUsed: "utilisé pour la première fois le {{date}}", reference: "Champs disponibles", standardEditHint: "Pour modifier cette mise en page, dupliquez-la sur la page", defaultOption: "Par défaut ({{name}})", textDefaults: "Textes par défaut des offres", textDefaultsIntro: "Les nouvelles offres commencent avec ces textes, modifiables sur chaque offre. Les modifier ne change pas les offres existantes.", textDefaultsPlaceholders: "Variables, remplacées à l'impression : {{placeholders}}", saveTexts: "Enregistrer les textes", textsSaved: "Enregistré.", publishWarnings: "Remarque : {{warnings}}", uploading: "Envoi…", dropHint: "ou glissez des images et des polices ici (PNG, JPG, SVG, WebP, GIF, TTF, OTF, WOFF, WOFF2)", textDefaultsFor: "Textes par défaut : {{type}}", textDefaultsIntroFor: "Les nouveaux documents ({{type}}) commencent avec ces textes ; ils peuvent être modifiés sur chaque document. Les modifier ici ne change pas les documents existants.", newTitleFor: "Nouveau modèle PDF ({{type}})", newFor: "Nouveau modèle : {{type}}", fromOtherType: "Partir d’un modèle d’un autre type…", usedByIssued_one: "Utilisé par {{count}} document émis", usedByIssued_other: "Utilisé par {{count}} documents émis" }, Ld = { pdf_intro_text_not_printed: "La mise en page PDF « {{template}} » n'imprime pas le texte d'introduction ; le PDF s'affiche sans.", pdf_remarks_not_printed: "La mise en page PDF « {{template}} » n'imprime pas le texte final / les conditions ; le PDF s'affiche sans.", pdf_line_deduction_not_printed: "La mise en page PDF « {{template}} » n'imprime pas les déductions de ligne ; ces lignes n'affichent que leur montant net.", pdf_variable_not_printed: "La mise en page PDF « {{template}} » n’imprime pas : {{label}} ; le PDF s’affiche sans." }, Ed = { defaultLabel: "Déduction", add: "+ Déduction", remove: "Retirer la déduction", label: "Texte de la déduction", labelPlaceholder: "p. ex. Moins déjà facturé (facture SINV-0003)", perUnit: "Déduction par unité, imprimée sous la ligne ; la ligne compte le reste." }, Fd = {
|
|
9655
|
+
}, ed = { incomplete: "Brouillon enregistré. Le PDF nécessite un client, une entreprise et au moins une offre." }, td = { save: "Enregistrer", saving: "Enregistrement...", saved: "Enregistré", unsavedTitle: "Quitter sans enregistrer ?", unsavedBody: "Vos modifications sur cette page ne sont pas enregistrées et seront perdues.", unsavedLeave: "Abandonner les modifications", unsavedStay: "Continuer la modification", submit: "Valider", cancel: "Annuler", cancelDoc: "Annuler", cancelDocAbort: "Ne pas annuler", cancelDocConfirmBtn: "Annuler définitivement", cancelBooking: "Annuler la réservation", cancelBookingConfirm: "Oui, annuler", keepBooking: "Conserver", discardDraft: "Supprimer le brouillon", keepDraft: "Conserver", discardDraftConfirm: "Supprimer", showDiscarded: "Afficher les supprimés", showDisabled: "Afficher les désactivés", columns: "Colonnes", searchPlaceholder: "Rechercher…", noRecords: "Aucun enregistrement trouvé", active: "Actif", disabled: "Désactivé", sortByColumn: "Trier par cette colonne", 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" }, nd = { today: "Aujourd’hui", thisWeek: "Cette semaine", thisMonth: "Ce mois-ci", thisQuarter: "Ce trimestre", thisYear: "Cette année", lastMonth: "Mois dernier", lastQuarter: "Trimestre dernier", lastYear: "Année dernière", endOfThisMonth: "Fin du mois en cours", endOfLastMonth: "Fin du mois dernier", endOfThisQuarter: "Fin du trimestre en cours", endOfThisYear: "Fin de l’année en cours", endOfLastYear: "Fin de l’année dernière" }, ad = { title: "Importer un relevé bancaire", subtitle: "Prévisualisez et importez des relevés ISO 20022 CAMT sans écriture comptable automatique.", selectFiles: "Fichiers CAMT", chooseFiles: "Choisir des fichiers XML ou ZIP", dropFiles: "Déposez les fichiers XML ou ZIP ici", unsupportedFiles: "Seuls les fichiers CAMT XML ou ZIP sont acceptés : {{files}}", fileHint: "camt.053.001.04 et camt.053.001.08 · plusieurs fichiers acceptés", preview: "Afficher l’aperçu", noPosting: "L’aperçu et l’importation ne génèrent aucune écriture comptable.", alreadyImported: "Déjà importé", period: "Période", openingBalance: "Solde initial", closingBalance: "Solde final", entries: "Opérations", credits: "Crédits", debits: "Débits", details: "Détails des transactions", batches: "lots", qrReferences: "Références QR", mapping: "Affectation du compte bancaire", selectBankAccount: "Sélectionner un compte bancaire…", noBankAccounts: "Aucun compte bancaire n’a encore été configuré.", createBankAccount: "Configurer un compte bancaire", mappingRequired: "Affectez chaque nouveau relevé à un compte bancaire avant l’importation.", import: "Importer les relevés", importComplete: "Importation terminée", importCounts: "{{imported}} opérations importées, {{duplicates}} doublons ignorés", history: "Importations récentes", importId: "Importation", bankAccount: "Compte bancaire", source: "Fichier source", openReconciliation: "Ouvrir le rapprochement bancaire" }, rd = { title: "Rapprochement bancaire", subtitle: "Rapprochez les transactions importées avec des écritures, des factures ouvertes ou des comptes comptables.", status: "Statut", unreconciled: "Non rapprochée", reconciled: "Rapprochée", transactions: "Transactions bancaires", empty: "Aucune transaction bancaire dans cette vue.", remittance: "Information de paiement", reference: "Référence", openTransaction: "Ouvrir la transaction bancaire", conversionRate: "Taux de change (1 {{currency}} en {{base}})", conversionRateHint: "Requis si aucun taux de change n’existe à la date de la transaction.", existingVouchers: "Écritures existantes", existingVouchersHint: "Ces pièces validées contiennent un mouvement exact sur ce compte bancaire. Le rapprochement ne les comptabilise pas une seconde fois.", match: "Rapprocher", openInvoices: "Factures ouvertes", openInvoicesHint: "Sélectionnez une ou plusieurs factures du même tiers. La confirmation crée et valide un paiement.", outstanding: "Solde ouvert", allocation: "Affectation", noInvoiceSuggestions: "Aucune facture ouverte plausible n’a été trouvée.", allocated: "{{amount}} affectés sur {{total}}", createPayment: "Créer le paiement et rapprocher", directPosting: "Comptabiliser sur un compte", directPostingHint: "Pour les frais, intérêts et autres mouvements sans facture. Les comptes clients, fournisseurs, bancaires et de caisse sont volontairement exclus.", counterpartyAccount: "Compte de contrepartie", remarks: "Remarque", createJournal: "Créer l’écriture et rapprocher", activeMatch: "Rapprochement actif", undo: "Annuler le rapprochement", confirmExistingTitle: "Rapprocher l’écriture existante ?", confirmExistingBody: "Rapprocher {{transaction}} avec {{voucher}} ? Aucune nouvelle écriture ne sera comptabilisée.", confirmGroupBody: "Rapprocher les {{count}} transactions, pour un total de {{amount}}, avec {{voucher}} ? Aucune nouvelle écriture ne sera comptabilisée.", groupedTransactions: "{{count}} transactions groupées", confirmPaymentTitle: "Comptabiliser le paiement et rapprocher ?", confirmPaymentBody: "Cette action valide un paiement de {{amount}} pour {{transaction}} et l’affecte à {{count}} facture(s).", onAccountWarning: "{{amount}} resteront comme paiement non affecté pour ce tiers.", confirmJournalTitle: "Comptabiliser l’écriture et rapprocher ?", confirmJournalBody: "Cette action comptabilise {{amount}} pour {{transaction}} sur {{account}}.", postAndReconcile: "Comptabiliser et rapprocher", undoTitle: "Annuler le rapprochement ?", undoCreatedBody: "La pièce créée par ce rapprochement sera annulée, ses écritures extournées et les affectations aux factures restaurées.", undoExistingBody: "La pièce existante sera uniquement dissociée. Elle restera validée et ses écritures ne seront pas modifiées.", undoExistingGroupBody: "Les {{count}} transactions groupées ({{transactions}}) seront toutes dissociées ensemble. La pièce existante restera validée et ses écritures ne seront pas modifiées.", reconciledNotice: "Transaction bancaire rapprochée.", groupReconciledNotice: "{{count}} transactions bancaires ont été rapprochées en groupe.", undoneNotice: "Rapprochement annulé." }, sd = { placeholder: "Rechercher ou saisir champ:valeur…", search: "Rechercher", addFilter: "+ Filtre", availableFields: "Champs disponibles", fieldHelp: "Choisissez un champ ou saisissez son nom technique suivi de deux-points.", field: "Champ", valueFor: "Valeur pour {{label}}", allFields: "Tous les champs", typeForValues: "Commencez à saisir pour rechercher des valeurs dans ce champ.", noValues: "Aucune valeur correspondante.", noFields: "Aucun champ correspondant.", useValue: "Utiliser « {{value}} »", removeFilter: "Supprimer le filtre {{label}}", types: { text: "Texte", textarea: "Texte long", select: "Sélection", link: "Enregistrement lié", date: "Date", datetime: "Date et heure", number: "Nombre", currency: "Montant" } }, id = { title: "Langue", help: "Choisissez la langue de l'interface. Votre choix est enregistré dans ce navigateur.", label: "Langue" }, od = { back: "Retour", backToChat: "Retour au chat", logout: "Déconnexion", openMenu: "Ouvrir le menu", closeMenu: "Fermer le menu", new: "Nouveau : {{label}}" }, ld = { 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", "chart-of-accounts": "Plan comptable", "batch-stock": "Stock par lot", "stock-detail": "Stock par emplacement et lot", "stock-availability": "Disponibilité du stock" }, cd = { 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" }, "bank-account": { one: "Compte bancaire", other: "Comptes 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" }, reservation: { one: "Réservation", other: "Réservations" } }, dd = { 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" } }, ud = { 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", Rentals: "Locations" }, 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", "Bank Account": "Comptes bancaires", "Bank Statement Import": "Importer un relevé bancaire", "Bank Reconciliation": "Rapprochement 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", "Chart of Accounts": "Plan comptable", "Fleet Calendar": "Calendrier de flotte", "Fleet (Assets)": "Flotte (matériel)", Reservations: "Réservations", Menu: "Menu", "PDF Templates": "Modèles PDF", Batch: "Lot", "Batch Stock": "Stock par lot", "Storage Location": "Emplacement", "Stock by Location & Batch": "Stock par emplacement et lot", "Stock Reservation": "Réservation de stock", "Stock Availability": "Disponibilité du stock" } }, md = { 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", orContinueWith: "ou continuer avec", continueWithProvider: "Continuer avec {{provider}}", oauthError: { generic: "Échec de la connexion. Veuillez réessayer.", email_exists: "Un compte avec cet e-mail existe déjà. Connectez-vous, puis liez ce fournisseur depuis les paramètres du compte.", email_unverified: "Votre fournisseur n'a pas confirmé d'e-mail vérifié, la connexion est donc impossible.", registration_closed: "Cet e-mail n'a pas encore de compte et l'inscription se fait uniquement sur invitation.", invite_invalid: "Cette invitation est invalide, déjà utilisée ou émise pour un autre e-mail.", identity_taken: "Ce compte fournisseur est déjà lié à un autre utilisateur.", account_disabled: "Ce compte a été désactivé.", token_exchange_failed: "Échec de la connexion auprès du fournisseur. Veuillez réessayer." } }, pd = { 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é.", setPasswordTitle: "Définir un mot de passe", setPasswordBody: "Votre compte se connecte avec Google. Définissez un mot de passe pour vous connecter aussi avec e-mail et mot de passe — un recours pratique si vous perdez l'accès à votre compte Google.", setPassword: "Définir le mot de passe", passwordSet: "Mot de passe défini.", linkedAccountsTitle: "Comptes liés", linkedAccountsBody: "Liez un compte Google ou Apple pour vous connecter sans mot de passe.", linked: "Lié", linkProvider: "Lier {{provider}}", 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.", chatApiTitle: "API de chat", apiTitle: "API programmatique", restApiBody: "Autoriser les applications et scripts à accéder à cet ERP via REST ou MCP, avec des clés API ou une connexion OAuth. Désactivé par défaut.", restApiEnabled: "Actuellement activé — les clés émises peuvent appeler /api/documents, /api/masters et le reste de l'API REST.", restApiDisabled: "Actuellement désactivé — l'API REST n'accepte que le cookie de session ; les clés sont rejetées.", restApiDeactivateTitle: "Désactiver l'API REST ?", restApiDeactivateBody: "L'accès par clé Bearer à l'API REST sera désactivé — les connecteurs et scripts sont rejetés jusqu'à sa réactivation. L'application web (cookie de session) n'est pas affectée, et vos clés API ne sont PAS supprimées : elles fonctionnent à nouveau dès que vous réactivez l'API.", chatApiBody: "Permettre à des applications externes de dialoguer avec l'agent de chat de cet ERP via une API HTTP, à l'aide de clés API Bearer. Désactivé par défaut.", chatApiEnabled: "Actuellement activé — les clés émises peuvent appeler POST /api/v1/chat.", chatApiDisabled: "Actuellement désactivé — l'API renvoie 404 et les clés ne fonctionnent pas.", chatApiDeactivateTitle: "Désactiver l'API chat ?", chatApiDeactivateBody: "L'API chat sera désactivée — toute requête programmatique (clés API Bearer) est rejetée jusqu'à sa réactivation. Vos clés API ne sont PAS supprimées : elles restent enregistrées et fonctionnent à nouveau dès que vous réactivez l'API.", chatApiDeactivateConfirm: "Désactiver l'API", chatApiKeysTitle: "Applications et clés API", chatApiTokenOnce: "Copiez ce jeton maintenant — il ne sera plus affiché.", chatApiCopy: "Copier", chatApiDismiss: "Fermer", chatApiRevoked: "révoquée", chatApiRevoke: "Révoquer", chatApiNoKeys: "Aucune connexion pour le moment.", chatApiName: "Nom", chatApiRole: "Rôle", chatApiCreate: "Créer une clé", chatApiWarn: "Une clé agit avec votre identité et au plus votre rôle — à traiter comme un mot de passe. Révoquer d'abord, puis supprimer.", 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", chatApiDelete: "Supprimer", chatApiYourKeys: "Vos connexions", chatApiYouBadge: "vous", chatApiUnknownUser: "Utilisateur inconnu", chatApiAdminAllNote: "En tant qu’administrateur, vous pouvez gérer les connexions de tous les utilisateurs. Les vôtres apparaissent en premier.", chatApiConfirmTitle: "Cette connexion appartient à un autre utilisateur", chatApiConfirmRevokeBody: "« {{key}} » appartient à {{name}}. La révocation déconnectera immédiatement son application. Continuer ?", chatApiConfirmDeleteBody: "« {{key}} » appartient à {{name}}. Supprimer définitivement cette connexion révoquée ?", chatApiPersonal: "Connectez des applications à votre compte ERP. L’accès ne dépasse jamais vos droits actuels.", version: "Version {{version}}" }, hd = { 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é" }, gd = { periodRange: "Période du rapport : {{from}} – {{to}}", periodFrom: "Période du rapport à partir du {{from}}", periodThrough: "Période du rapport jusqu’au {{to}}", asOfDate: "Date de référence : {{date}}", 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é", noBatchStock: "Aucun stock par lot trouvé", batchMovements: "Mouvements du lot {{batch}} ({{item}})", withoutBatch: "sans lot", showMovements: "Mouvements", expired: "périmé" }, fd = { 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}}." }, yd = { "Last modified": "Dernière modification", Created: "Créé", 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", "Amount only": "Montant seul", "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", Website: "Site web", "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é", "Item (type)": "Article (type)", "Asset Tag / Plate": "Étiquette / plaque", "Home Yard": "Dépôt d'attache", "Purchase Value": "Valeur d'achat", "Meter Reading": "Relevé compteur", "Meter Unit": "Unité compteur", Yard: "Dépôt", "Asset (specific unit)": "Équipement (unité spécifique)", Allocation: "Affectation", From: "Du", To: "Au", Purpose: "Objet", "Purchase Date": "Date d'achat", Notes: "Notes", "Printed notes / terms": "Notes / conditions imprimées", "PDF Layout": "Mise en page PDF", "Intro text": "Texte d'introduction", "Closing text / terms": "Texte final / conditions", Batch: "Lot", "Expiry Date": "Date de péremption", "Manufacturing Date": "Date de fabrication", "Batch-tracked": "Géré par lot", "Has Expiry Date": "Avec date de péremption", "Item starts with": "Article commençant par", "Expiring before": "Péremption avant", Document: "Document", "Storage Location": "Emplacement", "Storage Locations": "Emplacements", "Source Location": "Emplacement d'origine", "Target Location": "Emplacement de destination", "Reserve Stock": "Réserver le stock", "Shelf Life Exception": "Exception de durée de vie", "Reserved Qty": "Quantité réservée", "Sales Order Line": "Ligne de commande", "Reserved By": "Réservé par", "Min. Shelf Life (days)": "Durée de vie min. (jours)", Blocked: "Bloqué", "Blocked Reason": "Motif du blocage", "In Stock": "En stock", Reserved: "Réservé", Available: "Disponible", "Open Sales Orders": "Commandes ouvertes", "On Purchase Order": "En commande", "Price Source": "Origine du prix", "Apply On Value": "Valeur de « Appliquer à »", "Applicable For Value": "Valeur de « Valable pour »" }, bd = { 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" }, vd = { "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" }, xd = { 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" }, kd = { 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." }, Nd = /* @__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."}},"setupTitle":"Configurez votre entreprise — guidé par l'IA","setupBadge":"Commencez ici","setupBody":"Dites à l'assistant quel type d'entreprise vous dirigez, et il construit votre plan comptable pour vous — adapté à votre secteur, avec les bons comptes et des valeurs par défaut cohérentes déjà en place. Il explique chaque décision et ne crée quoi que ce soit qu'après votre approbation.","setupSectors":"Adapté aux services, au commerce de détail & POS, à l'hôtellerie-restauration, au commerce de gros & distribution, à l'import/export, à la fabrication et à la construction.","setupGetStarted":"Commencer dans le chat","setupManual":"Vous préférez un formulaire manuel ? Utilisez la configuration classique.","setupManualLink":"Configuration classique","setupPrompt":"Je souhaite configurer mon entreprise. Pouvez-vous me guider ?"}`), wd = { title: "Aide au formatage", intro: "Le texte des notes / conditions imprimées prend en charge une mise en forme légère sur le PDF :", heading: "titre en gras", emphasis: "italique / gras", rule: "ligne de séparation horizontale", price: "prix aligné à droite à côté du texte ci-dessus (p. ex. Mensuel | CHF 380.—)", block: "Séparez les blocs par une ligne vide." }, Sd = { period: "Période", allTime: "Toute la période", semantics: "Comptes de bilan : solde à la fin de la période. Comptes de résultat : mouvement de la période. Cliquez sur un compte pour son grand livre.", empty: "Aucun compte trouvé. Terminez d'abord la configuration de l'entreprise.", disabled: "désactivé", rootType: { Asset: "Actifs", Liability: "Passifs", Equity: "Capitaux propres", Income: "Produits", Expense: "Charges" } }, Cd = { fleetCalendar: "Calendrier de flotte", yard: "Dépôt", machineType: "Type de machine", prev: "Préc.", today: "Aujourd'hui", next: "Suiv.", weeks: "semaines", newBooking: "Nouvelle réservation", reserved: "Réservé", onHire: "En location", machine: "Machine", loadError: "Impossible de charger le calendrier de flotte.", noAssets: "Aucun équipement à afficher. Ajoutez des machines sous Locations → Flotte.", pooledNote: "{{count}} réservation(s) en attente d’attribution", unassigned: "Pool — non attribué", poolWarning: "La capacité est réservée. Aucune machine précise n’est encore attribuée ; attribuez une machine avant la sortie." }, _d = { Unit: "Machine spécifique", Pool: "Pool – machine à affecter", Available: "Disponible", "On Hire": "En location", Out: "Sorti", Maintenance: "Maintenance", Retired: "Retiré", Reserved: "Réservé", Returned: "Retourné", Cancelled: "Annulé", Customer: "Client", Supplier: "Fournisseur" }, Dd = { asset: { item_code: "L'article est le TYPE de machine et porte le tarif ; un équipement en est une unité physique. L'article doit avoir is_asset_tracked = 1.", asset_tag: "Plaque ou numéro de série — doit être unique sur tous les équipements.", status: "État actuel de l'unité (pas une période). Les unités retirées quittent le pool.", meter_reading: "Heures de fonctionnement / km." }, reservation: { item_code: "Réservation de pool ('une pelle de 1,7 t') : renseigner Article + Dépôt + Qté. Pour une machine précise, renseigner Équipement.", asset: "Réserver une machine précise. Une réservation d'unité consomme aussi une place du pool Article+Dépôt.", from_datetime: "Début exact — date et heure (p. ex. 14:27). Une date seule signifie 00:00.", to_datetime: "Fin exacte. Les fenêtres sont semi-ouvertes [de, à) : une location finissant à 09:00 et la suivante commençant à 09:00 ne se chevauchent PAS.", pdf_template: "L’aspect de la confirmation de réservation." }, quotation: { pdf_template: "L'apparence du PDF de l'offre. Figée lorsque l'offre est validée.", intro_text: "Imprimé au-dessus des positions (l'emplacement exact dépend de la mise en page PDF). Les nouvelles offres reprennent le texte par défaut de Paramètres → Modèles PDF.", remarks: "Imprimé après les totaux (l'emplacement exact dépend de la mise en page PDF). Les nouvelles offres reprennent le texte par défaut de Paramètres → Modèles PDF." }, "sales-order": { pdf_template: "L’aspect du PDF. Fixé lors de la validation du document.", intro_text: "Imprimé au-dessus des lignes (l’endroit exact dépend de la mise en page PDF). Les nouveaux documents commencent avec le texte par défaut des Paramètres → Modèles PDF." }, "sales-invoice": { pdf_template: "L’aspect du PDF. Fixé lors de la validation du document.", intro_text: "Imprimé au-dessus des lignes (l’endroit exact dépend de la mise en page PDF). Les nouveaux documents commencent avec le texte par défaut des Paramètres → Modèles PDF." }, "purchase-order": { pdf_template: "L’aspect du PDF. Fixé lors de la validation du document.", intro_text: "Imprimé au-dessus des lignes (l’endroit exact dépend de la mise en page PDF). Les nouveaux documents commencent avec le texte par défaut des Paramètres → Modèles PDF." }, "delivery-note": { pdf_template: "L’aspect du PDF. Fixé lors de la validation du document.", intro_text: "Imprimé au-dessus des lignes (l’endroit exact dépend de la mise en page PDF). Les nouveaux documents commencent avec le texte par défaut des Paramètres → Modèles PDF." } }, Pd = { label: "Taxe de vente par défaut", none: "Aucune application automatique", hint: "Appliquée aux nouveaux devis, commandes et factures si les taxes ne sont pas explicitement définies. Les documents existants restent inchangés. Cliquez sur Enregistrer pour appliquer.", saveFirst: "Enregistrez d’abord l’entreprise, puis sélectionnez un de ses modèles de taxes de vente.", loadError: "Impossible de charger les modèles de taxes. La sélection enregistrée est conservée.", retry: "Réessayer", unavailable: "Le modèle enregistré n’est pas disponible comme modèle de taxes de vente pour cette entreprise. Vérifiez la sélection.", empty: "Aucun modèle de taxes de vente n’est encore défini pour cette entreprise." }, Ad = { title: "Connecter une application", subtitle: "Choisissez où utiliser Lambda ERP. Nous afficherons la configuration adaptée.", other: "Autre application", customName: "Intégration personnalisée", signIn: "Se connecter", apiKey: "Clé API", access: "Accès", role_viewer: "Consulter les données", role_manager: "Créer et modifier", role_admin: "Accès administratif complet", roleHelp: "L’accès est toujours limité par vos propres droits ERP. Accordez uniquement ce dont cette application a besoin.", copied: "Copié", copyFailed: "La copie automatique a échoué. Sélectionnez le texte et copiez-le manuellement.", retry: "Réessayer", interface: "Type de connexion", chatDisabled: "L’accès à l’API de chat est désactivé. Demandez à un administrateur de l’activer dans les paramètres API ci-dessus.", restDisabled: "L’accès REST API / MCP est désactivé. Un administrateur doit l’activer dans les paramètres API avant de connecter cette application.", chatgptStep: "Ouvrez chatgpt.com dans votre navigateur. Sélectionnez « Plugins » dans la barre latérale gauche, cliquez sur « Add » (+) en haut à droite, puis choisissez « Create MCP App ». Saisissez un nom, par exemple Lambda ERP, et une courte description.", chatgptDeveloperMode: "Si « Create MCP App » n’est pas disponible, vérifiez que « Developer mode » est activé dans « Settings » → « Security and login ». S’il est déjà activé, allez directement dans « Plugins ». Des autorisations de l’espace de travail peuvent aussi être nécessaires.", claudeStep: "Dans Claude Desktop, ouvrez « Settings » → « Connectors » puis choisissez « Add custom connector ».", urlStep: "Collez cette URL de serveur. Utilisez la connexion OAuth ; laissez les champs facultatifs Client ID et Client Secret vides.", approveStep: "Connectez l’application, identifiez-vous dans Lambda ERP et approuvez l’accès souhaité.", noKeyNeeded: "Aucune clé API ni en-tête personnalisé n’est nécessaire. Choisissez l’accès sur l’écran d’autorisation.", officialGuide: "Ouvrir le guide de configuration", copyUrl: "Copier l’URL du serveur", keyReady: "Votre clé de connexion est prête", copySetup: "Copier la configuration", copyHeader: "Copier l’en-tête d’autorisation", cliStep: "Exécutez cette commande dans votre terminal, puis vérifiez la connexion avec /mcp dans Claude Code.", codexStep: "Ajoutez cette entrée à votre configuration Codex, puis redémarrez Codex et vérifiez /mcp.", done: "Terminé — masquer la clé", existing: "Connexions existantes", refresh: "Actualiser", lastUsed: "Dernière utilisation", notUsed: "Pas encore utilisée", consentTitle: "Se connecter à Lambda ERP", expired: "Cette demande de connexion est absente ou expirée. Recommencez depuis votre application.", loginFirst: "Connectez-vous à votre compte ERP pour examiner la demande de cette application.", consentBody: "« {{app}} » demande l’accès à votre ERP. Choisissez l’accès que vous souhaitez autoriser.", returnTo: "Après autorisation, vous retournerez vers", revokeHelp: "Vous pouvez révoquer cette connexion à tout moment dans Paramètres → Accès API.", deny: "Annuler", allow: "Autoriser la connexion", explain_viewer: "L’application peut lire les données et rapports ERP et générer des PDF. Elle ne peut pas modifier les données métier.", explain_manager: "L’application peut aussi créer, modifier, valider et annuler des documents et mettre à jour les données de base.", explain_admin: "L’application peut utiliser tous les outils ERP disponibles, y compris les actions administratives et la suppression de données de base." }, Td = { title: "Mentions", note: "Note interne", placeholder: "Écrire une note… utiliser @ pour mentionner un collègue", colleagues: "Collègues", loading: "Chargement…", noUsers: "Aucun collègue correspondant", hint: "Écrivez @Nom ou choisissez une personne. Les personnes mentionnées dans le texte seront averties à l’enregistrement.", remove: "Retirer la mention de {{name}}", close: "Fermer", open: "À traiter", unread: "Non lues", done: "Terminées", retry: "Réessayer", empty: "Aucune mention ici.", mentionedYou: "vous a mentionné", reopen: "Rouvrir", markDone: "Terminer", markUnread: "Marquer comme non lue", markRead: "Marquer comme lue", previous: "Précédent", next: "Suivant" }, Rd = { title: "Notes internes", private: "Réservées à votre équipe · jamais imprimées", add: "Ajouter une note", placeholder: "Écrire une note interne… tapez @ pour prévenir un collègue", save: "Enregistrer la note", empty: "Aucune note interne pour l’instant.", edited: "modifiée", older: "Afficher les notes plus anciennes", printedBadge: "Imprimé sur le PDF", count_one: "{{count}} note interne", count_other: "{{count}} notes internes" }, Bd = { title: "Votre menu", intro: "Glissez les groupes et les entrées dans l'ordre voulu et masquez ceux dont vous ne vous servez pas, puis enregistrez. Seul votre menu change : les autres gardent le leur, et les pages masquées restent accessibles par lien.", chatHint: "Vous pouvez aussi le demander au chat, p. ex. « masque les Locations » ou « mets le CRM en haut ».", reset: "Rétablir par défaut", hide: "Masquer {{name}}", show: "Afficher {{name}}", locked: "Toujours affiché : cette page modifie le menu", drag: "Glisser pour déplacer {{name}} (ou le sélectionner et utiliser les flèches)", discard: "Annuler les modifications", unsaved: "Modifications non enregistrées" }, Id = { title: "Modèles PDF", intro: "Les mises en page utilisées pour imprimer les documents : offres, commandes, factures, commandes fournisseur, bons de livraison, propositions et confirmations de réservation, chaque type avec ses modèles et son modèle par défaut. Modifiez un modèle autant que vous voulez : enregistrer ne change que le brouillon, publier en fait la mise en page des documents. Un document validé conserve la mise en page et le PDF avec lesquels il a été émis.", chatHint: "Vous pouvez aussi demander au chat, p. ex. « mets notre logo en haut à droite et agrandis la police du tableau des articles ».", new: "Nouveau modèle", newTitle: "Nouveau modèle PDF", newBody: "Commence comme copie de {{name}}.", copyOf: "Copie de {{name}}", create: "Créer", standard: "Standard", standardDescription: "La mise en page intégrée. Lecture seule : dupliquez-la pour changer l'apparence.", default: "Par défaut", builtIn: "Intégré", notPublished: "Non publié", unpublishedChanges: "Modifications non publiées", archived: "Archivé", usedBy_one: "Utilisé par {{count}} offre", usedBy_other: "Utilisé par {{count}} offres", makeDefault: "Définir par défaut", duplicate: "Dupliquer", archive: "Archiver", restore: "Restaurer", deleteTitle: "Supprimer {{name}} ?", deleteBody: "Aucune offre n'a utilisé ce modèle, rien n'en dépend.", showArchived: "Afficher les modèles archivés", name: "Nom", editHint: "Enregistrez autant que vous voulez : seul le brouillon change. Publiez quand l’aperçu convient ; les documents s’impriment avec la mise en page publiée.", publish: "Publier", revert: "Annuler les modifications non publiées", revertTitle: "Annuler les modifications non publiées ?", revertBody: "Le brouillon revient à la mise en page publiée.", publishedNotice: "Publié. Vérifié avec {{document}}.", source: "HTML et CSS", lines_one: "{{count}} ligne", lines_other: "{{count}} lignes", preview: "Aperçu", previewWith: "Aperçu avec le document", refresh: "Actualiser", show_draft: "Brouillon", show_live: "Publié", previewShowsSaved: "L'aperçu montre la dernière version enregistrée.", blocked: "Non chargé (seuls les fichiers téléversés sont autorisés) : {{urls}}", assets_one: "Images et polices ({{count}})", assets_other: "Images et polices ({{count}})", assetsHint: `Référencez un fichier téléversé par son nom, p. ex. <img src="logo.png">. Les liens vers d'autres sites sont bloqués.`, upload: "Téléverser un fichier", versions_one: "Versions émises ({{count}})", versions_other: "Versions émises ({{count}})", versionsHint: "Une version est enregistrée lorsqu’un document est validé avec une mise en page. Les documents conservent la version avec laquelle ils ont été émis.", noVersions: "Aucune offre n'a encore été émise avec ce modèle.", firstUsed: "utilisé pour la première fois le {{date}}", reference: "Champs disponibles", standardEditHint: "Pour modifier cette mise en page, dupliquez-la sur la page", defaultOption: "Par défaut ({{name}})", textDefaults: "Textes par défaut des offres", textDefaultsIntro: "Les nouvelles offres commencent avec ces textes, modifiables sur chaque offre. Les modifier ne change pas les offres existantes.", textDefaultsPlaceholders: "Variables, remplacées à l'impression : {{placeholders}}", saveTexts: "Enregistrer les textes", textsSaved: "Enregistré.", publishWarnings: "Remarque : {{warnings}}", uploading: "Envoi…", dropHint: "ou glissez des images et des polices ici (PNG, JPG, SVG, WebP, GIF, TTF, OTF, WOFF, WOFF2)", textDefaultsFor: "Textes par défaut : {{type}}", textDefaultsIntroFor: "Les nouveaux documents ({{type}}) commencent avec ces textes ; ils peuvent être modifiés sur chaque document. Les modifier ici ne change pas les documents existants.", newTitleFor: "Nouveau modèle PDF ({{type}})", newFor: "Nouveau modèle : {{type}}", fromOtherType: "Partir d’un modèle d’un autre type…", usedByIssued_one: "Utilisé par {{count}} document émis", usedByIssued_other: "Utilisé par {{count}} documents émis" }, Ld = { pdf_intro_text_not_printed: "La mise en page PDF « {{template}} » n'imprime pas le texte d'introduction ; le PDF s'affiche sans.", pdf_remarks_not_printed: "La mise en page PDF « {{template}} » n'imprime pas le texte final / les conditions ; le PDF s'affiche sans.", pdf_line_deduction_not_printed: "La mise en page PDF « {{template}} » n'imprime pas les déductions de ligne ; ces lignes n'affichent que leur montant net.", pdf_variable_not_printed: "La mise en page PDF « {{template}} » n’imprime pas : {{label}} ; le PDF s’affiche sans." }, Ed = { defaultLabel: "Déduction", add: "+ Déduction", remove: "Retirer la déduction", label: "Texte de la déduction", labelPlaceholder: "p. ex. Moins déjà facturé (facture SINV-0003)", perUnit: "Déduction par unité, imprimée sous la ligne ; la ligne compte le reste." }, Fd = {
|
|
9646
9656
|
proposal: ed,
|
|
9647
9657
|
common: td,
|
|
9648
9658
|
datePresets: nd,
|