---
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
