From d78308d43fc5c9be8fd030e8f2485aaf2f236ed5 Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 29 Oct 2020 23:40:02 +0100 Subject: [PATCH] DVUH Meldung: added ERNP Meldung for retrieving bpk for e.g. foreign residents --- include/dvb.class.php | 163 +++++++++++++++++++++++++++++++++++ soap/datenverbund_client.php | 73 ++++++++++++++-- 2 files changed, 229 insertions(+), 7 deletions(-) diff --git a/include/dvb.class.php b/include/dvb.class.php index 0131f1e4d..2f163d5e7 100644 --- a/include/dvb.class.php +++ b/include/dvb.class.php @@ -1013,6 +1013,134 @@ class dvb extends basis_db } } + 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.' + REISEP + + '; + $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. @@ -1737,6 +1865,41 @@ class dvb extends basis_db $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. diff --git a/soap/datenverbund_client.php b/soap/datenverbund_client.php index 36f0fb9e0..954eea2e6 100644 --- a/soap/datenverbund_client.php +++ b/soap/datenverbund_client.php @@ -57,6 +57,11 @@ $ersatzkennzeichen = filter_input(INPUT_POST, 'ersatzkennzeichen'); $person_id = filter_input(INPUT_POST, 'person_id'); $strasse = filter_input(INPUT_POST, 'strasse'); +$ausgabedatum = filter_input(INPUT_POST, 'ausgabedatum'); +$ausstellbehoerde = filter_input(INPUT_POST, 'ausstellbehoerde'); +$ausstellland = filter_input(INPUT_POST, 'ausstellland'); +$dokumentnr = filter_input(INPUT_POST, 'dokumentnr'); + ?> @@ -79,6 +84,7 @@ $strasse = filter_input(INPUT_POST, 'strasse');
  • Matrikelnummer Reservierungen anzeigen
  • Matrikelnummer Kontingent anfordern
  • Matrikelnummer Vergabe melden
  • +
  • ERNP-Eintragung anfordern
  • Gesamtprozess (Abfrage, ggf Vergabemeldung, Speichern bei Person)
  • BPK ermitteln
  • BPK ermitteln manuell
  • @@ -114,6 +120,18 @@ $strasse = filter_input(INPUT_POST, 'strasse'); '; } + function printSetMatrikelnrRows() + { + global $matrikelnr, $nachname, $vorname, $geburtsdatum, $geschlecht, $postleitzahl, $staat, $svnr, $matura; + printrow('matrikelnummer', 'Matrikelnummer', $matrikelnr); + printrow('nachname', 'Nachname', $nachname, '', 255); + printrow('vorname', 'Vorname', $vorname, '', 30); + printrow('geburtsdatum', 'Geburtsdatum', $geburtsdatum, 'Format: YYYYMMDD', 10); + printrow('geschlecht', 'Geschlecht', $geschlecht, 'Format: M | W', 1); + printrow('postleitzahl', 'Postleitzahl', $postleitzahl, '', 10); + printrow('staat', 'Staat', $staat, '1-3 Stellen Codex (zb A für Österreich)', 3); + } + switch($action) { case 'getOAuth': @@ -144,17 +162,32 @@ $strasse = filter_input(INPUT_POST, 'strasse'); break; case 'setMatrikelnummer': - printrow('matrikelnummer', 'Matrikelnummer', $matrikelnr); - printrow('nachname', 'Nachname', $nachname, '', 255); - printrow('vorname', 'Vorname', $vorname, '', 30); - printrow('geburtsdatum', 'Geburtsdatum', $geburtsdatum, 'Format: YYYYMMDD', 10); - printrow('geschlecht', 'Geschlecht', $geschlecht, 'Format: M | W', 1); - printrow('postleitzahl', 'Postleitzahl', $postleitzahl, '', 10); - printrow('staat', 'Staat', $staat, '1-3 Stellen Codex (zb A für Österreich)', 3); + printSetMatrikelnrRows(); printrow('svnr', 'SVNR', $svnr); printrow('matura', 'Maturadatum', $matura, 'Format: YYYYMMDD (optional)', 10); break; + case 'setMatrikelnummerErnp': + echo ' + + Personmeldung + '; + + printSetMatrikelnrRows(); + printrow('svnr', 'Ersatzkennzeichen', $svnr); + printrow('matura', 'Maturadatum', $matura, 'Format: YYYYMMDD (optional)', 10); + + echo ' + + Ernpmeldung + '; + + printrow('dokumentnr', 'Dokumentnummer', $dokumentnr, '', 60); + printrow('ausgabedatum', 'Ausgabedatum', $ausgabedatum, 'Format: YYYYMMDD', 10); + printrow('ausstellbehoerde', 'Ausstellbehörde', $ausstellbehoerde, '', 40); + printrow('ausstellland', 'Ausstellland', $ausstellland, '1-3 Stellen Codex (zb D für Deutschland)', 60); + break; + case 'assignMatrikelnummer': printrow('person_id', 'PersonID', $person_id); break; @@ -337,6 +370,32 @@ if (isset($_REQUEST['submit'])) echo '
    Fehlgeschlagen:'.$result->errormsg; break; + case 'setMatrikelnummerErnp': + $person = new stdClass(); + $person->matrikelnummer = $matrikelnr; + $person->vorname = $vorname; + $person->nachname = $nachname; + $person->geburtsdatum = $geburtsdatum; + $person->geschlecht = $geschlecht; + $person->staat = $staat; + $person->plz = $postleitzahl; + $person->matura = $matura; // Optional + $person->svnr = $svnr; // Optional + + $reisepass = new stdClass(); + $reisepass->ausgabedatum = $ausgabedatum; + $reisepass->ausstellBehoerde = $ausstellbehoerde; + $reisepass->ausstellland = $ausstellland; + $reisepass->dokumentnr = $dokumentnr; + + $result = $dvb->setMatrikelnummerErnp(DVB_BILDUNGSEINRICHTUNG_CODE, $person, $reisepass); + + if (ErrorHandler::isSuccess($result)) + echo '
    Erfolgreich gemeldet'; + else + echo '
    Fehlgeschlagen:'.$result->errormsg; + break; + case 'assignMatrikelnummer': $result = $dvb->assignMatrikelnummer($person_id); if(ErrorHandler::isSuccess($result))