Files
FHC-Core/include/dvb.class.php
T
Andreas Österreicher 53684c4d50 Datenverbund Schnittstelle aktualisiert
- neue Option für Softrun hinzugefügt um bestehende Matrikelnummern zu
importieren ohne eine Vergabemeldung durchzuführen.
- Matrikelnummernabfrage nach Nachname und Geburtsdatum hinzugefügt
- Zusätzliche Prüfung hinzugefügt wenn die Person nicht nach
SVNR/Ersatzkennzeichen gefunden wird, wird alternativ nach Name und
Geburtsdatum gesucht. Wenn hier ein Eintrag gefunden wird, erfolgt keine
Vergabemeldung da hier manuell geprüft werden muss ob es sich um die
selbe Person handelt
2018-11-02 16:44:40 +01:00

1424 lines
42 KiB
PHP

<?php
/* Copyright (C) 2018 fhcomplete.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
* Authors: Andreas Oesterreicher <andreas.oesterreicher@technikum-wien.at>,
*/
/**
* 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_RESERVIERUNG = DVB_PORTAL.'/dvb/matrikelnummern/1.0/reservierung.xml';
const DVB_URL_WEBSERVICE_MELDUNG = DVB_PORTAL.'/dvb/matrikelnummern/1.0/meldung.xml';
const DVB_URL_WEBSERVICE_BPK = DVB_PORTAL.'/rws/0.2/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))
{
$this->errormsg = $person->errormsg;
return ErrorHandler::error();
}
$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
{
$this->logRequest($person, 'getMatrikelnrBySVNR', false);
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
{
$this->logRequest($person, 'getMatrikelnrByErsatzkennzeichen', false);
return ErrorHandler::error();
}
}
else
{
$this->errormsg = 'Person braucht SVNR oder Ersatzkennzeichen';
return ErrorHandler::error();
}
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())
{
$this->logRequest($person, 'assignExistingMatrikelnummer', true, $matrikelnummer);
return ErrorHandler::success();
}
}
else
{
if($this->existsByName($person_id))
{
$this->errormsg = 'Namenssuche ergab Treffer -> manuelle Pruefung erforderlich';
return ErrorHandler::error();
}
if($softrun == true)
{
$this->errormsg = 'Nicht gefunden Softrun enabled keine Meldung';
return ErrorHandler::error();
}
// Es wurde noch keine Matrikelnummer zu dieser Person zugeordnet
// Es wird eine neue Matrikelnummer aus dem Kontingent angefordert
// und an die Person vergeben
// Studienjahr ermitteln
$qry = "
SELECT
studiensemester_kurzbz, prestudent_id
FROM
public.tbl_student
JOIN public.tbl_prestudent USING(prestudent_id)
JOIN public.tbl_prestudentstatus USING(prestudent_id)
JOIN public.tbl_benutzer ON(tbl_student.student_uid = tbl_benutzer.uid)
WHERE
tbl_prestudent.person_id=".$this->db_add_param($person->person_id)."
AND tbl_benutzer.aktiv
AND tbl_prestudentstatus.status_kurzbz='Student'
AND tbl_prestudent.bismelden
ORDER BY tbl_prestudentstatus.datum desc LIMIT 1
";
$prestudent_id = '';
$studiensemester_kurzbz = '';
if ($result = $this->db_query($qry))
{
if ($row = $this->db_fetch_object($result))
{
$studiensemester_kurzbz = $row->studiensemester_kurzbz;
$prestudent_id = $row->prestudent_id;
}
else
{
$this->logRequest($person, 'assignNewMatrikelnummer', false);
$this->errormsg = 'Fehler beim Ermitteln des Studienjahrs für diese Person';
return ErrorHandler::error();
}
}
else
{
$this->logRequest($person, 'assignNewMatrikelnummer', false);
$this->errormsg = 'Fehler beim Ermitteln des Studienjahrs für diese Person';
return ErrorHandler::error();
}
$studienjahr = substr($studiensemester_kurzbz, 4);
$art = substr($studiensemester_kurzbz, 0, 2);
if ($art == 'SS')
$studienjahr = $studienjahr - 1;
// Erstaustattung im Jahr 2018. Alle davor bekommen 18er Nummern
if ($studienjahr < 2018)
$studienjahr = 2018;
// Neue Matrikelnummer aus Kontingent anfordern
$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())
{
$this->logRequest($person, 'assignNewMatrikelnummer', true, $matrikelnummer);
return ErrorHandler::success();
}
}
else
{
$this->logRequest($person, 'assignNewMatrikelnummer', false, $person_meldung);
$this->errormsg .= 'Vergabe fehlgeschlagen';
return ErrorHandler::error();
}
}
else
{
$this->logRequest($person, 'assignNewMatrikelnummer', false, $studienjahr);
$this->errormsg .= 'Failed to get Kontingent';
return ErrorHandler::error();
}
}
}
}
/**
* 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');
$curl = curl_init();
$url = self::DVB_URL_WEBSERVICE_SVNR;
$url .= '?sozialVersicherungsNummer='.curl_escape($curl, $svnr);
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:
<uni:simpleStudentResponse xmlns:uni="http://www.brz.gv.at/datenverbund-unis">
<uni:student inStudienBeitragsPool="false" inGesamtPool="true" gesperrt="false">
<uni:matrikelNummer>12345678</uni:matrikelNummer>
<uni:vorName>Max</uni:vorName>
<uni:personenkennzeichen>sdfaASDAFasdfads+asasdffd=</uni:personenkennzeichen>
<uni:nachName>Mustermann</uni:nachName>
<uni:geschlecht>M</uni:geschlecht>
<uni:geburtsDatum>1999-02-19</uni:geburtsDatum>
<uni:staatsAngehoerigkeit>A</uni:staatsAngehoerigkeit>
</uni:student>
</uni:simpleStudentResponse>
*/
$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
{
$this->errormsg = 'Request Failed with HTTP Code:'.$curl_info['http_code'].' and Response:'.$response;
return ErrorHandler::error();
}
}
/**
* 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();
$url = self::DVB_URL_WEBSERVICE_ERSATZKZ;
$url .= '?ersatzKennzeichen='.curl_escape($curl, $ersatzkennzeichen);
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
<uni:simpleStudentResponse xmlns:uni="http://www.brz.gv.at/datenverbund-unis">
<uni:student inStudienBeitragsPool="true" inGesamtPool="false">
<uni:uniKennzeichen>A</uni:uniKennzeichen>
<uni:matrikelNummer>12345678</uni:matrikelNummer>
<uni:semesterKennzeichen>2017S</uni:semesterKennzeichen>
<uni:ersatzKennzeichen>ABCD201093</uni:ersatzKennzeichen>
<uni:akadGradPre>Bc.</uni:akadGradPre>
<uni:vorName>Max</uni:vorName>
<uni:nachName>Mustermann</uni:nachName>
<uni:geschlecht>W</uni:geschlecht>
<uni:geburtsDatum>1993-06-26</uni:geburtsDatum>
<uni:staatsAngehoerigkeit>TCH</uni:staatsAngehoerigkeit>
<uni:wohnAdresse>
<uni:staat>A</uni:staat>
<uni:plz>1030</uni:plz>
<uni:ort>Wien</uni:ort>
<uni:strasse>Obere Bahngasse 20/12</uni:strasse>
</uni:wohnAdresse>
<uni:zustellAdresse>
<uni:staat>A</uni:staat>
<uni:plz>1030</uni:plz>
<uni:ort>Wien</uni:ort>
<uni:strasse>Obere Bahngasse 20/12</uni:strasse>
</uni:zustellAdresse>
</uni:student>
<uni:student inStudienBeitragsPool="false" inGesamtPool="true" gesperrt="false">
<uni:matrikelNummer>12345678</uni:matrikelNummer>
<uni:vorName>Max</uni:vorName>
<uni:nachName>Mustermann</uni:nachName>
<uni:geschlecht>W</uni:geschlecht>
<uni:geburtsDatum>1993-06-26</uni:geburtsDatum>
<uni:staatsAngehoerigkeit>TCH</uni:staatsAngehoerigkeit>
</uni:student>
</uni:simpleStudentResponse>
*/
/* 200 - No Entry found
<uni:simpleStudentResponse xmlns:uni="http://www.brz.gv.at/datenverbund-unis"/>
*/
/* 401 Error Code Token Expired
{
"error": "invalid_token",
"error_description": "Access token expired: 64a58ef3-1a70-46e9-b44f-35cc5051ae8e"
}
*/
/* 400 Bad Request
<FehlerAntwort xmlns="http://www.brz.gv.at/datenverbund-unis">
<uuid>318e1bc5-279d-43c4-af47-5e6df2ff5279</uuid>
<fehlerliste fehleranzahl="1">
<fehler>
<fehlernummer>ZD00001</fehlernummer>
<kategorie>Z</kategorie>
<datenfeld/>
<fehlertext>Der Server konnte die Anfrage nicht vearbeiten.</fehlertext>
<massnahme>Required String parameter 'ersatzKennzeichen' is not present</massnahme>
</fehler>
</fehlerliste>
</FehlerAntwort>
*/
$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
{
$this->errormsg = 'Request Failed with HTTP Code:'.$curl_info['http_code'].' and Response:'.$xml_response;
return ErrorHandler::error();
}
}
/**
* 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
<?xml version="1.0" encoding="UTF-8"?>
<matrikelnummernantwort>
<uuid>793d44fa-5646-42b1-b0cb-f2f121b2f14f</uuid>
<fehlerliste fehleranzahl="0"/>
<matrikelnummernliste>
<matrikelnummer>12345678</matrikelnummer>
<matrikelnummer>23456789</matrikelnummer>
</matrikelnummernliste>
</matrikelnummernantwort>
*/
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
{
$this->errormsg = 'Request Failed with HTTP Code:'.$curl_info['http_code'].' and Response:'.$response;
return ErrorHandler::error();
}
}
/**
* 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 = '<?xml version="1.0" encoding="UTF-8"?>
<matrikelnummernanfrage>
<uuid>'.$uuid.'</uuid>
<kontingentblock>
<anzahl>'.$anzahl.'</anzahl>
<be>'.$bildungseinrichtung.'</be>
<sj>'.$studienjahr.'</sj>
</kontingentblock>
</matrikelnummernanfrage>
';
$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
{
$this->errormsg = 'Request Failed with HTTP Code:'.$curl_info['http_code'].' and Response:'.$response;
return ErrorHandler::error();
}
}
/**
* 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 = '<?xml version="1.0" encoding="UTF-8"?>
<matrikelnummernmeldung>
<uuid>'.$uuid.'</uuid>
<personmeldung>
<be>'.$bildungseinrichtung.'</be>
<gebdat>'.$gebdat.'</gebdat>
<geschlecht>'.$person->geschlecht.'</geschlecht>
<matrikel>'.$person->matrikelnummer.'</matrikel>';
if (isset($person->matura) && $person->matura != '')
$data .= '<matura>'.$person->matura.'</matura>';
else
$data .= '<matura>00000000</matura>';
$data .= '<nachname>'.$person->nachname.'</nachname>';
if (isset($person->plz) && $person->plz != '')
$data .= '<plz>'.$person->plz.'</plz>';
$data .= '<staat>'.$person->staat.'</staat>';
if (isset($person->svnr) && $person->svnr != '')
$data .= '<svnr>'.$person->svnr.'</svnr>';
$data .= '<vorname>'.$person->vorname.'</vorname>';
if (isset($person->writeonerror) && $person->writeonerror === true)
$data .= '<writeOnError>J</writeOnError>';
$data .= '
</personmeldung>
</matrikelnummernmeldung>
';
$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
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<matrikelnummernmeldungantwort>
<uuid>b76e84a9-c0bd-494c-97cb-c4ab9cd452c5</uuid>
<fehlerliste fehleranzahl="3">
<fehler>
<fehlernummer>ZD01471</fehlernummer>
<kategorie>90</kategorie>
<datenfeld>UNI-Kennzeichen</datenfeld>
<fehlertext>UNI-Kennzeichen fehlt oder ungültig (FHTEST)</fehlertext>
<massnahme>BRZ</massnahme>
<feldinhalt>FHTEST</feldinhalt>
</fehler>
<fehler>
<fehlernummer>AG21333</fehlernummer>
<kategorie>65</kategorie>
<datenfeld>Datum allg.Univ.reife</datenfeld>
<fehlertext>kein gültiges Datum oder Format</fehlertext>
<massnahme>Korrektur Datum allg. Univ.reife oder 000000 angeben, falls nicht anwendbar</massnahme>
<feldinhalt>leer</feldinhalt>
</fehler>
<fehler>
<fehlernummer>ZD10073</fehlernummer>
<kategorie>90</kategorie>
<datenfeld>Matrikelnummer</datenfeld>
<fehlertext>aus ungültigem Kontingent</fehlertext>
<massnahme>Korrektur der Matrikelnummer</massnahme>
<feldinhalt>12345678</feldinhalt>
</fehler>
<fehler>
<fehlernummer>ED10065</fehlernummer>
<kategorie>E</kategorie>
<datenfeld>bPK</datenfeld>
<fehlertext>fehlt oder anders als im Datenverbund ermittelt(Yl329U/jt7fjoo5p+z4lH37ZKrg=)</fehlertext>
<massnahme>
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)
</massnahme>
<feldinhalt>Yl329keinEchtesbPK4lH37ZKrg=</feldinhalt>
</fehler>
</fehlerliste>
</matrikelnummernmeldungantwort>
*/
/* 200 ok
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<matrikelnummernmeldungantwort>
<uuid>8b239582-6bc5-4193-ac79-2dcf9ec96439</uuid>
<fehlerliste fehleranzahl="0"/>
</matrikelnummernmeldungantwort>
*/
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.
*/
if($fehlernummer->length>0 && $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;
$retval->bpk = $bpk;
$this->errormsg .= 'ED10065 Response';
$this->debug('BPK:'.$bpk);
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
{
$this->errormsg = 'Request Failed with HTTP Code:'.$curl_info['http_code'].' and Response:'.$response;
return ErrorHandler::error();
}
}
/**
* 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 == '')
{
$this->errormsg = 'Geburtsdatum ist nicht gesetzt';
return ErrorHandler::error();
}
if ($person->vorname == '')
{
$this->errormsg = 'Vorname ist nicht gesetzt';
return ErrorHandler::error();
}
if ($person->nachname == '')
{
$this->errormsg = 'Nachname ist nicht gesetzt';
return ErrorHandler::error();
}
$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.
*/
private 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();
$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);
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:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<simpleBpkResponse xmlns="http://www.brz.gv.at/datenverbund-unis">
<personenkennzeichen>1234567890ABCDEFGH=</personenkennzeichen>
<personInfo>
<person>
<vorname>Max</vorname>
<nachname>Mustermann</nachname>
<geschlecht>M</geschlecht>
<gebdat>19901231</gebdat>
</person>
<adresse>
<ort></ort>
</adresse>
</personInfo>
</simpleBpkResponse>
Example Error:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<simpleBpkResponse xmlns="http://www.brz.gv.at/datenverbund-unis">
<fehlerAntwort>
<fehlerliste>
<fehler>
<fehlernummer>ED10065</fehlernummer>
<kategorie>E</kategorie>
<datenfeld>bPK</datenfeld>
<fehlertext>fehlt oder anders als im Datenverbund ermittelt (keine bPK gefunden)</fehlertext>
<massnahme>
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)
</massnahme>
<feldinhalt>keine bPK gefunden</feldinhalt>
</fehler>
</fehlerliste>
</fehlerAntwort>
</simpleBpkResponse>
*/
$dom = new DOMDocument();
$dom->loadXML($response);
$namespace = 'http://www.brz.gv.at/datenverbund-unis';
$domnodes_bpk = $dom->getElementsByTagNameNS($namespace, 'personenkennzeichen');
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($retval);
}
}
return ErrorHandler::error();
}
else
{
$this->errormsg = 'Request Failed with HTTP Code:'.$curl_info['http_code'].' and Response:'.$response;
return ErrorHandler::error();
}
}
public function existsByName($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))
{
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))
{
return true;
}
}
}
return false;
}
else
{
return false;
}
}
}
/**
* 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);
$url = self::DVB_URL_WEBSERVICE_NACHNAME;
$url .= '?nachName='.curl_escape($curl, $nachname);
$url .= '&geburtsDatum='.curl_escape($curl, $geburtsdatum);
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:
<uni:simpleStudentResponse xmlns:uni="http://www.brz.gv.at/datenverbund-unis">
<uni:student inStudienBeitragsPool="false" inGesamtPool="true" gesperrt="false">
<uni:matrikelNummer>12345678</uni:matrikelNummer>
<uni:vorName>Max</uni:vorName>
<uni:personenkennzeichen>sdfaASDAFasdfads+asasdffd=</uni:personenkennzeichen>
<uni:nachName>Mustermann</uni:nachName>
<uni:geschlecht>M</uni:geschlecht>
<uni:geburtsDatum>1999-02-19</uni:geburtsDatum>
<uni:staatsAngehoerigkeit>A</uni:staatsAngehoerigkeit>
</uni:student>
</uni:simpleStudentResponse>
*/
$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->matrikelnr = $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
{
$this->errormsg = 'Request Failed with HTTP Code:'.$curl_info['http_code'].' and Response:'.$response;
return ErrorHandler::error();
}
}
/**
* 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;
}
/**
* 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();
}
}