regeln von kompatiblen lvs wird geprueft

zusammen legen von pruefungsterminen ermoeglicht
This commit is contained in:
ma0048
2025-08-27 08:40:57 +02:00
parent e79b7a525f
commit e2147c8f1f
7 changed files with 406 additions and 8 deletions
@@ -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. * Zeigt das Formularfeld zur Eingabe eines Kommentars in der Anmeldungsverwaltung an.
* @param {String} vorname Vorname des Studenten * @param {String} vorname Vorname des Studenten
@@ -110,6 +110,11 @@ switch($method)
$studiensemester = filter_input(INPUT_POST,"studiensemester"); $studiensemester = filter_input(INPUT_POST,"studiensemester");
$data = getPruefungenStudiengangBySemester($studiensemester); $data = getPruefungenStudiengangBySemester($studiensemester);
break; 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': case 'saveKommentar':
$data = saveKommentar(); $data = saveKommentar();
break; break;
@@ -1285,6 +1290,211 @@ function getPruefungenStudiengangBySemester($aktStudiensemester)
return $data; 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 * @return typespeichert ein Kommentar zu einer Prüfungsanmeldung
@@ -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);
}
})
}); });
</script> </script>
<h1><?php echo $p->t('pruefung/anmeldungenVerwalten'); ?></h1> <h1><?php echo $p->t('pruefung/anmeldungenVerwalten'); ?></h1>
+52 -8
View File
@@ -359,7 +359,7 @@ drawTree($tree,0);
function drawTree($tree, $depth) 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 $datum_obj, $db, $lv_arr, $p, $note_pruef_arr, $student;
global $anrechnung; global $anrechnung;
@@ -401,7 +401,10 @@ function drawTree($tree, $depth)
echo '&nbsp;&nbsp;&nbsp;&nbsp;'; echo '&nbsp;&nbsp;&nbsp;&nbsp;';
$lvkompatibel = new lehrveranstaltung(); $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; $lvkompatibel_arr[]=$row_tree->lehrveranstaltung_id;
$abgeschlossen=false; $abgeschlossen=false;
@@ -414,6 +417,24 @@ function drawTree($tree, $depth)
else else
$abgeschlossen=false; $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(); $lvinfo = new lvinfo();
switch(getSprache()) switch(getSprache())
{ {
@@ -583,15 +604,38 @@ function drawTree($tree, $depth)
{ {
$semesterlock=true; $semesterlock=true;
} }
else
if (!$semesterlock && !empty($studienplaene_kompatibel))
{ {
//check if rules are fulfilled just for actual or next studiensemester foreach ($studienplaene_kompatibel as $kompatibel)
if($stsem === $aktornext)
{ {
$result = $lvregel->isZugangsberechtigt($uid, $row_tree->studienplan_lehrveranstaltung_id, $stsem); if (!$lvregel->checkSemester($kompatibel['studienplan_lehrveranstaltung_id'], $semester))
if((is_array($result)) && ($result[0] !== true))
{ {
$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;
}
} }
} }
} }
+30
View File
@@ -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 * Lädt alle kompatiblen LVs zu einer Lehrveranstaltung
* @param $lehrveranstaltung_id ID der Lehrveranstaltung * @param $lehrveranstaltung_id ID der Lehrveranstaltung
+16
View File
@@ -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;
}
}
} }
+32
View File
@@ -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;
}
} }
?> ?>