/** * Find users who have completed this criteria and mark them accordingly */ public function cron() { global $DB; // Get all users who meet this criteria $sql = ' SELECT DISTINCT c.id AS course, cr.id AS criteriaid, ra.userid AS userid, mc.timemodified AS timecompleted FROM {course_completion_criteria} cr INNER JOIN {course} c ON cr.course = c.id INNER JOIN {context} con ON con.instanceid = c.id INNER JOIN {role_assignments} ra ON ra.contextid = con.id INNER JOIN {course_modules_completion} mc ON mc.coursemoduleid = cr.moduleinstance AND mc.userid = ra.userid LEFT JOIN {course_completion_crit_compl} cc ON cc.criteriaid = cr.id AND cc.userid = ra.userid WHERE cr.criteriatype = ' . COMPLETION_CRITERIA_TYPE_ACTIVITY . ' AND con.contextlevel = ' . CONTEXT_COURSE . ' AND c.enablecompletion = 1 AND cc.id IS NULL AND ( mc.completionstate = ' . COMPLETION_COMPLETE . ' OR mc.completionstate = ' . COMPLETION_COMPLETE_PASS . ' ) '; // Loop through completions, and mark as complete $rs = $DB->get_recordset_sql($sql); foreach ($rs as $record) { $completion = new completion_criteria_completion((array) $record, DATA_OBJECT_FETCH_BY_KEY); $completion->mark_complete($record->timecompleted); } $rs->close(); }
/** * Find user's who have completed this criteria * @access public * @return void */ public function cron() { global $DB; // Get all users who meet this criteria $sql = "\n SELECT DISTINCT\n c.id AS course,\n cr.id AS criteriaid,\n ra.userid AS userid,\n cc.timecompleted AS timecompleted\n FROM\n {course_completion_criteria} cr\n INNER JOIN\n {course} c\n ON cr.course = c.id\n INNER JOIN\n {context} con\n ON con.instanceid = c.id\n INNER JOIN\n {role_assignments} ra\n ON ra.contextid = con.id\n INNER JOIN\n {course_completions} cc\n ON cc.course = cr.courseinstance\n AND cc.userid = ra.userid\n LEFT JOIN\n {course_completion_crit_compl} ccc\n ON ccc.criteriaid = cr.id\n AND ccc.userid = ra.userid\n WHERE\n cr.criteriatype = " . COMPLETION_CRITERIA_TYPE_COURSE . "\n AND con.contextlevel = " . CONTEXT_COURSE . "\n AND c.enablecompletion = 1\n AND ccc.id IS NULL\n AND cc.timecompleted IS NOT NULL\n "; // Loop through completions, and mark as complete $rs = $DB->get_recordset_sql($sql); foreach ($rs as $record) { $completion = new completion_criteria_completion((array) $record); $completion->mark_complete($record->timecompleted); } $rs->close(); }
/** * Find user's who have completed this criteria */ public function cron() { global $DB; /* * Get all users who match meet this criteria * * We can safely ignore duplicate enrolments for * a user in a course here as we only care if * one of the enrolments has passed the set * duration. */ $sql = ' SELECT c.id AS course, cr.id AS criteriaid, u.id AS userid, ue.timestart AS otimestart, (ue.timestart + cr.enrolperiod) AS ctimestart, ue.timecreated AS otimeenrolled, (ue.timecreated + cr.enrolperiod) AS ctimeenrolled FROM {user} u INNER JOIN {user_enrolments} ue ON ue.userid = u.id INNER JOIN {enrol} e ON e.id = ue.enrolid INNER JOIN {course} c ON c.id = e.courseid INNER JOIN {course_completion_criteria} cr ON c.id = cr.course LEFT JOIN {course_completion_crit_compl} cc ON cc.criteriaid = cr.id AND cc.userid = u.id WHERE cr.criteriatype = ' . COMPLETION_CRITERIA_TYPE_DURATION . ' AND c.enablecompletion = 1 AND cc.id IS NULL AND ( ue.timestart > 0 AND ue.timestart + cr.enrolperiod < ? OR ue.timecreated > 0 AND ue.timecreated + cr.enrolperiod < ? ) '; // Loop through completions, and mark as complete $now = time(); $rs = $DB->get_recordset_sql($sql, array($now, $now)); foreach ($rs as $record) { $completion = new completion_criteria_completion((array) $record, DATA_OBJECT_FETCH_BY_KEY); // Use time start if not 0, otherwise use timeenrolled if ($record->otimestart) { $completion->mark_complete($record->ctimestart); } else { $completion->mark_complete($record->ctimeenrolled); } } $rs->close(); }
/** * Find user's who have completed this criteria */ public function cron() { global $DB; // Get all users who match meet this criteria $sql = ' SELECT DISTINCT c.id AS course, cr.timeend AS timeend, cr.id AS criteriaid, ra.userid AS userid FROM {course_completion_criteria} cr INNER JOIN {course} c ON cr.course = c.id INNER JOIN {context} con ON con.instanceid = c.id INNER JOIN {role_assignments} ra ON ra.contextid = con.id LEFT JOIN {course_completion_crit_compl} cc ON cc.criteriaid = cr.id AND cc.userid = ra.userid WHERE cr.criteriatype = ' . COMPLETION_CRITERIA_TYPE_DATE . ' AND con.contextlevel = ' . CONTEXT_COURSE . ' AND c.enablecompletion = 1 AND cc.id IS NULL AND cr.timeend < ? '; // Loop through completions, and mark as complete $rs = $DB->get_recordset_sql($sql, array(time())); foreach ($rs as $record) { $completion = new completion_criteria_completion((array) $record); $completion->mark_complete($record->timeend); } $rs->close(); }
/** * Find user's who have completed this criteria */ public function cron() { global $DB; // Get all users who meet this criteria $sql = ' SELECT DISTINCT c.id AS course, cr.id AS criteriaid, ra.userid AS userid, gg.finalgrade AS gradefinal, gg.timemodified AS timecompleted FROM {course_completion_criteria} cr INNER JOIN {course} c ON cr.course = c.id INNER JOIN {context} con ON con.instanceid = c.id INNER JOIN {role_assignments} ra ON ra.contextid = con.id INNER JOIN {grade_items} gi ON gi.courseid = c.id AND gi.itemtype = \'course\' INNER JOIN {grade_grades} gg ON gg.itemid = gi.id AND gg.userid = ra.userid LEFT JOIN {course_completion_crit_compl} cc ON cc.criteriaid = cr.id AND cc.userid = ra.userid WHERE cr.criteriatype = ' . COMPLETION_CRITERIA_TYPE_GRADE . ' AND con.contextlevel = ' . CONTEXT_COURSE . ' AND c.enablecompletion = 1 AND cc.id IS NULL AND gg.finalgrade >= cr.gradepass '; // Loop through completions, and mark as complete $rs = $DB->get_recordset_sql($sql); foreach ($rs as $record) { $completion = new completion_criteria_completion((array) $record, DATA_OBJECT_FETCH_BY_KEY); $completion->mark_complete($record->timecompleted); } $rs->close(); }