From 34fc8dc6549e7f4237739f5e087bc6da2dba2f81 Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Mon, 2 Mar 2026 17:14:58 +0100 Subject: [PATCH] =?UTF-8?q?feat:=206=20Dokumentations-Module=20auf=20100%?= =?UTF-8?q?=20=E2=80=94=20VVT=20Backend,=20Filter,=20PDF-Export?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase 1 — VVT Backend (localStorage → API): - migrations/006_vvt.sql: Neue Tabellen (vvt_organization, vvt_activities, vvt_audit_log) - compliance/db/vvt_models.py: SQLAlchemy-Models für alle VVT-Tabellen - compliance/api/vvt_routes.py: Vollständiger CRUD-Router (10 Endpoints) - compliance/api/__init__.py: VVT-Router registriert - compliance/api/schemas.py: VVT Pydantic-Schemas ergänzt - app/(sdk)/sdk/vvt/page.tsx: API-Client + camelCase↔snake_case Mapping, localStorage durch persistente DB-Calls ersetzt (POST/PUT/DELETE/GET) - tests/test_vvt_routes.py: 18 Tests (alle grün) Phase 3 — Document Generator PDF-Export: - document-generator/page.tsx: "Als PDF exportieren"-Button funktioniert jetzt via window.print() + Print-Window mit korrektem HTML - Fallback-Banner wenn Template-Service (breakpilot-core) nicht erreichbar Phase 4 — Source Policy erweiterte Filter: - SourcesTab.tsx: source_type-Filter (Rechtlich / Leitlinien / Vorlagen / etc.) - PIIRulesTab.tsx: category-Filter (E-Mail / Telefon / IBAN / etc.) - source_policy_router.py: Backend-Endpoints unterstützen jetzt source_type und category als Query-Parameter - requirements.txt: reportlab==4.2.5 ergänzt (fehlende Audit-PDF-Dependency) Phase 2 — Training (Migration-Skripte): - scripts/apply_training_migrations.sh: SSH-Skript für Mac Mini - scripts/apply_vvt_migration.sh: Vollständiges Deploy-Skript für VVT Co-Authored-By: Claude Sonnet 4.6 --- .../app/(sdk)/sdk/document-generator/page.tsx | 25 ++ admin-compliance/app/(sdk)/sdk/vvt/page.tsx | 277 ++++++++++--- .../sdk/source-policy/PIIRulesTab.tsx | 41 +- .../sdk/source-policy/SourcesTab.tsx | 16 +- backend-compliance/compliance/api/__init__.py | 3 + backend-compliance/compliance/api/schemas.py | 140 +++++++ .../compliance/api/source_policy_router.py | 20 +- .../compliance/api/vvt_routes.py | 384 ++++++++++++++++++ .../compliance/db/vvt_models.py | 109 +++++ backend-compliance/migrations/006_vvt.sql | 66 +++ backend-compliance/requirements.txt | 1 + backend-compliance/tests/test_vvt_routes.py | 222 ++++++++++ scripts/apply_training_migrations.sh | 38 ++ scripts/apply_vvt_migration.sh | 55 +++ 14 files changed, 1332 insertions(+), 65 deletions(-) create mode 100644 backend-compliance/compliance/api/vvt_routes.py create mode 100644 backend-compliance/compliance/db/vvt_models.py create mode 100644 backend-compliance/migrations/006_vvt.sql create mode 100644 backend-compliance/tests/test_vvt_routes.py create mode 100644 scripts/apply_training_migrations.sh create mode 100644 scripts/apply_vvt_migration.sh diff --git a/admin-compliance/app/(sdk)/sdk/document-generator/page.tsx b/admin-compliance/app/(sdk)/sdk/document-generator/page.tsx index e240fbe..73b8f66 100644 --- a/admin-compliance/app/(sdk)/sdk/document-generator/page.tsx +++ b/admin-compliance/app/(sdk)/sdk/document-generator/page.tsx @@ -454,6 +454,13 @@ export default function DocumentGeneratorPage() { + {/* Service unreachable warning */} + {!isLoading && !status && ( +
+ Template-Service nicht erreichbar. Stellen Sie sicher, dass breakpilot-core läuft (curl -sf http://macmini:8099/health). Das Suchen und Zusammenstellen von Vorlagen ist erst nach Verbindung möglich. +
+ )} + {/* Status Overview */}
@@ -737,6 +744,24 @@ export default function DocumentGeneratorPage() { Kopieren +
+ + +
{/* Rules Table */} diff --git a/admin-compliance/components/sdk/source-policy/SourcesTab.tsx b/admin-compliance/components/sdk/source-policy/SourcesTab.tsx index 5058fb8..b1205a5 100644 --- a/admin-compliance/components/sdk/source-policy/SourcesTab.tsx +++ b/admin-compliance/components/sdk/source-policy/SourcesTab.tsx @@ -51,6 +51,7 @@ export function SourcesTab({ apiBase, onUpdate }: SourcesTabProps) { const [searchTerm, setSearchTerm] = useState('') const [licenseFilter, setLicenseFilter] = useState('') const [statusFilter, setStatusFilter] = useState<'all' | 'active' | 'inactive'>('all') + const [sourceTypeFilter, setSourceTypeFilter] = useState('') // Edit modal const [editingSource, setEditingSource] = useState(null) @@ -69,7 +70,7 @@ export function SourcesTab({ apiBase, onUpdate }: SourcesTabProps) { useEffect(() => { fetchSources() - }, [licenseFilter, statusFilter]) + }, [licenseFilter, statusFilter, sourceTypeFilter]) const fetchSources = async () => { try { @@ -77,6 +78,7 @@ export function SourcesTab({ apiBase, onUpdate }: SourcesTabProps) { const params = new URLSearchParams() if (licenseFilter) params.append('license', licenseFilter) if (statusFilter !== 'all') params.append('active_only', statusFilter === 'active' ? 'true' : 'false') + if (sourceTypeFilter) params.append('source_type', sourceTypeFilter) const res = await fetch(`${apiBase}/sources?${params}`) if (!res.ok) throw new Error('Fehler beim Laden') @@ -230,6 +232,18 @@ export function SourcesTab({ apiBase, onUpdate }: SourcesTabProps) { +