Iteration 3: Risikoanalyse + Menü-Trennung + Prozesskategorie

- Risiko-Modul (SPEC §4.2): Risk/RiskAsset-Schema mit RLS, laufende
  Nummer je Mandant (R-001), Brutto-/Rest-Bewertung (5×5), Behandlung,
  Status, Owner- und Prozess-Bezug, n:m betroffene Assets
- /risks im Mockup-Layout: 5×5-Heatmap (Farb-Bänder + R-Chips, Legende,
  Achsen) und Risikoregister mit Score-Pillen, Behandlungs-Tags, Status
- Risiko-Popups nach App-Muster: Read-only-Detail (Bewertungs-Band
  Brutto vs. Rest, betroffene Assets, Maßnahmen-Platzhalter für
  Iteration 4), Bearbeiten im Popup (Bewertung, Assets verknüpfen,
  Löschen), Anlegen; Server-Actions mit Zod, RBAC und Audit-Log
- Menü aufgetrennt: eigene Punkte "Asset-Inventar", "Business Impact
  Analyse" und "Risikoanalyse" (Modul-Tabs entfernt)
- Prozesskategorie (Kernprozess/Managementprozess/Unterstützender
  Prozess): Schema-Feld, Formulare, Listen-Spalte, Popup-Tag
- Asset-Detail-Popup optisch ans Prozess-Popup angeglichen (Stammdaten-
  Karte mit violettem Rand, Abhängigkeiten-Tabelle, Risiken-Band)
- "Zugeordnete Risiken" jetzt echt: im Asset-Popup (verknüpfte Risiken)
  und im Prozess-Popup (direkt + über Assets aggregiert); Dashboard-KPI
  "Offene Risiken" mit echten Zahlen; Seed mit 4 Beispiel-Risiken

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Martin
2026-07-02 15:43:25 +02:00
co-authored by Claude Fable 5
parent c5a1f0095b
commit df634e356d
20 changed files with 1633 additions and 106 deletions
+33
View File
@@ -0,0 +1,33 @@
/** Score-Bänder der 5×5-Matrix (Farben/Stufen aus dem Mockup). */
export type RiskLevelKey = "low" | "medium" | "elevated" | "high" | "critical";
export function riskLevel(score: number): RiskLevelKey {
if (score >= 20) return "critical";
if (score >= 15) return "high";
if (score >= 10) return "elevated";
if (score >= 5) return "medium";
return "low";
}
/** Zellen-Hintergrund der Heatmap (Mockup-Legende). */
export const RISK_CELL_COLORS: Record<RiskLevelKey, string> = {
low: "#dff3e5",
medium: "#fdf0cf",
elevated: "#fbdcc0",
high: "#f6c3c1",
critical: "#ef9a98",
};
/** Pillen-Ton je Stufe (mockup-ui Pill). */
export const RISK_PILL_TONE: Record<RiskLevelKey, "ok" | "info" | "warn" | "risk"> = {
low: "ok",
medium: "info",
elevated: "warn",
high: "risk",
critical: "risk",
};
export function riskRef(refNo: number): string {
return `R-${String(refNo).padStart(3, "0")}`;
}