diff --git a/config/vilesci.config-default.inc.php b/config/vilesci.config-default.inc.php
index a372bc9da..09f33ee31 100644
--- a/config/vilesci.config-default.inc.php
+++ b/config/vilesci.config-default.inc.php
@@ -266,6 +266,8 @@ define('BIS_FUNKTIONSCODE_6_ARR', array(
// bPk Abfrage
define('BPK_FUER_ALLE_BENUTZER_ABFRAGEN', false);
+// bPk Typen in Form 'BEREICH' => 'kennzeichenTyp'
+define('VBPK_TYPES', array('AS' => 'vbpkAs', 'BF' => 'vbpkBf', 'ZP-TD' => 'vbpkTd'));
// Docsbox configs
define('DOCSBOX_SERVER', 'http://docconverter.technikum-wien.at/');
diff --git a/include/dvb.class.php b/include/dvb.class.php
index fbeb79afc..90eb8d306 100644
--- a/include/dvb.class.php
+++ b/include/dvb.class.php
@@ -29,6 +29,7 @@ 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
@@ -42,6 +43,7 @@ class dvb extends basis_db
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;
@@ -1149,15 +1151,29 @@ class dvb extends basis_db
*/
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 != '')
{
- // BPK exisitert bereits
$retval = new stdClass();
$retval->bpk = $person->bpk;
- return ErrorHandler::success($retval);
+
+ // 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 == '')
@@ -1178,7 +1194,8 @@ class dvb extends basis_db
return ErrorHandler::error($errormsg);
}
- $geburtsdatum = str_replace("-", "", $person->gebdatum);
+ //$geburtsdatum = str_replace("-", "", $person->gebdatum);
+ $geburtsdatum = $person->gebdatum;
$vorname = $person->vorname;
$nachname = $person->nachname;
$geschlecht = mb_strtoupper($person->geschlecht);
@@ -1258,6 +1275,8 @@ class dvb extends basis_db
*/
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();
@@ -1271,7 +1290,7 @@ class dvb extends basis_db
$uuid = $this->getUUID();
- $url = self::DVB_URL_WEBSERVICE_BPK;
+ $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);
@@ -1311,24 +1330,15 @@ class dvb extends basis_db
if ($curl_info['http_code'] == '200')
{
/* Example Response:
-
-
- 12345ABCDEFGHXXXXXXX=
-
-
- Hans
- Huber
- M
- 1990-01-01
-
-
-
- 1100
-
-
-
-
-
+
+
+ 5cc93441-a46a-4f97-a5e3-e64891b39f10
+ 12345ABCDEFG
+ 12345ABCDEFG
+ 12345ABCDEFG
+ 12345ABCDEFG
+ true
+
Example Error:
@@ -1369,10 +1379,30 @@ class dvb extends basis_db
}
$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
@@ -1385,6 +1415,27 @@ class dvb extends basis_db
$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();
}
diff --git a/include/kennzeichen.class.php b/include/kennzeichen.class.php
new file mode 100644
index 000000000..c21c5eee0
--- /dev/null
+++ b/include/kennzeichen.class.php
@@ -0,0 +1,261 @@
+,
+ */
+/**
+ * Klasse kennzeichen
+ */
+require_once(dirname(__FILE__).'/basis_db.class.php');
+
+class kennzeichen extends basis_db
+{
+ public $new; // boolean
+ public $result = array(); // adresse Objekt
+
+ //Tabellenspalten
+ public $kennzeichen_id; // integer
+ public $person_id; // integer
+
+ public $kennzeichentyp_kurzbz; // string
+ public $inhalt; // string
+ public $aktiv; // boolean
+ public $insertamum; // timestamp
+ public $insertvon; // string
+ public $updateamum; // timestamp
+ public $updatevon; // string
+
+ /**
+ * Konstruktor
+ * @param $kennzeichen_id ID des Kennzeichens das geladen werden soll (Default=null)
+ */
+ public function __construct($kennzeichen_id=null)
+ {
+ parent::__construct();
+ $this->new = true;
+
+ if(!is_null($kennzeichen_id))
+ $this->load($kennzeichen_id);
+ }
+
+ /**
+ * Laedt ein Kennzeichen mit der ID $kennzeichen_id
+ * @param $kennzeichen_id ID des zu ladenden Kennzeichens
+ * @return true wenn ok, false im Fehlerfall
+ */
+ public function load($kennzeichen_id)
+ {
+ if (!is_numeric($kennzeichen_id))
+ {
+ $this->errormsg = 'Kennzeichen Id ist ungueltig';
+ return false;
+ }
+
+ $qry = "SELECT
+ *
+ FROM
+ public.tbl_kennzeichen
+ WHERE
+ kennzeichen_id = " . $this->db_add_param($kennzeichen_id, FHC_INTEGER) . ";";
+
+ if ($this->db_query($qry))
+ {
+ if ($row = $this->db_fetch_object())
+ {
+ $this->kennzeichen_id = $row->kennzeichen_id;
+ $this->person_id = $row->person_id;
+ $this->kennzeichentyp_kurzbz = $row->kennzeichentyp_kurzbz;
+ $this->inhalt = $row->inhalt;
+ $this->aktiv = $this->db_parse_bool($row->aktiv);
+ $this->updateamum = $row->updateamum;
+ $this->updatevon = $row->updatevon;
+ $this->insertamum = $row->insertamum;
+ $this->insertvon = $row->insertvon;
+ return true;
+ }
+ else
+ {
+ $this->errormsg = 'Datensatz wurde nicht gefunden';
+ return false;
+ }
+ }
+ else
+ {
+ $this->errormsg = 'Fehler beim Laden der Daten';
+ return false;
+ }
+ }
+
+ /**
+ * Prueft die Kennzeichen auf Gueltigkeit
+ * @return true wenn ok, false im Fehlerfall
+ */
+ public function validate()
+ {
+ //Gesamtlaenge pruefen
+ if(mb_strlen($this->kennzeichentyp_kurzbz)>32)
+ {
+ $this->errormsg = 'Kennzeichentyp darf nicht länger als 32 Zeichen sein';
+ return false;
+ }
+ $this->errormsg = '';
+ return true;
+ }
+
+ /**
+ * Speichert den aktuellen Datensatz in die Datenbank
+ * Wenn $neu auf true gesetzt ist wird ein neuer Datensatz angelegt
+ * andernfalls wird der Datensatz mit der ID in $kennzeichen_id aktualisiert
+ * @return true wenn ok, false im Fehlerfall
+ */
+ public function save($new = null)
+ {
+ if(!is_null($new))
+ $this->new = $new;
+
+ //Variablen pruefen
+ if(!$this->validate())
+ return false;
+
+ if($this->new)
+ {
+ //Neuen Datensatz einfuegen
+ $qry='BEGIN;INSERT INTO public.tbl_kennzeichen (person_id, kennzeichentyp_kurzbz, inhalt, aktiv, insertamum, insertvon) VALUES('.
+ $this->db_add_param($this->person_id, FHC_INTEGER).', '.
+ $this->db_add_param($this->kennzeichentyp_kurzbz).', '.
+ $this->db_add_param($this->inhalt).', '.
+ $this->db_add_param($this->aktiv, FHC_BOOLEAN).', now(), '.
+ $this->db_add_param($this->insertvon).');';
+ }
+ else
+ {
+ //Updaten des bestehenden Datensatzes
+
+ //Pruefen ob kennzeichen_id eine gueltige Zahl ist
+ if(!is_numeric($this->kennzeichen_id))
+ {
+ $this->errormsg = 'kennzeichen_id muss eine gueltige Zahl sein';
+ return false;
+ }
+
+ $qry='UPDATE public.tbl_kennzeichen SET '.
+ 'person_id='.$this->db_add_param($this->person_id,FHC_INTEGER).', '.
+ 'kennzeichentyp_kurzbz='.$this->db_add_param($this->kennzeichentyp_kurzbz).', '.
+ 'aktiv='.$this->db_add_param($this->aktiv, FHC_BOOLEAN).', '.
+ 'updateamum= now(), '.
+ 'updatevon='.$this->db_add_param($this->updatevon).' '.
+ 'WHERE kennzeichen_id='.$this->db_add_param($this->kennzeichen_id, FHC_INTEGER).';';
+ }
+
+ if($this->db_query($qry))
+ {
+ //Sequence auslesen um die eingefuegte ID zu ermitteln
+ if($this->new)
+ {
+ $qry = "SELECT currval('public.tbl_kennzeichen_id_seq') as id;";
+
+ if($this->db_query($qry))
+ {
+ if($row = $this->db_fetch_object())
+ {
+ $this->kennzeichen_id = $row->id;
+ $this->db_query('COMMIT;');
+ return true;
+ }
+ else
+ {
+ $this->errormsg = 'Fehler beim Auslesen er Sequence';
+ $this->db_query('ROLLBACK;');
+ return false;
+ }
+ }
+ else
+ {
+ $this->errormsg = 'Fehler beim Auslesen der Sequence';
+ $this->db_query('ROLLBACK;');
+ return false;
+ }
+ }
+ return true;
+ }
+ else
+ {
+ $this->errormsg = 'Fehler beim Speichern der Daten';
+ return false;
+ }
+ }
+
+ /**
+ * Laedt Kennzeichen einer Person
+ * @param person_id
+ * @param kennzeichentyp_kurzbz_arr filtern nach Kennzeichentyp
+ * @return boolean
+ */
+ public function load_pers($person_id, $kennzeichentyp_kurzbz_arr)
+ {
+ if(!is_numeric($person_id))
+ {
+ $this->errormsg = 'Person_id ist ungueltig';
+ return false;
+ }
+ if(!is_array($kennzeichentyp_kurzbz_arr))
+ {
+ $this->errormsg = 'Kennzeichen sind ungueltig';
+ return false;
+ }
+
+ $qry = "
+ SELECT
+ kz.kennzeichen_id, kz.person_id, kz.kennzeichentyp_kurzbz, inhalt, aktiv, updateamum, updatevon, insertamum, insertvon
+ FROM
+ public.tbl_kennzeichen kz
+ WHERE
+ person_id=".$this->db_add_param($person_id, FHC_INTEGER)."
+ AND aktiv = TRUE
+ AND kennzeichentyp_kurzbz IN (".$this->implode4SQL($kennzeichentyp_kurzbz_arr).")
+ ORDER BY
+ kz.kennzeichentyp_kurzbz, kz.kennzeichen_id;";
+
+ if($this->db_query($qry))
+ {
+ while($row = $this->db_fetch_object())
+ {
+ $obj = new kennzeichen();
+
+ $obj->kennzeichen_id = $row->kennzeichen_id;
+ $obj->person_id = $row->person_id;
+ $obj->kennzeichentyp_kurzbz = $row->kennzeichentyp_kurzbz;
+ $obj->inhalt = $row->inhalt;
+ $obj->aktiv = $this->db_parse_bool($row->aktiv);
+ $obj->updateamum = $row->updateamum;
+ $obj->updatevon = $row->updatevon;
+ $obj->insertamum = $row->insertamum;
+ $obj->insertvon = $row->insertvon;
+
+ $this->result[] = $obj;
+ }
+
+ return true;
+ }
+ else
+ {
+ $this->errormsg = 'Fehler beim Laden der Daten';
+ return false;
+ }
+ }
+}
+?>
diff --git a/include/person.class.php b/include/person.class.php
index 95230ef3e..924c15ab6 100644
--- a/include/person.class.php
+++ b/include/person.class.php
@@ -97,10 +97,10 @@ class person extends basis_db
familienstand, anzahlkinder, aktiv, insertamum, insertvon, updateamum, updatevon, ext_id,
geschlecht, staatsbuergerschaft, geburtsnation, kurzbeschreibung, zugangscode, foto_sperre,
matr_nr, bpk, wahlname";
- if ($hasUDF = $udf->personHasUDF())
- $qry .= ", udf_values ";
+ if ($hasUDF = $udf->personHasUDF() && false)
+ $qry .= ", udf_values";
- $qry .= "FROM public.tbl_person
+ $qry .= " FROM public.tbl_person
WHERE person_id = " . $this->db_add_param($personId, FHC_INTEGER);
if (!$this->db_query($qry))
diff --git a/vilesci/cronjobs/bpk.php b/vilesci/cronjobs/bpk.php
index 3a7ac4395..75af4f9f8 100644
--- a/vilesci/cronjobs/bpk.php
+++ b/vilesci/cronjobs/bpk.php
@@ -27,6 +27,7 @@ require_once(dirname(__FILE__).'/../../include/basis_db.class.php');
require_once(dirname(__FILE__).'/../../include/dvb.class.php');
require_once(dirname(__FILE__).'/../../include/benutzerberechtigung.class.php');
require_once(dirname(__FILE__).'/../../include/datum.class.php');
+require_once(dirname(__FILE__).'/../../include/kennzeichen.class.php');
require_once(dirname(__FILE__).'/../../include/errorhandler.class.php');
if (!$db = new basis_db())
@@ -34,6 +35,7 @@ if (!$db = new basis_db())
$limit = '';
$debug = false;
+$vbpkTypes = defined('VBPK_TYPES') && is_array(VBPK_TYPES) ? VBPK_TYPES : null;
// Wenn das Script nicht ueber Commandline gestartet wird, muss eine
// Authentifizierung stattfinden
@@ -85,8 +87,27 @@ if (defined('BPK_FUER_ALLE_BENUTZER_ABFRAGEN') && BPK_FUER_ALLE_BENUTZER_ABFRAGE
JOIN public.tbl_benutzer USING(person_id)
WHERE
public.tbl_benutzer.aktiv = true
- AND tbl_person.bpk is null
- AND gebdatum is not null";
+ AND
+ (
+ tbl_person.bpk is null";
+
+ // checken, ob vBpks fehlen
+ if (isset($vbpkTypes))
+ {
+ $qry .=
+ " OR (
+ SELECT
+ COUNT(DISTINCT kennzeichentyp_kurzbz)
+ FROM
+ public.tbl_kennzeichen
+ WHERE
+ person_id = tbl_person.person_id
+ AND kennzeichentyp_kurzbz IN (".$db->implode4SQL($vbpkTypes).")
+ ) < ".$db->db_add_param(count($vbpkTypes), FHC_INTEGER);
+ }
+
+ $qry .=
+ ") AND gebdatum is not null";
}
else
{
@@ -100,8 +121,27 @@ else
WHERE
public.tbl_benutzer.aktiv = true
AND tbl_person.matr_nr is not null
- AND tbl_person.bpk is null
- AND studiengang_kz<10000
+ AND
+ (
+ tbl_person.bpk is null";
+
+ // checken, ob vBpks fehlen
+ if (isset($vbpkTypes))
+ {
+ $qry .=
+ " OR (
+ SELECT
+ COUNT(DISTINCT kennzeichentyp_kurzbz)
+ FROM
+ public.tbl_kennzeichen
+ WHERE
+ person_id = tbl_person.person_id
+ AND kennzeichentyp_kurzbz IN (".$db->implode4SQL($vbpkTypes).")
+ ) < ".$db->db_add_param(count($vbpkTypes), FHC_INTEGER);
+ }
+
+ $qry .=
+ ") AND studiengang_kz<10000
AND EXISTS(SELECT 1 FROM public.tbl_prestudent WHERE person_id=tbl_person.person_id AND bismelden=true)
AND gebdatum is not null";
}
@@ -135,6 +175,50 @@ if ($result = $db->db_query($qry))
echo ' OK';
else
echo ' Failed: '.$person->errormsg;
+
+ $vbpkErrors = array();
+
+ // alle existierenden vBpks einer Person holen
+ $kennzeichenTypes = new kennzeichen();
+ if ($kennzeichenTypes->load_pers($row->person_id, $vbpkTypes))
+ {
+ $existingVbpks = $kennzeichenTypes->result;
+
+ foreach ($data->retval->vbpks as $vbpkType => $vbpkValue)
+ {
+ $new = true;
+ foreach ($existingVbpks as $existingVbpk)
+ {
+ // nicht speichern, wenn vBpk bereits vorhanden
+ if ($existingVbpk->kennzeichentyp_kurzbz == $vbpkType)
+ {
+ $new = false;
+ break;
+ }
+ }
+
+ if (!$new) continue;
+
+ // neue vBpk speichern
+ $kennzeichen = new kennzeichen();
+
+ $kennzeichen->person_id = $row->person_id;
+ $kennzeichen->kennzeichentyp_kurzbz = $vbpkType;
+ $kennzeichen->inhalt = $vbpkValue;
+ $kennzeichen->aktiv = true;
+ $kennzeichen->insertvon = 'bpkJob';
+
+ if (!$kennzeichen->save())
+ {
+ $vbpkErrors[] = 'Failed to save vBpk '.$vbpkType.':'.$kennzeichen->errormsg;
+ }
+ }
+ }
+
+ if (count($vbpkErrors) > 0)
+ {
+ echo implode('; ', $vbpkErrors);
+ }
}
}
else