# Compliance-Report Einsatztagebuch v2.2.2 (Build 67)

**Erstellt:** 2026-09-01T21:44:38+02:00 (Commit `1ba1ac7`)
**Plattformen:** iOS, Android
**Datenbank-Schema:** v20
**Schema-Version (checklist.yaml):** 1

## Übersicht

| Status | Anzahl |
|---|---|
| Erfüllt | 26 |
| Teilweise | 4 |
| Offen | 0 |
| Nicht anwendbar | 0 |
| **Gesamt** | **30** |

## Compliance-Matrix

### Zugriffsschutz

| ID | Anforderung | Status | Seit | Quelle |
|---|---|---|---|---|
| ZUG-01 | App-Lock mit PIN | ✅ erfüllt | 1.5.0 | BSI IT-GS APP.1.4 |
| ZUG-02 | Biometrische Entsperrung | ✅ erfüllt | 1.5.0 | BSI IT-GS APP.1.4 |
| ZUG-03 | Auto-Sperre konfigurierbar | ✅ erfüllt | 1.5.0 | BSI IT-GS APP.1.4 |
| ZUG-04 | Brute-Force-Schutz der PIN | ✅ erfüllt | 2.0.0 | BSI IT-GS APP.1.4 |

### Datenintegrität

| ID | Anforderung | Status | Seit | Quelle |
|---|---|---|---|---|
| INT-01 | Hash-Kette über Log-Einträge | ✅ erfüllt | 1.6.0 | GoBD Unveränderbarkeit |
| INT-02 | Einträge sind unveränderlich | ✅ erfüllt | 1.6.0 | GoBD Unveränderbarkeit |
| INT-03 | Master-Hash im PDF-Export | ✅ erfüllt | 1.6.0 | GoBD Unveränderbarkeit |
| INT-04 | Integritäts-Statusbericht im PDF | ✅ erfüllt | 1.6.0 | GoBD Nachvollziehbarkeit |
| INT-05 | Abbruchsichere Datenbank-Migration | ✅ erfüllt | 2.0.0 | GoBD Datenintegrität |
| INT-06 | Integritätsprüfung bei Backup-Wiederherstellung | ✅ erfüllt | 2.0.0 | GoBD Datenintegrität |

### Verschlüsselung

| ID | Anforderung | Status | Seit | Quelle |
|---|---|---|---|---|
| VER-01 | Datenbank verschlüsselt | ✅ erfüllt | 1.5.0 | BSI IT-GS APP.1.4 / DSGVO Art. 32 |
| VER-02 | Backup verschlüsselt | ✅ erfüllt | 1.5.0 | DSGVO Art. 32 |
| VER-03 | Schlüssel gerätegebunden und Keystore-gestützt | ✅ erfüllt | 2.0.0 | BSI IT-GS SYS.4.5 / APP.4.3 |
| VER-04 | Ablageort ohne Cloud-Spiegelung | ✅ erfüllt | 2.0.2 | DSGVO Art. 32 / Art. 28 |

### Datenschutz / DSGVO

| ID | Anforderung | Status | Seit | Quelle |
|---|---|---|---|---|
| DSG-01 | Auskunftsrecht — Personen-Datenexport | ✅ erfüllt | 1.6.0 | DSGVO Art. 15 |
| DSG-02 | Löschrecht — Personen-Soft-Delete | ✅ erfüllt | 1.6.0 | DSGVO Art. 17 |
| DSG-03 | Mission-Anonymisierung | ✅ erfüllt | 1.6.0 | DSGVO Art. 17 |
| DSG-04 | Datenschutz-Übersicht in App | ✅ erfüllt | 1.6.0 | DSGVO Art. 13 |

### Beweissicherung / Audit-Trail

| ID | Anforderung | Status | Seit | Quelle |
|---|---|---|---|---|
| NAW-01 | Audit-Log-Screen | ✅ erfüllt | 1.6.0 | GoBD Nachvollziehbarkeit |
| NAW-02 | Schreiber pro Eintrag | ✅ erfüllt | 1.5.0 | THWiki Einsatztagebuch (Eindeutigkeit Schreiber) |
| NAW-03 | Multi-Profile für Schichtwechsel | ✅ erfüllt | 1.6.0 | THWiki Einsatztagebuch (Eindeutigkeit Schreiber) |
| NAW-04 | Foto-Watermark mit Schreiber + DTG | ✅ erfüllt | 1.6.0 | GoBD Nachvollziehbarkeit |
| NAW-05 | Audit-Trail für DSGVO-Lösch-/Anonymisierungsaktionen | ✅ erfüllt | 2.0.0 | GoBD / DSGVO Art. 5 Abs. 2 (Rechenschaftspflicht) |

