Docs: neue Fixes in todo + TESTING nachpflegen
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 <noreply@anthropic.com>
This commit is contained in:
@@ -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?
|
## Wie benutzen?
|
||||||
|
|
||||||
1. Diese Datei öffnen
|
1. Diese Datei öffnen
|
||||||
|
|||||||
@@ -97,6 +97,37 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
|
|||||||
|
|
||||||
## ✅ Erledigt
|
## ✅ Erledigt
|
||||||
|
|
||||||
|
- [x] **🐞 Kündigungsdatum: Cursor sprang beim Tippen aus dem Feld**
|
||||||
|
- `<input type=date>` 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**
|
- [x] **🔒 Pentest R104.1 – Salutation-Endpunkte: 404 statt 500**
|
||||||
- INFO-Finding: `GET/PUT /api/customers/:id/salutation-preference`
|
- INFO-Finding: `GET/PUT /api/customers/:id/salutation-preference`
|
||||||
warfen bei nicht-existierendem Customer 500 statt 404.
|
warfen bei nicht-existierendem Customer 500 statt 404.
|
||||||
|
|||||||
Reference in New Issue
Block a user