Fundament: ISMS-Module entfernt; Craftvia-Rollen, Module, Navigation, i18n-Split

- ISMS-Routen, Actions, Server-/Lib-Code, Komponenten, Prisma-Modelle, Seeds,
  Importer, Skripte und ISMS-Tests entfernt (Fundament bleibt: Auth, Identity,
  MFA/WebAuthn, RBAC, Audit, Mail, Storage, Backup/DSGVO, Plattform-Admin)
- Schema auf Fundament-Modelle reduziert; TenantSettings generisch (+phone/email)
- TENANT_MODELS (db.ts, backup/topology.ts) und PII-Felder ausgedünnt
- RBAC: Rollen tenant-admin/backoffice/team-lead/technician + Craftvia-Permissions
- Modul-Katalog (customers, sites, teams, work_orders, imports, field, reports,
  emergency, documents, notifications, lotse) + Navigation aus src/lib/nav.ts
- Modul-Routen mit requireModule-Layout und Platzhalterseite
- Message-Katalog je Namespace (messages/<locale>/<namespace>.json), fs-Loader
- check-module-guards: Modul-Key aus src/server/actions/<moduleKey>/
- Provisionierung, Admin-Konsole, Einstellungen, Files-Route, Mail entkoppelt
- Seed minimal (demo/demo2, Nutzer je Rolle); Fundament-Tests auf Role/
  NotificationPreference-Fixtures umgestellt

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-14 11:35:44 +02:00
co-authored by Claude Opus 5
parent c8e6f30a27
commit 8491c7f173
443 changed files with 1325 additions and 87773 deletions
+58
View File
@@ -0,0 +1,58 @@
{
"backToOverview": "Zurück zur Übersicht",
"crumb": "Mandant",
"sub": "Kürzel {slug}{sector}",
"statusActive": "Aktiv",
"statusSuspended": "Gesperrt",
"statusArchived": "Archiviert",
"masterDataTitle": "Stammdaten",
"masterDataHint": "Unternehmensdaten aus den Mandanten-Einstellungen.",
"orgName": "Unternehmensname",
"orgShort": "Kurzname",
"slug": "Kürzel",
"address": "Adresse",
"sector": "Sektor",
"status": "Status",
"notSet": "—",
"mainContactTitle": "Hauptkontakt",
"mainContactHint": "Abgeleitet aus dem/den Mandanten-Administrator(en).",
"mainContactNone": "Kein aktiver Mandanten-Administrator hinterlegt.",
"manageTitle": "Verwaltung",
"manageHint": "Module und Benutzer dieses Mandanten in einem Popup verwalten.",
"manageModules": "Module verwalten",
"manageUsers": "Benutzer verwalten",
"usersCount": "{count} Nutzer",
"modulesTitle": "Module",
"modulesHint": "Deaktivierte Module sind für den Kunden ausgeblendet und serverseitig gesperrt.",
"moduleActive": "Aktiv",
"moduleInactive": "Inaktiv",
"moduleActivate": "Aktivieren",
"moduleDeactivate": "Deaktivieren",
"modulesModalSub": "Module für {name} aktivieren/deaktivieren",
"usersModalSub": "Benutzer von {name} — anlegen, Rollen, deaktivieren, Passwort zurücksetzen",
"lifecycleTitle": "Lebenszyklus",
"lifecycleActivate": "Aktivieren",
"lifecycleSuspend": "Sperren (Login blockiert)",
"lifecycleArchive": "Archivieren",
"lifecycleNote": "Gesperrte Mandanten können sich nicht anmelden; Archivierung blendet sie aus.",
"mfaTitle": "MFA-Pflicht",
"mfaHint": "Bei Aktivierung müssen alle Nutzer dieses Mandanten beim nächsten Login eine Zwei-Faktor-Authentifizierung einrichten. Aktuell: {state}.",
"mfaStateOn": "aktiv",
"mfaStateOff": "aus",
"mfaActivate": "MFA-Pflicht aktivieren",
"mfaDeactivate": "MFA-Pflicht deaktivieren",
"auditTitle": "Audit-Trail",
"auditHint": "Nachvollziehbare Aktivitäten dieses Mandanten — wer hat wann was geändert.",
"auditView": "Audit-Trail einsehen",
"auditSub": "Aktivitäten von {name} (neueste zuerst, letzte 200)",
"userCreate": "Benutzer anlegen",
"userCreateSub": "Neuer Nutzer für {name}",
"userEdit": "Benutzer bearbeiten — {name}",
"close": "Schließen",
"phone": "Telefon",
"email": "E-Mail",
"localeTitle": "Mandantensprache",
"localeHint": "Standardsprache für Benachrichtigungen und Dokumente dieses Mandanten (Nutzer wählen ihre UI-Sprache selbst). Aktuell: {lang}.",
"localeDe": "Deutsch",
"localeEn": "English"
}
+23
View File
@@ -0,0 +1,23 @@
{
"appName": "Craftvia",
"appTagline": "Handwerk. Digital auf Kurs.",
"language": "Sprache",
"logout": "Abmelden",
"create": "Anlegen",
"save": "Speichern",
"cancel": "Abbrechen",
"edit": "Bearbeiten",
"delete": "Löschen",
"back": "Zurück",
"close": "Schließen",
"search": "Suchen…",
"actions": "Aktionen",
"add": "Hinzufügen",
"remove": "Entfernen",
"none": "—",
"comingSoon": "Bald verfügbar",
"confirmDelete": "Wirklich löschen?",
"yes": "Ja",
"no": "Nein",
"readOnly": "Nur-Lese-Zugriff."
}
+8
View File
@@ -0,0 +1,8 @@
{
"title": "Dashboard",
"crumb": "Übersicht",
"subtitle": "Willkommen, {name} — {tenant}",
"placeholderTitle": "Dashboard in Umsetzung",
"placeholder": "Hier erscheinen künftig offene Aufträge, heutige Einsätze, freizugebende Berichte und Notdienst-Meldungen.",
"moduleDisabled": "Das angeforderte Modul ist für Ihren Betrieb nicht freigeschaltet."
}
+11
View File
@@ -0,0 +1,11 @@
{
"title": "Anmelden",
"tagline": "Handwerk. Digital auf Kurs.",
"subtitle": "Melde dich mit deinem Firmenkonto an.",
"email": "E-Mail-Adresse",
"password": "Passwort",
"mfaOptional": "MFA-Code (falls eingerichtet)",
"submit": "Anmelden",
"forgotPassword": "Passwort vergessen?",
"error": "Anmeldung fehlgeschlagen. Bitte prüfe E-Mail und Passwort."
}
+18
View File
@@ -0,0 +1,18 @@
{
"customers": "Kunden",
"sites": "Objekte",
"teams": "Teams",
"workOrders": "Aufträge",
"imports": "Auftragsimport",
"field": "Einsätze",
"reports": "Berichte",
"emergency": "Notdienst",
"documents": "Dokumente",
"notifications": "Benachrichtigungen",
"lotse": "Lotse (KI-Assistent)",
"placeholder": {
"crumb": "Modul",
"status": "Modul in Umsetzung",
"hint": "Dieser Bereich wird gerade gebaut. Navigation, Modul-Freischaltung und Berechtigungen sind bereits aktiv."
}
}
+12
View File
@@ -0,0 +1,12 @@
{
"dashboard": "Dashboard",
"workOrders": "Aufträge",
"imports": "Import",
"customers": "Kunden",
"sites": "Objekte",
"teams": "Teams",
"reports": "Berichte",
"documents": "Dokumente",
"settings": "Einstellungen",
"admin": "Admin-Konsole"
}