From c94f185308864352534642913dce69680a870f1d Mon Sep 17 00:00:00 2001 From: ma0048 Date: Wed, 10 Jul 2024 15:13:46 +0200 Subject: [PATCH 01/63] =?UTF-8?q?-=20faktor=20f=C3=BCr=20lvs=20hinzugefueg?= =?UTF-8?q?t?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/lehrveranstaltung_faktor.class.php | 258 ++++++++++++++++ soap/lehrveranstaltung_faktor.json.php | 123 ++++++++ system/dbupdate_3.4.php | 2 + system/dbupdate_3.4/40717_lv_faktor.php | 65 ++++ vilesci/lehre/lehrveranstaltung.php | 19 +- vilesci/lehre/lehrveranstaltung_details.php | 27 ++ vilesci/lehre/lehrveranstaltung_faktor.php | 309 ++++++++++++++++++++ 7 files changed, 801 insertions(+), 2 deletions(-) create mode 100644 include/lehrveranstaltung_faktor.class.php create mode 100644 soap/lehrveranstaltung_faktor.json.php create mode 100644 system/dbupdate_3.4/40717_lv_faktor.php create mode 100644 vilesci/lehre/lehrveranstaltung_faktor.php diff --git a/include/lehrveranstaltung_faktor.class.php b/include/lehrveranstaltung_faktor.class.php new file mode 100644 index 000000000..49459321b --- /dev/null +++ b/include/lehrveranstaltung_faktor.class.php @@ -0,0 +1,258 @@ +load($lehrveranstaltung_faktor_id); + } + + + public function load($lehrveranstaltung_faktor_id) + { + if (!is_numeric($lehrveranstaltung_faktor_id)) + { + $this->errormsg = 'Lehrveranstaltung_faktor_id muss eine gueltige Zahl sein'; + return false; + } + + $qry = "SELECT * FROM lehre.tbl_lehrveranstaltung_faktor + WHERE lehrveranstaltung_faktor_id=".$this->db_add_param($lehrveranstaltung_faktor_id, FHC_INTEGER); + + if (!$this->db_query($qry)) { + $this->errormsg = 'Datensatz konnte nicht geladen werden'; + return false; + } + + if ($row = $this->db_fetch_object()) + { + $this->lehrveranstaltung_faktor_id = $row->lehrveranstaltung_faktor_id; + $this->lehrveranstaltung_id = $row->lehrveranstaltung_id; + $this->faktor = $row->faktor; + $this->studiensemester_kurzbz_von = $row->studiensemester_kurzbz_von; + $this->studiensemester_kurzbz_bis = $row->studiensemester_kurzbz_bis; + } + + return true; + } + + public function loadByLV($lv_id, $von = null, $bis = null, $id = null) + { + + if (!is_numeric($lv_id)) + { + $this->errormsg = 'Lehrveranstaltung_faktor_id muss eine gueltige Zahl sein'; + return false; + } + $qry = "SELECT * + FROM lehre.tbl_lehrveranstaltung_faktor + LEFT JOIN public.tbl_studiensemester vonstsem + ON tbl_lehrveranstaltung_faktor.studiensemester_kurzbz_von = vonstsem.studiensemester_kurzbz + LEFT JOIN public.tbl_studiensemester bisstem + ON tbl_lehrveranstaltung_faktor.studiensemester_kurzbz_bis = bisstem.studiensemester_kurzbz + WHERE lehrveranstaltung_id = ".$this->db_add_param($lv_id, FHC_INTEGER); + + if(!empty($von)) + { + $qry .= " + AND (bisstem.ende >= ( + SELECT start + FROM public.tbl_studiensemester + WHERE studiensemester_kurzbz = " . $this->db_add_param($von, FHC_STRING) . " + ) + OR bisstem.ende IS NULL + )"; + } + + if(!empty($bis) && $bis !== "") + { + $qry .= " + AND + (vonstsem.start <= ( + SELECT ende + FROM public.tbl_studiensemester + WHERE studiensemester_kurzbz = " . $this->db_add_param($bis, FHC_STRING) . " + )) + "; + } + + if (!empty($id) && $id !== "") + { + $qry .= " + AND + lehrveranstaltung_faktor_id != ". $this->db_add_param($id, FHC_INTEGER); + } + + if (!$result = $this->db_query($qry)) { + $this->errormsg = 'Datensatz konnte nicht geladen werden'; + return false; + } + + while ($row = $this->db_fetch_object($result)) + { + $lv_faktor_objekt = new lehrveranstaltung_faktor(); + + $lv_faktor_objekt->lehrveranstaltung_faktor_id = $row->lehrveranstaltung_faktor_id; + $lv_faktor_objekt->lehrveranstaltung_id = $row->lehrveranstaltung_id; + $lv_faktor_objekt->faktor = $row->faktor; + $lv_faktor_objekt->studiensemester_kurzbz_von = $row->studiensemester_kurzbz_von; + $lv_faktor_objekt->studiensemester_kurzbz_bis = $row->studiensemester_kurzbz_bis; + + $this->lv_faktoren[] = $lv_faktor_objekt; + } + + return true; + } + + public function addFaktor($lv_id, $faktor, $von, $bis = NULL) + { + $qry = 'INSERT INTO lehre.tbl_lehrveranstaltung_faktor (lehrveranstaltung_id, faktor, studiensemester_kurzbz_von, studiensemester_kurzbz_bis) + VALUES ('. $this->db_add_param($lv_id, FHC_INTEGER) . ', '. + $this->db_add_param($faktor, FHC_INTEGER) . ', '. + $this->db_add_param($von, FHC_STRING) . ', '. + $this->db_add_param($bis, FHC_STRING) . ');'; + + if ($this->db_query($qry)) + { + $qry_id = "SELECT currval('lehre.lehrveranstaltung_faktor_id_seq') as id;"; + if($this->db_query($qry_id)) + { + if($row = $this->db_fetch_object()) + { + $this->db_query('COMMIT'); + return [ + 'id' => $row->id, + 'lv_id' => $lv_id, + 'faktor' => $faktor, + 'von' => $von, + 'bis' => $bis + ]; + } + else + { + $this->db_query('ROLLBACK'); + return [ + 'status' => 'error', + 'message' => 'Fehler beim Einfügen in die Datenbank:' + ]; + } + } + else + { + $this->db_query('ROLLBACK'); + return [ + 'status' => 'error', + 'message' => 'Fehler beim Einfügen in die Datenbank:' + ]; + } + } + else + { + return [ + 'status' => 'error', + 'message' => 'Fehler beim Einfügen in die Datenbank:' + ]; + } + } + + public function updateFaktor($id, $faktor, $von, $bis) + { + $qry = "UPDATE lehre.tbl_lehrveranstaltung_faktor + SET faktor = ". $this->db_add_param($faktor) ." , + studiensemester_kurzbz_von = ". $this->db_add_param($von) .", + studiensemester_kurzbz_bis = ". $this->db_add_param($bis) ." + WHERE lehrveranstaltung_faktor_id = ". $this->db_add_param($id, FHC_INTEGER); + + if ($this->db_query($qry)) + { + return true; + } + else + { + return [ + 'status' => 'error', + 'message' => 'Fehler beim Einfügen in die Datenbank:' + ]; + } + } + + public function getAkt($lv_id) + { + if (!is_numeric($lv_id)) + { + $this->errormsg = 'Lehrveranstaltung_id muss eine gueltige Zahl sein'; + return false; + } + + $qry = "SELECT * + FROM lehre.tbl_lehrveranstaltung_faktor + LEFT JOIN public.tbl_studiensemester vonstsem + ON tbl_lehrveranstaltung_faktor.studiensemester_kurzbz_von = vonstsem.studiensemester_kurzbz + LEFT JOIN public.tbl_studiensemester bisstem + ON tbl_lehrveranstaltung_faktor.studiensemester_kurzbz_bis = bisstem.studiensemester_kurzbz + WHERE lehrveranstaltung_id = ".$this->db_add_param($lv_id, FHC_INTEGER) . " + AND (vonstsem.start <= now() OR vonstsem.start IS NULL) + AND (bisstem.ende >= now() OR bisstem.ende IS NULL) + ORDER BY vonstsem.start DESC LIMIT 1 + "; + + + if (!$this->db_query($qry)) { + $this->errormsg = 'Datensatz konnte nicht geladen werden'; + return false; + } + + if ($row = $this->db_fetch_object()) + { + $this->lehrveranstaltung_faktor_id = $row->lehrveranstaltung_faktor_id; + $this->lehrveranstaltung_id = $row->lehrveranstaltung_id; + $this->faktor = $row->faktor; + $this->studiensemester_kurzbz_von = $row->studiensemester_kurzbz_von; + $this->studiensemester_kurzbz_bis = $row->studiensemester_kurzbz_bis; + } + + return true; + } + + + public function deleteFaktor($id) + { + $qry = "DELETE FROM lehre.tbl_lehrveranstaltung_faktor + WHERE lehrveranstaltung_faktor_id = ". $this->db_add_param($id, FHC_INTEGER); + + if ($this->db_query($qry)) + { + return true; + } + else + { + return [ + 'status' => 'error', + 'message' => 'Fehler beim Löschen aus der Datenbank:' + ]; + } + } +} +?> diff --git a/soap/lehrveranstaltung_faktor.json.php b/soap/lehrveranstaltung_faktor.json.php new file mode 100644 index 000000000..49f13ac47 --- /dev/null +++ b/soap/lehrveranstaltung_faktor.json.php @@ -0,0 +1,123 @@ +getBerechtigungen($uid); + +if(!$rechte->isBerechtigt('basis/person', null, 'suid')) +{ + exit('Sie haben keine Berechtigung für die Seite'); +} + +$method = isset($_REQUEST['method']) ? $_REQUEST['method']: '' ; +$lv_faktor = new lehrveranstaltung_faktor(); + +switch($method) +{ + case 'addFaktor': + $faktor = isset($_REQUEST['faktor']) ? $_REQUEST['faktor']: '' ; + if ($faktor !== '') + { + if (!isRightType($faktor['lv_id'])) + { + echo json_encode([ + 'status' => 'error', + 'message' => 'Nur LVs und Templates möglich' + ]); + break; + } + if (vonHigherThanBis($faktor['von'], $faktor['bis'])) + { + echo json_encode([ + 'status' => 'error', + 'message' => 'Von nach Bis' + ]); + break; + } + if (exists($faktor['lv_id'], $faktor['von'], $faktor['bis'])) + { + echo json_encode([ + 'status' => 'error', + 'message' => 'Für den Zeitraum bereits vorhanden' + ]); + break; + } + + $result = $lv_faktor->addFaktor($faktor['lv_id'], $faktor['faktor'], $faktor['von'], $faktor['bis']); + echo json_encode($result); + } + break; + case 'updateFaktor': + $faktor = isset($_REQUEST['faktor']) ? $_REQUEST['faktor']: '' ; + if ($faktor !== '') + { + if (vonHigherThanBis($faktor['von'], $faktor['bis'])) + { + echo json_encode([ + 'status' => 'error', + 'message' => 'Von nach Bis' + ]); + break; + } + if (exists($faktor['lv_id'], $faktor['von'], $faktor['bis'], $faktor['id'])) + { + echo json_encode([ + 'status' => 'error', + 'message' => 'Für den Zeitraum bereits vorhanden' + ]); + break; + } + + $result = $lv_faktor->updateFaktor($faktor['id'], $faktor['faktor'], $faktor['von'], $faktor['bis']); + echo json_encode($result); + } + break; + case 'deleteFaktor': + $faktor = isset($_REQUEST['faktor']) ? $_REQUEST['faktor']: '' ; + if ($faktor !== '') + { + $result = $lv_faktor->deleteFaktor($faktor['id']); + echo json_encode($result); + } + break; + default: + break; +} + +function isRightType($lv_id) +{ + $lv = new lehrveranstaltung($lv_id); + if (in_array($lv->lehrtyp_kurzbz, array('lv', 'tpl'))) + return true; + + return false; +} + +function exists($lv_id, $von, $bis, $id = null) +{ + $lv_faktor = new lehrveranstaltung_faktor(); + $lv_faktor->loadByLV($lv_id, $von, $bis, $id); + return !empty($lv_faktor->lv_faktoren); +} + +function vonHigherThanBis($von, $bis) +{ + $vonStsem = new studiensemester($von); + $bisStsem = new studiensemester($bis); + + if (is_null($bis) || $bis === "") + return false; + if ($vonStsem->start > $bisStsem->start) + return true; + else + return false; + +} + +?> diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php index 9fb7f0ee9..06b1e0cb4 100644 --- a/system/dbupdate_3.4.php +++ b/system/dbupdate_3.4.php @@ -56,6 +56,7 @@ require_once('dbupdate_3.4/36530_bis_internationsalisierung_codextabelle_neuerun require_once('dbupdate_3.4/34543_ux_template.php'); require_once('dbupdate_3.4/17513_Entwicklungsteam.php'); require_once('dbupdate_3.4/28575_softwarebereitstellung.php'); +require_once('dbupdate_3.4/40717_lv_faktor.php'); // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo '

Pruefe Tabellen und Attribute!

'; @@ -246,6 +247,7 @@ $tabellen=array( "lehre.tbl_zeitfenster" => array("wochentag","stunde","ort_kurzbz","studiengang_kz","gewicht"), "lehre.tbl_zeugnis" => array("zeugnis_id","student_uid","zeugnis","erstelltam","gedruckt","titel","bezeichnung","updateamum","updatevon","insertamum","insertvon","ext_id"), "lehre.tbl_zeugnisnote" => array("lehrveranstaltung_id","student_uid","studiensemester_kurzbz","note","uebernahmedatum","benotungsdatum","bemerkung","updateamum","updatevon","insertamum","insertvon","ext_id","punkte"), + "lehre.tbl_lehrveranstaltung_faktor" => array("lehrveranstaltung_faktor_id", "lehrveranstaltung_id","faktor","studiensemester_kurzbz_von","studiensemester_kurzbz_bis","insertamum","insertvon","updateamum","updatevon"), "public.ci_apikey" => array("apikey_id","key","level","ignore_limits","date_created"), "public.tbl_adresse" => array("adresse_id","person_id","name","strasse","plz","ort","gemeinde","nation","typ","heimatadresse","zustelladresse","firma_id","updateamum","updatevon","insertamum","insertvon","ext_id","rechnungsadresse","anmerkung", "co_name"), "public.tbl_adressentyp" => array("adressentyp_kurzbz", "bezeichnung", "bezeichnung_mehrsprachig", "sort"), diff --git a/system/dbupdate_3.4/40717_lv_faktor.php b/system/dbupdate_3.4/40717_lv_faktor.php new file mode 100644 index 000000000..932d6fd40 --- /dev/null +++ b/system/dbupdate_3.4/40717_lv_faktor.php @@ -0,0 +1,65 @@ +db_query("SELECT 1 FROM lehre.tbl_lehrveranstaltung_faktor LIMIT 1")) +{ + $qry = " + + CREATE TABLE lehre.tbl_lehrveranstaltung_faktor + ( + lehrveranstaltung_faktor_id integer NOT NULL, + lehrveranstaltung_id integer NOT NULL, + faktor numeric NOT NULL, + studiensemester_kurzbz_von varchar(16) NOT NULL, + studiensemester_kurzbz_bis varchar(16), + insertamum timestamp DEFAULT NOW(), + insertvon varchar(32), + updateamum timestamp, + updatevon varchar(32), + CONSTRAINT tbl_lehrveranstaltung_faktor_pk PRIMARY KEY (lehrveranstaltung_faktor_id) + ); + + CREATE SEQUENCE lehre.lehrveranstaltung_faktor_id_seq + START WITH 1 + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + + ALTER TABLE lehre.tbl_lehrveranstaltung_faktor ALTER COLUMN lehrveranstaltung_faktor_id SET DEFAULT nextval('lehre.lehrveranstaltung_faktor_id_seq'); + ALTER TABLE lehre.tbl_lehrveranstaltung_faktor ADD CONSTRAINT fk_lehrveranstaltung_faktor_lehrveranstaltung_id FOREIGN KEY (lehrveranstaltung_id) REFERENCES lehre.tbl_lehrveranstaltung (lehrveranstaltung_id) ON DELETE RESTRICT ON UPDATE CASCADE; + ALTER TABLE lehre.tbl_lehrveranstaltung_faktor ADD CONSTRAINT fk_lehrveranstaltung_faktor_studiensemester_von FOREIGN KEY (studiensemester_kurzbz_von) REFERENCES public.tbl_studiensemester(studiensemester_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT; + ALTER TABLE lehre.tbl_lehrveranstaltung_faktor ADD CONSTRAINT fk_lehrveranstaltung_faktor_studiensemester_bis FOREIGN KEY (studiensemester_kurzbz_bis) REFERENCES public.tbl_studiensemester(studiensemester_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT; + + GRANT SELECT ON lehre.tbl_lehrveranstaltung_faktor TO web; + GRANT SELECT, UPDATE, INSERT, DELETE ON lehre.tbl_lehrveranstaltung_faktor TO vilesci; + GRANT SELECT ON lehre.lehrveranstaltung_faktor_id_seq TO web; + GRANT SELECT, UPDATE, INSERT, DELETE ON lehre.lehrveranstaltung_faktor_id_seq TO vilesci; + "; + + if (!$db->db_query($qry)) + echo 'lehre.tbl_lehrveranstaltung_faktor: ' . $db->db_last_error() . '
'; + else + echo 'Tabelle: lehre.tbl_lehrveranstaltung_faktor erstellt!'; + + //TODO ggf default wert in eine config + $qry = " + INSERT INTO lehre.tbl_lehrveranstaltung_faktor + (lehrveranstaltung_id, faktor, studiensemester_kurzbz_von, insertvon) + ( + SELECT lehrveranstaltung_id, + 2, + ( + SELECT public.tbl_studiensemester.studiensemester_kurzbz + FROM public.tbl_studiensemester + ORDER BY start LIMIT 1 + ), + 'checksystem' + FROM lehre.tbl_lehrveranstaltung + WHERE lehrtyp_kurzbz IN ('lv', 'tpl') + ); + "; + if (!$db->db_query($qry)) + echo 'lehre.tbl_lehrveranstaltung_faktor: ' . $db->db_last_error() . '
'; + else + echo 'Tabelle: lehre.tbl_lehrveranstaltung_faktor befüllt!'; +} diff --git a/vilesci/lehre/lehrveranstaltung.php b/vilesci/lehre/lehrveranstaltung.php index ab7abd9cd..2b3346d02 100644 --- a/vilesci/lehre/lehrveranstaltung.php +++ b/vilesci/lehre/lehrveranstaltung.php @@ -32,6 +32,7 @@ require_once('../../include/organisationsform.class.php'); require_once('../../include/addon.class.php'); require_once('../../include/sprache.class.php'); require_once('../../include/lehrmodus.class.php'); +require_once('../../include/lehrveranstaltung_faktor.class.php'); if (!$db = new basis_db()) die('Es konnte keine Verbindung zum Server aufgebaut werden.'); @@ -1108,7 +1109,8 @@ if ($result_lv!=0) { echo "LV-Angebot kompatible LV - Aktion"; + Aktion + Faktor"; } echo ""; @@ -1326,7 +1328,20 @@ if ($result_lv!=0) '; echo 'Kompatible LV'; - echo 'löschen'; + echo ' + löschen + '; + + if (in_array($row->lehrtyp_kurzbz, array("tpl", "lv"))) + echo '
Faktor'; + echo ''; + echo ' + '; + + $lv_faktor = new lehrveranstaltung_faktor(); + $lv_faktor->getAkt($row->lehrveranstaltung_id); + + echo $lv_faktor->faktor.''; echo "\n"; } } diff --git a/vilesci/lehre/lehrveranstaltung_details.php b/vilesci/lehre/lehrveranstaltung_details.php index bad2a7d93..60f2fc3c9 100644 --- a/vilesci/lehre/lehrveranstaltung_details.php +++ b/vilesci/lehre/lehrveranstaltung_details.php @@ -30,6 +30,8 @@ require_once('../../include/lehrmodus.class.php'); require_once('../../include/benutzerberechtigung.class.php'); require_once('../../include/studienplan.class.php'); + require_once('../../include/lehrveranstaltung_faktor.class.php'); + require_once('../../include/studiensemester.class.php'); if (!$db = new basis_db()) die('Es konnte keine Verbindung zum Server aufgebaut werden.'); @@ -139,6 +141,31 @@ $reloadstr .= " window.location.href='".$_SERVER['PHP_SELF']."?stg_kz=$lv->studiengang_kz&semester=$lv->semester&neu=true';"; } $reloadstr .= "\n"; + + if (in_array($lv->lehrtyp_kurzbz, array('tpl', 'lv')) && $lv->new === true) + { + $lv_faktor = new lehrveranstaltung_faktor(); + $studiensemester = new studiensemester(); + $studiensemester_von = $studiensemester->getLastOrAktSemester(); + if ($lv->lehrtyp_kurzbz === 'lv' && $_POST['lehrveranstaltung_template_id'] !== '') + { + + $lv_faktor->getAkt($_POST['lehrveranstaltung_template_id']); + //TODO Faktor in eine Config + if (is_null($lv_faktor->faktor)) + $lv_faktor->addFaktor($lv->lehrveranstaltung_id, 2, $studiensemester_von); + else + $lv_faktor->addFaktor($lv->lehrveranstaltung_id, $lv_faktor->faktor, $studiensemester_von); + } + else + { + $lv_faktor->loadByLV($lv->lehrveranstaltung_id); + if (empty($lv_faktor->lv_faktoren)) + { + $lv_faktor->addFaktor($lv->lehrveranstaltung_id, 2, $studiensemester_von); + } + } + } } } diff --git a/vilesci/lehre/lehrveranstaltung_faktor.php b/vilesci/lehre/lehrveranstaltung_faktor.php new file mode 100644 index 000000000..d2b39427f --- /dev/null +++ b/vilesci/lehre/lehrveranstaltung_faktor.php @@ -0,0 +1,309 @@ +getBerechtigungen($uid); + +$sprache = getSprache(); +$p = new phrasen($sprache); + +if(!$rechte->isBerechtigt('basis/person', 'suid')) + die('Sie haben keine Berechtigung für diese Seite'); + +echo ' + + + + + + + + + + + +'; +?> + +load($lehrveranstaltung_id); + +$faktor = new lehrveranstaltung_faktor(); +$faktor->loadByLV($lv->lehrveranstaltung_id); + +$studiensemester = new studiensemester(); +$studiensemester->getAll('desc'); + + +echo ' + + +

Faktor - '. $lv->bezeichnung . ' - ' . $lv->lehrveranstaltung_id . '

'; + +echo ' +
+ + + + + + + + + + + + +
+ + + + + + + + + + + + +'; + +if(count($faktor->lv_faktoren) > 0) +{ + foreach($faktor->lv_faktoren as $lv_faktor) + { + echo " + + + + + + " + ; + } +} + + ' +
'.$p->t('lv/faktor').''.$p->t('global/von').''.$p->t('global/bis').''.$p->t('global/bearbeiten').''.$p->t('global/loeschen').'
".$lv_faktor->faktor."".$lv_faktor->studiensemester_kurzbz_von."".$lv_faktor->studiensemester_kurzbz_bis."
+'; + +?> + + From 6f0575304c1a5674664b788690828cfe044a9d34 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Fri, 9 Aug 2024 11:54:01 +0200 Subject: [PATCH 02/63] - ent/sperren mit hochkomma bug fixed --- vilesci/stammdaten/auswertung_fhtw.php | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/vilesci/stammdaten/auswertung_fhtw.php b/vilesci/stammdaten/auswertung_fhtw.php index aa39889cb..8d928dacf 100644 --- a/vilesci/stammdaten/auswertung_fhtw.php +++ b/vilesci/stammdaten/auswertung_fhtw.php @@ -2411,12 +2411,13 @@ else }); } } - function prueflingEntSperren(person_id, name, art) + function prueflingEntSperren(element) { - if (art === true) - var text = "sperren"; - else if (art === false) - var text = "entsperren"; + var person_id = element.getAttribute("data-person-id"); + var name = element.getAttribute("data-person-name"); + var art = element.getAttribute("data-art") === "true"; + + let text = art ? "sperren" : "entsperren"; if (confirm("Wollen Sie den Studenten "+ name + " wirklich " + text + "?")) { @@ -3279,10 +3280,18 @@ else echo " - + - + "; From 7dc781612313af27417f38acc7d85333e5bc80ad Mon Sep 17 00:00:00 2001 From: ma0048 Date: Fri, 30 Aug 2024 08:21:35 +0200 Subject: [PATCH 03/63] - fas neuer filter ueberfaellige buchungen --- content/student/studentenoverlay.xul.php | 1 + rdf/student.rdf.php | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/content/student/studentenoverlay.xul.php b/content/student/studentenoverlay.xul.php index cdaa2e69b..739cde39c 100644 --- a/content/student/studentenoverlay.xul.php +++ b/content/student/studentenoverlay.xul.php @@ -208,6 +208,7 @@ else + diff --git a/rdf/student.rdf.php b/rdf/student.rdf.php index 40cf28e01..61c903bd6 100644 --- a/rdf/student.rdf.php +++ b/rdf/student.rdf.php @@ -190,6 +190,25 @@ function checkfilter($row, $filter2, $buchungstyp = null) : false; return $filtered; } + else if ($filter2 === 'ueberfaelligebuchungen') + { + $qry = "SELECT sum(betrag) as summe + FROM tbl_konto + WHERE person_id=".$db->db_add_param($row->person_id, FHC_INTEGER) ." + AND buchungsdatum < NOW() + " + ; + + if($kontofilterstg=='true') + $qry.=" AND studiengang_kz=".$db->db_add_param($row->studiengang_kz); + if($buchungstyp != null && $buchungstyp != "alle") + $qry.=" AND buchungstyp_kurzbz=".$db->db_add_param($buchungstyp); + + if($db->db_query($qry)) + if($row_filter = $db->db_fetch_object()) + if($row_filter->summe=='0.00' || $row_filter->summe=='' || $row_filter->summe=='0') + return false; + } return true; } From 0f708f4934d85b4353bd4c1aa38192634666d400 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Fri, 27 Sep 2024 11:23:54 +0200 Subject: [PATCH 04/63] - added app pep - phrases - added error - added model --- .../LehrveranstaltungFaktor_model.php | 14 +++++++ system/phrasesupdate.php | 40 +++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 application/models/education/LehrveranstaltungFaktor_model.php diff --git a/application/models/education/LehrveranstaltungFaktor_model.php b/application/models/education/LehrveranstaltungFaktor_model.php new file mode 100644 index 000000000..c8a0c8aa8 --- /dev/null +++ b/application/models/education/LehrveranstaltungFaktor_model.php @@ -0,0 +1,14 @@ +dbTable = 'lehre.tbl_lehrveranstaltung_faktor'; + $this->pk = 'lehrveranstaltung_faktor_id'; + } +} diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index b7bd66e1d..afda422d7 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -26500,6 +26500,46 @@ array( ) ) ), + array( + 'app' => 'pep', + 'category' => 'ui', + 'phrase' => 'maprojohneoe', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Mitarbeiter und Projekt sind der Organisationseinheit nicht zugeordnet.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Employee and project are not assigned to the organizational unit.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'pep', + 'category' => 'ui', + 'phrase' => 'infoandepl/kfl', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Mitarbeiter und Projekt sind der Organisationseinheit nicht zugeordnet.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Employee and project are not assigned to the organizational unit.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), ); From 1c612178915737fb4e1ea6c11c0b5a7e1be5bab2 Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Sun, 13 Oct 2024 13:34:07 +0200 Subject: [PATCH 05/63] lvplan: changed feedback phrase and Link --- cis/private/lvplan/index.php | 3 +- cis/private/lvplan/stpl_detail.php | 78 ++++++++++++++-------------- cis/private/lvplan/stpl_kalender.php | 2 +- cis/private/lvplan/stpl_week.php | 2 +- locale/de-AT/lvplan.php | 3 +- locale/en-US/lvplan.php | 1 + 6 files changed, 46 insertions(+), 43 deletions(-) diff --git a/cis/private/lvplan/index.php b/cis/private/lvplan/index.php index 7e7e8e28e..36a695d7c 100644 --- a/cis/private/lvplan/index.php +++ b/cis/private/lvplan/index.php @@ -98,6 +98,7 @@ if(!$result_ort) die("ort not found!"); $num_rows_ort=$db->db_num_rows($result_ort); + /*$sql_query="SELECT student_uid FROM public.tbl_student ORDER BY student_uid"; $result_lektor=$db->db_query($sql_query); if(!$result_lektor) @@ -531,8 +532,8 @@ if(!defined('CIS_LVPLAN_ZUSATZMENUE_ANZEIGEN') || CIS_LVPLAN_ZUSATZMENUE_ANZEIGE echo '

'.$p->t('lvplan/raumsuche').'

-

'.$p->t('lvplan/fehlerUndFeedback').'

'.$p->t('global/hilfe').'

+

'.$p->t('lvplan/FragenZuLvPlan', array(MAIL_LVPLAN)).'

'; } diff --git a/cis/private/lvplan/stpl_detail.php b/cis/private/lvplan/stpl_detail.php index 87d4a70ff..7ab3181c1 100644 --- a/cis/private/lvplan/stpl_detail.php +++ b/cis/private/lvplan/stpl_detail.php @@ -37,8 +37,8 @@ require_once('../../../include/datum.class.php'); require_once('../../../include/phrasen.class.php'); require_once('../../../include/mitarbeiter.class.php'); -$sprache = getSprache(); -$p = new phrasen($sprache); +$sprache = getSprache(); +$p = new phrasen($sprache); if (!$db = new basis_db()) die($p->t('global/fehlerBeimOeffnenDerDatenbankverbindung')); @@ -46,7 +46,7 @@ if (!$db = new basis_db()) // Variablen uebernehmen if (isset($_GET['type'])) $type=$_GET['type']; -else +else $type=''; if (isset($_GET['datum'])) @@ -61,7 +61,7 @@ if (isset($_GET['stg_kz'])) $stg_kz=$_GET['stg_kz']; if (isset($_GET['sem'])) $sem=$_GET['sem']; - + if($sem!='' && !is_numeric($sem)) die($p->t('lvplan/semesterIstUngueltig')); @@ -70,7 +70,7 @@ if($stunde!='' && !is_numeric($stunde)) if (isset($_GET['ver'])) $ver=$_GET['ver']; - + if (isset($_GET['grp'])) $grp=$_GET['grp']; if (isset($_GET['gruppe_kurzbz'])) @@ -83,32 +83,32 @@ if(!$datum_obj->checkDatum($datum)) $stsem = getStudiensemesterFromDatum($datum); //Stundenplan $sql_query=" -SELECT - campus.vw_stundenplan.*, lehrfach.bezeichnung, vw_mitarbeiter.titelpre, +SELECT + campus.vw_stundenplan.*, lehrfach.bezeichnung, vw_mitarbeiter.titelpre, vw_mitarbeiter.titelpost, vw_mitarbeiter.nachname, vw_mitarbeiter.vorname, - (SELECT - count(*) - FROM - public.tbl_studentlehrverband - WHERE - studiengang_kz=vw_stundenplan.studiengang_kz + (SELECT + count(*) + FROM + public.tbl_studentlehrverband + WHERE + studiengang_kz=vw_stundenplan.studiengang_kz AND semester=vw_stundenplan.semester AND (verband=vw_stundenplan.verband OR vw_stundenplan.verband is null OR trim(vw_stundenplan.verband)='') AND (gruppe=vw_stundenplan.gruppe OR vw_stundenplan.gruppe is null OR trim(vw_stundenplan.gruppe)='') - AND studiensemester_kurzbz=".$db->db_add_param($stsem).") as anzahl_lvb, - (SELECT - count(*) - FROM - public.tbl_benutzergruppe - WHERE - gruppe_kurzbz=vw_stundenplan.gruppe_kurzbz + AND studiensemester_kurzbz=".$db->db_add_param($stsem).") as anzahl_lvb, + (SELECT + count(*) + FROM + public.tbl_benutzergruppe + WHERE + gruppe_kurzbz=vw_stundenplan.gruppe_kurzbz AND studiensemester_kurzbz=".$db->db_add_param($stsem).") as anzahl_grp -FROM - campus.vw_stundenplan +FROM + campus.vw_stundenplan JOIN lehre.tbl_lehrveranstaltung as lehrfach ON (vw_stundenplan.lehrfach_id=lehrfach.lehrveranstaltung_id) JOIN campus.vw_mitarbeiter USING (uid) -WHERE - datum=".$db->db_add_param($datum)." +WHERE + datum=".$db->db_add_param($datum)." AND stunde=".$db->db_add_param($stunde); if ($type=='lektor') @@ -121,7 +121,7 @@ else { if($stg_kz=='' || $sem=='') die('Fehlerhafte Parameteruebergabe'); - + if($type=="verband" && $stg_kz!='' && $sem!='') { // Studiengangsansicht @@ -133,7 +133,7 @@ else else { // Pers. Ansicht - $sql_query.=" AND EXISTS (SELECT 1 FROM campus.vw_student_lehrveranstaltung + $sql_query.=" AND EXISTS (SELECT 1 FROM campus.vw_student_lehrveranstaltung WHERE lehreinheit_id=vw_stundenplan.lehreinheit_id AND uid=".$db->db_add_param($pers_uid).")"; } // Manfred weiss nicht mehr warum, aber wir aktivieren 23-09-2009 @@ -154,16 +154,16 @@ $num_rows_stpl = $db->db_num_rows($erg_stpl); //Reservierungen $sql_query=" -SELECT - vw_reservierung.*, vw_mitarbeiter.titelpre, vw_mitarbeiter.titelpost, - vw_mitarbeiter.vorname, vw_mitarbeiter.nachname, reserviert_von.titelpre AS titelpre_reserviertvon, reserviert_von.titelpost AS titelpost_reserviertvon, - reserviert_von.vorname AS vorname_reserviertvon, reserviert_von.nachname AS nachname_reserviertvon -FROM +SELECT + vw_reservierung.*, vw_mitarbeiter.titelpre, vw_mitarbeiter.titelpost, + vw_mitarbeiter.vorname, vw_mitarbeiter.nachname, reserviert_von.titelpre AS titelpre_reserviertvon, reserviert_von.titelpost AS titelpost_reserviertvon, + reserviert_von.vorname AS vorname_reserviertvon, reserviert_von.nachname AS nachname_reserviertvon +FROM campus.vw_reservierung JOIN campus.vw_mitarbeiter ON vw_reservierung.uid=vw_mitarbeiter.uid LEFT JOIN campus.vw_mitarbeiter reserviert_von ON vw_reservierung.insertvon=reserviert_von.uid -WHERE - datum=".$db->db_add_param($datum)." +WHERE + datum=".$db->db_add_param($datum)." AND stunde=".$db->db_add_param($stunde); if (isset($ort_kurzbz) && $type=='ort') @@ -172,7 +172,7 @@ if ($type=='lektor') $sql_query.=" AND vw_reservierung.uid=".$db->db_add_param($pers_uid); if ($type=='verband' || $type=='student') { - $sql_query.=" AND studiengang_kz=".$db->db_add_param($stg_kz)." + $sql_query.=" AND studiengang_kz=".$db->db_add_param($stg_kz)." AND (semester=".$db->db_add_param($sem)." OR semester=0 OR semester IS NULL)"; } $sql_query.=' ORDER BY titel LIMIT 100'; @@ -258,12 +258,12 @@ if ($num_rows_stpl>0) echo (!is_null($semester) && !empty($semester)?'':''); echo ' - + '.$db->convert_html_chars($gruppe_kurzbz).' '.$db->convert_html_chars($titel).' - - '; + + '; } echo '
'; } @@ -294,7 +294,7 @@ if ($num_rows_repl>0) $pers_nachname_reserviertvon=$row->nachname_reserviertvon; $ort->load($ortkurzbz); - + echo ''; echo ''.$db->convert_html_chars($titel).''; echo ''.(!empty($ortkurzbz)?($ort->content_id!=''?''.$db->convert_html_chars($ortkurzbz).'':$db->convert_html_chars($ortkurzbz)):$db->convert_html_chars($ortkurzbz)).''; @@ -304,6 +304,6 @@ if ($num_rows_repl>0) } echo '
'; } -echo '

