Files
ICON-CRM/docs/13-suspects.md
T
schakal00783andClaude Opus 5.5 6a452f1510 Suspects: Vorstufe der Leads als Tabelle
Neuer Menüpunkt über Leads mit Unterpunkt Archiv.

- Tabelle Name, Funktion, Unternehmen, LinkedIn, Website, Notiz,
  Letzter Kontakt, Nächster Impuls; leere Zeile unten, speichert beim
  Verlassen. Links als Symbol mit URL im Tooltip.
- Nächster Impuls: Tage eingeben, Erinnerung über den ReminderWatcher
- Archivieren, Zurückholen, endgültig löschen (nur aus dem Archiv)
- Lead erstellen öffnet die Lead-Karte vorbelegt (LeadModal.initial),
  danach wandert der Suspect mit lead_id ins Archiv

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 12:11:36 +02:00

106 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 13 Suspects
Die Stufe **vor** dem Lead: Personen, die interessant sein könnten, als
schlichte Tabelle. Eingeführt am 29.09.2026. Menü: **Suspects** (über Leads) mit
dem Unterpunkt **Archiv**.
```mermaid
flowchart LR
S["Suspect<br/>(Tabelle)"] -->|Lead erstellen| M["Lead-Karte<br/>vorbelegt, Titel fehlt"]
M -->|Speichern| L["Lead in 'Neuer Lead'"]
M -->|Speichern| A["Suspect → Archiv<br/>mit Verweis auf den Lead"]
S -->|Archivieren| A
A -->|Zurückholen| S
A -->|Endgültig löschen| X["weg"]
```
## Tabelle
| Spalte | Feld | Hinweis |
| --- | --- | --- |
| Name | `name` | Pflicht – ohne Namen wird eine neue Zeile nicht gespeichert |
| Funktion | `role` | Freitext |
| Unternehmen | `company` | Freitext, **kein** Verweis auf `icon_companies` |
| LinkedIn | `linkedin` | nach dem Speichern nur ein Symbol, URL im Tooltip |
| Website | `website` | ebenso; fehlt `https://`, ergänzt es der Server |
| Notiz | `notes` | einzeilig, volle Länge im Tooltip |
| Letzter Kontakt | `last_contact_on` | Datum |
| Nächster Impuls | `remind_at` | Wecker: Anzahl Tage eingeben, der Server rechnet das Datum |
**Bedienung wie eine Liste.** Unten steht immer eine leere Zeile. Gespeichert
wird, sobald der Fokus die Zeile verlässt oder Enter gedrückt wird. Vorhandene
Zellen speichern beim Verlassen der Zelle; Esc verwirft die Eingabe. Links
bearbeitet man über den kleinen Stift, der beim Überfahren neben dem Symbol
erscheint.
Name, Funktion und Unternehmen sind bewusst Freitext: ein Suspect soll in
Sekunden erfasst sein, ohne erst Kontakt und Unternehmen anzulegen.
## Nächster Impuls
Klick auf den Wecker → Anzahl Tage → Speichern. Gesetzt zeigt die Zelle das
Datum (rot, wenn fällig). Fällige Impulse meldet derselbe Wächter wie die
Lead-Erinnerungen (`ReminderWatcher`, beim Anmelden und stündlich):
| Knopf | Wirkung |
| --- | --- |
| Kontakt aufgenommen | `remind_at` leer, **Letzter Kontakt = heute** |
| In 7 Tagen erneut | `remind_at` + 7 Tage |
| Schließen (×) | nichts – meldet sich beim nächsten Abfragen wieder |
## Lead erstellen
Das Lead-Symbol am Zeilenende öffnet die **Lead-Karte vorbelegt**
(`LeadModal` mit `initial`):
- Phase **Neuer Lead**, zuständig der angemeldete Benutzer
- **Unternehmen** und **Ansprechpartner** nur, wenn es im CRM einen mit gleichem
Namen gibt (Groß/klein, Rechtsform und Satzzeichen egal)
- **Notiz** mit allem aus der Zeile: Name, Funktion, Unternehmen, LinkedIn,
Website, letzter Kontakt, Notiz
- **Titel bleibt leer** – der ist Pflicht und muss eingetragen werden
Erst beim Speichern entsteht der Lead; danach wandert der Suspect ins Archiv
und trägt `lead_id` (im Archiv als **Lead** markiert). Abbrechen ändert nichts.
## Archiv
Archivierte und in Leads übernommene Suspects, neueste zuerst. **Zurückholen**
stellt die Zeile wieder in die Tabelle, **Endgültig löschen** entfernt sie
(mit Rückfrage). Löschen geht nur aus dem Archiv – der Server antwortet sonst
mit `409`.
## Tabelle `icon_suspects`
| Spalte | Typ | Bedeutung |
| --- | --- | --- |
| `id` | INT | |
| `name`, `role`, `company` | VARCHAR(190) | |
| `linkedin`, `website` | VARCHAR(500) | immer mit Protokoll gespeichert |
| `notes` | TEXT | |
| `last_contact_on` | DATE | |
| `remind_at` | DATETIME | nächster Impuls, UTC wie bei den Leads |
| `archived` | TINYINT | |
| `lead_id` | INT NULL | → `icon_leads`, `ON DELETE SET NULL` |
| `created_by` | INT NULL | → `icon_users` |
In die Historie (als Systemeintrag „Suspects") kommen Archivieren,
Zurückholen, Übernahme als Lead und endgültiges Löschen – nicht jede
Zelländerung.
## Endpunkte
Alle unter `/api/suspects`, alle hinter `requireAuth`.
| Methode | Pfad | Zweck |
| --- | --- | --- |
| GET | `/?archived=0\|1` | Liste; aktiv älteste zuerst, Archiv neueste zuerst |
| GET | `/reminders` | fällige Impulse (`remind_at <= NOW()`, nicht archiviert) |
| POST | `/` | anlegen, `name` Pflicht |
| PATCH | `/:id` | beliebige Felder; `remind_in_days` (Zahl oder `null`), `archived`, `lead_id` |
| POST | `/:id/acknowledge` | `{ snooze_days }` verschiebt, sonst Kontakt heute + Impuls weg |
| DELETE | `/:id` | nur archivierte (`409` sonst) |
Die Zähler im Menü kommen aus `GET /api/dashboard`
(`counts.suspects_open`, `counts.suspects_archived`).