- Eingabezeile über der Liste, mit Abstand und Knopf Hinzufügen; Liste neueste zuerst, neue Einträge erscheinen direkt darunter - Letzter Kontakt neuer Zeilen = heute (Ortszeit), auch serverseitig, wenn das Feld beim Anlegen fehlt Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
112 lines
4.9 KiB
Markdown
112 lines
4.9 KiB
Markdown
# 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` |
|
||
| Mail | `email` | nach dem Speichern nur ein Briefsymbol, Adresse im Tooltip, Klick öffnet das Mailprogramm |
|
||
| 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; neue Zeilen stehen auf **heute** (änderbar per Kalender). Auch die API setzt heute, wenn das Feld fehlt – ein bewusst geleertes Feld (`null`) bleibt leer |
|
||
| Nächster Impuls | `remind_at` | Wecker: Anzahl Tage eingeben, der Server rechnet das Datum |
|
||
|
||
**Bedienung wie eine Liste.** Oben steht immer eine Eingabezeile, mit etwas
|
||
Abstand zur Liste darunter; die Liste zeigt die neuesten Einträge zuerst, ein
|
||
neuer landet also direkt unter der Eingabe. Gespeichert wird mit Enter, dem
|
||
Knopf **Hinzufügen** oder sobald der Fokus die Zeile verlässt. 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, Mail, 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 und Löschen
|
||
|
||
Archivierte und in Leads übernommene Suspects, neueste zuerst. **Zurückholen**
|
||
stellt die Zeile wieder in die Tabelle, **Endgültig löschen** entfernt sie.
|
||
|
||
Löschen geht auch direkt in der Tabelle (rotes Symbol am Zeilenende) – beide
|
||
Wege fragen vorher nach. Anfangs war Löschen nur aus dem Archiv möglich; auf
|
||
Wunsch vom 29.09.2026 gibt es den Knopf jetzt auch in der Tabelle.
|
||
|
||
## Tabelle `icon_suspects`
|
||
|
||
| Spalte | Typ | Bedeutung |
|
||
| --- | --- | --- |
|
||
| `id` | INT | |
|
||
| `name`, `role`, `company` | VARCHAR(190) | |
|
||
| `email` | VARCHAR(190) | ohne `mailto:`; nachträglich per `migrateColumns` ergänzt |
|
||
| `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 neueste Anlage zuerst, Archiv zuletzt geändert 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` | endgültig löschen (aus Tabelle oder Archiv) |
|
||
|
||
Die Zähler im Menü kommen aus `GET /api/dashboard`
|
||
(`counts.suspects_open`, `counts.suspects_archived`).
|