Kontakte
Zweck
Kontakte sind Personen-Datensaetze mit minimaler Struktur (firstName, lastName). Den fachlichen Bezug bekommt ein Kontakt erst durch eine ContactParent-Verknuepfung an einen Kunden, Standort, Lieferanten, Fahrzeug oder Beleg. Diese Trennung erlaubt, dieselbe Person an mehreren Orten zu fuehren, ohne sie doppelt anzulegen.
Voraussetzungen
Berechtigungen (CASL)
| Action | Subject | Wirkung | Keycloak-Rolle |
|---|---|---|---|
view | FE_Contact | Kontaktliste/-details aufrufbar | — |
view | Contact | Daten lesbar | APP_SPEAMCORE_VIEW_CONTACT |
create/update/delete | Contact | Kontakte pflegen | APP_SPEAMCORE_CREATE/UPDATE/DELETE_CONTACT |
view | Mail | Tab Mails an einem Kontakt | APP_SPEAMCORE_VIEW_MAIL |
Schritt-für-Schritt-Anleitung
Kontakt anlegen
- Kontakte (
/contacts) → + Neu. firstName,lastNamesetzen.- Speichern.
Kontakt einer Entitaet zuordnen
Die Verknuepfung erfolgt nicht hier, sondern auf der Detailseite der jeweiligen Entitaet (z. B. Kunden-Tab Kontakte), wo ein neuer ContactParent-Eintrag entsteht.
Visitenkarte einscannen (OCR → Kontakt + CRM)
Eine physische Visitenkarte lässt sich abfotografieren und automatisch in einen Kontakt verwandeln (CRM-Inbound). Der Scanner (Kamera) erkennt die Karte und löst bei stabilem Bild automatisch aus; das Bild wird perspektivisch entzerrt und ausgewertet.
- Scanner über den Button Visitenkarte scannen öffnen → Karte fotografieren.
- Analyse (
POST /api/contacts/scan-business-card/analyze) liest Name, E-Mail, Telefon und Adresse aus und schlägt Felder vor. - Vorschlag prüfen/korrigieren und übernehmen (
POST /api/contacts/scan-business-card) → SpeamCore legt einen Kontakt an (E-Mail/Telefon als Attribute) und optional direkt ein CRM-Profil (Website, Branche, Mitarbeitergröße, Vertriebs-Owner, Social-Links).
Beides erfordert create:Contact.

Toolbar (Detail-Seite)
Schlanke Toolbar oben rechts:
| Icon | Aktion (aria-label) | CASL | Wirkung |
|---|---|---|---|
| ← | Zurückgehen | — | Zurück zur Liste. |
| 🏠 | Zur Startseite gehen | — | Springt auf das Dashboard / /. |
| ⏮/◀/▶/⏭ | Pagination | — | Navigation durch die gefilterte Liste — Massen-Bearbeitung ohne Liste-Sprung. |
Globale Floating-Drawer (links)
Wie auf jeder Detail-Seite verfuegbar — siehe Floating-Quickbar:
- KAL. (Mini-Kalender)
- ZEIT (Persoenliche Wochen-Arbeitszeit)
- ARBEIT (Eigene bevorstehende Aufträge)
Felder und Eingaben
| Feldname | Pflicht | Datentyp | Wirkung beim Ausfuellen | Voraussetzung |
|---|---|---|---|---|
firstName | nein | String | Vorname; erscheint in Auswahllisten und über ContactParent-Verknuepfungen auf Belegen. | — |
lastName | nein | String | Nachname; selbe Wirkung wie Vorname. | — |
Adressen, Telefonnummern und E-Mail-Adressen werden über AttributeParent polymorph am Kontakt gepflegt — siehe Polymorpher Parent-Pattern.
Wiederverwendbare Konzepte
- Polymorpher Parent-Pattern —
ContactParent.parentType ∈ {Customer, Location, Supplier, Vehicle, SalesDocument, PurchaseDocument, ...}. - Berechtigungen verstehen (CASL)
Verknuepfungen zu anderen Modulen
- Kunden / Standorte / Lieferanten / Fahrzeuge —
ContactParentpolymorph. - Belege — Ansprechpartner pro Beleg.
- Mails (
/contacts/:id/mails) — Verknuepfung zu eingehenden/ausgehenden E-Mails. - CRM (
/contacts/:id/crm) — bei aktivem CRM-Tracking trägt der Kontakt ein CRM-Profil (Status, Owner, Timeline, ICP).
API/Schnittstellen
| Methode | Endpoint | Zweck | CASL |
|---|---|---|---|
GET | /api/contacts | Liste | view Contact |
GET | /api/contacts/:id | Detail | view Contact |
POST | /api/contacts | Anlegen | create Contact |
PATCH | /api/contacts/:id | Ändern | update Contact |
DELETE | /api/contacts/:id | Soft-Delete | delete Contact |
POST | /api/contacts/scan-business-card/analyze | Visitenkarte analysieren (OCR) | create Contact |
POST | /api/contacts/scan-business-card | Kontakt (+ optional CRM-Profil) aus Scan anlegen | create Contact |
Versionshinweise
- 2026-06-24: CRM-Tab (
/contacts/:id/crm) ergänzt — bei aktivem Tracking trägt der Kontakt ein CRM-Profil; zusätzlich Visitenkarten-Scan (OCR → Kontakt + optional CRM-Profil,/contacts/scan-business-card). Verifiziert anContactCrmPage.tsx,businessCardScan.router.ts. - 2026-04-29: Initiale Veroeffentlichung.