feat(kantine-datev): Kantinenabrechnung als Modul in neuer Gruppe Finanzbuchhaltung

- neue Seitenleisten-Kategorie accounting (Finanzbuchhaltung / Financial accounting)
- CSV (UTF-8, UTF-8 mit BOM, Windows-1252) pruefen, Vorschau mit Zeilenfehlern, DATEV-Lohn-ASCII-Export
- Beraternummer, Mandantennummer, Lohnart je Mandant als Admin-Einstellung (KantineDatevConfig mit Zeilenschutz), anfangs leer
- hochgeladene Daten werden nicht gespeichert; Download per Blob (auch im Desktop-Client)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-10-02 11:32:55 +02:00
parent 0edd6e9b1a
commit 1f85277a3b
38 changed files with 2460 additions and 2 deletions
+81
View File
@@ -1618,12 +1618,93 @@
"loadError": "The custom modules could not be loaded."
}
},
"kantineDatev": {
"title": "Canteen billing",
"description": "Check canteen CSV files and download them as a DATEV payroll file for the salary run.",
"tabs": {
"billing": "Billing",
"settings": "Settings"
},
"loading": "Loading …",
"dropZone": {
"placeholder": "Drag a CSV file here or click",
"formats": ".csv, semicolon-separated, UTF-8 or Windows-1252",
"clear": "Remove file"
},
"noStorage": "The uploaded data is not stored.",
"checking": "Checking file …",
"notConfigured": {
"admin": "Consultant number, client number and wage type have not been set yet. Without them no DATEV file can be created.",
"adminAction": "Go to settings",
"user": "An administrator has to set the consultant number, client number and wage type first."
},
"summary": {
"title": "Check result",
"rows": "Rows",
"month": "Billing month",
"total": "Total amount",
"noMonth": "not detected"
},
"warnings": {
"title": "Notes",
"multipleMonths": "Different billing months detected: {months}. All rows should be in the same billing month."
},
"errors": {
"title": "Errors in the file",
"line": "Line",
"field": "Field",
"message": "Message",
"headerMissing": "The file has no header line.",
"headerColumns": "The header has too few columns. Is the separator correct (semicolon)?",
"columnCount": "The line has too few columns.",
"personalNrMissing": "Personnel number is missing",
"personalNrNotNumeric": "Personnel number must be numeric",
"betragMissing": "Amount is missing",
"betragFormat": "Amount must be in German number format (comma as decimal separator)",
"vonMissing": "Billing from is missing",
"vonFormat": "Billing from must be in the format DD.MM.YYYY",
"bisMissing": "Billing to is missing",
"bisFormat": "Billing to must be in the format DD.MM.YYYY",
"multiMonthRange": "The billing period spans several months",
"noRows": "The file contains no data rows.",
"settingsMissing": "Consultant number, client number and wage type have not been set yet.",
"hasErrors": "The file contains errors and cannot be exported.",
"qualityCheckFailed": "The generated file failed the quality check.",
"request": "The request failed. Please try again."
},
"fields": {
"header": "Header",
"zeile": "Line",
"datei": "File",
"personalNr": "Personnel number",
"betrag": "Amount",
"abrechnungVon": "Billing from",
"abrechnungBis": "Billing to",
"abrechnungVon/abrechnungBis": "Billing period"
},
"download": {
"button": "Download DATEV file",
"busy": "Creating file …",
"done": "The file {filename} has been downloaded."
},
"settings": {
"intro": "These values appear in the header and the lines of the DATEV file. They apply to all users of your tenant and only have to be set once.",
"beraterNr": "Consultant number",
"mandantNr": "Client number",
"lohnart": "Wage type",
"digitsOnly": "Please enter digits only (1 to 10 digits).",
"save": "Save",
"saving": "Saving …",
"saved": "The settings have been saved."
}
},
"moduleCategories": {
"domain-tools": "Domains",
"security-tools": "Security",
"fleet": "Fleet",
"infrastructure": "Infrastructure",
"procurement": "Procurement",
"accounting": "Financial accounting",
"custom-modules": "Custom modules"
}
}