diff --git a/admin-compliance/components/sdk/DocumentUpload/DocumentUploadIcons.tsx b/admin-compliance/components/sdk/DocumentUpload/DocumentUploadIcons.tsx new file mode 100644 index 0000000..8bd42f6 --- /dev/null +++ b/admin-compliance/components/sdk/DocumentUpload/DocumentUploadIcons.tsx @@ -0,0 +1,40 @@ +'use client' +// ============================================================================= +// DocumentUpload icon components — extracted from DocumentUploadSection for LOC compliance +// ============================================================================= + +export const UploadIcon = () => ( + + + +) + +export const QRIcon = () => ( + + + +) + +export const DocumentIcon = () => ( + + + +) + +export const CheckIcon = () => ( + + + +) + +export const EditIcon = () => ( + + + +) + +export const CloseIcon = () => ( + + + +) diff --git a/admin-compliance/components/sdk/DocumentUpload/DocumentUploadQRModal.tsx b/admin-compliance/components/sdk/DocumentUpload/DocumentUploadQRModal.tsx new file mode 100644 index 0000000..3d61831 --- /dev/null +++ b/admin-compliance/components/sdk/DocumentUpload/DocumentUploadQRModal.tsx @@ -0,0 +1,123 @@ +'use client' +// ============================================================================= +// QRCodeModal — extracted from DocumentUploadSection for LOC compliance +// ============================================================================= + +import { useEffect, useState } from 'react' +import { QRIcon, CloseIcon } from './DocumentUploadIcons' + +interface QRModalProps { + isOpen: boolean + onClose: () => void + sessionId: string + onFileUploaded?: (file: File) => void +} + +export function QRCodeModal({ isOpen, onClose, sessionId }: QRModalProps) { + const [uploadUrl, setUploadUrl] = useState('') + const [qrCodeUrl, setQrCodeUrl] = useState(null) + + useEffect(() => { + if (!isOpen) return + + let baseUrl = typeof window !== 'undefined' ? window.location.origin : '' + + // Hostname to IP mapping for local network + const hostnameToIP: Record = { + 'macmini': '192.168.178.100', + 'macmini.local': '192.168.178.100', + } + + Object.entries(hostnameToIP).forEach(([hostname, ip]) => { + if (baseUrl.includes(hostname)) { + baseUrl = baseUrl.replace(hostname, ip) + } + }) + + // Force HTTP for mobile access (SSL cert is for hostname, not IP) + // This is safe because it's only used on the local network + if (baseUrl.startsWith('https://')) { + baseUrl = baseUrl.replace('https://', 'http://') + } + + const uploadPath = `/upload/sdk/${sessionId}` + const fullUrl = `${baseUrl}${uploadPath}` + setUploadUrl(fullUrl) + + const qrApiUrl = `https://api.qrserver.com/v1/create-qr-code/?size=250x250&data=${encodeURIComponent(fullUrl)}` + setQrCodeUrl(qrApiUrl) + }, [isOpen, sessionId]) + + const copyToClipboard = async () => { + try { + await navigator.clipboard.writeText(uploadUrl) + } catch (err) { + console.error('Copy failed:', err) + } + } + + if (!isOpen) return null + + return ( +
+
+
+
+
+
+ +
+
+

Mit Handy hochladen

+

QR-Code scannen

+
+
+ +
+ +
+
+ {qrCodeUrl ? ( + QR Code + ) : ( +
+
+
+ )} +
+ +

+ Scannen Sie den Code mit Ihrem Handy,
+ um Dokumente hochzuladen. +

+ +
+

Oder Link teilen:

+
+ + +
+
+ +
+

+ Hinweis: Ihr Handy muss im gleichen Netzwerk sein. +

+
+
+
+
+ ) +} diff --git a/admin-compliance/components/sdk/DocumentUpload/DocumentUploadSection.tsx b/admin-compliance/components/sdk/DocumentUpload/DocumentUploadSection.tsx index 64e7e84..03c8973 100644 --- a/admin-compliance/components/sdk/DocumentUpload/DocumentUploadSection.tsx +++ b/admin-compliance/components/sdk/DocumentUpload/DocumentUploadSection.tsx @@ -1,257 +1,30 @@ 'use client' -import React, { useState, useCallback, useEffect } from 'react' +import React, { useState, useCallback } from 'react' import { useRouter } from 'next/navigation' +import { + type UploadedDocument, + type DocumentUploadSectionProps, + formatFileSize, + detectVersionFromFilename, + suggestNextVersion, +} from './DocumentUploadTypes' +import { + UploadIcon, + QRIcon, + DocumentIcon, + CheckIcon, + EditIcon, + CloseIcon, +} from './DocumentUploadIcons' +import { QRCodeModal } from './DocumentUploadQRModal' -// ============================================================================= -// TYPES -// ============================================================================= - -export interface UploadedDocument { - id: string - name: string - type: string - size: number - uploadedAt: Date - extractedVersion?: string - extractedContent?: ExtractedContent - status: 'uploading' | 'processing' | 'ready' | 'error' - error?: string -} - -export interface ExtractedContent { - title?: string - version?: string - lastModified?: string - sections?: ExtractedSection[] - metadata?: Record -} - -export interface ExtractedSection { - title: string - content: string - type?: string -} - -export interface DocumentUploadSectionProps { - /** Type of document being uploaded (tom, dsfa, vvt, loeschfristen, etc.) */ - documentType: 'tom' | 'dsfa' | 'vvt' | 'loeschfristen' | 'consent' | 'policy' | 'custom' - /** Title displayed in the upload section */ - title?: string - /** Description text */ - description?: string - /** Accepted file types */ - acceptedTypes?: string - /** Callback when document is uploaded and processed */ - onDocumentProcessed?: (doc: UploadedDocument) => void - /** Callback to open document in workflow editor */ - onOpenInEditor?: (doc: UploadedDocument) => void - /** Session ID for QR upload */ - sessionId?: string - /** Custom CSS classes */ - className?: string -} - -// ============================================================================= -// ICONS -// ============================================================================= - -const UploadIcon = () => ( - - - -) - -const QRIcon = () => ( - - - -) - -const DocumentIcon = () => ( - - - -) - -const CheckIcon = () => ( - - - -) - -const EditIcon = () => ( - - - -) - -const CloseIcon = () => ( - - - -) - -// ============================================================================= -// HELPER FUNCTIONS -// ============================================================================= - -function formatFileSize(bytes: number): string { - if (bytes === 0) return '0 B' - const k = 1024 - const sizes = ['B', 'KB', 'MB', 'GB'] - const i = Math.floor(Math.log(bytes) / Math.log(k)) - return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i] -} - -function detectVersionFromFilename(filename: string): string | undefined { - // Common version patterns: v1.0, V2.1, _v3, -v1.2.3, version-2 - const patterns = [ - /[vV](\d+(?:\.\d+)*)/, - /version[_-]?(\d+(?:\.\d+)*)/i, - /[_-]v?(\d+\.\d+(?:\.\d+)?)[_-]/, - ] - - for (const pattern of patterns) { - const match = filename.match(pattern) - if (match) { - return match[1] - } - } - return undefined -} - -function suggestNextVersion(currentVersion?: string): string { - if (!currentVersion) return '1.0' - - const parts = currentVersion.split('.').map(Number) - if (parts.length >= 2) { - parts[parts.length - 1] += 1 - } else { - parts.push(1) - } - return parts.join('.') -} - -// ============================================================================= -// QR CODE MODAL -// ============================================================================= - -interface QRModalProps { - isOpen: boolean - onClose: () => void - sessionId: string - onFileUploaded?: (file: File) => void -} - -function QRCodeModal({ isOpen, onClose, sessionId }: QRModalProps) { - const [uploadUrl, setUploadUrl] = useState('') - const [qrCodeUrl, setQrCodeUrl] = useState(null) - - useEffect(() => { - if (!isOpen) return - - let baseUrl = typeof window !== 'undefined' ? window.location.origin : '' - - // Hostname to IP mapping for local network - const hostnameToIP: Record = { - 'macmini': '192.168.178.100', - 'macmini.local': '192.168.178.100', - } - - Object.entries(hostnameToIP).forEach(([hostname, ip]) => { - if (baseUrl.includes(hostname)) { - baseUrl = baseUrl.replace(hostname, ip) - } - }) - - // Force HTTP for mobile access (SSL cert is for hostname, not IP) - // This is safe because it's only used on the local network - if (baseUrl.startsWith('https://')) { - baseUrl = baseUrl.replace('https://', 'http://') - } - - const uploadPath = `/upload/sdk/${sessionId}` - const fullUrl = `${baseUrl}${uploadPath}` - setUploadUrl(fullUrl) - - const qrApiUrl = `https://api.qrserver.com/v1/create-qr-code/?size=250x250&data=${encodeURIComponent(fullUrl)}` - setQrCodeUrl(qrApiUrl) - }, [isOpen, sessionId]) - - const copyToClipboard = async () => { - try { - await navigator.clipboard.writeText(uploadUrl) - } catch (err) { - console.error('Copy failed:', err) - } - } - - if (!isOpen) return null - - return ( -
-
-
-
-
-
- -
-
-

Mit Handy hochladen

-

QR-Code scannen

-
-
- -
- -
-
- {qrCodeUrl ? ( - QR Code - ) : ( -
-
-
- )} -
- -

- Scannen Sie den Code mit Ihrem Handy,
- um Dokumente hochzuladen. -

- -
-

Oder Link teilen:

-
- - -
-
- -
-

- Hinweis: Ihr Handy muss im gleichen Netzwerk sein. -