'.$p->t('lvplan/fehlerUndFeedback').' '.$p->t('lvplan/lvKoordinationsstelle').'.

+echo '

'.t('lvplan/FragenZuLvPlan', array(MAIL_LVPLAN)); ?>.'

'; ?> diff --git a/cis/private/lvplan/stpl_kalender.php b/cis/private/lvplan/stpl_kalender.php index 16ea2e48f..6b0f452cd 100644 --- a/cis/private/lvplan/stpl_kalender.php +++ b/cis/private/lvplan/stpl_kalender.php @@ -341,7 +341,7 @@ elseif($format=='excel') // Print in HTML-File else { - echo '

'.$p->t('lvplan/fehlerUndFeedback').' '.$p->t('lvplan/lvKoordinationsstelle').'

'; + echo '

'.$p->t('lvplan/FragenZuLvPlan', array(MAIL_LVPLAN)).'

'; echo ''; } diff --git a/cis/private/lvplan/stpl_week.php b/cis/private/lvplan/stpl_week.php index f600c6db5..323eb89eb 100644 --- a/cis/private/lvplan/stpl_week.php +++ b/cis/private/lvplan/stpl_week.php @@ -524,6 +524,6 @@ if (isset($reservdelcount)) echo "Es wurde".($reservdelcount!=1?'n':'')." $reservdelcount Stunde".($reservdelcount!=1?'n':'')." gelöscht!
"; ?> -


