Plan Kern-Kette P6-P7 (Kontakte, Leads) + Datei-Teilen v1

- WF-P6 Kontakte und Organisationen: Kontaktmodell validiert (ein Datensatz,
  Kontaktart = Rolle der Verknuepfung, Shell-Prinzip), Karteikarte als
  Detailseiten-Muster (Zweispalter + Reiter)
- WF-P7 Leads: Triage-Inbox, Lead->Projekt als grosses Modal (+Bulk),
  CSV-Import-Wizard (Davids Delta/CR), Quellen + Spam-Schutz
- WF-P4 Dateien: Teilen/Freigeben in v1 (intern + Link, Preset Mit mir geteilt)
- Paket-Canvases auf Default-Kurven, MD-Verknuepfungen je Canvas

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
davidandClaude Fable 5 committed 2026-07-08 23:17:54 +02:00
1 parent e48a5a46e8
commit ca078436df
28 files changed
+2424 -432

No files matched your search

@@ -0,0 +1,57 @@
---
kind: screen
project: HiveGrid Screen Project
ticket: D-P7
package: WF-P7 Leads
id: M01
screen: Lead zu Projekt
typ: Modal (gross)
umsetzung: Bauen
status: Validiert
route: "aus S01/S02, nur bei Freigabe = ja"
subframe: ""
---
# M01 — Lead → Projekt ⭐
## Ziel
Der Kern-Moment der Kette: aus einer guten Anfrage wird ein Projekt — kontrolliert, mit sauberem Kontakt dran.
## Was das Tool können muss
- **Daten-Vererbungs-Vorschau**: welche Lead-Felder ins Projekt fließen (Name, Nachricht, eigene Felder …)
- **Ziel-Board + Start-Spalte wählen** (Default-Vorauswahl beim Subframe-Bau klären)
- **Kontakt separat verknüpfen**: Auto-Match-Vorschlag (gleiche E-Mail/Telefon) → bestehenden wählen ODER neu anlegen (öffnet [[M01 Kontakt anlegen]] aus P6, vorbefüllt)
- Fehlende Pflichtdaten (z. B. Name) direkt im Modal nachtragen (Mängel-Banner)
- **Bulk-Variante** (Davids Ergänzung): mehrere Leads auf einmal — gemeinsame Board-Wahl, Kontakt-Match je Lead, Konfliktliste für Leads ohne Match
## Pattern / Archetyp
A5 großes Modal (echtes Modal: DialogLayout → Dialog → Dialog.Content) mit drei Sektionen.
## Aufbau
1. **Was wird übernommen** — Vorschau der vererbten Felder
2. **Wohin** — Pipeline/Board + Start-Spalte
3. **Wer** — Kontakt (Match-Vorschlag / suchen / neu anlegen)
## Aktionen
- »Projekt erstellen« → Projekt existiert, Lead wird `converted`, Sprung zur Projekt-Detailseite (Toast mit Link)
- Abbrechen
## Meldungsentscheidung
| Ereignis | UI-Form | Blockiert? | Umsetzung | Copy/Notiz |
|---|---|---|---|---|
| Pflichtdaten fehlen | Mängel-Banner + Inline-Nachtragen | ja (Aktion) | Nur dokumentieren | z. B. fehlender Name |
| Bulk: Lead ohne Kontakt-Match | Konflikt-Zeile in Bulk-Ansicht | nein | Nur dokumentieren | einzeln nachziehen |
## Subframe
- (erst nach explizitem OK)
## Notizen
- Ersetzt das alte 4-Optionen-Promotion-Modal (Pivot AD-20). Bulk-Machbarkeit → Dev-Frage beim Handoff.
@@ -0,0 +1,42 @@
---
kind: screen
project: HiveGrid Screen Project
ticket: D-P7
package: WF-P7 Leads
id: M02
screen: Anfrage anlegen
typ: Modal
umsetzung: Bauen
status: Validiert
route: "aus S01 (Route /leads/new bleibt Dev-seitig)"
subframe: ""
---
# M02 — Anfrage anlegen
## Ziel
Anruf kommt rein, kein passender Kontakt — Anfrage in Sekunden erfassen.
## Was das Tool können muss
- Schnelles Erfassen: Vor-/Nachname, E-Mail, Telefon, Nachricht, Quelle (Default: manuell), Verantwortlicher (Default: ich), Tags
- **Live-Match-Check beim Tippen**: »Gibt es schon als Kontakt/Anfrage« mit Sprung-Link
## Pattern / Archetyp
A5 Dialog, gleiche Mechanik wie »Kontakt anlegen« (P6).
## Aktionen
- »Anlegen« → Anfrage erscheint in der Inbox, Detail öffnet
- Abbrechen
## Subframe
- (erst nach explizitem OK)
## Notizen
- Davids Delta: Modal statt eigener Seite (Ticket sah `/leads/new` als Seite vor — UI-Form ist Designer-Freiheit).
- D01 Inline-Anlegen (Plus → Zeile) als »Später«-Muster dokumentiert.
@@ -0,0 +1,47 @@
---
kind: screen
project: HiveGrid Screen Project
ticket: D-P7
package: WF-P7 Leads
id: M03
screen: CSV-Import
typ: Modal/Wizard
umsetzung: Bauen
status: Validiert (Davids Delta)
route: "aus S01, Importieren-Knopf"
subframe: ""
---
# M03 — CSV-Import-Wizard
## Ziel
Ganze Listen auf einmal reinholen (z. B. Messekontakte, Alt-Bestand) — mit sauberer Feld-Zuordnung statt Chaos. **Davids Delta: steht nicht im Dev-Ticket → Change-Request.**
## Was das Tool können muss
- CSV-Datei hochladen (Dropzone-Baustein aus P4)
- **Spalten-Zuordnung**: jede CSV-Spalte einem Lead-Feld zuordnen (Auto-Vorschlag bei passenden Überschriften, eigene Felder wählbar, Spalte überspringen möglich)
- **Vorschau vor dem Import**: erste Zeilen gemappt anzeigen, Fehler markieren (ungültige E-Mail, leere Pflichtwerte)
- **Duplikat-Behandlung wählen**: überspringen / trotzdem anlegen / als möglichs Duplikat markieren
- Import läuft im Hintergrund; Ergebnis-Meldung (»142 importiert, 3 übersprungen — Liste ansehen«)
## Pattern / Archetyp
A5 mehrstufiger Wizard: 1. Datei → 2. Spalten zuordnen → 3. Vorschau + Duplikat-Regel → 4. Import läuft/Ergebnis.
## Meldungsentscheidung
| Ereignis | UI-Form | Blockiert? | Umsetzung | Copy/Notiz |
|---|---|---|---|---|
| Datei nicht lesbar / falsches Format | Schritt-Fehler | ja (Schritt) | Nur dokumentieren | Klartext + Beispiel-Hinweis |
| Zeilen mit Fehlern | markierte Zeilen in Vorschau | nein | Nur dokumentieren | »werden übersprungen« |
## Subframe
- (erst nach explizitem OK)
## Notizen
- Change-Request an Dev: Import-Job serverseitig, Duplikat-Logik, Feld-Mapping. Beim Handoff formulieren.
- Gleiches Wizard-Muster ist später für Kontakt-Import wiederverwendbar (nur notiert, nicht beauftragt).
@@ -0,0 +1,61 @@
---
kind: screen
project: HiveGrid Screen Project
ticket: D-P7
package: WF-P7 Leads
id: S01
screen: Lead-Inbox
typ: Triage-Liste
umsetzung: Bauen
status: Validiert
route: "/leads"
subframe: ""
---
# S01 — Lead-Inbox
## Ziel
Keine Anfrage verlieren: alles Eingehende an einem Ort, in Sekunden sortiert.
## Was das Tool können muss
- Anfragen aus **allen Quellen** automatisch empfangen (Formular, E-Mail, Anruf, manuell, Webhook) — live, ohne Neuladen
- Triage direkt in der Zeile: zuweisen, Status wechseln, **Zu Projekt machen**, als Spam markieren
- Mehrfachauswahl mit Massenbearbeitung (zuweisen/Status/Spam/Archiv) **inkl. Massen-Konvertierung** (Davids Ergänzung)
- Spam-Schutz sichtbar machen (Marker mit Begründung), ohne die Liste zu verstopfen
## Pattern / Archetyp
A2 Liste mit Triage-Akzenten, Tabelle/Karten-Umschalter, cursor-paginiert.
## Daten
- Zeile: Identität (Name, sonst E-Mail/Telefon, sonst Quelle+Datum) · Quellen-Marker · Status · Freigabe (ja/nein/unklar) · Verantwortlicher · Eingegangen (relativ < 7 T) · 80-Zeichen-Nachrichten-Vorschau
- Marker: »Mögliches Duplikat« · »Spam-Verdacht« · »Auto-promoviert«
- Filter: Status (Default new+qualified), Quelle, Verantwortlicher (inkl. »nicht zugewiesen«), Zeitraum, Tags, eigene Felder
- Toggle-Chips: **»Spam ausblenden« (Default an)** · **»Konvertierte einblenden« (Default aus)**
## Aktionen
- Zeile öffnen → [[S02 Lead-Detail]]
- Inline: Zuweisen · Status · **»Zu Projekt«** → [[M01 Lead zu Projekt]] · Spam
- Bulk: Zuweisen/Status/Spam/Archiv + **Bulk »Zu Projekt«** (M01 in Bulk-Variante)
- »+ Anfrage« → [[M02 Anfrage anlegen]] · »Importieren« → [[M03 CSV-Import]]
- »Statistiken« → [[S03 Lead-Statistiken]]
## Zustände
| Zustand | Beschreibung | Umsetzung |
|---|---|---|
| Leer | »Keine neuen Anfragen« | Nur dokumentieren |
| Laden / Fehler | A7 | Wiederverwenden |
| `read_own` | nur eigene sichtbar (server-seitig) | Wiederverwenden |
## Subframe
- (erst nach explizitem OK)
## Notizen
- D01 Inline-Anlegen (Plus → Zeile mit Pflichtfeldern) — gemeinsames »Später«-Muster mit P6.
@@ -0,0 +1,54 @@
---
kind: screen
project: HiveGrid Screen Project
ticket: D-P7
package: WF-P7 Leads
id: S02
screen: Lead-Detail
typ: Detail
umsetzung: Bauen
status: Validiert
route: "/leads/:id"
subframe: ""
---
# S02 — Lead-Detail
## Ziel
Eine Anfrage komplett verstehen und entscheiden: weiterverarbeiten, ablehnen oder Spam.
## Was das Tool können muss
- **Herkunft transparent machen**: welches Formular (mit Submission), welcher E-Mail-Header, welcher Anruf (mit Aufnahme-Link)
- **Freigabe-Entscheidung** festhalten (ja/nein/unklar) — bei »ja« wird »Zu Projekt« möglich
- **Match-Hinweise**: existierende Kontakte mit gleicher E-Mail/Telefon (harte Treffer) oder ähnlichem Namen (weiche) — mit Direktsprung
- Spam-Score mit Klartext-Begründung; Re-Submission-Verlauf (gleiche Person hat mehrfach angefragt)
## Pattern / Archetyp
A3 Detail — gleiches Grundgerüst wie die Kontakt-Karteikarte (Zweispalter + Reiter).
## Daten
- Kopf: Identität, Status, Freigabe-Schalter, Quellen-Marker · Triage-Quick-Actions (Annehmen / Antworten / Anrufen / Notiz / Aufgabe / Termin)
- Links: Stammdaten inline editierbar · eigene Felder · Match-Hinweise · DSGVO-Lösch-Countdown
- Rechts, Reiter: Übersicht/Nachricht · Konversation · Verlauf (Activity)
## Aktionen
- **»Zu Projekt«** → [[M01 Lead zu Projekt]] (nur bei Freigabe = ja; sonst Hinweis)
- Status wechseln (new/qualified/converted/lost/spam) · zuweisen
- Match-Hinweis → Kontakt-Karteikarte öffnen oder direkt verknüpfen
## Zustände
| Zustand | Beschreibung | Umsetzung |
|---|---|---|
| DSGVO-Countdown | »Wird am [Datum] automatisch gelöscht« | Nur dokumentieren |
| Nicht gefunden / kein Recht | 404 | Wiederverwenden |
| Laden / Fehler | A7 | Wiederverwenden |
## Subframe
- (erst nach explizitem OK)
@@ -0,0 +1,45 @@
---
kind: screen
project: HiveGrid Screen Project
ticket: D-P7
package: WF-P7 Leads
id: S03
screen: Lead-Statistiken
typ: KPI-Seite
umsetzung: Bauen
status: Validiert
route: "/leads/statistics"
subframe: ""
---
# S03 — Lead-Statistiken
## Ziel
Der Chef sieht: Woher kommen Anfragen, wie schnell reagieren wir, was wird daraus?
## Was das Tool können muss
- KPI-Kacheln: Eingegangen · Umwandlung Lead→Projekt · Lead→Gewonnen · Reaktionszeit · Spam-Quote · offene Anfragen > 24 h
- Aufschlüsselung nach Quelle / Verantwortlichem / Tag / Wochentag / Status
- Trend-Charts mit Vergleich zur Vorperiode (Zeitraum-Wahl + Vergleichs-Schalter)
- **Drill-Down**: Klick auf eine Zahl → vorgefilterte Inbox
## Pattern / Archetyp
A2 + KPI-Kit (Kacheln, Balken-/Linien-Charts aus dem Baukasten).
## Zustände
| Zustand | Beschreibung | Umsetzung |
|---|---|---|
| Zu wenig Daten | »Noch nicht genug Anfragen für Trends« | Nur dokumentieren |
| Laden / Fehler | A7 | Wiederverwenden |
## Permissions / Gates
Aufschlüsselung nach Verantwortlichem nur mit `leads.read_all`.
## Subframe
- (erst nach explizitem OK)
@@ -0,0 +1,40 @@
---
kind: screen
project: HiveGrid Screen Project
ticket: D-P7
package: WF-P7 Leads
id: S04
screen: Quellen-Verwaltung
typ: Settings-Liste
umsetzung: Bauen
status: Validiert
route: "/admin/lead-sources (Einstellungen -> Arbeitsweise)"
subframe: ""
---
# S04 — Quellen-Verwaltung
## Ziel
Steuern, woher Anfragen kommen — inkl. Anschluss fremder Websites.
## Was das Tool können muss
- Quellen-Liste: Name · Typ (System/eigene) · Anfragen der letzten 30 Tage · Status
- Eigene Quelle anlegen (Name, Anzeige-Label, optional Standard-Verantwortlicher + Standard-Tags)
- **Webhook-URL mit Token** je Quelle (Kopier-Knopf) — damit Fremd-Websites Anfragen direkt einliefern
- Bearbeiten / Archivieren
## Pattern / Archetyp
A2/A6 unter Einstellungen → Arbeitsweise.
## Zustände
| Zustand | Beschreibung | Umsetzung |
|---|---|---|
| Laden / Fehler / kein Zugriff | A7 | Wiederverwenden |
## Subframe
- (erst nach explizitem OK)
@@ -0,0 +1,41 @@
---
kind: screen
project: HiveGrid Screen Project
ticket: D-P7
package: WF-P7 Leads
id: S05
screen: Spam-Schutz
typ: Settings
umsetzung: Bauen
status: Validiert
route: "/admin/lead-anti-spam (Einstellungen -> Arbeitsweise)"
subframe: ""
---
# S05 — Spam-Schutz
## Ziel
Spam automatisch abfangen, ohne echte Anfragen zu verlieren — alles in Klartext einstellbar.
## Was das Tool können muss
- **Limits**: max. Anfragen pro Quelle/Stunde und pro IP/Stunde
- **Anomalie-Erkennung**: 10-facher Anstieg → Quelle pausiert automatisch (mit Benachrichtigung)
- **Auto-Spam-Regeln als Schalter**: IP-Sperrliste · Wegwerf-E-Mail-Domains · Honeypot-Feld · Absenden unter 3 Sekunden
- **Modus**: Quarantäne (landet markiert in der Inbox) vs. vollständig Spam (ausgeblendet)
- Auto-Lösch-Frist für verlorene Anfragen (0 = nie); Spam fix 30 Tage
## Pattern / Archetyp
A6 Settings mit Toggle-Zeilen (je Regel Klartext-Beschreibung).
## Zustände
| Zustand | Beschreibung | Umsetzung |
|---|---|---|
| Laden / Fehler / kein Zugriff | A7 | Wiederverwenden |
## Subframe
- (erst nach explizitem OK)
@@ -0,0 +1,26 @@
{
"nodes":[
{"id":"md-paket","type":"file","file":"02 Wireframes/P7 Leads/WF-P7 Leads/WF-P7 Leads.md","x":-80,"y":-440,"width":460,"height":280},
{"id":"group-triage","type":"group","x":-80,"y":-100,"width":1820,"height":380,"label":"Triage"},
{"id":"group-stats","type":"group","x":1880,"y":-100,"width":540,"height":380,"label":"Auswertung"},
{"id":"group-aktionen","type":"group","x":-80,"y":460,"width":1780,"height":380,"label":"Konvertieren, Anlegen, Import"},
{"id":"group-settings","type":"group","x":1880,"y":460,"width":1080,"height":380,"label":"Einstellungen → Arbeitsweise"},
{"id":"note-entry","type":"text","text":"# Einstieg\n\nSidebar → Leads (`/leads`).\n\nAlle Quellen landen hier automatisch: Formular, E-Mail, Anruf, Webhook, manuell.","x":0,"y":0,"width":360,"height":200},
{"id":"s01","type":"file","file":"02 Wireframes/P7 Leads/WF-P7 Leads/Screens/S01 Lead-Inbox.md","x":560,"y":0,"width":420,"height":200},
{"id":"s02","type":"file","file":"02 Wireframes/P7 Leads/WF-P7 Leads/Screens/S02 Lead-Detail.md","x":1240,"y":0,"width":420,"height":200},
{"id":"s03","type":"file","file":"02 Wireframes/P7 Leads/WF-P7 Leads/Screens/S03 Lead-Statistiken.md","x":1920,"y":0,"width":420,"height":200},
{"id":"m02","type":"file","file":"02 Wireframes/P7 Leads/WF-P7 Leads/Screens/M02 Anfrage anlegen.md","x":40,"y":560,"width":420,"height":200},
{"id":"m01","type":"file","file":"02 Wireframes/P7 Leads/WF-P7 Leads/Screens/M01 Lead zu Projekt.md","x":620,"y":560,"width":420,"height":200},
{"id":"m03","type":"file","file":"02 Wireframes/P7 Leads/WF-P7 Leads/Screens/M03 CSV-Import.md","x":1200,"y":560,"width":420,"height":200},
{"id":"s04","type":"file","file":"02 Wireframes/P7 Leads/WF-P7 Leads/Screens/S04 Quellen-Verwaltung.md","x":1920,"y":560,"width":420,"height":200},
{"id":"s05","type":"file","file":"02 Wireframes/P7 Leads/WF-P7 Leads/Screens/S05 Spam-Schutz.md","x":2500,"y":560,"width":420,"height":200}
],
"edges":[
{"id":"e-entry","fromNode":"note-entry","fromSide":"right","toNode":"s01","toSide":"left","toEnd":"arrow","styleAttributes":{"path":"dotted"}},
{"id":"e-open","fromNode":"s01","fromSide":"right","toNode":"s02","toSide":"left","toEnd":"arrow","label":"Anfrage öffnen"},
{"id":"e-stats","fromNode":"s01","fromSide":"top","toNode":"s03","toSide":"top","toEnd":"arrow","label":"Statistiken · Drill-Down zurück in gefilterte Inbox"},
{"id":"e-convert","fromNode":"s02","fromSide":"bottom","toNode":"m01","toSide":"top","toEnd":"arrow","label":"Zu Projekt (Freigabe = ja; aus S01 auch als Bulk)"},
{"id":"e-new","fromNode":"s01","fromSide":"bottom","toNode":"m02","toSide":"top","toEnd":"arrow","label":"+ Anfrage"},
{"id":"e-import","fromNode":"s01","fromSide":"bottom","toNode":"m03","toSide":"top","toEnd":"arrow","label":"Importieren (CSV)"}
]
}
@@ -0,0 +1,138 @@
---
kind: wireframe-package
project: HiveGrid Screen Project
ticket: D-P7
package: WF-P7 Leads
typ: Flow
status: Validiert
subframe: ""
canvas: "WF-P7 Leads.canvas"
---
# WF-P7 Leads
Status: Validiert (Screen-Liste)
Subframe-Link: -
Canvas: [Canvas](<WF-P7 Leads.canvas>)
Stand: 2026-07-08
---
## 1. Kurzfassung
Der Lead-Eingang: Anfragen aus allen Quellen (Formular, E-Mail, Anruf, manuell, Webhook) landen automatisch in einer Triage-Liste. Dort wird sortiert, zugewiesen — und im Kern-Moment **»Zu Projekt machen«** startet die Kette Richtung Auftrag. Kontakt wird dabei separat verknüpft (kein altes Promotion-Modal, Pivot AD-20).
---
## 2. Intent Check
| Frage | Antwort |
|---|---|
| Welches Ticket/Modul ist betroffen? | D-P7, Dev-Pendant R-P7 |
| Was soll der Nutzer am Ende schaffen? | Keine Anfrage verlieren, Spam loswerden, schnell reagieren, gute Anfragen zu Projekten machen |
| Flow, Screen, Zustand oder Doku? | Triage-Liste + Detail + Konvertier-Modal + Statistiken + 2 Einstellungs-Seiten + Anlege-Modal |
| Welche Planning-Quellen wurden geprüft? | `ticket-docs/D-P7.md`, ENTITY-MODEL (Pivot), SCREEN-MAP §2, HiveGrid Map |
| Was ist sicher im Scope? | Alles oben + Anti-Spam + Webhook-Quellen |
| Was ist sicher nicht im Scope? | Kontakt-/Organisations-Listen (P6), Projekt-Welt (P8), Promotion-Modal (existiert nicht mehr) |
| Admin/Normalrolle-Unterschiede? | `leads.*`; bei `read_own` nur eigene (404); Statistiken-Aufschlüsselung nach Person nur mit `read_all` |
| Unsichere Annahmen? | Massen-Konvertierung (Bulk »Zu Projekt«): UI validiert, technische Machbarkeit mit Dev bestätigen |
---
## 3. Scope
| Punkt | Inhalt |
|---|---|
| Ticket/Modul | D-P7 · Lead-Eingang |
| Nutzerrolle | Maximalansicht (Admin) |
| Startpunkt | Sidebar »Leads« |
| Ziel | Anfrage triagiert → Projekt erstellt oder erledigt/Spam |
| Haupt-Archetyp | A2 Triage-Liste · A3 Detail · A5 Modal · A6 Settings · KPI-Kit |
| Bespoke-Anteil | Keiner |
| Out of scope | Kampagnen-/Marketing-Quellen-Details (P14) |
---
## 4. Entscheidungen (validiert 2026-07-08)
| Entscheidung | Status | Notiz |
|---|---|---|
| Ein Paket für das ganze Feature | genommen | inkl. Quellen + Spam-Schutz (leben unter Einstellungen → Arbeitsweise) |
| **Lead → Projekt als großes Modal** | genommen | Drei Sektionen: Daten-Vererbungs-Vorschau · Ziel-Board + Start-Spalte · Kontakt verknüpfen (Auto-Match oder neu via M01 aus P6). Man bleibt im Kontext der Liste |
| **Mehrfachauswahl / Massenbearbeitung** | genommen | Davids Ergänzung: Bulk-Zuweisen/Status/Spam/Archiv UND Massen-Konvertierung (Modal in Bulk-Variante: gemeinsame Board-Wahl, Kontakt-Match je Lead). Machbarkeit Bulk-Convert mit Dev bestätigen |
| Anfrage anlegen als Modal | genommen | Wie »Kontakt anlegen« (P6), mit Live-Duplikat-Check |
| **Inline-Anlegen (Plus → Zeile mit Pflichtfeldern)** | dokumentiert / später | Davids Idee — gemeinsames Muster mit P6 (D01 dort); »muss gut gemacht werden«, erstmal Modal |
| Spam standardmäßig ausgeblendet, Konvertierte ausgeblendet | genommen | Toggle-Chips laut Ticket |
| Pivot-Regel | genommen | Freigabe (ja/nein/unklar) am Lead; bei »ja« → Projekt; Kontakt separat verknüpft; Status new/qualified/converted/lost/spam |
| **CSV-Import-Wizard** | genommen — Davids Delta (2026-07-08) | Ganze Listen importieren: Datei hochladen → Spalten den Lead-Feldern zuordnen → Vorschau mit Fehlern/Duplikaten → Import. Steht NICHT im Dev-Ticket → als Change-Request/Delta an Dev |
### Happy Path
1. Anfrage kommt rein (Formular/Anruf/E-Mail) → erscheint live in der Inbox, ggf. mit Duplikat-/Spam-Marker.
2. Triage direkt in der Zeile: zuweisen, Status, oder Spam.
3. Gute Anfrage öffnen → Detail: Herkunft, Match-Hinweise (»könnte Kontakt X sein«), Freigabe auf »ja«.
4. **»Zu Projekt machen«** → Modal: Vorschau der übernommenen Daten, Board + Start-Spalte wählen, Kontakt verknüpfen (Match oder neu) → Projekt existiert, Lead = konvertiert.
5. Chef schaut in die Statistiken: Woher kommen Anfragen, wie schnell reagieren wir, was wird daraus?
### Meldungs-/Error-States (validiert)
| Ereignis | UI-Form | Blockiert? | Bauen? | Copy/Notiz |
|---|---|---|---|---|
| Spam-Verdacht / mögliches Duplikat / auto-promoviert | Marker in der Zeile + Begründung im Detail | nein | Nur dokumentieren | Klartext-Begründung (»3 Anfragen in 1 Min von gleicher IP«) |
| Pflichtdaten fehlen beim Konvertieren (z. B. Name) | Mängel-Banner im Modal | ja (Aktion) | Nur dokumentieren | Felder direkt im Modal nachtragbar |
| DSGVO-Auto-Löschung | Countdown-Hinweis im Detail | nein | Nur dokumentieren | »Wird am [Datum] automatisch gelöscht« (Spam 30 T, lost konfigurierbar) |
| Fremder Lead bei `read_own` | unsichtbar / 404 | ja | Wiederverwenden | Dev-Vorgabe |
| Leere Inbox | Leer-Zustand | nein | Nur dokumentieren | »Keine neuen Anfragen« |
---
## 7. Validierte Screen-Liste
| ID | Screen/Zustand | Typ | Umsetzung | Ort | Status |
|---|---|---|---|---|---|
| S01 | Lead-Inbox (Triage-Liste) | Liste | Bauen | `/leads` | Validiert |
| S02 | Lead-Detail | Detail | Bauen | `/leads/:id` | Validiert |
| M01 | Lead → Projekt ⭐ | Modal (groß, + Bulk-Variante) | Bauen | aus S01/S02 | Validiert |
| S03 | Lead-Statistiken | KPI-Seite | Bauen | `/leads/statistics` | Validiert |
| S04 | Quellen-Verwaltung | Settings-Liste | Bauen | `/admin/lead-sources` | Validiert |
| S05 | Spam-Schutz | Settings | Bauen | `/admin/lead-anti-spam` | Validiert |
| M02 | Anfrage anlegen | Modal | Bauen | aus S01 | Validiert |
| M03 | CSV-Import-Wizard | Modal/Wizard | Bauen | aus S01 | Validiert (Davids Delta) |
| D01 | Inline-Anlegen (Plus → Zeile) | Idee | Später | in S01 | Dokumentiert (gemeinsam mit P6) |
| D02–D06 | Marker/Banner/Zustände (s. Tabelle) | Inline | Nur dokumentieren | — | Validiert |
---
## 8. Grid
```text
Sidebar -> S01 (Inbox) -> S02 (Detail)
S01/S02 -> M01 (Lead -> Projekt; aus S01 auch als Bulk)
S01 -> M02 (+ Anfrage) / M03 (CSV-Import)
S01 -> S03 (Statistiken; Drill-Down zurueck in gefilterte Inbox)
Einstellungen -> S04 (Quellen) / S05 (Spam-Schutz)
M01 nutzt M01 aus P6 (Kontakt anlegen) fuer neue Kontakte
```
---
## 9. Screen-Pakete
- [[S01 Lead-Inbox]] · [[S02 Lead-Detail]] · [[M01 Lead zu Projekt]]
- [[S03 Lead-Statistiken]] · [[M02 Anfrage anlegen]] · [[M03 CSV-Import]]
- [[S04 Quellen-Verwaltung]] · [[S05 Spam-Schutz]]
---
## 10. Offene Fragen
- Massen-Konvertierung (Bulk »Zu Projekt«): technische Machbarkeit + Verhalten bei fehlenden Kontakt-Matches → Frage an Dev (beim Handoff)
- CSV-Import (M03): Davids Delta, steht nicht im Dev-Ticket → als Change-Request formulieren (Import-Job, Duplikat-Behandlung serverseitig)
- Ziel-Board-Vorauswahl im Konvertier-Modal (z. B. immer »Vertrieb«-Board als Default?) → beim Subframe-Bau
- Statistiken: welche KPI-Kacheln auf Seite 1 → beim Subframe-Bau (Ticket-Liste ist Obermenge)
## Handoff-Check
- [x] Jeder Screen ist mit Umsetzung markiert.
- [x] Meldungs-/Error-State-Matrix ist ausgefüllt.
- [ ] Subframe-Link ist eingetragen. *(Subframe erst nach explizitem OK)*