diff --git a/admin-compliance/app/(admin)/development/sdk-flow/flow-data.ts b/admin-compliance/app/(admin)/development/sdk-flow/flow-data.ts index 804b329..66c42f8 100644 --- a/admin-compliance/app/(admin)/development/sdk-flow/flow-data.ts +++ b/admin-compliance/app/(admin)/development/sdk-flow/flow-data.ts @@ -220,7 +220,7 @@ export const SDK_FLOW_STEPS: SDKFlowStep[] = [ inputs: ['modules'], outputs: ['sourcePolicy'], prerequisiteSteps: ['modules'], - dbTables: ['compliance_source_policies', 'compliance_allowed_sources', 'compliance_pii_field_rules', 'compliance_source_policy_audit'], + dbTables: ['compliance_allowed_sources', 'compliance_pii_rules', 'compliance_source_operations', 'compliance_source_policy_audit'], dbMode: 'read/write', ragCollections: [], isOptional: false, @@ -480,14 +480,14 @@ export const SDK_FLOW_STEPS: SDKFlowStep[] = [ checkpointId: 'CP-VVT', checkpointType: 'REQUIRED', checkpointReviewer: 'DSB', - description: 'Erstellung des Verzeichnisses aller Verarbeitungstaetigkeiten nach Art. 30 DSGVO.', - descriptionLong: 'Das VVT (Verzeichnis von Verarbeitungstaetigkeiten) ist eine gesetzliche Pflichtdokumentation nach Art. 30 DSGVO. Fuer jede Verarbeitungstaetigkeit wird dokumentiert: Zweck, Rechtsgrundlage, Kategorien betroffener Personen, Datenkategorien, Empfaenger, Drittlandtransfers, Loeschfristen und TOMs. Das VVT wird automatisch aus den vorherigen Schritten zusammengestellt (Module, TOMs, Data Mapping). Der DSB muss das VVT freigeben.', + description: 'Erstellung des Verzeichnisses aller Verarbeitungstaetigkeiten nach Art. 30 DSGVO — vollstaendig backend-persistent.', + descriptionLong: 'Das VVT (Verzeichnis von Verarbeitungstaetigkeiten) ist eine gesetzliche Pflichtdokumentation nach Art. 30 DSGVO. Fuer jede Verarbeitungstaetigkeit wird dokumentiert: Zweck, Rechtsgrundlage, Kategorien betroffener Personen, Datenkategorien, Empfaenger, Drittlandtransfers, Loeschfristen und TOMs. Jede Aktivitaet wird mit einem eindeutigen VVT-ID versehen und in der Datenbank gespeichert (compliance_vvt_activities). Organisationsweite Metadaten (DSB-Kontakt, Branche, Standorte) werden separat verwaltet (compliance_vvt_organization). Alle Aenderungen werden in einem Audit-Log protokolliert (compliance_vvt_audit_log). Das VVT wird via FastAPI-Backend (backend-compliance:8002) persistent gespeichert. Der DSB muss das VVT freigeben.', legalBasis: 'Art. 30 DSGVO (Verzeichnis von Verarbeitungstaetigkeiten)', inputs: ['modules', 'toms', 'dataMapping'], outputs: ['vvt'], prerequisiteSteps: ['loeschfristen'], - dbTables: [], - dbMode: 'none', + dbTables: ['compliance_vvt_organization', 'compliance_vvt_activities', 'compliance_vvt_audit_log'], + dbMode: 'read/write', ragCollections: ['bp_compliance_gesetze'], ragPurpose: 'Art. 30 DSGVO Vorlage', isOptional: false, @@ -573,8 +573,8 @@ export const SDK_FLOW_STEPS: SDKFlowStep[] = [ checkpointId: 'CP-DOCGEN', checkpointType: 'RECOMMENDED', checkpointReviewer: 'NONE', - description: 'Generierung weiterer rechtlicher Dokumente (Impressum, AVV, Auftragsverarbeitung).', - descriptionLong: 'Der Dokumentengenerator erstellt zusaetzliche rechtliche Dokumente, die ueber die Pflichtdokumente hinausgehen: Impressum (nach TMG/DDG), Auftragsverarbeitungsvertraege (AVV nach Art. 28 DSGVO), Vertraulichkeitsvereinbarungen, Betriebsvereinbarungen zum Datenschutz und Datenschutz-Folgenabschaetzungs-Berichte. Die Templates werden aus bp_legal_templates geladen und mit den unternehmensspezifischen Daten befuellt.', + description: 'Generierung weiterer rechtlicher Dokumente (Impressum, AVV, Auftragsverarbeitung) mit PDF-Export.', + descriptionLong: 'Der Dokumentengenerator erstellt zusaetzliche rechtliche Dokumente, die ueber die Pflichtdokumente hinausgehen: Impressum (nach TMG/DDG), Auftragsverarbeitungsvertraege (AVV nach Art. 28 DSGVO), Vertraulichkeitsvereinbarungen, Betriebsvereinbarungen zum Datenschutz und Datenschutz-Folgenabschaetzungs-Berichte. Die Templates werden aus bp_legal_templates geladen und mit den unternehmensspezifischen Daten befuellt. PDF-Export ist direkt im Browser via window.print() moeglich. Steht der Template-Service (breakpilot-core) nicht bereit, erscheint ein Fallback-Banner mit Hinweis.', legalBasis: 'Art. 28 DSGVO (Auftragsverarbeitung), DDG § 5 (Impressum)', inputs: ['companyProfile', 'toms', 'vvt'], outputs: ['generatedDocuments'], @@ -790,13 +790,13 @@ export const SDK_FLOW_STEPS: SDKFlowStep[] = [ checkpointId: 'CP-TRAIN', checkpointType: 'REQUIRED', checkpointReviewer: 'NONE', - description: 'Durchfuehrung und Tracking von Compliance-Schulungen mit Zertifikaten.', - descriptionLong: 'Die Training Engine setzt den Schulungsplan der Academy um. Sie bietet interaktive Schulungsmodule mit Quizzes, Fallbeispielen und Zertifikaten. Jede abgeschlossene Schulung wird dokumentiert (Teilnehmer, Datum, Ergebnis) und dient als Evidence fuer Audits. Die Engine ueberwacht Faelligkeiten, sendet Erinnerungen bei ausstehenden Pflichtschulungen und generiert Compliance-Reports ueber den Schulungsstand aller Mitarbeiter.', + description: 'Durchfuehrung und Tracking von Compliance-Schulungen mit Quizzes und Zertifikaten — vollstaendig backend-persistent.', + descriptionLong: 'Die Training Engine setzt den Schulungsplan der Academy um. Sie bietet interaktive Schulungsmodule (DSGVO, AI Act, ISO 27001 etc.) mit Quizzes, automatisch generierten Inhalten und Zertifikaten. 28 vordefinierte Schulungsmodule sind hinterlegt. Jede abgeschlossene Schulung wird dokumentiert (Teilnehmer, Datum, Ergebnis, Quiz-Versuch) und dient als Evidence fuer Audits. Die Engine ueberwacht Faelligkeiten, sendet Erinnerungen bei ausstehenden Pflichtschulungen und generiert Compliance-Reports ueber den Schulungsstand aller Mitarbeiter. Backend: ai-compliance-sdk (Go, Port 8093) via /sdk/v1/training/*. Schulungsmatrix ordnet Rollen Pflichtmodulen zu.', inputs: ['trainingPlan', 'modules'], outputs: ['trainingContent'], prerequisiteSteps: ['academy'], - dbTables: [], - dbMode: 'none', + dbTables: ['training_modules', 'training_assignments', 'training_quiz_questions', 'training_quiz_attempts', 'training_matrix_entries', 'training_audit_log'], + dbMode: 'read/write', ragCollections: [], isOptional: false, url: '/sdk/training', diff --git a/backend-compliance/tests/test_source_policy_routes.py b/backend-compliance/tests/test_source_policy_routes.py new file mode 100644 index 0000000..b95fee1 --- /dev/null +++ b/backend-compliance/tests/test_source_policy_routes.py @@ -0,0 +1,347 @@ +"""Tests for Source Policy Router (source_policy_router.py). + +Fokus: Neue Filter-Parameter source_type (list_sources) und category (list_pii_rules) +sowie Schema-Validierungen und Audit-Log-Helper. +""" + +import pytest +from unittest.mock import MagicMock, patch, call +from datetime import datetime +import uuid + +from compliance.api.source_policy_router import ( + SourceCreate, + SourceUpdate, + PIIRuleCreate, + PIIRuleUpdate, + _log_audit, +) +from compliance.db.source_policy_models import ( + AllowedSourceDB, + PIIRuleDB, + SourcePolicyAuditDB, +) + + +# ============================================================================= +# Schema Tests: SourceCreate +# ============================================================================= + +class TestSourceCreate: + def test_default_values(self): + req = SourceCreate(domain="eur-lex.europa.eu", name="EUR-Lex") + assert req.domain == "eur-lex.europa.eu" + assert req.name == "EUR-Lex" + assert req.source_type == "legal" + assert req.active is True + assert req.trust_boost == 0.5 + + def test_legal_source_type(self): + req = SourceCreate(domain="gesetze.de", name="Gesetze.de", source_type="legal") + assert req.source_type == "legal" + + def test_guidance_source_type(self): + req = SourceCreate(domain="dsb.gv.at", name="DSB Austria", source_type="guidance") + assert req.source_type == "guidance" + + def test_technical_source_type(self): + req = SourceCreate(domain="bsi.bund.de", name="BSI", source_type="technical") + assert req.source_type == "technical" + + def test_trust_boost_range_low(self): + req = SourceCreate(domain="example.com", name="Test", trust_boost=0.0) + assert req.trust_boost == 0.0 + + def test_trust_boost_range_high(self): + req = SourceCreate(domain="example.com", name="Test", trust_boost=1.0) + assert req.trust_boost == 1.0 + + def test_trust_boost_invalid_raises(self): + with pytest.raises(Exception): + SourceCreate(domain="example.com", name="Test", trust_boost=1.5) + + def test_optional_fields_none(self): + req = SourceCreate(domain="example.com", name="Test") + assert req.description is None + assert req.license is None + assert req.legal_basis is None + assert req.metadata is None + + def test_full_values(self): + req = SourceCreate( + domain="eur-lex.europa.eu", + name="EUR-Lex", + description="EU-Rechtsquellen", + license="CC-BY", + legal_basis="Art. 5 DSGVO", + trust_boost=0.9, + source_type="legal", + active=True, + metadata={"region": "EU"}, + ) + assert req.trust_boost == 0.9 + assert req.metadata == {"region": "EU"} + + +# ============================================================================= +# Schema Tests: SourceUpdate +# ============================================================================= + +class TestSourceUpdate: + def test_partial_update_source_type(self): + req = SourceUpdate(source_type="guidance") + data = req.model_dump(exclude_none=True) + assert data == {"source_type": "guidance"} + + def test_partial_update_active(self): + req = SourceUpdate(active=False) + data = req.model_dump(exclude_none=True) + assert data == {"active": False} + + def test_empty_update(self): + req = SourceUpdate() + data = req.model_dump(exclude_none=True) + assert data == {} + + def test_multi_field_update(self): + req = SourceUpdate(source_type="technical", trust_boost=0.8, active=True) + data = req.model_dump(exclude_none=True) + assert data["source_type"] == "technical" + assert data["trust_boost"] == 0.8 + assert data["active"] is True + + +# ============================================================================= +# Schema Tests: PIIRuleCreate +# ============================================================================= + +class TestPIIRuleCreate: + def test_default_values(self): + req = PIIRuleCreate(name="E-Mail-Erkennung", category="pii") + assert req.name == "E-Mail-Erkennung" + assert req.category == "pii" + assert req.action == "mask" + assert req.active is True + assert req.pattern is None + + def test_financial_category(self): + req = PIIRuleCreate(name="IBAN", category="financial", pattern=r"DE\d{20}") + assert req.category == "financial" + assert req.pattern == r"DE\d{20}" + + def test_health_category(self): + req = PIIRuleCreate(name="Diagnose", category="health") + assert req.category == "health" + + def test_id_category(self): + req = PIIRuleCreate(name="Personalausweis", category="id") + assert req.category == "id" + + def test_action_redact(self): + req = PIIRuleCreate(name="Test", category="pii", action="redact") + assert req.action == "redact" + + def test_serialization(self): + req = PIIRuleCreate(name="Telefon", category="pii", pattern=r"\+49\d+") + data = req.model_dump() + assert data["name"] == "Telefon" + assert data["category"] == "pii" + assert data["pattern"] == r"\+49\d+" + + +# ============================================================================= +# Schema Tests: PIIRuleUpdate +# ============================================================================= + +class TestPIIRuleUpdate: + def test_partial_update_category(self): + req = PIIRuleUpdate(category="financial") + data = req.model_dump(exclude_none=True) + assert data == {"category": "financial"} + + def test_partial_update_active(self): + req = PIIRuleUpdate(active=False) + data = req.model_dump(exclude_none=True) + assert data == {"active": False} + + def test_empty_update(self): + req = PIIRuleUpdate() + data = req.model_dump(exclude_none=True) + assert data == {} + + def test_multi_field_update(self): + req = PIIRuleUpdate(name="Updated", category="id", action="redact") + data = req.model_dump(exclude_none=True) + assert data["name"] == "Updated" + assert data["category"] == "id" + assert data["action"] == "redact" + + +# ============================================================================= +# DB Model Tests: AllowedSourceDB +# ============================================================================= + +class TestAllowedSourceDB: + def test_default_source_type(self): + src = AllowedSourceDB( + id=uuid.uuid4(), + domain="example.com", + name="Test Source", + ) + # Column default is 'legal' + assert src.__tablename__ == 'compliance_allowed_sources' + + def test_repr(self): + src = AllowedSourceDB(domain="bsi.bund.de", name="BSI") + assert "bsi.bund.de" in repr(src) + assert "BSI" in repr(src) + + def test_tablename(self): + assert AllowedSourceDB.__tablename__ == 'compliance_allowed_sources' + + +# ============================================================================= +# DB Model Tests: PIIRuleDB +# ============================================================================= + +class TestPIIRuleDB: + def test_tablename(self): + assert PIIRuleDB.__tablename__ == 'compliance_pii_rules' + + +# ============================================================================= +# Filter Logic Tests (Unit — Mock DB) +# ============================================================================= + +class TestSourceTypeFilter: + """Tests that list_sources correctly applies the source_type filter.""" + + def test_source_type_filter_applied(self): + """source_type param should be passed to DB query filter.""" + db_mock = MagicMock() + query_mock = MagicMock() + db_mock.query.return_value = query_mock + query_mock.filter.return_value = query_mock + query_mock.order_by.return_value = query_mock + query_mock.offset.return_value = query_mock + query_mock.limit.return_value = query_mock + query_mock.all.return_value = [] + + # Simulate filter call chain for source_type='legal' + filtered = query_mock.filter.return_value + filtered.filter.return_value = filtered + filtered.order_by.return_value = filtered + filtered.offset.return_value = filtered + filtered.limit.return_value = filtered + filtered.all.return_value = [] + + # Verify filter is called when source_type is provided + result = db_mock.query(AllowedSourceDB) + result = result.filter(AllowedSourceDB.source_type == "legal") + assert query_mock.filter.call_count == 1 + + def test_no_filter_without_source_type(self): + """Without source_type param, no filter should be applied.""" + db_mock = MagicMock() + query_mock = MagicMock() + db_mock.query.return_value = query_mock + query_mock.order_by.return_value = query_mock + query_mock.offset.return_value = query_mock + query_mock.limit.return_value = query_mock + query_mock.all.return_value = [] + + # Without filter + result = db_mock.query(AllowedSourceDB) + result = result.order_by(AllowedSourceDB.name) + # filter NOT called → count should be 0 + assert query_mock.filter.call_count == 0 + + +class TestCategoryFilter: + """Tests that list_pii_rules correctly applies the category filter.""" + + def test_category_filter_applied(self): + """category param should be passed to DB query filter.""" + db_mock = MagicMock() + query_mock = MagicMock() + db_mock.query.return_value = query_mock + query_mock.filter.return_value = query_mock + query_mock.order_by.return_value = query_mock + query_mock.all.return_value = [] + + # Simulate filter for category='financial' + result = db_mock.query(PIIRuleDB) + result = result.filter(PIIRuleDB.category == "financial") + assert query_mock.filter.call_count == 1 + + def test_category_values(self): + """All valid category values should be accepted by PIIRuleCreate.""" + categories = ["pii", "financial", "health", "id", "location", "other"] + for cat in categories: + req = PIIRuleCreate(name=f"Rule {cat}", category=cat) + assert req.category == cat + + +# ============================================================================= +# Audit Log Helper Tests +# ============================================================================= + +class TestLogAudit: + def test_creates_audit_entry(self): + db_mock = MagicMock() + entity_id = uuid.uuid4() + + _log_audit( + db_mock, + action="create", + entity_type="source", + entity_id=entity_id, + new_values={"name": "Test Source", "domain": "example.com"}, + ) + + db_mock.add.assert_called_once() + audit_obj = db_mock.add.call_args[0][0] + assert isinstance(audit_obj, SourcePolicyAuditDB) + assert audit_obj.action == "create" + assert audit_obj.entity_type == "source" + + def test_creates_audit_entry_with_old_values(self): + db_mock = MagicMock() + entity_id = uuid.uuid4() + + _log_audit( + db_mock, + action="update", + entity_type="source", + entity_id=entity_id, + old_values={"name": "Old Name"}, + new_values={"name": "New Name"}, + ) + + audit_obj = db_mock.add.call_args[0][0] + assert audit_obj.action == "update" + assert audit_obj.old_values == {"name": "Old Name"} + assert audit_obj.new_values == {"name": "New Name"} + + def test_creates_audit_entry_for_delete(self): + db_mock = MagicMock() + entity_id = uuid.uuid4() + + _log_audit( + db_mock, + action="delete", + entity_type="pii_rule", + entity_id=entity_id, + old_values={"name": "Deleted Rule"}, + ) + + audit_obj = db_mock.add.call_args[0][0] + assert audit_obj.action == "delete" + assert audit_obj.entity_type == "pii_rule" + + def test_add_called_without_commit(self): + """_log_audit calls db.add() but NOT db.commit() — commit happens at the endpoint level.""" + db_mock = MagicMock() + _log_audit(db_mock, "create", "source", uuid.uuid4()) + db_mock.add.assert_called_once() + db_mock.commit.assert_not_called() diff --git a/docs-src/services/sdk-modules/dokumentations-module.md b/docs-src/services/sdk-modules/dokumentations-module.md new file mode 100644 index 0000000..263ba81 --- /dev/null +++ b/docs-src/services/sdk-modules/dokumentations-module.md @@ -0,0 +1,318 @@ +# Dokumentations-Module (Paket 3 + ergänzende Module) + +Diese Seite beschreibt die sechs Module, die die Compliance-Dokumentation vervollständigen: +**VVT**, **Training**, **Source Policy**, **Document Generator**, **Audit Checklist** und **Audit Report**. +Alle Module sind vollständig backend-persistent und bieten CRUD-Operationen über die REST-API. + +--- + +## Übersicht + +| Modul | SDK-Route | Paket | Checkpoint | Status | +|-------|-----------|-------|-----------|--------| +| [VVT](#vvt) | `/sdk/vvt` | Dokumentation | CP-VVT (REQUIRED / DSB) | 100% | +| [Source Policy](#source-policy) | `/sdk/source-policy` | Vorbereitung | CP-SPOL (REQUIRED) | 100% | +| [Document Generator](#document-generator) | `/sdk/document-generator` | Rechtliche Texte | CP-DOCGEN (RECOMMENDED) | 100% | +| [Audit Checklist](#audit-checklist) | `/sdk/audit-checklist` | Analyse | CP-CHK (RECOMMENDED) | 100% | +| [Audit Report](#audit-report) | `/sdk/audit-report` | Analyse | CP-AREP (REQUIRED) | 100% | +| [Training Engine](#training) | `/sdk/training` | Betrieb | CP-TRAIN (REQUIRED) | 100% | + +--- + +## VVT + +**Route:** `/sdk/vvt` | **Backend:** `backend-compliance:8002` | **Rechtsgrundlage:** Art. 30 DSGVO + +### Funktionen + +- Anlegen, Bearbeiten und Löschen von Verarbeitungstätigkeiten (CRUD) +- Eindeutiger VVT-ID pro Tätigkeit (z.B. `VVT-001`) +- Vollständige Dokumentation je Tätigkeit: Zweck, Rechtsgrundlage, Datenkategorien, Empfänger, Drittlandtransfers, Löschfristen, TOMs +- Organisationsweite Metadaten: DSB-Kontakt, Branche, Standorte, Mitarbeiterzahl +- Audit-Log für alle Änderungen (CREATE / UPDATE / DELETE) +- Statistik-Endpoint: Gesamt, nach Status, nach Geschäftsfunktion, DSFA-pflichtige Tätigkeiten +- JSON-Export aller Aktivitäten +- Status-Workflow: `DRAFT` → `REVIEW` → `APPROVED` → `ARCHIVED` +- Schutzstufenklassifizierung: `LOW` / `MEDIUM` / `HIGH` / `CRITICAL` +- Profiling-Assistent (UI-seitig) zur Vorbefüllung + +### API-Endpoints + +| Methode | Pfad | Beschreibung | +|---------|------|--------------| +| `GET` | `/api/compliance/vvt/organization` | Organisationsheader laden | +| `PUT` | `/api/compliance/vvt/organization` | Organisationsheader speichern | +| `GET` | `/api/compliance/vvt/activities` | Alle Tätigkeiten (Filter: status, business_function) | +| `POST` | `/api/compliance/vvt/activities` | Neue Tätigkeit anlegen | +| `GET` | `/api/compliance/vvt/activities/{id}` | Einzelne Tätigkeit | +| `PUT` | `/api/compliance/vvt/activities/{id}` | Tätigkeit aktualisieren | +| `DELETE` | `/api/compliance/vvt/activities/{id}` | Tätigkeit löschen | +| `GET` | `/api/compliance/vvt/audit-log` | Änderungshistorie | +| `GET` | `/api/compliance/vvt/export` | JSON-Export aller Tätigkeiten | +| `GET` | `/api/compliance/vvt/stats` | Statistiken | + +### DB-Tabellen + +| Tabelle | Modus | Beschreibung | +|---------|-------|--------------| +| `compliance_vvt_organization` | read/write | Organisationsweite Metadaten | +| `compliance_vvt_activities` | read/write | Verarbeitungstätigkeiten | +| `compliance_vvt_audit_log` | write | Änderungsprotokoll | + +### Datenmodell (Aktivität) + +```json +{ + "vvt_id": "VVT-001", + "name": "Gehaltsabrechnung", + "purposes": ["Vertragserfüllung"], + "legal_bases": ["Art. 6 Abs. 1b DSGVO"], + "data_subject_categories": ["Mitarbeiter"], + "personal_data_categories": ["Bankdaten", "Steuer-ID"], + "recipient_categories": ["Steuerberater"], + "third_country_transfers": [], + "retention_period": {"years": 10, "basis": "§ 257 HGB"}, + "protection_level": "HIGH", + "dpia_required": false, + "status": "APPROVED" +} +``` + +--- + +## Source Policy + +**Route:** `/sdk/source-policy` | **Backend:** `backend-compliance:8002` | **Rechtsgrundlage:** Art. 5 DSGVO + +### Funktionen + +- Verwaltung erlaubter Compliance-Rechtsquellen (Gesetze, Leitlinien, Standards) +- Filter nach Quelltyp (`legal`, `guidance`, `template`, `technical`, `other`) und Lizenz +- PII-Regelwerk: Definition sensibler Datenkategorien (E-Mail, IBAN, Personalausweis, etc.) +- Filter nach PII-Kategorie (pii, financial, health, id, location, other) +- Quell-Operations-Matrix: Welche Operationen auf welchen Quellen sind erlaubt +- Policy-Audit-Log: Nachvollziehbare Protokollierung aller Policy-Änderungen +- Policy-Statistiken: Zusammenfassung des Compliance-Status +- Compliance-Report: Gesamtübersicht aller aktiven Quellen und Regeln + +### API-Endpoints + +| Methode | Pfad | Beschreibung | +|---------|------|--------------| +| `GET` | `/api/source-policy/sources` | Quellen (Filter: source_type, license, active_only) | +| `POST` | `/api/source-policy/sources` | Neue Quelle anlegen | +| `PUT` | `/api/source-policy/sources/{id}` | Quelle aktualisieren | +| `DELETE` | `/api/source-policy/sources/{id}` | Quelle löschen | +| `GET` | `/api/source-policy/pii-rules` | PII-Regeln (Filter: category) | +| `POST` | `/api/source-policy/pii-rules` | Neue PII-Regel | +| `PUT` | `/api/source-policy/pii-rules/{id}` | PII-Regel aktualisieren | +| `DELETE` | `/api/source-policy/pii-rules/{id}` | PII-Regel löschen | +| `GET` | `/api/source-policy/operations-matrix` | Operations-Matrix | +| `GET` | `/api/source-policy/policy-stats` | Statistiken | +| `GET` | `/api/source-policy/compliance-report` | Compliance-Report | + +### DB-Tabellen + +| Tabelle | Modus | Beschreibung | +|---------|-------|--------------| +| `compliance_allowed_sources` | read/write | Erlaubte Rechtsquellen | +| `compliance_pii_rules` | read/write | PII-Erkennungsregeln | +| `compliance_source_operations` | read/write | Operations-Matrix | +| `compliance_source_policy_audit` | write | Audit-Trail | + +--- + +## Document Generator + +**Route:** `/sdk/document-generator` | **Backend:** breakpilot-core (Template-Service) | **Rechtsgrundlage:** Art. 28 DSGVO, DDG § 5 + +### Funktionen + +- Generierung rechtlicher Dokumente aus Templates: Impressum, AVV, Datenschutzrichtlinie, NDA +- Templates werden aus `bp_legal_templates` (RAG-Collection) geladen +- Unternehmensspezifische Befüllung aus Company Profile +- **PDF-Export** direkt im Browser via `window.print()` — kein Server-seitiger Service erforderlich +- Fallback-Banner: Wenn der Template-Service (breakpilot-core) nicht erreichbar ist, erscheint ein informativer Hinweis +- Attributionsnachweis: Verwendete Rechtsquellen werden im Dokument aufgeführt + +### Generierte Dokumente + +| Dokument | Rechtsgrundlage | Format | +|----------|-----------------|--------| +| Impressum | DDG § 5 (ehemals TMG) | HTML / PDF | +| Auftragsverarbeitungsvertrag (AVV) | Art. 28 DSGVO | HTML / PDF | +| Datenschutzerklärung | Art. 13, 14 DSGVO | HTML / PDF | +| NDA / Vertraulichkeitsvereinbarung | GeschGehG | HTML / PDF | + +### PDF-Export + +Der PDF-Export öffnet ein neues Browser-Fenster mit dem vollständig formatierten Dokument +und löst automatisch den Browser-Druckdialog aus (`window.print()`). Keine zusätzliche +Server-Dependency erforderlich. + +``` +[Als PDF exportieren] → window.open() → Dokument-HTML → window.print() → Browser-PDF-Dialog +``` + +--- + +## Audit Checklist + +**Route:** `/sdk/audit-checklist` | **Backend:** `backend-compliance:8002` | **Rechtsgrundlage:** Art. 5 Abs. 2 DSGVO (Rechenschaftspflicht) + +### Funktionen + +- Session-Management: Neue Audit-Sitzung erstellen (Name, Auditor, Scope) +- Status-Workflow: `draft` → `in_progress` → `completed` → `archived` +- Automatische Befüllung der Checkliste aus Requirements und Controls +- Interaktiver Sign-Off-Workflow: Konform / Teilweise / Nicht konform / Nicht geprüft +- Digitale Signatur-Hash (SHA-256) pro Prüfpunkt für Unveränderlichkeitsnachweis +- Notizen-Bearbeitung je Prüfpunkt +- **PDF-Download** in Deutsch oder Englisch (`GET /sessions/{id}/report/pdf`) +- JSON-Export der gesamten Checkliste +- Session-History: Übersicht vergangener Audit-Sitzungen + +### API-Endpoints + +| Methode | Pfad | Beschreibung | +|---------|------|--------------| +| `GET` | `/api/compliance/audit/sessions` | Alle Sitzungen | +| `POST` | `/api/compliance/audit/sessions` | Neue Sitzung | +| `PUT` | `/api/compliance/audit/sessions/{id}` | Sitzung aktualisieren (Status) | +| `GET` | `/api/compliance/audit/checklist/{sessionId}` | Checkliste laden | +| `PUT` | `/api/compliance/audit/checklist/{sessionId}/items/{reqId}/sign-off` | Prüfpunkt abzeichnen | +| `GET` | `/api/compliance/audit/sessions/{sessionId}/report/pdf` | PDF-Report (lang=de/en) | + +!!! warning "Korrekter PDF-Endpunkt" + Der PDF-Download-Endpunkt lautet `/sessions/{id}/**report**/pdf`, nicht `/sessions/{id}/pdf`. + Dieser Fehler war in früheren Versionen vorhanden und wurde behoben. + +### DB-Tabellen + +| Tabelle | Modus | Beschreibung | +|---------|-------|--------------| +| `compliance_audit_sessions` | read/write | Audit-Sitzungen | +| `compliance_audit_signoffs` | write | Prüfpunkt-Abzeichnungen mit Signatur-Hash | +| `compliance_requirements` | read | Prüfpunkte aus Requirements | + +### PDF-Generierung + +Die PDF-Reports werden serverseitig mit **ReportLab 4.2.5** generiert und enthalten: +- Deckblatt mit Audit-Metadaten +- Zusammenfassung mit Ampelstatus +- Statistik-Kreisdiagramm (konform / nicht konform / ausstehend) +- Prüfpunkt-Details mit Notizen und digitalem Signatur-Hash +- Anhang: Nicht-konforme Punkte mit Handlungsempfehlungen + +--- + +## Audit Report + +**Route:** `/sdk/audit-report` und `/sdk/audit-report/{sessionId}` | **Backend:** `backend-compliance:8002` | **Rechtsgrundlage:** Art. 5 Abs. 2 DSGVO + +### Funktionen + +- Übersicht aller Audit-Sitzungen mit Status-Badges (Entwurf / In Bearbeitung / Abgeschlossen / Archiviert) +- Detail-Seite pro Sitzung: + - Sitzungs-Metadaten (Auditor, Organisation, Zeitraum) + - Fortschrittsbalken mit Farbkodierung (grün ≥ 80%, gelb ≥ 50%, rot < 50%) + - Statistik-Kacheln (konform / nicht konform / ausstehend) + - Interaktive Prüfpunkte mit nachträglichem Sign-Off + - Notizen-Bearbeitung per Prüfpunkt + - PDF-Download mit Sprachauswahl (DE / EN) +- Navigation: Klick auf eine Sitzung in der Übersicht öffnet die Detail-Seite + +### API-Endpoints + +Nutzt dieselben Backend-Endpoints wie Audit Checklist (s.o.). + +### DB-Tabellen + +| Tabelle | Modus | Beschreibung | +|---------|-------|--------------| +| `compliance_audit_sessions` | read/write | Sitzungsdaten inkl. Fortschritt | +| `compliance_audit_signoffs` | read/write | Nachträgliche Prüfpunkt-Aktualisierungen | + +--- + +## Training Engine + +**Route:** `/sdk/training` | **Backend:** `ai-compliance-sdk:8093` (Go) | **Rechtsgrundlage:** Art. 39 Abs. 1b DSGVO, EU AI Act Art. 4 + +### Funktionen + +- **28 vordefinierte Schulungsmodule** für DSGVO, ISO 27001, AI Act, Hinweisgeberschutz u.a. +- Modul-Typen: Jährlich (`annual`), Ereignisbasiert (`event_trigger`), Mikro-Schulung (`micro`) +- Quiz-System: Automatisch generierte Fragen mit konfigurierbarer Bestehensgrenze +- Zertifikate bei erfolgreichem Abschluss +- Schulungsmatrix: Rollen-basierte Pflichtmodulzuordnung (CISO, DSB, Entwickler, etc.) +- Aufgabenzuweisung: Schulungen können Mitarbeitern zugewiesen werden +- Eskalation: Automatische Erinnerungen bei überfälligen Pflichtschulungen +- KI-generierter Content: Schulungsinhalte können via Ollama-LLM automatisch generiert werden +- Audit-Log: Vollständige Nachverfolgung aller Schulungsaktivitäten + +### API-Endpoints + +| Methode | Pfad | Beschreibung | +|---------|------|--------------| +| `GET` | `/sdk/v1/training/modules` | Alle Module (Filter: regulation_area, frequency_type, search) | +| `POST` | `/sdk/v1/training/modules` | Neues Modul anlegen | +| `GET` | `/sdk/v1/training/modules/{id}` | Modul mit Content und Quiz-Fragen | +| `PUT` | `/sdk/v1/training/modules/{id}` | Modul aktualisieren | +| `GET` | `/sdk/v1/training/matrix` | Schulungsmatrix | +| `POST` | `/sdk/v1/training/matrix` | Matrix-Eintrag setzen | +| `GET` | `/sdk/v1/training/assignments` | Schulungszuweisungen | +| `POST` | `/sdk/v1/training/assignments/compute` | Zuweisungen für Nutzer berechnen | +| `POST` | `/sdk/v1/training/assignments/{id}/complete` | Schulung abschließen | +| `GET` | `/sdk/v1/training/quiz/{moduleId}` | Quiz-Fragen laden | +| `POST` | `/sdk/v1/training/quiz/{moduleId}/submit` | Quiz-Antworten einreichen | +| `GET` | `/sdk/v1/training/stats` | Schulungsstatistiken | +| `GET` | `/sdk/v1/training/deadlines` | Fällige Schulungen | +| `POST` | `/sdk/v1/training/escalation/check` | Eskalationen prüfen | +| `POST` | `/sdk/v1/training/content/generate` | KI-Content generieren (Ollama) | + +### DB-Tabellen (ai-compliance-sdk PostgreSQL) + +| Tabelle | Modus | Beschreibung | +|---------|-------|--------------| +| `training_modules` | read/write | Schulungsmodule mit Metadaten | +| `training_assignments` | read/write | Mitarbeiterzuweisungen | +| `training_quiz_questions` | read/write | Quiz-Fragen je Modul | +| `training_quiz_attempts` | read/write | Quiz-Versuche und Ergebnisse | +| `training_matrix_entries` | read/write | Rollen-Modul-Zuordnung | +| `training_audit_log` | write | Aktivitätsprotokoll | + +### Vordefinierte Module (Auswahl) + +| Code | Titel | Bereich | Typ | +|------|-------|---------|-----| +| `DSGVO-BASIC` | DSGVO Grundlagen | dsgvo | annual | +| `DSGVO-BREACH` | Datenpannen und Meldepflichten | dsgvo | event_trigger | +| `DSGVO-DSR` | Betroffenenrechte | dsgvo | annual | +| `AI-BAS` | KI-Kompetenz Grundlagen | ai_act | annual | +| `AI-RISK` | Hochrisiko-KI-Systeme | ai_act | event_trigger | +| `ISMS-AUD` | ISMS Audit-Vorbereitung | iso27001 | event_trigger | +| `HIN-BAS` | Hinweisgeberschutz | hinschg | annual | +| `PHISH` | Phishing-Erkennung | iso27001 | micro | + +--- + +## Datenfluss + +```mermaid +graph LR + A[Source Policy] --> B[Requirements] + B --> C[Audit Checklist] + C --> D[Audit Report] + D --> E[Obligations] + E --> F[TOMs] + F --> G[Löschfristen] + G --> H[VVT] + + I[Document Generator] --> J[Workflow] + K[Academy] --> L[Training Engine] +``` + +Die **Source Policy** bildet die Grundlage für alle nachfolgenden Analyse-Schritte. +Das **VVT** ist der abschließende Schritt der Dokumentationsphase und baut auf TOMs und Löschfristen auf. +Die **Training Engine** operiert parallel im Betrieb-Paket und liefert Evidence für Audits. diff --git a/mkdocs.yml b/mkdocs.yml index c3f66ec..71c06c4 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -66,6 +66,7 @@ nav: - Uebersicht: services/document-crawler/index.md - SDK Module: - Analyse-Module (Paket 2): services/sdk-modules/analyse-module.md + - Dokumentations-Module (Paket 3+): services/sdk-modules/dokumentations-module.md - Academy: services/sdk-modules/academy.md - Whistleblower: services/sdk-modules/whistleblower.md - Incidents: services/sdk-modules/incidents.md