Files
FHC-Core/include/lehrstunde.class.php
T
Andreas Österreicher 54a94aa6cb Neuen CIS-Config Eintrag LVPLAN_LOAD_UEBER_SEMESTERHAELFTE hinzugefügt
Wenn der Config Eintrag auf true gesetzt wird, werden die Termine des
Vorsemesters auch nach der Semesterhälfte im Stundenplan angezeigt um
späte Nachprüfungstermine sichtbar zu machen.

Special Thanks to Klaus und Ronald für die laufende Genialisierung von
FHComplete
2018-12-19 08:06:05 +01:00

1102 lines
37 KiB
PHP

<?php
/* Copyright (C) 2006 FHTechnikum-Wien
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*/
/**
* @class lehrstunde
* @brief Beschreibung einer Unterrichts-Stunde der Tabelle tbl_stundenplan
* @author Christian Paminger, Andreas Österreicher
* @date 2004/8/21
* @version $Revision: 1.2 $
* Update: 21.10.2009 von Christian Paminger
* @bug Ein Fehler
* @todo Noch zu tun
* @warning Eine Warnung
*/
require_once(dirname(__FILE__).'/basis_db.class.php');
require_once(dirname(__FILE__).'/studiensemester.class.php');
require_once(dirname(__FILE__).'/variable.class.php');
class lehrstunde extends basis_db
{
public $stundenplan_id; /// @brief ID in der Datenbank
public $lehreinheit_id; /// @brief id der Lehreinheit in der DB
public $unr; // @brief Unterrichtsnummer
public $lektor_uid; // @brief UID des Lektors
public $lektor_kurzbz; // @brief Kurzbezeichnung des Lektors
public $datum; // @brief Datum
public $stunde; // @brief Unterrichts-Stunde des Tages
public $ort_kurzbz; // @brief Ort in dem der Unterricht stattfindet
public $lehrfach_id; // @brief Nummer des Lehrfachs
public $lehrfach; // @brief Name des Lehrfachs
public $lehrfach_bez; // @brief Voller Name des Lehrfachs
public $lehrform; // @brief Lehrform des Lehrfachs (Vorlesung, ...)
public $studiengang_kz; // @brief Kennzahl des Studiengangs
public $studiengang; // @brief Kurzbezeichnung des Studiengangs
public $sem; // @brief Semester
public $ver; // @brief Verband
public $grp; // @brief Gruppe
public $gruppe_kurzbz; // @brief Kurzbezeichnung der Gruppe
public $titel; // @brief Titel der Unterrichtsstunde
public $anmerkung; // @brief Anmerkungen zur Unterrichtsstunde
public $fix; // @brief true wenn diese Stunde nicht mehr verschoben wird
public $updateamum; // @brief letztes Update
public $updatevon; // @brief Update von wem?
public $new; // @brief true wenns ein neuer Datensatz ist
public $reservierung; // @brief true wenns eine Reservierung ist
public $lehrstunden=array(); // @brief Objekt der eigenen Klasse
public $anzahl; // @brief Gesamte Anzahl der Stunden im Array
public $ss=null; // @brief Studiensemester
public $lastqry=null;
/*
* Konstruktor
*
*/
public function __construct()
{
parent::__construct();
$this->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;
}
// 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
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 semester 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=$this->db_last_error();
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=$this->db_last_error($this->conn);
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=$this->db_last_error($this->conn);
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;
else
$sql_query_stdplan='SELECT * FROM '.$stpl_view;
$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='')";
$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;
}
//echo $sql_query_stdplan;
//Datenbankabfrage
if (!$this->db_query($sql_query_stdplan))
{
$this->errormsg = $this->db_last_error();
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';
$sql_query_reservierung.=$sql_query . $sql_query_orderby;
//Datenbankabfrage
if (!$this->db_query($sql_query_reservierung))
{
$this->errormsg = $this->db_last_error();
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)." 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')
{
$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".$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;
}
}
?>