From dc7dcfb5f3b83d8b119cd6410b93f7d8b2e2b749 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Sat, 11 Jul 2026 15:42:18 +0200 Subject: [PATCH] Docs: neue Fixes in todo + TESTING nachpflegen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit todo.md: drei letzte Bug/Feature-Einträge - AutosaveDateInput (Kündigungsdatum-Fokus-Sprung) - IMAP-Humanizer (Anhang + Sync) - Bankkarte-Beschreibung in Vertrags-Ansicht + Select TESTING.md: neuer Abschnitt "E-Mail-Client (IMAP/Anhänge)" mit Testfällen für Sync-Fehler, Anhang-Download-Fehler und Autosave-Datumsfelder. Co-Authored-By: Claude Opus 4.7 --- docs/TESTING.md | 34 ++++++++++++++++++++++++++++++++++ docs/todo.md | 31 +++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/docs/TESTING.md b/docs/TESTING.md index 7715fe9b..62b7e536 100644 --- a/docs/TESTING.md +++ b/docs/TESTING.md @@ -162,6 +162,40 @@ ob der Eintrag erstellt wurde. --- +## 📎 E-Mail-Client (IMAP/Anhänge) + +### 1. Postfach-Sync + +- [ ] Kunde-Detail → Tab "E-Mail-Postfach" → Sync-Button → "E-Mails synchronisiert"-Toast +- [ ] Falsches Postfach-Passwort im Backend hinterlegen → Sync-Button → Toast zeigt + **klare Meldung** "IMAP-Login abgelehnt. Das gespeicherte Postfach-Passwort stimmt + nicht mehr…" – **NICHT** "Command failed" +- [ ] Postfach-Passwort im Modal neu setzen ("Passwort synchronisieren") → nächster + Sync klappt + +### 2. Anhang-Download + +- [ ] E-Mail mit PDF-Anhang öffnen → "Anzeigen" klickt → PDF öffnet inline im neuen Tab +- [ ] Bei falschem Postfach-Passwort: klare Fehlermeldung wie bei Sync (nicht + "Command failed") +- [ ] Anhang einer server-seitig gelöschten E-Mail → Meldung "Nachricht existiert im + IMAP-Postfach nicht mehr … bitte E-Mail-Liste neu synchronisieren" + +### 3. Autosave-Datumsfelder (Vertrag) + +- [ ] Vertrag mit Status Gekündigt/etc. öffnen → Kündigungsbestätigung hochladen → + "Bestätigung erhalten am"-Feld erscheint +- [ ] Datum manuell eintippen (Tag → Monat → Jahr, Ziffer für Ziffer) → **Cursor bleibt + im Feld**, Seite scrollt NICHT, Fokus springt NICHT raus +- [ ] Nach Verlassen des Felds (Tab / Klick woanders) → Speichern feuert einmal, Datum + ist gespeichert +- [ ] Enter im Feld → speichert und verlässt Feld +- [ ] Escape im Feld → verwirft Änderung, alter Wert wieder da +- [ ] Gleicher Test für "Bestätigung erhalten am"-Feld unter Kündigungsbestätigung + Optionen + +--- + ## Wie benutzen? 1. Diese Datei öffnen diff --git a/docs/todo.md b/docs/todo.md index 65b8cd09..5f2526d9 100644 --- a/docs/todo.md +++ b/docs/todo.md @@ -97,6 +97,37 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung ## ✅ Erledigt +- [x] **🐞 Kündigungsdatum: Cursor sprang beim Tippen aus dem Feld** + - `` feuerte `onChange` bei jedem Tastendruck; sobald + z.B. `18.08.0002` ein gültiges Datum ergab, feuerte die PUT-Mutation, + Server-Antwort re-renderte den Input, Cursor sprang raus, Seite + scrollte, weiteres Tippen landete im nächsten Feld. + - Fix: neue `AutosaveDateInput`-Komponente hält den Wert während der + Eingabe lokal, feuert `onSave` erst bei Blur/Enter. Escape verwirft. + Angewendet auf beide Kündigungsbestätigungs-Datumsfelder in + ContractDetail. Andere App-Datumsfelder laufen über react-hook-form + (batched Submit) und sind nicht betroffen. + +- [x] **🐞 IMAP-Fehler: „Command failed" ohne Kontext** + - `imapflow` wirft bei jedem IMAP-NO/BAD-Response nur + `new Error('Command failed')` und legt Details in `.responseText`/ + `.responseStatus` ab. Wir haben sie nirgends gelesen → User sah + im Sync-Toast und im Anhang-Download nur "Command failed" ohne + Ursache. Realer Fall: abgelaufenes Postfach-Passwort. + - Fix: zentraler `humanizeImapError()`-Helper in `imapService.ts`. + Extrahiert responseText/responseStatus, erkennt Auth-Fehler, + UID-Stale, TLS-/Netzwerk-Fehler und gibt jeweils eine klare + Meldung mit Handlungsanweisung zurück. Angewendet auf + `fetchAttachmentInner`, `downloadAttachment`-Controller und + `syncEmailsForAccount`. + +- [x] **🆕 Bankkarte-Beschreibung in Vertragsansicht + Auswahl** + - Nach dem Anlegen des `description`-Feldes (Bankkarten-Modal) wird + die Beschreibung jetzt auch in der Vertragsansicht (Bankkarten-Card) + und im ContractForm-Select angezeigt. Im Select mit + Whitespace-Flatten und 60-Zeichen-Cap, damit lange Notizen den + Select nicht sprengen. + - [x] **🔒 Pentest R104.1 – Salutation-Endpunkte: 404 statt 500** - INFO-Finding: `GET/PUT /api/customers/:id/salutation-preference` warfen bei nicht-existierendem Customer 500 statt 404.