Files
certvia/src/lib/modules.ts
T
msolarczekandClaude Opus 4.8 0e3ed82b21 Admin-Konsole & Mandantenverwaltung (Phase 1)
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>
2026-07-19 20:38:10 +02:00

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])
);