-
-
-
-
- ) -} +export type { + UploadedDocument, + ExtractedContent, + ExtractedSection, + DocumentUploadSectionProps, +} from './DocumentUploadTypes' // ============================================================================= // MAIN COMPONENT diff --git a/admin-compliance/components/sdk/DocumentUpload/DocumentUploadTypes.ts b/admin-compliance/components/sdk/DocumentUpload/DocumentUploadTypes.ts new file mode 100644 index 0000000..be4bf3a --- /dev/null +++ b/admin-compliance/components/sdk/DocumentUpload/DocumentUploadTypes.ts @@ -0,0 +1,89 @@ +// ============================================================================= +// DocumentUpload shared types — extracted from DocumentUploadSection for LOC compliance +// ============================================================================= + +export interface UploadedDocument { + id: string + name: string + type: string + size: number + uploadedAt: Date + extractedVersion?: string + extractedContent?: ExtractedContent + status: 'uploading' | 'processing' | 'ready' | 'error' + error?: string +} + +export interface ExtractedContent { + title?: string + version?: string + lastModified?: string + sections?: ExtractedSection[] + metadata?: Record +} + +export interface ExtractedSection { + title: string + content: string + type?: string +} + +export interface DocumentUploadSectionProps { + /** Type of document being uploaded (tom, dsfa, vvt, loeschfristen, etc.) */ + documentType: 'tom' | 'dsfa' | 'vvt' | 'loeschfristen' | 'consent' | 'policy' | 'custom' + /** Title displayed in the upload section */ + title?: string + /** Description text */ + description?: string + /** Accepted file types */ + acceptedTypes?: string + /** Callback when document is uploaded and processed */ + onDocumentProcessed?: (doc: UploadedDocument) => void + /** Callback to open document in workflow editor */ + onOpenInEditor?: (doc: UploadedDocument) => void + /** Session ID for QR upload */ + sessionId?: string + /** Custom CSS classes */ + className?: string +} + +// ============================================================================= +// Helper functions +// ============================================================================= + +export function formatFileSize(bytes: number): string { + if (bytes === 0) return '0 B' + const k = 1024 + const sizes = ['B', 'KB', 'MB', 'GB'] + const i = Math.floor(Math.log(bytes) / Math.log(k)) + return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i] +} + +export function detectVersionFromFilename(filename: string): string | undefined { + // Common version patterns: v1.0, V2.1, _v3, -v1.2.3, version-2 + const patterns = [ + /[vV](\d+(?:\.\d+)*)/, + /version[_-]?(\d+(?:\.\d+)*)/i, + /[_-]v?(\d+\.\d+(?:\.\d+)?)[_-]/, + ] + + for (const pattern of patterns) { + const match = filename.match(pattern) + if (match) { + return match[1] + } + } + return undefined +} + +export function suggestNextVersion(currentVersion?: string): string { + if (!currentVersion) return '1.0' + + const parts = currentVersion.split('.').map(Number) + if (parts.length >= 2) { + parts[parts.length - 1] += 1 + } else { + parts.push(1) + } + return parts.join('.') +} diff --git a/admin-compliance/components/sdk/Sidebar/SDKSidebar.tsx b/admin-compliance/components/sdk/Sidebar/SDKSidebar.tsx index 5080a76..d35e18f 100644 --- a/admin-compliance/components/sdk/Sidebar/SDKSidebar.tsx +++ b/admin-compliance/components/sdk/Sidebar/SDKSidebar.tsx @@ -10,301 +10,16 @@ import { getStepsForPackage, type SDKPackageId, type SDKStep, - type RAGCorpusStatus, } from '@/lib/sdk' - -/** - * Append ?project= to a URL if a projectId is set - */ -function withProject(url: string, projectId?: string): string { - if (!projectId) return url - const separator = url.includes('?') ? '&' : '?' - return `${url}${separator}project=${projectId}` -} - -// ============================================================================= -// ICONS -// ============================================================================= - -const CheckIcon = () => ( - - - -) - -const LockIcon = () => ( - - - -) - -const WarningIcon = () => ( - - - -) - -const ChevronDownIcon = ({ className = '' }: { className?: string }) => ( - - - -) - -const CollapseIcon = ({ collapsed }: { collapsed: boolean }) => ( - - - -) - -// ============================================================================= -// PROGRESS BAR -// ============================================================================= - -interface ProgressBarProps { - value: number - className?: string -} - -function ProgressBar({ value, className = '' }: ProgressBarProps) { - return ( -
-
-
- ) -} - -// ============================================================================= -// PACKAGE INDICATOR -// ============================================================================= - -interface PackageIndicatorProps { - packageId: SDKPackageId - order: number - name: string - icon: string - completion: number - isActive: boolean - isExpanded: boolean - isLocked: boolean - onToggle: () => void - collapsed: boolean -} - -function PackageIndicator({ - order, - name, - icon, - completion, - isActive, - isExpanded, - isLocked, - onToggle, - collapsed, -}: PackageIndicatorProps) { - if (collapsed) { - return ( - - ) - } - - return ( - - ) -} - -// ============================================================================= -// STEP ITEM -// ============================================================================= - -interface StepItemProps { - step: SDKStep - isActive: boolean - isCompleted: boolean - isLocked: boolean - checkpointStatus?: 'passed' | 'failed' | 'warning' | 'pending' - collapsed: boolean - projectId?: string -} - -function StepItem({ step, isActive, isCompleted, isLocked, checkpointStatus, collapsed, projectId }: StepItemProps) { - const content = ( -
- {/* Step indicator */} -
- {isCompleted ? ( -
- -
- ) : isLocked ? ( -
- -
- ) : isActive ? ( -
-
-
- ) : ( -
- )} -
- - {/* Step name - hidden when collapsed */} - {!collapsed && {step.nameShort}} - - {/* Checkpoint status - hidden when collapsed */} - {!collapsed && checkpointStatus && checkpointStatus !== 'pending' && ( -
- {checkpointStatus === 'passed' ? ( -
- -
- ) : checkpointStatus === 'failed' ? ( -
- ! -
- ) : ( -
- -
- )} -
- )} -
- ) - - if (isLocked) { - return content - } - - return ( - - {content} - - ) -} - -// ============================================================================= -// ADDITIONAL MODULE ITEM -// ============================================================================= - -interface AdditionalModuleItemProps { - href: string - icon: React.ReactNode - label: string - isActive: boolean - collapsed: boolean - projectId?: string -} - -function AdditionalModuleItem({ href, icon, label, isActive, collapsed, projectId }: AdditionalModuleItemProps) { - const isExternal = href.startsWith('http') - const className = `flex items-center gap-3 px-4 py-2.5 text-sm transition-colors ${ - collapsed ? 'justify-center' : '' - } ${ - isActive - ? 'bg-purple-100 text-purple-900 font-medium' - : 'text-gray-600 hover:bg-gray-50 hover:text-gray-900' - }` - - if (isExternal) { - return ( - - {icon} - {!collapsed && ( - - {label} - - - - - )} - - ) - } - - return ( - - {icon} - {!collapsed && {label}} - - ) -} +import { CollapseIcon } from './SidebarIcons' +import { + ProgressBar, + PackageIndicator, + StepItem, + CorpusStalenessInfo, + withProject, +} from './SidebarSubComponents' +import { SidebarModuleList } from './SidebarModuleList' // ============================================================================= // MAIN SIDEBAR @@ -315,41 +30,6 @@ interface SDKSidebarProps { onCollapsedChange?: (collapsed: boolean) => void } -// ============================================================================= -// CORPUS STALENESS INFO -// ============================================================================= - -function CorpusStalenessInfo({ ragCorpusStatus }: { ragCorpusStatus: RAGCorpusStatus }) { - const collections = ragCorpusStatus.collections - const collectionNames = Object.keys(collections) - if (collectionNames.length === 0) return null - - // Check if corpus was updated after the last fetch (simplified: show last update time) - const lastUpdated = collectionNames.reduce((latest, name) => { - const updated = new Date(collections[name].last_updated) - return updated > latest ? updated : latest - }, new Date(0)) - - const daysSinceUpdate = Math.floor((Date.now() - lastUpdated.getTime()) / (1000 * 60 * 60 * 24)) - const totalChunks = collectionNames.reduce((sum, name) => sum + collections[name].chunks_count, 0) - - return ( -
-
-
30 ? 'bg-amber-400' : 'bg-green-400'}`} /> - - RAG Corpus: {totalChunks} Chunks - -
- {daysSinceUpdate > 30 && ( -
- Corpus {daysSinceUpdate}d alt — Re-Evaluation empfohlen -
- )} -
- ) -} - export function SDKSidebar({ collapsed = false, onCollapsedChange }: SDKSidebarProps) { const pathname = usePathname() const { state, packageCompletion, completionPercentage, getCheckpointStatus, projectId } = useSDK() @@ -404,11 +84,8 @@ export function SDKSidebar({ collapsed = false, onCollapsedChange }: SDKSidebarP if (state.preferences?.allowParallelWork) return false const pkg = SDK_PACKAGES.find(p => p.id === packageId) if (!pkg || pkg.order === 1) return false - - // Check if previous package is complete const prevPkg = SDK_PACKAGES.find(p => p.order === pkg.order - 1) if (!prevPkg) return false - return packageCompletion[prevPkg.id] < 100 } @@ -428,7 +105,6 @@ export function SDKSidebar({ collapsed = false, onCollapsedChange }: SDKSidebarP return steps.some(s => s.url === pathname) } - // Filter steps based on visibleWhen conditions const getVisibleStepsForPackage = (packageId: SDKPackageId): SDKStep[] => { const steps = getStepsForPackage(packageId) return steps.filter(step => { @@ -448,12 +124,7 @@ export function SDKSidebar({ collapsed = false, onCollapsedChange }: SDKSidebarP >
- +
{!collapsed && ( @@ -467,7 +138,7 @@ export function SDKSidebar({ collapsed = false, onCollapsedChange }: SDKSidebarP
- {/* Overall Progress - hidden when collapsed */} + {/* Overall Progress */} {!collapsed && (
@@ -483,7 +154,7 @@ export function SDKSidebar({ collapsed = false, onCollapsedChange }: SDKSidebarP )} - {/* Navigation - 5 Packages */} + {/* Navigation — 5 Packages */} {/* Footer */}
- {/* Collapse Toggle */} - {/* Export Button */} {!collapsed && ( diff --git a/admin-compliance/components/sdk/Sidebar/SidebarIcons.tsx b/admin-compliance/components/sdk/Sidebar/SidebarIcons.tsx new file mode 100644 index 0000000..0a536b5 --- /dev/null +++ b/admin-compliance/components/sdk/Sidebar/SidebarIcons.tsx @@ -0,0 +1,40 @@ +'use client' +// ============================================================================= +// SIDEBAR ICON COMPONENTS +// Small SVG icons used in SDKSidebar sub-components. +// ============================================================================= + +export const CheckIcon = () => ( + + + +) + +export const LockIcon = () => ( + + + +) + +export const WarningIcon = () => ( + + + +) + +export const ChevronDownIcon = ({ className = '' }: { className?: string }) => ( + + + +) + +export const CollapseIcon = ({ collapsed }: { collapsed: boolean }) => ( + + + +) diff --git a/admin-compliance/components/sdk/Sidebar/SidebarModuleList.tsx b/admin-compliance/components/sdk/Sidebar/SidebarModuleList.tsx new file mode 100644 index 0000000..986dc84 --- /dev/null +++ b/admin-compliance/components/sdk/Sidebar/SidebarModuleList.tsx @@ -0,0 +1,108 @@ +'use client' +// ============================================================================= +// SIDEBAR ADDITIONAL MODULE LIST +// The "Zusatzmodule" and "Maschinenrecht / CE" sections rendered in the nav. +// ============================================================================= + +import React from 'react' +import Link from 'next/link' +import { usePathname } from 'next/navigation' +import { AdditionalModuleItem, withProject } from './SidebarSubComponents' + +interface SidebarModuleListProps { + collapsed: boolean + projectId?: string + pendingCRCount: number +} + +export function SidebarModuleList({ collapsed, projectId, pendingCRCount }: SidebarModuleListProps) { + const pathname = usePathname() + + return ( + <> + {/* Maschinenrecht / CE */} +
+ {!collapsed && ( +
+ Maschinenrecht / CE +
+ )} + + + + } + label="CE-Compliance (IACE)" + isActive={pathname?.startsWith('/sdk/iace') ?? false} + collapsed={collapsed} + projectId={projectId} + /> +
+ + {/* Additional Modules */} +
+ {!collapsed && ( +
+ Zusatzmodule +
+ )} + } label="Schulung (Admin)" isActive={pathname === '/sdk/training'} collapsed={collapsed} projectId={projectId} /> + } label="Schulung (Learner)" isActive={pathname === '/sdk/training/learner'} collapsed={collapsed} projectId={projectId} /> + } label="Legal RAG" isActive={pathname === '/sdk/rag'} collapsed={collapsed} projectId={projectId} /> + } label="AI Quality" isActive={pathname === '/sdk/quality'} collapsed={collapsed} projectId={projectId} /> + } label="Security Backlog" isActive={pathname === '/sdk/security-backlog'} collapsed={collapsed} projectId={projectId} /> + } label="Compliance Hub" isActive={pathname === '/sdk/compliance-hub'} collapsed={collapsed} projectId={projectId} /> + } label="Assertions" isActive={pathname === '/sdk/assertions'} collapsed={collapsed} projectId={projectId} /> + } label="DSMS" isActive={pathname === '/sdk/dsms'} collapsed={collapsed} projectId={projectId} /> + } label="SDK Flow" isActive={pathname === '/sdk/sdk-flow'} collapsed={collapsed} projectId={projectId} /> + } label="Architektur" isActive={pathname === '/sdk/architecture'} collapsed={collapsed} projectId={projectId} /> + } label="Agenten" isActive={pathname?.startsWith('/sdk/agents') ?? false} collapsed={collapsed} projectId={projectId} /> + } label="Workshop" isActive={pathname === '/sdk/workshop'} collapsed={collapsed} projectId={projectId} /> + } label="Portfolio" isActive={pathname === '/sdk/portfolio'} collapsed={collapsed} projectId={projectId} /> + } label="Roadmap" isActive={pathname === '/sdk/roadmap'} collapsed={collapsed} projectId={projectId} /> + } label="ISMS (ISO 27001)" isActive={pathname === '/sdk/isms'} collapsed={collapsed} projectId={projectId} /> + } label="LLM Audit" isActive={pathname === '/sdk/audit-llm'} collapsed={collapsed} projectId={projectId} /> + } label="RBAC Admin" isActive={pathname === '/sdk/rbac'} collapsed={collapsed} projectId={projectId} /> + } label="Kataloge" isActive={pathname === '/sdk/catalog-manager'} collapsed={collapsed} projectId={projectId} /> + } label="Compliance Wiki" isActive={pathname?.startsWith('/sdk/wiki')} collapsed={collapsed} projectId={projectId} /> + } label="API-Referenz" isActive={pathname === '/sdk/api-docs'} collapsed={collapsed} projectId={projectId} /> + + {/* Change Requests — needs badge so handled directly */} + + + + + {!collapsed && ( + + Änderungsanfragen + {pendingCRCount > 0 && ( + + {pendingCRCount} + + )} + + )} + {collapsed && pendingCRCount > 0 && ( + + )} + + + } label="Developer Portal" isActive={false} collapsed={collapsed} projectId={projectId} /> + } label="SDK Dokumentation" isActive={false} collapsed={collapsed} projectId={projectId} /> +
+ + ) +} diff --git a/admin-compliance/components/sdk/Sidebar/SidebarSubComponents.tsx b/admin-compliance/components/sdk/Sidebar/SidebarSubComponents.tsx new file mode 100644 index 0000000..a64a1b4 --- /dev/null +++ b/admin-compliance/components/sdk/Sidebar/SidebarSubComponents.tsx @@ -0,0 +1,295 @@ +'use client' +// ============================================================================= +// SIDEBAR SUB-COMPONENTS +// ProgressBar, PackageIndicator, StepItem, AdditionalModuleItem, +// CorpusStalenessInfo — all used internally by SDKSidebar. +// ============================================================================= + +import React from 'react' +import Link from 'next/link' +import type { SDKStep, SDKPackageId, RAGCorpusStatus } from '@/lib/sdk' +import { CheckIcon, LockIcon, WarningIcon, ChevronDownIcon } from './SidebarIcons' + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +export function withProject(url: string, projectId?: string): string { + if (!projectId) return url + const separator = url.includes('?') ? '&' : '?' + return `${url}${separator}project=${projectId}` +} + +// --------------------------------------------------------------------------- +// ProgressBar +// --------------------------------------------------------------------------- + +interface ProgressBarProps { + value: number + className?: string +} + +export function ProgressBar({ value, className = '' }: ProgressBarProps) { + return ( +
+
+
+ ) +} + +// --------------------------------------------------------------------------- +// PackageIndicator +// --------------------------------------------------------------------------- + +interface PackageIndicatorProps { + packageId: SDKPackageId + order: number + name: string + icon: string + completion: number + isActive: boolean + isExpanded: boolean + isLocked: boolean + onToggle: () => void + collapsed: boolean +} + +export function PackageIndicator({ + order, + name, + icon, + completion, + isActive, + isExpanded, + isLocked, + onToggle, + collapsed, +}: PackageIndicatorProps) { + if (collapsed) { + return ( + + ) + } + + return ( + + ) +} + +// --------------------------------------------------------------------------- +// StepItem +// --------------------------------------------------------------------------- + +interface StepItemProps { + step: SDKStep + isActive: boolean + isCompleted: boolean + isLocked: boolean + checkpointStatus?: 'passed' | 'failed' | 'warning' | 'pending' + collapsed: boolean + projectId?: string +} + +export function StepItem({ step, isActive, isCompleted, isLocked, checkpointStatus, collapsed, projectId }: StepItemProps) { + const content = ( +
+
+ {isCompleted ? ( +
+ +
+ ) : isLocked ? ( +
+ +
+ ) : isActive ? ( +
+
+
+ ) : ( +
+ )} +
+ + {!collapsed && {step.nameShort}} + + {!collapsed && checkpointStatus && checkpointStatus !== 'pending' && ( +
+ {checkpointStatus === 'passed' ? ( +
+ +
+ ) : checkpointStatus === 'failed' ? ( +
+ ! +
+ ) : ( +
+ +
+ )} +
+ )} +
+ ) + + if (isLocked) return content + + return ( + + {content} + + ) +} + +// --------------------------------------------------------------------------- +// AdditionalModuleItem +// --------------------------------------------------------------------------- + +interface AdditionalModuleItemProps { + href: string + icon: React.ReactNode + label: string + isActive: boolean + collapsed: boolean + projectId?: string +} + +export function AdditionalModuleItem({ href, icon, label, isActive, collapsed, projectId }: AdditionalModuleItemProps) { + const isExternal = href.startsWith('http') + const className = `flex items-center gap-3 px-4 py-2.5 text-sm transition-colors ${ + collapsed ? 'justify-center' : '' + } ${ + isActive + ? 'bg-purple-100 text-purple-900 font-medium' + : 'text-gray-600 hover:bg-gray-50 hover:text-gray-900' + }` + + if (isExternal) { + return ( + + {icon} + {!collapsed && ( + + {label} + + + + + )} + + ) + } + + return ( + + {icon} + {!collapsed && {label}} + + ) +} + +// --------------------------------------------------------------------------- +// CorpusStalenessInfo +// --------------------------------------------------------------------------- + +export function CorpusStalenessInfo({ ragCorpusStatus }: { ragCorpusStatus: RAGCorpusStatus }) { + const collections = ragCorpusStatus.collections + const collectionNames = Object.keys(collections) + if (collectionNames.length === 0) return null + + const lastUpdated = collectionNames.reduce((latest, name) => { + const updated = new Date(collections[name].last_updated) + return updated > latest ? updated : latest + }, new Date(0)) + + const daysSinceUpdate = Math.floor((Date.now() - lastUpdated.getTime()) / (1000 * 60 * 60 * 24)) + const totalChunks = collectionNames.reduce((sum, name) => sum + collections[name].chunks_count, 0) + + return ( +
+
+
30 ? 'bg-amber-400' : 'bg-green-400'}`} /> + + RAG Corpus: {totalChunks} Chunks + +
+ {daysSinceUpdate > 30 && ( +
+ Corpus {daysSinceUpdate}d alt — Re-Evaluation empfohlen +
+ )} +
+ ) +} diff --git a/admin-compliance/components/sdk/StepHeader/StepExplanations.ts b/admin-compliance/components/sdk/StepHeader/StepExplanations.ts new file mode 100644 index 0000000..69e3e01 --- /dev/null +++ b/admin-compliance/components/sdk/StepHeader/StepExplanations.ts @@ -0,0 +1,16 @@ +// ============================================================================= +// STEP EXPLANATION PRESETS — merged index +// Combines Part1 (company-profile … einwilligungen) and +// Part2 (dsr … use-case-workshop) for backward-compatible re-export. +// ============================================================================= + +import type { StepTip } from './StepHeader' +import { STEP_EXPLANATIONS_PART1 } from './StepExplanationsPart1' +import { STEP_EXPLANATIONS_PART2 } from './StepExplanationsPart2' + +type ExplanationEntry = { title: string; description: string; explanation: string; tips: StepTip[] } + +export const STEP_EXPLANATIONS: Record = { + ...STEP_EXPLANATIONS_PART1, + ...STEP_EXPLANATIONS_PART2, +} diff --git a/admin-compliance/components/sdk/StepHeader/StepExplanationsPart1.ts b/admin-compliance/components/sdk/StepHeader/StepExplanationsPart1.ts new file mode 100644 index 0000000..82018aa --- /dev/null +++ b/admin-compliance/components/sdk/StepHeader/StepExplanationsPart1.ts @@ -0,0 +1,197 @@ +// ============================================================================= +// STEP EXPLANATION PRESETS — Part 1 (company-profile … einwilligungen) +// ============================================================================= + +import type { StepTip } from './StepHeader' + +type ExplanationEntry = { title: string; description: string; explanation: string; tips: StepTip[] } + +export const STEP_EXPLANATIONS_PART1: Record = { + 'company-profile': { + title: 'Unternehmensprofil', + description: 'Erfassen Sie Ihr Geschäftsmodell und Ihre Zielmärkte', + explanation: 'Im Unternehmensprofil erfassen wir grundlegende Informationen zu Ihrem Unternehmen: Geschäftsmodell (B2B/B2C), Angebote, Firmengröße und Zielmärkte. Diese Informationen helfen uns, die für Sie relevanten Regulierungen zu identifizieren und ehrlich zu kommunizieren, wo unsere Grenzen liegen.', + tips: [ + { icon: 'lightbulb' as const, title: 'Ehrliche Einschätzung', description: 'Wir zeigen Ihnen transparent, welche Regulierungen wir abdecken und wann Sie einen Anwalt hinzuziehen sollten.' }, + { icon: 'info' as const, title: 'Zielmärkte', description: 'Je nach Zielmarkt (Deutschland, DACH, EU, weltweit) gelten unterschiedliche Datenschutzgesetze.' }, + ], + }, + 'compliance-scope': { + title: 'Compliance Scope', + description: 'Umfang und Tiefe Ihrer Compliance-Dokumentation bestimmen', + explanation: 'Die Compliance Scope Engine bestimmt deterministisch, welche Dokumente Sie in welcher Tiefe benoetigen. Basierend auf 35 Fragen in 6 Bloecken werden Risiko-, Komplexitaets- und Assurance-Scores berechnet, die in ein 4-Level-Modell (L1 Lean bis L4 Zertifizierungsbereit) muenden.', + tips: [ + { icon: 'lightbulb' as const, title: 'Deterministisch', description: 'Alle Entscheidungen sind nachvollziehbar — keine KI, keine Black Box. Jede Einstufung wird mit Rechtsgrundlage und Audit-Trail begruendet.' }, + { icon: 'info' as const, title: '4-Level-Modell', description: 'L1 (Lean Startup) bis L4 (Zertifizierungsbereit). Hard Triggers (Art. 9, Minderjaehrige, Zertifizierungsziele) heben das Level automatisch an.' }, + { icon: 'warning' as const, title: 'Hard Triggers', description: '50 deterministische Regeln pruefen besondere Kategorien (Art. 9), Minderjaehrige, KI-Einsatz, Drittlandtransfers und Zertifizierungsziele.' }, + ], + }, + 'use-case-assessment': { + title: 'Anwendungsfall-Erfassung', + description: 'Erfassen Sie Ihre KI-Anwendungsfälle systematisch', + explanation: 'In der Anwendungsfall-Erfassung dokumentieren Sie Ihre KI-Anwendungsfälle in 5 Schritten: Grunddaten, Datenkategorien, Risikobewertung, Stakeholder und Compliance-Anforderungen. Dies bildet die Basis für alle weiteren Compliance-Maßnahmen.', + tips: [ + { icon: 'lightbulb' as const, title: 'Tipp: Vollständigkeit', description: 'Je detaillierter Sie den Anwendungsfall beschreiben, desto besser kann das System passende Compliance-Anforderungen ableiten.' }, + { icon: 'info' as const, title: 'Mehrere Anwendungsfälle', description: 'Sie können mehrere Anwendungsfälle erfassen. Jeder wird separat bewertet und durchläuft den Compliance-Prozess.' }, + ], + }, + 'screening': { + title: 'System Screening', + description: 'Analysieren Sie Ihre Systemlandschaft auf Schwachstellen', + explanation: 'Das System Screening generiert eine Software Bill of Materials (SBOM) und fuehrt einen Security-Scan durch. So erkennen Sie Schwachstellen in Ihren Abhaengigkeiten fruehzeitig.', + tips: [ + { icon: 'warning' as const, title: 'Kritische Schwachstellen', description: 'CVEs mit CVSS >= 7.0 sollten priorisiert behandelt werden. Diese werden automatisch in den Security Backlog uebernommen.' }, + { icon: 'info' as const, title: 'SBOM-Format', description: 'Die SBOM wird im CycloneDX-Format generiert und kann fuer Audits exportiert werden.' }, + ], + }, + 'modules': { + title: 'Compliance Module', + description: 'Waehlen Sie die relevanten Regulierungen fuer Ihr Unternehmen', + explanation: 'Compliance-Module sind vordefinierte Regelwerke (z.B. DSGVO, AI Act, ISO 27001). Durch die Aktivierung eines Moduls werden automatisch die zugehoerigen Anforderungen und Kontrollen geladen.', + tips: [ + { icon: 'lightbulb' as const, title: 'Modul-Auswahl', description: 'Aktivieren Sie nur Module, die fuer Ihr Unternehmen relevant sind. Weniger ist oft mehr - fokussieren Sie sich auf die wichtigsten Regulierungen.' }, + { icon: 'info' as const, title: 'Abhaengigkeiten', description: 'Manche Module haben Ueberschneidungen. Das System erkennt dies automatisch und vermeidet doppelte Anforderungen.' }, + ], + }, + 'requirements': { + title: 'Anforderungen', + description: 'Pruefen und verwalten Sie die Compliance-Anforderungen', + explanation: 'Anforderungen sind konkrete Vorgaben aus den aktivierten Modulen. Jede Anforderung verweist auf einen Gesetzesartikel und muss durch Kontrollen abgedeckt werden. Vollstaendige CRUD-Operationen mit Backend-Persistenz.', + tips: [ + { icon: 'warning' as const, title: 'Kritische Anforderungen', description: 'Anforderungen mit Kritikalitaet "HOCH" sollten priorisiert werden, da Verstoesse zu hohen Bussgeldern fuehren koennen.' }, + { icon: 'success' as const, title: 'Status-Workflow', description: 'Anforderungen durchlaufen: Nicht begonnen → In Bearbeitung → Implementiert → Verifiziert. Bei Backend-Fehler erfolgt automatischer Rollback.' }, + { icon: 'lightbulb' as const, title: 'CRUD-Operationen', description: 'Anforderungen koennen erstellt, bearbeitet und geloescht werden. Alle Aenderungen werden sofort im Backend persistiert.' }, + ], + }, + 'controls': { + title: 'Kontrollen', + description: 'Definieren Sie technische und organisatorische Massnahmen', + explanation: 'Kontrollen (auch TOMs genannt) sind konkrete Massnahmen zur Erfuellung der Anforderungen. Sie koennen praeventiv, detektiv oder korrektiv sein. Evidence-Linking zeigt verknuepfte Nachweise mit Gueltigkeits-Badge.', + tips: [ + { icon: 'lightbulb' as const, title: 'Wirksamkeit', description: 'Bewerten Sie die Wirksamkeit jeder Kontrolle. Eine hohe Wirksamkeit (>80%) reduziert das Restrisiko erheblich.' }, + { icon: 'info' as const, title: 'Verantwortlichkeiten', description: 'Weisen Sie jeder Kontrolle einen Verantwortlichen zu. Dies ist fuer Audits wichtig.' }, + { icon: 'success' as const, title: 'Evidence-Linking', description: 'Verknuepfen Sie Nachweise direkt mit Controls. Gueltige, abgelaufene und ausstehende Nachweise werden mit Badges angezeigt.' }, + ], + }, + 'evidence': { + title: 'Nachweise', + description: 'Dokumentieren Sie die Umsetzung mit Belegen', + explanation: 'Nachweise sind Dokumente, Screenshots oder Berichte, die belegen, dass Kontrollen implementiert sind. Server-seitige Pagination fuer grosse Nachweis-Sammlungen.', + tips: [ + { icon: 'warning' as const, title: 'Gueltigkeit', description: 'Achten Sie auf das Ablaufdatum von Nachweisen. Abgelaufene Zertifikate oder Berichte muessen erneuert werden. Status: valid, expired, pending, failed.' }, + { icon: 'success' as const, title: 'Verknuepfung', description: 'Verknuepfen Sie Nachweise direkt mit den zugehoerigen Kontrollen fuer eine lueckenlose Dokumentation.' }, + { icon: 'info' as const, title: 'Pagination', description: 'Bei vielen Nachweisen wird automatisch paginiert. Nutzen Sie die Seitennavigation am Ende der Liste.' }, + ], + }, + 'audit-checklist': { + title: 'Audit-Checkliste', + description: 'Systematische Pruefung der Compliance-Konformitaet', + explanation: 'Die Audit-Checkliste wird automatisch aus den Anforderungen generiert. Session-Management mit Sign-Off-Workflow und PDF-Export.', + tips: [ + { icon: 'lightbulb' as const, title: 'Regelmaessige Pruefung', description: 'Fuehren Sie die Checkliste mindestens jaehrlich durch, um Compliance-Luecken fruehzeitig zu erkennen.' }, + { icon: 'info' as const, title: 'Sign-Off & PDF', description: 'Zeichnen Sie Pruefpunkte mit digitalem Hash (SHA-256) ab. Exportieren Sie den Report als PDF in Deutsch oder Englisch.' }, + { icon: 'success' as const, title: 'Session-History', description: 'Vergangene Audit-Sitzungen werden mit Status-Badges angezeigt: Draft, In Progress, Completed, Archived.' }, + ], + }, + 'risks': { + title: 'Risiko-Matrix', + description: 'Bewerten und priorisieren Sie Ihre Compliance-Risiken', + explanation: 'Die 5x5 Risiko-Matrix visualisiert Ihre Risiken nach Wahrscheinlichkeit und Auswirkung. Inherent Risk vs. Residual Risk mit visuellem Vergleich.', + tips: [ + { icon: 'warning' as const, title: 'Kritische Risiken', description: 'Risiken mit Score >= 20 sind CRITICAL (rot), >= 12 HIGH (orange), >= 6 MEDIUM (gelb), < 6 LOW (gruen).' }, + { icon: 'success' as const, title: 'Mitigation', description: 'Verknuepfen Sie Controls als Mitigationsmassnahmen. Der Residual-Risk wird automatisch anhand verknuepfter Controls berechnet.' }, + { icon: 'info' as const, title: 'Status-Workflow', description: 'Risiken durchlaufen: Identifiziert → Bewertet → Mitigiert → Akzeptiert → Geschlossen.' }, + ], + }, + 'ai-act': { + title: 'AI Act Klassifizierung', + description: 'Registrieren und klassifizieren Sie Ihre KI-Systeme', + explanation: 'Der EU AI Act klassifiziert KI-Systeme in Risikostufen: Minimal, Begrenzt, Hoch und Verboten. KI-Systeme werden im Backend persistent gespeichert und koennen automatisch bewertet werden.', + tips: [ + { icon: 'warning' as const, title: 'Hochrisiko-Systeme', description: 'Hochrisiko-KI erfordert 8 Pflichten: Risikomanagement, Daten-Governance, Dokumentation, Transparenz, menschliche Aufsicht, Genauigkeit, Robustheit, Cybersicherheit.' }, + { icon: 'lightbulb' as const, title: 'Automatische Bewertung', description: 'Nutzen Sie die Assess-Funktion: Sie analysiert Zweck und Sektor und leitet die Risikokategorie + Pflichten automatisch ab.' }, + { icon: 'info' as const, title: 'CRUD-Operationen', description: 'KI-Systeme koennen registriert, bearbeitet, bewertet und geloescht werden. Alle Daten werden backend-persistent gespeichert.' }, + ], + }, + 'dsfa': { + title: 'Datenschutz-Folgenabschaetzung', + description: 'Erstellen Sie eine DSFA fuer Hochrisiko-Verarbeitungen', + explanation: 'Eine DSFA (Art. 35 DSGVO) ist erforderlich, wenn eine Verarbeitung voraussichtlich hohe Risiken fuer Betroffene birgt. Das Tool fuehrt Sie durch alle erforderlichen Abschnitte.', + tips: [ + { icon: 'warning' as const, title: 'Pflicht', description: 'Eine DSFA ist Pflicht bei: Profiling mit rechtlicher Wirkung, umfangreicher Verarbeitung besonderer Datenkategorien, systematischer Ueberwachung.' }, + { icon: 'lightbulb' as const, title: 'Konsultation', description: 'Bei hohem Restrisiko muss die Aufsichtsbehoerde konsultiert werden (Art. 36 DSGVO).' }, + ], + }, + 'tom': { + title: 'Technische und Organisatorische Massnahmen', + description: 'TOMs nach Art. 32 DSGVO mit Vendor-Controls-Querverweis', + explanation: 'TOMs sind konkrete Sicherheitsmassnahmen zum Schutz personenbezogener Daten. Das Dashboard zeigt den Status aller aus dem TOM Generator abgeleiteten Massnahmen mit SDM-Mapping und Gap-Analyse. Im Uebersicht-Tab werden zusaetzlich Vendor-TOM-Controls (VND-TOM-01 bis VND-TOM-06) aus dem Vendor-Compliance-Modul als Querverweis angezeigt.', + tips: [ + { icon: 'warning' as const, title: 'Nachweispflicht', description: 'TOMs muessen nachweisbar real sein. Verknuepfen Sie Evidence-Dokumente (Policies, Zertifikate, Screenshots) mit jeder Massnahme, um die Rechenschaftspflicht (Art. 5 Abs. 2 DSGVO) zu erfuellen.' }, + { icon: 'info' as const, title: 'Generator nutzen', description: 'Der 6-Schritt-Wizard leitet TOMs systematisch aus Ihrem Risikoprofil ab. Starten Sie dort, um eine vollstaendige Baseline zu erhalten.' }, + { icon: 'info' as const, title: 'SDM-Mapping', description: 'Kontrollen werden den 7 SDM-Gewaehrleistungszielen zugeordnet: Verfuegbarkeit, Integritaet, Vertraulichkeit, Nichtverkettung, Intervenierbarkeit, Transparenz, Datenminimierung.' }, + { icon: 'success' as const, title: 'Vendor-Controls', description: 'Im Uebersicht-Tab werden Vendor-TOM-Controls (VND-TOM-01 bis 06) als Read-Only-Querverweis angezeigt: Verschluesselung, Zugriffskontrolle, Verfuegbarkeit und Ueberpruefungsverfahren Ihrer Auftragsverarbeiter.' }, + ], + }, + 'vvt': { + title: 'Verarbeitungsverzeichnis', + description: 'Verarbeitungsverzeichnis nach Art. 30 DSGVO mit integriertem Processor-Tab', + explanation: 'Das Verarbeitungsverzeichnis (VVT) dokumentiert alle Verarbeitungstaetigkeiten mit personenbezogenen Daten. Der integrierte Generator-Fragebogen befuellt 70-90% der Pflichtfelder automatisch. Der Tab "Auftragsverarbeiter (Abs. 2)" liest Vendors mit role=PROCESSOR/SUB_PROCESSOR direkt aus der Vendor-Compliance-API — keine doppelte Datenhaltung.', + tips: [ + { icon: 'warning' as const, title: 'Pflicht fuer alle', description: 'Die Ausnahme fuer Unternehmen <250 Mitarbeiter greift nur bei gelegentlicher, risikoarmer Verarbeitung ohne besondere Kategorien (Art. 30 Abs. 5).' }, + { icon: 'info' as const, title: 'Zweck-zuerst', description: 'Definieren Sie Verarbeitungen nach Geschaeftszweck, nicht nach Tool. Ein Tool kann mehrere Verarbeitungen abdecken, eine Verarbeitung kann mehrere Tools nutzen.' }, + { icon: 'info' as const, title: 'Kein oeffentliches Dokument', description: 'Das VVT ist ein internes Dokument. Es muss der Aufsichtsbehoerde nur auf Verlangen vorgelegt werden (Art. 30 Abs. 4).' }, + { icon: 'success' as const, title: 'Processor-Tab (Art. 30 Abs. 2)', description: 'Auftragsverarbeiter werden direkt aus dem Vendor Register gelesen (Read-Only). Neue Vendors werden im Vendor-Compliance-Modul angelegt und erscheinen hier automatisch. PDF-Druck fuer Art. 30 Abs. 2 Dokument.' }, + ], + }, + 'cookie-banner': { + title: 'Cookie Banner', + description: 'Konfigurieren Sie einen DSGVO-konformen Cookie Banner mit persistenter DB-Speicherung', + explanation: 'Der Cookie Banner Generator erstellt einen rechtssicheren Banner mit Opt-In fuer nicht-essentielle Cookies. Alle Einstellungen — einschliesslich Ueberschrift, Beschreibung und Datenschutz-Link — werden in der Datenbank gespeichert und bleiben auch nach einem Neustart erhalten. Der generierte Embed-Code wird direkt aus der gespeicherten Konfiguration erzeugt.', + tips: [ + { icon: 'warning' as const, title: 'Opt-In Pflicht', description: 'Fuer Marketing- und Analytics-Cookies ist eine aktive Einwilligung erforderlich. Vorangekreuzte Checkboxen sind nicht erlaubt.' }, + { icon: 'lightbulb' as const, title: 'Design und Texte', description: 'Passen Sie Ueberschrift, Beschreibung und Farben an Ihr Corporate Design an. Aenderungen werden in der Vorschau sofort sichtbar.' }, + { icon: 'info' as const, title: 'Embed-Code', description: 'Der Code exportiert einen vollstaendigen HTML+CSS+JS-Block aus Ihrer gespeicherten Konfiguration — einfach vor dem schliessenden -Tag einbinden.' }, + ], + }, + 'obligations': { + title: 'Pflichtenuebersicht', + description: 'Regulatorische Pflichten mit 12 Compliance-Checks und Vendor-Verknuepfung', + explanation: 'Die Pflichtenuebersicht aggregiert alle Anforderungen aus DSGVO, AI Act, NIS2 und weiteren Regulierungen. 12 automatische Compliance-Checks pruefen Vollstaendigkeit, Fristen, Nachweise und Vendor-Verknuepfungen. Art.-28-Pflichten koennen mit Auftragsverarbeitern aus dem Vendor Register verknuepft werden. Das Pflichtenregister-Dokument (11 Sektionen) kann als auditfaehiges PDF gedruckt werden.', + tips: [ + { icon: 'info' as const, title: 'Filterung', description: 'Filtern Sie nach Regulierung, Prioritaet oder Status, um die relevanten Pflichten schnell zu finden.' }, + { icon: 'warning' as const, title: 'Compliance-Checks', description: '12 automatische Checks: Fehlende Verantwortliche, ueberfaellige Fristen, fehlende Nachweise, keine Rechtsreferenz, stagnierende Regulierungen, nicht gestartete High-Priority-Pflichten, fehlende Vendor-Verknuepfung (Art. 28) u.v.m.' }, + { icon: 'success' as const, title: 'Vendor-Verknuepfung', description: 'Art.-28-Pflichten (Auftragsverarbeitung) koennen direkt mit Vendors aus dem Vendor Register verknuepft werden. Check #12 (MISSING_VENDOR_LINK) warnt bei fehlender Verknuepfung.' }, + { icon: 'lightbulb' as const, title: 'Pflichtenregister-Dokument', description: 'Generieren Sie ein auditfaehiges Pflichtenregister mit 11 Sektionen: Ziel, Geltungsbereich, Methodik, Regulatorische Grundlagen, Pflichtenuebersicht, Details, Verantwortlichkeiten, Fristen, Nachweisverzeichnis, Compliance-Status und Aenderungshistorie.' }, + ], + }, + 'loeschfristen': { + title: 'Loeschfristen', + description: 'Aufbewahrungsrichtlinien mit VVT-Verknuepfung und Vendor-Zuordnung', + explanation: 'Loeschfristen legen fest, wie lange personenbezogene Daten gespeichert werden duerfen. Die 3-Stufen-Logik (Zweckende, Aufbewahrungspflicht, Legal Hold) stellt sicher, dass alle gesetzlichen Anforderungen beruecksichtigt werden. Policies koennen mit VVT-Verarbeitungstaetigkeiten und Auftragsverarbeitern aus dem Vendor Register verknuepft werden.', + tips: [ + { icon: 'warning' as const, title: '3-Stufen-Logik', description: 'Jede Loeschfrist folgt einer 3-Stufen-Logik: 1. Zweckende (Daten werden nach Zweckwegfall geloescht), 2. Aufbewahrungspflicht (gesetzliche Fristen verhindern Loeschung), 3. Legal Hold (laufende Verfahren blockieren Loeschung).' }, + { icon: 'info' as const, title: 'Deutsche Rechtsgrundlagen', description: 'Der Generator kennt die wichtigsten Aufbewahrungstreiber: AO (10 J. Steuer), HGB (10/6 J. Handel), UStG (10 J. Rechnungen), BGB (3 J. Verjaehrung), ArbZG (2 J. Zeiterfassung), AGG (6 Mon. Bewerbungen).' }, + { icon: 'info' as const, title: 'Backup-Behandlung', description: 'Auch Backups muessen ins Loeschkonzept einbezogen werden. Daten koennen nach primaerer Loeschung noch in Backup-Systemen existieren.' }, + { icon: 'success' as const, title: 'Vendor-Verknuepfung', description: 'Loeschfrist-Policies koennen mit Auftragsverarbeitern verknuepft werden. So ist dokumentiert, welche Vendors Loeschpflichten fuer bestimmte Datenkategorien haben.' }, + ], + }, + 'consent': { + title: 'Rechtliche Vorlagen', + description: 'Generieren Sie AGB, Datenschutzerklaerung und Nutzungsbedingungen', + explanation: 'Die rechtlichen Vorlagen werden basierend auf Ihren Verarbeitungstaetigkeiten und Use Cases generiert. Sie sind auf Ihre spezifische Situation zugeschnitten.', + tips: [ + { icon: 'info' as const, title: 'Anpassung', description: 'Die generierten Vorlagen koennen und sollten an Ihre spezifischen Anforderungen angepasst werden.' }, + { icon: 'warning' as const, title: 'Rechtspruefung', description: 'Lassen Sie die finalen Dokumente von einem Rechtsanwalt pruefen, bevor Sie sie veroeffentlichen.' }, + ], + }, + 'einwilligungen': { + title: 'Einwilligungen', + description: 'Verwalten Sie Consent-Tracking und Einwilligungsnachweise', + explanation: 'Hier konfigurieren Sie, wie Einwilligungen erfasst, gespeichert und nachgewiesen werden. Dies ist essentiell fuer den Nachweis der Rechtmaessigkeit.', + tips: [ + { icon: 'success' as const, title: 'Nachweis', description: 'Speichern Sie fuer jede Einwilligung: Zeitpunkt, Version des Textes, Art der Einwilligung.' }, + { icon: 'info' as const, title: 'Widerruf', description: 'Stellen Sie sicher, dass Nutzer ihre Einwilligung jederzeit widerrufen koennen.' }, + ], + }, +} diff --git a/admin-compliance/components/sdk/StepHeader/StepExplanationsPart2.ts b/admin-compliance/components/sdk/StepHeader/StepExplanationsPart2.ts new file mode 100644 index 0000000..542be72 --- /dev/null +++ b/admin-compliance/components/sdk/StepHeader/StepExplanationsPart2.ts @@ -0,0 +1,208 @@ +// ============================================================================= +// STEP EXPLANATION PRESETS — Part 2 (dsr … use-case-workshop) +// ============================================================================= + +import type { StepTip } from './StepHeader' + +type ExplanationEntry = { title: string; description: string; explanation: string; tips: StepTip[] } + +export const STEP_EXPLANATIONS_PART2: Record = { + 'dsr': { + title: 'DSR Portal', + description: 'Richten Sie ein Portal fuer Betroffenenrechte ein', + explanation: 'Das DSR (Data Subject Rights) Portal ermoeglicht Betroffenen, ihre Rechte nach DSGVO auszuueben: Auskunft, Loeschung, Berichtigung, Datenportabilitaet.', + tips: [ + { icon: 'warning' as const, title: 'Fristen', description: 'Anfragen muessen innerhalb von 30 Tagen beantwortet werden. Richten Sie Workflows ein, um dies sicherzustellen.' }, + { icon: 'lightbulb' as const, title: 'Identitaetspruefung', description: 'Implementieren Sie eine sichere Identitaetspruefung, bevor Sie Daten herausgeben.' }, + ], + }, + 'escalations': { + title: 'Eskalations-Workflows', + description: 'Definieren Sie Management-Workflows fuer Compliance-Vorfaelle', + explanation: 'Eskalations-Workflows legen fest, wie auf Compliance-Vorfaelle reagiert wird: Wer wird informiert, welche Massnahmen werden ergriffen, wie wird dokumentiert.', + tips: [ + { icon: 'info' as const, title: 'Datenpannen', description: 'Bei Datenpannen muss die Aufsichtsbehoerde innerhalb von 72 Stunden informiert werden.' }, + { icon: 'success' as const, title: 'Verantwortlichkeiten', description: 'Definieren Sie klare Verantwortlichkeiten fuer jeden Schritt im Eskalationsprozess.' }, + ], + }, + 'vendor-compliance': { + title: 'Vendor Compliance', + description: 'Auftragsverarbeiter-Management mit Cross-Modul-Integration', + explanation: 'Vendor Compliance verwaltet alle Auftragsverarbeiter (Art. 28 DSGVO) und Drittanbieter. Fuer jeden Vendor werden AVVs, Drittlandtransfers, TOMs und Subunternehmer geprueft. Das Modul ist zentral mit vier weiteren Modulen integriert: VVT-Processor-Tab liest Vendors direkt aus der API, Obligations und Loeschfristen verknuepfen Vendors ueber linked_vendor_ids, TOM zeigt Vendor-Controls als Querverweis.', + tips: [ + { icon: 'warning' as const, title: 'Art. 28 DSGVO', description: 'Jede Auftragsverarbeitung erfordert einen schriftlichen Vertrag (AVV). Pruefen Sie: Weisungsgebundenheit, TOMs, Subunternehmer-Genehmigung, Loeschpflicht und Audit-Recht.' }, + { icon: 'info' as const, title: 'Cross-Modul-Integration', description: 'Vendors erscheinen automatisch im VVT-Processor-Tab, koennen in Obligations und Loeschfristen verknuepft werden, und ihre TOM-Controls werden im TOM-Modul als Querverweis angezeigt.' }, + { icon: 'lightbulb' as const, title: 'Drittlandtransfer', description: 'Bei Datenverarbeitung ausserhalb der EU/EWR sind Standardvertragsklauseln (SCCs) oder andere Garantien nach Art. 44-49 DSGVO erforderlich.' }, + { icon: 'success' as const, title: 'Controls Library', description: '6 TOM-Domain Controls (VND-TOM-01 bis VND-TOM-06) pruefen Verschluesselung, Zugriffskontrolle, Verfuegbarkeit und Ueberpruefungsverfahren bei Ihren Auftragsverarbeitern.' }, + ], + }, + 'document-generator': { + title: 'Dokumentengenerator', + description: 'Generieren Sie rechtliche Dokumente aus lizenzkonformen Vorlagen', + explanation: 'Der Dokumentengenerator nutzt frei lizenzierte Textbausteine (CC0, MIT, CC BY 4.0) um Datenschutzerklaerungen, AGB, Cookie-Banner und andere rechtliche Dokumente zu erstellen. Die Quellen werden mit korrekter Lizenz-Compliance und Attribution gehandhabt.', + tips: [ + { icon: 'lightbulb' as const, title: 'Lizenzfreie Vorlagen', description: 'Alle verwendeten Textbausteine stammen aus lizenzierten Quellen (CC0, MIT, CC BY 4.0). Die Attribution wird automatisch hinzugefuegt.' }, + { icon: 'info' as const, title: 'Platzhalter', description: 'Fuellen Sie die Platzhalter (z.B. [FIRMENNAME], [ADRESSE]) mit Ihren Unternehmensdaten aus.' }, + { icon: 'warning' as const, title: 'Rechtspruefung', description: 'Lassen Sie generierte Dokumente vor der Veroeffentlichung von einem Rechtsanwalt pruefen.' }, + ], + }, + 'source-policy': { + title: 'Source Policy', + description: 'Verwalten Sie Ihre Datenquellen-Governance', + explanation: 'Die Source Policy definiert, welche externen Datenquellen fuer Ihre Anwendung zugelassen sind. Sie umfasst eine Whitelist, Operationsmatrix (Lookup, RAG, Training, Export), PII-Regeln und ein Audit-Trail.', + tips: [ + { icon: 'warning' as const, title: 'Lizenzierung', description: 'Pruefen Sie die Lizenzen aller Datenquellen (DL-DE-BY, CC-BY, CC0). Nicht-lizenzierte Quellen koennen rechtliche Risiken bergen.' }, + { icon: 'info' as const, title: 'PII-Regeln', description: 'Definieren Sie klare Regeln fuer den Umgang mit personenbezogenen Daten in externen Quellen.' }, + ], + }, + 'audit-report': { + title: 'Audit Report', + description: 'Erstellen und verwalten Sie Audit-Sitzungen', + explanation: 'Im Audit Report erstellen Sie formelle Audit-Sitzungen. Uebersicht mit Status-Badges, Detail-Seite pro Sitzung mit Fortschrittsbalken und interaktiven Checklist-Items.', + tips: [ + { icon: 'lightbulb' as const, title: 'Regelmaessigkeit', description: 'Fuehren Sie mindestens jaehrlich ein formelles Audit durch. Dokumentieren Sie Abweichungen und Massnahmenplaene.' }, + { icon: 'success' as const, title: 'Detail-Ansicht', description: 'Klicken Sie auf eine Sitzung fuer die Detail-Seite: Metadaten, Fortschrittsbalken, Checklist-Items mit Sign-Off und Notizen.' }, + { icon: 'info' as const, title: 'PDF-Export', description: 'Generieren Sie PDF-Reports in Deutsch oder Englisch fuer externe Pruefer und Aufsichtsbehoerden.' }, + ], + }, + 'workflow': { + title: 'Document Workflow', + description: 'Freigabe-Workflow mit Split-View-Editor und DB-persistenter Versionierung', + explanation: 'Der Document Workflow bietet einen Split-View-Editor: links die veroffentlichte Version, rechts der aktuelle Entwurf. Dokumente durchlaufen den Status Draft → Review → Approved → Published. Alle Versionen werden in der Datenbank gespeichert. Word-Dokumente koennen direkt als neue Version importiert werden.', + tips: [ + { icon: 'warning' as const, title: 'Vier-Augen-Prinzip', description: 'Rechtliche Dokumente sollten immer von mindestens einer weiteren Person geprueft werden, bevor sie veroeffentlicht werden.' }, + { icon: 'info' as const, title: 'Versionierung', description: 'Jede Aenderung wird als neue Version gespeichert. Veroeffentlichte Versionen sind unveraenderlich — Aenderungen erzeugen stets eine neue Version.' }, + { icon: 'lightbulb' as const, title: 'DOCX-Import', description: 'Bestehende Word-Dokumente koennen direkt hochgeladen und als Basis fuer neue Versionen verwendet werden.' }, + ], + }, + 'consent-management': { + title: 'Consent Verwaltung', + description: 'Verwalten Sie Consent-Dokumente, Versionen und DSGVO-Prozesse', + explanation: 'Die Consent Verwaltung umfasst das Lifecycle-Management Ihrer rechtlichen Dokumente (AGB, Datenschutz, Cookie-Richtlinien), die Verwaltung von E-Mail-Templates (16 Lifecycle-E-Mails) und die Steuerung der DSGVO-Prozesse (Art. 15-21).', + tips: [ + { icon: 'info' as const, title: 'Dokumentversionen', description: 'Jede Aenderung an einem Consent-Dokument erzeugt eine neue Version. Aktive Nutzer muessen bei Aenderungen erneut zustimmen.' }, + { icon: 'warning' as const, title: 'DSGVO-Fristen', description: 'Betroffenenrechte (Art. 15-21) haben gesetzliche Fristen. Auskunft: 30 Tage, Loeschung: unverzueglich.' }, + ], + }, + 'notfallplan': { + title: 'Notfallplan & Breach Response', + description: 'Verwalten Sie Ihr Datenpannen-Management nach Art. 33/34 DSGVO', + explanation: 'Der Notfallplan definiert Ihren Prozess bei Datenpannen gemaess Art. 33/34 DSGVO. Er umfasst die 72-Stunden-Meldepflicht an die Aufsichtsbehoerde, die Benachrichtigung betroffener Personen bei hohem Risiko, Incident-Klassifizierung, Eskalationswege und Dokumentationspflichten.', + tips: [ + { icon: 'warning' as const, title: '72-Stunden-Frist', description: 'Art. 33 DSGVO: Meldung an die Aufsichtsbehoerde innerhalb von 72 Stunden nach Bekanntwerden. Verspaetete Meldungen muessen begruendet werden.' }, + { icon: 'info' as const, title: 'Dokumentationspflicht', description: 'Art. 33 Abs. 5: Alle Datenpannen muessen dokumentiert werden — auch solche, die nicht meldepflichtig sind. Die Dokumentation muss der Aufsichtsbehoerde auf Verlangen vorgelegt werden koennen.' }, + ], + }, + 'academy': { + title: 'Compliance Academy', + description: 'E-Learning-Plattform fuer Mitarbeiterschulungen', + explanation: 'Die Compliance Academy ermoeglicht KI-generierte Schulungsvideos mit interaktiven Quizfragen und PDF-Zertifikaten. Unternehmen muessen Mitarbeiter regelmaessig in Datenschutz, IT-Sicherheit und KI-Kompetenz schulen (DSGVO Art. 39 Abs. 1 lit. b, EU AI Act Art. 4).', + tips: [ + { icon: 'info' as const, title: 'Schulungspflicht', description: 'DSGVO Art. 39 Abs. 1 lit. b verpflichtet den DSB zur Sensibilisierung und Schulung aller Mitarbeiter.' }, + { icon: 'lightbulb' as const, title: 'Zertifikate', description: 'Schulungszertifikate dienen als Audit-Nachweis. Sie dokumentieren Teilnahme, Testergebnis und Gueltigkeit.' }, + ], + }, + 'whistleblower': { + title: 'Hinweisgebersystem', + description: 'Interne Meldestelle gemaess Hinweisgeberschutzgesetz (HinSchG) — seit 17. Dezember 2023 Pflicht fuer alle Unternehmen ab 50 Beschaeftigten', + explanation: 'Das Hinweisgebersystem implementiert eine HinSchG-konforme interne Meldestelle fuer die sichere, auch anonyme Meldung von Rechtsverstoessen. Es setzt die EU-Whistleblowing-Richtlinie (2019/1937) in deutsches Recht um. Beschaeftigungsgeber mit mindestens 50 Beschaeftigten sind zur Einrichtung verpflichtet (§ 12 HinSchG). Das System unterstuetzt den gesamten Meldeprozess: Einreichung, Eingangsbestaetigung (7-Tage-Frist), Sachverhaltspruefung, Folgemaßnahmen und Rueckmeldung (3-Monate-Frist).', + tips: [ + { icon: 'warning' as const, title: 'Pflicht ab 50 Beschaeftigten', description: 'Seit 17.12.2023 gilt die Pflicht fuer ALLE Unternehmen ab 50 Beschaeftigten (§ 12 HinSchG). Verstoesse koennen mit Bussgeldern bis zu 50.000 EUR geahndet werden (§ 40 HinSchG).' }, + { icon: 'info' as const, title: 'Anonymitaet & Vertraulichkeit', description: 'Die Identitaet des Hinweisgebers ist streng vertraulich zu behandeln (§ 8 HinSchG). Anonyme Meldungen sollen bearbeitet werden. Repressalien sind verboten und loesen Schadensersatzpflicht aus (§ 36, § 37 HinSchG).' }, + { icon: 'lightbulb' as const, title: 'Gesetzliche Fristen', description: 'Eingangsbestaetigung innerhalb von 7 Tagen (§ 17 Abs. 1 S. 2). Rueckmeldung ueber ergriffene Folgemaßnahmen innerhalb von 3 Monaten nach Eingangsbestaetigung (§ 17 Abs. 2). Die Dokumentation muss 3 Jahre aufbewahrt werden (§ 11 HinSchG).' }, + { icon: 'warning' as const, title: 'Sachlicher Anwendungsbereich', description: 'Erfasst werden Verstoesse gegen EU-Recht und nationales Recht, u.a. Strafrecht, Datenschutz (DSGVO/BDSG), Arbeitsschutz, Umweltschutz, Geldwaesche, Produktsicherheit und Verbraucherschutz (§ 2 HinSchG).' }, + ], + }, + 'incidents': { + title: 'Vorfallmanagement', + description: 'Erfassung und Nachverfolgung von Compliance-Vorfaellen', + explanation: 'Das Vorfallmanagement dokumentiert Compliance-Vorfaelle, Datenpannen und Sicherheitsereignisse. Es unterstuetzt die Meldepflicht nach Art. 33/34 DSGVO und die systematische Ursachenanalyse.', + tips: [ + { icon: 'warning' as const, title: '72-Stunden-Frist', description: 'Datenpannen muessen innerhalb von 72 Stunden an die Aufsichtsbehoerde gemeldet werden (Art. 33 DSGVO).' }, + { icon: 'info' as const, title: 'Klassifizierung', description: 'Vorfaelle werden nach Schweregrad klassifiziert: Niedrig, Mittel, Hoch, Kritisch. Die Klassifizierung bestimmt die Eskalationswege.' }, + ], + }, + 'dsb-portal': { + title: 'DSB Portal', + description: 'Arbeitsbereich fuer den Datenschutzbeauftragten', + explanation: 'Das DSB Portal bietet dem Datenschutzbeauftragten einen zentralen Arbeitsbereich mit Aufgabenuebersicht, Beratungsprotokollen und Taetigkeitsberichten. Es unterstuetzt die Aufgaben nach Art. 39 DSGVO.', + tips: [ + { icon: 'info' as const, title: 'Taetigkeitsbericht', description: 'Der DSB muss regelmaessig ueber seine Taetigkeiten berichten. Das Portal generiert strukturierte Berichte.' }, + { icon: 'lightbulb' as const, title: 'Beratungsprotokolle', description: 'Dokumentieren Sie alle Beratungen, um die Rechenschaftspflicht zu erfuellen.' }, + ], + }, + 'industry-templates': { + title: 'Branchenvorlagen', + description: 'Branchenspezifische Compliance-Vorlagen und Best Practices', + explanation: 'Branchenvorlagen bieten vorkonfigurierte Compliance-Pakete fuer verschiedene Branchen (Gesundheitswesen, Finanzwesen, E-Commerce etc.). Sie enthalten typische Verarbeitungen, Risiken und Massnahmen.', + tips: [ + { icon: 'lightbulb' as const, title: 'Schnellstart', description: 'Branchenvorlagen beschleunigen die Ersteinrichtung erheblich. Sie koennen spaeter individuell angepasst werden.' }, + { icon: 'info' as const, title: 'Branchenstandards', description: 'Templates beruecksichtigen branchenspezifische Regulierungen wie PCI-DSS (Finanzen) oder Patientendatenschutz (Gesundheit).' }, + ], + }, + 'multi-tenant': { + title: 'Multi-Tenant Verwaltung', + description: 'Mandantenverwaltung fuer mehrere Unternehmen oder Standorte', + explanation: 'Die Multi-Tenant Verwaltung ermoeglicht die zentrale Steuerung mehrerer Mandanten (Tochtergesellschaften, Standorte, Kunden). Jeder Mandant hat eigene Compliance-Daten, kann aber zentral verwaltet werden.', + tips: [ + { icon: 'info' as const, title: 'Datentrennung', description: 'Mandantendaten sind strikt getrennt. Nur der uebergeordnete Administrator kann mandantenuebergreifend auswerten.' }, + { icon: 'lightbulb' as const, title: 'Template-Vererbung', description: 'Richtlinien und Vorlagen koennen zentral erstellt und an Mandanten vererbt werden.' }, + ], + }, + 'sso': { + title: 'Single Sign-On', + description: 'SSO-Integration und Authentifizierung verwalten', + explanation: 'Die SSO-Konfiguration ermoeglicht die Integration mit Ihrem Identity Provider (SAML, OIDC). Mitarbeiter koennen sich mit ihren bestehenden Unternehmens-Credentials anmelden.', + tips: [ + { icon: 'info' as const, title: 'Unterstuetzte Protokolle', description: 'SAML 2.0 und OpenID Connect (OIDC) werden unterstuetzt. Die gaengigsten IdPs (Azure AD, Okta, Google) sind vorkonfiguriert.' }, + { icon: 'warning' as const, title: 'Sicherheit', description: 'SSO reduziert das Risiko schwacher Passwoerter und ermoeglicht zentrale Zugriffskontrolle.' }, + ], + }, + 'document-crawler': { + title: 'Dokumenten-Crawler', + description: 'Automatische Erfassung und Analyse von Compliance-Dokumenten', + explanation: 'Der Dokumenten-Crawler durchsucht Ihre Systeme automatisch nach relevanten Compliance-Dokumenten (Datenschutzerklaerungen, Vertraege, Richtlinien) und analysiert deren Aktualitaet und Vollstaendigkeit.', + tips: [ + { icon: 'lightbulb' as const, title: 'Automatisierung', description: 'Der Crawler erkennt veraltete Dokumente und fehlende Pflichtangaben automatisch.' }, + { icon: 'info' as const, title: 'Quellen', description: 'Unterstuetzt Webseiten, SharePoint, Confluence und lokale Dateisysteme als Datenquellen.' }, + ], + }, + 'advisory-board': { + title: 'Compliance-Beirat', + description: 'Virtueller Compliance-Beirat mit KI-Experten', + explanation: 'Der Compliance-Beirat simuliert ein Expertengremium aus verschiedenen Fachrichtungen (Datenschutzrecht, IT-Sicherheit, KI-Ethik). Holen Sie sich Einschaetzungen zu komplexen Compliance-Fragen.', + tips: [ + { icon: 'lightbulb' as const, title: 'Zweitmeinung', description: 'Nutzen Sie den Beirat fuer eine zweite Einschaetzung bei schwierigen Compliance-Entscheidungen.' }, + { icon: 'warning' as const, title: 'Kein Rechtsersatz', description: 'Der KI-Beirat ersetzt keine professionelle Rechtsberatung. Bei kritischen Entscheidungen ziehen Sie einen Anwalt hinzu.' }, + ], + }, + 'reporting': { + title: 'Management Reporting', + description: 'Compliance-Berichte und KPIs fuer das Top Management', + explanation: 'Das Executive Reporting Dashboard bietet einen umfassenden Ueberblick ueber den Compliance-Status Ihres Unternehmens. Es aggregiert Daten aus allen Modulen (DSGVO, Lieferanten, Vorfaelle, Schulungen) zu einem Gesamt-Compliance-Score mit Risikobewertung und Fristenuebersicht.', + tips: [ + { icon: 'lightbulb' as const, title: 'Regelmaessig pruefen', description: 'Praesentieren Sie den Compliance-Bericht regelmaessig der Geschaeftsleitung (empfohlen: monatlich oder quartalsweise).' }, + { icon: 'warning' as const, title: 'Rechenschaftspflicht', description: 'Art. 5 Abs. 2 DSGVO verlangt den Nachweis der Compliance. Dieser Bericht dient als Dokumentation gegenueber Aufsichtsbehoerden.' }, + ], + }, + 'email-templates': { + title: 'E-Mail-Templates', + description: 'Verwalten Sie Vorlagen fuer alle DSGVO-relevanten Benachrichtigungen', + explanation: 'E-Mail-Templates definieren die Texte und das Layout fuer automatisierte DSGVO-Benachrichtigungen: Einwilligungsbestaetigung, Widerrufsbestaetigung, Auskunftsantwort, Loeschbestaetigung und weitere Lifecycle-E-Mails. Alle 16 Template-Typen koennen individuell angepasst und mit Variablen personalisiert werden.', + tips: [ + { icon: 'info' as const, title: '16 Lifecycle-E-Mails', description: 'Von der Registrierungsbestaetigung bis zur Kontoloeschung — alle relevanten Touchpoints sind mit Vorlagen abgedeckt.' }, + { icon: 'warning' as const, title: 'Pflichtangaben', description: 'Stellen Sie sicher, dass jede E-Mail die gesetzlich vorgeschriebenen Angaben enthaelt: Impressum, Datenschutzhinweis und Widerrufsmoeglichkeit.' }, + { icon: 'lightbulb' as const, title: 'Variablen', description: 'Nutzen Sie Platzhalter wie {{name}}, {{email}} und {{company}} fuer automatische Personalisierung.' }, + ], + }, + 'use-case-workshop': { + title: 'Use Case Workshop', + description: 'Erfassen und bewerten Sie Ihre KI-Anwendungsfaelle im Workshop-Format', + explanation: 'Im Use Case Workshop erfassen Sie Ihre KI-Anwendungsfaelle strukturiert in einem gefuehrten Prozess. Der Workshop leitet Sie durch Identifikation, Beschreibung, Datenkategorien, Risikobewertung und Stakeholder-Analyse. Die Ergebnisse fliessen direkt in die Compliance-Bewertung ein.', + tips: [ + { icon: 'lightbulb' as const, title: 'Vollstaendigkeit', description: 'Erfassen Sie alle KI-Anwendungsfaelle — auch solche, die nur intern genutzt werden oder sich noch in der Planungsphase befinden.' }, + { icon: 'info' as const, title: 'Stakeholder einbeziehen', description: 'Beziehen Sie Fachbereiche und IT in den Workshop ein, um alle Anwendungsfaelle zu identifizieren.' }, + { icon: 'warning' as const, title: 'Risikobewertung', description: 'Jeder Anwendungsfall wird nach EU AI Act Risikostufen klassifiziert. Hochrisiko-Systeme erfordern zusaetzliche Dokumentation.' }, + ], + }, +} diff --git a/admin-compliance/components/sdk/StepHeader/StepHeader.tsx b/admin-compliance/components/sdk/StepHeader/StepHeader.tsx index e28ca6e..dbef369 100644 --- a/admin-compliance/components/sdk/StepHeader/StepHeader.tsx +++ b/admin-compliance/components/sdk/StepHeader/StepHeader.tsx @@ -3,7 +3,8 @@ import React, { useState } from 'react' import Link from 'next/link' import { useRouter } from 'next/navigation' -import { useSDK, getStepById, getNextStep, getPreviousStep, SDKStep, SDK_STEPS } from '@/lib/sdk' +import { useSDK, getStepById, getNextStep, getPreviousStep, SDK_STEPS } from '@/lib/sdk' +import { STEP_EXPLANATIONS } from './StepExplanations' // ============================================================================= // TYPES @@ -299,816 +300,4 @@ export function StepHeader({ ) } -// ============================================================================= -// STEP EXPLANATION PRESETS -// ============================================================================= - -export const STEP_EXPLANATIONS = { - 'company-profile': { - title: 'Unternehmensprofil', - description: 'Erfassen Sie Ihr Geschäftsmodell und Ihre Zielmärkte', - explanation: 'Im Unternehmensprofil erfassen wir grundlegende Informationen zu Ihrem Unternehmen: Geschäftsmodell (B2B/B2C), Angebote, Firmengröße und Zielmärkte. Diese Informationen helfen uns, die für Sie relevanten Regulierungen zu identifizieren und ehrlich zu kommunizieren, wo unsere Grenzen liegen.', - tips: [ - { - icon: 'lightbulb' as const, - title: 'Ehrliche Einschätzung', - description: 'Wir zeigen Ihnen transparent, welche Regulierungen wir abdecken und wann Sie einen Anwalt hinzuziehen sollten.', - }, - { - icon: 'info' as const, - title: 'Zielmärkte', - description: 'Je nach Zielmarkt (Deutschland, DACH, EU, weltweit) gelten unterschiedliche Datenschutzgesetze.', - }, - ], - }, - 'compliance-scope': { - title: 'Compliance Scope', - description: 'Umfang und Tiefe Ihrer Compliance-Dokumentation bestimmen', - explanation: 'Die Compliance Scope Engine bestimmt deterministisch, welche Dokumente Sie in welcher Tiefe benoetigen. Basierend auf 35 Fragen in 6 Bloecken werden Risiko-, Komplexitaets- und Assurance-Scores berechnet, die in ein 4-Level-Modell (L1 Lean bis L4 Zertifizierungsbereit) muenden.', - tips: [ - { - icon: 'lightbulb' as const, - title: 'Deterministisch', - description: 'Alle Entscheidungen sind nachvollziehbar — keine KI, keine Black Box. Jede Einstufung wird mit Rechtsgrundlage und Audit-Trail begruendet.', - }, - { - icon: 'info' as const, - title: '4-Level-Modell', - description: 'L1 (Lean Startup) bis L4 (Zertifizierungsbereit). Hard Triggers (Art. 9, Minderjaehrige, Zertifizierungsziele) heben das Level automatisch an.', - }, - { - icon: 'warning' as const, - title: 'Hard Triggers', - description: '50 deterministische Regeln pruefen besondere Kategorien (Art. 9), Minderjaehrige, KI-Einsatz, Drittlandtransfers und Zertifizierungsziele.', - }, - ], - }, - 'use-case-assessment': { - title: 'Anwendungsfall-Erfassung', - description: 'Erfassen Sie Ihre KI-Anwendungsfälle systematisch', - explanation: 'In der Anwendungsfall-Erfassung dokumentieren Sie Ihre KI-Anwendungsfälle in 5 Schritten: Grunddaten, Datenkategorien, Risikobewertung, Stakeholder und Compliance-Anforderungen. Dies bildet die Basis für alle weiteren Compliance-Maßnahmen.', - tips: [ - { - icon: 'lightbulb' as const, - title: 'Tipp: Vollständigkeit', - description: 'Je detaillierter Sie den Anwendungsfall beschreiben, desto besser kann das System passende Compliance-Anforderungen ableiten.', - }, - { - icon: 'info' as const, - title: 'Mehrere Anwendungsfälle', - description: 'Sie können mehrere Anwendungsfälle erfassen. Jeder wird separat bewertet und durchläuft den Compliance-Prozess.', - }, - ], - }, - 'screening': { - title: 'System Screening', - description: 'Analysieren Sie Ihre Systemlandschaft auf Schwachstellen', - explanation: 'Das System Screening generiert eine Software Bill of Materials (SBOM) und fuehrt einen Security-Scan durch. So erkennen Sie Schwachstellen in Ihren Abhaengigkeiten fruehzeitig.', - tips: [ - { - icon: 'warning' as const, - title: 'Kritische Schwachstellen', - description: 'CVEs mit CVSS >= 7.0 sollten priorisiert behandelt werden. Diese werden automatisch in den Security Backlog uebernommen.', - }, - { - icon: 'info' as const, - title: 'SBOM-Format', - description: 'Die SBOM wird im CycloneDX-Format generiert und kann fuer Audits exportiert werden.', - }, - ], - }, - 'modules': { - title: 'Compliance Module', - description: 'Waehlen Sie die relevanten Regulierungen fuer Ihr Unternehmen', - explanation: 'Compliance-Module sind vordefinierte Regelwerke (z.B. DSGVO, AI Act, ISO 27001). Durch die Aktivierung eines Moduls werden automatisch die zugehoerigen Anforderungen und Kontrollen geladen.', - tips: [ - { - icon: 'lightbulb' as const, - title: 'Modul-Auswahl', - description: 'Aktivieren Sie nur Module, die fuer Ihr Unternehmen relevant sind. Weniger ist oft mehr - fokussieren Sie sich auf die wichtigsten Regulierungen.', - }, - { - icon: 'info' as const, - title: 'Abhaengigkeiten', - description: 'Manche Module haben Ueberschneidungen. Das System erkennt dies automatisch und vermeidet doppelte Anforderungen.', - }, - ], - }, - 'requirements': { - title: 'Anforderungen', - description: 'Pruefen und verwalten Sie die Compliance-Anforderungen', - explanation: 'Anforderungen sind konkrete Vorgaben aus den aktivierten Modulen. Jede Anforderung verweist auf einen Gesetzesartikel und muss durch Kontrollen abgedeckt werden. Vollstaendige CRUD-Operationen mit Backend-Persistenz.', - tips: [ - { - icon: 'warning' as const, - title: 'Kritische Anforderungen', - description: 'Anforderungen mit Kritikalitaet "HOCH" sollten priorisiert werden, da Verstoesse zu hohen Bussgeldern fuehren koennen.', - }, - { - icon: 'success' as const, - title: 'Status-Workflow', - description: 'Anforderungen durchlaufen: Nicht begonnen → In Bearbeitung → Implementiert → Verifiziert. Bei Backend-Fehler erfolgt automatischer Rollback.', - }, - { - icon: 'lightbulb' as const, - title: 'CRUD-Operationen', - description: 'Anforderungen koennen erstellt, bearbeitet und geloescht werden. Alle Aenderungen werden sofort im Backend persistiert.', - }, - ], - }, - 'controls': { - title: 'Kontrollen', - description: 'Definieren Sie technische und organisatorische Massnahmen', - explanation: 'Kontrollen (auch TOMs genannt) sind konkrete Massnahmen zur Erfuellung der Anforderungen. Sie koennen praeventiv, detektiv oder korrektiv sein. Evidence-Linking zeigt verknuepfte Nachweise mit Gueltigkeits-Badge.', - tips: [ - { - icon: 'lightbulb' as const, - title: 'Wirksamkeit', - description: 'Bewerten Sie die Wirksamkeit jeder Kontrolle. Eine hohe Wirksamkeit (>80%) reduziert das Restrisiko erheblich.', - }, - { - icon: 'info' as const, - title: 'Verantwortlichkeiten', - description: 'Weisen Sie jeder Kontrolle einen Verantwortlichen zu. Dies ist fuer Audits wichtig.', - }, - { - icon: 'success' as const, - title: 'Evidence-Linking', - description: 'Verknuepfen Sie Nachweise direkt mit Controls. Gueltige, abgelaufene und ausstehende Nachweise werden mit Badges angezeigt.', - }, - ], - }, - 'evidence': { - title: 'Nachweise', - description: 'Dokumentieren Sie die Umsetzung mit Belegen', - explanation: 'Nachweise sind Dokumente, Screenshots oder Berichte, die belegen, dass Kontrollen implementiert sind. Server-seitige Pagination fuer grosse Nachweis-Sammlungen.', - tips: [ - { - icon: 'warning' as const, - title: 'Gueltigkeit', - description: 'Achten Sie auf das Ablaufdatum von Nachweisen. Abgelaufene Zertifikate oder Berichte muessen erneuert werden. Status: valid, expired, pending, failed.', - }, - { - icon: 'success' as const, - title: 'Verknuepfung', - description: 'Verknuepfen Sie Nachweise direkt mit den zugehoerigen Kontrollen fuer eine lueckenlose Dokumentation.', - }, - { - icon: 'info' as const, - title: 'Pagination', - description: 'Bei vielen Nachweisen wird automatisch paginiert. Nutzen Sie die Seitennavigation am Ende der Liste.', - }, - ], - }, - 'audit-checklist': { - title: 'Audit-Checkliste', - description: 'Systematische Pruefung der Compliance-Konformitaet', - explanation: 'Die Audit-Checkliste wird automatisch aus den Anforderungen generiert. Session-Management mit Sign-Off-Workflow und PDF-Export.', - tips: [ - { - icon: 'lightbulb' as const, - title: 'Regelmaessige Pruefung', - description: 'Fuehren Sie die Checkliste mindestens jaehrlich durch, um Compliance-Luecken fruehzeitig zu erkennen.', - }, - { - icon: 'info' as const, - title: 'Sign-Off & PDF', - description: 'Zeichnen Sie Pruefpunkte mit digitalem Hash (SHA-256) ab. Exportieren Sie den Report als PDF in Deutsch oder Englisch.', - }, - { - icon: 'success' as const, - title: 'Session-History', - description: 'Vergangene Audit-Sitzungen werden mit Status-Badges angezeigt: Draft, In Progress, Completed, Archived.', - }, - ], - }, - 'risks': { - title: 'Risiko-Matrix', - description: 'Bewerten und priorisieren Sie Ihre Compliance-Risiken', - explanation: 'Die 5x5 Risiko-Matrix visualisiert Ihre Risiken nach Wahrscheinlichkeit und Auswirkung. Inherent Risk vs. Residual Risk mit visuellem Vergleich.', - tips: [ - { - icon: 'warning' as const, - title: 'Kritische Risiken', - description: 'Risiken mit Score >= 20 sind CRITICAL (rot), >= 12 HIGH (orange), >= 6 MEDIUM (gelb), < 6 LOW (gruen).', - }, - { - icon: 'success' as const, - title: 'Mitigation', - description: 'Verknuepfen Sie Controls als Mitigationsmassnahmen. Der Residual-Risk wird automatisch anhand verknuepfter Controls berechnet.', - }, - { - icon: 'info' as const, - title: 'Status-Workflow', - description: 'Risiken durchlaufen: Identifiziert → Bewertet → Mitigiert → Akzeptiert → Geschlossen.', - }, - ], - }, - 'ai-act': { - title: 'AI Act Klassifizierung', - description: 'Registrieren und klassifizieren Sie Ihre KI-Systeme', - explanation: 'Der EU AI Act klassifiziert KI-Systeme in Risikostufen: Minimal, Begrenzt, Hoch und Verboten. KI-Systeme werden im Backend persistent gespeichert und koennen automatisch bewertet werden.', - tips: [ - { - icon: 'warning' as const, - title: 'Hochrisiko-Systeme', - description: 'Hochrisiko-KI erfordert 8 Pflichten: Risikomanagement, Daten-Governance, Dokumentation, Transparenz, menschliche Aufsicht, Genauigkeit, Robustheit, Cybersicherheit.', - }, - { - icon: 'lightbulb' as const, - title: 'Automatische Bewertung', - description: 'Nutzen Sie die Assess-Funktion: Sie analysiert Zweck und Sektor und leitet die Risikokategorie + Pflichten automatisch ab.', - }, - { - icon: 'info' as const, - title: 'CRUD-Operationen', - description: 'KI-Systeme koennen registriert, bearbeitet, bewertet und geloescht werden. Alle Daten werden backend-persistent gespeichert.', - }, - ], - }, - 'dsfa': { - title: 'Datenschutz-Folgenabschaetzung', - description: 'Erstellen Sie eine DSFA fuer Hochrisiko-Verarbeitungen', - explanation: 'Eine DSFA (Art. 35 DSGVO) ist erforderlich, wenn eine Verarbeitung voraussichtlich hohe Risiken fuer Betroffene birgt. Das Tool fuehrt Sie durch alle erforderlichen Abschnitte.', - tips: [ - { - icon: 'warning' as const, - title: 'Pflicht', - description: 'Eine DSFA ist Pflicht bei: Profiling mit rechtlicher Wirkung, umfangreicher Verarbeitung besonderer Datenkategorien, systematischer Ueberwachung.', - }, - { - icon: 'lightbulb' as const, - title: 'Konsultation', - description: 'Bei hohem Restrisiko muss die Aufsichtsbehoerde konsultiert werden (Art. 36 DSGVO).', - }, - ], - }, - 'tom': { - title: 'Technische und Organisatorische Massnahmen', - description: 'TOMs nach Art. 32 DSGVO mit Vendor-Controls-Querverweis', - explanation: 'TOMs sind konkrete Sicherheitsmassnahmen zum Schutz personenbezogener Daten. Das Dashboard zeigt den Status aller aus dem TOM Generator abgeleiteten Massnahmen mit SDM-Mapping und Gap-Analyse. Im Uebersicht-Tab werden zusaetzlich Vendor-TOM-Controls (VND-TOM-01 bis VND-TOM-06) aus dem Vendor-Compliance-Modul als Querverweis angezeigt.', - tips: [ - { - icon: 'warning' as const, - title: 'Nachweispflicht', - description: 'TOMs muessen nachweisbar real sein. Verknuepfen Sie Evidence-Dokumente (Policies, Zertifikate, Screenshots) mit jeder Massnahme, um die Rechenschaftspflicht (Art. 5 Abs. 2 DSGVO) zu erfuellen.', - }, - { - icon: 'info' as const, - title: 'Generator nutzen', - description: 'Der 6-Schritt-Wizard leitet TOMs systematisch aus Ihrem Risikoprofil ab. Starten Sie dort, um eine vollstaendige Baseline zu erhalten.', - }, - { - icon: 'info' as const, - title: 'SDM-Mapping', - description: 'Kontrollen werden den 7 SDM-Gewaehrleistungszielen zugeordnet: Verfuegbarkeit, Integritaet, Vertraulichkeit, Nichtverkettung, Intervenierbarkeit, Transparenz, Datenminimierung.', - }, - { - icon: 'success' as const, - title: 'Vendor-Controls', - description: 'Im Uebersicht-Tab werden Vendor-TOM-Controls (VND-TOM-01 bis 06) als Read-Only-Querverweis angezeigt: Verschluesselung, Zugriffskontrolle, Verfuegbarkeit und Ueberpruefungsverfahren Ihrer Auftragsverarbeiter.', - }, - ], - }, - 'vvt': { - title: 'Verarbeitungsverzeichnis', - description: 'Verarbeitungsverzeichnis nach Art. 30 DSGVO mit integriertem Processor-Tab', - explanation: 'Das Verarbeitungsverzeichnis (VVT) dokumentiert alle Verarbeitungstaetigkeiten mit personenbezogenen Daten. Der integrierte Generator-Fragebogen befuellt 70-90% der Pflichtfelder automatisch. Der Tab "Auftragsverarbeiter (Abs. 2)" liest Vendors mit role=PROCESSOR/SUB_PROCESSOR direkt aus der Vendor-Compliance-API — keine doppelte Datenhaltung.', - tips: [ - { - icon: 'warning' as const, - title: 'Pflicht fuer alle', - description: 'Die Ausnahme fuer Unternehmen <250 Mitarbeiter greift nur bei gelegentlicher, risikoarmer Verarbeitung ohne besondere Kategorien (Art. 30 Abs. 5).', - }, - { - icon: 'info' as const, - title: 'Zweck-zuerst', - description: 'Definieren Sie Verarbeitungen nach Geschaeftszweck, nicht nach Tool. Ein Tool kann mehrere Verarbeitungen abdecken, eine Verarbeitung kann mehrere Tools nutzen.', - }, - { - icon: 'info' as const, - title: 'Kein oeffentliches Dokument', - description: 'Das VVT ist ein internes Dokument. Es muss der Aufsichtsbehoerde nur auf Verlangen vorgelegt werden (Art. 30 Abs. 4).', - }, - { - icon: 'success' as const, - title: 'Processor-Tab (Art. 30 Abs. 2)', - description: 'Auftragsverarbeiter werden direkt aus dem Vendor Register gelesen (Read-Only). Neue Vendors werden im Vendor-Compliance-Modul angelegt und erscheinen hier automatisch. PDF-Druck fuer Art. 30 Abs. 2 Dokument.', - }, - ], - }, - 'cookie-banner': { - title: 'Cookie Banner', - description: 'Konfigurieren Sie einen DSGVO-konformen Cookie Banner mit persistenter DB-Speicherung', - explanation: 'Der Cookie Banner Generator erstellt einen rechtssicheren Banner mit Opt-In fuer nicht-essentielle Cookies. Alle Einstellungen — einschliesslich Ueberschrift, Beschreibung und Datenschutz-Link — werden in der Datenbank gespeichert und bleiben auch nach einem Neustart erhalten. Der generierte Embed-Code wird direkt aus der gespeicherten Konfiguration erzeugt.', - tips: [ - { - icon: 'warning' as const, - title: 'Opt-In Pflicht', - description: 'Fuer Marketing- und Analytics-Cookies ist eine aktive Einwilligung erforderlich. Vorangekreuzte Checkboxen sind nicht erlaubt.', - }, - { - icon: 'lightbulb' as const, - title: 'Design und Texte', - description: 'Passen Sie Ueberschrift, Beschreibung und Farben an Ihr Corporate Design an. Aenderungen werden in der Vorschau sofort sichtbar.', - }, - { - icon: 'info' as const, - title: 'Embed-Code', - description: 'Der Code exportiert einen vollstaendigen HTML+CSS+JS-Block aus Ihrer gespeicherten Konfiguration — einfach vor dem schliessenden -Tag einbinden.', - }, - ], - }, - 'obligations': { - title: 'Pflichtenuebersicht', - description: 'Regulatorische Pflichten mit 12 Compliance-Checks und Vendor-Verknuepfung', - explanation: 'Die Pflichtenuebersicht aggregiert alle Anforderungen aus DSGVO, AI Act, NIS2 und weiteren Regulierungen. 12 automatische Compliance-Checks pruefen Vollstaendigkeit, Fristen, Nachweise und Vendor-Verknuepfungen. Art.-28-Pflichten koennen mit Auftragsverarbeitern aus dem Vendor Register verknuepft werden. Das Pflichtenregister-Dokument (11 Sektionen) kann als auditfaehiges PDF gedruckt werden.', - tips: [ - { - icon: 'info' as const, - title: 'Filterung', - description: 'Filtern Sie nach Regulierung, Prioritaet oder Status, um die relevanten Pflichten schnell zu finden.', - }, - { - icon: 'warning' as const, - title: 'Compliance-Checks', - description: '12 automatische Checks: Fehlende Verantwortliche, ueberfaellige Fristen, fehlende Nachweise, keine Rechtsreferenz, stagnierende Regulierungen, nicht gestartete High-Priority-Pflichten, fehlende Vendor-Verknuepfung (Art. 28) u.v.m.', - }, - { - icon: 'success' as const, - title: 'Vendor-Verknuepfung', - description: 'Art.-28-Pflichten (Auftragsverarbeitung) koennen direkt mit Vendors aus dem Vendor Register verknuepft werden. Check #12 (MISSING_VENDOR_LINK) warnt bei fehlender Verknuepfung.', - }, - { - icon: 'lightbulb' as const, - title: 'Pflichtenregister-Dokument', - description: 'Generieren Sie ein auditfaehiges Pflichtenregister mit 11 Sektionen: Ziel, Geltungsbereich, Methodik, Regulatorische Grundlagen, Pflichtenuebersicht, Details, Verantwortlichkeiten, Fristen, Nachweisverzeichnis, Compliance-Status und Aenderungshistorie.', - }, - ], - }, - 'loeschfristen': { - title: 'Loeschfristen', - description: 'Aufbewahrungsrichtlinien mit VVT-Verknuepfung und Vendor-Zuordnung', - explanation: 'Loeschfristen legen fest, wie lange personenbezogene Daten gespeichert werden duerfen. Die 3-Stufen-Logik (Zweckende, Aufbewahrungspflicht, Legal Hold) stellt sicher, dass alle gesetzlichen Anforderungen beruecksichtigt werden. Policies koennen mit VVT-Verarbeitungstaetigkeiten und Auftragsverarbeitern aus dem Vendor Register verknuepft werden.', - tips: [ - { - icon: 'warning' as const, - title: '3-Stufen-Logik', - description: 'Jede Loeschfrist folgt einer 3-Stufen-Logik: 1. Zweckende (Daten werden nach Zweckwegfall geloescht), 2. Aufbewahrungspflicht (gesetzliche Fristen verhindern Loeschung), 3. Legal Hold (laufende Verfahren blockieren Loeschung).', - }, - { - icon: 'info' as const, - title: 'Deutsche Rechtsgrundlagen', - description: 'Der Generator kennt die wichtigsten Aufbewahrungstreiber: AO (10 J. Steuer), HGB (10/6 J. Handel), UStG (10 J. Rechnungen), BGB (3 J. Verjaehrung), ArbZG (2 J. Zeiterfassung), AGG (6 Mon. Bewerbungen).', - }, - { - icon: 'info' as const, - title: 'Backup-Behandlung', - description: 'Auch Backups muessen ins Loeschkonzept einbezogen werden. Daten koennen nach primaerer Loeschung noch in Backup-Systemen existieren.', - }, - { - icon: 'success' as const, - title: 'Vendor-Verknuepfung', - description: 'Loeschfrist-Policies koennen mit Auftragsverarbeitern verknuepft werden. So ist dokumentiert, welche Vendors Loeschpflichten fuer bestimmte Datenkategorien haben.', - }, - ], - }, - 'consent': { - title: 'Rechtliche Vorlagen', - description: 'Generieren Sie AGB, Datenschutzerklaerung und Nutzungsbedingungen', - explanation: 'Die rechtlichen Vorlagen werden basierend auf Ihren Verarbeitungstaetigkeiten und Use Cases generiert. Sie sind auf Ihre spezifische Situation zugeschnitten.', - tips: [ - { - icon: 'info' as const, - title: 'Anpassung', - description: 'Die generierten Vorlagen koennen und sollten an Ihre spezifischen Anforderungen angepasst werden.', - }, - { - icon: 'warning' as const, - title: 'Rechtspruefung', - description: 'Lassen Sie die finalen Dokumente von einem Rechtsanwalt pruefen, bevor Sie sie veroeffentlichen.', - }, - ], - }, - 'einwilligungen': { - title: 'Einwilligungen', - description: 'Verwalten Sie Consent-Tracking und Einwilligungsnachweise', - explanation: 'Hier konfigurieren Sie, wie Einwilligungen erfasst, gespeichert und nachgewiesen werden. Dies ist essentiell fuer den Nachweis der Rechtmaessigkeit.', - tips: [ - { - icon: 'success' as const, - title: 'Nachweis', - description: 'Speichern Sie fuer jede Einwilligung: Zeitpunkt, Version des Textes, Art der Einwilligung.', - }, - { - icon: 'info' as const, - title: 'Widerruf', - description: 'Stellen Sie sicher, dass Nutzer ihre Einwilligung jederzeit widerrufen koennen.', - }, - ], - }, - 'dsr': { - title: 'DSR Portal', - description: 'Richten Sie ein Portal fuer Betroffenenrechte ein', - explanation: 'Das DSR (Data Subject Rights) Portal ermoeglicht Betroffenen, ihre Rechte nach DSGVO auszuueben: Auskunft, Loeschung, Berichtigung, Datenportabilitaet.', - tips: [ - { - icon: 'warning' as const, - title: 'Fristen', - description: 'Anfragen muessen innerhalb von 30 Tagen beantwortet werden. Richten Sie Workflows ein, um dies sicherzustellen.', - }, - { - icon: 'lightbulb' as const, - title: 'Identitaetspruefung', - description: 'Implementieren Sie eine sichere Identitaetspruefung, bevor Sie Daten herausgeben.', - }, - ], - }, - 'escalations': { - title: 'Eskalations-Workflows', - description: 'Definieren Sie Management-Workflows fuer Compliance-Vorfaelle', - explanation: 'Eskalations-Workflows legen fest, wie auf Compliance-Vorfaelle reagiert wird: Wer wird informiert, welche Massnahmen werden ergriffen, wie wird dokumentiert.', - tips: [ - { - icon: 'info' as const, - title: 'Datenpannen', - description: 'Bei Datenpannen muss die Aufsichtsbehoerde innerhalb von 72 Stunden informiert werden.', - }, - { - icon: 'success' as const, - title: 'Verantwortlichkeiten', - description: 'Definieren Sie klare Verantwortlichkeiten fuer jeden Schritt im Eskalationsprozess.', - }, - ], - }, - 'vendor-compliance': { - title: 'Vendor Compliance', - description: 'Auftragsverarbeiter-Management mit Cross-Modul-Integration', - explanation: 'Vendor Compliance verwaltet alle Auftragsverarbeiter (Art. 28 DSGVO) und Drittanbieter. Fuer jeden Vendor werden AVVs, Drittlandtransfers, TOMs und Subunternehmer geprueft. Das Modul ist zentral mit vier weiteren Modulen integriert: VVT-Processor-Tab liest Vendors direkt aus der API, Obligations und Loeschfristen verknuepfen Vendors ueber linked_vendor_ids, TOM zeigt Vendor-Controls als Querverweis.', - tips: [ - { - icon: 'warning' as const, - title: 'Art. 28 DSGVO', - description: 'Jede Auftragsverarbeitung erfordert einen schriftlichen Vertrag (AVV). Pruefen Sie: Weisungsgebundenheit, TOMs, Subunternehmer-Genehmigung, Loeschpflicht und Audit-Recht.', - }, - { - icon: 'info' as const, - title: 'Cross-Modul-Integration', - description: 'Vendors erscheinen automatisch im VVT-Processor-Tab, koennen in Obligations und Loeschfristen verknuepft werden, und ihre TOM-Controls werden im TOM-Modul als Querverweis angezeigt.', - }, - { - icon: 'lightbulb' as const, - title: 'Drittlandtransfer', - description: 'Bei Datenverarbeitung ausserhalb der EU/EWR sind Standardvertragsklauseln (SCCs) oder andere Garantien nach Art. 44-49 DSGVO erforderlich.', - }, - { - icon: 'success' as const, - title: 'Controls Library', - description: '6 TOM-Domain Controls (VND-TOM-01 bis VND-TOM-06) pruefen Verschluesselung, Zugriffskontrolle, Verfuegbarkeit und Ueberpruefungsverfahren bei Ihren Auftragsverarbeitern.', - }, - ], - }, - 'document-generator': { - title: 'Dokumentengenerator', - description: 'Generieren Sie rechtliche Dokumente aus lizenzkonformen Vorlagen', - explanation: 'Der Dokumentengenerator nutzt frei lizenzierte Textbausteine (CC0, MIT, CC BY 4.0) um Datenschutzerklaerungen, AGB, Cookie-Banner und andere rechtliche Dokumente zu erstellen. Die Quellen werden mit korrekter Lizenz-Compliance und Attribution gehandhabt.', - tips: [ - { - icon: 'lightbulb' as const, - title: 'Lizenzfreie Vorlagen', - description: 'Alle verwendeten Textbausteine stammen aus lizenzierten Quellen (CC0, MIT, CC BY 4.0). Die Attribution wird automatisch hinzugefuegt.', - }, - { - icon: 'info' as const, - title: 'Platzhalter', - description: 'Fuellen Sie die Platzhalter (z.B. [FIRMENNAME], [ADRESSE]) mit Ihren Unternehmensdaten aus.', - }, - { - icon: 'warning' as const, - title: 'Rechtspruefung', - description: 'Lassen Sie generierte Dokumente vor der Veroeffentlichung von einem Rechtsanwalt pruefen.', - }, - ], - }, - 'source-policy': { - title: 'Source Policy', - description: 'Verwalten Sie Ihre Datenquellen-Governance', - explanation: 'Die Source Policy definiert, welche externen Datenquellen fuer Ihre Anwendung zugelassen sind. Sie umfasst eine Whitelist, Operationsmatrix (Lookup, RAG, Training, Export), PII-Regeln und ein Audit-Trail.', - tips: [ - { - icon: 'warning' as const, - title: 'Lizenzierung', - description: 'Pruefen Sie die Lizenzen aller Datenquellen (DL-DE-BY, CC-BY, CC0). Nicht-lizenzierte Quellen koennen rechtliche Risiken bergen.', - }, - { - icon: 'info' as const, - title: 'PII-Regeln', - description: 'Definieren Sie klare Regeln fuer den Umgang mit personenbezogenen Daten in externen Quellen.', - }, - ], - }, - 'audit-report': { - title: 'Audit Report', - description: 'Erstellen und verwalten Sie Audit-Sitzungen', - explanation: 'Im Audit Report erstellen Sie formelle Audit-Sitzungen. Uebersicht mit Status-Badges, Detail-Seite pro Sitzung mit Fortschrittsbalken und interaktiven Checklist-Items.', - tips: [ - { - icon: 'lightbulb' as const, - title: 'Regelmaessigkeit', - description: 'Fuehren Sie mindestens jaehrlich ein formelles Audit durch. Dokumentieren Sie Abweichungen und Massnahmenplaene.', - }, - { - icon: 'success' as const, - title: 'Detail-Ansicht', - description: 'Klicken Sie auf eine Sitzung fuer die Detail-Seite: Metadaten, Fortschrittsbalken, Checklist-Items mit Sign-Off und Notizen.', - }, - { - icon: 'info' as const, - title: 'PDF-Export', - description: 'Generieren Sie PDF-Reports in Deutsch oder Englisch fuer externe Pruefer und Aufsichtsbehoerden.', - }, - ], - }, - 'workflow': { - title: 'Document Workflow', - description: 'Freigabe-Workflow mit Split-View-Editor und DB-persistenter Versionierung', - explanation: 'Der Document Workflow bietet einen Split-View-Editor: links die veroffentlichte Version, rechts der aktuelle Entwurf. Dokumente durchlaufen den Status Draft → Review → Approved → Published. Alle Versionen werden in der Datenbank gespeichert. Word-Dokumente koennen direkt als neue Version importiert werden.', - tips: [ - { - icon: 'warning' as const, - title: 'Vier-Augen-Prinzip', - description: 'Rechtliche Dokumente sollten immer von mindestens einer weiteren Person geprueft werden, bevor sie veroeffentlicht werden.', - }, - { - icon: 'info' as const, - title: 'Versionierung', - description: 'Jede Aenderung wird als neue Version gespeichert. Veroeffentlichte Versionen sind unveraenderlich — Aenderungen erzeugen stets eine neue Version.', - }, - { - icon: 'lightbulb' as const, - title: 'DOCX-Import', - description: 'Bestehende Word-Dokumente koennen direkt hochgeladen und als Basis fuer neue Versionen verwendet werden.', - }, - ], - }, - 'consent-management': { - title: 'Consent Verwaltung', - description: 'Verwalten Sie Consent-Dokumente, Versionen und DSGVO-Prozesse', - explanation: 'Die Consent Verwaltung umfasst das Lifecycle-Management Ihrer rechtlichen Dokumente (AGB, Datenschutz, Cookie-Richtlinien), die Verwaltung von E-Mail-Templates (16 Lifecycle-E-Mails) und die Steuerung der DSGVO-Prozesse (Art. 15-21).', - tips: [ - { - icon: 'info' as const, - title: 'Dokumentversionen', - description: 'Jede Aenderung an einem Consent-Dokument erzeugt eine neue Version. Aktive Nutzer muessen bei Aenderungen erneut zustimmen.', - }, - { - icon: 'warning' as const, - title: 'DSGVO-Fristen', - description: 'Betroffenenrechte (Art. 15-21) haben gesetzliche Fristen. Auskunft: 30 Tage, Loeschung: unverzueglich.', - }, - ], - }, - 'notfallplan': { - title: 'Notfallplan & Breach Response', - description: 'Verwalten Sie Ihr Datenpannen-Management nach Art. 33/34 DSGVO', - explanation: 'Der Notfallplan definiert Ihren Prozess bei Datenpannen gemaess Art. 33/34 DSGVO. Er umfasst die 72-Stunden-Meldepflicht an die Aufsichtsbehoerde, die Benachrichtigung betroffener Personen bei hohem Risiko, Incident-Klassifizierung, Eskalationswege und Dokumentationspflichten.', - tips: [ - { - icon: 'warning' as const, - title: '72-Stunden-Frist', - description: 'Art. 33 DSGVO: Meldung an die Aufsichtsbehoerde innerhalb von 72 Stunden nach Bekanntwerden. Verspaetete Meldungen muessen begruendet werden.', - }, - { - icon: 'info' as const, - title: 'Dokumentationspflicht', - description: 'Art. 33 Abs. 5: Alle Datenpannen muessen dokumentiert werden — auch solche, die nicht meldepflichtig sind. Die Dokumentation muss der Aufsichtsbehoerde auf Verlangen vorgelegt werden koennen.', - }, - ], - }, - 'academy': { - title: 'Compliance Academy', - description: 'E-Learning-Plattform fuer Mitarbeiterschulungen', - explanation: 'Die Compliance Academy ermoeglicht KI-generierte Schulungsvideos mit interaktiven Quizfragen und PDF-Zertifikaten. Unternehmen muessen Mitarbeiter regelmaessig in Datenschutz, IT-Sicherheit und KI-Kompetenz schulen (DSGVO Art. 39 Abs. 1 lit. b, EU AI Act Art. 4).', - tips: [ - { - icon: 'info' as const, - title: 'Schulungspflicht', - description: 'DSGVO Art. 39 Abs. 1 lit. b verpflichtet den DSB zur Sensibilisierung und Schulung aller Mitarbeiter.', - }, - { - icon: 'lightbulb' as const, - title: 'Zertifikate', - description: 'Schulungszertifikate dienen als Audit-Nachweis. Sie dokumentieren Teilnahme, Testergebnis und Gueltigkeit.', - }, - ], - }, - 'whistleblower': { - title: 'Hinweisgebersystem', - description: 'Interne Meldestelle gemaess Hinweisgeberschutzgesetz (HinSchG) — seit 17. Dezember 2023 Pflicht fuer alle Unternehmen ab 50 Beschaeftigten', - explanation: 'Das Hinweisgebersystem implementiert eine HinSchG-konforme interne Meldestelle fuer die sichere, auch anonyme Meldung von Rechtsverstoessen. Es setzt die EU-Whistleblowing-Richtlinie (2019/1937) in deutsches Recht um. Beschaeftigungsgeber mit mindestens 50 Beschaeftigten sind zur Einrichtung verpflichtet (§ 12 HinSchG). Das System unterstuetzt den gesamten Meldeprozess: Einreichung, Eingangsbestaetigung (7-Tage-Frist), Sachverhaltspruefung, Folgemaßnahmen und Rueckmeldung (3-Monate-Frist).', - tips: [ - { - icon: 'warning' as const, - title: 'Pflicht ab 50 Beschaeftigten', - description: 'Seit 17.12.2023 gilt die Pflicht fuer ALLE Unternehmen ab 50 Beschaeftigten (§ 12 HinSchG). Verstoesse koennen mit Bussgeldern bis zu 50.000 EUR geahndet werden (§ 40 HinSchG).', - }, - { - icon: 'info' as const, - title: 'Anonymitaet & Vertraulichkeit', - description: 'Die Identitaet des Hinweisgebers ist streng vertraulich zu behandeln (§ 8 HinSchG). Anonyme Meldungen sollen bearbeitet werden. Repressalien sind verboten und loesen Schadensersatzpflicht aus (§ 36, § 37 HinSchG).', - }, - { - icon: 'lightbulb' as const, - title: 'Gesetzliche Fristen', - description: 'Eingangsbestaetigung innerhalb von 7 Tagen (§ 17 Abs. 1 S. 2). Rueckmeldung ueber ergriffene Folgemaßnahmen innerhalb von 3 Monaten nach Eingangsbestaetigung (§ 17 Abs. 2). Die Dokumentation muss 3 Jahre aufbewahrt werden (§ 11 HinSchG).', - }, - { - icon: 'warning' as const, - title: 'Sachlicher Anwendungsbereich', - description: 'Erfasst werden Verstoesse gegen EU-Recht und nationales Recht, u.a. Strafrecht, Datenschutz (DSGVO/BDSG), Arbeitsschutz, Umweltschutz, Geldwaesche, Produktsicherheit und Verbraucherschutz (§ 2 HinSchG).', - }, - ], - }, - 'incidents': { - title: 'Vorfallmanagement', - description: 'Erfassung und Nachverfolgung von Compliance-Vorfaellen', - explanation: 'Das Vorfallmanagement dokumentiert Compliance-Vorfaelle, Datenpannen und Sicherheitsereignisse. Es unterstuetzt die Meldepflicht nach Art. 33/34 DSGVO und die systematische Ursachenanalyse.', - tips: [ - { - icon: 'warning' as const, - title: '72-Stunden-Frist', - description: 'Datenpannen muessen innerhalb von 72 Stunden an die Aufsichtsbehoerde gemeldet werden (Art. 33 DSGVO).', - }, - { - icon: 'info' as const, - title: 'Klassifizierung', - description: 'Vorfaelle werden nach Schweregrad klassifiziert: Niedrig, Mittel, Hoch, Kritisch. Die Klassifizierung bestimmt die Eskalationswege.', - }, - ], - }, - 'dsb-portal': { - title: 'DSB Portal', - description: 'Arbeitsbereich fuer den Datenschutzbeauftragten', - explanation: 'Das DSB Portal bietet dem Datenschutzbeauftragten einen zentralen Arbeitsbereich mit Aufgabenuebersicht, Beratungsprotokollen und Taetigkeitsberichten. Es unterstuetzt die Aufgaben nach Art. 39 DSGVO.', - tips: [ - { - icon: 'info' as const, - title: 'Taetigkeitsbericht', - description: 'Der DSB muss regelmaessig ueber seine Taetigkeiten berichten. Das Portal generiert strukturierte Berichte.', - }, - { - icon: 'lightbulb' as const, - title: 'Beratungsprotokolle', - description: 'Dokumentieren Sie alle Beratungen, um die Rechenschaftspflicht zu erfuellen.', - }, - ], - }, - 'industry-templates': { - title: 'Branchenvorlagen', - description: 'Branchenspezifische Compliance-Vorlagen und Best Practices', - explanation: 'Branchenvorlagen bieten vorkonfigurierte Compliance-Pakete fuer verschiedene Branchen (Gesundheitswesen, Finanzwesen, E-Commerce etc.). Sie enthalten typische Verarbeitungen, Risiken und Massnahmen.', - tips: [ - { - icon: 'lightbulb' as const, - title: 'Schnellstart', - description: 'Branchenvorlagen beschleunigen die Ersteinrichtung erheblich. Sie koennen spaeter individuell angepasst werden.', - }, - { - icon: 'info' as const, - title: 'Branchenstandards', - description: 'Templates beruecksichtigen branchenspezifische Regulierungen wie PCI-DSS (Finanzen) oder Patientendatenschutz (Gesundheit).', - }, - ], - }, - 'multi-tenant': { - title: 'Multi-Tenant Verwaltung', - description: 'Mandantenverwaltung fuer mehrere Unternehmen oder Standorte', - explanation: 'Die Multi-Tenant Verwaltung ermoeglicht die zentrale Steuerung mehrerer Mandanten (Tochtergesellschaften, Standorte, Kunden). Jeder Mandant hat eigene Compliance-Daten, kann aber zentral verwaltet werden.', - tips: [ - { - icon: 'info' as const, - title: 'Datentrennung', - description: 'Mandantendaten sind strikt getrennt. Nur der uebergeordnete Administrator kann mandantenuebergreifend auswerten.', - }, - { - icon: 'lightbulb' as const, - title: 'Template-Vererbung', - description: 'Richtlinien und Vorlagen koennen zentral erstellt und an Mandanten vererbt werden.', - }, - ], - }, - 'sso': { - title: 'Single Sign-On', - description: 'SSO-Integration und Authentifizierung verwalten', - explanation: 'Die SSO-Konfiguration ermoeglicht die Integration mit Ihrem Identity Provider (SAML, OIDC). Mitarbeiter koennen sich mit ihren bestehenden Unternehmens-Credentials anmelden.', - tips: [ - { - icon: 'info' as const, - title: 'Unterstuetzte Protokolle', - description: 'SAML 2.0 und OpenID Connect (OIDC) werden unterstuetzt. Die gaengigsten IdPs (Azure AD, Okta, Google) sind vorkonfiguriert.', - }, - { - icon: 'warning' as const, - title: 'Sicherheit', - description: 'SSO reduziert das Risiko schwacher Passwoerter und ermoeglicht zentrale Zugriffskontrolle.', - }, - ], - }, - 'document-crawler': { - title: 'Dokumenten-Crawler', - description: 'Automatische Erfassung und Analyse von Compliance-Dokumenten', - explanation: 'Der Dokumenten-Crawler durchsucht Ihre Systeme automatisch nach relevanten Compliance-Dokumenten (Datenschutzerklaerungen, Vertraege, Richtlinien) und analysiert deren Aktualitaet und Vollstaendigkeit.', - tips: [ - { - icon: 'lightbulb' as const, - title: 'Automatisierung', - description: 'Der Crawler erkennt veraltete Dokumente und fehlende Pflichtangaben automatisch.', - }, - { - icon: 'info' as const, - title: 'Quellen', - description: 'Unterstuetzt Webseiten, SharePoint, Confluence und lokale Dateisysteme als Datenquellen.', - }, - ], - }, - 'advisory-board': { - title: 'Compliance-Beirat', - description: 'Virtueller Compliance-Beirat mit KI-Experten', - explanation: 'Der Compliance-Beirat simuliert ein Expertengremium aus verschiedenen Fachrichtungen (Datenschutzrecht, IT-Sicherheit, KI-Ethik). Holen Sie sich Einschaetzungen zu komplexen Compliance-Fragen.', - tips: [ - { - icon: 'lightbulb' as const, - title: 'Zweitmeinung', - description: 'Nutzen Sie den Beirat fuer eine zweite Einschaetzung bei schwierigen Compliance-Entscheidungen.', - }, - { - icon: 'warning' as const, - title: 'Kein Rechtsersatz', - description: 'Der KI-Beirat ersetzt keine professionelle Rechtsberatung. Bei kritischen Entscheidungen ziehen Sie einen Anwalt hinzu.', - }, - ], - }, - 'reporting': { - title: 'Management Reporting', - description: 'Compliance-Berichte und KPIs fuer das Top Management', - explanation: 'Das Executive Reporting Dashboard bietet einen umfassenden Ueberblick ueber den Compliance-Status Ihres Unternehmens. Es aggregiert Daten aus allen Modulen (DSGVO, Lieferanten, Vorfaelle, Schulungen) zu einem Gesamt-Compliance-Score mit Risikobewertung und Fristenuebersicht.', - tips: [ - { - icon: 'lightbulb' as const, - title: 'Regelmaessig pruefen', - description: 'Praesentieren Sie den Compliance-Bericht regelmaessig der Geschaeftsleitung (empfohlen: monatlich oder quartalsweise).', - }, - { - icon: 'warning' as const, - title: 'Rechenschaftspflicht', - description: 'Art. 5 Abs. 2 DSGVO verlangt den Nachweis der Compliance. Dieser Bericht dient als Dokumentation gegenueber Aufsichtsbehoerden.', - }, - ], - }, - 'email-templates': { - title: 'E-Mail-Templates', - description: 'Verwalten Sie Vorlagen fuer alle DSGVO-relevanten Benachrichtigungen', - explanation: 'E-Mail-Templates definieren die Texte und das Layout fuer automatisierte DSGVO-Benachrichtigungen: Einwilligungsbestaetigung, Widerrufsbestaetigung, Auskunftsantwort, Loeschbestaetigung und weitere Lifecycle-E-Mails. Alle 16 Template-Typen koennen individuell angepasst und mit Variablen personalisiert werden.', - tips: [ - { - icon: 'info' as const, - title: '16 Lifecycle-E-Mails', - description: 'Von der Registrierungsbestaetigung bis zur Kontoloeschung — alle relevanten Touchpoints sind mit Vorlagen abgedeckt.', - }, - { - icon: 'warning' as const, - title: 'Pflichtangaben', - description: 'Stellen Sie sicher, dass jede E-Mail die gesetzlich vorgeschriebenen Angaben enthaelt: Impressum, Datenschutzhinweis und Widerrufsmoeglichkeit.', - }, - { - icon: 'lightbulb' as const, - title: 'Variablen', - description: 'Nutzen Sie Platzhalter wie {{name}}, {{email}} und {{company}} fuer automatische Personalisierung.', - }, - ], - }, - 'use-case-workshop': { - title: 'Use Case Workshop', - description: 'Erfassen und bewerten Sie Ihre KI-Anwendungsfaelle im Workshop-Format', - explanation: 'Im Use Case Workshop erfassen Sie Ihre KI-Anwendungsfaelle strukturiert in einem gefuehrten Prozess. Der Workshop leitet Sie durch Identifikation, Beschreibung, Datenkategorien, Risikobewertung und Stakeholder-Analyse. Die Ergebnisse fliessen direkt in die Compliance-Bewertung ein.', - tips: [ - { - icon: 'lightbulb' as const, - title: 'Vollstaendigkeit', - description: 'Erfassen Sie alle KI-Anwendungsfaelle — auch solche, die nur intern genutzt werden oder sich noch in der Planungsphase befinden.', - }, - { - icon: 'info' as const, - title: 'Stakeholder einbeziehen', - description: 'Beziehen Sie Fachbereiche und IT in den Workshop ein, um alle Anwendungsfaelle zu identifizieren.', - }, - { - icon: 'warning' as const, - title: 'Risikobewertung', - description: 'Jeder Anwendungsfall wird nach EU AI Act Risikostufen klassifiziert. Hochrisiko-Systeme erfordern zusaetzliche Dokumentation.', - }, - ], - }, -} satisfies Record - export default StepHeader diff --git a/admin-compliance/components/sdk/compliance-scope/DatenkategorienBlock.tsx b/admin-compliance/components/sdk/compliance-scope/DatenkategorienBlock.tsx new file mode 100644 index 0000000..a36bbb7 --- /dev/null +++ b/admin-compliance/components/sdk/compliance-scope/DatenkategorienBlock.tsx @@ -0,0 +1,225 @@ +'use client' +// ============================================================================= +// BLOCK 9: Datenkategorien pro Abteilung (aufklappbare Kacheln) +// Extracted from ScopeWizardTab for LOC compliance. +// ============================================================================= + +import { useState } from 'react' +import type { ScopeProfilingAnswer } from '@/lib/sdk/compliance-scope-types' +import { DEPARTMENT_DATA_CATEGORIES } from '@/lib/sdk/vvt-profiling' + +/** Mapping Block 8 vvt_departments values → DEPARTMENT_DATA_CATEGORIES keys */ +export const DEPT_VALUE_TO_KEY: Record = { + personal: ['dept_hr', 'dept_recruiting'], + finanzen: ['dept_finance'], + vertrieb: ['dept_sales'], + marketing: ['dept_marketing'], + it: ['dept_it'], + recht: ['dept_recht'], + kundenservice: ['dept_support'], + produktion: ['dept_produktion'], + logistik: ['dept_logistik'], + einkauf: ['dept_einkauf'], + facility: ['dept_facility'], +} + +/** Mapping department key → scope question ID for Block 9 */ +export const DEPT_KEY_TO_QUESTION: Record = { + dept_hr: 'dk_dept_hr', + dept_recruiting: 'dk_dept_recruiting', + dept_finance: 'dk_dept_finance', + dept_sales: 'dk_dept_sales', + dept_marketing: 'dk_dept_marketing', + dept_support: 'dk_dept_support', + dept_it: 'dk_dept_it', + dept_recht: 'dk_dept_recht', + dept_produktion: 'dk_dept_produktion', + dept_logistik: 'dk_dept_logistik', + dept_einkauf: 'dk_dept_einkauf', + dept_facility: 'dk_dept_facility', +} + +interface DatenkategorienBlock9Props { + answers: ScopeProfilingAnswer[] + onAnswerChange: (questionId: string, value: string | string[] | boolean | number) => void +} + +export function DatenkategorienBlock9({ + answers, + onAnswerChange, +}: DatenkategorienBlock9Props) { + const [expandedDepts, setExpandedDepts] = useState>(new Set()) + const [initializedDepts, setInitializedDepts] = useState>(new Set()) + + // Get selected departments from Block 8 + const deptAnswer = answers.find(a => a.questionId === 'vvt_departments') + const selectedDepts = Array.isArray(deptAnswer?.value) ? (deptAnswer.value as string[]) : [] + + // Resolve which department keys are active + const activeDeptKeys: string[] = [] + for (const deptValue of selectedDepts) { + const keys = DEPT_VALUE_TO_KEY[deptValue] + if (keys) { + for (const k of keys) { + if (!activeDeptKeys.includes(k)) activeDeptKeys.push(k) + } + } + } + + const toggleDept = (deptKey: string) => { + setExpandedDepts(prev => { + const next = new Set(prev) + if (next.has(deptKey)) { + next.delete(deptKey) + } else { + next.add(deptKey) + // Prefill typical categories on first expand + if (!initializedDepts.has(deptKey)) { + const config = DEPARTMENT_DATA_CATEGORIES[deptKey] + const questionId = DEPT_KEY_TO_QUESTION[deptKey] + if (config && questionId) { + const existing = answers.find(a => a.questionId === questionId) + if (!existing) { + const typicalIds = config.categories.filter(c => c.isTypical).map(c => c.id) + onAnswerChange(questionId, typicalIds) + } + } + setInitializedDepts(p => new Set(p).add(deptKey)) + } + } + return next + }) + } + + const handleCategoryToggle = (deptKey: string, catId: string) => { + const questionId = DEPT_KEY_TO_QUESTION[deptKey] + if (!questionId) return + const existing = answers.find(a => a.questionId === questionId) + const current = Array.isArray(existing?.value) ? (existing.value as string[]) : [] + const updated = current.includes(catId) + ? current.filter(id => id !== catId) + : [...current, catId] + onAnswerChange(questionId, updated) + } + + if (activeDeptKeys.length === 0) { + return ( +
+

