diff --git a/cis/private/lehre/pruefung/pruefung.js.php b/cis/private/lehre/pruefung/pruefung.js.php index 73b808d14..ea4c1eff0 100644 --- a/cis/private/lehre/pruefung/pruefung.js.php +++ b/cis/private/lehre/pruefung/pruefung.js.php @@ -1231,6 +1231,42 @@ function loadPruefungStudiengang(studiensemester) }); } +function terminezusammenlegen(termine, lv_id) +{ + if(termine.length <= 1) + return; + + $.ajax({ + dataType: 'json', + url: "./pruefungsanmeldung.json.php", + type: "POST", + data: { + method: "terminezusammenlegen", + 'termine[]': termine, + lv_id: lv_id + }, + error: loadError, + success: function(data){ + if(data.error === 'false') + { + loadPruefungStudiengang() + $("#anmeldung_hinzufuegen").empty(); + $("#lvdaten").empty(); + $("#anmeldeDaten").empty(); + $("#reihungSpeichernButton").empty(); + $("#kommentar").empty(); + $("#kommentarSpeichernButton").empty(); + $("#raumLink").empty(); + $("#listeDrucken").empty(); + } + else + { + messageBox("message", data.errormsg, "red", "highlight", 10000); + } + } + }); +} + /** * Zeigt das Formularfeld zur Eingabe eines Kommentars in der Anmeldungsverwaltung an. * @param {String} vorname Vorname des Studenten diff --git a/cis/private/lehre/pruefung/pruefungsanmeldung.json.php b/cis/private/lehre/pruefung/pruefungsanmeldung.json.php index c286f666e..f06898068 100644 --- a/cis/private/lehre/pruefung/pruefungsanmeldung.json.php +++ b/cis/private/lehre/pruefung/pruefungsanmeldung.json.php @@ -110,6 +110,11 @@ switch($method) $studiensemester = filter_input(INPUT_POST,"studiensemester"); $data = getPruefungenStudiengangBySemester($studiensemester); break; + case 'terminezusammenlegen': + $termine = filter_input(INPUT_POST, 'termine', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY); + $lv_id = filter_input(INPUT_POST, 'lv_id'); + $data = terminezusammenlegen($termine, $lv_id); + break; case 'saveKommentar': $data = saveKommentar(); break; @@ -1285,6 +1290,211 @@ function getPruefungenStudiengangBySemester($aktStudiensemester) return $data; } +function terminezusammenlegen($termine, $lv_id) +{ + $result = array(); + $alle_termine = array(); + $error = false; + $terminkollision = defined('CIS_PRUEFUNGSANMELDUNG_ERLAUBE_TERMINKOLLISION') ? CIS_PRUEFUNGSANMELDUNG_ERLAUBE_TERMINKOLLISION : false; + foreach($termine as $termin) + { + $pruefungstermin = new pruefungstermin(); + $pruefungstermin->load($termin); + $pruefung = new pruefungCis(); + $pruefung->load($pruefungstermin->pruefung_id); + $pruefung->getLehrveranstaltungenByPruefung(); + + $lehrveranstaltungen = array_column($pruefung->lehrveranstaltungen, 'lehrveranstaltung_id'); + if (!in_array($lv_id, $lehrveranstaltungen)) + continue; + + $pruefung->lehrveranstaltung_id = $lv_id; + $pruefung->termin = $pruefungstermin; + $alle_termine[] = $pruefung; + } + + + if (count($alle_termine) >= 1) + { + usort($alle_termine, function($a, $b) { + return strcmp($a->termin->von, $b->termin->von); + }); + + $first_termin = $alle_termine[0]; + + $first_mitarbeiter = $first_termin->mitarbeiter_uid; + $first_date = date('Y-m-d', strtotime($first_termin->termin->von)); + $first_studiensemester = $first_termin->studiensemester_kurzbz; + $first_sammelklausur = $first_termin->termin->sammelklausur; + $first_ort = $first_termin->termin->ort_kurzbz; + $first_raum = $first_termin->termin->anderer_raum; + $first_lv = $first_termin->lehrveranstaltung_id; + $first_titel = $first_termin->titel; + + $max_von = strtotime($first_termin->termin->von); + $max_bis = strtotime($first_termin->termin->bis); + $teilnehmer_min = (int)$first_termin->termin->teilnehmer_min; + $teilnehmer_max = (int)$first_termin->termin->teilnehmer_max; + + + $prevEnd = $max_bis; + + foreach ($alle_termine as $termin) + { + if (date('Y-m-d', strtotime($termin->termin->von)) !== $first_date) + { + $data['errormsg'] = 'Nicht der gleiche Tag!'; + $error = true; + } + + if ($termin->mitarbeiter_uid !== $first_mitarbeiter) + { + $data['errormsg'] = 'Unterschiedliche Lektoren!'; + $error = true; + } + + if ($termin->studiensemester_kurzbz !== $first_studiensemester) + { + $data['errormsg'] = 'Unterschiedliche Studiensemester!'; + $error = true; + } + + if ($termin->termin->sammelklausur !== $first_sammelklausur) + { + $data['errormsg'] = 'Sammelklausur unterschiedlich!'; + $error = true; + } + + if (!($termin->termin->ort_kurzbz === $first_ort || $first_termin->termin->anderer_raum = $first_raum)) + { + $data['errormsg'] = 'Ort/Raum unterschiedlich!'; + $error = true; + } + + if ($termin->lehrveranstaltung_id !== $first_lv) + { + $data['errormsg'] = 'Lehrveranstaltungen unterscheiden sich!'; + $error = true; + } + + + $start = strtotime($termin->termin->von); + $max_von = min($max_von, $start); + $max_bis = max($max_bis, strtotime($termin->termin->bis)); + $teilnehmer_min = min($teilnehmer_min, (int)$termin->termin->teilnehmer_min); + $teilnehmer_max = max($teilnehmer_max, (int)$termin->termin->teilnehmer_max); + + if (($start - $prevEnd > 0) && $first_ort) + { + $stunde = new stunde(); + + $gapStartStr = date('Y-m-d H:i:s', $prevEnd); + $gapEndStr = date('Y-m-d H:i:s', $start); + + $gapStartArr = explode(' ', $gapStartStr); + $gapEndArr = explode(' ', $gapEndStr); + + $stunden = $stunde->getStunden($gapStartArr[1], $gapEndArr[1]); + + $reservierung = new reservierung(); + $reserviert = false; + + $reservierungs_stunden = $reservierung->getReservierungen($first_ort, $gapStartArr[0]); + + $need_stunden = array_diff($stunden, $reservierungs_stunden); + + foreach ($need_stunden as $h) + { + if ($reservierung->isReserviert($first_ort, $gapStartArr[0], $h)) + $reserviert = true; + } + + if (!$terminkollision && $reserviert && !$first_sammelklausur) + { + $error = true; + $data['errormsg'] = 'Kann nicht zusammengelegt werden, da der Raum reserviert ist'; + } + else + { + $reservierung->studiengang_kz = "0"; + $reservierung->ort_kurzbz = $first_ort; + $reservierung->uid = $first_mitarbeiter; + $reservierung->datum = $gapStartArr[0]; + $reservierung->titel = $first_titel; + if (strlen($first_titel) > 10) + { + $reservierung->titel = "Prüfung"; + } + $reservierung->beschreibung = "Prüfung"; + $reservierung->insertamum = date('Y-m-d G:i:s'); + $reservierung->insertvon = get_uid(); + $reservierungError = false; + + foreach ($need_stunden as $h) + { + $reservierung->stunde = $h; + if (!$reservierungError) + { + if (!$reservierung->save(true)) + { + $error = true; + $data['errormsg'] = $reservierung->errormsg; + $reservierungError = true; + } + } + } + } + } + $prevEnd = strtotime($termin->termin->bis); + } + + if (!$error) + { + $first_pruefungstermin = new pruefungstermin(); + $first_pruefungstermin->load($first_termin->termin->pruefungstermin_id); + + $first_pruefungstermin->von = date('Y-m-d H:i:s', $max_von); + $first_pruefungstermin->bis = date('Y-m-d H:i:s', $max_bis); + $first_pruefungstermin->teilnehmer_min = $teilnehmer_min; + $first_pruefungstermin->teilnehmer_max = $teilnehmer_max; + + $first_pruefungstermin->save(); + + $alle_termine = array_slice($alle_termine, 1); + + foreach ($alle_termine as $termin) + { + $anmeldung_termin = new pruefungsanmeldung(); + $anmeldungen_termine = $anmeldung_termin->getAnmeldungenByTermin($termin->termin->pruefungstermin_id); + + if (count($anmeldungen_termine) === 0) + { + $first_pruefungstermin->delete($termin->termin->pruefungstermin_id); + } + $i = 0; + $anmeldungen_termine_count = count($anmeldungen_termine); + foreach ($anmeldungen_termine as $anmeldungtermin) + { + $anmeldung = new pruefungsanmeldung(); + $anmeldung->load($anmeldungtermin->pruefungsanmeldung_id); + $old_pruefuengstermin_id = $anmeldung->pruefungstermin_id; + $anmeldung->pruefungstermin_id = $first_termin->termin->pruefungstermin_id; + if ($anmeldung->save(false) && ($i === $anmeldungen_termine_count - 1)) + { + $first_pruefungstermin->delete($old_pruefuengstermin_id); + } + $i ++; + } + } + } + } + + $data['result']= $result; + $data['error']= $error ? 'true' : 'false'; + $data['errormsg']=''; + return $data; +} + /** * * @return typespeichert ein Kommentar zu einer Prüfungsanmeldung diff --git a/cis/private/lehre/pruefung/pruefungsanmeldungen_verwalten.php b/cis/private/lehre/pruefung/pruefungsanmeldungen_verwalten.php index 653d29c02..4928ed91a 100644 --- a/cis/private/lehre/pruefung/pruefungsanmeldungen_verwalten.php +++ b/cis/private/lehre/pruefung/pruefungsanmeldungen_verwalten.php @@ -258,6 +258,36 @@ if (empty($pruefung->result) && !$rechte->isBerechtigt('lehre/pruefungsanmeldung } }); + + $('#zusammenlegen').on('click', function() { + let ausgewaehlte_termine = $('.termin-checkbox:checked'); + + if (ausgewaehlte_termine.length === 0) + return; + + let erster_termin = ausgewaehlte_termine.first(); + let erstes_datum = erster_termin.data('datum'); + let erste_lvid = erster_termin.data('lv-id'); + + let termine = []; + ausgewaehlte_termine.each(function() {{ + let termin = $(this); + let datum = termin.data('datum'); + let lv_id = termin.data('lv-id'); + + if (erstes_datum !== datum) + return alert("Die ausgewählten Termine liegen nicht am selben Tag und können daher nicht zusammengelegt werden.") + if (erste_lvid !== lv_id) + return alert("Bei den ausgewählten Terminen handelt es sich um unterschiedliche Lehrveranstaltungen, die daher nicht zusammengelegt werden können.") + + termine.push(termin.data('termin-id')); + }}) + + if (termine.length > 0) + { + terminezusammenlegen(termine, erste_lvid); + } + }) });

t('pruefung/anmeldungenVerwalten'); ?>

diff --git a/cis/private/profile/studienplan.php b/cis/private/profile/studienplan.php index 92728df42..1bc8f3184 100644 --- a/cis/private/profile/studienplan.php +++ b/cis/private/profile/studienplan.php @@ -359,7 +359,7 @@ drawTree($tree,0); function drawTree($tree, $depth) { - global $uid, $stsem_arr, $noten_arr, $lvangebot_arr, $aktornext; + global $uid, $stsem_arr, $noten_arr, $lvangebot_arr, $aktornext, $studienplan_id; global $datum_obj, $db, $lv_arr, $p, $note_pruef_arr, $student; global $anrechnung; @@ -401,7 +401,10 @@ function drawTree($tree, $depth) echo '    '; $lvkompatibel = new lehrveranstaltung(); - $lvkompatibel_arr = $lvkompatibel->loadLVkompatibel($row_tree->lehrveranstaltung_id); + + $studienplaene_kompatibel = $lvkompatibel->loadLVkompatibelWithStudienplan($row_tree->lehrveranstaltung_id, $studienplan_id); + + $lvkompatibel_arr = array_unique(array_column($studienplaene_kompatibel, 'lehrveranstaltung_id_kompatibel')); $lvkompatibel_arr[]=$row_tree->lehrveranstaltung_id; $abgeschlossen=false; @@ -414,6 +417,24 @@ function drawTree($tree, $depth) else $abgeschlossen=false; } + else if (!empty($studienplaene_kompatibel)) + { + foreach ($studienplaene_kompatibel as $kompatibel) + { + $lvregelExists = $lvregel->exists($kompatibel['studienplan_lehrveranstaltung_id']); + + if ($lvregelExists) + { + if ($lvregel->isAbgeschlossen($uid, $kompatibel['studienplan_lehrveranstaltung_id'])) + $abgeschlossen=true; + else + $abgeschlossen=false; + + break; + } + } + } + $lvinfo = new lvinfo(); switch(getSprache()) { @@ -583,15 +604,38 @@ function drawTree($tree, $depth) { $semesterlock=true; } - else + + if (!$semesterlock && !empty($studienplaene_kompatibel)) { - //check if rules are fulfilled just for actual or next studiensemester - if($stsem === $aktornext) + foreach ($studienplaene_kompatibel as $kompatibel) { - $result = $lvregel->isZugangsberechtigt($uid, $row_tree->studienplan_lehrveranstaltung_id, $stsem); - if((is_array($result)) && ($result[0] !== true)) + if (!$lvregel->checkSemester($kompatibel['studienplan_lehrveranstaltung_id'], $semester)) { - $regelerfuellt=false; + $semesterlock = true; + break; + } + } + } + + //check if rules are fulfilled just for actual or next studiensemester + if($stsem === $aktornext && !$semesterlock) + { + $result = $lvregel->isZugangsberechtigt($uid, $row_tree->studienplan_lehrveranstaltung_id, $stsem); + if((is_array($result)) && ($result[0] !== true)) + { + $regelerfuellt = false; + } + + if ($regelerfuellt && !empty($studienplaene_kompatibel)) + { + foreach ($studienplaene_kompatibel as $kompatibel) + { + $result = $lvregel->isZugangsberechtigt($uid, $kompatibel['studienplan_lehrveranstaltung_id'], $stsem); + if (is_array($result) && $result[0] !== true) + { + $regelerfuellt = false; + break; + } } } } diff --git a/include/lehrveranstaltung.class.php b/include/lehrveranstaltung.class.php index 48edd9d0a..e288f88e6 100644 --- a/include/lehrveranstaltung.class.php +++ b/include/lehrveranstaltung.class.php @@ -1554,6 +1554,36 @@ class lehrveranstaltung extends basis_db } } + public function loadLVkompatibelWithStudienplan($lehrveranstaltung_id, $studienplan_id) + { + if (!is_numeric($lehrveranstaltung_id)) + { + $this->errormsg = 'Lehrveranstaltung_id muss eine gueltige Zahl sein'; + return false; + } + if (!is_numeric($studienplan_id)) + { + $this->errormsg = 'Studienplan_id muss eine gueltige Zahl sein'; + return false; + } + + $qry = "SELECT studienplan_lehrveranstaltung_id, lehrveranstaltung_id_kompatibel + FROM lehre.tbl_lehrveranstaltung_kompatibel + JOIN lehre.tbl_studienplan_lehrveranstaltung ON lehrveranstaltung_id_kompatibel = tbl_studienplan_lehrveranstaltung.lehrveranstaltung_id + WHERE tbl_lehrveranstaltung_kompatibel.lehrveranstaltung_id=".$this->db_add_param($lehrveranstaltung_id, FHC_INTEGER)." + ;"; + + if($this->db_query($qry)) + { + $data = array(); + while($row = $this->db_fetch_object()) + { + $data[] = ['lehrveranstaltung_id_kompatibel' => $row->lehrveranstaltung_id_kompatibel, 'studienplan_lehrveranstaltung_id' => $row->studienplan_lehrveranstaltung_id]; + } + return $data; + } + } + /** * Lädt alle kompatiblen LVs zu einer Lehrveranstaltung * @param $lehrveranstaltung_id ID der Lehrveranstaltung diff --git a/include/pruefungstermin.class.php b/include/pruefungstermin.class.php index c7eb0b085..80db93338 100644 --- a/include/pruefungstermin.class.php +++ b/include/pruefungstermin.class.php @@ -244,4 +244,20 @@ class pruefungstermin extends basis_db{ } } + + public function delete($pruefungstermin_id) + { + $qry = "DELETE FROM campus.tbl_pruefungstermin WHERE pruefungstermin_id=".$this->db_add_param($pruefungstermin_id).";"; + + if($this->db_query($qry)) + { + return true; + } + else + { + $this->errormsg='Fehler beim Löschen des Eintrages'; + return false; + } + } + } diff --git a/include/reservierung.class.php b/include/reservierung.class.php index 44d989600..a29b314dc 100644 --- a/include/reservierung.class.php +++ b/include/reservierung.class.php @@ -322,5 +322,37 @@ class reservierung extends basis_db } } + + public function getReservierungen($ort_kurzbz, $datum) + { + $datum_obj = new Datum(); + if(!$datum_obj->checkDatum($datum)) + { + $this->errormsg='Datum hat ein ungueltiges Format'; + return false; + } + + $qry = "SELECT stunde FROM campus.tbl_reservierung + WHERE + ort_kurzbz=".$this->db_add_param($ort_kurzbz)." AND + datum=".$this->db_add_param($datum); + + + if($this->db_query($qry)) + { + $result = array(); + while($row = $this->db_fetch_object()) + { + $result[] = $row->stunde; + } + } + else + { + $this->errormsg = "Prüfungstypen konnten nicht geladen werden."; + return false; + } + + return $result; + } } ?>