'use client' import React from 'react' import { LoeschfristPolicy } from '@/lib/sdk/loeschfristen-types' import { ComplianceCheckResult } from '@/lib/sdk/loeschfristen-compliance' import { buildLoeschkonzeptHtml, type LoeschkonzeptOrgHeader, type LoeschkonzeptRevision, } from '@/lib/sdk/loeschfristen-document' import { downloadFile } from '@/lib/sdk/loeschfristen-export' // --------------------------------------------------------------------------- // Types // --------------------------------------------------------------------------- interface LoeschkonzeptTabProps { policies: LoeschfristPolicy[] orgHeader: LoeschkonzeptOrgHeader revisions: LoeschkonzeptRevision[] complianceResult: ComplianceCheckResult | null vvtActivities: any[] onOrgHeaderChange: (field: keyof LoeschkonzeptOrgHeader, value: string | string[]) => void onAddRevision: () => void onUpdateRevision: (index: number, field: keyof LoeschkonzeptRevision, value: string) => void onRemoveRevision: (index: number) => void } // --------------------------------------------------------------------------- // Component // --------------------------------------------------------------------------- export function LoeschkonzeptTab({ policies, orgHeader, revisions, complianceResult, vvtActivities, onOrgHeaderChange, onAddRevision, onUpdateRevision, onRemoveRevision, }: LoeschkonzeptTabProps) { const activePolicies = policies.filter(p => p.status !== 'ARCHIVED') function handlePrintLoeschkonzept() { const htmlContent = buildLoeschkonzeptHtml(policies, orgHeader, vvtActivities, complianceResult, revisions) const printWindow = window.open('', '_blank') if (printWindow) { printWindow.document.write(htmlContent) printWindow.document.close() printWindow.focus() setTimeout(() => printWindow.print(), 300) } } function handleDownloadLoeschkonzeptHtml() { const htmlContent = buildLoeschkonzeptHtml(policies, orgHeader, vvtActivities, complianceResult, revisions) downloadFile(htmlContent, `loeschkonzept-${new Date().toISOString().split('T')[0]}.html`, 'text/html;charset=utf-8') } return (
{/* Action bar */}

Loeschkonzept (Art. 5/17/30 DSGVO)

Druckfertiges Loeschkonzept mit Deckblatt, Loeschregeln, VVT-Verknuepfung und Compliance-Status.

{activePolicies.length === 0 && (
Keine aktiven Policies vorhanden. Erstellen Sie mindestens eine Policy, um das Loeschkonzept zu generieren.
)}
{/* Org Header Form */}

Organisationsdaten (Deckblatt)

onOrgHeaderChange('organizationName', e.target.value)} className="w-full rounded-lg border border-gray-300 px-3 py-2 text-sm focus:ring-2 focus:ring-purple-500 focus:border-purple-500" placeholder="Name der Organisation" />
onOrgHeaderChange('industry', e.target.value)} className="w-full rounded-lg border border-gray-300 px-3 py-2 text-sm focus:ring-2 focus:ring-purple-500 focus:border-purple-500" placeholder="z.B. IT / Software" />
onOrgHeaderChange('dpoName', e.target.value)} className="w-full rounded-lg border border-gray-300 px-3 py-2 text-sm focus:ring-2 focus:ring-purple-500 focus:border-purple-500" placeholder="Name des DSB" />
onOrgHeaderChange('dpoContact', e.target.value)} className="w-full rounded-lg border border-gray-300 px-3 py-2 text-sm focus:ring-2 focus:ring-purple-500 focus:border-purple-500" placeholder="E-Mail oder Telefon" />
onOrgHeaderChange('responsiblePerson', e.target.value)} className="w-full rounded-lg border border-gray-300 px-3 py-2 text-sm focus:ring-2 focus:ring-purple-500 focus:border-purple-500" placeholder="Name des Verantwortlichen" />
onOrgHeaderChange('employeeCount', e.target.value)} className="w-full rounded-lg border border-gray-300 px-3 py-2 text-sm focus:ring-2 focus:ring-purple-500 focus:border-purple-500" placeholder="z.B. 50-249" />
onOrgHeaderChange('loeschkonzeptVersion', e.target.value)} className="w-full rounded-lg border border-gray-300 px-3 py-2 text-sm focus:ring-2 focus:ring-purple-500 focus:border-purple-500" placeholder="1.0" />
onOrgHeaderChange('lastReviewDate', e.target.value)} className="w-full rounded-lg border border-gray-300 px-3 py-2 text-sm focus:ring-2 focus:ring-purple-500 focus:border-purple-500" />
onOrgHeaderChange('nextReviewDate', e.target.value)} className="w-full rounded-lg border border-gray-300 px-3 py-2 text-sm focus:ring-2 focus:ring-purple-500 focus:border-purple-500" />
{/* Revisions */}

Aenderungshistorie

{revisions.length === 0 ? (

Noch keine Revisionen. Die Erstversion wird automatisch im Dokument eingefuegt.

) : (
{revisions.map((rev, idx) => (
onUpdateRevision(idx, 'version', e.target.value)} className="rounded-lg border border-gray-300 px-2 py-1.5 text-xs" placeholder="1.1" /> onUpdateRevision(idx, 'date', e.target.value)} className="rounded-lg border border-gray-300 px-2 py-1.5 text-xs" /> onUpdateRevision(idx, 'author', e.target.value)} className="rounded-lg border border-gray-300 px-2 py-1.5 text-xs" placeholder="Autor" /> onUpdateRevision(idx, 'changes', e.target.value)} className="rounded-lg border border-gray-300 px-2 py-1.5 text-xs" placeholder="Beschreibung der Aenderungen" />
))}
)}
{/* Document Preview */}

Dokument-Vorschau

Loeschkonzept
gemaess Art. 5/17/30 DSGVO
{orgHeader.organizationName || Organisation nicht angegeben}
Version {orgHeader.loeschkonzeptVersion} | {new Date().toLocaleDateString('de-DE')}
12 Sektionen
1. Ziel und Zweck
7. Auftragsverarbeiter
2. Geltungsbereich
8. Legal Hold Verfahren
3. Grundprinzipien
9. Verantwortlichkeiten
4. Loeschregeln-Uebersicht
10. Pruef-/Revisionszyklus
5. Detaillierte Loeschregeln
11. Compliance-Status
6. VVT-Verknuepfung
12. Aenderungshistorie
{activePolicies.length} Loeschregeln {policies.filter(p => p.linkedVVTActivityIds.length > 0).length} VVT-Verknuepfungen {policies.filter(p => p.linkedVendorIds.length > 0).length} Vendor-Verknuepfungen {revisions.length} Revisionen {complianceResult && ( Compliance-Score: = 75 ? 'text-green-600' : complianceResult.score >= 50 ? 'text-yellow-600' : 'text-red-600'}>{complianceResult.score}/100 )}
) }