### Betrieb / Verfahren

| ID | Anforderung | Status | Seit | Quelle |
|---|---|---|---|---|
| BET-01 | Verfahrensdokumentation als PDF | ✅ erfüllt | 1.6.0 | GoBD Verfahrensdokumentation |
| BET-02 | Aufbewahrungsdauer 10 Jahre | ✅ erfüllt | 1.6.0 | THWiki |
| BET-03 | Compliance-Bericht versionskontrolliert | ✅ erfüllt | 1.6.0 | GoBD Verfahrensdokumentation |

### Barrierefreiheit

| ID | Anforderung | Status | Seit | Quelle |
|---|---|---|---|---|
| BAR-01 | Farbkontraste | ⚠️ teilweise | 2.0.3 | EN 301 549 / WCAG 2.1 AA (1.4.3, 1.4.11) |
| BAR-02 | Mindestgrößen von Bedienelementen | ⚠️ teilweise | 2.0.3 | EN 301 549 / WCAG 2.1 AAA (2.5.5), Material Design |
| BAR-03 | Skalierbare Schrift | ⚠️ teilweise | 2.0.3 | EN 301 549 / WCAG 2.1 AA (1.4.4, 1.4.10) |
| BAR-04 | Screenreader-Unterstützung | ⚠️ teilweise | 2.0.3 | EN 301 549 / WCAG 2.1 A (1.1.1, 4.1.2) |

## Anforderungs-Details

### ZUG-01 — App-Lock mit PIN

- **Kategorie:** Zugriffsschutz
- **Status:** ✅ erfüllt
- **Seit Version:** 1.5.0
- **Quelle:** BSI IT-GS APP.1.4

Die App ist beim Start und nach Hintergrundwechsel mit einer mindestens 6-stelligen PIN gesichert.

**Nachweis:**
- `lib/core/auth/app_lock_service.dart`
- `lib/ui/widgets/app_lock_gate.dart`
- `lib/ui/screens/lock_screen.dart`

### ZUG-02 — Biometrische Entsperrung

- **Kategorie:** Zugriffsschutz
- **Status:** ✅ erfüllt
- **Seit Version:** 1.5.0
- **Quelle:** BSI IT-GS APP.1.4

FaceID/TouchID/Fingerabdruck als Alternative zur PIN.

**Nachweis:**
- `lib/core/auth/app_lock_service.dart`
- `lib/core/platform_capabilities.dart`

**Notizen:** Nur verfügbar wenn Gerät Biometrie unterstützt. Auf Windows (ab 2.1.0) über Windows Hello — siehe Einschränkung in ZUG-04.

### ZUG-03 — Auto-Sperre konfigurierbar

- **Kategorie:** Zugriffsschutz
- **Status:** ✅ erfüllt
- **Seit Version:** 1.5.0
- **Quelle:** BSI IT-GS APP.1.4

Sofort, 30 s, 1 min, 5 min oder Nie — UI in Sicherheits-Einstellungen.

**Nachweis:**
- `lib/ui/screens/security_settings_screen.dart`

### INT-01 — Hash-Kette über Log-Einträge

- **Kategorie:** Datenintegrität
- **Status:** ✅ erfüllt
- **Seit Version:** 1.6.0
- **Quelle:** GoBD Unveränderbarkeit

Jeder Log-Eintrag enthält SHA-256-Hash über kanonisierten Inhalt und Verweis auf Vorgänger (prev_hash).

**Nachweis:**
- `lib/services/hash_chain_service.dart`
- `test/hash_chain_test.dart`

### INT-02 — Einträge sind unveränderlich

- **Kategorie:** Datenintegrität
- **Status:** ✅ erfüllt
- **Seit Version:** 1.6.0
- **Quelle:** GoBD Unveränderbarkeit

Bestehende Einträge werden niemals überschrieben; Korrekturen erfolgen ausschließlich als neue Einträge mit Verweis.

**Nachweis:**
- `lib/data/repositories/log_entry_repository.dart`
- `test/log_entry_repository_test.dart`

### INT-03 — Master-Hash im PDF-Export

- **Kategorie:** Datenintegrität
- **Status:** ✅ erfüllt
- **Seit Version:** 1.6.0
- **Quelle:** GoBD Unveränderbarkeit

