Plattform-Admin-Konsole (Superadmin) + Kunden-Einstellungsbereich: - Datenmodell: TenantSettings (Quelle der ISMS-Template-Variablen), TenantModule (Feature-Toggles je Mandant), Tenant += short/sector, TenantStatus += ARCHIVED, AuditLog += scope (tenant|platform); RLS für die neuen Tenant-Tabellen. - Wiederverwendbare Provisionierung (server/provision.ts): Rollen+Permissions, erster Admin-User, Einstellungen, alle Module, optional Richtlinienpaket-Seed + TISAX-Default; idempotent + Audit (§3.7). syncPolicyVariablesFromSettings mappt Stammdaten → ISMS-Variablen (ORG_NAME, ISMS_SCOPE, ROLE_* …). - Admin-Konsole /admin (Guard isPlatformAdmin): Mandantenliste, „Neuer Kunde" (anlegen + provisionieren), Detailseite mit Modul-Toggles, Lebenszyklus (aktiv/gesperrt/archiviert), Nutzerliste. Aktionen im Plattform-Audit-Log. - Kunden-Einstellungen /settings (Guard tenant:manage): Unternehmensdaten, verantwortliche Rollen, Branding/Regionales, TISAX-Level — Stammdaten speisen die ISMS-Variablen (eine Pflegestelle). Modul-Übersicht. - Modul-Gating der Navigation (deaktivierte Module ausgeblendet); Login bereits für gesperrte/archivierte Mandanten blockiert (auth.authorize). - Seed: Demo-Mandant mit Einstellungen, 12 aktiven Modulen; admin@demo.example = Superadmin. Verifiziert: tsc/lint/build grün; Seed rollt Einstellungen/Module/Superadmin aus. (Browser-Verifikation diese Sitzung nicht möglich — Preview-Tools getrennt.) Offen (Phase 2): separater Superadmin-Store + eigener Login + MFA-Pflicht; Impersonation (zeitlich begrenzt, protokolliert); Plan/Limits; Logo-Upload/ Objektspeicher; SMTP/Benachrichtigungen; per-Route-Modul-Enforcement (serverseitig); Datenexport/Löschung/Retention (DSGVO); SSO. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
34 lines
1.6 KiB
TypeScript
34 lines
1.6 KiB
TypeScript
/**
|
|
* Aktivierbare Module je Mandant (§3.4). `nav` verweist auf den Übersetzungs-
|
|
* schlüssel des Navigationseintrags, `href` auf die gegatete Route. Das Dashboard
|
|
* ist immer aktiv und kein Modul.
|
|
*/
|
|
export interface ModuleDef {
|
|
key: string;
|
|
name: string; // Anzeigename in der Admin-Konsole
|
|
href: string;
|
|
nav: string; // Schlüssel in messages nav.*
|
|
}
|
|
|
|
export const MODULES: ModuleDef[] = [
|
|
{ key: "assets", name: "Asset-Inventar", href: "/assets", nav: "assets" },
|
|
{ key: "bia", name: "Business Impact Analyse", href: "/processes", nav: "bia" },
|
|
{ key: "risk", name: "Risikoanalyse", href: "/risks", nav: "risks" },
|
|
{ key: "soa", name: "SoA & Controls", href: "/soa", nav: "soa" },
|
|
{ key: "measures", name: "Maßnahmen / Reviews", href: "/measures", nav: "measures" },
|
|
{ key: "incidents", name: "Vorfälle", href: "/incidents", nav: "incidents" },
|
|
{ key: "policies", name: "Richtlinien & Verfahren", href: "/policies", nav: "policies" },
|
|
{ key: "suppliers", name: "Lieferanten- / IT-Service-Management", href: "/suppliers", nav: "suppliers" },
|
|
{ key: "dependencies", name: "Abhängigkeiten", href: "/dependencies", nav: "dependencies" },
|
|
{ key: "evidence", name: "Nachweise", href: "/evidence", nav: "evidence" },
|
|
{ key: "chat", name: "KI-Chat", href: "/chat", nav: "chat" },
|
|
{ key: "review", name: "Management-Review", href: "/review", nav: "review" },
|
|
];
|
|
|
|
export const MODULE_KEYS = MODULES.map((m) => m.key);
|
|
|
|
/** Route → Modul-Key (für den serverseitigen requireModule-Guard). */
|
|
export const HREF_TO_MODULE: Record<string, string> = Object.fromEntries(
|
|
MODULES.map((m) => [m.href, m.key])
|
|
);
|