Phase2: Invoicecomputation/AdminpricingUI/Ainvoicemgnt
Some checks failed
Build and Push / build (push) Failing after 28s

This commit is contained in:
2026-05-24 13:51:38 +02:00
parent 6baca1a459
commit c8ed27157f
29 changed files with 4465 additions and 11 deletions

View File

@@ -384,7 +384,8 @@
"spendChf": "Kosten (CHF)",
"resumeRequestBadge": "Wieder",
"resumeRequestTooltip": "Reaktivierungsanfrage für einen bestehenden Tenant. Bei Genehmigung wird der Tenant wieder aktiviert; keine Provisionierung läuft.",
"openclawTool": "OpenClaw-Versionen"
"openclawTool": "OpenClaw-Versionen",
"billingTool": "Abrechnung →"
},
"channelUsers": {
"title": "Autorisierte Benutzer",
@@ -553,5 +554,105 @@
"defaultPrefix": "Standard:",
"saveOverride": "Override speichern",
"clearOverride": "Override entfernen"
},
"adminBilling": {
"title": "Abrechnungsverwaltung",
"subtitle": "Plattform-Preise verwalten, Rechnungen generieren und den Rechnungsstatus aller Organisationen prüfen.",
"backToAdmin": "Zurück zur Verwaltung",
"backToBilling": "Zurück zur Abrechnung",
"backToInvoices": "Zurück zu den Rechnungen",
"totalOpenBalance": "Offener Saldo gesamt",
"orgsWithBalance": "Organisationen mit Saldo",
"overdueInvoices": "Überfällige Rechnungen",
"pricingTitle": "Preise",
"pricingDesc": "Plattform- & Skill-Preise, MWST-Satz.",
"pricingPageDesc": "Plattformweite Preise und Skill-Tagespreise bearbeiten.",
"generateTitle": "Rechnung erstellen",
"generateDesc": "Rechnung für eine Organisation und einen Monat berechnen und ausstellen.",
"generatePageDesc": "Organisation, Periode und Sprache wählen. Die Vorschau zeigt die berechneten Positionen; mit Bestätigen wird die Rechnung ausgestellt und das PDF erzeugt.",
"invoicesTitle": "Rechnungen",
"invoicesDesc": "Alle Rechnungen anzeigen, als bezahlt markieren, PDFs herunterladen.",
"invoicesPageDesc": "Alle von der Plattform ausgestellten Rechnungen. Mit dem Statusfilter offene oder überfällige Positionen einsehen.",
"balancesTitle": "Organisationen mit offenem Saldo",
"orgIdCol": "Zitadel-Org-ID",
"openCountCol": "Offen",
"overdueCountCol": "Überfällig",
"totalOpenCol": "Gesamt offen",
"platformPricingTitle": "Plattform-Preise",
"monthlyFeeLabel": "Monatliche Tenant-Gebühr",
"setupFeeLabel": "Einrichtungsgebühr Tenant",
"threemaMessageLabel": "Threema pro Nachricht",
"vatRateLabel": "MWST-Satz (CH/LI)",
"save": "Speichern",
"saving": "Speichere…",
"savedOk": "Gespeichert",
"skillPricingTitle": "Skill-Preise",
"skillPricingDesc": "Tagespreis pro Skill. Ein zu beliebigem Zeitpunkt an einem UTC-Tag aktivierter Skill zählt als ein abrechenbarer Tag.",
"skillCol": "Skill",
"dailyPriceCol": "Tagespreis",
"actionsCol": "",
"remove": "Entfernen",
"noSkillsPriced": "Noch keine Skills bepreist.",
"addSkillLabel": "Skill hinzufügen",
"dailyPriceLabel": "Tagespreis",
"add": "Hinzufügen",
"confirmDeleteSkillPrice": "Preis für {skill} entfernen?",
"clickToEdit": "Zum Bearbeiten klicken",
"generateFormTitle": "Rechnung erstellen",
"noOrgsToGenerate": "Keine Organisationen mit Tenants gefunden.",
"orgLabel": "Organisation",
"noBillingAddrTag": "keine Rechnungsadresse",
"noBillingAddrWarning": "Diese Organisation hat keine Rechnungsadresse hinterlegt. Der Kunde muss /settings/billing ausfüllen, bevor eine Rechnung ausgestellt werden kann.",
"tenantsLabel": "Tenants",
"yearLabel": "Jahr",
"monthLabel": "Monat",
"localeLabel": "PDF-Sprache",
"localeAuto": "Automatisch",
"previewBtn": "Vorschau",
"commitBtn": "Bestätigen & ausstellen",
"computing": "Berechne…",
"confirmGenerate": "Diese Rechnung ausstellen? Es wird eine Rechnungsnummer vergeben und das PDF erzeugt.",
"previewTitle": "Entwurfsvorschau",
"warningsTitle": "Hinweise",
"noLinesGenerated": "Keine abrechenbaren Positionen für diese Periode.",
"descCol": "Beschreibung",
"qtyCol": "Menge",
"unitPriceCol": "Einzelpreis",
"amountCol": "Betrag (CHF)",
"subtotal": "Zwischensumme",
"vat": "MWST",
"total": "Total",
"statusFilterLabel": "Status",
"allStatuses": "Alle",
"monthFilterLabel": "Periode",
"clearFilter": "Zurücksetzen",
"loading": "Lade…",
"noInvoicesFound": "Keine Rechnungen entsprechen den aktuellen Filtern.",
"invoiceNumberCol": "Nummer",
"orgCol": "Organisation",
"periodCol": "Periode",
"statusCol": "Status",
"totalCol": "Total",
"dueCol": "Fällig",
"status_draft": "Entwurf",
"status_open": "Offen",
"status_paid": "Bezahlt",
"status_overdue": "Überfällig",
"status_void": "Storniert",
"status_uncollectible": "Uneinbringlich",
"dueOnLabel": "Fällig",
"totalLabel": "Total",
"downloadPdfBtn": "PDF herunterladen",
"markPaidBtn": "Als bezahlt markieren",
"paidNotePlaceholder": "Optionale Notiz (z. B. Bankreferenz, Eingangsdatum)",
"confirm": "Bestätigen",
"cancel": "Abbrechen",
"deleteBtn": "Löschen",
"deleting": "Lösche…",
"deleteHint": "Rechnung hart löschen (Test-Tool). Die Nummer bleibt vergeben.",
"confirmDeleteInvoice": "Rechnung {num} löschen? Dies ist eine harte Löschung — die Rechnungsnummer bleibt verbraucht.",
"paidOnLabel": "Bezahlt am",
"lineItemsTitle": "Positionen",
"billToSnapshotTitle": "Rechnungsempfänger"
}
}