PDF-Export enthält Master-Hash der Mission (SHA-256 über die Konkatenation aller entry_hash) — Manipulation eines Eintrags ändert zwingend den Master-Hash.

**Nachweis:**
- `lib/services/pdf_export_service.dart`

### INT-04 — Integritäts-Statusbericht im PDF

- **Kategorie:** Datenintegrität
- **Status:** ✅ erfüllt
- **Seit Version:** 1.6.0
- **Quelle:** GoBD Nachvollziehbarkeit

Menschenlesbare PDF-Seite zwischen Inhalt und Master-Hash mit Mission-Status, Schreiber-Übersicht, Hash-Ketten-Prüfergebnis und Soft-Delete-Liste.

**Nachweis:**
- `lib/services/pdf_export_service.dart`

**Notizen:** Stufe 4, gebündelt in 1.6.x.

### VER-01 — Datenbank verschlüsselt

- **Kategorie:** Verschlüsselung
- **Status:** ✅ erfüllt
- **Seit Version:** 1.5.0
- **Quelle:** BSI IT-GS APP.1.4 / DSGVO Art. 32

SQLite mit 256-Bit-Schlüssel im SQLCipher-4-Format; Schlüssel im Plattform-Keychain/Keystore. Die Cipher-Implementierung ist plattformabhängig, das Format und die Schlüsselstärke sind es nicht.

**Nachweis:**
- `pubspec.yaml [sqflite_sqlcipher, sqflite_common_ffi, sqlite3]`
- `lib/data/database/database_opener.dart`
- `lib/core/auth/db_key_service.dart`
- `test/database_cipher_ffi_test.dart`

**Notizen:** Android/iOS/macOS über das native sqflite_sqlcipher-Plugin. Windows ab 2.1.0 über sqflite_common_ffi mit dem SQLite3MultipleCiphers-Build von package:sqlite3; das Format wird dort per PRAGMA cipher='sqlcipher' und PRAGMA legacy=4 explizit auf SQLCipher 4 gepinnt, damit ein Default-Wechsel der Bibliothek bestehende Datenbanken nicht unlesbar macht.

### VER-02 — Backup verschlüsselt

- **Kategorie:** Verschlüsselung
- **Status:** ✅ erfüllt
- **Seit Version:** 1.5.0
- **Quelle:** DSGVO Art. 32

.etb-Backups optional AES-256-GCM-verschlüsselt mit passwort-abgeleitetem Schlüssel (PBKDF2-HMAC-SHA256).

**Nachweis:**
- `lib/services/backup_service.dart`
- `lib/services/backup_encryption.dart`
- `test/backup_encryption_test.dart`

**Notizen:** Ab v2.0.0 600.000 Iterationen (Format ETBENC2, Iterationszahl im Header); ETBENC1 (200k) bleibt entschlüsselbar. Klartext-Backups bleiben rückwärts-kompatibel.

### DSG-01 — Auskunftsrecht — Personen-Datenexport

- **Kategorie:** Datenschutz / DSGVO
- **Status:** ✅ erfüllt
- **Seit Version:** 1.6.0
- **Quelle:** DSGVO Art. 15

Datenkopie zu einer betroffenen Person als PDF erzeugbar (DSGVO Art. 15).

**Nachweis:**
- `lib/services/personal_data_export_service.dart`
- `lib/ui/screens/personal_data_export_screen.dart`

**Notizen:** Stufe 3, gebündelt in 1.6.x.

### DSG-02 — Löschrecht — Personen-Soft-Delete

- **Kategorie:** Datenschutz / DSGVO
- **Status:** ✅ erfüllt
- **Seit Version:** 1.6.0
- **Quelle:** DSGVO Art. 17

Einzelne Personen aus Erfassungsbögen entfernbar mit Audit-Eintrag und Begründung.

**Nachweis:**
- `lib/services/privacy_service.dart`
- `lib/ui/screens/unit_persons_list_screen.dart`
- `test/unit_registration_soft_delete_test.dart`
- `test/privacy_service_file_redaction_test.dart`

**Notizen:** Soft-Delete; Hash-Kette bleibt intakt. Ab v2.0.1: Löschmarker überlebt spätere Bogen-Bearbeitungen; Audit-Vermerk ohne Klarnamen; gespeichertes Erfassungsbogen-PDF wird nach der Löschung redigiert neu erzeugt; gelöschte Personen zählen nicht mehr in Stärke/PDF.

