/**
 * 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;
}