Zweck
Client modelliert externe Endanwender mit Login zu SpeamCore — typischerweise:
- Shop-Kunden (Permission
APP_SPEAMCORE_IS_SHOP_CLIENT) — koennen im Shop bestellen.
- LMS-Lerner (Permission
APP_SPEAMCORE_IS_LMS_CLIENT) — koennen Kurse belegen.
Pro Client wird firstName, lastName, email, ein zugeordneter Kunde (customerId) und Permissions gepflegt. Das Login wird über Keycloak-User-IDs (keycloakUserId) realisiert; das Passwort-Feld erscheint nur beim erstmaligen Anlegen.
**Client vs. Mitarbeiter** — Clients sind externe End-Anwender mit eingeschraenkten Rechten (Shop, LMS), waehrend [Mitarbeiter](/employees) interne Nutzer mit voller Modul-Authentifizierung sind. Beide laufen über Keycloak; Client-Kontos sind leichtgewichtige Accounts mit Customer-Bindung.
Voraussetzungen
- Berechtigung `view:Client` und `create:Client`.
- Bestehender [Kunde](/customers) — Pflicht-Bindung über `customerId`.
- Keycloak-Realm aktiv (siehe [Mandanten-Konzept](/konzepte/mandanten)).
Berechtigungen (CASL)
| Action | Subject | Wirkung | Keycloak-Rolle |
|---|
view | FE_Client, Client | Liste/Detail aufrufbar | — |
create/update/delete | Client | Pflegen | APP_SPEAMCORE_CREATE/UPDATE/DELETE_CLIENT |
view | Customer | Customer-Auswahl bei Anlage | APP_SPEAMCORE_VIEW_CUSTOMER |
view | ClientProductGroupProfile, ClientRepresentation, CourseEnrollment | Sub-Listen | APP_SPEAMCORE_VIEW_CLIENT_PRODUCT_GROUP_PROFILE, CLIENT_REPRESENTATION, COURSE_ENROLLMENT |
Schritt-für-Schritt-Anleitung
Client anlegen
- Mandanten (
/clients) → + Neu.
email (Login-Email) und password (initial, nur sichtbar bei Anlage).
firstName und lastName.
customerId zuordnen — bestimmt, für welchen Kunden der Client Zugriff hat.
- Permissions (Multi-Select):
APP_SPEAMCORE_IS_SHOP_CLIENT — Shop-Zugang.
APP_SPEAMCORE_IS_LMS_CLIENT — LMS-Zugang.
- Backend legt Keycloak-User an und mailt Setup-Link (sofern E-Mail-Versand aktiv).
Sub-Listen
| Sub-Route | Inhalt |
|---|
/clients/:id/product-group-profiles | Produktgruppen-Profile, die der Client sehen darf |
/clients/:id/representations | Vertretungen (z. B. wer für den Client einkaufen darf) |
/clients/:id/course-enrollments | Kurs-Anmeldungen |
/clients/:id/course-enrollment-certificates | Zertifikate aus abgeschlossenen Kursen |
/clients/:id/contacts | Kontaktverzeichnis |

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 |
|---|
status | ja | ENUM (active, inactive) | Steuert Login-Faehigkeit. | — |
email | ja | String | Login-Email, wird im Keycloak als Username verwendet. | — |
password | ja bei Anlage | String | Initial-Passwort. Nur sichtbar bei id = new, sonst disabled. | — |
firstName | nein | String | Vorname. | — |
lastName | nein | String | Nachname. | — |
customerId | ja (read-only nach Anlage) | UUID | Verweis auf Kunde. | view:Customer. |
permissions | nein | Array (APP_SPEAMCORE_IS_SHOP_CLIENT, APP_SPEAMCORE_IS_LMS_CLIENT) | Steuert Modul-Zugriff. | — |
Wiederverwendbare Konzepte
Verknuepfungen zu anderen Modulen
Häufige Fehler und Lösungen
| Fehler | Lösung |
|---|
| Login schlaegt fehl | Keycloak-User existiert nicht — beim Erstanlegen muss password gesetzt sein. |
| Client sieht keine Produkte im Shop | clientProductGroupProfile fehlt oder Produkte sind nicht in der Profile. |
| Permissions wurden gesetzt, aber Modul nicht zugaenglich | Keycloak-Sync nach Änderung ist asynchron — kurz warten und neu einloggen. |
API/Schnittstellen
| Methode | Endpoint | Zweck | CASL |
|---|
GET | /api/clients | Liste | view Client |
POST | /api/clients | Anlegen (legt Keycloak-User an) | create Client |
GET | /api/clients/:id | Detail | view Client |
PATCH | /api/clients/:id | Ändern | update Client |
DELETE | /api/clients/:id | Soft-Delete | delete Client |
GET | /api/client-product-group-profiles?filter[clientId] | Profile-Sub-Liste | view ClientProductGroupProfile |
GET | /api/client-representations?filter[clientId] | Vertretungs-Sub-Liste | view ClientRepresentation |
Versionshinweise
- 2026-04-30: Initiale Veroeffentlichung.