,
*/
/**
* 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__).'/kennzeichen.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.6/matrikelreservierung.xml';
const DVB_URL_WEBSERVICE_MELDUNG = DVB_PORTAL.'/rws/0.6/matrikelmeldung.xml';
const DVB_URL_WEBSERVICE_BPK = DVB_PORTAL.'/rws/0.6/pruefebpk.xml';
const DVB_URL_WEBSERVICE_BPK_ALL = DVB_PORTAL.'/rws/0.8/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);
$gebdat = $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)
{
$vbpkTypes = defined('VBPK_TYPES') && is_array(VBPK_TYPES) ? VBPK_TYPES : null;
$person = new person();
if ($person->load($person_id))
{
if ($person->bpk != '')
{
$retval = new stdClass();
$retval->bpk = $person->bpk;
// BPK existiert bereits
if (!isset($vbpkTypes)) return ErrorHandler::success($retval);
$kennzeichen = new kennzeichen();
if ($kennzeichen->load_pers($person_id, $vbpkTypes))
{
if (array_unique(array_column($kennzeichen->result, 'kennzeichentyp_kurzbz')) == array_values($vbpkTypes))
{
// BPKs exisiteren bereits
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);
$geburtsdatum = $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)
{
$vbpkTypes = defined('VBPK_TYPES') && is_array(VBPK_TYPES) ? VBPK_TYPES : 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_ALL;
$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:
5cc93441-a46a-4f97-a5e3-e64891b39f10
12345ABCDEFG
12345ABCDEFG
12345ABCDEFG
12345ABCDEFG
true
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;
// vbpks auslesen
$domnodes_vbpks = $dom->getElementsByTagNameNS($namespace, 'vbpk');
$retval->vbpks = array();
if ($domnodes_vbpks->length > 0)
{
foreach ($domnodes_vbpks as $domnode_vbpk)
{
foreach ($domnode_vbpk->attributes as $attribute)
{
if ($attribute->nodeName == 'bereich' && isset($vbpkTypes[$attribute->nodeValue]))
{
$retval->vbpks[$vbpkTypes[$attribute->nodeValue]] = $domnode_vbpk->nodeValue;
}
}
}
}
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);
}
else
{
$errorTexts = array();
$domnodes_fehler = $dom->getElementsByTagNameNS($namespace, 'fehlerliste');
if ($domnodes_fehler->length > 0)
{
foreach ($domnodes_fehler as $domnode_fehler)
{
if ($domnode_fehler->childNodes->length > 0)
{
foreach ($domnode_fehler->childNodes as $childNode)
{
$errorTexts[] = $childNode->nodeValue;
}
}
}
$this->errormsg = count($errorTexts) > 0 ? implode('; ', $errorTexts) : null;
return ErrorHandler::error(null);
}
}
}
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();
}
}