feat: globale Suche und Anbindung an das ICON CRM

Beides lag bisher nur als nicht eingecheckte Arbeit im Arbeitsverzeichnis,
waehrend auf Gitea nur die Doku dazu stand (docs/12-suche.md). Damit ist
der Code jetzt versioniert.

Globale Suche:
- server/src/routes/search.js: Volltext ueber Kontakte, Opportunities und
  Akquise, dazu die erweiterte Suche mit dem Modell des Scanners
- src/components/GlobalSearch.tsx im Kopf der Anwendung; ein Treffer
  springt in die Ansicht und oeffnet den Datensatz (navigation.tsx)

ICON CRM:
- server/src/routes/integrations.js liefert die Kontakte mit gesetztem
  Haekchen hinaus, server/src/routes/iconCrm.js holt die Kontakte von
  drueben herein - beide nur lesend, mit festem Token statt JWT
- server/src/contactBridge.js und src/lib/contactMatch.ts erkennen
  Dubletten, src/components/leads/IconMergeDialog.tsx laesst sie
  zusammenfuehren
- server/src/ai.js buendelt die OpenAI-Aufrufe

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
schakal00783
2026-09-17 23:07:59 +02:00
co-authored by Claude Opus 5
parent ad7f806258
commit 49c03f5e1b
22 changed files with 2339 additions and 23 deletions
+21
View File
@@ -588,6 +588,27 @@ versehentlich die Auswahl verwirft, gilt eine Geste erst ab 4 px Weg als Ziehen;
Knoten stoppen das `pointerdown` ohnehin, ihre Klicks erreichen den Hintergrund
nicht.
## Anbindung an das ICON CRM
Beide Häuser tauschen ihre Kontakte lesend aus - gekennzeichnet, nicht
vermischt, und **ohne dass etwas gespeichert wird**. Ein nächtlicher Abgleich
wäre der falsche Weg: dann stünde derselbe Mensch in zwei Systemen.
| Richtung | Weg |
| --- | --- |
| hinaus | `GET /api/integrations/contacts` - liefert die Kontakte mit gesetztem Häkchen *Im ICON CRM anzeigen* (`crm_leads.icon`). Token: `ICON_API_TOKEN` |
| herein | `GET /api/icon/contacts` - holt die Kontakte des ICON CRM. `ICON_CRM_URL`, `ICON_CRM_TOKEN`, eine Minute Zwischenspeicher |
Beide Wege kennen nur `GET`, beide nutzen einen festen Token statt JWT: der
Aufrufer ist das jeweils andere Backend, kein angemeldeter Mensch.
In den Kontakten blendet das Häkchen **ICON** die Kontakte von drüben ein -
**gold umrandet** und ohne Bearbeitung. Umgekehrt zeigt das ICON CRM die
hiesigen Kontakte grün umrandet an.
Kontakte, die hier das Häkchen tragen, sind in der Liste an der Marke **ICON**
neben der Kontaktart zu erkennen.
## Lokale Entwicklung
```bash