summaryrefslogtreecommitdiffstats
path: root/modules-available/locationinfo/inc/coursebackend/coursebackend_hisinone.inc.php
diff options
context:
space:
mode:
Diffstat (limited to 'modules-available/locationinfo/inc/coursebackend/coursebackend_hisinone.inc.php')
-rw-r--r--modules-available/locationinfo/inc/coursebackend/coursebackend_hisinone.inc.php360
1 files changed, 360 insertions, 0 deletions
diff --git a/modules-available/locationinfo/inc/coursebackend/coursebackend_hisinone.inc.php b/modules-available/locationinfo/inc/coursebackend/coursebackend_hisinone.inc.php
new file mode 100644
index 00000000..0e7c5328
--- /dev/null
+++ b/modules-available/locationinfo/inc/coursebackend/coursebackend_hisinone.inc.php
@@ -0,0 +1,360 @@
+<?php
+
+class CourseBackend_HisInOne extends CourseBackend
+{
+ private $username;
+ private $password;
+ private $open;
+
+
+ public function setCredentials($data, $url, $serverID)
+ {
+ if (array_key_exists('password', $data) && array_key_exists('username', $data) && array_key_exists('role', $data) && isset($data['open'])) {
+ $this->error = false;
+ $this->password = $data['password'];
+ $this->username = $data['username'] . "\t" . $data['role'];
+ $this->open = $data['open'];
+ if ($url == "") {
+ $this->error = true;
+ $this->errormsg = "No url is given";
+ return !$this->error;
+ }
+ if ($this->open) {
+ $this->location = $url . "/qisserver/services2/OpenCourseService";
+ } else {
+ $this->location = $url . "/qisserver/services2/CourseService";
+ }
+ $this->serverID = $serverID;
+ } else {
+ $this->error = true;
+ $this->errormsg = "wrong credentials";
+ return false;
+ }
+
+ return true;
+ }
+
+ public function checkConnection()
+ {
+ if ($this->location == "") {
+ $this->error = true;
+ $this->errormsg = "Credentials are not set";
+ }
+ $this->findUnit(190);
+ return !$this->error;
+ }
+
+ /**
+ * @param $roomID int
+ * @return array|bool if successful an array with the subjectIDs that take place in the room
+ */
+ public function findUnit($roomID)
+ {
+ $termYear = date('Y');
+ $termType1 = date('n');
+ if ($termType1 > 3 && $termType1 < 10) {
+ $termType = 2;
+ } elseif ($termType1 > 10) {
+ $termType = 1;
+ $termYear = $termYear + 1;
+ } else {
+ $termType = 1;
+ }
+ $doc = new DOMDocument('1.0', 'utf-8');
+ $doc->formatOutput = true;
+ $envelope = $doc->createElementNS('http://schemas.xmlsoap.org/soap/envelope/', 'SOAP-ENV:Envelope');
+ $doc->appendChild($envelope);
+ if ($this->open) {
+ $envelope->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:ns1', 'http://www.his.de/ws/OpenCourseService');
+ } else {
+ $envelope->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:ns1', 'http://www.his.de/ws/CourseService');
+ $header = $this->getHeader($doc);
+ $envelope->appendChild($header);
+ }
+ //Body of the request
+ $body = $doc->createElement('SOAP-ENV:Body');
+ $envelope->appendChild($body);
+ $findUnit = $doc->createElement('ns1:findUnit');
+ $body->appendChild($findUnit);
+ $termYearN = $doc->createElement('termYear', $termYear);
+ $findUnit->appendChild($termYearN);
+ if ($termType1 != 3 && $termType1 != 10) {
+ $termTypeValueId = $doc->createElement('termTypeValueId', $termType);
+ $findUnit->appendChild($termTypeValueId);
+ }
+ $roomIdN = $doc->createElement('ns1:roomId', $roomID);
+ $findUnit->appendChild($roomIdN);
+
+ $soap_request = $doc->saveXML();
+ $response1 = $this->__doRequest($soap_request, "findUnit");
+ $id = [];
+ if ($this->error == true) {
+ return false;
+ }
+ $response2 = $this->toArray($response1);
+ if ($response2 === false) {
+ return false;
+ }
+ if (isset($response2['soapenvBody']['soapenvFault'])) {
+ $this->error = true;
+ $this->errormsg = $response2['soapenvBody']['soapenvFault']['faultcode'] . " " . $response2['soapenvBody']['soapenvFault']['faultstring'];
+ return false;
+ } elseif ($this->open) {
+ $units = $this->getAttributes($response2, 'soapenvBody/hisfindUnitResponse/hisunits/hisunit');
+ foreach ($units as $unit) {
+ $id[] = $unit['hisid'];
+ }
+ } elseif (!$this->open) {
+ $id = $this->getAttributes($response2, 'soapenvBody/hisfindUnitResponse/hisunitIds/hisid');
+ } else {
+ $this->error = true;
+ $this->errormsg = "url send a xml in a wrong format";
+ $id = false;
+ }
+ return $id;
+ }
+
+ /**
+ * @param $doc DOMDocument
+ * @return DOMElement
+ */
+ private function getHeader($doc)
+ {
+ $header = $doc->createElement('SOAP-ENV:Header');
+ $security = $doc->createElementNS('http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd', 'ns2:Security');
+ $mustunderstand = $doc->createAttribute('SOAP-ENV:mustUnderstand');
+ $mustunderstand->value = 1;
+ $security->appendChild($mustunderstand);
+ $header->appendChild($security);
+ $token = $doc->createElement('ns2:UsernameToken');
+ $security->appendChild($token);
+ $user = $doc->createElement('ns2:Username', $this->username);
+ $token->appendChild($user);
+ $pass = $doc->createElement('ns2:Password', $this->password);
+ $type = $doc->createAttribute('Type');
+ $type->value = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText';
+ $pass->appendChild($type);
+ $token->appendChild($pass);
+ return $header;
+ }
+
+ /**
+ * @param $request string with xml SOAP request
+ * @param $action string with the name of the SOAP action
+ * @return bool|string if successful the answer xml from the SOAP server
+ */
+ private function __doRequest($request, $action)
+ {
+ $header = array(
+ "Content-type: text/xml;charset=\"utf-8\"",
+ "SOAPAction: \"" . $action . "\"",
+ "Content-length: " . strlen($request),
+ );
+
+ $soap_do = curl_init();
+
+ $options = array(
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_SSL_VERIFYHOST => false,
+ CURLOPT_SSL_VERIFYPEER => false,
+ CURLOPT_URL => $this->location,
+ CURLOPT_POSTFIELDS => $request,
+ CURLOPT_HTTPHEADER => $header,
+ );
+
+ curl_setopt_array($soap_do, $options);
+
+ $output = curl_exec($soap_do);
+
+ if ($output === false) {
+ $this->error = true;
+ $this->errormsg = 'Curl error: ' . curl_error($soap_do);
+ } else {
+ $this->error = false;
+ $this->errormsg = "";
+ ///Operation completed successfully
+ }
+ curl_close($soap_do);
+ return $output;
+ }
+
+ /**
+ * @param $response xml document
+ * @return bool|array array representation of the xml if possible
+ */
+ private function toArray($response)
+ {
+ try {
+ $cleanresponse = preg_replace("/(<\/?)(\w+):([^>]*>)/", "$1$2$3", $response);
+ $xml = new SimpleXMLElement($cleanresponse);
+ $array = json_decode(json_encode((array)$xml), true);
+ } catch (Exception $e) {
+ $this->error = true;
+ $this->errormsg = "url did not send a xml";
+ $array = false;
+ }
+ return $array;
+ }
+
+
+ public function getCacheTime()
+ {
+ return 30 * 60;
+ }
+
+
+ public function getRefreshTime()
+ {
+ return 60 * 60;
+ }
+
+
+ public function getDisplayName()
+ {
+ return "HisInOne";
+ }
+
+
+ public function getCredentials()
+ {
+ $credentials = ["username" => "string", "role" => "string", "password" => "password", "open" => "bool"];
+ return $credentials;
+ }
+
+
+ public function fetchSchedulesInternal($param)
+ {
+ if (empty($param)) {
+ $this->error = true;
+ $this->errormsg = 'Internal Error HisInOne';
+ error_log('No roomId was given in HisInOne fetchShedule');
+ return false;
+ }
+ $tTables = [];
+ //get all eventIDs in a given room
+ $eventIDs = [];
+ foreach ($param as $ID) {
+ $unitID = $this->findUnit($ID);
+ if ($unitID == false) {
+ $this->error = false;
+ error_log($this->errormsg);
+ continue;
+ }
+ $eventIDs = array_merge($eventIDs, $unitID);
+ $eventIDs = array_unique($eventIDs);
+ }
+ if (empty($eventIDs)) {
+ foreach ($param as $room) {
+ $tTables[$room] = [];
+ }
+ return $tTables;
+ }
+ $events = [];
+ //get all information on each event
+ foreach ($eventIDs as $each_event) {
+ $event = $this->readUnit(intval($each_event));
+ if ($event === false) {
+ $this->error = false;
+ error_log($this->errormsg);
+ continue;
+ }
+ $events[] = $event;
+ }
+ $currentWeek = $this->getCurrentWeekDates();
+ foreach ($param as $room) {
+ $timetable = array();
+ //Here I go over the soapresponse
+ foreach ($events as $event) {
+ $name = $this->getAttributes($event, '/hisunit/hisdefaulttext');
+ if ($name == false) {
+ //if HisInOne has no default text then there is no name
+ $name = [''];
+ }
+ $dates = $this->getAttributes($event,
+ '/hisunit/hisplanelements/hisplanelement/hisplannedDates/hisplannedDate/hisindividualDates/hisindividualDate');
+ foreach ($dates as $date) {
+ $roomID = $this->getAttributes($date, '/hisroomId')[0];
+ $datum = $this->getAttributes($date, '/hisexecutiondate')[0];
+ if (intval($roomID) == $room && in_array($datum, $currentWeek)) {
+ $startTime = $this->getAttributes($date, 'hisstarttime')[0];
+ $endTime = $this->getAttributes($date, 'hisendtime')[0];
+ $json = array(
+ 'title' => $name[0],
+ 'start' => $datum . " " . $startTime,
+ 'end' => $datum . " " . $endTime
+ );
+ array_push($timetable, $json);
+ }
+ }
+ }
+ $tTables[$room] = $timetable;
+ }
+ return $tTables;
+ }
+
+
+ /**
+ * @param $unit int ID of the subject in HisInOne database
+ * @return bool|array false if there was an error otherwise an array with the information about the subject
+ */
+ public function readUnit($unit)
+ {
+ $doc = new DOMDocument('1.0', 'utf-8');
+ $doc->formatOutput = true;
+ $envelope = $doc->createElementNS('http://schemas.xmlsoap.org/soap/envelope/', 'SOAP-ENV:Envelope');
+ $doc->appendChild($envelope);
+ if ($this->open) {
+ $envelope->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:ns1', 'http://www.his.de/ws/OpenCourseService');
+ } else {
+ $envelope->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:ns1', 'http://www.his.de/ws/CourseService');
+ $header = $this->getHeader($doc);
+ $envelope->appendChild($header);
+ }
+ //body of the request
+ $body = $doc->createElement('SOAP-ENV:Body');
+ $envelope->appendChild($body);
+ $readUnit = $doc->createElement('ns1:readUnit');
+ $body->appendChild($readUnit);
+ $unitId = $doc->createElement('ns1:unitId', $unit);
+ $readUnit->appendChild($unitId);
+
+ $soap_request = $doc->saveXML();
+ $response1 = $this->__doRequest($soap_request, "readUnit");
+ if ($response1 == false) {
+ return false;
+ }
+ $response2 = $this->toArray($response1);
+ if ($response2 != false) {
+ if (isset($response2['soapenvBody']['soapenvFault'])) {
+ $this->error = true;
+ $this->errormsg = 'SOAP-Fault' . $response2['soapenvBody']['soapenvFault']['faultcode'] . " " . $response2['soapenvBody']['soapenvFault']['faultstring'];
+ return false;
+ } elseif (isset($response2['soapenvBody']['hisreadUnitResponse'])) {
+ $this->error = false;
+ $response3 = $response2['soapenvBody']['hisreadUnitResponse'];
+ $this->errormsg = '';
+ return $response3;
+ } else {
+ $this->error = true;
+ $this->errormsg = "wrong url or the url send a xml in the wrong format";
+ return false;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * @return array with days of the current week in datetime format
+ */
+ private function getCurrentWeekDates()
+ {
+ $DateArray = array();
+ $startdate = strtotime('Now');
+ for ($i = 0; $i <= 7; $i++) {
+ $DateArray[] = date('Y-m-d', strtotime("+ {$i} day", $startdate));
+ }
+ return $DateArray;
+ }
+
+}