Zum Hauptinhalt springen

Kurs-Anmeldungen (CourseEnrollments)

Zweck

CourseEnrollment ist eine polymorphe Anmeldung zu einem Kurs. Pro Eintrag wird parentType = Employee (eigener Mitarbeiter) oder parentType = Client (externer Kunde) gesetzt. Der Anmeldende erhaelt damit Zugriff auf den Lernpfad, der durch die Module des Kurses (Content, Exam, SCORM) fuehrt.

Anmeldungen koennen ein expiresAt haben, nach dem sie nicht mehr in der Liste angezeigt werden (auto-Filter).

Voraussetzungen

- Berechtigung `view:CourseEnrollment` und `create:CourseEnrollment`. - Bestehender [Kurs](/courses) als Ziel. - Lernender als [Mitarbeiter](/employees) oder [Mandant](/clients) angelegt.

Berechtigungen (CASL)

ActionSubjectWirkungKeycloak-Rolle
viewFE_CourseEnrollment, CourseEnrollmentListe/Detail aufrufbar
create/update/deleteCourseEnrollmentPflegenAPP_SPEAMCORE_CREATE/UPDATE/DELETE_COURSE_ENROLLMENT
viewCourseKurs-AuswahlAPP_SPEAMCORE_VIEW_COURSE
viewEmployeeLernender-AuswahlAPP_SPEAMCORE_VIEW_EMPLOYEE

Schritt-für-Schritt-Anleitung

Anmeldung anlegen

Anmeldungen werden typischerweise nicht direkt auf /course-enrollments angelegt, sondern aus dem Kurs- oder Mitarbeiter-Kontext heraus:

  • Kurs → Anmeldungen (/courses/:id/enrollments)
  • Mitarbeiter → Kurs-Anmeldungen (/employees/:id/course-enrollments)
  • Mandant → Kurs-Anmeldungen (/clients/:id/course-enrollments)

In allen Faellen wird parentType und parentId automatisch aus dem Routing-Kontext gesetzt.

Lernpfad durchlaufen

Auf der Liste /course-enrollments (Default-Sicht des angemeldeten Mitarbeiters) werden Karten pro aktiver Anmeldung angezeigt. Klick fuehrt zu /course-enrollments/:id — der Lernpfad mit Modulen.

Pro Modultyp gibt es eine eigene Detail-Seite:

  • Content-Modul: /course-enrollments/:enrollmentId/course-modules/:moduleId — Slide-Player.
  • Exam-Modul: /course-enrollments/:enrollmentId/course-exams/:moduleId — Prüfung.
  • SCORM-Modul: /course-enrollments/:enrollmentId/course-scorms/:moduleId — SCORM-Player.

Admin-Sicht

/course-enrollments/:id/admin liefert Trainern/HR die Verlaufsdaten (Antworten, Score, Zeit pro Modul) — basiert auf den Admin*Detail-Komponenten.

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
parentTypejaENUM (Employee, Client)Anmelde-Subjekt-Typ.
parentIdjaUUIDVerweis auf Mitarbeiter oder Mandant.view:Employee bzw. view:Client.
courseIdjaUUIDVerweis auf Kurs.view:Course.
expiresAtneinDateTimeAuto-Ablaufdatum. Anmeldungen mit expiresAt < now werden in Listen ausgeblendet.

Wiederverwendbare Konzepte

Verknuepfungen zu anderen Modulen

Häufige Fehler und Lösungen

FehlerLösung
Anmeldung erscheint nicht in ListeexpiresAt < now oder kein clientId/employeeId im Zustand. Liste filtert auf eigene Anmeldungen.
Modul-Detail wirft 404Module-ID gehört nicht zum Kurs der Anmeldung.
Admin-Sicht leerLernender hat das Modul noch nicht angefangen oder Berechtigung view-Sub-Subjects fehlt.

API/Schnittstellen

MethodeEndpointZweckCASL
GET/api/course-enrollmentsListe (mit Filter parentId/parentType)view CourseEnrollment
POST/api/course-enrollmentsAnlegencreate CourseEnrollment
GET/api/course-enrollments/:idDetailview CourseEnrollment
PATCH/api/course-enrollments/:idÄndernupdate CourseEnrollment
DELETE/api/course-enrollments/:idSoft-Deletedelete CourseEnrollment

Versionshinweise

  • 2026-04-30: Initiale Veroeffentlichung.