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:
2026-07-27 17:50:15 +02:00
co-authored by Claude Opus 4.7
parent 6b08762ff9
commit cda6d2814e
10 changed files with 744 additions and 1 deletions
+19
View File
@@ -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