'use client' import { useState } from 'react' import { READINESS_PRESETS, ReadinessPreset } from './readiness-presets' import { ReadinessResultView, ReadinessResult } from './ReadinessResult' const PRODUCER_TYPES = [ { v: 'component', label: 'Komponente / Zulieferteil', hint: 'z. B. Steuerung, Sensor (B2B)' }, { v: 'end_device', label: 'Endgerät', hint: 'fertiges Produkt' }, { v: 'machine_integrator', label: 'Anlage / Maschine', hint: 'Integrator — Vernetzung/OTA meist gegeben' }, { v: 'software_app', label: 'Software / App / Cloud', hint: 'keine eigene Hardware' }, ] const QUESTIONS = [ { k: 'is_machinery', label: 'Ist das Produkt eine Maschine oder Anlage?' }, { k: 'connected_to_internet', label: 'Mit Netzwerk / Internet verbunden?' }, { k: 'has_firmware', label: 'Enthält Software oder Firmware?' }, { k: 'has_software_updates', label: 'Werden Updates bereitgestellt?' }, { k: 'remote_maintenance', label: 'Gibt es Fernwartungszugänge?' }, { k: 'user_parameter_app', label: 'App / Weboberfläche für Nutzer?' }, { k: 'processes_personal_data', label: 'Werden personenbezogene Daten verarbeitet?' }, { k: 'is_critical_infra_supplier', label: 'Einsatz in kritischen Umgebungen?' }, ] const EVIDENCE = [ { k: 'sbom', label: 'SBOM' }, { k: 'vdp', label: 'Vulnerability-Disclosure-Policy' }, { k: 'patch_process', label: 'Patch-/Update-Prozess' }, { k: 'support_lifecycle', label: 'Support-Lifecycle' }, { k: 'threat_model', label: 'Threat Model' }, { k: 'security_logging', label: 'Security-Logging' }, { k: 'auth_concept', label: 'Auth-/Passwortkonzept' }, { k: 'incident_process', label: 'Incident-/Meldeprozess' }, ] export function ReadinessCheck({ onCreateProject }: { onCreateProject?: () => void }) { const [intendedUse, setIntendedUse] = useState('') const [producerType, setProducerType] = useState('') const [flags, setFlags] = useState>({}) const [after2027, setAfter2027] = useState(true) const [customersAsk, setCustomersAsk] = useState(false) const [evidence, setEvidence] = useState>({}) const [digitalElements, setDigitalElements] = useState([]) const [result, setResult] = useState(null) const [loading, setLoading] = useState(false) const toggle = (k: string) => setFlags((f) => ({ ...f, [k]: !f[k] })) const toggleEv = (k: string) => setEvidence((e) => ({ ...e, [k]: !e[k] })) const applyPreset = (p: ReadinessPreset) => { setIntendedUse(p.intended_use) setProducerType(p.producer_type) setFlags({ ...p.flags }) setAfter2027(p.placed_on_market_after_2027) setCustomersAsk(p.customers_request_cra_evidence) setEvidence(Object.fromEntries(p.provided_evidence.map((k) => [k, true]))) setDigitalElements(p.digital_elements) setResult(null) } const run = async () => { setLoading(true) try { const res = await fetch('/api/v1/cra/readiness', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ intended_use: intendedUse, producer_type: producerType, placed_on_market_after_2027: after2027, customers_request_cra_evidence: customersAsk, provided_evidence: Object.keys(evidence).filter((k) => evidence[k]), digital_elements: digitalElements, ...flags, }), }) setResult(res.ok ? await res.json() : null) } finally { setLoading(false) } } return (

CRA-Readiness-Check

Neutrale Erst-Einschätzung: Fällt Ihr Produkt unter den CRA (Pflicht ab 11.12.2027) oder die Maschinenverordnung — und welche Nachweise fehlen noch? Maßgeblich ist das Inverkehrbringen, nicht der Entwicklungszeitpunkt. Auch Bestandsprodukte, die nach 2027 noch verkauft werden, sind betroffen.

{/* Demo-Presets */}
Beispiel laden: {READINESS_PRESETS.map((p) => ( ))}
{/* Hersteller-Typ */}

Was bringen Sie in Verkehr?

{PRODUCER_TYPES.map((t) => ( ))}