From 2d9b650ac17e0862ede19cd005f6604cc123e0c1 Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Tue, 16 Jun 2026 17:25:17 +0200 Subject: [PATCH] =?UTF-8?q?feat(cra):=20Eingangst=C3=BCr-Frontend=20?= =?UTF-8?q?=E2=80=94=20neutrales=20Verdict=20+=20Hersteller-Typ=20+=20Pres?= =?UTF-8?q?ets?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ReadinessCheck erweitert: Hersteller-Typ-Weiche (Komponente/Endgeraet/Anlage- Maschine/Software-App), Verkauf-ab-2027- und Kunden-Nachfrage-Fragen, Checkliste vorhandener Nachweise. Neuer Ergebnis-View (ReadinessResult): 3-Tier-Verdict (zwingend/ratsam/nicht betroffen, Co-Pilot-Ton ohne Panik-Rot) + Reifegrad-% + fehlende Nachweise + gefundene digitale Elemente + Pflichten-Uebersicht. Zwei Demo-Presets (OWIS PS90+ Komponente, ZwickRoell roboTest Anlage+SW). Co-Authored-By: Claude Opus 4.7 --- .../sdk/cra/_components/ReadinessCheck.tsx | 246 ++++++++---------- .../sdk/cra/_components/ReadinessResult.tsx | 168 ++++++++++++ .../sdk/cra/_components/readiness-presets.ts | 54 ++++ 3 files changed, 333 insertions(+), 135 deletions(-) create mode 100644 admin-compliance/app/sdk/cra/_components/ReadinessResult.tsx create mode 100644 admin-compliance/app/sdk/cra/_components/readiness-presets.ts diff --git a/admin-compliance/app/sdk/cra/_components/ReadinessCheck.tsx b/admin-compliance/app/sdk/cra/_components/ReadinessCheck.tsx index deea3e6e..86227ebd 100644 --- a/admin-compliance/app/sdk/cra/_components/ReadinessCheck.tsx +++ b/admin-compliance/app/sdk/cra/_components/ReadinessCheck.tsx @@ -1,103 +1,122 @@ 'use client' import { useState } from 'react' +import { READINESS_PRESETS, ReadinessPreset } from './readiness-presets' +import { ReadinessResultView, ReadinessResult } from './ReadinessResult' -interface GuidelineItem { - req_id: string - title: string - category: string - annex_anchor: string - severity: string - effort_days?: number - measures: { id: string; name: string }[] - source?: string -} -interface ReadinessResult { - in_scope: boolean - classification: string - rationale: string[] - conformity_path_hint: string - regulations: string[] - guideline: { code: GuidelineItem[]; process: GuidelineItem[]; document: GuidelineItem[] } - counts: { code: number; process: number; document: number } - total_effort_days: number - deadlines: { date: string; label: string }[] -} - -const CLASS_LABEL: Record = { - CRITICAL: 'Kritisch', IMPORTANT_II: 'Wichtig (Klasse II)', IMPORTANT_I: 'Wichtig (Klasse I)', - STANDARD: 'Standard', NOT_IN_SCOPE: 'Nicht im CRA-Anwendungsbereich', -} -const BUCKETS: { key: 'code' | 'process' | 'document'; label: string; hint: string }[] = [ - { key: 'code', label: 'Code / Technik', hint: 'im Produkt umzusetzen' }, - { key: 'process', label: 'Prozesse', hint: 'organisatorisch zu etablieren' }, - { key: 'document', label: 'Dokumentation', hint: 'nachzuweisen / beizulegen' }, +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, ...flags }), + 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) } } - const QUESTIONS: { k: string; label: string }[] = [ - { k: 'is_machinery', label: 'Ist das Produkt eine Maschine oder Anlage?' }, - { k: 'connected_to_internet', label: 'Ist das Produkt mit Netzwerken oder dem Internet verbunden?' }, - { k: 'has_firmware', label: 'Enthält das Produkt Software oder Firmware?' }, - { k: 'has_software_updates', label: 'Werden Software- oder Firmware-Updates bereitgestellt?' }, - { k: 'remote_maintenance', label: 'Gibt es Fernwartungszugänge?' }, - { k: 'user_parameter_app', label: 'Gibt es eine App oder Weboberfläche für Nutzer?' }, - { k: 'processes_personal_data', label: 'Werden personenbezogene Daten verarbeitet?' }, - { k: 'is_critical_infra_supplier', label: 'Wird das Produkt in kritischen Umgebungen oder Infrastrukturen eingesetzt?' }, - ] - return (

CRA-Readiness-Check

- Vernetzte Produkte und Maschinen treffen ab 2027 gleich zwei neue regulatorische Anforderungen: -

-
    -
  • Cyber Resilience Act (CRA) — Herstellerpflichten ab 11.12.2027
  • -
  • Maschinenverordnung (EU) 2023/1230 — Anwendung ab 20.01.2027
  • -
-

- Während der CRA die Cybersecurity vernetzter Produkte über ihren gesamten Lebenszyklus regelt, verlangt die - neue Maschinenverordnung Schutzmaßnahmen gegen digitale Manipulationen, soweit diese - Auswirkungen auf die Sicherheit von Personen haben können. -

-

- Mit wenigen Fragen erhalten Sie eine erste Einschätzung, welche Anforderungen für Ihr Produkt relevant werden - und welche Maßnahmen in den Bereichen Entwicklung, Dokumentation, Risikobeurteilung, Updates und Prozesse erforderlich sind. -

-

- Der CRA verlangt mehr als einen jährlichen Penetrationstest: Hersteller müssen Cyber-Risiken über den gesamten - Produktlebenszyklus bewerten, dokumentieren und behandeln — von der Entwicklung bis zur Bereitstellung von Sicherheitsupdates. -

-

- Wir prüfen nicht nur die CRA-Konformität — wir übersetzen regulatorische Anforderungen direkt in Risiken, - Maßnahmen, Tickets, Evidenzen und technische Umsetzungsaufgaben. (We turn regulation into code.) + 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) => ( + + ))} +
+