feat(dsgvo): Löschkonzept/Aufbewahrungsfristen (Auto-Purge)

Neuer retention_service.py: Lohn-/zeitrelevante Daten (time_entries,
hours_payouts) werden nach konfigurierbarer Frist gelöscht
(company.settings.retention_lohn_years, Default 10 Jahre). Technische
Tabellen mit fester Frist: audit_logs (3 Jahre), abgelaufene
sessions/password_resets (sofort).

Täglicher Scheduler-Job (03:00 Uhr, Redis-Tageslock analog Reminder-Jobs)
plus manuelle Trigger: POST /companies/me/run-retention-purge
(COMPANY_ADMIN/HR, nur eigene Firma) und POST /admin/run-retention-purge
(SUPER_ADMIN, global inkl. technischer Tabellen).

Letzter offener Punkt aus dem DSGVO-Löschkonzept (Art. 15/17 bereits erledigt).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Gis16MnuwkYcivLrSxK1pD
This commit is contained in:
2026-08-27 09:04:27 +02:00
co-authored by Claude Sonnet 5
parent 7166bbb5aa
commit 5a9e432a80
6 changed files with 271 additions and 1 deletions
+3 -1
View File
@@ -13,12 +13,14 @@ class CompanySettingsUpdate(BaseModel):
Nur bekannte Top-Level-Keys sind erlaubt (extra="forbid").
Derzeit genutzte Keys: carryover_expires_month, carryover_expires_day
(gelesen in absences.py für Resturlaub-Verfall-Berechnung).
(gelesen in absences.py für Resturlaub-Verfall-Berechnung), retention_lohn_years
(gelesen in retention_service.py für Aufbewahrungsfrist Zeiterfassung/Auszahlungen).
"""
model_config = ConfigDict(extra="forbid")
carryover_expires_month: int | None = Field(None, ge=1, le=12)
carryover_expires_day: int | None = Field(None, ge=1, le=31)
retention_lohn_years: int | None = Field(None, ge=1, le=30)
class CompanyOut(BaseModel):