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:
Anupama Sarjoshi
2026-02-26 12:38:51 +05:30
parent 15557a5fc2
commit 48520cfc6a
4 changed files with 310 additions and 5 deletions
+9 -1
View File
@@ -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);
}
}