'use client' /** * Audit Workspace - Collaborative Audit Management * * Features: * - View all requirements with original text from regulations * - Document implementation details for each requirement * - Link to source documents (PDFs, EUR-Lex) * - Track audit status (pending, in_review, approved, rejected) * - Add code references and evidence * - Auditor notes and sign-off */ import { useState, useEffect } from 'react' import Link from 'next/link' import AdminLayout from '@/components/admin/AdminLayout' import type { Regulation, Requirement, RequirementUpdate } from './types' import RequirementList from './_components/RequirementList' import RequirementDetailPanel from './_components/RequirementDetailPanel' export default function AuditWorkspacePage() { const [regulations, setRegulations] = useState([]) const [requirements, setRequirements] = useState([]) const [selectedRegulation, setSelectedRegulation] = useState(null) const [selectedRequirement, setSelectedRequirement] = useState(null) const [loading, setLoading] = useState(true) const [saving, setSaving] = useState(false) const [filterAuditStatus, setFilterAuditStatus] = useState('all') const [filterImplStatus, setFilterImplStatus] = useState('all') const [searchQuery, setSearchQuery] = useState('') const BACKEND_URL = process.env.NEXT_PUBLIC_BACKEND_URL || 'http://localhost:8000' useEffect(() => { loadRegulations() }, []) useEffect(() => { if (selectedRegulation) loadRequirements(selectedRegulation) }, [selectedRegulation]) const loadRegulations = async () => { try { const res = await fetch(`${BACKEND_URL}/api/v1/compliance/regulations`) if (res.ok) { const data = await res.json() setRegulations(data.regulations || []) if (data.regulations?.length > 0) setSelectedRegulation(data.regulations[0].code) } } catch (err) { console.error('Failed to load regulations:', err) } finally { setLoading(false) } } const loadRequirements = async (regCode: string) => { try { const res = await fetch(`${BACKEND_URL}/api/v1/compliance/regulations/${regCode}/requirements`) if (res.ok) { const data = await res.json() setRequirements(data.requirements || []) } } catch (err) { console.error('Failed to load requirements:', err) } } const updateRequirement = async (reqId: string, updates: RequirementUpdate) => { setSaving(true) try { const res = await fetch(`${BACKEND_URL}/api/v1/compliance/requirements/${reqId}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(updates), }) if (res.ok) { setRequirements(prev => prev.map(r => r.id === reqId ? { ...r, ...updates } : r)) if (selectedRequirement?.id === reqId) { setSelectedRequirement({ ...selectedRequirement, ...updates }) } } } catch (err) { console.error('Failed to update requirement:', err) } finally { setSaving(false) } } const filteredRequirements = requirements.filter(req => { if (filterAuditStatus !== 'all' && req.audit_status !== filterAuditStatus) return false if (filterImplStatus !== 'all' && req.implementation_status !== filterImplStatus) return false if (searchQuery) { const query = searchQuery.toLowerCase() return ( req.title.toLowerCase().includes(query) || req.article.toLowerCase().includes(query) || req.requirement_text?.toLowerCase().includes(query) ) } return true }) const currentRegulation = regulations.find(r => r.code === selectedRegulation) const stats = { total: requirements.length, verified: requirements.filter(r => r.implementation_status === 'verified').length, approved: requirements.filter(r => r.audit_status === 'approved').length, pending: requirements.filter(r => r.audit_status === 'pending').length, } return ( {/* Header with back link */}
Zurueck zu Compliance
{stats.approved}/{stats.total} genehmigt | {stats.verified}/{stats.total} verifiziert
{/* Right Panel */}
{selectedRequirement ? ( updateRequirement(selectedRequirement.id, updates)} saving={saving} /> ) : (

Waehlen Sie eine Anforderung aus der Liste

)}
) }