feat: add reporting frontend, fix module categorization, update docs
- Create Reporting module frontend (page.tsx) with executive dashboard showing compliance score, risk overview, deadlines, module KPIs - Create Reporting lib (types.ts, api.ts) matching Go backend models - Add Reporting to STEP_EXPLANATIONS and both SDK sidebars - Remove DSB Portal, Multi-Tenant, SSO from SDK sidebars (admin-only) - Add Multi-Tenant, SSO, DSB Portal to dashboard navigation.ts with 'Plattform-Verwaltung' subgroup - Update docs: academy.md (PDF certs), reporting.md (new), index.md (SDK vs Admin categorization), mkdocs.yml (all modules) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
513
admin-compliance/app/(sdk)/sdk/reporting/page.tsx
Normal file
513
admin-compliance/app/(sdk)/sdk/reporting/page.tsx
Normal file
@@ -0,0 +1,513 @@
|
||||
'use client'
|
||||
|
||||
import React, { useState, useEffect } from 'react'
|
||||
import { useSDK } from '@/lib/sdk'
|
||||
import { StepHeader } from '@/components/sdk/StepHeader'
|
||||
import {
|
||||
ExecutiveReport,
|
||||
RiskLevel,
|
||||
DeadlineSeverity,
|
||||
RISK_LEVEL_INFO,
|
||||
DEADLINE_SEVERITY_INFO,
|
||||
getScoreColor,
|
||||
getScoreBgColor,
|
||||
} from '@/lib/sdk/reporting/types'
|
||||
import { getExecutiveReport } from '@/lib/sdk/reporting/api'
|
||||
|
||||
// =============================================================================
|
||||
// TYPES
|
||||
// =============================================================================
|
||||
|
||||
type TabId = 'overview' | 'risks' | 'deadlines' | 'modules' | 'activity'
|
||||
|
||||
interface Tab {
|
||||
id: TabId
|
||||
label: string
|
||||
}
|
||||
|
||||
// =============================================================================
|
||||
// HELPER COMPONENTS
|
||||
// =============================================================================
|
||||
|
||||
function TabNavigation({
|
||||
tabs,
|
||||
activeTab,
|
||||
onTabChange,
|
||||
}: {
|
||||
tabs: Tab[]
|
||||
activeTab: TabId
|
||||
onTabChange: (tab: TabId) => void
|
||||
}) {
|
||||
return (
|
||||
<div className="border-b border-gray-200">
|
||||
<nav className="flex gap-1 -mb-px" aria-label="Tabs">
|
||||
{tabs.map(tab => (
|
||||
<button
|
||||
key={tab.id}
|
||||
onClick={() => onTabChange(tab.id)}
|
||||
className={`px-4 py-3 text-sm font-medium border-b-2 transition-colors ${
|
||||
activeTab === tab.id
|
||||
? 'border-purple-600 text-purple-600'
|
||||
: 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'
|
||||
}`}
|
||||
>
|
||||
{tab.label}
|
||||
</button>
|
||||
))}
|
||||
</nav>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
function ScoreCircle({ score }: { score: number }) {
|
||||
const circumference = 2 * Math.PI * 60
|
||||
const strokeDashoffset = circumference - (score / 100) * circumference
|
||||
|
||||
return (
|
||||
<div className="relative w-36 h-36">
|
||||
<svg className="w-full h-full -rotate-90" viewBox="0 0 128 128">
|
||||
<circle
|
||||
cx="64" cy="64" r="60"
|
||||
stroke="#e5e7eb" strokeWidth="8" fill="none"
|
||||
/>
|
||||
<circle
|
||||
cx="64" cy="64" r="60"
|
||||
stroke={score >= 80 ? '#22c55e' : score >= 60 ? '#eab308' : score >= 40 ? '#f97316' : '#ef4444'}
|
||||
strokeWidth="8" fill="none"
|
||||
strokeLinecap="round"
|
||||
strokeDasharray={circumference}
|
||||
strokeDashoffset={strokeDashoffset}
|
||||
className="transition-all duration-1000"
|
||||
/>
|
||||
</svg>
|
||||
<div className="absolute inset-0 flex flex-col items-center justify-center">
|
||||
<span className={`text-3xl font-bold ${getScoreColor(score)}`}>{score}%</span>
|
||||
<span className="text-xs text-gray-500">Compliance</span>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
function StatCard({
|
||||
label,
|
||||
value,
|
||||
color = 'gray',
|
||||
subtitle,
|
||||
}: {
|
||||
label: string
|
||||
value: number | string
|
||||
color?: 'gray' | 'blue' | 'yellow' | 'red' | 'green' | 'purple' | 'orange'
|
||||
subtitle?: string
|
||||
}) {
|
||||
const colorClasses: Record<string, string> = {
|
||||
gray: 'border-gray-200 text-gray-900',
|
||||
blue: 'border-blue-200 text-blue-600',
|
||||
yellow: 'border-yellow-200 text-yellow-600',
|
||||
red: 'border-red-200 text-red-600',
|
||||
green: 'border-green-200 text-green-600',
|
||||
purple: 'border-purple-200 text-purple-600',
|
||||
orange: 'border-orange-200 text-orange-600',
|
||||
}
|
||||
|
||||
return (
|
||||
<div className={`bg-white rounded-xl border-2 ${colorClasses[color]} p-4`}>
|
||||
<div className="text-sm text-gray-500 mb-1">{label}</div>
|
||||
<div className={`text-2xl font-bold ${colorClasses[color]?.split(' ')[1] || ''}`}>{value}</div>
|
||||
{subtitle && <div className="text-xs text-gray-400 mt-1">{subtitle}</div>}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
function RiskBadge({ level }: { level: RiskLevel }) {
|
||||
const info = RISK_LEVEL_INFO[level]
|
||||
return (
|
||||
<span className={`px-2 py-1 rounded-full text-xs font-medium ${info.bgColor} ${info.color}`}>
|
||||
{info.label}
|
||||
</span>
|
||||
)
|
||||
}
|
||||
|
||||
function DeadlineBadge({ severity }: { severity: DeadlineSeverity }) {
|
||||
const info = DEADLINE_SEVERITY_INFO[severity]
|
||||
return (
|
||||
<span className={`px-2 py-1 rounded-full text-xs font-medium ${info.bgColor} ${info.color}`}>
|
||||
{info.label}
|
||||
</span>
|
||||
)
|
||||
}
|
||||
|
||||
// =============================================================================
|
||||
// TAB CONTENTS
|
||||
// =============================================================================
|
||||
|
||||
function OverviewTab({ report }: { report: ExecutiveReport }) {
|
||||
return (
|
||||
<div className="space-y-6">
|
||||
{/* Score + Key Metrics */}
|
||||
<div className="grid grid-cols-1 lg:grid-cols-4 gap-6">
|
||||
<div className="lg:col-span-1 bg-white rounded-xl border border-gray-200 p-6 flex flex-col items-center justify-center">
|
||||
<ScoreCircle score={report.complianceScore} />
|
||||
<div className="mt-3 flex items-center gap-2">
|
||||
<span className="text-sm text-gray-500">Risikolevel:</span>
|
||||
<RiskBadge level={report.riskOverview.overallLevel} />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="lg:col-span-3 grid grid-cols-2 md:grid-cols-3 gap-4">
|
||||
<StatCard label="Verarbeitungstaetigkeiten" value={report.dsgvo.processingActivities} color="blue" subtitle={`${report.dsgvo.activeProcessings} aktiv`} />
|
||||
<StatCard label="TOMs umgesetzt" value={`${report.dsgvo.tomsImplemented}/${report.dsgvo.tomsTotal}`} color={report.dsgvo.completionPercent >= 80 ? 'green' : 'yellow'} subtitle={`${report.dsgvo.completionPercent}% vollstaendig`} />
|
||||
<StatCard label="Offene Betroffenenanfragen" value={report.dsgvo.openDSRs} color={report.dsgvo.overdueDSRs > 0 ? 'red' : 'green'} subtitle={report.dsgvo.overdueDSRs > 0 ? `${report.dsgvo.overdueDSRs} ueberfaellig` : 'Keine ueberfaelligen'} />
|
||||
<StatCard label="Offene Vorfaelle" value={report.incidents.openIncidents} color={report.incidents.criticalIncidents > 0 ? 'red' : 'green'} subtitle={report.incidents.criticalIncidents > 0 ? `${report.incidents.criticalIncidents} kritisch` : 'Keine kritischen'} />
|
||||
<StatCard label="Schulungsquote" value={`${Math.round(report.academy.completionRate)}%`} color={report.academy.completionRate >= 80 ? 'green' : 'yellow'} subtitle={`${report.academy.overdueCount} ueberfaellig`} />
|
||||
<StatCard label="Lieferanten" value={report.vendors.totalVendors} color="purple" subtitle={`${report.vendors.pendingReviews} ausstehende Pruefungen`} />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Deadlines Summary */}
|
||||
{report.upcomingDeadlines.length > 0 && (
|
||||
<div className="bg-white rounded-xl border border-gray-200 p-6">
|
||||
<h3 className="text-lg font-semibold text-gray-900 mb-4">Naechste Fristen</h3>
|
||||
<div className="space-y-3">
|
||||
{report.upcomingDeadlines.slice(0, 5).map((dl, i) => (
|
||||
<div key={i} className="flex items-center justify-between py-2 border-b border-gray-100 last:border-0">
|
||||
<div className="flex items-center gap-3">
|
||||
<DeadlineBadge severity={dl.severity} />
|
||||
<div>
|
||||
<div className="text-sm font-medium text-gray-900">{dl.description}</div>
|
||||
<div className="text-xs text-gray-500">{dl.module} · {dl.type}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className={`text-sm font-medium ${dl.daysLeft <= 0 ? 'text-red-600' : dl.daysLeft <= 7 ? 'text-orange-600' : 'text-gray-600'}`}>
|
||||
{dl.daysLeft <= 0 ? `${Math.abs(dl.daysLeft)} Tage ueberfaellig` : `${dl.daysLeft} Tage`}
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
function RisksTab({ report }: { report: ExecutiveReport }) {
|
||||
return (
|
||||
<div className="space-y-6">
|
||||
{/* Overall Risk */}
|
||||
<div className="bg-white rounded-xl border border-gray-200 p-6">
|
||||
<div className="flex items-center justify-between mb-4">
|
||||
<h3 className="text-lg font-semibold text-gray-900">Gesamt-Risikobewertung</h3>
|
||||
<RiskBadge level={report.riskOverview.overallLevel} />
|
||||
</div>
|
||||
<div className="grid grid-cols-2 gap-4">
|
||||
<StatCard label="Offene Findings" value={report.riskOverview.openFindings} color={report.riskOverview.openFindings > 5 ? 'orange' : 'gray'} />
|
||||
<StatCard label="Kritische Findings" value={report.riskOverview.criticalFindings} color={report.riskOverview.criticalFindings > 0 ? 'red' : 'green'} />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Per-Module Risks */}
|
||||
<div className="bg-white rounded-xl border border-gray-200 p-6">
|
||||
<h3 className="text-lg font-semibold text-gray-900 mb-4">Risiken nach Modul</h3>
|
||||
<div className="space-y-3">
|
||||
{report.riskOverview.moduleRisks.map((mr, i) => (
|
||||
<div key={i} className="flex items-center justify-between py-3 border-b border-gray-100 last:border-0">
|
||||
<div className="flex items-center gap-3">
|
||||
<span className="text-sm font-medium text-gray-900 w-32">{mr.module}</span>
|
||||
<RiskBadge level={mr.level} />
|
||||
</div>
|
||||
<div className="flex items-center gap-4">
|
||||
<div className="w-32 h-2 bg-gray-200 rounded-full overflow-hidden">
|
||||
<div
|
||||
className={`h-full rounded-full ${getScoreBgColor(mr.score)}`}
|
||||
style={{ width: `${mr.score}%` }}
|
||||
/>
|
||||
</div>
|
||||
<span className="text-sm text-gray-500 w-12 text-right">{mr.score}%</span>
|
||||
<span className="text-xs text-gray-400">{mr.issues} Issues</span>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
function DeadlinesTab({ report }: { report: ExecutiveReport }) {
|
||||
return (
|
||||
<div className="bg-white rounded-xl border border-gray-200 p-6">
|
||||
<h3 className="text-lg font-semibold text-gray-900 mb-4">Alle Fristen ({report.upcomingDeadlines.length})</h3>
|
||||
{report.upcomingDeadlines.length === 0 ? (
|
||||
<p className="text-gray-500 text-sm">Keine bevorstehenden Fristen.</p>
|
||||
) : (
|
||||
<div className="overflow-x-auto">
|
||||
<table className="w-full text-sm">
|
||||
<thead>
|
||||
<tr className="border-b border-gray-200">
|
||||
<th className="text-left py-2 font-medium text-gray-500">Status</th>
|
||||
<th className="text-left py-2 font-medium text-gray-500">Modul</th>
|
||||
<th className="text-left py-2 font-medium text-gray-500">Typ</th>
|
||||
<th className="text-left py-2 font-medium text-gray-500">Beschreibung</th>
|
||||
<th className="text-left py-2 font-medium text-gray-500">Faellig am</th>
|
||||
<th className="text-right py-2 font-medium text-gray-500">Verbleibend</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{report.upcomingDeadlines.map((dl, i) => (
|
||||
<tr key={i} className="border-b border-gray-50 hover:bg-gray-50">
|
||||
<td className="py-2"><DeadlineBadge severity={dl.severity} /></td>
|
||||
<td className="py-2 text-gray-700">{dl.module}</td>
|
||||
<td className="py-2 text-gray-500">{dl.type}</td>
|
||||
<td className="py-2 text-gray-900">{dl.description}</td>
|
||||
<td className="py-2 text-gray-500">{new Date(dl.dueDate).toLocaleDateString('de-DE')}</td>
|
||||
<td className={`py-2 text-right font-medium ${dl.daysLeft <= 0 ? 'text-red-600' : dl.daysLeft <= 7 ? 'text-orange-600' : 'text-gray-600'}`}>
|
||||
{dl.daysLeft <= 0 ? `${Math.abs(dl.daysLeft)}d ueberfaellig` : `${dl.daysLeft}d`}
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
function ModulesTab({ report }: { report: ExecutiveReport }) {
|
||||
return (
|
||||
<div className="space-y-6">
|
||||
{/* DSGVO Module */}
|
||||
<div className="bg-white rounded-xl border border-gray-200 p-6">
|
||||
<h3 className="text-lg font-semibold text-gray-900 mb-4">DSGVO-Compliance</h3>
|
||||
<div className="grid grid-cols-2 md:grid-cols-4 gap-4">
|
||||
<StatCard label="Verarbeitungen" value={report.dsgvo.processingActivities} color="blue" />
|
||||
<StatCard label="TOM-Umsetzung" value={`${report.dsgvo.completionPercent}%`} color={report.dsgvo.completionPercent >= 80 ? 'green' : 'yellow'} />
|
||||
<StatCard label="DSFAs abgeschlossen" value={report.dsgvo.dsfasCompleted} color="purple" />
|
||||
<StatCard label="Loeschfristen definiert" value={report.dsgvo.retentionPolicies} color="gray" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Vendors */}
|
||||
<div className="bg-white rounded-xl border border-gray-200 p-6">
|
||||
<h3 className="text-lg font-semibold text-gray-900 mb-4">Lieferanten-Compliance</h3>
|
||||
<div className="grid grid-cols-2 md:grid-cols-4 gap-4">
|
||||
<StatCard label="Lieferanten gesamt" value={report.vendors.totalVendors} color="purple" />
|
||||
<StatCard label="Aktive Lieferanten" value={report.vendors.activeVendors} color="blue" />
|
||||
<StatCard label="Ausstehende Pruefungen" value={report.vendors.pendingReviews} color={report.vendors.pendingReviews > 0 ? 'yellow' : 'green'} />
|
||||
<StatCard label="Abgelaufene Vertraege" value={report.vendors.expiredContracts} color={report.vendors.expiredContracts > 0 ? 'red' : 'green'} />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Incidents */}
|
||||
<div className="bg-white rounded-xl border border-gray-200 p-6">
|
||||
<h3 className="text-lg font-semibold text-gray-900 mb-4">Datenschutzvorfaelle</h3>
|
||||
<div className="grid grid-cols-2 md:grid-cols-4 gap-4">
|
||||
<StatCard label="Vorfaelle gesamt" value={report.incidents.totalIncidents} color="gray" />
|
||||
<StatCard label="Offen" value={report.incidents.openIncidents} color={report.incidents.openIncidents > 0 ? 'orange' : 'green'} />
|
||||
<StatCard label="Kritisch" value={report.incidents.criticalIncidents} color={report.incidents.criticalIncidents > 0 ? 'red' : 'green'} />
|
||||
<StatCard label="Meldungen ausstehend" value={report.incidents.notificationsPending} color={report.incidents.notificationsPending > 0 ? 'red' : 'green'} />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Whistleblower */}
|
||||
<div className="bg-white rounded-xl border border-gray-200 p-6">
|
||||
<h3 className="text-lg font-semibold text-gray-900 mb-4">Hinweisgebersystem</h3>
|
||||
<div className="grid grid-cols-2 md:grid-cols-4 gap-4">
|
||||
<StatCard label="Meldungen gesamt" value={report.whistleblower.totalReports} color="gray" />
|
||||
<StatCard label="Offen" value={report.whistleblower.openReports} color={report.whistleblower.openReports > 0 ? 'yellow' : 'green'} />
|
||||
<StatCard label="Eingangsbestaetigung ueberfaellig" value={report.whistleblower.overdueAcknowledgments} color={report.whistleblower.overdueAcknowledgments > 0 ? 'red' : 'green'} />
|
||||
<StatCard label="Rueckmeldung ueberfaellig" value={report.whistleblower.overdueFeedbacks} color={report.whistleblower.overdueFeedbacks > 0 ? 'red' : 'green'} />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Academy */}
|
||||
<div className="bg-white rounded-xl border border-gray-200 p-6">
|
||||
<h3 className="text-lg font-semibold text-gray-900 mb-4">Compliance Academy</h3>
|
||||
<div className="grid grid-cols-2 md:grid-cols-4 gap-4">
|
||||
<StatCard label="Kurse" value={report.academy.totalCourses} color="purple" />
|
||||
<StatCard label="Einschreibungen" value={report.academy.totalEnrollments} color="blue" />
|
||||
<StatCard label="Abschlussrate" value={`${Math.round(report.academy.completionRate)}%`} color={report.academy.completionRate >= 80 ? 'green' : 'yellow'} />
|
||||
<StatCard label="Ueberfaellig" value={report.academy.overdueCount} color={report.academy.overdueCount > 0 ? 'red' : 'green'} />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
function ActivityTab({ report }: { report: ExecutiveReport }) {
|
||||
return (
|
||||
<div className="bg-white rounded-xl border border-gray-200 p-6">
|
||||
<h3 className="text-lg font-semibold text-gray-900 mb-4">Letzte Aktivitaeten</h3>
|
||||
{report.recentActivity.length === 0 ? (
|
||||
<p className="text-gray-500 text-sm">Keine Aktivitaeten vorhanden.</p>
|
||||
) : (
|
||||
<div className="space-y-3">
|
||||
{report.recentActivity.map((entry, i) => (
|
||||
<div key={i} className="flex items-start gap-3 py-2 border-b border-gray-100 last:border-0">
|
||||
<div className="w-2 h-2 rounded-full bg-purple-400 mt-2 flex-shrink-0" />
|
||||
<div className="flex-1 min-w-0">
|
||||
<div className="text-sm text-gray-900">{entry.description}</div>
|
||||
<div className="text-xs text-gray-500 flex gap-2 mt-0.5">
|
||||
<span>{entry.module}</span>
|
||||
<span>·</span>
|
||||
<span>{entry.action}</span>
|
||||
<span>·</span>
|
||||
<span>{new Date(entry.timestamp).toLocaleString('de-DE')}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
// =============================================================================
|
||||
// MOCK DATA (used when backend is unavailable)
|
||||
// =============================================================================
|
||||
|
||||
function getMockReport(): ExecutiveReport {
|
||||
return {
|
||||
generatedAt: new Date().toISOString(),
|
||||
tenantId: 'demo',
|
||||
complianceScore: 72,
|
||||
dsgvo: {
|
||||
processingActivities: 24,
|
||||
activeProcessings: 18,
|
||||
tomsImplemented: 31,
|
||||
tomsPlanned: 7,
|
||||
tomsTotal: 42,
|
||||
completionPercent: 74,
|
||||
openDSRs: 3,
|
||||
overdueDSRs: 1,
|
||||
dsfasCompleted: 4,
|
||||
retentionPolicies: 12,
|
||||
},
|
||||
vendors: {
|
||||
totalVendors: 15,
|
||||
activeVendors: 12,
|
||||
byRiskLevel: { LOW: 8, MEDIUM: 4, HIGH: 2, CRITICAL: 1 },
|
||||
pendingReviews: 3,
|
||||
expiredContracts: 1,
|
||||
},
|
||||
incidents: {
|
||||
totalIncidents: 7,
|
||||
openIncidents: 2,
|
||||
criticalIncidents: 0,
|
||||
notificationsPending: 0,
|
||||
avgResolutionHours: 48.5,
|
||||
},
|
||||
whistleblower: {
|
||||
totalReports: 4,
|
||||
openReports: 1,
|
||||
overdueAcknowledgments: 0,
|
||||
overdueFeedbacks: 0,
|
||||
avgResolutionDays: 21.3,
|
||||
},
|
||||
academy: {
|
||||
totalCourses: 5,
|
||||
totalEnrollments: 47,
|
||||
completionRate: 68.5,
|
||||
overdueCount: 4,
|
||||
avgCompletionDays: 14.2,
|
||||
},
|
||||
riskOverview: {
|
||||
overallLevel: 'MEDIUM',
|
||||
moduleRisks: [
|
||||
{ module: 'DSGVO', level: 'MEDIUM', score: 74, issues: 8 },
|
||||
{ module: 'Lieferanten', level: 'HIGH', score: 55, issues: 5 },
|
||||
{ module: 'Vorfaelle', level: 'LOW', score: 85, issues: 2 },
|
||||
{ module: 'Hinweisgeberschutz', level: 'LOW', score: 90, issues: 1 },
|
||||
{ module: 'Schulungen', level: 'MEDIUM', score: 68, issues: 4 },
|
||||
],
|
||||
openFindings: 12,
|
||||
criticalFindings: 2,
|
||||
},
|
||||
upcomingDeadlines: [
|
||||
{ module: 'DSGVO', type: 'Betroffenenanfrage', description: 'Auskunftsersuchen Max Mustermann', dueDate: new Date(Date.now() + 2 * 86400000).toISOString(), daysLeft: 2, severity: 'URGENT' },
|
||||
{ module: 'Lieferanten', type: 'Vertragspruefung', description: 'AWS AVV-Erneuerung', dueDate: new Date(Date.now() + 14 * 86400000).toISOString(), daysLeft: 14, severity: 'WARNING' },
|
||||
{ module: 'Schulungen', type: 'Pflichtschulung', description: 'DSGVO-Jahresschulung Q1 2026', dueDate: new Date(Date.now() + 30 * 86400000).toISOString(), daysLeft: 30, severity: 'INFO' },
|
||||
{ module: 'Vorfaelle', type: 'Aufsichtsbehoerde', description: 'Meldung Datenpanne #7 an LfDI', dueDate: new Date(Date.now() - 1 * 86400000).toISOString(), daysLeft: -1, severity: 'OVERDUE' },
|
||||
],
|
||||
recentActivity: [
|
||||
{ timestamp: new Date(Date.now() - 3600000).toISOString(), module: 'Academy', action: 'completed', description: 'IT-Sicherheitsschulung von Anna Mueller abgeschlossen' },
|
||||
{ timestamp: new Date(Date.now() - 7200000).toISOString(), module: 'Incidents', action: 'created', description: 'Neuer Vorfall: USB-Stick mit Kundendaten verloren' },
|
||||
{ timestamp: new Date(Date.now() - 86400000).toISOString(), module: 'DSGVO', action: 'updated', description: 'TOM IT-05 (Firewall-Policy) als umgesetzt markiert' },
|
||||
{ timestamp: new Date(Date.now() - 172800000).toISOString(), module: 'Vendors', action: 'reviewed', description: 'Lieferanten-Assessment: Mailchimp abgeschlossen' },
|
||||
],
|
||||
}
|
||||
}
|
||||
|
||||
// =============================================================================
|
||||
// MAIN COMPONENT
|
||||
// =============================================================================
|
||||
|
||||
export default function ReportingPage() {
|
||||
const { state } = useSDK()
|
||||
const [activeTab, setActiveTab] = useState<TabId>('overview')
|
||||
const [report, setReport] = useState<ExecutiveReport | null>(null)
|
||||
const [loading, setLoading] = useState(true)
|
||||
const [error, setError] = useState<string | null>(null)
|
||||
|
||||
useEffect(() => {
|
||||
let cancelled = false
|
||||
|
||||
async function loadReport() {
|
||||
setLoading(true)
|
||||
setError(null)
|
||||
try {
|
||||
const data = await getExecutiveReport()
|
||||
if (!cancelled) setReport(data)
|
||||
} catch (err) {
|
||||
console.warn('Backend nicht erreichbar, verwende Demo-Daten:', err)
|
||||
if (!cancelled) setReport(getMockReport())
|
||||
} finally {
|
||||
if (!cancelled) setLoading(false)
|
||||
}
|
||||
}
|
||||
|
||||
loadReport()
|
||||
return () => { cancelled = true }
|
||||
}, [])
|
||||
|
||||
const tabs: Tab[] = [
|
||||
{ id: 'overview', label: 'Uebersicht' },
|
||||
{ id: 'risks', label: 'Risiken' },
|
||||
{ id: 'deadlines', label: 'Fristen' },
|
||||
{ id: 'modules', label: 'Module' },
|
||||
{ id: 'activity', label: 'Aktivitaeten' },
|
||||
]
|
||||
|
||||
return (
|
||||
<div className="space-y-6">
|
||||
<StepHeader stepId="reporting" />
|
||||
|
||||
<TabNavigation tabs={tabs} activeTab={activeTab} onTabChange={setActiveTab} />
|
||||
|
||||
{loading ? (
|
||||
<div className="flex items-center justify-center py-20">
|
||||
<div className="animate-spin rounded-full h-8 w-8 border-b-2 border-purple-600" />
|
||||
<span className="ml-3 text-gray-500">Bericht wird generiert...</span>
|
||||
</div>
|
||||
) : report ? (
|
||||
<>
|
||||
{/* Generated timestamp */}
|
||||
<div className="text-xs text-gray-400 text-right">
|
||||
Generiert: {new Date(report.generatedAt).toLocaleString('de-DE')}
|
||||
</div>
|
||||
|
||||
{activeTab === 'overview' && <OverviewTab report={report} />}
|
||||
{activeTab === 'risks' && <RisksTab report={report} />}
|
||||
{activeTab === 'deadlines' && <DeadlinesTab report={report} />}
|
||||
{activeTab === 'modules' && <ModulesTab report={report} />}
|
||||
{activeTab === 'activity' && <ActivityTab report={report} />}
|
||||
</>
|
||||
) : (
|
||||
<div className="text-center py-20 text-gray-500">
|
||||
<p>Bericht konnte nicht geladen werden.</p>
|
||||
{error && <p className="text-sm text-red-500 mt-2">{error}</p>}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -311,10 +311,8 @@ function SidebarContent({ onNavigate }: SidebarContentProps) {
|
||||
{ href: '/sdk/academy', label: 'Academy', icon: '🎓' },
|
||||
{ href: '/sdk/whistleblower', label: 'Whistleblower', icon: '📢' },
|
||||
{ href: '/sdk/incidents', label: 'Incidents', icon: '🚨' },
|
||||
{ href: '/sdk/dsb-portal', label: 'DSB Portal', icon: '👤' },
|
||||
{ href: '/sdk/reporting', label: 'Reporting', icon: '📈' },
|
||||
{ href: '/sdk/industry-templates', label: 'Branchenvorlagen', icon: '🏢' },
|
||||
{ href: '/sdk/multi-tenant', label: 'Multi-Tenant', icon: '👥' },
|
||||
{ href: '/sdk/sso', label: 'SSO', icon: '🔑' },
|
||||
{ href: '/sdk/document-crawler', label: 'Doc Crawler', icon: '📄' },
|
||||
{ href: '/sdk/advisory-board', label: 'Beirat', icon: '💬' },
|
||||
].map(mod => (
|
||||
|
||||
@@ -550,15 +550,15 @@ export function SDKSidebar({ collapsed = false, onCollapsedChange }: SDKSidebarP
|
||||
collapsed={collapsed}
|
||||
/>
|
||||
<AdditionalModuleItem
|
||||
href="/sdk/dsb-portal"
|
||||
href="/sdk/reporting"
|
||||
icon={
|
||||
<svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2}
|
||||
d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" />
|
||||
d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z" />
|
||||
</svg>
|
||||
}
|
||||
label="DSB Portal"
|
||||
isActive={pathname === '/sdk/dsb-portal'}
|
||||
label="Reporting"
|
||||
isActive={pathname === '/sdk/reporting'}
|
||||
collapsed={collapsed}
|
||||
/>
|
||||
<AdditionalModuleItem
|
||||
@@ -573,30 +573,6 @@ export function SDKSidebar({ collapsed = false, onCollapsedChange }: SDKSidebarP
|
||||
isActive={pathname === '/sdk/industry-templates'}
|
||||
collapsed={collapsed}
|
||||
/>
|
||||
<AdditionalModuleItem
|
||||
href="/sdk/multi-tenant"
|
||||
icon={
|
||||
<svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2}
|
||||
d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z" />
|
||||
</svg>
|
||||
}
|
||||
label="Multi-Tenant"
|
||||
isActive={pathname === '/sdk/multi-tenant'}
|
||||
collapsed={collapsed}
|
||||
/>
|
||||
<AdditionalModuleItem
|
||||
href="/sdk/sso"
|
||||
icon={
|
||||
<svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2}
|
||||
d="M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z" />
|
||||
</svg>
|
||||
}
|
||||
label="SSO"
|
||||
isActive={pathname === '/sdk/sso'}
|
||||
collapsed={collapsed}
|
||||
/>
|
||||
<AdditionalModuleItem
|
||||
href="/sdk/document-crawler"
|
||||
icon={
|
||||
|
||||
@@ -934,6 +934,23 @@ export const STEP_EXPLANATIONS = {
|
||||
},
|
||||
],
|
||||
},
|
||||
'reporting': {
|
||||
title: 'Management Reporting',
|
||||
description: 'Compliance-Berichte und KPIs fuer das Top Management',
|
||||
explanation: 'Das Executive Reporting Dashboard bietet einen umfassenden Ueberblick ueber den Compliance-Status Ihres Unternehmens. Es aggregiert Daten aus allen Modulen (DSGVO, Lieferanten, Vorfaelle, Schulungen) zu einem Gesamt-Compliance-Score mit Risikobewertung und Fristenuebersicht.',
|
||||
tips: [
|
||||
{
|
||||
icon: 'lightbulb' as const,
|
||||
title: 'Regelmaessig pruefen',
|
||||
description: 'Praesentieren Sie den Compliance-Bericht regelmaessig der Geschaeftsleitung (empfohlen: monatlich oder quartalsweise).',
|
||||
},
|
||||
{
|
||||
icon: 'warning' as const,
|
||||
title: 'Rechenschaftspflicht',
|
||||
description: 'Art. 5 Abs. 2 DSGVO verlangt den Nachweis der Compliance. Dieser Bericht dient als Dokumentation gegenueber Aufsichtsbehoerden.',
|
||||
},
|
||||
],
|
||||
},
|
||||
}
|
||||
|
||||
export default StepHeader
|
||||
|
||||
@@ -49,6 +49,35 @@ export const navigation: NavCategory[] = [
|
||||
purpose: 'Zentrale Verwaltung aller Dropdown- und Auswahltabellen im SDK. Systemkataloge (Risiken, Massnahmen, Vorlagen) anzeigen und benutzerdefinierte Eintraege ergaenzen, bearbeiten und loeschen.',
|
||||
audience: ['DSB', 'Compliance Officer', 'Administratoren'],
|
||||
},
|
||||
// --- Plattform-Verwaltung (interne Admin-Tools) ---
|
||||
{
|
||||
id: 'multi-tenant',
|
||||
name: 'Mandantenverwaltung',
|
||||
href: '/dashboard/multi-tenant',
|
||||
description: 'B2B-Kundenverwaltung & Mandanten',
|
||||
purpose: 'Verwaltung aller Compliance-Mandanten (B2B-Kunden). Mandanten anlegen, konfigurieren, Lizenzen zuweisen und Nutzungsstatistiken einsehen.',
|
||||
audience: ['Plattform-Admins', 'Entwickler'],
|
||||
subgroup: 'Plattform-Verwaltung',
|
||||
},
|
||||
{
|
||||
id: 'sso',
|
||||
name: 'SSO-Konfiguration',
|
||||
href: '/dashboard/sso',
|
||||
description: 'Single Sign-On & Authentifizierung',
|
||||
purpose: 'Konfiguration der Authentifizierung fuer Mandanten. SAML/OIDC-Provider anbinden, SSO-Policies verwalten und Login-Flows testen.',
|
||||
audience: ['Plattform-Admins', 'Entwickler'],
|
||||
subgroup: 'Plattform-Verwaltung',
|
||||
},
|
||||
{
|
||||
id: 'dsb-portal',
|
||||
name: 'DSB Portal',
|
||||
href: '/dashboard/dsb-portal',
|
||||
description: 'Datenschutzbeauftragter-Arbeitsbereich',
|
||||
purpose: 'Zentraler Arbeitsbereich fuer den externen Datenschutzbeauftragten (DSB). Aufgabenverwaltung, Beratungsprotokolle, Taetigkeitsbericht und mandantenuebergreifende Uebersicht gemaess Art. 37-39 DSGVO.',
|
||||
audience: ['DSB', 'Plattform-Admins'],
|
||||
gdprArticles: ['Art. 37', 'Art. 38', 'Art. 39'],
|
||||
subgroup: 'Plattform-Verwaltung',
|
||||
},
|
||||
],
|
||||
},
|
||||
// =========================================================================
|
||||
|
||||
65
admin-compliance/lib/sdk/reporting/api.ts
Normal file
65
admin-compliance/lib/sdk/reporting/api.ts
Normal file
@@ -0,0 +1,65 @@
|
||||
/**
|
||||
* Reporting API Client
|
||||
*
|
||||
* Client functions for the Executive Reporting module.
|
||||
* Communicates with the Go backend via Next.js API proxy at /api/sdk/v1/reporting/*
|
||||
*/
|
||||
|
||||
import type {
|
||||
ExecutiveReport,
|
||||
ComplianceScoreResponse,
|
||||
Deadline,
|
||||
RiskOverview,
|
||||
} from './types'
|
||||
|
||||
const BASE_URL = '/api/sdk/v1/reporting'
|
||||
|
||||
async function apiFetch<T>(path: string): Promise<T> {
|
||||
const res = await fetch(`${BASE_URL}${path}`, {
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'X-Tenant-ID': typeof window !== 'undefined'
|
||||
? (localStorage.getItem('bp-tenant-id') || 'default')
|
||||
: 'default',
|
||||
},
|
||||
})
|
||||
|
||||
if (!res.ok) {
|
||||
const error = await res.json().catch(() => ({ error: res.statusText }))
|
||||
throw new Error(error.error || `API Error: ${res.status}`)
|
||||
}
|
||||
|
||||
return res.json()
|
||||
}
|
||||
|
||||
/**
|
||||
* Vollstaendigen Executive Report abrufen
|
||||
* GET /sdk/v1/reporting/executive
|
||||
*/
|
||||
export async function getExecutiveReport(): Promise<ExecutiveReport> {
|
||||
return apiFetch<ExecutiveReport>('/executive')
|
||||
}
|
||||
|
||||
/**
|
||||
* Nur den Compliance-Score abrufen (leichtgewichtig)
|
||||
* GET /sdk/v1/reporting/score
|
||||
*/
|
||||
export async function getComplianceScore(): Promise<ComplianceScoreResponse> {
|
||||
return apiFetch<ComplianceScoreResponse>('/score')
|
||||
}
|
||||
|
||||
/**
|
||||
* Bevorstehende Fristen abrufen
|
||||
* GET /sdk/v1/reporting/deadlines
|
||||
*/
|
||||
export async function getUpcomingDeadlines(): Promise<{ deadlines: Deadline[]; total: number }> {
|
||||
return apiFetch<{ deadlines: Deadline[]; total: number }>('/deadlines')
|
||||
}
|
||||
|
||||
/**
|
||||
* Risikouebersicht abrufen
|
||||
* GET /sdk/v1/reporting/risks
|
||||
*/
|
||||
export async function getRiskOverview(): Promise<RiskOverview> {
|
||||
return apiFetch<RiskOverview>('/risks')
|
||||
}
|
||||
2
admin-compliance/lib/sdk/reporting/index.ts
Normal file
2
admin-compliance/lib/sdk/reporting/index.ts
Normal file
@@ -0,0 +1,2 @@
|
||||
export * from './types'
|
||||
export * from './api'
|
||||
168
admin-compliance/lib/sdk/reporting/types.ts
Normal file
168
admin-compliance/lib/sdk/reporting/types.ts
Normal file
@@ -0,0 +1,168 @@
|
||||
/**
|
||||
* Reporting Module Types
|
||||
*
|
||||
* TypeScript definitions for the Executive Reporting module.
|
||||
* Provides compliance KPIs, risk overview, deadlines, and activity tracking
|
||||
* for top management and compliance officers.
|
||||
*/
|
||||
|
||||
// =============================================================================
|
||||
// RISK LEVELS
|
||||
// =============================================================================
|
||||
|
||||
export type RiskLevel = 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL'
|
||||
export type DeadlineSeverity = 'INFO' | 'WARNING' | 'URGENT' | 'OVERDUE'
|
||||
|
||||
export const RISK_LEVEL_INFO: Record<RiskLevel, { label: string; color: string; bgColor: string; borderColor: string }> = {
|
||||
LOW: { label: 'Niedrig', color: 'text-green-700', bgColor: 'bg-green-100', borderColor: 'border-green-200' },
|
||||
MEDIUM: { label: 'Mittel', color: 'text-yellow-700', bgColor: 'bg-yellow-100', borderColor: 'border-yellow-200' },
|
||||
HIGH: { label: 'Hoch', color: 'text-orange-700', bgColor: 'bg-orange-100', borderColor: 'border-orange-200' },
|
||||
CRITICAL: { label: 'Kritisch', color: 'text-red-700', bgColor: 'bg-red-100', borderColor: 'border-red-200' },
|
||||
}
|
||||
|
||||
export const DEADLINE_SEVERITY_INFO: Record<DeadlineSeverity, { label: string; color: string; bgColor: string }> = {
|
||||
INFO: { label: 'Info', color: 'text-blue-700', bgColor: 'bg-blue-100' },
|
||||
WARNING: { label: 'Warnung', color: 'text-yellow-700', bgColor: 'bg-yellow-100' },
|
||||
URGENT: { label: 'Dringend', color: 'text-orange-700', bgColor: 'bg-orange-100' },
|
||||
OVERDUE: { label: 'Ueberfaellig', color: 'text-red-700', bgColor: 'bg-red-100' },
|
||||
}
|
||||
|
||||
// =============================================================================
|
||||
// MODULE SUMMARIES
|
||||
// =============================================================================
|
||||
|
||||
export interface DSGVOSummary {
|
||||
processingActivities: number
|
||||
activeProcessings: number
|
||||
tomsImplemented: number
|
||||
tomsPlanned: number
|
||||
tomsTotal: number
|
||||
completionPercent: number
|
||||
openDSRs: number
|
||||
overdueDSRs: number
|
||||
dsfasCompleted: number
|
||||
retentionPolicies: number
|
||||
}
|
||||
|
||||
export interface VendorSummary {
|
||||
totalVendors: number
|
||||
activeVendors: number
|
||||
byRiskLevel: Record<string, number>
|
||||
pendingReviews: number
|
||||
expiredContracts: number
|
||||
}
|
||||
|
||||
export interface IncidentSummary {
|
||||
totalIncidents: number
|
||||
openIncidents: number
|
||||
criticalIncidents: number
|
||||
notificationsPending: number
|
||||
avgResolutionHours: number
|
||||
}
|
||||
|
||||
export interface WhistleblowerSummary {
|
||||
totalReports: number
|
||||
openReports: number
|
||||
overdueAcknowledgments: number
|
||||
overdueFeedbacks: number
|
||||
avgResolutionDays: number
|
||||
}
|
||||
|
||||
export interface AcademySummary {
|
||||
totalCourses: number
|
||||
totalEnrollments: number
|
||||
completionRate: number
|
||||
overdueCount: number
|
||||
avgCompletionDays: number
|
||||
}
|
||||
|
||||
// =============================================================================
|
||||
// RISK & DEADLINES
|
||||
// =============================================================================
|
||||
|
||||
export interface ModuleRisk {
|
||||
module: string
|
||||
level: RiskLevel
|
||||
score: number
|
||||
issues: number
|
||||
}
|
||||
|
||||
export interface RiskOverview {
|
||||
overallLevel: RiskLevel
|
||||
moduleRisks: ModuleRisk[]
|
||||
openFindings: number
|
||||
criticalFindings: number
|
||||
}
|
||||
|
||||
export interface Deadline {
|
||||
module: string
|
||||
type: string
|
||||
description: string
|
||||
dueDate: string
|
||||
daysLeft: number
|
||||
severity: DeadlineSeverity
|
||||
}
|
||||
|
||||
export interface ActivityEntry {
|
||||
timestamp: string
|
||||
module: string
|
||||
action: string
|
||||
description: string
|
||||
userId?: string
|
||||
}
|
||||
|
||||
// =============================================================================
|
||||
// EXECUTIVE REPORT (Main Response)
|
||||
// =============================================================================
|
||||
|
||||
export interface ExecutiveReport {
|
||||
generatedAt: string
|
||||
tenantId: string
|
||||
complianceScore: number
|
||||
|
||||
dsgvo: DSGVOSummary
|
||||
vendors: VendorSummary
|
||||
incidents: IncidentSummary
|
||||
whistleblower: WhistleblowerSummary
|
||||
academy: AcademySummary
|
||||
|
||||
riskOverview: RiskOverview
|
||||
upcomingDeadlines: Deadline[]
|
||||
recentActivity: ActivityEntry[]
|
||||
}
|
||||
|
||||
// =============================================================================
|
||||
// COMPACT SCORE RESPONSE
|
||||
// =============================================================================
|
||||
|
||||
export interface ComplianceScoreResponse {
|
||||
complianceScore: number
|
||||
riskLevel: RiskLevel
|
||||
generatedAt: string
|
||||
}
|
||||
|
||||
// =============================================================================
|
||||
// HELPER FUNCTIONS
|
||||
// =============================================================================
|
||||
|
||||
export function getRiskLevelInfo(level: RiskLevel) {
|
||||
return RISK_LEVEL_INFO[level]
|
||||
}
|
||||
|
||||
export function getDeadlineSeverityInfo(severity: DeadlineSeverity) {
|
||||
return DEADLINE_SEVERITY_INFO[severity]
|
||||
}
|
||||
|
||||
export function getScoreColor(score: number): string {
|
||||
if (score >= 80) return 'text-green-600'
|
||||
if (score >= 60) return 'text-yellow-600'
|
||||
if (score >= 40) return 'text-orange-600'
|
||||
return 'text-red-600'
|
||||
}
|
||||
|
||||
export function getScoreBgColor(score: number): string {
|
||||
if (score >= 80) return 'bg-green-500'
|
||||
if (score >= 60) return 'bg-yellow-500'
|
||||
if (score >= 40) return 'bg-orange-500'
|
||||
return 'bg-red-500'
|
||||
}
|
||||
@@ -4,8 +4,6 @@ Willkommen zur Dokumentation des **BreakPilot Compliance**-Stacks (Team B: DSGVO
|
||||
|
||||
## Drei-Projekt-Architektur
|
||||
|
||||
BreakPilot besteht aus drei unabhaengigen Projekten:
|
||||
|
||||
| Projekt | Beschreibung | Docs |
|
||||
|---------|-------------|------|
|
||||
| **breakpilot-core** | Shared Infrastructure (DB, Cache, Vault, Nginx) | Port 8009 |
|
||||
@@ -30,24 +28,38 @@ Compliance haengt von Core ab (PostgreSQL, Valkey, Vault, Qdrant, MinIO, Embeddi
|
||||
|
||||
---
|
||||
|
||||
## SDK-Module
|
||||
## SDK-Module (Kundenbereich)
|
||||
|
||||
Das AI Compliance SDK implementiert folgende DSGVO-Module:
|
||||
Module die Compliance-Kunden im SDK sehen und nutzen:
|
||||
|
||||
| Modul | Beschreibung |
|
||||
|-------|--------------|
|
||||
| **TOM** | Technisch-Organisatorische Massnahmen |
|
||||
| **DSFA** | Datenschutz-Folgenabschaetzung |
|
||||
| **VVT** | Verzeichnis von Verarbeitungstaetigkeiten |
|
||||
| **Loeschfristen** | Loeschfristen-Verwaltung |
|
||||
| **AI Act Compliance** | KI-Verordnung Konformitaet |
|
||||
| **Consent Management** | Einwilligungs-Verwaltung |
|
||||
| **DSR** | Betroffenenrechte (Art. 15-21 DSGVO) |
|
||||
| **Academy** | Datenschutz-Schulungen |
|
||||
| **Whistleblower** | Hinweisgebersystem (HinSchG) |
|
||||
| **Incidents** | Datenschutz-Vorfaelle |
|
||||
| **Vendors** | Auftragsverarbeiter-Management |
|
||||
| **Reporting** | Compliance-Berichte |
|
||||
| Modul | Beschreibung | Frontend |
|
||||
|-------|--------------|----------|
|
||||
| **TOM** | Technisch-Organisatorische Massnahmen | /sdk/tom |
|
||||
| **DSFA** | Datenschutz-Folgenabschaetzung | /sdk/dsfa |
|
||||
| **VVT** | Verzeichnis von Verarbeitungstaetigkeiten | /sdk/vvt |
|
||||
| **Loeschfristen** | Loeschfristen-Verwaltung | /sdk/loeschfristen |
|
||||
| **AI Act Compliance** | KI-Verordnung Konformitaet | /sdk/ai-act |
|
||||
| **Consent Management** | Einwilligungs-Verwaltung | /sdk/einwilligungen |
|
||||
| **DSR** | Betroffenenrechte (Art. 15-21 DSGVO) | /sdk/dsr |
|
||||
| **Academy** | Datenschutz-Schulungen mit PDF-Zertifikaten | /sdk/academy |
|
||||
| **Whistleblower** | Hinweisgebersystem (HinSchG) | /sdk/whistleblower |
|
||||
| **Incidents** | Datenschutz-Vorfaelle (Art. 33/34 DSGVO) | /sdk/incidents |
|
||||
| **Vendors** | Auftragsverarbeiter-Management | /sdk/vendor-compliance |
|
||||
| **Reporting** | Compliance-Berichte fuer Top Management | /sdk/reporting |
|
||||
| **Industry Templates** | Branchenvorlagen (E-Commerce, Gesundheit, etc.) | /sdk/industry-templates |
|
||||
| **Document Crawler** | Automatisches Crawling von Rechtstexten | /sdk/document-crawler |
|
||||
| **Advisory Board** | KI-Compliance-Beirat | /sdk/advisory-board |
|
||||
|
||||
## Admin-Module (Plattform-Verwaltung)
|
||||
|
||||
Interne Tools fuer die BreakPilot-Plattformverwaltung:
|
||||
|
||||
| Modul | Beschreibung | Frontend |
|
||||
|-------|--------------|----------|
|
||||
| **Katalogverwaltung** | SDK-Kataloge & Auswahltabellen | /dashboard/catalog-manager |
|
||||
| **Mandantenverwaltung** | B2B-Kundenverwaltung & Mandanten | /dashboard/multi-tenant |
|
||||
| **SSO-Konfiguration** | Single Sign-On & Authentifizierung | /dashboard/sso |
|
||||
| **DSB Portal** | Datenschutzbeauftragter-Arbeitsbereich | /dashboard/dsb-portal |
|
||||
|
||||
---
|
||||
|
||||
@@ -72,6 +84,21 @@ Das AI Compliance SDK implementiert folgende DSGVO-Module:
|
||||
| https://macmini:3007/sdk/academy | Academy |
|
||||
| https://macmini:3007/sdk/whistleblower | Whistleblower |
|
||||
| https://macmini:3007/sdk/incidents | Incidents |
|
||||
| https://macmini:3007/sdk/reporting | Reporting |
|
||||
| https://macmini:3007/sdk/vendor-compliance | Vendor Compliance |
|
||||
| https://macmini:3007/sdk/industry-templates | Branchenvorlagen |
|
||||
| https://macmini:3007/sdk/document-crawler | Document Crawler |
|
||||
| https://macmini:3007/sdk/advisory-board | Advisory Board |
|
||||
|
||||
### Admin-Module (Dashboard)
|
||||
|
||||
| URL | Modul |
|
||||
|-----|-------|
|
||||
| https://macmini:3007/dashboard | Dashboard |
|
||||
| https://macmini:3007/dashboard/catalog-manager | Katalogverwaltung |
|
||||
| https://macmini:3007/dashboard/multi-tenant | Mandantenverwaltung |
|
||||
| https://macmini:3007/dashboard/sso | SSO-Konfiguration |
|
||||
| https://macmini:3007/dashboard/dsb-portal | DSB Portal |
|
||||
|
||||
---
|
||||
|
||||
@@ -104,6 +131,12 @@ Compliance-Services nutzen folgende Core-Infrastruktur:
|
||||
- [Academy](services/sdk-modules/academy.md)
|
||||
- [Whistleblower](services/sdk-modules/whistleblower.md)
|
||||
- [Incidents](services/sdk-modules/incidents.md)
|
||||
- [Reporting](services/sdk-modules/reporting.md)
|
||||
- [Vendors](services/sdk-modules/vendors.md)
|
||||
- [Industry Templates](services/sdk-modules/industry-templates.md)
|
||||
- [Document Crawler](services/sdk-modules/document-crawler.md)
|
||||
- [Advisory Board](services/sdk-modules/advisory-board.md)
|
||||
- [DSB Portal](services/sdk-modules/dsb-portal.md)
|
||||
|
||||
## Entwicklung
|
||||
|
||||
|
||||
@@ -5,9 +5,23 @@ Das Academy-Modul ermoeglicht die Verwaltung von Datenschutz-Schulungen und -Zer
|
||||
## Features
|
||||
|
||||
- **Kursverwaltung** — DSGVO-, KI- und branchenspezifische Schulungskurse erstellen und verwalten
|
||||
- **Modulare Struktur** — Kurse bestehen aus Modulen mit Lektionen und Quizzes
|
||||
- **Teilnehmer-Tracking** — Fortschritt, Abschlussquoten und Zertifikatsverwaltung
|
||||
- **Compliance-Nachweis** — Automatische Generierung von Schulungsnachweisen fuer Audits
|
||||
- **KI-Kursgenerierung** — Automatische Generierung von Schulungsinhalten ueber Claude API mit RAG-Kontext
|
||||
- **Modulare Struktur** — Kurse bestehen aus Lektionen (Text, Video, Quiz) in konfigurierbarer Reihenfolge
|
||||
- **Quiz-Auswertung** — Serverseitige Auswertung von Multiple-Choice-Quizfragen mit Bestehensgrenze
|
||||
- **Teilnehmer-Tracking** — Fortschritt, Abschlussquoten und Fristenueberwachung
|
||||
- **PDF-Zertifikate** — Automatische Generierung von Schulungszertifikaten als PDF (Name, Kurs, Datum, Score, Gueltigkeit)
|
||||
- **Video-Generierung** — Optional: KI-generierte Schulungsvideos mit ElevenLabs (TTS) und HeyGen (Avatar)
|
||||
- **Compliance-Nachweis** — Zertifikate als Audit-Nachweis gemaess Art. 5 Abs. 2 DSGVO
|
||||
|
||||
## Rechtsgrundlage
|
||||
|
||||
| Vorschrift | Anforderung |
|
||||
|-----------|-------------|
|
||||
| DSGVO Art. 39 Abs. 1 lit. b | DSB muss Schulung und Sensibilisierung ueberwachen |
|
||||
| DSGVO Art. 5 Abs. 2 | Rechenschaftspflicht — Schulungen dokumentieren und nachweisen |
|
||||
| EU AI Act Art. 4 | AI-Literacy-Schulung fuer KI-Nutzer ab 2026 |
|
||||
| HinSchG | Schulung zu Meldewegen und Hinweisgeberschutz |
|
||||
| NIS2 | Cybersecurity-Schulungen fuer kritische Infrastruktur |
|
||||
|
||||
## API Endpoints
|
||||
|
||||
@@ -17,14 +31,18 @@ Alle unter `/api/v1/academy/`, benoetigen `X-Tenant-ID` Header.
|
||||
|--------|----------|-------------|
|
||||
| GET | `/courses` | Kurse auflisten |
|
||||
| POST | `/courses` | Neuen Kurs erstellen |
|
||||
| GET | `/courses/{id}` | Kursdetails |
|
||||
| GET | `/courses/{id}` | Kursdetails mit Lektionen |
|
||||
| PUT | `/courses/{id}` | Kurs aktualisieren |
|
||||
| DELETE | `/courses/{id}` | Kurs loeschen |
|
||||
| GET | `/courses/{id}/modules` | Module eines Kurses |
|
||||
| POST | `/courses/{id}/enroll` | Teilnehmer einschreiben |
|
||||
| GET | `/statistics` | Dashboard-Statistiken |
|
||||
| GET | `/enrollments` | Einschreibungen auflisten |
|
||||
| POST | `/enrollments/{id}/complete` | Modul als abgeschlossen markieren |
|
||||
| GET | `/certificates` | Zertifikate auflisten |
|
||||
| POST | `/enrollments` | Mitarbeiter einschreiben |
|
||||
| PUT | `/enrollments/{id}/progress` | Fortschritt aktualisieren |
|
||||
| POST | `/enrollments/{id}/complete` | Kurs abschliessen |
|
||||
| POST | `/lessons/{id}/quiz` | Quiz-Antworten einreichen |
|
||||
| POST | `/enrollments/{id}/certificate` | PDF-Zertifikat generieren |
|
||||
| GET | `/certificates/{id}` | Zertifikat-Details |
|
||||
| GET | `/certificates/{id}/pdf` | PDF herunterladen |
|
||||
|
||||
## Frontend
|
||||
|
||||
@@ -32,4 +50,4 @@ Seite unter `/sdk/academy` mit Kursuebersicht, Modulverwaltung und Teilnehmer-Tr
|
||||
|
||||
## Datenbank
|
||||
|
||||
Migration `008_academy_schema.sql` erstellt Tabellen fuer Kurse, Module, Einschreibungen und Zertifikate.
|
||||
Migration `008_academy_schema.sql` erstellt Tabellen fuer Kurse, Lektionen, Quizfragen, Einschreibungen, Lektionsfortschritt und Zertifikate.
|
||||
|
||||
18
docs-src/services/sdk-modules/advisory-board.md
Normal file
18
docs-src/services/sdk-modules/advisory-board.md
Normal file
@@ -0,0 +1,18 @@
|
||||
# Compliance-Beirat — Advisory Board
|
||||
|
||||
Virtueller Compliance-Beirat mit KI-Experten fuer Einschaetzungen zu komplexen Fragestellungen.
|
||||
|
||||
## Features
|
||||
|
||||
- **Expertengremium** — Simulierte Experten aus Datenschutzrecht, IT-Sicherheit, KI-Ethik und Branchenregulierung
|
||||
- **Konsultationen** — Strukturierte Fragestellungen mit mehrseitiger Analyse
|
||||
- **Dokumentation** — Beratungsergebnisse als Nachweis fuer Audits speicherbar
|
||||
- **Kontextbezogen** — Beirat beruecksichtigt Unternehmensprofil, Branche und bestehende Compliance-Daten
|
||||
|
||||
## Frontend
|
||||
|
||||
Seite unter `/sdk/advisory-board` mit Chat-Interface und Experten-Auswahl. Dokumentation unter `/sdk/advisory-board/documentation`.
|
||||
|
||||
## Hinweis
|
||||
|
||||
Der KI-Beirat ersetzt keine professionelle Rechtsberatung. Bei kritischen Entscheidungen sollte stets ein Fachanwalt hinzugezogen werden.
|
||||
32
docs-src/services/sdk-modules/document-crawler.md
Normal file
32
docs-src/services/sdk-modules/document-crawler.md
Normal file
@@ -0,0 +1,32 @@
|
||||
# Document Crawler — Dokumentenanalyse
|
||||
|
||||
Automatische Erfassung und Analyse von Compliance-Dokumenten auf Webseiten und in Dateisystemen.
|
||||
|
||||
## Features
|
||||
|
||||
- **Web-Crawling** — Automatisches Scannen von Webseiten nach Datenschutzerklaerungen, Impressum und Cookie-Bannern
|
||||
- **Dokumentenanalyse** — KI-gestuetzte Pruefung auf Vollstaendigkeit und Aktualitaet
|
||||
- **DSGVO-Check** — Automatische Pruefung gegen Pflichtangaben (Art. 13/14 DSGVO)
|
||||
- **Monitoring** — Regelmaessige Ueberpruefung mit Benachrichtigung bei Aenderungen
|
||||
- **Quellen-Verwaltung** — Konfigurierbare Crawl-Ziele und Zeitplaene
|
||||
|
||||
## API Endpoints
|
||||
|
||||
Alle unter `/api/v1/crawler/`, benoetigen `X-Tenant-ID` Header.
|
||||
|
||||
| Method | Endpoint | Beschreibung |
|
||||
|--------|----------|-------------|
|
||||
| GET | `/jobs` | Crawl-Jobs auflisten |
|
||||
| POST | `/jobs` | Neuen Crawl-Job starten |
|
||||
| GET | `/jobs/{id}` | Job-Status |
|
||||
| GET | `/results` | Crawl-Ergebnisse |
|
||||
| GET | `/results/{id}` | Einzelnes Ergebnis |
|
||||
| POST | `/results/{id}/analyze` | KI-Analyse starten |
|
||||
|
||||
## Frontend
|
||||
|
||||
Seite unter `/sdk/document-crawler` mit Job-Verwaltung, Ergebnis-Uebersicht und Analyse-Detail.
|
||||
|
||||
## Datenbank
|
||||
|
||||
Migration in der AI Compliance SDK erstellt Tabellen fuer Crawl-Jobs, Ergebnisse und Analysen.
|
||||
34
docs-src/services/sdk-modules/dsb-portal.md
Normal file
34
docs-src/services/sdk-modules/dsb-portal.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# DSB Portal — Datenschutzbeauftragter
|
||||
|
||||
Zentraler Arbeitsbereich fuer den Datenschutzbeauftragten (DSB) gemaess Art. 37-39 DSGVO.
|
||||
|
||||
## Features
|
||||
|
||||
- **Aufgabenuebersicht** — Offene Aufgaben, faellige Pruefungen und Beratungsanfragen
|
||||
- **Beratungsprotokolle** — Dokumentation aller Beratungstaetigkeiten fuer die Rechenschaftspflicht
|
||||
- **Taetigkeitsberichte** — Automatische Generierung strukturierter Berichte
|
||||
- **Schulungsuebersicht** — Status der Mitarbeiterschulungen (verknuepft mit Academy)
|
||||
- **Compliance-Dashboard** — Aktuelle Risiken, offene Vorfaelle und DSR-Anfragen
|
||||
|
||||
## API Endpoints
|
||||
|
||||
Alle unter `/api/v1/dsb/`, benoetigen `X-Tenant-ID` Header.
|
||||
|
||||
| Method | Endpoint | Beschreibung |
|
||||
|--------|----------|-------------|
|
||||
| GET | `/tasks` | Offene Aufgaben auflisten |
|
||||
| POST | `/tasks` | Neue Aufgabe erstellen |
|
||||
| PUT | `/tasks/{id}` | Aufgabe aktualisieren |
|
||||
| GET | `/consultations` | Beratungsprotokolle auflisten |
|
||||
| POST | `/consultations` | Neues Beratungsprotokoll |
|
||||
| GET | `/reports` | Taetigkeitsberichte auflisten |
|
||||
| POST | `/reports/generate` | Taetigkeitsbericht generieren |
|
||||
| GET | `/dashboard` | Dashboard-Metriken |
|
||||
|
||||
## Frontend
|
||||
|
||||
Seite unter `/sdk/dsb-portal` mit Aufgaben-Board, Beratungsprotokoll-Editor und Dashboard-Widgets.
|
||||
|
||||
## Datenbank
|
||||
|
||||
Migration in der AI Compliance SDK erstellt Tabellen fuer DSB-Aufgaben, Beratungsprotokolle und Berichte.
|
||||
29
docs-src/services/sdk-modules/industry-templates.md
Normal file
29
docs-src/services/sdk-modules/industry-templates.md
Normal file
@@ -0,0 +1,29 @@
|
||||
# Branchenvorlagen — Industry Templates
|
||||
|
||||
Vorkonfigurierte Compliance-Pakete fuer verschiedene Branchen.
|
||||
|
||||
## Features
|
||||
|
||||
- **Branchenauswahl** — Vordefinierte Templates fuer Gesundheitswesen, Finanzwesen, E-Commerce, SaaS, Bildung u.a.
|
||||
- **Automatische Konfiguration** — Templates befuellen VVT, TOMs, Risiko-Matrix und Loeschfristen branchenspezifisch
|
||||
- **Regulierungserkennung** — Automatische Identifikation relevanter Regulierungen je Branche
|
||||
- **Anpassbar** — Templates als Ausgangsbasis, individuell erweiterbar
|
||||
|
||||
## API Endpoints
|
||||
|
||||
Alle unter `/api/v1/industry/`, benoetigen `X-Tenant-ID` Header.
|
||||
|
||||
| Method | Endpoint | Beschreibung |
|
||||
|--------|----------|-------------|
|
||||
| GET | `/templates` | Verfuegbare Branchenvorlagen auflisten |
|
||||
| GET | `/templates/{id}` | Vorlagendetails |
|
||||
| POST | `/templates/{id}/apply` | Vorlage auf Tenant anwenden |
|
||||
| GET | `/regulations` | Branchenspezifische Regulierungen |
|
||||
|
||||
## Frontend
|
||||
|
||||
Seite unter `/sdk/industry-templates` mit Branchenauswahl-Karten und Vorschau der enthaltenen Konfiguration.
|
||||
|
||||
## Datenbank
|
||||
|
||||
Templates werden als JSON-Konfigurationsdateien im Backend verwaltet, nicht in der Datenbank.
|
||||
52
docs-src/services/sdk-modules/reporting.md
Normal file
52
docs-src/services/sdk-modules/reporting.md
Normal file
@@ -0,0 +1,52 @@
|
||||
# Reporting — Management-Berichte
|
||||
|
||||
Das Reporting-Modul liefert aggregierte Compliance-KPIs und Berichte fuer das Top Management.
|
||||
|
||||
## Features
|
||||
|
||||
- **Executive Dashboard** — Compliance-Score, Risikobewertung und Fristenuebersicht auf einen Blick
|
||||
- **Modul-Aggregation** — Daten aus DSGVO, Lieferanten, Vorfaelle, Hinweisgebersystem und Schulungen
|
||||
- **Risikobewertung** — Gesamt-Risikolevel und Aufschluesselung nach Modulen
|
||||
- **Fristenverwaltung** — Moduluebergreifende Fristen mit Severity (Info, Warnung, Dringend, Ueberfaellig)
|
||||
- **Aktivitaetsprotokoll** — Letzte Compliance-Aktivitaeten ueber alle Module
|
||||
|
||||
## Rechtsgrundlage
|
||||
|
||||
- **Art. 5 Abs. 2 DSGVO** — Rechenschaftspflicht: Compliance muss dokumentiert und nachgewiesen werden
|
||||
- **Art. 24 DSGVO** — Verantwortung des Verantwortlichen: geeignete Massnahmen nachweisen
|
||||
- **Art. 39 DSGVO** — Taetigkeitsbericht des DSB basiert auf diesen Daten
|
||||
|
||||
## API Endpoints
|
||||
|
||||
Alle unter `/api/v1/reporting/`, benoetigen `X-Tenant-ID` Header.
|
||||
|
||||
| Method | Endpoint | Beschreibung |
|
||||
|--------|----------|-------------|
|
||||
| GET | `/executive` | Vollstaendiger Executive Report |
|
||||
| GET | `/score` | Nur Compliance-Score (leichtgewichtig) |
|
||||
| GET | `/deadlines` | Bevorstehende Fristen |
|
||||
| GET | `/risks` | Risikouebersicht |
|
||||
|
||||
## Frontend
|
||||
|
||||
Seite unter `/sdk/reporting` mit:
|
||||
|
||||
- Compliance-Score-Kreis (0-100%)
|
||||
- KPI-Karten (Verarbeitungen, TOMs, DSRs, Vorfaelle, Schulungsrate, Lieferanten)
|
||||
- Risikotabelle nach Modulen
|
||||
- Fristenliste mit Severity-Badges
|
||||
- Modul-Detail-Ansichten (DSGVO, Vendors, Incidents, Whistleblower, Academy)
|
||||
- Aktivitaetsprotokoll
|
||||
|
||||
## Datenmodell
|
||||
|
||||
Der Executive Report aggregiert Daten aus allen Modulen:
|
||||
|
||||
- `DSGVOSummary` — Verarbeitungen, TOMs, DSRs, DSFAs, Loeschfristen
|
||||
- `VendorSummary` — Lieferanten nach Risiko, ausstehende Pruefungen
|
||||
- `IncidentSummary` — Offene/kritische Vorfaelle, Benachrichtigungen
|
||||
- `WhistleblowerSummary` — Meldungen, ueberfaellige Fristen
|
||||
- `AcademySummary` — Kurse, Einschreibungen, Abschlussrate
|
||||
- `RiskOverview` — Gesamt-Risikolevel, Findings nach Modul
|
||||
- `Deadline[]` — Moduluebergreifende Fristen
|
||||
- `ActivityEntry[]` — Letzte Aktivitaeten
|
||||
34
docs-src/services/sdk-modules/vendors.md
Normal file
34
docs-src/services/sdk-modules/vendors.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Vendors — Auftragsverarbeiter-Management
|
||||
|
||||
Verwaltung von Auftragsverarbeitern und Unterauftragsverarbeitern gemaess Art. 28 DSGVO.
|
||||
|
||||
## Features
|
||||
|
||||
- **Vendor-Verzeichnis** — Zentrale Uebersicht aller Auftragsverarbeiter
|
||||
- **Risikobewertung** — Automatische Risikoeinstufung basierend auf Datenkategorien und Drittlandtransfers
|
||||
- **Vertragsmanagement** — AVV-Pruefung mit KI-gestuetzter Klauselanalyse
|
||||
- **TOM-Abgleich** — Vergleich der Lieferanten-TOMs mit eigenen Anforderungen
|
||||
- **Audit-Trail** — Dokumentation aller Pruefungen und Aenderungen
|
||||
|
||||
## API Endpoints
|
||||
|
||||
Alle unter `/api/v1/vendors/`, benoetigen `X-Tenant-ID` Header.
|
||||
|
||||
| Method | Endpoint | Beschreibung |
|
||||
|--------|----------|-------------|
|
||||
| GET | `/vendors` | Vendors auflisten |
|
||||
| POST | `/vendors` | Neuen Vendor anlegen |
|
||||
| GET | `/vendors/{id}` | Vendor-Details |
|
||||
| PUT | `/vendors/{id}` | Vendor aktualisieren |
|
||||
| DELETE | `/vendors/{id}` | Vendor loeschen |
|
||||
| POST | `/vendors/{id}/assess` | Risikobewertung durchfuehren |
|
||||
| GET | `/vendors/{id}/contracts` | Vertraege auflisten |
|
||||
| POST | `/vendors/{id}/contracts` | AVV hochladen |
|
||||
|
||||
## Frontend
|
||||
|
||||
Seite unter `/sdk/vendor-compliance` mit Vendor-Tabelle, Risiko-Matrix und Vertragsmanagement.
|
||||
|
||||
## Datenbank
|
||||
|
||||
Migration in der AI Compliance SDK erstellt Tabellen fuer Vendors, Risikobewertungen, Vertraege und AVV-Klauseln.
|
||||
@@ -68,6 +68,12 @@ nav:
|
||||
- Academy: services/sdk-modules/academy.md
|
||||
- Whistleblower: services/sdk-modules/whistleblower.md
|
||||
- Incidents: services/sdk-modules/incidents.md
|
||||
- Reporting: services/sdk-modules/reporting.md
|
||||
- Vendors: services/sdk-modules/vendors.md
|
||||
- Industry Templates: services/sdk-modules/industry-templates.md
|
||||
- Document Crawler: services/sdk-modules/document-crawler.md
|
||||
- Advisory Board: services/sdk-modules/advisory-board.md
|
||||
- DSB Portal: services/sdk-modules/dsb-portal.md
|
||||
- Entwicklung:
|
||||
- Testing: development/testing.md
|
||||
- Dokumentation: development/documentation.md
|
||||
|
||||
Reference in New Issue
Block a user