Skip to content

[BUG] Unbearbeitete Kurse werden fälschlich als begonnen gewertet #502

Description

@ralferlebach

Problem

Die Kursabschlussbedingung kennzeichnet einen Kurs beziehungsweise eine Node bereits dann als „in Bearbeitung“, wenn der Studierende noch keinen Fortschritt erzielt hat.

In classes/course_completion/conditions/course_completed.php steht:

$progress = progress::get_course_progress_percentage(
    $course,
    $userid
) ?? 0;

if ($progress !== null) {
    $isinbetween = true;
}

Ursache

Durch den Null-Coalescing-Operator

?? 0

kann $progress bei der nachfolgenden Prüfung nicht mehr null sein.

Die Bedingung

$progress !== null

ist daher immer erfüllt, sobald dieser Codepfad erreicht wird – auch bei:

$progress === 0

Der Kurs wird somit fachlich als begonnen behandelt, obwohl keinerlei Aktivität vorliegt.

Lösung

Die Prüfung muss vor der Normalisierung oder explizit gegen einen positiven Fortschritt erfolgen:

$progress = progress::get_course_progress_percentage(
    $course,
    $userid
);

if ($progress !== null && $progress > 0) {
    $isinbetween = true;
}

$progress ??= 0;

Es ist fachlich festzulegen, ob bereits ein bloßer Kursaufruf als Beginn gelten soll. Falls ja, sollte dafür ein bewusstes und nachvollziehbares Kriterium verwendet werden, beispielsweise:

  • erster Kursaufruf,
  • erste Aktivitätsinteraktion,
  • erster Completion-Datensatz,
  • Fortschritt größer als 0 Prozent.

Die aktuelle Nullprüfung bildet keines dieser Kriterien korrekt ab.

Manuelles Testverfahren

Vorbereitung

  1. Einen Kurs mit aktivierter Abschlussverfolgung anlegen.
  2. Mindestens eine Aktivität mit Aktivitätsabschluss hinzufügen.
  3. Den Kurs als Kursabschlussbedingung einer Adele-Node konfigurieren.
  4. Einen neuen Studierenden in den Hostkurs und gegebenenfalls den Node-Kurs einschreiben.
  5. Der Studierende darf den Node-Kurs noch nicht öffnen oder bearbeiten.

Testschritte

  1. Als Studierender ausschließlich den Adele-Hostkurs öffnen.
  2. Die Rückmeldung beziehungsweise Darstellung der betroffenen Node prüfen.
  3. Den Datensatz in local_adele_path_user kontrollieren.
  4. Insbesondere den inbetween-Status und das Fortschrittsfeedback der Kursabschlussbedingung prüfen.
  5. Anschließend eine Aktivität im Node-Kurs beginnen, ohne sie abzuschließen.
  6. Den Lernpfad neu berechnen.
  7. Den Status erneut kontrollieren.
  8. Abschließend den Kurs vollständig abschließen und erneut prüfen.

Aktuelles Ist-Verhalten

Bereits vor jeder Bearbeitung kann die Bedingung als „in Bearbeitung“ beziehungsweise inbetween = true gespeichert und dargestellt werden.

Erwartetes Soll-Verhalten

  • Vor jeder Bearbeitung: nicht begonnen.
  • Nach nachweisbarer Bearbeitung: in Bearbeitung.
  • Nach vollständigem Kursabschluss: abgeschlossen.

Automatisierte Tests

  • get_course_progress_percentage() liefert null.
  • Fortschritt ist exakt 0.
  • Fortschritt liegt zwischen 0 und 100.
  • Fortschritt ist 100.
  • Kurs ohne aktivierte Abschlussverfolgung.
  • Mehrere Kurse mit unterschiedlichem Bearbeitungsstand.

Akzeptanzkriterien

  • Null- und Null-Prozent-Fortschritt werden nicht automatisch als begonnen gewertet.
  • Ein positiver Fortschritt führt zum Zwischenstatus.
  • Vollständiger Kursabschluss führt zum Abschlussstatus.
  • Das fachliche Kriterium „begonnen“ ist dokumentiert.
  • PHPUnit-Tests decken null, 0, Zwischenwert und 100 ab.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions