diff --git a/config/vilesci.config-default.inc.php b/config/vilesci.config-default.inc.php index c7140cd89..713367bd7 100644 --- a/config/vilesci.config-default.inc.php +++ b/config/vilesci.config-default.inc.php @@ -40,7 +40,7 @@ define('XML_ROOT', 'http://www.fhcomlete.org/build/rdf/'); // Pfad zu Document Root define('DOC_ROOT', '/var/www/html/build/'); // URL zu CIS -define('CIS_ROOT', 'http://www.fhcomlete.org/build/cis/'); +define('CIS_ROOT', 'http://www.fhcomlete.org/build/'); // Externe Funktionen - Unterordner im Include-Verzeichnis define('EXT_FKT_PATH', 'tw'); @@ -185,4 +185,14 @@ define('SIGNATUR_USER', 'username'); define('SIGNATUR_PASSWORD', 'password'); // Signaturprofil das verwendet werden soll define('SIGNATUR_DEFAULT_PROFILE', 'FHC_AMT_GROSS_DE'); + +/** + * Datenverbund Anbindung + */ +// Code der Bildungseinrichtung +define('DVB_BILDUNGSEINRICHTUNG_CODE','XX'); +// Username +define('DVB_USERNAME','username'); +// Passwort +define('DVB_PASSWORD','passwort'); ?> diff --git a/include/dvb.class.php b/include/dvb.class.php index fc9b26c1d..c2b94802e 100644 --- a/include/dvb.class.php +++ b/include/dvb.class.php @@ -23,8 +23,13 @@ * Abfrage und Vergabe von Matrikelnummern */ require_once(dirname(__FILE__).'/basis_db.class.php'); +require_once(dirname(__FILE__).'/person.class.php'); +require_once(dirname(__FILE__).'/student.class.php'); +require_once(dirname(__FILE__).'/studiensemester.class.php'); +require_once(dirname(__FILE__).'/adresse.class.php'); +require_once(dirname(__FILE__).'/webservicelog.class.php'); -class dvb +class dvb extends basis_db { const DVB_URL_WEBSERVICE_OAUTH = 'https://stubei-q.portal.at/dvb/oauth/token'; const DVB_URL_WEBSERVICE_SVNR = 'https://stubei-q.portal.at/rws/0.1/simpleStudentBySozialVersicherungsnummer.xml'; @@ -35,7 +40,7 @@ class dvb public $authentication; private $username; private $password; - private $debug; + protected $debug; public $debug_output = ''; /** @@ -51,6 +56,170 @@ class dvb $this->debug = $debug; } + /** + * Versucht die Matrikelnummer für eine Person zu ermitteln. + * Wenn die Person noch keine Matrikelnummer besitzt, wird eine neue Matrikelnummer + * angefordert und der Person zugeordnet + * @param int $person_id ID der Person. + * @return boolean true wenn Erfolgreich, false im Fehlerfall + */ + public function assignMatrikelnummer($person_id) + { + $person = new person(); + if (!$person->load($person_id)) + { + $this->errormsg = $person->errormsg; + return false; + } + + if ($person->svnr != '') + { + $matrikelnummer = $this->getMatrikelnrBySVNR($person->svnr); + + if ($matrikelnummer === false && $this->errormsg != '') + { + $this->logRequest($person, 'getMatrikelnrBySVNR', false); + return false; + } + } + elseif ($person->ersatzkennzeichen != '') + { + $matrikelnummer = $this->getMatrikelnrByErsatzkennzeichen($person->ersatzkennzeichen); + + if ($matrikelnummer === false && $this->errormsg != '') + { + $this->logRequest($person, 'getMatrikelnrByErsatzkennzeichen', false); + return false; + } + } + else + { + $this->errormsg = 'Person braucht SVNR oder Ersatzkennzeichen'; + return false; + } + + if ($matrikelnummer !== false && $matrikelnummer != '') + { + // Matrikelnummer wurde gefunden + // Bei Person speichern + $person->matr_nr = $matrikelnummer; + if ($person->save()) + { + $this->logRequest($person, 'assignExistingMatrikelnummer', true, $matrikelnummer); + return true; + } + } + else + { + // Es wurde noch keine Matrikelnummer zu dieser Person zugeordnet + // Es wird eine neue Matrikelnummer aus dem Kontingent angefordert + // und an die Person vergeben + + // Studienjahr ermitteln + $qry = " + SELECT + studiensemester_kurzbz, prestudent_id + FROM + public.tbl_student + JOIN public.tbl_prestudent USING(prestudent_id) + JOIN public.tbl_prestudentstatus USING(prestudent_id) + JOIN public.tbl_benutzer ON(tbl_student.student_uid = tbl_benutzer.uid) + WHERE + tbl_prestudent.person_id=".$this->db_add_param($person->person_id)." + AND tbl_benutzer.aktiv + AND tbl_prestudentstatus.status_kurzbz='Student' + AND tbl_prestudent.bismelden + ORDER BY tbl_prestudentstatus.datum desc LIMIT 1 + "; + + $prestudent_id = ''; + $studiensemester_kurzbz = ''; + + if ($result = $this->db_query($qry)) + { + if ($row = $this->db_fetch_object($result)) + { + $studiensemester_kurzbz = $row->studiensemester_kurzbz; + $prestudent_id = $row->prestudent_id; + } + else + { + $this->logRequest($person, 'assignNewMatrikelnummer', false); + $this->errormsg = 'Fehler beim Ermitteln des Studienjahrs für diese Person'; + return false; + } + } + else + { + $this->logRequest($person, 'assignNewMatrikelnummer', false); + $this->errormsg = 'Fehler beim Ermitteln des Studienjahrs für diese Person'; + return false; + } + + $studienjahr = substr($studiensemester_kurzbz, 4); + $art = substr($studiensemester_kurzbz, 0, 2); + if ($art == 'SS') + $studienjahr = $studienjahr - 1; + + // Erstaustattung im Jahr 2018. Alle davor bekommen 18er Nummern + if ($studienjahr < 2018) + $studienjahr = 2018; + + // Neue Matrikelnummer aus Kontingent anfordern + $kontingent = $this->getKontingent(DVB_BILDUNGSEINRICHTUNG_CODE, $studienjahr); + + if ($kontingent !== false && isset($kontingent[0])) + { + $person_meldung = new stdClass(); + $person_meldung->matrikelnummer = $kontingent[0]; + $person_meldung->vorname = $person->vorname; + $person_meldung->nachname = $person->nachname; + $person_meldung->geburtsdatum = $person->gebdatum; + $person_meldung->geschlecht = UPPER($person->geschlecht); + $person_meldung->staat = $person->staatsbuergerschaft; + if ($person->svnr != '') + $person_meldung->svnr = $person->svnr; + + // PLZ der Meldeadresse laden + $adresse = new adresse(); + if ($adresse->loadZustellAdresse($person->person_id)) + $person_meldung->plz = $row->plz; + + // ZGV Datum laden falls vorhanden + $prestudent = new prestudent(); + if ($prestudent->load($prestudent_id) && $prestudent->zgvdatum != '') + { + $datum_obj = new datum(); + $person->matura = $datum_obj->formatDatum($matura, 'Ymd'); + } + + // Meldung der Vergabe der Matrikelnummer + if ($this->setMatrikelnummer(DVB_BILDUNGSEINRICHTUNG_CODE, $person)) + { + // Matrikelnummer bei Person speichern + $person->matr_nr = $matrikelnummer; + if ($person->save()) + { + $this->logRequest($person, 'assignNewMatrikelnummer', true, $matrikelnummer); + return true; + } + } + else + { + $this->logRequest($person, 'assignNewgMatrikelnummer', false, $person_meldung); + $this->errormsg .= 'Vergabe fehlgeschlagen'; + return false; + } + } + else + { + $this->logRequest($person, 'assignNewgMatrikelnummer', false, $studienjahr); + $this->errormsg .= 'Failed to get Kontingent'; + return false; + } + } + } + /** * Performs a OAuth2 Authentication and returns the OAuth Bearer Token * @return boolean true wenn erfolgreich, false im Fehlerfall @@ -113,7 +282,8 @@ class dvb } else { - $this->errormsg = 'Request Failed with HTTP Code:'.$curl_info['http_code'].' and Response:'.$json_response; + $this->errormsg = 'Authentication failed with HTTP Code:'.$curl_info['http_code']; + $this->errormsg .= ' and Response:'.$json_response; return false; } } @@ -145,10 +315,11 @@ class dvb { if ($this->tokenIsExpired()) { - $this->authenticate(); + if (!$this->authenticate()) + return false; } - $this->debug('getMatirkelnrBySVNR'); + $this->debug('getMatrikelnrBySVNR'); $curl = curl_init(); @@ -176,7 +347,9 @@ class dvb $curl_info = curl_getinfo($curl); curl_close($curl); - $this->debug('Response '.$curl_info['http_code']); + $this->debug('ResponseCode: '.$curl_info['http_code']); + $this->debug('ResponseData: '.print_r($response, true)); + if ($curl_info['http_code'] == '200') { /* Example Response: @@ -194,11 +367,22 @@ class dvb $dom = new DOMDocument(); $dom->loadXML($response); $namespace = 'http://www.brz.gv.at/datenverbund-unis'; - $domnodes_matrikelnummer = $dom->getElementsByTagNameNS($namespace, 'matrikelNummer'); - foreach ($domnodes_matrikelnummer as $row) + $domnodes_student = $dom->getElementsByTagNameNS($namespace, 'student'); + foreach ($domnodes_student as $row_student) { - // Found - return $row->textContent; + // Wenn nicht gesperrt und fix vergeben + $ingesamtpool = $row_student->getAttribute('inGesamtPool'); + $gesperrt = $row_student->getAttribute('gesperrt'); + + if ($ingesamtpool == 'true' && $gesperrt == 'false') + { + $domnodes_matrikelnummer = $row_student->getElementsByTagNameNS($namespace, 'matrikelNummer'); + foreach ($domnodes_matrikelnummer as $row) + { + // Found + return $row->textContent; + } + } } $this->errormsg = ''; @@ -220,7 +404,8 @@ class dvb { if ($this->tokenIsExpired()) { - $this->authenticate(); + if (!$this->authenticate()) + return false; } $this->debug('getMatrikelnrByErsatzkennzeichen'); @@ -248,7 +433,8 @@ class dvb $xml_response = curl_exec($curl); $curl_info = curl_getinfo($curl); curl_close($curl); - $this->debug('Response: '.$curl_info['http_code']); + $this->debug('ResponseCode: '.$curl_info['http_code']); + $this->debug('ResponseData: '.print_r($response, true)); if ($curl_info['http_code'] == '200') { @@ -315,12 +501,26 @@ class dvb $dom = new DOMDocument(); $dom->loadXML($xml_response); $namespace = 'http://www.brz.gv.at/datenverbund-unis'; - $domnodes_matrikelnummer = $dom->getElementsByTagNameNS($namespace, 'matrikelNummer'); - foreach ($domnodes_matrikelnummer as $row) + $domnodes_student = $dom->getElementsByTagNameNS($namespace, 'student'); + foreach ($domnodes_student as $row_student) { - // Found - return $row->textContent; + // Wenn nicht gesperrt und fix vergeben + $ingesamtpool = $row_student->getAttribute('inGesamtPool'); + $gesperrt = $row_student->getAttribute('gesperrt'); + + if ($ingesamtpool == 'true' && $gesperrt == 'false') + { + $domnodes_matrikelnummer = $row_student->getElementsByTagNameNS($namespace, 'matrikelNummer'); + foreach ($domnodes_matrikelnummer as $row) + { + // Found + return $row->textContent; + } + } } + + $this->errormsg = ''; + return false; } else { @@ -342,7 +542,8 @@ class dvb if ($this->tokenIsExpired()) { - $this->authenticate(); + if (!$this->authenticate()) + return false; } $curl = curl_init(); @@ -371,7 +572,8 @@ class dvb $curl_info = curl_getinfo($curl); curl_close($curl); - $this->debug('Response: '.$curl_info['http_code']); + $this->debug('ResponseCode: '.$curl_info['http_code']); + $this->debug('ResponseData: '.print_r($response, true)); /* 200 ok @@ -417,7 +619,8 @@ class dvb if ($this->tokenIsExpired()) { - $this->authenticate(); + if (!$this->authenticate()) + return false; } $data = ' @@ -457,7 +660,8 @@ class dvb $curl_info = curl_getinfo($curl); curl_close($curl); - $this->debug('Response: '.$curl_info['http_code']); + $this->debug('ResponseCode: '.$curl_info['http_code']); + $this->debug('ResponseData: '.print_r($response, true)); if ($curl_info['http_code'] == '200') { @@ -491,7 +695,8 @@ class dvb if ($this->tokenIsExpired()) { - $this->authenticate(); + if (!$this->authenticate()) + return false; } $data = ' @@ -651,4 +856,26 @@ class dvb if ($this->debug) $this->debug_output .= "\n
".date('Y-m-d H:i:s').': '.htmlentities($msg); } + + /** + * Erstellt einen Logeintrag + * @param object $person Personen objekt. + * @param string $typ Art des Requests. + * @param bool $result True wen Erfolgreich, false wenn Fehlerhaft. + * @param object $data Zusatzdaten die Übermittelt wurden und geloggt werden sollen. + * @return void + */ + public function logRequest($person, $typ, $result, $data = null) + { + $webservicelog = new webservicelog(); + + $webservicelog->webservicetyp_kurzbz = 'dvb'; + $webservicelog->request_id = $person->person_id; + $webservicelog->beschreibung = $typ; + $webservicelog->request_data = ($result?'SUCCESS':'FAILED').' '.$this->errormsg; + if (!is_null($data)) + $webservicelog->request_data .= ' '.print_r($data, true); + + $webservicelog->save(); + } } diff --git a/soap/datenverbund_client.php b/soap/datenverbund_client.php index 0dc47c109..6c85c394b 100644 --- a/soap/datenverbund_client.php +++ b/soap/datenverbund_client.php @@ -53,6 +53,7 @@ $staat = filter_input(INPUT_POST, 'staat'); $matura = filter_input(INPUT_POST, 'matura'); $svnr = filter_input(INPUT_POST, 'svnr'); $ersatzkennzeichen = filter_input(INPUT_POST, 'ersatzkennzeichen'); +$person_id = filter_input(INPUT_POST, 'person_id'); ?> @@ -73,6 +74,7 @@ $ersatzkennzeichen = filter_input(INPUT_POST, 'ersatzkennzeichen');
  • Matrikelnummer Reservierungen anzeigen
  • Matrikelnummer Kontingent anfordern
  • Matrikelnummer Vergabe melden
  • +
  • Gesamtprozess (Abfrage, ggf Vergabemeldung, Speichern bei Person)


  • @@ -87,7 +89,7 @@ $ersatzkennzeichen = filter_input(INPUT_POST, 'ersatzkennzeichen'); * @param int $maxlength Maximallaenge des Eingabefeldes. * @return void */ - function printrow($name, $title, $value, $hint = '', $maxlength = 15) + function printrow($name, $title, $value, $hint = '', $maxlength = 15, $type = 'text') { global $db; @@ -95,14 +97,14 @@ $ersatzkennzeichen = filter_input(INPUT_POST, 'ersatzkennzeichen'); '.$title.': - '.$hint.' '; } printrow('username', 'Username', $username, '', 100); - printrow('password', 'Passwort', $password, '', 100); + printrow('password', 'Passwort', $password, '', 100, 'password'); switch($action) { @@ -146,6 +148,10 @@ $ersatzkennzeichen = filter_input(INPUT_POST, 'ersatzkennzeichen'); printrow('matura', 'Maturadatum', $matura, 'Format: YYYYMMDD (optional)', 10); break; + case 'assignMatrikelnummer': + printrow('person_id', 'PersonID', $person_id); + break; + default: echo "Unknown action"; break; @@ -232,6 +238,15 @@ if (isset($_REQUEST['submit'])) echo '
    Fehlgeschlagen:'.$dvb->errormsg; break; + case 'assignMatrikelnummer': + if($dvb->assignMatrikelnummer($person_id)) + { + echo '
    OK'; + } + else + echo '
    Fehlgeschlagen:'.$dvb->errormsg; + break; + default: echo "Unknown action"; break; diff --git a/system/dbupdate_3.3.php b/system/dbupdate_3.3.php index 12aea86b0..a3b93cbb6 100755 --- a/system/dbupdate_3.3.php +++ b/system/dbupdate_3.3.php @@ -2221,6 +2221,20 @@ if ($result = @$db->db_query("SELECT conname FROM pg_constraint WHERE conname = } } +// Webservicetyp dvb +if ($result = $db->db_query("SELECT * FROM system.tbl_webservicetyp WHERE webservicetyp_kurzbz='dvb'")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO system.tbl_webservicetyp(webservicetyp_kurzbz, beschreibung) VALUES('dvb','Datenverbund');"; + + if(!$db->db_query($qry)) + echo 'WebserviceLog: '.$db->db_last_error().'
    '; + else + echo 'Webservicelog Typ für Datenverbund hinzugefügt'; + } +} + // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo '

    Pruefe Tabellen und Attribute!

    ';