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
+13 -11
View File
@@ -47,23 +47,25 @@ const ACTION_TONE: Record<string, "ok" | "warn" | "mut" | "info"> = {
};
const ENTITY_LABEL: Record<string, string> = {
asset: "Asset",
process: "Prozess",
risk: "Risiko",
measure: "Maßnahme",
supplier: "Lieferant",
software: "Software",
project: "Projekt",
service: "IT-Dienst",
policy: "Richtlinie",
task: "Aufgabe",
user: "Benutzer",
role: "Rolle",
tenant: "Mandant",
tenant_settings: "Einstellungen",
tenant_module: "Modul",
tenant_locale: "Mandantensprache",
tenant_mfa_policy: "MFA-Pflicht",
module: "Modul",
session: "Sitzung",
bia: "BIA",
platformAdmin: "Plattform-Admin",
// Craftvia-Fachobjekte (Labels vorab, Module folgen)
customer: "Kunde",
site: "Objekt",
team: "Team",
work_order: "Auftrag",
import: "Auftragsimport",
report: "Bericht",
emergency: "Notdienst",
document: "Dokument",
};
const fmt = new Intl.DateTimeFormat("de-DE", { dateStyle: "medium", timeStyle: "short" });