Aufgaben ohne Kunde/Vertrag anlegbar

ContractTask.contractId nullable (Migration). Neuer staff-only Endpoint
POST /tasks fuer allgemeine Aufgaben ohne Vertrag/Kunde. Ohne Vertrag gibt
es keinen Kunden -> visibleInPortal serverseitig immer false, Portal-Reply
403 bei contractloser Aufgabe, getAllTasks-Portal-Filter schliesst sie
automatisch aus (kein contract-Match).

Task-Modal (Mitarbeiter): Checkbox "Ohne Kunde (allgemeine Aufgabe)" blendet
Kunden-/Vertragsauswahl UND "Im Kundenportal sichtbar" aus. Task-Liste zeigt
solche Aufgaben als "Allgemeine Aufgabe (ohne Vertrag)" ohne Vertrags-Link/
Zum-Vertrag-Button.

Verifiziert: contractlose Aufgabe -> contractId null, visibleInPortal
erzwungen false (auch wenn true geschickt); mit Vertrag weiterhin waehlbar.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-08-18 14:15:33 +02:00
co-authored by Claude Opus 4.8
parent b8128616f2
commit 15142676ef
9 changed files with 161 additions and 35 deletions
+21
View File
@@ -97,6 +97,27 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
## ✅ Erledigt
- [x] **📋 Aufgaben ohne Kunde/Vertrag anlegbar** (2026-08-18)
- `ContractTask.contractId` nullable (Migration `20260818110000`). Neuer Endpoint
`POST /tasks` (staff-only, `contracts:update`) für allgemeine Aufgaben ohne
Vertrag/Kunde. Ohne Vertrag → **kein Kunde → nie im Portal sichtbar**
(`visibleInPortal` serverseitig erzwungen false; Portal-Reply-Endpoint 403 bei
contractloser Aufgabe; getAllTasks-Portal-Filter schließt sie automatisch aus).
- Task-Modal (Mitarbeiter): Checkbox „Ohne Kunde (allgemeine Aufgabe)" blendet
Kunden-/Vertragsauswahl **und** „Im Kundenportal sichtbar" aus. Task-Liste zeigt
solche Aufgaben als „Allgemeine Aufgabe (ohne Vertrag)" (kein Vertrags-Link).
- [x] **📧 Kunde: E-Mail Pflichtfeld + keine verwaltete Provider-Domain** (2026-08-18)
- Private Kunden-E-Mail (`Customer.email`) darf nicht auf einer bei den E-Mail-
Providern konfigurierten Domain (oder Subdomain) liegen → man trägt so keine
verwaltete Weiterleitungs-/Mailbox-Adresse als private Adresse ein. E-Mail ist
jetzt Pflichtfeld (Frontend `required` + Backend create/update).
- Helper `getConfiguredEmailDomains`/`emailUsesDomain` im emailProvider-Service.
- [x] **⚡ Energievertrag: Ankreuzfeld „Keine Bonis erwünscht"** (2026-08-18)
- `EnergyContractDetails.noBonusDesired` (Boolean, Migration `20260818100000`).
Checkbox im Vertragsformular (Strom/Gas), Anzeige im Vertragsdetail.
- [x] **🔌 MaLo-ID (Marktlokation) an die Lieferadresse verschoben (Strom/Gas)** (2026-08-14)
- MaLo-ID gehört zur **(Liefer-)Adresse**, nicht zum Vertrag. Adresse bekommt
**zwei Felder**: `maloIdElectricity` (Strom) + `maloIdGas` (Gas) im AddressModal