diff --git a/application/controllers/jobs/ESIJob.php b/application/controllers/jobs/ESIJob.php
new file mode 100644
index 000000000..c9a558a46
--- /dev/null
+++ b/application/controllers/jobs/ESIJob.php
@@ -0,0 +1,165 @@
+load->model('person/Person_model', 'PersonModel');
+ $this->load->model('person/Kennzeichen_model', 'KennzeichenModel');
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ /**
+ * Initialises generateESI job, handles job queue, logs infos/errors
+ */
+ public function generateESI()
+ {
+ //$jobType = 'DVUHSendPruefungsaktivitaeten';
+ $this->logInfo(ESIScheduler::JOB_TYPE_GENERATE_ESI.' job start');
+
+ // Gets the latest jobs
+ $lastJobs = $this->getLastJobs(ESIScheduler::JOB_TYPE_GENERATE_ESI);
+
+ if (isError($lastJobs))
+ {
+ $this->logError(getCode($lastJobs).': '.getError($lastJobs), ESIScheduler::JOB_TYPE_GENERATE_ESI);
+ }
+ else
+ {
+ $this->updateJobs(
+ getData($lastJobs), // Jobs to be updated
+ array(JobsQueueLib::PROPERTY_START_TIME), // Job properties to be updated
+ array(date('Y-m-d H:i:s')) // Job properties new values
+ );
+
+ $person_arr = $this->_getInputObjArray(getData($lastJobs));
+
+ foreach ($person_arr as $persobj)
+ {
+ if (!isset($persobj->person_id))
+ $this->logError("Error when generating ESI: invalid parameters");
+ else
+ {
+ $person_id = $persobj->person_id;
+
+ // check if there already is an active ESI
+ $this->KennzeichenModel->addSelect('1');
+ $activeKennzeichenRes = $this->KennzeichenModel->loadWhere(
+ array('person_id' => $person_id, 'kennzeichentyp_kurzbz' => ESIScheduler::KENNZEICHENTYP_KURZBZ, 'aktiv' => true)
+ );
+
+ if (hasData($activeKennzeichenRes))
+ {
+ $this->logError("Active ESI for person Id $person_id already exists");
+ continue;
+ }
+
+ // get Matrikelnr for person for which ESI should be generated
+ $this->PersonModel->addSelect('matr_nr');
+ $personRes = $this->PersonModel->load($person_id);
+
+ if (!hasData($personRes))
+ {
+ $this->logError("Person with Id $person_id not found");
+ continue;
+ }
+
+ $matr_nr = getData($personRes)[0]->matr_nr;
+
+ if (isEmptyString($matr_nr))
+ {
+ $this->logError("Matrikelnummer for person with Id $person_id is empty");
+ continue;
+ }
+
+ $esi = self::ESI_PREFIX.$matr_nr;
+
+ // check if ESI was already used
+ $this->KennzeichenModel->addSelect('1');
+ $existingKennzeichenRes = $this->KennzeichenModel->loadWhere(
+ array('person_id' => $person_id, 'kennzeichentyp_kurzbz' => ESIScheduler::KENNZEICHENTYP_KURZBZ, 'inhalt' => $esi)
+ );
+
+ if (hasData($existingKennzeichenRes))
+ {
+ $this->logError("ESI $esi for person Id $person_id already exists");
+ continue;
+ }
+
+ // if everything ok, save the esi for the person
+ $saveEsiResult = $this->KennzeichenModel->insert(
+ array(
+ 'person_id' => $person_id,
+ 'kennzeichentyp_kurzbz' => ESIScheduler::KENNZEICHENTYP_KURZBZ,
+ 'inhalt' => $esi,
+ 'aktiv' => true,
+ 'insertvon' => self::INSERT_VON
+ )
+ );
+
+ if (isError($saveEsiResult))
+ {
+ $this->logError("Error when sending ESI, person Id $person_id ".getError($saveEsiResult));
+ }
+ }
+ }
+
+ // Update jobs properties values
+ $this->updateJobs(
+ getData($lastJobs), // Jobs to be updated
+ array(JobsQueueLib::PROPERTY_STATUS, JobsQueueLib::PROPERTY_END_TIME), // Job properties to be updated
+ array(JobsQueueLib::STATUS_DONE, date('Y-m-d H:i:s')) // Job properties new values
+ );
+
+ if (hasData($lastJobs)) $this->updateJobsQueue(ESIScheduler::JOB_TYPE_GENERATE_ESI, getData($lastJobs));
+ }
+
+ $this->logInfo(ESIScheduler::JOB_TYPE_GENERATE_ESI.' job stop');
+ }
+
+ // --------------------------------------------------------------------------------------------
+ // Private methods
+
+ /**
+ * Extracts input data from jobs.
+ * @param $jobs
+ * @return array with jobinput
+ */
+ private function _getInputObjArray($jobs)
+ {
+ $mergedUsersArray = array();
+
+ if (count($jobs) == 0) return $mergedUsersArray;
+
+ foreach ($jobs as $job)
+ {
+ $decodedInput = json_decode($job->input);
+ if ($decodedInput != null)
+ {
+ foreach ($decodedInput as $el)
+ {
+ $mergedUsersArray[] = $el;
+ }
+ }
+ }
+ return $mergedUsersArray;
+ }
+}
diff --git a/application/controllers/jobs/schedulers/ESIScheduler.php b/application/controllers/jobs/schedulers/ESIScheduler.php
new file mode 100644
index 000000000..3ab858937
--- /dev/null
+++ b/application/controllers/jobs/schedulers/ESIScheduler.php
@@ -0,0 +1,108 @@
+load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ /**
+ * Creates jobs queue entries for generateESI job.
+ * @param string $studiensemester_kurzbz semester for which ESIs should be generated
+ */
+ public function generateESI($studiensemester_kurzbz = null)
+ {
+ // if no semester given, get current studiensemester
+ if (!isset($studiensemester_kurzbz))
+ {
+ $semRes = $this->StudiensemesterModel->getAkt();
+
+ if (hasData($semRes))
+ {
+ $studiensemester_kurzbz = getData($semRes)[0]->studiensemester_kurzbz;
+ }
+ }
+
+ if (isset($studiensemester_kurzbz))
+ {
+ $this->logInfo('Start job queue scheduler '.self::JOB_TYPE_GENERATE_ESI);
+
+ $qry = "
+ SELECT
+ DISTINCT person_id
+ FROM
+ public.tbl_person pers
+ JOIN public.tbl_prestudent ps USING (person_id)
+ JOIN public.tbl_prestudentstatus pss USING (prestudent_id)
+ WHERE
+ pss.studiensemester_kurzbz = ?
+ AND pers.matr_nr IS NOT NULL
+ AND pss.status_kurzbz IN ?
+ AND NOT EXISTS ( -- has no ESI yet
+ SELECT 1
+ FROM
+ public.tbl_kennzeichen
+ WHERE
+ person_id = pers.person_id
+ AND kennzeichentyp_kurzbz = ?
+ AND aktiv
+ )
+ AND NOT EXISTS ( -- making sure it's not an incoming
+ SELECT 1
+ FROM
+ public.tbl_prestudentstatus
+ WHERE
+ prestudent_id = ps.prestudent_id
+ AND status_kurzbz = 'Incoming'
+ )";
+
+ $db = new DB_Model();
+ $jobInputResult = $db->execReadOnlyQuery($qry, array($studiensemester_kurzbz, $this->_active_status_kurzbz, self::KENNZEICHENTYP_KURZBZ));
+
+ // If an error occured then log it
+ if (isError($jobInputResult))
+ {
+ $this->logError(getError($jobInputResult));
+ }
+ elseif (hasData($jobInputResult)) // if persons found
+ {
+ // Add the new job to the jobs queue
+ $addNewJobResult = $this->addNewJobsToQueue(
+ self::JOB_TYPE_GENERATE_ESI, // job type
+ $this->generateJobs( // gnerate the structure of the new job
+ JobsQueueLib::STATUS_NEW,
+ json_encode(getData($jobInputResult))
+ )
+ );
+
+ // If error occurred return it
+ if (isError($addNewJobResult)) $this->logError(getError($addNewJobResult));
+ }
+ }
+ else
+ {
+ $this->logError('Error when getting Studiensemester');
+ }
+
+ $this->logInfo('End job queue scheduler '.self::JOB_TYPE_GENERATE_ESI);
+ }
+}
diff --git a/application/models/person/Kennzeichen_model.php b/application/models/person/Kennzeichen_model.php
new file mode 100644
index 000000000..fe8a9ac62
--- /dev/null
+++ b/application/models/person/Kennzeichen_model.php
@@ -0,0 +1,15 @@
+dbTable = 'public.tbl_kennzeichen';
+ $this->pk = 'kennzeichen_id';
+ }
+
+}
diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php
index 717cc58f3..964f02bae 100644
--- a/system/dbupdate_3.4.php
+++ b/system/dbupdate_3.4.php
@@ -50,7 +50,7 @@ require_once('dbupdate_3.4/29529_infocenter_anpassungen.php');
require_once('dbupdate_3.4/29835_uhstat1_erfassung_der_uhstat1_daten_ueber_das_bewerbungstool.php');
require_once('dbupdate_3.4/33714_erhoehter_studienbeitrag_fuer_drittsaatenangehoerig.php');
require_once('dbupdate_3.4/36275_zeitaufzeichnung_karenz.php');
-
+require_once('dbupdate_3.4/21620_neues_feld_zum_erfassen_des_ESI.php');
// *** Pruefung und hinzufuegen der neuen Attribute und Tabellen
echo '
Pruefe Tabellen und Attribute!
';
@@ -87,6 +87,7 @@ $tabellen=array(
"bis.tbl_nationengruppe" => array("nationengruppe_kurzbz","nationengruppe_bezeichnung","aktiv"),
"bis.tbl_oehbeitrag" => array("oehbeitrag_id","studierendenbeitrag","versicherung","von_studiensemester_kurzbz","bis_studiensemester_kurzbz","insertamum","insertvon","updateamum","updatevon"),
"bis.tbl_orgform" => array("orgform_kurzbz","code","bezeichnung","rolle","bisorgform_kurzbz","bezeichnung_mehrsprachig"),
+ "bis.tbl_uhstat1daten" => array("uhstat1daten_id", "mutter_geburtsstaat", "mutter_bildungsstaat", "mutter_geburtsjahr", "mutter_bildungmax", "vater_geburtsstaat", "vater_bildungsstaat", "vater_geburtsjahr", "vater_bildungmax", "person_id", "insertamum", "insertvon", "updateamum", "updatevon"),
"bis.tbl_verwendung" => array("verwendung_code","verwendungbez"),
"bis.tbl_zgv" => array("zgv_code","zgv_bez","zgv_kurzbz","bezeichnung","aktiv"),
"bis.tbl_zgvmaster" => array("zgvmas_code","zgvmas_bez","zgvmas_kurzbz","bezeichnung","aktiv"),
@@ -262,6 +263,8 @@ $tabellen=array(
"public.tbl_geschaeftsjahr" => array("geschaeftsjahr_kurzbz","start","ende","bezeichnung"),
"public.tbl_gruppe" => array("gruppe_kurzbz","studiengang_kz","semester","bezeichnung","beschreibung","sichtbar","lehre","aktiv","sort","mailgrp","generiert","updateamum","updatevon","insertamum","insertvon","ext_id","orgform_kurzbz","gid","content_visible","gesperrt","zutrittssystem","aufnahmegruppe","direktinskription"),
"public.tbl_gruppe_manager" => array("gruppe_manager_id","gruppe_kurzbz","uid","insertamum","insertvon"),
+ "public.tbl_kennzeichen" => array("kennzeichen_id", "person_id", "kennzeichentyp_kurzbz", "inhalt", "aktiv", "insertamum", "insertvon", "updateamum", "updatevon"),
+ "public.tbl_kennzeichentyp" => array("kennzeichentyp_kurzbz", "bezeichnung", "aktiv"),
"public.tbl_kontakt" => array("kontakt_id","person_id","kontakttyp","anmerkung","kontakt","zustellung","updateamum","updatevon","insertamum","insertvon","ext_id","standort_id"),
"public.tbl_kontaktmedium" => array("kontaktmedium_kurzbz","beschreibung"),
"public.tbl_kontakttyp" => array("kontakttyp","beschreibung","bezeichnung_mehrsprachig"),
@@ -296,6 +299,8 @@ $tabellen=array(
"public.tbl_prestudentstatus" => array("prestudent_id","status_kurzbz","studiensemester_kurzbz","ausbildungssemester","datum","orgform_kurzbz","insertamum","insertvon","updateamum","updatevon","ext_id","studienplan_id","bestaetigtam","bestaetigtvon","fgm","faktiv", "anmerkung","bewerbung_abgeschicktamum","rt_stufe","statusgrund_id"),
"public.tbl_raumtyp" => array("raumtyp_kurzbz","beschreibung","kosten"),
"public.tbl_reihungstest" => array("reihungstest_id","studiengang_kz","ort_kurzbz","anmerkung","datum","uhrzeit","updateamum","updatevon","insertamum","insertvon","ext_id","freigeschaltet","max_teilnehmer","oeffentlich","studiensemester_kurzbz","aufnahmegruppe_kurzbz","stufe","anmeldefrist","zugangs_ueberpruefung","zugangscode"),
+ "public.tbl_rueckstellung" => array("rueckstellung_id","person_id","status_kurzbz","datum_bis","insertamum","insertvon"),
+ "public.tbl_rueckstellung_status" => array("status_kurzbz", "bezeichnung_mehrsprachig", "sort", "aktiv"),
"public.tbl_rt_ort" => array("rt_id","ort_kurzbz","uid"),
"public.tbl_rt_person" => array("rt_person_id","person_id","rt_id","studienplan_id","anmeldedatum","teilgenommen","ort_kurzbz","punkte","insertamum","insertvon","updateamum","updatevon"),
"public.tbl_rt_studienplan" => array("reihungstest_id","studienplan_id"),
diff --git a/system/dbupdate_3.4/21620_neues_feld_zum_erfassen_des_ESI.php b/system/dbupdate_3.4/21620_neues_feld_zum_erfassen_des_ESI.php
new file mode 100644
index 000000000..5b6b22918
--- /dev/null
+++ b/system/dbupdate_3.4/21620_neues_feld_zum_erfassen_des_ESI.php
@@ -0,0 +1,146 @@
+db_query('SELECT 0 FROM public.tbl_kennzeichentyp WHERE 0 = 1'))
+{
+ $qry = 'CREATE TABLE public.tbl_kennzeichentyp (
+ kennzeichentyp_kurzbz varchar(32) NOT NULL,
+ bezeichnung varchar(256) NOT NULL,
+ aktiv boolean NOT NULL DEFAULT TRUE
+ );
+
+ COMMENT ON TABLE public.tbl_kennzeichentyp IS \'Tabelle zur Verwaltung von Typen von externen Personenkennzeichen.\';
+ COMMENT ON COLUMN public.tbl_kennzeichentyp.bezeichnung IS \'Voller Name des Kennzeichentyps.\';
+ COMMENT ON COLUMN public.tbl_kennzeichentyp.aktiv IS \'Ob der Kennzeichentyp noch aktiv und verwendet wird.\';
+
+ ALTER TABLE public.tbl_kennzeichentyp ADD CONSTRAINT pk_tbl_kennzeichentyp PRIMARY KEY (kennzeichentyp_kurzbz)';
+
+ if (!$db->db_query($qry))
+ echo 'public.tbl_kennzeichentyp: '.$db->db_last_error().'
';
+ else
+ echo '
public.tbl_kennzeichentyp table created';
+
+ $qry = 'GRANT SELECT ON TABLE public.tbl_kennzeichentyp TO web;';
+ if (!$db->db_query($qry))
+ echo 'public.tbl_kennzeichentyp: '.$db->db_last_error().'
';
+ else
+ echo '
Granted privileges to web on public.tbl_kennzeichentyp';
+
+ $qry = 'GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE public.tbl_kennzeichentyp TO vilesci;';
+ if (!$db->db_query($qry))
+ echo 'public.tbl_kennzeichentyp: '.$db->db_last_error().'
';
+ else
+ echo '
Granted privileges to vilesci on public.tbl_kennzeichentyp';
+}
+
+// SEQUENCE tbl_kennzeichen_id_seq
+if ($result = $db->db_query("SELECT 0 FROM pg_class WHERE relname = 'tbl_kennzeichen_id_seq'"))
+{
+ if ($db->db_num_rows($result) == 0)
+ {
+ $qry = 'CREATE SEQUENCE public.tbl_kennzeichen_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MAXVALUE
+ NO MINVALUE
+ CACHE 1;';
+
+ if(!$db->db_query($qry))
+ echo 'public.tbl_kennzeichen_id_seq '.$db->db_last_error().'
';
+ else
+ echo '
Created sequence: public.tbl_kennzeichen_id_seq';
+
+ // GRANT SELECT, UPDATE ON SEQUENCE public.tbl_kennzeichen_id_seq TO vilesci;
+ $qry = 'GRANT SELECT, UPDATE ON SEQUENCE public.tbl_kennzeichen_id_seq TO vilesci;';
+ if (!$db->db_query($qry))
+ echo 'public.tbl_kennzeichen_id_seq '.$db->db_last_error().'
';
+ else
+ echo '
Granted privileges to vilesci on public.tbl_kennzeichen_id_seq';
+
+ // GRANT SELECT, UPDATE ON SEQUENCE public.tbl_kennzeichen_id_seq TO fhcomplete;
+ $qry = 'GRANT SELECT, UPDATE ON SEQUENCE public.tbl_kennzeichen_id_seq TO fhcomplete;';
+ if (!$db->db_query($qry))
+ echo 'public.tbl_kennzeichen_id_seq '.$db->db_last_error().'
';
+ else
+ echo '
Granted privileges to fhcomplete on public.tbl_kennzeichen_id_seq';
+ }
+}
+
+// Creates table public.tbl_kennzeichen if it doesn't exist and grants privileges
+if (!$result = @$db->db_query('SELECT 0 FROM public.tbl_kennzeichen WHERE 0 = 1'))
+{
+ $qry = 'CREATE TABLE public.tbl_kennzeichen (
+ kennzeichen_id integer NOT NULL DEFAULT NEXTVAL(\'public.tbl_kennzeichen_id_seq\'),
+ person_id integer NOT NULL,
+ kennzeichentyp_kurzbz varchar(32) NOT NULL,
+ inhalt text NOT NULL,
+ aktiv boolean NOT NULL DEFAULT TRUE,
+ insertamum timestamp DEFAULT NOW(),
+ insertvon varchar(32),
+ updateamum timestamp,
+ updatevon varchar(32)
+ );
+
+ COMMENT ON TABLE public.tbl_kennzeichen IS \'Tabelle zum Speichern von externen Personenkennzeichen.\';
+ COMMENT ON COLUMN public.tbl_kennzeichen.kennzeichentyp_kurzbz IS \'Typ des externen Personen Kennzeichens.\';
+ COMMENT ON COLUMN public.tbl_kennzeichen.inhalt IS \'Das externe Kennzeichen.\';
+ COMMENT ON COLUMN public.tbl_kennzeichen.aktiv IS \'Ob das Kennzeichen noch aktiv ist und verwendet wird.\';
+
+ ALTER TABLE public.tbl_kennzeichen ADD CONSTRAINT pk_tbl_kennzeichen PRIMARY KEY (kennzeichen_id);
+
+ ALTER TABLE public.tbl_kennzeichen ADD CONSTRAINT fk_kennzeichen_person FOREIGN KEY (person_id)
+ REFERENCES public.tbl_person(person_id) ON UPDATE CASCADE ON DELETE RESTRICT;
+ ALTER TABLE public.tbl_kennzeichen ADD CONSTRAINT fk_kennzeichen_kennzeichentyp_kurzbz FOREIGN KEY (kennzeichentyp_kurzbz)
+ REFERENCES public.tbl_kennzeichentyp(kennzeichentyp_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT;
+
+ -- create unique constraint, no person can have the same kennzeichen twice
+ ALTER TABLE public.tbl_kennzeichen ADD CONSTRAINT uk_kennzeichen_person_id_inhalt UNIQUE (person_id, kennzeichentyp_kurzbz, inhalt);
+ -- create unique index - person can only have one active kennzeichen of each type
+ CREATE UNIQUE INDEX kennzeichen_aktiv_constraint ON public.tbl_kennzeichen (person_id, kennzeichentyp_kurzbz) WHERE aktiv;';
+
+ if (!$db->db_query($qry))
+ echo 'public.tbl_kennzeichen: '.$db->db_last_error().'
';
+ else
+ echo '
public.tbl_kennzeichen table created';
+
+ $qry = 'GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE public.tbl_kennzeichen TO web;';
+ if (!$db->db_query($qry))
+ echo 'public.tbl_kennzeichen: '.$db->db_last_error().'
';
+ else
+ echo '
Granted privileges to web on public.tbl_kennzeichen';
+
+ $qry = 'GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE public.tbl_kennzeichen TO vilesci;';
+ if (!$db->db_query($qry))
+ echo 'public.tbl_kennzeichen: '.$db->db_last_error().'
';
+ else
+ echo '
Granted privileges to vilesci on public.tbl_kennzeichen';
+}
+
+// public.tbl_kennzeichentyp: add type esi
+if ($result = $db->db_query("SELECT 1 FROM public.tbl_kennzeichentyp WHERE kennzeichentyp_kurzbz='esi'"))
+{
+ if($db->db_num_rows($result)==0)
+ {
+ $qry = "INSERT INTO public.tbl_kennzeichentyp(kennzeichentyp_kurzbz, bezeichnung) VALUES('esi', 'European Student Identifier');";
+
+ if(!$db->db_query($qry))
+ echo 'Kennzeichentyp: '.$db->db_last_error().'
';
+ else
+ echo '
Neuer Kennzeichentyp esi in public.tbl_kennzeichentyp hinzugefügt';
+ }
+}
+
+// system.tbl_jobtypes: add type esi
+if ($result = $db->db_query("SELECT 1 FROM system.tbl_jobtypes WHERE type='generateESI'"))
+{
+ if($db->db_num_rows($result)==0)
+ {
+ $qry = "INSERT INTO system.tbl_jobtypes(type, description) VALUES('generateESI', 'Generate and save European Student Identifier');";
+
+ if(!$db->db_query($qry))
+ echo 'Jobtyp: '.$db->db_last_error().'
';
+ else
+ echo '
Neuer Jobtyp generateESI in system.tbl_jobtypes hinzugefügt';
+ }
+}
diff --git a/vilesci/stammdaten/personen_wartung.php b/vilesci/stammdaten/personen_wartung.php
index ee95854ed..d2b5c3446 100644
--- a/vilesci/stammdaten/personen_wartung.php
+++ b/vilesci/stammdaten/personen_wartung.php
@@ -229,7 +229,7 @@ if (isset($personToDelete) && isset($personToKeep) && $personToDelete >= 0 && $p
die('Es sind bereits beide Personen in SAP vorhanden. Bitte zuerst direkt in der tbl_sap_students lösen.');
}
}
-
+
$personToDelete_obj = new person();
if ($personToDelete_obj->load($personToDelete))
{
@@ -319,6 +319,199 @@ if (isset($personToDelete) && isset($personToKeep) && $personToDelete >= 0 && $p
}
}
}
+
+ if($result = @$db->db_query("SELECT 1 FROM public.tbl_kennzeichen LIMIT 1"))
+ {
+ $kennzeichen_has_personToKeep = array();
+ $kennzeichen_has_personToDelete = array();
+
+ $kennzeichen_query = "
+ SELECT *
+ FROM public.tbl_kennzeichen
+ WHERE (
+ person_id = " . $db->db_add_param($personToKeep, FHC_INTEGER) . " OR
+ person_id = " . $db->db_add_param($personToDelete, FHC_INTEGER) . "
+ )
+ ORDER BY kennzeichentyp_kurzbz, aktiv DESC";
+
+ if ($result = $db->db_query($kennzeichen_query))
+ {
+ while ($row = $db->db_fetch_object($result))
+ {
+ if ($row->person_id === $personToKeep)
+ {
+ $kennzeichen_has_personToKeep[] = $row;
+ }
+ else if ($row->person_id === $personToDelete)
+ {
+ $kennzeichen_has_personToDelete[] = $row;
+ }
+ }
+ }
+
+ if (!empty($kennzeichen_has_personToDelete))
+ {
+ foreach ($kennzeichen_has_personToDelete as $kennzeichen_toDelete)
+ {
+ $kennzeichen_toKeep_Kurzbz = array_column($kennzeichen_has_personToKeep, 'kennzeichentyp_kurzbz');
+
+ if (in_array($kennzeichen_toDelete->kennzeichentyp_kurzbz, $kennzeichen_toKeep_Kurzbz))
+ {
+ $kennzeichen_toKeep_Keys = array_keys($kennzeichen_toKeep_Kurzbz, $kennzeichen_toDelete->kennzeichentyp_kurzbz);
+
+ foreach ($kennzeichen_toKeep_Keys as $key)
+ {
+ if (($kennzeichen_has_personToKeep[$key]->aktiv === 't' && $kennzeichen_toDelete->aktiv === 'f') ||
+ ($kennzeichen_has_personToKeep[$key]->aktiv === 'f' && $kennzeichen_toDelete->aktiv === 't') ||
+ ($kennzeichen_has_personToKeep[$key]->aktiv === 'f' && $kennzeichen_toDelete->aktiv === 'f'))
+ {
+ if ($kennzeichen_has_personToKeep[$key]->inhalt !== $kennzeichen_toDelete->inhalt)
+ {
+ $sql_query_upd1 .= "UPDATE public.tbl_kennzeichen SET person_id=" . $db->db_add_param($personToKeep, FHC_INTEGER) . " WHERE kennzeichen_id=" . $db->db_add_param($kennzeichen_toDelete->kennzeichen_id, FHC_INTEGER) . ";";
+ $kennzeichen_has_personToKeep[] = $kennzeichen_toDelete;
+ continue 2;
+ }
+ else
+ {
+ if ($kennzeichen_toDelete->aktiv === 'f')
+ {
+ $sql_query_upd1 .= "DELETE FROM public.tbl_kennzeichen WHERE kennzeichen_id=" . $db->db_add_param($kennzeichen_toDelete->kennzeichen_id, FHC_INTEGER) . ";";
+ $msg_warning[] = "Das nicht aktive Kennzeichen mit der ID '" . $kennzeichen_toDelete->kennzeichen_id . "' wurde gelöscht,
+ da es der gleiche Inhalt wie beim Kennzeichen mit der ID '". $kennzeichen_has_personToKeep[$key]->kennzeichen_id ."' ist.";
+ continue 2;
+ }
+ $msg_error[] = 'Beide Personen haben ein Kennzeichen mit dem gleichen Typ ('. $kennzeichen_toDelete->kennzeichentyp_kurzbz.') und den gleichen Inhalt. Können nicht zusammengelegt werden.
+ Sie müssen die Datensätze manuell bereinigen, bevor Sie die Personen zusammenlegen können.';
+ $error = true;
+ break 2;
+ }
+ }
+ else if ($kennzeichen_has_personToKeep[$key]->aktiv === 't' && $kennzeichen_toDelete->aktiv === 't')
+ {
+ $msg_error[] = 'Beide Personen haben ein aktives Kennzeichen mit dem gleichen Typ ('. $kennzeichen_toDelete->kennzeichentyp_kurzbz.'). Können nicht zusammengelegt werden.
+ Sie müssen die Datensätze manuell bereinigen, bevor Sie die Personen zusammenlegen können.';
+ $error = true;
+ break 2;
+ }
+ }
+ }
+ else
+ {
+ $sql_query_upd1 .= "UPDATE public.tbl_kennzeichen SET person_id=" . $db->db_add_param($personToKeep, FHC_INTEGER) . " WHERE kennzeichen_id=" . $db->db_add_param($kennzeichen_toDelete->kennzeichen_id, FHC_INTEGER) . ";";
+ }
+ }
+ }
+ }
+
+ if($result = @$db->db_query("SELECT 1 FROM bis.tbl_uhstat1daten LIMIT 1"))
+ {
+ $uhstat_has_personToKeep = array();
+ $uhstat_has_personToDelete = array();
+
+ $uhstat_query = "
+ SELECT uhstat1daten_id, person_id
+ FROM bis.tbl_uhstat1daten
+ WHERE (
+ person_id = " . $db->db_add_param($personToKeep, FHC_INTEGER) . " OR
+ person_id = " . $db->db_add_param($personToDelete, FHC_INTEGER) . "
+ )
+ ORDER BY updateamum DESC NULLS LAST, insertamum DESC NULLS LAST";
+
+ // Herausfinden, ob UHSTAT Daten der löschenden oder zu belassenden Person zugeordnet sind
+ if ($result = $db->db_query($uhstat_query))
+ {
+ while ($row = $db->db_fetch_object($result))
+ {
+ if ($row->person_id === $personToKeep)
+ {
+ $uhstat_has_personToKeep[] = $row;
+ }
+ else if ($row->person_id === $personToDelete)
+ {
+ $uhstat_has_personToDelete[] = $row;
+ }
+ }
+ }
+
+ // wenn UHSTAT Daten an Person, die gelöscht werden soll, hängen
+ if (!empty($uhstat_has_personToDelete))
+ {
+ // Wenn es auch UHSTAT Daten für die Person, die bleibt, gibt
+ if (!empty($uhstat_has_personToKeep))
+ {
+ // Unklar: welche Version der Daten soll behalten werden?
+ $msg_error[] = 'Beide Personen haben UHSTAT1 Daten. Können nicht zusammengelegt werden.
+ Sie müssen die Datensätze manuell bereinigen, bevor Sie die Personen zusammenlegen können:
+ zum UHSTAT von Person A
+ /
+ zum UHSTAT von Person B
+
';
+
+ $error = true;
+ }
+ else
+ {
+ // Es gibt nur UHSTAT Daten für die zu löschende Person: Update
+ foreach ($uhstat_has_personToDelete as $uhstat_toDelete)
+ {
+ $sql_query_upd1 .= "UPDATE bis.tbl_uhstat1daten SET person_id=" . $db->db_add_param($personToKeep, FHC_INTEGER) . " WHERE uhstat1daten_id=" . $db->db_add_param($uhstat_toDelete->uhstat1daten_id, FHC_INTEGER) . ";";
+ }
+ }
+ }
+ }
+
+ if($result = @$db->db_query("SELECT 1 FROM public.tbl_rueckstellung LIMIT 1"))
+ {
+ $rueckstellung_has_personToKeep = array();
+ $rueckstellung_has_personToDelete = array();
+
+ $rueckstellung_query = "
+ SELECT rueckstellung_id, person_id
+ FROM public.tbl_rueckstellung
+ WHERE (
+ person_id = " . $db->db_add_param($personToKeep, FHC_INTEGER) . " OR
+ person_id = " . $db->db_add_param($personToDelete, FHC_INTEGER) . "
+ )
+ ORDER BY insertamum DESC NULLS LAST";
+
+ // Herausfinden, ob Rueckstellung Daten der löschenden oder zu belassenden Person zugeordnet sind
+ if ($result = $db->db_query($rueckstellung_query))
+ {
+ while ($row = $db->db_fetch_object($result))
+ {
+ if ($row->person_id === $personToKeep)
+ {
+ $rueckstellung_has_personToKeep[] = $row;
+ }
+ else if ($row->person_id === $personToDelete)
+ {
+ $rueckstellung_has_personToDelete[] = $row;
+ }
+ }
+ }
+
+ // wenn Rueckstellung Daten an Person, die gelöscht werden soll, hängen
+ if (!empty($rueckstellung_has_personToDelete))
+ {
+ // Wenn es auch Rueckstellung Daten für die Person, die bleibt, gibt
+ if (!empty($rueckstellung_has_personToKeep))
+ {
+ // Unklar: welche Version der Daten soll behalten werden?
+ $msg_error[] = 'Beide Personen haben Rückstellung Daten. Können nicht zusammengelegt werden.
+ Sie müssen die Datensätze manuell bereinigen, bevor Sie die Personen zusammenlegen können.';
+ $error = true;
+ }
+ else
+ {
+ // Es gibt nur Rueckstellung Daten für die zu löschende Person: Update
+ foreach ($rueckstellung_has_personToDelete as $rueckstellung_toDelete)
+ {
+ $sql_query_upd1 .= "UPDATE public.tbl_rueckstellung SET person_id=" . $db->db_add_param($personToKeep, FHC_INTEGER) . " WHERE rueckstellung_id=" . $db->db_add_param($rueckstellung_toDelete->rueckstellung_id, FHC_INTEGER) . ";";
+ }
+ }
+ }
+ }
+
if ($error == false)
{
// Wenn bei einer der Personen das Foto gesperrt ist, dann die Sperre uebernehmen
@@ -437,7 +630,7 @@ if (isset($personToDelete) && isset($personToKeep) && $personToDelete >= 0 && $p
Alte Anmerkungen: ".$personToDelete_obj->anmerkungen;
$anmerkung .= "
-
+
Zusammengelegt mit Person-ID ".$personToDelete_obj->person_id." am ".date('d.m.Y H:i:s')." von ".$uid;
// Letztbenutzten Zugangscode abfragen und übernehmen
@@ -1335,7 +1528,7 @@ if ($filter != '' || ($person_id_1 != '' && $person_id_2 != ''))
$messageOutput .= '
'.$value;
}
}
- echo '
' . $messageOutput . '
';
+ echo '
' . $messageOutput . '
';
// Tabellen anzeigen
echo '