/** * Similar to attendanceregister__get_tracked_users($rgister), but retrieves only * those tracked users whose online sessions need to be updated. * * @param object $register * @return array of users */ function attendanceregister__get_tracked_users_need_update($register) { global $DB; $trackedUsers = array(); // Get Context of each Tracked Course $thisCourse = attendanceregister__get_register_course($register); $trackedCoursedIds = attendanceregister__get_tracked_courses_ids($register, $thisCourse); foreach ($trackedCoursedIds as $courseId) { $context = context_course::instance($courseId); // Get SQL and params for users enrolled in course with ATTENDANCEREGISTER_CAPABILITY_TRACKED capability list($esql, $params) = get_enrolled_sql($context, ATTENDANCEREGISTER_CAPABILITY_TRACKED); // Query to retrieve users that satisfy all the following: // a) have ATTENDANCEREGISTER_CAPABILITY_TRACKED role in the tracked course // AND // b) whose last activity (lastaccess) on site is older than session timeout (in seconds) // AND one of the fiollowing: // c1) Have no online session in this register // c2) Have no calculated aggregate for this register // c3) Last log entry for the tracked course is newer than last recorded session in this register (stored in aggregate) $sql = "SELECT u.* FROM {user} u JOIN ({$esql}) je ON je.id = u.id\n WHERE u.lastaccess + (:sesstimeout * 60) < :now\n AND ( NOT EXISTS (SELECT * FROM {attendanceregister_session} as3\n WHERE as3.userid = u.id AND as3.register = :registerid1 AND as3.onlinesess = 1)\n OR NOT EXISTS (SELECT * FROM {attendanceregister_aggregate} aa4 WHERE aa4.userid=u.id AND aa4.register=:registerid2 AND aa4.grandtotal = 1 )\n OR EXISTS (SELECT * FROM {attendanceregister_aggregate} aa2, {logstore_standard_log} l2\n WHERE aa2.userid = u.id AND aa2.register = :registerid3 \n AND l2.courseid = :courseid AND l2.userid = aa2.userid \n AND aa2.grandtotal = 1\n AND l2.timecreated > aa2.lastsessionlogout) )"; // Append subquery parameters $params['sesstimeout'] = $register->sessiontimeout; $params['now'] = time(); $params['registerid1'] = $register->id; $params['registerid2'] = $register->id; $params['registerid3'] = $register->id; $params['courseid'] = $courseId; // Execute query $trackedUsersInCourse = $DB->get_records_sql($sql, $params); $trackedUsers = array_merge($trackedUsers, $trackedUsersInCourse); } // Users must be unique [issue #15] $uniqueTrackedUsers = attendanceregister__unique_object_array_by_id($trackedUsers); return $uniqueTrackedUsers; }
/** * Retrieve all Courses tracked by this Register * @param object $register * @return array of Course */ function attendanceregister_get_tracked_courses($register) { global $DB; $thisCourse = attendanceregister__get_register_course($register); $trackedCoursedIds = attendanceregister__get_tracked_courses_ids($register, $thisCourse); $trackedCourses = $DB->get_records_list('course', 'id', $trackedCoursedIds, 'sortorder ASC, fullname ASC'); return $trackedCourses; }