MDL-60912 core_completion: Fix course completion percentage calculation
This change ensures that course completion percentage calculations include only completion activities visible to the user on the course home page. Hidden or unavailable activities, and those in hidden sections, are no longer included in the calculation.
This commit is contained in:
@@ -1693,9 +1693,10 @@ class completion_info {
|
||||
* Return the number of modules completed by a user in one specific course.
|
||||
*
|
||||
* @param int $userid The User ID.
|
||||
* @param array $moduleids The course modules to check.
|
||||
* @return int Total number of modules completed by a user
|
||||
*/
|
||||
public function count_modules_completed(int $userid): int {
|
||||
public function count_modules_completed(int $userid, array $moduleids = []): int {
|
||||
global $DB;
|
||||
|
||||
$sql = "SELECT COUNT(1)
|
||||
@@ -1703,10 +1704,17 @@ class completion_info {
|
||||
JOIN {course_modules_completion} cmc ON cm.id = cmc.coursemoduleid
|
||||
WHERE cm.course = :courseid
|
||||
AND cmc.userid = :userid
|
||||
AND cm.visible = 1
|
||||
AND (cmc.completionstate = " . COMPLETION_COMPLETE . "
|
||||
OR cmc.completionstate = " . COMPLETION_COMPLETE_PASS . ")";
|
||||
$params = ['courseid' => $this->course_id, 'userid' => $userid];
|
||||
|
||||
if (!empty($moduleids)) {
|
||||
[$insql, $inparams] = $DB->get_in_or_equal($moduleids, SQL_PARAMS_NAMED);
|
||||
$sql.= " AND cm.id $insql";
|
||||
$params = array_merge($params, $inparams);
|
||||
}
|
||||
|
||||
return $DB->count_records_sql($sql, $params);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user