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
Berechtigungen (CASL)
| Action | Subject | Wirkung | Keycloak-Rolle |
|---|---|---|---|
view | FE_CourseEnrollment, CourseEnrollment | Liste/Detail aufrufbar | — |
create/update/delete | CourseEnrollment | Pflegen | APP_SPEAMCORE_CREATE/UPDATE/DELETE_COURSE_ENROLLMENT |
view | Course | Kurs-Auswahl | APP_SPEAMCORE_VIEW_COURSE |
view | Employee | Lernender-Auswahl | APP_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:
| 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 |
|---|---|---|---|---|
parentType | ja | ENUM (Employee, Client) | Anmelde-Subjekt-Typ. | — |
parentId | ja | UUID | Verweis auf Mitarbeiter oder Mandant. | view:Employee bzw. view:Client. |
courseId | ja | UUID | Verweis auf Kurs. | view:Course. |
expiresAt | nein | DateTime | Auto-Ablaufdatum. Anmeldungen mit expiresAt < now werden in Listen ausgeblendet. | — |
Wiederverwendbare Konzepte
- Polymorpher Parent-Pattern —
parentType/parentId. - Berechtigungen verstehen (CASL)
Verknuepfungen zu anderen Modulen
- Kurse — Pflicht-Verknuepfung.
- Mitarbeiter, Mandanten —
parent-Verknuepfung. - Kursinhalte, Pruefungen, SCORM-Pakete — Module im Lernpfad.
- Kurs-Zertifikate — beim Abschluss erzeugt.
Häufige Fehler und Lösungen
| Fehler | Lösung |
|---|---|
| Anmeldung erscheint nicht in Liste | expiresAt < now oder kein clientId/employeeId im Zustand. Liste filtert auf eigene Anmeldungen. |
| Modul-Detail wirft 404 | Module-ID gehört nicht zum Kurs der Anmeldung. |
| Admin-Sicht leer | Lernender hat das Modul noch nicht angefangen oder Berechtigung view-Sub-Subjects fehlt. |
API/Schnittstellen
| Methode | Endpoint | Zweck | CASL |
|---|---|---|---|
GET | /api/course-enrollments | Liste (mit Filter parentId/parentType) | view CourseEnrollment |
POST | /api/course-enrollments | Anlegen | create CourseEnrollment |
GET | /api/course-enrollments/:id | Detail | view CourseEnrollment |
PATCH | /api/course-enrollments/:id | Ändern | update CourseEnrollment |
DELETE | /api/course-enrollments/:id | Soft-Delete | delete CourseEnrollment |
Versionshinweise
- 2026-04-30: Initiale Veroeffentlichung.