, */ /** * Datenverbund Services * Anbindung für Datenverbund des Bundesrechenzetrums zur * 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'); require_once(dirname(__FILE__).'/prestudent.class.php'); require_once(dirname(__FILE__).'/errorhandler.class.php'); class dvb extends basis_db { const DVB_URL_WEBSERVICE_OAUTH = DVB_PORTAL.'/dvb/oauth/token'; const DVB_URL_WEBSERVICE_SVNR = DVB_PORTAL.'/rws/0.2/simpleStudentBySozialVersicherungsnummer.xml'; const DVB_URL_WEBSERVICE_ERSATZKZ = DVB_PORTAL.'/rws/0.2/simpleStudentByErsatzKennzeichen.xml'; const DVB_URL_WEBSERVICE_NACHNAME = DVB_PORTAL.'/rws/0.2/simpleStudentByNachname.xml'; const DVB_URL_WEBSERVICE_NAME = DVB_PORTAL.'/rws/0.2/simpleStudentByName.xml'; const DVB_URL_WEBSERVICE_MATRIKELNUMMER = DVB_PORTAL.'/rws/0.2/simpleStudentByMatrikelnummer.xml'; const DVB_URL_WEBSERVICE_RESERVIERUNG = DVB_PORTAL.'/rws/0.5/matrikelreservierung.xml'; const DVB_URL_WEBSERVICE_MELDUNG = DVB_PORTAL.'/rws/0.5/matrikelmeldung.xml'; const DVB_URL_WEBSERVICE_BPK = DVB_PORTAL.'/rws/0.5/pruefebpk.xml'; public $authentication; private $username; private $password; protected $debug; public $debug_output = ''; /** * Constructor * @param string $username Username fuer OAuth2 Login. * @param string $password Passwort fuer OAuth2 Login. * @param bool $debug Enables/Disables Debugging. */ public function __construct($username, $password, $debug = false) { $this->username = $username; $this->password = $password; $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. * @param boolean $softrun Wird dieser Parameter gesetzt, werden nur bestehende Daten abgerufen, * es werden keine neuen Vergabemeldungen gemacht * @return boolean true wenn Erfolgreich, false im Fehlerfall */ public function assignMatrikelnummer($person_id, $softrun = false) { $person = new person(); if (!$person->load($person_id)) { return ErrorHandler::error($person->errormsg); } $matrikelnummer = false; $bpk = false; if ($person->svnr != '') { $data = $this->getMatrikelnrBySVNR($person->svnr); if (ErrorHandler::isSuccess($data)) { if (ErrorHandler::hasData($data)) { $matrikelnummer = $data->retval->matrikelnummer; $bpk = $data->retval->bpk; } } else { return ErrorHandler::error(); } } elseif ($person->ersatzkennzeichen != '') { $data = $this->getMatrikelnrByErsatzkennzeichen($person->ersatzkennzeichen); if (ErrorHandler::isSuccess($data)) { if (ErrorHandler::hasData($data)) { $matrikelnummer = $data->retval->matrikelnummer; $bpk = $data->retval->bpk; } } else { return ErrorHandler::error(); } } else { $errormsg = 'Person braucht SVNR oder Ersatzkennzeichen'; return ErrorHandler::error($errormsg); } // Wenn nicht gefunden, wird zusaetzlich noch eine Namenssuche gestartet if ($matrikelnummer == false || $matrikelnummer == '') { $this->debug('Keine Matrikelnummer gefunden -> Suche per Nachname'); $nachnameresult = $this->existsByNachname($person_id); if (ErrorHandler::isSuccess($nachnameresult)) { if (ErrorHandler::hasData($nachnameresult) && isset($nachnameresult->retval->matrikelnummer) && $nachnameresult->retval->matrikelnummer != '') { $this->debug('Nachnamensuche erfolgreich'); $matrikelnummer = $nachnameresult->retval->matrikelnummer; if (isset($nachnameresult->retval->bpk)) $bpk = $nachnameresult->retval->bpk; } else { $errormsg = 'Namenssuche ergab nicht eindeutige Treffer -> manuelle Pruefung ist erforderlich'; return ErrorHandler::error($errormsg); } } } if ($matrikelnummer !== false && $matrikelnummer != '') { // Matrikelnummer wurde gefunden // Bei Person speichern $person->matr_nr = $matrikelnummer; // Wenn ein bPK gefunden wurde dieses auch speichern if ($bpk != '') { $person->bpk = $bpk; } if ($person->save()) { return ErrorHandler::success(); } } else { if ($softrun == true) { $errormsg = 'Nicht gefunden Softrun enabled keine Meldung'; return ErrorHandler::error($errormsg); } // 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 in('Student','Incoming') AND tbl_prestudent.bismelden AND tbl_prestudent.studiengang_kz<10000 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); $errormsg = 'Fehler beim Ermitteln des Studienjahrs für diese Person'; return ErrorHandler::error($errormsg); } } else { $this->logRequest($person, 'assignNewMatrikelnummer', false); $errormsg = 'Fehler beim Ermitteln des Studienjahrs für diese Person'; return ErrorHandler::error($errormsg); } $studienjahr = substr($studiensemester_kurzbz, 2); $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 $data = $this->getKontingent(DVB_BILDUNGSEINRICHTUNG_CODE, $studienjahr); if (ErrorHandler::isSuccess($data) && ErrorHandler::hasdata($data)) { $kontingent = $data->retval->kontingent; 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 = mb_strtoupper($person->geschlecht); $person_meldung->staat = $person->staatsbuergerschaft; if ($person->svnr != '') $person_meldung->svnr = $person->svnr; else if ($person->ersatzkennzeichen != '') $person_meldung->svnr = $person->ersatzkennzeichen; // PLZ der Meldeadresse laden $adresse = new adresse(); if ($adresse->loadZustellAdresse($person->person_id)) $person_meldung->plz = $adresse->plz; // ZGV Datum laden falls vorhanden $prestudent = new prestudent(); if ($prestudent->load($prestudent_id) && $prestudent->zgvdatum != '') { $datum_obj = new datum(); $person_meldung->matura = $datum_obj->formatDatum($prestudent->zgvdatum, 'Ymd'); } // Meldung der Vergabe der Matrikelnummer $data = $this->setMatrikelnummer(DVB_BILDUNGSEINRICHTUNG_CODE, $person_meldung); if (ErrorHandler::isSuccess($data)) { // Matrikelnummer bei Person speichern $person->matr_nr = $data->retval->matrikelnummer; // Wenn ein BPK bei der Meldung ermittelt wurde, dann dieses auch speichern if (ErrorHandler::hasData($data) && isset($data->retval->bpk) && $data->retval->bpk != '') { $person->bpk = $data->retval->bpk; } if ($person->save()) { return ErrorHandler::success(); } } else { $this->logRequest($person, 'assignNewMatrikelnummer', false, $person_meldung); $errormsg = 'Vergabe fehlgeschlagen'; return ErrorHandler::error($errormsg); } } else { $this->logRequest($person, 'assignNewMatrikelnummer', false, $studienjahr); $errormsg = 'Failed to get Kontingent'; return ErrorHandler::error($errormsg); } } } } /** * Performs a OAuth2 Authentication and returns the OAuth Bearer Token * @return boolean true wenn erfolgreich, false im Fehlerfall */ public function authenticate() { $this->debug('Request new OAuth Token'); $curl = curl_init(); $url = self::DVB_URL_WEBSERVICE_OAUTH; $url .= '?grant_type=client_credentials'; curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $headers = array( 'Accept: application/json', 'Content-Type: application/x-www-form-urlencoded', 'Authorization: Basic '.base64_encode($this->username.":".$this->password), 'User-Agent: FHComplete', 'Connection: Keep-Alive', 'Expect:', 'Content-Length: 0' ); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); $this->debug('Sending Request to '.$url); $json_response = curl_exec($curl); $curl_info = curl_getinfo($curl); curl_close($curl); $this->debug('Response: '.$curl_info['http_code']); if ($curl_info['http_code'] == '200') { /* Example Response: { "access_token": "d9c60404-1530-4b05-bb8e-0a0b0f321726", "token_type": "bearer", "expires_in": 41087, "scope": "read write ROLE_bildungseinrichtung ROLE_bildungseinrichtung_A" } */ $this->authentication = json_decode($json_response); // Calculate Expire Date $ttl = new DateTime(); $ttl->add(new DateInterval('PT'.$this->authentication->expires_in.'S')); $this->authentication->DateTimeExpires = $ttl; $this->debug('Access_token:'.$this->authentication->access_token); $this->debug('Scope:'.$this->authentication->scope); return ErrorHandler::success(); } else { $this->errormsg = 'Authentication failed with HTTP Code:'.$curl_info['http_code']; $this->errormsg .= ' and Response:'.$json_response; return ErrorHandler::error(); } } /** * Checks if the Token is Expired * @return boolean true if expired, false if valid. */ private function tokenIsExpired() { if (!isset($this->authentication)) return true; $dtnow = new DateTime(); if ($this->authentication->DateTimeExpires < $dtnow) { return true; } else return false; } /** * Get Matrikelnummer by Social Security Number * @param string $svnr Social Security Number. * @return Matrikelnummer or false on error. */ public function getMatrikelnrBySVNR($svnr) { if ($this->tokenIsExpired()) { $result = $this->authenticate(); if (ErrorHandler::isError($result)) return ErrorHandler::error(); } $this->debug('getMatrikelnrBySVNR'); $uuid = $this->getUUID(); $curl = curl_init(); $url = self::DVB_URL_WEBSERVICE_SVNR; $url .= '?sozialVersicherungsNummer='.curl_escape($curl, $svnr); $url .= '&uuid='.curl_escape($curl, $uuid); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $headers = array( 'Accept: application/json', 'Authorization: Bearer '.$this->authentication->access_token, 'User-Agent: FHComplete', 'Connection: Keep-Alive', 'Expect:', 'Content-Length: 0' ); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); $this->debug('Sending Request to '.$url); $response = curl_exec($curl); $curl_info = curl_getinfo($curl); curl_close($curl); $this->debug('ResponseCode: '.$curl_info['http_code']); $this->debug('ResponseData: '.print_r($response, true)); if ($curl_info['http_code'] == '200') { /* Example Response: 12345678 Max sdfaASDAFasdfads+asasdffd= Mustermann M 1999-02-19 A */ $dom = new DOMDocument(); $dom->loadXML($response); $namespace = 'http://www.brz.gv.at/datenverbund-unis'; $domnodes_student = $dom->getElementsByTagNameNS($namespace, 'student'); $matrikelnr = false; $bpk = false; foreach ($domnodes_student as $row_student) { // 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) { // MatrikelNr Found $matrikelnr = $row->textContent; break; } $domnodes_bpk = $row_student->getElementsByTagNameNS($namespace, 'personenkennzeichen'); foreach ($domnodes_bpk as $row) { // BPK Found $bpk = $row->textContent; break; } } } if ($matrikelnr !== false) { $retval = new stdClass(); $retval->matrikelnummer = $matrikelnr; $retval->bpk = $bpk; return ErrorHandler::success($retval); } else { $this->errormsg = ''; return ErrorHandler::success(); } } else { $errormsg = 'Request Failed with HTTP Code:'.$curl_info['http_code'].' and Response:'.$response; return ErrorHandler::error($errormsg); } } /** * Get Matrikelnummer by Ersatzkennzeichen * @param string $ersatzkennzeichen Ersatzkennzeichen to search for. * @return Matrikelnummer or false */ public function getMatrikelnrByErsatzkennzeichen($ersatzkennzeichen) { if ($this->tokenIsExpired()) { $result = $this->authenticate(); if (ErrorHandler::isError($result)) return ErrorHandler::error(); } $this->debug('getMatrikelnrByErsatzkennzeichen'); $curl = curl_init(); $uuid = $this->getUUID(); $url = self::DVB_URL_WEBSERVICE_ERSATZKZ; $url .= '?ersatzKennzeichen='.curl_escape($curl, $ersatzkennzeichen); $url .= '&uuid='.curl_escape($curl, $uuid); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $headers = array( 'Accept: application/json', 'Authorization: Bearer '.$this->authentication->access_token, 'User-Agent: FHComplete', 'Connection: Keep-Alive', 'Expect:', 'Content-Length: 0' ); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); $this->debug('Sending Request to '.$url); $xml_response = curl_exec($curl); $curl_info = curl_getinfo($curl); curl_close($curl); $this->debug('ResponseCode: '.$curl_info['http_code']); $this->debug('ResponseData: '.print_r($xml_response, true)); if ($curl_info['http_code'] == '200') { /* Example Response Success A 12345678 2017S ABCD201093 Bc. Max Mustermann W 1993-06-26 TCH A 1030 Wien Obere Bahngasse 20/12 A 1030 Wien Obere Bahngasse 20/12 12345678 Max Mustermann W 1993-06-26 TCH */ /* 200 - No Entry found */ /* 401 Error Code Token Expired { "error": "invalid_token", "error_description": "Access token expired: 64a58ef3-1a70-46e9-b44f-35cc5051ae8e" } */ /* 400 Bad Request 318e1bc5-279d-43c4-af47-5e6df2ff5279 ZD00001 Z Der Server konnte die Anfrage nicht vearbeiten. Required String parameter 'ersatzKennzeichen' is not present */ $dom = new DOMDocument(); $dom->loadXML($xml_response); $namespace = 'http://www.brz.gv.at/datenverbund-unis'; $domnodes_student = $dom->getElementsByTagNameNS($namespace, 'student'); $matrikelnr = ''; $bpk = ''; foreach ($domnodes_student as $row_student) { // 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 $matrikelnr = $row->textContent; } $domnodes_bpk = $row_student->getElementsByTagNameNS($namespace, 'personenkennzeichen'); foreach ($domnodes_bpk as $row) { // BPK Found $bpk = $row->textContent; break; } } } if ($matrikelnr != '') { $retval = new stdClass(); $retval->matrikelnummer = $matrikelnr; $retval->bpk = $bpk; return ErrorHandler::success($retval); } else { $this->errormsg = ''; return ErrorHandler::success(); } } else { $errormsg = 'Request Failed with HTTP Code:'.$curl_info['http_code'].' and Response:'.$xml_response; return ErrorHandler::error($errormsg); } } /** * List of already Reserved Matrikelnummern * @param string $bildungseinrichtung Shortname of Institution. * @param string $studienjahr Year of Reservation. * @return array with reserved Matrikelnr. or false on failure. */ public function getReservations($bildungseinrichtung, $studienjahr) { $this->debug('getReservations'); $uuid = $this->getUUID(); if ($this->tokenIsExpired()) { $result = $this->authenticate(); if (ErrorHandler::isError($result)) return ErrorHandler::error(); } $curl = curl_init(); $url = self::DVB_URL_WEBSERVICE_RESERVIERUNG; $url .= '?uuid='.curl_escape($curl, $uuid); $url .= '&be='.curl_escape($curl, $bildungseinrichtung); $url .= '&sj='.curl_escape($curl, $studienjahr); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $headers = array( 'Accept: application/xml', 'Authorization: Bearer '.$this->authentication->access_token, 'User-Agent: FHComplete', 'Connection: Keep-Alive', 'Expect:', 'Content-Length: 0' ); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); $this->debug('Request URL:'.$url); $response = curl_exec($curl); $curl_info = curl_getinfo($curl); curl_close($curl); $this->debug('ResponseCode: '.$curl_info['http_code']); $this->debug('ResponseData: '.print_r($response, true)); /* 200 ok 793d44fa-5646-42b1-b0cb-f2f121b2f14f 12345678 23456789 */ if ($curl_info['http_code'] == '200') { $dom = new DOMDocument(); $dom->loadXML($response); $domnodes_matrikelnummer = $dom->getElementsByTagName('matrikelnummer'); $reservations = array(); foreach ($domnodes_matrikelnummer as $row) { $reservations[] = $row->textContent; } $retval = new stdClass(); $retval->reservations = $reservations; return ErrorHandler::success($retval); } else { $errormsg = 'Request Failed with HTTP Code:'.$curl_info['http_code'].' and Response:'.$response; return ErrorHandler::error($errormsg); } } /** * Request a new Matrikelnummer * @param string $bildungseinrichtung Shortname of Institution. * @param string $studienjahr Year of issuing. * @param int $anzahl Number of Requested Numbers. * @return array list of matrikelnr or false on failure. */ public function getKontingent($bildungseinrichtung, $studienjahr, $anzahl = 1) { $this->debug('getKontingent'); $uuid = $this->getUUID(); if ($this->tokenIsExpired()) { $result = $this->authenticate(); if (ErrorHandler::isError($result)) return ErrorHandler::error(); } $data = ' '.$uuid.' '.$anzahl.' '.$bildungseinrichtung.' '.$studienjahr.' '; $curl = curl_init(); $url = self::DVB_URL_WEBSERVICE_RESERVIERUNG; curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); $headers = array( 'Accept: application/xml', 'Content-Type: application/xml', 'Authorization: Bearer '.$this->authentication->access_token, 'User-Agent: FHComplete', 'Connection: Keep-Alive', 'Expect:' ); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); $this->debug('Request URL:'.$url); $this->debug('Request Data:'.$data); $response = curl_exec($curl); $curl_info = curl_getinfo($curl); curl_close($curl); $this->debug('ResponseCode: '.$curl_info['http_code']); $this->debug('ResponseData: '.print_r($response, true)); if ($curl_info['http_code'] == '200') { $dom = new DOMDocument(); $dom->loadXML($response); $domnodes_matrikelnummer = $dom->getElementsByTagName('matrikelnummer'); $kontingent = array(); foreach ($domnodes_matrikelnummer as $row) { $kontingent[] = $row->textContent; } $retval = new stdClass(); $retval->kontingent = $kontingent; return ErrorHandler::success($retval); } else { $errormsg = 'Request Failed with HTTP Code:'.$curl_info['http_code'].' and Response:'.$response; return ErrorHandler::error($errormsg); } } /** * Meldet die Vergabe der Matrikelnummer * @param string $bildungseinrichtung Kennzeichen der Bildungseinrichtung. * @param object $person Objekt mit den Personendaten. * @return booelan true wenn erfolgreich */ public function setMatrikelnummer($bildungseinrichtung, $person) { $this->debug('setMatrikelnummer'); $uuid = $this->getUUID(); if ($this->tokenIsExpired()) { $result = $this->authenticate(); if (ErrorHandler::isError($result)) return ErrorHandler::error(); } $gebdat = str_replace("-", "", $person->geburtsdatum); $data = ' '.$uuid.' '.$bildungseinrichtung.' '.$gebdat.' '.$person->geschlecht.' '.$person->matrikelnummer.''; if (isset($person->matura) && $person->matura != '') $data .= ''.$person->matura.''; else $data .= '00000000'; $data .= ''.$person->nachname.''; if (isset($person->plz) && $person->plz != '') $data .= ''.$person->plz.''; $data .= ''.$person->staat.''; if (isset($person->svnr) && $person->svnr != '') $data .= ''.$person->svnr.''; $data .= ''.$person->vorname.''; if (isset($person->writeonerror) && $person->writeonerror === true) $data .= 'J'; $data .= ' '; $curl = curl_init(); $url = self::DVB_URL_WEBSERVICE_MELDUNG; curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); $headers = array( 'Accept: application/xml', 'Content-Type: application/xml', 'Authorization: Bearer '.$this->authentication->access_token, 'User-Agent: FHComplete', 'Connection: Keep-Alive', 'Expect:' ); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); $this->debug('Request URL:'.$url); $this->debug('Request Data:'.$data); $response = curl_exec($curl); $curl_info = curl_getinfo($curl); curl_close($curl); $this->debug('Response: '.$curl_info['http_code']); $this->debug('Response: '.print_r($response, true)); /* 200 Fehlermeldung b76e84a9-c0bd-494c-97cb-c4ab9cd452c5 ZD01471 90 UNI-Kennzeichen UNI-Kennzeichen fehlt oder ungültig (FHTEST) BRZ FHTEST AG21333 65 Datum allg.Univ.reife kein gültiges Datum oder Format Korrektur Datum allg. Univ.reife oder 000000 angeben, falls nicht anwendbar leer ZD10073 90 Matrikelnummer aus ungültigem Kontingent Korrektur der Matrikelnummer 12345678 ED10065 E bPK fehlt oder anders als im Datenverbund ermittelt(Yl329U/jt7fjoo5p+z4lH37ZKrg=) Zurückgemeldete bPK in den lokalen Datenbestand übernehmen. Fallsim Fehlertext keine bPK enthalten ist, müssen die Personendaten geprüft und ggf. ergänzt werden (Abgleich von Name/Geburtsdatum/Adresse mit dem zentralen Melderegister) Yl329keinEchtesbPK4lH37ZKrg= */ /* 200 ok 8b239582-6bc5-4193-ac79-2dcf9ec96439 */ if ($curl_info['http_code'] == '200') { $dom = new DOMDocument(); $dom->loadXML($response); $domnodes_fehlerliste = $dom->getElementsByTagName('fehlerliste'); $fehleranzahl = $domnodes_fehlerliste->item(0)->getAttribute('fehleranzahl'); if ($fehleranzahl === '0') { // Keine Fehler -> Meldung erfolgreich $retval = new stdClass(); $retval->matrikelnummer = $person->matrikelnummer; return ErrorHandler::success($retval); } else { $this->errormsg = 'Es gab '.$fehleranzahl.' Fehler:'; $domnodes_fehler = $dom->getElementsByTagName('fehler'); foreach ($domnodes_fehler as $row) { $fehlernummer = $row->getElementsByTagName('fehlernummer'); /** * Bei Fehlernummer ED10065 wurde die Matrikelnummer korrekt gesetzt. * Das BPK wurde vom Datenverbund versucht zu ermitteln und wird in der Fehlermeldung * zurückgeliefert. Dieses sollte dann gespeichert werden. * Es muss eine erneute Vergabemeldung mit korrigierten Daten vorgenommen werden um die Daten im * DVB zu aktualisieren * Dies gilt nur, wenn ED10065 alleine geliefert wird und keine sonstigen Fehler auftreten */ if ($fehlernummer->length == 1 && $fehlernummer->item(0)->textContent == 'ED10065') { $this->debug('ED10065 Response'); $domnodes_feldinhalt = $row->getElementsByTagName('feldinhalt'); if ($domnodes_feldinhalt->length > 0 && $domnodes_feldinhalt->item(0)->textContent!='') { $bpk = $domnodes_feldinhalt->item(0)->textContent; $retval = new stdClass(); $retval->matrikelnummer = $person->matrikelnummer; if ($bpk != 'keine bPK gefunden') $retval->bpk = $bpk; $this->errormsg .= 'ED10065 Response'; $this->errormsg .= 'Eine Personendatenprüfung ist erforderlich'; $this->errormsg .= 'Danach muss eine erneute Vergabemeldung mit dieser Matrikelnummer erfolgen.'; $this->debug('BPK:'.$bpk); $this->debug('MatrNr:'.$person->matrikelnummer); return ErrorHandler::success($retval); } } else { $datenfeld = $row->getElementsByTagName('datenfeld'); $fehlertext = $row->getElementsByTagName('fehlertext'); $this->errormsg .= ' Datenfeld:'.$datenfeld->item(0)->textContent; $this->errormsg .= ' Fehlertext:'.$fehlertext->item(0)->textContent; } } return ErrorHandler::error(); } } else { $errormsg = 'Request Failed with HTTP Code:'.$curl_info['http_code'].' and Response:'.$response; return ErrorHandler::error($errormsg); } } public function setMatrikelnummerErnp($bildungseinrichtung, $person, $reisepass) { $this->debug('ernpMeldung'); $uuid = $this->getUUID(); if ($this->tokenIsExpired()) { $result = $this->authenticate(); if (ErrorHandler::isError($result)) return ErrorHandler::error(); } $data = ''; $data .= ' '.$uuid.''; $data .= $this->getPersonmeldungXml($bildungseinrichtung, $person); $data .= ' '.$reisepass->ausgabedatum.' '.$reisepass->ausstellBehoerde.' '.$reisepass->ausstellland.' '.$reisepass->dokumentnr.' '.$reisepass->dokumenttyp.' '; $data .= ''; $curl = curl_init(); $url = self::DVB_URL_WEBSERVICE_MELDUNG; curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); $headers = array( 'Accept: application/xml', 'Content-Type: application/xml', 'Authorization: Bearer '.$this->authentication->access_token, 'User-Agent: FHComplete', 'Connection: Keep-Alive', 'Expect:' ); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); $this->debug('Request URL:'.$url); $this->debug('Request Data:'.$data); $response = curl_exec($curl); $curl_info = curl_getinfo($curl); curl_close($curl); $this->debug('Response: '.$curl_info['http_code']); $this->debug('Response: '.print_r($response, true)); if ($curl_info['http_code'] == '200') { $dom = new DOMDocument(); $dom->loadXML($response); $domnodes_fehlerliste = $dom->getElementsByTagName('fehlerliste'); $fehleranzahl = $domnodes_fehlerliste->item(0)->getAttribute('fehleranzahl'); if ($fehleranzahl === '0') { // Keine Fehler -> Meldung erfolgreich $retval = new stdClass(); $retval->matrikelnummer = $person->matrikelnummer; return ErrorHandler::success($retval); } else { $this->errormsg = 'Es gab '.$fehleranzahl.' Fehler:'; $domnodes_fehler = $dom->getElementsByTagName('fehler'); foreach ($domnodes_fehler as $row) { $fehlernummer = $row->getElementsByTagName('fehlernummer'); /** * Bei Fehlernummer ED10065 wurde die Matrikelnummer korrekt gesetzt. * Das BPK wurde vom Datenverbund versucht zu ermitteln und wird in der Fehlermeldung * zurückgeliefert. Dieses sollte dann gespeichert werden. * Es muss eine erneute Vergabemeldung mit korrigierten Daten vorgenommen werden um die Daten im * DVB zu aktualisieren * Dies gilt nur, wenn ED10065 alleine geliefert wird und keine sonstigen Fehler auftreten */ if ($fehlernummer->length == 1 && $fehlernummer->item(0)->textContent == 'ED10065') { $this->debug('ED10065 Response'); $domnodes_feldinhalt = $row->getElementsByTagName('feldinhalt'); if ($domnodes_feldinhalt->length > 0 && $domnodes_feldinhalt->item(0)->textContent!='') { $bpk = $domnodes_feldinhalt->item(0)->textContent; $retval = new stdClass(); $retval->matrikelnummer = $person->matrikelnummer; if ($bpk != 'keine bPK gefunden') $retval->bpk = $bpk; $this->errormsg .= 'ED10065 Response'; $this->errormsg .= 'Eine Personendatenprüfung ist erforderlich'; $this->errormsg .= 'Danach muss eine erneute Vergabemeldung mit dieser Matrikelnummer erfolgen.'; $this->debug('BPK:'.$bpk); $this->debug('MatrNr:'.$person->matrikelnummer); return ErrorHandler::success($retval); } } else { $datenfeld = $row->getElementsByTagName('datenfeld'); $fehlertext = $row->getElementsByTagName('fehlertext'); $this->errormsg .= ' Datenfeld:'.$datenfeld->item(0)->textContent; $this->errormsg .= ' Fehlertext:'.$fehlertext->item(0)->textContent; } } return ErrorHandler::error(); } } else { $errormsg = 'Request Failed with HTTP Code:'.$curl_info['http_code'].' and Response:'.$response; return ErrorHandler::error($errormsg); } } /** * Get BPK from Person * @param string $person_id ID of the Person. * @return BPK or false on error. */ public function getBPK($person_id) { $person = new person(); if ($person->load($person_id)) { if ($person->bpk != '') { // BPK exisitert bereits $retval = new stdClass(); $retval->bpk = $person->bpk; return ErrorHandler::success($retval); } if ($person->gebdatum == '') { $errormsg = 'Geburtsdatum ist nicht gesetzt'; return ErrorHandler::error($errormsg); } if ($person->vorname == '') { $errormsg = 'Vorname ist nicht gesetzt'; return ErrorHandler::error($errormsg); } if ($person->nachname == '') { $errormsg = 'Nachname ist nicht gesetzt'; return ErrorHandler::error($errormsg); } $geburtsdatum = str_replace("-", "", $person->gebdatum); $vorname = $person->vorname; $nachname = $person->nachname; $geschlecht = mb_strtoupper($person->geschlecht); $adresse = new adresse(); $adresse->loadZustellAdresse($person_id); /** * Wenn die Person beim Ersten mal nicht eindeutig gefunden wird, * dann wird nochmal versucht mit Postleitzahl und ggf ein drittes * mal mit der Strasse der Person */ $try = 1; $plz = null; $strasse = null; while ($try <= 3) { if ($try == 2) { $plz = $adresse->plz; } elseif ($try == 3) { $plz = $adresse->plz; $strasse = $adresse->strasse; } // Versuchen BPK zu ermitteln $data = $this->pruefeBPK($geburtsdatum, $vorname, $nachname, $geschlecht, $plz, $strasse); if (ErrorHandler::isSuccess($data)) { // gefunden return ErrorHandler::success($data->retval); } elseif (!ErrorHandler::hasData($data)) { // nicht gefunden return ErrorHandler::error(); } else { // mehrere gefunden if (isset($data->retval->multiple) && $data->retval->multiple === true) { // ggf nochmal versuchen mit weiteren Parametern } else { return ErrorHandler::error(); } } $try++; } // nicht eindeutig auffindbar return ErrorHandler::error(); } else { $this->errormsg = $person->errormsg; return ErrorHandler::error(); } } /** * Get BPK from Person * @param string $geburtsdatum Geburtsdatum der Person im format YYYYMMDD * @param $vorname Vorname der Person. * @param $nachname Nachname der Person. * @param $geschlecht Geschlecht der Person M | W * @param $plz Postleitzahl der Person (optional). * @param $strasse Strasse der Person (optional). * @return BPK or false on error. */ public function pruefeBPK($geburtsdatum, $vorname, $nachname, $geschlecht, $plz = null, $strasse = null) { if ($this->tokenIsExpired()) { $result = $this->authenticate(); if (ErrorHandler::isError($result)) return ErrorHandler::error(); } $this->debug('getBPK'); $curl = curl_init(); $uuid = $this->getUUID(); $url = self::DVB_URL_WEBSERVICE_BPK; $url .= '?geburtsdatum='.curl_escape($curl, $geburtsdatum); $url .= '&vorname='.curl_escape($curl, $vorname); $url .= '&nachname='.curl_escape($curl, $nachname); $url .= '&geschlecht='.curl_escape($curl, $geschlecht); $url .= '&uuid='.curl_escape($curl, $uuid); if (!is_null($plz)) $url .= '&plz='.curl_escape($curl, $plz); if (!is_null($strasse)) $url .= '&strasse='.curl_escape($curl, $strasse); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $headers = array( 'Accept: application/json', 'Authorization: Bearer '.$this->authentication->access_token, 'User-Agent: FHComplete', 'Connection: Keep-Alive', 'Expect:', 'Content-Length: 0' ); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); $this->debug('Sending Request to '.$url); $response = curl_exec($curl); $curl_info = curl_getinfo($curl); curl_close($curl); $this->debug('ResponseCode: '.$curl_info['http_code']); $this->debug('ResponseData: '.print_r($response, true)); if ($curl_info['http_code'] == '200') { /* Example Response: 12345ABCDEFGHXXXXXXX= Hans Huber M 1990-01-01 1100 Example Error: ED10065 E bPK fehlt oder anders als im Datenverbund ermittelt (keine bPK gefunden) Zurückgemeldete bPK in den lokalen Datenbestand übernehmen. Falls im Fehlertext keine bPK enthalten ist, müssen die Personendaten geprüft und ggf. ergänzt werden (Abgleich von Name/Geburtsdatum/Adresse mit dem zentralen Melderegister) keine bPK gefunden */ $dom = new DOMDocument(); $dom->loadXML($response); $namespace = 'http://www.brz.gv.at/datenverbund-unis'; $domnodes_fehlernummer = $dom->getElementsByTagNameNS($namespace, 'fehlernummer'); if ($domnodes_fehlernummer->length > 0) { $fehlercode = $domnodes_fehlernummer->item(0)->textContent; if ($fehlercode == 'ZD00001') { // Zu viele Requests pro Minute $this->debug('Zu viele Requests pro Minute -> Pause'); sleep(30); } } $domnodes_bpk = $dom->getElementsByTagNameNS($namespace, 'bpk'); if ($domnodes_bpk->length > 0) { $retval = new stdClass(); $retval->bpk = $domnodes_bpk->item(0)->textContent; return ErrorHandler::success($retval); } else { $retval = new stdClass(); $domnodes_personen = $dom->getElementsByTagNameNS($namespace, 'personInfo'); if ($domnodes_personen->length > 1) { $retval = new stdClass(); $retval->multiple = true; return ErrorHandler::error(null, $retval); } } return ErrorHandler::error(); } else { $errormsg = 'Request Failed with HTTP Code:'.$curl_info['http_code'].' and Response:'.$response; return ErrorHandler::error($errormsg); } } /** * Prueft ob eine Person aufgrund Nachname und Geburtsdatum gefunden wird * @param $person_id PersonID der gesuchten Person. * @return Success wenn gefunden, error wenn nicht gefunden. Hat die Person 100% Uebereinstimmung der Daten * dann wird auch MatrNr und BPK als Retrun geliefert. */ public function existsByNachname($person_id) { $person = new person(); if ($person->load($person_id)) { $result = $this->getMatrikelnrByNachname($person->nachname, $person->gebdatum); if (ErrorHandler::isSuccess($result) && ErrorHandler::hasData($result) && isset($result->retval->data) && is_array($result->retval->data) && count($result->retval->data)>0) { foreach($result->retval->data as $row) { if (isset($row->vorname) && isset($row->nachname)) { $this->debug('Eintrag gefunden -> Pruefe Eindeutigkeit'); // Vorpruefung des Datenverbund if (mb_substr(mb_strtolower($row->vorname),0,5) == mb_substr(mb_strtolower($person->vorname),0,5) && mb_substr(mb_strtolower($row->nachname),0,10) == mb_substr(mb_strtolower($person->nachname),0,10)) { // Bei 100% eindeutiger Uebereinstimmung werden die Daten zurueckgeliefert if (mb_strtolower($row->geschlecht) == mb_strtolower($person->geschlecht) && $row->staatsangehoerigkeit == $person->staatsbuergerschaft && mb_strtolower($row->nachname) == mb_strtolower($person->nachname) && ( mb_strtolower($row->vorname) == mb_strtolower($person->vorname) || mb_strtolower($row->vorname) == mb_strtolower($person->vorname.' '.$person->vornamen) ) && $row->matrikelnummer != '' && count($result->retval->data) == 1 ) { $this->debug('Uebereinstimmung gefunden'); $retval = new stdClass(); if (isset($row->bpk) && $row->bpk!='') $retval->bpk = $row->bpk; $retval->matrikelnummer = $row->matrikelnummer; return ErrorHandler::success($retval); } else { $this->debug('keine 100% Eindeutigkeit gegeben:'.print_r($result->retval->data,true)); // Uebereinstimmung gefunden aber nicht 100% eindeutig return ErrorHandler::success(); } } else { $this->debug('keine 100% Eindeutigkeit beim Namen gegeben:'.print_r($result->retval->data,true)); // Uebereinstimmung gefunden aber nicht 100% eindeutig return ErrorHandler::success(); } } } $this->debug('Keine Uebereinstimmung per Namenssuche'); return ErrorHandler::error(); } else { return ErrorHandler::error(); } } } /** * Get Matrikelnummer by Surname * @param string $nachname Surname of Person. * @param string $geburtsdatum Date of Birth * @return Matrikelnummer or false on error. */ public function getMatrikelnrByNachname($nachname, $geburtsdatum) { if ($this->tokenIsExpired()) { $result = $this->authenticate(); if (ErrorHandler::isError($result)) return ErrorHandler::error(); } $this->debug('getMatrikelnrByNachname'); $curl = curl_init(); $geburtsdatum = str_replace("-", "", $geburtsdatum); $uuid = $this->getUUID(); $url = self::DVB_URL_WEBSERVICE_NACHNAME; $url .= '?nachName='.curl_escape($curl, $nachname); $url .= '&geburtsDatum='.curl_escape($curl, $geburtsdatum); $url .= '&uuid='.curl_escape($curl, $uuid); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $headers = array( 'Accept: application/json', 'Authorization: Bearer '.$this->authentication->access_token, 'User-Agent: FHComplete', 'Connection: Keep-Alive', 'Expect:', 'Content-Length: 0' ); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); $this->debug('Sending Request to '.$url); $response = curl_exec($curl); $curl_info = curl_getinfo($curl); curl_close($curl); $this->debug('ResponseCode: '.$curl_info['http_code']); $this->debug('ResponseData: '.print_r($response, true)); if ($curl_info['http_code'] == '200') { /* Example Response: 12345678 Max sdfaASDAFasdfads+asasdffd= Mustermann M 1999-02-19 A */ $dom = new DOMDocument(); $dom->loadXML($response); $namespace = 'http://www.brz.gv.at/datenverbund-unis'; $domnodes_student = $dom->getElementsByTagNameNS($namespace, 'student'); $retval = new stdClass(); $retval->data = array(); foreach ($domnodes_student as $row_student) { // Wenn nicht gesperrt und fix vergeben $ingesamtpool = $row_student->getAttribute('inGesamtPool'); $gesperrt = $row_student->getAttribute('gesperrt'); if ($ingesamtpool == 'true' && $gesperrt == 'false') { $data = new stdClass(); $domnodes_matrikelnummer = $row_student->getElementsByTagNameNS($namespace, 'matrikelNummer'); foreach ($domnodes_matrikelnummer as $row) { // MatrikelNr Found $data->matrikelnummer = $row->textContent; break; } $domnodes_bpk = $row_student->getElementsByTagNameNS($namespace, 'personenkennzeichen'); foreach ($domnodes_bpk as $row) { // BPK Found $data->bpk = $row->textContent; break; } $domnodes = $row_student->getElementsByTagNameNS($namespace, 'vorName'); if ($domnodes->length>0) $data->vorname = $domnodes->item(0)->textContent; $domnodes = $row_student->getElementsByTagNameNS($namespace, 'nachName'); if ($domnodes->length>0) $data->nachname = $domnodes->item(0)->textContent; $domnodes = $row_student->getElementsByTagNameNS($namespace, 'geschlecht'); if ($domnodes->length>0) $data->geschlecht = $domnodes->item(0)->textContent; $domnodes = $row_student->getElementsByTagNameNS($namespace, 'staatsAngehoerigkeit'); if ($domnodes->length > 0) $data->staatsangehoerigkeit = $domnodes->item(0)->textContent; $retval->data[] = $data; } } return ErrorHandler::success($retval); } else { $errormsg = 'Request Failed with HTTP Code:'.$curl_info['http_code'].' and Response:'.$response; return ErrorHandler::error($errormsg); } } /** * Get Matrikelnummer by Name * @param string $nachname Surname of Person. * @param string $vorname Firstname of Person. * @param string $geburtsdatum Date of Birth * @return Matrikelnummer or false on error. */ public function getMatrikelnrByName($nachname, $vorname, $geburtsdatum) { if ($this->tokenIsExpired()) { $result = $this->authenticate(); if (ErrorHandler::isError($result)) return ErrorHandler::error(); } $this->debug('getMatrikelnrByName'); $curl = curl_init(); $geburtsdatum = str_replace("-", "", $geburtsdatum); $uuid = $this->getUUID(); $url = self::DVB_URL_WEBSERVICE_NAME; $url .= '?nachName='.curl_escape($curl, $nachname); $url .= '&vorName='.curl_escape($curl, $vorname); $url .= '&geburtsDatum='.curl_escape($curl, $geburtsdatum); $url .= '&uuid='.curl_escape($curl, $uuid); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $headers = array( 'Accept: application/json', 'Authorization: Bearer '.$this->authentication->access_token, 'User-Agent: FHComplete', 'Connection: Keep-Alive', 'Expect:', 'Content-Length: 0' ); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); $this->debug('Sending Request to '.$url); $response = curl_exec($curl); $curl_info = curl_getinfo($curl); curl_close($curl); $this->debug('ResponseCode: '.$curl_info['http_code']); $this->debug('ResponseData: '.print_r($response, true)); if ($curl_info['http_code'] == '200') { /* Example Response: 12345678 Max sdfaASDAFasdfads+asasdffd= Mustermann M 1999-02-19 A */ $dom = new DOMDocument(); $dom->loadXML($response); $namespace = 'http://www.brz.gv.at/datenverbund-unis'; $domnodes_student = $dom->getElementsByTagNameNS($namespace, 'student'); $retval = new stdClass(); $retval->data = array(); foreach ($domnodes_student as $row_student) { // Wenn nicht gesperrt und fix vergeben $ingesamtpool = $row_student->getAttribute('inGesamtPool'); $gesperrt = $row_student->getAttribute('gesperrt'); if ($ingesamtpool == 'true' && $gesperrt == 'false') { $data = new stdClass(); $domnodes_matrikelnummer = $row_student->getElementsByTagNameNS($namespace, 'matrikelNummer'); foreach ($domnodes_matrikelnummer as $row) { // MatrikelNr Found $data->matrikelnummer = $row->textContent; break; } $domnodes_bpk = $row_student->getElementsByTagNameNS($namespace, 'personenkennzeichen'); foreach ($domnodes_bpk as $row) { // BPK Found $data->bpk = $row->textContent; break; } $domnodes = $row_student->getElementsByTagNameNS($namespace, 'vorName'); if ($domnodes->length>0) $data->vorname = $domnodes->item(0)->textContent; $domnodes = $row_student->getElementsByTagNameNS($namespace, 'nachName'); if ($domnodes->length>0) $data->nachname = $domnodes->item(0)->textContent; $domnodes = $row_student->getElementsByTagNameNS($namespace, 'geschlecht'); if ($domnodes->length>0) $data->geschlecht = $domnodes->item(0)->textContent; $domnodes = $row_student->getElementsByTagNameNS($namespace, 'staatsAngehoerigkeit'); if ($domnodes->length > 0) $data->staatsangehoerigkeit = $domnodes->item(0)->textContent; $retval->data[] = $data; } } return ErrorHandler::success($retval); } else { $errormsg = 'Request Failed with HTTP Code:'.$curl_info['http_code'].' and Response:'.$response; return ErrorHandler::error($errormsg); } } /** * Get Persondata by Matrikelnummer * @param string $matrikelnr Matrikelnummer of Person. * @return Matrikelnummer or false on error. */ public function getDataByMatrikelnr($matrikelnr) { if ($this->tokenIsExpired()) { $result = $this->authenticate(); if (ErrorHandler::isError($result)) return ErrorHandler::error(); } $this->debug('getDataByMatrikelnr'); $curl = curl_init(); $uuid = $this->getUUID(); $url = self::DVB_URL_WEBSERVICE_MATRIKELNUMMER; $url .= '?matrikelNummer='.curl_escape($curl, $matrikelnr); $url .= '&uuid='.curl_escape($curl, $uuid); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $headers = array( 'Accept: application/json', 'Authorization: Bearer '.$this->authentication->access_token, 'User-Agent: FHComplete', 'Connection: Keep-Alive', 'Expect:', 'Content-Length: 0' ); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); $this->debug('Sending Request to '.$url); $response = curl_exec($curl); $curl_info = curl_getinfo($curl); curl_close($curl); $this->debug('ResponseCode: '.$curl_info['http_code']); $this->debug('ResponseData: '.print_r($response, true)); if ($curl_info['http_code'] == '200') { /* Example Response: 12345678 Max sdfaASDAFasdfads+asasdffd= Mustermann M 1999-02-19 A */ $dom = new DOMDocument(); $dom->loadXML($response); $namespace = 'http://www.brz.gv.at/datenverbund-unis'; $domnodes_student = $dom->getElementsByTagNameNS($namespace, 'student'); $retval = new stdClass(); $retval->data = array(); foreach ($domnodes_student as $row_student) { // Wenn nicht gesperrt und fix vergeben $ingesamtpool = $row_student->getAttribute('inGesamtPool'); $gesperrt = $row_student->getAttribute('gesperrt'); if ($ingesamtpool == 'true' && $gesperrt == 'false') { $data = new stdClass(); $domnodes_matrikelnummer = $row_student->getElementsByTagNameNS($namespace, 'matrikelNummer'); foreach ($domnodes_matrikelnummer as $row) { // MatrikelNr Found $data->matrikelnummer = $row->textContent; break; } $domnodes_bpk = $row_student->getElementsByTagNameNS($namespace, 'personenkennzeichen'); foreach ($domnodes_bpk as $row) { // BPK Found $data->bpk = $row->textContent; break; } $domnodes = $row_student->getElementsByTagNameNS($namespace, 'vorName'); if ($domnodes->length>0) $data->vorname = $domnodes->item(0)->textContent; $domnodes = $row_student->getElementsByTagNameNS($namespace, 'nachName'); if ($domnodes->length>0) $data->nachname = $domnodes->item(0)->textContent; $domnodes = $row_student->getElementsByTagNameNS($namespace, 'geschlecht'); if ($domnodes->length>0) $data->geschlecht = $domnodes->item(0)->textContent; $domnodes = $row_student->getElementsByTagNameNS($namespace, 'staatsAngehoerigkeit'); if ($domnodes->length > 0) $data->staatsangehoerigkeit = $domnodes->item(0)->textContent; $retval->data[] = $data; } } return ErrorHandler::success($retval); } else { $errormsg = 'Request Failed with HTTP Code:'.$curl_info['http_code'].' and Response:'.$response; return ErrorHandler::error($errormsg); } } /** * Generiert eine eindeutige UUID * @return uuid */ private function getUUID() { $data = openssl_random_pseudo_bytes(16); $data[6] = chr(ord($data[6]) & 0x0f | 0x40); // set version to 0100 $data[8] = chr(ord($data[8]) & 0x3f | 0x80); // set bits 6-7 to 10 return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4)); } /** * Erstellt eine Debug Message * @param string $msg Message to log. * @return void */ private function debug($msg) { if ($this->debug) $this->debug_output .= "\n".date('Y-m-d H:i:s').': '.$msg; } private function getPersonmeldungXml($bildungseinrichtung, $person) { $gebdat = str_replace("-", "", $person->geburtsdatum); $data = ' '.$bildungseinrichtung.' '.$gebdat.' '.$person->geschlecht.' '.$person->matrikelnummer.''; if (isset($person->matura) && $person->matura != '') $data .= ''.$person->matura.''; else $data .= '00000000'; $data .= ''.$person->nachname.''; if (isset($person->plz) && $person->plz != '') $data .= ''.$person->plz.''; $data .= ''.$person->staat.''; if (isset($person->svnr) && $person->svnr != '') $data .= ''.$person->svnr.''; $data .= ''.$person->vorname.''; if (isset($person->writeonerror) && $person->writeonerror === true) $data .= 'J'; $data .= ' '; return $data; } /** * 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(); } }