Features: • Termin Typen wurden erweitert o IBN ESTMK (Kundensuche alles außer Xinon) o IBN Snopp (Kundensuche alles außer Xinon) o Störungen (Ticketsuche) Derzeit werden Ticket Informationen wie bei IBN (Betreff und Ort eingesetzt, wenn leer) bzw. die Beschreibung erhält den Ticket Link und das Subjekt des Tickets (Ticket Link derzeit nur im Outlook Anklickbar (offene Punkte Hyperlinks)) • Symbole der Termin Typen angepasst • Für Outlook werden für die verschiedenen Termintypen derzeit die Standard Kategorien in Deutsch hergenommen (Anfrage zwecks zentraler Kategorien läuft) o Gelbe Kategorie … IBN Xinon o Grüne Kategorie … IBN ESTMK o Lila Kategorie … IBN Snopp o Rote Kategorie … Störung • Filter wurden eingebaut o Es kann nun explizit nach Termintypen gefiltert werden o Es können auch Termintypen in Kombination gefiltert werden • Vorlagen können nun selbst erstellt und bearbeitet werden o Dynamische Felder Datum [&&date&&] … Startdatum des Termins Start [&&start&&] … Startuhrzeit des Termins Ende [&&end&&] … Enduhrzeit des Termins dyn. VM/NM [&&vmnm&&] … dynamisch vormittags oder nachmittags je nach Startzeit > 12:00 = nachmittags o Vorlagen sind jeweils für jeden IBN Termin Typ zu erstellen o Es darf nur 1ne Reminder Vorlage per Termintyp geben Bugfix: • Mehrfachanzeigebug vom gleichen Termin, wenn der Termin mehrfach in kurzer Zeit verschoben oder vergrößert/verkleinert wurde. • Tolltipps verschwinden jetzt nicht, wenn man direkt darauf fährt.
474 lines
17 KiB
PHP
474 lines
17 KiB
PHP
<?php
|
|
|
|
class CalendarController extends mfBaseController
|
|
{
|
|
|
|
protected function init()
|
|
{
|
|
$this->needlogin = true;
|
|
$me = new User();
|
|
$me->loadMe();
|
|
$this->me = $me;
|
|
$this->layout()->set("me", $me);
|
|
|
|
if (!$me->is(["Admin"])) {
|
|
$this->redirect("Dashboard");
|
|
}
|
|
}
|
|
|
|
protected function detailAction()
|
|
{
|
|
$this->layout()->setTemplate("Calendar/Detail");
|
|
}
|
|
|
|
protected function apiAction()
|
|
{
|
|
if (!$this->me->is(["Admin"])) {
|
|
$return = false;
|
|
}
|
|
$do = $this->request->do;
|
|
|
|
switch ($do) {
|
|
case "getCalendarEvents":
|
|
$r = $this->request;
|
|
$calendarEvents = CalendarModel::getCalendarEvents($this->me->id, 0, $r);
|
|
return $calendarEvents;
|
|
die();
|
|
case "getCalendarEvent":
|
|
$r = $this->request;
|
|
$id = ($r->id);
|
|
$calendarEvents = CalendarModel::getCalendarEvent($id);
|
|
return $calendarEvents;
|
|
die();
|
|
case "searchCalendarEvents" :
|
|
$r = $this->request;
|
|
$calendarEvents = CalendarModel::searchCalendarEvents($r);
|
|
return $calendarEvents;
|
|
die();
|
|
case "getCalendarEventAttachment" :
|
|
$r = $this->request;
|
|
$id = ($r->id);
|
|
$this->getCalendarAttachment($id);
|
|
die();
|
|
case "getCalendarEventAttachmentTmp" :
|
|
$r = $this->request;
|
|
$id = ($r->id);
|
|
$name = ($r->name);
|
|
$this->getCalendarAttachmentTmp($id, $name);
|
|
die();
|
|
case "updateCalendarEvent":
|
|
$r = $this->request;
|
|
$calendarEvents = CalendarModel::updateCalendarEvent($r, $this->me);
|
|
if ($r->customer_info_check) {
|
|
if ($r->customer_info_type == 1) {
|
|
$body = $r->customer_info_text;
|
|
$email = new Emailnotification();
|
|
$email->setSubject('Inbetriebnahme');
|
|
$email->setBody($body);
|
|
$email->setFrom('termin@xinon.at', 'Terminbestätigung');
|
|
$email->setTo($r->customer_info_type_text);
|
|
$email->send();
|
|
} else if ($r->customer_info_type == 2) {
|
|
$sms = new SmsNotification();
|
|
$body = "Xinon Terminbestätigung:" . PHP_EOL . $r->customer_info_text;
|
|
$sms->setBody($body);
|
|
$sms->setRecipient($r->customer_info_type_text);
|
|
$sms->send();
|
|
}
|
|
}
|
|
die();
|
|
|
|
case "updateCalendarEventState" :
|
|
$r = $this->request;
|
|
$calendarEvents = CalendarModel::updateCalendarEventState($r, $this->me);
|
|
die();
|
|
case "getAddress":
|
|
$r = $this->request;
|
|
$this->getAddress($r);
|
|
die();
|
|
case "getTicket";
|
|
$r = $this->request;
|
|
$this->getTicket($r);
|
|
die();
|
|
case "insertCalendarEvent":
|
|
$r = $this->request;
|
|
$calendarEvents = CalendarModel::insertCalendarEvent($r, $this->me);
|
|
if ($r->customer_info_check) {
|
|
if ($r->customer_info_type == 1) {
|
|
$body = $r->customer_info_text;
|
|
$email = new Emailnotification();
|
|
$email->setSubject('Technikertermin Xinon');
|
|
$email->setBody($body);
|
|
$email->setFrom('termin@xinon.at', 'Terminbestätigung');
|
|
$email->setTo($r->customer_info_type_text);
|
|
$email->send();
|
|
} else if ($r->customer_info_type == 2) {
|
|
$sms = new SmsNotification();
|
|
$body = "Xinon Terminbestätigung:" . PHP_EOL . $r->customer_info_text;
|
|
$sms->setBody($body);
|
|
$sms->setRecipient($r->customer_info_type_text);
|
|
$sms->send();
|
|
}
|
|
}
|
|
die();
|
|
case "deleteCalendarEvent":
|
|
$r = $this->request;
|
|
$id = ($r->id);
|
|
CalendarModel::deleteCalendarEvent($r);
|
|
die();
|
|
case "updateCalendarColor":
|
|
$r = $this->request;
|
|
$calendar_id = ($r->calendar_id);
|
|
$bgcolors = ($r->bgcolors);
|
|
$txtcolors = ($r->txtcolors);
|
|
$id = ($r->id);
|
|
$this->updateCalendarColor($id, $calendar_id, $bgcolors, $txtcolors);
|
|
die();
|
|
case "uploadCalendarEventAttachment":
|
|
$r = $this->request;
|
|
$filename = $_FILES['upload_file']['name'];
|
|
$filesize = $_FILES['upload_file']['size'];
|
|
$file_content = file_get_contents($_FILES['upload_file']['tmp_name']);
|
|
$filetype = $_FILES['upload_file']['type'];
|
|
$file_content = base64_encode($file_content);
|
|
$newkey = $r->newkey;
|
|
$id = CalendarModel::insertCalendarEventAttachmentTemp($filename, $filetype, $file_content, $filesize, $newkey);
|
|
if ($id) {
|
|
$json['success'] = true;
|
|
$json['id'] = $id;
|
|
}
|
|
$json = json_encode($json);
|
|
echo $json;
|
|
|
|
die();
|
|
case "deleteCalendarEventAttachmentTmp":
|
|
$r = $this->request;
|
|
$newkey = ($r->newkey);
|
|
$name = ($r->name);
|
|
CalendarModel::deleteCalendarEventAttachmentTemp($newkey, $name);
|
|
die();
|
|
default:
|
|
$return = false;
|
|
}
|
|
|
|
}
|
|
|
|
protected function encryptString($plainText, $password, $salt)
|
|
{
|
|
// Definiere den Algorithmus und die Länge des Initialisierungsvektors
|
|
$cipher = "aes-256-cbc";
|
|
$ivlen = openssl_cipher_iv_length($cipher);
|
|
|
|
// Generiere einen Initialisierungsvektor
|
|
$iv = openssl_random_pseudo_bytes($ivlen);
|
|
|
|
// Erzeuge einen Schlüssel aus dem Passwort und dem Salt
|
|
$key = hash_pbkdf2("sha256", $password, $salt, 1000, 32, true);
|
|
|
|
// Verschlüssele den String
|
|
$cipherText = openssl_encrypt($plainText, $cipher, $key, 0, $iv);
|
|
|
|
// Füge den IV an den verschlüsselten Text an, da dieser für die Entschlüsselung benötigt wird
|
|
$cipherText = base64_encode($iv . $cipherText);
|
|
|
|
return $cipherText;
|
|
}
|
|
|
|
protected function updateCalendarColor($id, $calendar_id, $bgcolors, $txtcolors)
|
|
{
|
|
$r = $this->request;
|
|
$groups = $r->groups;
|
|
|
|
|
|
$redis = new Redis();
|
|
//Connecting to Redis
|
|
$redis->connect('172.16.5.5', '6379');
|
|
//$redis->auth('password');
|
|
|
|
$Calendar = new Calendar($id);
|
|
|
|
foreach ($bgcolors as $key => $value) {
|
|
$colordata[$calendar_id[$key]]['bgcolor'] = $value;
|
|
$colordata[$calendar_id[$key]]['txtcolor'] = $txtcolors[$key];
|
|
}
|
|
|
|
|
|
$Calendar->colors = json_encode($colordata);
|
|
if ($groups) {
|
|
$Calendar->groups = $groups;
|
|
}
|
|
$redis->set('thetool_calendar_usercolors_' . $this->me->id, json_encode($colordata));
|
|
$Calendar->save();
|
|
die();
|
|
}
|
|
|
|
protected function viewAction()
|
|
{
|
|
$Calendar = CalendarModel::search(array("user_id" => $this->me->id));
|
|
$CalendarAll = CalendarModel::getAll();
|
|
$encryptedUser = $this->encryptString($this->me->id, "testpw", "testsalt");
|
|
$this->layout()->set("Calendar", $Calendar);
|
|
$this->layout()->set("CalendarAll", $CalendarAll);
|
|
$this->layout()->set("encryptedUser", $encryptedUser);
|
|
$timerecordingholidays = TimerecordingHolidayModel::getAll();
|
|
$this->layout()->set("timerecordingholidays", $timerecordingholidays);
|
|
$timerecordingemployees = TimerecordingEmployeeModel::getAll();
|
|
$standardCalendarColors = CalendarModel::$standardCalendarColors;
|
|
$specialCalendarColors = CalendarModel::$specialCalendarColors;
|
|
|
|
|
|
$this->layout()->set("timerecordingemployees", $timerecordingemployees);
|
|
$this->layout()->set("standardCalendarColors", $standardCalendarColors);
|
|
$this->layout()->set("specialCalendarColors", $specialCalendarColors);
|
|
$this->layout()->setTemplate("Calendar/View");
|
|
|
|
}
|
|
|
|
private function getCalendarAttachment($id)
|
|
{
|
|
$content = CalendarModel::getCalendarEventAttachment($id);
|
|
//
|
|
|
|
// header('Content-Type: application/octet-stream');
|
|
header('Content-Type: ' . $content['contentType']);
|
|
header('Content-disposition: attachment; filename="' . $content['name'] . '"');
|
|
echo base64_decode($content['content']);
|
|
exit;
|
|
}
|
|
|
|
private function getCalendarAttachmentTmp($id, $name)
|
|
{
|
|
$content = CalendarModel::getCalendarEventAttachmentTmp($id, $name);
|
|
//
|
|
|
|
// header('Content-Type: application/octet-stream');
|
|
header('Content-Type: ' . $content['contentType']);
|
|
header('Content-disposition: attachment; filename="' . $content['name'] . '"');
|
|
echo base64_decode($content['content']);
|
|
exit;
|
|
}
|
|
|
|
private function getAddress($r)
|
|
{
|
|
$xinon = $r->xinon;
|
|
$address = AddressModel::search(array("Controller!" => 'Calendar', "search_term!" => $r->term, "xinon" => $xinon), array('count' => '20'));
|
|
$mobiles = CalendarModel::$austrian_mobile_prefixes;
|
|
$prefixes = array('0043', '43 ', '43', '0');
|
|
foreach ($address as $key => $value) {
|
|
unset($mobilenumber);
|
|
$id = $value->id;
|
|
if ($value->company) {
|
|
$text = "(F) " . $value->company;
|
|
} else {
|
|
$text = "(P) " . $value->firstname . " " . $value->lastname;
|
|
}
|
|
|
|
if ($value->mobile) {
|
|
foreach ($mobiles as $mobile) {
|
|
foreach ($prefixes as $prefix) {
|
|
if (strpos($value->mobile, $prefix . $mobile) !== false) {
|
|
$mobilenumber = str_replace($prefix . $mobile, '+43' . $mobile, $value->mobile);
|
|
$found = 1;
|
|
break;
|
|
}
|
|
}
|
|
if ($found) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if ($value->phone) {
|
|
foreach ($mobiles as $mobile) {
|
|
foreach ($prefixes as $prefix) {
|
|
if (strpos($value->phone, $prefix . $mobile) !== false) {
|
|
$mobilenumber = str_replace($prefix . $mobile, '+43' . $mobile, $value->phone);
|
|
$found = 1;
|
|
break;
|
|
}
|
|
}
|
|
if ($found) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if ($mobilenumber) {
|
|
if (strlen($mobilenumber) > 0 && strlen($mobilenumber) < 22) {
|
|
$mobilenumber = str_replace(" ", "", $mobilenumber);
|
|
$mobilenumber = str_replace("(", "", $mobilenumber);
|
|
$mobilenumber = str_replace(")", "", $mobilenumber);
|
|
$mobilenumber = str_replace("-", "", $mobilenumber);
|
|
$mobilenumber = str_replace("/", "", $mobilenumber);
|
|
$mobilenumber = str_replace(".", "", $mobilenumber);
|
|
$mobilenumber = str_replace(",", "", $mobilenumber);
|
|
$mobilenumber = str_replace(";", "", $mobilenumber);
|
|
$mobilenumber = str_replace(":", "", $mobilenumber);
|
|
}
|
|
} else if ($value->mobile) {
|
|
$mobilenumber = $value->mobile;
|
|
} else if ($value->phone) {
|
|
$mobilenumber = $value->phone;
|
|
} else {
|
|
$mobilenumber = "";
|
|
}
|
|
$rows[] = array(
|
|
'id' => $id,
|
|
'text' => $value->customer_number . " " . $text . " - " . $value->street . ", " . $value->zip . " " . $value->city,
|
|
'mail' => $value->email,
|
|
'mobilenumber' => $mobilenumber,
|
|
'location' => $value->street . ", " . $value->zip . " " . $value->city,
|
|
'name' => $value->customer_number . " " . $text
|
|
);
|
|
}
|
|
|
|
$json['incomplete_results'] = false;
|
|
$json['total_count'] = count($rows);
|
|
$json['items'] = $rows;
|
|
$json = json_encode($json);
|
|
echo trim($json);
|
|
die();
|
|
}
|
|
private function getTicket($r)
|
|
{
|
|
|
|
$project = new XinonProject();
|
|
|
|
$data=$project->searchSupportTickets($r->term);
|
|
|
|
foreach ($data as $key => $value) {
|
|
$rows[] = array(
|
|
'id' => $value['id'],
|
|
'text' => 'Ticket: '.$value['id']." ".$value['subject'],
|
|
'subject' => $value['subject'],
|
|
'mail' => $value['customField5'],
|
|
'mobilenumber' => $value['customField4'],
|
|
'location' => $value['customField3'],
|
|
'name' => $value['customField2']
|
|
);
|
|
}
|
|
$json['incomplete_results'] = false;
|
|
$json['total_count'] = count($rows);
|
|
$json['items'] = $rows;
|
|
$json = json_encode($json);
|
|
echo trim($json);
|
|
|
|
die();
|
|
}
|
|
|
|
protected function indexAction()
|
|
{
|
|
$this->layout()->setTemplate("Calendar/Index");
|
|
$calendars = CalendarModel::getAll();
|
|
$calendarTemplateEventTypes = CalendarTemplateModel::$calendarTemplateEventTypes;
|
|
$this->layout()->set("calendarTemplateEventTypes", $calendarTemplateEventTypes);
|
|
$calendartemplates = CalendarTemplateModel::getAll();
|
|
$this->layout()->set("calendartemplates", $calendartemplates);
|
|
$this->layout()->set("calendars", $calendars);
|
|
}
|
|
|
|
protected function addAction()
|
|
{
|
|
$users = UserModel::getAll();
|
|
$this->layout()->set("users", $users);
|
|
$this->layout()->setTemplate("Calendar/Form");
|
|
|
|
}
|
|
|
|
protected function editAction()
|
|
{
|
|
$id = $this->request->id;
|
|
|
|
if (!is_numeric($id) || !$id) {
|
|
$this->layout()->setFlash("Kalender Verwaltung nicht gefunden", "error");
|
|
$this->redirect("Calendar");
|
|
}
|
|
|
|
$calendars = new Calendar($id);
|
|
if ($calendars->id != $id) {
|
|
$this->layout()->setFlash("Kalender Verwaltung nicht gefunden", "error");
|
|
$this->redirect("Calendar");
|
|
}
|
|
$this->layout()->set("calendars", $calendars);
|
|
return $this->addAction();
|
|
}
|
|
|
|
protected function saveAction()
|
|
{
|
|
$r = $this->request;
|
|
$id = $r->id;
|
|
//var_dump($r->get());exit;
|
|
if (is_numeric($id) && $id > 0) {
|
|
$mode = "edit";
|
|
$calendars = new Calendar($id);
|
|
if (!$calendars->id) {
|
|
$this->layout()->setFlash("Kalender Verwaltung nicht gefunden", "error");
|
|
$this->redirect("Calendar");
|
|
}
|
|
} else {
|
|
$mode = "add";
|
|
}
|
|
|
|
$data = [];
|
|
if ($mode == "add") {
|
|
$data['user_id'] = trim($r->user_id);
|
|
if (!$data['user_id']) {
|
|
$this->layout()->setFlash("Name darf nicht leer sein", "error");
|
|
$this->redirect("Calendar");
|
|
}
|
|
}
|
|
$data['go_calendar_id'] = trim($r->go_calendar_id);
|
|
$data['microsoft_id'] = trim($r->microsoft_id);
|
|
// $data['rights'] = trim($r->rights);
|
|
// $data['colors'] = trim($r->colors);
|
|
// $data['subscription_id'] = trim($r->subscription_id);
|
|
// $data['expirationDateTime'] = trim($r->expirationDateTime);
|
|
$data['active'] = trim($r->active);
|
|
|
|
|
|
if (!$data['go_calendar_id']) {
|
|
$data['go_calendar_id'] = NULL;
|
|
}
|
|
if (!$data['microsoft_id']) {
|
|
$data['microsoft_id'] = NULL;
|
|
}
|
|
if (!$data['active']) {
|
|
$data['active'] = '0';
|
|
}
|
|
|
|
|
|
if ($mode == "edit") {
|
|
$calendars->update($data);
|
|
|
|
} else {
|
|
$calendars = CalendarModel::create($data);
|
|
}
|
|
|
|
$id = $calendars->save();
|
|
|
|
if (!$id) {
|
|
$this->layout()->setFlash("Kalender Verwaltung konnte nicht angelegt werden", "error");
|
|
$this->redirect("Calendar");
|
|
}
|
|
|
|
if ($mode == "edit") {
|
|
$this->layout()->setFlash("Kalender Verwaltung erfolgreich geändert", "success");
|
|
} else if ($mode = "add") {
|
|
$this->layout()->setFlash("Kalender Verwaltung erfolgreich angelegt", "success");
|
|
}
|
|
$this->redirect("Calendar");
|
|
}
|
|
|
|
|
|
protected function deleteAction()
|
|
{
|
|
$id = $this->request->id;
|
|
$calendars = new Calendar($id);
|
|
if (!$calendars->id || $calendars->id != $id) {
|
|
$this->layout()->setFlash("Kalender Verwaltung nicht gefunden.", "error");
|
|
$this->redirect("Calendar");
|
|
}
|
|
|
|
$calendars->delete();
|
|
$this->redirect("Calendar");
|
|
}
|
|
|
|
} |