Zum Hauptinhalt springen

Mandanten / End-Anwender (Clients)

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)

ActionSubjectWirkungKeycloak-Rolle
viewFE_Client, ClientListe/Detail aufrufbar
create/update/deleteClientPflegenAPP_SPEAMCORE_CREATE/UPDATE/DELETE_CLIENT
viewCustomerCustomer-Auswahl bei AnlageAPP_SPEAMCORE_VIEW_CUSTOMER
viewClientProductGroupProfile, ClientRepresentation, CourseEnrollmentSub-ListenAPP_SPEAMCORE_VIEW_CLIENT_PRODUCT_GROUP_PROFILE, CLIENT_REPRESENTATION, COURSE_ENROLLMENT

Schritt-für-Schritt-Anleitung

Client anlegen

  1. Mandanten (/clients) → + Neu.
  2. email (Login-Email) und password (initial, nur sichtbar bei Anlage).
  3. firstName und lastName.
  4. customerId zuordnen — bestimmt, für welchen Kunden der Client Zugriff hat.
  5. Permissions (Multi-Select):
    • APP_SPEAMCORE_IS_SHOP_CLIENT — Shop-Zugang.
    • APP_SPEAMCORE_IS_LMS_CLIENT — LMS-Zugang.
  6. Backend legt Keycloak-User an und mailt Setup-Link (sofern E-Mail-Versand aktiv).

Sub-Listen

Sub-RouteInhalt
/clients/:id/product-group-profilesProduktgruppen-Profile, die der Client sehen darf
/clients/:id/representationsVertretungen (z. B. wer für den Client einkaufen darf)
/clients/:id/course-enrollmentsKurs-Anmeldungen
/clients/:id/course-enrollment-certificatesZertifikate aus abgeschlossenen Kursen
/clients/:id/contactsKontaktverzeichnis

Listenansicht — clients

Toolbar (Detail-Seite)

Schlanke Toolbar oben rechts:

IconAktion (aria-label)CASLWirkung
ZurückgehenZurück zur Liste.
🏠Zur Startseite gehenSpringt auf das Dashboard / /.
⏮/◀/▶/⏭PaginationNavigation durch die gefilterte Liste — Massen-Bearbeitung ohne Liste-Sprung.

Wie auf jeder Detail-Seite verfuegbar — siehe Floating-Quickbar:

  • KAL. (Mini-Kalender)
  • ZEIT (Persoenliche Wochen-Arbeitszeit)
  • ARBEIT (Eigene bevorstehende Aufträge)

Felder und Eingaben

FeldnamePflichtDatentypWirkung beim AusfuellenVoraussetzung
statusjaENUM (active, inactive)Steuert Login-Faehigkeit.
emailjaStringLogin-Email, wird im Keycloak als Username verwendet.
passwordja bei AnlageStringInitial-Passwort. Nur sichtbar bei id = new, sonst disabled.
firstNameneinStringVorname.
lastNameneinStringNachname.
customerIdja (read-only nach Anlage)UUIDVerweis auf Kunde.view:Customer.
permissionsneinArray (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

FehlerLösung
Login schlaegt fehlKeycloak-User existiert nicht — beim Erstanlegen muss password gesetzt sein.
Client sieht keine Produkte im ShopclientProductGroupProfile fehlt oder Produkte sind nicht in der Profile.
Permissions wurden gesetzt, aber Modul nicht zugaenglichKeycloak-Sync nach Änderung ist asynchron — kurz warten und neu einloggen.

API/Schnittstellen

MethodeEndpointZweckCASL
GET/api/clientsListeview Client
POST/api/clientsAnlegen (legt Keycloak-User an)create Client
GET/api/clients/:idDetailview Client
PATCH/api/clients/:idÄndernupdate Client
DELETE/api/clients/:idSoft-Deletedelete Client
GET/api/client-product-group-profiles?filter[clientId]Profile-Sub-Listeview ClientProductGroupProfile
GET/api/client-representations?filter[clientId]Vertretungs-Sub-Listeview ClientRepresentation

Versionshinweise

  • 2026-04-30: Initiale Veroeffentlichung.