# 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
(Tabelle)"] -->|Lead erstellen| M["Lead-Karte
vorbelegt, Titel fehlt"] M -->|Speichern| L["Lead in 'Neuer Lead'"] M -->|Speichern| A["Suspect → Archiv
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`).