diff --git a/application/models/crm/KarrierepfadStudienplan_model.php b/application/models/crm/KarrierepfadStudienplan_model.php new file mode 100644 index 000000000..9baf99fd8 --- /dev/null +++ b/application/models/crm/KarrierepfadStudienplan_model.php @@ -0,0 +1,15 @@ +dbTable = 'public.tbl_karrierepfad_studienplan'; + $this->pk = array('karrierepfad_id', 'studienplan_id'); + $this->hasSequence = false; + } +} diff --git a/application/models/crm/Karrierepfad_model.php b/application/models/crm/Karrierepfad_model.php new file mode 100644 index 000000000..0e9a513c2 --- /dev/null +++ b/application/models/crm/Karrierepfad_model.php @@ -0,0 +1,44 @@ +dbTable = 'public.tbl_karrierepfad'; + $this->pk = 'karrierepfad_id'; + } + + /** + * Gets the Karrierepfade linked to a Studienplan, with the Bezeichnung in the user language. + * A Karrierepfad is selectable for a prestudent if it is aktiv and linked to the + * Studienplan of the last status. A value stored earlier stays valid without this check. + * + * @param integer $studienplan_id + * @param boolean $aktiv true: only active Karrierepfade + * + * @return stdClass + */ + public function getByStudienplan($studienplan_id, $aktiv = true) + { + $query = " + SELECT + kp.*, + kp.bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache = ? LIMIT 1)] AS bezeichnung + FROM public.tbl_karrierepfad kp + JOIN public.tbl_karrierepfad_studienplan USING (karrierepfad_id) + WHERE studienplan_id = ?"; + if ($aktiv) + $query .= " AND kp.aktiv"; + $query .= " ORDER BY kp.sort NULLS LAST, kp.karrierepfad_kurzbz"; + + return $this->execQuery($query, array(getUserLanguage(), $studienplan_id)); + } +} diff --git a/include/karrierepfad.class.php b/include/karrierepfad.class.php new file mode 100644 index 000000000..dabc220fc --- /dev/null +++ b/include/karrierepfad.class.php @@ -0,0 +1,142 @@ +load($karrierepfad_id); + } + + /** + * Loads a Karrierepfad + * @param integer $karrierepfad_id + * @return boolean + */ + public function load($karrierepfad_id) + { + if (!is_numeric($karrierepfad_id)) + { + $this->errormsg = 'Karrierepfad ID ist ungueltig'; + return false; + } + + $sprache = new sprache(); + $qry = "SELECT *, ".$sprache->getSprachQuery('bezeichnung_mehrsprachig')." + FROM public.tbl_karrierepfad + WHERE karrierepfad_id=".$this->db_add_param($karrierepfad_id, FHC_INTEGER); + + if (!$this->db_query($qry)) + { + $this->errormsg = 'Fehler beim Laden des Karrierepfads'; + return false; + } + + if (!$row = $this->db_fetch_object()) + { + $this->errormsg = 'Karrierepfad wurde nicht gefunden'; + return false; + } + + $this->setFromRow($this, $row, $sprache); + return true; + } + + /** + * Loads the Karrierepfade linked to a Studienplan into $this->result. + * A Karrierepfad is selectable for a prestudent if it is aktiv and linked to the + * Studienplan of the last status. A value stored earlier stays valid without this check. + * @param integer $studienplan_id + * @param boolean $aktiv true: only active Karrierepfade + * @return boolean + */ + public function getByStudienplan($studienplan_id, $aktiv = true) + { + if (!is_numeric($studienplan_id)) + { + $this->errormsg = 'Studienplan ID ist ungueltig'; + return false; + } + + $sprache = new sprache(); + $qry = "SELECT kp.*, ".$sprache->getSprachQuery('bezeichnung_mehrsprachig')." + FROM public.tbl_karrierepfad kp + JOIN public.tbl_karrierepfad_studienplan USING(karrierepfad_id) + WHERE studienplan_id=".$this->db_add_param($studienplan_id, FHC_INTEGER); + if ($aktiv) + $qry .= " AND kp.aktiv"; + $qry .= " ORDER BY kp.sort NULLS LAST, kp.karrierepfad_kurzbz"; + + if (!$this->db_query($qry)) + { + $this->errormsg = 'Fehler beim Laden der Karrierepfade'; + return false; + } + + while ($row = $this->db_fetch_object()) + { + $obj = new karrierepfad(); + $this->setFromRow($obj, $row, $sprache); + $this->result[] = $obj; + } + return true; + } + + private function setFromRow($obj, $row, $sprache) + { + $obj->karrierepfad_id = $row->karrierepfad_id; + $obj->karrierepfad_kurzbz = $row->karrierepfad_kurzbz; + $obj->karrierepfad_typ_kurzbz = $row->karrierepfad_typ_kurzbz; + $obj->studiengang_kz = $row->studiengang_kz; + $obj->bezeichnung_mehrsprachig = $sprache->parseSprachResult('bezeichnung_mehrsprachig', $row); + $obj->sort = $row->sort; + $obj->aktiv = $this->db_parse_bool($row->aktiv); + $obj->insertamum = $row->insertamum; + $obj->insertvon = $row->insertvon; + $obj->updateamum = $row->updateamum; + $obj->updatevon = $row->updatevon; + } +} diff --git a/include/prestudent.class.php b/include/prestudent.class.php index 32961b2be..8a5a8a2f9 100644 --- a/include/prestudent.class.php +++ b/include/prestudent.class.php @@ -77,6 +77,7 @@ class prestudent extends person public $priorisierung = null; public $foerderrelevant = null; public $standort_code = null; + public $karrierepfad_id = null; public $udf_values = null; public $status_kurzbz; @@ -176,6 +177,7 @@ class prestudent extends person $this->priorisierung = $row->priorisierung; $this->foerderrelevant = $this->db_parse_bool($row->foerderrelevant); $this->standort_code = $row->standort_code; + $this->karrierepfad_id = $row->karrierepfad_id; if(!person::load($row->person_id)) return false; @@ -268,7 +270,7 @@ class prestudent extends person reihungstest_id, anmeldungreihungstest, reihungstestangetreten, rt_gesamtpunkte, rt_punkte1, rt_punkte2, rt_punkte3, bismelden, insertamum, insertvon, updateamum, updatevon, anmerkung, dual, ausstellungsstaat, mentor, - gsstudientyp_kurzbz, aufnahmegruppe_kurzbz, priorisierung, zgvdoktor_erfuellt, foerderrelevant, standort_code) VALUES('. + gsstudientyp_kurzbz, aufnahmegruppe_kurzbz, priorisierung, zgvdoktor_erfuellt, foerderrelevant, standort_code, karrierepfad_id) VALUES('. $this->db_add_param($this->aufmerksamdurch_kurzbz).",". $this->db_add_param($this->person_id).",". @@ -312,7 +314,8 @@ class prestudent extends person $this->db_add_param($this->priorisierung).",". $this->db_add_param($this->zgvdoktor_erfuellt).",". $this->db_add_param($this->foerderrelevant, FHC_BOOLEAN).",". - $this->db_add_param($this->standort_code).");"; + $this->db_add_param($this->standort_code).",". + $this->db_add_param($this->karrierepfad_id, FHC_INTEGER).");"; } else { @@ -357,7 +360,8 @@ class prestudent extends person ' priorisierung='.$this->db_add_param($this->priorisierung).",". ' zgvdoktor_erfuellt='.$this->db_add_param($this->zgvdoktor_erfuellt).', '. ' foerderrelevant='.$this->db_add_param($this->foerderrelevant, FHC_BOOLEAN).",". - ' standort_code='.$this->db_add_param($this->standort_code)." ". + ' standort_code='.$this->db_add_param($this->standort_code).",". + ' karrierepfad_id='.$this->db_add_param($this->karrierepfad_id, FHC_INTEGER)." ". " WHERE prestudent_id=".$this->db_add_param($this->prestudent_id).";"; } @@ -1097,6 +1101,7 @@ class prestudent extends person $ps->priorisierung = $row->priorisierung; $ps->foerderrelevant = $row->foerderrelevant; $ps->standort_code = $row->standort_code; + $ps->karrierepfad_id = $row->karrierepfad_id; $ps->status_kurzbz = $row->status_kurzbz; $ps->studiensemester_kurzbz = $row->studiensemester_kurzbz; @@ -1632,6 +1637,7 @@ class prestudent extends person $obj->aufnahmegruppe_kurzbz = $row->aufnahmegruppe_kurzbz; $obj->priorisierung = $row->priorisierung; $obj->zgvdoktor_erfuellt = $row->zgvdoktor_erfuellt; + $obj->karrierepfad_id = $row->karrierepfad_id; if ($hasUDF) { @@ -2262,7 +2268,7 @@ class prestudent extends person aufnahmeschluessel, facheinschlberuf, anmeldungreihungstest, reihungstestangetreten, reihungstest_id, punkte, rt_punkte1, rt_punkte2, rt_punkte3, bismelden, person_id, anmerkung, mentor, ext_id_prestudent, dual, ausstellungsstaat, zgvdoktor_code, zgvdoktorort, zgvdoktordatum, zgvdoktornation, - gsstudientyp_kurzbz, aufnahmegruppe_kurzbz, priorisierung,zgvdoktor_erfuellt) VALUES('. + gsstudientyp_kurzbz, aufnahmegruppe_kurzbz, priorisierung,zgvdoktor_erfuellt, karrierepfad_id) VALUES('. $this->db_add_param($this->prestudent_id).','. $this->db_add_param($this->aufmerksamdurch_kurzbz).','. $this->db_add_param($this->studiengang_kz).','. @@ -2301,7 +2307,8 @@ class prestudent extends person $this->db_add_param($this->gsstudientyp_kurzbz).','. $this->db_add_param($this->aufnahmegruppe_kurzbz).','. $this->db_add_param($this->priorisierung).','. - $this->db_add_param($this->zgvdoktor_erfuellt).');'; + $this->db_add_param($this->zgvdoktor_erfuellt).','. + $this->db_add_param($this->karrierepfad_id, FHC_INTEGER).');'; if($log->save(true)) { diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php index 6839af95e..c553ceef1 100644 --- a/system/dbupdate_3.4.php +++ b/system/dbupdate_3.4.php @@ -106,6 +106,7 @@ require_once('dbupdate_3.4/54225_reihungstest_ablauf_fuer_quereinsteiger.php'); require_once('dbupdate_3.4/77757_widgets_berechtigungen.php'); require_once('dbupdate_3.4/77048_cis4_mitarbeiter_studstatus_widget.php'); require_once('dbupdate_3.4/83538_cis4_employees.php'); +require_once('dbupdate_3.4/84049_karrierepfade.php'); // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo '

Pruefe Tabellen und Attribute!

'; @@ -344,6 +345,9 @@ $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_karrierepfad" => array("karrierepfad_id","karrierepfad_kurzbz","karrierepfad_typ_kurzbz","studiengang_kz","bezeichnung_mehrsprachig","sort","aktiv","insertamum","insertvon","updateamum","updatevon"), + "public.tbl_karrierepfad_studienplan" => array("karrierepfad_id","studienplan_id"), + "public.tbl_karrierepfad_typ" => array("karrierepfad_typ_kurzbz","bezeichnung_mehrsprachig"), "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"), @@ -377,7 +381,7 @@ $tabellen=array( "public.tbl_preoutgoing_lehrveranstaltung" => array("preoutgoing_lehrveranstaltung_id","preoutgoing_id","bezeichnung","ects","endversion","insertamum","insertvon","updateamum","updatevon","wochenstunden","unitcode"), "public.tbl_preoutgoing_preoutgoing_status" => array("status_id","preoutgoing_status_kurzbz","preoutgoing_id","datum","insertamum","insertvon","updateamum","updatevon"), "public.tbl_preoutgoing_status" => array("preoutgoing_status_kurzbz","bezeichnung"), - "public.tbl_prestudent" => array("prestudent_id","aufmerksamdurch_kurzbz","person_id","studiengang_kz","berufstaetigkeit_code","ausbildungcode","zgv_code","zgvort","zgvdatum","zgvmas_code","zgvmaort","zgvmadatum","aufnahmeschluessel","facheinschlberuf","reihungstest_id","anmeldungreihungstest","reihungstestangetreten","rt_gesamtpunkte","rt_punkte1","rt_punkte2","bismelden","anmerkung","dual","insertamum","insertvon","updateamum","updatevon","ext_id","ausstellungsstaat","rt_punkte3", "zgvdoktor_code", "zgvdoktorort", "zgvdoktordatum","mentor","zgvnation","zgvmanation","zgvdoktornation","gsstudientyp_kurzbz","aufnahmegruppe_kurzbz","udf_values","priorisierung","foerderrelevant","standort_code","zgv_erfuellt","zgvmas_erfuellt","zgvdoktor_erfuellt"), + "public.tbl_prestudent" => array("prestudent_id","aufmerksamdurch_kurzbz","person_id","studiengang_kz","berufstaetigkeit_code","ausbildungcode","zgv_code","zgvort","zgvdatum","zgvmas_code","zgvmaort","zgvmadatum","aufnahmeschluessel","facheinschlberuf","reihungstest_id","anmeldungreihungstest","reihungstestangetreten","rt_gesamtpunkte","rt_punkte1","rt_punkte2","bismelden","anmerkung","dual","insertamum","insertvon","updateamum","updatevon","ext_id","ausstellungsstaat","rt_punkte3", "zgvdoktor_code", "zgvdoktorort", "zgvdoktordatum","mentor","zgvnation","zgvmanation","zgvdoktornation","gsstudientyp_kurzbz","aufnahmegruppe_kurzbz","udf_values","priorisierung","foerderrelevant","standort_code","zgv_erfuellt","zgvmas_erfuellt","zgvdoktor_erfuellt","karrierepfad_id"), "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_profil_update" => array("profil_update_id","uid","topic","requested_change","updateamum","updatevon","insertamum","insertvon","status","status_timestamp","status_message","attachment_id"), "public.tbl_profil_update_status" => array("status_kurzbz","beschreibung","bezeichnung_mehrsprachig"), diff --git a/system/dbupdate_3.4/84049_karrierepfade.php b/system/dbupdate_3.4/84049_karrierepfade.php new file mode 100644 index 000000000..509bd2967 --- /dev/null +++ b/system/dbupdate_3.4/84049_karrierepfade.php @@ -0,0 +1,120 @@ +db_query("SELECT 1 FROM public.tbl_karrierepfad_typ LIMIT 1")) +{ + $qry = " + CREATE TABLE public.tbl_karrierepfad_typ + ( + karrierepfad_typ_kurzbz character varying(32) NOT NULL, + bezeichnung_mehrsprachig character varying(256)[] NOT NULL, + CONSTRAINT pk_tbl_karrierepfad_typ PRIMARY KEY (karrierepfad_typ_kurzbz) + ); + COMMENT ON TABLE public.tbl_karrierepfad_typ IS 'Key Table of Karrierepfad types'; + + INSERT INTO public.tbl_karrierepfad_typ(karrierepfad_typ_kurzbz, bezeichnung_mehrsprachig) VALUES('marketing', '{Marketing, Marketing}'); + + GRANT SELECT, INSERT, UPDATE, DELETE ON public.tbl_karrierepfad_typ TO vilesci; + GRANT SELECT ON public.tbl_karrierepfad_typ TO web; + "; + + if (!$db->db_query($qry)) + echo 'public.tbl_karrierepfad_typ: '.$db->db_last_error().'
'; + else + echo 'public.tbl_karrierepfad_typ: Tabelle hinzugefuegt
'; +} + +// Add table public.tbl_karrierepfad +if (!$result = @$db->db_query("SELECT 1 FROM public.tbl_karrierepfad LIMIT 1")) +{ + $qry = " + CREATE SEQUENCE public.tbl_karrierepfad_karrierepfad_id_seq + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + + CREATE TABLE public.tbl_karrierepfad + ( + karrierepfad_id integer NOT NULL DEFAULT nextval('public.tbl_karrierepfad_karrierepfad_id_seq'), + karrierepfad_kurzbz character varying(32) NOT NULL, + karrierepfad_typ_kurzbz character varying(32) NOT NULL, + studiengang_kz integer NOT NULL, + bezeichnung_mehrsprachig character varying(256)[] NOT NULL, + sort smallint, + aktiv boolean NOT NULL DEFAULT true, + insertamum timestamp without time zone DEFAULT now(), + insertvon character varying(32), + updateamum timestamp without time zone, + updatevon character varying(32), + CONSTRAINT pk_tbl_karrierepfad PRIMARY KEY (karrierepfad_id), + CONSTRAINT uk_tbl_karrierepfad_karrierepfad_kurzbz UNIQUE (karrierepfad_kurzbz) + ); + COMMENT ON TABLE public.tbl_karrierepfad IS 'Marketing specialisations of a Studiengang. Not official, no Zeugnis, no BIS'; + COMMENT ON COLUMN public.tbl_karrierepfad.karrierepfad_kurzbz IS 'URL param value for Bewerbungstool'; + + ALTER TABLE public.tbl_karrierepfad ADD CONSTRAINT fk_tbl_karrierepfad_karrierepfad_typ_kurzbz FOREIGN KEY (karrierepfad_typ_kurzbz) + REFERENCES public.tbl_karrierepfad_typ(karrierepfad_typ_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT; + ALTER TABLE public.tbl_karrierepfad ADD CONSTRAINT fk_tbl_karrierepfad_studiengang_kz FOREIGN KEY (studiengang_kz) + REFERENCES public.tbl_studiengang(studiengang_kz) ON UPDATE CASCADE ON DELETE RESTRICT; + + GRANT SELECT, INSERT, UPDATE, DELETE ON public.tbl_karrierepfad TO vilesci; + GRANT SELECT ON public.tbl_karrierepfad TO web; + GRANT SELECT, UPDATE ON public.tbl_karrierepfad_karrierepfad_id_seq TO vilesci; + "; + + if (!$db->db_query($qry)) + echo 'public.tbl_karrierepfad: '.$db->db_last_error().'
'; + else + echo 'public.tbl_karrierepfad: Tabelle hinzugefuegt
'; +} + +// Add table public.tbl_karrierepfad_studienplan +if (!$result = @$db->db_query("SELECT 1 FROM public.tbl_karrierepfad_studienplan LIMIT 1")) +{ + $qry = " + CREATE TABLE public.tbl_karrierepfad_studienplan + ( + karrierepfad_id integer NOT NULL, + studienplan_id integer NOT NULL, + CONSTRAINT pk_tbl_karrierepfad_studienplan PRIMARY KEY (karrierepfad_id, studienplan_id) + ); + COMMENT ON TABLE public.tbl_karrierepfad_studienplan IS 'Studienpläne in which a Karrierepfad is selectable'; + + ALTER TABLE public.tbl_karrierepfad_studienplan ADD CONSTRAINT fk_tbl_karrierepfad_studienplan_karrierepfad_id FOREIGN KEY (karrierepfad_id) + REFERENCES public.tbl_karrierepfad(karrierepfad_id) ON UPDATE CASCADE ON DELETE RESTRICT; + ALTER TABLE public.tbl_karrierepfad_studienplan ADD CONSTRAINT fk_tbl_karrierepfad_studienplan_studienplan_id FOREIGN KEY (studienplan_id) + REFERENCES lehre.tbl_studienplan(studienplan_id) ON UPDATE CASCADE ON DELETE RESTRICT; + + GRANT SELECT, INSERT, UPDATE, DELETE ON public.tbl_karrierepfad_studienplan TO vilesci; + GRANT SELECT ON public.tbl_karrierepfad_studienplan TO web; + "; + + if (!$db->db_query($qry)) + echo 'public.tbl_karrierepfad_studienplan: '.$db->db_last_error().'
'; + else + echo 'public.tbl_karrierepfad_studienplan: Tabelle hinzugefuegt
'; +} + +// Add column karrierepfad_id to public.tbl_prestudent +if ($result = $db->db_query("SELECT 1 FROM information_schema.columns WHERE table_schema='public' AND table_name='tbl_prestudent' AND column_name='karrierepfad_id'")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = " + ALTER TABLE public.tbl_prestudent ADD COLUMN karrierepfad_id integer; + COMMENT ON COLUMN public.tbl_prestudent.karrierepfad_id IS 'Karrierepfad chosen by the applicant'; + + ALTER TABLE public.tbl_prestudent ADD CONSTRAINT fk_tbl_prestudent_karrierepfad_id FOREIGN KEY (karrierepfad_id) + REFERENCES public.tbl_karrierepfad(karrierepfad_id) ON UPDATE CASCADE ON DELETE RESTRICT; + "; + + if (!$db->db_query($qry)) + echo 'public.tbl_prestudent.karrierepfad_id: '.$db->db_last_error().'
'; + else + echo 'public.tbl_prestudent: Spalte karrierepfad_id hinzugefuegt
'; + } +} diff --git a/system/seeders/TST84049_000_Karrierepfade.sql b/system/seeders/TST84049_000_Karrierepfade.sql new file mode 100644 index 000000000..38de8e029 --- /dev/null +++ b/system/seeders/TST84049_000_Karrierepfade.sql @@ -0,0 +1,19 @@ +-- Test data Karrierepfade (ticket 84049) for Studiengang 3, Studienplan 3011 (VZ) +-- 31-33 active, 34 inactive; Studienplan 4011 has no Karrierepfade + +INSERT INTO public.tbl_karrierepfad (karrierepfad_id, karrierepfad_kurzbz, karrierepfad_typ_kurzbz, studiengang_kz, bezeichnung_mehrsprachig, sort, aktiv, insertvon) VALUES + (31, 'TSTITSEC', 'marketing', 3, '{IT Security, IT Security}', 1, true, 'seeder'), + (32, 'TSTAIDS', 'marketing', 3, '{AI und Data Science, AI and Data Science}', 2, true, 'seeder'), + (33, 'TSTSWE', 'marketing', 3, '{Software Engineering, Software Engineering}', 3, true, 'seeder'), + (34, 'TSTINAKTIV', 'marketing', 3, '{Inaktiver Karrierepfad, Inactive Karrierepfad}', 4, false, 'seeder'); + +SELECT setval('public.tbl_karrierepfad_karrierepfad_id_seq', (SELECT max(karrierepfad_id) FROM public.tbl_karrierepfad)); + +INSERT INTO public.tbl_karrierepfad_studienplan (karrierepfad_id, studienplan_id) VALUES + (31, 3011), + (32, 3011), + (33, 3011), + (34, 3011); + +-- One prestudent with a Karrierepfad for the display in Infocenter, StV and Reihungstest +UPDATE public.tbl_prestudent SET karrierepfad_id = 31 WHERE prestudent_id = 3301;