'use client' /** * Audit Report Management Page * * Create and manage GDPR audit sessions with PDF report generation. */ import { useState, useEffect } from 'react' import { PagePurpose } from '@/components/common/PagePurpose' 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 } // Available regulations for filtering 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 [sessions, setSessions] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [activeTab, setActiveTab] = useState<'sessions' | 'new' | 'export'>('sessions') // New session form const [newSession, setNewSession] = useState({ name: '', description: '', auditor_name: '', auditor_email: '', auditor_organization: '', regulation_codes: [] as string[], }) const [creating, setCreating] = useState(false) // PDF generation const [generatingPdf, setGeneratingPdf] = useState(null) const [pdfLanguage, setPdfLanguage] = useState<'de' | 'en'>('de') // Status filter 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/admin/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/admin/audit/sessions', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(newSession), }) if (!res.ok) { throw new Error('Fehler beim Erstellen der Session') } // Reset form and refresh 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/admin/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/admin/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/admin/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/admin/audit/sessions/${sessionId}/pdf?language=${pdfLanguage}` ) if (!res.ok) { throw new Error('Fehler bei der PDF-Generierung') } // Download the PDF 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 (
{/* Page Purpose */} {/* Error Display */} {error && (
{error}
)} {/* Tabs */}
{/* Sessions Tab */} {activeTab === 'sessions' && (
{/* Filter */}
{/* Sessions List */} {loading ? (
Lade Audit-Sessions...
) : sessions.length === 0 ? (

Keine Audit-Sessions vorhanden

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

) : (
{sessions.map((session) => (

{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
{/* Progress Bar */}
= 80 ? 'bg-green-500' : session.completion_percentage >= 50 ? 'bg-yellow-500' : 'bg-red-500' }`} style={{ width: `${session.completion_percentage}%` }} />
{/* Statistics */}
{session.compliant_count}
Konform
{session.non_compliant_count}
Nicht Konform
{session.total_items - session.completed_items}
Ausstehend
{/* Actions */}
{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

{/* Name */}
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" />
{/* Description */}