E-Mail-Compose: Vertragsdokumente anhängen + Kundendaten einfügen

Zwei neue Buttons im Compose-Modal (nur sichtbar bei Vertrag-
Kontext):

- Vertragsdokumente: listet alle am Vertrag gespeicherten
  ContractDocuments gruppiert nach documentType. Auswahl →
  Token-Download via fileUrl → base64 → Anhang.
- Kundendaten einfügen: zeigt Sections nur wenn Daten vorhanden
  (Customer, Lieferadresse, ggf. Rechnungsadresse, Vertrag, Bank,
  Ausweis). Bei Bank/Ausweis zusätzlich Sub-Checkbox "als PDF
  anhängen" wenn documentPath vorhanden. Text-Blöcke ans Body-
  Ende, PDFs in attachments[]. 25-MB-Limit beidseitig geprüft.

Helpers in composeAttachmentHelpers.ts:
- serverFileToAttachment(path, filename) für Token-URL→Blob→base64
- totalAttachmentBytes mit ~33% base64-Overhead
- sprechende Dateinamen via bankCardAttachmentName /
  identityDocAttachmentName

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-06-21 15:55:13 +02:00
parent 4ab0340473
commit 5293af18a5
5 changed files with 827 additions and 10 deletions
+25
View File
@@ -97,6 +97,31 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
## ✅ Erledigt
- [x] **🆕 E-Mail-Compose: Vertragsdokumente anhängen + Kundendaten einfügen**
- Im Compose-Modal (nur wenn Vertrag-Kontext) zwei neue Buttons neben
"Datei anhängen":
- **Vertragsdokumente**: listet alle am Vertrag gespeicherten Dokumente
gruppiert nach `documentType`. Auswahl → Server-Download via
`fileUrl` (Token-Auth, Per-File-Ownership-Check greift) → base64 →
direkt in die Anhang-Liste. Respektiert das 25-MB-Gesamtlimit.
- **Kundendaten einfügen**: zeigt nur Sections die tatsächlich Daten
haben (Customer, Lieferadresse, ggf. Rechnungsadresse, Vertrag,
Bank, Ausweis). Pro Section Checkbox + Preview. Bei Bank +
Ausweis zusätzlich Sub-Checkbox "als PDF anhängen", wenn ein
`documentPath` vorhanden ist.
- Beim Bestätigen werden die Text-Blöcke an das Body-Ende gehängt
(mit `\n\n`-Separator), Anhänge per `serverFileToAttachment` aus
`composeAttachmentHelpers.ts` gezogen. Anhang-Limit (25 MB gesamt)
wird beidseitig geprüft, drüberlaufende Dateien werden mit Toast
übersprungen statt silent weggeschluckt.
- Helpers (`composeAttachmentHelpers.ts`):
- `serverFileToAttachment(path, filename)` fetch via Token-URL
→ Blob → base64 → `EmailAttachment`.
- `totalAttachmentBytes` Größen-Check unter Berücksichtigung der
~33 % base64-Overhead.
- `bankCardAttachmentName` / `identityDocAttachmentName`
sprechende Dateinamen für den Empfänger.
- [x] **🔒 Pentest R95 Portal-Username (Manual-Modus) härten**
- R95.1 (MEDIUM): `foo\r\nBcc:evil@x.de` → Header-Injection-Vektor
sobald der Wert in Mail-Templates / PDF-Footer landet.