Browse Source

CONTRIB-4868 fix duplicate records found warning in courses with meta enrolments

MOODLE_26_STABLE
Gordon Bateson 11 years ago
parent
commit
d01030946a
  1. 28
      locallib.php

28
locallib.php

@ -916,7 +916,7 @@ class attendance {
global $DB, $CFG; global $DB, $CFG;
// Fields we need from the user table. // Fields we need from the user table.
$userfields = user_picture::fields('u').',u.username'; $userfields = user_picture::fields('u', array('username'));
if (isset($this->pageparams->sort) and ($this->pageparams->sort == ATT_SORT_FIRSTNAME)) { if (isset($this->pageparams->sort) and ($this->pageparams->sort == ATT_SORT_FIRSTNAME)) {
$orderby = "u.firstname ASC, u.lastname ASC"; $orderby = "u.firstname ASC, u.lastname ASC";
@ -959,23 +959,29 @@ class attendance {
// Add a flag to each user indicating whether their enrolment is active. // Add a flag to each user indicating whether their enrolment is active.
if (!empty($users)) { if (!empty($users)) {
list($usql, $uparams) = $DB->get_in_or_equal(array_keys($users), SQL_PARAMS_NAMED, 'usid0'); list($sql, $params) = $DB->get_in_or_equal(array_keys($users), SQL_PARAMS_NAMED, 'usid0');
// CONTRIB-3549. // CONTRIB-4868
$sql = "SELECT ue.userid, ue.status, ue.timestart, ue.timeend $mintime = 'MIN(CASE WHEN (ue.timestart > :mintime) THEN ue.timestart ELSE ue.timecreated END)';
$maxtime = 'MAX(CASE WHEN (ue.timeend > :maxtime) THEN ue.timeend ELSE ue.timemodified END)';
// CONTRIB-3549
$sql = "SELECT ue.userid, ue.status,
$mintime AS mintime,
$maxtime AS maxtime
FROM {user_enrolments} ue FROM {user_enrolments} ue
JOIN {enrol} e ON e.id = ue.enrolid JOIN {enrol} e ON e.id = ue.enrolid
WHERE ue.userid $usql WHERE ue.userid $sql
AND e.status = :estatus AND e.status = :estatus
AND e.courseid = :courseid AND e.courseid = :courseid
GROUP BY ue.userid, ue.status, ue.timestart, ue.timeend"; GROUP BY ue.userid, ue.status";
$params = array_merge($uparams, array('estatus'=>ENROL_INSTANCE_ENABLED, 'courseid'=>$this->course->id)); $params += array('mintime'=>0, 'maxtime'=>0, 'estatus'=>ENROL_INSTANCE_ENABLED, 'courseid'=>$this->course->id);
$enrolmentsparams = $DB->get_records_sql($sql, $params); $enrolments = $DB->get_records_sql($sql, $params);
foreach ($users as $user) { foreach ($users as $user) {
$users[$user->id]->enrolmentstatus = $enrolmentsparams[$user->id]->status; $users[$user->id]->enrolmentstatus = $enrolments[$user->id]->status;
$users[$user->id]->enrolmentstart = $enrolmentsparams[$user->id]->timestart; $users[$user->id]->enrolmentstart = $enrolments[$user->id]->mintime;
$users[$user->id]->enrolmentend = $enrolmentsparams[$user->id]->timeend; $users[$user->id]->enrolmentend = $enrolments[$user->id]->maxtime;
} }
} }

Loading…
Cancel
Save