123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- <?php
- /* For licensing terms, see /license.txt */
- /**
- * Create course sessions procedure. It creates sessions for courses that haven't it yet.
- * If today is greater than OFFSET, it will create them also for the next quarter
- * @package chamilo.cron
- * @author Imanol Losada <imanol.losada@beeznest.com>
- */
- /**
- * Initialization
- */
- if (php_sapi_name() != 'cli') {
- exit; //do not run from browser
- }
- require_once __DIR__ . "/../inc/global.inc.php";
- // First day of the current month to create sessions and add courses for the next month (e.g. "07")
- define("OFFSET", "15");
- /**
- * If no $initialDate is supplied, returns an array with the first and last days of the current
- * month. Otherwise, returns an array with the first and last days of the $initialDate month .
- * @param array $initialDate First day of the month
- * @return array First and last days of the month
- */
- function getMonthFirstAndLastDates($initialDate = null)
- {
- $startDate = $initialDate ? $initialDate : date("Y-m-01");
- $nextMonthStartDate = date("Y-m-d", api_strtotime($startDate." + 1 month"));
- $endDate = date("Y-m-d", api_strtotime($nextMonthStartDate." - 1 minute"));
- return array('startDate' => $startDate, 'endDate' => $endDate);
- }
- /**
- * Same as month, but for quarters
- * @param array $initialDate First day of the quarter
- * @return array First and last days of the quarter
- */
- function getQuarterFirstAndLastDates($initialDate = null)
- {
- $startDate = $initialDate ? $initialDate : date("Y-m-01");
- $month = getQuarterFirstMonth(getQuarter(date('m', $startDate)));
- $startDate = substr($startDate, 0, 5) . $month . '-01';
- $nextQuarterStartDate = date('Y-m-d', api_strtotime($startDate.' + 3 month'));
- $endDate = date('Y-m-d', api_strtotime($nextQuarterStartDate.' - 1 minute'));
- return array('startDate' => $startDate, 'endDate' => $endDate);
- }
- /**
- * Returns a quarter from a month
- * @param string The month (digit), with or without leading 0
- * @param string $month
- * @return int The yearly quarter (1, 2, 3 or 4) in which this month lies
- */
- function getQuarter($month)
- {
- $quarter = 1;
- // Remove the leading 0 if any
- if (substr($month, 0, 1) == '0') {
- $month = substr($month, 1);
- }
- // reduce to 4 quarters: 1..3=1; 4..6=2
- switch ($month) {
- case 1:
- //no break
- case 2:
- //no break
- case 3:
- $quarter = 1;
- break;
- case 4:
- //no break
- case 5:
- //no break
- case 6:
- $quarter = 2;
- break;
- case 7:
- //no break
- case 8:
- //no break
- case 9:
- $quarter = 3;
- break;
- case 10:
- //no break
- case 11:
- //no break
- case 12:
- $quarter = 4;
- break;
- }
- return $quarter;
- }
- /**
- * Returns the first month of the quarter
- * @param int Quarter
- * @param integer $quarter
- * @return string Number of the month, with leading 0
- */
- function getQuarterFirstMonth($quarter)
- {
- switch ($quarter) {
- case 1:
- return '01';
- case 2:
- return '04';
- case 3:
- return '07';
- case 4:
- return '10';
- }
- return false;
- }
- /**
- * Get the quarter in Roman letters
- * @param int Quarter
- * @param integer $quarter
- * @return string Roman letters
- */
- function getQuarterRoman($quarter)
- {
- switch ($quarter) {
- case 1:
- return 'I';
- case 2:
- return 'II';
- case 3:
- return 'III';
- case 4:
- return 'IV';
- }
- }
- /**
- * Creates one session per course with $administratorId as the creator and
- * adds it to the session starting on $startDate and finishing on $endDate
- * @param array $courses Courses
- * @param int $administratorId Administrator id
- * @param date $startDate First day of the month
- * @param date $endDate Last day of the month
- * @return void
- */
- function createCourseSessions($courses, $administratorId, $startDate, $endDate)
- {
- echo "\n";
- echo $courses ?
- "Creating sessions and adding courses for the period between ".$startDate." and ".$endDate :
- "Every course is already in session for the period between ".$startDate." and ".$endDate;
- echo "\n=====================================================================================\n\n";
- // Loop through courses creating one session per each and adding them
- foreach ($courses as $course) {
- //$period = date("m/Y", api_strtotime($startDate));
- $month = date("m", api_strtotime($startDate));
- $year = date("Y", api_strtotime($startDate));
- $quarter = getQuarter($month);
- $quarter = getQuarterRoman($quarter);
- $period = $year . '-' . $quarter;
- $sessionName = '[' . $period . '] ' . $course['title'];
- $sessionId = SessionManager::create_session(
- $sessionName,
- $startDate,
- $endDate,
- null,
- null,
- null,
- null,
- $administratorId,
- 0,
- SESSION_INVISIBLE
- );
- SessionManager::add_courses_to_session($sessionId, array($course['id']));
- echo "Session '".$sessionName."' created.\nCourse '".$course['title']."' added.\n\n";
- }
- }
- // Starts the script
- echo "Starting process..." . PHP_EOL;
- // Get first active administrator
- $administrators = array_reverse(UserManager::get_all_administrators());
- $lastingAdministrators = count($administrators);
- while (!$administrators[$lastingAdministrators - 1]['active'] && $lastingAdministrators > 0) {
- $lastingAdministrators--;
- }
- if (!$lastingAdministrators) {
- echo "There are no active administrators. Process halted.\n";
- exit;
- }
- $administratorId = intval($administrators[$lastingAdministrators - 1]['user_id']);
- // Creates course sessions for the current month
- $dates = getQuarterFirstAndLastDates(date('Y-m-').'01');
- // Get courses that don't have any session
- $courses = CourseManager::getCoursesWithoutSession($dates['startDate'], $dates['endDate']);
- createCourseSessions($courses, $administratorId, $dates['startDate'], $dates['endDate']);
- // Creates course sessions for the following month
- $offsetDay = intval(substr($dates['endDate'], 8, 2)) - OFFSET;
- if (date("Y-m-d") >= date(substr($dates['endDate'], 0, 8) . $offsetDay)) {
- $dates = getQuarterFirstAndLastDates(date("Y-m-d", api_strtotime(date("Y-m-01")." + 3 month")));
- // Get courses that don't have any session the next month
- $courses = CourseManager::getCoursesWithoutSession($dates['startDate'], $dates['endDate']);
- createCourseSessions($courses, $administratorId, $dates['startDate'], $dates['endDate']);
- }
|