'use client' import React, { useState, useEffect } from 'react' import { DSFA, WP248_CRITERIA, ART35_ABS3_CASES, AI_DSFA_TRIGGERS, checkDSFARequiredByWP248, DSFAThresholdAnalysis, } from '@/lib/sdk/dsfa/types' interface ThresholdAnalysisSectionProps { dsfa: DSFA onUpdate: (data: Record) => Promise isSubmitting: boolean } export function ThresholdAnalysisSection({ dsfa, onUpdate, isSubmitting }: ThresholdAnalysisSectionProps) { // Initialize state from existing data const existingAnalysis = dsfa.threshold_analysis const [wp248Selected, setWp248Selected] = useState( dsfa.wp248_criteria_met || existingAnalysis?.criteria_assessment?.filter(c => c.applies).map(c => c.criterion_id) || [] ) const [art35Selected, setArt35Selected] = useState( dsfa.art35_abs3_triggered || existingAnalysis?.art35_abs3_assessment?.filter(c => c.applies).map(c => c.case_id) || [] ) const [aiTriggersSelected, setAiTriggersSelected] = useState( dsfa.ai_trigger_ids || [] ) const [dsfaRequired, setDsfaRequired] = useState( existingAnalysis?.dsfa_required ?? null ) const [justification, setJustification] = useState( existingAnalysis?.decision_justification || '' ) // Calculate recommendation based on selections const wp248Result = checkDSFARequiredByWP248(wp248Selected) const hasArt35Trigger = art35Selected.length > 0 const hasAITrigger = aiTriggersSelected.length > 0 const recommendation = wp248Result.required || hasArt35Trigger || hasAITrigger ? 'required' : wp248Selected.length === 1 ? 'possible' : 'not_required' // Auto-generate justification when selections change useEffect(() => { if (dsfaRequired === null && !justification) { const parts: string[] = [] if (wp248Selected.length > 0) { const criteriaNames = wp248Selected.map(id => WP248_CRITERIA.find(c => c.id === id)?.code ).filter(Boolean).join(', ') parts.push(`${wp248Selected.length} WP248-Kriterien erfuellt (${criteriaNames})`) } if (art35Selected.length > 0) { parts.push(`Art. 35 Abs. 3 Regelbeispiel${art35Selected.length > 1 ? 'e' : ''} erfuellt`) } if (aiTriggersSelected.length > 0) { parts.push(`${aiTriggersSelected.length} KI-spezifische${aiTriggersSelected.length > 1 ? '' : 'r'} Trigger erfuellt`) } if (parts.length > 0) { setJustification(parts.join('. ') + '.') } } }, [wp248Selected, art35Selected, aiTriggersSelected, dsfaRequired, justification]) const toggleWp248 = (criterionId: string) => { setWp248Selected(prev => prev.includes(criterionId) ? prev.filter(id => id !== criterionId) : [...prev, criterionId] ) } const toggleArt35 = (caseId: string) => { setArt35Selected(prev => prev.includes(caseId) ? prev.filter(id => id !== caseId) : [...prev, caseId] ) } const toggleAITrigger = (triggerId: string) => { setAiTriggersSelected(prev => prev.includes(triggerId) ? prev.filter(id => id !== triggerId) : [...prev, triggerId] ) } const handleSave = async () => { const thresholdAnalysis: DSFAThresholdAnalysis = { id: existingAnalysis?.id || crypto.randomUUID(), dsfa_id: dsfa.id, performed_at: new Date().toISOString(), performed_by: 'current_user', // Would come from auth context criteria_assessment: WP248_CRITERIA.map(c => ({ criterion_id: c.id, applies: wp248Selected.includes(c.id), justification: '', })), art35_abs3_assessment: ART35_ABS3_CASES.map(c => ({ case_id: c.id, applies: art35Selected.includes(c.id), justification: '', })), dsfa_required: dsfaRequired ?? recommendation === 'required', decision_justification: justification, documented: true, } await onUpdate({ threshold_analysis: thresholdAnalysis, wp248_criteria_met: wp248Selected, art35_abs3_triggered: art35Selected, ai_trigger_ids: aiTriggersSelected, involves_ai: aiTriggersSelected.length > 0, }) } return (
{/* Step 1: WP248 Criteria */}

Schritt 1: WP248 Kriterien pruefen

Pruefen Sie, welche der 9 Kriterien der Artikel-29-Datenschutzgruppe auf Ihre Verarbeitung zutreffen. Bei 2 oder mehr erfuellten Kriterien ist eine DSFA in den meisten Faellen erforderlich.

{WP248_CRITERIA.map((criterion) => ( ))}
{/* WP248 Summary */}
= 2 ? 'bg-orange-50 border-orange-200' : wp248Selected.length === 1 ? 'bg-yellow-50 border-yellow-200' : 'bg-green-50 border-green-200' }`}>
{wp248Selected.length >= 2 ? ( ) : ( )} {wp248Selected.length} von 9 Kriterien erfuellt

{wp248Result.reason}

{/* Step 2: Art. 35 Abs. 3 Cases */}

Schritt 2: Art. 35 Abs. 3 Regelbeispiele

Bei Erfuellung eines Regelbeispiels ist eine DSFA zwingend erforderlich.

{ART35_ABS3_CASES.map((caseItem) => ( ))}
{/* Step 3: AI-specific Triggers */}

Schritt 3: KI-spezifische Trigger

Wird kuenstliche Intelligenz eingesetzt? Diese Trigger sind in der deutschen DSFA-Muss-Liste enthalten.

{AI_DSFA_TRIGGERS.map((trigger) => ( ))}
{/* Step 4: Decision */}

Schritt 4: Entscheidung

Dokumentieren Sie Ihre Entscheidung, ob eine DSFA erforderlich ist.

{/* Recommendation Banner */}
{recommendation === 'required' ? ( <>

DSFA erforderlich

Basierend auf Ihrer Auswahl ist eine DSFA in den meisten Faellen Pflicht.

) : recommendation === 'possible' ? ( <>

DSFA moeglicherweise erforderlich

Einzelfallpruefung empfohlen. Bei Unsicherheit DSFA durchfuehren.

) : ( <>

DSFA wahrscheinlich nicht erforderlich

Keine Pflichtkriterien erfuellt. Dokumentieren Sie diese Entscheidung.

)}
{/* Decision Radio Buttons */}
{/* Justification */}

Gem. DSK Kurzpapier Nr. 5 ist die Entscheidung und ihre Begruendung zu dokumentieren.