+ Bitte waehlen Sie zuerst in Block 8 (Verarbeitungstaetigkeiten) die + Abteilungen aus, in denen personenbezogene Daten verarbeitet werden. +

+
+ ) + } + + return ( +
+ {activeDeptKeys.map(deptKey => { + const config = DEPARTMENT_DATA_CATEGORIES[deptKey] + if (!config) return null + const questionId = DEPT_KEY_TO_QUESTION[deptKey] + const isExpanded = expandedDepts.has(deptKey) + const existing = answers.find(a => a.questionId === questionId) + const selectedCategories = Array.isArray(existing?.value) ? (existing.value as string[]) : [] + const hasArt9Selected = config.categories + .filter(c => c.isArt9) + .some(c => selectedCategories.includes(c.id)) + + return ( +
+ {/* Header */} + + + {/* Expandable categories panel */} + {isExpanded && ( +
+

+ Datenkategorien +

+
+ {config.categories.map(cat => { + const isChecked = selectedCategories.includes(cat.id) + return ( + + ) + })} +
+ + {/* Art. 9 warning */} + {hasArt9Selected && ( +
+

+ Art. 9 DSGVO: Sie verarbeiten besondere Kategorien + personenbezogener Daten. Eine zusaetzliche Rechtsgrundlage nach Art. 9 Abs. 2 DSGVO ist + erforderlich (z.B. § 26 Abs. 3 BDSG fuer Beschaeftigtendaten). +

+
+ )} +
+ )} +
+ ) + })} +
+ ) +} diff --git a/admin-compliance/components/sdk/compliance-scope/ScopeWizardTab.tsx b/admin-compliance/components/sdk/compliance-scope/ScopeWizardTab.tsx index da53877..d930576 100644 --- a/admin-compliance/components/sdk/compliance-scope/ScopeWizardTab.tsx +++ b/admin-compliance/components/sdk/compliance-scope/ScopeWizardTab.tsx @@ -1,10 +1,10 @@ 'use client' -import React, { useState, useCallback, useEffect, useMemo } from 'react' +import React, { useState, useCallback, useEffect } from 'react' import type { ScopeProfilingAnswer, ScopeProfilingQuestion } from '@/lib/sdk/compliance-scope-types' import { SCOPE_QUESTION_BLOCKS, getBlockProgress, getTotalProgress, getAnswerValue, prefillFromCompanyProfile, getProfileInfoForBlock, getAutoFilledScoringAnswers, getUnansweredRequiredQuestions } from '@/lib/sdk/compliance-scope-profiling' -import { DEPARTMENT_DATA_CATEGORIES } from '@/lib/sdk/vvt-profiling' import type { ScopeQuestionBlockId } from '@/lib/sdk/compliance-scope-types' import { useSDK } from '@/lib/sdk' +import { DatenkategorienBlock9 } from './DatenkategorienBlock' interface ScopeWizardTabProps { answers: ScopeProfilingAnswer[] @@ -28,18 +28,15 @@ export function ScopeWizardTab({ const currentBlock = SCOPE_QUESTION_BLOCKS[currentBlockIndex] const totalProgress = getTotalProgress(answers) - // Load companyProfile from SDK context const { state: sdkState } = useSDK() const companyProfile = sdkState.companyProfile - // Track which question IDs were prefilled from profile const [prefilledIds, setPrefilledIds] = useState>(new Set()) // Auto-prefill from company profile on mount if answers are empty useEffect(() => { if (companyProfile && answers.length === 0) { const prefilled = prefillFromCompanyProfile(companyProfile) - // Also inject auto-filled scoring answers for questions removed from UI const autoFilled = getAutoFilledScoringAnswers(companyProfile) const allPrefilled = [...prefilled, ...autoFilled] if (allPrefilled.length > 0) { @@ -47,7 +44,6 @@ export function ScopeWizardTab({ setPrefilledIds(new Set(allPrefilled.map(a => a.questionId))) } } - // Only run on mount // eslint-disable-next-line react-hooks/exhaustive-deps }, []) @@ -61,7 +57,6 @@ export function ScopeWizardTab({ } else { onAnswersChange([...answers, { questionId, value }]) } - // Remove from prefilled set when user manually changes if (prefilledIds.has(questionId)) { setPrefilledIds(prev => { const next = new Set(prev) @@ -78,7 +73,6 @@ export function ScopeWizardTab({ const prefilled = prefillFromCompanyProfile(companyProfile) const autoFilled = getAutoFilledScoringAnswers(companyProfile) const allPrefilled = [...prefilled, ...autoFilled] - // Merge with existing answers: prefilled values for questions not yet answered const existingIds = new Set(answers.map(a => a.questionId)) const newAnswers = [...answers] const newPrefilledIds = new Set(prefilledIds) @@ -109,52 +103,25 @@ export function ScopeWizardTab({ const toggleHelp = useCallback((questionId: string) => { setExpandedHelp(prev => { const next = new Set(prev) - if (next.has(questionId)) { - next.delete(questionId) - } else { - next.add(questionId) - } + if (next.has(questionId)) { next.delete(questionId) } else { next.add(questionId) } return next }) }, []) - // Check if a question was prefilled from company profile const isPrefilledFromProfile = useCallback((questionId: string) => { return prefilledIds.has(questionId) }, [prefilledIds]) const renderHelpText = (question: ScopeProfilingQuestion) => { if (!question.helpText) return null - return ( <> - {expandedHelp.has(question.id) && (
- - - + {question.helpText}
)} @@ -164,174 +131,74 @@ export function ScopeWizardTab({ const renderPrefilledBadge = (questionId: string) => { if (!isPrefilledFromProfile(questionId)) return null - return ( - - Aus Profil - - ) + return Aus Profil } const renderQuestion = (question: ScopeProfilingQuestion) => { const currentValue = getAnswerValue(answers, question.id) + const label = ( +
+ {question.question} + {question.required && *} + {renderPrefilledBadge(question.id)} + {renderHelpText(question)} +
+ ) switch (question.type) { case 'boolean': return (
-
-
- - {question.question} - - {question.required && *} - {renderPrefilledBadge(question.id)} - {renderHelpText(question)} -
-
+
{label}
- - + +
) - case 'single': return (
-
- - {question.question} - - {question.required && *} - {renderPrefilledBadge(question.id)} - {renderHelpText(question)} -
+ {label}
{question.options?.map((option) => ( - + ))}
) - case 'multi': return (
-
- - {question.question} - - {question.required && *} - {renderPrefilledBadge(question.id)} - {renderHelpText(question)} -
+ {label}
{question.options?.map((option) => { const selectedValues = Array.isArray(currentValue) ? currentValue as string[] : [] const isChecked = selectedValues.includes(option.value) return ( -
) - case 'number': return (
-
- - {question.question} - - {question.required && *} - {renderPrefilledBadge(question.id)} - {renderHelpText(question)} -
- handleAnswerChange(question.id, parseInt(e.target.value, 10))} - className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent" - placeholder="Zahl eingeben" - /> + {label} + handleAnswerChange(question.id, parseInt(e.target.value, 10))} className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent" placeholder="Zahl eingeben" />
) - case 'text': return (
-
- - {question.question} - - {question.required && *} - {renderPrefilledBadge(question.id)} - {renderHelpText(question)} -
- handleAnswerChange(question.id, e.target.value)} - className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent" - placeholder="Text eingeben" - /> + {label} + handleAnswerChange(question.id, e.target.value)} className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent" placeholder="Text eingeben" />
) - default: return null } @@ -350,52 +217,27 @@ export function ScopeWizardTab({ const unanswered = getUnansweredRequiredQuestions(answers, block.id) const hasRequired = block.questions.some(q => q.required) const allRequiredDone = hasRequired && unanswered.length === 0 - // For optional-only blocks: check if any questions were answered const answeredIds = new Set(answers.map(a => a.questionId)) const hasAnyAnswer = block.questions.some(q => answeredIds.has(q.id)) const optionalDone = !hasRequired && hasAnyAnswer return ( - ) @@ -411,25 +253,18 @@ export function ScopeWizardTab({
Gesamtfortschritt
- - {completionStats.answered} / {completionStats.total} Fragen - + {completionStats.answered} / {completionStats.total} Fragen {totalProgress}%
-
+
- {/* Clickable unanswered required questions summary */} + {/* Unanswered required questions summary */} {(() => { const allUnanswered = getUnansweredRequiredQuestions(answers) if (allUnanswered.length === 0) return null - - // Group by block const byBlock = new Map() for (const item of allUnanswered) { if (!byBlock.has(item.blockId)) { @@ -438,18 +273,13 @@ export function ScopeWizardTab({ } byBlock.get(item.blockId)!.count++ } - return (
⚠ Offene Pflichtfragen: {Array.from(byBlock.entries()).map(([blockId, info], i) => ( {i > 0 && ·} - @@ -467,17 +297,13 @@ export function ScopeWizardTab({

{currentBlock.description}

{companyProfile && ( - )}
- {/* "Aus Profil" Info Box — shown for blocks that have auto-filled data */} + {/* Profile Info Box */} {companyProfile && (() => { const profileItems = getProfileInfoForBlock(companyProfile, currentBlock.id as ScopeQuestionBlockId) if (profileItems.length === 0) return null @@ -486,27 +312,16 @@ export function ScopeWizardTab({

- - - + Aus Unternehmensprofil

- {profileItems.map(item => ( - - {item.label}: {item.value} - - ))} + {profileItems.map(item => ({item.label}: {item.value}))}
- + Profil bearbeiten - - - +
@@ -516,18 +331,11 @@ export function ScopeWizardTab({ {/* Questions */}
{currentBlock.id === 'datenkategorien_detail' ? ( - + ) : ( currentBlock.questions.map((question) => { const isAnswered = answers.some(a => a.questionId === question.id) - const borderClass = question.required - ? isAnswered - ? 'border-l-4 border-l-green-400 pl-4' - : 'border-l-4 border-l-orange-400 pl-4' - : '' + const borderClass = question.required ? (isAnswered ? 'border-l-4 border-l-green-400 pl-4' : 'border-l-4 border-l-orange-400 pl-4') : '' return (
{renderQuestion(question)} @@ -540,32 +348,16 @@ export function ScopeWizardTab({ {/* Navigation Buttons */}
- - - Block {currentBlockIndex + 1} von {SCOPE_QUESTION_BLOCKS.length} - + Block {currentBlockIndex + 1} von {SCOPE_QUESTION_BLOCKS.length} {currentBlockIndex === SCOPE_QUESTION_BLOCKS.length - 1 ? ( - ) : ( - )} @@ -574,221 +366,3 @@ export function ScopeWizardTab({
) } - -// ============================================================================= -// BLOCK 9: Datenkategorien pro Abteilung (aufklappbare Kacheln) -// ============================================================================= - -/** Mapping Block 8 vvt_departments values → DEPARTMENT_DATA_CATEGORIES keys */ -const DEPT_VALUE_TO_KEY: Record = { - personal: ['dept_hr', 'dept_recruiting'], - finanzen: ['dept_finance'], - vertrieb: ['dept_sales'], - marketing: ['dept_marketing'], - it: ['dept_it'], - recht: ['dept_recht'], - kundenservice: ['dept_support'], - produktion: ['dept_produktion'], - logistik: ['dept_logistik'], - einkauf: ['dept_einkauf'], - facility: ['dept_facility'], -} - -/** Mapping department key → scope question ID for Block 9 */ -const DEPT_KEY_TO_QUESTION: Record = { - dept_hr: 'dk_dept_hr', - dept_recruiting: 'dk_dept_recruiting', - dept_finance: 'dk_dept_finance', - dept_sales: 'dk_dept_sales', - dept_marketing: 'dk_dept_marketing', - dept_support: 'dk_dept_support', - dept_it: 'dk_dept_it', - dept_recht: 'dk_dept_recht', - dept_produktion: 'dk_dept_produktion', - dept_logistik: 'dk_dept_logistik', - dept_einkauf: 'dk_dept_einkauf', - dept_facility: 'dk_dept_facility', -} - -function DatenkategorienBlock9({ - answers, - onAnswerChange, -}: { - answers: ScopeProfilingAnswer[] - onAnswerChange: (questionId: string, value: string | string[] | boolean | number) => void -}) { - const [expandedDepts, setExpandedDepts] = useState>(new Set()) - const [initializedDepts, setInitializedDepts] = useState>(new Set()) - - // Get selected departments from Block 8 - const deptAnswer = answers.find(a => a.questionId === 'vvt_departments') - const selectedDepts = Array.isArray(deptAnswer?.value) ? (deptAnswer.value as string[]) : [] - - // Resolve which department keys are active - const activeDeptKeys: string[] = [] - for (const deptValue of selectedDepts) { - const keys = DEPT_VALUE_TO_KEY[deptValue] - if (keys) { - for (const k of keys) { - if (!activeDeptKeys.includes(k)) activeDeptKeys.push(k) - } - } - } - - const toggleDept = (deptKey: string) => { - setExpandedDepts(prev => { - const next = new Set(prev) - if (next.has(deptKey)) { - next.delete(deptKey) - } else { - next.add(deptKey) - // Prefill typical categories on first expand - if (!initializedDepts.has(deptKey)) { - const config = DEPARTMENT_DATA_CATEGORIES[deptKey] - const questionId = DEPT_KEY_TO_QUESTION[deptKey] - if (config && questionId) { - const existing = answers.find(a => a.questionId === questionId) - if (!existing) { - const typicalIds = config.categories.filter(c => c.isTypical).map(c => c.id) - onAnswerChange(questionId, typicalIds) - } - } - setInitializedDepts(p => new Set(p).add(deptKey)) - } - } - return next - }) - } - - const handleCategoryToggle = (deptKey: string, catId: string) => { - const questionId = DEPT_KEY_TO_QUESTION[deptKey] - if (!questionId) return - const existing = answers.find(a => a.questionId === questionId) - const current = Array.isArray(existing?.value) ? (existing.value as string[]) : [] - const updated = current.includes(catId) - ? current.filter(id => id !== catId) - : [...current, catId] - onAnswerChange(questionId, updated) - } - - if (activeDeptKeys.length === 0) { - return ( -
-

- Bitte waehlen Sie zuerst in Block 8 (Verarbeitungstaetigkeiten) die - Abteilungen aus, in denen personenbezogene Daten verarbeitet werden. -

-
- ) - } - - return ( -
- {activeDeptKeys.map(deptKey => { - const config = DEPARTMENT_DATA_CATEGORIES[deptKey] - if (!config) return null - const questionId = DEPT_KEY_TO_QUESTION[deptKey] - const isExpanded = expandedDepts.has(deptKey) - const existing = answers.find(a => a.questionId === questionId) - const selectedCategories = Array.isArray(existing?.value) ? (existing.value as string[]) : [] - const hasArt9Selected = config.categories - .filter(c => c.isArt9) - .some(c => selectedCategories.includes(c.id)) - - return ( -
- {/* Header */} - - - {/* Expandable categories panel */} - {isExpanded && ( -
-

- Datenkategorien -

-
- {config.categories.map(cat => { - const isChecked = selectedCategories.includes(cat.id) - return ( - - ) - })} -
- - {/* Art. 9 warning */} - {hasArt9Selected && ( -
-

- Art. 9 DSGVO: Sie verarbeiten besondere Kategorien - personenbezogener Daten. Eine zusaetzliche Rechtsgrundlage nach Art. 9 Abs. 2 DSGVO ist - erforderlich (z.B. § 26 Abs. 3 BDSG fuer Beschaeftigtendaten). -

-
- )} -
- )} -
- ) - })} -
- ) -} diff --git a/admin-compliance/components/sdk/source-policy/PIIRuleModals.tsx b/admin-compliance/components/sdk/source-policy/PIIRuleModals.tsx new file mode 100644 index 0000000..cc364b9 --- /dev/null +++ b/admin-compliance/components/sdk/source-policy/PIIRuleModals.tsx @@ -0,0 +1,222 @@ +'use client' +// ============================================================================= +// PII RULE MODALS +// NewRuleModal and EditRuleModal extracted from PIIRulesTab for LOC compliance. +// ============================================================================= + +interface PIIRule { + id: string + name: string + description?: string + pattern?: string + category: string + action: string + active: boolean + created_at: string +} + +export const CATEGORIES = [ + { value: 'email', label: 'E-Mail-Adressen' }, + { value: 'phone', label: 'Telefonnummern' }, + { value: 'iban', label: 'IBAN/Bankdaten' }, + { value: 'name', label: 'Personennamen' }, + { value: 'address', label: 'Adressen' }, + { value: 'id_number', label: 'Ausweisnummern' }, + { value: 'health', label: 'Gesundheitsdaten' }, + { value: 'other', label: 'Sonstige' }, +] + +export const ACTIONS = [ + { value: 'warn', label: 'Warnung', color: 'bg-amber-100 text-amber-700' }, + { value: 'mask', label: 'Maskieren', color: 'bg-orange-100 text-orange-700' }, + { value: 'block', label: 'Blockieren', color: 'bg-red-100 text-red-700' }, +] + +// --------------------------------------------------------------------------- +// NewRuleModal +// --------------------------------------------------------------------------- + +export interface NewRuleState { + name: string + pattern: string + category: string + action: string + active: boolean +} + +interface NewRuleModalProps { + newRule: NewRuleState + onChange: (rule: NewRuleState) => void + onSubmit: () => void + onClose: () => void + saving: boolean +} + +export function NewRuleModal({ newRule, onChange, onSubmit, onClose, saving }: NewRuleModalProps) { + return ( +
+
+

Neue PII-Regel

+ +
+
+ + onChange({ ...newRule, name: e.target.value })} + placeholder="z.B. Deutsche Telefonnummern" + className="w-full px-4 py-2 border border-slate-200 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent" + /> +
+ +
+ + +
+ +
+ +