'use client' import { useState } from 'react' import { useParams } from 'next/navigation' import { useMitigations } from '../mitigations/_hooks/useMitigations' import type { Mitigation } from '../mitigations/_components/types' // Verifikations-Page (Phase-1 Workflow): // // Diese Seite ist eine abgeleitete View auf die Maßnahmen-Liste. Sie zeigt // nur diejenigen Maßnahmen, die der Fachmann auf der Maßnahmen-Seite als // `is_relevant = true` markiert hat. Pro Maßnahme stehen zwei Aktionen // zur Verfügung: // // 1. "Beim Kunden Standard" — Die Maßnahme ist beim Kunden bereits // umgesetzt (z.B. firmenweite Vorgabe, identische Vor-Anlage). // Setzt is_customer_standard = true und status = verified. // Es ist kein Nachweis-Dokument erforderlich. // // 2. "Verifizieren (mit Nachweis)" — Öffnet ein Modal, in dem der // Verifizierer einen Text-Nachweis hinterlegt (Prüfprotokoll-Nummer, // Abnahme-Referenz, etc.). Setzt status = verified. Die File-Upload- // Variante folgt in Phase 2, sobald ein Object-Storage-Backend // verfügbar ist. // // Wenn die Maßnahme bereits verifiziert ist, wird ein "Zurücksetzen"-Link // angeboten — er stellt status auf 'implemented' zurück, damit der // Fachmann eine versehentliche Bestätigung rückgängig machen kann. export default function VerificationPage() { const params = useParams() const projectId = params.projectId as string const { byType, loading, handleSetCustomerStandard } = useMitigations(projectId) const [verifyTarget, setVerifyTarget] = useState(null) const [verifyResult, setVerifyResult] = useState('') const [submitting, setSubmitting] = useState(false) if (loading) return (
) const allRelevant = [...byType.design, ...byType.protection, ...byType.information].filter((m) => m.is_relevant) const groups = groupByTitle(allRelevant) const totals = { total: allRelevant.length, verified: allRelevant.filter((m) => m.status === 'verified').length, customerStd: allRelevant.filter((m) => m.is_customer_standard).length, pending: allRelevant.filter((m) => m.status !== 'verified').length, } async function setStatus(id: string, value: 'implemented' | 'verified') { await fetch(`/api/sdk/v1/iace/mitigations/${id}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ status: value }), }) } async function submitVerify() { if (!verifyTarget) return setSubmitting(true) try { await fetch(`/api/sdk/v1/iace/projects/${projectId}/mitigations/${verifyTarget.id}/verify`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ verification_result: verifyResult }), }) // Refetch via window-reload of just the data — useMitigations refreshes on mount. window.location.reload() } finally { setSubmitting(false) setVerifyTarget(null) setVerifyResult('') } } return (

Verifikation

Bestätige die Umsetzung jeder als relevant markierten Maßnahme — entweder als Kundenstandard (keine Nachweis-Datei nötig) oder mit hinterlegtem Nachweis.

{totals.total === 0 ? (
Keine als relevant markierten Maßnahmen vorhanden. Gehe zurück zur {' '}Maßnahmen-Seite{' '} und kreuze die anwendbaren Maßnahmen an.
) : ( <>
{groups.map(({ title, instances }) => { const verifiedCount = instances.filter((m) => m.status === 'verified').length const allDone = verifiedCount === instances.length return (
{title}
{verifiedCount}/{instances.length} verifiziert
{allDone && ( )}
{instances.map((m) => { const isVerified = m.status === 'verified' return (
{(m.linked_hazard_names || []).join(', ') || '— (keine Gefährdung verknüpft)'}
{m.is_customer_standard && (
Beim Kunden Standard
)}
{!isVerified ? ( <> ) : ( <> ✓ Verifiziert )}
) })}
) })} )} {verifyTarget && (

Verifizieren

{verifyTarget.title}

{(verifyTarget.linked_hazard_names || []).join(', ')}