diff --git a/application/controllers/jobs/ReihungstestJob.php b/application/controllers/jobs/ReihungstestJob.php index 7f952f96f..49b19e13b 100644 --- a/application/controllers/jobs/ReihungstestJob.php +++ b/application/controllers/jobs/ReihungstestJob.php @@ -315,77 +315,114 @@ class ReihungstestJob extends FHC_Controller } } - public function runRemindApplicantsOfPlacementTestJob() + /* + * Sends an email to all applicants of a placement test to remind them 3 working days before + * + * @param integer $degreeProgram. Kennzahl of Degree Program to check + * @param string $bcc. Optional. BCC-Mailadress to send the Mails to + * @param string $from. Optional. Sender-Mailadress shown to recipient + */ + public function remindApplicantsOfPlacementTest() { - // Get placement tests with testdate within 3 working days + $degreeProgram = $this->input->get('degreeprogram'); + $bcc = $this->input->get('bcc'); + $from = $this->input->get('from'); - // Check if today +3 days is working day - $todayPlus3 = date('Y-m-d', strtotime("+3 days")); - - if (getWorkingDays($todayPlus3, $todayPlus3) == 0) + // Encode Params + if ($bcc != '') { - // If not increase counting days till next working day - for ($i = 3; $i < 100; $i++) + $bcc = urldecode($bcc); + } + if ($from != '') + { + $from = urldecode($from); + } + + // Get placement tests with testdate within the next 2 weeks + $resultNextTestDates = $this->ReihungstestModel->getNextPlacementtests($degreeProgram, 14); + if (hasData($resultNextTestDates)) + { + $nextTestDates = $resultNextTestDates->retval; + $enddate = ''; + // Loop through the dates + foreach ($nextTestDates as $testDates) { - $dateToCheck = date('Y-m-d', strtotime("+".$i." days")); - if (getWorkingDays($dateToCheck, $dateToCheck) == 1) + $workingdays = 0; + $testsOndate = array(); + + // Deduct days till 3 working days are reached + for ($i = 1; ; $i++) { - $nextWorkingDay = $dateToCheck; - break; + if (isDateWorkingDay($testDates->datum, $i) === true) + { + $workingdays++; + } + if ($workingdays == 3) + { + $enddate = date("Y-m-d", strtotime("$testDates->datum -".$i." days")); + break; + } + else + { + continue; + } } - } - } - else - { - $nextWorkingDay = date('Y-m-d', strtotime("+3 days")); - } - // Check if a placement test happens on $nextWorkingDay - $result = $this->ReihungstestModel->getTestsOnDate($nextWorkingDay, 11000); + // If $enddate is today -> load all tests of $testDates->datum + if (date("Y-m-d", strtotime($enddate)) == date('Y-m-d')) + { + $resultTestsOnDate = $this->ReihungstestModel->getTestsOnDate($testDates->datum, $degreeProgram); - $testsOndate = array(); + if (hasData($resultTestsOnDate)) + { + $testsOndate = $resultTestsOnDate->retval; + } + elseif (isError($resultTestsOnDate)) + { + show_error($resultTestsOnDate->error); + } + } - if (hasData($result)) - { - $testsOndate = $result->retval; - } - elseif (isError($result)) - { - show_error($result->error); - } + if (!isEmptyArray($testsOndate)) + { + foreach ($testsOndate as $reihungstest) + { + // Loads applicants of a test + $applicants = $this->ReihungstestModel->getApplicantsOfPlacementTest($reihungstest->reihungstest_id); - $applicants_arr = array(); + if (hasData($applicants)) + { + $applicants_arr = $applicants->retval; + } + elseif (isError($applicants)) + { + show_error($applicants->error); + } - foreach ($testsOndate as $reihungstest) - { - // Loads applicants of a test - $applicants = $this->ReihungstestModel->getApplicantsOfPlacementTest($reihungstest->reihungstest_id); + foreach ($applicants_arr as $applicant) + { + $mailcontent_data_arr = array(); + $mailcontent_data_arr['anrede'] = $applicant->anrede; + $mailcontent_data_arr['nachname'] = $applicant->nachname; + $mailcontent_data_arr['vorname'] = $applicant->vorname; + $mailcontent_data_arr['rt_datum'] = date_format(date_create($reihungstest->datum), 'd.m.Y'); + $mailcontent_data_arr['rt_uhrzeit'] = date_format(date_create($reihungstest->uhrzeit), 'H:i'); + $mailcontent_data_arr['rt_raum'] = $applicant->planbezeichnung; + $mailcontent_data_arr['wegbeschreibung'] = $applicant->lageplan; - if (hasData($applicants)) - { - $applicants_arr = $applicants->retval; - } - elseif (isError($applicants)) - { - show_error($applicants->error); - } - - foreach ($applicants_arr as $applicant) - { - $mailcontent_data_arr = array(); - $mailcontent_data_arr['anrede'] = $applicant->anrede; - $mailcontent_data_arr['nachname'] = $applicant->nachname; - $mailcontent_data_arr['vorname'] = $applicant->vorname; - $mailcontent_data_arr['rt_datum'] = date_format(date_create($reihungstest->datum), 'd.m.Y'); - $mailcontent_data_arr['rt_uhrzeit'] = date_format(date_create($reihungstest->uhrzeit), 'H:i'); - $mailcontent_data_arr['rt_raum'] = $applicant->planbezeichnung; - $mailcontent_data_arr['wegbeschreibung'] = $applicant->lageplan; - - sendSanchoMail( - 'Sancho_RemindApplicantsOfTest', - $mailcontent_data_arr, - array($applicant->email,'kindlm@technikum-wien.at'), - 'Ihre Anmeldung zum Reihungstest - Reminder / Your registration for the placement test - Reminder'); + sendSanchoMail( + 'Sancho_RemindApplicantsOfTest', + $mailcontent_data_arr, + $applicant->email, + 'Ihre Anmeldung zum Reihungstest - Reminder / Your registration for the placement test - Reminder', + DEFAULT_SANCHO_HEADER_IMG, + DEFAULT_SANCHO_FOOTER_IMG, + $from, + '', + $bcc); + } + } + } } } } diff --git a/application/helpers/hlp_common_helper.php b/application/helpers/hlp_common_helper.php index 8213dc105..bc09cd32c 100644 --- a/application/helpers/hlp_common_helper.php +++ b/application/helpers/hlp_common_helper.php @@ -169,98 +169,58 @@ function isEmptyArray($array) } /** - * The function returns the number of business days between two dates and it skips the (static) holidays - * @param string $startDate Date (YYYY-MM-DD) to start counting from (included) - * @param string $endDate Date (YYYY-MM-DD) to end counting (included) - * @param array $dynamic_holidays Optional. Static holidays that have the same date every year are included automatically. - * You can give an array with dates (YYYY-MM-DD) that should be included furthermore - * @return integer Number of working days between $startDate and $endDate + * The function checks if a date is a working day (true) or a holiday (false) + * @param string $date Date (YYYY-MM-DD) to check if working day or holiday + * @param string $days Optional. Number of days to deduct from $date + * @return boolean True, if $date is a working day, false if not */ -function getWorkingDays($startDate, $endDate, $dynamic_holidays = array()) +function isDateWorkingDay($date, $days = null) { - //Get year of $startDate - $startYear = substr($startDate, 0, 4); - //Get year of $endDate - $endYear = substr($endDate, 0, 4); - - $datediff = $endYear - $startYear; + // Array of static Austrian holidays $austrian_holidays = array(); - for ($i = 0; $i <= $datediff; $i++) + //Get year of $resultDate + $startYear = substr($date, 0, 4); + + $austrian_holidays[] = $startYear.'-01-01'; // Neujahr + $austrian_holidays[] = $startYear.'-01-06'; // 3 Könige + $austrian_holidays[] = $startYear.'-05-01'; // Staatsfeiertag + $austrian_holidays[] = $startYear.'-08-15'; // Maria Himmelfahrt + $austrian_holidays[] = $startYear.'-10-26'; // Nationalfeiertag + $austrian_holidays[] = $startYear.'-11-01'; // Allerheiligen + $austrian_holidays[] = $startYear.'-12-08'; // Maria Empfängnis + $austrian_holidays[] = $startYear.'-12-25'; // Weihnachten + $austrian_holidays[] = $startYear.'-12-26'; // Stefanitag + + $ostersonntag = date("Y-m-d", easter_date($startYear)); + + //Ostermontag + $austrian_holidays[] = date("Y-m-d", strtotime($ostersonntag. "+ 1 days")); // Ostersonntag + 1 + + //Christi Himmelfahrt + $austrian_holidays[] = date("Y-m-d", strtotime($ostersonntag. "+ 39 days")); // Ostersonntag + 39 + + //Pfingstmontag + $austrian_holidays[] = date("Y-m-d", strtotime($ostersonntag. "+ 50 days")); // Ostersonntag + 50 + + //Fronleichnam + $austrian_holidays[] = date("Y-m-d", strtotime($ostersonntag. "+ 60 days")); // Ostersonntag + 60 + + if ($days != '') { - $austrian_holidays[] = $startYear.'-01-01'; // Neujahr - $austrian_holidays[] = $startYear.'-01-06'; // 3 Könige - $austrian_holidays[] = $startYear.'-05-01'; // Staatsfeiertag - $austrian_holidays[] = $startYear.'-08-15'; // Maria Himmelfahrt - $austrian_holidays[] = $startYear.'-10-26'; // Nationalfeiertag - $austrian_holidays[] = $startYear.'-11-01'; // Allerheiligen - $austrian_holidays[] = $startYear.'-12-08'; // Maria Empfängnis - $austrian_holidays[] = $startYear.'-12-25'; // Weihnachten - $austrian_holidays[] = $startYear.'-12-26'; // Stefanitag - $startYear++; + if (date("w", strtotime("$date -".$days." days")) == 0 + || date("w", strtotime("$date -".$days." days")) == 6 + || in_array(date("Y-m-d", strtotime("$date -".$days." days")), $austrian_holidays)) + return false; + else + return true; } - if (count($dynamic_holidays) > 0) + else { - $austrian_holidays = array_merge($austrian_holidays, $dynamic_holidays); + if (date("w", strtotime($date)) == 0 + || date("w", strtotime($date)) == 6 + || in_array(date("Y-m-d", strtotime($date)), $austrian_holidays)) + return false; + else + return true; } - // do strtotime calculations just once - $endDate = strtotime($endDate); - $startDate = strtotime($startDate); - - //The total number of days between the two dates. We compute the no. of seconds and divide it to 60*60*24 - //We add one to inlude both dates in the interval. - $days = ($endDate - $startDate) / 86400 + 1; - - $no_full_weeks = floor($days / 7); - $no_remaining_days = fmod($days, 7); - - //It will return 1 if it's Monday,.. ,7 for Sunday - $the_first_day_of_week = date("N", $startDate); - $the_last_day_of_week = date("N", $endDate); - - //---->The two can be equal in leap years when february has 29 days, the equal sign is added here - //In the first case the whole interval is within a week, in the second case the interval falls in two weeks. - if ($the_first_day_of_week <= $the_last_day_of_week) - { - if ($the_first_day_of_week <= 6 && 6 <= $the_last_day_of_week) $no_remaining_days--; - if ($the_first_day_of_week <= 7 && 7 <= $the_last_day_of_week) $no_remaining_days--; - } - else { - // (edit by Tokes to fix an edge case where the start day was a Sunday - // and the end day was NOT a Saturday) - - // the day of the week for start is later than the day of the week for end - if ($the_first_day_of_week == 7) { - // if the start date is a Sunday, then we definitely subtract 1 day - $no_remaining_days--; - - if ($the_last_day_of_week == 6) { - // if the end date is a Saturday, then we subtract another day - $no_remaining_days--; - } - } - else { - // the start date was a Saturday (or earlier), and the end date was (Mon..Fri) - // so we skip an entire weekend and subtract 2 days - $no_remaining_days -= 2; - } - } - - //The no. of business days is: (number of weeks between the two dates) * (5 working days) + the remainder - //---->february in none leap years gave a remainder of 0 but still calculated weekends between first and last day, this is one way to fix it - $workingDays = $no_full_weeks * 5; - if ($no_remaining_days > 0 ) - { - $workingDays += $no_remaining_days; - } - - //We subtract the holidays - foreach($austrian_holidays as $key=>$value) - { - $time_stamp=strtotime($value); - //If the holiday doesn't fall in weekend - if ($startDate <= $time_stamp && $time_stamp <= $endDate && date("N",$time_stamp) != 6 && date("N",$time_stamp) != 7) - $workingDays--; - } - - return $workingDays; } diff --git a/application/models/crm/Reihungstest_model.php b/application/models/crm/Reihungstest_model.php index 6102c2b5e..6068c246f 100644 --- a/application/models/crm/Reihungstest_model.php +++ b/application/models/crm/Reihungstest_model.php @@ -474,22 +474,23 @@ class Reihungstest_model extends DB_Model } /** - * Loads the date of the next placement test to the given degree program - * @param integer $studiengang_kz Kennzahl of degree program to load the next placement test date - * @return string Returns date of the next placement test + * Loads the dates of the next placement tests within $days days to the given degree program + * @param integer $studiengang_kz Kennzahl of degree program to load the next placement tests + * @param integer $days Number of days in the future to load + * @return string Returns dates of the next placement test */ - public function getNextPlacementtestDate($studiengang_kz) + public function getNextPlacementtests($studiengang_kz, $days) { $query = ' SELECT * FROM PUBLIC.tbl_reihungstest WHERE studiengang_kz = ? AND datum > now() + AND datum <= now() + interval ? ORDER BY datum ASC - LIMIT 1 '; - return $this->execQuery($query, array($studiengang_kz)); + return $this->execQuery($query, array($studiengang_kz, $days.' days')); } /**