### DSG-03 — Mission-Anonymisierung

- **Kategorie:** Datenschutz / DSGVO
- **Status:** ✅ erfüllt
- **Seit Version:** 1.6.0
- **Quelle:** DSGVO Art. 17

Personenbezogene Felder einer Mission werden mit Platzhaltern überschrieben. Ab v2.0.0 inkl. Freitext der Einträge, Übergaben und Lageberichte; die Hash-Kette wird über die redigierten Inhalte neu versiegelt (verifyChain bleibt gültig).

**Nachweis:**
- `lib/services/privacy_service.dart`
- `test/privacy_service_invariants_test.dart`
- `test/privacy_service_file_redaction_test.dart`

**Notizen:** Ab v2.0.0 vollständige Freitext-Redaction mit Ketten-Neuversiegelung; Akteur in audit_events. Ab v2.0.1 zusätzlich Datei-Redaction: erzeugte PDF-Dokumente und Signatur-Dateien werden gelöscht, Pfad-Spalten genullt; Fotos bleiben bewusst erhalten (Beweiswert). Ab v2.1.0 umfasst die Redaction auch die Gefährdungsbeurteilungen (Einsatzstelle, Erfasser, Freitext-Bemerkungen der bewerteten Zeilen, Bogen-PDF und Unterschrift); die Ampelstufen bleiben stehen — sie sind Arbeitsschutz-Aussage ohne Personenbezug.

### DSG-04 — Datenschutz-Übersicht in App

- **Kategorie:** Datenschutz / DSGVO
- **Status:** ✅ erfüllt
- **Seit Version:** 1.6.0
- **Quelle:** DSGVO Art. 13

Sektion in den Einstellungen erklärt, welche Daten wo, wie lange und mit welchen Rechten gespeichert werden.

**Nachweis:**
- `lib/ui/screens/privacy_info_screen.dart`

### NAW-01 — Audit-Log-Screen

- **Kategorie:** Beweissicherung / Audit-Trail
- **Status:** ✅ erfüllt
- **Seit Version:** 1.6.0
- **Quelle:** GoBD Nachvollziehbarkeit

In-App-Ansicht aller Korrekturen, Schließungen, Übergaben, Erfassungsbogen-Änderungen, Gefährdungsbeurteilungen und Mission-Anonymisierungen.

**Nachweis:**
- `lib/services/audit_log_service.dart`
- `lib/ui/screens/audit_log_screen.dart`
- `test/audit_log_service_test.dart`