View File

@@ -384,7 +384,8 @@
"spendChf": "Spend (CHF)",
"resumeRequestBadge": "Resume",
"resumeRequestTooltip": "Reactivation request for an existing tenant. Approving will un-suspend the tenant; no provisioning runs.",
"openclawTool": "OpenClaw versions"
"openclawTool": "OpenClaw versions",
"billingTool": "Billing →"
},
"channelUsers": {
"title": "Authorized Users",
@@ -553,5 +554,105 @@
"defaultPrefix": "Default:",
"saveOverride": "Save override",
"clearOverride": "Clear override"
},
"adminBilling": {
"title": "Billing administration",
"subtitle": "Manage platform pricing, generate invoices, and review billing status across all organizations.",
"backToAdmin": "Back to Admin",
"backToBilling": "Back to Billing",
"backToInvoices": "Back to Invoices",
"totalOpenBalance": "Total open balance",
"orgsWithBalance": "Orgs with balance",
"overdueInvoices": "Overdue invoices",
"pricingTitle": "Pricing",
"pricingDesc": "Platform & skill prices, VAT rate.",
"pricingPageDesc": "Edit platform-wide pricing and per-skill daily rates.",
"generateTitle": "Generate invoice",
"generateDesc": "Compute and issue an invoice for a given org & month.",
"generatePageDesc": "Pick an org, period and locale. Preview shows the computed lines; commit issues the invoice and renders the PDF.",
"invoicesTitle": "Invoices",
"invoicesDesc": "Browse all issued invoices, mark paid, download PDFs.",
"invoicesPageDesc": "All invoices issued by the platform. Use the status filter to focus on open or overdue items.",
"balancesTitle": "Orgs with open balance",
"orgIdCol": "Zitadel org ID",
"openCountCol": "Open",
"overdueCountCol": "Overdue",
"totalOpenCol": "Total open",
"platformPricingTitle": "Platform pricing",
"monthlyFeeLabel": "Tenant monthly fee",
"setupFeeLabel": "Tenant setup fee",
"threemaMessageLabel": "Threema per message",
"vatRateLabel": "VAT rate (CH/LI)",
"save": "Save",
"saving": "Saving…",
"savedOk": "Saved",
"skillPricingTitle": "Skill pricing",
"skillPricingDesc": "Per-skill daily price. A skill enabled at any point during a UTC day counts as one billable day.",
"skillCol": "Skill",
"dailyPriceCol": "Daily price",
"actionsCol": "",
"remove": "Remove",
"noSkillsPriced": "No skills are priced yet.",
"addSkillLabel": "Add skill",
"dailyPriceLabel": "Daily price",
"add": "Add",
"confirmDeleteSkillPrice": "Remove pricing for {skill}?",
"clickToEdit": "Click to edit",
"generateFormTitle": "Generate invoice",
"noOrgsToGenerate": "No organizations with tenants found.",
"orgLabel": "Organization",
"noBillingAddrTag": "no billing address",
"noBillingAddrWarning": "This org has no billing address on file. The customer must complete /settings/billing before an invoice can be issued.",
"tenantsLabel": "tenants",
"yearLabel": "Year",
"monthLabel": "Month",
"localeLabel": "PDF language",
"localeAuto": "Auto",
"previewBtn": "Preview",
"commitBtn": "Commit & issue",
"computing": "Computing…",
"confirmGenerate": "Issue this invoice? This action allocates an invoice number and renders the PDF.",
"previewTitle": "Draft preview",
"warningsTitle": "Warnings",
"noLinesGenerated": "No billable lines for this period.",
"descCol": "Description",
"qtyCol": "Qty",
"unitPriceCol": "Unit price",
"amountCol": "Amount (CHF)",
"subtotal": "Subtotal",
"vat": "VAT",
"total": "Total",
"statusFilterLabel": "Status",
"allStatuses": "All",
"monthFilterLabel": "Period",
"clearFilter": "Clear",
"loading": "Loading…",
"noInvoicesFound": "No invoices match the current filters.",
"invoiceNumberCol": "Number",
"orgCol": "Organization",
"periodCol": "Period",
"statusCol": "Status",
"totalCol": "Total",
"dueCol": "Due",
"status_draft": "Draft",
"status_open": "Open",
"status_paid": "Paid",
"status_overdue": "Overdue",
"status_void": "Void",
"status_uncollectible": "Uncollectible",
"dueOnLabel": "Due",
"totalLabel": "Total",
"downloadPdfBtn": "Download PDF",
"markPaidBtn": "Mark as paid",
"paidNotePlaceholder": "Optional note (e.g. bank reference, deposit date)",
"confirm": "Confirm",
"cancel": "Cancel",
"deleteBtn": "Delete",
"deleting": "Deleting…",
"deleteHint": "Hard-delete this invoice (testing tool). Number is consumed.",
"confirmDeleteInvoice": "Delete invoice {num}? This is a hard delete — the invoice number stays consumed.",
"paidOnLabel": "Paid",
"lineItemsTitle": "Line items",
"billToSnapshotTitle": "Billed to"
}
}

