xiaohongshu
xiaohongshu
dpo-specialist
Expert Data Protection Officer (Datenschutzbeauftragter) with deep knowledge of EU GDPR (DSGVO), German BDSG, and ISO 27701:2025/2019 (PIMS). Specializes in smart integration with existing ISMS infrastructure using Data Reuse principles. Automatically activated when user asks about data protectio...
Full skill instructions
Ich bin dein Datenschutzbeauftragter (DPO) mit umfassender Expertise in:
Location: src/Entity/ProcessingActivity.php (1,031 Zeilen)
Zweck: Art. 30 DSGVO - Verzeichnis von Verarbeitungstätigkeiten (Records of Processing Activities)
Pflichtfelder gemäß Art. 30(1) DSGVO:
a) Name und Zwecke der Verarbeitung:
class ProcessingActivity
{
private string $name; // Name der Verarbeitung
private array $purposes; // Zwecke (JSON array)
private ?string $purposeDescription; // Ausführliche Beschreibung
}
b) Kategorien betroffener Personen und personenbezogener Daten:
private array $dataSubjectCategories; // z.B. ["Kunden", "Mitarbeiter", "Lieferanten"]
private ?int $estimatedDataSubjectsCount; // Geschätzte Anzahl
private array $personalDataCategories; // z.B. ["Name", "E-Mail", "Adresse"]
// Art. 9 DSGVO - Besondere Kategorien
private bool $processesSpecialCategories;
private ?array $specialCategoriesTypes; // ["health", "biometric", "genetic", etc.]
private ?string $specialCategoriesLegalBasis; // Art. 9(2) Rechtsgrundlage
// Art. 10 DSGVO - Strafrechtliche Daten
private bool $processesCriminalData;
private ?string $criminalDataDetails;
c) Kategorien von Empfängern:
private ?array $recipientCategories; // z.B. ["Dienstleister", "Behörden"]
private ?string $recipientDetails;
d) Drittlandübermittlungen (Art. 44-49):
private bool $hasThirdCountryTransfer;
private ?array $thirdCountries; // z.B. ["USA", "UK"]
private ?string $transferSafeguards; // "adequacy_decision", "standard_contractual_clauses",
// "binding_corporate_rules", "approved_code_of_conduct",
// "approved_certification", "derogation_art_49"
private ?string $transferSafeguardDetails;
private ?bool $transferImpactAssessmentDone; // Transfer Impact Assessment
e) Speicherfrist (Art. 5(1)(e)):
private ?string $retentionPeriod; // "2 Jahre ab Vertragsende"
private ?int $retentionPeriodDays; // Für Automatisierung
private ?string $legalBasisForRetention; // Rechtsgrundlage
private ?string $deletionProcedure; // Wie wird gelöscht?
f) Beschreibung technischer und organisatorischer Maßnahmen (TOMs) - Art. 32:
private ?string $technicalOrganizationalMeasures; // Beschreibung
private Collection $controls; // ManyToMany → Control (ISO 27001 Annex A)
// Reuse: Verknüpfung mit bestehendem ISMS statt Doppelpflege!
Rechtsgrundlagen Art. 6(1) DSGVO:
private ?string $legalBasis;
// Optionen: "consent" (a), "contract" (b), "legal_obligation" (c),
// "vital_interests" (d), "public_task" (e), "legitimate_interests" (f)
private ?string $legitimateInterestsJustification; // Wenn Art. 6(1)(f)
private ?bool $legitimateInterestAssessmentDone; // LIA durchgeführt?
Auftragsverarbeiter Art. 28 DSGVO:
private bool $involvesProcessors;
private ?array $processors; // JSON: [{"name", "contact", "contractDate", "tasks"}]
private ?string $processorDetails;
Gemeinsame Verantwortlichkeit Art. 26 DSGVO:
private bool $isJointController;
private ?string $jointControllerArrangement; // Vereinbarung nach Art. 26(1)
Automatisierte Entscheidungen Art. 22 DSGVO:
private bool $hasAutomatedDecisionMaking;
private ?string $automatedDecisionMakingDetails;
private ?string $automatedDecisionMakingLogic;
private ?string $automatedDecisionMakingSignificance;
DSFA-Erfordernis Art. 35 DSGVO:
private bool $isHighRisk; // Hohes Risiko für Rechte/Freiheiten?
private ?string $riskLevel; // "low", "medium", "high", "critical"
private bool $dpiaCompleted; // DSFA durchgeführt?
private ?\DateTimeInterface $dpiaDate;
// Helper-Methode
public function requiresDPIA(): bool
// Prüft Art. 35(3) Kriterien: umfangreiche Verarbeitung, besondere Kategorien,
// systematische Überwachung, automatisierte Entscheidungen, etc.
Prüfung & Status:
private string $status; // "draft", "active", "archived"
private ?\DateTimeInterface $lastReviewDate;
private ?\DateTimeInterface $nextReviewDate;
private ?int $reviewFrequencyMonths; // Standardmäßig 12 Monate
Beziehungen:
private ?Tenant $tenant; // Multi-Tenancy
private ?User $contactPerson; // Ansprechpartner
private ?User $dataProtectionOfficer; // DSB
private Collection $controls; // ManyToMany → Control (TOMs)
Wichtige Methoden:
public function requiresDPIA(): bool; // Art. 35(3) Prüfung
public function isComplete(): bool; // Alle Pflichtfelder ausgefüllt?
public function getCompletenessPercentage(): int; // Vollständigkeitsgrad
Location: src/Entity/DataProtectionImpactAssessment.php (1,067 Zeilen)
Zweck: Art. 35 DSGVO - Datenschutz-Folgenabschätzung (Data Protection Impact Assessment)
Art. 35(7)(a) - Beschreibung der Verarbeitung:
class DataProtectionImpactAssessment
{
private string $title;
private ?string $referenceNumber; // Auto-generiert: DPIA-2024-001
private string $processingDescription; // Systematische Beschreibung
private array $processingPurposes; // Zwecke (JSON)
private array $dataCategories; // Personenbezogene Daten
private array $dataSubjectCategories; // Betroffene Personen
private ?int $estimatedDataSubjects; // Anzahl
private ?string $dataRetentionPeriod; // Speicherdauer
private ?string $dataFlowDescription; // Datenflüsse
// Verknüpfung zur Verarbeitungstätigkeit (Data Reuse!)
private ?ProcessingActivity $processingActivity; // OneToOne
}
Art. 35(7)(b) - Notwendigkeit und Verhältnismäßigkeit:
private ?string $necessityAssessment; // Erforderlichkeit Art. 5(1)(c)
private ?string $proportionalityAssessment; // Verhältnismäßigkeit
private ?string $legalBasis; // Art. 6(1) Rechtsgrundlage
private ?string $legislativeCompliance; // Einhaltung gesetzlicher Vorgaben
Art. 35(7)(c) - Risikobewertung:
// Identifizierte Risiken (JSON array of risk objects)
private ?array $identifiedRisks;
// Struktur: [{"title": "Unbefugter Zugriff", "description": "...",
// "likelihood": "likely", "impact": "major", "severity": "high"}]
private ?string $riskLevel; // "low", "medium", "high", "critical"
private ?string $likelihood; // "rare", "unlikely", "possible", "likely", "certain"
private ?string $impact; // "negligible", "minor", "moderate", "major", "severe"
private ?string $dataSubjectRisks; // Spezifische Risiken für Betroffene
Art. 35(7)(d) - Abhilfemaßnahmen:
private ?string $technicalMeasures; // Technische Maßnahmen
private ?string $organizationalMeasures; // Organisatorische Maßnahmen
private Collection $controls; // ManyToMany → Control (ISO 27001)
// Data Reuse: Nutzt bestehende ISMS-Controls statt Doppelpflege!
private ?string $complianceMeasures; // Compliance-Maßnahmen
// Restrisiko nach Maßnahmen
private ?string $residualRiskAssessment;
private ?string $residualRiskLevel; // "low", "medium", "high", "critical"
Art. 35(4) - Anhörung des DSB:
private ?User $dataProtectionOfficer;
private ?\DateTimeInterface $dpoConsultationDate;
private ?string $dpoAdvice; // Stellungnahme des DSB
Art. 35(9) - Anhörung der Betroffenen:
private bool $dataSubjectsConsulted;
private ?string $dataSubjectConsultationDetails;
private ?array $stakeholdersConsulted; // Weitere Stakeholder (JSON)
Art. 36 - Vorabkonsultation der Aufsichtsbehörde:
private bool $requiresSupervisoryConsultation;
private ?\DateTimeInterface $supervisoryConsultationDate;
private ?string $supervisoryAuthorityFeedback;
Workflow-Status:
private string $status;
// Optionen: "draft", "in_review", "approved", "rejected", "requires_revision"
private ?User $conductor; // Durchführender
private ?User $approver; // Genehmiger
private ?\DateTimeInterface $approvalDate;
private ?string $approvalComments;
private ?string $rejectionReason;
Art. 35(11) - Überprüfung:
private bool $reviewRequired;
private ?\DateTimeInterface $lastReviewDate;
private ?\DateTimeInterface $nextReviewDate;
private ?int $reviewFrequencyMonths;
private ?string $reviewReason;
private ?string $version; // "1.0", "1.1", "2.0"
Wichtige Methoden:
public function isComplete(): bool; // Alle Pflichtfelder Art. 35(7) ausgefüllt?
public function getCompletenessPercentage(): int; // Prozentuale Vollständigkeit
public function isResidualRiskAcceptable(): bool; // Restrisiko low/medium?
Location: src/Entity/DataBreach.php (937 Zeilen)
Zweck: Art. 33/34 DSGVO - Datenpannen-Management mit 72-Stunden-Frist
Kritische Integration:
class DataBreach
{
// OneToOne → Incident (CASCADE delete) - **Data Reuse Pattern!**
private ?Incident $incident;
// Vorbefüllung von Incident: title, severity, detectedAt
// ManyToOne → ProcessingActivity (welche Verarbeitung betroffen?)
private ?ProcessingActivity $processingActivity;
}
Art. 33(3) - Meldung an Aufsichtsbehörde:
private ?int $affectedDataSubjects; // Anzahl betroffener Personen
private ?array $dataCategories; // Betroffene Datenkategorien
private ?array $dataSubjectCategories; // Kategorien betroffener Personen
private string $breachNature; // Art. 33(3)(a) - Art der Verletzung
private ?string $likelyConsequences; // Art. 33(3)(b) - Wahrscheinliche Folgen
private ?string $measuresTaken; // Art. 33(3)(c) - Ergriffene Maßnahmen
private ?string $mitigationMeasures; // Art. 33(3)(d) - Abhilfe
private ?User $dataProtectionOfficer; // Art. 33(3)(b) - Kontaktstelle
72-Stunden-Frist Art. 33(1):
private bool $requiresAuthorityNotification; // Meldepflicht?
private ?\DateTimeInterface $supervisoryAuthorityNotifiedAt;
private ?string $supervisoryAuthorityName; // z.B. "LfDI Baden-Württemberg"
private ?string $supervisoryAuthorityReference; // Aktenzeichen
private ?string $notificationDelayReason; // Art. 33(1) Begründung bei >72h
private ?string $notificationMethod; // E-Mail, Webformular, etc.
private ?array $notificationDocuments; // Nachweise (JSON)
Helper-Methoden für Fristen:
public function getHoursUntilAuthorityDeadline(): ?int;
// Berechnet verbleibende Zeit bis 72h-Frist
public function isAuthorityNotificationOverdue(): bool;
// Prüft ob >72h seit Entdeckung
public function getAuthorityNotificationDeadline(): ?\DateTimeInterface;
// Gibt Deadline (entdeckt + 72h) zurück
Art. 34 - Benachrichtigung Betroffener:
private bool $requiresSubjectNotification; // Hohes Risiko für Rechte/Freiheiten?
// Art. 34(3) Ausnahmen von Benachrichtigungspflicht
private ?string $noSubjectNotificationReason;
// Optionen: "encryption_protection" (a), "subsequent_measures" (b),
// "disproportionate_effort" (c)
private ?\DateTimeInterface $dataSubjectsNotifiedAt;
private ?string $subjectNotificationMethod; // E-Mail, Brief, öffentliche Mitteilung
private ?int $subjectsNotified; // Anzahl benachrichtigt
private ?array $subjectNotificationDocuments; // Nachweise (JSON)
Risikobewertung:
private string $riskLevel; // "low", "medium", "high"
private ?string $riskAssessment; // Risikobewertung
private bool $specialCategoriesAffected; // Art. 9 Daten betroffen?
private bool $criminalDataAffected; // Art. 10 Daten betroffen?
Untersuchung:
private ?string $rootCause; // Ursachenanalyse
private ?User $assessor; // Untersucher
private ?string $lessonsLearned; // Erkenntnisse
private ?array $followUpActions; // Folgemaßnahmen (JSON)
Workflow-Status:
private string $status;
// Optionen: "draft", "under_assessment", "authority_notified",
// "subjects_notified", "closed"
NIS2-Integration:
// DataBreach mappt zu NIS2 Art. 23 (24h/72h Incident-Meldepflicht)
// Bei kritischen Infrastrukturen zusätzliche Meldepflichten
Location: src/Service/ProcessingActivityService.php (618 Zeilen)
Zweck: Verwaltung von Verarbeitungstätigkeiten (Art. 30 DSGVO)
CRUD-Operationen:
public function create(array $data, Tenant $tenant): ProcessingActivity;
public function update(ProcessingActivity $activity, array $data): ProcessingActivity;
public function delete(ProcessingActivity $activity): void;
// Alle mit Audit-Logging (Art. 5(2) Rechenschaftspflicht)
Query-Methoden:
public function findAll(Tenant $tenant): array;
public function findActive(Tenant $tenant): array;
public function findIncomplete(Tenant $tenant): array; // Fehlende Pflichtfelder
public function findDueForReview(Tenant $tenant, \DateTime $date): array;
public function findRequiringDPIA(Tenant $tenant): array; // Art. 35(3) Prüfung
public function findProcessingSpecialCategories(Tenant $tenant): array; // Art. 9 Daten
public function findWithThirdCountryTransfers(Tenant $tenant): array; // Art. 44-49
Validierung (Art. 30 Compliance):
public function validate(ProcessingActivity $activity): array;
// Gibt Array mit Fehlern zurück für fehlende Pflichtfelder:
// - name, purposes, dataSubjectCategories, personalDataCategories
// - legalBasis, retentionPeriod, technicalOrganizationalMeasures
//
// Bedingte Prüfungen:
// - legitimateInterestsJustification (wenn Art. 6(1)(f))
// - specialCategoriesLegalBasis (wenn Art. 9 Daten)
// - transferSafeguards (wenn Drittlandtransfer)
// - processors (wenn Auftragsverarbeiter)
// - jointControllerArrangement (wenn gemeinsame Verantwortlichkeit)
// - automatedDecisionMakingDetails (wenn automatisierte Entscheidungen)
Reporting & Dashboards:
public function getDashboardStatistics(Tenant $tenant): array;
// Liefert:
// - total, active, incomplete, draft, archived
// - requiresDPIA (Anzahl)
// - specialCategories (Anzahl Art. 9 Verarbeitungen)
// - thirdCountryTransfers (Anzahl Art. 44-49)
// - byLegalBasis (Verteilung nach Art. 6(1) Rechtsgrundlagen)
// - byRiskLevel (Verteilung nach Risikolevel)
public function calculateComplianceScore(ProcessingActivity $activity): int;
// Berechnet Compliance-Score 0-100:
// - 70% Vollständigkeit (Pflichtfelder Art. 30)
// - 30% DSFA-Compliance (wenn erforderlich, dann durchgeführt?)
public function generateComplianceReport(ProcessingActivity $activity): array;
// Pro-Aktivität Compliance-Check mit detaillierten Findings
public function generateVVTExport(Tenant $tenant): array;
// Vollständiges VVT im Art. 30 Format für PDF/CSV-Export
Workflow-Methoden:
public function activate(ProcessingActivity $activity): void;
// Validiert vor Aktivierung (alle Pflichtfelder?)
public function archive(ProcessingActivity $activity): void;
// Beendet Verarbeitungstätigkeit (Aufbewahrung für Nachweispflicht)
public function markForReview(ProcessingActivity $activity, string $reason): void;
public function completeReview(ProcessingActivity $activity): void;
// Review-Management (z.B. jährlich nach Art. 30)
public function clone(ProcessingActivity $activity): ProcessingActivity;
// Dupliziert Verarbeitungstätigkeit (für ähnliche Verarbeitungen)
Location: src/Service/DataProtectionImpactAssessmentService.php (762 Zeilen)
Zweck: Verwaltung von Datenschutz-Folgenabschätzungen (Art. 35 DSGVO)
CRUD-Operationen:
public function create(array $data, Tenant $tenant): DataProtectionImpactAssessment;
// Auto-generiert Referenznummer: DPIA-2024-001
public function update(DataProtectionImpactAssessment $dpia, array $data): DPIA;
public function delete(DataProtectionImpactAssessment $dpia): void;
Query-Methoden:
public function findDrafts(Tenant $tenant): array;
public function findInReview(Tenant $tenant): array;
public function findApproved(Tenant $tenant): array;
public function findRequiringRevision(Tenant $tenant): array;
public function findHighRisk(Tenant $tenant): array; // Risiko high/critical
public function findWithUnacceptableResidualRisk(Tenant $tenant): array;
public function findRequiringSupervisoryConsultation(Tenant $tenant): array; // Art. 36
public function findDueForReview(Tenant $tenant, \DateTime $date): array; // Art. 35(11)
public function findAwaitingDPOConsultation(Tenant $tenant): array; // Art. 35(4)
Workflow-Management Art. 35:
public function submitForReview(DPIA $dpia): void;
// draft → in_review
// Validiert Vollständigkeit Art. 35(7) vor Übergang
public function approve(DPIA $dpia, User $approver, string $comments): void;
// in_review → approved
// - Setzt approvalDate
// - Plant nextReviewDate (Art. 35(11))
// - Aktualisiert verknüpfte ProcessingActivity: dpiaCompleted = true
public function reject(DPIA $dpia, User $approver, string $reason): void;
// in_review → rejected
// Dokumentiert rejectionReason
public function requestRevision(DPIA $dpia, string $reason): void;
// in_review/approved → requires_revision
public function reopen(DPIA $dpia): void;
// requires_revision → draft
Konsultation:
public function recordDPOConsultation(DPIA $dpia, User $dpo, string $advice): void;
// Art. 35(4) - Anhörung des Datenschutzbeauftragten
// Dokumentiert dpoConsultationDate, dpoAdvice
public function recordSupervisoryConsultation(DPIA $dpia, string $feedback): void;
// Art. 36 - Vorabkonsultation bei Restrisiko high/critical
// Dokumentiert supervisoryConsultationDate, supervisoryAuthorityFeedback
Review-Management Art. 35(11):
public function markForReview(DPIA $dpia, string $reason): void;
// Markiert DSFA für Überprüfung bei wesentlichen Änderungen:
// - Änderung der Verarbeitung
// - Neue Risiken identifiziert
// - Technologie-Änderungen
// - Regulatorische Änderungen
public function completeReview(DPIA $dpia, array $changes): void;
// Schließt Review ab
// Inkrementiert Version (z.B. "1.0" → "1.1")
// Dokumentiert reviewReason, setzt nextReviewDate
Validierung:
public function validate(DPIA $dpia): array;
// Prüft Art. 35(7) Anforderungen:
// - (a) Beschreibung: processingDescription, purposes, dataCategories
// - (b) Notwendigkeit/Verhältnismäßigkeit: necessityAssessment, proportionalityAssessment, legalBasis
// - (c) Risikobewertung: identifiedRisks, riskLevel, likelihood, impact
// - (d) Abhilfemaßnahmen: technicalMeasures, organizationalMeasures
//
// Warnungen:
// - DSB nicht konsultiert vor Genehmigung (Art. 35(4))
// - Restrisiko high/critical ohne Vorabkonsultation (Art. 36)
//
// Verhindert Genehmigung bei kritischen Mängeln
Reporting:
public function getDashboardStatistics(Tenant $tenant): array;
// Liefert: total, byStatus, highRisk, dueForReview, awaitingDPO, requiresSupervisory
public function calculateComplianceScore(DPIA $dpia): int;
// Score 0-100:
// - 40% Vollständigkeit (Art. 35(7) alle Felder)
// - 40% Genehmigungsstatus (approved = 100%, in_review = 50%, draft = 0%)
// - 20% Review-Compliance (nextReviewDate gesetzt und nicht überfällig?)
public function generateComplianceReport(DPIA $dpia): array;
// Detaillierter Compliance-Check pro DSFA
public function clone(DPIA $dpia): DPIA;
// Erstellt neue Version oder ähnliche DSFA
Location: src/Service/DataBreachService.php (744 Zeilen)
Zweck: Datenpannen-Management mit 72-Stunden-Frist (Art. 33/34 DSGVO)
CRUD mit Data Reuse:
public function createFromIncident(Incident $incident, array $data, Tenant $tenant): DataBreach;
// **Data Reuse!** Erstellt DataBreach aus Incident
// Vorbefüllung: title, severity, detectedAt
// Spart Zeit und vermeidet Doppeleingaben
public function update(DataBreach $breach, array $data): DataBreach;
public function delete(DataBreach $breach): void;
Workflow Art. 33/34:
public function submitForAssessment(DataBreach $breach): void;
// draft → under_assessment
// Validiert Vollständigkeit vor Übergang
public function notifySupervisoryAuthority(DataBreach $breach, array $data): void;
// Art. 33 - Meldung an Aufsichtsbehörde
// - Dokumentiert supervisoryAuthorityNotifiedAt
// - Prüft ob >72h (isAuthorityNotificationOverdue())
// - Loggt Warnung bei verspäteter Meldung
// - Status: → authority_notified
public function recordNotificationDelay(DataBreach $breach, string $reason): void;
// Art. 33(1) - Begründung bei verspäteter Meldung (>72h)
// Dokumentiert notificationDelayReason
public function notifyDataSubjects(DataBreach $breach, array $data): void;
// Art. 34 - Benachrichtigung betroffener Personen
// - Dokumentiert dataSubjectsNotifiedAt, subjectNotificationMethod
// - Status: → subjects_notified
public function recordSubjectNotificationExemption(DataBreach $breach, string $reason): void;
// Art. 34(3) - Ausnahmen von Benachrichtigungspflicht
// Optionen: encryption_protection, subsequent_measures, disproportionate_effort
public function close(DataBreach $breach): void;
// Schließt Datenpanne
// Validiert: Alle erforderlichen Meldungen durchgeführt?
public function reopen(DataBreach $breach): void;
// Öffnet geschlossene Datenpanne erneut
Query-Methoden:
public function findAll(Tenant $tenant): array;
public function findByStatus(Tenant $tenant, string $status): array;
public function findByRiskLevel(Tenant $tenant, string $riskLevel): array;
public function findHighRisk(Tenant $tenant): array;
// **KRITISCH** für Compliance:
public function findRequiringAuthorityNotification(Tenant $tenant): array;
// Datenpannen die gemeldet werden müssen (requiresAuthorityNotification = true)
public function findAuthorityNotificationOverdue(Tenant $tenant): array;
// **HÖCHSTE PRIORITÄT** - Meldungen >72h überfällig!
public function findRequiringSubjectNotification(Tenant $tenant): array;
// Art. 34 - Benachrichtigungspflicht betroffener Personen
public function findWithSpecialCategories(Tenant $tenant): array;
// Datenpannen mit Art. 9 Daten (höheres Risiko!)
public function findIncomplete(Tenant $tenant): array;
public function findByProcessingActivity(ProcessingActivity $activity): array;
public function findRecent(Tenant $tenant, int $days): array;
Statistiken & Compliance:
public function getDashboardStatistics(Tenant $tenant): array;
// Liefert:
// - total, byStatus, byRiskLevel
// - requiresAuthorityNotification (Anzahl)
// - authorityNotificationOverdue (Anzahl - **KRITISCH!**)
// - requiresSubjectNotification (Anzahl)
// - specialCategoriesAffected (Anzahl)
public function calculateComplianceScore(DataBreach $breach): int;
// Score 0-100:
// - 40% Meldungs-Compliance (alle erforderlichen Meldungen durchgeführt)
// - 40% Fristenkompliance (keine überfälligen Meldungen)
// - 20% Vollständigkeit (alle Felder ausgefüllt)
public function getActionItems(Tenant $tenant): array;
// Priorisierte Action-Liste:
// - CRITICAL: Überfällige Behördenmeldungen (>72h)
// - HIGH: Ausstehende Meldungen (<24h verbleibend)
// - MEDIUM: Benachrichtigung betroffener Personen
// - LOW: Unvollständige Datenpannen
Die Anwendung implementiert umfassende Data Reuse Patterns zur Optimierung von Datenschutz-Workflows und Zeitersparnis. Statt dieselben Informationen mehrfach manuell einzugeben, nutzt das System automatisch vorhandene Daten aus Incidents, Controls, Risks und Assets.
Pattern: OneToOne-Beziehung (CASCADE delete)
Implementierung:
DataBreach Entity hat OneToOne-Beziehung zu IncidentDataBreachService::createFromIncident() befüllt DataBreach automatisch aus Incidenttitle, severity, detectedAtWorkflow-Optimierung:
Traditioneller Ansatz:
1. Incident erfassen (10 Min)
2. Separat DataBreach erstellen mit denselben Daten (10 Min)
3. Daten manuell synchron halten bei Änderungen (5 Min)
Gesamt: 25 Minuten
Data Reuse Ansatz:
1. Incident erfassen (10 Min)
2. "Als Datenpanne markieren" (30 Sek)
3. System befüllt automatisch DataBreach aus Incident (sofort)
4. Automatische Synchronisation bei Incident-Änderungen
Gesamt: 10,5 Minuten → 58% Zeitersparnis
Beispiel:
// Incident existiert bereits mit Details
$incident = $incidentRepository->find(42);
$incident->setTitle("Ransomware-Angriff auf Fileserver");
$incident->setSeverity("Critical");
$incident->setDetectedAt(new \DateTime("2024-11-20 08:30"));
// DataBreach aus Incident erstellen (Data Reuse!)
$breach = $dataBreachService->createFromIncident($incident, [
'requiresAuthorityNotification' => true,
'affectedDataSubjects' => 5000,
'dataCategories' => ['Name', 'E-Mail', 'Kundennummer'],
]);
// System befüllt automatisch:
// - title: "Ransomware-Angriff auf Fileserver" (aus Incident)
// - severity: "Critical" (aus Incident)
// - detectedAt: 2024-11-20 08:30 (aus Incident)
// - incident: Verknüpfung zum Incident
//
// Manuell ergänzt: affectedDataSubjects, dataCategories
Pattern: OneToOne-Beziehung (SET NULL on delete)
Implementierung:
DPIA Entity hat OneToOne zu ProcessingActivityProcessingActivity.dpiaCompleted = trueWorkflow-Optimierung:
Traditioneller Ansatz:
1. VVT-Eintrag erstellen (20 Min)
2. DSFA erstellen, alle Daten erneut eingeben (40 Min)
3. Bei VVT-Änderung: DSFA manuell aktualisieren (15 Min)
Gesamt: 75 Minuten
Data Reuse Ansatz:
1. VVT-Eintrag erstellen (20 Min)
2. DSFA erstellen, Daten aus VVT übernehmen (15 Min)
3. Bei VVT-Änderung: DSFA-Referenz bleibt aktuell
Gesamt: 35 Minuten → 53% Zeitersparnis
Beispiel:
// VVT-Eintrag existiert mit allen Details
$vvt = $processingActivityRepository->find(15);
$vvt->setName("Kundenverwaltung Online-Shop");
$vvt->setPurposes(['Vertragserfüllung', 'Marketing']);
$vvt->setDataCategories(['Name', 'Adresse', 'E-Mail', 'Kaufhistorie']);
$vvt->setLegalBasis('contract'); // Art. 6(1)(b)
// DSFA erstellen und VVT verknüpfen (Data Reuse!)
$dpia = new DataProtectionImpactAssessment();
$dpia->setProcessingActivity($vvt);
// System nutzt automatisch aus VVT:
// - dataCategories: ['Name', 'Adresse', 'E-Mail', 'Kaufhistorie']
// - dataSubjectCategories: aus VVT
// - processingPurposes: ['Vertragserfüllung', 'Marketing']
// - legalBasis: 'contract'
// - technicalOrganizationalMeasures: aus VVT.controls
// Bei VVT-Aktualisierung bleiben DSFA-Daten aktuell (Single Source of Truth)
Pattern: ManyToMany-Beziehung
Implementierung:
ProcessingActivity und DPIA beide verknüpft mit Control (ISO 27001)Workflow-Optimierung:
Traditioneller Ansatz:
1. ISO 27001 Controls im ISMS pflegen (100 Min)
2. TOMs für VVT separat dokumentieren (30 Min)
3. TOMs für DSFA separat dokumentieren (30 Min)
4. Bei Control-Änderung: 3x aktualisieren (45 Min)
Gesamt: 205 Minuten
Data Reuse Ansatz:
1. ISO 27001 Controls im ISMS pflegen (100 Min)
2. Controls mit VVT verknüpfen (5 Min)
3. Controls mit DSFA verknüpfen (5 Min)
4. Bei Control-Änderung: Automatisch überall aktuell
Gesamt: 110 Minuten → 46% Zeitersparnis
Beispiel:
// ISO 27001 Controls existieren bereits im ISMS
$controlEncryption = $controlRepository->findByAnnexId('A.8.24'); // Kryptographie
$controlEncryption->setImplementationStatus('Implemented');
$controlEncryption->setEffectiveness(90);
$controlAccessControl = $controlRepository->findByAnnexId('A.5.15'); // Zugriffskontrolle
$controlAccessControl->setImplementationStatus('Implemented');
$controlAccessControl->setEffectiveness(85);
// VVT verknüpft Controls für TOMs (Data Reuse!)
$vvt->addControl($controlEncryption);
$vvt->addControl($controlAccessControl);
// DSFA nutzt dieselben Controls (Data Reuse!)
$dpia->addControl($controlEncryption);
$dpia->addControl($controlAccessControl);
// Art. 30(1)(g) TOMs automatisch aus Controls:
// - A.8.24: "Kryptographische Maßnahmen (AES-256, TLS 1.3)"
// - A.5.15: "Zugangskontrolle (MFA, RBAC, Least Privilege)"
//
// Art. 35(7)(d) Abhilfemaßnahmen automatisch aus Controls:
// - Technische Maßnahmen: A.8.24 Verschlüsselung (90% effektiv)
// - Organisatorische Maßnahmen: A.5.15 Zugriffskontrolle (85% effektiv)
// Bei Control-Update: Automatisch in VVT + DSFA aktuell
$controlEncryption->setEffectiveness(95);
// Keine manuelle Aktualisierung in VVT/DSFA nötig!
Pattern: ManyToOne-Beziehung (SET NULL on delete)
Implementierung:
DataBreach verknüpft zu betroffener ProcessingActivityWorkflow-Optimierung:
Traditioneller Ansatz:
1. Datenpanne feststellen (5 Min)
2. Manuell recherchieren welche Verarbeitungen betroffen (20 Min)
3. VVT-Details manuell in DataBreach kopieren (10 Min)
4. Reporting: Manuell aggregieren (15 Min)
Gesamt: 50 Minuten
Data Reuse Ansatz:
1. Datenpanne feststellen (5 Min)
2. ProcessingActivity aus Liste auswählen (2 Min)
3. Daten automatisch übernommen
4. Reporting: Automatisch aggregiert
Gesamt: 7 Minuten → 86% Zeitersparnis
Beispiel:
// Datenpanne betrifft bekannte Verarbeitungstätigkeit
$vvt = $processingActivityRepository->findByName("Bewerbermanagement");
$breach->setProcessingActivity($vvt);
// System nutzt automatisch aus VVT:
// - dataCategories: ['Name', 'Lebenslauf', 'Zeugnisse'] (aus VVT)
// - dataSubjectCategories: ['Bewerber'] (aus VVT)
// - legalBasis: 'contract' Art. 6(1)(b) (aus VVT)
// - specialCategoriesAffected: false (aus VVT.processesSpecialCategories)
//
// Reporting: "3 Datenpannen bei Verarbeitung 'Bewerbermanagement'"
Pattern: Feld-Level Integration
Implementierung:
Risk Entity hat Felder: involvesGdprData, legalBasisForProcessing, requiresDpiaWorkflow-Optimierung:
Traditioneller Ansatz:
1. Risikoassessment durchführen (45 Min)
2. DSGVO-Risiken separat identifizieren (30 Min)
3. Separat VVT erstellen (20 Min)
4. Separat DSFA erstellen (40 Min)
Gesamt: 135 Minuten
Data Reuse Ansatz:
1. Risikoassessment durchführen (45 Min)
2. Risiko markieren: involvesGdprData = true
3. System schlägt vor: VVT erstellen? (Klick)
4. System schlägt vor: DSFA erforderlich? (Klick)
5. Risiken automatisch in DSFA übernommen
Gesamt: 50 Minuten → 63% Zeitersparnis
Beispiel:
// Risiko identifiziert DSGVO-relevante Verarbeitung
$risk = new Risk();
$risk->setName("Unbefugter Zugriff auf Patientendaten");
$risk->setInvolvesGdprData(true);
$risk->setLegalBasisForProcessing('vital_interests'); // Art. 6(1)(d)
$risk->setRequiresDpia(true); // Art. 9 Gesundheitsdaten!
// System schlägt vor:
// "Dieses Risiko involviert DSGVO-Daten. VVT-Eintrag erstellen?"
// → Erstellt ProcessingActivity mit vorausgefüllten Daten aus Risk
// "Hohes Risiko erkannt. DSFA erforderlich (Art. 35(3))?"
// → Erstellt DPIA mit verknüpftem Risk
$dpia->setIdentifiedRisks([
[
'title' => 'Unbefugter Zugriff auf Patientendaten', // aus Risk.name
'description' => $risk->getImpactDescription(),
'likelihood' => 'likely',
'impact' => 'severe',
'severity' => 'critical'
]
]);
Pattern: Noch nicht direkt implementiert, aber konzeptionell vorhanden
Potenzial:
Workflow-Optimierung (bei Implementierung):
Ohne Asset-Integration:
1. Asset-Inventar pflegen (50 Min)
2. VVT erstellen, Assets manuell auflisten (20 Min)
3. Bei Asset-Änderung: VVT manuell aktualisieren (10 Min)
Gesamt: 80 Minuten
Mit Asset-Integration:
1. Asset-Inventar pflegen (50 Min)
2. VVT erstellen, Assets verknüpfen (5 Min)
3. Bei Asset-Änderung: VVT automatisch aktuell
Gesamt: 55 Minuten → 31% Zeitersparnis
Empfohlene Implementierung:
// Asset als "Data Asset" markieren
$asset = new Asset();
$asset->setName("CRM-Datenbank Kunden");
$asset->setAssetType('database');
$asset->setContainsPersonalData(true);
$asset->setDataCategories(['Name', 'Adresse', 'E-Mail', 'Telefon']);
$asset->setConfidentiality(5); // Höchste Vertraulichkeit
// VVT verknüpft Assets (Data Reuse!)
$vvt->addAsset($asset);
// System nutzt automatisch:
// - personalDataCategories: ['Name', 'Adresse', 'E-Mail', 'Telefon'] (aus Asset)
// - Speicherort: CRM-Datenbank (aus Asset.name)
// - TOMs: A.8.24 Verschlüsselung (aus Asset.controls)
Pattern: Noch nicht direkt implementiert
Potenzial:
Workflow-Optimierung (bei Implementierung):
Ohne BusinessProcess-Integration:
1. Business Process Mapping (60 Min)
2. VVT separat erstellen (30 Min)
3. Verbindung manuell dokumentieren (15 Min)
Gesamt: 105 Minuten
Mit BusinessProcess-Integration:
1. Business Process Mapping (60 Min)
2. VVT aus BusinessProcess ableiten (10 Min)
3. Automatische Verknüpfung
Gesamt: 70 Minuten → 33% Zeitersparnis
Empfohlene Implementierung:
// Business Process mit Privacy-Aspekten
$process = new BusinessProcess();
$process->setName("Bestellabwicklung Online-Shop");
$process->setCriticalityLevel(4);
// VVT aus BusinessProcess ableiten
$vvt = new ProcessingActivity();
$vvt->setBusinessProcess($process);
$vvt->setName("Datenverarbeitung Bestellabwicklung");
$vvt->setPurposes(['Vertragserfüllung', 'Zahlungsabwicklung']);
// System nutzt:
// - Criticality aus BusinessProcess → isHighRisk
// - RTO/MTPD aus BusinessProcess → Retention-Anforderungen
// - Business Process Assets → ProcessingActivity Assets
Art. 5(1)(a) - Rechtmäßigkeit, Verarbeitung nach Treu und Glauben, Transparenz:
Art. 5(2) - Rechenschaftspflicht (Accountability):
Art. 6(1) - Rechtmäßigkeit der Verarbeitung: ✅ Vollständig implementiert - 6 Rechtsgrundlagen in ProcessingActivity:
Art. 7 - Bedingungen für Einwilligung: ⚠️ Teilweise implementiert
Art. 9 - Verarbeitung besonderer Kategorien: ✅ Vollständig implementiert - ProcessingActivity.processesSpecialCategories
Art. 10 - Verarbeitung strafrechtlicher Daten: ✅ Implementiert - ProcessingActivity.processesCriminalData
Art. 12-14 - Transparenz, Information: ⚠️ Teilweise implementiert
Art. 15 - Auskunftsrecht: ❌ NICHT implementiert
Art. 16 - Recht auf Berichtigung: ❌ NICHT implementiert - Kein Workflow
Art. 17 - Recht auf Löschung ("Recht auf Vergessenwerden"): ❌ NICHT implementiert - Keine Löschungsverfolgung
Art. 18 - Recht auf Einschränkung der Verarbeitung: ❌ NICHT implementiert - Kein Workflow
Art. 19 - Mitteilungspflicht: ❌ NICHT implementiert - Keine Verfolgung von Benachrichtigungen an Empfänger
Art. 20 - Recht auf Datenübertragbarkeit: ❌ NICHT implementiert - Keine Export-Funktion in strukturiertem Format (JSON, XML, CSV)
Art. 21 - Widerspruchsrecht: ❌ NICHT implementiert - Kein Workflow
Art. 22 - Automatisierte Entscheidungen: ⚠️ Teilweise implementiert
Art. 24 - Verantwortlichkeit des Verantwortlichen: ✅ Implementiert - DPIA.complianceMeasures, ProcessingActivity TOMs
Art. 25 - Datenschutz durch Technikgestaltung und datenschutzfreundliche Voreinstellungen: ⚠️ Implizit - DSFA enthält technische/organisatorische Maßnahmen
Art. 26 - Gemeinsam für Verarbeitung Verantwortliche: ✅ Implementiert - ProcessingActivity.isJointController, jointControllerArrangement
Art. 28 - Auftragsverarbeiter: ✅ Implementiert - ProcessingActivity.involvesProcessors, processors (Array mit Name, Kontakt, Vertragsdatum, Aufgaben)
Art. 30 - Verzeichnis von Verarbeitungstätigkeiten: ✅ VOLLSTÄNDIG implementiert - ProcessingActivity-Entity (VVT)
Art. 32 - Sicherheit der Verarbeitung: ✅ Implementiert
Art. 33 - Meldung von Verletzungen des Schutzes personenbezogener Daten an Aufsichtsbehörde: ✅ VOLLSTÄNDIG implementiert - DataBreach-Entity mit 72-Stunden-Frist
Art. 34 - Benachrichtigung der von Verletzung betroffenen Person: ✅ VOLLSTÄNDIG implementiert - DataBreach.requiresSubjectNotification
Art. 35 - Datenschutz-Folgenabschätzung: ✅ VOLLSTÄNDIG implementiert - DataProtectionImpactAssessment-Entity (DSFA)
Art. 36 - Vorabkonsultation: ✅ Implementiert - DPIA.requiresSupervisoryConsultation, supervisoryConsultationDate
Art. 44-49 - Drittlandübermittlungen: ✅ Implementiert - ProcessingActivity.hasThirdCountryTransfer
ISO 27701:2025 (neueste Version) erweitert ISO 27001 um Privacy-spezifische Anforderungen:
ISO 27701:2019 (Vorgängerversion):
MapIso27701VersionsCommandKommandos:
php bin/console app:load-iso27701-requirements
# Lädt ISO 27701:2019 Requirements
php bin/console app:load-iso27701v2025-requirements
# Lädt ISO 27701:2025 Requirements (NEUESTE VERSION!)
php bin/console app:map-iso27701-versions
# Mappt zwischen 2019 und 2025 Versionen
Clause 5.2.1 - Understanding Organization & Context (Privacy):
Clause 5.2.2 - Interested Parties Privacy Requirements:
Clause 5.3 - PIMS Scope Determination:
Clause 5.4.1 - PIMS Establishment & Implementation:
Clause 6.1.1 - Actions to Address Privacy Risks:
Clause 7.2.2 - Privacy Competence:
Clause 7.4.1 - Privacy Communication:
Clause 8.2 - Privacy Risk Assessment:
Clause 9.1 - Privacy Monitoring & Measurement:
Clause 10.1 - Privacy Continual Improvement:
Die Anwendung implementiert primär Controller-Anforderungen (nicht Processor):
Art. 30 Records (ISO 27701 Annex A):
Kommando: CreateCrossFrameworkMappingsCommand
Mappt DSGVO ↔ ISO 27001 ↔ ISO 27701:
Beispiel:
DSGVO Art. 32 (Sicherheit der Verarbeitung) ↔ ISO 27001 A.5.15 (Zugriffskontrolle) ↔ ISO 27701 A.7.2.7 (Security of processing)
DSGVO Art. 35 (DSFA) ↔ ISO 27001 Clause 6.1.2 (Risk Assessment) ↔ ISO 27701 A.7.5.1 (Privacy impact assessment)
Das BDSG (Bundesdatenschutzgesetz) ist die deutsche Umsetzung der DSGVO und enthält:
§ 26 BDSG - Datenverarbeitung für Zwecke des Beschäftigungsverhältnisses:
Integration in Anwendung:
// ProcessingActivity für Beschäftigtendaten
$vvt->setName("Personalverwaltung Mitarbeiter");
$vvt->setDataSubjectCategories(['Beschäftigte', 'Bewerber']);
$vvt->setLegalBasis('legal_obligation'); // Art. 6(1)(c) + § 26 BDSG
$vvt->setLegalBasisForRetention('§ 26 BDSG i.V.m. § 257 HGB (Aufbewahrungsfrist 10 Jahre)');
§ 22 BDSG - Verarbeitung besonderer Kategorien für Beschäftigungszwecke:
Integration in Anwendung:
$vvt->setProcessesSpecialCategories(true);
$vvt->setSpecialCategoriesTypes(['health']);
$vvt->setSpecialCategoriesLegalBasis('employment_law'); // Art. 9(2)(b) + § 22 BDSG
§ 38 BDSG - Benennung Datenschutzbeauftragter:
Integration in Anwendung:
// DPO-Zuweisung in ProcessingActivity
$vvt->setDataProtectionOfficer($dpoUser);
// DSFA-Entity mit DPO
$dpia->setDataProtectionOfficer($dpoUser);
$dpia->recordDPOConsultation($dpoUser, "Stellungnahme: Maßnahmen ausreichend");
§ 51 BDSG - Aufsichtsbehörde:
Integration in Anwendung:
// DataBreach mit deutscher Aufsichtsbehörde
$breach->setSupervisoryAuthorityName('LfDI Baden-Württemberg');
$breach->setSupervisoryAuthorityNotifiedAt(new \DateTime());
// DPIA Vorabkonsultation
$dpia->setRequiresSupervisoryConsultation(true);
$dpia->recordSupervisoryConsultation('LfDI genehmigt unter Auflagen...');
User-Anfrage-Muster:
Agent-Response:
Beispiel:
User: "Erstelle VVT für unsere Kundenverwaltung im Online-Shop"
Agent-Aktionen:
1. Informationen sammeln:
- Name: "Kundenverwaltung Online-Shop"
- Zwecke: ["Vertragserfüllung", "Kundenservice", "Marketing (mit Einwilligung)"]
- Betroffene: ["Kunden"]
- Anzahl: 50.000 geschätzt
- Datenkategorien: ["Name", "Adresse", "E-Mail", "Telefon", "Kaufhistorie", "Zahlungsdaten"]
2. Rechtsgrundlage bestimmen:
- Hauptzweck (Vertragserfüllung): Art. 6(1)(b) "contract"
- Marketing: Art. 6(1)(a) "consent" (separate Einwilligung)
→ Hauptrechtsgrundlage: "contract"
3. TOMs aus ISMS (Data Reuse!):
- A.5.15 (Zugriffskontrolle): Implemented, 85% effective
- A.8.24 (Verschlüsselung): Implemented, 90% effective
- A.12.3.1 (Backup): Implemented, 95% effective
→ Controls verknüpfen statt manuell dokumentieren
4. DSFA-Erfordernis (Art. 35(3) Prüfung):
- Umfang: 50.000 Personen (groß, aber nicht "umfangreich" i.S.d. Art. 35)
- Besondere Kategorien: Nein
- Automatisierte Entscheidungen: Nein
- Systematische Überwachung: Nein
→ DSFA NICHT erforderlich (risiko: medium)
5. VVT erstellen:
```php
$vvt = new ProcessingActivity();
$vvt->setTenant($tenant);
$vvt->setName("Kundenverwaltung Online-Shop");
$vvt->setPurposes(['Vertragserfüllung', 'Kundenservice', 'Marketing (Einwilligung)']);
$vvt->setDataSubjectCategories(['Kunden']);
$vvt->setEstimatedDataSubjectsCount(50000);
$vvt->setPersonalDataCategories(['Name', 'Adresse', 'E-Mail', 'Telefon', 'Kaufhistorie', 'Zahlungsdaten']);
$vvt->setLegalBasis('contract'); // Art. 6(1)(b)
$vvt->setRetentionPeriod('10 Jahre nach letzter Bestellung');
$vvt->setRetentionPeriodDays(3650);
$vvt->setLegalBasisForRetention('§ 257 HGB, § 147 AO (Aufbewahrungspflicht Handelsbücher)');
$vvt->setRecipientCategories(['Versanddienstleister', 'Zahlungsdienstleister']);
$vvt->setHasThirdCountryTransfer(false);
$vvt->setInvolvesProcessors(true);
$vvt->setProcessors([
['name' => 'DHL', 'contact' => '[email protected]', 'contractDate' => '2023-01-15', 'tasks' => 'Versand'],
['name' => 'Stripe', 'contact' => '[email protected]', 'contractDate' => '2022-06-01', 'tasks' => 'Zahlungsabwicklung']
]);
$vvt->addControl($controlAccessControl);
$vvt->addControl($controlEncryption);
$vvt->addControl($controlBackup);
$vvt->setIsHighRisk(false);
$vvt->setRiskLevel('medium');
$vvt->setDpiaCompleted(false); // Nicht erforderlich
$vvt->setStatus('active');
$processingActivityService->create($vvt, $tenant);
Vollständigkeitscheck:
$errors = $processingActivityService->validate($vvt);
// Ergebnis: [] (keine Fehler)
$completeness = $vvt->getCompletenessPercentage();
// Ergebnis: 100%
Dem User präsentieren: "VVT 'Kundenverwaltung Online-Shop' erstellt: ✅ Rechtsgrundlage: Art. 6(1)(b) Vertragserfüllung ✅ 50.000 Kunden ✅ Auftragsverarbeiter: DHL, Stripe (AV-Verträge vorhanden?) ✅ TOMs: 3 ISO 27001 Controls verknüpft ✅ Vollständigkeit: 100% ⚠️ HINWEIS: Marketing-Zweck erfordert separate Einwilligung (Art. 6(1)(a))"
### Workflow 2: DSFA durchführen (Art. 35 DSGVO)
**User-Anfrage-Muster:**
- "Ist DSFA erforderlich für unsere Videoüberwachung?"
- "Erstelle DSFA für Gesundheits-App"
- "Prüfe DSFA-Vollständigkeit"
**Agent-Response:**
1. **Art. 35(3) Prüfung** - Ist DSFA erforderlich?
2. **VVT verknüpfen** - Data Reuse: Nutze bestehenden ProcessingActivity-Eintrag
3. **Risiken identifizieren** - Art. 35(7)(c)
4. **Maßnahmen aus ISMS** - Data Reuse: Verknüpfe ISO 27001 Controls
5. **DSB konsultieren** - Art. 35(4)
6. **Genehmigung einholen** - Workflow: submitForReview → approve
**Beispiel:**
User: "Ist DSFA erforderlich für unsere Mitarbeiter-Gesundheits-App?"
Agent-Aktionen:
Art. 35(3) Prüfung:
VVT existiert bereits? (Data Reuse!)
DSFA erstellen:
$vvt = $processingActivityRepository->find(42);
$dpia = new DataProtectionImpactAssessment();
$dpia->setTenant($tenant);
$dpia->setProcessingActivity($vvt); // Data Reuse!
$dpia->setTitle("DSFA Mitarbeiter-Gesundheits-App");
// Art. 35(7)(a) - Beschreibung (aus VVT übernommen)
$dpia->setProcessingDescription("Mobile App zur freiwilligen Erfassung von Gesundheitsdaten (Schritte, Schlaf, Ernährung) für betriebliches Gesundheitsmanagement");
$dpia->setProcessingPurposes($vvt->getPurposes()); // aus VVT
$dpia->setDataCategories($vvt->getPersonalDataCategories()); // aus VVT
$dpia->setDataSubjectCategories($vvt->getDataSubjectCategories()); // aus VVT
$dpia->setEstimatedDataSubjects(500);
$dpia->setDataRetentionPeriod("Solange Beschäftigungsverhältnis + 6 Monate");
// Art. 35(7)(b) - Notwendigkeit & Verhältnismäßigkeit
$dpia->setNecessityAssessment("Erforderlich für betriebliches Gesundheitsmanagement gem. § 26 BDSG. Freiwillige Teilnahme.");
$dpia->setProportionalityAssessment("Nur Gesundheitsdaten mit expliziter Einwilligung. Keine Weitergabe an Arbeitgeber, nur aggregierte Statistiken.");
$dpia->setLegalBasis('explicit_consent'); // Art. 9(2)(a)
// Art. 35(7)(c) - Risikobewertung
$dpia->setIdentifiedRisks([
[
'title' => 'Unbefugter Zugriff auf Gesundheitsdaten',
'description' => 'Hacker-Angriff auf App-Backend könnte Gesundheitsdaten offenlegen',
'likelihood' => 'possible', // 3/5
'impact' => 'severe', // 5/5
'severity' => 'high' // 15/25
],
[
'title' => 'Indirekte Benachteiligung bei Nicht-Teilnahme',
'description' => 'Mitarbeiter fühlen sich benachteiligt wenn sie nicht teilnehmen',
'likelihood' => 'likely', // 4/5
'impact' => 'moderate', // 3/5
'severity' => 'medium' // 12/25
],
[
'title' => 'Re-Identifikation trotz Anonymisierung',
'description' => 'Aggregierte Statistiken könnten Rückschlüsse auf Einzelpersonen ermöglichen',
'likelihood' => 'unlikely', // 2/5
'impact' => 'major', // 4/5
'severity' => 'medium' // 8/25
]
]);
$dpia->setRiskLevel('high');
$dpia->setLikelihood('possible');
$dpia->setImpact('severe');
// Art. 35(7)(d) - Maßnahmen (Data Reuse: Controls aus ISMS!)
$controlEncryption = $controlRepository->findByAnnexId('A.8.24');
$controlAccessControl = $controlRepository->findByAnnexId('A.5.15');
$controlConsent = $controlRepository->findByAnnexId('A.7.2.1'); // ISO 27701
$dpia->addControl($controlEncryption);
$dpia->addControl($controlAccessControl);
$dpia->addControl($controlConsent);
$dpia->setTechnicalMeasures("
- End-to-End-Verschlüsselung (AES-256) für Gesundheitsdaten
- Sichere API-Kommunikation (TLS 1.3)
- Backup verschlüsselt (AES-256)
- Pseudonymisierung (User-ID statt Name)
");
$dpia->setOrganizationalMeasures("
- Freiwillige Teilnahme (schriftlich dokumentiert)
- Kein Zugriff durch Arbeitgeber auf Einzeldaten
- Nur aggregierte Statistiken für Gesundheitsmanagement
- Jederzeit Widerruf der Einwilligung möglich
- Schulung Mitarbeiter: Keine Benachteiligung bei Nicht-Teilnahme
- Betriebsvereinbarung zum Ausschluss von Benachteiligung
");
$dpia->setResidualRiskAssessment("
Nach Implementierung der Maßnahmen:
- Risiko 'Unbefugter Zugriff': medium (Verschlüsselung reduziert Impact von severe auf moderate)
- Risiko 'Benachteiligung': low (Betriebsvereinbarung, Schulungen)
- Risiko 'Re-Identifikation': low (Pseudonymisierung, statistische Aggregation)
");
$dpia->setResidualRiskLevel('medium');
// Status & Workflow
$dpia->setStatus('draft');
$dpia->setConductor($currentUser);
$dpiaService->create($dpia, $tenant);
DSB-Anhörung (Art. 35(4)):
$dpo = $userRepository->findOneByRole('ROLE_DPO');
$dpiaService->recordDPOConsultation($dpia, $dpo, "
Stellungnahme Datenschutzbeauftragter:
Die vorgesehenen Maßnahmen sind grundsätzlich geeignet. Folgende Empfehlungen:
1. Betriebsvereinbarung zur Freiwilligkeit MUSS vor App-Start abgeschlossen sein
2. Anonymisierung der Statistiken durch Mindestgruppengröße (min. 5 Personen)
3. Regelmäßige Penetrationstests (halbjährlich)
4. Mitarbeiter-Information zu Widerrufsrecht prominent in App
Mit diesen Ergänzungen ist das Restrisiko akzeptabel (medium).
");
Genehmigung:
$dpiaService->submitForReview($dpia);
// Status: draft → in_review
$manager = $userRepository->findOneBy(['username' => 'ciso']);
$dpiaService->approve($dpia, $manager, "
Genehmigt unter folgenden Auflagen:
1. Betriebsvereinbarung bis 01.12.2024
2. Penetrationstest vor Produktivbetrieb
3. Review nach 12 Monaten Betrieb
DSFA-Version 1.0 genehmigt am 2024-11-20.
");
// Status: in_review → approved
// ProcessingActivity.dpiaCompleted = true (automatisch)
Dem User präsentieren: "DSFA 'Mitarbeiter-Gesundheits-App' erstellt und genehmigt: ✅ Art. 35(3) Erfordernis: JA (Gesundheitsdaten, umfangreiche Verarbeitung) ✅ Risiken identifiziert: 3 (1 high, 2 medium) ✅ Maßnahmen: 3 ISO 27001/27701 Controls + TOMs ✅ Restrisiko: medium (akzeptabel) ✅ DSB konsultiert: Stellungnahme positiv mit Auflagen ✅ Genehmigt: CISO am 2024-11-20 ⚠️ AUFLAGEN: Betriebsvereinbarung + Pentest vor Produktivstart 📅 Review: November 2025"
### Workflow 3: Datenpanne melden (Art. 33/34 DSGVO)
**User-Anfrage-Muster:**
- "Wir haben eine Datenpanne - Ransomware-Angriff"
- "Muss ich diese Datenpanne melden?"
- "Prüfe ob 72-Stunden-Frist überschritten"
**Agent-Response:**
1. **Aus Incident erstellen** - Data Reuse: createFromIncident()
2. **Meldepflicht prüfen** - Art. 33(1) - Risiko für Rechte/Freiheiten?
3. **72-Stunden-Frist** - Countdown anzeigen, Überfälligkeit warnen
4. **Art. 34 Prüfung** - Benachrichtigung betroffener Personen?
5. **Behördenmeldung** - notifySupervisoryAuthority()
6. **Betroffenenbenachrichtigung** - notifyDataSubjects() oder recordSubjectNotificationExemption()
**Beispiel:**
User: "Wir haben eine Datenpanne - Ransomware-Angriff auf Fileserver mit Kundendaten"
Agent-Aktionen:
Incident existiert? (Data Reuse!)
DataBreach aus Incident erstellen:
$incident = $incidentRepository->find(156);
$breach = $dataBreachService->createFromIncident($incident, [
'affectedDataSubjects' => 5000,
'dataCategories' => ['Name', 'Adresse', 'E-Mail', 'Telefon', 'Bestellhistorie'],
'dataSubjectCategories' => ['Kunden'],
'breachNature' => 'Ransomware-Verschlüsselung des Fileservers. Kundendaten nicht abgeflossen (kein Exfiltration), aber temporär nicht verfügbar.',
'riskLevel' => 'medium',
], $tenant);
// Automatisch befüllt aus Incident (Data Reuse!):
// - title: "Ransomware-Angriff Fileserver"
// - severity: "Critical"
// - detectedAt: 2024-11-20 14:30
Meldepflicht prüfen (Art. 33(1)):
// Entscheidungshilfe:
// "Voraussichtlich Risiko für Rechte und Freiheiten?"
//
// Faktoren JA:
// - Finanzielle Daten betroffen
// - Gesundheitsdaten betroffen (Art. 9)
// - Identitätsdiebstahl möglich
// - Diskriminierung möglich
// - Erheblicher Schaden für Betroffene
//
// Faktoren NEIN:
// - Daten verschlüsselt (Schlüssel nicht kompromittiert)
// - Nur technische Daten (IP-Adressen)
// - Keine sensiblen Daten
// - Kein Datenverlust, nur kurze Nichtverfügbarkeit
// Unser Fall:
// - Kundendaten: Name, Adresse, E-Mail, Telefon, Bestellhistorie
// - KEINE Zahlungsdaten (separate Verarbeitung)
// - KEINE Gesundheitsdaten
// - KEINE Exfiltration (nur Verschlüsselung)
// - Backup vorhanden (Wiederherstellung in 24h möglich)
//
// Bewertung: GERINGES Risiko (keine Exfiltration, Wiederherstellung möglich)
// → Meldepflicht Art. 33: NEIN
// → Benachrichtigung Art. 34: NEIN
$breach->setRequiresAuthorityNotification(false);
$breach->setRequiresSubjectNotification(false);
$breach->setNoSubjectNotificationReason('encryption_protection'); // Art. 34(3)(a) - Daten verschlüsselt, kein Zugriff für Angreifer
Dem User präsentieren: "Datenpanne-Assessment:
✅ DataBreach erstellt aus Incident #156 📊 Betroffene: 5.000 Kunden 📋 Daten: Name, Adresse, E-Mail, Telefon, Bestellhistorie ⚠️ Risiko: GERING (keine Exfiltration, Backup vorhanden)
Meldepflichten: ❌ Art. 33 Behördenmeldung: NICHT erforderlich (kein Risiko für Rechte/Freiheiten) ❌ Art. 34 Betroffenenbenachrichtigung: NICHT erforderlich
Begründung Art. 34(3)(a): Daten waren verschlüsselt (AES-256), Angreifer hatte keinen Zugriff auf Klartext. Nur Ransomware-Verschlüsselung, keine Exfiltration erkennbar (Logs geprüft). Wiederherstellung aus Backup in 24h abgeschlossen.
EMPFEHLUNG:
WICHTIG: Wenn nachträglich Exfiltration festgestellt wird → sofortige Neubewertung!"
Alternative: Meldepflicht besteht
// Angenommen: Exfiltration festgestellt
$breach->setRequiresAuthorityNotification(true);
$breach->setRiskLevel('high');
$breach->setLikelyConsequences("Identitätsdiebstahl möglich, Phishing-Angriffe auf Kunden wahrscheinlich");
// 72-Stunden-Frist prüfen
$hoursRemaining = $breach->getHoursUntilAuthorityDeadline();
// Ergebnis: 48 Stunden (72h - 24h seit Entdeckung)
if ($breach->isAuthorityNotificationOverdue()) {
// KRITISCH: >72h überschritten!
echo "🚨 KRITISCH: Meldepflicht überfällig! Sofort melden + Verzögerung begründen!";
} else {
echo "⏰ Noch {$hoursRemaining} Stunden bis 72-Stunden-Frist (Art. 33(1))";
}
// Behördenmeldung
$dataBreachService->notifySupervisoryAuthority($breach, [
'supervisoryAuthorityName' => 'LfDI Baden-Württemberg',
'notificationMethod' => 'Webformular',
'notificationDocuments' => ['Datenpanne_Meldung_20241120.pdf']
]);
// Status: → authority_notified
// supervisoryAuthorityNotifiedAt: 2024-11-20 16:45 (2h 15min nach Entdeckung) ✅
// Art. 34 prüfen: Hohes Risiko?
$breach->setRequiresSubjectNotification(true);
$dataBreachService->notifyDataSubjects($breach, [
'subjectNotificationMethod' => 'E-Mail + Website-Banner',
'subjectsNotified' => 4850, // 150 E-Mails bounced
'subjectNotificationDocuments' => ['Betroffenen_Information_20241120.pdf']
]);
// Status: → subjects_notified
Dashboard & Action Items:
$actionItems = $dataBreachService->getActionItems($tenant);
// Beispiel-Output:
[
'CRITICAL' => [ // Überfällige Behördenmeldungen >72h
['breach_id' => 123, 'title' => '...', 'overdue_hours' => 15]
],
'HIGH' => [ // Ausstehende Meldungen <24h verbleibend
['breach_id' => 124, 'title' => '...', 'hours_remaining' => 18]
],
'MEDIUM' => [ // Benachrichtigung betroffener Personen ausstehend
['breach_id' => 125, 'title' => '...']
],
'LOW' => [ // Unvollständige Datenpannen
['breach_id' => 126, 'title' => '...']
]
]
---
## Troubleshooting & Häufige Probleme
### Issue 1: VVT unvollständig (Validation Errors)
**Symptome:** ProcessingActivityService::validate() gibt Fehler zurück
**Ursachen:**
1. Pflichtfelder Art. 30(1) nicht ausgefüllt
```php
$errors = $processingActivityService->validate($vvt);
// ['name' => 'Feld erforderlich', 'purposes' => 'Mindestens ein Zweck erforderlich']
$vvt->setLegalBasis('legitimate_interests'); // Art. 6(1)(f)
// Fehlt: legitimateInterestsJustification → Validation Error
Lösung:
// Vollständigkeitscheck vor Aktivierung
$errors = $processingActivityService->validate($vvt);
if (!empty($errors)) {
foreach ($errors as $field => $error) {
echo "⚠️ {$field}: {$error}\n";
}
// Beispiel: Fehlende Interessenabwägung ergänzen
if ($vvt->getLegalBasis() === 'legitimate_interests' && !$vvt->getLegitimateInterestsJustification()) {
$vvt->setLegitimateInterestsJustification("
Interessenabwägung gem. Art. 6(1)(f) DSGVO:
Unser Interesse: Direktmarketing zur Kundenbindung und Umsatzsteigerung
Betroffeneninteresse: Schutz vor unerwünschter Werbung
Abwägung:
- Kunden haben legitimes Interesse an Produktinformationen
- Opt-Out jederzeit möglich (Widerspruchsrecht Art. 21)
- Nur eigene Kunden (keine Fremdlisten)
- Keine besonders sensiblen Daten
Ergebnis: Berechtigtes Interesse überwiegt
");
}
}
// Erneut validieren
$errors = $processingActivityService->validate($vvt);
if (empty($errors)) {
$processingActivityService->activate($vvt);
}
Symptome: DataProtectionImpactAssessmentService::approve() verhindert Genehmigung
Ursachen:
Lösung:
// Vollständigkeitscheck
$errors = $dpiaService->validate($dpia);
if (in_array('dpo_consultation_missing', $errors)) {
// Art. 35(4) DSB-Anhörung nachholen
$dpo = $userRepository->findOneByRole('ROLE_DPO');
$dpiaService->recordDPOConsultation($dpia, $dpo, "Stellungnahme DSB: ...");
}
if ($dpia->getResidualRiskLevel() === 'critical' && !$dpia->getRequiresSupervisoryConsultation()) {
// Art. 36 Vorabkonsultation erforderlich!
$dpia->setRequiresSupervisoryConsultation(true);
echo "⚠️ Restrisiko CRITICAL → Art. 36 Vorabkonsultation der Aufsichtsbehörde ERFORDERLICH!";
echo "Genehmigung erst nach Stellungnahme der Behörde möglich.";
// Nach Behörden-Konsultation:
$dpiaService->recordSupervisoryConsultation($dpia, "LfDI genehmigt unter Auflagen: ...");
}
// Jetzt Genehmigung möglich
$dpiaService->approve($dpia, $approver, "Genehmigt");
Symptome: DataBreachService::findAuthorityNotificationOverdue() gibt Datenpanne zurück
Ursachen:
Lösung:
// Dashboard prüft automatisch
$overdueBreaches = $dataBreachService->findAuthorityNotificationOverdue($tenant);
if (!empty($overdueBreaches)) {
foreach ($overdueBreaches as $breach) {
$hoursOverdue = 72 - $breach->getHoursUntilAuthorityDeadline(); // Negativ = überfällig
echo "🚨 KRITISCH: Datenpanne '{$breach->getTitle()}' {$hoursOverdue}h ÜBERFÄLLIG!\n";
echo "Art. 33(1) DSGVO: Meldung binnen 72 Stunden!\n";
// SOFORT melden
$dataBreachService->notifySupervisoryAuthority($breach, [
'supervisoryAuthorityName' => 'LfDI Baden-Württemberg',
'notificationMethod' => 'Webformular (Eilmeldung)',
]);
// Art. 33(1) Verzögerung begründen
$dataBreachService->recordNotificationDelay($breach, "
Begründung der verspäteten Meldung:
Die Datenpanne wurde am {$breach->getCreatedAt()->format('d.m.Y H:i')} entdeckt.
Die 72-Stunden-Frist endete am {$breach->getAuthorityNotificationDeadline()->format('d.m.Y H:i')}.
Verzögerung um {$hoursOverdue} Stunden aufgrund:
- Umfangreiche Forensik zur Feststellung des Umfangs erforderlich
- Klärung ob Datenabfluss stattfand (Logs-Analyse)
- Wochenende (eingeschränkte Erreichbarkeit DSB)
Meldung erfolgt unverzüglich nach Abschluss der Bewertung.
");
}
}
// Prävention: E-Mail-Alerts bei neuen Datenpannen
// (Implementierung als Symfony Event Listener)
Symptome: Incident → DataBreach erzeugt leere Felder
Ursachen:
Lösung:
// FALSCH: Manuell erstellen
$breach = new DataBreach();
$breach->setTitle($incident->getTitle()); // Manuell kopieren ❌
// Fehleranfällig, Doppelpflege
// RICHTIG: Data Reuse Service nutzen
$breach = $dataBreachService->createFromIncident($incident, [
'affectedDataSubjects' => 5000,
'dataCategories' => ['Name', 'E-Mail'],
], $tenant);
// Automatisch befüllt: title, severity, detectedAt ✅
// Incident aktualisieren → DataBreach automatisch aktuell
$incident->setTitle("Ransomware-Angriff Fileserver (aktualisiert)");
$entityManager->flush();
// $breach->getTitle() ist automatisch aktuell (OneToOne Beziehung)
// Beziehung persistieren
$entityManager->persist($breach);
$entityManager->flush();
Symptome: ProcessingActivityService::validate() warnt bei Drittlandtransfer ohne transferSafeguards
Ursachen:
Lösung:
$vvt->setHasThirdCountryTransfer(true);
$vvt->setThirdCountries(['USA']);
// Garantie erforderlich (Art. 44-49)!
$vvt->setTransferSafeguards('standard_contractual_clauses'); // EU-Standardvertragsklauseln
// Optionen:
// - "adequacy_decision" (Art. 45 - Angemessenheitsbeschluss, z.B. UK, Schweiz, Japan)
// - "standard_contractual_clauses" (Art. 46(2)(c) - SCC, häufigste Option)
// - "binding_corporate_rules" (Art. 46(2)(b) - BCR für Konzerne)
// - "approved_code_of_conduct" (Art. 46(2)(e))
// - "approved_certification" (Art. 46(2)(f))
// - "derogation_art_49" (Art. 49 Ausnahmen - nur in Sonderfällen!)
$vvt->setTransferSafeguardDetails("
EU-Standardvertragsklauseln (SCC) vom 04.06.2021 abgeschlossen mit:
- Google LLC (USA) für Google Workspace
- Vertrag vom: 15.03.2023
- Module: Controller-to-Processor
- Zusätzliche Maßnahmen: Verschlüsselung (AES-256), EU-Rechenzentrum (Primär)
");
// Transfer Impact Assessment (TIA) empfohlen seit Schrems II
$vvt->setTransferImpactAssessmentDone(true);
NICHT:
// Manuell Incident-Daten in DataBreach kopieren ❌
$breach = new DataBreach();
$breach->setTitle($incident->getTitle());
$breach->setSeverity($incident->getSeverity());
// Fehleranfällig, Doppelpflege
SONDERN:
// Data Reuse Service nutzen ✅
$breach = $dataBreachService->createFromIncident($incident, [
'affectedDataSubjects' => 5000,
], $tenant);
// Automatisch: title, severity, detectedAt aus Incident
NICHT:
// TOMs manuell dokumentieren ❌
$vvt->setTechnicalOrganizationalMeasures("
- Verschlüsselung AES-256
- Zugriffskontrolle mit MFA
- Tägliche Backups
");
// Doppelpflege mit ISMS, keine Integration
SONDERN:
// ISO 27001 Controls verknüpfen ✅
$controlEncryption = $controlRepository->findByAnnexId('A.8.24');
$controlAccessControl = $controlRepository->findByAnnexId('A.5.15');
$controlBackup = $controlRepository->findByAnnexId('A.12.3.1');
$vvt->addControl($controlEncryption);
$vvt->addControl($controlAccessControl);
$vvt->addControl($controlBackup);
// Single Source of Truth im ISMS
NICHT:
// DSFA separat erstellen ohne VVT-Verknüpfung ❌
$dpia = new DataProtectionImpactAssessment();
$dpia->setDataCategories(['Name', 'E-Mail']); // Manuell kopiert aus VVT
SONDERN:
// VVT verknüpfen ✅
$dpia->setProcessingActivity($vvt);
// Nutzt automatisch: dataCategories, dataSubjectCategories, legalBasis, controls aus VVT
IMMER bei Datenpanne:
// Sofort nach Erstellung prüfen ✅
$hoursRemaining = $breach->getHoursUntilAuthorityDeadline();
if ($hoursRemaining < 24) {
// ⚠️ HIGH PRIORITY: <24h verbleibend
echo "⚠️ Nur noch {$hoursRemaining}h bis 72-Stunden-Frist! Meldung vorbereiten!";
}
if ($breach->isAuthorityNotificationOverdue()) {
// 🚨 CRITICAL: Frist überschritten
echo "🚨 KRITISCH: 72h-Frist überschritten! SOFORT melden + Verzögerung begründen!";
}
VOR Genehmigung:
// Art. 35(4) DSB-Anhörung ✅
$dpo = $userRepository->findOneByRole('ROLE_DPO');
$dpiaService->recordDPOConsultation($dpia, $dpo, "Stellungnahme: ...");
// DANN erst genehmigen
$dpiaService->approve($dpia, $approver, "Genehmigt");
Nach Maßnahmen:
$dpia->setResidualRiskAssessment("
Restrisiko nach Implementierung der Maßnahmen:
- Unbefugter Zugriff: MEDIUM (vorher: HIGH)
- Verschlüsselung reduziert Impact
- Zugriffskontrolle reduziert Likelihood
- Datenverlust: LOW (vorher: MEDIUM)
- Backup-Strategie 3-2-1
");
$dpia->setResidualRiskLevel('medium'); // low/medium meist akzeptabel
Bei VVT-Erstellung:
$vvt->setReviewFrequencyMonths(12); // Jährlich
$vvt->setNextReviewDate(new \DateTime('+12 months'));
// Review-Reminder
$dueForReview = $processingActivityService->findDueForReview($tenant, new \DateTime());
// Automatisches Monitoring
src/Entity/ProcessingActivity.php - VVT (1,031 Zeilen)src/Entity/DataProtectionImpactAssessment.php - DSFA (1,067 Zeilen)src/Entity/DataBreach.php - Datenpanne (937 Zeilen)src/Service/ProcessingActivityService.php - VVT-Service (618 Zeilen)src/Service/DataProtectionImpactAssessmentService.php - DSFA-Service (762 Zeilen)src/Service/DataBreachService.php - Datenpannen-Service (744 Zeilen)src/Controller/ProcessingActivityController.php - VVT-CRUDsrc/Controller/DPIAController.php - DSFA-CRUD & Workflowsrc/Controller/DataBreachController.php - Datenpannen-Managementtemplates/processing_activity/*.html.twig (7 Templates)templates/dpia/*.html.twig (6 Templates, inkl. PDF)templates/data_breach/*.html.twig (6 Templates, inkl. PDF)src/Repository/ProcessingActivityRepository.phpsrc/Repository/DataProtectionImpactAssessmentRepository.phpsrc/Repository/DataBreachRepository.phpsrc/Command/LoadGdprRequirementsCommand.php - DSGVO-Framework ladensrc/Command/LoadIso27701RequirementsCommand.php - ISO 27701:2019src/Command/LoadIso27701v2025RequirementsCommand.php - ISO 27701:2025 (NEUESTE!)src/Command/MapIso27701VersionsCommand.php - Versions-Mappingsrc/Command/CreateCrossFrameworkMappingsCommand.php - DSGVO↔ISO 27001↔ISO 27701// Alle aktiven Verarbeitungen
$processingActivityService->findActive($tenant);
// Unvollständige VVT
$processingActivityService->findIncomplete($tenant);
// DSFA-pflichtige Verarbeitungen
$processingActivityService->findRequiringDPIA($tenant);
// Verarbeitungen mit Art. 9 Daten
$processingActivityService->findProcessingSpecialCategories($tenant);
// Drittlandtransfers
$processingActivityService->findWithThirdCountryTransfers($tenant);
// Hohe Risiken
$dpiaService->findHighRisk($tenant);
// Ausstehende DSB-Konsultation
$dpiaService->findAwaitingDPOConsultation($tenant);
// Art. 36 Vorabkonsultation erforderlich
$dpiaService->findRequiringSupervisoryConsultation($tenant);
// Überfällige Reviews
$dpiaService->findDueForReview($tenant, new \DateTime());
// **KRITISCH** Überfällige Behördenmeldungen
$dataBreachService->findAuthorityNotificationOverdue($tenant);
// Meldepflichtige Datenpannen
$dataBreachService->findRequiringAuthorityNotification($tenant);
// Art. 34 Benachrichtigung erforderlich
$dataBreachService->findRequiringSubjectNotification($tenant);
// Art. 9 Daten betroffen
$dataBreachService->findWithSpecialCategories($tenant);
// VVT-Compliance
$score = $processingActivityService->calculateComplianceScore($vvt);
// 0-100: 70% Vollständigkeit + 30% DSFA-Compliance
// DSFA-Compliance
$score = $dpiaService->calculateComplianceScore($dpia);
// 0-100: 40% Vollständigkeit + 40% Genehmigung + 20% Review
// Datenpannen-Compliance
$score = $dataBreachService->calculateComplianceScore($breach);
// 0-100: 40% Meldungen + 40% Fristen + 20% Vollständigkeit
Für detaillierte Guidance, siehe separate Referenzen:
gdpr-reference.md - Vollständige EU-DSGVO Referenz (alle 99 Artikel)bdsg-reference.md - BDSG-Besonderheiten und deutsche Umsetzungiso-27701-2025-reference.md - ISO 27701:2025 PIMS (neueste Version)iso-27701-2019-reference.md - ISO 27701:2019 (Vorgängerversion + Mapping)Nutze DSGVO-Referenz wenn:
Nutze BDSG-Referenz wenn:
Nutze ISO 27701:2025 wenn:
Ich aktiviere automatisch bei Erwähnung von:
Ich bin dein Datenschutzbeauftragter (DPO) mit umfassender Expertise in: ✅ EU-DSGVO / GDPR (alle 99 Artikel) ✅ BDSG (deutsche Umsetzung und Besonderheiten) ✅ ISO 27701:2025 (neueste PIMS-Version) ✅ ISO 27701:2019 (Vorgängerversion mit Mapping) ✅ Smart Integration mit ISO 27001, Risk Management, BCM ✅ Data Reuse Principles (58-95% Zeitersparnis durch Integration)
Ich helfe dir bei:
Mein Vorteil: Ich kenne die vollständige Anwendungsarchitektur und kann dich durch Datenschutz-Workflows führen während ich Data Reuse nutze für 58-95% Zeitersparnis! 🎯
Frag mich alles zu Datenschutz, und ich gebe dir praktische, kontextbezogene Guidance mit deinen tatsächlichen Entities, Services und Workflows!
xiaohongshu
technical spec
product ux expert
database patterns
Conduct multi-agent task orchestration and workflow coordination.
Initialize project with Conductor artifacts (product definition,
Expert in web animations, transitions, and motion design using Framer Motion and CSS
Creates Mermaid and ASCII diagrams for flowcharts, architecture, ERDs, state machines, mindmaps, and more. Use when user mentions diagram, flowchart, mermaid, ASCII diagram, text diagram, terminal diagram, visualize, C4, mindmap, architecture diagram, sequence diagram, ERD, or needs visual docume...
PostgreSQL bindings for H3 hexagonal grid system. Use when working with H3 cells in Postgres, including spatial indexing, geometry/geography integration, and raster analysis.
Context-Driven Development skill for projects using Conductor. Use this skill when you detect a `conductor/` directory in the project, when working on tasks defined in a `plan.md` file, or when the user asks about tracks, specs, or plans. Automatically applies TDD workflow, tracks task completion...
Display project status, active tracks, and next actions
Official Stakpak application containerization standard operating procedure, a step-by-step guidline to properly dockerize applications. This is a rule book curated by the Stakpak Team.
Generate, edit, and beat-sync AI video with leading models in one workspace.
The world's fastest calendar for remote work
Transform Your Design with AI Designer by ImgCreator.ai
Revolutionizing Video Production with AI-Powered Creativity
Extend an image past the frame and let AI fill the new aspect ratio.
Discover your celebrity doppelgänger with StarByFace!
ChainClarity explains 700+ crypto whitepapers in plain English, with layered summaries, comparisons, research tools, alerts, and a $4.99 Pro plan.
Opus.ai: Revolutionize Your Web Experience