Statt Hard-Delete (kollidiert mit Lohn-/Steuer-Aufbewahrung) werden bei DSGVO-Löschanfrage die personenbezogenen Felder der bestehenden User-Zeile überschrieben; referenzierte Daten (Zeit/Abwesenheit/Auszahlung/AuditLog) bleiben entkoppelt erhalten. - users.anonymized_at (Migration 0040); UserOut.anonymized_at. - user_service.anonymize_user: überschreibt Name/E-Mail (eindeutig anon-<id>@deleted.local), entfernt Auth-Material (Passwort/PIN/QR/NFC/TOTP/LDAP-DN), is_active=False, löscht Sessions, AuditLog 'user_anonymized'. Personalnummer bleibt reserviert (kein Personenbezug mehr). Selbst-Anonymisierung (400), Doppelanonymisierung/Reaktivierung anonymisierter Konten (409). - POST /users/{id}/anonymize (COMPANY_ADMIN/SUPER_ADMIN, mandantengeprüft). - UsersPage: "Anonymisieren"-Button mit Sicherheitsabfrage + "Anonymisiert"-Badge. 193/193 Tests grün. Deployed 137 + 164. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
FZA Einzelstunden: - Absence.fza_hours (Numeric 5,2) — FZA in Stunden statt Tagen - Migration 0032: fza_hours Spalte in absences - AbsenceCreate/AbsenceOut Schema um fza_hours erweitert - absence_service: _deduct/_refund_overtime nutzt fza_hours direkt wenn gesetzt - Frontend: Tage/Stunden-Toggle im FZA-Antrag-Modal Security K-1: Privilege Escalation via PATCH /users/{id}.role - user_service: Whitelist für Rollenänderungen, SUPER_ADMIN nur durch SUPER_ADMIN - Letzter COMPANY_ADMIN gegen Selbst-Demotion gesichert Security K-2: Kiosk-IP-Whitelist hinter nginx - kiosk_security: _get_client_ip() liest X-Real-IP statt request.client.host Security K-3: Kiosk-PIN Brute-Force-Schutz - kiosk_auth_service: Redis-Lockout nach 5 Fehlversuchen (15 min) Security K-4: TOTP-Setup-Hijacking - auth router: /totp/setup abgelehnt wenn TOTP bereits aktiv Security K-5: Separater Fernet-Key - config: SECRET_KEY_DATA Feld (optional, Fallback auf SECRET_KEY) - crypto: get_fernet_key() mit Warning bei fehlendem SECRET_KEY_DATA Security H-2: Vacation Balance nur HR/Admin - absences router: PATCH /balance nur noch HR/COMPANY_ADMIN/SUPER_ADMIN + AuditLog Security H-3: Rate-Limits auf /auth/refresh + /auth/logout - auth router: 30/min auf refresh, 60/min auf logout Security H-4: Login-Failure-Logging + Lockout - auth_service: Redis-Counter, Lockout nach 10 Versuchen (15 min) - AuditLog für login_success und login_failed Security M-1: Nginx Security-Header - nginx.conf: X-Frame-Options, X-Content-Type-Options, CSP, Referrer-Policy, X-XSS-Protection, Permissions-Policy Security M-3: AuditLog bei Rollenänderungen - user_service: action=role_changed mit old/new role Security M-6: create_all nur in Development - main.py: Base.metadata.create_all nur wenn not settings.is_production Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Stand: agent-06 (Audit-Log), agent-05 (Krankmeldung), agent-07 Phase 1 (Personalnummer), Busylight-Pull-Integration, TOTP/2FA, Abwesenheiten, Zeiterfassung, Kiosk-Grundgerüst. Migrations 0001–0023 deployed auf 192.168.1.137 + .164. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>