/** * Hierbei handelt es sich um eine Funktion, die über die URL nicht aufgerufen werden kann. * Stattdessen wird sie vom AutoController aufgerufen, wenn die Ferien automatisch importiert werden sollen * Dabei werden Daten, die bereits als Specialdate markiert sind, übersprungen. * * @author aloeser * @return void */ public function importVacations() { try { $importyear = date('Y') + 1; $sourceURL = 'http://www.schulferien.org/iCal/Ferien/icals/Ferien_Berlin_' . $importyear . '.ics'; $icalreader = new ICal($sourceURL); $events = $icalreader->events(); if ($events == array()) { //Die angegebene Datei existiert nicht throw new Exception(); } $tmpSpecialdates = $this->Specialdate->find('all', array('recursive' => -1, 'conditions' => array('Specialdate.date LIKE ' => $importyear . '-__-__'))); $specialdates = array(); foreach ($tmpSpecialdates as $tmpSpecialdate) { array_push($specialdates, $tmpSpecialdate['Specialdate']['date']); } foreach ($events as $event) { $timeBegin = $this->icalToUnixtime($event['DTSTART']); $timeEnd = $this->icalToUnixtime($event['DTEND']); $datetime = new Datetime(date('Y-m-d', $timeBegin)); for ($i = $timeBegin; $i <= $timeEnd; $i += DAY) { $dateString = $datetime->format('Y-m-d'); if (!in_array($dateString, $specialdates)) { //Datum existiert noch nicht if (!($datetime->format('N') >= 6)) { //Kein Wochenende -> Specialdate eintragen, um das Datum zu deaktivieren $this->Specialdate->create(); $this->Specialdate->save(array('Specialdate' => array('date' => $dateString))); } } else { //Datum existiert bereits } $datetime->modify("+1 day"); } } AutoController::saveLog('Ferienimport', 0, 'SpecialdatesController', 'importVacations'); } catch (Exception $e) { AutoController::saveLog('Ferienimport', 3, 'SpecialdatesController', 'importVacations'); } }
/** * Hierbei handelt es sich um eine Funktion, die über die URL nicht aufgerufen werden kann. * Stattdessen wird sie vom AutoController aufgerufen, wenn die automatisierten Plan-unvollständig-Rundmails verschickt werden sollen. * Diese Rundmails sind auf jeden Benutzer spezifisch zugeschnitten und enthalten nur Dienste, an denen der Benutzer auch einspringen könnte. * Benutzer, die in der nächsten Woche gar nicht einspringen könnten, würden dementsprechend gar keine Mail erhalten. * * @author jgraeger * @return void */ public function sendMissingShiftMails() { try { $firstDate = new DateTime('now'); $firstDate = $firstDate->modify("+" . (8 - date('N', time())) . " days"); $tmpColumns = $this->Column->find('all', array('recursive' => -1)); $columns = array(); foreach ($tmpColumns as $tmpColumn) { $columns[$tmpColumn['Column']['id']] = $tmpColumn['Column']['req_admin']; } $data = array(); //auf Deutsch umstellen setlocale(LC_TIME, 'de_DE@euro', 'de_DE', 'de', 'ge', 'de_DE.utf8'); for ($i = 0; $i < 7; $i++) { $currentDate = $firstDate->format("Y-m-d"); $missing = $this->Plan->getMissingShifts($currentDate); $data[$currentDate]["missing"] = $missing === array() ? null : $missing; $data[$currentDate]["dow"] = strftime('%A', strtotime($currentDate)); $data[$currentDate]["weekend"] = date('N', strtotime($currentDate)) >= 6; $data[$currentDate]["specialdate"] = $this->Specialdate->find("count", array("conditions" => array("Specialdate.date" => $currentDate))) === 1; $firstDate->modify("+1 day"); } $users = $this->User->find("all", array("recursive" => -1, "conditions" => array("User.mail != " => "", "User.leave_date" => null, 'User.admin != ' => 2))); $workableUsers = array(); foreach ($data as $date => $info) { //Tage, an denen nicht gearbeitet wird, werden ignoriert if ($info['weekend'] && !$info['specialdate'] || !$info['weekend'] && $info['specialdate']) { continue; } //Es handelt sich um ein Datum, an dem gearbeitet wird if (!isset($info['missing'])) { //Alle Dienste sind bereits belegt -> ignorieren continue; } //Es handelt sich um ein Datum, an dem noch Schichten fehlen foreach ($info['missing'] as $columnId => $shifts) { //Handelt es sich um eine Benutzerspalte/Textspalte? if ($shifts != null) { $missingShiftNumeric = 0; if (array_key_exists(1, $shifts)) { $missingShiftNumeric += 1; } if (array_key_exists(2, $shifts)) { $missingShiftNumeric += 2; } } else { //Textspalte $missingShiftNumeric = -1; } foreach ($users as $user) { //Falls Adminrechte benötigt werden, muss der Nutzer diese auch besitzen, sonst weiter if ($columns[$columnId] == 1 && !$user['User']['admin']) { continue; } if ($missingShiftNumeric == -1) { $workableUsers[$user['User']['id']][$date][$columnId] = -1; } else { if ($info['weekend']) { //Zu Wochenenden wurden keine Arbeitszeiten gespeichert //-> Alle Mitarbeiter werden gewählt $workableUsers[$user['User']['id']][$date][$columnId] = $missingShiftNumeric; } else { if ($missingShiftNumeric == 3) { if ($user['User'][substr(strtolower($info['dow']), 0, 2)] != "N") { $workableUsers[$user['User']['id']][$date][$columnId] = 3; } } else { if ($missingShiftNumeric == 2) { if (in_array($user['User'][substr(strtolower($info['dow']), 0, 2)], array("2", "H", "G"))) { $workableUsers[$user['User']['id']][$date][$columnId] = 2; } } else { if ($missingShiftNumeric == 1) { if (in_array($user['User'][substr(strtolower($info['dow']), 0, 2)], array("1", "H", "G"))) { $workableUsers[$user['User']['id']][$date][$columnId] = 1; } } } } } } } } } $usersArray = array(); foreach ($users as $user) { $usersArray[$user['User']['id']] = $user['User']; } $halfshifts = array(-1 => '', 1 => 'Frühschicht ', 2 => 'Spätschicht '); foreach ($tmpColumns as $tmpColumn) { $columnsArray[$tmpColumn['Column']['id']]["name"] = $tmpColumn['Column']['name']; } $tmpCols = $this->Column->find('all', array('recursive' => -1, 'conditions' => array('obligated' => 1, 'type' => 2), 'order' => array('order' => 'ASC'))); $i = 1; foreach ($tmpCols as $tmpCol) { $columnsArray[$tmpCol['Column']['id']]['pos'] = $i++; } $senderMail = '*****@*****.**'; $senderName = 'Humboldt Cafeteria'; foreach ($workableUsers as $userid => $dates) { $mailContent = "Hallo " . $usersArray[$userid]['fname'] . " " . $usersArray[$userid]['lname'] . ",<br />"; $mailContent .= "leider sind zur Zeit noch nicht alle Dienste für die nächste Woche in der Humboldt-Cafeteria belegt.<br /><br />Es fehlen:<br />"; foreach ($dates as $date => $columns) { $mailContent .= "<br />"; $mailContent .= $data[$date]["dow"] . ", " . date('d. m. Y', strtotime($date)); $mailContent .= "<ul>"; foreach ($columns as $columnid => $halfshift) { if ($halfshift == 1 || $halfshift == 3) { $mailContent .= "<li>Frühschicht " . $columnsArray[$columnid]["name"] . "</li>"; } if ($halfshift == 2 || $halfshift == 3) { $mailContent .= "<li>Spätschicht " . $columnsArray[$columnid]["pos"] . "</li>"; } if ($halfshift == -1) { $mailContent .= "<li>" . $columnsArray[$columnid]["name"] . "</li>"; } } $mailContent .= "</ul>"; } $EMail = new CakeEmail(); $EMail->from(array($senderMail => $senderName)); $EMail->to($usersArray[$userid]['mail']); $EMail->subject("Humboldt-Cafeteria - nächste Woche unvollständig"); $EMail->config('web'); $EMail->template('default'); $EMail->emailFormat('html'); $EMail->viewVars(array('senderName' => $senderName, 'senderMail' => $senderMail, 'content' => $mailContent, 'subject' => "Humboldt-Cafeteria - nächste Woche unvollständig", 'allowReply' => false)); $EMail->send(); } AutoController::saveLog('Plan-unvollständig-Mail', 0, 'PlanController', 'sendMissingShiftMails'); } catch (Exception $e) { AutoController::saveLog('Plan-unvollständig-Mail', 3, 'PlanController', 'sendMissingShiftMails'); } }
/** * Übernimmt die manuelle Ausführung der durch die Parameter angegebenen Methode. * Dafür wird die Konstante ROOT_PERMISSION als true definiert. Dies ist notwendig, um die Funktion überhaupt ausführen zu dürfen. * So kann ein direktes Aufrufen über die URL verhindert werden. * * doTask() loggt Fehler, wenn der Controller oder die Funktion nicht gefunden wurde. * Es übernimmt NICHT das Loggen, ob die aufgerufene Methode fehlerfrei durchlaufen wurde. * Diese Verantwortung liegt bei der Methode selbst. * * @param controller - der Name des Controller, der die Funktion enthält * @param action - der Name der Funktion * @param description - der Name der ausgeführten Aktion * @author aloeser * @return void */ private function doTask($controllerName, $actionName, $description) { $cfgDebug = Configure::read('debug'); if (App::import('Controller', str_replace('Controller', '', $controllerName))) { $controller = new $controllerName(); if (method_exists($controller, $actionName)) { define('ROOT_PERMISSION', true); Configure::write('debug', 0); if (call_user_func(array($controller, $actionName))) { //alles hat funktioniert //muss von der aufgerufenen Methode selbst geloggt werden } else { //ein programminterner Fehler ist aufgetreten //muss von der aufgerufenen Methode selbst geloggt werden } } else { //der angegebene Controller besitzt die angegebene Methode nicht AutoController::saveLog($description, 2, $controllerName, $actionName); } } else { //der angegebene Controller wurde nicht gefunden AutoController::saveLog($description, 1, $controllerName, $actionName); } Configure::write('debug', $cfgDebug); }