Kundenakte: Tab "Geworben / angeworben" (Kundenempfehlungen)
Neuer Tab vor "Datenschutz", nur Mitarbeiter/Admin (nicht Portal), ohne Consent-Pflicht. Zwei Abschnitte: 1. "<Kunde> wurde an Board geholt durch:" – max. 1 Werber (DB-Unique auf recruitedId). 2. "<Kunde> hat folgende Kunden an Board geholt:" – beliebig viele. Jede Zeile: Kunde per Lupe-Such-Modal (breite Suche über Name/ Kundennr./Firma/E-Mail/Telefon) + Beziehungs-Dropdown. Löschen + Externtab-Link zur Kundenakte pro Zeile. Bidirektional aus EINEM Datensatz: "A geworben durch B" erscheint automatisch bei B unter "hat geworben"; von beiden Akten hinzufügbar/löschbar. Backend: neues Model CustomerReferral (recruiter/recruited FKs, recruitedId @unique, relationship) + Migration. Beziehungs-Whitelist serverseitig; Self-Werbung + Doppel-Werber (409) abgefangen. Portal-Token wird explizit geblockt (Defense-in-Depth, nicht nur UI-Ausblendung). CREATE/DELETE auditiert. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -97,6 +97,25 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
|
||||
|
||||
## ✅ Erledigt
|
||||
|
||||
- [x] **🤝 Kundenakte: Tab „Geworben / angeworben" (Kundenempfehlungen)**
|
||||
- Neuer Tab vor „Datenschutz", **nur Mitarbeiter/Admin** (nicht Portal),
|
||||
**ohne** Consent-Pflicht nutzbar. Zwei Abschnitte:
|
||||
1. „<Kunde> wurde an Board geholt durch:" – **max. 1** Werber
|
||||
(DB-Unique auf `recruitedId`).
|
||||
2. „<Kunde> hat folgende Kunden an Board geholt:" – beliebig viele.
|
||||
- Jede Zeile: Kunde (per Lupe-Modal gesucht, breite Suche über
|
||||
Name/Nr./Firma/E-Mail/Telefon) + Beziehungs-Dropdown (Ehepartner/in,
|
||||
Kind, Freund/Kumpel, … „Bitte auswählen!"). Löschen + Externtab-Link
|
||||
zur Kundenakte pro Zeile.
|
||||
- **Bidirektional aus einem Datensatz:** trägt man in Kunde A „geworben
|
||||
durch B" ein, erscheint A automatisch bei B unter „hat geworben".
|
||||
Von beiden Akten hinzufügbar/löschbar.
|
||||
- Neues Model `CustomerReferral` (recruiter/recruited FKs, `recruitedId`
|
||||
@unique, `relationship`) + Migration. Beziehungs-Whitelist server-
|
||||
seitig; Self-Werbung + Doppel-Werber (409) abgefangen; Portal-Token
|
||||
explizit geblockt (Defense-in-Depth, nicht nur UI). CREATE/DELETE
|
||||
auditiert.
|
||||
|
||||
- [x] **🔄 „Neue Version verfügbar"-Banner (offener-Tab-Problem)**
|
||||
- Cache-Header waren schon optimal (index.html `no-store`, Assets
|
||||
`immutable`) – aber eine laufende SPA holt sich nach einem Deploy
|
||||
|
||||
Reference in New Issue
Block a user