'use client' /** * Audit Report Management Page (SDK Version) * * Create and manage GDPR audit sessions with PDF report generation. */ import { useState, useEffect } from 'react' import { useRouter } from 'next/navigation' import { useSDK } from '@/lib/sdk' import { StepHeader, STEP_EXPLANATIONS } from '@/components/sdk/StepHeader' interface AuditSession { id: string name: string description?: string auditor_name: string auditor_email?: string auditor_organization?: string status: 'draft' | 'in_progress' | 'completed' | 'archived' regulation_ids?: string[] total_items: number completed_items: number compliant_count: number non_compliant_count: number completion_percentage: number created_at: string started_at?: string completed_at?: string } const REGULATIONS = [ { code: 'GDPR', name: 'DSGVO / GDPR', description: 'EU-Datenschutzgrundverordnung' }, { code: 'BDSG', name: 'BDSG', description: 'Bundesdatenschutzgesetz' }, { code: 'TTDSG', name: 'TTDSG', description: 'Telekommunikation-Telemedien-Datenschutz' }, ] export default function AuditReportPage() { const { state } = useSDK() const router = useRouter() const [sessions, setSessions] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [activeTab, setActiveTab] = useState<'sessions' | 'new' | 'export'>('sessions') const [newSession, setNewSession] = useState({ name: '', description: '', auditor_name: '', auditor_email: '', auditor_organization: '', regulation_codes: [] as string[], }) const [creating, setCreating] = useState(false) const [generatingPdf, setGeneratingPdf] = useState(null) const [pdfLanguage, setPdfLanguage] = useState<'de' | 'en'>('de') const [statusFilter, setStatusFilter] = useState('all') useEffect(() => { fetchSessions() }, [statusFilter]) const fetchSessions = async () => { try { setLoading(true) const params = statusFilter !== 'all' ? `?status=${statusFilter}` : '' const res = await fetch(`/api/sdk/v1/compliance/audit/sessions${params}`) if (!res.ok) throw new Error('Fehler beim Laden der Audit-Sessions') const data = await res.json() setSessions(data.sessions || []) } catch (err) { setError(err instanceof Error ? err.message : 'Unbekannter Fehler') } finally { setLoading(false) } } const createSession = async () => { if (!newSession.name || !newSession.auditor_name) { setError('Name und Auditor-Name sind Pflichtfelder') return } try { setCreating(true) const res = await fetch('/api/sdk/v1/compliance/audit/sessions', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(newSession), }) if (!res.ok) throw new Error('Fehler beim Erstellen der Session') setNewSession({ name: '', description: '', auditor_name: '', auditor_email: '', auditor_organization: '', regulation_codes: [] }) setActiveTab('sessions') fetchSessions() } catch (err) { setError(err instanceof Error ? err.message : 'Unbekannter Fehler') } finally { setCreating(false) } } const startSession = async (sessionId: string) => { try { const res = await fetch(`/api/sdk/v1/compliance/audit/sessions/${sessionId}/start`, { method: 'PUT' }) if (!res.ok) throw new Error('Fehler beim Starten der Session') fetchSessions() } catch (err) { setError(err instanceof Error ? err.message : 'Unbekannter Fehler') } } const completeSession = async (sessionId: string) => { try { const res = await fetch(`/api/sdk/v1/compliance/audit/sessions/${sessionId}/complete`, { method: 'PUT' }) if (!res.ok) throw new Error('Fehler beim Abschliessen der Session') fetchSessions() } catch (err) { setError(err instanceof Error ? err.message : 'Unbekannter Fehler') } } const deleteSession = async (sessionId: string) => { if (!confirm('Session wirklich loeschen?')) return try { const res = await fetch(`/api/sdk/v1/compliance/audit/sessions/${sessionId}`, { method: 'DELETE' }) if (!res.ok) throw new Error('Fehler beim Loeschen der Session') fetchSessions() } catch (err) { setError(err instanceof Error ? err.message : 'Unbekannter Fehler') } } const downloadPdf = async (sessionId: string) => { try { setGeneratingPdf(sessionId) const res = await fetch(`/api/sdk/v1/compliance/audit/sessions/${sessionId}/report/pdf?language=${pdfLanguage}`) if (!res.ok) throw new Error('Fehler bei der PDF-Generierung') const blob = await res.blob() const url = window.URL.createObjectURL(blob) const a = document.createElement('a') a.href = url a.download = `audit-report-${sessionId}.pdf` document.body.appendChild(a) a.click() window.URL.revokeObjectURL(url) document.body.removeChild(a) } catch (err) { setError(err instanceof Error ? err.message : 'Unbekannter Fehler') } finally { setGeneratingPdf(null) } } const getStatusBadge = (status: string) => { const styles: Record = { draft: 'bg-slate-100 text-slate-700', in_progress: 'bg-blue-100 text-blue-700', completed: 'bg-green-100 text-green-700', archived: 'bg-purple-100 text-purple-700', } const labels: Record = { draft: 'Entwurf', in_progress: 'In Bearbeitung', completed: 'Abgeschlossen', archived: 'Archiviert', } return ( {labels[status] || status} ) } const getComplianceColor = (percentage: number) => { if (percentage >= 80) return 'text-green-600' if (percentage >= 50) return 'text-yellow-600' return 'text-red-600' } return (
{error && (
{error}
)} {/* Tabs */}
{(['sessions', 'new', 'export'] as const).map((tab) => ( ))}
{/* Sessions Tab */} {activeTab === 'sessions' && (
{loading ? (
{[1, 2, 3].map(i => (
))}
) : sessions.length === 0 ? (

Keine Audit-Sessions vorhanden

Erstellen Sie ein neues Audit, um mit der DSGVO-Pruefung zu beginnen.

) : (
{sessions.map((session) => (
router.push(`/sdk/audit-report/${session.id}`)}>

{session.name}

{getStatusBadge(session.status)}
{session.description &&

{session.description}

}
Auditor: {session.auditor_name} {session.auditor_organization && | {session.auditor_organization}} | Erstellt: {new Date(session.created_at).toLocaleDateString('de-DE')}
{session.completion_percentage}%
{session.completed_items} / {session.total_items} Punkte
= 80 ? 'bg-green-500' : session.completion_percentage >= 50 ? 'bg-yellow-500' : 'bg-red-500'}`} style={{ width: `${session.completion_percentage}%` }} />
{session.compliant_count}
Konform
{session.non_compliant_count}
Nicht Konform
{session.total_items - session.completed_items}
Ausstehend
{session.status === 'draft' && } {session.status === 'in_progress' && } {(session.status === 'completed' || session.status === 'in_progress') && ( )} {(session.status === 'draft' || session.status === 'archived') && }
))}
)}
)} {/* New Session Tab */} {activeTab === 'new' && (

Neues Audit erstellen

setNewSession({ ...newSession, name: e.target.value })} placeholder="z.B. DSGVO Jahresaudit 2026" className="w-full px-4 py-2 border border-slate-200 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent" />