Ejemplo n.º 1
0
 /**
  * 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');
     }
 }
Ejemplo n.º 2
0
    define('WWW_ROOT', dirname(__FILE__) . DS . "app" . DS . "webroot");
}
// for built-in server
if (php_sapi_name() === 'cli-server') {
    if ($_SERVER['REQUEST_URI'] !== '/' && file_exists(WWW_ROOT . $_SERVER['PHP_SELF'])) {
        return false;
    }
    $_SERVER['PHP_SELF'] = '/' . basename(__FILE__);
}
if (!defined('CAKE_CORE_INCLUDE_PATH')) {
    if (function_exists('ini_set')) {
        ini_set('include_path', ROOT . DS . 'lib' . PATH_SEPARATOR . ini_get('include_path'));
    }
    if (!(include 'Cake' . DS . 'bootstrap.php')) {
        $failed = true;
    }
} else {
    if (!(include CAKE_CORE_INCLUDE_PATH . DS . 'Cake' . DS . 'bootstrap.php')) {
        $failed = true;
    }
}
if (!empty($failed)) {
    trigger_error("CakePHP core could not be found. Check the value of CAKE_CORE_INCLUDE_PATH in APP/webroot/index.php. It should point to the directory containing your " . DS . "cake core directory and your " . DS . "vendors root directory.", E_USER_ERROR);
}
echo "\nincluding AutoController ...";
require_once 'app/Controller/AutoController.php';
echo "\ncreating AutoController ...";
$autoController = new AutoController();
echo "\nsending mails ...\n";
$autoController->index('PlanController', 'sendMissingShiftMails', 'Plan-unvollständig-Mail');
exit;
Ejemplo n.º 3
0
 /**
  * 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');
     }
 }
Ejemplo n.º 4
0
 /**
  * Ü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);
 }
Ejemplo n.º 5
0
 /**
  * Starts a controller of application.
  *
  * @param String $ControllerModule the module path of the controller, e.g control.main
  * @return true on successful controller call, false otherwise
  */
 function StartController($ControllerModule)
 {
     #FIXME: where empty string is found in parts, it should be replaced with main
     //Loading controller file
     try {
         jf::import($ControllerModule);
         $Classname = $this->ControllerClass($ControllerModule);
     } catch (ImportException $e) {
         $Classname = "";
         //looking for a catch controller on a parent folder
         $CatchControllerModule = $this->GetIterativeCatchController($ControllerModule);
         try {
             $LoadStatus = jf::import($CatchControllerModule);
             $Classname = $this->ControllerClass($CatchControllerModule);
         } catch (ImportException $e) {
             if (Controller::$AutoPresent) {
                 $Parts = explode("/", $ControllerModule);
                 // 					$x=array_shift($Parts);
                 // 					if ($x=="jf")
                 // 						array_unshift($Parts,"jf");
                 $ViewModule = implode("/", $Parts);
                 $control = new AutoController();
                 if ($control->Start($ViewModule)) {
                     return true;
                 }
             }
         }
     }
     if (class_exists($Classname)) {
         $control = new $Classname();
         return $control->Start();
     }
     return false;
 }