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

@@ -9,24 +9,24 @@
"height": 420,
"label": "Hauptflow"
},
{
"id": "group-schnell",
"type": "group",
"x": -80,
"y": 460,
"width": 1000,
"height": 400,
"label": "Schnellzugriff (Davids Delta)"
},
{
"id": "group-anlage",
"type": "group",
"x": 1060,
"y": 460,
"x": -80,
"y": 480,
"width": 1240,
"height": 400,
"label": "Anlegen und Einbettung"
},
{
"id": "group-schnell",
"type": "group",
"x": 1260,
"y": 480,
"width": 1000,
"height": 400,
"label": "Schnellzugriff (Davids Delta)"
},
{
"id": "note-entry",
"type": "text",
@@ -54,42 +54,6 @@
"width": 420,
"height": 200
},
{
"id": "note-topbar",
"type": "text",
"text": "# Einstieg\n\nTopbar-Button »Meine Aufgaben« (Davids Ergänzung).",
"x": 0,
"y": 560,
"width": 320,
"height": 200
},
{
"id": "s03",
"type": "file",
"file": "02 Wireframes/P4 Aufgaben und Dateien/WF-P4 Aufgaben/Screens/S03 Aufgaben-Drawer.md",
"x": 440,
"y": 560,
"width": 420,
"height": 200
},
{
"id": "m01",
"type": "file",
"file": "02 Wireframes/P4 Aufgaben und Dateien/WF-P4 Aufgaben/Screens/M01 Aufgabe anlegen.md",
"x": 1120,
"y": 560,
"width": 420,
"height": 200
},
{
"id": "v01",
"type": "file",
"file": "02 Wireframes/P4 Aufgaben und Dateien/WF-P4 Aufgaben/Screens/V01 Eingebettete Kompakt-Variante.md",
"x": 1600,
"y": 560,
"width": 420,
"height": 200
},
{
"id": "md-paket",
"type": "file",
@@ -98,20 +62,54 @@
"y": -440,
"width": 460,
"height": 280
},
{
"id": "m01",
"type": "file",
"file": "02 Wireframes/P4 Aufgaben und Dateien/WF-P4 Aufgaben/Screens/M01 Aufgabe anlegen.md",
"x": -20,
"y": 580,
"width": 420,
"height": 200
},
{
"id": "v01",
"type": "file",
"file": "02 Wireframes/P4 Aufgaben und Dateien/WF-P4 Aufgaben/Screens/V01 Eingebettete Kompakt-Variante.md",
"x": 460,
"y": 580,
"width": 420,
"height": 200
},
{
"id": "note-topbar",
"type": "text",
"text": "# Einstieg\n\nTopbar-Button »Meine Aufgaben« (Davids Ergänzung).",
"x": 1340,
"y": 580,
"width": 320,
"height": 200
},
{
"id": "s03",
"type": "file",
"file": "02 Wireframes/P4 Aufgaben und Dateien/WF-P4 Aufgaben/Screens/S03 Aufgaben-Drawer.md",
"x": 1780,
"y": 580,
"width": 420,
"height": 200
}
],
"edges": [
{
"id": "e-entry",
"styleAttributes": {
"path": "dotted"
},
"fromNode": "note-entry",
"fromSide": "right",
"toNode": "s01",
"toSide": "left",
"toEnd": "arrow",
"styleAttributes": {
"path": "dotted",
"pathfindingMethod": "direct"
}
"toSide": "left"
},
{
"id": "e-open",
@@ -119,60 +117,50 @@
"fromSide": "right",
"toNode": "s02",
"toSide": "left",
"toEnd": "arrow",
"label": "Zeile öffnen",
"styleAttributes": {
"pathfindingMethod": "direct"
}
"label": "Zeile öffnen"
},
{
"id": "e-topbar",
"styleAttributes": {
"path": "dotted"
},
"fromNode": "note-topbar",
"fromSide": "right",
"toNode": "s03",
"toSide": "left",
"toEnd": "arrow",
"styleAttributes": {
"path": "dotted",
"pathfindingMethod": "direct"
}
"toSide": "left"
},
{
"id": "e-drawer",
"toFloating": false,
"fromNode": "s03",
"fromSide": "top",
"toNode": "s02",
"toSide": "bottom",
"toEnd": "arrow",
"label": "Eintrag öffnen",
"styleAttributes": {
"pathfindingMethod": "direct"
}
"label": "Eintrag öffnen"
},
{
"id": "e-new",
"fromFloating": false,
"fromNode": "s01",
"fromSide": "bottom",
"toNode": "m01",
"toSide": "top",
"toEnd": "arrow",
"label": "Neue Aufgabe (auch aus S03 + Detailseiten, vorbefüllt)",
"styleAttributes": {
"pathfindingMethod": "direct"
}
"label": "Neue Aufgabe (auch aus S03 + Detailseiten, vorbefüllt)"
},
{
"id": "e-variant",
"styleAttributes": {
"path": "short-dashed"
},
"fromNode": "v01",
"fromSide": "top",
"toNode": "s01",
"toSide": "bottom",
"toEnd": "arrow",
"label": "kompakte Ausführung von S01",
"styleAttributes": {
"path": "short-dashed",
"pathfindingMethod": "direct"
}
"label": "kompakte Ausführung von S01"
}
]
],
"metadata": {
"version": "1.0-1.0",
"frontmatter": {}
}
}
@@ -109,8 +109,7 @@
"toSide": "left",
"toEnd": "arrow",
"styleAttributes": {
"path": "dotted",
"pathfindingMethod": "direct"
"path": "dotted"
}
},
{
@@ -120,10 +119,7 @@
"toNode": "s03",
"toSide": "left",
"toEnd": "arrow",
"label": "Datei öffnen",
"styleAttributes": {
"pathfindingMethod": "direct"
}
"label": "Datei öffnen"
},
{
"id": "e-upload",
@@ -132,10 +128,7 @@
"toNode": "s02",
"toSide": "top",
"toEnd": "arrow",
"label": "Hochladen",
"styleAttributes": {
"pathfindingMethod": "direct"
}
"label": "Hochladen"
},
{
"id": "e-done",
@@ -146,8 +139,7 @@
"toEnd": "arrow",
"label": "fertige Datei öffnen",
"styleAttributes": {
"path": "long-dashed",
"pathfindingMethod": "direct"
"path": "long-dashed"
}
},
{
@@ -157,10 +149,7 @@
"toNode": "m01",
"toSide": "top",
"toEnd": "arrow",
"label": "Freigeben (auch aus S03)",
"styleAttributes": {
"pathfindingMethod": "direct"
}
"label": "Freigeben (auch aus S03)"
}
]
}
@@ -1,28 +1,206 @@
{
"nodes":[
{"id":"md-paket","type":"file","file":"02 Wireframes/P5 Integrationen/WF-P5 Integrationen/WF-P5 Integrationen.md","x":-80,"y":-440,"width":460,"height":280},
{"id":"group-main","type":"group","x":-80,"y":-100,"width":1720,"height":420,"label":"Hauptflow"},
{"id":"group-sync","type":"group","x":1800,"y":-100,"width":1120,"height":420,"label":"Sync-Verlauf (eigene Seiten)"},
{"id":"group-wizard","type":"group","x":-80,"y":460,"width":1720,"height":420,"label":"Einrichtungs-Assistent und Trennen"},
{"id":"group-notes","type":"group","x":1800,"y":460,"width":1120,"height":420,"label":"Regeln"},
{"id":"note-entry","type":"text","text":"# Einstieg\n\nSidebar → Integrationen (`/admin/integrations`).\n\nNur mit Recht `integrations.read`.","x":0,"y":0,"width":360,"height":200},
{"id":"s01","type":"file","file":"02 Wireframes/P5 Integrationen/WF-P5 Integrationen/Screens/S01 App-Katalog.md","x":560,"y":0,"width":420,"height":200},
{"id":"s02","type":"file","file":"02 Wireframes/P5 Integrationen/WF-P5 Integrationen/Screens/S02 App-Seite.md","x":1180,"y":0,"width":420,"height":200},
{"id":"s03","type":"file","file":"02 Wireframes/P5 Integrationen/WF-P5 Integrationen/Screens/S03 Sync-Verlauf.md","x":1840,"y":0,"width":420,"height":200},
{"id":"s04","type":"file","file":"02 Wireframes/P5 Integrationen/WF-P5 Integrationen/Screens/S04 Lauf-Detail.md","x":2460,"y":0,"width":420,"height":200},
{"id":"m01","type":"file","file":"02 Wireframes/P5 Integrationen/WF-P5 Integrationen/Screens/M01 Assistent OAuth.md","x":40,"y":560,"width":420,"height":200},
{"id":"m02","type":"file","file":"02 Wireframes/P5 Integrationen/WF-P5 Integrationen/Screens/M02 Assistent API-Schluessel.md","x":620,"y":560,"width":420,"height":200},
{"id":"m03","type":"file","file":"02 Wireframes/P5 Integrationen/WF-P5 Integrationen/Screens/M03 Trennen-Bestaetigung.md","x":1200,"y":560,"width":420,"height":200},
{"id":"note-framework","type":"text","text":"# Wiederverwendung\n\nConnection-Card + Assistent + Verlauf sind das **Gerüst für alle App-Verbindungen**: E-Mail (P14), Telefonie (P15), Kalender/Signatur (P16) nutzen dieselben Bausteine in ihren Settings.","x":1840,"y":560,"width":520,"height":260},
{"id":"note-banner","type":"text","text":"# Zustände (nur Doku)\n\nAmpel: grün läuft · gelb hakt · rot kaputt · grau getrennt.\n\nGelb/Rot/Schema geändert → Klartext-Banner mit Lösungs-Knopf. Trennen = Status »getrennt«, kein Löschen.","x":2420,"y":560,"width":460,"height":260}
],
"edges":[
{"id":"e-entry","fromNode":"note-entry","fromSide":"right","toNode":"s01","toSide":"left","toEnd":"arrow","styleAttributes":{"path":"dotted","pathfindingMethod":"direct"}},
{"id":"e-app","fromNode":"s01","fromSide":"right","toNode":"s02","toSide":"left","toEnd":"arrow","label":"App öffnen","styleAttributes":{"pathfindingMethod":"direct"}},
{"id":"e-verlauf","fromNode":"s02","fromSide":"right","toNode":"s03","toSide":"left","toEnd":"arrow","label":"alle Läufe anzeigen","styleAttributes":{"pathfindingMethod":"direct"}},
{"id":"e-lauf","fromNode":"s03","fromSide":"right","toNode":"s04","toSide":"left","toEnd":"arrow","label":"Lauf öffnen","styleAttributes":{"pathfindingMethod":"direct"}},
{"id":"e-oauth","fromNode":"s02","fromSide":"bottom","toNode":"m01","toSide":"top","toEnd":"arrow","label":"Verbinden (OAuth)","styleAttributes":{"pathfindingMethod":"direct"}},
{"id":"e-key","fromNode":"s02","fromSide":"bottom","toNode":"m02","toSide":"top","toEnd":"arrow","label":"Verbinden (API-Schlüssel)","styleAttributes":{"pathfindingMethod":"direct"}},
{"id":"e-trennen","fromNode":"s02","fromSide":"bottom","toNode":"m03","toSide":"top","toEnd":"arrow","label":"Trennen","styleAttributes":{"pathfindingMethod":"direct"}}
]
}
"nodes": [
{
"id": "md-paket",
"type": "file",
"file": "02 Wireframes/P5 Integrationen/WF-P5 Integrationen/WF-P5 Integrationen.md",
"x": -80,
"y": -440,
"width": 460,
"height": 280
},
{
"id": "group-main",
"type": "group",
"x": -80,
"y": -100,
"width": 1720,
"height": 420,
"label": "Hauptflow"
},
{
"id": "group-sync",
"type": "group",
"x": 1800,
"y": -100,
"width": 1120,
"height": 420,
"label": "Sync-Verlauf (eigene Seiten)"
},
{
"id": "group-wizard",
"type": "group",
"x": -80,
"y": 460,
"width": 1720,
"height": 420,
"label": "Einrichtungs-Assistent und Trennen"
},
{
"id": "group-notes",
"type": "group",
"x": 1800,
"y": 460,
"width": 1120,
"height": 420,
"label": "Regeln"
},
{
"id": "note-entry",
"type": "text",
"text": "# Einstieg\n\nSidebar → Integrationen (`/admin/integrations`).\n\nNur mit Recht `integrations.read`.",
"x": 0,
"y": 0,
"width": 360,
"height": 200
},
{
"id": "s01",
"type": "file",
"file": "02 Wireframes/P5 Integrationen/WF-P5 Integrationen/Screens/S01 App-Katalog.md",
"x": 560,
"y": 0,
"width": 420,
"height": 200
},
{
"id": "s02",
"type": "file",
"file": "02 Wireframes/P5 Integrationen/WF-P5 Integrationen/Screens/S02 App-Seite.md",
"x": 1180,
"y": 0,
"width": 420,
"height": 200
},
{
"id": "s03",
"type": "file",
"file": "02 Wireframes/P5 Integrationen/WF-P5 Integrationen/Screens/S03 Sync-Verlauf.md",
"x": 1840,
"y": 0,
"width": 420,
"height": 200
},
{
"id": "s04",
"type": "file",
"file": "02 Wireframes/P5 Integrationen/WF-P5 Integrationen/Screens/S04 Lauf-Detail.md",
"x": 2460,
"y": 0,
"width": 420,
"height": 200
},
{
"id": "m01",
"type": "file",
"file": "02 Wireframes/P5 Integrationen/WF-P5 Integrationen/Screens/M01 Assistent OAuth.md",
"x": 40,
"y": 560,
"width": 420,
"height": 200
},
{
"id": "m02",
"type": "file",
"file": "02 Wireframes/P5 Integrationen/WF-P5 Integrationen/Screens/M02 Assistent API-Schluessel.md",
"x": 620,
"y": 560,
"width": 420,
"height": 200
},
{
"id": "m03",
"type": "file",
"file": "02 Wireframes/P5 Integrationen/WF-P5 Integrationen/Screens/M03 Trennen-Bestaetigung.md",
"x": 1200,
"y": 560,
"width": 420,
"height": 200
},
{
"id": "note-framework",
"type": "text",
"text": "# Wiederverwendung\n\nConnection-Card + Assistent + Verlauf sind das **Gerüst für alle App-Verbindungen**: E-Mail (P14), Telefonie (P15), Kalender/Signatur (P16) nutzen dieselben Bausteine in ihren Settings.",
"x": 1840,
"y": 560,
"width": 520,
"height": 260
},
{
"id": "note-banner",
"type": "text",
"text": "# Zustände (nur Doku)\n\nAmpel: grün läuft · gelb hakt · rot kaputt · grau getrennt.\n\nGelb/Rot/Schema geändert → Klartext-Banner mit Lösungs-Knopf. Trennen = Status »getrennt«, kein Löschen.",
"x": 2420,
"y": 560,
"width": 460,
"height": 260
}
],
"edges": [
{
"id": "e-entry",
"fromNode": "note-entry",
"fromSide": "right",
"toNode": "s01",
"toSide": "left",
"toEnd": "arrow",
"styleAttributes": {
"path": "dotted"
}
},
{
"id": "e-app",
"fromNode": "s01",
"fromSide": "right",
"toNode": "s02",
"toSide": "left",
"toEnd": "arrow",
"label": "App öffnen"
},
{
"id": "e-verlauf",
"fromNode": "s02",
"fromSide": "right",
"toNode": "s03",
"toSide": "left",
"toEnd": "arrow",
"label": "alle Läufe anzeigen"
},
{
"id": "e-lauf",
"fromNode": "s03",
"fromSide": "right",
"toNode": "s04",
"toSide": "left",
"toEnd": "arrow",
"label": "Lauf öffnen"
},
{
"id": "e-oauth",
"fromNode": "s02",
"fromSide": "bottom",
"toNode": "m01",
"toSide": "top",
"toEnd": "arrow",
"label": "Verbinden (OAuth)"
},
{
"id": "e-key",
"fromNode": "s02",
"fromSide": "bottom",
"toNode": "m02",
"toSide": "top",
"toEnd": "arrow",
"label": "Verbinden (API-Schlüssel)"
},
{
"id": "e-trennen",
"fromNode": "s02",
"fromSide": "bottom",
"toNode": "m03",
"toSide": "top",
"toEnd": "arrow",
"label": "Trennen"
}
]
}
@@ -0,0 +1,49 @@
---
kind: screen
project: HiveGrid Screen Project
ticket: D-CRM
package: WF-P6 Kontakte und Organisationen
id: M01
screen: Kontakt anlegen
typ: Modal
umsetzung: Bauen
status: Validiert
route: "aus S01 + ueberall (z. B. Lead-Konvertierung)"
subframe: ""
---
# M01 — Kontakt anlegen
## Ziel
Neuen Kontakt in Sekunden anlegen — ohne Dubletten zu produzieren.
## Pattern / Archetyp
A5 Dialog (echtes Modal: DialogLayout → Dialog → Dialog.Content).
## Daten
- **Pflicht: nur der Name.** Optional: Typ (Privatperson/Organisation, Default Privatperson), E-Mail, Telefon, Organisation verknüpfen (mit Rolle), Verantwortlicher
- **Live-Duplikat-Check** beim Tippen (Name/E-Mail/Telefon): Banner »Gibt es schon?« mit Treffer-Vorschau
## Aktionen
- »Anlegen« → Karteikarte öffnet sich (dort Rest pflegen)
- Bei Duplikat-Banner: »Bestehenden öffnen« oder »Trotzdem anlegen«
- Abbrechen
## Meldungsentscheidung
| Ereignis | UI-Form | Blockiert? | Umsetzung | Copy/Notiz |
|---|---|---|---|---|
| Mögliches Duplikat | Banner im Modal | nein | Nur dokumentieren | Treffer klickbar |
| Name leer | Inline-Validierung | ja (Feld) | Nur dokumentieren | einziges Pflichtfeld |
## Subframe
- (erst nach explizitem OK)
## Notizen
- Wird auch aus anderen Flows geöffnet (z. B. Lead → Projekt: Kontakt verknüpfen/anlegen in D-P7).
@@ -0,0 +1,38 @@
---
kind: screen
project: HiveGrid Screen Project
ticket: D-CRM
package: WF-P6 Kontakte und Organisationen
id: M02
screen: Organisation anlegen
typ: Modal
umsetzung: Bauen
status: Validiert
route: "aus S02 + aus M01/S03 (Organisation verknuepfen)"
subframe: ""
---
# M02 — Organisation anlegen
## Ziel
Neue Organisation schnell anlegen — gleiches Muster wie Kontakt anlegen.
## Pattern / Archetyp
A5 Dialog, analog [[M01 Kontakt anlegen]].
## Daten
- **Pflicht: nur der Name.** Optional: Branche/Merkmal, E-Mail, Telefon, Adresse, Verantwortlicher, Hauptkontakt verknüpfen
- Live-Duplikat-Check (Name/E-Mail)
## Aktionen
- »Anlegen« → Organisations-Karteikarte öffnet
- Duplikat-Banner: »Bestehende öffnen« / »Trotzdem anlegen«
- Abbrechen
## Subframe
- (erst nach explizitem OK)
@@ -0,0 +1,45 @@
---
kind: screen
project: HiveGrid Screen Project
ticket: D-CRM
package: WF-P6 Kontakte und Organisationen
id: M03
screen: Zusammenfuehren
typ: Modal (gross)
umsetzung: Bauen
status: Validiert
route: "aus S07"
subframe: ""
---
# M03 — Zusammenführen (Seite an Seite)
## Ziel
Zwei Dubletten kontrolliert zu einem Eintrag verschmelzen — Feld für Feld.
## Pattern / Archetyp
A5 großes Modal mit **Side-by-Side-Vergleich** (aufwendigste Einzelkomponente des Pakets).
## Daten
- Beide Einträge nebeneinander, Feld für Feld
- Je Feld wählbar, welcher Wert überlebt (Standard: der vollständigere)
- Unten: was zusammengeführt wird (Verlauf, Aufgaben, Dateien, Projekte beider Einträge wandern zum Ziel)
## Aktionen
- Feld-Auswahl je Zeile (links/rechts)
- »Zusammenführen« → Bestätigung mit Klartext: **»Kann nicht rückgängig gemacht werden. Der andere Eintrag wird aufgelöst, sein Verlauf bleibt erhalten.«**
- Abbrechen
## Meldungsentscheidung
| Ereignis | UI-Form | Blockiert? | Umsetzung | Copy/Notiz |
|---|---|---|---|---|
| Endgültigkeit | Bestätigungs-Schritt | ja | Nur dokumentieren | s. oben |
## Subframe
- (erst nach explizitem OK)
@@ -0,0 +1,57 @@
---
kind: screen
project: HiveGrid Screen Project
ticket: D-CRM
package: WF-P6 Kontakte und Organisationen
id: S01
screen: Kontakte-Liste
typ: Liste
umsetzung: Bauen
status: Validiert
route: "/contacts"
subframe: ""
---
# S01 — Kontakte-Liste
## Ziel
Jeden Kontakt in Sekunden finden.
## Pattern / Archetyp
A2 Liste; oben Reiter-Wechsel zu [[S02 Organisationen-Liste]].
## Daten
- **Zeigt ALLE Personen** — auch Ansprechpartner aus Organisationen (validiert): Zeile macht die Zugehörigkeit sichtbar (Organisation + Rollen-Badge Haupt-/Sekundärkontakt)
- Zeile: Avatar + Name · Organisation (mit Rolle) · Kontaktstatus (Kontakt/Kunde/Bestandskunde) · E-Mail · Telefon · Tags · Verantwortlicher · letzte Aktivität
- Suche · Filter: Verantwortlicher, Kontaktstatus, Tags (UND/ODER), Organisation (auch »ohne Organisation«), Datum · Archiviert-Schalter
- Keine Misch-Liste: Organisationen haben ihren eigenen Reiter ([[S02 Organisationen-Liste]])
- Server-seitig sortiert/paginiert
## Aktionen
- Zeile öffnen → [[S03 Kontakt-Karteikarte]]
- »+ Kontakt« → [[M01 Kontakt anlegen]]
- Mehrfach-Auswahl: Tag vergeben · Verantwortlichen zuweisen · Archivieren · CSV-Export
## Zustände
| Zustand | Beschreibung | Umsetzung |
|---|---|---|
| Leer (Filter/read_own) | »Keine Kontakte für diese Filter« + zurücksetzen | Nur dokumentieren |
| Laden / Fehler | A7 | Wiederverwenden |
## Permissions / Gates
`crm.*` — bei `read_own` erscheinen nur eigene Kontakte (server-seitig).
## Subframe
- (erst nach explizitem OK)
## Notizen
- D01 Inline-Anlegen (Notion-Stil: Plus → neue Zeile, nur Name Pflicht, leere Zeile löscht sich) — dokumentiert, Später.
- Großer CSV-Export läuft im Hintergrund + Benachrichtigung.
@@ -0,0 +1,48 @@
---
kind: screen
project: HiveGrid Screen Project
ticket: D-CRM
package: WF-P6 Kontakte und Organisationen
id: S02
screen: Organisationen-Liste
typ: Liste
umsetzung: Bauen
status: Validiert
route: "/contacts/companies"
subframe: ""
---
# S02 — Organisationen-Liste
## Ziel
Alle Firmen/Organisationen im Blick — zweiter Einstieg im Kontakte-Tab.
## Pattern / Archetyp
A2 Liste (Reiter neben [[S01 Kontakte-Liste]]). UI-Begriff: **»Organisation«**, nicht »Unternehmen«.
## Daten
- Zeile: Name · Branche/Merkmal · Anzahl verknüpfter Kontakte · Verantwortlicher · letzte Aktivität · Tags
- Suche · Filter analog S01
## Aktionen
- Zeile öffnen → [[S04 Organisations-Karteikarte]]
- »+ Organisation« → [[M02 Organisation anlegen]]
- Mehrfach-Aktionen analog S01
## Zustände
| Zustand | Beschreibung | Umsetzung |
|---|---|---|
| Leer / Laden / Fehler | analog S01 | Wiederverwenden |
## Permissions / Gates
Wie S01.
## Subframe
- (erst nach explizitem OK)
@@ -0,0 +1,64 @@
---
kind: screen
project: HiveGrid Screen Project
ticket: D-CRM
package: WF-P6 Kontakte und Organisationen
id: S03
screen: Kontakt-Karteikarte
typ: Detail (Muster-Vorlage)
umsetzung: Bauen
status: Validiert
route: "/contacts/:id"
subframe: ""
---
# S03 — Kontakt-Karteikarte ⭐
## Ziel
In 5 Sekunden im Bilde sein: Wer ist das, was lief zuletzt, was ist offen? **Die Muster-Vorlage für ALLE Detailseiten der App.**
## Pattern / Archetyp
A3 Detail — validiertes Grundgerüst: **Zweispalter + Reiter**.
## Aufbau (validiert)
- **Kopf:** Avatar, Name, Kontaktstatus-Badge, Organisation + Rolle · **Schnell-Aktionen:** Anrufen (v1: `tel:`-Link; AirCall kommt mit P15) · E-Mail · Termin · Aufgabe · Tag
- **Linke Spalte (schmal):** Stammdaten inline editierbar (Klick → Feld → speichern) · eigene Felder (SHK-Vorlagen) · Tags · **Verknüpfungen mit Rolle**: Organisationen, bei denen die Person Haupt-/Sekundärkontakt ist — und umgekehrt kann auch eine Privatperson eigene Sekundärkontakte haben (z. B. Ehepartner), gleiche Mechanik wie bei Organisationen
- **Rechte Spalte (breit), Reiter:**
- **Verlauf** (Default): chronologischer Activity-Stream — Anrufe, BCC-Mails, Notizen, Status-Wechsel, mit Actor-Marker
- **Projekte:** verknüpfte Projekte mit Board-Status (kommt inhaltlich mit D-P8)
- **Aufgaben:** eingebettete Kompakt-Liste = V01 aus WF-P4 Aufgaben
- **Dateien:** vorgefilterte Datei-Sektion aus WF-P4 Dateien
- **Notizen:** Markdown-Notizen
- **»Verlauf dieses Objekts«** (Audit): Einstieg zum M03-Drawer aus WF-P3 Audit Log
## Aktionen
- Inline-Edit aller Stammdaten/eigenen Felder · Tag hinzufügen/entfernen · Organisation verknüpfen (mit Rolle)
- Archivieren · Zusammenführen-Hinweis bei Duplikat-Verdacht
## Banner / Hinweise
- Duplikat-Verdacht: Banner »Ähnlicher Kontakt existiert« → Duplikat-Tool
## Zustände
| Zustand | Beschreibung | Umsetzung |
|---|---|---|
| Nicht gefunden / kein Recht | 404 | Wiederverwenden |
| Laden / Fehler | A7 | Wiederverwenden |
| Verlauf leer | »Noch keine Aktivitäten« | Nur dokumentieren |
## Permissions / Gates
`crm.*`; Schnell-Aktionen rechte-abhängig.
## Subframe
- (erst nach explizitem OK)
## Notizen
- **Nach dem Subframe-Bau:** dieses Muster (Kopf + Zweispalter + Reiter) als Detailseiten-Standard festhalten → `04 Standards`, nur mit Davids Freigabe.
@@ -0,0 +1,37 @@
---
kind: screen
project: HiveGrid Screen Project
ticket: D-CRM
package: WF-P6 Kontakte und Organisationen
id: S04
screen: Organisations-Karteikarte
typ: Detail
umsetzung: Bauen
status: Validiert
route: "/contacts/companies/:id"
subframe: ""
---
# S04 — Organisations-Karteikarte
## Ziel
Alles über eine Organisation — gleiches Muster wie die Kontakt-Karteikarte.
## Pattern / Archetyp
A3, **gleiches Grundgerüst wie [[S03 Kontakt-Karteikarte]]** (Zweispalter + Reiter).
## Unterschiede zu S03
- Linke Spalte zusätzlich: **Ansprechpartner-Liste** — alle verknüpften Personen mit Rollen-Badge, **genau ein Hauptkontakt** (markiert, umhängbar; erste zugeordnete Person wird automatisch Hauptkontakt) · hinzufügen (bestehenden Kontakt oder neu via [[M01 Kontakt anlegen]])
- Kopf: Organisations-Merkmal/Branche statt Kontaktstatus-Person-Logik (Status gibt es auch hier: Kontakt/Kunde/Bestandskunde)
- Reiter identisch: Verlauf · Projekte · Aufgaben · Dateien · Notizen
## Zustände / Permissions
Wie S03.
## Subframe
- (erst nach explizitem OK)
@@ -0,0 +1,44 @@
---
kind: screen
project: HiveGrid Screen Project
ticket: D-CRM
package: WF-P6 Kontakte und Organisationen
id: S05
screen: Eigene Felder
typ: Settings-Liste
umsetzung: Bauen
status: Validiert
route: "/admin/custom-fields (Einstellungen -> Daten)"
subframe: ""
---
# S05 — Eigene Felder
## Ziel
Zusatzfelder definieren, die der Betrieb wirklich braucht (»Heizungstyp«, »Baujahr Anlage«).
## Pattern / Archetyp
A2 Settings-Liste unter Einstellungen → Daten.
## Daten
- Felder je Ziel-Typ (Kontakt / Projekt / Anfrage / Rechnung — umschaltbar)
- Je Feld: Name · Feld-Typ (Text, Zahl, Datum, Auswahl …) · Nutzungs-Anzahl · Quelle (SHK-Vorlage / eigenes) · Sortierung (Ziehen)
- SHK-Branchen-Felder sind vorbefüllt
## Aktionen
- Feld anlegen/bearbeiten (kleines Modal/Inline) · Archivieren (kein Hard-Delete bei Nutzung) · Reihenfolge ziehen
## Zustände
| Zustand | Beschreibung | Umsetzung |
|---|---|---|
| Feld in Nutzung archivieren | Hinweis mit Nutzungs-Anzahl | Nur dokumentieren |
| Laden / Fehler / kein Zugriff | A7 | Wiederverwenden |
## Subframe
- (erst nach explizitem OK)
@@ -0,0 +1,43 @@
---
kind: screen
project: HiveGrid Screen Project
ticket: D-CRM
package: WF-P6 Kontakte und Organisationen
id: S06
screen: Tags
typ: Settings-Liste
umsetzung: Bauen
status: Validiert
route: "/admin/tags (Einstellungen -> Daten)"
subframe: ""
---
# S06 — Tags
## Ziel
Tags zentral pflegen, Wildwuchs zusammenführen.
## Pattern / Archetyp
A2 Settings-Liste unter Einstellungen → Daten.
## Daten
- Je Tag: Name · Farbe · Anzahl Verknüpfungen
## Aktionen
- Tag anlegen/umbenennen/Farbe ändern
- **Zusammenführen** (Tag A in Tag B aufgehen lassen, mit Bestätigung + Anzahl-Klartext)
- Löschen (mit Hinweis auf Verknüpfungs-Anzahl)
## Zustände
| Zustand | Beschreibung | Umsetzung |
|---|---|---|
| Laden / Fehler / kein Zugriff | A7 | Wiederverwenden |
## Subframe
- (erst nach explizitem OK)
@@ -0,0 +1,44 @@
---
kind: screen
project: HiveGrid Screen Project
ticket: D-CRM
package: WF-P6 Kontakte und Organisationen
id: S07
screen: Duplikat-Tool
typ: Settings-Liste
umsetzung: Bauen
status: Validiert
route: "/admin/duplicates (Einstellungen -> Daten)"
subframe: ""
---
# S07 — Duplikat-Tool
## Ziel
Doppelte Kontakte/Organisationen finden und sauber verschmelzen.
## Pattern / Archetyp
A2 Liste unter Einstellungen → Daten.
## Daten
- Duplikat-Paare mit **Match-Grund** (gleiche E-Mail / gleiches Telefon / ähnlicher Name)
- Vorschau beider Einträge je Paar
## Aktionen
- Paar öffnen → [[M03 Zusammenfuehren]]
- »Kein Duplikat« (Paar verwerfen, taucht nicht wieder auf)
## Zustände
| Zustand | Beschreibung | Umsetzung |
|---|---|---|
| Keine Duplikate | »Alles sauber — keine Dubletten gefunden« | Nur dokumentieren |
| Laden / Fehler / kein Zugriff | A7 | Wiederverwenden |
## Subframe
- (erst nach explizitem OK)
@@ -0,0 +1,69 @@
{
"nodes":[
{"id":"group-daten","type":"group","x":-80,"y":1020,"width":2980,"height":380,"label":"Datenpflege (Einstellungen → Daten)"},
{"id":"group-kontakte","type":"group","x":-80,"y":-100,"width":1820,"height":380,"label":"Kontakte"},
{"id":"group-orgs","type":"group","x":-80,"y":460,"width":1820,"height":380,"label":"Organisationen (Reiter im selben Tab)"},
{"id":"group-anlegen","type":"group","x":1960,"y":460,"width":1120,"height":380,"label":"Anlegen (Modals)"},
{"id":"group-modell","type":"group","x":1980,"y":-520,"width":700,"height":520,"label":"Kontaktmodell (validiert 2026-07-08)"},
{"id":"md-paket","type":"file","file":"02 Wireframes/P6 Kontakte/WF-P6 Kontakte und Organisationen/WF-P6 Kontakte und Organisationen.md","x":-80,"y":-440,"width":460,"height":280},
{"id":"note-entry","type":"text","text":"# Einstieg\n\nSidebar → Kontakte (`/contacts`).\n\nZwei Reiter, nie gemischt: **Kontakte** (ALLE Personen, auch Ansprechpartner — Organisation + Rolle in der Zeile) und **Organisationen**.","x":0,"y":0,"width":360,"height":200},
{"id":"s01","type":"file","file":"02 Wireframes/P6 Kontakte/WF-P6 Kontakte und Organisationen/Screens/S01 Kontakte-Liste.md","x":560,"y":0,"width":420,"height":200},
{"id":"s03","type":"file","file":"02 Wireframes/P6 Kontakte/WF-P6 Kontakte und Organisationen/Screens/S03 Kontakt-Karteikarte.md","x":1240,"y":0,"width":420,"height":200},
{"id":"note-orgs","type":"text","text":"# Hinweis\n\nUI-Begriff »Organisation«, nicht »Firma/Unternehmen« (öffentl. Einrichtungen!).\n\nKarteikarte zeigt die **Ansprechpartner-Liste** mit Rollen — genau EIN Hauptkontakt (markiert, umhängbar).","x":0,"y":560,"width":360,"height":200},
{"id":"s02","type":"file","file":"02 Wireframes/P6 Kontakte/WF-P6 Kontakte und Organisationen/Screens/S02 Organisationen-Liste.md","x":560,"y":560,"width":420,"height":200},
{"id":"s04","type":"file","file":"02 Wireframes/P6 Kontakte/WF-P6 Kontakte und Organisationen/Screens/S04 Organisations-Karteikarte.md","x":1240,"y":560,"width":420,"height":200},
{"id":"m01","type":"file","file":"02 Wireframes/P6 Kontakte/WF-P6 Kontakte und Organisationen/Screens/M01 Kontakt anlegen.md","x":2000,"y":560,"width":420,"height":200},
{"id":"m02","type":"file","file":"02 Wireframes/P6 Kontakte/WF-P6 Kontakte und Organisationen/Screens/M02 Organisation anlegen.md","x":2580,"y":560,"width":420,"height":200},
{"id":"note-daten","type":"text","text":"# Einstieg\n\nEinstellungen → Daten. Gilt auch für Projekte/Anfragen (Ziel-Typ umschaltbar).","x":0,"y":1120,"width":360,"height":200},
{"id":"s05","type":"file","file":"02 Wireframes/P6 Kontakte/WF-P6 Kontakte und Organisationen/Screens/S05 Eigene Felder.md","x":560,"y":1120,"width":420,"height":200},
{"id":"s06","type":"file","file":"02 Wireframes/P6 Kontakte/WF-P6 Kontakte und Organisationen/Screens/S06 Tags.md","x":1140,"y":1120,"width":420,"height":200},
{"id":"s07","type":"file","file":"02 Wireframes/P6 Kontakte/WF-P6 Kontakte und Organisationen/Screens/S07 Duplikat-Tool.md","x":1720,"y":1120,"width":420,"height":200},
{"id":"m03","type":"file","file":"02 Wireframes/P6 Kontakte/WF-P6 Kontakte und Organisationen/Screens/M03 Zusammenfuehren.md","x":2400,"y":1120,"width":420,"height":200},
{"id":"note-modell","type":"text","text":"# Regeln\n- **EIN Datensatz für alles:** »Firma« = Kontakt vom Typ Organisation (Unterart = Auswahlfeld)\n- **Kontaktart (Haupt/Sekundär) = Rolle der Verknüpfung**, nicht der Person\n- Privatperson: nur Name Pflicht, keine Kontaktart-Frage\n- Organisation: auch ohne Person anlegbar\n- Genau **ein Hauptkontakt** je Organisation — erste Person automatisch, umhängbar\n- Auch **Privatpersonen können Sekundärkontakte** haben (Shell-Prinzip, z. B. Ehepartner)","x":2020,"y":-440,"width":620,"height":400}
],
"edges":[
{
"id":"e-entry",
"styleAttributes":{"path":"dotted"},
"fromNode":"note-entry",
"fromSide":"right",
"toNode":"s01",
"toSide":"left"
},
{"id":"e-open","fromNode":"s01","fromSide":"right","toNode":"s03","toSide":"left","label":"Kontakt öffnen"},
{
"id":"e-tab",
"styleAttributes":{"path":"dotted"},
"fromNode":"s01",
"fromSide":"bottom",
"toNode":"s02",
"toSide":"top",
"label":"Reiter Organisationen"
},
{"id":"e-open2","fromNode":"s02","fromSide":"right","toNode":"s04","toSide":"left","label":"öffnen"},
{"id":"e-new1","fromNode":"s01","fromSide":"bottom","toNode":"m01","toSide":"top","label":"+ Kontakt"},
{"id":"e-new2","fromNode":"s02","fromSide":"bottom","toNode":"m02","toSide":"bottom","label":"+ Organisation"},
{
"id":"e-after",
"styleAttributes":{"path":"long-dashed"},
"fromNode":"m01",
"fromSide":"top",
"toNode":"s03",
"toSide":"right",
"label":"öffnet Karteikarte"
},
{
"id":"e-entry-daten",
"styleAttributes":{"path":"dotted"},
"fromNode":"note-daten",
"fromSide":"right",
"toNode":"s05",
"toSide":"left"
},
{"id":"e-merge","fromNode":"s07","fromSide":"right","toNode":"m03","toSide":"left","label":"Paar öffnen"}
],
"metadata":{
"version":"1.0-1.0",
"frontmatter":{}
}
}
@@ -0,0 +1,143 @@
---
kind: wireframe-package
project: HiveGrid Screen Project
ticket: D-CRM
package: WF-P6 Kontakte und Organisationen
typ: Flow
status: Validiert
subframe: ""
canvas: "WF-P6 Kontakte und Organisationen.canvas"
---
# WF-P6 Kontakte und Organisationen
Status: Validiert (Screen-Liste)
Subframe-Link: -
Canvas: [Canvas](<WF-P6 Kontakte und Organisationen.canvas>)
Stand: 2026-07-08
---
## 1. Kurzfassung
Das Adressbuch mit Gedächtnis: Kontakte- und Organisationen-Listen, die **Kontakt-Karteikarte als Vorlage für ALLE Detailseiten**, Anlegen mit Duplikat-Warnung, plus die drei Datenpflege-Seiten in den Einstellungen (Eigene Felder, Tags, Duplikat-Tool). Fundament der Kette Anfrage → Projekt.
---
## 2. Intent Check
| Frage | Antwort |
|---|---|
| Welches Ticket/Modul ist betroffen? | D-CRM (P6), Dev-Pendant R-P6 |
| Was soll der Nutzer am Ende schaffen? | Kunden finden, in 5 Sekunden im Bilde sein (Verlauf), Daten pflegen, Dubletten loswerden |
| Flow, Screen, Zustand oder Doku? | Screen-Cluster: 2 Listen, 2 Karteikarten, 2 Anlege-Modals, 3 Einstellungs-Seiten, 1 Merge-Modal |
| Welche Planning-Quellen wurden geprüft? | `ticket-docs/D-CRM.md`, ENTITY-MODEL (Pivot-Vorrang), SCREEN-MAP §2, HiveGrid Map |
| Was ist sicher im Scope? | Alles oben + Live-Duplikat-Check + Kontaktmodell (Typ/Status/Rolle) |
| Was ist sicher nicht im Scope? | Leads (D-P7), Pipelines (D-P8), Lead-Promotion-Modal (Pivot: existiert nicht mehr) |
| Admin/Normalrolle-Unterschiede? | `crm.*`-Rechte (read_own/read_all/write/delete/admin); bei read_own sieht man nur eigene |
| Unsichere Annahmen? | Inline-Anlegen in der Liste (Notion-Stil) — als Option dokumentiert, nicht v1-gebaut |
---
## 3. Scope
| Punkt | Inhalt |
|---|---|
| Ticket/Modul | D-CRM · Kontakte & Organisationen + Datenpflege |
| Nutzerrolle | Maximalansicht (Admin) |
| Startpunkt | Sidebar »Kontakte« |
| Ziel | Kontakt gefunden/angelegt/gepflegt; Historie sichtbar |
| Haupt-Archetyp | A2 Listen · **A3 Detail (Muster-Vorlage!)** · A5 Modals · A2 Settings-Listen |
| Bespoke-Anteil | Keiner; Side-by-Side-Merge ist die aufwendigste Einzelkomponente |
| Out of scope | Leads, Pipelines, Kampagnen-Anbindung (nur Anzeige im Verlauf) |
---
## 4. Entscheidungen (validiert 2026-07-08)
| Entscheidung | Status | Notiz |
|---|---|---|
| EIN großes Paket (inkl. Datenpflege-Seiten) | genommen | Davids Entscheidung |
| Anlegen als **Modal** mit Live-Duplikat-Warnung | genommen | Nach Anlegen öffnet die Karteikarte |
| **Inline-Anlegen in der Liste (Notion-Stil)** | dokumentiert / später | Davids Idee: Plus in der Liste → neue Zeile inline; funktioniert, weil nur der Name Pflicht ist; Zeile ohne Namen wird automatisch gelöscht. Erstmal nicht bauen |
| Karteikarte = **Zweispalter + Reiter** | genommen | Links schmal: Stammdaten, eigene Felder, Tags, Verknüpfungen (inline editierbar). Rechts breit: Reiter Verlauf · Projekte · Aufgaben · Dateien · Notizen. Schnell-Aktionen im Kopf. **= Muster-Vorlage für alle Detailseiten** |
| Kontaktmodell (fix aus Datenmodell) | genommen | EIN Kontakt-Datensatz für alles. Typ = Privatperson/Organisation (Organisations-Art wie Unternehmen/öffentl. Einrichtung = einfaches Auswahlfeld) · Status = Kontakt/Kunde/Bestandskunde · Kontaktart (Haupt-/Sekundär) = **Rolle der Verknüpfung**, nicht der Person |
| **Zwei getrennte Reiter, keine Misch-Liste** | genommen | Reiter »Kontakte« (alle Personen) + Reiter »Organisationen« — nie beide Typen in einer Liste gemischt (validiert 2026-07-08) |
| Kontakte-Reiter zeigt **ALLE Personen** | genommen | Auch Ansprechpartner, die in Organisationen stecken — mit sichtbarer Organisation + Rolle in der Zeile. Privatpersonen sowieso |
| **Anlege-Regeln** | genommen | Privatperson: nur Name Pflicht, keine Kontaktart-Frage (steht für sich) · Organisation: auch ohne Person anlegbar, Ansprechpartner optional · Zuordnung Person→Organisation mit Rollen-Wahl · genau EIN Hauptkontakt je Organisation, erste zugeordnete Person automatisch (umhängbar) |
| **Auch Privatpersonen können Sekundärkontakte haben** | genommen | Davids »Shell«-Gedanke: Verknüpfungen gehen an jeden Kontakt (z. B. Ehepartner/Mitbewohner an einer Privatperson) — gleiche Mechanik wie bei Organisationen, nur andere Felder |
| Datenpflege-Seiten unter Einstellungen → Daten | genommen | passt zum Infrastruktur-Beschluss |
| Querschnitts-Bausteine einbetten | genommen | Aufgaben-Reiter = V01 (P4) · Datei-Sektion (P4) · »Verlauf«-Drawer = M03 (P3 Audit) — werden referenziert, nicht neu gebaut |
### Happy Path
1. Sidebar »Kontakte« → Liste, tippen/filtern, Kontakt öffnen.
2. Karteikarte: links Stammdaten direkt editieren; rechts im Verlauf sehen, was zuletzt lief (Anrufe, Mails, Notizen); Schnell-Aktion »Aufgabe« oder »Termin« direkt aus dem Kopf.
3. Neuer Kunde ruft an → »+ Kontakt« → Modal, beim Tippen kommt ggf. »gibt's schon« → bestehenden öffnen statt Dublette anlegen.
4. Aufräumen: Einstellungen → Duplikat-Tool → Paar nebeneinander → Feld für Feld übernehmen → zusammenführen.
### Meldungs-/Error-States (validiert)
| Ereignis | UI-Form | Blockiert? | Bauen? | Copy/Notiz |
|---|---|---|---|---|
| Fremder Kontakt bei `read_own` | 404 bzw. taucht in Liste nicht auf | ja | Wiederverwenden | Dev-Vorgabe |
| Mögliches Duplikat beim Anlegen | Banner im Modal: »trotzdem anlegen« / »bestehenden öffnen« | nein | Nur dokumentieren | Live-Check beim Tippen |
| Zusammenführen ist endgültig | Bestätigung mit Klartext | ja (Aktion) | Nur dokumentieren | »Kann nicht rückgängig gemacht werden« |
| Großer CSV-Export | läuft im Hintergrund + Meldung | nein | Nur dokumentieren | Benachrichtigung wenn fertig |
| Leere Liste (Filter/read_own) | Leer-Zustand mit Klartext | nein | Nur dokumentieren | »Keine Kontakte für diese Filter« |
---
## 7. Validierte Screen-Liste
| ID | Screen/Zustand | Typ | Umsetzung | Ort | Status |
|---|---|---|---|---|---|
| S01 | Kontakte-Liste | Liste | Bauen | `/contacts` | Validiert |
| S02 | Organisationen-Liste | Liste | Bauen | `/contacts/companies` | Validiert |
| S03 | Kontakt-Karteikarte ⭐ | Detail (Muster-Vorlage) | Bauen | `/contacts/:id` | Validiert |
| S04 | Organisations-Karteikarte | Detail | Bauen | `/contacts/companies/:id` | Validiert |
| M01 | Kontakt anlegen | Modal | Bauen | aus S01 + überall | Validiert |
| M02 | Organisation anlegen | Modal | Bauen | aus S02 | Validiert |
| S05 | Eigene Felder | Settings-Liste | Bauen | `/admin/custom-fields` | Validiert |
| S06 | Tags | Settings-Liste | Bauen | `/admin/tags` | Validiert |
| S07 | Duplikat-Tool | Settings-Liste | Bauen | `/admin/duplicates` | Validiert |
| M03 | Zusammenführen (Seite an Seite) | Modal (groß) | Bauen | aus S07 | Validiert |
| D01 | Inline-Anlegen in Liste (Notion-Stil) | Idee | Später | in S01 | Dokumentiert |
| D02–D05 | Banner/Zustände (s. Tabelle) | Inline/Banner | Nur dokumentieren | — | Validiert |
---
## 8. Grid
```text
Sidebar -> S01 <-> S02 (Reiter)
S01 -> S03 (Karteikarte) / S02 -> S04
S01 -> M01 (+ Kontakt) / S02 -> M02
Einstellungen -> S05 / S06 / S07 -> M03 (Zusammenfuehren)
S03/S04 betten ein: Aufgaben V01 (P4), Datei-Sektion (P4), Verlauf-Drawer M03 (P3 Audit)
```
---
## 9. Screen-Pakete
- [[S01 Kontakte-Liste]] · [[S02 Organisationen-Liste]]
- [[S03 Kontakt-Karteikarte]] · [[S04 Organisations-Karteikarte]]
- [[M01 Kontakt anlegen]] · [[M02 Organisation anlegen]]
- [[S05 Eigene Felder]] · [[S06 Tags]] · [[S07 Duplikat-Tool]] · [[M03 Zusammenfuehren]]
---
## 10. Offene Fragen
- Inline-Anlegen (D01): wann/ob bauen → David entscheidet später
- Reiter-Label: David sagte locker »Firmen oder sowas« — Spec-Vorgabe ist »Organisation« (öffentliche Einrichtungen sind keine Firmen); wir bleiben bei **»Organisationen«**, final beim Subframe-Bau
- Sekundärkontakte an Privatpersonen (Shell-Gedanke): Datenmodell (KontaktRelation = Kontakt↔Kontakt) deckt das ab — beim Handoff kurz mit Dev bestätigen
- Quick-Action »Anrufen« zeigt in v1 `tel:`-Link, AirCall-Anbindung kommt mit D-P15
- Karteikarten-Muster nach Subframe-Bau als Standard dokumentieren (→ `04 Standards`, nur mit Davids Freigabe)
## 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)*
@@ -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)*
+29
View File
@@ -40,6 +40,8 @@ Diese Datei ist der erste Ort, um zu sehen:
| WF-P4 Aufgaben | D-P4 | Aufgaben & Dateien | Validiert | [MD](<P4 Aufgaben und Dateien/WF-P4 Aufgaben/WF-P4 Aufgaben.md>) | [Canvas](<P4 Aufgaben und Dateien/WF-P4 Aufgaben/WF-P4 Aufgaben.canvas>) | - | Subframe nach explizitem OK | Screens validiert 2026-07-08; inkl. Davids Delta: Topbar-Button + Aufgaben-Drawer |
| WF-P4 Dateien | D-P4 | Aufgaben & Dateien | Validiert | [MD](<P4 Aufgaben und Dateien/WF-P4 Dateien/WF-P4 Dateien.md>) | [Canvas](<P4 Aufgaben und Dateien/WF-P4 Dateien/WF-P4 Dateien.canvas>) | - | Subframe nach explizitem OK | Screens validiert 2026-07-08; Teilen/Ordner/Versionen sichtbar als Backlog v2 |
| WF-P5 Integrationen | D-P5 | Integrationen | Validiert | [MD](<P5 Integrationen/WF-P5 Integrationen/WF-P5 Integrationen.md>) | [Canvas](<P5 Integrationen/WF-P5 Integrationen/WF-P5 Integrationen.canvas>) | - | Subframe nach explizitem OK | Screens validiert 2026-07-08; Sync-Verlauf als eigene Seiten; Connection-Card = Muster fuer P14/P15/P16 |
| WF-P6 Kontakte und Organisationen | D-CRM | Kontakte | Validiert | [MD](<P6 Kontakte/WF-P6 Kontakte und Organisationen/WF-P6 Kontakte und Organisationen.md>) | [Canvas](<P6 Kontakte/WF-P6 Kontakte und Organisationen/WF-P6 Kontakte und Organisationen.canvas>) | - | Subframe nach explizitem OK | Screens validiert 2026-07-08; Karteikarte = Muster-Vorlage fuer alle Detailseiten (Zweispalter + Reiter) |
| WF-P7 Leads | D-P7 | Leads | Validiert | [MD](<P7 Leads/WF-P7 Leads/WF-P7 Leads.md>) | [Canvas](<P7 Leads/WF-P7 Leads/WF-P7 Leads.canvas>) | - | Subframe nach explizitem OK | Screens validiert 2026-07-08; Lead->Projekt als grosses Modal (+Bulk); CSV-Import = Davids Delta/CR |
---
@@ -130,6 +132,25 @@ Diese Datei ist der erste Ort, um zu sehen:
| M01 | Assistent OAuth | WF-P5 Integrationen | Modal/Wizard | Bauen | Validiert | aus S02 | [MD](<P5 Integrationen/WF-P5 Integrationen/Screens/M01 Assistent OAuth.md>) | - | [Canvas](<P5 Integrationen/WF-P5 Integrationen/WF-P5 Integrationen.canvas>) |
| M02 | Assistent API-Schluessel | WF-P5 Integrationen | Modal/Wizard | Bauen | Validiert | aus S02 | [MD](<P5 Integrationen/WF-P5 Integrationen/Screens/M02 Assistent API-Schluessel.md>) | - | [Canvas](<P5 Integrationen/WF-P5 Integrationen/WF-P5 Integrationen.canvas>) |
| M03 | Trennen-Bestaetigung | WF-P5 Integrationen | Modal | Bauen | Validiert | aus S02 | [MD](<P5 Integrationen/WF-P5 Integrationen/Screens/M03 Trennen-Bestaetigung.md>) | - | [Canvas](<P5 Integrationen/WF-P5 Integrationen/WF-P5 Integrationen.canvas>) |
| S01 | Kontakte-Liste | WF-P6 Kontakte und Organisationen | Liste | Bauen | Validiert | `/contacts` | [MD](<P6 Kontakte/WF-P6 Kontakte und Organisationen/Screens/S01 Kontakte-Liste.md>) | - | [Canvas](<P6 Kontakte/WF-P6 Kontakte und Organisationen/WF-P6 Kontakte und Organisationen.canvas>) |
| S02 | Organisationen-Liste | WF-P6 Kontakte und Organisationen | Liste | Bauen | Validiert | `/contacts/companies` | [MD](<P6 Kontakte/WF-P6 Kontakte und Organisationen/Screens/S02 Organisationen-Liste.md>) | - | [Canvas](<P6 Kontakte/WF-P6 Kontakte und Organisationen/WF-P6 Kontakte und Organisationen.canvas>) |
| S03 | Kontakt-Karteikarte (Muster-Vorlage) | WF-P6 Kontakte und Organisationen | Detail | Bauen | Validiert | `/contacts/:id` | [MD](<P6 Kontakte/WF-P6 Kontakte und Organisationen/Screens/S03 Kontakt-Karteikarte.md>) | - | [Canvas](<P6 Kontakte/WF-P6 Kontakte und Organisationen/WF-P6 Kontakte und Organisationen.canvas>) |
| S04 | Organisations-Karteikarte | WF-P6 Kontakte und Organisationen | Detail | Bauen | Validiert | `/contacts/companies/:id` | [MD](<P6 Kontakte/WF-P6 Kontakte und Organisationen/Screens/S04 Organisations-Karteikarte.md>) | - | [Canvas](<P6 Kontakte/WF-P6 Kontakte und Organisationen/WF-P6 Kontakte und Organisationen.canvas>) |
| M01 | Kontakt anlegen | WF-P6 Kontakte und Organisationen | Modal | Bauen | Validiert | aus S01 + ueberall | [MD](<P6 Kontakte/WF-P6 Kontakte und Organisationen/Screens/M01 Kontakt anlegen.md>) | - | [Canvas](<P6 Kontakte/WF-P6 Kontakte und Organisationen/WF-P6 Kontakte und Organisationen.canvas>) |
| M02 | Organisation anlegen | WF-P6 Kontakte und Organisationen | Modal | Bauen | Validiert | aus S02 | [MD](<P6 Kontakte/WF-P6 Kontakte und Organisationen/Screens/M02 Organisation anlegen.md>) | - | [Canvas](<P6 Kontakte/WF-P6 Kontakte und Organisationen/WF-P6 Kontakte und Organisationen.canvas>) |
| S05 | Eigene Felder | WF-P6 Kontakte und Organisationen | Settings-Liste | Bauen | Validiert | `/admin/custom-fields` | [MD](<P6 Kontakte/WF-P6 Kontakte und Organisationen/Screens/S05 Eigene Felder.md>) | - | [Canvas](<P6 Kontakte/WF-P6 Kontakte und Organisationen/WF-P6 Kontakte und Organisationen.canvas>) |
| S06 | Tags | WF-P6 Kontakte und Organisationen | Settings-Liste | Bauen | Validiert | `/admin/tags` | [MD](<P6 Kontakte/WF-P6 Kontakte und Organisationen/Screens/S06 Tags.md>) | - | [Canvas](<P6 Kontakte/WF-P6 Kontakte und Organisationen/WF-P6 Kontakte und Organisationen.canvas>) |
| S07 | Duplikat-Tool | WF-P6 Kontakte und Organisationen | Settings-Liste | Bauen | Validiert | `/admin/duplicates` | [MD](<P6 Kontakte/WF-P6 Kontakte und Organisationen/Screens/S07 Duplikat-Tool.md>) | - | [Canvas](<P6 Kontakte/WF-P6 Kontakte und Organisationen/WF-P6 Kontakte und Organisationen.canvas>) |
| M03 | Zusammenfuehren (Seite an Seite) | WF-P6 Kontakte und Organisationen | Modal (gross) | Bauen | Validiert | aus S07 | [MD](<P6 Kontakte/WF-P6 Kontakte und Organisationen/Screens/M03 Zusammenfuehren.md>) | - | [Canvas](<P6 Kontakte/WF-P6 Kontakte und Organisationen/WF-P6 Kontakte und Organisationen.canvas>) |
| D01 | Inline-Anlegen in Liste (Notion-Stil) | WF-P6 Kontakte und Organisationen | Idee | Spaeter | Dokumentiert | in S01 | [MD](<P6 Kontakte/WF-P6 Kontakte und Organisationen/WF-P6 Kontakte und Organisationen.md>) | - | - |
| S01 | Lead-Inbox (Triage) | WF-P7 Leads | Liste | Bauen | Validiert | `/leads` | [MD](<P7 Leads/WF-P7 Leads/Screens/S01 Lead-Inbox.md>) | - | [Canvas](<P7 Leads/WF-P7 Leads/WF-P7 Leads.canvas>) |
| S02 | Lead-Detail | WF-P7 Leads | Detail | Bauen | Validiert | `/leads/:id` | [MD](<P7 Leads/WF-P7 Leads/Screens/S02 Lead-Detail.md>) | - | [Canvas](<P7 Leads/WF-P7 Leads/WF-P7 Leads.canvas>) |
| M01 | Lead zu Projekt (Kern-Moment) | WF-P7 Leads | Modal (gross, +Bulk) | Bauen | Validiert | aus S01/S02 | [MD](<P7 Leads/WF-P7 Leads/Screens/M01 Lead zu Projekt.md>) | - | [Canvas](<P7 Leads/WF-P7 Leads/WF-P7 Leads.canvas>) |
| S03 | Lead-Statistiken | WF-P7 Leads | KPI-Seite | Bauen | Validiert | `/leads/statistics` | [MD](<P7 Leads/WF-P7 Leads/Screens/S03 Lead-Statistiken.md>) | - | [Canvas](<P7 Leads/WF-P7 Leads/WF-P7 Leads.canvas>) |
| M02 | Anfrage anlegen | WF-P7 Leads | Modal | Bauen | Validiert | aus S01 | [MD](<P7 Leads/WF-P7 Leads/Screens/M02 Anfrage anlegen.md>) | - | [Canvas](<P7 Leads/WF-P7 Leads/WF-P7 Leads.canvas>) |
| M03 | CSV-Import-Wizard | WF-P7 Leads | Modal/Wizard | Bauen | Validiert (Delta) | aus S01 | [MD](<P7 Leads/WF-P7 Leads/Screens/M03 CSV-Import.md>) | - | [Canvas](<P7 Leads/WF-P7 Leads/WF-P7 Leads.canvas>) |
| S04 | Quellen-Verwaltung | WF-P7 Leads | Settings-Liste | Bauen | Validiert | `/admin/lead-sources` | [MD](<P7 Leads/WF-P7 Leads/Screens/S04 Quellen-Verwaltung.md>) | - | [Canvas](<P7 Leads/WF-P7 Leads/WF-P7 Leads.canvas>) |
| S05 | Spam-Schutz | WF-P7 Leads | Settings | Bauen | Validiert | `/admin/lead-anti-spam` | [MD](<P7 Leads/WF-P7 Leads/Screens/S05 Spam-Schutz.md>) | - | [Canvas](<P7 Leads/WF-P7 Leads/WF-P7 Leads.canvas>) |
---
@@ -199,6 +220,14 @@ Diese Datei ist der erste Ort, um zu sehen:
| WF-P5 Integrationen | Sync-Verlauf-Ort | Genommen | Verlauf und Lauf-Detail als eigene Seiten (kein Drawer-Muster). | Davids Entscheidung 2026-07-08 |
| WF-P5 Integrationen | Assistent-Varianten | Genommen | OAuth-Weg und API-Schluessel-Weg als eigene Frames. | Formular auto-generiert aus App-Schema |
| WF-P5 Integrationen | Kommende Apps als Teaser? | Offen | Zeigt der Katalog nicht verfuegbare Apps mit Schloss (analog Abo-Gating)? | David/Dev |
| WF-P6 Kontakte | Karteikarten-Grundgeruest | Genommen | Zweispalter + Reiter (links Stammdaten/Felder/Tags/Verknuepfungen, rechts Reiter Verlauf/Projekte/Aufgaben/Dateien/Notizen). | Muster-Vorlage fuer ALLE Detailseiten; nach Subframe-Bau als Standard festhalten (mit Freigabe) |
| WF-P6 Kontakte | Anlegen | Genommen | Modal mit Live-Duplikat-Warnung; nur Name Pflicht; danach oeffnet Karteikarte. | Validiert 2026-07-08 |
| WF-P6 Kontakte | Inline-Anlegen (Notion-Stil) | Spaeter | Plus in der Liste -> neue Zeile inline; leere Zeile loescht sich automatisch. | Davids Idee, dokumentiert; erstmal nicht bauen |
| WF-P6 Kontakte | Listen-Struktur | Genommen | Zwei getrennte Reiter (Kontakte = ALLE Personen inkl. Ansprechpartner mit sichtbarer Org+Rolle; Organisationen separat); nie gemischt. | Validiert 2026-07-08 |
| WF-P6 Kontakte | Anlege-Regeln + Hauptkontakt | Genommen | Privatperson ohne Kontaktart-Frage; Org auch ohne Person; genau EIN Hauptkontakt je Org, erste Person automatisch (umhaengbar); auch Privatpersonen koennen Sekundaerkontakte haben. | Validiert 2026-07-08 |
| WF-P7 Leads | Lead->Projekt-Form | Genommen | Grosses Modal mit 3 Sektionen (Vererbungs-Vorschau, Board+Spalte, Kontakt verknuepfen); auch als Bulk-Variante (Massen-Konvertierung). | Bulk-Machbarkeit mit Dev bestaetigen |
| WF-P7 Leads | CSV-Import-Wizard | Genommen (Delta) | Datei -> Spalten zuordnen -> Vorschau/Duplikat-Regel -> Import im Hintergrund. Steht nicht im Dev-Ticket. | Change-Request an Dev |
| WF-P7 Leads | Anfrage anlegen | Genommen | Modal (wie Kontakt anlegen); Inline-Anlegen (Plus -> Zeile) als gemeinsames Spaeter-Muster mit P6 dokumentiert. | Validiert 2026-07-08 |
---
File diff suppressed because it is too large. Load diff
+24 -20
View File
@@ -43,8 +43,8 @@ Gesamtkarte aller HiveGrid-v1-Features. Eine Karte = **ein Feature** (so benannt
| Login, Registrierung & Workspace | Login & Zugänge | D-P2 | 🔵 | ✅ validiert |
| Dashboard (Startseite) | Suche & Dashboard | D-DASH (Teil) | 🔵 | ⬜ offen |
| Suche (Cmd+K) | Suche & Dashboard | D-DASH (Teil) | 🔴 klein | ⬜ offen |
| Lead-Eingang (Anfragen) | Vertrieb | D-P7 | 🔵 | ⬜ offen |
| Kontakte & Organisationen | Vertrieb | D-CRM | 🔵 | ⬜ offen |
| Lead-Eingang (Anfragen) | Vertrieb | D-P7 | 🔵 | 🟡 vorgeplant |
| Kontakte & Organisationen | Vertrieb | D-CRM | 🔵 | 🟡 vorgeplant |
| Kanban-Board & Pipelines (Projekte) | Vertrieb | D-P8 + D-KANBAN | 🟠 | ⬜ offen |
| Projekt-Akte (Auftrag) 📱 | Auftrag & Baustelle | D-P9 | 🟠 | ⬜ offen |
| Plantafel (Einsatzplanung) 📱 | Auftrag & Baustelle | D-PLAN | 🔴 | ⬜ offen |
@@ -193,25 +193,29 @@ Abhaken = in der groben Planung berücksichtigt (Screens/Flow verortet). Quelle:
### Vertrieb
#### Lead-Eingang (Anfragen) — `D-P7` — ⬜ offen
- [ ] Eingangs-Liste (Quelle, Status, Freigabe ja/nein/unklar, Duplikat-/Spam-Marker, Schnell-Aktionen, Mehrfach-Aktionen, live)
- [ ] Anfrage-Detail (Quelle im Detail, Spam-Wert mit Begründung, »könnte dieser Kontakt sein«-Hinweise, Verlauf bei Mehrfach-Anfragen)
- [ ] »Zu Projekt machen« (Daten-Übernahme-Vorschau, Ziel-Board + Start-Spalte wählen, Kontakt anlegen oder verknüpfen)
- [ ] Statistiken (eingegangen, Umwandlungsquote, Reaktionszeit, je Quelle)
- [ ] Quellen-Verwaltung (inkl. Webhook-Link für Fremd-Websites)
- [ ] Spam-Schutz-Einstellungen (Limits, automatische Markierung, Quarantäne, Auto-Löschfristen)
- [ ] Anfrage von Hand anlegen (mit Duplikat-Check beim Tippen)
#### Lead-Eingang (Anfragen) — `D-P7` — 🟡 vorgeplant (2026-07-08)
- [x] Eingangs-Liste (Quelle, Status, Freigabe ja/nein/unklar, Duplikat-/Spam-Marker, Schnell-Aktionen, Mehrfach-Aktionen, live)
- [x] Anfrage-Detail (Quelle im Detail, Spam-Wert mit Begründung, »könnte dieser Kontakt sein«-Hinweise, Verlauf bei Mehrfach-Anfragen)
- [x] »Zu Projekt machen« als großes Modal (Daten-Übernahme-Vorschau, Ziel-Board + Start-Spalte, Kontakt anlegen oder verknüpfen) — auch als Bulk (Massen-Konvertierung, Davids Ergänzung)
- [x] Statistiken (eingegangen, Umwandlungsquote, Reaktionszeit, je Quelle, Drill-Down in gefilterte Inbox)
- [x] Quellen-Verwaltung (inkl. Webhook-Link für Fremd-Websites)
- [x] Spam-Schutz-Einstellungen (Limits, automatische Markierung, Quarantäne, Auto-Löschfristen)
- [x] Anfrage von Hand anlegen als Modal (mit Duplikat-Check beim Tippen); Inline-Anlegen als Später-Muster
- Davids Delta: **CSV-Import-Wizard** (Datei → Spalten zuordnen → Vorschau → Import) — Change-Request an Dev
- Paket: `02 Wireframes/P7 Leads/WF-P7 Leads/` (Screens validiert; Subframe steht aus)
#### Kontakte & Organisationen — `D-CRM` — ⬜ offen
- [ ] Kontakt-Liste (Filter, Mehrfach-Aktionen, CSV-Export)
- [ ] Organisations-Liste (heißt »Organisation«, nicht »Unternehmen«)
- [ ] Kontakt-Detailseite = **Vorlage für alle Detailseiten** (direkt editierbar, Reiter: Projekte/Dateien/Aufgaben, eigene Felder, Notizen, kompletter Verlauf inkl. Mails + Anrufe, Schnell-Aktionen)
- [ ] Organisations-Detailseite (verknüpfte Kontakte mit Rolle, Hauptkontakt markiert)
- [ ] Eigene Felder verwalten (je Datentyp, SHK-Vorlagen vorbefüllt)
- [ ] Tags verwalten (Farbe, zusammenführen)
- [ ] Duplikate nebeneinander vergleichen und Feld für Feld zusammenführen
- [ ] Kontakt-Logik: Typ (Privatperson/Organisation) · Status (Kontakt/Kunde/Bestandskunde) · Rolle bei Verknüpfung
- [ ] Duplikat-Warnung schon beim Anlegen
#### Kontakte & Organisationen — `D-CRM` — 🟡 vorgeplant (2026-07-08)
- [x] Kontakt-Liste (Filter, Mehrfach-Aktionen, CSV-Export)
- [x] Organisations-Liste (heißt »Organisation«, nicht »Unternehmen«)
- [x] Kontakt-Karteikarte = **Vorlage für alle Detailseiten** — validiertes Grundgerüst: Zweispalter + Reiter (links Stammdaten/Felder/Tags/Verknüpfungen, rechts Verlauf/Projekte/Aufgaben/Dateien/Notizen, Schnell-Aktionen im Kopf)
- [x] Organisations-Karteikarte (verknüpfte Kontakte mit Rolle, Hauptkontakt markiert)
- [x] Eigene Felder verwalten (je Datentyp, SHK-Vorlagen vorbefüllt)
- [x] Tags verwalten (Farbe, zusammenführen)
- [x] Duplikate nebeneinander vergleichen und Feld für Feld zusammenführen
- [x] Kontakt-Logik: Typ (Privatperson/Organisation) · Status (Kontakt/Kunde/Bestandskunde) · Rolle bei Verknüpfung
- [x] Duplikat-Warnung schon beim Anlegen (Anlegen als Modal, nur Name Pflicht)
- Davids Idee dokumentiert (Später): Inline-Anlegen in der Liste (Notion-Stil)
- Paket: `02 Wireframes/P6 Kontakte/WF-P6 Kontakte und Organisationen/` (Screens validiert; Subframe steht aus)
#### Kanban-Board & Pipelines (Projekte) — `D-P8` + `D-KANBAN` — ⬜ offen
- [ ] Kanban-Board: Spalten = Status, Karten ziehen = Status wechseln; Spaltenkopf mit Anzahl + Summe