'use client' import React, { useState, useEffect } from 'react' import { NormsCoverage } from './NormsCoverage' type ScopeStatus = 'in_scope' | 'partially' | 'not_in_scope' | 'planned' interface ProcessStep { number: number title: string description: string actor: string scope: ScopeStatus toolNote?: string } const CE_PROCESS_STEPS: ProcessStep[] = [ { number: 1, title: 'Maschinenplanung', description: 'Hersteller plant Maschine/Anlage', actor: 'Hersteller', scope: 'not_in_scope', }, { number: 2, title: 'CE-Firma beauftragen', description: 'Hersteller beauftragt CE-Beratungsfirma oder internes CE-Team', actor: 'Hersteller', scope: 'not_in_scope', }, { number: 3, title: 'Grenzen definieren', description: 'Bestimmungsgemasse Verwendung, vorhersehbare Fehlanwendung, Betriebsarten, raeumliche/zeitliche Grenzen', actor: 'Gemeinsam', scope: 'in_scope', toolNote: 'Interview/Wizard tab', }, { number: 4, title: 'Normenrecherche', description: 'C-Normen (maschinenspezifisch), B-Normen (Sicherheitsfunktionen), A-Normen (ISO 12100). Harmonisierte Normen ermoeglichen Konformitaetsvermutung.', actor: 'CE-Firma', scope: 'in_scope', toolNote: 'manueller Eintrag', }, { number: 5, title: 'Maschinenbeschreibung', description: 'Komponentenbaum, Energiequellen, technische Daten, Betriebsarten systematisch erfassen', actor: 'CE-Firma', scope: 'in_scope', toolNote: 'Komponenten tab', }, { number: 6, title: 'Gefaehrdungen identifizieren', description: 'Systematisch pro Komponente x Lebenszyklus. Deterministisches Pattern-Matching generiert Vorschlaege.', actor: 'CE-Firma + Tool', scope: 'in_scope', toolNote: 'Hazard Log', }, { number: 7, title: 'Risiko bewerten', description: 'Schwere x Exposition x Eintrittswahrscheinlichkeit. Automatische SIL/PL-Ableitung aus Risikograph.', actor: 'CE-Firma + Tool', scope: 'in_scope', toolNote: 'Hazard Log', }, { number: 8, title: 'Massnahmen definieren', description: '3-Stufen-Hierarchie (PFLICHT): 1. Design, 2. Schutzeinrichtung, 3. Information. Tool schlaegt kategorienspezifisch vor.', actor: 'CE-Firma + Tool', scope: 'in_scope', toolNote: 'Massnahmen tab', }, { number: 9, title: 'Massnahmen umsetzen', description: 'Hersteller implementiert konstruktive Aenderungen, Schutzeinrichtungen, Beschilderung etc.', actor: 'Hersteller', scope: 'partially', toolNote: 'Nachweis-Upload', }, { number: 10, title: 'Restrisiko bewerten', description: 'Iterativ: Nach Massnahmen-Umsetzung erneut bewerten. Akzeptabel? Wenn nein: zurueck zu Schritt 8.', actor: 'CE-Firma', scope: 'in_scope', toolNote: 'Reassessment', }, { number: 11, title: 'Verifikation', description: 'Messungen, Berechnungen, Pruefungen. Nachweise den Massnahmen zuordnen.', actor: 'CE-Firma', scope: 'in_scope', toolNote: 'Verifikation tab', }, { number: 12, title: 'Benannte Stelle', description: 'NUR fuer Annex-IV-Maschinen (Pressen, Holzbearbeitung, Hebezeuge): Formale Baumusterpruefung durch TUeV/DGUV Test o.ae.', actor: 'Notified Body', scope: 'not_in_scope', }, { number: 13, title: 'Betriebsanleitung', description: 'Restrisiken fuer Bediener dokumentieren, Sicherheitshinweise, bestimmungsgemasse Verwendung', actor: 'CE-Firma', scope: 'planned', }, { number: 14, title: 'Technische Unterlagen', description: 'Gesamtdossier: Plaene, Schaltbilder, Berechnungen, Risikobeurteilung, Normen, Pruefberichte, Betriebsanleitung', actor: 'CE-Firma', scope: 'in_scope', toolNote: 'CE-Akte tab', }, { number: 15, title: 'CE-Erklaerung', description: 'Hersteller unterschreibt EU-Konformitaetserklaerung und bringt CE-Kennzeichnung an. Die CE-Firma gibt KEIN CE — der Hersteller traegt die Verantwortung.', actor: 'Hersteller', scope: 'not_in_scope', }, ] const SCOPE_STYLES: Record = { in_scope: { border: 'border-l-purple-500', bg: 'bg-purple-50 dark:bg-purple-900/10', badge: 'bg-purple-100 text-purple-700 dark:bg-purple-900/40 dark:text-purple-300', badgeText: 'Im Tool', }, partially: { border: 'border-l-yellow-500', bg: 'bg-yellow-50 dark:bg-yellow-900/10', badge: 'bg-yellow-100 text-yellow-700 dark:bg-yellow-900/40 dark:text-yellow-300', badgeText: 'Teilweise', }, not_in_scope: { border: 'border-l-gray-300', bg: 'bg-gray-50 dark:bg-gray-800/50', badge: 'bg-gray-100 text-gray-500 dark:bg-gray-700 dark:text-gray-400', badgeText: 'Nicht im Tool', }, planned: { border: 'border-l-gray-300 border-dashed', bg: 'bg-gray-50 dark:bg-gray-800/50', badge: 'bg-blue-100 text-blue-600 dark:bg-blue-900/40 dark:text-blue-300', badgeText: 'Geplant', }, } const STORAGE_KEY = 'iace-process-flow-collapsed' function StepCard({ step }: { step: ProcessStep }) { const style = SCOPE_STYLES[step.scope] const muted = step.scope === 'not_in_scope' || step.scope === 'planned' return (
{/* Timeline connector */}
{step.number}
{step.number < 15 && (
)}
{/* Card */}

{step.title}

{style.badgeText}

{step.description}

{step.actor} {step.toolNote && ( {step.toolNote} )}
) } export function ProcessFlow() { // Default to expanded (false) — avoids SSR hydration mismatch const [collapsed, setCollapsed] = useState(false) const [mounted, setMounted] = useState(false) useEffect(() => { const stored = localStorage.getItem(STORAGE_KEY) if (stored === 'true') { setCollapsed(true) } setMounted(true) }, []) function toggle() { const next = !collapsed setCollapsed(next) localStorage.setItem(STORAGE_KEY, String(next)) } const inScopeCount = CE_PROCESS_STEPS.filter((s) => s.scope === 'in_scope').length const partialCount = CE_PROCESS_STEPS.filter((s) => s.scope === 'partially').length return (
{/* Header — always visible */} {/* Content — collapsible */} {!collapsed && (
{/* Legend */}
Im Tool abgedeckt Teilweise abgedeckt Nicht im Tool Geplant
{/* Timeline */}
{CE_PROCESS_STEPS.map((step) => ( ))}
{/* Norms Coverage Table */}
{/* Disclaimers */}

Hinweis: Dieses Tool ersetzt NICHT die Fachkompetenz eines CE-Beraters. Es automatisiert die systematische Dokumentation und schlaegt Gefaehrdungen/Massnahmen vor. Die fachliche Bewertung und Verantwortung verbleibt beim CE-Experten und Hersteller.

Normenrecherche — Rechtliche Grundlage

Was dieses Tool anzeigt:

  • Normennummern (z.B. "ISO 13857:2019") — Identifikatoren, kein geschuetzter Text
  • Offizielle Normentitel — bibliografische Information
  • Abschnittsnummern (z.B. "Abschnitt 4.2, Tabelle 1") — Verweisadressen
  • Eigene Zusammenfassungen des Regelungsbereichs — unser Text, nicht Normtext

Was dieses Tool NICHT anzeigt:

  • Normtext (auch nicht auszugsweise) — urheberrechtlich geschuetzt durch DIN/ISO/CEN
  • Tabellenwerte oder Grenzwerte aus Normen
  • Diagramme oder Bilder aus Normen

Normtexte muessen separat beschafft werden, z.B. ueber{' '} www.beuth.de {' '} (DIN-Normen) oder{' '} www.iso.org .

)}
) }