t('lvplan/fehlerUndFeedback');?> t('lvplan/lvKoordinationsstelle');?>.

+


t('lvplan/FragenZuLvPlan', array(MAIL_LVPLAN)); ?>.

diff --git a/locale/de-AT/lvplan.php b/locale/de-AT/lvplan.php index 59fd5169a..cd0aa1cd5 100644 --- a/locale/de-AT/lvplan.php +++ b/locale/de-AT/lvplan.php @@ -101,4 +101,5 @@ $this->phrasen['lvplan/folgendeAenderungen']='Es haben sich folgende Aenderungen $this->phrasen['lvplan/reserviertInDev']='reserviert
für
lehre'; $this->phrasen['lvplan/raumNichtReservierbar']='Die Möglichkeit der Reservierung ist für diesen Raum deaktiviert.'; $this->phrasen['lvplan/reserviertVon']='Reserviert von'; -?> \ No newline at end of file +$this->phrasen['lvplan/FragenZuLvPlan']='Für Fragen zu Ihrem LV-Plan wenden Sie sich bitte an Ihre Assistenz'; +?> diff --git a/locale/en-US/lvplan.php b/locale/en-US/lvplan.php index 1a8c865bf..11119cf90 100644 --- a/locale/en-US/lvplan.php +++ b/locale/en-US/lvplan.php @@ -100,4 +100,5 @@ $this->phrasen['lvplan/folgendeAenderungen']='There have been the following chan $this->phrasen['lvplan/reserviertInDev']='not
available'; $this->phrasen['lvplan/raumNichtReservierbar']='Reservation is disabled for this room.'; $this->phrasen['lvplan/reserviertVon']='Reserved by'; +$this->phrasen['lvplan/FragenZuLvPlan']='For questions about your personal schedule, please contant the administrative assistant'; ?> From 2893f2ec5a630ee1acb7f39d34c50a120a0dd5b6 Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Mon, 14 Oct 2024 13:21:19 +0200 Subject: [PATCH 06/63] bugfix lvplan feedback link stpl_detail: correct html --- cis/private/lvplan/stpl_detail.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cis/private/lvplan/stpl_detail.php b/cis/private/lvplan/stpl_detail.php index 7ab3181c1..14446d5b4 100644 --- a/cis/private/lvplan/stpl_detail.php +++ b/cis/private/lvplan/stpl_detail.php @@ -304,6 +304,6 @@ if ($num_rows_repl>0) } echo '
'; } -echo '

