--- id: PROJ-20 title: Nutzer-Löschung & E-Mail-Verbleib (GoBD-konform) status: Deployed created: 2026-03-17 --- ## Ziel Definiert und implementiert das Verhalten beim Löschen eines Benutzerkontos in Bezug auf archivierte E-Mails, IMAP-Verbindungen und Compliance-Anforderungen. ## Hintergrund E-Mails im Archiv sind Unternehmenseigentum und nicht an einen Benutzeraccount gebunden. Die GoBD schreibt eine Aufbewahrungspflicht von 6–10 Jahren vor, die auch nach Ausscheiden eines Mitarbeiters gilt. Daher dürfen E-Mails bei einer Konto-Löschung **nie automatisch mitgelöscht** werden. ## Verhalten ### E-Mails - E-Mails haben **keinen Fremdschlüssel auf `users`** — sie sind global im Archiv gespeichert. - Bei jeder Art von Konto-Entfernung bleiben alle E-Mails vollständig erhalten. - Keine automatische Löschung, kein Cascade. ### IMAP-Verbindungen - Beim **endgültigen Löschen** eines Nutzers werden alle IMAP-Konten (`imap_accounts WHERE owner = username`) mitgelöscht. - Sync-Jobs laufen nicht mehr ins Leere. ### Audit-Log - Jede Löschung wird im Audit-Log erfasst mit: `user_id`, `username`, `role`, Anzahl gelöschter IMAP-Konten und dem Hinweis `emails retained per GoBD`. ## Zwei Aktionen im Admin-UI | Aktion | Effekt | Rückgängig | |--------|--------|------------| | **Deaktivieren** (empfohlen) | `active = false`, Login gesperrt, Konto + IMAP erhalten | Ja — jederzeit reaktivierbar | | **Endgültig löschen** | Account + IMAP-Konten entfernt, E-Mails bleiben | Nein | ## Implementierung ### Backend (`internal/api/server.go`) - `handleDeleteUser`: Lädt Nutzername vor Löschung, ruft `imapStore.DeleteByOwner()`, schreibt erweitertes Audit-Log. ### IMAP Store (`internal/imap/store.go`) - Neue Methode: `DeleteByOwner(ctx, username) (int, error)` — löscht alle IMAP-Konten eines Nutzers. ### Frontend (`src/app/admin/page.tsx`) - Löschen-Button öffnet Dialog statt `confirm()`. - Dialog zeigt: GoBD-Hinweis, Erklärung beider Optionen, Deaktivieren-Button (primär), Löschen-Button (destruktiv). - Deaktivieren ruft `PATCH /api/users/{id}` mit `{ active: false }`. - Löschen ruft `DELETE /api/users/{id}`. ## Akzeptanzkriterien - [x] Löschen eines Nutzers entfernt keine E-Mails - [x] Löschen eines Nutzers entfernt dessen IMAP-Konten - [x] Audit-Log enthält Nutzername, Rolle und IMAP-Anzahl - [x] Admin-UI zeigt Warn-Dialog mit GoBD-Hinweis - [x] Deaktivieren als separate, bevorzugte Aktion verfügbar - [x] Bereits deaktivierte Nutzer: Deaktivieren-Button inaktiv