**Notizen:** Ab v2.1.0 erscheinen auch erstellte Gefährdungsbeurteilungen („Gefahren an der Einsatzstelle") mit Zeitpunkt und Erfasser.

### NAW-02 — Schreiber pro Eintrag

- **Kategorie:** Beweissicherung / Audit-Trail
- **Status:** ✅ erfüllt
- **Seit Version:** 1.5.0
- **Quelle:** THWiki Einsatztagebuch (Eindeutigkeit Schreiber)

Jeder Eintrag, jede Übergabe und jede Lagemeldung enthält Name + Funktion des erfassenden Helfers.

**Nachweis:**
- `lib/data/models/log_entry.dart`
- `lib/data/models/handover_protocol.dart`
- `lib/data/models/situation_report.dart`

### NAW-03 — Multi-Profile für Schichtwechsel

- **Kategorie:** Beweissicherung / Audit-Trail
- **Status:** ✅ erfüllt
- **Seit Version:** 1.6.0
- **Quelle:** THWiki Einsatztagebuch (Eindeutigkeit Schreiber)

Mehrere Schreiber-Profile auf einem Gerät; aktives Profil wird sichtbar im ActiveUserChip; neue Einträge tragen den aktiven Schreiber.

**Nachweis:**
- `lib/providers/user_provider.dart`
- `lib/ui/screens/profiles_screen.dart`
- `lib/ui/widgets/active_user_chip.dart`

**Notizen:** Stufe 3, gebündelt in 1.6.x.

### NAW-04 — Foto-Watermark mit Schreiber + DTG

- **Kategorie:** Beweissicherung / Audit-Trail
- **Status:** ✅ erfüllt
- **Seit Version:** 1.6.0
- **Quelle:** GoBD Nachvollziehbarkeit

Foto-Anlagen werden beim Speichern mit Schreiber-Name und Aufnahmezeit (DTG) im Bild versehen; Original auf Wunsch archivierbar.

**Nachweis:**
- `lib/services/photo_service.dart`
- `lib/core/photo_watermark_service.dart`
- `test/photo_watermark_test.dart`

**Notizen:** Stufe 4, gebündelt in 1.6.x. Watermarking läuft im Isolate.

### BET-01 — Verfahrensdokumentation als PDF

- **Kategorie:** Betrieb / Verfahren
- **Status:** ✅ erfüllt
- **Seit Version:** 1.6.0
- **Quelle:** GoBD Verfahrensdokumentation

In-App generierbares PDF-Dokument zur GoBD-konformen Verfahrensbeschreibung (Schema, Hash-Verfahren, Workflows, Backup-Format, Sicherheitsmechanismen).

**Nachweis:**
- `lib/services/procedure_doc_service.dart`
- `lib/ui/screens/procedure_doc_screen.dart`
- `test/procedure_doc_test.dart`

**Notizen:** Stufe 4, gebündelt in 1.6.x. Test prüft Tabellen-Vollständigkeit.

### BET-02 — Aufbewahrungsdauer 10 Jahre

- **Kategorie:** Betrieb / Verfahren
- **Status:** ✅ erfüllt
- **Seit Version:** 1.6.0
- **Quelle:** THWiki

Hinweis auf Aufbewahrungspflicht in Datenschutz-Sektion; App löscht nicht automatisch — Verantwortung beim Anwender.

**Nachweis:**
- `lib/ui/screens/privacy_info_screen.dart`

### BET-03 — Compliance-Bericht versionskontrolliert

- **Kategorie:** Betrieb / Verfahren
- **Status:** ✅ erfüllt
- **Seit Version:** 1.6.0
- **Quelle:** GoBD Verfahrensdokumentation

Pro Release wird unter compliance/reports/v{version}+{build}.md ein Snapshot eingefroren; in der App über Einstellungen abrufbar und teilbar.

**Nachweis:**
- `compliance/checklist.yaml`
- `tool/generate_compliance_report.dart`
- `lib/core/compliance_data.dart`
- `lib/ui/screens/compliance_screen.dart`

**Notizen:** Selbstbezüglich — dieser Eintrag dokumentiert das Werkzeug, das ihn ausspielt.

### ZUG-04 — Brute-Force-Schutz der PIN

- **Kategorie:** Zugriffsschutz
- **Status:** ✅ erfüllt
- **Seit Version:** 2.0.0
- **Quelle:** BSI IT-GS APP.1.4

Nach mehreren Fehlversuchen sperrt die PIN-Eingabe exponentiell länger (ab 5 Versuchen: 30 s / 60 s / 5 min / 15 min / 60 min); der Zähler ist persistent und übersteht App-Neustarts.

**Nachweis:**
- `lib/core/auth/app_lock_service.dart`
- `lib/ui/screens/lock_screen.dart`
- `lib/core/platform_capabilities.dart`

**Notizen:** Der Brute-Force-Schutz der App-PIN gilt auf allen Plattformen. Die Biometrie läuft auf Android/iOS/macOS als reine Biometrie-Prüfung (biometricOnly), also ohne Geräte-Passcode-Fallback. Auf Windows ist das nicht durchsetzbar: Windows Hello trennt Biometrie und Geräte-PIN systembedingt nicht, und local_auth_windows lehnt biometricOnly mit einem UnsupportedError ab. Wer dort Biometrie aktiviert, kann die Systemabfrage folglich auch mit der Windows-PIN bestehen. Die App-eigene 6-stellige PIN inklusive Sperre bleibt davon unberührt und wird in den Sicherheits-Einstellungen entsprechend ausgewiesen.

### VER-03 — Schlüssel gerätegebunden und Keystore-gestützt

- **Kategorie:** Verschlüsselung
- **Status:** ✅ erfüllt
- **Seit Version:** 2.0.0
- **Quelle:** BSI IT-GS SYS.4.5 / APP.4.3

DB-Schlüssel und PIN-Hash werden mit gehärteten Secure-Storage- Optionen abgelegt: Android Keystore-gestützt mit RSA-OAEP- Schlüsselschutz und AES-GCM-Datenverschlüsselung, iOS/macOS Keychain gerätegebunden (first_unlock_this_device, keine iCloud-Keychain- Migration). Einmalige Migration bestehender Keys.

**Nachweis:**
- `lib/core/auth/secure_storage_factory.dart`
- `lib/data/database/database_helper.dart`

**Notizen:** Android allowBackup=false verhindert zusätzlich die Cloud-Sicherung der verschlüsselten DB. Auf Windows übernimmt DPAPI (flutter_secure_storage_windows) die nutzergebundene Ablage; siehe VER-04 für den Ablageort der Datenbank- und Foto-Dateien. Seit 2.0.3 löst flutter_secure_storage 10 die von Google abgekündigten EncryptedSharedPreferences (Jetpack Security) ab: der Bestand wird beim ersten Lesen von RSA PKCS#1 v1.5 / AES-CBC auf RSA-OAEP-SHA-256 / AES-GCM überführt, beide Padding-Oracle-anfälligen Verfahren entfallen damit. Die Ablage bleibt Keystore-gestützt. Ergänzend ist resetOnError explizit auf false gesetzt: der Plugin-Default würde einen nicht entschlüsselbaren Eintrag stillschweigend löschen und damit den DB-Schlüssel verwerfen — ein gemeldeter Fehler ist aus einer Sicherung behebbar, ein verworfener Schlüssel nicht. Seit 2.2.0 bricht der Start zusätzlich ab, wenn am Datenbankpfad eine verschlüsselte Datei liegt, im sicheren Speicher aber kein Schlüssel steht: ein neu erzeugter Schlüssel hätte den alten überschrieben und die Datenbank endgültig unlesbar gemacht. Die Datei bleibt in diesem Fall unangetastet und der Fehler steht im Klartext auf dem Startbildschirm.

### INT-05 — Abbruchsichere Datenbank-Migration

- **Kategorie:** Datenintegrität
- **Status:** ✅ erfüllt
- **Seit Version:** 2.0.0
- **Quelle:** GoBD Datenintegrität

Schema-Migrationen sind idempotent (CREATE TABLE IF NOT EXISTS, spaltenweiser PRAGMA-Check) und brechen auch bei direkten Updates über mehrere Versionsgrenzen nicht ab — Schutz vor Datenverlust durch fehlgeschlagene Migration.

**Nachweis:**
- `lib/data/database/database_helper.dart`
- `test/migration_idempotency_test.dart`
- `test/database_upgrade_test.dart`

**Notizen:** Bis 2.2.0 prüften die Tests nur einzelne Migrationsschritte gegen nachgebaute Schemata; die tatsächliche Aufstiegsroutine lief erstmals auf dem Gerät. Seit 2.2.0 fährt ein Test sie vom Stand v17 und v18 auf die aktuelle Version, einschließlich wiederholtem Lauf nach einem Abbruch.

### INT-06 — Integritätsprüfung bei Backup-Wiederherstellung

- **Kategorie:** Datenintegrität
- **Status:** ✅ erfüllt
- **Seit Version:** 2.0.0
- **Quelle:** GoBD Datenintegrität

Nach dem Import wird die Hash-Kette aller Missionen verifiziert und bei Bruch in der UI gewarnt; fehlende Hashes (Backups vor v16) werden nachgezogen. Wiederherstellung ist atomar — defekte Backups führen nicht zu Datenverlust; Pfadfelder sind gegen Path-Traversal abgesichert.

**Nachweis:**
- `lib/services/backup_service.dart`
- `lib/core/file_path_service.dart`
- `test/backup_photo_swap_test.dart`

**Notizen:** Ab v2.0.1 crash-sicherer Foto-Swap: journaled Übernahme (Journal → .bak → Staging aktivieren); recoverInterruptedRestore() führt unterbrochene Restores beim nächsten Start zu Ende.

### NAW-05 — Audit-Trail für DSGVO-Lösch-/Anonymisierungsaktionen

- **Kategorie:** Beweissicherung / Audit-Trail
- **Status:** ✅ erfüllt
- **Seit Version:** 2.0.0
- **Quelle:** GoBD / DSGVO Art. 5 Abs. 2 (Rechenschaftspflicht)

Foto-Entfernungen und Mission-Anonymisierungen werden mit Akteur, Zeitpunkt und Begründung in einer dedizierten audit_events-Tabelle protokolliert und im Audit-Log angezeigt.

**Nachweis:**
- `lib/services/privacy_service.dart`
- `lib/services/audit_log_service.dart`

### VER-04 — Ablageort ohne Cloud-Spiegelung

- **Kategorie:** Verschlüsselung
- **Status:** ✅ erfüllt
- **Seit Version:** 2.0.2
- **Quelle:** DSGVO Art. 32 / Art. 28

Datenbank, Fotos, Signaturen und Erfassungsbogen-PDFs liegen in einem app-eigenen, nutzergebundenen Verzeichnis, das nicht Teil eines Cloud-Sync-Ordners ist.

**Nachweis:**
- `lib/core/file_path_service.dart`
- `lib/data/database/database_opener.dart`
- `lib/services/backup_service.dart`
- `lib/services/geocoding_service.dart`
- `test/platform_conventions_test.dart`

**Notizen:** Auf Android/iOS ist getApplicationDocumentsDirectory app-privat (internes App-Verzeichnis bzw. Sandbox-Container). Auf Windows liefert dieselbe Funktion dagegen den echten "Dokumente"-Ordner des Nutzers, der dort per Default nach OneDrive gespiegelt wird — Fotos, Signaturen und Bogen-PDFs liegen unverschlüsselt vor und wären ungefragt in die Cloud synchronisiert worden. Windows nutzt deshalb getApplicationSupportDirectory (%APPDATA%\<Firma>\<Produkt>). Der Ablageort ist damit auch nicht Teil einer Auftragsverarbeitung durch Microsoft. Die Zusage gilt nur, solange JEDER Pfad über FilePathService läuft: Backup-Restore und Kartendownload bauten ihre Verzeichnisse zunächst selbst aus getApplicationDocumentsDirectory und hätten auf Windows trotz der obigen Weiche in den Dokumente-Ordner geschrieben (vor dem ersten Windows-Build behoben, nie ausgeliefert). Seitdem erzwingt test/platform_conventions_test.dart, dass diese Funktion ausschließlich in file_path_service.dart aufgerufen wird — die Abweichung ist auf Mobile sonst unsichtbar.

### BAR-01 — Farbkontraste

- **Kategorie:** Barrierefreiheit
- **Status:** ⚠️ teilweise
- **Seit Version:** 2.0.3
- **Quelle:** EN 301 549 / WCAG 2.1 AA (1.4.3, 1.4.11)

Fließtext erreicht mindestens 4,5:1 gegen seinen Hintergrund, bedeutungstragende Icons und Bedienelement-Umrisse mindestens 3:1 — in allen drei Themes (hell, dunkel, Rotlicht).

**Nachweis:**
- `lib/core/theme/etb_status_colors.dart`
- `lib/core/theme/theme_data.dart`
- `test/theme_tokens_test.dart`

**Notizen:** Nachgerechnet und testseitig erzwungen sind die Status-Paletten aller drei Themes und die Textfarben des Rotlicht-Modus; derselbe Test verbietet feste Material-Farbtöne in der UI, weil die jedes Theme ignorieren. Das ist kein flächendeckender Nachweis: geprüft werden die Paletten, nicht jede einzelne Vorder-/Hintergrund-Kombination im laufenden Layout. Ein vollständiger Durchgang über alle Screens steht aus, deshalb "teilweise". Vor 2.0.3 lagen mehrere Werte unter der Schwelle — das "Aktiv"-Badge der Einsatzliste bei 2,99:1, die Compliance-Übersicht bei 1,97 bis 3,16:1 und der Nebentext des Rotlicht-Modus bei 2,91:1.

### BAR-02 — Mindestgrößen von Bedienelementen

- **Kategorie:** Barrierefreiheit
- **Status:** ⚠️ teilweise
- **Seit Version:** 2.0.3
- **Quelle:** EN 301 549 / WCAG 2.1 AAA (2.5.5), Material Design

Tippbare Elemente sind mindestens 48 x 48 dp groß, damit sie auch mit Einsatzhandschuhen sicher getroffen werden.

**Nachweis:**
- `lib/ui/widgets/log_entry_card.dart`
- `lib/ui/widgets/mission_summary_card.dart`
- `lib/ui/screens/timeline_screen.dart`
- `test/touch_target_test.dart`

**Notizen:** Der Test misst die tatsächlich gerenderten Größen der beiden Listenkarten. Flutter polstert Tap-Ziele über materialTapTargetSize.padded von sich aus auf 48 dp; kritisch sind genau die Stellen, an denen der Code das überschreibt — vor 2.0.3 waren das die Aktions-Knöpfe der Karten (36 dp), die Foto-Vorschau (40 dp) und das Auswahlmenü für neue Einträge (40 dp). Nicht abgedeckt: Screens außerhalb der beiden Karten und des Quick-Action-Sheets sind nicht automatisiert vermessen.

### BAR-03 — Skalierbare Schrift

- **Kategorie:** Barrierefreiheit
- **Status:** ⚠️ teilweise
- **Seit Version:** 2.0.3
- **Quelle:** EN 301 549 / WCAG 2.1 AA (1.4.4, 1.4.10)

Die App übernimmt die Systemschriftgröße; das Layout bleibt bis zur doppelten Skalierung lesbar und schneidet keine Inhalte ab.

**Nachweis:**
- `lib/ui/widgets/log_entry_card.dart`
- `lib/ui/widgets/mission_summary_card.dart`
- `lib/ui/screens/home_screen.dart`
- `lib/ui/widgets/hazard_level_badge.dart`
- `test/dynamic_type_test.dart`
- `test/hazard_assessment_list_test.dart`

**Notizen:** Der Test rendert die Listenkarten bei Skalierung 1,0 / 1,3 / 2,0 und lässt keinen Layout-Überlauf durch — Flutter meldet den sonst nur als Streifenmuster im Bild, das im Betrieb niemand meldet. Vor 2.0.3 lief die Anonymisiert-Zeile der Einsatzkarte um 75 px über den Rand, und die Zellenhöhe der Einsatzliste war über childAspectRatio an die Spaltenbreite gebunden, sodass Karten auf Tablets schon bei normaler Schriftgröße abgeschnitten wurden. In 2.2.0 kam das Stufen-Kürzel der Gefährdungsbeurteilung dazu: es hatte eine feste Breite von 64 dp und brach bei Skalierung 2,0 dreizeilig um, ohne dass Flutter etwas meldete. Es misst sich jetzt an einer Mindestbreite und wird bei 1,0 / 1,3 / 2,0 nachgemessen. Nicht abgedeckt: Formulare, Einstellungen und Dialoge sind darüber hinaus nicht automatisiert auf Überlauf geprüft.

### BAR-04 — Screenreader-Unterstützung

- **Kategorie:** Barrierefreiheit
- **Status:** ⚠️ teilweise
- **Seit Version:** 2.0.3
- **Quelle:** EN 301 549 / WCAG 2.1 A (1.1.1, 4.1.2)

Bedienelemente tragen einen sprechenden Namen, Zustände werden angesagt, und rein dekorative Doppelungen bleiben stumm.

**Nachweis:**
- `lib/ui/widgets/log_entry_card.dart`
- `lib/ui/widgets/mission_summary_card.dart`
- `lib/ui/screens/lock_screen.dart`
- `lib/ui/screens/compliance_screen.dart`
- `lib/ui/screens/hazard_assessment_form_screen.dart`
- `test/touch_target_test.dart`
- `test/hazard_assessment_form_test.dart`

**Notizen:** Der überwiegende Teil der Oberfläche besteht aus Material-Widgets, die ihre Semantik mitbringen. Ergänzt wurden die Stellen, an denen das nicht reicht: laufende Nummer eines Eintrags, Foto-/PDF-Anlage, Rücktaste und Fortschritt der PIN-Eingabe, Status-Symbole. Label und Tap-Aktion liegen dabei über MergeSemantics auf demselben Knoten — ein danebenliegender Knoten wäre vorlesbar, aber nicht auslösbar. In 2.2.0 kamen die Auswahl-Chips der Gefährdungsbeurteilung dazu: 22 Zeilen mit je vier Chips lasen sich ohne Bezug zur Zeile, und der Chip für „keine Bewertung" trug sichtbar nur einen Strich. Beide tragen jetzt einen sprechenden Namen samt Zeilenbezug. Ausdrücklich offen: Es hat kein Durchgang mit TalkBack oder VoiceOver auf einem echten Gerät stattgefunden, und die Vorlesereihenfolge ist nicht systematisch geprüft. Der Status bleibt deshalb "teilweise", bis das nachgeholt ist.

## Hinweis

Dieser Bericht ist eine Selbstauskunft. Höhere Beweiskraft erreichst du durch (a) externe Hashing-/Notarisierungs-Dienste bei Auslieferung oder (b) Veröffentlichung der Reports auf einer öffentlichen Quelle (z.B. GitHub Releases). Der Master-Hash am Ende dieses Dokuments erlaubt jedem Empfänger die Konsistenzprüfung gegen die in der App eingebettete Version (`lib/core/compliance_data.dart`).
## Master-Hash

`30d692a64edd3bdd46d23a1d6ef3d30fb8e33c3a14ccfa1557c251977bac5938`
