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": "Die eigenen Module konnten nicht geladen werden."
}
},
"kantineDatev": {
"title": "Kantinenabrechnung",
"description": "Kantinen-CSV prüfen und als DATEV-Lohndatei für die Gehaltsabrechnung herunterladen.",
"tabs": {
"billing": "Abrechnung",
"settings": "Einstellungen"
},
"loading": "Wird geladen …",
"dropZone": {
"placeholder": "CSV-Datei hierher ziehen oder klicken",
"formats": ".csv, Semikolon-getrennt, UTF-8 oder Windows-1252",
"clear": "Datei entfernen"
},
"noStorage": "Die hochgeladenen Daten werden nicht gespeichert.",
"checking": "Datei wird geprüft …",
"notConfigured": {
"admin": "Beraternummer, Mandantennummer und Lohnart sind noch nicht hinterlegt. Ohne diese Angaben kann keine DATEV-Datei erstellt werden.",
"adminAction": "Zu den Einstellungen",
"user": "Ein Administrator muss zuerst Beraternummer, Mandantennummer und Lohnart hinterlegen."
},
"summary": {
"title": "Ergebnis der Prüfung",
"rows": "Zeilen",
"month": "Abrechnungsmonat",
"total": "Gesamtbetrag",
"noMonth": "nicht erkannt"
},
"warnings": {
"title": "Hinweise",
"multipleMonths": "Verschiedene Abrechnungsmonate erkannt: {months}. Alle Zeilen sollten im selben Abrechnungsmonat liegen."
},
"errors": {
"title": "Fehler in der Datei",
"line": "Zeile",
"field": "Feld",
"message": "Meldung",
"headerMissing": "Die Datei enthält keine Kopfzeile.",
"headerColumns": "Die Kopfzeile hat zu wenige Spalten. Ist das Trennzeichen korrekt (Semikolon)?",
"columnCount": "Die Zeile hat zu wenige Spalten.",
"personalNrMissing": "Personalnummer fehlt",
"personalNrNotNumeric": "Personalnummer muss numerisch sein",
"betragMissing": "Betrag fehlt",
"betragFormat": "Betrag muss im deutschen Zahlenformat vorliegen (Komma als Dezimaltrenner)",
"vonMissing": "Abrechnung von fehlt",
"vonFormat": "Abrechnung von muss im Format TT.MM.JJJJ vorliegen",
"bisMissing": "Abrechnung bis fehlt",
"bisFormat": "Abrechnung bis muss im Format TT.MM.JJJJ vorliegen",
"multiMonthRange": "Abrechnungszeitraum erstreckt sich über mehrere Monate",
"noRows": "Die Datei enthält keine Datenzeilen.",
"settingsMissing": "Beraternummer, Mandantennummer und Lohnart sind noch nicht hinterlegt.",
"hasErrors": "Die Datei enthält Fehler und kann nicht exportiert werden.",
"qualityCheckFailed": "Die erzeugte Datei hat die Qualitätsprüfung nicht bestanden.",
"request": "Die Anfrage ist fehlgeschlagen. Bitte versuchen Sie es erneut."
},
"fields": {
"header": "Kopfzeile",
"zeile": "Zeile",
"datei": "Datei",
"personalNr": "Personalnummer",
"betrag": "Betrag",
"abrechnungVon": "Abrechnung von",
"abrechnungBis": "Abrechnung bis",
"abrechnungVon/abrechnungBis": "Abrechnungszeitraum"
},
"download": {
"button": "DATEV-Datei herunterladen",
"busy": "Datei wird erstellt …",
"done": "Die Datei {filename} wurde heruntergeladen."
},
"settings": {
"intro": "Diese Angaben stehen im Kopf und in den Zeilen der DATEV-Datei. Sie gelten für alle Benutzer Ihres Mandanten und werden nur einmal hinterlegt.",
"beraterNr": "Beraternummer",
"mandantNr": "Mandantennummer",
"lohnart": "Lohnart",
"digitsOnly": "Bitte nur Ziffern eingeben (1 bis 10 Stellen).",
"save": "Speichern",
"saving": "Wird gespeichert …",
"saved": "Die Einstellungen wurden gespeichert."
}
},
"moduleCategories": {
"domain-tools": "Domains",
"security-tools": "Sicherheit",
"fleet": "Fuhrpark",
"infrastructure": "Infrastruktur",
"procurement": "Beschaffung",
"accounting": "Finanzbuchhaltung",
"custom-modules": "Eigene Module"
}
}
+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"
}
}