View File

@@ -384,7 +384,8 @@
"spendChf": "Coûts (CHF)",
"resumeRequestBadge": "Reprise",
"resumeRequestTooltip": "Demande de réactivation d'un locataire existant. L'approbation le réactivera ; aucun provisionnement ne s'exécute.",
"openclawTool": "Versions OpenClaw"
"openclawTool": "Versions OpenClaw",
"billingTool": "Facturation →"
},
"channelUsers": {
"title": "Utilisateurs autorisés",
@@ -553,5 +554,105 @@
"defaultPrefix": "Défaut :",
"saveOverride": "Enregistrer la surcharge",
"clearOverride": "Supprimer la surcharge"
},
"adminBilling": {
"title": "Administration de la facturation",
"subtitle": "Gérer les tarifs de la plateforme, générer des factures et examiner le statut de facturation des organisations.",
"backToAdmin": "Retour à l'administration",
"backToBilling": "Retour à la facturation",
"backToInvoices": "Retour aux factures",
"totalOpenBalance": "Solde ouvert total",
"orgsWithBalance": "Organisations avec solde",
"overdueInvoices": "Factures en retard",
"pricingTitle": "Tarifs",
"pricingDesc": "Tarifs plateforme & skills, taux TVA.",
"pricingPageDesc": "Modifier les tarifs de la plateforme et les prix journaliers par skill.",
"generateTitle": "Générer une facture",
"generateDesc": "Calculer et émettre une facture pour une organisation et un mois.",
"generatePageDesc": "Choisir une organisation, une période et une langue. L'aperçu affiche les lignes calculées; valider émet la facture et génère le PDF.",
"invoicesTitle": "Factures",
"invoicesDesc": "Parcourir les factures, marquer comme payées, télécharger les PDF.",
"invoicesPageDesc": "Toutes les factures émises par la plateforme. Utiliser le filtre de statut pour cibler les éléments ouverts ou en retard.",
"balancesTitle": "Organisations avec solde ouvert",
"orgIdCol": "ID org Zitadel",
"openCountCol": "Ouvert",
"overdueCountCol": "En retard",
"totalOpenCol": "Total ouvert",
"platformPricingTitle": "Tarifs plateforme",
"monthlyFeeLabel": "Forfait mensuel tenant",
"setupFeeLabel": "Frais de configuration tenant",
"threemaMessageLabel": "Threema par message",
"vatRateLabel": "Taux TVA (CH/LI)",
"save": "Enregistrer",
"saving": "Enregistrement…",
"savedOk": "Enregistré",
"skillPricingTitle": "Tarifs des skills",
"skillPricingDesc": "Prix journalier par skill. Un skill activé à tout moment au cours d'une journée UTC compte comme un jour facturable.",
"skillCol": "Skill",
"dailyPriceCol": "Prix/jour",
"actionsCol": "",
"remove": "Retirer",
"noSkillsPriced": "Aucun skill n'a encore de prix.",
"addSkillLabel": "Ajouter un skill",
"dailyPriceLabel": "Prix/jour",
"add": "Ajouter",
"confirmDeleteSkillPrice": "Retirer le prix pour {skill}?",
"clickToEdit": "Cliquer pour modifier",
"generateFormTitle": "Générer une facture",
"noOrgsToGenerate": "Aucune organisation avec tenants trouvée.",
"orgLabel": "Organisation",
"noBillingAddrTag": "pas d'adresse de facturation",
"noBillingAddrWarning": "Cette organisation n'a pas d'adresse de facturation enregistrée. Le client doit compléter /settings/billing avant qu'une facture puisse être émise.",
"tenantsLabel": "tenants",
"yearLabel": "Année",
"monthLabel": "Mois",
"localeLabel": "Langue PDF",
"localeAuto": "Auto",
"previewBtn": "Aperçu",
"commitBtn": "Valider & émettre",
"computing": "Calcul…",
"confirmGenerate": "Émettre cette facture? Cette action attribue un numéro de facture et génère le PDF.",
"previewTitle": "Aperçu du brouillon",
"warningsTitle": "Avertissements",
"noLinesGenerated": "Aucune ligne facturable pour cette période.",
"descCol": "Description",
"qtyCol": "Qté",
"unitPriceCol": "Prix unitaire",
"amountCol": "Montant (CHF)",
"subtotal": "Sous-total",
"vat": "TVA",
"total": "Total",
"statusFilterLabel": "Statut",
"allStatuses": "Tous",
"monthFilterLabel": "Période",
"clearFilter": "Effacer",
"loading": "Chargement…",
"noInvoicesFound": "Aucune facture ne correspond aux filtres.",
"invoiceNumberCol": "Numéro",
"orgCol": "Organisation",
"periodCol": "Période",
"statusCol": "Statut",
"totalCol": "Total",
"dueCol": "Échéance",
"status_draft": "Brouillon",
"status_open": "Ouverte",
"status_paid": "Payée",
"status_overdue": "En retard",
"status_void": "Annulée",
"status_uncollectible": "Irrécouvrable",
"dueOnLabel": "Échéance",
"totalLabel": "Total",
"downloadPdfBtn": "Télécharger le PDF",
"markPaidBtn": "Marquer comme payée",
"paidNotePlaceholder": "Note facultative (ex. référence bancaire, date de paiement)",
"confirm": "Confirmer",
"cancel": "Annuler",
"deleteBtn": "Supprimer",
"deleting": "Suppression…",
"deleteHint": "Suppression définitive (outil de test). Le numéro reste utilisé.",
"confirmDeleteInvoice": "Supprimer la facture {num}? Suppression définitive — le numéro reste utilisé.",
"paidOnLabel": "Payée le",
"lineItemsTitle": "Lignes",
"billToSnapshotTitle": "Destinataire"
}
}