'.t('lvplan/FragenZuLvPlan', array(MAIL_LVPLAN)); ?>.'

+echo '

'.$p->t('lvplan/FragenZuLvPlan', array(MAIL_LVPLAN)).'

'; ?> From e89beb610da2c45b7d9b0b27cabfc3fb89f785f4 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Wed, 23 Oct 2024 13:33:50 +0200 Subject: [PATCH 07/63] - infocentermitarbeiter spalte deleted by user wird ignoriert --- application/views/system/infocenter/infocenterData.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/application/views/system/infocenter/infocenterData.php b/application/views/system/infocenter/infocenterData.php index 61dc5a575..956ad80d4 100644 --- a/application/views/system/infocenter/infocenterData.php +++ b/application/views/system/infocenter/infocenterData.php @@ -7,6 +7,7 @@ $STUDIENGANG_TYP = '\''.$this->variablelib->getVar('infocenter_studiensgangtyp').'\''; $TAETIGKEIT_KURZBZ = '\'bewerbung\', \'kommunikation\''; $LOGDATA_NAME = '\'Login with code\', \'Login with user\', \'Interessent rejected\', \'Attempt to register with existing mailadress\', \'Access code sent\', \'Personal data saved\''; + $LOGDATA_DELETED_BY_USER = '\'% deleted by user\''; $POSTPONE_STATUS_PARKED = '\'parked\''; $STATUS_KURZBZ = '\'Wartender\', \'Bewerber\', \'Aufgenommener\', \'Student\''; $ADDITIONAL_STG = $this->config->item('infocenter_studiengang_kz'); @@ -283,6 +284,7 @@ FROM system.tbl_log l WHERE l.taetigkeit_kurzbz IN ('.$TAETIGKEIT_KURZBZ.') AND l.logdata->>\'name\' NOT IN ('.$LOGDATA_NAME.') + AND l.logdata->>\'message\' NOT LIKE ('.$LOGDATA_DELETED_BY_USER.') AND l.person_id = p.person_id ORDER BY l.log_id DESC LIMIT 1 From 9c637b8575c4df645dca140b6eaeae12a8655a38 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Mon, 4 Nov 2024 12:20:52 +0100 Subject: [PATCH 08/63] - added model --- .../project/Projects_employees_model.php | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 application/models/project/Projects_employees_model.php diff --git a/application/models/project/Projects_employees_model.php b/application/models/project/Projects_employees_model.php new file mode 100644 index 000000000..a12e3961c --- /dev/null +++ b/application/models/project/Projects_employees_model.php @@ -0,0 +1,22 @@ +dbTable = 'sync.tbl_projects_employees'; + $this->pk = 'projects_employees_id'; + } + + public function deleteByProjectTaskId($ids) + { + $qry = "DELETE FROM " . $this->dbTable . " + WHERE project_task_id IN ?"; + + return $this->execQuery($qry, array($ids)); + } +} From 45bc65d32a783ef5002d7b3d1e0b5c9d52dd5026 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Mon, 11 Nov 2024 07:33:49 +0100 Subject: [PATCH 09/63] - Tags testversion - header tooltips - lehre spalte markieren wenn altes semester - legende-tab hinzugefuegt --- application/core/Tag_Controller.php | 176 ++++++++++++++ application/models/system/Notiztyp_model.php | 14 ++ application/views/templates/FHC-Common.php | 1 + application/views/templates/FHC-Header.php | 3 + public/css/tags.css | 66 ++++++ public/js/components/Tag/Tag.js | 233 +++++++++++++++++++ system/dbupdate_3.4.php | 2 + 7 files changed, 495 insertions(+) create mode 100644 application/core/Tag_Controller.php create mode 100644 application/models/system/Notiztyp_model.php create mode 100644 public/css/tags.css create mode 100644 public/js/components/Tag/Tag.js diff --git a/application/core/Tag_Controller.php b/application/core/Tag_Controller.php new file mode 100644 index 000000000..740f3b09d --- /dev/null +++ b/application/core/Tag_Controller.php @@ -0,0 +1,176 @@ + self::BERECHTIGUNG_KURZBZ, + 'getTags' => self::BERECHTIGUNG_KURZBZ, + 'addTag' => self::BERECHTIGUNG_KURZBZ, + + 'updateTag' => self::BERECHTIGUNG_KURZBZ, + 'doneTag' => self::BERECHTIGUNG_KURZBZ, + 'deleteTag' => self::BERECHTIGUNG_KURZBZ, + ]; + + $merged_permissions = array_merge($default_permissions, $permissions); + + parent::__construct($merged_permissions); + + $this->_setAuthUID(); + $this->load->model('person/Notiz_model', 'NotizModel'); + $this->load->model('system/Notiztyp_model', 'NotiztypModel'); + $this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel'); + } + + public function getTag() + { + $id = $this->input->get('id'); + + $this->NotizModel->addSelect( + 'tbl_notiz.titel, + tbl_notiz.text, + array_to_json(bezeichnung_mehrsprachig::varchar[])->>0 as bezeichnung, + tbl_notiz.notiz_id, + tbl_notiz_typ.style, + tbl_notiz.erledigt as done, + tbl_notiz.insertamum, + tbl_notiz.updateamum, + tbl_notiz.insertvon, + tbl_notiz.updatevon + ' + ); + $this->NotizModel->addJoin('public.tbl_notiz_typ', 'public.tbl_notiz.typ = public.tbl_notiz_typ.typ_kurzbz'); + $notiz = $this->NotizModel->loadWhere(array('notiz_id' => $id)); + + $this->terminateWithSuccess(hasData($notiz) ? getData($notiz)[0] : array()); + } + + public function getTags() + { + $this->NotiztypModel->addSelect( + 'typ_kurzbz as tag_typ_kurzbz, + array_to_json(bezeichnung_mehrsprachig::varchar[])->>0 as bezeichnung, + style, + beschreibung, + tag + ' + ); + $notiztypen = $this->NotiztypModel->loadWhere(array('aktiv' => true)); + $this->terminateWithSuccess(hasData($notiztypen) ? getData($notiztypen) : array()); + } + + public function addTag($withZuordnung = true) + { + $postData = $this->getPostJson(); + + $checkTyp = $this->NotiztypModel->loadWhere(array('typ_kurzbz' => $postData->tag_typ_kurzbz)); + + if (!hasData($checkTyp)) + $this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL); + + $return = ""; + + if ($withZuordnung) + { + $checkZuordnungType = $this->NotizzuordnungModel->isValidType($postData->zuordnung_typ); + if (!isSuccess($checkZuordnungType)) + $this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL); + + $values = array_unique($postData->values); + + foreach ($values as $value) + { + $insertResult = $this->addNotiz($postData); + + if (isError($insertResult)) + $this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL); + + $insertZuordnung = $this->NotizzuordnungModel->insert(array( + 'notiz_id' => $insertResult->retval, + $postData->zuordnung_typ => $value + )); + + if (isError($insertZuordnung)) + $this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL); + + $return[] = [$postData->zuordnung_typ => $value, 'id' => $insertResult->retval]; + } + } + else + { + $insertResult = $this->addNotiz($postData); + if (isError($insertResult)) + $this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL); + + $return = $insertResult->retval; + } + + $this->terminateWithSuccess($return); + } + + private function addNotiz($postData) + { + return $this->NotizModel->insert(array( + 'titel' => 'TAG', //TODO klären + 'text' => $postData->notiz, + 'verfasser_uid' => $this->_uid, + 'erledigt' => false, + 'insertamum' => date('Y-m-d H:i:s'), + 'insertvon' => $this->_uid, + 'typ' => $postData->tag_typ_kurzbz + )); + + } + public function updateTag() + { + $postData = $this->getPostJson(); + $updateData = $this->NotizModel->update(array('notiz_id' => $postData->id), + array('text' => $postData->notiz) + ); + $this->terminateWithSuccess($updateData); + } + public function doneTag() + { + $postData = $this->getPostJson(); + $updateData = $this->NotizModel->update(array('notiz_id' => $postData->id), + array('erledigt' => !$postData->done) + ); + + $this->terminateWithSuccess($updateData); + } + + public function deleteTag() + { + $postData = $this->getPostJson(); + $deleteZuordnung = $this->NotizzuordnungModel->delete(array( + 'notiz_id' => $postData->id + )); + + if (isSuccess($deleteZuordnung)) + { + $deleteNotiz = $this->NotizModel->delete(array( + 'notiz_id' => $postData->id + )); + } + $this->terminateWithSuccess(true); + } + + private function _setAuthUID() + { + $this->_uid = getAuthUID(); + + if (!$this->_uid) + show_error('User authentification failed'); + } + + +} \ No newline at end of file diff --git a/application/models/system/Notiztyp_model.php b/application/models/system/Notiztyp_model.php new file mode 100644 index 000000000..b173377e6 --- /dev/null +++ b/application/models/system/Notiztyp_model.php @@ -0,0 +1,14 @@ +dbTable = 'public.tbl_notiz_typ'; + $this->pk = 'typ_kurzbz'; + } +} diff --git a/application/views/templates/FHC-Common.php b/application/views/templates/FHC-Common.php index 072ff1d7f..f8194d194 100644 --- a/application/views/templates/FHC-Common.php +++ b/application/views/templates/FHC-Common.php @@ -44,3 +44,4 @@ $tablewidget = isset($tablewidget) ? $tablewidget : false; $udfs = isset($udfs) ? $udfs : false; $widgets = isset($widgets) ? $widgets : false; + $tags = isset($tags) ? $tags : false; diff --git a/application/views/templates/FHC-Header.php b/application/views/templates/FHC-Header.php index ed9fa97b9..39cc881d1 100644 --- a/application/views/templates/FHC-Header.php +++ b/application/views/templates/FHC-Header.php @@ -118,6 +118,9 @@ // CIS if ($cis === true) generateCSSsInclude('public/css/cis_bs5.css'); + //Tags + if ($tags === true) generateCSSsInclude('public/css/tags.css'); + // Eventually required CSS generateCSSsInclude($customCSSs); // Eventually required CSS ?> diff --git a/public/css/tags.css b/public/css/tags.css new file mode 100644 index 000000000..b1ee7d4c9 --- /dev/null +++ b/public/css/tags.css @@ -0,0 +1,66 @@ +:is(.tag_notice, .tag_inwork, .tag_planning) { + display: inline-block; + padding: 5px 10px; + margin-right: 5px; + border-radius: 3px; + color: white; + cursor: default; + font-size: .75em; + font-weight: 700; + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; +} + +.tag_notice { + background-color: red !important; +} +.tag_inwork { + background-color: violet !important; +} +.tag_planning { + background-color: lightblue !important; +} + +.dropdown-list { + list-style: none; + background-color: white; + border: 1px solid #ccc; + border-radius: 5px; + box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.1); + z-index: 1000; + position: absolute; + padding: 10px 10px 10px; + max-width: 200px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.plus-button-container.disabled { + pointer-events: none; + opacity: 0.5; +} + +.plus-more-tags { + font-weight: bold; + color: #007bff; + cursor: pointer; +} + +.all-tags-modal-content { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.tag-done { + text-decoration: line-through; +} + +.modificationdate { + font-style: italic; + font-size: 0.7em; + text-align: left; +} diff --git a/public/js/components/Tag/Tag.js b/public/js/components/Tag/Tag.js new file mode 100644 index 000000000..be37659ae --- /dev/null +++ b/public/js/components/Tag/Tag.js @@ -0,0 +1,233 @@ +import CoreForm from '../Form/Form.js'; +import FormInput from "../Form/Input.js"; +import BsModal from '../Bootstrap/Modal.js'; + +export default { + components: { + CoreForm, + FormInput, + BsModal, + }, + emits: [ + 'added', + 'updated', + 'deleted', + ], + props: { + endpoint: { + type: Object, + required: true + }, + zuordnung_typ: String, + savepoint: {}, + values: { + type: Array, + required: true + } + }, + data() { + return { + showList: false, + selectedTagId: null, + tagData: { + beschreibung: "", + tag_typ_kurzbz: "", + notiz: "", + style: "", + zuordnung_typ: "", + id: "", + insertamum: "", + insertvon: "", + updateamum: "", + updatevon: "", + response: "" + }, + mode: "create" + }; + }, + created() { + this.init(); + }, + mounted() {}, + methods: { + init() { + if (!this.endpoint) + return; + this.endpoint.getTags() + .then(response => response.data) + .then(response => { + this.tags = response + }) + }, + hideList() { + this.showList = false; + }, + async editTag(tag_id) { + let getData = { + 'id': tag_id + }; + + this.endpoint.getTag(getData) + .then(result => result.data) + .then(result => this.openModal(result)) + }, + openModal(item = null) + { + this.tagData.beschreibung = item.bezeichnung; + this.tagData.tag_typ_kurzbz = item.tag_typ_kurzbz; + this.tagData.style = item.style; + this.tagData.zuordnung_typ = this.zuordnung_typ; + this.tagData.done = item.done; + this.tagData.insertamum = item.insertamum; + this.tagData.updateamum = item.updateamum; + this.tagData.updatevon = item.updatevon; + this.tagData.insertvon = item.insertvon; + + if (item && item.notiz_id) + { + this.selectedTagId = item.notiz_id; + this.tagData.notiz = item.text; + this.mode = "edit"; + } + else + { + this.selectedTagId = null; + this.tagData.notiz = ""; + this.mode = "create"; + } + this.$refs.tagModal.show(); + }, + async saveTag() + { + let postData = { + tag_typ_kurzbz: this.tagData.tag_typ_kurzbz, + notiz: this.tagData.notiz, + zuordnung_typ: this.tagData.zuordnung_typ, + values: this.values + } + + if (this.mode === "edit") + { + postData.id = this.selectedTagId; + this.tagData.id = this.selectedTagId; + this.endpoint.updateTag(postData); + this.$emit("updated", this.tagData); + this.$refs.tagModal.hide(); + } + else + { + this.endpoint.addTag(postData) + .then(response => response.data) + .then(response => { + if (typeof response === 'number') { + console.log(response); + this.tagData.id = response; + } else { + this.tagData.response = response; + } + }) + .then(() => { + this.$emit("added", this.tagData); + }) + .then(() => { + this.$refs.tagModal.hide(); + }); + } + + + }, + async doneTag() + { + this.tagData.id = this.selectedTagId; + this.tagData.done = !this.tagData.done; + + let postData = { + id: this.selectedTagId, + done: !this.tagData.done + } + this.endpoint.doneTag(postData) + this.$emit("updated", this.tagData); + this.$refs.tagModal.hide(); + }, + async deleteTag() + { + let postData = { + id: this.selectedTagId + } + this.endpoint.deleteTag(postData) + this.$emit("deleted", this.selectedTagId) + this.$refs.tagModal.hide(); + }, + reset() { + this.tagData = { + beschreibung: "", + tag_typ_kurzbz: "", + notiz: "", + style: "", + zuordnung_typ: "", + id: "", + done: false, + insertamum: "", + insertvon: "", + updateamum: "", + updatevon: "", + response: "" + }; + this.selectedTagId = null; + this.mode = "create"; + } + }, + template: ` +
+ + +
+ + + + + + `, +} \ No newline at end of file diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php index 06b1e0cb4..42908ccbc 100644 --- a/system/dbupdate_3.4.php +++ b/system/dbupdate_3.4.php @@ -57,6 +57,8 @@ require_once('dbupdate_3.4/34543_ux_template.php'); require_once('dbupdate_3.4/17513_Entwicklungsteam.php'); require_once('dbupdate_3.4/28575_softwarebereitstellung.php'); require_once('dbupdate_3.4/40717_lv_faktor.php'); +require_once('dbupdate_3.4/48526_pep_tagging.php'); + // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo '

Pruefe Tabellen und Attribute!

'; From 355652cdb1a41ab990cc31b4bbcd9d5be7740464 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Mon, 11 Nov 2024 07:51:52 +0100 Subject: [PATCH 10/63] - added sql for tags --- system/dbupdate_3.4/48526_pep_tagging.php | 50 +++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 system/dbupdate_3.4/48526_pep_tagging.php diff --git a/system/dbupdate_3.4/48526_pep_tagging.php b/system/dbupdate_3.4/48526_pep_tagging.php new file mode 100644 index 000000000..d935d9e92 --- /dev/null +++ b/system/dbupdate_3.4/48526_pep_tagging.php @@ -0,0 +1,50 @@ +db_query('SELECT 0 FROM public.tbl_notiz_typ WHERE 0 = 1')) +{ + //TODO zuordnung typ definieren + $qry = 'CREATE TABLE public.tbl_notiz_typ ( + typ_kurzbz varchar(32) NOT NULL, + bezeichnung_mehrsprachig character varying(256)[] NOT NULL, + beschreibung text, + automatisiert boolean NOT NULL, + aktiv boolean NOT NULL, + zuordnung text, + tag boolean NOT NULL, + style text, + vorrueckung boolean NOT NULL, + prioritaet smallint + ); + + ALTER TABLE public.tbl_notiz_typ ADD CONSTRAINT pk_tbl_tbl_notiz_typ PRIMARY KEY (typ_kurzbz)'; + + if (!$db->db_query($qry)) + echo 'public.tbl_notiz_typ: '.$db->db_last_error().'
'; + else + echo '
public.tbl_notiz_typ table created'; + + $qry = 'GRANT SELECT ON TABLE public.tbl_notiz_typ TO web;'; + if (!$db->db_query($qry)) + echo 'public.tbl_notiz_typ: '.$db->db_last_error().'
'; + else + echo '
Granted privileges to web on public.tbl_notiz_typ'; + + $qry = 'GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE public.tbl_notiz_typ TO vilesci;'; + if (!$db->db_query($qry)) + echo 'public.tbl_notiz_typ: '.$db->db_last_error().'
'; + else + echo '
Granted privileges to vilesci on public.tbl_notiz_typ'; +} + +if(!@$db->db_query("SELECT typ FROM public.tbl_notiz LIMIT 1")) +{ + $qry = 'ALTER TABLE public.tbl_notiz ADD COLUMN typ varchar(32); + ALTER TABLE public.tbl_notiz ADD CONSTRAINT tbl_notiz_typ_fkey FOREIGN KEY (typ) REFERENCES public.tbl_notiz_typ (typ_kurzbz) ON DELETE RESTRICT ON UPDATE CASCADE;'; + + if(!$db->db_query($qry)) + echo ' public.tbl_notiz '.$db->db_last_error().'
'; + else + echo '
public.tbl_notiz: Neue Spalte typ hinzugefügt'; +} From 6b04dff4a3178557e2697bc2e16d73d13fb829da Mon Sep 17 00:00:00 2001 From: ma0048 Date: Tue, 12 Nov 2024 11:47:16 +0100 Subject: [PATCH 11/63] - start tab tags hinzugefuegt --- application/core/Tag_Controller.php | 30 +++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/application/core/Tag_Controller.php b/application/core/Tag_Controller.php index 740f3b09d..5c0a580ef 100644 --- a/application/core/Tag_Controller.php +++ b/application/core/Tag_Controller.php @@ -77,10 +77,10 @@ class Tag_Controller extends FHCAPI_Controller if (!hasData($checkTyp)) $this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL); - $return = ""; if ($withZuordnung) { + $return = array(); $checkZuordnungType = $this->NotizzuordnungModel->isValidType($postData->zuordnung_typ); if (!isSuccess($checkZuordnungType)) $this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL); @@ -104,6 +104,7 @@ class Tag_Controller extends FHCAPI_Controller $return[] = [$postData->zuordnung_typ => $value, 'id' => $insertResult->retval]; } + $this->terminateWithSuccess($return); } else { @@ -111,10 +112,8 @@ class Tag_Controller extends FHCAPI_Controller if (isError($insertResult)) $this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL); - $return = $insertResult->retval; + return $insertResult->retval; } - - $this->terminateWithSuccess($return); } private function addNotiz($postData) @@ -148,20 +147,31 @@ class Tag_Controller extends FHCAPI_Controller $this->terminateWithSuccess($updateData); } - public function deleteTag() + public function deleteTag($withZuordnung = true) { $postData = $this->getPostJson(); - $deleteZuordnung = $this->NotizzuordnungModel->delete(array( - 'notiz_id' => $postData->id - )); - if (isSuccess($deleteZuordnung)) + $deleteNotiz = ""; + if ($withZuordnung) + { + $deleteZuordnung = $this->NotizzuordnungModel->delete(array( + 'notiz_id' => $postData->id + )); + + if (isSuccess($deleteZuordnung)) + { + $deleteNotiz = $this->NotizModel->delete(array( + 'notiz_id' => $postData->id + )); + } + } + else { $deleteNotiz = $this->NotizModel->delete(array( 'notiz_id' => $postData->id )); } - $this->terminateWithSuccess(true); + $this->terminateWithSuccess($deleteNotiz); } private function _setAuthUID() From 14169fafd00db51ea44e5968137de28bbba2ada9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96sterreicher?= Date: Fri, 22 Nov 2024 11:42:24 +0100 Subject: [PATCH 12/63] Wording korrigiert --- locale/de-AT/lvplan.php | 2 +- locale/en-US/lvplan.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/de-AT/lvplan.php b/locale/de-AT/lvplan.php index cd0aa1cd5..a7fa69cb1 100644 --- a/locale/de-AT/lvplan.php +++ b/locale/de-AT/lvplan.php @@ -101,5 +101,5 @@ $this->phrasen['lvplan/folgendeAenderungen']='Es haben sich folgende Aenderungen $this->phrasen['lvplan/reserviertInDev']='reserviert
für
lehre'; $this->phrasen['lvplan/raumNichtReservierbar']='Die Möglichkeit der Reservierung ist für diesen Raum deaktiviert.'; $this->phrasen['lvplan/reserviertVon']='Reserviert von'; -$this->phrasen['lvplan/FragenZuLvPlan']='Für Fragen zu Ihrem LV-Plan wenden Sie sich bitte an Ihre Assistenz'; +$this->phrasen['lvplan/FragenZuLvPlan']='Für Fragen zu Ihrem LV-Plan wenden Sie sich bitte an Ihre LV-Koordinationsstelle'; ?> diff --git a/locale/en-US/lvplan.php b/locale/en-US/lvplan.php index 11119cf90..906784b64 100644 --- a/locale/en-US/lvplan.php +++ b/locale/en-US/lvplan.php @@ -100,5 +100,5 @@ $this->phrasen['lvplan/folgendeAenderungen']='There have been the following chan $this->phrasen['lvplan/reserviertInDev']='not
available'; $this->phrasen['lvplan/raumNichtReservierbar']='Reservation is disabled for this room.'; $this->phrasen['lvplan/reserviertVon']='Reserved by'; -$this->phrasen['lvplan/FragenZuLvPlan']='For questions about your personal schedule, please contant the administrative assistant'; +$this->phrasen['lvplan/FragenZuLvPlan']='For questions about your personal schedule, please contact the Course-Coordination Office'; ?> From 36c129fcaf8173de4cf65b2d514c3f3da82efa7e Mon Sep 17 00:00:00 2001 From: SimonGschnell Date: Mon, 25 Nov 2024 11:41:22 +0100 Subject: [PATCH 13/63] reafactor(Calendar/Day/Page.js-Calendar/Week/Page.js): refactors styles of elements for easier readability --- public/js/components/Calendar/Day/Page.js | 34 +++++++----- public/js/components/Calendar/Week/Page.js | 61 ++++++++++++++++++++-- 2 files changed, 78 insertions(+), 17 deletions(-) diff --git a/public/js/components/Calendar/Day/Page.js b/public/js/components/Calendar/Day/Page.js index c8fb9aae7..6477c41ad 100644 --- a/public/js/components/Calendar/Day/Page.js +++ b/public/js/components/Calendar/Day/Page.js @@ -82,6 +82,15 @@ export default { } }, computed: { + pageHeaderStyle(){ + return { + 'z-index': 4, + 'grid-template-columns': 'repeat(' + this.day.length + ', 1fr)', + 'grid-template-rows': 1, + position: 'sticky', + top: 0, + } + }, dayGridStyle(){ return { 'grid-template-columns': '1 1fr', @@ -191,6 +200,17 @@ export default { 'z-index': 0, } }, + eventGridStyle(day, event) { + return { + 'z-index': 1, + 'grid-column-start': 1 + (event.lane - 1) * day.lanes / event.maxLane, + 'grid-column-end': 1 + event.lane * day.lanes / event.maxLane, + 'grid-row-start': this.dateToMinutesOfDay(event.start), + 'grid-row-end': this.dateToMinutesOfDay(event.end), + 'background-color': event.orig.color, + '--test': this.dateToMinutesOfDay(event.end), + } + }, showModal: function (evt) { let event = evt.orig; this.setSelectedEvent(event); @@ -258,17 +278,7 @@ export default { dateToMinutesOfDay(day) { return Math.floor(((day.getHours() - 7) * 60 + day.getMinutes()) / this.smallestTimeFrame) + 1; }, - eventGridStyle(day,event){ - return { - 'z-index': 1, - 'grid-column-start': 1 + (event.lane - 1) * day.lanes / event.maxLane, - 'grid-column-end': 1 + event.lane * day.lanes / event.maxLane, - 'grid-row-start': this.dateToMinutesOfDay(event.start), - 'grid-row-end': this.dateToMinutesOfDay(event.end), - 'background-color': event.orig.color, - '--test': this.dateToMinutesOfDay(event.end), - } - } + }, template: /*html*/`
@@ -277,7 +287,7 @@ export default {
-
+
{{day.toLocaleString(undefined, {weekday: size < 2 ? 'narrow' : (size < 3 ? 'short' : 'long')})}}
{{day.toLocaleString(undefined, [{day:'numeric',month:'numeric'},{day:'numeric',month:'numeric'},{day:'numeric',month:'numeric'},{dateStyle:'short'}][this.size])}} diff --git a/public/js/components/Calendar/Week/Page.js b/public/js/components/Calendar/Week/Page.js index 2288984f2..222e4b4e7 100644 --- a/public/js/components/Calendar/Week/Page.js +++ b/public/js/components/Calendar/Week/Page.js @@ -31,6 +31,27 @@ export default { 'input', ], computed: { + pageHeaderStyle(){ + return { + 'z-index': 4, + 'grid-template-columns': 'repeat(' + this.days.length + ', 1fr)', + 'grid-template-rows': 1, + position: 'sticky', + top: 0, + } + }, + indicatorStyle() { + return { + 'pointer-events': 'none', + 'padding-left': '3.5rem', + 'margin-top': '-1px', + 'z-index': 2, + 'border-color': '#00649C!important', + top: this.hourPosition + 'px', + left: 0, + right: 0, + } + }, hours(){ // returns an array with elements starting at 7 and ending at 24 return [...Array(24).keys()].filter(hour => hour >= 7 && hour <= 24); @@ -88,6 +109,36 @@ export default { } }, methods: { + hourGridIdentifier(hour) { + // this is the id attribute that is responsible to scroll the calender to the first event + return 'scroll' + hour + this.focusDate.d + this.week; + }, + hourGridStyle(hour) { + return { + 'pointer-events': 'none', + top: this.getAbsolutePositionForHour(hour), + left: 0, + right: 0, + 'z-index': 0, + } + }, + dayGridStyle(day) { + return { + 'grid-template-columns': 'repeat(' + day.lanes + ', 1fr)', + 'grid-template-rows': 'repeat(' + (this.hours.length * 60 / this.smallestTimeFrame) + ', 1fr)', + } + }, + eventGridStyle(day, event) { + return { + 'z-index': 1, + 'grid-column-start': 1 + (event.lane - 1) * day.lanes / event.maxLane, + 'grid-column-end': 1 + event.lane * day.lanes / event.maxLane, + 'grid-row-start': this.dateToMinutesOfDay(event.start), + 'grid-row-end': this.dateToMinutesOfDay(event.end), + 'background-color': event.orig.color, + '--test': this.dateToMinutesOfDay(event.end), + } + }, calcHourPosition(event) { let height = this.$refs.eventcontainer.getBoundingClientRect().height; let top = this.$refs.eventcontainer.getBoundingClientRect().top; @@ -155,23 +206,23 @@ export default {
-
+
-
-
+
+
{{hourPositionTime}}
{{hour}}:00
-
-
+
+

this is a placeholder which means that no template was passed to the Calendar Page slot

From 43fbd1d8f1d9a25f11224e628452b52a159430d5 Mon Sep 17 00:00:00 2001 From: SimonGschnell Date: Mon, 25 Nov 2024 13:28:55 +0100 Subject: [PATCH 14/63] refactor(Calendar/Day/Page.js): moves the content to the parent, so that different views can display different content --- public/js/apps/Cis/Stundenplan.js | 24 +++++++++-- public/js/components/Calendar/Calendar.js | 19 +++++++-- public/js/components/Calendar/Day.js | 10 ++++- public/js/components/Calendar/Day/Page.js | 42 +++++++------------ public/js/components/Cis/Mylv/LvModal.js | 13 +++++- .../js/components/Cis/Mylv/RoomInformation.js | 27 +++++++++--- 6 files changed, 91 insertions(+), 44 deletions(-) diff --git a/public/js/apps/Cis/Stundenplan.js b/public/js/apps/Cis/Stundenplan.js index 441d83f35..3306c3d80 100644 --- a/public/js/apps/Cis/Stundenplan.js +++ b/public/js/apps/Cis/Stundenplan.js @@ -2,6 +2,8 @@ import FhcCalendar from "../../components/Calendar/Calendar.js"; import Phrasen from "../../plugin/Phrasen.js"; import CalendarDate from "../../composables/CalendarDate.js"; import LvModal from "../../components/Cis/Mylv/LvModal.js"; +import LvInfo from "../../components/Cis/Mylv/LvInfo.js" +import LvMenu from "../../components/Cis/Mylv/LvMenu.js" const app = Vue.createApp({ @@ -17,7 +19,7 @@ const app = Vue.createApp({ } }, components: { - FhcCalendar, LvModal + FhcCalendar, LvModal, LvMenu, LvInfo }, computed:{ weekFirstDay: function () { @@ -35,6 +37,9 @@ const app = Vue.createApp({ }, methods:{ + setSelectedEvent: function (event) { + this.currentlySelectedEvent = event; + }, getLvID: function () { this.lv_id = window.location.pathname }, @@ -111,7 +116,7 @@ const app = Vue.createApp({

{{$p.t('lehre/stundenplan')}}


- + -