Files
schakal00783andClaude Opus 5.5 33c9dbdb2b Suspects: Eingabezeile oben, Letzter Kontakt standardmäßig heute
- 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>
2026-09-29 12:37:56 +02:00

112 lines
4.9 KiB
Markdown
Raw Permalink 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` |
| 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`).