View File

@@ -384,7 +384,8 @@
"spendChf": "Costi (CHF)",
"resumeRequestBadge": "Ripresa",
"resumeRequestTooltip": "Richiesta di riattivazione di un tenant esistente. L'approvazione lo riattiverà; non viene eseguito alcun provisioning.",
"openclawTool": "Versioni OpenClaw"
"openclawTool": "Versioni OpenClaw",
"billingTool": "Fatturazione →"
},
"channelUsers": {
"title": "Utenti autorizzati",
@@ -553,5 +554,105 @@
"defaultPrefix": "Predefinito:",
"saveOverride": "Salva override",
"clearOverride": "Rimuovi override"
},
"adminBilling": {
"title": "Amministrazione fatturazione",
"subtitle": "Gestire prezzi della piattaforma, generare fatture e verificare lo stato di fatturazione delle organizzazioni.",
"backToAdmin": "Torna ad amministrazione",
"backToBilling": "Torna alla fatturazione",
"backToInvoices": "Torna alle fatture",
"totalOpenBalance": "Saldo aperto totale",
"orgsWithBalance": "Organizzazioni con saldo",
"overdueInvoices": "Fatture scadute",
"pricingTitle": "Prezzi",
"pricingDesc": "Prezzi piattaforma & skill, aliquota IVA.",
"pricingPageDesc": "Modificare i prezzi della piattaforma e i prezzi giornalieri per skill.",
"generateTitle": "Genera fattura",
"generateDesc": "Calcolare ed emettere una fattura per organizzazione e mese.",
"generatePageDesc": "Scegli organizzazione, periodo e lingua. L'anteprima mostra le righe calcolate; conferma emette la fattura e genera il PDF.",
"invoicesTitle": "Fatture",
"invoicesDesc": "Sfoglia le fatture, segna come pagate, scarica i PDF.",
"invoicesPageDesc": "Tutte le fatture emesse dalla piattaforma. Usa il filtro di stato per focalizzarti su voci aperte o scadute.",
"balancesTitle": "Organizzazioni con saldo aperto",
"orgIdCol": "ID org Zitadel",
"openCountCol": "Aperte",
"overdueCountCol": "Scadute",
"totalOpenCol": "Totale aperto",
"platformPricingTitle": "Prezzi piattaforma",
"monthlyFeeLabel": "Canone mensile tenant",
"setupFeeLabel": "Spese di attivazione tenant",
"threemaMessageLabel": "Threema per messaggio",
"vatRateLabel": "Aliquota IVA (CH/LI)",
"save": "Salva",
"saving": "Salvataggio…",
"savedOk": "Salvato",
"skillPricingTitle": "Prezzi skill",
"skillPricingDesc": "Prezzo giornaliero per skill. Una skill attiva in qualsiasi momento di un giorno UTC conta come un giorno fatturabile.",
"skillCol": "Skill",
"dailyPriceCol": "Prezzo/giorno",
"actionsCol": "",
"remove": "Rimuovi",
"noSkillsPriced": "Nessuna skill ha ancora un prezzo.",
"addSkillLabel": "Aggiungi skill",
"dailyPriceLabel": "Prezzo/giorno",
"add": "Aggiungi",
"confirmDeleteSkillPrice": "Rimuovere il prezzo per {skill}?",
"clickToEdit": "Clicca per modificare",
"generateFormTitle": "Genera fattura",
"noOrgsToGenerate": "Nessuna organizzazione con tenant trovata.",
"orgLabel": "Organizzazione",
"noBillingAddrTag": "nessun indirizzo di fatturazione",
"noBillingAddrWarning": "Questa organizzazione non ha un indirizzo di fatturazione registrato. Il cliente deve completare /settings/billing prima che una fattura possa essere emessa.",
"tenantsLabel": "tenant",
"yearLabel": "Anno",
"monthLabel": "Mese",
"localeLabel": "Lingua PDF",
"localeAuto": "Auto",
"previewBtn": "Anteprima",
"commitBtn": "Conferma & emetti",
"computing": "Calcolo…",
"confirmGenerate": "Emettere questa fattura? L'operazione assegna un numero di fattura e genera il PDF.",
"previewTitle": "Anteprima bozza",
"warningsTitle": "Avvisi",
"noLinesGenerated": "Nessuna riga fatturabile per questo periodo.",
"descCol": "Descrizione",
"qtyCol": "Qtà",
"unitPriceCol": "Prezzo unitario",
"amountCol": "Importo (CHF)",
"subtotal": "Subtotale",
"vat": "IVA",
"total": "Totale",
"statusFilterLabel": "Stato",
"allStatuses": "Tutti",
"monthFilterLabel": "Periodo",
"clearFilter": "Pulisci",
"loading": "Caricamento…",
"noInvoicesFound": "Nessuna fattura corrisponde ai filtri.",
"invoiceNumberCol": "Numero",
"orgCol": "Organizzazione",
"periodCol": "Periodo",
"statusCol": "Stato",
"totalCol": "Totale",
"dueCol": "Scadenza",
"status_draft": "Bozza",
"status_open": "Aperta",
"status_paid": "Pagata",
"status_overdue": "Scaduta",
"status_void": "Annullata",
"status_uncollectible": "Inesigibile",
"dueOnLabel": "Scadenza",
"totalLabel": "Totale",
"downloadPdfBtn": "Scarica PDF",
"markPaidBtn": "Segna come pagata",
"paidNotePlaceholder": "Nota opzionale (es. riferimento bancario, data di pagamento)",
"confirm": "Conferma",
"cancel": "Annulla",
"deleteBtn": "Elimina",
"deleting": "Eliminazione…",
"deleteHint": "Eliminazione definitiva (strumento di test). Il numero rimane consumato.",
"confirmDeleteInvoice": "Eliminare la fattura {num}? Eliminazione definitiva — il numero rimane consumato.",
"paidOnLabel": "Pagata il",
"lineItemsTitle": "Righe",
"billToSnapshotTitle": "Destinatario"
}
}