diff --git a/main/inc/lib/agenda.lib.php b/main/inc/lib/agenda.lib.php index 8bcc217046..e721627b27 100644 --- a/main/inc/lib/agenda.lib.php +++ b/main/inc/lib/agenda.lib.php @@ -4657,6 +4657,95 @@ class Agenda } } + /** + * @throws Exception + */ + private function convertSessionWithDuration(int $userId, array $sessionInfo, DateTime $start, DateTime $end): array + { + $courseAccess = CourseManager::getFirstCourseAccessPerSessionAndUser( + $sessionInfo['session_id'], + $userId + ); + + if (empty($courseAccess)) { + throw new Exception(); + } + + $firstAccessDate = new DateTime($courseAccess['login_course_date'], new DateTimeZone('UTC')); + $lastAccessDate = clone $firstAccessDate; + $lastAccessDate->modify('+'.$sessionInfo['duration'].' days'); + + if ($firstAccessDate->format('Y-m-d H:i:s') > $start + && $lastAccessDate->format('Y-m-d H:i:s') < $end + ) { + throw new Exception(); + } + + $courseList = SessionManager::get_course_list_by_session_id($sessionInfo['id']); + $firstCourse = current($courseList); + + return [ + 'id' => 'session_'.$sessionInfo['id'], + 'session_id' => $sessionInfo['id'], + 'title' => $sessionInfo['name'], + 'description' => $sessionInfo['show_description'] ? $sessionInfo['description'] : '', + 'className' => 'personal', + 'borderColor' => $this->event_personal_color, + 'backgroundColor' => $this->event_personal_color, + 'editable' => false, + 'sent_to' => get_lang('Me'), + 'type' => 'session', + 'start' => $firstAccessDate->format(DateTime::ISO8601), + 'start_date_localtime' => api_get_local_time($firstAccessDate), + 'end' => $lastAccessDate->format(DateTime::ISO8601), + 'end_date_localtime' => api_get_local_time($lastAccessDate), + 'allDay' => 0, + 'parent_event_id' => 0, + 'has_children' => 0, + 'course_url' => api_get_course_url($firstCourse['code'], $sessionInfo['id']), + ]; + } + + /** + * @throws Exception + */ + private function convertSessionWithDates(array $sessionInfo, DateTime $start, DateTime $end): array + { + if ($sessionInfo['display_start_date'] < $start + && $sessionInfo['display_end_date'] > $end + ) { + throw new Exception(); + } + + $courseList = SessionManager::get_course_list_by_session_id($sessionInfo['id']); + $firstCourse = current($courseList); + + return [ + 'id' => 'session_'.$sessionInfo['id'], + 'session_id' => $sessionInfo['id'], + 'title' => $sessionInfo['name'], + 'description' => $sessionInfo['show_description'] ? $sessionInfo['description'] : '', + 'className' => 'personal', + 'borderColor' => $this->event_personal_color, + 'backgroundColor' => $this->event_personal_color, + 'editable' => false, + 'sent_to' => get_lang('Me'), + 'type' => 'session_subscription', + 'start' => $sessionInfo['display_start_date'], + 'start_date_localtime' => $sessionInfo['display_start_date'] + ? $this->formatEventDate($sessionInfo['display_start_date']) + : '', + 'end' => $sessionInfo['display_end_date'], + 'end_date_localtime' => $sessionInfo['display_end_date'] + ? $this->formatEventDate($sessionInfo['display_end_date']) + : '', + 'allDay' => 0, + 'parent_event_id' => 0, + 'has_children' => 0, + 'course_url' => api_get_course_url($firstCourse['code'], $sessionInfo['id']), + ]; + } + private function loadSessionsAsEvents(int $start, int $end) { if (false === api_get_configuration_value('personal_calendar_show_sessions_occupation')) { @@ -4670,85 +4759,24 @@ class Agenda foreach ($sessionList as $sessionInfo) { if (!empty($sessionInfo['duration'])) { - $courseAccess = CourseManager::getFirstCourseAccessPerSessionAndUser( - $sessionInfo['session_id'], - $userInfo['id'] - ); - - if (empty($courseAccess)) { + try { + $this->events[] = $this->convertSessionWithDuration($userInfo['id'], $sessionInfo, $start, $end); + } catch (Exception $e) { continue; } - $firstAccessDate = new DateTime($courseAccess['login_course_date'], new DateTimeZone('UTC')); - $lastAccessDate = clone $firstAccessDate; - $lastAccessDate->modify('+'.$sessionInfo['duration'].' days'); - - if ($firstAccessDate->format('Y-m-d H:i:s') > $start - && $lastAccessDate->format('Y-m-d H:i:s') < $end - ) { - continue; - } - - $courseList = SessionManager::get_course_list_by_session_id($sessionInfo['id']); - $firstCourse = current($courseList); - - $this->events[] = [ - 'id' => 'session_'.$sessionInfo['id'], - 'session_id' => $sessionInfo['id'], - 'title' => $sessionInfo['name'], - 'description' => $sessionInfo['show_description'] ? $sessionInfo['description'] : '', - 'className' => 'personal', - 'borderColor' => $this->event_personal_color, - 'backgroundColor' => $this->event_personal_color, - 'editable' => false, - 'sent_to' => get_lang('Me'), - 'type' => 'session', - 'start' => $firstAccessDate->format(DateTime::ISO8601), - 'start_date_localtime' => api_get_local_time($firstAccessDate), - 'end' => $lastAccessDate->format(DateTime::ISO8601), - 'end_date_localtime' => api_get_local_time($lastAccessDate), - 'allDay' => 0, - 'parent_event_id' => 0, - 'has_children' => 0, - 'course_url' => api_get_course_url($firstCourse['code'], $sessionInfo['id']), - ]; - continue; } - if ($sessionInfo['display_start_date'] < $start - && $sessionInfo['display_end_date'] > $end - ) { + if (empty($sessionInfo['display_start_date']) || empty($sessionInfo['display_end_date'])) { continue; } - $courseList = SessionManager::get_course_list_by_session_id($sessionInfo['id']); - $firstCourse = current($courseList); - - $this->events[] = [ - 'id' => 'session_'.$sessionInfo['id'], - 'session_id' => $sessionInfo['id'], - 'title' => $sessionInfo['name'], - 'description' => $sessionInfo['show_description'] ? $sessionInfo['description'] : '', - 'className' => 'personal', - 'borderColor' => $this->event_personal_color, - 'backgroundColor' => $this->event_personal_color, - 'editable' => false, - 'sent_to' => get_lang('Me'), - 'type' => 'session_subscription', - 'start' => $sessionInfo['display_start_date'], - 'start_date_localtime' => $sessionInfo['display_start_date'] - ? $this->formatEventDate($sessionInfo['display_start_date']) - : '', - 'end' => $sessionInfo['display_end_date'], - 'end_date_localtime' => $sessionInfo['display_end_date'] - ? $this->formatEventDate($sessionInfo['display_end_date']) - : '', - 'allDay' => 0, - 'parent_event_id' => 0, - 'has_children' => 0, - 'course_url' => api_get_course_url($firstCourse['code'], $sessionInfo['id']), - ]; + try { + $this->events[] = $this->convertSessionWithDates($sessionInfo, $start, $end); + } catch (Exception $e) { + continue; + } } } }