mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-06-01 20:29:29 +00:00
2218 lines
79 KiB
PHP
2218 lines
79 KiB
PHP
<?php
|
|
/* Copyright (C) 2007 Technikum-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.
|
|
*
|
|
* Authors: Christian Paminger <christian.paminger@technikum-wien.at>,
|
|
* Andreas Oesterreicher <andreas.oesterreicher@technikum-wien.at> and
|
|
* Rudolf Hangl <rudolf.hangl@technikum-wien.at>.
|
|
*/
|
|
/****************************************************************************
|
|
* @class Stundenplan
|
|
* @author Christian Paminger
|
|
* @date 2001/8/21
|
|
* @version $Revision: 1.3 $
|
|
* Update: 10.11.2004 von Christian Paminger
|
|
* @brief Klasse zm Berechnen und Anzeigen des Stundenplans.
|
|
* Abhaengig: von functions.inc.php
|
|
*****************************************************************************/
|
|
require_once(dirname(__FILE__).'/basis_db.class.php');
|
|
require_once(dirname(__FILE__).'/lehrstunde.class.php');
|
|
require_once(dirname(__FILE__).'/ferien.class.php');
|
|
require_once(dirname(__FILE__).'/benutzerberechtigung.class.php');
|
|
require_once(dirname(__FILE__).'/studiengang.class.php');
|
|
require_once(dirname(__FILE__).'/mitarbeiter.class.php');
|
|
require_once(dirname(__FILE__).'/datum.class.php');
|
|
require_once(dirname(__FILE__).'/zeitsperre.class.php');
|
|
require_once(dirname(__FILE__).'/phrasen.class.php');
|
|
require_once(dirname(__FILE__).'/globals.inc.php');
|
|
require_once(dirname(__FILE__).'/sprache.class.php');
|
|
|
|
class wochenplan extends basis_db
|
|
{
|
|
public $conn; // @brief Connection zur Datenbank
|
|
public $crlf; // @brief Return Linefeed
|
|
public $type; // @brief Typ des Plans (Student, Lektor, Verband, Ort)
|
|
public $user; // @brief Benutzergruppe
|
|
public $user_uid; // @brief id in der Datenbank des Benutzers
|
|
public $link; // @brief Link auf eigene Seite
|
|
public $kal_link; // @brief Link auf den kalender
|
|
|
|
public $stg_kz; // @brief Kennzahl des Studiengangs
|
|
public $stg_bez; // @brief Bezeichnung Studiengang
|
|
public $stg_kurzbz; // @brief Kurzbezeichnung Studiengang
|
|
public $stg_kurzbzlang;// @brief lange Kurzbezeichnung Studiengang
|
|
public $sem; // @brief Semester
|
|
public $ver; // @brief Verband (A,B,C,...)
|
|
public $grp; // @brief Gruppe (1,2)
|
|
|
|
public $pers_uid; // @brief Account Name der Person (PK)
|
|
public $pers_titelpost; // @brief Titel der Person
|
|
public $pers_titelpre; // @brief Titel der Person
|
|
public $pers_nachname; // @brief Personendaten
|
|
public $pers_vorname; // @brief Personendaten
|
|
public $pers_vornamen; // @brief Personendaten
|
|
|
|
public $ort_kurzbz; // @brief Ort PK
|
|
public $ort_bezeichnung;
|
|
public $ort_planbezeichnung;
|
|
public $ort_ausstattung;
|
|
public $ort_max_person;
|
|
|
|
public $gruppe_kurzbz;
|
|
public $gruppe_bezeichnung;
|
|
|
|
public $datum; // @brief Datum des Montags der zu zeichnenden Woche
|
|
public $datum_nextweek;
|
|
public $datum_next4week;
|
|
public $datum_prevweek;
|
|
public $datum_prev4week;
|
|
public $datum_begin;
|
|
public $datum_end;
|
|
public $kalenderwoche;
|
|
|
|
public $studiensemester_now;
|
|
public $studiensemester_next;
|
|
|
|
public $std_plan;
|
|
public $stunde;
|
|
|
|
public $wochenplan;
|
|
public $errormsg;
|
|
|
|
/**
|
|
* Konstruktor
|
|
* @param $type
|
|
*/
|
|
public function __construct($type)
|
|
{
|
|
parent::__construct();
|
|
|
|
$this->type=$type;
|
|
|
|
$this->link='stpl_week.php?type='.$type;
|
|
$this->kal_link='stpl_kalender.php?type='.$type;
|
|
// Timezone setzten
|
|
date_default_timezone_set('Europe/Vienna');
|
|
$this->datum=mktime();
|
|
$this->init_stdplan();
|
|
$this->crlf=crlf();
|
|
|
|
}
|
|
|
|
/**
|
|
* initialisiert den Studenplan
|
|
*
|
|
*/
|
|
public function init_stdplan()
|
|
{
|
|
//Stundenplan Array initialisieren (Anzahl auf 0 setzten)
|
|
unset($this->std_plan);
|
|
for ($i=1; $i<=TAGE_PRO_WOCHE; $i++)
|
|
for ($j=0; $j<20; $j++)
|
|
{
|
|
$this->std_plan[$i][$j][0]->anz=0;
|
|
$this->std_plan[$i][$j][0]->unr=0;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Funktion load_data ladet alle Zusatzinformationen fuer die Darstellung
|
|
* und ueberprueft die Daten
|
|
*
|
|
* @param $type
|
|
* @param $uid
|
|
* @param $ort_kurzbz
|
|
* @param $studiengang_kz
|
|
* @param $sem
|
|
* @param $ver
|
|
* @param $grp
|
|
* @param $gruppe
|
|
*/
|
|
public function load_data($type, $uid, $ort_kurzbz=NULL, $studiengang_kz=NULL, $sem=NULL, $ver=NULL, $grp=NULL, $gruppe=NULL)
|
|
{
|
|
// Parameter Checken
|
|
// Typ des Stundenplans
|
|
if ($type=='student' || $type=='lektor' || $type=='verband' || $type=='gruppe' || $type=='ort')
|
|
$this->type=$type;
|
|
else
|
|
{
|
|
$this->errormsg='Error: type is not defined!';
|
|
return false;
|
|
}
|
|
// Person
|
|
if (($type=='student' || $type=='lektor') && ($uid==NULL || $uid==''))
|
|
{
|
|
$this->errormsg='Fehler: uid der Person ist nicht gesetzt';
|
|
return false;
|
|
}
|
|
else
|
|
$this->pers_uid=$uid;
|
|
|
|
// Ort
|
|
if ($type=='ort' && $ort_kurzbz==NULL)
|
|
{
|
|
$this->errormsg='Fehler: Kurzbezeichnung des Orts ist nicht gesetzt';
|
|
return false;
|
|
}
|
|
elseif ($type=='ort')
|
|
$this->ort_kurzbz=$ort_kurzbz;
|
|
else
|
|
$this->ort_kurzbz='';
|
|
|
|
// Lehrverband
|
|
if ($type=='verband' && $studiengang_kz==NULL)
|
|
{
|
|
$this->errormsg='Fehler: Kennzahl des Studiengangs ist nicht gesetzt';
|
|
return false;
|
|
}
|
|
elseif($type=='verband')
|
|
{
|
|
$this->stg_kz=$studiengang_kz;
|
|
$this->sem=$sem;
|
|
$this->ver=$ver;
|
|
$this->grp=$grp;
|
|
}
|
|
|
|
// Einheit
|
|
if ($type=='gruppe' && $gruppe==NULL)
|
|
{
|
|
$this->errormsg='Fehler: Kurzbezeichnung der Gruppe ist nicht gesetzt';
|
|
return false;
|
|
}
|
|
elseif ($type=='gruppe')
|
|
$this->gruppe_kurzbz=$gruppe;
|
|
|
|
|
|
// Zusaetzliche Daten ermitteln
|
|
//personendaten
|
|
if ($this->type=='student' || $this->type=='lektor')
|
|
{
|
|
$this->link.='&pers_uid='.$this->pers_uid; //Link erweitern
|
|
if ($this->type=='student')
|
|
$sql_query="SELECT uid, titelpre, titelpost, nachname, vorname, vornamen, studiengang_kz, semester, verband, gruppe FROM campus.vw_student WHERE uid='".addslashes($this->pers_uid)."'";
|
|
else
|
|
$sql_query="SELECT uid, titelpre, titelpost, nachname, vorname, vornamen FROM campus.vw_mitarbeiter WHERE uid='".addslashes($this->pers_uid)."'";
|
|
//echo $sql_query;
|
|
if (!$this->db_query($sql_query))
|
|
{
|
|
$this->errormsg=$this->db_last_error();
|
|
return false;
|
|
}
|
|
if($row = $this->db_fetch_object())
|
|
{
|
|
$this->pers_uid = $row->uid;
|
|
$this->pers_titelpre = $row->titelpre;
|
|
$this->pers_titelpost = $row->titelpost;
|
|
$this->pers_nachname = $row->nachname;
|
|
$this->pers_vorname =$row->vorname;
|
|
$this->pers_vornamen = $row->vornamen;
|
|
|
|
if ($this->type=='student')
|
|
{
|
|
$this->stg_kz = $row->studiengang_kz;
|
|
$this->sem = $row->semester;
|
|
$this->ver = $row->verband;
|
|
$this->grp = $row->gruppe;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$this->errormsg='User nicht gefunden';
|
|
return false;
|
|
}
|
|
}
|
|
|
|
//ortdaten ermitteln
|
|
if ($this->type=='ort')
|
|
{
|
|
$sql_query="SELECT bezeichnung, ort_kurzbz, planbezeichnung, ausstattung, max_person FROM public.tbl_ort WHERE ort_kurzbz='".addslashes($this->ort_kurzbz)."'";
|
|
//echo $sql_query;
|
|
if (!$this->db_query($sql_query))
|
|
{
|
|
$this->errormsg=$this->db_last_error();
|
|
return false;
|
|
}
|
|
|
|
if($row = $this->db_fetch_object())
|
|
{
|
|
$this->ort_bezeichnung = $row->bezeichnung;
|
|
$this->ort_kurzbz = $row->ort_kurzbz;
|
|
$this->ort_planbezeichnung = $row->planbezeichnung;
|
|
$this->ort_ausstattung = $row->ausstattung;
|
|
$this->ort_max_person = $row->max_person;
|
|
$this->link.='&ort_kurzbz='.$this->ort_kurzbz; //Link erweitern
|
|
}
|
|
else
|
|
{
|
|
$this->errormsg="Dieser Ort existiert nicht";
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Studiengangsdaten ermitteln
|
|
if ($this->type=='student' || $this->type=='verband')
|
|
{
|
|
$sql_query="SELECT bezeichnung, kurzbz, kurzbzlang, typ FROM public.tbl_studiengang WHERE studiengang_kz='".addslashes($this->stg_kz)."'";
|
|
//echo $sql_query;
|
|
if(!($this->db_query($sql_query)))
|
|
die($this->db_last_error());
|
|
if($row = $this->db_fetch_object())
|
|
{
|
|
$this->stg_bez = $row->bezeichnung;
|
|
$this->stg_kurzbz = $row->typ.$row->kurzbz;
|
|
$this->stg_kurzbzlang = $row->kurzbzlang;
|
|
}
|
|
}
|
|
|
|
// Stundentafel abfragen
|
|
$sql_query="SELECT stunde, beginn, ende FROM lehre.tbl_stunde ORDER BY stunde";
|
|
if(!$this->db_query($sql_query))
|
|
die($this->db_last_error());
|
|
$this->stunde = $this->db_result;
|
|
|
|
// Studiensemesterdaten ermitteln
|
|
$sql_query="SELECT * FROM public.tbl_studiensemester WHERE now()<ende ORDER BY start LIMIT 2";
|
|
if(!$this->db_query($sql_query))
|
|
die($this->db_last_error());
|
|
else
|
|
{
|
|
if($row = $this->db_fetch_object())
|
|
{
|
|
$this->studiensemester_now->name=$row->studiensemester_kurzbz;
|
|
$this->studiensemester_now->start=mktime(0,0,0,mb_substr($row->start,5,2),mb_substr($row->start,8,2),mb_substr($row->start,0,4));
|
|
$this->studiensemester_now->ende=mktime(0,0,0,mb_substr($row->ende,5,2),mb_substr($row->ende,8,2),mb_substr($row->ende,0,4));#
|
|
}
|
|
if($row = $this->db_fetch_object())
|
|
{
|
|
$this->studiensemester_next->name=$row->studiensemester_kurzbz;
|
|
$this->studiensemester_next->start=mktime(0,0,0,mb_substr($row->start,5,2),mb_substr($row->start,8,2),mb_substr($row->start,0,4));
|
|
$this->studiensemester_next->ende=mktime(0,0,0,mb_substr($row->ende,5,2),mb_substr($row->ende,8,2),mb_substr($row->ende,0,4));
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Funktion load_week ladet die Stundenplandaten einer Woche
|
|
*
|
|
* @param datum Datum eines Tages in der angeforderten Woche
|
|
* @return true oder false
|
|
*/
|
|
public function load_week($datum, $stpl_view='stundenplan')
|
|
{
|
|
// Pruefung der Attribute
|
|
if (!isset($this->type))
|
|
{
|
|
$this->errormsg='$type is not set in stundenplan.load_week!';
|
|
return false;
|
|
}
|
|
|
|
//Kalenderdaten setzen
|
|
$this->datum=montag($datum);
|
|
$this->datum_begin=$this->datum;
|
|
$this->datum_end=jump_week($this->datum_begin, 1);
|
|
$this->datum_nextweek=$this->datum_end;
|
|
$this->datum_prevweek=jump_week($this->datum_begin, -1);
|
|
$this->datum_next4week=jump_week($this->datum_begin, 4);
|
|
$this->datum_prev4week=jump_week($this->datum_begin, -4);
|
|
// Formatieren fuer Datenbankabfragen
|
|
$this->datum_begin=date("Y-m-d",$this->datum_begin);
|
|
$this->datum_end=date("Y-m-d",$this->datum_end);
|
|
$this->kalenderwoche=kalenderwoche($this->datum);
|
|
|
|
// Stundenplandaten ermittlen
|
|
$this->wochenplan=new lehrstunde();
|
|
$anz=$this->wochenplan->load_lehrstunden($this->type,$this->datum_begin,$this->datum_end,$this->pers_uid,$this->ort_kurzbz,$this->stg_kz,$this->sem,$this->ver,$this->grp,$this->gruppe_kurzbz, $stpl_view);
|
|
if ($anz<0)
|
|
{
|
|
$this->errormsg=$this->wochenplan->errormsg;
|
|
return false;
|
|
}
|
|
|
|
// Stundenplandaten aufbereiten
|
|
for($i=0;$i<$anz;$i++)
|
|
{
|
|
$idx=0;
|
|
$mtag=mb_substr($this->wochenplan->lehrstunden[$i]->datum, 8,2);
|
|
$month=mb_substr($this->wochenplan->lehrstunden[$i]->datum, 5,2);
|
|
$jahr=mb_substr($this->wochenplan->lehrstunden[$i]->datum, 0,4);
|
|
$tag=date("w",mktime(12,0,0,$month,$mtag,$jahr));
|
|
if ($tag==0)
|
|
$tag=7; //Sonntag
|
|
//echo $tag.':'.$this->wochenplan->lehrstunden[$i]->datum.'<BR>';
|
|
$stunde=$this->wochenplan->lehrstunden[$i]->stunde;
|
|
// naechste freie Stelle im Array suchen
|
|
while (isset($this->std_plan[$tag][$stunde][$idx]->lektor_uid))
|
|
$idx++;
|
|
//echo $idx.'<BR>';
|
|
$this->std_plan[$tag][$stunde][$idx]->unr=$this->wochenplan->lehrstunden[$i]->unr;
|
|
$this->std_plan[$tag][$stunde][$idx]->reservierung=$this->wochenplan->lehrstunden[$i]->reservierung;
|
|
if ($this->wochenplan->lehrstunden[$idx]->reservierung)
|
|
$this->std_plan[$tag][$stunde][$idx]->lehrfach=$this->wochenplan->lehrstunden[$i]->titel;
|
|
else
|
|
{
|
|
$this->std_plan[$tag][$stunde][$idx]->lehrfach=$this->wochenplan->lehrstunden[$i]->lehrfach;
|
|
$this->std_plan[$tag][$stunde][$idx]->lehrform=$this->wochenplan->lehrstunden[$i]->lehrform;
|
|
$this->std_plan[$tag][$stunde][$idx]->lehrfach_id=$this->wochenplan->lehrstunden[$i]->lehrfach_id;
|
|
$this->std_plan[$tag][$stunde][$idx]->farbe=$this->wochenplan->lehrstunden[$i]->farbe;
|
|
$this->std_plan[$tag][$stunde][$idx]->titel=$this->wochenplan->lehrstunden[$i]->titel;
|
|
}
|
|
$this->std_plan[$tag][$stunde][$idx]->titel=$this->wochenplan->lehrstunden[$i]->titel;
|
|
$this->std_plan[$tag][$stunde][$idx]->stundenplan_id=$this->wochenplan->lehrstunden[$i]->stundenplan_id;
|
|
$this->std_plan[$tag][$stunde][$idx]->lektor_uid=$this->wochenplan->lehrstunden[$i]->lektor_uid;
|
|
$this->std_plan[$tag][$stunde][$idx]->lektor=$this->wochenplan->lehrstunden[$i]->lektor_kurzbz;
|
|
$this->std_plan[$tag][$stunde][$idx]->ort=$this->wochenplan->lehrstunden[$i]->ort_kurzbz;
|
|
$this->std_plan[$tag][$stunde][$idx]->stg=$this->wochenplan->lehrstunden[$i]->studiengang;
|
|
$this->std_plan[$tag][$stunde][$idx]->stg_kz=$this->wochenplan->lehrstunden[$i]->studiengang_kz;
|
|
$this->std_plan[$tag][$stunde][$idx]->sem=$this->wochenplan->lehrstunden[$i]->sem;
|
|
$this->std_plan[$tag][$stunde][$idx]->ver=$this->wochenplan->lehrstunden[$i]->ver;
|
|
$this->std_plan[$tag][$stunde][$idx]->grp=$this->wochenplan->lehrstunden[$i]->grp;
|
|
$this->std_plan[$tag][$stunde][$idx]->gruppe_kurzbz=$this->wochenplan->lehrstunden[$i]->gruppe_kurzbz;
|
|
$this->std_plan[$tag][$stunde][$idx]->anmerkung=$this->wochenplan->lehrstunden[$i]->anmerkung;
|
|
$this->std_plan[$tag][$stunde][$idx]->updateamum=$this->wochenplan->lehrstunden[$i]->updateamum;
|
|
$this->std_plan[$tag][$stunde][$idx]->updatevon=$this->wochenplan->lehrstunden[$i]->updatevon;
|
|
//echo $tag.' '.$stunde.' '.$this->std_plan[$tag][$stunde][$idx]->lektor_uid.'<br>';
|
|
}
|
|
unset($this->wochenplan);
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Schreibt den Stundenplan Header im HTML-Format
|
|
*
|
|
*/
|
|
public function draw_header()
|
|
{
|
|
$sprache = getSprache();
|
|
$p=new phrasen($sprache);
|
|
|
|
echo '<TABLE width="100%" bgcolor="#EEEEEE" border="0" cellspacing="0">'.$this->crlf;
|
|
echo ' <TR>'.$this->crlf;
|
|
echo ' <TD valign="bottom">'.$this->crlf;
|
|
echo ' <P valign="top">';
|
|
if ($this->type=='student' || $this->type=='lektor')
|
|
echo '<strong>Person: </strong>'.$this->pers_titelpre.' '.$this->pers_vorname.' '.$this->pers_nachname.' '.$this->pers_titelpost.' - '.$this->pers_uid.'<br>';
|
|
if ($this->type=='student' || $this->type=='verband')
|
|
{
|
|
echo '<strong>'.$p->t('global/studiengang').': </strong>'.$this->stg_kurzbzlang.' - '.$this->stg_bez.'<br>';
|
|
echo $p->t('global/semester').': '.$this->sem.'<br>';
|
|
if ($this->ver!='0' && $this->ver!='' && $this->ver!=null)
|
|
echo $p->t('global/verband').': '.$this->ver.'<br>';
|
|
if ($this->grp!='0' && $this->grp!='' && $this->grp!=null)
|
|
echo $p->t('global/gruppe').': '.$this->grp.'<br>';
|
|
$this->link.='&stg_kz='.$this->stg_kz.'&sem='.$this->sem.'&ver='.$this->ver.'&grp='.$this->grp;
|
|
}
|
|
if ($this->type=='ort')
|
|
echo '<strong>'.$p->t('lvplan/raum').': </strong>'.(1==1 || is_file(RAUMINFO_PATH.trim($this->ort_kurzbz).'.html')?'<a href="'.RAUMINFO_PATH.trim($this->ort_kurzbz).'.html" target="_blank">'.$this->ort_kurzbz.'</a>':$this->ort_kurzbz).' - '.$this->ort_bezeichnung.' - '.($this->ort_max_person!=''?'( '.$this->ort_max_person.' Personen )':'').'<br>'.$this->ort_ausstattung.'<br>';
|
|
echo '</P>'.$this->crlf;
|
|
echo ' <div valign="bottom" align="center">'.$this->crlf;
|
|
|
|
//Kalender
|
|
$this->kal_link.='&pers_uid='.$this->pers_uid.'&ort_kurzbz='.$this->ort_kurzbz.'&stg_kz='.$this->stg_kz.'&sem='.$this->sem.'&ver='.$this->ver.'&grp='.$this->grp.'&gruppe_kurzbz='.$this->gruppe_kurzbz;
|
|
//global $kalender_begin_ws, $kalender_ende_ws, $kalender_begin_ss, $kalender_ende_ss;
|
|
$kal_link_ws=$this->kal_link.'&begin='.$this->studiensemester_now->start.'&ende='.$this->studiensemester_now->ende;
|
|
$kal_link_ss=$this->kal_link.'&begin='.$this->studiensemester_next->start.'&ende='.$this->studiensemester_next->ende;
|
|
echo ' <strong>'.$p->t('global/kalender').': </strong>'.$this->crlf;
|
|
echo ' <A href="'.$kal_link_ws.'&format=html" target="_blank" title="HTML">'.$this->studiensemester_now->name.'</A> '.$this->crlf;
|
|
echo ' <A href="'.$kal_link_ws.'&format=html" target="_blank" title="HTML"><IMG src="../../../skin/images/website.png" height="24" alt="HTML" border="0"></A>'.$this->crlf;
|
|
echo ' <A href="'.$kal_link_ws.'&format=csv" title="CSV"><IMG src="../../../skin/images/csv.png" height="24" alt="CSV" border="0"></A>'.$this->crlf;
|
|
echo ' <A href="'.$kal_link_ws.'&format=csv&target=outlook" title="CSV-Outlook"><IMG src="../../../skin/images/outlook.png" height="24" alt="CSV-Outlook" border="0"></A>'.$this->crlf;
|
|
echo ' <A href="'.$kal_link_ws.'&format=ical&version=1&target=ical" title="iCal Version 1.0"><IMG src="../../../skin/images/vcal_v1.png" height="24" alt="vCal Version 1.0" border="0"></A>'.$this->crlf;
|
|
echo ' <A href="'.$kal_link_ws.'&format=ical&version=2&target=ical" title="iCal Version 2.0"><IMG src="../../../skin/images/vcal_v2.png" height="24" alt="vCal Version 2.0" border="0"></A>'.$this->crlf;
|
|
echo ' <A href="'.$kal_link_ss.'&format=html" target="_blank" title="HTML">'.$this->studiensemester_next->name.'</A> '.$this->crlf;
|
|
echo ' <A href="'.$kal_link_ss.'&format=html" target="_blank" title="HTML"><IMG src="../../../skin/images/website.png" height="24" alt="HTML" border="0"></A>'.$this->crlf;
|
|
echo ' <A href="'.$kal_link_ss.'&format=csv" title="CSV"><IMG src="../../../skin/images/csv.png" height="24" alt="CSV" border="0"></A>'.$this->crlf;
|
|
echo ' <A href="'.$kal_link_ss.'&format=csv&target=outlook" title="CSV-Outlook"><IMG src="../../../skin/images/outlook.png" height="24" alt="CSV-Outlook" border="0"></A>'.$this->crlf;
|
|
echo ' <A href="'.$kal_link_ss.'&format=ical&version=1&target=ical" title="iCal Version 1.0"><IMG src="../../../skin/images/vcal_v1.png" height="24" alt="iCal Version 1.0" border="0"></A>'.$this->crlf;
|
|
echo ' <A href="'.$kal_link_ss.'&format=ical&version=2&target=ical" title="iCal Version 2.0"><IMG src="../../../skin/images/vcal_v2.png" height="24" alt="iCal Version 2.0" border="0"></A>'.$this->crlf;
|
|
echo ' </div>'.$this->crlf;
|
|
echo ' </TD>'.$this->crlf;
|
|
|
|
// Kalenderjump
|
|
echo ' <TD align="right" valign="top">'.$this->crlf;
|
|
jahreskalenderjump($this->link);
|
|
echo ' </TD>'.$this->crlf;
|
|
echo ' </TR>'.$this->crlf;
|
|
echo '</TABLE><HR>'.$this->crlf.$this->crlf;
|
|
|
|
// Jump Wochenweise
|
|
if ($this->type=='verband')
|
|
$link_parameter='&stg_kz='.$this->stg_kz.'&sem='.$this->sem.'&ver='.$this->ver.'&grp='.$this->grp;
|
|
if ($this->type=='student' || $this->type=='lektor')
|
|
$link_parameter='&pers_uid='.$this->pers_uid;
|
|
|
|
// Ort Jump
|
|
if ($this->type=='ort')
|
|
{
|
|
// Orte abfragen
|
|
$sql_query="SELECT * FROM public.tbl_ort WHERE aktiv AND lehre ORDER BY ort_kurzbz";
|
|
if(!$this->db_query($sql_query))
|
|
die($this->db_last_error());
|
|
$num_rows_ort=$this->db_num_rows();
|
|
|
|
// vorigen Ort bestimmen
|
|
for ($i=0;$i<($num_rows_ort-1);$i++)
|
|
{
|
|
$row = $this->db_fetch_object(null,$i+1);
|
|
|
|
if ($row->ort_kurzbz==$this->ort_kurzbz)
|
|
$prev_ort=$this->db_fetch_object(null,$i);
|
|
}
|
|
// naechsten Ort bestimmen
|
|
for ($i=1;$i<$num_rows_ort;$i++)
|
|
{
|
|
$row = $this->db_fetch_object(null, $i-1);
|
|
if ($row->ort_kurzbz==$this->ort_kurzbz)
|
|
$next_ort=$this->db_fetch_object(null,$i);
|
|
}
|
|
|
|
// Ort Jump
|
|
echo '<FORM align="center" name="AuswahlOrt" action="stpl_week.php">'.$this->crlf;
|
|
echo ' <p align="center">'.$this->crlf;
|
|
//$datum=mktime($this->datum[hours], $this->datum[minutes], $this->datum[seconds], $this->datum[mon], $this->datum[mday], $this->datum[year]);
|
|
if (isset($prev_ort))
|
|
{
|
|
echo ' <a href="stpl_week.php?type='.$this->type.'&datum='.$this->datum.'&ort_kurzbz='.$prev_ort->ort_kurzbz.'">'.$this->crlf;
|
|
echo ' <img src="../../../skin/images/left.gif" border="0" title="'.$prev_ort->ort_kurzbz.'" />'.$this->crlf;
|
|
echo ' </a>'.$this->crlf;
|
|
}
|
|
echo " <SELECT name=\"select\" onChange=\"MM_jumpMenu('self',this,0)\" class=\"xxxs_black\">".$this->crlf;
|
|
for ($i=0;$i<$num_rows_ort;$i++)
|
|
{
|
|
$row=$this->db_fetch_object (null, $i);
|
|
echo ' <OPTION value="stpl_week.php?type=ort&ort_kurzbz='.$row->ort_kurzbz.'&datum='.$this->datum.'"';
|
|
if ($row->ort_kurzbz==$this->ort_kurzbz)
|
|
echo ' selected ';
|
|
echo ">$row->ort_kurzbz ($row->bezeichnung)</option>".$this->crlf;
|
|
}
|
|
echo ' </SELECT>'.$this->crlf;
|
|
if (isset($next_ort))
|
|
{
|
|
echo ' <a href="stpl_week.php?type='.$this->type.'&datum='.$this->datum.'&ort_kurzbz='.$next_ort->ort_kurzbz.'">'.$this->crlf;
|
|
echo ' <img src="../../../skin/images/right.gif" border="0" title="'.$next_ort->ort_kurzbz.'">'.$this->crlf;
|
|
echo ' </a>'.$this->crlf;
|
|
}
|
|
echo ' </p>';
|
|
$link_parameter='&ort_kurzbz='.$this->ort_kurzbz;
|
|
}
|
|
echo ' <p align="center">';
|
|
// 4 Wochen zurueck
|
|
echo ' <a href="stpl_week.php?type='.$this->type.$link_parameter.'&datum='.$this->datum_prev4week.'">'.$this->crlf;
|
|
echo ' <img src="../../../skin/images/moreleft.gif" border="0" title="4 Wochen zurueck">'.$this->crlf;
|
|
echo ' </a>';
|
|
// 1 Woche zurueck
|
|
echo '<a href="stpl_week.php?type='.$this->type;
|
|
echo $link_parameter;
|
|
echo '&datum='.$this->datum_prevweek;
|
|
echo '"><img src="../../../skin/images/left.gif" border="0"></a> KW '.$this->kalenderwoche;
|
|
// 1 Woche nach vor
|
|
echo '<a href="stpl_week.php?type='.$this->type;
|
|
echo $link_parameter;
|
|
echo '&datum='.$this->datum_nextweek;
|
|
echo '"><img src="../../../skin/images/right.gif" border="0"></a>';
|
|
// 4 Wochen nach vor
|
|
echo '<a href="stpl_week.php?type='.$this->type;
|
|
echo $link_parameter;
|
|
echo '&datum='.$this->datum_next4week;
|
|
echo '"><img src="../../../skin/images/moreright.gif" border="0"></a>';
|
|
echo '</p>';
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Zeichnen der Stundenplanwoche in HTML
|
|
*/
|
|
public function draw_week($raumres, $user_uid='')
|
|
{
|
|
global $tagbez;
|
|
$sprache = getSprache();
|
|
$spracheLoad = new sprache();
|
|
$spracheLoad->load($sprache);
|
|
$p=new phrasen($sprache);
|
|
|
|
$o_datum=new datum();
|
|
// Stundentafel abfragen
|
|
$sql_query="SELECT stunde, beginn, ende FROM lehre.tbl_stunde ORDER BY stunde";
|
|
if(!$this->db_query($sql_query))
|
|
die($this->db_last_error());
|
|
$result_stunde = $this->db_result;
|
|
$num_rows_stunde = $this->db_num_rows($result_stunde);
|
|
|
|
// Formularbeginn wenn Lektor
|
|
if ($this->user=='lektor' && $this->type=='ort')
|
|
echo '<form name="reserve" method="post" action="stpl_week.php">'.$this->crlf;
|
|
|
|
//Tabelle zeichnen
|
|
echo ' <table class="stdplan" width="100%" border="1" cellpadding="0" cellspacing="0" name="Stundenplantabelle" align="center">'.$this->crlf;
|
|
// Kopfzeile darstellen
|
|
echo '<thead><tr>'.$this->crlf;
|
|
echo ' <th align="right">'.$p->t('global/stunde').' <br>'.$p->t('global/beginn').' <br>'.$p->t('global/ende').' </th>'.$this->crlf;
|
|
for ($i=0;$i<$num_rows_stunde; $i++)
|
|
{
|
|
$row = $this->db_fetch_object($result_stunde);
|
|
$beginn=$row->beginn;
|
|
$beginn=mb_substr($beginn,0,5);
|
|
$ende=$row->ende;
|
|
$ende=mb_substr($ende,0,5);
|
|
$stunde=$row->stunde;
|
|
echo ' <th><div align="center">'.$stunde.'<br> '.$beginn .' <br> '.$ende.' </div></th>'.$this->crlf;
|
|
}
|
|
echo '</tr></thead><tbody>'.$this->crlf;
|
|
// Von Montag bis Samstag
|
|
$datum_now=mktime();
|
|
$datum_res_lektor_start=jump_day($datum_now,(RES_TAGE_LEKTOR_MIN)-1);
|
|
$datum_res_lektor_ende=$o_datum->mktime_fromdate(RES_TAGE_LEKTOR_BIS); //jump_day($datum_now,RES_TAGE_LEKTOR_MAX);
|
|
if (!date("w",$this->datum))
|
|
$this->datum=jump_day($this->datum,1);
|
|
$datum=$datum_mon=$this->datum;
|
|
for ($i=1; $i<=TAGE_PRO_WOCHE; $i++)
|
|
{
|
|
//echo '<tr><td>'.strftime("%A",$datum).'<br>'.strftime("%e. %b %Y",$datum).'<br></td>'.$this->crlf; //.strftime("%A %d %B %Y",$this->datum)
|
|
echo '<tr><td>'.$tagbez[$spracheLoad->index][$i].'<br>'.strftime("%e. %b %Y",$datum).'<br></td>'.$this->crlf; //.strftime("%A %d %B %Y",$this->datum)
|
|
for ($k=0; $k<$num_rows_stunde; $k++)
|
|
{
|
|
$row = $this->db_fetch_object($result_stunde, $k);
|
|
$j = $row->stunde;
|
|
// Stunde aufbereiten
|
|
if (isset($this->std_plan[$i][$j][0]->lehrfach))
|
|
{
|
|
// Daten aufbereiten
|
|
$kollision=-1;
|
|
if (isset($unr))
|
|
unset($unr);
|
|
if (isset($lektor))
|
|
unset($lektor);
|
|
if (isset($lehrverband))
|
|
unset($lehrverband);
|
|
if (isset($lehrfach))
|
|
unset($lehrfach);
|
|
$reservierung=false;
|
|
foreach ($this->std_plan[$i][$j] as $lehrstunde)
|
|
{
|
|
|
|
$unr[]=$lehrstunde->unr;
|
|
// Lektoren
|
|
$lektor[]=$lehrstunde->lektor;
|
|
// Lehrverband
|
|
$lvb=$lehrstunde->stg.'-'.$lehrstunde->sem;
|
|
$stg = $lehrstunde->stg_kz;
|
|
if ($lehrstunde->ver!=null && $lehrstunde->ver!='0' && $lehrstunde->ver!='')
|
|
{
|
|
$lvb.=$lehrstunde->ver;
|
|
if ($lehrstunde->grp!=null && $lehrstunde->grp!='0' && $lehrstunde->grp!='')
|
|
$lvb.=$lehrstunde->grp;
|
|
}
|
|
if (count($lehrstunde->gruppe_kurzbz)>0)
|
|
$lvb=$lehrstunde->gruppe_kurzbz;
|
|
$lehrverband[]=$lvb;
|
|
// Lehrfach
|
|
$lf=$lehrstunde->lehrfach;
|
|
if (isset($lehrstunde->lehrform))
|
|
$lf.='-'.$lehrstunde->lehrform;
|
|
$lehrfach[]=$lf;
|
|
$titel=$lehrstunde->titel;
|
|
$anmerkung=$lehrstunde->anmerkung;
|
|
if (!$reservierung)
|
|
$reservierung=$lehrstunde->reservierung;
|
|
}
|
|
|
|
// Unterrichtsnummer (Kollision?)
|
|
$unr=array_unique($unr);
|
|
$kollision+=count($unr);
|
|
|
|
// Lektoren
|
|
if ($this->type!='lektor')
|
|
{
|
|
$lektor=array_unique($lektor);
|
|
sort($lektor);
|
|
$lkt='';
|
|
foreach ($lektor as $l)
|
|
$lkt.=$l.'<BR />';
|
|
}
|
|
else
|
|
$lkt=$lektor[0].'<BR />';
|
|
//echo $lkt;
|
|
|
|
// Lehrverband
|
|
if ($this->type!='verband')
|
|
{
|
|
$lehrverband=array_unique($lehrverband);
|
|
sort($lehrverband);
|
|
$lvb='';
|
|
foreach ($lehrverband as $l)
|
|
$lvb.=$l.'<BR />';
|
|
}
|
|
else
|
|
$lvb=$lehrverband[0].'<BR />';
|
|
|
|
// Lehrfach
|
|
if ($this->type=='verband')
|
|
{
|
|
$lehrfach=array_unique($lehrfach);
|
|
sort($lehrfach);
|
|
$lf='';
|
|
foreach ($lehrfach as $l)
|
|
$lf.=$l.'<BR />';
|
|
}
|
|
else
|
|
$lf=$lehrfach[0].'<BR />';
|
|
|
|
// Blinken oder nicht ?
|
|
if ($kollision)
|
|
{
|
|
$blink_ein='<blink>'.$kollision;
|
|
$blink_aus='</blink>';
|
|
}
|
|
else
|
|
{
|
|
$blink_ein='';
|
|
$blink_aus='';
|
|
}
|
|
|
|
// Ausgabe einer Stunde im Raster (HTML)
|
|
echo ' <td nowrap ';
|
|
if (isset($this->std_plan[$i][$j][0]->farbe))
|
|
echo 'style="background-color: #'.$this->std_plan[$i][$j][0]->farbe.';"';
|
|
echo '>'.$blink_ein.'<DIV align="center">';
|
|
// Link zu Details setzten
|
|
echo '<A class="stpl_detail" onClick="window.open(';
|
|
echo "'stpl_detail.php";
|
|
echo '?type='.$this->type.'&datum='.date("Y-m-d",$datum).'&stunde='.$j;
|
|
echo '&pers_uid='.$this->pers_uid;
|
|
echo '&stg_kz='.$this->stg_kz;
|
|
echo '&sem='.$this->sem;
|
|
echo '&ver='.$this->ver;
|
|
echo '&grp='.$this->grp;
|
|
echo '&ort_kurzbz='.$this->std_plan[$i][$j][0]->ort; //.'">'
|
|
echo "','Details', 'height=320,width=550,left=0,top=0,hotkeys=0,resizable=yes,status=no,scrollbars=no,toolbar=no,location=no,menubar=no,dependent=yes');";
|
|
echo '" title="'.$titel.'" ';
|
|
echo ' href="#">';
|
|
|
|
// Ausgabe
|
|
//echo $lf;
|
|
echo mb_substr($lf, 0,-strlen('<BR />'));
|
|
|
|
if($titel!='' && !$reservierung)
|
|
{
|
|
echo '<img src="../../../skin/images/sticky.png" tooltip="'.$titel.'"/>';
|
|
}
|
|
echo '<BR />';
|
|
if ($this->type=='ort' || $this->type=='lektor')
|
|
echo $lvb;
|
|
if ($this->type!='lektor')
|
|
echo $lkt;
|
|
if ($this->type!='ort')
|
|
echo $this->std_plan[$i][$j][0]->ort;
|
|
echo '</A></DIV>'.$blink_aus.'</td>'.$this->crlf;
|
|
}
|
|
else
|
|
{
|
|
echo ' <td align="center"><br>';
|
|
$datum_res_lektor_start_m = date('Y-m-d', $datum_res_lektor_start);
|
|
$datum_res_lektor_ende_m = date('Y-m-d', $datum_res_lektor_ende);
|
|
$datum_m = date('Y-m-d',$datum);
|
|
if ($raumres && $this->type=='ort' && ($datum_m>=$datum_res_lektor_start_m && $datum_m<=$datum_res_lektor_ende_m))
|
|
echo '<INPUT type="checkbox" name="reserve'.$i.'_'.$j.'" value="'.date("Y-m-d",$datum).'">'; //&& $datum>=$datum_now
|
|
echo '</td>'.$this->crlf;
|
|
}
|
|
}
|
|
echo ' </tr>'.$this->crlf;
|
|
$datum=jump_day($datum, 1);
|
|
}
|
|
echo ' </tbody></table>'.$this->crlf;
|
|
if ($raumres && $this->type=='ort' && ($datum>=$datum_now && $datum>=$datum_res_lektor_start && $datum_mon<=$datum_res_lektor_ende))
|
|
{
|
|
echo '<table><tr>';
|
|
echo ' <td>'.$p->t('global/titel').':</td><td><input onchange="if (this.value.length>0 && document.getElementById(\'beschreibung\').value.length<1) {document.getElementById(\'beschreibung\').value=document.getElementById(\'titel\').value;document.getElementById(\'beschreibung\').focus();};" type="text" id="titel" name="titel" size="10" maxlength="10" value="" /></td> '.$this->crlf;
|
|
echo ' <td>'.$p->t('global/beschreibung').':</td><td colspan="6"> <input onchange="if (this.value.length<1 && document.getElementById(\'titel\').value.length>0) {alert(\'Achtung! Speichern nur mit Beschreibung moeglich!\');this.focus();};" type="text" id="beschreibung" name="beschreibung" size="20" maxlength="32" value="" /> </td>'.$this->crlf;
|
|
|
|
$rechte = new benutzerberechtigung();
|
|
$rechte->getBerechtigungen($user_uid);
|
|
|
|
//Pruefen ob die erweiterte Reservierungsrechte vorhanden sind
|
|
if($rechte->isBerechtigt('lehre/reservierung', null, 'sui'))
|
|
{
|
|
//Lektor
|
|
echo '<td>Lektor</td>
|
|
<td><SELECT name="user_uid">'.$this->crlf;
|
|
|
|
$qry = "SELECT uid, kurzbz FROM public.tbl_mitarbeiter JOIN public.tbl_benutzer ON(uid=mitarbeiter_uid)
|
|
WHERE aktiv=true
|
|
ORDER BY kurzbz, uid";
|
|
|
|
if($result = $this->db_query($qry))
|
|
{
|
|
while($row = $this->db_fetch_object($result))
|
|
{
|
|
if($row->uid==$user_uid)
|
|
$selected='selected="selected"';
|
|
else
|
|
$selected='';
|
|
|
|
echo '<OPTION value="'.$row->uid.'" '.$selected.'>'.$row->kurzbz.'</OPTION>'.$this->crlf;
|
|
}
|
|
}
|
|
|
|
echo '</SELECT></td>'.$this->crlf;
|
|
echo '</tr><tr>'.$this->crlf;
|
|
|
|
//Studiengaenge Laden fuer die eine erweiterte Reservierungsberechtigung vorhanden ist
|
|
$stg = new studiengang();
|
|
$stg->loadArray($rechte->getStgKz('lehre/reservierung'),'typ, kurzbz',true);
|
|
|
|
//Studiengang
|
|
echo '<td>'.$p->t('global/studiengang').'</td><td> <SELECT name="studiengang_kz">'.$this->crlf;
|
|
echo '<OPTION value="0">*</OPTION>'.$this->crlf;
|
|
foreach($stg->result as $row)
|
|
{
|
|
echo '<OPTION value="'.$row->studiengang_kz.'">'.$row->kuerzel.' ('.$row->kurzbzlang.')</OPTION>'.$this->crlf;
|
|
}
|
|
echo '</SELECT></td>';
|
|
|
|
//Semester
|
|
echo '<td>'.$p->t('global/semester').' </td>
|
|
<td>
|
|
<SELECT name="semester" />
|
|
<OPTION value="">*</OPTION>
|
|
<OPTION value="1">1</OPTION>
|
|
<OPTION value="2">2</OPTION>
|
|
<OPTION value="3">3</OPTION>
|
|
<OPTION value="4">4</OPTION>
|
|
<OPTION value="5">5</OPTION>
|
|
<OPTION value="6">6</OPTION>
|
|
<OPTION value="7">7</OPTION>
|
|
<OPTION value="8">8</OPTION>
|
|
</SELECT>
|
|
<td>
|
|
'.$this->crlf;
|
|
|
|
//Verband
|
|
echo '<td>'.$p->t('global/verband').'</td>
|
|
<td>
|
|
<SELECT name="verband" />
|
|
<OPTION value="">*</OPTION>
|
|
<OPTION value="A">A</OPTION>
|
|
<OPTION value="B">B</OPTION>
|
|
<OPTION value="C">C</OPTION>
|
|
<OPTION value="D">D</OPTION>
|
|
<OPTION value="F">F</OPTION>
|
|
<OPTION value="V">V</OPTION>
|
|
</SELECT>
|
|
</td>'.$this->crlf;
|
|
|
|
//Gruppe
|
|
echo '<td>'.$p->t('global/gruppe').'</td>
|
|
<td>
|
|
<SELECT name="gruppe" />
|
|
<OPTION value="">*</OPTION>
|
|
<OPTION value="1">1</OPTION>
|
|
<OPTION value="2">2</OPTION>
|
|
<OPTION value="3">3</OPTION>
|
|
<OPTION value="4">4</OPTION>
|
|
</SELECT>
|
|
</td>'.$this->crlf;
|
|
|
|
//Spezialgruppe
|
|
echo '<td>'.$p->t('lvplan/spezialgruppe').'</td><td><SELECT name="gruppe_kurzbz">'.$this->crlf;
|
|
echo '<OPTION value="">*</OPTION>'.$this->crlf;
|
|
|
|
//Spezialgruppen aus den Studiengaengen mit erweiterten Reservierungsberechtigung holen
|
|
$stgs = $rechte->getStgKz('lehre/reservierung');
|
|
$in='';
|
|
foreach($stgs as $stg)
|
|
{
|
|
$in .= "'".addslashes($stg)."',";
|
|
}
|
|
$in = substr($in, 0, -1);
|
|
$qry = "SELECT * FROM public.tbl_gruppe WHERE studiengang_kz in($in) AND lehre=true AND sichtbar=true ORDER BY gruppe_kurzbz";
|
|
if($result = $this->db_query($qry))
|
|
{
|
|
while($row = $this->db_fetch_object($result))
|
|
{
|
|
echo '<OPTION value="'.$row->gruppe_kurzbz.'">'.$row->gruppe_kurzbz.'</OPTION>'.$this->crlf;
|
|
}
|
|
}
|
|
echo '</SELECT></td>'.$this->crlf;
|
|
|
|
}
|
|
else
|
|
{
|
|
echo ' <input type="hidden" name="user_uid" value="'.$this->user_uid.'" />'.$this->crlf;
|
|
}
|
|
|
|
echo '<td>';
|
|
echo ' <input type="submit" name="reserve" value="Reservieren" />'.$this->crlf;
|
|
echo ' <input type="hidden" name="ort_kurzbz" value="'.$this->ort_kurzbz.'" />'.$this->crlf;
|
|
echo ' <input type="hidden" name="datum" value="'.$this->datum.'" />'.$this->crlf;
|
|
echo ' <input type="hidden" name="type" value="'.$this->type.'" />'.$this->crlf;
|
|
echo '</td>';
|
|
|
|
echo '</tr></table></form>';
|
|
echo ' <a href="/cis/private/lvplan/stpl_reserve_list.php">'.$p->t('lvplan/reservierungenLoeschen').' </a>';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Funktion draw_week_xul Stundenplan im XUL-Format
|
|
*
|
|
* @param datum Datum eines Tages in der angeforderten Woche
|
|
* @return true oder false
|
|
*/
|
|
public function draw_week_xul($semesterplan, $uid, $wunsch=null, $ignore_kollision=false, $kollision_student=false, $max_kollision=0)
|
|
{
|
|
//echo $wunsch;
|
|
global $cfgStdBgcolor;
|
|
$count=0;
|
|
$berechtigung=new benutzerberechtigung();
|
|
$berechtigung->getBerechtigungen($uid);
|
|
// Stundentafel abfragen
|
|
$sql_query="SELECT * FROM lehre.tbl_stunde ORDER BY stunde";
|
|
if(!$this->db_query($sql_query))
|
|
$this->errormsg=$this->db_last_error();
|
|
$result_stunde = $this->db_result;
|
|
$num_rows_stunde=$this->db_num_rows($result_stunde);
|
|
|
|
// Kontext Menue
|
|
echo '<popupset>
|
|
<popup id="stplPopupMenue">
|
|
<menuitem label="Raumvorschlag" oncommand="StplSearchRoom(document.popupNode);" />
|
|
<menuitem label="Entfernen" oncommand="TimeTableWeekMarkiere(document.popupNode);TimetableDeleteEntries()" />
|
|
</popup>
|
|
</popupset>';
|
|
|
|
//Tabelle zeichnen
|
|
echo '<grid flex="1">';
|
|
echo '<columns>';
|
|
echo ' <column style="background-color:lightblue; border:1px solid black" />';
|
|
for ($i=0;$i<$num_rows_stunde; $i++)
|
|
echo ' <column />';
|
|
echo '</columns>';
|
|
echo '<rows>';
|
|
|
|
// Kopfzeile darstellen
|
|
echo '<row style="background-color:lightgreen; border:1px solid black">'.$this->crlf;
|
|
echo '<vbox>
|
|
<label align="center">Stunde</label>
|
|
<label id="TimeTableWeekData" class="kalenderwoche"
|
|
datum="'.$this->datum.'"
|
|
stpl_type="'.$this->type.'"
|
|
stg_kz="'.$this->stg_kz.'"
|
|
sem="'.$this->sem.'"
|
|
ver="'.$this->ver.'"
|
|
grp="'.$this->grp.'"
|
|
gruppe="'.$this->gruppe_kurzbz.'"
|
|
ort="'.$this->ort_kurzbz.'"
|
|
pers_uid="'.$this->pers_uid.'"
|
|
kw="'.$this->kalenderwoche.'"
|
|
align="left">KW:'.$this->kalenderwoche.'</label>
|
|
</vbox>'.$this->crlf; //<html:br />Beginn<html:br />Ende
|
|
for ($i=0;$i<$num_rows_stunde; $i++)
|
|
{
|
|
$row=$this->db_fetch_object($result_stunde,$i);
|
|
$beginn=mb_substr($row->beginn,0,5);
|
|
$ende=mb_substr($row->ende,0,5);
|
|
$stunde=$row->stunde;
|
|
echo '<vbox><label align="center">'.$stunde.'<html:br />
|
|
<html:small>'.$beginn.'<html:br />
|
|
'.$ende.'</html:small></label>
|
|
</vbox>'.$this->crlf;
|
|
}
|
|
echo '</row>';
|
|
|
|
// Von Montag bis Samstag
|
|
if (!date("w",$this->datum))
|
|
$this->datum=jump_day($this->datum,1);
|
|
$datum=$this->datum;
|
|
|
|
// Ferien holen
|
|
$ferien=new ferien();
|
|
if ($this->type=='verband')
|
|
$ferien->getAll($this->stg_kz);
|
|
else
|
|
$ferien->getAll();
|
|
for ($i=1; $i<=TAGE_PRO_WOCHE; $i++)
|
|
{
|
|
$isferien=$ferien->isferien($datum);
|
|
echo '<row><vbox>';
|
|
echo '<html:div><html:small>'.date("l",$datum).'<html:br /></html:small>'.date("j.m. y",$datum).'</html:div>';
|
|
echo '</vbox>';
|
|
for ($k=0; $k<$num_rows_stunde; $k++)
|
|
{
|
|
$tooltip='';
|
|
$row = $this->db_fetch_object($result_stunde, $k);
|
|
$j=$row->stunde;
|
|
if (isset($wunsch[$i][$j]))
|
|
{
|
|
$index=$wunsch[$i][$j];
|
|
if($index==-3)
|
|
{
|
|
//Wenn eine Zeitsperre eingetragen ist, dann diese im Tooltiptext anzeigen
|
|
$zeitsperre = new zeitsperre();
|
|
$zeitsperre->getSperreByDate($this->pers_uid, date('Y-m-d',$datum), $j);
|
|
foreach($zeitsperre->result as $sperren)
|
|
{
|
|
if($tooltip!='')
|
|
$tooltip.=', ';
|
|
$tooltip.=$sperren->zeitsperretyp_kurzbz.' - '.$sperren->bezeichnung;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
$index=1;
|
|
if ($index=='')
|
|
$index=1;
|
|
$bgcolor=$cfgStdBgcolor[$index+3];
|
|
if ($isferien)
|
|
{
|
|
$bgcolor='#FFFF55';
|
|
|
|
//Wenn Ferien eingetragen sind, dann die Bezeichnung im Tooltiptext anzeigen
|
|
foreach($ferien->getFerien($datum) as $bezeichnung)
|
|
{
|
|
if($tooltip!='')
|
|
$tooltip.=', ';
|
|
$tooltip .= $bezeichnung;
|
|
}
|
|
}
|
|
echo '<vbox style="border:1px solid black; background-color:'.$bgcolor.'"';
|
|
if($tooltip!='')
|
|
{
|
|
echo ' tooltiptext="'.str_replace('"','"',$tooltip).'"';
|
|
}
|
|
echo '
|
|
ondragdrop="nsDragAndDrop.drop(event,boardObserver)"
|
|
ondragover="nsDragAndDrop.dragOver(event,boardObserver)"
|
|
ondragenter="nsDragAndDrop.dragEnter(event,boardObserver)"
|
|
ondragexit="nsDragAndDrop.dragExit(event,boardObserver)"
|
|
datum="'.date("Y-m-d",$datum).'" stunde="'.$j.'"
|
|
stg_kz="'.$this->stg_kz.'" sem="'.$this->sem.'" ver="'.$this->ver.'"
|
|
grp="'.$this->grp.'" gruppe="'.$this->gruppe_kurzbz.'"
|
|
pers_uid="'.$this->pers_uid.'" stpltype="'.$this->type.'">';
|
|
|
|
if (isset($this->std_plan[$i][$j][0]->lehrfach))
|
|
{
|
|
// Daten aufbereiten
|
|
if (isset($lvb))
|
|
unset($lvb);
|
|
//$lvb=array();
|
|
$kollision=-1;
|
|
if (isset($a_unr))
|
|
unset($a_unr);
|
|
foreach ($this->std_plan[$i][$j] as $lehrstunde)
|
|
{
|
|
$a_unr[]=$lehrstunde->unr;
|
|
$a_lvb[$lehrstunde->unr][]=$lehrstunde->sem.$lehrstunde->ver.$lehrstunde->grp;
|
|
}
|
|
|
|
// Unterrichtsnummer (Kollision?)
|
|
$a_unr=array_unique($a_unr);
|
|
$kollision+=count($a_unr);
|
|
//Kollisionspruefung Studentenebene
|
|
if($kollision_student=='true')
|
|
{
|
|
$kollision=0;
|
|
$studiensemester = getStudiensemesterFromDatum(date('Y-m-d',$datum));
|
|
|
|
$qry = "SELECT datum, stunde, student_uid, count(student_uid) AS anzahl
|
|
FROM (
|
|
SELECT sub_stpl_uid.unr, sub_stpl_uid.datum, sub_stpl_uid.stunde, sub_stpl_uid.student_uid
|
|
FROM ( SELECT stpl.unr, stpl.datum, stpl.stunde, tbl_benutzergruppe.uid AS student_uid
|
|
FROM lehre.tbl_stundenplandev stpl
|
|
JOIN public.tbl_benutzergruppe USING (gruppe_kurzbz)
|
|
WHERE tbl_benutzergruppe.studiensemester_kurzbz::text = '".$studiensemester."'
|
|
GROUP BY stpl.unr, stpl.datum, stpl.stunde, tbl_benutzergruppe.uid
|
|
UNION
|
|
SELECT stpl.unr, stpl.datum, stpl.stunde, tbl_studentlehrverband.student_uid
|
|
FROM lehre.tbl_stundenplandev stpl
|
|
JOIN public.tbl_studentlehrverband ON stpl.gruppe_kurzbz IS NULL AND stpl.studiengang_kz = tbl_studentlehrverband.studiengang_kz AND stpl.semester = tbl_studentlehrverband.semester AND (stpl.verband = tbl_studentlehrverband.verband OR stpl.verband = ' '::bpchar AND stpl.verband <> tbl_studentlehrverband.verband) AND (stpl.gruppe = tbl_studentlehrverband.gruppe OR stpl.gruppe = ' '::bpchar AND stpl.gruppe <> tbl_studentlehrverband.gruppe)
|
|
WHERE tbl_studentlehrverband.studiensemester_kurzbz::text = '".$studiensemester."'
|
|
GROUP BY stpl.unr, stpl.datum, stpl.stunde, tbl_studentlehrverband.student_uid) sub_stpl_uid
|
|
GROUP BY sub_stpl_uid.unr, sub_stpl_uid.datum, sub_stpl_uid.stunde, sub_stpl_uid.student_uid
|
|
|
|
) as a
|
|
WHERE datum='".date('Y-m-d',$datum)."' AND stunde='$j'
|
|
GROUP BY datum, stunde, student_uid
|
|
HAVING count(student_uid)>1
|
|
ORDER BY datum, stunde, student_uid LIMIT 1;
|
|
";
|
|
|
|
if($this->db_query($qry))
|
|
if($this->db_num_rows()>0)
|
|
$kollision++;
|
|
}
|
|
else
|
|
{
|
|
|
|
//Kollisionspruefung LVB Ebene
|
|
// Ist es bei LVB-Ansicht wirklich eine Kollision?
|
|
if ($kollision>0 && $this->type=='verband')
|
|
{
|
|
$kollision=0;
|
|
$a=0;
|
|
foreach ($a_unr as $unr)
|
|
{
|
|
array_unique($a_lvb[$unr]);
|
|
$lvb[$a++]=$a_lvb[$unr];
|
|
}
|
|
|
|
for ($a=0;$a<count($lvb)-1;$a++)
|
|
for ($b=0;$b<count($lvb[$a]);$b++)
|
|
for ($c=$a+1;$c<count($lvb);$c++)
|
|
for ($d=0;$d<count($lvb[$c]);$d++)
|
|
{
|
|
$s1=mb_substr($lvb[$a][$b],0,1);
|
|
$s2=mb_substr($lvb[$c][$d],0,1);
|
|
$v1=trim(mb_substr($lvb[$a][$b],1,1));
|
|
$v2=trim(mb_substr($lvb[$c][$d],1,1));
|
|
$g1=trim(mb_substr($lvb[$a][$b],2,1));
|
|
$g2=trim(mb_substr($lvb[$c][$d],2,1));
|
|
if ($s1==$s2 || !$s1 || $s1=='' || $s1=='0' || !$s2 || $s2=='' || $s2=='0')
|
|
if ($v1==$v2 || !$v1 || $v1=='' || $v1=='0' || !$v2 || $v2=='' || $v2=='0')
|
|
if ($g1==$g2 || !$g1 || $g1=='' || $g1=='0' || !$g2 || $g2=='' || $g2=='0')
|
|
$kollision++;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Kollision anzeigen?
|
|
if ($ignore_kollision)
|
|
$kollision=0;
|
|
//Daten aufbereiten
|
|
foreach ($a_unr as $unr)
|
|
{
|
|
// Daten vorbereiten
|
|
if (isset($lektor))
|
|
unset($lektor);
|
|
if (isset($lehrverband))
|
|
unset($lehrverband);
|
|
if (isset($lehrfach))
|
|
unset($lehrfach);
|
|
if (isset($ort))
|
|
unset($ort);
|
|
if (isset($updateamum))
|
|
unset($updateamum);
|
|
if (isset($updatevon))
|
|
unset($updatevon);
|
|
$paramList='';
|
|
$z=0;
|
|
$reservierung=false;
|
|
foreach ($this->std_plan[$i][$j] as $lehrstunde)
|
|
{
|
|
if ($lehrstunde->unr==$unr)
|
|
{
|
|
// Lektoren
|
|
$lektor[]=$lehrstunde->lektor;
|
|
// Lehrverband
|
|
$lvb=$lehrstunde->stg.'-'.$lehrstunde->sem;
|
|
if ($lehrstunde->ver!=null && $lehrstunde->ver!='0' && $lehrstunde->ver!='')
|
|
{
|
|
$lvb.=$lehrstunde->ver;
|
|
if ($lehrstunde->grp!=null && $lehrstunde->grp!='0' && $lehrstunde->grp!='')
|
|
$lvb.=$lehrstunde->grp;
|
|
}
|
|
if (count($lehrstunde->gruppe_kurzbz)>0)
|
|
$lvb=$lehrstunde->gruppe_kurzbz;
|
|
$lehrverband[]=$lvb;
|
|
// Lehrfach
|
|
$lf=htmlspecialchars($lehrstunde->lehrfach);
|
|
if (isset($lehrstunde->lehrform))
|
|
$lf.='-'.$lehrstunde->lehrform;
|
|
$lehrfach[]=$lf;
|
|
$ort[]=$lehrstunde->ort;
|
|
$stg_kz=$lehrstunde->stg_kz;
|
|
$updateamum[]=mb_substr($lehrstunde->updateamum,0,16);
|
|
$updatevon[]=$lehrstunde->updatevon;
|
|
if ($lehrstunde->reservierung)
|
|
{
|
|
$paramList.='&reservierung_id'.$z++.'='.$lehrstunde->stundenplan_id;
|
|
$reservierung=true;
|
|
}
|
|
else
|
|
$paramList.='&stundenplan_id'.$z++.'='.$lehrstunde->stundenplan_id;
|
|
if(isset($lehrstunde->farbe))
|
|
$farbe=$lehrstunde->farbe;
|
|
$titel=htmlspecialchars($lehrstunde->titel);
|
|
$anmerkung=htmlspecialchars($lehrstunde->anmerkung);
|
|
}
|
|
}
|
|
// Lektoren
|
|
//if ($this->type!='lektor')
|
|
$lektor=array_unique($lektor);
|
|
sort($lektor);
|
|
$lkt='';
|
|
foreach ($lektor as $l)
|
|
$lkt.=$l.'<html:br />';
|
|
|
|
// Lehrverband
|
|
//if ($this->type!='verband')
|
|
$lehrverband=array_unique($lehrverband);
|
|
sort($lehrverband);
|
|
$lvb='';
|
|
foreach ($lehrverband as $l)
|
|
$lvb.=$l.'<html:br />';
|
|
|
|
// Lehrfach
|
|
//if ($this->type=='verband')
|
|
$lehrfach=array_unique($lehrfach);
|
|
sort($lehrfach);
|
|
$lf='';
|
|
foreach ($lehrfach as $l)
|
|
$lf.=$l.'<html:br />';
|
|
|
|
// Ort
|
|
//if ($this->type=='verband')
|
|
$ort=array_unique($ort);
|
|
sort($ort);
|
|
$orte='';
|
|
foreach ($ort as $o)
|
|
$orte.=$o.'<html:br />';
|
|
|
|
// Update Von
|
|
$updatevon=array_unique($updatevon);
|
|
sort($updatevon);
|
|
$updatevonam='Geaendert von ';
|
|
foreach ($updatevon as $u)
|
|
$updatevonam.=$u.', ';
|
|
|
|
// Update Am
|
|
$updateamum=array_unique($updateamum);
|
|
sort($updateamum);
|
|
$updatevonam.='am ';
|
|
foreach ($updateamum as $u)
|
|
$updatevonam.=$u.' ';
|
|
|
|
// Blinken oder nicht ?
|
|
if ($kollision)
|
|
{
|
|
$blink_ein='<html:blink>';// .$kollision;
|
|
$blink_aus='</html:blink>';
|
|
}
|
|
else
|
|
{
|
|
$blink_ein='';
|
|
$blink_aus='';
|
|
}
|
|
|
|
$stg_obj = new studiengang();
|
|
$stg_obj->load($stg_kz);
|
|
|
|
// Ausgabe
|
|
echo '<button id="buttonSTPL'.$count.'"
|
|
tooltiptext="('.$updatevonam.') '.$titel.' - '.$anmerkung.'"
|
|
style="border:1px solid transparent;'.((isset($farbe) && $farbe!='')?'background-color:#'.$farbe:'').';"
|
|
styleOrig="border:1px solid transparent;'.((isset($farbe) && $farbe!='')?'background-color:#'.$farbe:'').';" ';
|
|
if ($berechtigung->isBerechtigt('lehre/lvplan',$stg_obj->oe_kurzbz,'uid'))
|
|
echo ' context="stplPopupMenue" ';
|
|
if ($berechtigung->isBerechtigt('lehre/lvplan',$stg_obj->oe_kurzbz,'u'))
|
|
echo 'ondraggesture="nsDragAndDrop.startDrag(event,listObserver)" ';
|
|
//onclick="return onStplSearchRoom(event, event.target);"
|
|
echo 'ondragdrop="nsDragAndDrop.drop(event,boardObserver)"
|
|
ondragover="nsDragAndDrop.dragOver(event,boardObserver)"
|
|
oncommand="TimeTableWeekClick(event)"
|
|
ondblclick="TimeTableWeekDblClick(event)"
|
|
aktion="stpl"
|
|
unr="'.$unr.'"
|
|
markiert="false"
|
|
elem="stundenplan'.$i.$j.'"
|
|
idList="'.$paramList.'" stpltype="'.$this->type.'"
|
|
stg_kz="'.$this->stg_kz.'" sem="'.$this->sem.'" ver="'.$this->ver.'"
|
|
grp="'.$this->grp.'" gruppe="'.$this->gruppe_kurzbz.'"
|
|
datum="'.date("Y-m-d",$datum).'" stunde="'.$j.'" wochentag="'.$i.'"
|
|
pers_uid="'.$this->pers_uid.'" ort_kurzbz="'.$this->ort_kurzbz.'">';
|
|
|
|
echo '<label align="center">'.$blink_ein;
|
|
$count++;
|
|
//echo $lf;
|
|
echo mb_substr($lf, 0,-strlen('<html:br />'));
|
|
if($titel!='' && !$reservierung)
|
|
{
|
|
echo '<image src="../../skin/images/sticky.png" tooltip="'.$titel.'"/>';
|
|
}
|
|
echo '<html:br />';
|
|
echo $lvb;
|
|
if ($this->type!='lektor')
|
|
echo $lkt;
|
|
if ($this->type!='ort')
|
|
echo $orte;
|
|
echo $blink_aus;
|
|
|
|
echo '</label>';
|
|
echo '</button>';
|
|
}
|
|
}
|
|
if (isset($this->std_plan[$i][$j][0]->frei_orte))
|
|
{
|
|
//orte sortieren => AnzahlKollisionen ASC, Ort_kurzbz ASC
|
|
$keys=array();
|
|
$values=array();
|
|
foreach ($this->std_plan[$i][$j][0]->frei_orte as $key=>$value)
|
|
{
|
|
$keys[]=$key;
|
|
$values[]=$value;
|
|
}
|
|
array_multisort($values, SORT_ASC, $keys, SORT_ASC, $this->std_plan[$i][$j][0]->frei_orte);
|
|
|
|
foreach ($this->std_plan[$i][$j][0]->frei_orte as $f_ort=>$anzahl)
|
|
{
|
|
if($anzahl<=$max_kollision)
|
|
{
|
|
echo '<label value="'.$f_ort.($anzahl>0?'('.$anzahl.')':'').'"
|
|
styleOrig=""
|
|
ondragenter="nsDragAndDrop.dragEnter(event,boardObserver)"
|
|
ondragexit="nsDragAndDrop.dragExit(event,boardObserver)"
|
|
ondragdrop="nsDragAndDrop.drop(event,boardObserver)"
|
|
datum="'.date("Y-m-d",$datum).'" stunde="'.$j.'"
|
|
stg_kz="'.$this->stg_kz.'" sem="'.$this->sem.'" ver="'.$this->ver.'"
|
|
grp="'.$this->grp.'" gruppe="'.$this->gruppe_kurzbz.'"
|
|
stpltype="'.$this->type.'" ort_kurzbz="'.$f_ort.'" kollision="'.$anzahl.'"
|
|
'.($anzahl>0?'tooltiptext="'.$anzahl.' Kollision(en)"':'').'
|
|
/>';
|
|
}
|
|
}
|
|
}
|
|
echo '</vbox>'.$this->crlf;
|
|
}
|
|
echo "</row>";
|
|
$datum=jump_day($datum, 1);
|
|
}
|
|
|
|
// Fuszzeile darstellen
|
|
if (!$semesterplan)
|
|
{
|
|
echo '<row style="background-color:lightgreen; border:1px solid black">'.$this->crlf;
|
|
echo '<vbox>
|
|
<label align="center">Stunde</label>
|
|
<label align="left" class="kalenderwoche">KW:'.$this->kalenderwoche.'</label>
|
|
</vbox>'.$this->crlf; //<html:br />Beginn<html:br />Ende
|
|
for ($i=0;$i<$num_rows_stunde; $i++)
|
|
{
|
|
$row=$this->db_fetch_object($result_stunde,$i);
|
|
$beginn=mb_substr($row->beginn,0,5);
|
|
$ende=mb_substr($row->ende,0,5);
|
|
$stunde=$row->stunde;
|
|
echo '<vbox><label align="center">'.$stunde.'<html:br />
|
|
<html:small>'.$beginn.'<html:br />
|
|
'.$ende.'</html:small></label>
|
|
</vbox>'.$this->crlf;
|
|
}
|
|
echo '</row>';
|
|
}
|
|
echo '</rows>';
|
|
echo '</grid>';
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* Funktion load_stpl_search sucht Vorschlag fuer Stundenverschiebung
|
|
*
|
|
* @param datum der Aktuellen Woche
|
|
* @param stpl_id Array der stundenplan_id's
|
|
* @param db_stpl_table Name der DB-Tabelle
|
|
* @return true oder false
|
|
*/
|
|
public function load_stpl_search($datum,$stpl_id,$db_stpl_table, $block=1)
|
|
{
|
|
// Initatialisierung der Variablen
|
|
$lehrverband=array();
|
|
// Name der View
|
|
$stpl_view='lehre.'.VIEW_BEGIN.$db_stpl_table;
|
|
$stpl_view_id=$db_stpl_table.TABLE_ID;
|
|
//Kalenderdaten setzen
|
|
$this->datum=montag($datum);
|
|
$this->datum_begin=$this->datum;
|
|
$this->datum_end=jump_week($this->datum_begin, 1);
|
|
// Formatieren fuer Datenbankabfragen
|
|
$this->datum_begin=date("Y-m-d",$this->datum_begin);
|
|
$this->datum_end=date("Y-m-d",$this->datum_end);
|
|
// Stundentafel abfragen
|
|
$sql_query='SELECT min(stunde),max(stunde)FROM lehre.tbl_stunde';
|
|
if(!$this->db_query($sql_query))
|
|
die($this->db_last_error());
|
|
$row = $this->db_fetch_object();
|
|
$min_stunde=$row->min;
|
|
$max_stunde=$row->max;
|
|
// Stundenplaneintraege holen
|
|
$sql_query="SELECT * FROM $stpl_view WHERE";
|
|
$stplids='';
|
|
foreach ($stpl_id as $id)
|
|
$stplids.=" OR $stpl_view_id=$id";
|
|
$stplids=mb_substr($stplids,3);
|
|
$sql_query.=$stplids;
|
|
//echo $sql_query;
|
|
if(!$this->db_query($sql_query))
|
|
die($this->db_last_error());
|
|
$num_rows_stpl=$this->db_num_rows();
|
|
// Daten aufbereiten
|
|
$leids='';
|
|
for ($i=0;$i<$num_rows_stpl;$i++)
|
|
{
|
|
$row=$this->db_fetch_object(null,$i);
|
|
//$block=$row->stundenblockung;
|
|
//$raumtyp[$i]=$row->raumtyp;
|
|
//$raumtypalt[$i]=$row->raumtypalternativ;
|
|
if ($row->gruppe_kurzbz!=null)
|
|
$gruppe[]=$row->gruppe_kurzbz;
|
|
else
|
|
$gruppe[]='';
|
|
$lehrverband[$i]->stg_kz=$row->studiengang_kz;
|
|
$lehrverband[$i]->sem=$row->semester;
|
|
$lehrverband[$i]->ver=$row->verband;
|
|
$lehrverband[$i]->grp=$row->gruppe;
|
|
$leids.="$row->lehreinheit_id,";
|
|
$lektor[$i]=$row->uid;
|
|
$unr=$row->unr;
|
|
}
|
|
if($leids!='')
|
|
{
|
|
// Raumtypen
|
|
$leids = mb_substr($leids, 0, mb_strlen($leids)-1);
|
|
$qry = "SELECT raumtyp, raumtypalternativ FROM lehre.tbl_lehreinheit WHERE lehreinheit_id IN ($leids)";
|
|
if($this->db_query($qry)){
|
|
while($row = $this->db_fetch_object())
|
|
{
|
|
$raumtyp[]=$row->raumtyp;
|
|
$raumtyp[]=$row->raumtypalternativ;
|
|
}
|
|
}
|
|
}
|
|
$raumtyp=array_unique($raumtyp);
|
|
$rtype='';
|
|
foreach ($raumtyp as $r)
|
|
$rtype.=" OR raumtyp_kurzbz='".addslashes($r)."'";
|
|
$rtype=mb_substr($rtype,3);
|
|
//Lektor
|
|
$lektor=array_unique($lektor);
|
|
$lkt='';
|
|
foreach ($lektor as $l)
|
|
$lkt.=" OR uid='".addslashes($l)."'";
|
|
$lkt=mb_substr($lkt,3);
|
|
// Einheiten
|
|
$gruppe=array_unique($gruppe);
|
|
$gruppen='';
|
|
foreach ($gruppe as $g)
|
|
if ($g!='')
|
|
$gruppen.=" OR gruppe_kurzbz='".addslashes($g)."'";
|
|
//$gruppen=mb_substr($gruppen,3);
|
|
//Lehrverband
|
|
//$lehrverband=array_unique($lehrverband);
|
|
$lvb='';
|
|
foreach ($lehrverband as $l)
|
|
{
|
|
$lvb.=" OR (studiengang_kz='".addslashes($l->stg_kz)."' AND semester='".addslashes($l->sem)."'";
|
|
if ($l->ver!='' && $l->ver!=' ' && $l->ver!=null)
|
|
{
|
|
$lvb.=" AND (verband='".addslashes($l->ver)."' OR verband IS NULL OR verband='')";
|
|
if ($l->grp!='' && $l->grp!=' ' && $l->grp!=null)
|
|
$lvb.=" AND (gruppe='".addslashes($l->grp)."' OR gruppe IS NULL OR gruppe='')";
|
|
}
|
|
//if ($gruppen=='')
|
|
// $lvb.=' AND gruppe_kurzbz IS NULL';
|
|
$lvb.=')';
|
|
}
|
|
$lvb=mb_substr($lvb,3);
|
|
//if($rtype=='')
|
|
// $rtype='1=1';
|
|
// Raeume die in Frage kommen, aufgrund der Raumtypen
|
|
$sql_query="SELECT DISTINCT ort_kurzbz, hierarchie FROM public.tbl_ort
|
|
JOIN public.tbl_ortraumtyp USING (ort_kurzbz) WHERE ($rtype) AND aktiv AND ort_kurzbz NOT LIKE '\\\\_%' ORDER BY hierarchie,ort_kurzbz";
|
|
|
|
if(!$this->db_query($sql_query))
|
|
die($this->db_last_error());
|
|
while($row = $this->db_fetch_object())
|
|
$orte[]=$row->ort_kurzbz;
|
|
|
|
// Raster vorbereiten
|
|
for ($t=1;$t<=TAGE_PRO_WOCHE;$t++)
|
|
{
|
|
for ($s=$min_stunde;$s<=$max_stunde;$s++)
|
|
{
|
|
$raster[$t][$s]->ort=array();
|
|
$raster[$t][$s]->kollision=false;
|
|
}
|
|
}
|
|
// Stundenplanabfrage bauen (Wo ist Kollision?)
|
|
$sql_query="SELECT DISTINCT datum, stunde FROM $stpl_view
|
|
WHERE datum>='".addslashes($this->datum_begin)."' AND datum<'".addslashes($this->datum_end)."' AND
|
|
($lkt $gruppen OR ($lvb) ) AND unr!='".addslashes($unr)."'";
|
|
//echo $sql_query;
|
|
if(!$this->db_query($sql_query))
|
|
die($this->db_last_error());
|
|
while($row = $this->db_fetch_object())
|
|
{
|
|
$mtag=mb_substr($row->datum, 8,2);
|
|
$month=mb_substr($row->datum, 5,2);
|
|
$jahr=mb_substr($row->datum, 0,4);
|
|
$tag=date("w",mktime(12,0,0,$month,$mtag,$jahr));
|
|
$raster[$tag][$row->stunde]->kollision=true;
|
|
}
|
|
|
|
// Stundenplanabfrage bauen (Wo ist besetzt?)
|
|
$sql_query="SELECT DISTINCT datum, stunde, ort_kurzbz FROM $stpl_view
|
|
WHERE datum>='".addslashes($this->datum_begin)."' AND datum<'".addslashes($this->datum_end)."' AND unr!='".addslashes($unr)."'";
|
|
//echo $sql_query; NATURAL JOIN tbl_ortraumtyp AND ($rtype) "
|
|
|
|
// Reservierungen beruecksichtigen
|
|
$sql_query.=" UNION SELECT DISTINCT datum, stunde, ort_kurzbz FROM campus.tbl_reservierung
|
|
WHERE datum>='".addslashes($this->datum_begin)."' AND datum<'".addslashes($this->datum_end)."' ";
|
|
|
|
if(!$this->db_query($sql_query))
|
|
die($this->db_last_error());
|
|
|
|
while($row = $this->db_fetch_object())
|
|
{
|
|
$mtag=mb_substr($row->datum, 8,2);
|
|
$month=mb_substr($row->datum, 5,2);
|
|
$jahr=mb_substr($row->datum, 0,4);
|
|
$tag=date("w",mktime(12,0,0,$month,$mtag,$jahr));
|
|
$raster[$tag][$row->stunde]->ort[]=$row->ort_kurzbz;
|
|
}
|
|
|
|
// freie Plaetze in den Stundenplan eintragen.
|
|
for ($t=1;$t<=TAGE_PRO_WOCHE;$t++)
|
|
{
|
|
for ($s=1;$s<=$max_stunde;$s++)
|
|
{
|
|
if (($s+$block)<=($max_stunde+1))
|
|
{
|
|
// Alle infrage kommenden Orte zuweisen
|
|
foreach($orte as $ort)
|
|
{
|
|
$this->std_plan[$t][$s][0]->frei_orte[$ort]=(isset($this->std_plan[$t][$s][0]->frei_orte[$ort])?$this->std_plan[$t][$s][0]->frei_orte[$ort]:0);
|
|
}
|
|
|
|
// Besetzte Raueme eintragen
|
|
foreach($raster[$t][$s]->ort as $ort)
|
|
{
|
|
if(in_array($ort, $orte))
|
|
$this->std_plan[$t][$s][0]->frei_orte[$ort]=(isset($this->std_plan[$t][$s][0]->frei_orte[$ort])?$this->std_plan[$t][$s][0]->frei_orte[$ort]+1:1);
|
|
}
|
|
|
|
// Gruppenkollision eintragen
|
|
if($raster[$t][$s]->kollision)
|
|
{
|
|
foreach($this->std_plan[$t][$s][0]->frei_orte as $ort=>$value)
|
|
{
|
|
$this->std_plan[$t][$s][0]->frei_orte[$ort]=(isset($this->std_plan[$t][$s][0]->frei_orte[$ort])?$this->std_plan[$t][$s][0]->frei_orte[$ort]+1:1);
|
|
}
|
|
}
|
|
|
|
// Blockung beruecksichtigen
|
|
for ($b=1;$b<$block && ($s+$block)<=($max_stunde+1);$b++)
|
|
{
|
|
if(!$raster[$t][$s+$b]->kollision)
|
|
{
|
|
//Wenn keine Gruppenkollision vorhanden ist, nur die Raumkollision eintragen
|
|
foreach($raster[$t][$s+$b]->ort as $ort)
|
|
{
|
|
if(in_array($ort, $orte))
|
|
$this->std_plan[$t][$s][0]->frei_orte[$ort]=(isset($this->std_plan[$t][$s][0]->frei_orte[$ort])?$this->std_plan[$t][$s][0]->frei_orte[$ort]+1:1);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Bei Gruppenkollision kollidieren alle Raeume
|
|
foreach($this->std_plan[$t][$s][0]->frei_orte as $ort=>$value)
|
|
{
|
|
$this->std_plan[$t][$s][0]->frei_orte[$ort]=(isset($this->std_plan[$t][$s][0]->frei_orte[$ort])?$this->std_plan[$t][$s][0]->frei_orte[$ort]+1:1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Wenn sich die Stunden mit der Blockung nicht ausgehen, dann keine Raeume anzeigen
|
|
$this->std_plan[$t][$s][0]->frei_orte = array();
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Funktion load_lva_search sucht Vorschlag fuer LVAs
|
|
*
|
|
* @param datum der Aktuellen Woche
|
|
* @param lva_id Array der lvaIDs
|
|
* @param db_stpl_table Name der DB-Tabelle
|
|
* @return true oder false
|
|
*/
|
|
public function load_lva_search($datum,$lva_id,$db_stpl_table,$type)
|
|
{
|
|
// Initialiseren der Variablen
|
|
$lehrverband=array();
|
|
// Name der View
|
|
$stpl_view='lehre.'.VIEW_BEGIN.$db_stpl_table;
|
|
$lva_stpl_view='lehre.'.VIEW_BEGIN.'lva_'.$db_stpl_table;
|
|
$stpl_table='lehre.'.TABLE_BEGIN.$db_stpl_table;
|
|
//Kalenderdaten setzen
|
|
$this->datum=montag($datum);
|
|
$this->datum_begin=$this->datum;
|
|
$this->datum_end=jump_week($this->datum_begin, 1);
|
|
// Formatieren fuer Datenbankabfragen
|
|
$this->datum_begin=date("Y-m-d",$this->datum_begin);
|
|
$this->datum_end=date("Y-m-d",$this->datum_end);
|
|
// Stundentafel abfragen
|
|
$sql_query='SELECT min(stunde),max(stunde) FROM lehre.tbl_stunde';
|
|
if(!$this->db_query($sql_query))
|
|
die($this->db_last_error());
|
|
$row = $this->db_fetch_object();
|
|
$min_stunde=$row->min;
|
|
$max_stunde=$row->max;
|
|
|
|
// LEs holen
|
|
$sql_query='SELECT *, (planstunden-verplant::smallint) AS offenestunden FROM '.$lva_stpl_view.' WHERE';
|
|
$lvas='';
|
|
foreach ($lva_id as $id)
|
|
$lvas.=" OR lehreinheit_id='".addslashes($id)."'";
|
|
$lvas=mb_substr($lvas,3);
|
|
$sql_query.=$lvas;
|
|
//$this->errormsg.=$sql_query;
|
|
//return false;
|
|
if(!$this->db_query($sql_query))
|
|
die($this->db_last_error());
|
|
$num_rows_lva=$this->db_num_rows();
|
|
// Arrays setzen
|
|
//$wochenrythmus=array();
|
|
$verplant=array();
|
|
$block=array();
|
|
$semesterstunden=array();
|
|
$planstunden=array();
|
|
$offenestunden=array();
|
|
// Daten aufbereiten
|
|
for ($i=0;$i<$num_rows_lva;$i++)
|
|
{
|
|
$row=$this->db_fetch_object(null,$i);
|
|
|
|
$raumtyp[$i]=$row->raumtyp;
|
|
$raumtypalt[$i]=$row->raumtypalternativ;
|
|
if ($row->gruppe_kurzbz!=null && $row->gruppe_kurzbz!='')
|
|
$gruppe[$i]=$row->gruppe_kurzbz;
|
|
$lehrverband[$i]->stg_kz=$row->studiengang_kz;
|
|
$lehrverband[$i]->sem=$row->semester;
|
|
$lehrverband[$i]->ver=$row->verband;
|
|
$lehrverband[$i]->grp=$row->gruppe;
|
|
$lektor[$i]=$row->lektor_uid;
|
|
$verplant[$i]=$row->verplant;
|
|
$planstunden[$i]=$row->planstunden;
|
|
$offenestunden[]=$row->offenestunden;
|
|
$unr=$row->unr;
|
|
$block[$i]=$row->stundenblockung;
|
|
$wochenrythmus[$i]=$row->wochenrythmus;
|
|
$semesterstunden[$i]=(integer)$row->semesterstunden;
|
|
//$this->errormsg.='SS:'.$semesterstunden[$i];
|
|
}
|
|
/*// verplante Stunden eindeutig?
|
|
$verpl=$verplant[0];
|
|
$verplant=array_unique($verplant);
|
|
if (count($verplant)==1)
|
|
$verplant=$verpl; //verplant[0];
|
|
else
|
|
{
|
|
$this->errormsg.='Verplante Stunden sind nicht eindeutig!';
|
|
return false;
|
|
}
|
|
//$this->errormsg.='Verplant:'.$verplant;
|
|
// Semesterstunden eindeutig?
|
|
$semstd=$semesterstunden[0];
|
|
$semesterstunden=array_unique($semesterstunden);
|
|
//$this->errormsg.='SS:'.$semesterstunden[0];
|
|
if (count($semesterstunden)==1)
|
|
$semesterstunden=$semstd;//semesterstunden[0];
|
|
else
|
|
{
|
|
$this->errormsg.='Semesterstunden sind nicht eindeutig!';
|
|
return false;
|
|
}
|
|
//$this->errormsg.='SS:'.$semesterstunden;*/
|
|
// Blockung eindeutig?
|
|
$blck=$block[0];
|
|
$block=array_unique($block);
|
|
if (count($block)==1)
|
|
$block=$blck; //block[0];
|
|
else
|
|
{
|
|
$this->errormsg.='Blockung ist nicht eindeutig!';
|
|
return false;
|
|
}
|
|
//$this->errormsg.='Block:'.$block;
|
|
// Offene Stunden eindeutig?
|
|
$os=$offenestunden[0];
|
|
$offenestunden=array_unique($offenestunden);
|
|
if ($type=='lva_single_search')
|
|
$offenestunden=$block;
|
|
elseif (count($offenestunden)==1)
|
|
$offenestunden=$os;
|
|
else
|
|
{
|
|
$this->errormsg.='Offene Stunden sind nicht eindeutig!';
|
|
return false;
|
|
}
|
|
// Wochenrythmus eindeutig?
|
|
$wr=$wochenrythmus[0];
|
|
$wochenrythmus=array_unique($wochenrythmus);
|
|
if (count($wochenrythmus)==1)
|
|
$wr=$wr;
|
|
else
|
|
{
|
|
$this->errormsg.='Wochenrythmus ist nicht eindeutig!';
|
|
return false;
|
|
}
|
|
// Raumtypen
|
|
$raumtyp=array_unique($raumtyp);
|
|
$rtype='';
|
|
foreach ($raumtyp as $r)
|
|
$rtype.=" OR raumtyp_kurzbz='".addslashes($r)."'";
|
|
$raumtypalt=array_unique($raumtypalt);
|
|
foreach ($raumtypalt as $r)
|
|
$rtype.=" OR raumtyp_kurzbz='".addslashes($r)."'";
|
|
$rtype=mb_substr($rtype,3);
|
|
//Lektor
|
|
$lektor=array_unique($lektor);
|
|
$lkt='';
|
|
foreach ($lektor as $l)
|
|
$lkt.=" OR mitarbeiter_uid='".addslashes($l)."'";
|
|
$lkt=mb_substr($lkt,3);
|
|
//Dummy Lektor kollidiert nicht
|
|
$lkt='(('.$lkt.") AND mitarbeiter_uid!='_DummyLektor')";
|
|
// Gruppen
|
|
$gruppen='';
|
|
if (isset($gruppe))
|
|
{
|
|
$gruppe=array_unique($gruppe);
|
|
foreach ($gruppe as $g)
|
|
$gruppen.=" OR gruppe_kurzbz='".addslashes($g)."'";
|
|
//$gruppen=mb_substr($gruppen,3);
|
|
}
|
|
//Lehrverband
|
|
//$lehrverband=array_unique($lehrverband);
|
|
$lvb='';
|
|
foreach ($lehrverband as $l)
|
|
{
|
|
$lvb.=" OR (studiengang_kz='".addslashes($l->stg_kz)."' AND semester='".addslashes($l->sem)."'";
|
|
if ($l->ver!='' && $l->ver!=' ' && $l->ver!=null)
|
|
{
|
|
$lvb.=" AND (verband='".addslashes($l->ver)."' OR verband IS NULL OR verband='' OR verband=' ')";
|
|
if ($l->grp!='' && $l->grp!=' ' && $l->grp!=null)
|
|
$lvb.=" AND (gruppe='".addslashes($l->grp)."' OR gruppe IS NULL OR gruppe='' OR gruppe=' ')";
|
|
}
|
|
if ($gruppen=='')
|
|
$lvb.=' AND gruppe_kurzbz IS NULL';
|
|
$lvb.=')';
|
|
}
|
|
$lvb=mb_substr($lvb,3);
|
|
|
|
// Raeume die in Frage kommen aufgrund der Raumtypen
|
|
$sql_query="SELECT DISTINCT ort_kurzbz, hierarchie FROM public.tbl_ort
|
|
JOIN public.tbl_ortraumtyp USING (ort_kurzbz) WHERE ($rtype) AND aktiv AND ort_kurzbz NOT LIKE '\\\\_%' ORDER BY hierarchie,ort_kurzbz"; //
|
|
//die($sql_query);
|
|
if(!$this->db_query($sql_query))
|
|
{
|
|
$this->errormsg=$this->db_last_error();
|
|
return false;
|
|
}
|
|
$num_orte=$this->db_num_rows();
|
|
for ($i=0;$i<$num_orte;$i++)
|
|
{
|
|
$row = $this->db_fetch_object(null, $i);
|
|
$orte[]=$row->ort_kurzbz;
|
|
}
|
|
|
|
// Suche nach freien Orten. Bei 'lva_multi_search' wird die Schleife (do) aktiv
|
|
$count=0;
|
|
$rest=$offenestunden;
|
|
if ($rest<=0 && $type=='lva_multi_search')
|
|
{
|
|
$this->errormsg.='Es sind bereits alle Stunden verplant!';
|
|
return false;
|
|
}
|
|
$datum=$this->datum;
|
|
$datum_begin=$this->datum_begin;
|
|
$datum_end=$this->datum_end;
|
|
// Raster vorbereiten
|
|
for ($t=1;$t<=TAGE_PRO_WOCHE;$t++)
|
|
for ($s=$min_stunde;$s<=$max_stunde;$s++)
|
|
{
|
|
$raster[$t][$s]->ort=array();
|
|
$raster[$t][$s]->kollision=false;
|
|
}
|
|
do
|
|
{
|
|
// Raster vorbereiten
|
|
for ($t=1;$t<=TAGE_PRO_WOCHE;$t++)
|
|
{
|
|
for ($s=$min_stunde;$s<=$max_stunde;$s++)
|
|
{
|
|
if (isset($raster[$t][$s]))
|
|
unset($raster[$t][$s]);
|
|
$raster[$t][$s]->ort=array();
|
|
$raster[$t][$s]->kollision=false;
|
|
}
|
|
}
|
|
|
|
// Stundenplanabfrage bauen (Wo ist Kollision?)
|
|
$sql_query="SELECT DISTINCT datum, stunde FROM $stpl_table
|
|
WHERE datum>='".addslashes($datum_begin)."' AND datum<'".addslashes($datum_end)."' AND
|
|
($lkt $gruppen OR ($lvb) )";
|
|
if (is_numeric($unr))
|
|
$sql_query.=" AND unr!='".addslashes($unr)."'";
|
|
|
|
if(!$this->db_query($sql_query))
|
|
{
|
|
$this->errormsg = $this->db_last_error().$sql_query;
|
|
return false;
|
|
}
|
|
|
|
// Kollisionen ins Raster eintragen
|
|
while($row = $this->db_fetch_object())
|
|
{
|
|
$mtag=mb_substr($row->datum, 8,2);
|
|
$month=mb_substr($row->datum, 5,2);
|
|
$jahr=mb_substr($row->datum, 0,4);
|
|
$tag=date("w",mktime(12,0,0,$month,$mtag,$jahr));
|
|
$raster[$tag][$row->stunde]->kollision=true;
|
|
}
|
|
|
|
// Stundenplanabfrage bauen (Wo ist besetzt?)
|
|
$sql_query="SELECT DISTINCT datum, stunde, ort_kurzbz FROM $stpl_view
|
|
JOIN public.tbl_ortraumtyp USING (ort_kurzbz)
|
|
WHERE datum>='".addslashes($datum_begin)."' AND datum<'".addslashes($datum_end)."' AND
|
|
($rtype)";
|
|
if (is_numeric($unr))
|
|
$sql_query.=" AND unr!='".addslashes($unr)."'";
|
|
|
|
// Reservierungen beruecksichtigen
|
|
$sql_query.=" UNION SELECT distinct datum, stunde, ort_kurzbz FROM campus.tbl_reservierung
|
|
WHERE datum>='".addslashes($datum_begin)."' AND datum<'".addslashes($datum_end)."'";
|
|
|
|
if(!$this->db_query($sql_query))
|
|
{
|
|
$this->errormsg = $this->db_last_error().$sql_query;
|
|
return false;
|
|
}
|
|
|
|
while($row = $this->db_fetch_object())
|
|
{
|
|
$mtag=mb_substr($row->datum, 8,2);
|
|
$month=mb_substr($row->datum, 5,2);
|
|
$jahr=mb_substr($row->datum, 0,4);
|
|
$tag=date("w",mktime(12,0,0,$month,$mtag,$jahr));
|
|
$raster[$tag][$row->stunde]->ort[]=$row->ort_kurzbz;
|
|
}
|
|
|
|
// Moegliche Orte fuer den Vorschlag in den Stundenplan eintragen.
|
|
// $this->std_plan[$t][$s][0]->frei_orte ist ein Array mit den in Frage kommenden Orten
|
|
// der Wert von $this->std_plan[$t][$s][0]->frei_orte[$ort_kurzbz] gibt an, wie viele
|
|
// kollisionen bei der Zuteilung entstehen
|
|
for ($t=1;$t<=TAGE_PRO_WOCHE;$t++)
|
|
{
|
|
for ($s=1;$s<=$max_stunde;$s++)
|
|
{
|
|
//Blockung passt in die Maximalstundenanzahl
|
|
if (($s+$blck)<=($max_stunde+1))
|
|
{
|
|
if($count==0)
|
|
{
|
|
// Freie Orte beim 1. Durchlauf zuteilen
|
|
foreach($orte as $ort)
|
|
$this->std_plan[$t][$s][0]->frei_orte[$ort]=(isset($this->std_plan[$t][$s][0]->frei_orte[$ort])?$this->std_plan[$t][$s][0]->frei_orte[$ort]:0);
|
|
}
|
|
|
|
// Besetzte Orte eintragen
|
|
foreach ($raster[$t][$s]->ort as $ort)
|
|
{
|
|
if(in_array($ort, $orte))
|
|
$this->std_plan[$t][$s][0]->frei_orte[$ort]=(isset($this->std_plan[$t][$s][0]->frei_orte[$ort])?$this->std_plan[$t][$s][0]->frei_orte[$ort]+1:1);
|
|
}
|
|
|
|
//Kollision mit Gruppe
|
|
if($raster[$t][$s]->kollision)
|
|
{
|
|
foreach ($this->std_plan[$t][$s][0]->frei_orte as $ort=>$value)
|
|
{
|
|
if(in_array($ort, $orte))
|
|
$this->std_plan[$t][$s][0]->frei_orte[$ort]=(isset($this->std_plan[$t][$s][0]->frei_orte[$ort])?$this->std_plan[$t][$s][0]->frei_orte[$ort]+1:1);
|
|
}
|
|
}
|
|
|
|
// Blockung beruecksichtigen
|
|
for ($b=1;$b<$block && ($s+$block)<=($max_stunde+1);$b++)
|
|
{
|
|
if (!$raster[$t][$s+$b]->kollision)
|
|
{
|
|
// Wenn keine Gruppenkollision vorhanden ist, dann die kollidierenden Raeume eintragen
|
|
foreach ($raster[$t][$s+$b]->ort as $ort)
|
|
{
|
|
if(in_array($ort, $orte))
|
|
$this->std_plan[$t][$s][0]->frei_orte[$ort]=(isset($this->std_plan[$t][$s][0]->frei_orte[$ort])?$this->std_plan[$t][$s][0]->frei_orte[$ort]+1:1);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Bei Gruppenkollision den Wert bei allen Raumen erhoehen
|
|
foreach ($this->std_plan[$t][$s][0]->frei_orte as $ort=>$value)
|
|
{
|
|
$this->std_plan[$t][$s][0]->frei_orte[$ort]=(isset($this->std_plan[$t][$s][0]->frei_orte[$ort])?$this->std_plan[$t][$s][0]->frei_orte[$ort]+1:1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Wenn sich die Verplanung mit der Blockung nicht mehr ausgeht, dann keine Raeume vorschlagen
|
|
$this->std_plan[$t][$s][0]->frei_orte=array();
|
|
}
|
|
}
|
|
}
|
|
|
|
// Variablen abgleichen
|
|
$rest-=$block;
|
|
if ($block>$rest)
|
|
$block=$rest;
|
|
$datum=jump_week($datum,$wr);
|
|
$datum_begin=$datum;
|
|
$datum_end=jump_week($datum_begin, 1);
|
|
// Formatieren fuer Datenbankabfragen
|
|
$datum_begin=date("Y-m-d",$datum_begin);
|
|
$datum_end=date("Y-m-d",$datum_end);
|
|
$count++;
|
|
} while($type=='lva_multi_search' && $rest>0);
|
|
return true;
|
|
}
|
|
|
|
|
|
/**
|
|
* Funktion draw_week_csv Stundenplan im CSV-Format
|
|
*
|
|
* @param target Ziel-System zB Outlook
|
|
* @return true oder false
|
|
*/
|
|
public function draw_week_csv($target, $lvplan_kategorie)
|
|
{
|
|
if (!date("w",$this->datum))
|
|
$this->datum=jump_day($this->datum,1);
|
|
$num_rows_stunde=$this->db_num_rows($this->stunde);
|
|
for ($i=1; $i<=TAGE_PRO_WOCHE; $i++)
|
|
{
|
|
$blocked=array();
|
|
$gruppiert=array();
|
|
for ($k=0; $k<$num_rows_stunde; $k++)
|
|
{
|
|
$row = $this->db_fetch_object($this->stunde, $k);
|
|
$j=$row->stunde; // get id of hour
|
|
|
|
if (isset($this->std_plan[$i][$j][0]->lehrfach))
|
|
{
|
|
// Daten aufbereiten
|
|
if (isset($unr))
|
|
unset($unr);
|
|
if (isset($lektor))
|
|
unset($lektor);
|
|
if (isset($lehrverband))
|
|
unset($lehrverband);
|
|
if (isset($lehrfach))
|
|
unset($lehrfach);
|
|
foreach ($this->std_plan[$i][$j] as $lehrstunde)
|
|
{
|
|
|
|
$unr[]=$lehrstunde->unr;
|
|
// Lektoren
|
|
$lektor[]=$lehrstunde->lektor;
|
|
// Lehrverband
|
|
$lvb=$lehrstunde->stg.'-'.$lehrstunde->sem;
|
|
if ($lehrstunde->ver!=null && $lehrstunde->ver!='0' && $lehrstunde->ver!='')
|
|
{
|
|
$lvb.=$lehrstunde->ver;
|
|
if ($lehrstunde->grp!=null && $lehrstunde->grp!='0' && $lehrstunde->grp!='')
|
|
$lvb.=$lehrstunde->grp;
|
|
}
|
|
if (count($lehrstunde->gruppe_kurzbz)>0)
|
|
$lvb=$lehrstunde->gruppe_kurzbz;
|
|
$lehrverband[]=$lvb;
|
|
// Lehrfach
|
|
$lf=$lehrstunde->lehrfach;
|
|
//echo "\n!!!!Lehrfach $lf\n";
|
|
if (isset($lehrstunde->lehrform))
|
|
$lf.='-'.$lehrstunde->lehrform;
|
|
$lehrfach[]=$lf;
|
|
$titel=$lehrstunde->titel;
|
|
$anmerkung=$lehrstunde->anmerkung;
|
|
}
|
|
|
|
// Unterrichtsnummer (Kollision?)
|
|
$unr=array_unique($unr);
|
|
if(!isset($kollision))
|
|
$kollision=0;
|
|
$kollision+=count($unr);
|
|
|
|
// Lektoren
|
|
if ($this->type!='lektor')
|
|
{
|
|
$lektor=array_unique($lektor);
|
|
sort($lektor);
|
|
$lkt='';
|
|
foreach ($lektor as $l)
|
|
$lkt.=$l.' ';
|
|
}
|
|
else
|
|
$lkt=$lektor[0];
|
|
//echo $lkt;
|
|
|
|
// Lehrverband
|
|
if ($this->type!='verband')
|
|
{
|
|
$lehrverband=array_unique($lehrverband);
|
|
sort($lehrverband);
|
|
$lvb='';
|
|
foreach ($lehrverband as $l)
|
|
$lvb.=$l.' ';
|
|
}
|
|
else
|
|
$lvb=$lehrverband[0];
|
|
|
|
$row = $this->db_fetch_object($this->stunde, $k);
|
|
$start_time=$row->beginn;
|
|
|
|
for($idx=0;$idx<count($this->std_plan[$i][$j]);$idx++)
|
|
{
|
|
if(!isset($this->std_plan[$i][$j][$idx]))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
/**
|
|
* Wenn Lektoren in mehreren Raeumen gleichzeitig unterrichten
|
|
* Oder mehrere Lektoren /Gruppen im selben Raum sind werden diese
|
|
* zu einem Eintrag zusammengruppiert.
|
|
*
|
|
* Zusammengruppiert werden nur Eintraege die am gleichen Tag
|
|
* in der gleichen Stunde stattfinden.
|
|
*
|
|
* Es wird nur der erste Eintrag ausgegeben. Die restlichen werden uebersprungen da
|
|
* die Lektoren, Gruppen und Raeume bereits zum Ersten Eintrag hinzugefuegt wurden.
|
|
*/
|
|
if(isset($gruppiert[$this->std_plan[$i][$j][$idx]->unr]) && $gruppiert[$this->std_plan[$i][$j][$idx]->unr]>0)
|
|
{
|
|
$gruppiert[$this->std_plan[$i][$j][$idx]->unr]--;
|
|
continue;
|
|
}
|
|
|
|
/**
|
|
* Unterricht der ueber mehrere Stunden geht wird nicht einzeln Exportiert,
|
|
* sondern zusammengeblockt. (in maximal 4er Bloecke)
|
|
*
|
|
* Es wird nur ein Eintrag geschrieben, die restlichen werden uebersprungen.
|
|
* Vor dem Ueberspringen des Eintrages werden jedoch noch die dazu Gruppierten Eintraege
|
|
* ermittelt und dann ebenfalls uebersprungen
|
|
*/
|
|
$blockcontinue=false;
|
|
if(isset($blocked[$this->std_plan[$i][$j][$idx]->unr]) && $blocked[$this->std_plan[$i][$j][$idx]->unr]>0)
|
|
{
|
|
$blocked[$this->std_plan[$i][$j][$idx]->unr]--;
|
|
$blockcontinue=true;
|
|
}
|
|
|
|
if(!$blockcontinue)
|
|
{
|
|
// Blockungen ueber mehrere Stunden erkennen
|
|
if (isset($this->std_plan[$i][$j+1][$idx]) && isset($this->std_plan[$i][$j+1][$idx]->stundenplan_id)
|
|
&& ($this->std_plan[$i][$j][$idx]->unr == $this->std_plan[$i][$j+1][$idx]->unr)
|
|
&& $this->std_plan[$i][$j][$idx]!='0' && $k<($num_rows_stunde-1))
|
|
{
|
|
//2er Block
|
|
if(isset($blocked[$this->std_plan[$i][$j][$idx]->unr]))
|
|
$blocked[$this->std_plan[$i][$j][$idx]->unr]++;
|
|
else
|
|
$blocked[$this->std_plan[$i][$j][$idx]->unr]=1;
|
|
$row = $this->db_fetch_object($this->stunde, ($k+1));
|
|
$end_time=$row->ende;
|
|
|
|
if (isset($this->std_plan[$i][$j+2][$idx]) && isset($this->std_plan[$i][$j+2][$idx]->stundenplan_id)
|
|
&& ($this->std_plan[$i][$j][$idx]->unr == $this->std_plan[$i][$j+2][$idx]->unr)
|
|
&& $k<($num_rows_stunde-2))
|
|
{
|
|
//3er Block
|
|
$blocked[$this->std_plan[$i][$j][$idx]->unr]++;
|
|
$row = $this->db_fetch_object($this->stunde, ($k+2));
|
|
$end_time=$row->ende;
|
|
|
|
if (isset($this->std_plan[$i][$j+3][$idx]) && isset($this->std_plan[$i][$j+3][$idx]->stundenplan_id)
|
|
&& ($this->std_plan[$i][$j][$idx]->unr == $this->std_plan[$i][$j+3][$idx]->unr)
|
|
&& $k<($num_rows_stunde-3))
|
|
{
|
|
//4er Block
|
|
$blocked[$this->std_plan[$i][$j][$idx]->unr]++;
|
|
$row = $this->db_fetch_object($this->stunde, ($k+3));
|
|
$end_time=$row->ende;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$row = $this->db_fetch_object($this->stunde, $k);
|
|
$end_time=$row->ende;
|
|
}
|
|
}
|
|
|
|
|
|
//Wenn im selben Raum mehrere Lektoren sind bzw mehrere Gruppen
|
|
//dann werden diese zusammengruppiert und als ein Eintrag angezeigt
|
|
for($idx1=0;$idx1<count($this->std_plan[$i][$j]);$idx1++)
|
|
{
|
|
if($idx!=$idx1)
|
|
{
|
|
if($this->kannGruppieren($i,$j,$idx,$idx1))
|
|
{
|
|
if(isset($gruppiert[$this->std_plan[$i][$j][$idx]->unr]))
|
|
$gruppiert[$this->std_plan[$i][$j][$idx]->unr]++;
|
|
else
|
|
$gruppiert[$this->std_plan[$i][$j][$idx]->unr]=1;
|
|
|
|
//Bezeichnungen zusammenfuehren
|
|
|
|
//Lektoren
|
|
if(!mb_strstr($this->std_plan[$i][$j][$idx1]->lektor,$this->std_plan[$i][$j][$idx]->lektor))
|
|
{
|
|
$this->std_plan[$i][$j][$idx]->lektor.=' / '.$this->std_plan[$i][$j][$idx1]->lektor;
|
|
}
|
|
|
|
//Ort
|
|
if(!mb_strstr($this->std_plan[$i][$j][$idx1]->ort,$this->std_plan[$i][$j][$idx]->ort))
|
|
{
|
|
$this->std_plan[$i][$j][$idx]->ort.=' / '.$this->std_plan[$i][$j][$idx1]->ort;
|
|
}
|
|
|
|
//Gruppen
|
|
if(isset($lehrverband[$idx]) && isset($lehrverband[$idx1]))
|
|
{
|
|
if(!mb_strstr($lehrverband[$idx], $lehrverband[$idx1]))
|
|
$lehrverband[$idx].=' / '.$lehrverband[$idx1];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//Geblockte Eintraege werden uebersprungen nachdem die Gruppierung ermittelt wurde
|
|
if($blockcontinue)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
$start_date=date("d.m.Y",$this->datum);
|
|
$end_date=$start_date;
|
|
if(isset($lehrverband[$idx]))
|
|
$lvb = $lehrverband[$idx];
|
|
if ($target=='outlook')
|
|
{
|
|
//"Betreff","Beginnt am","Beginnt um","Endet am","Endet um","Ganztaegiges Ereignis","Erinnerung Ein/Aus","Erinnerung am","Erinnerung um","Besprechungsplanung","Erforderliche Teilnehmer","Optionale Teilnehmer","Besprechungsressourcen","Abrechnungsinformationen","Beschreibung",
|
|
//"Kategorien","Ort","Prioritaet","Privat","Reisekilometer","Vertraulichkeit","Zeitspanne zeigen als"
|
|
echo $this->crlf.'"'.$this->std_plan[$i][$j][$idx]->lehrfach.(isset($this->std_plan[$i][$j][$idx]->lehrform) && $this->std_plan[$i][$j][$idx]->lehrform!=''?'-'.$this->std_plan[$i][$j][$idx]->lehrform:'').($lvb!=''?' - '.$lvb:'').'","'.$start_date.'","'.$start_time.'","'.$end_date.'","'.$end_time.'","Aus","Aus",,,,,,,,"Stundenplan';
|
|
echo $this->crlf.$this->std_plan[$i][$j][$idx]->lehrfach.$this->crlf.$this->std_plan[$i][$j][$idx]->lektor.$this->crlf.$lvb.$this->crlf.$this->std_plan[$i][$j][$idx]->ort.'","StundenplanFH","'.$this->std_plan[$i][$j][$idx]->ort.'","Normal","Aus",,"Normal","2"';
|
|
}
|
|
else if ($target=='ical')
|
|
{
|
|
$sda = explode(".",$start_date); //sda start date array
|
|
$sta = explode(":",$start_time); //sta start time array
|
|
$eda = explode(".",$end_date); //eda end date array
|
|
$eta = explode(":",$end_time); //eta end time array
|
|
|
|
//Die Zeitzone muss angegeben werden, da sonst der Google Kalender die Endzeiten nicht richtig erkennt
|
|
// diese wird in stpl_kalender global definiert und bei den Start und Ende Zeiten mitangegeben
|
|
$start_date_time_ical = $sda[2].$sda[1].$sda[0].'T'.sprintf('%02s',($sta[0])).$sta[1].$sta[2]; //neu gruppieren der Startzeit und des Startdatums
|
|
$end_date_time_ical = $eda[2].$eda[1].$eda[0].'T'.sprintf('%02s',($eta[0])).$eta[1].$eta[2]; //neu gruppieren der Startzeit und des Startdatums
|
|
|
|
echo $this->crlf.'BEGIN:VEVENT'.$this->crlf
|
|
.'UID:'.'FH'.$lvb.$this->std_plan[$i][$j][$idx]->ort.$this->std_plan[$i][$j][$idx]->lektor.$lehrfach[$idx].$start_date_time_ical.$this->crlf
|
|
.'SUMMARY:'.$lehrfach[$idx].' '.$this->std_plan[$i][$j][$idx]->ort.' - '.$lvb.$this->crlf
|
|
.'DESCRIPTION:'.$lehrfach[$idx].'\n'.$this->std_plan[$i][$j][$idx]->lektor.'\n'.$lvb.'\n'.$this->std_plan[$i][$j][$idx]->ort.$this->crlf
|
|
.'LOCATION:'.$this->std_plan[$i][$j][$idx]->ort.$this->crlf
|
|
.'CATEGORIES:'.$lvplan_kategorie.$this->crlf
|
|
.'DTSTART;TZID=Europe/Vienna:'.$start_date_time_ical.$this->crlf
|
|
.'DTEND;TZID=Europe/Vienna:'.$end_date_time_ical.$this->crlf
|
|
.'END:VEVENT';
|
|
}
|
|
else
|
|
{
|
|
echo $this->crlf.'"'.$lehrfach[$idx].'","'.$lvplan_kategorie.'","'.$this->std_plan[$i][$j][$idx]->ort.'","Stundenplan'.$this->crlf.$this->std_plan[$i][$j][$idx]->lehrfach.$this->crlf;
|
|
echo $this->std_plan[$i][$j][$idx]->lektor.$this->crlf.$lvb.$this->crlf.$this->std_plan[$i][$j][$idx]->ort.'","Stundenplan",';
|
|
echo '"'.$start_date.'","'.$start_time.'","'.$end_date.'","'.$end_time.'",,,,,';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
$this->datum=jump_day($this->datum, 1);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Prueft, ob Eintraege fuer den Export zusammengruppiert werden koennen zu einer Stunde
|
|
* Dies ist der Fall, wenn mehrere Lektoren in einem Raum unterrichten, ein Lektor mehrere
|
|
* Raeume parallel beaufsichtigt oder mehrere Gruppen in einem Raum sind
|
|
*
|
|
* @param $tag Tag des Unterrichts
|
|
* @param $stunde Stunde des Unterrichts
|
|
* @param $idx Index des ersten Eintrages
|
|
* @param $idx1 Index des Eintrages der mit dem ersten verglichen werden soll
|
|
*/
|
|
protected function kannGruppieren($tag, $stunde, $idx, $idx1)
|
|
{
|
|
if(isset($this->std_plan[$tag][$stunde][$idx]) &&
|
|
isset($this->std_plan[$tag][$stunde][$idx1]))
|
|
{
|
|
$unr1 = $this->std_plan[$tag][$stunde][$idx]->unr;
|
|
$unr2 = $this->std_plan[$tag][$stunde][$idx1]->unr;
|
|
$ort1 = $this->std_plan[$tag][$stunde][$idx]->ort;
|
|
$ort2 = $this->std_plan[$tag][$stunde][$idx1]->ort;
|
|
$lektor1 = $this->std_plan[$tag][$stunde][$idx]->lektor;
|
|
$lektor2 = $this->std_plan[$tag][$stunde][$idx1]->lektor;
|
|
|
|
if($unr1==$unr2 && ($ort1==$ort2 || $lektor1==$lektor2))
|
|
return true;
|
|
else
|
|
return false;
|
|
}
|
|
else
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function jahreskalenderjump($link)
|
|
{
|
|
$sprache = getSprache();
|
|
$p=new phrasen($sprache);
|
|
|
|
$crlf=crlf();
|
|
$datum=mktime();
|
|
$woche=kalenderwoche($datum);
|
|
$datum=montag($datum);
|
|
echo ' <SMALL><CENTER><B>'.$p->t('lvplan/springeZuKw').'</B><BR><SMALL>'.$crlf;
|
|
for ($anz=1;$anz<26;$anz++)
|
|
{
|
|
$linknew=$link.'&datum='.$datum;
|
|
if ($woche==53)
|
|
$woche=1;
|
|
echo ' <A HREF="'.$linknew.'">'.$woche.'</A>'.$crlf;
|
|
if ($anz%5==0)
|
|
echo ' <br>'.$crlf;
|
|
$datum+=60*60*24*7;
|
|
$woche++;
|
|
}
|
|
echo ' </SMALL></CENTER></SMALL>'.$crlf;
|
|
}
|
|
|
|
?>
|