|
|
|
@ -2999,7 +2999,8 @@ class UserManager |
|
|
|
|
$user_id, |
|
|
|
|
$is_time_over = true, |
|
|
|
|
$ignore_visibility_for_admins = false, |
|
|
|
|
$ignoreTimeLimit = false |
|
|
|
|
$ignoreTimeLimit = false, |
|
|
|
|
$getCount = false |
|
|
|
|
) { |
|
|
|
|
if ($user_id != strval(intval($user_id))) { |
|
|
|
|
return []; |
|
|
|
@ -3017,20 +3018,27 @@ class UserManager |
|
|
|
|
// LEFT JOIN is used for session_rel_course_rel_user because an inner |
|
|
|
|
// join would not catch session-courses where the user is general |
|
|
|
|
// session coach but which do not have students nor coaches registered |
|
|
|
|
$dql = "SELECT DISTINCT |
|
|
|
|
s.id, |
|
|
|
|
s.name, |
|
|
|
|
s.accessStartDate AS access_start_date, |
|
|
|
|
s.accessEndDate AS access_end_date, |
|
|
|
|
s.duration, |
|
|
|
|
sc.id AS session_category_id, |
|
|
|
|
sc.name AS session_category_name, |
|
|
|
|
sc.dateStart AS session_category_date_start, |
|
|
|
|
sc.dateEnd AS session_category_date_end, |
|
|
|
|
s.coachAccessStartDate AS coach_access_start_date, |
|
|
|
|
s.coachAccessEndDate AS coach_access_end_date, |
|
|
|
|
CASE WHEN s.accessEndDate IS NULL THEN 1 ELSE 0 END HIDDEN _isFieldNull |
|
|
|
|
$position |
|
|
|
|
$dqlSelect = " COUNT(DISTINCT s.id) "; |
|
|
|
|
|
|
|
|
|
if (!$getCount) { |
|
|
|
|
$dqlSelect = " DISTINCT |
|
|
|
|
s.id, |
|
|
|
|
s.name, |
|
|
|
|
s.accessStartDate AS access_start_date, |
|
|
|
|
s.accessEndDate AS access_end_date, |
|
|
|
|
s.duration, |
|
|
|
|
sc.id AS session_category_id, |
|
|
|
|
sc.name AS session_category_name, |
|
|
|
|
sc.dateStart AS session_category_date_start, |
|
|
|
|
sc.dateEnd AS session_category_date_end, |
|
|
|
|
s.coachAccessStartDate AS coach_access_start_date, |
|
|
|
|
s.coachAccessEndDate AS coach_access_end_date, |
|
|
|
|
CASE WHEN s.accessEndDate IS NULL THEN 1 ELSE 0 END HIDDEN _isFieldNull |
|
|
|
|
$position |
|
|
|
|
"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$dql = "SELECT $dqlSelect |
|
|
|
|
FROM ChamiloCoreBundle:Session AS s |
|
|
|
|
LEFT JOIN ChamiloCoreBundle:SessionRelCourseRelUser AS scu WITH scu.session = s |
|
|
|
|
INNER JOIN ChamiloCoreBundle:AccessUrlRelSession AS url WITH url.sessionId = s.id |
|
|
|
@ -3095,6 +3103,10 @@ class UserManager |
|
|
|
|
) |
|
|
|
|
; |
|
|
|
|
|
|
|
|
|
if ($getCount) { |
|
|
|
|
return $dqlStudent->getSingleScalarResult() + $dqlCoach->getSingleScalarResult(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$sessionDataStudent = $dqlStudent->getResult(); |
|
|
|
|
$sessionDataCoach = $dqlCoach->getResult(); |
|
|
|
|
|
|
|
|
@ -3245,6 +3257,7 @@ class UserManager |
|
|
|
|
'courses' => $courseList, |
|
|
|
|
'collapsed' => $collapsed, |
|
|
|
|
'collapsable_link' => $collapsedAction, |
|
|
|
|
'duration' => $row['duration'], |
|
|
|
|
]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -6557,4 +6570,173 @@ SQL; |
|
|
|
|
|
|
|
|
|
return $url; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @param array $userInfo |
|
|
|
|
* @param int $searchYear |
|
|
|
|
* |
|
|
|
|
* @throws Exception |
|
|
|
|
* |
|
|
|
|
* @return array |
|
|
|
|
*/ |
|
|
|
|
public static function getSubscribedSessionsByYear(array $userInfo, $searchYear) |
|
|
|
|
{ |
|
|
|
|
$timezone = new DateTimeZone(api_get_timezone()); |
|
|
|
|
|
|
|
|
|
if (DRH == $userInfo['status']) { |
|
|
|
|
$sessions = SessionManager::get_sessions_followed_by_drh($userInfo['id']); |
|
|
|
|
|
|
|
|
|
$sessions = array_map( |
|
|
|
|
function ($sessionInfo) { |
|
|
|
|
$sessionInfo['session_id'] = $sessionInfo['id']; |
|
|
|
|
$sessionInfo['session_name'] = $sessionInfo['name']; |
|
|
|
|
|
|
|
|
|
return $sessionInfo; |
|
|
|
|
}, |
|
|
|
|
$sessions |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
$sessionsByCategory = ['' => $sessions]; |
|
|
|
|
} else { |
|
|
|
|
$sessionsByCategory = self::get_sessions_by_category($userInfo['id'], false, true, true); |
|
|
|
|
$sessionsByCategory = array_column($sessionsByCategory, 'sessions'); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$sessionsList = []; |
|
|
|
|
|
|
|
|
|
foreach ($sessionsByCategory as $categorySessions) { |
|
|
|
|
foreach ($categorySessions as $sessionInfo) { |
|
|
|
|
if (!empty($sessionInfo['duration'])) { |
|
|
|
|
$courseAccess = CourseManager::getFirstCourseAccessPerSessionAndUser( |
|
|
|
|
$sessionInfo['session_id'], |
|
|
|
|
$userInfo['id'] |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
if (empty($courseAccess)) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$firstAcessDate = new DateTime(api_get_local_time($courseAccess['login_course_date']), $timezone); |
|
|
|
|
$lastAccessDate = clone $firstAcessDate; |
|
|
|
|
$lastAccessDate->modify("+{$sessionInfo['duration']} days"); |
|
|
|
|
|
|
|
|
|
$firstAccessYear = (int) $firstAcessDate->format('Y'); |
|
|
|
|
$lastAccessYear = (int) $lastAccessDate->format('Y'); |
|
|
|
|
|
|
|
|
|
if ($firstAccessYear <= $searchYear && $lastAccessYear >= $searchYear) { |
|
|
|
|
$sessionsList[$sessionInfo['session_id']] = [ |
|
|
|
|
'name' => $sessionInfo['session_name'], |
|
|
|
|
'access_start_date' => $firstAcessDate->format('Y-m-d h:i:s'), |
|
|
|
|
'access_end_date' => $lastAccessDate->format('Y-m-d h:i:s'), |
|
|
|
|
]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$accessStartDate = !empty($sessionInfo['access_start_date']) |
|
|
|
|
? new DateTime(api_get_local_time($sessionInfo['access_start_date']), $timezone) |
|
|
|
|
: null; |
|
|
|
|
$accessEndDate = !empty($sessionInfo['access_end_date']) |
|
|
|
|
? new DateTime(api_get_local_time($sessionInfo['access_end_date']), $timezone) |
|
|
|
|
: null; |
|
|
|
|
$accessStartYear = $accessStartDate ? (int) $accessStartDate->format('Y') : 0; |
|
|
|
|
$accessEndYear = $accessEndDate ? (int) $accessEndDate->format('Y') : 0; |
|
|
|
|
|
|
|
|
|
$isValid = false; |
|
|
|
|
|
|
|
|
|
if ($accessStartYear && $accessEndYear) { |
|
|
|
|
if ($accessStartYear <= $searchYear && $accessEndYear >= $searchYear) { |
|
|
|
|
$isValid = true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ($accessStartYear && !$accessEndYear) { |
|
|
|
|
if ($accessStartYear == $searchYear) { |
|
|
|
|
$isValid = true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!$accessStartYear && $accessEndYear) { |
|
|
|
|
if ($accessEndYear == $searchYear) { |
|
|
|
|
$isValid = true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ($isValid) { |
|
|
|
|
$sessionsList[$sessionInfo['session_id']] = [ |
|
|
|
|
'name' => $sessionInfo['session_name'], |
|
|
|
|
'access_start_date' => $accessStartDate ? $accessStartDate->format('Y-m-d h:i:s') : null, |
|
|
|
|
'access_end_date' => $accessEndDate ? $accessEndDate->format('Y-m-d h:i:s') : null, |
|
|
|
|
]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return $sessionsList; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Get sessions info for planification calendar. |
|
|
|
|
* |
|
|
|
|
* @param array $sessionsList Session list from UserManager::getSubscribedSessionsByYear |
|
|
|
|
* @param int $searchYear |
|
|
|
|
* |
|
|
|
|
* @throws Exception |
|
|
|
|
* |
|
|
|
|
* @return array |
|
|
|
|
*/ |
|
|
|
|
public static function getSessionsCalendarByYear(array $sessionsList, $searchYear) |
|
|
|
|
{ |
|
|
|
|
$timezone = new DateTimeZone(api_get_timezone()); |
|
|
|
|
$calendar = []; |
|
|
|
|
|
|
|
|
|
foreach ($sessionsList as $sessionId => $sessionInfo) { |
|
|
|
|
$startDate = $sessionInfo['access_start_date'] |
|
|
|
|
? new DateTime(api_get_local_time($sessionInfo['access_start_date']), $timezone) |
|
|
|
|
: null; |
|
|
|
|
$endDate = $sessionInfo['access_end_date'] |
|
|
|
|
? new DateTime(api_get_local_time($sessionInfo['access_end_date']), $timezone) |
|
|
|
|
: null; |
|
|
|
|
|
|
|
|
|
$startYear = $startDate ? (int) $startDate->format('Y') : 0; |
|
|
|
|
$startWeekYear = $startDate ? (int) $startDate->format('o') : 0; |
|
|
|
|
$startWeek = $startDate ? (int) $startDate->format('W') : 0; |
|
|
|
|
$endYear = $endDate ? (int) $endDate->format('Y') : 0; |
|
|
|
|
$endWeekYear = $endDate ? (int) $endDate->format('o') : 0; |
|
|
|
|
$endWeek = $endDate ? (int) $endDate->format('W') : 0; |
|
|
|
|
|
|
|
|
|
$start = $startWeekYear < $searchYear ? 0 : $startWeek - 1; |
|
|
|
|
$duration = $endWeekYear > $searchYear ? 52 - $start : $endWeek - $start; |
|
|
|
|
|
|
|
|
|
$calendar[] = [ |
|
|
|
|
'id' => $sessionId, |
|
|
|
|
'name' => $sessionInfo['name'], |
|
|
|
|
'human_date' => SessionManager::convertSessionDateToString($startDate, $endDate, false, true), |
|
|
|
|
'start_in_last_year' => $startYear < $searchYear, |
|
|
|
|
'end_in_next_year' => $endYear > $searchYear, |
|
|
|
|
'no_start' => !$startWeek, |
|
|
|
|
'no_end' => !$endWeek, |
|
|
|
|
'start' => $start, |
|
|
|
|
'duration' => $duration > 0 ? $duration : 1, |
|
|
|
|
]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
usort( |
|
|
|
|
$calendar, |
|
|
|
|
function ($sA, $sB) { |
|
|
|
|
if ($sA['start'] == $sB['start']) { |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ($sA['start'] < $sB['start']) { |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
return $calendar; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|