From 92925706846f48755454f68e6b94ba49da781fc7 Mon Sep 17 00:00:00 2001 From: Manfred Date: Thu, 28 Oct 2021 12:26:30 +0200 Subject: [PATCH] =?UTF-8?q?Log=20f=C3=BCr=20L=C3=B6schen=20von=20LV-Plan?= =?UTF-8?q?=20eintr=C3=A4gen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/lvplanung/timetable-week.xul.php | 1443 +++++++------- include/lehrstunde.class.php | 2285 +++++++++++----------- 2 files changed, 1878 insertions(+), 1850 deletions(-) diff --git a/content/lvplanung/timetable-week.xul.php b/content/lvplanung/timetable-week.xul.php index 18eaf6076..7e3a144dd 100644 --- a/content/lvplanung/timetable-week.xul.php +++ b/content/lvplanung/timetable-week.xul.php @@ -1,708 +1,735 @@ -, - * Andreas Oesterreicher and - * Rudolf Hangl . - * Gerald Simane-Sequens . - */ -header("Content-type: application/vnd.mozilla.xul+xml"); - -require_once('../../config/vilesci.config.inc.php'); -require_once('../../include/globals.inc.php'); -require_once('../../include/functions.inc.php'); -require_once('../../include/benutzerberechtigung.class.php'); -require_once('../../include/lehreinheit.class.php'); -require_once('../../include/zeitwunsch.class.php'); -require_once('../../include/wochenplan.class.php'); -require_once('../../include/reservierung.class.php'); -require_once('../../include/log.class.php'); - -echo ''; -echo ''; -$PHP_SELF = $_SERVER['PHP_SELF']; -// Startwerte setzen -$db_stpl_table=null; -$db = new basis_db(); - -echo ''; - -$uid = get_uid(); - -//Berechtigung pruefen -$rechte = new benutzerberechtigung(); -$rechte->getBerechtigungen($uid); - -if(!$rechte->isBerechtigt('lehre/lvplan')) - die('Sie haben keine Berechtigung fuer diese Seite'); - -$error_msg=''; -$kollision_msg=''; - -// Benutzerdefinierte Variablen laden -loadVariables($uid); - -if (!isset($ignore_kollision)) - $ignore_kollision=(boolean)false; -elseif ($ignore_kollision=='false') - $ignore_kollision=(boolean)false; -else - $ignore_kollision=(boolean)true; - -if (!isset($alle_unr_mitladen)) - $alle_unr_mitladen=(boolean)false; -elseif ($alle_unr_mitladen=='false') - $alle_unr_mitladen=(boolean)false; -else - $alle_unr_mitladen=(boolean)true; - -// Bezeichnungen fuer Tabellen und Views -$lva_stpl_view=VIEW_BEGIN.'lva_'.$db_stpl_table; - -// Variablen uebernehmen -if (isset($_GET['aktion'])) - $aktion=$_GET['aktion']; -else - $aktion=null; - -if (isset($_GET['semesterplan'])) - $semesterplan=$_GET['semesterplan']; -else - $semesterplan=false; -if (isset($_GET['new_stunde'])) - $new_stunde=$_GET['new_stunde']; -if (isset($_GET['new_datum'])) - $new_datum=$_GET['new_datum']; -if (isset($_GET['old_ort'])) - $old_ort=$_GET['old_ort']; -if (isset($_GET['new_ort'])) - $new_ort=$_GET['new_ort']; -if (isset($_GET['kollisionsanzahl'])) - $kollisionsanzahl=$_GET['kollisionsanzahl']; -else - $kollisionsanzahl=0; -if (isset($_GET['ort'])) - $ort=$_GET['ort']; -else - $ort=null; -if (isset($_GET['datum'])) - $datum=$_GET['datum']; -if (isset($_GET['type'])) - $type=$_GET['type']; -if (isset($_GET['stg_kz'])) - $stg_kz=$_GET['stg_kz']; -else - $stg_kz=null; -if (isset($_GET['sem'])) - $sem=$_GET['sem']; -else - $sem=null; -if (isset($_GET['ver'])) - $ver=$_GET['ver']; -else - $ver=null; -if (isset($_GET['grp'])) - $grp=$_GET['grp']; -else - $grp=null; -if (isset($_GET['pers_uid'])) - $pers_uid=$_GET['pers_uid']; -if (isset($_GET['gruppe'])) - $gruppe=$_GET['gruppe']; -else - $gruppe=null; -if (isset($_GET['semester_aktuell'])) - $semester_aktuell=$_GET['semester_aktuell']; - -if (!isset($semester_aktuell) && $semesterplan) - $error_msg.='Studien-Semester ist nicht gesetzt!'; - -if(isset($_GET['fachbereich_kurzbz'])) - $fachbereich_kurzbz = $_GET['fachbereich_kurzbz']; -else - $fachbereich_kurzbz=null; - -if (isset($_GET['new_unr'])) - $new_unr=$_GET['new_unr']; -else - $new_unr=null; - -if (isset($_GET['new_blockung'])) - $new_blockung=$_GET['new_blockung']; -else - $new_blockung=null; -?> - - - - > - - - +, + * Andreas Oesterreicher and + * Rudolf Hangl . + * Gerald Simane-Sequens . + */ +header("Content-type: application/vnd.mozilla.xul+xml"); + +require_once('../../config/vilesci.config.inc.php'); +require_once('../../include/globals.inc.php'); +require_once('../../include/functions.inc.php'); +require_once('../../include/benutzerberechtigung.class.php'); +require_once('../../include/lehreinheit.class.php'); +require_once('../../include/zeitwunsch.class.php'); +require_once('../../include/wochenplan.class.php'); +require_once('../../include/reservierung.class.php'); +require_once('../../include/log.class.php'); + +echo ''; +echo ''; +$PHP_SELF = $_SERVER['PHP_SELF']; +// Startwerte setzen +$db_stpl_table=null; +$db = new basis_db(); + +echo ''; + +$uid = get_uid(); + +//Berechtigung pruefen +$rechte = new benutzerberechtigung(); +$rechte->getBerechtigungen($uid); + +if(!$rechte->isBerechtigt('lehre/lvplan')) + die('Sie haben keine Berechtigung fuer diese Seite'); + +$error_msg=''; +$kollision_msg=''; + +// Benutzerdefinierte Variablen laden +loadVariables($uid); + +if (!isset($ignore_kollision)) + $ignore_kollision=(boolean)false; +elseif ($ignore_kollision=='false') + $ignore_kollision=(boolean)false; +else + $ignore_kollision=(boolean)true; + +if (!isset($alle_unr_mitladen)) + $alle_unr_mitladen=(boolean)false; +elseif ($alle_unr_mitladen=='false') + $alle_unr_mitladen=(boolean)false; +else + $alle_unr_mitladen=(boolean)true; + +// Bezeichnungen fuer Tabellen und Views +$lva_stpl_view=VIEW_BEGIN.'lva_'.$db_stpl_table; + +// Variablen uebernehmen +if (isset($_GET['aktion'])) + $aktion=$_GET['aktion']; +else + $aktion=null; + +if (isset($_GET['semesterplan'])) + $semesterplan=$_GET['semesterplan']; +else + $semesterplan=false; +if (isset($_GET['new_stunde'])) + $new_stunde=$_GET['new_stunde']; +if (isset($_GET['new_datum'])) + $new_datum=$_GET['new_datum']; +if (isset($_GET['old_ort'])) + $old_ort=$_GET['old_ort']; +if (isset($_GET['new_ort'])) + $new_ort=$_GET['new_ort']; +if (isset($_GET['kollisionsanzahl'])) + $kollisionsanzahl=$_GET['kollisionsanzahl']; +else + $kollisionsanzahl=0; +if (isset($_GET['ort'])) + $ort=$_GET['ort']; +else + $ort=null; +if (isset($_GET['datum'])) + $datum=$_GET['datum']; +if (isset($_GET['type'])) + $type=$_GET['type']; +if (isset($_GET['stg_kz'])) + $stg_kz=$_GET['stg_kz']; +else + $stg_kz=null; +if (isset($_GET['sem'])) + $sem=$_GET['sem']; +else + $sem=null; +if (isset($_GET['ver'])) + $ver=$_GET['ver']; +else + $ver=null; +if (isset($_GET['grp'])) + $grp=$_GET['grp']; +else + $grp=null; +if (isset($_GET['pers_uid'])) + $pers_uid=$_GET['pers_uid']; +if (isset($_GET['gruppe'])) + $gruppe=$_GET['gruppe']; +else + $gruppe=null; +if (isset($_GET['semester_aktuell'])) + $semester_aktuell=$_GET['semester_aktuell']; + +if (!isset($semester_aktuell) && $semesterplan) + $error_msg.='Studien-Semester ist nicht gesetzt!'; + +if(isset($_GET['fachbereich_kurzbz'])) + $fachbereich_kurzbz = $_GET['fachbereich_kurzbz']; +else + $fachbereich_kurzbz=null; + +if (isset($_GET['new_unr'])) + $new_unr=$_GET['new_unr']; +else + $new_unr=null; + +if (isset($_GET['new_blockung'])) + $new_blockung=$_GET['new_blockung']; +else + $new_blockung=null; +?> + + + + > + + + diff --git a/include/lehrstunde.class.php b/include/lehrstunde.class.php index 87e6ca569..71dbf3319 100644 --- a/include/lehrstunde.class.php +++ b/include/lehrstunde.class.php @@ -1,1142 +1,1143 @@ -new=TRUE; - } - - /** - * @brief Einen Datensatz aus optional angegebener Stundenplan-Tabelle laden - * @param stundenplan_id ID in der Datenbank - * @param stpl_table Name der Tabelle in der DB - * @return Boolean, Fehlermeldung kommt in das Attribut errormsg - */ - public function load($stundenplan_id,$stpl_table='stundenplandev') - { - // Bezeichnung der Stundenplan-Tabelle und des Keys - $stpl_id=$stpl_table.TABLE_ID; - $stpl_view='lehre.'.VIEW_BEGIN.$stpl_table; - $stpl_table='lehre.'.TABLE_BEGIN.$stpl_table; - - $sql_query="SELECT * FROM $stpl_view WHERE $stpl_id=$stundenplan_id;"; - - //Datenbankabfrage - if (!$this->db_query($sql_query)) - { - $this->errormsg=$sql_query.$this->db_last_error(); - return false; - } - - $this->anzahl = $this->db_num_rows(); - - //Daten uebernehmen - if ($this->anzahl!=1) - { - $this->errormsg='Keinen Datensatz gefunden'; - return false; - } - else - { - $row=$this->db_fetch_object(); - $this->stundenplan_id=$row->{$stpl_id}; - $this->unr=$row->unr; - $this->lektor_uid=$row->uid; - $this->lektor_kurzbz=$row->lektor; - $this->datum=$row->datum; - $this->stunde=$row->stunde; - $this->ort_kurzbz=$row->ort_kurzbz; - $this->lehrfach=$row->lehrfach; - $this->lehrfach_bez=$row->lehrfach_bez; - $this->lehrfach_id=$row->lehrfach_id; - $this->lehrform=$row->lehrform; - $this->studiengang_kz=$row->studiengang_kz; - $this->studiengang=$row->stg_kurzbz; - $this->sem=$row->semester; - $this->ver=$row->verband; - $this->grp=$row->gruppe; - $this->gruppe_kurzbz=$row->gruppe_kurzbz; - $this->titel=$row->titel; - $this->anmerkung=$row->anmerkung; - $this->updateamum=$row->updateamum; - $this->updatevon=$row->updatevon; - $this->new=false; - } - return true; - } - - /** - * Datensatz in DB speichern - * - */ - public function save($uid, $stpl_table='stundenplandev') - { - // Parameter Checken - // Bezeichnung der Stundenplan-Tabelle und des Keys - $stpl_id=$stpl_table.TABLE_ID; - $stpl_table='lehre.'.TABLE_BEGIN.$stpl_table; - if ($this->new) - { - // insert - } - else - { - // update - $sql_query='UPDATE '.$stpl_table; - $sql_query.=" SET datum=".$this->db_add_param($this->datum).", stunde=".$this->db_add_param($this->stunde); - $sql_query.=", ort_kurzbz=".$this->db_add_param($this->ort_kurzbz).", mitarbeiter_uid=".$this->db_add_param($this->lektor_uid); - if($this->unr!='') - $sql_query.=", unr=".$this->db_add_param($this->unr); - $sql_query.=", updateamum=now(), updatevon=".$this->db_add_param($uid); - $sql_query.=" WHERE $stpl_id=".$this->db_add_param($this->stundenplan_id); - - $this->lastqry = $sql_query; - //Datenbankabfrage - if (!$this->db_query($sql_query)) - { - $this->errormsg=$sql_query.$this->db_last_error(); - return false; - } - } - - return true; - } - - /** - * Erstellt einen Undo Befehl fuer die Speichern funktion - * - * @param $stpl_table - * @return string undo - */ - public function getUndo($stpl_table='stundenplandev') - { - $stpl_id=$stpl_table.TABLE_ID; - $stpl_table='lehre.'.TABLE_BEGIN.$stpl_table; - - $sql_query='UPDATE '.$stpl_table; - $sql_query.=" SET datum=".$this->db_add_param($this->datum).", stunde=".$this->db_add_param($this->stunde); - $sql_query.=", ort_kurzbz=".$this->db_add_param($this->ort_kurzbz).", mitarbeiter_uid=".$this->db_add_param($this->lektor_uid); - $sql_query.=", updateamum=".$this->db_add_param($this->updateamum).", updatevon=".$this->db_add_param($this->updatevon); - $sql_query.=" WHERE $stpl_id=".$this->db_add_param($this->stundenplan_id).";"; - - return $sql_query; - } - - /** - * Datensatz aus DB entfernen - * @param id ID des Datensatzes in der Tabelle - * @param stpl_table Name der Tabelle - * - */ - public function delete($id, $stpl_table='stundenplandev') - { - // Parameter Checken - // Bezeichnung der Stundenplan-Tabelle und des Keys - $stpl_id=$stpl_table.TABLE_ID; - $stpl_table='lehre.'.TABLE_BEGIN.$stpl_table; - // Delete SQL vorbereiten - $sql_query='DELETE FROM '.$stpl_table; - $sql_query.=" WHERE $stpl_id=".$this->db_add_param($id); - - //Datenbankrequest - if (!$this->db_query($sql_query)) - { - $this->errormsg=$sql_query.$this->db_last_error(); - return false; - } - else - return true; - } - - /** - * Laedt Lehrstunden - * - * @param type (student, lektor, lehrverband, gruppe, ort, ....) - * @param datum_von (inklusive) Startdatum der Abfrage - * @param datum_bis (exklusive) Enddatum der Abfrage - * @param uid (des Lektors oder Studenten) kann auch NULL sein - * @param ort_kurzbz (Kurzbezeichnung des Orts) kann auch NULL sein - * @param studiengang_kz - * @param sem - * @param ver - * @param grp - * @param gruppe_kurzbz - * - */ - public function load_lehrstunden($type, $datum_von, $datum_bis, $uid, $ort_kurzbz=NULL, $studiengang_kz=NULL, $sem=NULL, $ver=NULL, $grp=NULL, $gruppe_kurzbz=NULL, $stpl_view='stundenplan', $idList=null, $fachbereich_kurzbz=null, $lva=NULL, $alle_unr_mitladen=false) - { - $num_rows_einheit=0; - // Parameter Checken - // Bezeichnung der Stundenplan-Tabelle und des Keys - $stpl_id=$stpl_view.TABLE_ID; - $stpl_view_ohneschema=VIEW_BEGIN.$stpl_view; - $stpl_view='lehre.'.VIEW_BEGIN.$stpl_view; - - - // Datum im Format YYYY-MM-TT ? - if (!preg_match("/([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})/",$datum_von) ) - { - $this->errormsg='Fehler: Startdatum hat falsches Format!'; - return -1; - } - if ($datum_bis!=null) - { - if (!preg_match("/([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})/",$datum_bis) ) - { - $this->errormsg='Fehler: Enddatum hat falsches Format!'; - return -1; - } - } - else - $datum_bis=$datum_von; - - // Person - if (($type=='student' || $type=='lektor') && $uid==NULL) - { - $this->errormsg='Fehler: uid der Person ist nicht gesetzt'; - return -1; - } - // Ort - if ($type=='ort' && $ort_kurzbz==NULL) - { - $this->errormsg='Fehler: Kurzbezeichnung des Orts ist nicht gesetzt'; - return -1; - } - // Gruppe - if ($type=='gruppe' && $gruppe_kurzbz==NULL) - { - $this->errormsg='Fehler: Kurzbezeichnung der Gruppe ist nicht gesetzt'; - return -1; - } - // Verband - if ($type=='verband' && ($studiengang_kz==NULL || !is_numeric($studiengang_kz))) - { - $this->errormsg='Fehler: Studiengang ist nicht gesetzt'; - return -1; - } - // LVA - if ($type=='lva' && $lva==NULL) - { - $this->errormsg='Fehler: LVA-ID ist nicht gesetzt'; - return -1; - } - if ($type=='lva' && !is_numeric($lva)) - { - $this->errormsg='Fehler: LVA-ID ist ungueltig'; - return -1; - } - // Type - if ($type==null) - { - $this->errormsg='Fehler: Type in "lehrstunde->load_lehrstunde" ist nicht gesetzt!'; - return -1; - } - - // Zusaetzliche Daten ermitteln - // Personendaten - if ($type=='student') - { - if(defined('LVPLAN_LOAD_UEBER_SEMESTERHAELFTE') && LVPLAN_LOAD_UEBER_SEMESTERHAELFTE === true) - $lvplan_load_ueber_semesterhaelfte = true; - else - $lvplan_load_ueber_semesterhaelfte = false; - // Bei Studierenden wird das passende Studiensemester ermittelt und das dazupassende - // naechstliegende Dadurch wird sichergestellt, dass Einheiten aus den Vorsemestern - // zB fuer Nachpruefungen oder Einheiten aus den Folgesemestern die vorgezogen werden - // auch im Plan sichtbar sind. - if (is_null($this->ss)) - { - $studiensemester_obj = new studiensemester(); - $this->ss = $studiensemester_obj->getSemesterFromDatum($datum_von,true); - - if($lvplan_load_ueber_semesterhaelfte) - { - $this->ssnext = $studiensemester_obj->getNextFrom($this->ss); - $this->ssprev = $studiensemester_obj->getPreviousFrom($this->ss); - } - else - $this->ssnext = $studiensemester_obj->getNearestTo($this->ss,$datum_von); - } - if(!isset($this->ssnext)) - $this->ssnext = $this->ss; - - if($lvplan_load_ueber_semesterhaelfte) - { - $sql_query="SELECT studiengang_kz, semester, verband, gruppe - FROM - public.tbl_studentlehrverband - JOIN public.tbl_studiensemester USING(studiensemester_kurzbz) - WHERE student_uid=".$this->db_add_param($uid)." - AND studiensemester_kurzbz in(".$this->db_add_param($this->ss).",".$this->db_add_param($this->ssnext).",".$this->db_add_param($this->ssprev).") - ORDER BY start desc LIMIT 2"; - } - else - { - // Lehrverbandszuordnungen der betreffenden Studiensemester laden - $sql_query="SELECT studiengang_kz, semester, verband, gruppe - FROM public.tbl_studentlehrverband - WHERE student_uid=".$this->db_add_param($uid)." - AND studiensemester_kurzbz in(".$this->db_add_param($this->ss).",".$this->db_add_param($this->ssnext).")"; - } - - $verbaende=array(); - if($this->db_query($sql_query)) - { - $num_rows=$this->db_num_rows(); - if ($num_rows>0) - { - while($row = $this->db_fetch_object()) - { - $verbaende[] = array('studiengang_kz'=>$row->studiengang_kz, - 'sem'=>$row->semester, - 'ver'=>$row->verband, - 'grp'=>$row->gruppe); - } - } - } - else - { - $this->errormsg = 'Fehler beim Laden der Verbaende'; - return -2; - } - // Spezialgruppen ermitteln zu denen die Person zugeteilt ist - if($lvplan_load_ueber_semesterhaelfte) - { - $sql_query="SELECT - gruppe_kurzbz - FROM - public.tbl_benutzergruppe - WHERE - uid=".$this->db_add_param($uid)." - AND (studiensemester_kurzbz=".$this->db_add_param($this->ss)." - OR studiensemester_kurzbz=".$this->db_add_param($this->ssnext)." - OR studiensemester_kurzbz=".$this->db_add_param($this->ssprev)." - OR studiensemester_kurzbz IS NULL)"; - } - else - { - $sql_query="SELECT - gruppe_kurzbz - FROM - public.tbl_benutzergruppe - WHERE - uid=".$this->db_add_param($uid)." - AND (studiensemester_kurzbz=".$this->db_add_param($this->ss)." - OR studiensemester_kurzbz=".$this->db_add_param($this->ssnext)." - OR studiensemester_kurzbz IS NULL)"; - } - - if (!$result_einheit=$this->db_query($sql_query)) - { - $this->errormsg= 'Fehler beim Laden der Gruppen'; - return false; - } - else - $num_rows_einheit=$this->db_num_rows($result_einheit); - } - // Bei Lektoren auch Spezialgruppen wegen Reservierungen abfragen - if ($type == 'lektor') - { - if (is_null($this->ss)) - { - $studiensemester_obj = new studiensemester(); - $this->ss = $studiensemester_obj->getSemesterFromDatum($datum_von,true); - $this->ssnext = $studiensemester_obj->getNearestTo($this->ss,$datum_von); - } - if(!isset($this->ssnext)) - $this->ssnext = $this->ss; - // Spezialgruppen ermitteln zu denen die Person zugeteilt ist - $sql_query="SELECT - gruppe_kurzbz - FROM - public.tbl_benutzergruppe - WHERE - uid=".$this->db_add_param($uid)." - AND (studiensemester_kurzbz=".$this->db_add_param($this->ss)." - OR studiensemester_kurzbz=".$this->db_add_param($this->ssnext)." - OR studiensemester_kurzbz IS NULL)"; - - if (!$result_einheit=$this->db_query($sql_query)) - { - $this->errormsg='Fehler beim Laden der Gruppen'; - return false; - } - else - $num_rows_einheit=$this->db_num_rows($result_einheit); - } - - // Stundenplandaten ermitteln - // Abfrage generieren - - if ($type!='idList') - { - if($alle_unr_mitladen) - $sql_query_stdplan='SELECT '.$stpl_id.', datum, stunde, unr FROM '.$stpl_view.' stplvw'; - else - $sql_query_stdplan='SELECT * FROM '.$stpl_view.' stplvw'; - $sql_query_lva=""; - $sql_query=" WHERE datum>=".$this->db_add_param($datum_von)." AND datum<".$this->db_add_param($datum_bis); - if ($type == 'lva') - $sql_query_lva=" AND lehrveranstaltung_id=".$this->db_add_param($lva); - elseif ($type=='lektor') - { - $sql_query.=" AND ("; - $sql_query.=" uid=".$this->db_add_param($uid); - //Reservierungen mit Spezialgruppen laden - for ($i=0;$i<$num_rows_einheit;$i++) - { - $row=$this->db_fetch_object($result_einheit,$i); - $sql_query.=" OR gruppe_kurzbz=".$this->db_add_param($row->gruppe_kurzbz); - } - $sql_query.=')'; - } - elseif ($type=='ort' && $ort_kurzbz != 'all') - $sql_query.=" AND ort_kurzbz=".$this->db_add_param($ort_kurzbz); - elseif ($type=='ort' && $ort_kurzbz == 'all') - $sql_query.=" AND ort_kurzbz IS NOT NULL AND ort_kurzbz !='Dummy'"; - elseif ($type=='gruppe') - $sql_query.=" AND gruppe_kurzbz=".$this->db_add_param($gruppe_kurzbz); - elseif($type=='fachbereich') - $sql_query.=" AND fachbereich_kurzbz=".$this->db_add_param($fachbereich_kurzbz); - elseif($type=='student') - { - $sql_query.=" AND ("; - if(is_array($verbaende) && count($verbaende)>0) - { - foreach($verbaende as $row_verbaende) - { - $studiengang_kz = $row_verbaende['studiengang_kz']; - $ver = $row_verbaende['ver']; - $sem = $row_verbaende['sem']; - $grp = $row_verbaende['grp']; - - $sql_query.=" (studiengang_kz=".$this->db_add_param($studiengang_kz, FHC_INTEGER); - if ($sem!=null && $sem>=0 && $sem!='') - $sql_query.=" AND (semester=".$this->db_add_param($sem)." OR semester IS NULL)"; - if ($ver!='0' && $ver!=null && $ver!='') - $sql_query.=" AND (verband=".$this->db_add_param($ver)." OR verband IS NULL OR verband='0' OR verband='')"; - if ($grp!='0' && $grp!=null && $grp!='') - $sql_query.=" AND (gruppe=".$this->db_add_param($grp)." OR gruppe IS NULL OR gruppe='0' OR gruppe='')"; - $sql_query.=" AND gruppe_kurzbz is null"; - $sql_query.=") OR "; - } - } - - $sql_query.=" 1!=1"; - for ($i=0;$i<$num_rows_einheit;$i++) - { - $row=$this->db_fetch_object($result_einheit,$i); - $sql_query.=" OR gruppe_kurzbz=".$this->db_add_param($row->gruppe_kurzbz); - } - $sql_query.=')'; - } - else - { - $sql_query.=" AND ( (studiengang_kz=".$this->db_add_param($studiengang_kz, FHC_INTEGER); - if ($sem!=null && $sem>=0 && $sem!='') - $sql_query.=" AND (semester=".$this->db_add_param($sem)." OR semester IS NULL)"; - if ($ver!='0' && $ver!=null && $ver!='') - $sql_query.=" AND (verband=".$this->db_add_param($ver)." OR verband IS NULL OR verband='0' OR verband='')"; - if ($grp!='0' && $grp!=null && $grp!='') - $sql_query.=" AND (gruppe=".$this->db_add_param($grp)." OR gruppe IS NULL OR gruppe='0' OR gruppe='')"; - - // Direkte Gruppen werden ausgenommen da sonst Stunden von Verband A in der Ansicht für Verband B - // mit angezeigt werden weil die direkte Gruppe geladen wird. - $sql_query.=' AND - ( - gruppe_kurzbz is null - OR - EXISTS( - SELECT 1 FROM public.tbl_gruppe - WHERE - gruppe_kurzbz = stplvw.gruppe_kurzbz - AND direktinskription=false - ) - )'; - - $sql_query.=' )'; - - for ($i=0;$i<$num_rows_einheit;$i++) - { - $row=$this->db_fetch_object($result_einheit,$i); - $sql_query.=" OR gruppe_kurzbz=".$this->db_add_param($row->gruppe_kurzbz); - } - $sql_query.=')'; - } - $sql_query_orderby=' ORDER BY datum, stunde, studiengang_kz, semester, verband, gruppe, gruppe_kurzbz, uid'; - $sql_query_stdplan.=$sql_query . $sql_query_lva . $sql_query_orderby; - - // Wenn aktiviert, werden alle Stunden mit der gleichen UNR geladen die zur selben Zeit stattfinden - if($alle_unr_mitladen) - { - $sql_query_stdplan=" - WITH lvplan(id, datum, stunde, unr) as - ( - $sql_query_stdplan - ) - SELECT - distinct $stpl_view_ohneschema.* - FROM - ".$stpl_view.", lvplan - WHERE - $stpl_view_ohneschema.datum=lvplan.datum - AND $stpl_view_ohneschema.stunde=lvplan.stunde - AND $stpl_view_ohneschema.unr=lvplan.unr - ORDER BY datum, stunde, studiengang_kz, semester, verband, gruppe, gruppe_kurzbz, uid - "; - } - } - else - { - $sql_query_stdplan='SELECT * FROM '.$stpl_view; - $sql_query=''; - foreach ($idList as $id) - $sql_query.=" OR ".$stpl_id."=".$this->db_add_param($id); - $sql_query=mb_substr($sql_query,3); - $sql_query_stdplan.=' WHERE'.$sql_query; - } - - //Datenbankabfrage - if (!$this->db_query($sql_query_stdplan)) - { - $this->errormsg = 'Fehler beim Laden der Stundenplandaten'; - return -2; - } - $stpl_tbl = $this->db_result; - $num_rows = $this->db_num_rows($stpl_tbl); - $this->anzahl=$num_rows; - //Daten uebernehmen - for ($i=0;$i<$num_rows;$i++) - { - $row=$this->db_fetch_object($stpl_tbl, $i); - - $stunde=new lehrstunde(); - $stunde->stundenplan_id=$row->{$stpl_id}; - $stunde->lehreinheit_id=$row->lehreinheit_id; - $stunde->unr=$row->unr; - $stunde->lektor_uid=$row->uid; - $stunde->lektor_kurzbz=$row->lektor; - $stunde->datum=$row->datum; - $stunde->stunde=$row->stunde; - $stunde->ort_kurzbz=$row->ort_kurzbz; - $stunde->lehrfach=$row->lehrfach; - $stunde->lehrfach_bez=$row->lehrfach_bez; - $stunde->lehrfach_id=$row->lehrfach_id; - $stunde->lehrform=$row->lehrform; - if ($row->farbe!=' ' && $row->farbe!=null) - $stunde->farbe=$row->farbe; - else - $stunde->farbe='FFFFFF'; - $stunde->studiengang_kz=$row->studiengang_kz; - $stunde->studiengang=mb_strtoupper($row->stg_typ.$row->stg_kurzbz); - $stunde->sem=$row->semester; - $stunde->ver=$row->verband; - $stunde->grp=$row->gruppe; - $stunde->gruppe_kurzbz=$row->gruppe_kurzbz; - $stunde->titel=$row->titel; - $stunde->anmerkung=$row->anmerkung; - $stunde->anmerkung_lehreinheit=$row->anmerkung_lehreinheit; - $stunde->updateamum=$row->updateamum; - $stunde->updatevon=$row->updatevon; - $stunde->reservierung=false; - $this->lehrstunden[$i]=$stunde; - - } - - // Reservierungsdaten ermitteln - if ($type!='idList' && $type!='fachbereich' && $type!='lva') - { - // Datenbankabfrage generieren - $sql_query_reservierung='SELECT * FROM campus.vw_reservierung stplvw'; - $sql_query_reservierung.=$sql_query . $sql_query_orderby; - - //Datenbankabfrage - if (!$this->db_query($sql_query_reservierung)) - { - $this->errormsg = 'Fehler beim Laden der Reservierungen'; - return -2; - } - $stpl_tbl = $this->db_result; - $num_rows=$this->db_num_rows($stpl_tbl); - $this->anzahl+=$num_rows; - - //Daten uebernehmen - for ($i=0;$i<$num_rows;$i++) - { - $row = $this->db_fetch_object($stpl_tbl, $i); - - $stunde=new lehrstunde(); - $stunde->reservierung=true; - $stunde->stundenplan_id=$row->reservierung_id; - $stunde->unr=0; - $stunde->lektor_uid=$row->uid; - $stunde->lektor_kurzbz=$row->uid; - $stunde->datum=$row->datum; - $stunde->stunde=$row->stunde; - $stunde->ort_kurzbz=$row->ort_kurzbz; - //$stunde->lehrfach_id=$row->lehrfach_id; - $stunde->lehrfach=$row->titel; - $stunde->lehrfach_bez=$row->beschreibung; - $stunde->studiengang_kz=$row->studiengang_kz; - $stunde->studiengang=$row->stg_kurzbz; - $stunde->sem=$row->semester; - $stunde->ver=$row->verband; - $stunde->grp=$row->gruppe; - $stunde->gruppe_kurzbz=$row->gruppe_kurzbz; - $stunde->titel=$row->titel; - $stunde->anmerkung=$row->beschreibung; - $stunde->anmerkung_lehreinheit=$row->beschreibung; - $stunde->farbe=''; - $this->lehrstunden[]=$stunde; - } - } - return $this->anzahl; - } - - /** - * @param lehreinheit_id - * @param uid (mitarbeiter) - * - */ - public function load_lehrstunden_le($lehreinheit_id, $uid=null, $stpl_table='stundenplandev') - { - // Bezeichnung der Stundenplan-Tabelle und des Keys - $stpl_id=$stpl_table.TABLE_ID; - $stpl_table='lehre.'.TABLE_BEGIN.$stpl_table; - - // Stundenplandaten ermitteln - // Abfrage generieren - $sql="SELECT * FROM ".$stpl_table." WHERE lehreinheit_id=".$this->db_add_param($lehreinheit_id, FHC_INTEGER); - if ($uid!=null && !is_null($uid)) - $sql.=" AND mitarbeiter_uid=".$this->db_add_param($uid); - - //Datenbankabfrage - if (!$this->db_query($sql)) - { - $this->errormsg=$this->db_last_error(); - return -1; - } - $num_rows=$this->db_num_rows(); - $this->anzahl=$num_rows; - //Daten uebernehmen - for ($i=0;$i<$num_rows;$i++) - { - $row=$this->db_fetch_object(null, $i); - - $stunde=new lehrstunde(); - $stunde->stundenplan_id=$row->{$stpl_id}; - $stunde->lehreinheit_id=$row->lehreinheit_id; - $stunde->unr=$row->unr; - $stunde->studiengang_kz=$row->studiengang_kz; - $stunde->sem=$row->semester; - $stunde->ver=$row->verband; - $stunde->grp=$row->gruppe; - $stunde->gruppe_kurzbz=$row->gruppe_kurzbz; - $stunde->lektor_uid=$row->mitarbeiter_uid; - $stunde->ort_kurzbz=$row->ort_kurzbz; - $stunde->datum=$row->datum; - $stunde->stunde=$row->stunde; - $stunde->titel=$row->titel; - $stunde->anmerkung=$row->anmerkung; - $stunde->fix=$row->fix; - $stunde->insertamum=$row->insertamum; - $stunde->insertvon=$row->insertvon; - $stunde->updateamum=$row->updateamum; - $stunde->updatevon=$row->updatevon; - $stunde->reservierung=false; - $this->lehrstunden[$i]=$stunde; - } - return $this->anzahl; - } - - - /** - * Prueft die geladene Lehrveranstaltung auf Kollisionen im Stundenplan. - * Bei einer Kollision steht der Grund der Kollision in '$this->errormsg'. - * @param string db_stpl_table Tabllenname des Stundenplans im DBMS - * @return boolean true=kollision, false=keine kollision - */ - public function kollision($stpl_table='stundenplandev') - { - $variablen_obj = new variable(); - $variablen_obj->loadVariables(get_uid()); - - $kollision_student = $variablen_obj->variable->kollision_student; - $ignore_reservierung = $variablen_obj->variable->ignore_reservierung; - $ignore_zeitsperre = $variablen_obj->variable->ignore_zeitsperre; - - //Kollisionspruefung auf Studentenebene - if($kollision_student=='true' && $this->kollision_student($stpl_table)) - return true; - - // Parameter Checken - // Bezeichnung der Stundenplan-Tabelle und des Keys - $stpl_id=$stpl_table.TABLE_ID; - $stpl_table='lehre.'.VIEW_BEGIN.$stpl_table; - - // Datenbank abfragen - $sql_query="SELECT $stpl_id AS id, lektor, stg_kurzbz, ort_kurzbz, semester, verband, gruppe, gruppe_kurzbz, datum, stunde FROM $stpl_table - WHERE datum=".$this->db_add_param($this->datum)." AND stunde=".$this->db_add_param($this->stunde); - - // Direkte Lehreinheitsgruppen kollidieren nicht - $sql_query.=" AND NOT EXISTS(SELECT 1 FROM public.tbl_gruppe WHERE gruppe_kurzbz = ".$stpl_table.".gruppe_kurzbz AND direktinskription=true)"; - - $sql_query.= " AND (ort_kurzbz=".$this->db_add_param($this->ort_kurzbz)." "; - - if (!in_array($this->lektor_uid,unserialize(KOLLISIONSFREIE_USER))) - $sql_query.=" OR (uid=".$this->db_add_param($this->lektor_uid)." AND uid not in (".$this->db_implode4SQL(unserialize(KOLLISIONSFREIE_USER))."))"; - - //Wenn eine Kollisionspruefung auf Studentenebene durchgefuehrt wird, werden die LVB nicht gecheckt - if($kollision_student=='false') - { - // Direkte Gruppen kollidieren nicht - $direktgruppe = false; - if($this->gruppe_kurzbz!=null && $this->gruppe_kurzbz!='' && $this->gruppe_kurzbz!=' ') - { - $grp_obj = new gruppe(); - $grp_obj->load($this->gruppe_kurzbz); - if($grp_obj->direktinskription) - { - $direktgruppe = true; - } - } - if(!$direktgruppe) - { - $sql_query.=" OR (studiengang_kz=".$this->db_add_param($this->studiengang_kz)." AND semester=".$this->db_add_param($this->sem); - if($this->gruppe_kurzbz!=null && $this->gruppe_kurzbz!='' && $this->gruppe_kurzbz!=' ') - { - $sql_query.=" OR (gruppe_kurzbz=".$this->db_add_param($this->gruppe_kurzbz).")"; - } - else - { - if ($this->ver!=null && $this->ver!='' && $this->ver!=' ') - $sql_query.=" AND (verband=".$this->db_add_param($this->ver)." OR verband IS NULL OR verband='' OR verband=' ')"; - if ($this->grp!=null && $this->grp!='' && $this->grp!=' ') - $sql_query.=" AND (gruppe=".$this->db_add_param($this->grp)." OR gruppe IS NULL OR gruppe='' OR gruppe=' ')"; - } - - $sql_query.=")"; - } - } - $sql_query.=") AND unr!=".$this->db_add_param($this->unr); - - if (!$erg_stpl = $this->db_query($sql_query)) - { - $this->errormsg=$sql_query.$this->db_last_error(); - return true; - } - - $anz=$this->db_num_rows($erg_stpl); - if ($anz==0) - { - // Zeitsperren pruefen - if($ignore_zeitsperre=='false' && !in_array($this->lektor_uid,unserialize(KOLLISIONSFREIE_USER)) && $this->kollision_zeitsperre()) - return true; - - // Reservierungen pruefen - if ($ignore_reservierung=='false' && $this->kollision_reservierung()) - return true; - - if($this->kollision_ressource()) - return true; - return false; - } - else - { - $row = $this->db_fetch_object($erg_stpl); - $this->errormsg="Kollision ($stpl_table): $row->id|$row->lektor|$row->ort_kurzbz|$row->stg_kurzbz-$row->semester$row->verband$row->gruppe$row->gruppe_kurzbz - $row->datum/$row->stunde\n"; //\n".$sql_query - return true; - } - } - - /** - * Prueft ob eine Kollision mit den zugeteilten Ressourcen vorhanden ist - * - * @return boolean true=kollision, false=keine kollision - */ - public function kollision_ressource() - { - $qry = "SELECT - tbl_betriebsmittel.beschreibung, tbl_stundenplandev.ort_kurzbz - FROM - lehre.tbl_stundenplan_betriebsmittel - JOIN lehre.tbl_stundenplandev USING(stundenplandev_id) - JOIN wawi.tbl_betriebsmittel USING(betriebsmittel_id) - WHERE - tbl_stundenplandev.datum=".$this->db_add_param($this->datum)." - AND tbl_stundenplandev.stunde=".$this->db_add_param($this->stunde)." - AND betriebsmittel_id IN(SELECT betriebsmittel_id FROM lehre.tbl_stundenplan_betriebsmittel WHERE stundenplandev_id=".$this->db_add_param($this->stundenplan_id).") - AND tbl_stundenplandev.stundenplandev_id<>".$this->db_add_param($this->stundenplan_id); - - if($result = $this->db_query($qry)) - { - if($row = $this->db_fetch_object($result)) - { - $this->errormsg='Kollision (Ressource)'.$row->beschreibung.'|'.$row->ort_kurzbz; - return true; - } - return false; - } - return false; - } - - /** - * Prueft ob eine Kollision mit den Zeitsperren vorhanden ist - * - * @return boolean true=kollision, false=keine kollision - */ - public function kollision_zeitsperre() - { - $sql_query="SELECT - zeitsperre_id,zeitsperretyp_kurzbz,mitarbeiter_uid AS lektor,vondatum,vonstunde,bisdatum,bisstunde - FROM campus.tbl_zeitsperre - WHERE mitarbeiter_uid=".$this->db_add_param($this->lektor_uid)." - AND (vondatum<".$this->db_add_param($this->datum)." OR (vondatum=".$this->db_add_param($this->datum)." AND (vonstunde<=".$this->db_add_param($this->stunde)." OR vonstunde IS NULL))) - AND (bisdatum>".$this->db_add_param($this->datum)." OR (bisdatum=".$this->db_add_param($this->datum)." AND (bisstunde>=".$this->db_add_param($this->stunde)." OR bisstunde IS NULL)));"; - - if (!$erg_zs = $this->db_query($sql_query)) - { - $this->errormsg=$sql_query.$this->db_last_error(); - return true; - } - - $anz_zs=$this->db_num_rows($erg_zs); - 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; - } - return false; - } - - /** - * Prueft ob eine LV-Plan Kollision mit den Reservierungen besteht - * - * @return boolean true=kollision, false=keine kollision - */ - public function kollision_reservierung() - { - $sql_query="SELECT - reservierung_id AS id, uid AS lektor, stg_kurzbz, ort_kurzbz, - semester, verband, gruppe, gruppe_kurzbz, datum, stunde - FROM lehre.vw_reservierung - WHERE - datum=".$this->db_add_param($this->datum)." AND - stunde=".$this->db_add_param($this->stunde)." AND - (ort_kurzbz=".$this->db_add_param($this->ort_kurzbz)." OR "; - - if (!in_array($this->lektor_uid, unserialize(KOLLISIONSFREIE_USER))) - $sql_query.="(uid=".$this->db_add_param($this->lektor_uid)." AND uid not in(".$this->db_implode4SQL(unserialize(KOLLISIONSFREIE_USER)).")) OR "; - - $sql_query.="(studiengang_kz=".$this->db_add_param($this->studiengang_kz)." AND semester=".$this->db_add_param($this->sem); - if ($this->ver!=null && $this->ver!='' && $this->ver!=' ') - $sql_query.=" AND (verband=".$this->db_add_param($this->ver)." OR verband IS NULL OR verband='' OR verband=' ')"; - if ($this->grp!=null && $this->grp!='' && $this->grp!=' ') - $sql_query.=" AND (gruppe=".$this->db_add_param($this->grp)." OR gruppe IS NULL OR gruppe='' OR gruppe=' ')"; - if ($this->gruppe_kurzbz!=null && $this->gruppe_kurzbz!='' && $this->gruppe_kurzbz!=' ') - $sql_query.=" AND (gruppe_kurzbz=".$this->db_add_param($this->gruppe_kurzbz).")"; - $sql_query.="))"; - - if (!$erg_res = $this->db_query($sql_query)) - { - $this->errormsg=$sql_query.$this->db_last_error(); - return true; - } - $anz_res = $this->db_num_rows($erg_res); - - if ($anz_res!=0) - { - $row = $this->db_fetch_object($erg_res); - $this->errormsg="Kollision (Reservierung): $row->id|$row->lektor|$row->ort_kurzbz|$row->stg_kurzbz-$row->semester$row->verband$row->gruppe$row->gruppe_kurzbz - $row->datum/$row->stunde"; - return true; - } - return false; - } - - /** - * Prueft eine Kollision auf Studentenebene - * Es werden nur die Kollisionen der Studenten abgefragt - * Raum, Lektor, Reservierung, Zeitsperren, etc werden hier nicht geprueft - * - * @param $stpl_table - * @return boolean true=kollision, false=keine kollision - */ - public function kollision_student($stpl_table='stundenplandev') - { - // Parameter Checken - // Bezeichnung der Stundenplan-Tabelle - $stpl_table='lehre.'.VIEW_BEGIN.$stpl_table; - - $sql_query = "SELECT * - FROM ".$stpl_table."_student_unr - WHERE datum=".$this->db_add_param($this->datum)." AND stunde=".$this->db_add_param($this->stunde)." AND student_uid IN( - SELECT uid FROM public.vw_gruppen WHERE - - "; - $sql_query.="(studiengang_kz=".$this->db_add_param($this->studiengang_kz)." AND semester=".$this->db_add_param($this->sem)." - AND studiensemester_kurzbz=( - SELECT tbl_studiensemester.studiensemester_kurzbz - FROM - public.tbl_studiensemester - WHERE - tbl_studiensemester.ende >= ".$this->db_add_param($this->datum)." - AND tbl_studiensemester.start <=".$this->db_add_param($this->datum)." LIMIT 1)"; - if ($this->gruppe_kurzbz!=null && $this->gruppe_kurzbz!='' && $this->gruppe_kurzbz!=' ') - $sql_query.=" AND (gruppe_kurzbz=".$this->db_add_param($this->gruppe_kurzbz).")"; - else - { - if ($this->ver!=null && $this->ver!='' && $this->ver!=' ') - $sql_query.=" AND (verband=".$this->db_add_param($this->ver).")"; - else - $sql_query.=" AND (verband IS NULL OR verband='' OR verband=' ')"; - if ($this->grp!=null && $this->grp!='' && $this->grp!=' ') - $sql_query.=" AND (gruppe=".$this->db_add_param($this->grp).")"; - else - $sql_query.=" AND (gruppe IS NULL OR gruppe='' OR gruppe=' ')"; - } - - - $sql_query.=")) AND unr!=".$this->db_add_param($this->unr); - - if (!$erg_stpl=$this->db_query($sql_query)) - { - $this->errormsg=$sql_query.$this->db_last_error(); - return true; - } - - $anz=$this->db_num_rows($erg_stpl); - - if ($anz>0) - { - $row = $this->db_fetch_object($erg_stpl); - $this->errormsg="Kollision Student ($stpl_table): $row->student_uid $row->datum/$row->stunde "; - return true; - } - else - { - return false; - } - } - - /** - * Gruppiert die einzelnen Lehrstunden zusammen - */ - public function getLehrstundenGruppiert() - { - $result = array(); - - foreach($this->lehrstunden as $row_lehrstunde) - { - $found=false; - //Pruefen ob bereits ein Eintrag vorhanden ist - //zu dem dazugruppiert werden kann - - /* - Kriterien fuer Gruppierung - - gleiches Datum - - gleiche Stunde - - gleiche UNR - */ - foreach($result as $key=>$row_result) - { - if($row_result->unr==$row_lehrstunde->unr - && $row_result->datum==$row_lehrstunde->datum - && $row_result->stunde==$row_lehrstunde->stunde) - { - $found=true; - //gleicher Eintrag gefunden - $grpidx = count($result[$key]->gruppen); - $result[$key]->gruppen[$grpidx]->studiengang_kz=$row_lehrstunde->studiengang_kz; - $result[$key]->gruppen[$grpidx]->sem=$row_lehrstunde->sem; - $result[$key]->gruppen[$grpidx]->ver=$row_lehrstunde->ver; - $result[$key]->gruppen[$grpidx]->grp=$row_lehrstunde->grp; - $result[$key]->gruppen[$grpidx]->gruppe_kurzbz=$row_lehrstunde->gruppe_kurzbz; - if(!in_array($row_lehrstunde->lektor_uid, $result[$key]->lektor_uid)) - $result[$key]->lektor_uid[]=$row_lehrstunde->lektor_uid; - if(!in_array($row_lehrstunde->ort_kurzbz, $result[$key]->ort_kurzbz)) - $result[$key]->ort_kurzbz[]=$row_lehrstunde->ort_kurzbz; - break; - } - } - - if(!$found) - { - // Wenn kein passender Eintrag vorhanden ist, - // wird ein neuer angelegt - $stunde=new lehrstunde(); - $stunde->stundenplan_id=$row_lehrstunde->stundenplan_id; - $stunde->lehreinheit_id=$row_lehrstunde->lehreinheit_id; - $stunde->farbe = (isset($row_lehrstunde->farbe)?$row_lehrstunde->farbe:'FFFFFF'); - $stunde->unr=$row_lehrstunde->unr; - $stunde->gruppen[0]->studiengang_kz=$row_lehrstunde->studiengang_kz; - $stunde->gruppen[0]->sem=$row_lehrstunde->sem; - $stunde->gruppen[0]->ver=$row_lehrstunde->ver; - $stunde->gruppen[0]->grp=$row_lehrstunde->grp; - $stunde->gruppen[0]->gruppe_kurzbz=$row_lehrstunde->gruppe_kurzbz; - $stunde->lektor_uid[]=$row_lehrstunde->lektor_uid; - $stunde->ort_kurzbz[]=$row_lehrstunde->ort_kurzbz; - $stunde->datum=$row_lehrstunde->datum; - $stunde->stunde=$row_lehrstunde->stunde; - $stunde->titel=$row_lehrstunde->titel; - $stunde->anmerkung=$row_lehrstunde->anmerkung; - $stunde->fix=$row_lehrstunde->fix; - $stunde->reservierung=$row_lehrstunde->reservierung; - $result[]=$stunde; - } - } - return $result; - } - - public function getStundenplanData($db_stpl_table, $lehrveranstaltung_id=null, $studiensemester_kurzbz=null, $lehreinheit_id=null, $mitarbeiter_uid=null, $student_uid=null) - { - - $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_".$db_stpl_table." 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=".$this->db_add_param($lehrveranstaltung_id)." - AND studiensemester_kurzbz=".$this->db_add_param($studiensemester_kurzbz).")"; - - } - elseif($lehreinheit_id!='') - { - $qry.=" lehreinheit_id=".$this->db_add_param($lehreinheit_id); - } - elseif($mitarbeiter_uid!='') - { - $qry.=" mitarbeiter_uid=".$this->db_add_param($mitarbeiter_uid)." AND lehreinheit_id IN( - SELECT - lehreinheit_id - FROM - lehre.tbl_lehreinheitmitarbeiter - JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) - WHERE mitarbeiter_uid=".$this->db_add_param($mitarbeiter_uid)." AND studiensemester_kurzbz=".$this->db_add_param($studiensemester_kurzbz).")"; - } - elseif($student_uid!='') - { - $qry.=" lehreinheit_id in ( - SELECT - lehreinheit_id - FROM - campus.vw_student_lehrveranstaltung - WHERE - uid=".$this->db_add_param($student_uid)." AND studiensemester_kurzbz=".$this->db_add_param($studiensemester_kurzbz).")"; - } - else - return false; - - $qry.="GROUP BY stpl.datum, stpl.unr, stpl.lehreinheit_id, lehrfach.bezeichnung - ORDER BY stpl.datum, min(stpl.stunde), stpl.unr, stpl.lehreinheit_id"; - - if($result = $this->db_query($qry)) - { - while($row = $this->db_fetch_object($result)) - { - $obj = new stdClass(); - - $obj->datum = $row->datum; - $obj->stundevon = $row->stundevon; - $obj->stundebis = $row->stundebis; - $obj->gruppen = array_unique($this->db_parse_array($row->gruppen)); - $obj->lektoren = array_unique($this->db_parse_array($row->lektoren)); - $obj->orte = array_unique($this->db_parse_array($row->orte)); - $obj->titel = array_filter(array_unique($this->db_parse_array($row->titel))); - $obj->lehrfach_bezeichnung = $row->lehrfach_bezeichnung; - $obj->lehreinheit_id = $row->lehreinheit_id; - - $this->result[] = $obj; - } - return true; - } - else - return false; - } -} - -?> +new=TRUE; + } + + /** + * @brief Einen Datensatz aus optional angegebener Stundenplan-Tabelle laden + * @param stundenplan_id ID in der Datenbank + * @param stpl_table Name der Tabelle in der DB + * @return Boolean, Fehlermeldung kommt in das Attribut errormsg + */ + public function load($stundenplan_id,$stpl_table='stundenplandev') + { + // Bezeichnung der Stundenplan-Tabelle und des Keys + $stpl_id=$stpl_table.TABLE_ID; + $stpl_view='lehre.'.VIEW_BEGIN.$stpl_table; + $stpl_table='lehre.'.TABLE_BEGIN.$stpl_table; + + $sql_query="SELECT * FROM $stpl_view WHERE $stpl_id=$stundenplan_id;"; + + //Datenbankabfrage + if (!$this->db_query($sql_query)) + { + $this->errormsg=$sql_query.$this->db_last_error(); + return false; + } + + $this->anzahl = $this->db_num_rows(); + + //Daten uebernehmen + if ($this->anzahl!=1) + { + $this->errormsg='Keinen Datensatz gefunden'; + return false; + } + else + { + $row=$this->db_fetch_object(); + $this->stundenplan_id=$row->{$stpl_id}; + $this->unr=$row->unr; + $this->lektor_uid=$row->uid; + $this->lektor_kurzbz=$row->lektor; + $this->datum=$row->datum; + $this->stunde=$row->stunde; + $this->ort_kurzbz=$row->ort_kurzbz; + $this->lehrfach=$row->lehrfach; + $this->lehrfach_bez=$row->lehrfach_bez; + $this->lehrfach_id=$row->lehrfach_id; + $this->lehrform=$row->lehrform; + $this->studiengang_kz=$row->studiengang_kz; + $this->studiengang=$row->stg_kurzbz; + $this->sem=$row->semester; + $this->ver=$row->verband; + $this->grp=$row->gruppe; + $this->gruppe_kurzbz=$row->gruppe_kurzbz; + $this->titel=$row->titel; + $this->anmerkung=$row->anmerkung; + $this->updateamum=$row->updateamum; + $this->updatevon=$row->updatevon; + $this->new=false; + } + return true; + } + + /** + * Datensatz in DB speichern + * + */ + public function save($uid, $stpl_table='stundenplandev') + { + // Parameter Checken + // Bezeichnung der Stundenplan-Tabelle und des Keys + $stpl_id=$stpl_table.TABLE_ID; + $stpl_table='lehre.'.TABLE_BEGIN.$stpl_table; + if ($this->new) + { + // insert + } + else + { + // update + $sql_query='UPDATE '.$stpl_table; + $sql_query.=" SET datum=".$this->db_add_param($this->datum).", stunde=".$this->db_add_param($this->stunde); + $sql_query.=", ort_kurzbz=".$this->db_add_param($this->ort_kurzbz).", mitarbeiter_uid=".$this->db_add_param($this->lektor_uid); + if($this->unr!='') + $sql_query.=", unr=".$this->db_add_param($this->unr); + $sql_query.=", updateamum=now(), updatevon=".$this->db_add_param($uid); + $sql_query.=" WHERE $stpl_id=".$this->db_add_param($this->stundenplan_id); + + $this->lastqry = $sql_query; + //Datenbankabfrage + if (!$this->db_query($sql_query)) + { + $this->errormsg=$sql_query.$this->db_last_error(); + return false; + } + } + + return true; + } + + /** + * Erstellt einen Undo Befehl fuer die Speichern funktion + * + * @param $stpl_table + * @return string undo + */ + public function getUndo($stpl_table='stundenplandev') + { + $stpl_id=$stpl_table.TABLE_ID; + $stpl_table='lehre.'.TABLE_BEGIN.$stpl_table; + + $sql_query='UPDATE '.$stpl_table; + $sql_query.=" SET datum=".$this->db_add_param($this->datum).", stunde=".$this->db_add_param($this->stunde); + $sql_query.=", ort_kurzbz=".$this->db_add_param($this->ort_kurzbz).", mitarbeiter_uid=".$this->db_add_param($this->lektor_uid); + $sql_query.=", updateamum=".$this->db_add_param($this->updateamum).", updatevon=".$this->db_add_param($this->updatevon); + $sql_query.=" WHERE $stpl_id=".$this->db_add_param($this->stundenplan_id).";"; + + return $sql_query; + } + + /** + * Datensatz aus DB entfernen + * @param id ID des Datensatzes in der Tabelle + * @param stpl_table Name der Tabelle + * + */ + public function delete($id, $stpl_table='stundenplandev') + { + // Parameter Checken + // Bezeichnung der Stundenplan-Tabelle und des Keys + $stpl_id=$stpl_table.TABLE_ID; + $stpl_table='lehre.'.TABLE_BEGIN.$stpl_table; + // Delete SQL vorbereiten + $sql_query='DELETE FROM '.$stpl_table; + $sql_query.=" WHERE $stpl_id=".$this->db_add_param($id); + + $this->lastqry = $sql_query; + //Datenbankrequest + if (!$this->db_query($sql_query)) + { + $this->errormsg=$sql_query.$this->db_last_error(); + return false; + } + else + return true; + } + + /** + * Laedt Lehrstunden + * + * @param type (student, lektor, lehrverband, gruppe, ort, ....) + * @param datum_von (inklusive) Startdatum der Abfrage + * @param datum_bis (exklusive) Enddatum der Abfrage + * @param uid (des Lektors oder Studenten) kann auch NULL sein + * @param ort_kurzbz (Kurzbezeichnung des Orts) kann auch NULL sein + * @param studiengang_kz + * @param sem + * @param ver + * @param grp + * @param gruppe_kurzbz + * + */ + public function load_lehrstunden($type, $datum_von, $datum_bis, $uid, $ort_kurzbz=NULL, $studiengang_kz=NULL, $sem=NULL, $ver=NULL, $grp=NULL, $gruppe_kurzbz=NULL, $stpl_view='stundenplan', $idList=null, $fachbereich_kurzbz=null, $lva=NULL, $alle_unr_mitladen=false) + { + $num_rows_einheit=0; + // Parameter Checken + // Bezeichnung der Stundenplan-Tabelle und des Keys + $stpl_id=$stpl_view.TABLE_ID; + $stpl_view_ohneschema=VIEW_BEGIN.$stpl_view; + $stpl_view='lehre.'.VIEW_BEGIN.$stpl_view; + + + // Datum im Format YYYY-MM-TT ? + if (!preg_match("/([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})/",$datum_von) ) + { + $this->errormsg='Fehler: Startdatum hat falsches Format!'; + return -1; + } + if ($datum_bis!=null) + { + if (!preg_match("/([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})/",$datum_bis) ) + { + $this->errormsg='Fehler: Enddatum hat falsches Format!'; + return -1; + } + } + else + $datum_bis=$datum_von; + + // Person + if (($type=='student' || $type=='lektor') && $uid==NULL) + { + $this->errormsg='Fehler: uid der Person ist nicht gesetzt'; + return -1; + } + // Ort + if ($type=='ort' && $ort_kurzbz==NULL) + { + $this->errormsg='Fehler: Kurzbezeichnung des Orts ist nicht gesetzt'; + return -1; + } + // Gruppe + if ($type=='gruppe' && $gruppe_kurzbz==NULL) + { + $this->errormsg='Fehler: Kurzbezeichnung der Gruppe ist nicht gesetzt'; + return -1; + } + // Verband + if ($type=='verband' && ($studiengang_kz==NULL || !is_numeric($studiengang_kz))) + { + $this->errormsg='Fehler: Studiengang ist nicht gesetzt'; + return -1; + } + // LVA + if ($type=='lva' && $lva==NULL) + { + $this->errormsg='Fehler: LVA-ID ist nicht gesetzt'; + return -1; + } + if ($type=='lva' && !is_numeric($lva)) + { + $this->errormsg='Fehler: LVA-ID ist ungueltig'; + return -1; + } + // Type + if ($type==null) + { + $this->errormsg='Fehler: Type in "lehrstunde->load_lehrstunde" ist nicht gesetzt!'; + return -1; + } + + // Zusaetzliche Daten ermitteln + // Personendaten + if ($type=='student') + { + if(defined('LVPLAN_LOAD_UEBER_SEMESTERHAELFTE') && LVPLAN_LOAD_UEBER_SEMESTERHAELFTE === true) + $lvplan_load_ueber_semesterhaelfte = true; + else + $lvplan_load_ueber_semesterhaelfte = false; + // Bei Studierenden wird das passende Studiensemester ermittelt und das dazupassende + // naechstliegende Dadurch wird sichergestellt, dass Einheiten aus den Vorsemestern + // zB fuer Nachpruefungen oder Einheiten aus den Folgesemestern die vorgezogen werden + // auch im Plan sichtbar sind. + if (is_null($this->ss)) + { + $studiensemester_obj = new studiensemester(); + $this->ss = $studiensemester_obj->getSemesterFromDatum($datum_von,true); + + if($lvplan_load_ueber_semesterhaelfte) + { + $this->ssnext = $studiensemester_obj->getNextFrom($this->ss); + $this->ssprev = $studiensemester_obj->getPreviousFrom($this->ss); + } + else + $this->ssnext = $studiensemester_obj->getNearestTo($this->ss,$datum_von); + } + if(!isset($this->ssnext)) + $this->ssnext = $this->ss; + + if($lvplan_load_ueber_semesterhaelfte) + { + $sql_query="SELECT studiengang_kz, semester, verband, gruppe + FROM + public.tbl_studentlehrverband + JOIN public.tbl_studiensemester USING(studiensemester_kurzbz) + WHERE student_uid=".$this->db_add_param($uid)." + AND studiensemester_kurzbz in(".$this->db_add_param($this->ss).",".$this->db_add_param($this->ssnext).",".$this->db_add_param($this->ssprev).") + ORDER BY start desc LIMIT 2"; + } + else + { + // Lehrverbandszuordnungen der betreffenden Studiensemester laden + $sql_query="SELECT studiengang_kz, semester, verband, gruppe + FROM public.tbl_studentlehrverband + WHERE student_uid=".$this->db_add_param($uid)." + AND studiensemester_kurzbz in(".$this->db_add_param($this->ss).",".$this->db_add_param($this->ssnext).")"; + } + + $verbaende=array(); + if($this->db_query($sql_query)) + { + $num_rows=$this->db_num_rows(); + if ($num_rows>0) + { + while($row = $this->db_fetch_object()) + { + $verbaende[] = array('studiengang_kz'=>$row->studiengang_kz, + 'sem'=>$row->semester, + 'ver'=>$row->verband, + 'grp'=>$row->gruppe); + } + } + } + else + { + $this->errormsg = 'Fehler beim Laden der Verbaende'; + return -2; + } + // Spezialgruppen ermitteln zu denen die Person zugeteilt ist + if($lvplan_load_ueber_semesterhaelfte) + { + $sql_query="SELECT + gruppe_kurzbz + FROM + public.tbl_benutzergruppe + WHERE + uid=".$this->db_add_param($uid)." + AND (studiensemester_kurzbz=".$this->db_add_param($this->ss)." + OR studiensemester_kurzbz=".$this->db_add_param($this->ssnext)." + OR studiensemester_kurzbz=".$this->db_add_param($this->ssprev)." + OR studiensemester_kurzbz IS NULL)"; + } + else + { + $sql_query="SELECT + gruppe_kurzbz + FROM + public.tbl_benutzergruppe + WHERE + uid=".$this->db_add_param($uid)." + AND (studiensemester_kurzbz=".$this->db_add_param($this->ss)." + OR studiensemester_kurzbz=".$this->db_add_param($this->ssnext)." + OR studiensemester_kurzbz IS NULL)"; + } + + if (!$result_einheit=$this->db_query($sql_query)) + { + $this->errormsg= 'Fehler beim Laden der Gruppen'; + return false; + } + else + $num_rows_einheit=$this->db_num_rows($result_einheit); + } + // Bei Lektoren auch Spezialgruppen wegen Reservierungen abfragen + if ($type == 'lektor') + { + if (is_null($this->ss)) + { + $studiensemester_obj = new studiensemester(); + $this->ss = $studiensemester_obj->getSemesterFromDatum($datum_von,true); + $this->ssnext = $studiensemester_obj->getNearestTo($this->ss,$datum_von); + } + if(!isset($this->ssnext)) + $this->ssnext = $this->ss; + // Spezialgruppen ermitteln zu denen die Person zugeteilt ist + $sql_query="SELECT + gruppe_kurzbz + FROM + public.tbl_benutzergruppe + WHERE + uid=".$this->db_add_param($uid)." + AND (studiensemester_kurzbz=".$this->db_add_param($this->ss)." + OR studiensemester_kurzbz=".$this->db_add_param($this->ssnext)." + OR studiensemester_kurzbz IS NULL)"; + + if (!$result_einheit=$this->db_query($sql_query)) + { + $this->errormsg='Fehler beim Laden der Gruppen'; + return false; + } + else + $num_rows_einheit=$this->db_num_rows($result_einheit); + } + + // Stundenplandaten ermitteln + // Abfrage generieren + + if ($type!='idList') + { + if($alle_unr_mitladen) + $sql_query_stdplan='SELECT '.$stpl_id.', datum, stunde, unr FROM '.$stpl_view.' stplvw'; + else + $sql_query_stdplan='SELECT * FROM '.$stpl_view.' stplvw'; + $sql_query_lva=""; + $sql_query=" WHERE datum>=".$this->db_add_param($datum_von)." AND datum<".$this->db_add_param($datum_bis); + if ($type == 'lva') + $sql_query_lva=" AND lehrveranstaltung_id=".$this->db_add_param($lva); + elseif ($type=='lektor') + { + $sql_query.=" AND ("; + $sql_query.=" uid=".$this->db_add_param($uid); + //Reservierungen mit Spezialgruppen laden + for ($i=0;$i<$num_rows_einheit;$i++) + { + $row=$this->db_fetch_object($result_einheit,$i); + $sql_query.=" OR gruppe_kurzbz=".$this->db_add_param($row->gruppe_kurzbz); + } + $sql_query.=')'; + } + elseif ($type=='ort' && $ort_kurzbz != 'all') + $sql_query.=" AND ort_kurzbz=".$this->db_add_param($ort_kurzbz); + elseif ($type=='ort' && $ort_kurzbz == 'all') + $sql_query.=" AND ort_kurzbz IS NOT NULL AND ort_kurzbz !='Dummy'"; + elseif ($type=='gruppe') + $sql_query.=" AND gruppe_kurzbz=".$this->db_add_param($gruppe_kurzbz); + elseif($type=='fachbereich') + $sql_query.=" AND fachbereich_kurzbz=".$this->db_add_param($fachbereich_kurzbz); + elseif($type=='student') + { + $sql_query.=" AND ("; + if(is_array($verbaende) && count($verbaende)>0) + { + foreach($verbaende as $row_verbaende) + { + $studiengang_kz = $row_verbaende['studiengang_kz']; + $ver = $row_verbaende['ver']; + $sem = $row_verbaende['sem']; + $grp = $row_verbaende['grp']; + + $sql_query.=" (studiengang_kz=".$this->db_add_param($studiengang_kz, FHC_INTEGER); + if ($sem!=null && $sem>=0 && $sem!='') + $sql_query.=" AND (semester=".$this->db_add_param($sem)." OR semester IS NULL)"; + if ($ver!='0' && $ver!=null && $ver!='') + $sql_query.=" AND (verband=".$this->db_add_param($ver)." OR verband IS NULL OR verband='0' OR verband='')"; + if ($grp!='0' && $grp!=null && $grp!='') + $sql_query.=" AND (gruppe=".$this->db_add_param($grp)." OR gruppe IS NULL OR gruppe='0' OR gruppe='')"; + $sql_query.=" AND gruppe_kurzbz is null"; + $sql_query.=") OR "; + } + } + + $sql_query.=" 1!=1"; + for ($i=0;$i<$num_rows_einheit;$i++) + { + $row=$this->db_fetch_object($result_einheit,$i); + $sql_query.=" OR gruppe_kurzbz=".$this->db_add_param($row->gruppe_kurzbz); + } + $sql_query.=')'; + } + else + { + $sql_query.=" AND ( (studiengang_kz=".$this->db_add_param($studiengang_kz, FHC_INTEGER); + if ($sem!=null && $sem>=0 && $sem!='') + $sql_query.=" AND (semester=".$this->db_add_param($sem)." OR semester IS NULL)"; + if ($ver!='0' && $ver!=null && $ver!='') + $sql_query.=" AND (verband=".$this->db_add_param($ver)." OR verband IS NULL OR verband='0' OR verband='')"; + if ($grp!='0' && $grp!=null && $grp!='') + $sql_query.=" AND (gruppe=".$this->db_add_param($grp)." OR gruppe IS NULL OR gruppe='0' OR gruppe='')"; + + // Direkte Gruppen werden ausgenommen da sonst Stunden von Verband A in der Ansicht für Verband B + // mit angezeigt werden weil die direkte Gruppe geladen wird. + $sql_query.=' AND + ( + gruppe_kurzbz is null + OR + EXISTS( + SELECT 1 FROM public.tbl_gruppe + WHERE + gruppe_kurzbz = stplvw.gruppe_kurzbz + AND direktinskription=false + ) + )'; + + $sql_query.=' )'; + + for ($i=0;$i<$num_rows_einheit;$i++) + { + $row=$this->db_fetch_object($result_einheit,$i); + $sql_query.=" OR gruppe_kurzbz=".$this->db_add_param($row->gruppe_kurzbz); + } + $sql_query.=')'; + } + $sql_query_orderby=' ORDER BY datum, stunde, studiengang_kz, semester, verband, gruppe, gruppe_kurzbz, uid'; + $sql_query_stdplan.=$sql_query . $sql_query_lva . $sql_query_orderby; + + // Wenn aktiviert, werden alle Stunden mit der gleichen UNR geladen die zur selben Zeit stattfinden + if($alle_unr_mitladen) + { + $sql_query_stdplan=" + WITH lvplan(id, datum, stunde, unr) as + ( + $sql_query_stdplan + ) + SELECT + distinct $stpl_view_ohneschema.* + FROM + ".$stpl_view.", lvplan + WHERE + $stpl_view_ohneschema.datum=lvplan.datum + AND $stpl_view_ohneschema.stunde=lvplan.stunde + AND $stpl_view_ohneschema.unr=lvplan.unr + ORDER BY datum, stunde, studiengang_kz, semester, verband, gruppe, gruppe_kurzbz, uid + "; + } + } + else + { + $sql_query_stdplan='SELECT * FROM '.$stpl_view; + $sql_query=''; + foreach ($idList as $id) + $sql_query.=" OR ".$stpl_id."=".$this->db_add_param($id); + $sql_query=mb_substr($sql_query,3); + $sql_query_stdplan.=' WHERE'.$sql_query; + } + + //Datenbankabfrage + if (!$this->db_query($sql_query_stdplan)) + { + $this->errormsg = 'Fehler beim Laden der Stundenplandaten'; + return -2; + } + $stpl_tbl = $this->db_result; + $num_rows = $this->db_num_rows($stpl_tbl); + $this->anzahl=$num_rows; + //Daten uebernehmen + for ($i=0;$i<$num_rows;$i++) + { + $row=$this->db_fetch_object($stpl_tbl, $i); + + $stunde=new lehrstunde(); + $stunde->stundenplan_id=$row->{$stpl_id}; + $stunde->lehreinheit_id=$row->lehreinheit_id; + $stunde->unr=$row->unr; + $stunde->lektor_uid=$row->uid; + $stunde->lektor_kurzbz=$row->lektor; + $stunde->datum=$row->datum; + $stunde->stunde=$row->stunde; + $stunde->ort_kurzbz=$row->ort_kurzbz; + $stunde->lehrfach=$row->lehrfach; + $stunde->lehrfach_bez=$row->lehrfach_bez; + $stunde->lehrfach_id=$row->lehrfach_id; + $stunde->lehrform=$row->lehrform; + if ($row->farbe!=' ' && $row->farbe!=null) + $stunde->farbe=$row->farbe; + else + $stunde->farbe='FFFFFF'; + $stunde->studiengang_kz=$row->studiengang_kz; + $stunde->studiengang=mb_strtoupper($row->stg_typ.$row->stg_kurzbz); + $stunde->sem=$row->semester; + $stunde->ver=$row->verband; + $stunde->grp=$row->gruppe; + $stunde->gruppe_kurzbz=$row->gruppe_kurzbz; + $stunde->titel=$row->titel; + $stunde->anmerkung=$row->anmerkung; + $stunde->anmerkung_lehreinheit=$row->anmerkung_lehreinheit; + $stunde->updateamum=$row->updateamum; + $stunde->updatevon=$row->updatevon; + $stunde->reservierung=false; + $this->lehrstunden[$i]=$stunde; + + } + + // Reservierungsdaten ermitteln + if ($type!='idList' && $type!='fachbereich' && $type!='lva') + { + // Datenbankabfrage generieren + $sql_query_reservierung='SELECT * FROM campus.vw_reservierung stplvw'; + $sql_query_reservierung.=$sql_query . $sql_query_orderby; + + //Datenbankabfrage + if (!$this->db_query($sql_query_reservierung)) + { + $this->errormsg = 'Fehler beim Laden der Reservierungen'; + return -2; + } + $stpl_tbl = $this->db_result; + $num_rows=$this->db_num_rows($stpl_tbl); + $this->anzahl+=$num_rows; + + //Daten uebernehmen + for ($i=0;$i<$num_rows;$i++) + { + $row = $this->db_fetch_object($stpl_tbl, $i); + + $stunde=new lehrstunde(); + $stunde->reservierung=true; + $stunde->stundenplan_id=$row->reservierung_id; + $stunde->unr=0; + $stunde->lektor_uid=$row->uid; + $stunde->lektor_kurzbz=$row->uid; + $stunde->datum=$row->datum; + $stunde->stunde=$row->stunde; + $stunde->ort_kurzbz=$row->ort_kurzbz; + //$stunde->lehrfach_id=$row->lehrfach_id; + $stunde->lehrfach=$row->titel; + $stunde->lehrfach_bez=$row->beschreibung; + $stunde->studiengang_kz=$row->studiengang_kz; + $stunde->studiengang=$row->stg_kurzbz; + $stunde->sem=$row->semester; + $stunde->ver=$row->verband; + $stunde->grp=$row->gruppe; + $stunde->gruppe_kurzbz=$row->gruppe_kurzbz; + $stunde->titel=$row->titel; + $stunde->anmerkung=$row->beschreibung; + $stunde->anmerkung_lehreinheit=$row->beschreibung; + $stunde->farbe=''; + $this->lehrstunden[]=$stunde; + } + } + return $this->anzahl; + } + + /** + * @param lehreinheit_id + * @param uid (mitarbeiter) + * + */ + public function load_lehrstunden_le($lehreinheit_id, $uid=null, $stpl_table='stundenplandev') + { + // Bezeichnung der Stundenplan-Tabelle und des Keys + $stpl_id=$stpl_table.TABLE_ID; + $stpl_table='lehre.'.TABLE_BEGIN.$stpl_table; + + // Stundenplandaten ermitteln + // Abfrage generieren + $sql="SELECT * FROM ".$stpl_table." WHERE lehreinheit_id=".$this->db_add_param($lehreinheit_id, FHC_INTEGER); + if ($uid!=null && !is_null($uid)) + $sql.=" AND mitarbeiter_uid=".$this->db_add_param($uid); + + //Datenbankabfrage + if (!$this->db_query($sql)) + { + $this->errormsg=$this->db_last_error(); + return -1; + } + $num_rows=$this->db_num_rows(); + $this->anzahl=$num_rows; + //Daten uebernehmen + for ($i=0;$i<$num_rows;$i++) + { + $row=$this->db_fetch_object(null, $i); + + $stunde=new lehrstunde(); + $stunde->stundenplan_id=$row->{$stpl_id}; + $stunde->lehreinheit_id=$row->lehreinheit_id; + $stunde->unr=$row->unr; + $stunde->studiengang_kz=$row->studiengang_kz; + $stunde->sem=$row->semester; + $stunde->ver=$row->verband; + $stunde->grp=$row->gruppe; + $stunde->gruppe_kurzbz=$row->gruppe_kurzbz; + $stunde->lektor_uid=$row->mitarbeiter_uid; + $stunde->ort_kurzbz=$row->ort_kurzbz; + $stunde->datum=$row->datum; + $stunde->stunde=$row->stunde; + $stunde->titel=$row->titel; + $stunde->anmerkung=$row->anmerkung; + $stunde->fix=$row->fix; + $stunde->insertamum=$row->insertamum; + $stunde->insertvon=$row->insertvon; + $stunde->updateamum=$row->updateamum; + $stunde->updatevon=$row->updatevon; + $stunde->reservierung=false; + $this->lehrstunden[$i]=$stunde; + } + return $this->anzahl; + } + + + /** + * Prueft die geladene Lehrveranstaltung auf Kollisionen im Stundenplan. + * Bei einer Kollision steht der Grund der Kollision in '$this->errormsg'. + * @param string db_stpl_table Tabllenname des Stundenplans im DBMS + * @return boolean true=kollision, false=keine kollision + */ + public function kollision($stpl_table='stundenplandev') + { + $variablen_obj = new variable(); + $variablen_obj->loadVariables(get_uid()); + + $kollision_student = $variablen_obj->variable->kollision_student; + $ignore_reservierung = $variablen_obj->variable->ignore_reservierung; + $ignore_zeitsperre = $variablen_obj->variable->ignore_zeitsperre; + + //Kollisionspruefung auf Studentenebene + if($kollision_student=='true' && $this->kollision_student($stpl_table)) + return true; + + // Parameter Checken + // Bezeichnung der Stundenplan-Tabelle und des Keys + $stpl_id=$stpl_table.TABLE_ID; + $stpl_table='lehre.'.VIEW_BEGIN.$stpl_table; + + // Datenbank abfragen + $sql_query="SELECT $stpl_id AS id, lektor, stg_kurzbz, ort_kurzbz, semester, verband, gruppe, gruppe_kurzbz, datum, stunde FROM $stpl_table + WHERE datum=".$this->db_add_param($this->datum)." AND stunde=".$this->db_add_param($this->stunde); + + // Direkte Lehreinheitsgruppen kollidieren nicht + $sql_query.=" AND NOT EXISTS(SELECT 1 FROM public.tbl_gruppe WHERE gruppe_kurzbz = ".$stpl_table.".gruppe_kurzbz AND direktinskription=true)"; + + $sql_query.= " AND (ort_kurzbz=".$this->db_add_param($this->ort_kurzbz)." "; + + if (!in_array($this->lektor_uid,unserialize(KOLLISIONSFREIE_USER))) + $sql_query.=" OR (uid=".$this->db_add_param($this->lektor_uid)." AND uid not in (".$this->db_implode4SQL(unserialize(KOLLISIONSFREIE_USER))."))"; + + //Wenn eine Kollisionspruefung auf Studentenebene durchgefuehrt wird, werden die LVB nicht gecheckt + if($kollision_student=='false') + { + // Direkte Gruppen kollidieren nicht + $direktgruppe = false; + if($this->gruppe_kurzbz!=null && $this->gruppe_kurzbz!='' && $this->gruppe_kurzbz!=' ') + { + $grp_obj = new gruppe(); + $grp_obj->load($this->gruppe_kurzbz); + if($grp_obj->direktinskription) + { + $direktgruppe = true; + } + } + if(!$direktgruppe) + { + $sql_query.=" OR (studiengang_kz=".$this->db_add_param($this->studiengang_kz)." AND semester=".$this->db_add_param($this->sem); + if($this->gruppe_kurzbz!=null && $this->gruppe_kurzbz!='' && $this->gruppe_kurzbz!=' ') + { + $sql_query.=" OR (gruppe_kurzbz=".$this->db_add_param($this->gruppe_kurzbz).")"; + } + else + { + if ($this->ver!=null && $this->ver!='' && $this->ver!=' ') + $sql_query.=" AND (verband=".$this->db_add_param($this->ver)." OR verband IS NULL OR verband='' OR verband=' ')"; + if ($this->grp!=null && $this->grp!='' && $this->grp!=' ') + $sql_query.=" AND (gruppe=".$this->db_add_param($this->grp)." OR gruppe IS NULL OR gruppe='' OR gruppe=' ')"; + } + + $sql_query.=")"; + } + } + $sql_query.=") AND unr!=".$this->db_add_param($this->unr); + + if (!$erg_stpl = $this->db_query($sql_query)) + { + $this->errormsg=$sql_query.$this->db_last_error(); + return true; + } + + $anz=$this->db_num_rows($erg_stpl); + if ($anz==0) + { + // Zeitsperren pruefen + if($ignore_zeitsperre=='false' && !in_array($this->lektor_uid,unserialize(KOLLISIONSFREIE_USER)) && $this->kollision_zeitsperre()) + return true; + + // Reservierungen pruefen + if ($ignore_reservierung=='false' && $this->kollision_reservierung()) + return true; + + if($this->kollision_ressource()) + return true; + return false; + } + else + { + $row = $this->db_fetch_object($erg_stpl); + $this->errormsg="Kollision ($stpl_table): $row->id|$row->lektor|$row->ort_kurzbz|$row->stg_kurzbz-$row->semester$row->verband$row->gruppe$row->gruppe_kurzbz - $row->datum/$row->stunde\n"; //\n".$sql_query + return true; + } + } + + /** + * Prueft ob eine Kollision mit den zugeteilten Ressourcen vorhanden ist + * + * @return boolean true=kollision, false=keine kollision + */ + public function kollision_ressource() + { + $qry = "SELECT + tbl_betriebsmittel.beschreibung, tbl_stundenplandev.ort_kurzbz + FROM + lehre.tbl_stundenplan_betriebsmittel + JOIN lehre.tbl_stundenplandev USING(stundenplandev_id) + JOIN wawi.tbl_betriebsmittel USING(betriebsmittel_id) + WHERE + tbl_stundenplandev.datum=".$this->db_add_param($this->datum)." + AND tbl_stundenplandev.stunde=".$this->db_add_param($this->stunde)." + AND betriebsmittel_id IN(SELECT betriebsmittel_id FROM lehre.tbl_stundenplan_betriebsmittel WHERE stundenplandev_id=".$this->db_add_param($this->stundenplan_id).") + AND tbl_stundenplandev.stundenplandev_id<>".$this->db_add_param($this->stundenplan_id); + + if($result = $this->db_query($qry)) + { + if($row = $this->db_fetch_object($result)) + { + $this->errormsg='Kollision (Ressource)'.$row->beschreibung.'|'.$row->ort_kurzbz; + return true; + } + return false; + } + return false; + } + + /** + * Prueft ob eine Kollision mit den Zeitsperren vorhanden ist + * + * @return boolean true=kollision, false=keine kollision + */ + public function kollision_zeitsperre() + { + $sql_query="SELECT + zeitsperre_id,zeitsperretyp_kurzbz,mitarbeiter_uid AS lektor,vondatum,vonstunde,bisdatum,bisstunde + FROM campus.tbl_zeitsperre + WHERE mitarbeiter_uid=".$this->db_add_param($this->lektor_uid)." + AND (vondatum<".$this->db_add_param($this->datum)." OR (vondatum=".$this->db_add_param($this->datum)." AND (vonstunde<=".$this->db_add_param($this->stunde)." OR vonstunde IS NULL))) + AND (bisdatum>".$this->db_add_param($this->datum)." OR (bisdatum=".$this->db_add_param($this->datum)." AND (bisstunde>=".$this->db_add_param($this->stunde)." OR bisstunde IS NULL)));"; + + if (!$erg_zs = $this->db_query($sql_query)) + { + $this->errormsg=$sql_query.$this->db_last_error(); + return true; + } + + $anz_zs=$this->db_num_rows($erg_zs); + 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; + } + return false; + } + + /** + * Prueft ob eine LV-Plan Kollision mit den Reservierungen besteht + * + * @return boolean true=kollision, false=keine kollision + */ + public function kollision_reservierung() + { + $sql_query="SELECT + reservierung_id AS id, uid AS lektor, stg_kurzbz, ort_kurzbz, + semester, verband, gruppe, gruppe_kurzbz, datum, stunde + FROM lehre.vw_reservierung + WHERE + datum=".$this->db_add_param($this->datum)." AND + stunde=".$this->db_add_param($this->stunde)." AND + (ort_kurzbz=".$this->db_add_param($this->ort_kurzbz)." OR "; + + if (!in_array($this->lektor_uid, unserialize(KOLLISIONSFREIE_USER))) + $sql_query.="(uid=".$this->db_add_param($this->lektor_uid)." AND uid not in(".$this->db_implode4SQL(unserialize(KOLLISIONSFREIE_USER)).")) OR "; + + $sql_query.="(studiengang_kz=".$this->db_add_param($this->studiengang_kz)." AND semester=".$this->db_add_param($this->sem); + if ($this->ver!=null && $this->ver!='' && $this->ver!=' ') + $sql_query.=" AND (verband=".$this->db_add_param($this->ver)." OR verband IS NULL OR verband='' OR verband=' ')"; + if ($this->grp!=null && $this->grp!='' && $this->grp!=' ') + $sql_query.=" AND (gruppe=".$this->db_add_param($this->grp)." OR gruppe IS NULL OR gruppe='' OR gruppe=' ')"; + if ($this->gruppe_kurzbz!=null && $this->gruppe_kurzbz!='' && $this->gruppe_kurzbz!=' ') + $sql_query.=" AND (gruppe_kurzbz=".$this->db_add_param($this->gruppe_kurzbz).")"; + $sql_query.="))"; + + if (!$erg_res = $this->db_query($sql_query)) + { + $this->errormsg=$sql_query.$this->db_last_error(); + return true; + } + $anz_res = $this->db_num_rows($erg_res); + + if ($anz_res!=0) + { + $row = $this->db_fetch_object($erg_res); + $this->errormsg="Kollision (Reservierung): $row->id|$row->lektor|$row->ort_kurzbz|$row->stg_kurzbz-$row->semester$row->verband$row->gruppe$row->gruppe_kurzbz - $row->datum/$row->stunde"; + return true; + } + return false; + } + + /** + * Prueft eine Kollision auf Studentenebene + * Es werden nur die Kollisionen der Studenten abgefragt + * Raum, Lektor, Reservierung, Zeitsperren, etc werden hier nicht geprueft + * + * @param $stpl_table + * @return boolean true=kollision, false=keine kollision + */ + public function kollision_student($stpl_table='stundenplandev') + { + // Parameter Checken + // Bezeichnung der Stundenplan-Tabelle + $stpl_table='lehre.'.VIEW_BEGIN.$stpl_table; + + $sql_query = "SELECT * + FROM ".$stpl_table."_student_unr + WHERE datum=".$this->db_add_param($this->datum)." AND stunde=".$this->db_add_param($this->stunde)." AND student_uid IN( + SELECT uid FROM public.vw_gruppen WHERE + + "; + $sql_query.="(studiengang_kz=".$this->db_add_param($this->studiengang_kz)." AND semester=".$this->db_add_param($this->sem)." + AND studiensemester_kurzbz=( + SELECT tbl_studiensemester.studiensemester_kurzbz + FROM + public.tbl_studiensemester + WHERE + tbl_studiensemester.ende >= ".$this->db_add_param($this->datum)." + AND tbl_studiensemester.start <=".$this->db_add_param($this->datum)." LIMIT 1)"; + if ($this->gruppe_kurzbz!=null && $this->gruppe_kurzbz!='' && $this->gruppe_kurzbz!=' ') + $sql_query.=" AND (gruppe_kurzbz=".$this->db_add_param($this->gruppe_kurzbz).")"; + else + { + if ($this->ver!=null && $this->ver!='' && $this->ver!=' ') + $sql_query.=" AND (verband=".$this->db_add_param($this->ver).")"; + else + $sql_query.=" AND (verband IS NULL OR verband='' OR verband=' ')"; + if ($this->grp!=null && $this->grp!='' && $this->grp!=' ') + $sql_query.=" AND (gruppe=".$this->db_add_param($this->grp).")"; + else + $sql_query.=" AND (gruppe IS NULL OR gruppe='' OR gruppe=' ')"; + } + + + $sql_query.=")) AND unr!=".$this->db_add_param($this->unr); + + if (!$erg_stpl=$this->db_query($sql_query)) + { + $this->errormsg=$sql_query.$this->db_last_error(); + return true; + } + + $anz=$this->db_num_rows($erg_stpl); + + if ($anz>0) + { + $row = $this->db_fetch_object($erg_stpl); + $this->errormsg="Kollision Student ($stpl_table): $row->student_uid $row->datum/$row->stunde "; + return true; + } + else + { + return false; + } + } + + /** + * Gruppiert die einzelnen Lehrstunden zusammen + */ + public function getLehrstundenGruppiert() + { + $result = array(); + + foreach($this->lehrstunden as $row_lehrstunde) + { + $found=false; + //Pruefen ob bereits ein Eintrag vorhanden ist + //zu dem dazugruppiert werden kann + + /* + Kriterien fuer Gruppierung + - gleiches Datum + - gleiche Stunde + - gleiche UNR + */ + foreach($result as $key=>$row_result) + { + if($row_result->unr==$row_lehrstunde->unr + && $row_result->datum==$row_lehrstunde->datum + && $row_result->stunde==$row_lehrstunde->stunde) + { + $found=true; + //gleicher Eintrag gefunden + $grpidx = count($result[$key]->gruppen); + $result[$key]->gruppen[$grpidx]->studiengang_kz=$row_lehrstunde->studiengang_kz; + $result[$key]->gruppen[$grpidx]->sem=$row_lehrstunde->sem; + $result[$key]->gruppen[$grpidx]->ver=$row_lehrstunde->ver; + $result[$key]->gruppen[$grpidx]->grp=$row_lehrstunde->grp; + $result[$key]->gruppen[$grpidx]->gruppe_kurzbz=$row_lehrstunde->gruppe_kurzbz; + if(!in_array($row_lehrstunde->lektor_uid, $result[$key]->lektor_uid)) + $result[$key]->lektor_uid[]=$row_lehrstunde->lektor_uid; + if(!in_array($row_lehrstunde->ort_kurzbz, $result[$key]->ort_kurzbz)) + $result[$key]->ort_kurzbz[]=$row_lehrstunde->ort_kurzbz; + break; + } + } + + if(!$found) + { + // Wenn kein passender Eintrag vorhanden ist, + // wird ein neuer angelegt + $stunde=new lehrstunde(); + $stunde->stundenplan_id=$row_lehrstunde->stundenplan_id; + $stunde->lehreinheit_id=$row_lehrstunde->lehreinheit_id; + $stunde->farbe = (isset($row_lehrstunde->farbe)?$row_lehrstunde->farbe:'FFFFFF'); + $stunde->unr=$row_lehrstunde->unr; + $stunde->gruppen[0]->studiengang_kz=$row_lehrstunde->studiengang_kz; + $stunde->gruppen[0]->sem=$row_lehrstunde->sem; + $stunde->gruppen[0]->ver=$row_lehrstunde->ver; + $stunde->gruppen[0]->grp=$row_lehrstunde->grp; + $stunde->gruppen[0]->gruppe_kurzbz=$row_lehrstunde->gruppe_kurzbz; + $stunde->lektor_uid[]=$row_lehrstunde->lektor_uid; + $stunde->ort_kurzbz[]=$row_lehrstunde->ort_kurzbz; + $stunde->datum=$row_lehrstunde->datum; + $stunde->stunde=$row_lehrstunde->stunde; + $stunde->titel=$row_lehrstunde->titel; + $stunde->anmerkung=$row_lehrstunde->anmerkung; + $stunde->fix=$row_lehrstunde->fix; + $stunde->reservierung=$row_lehrstunde->reservierung; + $result[]=$stunde; + } + } + return $result; + } + + public function getStundenplanData($db_stpl_table, $lehrveranstaltung_id=null, $studiensemester_kurzbz=null, $lehreinheit_id=null, $mitarbeiter_uid=null, $student_uid=null) + { + + $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_".$db_stpl_table." 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=".$this->db_add_param($lehrveranstaltung_id)." + AND studiensemester_kurzbz=".$this->db_add_param($studiensemester_kurzbz).")"; + + } + elseif($lehreinheit_id!='') + { + $qry.=" lehreinheit_id=".$this->db_add_param($lehreinheit_id); + } + elseif($mitarbeiter_uid!='') + { + $qry.=" mitarbeiter_uid=".$this->db_add_param($mitarbeiter_uid)." AND lehreinheit_id IN( + SELECT + lehreinheit_id + FROM + lehre.tbl_lehreinheitmitarbeiter + JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) + WHERE mitarbeiter_uid=".$this->db_add_param($mitarbeiter_uid)." AND studiensemester_kurzbz=".$this->db_add_param($studiensemester_kurzbz).")"; + } + elseif($student_uid!='') + { + $qry.=" lehreinheit_id in ( + SELECT + lehreinheit_id + FROM + campus.vw_student_lehrveranstaltung + WHERE + uid=".$this->db_add_param($student_uid)." AND studiensemester_kurzbz=".$this->db_add_param($studiensemester_kurzbz).")"; + } + else + return false; + + $qry.="GROUP BY stpl.datum, stpl.unr, stpl.lehreinheit_id, lehrfach.bezeichnung + ORDER BY stpl.datum, min(stpl.stunde), stpl.unr, stpl.lehreinheit_id"; + + if($result = $this->db_query($qry)) + { + while($row = $this->db_fetch_object($result)) + { + $obj = new stdClass(); + + $obj->datum = $row->datum; + $obj->stundevon = $row->stundevon; + $obj->stundebis = $row->stundebis; + $obj->gruppen = array_unique($this->db_parse_array($row->gruppen)); + $obj->lektoren = array_unique($this->db_parse_array($row->lektoren)); + $obj->orte = array_unique($this->db_parse_array($row->orte)); + $obj->titel = array_filter(array_unique($this->db_parse_array($row->titel))); + $obj->lehrfach_bezeichnung = $row->lehrfach_bezeichnung; + $obj->lehreinheit_id = $row->lehreinheit_id; + + $this->result[] = $obj; + } + return true; + } + else + return false; + } +} + +?>