From 8033c12665e79aa569c27cd6a3025fc32a523308 Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 21 Oct 2021 13:03:16 +0200 Subject: [PATCH 001/132] Added / Adapted tables for Zeitwunsch Gueltigkeit pro Studiensemester - Added table campus.tbl_zeitwunsch_gueltigkeit and migrated initial data - Added column zeitwunsch_id (as new primary key) and zeitwunsch_gueltigkeit_id to campus.tbl_zeitwunsch - Initially copied all Zeitwunsch entries -- The basic entries are joined with Zeitwunsch Gueltigkeit for actual Studiensemester -- The copied entries are joined with Zeitwunsch Gueltigkeit for next Studiensemester This is necessary because the actual Zeitwunschplan represent for some lectors the plan for the actual semester, and for some - who have already planned forward - for the next semester. --- system/dbupdate_3.3.php | 161 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 160 insertions(+), 1 deletion(-) diff --git a/system/dbupdate_3.3.php b/system/dbupdate_3.3.php index ffdd28bc3..a454ada77 100644 --- a/system/dbupdate_3.3.php +++ b/system/dbupdate_3.3.php @@ -5493,6 +5493,164 @@ if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berecht } } +// Add table campus.tbl_zeitwunsch_gueltigkeit and migrate initial data +if(!$result = @$db->db_query("SELECT 1 FROM campus.tbl_zeitwunsch_gueltigkeit LIMIT 1;")) +{ + $qry = " + CREATE TABLE campus.tbl_zeitwunsch_gueltigkeit + ( + zeitwunsch_gueltigkeit_id INTEGER NOT NULL, + mitarbeiter_uid CHARACTER VARYING(32) NOT NULL, + von DATE, + bis DATE, + insertamum TIMESTAMP WITHOUT TIME ZONE, + insertvon CHARACTER VARYING(32), + updateamum TIMESTAMP WITHOUT TIME ZONE, + updatevon CHARACTER VARYING(32) + ); + + CREATE SEQUENCE campus.seq_zeitwunsch_gueltigkeit_zeitwunsch_gueltigkeit_id + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + + -- Add Primary Key + ALTER TABLE campus.tbl_zeitwunsch_gueltigkeit ADD CONSTRAINT pk_zeitwunsch_gueltigkeit_zeitwunsch_gueltigkeit_id PRIMARY KEY (zeitwunsch_gueltigkeit_id); + ALTER TABLE campus.tbl_zeitwunsch_gueltigkeit ALTER COLUMN zeitwunsch_gueltigkeit_id SET DEFAULT nextval('campus.seq_zeitwunsch_gueltigkeit_zeitwunsch_gueltigkeit_id'); + + -- Add Permissions + GRANT SELECT, UPDATE ON SEQUENCE campus.seq_zeitwunsch_gueltigkeit_zeitwunsch_gueltigkeit_id TO vilesci; + + GRANT SELECT, INSERT, UPDATE, DELETE ON campus.tbl_zeitwunsch_gueltigkeit TO vilesci; + GRANT SELECT, INSERT, UPDATE ON campus.tbl_zeitwunsch_gueltigkeit TO web; + + -- Initial data migration + INSERT INTO campus.tbl_zeitwunsch_gueltigkeit + ( + mitarbeiter_uid, + von, + bis, + insertamum, + insertvon, + updateamum, + updatevon + ) + SELECT * FROM + ( + -- Unique Mitarbeiter from Zeitwunsch Tabelle, Start and End of actual Studiensemester + SELECT DISTINCT mitarbeiter_uid, + (SELECT start FROM public.tbl_studiensemester WHERE start <= NOW() AND ende >= NOW()), + (SELECT ende FROM public.tbl_studiensemester WHERE start <= NOW() AND ende >= NOW()), + NOW(), + 'system', + NOW(), + 'system' + FROM campus.tbl_zeitwunsch + + UNION + + -- Unique Mitarbeiter from Zeitwunsch Tabelle, Start of next Studiensemester and open end + SELECT DISTINCT mitarbeiter_uid, + (SELECT start FROM public.tbl_studiensemester WHERE ende > NOW() LIMIT 1), + NULL::DATE AS \"ende\", + NOW(), + 'system', + NOW(), + 'system' + FROM campus.tbl_zeitwunsch + ORDER BY start, mitarbeiter_uid + ) AS init_data + "; + + if(!$db->db_query($qry)) + echo 'campus.tbl_zeitwunsch_gueltigkeit: '.$db->db_last_error().'
'; + else + echo 'campus.tbl_zeitwunsch_gueltigkeit: Tabelle hinzugefuegt
'; +} + +// Add column zeitwunsch_id (as new primary key) and zeitwunsch_gueltigkeit_id to campus.tbl_zeitwunsch +if (!$result = @$db->db_query("SELECT zeitwunsch_id FROM campus.tbl_zeitwunsch LIMIT 1")) +{ + $qry = " + ALTER TABLE campus.tbl_zeitwunsch DROP CONSTRAINT IF EXISTS pk_tbl_zeitwunsch; -- Drop combined pk stunde/mitarbeiter_uid/tag + + -- Add primary key and foreign key + ALTER TABLE campus.tbl_zeitwunsch ADD COLUMN zeitwunsch_id INTEGER; + ALTER TABLE campus.tbl_zeitwunsch ADD COLUMN zeitwunsch_gueltigkeit_id INTEGER; + + -- Add comments + COMMENT ON COLUMN campus.tbl_zeitwunsch.zeitwunsch_gueltigkeit_id IS 'Ordnet die Zeitwuensche einer Gueltigkeitsdauer von-bis zu'; + COMMENT ON COLUMN campus.tbl_zeitwunsch.mitarbeiter_uid IS 'DEPRECATED'; + + CREATE SEQUENCE campus.seq_zeitwunsch_zeitwunsch_id + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + + ALTER TABLE campus.tbl_zeitwunsch ALTER COLUMN zeitwunsch_id SET DEFAULT nextval('campus.seq_zeitwunsch_zeitwunsch_id'); + UPDATE campus.tbl_zeitwunsch SET zeitwunsch_id = nextval('campus.seq_zeitwunsch_zeitwunsch_id'); + + ALTER TABLE campus.tbl_zeitwunsch ADD CONSTRAINT pk_zeitwunsch_zeitwunsch_id PRIMARY KEY (zeitwunsch_id); + ALTER TABLE campus.tbl_zeitwunsch ADD CONSTRAINT fk_zeitwunsch_zeitwunsch_gueltigkeit_id FOREIGN KEY (zeitwunsch_gueltigkeit_id) REFERENCES campus.tbl_zeitwunsch_gueltigkeit(zeitwunsch_gueltigkeit_id) ON DELETE RESTRICT ON UPDATE CASCADE; + + -- Set initial zeitwunsch_gueltigkeit_id values to Gueltigkeitszeitraum of actual Studiensemester + UPDATE campus.tbl_zeitwunsch + SET zeitwunsch_gueltigkeit_id = ( + SELECT zeitwunsch_gueltigkeit_id + FROM campus.tbl_zeitwunsch_gueltigkeit zwg + WHERE tbl_zeitwunsch.mitarbeiter_uid = zwg.mitarbeiter_uid + AND (zwg.von <= NOW() AND zwg.bis >= NOW()) + ); + + -- Duplicate existing data and set initial zeitwunsch_gueltigkeit_id values to Gueltigkeitszeitraum of next Studiensemester + INSERT INTO campus.tbl_zeitwunsch + ( + stunde, + mitarbeiter_uid, + tag, + gewicht, + updateamum, + updatevon, + insertamum, + insertvon, + zeitwunsch_gueltigkeit_id + ) + SELECT * FROM + ( + SELECT + stunde, + mitarbeiter_uid, + tag, + gewicht, + NOW(), + 'system', + NOW(), + 'system', + ( + SELECT zeitwunsch_gueltigkeit_id + FROM campus.tbl_zeitwunsch_gueltigkeit zwg + WHERE campus.tbl_zeitwunsch.mitarbeiter_uid = zwg.mitarbeiter_uid + AND bis IS NULL + ) AS \"zeitwunsch_gueltigkeit_id\" + FROM campus.tbl_zeitwunsch + ) AS basic_zeitwunsch_data; + + -- Set primary key and foreign key NOT NULL + ALTER TABLE campus.tbl_zeitwunsch ALTER COLUMN zeitwunsch_id SET NOT NULL; + ALTER TABLE campus.tbl_zeitwunsch ALTER COLUMN zeitwunsch_gueltigkeit_id SET NOT NULL; + + -- Set permissions + GRANT SELECT, UPDATE ON SEQUENCE campus.seq_zeitwunsch_zeitwunsch_id TO vilesci; + "; + + if(!$db->db_query($qry)) + echo 'campus.tbl_zeitwunsch: '.$db->db_last_error().'
'; + else + echo '
campus.tbl_zeitwunsch: Neue Spalte zeitwunsch_id hinzugefuegt.'; +} + // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo '

Pruefe Tabellen und Attribute!

'; @@ -5585,7 +5743,8 @@ $tabellen=array( "campus.tbl_zeitaufzeichnung_gd" => array("zeitaufzeichnung_gd_id","uid","studiensemester_kurzbz","selbstverwaltete_pause","insertamum","insertvon","updateamum","updatevon"), "campus.tbl_zeitsperre" => array("zeitsperre_id","zeitsperretyp_kurzbz","mitarbeiter_uid","bezeichnung","vondatum","vonstunde","bisdatum","bisstunde","vertretung_uid","updateamum","updatevon","insertamum","insertvon","erreichbarkeit_kurzbz","freigabeamum","freigabevon"), "campus.tbl_zeitsperretyp" => array("zeitsperretyp_kurzbz","beschreibung","farbe"), - "campus.tbl_zeitwunsch" => array("stunde","mitarbeiter_uid","tag","gewicht","updateamum","updatevon","insertamum","insertvon"), + "campus.tbl_zeitwunsch" => array("stunde","mitarbeiter_uid","tag","gewicht","updateamum","updatevon","insertamum","insertvon", "zeitwunsch_id", "zeitwunsch_gueltigkeit_id"), + "campus.tbl_zeitwunsch_gueltigkeit" => array("zeitwunsch_gueltigkeit_id","mitarbeiter_uid","von","bis","insertamum","insertvon", "updateamum","updatevon"), "fue.tbl_aktivitaet" => array("aktivitaet_kurzbz","beschreibung","sort"), "fue.tbl_aufwandstyp" => array("aufwandstyp_kurzbz","bezeichnung"), "fue.tbl_projekt" => array("projekt_kurzbz","nummer","titel","beschreibung","beginn","ende","oe_kurzbz","budget","farbe","aufwandstyp_kurzbz","ressource_id","anzahl_ma","aufwand_pt","projekt_id","projekttyp_kurzbz"), From 8cb8c4da6485e1625b1c0648f14d5101e0a9ca20 Mon Sep 17 00:00:00 2001 From: ma0068 Date: Thu, 4 Nov 2021 10:27:21 +0100 Subject: [PATCH 002/132] Erweiterung Funktion checkKontostand() --- include/konto.class.php | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/include/konto.class.php b/include/konto.class.php index 09afa5303..f5de5b439 100644 --- a/include/konto.class.php +++ b/include/konto.class.php @@ -553,31 +553,38 @@ class konto extends basis_db /** * Überprüft, ob das Konto einer Person ausgeglichen ist, oder ob noch Zahlungen offen sind - * @param $person_id ID der Person, die geprüft werden soll - * @return true wenn ausgeglichen, false wenn Zahlungen offen, false mit errormsg wenn ein Fehler aufgetreten ist + * @param int $person_id ID der Person, die geprüft werden soll. + * @param bool $aktuelleBuchungenOnly True, wenn nur Zahlungen mit Buchungsdatum <= aktuelles Datum berücksichtigt werden sollen. + * @return boolean true wenn ausgeglichen, false wenn Zahlungen offen, false mit errormsg wenn ein Fehler aufgetreten ist */ - public function checkKontostand($person_id) + public function checkKontostand($person_id, $aktuelleBuchungenOnly = false) { - $qry="SELECT sum(betrag) as summe FROM public.tbl_konto WHERE person_id=".$this->db_add_param($person_id); - if($result=$this->db_query($qry)) + $qry = "SELECT sum(betrag) as summe + FROM public.tbl_konto + WHERE person_id=".$this->db_add_param($person_id); + + if($aktuelleBuchungenOnly) + $qry .= " AND buchungsdatum <= now()"; + + if ($result = $this->db_query($qry)) { - if($row=$this->db_fetch_object()) + if ($row = $this->db_fetch_object()) { - if($row->summe>=0) + if ($row->summe >= 0) return true; else return false; } else { + $this->errormsg = "Fehler beim Holen der Daten"; return false; - $this->errormsg="Fehler beim Holen der Daten"; } } else { + $this->errormsg = "Fehler bei der Datenbankabfrage"; return false; - $this->errormsg="Fehler bei der Datenbankabfrage"; } } From 70c24899d03cbe061734f6ad6c92b2d601a18ed9 Mon Sep 17 00:00:00 2001 From: ma0068 Date: Tue, 9 Nov 2021 09:32:05 +0100 Subject: [PATCH 003/132] =?UTF-8?q?Verhalten=20MessageAnOEs=20f=C3=BCr=20M?= =?UTF-8?q?aster=20angepasst?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/models/crm/Prestudent_model.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/application/models/crm/Prestudent_model.php b/application/models/crm/Prestudent_model.php index 2d8ac4a7e..3038b62cc 100644 --- a/application/models/crm/Prestudent_model.php +++ b/application/models/crm/Prestudent_model.php @@ -560,7 +560,7 @@ class Prestudent_model extends DB_Model o.bezeichnung, (CASE WHEN sg.typ = \'b\' THEN ps.prestudent_id - WHEN sg.typ = \'m\' THEN p.prestudent_id + WHEN sg.typ = \'m\' THEN ps.prestudent_id ELSE NULL END) AS prestudent_id FROM public.tbl_prestudent p @@ -581,7 +581,7 @@ class Prestudent_model extends DB_Model return $this->execQuery($query, array($person_id)); } - + /** * Get latest ZGV Bezeichnung of Prestudent. * @@ -593,19 +593,19 @@ class Prestudent_model extends DB_Model { show_error('Prestudent_id is not numeric.'); } - + $language_index = getUserLanguage() == 'German' ? 0 : 1; - + $this->addSelect(' COALESCE( array_to_json(zgvmaster.bezeichnung::varchar[])->>' . $language_index . ', array_to_json(zgv.bezeichnung::varchar[])->>' . $language_index . ' ) AS bezeichnung' ); - + $this->addJoin('bis.tbl_zgv zgv', 'zgv_code', 'LEFT'); $this->addJoin('bis.tbl_zgvmaster zgvmaster', 'zgvmas_code', 'LEFT'); - + return $this->loadWhere(array( 'prestudent_id' => $prestudent_id )); @@ -629,7 +629,7 @@ class Prestudent_model extends DB_Model $query .= " NOT EXISTS"; $query .= " (SELECT 1 FROM public.tbl_prestudentstatus spss - JOIN public.tbl_prestudent sps USING(prestudent_id) + JOIN public.tbl_prestudent sps USING(prestudent_id) WHERE sps.prestudent_id = ps.prestudent_id AND spss.bewerbung_abgeschicktamum IS NOT NULL)"; From 70f3cebd3680e41d795aa2fd92cd65a39b102f43 Mon Sep 17 00:00:00 2001 From: Cris Date: Wed, 3 Nov 2021 13:41:36 +0100 Subject: [PATCH 004/132] Changed DB default entry to NOW() for insertamum / updateaumum in tbl_zeitwunschgueltigkeit --- system/dbupdate_3.3.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/system/dbupdate_3.3.php b/system/dbupdate_3.3.php index 7799527a7..192755a23 100644 --- a/system/dbupdate_3.3.php +++ b/system/dbupdate_3.3.php @@ -5517,9 +5517,9 @@ if(!$result = @$db->db_query("SELECT 1 FROM campus.tbl_zeitwunsch_gueltigkeit LI mitarbeiter_uid CHARACTER VARYING(32) NOT NULL, von DATE, bis DATE, - insertamum TIMESTAMP WITHOUT TIME ZONE, + insertamum TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(), insertvon CHARACTER VARYING(32), - updateamum TIMESTAMP WITHOUT TIME ZONE, + updateamum TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(), updatevon CHARACTER VARYING(32) ); @@ -5535,6 +5535,7 @@ if(!$result = @$db->db_query("SELECT 1 FROM campus.tbl_zeitwunsch_gueltigkeit LI -- Add Permissions GRANT SELECT, UPDATE ON SEQUENCE campus.seq_zeitwunsch_gueltigkeit_zeitwunsch_gueltigkeit_id TO vilesci; + GRANT SELECT, UPDATE ON SEQUENCE campus.seq_zeitwunsch_gueltigkeit_zeitwunsch_gueltigkeit_id TO web; GRANT SELECT, INSERT, UPDATE, DELETE ON campus.tbl_zeitwunsch_gueltigkeit TO vilesci; GRANT SELECT, INSERT, UPDATE ON campus.tbl_zeitwunsch_gueltigkeit TO web; @@ -5657,6 +5658,7 @@ if (!$result = @$db->db_query("SELECT zeitwunsch_id FROM campus.tbl_zeitwunsch L -- Set permissions GRANT SELECT, UPDATE ON SEQUENCE campus.seq_zeitwunsch_zeitwunsch_id TO vilesci; + GRANT SELECT, UPDATE ON SEQUENCE campus.seq_zeitwunsch_zeitwunsch_id TO web; "; if(!$db->db_query($qry)) From e485257458bf4b9238fce2fea1c667e482192404 Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 23 Nov 2021 15:39:52 +0100 Subject: [PATCH 005/132] Created Zeitwunsch_gueltigkeit Class Methods: - load: Ladet eine Zeitwunschgueltigkeit. - save: Speichert eine Zeitwunschgueltigkeit (insert/update) - getByUID: Ladet Zeitwunschgueltigkeiten einer UID mitsamt den zugehoerigen Studiensemestern. - getByStudiensemester: Ladet Zeitwunschgueltigkeiten einer UID und eines bestimmten Semesters --- include/zeitwunsch_gueltigkeit.class.php | 271 +++++++++++++++++++++++ 1 file changed, 271 insertions(+) create mode 100644 include/zeitwunsch_gueltigkeit.class.php diff --git a/include/zeitwunsch_gueltigkeit.class.php b/include/zeitwunsch_gueltigkeit.class.php new file mode 100644 index 000000000..20d1d367d --- /dev/null +++ b/include/zeitwunsch_gueltigkeit.class.php @@ -0,0 +1,271 @@ +load($zeitwunsch_gueltigkeit_id); + } + } + + /** + * Ladet eine Zeitwunschgueltigkeit. + * @param $zeitwunsch_gueltigkeit_id + * @return bool + */ + public function load($zeitwunsch_gueltigkeit_id) + { + if (!is_numeric($zeitwunsch_gueltigkeit_id)) + { + $this->errormsg = 'Wrong parameter zeitwunsch_gueltigkeit_id.'; + return false; + } + + $qry = ' + SELECT * + FROM campus.tbl_zeitwunsch_gueltigkeit + WHERE zeitwunsch_gueltigkeit_id = '.$this->db_add_param($zeitwunsch_gueltigkeit_id). ' + ORDER BY von DESC + '; + + if ($result = $this->db_query($qry)) + { + while ($row = $this->db_fetch_object($result)) + { + $this->zeitwunsch_gueltigkeit_id = $row->zeitwunsch_gueltigkeit_id; + $this->von = $row->von; + $this->bis = $row->bis; + $this->insertamum = $row->insertamum; + $this->insertvon = $row->insertvon; + $this->updateamum = $row->updateamum; + $this->updatevon = $row->updatevon; + } + return true; + } + else + { + $this->errormsg = 'Fehler bei der Datenbankabfrage'; + return false; + } + + } + + /** + * Speichert eine Zeitwunschgueltigkeit + */ + public function save() + { + if($this->new) + { + $qry = ' + INSERT INTO campus.tbl_zeitwunsch_gueltigkeit (mitarbeiter_uid, von, bis, insertvon) + VALUES ('. + $this->db_add_param($this->mitarbeiter_uid).', '. + $this->db_add_param($this->von).', '. + $this->db_add_param($this->bis).', '. + $this->db_add_param($this->insertvon). ') + RETURNING zeitwunsch_gueltigkeit_id; + '; + } + else + { + $qry = ' + UPDATE campus.tbl_zeitwunsch_gueltigkeit SET'. + ' bis = '. $this->db_add_param($this->bis). ', '. + ' updateamum = NOW(), '. + ' updatevon = '.$this->db_add_param($this->updatevon). + ' WHERE zeitwunsch_gueltigkeit_id = ' .$this->db_add_param($this->zeitwunsch_gueltigkeit_id, FHC_INTEGER); + + } + + if($result = $this->db_query($qry)) + { + // Wenn neuer Eintrag + if ($this->new) + { + if($row = $this->db_fetch_object($result)) + { + // ZWG ID des neuen ZWG Eintrags zurueckgeben + $this->zeitwunsch_gueltigkeit_id = $row->zeitwunsch_gueltigkeit_id; + } + } + return true; + } + else + { + $this->errormsg = 'Fehler beim Speichern der Zeitwunschgueltigkeit'; + return false; + } + } + + /** + * Ladet Zeitwunschgueltigkeiten einer UID mitsamt den zugehoerigen Studiensemestern. + * @param $uid + * @param numeric $limit limit = null liefert alle ZWG; limit = 1 liefert die letztgueltige Zeitwunsch-Gueltigkeit. + * @param bool $activeOnly Wenn während des laufenden Semesters der Zeitwunsch geaendert werden, werden mehrere ZWG im Semester hinterlegt. + * true liefert pro Studiensemester nur die letztgueltigen ZWG; + * false liefert alle ZWG pro Studiensemester + * @param string $bis string date, z.B. 2022-01-31 + * @return bool + */ + public function getByUID($uid, $limit = null, $activeOnly = true, $bis = null) + { + $studiensemester = new Studiensemester(); + $studiensemester->getNextStudiensemester(); + + $qry = ' + SELECT zwg.*, studiensemester_kurzbz, start, ende + FROM campus.tbl_zeitwunsch_gueltigkeit zwg, public.tbl_studiensemester + WHERE zwg.mitarbeiter_uid = '.$this->db_add_param($uid); + + // Wenn Bis-Datum angegeben + if (!is_null($bis)) + { + // Zeitwuensche nur bis zum angegebenen Bis-Datum + $qry.= ' + AND (von < ende AND '. $this->db_add_param($bis). '::date > start) + '; + } + else + { + // Alle Zeitwuensche + $qry.= ' + AND (von < ende AND COALESCE(bis, '. $this->db_add_param($studiensemester->ende).'::date ) > start) + '; + } + + // Nach Gueltigkeits-Startdatum sortieren, zuerst die zuletzt gueltigen + $qry.= ' + ORDER BY zeitwunsch_gueltigkeit_id DESC, start DESC + '; + + // Wenn nur aktive Zeitwunschgueltigkeiten angezeigt werden sollen + if ($activeOnly) + { + // ...mit distinct die zuletzt erstellten pro Studiensemester filtern + $qry = ' + SELECT DISTINCT ON (start, studiensemester_kurzbz) start, studiensemester_kurzbz, + ende, zeitwunsch_gueltigkeit_id, mitarbeiter_uid, von, bis, + insertamum, insertvon, updateamum, updatevon + FROM ('. $qry. ') temp + ORDER BY start DESC, studiensemester_kurzbz + '; + } + + // Wenn Limit angegeben + if (!is_null($limit)) + { + // Ausgabe limitieren + $qry.= 'LIMIT '.$this->db_add_param($limit); + } + + if ($result = $this->db_query($qry)) + { + $this->result = array(); + + while ($row = $this->db_fetch_object($result)) + { + $obj = new StdClass(); + $obj->zeitwunsch_gueltigkeit_id = $row->zeitwunsch_gueltigkeit_id; + $obj->von = $row->von; + $obj->bis = $row->bis; + $obj->studiensemester_kurzbz = $row->studiensemester_kurzbz; + $obj->start = $row->start; + $obj->ende = $row->ende; + $obj->insertamum = $row->insertamum; + $obj->insertvon = $row->insertvon; + $obj->updateamum = $row->updateamum; + $obj->updatevon = $row->updatevon; + + $this->result[]= $obj; + } + return true; + } + else + { + $this->errormsg = 'Fehler bei der Datenbankabfrage'; + return false; + } + } + + /** + * Ladet Zeitwunschgueltigkeiten einer UID und eines bestimmten Semesters (defaultmaeßig nur die letztgueltige) + * @param $uid + * @param $studiensemester_kurzbz + * @param null $limit limit = null liefert alle ZWG des Studiensemesters; limit = 1 liefert die letztgueltige ZWG. + * @return bool + */ + public function getByStudiensemester($uid, $studiensemester_kurzbz, $limit = 1) + { + $qry = ' + WITH studiensemester AS + ( + SELECT studiensemester_kurzbz, start, ende + FROM public.tbl_studiensemester + WHERE studiensemester_kurzbz = '.$this->db_add_param($studiensemester_kurzbz). ' + ) + + SELECT zwg.*, studiensemester_kurzbz, start, ende + FROM campus.tbl_zeitwunsch_gueltigkeit zwg, studiensemester ss + WHERE zwg.mitarbeiter_uid = '.$this->db_add_param($uid). ' + AND (zwg.von < ss.ende AND COALESCE(zwg.bis, ss.ende) >= ss.start) + ORDER BY von DESC + '; + + // Wenn Limit angegeben + if (!is_null($limit)) + { + // Ausgabe limitieren + $qry.= 'LIMIT '.$this->db_add_param($limit); + } + + if ($result = $this->db_query($qry)) + { + $this->result = array(); + + while ($row = $this->db_fetch_object($result)) + { + $obj = new StdClass(); + $obj->zeitwunsch_gueltigkeit_id = $row->zeitwunsch_gueltigkeit_id; + $obj->von = $row->von; + $obj->bis = $row->bis; + $obj->studiensemester_kurzbz = $row->studiensemester_kurzbz; + $obj->start = $row->start; + $obj->ende = $row->ende; + $obj->insertamum = $row->insertamum; + $obj->insertvon = $row->insertvon; + $obj->updateamum = $row->updateamum; + $obj->updatevon = $row->updatevon; + + $this->result[]= $obj; + } + return true; + } + else + { + $this->errormsg = 'Fehler bei der Datenbankabfrage'; + return false; + } + } +} + From 976e79447a0985b516d6ad33235d9f4a7c29f2e9 Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 23 Nov 2021 15:41:52 +0100 Subject: [PATCH 006/132] Added / Adapted methods of Zeitwunsch Class to use Zeitwunschgueltigkeit Added: - loadByZWG: Zeitwunsch einer Person zu bestimmter Zeitwunschgueltigkeit laden. Adapted: - loadPerson - save - exists --- include/zeitwunsch.class.php | 792 ++++++++++++++++++----------------- 1 file changed, 419 insertions(+), 373 deletions(-) diff --git a/include/zeitwunsch.class.php b/include/zeitwunsch.class.php index ca15fdb4d..9c60c3a7a 100644 --- a/include/zeitwunsch.class.php +++ b/include/zeitwunsch.class.php @@ -1,374 +1,420 @@ -, - * Andreas Oesterreicher and - * Rudolf Hangl . - */ -require_once(dirname(__FILE__).'/basis_db.class.php'); - -class zeitwunsch extends basis_db -{ - public $new; // boolean - public $zeitwunsch; - - //Tabellenspalten - public $stunde; // smalint - public $mitarbeiter_uid; // varchar(32) - public $tag; // smalint - public $gewicht; // smalint - public $min_stunde; - public $max_stunde; - public $insertamum; - public $insertvon; - public $updateamum; - public $updatevon; - - /** - * Konstruktor - */ - public function __construct() - { - parent::__construct(); - - $this->init(); - } - - /** - * Initialisierung - * - */ - private function init() - { - // Stundenraster abfragen - $sql='SELECT min(stunde) AS min_stunde,max(stunde) AS max_stunde FROM lehre.tbl_stunde;'; - if(!$this->db_query($sql)) - { - $this->errormsg=$this->db_last_error(); - return false; - } - else - { - $row=$this->db_fetch_object(); - $this->min_stunde=$row->min_stunde; - $this->max_stunde=$row->max_stunde; - } - return true; - } - - /** - * Prueft die Variablen vor dem Speichern - * auf Gueltigkeit. - * @return true wenn ok, false im Fehlerfall - */ - protected function validate() - { - if(mb_strlen($this->mitarbeiter_uid)>32) - { - $this->errormsg = 'UID darf nicht laenger als 32 Zeichen sein.'; - return false; - } - if($this->mitarbeiter_uid == '') - { - $this->errormsg = 'UID muss angegeben werden'; - return false; - } - if(!is_numeric($this->stunde)) - { - $this->errormsg = 'Stunde muss eine gueltige Zahl sein'; - return false; - } - if(!is_numeric($this->gewicht)) - { - $this->errormsg = 'Gewicht muss eine gueltige Zahl sein'; - return false; - } - if(!is_numeric($this->tag)) - { - $this->errormsg = 'Tag muss eine gueltige Zahl sein'; - return false; - } - - return true; - } - - /** - * Speichert einen Zeitwunsch in die Datenbank - * Wenn $new auf true gesetzt ist wird ein neuer Datensatz - * angelegt, ansonsten der Datensatz upgedated - * @return true wenn erfolgreich, false im Fehlerfall - */ - public function save() - { - //Variablen auf Gueltigkeit pruefen - if(!$this->validate()) - return false; - - if($this->new) - { - $qry = 'INSERT INTO campus.tbl_zeitwunsch (mitarbeiter_uid, tag, stunde, gewicht, - insertamum, insertvon, updateamum, updatevon) VALUES('. - $this->db_add_param($this->mitarbeiter_uid).','. - $this->db_add_param($this->tag, FHC_INTEGER).','. - $this->db_add_param($this->stunde, FHC_INTEGER).','. - $this->db_add_param($this->gewicht, FHC_INTEGER).','. - $this->db_add_param($this->insertamum).','. - $this->db_add_param($this->insertvon).','. - $this->db_add_param($this->updateamum).','. - $this->db_add_param($this->updatevon).');'; - } - else - { - $qry = 'UPDATE campus.tbl_zeitwunsch SET'. - ' gewicht='.$this->db_add_param($this->gewicht, FHC_INTEGER).', '. - ' updateamum='.$this->db_add_param($this->updateamum).', '. - ' updatevon='.$this->db_add_param($this->updatevon). - " WHERE - mitarbeiter_uid=".$this->db_add_param($this->mitarbeiter_uid, FHC_STRING, false)." - AND tag=".$this->db_add_param($this->tag, FHC_INTEGER)." - AND stunde=".$this->db_add_param($this->stunde, FHC_INTEGER); - } - - if($this->db_query($qry)) - { - return true; - } - else - { - $this->errormsg = 'Fehler beim Speichern des Zeitwunsches'; - return false; - } - } - - /** - * Zeitwunsch einer Person laden - * @param uid - * @param datum - * @return boolean Ergebnis steht in Array $zeitwunsch wenn true - */ - public function loadPerson($uid,$datum=null) - { - // Zeitwuensche abfragen - if(!$this->db_query("SELECT * FROM campus.tbl_zeitwunsch WHERE mitarbeiter_uid=".$this->db_add_param($uid))) - { - $this->errormsg = $this->db_last_error(); - return false; - } - else - { - while ($row = $this->db_fetch_object()) - { - $this->zeitwunsch[$row->tag][$row->stunde]=$row->gewicht; - $this->insertamum = $row->insertamum; - $this->insertvon = $row->insertvon; - $this->updateamum = $row->updateamum; - $this->updatevon = $row->updatevon; - } - } - - if (!is_null($datum)) - { - $beginn=montag($datum); - $start=date('Y-m-d',$beginn); - $ende=date('Y-m-d',jump_day($beginn,7)); - - // Zeitsperren abfragen - $sql=" - SELECT - vondatum,vonstunde,bisdatum,bisstunde - FROM - campus.tbl_zeitsperre - WHERE - mitarbeiter_uid=".$this->db_add_param($uid)." - AND vondatum<=".$this->db_add_param($ende)." - AND bisdatum>=".$this->db_add_param($start); - - if(!$this->db_query($sql)) - { - $this->errormsg=$this->db_last_error(); - return false; - } - else - { - while($row = $this->db_fetch_object()) - { - $beginn=montag($datum); - for ($i=1;$i<=7;$i++) - { - $date_iso=date('Y-m-d',$beginn); - //echo "\n".$date_iso."\n".$row->vondatum."\n"; - if ($date_iso>$row->vondatum && $date_iso<$row->bisdatum) - for ($j=$this->min_stunde;$j<=$this->max_stunde;$j++) - $this->zeitwunsch[$i][$j]=-3; - if ($date_iso==$row->vondatum && $date_iso<$row->bisdatum) - { - if (is_null($row->vonstunde)) - $row->vonstunde=$this->min_stunde; - for ($j=$row->vonstunde;$j<=$this->max_stunde;$j++) - $this->zeitwunsch[$i][$j]=-3; - } - if ($date_iso>$row->vondatum && $date_iso==$row->bisdatum) - { - if (is_null($row->bisstunde)) - $row->bisstunde=$this->max_stunde; - for ($j=$this->min_stunde;$j<=$row->bisstunde;$j++) - $this->zeitwunsch[$i][$j]=-3; - } - if ($date_iso==$row->vondatum && $date_iso==$row->bisdatum) - { - if (is_null($row->vonstunde)) - $row->vonstunde=$this->min_stunde; - if (is_null($row->bisstunde)) - $row->bisstunde=$this->max_stunde; - for ($j=$row->vonstunde;$j<=$row->bisstunde;$j++) - $this->zeitwunsch[$i][$j]=-3; - } - $beginn=jump_day($beginn,1); - } - } - } - } - return true; - } - - - /** - * Zeitwunsch der Personen in Lehreinheiten laden - * @param $le_id LehreinheitID Array - * @param $datum - * @return true oder false - */ - public function loadZwLE($le_id,$datum=null) - { - //$this->init(); - // SUB-Select fuer LVAs - $sql_query_leid=''; - $sql_query_le='SELECT DISTINCT mitarbeiter_uid FROM campus.vw_lehreinheit WHERE '; - for ($i=0;$idb_add_param($le_id[$i], FHC_INTEGER); - $sql_query_leid=mb_substr($sql_query_leid,3); - $sql_query_le.=$sql_query_leid; - - // Schlechteste Zeitwuensche holen - $sql_query='SELECT tag,stunde,min(gewicht) AS gewicht - FROM campus.tbl_zeitwunsch WHERE mitarbeiter_uid IN ('.$sql_query_le.') GROUP BY tag,stunde'; - - // Zeitwuensche abfragen - if(!$this->db_query($sql_query)) - { - $this->errormsg = $this->db_last_error(); - return false; - } - else - while($row = $this->db_fetch_object()) - $this->zeitwunsch[$row->tag][$row->stunde]=$row->gewicht; - - // *********************************************************** - // Zeitsperren fuer die aktuelle Woche holen - - if (!is_null($datum)) - { - $beginn=montag($datum); - $start=date('Y-m-d',$beginn); - $ende=date('Y-m-d',jump_day($beginn,7)); - - // Zeitsperren abfragen - $sql=" - SELECT - vondatum,vonstunde,bisdatum,bisstunde - FROM - campus.tbl_zeitsperre - WHERE - mitarbeiter_uid IN ($sql_query_le) - AND vondatum<=".$this->db_add_param($ende)." - AND bisdatum>=".$this->db_add_param($start); - - if(!$this->db_query($sql)) - { - $this->errormsg = $this->db_last_error(); - return false; - } - while($row = $this->db_fetch_object()) - { - $beginn=montag($datum); - for ($i=1;$i<=7;$i++) - { - $date_iso=date('Y-m-d',$beginn); - //echo "\n".$date_iso."\n".$row->vondatum."\n"; - if ($date_iso>$row->vondatum && $date_iso<$row->bisdatum) - for ($j=$this->min_stunde;$j<=$this->max_stunde;$j++) - $this->zeitwunsch[$i][$j]=-3; - if ($date_iso==$row->vondatum && $date_iso<$row->bisdatum) - { - if (is_null($row->vonstunde)) - $row->vonstunde=$this->min_stunde; - for ($j=$row->vonstunde;$j<=$this->max_stunde;$j++) - $this->zeitwunsch[$i][$j]=-3; - } - if ($date_iso>$row->vondatum && $date_iso==$row->bisdatum) - { - if (is_null($row->bisstunde)) - $row->bisstunde=$this->max_stunde; - for ($j=$this->min_stunde;$j<=$row->bisstunde;$j++) - $this->zeitwunsch[$i][$j]=-3; - } - if ($date_iso==$row->vondatum && $date_iso==$row->bisdatum) - { - if (is_null($row->vonstunde)) - $row->vonstunde=$this->min_stunde; - if (is_null($row->bisstunde)) - $row->bisstunde=$this->max_stunde; - for ($j=$row->vonstunde;$j<=$row->bisstunde;$j++) - $this->zeitwunsch[$i][$j]=-3; - } - $beginn=jump_day($beginn,1); - } - } - } - return true; - } - - /** - * Prueft ob bereits ein Zeitwunsch eingetragen ist - * - * @param $uid - * @param $stunde - * @param $tag - * @return true wenn vorhanden sonst false - */ - function exists($uid, $stunde, $tag) - { - $qry = "SELECT 1 FROM campus.tbl_zeitwunsch - WHERE - mitarbeiter_uid=".$this->db_add_param($uid)." - AND stunde=".$this->db_add_param($stunde, FHC_INTEGER)." - AND tag=".$this->db_add_param($tag, FHC_INTEGER); - if($this->db_query($qry)) - { - if($this->db_num_rows()>0) - return true; - else - return false; - } - else - { - $this->errormsg='Fehler beim Abfragen des Zeitwunsches'; - return false; - } - } -} +, + * Andreas Oesterreicher and + * Rudolf Hangl . + */ +require_once(dirname(__FILE__).'/basis_db.class.php'); + +class zeitwunsch extends basis_db +{ + public $new; // boolean + public $zeitwunsch; + + //Tabellenspalten + public $stunde; // smalint + public $mitarbeiter_uid; // varchar(32) + public $tag; // smalint + public $gewicht; // smalint + public $min_stunde; + public $max_stunde; + public $insertamum; + public $insertvon; + public $updateamum; + public $updatevon; + public $zeitwunsch_id; + public $zeitwunsch_gueltigkeit_id; + + /** + * Konstruktor + */ + public function __construct() + { + parent::__construct(); + + $this->init(); + } + + /** + * Initialisierung + * + */ + private function init() + { + // Stundenraster abfragen + $sql='SELECT min(stunde) AS min_stunde,max(stunde) AS max_stunde FROM lehre.tbl_stunde;'; + if(!$this->db_query($sql)) + { + $this->errormsg=$this->db_last_error(); + return false; + } + else + { + $row=$this->db_fetch_object(); + $this->min_stunde=$row->min_stunde; + $this->max_stunde=$row->max_stunde; + } + return true; + } + + /** + * Prueft die Variablen vor dem Speichern + * auf Gueltigkeit. + * @return true wenn ok, false im Fehlerfall + */ + protected function validate() + { + if(mb_strlen($this->mitarbeiter_uid)>32) + { + $this->errormsg = 'UID darf nicht laenger als 32 Zeichen sein.'; + return false; + } + if($this->mitarbeiter_uid == '') + { + $this->errormsg = 'UID muss angegeben werden'; + return false; + } + if(!is_numeric($this->stunde)) + { + $this->errormsg = 'Stunde muss eine gueltige Zahl sein'; + return false; + } + if(!is_numeric($this->gewicht)) + { + $this->errormsg = 'Gewicht muss eine gueltige Zahl sein'; + return false; + } + if(!is_numeric($this->tag)) + { + $this->errormsg = 'Tag muss eine gueltige Zahl sein'; + return false; + } + + return true; + } + + /** + * Speichert einen Zeitwunsch in die Datenbank + * Wenn $new auf true gesetzt ist wird ein neuer Datensatz + * angelegt, ansonsten der Datensatz upgedated + * @return true wenn erfolgreich, false im Fehlerfall + */ + public function save() + { + //Variablen auf Gueltigkeit pruefen + if(!$this->validate()) + return false; + + if($this->new) + { + $qry = 'INSERT INTO campus.tbl_zeitwunsch (mitarbeiter_uid, tag, stunde, gewicht, + insertamum, insertvon, updateamum, updatevon, zeitwunsch_gueltigkeit_id) VALUES('. + $this->db_add_param($this->mitarbeiter_uid).','. + $this->db_add_param($this->tag, FHC_INTEGER).','. + $this->db_add_param($this->stunde, FHC_INTEGER).','. + $this->db_add_param($this->gewicht, FHC_INTEGER).','. + $this->db_add_param($this->insertamum).','. + $this->db_add_param($this->insertvon).','. + $this->db_add_param($this->updateamum).','. + $this->db_add_param($this->updatevon).','. + $this->db_add_param($this->zeitwunsch_gueltigkeit_id).');'; + } + else + { + $qry = 'UPDATE campus.tbl_zeitwunsch SET'. + ' gewicht='.$this->db_add_param($this->gewicht, FHC_INTEGER).', '. + ' updateamum='.$this->db_add_param($this->updateamum).', '. + ' updatevon='.$this->db_add_param($this->updatevon). + " WHERE + mitarbeiter_uid=".$this->db_add_param($this->mitarbeiter_uid, FHC_STRING, false)." + AND tag=".$this->db_add_param($this->tag, FHC_INTEGER)." + AND stunde=".$this->db_add_param($this->stunde, FHC_INTEGER). " + AND zeitwunsch_gueltigkeit_id=".$this->db_add_param($this->zeitwunsch_gueltigkeit_id, FHC_INTEGER); + } + + if($this->db_query($qry)) + { + return true; + } + else + { + $this->errormsg = 'Fehler beim Speichern des Zeitwunsches'; + return false; + } + } + + /** + * Zeitwunsch einer Person zu bestimmter Zeitwunschgueltigkeit laden + * @param $uid + * @param $zeitwunsch_gueltigkeit_id + * @return boolean + */ + public function loadByZWG($uid, $zeitwunsch_gueltigkeit_id) + { + $qry = ' + SELECT * + FROM campus.tbl_zeitwunsch + JOIN campus.tbl_zeitwunsch_gueltigkeit zwg USING (zeitwunsch_gueltigkeit_id) + WHERE zwg.mitarbeiter_uid = ' . $this->db_add_param($uid) . ' + AND zeitwunsch_gueltigkeit_id = ' . $this->db_add_param($zeitwunsch_gueltigkeit_id) . ' + ORDER BY tag, stunde + '; + + if ($this->db_query($qry)) + { + while ($row = $this->db_fetch_object()) + { + $this->zeitwunsch[$row->tag][$row->stunde] = $row->gewicht; + $this->insertamum = $row->insertamum; + $this->insertvon = $row->insertvon; + $this->updateamum = $row->updateamum; + $this->updatevon = $row->updatevon; + $this->zeitwunsch_id = $row->zeitwunsch_id; + $this->zeitwunsch_gueltigkeit_id = $row->zeitwunsch_gueltigkeit_id; + } + return true; + } + else + { + $this->errormsg = $this->db_last_error(); + return false; + } + } + + /** + * Alle Zeitwuensche einer Person laden + * @param uid + * @param datum + * @return boolean Ergebnis steht in Array $zeitwunsch wenn true + */ + public function loadPerson($uid,$datum=null) + { + // Zeitwuensche abfragen + if(!$this->db_query("SELECT * FROM campus.tbl_zeitwunsch WHERE mitarbeiter_uid=".$this->db_add_param($uid))) + { + $this->errormsg = $this->db_last_error(); + return false; + } + else + { + while ($row = $this->db_fetch_object()) + { + $this->zeitwunsch[$row->tag][$row->stunde]=$row->gewicht; + $this->insertamum = $row->insertamum; + $this->insertvon = $row->insertvon; + $this->updateamum = $row->updateamum; + $this->updatevon = $row->updatevon; + $this->zeitwunsch_id = $row->zeitwunsch_id; + $this->zeitwunsch_gueltigkeit_id = $row->zeitwunsch_gueltigkeit_id; + } + } + + if (!is_null($datum)) + { + $beginn=montag($datum); + $start=date('Y-m-d',$beginn); + $ende=date('Y-m-d',jump_day($beginn,7)); + + // Zeitsperren abfragen + $sql=" + SELECT + vondatum,vonstunde,bisdatum,bisstunde + FROM + campus.tbl_zeitsperre + WHERE + mitarbeiter_uid=".$this->db_add_param($uid)." + AND vondatum<=".$this->db_add_param($ende)." + AND bisdatum>=".$this->db_add_param($start); + + if(!$this->db_query($sql)) + { + $this->errormsg=$this->db_last_error(); + return false; + } + else + { + while($row = $this->db_fetch_object()) + { + $beginn=montag($datum); + for ($i=1;$i<=7;$i++) + { + $date_iso=date('Y-m-d',$beginn); + //echo "\n".$date_iso."\n".$row->vondatum."\n"; + if ($date_iso>$row->vondatum && $date_iso<$row->bisdatum) + for ($j=$this->min_stunde;$j<=$this->max_stunde;$j++) + $this->zeitwunsch[$i][$j]=-3; + if ($date_iso==$row->vondatum && $date_iso<$row->bisdatum) + { + if (is_null($row->vonstunde)) + $row->vonstunde=$this->min_stunde; + for ($j=$row->vonstunde;$j<=$this->max_stunde;$j++) + $this->zeitwunsch[$i][$j]=-3; + } + if ($date_iso>$row->vondatum && $date_iso==$row->bisdatum) + { + if (is_null($row->bisstunde)) + $row->bisstunde=$this->max_stunde; + for ($j=$this->min_stunde;$j<=$row->bisstunde;$j++) + $this->zeitwunsch[$i][$j]=-3; + } + if ($date_iso==$row->vondatum && $date_iso==$row->bisdatum) + { + if (is_null($row->vonstunde)) + $row->vonstunde=$this->min_stunde; + if (is_null($row->bisstunde)) + $row->bisstunde=$this->max_stunde; + for ($j=$row->vonstunde;$j<=$row->bisstunde;$j++) + $this->zeitwunsch[$i][$j]=-3; + } + $beginn=jump_day($beginn,1); + } + } + } + } + return true; + } + + /** + * Zeitwunsch der Personen in Lehreinheiten laden + * @param $le_id LehreinheitID Array + * @param $datum + * @return true oder false + */ + public function loadZwLE($le_id,$datum=null) + { + //$this->init(); + // SUB-Select fuer LVAs + $sql_query_leid=''; + $sql_query_le='SELECT DISTINCT mitarbeiter_uid FROM campus.vw_lehreinheit WHERE '; + for ($i=0;$idb_add_param($le_id[$i], FHC_INTEGER); + $sql_query_leid=mb_substr($sql_query_leid,3); + $sql_query_le.=$sql_query_leid; + + // Schlechteste Zeitwuensche holen + $sql_query='SELECT tag,stunde,min(gewicht) AS gewicht + FROM campus.tbl_zeitwunsch WHERE mitarbeiter_uid IN ('.$sql_query_le.') GROUP BY tag,stunde'; + + // Zeitwuensche abfragen + if(!$this->db_query($sql_query)) + { + $this->errormsg = $this->db_last_error(); + return false; + } + else + while($row = $this->db_fetch_object()) + $this->zeitwunsch[$row->tag][$row->stunde]=$row->gewicht; + + // *********************************************************** + // Zeitsperren fuer die aktuelle Woche holen + + if (!is_null($datum)) + { + $beginn=montag($datum); + $start=date('Y-m-d',$beginn); + $ende=date('Y-m-d',jump_day($beginn,7)); + + // Zeitsperren abfragen + $sql=" + SELECT + vondatum,vonstunde,bisdatum,bisstunde + FROM + campus.tbl_zeitsperre + WHERE + mitarbeiter_uid IN ($sql_query_le) + AND vondatum<=".$this->db_add_param($ende)." + AND bisdatum>=".$this->db_add_param($start); + + if(!$this->db_query($sql)) + { + $this->errormsg = $this->db_last_error(); + return false; + } + while($row = $this->db_fetch_object()) + { + $beginn=montag($datum); + for ($i=1;$i<=7;$i++) + { + $date_iso=date('Y-m-d',$beginn); + //echo "\n".$date_iso."\n".$row->vondatum."\n"; + if ($date_iso>$row->vondatum && $date_iso<$row->bisdatum) + for ($j=$this->min_stunde;$j<=$this->max_stunde;$j++) + $this->zeitwunsch[$i][$j]=-3; + if ($date_iso==$row->vondatum && $date_iso<$row->bisdatum) + { + if (is_null($row->vonstunde)) + $row->vonstunde=$this->min_stunde; + for ($j=$row->vonstunde;$j<=$this->max_stunde;$j++) + $this->zeitwunsch[$i][$j]=-3; + } + if ($date_iso>$row->vondatum && $date_iso==$row->bisdatum) + { + if (is_null($row->bisstunde)) + $row->bisstunde=$this->max_stunde; + for ($j=$this->min_stunde;$j<=$row->bisstunde;$j++) + $this->zeitwunsch[$i][$j]=-3; + } + if ($date_iso==$row->vondatum && $date_iso==$row->bisdatum) + { + if (is_null($row->vonstunde)) + $row->vonstunde=$this->min_stunde; + if (is_null($row->bisstunde)) + $row->bisstunde=$this->max_stunde; + for ($j=$row->vonstunde;$j<=$row->bisstunde;$j++) + $this->zeitwunsch[$i][$j]=-3; + } + $beginn=jump_day($beginn,1); + } + } + } + return true; + } + + /** + * Prueft ob bereits ein Zeitwunsch eingetragen ist + * + * @param $uid + * @param $zwg_id + * @param $stunde + * @param $tag + * @return true wenn vorhanden sonst false + */ + function exists($uid, $zwg_id, $stunde, $tag) + { + $qry = "SELECT 1 FROM campus.tbl_zeitwunsch + WHERE + mitarbeiter_uid=".$this->db_add_param($uid)." + AND stunde=".$this->db_add_param($stunde, FHC_INTEGER)." + AND tag=".$this->db_add_param($tag, FHC_INTEGER). " + AND zeitwunsch_gueltigkeit_id = ".$this->db_add_param($zwg_id, FHC_INTEGER); + if($this->db_query($qry)) + { + if($this->db_num_rows()>0) + return true; + else + return false; + } + else + { + $this->errormsg='Fehler beim Abfragen des Zeitwunsches'; + return false; + } + } +} + ?> \ No newline at end of file From 7c65e2ff5377e35948461488313c9cdc2b5395a2 Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 23 Nov 2021 15:56:07 +0100 Subject: [PATCH 007/132] Adapted Zeitwunsch GUI to use Zeitwunschgueltigkeit and save by Studiensemester Major adaptation in GUI: - Added Dropdown to select actual / next Studiensemester to edit Zeitwunsch - Added Radiobuttons to allow changing or copying from earlier Studiensemester - By selecting an earlier Studiensemester, the earlier Zeitwunsch is displayed in the table and is ready to edit or just to save. --- cis/private/profile/zeitwunsch.php | 607 +++++++++++++++++++++-------- locale/de-AT/zeitwunsch.php | 1 + locale/en-US/zeitwunsch.php | 1 + 3 files changed, 442 insertions(+), 167 deletions(-) diff --git a/cis/private/profile/zeitwunsch.php b/cis/private/profile/zeitwunsch.php index ff4c35ebd..6e1f800b4 100644 --- a/cis/private/profile/zeitwunsch.php +++ b/cis/private/profile/zeitwunsch.php @@ -18,6 +18,7 @@ * Authors: Christian Paminger , * Andreas Oesterreicher and * Rudolf Hangl . + * Cristina Hainberger */ /** * @brief bietet die Moeglichkeit zur Anzeige und @@ -29,6 +30,7 @@ require_once('../../../include/globals.inc.php'); require_once('../../../include/functions.inc.php'); require_once('../../../include/datum.class.php'); require_once('../../../include/zeitwunsch.class.php'); +require_once('../../../include/zeitwunsch_gueltigkeit.class.php'); require_once('../../../include/studiensemester.class.php'); require_once('../../../include/zeitaufzeichnung_gd.class.php'); require_once('../../../include/benutzer.class.php'); @@ -49,63 +51,192 @@ $uid = get_uid(); if(!check_lektor($uid)) die($p->t('global/keineBerechtigungFuerDieseSeite')); - -$PHP_SELF = $_SERVER['PHP_SELF']; - -if(isset($_GET['type'])) - $type=$_GET['type']; - $datum_obj = new datum(); +// Nächstes Studiensemester +$next_ss = new Studiensemester(); +$next_ss->getNextStudiensemester(); + +// Aktuelles Studiensemester +$akt_ss = new Studiensemester(); +$akt_ss->load($akt_ss->getAkt()); + +// Dropdown: Aktuelles/naechstes Studiensemester zum Bearbeiten +$selected_ss = (isset($_GET['stsem']) && is_string($_GET['stsem'])) ? $_GET['stsem'] : $next_ss->studiensemester_kurzbz; // Default: Nächstes Studiensemester + +// Dropdown: Vergangene Studiensemester zum Kopieren +$selected_past_ss = (isset($_GET['pastStsem']) && is_string($_GET['pastStsem'])) ? $_GET['pastStsem'] : null; // Default: null + //Stundentabelleholen if(! $result_stunde=$db->db_query('SELECT * FROM lehre.tbl_stunde ORDER BY stunde')) die($db->db_last_error()); $num_rows_stunde=$db->db_num_rows($result_stunde); // Zeitwuensche speichern -if (isset($type) && $type=='save') +if (isset($_GET['type']) && $_GET['type'] == 'save') { - $zw = new zeitwunsch(); + // Letzte Zeitwunschgueltigkeit (ZWG) holen + $zwg = new Zeitwunsch_gueltigkeit(); + $zwg->getByUID($uid, 1); + $lastZwg = !empty($zwg->result) ? $zwg->result[0] : null; - for ($t=1;$t<7;$t++) - { - for ($i=0;$i<$num_rows_stunde;$i++) - { - $var='wunsch'.$t.'_'.$i; - if(!isset($_POST[$var])) - continue; - $gewicht=$_POST[$var]; - $stunde=$i+1; + // Check, ob letzte ZWG im nächsten Studiensemester startet. D.h. es existiert ein neuer Zeitwunsch in der Zukunft + $lastZwgStartsNextSemester = (!is_null($lastZwg) && $lastZwg->von >= $next_ss->start) ? true : false; + $zw_zwg_id = null; // ZWG ID, die zum Speichern / Updaten des Zeitwunsches uebergeben wird - $zw->mitarbeiter_uid = $uid; - $zw->stunde = $stunde; - $zw->tag = $t; - $zw->gewicht = $gewicht; - $zw->updateamum = date('Y-m-d H:i:s'); - $zw->updatevon = $uid; + // Wenn allererster Zeitwunsch, also noch keine ZWG vorhanden + if (is_null($lastZwg)) + { + // Wenn ZW fuer naechstes Studiensemester ist + if ($selected_ss == $next_ss->studiensemester_kurzbz) + { + // Neue ZWG setzen: von = Start nächstes Studiensemester, bis offen lassen + $zw_zwg_id = insertZWG($uid, $next_ss->start, null); + } - if (!$zw->exists($uid, $stunde, $t)) - { - $zw->new = true; - $zw->insertamum = date('Y-m-d H:i:s'); - $zw->insertvon = $uid; - } - else - $zw->new = false; + // Wenn Zeitwunsch fuer aktuelles Studiensemester ist + if ($selected_ss == $akt_ss->studiensemester_kurzbz) + { + // Neue ZWG setzen: von = now(), bis offen lassen + $zw_zwg_id = insertZWG($uid, (new DateTime())->format('Y-m-d H:i:s'), null); + } + } - if(!$zw->save()) - echo $zw->errormsg; - } - } + // Wenn mindestens eine ZWG vorhanden + if (!is_null($lastZwg)) + { + // Wenn Zeitwunsch fuer naechstes Studiensemester ist + if ($selected_ss == $next_ss->studiensemester_kurzbz) + { + // Wenn naechstes Studiensemester schon eine eigene ZWG hat + if ($lastZwgStartsNextSemester) + { + // Nur Zeitwunsch dieser ZWG updaten + $zw_zwg_id = $lastZwg->zeitwunsch_gueltigkeit_id; + } + + // Wenn naechstes Studiensemester keine eigene ZWG hat + if (!$lastZwgStartsNextSemester) + { + // Fuer bisher letzte ZWG ein Endedatum setzen: bis = Ende aktuelles Studiensemester + updateZWG($uid, $lastZwg->zeitwunsch_gueltigkeit_id, $akt_ss->ende); + + // Neue ZWG setzen: von = Start nächstes Studiensemester, bis offen lassen + $zw_zwg_id = insertZWG($uid, $next_ss->start, null); + } + } + + // Wenn Zeitwunsch fuer aktuelles Studiensemester ist + if ($selected_ss == $akt_ss->studiensemester_kurzbz) + { + /** + * Check, ob aktuelles Studiensemester eine ZWG hat. + * Wenn die allererste ZWG fuer das naechste Studiensemester erstellt wurde, dann hat das + * aktuelle Studiensemester noch keine ZWG. + * */ + $zwg = new Zeitwunsch_gueltigkeit(); + $zwg->getByStudiensemester($uid, $akt_ss->studiensemester_kurzbz); + $akt_ss_zwg = !empty($zwg->result) ? $zwg->result[0] : null; + + // Keine ZWG fuer aktuelles Studiensemester vorhanden. + // Da eine ZWG ID aber schon vorhanden: USER HAT ERSTMALIG MIT NAECHSTEM STUDIENSEMESTER EINTRAG BEGONNEN + if (is_null($akt_ss_zwg)) + { + // Neue ZWG setzen: von = now(), ende = Ende aktuelles Studiensemester + $zw_zwg_id = insertZWG($uid, (new DateTime())->format('Y-m-d H:i:s'), $akt_ss->ende); + } + + // ZWG für aktuelles Studiensemester ist vorhanden --> SPLIT AKTUELLE STUDIENSEMESTER + if ((!is_null($akt_ss_zwg))) + { + // Wenn am selben Tag schon neue ZWG gespeichert wurde, keine neue ZWG anlegen, sondern diese nur updaten + // Verhindert mehrfache Eintraege, wenn oefters zwischengespeichert wird. + if ((new DateTime($akt_ss_zwg->insertamum))->format('Y-m-d') == (new Datetime())->format('Y-m-d')) + { + updateZWG($uid, $akt_ss_zwg->zeitwunsch_gueltigkeit_id, $akt_ss_zwg->bis); + + $zw_zwg_id = $akt_ss_zwg->zeitwunsch_gueltigkeit_id; + } + else + { + // Neue ZWG setzen: von = now(), bis = Bis von ZWG des aktuellen Studiensemesters uebernehmen: + // -> bis ist entweder Ende aktuelles Studiensemester (wenn ZWG für nächstes Studiensemester vorhanden ist) + // -> sonst ist bis null + $zw_zwg_id = insertZWG($uid, (new DateTime())->format('Y-m-d H:i:s'), $akt_ss_zwg->bis); + + // Fuer bisher letzte ZWG das Endedatum auf heute setzen: bis = now() + // NOTE: MUSS nach dem insert sein + updateZWG($uid, $akt_ss_zwg->zeitwunsch_gueltigkeit_id, (new DateTime())->format('Y-m-d H:i:s')); + } + } + } + } + + // Insert Zeitwunsch mit Zeitwunsch ZWG ID + if (is_numeric($zw_zwg_id)) + { + $zw = new zeitwunsch(); + + for ($t=1;$t<7;$t++) + { + for ($i=0;$i<$num_rows_stunde;$i++) + { + $var='wunsch'.$t.'_'.$i; + if(!isset($_POST[$var])) + continue; + $gewicht=$_POST[$var]; + $stunde=$i+1; + + $zw->mitarbeiter_uid = $uid; + $zw->stunde = $stunde; + $zw->tag = $t; + $zw->gewicht = $gewicht; + $zw->updateamum = date('Y-m-d H:i:s'); + $zw->updatevon = $uid; + $zw->zeitwunsch_gueltigkeit_id = $zw_zwg_id; + + if (!$zw->exists($uid, $zw_zwg_id, $stunde, $t)) + { + $zw->new = true; + $zw->insertamum = date('Y-m-d H:i:s'); + $zw->insertvon = $uid; + } + else + { + $zw->new = false; + } + + if(!$zw->save()) + echo $zw->errormsg; + } + } + } } +/** + * Zeitwunschgueltigkeit fuer Tabelle holen. + * Der Zeitwunsch wird anhand der Zeitwunschgueltigkeit (ZWG) des gewaehlten Studiensemesters ermittelt. + * Das Studiensemester wird, je nach Vorhandensein, in dieser Reihenfolge herangezogen: + * 1. Wenn in Dropdown ausgewaehlt: Vergangenes Studiensemester (zum Kopieren von Zeitwunsch) + * 2. Wenn in Dropdown ausgewaehlt: Aktuelles Studiensemester + * 3: Default: Nächstes Studiensemesters + */ +$zwg = new zeitwunsch_gueltigkeit(); +$tmp_ss = is_null($selected_past_ss) ? $selected_ss : $selected_past_ss; +$zwg->getByStudiensemester($uid, $tmp_ss); +$zwg_id = !empty($zwg->result[0]) ? $zwg->result[0]->zeitwunsch_gueltigkeit_id : null; //null, wenn noch kein ZW + +/** + * Zeitwunsch fuer Tabelle holen + * Wenn noch kein Zeitwunsch vorhanden, bleibt die Zeitwunsch Instanz leer + * */ $zw = new zeitwunsch(); -if(!$zw->loadPerson($uid)) - die($zw->errormsg); - +if (!$zw->loadByZWG($uid, $zwg_id)) +{ + die($zw->errormsg); +} $wunsch = $zw->zeitwunsch; - // Personendaten $person = new benutzer(); if(!$person->load($uid)) @@ -114,12 +245,6 @@ if(!$person->load($uid)) $ma = new mitarbeiter($uid); $fixangestellt = $ma->fixangestellt; -// Nächstes Studiensemester -$ss = new Studiensemester(); -$ss->getNextStudiensemester(); -$next_ss = $ss->studiensemester_kurzbz; -$current_ss = $ss->getakt(); - // Erklärung zu Pausen bei geteilten Arbeitszeiten speichern if (isset($_GET['selbstverwaltete-pause-akt']) && !empty($_GET['submit-akt'])) { @@ -127,10 +252,10 @@ if (isset($_GET['selbstverwaltete-pause-akt']) && !empty($_GET['submit-akt'])) $zeitaufzeichnung_gd = new Zeitaufzeichnung_gd(); $zeitaufzeichnung_gd->uid = $uid; - $zeitaufzeichnung_gd->studiensemester_kurzbz = $current_ss; + $zeitaufzeichnung_gd->studiensemester_kurzbz = $akt_ss->studiensemester_kurzbz; $zeitaufzeichnung_gd->selbstverwaltete_pause = $selbstverwaltete_pause; $za_gd = new Zeitaufzeichnung_gd(); - $za_gd->load($uid, $current_ss); + $za_gd->load($uid, $akt_ss->studiensemester_kurzbz); if ($za_gd->uid) { echo 'Bereits eingetragen'; @@ -147,10 +272,10 @@ if (isset($_GET['selbstverwaltete-pause']) && !empty($_GET['submit'])) $zeitaufzeichnung_gd = new Zeitaufzeichnung_gd(); $zeitaufzeichnung_gd->uid = $uid; - $zeitaufzeichnung_gd->studiensemester_kurzbz = $next_ss; + $zeitaufzeichnung_gd->studiensemester_kurzbz = $next_ss->studiensemester_kurzbz; $zeitaufzeichnung_gd->selbstverwaltete_pause = $selbstverwaltete_pause; $za_gd = new Zeitaufzeichnung_gd(); - $za_gd->load($uid, $next_ss); + $za_gd->load($uid, $next_ss->studiensemester_kurzbz); if ($za_gd->uid) { echo 'Bereits eingetragen'; @@ -162,14 +287,58 @@ if (isset($_GET['selbstverwaltete-pause']) && !empty($_GET['submit'])) } +/** + * Init ZWG Objekt zum Erstellen einer neuen ZWG + */ +function insertZWG($uid, $von, $bis) +{ + $zwg = new Zeitwunsch_gueltigkeit(); + $zwg->new = true; + $zwg->mitarbeiter_uid = $uid; + $zwg->von = $von; + $zwg->bis = $bis; + $zwg->insertvon = $uid; + if ($zwg->save()) + { + return $zwg->zeitwunsch_gueltigkeit_id; + } + else + { + die($zwg->errormsg); + } +} + +/** + * Init ZWG Objekt zum Updaten einer bestehenden ZWG + */ +function updateZWG($uid, $zwg_id, $bis) +{ + $zwg = new Zeitwunsch_gueltigkeit(); + $zwg->new = false; + $zwg->zeitwunsch_gueltigkeit_id = $zwg_id; + $zwg->mitarbeiter_uid = $uid; + $zwg->bis = $bis; + $zwg->updatevon = $uid; + + if (!$zwg->save()) + { + die($zwg->errormsg); + } + + return; +} + + ?> <?php echo $p->t('zeitwunsch/zeitwunsch');?> - + + +
- +
@@ -212,10 +413,10 @@ if (isset($_GET['selbstverwaltete-pause']) && !empty($_GET['submit'])) t('zeitwunsch/geteilteArbeitszeit'); $gd = new zeitaufzeichnung_gd(); - $gd->load($uid, $current_ss); + $gd->load($uid, $akt_ss->studiensemester_kurzbz); if ( ! $gd->uid ) { - echo '

Zustimmung für '.$current_ss.': '; + echo '

Zustimmung für '.$akt_ss->studiensemester_kurzbz.': '; echo 'ja'; echo 'nein'; echo '




'; @@ -223,13 +424,13 @@ if (isset($_GET['selbstverwaltete-pause']) && !empty($_GET['submit'])) else { $zustimmung = ($gd->selbstverwaltete_pause) ? ' erteilt' : 'abgelehnt'; - echo '

Zustimmung für '.$current_ss.': '.$zustimmung.' am '.$datum_obj->formatDatum($gd->insertamum,'d.m.Y H:i:s').'

'; + echo '

Zustimmung für '.$akt_ss->studiensemester_kurzbz.': '.$zustimmung.' am '.$datum_obj->formatDatum($gd->insertamum,'d.m.Y H:i:s').'

'; } $gd = new zeitaufzeichnung_gd(); - $gd->load($uid, $next_ss); + $gd->load($uid, $next_ss->studiensemester_kurzbz); if ( ! $gd->uid ) { - echo '

Zustimmung für '.$next_ss.': '; + echo '

Zustimmung für '.$next_ss->studiensemester_kurzbz.': '; echo 'ja'; echo 'nein'; echo '




'; @@ -237,7 +438,7 @@ if (isset($_GET['selbstverwaltete-pause']) && !empty($_GET['submit'])) else { $zustimmung = ($gd->selbstverwaltete_pause) ? ' erteilt' : 'abgelehnt'; - echo '

Zustimmung für '.$next_ss.': '.$zustimmung.' am '.$datum_obj->formatDatum($gd->insertamum,'d.m.Y H:i:s').'

'; + echo '

Zustimmung für '.$next_ss->studiensemester_kurzbz.': '.$zustimmung.' am '.$datum_obj->formatDatum($gd->insertamum,'d.m.Y H:i:s').'

'; } //var_dump($gd); ?> @@ -250,125 +451,197 @@ if (isset($_GET['selbstverwaltete-pause']) && !empty($_GET['submit'])) - -
-

t('zeitwunsch/zeitwunsch');?>

- ".$p->t('zeitwunsch/zeitwunschVon')." $person->titelpre $person->vorname $person->nachname $person->titelpost
"; - echo $p->t('zeitwunsch/tragenSieInDiesesNormwochenraster')."

"; - echo '
- - '; - echo ''; - for ($i=0;$i<$num_rows_stunde; $i++) - { - $beginn=$db->db_result($result_stunde,$i,'"beginn"'); - $beginn=substr($beginn,0,5); - $ende=$db->db_result($result_stunde,$i,'"ende"'); - $ende=substr($ende,0,5); - $stunde=$db->db_result($result_stunde,$i,'"stunde"'); - echo ""; - } + // FORM Begin + echo ''; + echo ''; - echo ''; + // Mein Zeitwunsch-Semesterplan Dropdown, Default = naechstes Studiensemester + $next_ss_selected = $next_ss->studiensemester_kurzbz == $selected_ss ? 'selected' : ''; + $akt_ss_selected = $akt_ss->studiensemester_kurzbz == $selected_ss ? 'selected' : ''; - for ($j=1; $j<7; $j++) - { - echo ''; - for ($i=0;$i<$num_rows_stunde;$i++) - { - if (isset($wunsch[$j][$i+1])) - $index=$wunsch[$j][$i+1]; - else - $index=1; - //$id='bgcolor'; - //$id.=$index+3; - $bgcolor=$cfgStdBgcolor[$index+3]; - echo ''; - } - echo ''; - } + echo '

Mein Zeitwunsch gültig im: '; + echo ''; + echo '


'; - echo ' -
'.$p->t('global/stunde').'
'.$p->t('global/beginn').'
'.$p->t('global/ende').'
$stunde
$beginn
$ende
'.$tagbez[$lang->index][$j].'

- - - '; + // Tabelle Zeitwunsch-Semesterplan + echo ''; + // Tabelle Kopfzeile + echo ''; + echo ''; + for ($i=0;$i<$num_rows_stunde; $i++) + { + $beginn=$db->db_result($result_stunde,$i,'"beginn"'); + $beginn=substr($beginn,0,5); + $ende=$db->db_result($result_stunde,$i,'"ende"'); + $ende=substr($ende,0,5); + $stunde=$db->db_result($result_stunde,$i,'"stunde"'); + echo ""; + } + echo ''; + // Tabelle Zellen + for ($j=1; $j<7; $j++) + { + echo ''; + for ($i=0;$i<$num_rows_stunde;$i++) + { + if (isset($wunsch[$j][$i+1])) + $index=$wunsch[$j][$i+1]; + else + $index=1; // Defaultwert, wenn kein Zeitwunsch vorhanden - if($zw->updateamum!='') - { - echo ''.$p->t('zeitwunsch/letzteAenderung').': '.$datum_obj->formatDatum($zw->updateamum,'d.m.Y H:i:s').' '.$p->t('zeitwunsch/von').' '.$zw->updatevon.''; - } - ?> + $bgcolor=$cfgStdBgcolor[$index+3]; + echo ''; + } + echo ''; + } + echo '
'.$p->t('global/stunde').'
'.$p->t('global/beginn').'
'.$p->t('global/ende').'
$stunde
$beginn
$ende
'.$tagbez[$lang->index][$j].'
'; -
+ // Zeitwunsch aendern / kopieren + echo '
'; + echo '
'; + echo 'Sie können Ihren Zeitwunsch direkt in der Tabelle bearbeiten oder einen Zeitwunsch eines vergangenen Studiensemester kopieren.
+ Solange Sie keine Änderungen vornehmen, wird Ihr Zeitwunsch immer ins nächste Studiensemester übernommen.


'; -
+ // Radiobuttons aendern / kopieren + $radioChangeChecked = is_null($selected_past_ss) ? 'checked' : ''; + $radioCopyChecked = !is_null($selected_past_ss) ? 'checked' : ''; -

t('zeitwunsch/erklärung');?>:

+ echo '
'; + echo 'Zeitwunsch für '. $selected_ss. ' '; + echo ''; + echo ''; + echo '
'; - "; - echo $p->t('zeitwunsch/formularZumEintragenDerZeitsperren', array($href)); - ?> - -

t('zeitwunsch/kontrollierenSieIhreZeitwuensche');?>!

-

- - - - - - - - - - - - - - - - - - - - - - -
t('zeitwunsch/wert');?> -
t('zeitwunsch/bedeutung');?>
-
-
2
-
  t('zeitwunsch/hierMoechteIchUnterrichten');?>
-
1
-
  t('zeitwunsch/hierKannIchUnterrichten');?>
-
-1
-
  t('zeitwunsch/nurInNotfaellen');?>
-
-2
-
  t('zeitwunsch/hierAufGarKeinenFall');?>
-

t('zeitwunsch/folgendePunkteSindZuBeachten');?>:

-
    -
  1. t('zeitwunsch/verwendenSieDenWertNur');?>
  2. -
  3. t('zeitwunsch/sperrenSieNurTermine');?>
  4. -
  5. t('zeitwunsch/esSolltenFuerJedeStunde');?>
  6. -
-

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

-
-
+ echo ''; // end col-xs-12 + echo ''; // end row + + echo '
'; + + $divChangeHidden = !is_null($selected_past_ss) ? 'hidden' : ''; + $divCopyHidden = is_null($selected_past_ss) ? 'hidden' : ''; + + echo '
'; + echo '
'; + echo '' . $p->t('zeitwunsch/tragenSieInDiesesNormwochenraster') .' Klicken Sie danach auf \'Speichern\''; + echo '
'; // end col + echo '
'; + // BLANK + echo '
'; // end col + echo '
'; // end divChangeZWG + + echo '
'; + echo '
'; + echo 'Wählen Sie das gewünschte Studiensemester aus dem rechten Dropdown aus. + Der Zeitwunsch wird dann automatisch in die Tabelle übernommen.
+ Nehmen Sie gegebenenfalls Änderungen vor und klicken Sie dann auf \'Speichern\'.
'; + echo '
'; // end col + + $studiensemester = new Studiensemester(); + $tmp_ss = $selected_ss == $akt_ss->studiensemester_kurzbz ? $studiensemester->getPrevious() : $akt_ss->studiensemester_kurzbz; + $studiensemester->load($tmp_ss); + + $zwg = new Zeitwunsch_gueltigkeit(); + $zwg->getByUID($uid, 4, true, $studiensemester->ende); + $past_zwg_arr = $zwg->result; + echo '
'; + echo ''; + echo '
'; // end col + echo '
'; // end divCopyZWG + + // Speichern - Button + echo '
'; + echo ''; + echo '
'; + + echo '
'; // end row + echo '
'; + ?> + + + +
+
+ t('zeitwunsch/folgendePunkteSindZuBeachten');?>: +
    +
  • t('zeitwunsch/verwendenSieDenWertNur');?>
  • +
  • t('zeitwunsch/sperrenSieNurTermine');?>
  • +
  • t('zeitwunsch/esSolltenFuerJedeStunde');?>
  • +

+

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


+
+
+
+ + + + + + + + + + + + + + + + + + + + + + +
t('zeitwunsch/wert');?> +
t('zeitwunsch/bedeutung');?>
+
+
2
+
  t('zeitwunsch/hierMoechteIchUnterrichten');?>
+
1
+
  t('zeitwunsch/hierKannIchUnterrichten');?>
+
-1
+
  t('zeitwunsch/nurInNotfaellen');?>
+
-2
+
  t('zeitwunsch/hierAufGarKeinenFall');?>
+
+
+ + +
+
+

t('zeitsperre/zeitsperren');?>:

+ "; + echo $p->t('zeitwunsch/formularZumEintragenDerZeitsperren', array($href)); + ?> +
+
+ + + + + diff --git a/locale/de-AT/zeitwunsch.php b/locale/de-AT/zeitwunsch.php index a84da2b0e..31424f8f9 100644 --- a/locale/de-AT/zeitwunsch.php +++ b/locale/de-AT/zeitwunsch.php @@ -9,6 +9,7 @@ $this->phrasen['zeitwunsch/von']='von'; $this->phrasen['zeitwunsch/formularZumEintragenDerZeitsperren']='Das Formular zum Eintragen der Zeitsperren finden Sie %s hier'; $this->phrasen['zeitwunsch/erklärung']='Erklärung'; $this->phrasen['zeitwunsch/kontrollierenSieIhreZeitwuensche']='Bitte kontrollieren/ändern Sie Ihre Zeitwünsche und klicken Sie anschließend auf "Speichern"'; +$this->phrasen['zeitwunsch/erstellenSieIhreZeitwuensche']='Bitte erstellen / ändern Sie Ihre Zeitwünsche und klicken Sie anschließend auf "Speichern"'; $this->phrasen['zeitwunsch/wert']='Wert'; $this->phrasen['zeitwunsch/bedeutung']='Bedeutung'; $this->phrasen['zeitwunsch/hierMoechteIchUnterrichten']='Hier möchte ich unterrichten'; diff --git a/locale/en-US/zeitwunsch.php b/locale/en-US/zeitwunsch.php index dd9abdc3e..1a4a93378 100644 --- a/locale/en-US/zeitwunsch.php +++ b/locale/en-US/zeitwunsch.php @@ -9,6 +9,7 @@ $this->phrasen['zeitwunsch/von']='from'; $this->phrasen['zeitwunsch/formularZumEintragenDerZeitsperren']='The form for entering times when you are unavailable to teach can be found %s here'; $this->phrasen['zeitwunsch/erklärung']='Explanation'; $this->phrasen['zeitwunsch/kontrollierenSieIhreZeitwuensche']='Please check/change your preferred teaching times and click "Save"'; +$this->phrasen['zeitwunsch/erstellenSieIhreZeitwuensche']='Please enter / change your preferred teaching times and click "Save"'; $this->phrasen['zeitwunsch/wert']='Value'; $this->phrasen['zeitwunsch/bedeutung']='Meaning'; $this->phrasen['zeitwunsch/hierMoechteIchUnterrichten']='I would like to teach at this time'; From beb850ebe376cda8c64cc46f40acdb61a568781b Mon Sep 17 00:00:00 2001 From: Cris Date: Wed, 24 Nov 2021 09:33:25 +0100 Subject: [PATCH 008/132] Adapted Zeitwunsch zu geteilte Dienste to Bootstrap Style --- cis/private/profile/zeitwunsch.php | 56 +++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 12 deletions(-) diff --git a/cis/private/profile/zeitwunsch.php b/cis/private/profile/zeitwunsch.php index 6e1f800b4..8c28be587 100644 --- a/cis/private/profile/zeitwunsch.php +++ b/cis/private/profile/zeitwunsch.php @@ -406,46 +406,78 @@ function updateZWG($uid, $zwg_id, $bis) -

Zustimmung zur Verplanung in geteilter Arbeitszeit

+

Zustimmung zur Verplanung in geteilter Arbeitszeit

t('zeitwunsch/geteilteArbeitszeit'); + echo '

'; $gd = new zeitaufzeichnung_gd(); $gd->load($uid, $akt_ss->studiensemester_kurzbz); if ( ! $gd->uid ) { - echo '

Zustimmung für '.$akt_ss->studiensemester_kurzbz.': '; - echo 'ja'; - echo 'nein'; - echo '




'; + echo '
'; + echo '
'; + echo '
'; + echo 'Zustimmung für '.$akt_ss->studiensemester_kurzbz.': '; + echo ''; + echo ''; + echo '
'; + echo '
'; + + echo '
'; + echo '
'; + echo '
'; + + echo '
'; + echo '
'; + echo '
'; } else { $zustimmung = ($gd->selbstverwaltete_pause) ? ' erteilt' : 'abgelehnt'; - echo '

Zustimmung für '.$akt_ss->studiensemester_kurzbz.': '.$zustimmung.' am '.$datum_obj->formatDatum($gd->insertamum,'d.m.Y H:i:s').'

'; + echo '

Zustimmung für '.$akt_ss->studiensemester_kurzbz.': '.$zustimmung.' am '.$datum_obj->formatDatum($gd->insertamum,'d.m.Y H:i:s').''; } $gd = new zeitaufzeichnung_gd(); $gd->load($uid, $next_ss->studiensemester_kurzbz); if ( ! $gd->uid ) { - echo '

Zustimmung für '.$next_ss->studiensemester_kurzbz.': '; - echo 'ja'; - echo 'nein'; - echo '




'; + echo '
'; + echo '
'; + echo '
'; + echo 'Zustimmung für '.$next_ss->studiensemester_kurzbz.': '; + echo ''; + echo ''; + echo '
'; + echo '
'; + + echo '
'; + echo ''; + echo '
'; + + echo '
'; + echo '
'; + echo '
'; } else { $zustimmung = ($gd->selbstverwaltete_pause) ? ' erteilt' : 'abgelehnt'; - echo '

Zustimmung für '.$next_ss->studiensemester_kurzbz.': '.$zustimmung.' am '.$datum_obj->formatDatum($gd->insertamum,'d.m.Y H:i:s').'

'; + echo 'Zustimmung für '.$next_ss->studiensemester_kurzbz.': '.$zustimmung.' am '.$datum_obj->formatDatum($gd->insertamum,'d.m.Y H:i:s').''; } //var_dump($gd); ?>

-

From 8d3c54fafcba63d4c9f043601a15faf86d7362f7 Mon Sep 17 00:00:00 2001 From: Cris Date: Wed, 24 Nov 2021 11:48:57 +0100 Subject: [PATCH 009/132] Minor change: Removed default now() for updateamum, Changed code order ...for better maintainance --- cis/private/profile/zeitwunsch.php | 330 ++++++++++++++--------------- system/dbupdate_3.3.php | 2 +- 2 files changed, 166 insertions(+), 166 deletions(-) diff --git a/cis/private/profile/zeitwunsch.php b/cis/private/profile/zeitwunsch.php index 8c28be587..5da272e9f 100644 --- a/cis/private/profile/zeitwunsch.php +++ b/cis/private/profile/zeitwunsch.php @@ -72,171 +72,6 @@ if(! $result_stunde=$db->db_query('SELECT * FROM lehre.tbl_stunde ORDER BY stund die($db->db_last_error()); $num_rows_stunde=$db->db_num_rows($result_stunde); -// Zeitwuensche speichern -if (isset($_GET['type']) && $_GET['type'] == 'save') -{ - // Letzte Zeitwunschgueltigkeit (ZWG) holen - $zwg = new Zeitwunsch_gueltigkeit(); - $zwg->getByUID($uid, 1); - $lastZwg = !empty($zwg->result) ? $zwg->result[0] : null; - - // Check, ob letzte ZWG im nächsten Studiensemester startet. D.h. es existiert ein neuer Zeitwunsch in der Zukunft - $lastZwgStartsNextSemester = (!is_null($lastZwg) && $lastZwg->von >= $next_ss->start) ? true : false; - $zw_zwg_id = null; // ZWG ID, die zum Speichern / Updaten des Zeitwunsches uebergeben wird - - // Wenn allererster Zeitwunsch, also noch keine ZWG vorhanden - if (is_null($lastZwg)) - { - // Wenn ZW fuer naechstes Studiensemester ist - if ($selected_ss == $next_ss->studiensemester_kurzbz) - { - // Neue ZWG setzen: von = Start nächstes Studiensemester, bis offen lassen - $zw_zwg_id = insertZWG($uid, $next_ss->start, null); - } - - // Wenn Zeitwunsch fuer aktuelles Studiensemester ist - if ($selected_ss == $akt_ss->studiensemester_kurzbz) - { - // Neue ZWG setzen: von = now(), bis offen lassen - $zw_zwg_id = insertZWG($uid, (new DateTime())->format('Y-m-d H:i:s'), null); - } - } - - // Wenn mindestens eine ZWG vorhanden - if (!is_null($lastZwg)) - { - // Wenn Zeitwunsch fuer naechstes Studiensemester ist - if ($selected_ss == $next_ss->studiensemester_kurzbz) - { - // Wenn naechstes Studiensemester schon eine eigene ZWG hat - if ($lastZwgStartsNextSemester) - { - // Nur Zeitwunsch dieser ZWG updaten - $zw_zwg_id = $lastZwg->zeitwunsch_gueltigkeit_id; - } - - // Wenn naechstes Studiensemester keine eigene ZWG hat - if (!$lastZwgStartsNextSemester) - { - // Fuer bisher letzte ZWG ein Endedatum setzen: bis = Ende aktuelles Studiensemester - updateZWG($uid, $lastZwg->zeitwunsch_gueltigkeit_id, $akt_ss->ende); - - // Neue ZWG setzen: von = Start nächstes Studiensemester, bis offen lassen - $zw_zwg_id = insertZWG($uid, $next_ss->start, null); - } - } - - // Wenn Zeitwunsch fuer aktuelles Studiensemester ist - if ($selected_ss == $akt_ss->studiensemester_kurzbz) - { - /** - * Check, ob aktuelles Studiensemester eine ZWG hat. - * Wenn die allererste ZWG fuer das naechste Studiensemester erstellt wurde, dann hat das - * aktuelle Studiensemester noch keine ZWG. - * */ - $zwg = new Zeitwunsch_gueltigkeit(); - $zwg->getByStudiensemester($uid, $akt_ss->studiensemester_kurzbz); - $akt_ss_zwg = !empty($zwg->result) ? $zwg->result[0] : null; - - // Keine ZWG fuer aktuelles Studiensemester vorhanden. - // Da eine ZWG ID aber schon vorhanden: USER HAT ERSTMALIG MIT NAECHSTEM STUDIENSEMESTER EINTRAG BEGONNEN - if (is_null($akt_ss_zwg)) - { - // Neue ZWG setzen: von = now(), ende = Ende aktuelles Studiensemester - $zw_zwg_id = insertZWG($uid, (new DateTime())->format('Y-m-d H:i:s'), $akt_ss->ende); - } - - // ZWG für aktuelles Studiensemester ist vorhanden --> SPLIT AKTUELLE STUDIENSEMESTER - if ((!is_null($akt_ss_zwg))) - { - // Wenn am selben Tag schon neue ZWG gespeichert wurde, keine neue ZWG anlegen, sondern diese nur updaten - // Verhindert mehrfache Eintraege, wenn oefters zwischengespeichert wird. - if ((new DateTime($akt_ss_zwg->insertamum))->format('Y-m-d') == (new Datetime())->format('Y-m-d')) - { - updateZWG($uid, $akt_ss_zwg->zeitwunsch_gueltigkeit_id, $akt_ss_zwg->bis); - - $zw_zwg_id = $akt_ss_zwg->zeitwunsch_gueltigkeit_id; - } - else - { - // Neue ZWG setzen: von = now(), bis = Bis von ZWG des aktuellen Studiensemesters uebernehmen: - // -> bis ist entweder Ende aktuelles Studiensemester (wenn ZWG für nächstes Studiensemester vorhanden ist) - // -> sonst ist bis null - $zw_zwg_id = insertZWG($uid, (new DateTime())->format('Y-m-d H:i:s'), $akt_ss_zwg->bis); - - // Fuer bisher letzte ZWG das Endedatum auf heute setzen: bis = now() - // NOTE: MUSS nach dem insert sein - updateZWG($uid, $akt_ss_zwg->zeitwunsch_gueltigkeit_id, (new DateTime())->format('Y-m-d H:i:s')); - } - } - } - } - - // Insert Zeitwunsch mit Zeitwunsch ZWG ID - if (is_numeric($zw_zwg_id)) - { - $zw = new zeitwunsch(); - - for ($t=1;$t<7;$t++) - { - for ($i=0;$i<$num_rows_stunde;$i++) - { - $var='wunsch'.$t.'_'.$i; - if(!isset($_POST[$var])) - continue; - $gewicht=$_POST[$var]; - $stunde=$i+1; - - $zw->mitarbeiter_uid = $uid; - $zw->stunde = $stunde; - $zw->tag = $t; - $zw->gewicht = $gewicht; - $zw->updateamum = date('Y-m-d H:i:s'); - $zw->updatevon = $uid; - $zw->zeitwunsch_gueltigkeit_id = $zw_zwg_id; - - if (!$zw->exists($uid, $zw_zwg_id, $stunde, $t)) - { - $zw->new = true; - $zw->insertamum = date('Y-m-d H:i:s'); - $zw->insertvon = $uid; - } - else - { - $zw->new = false; - } - - if(!$zw->save()) - echo $zw->errormsg; - } - } - } -} - -/** - * Zeitwunschgueltigkeit fuer Tabelle holen. - * Der Zeitwunsch wird anhand der Zeitwunschgueltigkeit (ZWG) des gewaehlten Studiensemesters ermittelt. - * Das Studiensemester wird, je nach Vorhandensein, in dieser Reihenfolge herangezogen: - * 1. Wenn in Dropdown ausgewaehlt: Vergangenes Studiensemester (zum Kopieren von Zeitwunsch) - * 2. Wenn in Dropdown ausgewaehlt: Aktuelles Studiensemester - * 3: Default: Nächstes Studiensemesters - */ -$zwg = new zeitwunsch_gueltigkeit(); -$tmp_ss = is_null($selected_past_ss) ? $selected_ss : $selected_past_ss; -$zwg->getByStudiensemester($uid, $tmp_ss); -$zwg_id = !empty($zwg->result[0]) ? $zwg->result[0]->zeitwunsch_gueltigkeit_id : null; //null, wenn noch kein ZW - -/** - * Zeitwunsch fuer Tabelle holen - * Wenn noch kein Zeitwunsch vorhanden, bleibt die Zeitwunsch Instanz leer - * */ -$zw = new zeitwunsch(); -if (!$zw->loadByZWG($uid, $zwg_id)) -{ - die($zw->errormsg); -} -$wunsch = $zw->zeitwunsch; - // Personendaten $person = new benutzer(); if(!$person->load($uid)) @@ -287,6 +122,171 @@ if (isset($_GET['selbstverwaltete-pause']) && !empty($_GET['submit'])) } +// Zeitwuensche speichern +if (isset($_GET['type']) && $_GET['type'] == 'save') +{ + // Letzte Zeitwunschgueltigkeit (ZWG) holen + $zwg = new Zeitwunsch_gueltigkeit(); + $zwg->getByUID($uid, 1); + $lastZwg = !empty($zwg->result) ? $zwg->result[0] : null; + + // Check, ob letzte ZWG im nächsten Studiensemester startet. D.h. es existiert ein neuer Zeitwunsch in der Zukunft + $lastZwgStartsNextSemester = (!is_null($lastZwg) && $lastZwg->von >= $next_ss->start) ? true : false; + $zw_zwg_id = null; // ZWG ID, die zum Speichern / Updaten des Zeitwunsches uebergeben wird + + // Wenn allererster Zeitwunsch, also noch keine ZWG vorhanden + if (is_null($lastZwg)) + { + // Wenn ZW fuer naechstes Studiensemester ist + if ($selected_ss == $next_ss->studiensemester_kurzbz) + { + // Neue ZWG setzen: von = Start nächstes Studiensemester, bis offen lassen + $zw_zwg_id = insertZWG($uid, $next_ss->start, null); + } + + // Wenn Zeitwunsch fuer aktuelles Studiensemester ist + if ($selected_ss == $akt_ss->studiensemester_kurzbz) + { + // Neue ZWG setzen: von = now(), bis offen lassen + $zw_zwg_id = insertZWG($uid, (new DateTime())->format('Y-m-d H:i:s'), null); + } + } + + // Wenn mindestens eine ZWG vorhanden + if (!is_null($lastZwg)) + { + // Wenn Zeitwunsch fuer naechstes Studiensemester ist + if ($selected_ss == $next_ss->studiensemester_kurzbz) + { + // Wenn naechstes Studiensemester schon eine eigene ZWG hat + if ($lastZwgStartsNextSemester) + { + // Nur Zeitwunsch dieser ZWG updaten + $zw_zwg_id = $lastZwg->zeitwunsch_gueltigkeit_id; + } + + // Wenn naechstes Studiensemester keine eigene ZWG hat + if (!$lastZwgStartsNextSemester) + { + // Fuer bisher letzte ZWG ein Endedatum setzen: bis = Ende aktuelles Studiensemester + updateZWG($uid, $lastZwg->zeitwunsch_gueltigkeit_id, $akt_ss->ende); + + // Neue ZWG setzen: von = Start nächstes Studiensemester, bis offen lassen + $zw_zwg_id = insertZWG($uid, $next_ss->start, null); + } + } + + // Wenn Zeitwunsch fuer aktuelles Studiensemester ist + if ($selected_ss == $akt_ss->studiensemester_kurzbz) + { + /** + * Check, ob aktuelles Studiensemester eine ZWG hat. + * Wenn die allererste ZWG fuer das naechste Studiensemester erstellt wurde, dann hat das + * aktuelle Studiensemester noch keine ZWG. + * */ + $zwg = new Zeitwunsch_gueltigkeit(); + $zwg->getByStudiensemester($uid, $akt_ss->studiensemester_kurzbz); + $akt_ss_zwg = !empty($zwg->result) ? $zwg->result[0] : null; + + // Keine ZWG fuer aktuelles Studiensemester vorhanden. + // Da eine ZWG ID aber schon vorhanden: USER HAT ERSTMALIG MIT NAECHSTEM STUDIENSEMESTER EINTRAG BEGONNEN + if (is_null($akt_ss_zwg)) + { + // Neue ZWG setzen: von = now(), ende = Ende aktuelles Studiensemester + $zw_zwg_id = insertZWG($uid, (new DateTime())->format('Y-m-d H:i:s'), $akt_ss->ende); + } + + // ZWG für aktuelles Studiensemester ist vorhanden --> SPLIT AKTUELLE STUDIENSEMESTER + if ((!is_null($akt_ss_zwg))) + { + // Wenn am selben Tag schon neue ZWG gespeichert wurde, keine neue ZWG anlegen, sondern diese nur updaten + // Verhindert mehrfache Eintraege, wenn oefters zwischengespeichert wird. + if ((new DateTime($akt_ss_zwg->insertamum))->format('Y-m-d') == (new Datetime())->format('Y-m-d')) + { + updateZWG($uid, $akt_ss_zwg->zeitwunsch_gueltigkeit_id, $akt_ss_zwg->bis); + + $zw_zwg_id = $akt_ss_zwg->zeitwunsch_gueltigkeit_id; + } + else + { + // Neue ZWG setzen: von = now(), bis = Bis von ZWG des aktuellen Studiensemesters uebernehmen: + // -> bis ist entweder Ende aktuelles Studiensemester (wenn ZWG für nächstes Studiensemester vorhanden ist) + // -> sonst ist bis null + $zw_zwg_id = insertZWG($uid, (new DateTime())->format('Y-m-d H:i:s'), $akt_ss_zwg->bis); + + // Fuer bisher letzte ZWG das Endedatum auf heute setzen: bis = now() + // NOTE: MUSS nach dem insert sein + updateZWG($uid, $akt_ss_zwg->zeitwunsch_gueltigkeit_id, (new DateTime())->format('Y-m-d H:i:s')); + } + } + } + } + + // Insert Zeitwunsch mit Zeitwunsch ZWG ID + if (is_numeric($zw_zwg_id)) + { + $zw = new zeitwunsch(); + + for ($t=1;$t<7;$t++) + { + for ($i=0;$i<$num_rows_stunde;$i++) + { + $var='wunsch'.$t.'_'.$i; + if(!isset($_POST[$var])) + continue; + $gewicht=$_POST[$var]; + $stunde=$i+1; + + $zw->mitarbeiter_uid = $uid; + $zw->stunde = $stunde; + $zw->tag = $t; + $zw->gewicht = $gewicht; + $zw->updateamum = date('Y-m-d H:i:s'); + $zw->updatevon = $uid; + $zw->zeitwunsch_gueltigkeit_id = $zw_zwg_id; + + if (!$zw->exists($uid, $zw_zwg_id, $stunde, $t)) + { + $zw->new = true; + $zw->insertamum = date('Y-m-d H:i:s'); + $zw->insertvon = $uid; + } + else + { + $zw->new = false; + } + + if(!$zw->save()) + echo $zw->errormsg; + } + } + } +} + +/** + * Zeitwunschgueltigkeit fuer Tabelle holen. + * Der Zeitwunsch wird anhand der Zeitwunschgueltigkeit (ZWG) des gewaehlten Studiensemesters ermittelt. + * Das Studiensemester wird, je nach Vorhandensein, in dieser Reihenfolge herangezogen: + * 1. Wenn in Dropdown ausgewaehlt: Vergangenes Studiensemester (zum Kopieren von Zeitwunsch) + * 2. Wenn in Dropdown ausgewaehlt: Aktuelles Studiensemester + * 3: Default: Nächstes Studiensemesters + */ +$zwg = new zeitwunsch_gueltigkeit(); +$tmp_ss = is_null($selected_past_ss) ? $selected_ss : $selected_past_ss; +$zwg->getByStudiensemester($uid, $tmp_ss); +$zwg_id = !empty($zwg->result[0]) ? $zwg->result[0]->zeitwunsch_gueltigkeit_id : null; //null, wenn noch kein ZW + +/** + * Zeitwunsch fuer Tabelle holen + * Wenn noch kein Zeitwunsch vorhanden, bleibt die Zeitwunsch Instanz leer + * */ +$zw = new zeitwunsch(); +if (!$zw->loadByZWG($uid, $zwg_id)) +{ + die($zw->errormsg); +} +$wunsch = $zw->zeitwunsch; + /** * Init ZWG Objekt zum Erstellen einer neuen ZWG */ diff --git a/system/dbupdate_3.3.php b/system/dbupdate_3.3.php index 192755a23..eb9da9605 100644 --- a/system/dbupdate_3.3.php +++ b/system/dbupdate_3.3.php @@ -5519,7 +5519,7 @@ if(!$result = @$db->db_query("SELECT 1 FROM campus.tbl_zeitwunsch_gueltigkeit LI bis DATE, insertamum TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(), insertvon CHARACTER VARYING(32), - updateamum TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(), + updateamum TIMESTAMP WITHOUT TIME ZONE, updatevon CHARACTER VARYING(32) ); From bd71650ac5b4b5821228d139ae11e40eed81478e Mon Sep 17 00:00:00 2001 From: Cris Date: Wed, 24 Nov 2021 16:26:22 +0100 Subject: [PATCH 010/132] Colored Legende for Zeitwunsch-Tabelle --- cis/private/profile/zeitwunsch.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cis/private/profile/zeitwunsch.php b/cis/private/profile/zeitwunsch.php index 5da272e9f..8f65bfbcb 100644 --- a/cis/private/profile/zeitwunsch.php +++ b/cis/private/profile/zeitwunsch.php @@ -627,13 +627,13 @@ function updateZWG($uid, $zwg_id, $bis) - +
2
  t('zeitwunsch/hierMoechteIchUnterrichten');?> - +
1
  t('zeitwunsch/hierKannIchUnterrichten');?> @@ -645,13 +645,13 @@ function updateZWG($uid, $zwg_id, $bis) keine Bedeutung --> - +
-1
  t('zeitwunsch/nurInNotfaellen');?> - +
-2
  t('zeitwunsch/hierAufGarKeinenFall');?> From 6db2748163859b93c032ca003b3953e6ec2e28ad Mon Sep 17 00:00:00 2001 From: Cris Date: Wed, 24 Nov 2021 17:47:01 +0100 Subject: [PATCH 011/132] Added Zeitwunsch Edit lock of if LV had already been assigned - Message is shown and form buttons for changing / copying Zeitwunsch are disabled if LV had already been assigned to lector. - Lector can unlock by clicking on link. --- cis/private/profile/zeitwunsch.php | 81 ++++++++++++++++++++++++++---- 1 file changed, 72 insertions(+), 9 deletions(-) diff --git a/cis/private/profile/zeitwunsch.php b/cis/private/profile/zeitwunsch.php index 8f65bfbcb..c4def2671 100644 --- a/cis/private/profile/zeitwunsch.php +++ b/cis/private/profile/zeitwunsch.php @@ -35,6 +35,7 @@ require_once('../../../include/studiensemester.class.php'); require_once('../../../include/zeitaufzeichnung_gd.class.php'); require_once('../../../include/benutzer.class.php'); require_once('../../../include/mitarbeiter.class.php'); +require_once('../../../include/lehrveranstaltung.class.php'); require_once('../../../include/phrasen.class.php'); require_once('../../../include/sprache.class.php'); @@ -80,6 +81,9 @@ if(!$person->load($uid)) $ma = new mitarbeiter($uid); $fixangestellt = $ma->fixangestellt; +// Check, ob Lektor bereits zugewiesene LVs hat +$isAssignedToLv = checkIsAssigendToLV($uid, $selected_ss); // boolean + // Erklärung zu Pausen bei geteilten Arbeitszeiten speichern if (isset($_GET['selbstverwaltete-pause-akt']) && !empty($_GET['submit-akt'])) { @@ -261,6 +265,10 @@ if (isset($_GET['type']) && $_GET['type'] == 'save') } } } + + // Wenn speichern möglich ist, dann hat der Lektor entweder keine LVs zugeteilt oder hat aktiv die Bearbeitungssperre + // deaktiviert. Bearbeitungssperre wird gesetzt, wenn isAssignedToLv true ist. Deshalb hier mit false überschreiben. + $isAssignedToLv = false; } /** @@ -328,6 +336,23 @@ function updateZWG($uid, $zwg_id, $bis) return; } +/** + * Check, ob Lektor bereits zugewiesene LVs hat + * @param $uid + * @param $studiensemester_kurzbz + * @return bool|void + */ +function checkIsAssigendToLV($uid, $studiensemester_kurzbz) +{ + $lv = new Lehrveranstaltung(); + if (!$lv->getLVByMitarbeiter($uid, $studiensemester_kurzbz)) + { + die($lv->errormsg); + } + + return empty($lv->lehrveranstaltungen) ? false : true; +} + ?> @@ -365,6 +390,22 @@ function updateZWG($uid, $zwg_id, $bis) } $(function() { + // Bearbeitung deaktivieren, wenn Lektor zugewiesene LV im Studiensemester hat + const isAssignedToLv = $('input[name=isAssigendToLv]').val(); + if (isAssignedToLv == 'true') + { + $('input[name=radioZWG]').attr("disabled", true); + $('input[name=submit]').attr("disabled", true); + } + + // Bearbeitung aktivieren, wenn Lektor Aktivierungslink klickt + $('#bearbeitung-aktivieren').click(function(){ + $('input[name=radioZWG]').attr("disabled", false); + $('input[name=submit]').attr("disabled", false); + + $('#divChangeZWG').removeClass('hidden'); + $('#divIsAssignedToLv').addClass('hidden'); + }); // Bei Wechsel von Studiensemester die Seite mit GET params neu laden $('#stsem').change(function(){ @@ -488,6 +529,7 @@ function updateZWG($uid, $zwg_id, $bis) // FORM Begin echo '
'; echo ''; + echo ''; // Mein Zeitwunsch-Semesterplan Dropdown, Default = naechstes Studiensemester $next_ss_selected = $next_ss->studiensemester_kurzbz == $selected_ss ? 'selected' : ''; @@ -537,7 +579,8 @@ function updateZWG($uid, $zwg_id, $bis) echo '
'; echo '
'; echo 'Sie können Ihren Zeitwunsch direkt in der Tabelle bearbeiten oder einen Zeitwunsch eines vergangenen Studiensemester kopieren.
- Solange Sie keine Änderungen vornehmen, wird Ihr Zeitwunsch immer ins nächste Studiensemester übernommen.


'; + Solange Sie keine Änderungen vornehmen, wird Ihr Zeitwunsch immer ins nächste Studiensemester übernommen.
'; + echo '
'; // Radiobuttons aendern / kopieren $radioChangeChecked = is_null($selected_past_ss) ? 'checked' : ''; @@ -549,8 +592,12 @@ function updateZWG($uid, $zwg_id, $bis) echo ' ändern'; echo ''; echo ''; + if ($isAssignedToLv) + { + echo 'LV bereits zugeteilt'; + } echo '
'; echo '
'; // end col-xs-12 @@ -558,10 +605,11 @@ function updateZWG($uid, $zwg_id, $bis) echo '
'; - $divChangeHidden = !is_null($selected_past_ss) ? 'hidden' : ''; - $divCopyHidden = is_null($selected_past_ss) ? 'hidden' : ''; + $divChangeHidden = !is_null($selected_past_ss) || $isAssignedToLv ? 'hidden' : ''; + $divCopyHidden = is_null($selected_past_ss) || $isAssignedToLv ? 'hidden' : ''; + $divIsAssignedToLVHidden = $isAssignedToLv ? '' : 'hidden'; - echo '
'; + echo '
'; echo '
'; echo '' . $p->t('zeitwunsch/tragenSieInDiesesNormwochenraster') .' Klicken Sie danach auf \'Speichern\''; echo '
'; // end col @@ -571,10 +619,10 @@ function updateZWG($uid, $zwg_id, $bis) echo '
'; // end divChangeZWG echo '
'; - echo '
'; - echo 'Wählen Sie das gewünschte Studiensemester aus dem rechten Dropdown aus. + echo '
'; + echo 'Wählen Sie rechts das gewünschte Studiensemester aus. Der Zeitwunsch wird dann automatisch in die Tabelle übernommen.
- Nehmen Sie gegebenenfalls Änderungen vor und klicken Sie dann auf \'Speichern\'.
'; + Nehmen Sie gegebenenfalls Änderungen vor und klicken danach auf \'Speichern\'.'; echo '
'; // end col $studiensemester = new Studiensemester(); @@ -584,7 +632,7 @@ function updateZWG($uid, $zwg_id, $bis) $zwg = new Zeitwunsch_gueltigkeit(); $zwg->getByUID($uid, 4, true, $studiensemester->ende); $past_zwg_arr = $zwg->result; - echo '
'; + echo '
'; echo ''; From aa183a0a0812acd9ab844d7859199b105a0308b8 Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 25 Nov 2021 10:56:50 +0100 Subject: [PATCH 012/132] Added 'Alle Werte auf 1 setzen' and 'Aenderungen zuruecknehmen' --- cis/private/profile/zeitwunsch.php | 31 +++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/cis/private/profile/zeitwunsch.php b/cis/private/profile/zeitwunsch.php index c4def2671..9bd56bad9 100644 --- a/cis/private/profile/zeitwunsch.php +++ b/cis/private/profile/zeitwunsch.php @@ -435,6 +435,21 @@ function checkIsAssigendToLV($uid, $studiensemester_kurzbz) window.location = '?stsem='+ stsem + '&pastStsem=' + pastStsem; }); + + // Alle Werte ind Zeitwunschtabelle auf 1 setzen + $('#empty-table').click(function(){ + $('#table-zeitwunsch tr td input').each(function() { + $(this) + .val(1) + .parent().css('background-color', '#CCFFCC'); + }); + }) + + // Aenderungen in Zeitwunschtabelle zurücknehmen -> Seite neu laden + $('#reload-table').click(function(){ + let studiensemester = $('option:selected', '#stsem').val(); + window.location = '?stsem=' + studiensemester; + }) }); @@ -543,7 +558,7 @@ function checkIsAssigendToLV($uid, $studiensemester_kurzbz) echo '
'; // Tabelle Zeitwunsch-Semesterplan - echo ''; + echo '
'; // Tabelle Kopfzeile echo ''; echo ''; @@ -581,7 +596,12 @@ function checkIsAssigendToLV($uid, $studiensemester_kurzbz) echo 'Sie können Ihren Zeitwunsch direkt in der Tabelle bearbeiten oder einen Zeitwunsch eines vergangenen Studiensemester kopieren.
Solange Sie keine Änderungen vornehmen, wird Ihr Zeitwunsch immer ins nächste Studiensemester übernommen.

'; echo '
'; + echo ''; // end col-xs-12 + echo ''; // end row + echo '
'; + + echo '
'; // Radiobuttons aendern / kopieren $radioChangeChecked = is_null($selected_past_ss) ? 'checked' : ''; $radioCopyChecked = !is_null($selected_past_ss) ? 'checked' : ''; @@ -599,11 +619,12 @@ function checkIsAssigendToLV($uid, $studiensemester_kurzbz) echo 'LV bereits zugeteilt'; } echo '
'; + echo '
'; // end col-xs-9 - echo ''; // end col-xs-12 - echo ''; // end row - - echo '
'; + echo '
'; + echo 'Alle Werte auf 1 setzen
'; + echo 'Änderungen zurücknehmen

'; + echo '
'; // end col-xs-3 $divChangeHidden = !is_null($selected_past_ss) || $isAssignedToLv ? 'hidden' : ''; $divCopyHidden = is_null($selected_past_ss) || $isAssignedToLv ? 'hidden' : ''; From 2e9bfc049b51582d9015942b8ddc2f46e4c6895c Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 25 Nov 2021 14:33:23 +0100 Subject: [PATCH 013/132] Corrected: Now retrieving correct data for 'isVerplant' . Correction in function isVerplant() . Also changed var name to isVerplant --- cis/private/profile/zeitwunsch.php | 37 +++++++++++++++--------------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/cis/private/profile/zeitwunsch.php b/cis/private/profile/zeitwunsch.php index 9bd56bad9..84807927c 100644 --- a/cis/private/profile/zeitwunsch.php +++ b/cis/private/profile/zeitwunsch.php @@ -36,6 +36,7 @@ require_once('../../../include/zeitaufzeichnung_gd.class.php'); require_once('../../../include/benutzer.class.php'); require_once('../../../include/mitarbeiter.class.php'); require_once('../../../include/lehrveranstaltung.class.php'); +require_once('../../../include/lehrstunde.class.php'); require_once('../../../include/phrasen.class.php'); require_once('../../../include/sprache.class.php'); @@ -82,7 +83,7 @@ $ma = new mitarbeiter($uid); $fixangestellt = $ma->fixangestellt; // Check, ob Lektor bereits zugewiesene LVs hat -$isAssignedToLv = checkIsAssigendToLV($uid, $selected_ss); // boolean +$isVerplant = checkIsVerplant($uid, $selected_ss); // boolean // Erklärung zu Pausen bei geteilten Arbeitszeiten speichern if (isset($_GET['selbstverwaltete-pause-akt']) && !empty($_GET['submit-akt'])) @@ -267,8 +268,8 @@ if (isset($_GET['type']) && $_GET['type'] == 'save') } // Wenn speichern möglich ist, dann hat der Lektor entweder keine LVs zugeteilt oder hat aktiv die Bearbeitungssperre - // deaktiviert. Bearbeitungssperre wird gesetzt, wenn isAssignedToLv true ist. Deshalb hier mit false überschreiben. - $isAssignedToLv = false; + // deaktiviert. Bearbeitungssperre wird gesetzt, wenn isVerplant true ist. Deshalb hier mit false überschreiben. + $isVerplant = false; } /** @@ -342,15 +343,15 @@ function updateZWG($uid, $zwg_id, $bis) * @param $studiensemester_kurzbz * @return bool|void */ -function checkIsAssigendToLV($uid, $studiensemester_kurzbz) +function checkIsVerplant($uid, $studiensemester_kurzbz) { - $lv = new Lehrveranstaltung(); - if (!$lv->getLVByMitarbeiter($uid, $studiensemester_kurzbz)) + $lstd = new Lehrstunde(); + if (!$lstd->getStundenplanData('stundenplandev', null, $studiensemester_kurzbz, null, $uid)) { - die($lv->errormsg); + die($lstd->errormsg); } - return empty($lv->lehrveranstaltungen) ? false : true; + return empty($lstd->result) ? false : true; } @@ -391,8 +392,8 @@ function checkIsAssigendToLV($uid, $studiensemester_kurzbz) $(function() { // Bearbeitung deaktivieren, wenn Lektor zugewiesene LV im Studiensemester hat - const isAssignedToLv = $('input[name=isAssigendToLv]').val(); - if (isAssignedToLv == 'true') + const isVerplant = $('input[name=isVerplant]').val(); + if (isVerplant == 'true') { $('input[name=radioZWG]').attr("disabled", true); $('input[name=submit]').attr("disabled", true); @@ -404,7 +405,7 @@ function checkIsAssigendToLV($uid, $studiensemester_kurzbz) $('input[name=submit]').attr("disabled", false); $('#divChangeZWG').removeClass('hidden'); - $('#divIsAssignedToLv').addClass('hidden'); + $('#divIsVerplant').addClass('hidden'); }); // Bei Wechsel von Studiensemester die Seite mit GET params neu laden @@ -544,7 +545,7 @@ function checkIsAssigendToLV($uid, $studiensemester_kurzbz) // FORM Begin echo ''; echo ''; - echo ''; + echo ''; // Mein Zeitwunsch-Semesterplan Dropdown, Default = naechstes Studiensemester $next_ss_selected = $next_ss->studiensemester_kurzbz == $selected_ss ? 'selected' : ''; @@ -614,7 +615,7 @@ function checkIsAssigendToLV($uid, $studiensemester_kurzbz) echo ''; - if ($isAssignedToLv) + if ($isVerplant) { echo 'LV bereits zugeteilt'; } @@ -626,9 +627,9 @@ function checkIsAssigendToLV($uid, $studiensemester_kurzbz) echo 'Änderungen zurücknehmen

'; echo '
'; // end col-xs-3 - $divChangeHidden = !is_null($selected_past_ss) || $isAssignedToLv ? 'hidden' : ''; - $divCopyHidden = is_null($selected_past_ss) || $isAssignedToLv ? 'hidden' : ''; - $divIsAssignedToLVHidden = $isAssignedToLv ? '' : 'hidden'; + $divChangeHidden = !is_null($selected_past_ss) || $isVerplant ? 'hidden' : ''; + $divCopyHidden = is_null($selected_past_ss) || $isVerplant ? 'hidden' : ''; + $divIsVerplantHidden = $isVerplant ? '' : 'hidden'; echo '
'; echo '
'; @@ -665,7 +666,7 @@ function checkIsAssigendToLV($uid, $studiensemester_kurzbz) echo '
'; // end col echo '
'; // end divCopyZWG - echo '
'; + echo '
'; echo '
'; echo '
'; echo '
'; @@ -678,7 +679,7 @@ function checkIsAssigendToLV($uid, $studiensemester_kurzbz) echo '
'; // end panel heading echo '
'; // end panel echo '
'; // end col - echo '
'; // end divIsAssignedToLV + echo '
'; // end divIsVerplant // Speichern - Button echo '
'; From ef675226e4bedd9f280a9c673bf42fcd1b4d7f7b Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 25 Nov 2021 14:36:03 +0100 Subject: [PATCH 014/132] Corrected: Now Lehrstunde Class has property 'result' . Errormessages were thrown without result property. Fixed now. . Also added errormsg, when getStundenplanData query fails. --- include/lehrstunde.class.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/include/lehrstunde.class.php b/include/lehrstunde.class.php index 71dbf3319..84cd615ed 100644 --- a/include/lehrstunde.class.php +++ b/include/lehrstunde.class.php @@ -34,6 +34,8 @@ require_once(dirname(__FILE__).'/variable.class.php'); class lehrstunde extends basis_db { + public $result = array(); + public $stundenplan_id; /// @brief ID in der Datenbank public $lehreinheit_id; /// @brief id der Lehreinheit in der DB public $unr; // @brief Unterrichtsnummer @@ -1136,7 +1138,10 @@ class lehrstunde extends basis_db return true; } else + { + $this->errormsg = 'Fehler beim Einholen der Stundenplandaten'; return false; + } } } From eb923cab9bec572539d14cd0d3c6e89d34fa434c Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 29 Nov 2021 11:31:03 +0100 Subject: [PATCH 015/132] Changed: Now using textphrases --- cis/private/profile/zeitwunsch.php | 33 +++++++++++++----------------- locale/de-AT/global.php | 1 + locale/de-AT/lvplan.php | 1 + locale/de-AT/zeitwunsch.php | 18 +++++++++++++++- locale/en-US/global.php | 1 + locale/en-US/lvplan.php | 1 + locale/en-US/zeitwunsch.php | 18 +++++++++++++++- 7 files changed, 52 insertions(+), 21 deletions(-) diff --git a/cis/private/profile/zeitwunsch.php b/cis/private/profile/zeitwunsch.php index 84807927c..8f7bca8c4 100644 --- a/cis/private/profile/zeitwunsch.php +++ b/cis/private/profile/zeitwunsch.php @@ -551,7 +551,7 @@ function checkIsVerplant($uid, $studiensemester_kurzbz) $next_ss_selected = $next_ss->studiensemester_kurzbz == $selected_ss ? 'selected' : ''; $akt_ss_selected = $akt_ss->studiensemester_kurzbz == $selected_ss ? 'selected' : ''; - echo '

Mein Zeitwunsch gültig im: '; + echo '

'. $p->t('zeitwunsch/gueltigIm'); echo ' ändern'; + echo ' '. $p->t('zeitwunsch/kopieren'). ''; echo ''; echo ''; if ($isVerplant) { - echo 'LV bereits zugeteilt'; + echo ''.$p->t('zeitwunsch/stundenBereitsVerplant', array($selected_ss)). ''; } echo '

'; echo ''; // end col-xs-9 echo ''; // end col-xs-3 $divChangeHidden = !is_null($selected_past_ss) || $isVerplant ? 'hidden' : ''; @@ -633,7 +632,7 @@ function checkIsVerplant($uid, $studiensemester_kurzbz) echo '
'; echo '
'; - echo '' . $p->t('zeitwunsch/tragenSieInDiesesNormwochenraster') .' Klicken Sie danach auf \'Speichern\''; + echo '' . $p->t('zeitwunsch/tragenSieInDiesesNormwochenraster') .''; echo '
'; // end col echo '
'; // BLANK @@ -642,9 +641,7 @@ function checkIsVerplant($uid, $studiensemester_kurzbz) echo '
'; echo '
'; - echo 'Wählen Sie rechts das gewünschte Studiensemester aus. - Der Zeitwunsch wird dann automatisch in die Tabelle übernommen.
- Nehmen Sie gegebenenfalls Änderungen vor und klicken danach auf \'Speichern\'.
'; + echo '' . $p->t('zeitwunsch/kopierenText') .''; echo '
'; // end col $studiensemester = new Studiensemester(); @@ -670,12 +667,10 @@ function checkIsVerplant($uid, $studiensemester_kurzbz) echo '
'; echo '
'; echo '
'; - echo 'Bearbeitung deaktiviert: '; - echo 'Ihnen wurden im '. $selected_ss. ' bereits Lehrveranstaltung(en) zugeteilt.
- Bitte stimmen Sie sich vor einer Änderung mit der '. $p->t('lvplan/lvKoordinationsstelle'). ' ab.
- Möchten Sie mit der Bearbeitung fortsetzen? Hier Bearbeitung aktivieren + echo ''. $p->t("zeitwunsch/bearbeitungDeaktiviert"). ': '; + echo ''. $p->t("zeitwunsch/bearbeitungDeaktiviertText", array($selected_ss, MAIL_LVPLAN, $p->t('lvplan/lvPlanung'))). ' + '. $p->t("zeitwunsch/bearbeitungAktivieren"). ' '; - echo '
'; // end panel heading echo '
'; // end panel echo '
'; // end col @@ -700,7 +695,7 @@ function checkIsVerplant($uid, $studiensemester_kurzbz)
  • t('zeitwunsch/sperrenSieNurTermine');?>
  • t('zeitwunsch/esSolltenFuerJedeStunde');?>

  • -

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


    +

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



    diff --git a/locale/de-AT/global.php b/locale/de-AT/global.php index 586614ece..7104a83a5 100644 --- a/locale/de-AT/global.php +++ b/locale/de-AT/global.php @@ -66,6 +66,7 @@ $this->phrasen['global/pdfExport']='PDF Export'; $this->phrasen['global/und']='und'; $this->phrasen['global/oder']='oder'; $this->phrasen['global/faelligAm']='Fällig am'; +$this->phrasen['global/aenderungenZuruecksetzen']= "Änderungen zurücksetzen"; $this->phrasen['global/username']='Username'; $this->phrasen['global/vorname']='Vorname'; diff --git a/locale/de-AT/lvplan.php b/locale/de-AT/lvplan.php index f0e802896..59fd5169a 100644 --- a/locale/de-AT/lvplan.php +++ b/locale/de-AT/lvplan.php @@ -21,6 +21,7 @@ $this->phrasen['lvplan/lehrverbaende']='Lehrverbände'; $this->phrasen['lvplan/uebersichtDerLehrverbaende']='Übersicht der Lehrverbände'; $this->phrasen['lvplan/fehlerUndFeedback']='Feedback geben'; $this->phrasen['lvplan/lvKoordinationsstelle']='LV-Koordinationsstelle'; +$this->phrasen['lvplan/lvPlanung']='LV-Planung'; $this->phrasen['lvplan/reservierungen']='Reservierungen'; $this->phrasen['lvplan/reservierungWurdeGeloescht']='Reservierung wurde geloescht'; $this->phrasen['lvplan/alleReservierungen']='Alle Reservierungen'; diff --git a/locale/de-AT/zeitwunsch.php b/locale/de-AT/zeitwunsch.php index 31424f8f9..d56494104 100644 --- a/locale/de-AT/zeitwunsch.php +++ b/locale/de-AT/zeitwunsch.php @@ -3,7 +3,7 @@ $this->phrasen['zeitwunsch/falscheWerteEingetragen']='Es duerfen nur die Werte - $this->phrasen['zeitwunsch/zeitwunsch']='Zeitwunsch'; $this->phrasen['zeitwunsch/help']='HELP'; $this->phrasen['zeitwunsch/zeitwunschVon']='Zeitwünsche von'; -$this->phrasen['zeitwunsch/tragenSieInDiesesNormwochenraster']='Tragen Sie in dieses Normwochenraster Ihre Verfügbarkeit in einer durchschnittlichen Arbeitswoche ein.'; +$this->phrasen['zeitwunsch/tragenSieInDiesesNormwochenraster']="Tragen Sie in dieses Normwochenraster Ihre Verfügbarkeit in einer durchschnittlichen Arbeitswoche ein. Klicken Sie danach auf 'Speichern'"; $this->phrasen['zeitwunsch/letzteAenderung']='Letzte Änderung'; $this->phrasen['zeitwunsch/von']='von'; $this->phrasen['zeitwunsch/formularZumEintragenDerZeitsperren']='Das Formular zum Eintragen der Zeitsperren finden Sie %s hier'; @@ -24,4 +24,20 @@ $this->phrasen['zeitwunsch/erklaerung']='Erklärung'; $this->phrasen['zeitwunsch/beiProblemenWendenSieSichAn']='Bei Problemen wenden Sie sich bitte an die'; $this->phrasen['zeitwunsch/profil']='Profil'; $this->phrasen['zeitwunsch/geteilteArbeitszeit']='Ich bin mit der Verplanung meiner Lehre in getrennten Blöcken am Tagesrand einverstanden.'; +$this->phrasen['zeitwunsch/gueltigIm']="Mein Zeitwunsch gültig im: "; +$this->phrasen['zeitwunsch/erklaerungstext']="Sie können Ihren Zeitwunsch direkt in der Tabelle bearbeiten oder einen Zeitwunsch eines vergangenen Studiensemester kopieren.
    + Solange Sie keine Änderungen vornehmen, wird Ihr Zeitwunsch immer ins nächste Studiensemester übernommen."; +$this->phrasen['zeitwunsch/werteAuf1setzen']="Alle Werte auf 1 setzen"; +$this->phrasen['zeitwunsch/kopierenText']="Wählen Sie rechts das gewünschte Studiensemester aus. + Der Zeitwunsch wird dann automatisch in die Tabelle übernommen.
    + Nehmen Sie gegebenenfalls Änderungen vor und klicken danach auf 'Speichern'."; +$this->phrasen['zeitwunsch/kopieren']= "ändern"; +$this->phrasen['zeitwunsch/aendern']= "kopieren von früherem Studiensemester "; +$this->phrasen['zeitwunsch/stundenBereitsVerplant']='Stunden für %s bereits verplant'; +$this->phrasen['zeitwunsch/fuer']='Zeitwunsch für %s  '; +$this->phrasen['zeitwunsch/bearbeitungDeaktiviert']='Bearbeitung deaktiviert'; +$this->phrasen['zeitwunsch/bearbeitungDeaktiviertText']='Ihnen wurden im %s bereits Lehrveranstaltung(en) zugeteilt.
    + Bitte stimmen Sie sich vor einer Änderung mit der %s ab.
    + Möchten Sie mit der Bearbeitung fortsetzen?'; +$this->phrasen['zeitwunsch/bearbeitungAktivieren']='Bearbeitung aktivieren'; ?> diff --git a/locale/en-US/global.php b/locale/en-US/global.php index 5fa89acbb..97f5cfe26 100644 --- a/locale/en-US/global.php +++ b/locale/en-US/global.php @@ -65,6 +65,7 @@ $this->phrasen['global/drucken']='Print'; $this->phrasen['global/und']='and'; $this->phrasen['global/oder']='or'; $this->phrasen['global/faelligAm']='Due on'; +$this->phrasen['global/aenderungenZuruecksetzen']= "Reset changes"; $this->phrasen['global/username']='Username'; $this->phrasen['global/vorname']='First Name'; diff --git a/locale/en-US/lvplan.php b/locale/en-US/lvplan.php index bd2b4b1eb..1a8c865bf 100644 --- a/locale/en-US/lvplan.php +++ b/locale/en-US/lvplan.php @@ -21,6 +21,7 @@ $this->phrasen['lvplan/lehrverbaende']='Teaching Groups'; $this->phrasen['lvplan/uebersichtDerLehrverbaende']='Overview of Teaching Groups'; $this->phrasen['lvplan/fehlerUndFeedback']='Send Feedback'; $this->phrasen['lvplan/lvKoordinationsstelle']='Course-Coordination Office'; +$this->phrasen['lvplan/lvPlanung']='Course-Planning Office'; $this->phrasen['lvplan/reservierungen']='Reservations'; $this->phrasen['lvplan/reservierungWurdeGeloescht'] = 'Reservation successfully deleted'; $this->phrasen['lvplan/alleReservierungen']='All reservations'; diff --git a/locale/en-US/zeitwunsch.php b/locale/en-US/zeitwunsch.php index 1a4a93378..7d89d65f2 100644 --- a/locale/en-US/zeitwunsch.php +++ b/locale/en-US/zeitwunsch.php @@ -3,7 +3,7 @@ $this->phrasen['zeitwunsch/falscheWerteEingetragen']='Invalid input. Only the va $this->phrasen['zeitwunsch/zeitwunsch']='Preferred teaching time'; $this->phrasen['zeitwunsch/help']='HELP'; $this->phrasen['zeitwunsch/zeitwunschVon']='Preferred teaching times for'; -$this->phrasen['zeitwunsch/tragenSieInDiesesNormwochenraster']='Enter your availability for an average week in this standard week grid.'; +$this->phrasen['zeitwunsch/tragenSieInDiesesNormwochenraster']='Enter your availability for an average week in this standard week grid and click "Save"'; $this->phrasen['zeitwunsch/letzteAenderung']='Last Update'; $this->phrasen['zeitwunsch/von']='from'; $this->phrasen['zeitwunsch/formularZumEintragenDerZeitsperren']='The form for entering times when you are unavailable to teach can be found %s here'; @@ -24,4 +24,20 @@ $this->phrasen['zeitwunsch/erklaerung']='Explanation'; $this->phrasen['zeitwunsch/beiProblemenWendenSieSichAn']='If you are having problems, please contact the '; $this->phrasen['zeitwunsch/profil']='Profile'; $this->phrasen['zeitwunsch/geteilteArbeitszeit']='Ich bin mit der Verplanung meiner Lehre in getrennten Blöcken am Tagesrand einverstanden.'; +$this->phrasen['zeitwunsch/gueltigIm']="My preferred times valid in: "; +$this->phrasen['zeitwunsch/erklaerungstext']="You can edit your preferred times directly in the table or copy a your preferred times from a previous semester.
    + As long as you do not make any changes, your preferred times will be carried over to the next study semester."; +$this->phrasen['zeitwunsch/werteAuf1setzen']="Set all values to 1"; +$this->phrasen['zeitwunsch/kopierenText']="Select the desired semester on the right. + Your preferred time of that semester is then automatically transferred to the table.
    + Make changes if necessary and then click on 'Save'."; +$this->phrasen['zeitwunsch/kopieren']= "change"; +$this->phrasen['zeitwunsch/aendern']= "copy from a previous semester"; +$this->phrasen['zeitwunsch/stundenBereitsVerplant']='Hours already scheduled for %s'; +$this->phrasen['zeitwunsch/fuer']='Preferred time for %s  '; +$this->phrasen['zeitwunsch/bearbeitungDeaktiviert']='Editing disabled'; +$this->phrasen['zeitwunsch/bearbeitungDeaktiviertText']='You have already been assigned to course(s) in %s.
    + Please agree with %s before making a change.
    + Do you want to proceed editing?'; +$this->phrasen['zeitwunsch/bearbeitungAktivieren']='Enable editing'; ?> From 70c9489ef36ed37e393f65608ee0c649bb562889 Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 29 Nov 2021 17:38:16 +0100 Subject: [PATCH 016/132] Corrected to retrieve latest Zeitwunschgueltigkeit correctly in getByUID function ...by changing query order --- include/zeitwunsch_gueltigkeit.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/zeitwunsch_gueltigkeit.class.php b/include/zeitwunsch_gueltigkeit.class.php index 20d1d367d..4477551b1 100644 --- a/include/zeitwunsch_gueltigkeit.class.php +++ b/include/zeitwunsch_gueltigkeit.class.php @@ -156,7 +156,7 @@ class zeitwunsch_gueltigkeit extends basis_db // Nach Gueltigkeits-Startdatum sortieren, zuerst die zuletzt gueltigen $qry.= ' - ORDER BY zeitwunsch_gueltigkeit_id DESC, start DESC + ORDER BY start DESC '; // Wenn nur aktive Zeitwunschgueltigkeiten angezeigt werden sollen From 93d9108db784c92b761684dfef1df74f2b34cc31 Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 29 Nov 2021 17:51:08 +0100 Subject: [PATCH 017/132] Added functionality to select Zeitwunschgueltigkeiten in VILESCI . added Dropdown with all Zeitwunschgueltigkeiten . adpated Table to display selected Zeitwunschgueltigkeit --- vilesci/personen/zeitwunsch.php | 55 ++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/vilesci/personen/zeitwunsch.php b/vilesci/personen/zeitwunsch.php index 416c6387d..81d1c0c22 100644 --- a/vilesci/personen/zeitwunsch.php +++ b/vilesci/personen/zeitwunsch.php @@ -32,6 +32,8 @@ require_once('../../include/functions.inc.php'); require_once('../../include/globals.inc.php'); require_once('../../include/datum.class.php'); require_once('../../include/benutzerberechtigung.class.php'); +require_once('../../include/zeitwunsch.class.php'); +require_once('../../include/zeitwunsch_gueltigkeit.class.php'); if (!$db = new basis_db()) die('Es konnte keine Verbindung zum Server aufgebaut werden.'); @@ -48,6 +50,20 @@ if (!isset($uid)) { die( "uid nicht gesetzt"); } + +// Zeitwunschgueltigkeit ID ueber Dropdown ausgewaehlt +if (isset($_GET['zwg_id']) && is_string($_GET['zwg_id'])) +{ + $zwg_id = $_GET['zwg_id']; +} +else +{ + // Default: Letzte Zeitwunschgueltigkeit (ZWG) holen + $zwg = new Zeitwunsch_gueltigkeit(); + $zwg->getByUID($uid, 1); + $zwg_id = !empty($zwg->result) ? $zwg->result[0]->zeitwunsch_gueltigkeit_id : null; // NULL, wenn Lektor noch gar keinen ZW hinterlegt hat +} + $uid_benutzer = get_uid(); $rechte = new benutzerberechtigung(); @@ -97,7 +113,12 @@ $updatevon = 0; } } - if(!($erg=$db->db_query("SELECT * FROM campus.tbl_zeitwunsch WHERE mitarbeiter_uid=".$db->db_add_param($uid)))) + if(!($erg=$db->db_query(" + SELECT * + FROM campus.tbl_zeitwunsch + WHERE mitarbeiter_uid = ". $db->db_add_param($uid). " + AND zeitwunsch_gueltigkeit_id = ". $db->db_add_param(($zwg_id)) + ))) die($db->db_last_error()); $num_rows=$db->db_num_rows($erg); for ($i=0;$i<$num_rows;$i++) @@ -135,10 +156,42 @@ $updatevon = 0; Profil + +

    Zeitwünsche von titelpre.' '.$person->vornamen.' '.$person->nachname. ' '.$person->titelpost; ?>

    +Zeitwunschgueltigkeit: +getByUID($uid, null, false); +$zwg_arr = $zwg->result; + +echo ''; +?> +

    '.$p->t('global/stunde').'
    '.$p->t('global/beginn').'
    '.$p->t('global/ende').'
    From 76ca1706787ddfcc68cac0b18df3751be96c6008 Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 29 Nov 2021 19:08:56 +0100 Subject: [PATCH 018/132] Changed: when splitting Zeitwunschgueltigkeit, set ende of last ZWG to 'yesterday' Before it was set to now(). But new ZWG starts with now, therefore last ZWG should end with day before. --- cis/private/profile/zeitwunsch.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cis/private/profile/zeitwunsch.php b/cis/private/profile/zeitwunsch.php index 8f7bca8c4..c8dea109a 100644 --- a/cis/private/profile/zeitwunsch.php +++ b/cis/private/profile/zeitwunsch.php @@ -219,9 +219,9 @@ if (isset($_GET['type']) && $_GET['type'] == 'save') // -> sonst ist bis null $zw_zwg_id = insertZWG($uid, (new DateTime())->format('Y-m-d H:i:s'), $akt_ss_zwg->bis); - // Fuer bisher letzte ZWG das Endedatum auf heute setzen: bis = now() + // Fuer bisher letzte ZWG das Endedatum auf gestern setzen: bis = gestern // NOTE: MUSS nach dem insert sein - updateZWG($uid, $akt_ss_zwg->zeitwunsch_gueltigkeit_id, (new DateTime())->format('Y-m-d H:i:s')); + updateZWG($uid, $akt_ss_zwg->zeitwunsch_gueltigkeit_id, (new DateTime('yesterday'))->format('Y-m-d H:i:s')); } } } From a4cb455e3ec1706b4b2fc7a536f5ba2282a883a7 Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 2 Dec 2021 09:35:20 +0100 Subject: [PATCH 019/132] Added creating/editing/viewing Zeitwunschgueltigkeiten in VILESCI Admins can see and work on Zeitwunschgueltigkeiten of lector. Added logic to save/update/display Zeitwuensche by Zeitwunschgueltigkeiten. --- vilesci/personen/zeitwunsch.php | 367 +++++++++++++++++++++++++++----- 1 file changed, 308 insertions(+), 59 deletions(-) diff --git a/vilesci/personen/zeitwunsch.php b/vilesci/personen/zeitwunsch.php index 81d1c0c22..6e0460f5f 100644 --- a/vilesci/personen/zeitwunsch.php +++ b/vilesci/personen/zeitwunsch.php @@ -51,19 +51,6 @@ if (!isset($uid)) die( "uid nicht gesetzt"); } -// Zeitwunschgueltigkeit ID ueber Dropdown ausgewaehlt -if (isset($_GET['zwg_id']) && is_string($_GET['zwg_id'])) -{ - $zwg_id = $_GET['zwg_id']; -} -else -{ - // Default: Letzte Zeitwunschgueltigkeit (ZWG) holen - $zwg = new Zeitwunsch_gueltigkeit(); - $zwg->getByUID($uid, 1); - $zwg_id = !empty($zwg->result) ? $zwg->result[0]->zeitwunsch_gueltigkeit_id : null; // NULL, wenn Lektor noch gar keinen ZW hinterlegt hat -} - $uid_benutzer = get_uid(); $rechte = new benutzerberechtigung(); @@ -74,50 +61,239 @@ if(!$rechte->isBerechtigt('mitarbeiter', null, 's')) $datum_obj = new datum(); $updatevon = 0; - //Stundentabelleholen - if(! $result_stunde=$db->db_query("SELECT * FROM lehre.tbl_stunde ORDER BY stunde")) - die($db->db_last_error()); - $num_rows_stunde=$db->db_num_rows($result_stunde); +// Nächstes Studiensemester +$next_ss = new Studiensemester(); +$next_ss->getNextStudiensemester(); - // Zeitwuensche speichern - if (isset($_POST['save'])) - { - if(!$rechte->isBerechtigt('mitarbeiter/zeitwuensche', null, 'suid')) - die($rechte->errormsg); +// Aktuelles Studiensemester +$akt_ss = new Studiensemester(); +$akt_ss->load($akt_ss->getAkt()); - for ($t=1;$t<7;$t++) - for ($i=0;$i<$num_rows_stunde;$i++) - { - $var='wunsch'.$t.'_'.$i; - //echo $$var; - $gewicht=$_POST[$var]; - $stunde=$i+1; - $query="SELECT * FROM campus.tbl_zeitwunsch WHERE mitarbeiter_uid=".$db->db_add_param($uid)." AND stunde=".$db->db_add_param($stunde, FHC_INTEGER)." AND tag=".$db->db_add_param($t, FHC_INTEGER); - if(! $erg_wunsch=$db->db_query($query)) - die($db->db_last_error()); - $num_rows_wunsch=$db->db_num_rows($erg_wunsch); - if ($num_rows_wunsch==0) - { - $query="INSERT INTO campus.tbl_zeitwunsch (mitarbeiter_uid, stunde, tag, gewicht, updateamum, updatevon) VALUES (".$db->db_add_param($uid).", ".$db->db_add_param($stunde).", ".$db->db_add_param($t).", ".$db->db_add_param($gewicht).", now(), ".$db->db_add_param($uid_benutzer).")"; - if(!($erg=$db->db_query($query))) - die($db->db_last_error()); - } - elseif ($num_rows_wunsch==1) - { - $query="UPDATE campus.tbl_zeitwunsch SET gewicht=".$db->db_add_param($gewicht).", updateamum=now(), updatevon=".$db->db_add_param($uid_benutzer)." WHERE mitarbeiter_uid=".$db->db_add_param($uid)." AND stunde=".$db->db_add_param($stunde)." AND tag=".$db->db_add_param($t); - if(!($erg=$db->db_query($query))) - die($db->db_last_error()); - } - else - die("Zuviele Eintraege!"); - } - } +// Zeitwunschgueltigkeiten nach Semester selektierbar +$selected_ss = (isset($_GET['stsem']) && !empty($_GET['stsem'])) ? $_GET['stsem'] : $next_ss->studiensemester_kurzbz; // Default: Nächstes Studiensemester + +// Default: Letzte Zeitwunschgueltigkeit (ZWG) holen +$zwg = new Zeitwunsch_gueltigkeit(); +$zwg->getByUID($uid, 1); +$selected_zwg = !empty($zwg->result) ? $zwg->result[0] : null; // NULL, wenn Lektor noch gar keinen ZW hinterlegt hat + +// Zeitwunschgueltigkeit ueber Dropdown ZWG gewaehlt +if (isset($_GET['zwg_id'])) +{ + $selected_zwg = !empty($_GET['zwg_id']) ? new Zeitwunsch_gueltigkeit($_GET['zwg_id']) : null; +} + +//Stundentabelleholen +if(! $result_stunde=$db->db_query("SELECT * FROM lehre.tbl_stunde ORDER BY stunde")) + die($db->db_last_error()); +$num_rows_stunde=$db->db_num_rows($result_stunde); + +// Zeitwuensche speichern +if (isset($_POST['save'])) +{ + if(!$rechte->isBerechtigt('mitarbeiter/zeitwuensche', null, 'suid')) + die($rechte->errormsg); + + $selected_ss = isset($_POST['stsem']) ? $_POST['stsem'] : die('Studiensemester fehlt'); + + // Letzte Zeitwunschgueltigkeit (ZWG) holen + $zwg = new Zeitwunsch_gueltigkeit(); + $zwg->getByUID($uid, 1); + $lastZwg = !empty($zwg->result) ? $zwg->result[0] : null; + + // Check, ob letzte ZWG im nächsten Studiensemester startet. D.h. es existiert ein neuer Zeitwunsch in der Zukunft + $lastZwgStartsNextSemester = (!is_null($lastZwg) && $lastZwg->von >= $next_ss->start) ? true : false; + $zw_zwg_id = null; // ZWG ID, die zum Speichern / Updaten des Zeitwunsches uebergeben wird + + // Wenn allererster Zeitwunsch, also noch keine ZWG vorhanden + if (is_null($lastZwg)) + { + // Wenn ZW fuer naechstes Studiensemester ist + if ($selected_ss == $next_ss->studiensemester_kurzbz) + { + // Neue ZWG setzen: von = Start nächstes Studiensemester, bis offen lassen + $zw_zwg_id = insertZWG($uid, $next_ss->start, null, $uid_benutzer); + } + + // Wenn Zeitwunsch fuer aktuelles Studiensemester ist + if ($selected_ss == $akt_ss->studiensemester_kurzbz) + { + // Neue ZWG setzen: von = now(), bis offen lassen + $zw_zwg_id = insertZWG($uid, (new DateTime())->format('Y-m-d H:i:s'), null, $uid_benutzer); + } + } + + // Wenn mindestens eine ZWG vorhanden + if (!is_null($lastZwg)) + { + // Wenn Zeitwunsch fuer naechstes Studiensemester ist + if ($selected_ss == $next_ss->studiensemester_kurzbz) + { + // Wenn naechstes Studiensemester schon eine eigene ZWG hat + if ($lastZwgStartsNextSemester) + { + // Nur Zeitwunsch dieser ZWG updaten + $zw_zwg_id = $lastZwg->zeitwunsch_gueltigkeit_id; + } + + // Wenn naechstes Studiensemester keine eigene ZWG hat + if (!$lastZwgStartsNextSemester) + { + // Fuer bisher letzte ZWG ein Endedatum setzen: bis = Ende aktuelles Studiensemester + updateZWG($uid, $lastZwg->zeitwunsch_gueltigkeit_id, $akt_ss->ende, $uid_benutzer); + + // Neue ZWG setzen: von = Start nächstes Studiensemester, bis offen lassen + $zw_zwg_id = insertZWG($uid, $next_ss->start, null, $uid_benutzer); + } + } + + // Wenn Zeitwunsch fuer aktuelles Studiensemester ist + if ($selected_ss == $akt_ss->studiensemester_kurzbz) + { + /** + * Check, ob aktuelles Studiensemester eine ZWG hat. + * Wenn die allererste ZWG fuer das naechste Studiensemester erstellt wurde, dann hat das + * aktuelle Studiensemester noch keine ZWG. + * */ + $zwg = new Zeitwunsch_gueltigkeit(); + $zwg->getByStudiensemester($uid, $akt_ss->studiensemester_kurzbz); + $akt_ss_zwg = !empty($zwg->result) ? $zwg->result[0] : null; + + // Keine ZWG fuer aktuelles Studiensemester vorhanden. + // Da eine ZWG ID aber schon vorhanden: USER HAT ERSTMALIG MIT NAECHSTEM STUDIENSEMESTER EINTRAG BEGONNEN + if (is_null($akt_ss_zwg)) + { + // Neue ZWG setzen: von = now(), ende = Ende aktuelles Studiensemester + $zw_zwg_id = insertZWG( + $uid, + (new DateTime())->format('Y-m-d H:i:s'), + $akt_ss->ende, + $uid_benutzer + ); + } + + // ZWG für aktuelles Studiensemester ist vorhanden --> SPLIT AKTUELLE STUDIENSEMESTER + if ((!is_null($akt_ss_zwg))) + { + // Wenn am selben Tag schon neue ZWG gespeichert wurde, keine neue ZWG anlegen, sondern diese nur updaten + // Verhindert mehrfache Eintraege, wenn oefters zwischengespeichert wird. + if ((new DateTime($akt_ss_zwg->insertamum))->format('Y-m-d') == (new Datetime())->format('Y-m-d')) + { + updateZWG($uid, $akt_ss_zwg->zeitwunsch_gueltigkeit_id, $akt_ss_zwg->bis, $uid_benutzer); + + $zw_zwg_id = $akt_ss_zwg->zeitwunsch_gueltigkeit_id; + } + else + { + // Neue ZWG setzen: von = now(), bis = Bis von ZWG des aktuellen Studiensemesters uebernehmen: + // -> bis ist entweder Ende aktuelles Studiensemester (wenn ZWG für nächstes Studiensemester vorhanden ist) + // -> sonst ist bis null + $zw_zwg_id = insertZWG( + $uid, + (new DateTime())->format('Y-m-d H:i:s'), + $akt_ss_zwg->bis, + $uid_benutzer + ); + + // Fuer bisher letzte ZWG das Endedatum auf gestern setzen: bis = gestern + // NOTE: MUSS nach dem insert sein + updateZWG( + $uid, + $akt_ss_zwg->zeitwunsch_gueltigkeit_id, + (new DateTime('yesterday'))->format('Y-m-d H:i:s'), + $uid_benutzer + ); + } + } + } + } + + // Insert Zeitwunsch mit Zeitwunsch ZWG ID + if (is_numeric($zw_zwg_id)) + { + for ($t = 1; $t < 7; $t++) + { + for ($i = 0; $i < $num_rows_stunde; $i++) + { + $var = 'wunsch' . $t . '_' . $i; + //echo $$var; + $gewicht = $_POST[$var]; + $stunde = $i + 1; + $query = "SELECT * FROM campus.tbl_zeitwunsch WHERE mitarbeiter_uid=" . $db->db_add_param($uid) . " AND zeitwunsch_gueltigkeit_id =" . $db->db_add_param($zw_zwg_id) . " AND stunde=" . $db->db_add_param($stunde, FHC_INTEGER) . " AND tag=" . $db->db_add_param($t, FHC_INTEGER); + if (!$erg_wunsch = $db->db_query($query)) + die($db->db_last_error()); + $num_rows_wunsch = $db->db_num_rows($erg_wunsch); + if ($num_rows_wunsch == 0) { + $query = "INSERT INTO campus.tbl_zeitwunsch (mitarbeiter_uid, stunde, tag, gewicht, updateamum, updatevon, zeitwunsch_gueltigkeit_id) VALUES (" . $db->db_add_param($uid) . ", " . $db->db_add_param($stunde) . ", " . $db->db_add_param($t) . ", " . $db->db_add_param($gewicht) . ", now(), " . $db->db_add_param($uid_benutzer) . ", " . $db->db_add_param($zw_zwg_id) . ")"; + if (!($erg = $db->db_query($query))) + die($db->db_last_error()); + } elseif ($num_rows_wunsch == 1) { + $query = "UPDATE campus.tbl_zeitwunsch SET gewicht=" . $db->db_add_param($gewicht) . ", updateamum=now(), updatevon=" . $db->db_add_param($uid_benutzer) . " WHERE mitarbeiter_uid=" . $db->db_add_param($uid) . " AND zeitwunsch_gueltigkeit_id=" . $db->db_add_param($zw_zwg_id) . " AND stunde=" . $db->db_add_param($stunde) . " AND tag=" . $db->db_add_param($t); + if (!($erg = $db->db_query($query))) + die($db->db_last_error()); + } + else + die("Zuviele Eintraege!"); + } + } + $selected_zwg = new Zeitwunsch_gueltigkeit($zw_zwg_id); + } +} + +/** + * Init ZWG Objekt zum Erstellen einer neuen ZWG + */ +function insertZWG($uid, $von, $bis, $admin_uid) +{ + $zwg = new Zeitwunsch_gueltigkeit(); + $zwg->new = true; + $zwg->mitarbeiter_uid = $uid; + $zwg->von = $von; + $zwg->bis = $bis; + $zwg->insertvon = $admin_uid; + if ($zwg->save()) + { + return $zwg->zeitwunsch_gueltigkeit_id; + } + else + { + die($zwg->errormsg); + } +} + +/** + * Init ZWG Objekt zum Updaten einer bestehenden ZWG + */ +function updateZWG($uid, $zwg_id, $bis, $admin_uid) +{ + $zwg = new Zeitwunsch_gueltigkeit(); + $zwg->new = false; + $zwg->zeitwunsch_gueltigkeit_id = $zwg_id; + $zwg->mitarbeiter_uid = $uid; + $zwg->bis = $bis; + $zwg->updatevon = $admin_uid; + + if (!$zwg->save()) + { + die($zwg->errormsg); + } + + return; +} + +// Tabellendaten +/** + * Zeitwunschgueltigkeit + * Wurde ueber Dropdown gewaehlt (kann auch null sein, wenn noch kein Zeitwunsch vorliegt) + * ODER ueber Speichernbutton neu erstellt / upgedatet + */ +$selected_zwg_id = !is_null($selected_zwg) ? $selected_zwg->zeitwunsch_gueltigkeit_id : ''; if(!($erg=$db->db_query(" SELECT * FROM campus.tbl_zeitwunsch WHERE mitarbeiter_uid = ". $db->db_add_param($uid). " - AND zeitwunsch_gueltigkeit_id = ". $db->db_add_param(($zwg_id)) + AND zeitwunsch_gueltigkeit_id = ". $db->db_add_param(($selected_zwg_id)) ))) die($db->db_last_error()); $num_rows=$db->db_num_rows($erg); @@ -159,41 +335,74 @@ $updatevon = 0; + -

    Zeitwünsche von titelpre.' '.$person->vornamen.' '.$person->nachname. ' '.$person->titelpost; ?>

    +

    Zeitwünsche von titelpre.' '.$person->vorname.' '.$person->nachname. ' '.$person->titelpost; ?>

    Zeitwunschgueltigkeit: getByUID($uid, null, false); $zwg_arr = $zwg->result; -echo ''; + +// Wenn nächstes Studiensemester hat keine Zeitwunschgueltigkeit hat... +if (!empty($zwg_arr) && $zwg_arr[0]->von < $next_ss->start) +{ + // ...naechstes Studiensemester 'neu anlegen' als Option anzeigen + echo ''; +} + +// Vorhandene Zeitwunschgueltigkeiten foreach($zwg_arr as $row) { $von = (new DateTime($row->von))->format('d.m.Y'); $bis = !is_null($row->bis) ? (new DateTime($row->bis))->format('d.m.Y') : "offen"; + $selected = !empty($selected_zwg_id) && $row->zeitwunsch_gueltigkeit_id == $selected_zwg_id && $row->studiensemester_kurzbz == $selected_ss ? ' selected ' : ''; - $selected = !is_null($zwg_id) && $row->zeitwunsch_gueltigkeit_id == $zwg_id ? ' selected ' : ''; - echo ''; } +// Wenn aktuelles Studiensemester hat keine Zeitwunschgueltigkeit hat, das naechste aber schon +if (count($zwg_arr) == 1 && ($zwg_arr[0]->von >= $next_ss->start)) +{ + // ...aktuelles Studiensemester 'neu anlegen' als Option anzeigen + $selected = $selected_ss == $akt_ss->studiensemester_kurzbz ? "selected" : ''; + echo ''; +} + +// Wenn es noch keine Zeitwuensche gibt +if (empty($zwg_arr)) +{ + // Optionen zum Anlegen einer Zeitwunschgueltigkeit fuer das aktuelle / naechste Studiensemester + $selected = $selected_ss == $akt_ss->studiensemester_kurzbz ? 'selected' : ''; + echo ''; + echo ''; +} echo ''; ?>

    + + +
    '; ?>

    - isBerechtigt('mitarbeiter/zeitwuensche', null, 'suid')) - echo '' + { + /** + * Disablen des Speicherbuttons und Textanzeige, wenn die gewaehlte Zeitwunschgueltigkeit nicht + *die letztgueltige fuer das aktuelle / naechste Studiensemester ist. + **/ + $disabled = getDisabledString($uid, $selected_zwg, $akt_ss, $next_ss); // return 'disabled' oder '' + + // Speichern Button + echo ''; + + if (!empty($disabled)) + { + echo ' Es können nur Zeitwünsche im aktuellen oder im nächsten Studiensemester bearbeitet werden.
    +       Falls mehrere Zeitwünsche im aktuellen Semester gespeichert sind, kann nur der letztgültige geändert werden.
    '; + } + } ?>
    @@ -302,3 +525,29 @@ echo '';

     

    + +getByStudiensemester($uid, $akt_ss->studiensemester_kurzbz); + $lastZwg_id_aktStudsem = empty($zwg->result) ? '' : $zwg->result[0]->zeitwunsch_gueltigkeit_id; + + $zwg = new Zeitwunsch_gueltigkeit(); + $zwg->getByStudiensemester($uid, $next_ss->studiensemester_kurzbz); + $lastZwg_id_nextStudsem = empty($zwg->result) ? '' : $zwg->result[0]->zeitwunsch_gueltigkeit_id; + + return ( + is_null($selected_zwg) + || !is_null($selected_zwg) + && ( + $selected_zwg->zeitwunsch_gueltigkeit_id == $lastZwg_id_aktStudsem + || $selected_zwg->zeitwunsch_gueltigkeit_id == $lastZwg_id_nextStudsem + ) + ) + ? '' + : 'disabled'; + +} From e3ecfbe7822cdfbf720134632475d8e6be9997db Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 2 Dec 2021 09:38:24 +0100 Subject: [PATCH 020/132] Corrected constructor of Zeitwunsch_gueltigkeit Class --- include/zeitwunsch_gueltigkeit.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/zeitwunsch_gueltigkeit.class.php b/include/zeitwunsch_gueltigkeit.class.php index 4477551b1..7f72c72c0 100644 --- a/include/zeitwunsch_gueltigkeit.class.php +++ b/include/zeitwunsch_gueltigkeit.class.php @@ -18,9 +18,9 @@ class zeitwunsch_gueltigkeit extends basis_db public $updatevon; // varchar 32 - public function __construct() + public function __construct($zeitwunsch_gueltigkeit_id = null) { - parent::__construct($zeitwunsch_gueltigkeit_id = null); + parent::__construct(); if (!is_null($zeitwunsch_gueltigkeit_id)) { From d697e189eb2209b6c7d4953fbeca00fa9f2549e5 Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 2 Dec 2021 09:43:06 +0100 Subject: [PATCH 021/132] Changed: Now function getByUID of ZWG class retrieves correct amount of ZWG --- include/zeitwunsch_gueltigkeit.class.php | 34 +++++++++++++++--------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/include/zeitwunsch_gueltigkeit.class.php b/include/zeitwunsch_gueltigkeit.class.php index 7f72c72c0..33dfdf65f 100644 --- a/include/zeitwunsch_gueltigkeit.class.php +++ b/include/zeitwunsch_gueltigkeit.class.php @@ -17,6 +17,9 @@ class zeitwunsch_gueltigkeit extends basis_db public $updateamum; // timestamp public $updatevon; // varchar 32 + public $studiensemester_kurzbz; + public $start; + public $ende; public function __construct($zeitwunsch_gueltigkeit_id = null) { @@ -45,6 +48,7 @@ class zeitwunsch_gueltigkeit extends basis_db SELECT * FROM campus.tbl_zeitwunsch_gueltigkeit WHERE zeitwunsch_gueltigkeit_id = '.$this->db_add_param($zeitwunsch_gueltigkeit_id). ' + AND (von < ende AND COALESCE(bis, '. $this->db_add_param($studiensemester->ende).'::date ) > start) ORDER BY von DESC '; @@ -130,13 +134,14 @@ class zeitwunsch_gueltigkeit extends basis_db */ public function getByUID($uid, $limit = null, $activeOnly = true, $bis = null) { - $studiensemester = new Studiensemester(); - $studiensemester->getNextStudiensemester(); - $qry = ' - SELECT zwg.*, studiensemester_kurzbz, start, ende - FROM campus.tbl_zeitwunsch_gueltigkeit zwg, public.tbl_studiensemester - WHERE zwg.mitarbeiter_uid = '.$this->db_add_param($uid); + SELECT zeitwunsch_gueltigkeit_id, mitarbeiter_uid, von, bis, + insertamum, insertvon, updateamum, updatevon, + studiensemester_kurzbz, start, ende + FROM ( + SELECT DISTINCT ON (bis) bis, zeitwunsch_gueltigkeit_id, mitarbeiter_uid, von, insertamum, insertvon, updateamum, updatevon, studiensemester_kurzbz, start, ende + FROM campus.tbl_zeitwunsch_gueltigkeit zwg, public.tbl_studiensemester + WHERE zwg.mitarbeiter_uid = '.$this->db_add_param($uid); // Wenn Bis-Datum angegeben if (!is_null($bis)) @@ -150,13 +155,18 @@ class zeitwunsch_gueltigkeit extends basis_db { // Alle Zeitwuensche $qry.= ' - AND (von < ende AND COALESCE(bis, '. $this->db_add_param($studiensemester->ende).'::date ) > start) + AND (von < ende AND COALESCE(bis, \'2999-12-31\'::date ) > start) '; } + $qry.= ' + ORDER BY bis, von DESC, bis DESC, start ASC + ) temp + '; + // Nach Gueltigkeits-Startdatum sortieren, zuerst die zuletzt gueltigen $qry.= ' - ORDER BY start DESC + ORDER BY von DESC, bis DESC '; // Wenn nur aktive Zeitwunschgueltigkeiten angezeigt werden sollen @@ -164,11 +174,11 @@ class zeitwunsch_gueltigkeit extends basis_db { // ...mit distinct die zuletzt erstellten pro Studiensemester filtern $qry = ' - SELECT DISTINCT ON (start, studiensemester_kurzbz) start, studiensemester_kurzbz, - ende, zeitwunsch_gueltigkeit_id, mitarbeiter_uid, von, bis, + SELECT DISTINCT ON (studiensemester_kurzbz) studiensemester_kurzbz, + start, ende, zeitwunsch_gueltigkeit_id, mitarbeiter_uid, von, bis, insertamum, insertvon, updateamum, updatevon FROM ('. $qry. ') temp - ORDER BY start DESC, studiensemester_kurzbz + ORDER BY studiensemester_kurzbz, von DESC, bis DESC '; } @@ -229,7 +239,7 @@ class zeitwunsch_gueltigkeit extends basis_db FROM campus.tbl_zeitwunsch_gueltigkeit zwg, studiensemester ss WHERE zwg.mitarbeiter_uid = '.$this->db_add_param($uid). ' AND (zwg.von < ss.ende AND COALESCE(zwg.bis, ss.ende) >= ss.start) - ORDER BY von DESC + ORDER BY von DESC, bis DESC '; // Wenn Limit angegeben From 9c0da32841f591a6da9c9d91d87cec110d5e352e Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 6 Dec 2021 15:51:45 +0100 Subject: [PATCH 022/132] Adapted TEMPUS queries to get correct Zeitwunsch (of given Zeitwunschgueltigkeit) Now correct Zeitwunsch is displayed for - Wochenplan and Semesterplan of a lector - Wochenplan, when a LV is added, to which more lectors are assigned: Now query checks to get correct Zeitwunsch of each lector --- include/zeitwunsch.class.php | 39 +++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/include/zeitwunsch.class.php b/include/zeitwunsch.class.php index 9c60c3a7a..4e94ac059 100644 --- a/include/zeitwunsch.class.php +++ b/include/zeitwunsch.class.php @@ -197,15 +197,32 @@ class zeitwunsch extends basis_db } /** - * Alle Zeitwuensche einer Person laden + * Alle Zeitwuensche einer Person laden. + * Um auf einen Zeitwunsch einer bestimmten Zeit, also innerhalb einer bestimmten Zeitwunschgueltigkeit + * zu beschraenken, kann ein Datum mitgegeben werden. * @param uid - * @param datum + * @param datum UNIX timestamp, um Zeitwunsch mit richtiger Zeitwunschgueltigkeit zu ermitteln * @return boolean Ergebnis steht in Array $zeitwunsch wenn true */ public function loadPerson($uid,$datum=null) { + // Default datum: jetzt + if (is_null($datum)) + { + $datum = time(); + } + + $qry = " + SELECT * + FROM campus.tbl_zeitwunsch + JOIN campus.tbl_zeitwunsch_gueltigkeit zwg USING (zeitwunsch_gueltigkeit_id) + WHERE zwg.mitarbeiter_uid=". $this->db_add_param($uid). " + AND ". $this->db_add_param(date('Y-m-d', $datum)). " BETWEEN von AND bis; + "; + + // Zeitwuensche abfragen - if(!$this->db_query("SELECT * FROM campus.tbl_zeitwunsch WHERE mitarbeiter_uid=".$this->db_add_param($uid))) + if(!$this->db_query($qry)) { $this->errormsg = $this->db_last_error(); return false; @@ -292,12 +309,16 @@ class zeitwunsch extends basis_db /** * Zeitwunsch der Personen in Lehreinheiten laden * @param $le_id LehreinheitID Array - * @param $datum + * @param $datum UNIX timestamp Datum, um Zeitwunsch mit richtiger Zeitwunschgueltigkeit zu ermitteln * @return true oder false */ - public function loadZwLE($le_id,$datum=null) + public function loadZwLE($le_id, $datum = null) { - //$this->init(); + // Default datum: jetzt + if (is_null($datum)) + { + $datum = time(); + } // SUB-Select fuer LVAs $sql_query_leid=''; $sql_query_le='SELECT DISTINCT mitarbeiter_uid FROM campus.vw_lehreinheit WHERE '; @@ -308,7 +329,11 @@ class zeitwunsch extends basis_db // Schlechteste Zeitwuensche holen $sql_query='SELECT tag,stunde,min(gewicht) AS gewicht - FROM campus.tbl_zeitwunsch WHERE mitarbeiter_uid IN ('.$sql_query_le.') GROUP BY tag,stunde'; + FROM campus.tbl_zeitwunsch + JOIN campus.tbl_zeitwunsch_gueltigkeit zwg USING (zeitwunsch_gueltigkeit_id) + WHERE zwg.mitarbeiter_uid IN ('.$sql_query_le.') + AND '. $this->db_add_param(date('Y-m-d', $datum)). ' BETWEEN von AND bis + GROUP BY tag,stunde;'; // Zeitwuensche abfragen if(!$this->db_query($sql_query)) From 40871c73a0e0bb333ec996215c5776b30dbd78f8 Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 7 Dec 2021 17:16:15 +0100 Subject: [PATCH 023/132] Added link to Vilesci Zeitwuensche in TEMPUS Now, when rightclicking on 'Zeitwuensche einsehen' on a lector in Tempus, the Vilesci Zeitwuensche of that lector is opened. --- content/tempusoverlay.js.php | 23 ++++++++++++++ content/tempusoverlay.xul.php | 2 ++ vilesci/personen/zeitwunsch.php | 55 ++++++++++++++++++++++++++++++--- 3 files changed, 75 insertions(+), 5 deletions(-) diff --git a/content/tempusoverlay.js.php b/content/tempusoverlay.js.php index a187f5176..7c539797d 100644 --- a/content/tempusoverlay.js.php +++ b/content/tempusoverlay.js.php @@ -330,6 +330,29 @@ function onLektorSelect(event) } } +function LektorFunktionLoadZeitwunschAdminUrl(){ + + var treeLektor = document.getElementById('tree-lektor'); + var col = treeLektor.columns ? treeLektor.columns["uid"] : "uid"; + try + { + var uid = treeLektor.view.getCellText(treeLektor.currentIndex,col); + } + catch(e) + { + } + + if (uid == '' || uid == undefined) + { + alert('LektorIn auswählen, um Zeitwünsche einsehen zu können.'); + return; + } + else + { + window.open('vilesci/personen/zeitwunsch.php?uid=' + uid); + } +} + function loadURL(event) { var contentFrame = document.getElementById('contentFrame'); diff --git a/content/tempusoverlay.xul.php b/content/tempusoverlay.xul.php index 0e35d71f0..2e1da8b8b 100644 --- a/content/tempusoverlay.xul.php +++ b/content/tempusoverlay.xul.php @@ -186,6 +186,8 @@ echo ' + + diff --git a/vilesci/personen/zeitwunsch.php b/vilesci/personen/zeitwunsch.php index 6e0460f5f..1bc9dd13e 100644 --- a/vilesci/personen/zeitwunsch.php +++ b/vilesci/personen/zeitwunsch.php @@ -337,9 +337,9 @@ $selected_zwg_id = !is_null($selected_zwg) ? $selected_zwg->zeitwunsch_gueltigke $(function(){ // Bei Wechsel von Zeitwunschgueltigkeit die Seite mit GET params neu laden $('#zwg').change(function(){ - let uid = $('input[name="uid"]').val(); - let zeitwunsch_gueltigkeit_id = $('option:selected', this).val(); - let studiensemester = $('option:selected', this).data('stsem'); + var uid = $('input[name="uid"]').val(); + var zeitwunsch_gueltigkeit_id = $('option:selected', this).val(); + var studiensemester = $('option:selected', this).data('stsem'); window.location = '?uid=' + uid + '&zwg_id=' + zeitwunsch_gueltigkeit_id + '&stsem=' + studiensemester; }); @@ -359,7 +359,7 @@ $zwg_arr = $zwg->result; // Dropdown echo '';

     

    + Date: Tue, 7 Dec 2021 17:24:07 +0100 Subject: [PATCH 024/132] Refactored query to load a single Zeitwunschgueltigkeit Instead of limiting returning rows by using ende of next Studiensemester, it is limited by ordering and limiting query now. --- include/zeitwunsch_gueltigkeit.class.php | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/include/zeitwunsch_gueltigkeit.class.php b/include/zeitwunsch_gueltigkeit.class.php index 33dfdf65f..32b51d9f6 100644 --- a/include/zeitwunsch_gueltigkeit.class.php +++ b/include/zeitwunsch_gueltigkeit.class.php @@ -1,7 +1,6 @@ db_add_param($zeitwunsch_gueltigkeit_id). ' - AND (von < ende AND COALESCE(bis, '. $this->db_add_param($studiensemester->ende).'::date ) > start) - ORDER BY von DESC + AND (von < ende AND COALESCE(bis, \'2999-12-31\'::date ) > start) + ORDER BY start ASC + LIMIT 1 '; if ($result = $this->db_query($qry)) @@ -63,6 +63,9 @@ class zeitwunsch_gueltigkeit extends basis_db $this->insertvon = $row->insertvon; $this->updateamum = $row->updateamum; $this->updatevon = $row->updatevon; + $this->studiensemester_kurzbz = $row->studiensemester_kurzbz; + $this->start = $row->start; + $this->ende = $row->ende; } return true; } From 6855686c66edfc0b4f8786b82854e9335c8950d2 Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 7 Dec 2021 18:25:55 +0100 Subject: [PATCH 025/132] Changed text and removed link mailto LV Planung --- cis/private/profile/zeitwunsch.php | 6 +++--- locale/de-AT/zeitwunsch.php | 9 +++++---- locale/en-US/zeitwunsch.php | 7 ++++--- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/cis/private/profile/zeitwunsch.php b/cis/private/profile/zeitwunsch.php index c8dea109a..1596fd582 100644 --- a/cis/private/profile/zeitwunsch.php +++ b/cis/private/profile/zeitwunsch.php @@ -668,8 +668,9 @@ function checkIsVerplant($uid, $studiensemester_kurzbz) echo '
    '; echo '
    '; echo ''. $p->t("zeitwunsch/bearbeitungDeaktiviert"). ': '; - echo ''. $p->t("zeitwunsch/bearbeitungDeaktiviertText", array($selected_ss, MAIL_LVPLAN, $p->t('lvplan/lvPlanung'))). ' - '. $p->t("zeitwunsch/bearbeitungAktivieren"). ' + echo $p->t("zeitwunsch/bearbeitungDeaktiviertText", array($selected_ss, $p->t('global/studiengangsmanagement'))). ' + '. $p->t("zeitwunsch/bearbeitungAktivieren"). '
    + '. $p->t("zeitwunsch/kompetenzfeldWirdInformiert") . '
    '; echo '
    '; // end panel heading echo '
    '; // end panel @@ -695,7 +696,6 @@ function checkIsVerplant($uid, $studiensemester_kurzbz)
  • t('zeitwunsch/sperrenSieNurTermine');?>
  • t('zeitwunsch/esSolltenFuerJedeStunde');?>

  • -

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



    diff --git a/locale/de-AT/zeitwunsch.php b/locale/de-AT/zeitwunsch.php index d56494104..35c8c3c99 100644 --- a/locale/de-AT/zeitwunsch.php +++ b/locale/de-AT/zeitwunsch.php @@ -26,7 +26,7 @@ $this->phrasen['zeitwunsch/profil']='Profil'; $this->phrasen['zeitwunsch/geteilteArbeitszeit']='Ich bin mit der Verplanung meiner Lehre in getrennten Blöcken am Tagesrand einverstanden.'; $this->phrasen['zeitwunsch/gueltigIm']="Mein Zeitwunsch gültig im: "; $this->phrasen['zeitwunsch/erklaerungstext']="Sie können Ihren Zeitwunsch direkt in der Tabelle bearbeiten oder einen Zeitwunsch eines vergangenen Studiensemester kopieren.
    - Solange Sie keine Änderungen vornehmen, wird Ihr Zeitwunsch immer ins nächste Studiensemester übernommen."; +
    Solange Sie keine Änderungen vornehmen, wird Ihr Zeitwunsch immer ins nächste Studiensemester übernommen."; $this->phrasen['zeitwunsch/werteAuf1setzen']="Alle Werte auf 1 setzen"; $this->phrasen['zeitwunsch/kopierenText']="Wählen Sie rechts das gewünschte Studiensemester aus. Der Zeitwunsch wird dann automatisch in die Tabelle übernommen.
    @@ -36,8 +36,9 @@ $this->phrasen['zeitwunsch/aendern']= "kopieren von früherem Studiensemeste $this->phrasen['zeitwunsch/stundenBereitsVerplant']='Stunden für %s bereits verplant'; $this->phrasen['zeitwunsch/fuer']='Zeitwunsch für %s  '; $this->phrasen['zeitwunsch/bearbeitungDeaktiviert']='Bearbeitung deaktiviert'; -$this->phrasen['zeitwunsch/bearbeitungDeaktiviertText']='Ihnen wurden im %s bereits Lehrveranstaltung(en) zugeteilt.
    - Bitte stimmen Sie sich vor einer Änderung mit der %s ab.
    - Möchten Sie mit der Bearbeitung fortsetzen?'; +$this->phrasen['zeitwunsch/bearbeitungDeaktiviertText']='Ihnen wurden im %s bereits Lehrveranstaltung(en) zugeteilt.
    + Bitte stimmen Sie sich vor einer Änderung mit dem %s ab.
    + Möchten Sie trotzdem ohne Abstimmung bzw. nach bereits erfolgter Abstimmung fortsetzen?'; $this->phrasen['zeitwunsch/bearbeitungAktivieren']='Bearbeitung aktivieren'; +$this->phrasen['zeitwunsch/kompetenzfeldWirdInformiert']= 'INFO: Kompetenzfeld wird über die Änderung per Mail informiert'; ?> diff --git a/locale/en-US/zeitwunsch.php b/locale/en-US/zeitwunsch.php index 7d89d65f2..d12863710 100644 --- a/locale/en-US/zeitwunsch.php +++ b/locale/en-US/zeitwunsch.php @@ -26,7 +26,7 @@ $this->phrasen['zeitwunsch/profil']='Profile'; $this->phrasen['zeitwunsch/geteilteArbeitszeit']='Ich bin mit der Verplanung meiner Lehre in getrennten Blöcken am Tagesrand einverstanden.'; $this->phrasen['zeitwunsch/gueltigIm']="My preferred times valid in: "; $this->phrasen['zeitwunsch/erklaerungstext']="You can edit your preferred times directly in the table or copy a your preferred times from a previous semester.
    - As long as you do not make any changes, your preferred times will be carried over to the next study semester."; + As long as you do not make any changes, your preferred times will be carried over to the next study semester."; $this->phrasen['zeitwunsch/werteAuf1setzen']="Set all values to 1"; $this->phrasen['zeitwunsch/kopierenText']="Select the desired semester on the right. Your preferred time of that semester is then automatically transferred to the table.
    @@ -37,7 +37,8 @@ $this->phrasen['zeitwunsch/stundenBereitsVerplant']='Hours already scheduled for $this->phrasen['zeitwunsch/fuer']='Preferred time for %s  '; $this->phrasen['zeitwunsch/bearbeitungDeaktiviert']='Editing disabled'; $this->phrasen['zeitwunsch/bearbeitungDeaktiviertText']='You have already been assigned to course(s) in %s.
    - Please agree with %s before making a change.
    - Do you want to proceed editing?'; + Please agree with %s before making a change.
    + Would you still like to continue without agreement or after having agreed?'; $this->phrasen['zeitwunsch/bearbeitungAktivieren']='Enable editing'; +$this->phrasen['zeitwunsch/kompetenzfeldWirdInformiert']= 'INFO: The field of competence will be informed of your changes by email'; ?> From cc770e6324f97ae1da97d5751902aa156dfd0a81 Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 13 Dec 2021 11:29:11 +0100 Subject: [PATCH 026/132] Added param 'nurBevorstehende' to getStundenplanData method in Lehrstunden Class If 'nurBevorstehende' true, only future Studenplandata will be queried. --- include/lehrstunde.class.php | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/include/lehrstunde.class.php b/include/lehrstunde.class.php index 84cd615ed..5cec78f3d 100644 --- a/include/lehrstunde.class.php +++ b/include/lehrstunde.class.php @@ -1062,7 +1062,19 @@ class lehrstunde extends basis_db return $result; } - public function getStundenplanData($db_stpl_table, $lehrveranstaltung_id=null, $studiensemester_kurzbz=null, $lehreinheit_id=null, $mitarbeiter_uid=null, $student_uid=null) + /** + * Holt Studenplandaten. + * + * @param $db_stpl_table + * @param null $lehrveranstaltung_id + * @param null $studiensemester_kurzbz + * @param null $lehreinheit_id + * @param null $mitarbeiter_uid + * @param null $student_uid + * @param false $nurBevorstehende Wenn true, dann werden nur bevorstehende LVs abgefragt. + * @return bool + */ + public function getStundenplanData($db_stpl_table, $lehrveranstaltung_id=null, $studiensemester_kurzbz=null, $lehreinheit_id=null, $mitarbeiter_uid=null, $student_uid=null, $nurBevorstehende = false) { $qry = "SELECT @@ -1114,6 +1126,11 @@ class lehrstunde extends basis_db else return false; + if($nurBevorstehende) + { + $qry.= " AND datum >= NOW()::date "; + } + $qry.="GROUP BY stpl.datum, stpl.unr, stpl.lehreinheit_id, lehrfach.bezeichnung ORDER BY stpl.datum, min(stpl.stunde), stpl.unr, stpl.lehreinheit_id"; From bb7922dd3a7f5dfa6771a1cdeecf5ce9419bf840 Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 13 Dec 2021 11:40:32 +0100 Subject: [PATCH 027/132] Adapted to check only for future verplante LVs Only if LVs are assigend in the future, the lector should be informed and initially blocked to change their Zeitwunsch. For past LVs it is not relevant anymore. --- cis/private/profile/zeitwunsch.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cis/private/profile/zeitwunsch.php b/cis/private/profile/zeitwunsch.php index 1596fd582..2c2a7bce1 100644 --- a/cis/private/profile/zeitwunsch.php +++ b/cis/private/profile/zeitwunsch.php @@ -346,7 +346,7 @@ function updateZWG($uid, $zwg_id, $bis) function checkIsVerplant($uid, $studiensemester_kurzbz) { $lstd = new Lehrstunde(); - if (!$lstd->getStundenplanData('stundenplandev', null, $studiensemester_kurzbz, null, $uid)) + if (!$lstd->getStundenplanData('stundenplandev', null, $studiensemester_kurzbz, null, $uid, null, true)) { die($lstd->errormsg); } From d2c87d6a98bca24a0ea40e2c5209f91f7696f80e Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 20 Dec 2021 09:43:37 +0100 Subject: [PATCH 028/132] Added Class Zeitwunsch_gueltigkeit_model --- .../ressource/Zeitwunsch_gueltigkeit_model.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 application/models/ressource/Zeitwunsch_gueltigkeit_model.php diff --git a/application/models/ressource/Zeitwunsch_gueltigkeit_model.php b/application/models/ressource/Zeitwunsch_gueltigkeit_model.php new file mode 100644 index 000000000..f26e06d3c --- /dev/null +++ b/application/models/ressource/Zeitwunsch_gueltigkeit_model.php @@ -0,0 +1,14 @@ +dbTable = 'campus.tbl_zeitwunsch_gueltigkeit'; + $this->pk = 'zeitwunsch_gueltigkeit_id'; + } +} \ No newline at end of file From b2bd8e071b87c27ad1b3efed8ccc4239c993d00f Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 20 Dec 2021 09:47:21 +0100 Subject: [PATCH 029/132] Added getStudenplanData method to Class Studenplandev_model --- .../models/ressource/Stundenplandev_model.php | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/application/models/ressource/Stundenplandev_model.php b/application/models/ressource/Stundenplandev_model.php index 9fa92ae5e..4a9c9c5ed 100644 --- a/application/models/ressource/Stundenplandev_model.php +++ b/application/models/ressource/Stundenplandev_model.php @@ -61,4 +61,98 @@ class Stundenplandev_model extends DB_Model return $this->execQuery($qry, $parametersArray); } + + /** + * Get Stundenplan data. + * + * @param null $lehrveranstaltung_id + * @param null $studiensemester_kurzbz + * @param null $lehreinheit_id + * @param null $mitarbeiter_uid + * @param null $student_uid + * @param false $nurBevorstehende If true, only future data is retrieved. + * @return array|false|stdClass|null + */ + public function getStundenplanData($lehrveranstaltung_id=null, $studiensemester_kurzbz=null, $lehreinheit_id=null, $mitarbeiter_uid=null, $student_uid=null, $nurBevorstehende = false) + { + $params = array(); + + $qry = "SELECT + stpl.datum, min(stpl.stunde) as stundevon, max(stpl.stunde) as stundebis, + stpl.lehreinheit_id, lehrfach.bezeichnung as lehrfach_bezeichnung, + array_agg( + CASE WHEN gruppe_kurzbz is not null THEN gruppe_kurzbz + ELSE (SELECT UPPER(typ || kurzbz) FROM public.tbl_studiengang WHERE studiengang_kz=stpl.studiengang_kz) || COALESCE(stpl.semester,'0') || COALESCE(stpl.verband,'') || COALESCE(stpl.gruppe,'') + END) as gruppen, array_agg(mitarbeiter_uid) as lektoren, + array_agg(ort_kurzbz) as orte, + array_agg(titel) as titel + FROM + lehre.tbl_stundenplandev as stpl + JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) + JOIN lehre.tbl_lehrveranstaltung as lehrfach ON(tbl_lehreinheit.lehrfach_id=lehrfach.lehrveranstaltung_id) + WHERE "; + + if ($lehrveranstaltung_id != '') + { + $qry.=" + lehreinheit_id IN ( + SELECT lehreinheit_id FROM lehre.tbl_lehreinheit + WHERE lehrveranstaltung_id = ? + AND studiensemester_kurzbz = ? + )"; + + $params[]= $lehrveranstaltung_id; + $params[]= $studiensemester_kurzbz; + + } + elseif ($lehreinheit_id!='') + { + $qry.=" lehreinheit_id = ?"; + + $params[]= $lehreinheit_id; + } + elseif ($mitarbeiter_uid != '') + { + $qry.= " + mitarbeiter_uid = ? + AND lehreinheit_id IN ( + SELECT lehreinheit_id + FROM lehre.tbl_lehreinheitmitarbeiter + JOIN lehre.tbl_lehreinheit USING (lehreinheit_id) + WHERE mitarbeiter_uid = ? + AND studiensemester_kurzbz IN ( ? ) + )"; + $params[] = $mitarbeiter_uid; + $params[] = $mitarbeiter_uid; + $params[] = $studiensemester_kurzbz; + } + elseif ($student_uid != '') + { + $qry.=" + lehreinheit_id IN ( + SELECT lehreinheit_id + FROM campus.vw_student_lehrveranstaltung + WHERE uid = ? + AND studiensemester_kurzbz = ? + )"; + + $params[] = $student_uid; + $params[] = $studiensemester_kurzbz; + } + else + return false; + + if($nurBevorstehende) + { + $qry.= " AND datum >= NOW()::date "; + } + + $qry.= " + GROUP BY stpl.datum, stpl.unr, stpl.lehreinheit_id, lehrfach.bezeichnung + ORDER BY stpl.datum, min(stpl.stunde), stpl.unr, stpl.lehreinheit_id + "; + + return $this->execQuery($qry, $params); + } + } From a4ffe9104b46e202c02e0ec3eca253ddcd62d21e Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 20 Dec 2021 09:49:49 +0100 Subject: [PATCH 030/132] Fixed query to get Studiensemest correctly when using getByDate method --- .../models/organisation/Studiensemester_model.php | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/application/models/organisation/Studiensemester_model.php b/application/models/organisation/Studiensemester_model.php index 07783cf0d..742757513 100644 --- a/application/models/organisation/Studiensemester_model.php +++ b/application/models/organisation/Studiensemester_model.php @@ -167,15 +167,13 @@ class Studiensemester_model extends DB_Model if (date_format(date_create($from), 'Y-m-d') > (date_format(date_create($to), 'Y-m-d'))) return success(array()); - $query = "SELECT * - FROM public.tbl_studiensemester - WHERE - (ende > ?::date AND start < ?::date) - OR start = ?::date - OR ende = ?::date - ORDER BY start DESC"; + $query = " + SELECT * + FROM public.tbl_studiensemester + WHERE ( ?::date < ende AND ?::date > start ) + ORDER BY start DESC"; - return $this->execQuery($query, array($from, $to, $from, $to)); + return $this->execQuery($query, array($from, $to)); } /** From c2d9afe3b1422f2e0a8e72dee3c354fa74d03228 Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 20 Dec 2021 09:51:18 +0100 Subject: [PATCH 031/132] Added return value to sendSanchoMail to be able to handle mail error --- application/helpers/hlp_sancho_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/helpers/hlp_sancho_helper.php b/application/helpers/hlp_sancho_helper.php index 1653c44e7..d599e40bc 100644 --- a/application/helpers/hlp_sancho_helper.php +++ b/application/helpers/hlp_sancho_helper.php @@ -74,7 +74,7 @@ function sendSanchoMail($vorlage_kurzbz, $vorlage_data, $to, $subject, $headerIm $body = _parseMailContent('Sancho_Mail_Template', $layout); // Send mail - $ci->maillib->send($from, $to, $subject, $body, $alias = '', $cc, $bcc, $altMessage = '', $bulk = true, $autogenerated = true); + return $ci->maillib->send($from, $to, $subject, $body, $alias = '', $cc, $bcc, $altMessage = '', $bulk = true, $autogenerated = true); } /** From 4a2a30ac5eccc81fdc4485f9a5abd288d6d7d693 Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 20 Dec 2021 09:55:29 +0100 Subject: [PATCH 032/132] Added Job mailUpdatedZeitwuensche Job sends Mail to STGL, Kompetenzfeld and LV Planung about todays updated Zeitwuensche. --- application/controllers/jobs/LVPlanJob.php | 349 ++++++++++++++++++++- 1 file changed, 348 insertions(+), 1 deletion(-) diff --git a/application/controllers/jobs/LVPlanJob.php b/application/controllers/jobs/LVPlanJob.php index 2688e5cc9..19359573a 100644 --- a/application/controllers/jobs/LVPlanJob.php +++ b/application/controllers/jobs/LVPlanJob.php @@ -19,7 +19,7 @@ */ if (!defined('BASEPATH')) exit('No direct script access allowed'); -class LVPlanJob extends CLI_Controller +class LVPlanJob extends JOB_Controller { /** * Initialize LVPlanJob Class @@ -149,4 +149,351 @@ class LVPlanJob extends CLI_Controller echo "Failed ".$fail."\n"; } } + + /** + * Send Mail to STGL, Kompetenzfeld and LV Planung about todays updated Zeitwuensche. + * STGL gets list only of lectors who updated future assigend courses concerning their STG. + * Kompetenzleitung gets list only of lectors who updated future assigend courses concerning their KF. + * LVPlanung gets list of lectors who updated future assigend courses. + */ + public function mailUpdatedZeitwuensche() + { + // Load models + $this->load->model('ressource/Stundenplandev_model', 'StundenplandevModel'); + $this->load->model('organisation/Studiensemester_model', 'StundiensemesterModel'); + $this->load->model('education/Lehreinheit_model', 'LehreinheitModel'); + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + $this->load->model('person/Person_model', 'PersonModel'); + + // Load libs + $this->load->library('MailLib'); + + // Load helpers + $this->load->helper('hlp_sancho_helper'); + + // Start Log Message + $this->logInfo('Mail updated Zeitwuensche started.'); + + // Get all lectors, who updated their Zeitwunsch today + $db = new DB_Model(); + $result = $db->execReadOnlyQuery(' + SELECT mitarbeiter_uid, von, bis + FROM campus.tbl_zeitwunsch_gueltigkeit + WHERE updateamum::date = NOW()::date + -- dont get updated, if they were also inserted today + AND insertamum::date != NOW()::date + '); + + if (!hasData($result)) + { + return; // No updated Zeitwuensche today + } + + $uidByStg_arr = array(); // Mail data for Studiengang + $uidByOe_arr = array(); // Mail data for Kompetenzfeld + + // Loop through lectors, who updated their Zeitwunsch today + $zwg_arr = getData($result); + foreach ($zwg_arr as $zwg) + { + $next = $this->StudiensemesterModel->getNext(); + + // Get Studiensemester concerend by Zeitwunschgueltigkeit + // If Zeitwunschgueltigkeit Ende is null, get only till next Studiensemester, as LVs will be only + // assigned for actual or next Studiensemester + $result = $this->StudiensemesterModel->getByDate( + $zwg->von, + is_null($zwg->bis) ? $next->retval[0]->ende : $zwg->bis + ); + $studiensemester_arr = getData($result); + + // Get Stundenplan entries of lector of Studiensemester concerned by Zeitwunschgueltigkeit + $result = $this->StundenplandevModel + ->getStundenplanData( + null, + implode(array_column($studiensemester_arr, 'studiensemester_kurzbz'), ', '), + null, + $zwg->mitarbeiter_uid, + null, + true //...but only from now on + ); + + if (!hasData($result)) + { + continue; // Continue if lector has no Stundenplan entries + } + + // Loop through Stundenplan entries + $stundenplanData_arr = getData($result); + foreach ($stundenplanData_arr as $stundenplanData) + { + // Get LE of Stundenplan entry + $result = $this->LehreinheitModel->load($stundenplanData->lehreinheit_id); + + if (!hasData($result)) + { + // Return log error msg if no LE found and continue + $this->logError(' + LVPlanJob / mailUpdatedZeitwuensche did not find Lehreinheit for '. $zwg->mitarbeiter_uid + ); + continue; + } + + $le = getData($result)[0]; + + // GET LV by LE of Stundenplan entry + $result = $this->LehrveranstaltungModel->load($le->lehrveranstaltung_id); + + if (!hasData($result)) + { + // Return log error msg if no LV found and continue + $this->logError(' + LVPlanJob / mailUpdatedZeitwuensche did not find Lehrveranstaltung for '. $zwg->mitarbeiter_uid + ); + continue; + } + + $lv = getData($result)[0]; + + // Build unique Studiengang array + if (!array_key_exists($lv->studiengang_kz, $uidByStg_arr)) + { + $uidByStg_arr[$lv->studiengang_kz] = array($zwg->mitarbeiter_uid); + + } + else + { + // Add unique lector array to Studiengang array + if (!in_array($zwg->mitarbeiter_uid, $uidByStg_arr[$lv->studiengang_kz])) + { + $uidByStg_arr[$lv->studiengang_kz][]= $zwg->mitarbeiter_uid; + } + } + + // Build unique Kompetenzfeld array + if (!array_key_exists($lv->oe_kurzbz, $uidByOe_arr)) + { + $uidByOe_arr[$lv->oe_kurzbz] = array($zwg->mitarbeiter_uid); + + } + else + { + // Add unique lector array to Kompetenzfeld array + if (!in_array($zwg->mitarbeiter_uid, $uidByOe_arr[$lv->oe_kurzbz])) + { + $uidByOe_arr[$lv->oe_kurzbz][]= $zwg->mitarbeiter_uid; + } + } + } + } + + // Send mail to STG Assistenz + $result = $this->_sendMailToStg($uidByStg_arr); + if (isError($result)) + { + $this->logError(getError($result)); + } + + // Send mail to Kompetenzfeld Leitung + $result = $this->_sendMailToKF($uidByOe_arr); + if (isError($result)) + { + $this->logError(getError($result)); + } + + // Send mail to LV Planung + $result = $this->_sendMailToLvPlanung($zwg_arr); + if (isError($result)) + { + $this->logError(getError($result)); + } + + // End Log Message + $this->logInfo('Mail updated Zeitwuensche ended.'); + } + + /** + * Send Mail to STGL Assistance about lectors, who teach LV assigend to the STG, and who updated Zeitwuensche. + * + * @param $data_arr + * @param $stg_bezeichnung + */ + private function _sendMailToStg($data_arr) + { + foreach ($data_arr as $stg_kurzbz => $uid_arr) + { + // Get STG eMail + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + $result = $this->StudiengangModel->load($stg_kurzbz); + $stgMail = $result->retval[0]->email; + + $lektorenTabelle = ' +
    + + + + + + '; + + foreach($uid_arr as $uid) + { + $person = $this->PersonModel->getByUid($uid); + $lektorenTabelle.= ' + + + + + '; + } + + $lektorenTabelle.= '
    NameUID
    '. getData($person)[0]->vorname. ' '. getData($person)[0]->nachname. '['. $uid. ']
    '; + + $contentData_arr = array( + 'datentabelle' => $lektorenTabelle + ); + + // Send mail + if (!sendSanchoMail( + 'ZeitwunschUpdateMail', + $contentData_arr, + $stgMail, + 'Änderung von Zeitwünschen', + 'sancho_header_min_bw.jpg', + 'sancho_footer_min_bw.jpg' + )) + { + $errorReceiverUid_arr[]= $stgMail; + } + } + + if (isset($errorReceiverUid_arr)) + { + return error('Mail updated Zeitwuensche could not be sent to :'. implode($errorReceiverUid_arr, ',')); + } + + return success(); + } + + /** + * Send Mail to Kompetenzfeld about lectors, who teach LV assigend to the Kompetenzfeld, and who updated Zeitwuensche. + * + * @param $data_arr + * @param $stg_bezeichnung + */ + private function _sendMailToKF($data_arr) + { + // Send mail to Komepetenzfeld Leitung + foreach ($data_arr as $oe_kurzbz => $uid_arr) + { + // Get KF Leitung eMail + $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel'); + $result = $this->BenutzerfunktionModel->loadWhere(array( + 'funktion_kurzbz' => 'Leitung', + 'oe_kurzbz' => $oe_kurzbz + )); + $kfMail = $result->retval[0]->uid. '@'. DOMAIN; + + $lektorenTabelle = ' + + + + + + + '; + + foreach($uid_arr as $uid) + { + $person = $this->PersonModel->getByUid($uid); + $lektorenTabelle.= ' + + + + + '; + } + + $lektorenTabelle.= '
    NameUID
    '. getData($person)[0]->vorname. ' '. getData($person)[0]->nachname. '['. $uid. ']
    '; + + $contentData_arr = array( + 'datentabelle' => $lektorenTabelle + ); + + // Send mail + if (!sendSanchoMail( + 'ZeitwunschUpdateMail', + $contentData_arr, + $kfMail, + 'Änderung von Zeitwünschen', + 'sancho_header_min_bw.jpg', + 'sancho_footer_min_bw.jpg' + )) + { + $errorReceiverUid_arr[]= $kfMail; + } + } + + if (isset($errorReceiverUid_arr)) + { + return error('Mail updated Zeitwuensche could not be sent to :'. implode($errorReceiverUid_arr, ',')); + } + + return success(); + } + + /** + * Send Mail to LV Planung about all lectors who updated Zeitwuensche. + * + * @param $data_arr + * @param $stg_bezeichnung + */ + private function _sendMailToLvPlanung($data_arr) + { + $lektorenTabelle = ' + + + + + + + '; + + foreach($data_arr as $lector) + { + $person = $this->PersonModel->getByUid($lector->mitarbeiter_uid); + $lektorenTabelle.= ' + + + + + '; + } + + $lektorenTabelle.= '
    NameUID
    '. getData($person)[0]->vorname. ' '. getData($person)[0]->nachname. '['. $lector->mitarbeiter_uid. ']
    '; + + $contentData_arr = array( + 'datentabelle' => $lektorenTabelle + ); + + // Send mail + if (!sendSanchoMail( + 'ZeitwunschUpdateMail', + $contentData_arr, + MAIL_LVPLAN, + 'Änderung von Zeitwünschen', + 'sancho_header_min_bw.jpg', + 'sancho_footer_min_bw.jpg' + )) + { + $errorReceiver = MAIL_LVPLAN; + } + + if (isset($errorReceiver)) + { + return error('Mail updated Zeitwuensche could not be sent to :'. $errorReceiver); + } + + return success(); + } } From f73f26c6686d3a95a88fb4f5f4ce1dfc4695322d Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 20 Dec 2021 11:52:26 +0100 Subject: [PATCH 033/132] Added STG mail receiver to be addressed, when lector changes Zeitwunsch... ...and when lector has already been assigned to a course. Only addressing Studiengaenge that are concerned by Zeitwunsch change of lector. LV must be assigned in the selected Studiensemester, but not in the past --- cis/private/profile/zeitwunsch.php | 67 +++++++++++++++++++++++++++++- locale/de-AT/zeitwunsch.php | 2 +- locale/en-US/zeitwunsch.php | 2 +- 3 files changed, 68 insertions(+), 3 deletions(-) diff --git a/cis/private/profile/zeitwunsch.php b/cis/private/profile/zeitwunsch.php index 2c2a7bce1..41a295095 100644 --- a/cis/private/profile/zeitwunsch.php +++ b/cis/private/profile/zeitwunsch.php @@ -32,10 +32,12 @@ require_once('../../../include/datum.class.php'); require_once('../../../include/zeitwunsch.class.php'); require_once('../../../include/zeitwunsch_gueltigkeit.class.php'); require_once('../../../include/studiensemester.class.php'); +require_once('../../../include/studiengang.class.php'); require_once('../../../include/zeitaufzeichnung_gd.class.php'); require_once('../../../include/benutzer.class.php'); require_once('../../../include/mitarbeiter.class.php'); require_once('../../../include/lehrveranstaltung.class.php'); +require_once('../../../include/lehreinheit.class.php'); require_once('../../../include/lehrstunde.class.php'); require_once('../../../include/phrasen.class.php'); require_once('../../../include/sprache.class.php'); @@ -354,6 +356,64 @@ function checkIsVerplant($uid, $studiensemester_kurzbz) return empty($lstd->result) ? false : true; } +/** + * Get Studiengaenge of STG assigend to LVs, to which lector is alredy assigend in + * the given Studiensemester. + * + * @param $uid + * @param $studiensemester_kurzbz + * @return array|void + */ +function getStgOfVerplant($uid, $studiensemester_kurzbz) +{ + $stg_arr = array(); // Mail data for Studiengang + + // Get Stundenplan entries of lector of Studiensemester concerned by Zeitwunschgueltigkeit + $lstd = new Lehrstunde(); + if (!$lstd->getStundenplanData( + 'stundenplandev', + null, + $studiensemester_kurzbz, + null, + $uid, + null, + true)) //...but only from now on + { + die($lstd->errormsg); + } + + // Loop through Stundenplan entries + foreach ($lstd->result as $row) + { + // Get LE of Stundenplan entry + $le = new Lehreinheit($row->lehreinheit_id); + + // GET LV by LE of Stundenplan entry + $lv = new Lehrveranstaltung($le->lehrveranstaltung_id); + + // Build Studiengang array + $stg_arr[] = $lv->studiengang_kz; + } + + // Make Studiengang array unique + return array_unique($stg_arr); +} + +/** + * Get Studiengang eMail Addresses. + * @param $stgKz_arr // Studiengang Kennzeichen Array + * @return array + */ +function getStgMail($stgKz_arr) +{ + $stgMail_arr = array(); + foreach($stgKz_arr as $stgKz) + { + $stg = new Studiengang($stgKz); + $stgMail_arr[]= $stg->email; + } + return $stgMail_arr; +} ?> @@ -664,11 +724,16 @@ function checkIsVerplant($uid, $studiensemester_kurzbz) echo '
    '; // end divCopyZWG echo '
    '; + + // Mail Adressen der Studiengaenge, wo Lektor ueber eine LV bereits verplant ist + $stgKzOfVerplant_arr = getStgOfVerplant($uid, $selected_ss); + $stgMail_arr = getStgMail($stgKzOfVerplant_arr); + echo '
    '; echo '
    '; echo '
    '; echo ''. $p->t("zeitwunsch/bearbeitungDeaktiviert"). ': '; - echo $p->t("zeitwunsch/bearbeitungDeaktiviertText", array($selected_ss, $p->t('global/studiengangsmanagement'))). ' + echo $p->t("zeitwunsch/bearbeitungDeaktiviertText", array($selected_ss, implode($stgMail_arr, '; '))). ' '. $p->t("zeitwunsch/bearbeitungAktivieren"). '
    '. $p->t("zeitwunsch/kompetenzfeldWirdInformiert") . ' '; diff --git a/locale/de-AT/zeitwunsch.php b/locale/de-AT/zeitwunsch.php index 35c8c3c99..e9d13a558 100644 --- a/locale/de-AT/zeitwunsch.php +++ b/locale/de-AT/zeitwunsch.php @@ -37,7 +37,7 @@ $this->phrasen['zeitwunsch/stundenBereitsVerplant']='Stunden für %s bereits ver $this->phrasen['zeitwunsch/fuer']='Zeitwunsch für %s  '; $this->phrasen['zeitwunsch/bearbeitungDeaktiviert']='Bearbeitung deaktiviert'; $this->phrasen['zeitwunsch/bearbeitungDeaktiviertText']='Ihnen wurden im %s bereits Lehrveranstaltung(en) zugeteilt.
    - Bitte stimmen Sie sich vor einer Änderung mit dem %s ab.
    + Bitte stimmen Sie sich vor einer Änderung per Mail mit den betroffenen Studiengängen ab.
    Möchten Sie trotzdem ohne Abstimmung bzw. nach bereits erfolgter Abstimmung fortsetzen?'; $this->phrasen['zeitwunsch/bearbeitungAktivieren']='Bearbeitung aktivieren'; $this->phrasen['zeitwunsch/kompetenzfeldWirdInformiert']= 'INFO: Kompetenzfeld wird über die Änderung per Mail informiert'; diff --git a/locale/en-US/zeitwunsch.php b/locale/en-US/zeitwunsch.php index d12863710..7aa8a6932 100644 --- a/locale/en-US/zeitwunsch.php +++ b/locale/en-US/zeitwunsch.php @@ -37,7 +37,7 @@ $this->phrasen['zeitwunsch/stundenBereitsVerplant']='Hours already scheduled for $this->phrasen['zeitwunsch/fuer']='Preferred time for %s  '; $this->phrasen['zeitwunsch/bearbeitungDeaktiviert']='Editing disabled'; $this->phrasen['zeitwunsch/bearbeitungDeaktiviertText']='You have already been assigned to course(s) in %s.
    - Please agree with %s before making a change.
    + Please agree per Mail with the degree programs concerned, before making a change.
    Would you still like to continue without agreement or after having agreed?'; $this->phrasen['zeitwunsch/bearbeitungAktivieren']='Enable editing'; $this->phrasen['zeitwunsch/kompetenzfeldWirdInformiert']= 'INFO: The field of competence will be informed of your changes by email'; From 3202ce877f3f6b0e2a86079254a48522258637f5 Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 4 Jan 2022 15:48:53 +0100 Subject: [PATCH 034/132] =?UTF-8?q?Added=20new=20Zeitsperretyp=20'Zeitverf?= =?UTF-8?q?=C3=BCgbarkeit'=20(Positive=20Zeitsperre)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- system/dbupdate_3.3.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/system/dbupdate_3.3.php b/system/dbupdate_3.3.php index 5f0880888..017cdfebf 100644 --- a/system/dbupdate_3.3.php +++ b/system/dbupdate_3.3.php @@ -5790,6 +5790,20 @@ if (!$result = @$db->db_query("SELECT zeitwunsch_id FROM campus.tbl_zeitwunsch L // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo '

    Pruefe Tabellen und Attribute!

    '; +// Insert postive Zeitsperre 'Zeitverfuegbarkeit' to tbl_zeitsperretyp +if($result = @$db->db_query("SELECT 1 FROM campus.tbl_zeitsperretyp WHERE zeitsperretyp_kurzbz = 'ZVerfueg';")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO campus.tbl_zeitsperretyp(zeitsperretyp_kurzbz, beschreibung) VALUES('ZVerfueg', 'Zeitverfügbarkeit');"; + + if(!$db->db_query($qry)) + echo 'campus.tbl_zeitsperretyp '.$db->db_last_error().'
    '; + else + echo 'campus.tbl_zeitsperretyp: Added value \'ZVerfueg\'
    '; + } +} + $tabellen=array( "bis.tbl_bisorgform" => array("bisorgform_kurzbz","code","bezeichnung"), "bis.tbl_archiv" => array("archiv_id","studiensemester_kurzbz","meldung","html","studiengang_kz","insertamum","insertvon","typ"), From 8dc178fb00c56c0acf533e93ca294abb46e75f18 Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 4 Jan 2022 15:51:16 +0100 Subject: [PATCH 035/132] =?UTF-8?q?Adapted=20Tempus=20Wochenplan=20GUI=20t?= =?UTF-8?q?o=20display=20positive=20Zeitsperre=20'Zeitverf=C3=BCgbarkeit'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/globals.inc.php | 15 ++++++++------- include/wochenplan.class.php | 4 +++- include/zeitwunsch.class.php | 23 +++++++++++++---------- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/include/globals.inc.php b/include/globals.inc.php index bbe9cf738..da2fda055 100644 --- a/include/globals.inc.php +++ b/include/globals.inc.php @@ -2,13 +2,14 @@ // Hintergrundfarben fuer Tabellen beim Zeitwunsch global $cfgStdBgcolor; $cfgStdBgcolor=array(); - $cfgStdBgcolor[0]="#CC0000"; - $cfgStdBgcolor[1]="#FF2200"; - $cfgStdBgcolor[2]="#FF9922"; - $cfgStdBgcolor[3]="#FFFF55"; - $cfgStdBgcolor[4]="#C0ECC3"; - $cfgStdBgcolor[5]="#48FA66"; - $cfgStdBgcolor[6]="#CCFFCC"; + $cfgStdBgcolor[0]="#CC0000"; // rot + $cfgStdBgcolor[1]="#FF2200"; // hellrot + $cfgStdBgcolor[2]="#FF9922"; // orange + $cfgStdBgcolor[3]="#FFFF55"; // gelb + $cfgStdBgcolor[4]="#C0ECC3"; // hellgrün mittel + $cfgStdBgcolor[5]="#48FA66"; // dunkelgrün mittel + $cfgStdBgcolor[6]="#CCFFCC"; // hellgrün heller + $cfgStdBgcolor[7]="#59b359 "; // dunkelgrün dunkler // Mehrsprachige Wochentage global $tagbez; diff --git a/include/wochenplan.class.php b/include/wochenplan.class.php index 29b4db23f..0ac59a9ff 100644 --- a/include/wochenplan.class.php +++ b/include/wochenplan.class.php @@ -1235,7 +1235,9 @@ class wochenplan extends basis_db if (isset($wunsch[$i][$j])) { $index=$wunsch[$i][$j]; - if ($index==-3) + + // Negative und positive Zeitsperren beruecksichtigen + if ($index==-3 || $index == 4) { //Wenn eine Zeitsperre eingetragen ist, dann diese im Tooltiptext anzeigen $zeitsperre = new zeitsperre(); diff --git a/include/zeitwunsch.class.php b/include/zeitwunsch.class.php index 4e94ac059..c471bc494 100644 --- a/include/zeitwunsch.class.php +++ b/include/zeitwunsch.class.php @@ -250,7 +250,7 @@ class zeitwunsch extends basis_db // Zeitsperren abfragen $sql=" SELECT - vondatum,vonstunde,bisdatum,bisstunde + zeitsperretyp_kurzbz, vondatum,vonstunde,bisdatum,bisstunde FROM campus.tbl_zeitsperre WHERE @@ -265,6 +265,8 @@ class zeitwunsch extends basis_db } else { + // Zeitsperren negativ (-3) gewichten. + // Ausnahme: positive Zeitsperren: diese positiv (4) gewichten. while($row = $this->db_fetch_object()) { $beginn=montag($datum); @@ -274,20 +276,21 @@ class zeitwunsch extends basis_db //echo "\n".$date_iso."\n".$row->vondatum."\n"; if ($date_iso>$row->vondatum && $date_iso<$row->bisdatum) for ($j=$this->min_stunde;$j<=$this->max_stunde;$j++) - $this->zeitwunsch[$i][$j]=-3; + $this->zeitwunsch[$i][$j] = $row->zeitsperretyp_kurzbz == 'ZVerfueg' ? 4 : -3; + if ($date_iso==$row->vondatum && $date_iso<$row->bisdatum) { if (is_null($row->vonstunde)) $row->vonstunde=$this->min_stunde; for ($j=$row->vonstunde;$j<=$this->max_stunde;$j++) - $this->zeitwunsch[$i][$j]=-3; + $this->zeitwunsch[$i][$j] = $row->zeitsperretyp_kurzbz == 'ZVerfueg' ? 4 : -3; } if ($date_iso>$row->vondatum && $date_iso==$row->bisdatum) { if (is_null($row->bisstunde)) $row->bisstunde=$this->max_stunde; for ($j=$this->min_stunde;$j<=$row->bisstunde;$j++) - $this->zeitwunsch[$i][$j]=-3; + $this->zeitwunsch[$i][$j] = $row->zeitsperretyp_kurzbz == 'ZVerfueg' ? 4 : -3; } if ($date_iso==$row->vondatum && $date_iso==$row->bisdatum) { @@ -296,7 +299,7 @@ class zeitwunsch extends basis_db if (is_null($row->bisstunde)) $row->bisstunde=$this->max_stunde; for ($j=$row->vonstunde;$j<=$row->bisstunde;$j++) - $this->zeitwunsch[$i][$j]=-3; + $this->zeitwunsch[$i][$j] = $row->zeitsperretyp_kurzbz == 'ZVerfueg' ? 4 : -3; } $beginn=jump_day($beginn,1); } @@ -357,7 +360,7 @@ class zeitwunsch extends basis_db // Zeitsperren abfragen $sql=" SELECT - vondatum,vonstunde,bisdatum,bisstunde + zeitsperretyp_kurzbz, vondatum,vonstunde,bisdatum,bisstunde FROM campus.tbl_zeitsperre WHERE @@ -379,20 +382,20 @@ class zeitwunsch extends basis_db //echo "\n".$date_iso."\n".$row->vondatum."\n"; if ($date_iso>$row->vondatum && $date_iso<$row->bisdatum) for ($j=$this->min_stunde;$j<=$this->max_stunde;$j++) - $this->zeitwunsch[$i][$j]=-3; + $this->zeitwunsch[$i][$j]= $row->zeitsperretyp_kurzbz == 'ZVerfueg' ? 4 : -3; if ($date_iso==$row->vondatum && $date_iso<$row->bisdatum) { if (is_null($row->vonstunde)) $row->vonstunde=$this->min_stunde; for ($j=$row->vonstunde;$j<=$this->max_stunde;$j++) - $this->zeitwunsch[$i][$j]=-3; + $this->zeitwunsch[$i][$j]= $row->zeitsperretyp_kurzbz == 'ZVerfueg' ? 4 : -3; } if ($date_iso>$row->vondatum && $date_iso==$row->bisdatum) { if (is_null($row->bisstunde)) $row->bisstunde=$this->max_stunde; for ($j=$this->min_stunde;$j<=$row->bisstunde;$j++) - $this->zeitwunsch[$i][$j]=-3; + $this->zeitwunsch[$i][$j]= $row->zeitsperretyp_kurzbz == 'ZVerfueg' ? 4 : -3; } if ($date_iso==$row->vondatum && $date_iso==$row->bisdatum) { @@ -401,7 +404,7 @@ class zeitwunsch extends basis_db if (is_null($row->bisstunde)) $row->bisstunde=$this->max_stunde; for ($j=$row->vonstunde;$j<=$row->bisstunde;$j++) - $this->zeitwunsch[$i][$j]=-3; + $this->zeitwunsch[$i][$j]= $row->zeitsperretyp_kurzbz == 'ZVerfueg' ? 4 : -3; } $beginn=jump_day($beginn,1); } From c88b9a8297c4010eb51e4c20ccea0c938c2b4f59 Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 4 Jan 2022 17:00:16 +0100 Subject: [PATCH 036/132] Adapted TEMPUS Kollisionencheck for positive Zeitsperre 'Zeitverfuegbarkeit' Positive Zeitsperre 'Zeitverfuegbarkeit' will not appear as collision. --- include/lehreinheit.class.php | 7 +++++-- include/lehrstunde.class.php | 8 ++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/include/lehreinheit.class.php b/include/lehreinheit.class.php index 23677a6e3..7d407cee4 100644 --- a/include/lehreinheit.class.php +++ b/include/lehreinheit.class.php @@ -681,8 +681,11 @@ class lehreinheit extends basis_db else { $row=$this->db_fetch_object($erg_zs); - $this->errormsg="Kollision (Zeitsperre): $row->zeitsperre_id|$row->mitarbeiter_uid|$row->zeitsperretyp_kurzbz|$row->bezeichnung|$row->vondatum/$row->vonstunde-$row->bisdatum/$row->bisstunde - $row->vertretung_uid"; - return false; + if ($row->zeitsperretyp_kurzbz != 'ZVerfueg') + { + $this->errormsg = "Kollision (Zeitsperre): $row->zeitsperre_id|$row->mitarbeiter_uid|$row->zeitsperretyp_kurzbz|$row->bezeichnung|$row->vondatum/$row->vonstunde-$row->bisdatum/$row->bisstunde - $row->vertretung_uid"; + return false; + } } } return true; diff --git a/include/lehrstunde.class.php b/include/lehrstunde.class.php index 5cec78f3d..e2bba04e6 100644 --- a/include/lehrstunde.class.php +++ b/include/lehrstunde.class.php @@ -878,8 +878,12 @@ class lehrstunde extends basis_db if ($anz_zs!=0) { $row = $this->db_fetch_object($erg_zs); - $this->errormsg="Kollision (Zeitsperre): $row->zeitsperre_id|$row->lektor|$row->zeitsperretyp_kurzbz - $row->vondatum/$row->vonstunde|$row->bisdatum/$row->bisstunde"; - return true; + + if ($row->zeitsperretyp_kurzbz != 'ZVerfueg') + { + $this->errormsg="Kollision (Zeitsperre): $row->zeitsperre_id|$row->lektor|$row->zeitsperretyp_kurzbz - $row->vondatum/$row->vonstunde|$row->bisdatum/$row->bisstunde"; + return true; + } } return false; } From 08322920bcdbf4b48cd65eb5dc781f5ec3689216 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96sterreicher?= Date: Tue, 18 Jan 2022 18:06:22 +0100 Subject: [PATCH 037/132] =?UTF-8?q?Problem=20behoben=20beim=20Abfragen=20v?= =?UTF-8?q?on=20Zeitw=C3=BCnschen=20mit=20NULL=20G=C3=BCltigkeit=20Anzeige?= =?UTF-8?q?=20korrigiert=20wenn=20Zweitw=C3=BCnsche=20unter=20der=20Woche?= =?UTF-8?q?=20korrigiert=20werden?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/lvplanung/timetable-week.xul.php | 4 +- include/zeitwunsch.class.php | 50 ++++++++++++------------ 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/content/lvplanung/timetable-week.xul.php b/content/lvplanung/timetable-week.xul.php index 7e3a144dd..fd55b5393 100644 --- a/content/lvplanung/timetable-week.xul.php +++ b/content/lvplanung/timetable-week.xul.php @@ -681,12 +681,12 @@ while ($begin<=$ende) { $wunsch=new zeitwunsch(); if ($type=='lektor') - if ($wunsch->loadPerson($pers_uid,$datum)) + if ($wunsch->loadPerson($pers_uid,montag($datum))) $zeitwunsch=$wunsch->zeitwunsch; else $error_msg.=$wunsch->errormsg; if ($aktion=='lva_single_search' || $aktion=='lva_multi_search') - if ($wunsch->loadZwLE($lva_id,$datum)) + if ($wunsch->loadZwLE($lva_id,montag($datum))) $zeitwunsch=$wunsch->zeitwunsch; else $error_msg.=$wunsch->errormsg; diff --git a/include/zeitwunsch.class.php b/include/zeitwunsch.class.php index c471bc494..0e6270504 100644 --- a/include/zeitwunsch.class.php +++ b/include/zeitwunsch.class.php @@ -46,7 +46,7 @@ class zeitwunsch extends basis_db public function __construct() { parent::__construct(); - + $this->init(); } @@ -107,7 +107,7 @@ class zeitwunsch extends basis_db return true; } - + /** * Speichert einen Zeitwunsch in die Datenbank * Wenn $new auf true gesetzt ist wird ein neuer Datensatz @@ -122,7 +122,7 @@ class zeitwunsch extends basis_db if($this->new) { - $qry = 'INSERT INTO campus.tbl_zeitwunsch (mitarbeiter_uid, tag, stunde, gewicht, + $qry = 'INSERT INTO campus.tbl_zeitwunsch (mitarbeiter_uid, tag, stunde, gewicht, insertamum, insertvon, updateamum, updatevon, zeitwunsch_gueltigkeit_id) VALUES('. $this->db_add_param($this->mitarbeiter_uid).','. $this->db_add_param($this->tag, FHC_INTEGER).','. @@ -140,9 +140,9 @@ class zeitwunsch extends basis_db ' gewicht='.$this->db_add_param($this->gewicht, FHC_INTEGER).', '. ' updateamum='.$this->db_add_param($this->updateamum).', '. ' updatevon='.$this->db_add_param($this->updatevon). - " WHERE - mitarbeiter_uid=".$this->db_add_param($this->mitarbeiter_uid, FHC_STRING, false)." - AND tag=".$this->db_add_param($this->tag, FHC_INTEGER)." + " WHERE + mitarbeiter_uid=".$this->db_add_param($this->mitarbeiter_uid, FHC_STRING, false)." + AND tag=".$this->db_add_param($this->tag, FHC_INTEGER)." AND stunde=".$this->db_add_param($this->stunde, FHC_INTEGER). " AND zeitwunsch_gueltigkeit_id=".$this->db_add_param($this->zeitwunsch_gueltigkeit_id, FHC_INTEGER); } @@ -167,7 +167,7 @@ class zeitwunsch extends basis_db public function loadByZWG($uid, $zeitwunsch_gueltigkeit_id) { $qry = ' - SELECT * + SELECT * FROM campus.tbl_zeitwunsch JOIN campus.tbl_zeitwunsch_gueltigkeit zwg USING (zeitwunsch_gueltigkeit_id) WHERE zwg.mitarbeiter_uid = ' . $this->db_add_param($uid) . ' @@ -213,11 +213,11 @@ class zeitwunsch extends basis_db } $qry = " - SELECT * + SELECT * FROM campus.tbl_zeitwunsch JOIN campus.tbl_zeitwunsch_gueltigkeit zwg USING (zeitwunsch_gueltigkeit_id) WHERE zwg.mitarbeiter_uid=". $this->db_add_param($uid). " - AND ". $this->db_add_param(date('Y-m-d', $datum)). " BETWEEN von AND bis; + AND ". $this->db_add_param(date('Y-m-d', $datum)). " BETWEEN von AND COALESCE(bis,'2999-01-01'); "; @@ -249,13 +249,13 @@ class zeitwunsch extends basis_db // Zeitsperren abfragen $sql=" - SELECT + SELECT zeitsperretyp_kurzbz, vondatum,vonstunde,bisdatum,bisstunde - FROM + FROM campus.tbl_zeitsperre - WHERE + WHERE mitarbeiter_uid=".$this->db_add_param($uid)." - AND vondatum<=".$this->db_add_param($ende)." + AND vondatum<=".$this->db_add_param($ende)." AND bisdatum>=".$this->db_add_param($start); if(!$this->db_query($sql)) @@ -334,8 +334,8 @@ class zeitwunsch extends basis_db $sql_query='SELECT tag,stunde,min(gewicht) AS gewicht FROM campus.tbl_zeitwunsch JOIN campus.tbl_zeitwunsch_gueltigkeit zwg USING (zeitwunsch_gueltigkeit_id) - WHERE zwg.mitarbeiter_uid IN ('.$sql_query_le.') - AND '. $this->db_add_param(date('Y-m-d', $datum)). ' BETWEEN von AND bis + WHERE zwg.mitarbeiter_uid IN ('.$sql_query_le.') + AND '. $this->db_add_param(date('Y-m-d', $datum)). ' BETWEEN von AND COALESCE(bis,\'2999-01-01\') GROUP BY tag,stunde;'; // Zeitwuensche abfragen @@ -359,13 +359,13 @@ class zeitwunsch extends basis_db // Zeitsperren abfragen $sql=" - SELECT + SELECT zeitsperretyp_kurzbz, vondatum,vonstunde,bisdatum,bisstunde - FROM + FROM campus.tbl_zeitsperre - WHERE - mitarbeiter_uid IN ($sql_query_le) - AND vondatum<=".$this->db_add_param($ende)." + WHERE + mitarbeiter_uid IN ($sql_query_le) + AND vondatum<=".$this->db_add_param($ende)." AND bisdatum>=".$this->db_add_param($start); if(!$this->db_query($sql)) @@ -424,10 +424,10 @@ class zeitwunsch extends basis_db */ function exists($uid, $zwg_id, $stunde, $tag) { - $qry = "SELECT 1 FROM campus.tbl_zeitwunsch - WHERE - mitarbeiter_uid=".$this->db_add_param($uid)." - AND stunde=".$this->db_add_param($stunde, FHC_INTEGER)." + $qry = "SELECT 1 FROM campus.tbl_zeitwunsch + WHERE + mitarbeiter_uid=".$this->db_add_param($uid)." + AND stunde=".$this->db_add_param($stunde, FHC_INTEGER)." AND tag=".$this->db_add_param($tag, FHC_INTEGER). " AND zeitwunsch_gueltigkeit_id = ".$this->db_add_param($zwg_id, FHC_INTEGER); if($this->db_query($qry)) @@ -445,4 +445,4 @@ class zeitwunsch extends basis_db } } -?> \ No newline at end of file +?> From b8ac076bdb4ddef7b1b8369deacfb0c57eae4165 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Wed, 19 Jan 2022 17:56:30 +0100 Subject: [PATCH 038/132] projektbeurteilungs uebersicht hinzugefuegt --- .../education/Projektbetreuer_model.php | 77 ++++++++++++++ .../models/system/Variablenname_model.php | 9 +- system/filtersupdate.php | 25 +++++ system/phrasesupdate.php | 100 ++++++++++++++++++ 4 files changed, 210 insertions(+), 1 deletion(-) diff --git a/application/models/education/Projektbetreuer_model.php b/application/models/education/Projektbetreuer_model.php index 4da88e344..22c7be1ec 100644 --- a/application/models/education/Projektbetreuer_model.php +++ b/application/models/education/Projektbetreuer_model.php @@ -60,4 +60,81 @@ class Projektbetreuer_model extends DB_Model return $this->execQuery($qry, array($zugangstoken)); } + + /** + * Holt Zweitbegutachter einer Projektarbeit mit Mail. + * @param $erstbegutachter_person_id int person_id des Erstbegutachters + * @param $projektarbeit_id int + * @param $student_uid string uid des Studenten der Arbeit abgibt + * @return object | bool + */ + public function getZweitbegutachterWithToken($erstbegutachter_person_id, $projektarbeit_id, $student_uid) + { + $qry_betr = "SELECT betr.person_id, betr.projektarbeit_id, pers.anrede, betr.zugangstoken, betr.zugangstoken_gueltigbis, tbl_benutzer.uid, kontakt, + trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as voller_name, + CASE WHEN tbl_benutzer.uid IS NULL THEN kontakt ELSE tbl_benutzer.uid || '@".DOMAIN."' END AS email, abg.abgabedatum + FROM lehre.tbl_projektbetreuer betr + JOIN lehre.tbl_projektarbeit parb ON betr.projektarbeit_id = parb.projektarbeit_id + JOIN public.tbl_person pers ON betr.person_id = pers.person_id + LEFT JOIN public.tbl_kontakt ON pers.person_id = tbl_kontakt.person_id AND kontakttyp = 'email' AND zustellung = true + LEFT JOIN public.tbl_benutzer ON pers.person_id = tbl_benutzer.person_id + LEFT JOIN campus.tbl_paabgabe abg ON betr.projektarbeit_id = abg.projektarbeit_id AND abg.paabgabetyp_kurzbz = 'end' + WHERE betr.betreuerart_kurzbz = 'Zweitbegutachter' + AND betr.projektarbeit_id = ? + AND parb.student_uid = ? + AND EXISTS ( + SELECT 1 FROM lehre.tbl_projektbetreuer + WHERE person_id = ? + AND betreuerart_kurzbz = 'Erstbegutachter' + AND projektarbeit_id = betr.projektarbeit_id + ) + AND (tbl_benutzer.aktiv OR tbl_benutzer.aktiv IS NULL) + ORDER BY betr.insertamum DESC + LIMIT 1"; + + return $this->execQuery($qry_betr, array($projektarbeit_id, $student_uid, $erstbegutachter_person_id)); + } + + /** + * Generiert neuen Token für externen Zweitbetreuer. + * @param int $zweitbegutachter_person_id + * @param int $projektarbeit_id + * @return object | bool + */ + public function generateZweitbegutachterToken($zweitbegutachter_person_id, $projektarbeit_id) + { + $betreuerUidQry = "SELECT uid, zugangstoken, zugangstoken_gueltigbis, tbl_projektbetreuer.person_id + FROM lehre.tbl_projektbetreuer + JOIN public.tbl_person USING(person_id) + LEFT JOIN public.tbl_benutzer USING(person_id) + WHERE projektarbeit_id = ? + AND tbl_projektbetreuer.person_id = ? + AND betreuerart_kurzbz = 'Zweitbegutachter' + LIMIT 1"; + + $betreueruidres = $this->execQuery($betreuerUidQry, array($projektarbeit_id, $zweitbegutachter_person_id)); + + if (!hasData($betreueruidres)) + return error('Zweitbegutachter nicht gefunden'); + + $row_betr = getData($betreueruidres)[0]; + + if (!isset($row_betr->uid)) + { + do { + $token = generateToken(16); + $qry_tokencheck = $this->load(array('zugangstoken' => $token)); + } while(hasData($qry_tokencheck)); + + $result = $this->update( + array('projektarbeit_id' => $projektarbeit_id, + 'person_id' => $row_betr->person_id, + 'betreuerart_kurzbz' => 'Zweitbegutachter'), + array('zugangstoken' => $token, + 'zugangstoken_gueltigbis' => date('Y-m-d', strtotime('+1 year'))) + ); + + return $result; + } + } } diff --git a/application/models/system/Variablenname_model.php b/application/models/system/Variablenname_model.php index 869a03275..33ace3c8d 100644 --- a/application/models/system/Variablenname_model.php +++ b/application/models/system/Variablenname_model.php @@ -12,7 +12,14 @@ class Variablenname_model extends DB_Model ) sem WHERE start > now() LIMIT 1;', - 'infocenter_studiensgangtyp' => 'SELECT infocenter_studiensgangtyp FROM public.tbl_variablenname LIMIT 1' + 'infocenter_studiensgangtyp' => 'SELECT infocenter_studiensgangtyp FROM public.tbl_variablenname LIMIT 1;', + 'projektuebersicht_studiensemester' => 'SELECT studiensemester_kurzbz FROM ( + SELECT DISTINCT ON (studienjahr_kurzbz) start, studiensemester_kurzbz + FROM public.tbl_studiensemester + ORDER BY studienjahr_kurzbz, start + ) sem + WHERE start > now() + LIMIT 1;' ); /** diff --git a/system/filtersupdate.php b/system/filtersupdate.php index 1a1717339..521e6b4dd 100644 --- a/system/filtersupdate.php +++ b/system/filtersupdate.php @@ -981,6 +981,31 @@ $filters = array( } ', 'oe_kurzbz' => null, + ), + array( + 'app' => 'projektarbeitsbeurteilung', + 'dataset_name' => 'projektuebersicht', + 'filter_kurzbz' => 'alleProjekte', + 'description' => '{Projektübersicht}', + 'sort' => 1, + 'default_filter' => true, + 'filter' => ' + { + "name": "Projektübersicht", + "columns": [ + {"name": "ProjectWorkID"}, + {"name": "ErstNachname"}, + {"name": "ErstAbgeschickt"}, + {"name": "ZweitNachname"}, + {"name": "ZweitAbgeschickt"}, + {"name": "StudentNachname"}, + {"name": "Note"}, + {"name": "Abgabedatum"} + ], + "filters": [] + } + ', + 'oe_kurzbz' => null, ) ); diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index e05ee6086..a5bceb40d 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -9772,6 +9772,106 @@ Any unusual occurrences ) ) ), + array( + 'app' => 'projektarbeitsbeurteilung', + 'category' => 'projektarbeitsbeurteilung', + 'phrase' => 'projektarbeitsbeurteilungUebersicht', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Projektarbeitsbeurteilungsübersicht', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Projekt Work Assessment Overview', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'projektarbeitsbeurteilung', + 'category' => 'projektarbeitsbeurteilung', + 'phrase' => 'abgabedatum', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Abgabe - Datum', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Upload - Date', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'projektarbeitsbeurteilung', + 'category' => 'projektarbeitsbeurteilung', + 'phrase' => 'freischaltung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Freischaltung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Activation', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'projektarbeitsbeurteilung', + 'category' => 'projektarbeitsbeurteilung', + 'phrase' => 'resendToken', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Token an Zweit-Begutachter*in senden', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Send token to Second Assessor', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'projektarbeitsbeurteilung', + 'category' => 'projektarbeitsbeurteilung', + 'phrase' => 'freischalten', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Freischalten', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Unlock', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'anrechnung', From 094f75ef6105f7d0a79344bbb7f2f764f581951b Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Fri, 21 Jan 2022 00:41:13 +0100 Subject: [PATCH 039/132] - Projektbetreuer_model.php: method getBetreuerOfProjektarbeit for getting Betreuer by betreuerart - phrasesupdate.php: added Projektarbeitsbeurteilung phrases --- .../education/Projektbetreuer_model.php | 29 ++++++- system/phrasesupdate.php | 77 +++++++++++++++++++ 2 files changed, 105 insertions(+), 1 deletion(-) diff --git a/application/models/education/Projektbetreuer_model.php b/application/models/education/Projektbetreuer_model.php index 22c7be1ec..f3af03f86 100644 --- a/application/models/education/Projektbetreuer_model.php +++ b/application/models/education/Projektbetreuer_model.php @@ -42,6 +42,31 @@ class Projektbetreuer_model extends DB_Model } } + /** + * Checks if a Projektarbeit has a Betreuer of a certain type + * @param int $projektarbeit_id + * @param string $betreuerart_kurzbz + * @return array success with number of Betreuer or error + */ + public function getBetreuerOfProjektarbeit($projektarbeit_id, $betreuerart_kurzbz) + { + $this->addSelect('pers.person_id, betreuerart_kurzbz, vorname, nachname, + anrede, titelpre, titelpost, gebdatum, geschlecht, + ben.uid, ben.aktiv as benutzer_aktiv, ben.alias, student_uid'); + $this->addJoin('lehre.tbl_projektarbeit', 'projektarbeit_id'); + $this->addJoin('public.tbl_person pers', 'person_id'); + $this->addJoin('public.tbl_benutzer ben', 'person_id', 'LEFT'); + $this->addOrder('pers.person_id'); + + return $this->loadWhere( + array( + 'projektarbeit_id' => $projektarbeit_id, + 'betreuerart_kurzbz' => $betreuerart_kurzbz, + 'ben.aktiv' => true + ) + ); + } + /** * Get Projektbetreuer data by authentification token * @param $zugangstoken @@ -99,7 +124,7 @@ class Projektbetreuer_model extends DB_Model * Generiert neuen Token für externen Zweitbetreuer. * @param int $zweitbegutachter_person_id * @param int $projektarbeit_id - * @return object | bool + * @return array */ public function generateZweitbegutachterToken($zweitbegutachter_person_id, $projektarbeit_id) { @@ -136,5 +161,7 @@ class Projektbetreuer_model extends DB_Model return $result; } + else + return success("Account vorhanden, kein Token benötigt"); } } diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index a5bceb40d..95919b833 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -9872,6 +9872,83 @@ Any unusual occurrences ) ) ), + array( + 'app' => 'projektarbeitsbeurteilung', + 'category' => 'projektarbeitsbeurteilung', + 'phrase' => 'kommissionellePruefungHinweis', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Dies ist eine zur kommissionellen Wiederholungsprüfung vorgelegte Bachelorarbeit. Die Note sollte daher erst nach Abstimmung mit allen Kommissionsmitgliedern abgesendet werden.', + 'description' => '', + ), + array( + 'sprache' => 'English', + 'text' => 'This bachelor thesis is submitted for the Bachelor Examination before a Committee. It should be graded after consultation with all committee members.', + 'description' => '', + ) + ) + ), + array( + 'app' => 'projektarbeitsbeurteilung', + 'category' => 'projektarbeitsbeurteilung', + 'phrase' => 'kommissionMailSenden', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Infomail an Kommissionsmitglieder senden', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Sent info mail to commission members', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'projektarbeitsbeurteilung', + 'category' => 'projektarbeitsbeurteilung', + 'phrase' => 'kommissionMailGesendet', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Mail an Kommissionsmitglieder gesendet', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Sent mail to commission members', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'projektarbeitsbeurteilung', + 'category' => 'projektarbeitsbeurteilung', + 'phrase' => 'kommissionMailFehler', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Fehler beim Senden der Mail an Kommission', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Error when sending mail to commission members', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'anrechnung', From 37c19aafc26ec08b2b8a90c96e7398028706a436 Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Fri, 21 Jan 2022 02:50:39 +0100 Subject: [PATCH 040/132] Added Betreuerart "Kommission" to lehre.tbl_betreuerart --- system/dbupdate_3.3.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/system/dbupdate_3.3.php b/system/dbupdate_3.3.php index 50f5098c8..ba79ed66a 100644 --- a/system/dbupdate_3.3.php +++ b/system/dbupdate_3.3.php @@ -5716,6 +5716,21 @@ if ($result = $db->db_query("SELECT * FROM pg_class WHERE relname='idx_tbl_zeita } } +// Betreuerart 'Kommission' hinzufügen +if($result = $db->db_query("SELECT 1 FROM lehre.tbl_betreuerart WHERE betreuerart_kurzbz='Kommission'")) +{ + if($db->db_num_rows($result)==0) + { + + $qry = "INSERT INTO lehre.tbl_betreuerart(betreuerart_kurzbz,beschreibung,aktiv) VALUES('Kommission','Mitglied der Kommission',TRUE);"; + + if(!$db->db_query($qry)) + echo 'Betreuerart: '.$db->db_last_error().'
    '; + else + echo '
    Neue Betreuerart Kommission in lehre.tbl_betreuerart hinzugefügt'; + } +} + // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo '

    Pruefe Tabellen und Attribute!

    '; From cf7cfd7cd25d64ffa0976bdb34dc1cc2f6bd0cf2 Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Fri, 21 Jan 2022 05:15:36 +0100 Subject: [PATCH 041/132] sorted results of geBetreuerOfProjektarbeit method of Projektbetreuer_model.php and added mitarbeiter data to the result --- .../education/Projektbetreuer_model.php | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/application/models/education/Projektbetreuer_model.php b/application/models/education/Projektbetreuer_model.php index f3af03f86..4a04b8813 100644 --- a/application/models/education/Projektbetreuer_model.php +++ b/application/models/education/Projektbetreuer_model.php @@ -43,28 +43,29 @@ class Projektbetreuer_model extends DB_Model } /** - * Checks if a Projektarbeit has a Betreuer of a certain type + * Gets Betreuer of a certain Type of a Projektarbeit. * @param int $projektarbeit_id * @param string $betreuerart_kurzbz * @return array success with number of Betreuer or error */ public function getBetreuerOfProjektarbeit($projektarbeit_id, $betreuerart_kurzbz) { - $this->addSelect('pers.person_id, betreuerart_kurzbz, vorname, nachname, - anrede, titelpre, titelpost, gebdatum, geschlecht, - ben.uid, ben.aktiv as benutzer_aktiv, ben.alias, student_uid'); - $this->addJoin('lehre.tbl_projektarbeit', 'projektarbeit_id'); - $this->addJoin('public.tbl_person pers', 'person_id'); - $this->addJoin('public.tbl_benutzer ben', 'person_id', 'LEFT'); - $this->addOrder('pers.person_id'); + $qry = "SELECT pers.person_id, betreuerart_kurzbz, vorname, nachname, + anrede, titelpre, titelpost, gebdatum, geschlecht, + ben.uid, ben.alias, ma.personalnummer, mitarbeiter_uid, student_uid + FROM lehre.tbl_projektarbeit + JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id) + JOIN public.tbl_person pers USING (person_id) + LEFT JOIN public.tbl_benutzer ben USING (person_id) + LEFT JOIN public.tbl_mitarbeiter ma ON ben.uid = ma.mitarbeiter_uid + WHERE ben.aktiv + AND projektarbeit_id = ? + AND betreuerart_kurzbz = ? + ORDER BY CASE WHEN ma.mitarbeiter_uid IS NULL THEN 1 ELSE 0 END, /*Mitarbeiter first*/ + CASE WHEN ben.uid IS NULL THEN 1 ELSE 0 END, + ben.insertamum"; - return $this->loadWhere( - array( - 'projektarbeit_id' => $projektarbeit_id, - 'betreuerart_kurzbz' => $betreuerart_kurzbz, - 'ben.aktiv' => true - ) - ); + return $this->execQuery($qry, array($projektarbeit_id, $betreuerart_kurzbz)); } /** From bda323ba05bd013bec6927008ab0a3bf478b4e96 Mon Sep 17 00:00:00 2001 From: ma0068 Date: Fri, 21 Jan 2022 10:26:31 +0100 Subject: [PATCH 042/132] =?UTF-8?q?Adaptierung=20Abfrage=20f=C3=BCr=20ZGV?= =?UTF-8?q?=20Master?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/prestudent.class.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/include/prestudent.class.php b/include/prestudent.class.php index eebe39d01..f2194fb61 100644 --- a/include/prestudent.class.php +++ b/include/prestudent.class.php @@ -2489,10 +2489,14 @@ class prestudent extends person $qry = "SELECT UPPER(tbl_studiengang.typ || tbl_studiengang.kurzbz) as kuerzel FROM - public.tbl_prestudent + public.tbl_prestudent pt JOIN public.tbl_prestudentstatus USING (prestudent_id) JOIN public.tbl_studiengang USING (studiengang_kz) WHERE person_id = ".$this->db_add_param($person_id, FHC_INTEGER)." + AND NOT EXISTS + (SELECT * FROM public.tbl_prestudentstatus ps + WHERE ps.prestudent_id = pt.prestudent_id + AND status_kurzbz = 'Abbrecher' ) AND status_kurzbz in ('Absolvent','Diplomand','Unterbrecher','Student') AND typ in ('b','m','d') ORDER BY status_kurzbz ASC From f9b93f55e4c97c1ec8fe57ab091a497930d88fef Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Tue, 25 Jan 2022 12:40:41 +0100 Subject: [PATCH 043/132] - Projektbetreuer model getBetreuerOfProjektarbeit: added full name and projekttyp_kurzbz are also returned - abgabe_lektor_details.php: grading only possible after end upload of thesis, and only beginning with SS2022 - added projektbeurteilung phrases to core locale and phrasesupdate.php --- .../education/Projektbetreuer_model.php | 5 +- cis/private/lehre/abgabe_lektor_details.php | 29 +++- locale/de-AT/abgabetool.php | 2 + locale/en-US/abgabetool.php | 2 + system/phrasesupdate.php | 124 +++++++++++++++++- 5 files changed, 153 insertions(+), 9 deletions(-) diff --git a/application/models/education/Projektbetreuer_model.php b/application/models/education/Projektbetreuer_model.php index 4a04b8813..b6fbe8a72 100644 --- a/application/models/education/Projektbetreuer_model.php +++ b/application/models/education/Projektbetreuer_model.php @@ -51,9 +51,10 @@ class Projektbetreuer_model extends DB_Model public function getBetreuerOfProjektarbeit($projektarbeit_id, $betreuerart_kurzbz) { $qry = "SELECT pers.person_id, betreuerart_kurzbz, vorname, nachname, - anrede, titelpre, titelpost, gebdatum, geschlecht, + trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as voller_name, + anrede, titelpre, titelpost, gebdatum, geschlecht, pa.projekttyp_kurzbz, ben.uid, ben.alias, ma.personalnummer, mitarbeiter_uid, student_uid - FROM lehre.tbl_projektarbeit + FROM lehre.tbl_projektarbeit pa JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id) JOIN public.tbl_person pers USING (person_id) LEFT JOIN public.tbl_benutzer ben USING (person_id) diff --git a/cis/private/lehre/abgabe_lektor_details.php b/cis/private/lehre/abgabe_lektor_details.php index 9f74d5cf8..9d89daa49 100644 --- a/cis/private/lehre/abgabe_lektor_details.php +++ b/cis/private/lehre/abgabe_lektor_details.php @@ -120,13 +120,13 @@ if(!$projektarbeit_obj->load($projektarbeit_id)) $titel = $projektarbeit_obj->titel; $student_uid = $projektarbeit_obj->student_uid; -// paarbeit sollte nur ab SS2021 online bewertet werden +// paarbeit sollte nur ab SS2022 online bewertet werden $qry_sem="SELECT 1 FROM lehre.tbl_projektarbeit JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) JOIN public.tbl_studiensemester USING(studiensemester_kurzbz) WHERE projektarbeit_id=".$db->db_add_param($projektarbeit_id, FHC_INTEGER)." - AND tbl_studiensemester.start::date >= (SELECT start FROM public.tbl_studiensemester WHERE studiensemester_kurzbz = 'SS2021')::date + AND tbl_studiensemester.start::date >= (SELECT start FROM public.tbl_studiensemester WHERE studiensemester_kurzbz = 'SS2022')::date LIMIT 1"; $result_sem=$db->db_query($qry_sem); $num_rows_sem = $db->db_num_rows($result_sem); @@ -135,6 +135,20 @@ if($num_rows_sem < 0) echo "".$p->t('abgabetool/fehlerAktualitaetProjektarbeit')."
     "; } +// Endupload sollte vor Benotung durchgeführt worden sein +$qry_endupload="SELECT 1 + FROM campus.tbl_paabgabe + WHERE projektarbeit_id=".$db->db_add_param($projektarbeit_id, FHC_INTEGER)." + AND paabgabetyp_kurzbz='end' + AND abgabedatum IS NOT NULL + LIMIT 1"; +$result_endupload=$db->db_query($qry_endupload); +$num_rows_endupload = $db->db_num_rows($result_endupload); +if($num_rows_endupload < 0) +{ + echo "".$p->t('abgabetool/fehlerErmittelnEnduploadProjektarbeit')."
     "; +} + // Zweitbegutachter holen if($betreuerart=="Erstbegutachter") { @@ -457,7 +471,11 @@ while ($result_nam && $row_nam=$db->db_fetch_object($result_nam)) $htmlstr .= "\n"; $htmlstr .= ""; $htmlstr .= ""; diff --git a/locale/de-AT/abgabetool.php b/locale/de-AT/abgabetool.php index 7943868ad..c4b17318b 100644 --- a/locale/de-AT/abgabetool.php +++ b/locale/de-AT/abgabetool.php @@ -1,6 +1,7 @@ phrasen['abgabetool/abgabetool']='Abgabetool'; $this->phrasen['abgabetool/aeltereParbeitBenoten']='Projektarbeit für älteres Semester, bitte Word-Formular zur Benotung verwenden!'; +$this->phrasen['abgabetool/keinEnduploadErfolgt']='Endupload ist noch nicht erfolgt'; $this->phrasen['abgabetool/typ']='Typ'; $this->phrasen['abgabetool/titel']='Titel'; $this->phrasen['abgabetool/betreuerart']='Betreuerart'; @@ -89,4 +90,5 @@ $this->phrasen['abgabetool/zweitBegutachterEmailFehlt']='keine Zustellmail für $this->phrasen['abgabetool/projektbeurteilungDownload']='Projektbeurteilung herunterladen'; $this->phrasen['abgabetool/projektbeurteilungErstDownload']='Erst-/Begutachter'; $this->phrasen['abgabetool/projektbeurteilungZweitDownload']='Zweitbegutachter'; +$this->phrasen['abgabetool/fehlerErmittelnEndabgabeProjektarbeit']='Fehler beim Ermitteln des Enduplaods der Projektarbeit'; ?> diff --git a/locale/en-US/abgabetool.php b/locale/en-US/abgabetool.php index c4e6eb7bd..b05456faa 100644 --- a/locale/en-US/abgabetool.php +++ b/locale/en-US/abgabetool.php @@ -1,6 +1,7 @@ phrasen['abgabetool/abgabetool']='Submission tool'; $this->phrasen['abgabetool/aeltereParbeitBenoten']='Thesis handed in for older semester, please use word form for assessment!'; +$this->phrasen['abgabetool/keinEnduploadErfolgt']='Final version not uploaded yet'; $this->phrasen['abgabetool/typ']='Type'; $this->phrasen['abgabetool/titel']='Title'; $this->phrasen['abgabetool/betreuerart']='Supervisor type'; @@ -89,4 +90,5 @@ $this->phrasen['abgabetool/zweitBegutachterEmailFehlt']='Second assessor has no $this->phrasen['abgabetool/projektbeurteilungDownload']='Thesis-Assessment download'; $this->phrasen['abgabetool/projektbeurteilungErstDownload']='First-/Assessor'; $this->phrasen['abgabetool/projektbeurteilungZweitDownload']='Second Assessor'; +$this->phrasen['abgabetool/fehlerErmittelnEndabgabeProjektarbeit']='Error when getting endupload of project work'; ?> diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 95919b833..524a28448 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -9903,7 +9903,7 @@ Any unusual occurrences ), array( 'sprache' => 'English', - 'text' => 'Sent info mail to commission members', + 'text' => 'Send info mail to commission members', 'description' => '', 'insertvon' => 'system' ) @@ -9923,7 +9923,7 @@ Any unusual occurrences ), array( 'sprache' => 'English', - 'text' => 'Sent mail to commission members', + 'text' => 'Sent mail to committee members', 'description' => '', 'insertvon' => 'system' ) @@ -9949,6 +9949,126 @@ Any unusual occurrences ) ) ), + array( + 'app' => 'projektarbeitsbeurteilung', + 'category' => 'projektarbeitsbeurteilung', + 'phrase' => 'zweitbetreuerBewertungFehlt', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Absenden erst nach Abschluss der Bewertung durch Zweitbegutachter*in möglich', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Sending only possible after completion of assessment by Second Assessor', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'projektarbeitsbeurteilung', + 'category' => 'projektarbeitsbeurteilung', + 'phrase' => 'nichtErfuellt', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'nicht erfüllt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'not fulfilled', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'projektarbeitsbeurteilung', + 'category' => 'projektarbeitsbeurteilung', + 'phrase' => 'mindestanforderungErfuellt', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Mindestanforderung erfüllt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'minimum requirement fulfilled', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'projektarbeitsbeurteilung', + 'category' => 'projektarbeitsbeurteilung', + 'phrase' => 'inWeitenTeilenErfuellt', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'in weiten Teilen erfüllt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'fulfilled for the most part', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'projektarbeitsbeurteilung', + 'category' => 'projektarbeitsbeurteilung', + 'phrase' => 'vollstaendigErfuellt', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'vollständig erfüllt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'fully fulfilled', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'projektarbeitsbeurteilung', + 'category' => 'projektarbeitsbeurteilung', + 'phrase' => 'kommissionsmitglieder', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Kommissionsmitglieder', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Commitee members', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'anrechnung', From ce381276183ca9be89e1d2207d60ad608364e6a9 Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Tue, 25 Jan 2022 12:55:29 +0100 Subject: [PATCH 044/132] - FAS hide Projektarbeit Punkte --- content/student/studentprojektarbeitoverlay.xul.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/student/studentprojektarbeitoverlay.xul.php b/content/student/studentprojektarbeitoverlay.xul.php index 4d8ab4835..c522ad4da 100644 --- a/content/student/studentprojektarbeitoverlay.xul.php +++ b/content/student/studentprojektarbeitoverlay.xul.php @@ -492,7 +492,7 @@ $is_hidden = (!defined('FAS_STUDIERENDE_PROJEKTARBEIT_VERTRAGSDETAILS_ANZEIGEN') - + From 1a8b267a8909c3f599fc7f43ebf3ed5df4e9a500 Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Tue, 25 Jan 2022 14:55:01 +0100 Subject: [PATCH 045/132] Projektbetreuer_model.php: getBetreuerOfProjektarbeit returns only one row for each person --- application/models/education/Projektbetreuer_model.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/application/models/education/Projektbetreuer_model.php b/application/models/education/Projektbetreuer_model.php index b6fbe8a72..0200f6468 100644 --- a/application/models/education/Projektbetreuer_model.php +++ b/application/models/education/Projektbetreuer_model.php @@ -44,13 +44,14 @@ class Projektbetreuer_model extends DB_Model /** * Gets Betreuer of a certain Type of a Projektarbeit. + * Returns one row for each person. * @param int $projektarbeit_id * @param string $betreuerart_kurzbz * @return array success with number of Betreuer or error */ public function getBetreuerOfProjektarbeit($projektarbeit_id, $betreuerart_kurzbz) { - $qry = "SELECT pers.person_id, betreuerart_kurzbz, vorname, nachname, + $qry = "SELECT DISTINCT ON (pers.person_id) pers.person_id, betreuerart_kurzbz, vorname, nachname, trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as voller_name, anrede, titelpre, titelpost, gebdatum, geschlecht, pa.projekttyp_kurzbz, ben.uid, ben.alias, ma.personalnummer, mitarbeiter_uid, student_uid @@ -62,8 +63,8 @@ class Projektbetreuer_model extends DB_Model WHERE ben.aktiv AND projektarbeit_id = ? AND betreuerart_kurzbz = ? - ORDER BY CASE WHEN ma.mitarbeiter_uid IS NULL THEN 1 ELSE 0 END, /*Mitarbeiter first*/ - CASE WHEN ben.uid IS NULL THEN 1 ELSE 0 END, + ORDER BY pers.person_id, CASE WHEN ma.mitarbeiter_uid IS NULL THEN 1 ELSE 0 END, /*Mitarbeiter account first*/ + CASE WHEN ben.uid IS NULL THEN 1 ELSE 0 END, /*user with account first*/ ben.insertamum"; return $this->execQuery($qry, array($projektarbeit_id, $betreuerart_kurzbz)); From 37cd868a44f5cd696306bb4823f683b307cb31b2 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Tue, 1 Feb 2022 09:15:22 +0100 Subject: [PATCH 046/132] uebersichtseite angepasst und mail beim updaten entfernt --- system/filtersupdate.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/system/filtersupdate.php b/system/filtersupdate.php index 521e6b4dd..9ccc9200f 100644 --- a/system/filtersupdate.php +++ b/system/filtersupdate.php @@ -1000,7 +1000,8 @@ $filters = array( {"name": "ZweitAbgeschickt"}, {"name": "StudentNachname"}, {"name": "Note"}, - {"name": "Abgabedatum"} + {"name": "Abgabedatum"}, + {"name": "Studiengang"} ], "filters": [] } From 1e5674318768d8397de99a21765956c11a8a8fcf Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Tue, 1 Feb 2022 22:44:58 +0100 Subject: [PATCH 047/132] added projektarbeitsbeurteilung phrases --- system/phrasesupdate.php | 122 +++++++++++++++++++++++++++++++++++---- 1 file changed, 111 insertions(+), 11 deletions(-) diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 524a28448..7934d1e07 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -8675,12 +8675,12 @@ Any unusual occurrences array( 'app' => 'projektarbeitsbeurteilung', 'category' => 'projektarbeitsbeurteilung', - 'phrase' => 'plagiatscheckUnauffaellig', + 'phrase' => 'plagiatscheckBeschreibung', 'insertvon' => 'system', 'phrases' => array( array( 'sprache' => 'German', - 'text' => 'Der Plagiatscheck ist unauffällig.', + 'text' => 'Der Plagiatscheck wurde durchgeführt und bestätigt, dass der zentrale Inhalt der Arbeit im erforderlichen Ausmaß eigenständig verfasst wurde (vgl. Satzungsteil Studienrechtliche Bestimmungen / Prüfungsordnung, § 18 Abs. 2 und 3).', 'description' => '', 'insertvon' => 'system' ), @@ -8820,7 +8820,7 @@ Any unusual occurrences 'phrases' => array( array( 'sprache' => 'German', - 'text' => 'Der Lösungsansatz ist dem Stand der Technik entsprechend argumentiert und zeigt ein adäquates Problemverständnis.', + 'text' => 'Der Lösungsansatz ist für das Thema geeignet und entspricht dem Stand der Technik.', 'description' => '', 'insertvon' => 'system' ), @@ -8860,7 +8860,7 @@ Any unusual occurrences 'phrases' => array( array( 'sprache' => 'German', - 'text' => 'Die methodische Vorgangsweise ist in Bezug auf die Ausrichtung der Arbeit (technisch-ingenieurwissenschaftlich, sozial-wirtschaftswissenschaftlich…) angemessen, gut begründet und wird korrekt umgesetzt.', + 'text' => 'Das Vorgehen ist in Bezug auf die fachspezifische Ausrichtung der Arbeit angemessen, anhand der Fachliteratur begründet und korrekt umgesetzt.', 'description' => '', 'insertvon' => 'system' ), @@ -8900,7 +8900,7 @@ Any unusual occurrences 'phrases' => array( array( 'sprache' => 'German', - 'text' => 'Die Frage- bzw. Aufgabenstellungen wurden zielführend beantwortet; die Ergebnisse werden diskutiert.', + 'text' => 'Die Ergebnisse werden im Lichte der Fragestellung interpretiert und kritisch diskutiert im Hinblick auf ihren Mehrwert für Forschung und/oder Berufspraxis. Visualisierungen unterstützen die Argumentation.', 'description' => '', 'insertvon' => 'system' ), @@ -9000,7 +9000,7 @@ Any unusual occurrences 'phrases' => array( array( 'sprache' => 'German', - 'text' => 'Die Arbeit ist schlüssig aufgebaut und gut strukturiert.', + 'text' => 'Die Arbeit ist schlüssig strukturiert.', 'description' => '', 'insertvon' => 'system' ), @@ -9040,7 +9040,7 @@ Any unusual occurrences 'phrases' => array( array( 'sprache' => 'German', - 'text' => 'Der Stil entspricht einer wissenschaftlichen Arbeit. Die Arbeit ist flüssig lesbar und weist eine klare, eindeutige und gendergerechte Sprache auf.', + 'text' => 'Rechtschreibung und Grammatik sind korrekt. Die Verwendung von Fachsprache ist angemessen. Die Anforderungen an gendergerechte Sprache sind nach den geltenden Richtlinien umgesetzt.', 'description' => '', 'insertvon' => 'system' ), @@ -9120,7 +9120,7 @@ Any unusual occurrences 'phrases' => array( array( 'sprache' => 'German', - 'text' => 'Die verwendeten Quellen sind passend, aktuell und werden ausreichend variiert.', + 'text' => 'Quellen und Literatur sind für die wissenschaftliche Auseinandersetzung mit dem Thema der Arbeit relevant, geben den aktuellen Stand der Forschung wieder und decken das Thema ab.', 'description' => '', 'insertvon' => 'system' ), @@ -9340,13 +9340,33 @@ Any unusual occurrences 'phrases' => array( array( 'sprache' => 'German', - 'text' => 'Liegt die Punkteanzahl bei den Kriterien "1 - 5" oder "6 - 10" in Summe unter 50%%, ist die %s insgesamt als negativ zu beurteilen.', + 'text' => 'Liegt die Punkteanzahl bei den Kriterien "1 - 5" oder "6 - 10" in Summe unter 50%, ist die {0} insgesamt als negativ zu beurteilen.', 'description' => '', 'insertvon' => 'system' ), array( 'sprache' => 'English', - 'text' => 'If the number of points for the criteria "1 - 5" or "6 - 10" is below 50%% in total, the %s is to be assessed as negative overall.', + 'text' => 'If the number of points for the criteria "1 - 5" or "6 - 10" is below 50% in total, the {0} is to be assessed as negative overall.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'projektarbeitsbeurteilung', + 'category' => 'projektarbeitsbeurteilung', + 'phrase' => 'notenschluesselHinweisNullPunkteEinKriterium', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Falls ein Kriterium mit 0 Punkten bewertet wird, ist die {0} insgesamt als negativ zu beurteilen.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'If the number of points for one criteria is 0, the {0} is to be assessed as negative overall.', 'description' => '', 'insertvon' => 'system' ) @@ -9540,7 +9560,7 @@ Any unusual occurrences 'phrases' => array( array( 'sprache' => 'German', - 'text' => 'Ist die Arbeit gut strukturiert?', + 'text' => 'Ist die Arbeit schlüssig strukturiert?', 'description' => '', 'insertvon' => 'system' ), @@ -10069,6 +10089,86 @@ Any unusual occurrences ) ) ), + array( + 'app' => 'projektarbeitsbeurteilung', + 'category' => 'projektarbeitsbeurteilung', + 'phrase' => 'plagiatscheckNichtGesetzt', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Plagiatscheck auffällig, negative Beurteilung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Plagiarism check not passed, negative assessment', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'projektarbeitsbeurteilung', + 'category' => 'projektarbeitsbeurteilung', + 'phrase' => 'titelBearbeiten', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Titel bearbeiten', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Edit title', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'projektarbeitsbeurteilung', + 'category' => 'projektarbeitsbeurteilung', + 'phrase' => 'titelGespeichert', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Titel gespeichert', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Title saved', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'projektarbeitsbeurteilung', + 'category' => 'projektarbeitsbeurteilung', + 'phrase' => 'plagiatscheckHinweisNegativeBeurteilung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => '(Bei Plagiat wird die Arbeit negativ bewertet.)', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '(Plagiarism leads to a negative grade.)', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'anrechnung', From 67a86d070575f7033d8dd3444d26a9a9e12a3c4c Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Tue, 1 Feb 2022 22:56:20 +0100 Subject: [PATCH 048/132] online assessment or projektarbeit only after SS2022: also added check when sending mails to Begutachter --- cis/private/lehre/abgabe_student_details.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cis/private/lehre/abgabe_student_details.php b/cis/private/lehre/abgabe_student_details.php index e9384390b..ffb065b49 100644 --- a/cis/private/lehre/abgabe_student_details.php +++ b/cis/private/lehre/abgabe_student_details.php @@ -423,13 +423,13 @@ if($command=="update" && $error!=true) } else { - // paarbeit sollte nur ab SS2021 online bewertet werden + // paarbeit sollte nur ab SS2022 online bewertet werden $qry_sem="SELECT 1 FROM lehre.tbl_projektarbeit JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) JOIN public.tbl_studiensemester USING(studiensemester_kurzbz) WHERE projektarbeit_id=".$db->db_add_param($projektarbeit_id, FHC_INTEGER)." - AND tbl_studiensemester.start::date >= (SELECT start FROM public.tbl_studiensemester WHERE studiensemester_kurzbz = 'SS2021')::date + AND tbl_studiensemester.start::date >= (SELECT start FROM public.tbl_studiensemester WHERE studiensemester_kurzbz = 'SS2022')::date LIMIT 1"; $result_sem=$db->db_query($qry_sem); From 4ae4be7eedbc7d3a83c6aa8173c77e6e6fab1455 Mon Sep 17 00:00:00 2001 From: Cris Date: Wed, 2 Feb 2022 16:13:41 +0100 Subject: [PATCH 049/132] Fixed Error 'Class 'Studiensemester' not found' in MA Zeitwuensche (VILESCI) --- vilesci/personen/zeitwunsch.php | 1 + 1 file changed, 1 insertion(+) diff --git a/vilesci/personen/zeitwunsch.php b/vilesci/personen/zeitwunsch.php index 1bc9dd13e..726218302 100644 --- a/vilesci/personen/zeitwunsch.php +++ b/vilesci/personen/zeitwunsch.php @@ -34,6 +34,7 @@ require_once('../../include/datum.class.php'); require_once('../../include/benutzerberechtigung.class.php'); require_once('../../include/zeitwunsch.class.php'); require_once('../../include/zeitwunsch_gueltigkeit.class.php'); +require_once('../../include/studiensemester.class.php'); if (!$db = new basis_db()) die('Es konnte keine Verbindung zum Server aufgebaut werden.'); From 08c35c6500ecedbbe1012842204ad526ddec4ac7 Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 3 Feb 2022 09:16:56 +0100 Subject: [PATCH 050/132] Fixed Error 'Class 'Studiensemester' not found' in MA Zeitwuensche (VILESCI) --- vilesci/personen/zeitwunsch.php | 1 + 1 file changed, 1 insertion(+) diff --git a/vilesci/personen/zeitwunsch.php b/vilesci/personen/zeitwunsch.php index 1bc9dd13e..726218302 100644 --- a/vilesci/personen/zeitwunsch.php +++ b/vilesci/personen/zeitwunsch.php @@ -34,6 +34,7 @@ require_once('../../include/datum.class.php'); require_once('../../include/benutzerberechtigung.class.php'); require_once('../../include/zeitwunsch.class.php'); require_once('../../include/zeitwunsch_gueltigkeit.class.php'); +require_once('../../include/studiensemester.class.php'); if (!$db = new basis_db()) die('Es konnte keine Verbindung zum Server aufgebaut werden.'); From 0f871dc89f78481efcbd7e6a429a75f00fa4a31d Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 8 Feb 2022 17:51:58 +0100 Subject: [PATCH 051/132] Added: Methode getVonBis() in Zeitsperre Class MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Liefert die Zeitsperren eines Users innerhalb einer bestimmten Zeitspanne. Einschränkung nach Zeitsperrentyp möglich. --- include/zeitsperre.class.php | 55 ++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/include/zeitsperre.class.php b/include/zeitsperre.class.php index 936a8d32f..7343494aa 100644 --- a/include/zeitsperre.class.php +++ b/include/zeitsperre.class.php @@ -520,5 +520,60 @@ class zeitsperre extends basis_db return $this->bisdatum; } + + /** + * Liefert die Zeitsperren eines Users innerhalb einer bestimmten Zeitspanne. + * Einschränkung nach Zeitsperrentyp möglich. + * + * @param $uid + * @param $von string Datum im Format YYYY-MM-DD + * @param $bis string Datum im Format YYYY-MM-DD + * @param null $zeitsperretyp_kurzbz + * @return bool + */ + public function getVonBis($uid, $von, $bis, $zeitsperretyp_kurzbz = null) + { + $qry = ' + SELECT + zeitsperre_id, zeitsperretyp_kurzbz, vondatum, vonstunde, bisdatum, bisstunde + FROM + campus.tbl_zeitsperre + LEFT JOIN campus.tbl_zeitsperretyp USING (zeitsperretyp_kurzbz) + WHERE + mitarbeiter_uid = '. $this->db_add_param($uid). ' + AND ( + (vondatum BETWEEN '.$this->db_add_param($von).' AND '.$this->db_add_param($bis).') + OR + (bisdatum BETWEEN '.$this->db_add_param($von).' AND '.$this->db_add_param($bis).') + )'; + + if (!is_null($zeitsperretyp_kurzbz)) + { + $qry.= ' + AND zeitsperretyp_kurzbz = '. $this->db_add_param($zeitsperretyp_kurzbz); + } + + if (!$this->db_query($qry)) + { + $this->errormsg=$this->db_last_error(); + return false; + } + else + { + while($row = $this->db_fetch_object()) + { + $obj = new stdClass(); + $obj->zeitsperre_id = $row->zeitsperre_id; + $obj->zeitsperretyp_kurzbz = $row->zeitsperretyp_kurzbz; + $obj->vondatum = $row->vondatum; + $obj->vonstunde = $row->vonstunde; + $obj->bisdatum = $row->bisdatum; + $obj->bisstunde = $row->bisstunde; + + $this->result[]= $obj; + } + return true; + } + } } ?> From 8a848f7169833bb280dbf1d75159d646e1529faa Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 8 Feb 2022 17:53:22 +0100 Subject: [PATCH 052/132] =?UTF-8?q?Added:=20Anzeige=20in=20Tempus=20=C3=BC?= =?UTF-8?q?ber=20Zeitverfuegbarkeit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wenn ein Lektor eine positive Zeitsperre hinterlegt hat, wird diese im Tempus nun angezeigt. --- content/lvplanung/stpl-week-overlay.xul.php | 4 ++++ rdf/lehreinheit-lvplan.rdf.php | 13 ++++++++++++- skin/tempus.css | 6 ++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/content/lvplanung/stpl-week-overlay.xul.php b/content/lvplanung/stpl-week-overlay.xul.php index 58d73d47d..0e6c083ce 100644 --- a/content/lvplanung/stpl-week-overlay.xul.php +++ b/content/lvplanung/stpl-week-overlay.xul.php @@ -247,6 +247,10 @@ echo ' + + diff --git a/rdf/lehreinheit-lvplan.rdf.php b/rdf/lehreinheit-lvplan.rdf.php index a7c89ac98..c3c53a7b6 100644 --- a/rdf/lehreinheit-lvplan.rdf.php +++ b/rdf/lehreinheit-lvplan.rdf.php @@ -40,6 +40,8 @@ require_once('../include/mitarbeiter.class.php'); require_once('../include/zeitaufzeichnung_gd.class.php'); require_once('../include/lehreinheitmitarbeiter.class.php'); require_once('../include/vertrag.class.php'); +require_once('../include/studiensemester.class.php'); +require_once('../include/zeitsperre.class.php'); $uid=get_uid(); $error_msg=''; @@ -63,7 +65,7 @@ if (isset($_GET['sem'])) else $sem=0; if (isset($_GET['lektor'])) - $lektor=$_GET['lektor']; + $lektor=$_GET['lektor']; else $lektor=$uid; if (isset($_GET['ver'])) @@ -136,6 +138,14 @@ if (!$error_msg) die ('Fehler bei Methode getLehreinheitLVPL(): '.$lehreinheit->errormsg); $lva=$lehreinheit->lehreinheiten; $rdf_url='http://www.technikum-wien.at/lehreinheit-lvplan/'; + +// Positive Zeitsperre 'Zeitverfuegbarkeit' holen +$ss = new Studiensemester($studiensemester); + +$zeitsperre = new Zeitsperre(); +$zeitsperre->getVonBis($lektor, $ss->start, $ss->ende, 'ZVerfueg'); + +$zeitverfuegbarkeit = count($zeitsperre->result) > 0 ? 'Zeit verfügbar' : ''; ?> 0) '.$anzahl_notizen.' '.$l->lehreinheit_id[0].' '.$vertragsstatus.' + '. $zeitverfuegbarkeit. ' '; } diff --git a/skin/tempus.css b/skin/tempus.css index de025ef27..7684fddb1 100644 --- a/skin/tempus.css +++ b/skin/tempus.css @@ -20,6 +20,12 @@ label.tempus_vertrag_info font-size: x-small } +label.tempus_lektor_verfuegbarezeit +{ + font-weight: bold; + color: green; +} + label.kalenderwoche { font-size: medium; From 6d62019447951a5a77396311b941ffe9740c71db Mon Sep 17 00:00:00 2001 From: Cris Date: Wed, 9 Feb 2022 09:55:39 +0100 Subject: [PATCH 053/132] Changed: Zeitverfuegbarkeit bei Zeitsperren im CIS nicht anzeigen --- cis/private/profile/zeitsperre_resturlaub.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cis/private/profile/zeitsperre_resturlaub.php b/cis/private/profile/zeitsperre_resturlaub.php index 6ceaff350..b82d2776c 100644 --- a/cis/private/profile/zeitsperre_resturlaub.php +++ b/cis/private/profile/zeitsperre_resturlaub.php @@ -646,7 +646,7 @@ if(count($zeit->result)>0) "; - if ($row->zeitsperretyp_kurzbz == 'DienstV') + if ($row->zeitsperretyp_kurzbz == 'DienstV' || $row->zeitsperretyp_kurzbz == 'ZVerfueg') $content_table .= ''; else if ($row->vondatum < $gesperrt_bis AND in_array($row->zeitsperretyp_kurzbz,$typen_arr)) $content_table .= ''; From b0212627ce08876c32e71c09f5be52d75414572b Mon Sep 17 00:00:00 2001 From: Cris Date: Wed, 9 Feb 2022 09:56:19 +0100 Subject: [PATCH 054/132] =?UTF-8?q?Changed:=20Zeitverfuegbarkeit=20bei=20Z?= =?UTF-8?q?eitsperren=20im=20CIS=20nicht=20l=C3=B6sch-/editierbar=20machen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cis/private/profile/zeitsperre_resturlaub.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cis/private/profile/zeitsperre_resturlaub.php b/cis/private/profile/zeitsperre_resturlaub.php index b82d2776c..2fa9de7ca 100644 --- a/cis/private/profile/zeitsperre_resturlaub.php +++ b/cis/private/profile/zeitsperre_resturlaub.php @@ -658,7 +658,7 @@ if(count($zeit->result)>0) { $content_table.="\n"; } - elseif($row->zeitsperretyp_kurzbz!='Urlaub') + elseif($row->zeitsperretyp_kurzbz!='Urlaub' && $row->zeitsperretyp_kurzbz != 'ZVerfueg') { $content_table.="\n"; } @@ -718,6 +718,11 @@ if($result = $db->db_query($qry)) { while($row=$db->db_fetch_object($result)) { + if ($row->zeitsperretyp_kurzbz === 'ZVerfueg') + { + continue; + } + if($zeitsperre->zeitsperretyp_kurzbz == $row->zeitsperretyp_kurzbz) $content_form.= ""; else From 5d2adedd37d61d0134e7aa0292ffd64c1aa06ea7 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Wed, 9 Feb 2022 10:35:39 +0100 Subject: [PATCH 055/132] Kommission in der uebersicht hinzugefuegt --- system/filtersupdate.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/system/filtersupdate.php b/system/filtersupdate.php index 9ccc9200f..62014a5bb 100644 --- a/system/filtersupdate.php +++ b/system/filtersupdate.php @@ -1001,7 +1001,8 @@ $filters = array( {"name": "StudentNachname"}, {"name": "Note"}, {"name": "Abgabedatum"}, - {"name": "Studiengang"} + {"name": "Studiengang"}, + {"name": "Kommissionsmitglieder"} ], "filters": [] } From d9aa24cced18e9533240be18c5671cf563accf00 Mon Sep 17 00:00:00 2001 From: Paolo Date: Thu, 10 Feb 2022 11:42:39 +0100 Subject: [PATCH 056/132] - Removed phpci.yml file - Removed tests/codeception/ directory - Changed tests/codesniffer/FHComplete/ruleset.xml - Removed tests/codesniffer/FHComplete/Sniffs - Removed tests/codesniffer/FHComplete/tests - Added tests/phpmd/rulesets.xml --- phpci.yml | 127 - tests/codeception/_bootstrap.php | 2 - tests/codeception/_data/.placeholder | 0 tests/codeception/_output/.placeholder | 0 .../codeception/_support/AcceptanceTester.php | 26 - tests/codeception/_support/ApiTester.php | 39 - .../codeception/_support/FunctionalTester.php | 26 - tests/codeception/_support/UnitTester.php | 25 - .../_generated/AcceptanceTesterActions.php | 2436 ----------------- .../_support/_generated/ApiTesterActions.php | 1382 ---------- .../_generated/FunctionalTesterActions.php | 204 -- .../_support/_generated/UnitTesterActions.php | 204 -- tests/codeception/codeception.dist.yml | 27 - .../tests/acceptance.suite.yml.dist | 21 - .../tests/acceptance/CISLoginPage.php | 6 - .../acceptance/VileSciSearchPersonCept.php | 11 - .../tests/acceptance/VileSciStartPage.php | 26 - .../tests/acceptance/_bootstrap.php | 2 - tests/codeception/tests/api.suite.yml.dist | 20 - tests/codeception/tests/api/_bootstrap.php | 2 - tests/codeception/tests/api/generate.php | 178 -- tests/codeception/tests/api/template_call.tpl | 5 - tests/codeception/tests/api/template_head.tpl | 6 - .../tests/api/v1/AccountingAufteilungCept.php | 11 - .../api/v1/AccountingBestelldetailCept.php | 11 - .../api/v1/AccountingBestelldetailtagCept.php | 11 - .../api/v1/AccountingBestellstatusCept.php | 11 - .../tests/api/v1/AccountingBestellungCept.php | 11 - .../api/v1/AccountingBestellungtagCept.php | 11 - .../tests/api/v1/AccountingBuchungCept.php | 11 - .../api/v1/AccountingBuchungstypCept.php | 11 - .../tests/api/v1/AccountingBudgetCept.php | 11 - .../tests/api/v1/AccountingKontoCept.php | 11 - .../api/v1/AccountingKostenstelleCept.php | 11 - .../tests/api/v1/AccountingRechnungCept.php | 11 - .../api/v1/AccountingRechnungsbetragCept.php | 11 - .../api/v1/AccountingRechnungstypCept.php | 11 - .../tests/api/v1/AccountingVertragCept.php | 11 - .../api/v1/AccountingVertragsstatusCept.php | 11 - .../api/v1/AccountingVertragstypCept.php | 11 - .../api/v1/AccountingZahlungstypCept.php | 11 - .../tests/api/v1/CheckUserAuthCept.php | 11 - .../tests/api/v1/CodexAkadgradCept.php | 11 - .../tests/api/v1/CodexArchivCept.php | 11 - .../tests/api/v1/CodexAufmerksamdurchCept.php | 11 - .../tests/api/v1/CodexAusbildungCept.php | 11 - .../api/v1/CodexBerufstaetigkeitCept.php | 11 - .../v1/CodexBeschaeftigungsausmassCept.php | 11 - .../tests/api/v1/CodexBesqualCept.php | 11 - .../tests/api/v1/CodexBisfunktionCept.php | 11 - .../tests/api/v1/CodexBisioCept.php | 11 - .../tests/api/v1/CodexBisorgformCept.php | 11 - .../tests/api/v1/CodexBisverwendungCept.php | 11 - .../tests/api/v1/CodexBundeslandCept.php | 11 - .../api/v1/CodexEntwicklungsteamCept.php | 11 - .../tests/api/v1/CodexGemeindeCept.php | 16 - .../tests/api/v1/CodexHauptberufCept.php | 11 - .../tests/api/v1/CodexLehrformCept.php | 11 - .../tests/api/v1/CodexLgartcodeCept.php | 11 - .../api/v1/CodexMobilitaetsprogrammCept.php | 11 - .../tests/api/v1/CodexNationCept.php | 16 - .../tests/api/v1/CodexNoteCept.php | 11 - .../tests/api/v1/CodexOrgformCept.php | 21 - .../tests/api/v1/CodexVerwendungCept.php | 11 - .../codeception/tests/api/v1/CodexZgvCept.php | 11 - .../tests/api/v1/CodexZgvdoktorCept.php | 11 - .../tests/api/v1/CodexZgvgruppeCept.php | 11 - .../tests/api/v1/CodexZgvmasterCept.php | 11 - .../tests/api/v1/CodexZweckCept.php | 11 - .../tests/api/v1/ContentAmpelCept.php | 11 - .../tests/api/v1/ContentContentCept.php | 11 - .../tests/api/v1/ContentContentchildCept.php | 11 - .../tests/api/v1/ContentContentgruppeCept.php | 11 - .../tests/api/v1/ContentContentlogCept.php | 11 - .../api/v1/ContentContentspracheCept.php | 11 - .../tests/api/v1/ContentDmsCept.php | 11 - .../tests/api/v1/ContentInfoscreenCept.php | 11 - .../tests/api/v1/ContentNewsCept.php | 11 - .../tests/api/v1/ContentTemplateCept.php | 11 - .../tests/api/v1/ContentVeranstaltungCept.php | 11 - .../v1/ContentVeranstaltungskategorieCept.php | 11 - .../codeception/tests/api/v1/CrmAkteCept.php | 21 - .../api/v1/CrmAufnahmeschluesselCept.php | 11 - .../tests/api/v1/CrmAufnahmeterminCept.php | 11 - .../tests/api/v1/CrmAufnahmetermintypCept.php | 11 - .../tests/api/v1/CrmBewerbungstermineCept.php | 26 - .../tests/api/v1/CrmBuchungstypCept.php | 11 - .../tests/api/v1/CrmDokumentCept.php | 11 - .../api/v1/CrmDokumentprestudentCept.php | 11 - .../api/v1/CrmDokumentstudiengangCept.php | 16 - .../codeception/tests/api/v1/CrmKontoCept.php | 11 - .../tests/api/v1/CrmPreincomingCept.php | 11 - .../tests/api/v1/CrmPreinteressentCept.php | 16 - .../v1/CrmPreinteressentstudiengangCept.php | 11 - .../tests/api/v1/CrmPreoutgoingCept.php | 11 - .../tests/api/v1/CrmPrestudentCept.php | 21 - .../tests/api/v1/CrmPrestudentstatusCept.php | 16 - .../tests/api/v1/CrmReihungstestCept.php | 21 - .../tests/api/v1/CrmRtPersonCept.php | 11 - .../tests/api/v1/CrmStatusCept.php | 11 - .../tests/api/v1/CrmStatusgrundCept.php | 11 - .../tests/api/v1/CrmStudentCept.php | 11 - .../tests/api/v1/EducationAbgabeCept.php | 11 - .../v1/EducationAbschlussbeurteilungCept.php | 11 - .../api/v1/EducationAbschlusspruefungCept.php | 11 - .../tests/api/v1/EducationAnrechnungCept.php | 11 - .../tests/api/v1/EducationAnwesenheitCept.php | 11 - .../tests/api/v1/EducationBeispielCept.php | 11 - .../tests/api/v1/EducationBetreuerartCept.php | 11 - .../tests/api/v1/EducationFeedbackCept.php | 11 - .../api/v1/EducationLegesamtnoteCept.php | 11 - .../tests/api/v1/EducationLehreinheitCept.php | 11 - .../api/v1/EducationLehreinheitgruppeCept.php | 11 - .../EducationLehreinheitmitarbeiterCept.php | 11 - .../tests/api/v1/EducationLehrfachCept.php | 11 - .../api/v1/EducationLehrfunktionCept.php | 11 - .../tests/api/v1/EducationLehrtypCept.php | 11 - .../api/v1/EducationLehrveranstaltungCept.php | 11 - .../api/v1/EducationLenotenschluesselCept.php | 11 - .../tests/api/v1/EducationLepruefungCept.php | 11 - .../tests/api/v1/EducationLvangebotCept.php | 11 - .../api/v1/EducationLvgesamtnoteCept.php | 11 - .../tests/api/v1/EducationLvinfoCept.php | 11 - .../tests/api/v1/EducationLvregelCept.php | 11 - .../tests/api/v1/EducationLvregeltypCept.php | 11 - .../api/v1/EducationNotenschluesselCept.php | 11 - ...EducationNotenschluesselaufteilungCept.php | 11 - .../v1/EducationNotenschluesseluebungCept.php | 11 - .../EducationNotenschluesselzuordnungCept.php | 11 - .../tests/api/v1/EducationPaabgabeCept.php | 11 - .../tests/api/v1/EducationPaabgabetypCept.php | 11 - .../api/v1/EducationProjektarbeitCept.php | 11 - .../api/v1/EducationProjektbetreuerCept.php | 11 - .../tests/api/v1/EducationProjekttypCept.php | 11 - .../tests/api/v1/EducationPruefungCept.php | 11 - .../v1/EducationPruefungsanmeldungCept.php | 11 - .../api/v1/EducationPruefungsfensterCept.php | 11 - .../api/v1/EducationPruefungsstatusCept.php | 11 - .../api/v1/EducationPruefungsterminCept.php | 11 - .../api/v1/EducationPruefungstypCept.php | 11 - .../api/v1/EducationStudentbeispielCept.php | 11 - .../v1/EducationStudentlehrverbandCept.php | 11 - .../api/v1/EducationStudentuebungCept.php | 11 - .../tests/api/v1/EducationUebungCept.php | 11 - .../tests/api/v1/EducationZeugnisCept.php | 11 - .../tests/api/v1/EducationZeugnisnoteCept.php | 11 - .../tests/api/v1/OrganisationErhalterCept.php | 11 - .../api/v1/OrganisationFachbereich2Cept.php | 11 - .../tests/api/v1/OrganisationFerienCept.php | 11 - .../v1/OrganisationGeschaeftsjahr2Cept.php | 11 - .../tests/api/v1/OrganisationGruppeCept.php | 11 - .../api/v1/OrganisationLehrverbandCept.php | 11 - .../OrganisationOrganisationseinheit2Cept.php | 11 - ...rganisationOrganisationseinheittypCept.php | 11 - .../api/v1/OrganisationSemesterwochenCept.php | 11 - .../tests/api/v1/OrganisationServiceCept.php | 11 - .../tests/api/v1/OrganisationStandortCept.php | 11 - .../api/v1/OrganisationStatistikCept.php | 21 - .../api/v1/OrganisationStudiengang2Cept.php | 26 - .../v1/OrganisationStudiengangstypCept.php | 11 - .../api/v1/OrganisationStudienjahrCept.php | 11 - .../api/v1/OrganisationStudienordnungCept.php | 11 - .../OrganisationStudienordnungstatusCept.php | 11 - .../api/v1/OrganisationStudienplanCept.php | 21 - .../api/v1/OrganisationStudienplatzCept.php | 11 - .../v1/OrganisationStudiensemesterCept.php | 61 - .../tests/api/v1/PersonAdresseCept.php | 11 - .../tests/api/v1/PersonBankverbindungCept.php | 11 - .../tests/api/v1/PersonBenutzerCept.php | 11 - .../api/v1/PersonBenutzerfunktionCept.php | 11 - .../tests/api/v1/PersonBenutzergruppeCept.php | 11 - .../tests/api/v1/PersonFotostatusCept.php | 11 - .../tests/api/v1/PersonFreebusyCept.php | 11 - .../tests/api/v1/PersonFreebusytypCept.php | 11 - .../tests/api/v1/PersonKontaktCept.php | 31 - .../tests/api/v1/PersonKontaktmediumCept.php | 11 - .../tests/api/v1/PersonKontakttypCept.php | 11 - .../tests/api/v1/PersonNotizCept.php | 11 - .../tests/api/v1/PersonNotizzuordnungCept.php | 11 - .../tests/api/v1/PersonPersonCept.php | 16 - .../tests/api/v1/ProjectAktivitaetCept.php | 11 - .../tests/api/v1/ProjectAufwandstypCept.php | 11 - .../tests/api/v1/ProjectProjektCept.php | 11 - .../api/v1/ProjectProjekt_ressourceCept.php | 11 - .../tests/api/v1/ProjectProjektphaseCept.php | 11 - .../tests/api/v1/ProjectProjekttaskCept.php | 11 - .../tests/api/v1/ProjectRessourceCept.php | 11 - .../tests/api/v1/ProjectScrumsprintCept.php | 11 - .../api/v1/RessourceBetriebsmittelCept.php | 11 - .../v1/RessourceBetriebsmittelperson2Cept.php | 11 - .../v1/RessourceBetriebsmittelstatusCept.php | 11 - .../api/v1/RessourceBetriebsmitteltypCept.php | 11 - .../tests/api/v1/RessourceCoodleCept.php | 11 - .../api/v1/RessourceErreichbarkeitCept.php | 11 - .../tests/api/v1/RessourceFirmaCept.php | 11 - .../tests/api/v1/RessourceFirmatagCept.php | 11 - .../tests/api/v1/RessourceFirmentypCept.php | 11 - .../tests/api/v1/RessourceFunktionCept.php | 11 - .../tests/api/v1/RessourceLehrmittelCept.php | 11 - .../tests/api/v1/RessourceMitarbeiterCept.php | 11 - .../tests/api/v1/RessourceOrtCept.php | 16 - .../tests/api/v1/RessourceOrtraumtypCept.php | 11 - .../RessourcePersonfunktionstandortCept.php | 11 - .../tests/api/v1/RessourceRaumtypCept.php | 11 - .../api/v1/RessourceReservierungCept.php | 11 - .../tests/api/v1/RessourceStundeCept.php | 11 - .../tests/api/v1/RessourceStundenplanCept.php | 11 - .../api/v1/RessourceStundenplandevCept.php | 11 - .../api/v1/RessourceZeitaufzeichnungCept.php | 11 - .../tests/api/v1/RessourceZeitsperreCept.php | 11 - .../api/v1/RessourceZeitsperretypCept.php | 11 - .../tests/api/v1/RessourceZeitwunschCept.php | 11 - .../tests/api/v1/SystemAppdatenCept.php | 11 - .../tests/api/v1/SystemBenutzerrolleCept.php | 11 - .../tests/api/v1/SystemBerechtigungCept.php | 11 - .../tests/api/v1/SystemCallerLibraryCept.php | 19 - .../tests/api/v1/SystemCallerModelCept.php | 19 - .../tests/api/v1/SystemCronjobCept.php | 11 - .../tests/api/v1/SystemFilterCept.php | 11 - .../tests/api/v1/SystemLogCept.php | 11 - .../tests/api/v1/SystemMessageCept.php | 26 - .../tests/api/v1/SystemPhraseCept.php | 16 - .../tests/api/v1/SystemRolleCept.php | 11 - .../api/v1/SystemRolleberechtigungCept.php | 11 - .../tests/api/v1/SystemServerCept.php | 11 - .../tests/api/v1/SystemSprache2Cept.php | 11 - .../tests/api/v1/SystemTagCept.php | 11 - .../tests/api/v1/SystemVariableCept.php | 11 - .../tests/api/v1/SystemVorlageCept.php | 11 - .../api/v1/SystemVorlagestudiengangCept.php | 11 - .../tests/api/v1/SystemWebservicelogCept.php | 11 - .../api/v1/SystemWebservicerechtCept.php | 11 - .../tests/api/v1/SystemWebservicetypCept.php | 11 - tests/codeception/tests/api/v1/TestCept.php | 11 - .../tests/api/v1/TesttoolAblaufCept.php | 11 - .../tests/api/v1/TesttoolAntwortCept.php | 11 - .../tests/api/v1/TesttoolFrageCept.php | 11 - .../tests/api/v1/TesttoolGebietCept.php | 11 - .../tests/api/v1/TesttoolKategorieCept.php | 11 - .../tests/api/v1/TesttoolKriterienCept.php | 11 - .../tests/api/v1/TesttoolPrueflingCept.php | 11 - .../tests/api/v1/TesttoolVorschlagCept.php | 11 - .../tests/functional.suite.yml.dist | 10 - .../tests/functional/FunctionalTester.php | 360 --- .../tests/functional/_bootstrap.php | 2 - tests/codeception/tests/unit.suite.yml.dist | 7 - tests/codeception/tests/unit/UnitTester.php | 268 -- tests/codeception/tests/unit/_bootstrap.php | 2 - .../Commenting/DocBlockAlignmentSniff.php | 59 - .../Commenting/FunctionCommentSniff.php | 487 ---- .../Commenting/FunctionCommentTypeSniff.php | 87 - .../ControlSignatureSniff.php | 58 - .../ElseIfDeclarationSniff.php | 48 - .../WhileStructuresSniff.php | 56 - .../Sniffs/Formatting/OneClassPerUseSniff.php | 48 - .../UseInAlphabeticalOrderSniff.php | 142 - .../Functions/ClosureDeclarationSniff.php | 35 - ...unctionDeclarationArgumentSpacingSniff.php | 26 - .../CamelCapsMethodNameSniff.php | 98 - .../UpperCaseConstantNameSniff.php | 223 -- .../ValidClassBracketsSniff.php | 47 - .../NamingConventions/ValidClassNameSniff.php | 99 - .../ValidFunctionNameSniff.php | 120 - .../NamingConventions/ValidTraitNameSniff.php | 48 - .../Sniffs/PHP/DisallowShortOpenTagSniff.php | 53 - .../Sniffs/PHP/TypeCastingSniff.php | 74 - .../Strings/ConcatenationSpacingSniff.php | 48 - .../Sniffs/WhiteSpace/CommaSpacingSniff.php | 54 - .../WhiteSpace/FunctionCallSpacingSniff.php | 53 - .../FunctionClosingBraceSpaceSniff.php | 69 - .../FunctionOpeningBraceSpaceSniff.php | 62 - .../WhiteSpace/FunctionSpacingSniff.php | 129 - .../WhiteSpace/ObjectOperatorSpacingSniff.php | 42 - .../WhiteSpace/OperatorSpacingSniff.php | 185 -- .../Sniffs/WhiteSpace/ScopeIndentSniff.php | 280 -- .../Sniffs/WhiteSpace/TabAndSpaceSniff.php | 63 - tests/codesniffer/FHComplete/ruleset.xml | 3 - .../tests/FHCompletePHPStandardTest.php | 67 - .../FHComplete/tests/TestHelper.php | 54 - .../FHComplete/tests/bootstrap.php | 2 - .../tests/files/FHComplete/throws_pass.php | 36 - .../FHComplete/tests/files/bad_trait_name.php | 4 - .../tests/files/class_brackets_fail1.php | 4 - .../tests/files/class_brackets_fail2.php | 4 - .../tests/files/class_brackets_fail3.php | 5 - .../files/class_underscore_prefix_pass.php | 18 - .../files/control_structure_brackets_pass.php | 25 - .../tests/files/control_structure_dowhile.php | 7 - .../tests/files/control_structure_elseif.php | 9 - .../files/control_structure_indentation.php | 5 - .../files/control_structure_nobrackets.php | 4 - .../tests/files/control_structure_nospace.php | 5 - .../tests/files/control_structure_while.php | 4 - .../files/control_structures_no_newline.php | 5 - .../tests/files/docblock_align_fail.php | 33 - .../tests/files/docblock_align_flat_pass.php | 25 - .../tests/files/docblock_align_pass.php | 30 - .../FHComplete/tests/files/double_space.php | 2 - .../tests/files/for_function_comment_pass.php | 15 - .../function_comment_opening_line_pass.php | 14 - .../tests/files/function_spacing.php | 5 - .../tests/files/operator_spacing_pass.php | 26 - .../tests/files/short_open_tags_fail.php | 9 - .../tests/files/short_open_tags_pass.php | 6 - .../FHComplete/tests/files/space_tab.php | 2 - .../FHComplete/tests/files/tab_space.php | 2 - .../tests/files/traits_no_order.php | 10 - .../FHComplete/tests/files/traits_pass.php | 16 - tests/phpmd/rulesets.xml | 19 + 309 files changed, 19 insertions(+), 11313 deletions(-) delete mode 100644 phpci.yml delete mode 100644 tests/codeception/_bootstrap.php delete mode 100644 tests/codeception/_data/.placeholder delete mode 100644 tests/codeception/_output/.placeholder delete mode 100644 tests/codeception/_support/AcceptanceTester.php delete mode 100644 tests/codeception/_support/ApiTester.php delete mode 100644 tests/codeception/_support/FunctionalTester.php delete mode 100644 tests/codeception/_support/UnitTester.php delete mode 100644 tests/codeception/_support/_generated/AcceptanceTesterActions.php delete mode 100644 tests/codeception/_support/_generated/ApiTesterActions.php delete mode 100644 tests/codeception/_support/_generated/FunctionalTesterActions.php delete mode 100644 tests/codeception/_support/_generated/UnitTesterActions.php delete mode 100644 tests/codeception/codeception.dist.yml delete mode 100644 tests/codeception/tests/acceptance.suite.yml.dist delete mode 100644 tests/codeception/tests/acceptance/CISLoginPage.php delete mode 100644 tests/codeception/tests/acceptance/VileSciSearchPersonCept.php delete mode 100644 tests/codeception/tests/acceptance/VileSciStartPage.php delete mode 100644 tests/codeception/tests/acceptance/_bootstrap.php delete mode 100644 tests/codeception/tests/api.suite.yml.dist delete mode 100644 tests/codeception/tests/api/_bootstrap.php delete mode 100644 tests/codeception/tests/api/generate.php delete mode 100644 tests/codeception/tests/api/template_call.tpl delete mode 100644 tests/codeception/tests/api/template_head.tpl delete mode 100644 tests/codeception/tests/api/v1/AccountingAufteilungCept.php delete mode 100644 tests/codeception/tests/api/v1/AccountingBestelldetailCept.php delete mode 100644 tests/codeception/tests/api/v1/AccountingBestelldetailtagCept.php delete mode 100644 tests/codeception/tests/api/v1/AccountingBestellstatusCept.php delete mode 100644 tests/codeception/tests/api/v1/AccountingBestellungCept.php delete mode 100644 tests/codeception/tests/api/v1/AccountingBestellungtagCept.php delete mode 100644 tests/codeception/tests/api/v1/AccountingBuchungCept.php delete mode 100644 tests/codeception/tests/api/v1/AccountingBuchungstypCept.php delete mode 100644 tests/codeception/tests/api/v1/AccountingBudgetCept.php delete mode 100644 tests/codeception/tests/api/v1/AccountingKontoCept.php delete mode 100644 tests/codeception/tests/api/v1/AccountingKostenstelleCept.php delete mode 100644 tests/codeception/tests/api/v1/AccountingRechnungCept.php delete mode 100644 tests/codeception/tests/api/v1/AccountingRechnungsbetragCept.php delete mode 100644 tests/codeception/tests/api/v1/AccountingRechnungstypCept.php delete mode 100644 tests/codeception/tests/api/v1/AccountingVertragCept.php delete mode 100644 tests/codeception/tests/api/v1/AccountingVertragsstatusCept.php delete mode 100644 tests/codeception/tests/api/v1/AccountingVertragstypCept.php delete mode 100644 tests/codeception/tests/api/v1/AccountingZahlungstypCept.php delete mode 100644 tests/codeception/tests/api/v1/CheckUserAuthCept.php delete mode 100644 tests/codeception/tests/api/v1/CodexAkadgradCept.php delete mode 100644 tests/codeception/tests/api/v1/CodexArchivCept.php delete mode 100644 tests/codeception/tests/api/v1/CodexAufmerksamdurchCept.php delete mode 100644 tests/codeception/tests/api/v1/CodexAusbildungCept.php delete mode 100644 tests/codeception/tests/api/v1/CodexBerufstaetigkeitCept.php delete mode 100644 tests/codeception/tests/api/v1/CodexBeschaeftigungsausmassCept.php delete mode 100644 tests/codeception/tests/api/v1/CodexBesqualCept.php delete mode 100644 tests/codeception/tests/api/v1/CodexBisfunktionCept.php delete mode 100644 tests/codeception/tests/api/v1/CodexBisioCept.php delete mode 100644 tests/codeception/tests/api/v1/CodexBisorgformCept.php delete mode 100644 tests/codeception/tests/api/v1/CodexBisverwendungCept.php delete mode 100644 tests/codeception/tests/api/v1/CodexBundeslandCept.php delete mode 100644 tests/codeception/tests/api/v1/CodexEntwicklungsteamCept.php delete mode 100644 tests/codeception/tests/api/v1/CodexGemeindeCept.php delete mode 100644 tests/codeception/tests/api/v1/CodexHauptberufCept.php delete mode 100644 tests/codeception/tests/api/v1/CodexLehrformCept.php delete mode 100644 tests/codeception/tests/api/v1/CodexLgartcodeCept.php delete mode 100644 tests/codeception/tests/api/v1/CodexMobilitaetsprogrammCept.php delete mode 100644 tests/codeception/tests/api/v1/CodexNationCept.php delete mode 100644 tests/codeception/tests/api/v1/CodexNoteCept.php delete mode 100644 tests/codeception/tests/api/v1/CodexOrgformCept.php delete mode 100644 tests/codeception/tests/api/v1/CodexVerwendungCept.php delete mode 100644 tests/codeception/tests/api/v1/CodexZgvCept.php delete mode 100644 tests/codeception/tests/api/v1/CodexZgvdoktorCept.php delete mode 100644 tests/codeception/tests/api/v1/CodexZgvgruppeCept.php delete mode 100644 tests/codeception/tests/api/v1/CodexZgvmasterCept.php delete mode 100644 tests/codeception/tests/api/v1/CodexZweckCept.php delete mode 100644 tests/codeception/tests/api/v1/ContentAmpelCept.php delete mode 100644 tests/codeception/tests/api/v1/ContentContentCept.php delete mode 100644 tests/codeception/tests/api/v1/ContentContentchildCept.php delete mode 100644 tests/codeception/tests/api/v1/ContentContentgruppeCept.php delete mode 100644 tests/codeception/tests/api/v1/ContentContentlogCept.php delete mode 100644 tests/codeception/tests/api/v1/ContentContentspracheCept.php delete mode 100644 tests/codeception/tests/api/v1/ContentDmsCept.php delete mode 100644 tests/codeception/tests/api/v1/ContentInfoscreenCept.php delete mode 100644 tests/codeception/tests/api/v1/ContentNewsCept.php delete mode 100644 tests/codeception/tests/api/v1/ContentTemplateCept.php delete mode 100644 tests/codeception/tests/api/v1/ContentVeranstaltungCept.php delete mode 100644 tests/codeception/tests/api/v1/ContentVeranstaltungskategorieCept.php delete mode 100644 tests/codeception/tests/api/v1/CrmAkteCept.php delete mode 100644 tests/codeception/tests/api/v1/CrmAufnahmeschluesselCept.php delete mode 100644 tests/codeception/tests/api/v1/CrmAufnahmeterminCept.php delete mode 100644 tests/codeception/tests/api/v1/CrmAufnahmetermintypCept.php delete mode 100644 tests/codeception/tests/api/v1/CrmBewerbungstermineCept.php delete mode 100644 tests/codeception/tests/api/v1/CrmBuchungstypCept.php delete mode 100644 tests/codeception/tests/api/v1/CrmDokumentCept.php delete mode 100644 tests/codeception/tests/api/v1/CrmDokumentprestudentCept.php delete mode 100644 tests/codeception/tests/api/v1/CrmDokumentstudiengangCept.php delete mode 100644 tests/codeception/tests/api/v1/CrmKontoCept.php delete mode 100644 tests/codeception/tests/api/v1/CrmPreincomingCept.php delete mode 100644 tests/codeception/tests/api/v1/CrmPreinteressentCept.php delete mode 100644 tests/codeception/tests/api/v1/CrmPreinteressentstudiengangCept.php delete mode 100644 tests/codeception/tests/api/v1/CrmPreoutgoingCept.php delete mode 100644 tests/codeception/tests/api/v1/CrmPrestudentCept.php delete mode 100644 tests/codeception/tests/api/v1/CrmPrestudentstatusCept.php delete mode 100644 tests/codeception/tests/api/v1/CrmReihungstestCept.php delete mode 100644 tests/codeception/tests/api/v1/CrmRtPersonCept.php delete mode 100644 tests/codeception/tests/api/v1/CrmStatusCept.php delete mode 100644 tests/codeception/tests/api/v1/CrmStatusgrundCept.php delete mode 100644 tests/codeception/tests/api/v1/CrmStudentCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationAbgabeCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationAbschlussbeurteilungCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationAbschlusspruefungCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationAnrechnungCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationAnwesenheitCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationBeispielCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationBetreuerartCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationFeedbackCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationLegesamtnoteCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationLehreinheitCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationLehreinheitgruppeCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationLehreinheitmitarbeiterCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationLehrfachCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationLehrfunktionCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationLehrtypCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationLehrveranstaltungCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationLenotenschluesselCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationLepruefungCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationLvangebotCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationLvgesamtnoteCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationLvinfoCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationLvregelCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationLvregeltypCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationNotenschluesselCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationNotenschluesselaufteilungCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationNotenschluesseluebungCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationNotenschluesselzuordnungCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationPaabgabeCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationPaabgabetypCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationProjektarbeitCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationProjektbetreuerCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationProjekttypCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationPruefungCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationPruefungsanmeldungCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationPruefungsfensterCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationPruefungsstatusCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationPruefungsterminCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationPruefungstypCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationStudentbeispielCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationStudentlehrverbandCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationStudentuebungCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationUebungCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationZeugnisCept.php delete mode 100644 tests/codeception/tests/api/v1/EducationZeugnisnoteCept.php delete mode 100644 tests/codeception/tests/api/v1/OrganisationErhalterCept.php delete mode 100644 tests/codeception/tests/api/v1/OrganisationFachbereich2Cept.php delete mode 100644 tests/codeception/tests/api/v1/OrganisationFerienCept.php delete mode 100644 tests/codeception/tests/api/v1/OrganisationGeschaeftsjahr2Cept.php delete mode 100644 tests/codeception/tests/api/v1/OrganisationGruppeCept.php delete mode 100644 tests/codeception/tests/api/v1/OrganisationLehrverbandCept.php delete mode 100644 tests/codeception/tests/api/v1/OrganisationOrganisationseinheit2Cept.php delete mode 100644 tests/codeception/tests/api/v1/OrganisationOrganisationseinheittypCept.php delete mode 100644 tests/codeception/tests/api/v1/OrganisationSemesterwochenCept.php delete mode 100644 tests/codeception/tests/api/v1/OrganisationServiceCept.php delete mode 100644 tests/codeception/tests/api/v1/OrganisationStandortCept.php delete mode 100644 tests/codeception/tests/api/v1/OrganisationStatistikCept.php delete mode 100644 tests/codeception/tests/api/v1/OrganisationStudiengang2Cept.php delete mode 100644 tests/codeception/tests/api/v1/OrganisationStudiengangstypCept.php delete mode 100644 tests/codeception/tests/api/v1/OrganisationStudienjahrCept.php delete mode 100644 tests/codeception/tests/api/v1/OrganisationStudienordnungCept.php delete mode 100644 tests/codeception/tests/api/v1/OrganisationStudienordnungstatusCept.php delete mode 100644 tests/codeception/tests/api/v1/OrganisationStudienplanCept.php delete mode 100644 tests/codeception/tests/api/v1/OrganisationStudienplatzCept.php delete mode 100644 tests/codeception/tests/api/v1/OrganisationStudiensemesterCept.php delete mode 100644 tests/codeception/tests/api/v1/PersonAdresseCept.php delete mode 100644 tests/codeception/tests/api/v1/PersonBankverbindungCept.php delete mode 100644 tests/codeception/tests/api/v1/PersonBenutzerCept.php delete mode 100644 tests/codeception/tests/api/v1/PersonBenutzerfunktionCept.php delete mode 100644 tests/codeception/tests/api/v1/PersonBenutzergruppeCept.php delete mode 100644 tests/codeception/tests/api/v1/PersonFotostatusCept.php delete mode 100644 tests/codeception/tests/api/v1/PersonFreebusyCept.php delete mode 100644 tests/codeception/tests/api/v1/PersonFreebusytypCept.php delete mode 100644 tests/codeception/tests/api/v1/PersonKontaktCept.php delete mode 100644 tests/codeception/tests/api/v1/PersonKontaktmediumCept.php delete mode 100644 tests/codeception/tests/api/v1/PersonKontakttypCept.php delete mode 100644 tests/codeception/tests/api/v1/PersonNotizCept.php delete mode 100644 tests/codeception/tests/api/v1/PersonNotizzuordnungCept.php delete mode 100644 tests/codeception/tests/api/v1/PersonPersonCept.php delete mode 100644 tests/codeception/tests/api/v1/ProjectAktivitaetCept.php delete mode 100644 tests/codeception/tests/api/v1/ProjectAufwandstypCept.php delete mode 100644 tests/codeception/tests/api/v1/ProjectProjektCept.php delete mode 100644 tests/codeception/tests/api/v1/ProjectProjekt_ressourceCept.php delete mode 100644 tests/codeception/tests/api/v1/ProjectProjektphaseCept.php delete mode 100644 tests/codeception/tests/api/v1/ProjectProjekttaskCept.php delete mode 100644 tests/codeception/tests/api/v1/ProjectRessourceCept.php delete mode 100644 tests/codeception/tests/api/v1/ProjectScrumsprintCept.php delete mode 100644 tests/codeception/tests/api/v1/RessourceBetriebsmittelCept.php delete mode 100644 tests/codeception/tests/api/v1/RessourceBetriebsmittelperson2Cept.php delete mode 100644 tests/codeception/tests/api/v1/RessourceBetriebsmittelstatusCept.php delete mode 100644 tests/codeception/tests/api/v1/RessourceBetriebsmitteltypCept.php delete mode 100644 tests/codeception/tests/api/v1/RessourceCoodleCept.php delete mode 100644 tests/codeception/tests/api/v1/RessourceErreichbarkeitCept.php delete mode 100644 tests/codeception/tests/api/v1/RessourceFirmaCept.php delete mode 100644 tests/codeception/tests/api/v1/RessourceFirmatagCept.php delete mode 100644 tests/codeception/tests/api/v1/RessourceFirmentypCept.php delete mode 100644 tests/codeception/tests/api/v1/RessourceFunktionCept.php delete mode 100644 tests/codeception/tests/api/v1/RessourceLehrmittelCept.php delete mode 100644 tests/codeception/tests/api/v1/RessourceMitarbeiterCept.php delete mode 100644 tests/codeception/tests/api/v1/RessourceOrtCept.php delete mode 100644 tests/codeception/tests/api/v1/RessourceOrtraumtypCept.php delete mode 100644 tests/codeception/tests/api/v1/RessourcePersonfunktionstandortCept.php delete mode 100644 tests/codeception/tests/api/v1/RessourceRaumtypCept.php delete mode 100644 tests/codeception/tests/api/v1/RessourceReservierungCept.php delete mode 100644 tests/codeception/tests/api/v1/RessourceStundeCept.php delete mode 100644 tests/codeception/tests/api/v1/RessourceStundenplanCept.php delete mode 100644 tests/codeception/tests/api/v1/RessourceStundenplandevCept.php delete mode 100644 tests/codeception/tests/api/v1/RessourceZeitaufzeichnungCept.php delete mode 100644 tests/codeception/tests/api/v1/RessourceZeitsperreCept.php delete mode 100644 tests/codeception/tests/api/v1/RessourceZeitsperretypCept.php delete mode 100644 tests/codeception/tests/api/v1/RessourceZeitwunschCept.php delete mode 100644 tests/codeception/tests/api/v1/SystemAppdatenCept.php delete mode 100644 tests/codeception/tests/api/v1/SystemBenutzerrolleCept.php delete mode 100644 tests/codeception/tests/api/v1/SystemBerechtigungCept.php delete mode 100644 tests/codeception/tests/api/v1/SystemCallerLibraryCept.php delete mode 100644 tests/codeception/tests/api/v1/SystemCallerModelCept.php delete mode 100644 tests/codeception/tests/api/v1/SystemCronjobCept.php delete mode 100644 tests/codeception/tests/api/v1/SystemFilterCept.php delete mode 100644 tests/codeception/tests/api/v1/SystemLogCept.php delete mode 100644 tests/codeception/tests/api/v1/SystemMessageCept.php delete mode 100644 tests/codeception/tests/api/v1/SystemPhraseCept.php delete mode 100644 tests/codeception/tests/api/v1/SystemRolleCept.php delete mode 100644 tests/codeception/tests/api/v1/SystemRolleberechtigungCept.php delete mode 100644 tests/codeception/tests/api/v1/SystemServerCept.php delete mode 100644 tests/codeception/tests/api/v1/SystemSprache2Cept.php delete mode 100644 tests/codeception/tests/api/v1/SystemTagCept.php delete mode 100644 tests/codeception/tests/api/v1/SystemVariableCept.php delete mode 100644 tests/codeception/tests/api/v1/SystemVorlageCept.php delete mode 100644 tests/codeception/tests/api/v1/SystemVorlagestudiengangCept.php delete mode 100644 tests/codeception/tests/api/v1/SystemWebservicelogCept.php delete mode 100644 tests/codeception/tests/api/v1/SystemWebservicerechtCept.php delete mode 100644 tests/codeception/tests/api/v1/SystemWebservicetypCept.php delete mode 100644 tests/codeception/tests/api/v1/TestCept.php delete mode 100644 tests/codeception/tests/api/v1/TesttoolAblaufCept.php delete mode 100644 tests/codeception/tests/api/v1/TesttoolAntwortCept.php delete mode 100644 tests/codeception/tests/api/v1/TesttoolFrageCept.php delete mode 100644 tests/codeception/tests/api/v1/TesttoolGebietCept.php delete mode 100644 tests/codeception/tests/api/v1/TesttoolKategorieCept.php delete mode 100644 tests/codeception/tests/api/v1/TesttoolKriterienCept.php delete mode 100644 tests/codeception/tests/api/v1/TesttoolPrueflingCept.php delete mode 100644 tests/codeception/tests/api/v1/TesttoolVorschlagCept.php delete mode 100644 tests/codeception/tests/functional.suite.yml.dist delete mode 100644 tests/codeception/tests/functional/FunctionalTester.php delete mode 100644 tests/codeception/tests/functional/_bootstrap.php delete mode 100644 tests/codeception/tests/unit.suite.yml.dist delete mode 100644 tests/codeception/tests/unit/UnitTester.php delete mode 100644 tests/codeception/tests/unit/_bootstrap.php delete mode 100644 tests/codesniffer/FHComplete/Sniffs/Commenting/DocBlockAlignmentSniff.php delete mode 100644 tests/codesniffer/FHComplete/Sniffs/Commenting/FunctionCommentSniff.php delete mode 100644 tests/codesniffer/FHComplete/Sniffs/Commenting/FunctionCommentTypeSniff.php delete mode 100644 tests/codesniffer/FHComplete/Sniffs/ControlStructures/ControlSignatureSniff.php delete mode 100644 tests/codesniffer/FHComplete/Sniffs/ControlStructures/ElseIfDeclarationSniff.php delete mode 100644 tests/codesniffer/FHComplete/Sniffs/ControlStructures/WhileStructuresSniff.php delete mode 100644 tests/codesniffer/FHComplete/Sniffs/Formatting/OneClassPerUseSniff.php delete mode 100644 tests/codesniffer/FHComplete/Sniffs/Formatting/UseInAlphabeticalOrderSniff.php delete mode 100644 tests/codesniffer/FHComplete/Sniffs/Functions/ClosureDeclarationSniff.php delete mode 100644 tests/codesniffer/FHComplete/Sniffs/Functions/FunctionDeclarationArgumentSpacingSniff.php delete mode 100644 tests/codesniffer/FHComplete/Sniffs/NamingConventions/CamelCapsMethodNameSniff.php delete mode 100644 tests/codesniffer/FHComplete/Sniffs/NamingConventions/UpperCaseConstantNameSniff.php delete mode 100644 tests/codesniffer/FHComplete/Sniffs/NamingConventions/ValidClassBracketsSniff.php delete mode 100644 tests/codesniffer/FHComplete/Sniffs/NamingConventions/ValidClassNameSniff.php delete mode 100644 tests/codesniffer/FHComplete/Sniffs/NamingConventions/ValidFunctionNameSniff.php delete mode 100644 tests/codesniffer/FHComplete/Sniffs/NamingConventions/ValidTraitNameSniff.php delete mode 100644 tests/codesniffer/FHComplete/Sniffs/PHP/DisallowShortOpenTagSniff.php delete mode 100644 tests/codesniffer/FHComplete/Sniffs/PHP/TypeCastingSniff.php delete mode 100644 tests/codesniffer/FHComplete/Sniffs/Strings/ConcatenationSpacingSniff.php delete mode 100644 tests/codesniffer/FHComplete/Sniffs/WhiteSpace/CommaSpacingSniff.php delete mode 100644 tests/codesniffer/FHComplete/Sniffs/WhiteSpace/FunctionCallSpacingSniff.php delete mode 100644 tests/codesniffer/FHComplete/Sniffs/WhiteSpace/FunctionClosingBraceSpaceSniff.php delete mode 100644 tests/codesniffer/FHComplete/Sniffs/WhiteSpace/FunctionOpeningBraceSpaceSniff.php delete mode 100644 tests/codesniffer/FHComplete/Sniffs/WhiteSpace/FunctionSpacingSniff.php delete mode 100644 tests/codesniffer/FHComplete/Sniffs/WhiteSpace/ObjectOperatorSpacingSniff.php delete mode 100644 tests/codesniffer/FHComplete/Sniffs/WhiteSpace/OperatorSpacingSniff.php delete mode 100644 tests/codesniffer/FHComplete/Sniffs/WhiteSpace/ScopeIndentSniff.php delete mode 100644 tests/codesniffer/FHComplete/Sniffs/WhiteSpace/TabAndSpaceSniff.php delete mode 100644 tests/codesniffer/FHComplete/tests/FHCompletePHPStandardTest.php delete mode 100644 tests/codesniffer/FHComplete/tests/TestHelper.php delete mode 100644 tests/codesniffer/FHComplete/tests/bootstrap.php delete mode 100644 tests/codesniffer/FHComplete/tests/files/FHComplete/throws_pass.php delete mode 100644 tests/codesniffer/FHComplete/tests/files/bad_trait_name.php delete mode 100644 tests/codesniffer/FHComplete/tests/files/class_brackets_fail1.php delete mode 100644 tests/codesniffer/FHComplete/tests/files/class_brackets_fail2.php delete mode 100644 tests/codesniffer/FHComplete/tests/files/class_brackets_fail3.php delete mode 100644 tests/codesniffer/FHComplete/tests/files/class_underscore_prefix_pass.php delete mode 100644 tests/codesniffer/FHComplete/tests/files/control_structure_brackets_pass.php delete mode 100644 tests/codesniffer/FHComplete/tests/files/control_structure_dowhile.php delete mode 100644 tests/codesniffer/FHComplete/tests/files/control_structure_elseif.php delete mode 100644 tests/codesniffer/FHComplete/tests/files/control_structure_indentation.php delete mode 100644 tests/codesniffer/FHComplete/tests/files/control_structure_nobrackets.php delete mode 100644 tests/codesniffer/FHComplete/tests/files/control_structure_nospace.php delete mode 100644 tests/codesniffer/FHComplete/tests/files/control_structure_while.php delete mode 100644 tests/codesniffer/FHComplete/tests/files/control_structures_no_newline.php delete mode 100644 tests/codesniffer/FHComplete/tests/files/docblock_align_fail.php delete mode 100644 tests/codesniffer/FHComplete/tests/files/docblock_align_flat_pass.php delete mode 100644 tests/codesniffer/FHComplete/tests/files/docblock_align_pass.php delete mode 100644 tests/codesniffer/FHComplete/tests/files/double_space.php delete mode 100644 tests/codesniffer/FHComplete/tests/files/for_function_comment_pass.php delete mode 100644 tests/codesniffer/FHComplete/tests/files/function_comment_opening_line_pass.php delete mode 100644 tests/codesniffer/FHComplete/tests/files/function_spacing.php delete mode 100644 tests/codesniffer/FHComplete/tests/files/operator_spacing_pass.php delete mode 100644 tests/codesniffer/FHComplete/tests/files/short_open_tags_fail.php delete mode 100644 tests/codesniffer/FHComplete/tests/files/short_open_tags_pass.php delete mode 100644 tests/codesniffer/FHComplete/tests/files/space_tab.php delete mode 100644 tests/codesniffer/FHComplete/tests/files/tab_space.php delete mode 100644 tests/codesniffer/FHComplete/tests/files/traits_no_order.php delete mode 100644 tests/codesniffer/FHComplete/tests/files/traits_pass.php create mode 100644 tests/phpmd/rulesets.xml diff --git a/phpci.yml b/phpci.yml deleted file mode 100644 index 2978796e3..000000000 --- a/phpci.yml +++ /dev/null @@ -1,127 +0,0 @@ -# Globally valid entries -build_settings: - ignore: # Ignores vendor and tests folders - - "vendor" - - "tests" - pgsql: # PostgreSQL connection parameters - host: "localhost;dbname=template1" # Connects to the template1 database to be able to drop database fhcomplete - user: "fhcomplete" - pass: "fhcomplete" - -setup: # First! - pgsql: # Close previous connections to database -> drop database -> create database - - "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE pid <> pg_backend_pid() AND datname = 'fhcomplete';" - - "DROP DATABASE IF EXISTS fhcomplete;" - - "CREATE DATABASE fhcomplete;" - composer: # Run composer to install all the required 3rd party software - shell: - # Install addons - - "git clone --quiet https://github.com/FH-Complete/FHC-AddOn-Abrechnung.git %BUILD_PATH%/addons/abrechnung" - - "git clone --quiet https://github.com/FH-Complete/FHC-AddOn-Asterisk.git %BUILD_PATH%/addons/asterisk" - - "git clone --quiet https://github.com/FH-Complete/FHC-AddOn-Aufnahme.git %BUILD_PATH%/addons/aufnahme" - - "git clone --quiet https://github.com/FH-Complete/FHC-AddOn-Bewerbung.git %BUILD_PATH%/addons/bewerbung" - - "git clone --quiet https://github.com/FH-Complete/FHC-AddOn-CaseTime.git %BUILD_PATH%/addons/casetime" - - "git clone --quiet https://github.com/FH-Complete/FHC-AddOn-LDAP.git %BUILD_PATH%/addons/ldap" - - "git clone --quiet https://github.com/FH-Complete/FHC-AddOn-Lehrmittel.git %BUILD_PATH%/addons/lehrmittel" - - "git clone --quiet https://github.com/FH-Complete/FHC-AddOn-LV-Evaluierung.git %BUILD_PATH%/addons/lvevaluierung" - - "git clone --quiet https://github.com/FH-Complete/FHC-AddOn-LVInfo.git %BUILD_PATH%/addons/lvinfo" - - "git clone --quiet https://github.com/FH-Complete/FHC-AddOn-Kompetenzen.git %BUILD_PATH%/addons/kompetenzen" - - "git clone --quiet https://github.com/FH-Complete/FHC-AddOn-Moodle.git %BUILD_PATH%/addons/moodle" - - "git clone --quiet https://github.com/FH-Complete/FHC-AddOn-Reports.git %BUILD_PATH%/addons/reports" - - "git clone --quiet https://github.com/FH-Complete/FHC-AddOn-Studiengangsverwaltung.git %BUILD_PATH%/addons/studiengangsverwaltung" - - "git clone --quiet https://github.com/FH-Complete/FHC-AddOn-Textbausteine.git %BUILD_PATH%/addons/textbausteine" - - "git clone --quiet https://github.com/FH-Complete/FHC-AddOn-WaWi.git %BUILD_PATH%/addons/wawi" - # Copy addons configs - - "cp -R /var/www/configs/fhc/abrechnung/* %BUILD_PATH%/addons/abrechnung" - - "cp -R /var/www/configs/fhc/asterisk/* %BUILD_PATH%/addons/asterisk" - - "cp -R /var/www/configs/fhc/bewerbung/* %BUILD_PATH%/addons/bewerbung" - - "cp -R /var/www/configs/fhc/casetime/* %BUILD_PATH%/addons/casetime" - - "cp -R /var/www/configs/fhc/lehrmittel/* %BUILD_PATH%/addons/lehrmittel" - - "cp -R /var/www/configs/fhc/lvinfo/* %BUILD_PATH%/addons/lvinfo" - - "cp -R /var/www/configs/fhc/reports/* %BUILD_PATH%/addons/reports" - - "cp -R /var/www/configs/fhc/wawi/* %BUILD_PATH%/addons/wawi" - # Copy core configs and .htaccess - - "cp -R /var/www/configs/fhc/configs/* ./config" - - "cp /var/www/configs/fhc/configs/.htaccess ./cis/private/" - - "cp /var/www/configs/fhc/configs/.htaccess ./content" - - "cp /var/www/configs/fhc/configs/.htaccess ./rdf" - - "cp /var/www/configs/fhc/configs/.htaccess ./system" - - "cp /var/www/configs/fhc/configs/.htaccess ./vilesci" - # Create core directories - - "mkdir documents" - - "mkdir documents/csv_import" - - "mkdir documents/dms" - - "mkdir documents/import" - - "mkdir documents/benotungstool" - - "mkdir paabgabe" - # Copy codeigniter configs - - "mkdir ./application/config/development" - - "cp -R /var/www/configs/ci/* ./application/config/development" - # Clone extensions - - "git clone --quiet https://github.com/FH-Complete/FHC-Core-MobilityOnline.git /tmp/FHC-Core-MobilityOnline" - - "git clone --quiet https://github.com/FH-Complete/FHC-Core-Budget.git /tmp/FHC-Core-Budget" - - "git clone --quiet https://github.com/FH-Complete/FHC-Core-DSMS.git /tmp/FHC-Core-DSMS" - - "git clone --quiet https://github.com/FH-Complete/FHC-Core-Nextcloud.git /tmp/FHC-Core-Nextcloud" - # Create extensions archives - - "tar cfzP /tmp/FHC-Core-MobilityOnline.tgz /tmp/FHC-Core-MobilityOnline/" - - "tar cfzP /tmp/FHC-Core-Budget.tgz /tmp/FHC-Core-Budget/" - - "tar cfzP /tmp/FHC-Core-DSMS.tgz /tmp/FHC-Core-DSMS/" - - "tar cfzP /tmp/FHC-Core-Nextcloud.tgz /tmp/FHC-Core-Nextcloud/" - # Install extensions - #- "php index.ci.php system/extensions/CLI_Manager uploadExtension FHC-Core-MobilityOnline /tmp/FHC-Core-MobilityOnline.tgz" - #- "php index.ci.php system/extensions/CLI_Manager uploadExtension FHC-Core-Budget /tmp/FHC-Core-Budget.tgz" - #- "php index.ci.php system/extensions/CLI_Manager uploadExtension FHC-Core-DSMS /tmp/FHC-Core-DSMS.tgz" - #- "php index.ci.php system/extensions/CLI_Manager uploadExtension FHC-Core-Nextcloud /tmp/FHC-Core-Nextcloud.tgz" - # Remove temporary files - - "rm -fR /tmp/FHC-Core-MobilityOnline*" - - "rm -fR /tmp/FHC-Core-Budget*" - - "rm -fR /tmp/FHC-Core-DSMS*" - - "rm -fR /tmp/FHC-Core-Nextcloud*" - # Change files permissions - - "chmod -R 0770 *" - - "find . -type f -exec chmod 0644 {} \\;" - # Create a symlink to the current build folder - - "ln -s %BUILD_PATH% ../fhcomplete" - -test: # Run tests - php_parallel_lint: # Lint cannot fail! - php_mess_detector: # Mess detector - rules: - - "unusedcode" - - "codesize" - - "design" - allow_failures: true - php_cpd: # Copy/paste detector - ignore: - - "rdf" - - "config" - - "locale" - - "application/config" - - "application/views" - # Global ignore is overwritten by the specific one - - "vendor" - - "tests" - allow_failures: true - php_code_sniffer: # Code sniffer - standard: "tests/codesniffer/FHComplete" - ignore: - - "rdf" - - "locale" - - "application/views" - allowed_warnings: -1 # Warnings are ignored for a successful build - allow_failures: true - #codeception: # Codeception - # config: "tests/codeception/" - # path: "tests/codeception/_output/" - # allow_failures: true - -failure: # On failure - email: # Send an email to warn the team - default_mailto_address: systementwicklung@technikum-wien.at - -complete: # Last! - pgsql: # Close previous connections to database -> drop database - - "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE pid <> pg_backend_pid() AND datname = 'fhcomplete';" - - "DROP DATABASE IF EXISTS fhcomplete;" - shell: # Remove the previously created symlink - - "rm ../fhcomplete" diff --git a/tests/codeception/_bootstrap.php b/tests/codeception/_bootstrap.php deleted file mode 100644 index 243f9c85b..000000000 --- a/tests/codeception/_bootstrap.php +++ /dev/null @@ -1,2 +0,0 @@ -haveInDatabase('users', array('name' => 'miles', 'email' => 'miles@davis.com')); - * ?> - * ``` - * - * @param string $table - * @param array $data - * - * @return integer $id - * @see \Codeception\Module\Db::haveInDatabase() - */ - public function haveInDatabase($table, $data) { - return $this->getScenario()->runStep(new \Codeception\Step\Action('haveInDatabase', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Asserts that a row with the given column values exists. - * Provide table name and column values. - * - * ``` php - * seeInDatabase('users', array('name' => 'Davert', 'email' => 'davert@mail.com')); - * ``` - * Fails if no such user found. - * - * @param string $table - * @param array $criteria - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Module\Db::seeInDatabase() - */ - public function canSeeInDatabase($table, $criteria = null) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeInDatabase', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Asserts that a row with the given column values exists. - * Provide table name and column values. - * - * ``` php - * seeInDatabase('users', array('name' => 'Davert', 'email' => 'davert@mail.com')); - * ``` - * Fails if no such user found. - * - * @param string $table - * @param array $criteria - * @see \Codeception\Module\Db::seeInDatabase() - */ - public function seeInDatabase($table, $criteria = null) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeInDatabase', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Asserts that the given number of records were found in the database. - * - * ``` php - * seeNumRecords(1, 'users', ['name' => 'davert']) - * ?> - * ``` - * - * @param int $expectedNumber Expected number - * @param string $table Table name - * @param array $criteria Search criteria [Optional] - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Module\Db::seeNumRecords() - */ - public function canSeeNumRecords($expectedNumber, $table, $criteria = null) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeNumRecords', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Asserts that the given number of records were found in the database. - * - * ``` php - * seeNumRecords(1, 'users', ['name' => 'davert']) - * ?> - * ``` - * - * @param int $expectedNumber Expected number - * @param string $table Table name - * @param array $criteria Search criteria [Optional] - * @see \Codeception\Module\Db::seeNumRecords() - */ - public function seeNumRecords($expectedNumber, $table, $criteria = null) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeNumRecords', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Effect is opposite to ->seeInDatabase - * - * Asserts that there is no record with the given column values in a database. - * Provide table name and column values. - * - * ``` php - * dontSeeInDatabase('users', array('name' => 'Davert', 'email' => 'davert@mail.com')); - * ``` - * Fails if such user was found. - * - * @param string $table - * @param array $criteria - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Module\Db::dontSeeInDatabase() - */ - public function cantSeeInDatabase($table, $criteria = null) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('dontSeeInDatabase', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Effect is opposite to ->seeInDatabase - * - * Asserts that there is no record with the given column values in a database. - * Provide table name and column values. - * - * ``` php - * dontSeeInDatabase('users', array('name' => 'Davert', 'email' => 'davert@mail.com')); - * ``` - * Fails if such user was found. - * - * @param string $table - * @param array $criteria - * @see \Codeception\Module\Db::dontSeeInDatabase() - */ - public function dontSeeInDatabase($table, $criteria = null) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('dontSeeInDatabase', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Fetches a single column value from a database. - * Provide table name, desired column and criteria. - * - * ``` php - * grabFromDatabase('users', 'email', array('name' => 'Davert')); - * ``` - * - * @param string $table - * @param string $column - * @param array $criteria - * - * @return mixed - * @see \Codeception\Module\Db::grabFromDatabase() - */ - public function grabFromDatabase($table, $column, $criteria = null) { - return $this->getScenario()->runStep(new \Codeception\Step\Action('grabFromDatabase', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Returns the number of rows in a database - * - * @param string $table Table name - * @param array $criteria Search criteria [Optional] - * - * @return int - * @see \Codeception\Module\Db::grabNumRecords() - */ - public function grabNumRecords($table, $criteria = null) { - return $this->getScenario()->runStep(new \Codeception\Step\Action('grabNumRecords', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Alias to `haveHttpHeader` - * - * @param $name - * @param $value - * @see \Codeception\Module\PhpBrowser::setHeader() - */ - public function setHeader($name, $value) { - return $this->getScenario()->runStep(new \Codeception\Step\Action('setHeader', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Authenticates user for HTTP_AUTH - * - * @param $username - * @param $password - * @see \Codeception\Module\PhpBrowser::amHttpAuthenticated() - */ - public function amHttpAuthenticated($username, $password) { - return $this->getScenario()->runStep(new \Codeception\Step\Condition('amHttpAuthenticated', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Open web page at the given absolute URL and sets its hostname as the base host. - * - * ``` php - * amOnUrl('http://codeception.com'); - * $I->amOnPage('/quickstart'); // moves to http://codeception.com/quickstart - * ?> - * ``` - * @see \Codeception\Module\PhpBrowser::amOnUrl() - */ - public function amOnUrl($url) { - return $this->getScenario()->runStep(new \Codeception\Step\Condition('amOnUrl', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Changes the subdomain for the 'url' configuration parameter. - * Does not open a page; use `amOnPage` for that. - * - * ``` php - * amOnSubdomain('user'); - * $I->amOnPage('/'); - * // moves to http://user.mysite.com/ - * ?> - * ``` - * - * @param $subdomain - * - * @return mixed - * @see \Codeception\Module\PhpBrowser::amOnSubdomain() - */ - public function amOnSubdomain($subdomain) { - return $this->getScenario()->runStep(new \Codeception\Step\Condition('amOnSubdomain', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Low-level API method. - * If Codeception commands are not enough, use [Guzzle HTTP Client](http://guzzlephp.org/) methods directly - * - * Example: - * - * ``` php - * executeInGuzzle(function (\GuzzleHttp\Client $client) { - * $client->get('/get', ['query' => ['foo' => 'bar']]); - * }); - * ?> - * ``` - * - * It is not recommended to use this command on a regular basis. - * If Codeception lacks important Guzzle Client methods, implement them and submit patches. - * - * @param callable $function - * @see \Codeception\Module\PhpBrowser::executeInGuzzle() - */ - public function executeInGuzzle($function) { - return $this->getScenario()->runStep(new \Codeception\Step\Action('executeInGuzzle', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Sets the HTTP header to the passed value - which is used on - * subsequent HTTP requests through PhpBrowser. - * - * Example: - * ```php - * setHeader('X-Requested-With', 'Codeception'); - * $I->amOnPage('test-headers.php'); - * ?> - * ``` - * - * @param string $name the name of the request header - * @param string $value the value to set it to for subsequent - * requests - * @see \Codeception\Lib\InnerBrowser::haveHttpHeader() - */ - public function haveHttpHeader($name, $value) { - return $this->getScenario()->runStep(new \Codeception\Step\Action('haveHttpHeader', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Deletes the header with the passed name. Subsequent requests - * will not have the deleted header in its request. - * - * Example: - * ```php - * haveHttpHeader('X-Requested-With', 'Codeception'); - * $I->amOnPage('test-headers.php'); - * // ... - * $I->deleteHeader('X-Requested-With'); - * $I->amOnPage('some-other-page.php'); - * ?> - * ``` - * - * @param string $name the name of the header to delete. - * @see \Codeception\Lib\InnerBrowser::deleteHeader() - */ - public function deleteHeader($name) { - return $this->getScenario()->runStep(new \Codeception\Step\Action('deleteHeader', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Opens the page for the given relative URI. - * - * ``` php - * amOnPage('/'); - * // opens /register page - * $I->amOnPage('/register'); - * ``` - * - * @param $page - * @see \Codeception\Lib\InnerBrowser::amOnPage() - */ - public function amOnPage($page) { - return $this->getScenario()->runStep(new \Codeception\Step\Condition('amOnPage', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Perform a click on a link or a button, given by a locator. - * If a fuzzy locator is given, the page will be searched for a button, link, or image matching the locator string. - * For buttons, the "value" attribute, "name" attribute, and inner text are searched. - * For links, the link text is searched. - * For images, the "alt" attribute and inner text of any parent links are searched. - * - * The second parameter is a context (CSS or XPath locator) to narrow the search. - * - * Note that if the locator matches a button of type `submit`, the form will be submitted. - * - * ``` php - * click('Logout'); - * // button of form - * $I->click('Submit'); - * // CSS button - * $I->click('#form input[type=submit]'); - * // XPath - * $I->click('//form/*[@type=submit]'); - * // link in context - * $I->click('Logout', '#nav'); - * // using strict locator - * $I->click(['link' => 'Login']); - * ?> - * ``` - * - * @param $link - * @param $context - * @see \Codeception\Lib\InnerBrowser::click() - */ - public function click($link, $context = null) { - return $this->getScenario()->runStep(new \Codeception\Step\Action('click', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the current page contains the given string (case insensitive). - * - * You can specify a specific HTML element (via CSS or XPath) as the second - * parameter to only search within that element. - * - * ``` php - * see('Logout'); // I can suppose user is logged in - * $I->see('Sign Up', 'h1'); // I can suppose it's a signup page - * $I->see('Sign Up', '//body/h1'); // with XPath - * ``` - * - * Note that the search is done after stripping all HTML tags from the body, - * so `$I->see('strong')` will return true for strings like: - * - * - `

    I am Stronger than thou

    ` - * - `` - * - * But will *not* be true for strings like: - * - * - `Home` - * - `
    Home` - * - `` - * - * For checking the raw source code, use `seeInSource()`. - * - * @param $text - * @param null $selector - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Lib\InnerBrowser::see() - */ - public function canSee($text, $selector = null) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('see', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the current page contains the given string (case insensitive). - * - * You can specify a specific HTML element (via CSS or XPath) as the second - * parameter to only search within that element. - * - * ``` php - * see('Logout'); // I can suppose user is logged in - * $I->see('Sign Up', 'h1'); // I can suppose it's a signup page - * $I->see('Sign Up', '//body/h1'); // with XPath - * ``` - * - * Note that the search is done after stripping all HTML tags from the body, - * so `$I->see('strong')` will return true for strings like: - * - * - `

    I am Stronger than thou

    ` - * - `` - * - * But will *not* be true for strings like: - * - * - `Home` - * - `
    Home` - * - `` - * - * For checking the raw source code, use `seeInSource()`. - * - * @param $text - * @param null $selector - * @see \Codeception\Lib\InnerBrowser::see() - */ - public function see($text, $selector = null) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('see', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the current page doesn't contain the text specified (case insensitive). - * Give a locator as the second parameter to match a specific region. - * - * ```php - * dontSee('Login'); // I can suppose user is already logged in - * $I->dontSee('Sign Up','h1'); // I can suppose it's not a signup page - * $I->dontSee('Sign Up','//body/h1'); // with XPath - * ``` - * - * Note that the search is done after stripping all HTML tags from the body, - * so `$I->dontSee('strong')` will fail on strings like: - * - * - `

    I am Stronger than thou

    ` - * - `` - * - * But will ignore strings like: - * - * - `Home` - * - `
    Home` - * - `` - * - * For checking the raw source code, use `seeInSource()`. - * - * @param $text - * @param null $selector - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Lib\InnerBrowser::dontSee() - */ - public function cantSee($text, $selector = null) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('dontSee', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the current page doesn't contain the text specified (case insensitive). - * Give a locator as the second parameter to match a specific region. - * - * ```php - * dontSee('Login'); // I can suppose user is already logged in - * $I->dontSee('Sign Up','h1'); // I can suppose it's not a signup page - * $I->dontSee('Sign Up','//body/h1'); // with XPath - * ``` - * - * Note that the search is done after stripping all HTML tags from the body, - * so `$I->dontSee('strong')` will fail on strings like: - * - * - `

    I am Stronger than thou

    ` - * - `` - * - * But will ignore strings like: - * - * - `Home` - * - `
    Home` - * - `` - * - * For checking the raw source code, use `seeInSource()`. - * - * @param $text - * @param null $selector - * @see \Codeception\Lib\InnerBrowser::dontSee() - */ - public function dontSee($text, $selector = null) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('dontSee', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the current page contains the given string in its - * raw source code. - * - * ``` php - * seeInSource('

    Green eggs & ham

    '); - * ``` - * - * @param $raw - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Lib\InnerBrowser::seeInSource() - */ - public function canSeeInSource($raw) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeInSource', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the current page contains the given string in its - * raw source code. - * - * ``` php - * seeInSource('

    Green eggs & ham

    '); - * ``` - * - * @param $raw - * @see \Codeception\Lib\InnerBrowser::seeInSource() - */ - public function seeInSource($raw) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeInSource', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the current page contains the given string in its - * raw source code. - * - * ```php - * dontSeeInSource('

    Green eggs & ham

    '); - * ``` - * - * @param $raw - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Lib\InnerBrowser::dontSeeInSource() - */ - public function cantSeeInSource($raw) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('dontSeeInSource', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the current page contains the given string in its - * raw source code. - * - * ```php - * dontSeeInSource('

    Green eggs & ham

    '); - * ``` - * - * @param $raw - * @see \Codeception\Lib\InnerBrowser::dontSeeInSource() - */ - public function dontSeeInSource($raw) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('dontSeeInSource', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that there's a link with the specified text. - * Give a full URL as the second parameter to match links with that exact URL. - * - * ``` php - * seeLink('Logout'); // matches Logout - * $I->seeLink('Logout','/logout'); // matches Logout - * ?> - * ``` - * - * @param $text - * @param null $url - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Lib\InnerBrowser::seeLink() - */ - public function canSeeLink($text, $url = null) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeLink', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that there's a link with the specified text. - * Give a full URL as the second parameter to match links with that exact URL. - * - * ``` php - * seeLink('Logout'); // matches Logout - * $I->seeLink('Logout','/logout'); // matches Logout - * ?> - * ``` - * - * @param $text - * @param null $url - * @see \Codeception\Lib\InnerBrowser::seeLink() - */ - public function seeLink($text, $url = null) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeLink', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the page doesn't contain a link with the given string. - * If the second parameter is given, only links with a matching "href" attribute will be checked. - * - * ``` php - * dontSeeLink('Logout'); // I suppose user is not logged in - * $I->dontSeeLink('Checkout now', '/store/cart.php'); - * ?> - * ``` - * - * @param $text - * @param null $url - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Lib\InnerBrowser::dontSeeLink() - */ - public function cantSeeLink($text, $url = null) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('dontSeeLink', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the page doesn't contain a link with the given string. - * If the second parameter is given, only links with a matching "href" attribute will be checked. - * - * ``` php - * dontSeeLink('Logout'); // I suppose user is not logged in - * $I->dontSeeLink('Checkout now', '/store/cart.php'); - * ?> - * ``` - * - * @param $text - * @param null $url - * @see \Codeception\Lib\InnerBrowser::dontSeeLink() - */ - public function dontSeeLink($text, $url = null) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('dontSeeLink', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that current URI contains the given string. - * - * ``` php - * seeInCurrentUrl('home'); - * // to match: /users/1 - * $I->seeInCurrentUrl('/users/'); - * ?> - * ``` - * - * @param $uri - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Lib\InnerBrowser::seeInCurrentUrl() - */ - public function canSeeInCurrentUrl($uri) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeInCurrentUrl', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that current URI contains the given string. - * - * ``` php - * seeInCurrentUrl('home'); - * // to match: /users/1 - * $I->seeInCurrentUrl('/users/'); - * ?> - * ``` - * - * @param $uri - * @see \Codeception\Lib\InnerBrowser::seeInCurrentUrl() - */ - public function seeInCurrentUrl($uri) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeInCurrentUrl', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the current URI doesn't contain the given string. - * - * ``` php - * dontSeeInCurrentUrl('/users/'); - * ?> - * ``` - * - * @param $uri - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Lib\InnerBrowser::dontSeeInCurrentUrl() - */ - public function cantSeeInCurrentUrl($uri) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('dontSeeInCurrentUrl', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the current URI doesn't contain the given string. - * - * ``` php - * dontSeeInCurrentUrl('/users/'); - * ?> - * ``` - * - * @param $uri - * @see \Codeception\Lib\InnerBrowser::dontSeeInCurrentUrl() - */ - public function dontSeeInCurrentUrl($uri) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('dontSeeInCurrentUrl', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the current URL is equal to the given string. - * Unlike `seeInCurrentUrl`, this only matches the full URL. - * - * ``` php - * seeCurrentUrlEquals('/'); - * ?> - * ``` - * - * @param $uri - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Lib\InnerBrowser::seeCurrentUrlEquals() - */ - public function canSeeCurrentUrlEquals($uri) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeCurrentUrlEquals', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the current URL is equal to the given string. - * Unlike `seeInCurrentUrl`, this only matches the full URL. - * - * ``` php - * seeCurrentUrlEquals('/'); - * ?> - * ``` - * - * @param $uri - * @see \Codeception\Lib\InnerBrowser::seeCurrentUrlEquals() - */ - public function seeCurrentUrlEquals($uri) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeCurrentUrlEquals', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the current URL doesn't equal the given string. - * Unlike `dontSeeInCurrentUrl`, this only matches the full URL. - * - * ``` php - * dontSeeCurrentUrlEquals('/'); - * ?> - * ``` - * - * @param $uri - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Lib\InnerBrowser::dontSeeCurrentUrlEquals() - */ - public function cantSeeCurrentUrlEquals($uri) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('dontSeeCurrentUrlEquals', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the current URL doesn't equal the given string. - * Unlike `dontSeeInCurrentUrl`, this only matches the full URL. - * - * ``` php - * dontSeeCurrentUrlEquals('/'); - * ?> - * ``` - * - * @param $uri - * @see \Codeception\Lib\InnerBrowser::dontSeeCurrentUrlEquals() - */ - public function dontSeeCurrentUrlEquals($uri) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('dontSeeCurrentUrlEquals', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the current URL matches the given regular expression. - * - * ``` php - * seeCurrentUrlMatches('~$/users/(\d+)~'); - * ?> - * ``` - * - * @param $uri - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Lib\InnerBrowser::seeCurrentUrlMatches() - */ - public function canSeeCurrentUrlMatches($uri) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeCurrentUrlMatches', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the current URL matches the given regular expression. - * - * ``` php - * seeCurrentUrlMatches('~$/users/(\d+)~'); - * ?> - * ``` - * - * @param $uri - * @see \Codeception\Lib\InnerBrowser::seeCurrentUrlMatches() - */ - public function seeCurrentUrlMatches($uri) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeCurrentUrlMatches', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that current url doesn't match the given regular expression. - * - * ``` php - * dontSeeCurrentUrlMatches('~$/users/(\d+)~'); - * ?> - * ``` - * - * @param $uri - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Lib\InnerBrowser::dontSeeCurrentUrlMatches() - */ - public function cantSeeCurrentUrlMatches($uri) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('dontSeeCurrentUrlMatches', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that current url doesn't match the given regular expression. - * - * ``` php - * dontSeeCurrentUrlMatches('~$/users/(\d+)~'); - * ?> - * ``` - * - * @param $uri - * @see \Codeception\Lib\InnerBrowser::dontSeeCurrentUrlMatches() - */ - public function dontSeeCurrentUrlMatches($uri) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('dontSeeCurrentUrlMatches', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Executes the given regular expression against the current URI and returns the first match. - * If no parameters are provided, the full URI is returned. - * - * ``` php - * grabFromCurrentUrl('~$/user/(\d+)/~'); - * $uri = $I->grabFromCurrentUrl(); - * ?> - * ``` - * - * @param null $uri - * - * @return mixed - * @see \Codeception\Lib\InnerBrowser::grabFromCurrentUrl() - */ - public function grabFromCurrentUrl($uri = null) { - return $this->getScenario()->runStep(new \Codeception\Step\Action('grabFromCurrentUrl', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the specified checkbox is checked. - * - * ``` php - * seeCheckboxIsChecked('#agree'); // I suppose user agreed to terms - * $I->seeCheckboxIsChecked('#signup_form input[type=checkbox]'); // I suppose user agreed to terms, If there is only one checkbox in form. - * $I->seeCheckboxIsChecked('//form/input[@type=checkbox and @name=agree]'); - * ?> - * ``` - * - * @param $checkbox - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Lib\InnerBrowser::seeCheckboxIsChecked() - */ - public function canSeeCheckboxIsChecked($checkbox) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeCheckboxIsChecked', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the specified checkbox is checked. - * - * ``` php - * seeCheckboxIsChecked('#agree'); // I suppose user agreed to terms - * $I->seeCheckboxIsChecked('#signup_form input[type=checkbox]'); // I suppose user agreed to terms, If there is only one checkbox in form. - * $I->seeCheckboxIsChecked('//form/input[@type=checkbox and @name=agree]'); - * ?> - * ``` - * - * @param $checkbox - * @see \Codeception\Lib\InnerBrowser::seeCheckboxIsChecked() - */ - public function seeCheckboxIsChecked($checkbox) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeCheckboxIsChecked', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Check that the specified checkbox is unchecked. - * - * ``` php - * dontSeeCheckboxIsChecked('#agree'); // I suppose user didn't agree to terms - * $I->seeCheckboxIsChecked('#signup_form input[type=checkbox]'); // I suppose user didn't check the first checkbox in form. - * ?> - * ``` - * - * @param $checkbox - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Lib\InnerBrowser::dontSeeCheckboxIsChecked() - */ - public function cantSeeCheckboxIsChecked($checkbox) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('dontSeeCheckboxIsChecked', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Check that the specified checkbox is unchecked. - * - * ``` php - * dontSeeCheckboxIsChecked('#agree'); // I suppose user didn't agree to terms - * $I->seeCheckboxIsChecked('#signup_form input[type=checkbox]'); // I suppose user didn't check the first checkbox in form. - * ?> - * ``` - * - * @param $checkbox - * @see \Codeception\Lib\InnerBrowser::dontSeeCheckboxIsChecked() - */ - public function dontSeeCheckboxIsChecked($checkbox) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('dontSeeCheckboxIsChecked', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the given input field or textarea contains the given value. - * For fuzzy locators, fields are matched by label text, the "name" attribute, CSS, and XPath. - * - * ``` php - * seeInField('Body','Type your comment here'); - * $I->seeInField('form textarea[name=body]','Type your comment here'); - * $I->seeInField('form input[type=hidden]','hidden_value'); - * $I->seeInField('#searchform input','Search'); - * $I->seeInField('//form/*[@name=search]','Search'); - * $I->seeInField(['name' => 'search'], 'Search'); - * ?> - * ``` - * - * @param $field - * @param $value - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Lib\InnerBrowser::seeInField() - */ - public function canSeeInField($field, $value) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeInField', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the given input field or textarea contains the given value. - * For fuzzy locators, fields are matched by label text, the "name" attribute, CSS, and XPath. - * - * ``` php - * seeInField('Body','Type your comment here'); - * $I->seeInField('form textarea[name=body]','Type your comment here'); - * $I->seeInField('form input[type=hidden]','hidden_value'); - * $I->seeInField('#searchform input','Search'); - * $I->seeInField('//form/*[@name=search]','Search'); - * $I->seeInField(['name' => 'search'], 'Search'); - * ?> - * ``` - * - * @param $field - * @param $value - * @see \Codeception\Lib\InnerBrowser::seeInField() - */ - public function seeInField($field, $value) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeInField', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that an input field or textarea doesn't contain the given value. - * For fuzzy locators, the field is matched by label text, CSS and XPath. - * - * ``` php - * dontSeeInField('Body','Type your comment here'); - * $I->dontSeeInField('form textarea[name=body]','Type your comment here'); - * $I->dontSeeInField('form input[type=hidden]','hidden_value'); - * $I->dontSeeInField('#searchform input','Search'); - * $I->dontSeeInField('//form/*[@name=search]','Search'); - * $I->dontSeeInField(['name' => 'search'], 'Search'); - * ?> - * ``` - * - * @param $field - * @param $value - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Lib\InnerBrowser::dontSeeInField() - */ - public function cantSeeInField($field, $value) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('dontSeeInField', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that an input field or textarea doesn't contain the given value. - * For fuzzy locators, the field is matched by label text, CSS and XPath. - * - * ``` php - * dontSeeInField('Body','Type your comment here'); - * $I->dontSeeInField('form textarea[name=body]','Type your comment here'); - * $I->dontSeeInField('form input[type=hidden]','hidden_value'); - * $I->dontSeeInField('#searchform input','Search'); - * $I->dontSeeInField('//form/*[@name=search]','Search'); - * $I->dontSeeInField(['name' => 'search'], 'Search'); - * ?> - * ``` - * - * @param $field - * @param $value - * @see \Codeception\Lib\InnerBrowser::dontSeeInField() - */ - public function dontSeeInField($field, $value) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('dontSeeInField', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks if the array of form parameters (name => value) are set on the form matched with the - * passed selector. - * - * ``` php - * seeInFormFields('form[name=myform]', [ - * 'input1' => 'value', - * 'input2' => 'other value', - * ]); - * ?> - * ``` - * - * For multi-select elements, or to check values of multiple elements with the same name, an - * array may be passed: - * - * ``` php - * seeInFormFields('.form-class', [ - * 'multiselect' => [ - * 'value1', - * 'value2', - * ], - * 'checkbox[]' => [ - * 'a checked value', - * 'another checked value', - * ], - * ]); - * ?> - * ``` - * - * Additionally, checkbox values can be checked with a boolean. - * - * ``` php - * seeInFormFields('#form-id', [ - * 'checkbox1' => true, // passes if checked - * 'checkbox2' => false, // passes if unchecked - * ]); - * ?> - * ``` - * - * Pair this with submitForm for quick testing magic. - * - * ``` php - * 'value', - * 'field2' => 'another value', - * 'checkbox1' => true, - * // ... - * ]; - * $I->submitForm('//form[@id=my-form]', $form, 'submitButton'); - * // $I->amOnPage('/path/to/form-page') may be needed - * $I->seeInFormFields('//form[@id=my-form]', $form); - * ?> - * ``` - * - * @param $formSelector - * @param $params - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Lib\InnerBrowser::seeInFormFields() - */ - public function canSeeInFormFields($formSelector, $params) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeInFormFields', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks if the array of form parameters (name => value) are set on the form matched with the - * passed selector. - * - * ``` php - * seeInFormFields('form[name=myform]', [ - * 'input1' => 'value', - * 'input2' => 'other value', - * ]); - * ?> - * ``` - * - * For multi-select elements, or to check values of multiple elements with the same name, an - * array may be passed: - * - * ``` php - * seeInFormFields('.form-class', [ - * 'multiselect' => [ - * 'value1', - * 'value2', - * ], - * 'checkbox[]' => [ - * 'a checked value', - * 'another checked value', - * ], - * ]); - * ?> - * ``` - * - * Additionally, checkbox values can be checked with a boolean. - * - * ``` php - * seeInFormFields('#form-id', [ - * 'checkbox1' => true, // passes if checked - * 'checkbox2' => false, // passes if unchecked - * ]); - * ?> - * ``` - * - * Pair this with submitForm for quick testing magic. - * - * ``` php - * 'value', - * 'field2' => 'another value', - * 'checkbox1' => true, - * // ... - * ]; - * $I->submitForm('//form[@id=my-form]', $form, 'submitButton'); - * // $I->amOnPage('/path/to/form-page') may be needed - * $I->seeInFormFields('//form[@id=my-form]', $form); - * ?> - * ``` - * - * @param $formSelector - * @param $params - * @see \Codeception\Lib\InnerBrowser::seeInFormFields() - */ - public function seeInFormFields($formSelector, $params) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeInFormFields', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks if the array of form parameters (name => value) are not set on the form matched with - * the passed selector. - * - * ``` php - * dontSeeInFormFields('form[name=myform]', [ - * 'input1' => 'non-existent value', - * 'input2' => 'other non-existent value', - * ]); - * ?> - * ``` - * - * To check that an element hasn't been assigned any one of many values, an array can be passed - * as the value: - * - * ``` php - * dontSeeInFormFields('.form-class', [ - * 'fieldName' => [ - * 'This value shouldn\'t be set', - * 'And this value shouldn\'t be set', - * ], - * ]); - * ?> - * ``` - * - * Additionally, checkbox values can be checked with a boolean. - * - * ``` php - * dontSeeInFormFields('#form-id', [ - * 'checkbox1' => true, // fails if checked - * 'checkbox2' => false, // fails if unchecked - * ]); - * ?> - * ``` - * - * @param $formSelector - * @param $params - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Lib\InnerBrowser::dontSeeInFormFields() - */ - public function cantSeeInFormFields($formSelector, $params) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('dontSeeInFormFields', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks if the array of form parameters (name => value) are not set on the form matched with - * the passed selector. - * - * ``` php - * dontSeeInFormFields('form[name=myform]', [ - * 'input1' => 'non-existent value', - * 'input2' => 'other non-existent value', - * ]); - * ?> - * ``` - * - * To check that an element hasn't been assigned any one of many values, an array can be passed - * as the value: - * - * ``` php - * dontSeeInFormFields('.form-class', [ - * 'fieldName' => [ - * 'This value shouldn\'t be set', - * 'And this value shouldn\'t be set', - * ], - * ]); - * ?> - * ``` - * - * Additionally, checkbox values can be checked with a boolean. - * - * ``` php - * dontSeeInFormFields('#form-id', [ - * 'checkbox1' => true, // fails if checked - * 'checkbox2' => false, // fails if unchecked - * ]); - * ?> - * ``` - * - * @param $formSelector - * @param $params - * @see \Codeception\Lib\InnerBrowser::dontSeeInFormFields() - */ - public function dontSeeInFormFields($formSelector, $params) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('dontSeeInFormFields', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Submits the given form on the page, optionally with the given form - * values. Pass the form field's values as an array in the second - * parameter. - * - * Although this function can be used as a short-hand version of - * `fillField()`, `selectOption()`, `click()` etc. it has some important - * differences: - * - * * Only field *names* may be used, not CSS/XPath selectors nor field labels - * * If a field is sent to this function that does *not* exist on the page, - * it will silently be added to the HTTP request. This is helpful for testing - * some types of forms, but be aware that you will *not* get an exception - * like you would if you called `fillField()` or `selectOption()` with - * a missing field. - * - * Fields that are not provided will be filled by their values from the page, - * or from any previous calls to `fillField()`, `selectOption()` etc. - * You don't need to click the 'Submit' button afterwards. - * This command itself triggers the request to form's action. - * - * You can optionally specify which button's value to include - * in the request with the last parameter (as an alternative to - * explicitly setting its value in the second parameter), as - * button values are not otherwise included in the request. - * - * Examples: - * - * ``` php - * submitForm('#login', [ - * 'login' => 'davert', - * 'password' => '123456' - * ]); - * // or - * $I->submitForm('#login', [ - * 'login' => 'davert', - * 'password' => '123456' - * ], 'submitButtonName'); - * - * ``` - * - * For example, given this sample "Sign Up" form: - * - * ``` html - *
    - * Login: - *
    - * Password: - *
    - * Do you agree to our terms? - *
    - * Select pricing plan: - * - * - * - * ``` - * - * You could write the following to submit it: - * - * ``` php - * submitForm( - * '#userForm', - * [ - * 'user' => [ - * 'login' => 'Davert', - * 'password' => '123456', - * 'agree' => true - * ] - * ], - * 'submitButton' - * ); - * ``` - * Note that "2" will be the submitted value for the "plan" field, as it is - * the selected option. - * - * You can also emulate a JavaScript submission by not specifying any - * buttons in the third parameter to submitForm. - * - * ```php - * submitForm( - * '#userForm', - * [ - * 'user' => [ - * 'login' => 'Davert', - * 'password' => '123456', - * 'agree' => true - * ] - * ] - * ); - * ``` - * - * This function works well when paired with `seeInFormFields()` - * for quickly testing CRUD interfaces and form validation logic. - * - * ``` php - * 'value', - * 'field2' => 'another value', - * 'checkbox1' => true, - * // ... - * ]; - * $I->submitForm('#my-form', $form, 'submitButton'); - * // $I->amOnPage('/path/to/form-page') may be needed - * $I->seeInFormFields('#my-form', $form); - * ``` - * - * Parameter values can be set to arrays for multiple input fields - * of the same name, or multi-select combo boxes. For checkboxes, - * you can use either the string value or boolean `true`/`false` which will - * be replaced by the checkbox's value in the DOM. - * - * ``` php - * submitForm('#my-form', [ - * 'field1' => 'value', - * 'checkbox' => [ - * 'value of first checkbox', - * 'value of second checkbox', - * ], - * 'otherCheckboxes' => [ - * true, - * false, - * false - * ], - * 'multiselect' => [ - * 'first option value', - * 'second option value' - * ] - * ]); - * ``` - * - * Mixing string and boolean values for a checkbox's value is not supported - * and may produce unexpected results. - * - * Field names ending in `[]` must be passed without the trailing square - * bracket characters, and must contain an array for its value. This allows - * submitting multiple values with the same name, consider: - * - * ```php - * submitForm('#my-form', [ - * 'field[]' => 'value', - * 'field[]' => 'another value', // 'field[]' is already a defined key - * ]); - * ``` - * - * The solution is to pass an array value: - * - * ```php - * submitForm('#my-form', [ - * 'field' => [ - * 'value', - * 'another value', - * ] - * ]); - * ``` - * - * @param $selector - * @param $params - * @param $button - * @see \Codeception\Lib\InnerBrowser::submitForm() - */ - public function submitForm($selector, $params, $button = null) { - return $this->getScenario()->runStep(new \Codeception\Step\Action('submitForm', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Fills a text field or textarea with the given string. - * - * ``` php - * fillField("//input[@type='text']", "Hello World!"); - * $I->fillField(['name' => 'email'], 'jon@mail.com'); - * ?> - * ``` - * - * @param $field - * @param $value - * @see \Codeception\Lib\InnerBrowser::fillField() - */ - public function fillField($field, $value) { - return $this->getScenario()->runStep(new \Codeception\Step\Action('fillField', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Selects an option in a select tag or in radio button group. - * - * ``` php - * selectOption('form select[name=account]', 'Premium'); - * $I->selectOption('form input[name=payment]', 'Monthly'); - * $I->selectOption('//form/select[@name=account]', 'Monthly'); - * ?> - * ``` - * - * Provide an array for the second argument to select multiple options: - * - * ``` php - * selectOption('Which OS do you use?', array('Windows','Linux')); - * ?> - * ``` - * - * Or provide an associative array for the second argument to specifically define which selection method should be used: - * - * ``` php - * selectOption('Which OS do you use?', array('text' => 'Windows')); // Only search by text 'Windows' - * $I->selectOption('Which OS do you use?', array('value' => 'windows')); // Only search by value 'windows' - * ?> - + ``` - * - * @param $select - * @param $option - * @see \Codeception\Lib\InnerBrowser::selectOption() - */ - public function selectOption($select, $option) { - return $this->getScenario()->runStep(new \Codeception\Step\Action('selectOption', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Ticks a checkbox. For radio buttons, use the `selectOption` method instead. - * - * ``` php - * checkOption('#agree'); - * ?> - * ``` - * - * @param $option - * @see \Codeception\Lib\InnerBrowser::checkOption() - */ - public function checkOption($option) { - return $this->getScenario()->runStep(new \Codeception\Step\Action('checkOption', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Unticks a checkbox. - * - * ``` php - * uncheckOption('#notify'); - * ?> - * ``` - * - * @param $option - * @see \Codeception\Lib\InnerBrowser::uncheckOption() - */ - public function uncheckOption($option) { - return $this->getScenario()->runStep(new \Codeception\Step\Action('uncheckOption', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Attaches a file relative to the Codeception data directory to the given file upload field. - * - * ``` php - * attachFile('input[@type="file"]', 'prices.xls'); - * ?> - * ``` - * - * @param $field - * @param $filename - * @see \Codeception\Lib\InnerBrowser::attachFile() - */ - public function attachFile($field, $filename) { - return $this->getScenario()->runStep(new \Codeception\Step\Action('attachFile', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * If your page triggers an ajax request, you can perform it manually. - * This action sends a GET ajax request with specified params. - * - * See ->sendAjaxPostRequest for examples. - * - * @param $uri - * @param $params - * @see \Codeception\Lib\InnerBrowser::sendAjaxGetRequest() - */ - public function sendAjaxGetRequest($uri, $params = null) { - return $this->getScenario()->runStep(new \Codeception\Step\Action('sendAjaxGetRequest', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * If your page triggers an ajax request, you can perform it manually. - * This action sends a POST ajax request with specified params. - * Additional params can be passed as array. - * - * Example: - * - * Imagine that by clicking checkbox you trigger ajax request which updates user settings. - * We emulate that click by running this ajax request manually. - * - * ``` php - * sendAjaxPostRequest('/updateSettings', array('notifications' => true)); // POST - * $I->sendAjaxGetRequest('/updateSettings', array('notifications' => true)); // GET - * - * ``` - * - * @param $uri - * @param $params - * @see \Codeception\Lib\InnerBrowser::sendAjaxPostRequest() - */ - public function sendAjaxPostRequest($uri, $params = null) { - return $this->getScenario()->runStep(new \Codeception\Step\Action('sendAjaxPostRequest', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * If your page triggers an ajax request, you can perform it manually. - * This action sends an ajax request with specified method and params. - * - * Example: - * - * You need to perform an ajax request specifying the HTTP method. - * - * ``` php - * sendAjaxRequest('PUT', '/posts/7', array('title' => 'new title')); - * - * ``` - * - * @param $method - * @param $uri - * @param $params - * @see \Codeception\Lib\InnerBrowser::sendAjaxRequest() - */ - public function sendAjaxRequest($method, $uri, $params = null) { - return $this->getScenario()->runStep(new \Codeception\Step\Action('sendAjaxRequest', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Finds and returns the text contents of the given element. - * If a fuzzy locator is used, the element is found using CSS, XPath, - * and by matching the full page source by regular expression. - * - * ``` php - * grabTextFrom('h1'); - * $heading = $I->grabTextFrom('descendant-or-self::h1'); - * $value = $I->grabTextFrom('~ - * ``` - * - * @param $cssOrXPathOrRegex - * - * @return mixed - * @see \Codeception\Lib\InnerBrowser::grabTextFrom() - */ - public function grabTextFrom($cssOrXPathOrRegex) { - return $this->getScenario()->runStep(new \Codeception\Step\Action('grabTextFrom', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Grabs the value of the given attribute value from the given element. - * Fails if element is not found. - * - * ``` php - * grabAttributeFrom('#tooltip', 'title'); - * ?> - * ``` - * - * - * @param $cssOrXpath - * @param $attribute - * - * @return mixed - * @see \Codeception\Lib\InnerBrowser::grabAttributeFrom() - */ - public function grabAttributeFrom($cssOrXpath, $attribute) { - return $this->getScenario()->runStep(new \Codeception\Step\Action('grabAttributeFrom', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Grabs either the text content, or attribute values, of nodes - * matched by $cssOrXpath and returns them as an array. - * - * ```html - * First - * Second - * Third - * ``` - * - * ```php - * grabMultiple('a'); - * - * // would return ['#first', '#second', '#third'] - * $aLinks = $I->grabMultiple('a', 'href'); - * ?> - * ``` - * - * @param $cssOrXpath - * @param $attribute - * @return string[] - * @see \Codeception\Lib\InnerBrowser::grabMultiple() - */ - public function grabMultiple($cssOrXpath, $attribute = null) { - return $this->getScenario()->runStep(new \Codeception\Step\Action('grabMultiple', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * @param $field - * - * @return array|mixed|null|string - * @see \Codeception\Lib\InnerBrowser::grabValueFrom() - */ - public function grabValueFrom($field) { - return $this->getScenario()->runStep(new \Codeception\Step\Action('grabValueFrom', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Sets a cookie with the given name and value. - * You can set additional cookie params like `domain`, `path`, `expires`, `secure` in array passed as last argument. - * - * ``` php - * setCookie('PHPSESSID', 'el4ukv0kqbvoirg7nkp4dncpk3'); - * ?> - * ``` - * - * @param $name - * @param $val - * @param array $params - * - * @return mixed - * @see \Codeception\Lib\InnerBrowser::setCookie() - */ - public function setCookie($name, $val, $params = null) { - return $this->getScenario()->runStep(new \Codeception\Step\Action('setCookie', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Grabs a cookie value. - * You can set additional cookie params like `domain`, `path` in array passed as last argument. - * - * @param $cookie - * - * @param array $params - * @return mixed - * @see \Codeception\Lib\InnerBrowser::grabCookie() - */ - public function grabCookie($cookie, $params = null) { - return $this->getScenario()->runStep(new \Codeception\Step\Action('grabCookie', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that a cookie with the given name is set. - * You can set additional cookie params like `domain`, `path` as array passed in last argument. - * - * ``` php - * seeCookie('PHPSESSID'); - * ?> - * ``` - * - * @param $cookie - * @param array $params - * @return mixed - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Lib\InnerBrowser::seeCookie() - */ - public function canSeeCookie($cookie, $params = null) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeCookie', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that a cookie with the given name is set. - * You can set additional cookie params like `domain`, `path` as array passed in last argument. - * - * ``` php - * seeCookie('PHPSESSID'); - * ?> - * ``` - * - * @param $cookie - * @param array $params - * @return mixed - * @see \Codeception\Lib\InnerBrowser::seeCookie() - */ - public function seeCookie($cookie, $params = null) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeCookie', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that there isn't a cookie with the given name. - * You can set additional cookie params like `domain`, `path` as array passed in last argument. - * - * @param $cookie - * - * @param array $params - * @return mixed - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Lib\InnerBrowser::dontSeeCookie() - */ - public function cantSeeCookie($cookie, $params = null) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('dontSeeCookie', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that there isn't a cookie with the given name. - * You can set additional cookie params like `domain`, `path` as array passed in last argument. - * - * @param $cookie - * - * @param array $params - * @return mixed - * @see \Codeception\Lib\InnerBrowser::dontSeeCookie() - */ - public function dontSeeCookie($cookie, $params = null) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('dontSeeCookie', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Unsets cookie with the given name. - * You can set additional cookie params like `domain`, `path` in array passed as last argument. - * - * @param $cookie - * - * @param array $params - * @return mixed - * @see \Codeception\Lib\InnerBrowser::resetCookie() - */ - public function resetCookie($name, $params = null) { - return $this->getScenario()->runStep(new \Codeception\Step\Action('resetCookie', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the given element exists on the page and is visible. - * You can also specify expected attributes of this element. - * - * ``` php - * seeElement('.error'); - * $I->seeElement('//form/input[1]'); - * $I->seeElement('input', ['name' => 'login']); - * $I->seeElement('input', ['value' => '123456']); - * - * // strict locator in first arg, attributes in second - * $I->seeElement(['css' => 'form input'], ['name' => 'login']); - * ?> - * ``` - * - * @param $selector - * @param array $attributes - * @return - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Lib\InnerBrowser::seeElement() - */ - public function canSeeElement($selector, $attributes = null) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeElement', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the given element exists on the page and is visible. - * You can also specify expected attributes of this element. - * - * ``` php - * seeElement('.error'); - * $I->seeElement('//form/input[1]'); - * $I->seeElement('input', ['name' => 'login']); - * $I->seeElement('input', ['value' => '123456']); - * - * // strict locator in first arg, attributes in second - * $I->seeElement(['css' => 'form input'], ['name' => 'login']); - * ?> - * ``` - * - * @param $selector - * @param array $attributes - * @return - * @see \Codeception\Lib\InnerBrowser::seeElement() - */ - public function seeElement($selector, $attributes = null) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeElement', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the given element is invisible or not present on the page. - * You can also specify expected attributes of this element. - * - * ``` php - * dontSeeElement('.error'); - * $I->dontSeeElement('//form/input[1]'); - * $I->dontSeeElement('input', ['name' => 'login']); - * $I->dontSeeElement('input', ['value' => '123456']); - * ?> - * ``` - * - * @param $selector - * @param array $attributes - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Lib\InnerBrowser::dontSeeElement() - */ - public function cantSeeElement($selector, $attributes = null) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('dontSeeElement', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the given element is invisible or not present on the page. - * You can also specify expected attributes of this element. - * - * ``` php - * dontSeeElement('.error'); - * $I->dontSeeElement('//form/input[1]'); - * $I->dontSeeElement('input', ['name' => 'login']); - * $I->dontSeeElement('input', ['value' => '123456']); - * ?> - * ``` - * - * @param $selector - * @param array $attributes - * @see \Codeception\Lib\InnerBrowser::dontSeeElement() - */ - public function dontSeeElement($selector, $attributes = null) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('dontSeeElement', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that there are a certain number of elements matched by the given locator on the page. - * - * ``` php - * seeNumberOfElements('tr', 10); - * $I->seeNumberOfElements('tr', [0,10]); //between 0 and 10 elements - * ?> - * ``` - * @param $selector - * @param mixed $expected : - * - string: strict number - * - array: range of numbers [0,10] - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Lib\InnerBrowser::seeNumberOfElements() - */ - public function canSeeNumberOfElements($selector, $expected) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeNumberOfElements', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that there are a certain number of elements matched by the given locator on the page. - * - * ``` php - * seeNumberOfElements('tr', 10); - * $I->seeNumberOfElements('tr', [0,10]); //between 0 and 10 elements - * ?> - * ``` - * @param $selector - * @param mixed $expected : - * - string: strict number - * - array: range of numbers [0,10] - * @see \Codeception\Lib\InnerBrowser::seeNumberOfElements() - */ - public function seeNumberOfElements($selector, $expected) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeNumberOfElements', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the given option is selected. - * - * ``` php - * seeOptionIsSelected('#form input[name=payment]', 'Visa'); - * ?> - * ``` - * - * @param $selector - * @param $optionText - * - * @return mixed - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Lib\InnerBrowser::seeOptionIsSelected() - */ - public function canSeeOptionIsSelected($selector, $optionText) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeOptionIsSelected', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the given option is selected. - * - * ``` php - * seeOptionIsSelected('#form input[name=payment]', 'Visa'); - * ?> - * ``` - * - * @param $selector - * @param $optionText - * - * @return mixed - * @see \Codeception\Lib\InnerBrowser::seeOptionIsSelected() - */ - public function seeOptionIsSelected($selector, $optionText) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeOptionIsSelected', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the given option is not selected. - * - * ``` php - * dontSeeOptionIsSelected('#form input[name=payment]', 'Visa'); - * ?> - * ``` - * - * @param $selector - * @param $optionText - * - * @return mixed - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Lib\InnerBrowser::dontSeeOptionIsSelected() - */ - public function cantSeeOptionIsSelected($selector, $optionText) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('dontSeeOptionIsSelected', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the given option is not selected. - * - * ``` php - * dontSeeOptionIsSelected('#form input[name=payment]', 'Visa'); - * ?> - * ``` - * - * @param $selector - * @param $optionText - * - * @return mixed - * @see \Codeception\Lib\InnerBrowser::dontSeeOptionIsSelected() - */ - public function dontSeeOptionIsSelected($selector, $optionText) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('dontSeeOptionIsSelected', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Asserts that current page has 404 response status code. - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Lib\InnerBrowser::seePageNotFound() - */ - public function canSeePageNotFound() { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seePageNotFound', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Asserts that current page has 404 response status code. - * @see \Codeception\Lib\InnerBrowser::seePageNotFound() - */ - public function seePageNotFound() { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seePageNotFound', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that response code is equal to value provided. - * - * ```php - * seeResponseCodeIs(200); - * - * // recommended \Codeception\Util\HttpCode - * $I->seeResponseCodeIs(\Codeception\Util\HttpCode::OK); - * ``` - * - * @param $code - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Lib\InnerBrowser::seeResponseCodeIs() - */ - public function canSeeResponseCodeIs($code) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeResponseCodeIs', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that response code is equal to value provided. - * - * ```php - * seeResponseCodeIs(200); - * - * // recommended \Codeception\Util\HttpCode - * $I->seeResponseCodeIs(\Codeception\Util\HttpCode::OK); - * ``` - * - * @param $code - * @see \Codeception\Lib\InnerBrowser::seeResponseCodeIs() - */ - public function seeResponseCodeIs($code) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeResponseCodeIs', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that response code is equal to value provided. - * - * ```php - * dontSeeResponseCodeIs(200); - * - * // recommended \Codeception\Util\HttpCode - * $I->dontSeeResponseCodeIs(\Codeception\Util\HttpCode::OK); - * ``` - * @param $code - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Lib\InnerBrowser::dontSeeResponseCodeIs() - */ - public function cantSeeResponseCodeIs($code) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('dontSeeResponseCodeIs', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that response code is equal to value provided. - * - * ```php - * dontSeeResponseCodeIs(200); - * - * // recommended \Codeception\Util\HttpCode - * $I->dontSeeResponseCodeIs(\Codeception\Util\HttpCode::OK); - * ``` - * @param $code - * @see \Codeception\Lib\InnerBrowser::dontSeeResponseCodeIs() - */ - public function dontSeeResponseCodeIs($code) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('dontSeeResponseCodeIs', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the page title contains the given string. - * - * ``` php - * seeInTitle('Blog - Post #1'); - * ?> - * ``` - * - * @param $title - * - * @return mixed - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Lib\InnerBrowser::seeInTitle() - */ - public function canSeeInTitle($title) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('seeInTitle', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the page title contains the given string. - * - * ``` php - * seeInTitle('Blog - Post #1'); - * ?> - * ``` - * - * @param $title - * - * @return mixed - * @see \Codeception\Lib\InnerBrowser::seeInTitle() - */ - public function seeInTitle($title) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('seeInTitle', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the page title does not contain the given string. - * - * @param $title - * - * @return mixed - * Conditional Assertion: Test won't be stopped on fail - * @see \Codeception\Lib\InnerBrowser::dontSeeInTitle() - */ - public function cantSeeInTitle($title) { - return $this->getScenario()->runStep(new \Codeception\Step\ConditionalAssertion('dontSeeInTitle', func_get_args())); - } - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Checks that the page title does not contain the given string. - * - * @param $title - * - * @return mixed - * @see \Codeception\Lib\InnerBrowser::dontSeeInTitle() - */ - public function dontSeeInTitle($title) { - return $this->getScenario()->runStep(new \Codeception\Step\Assertion('dontSeeInTitle', func_get_args())); - } - - - /** - * [!] Method is generated. Documentation taken from corresponding module. - * - * Switch to iframe or frame on the page. - * - * Example: - * ``` html - *
    ".$p->t('abgabetool/student').": ".$db->convert_html_chars($studentenname).""; -if ($num_rows_sem >= 1) + +$semester_benotbar = $num_rows_sem >= 1; +$endupload_vorhanden = $num_rows_endupload >= 1; + +if ($semester_benotbar && $endupload_vorhanden) { $htmlstr .= "
    "; $htmlstr .= "\n"; @@ -466,9 +484,10 @@ if ($num_rows_sem >= 1) } else { + $quick_info = !$semester_benotbar ? $p->t('abgabetool/aeltereParbeitBenoten') : $p->t('abgabetool/keinEnduploadErfolgt'); $htmlstr .= ""; - $htmlstr .= ""; + $htmlstr .= ""; $htmlstr .= "
    "; } $htmlstr .= "
    ".(isset($row_vertretung->kurzbz)?$row_vertretung->kurzbz:'')." ".(isset($erreichbarkeit_arr[$row->erreichbarkeit])?$erreichbarkeit_arr[$row->erreichbarkeit]:'')." ".($row->freigabeamum!=''?'Ja':'')."  ".$p->t('zeitsperre/loeschen')."".$p->t('zeitsperre/loeschen')."