Files
FHC-Core/include/wochenplan.class.php
T
oesi d6526bd9f4 Fehler behoben bei dem nicht zusammengehoerige Reservierungen im Export zusammengruppiert wurden
Fehler behoben bei dem in seltenen Fällen eine Kollision im Tempus angezeigt wurde obwohl keine vorhanden ist
2015-09-09 18:50:58 +02:00

2623 lines
97 KiB
PHP

<?php
/* Copyright (C) 2007 fhcomplete.org
*
* 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__).'/../config/global.config.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');
require_once(dirname(__FILE__).'/functions.inc.php');
require_once(dirname(__FILE__).'/betriebsmittel.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 $lva; // @brief ID der Lehrveranstaltung
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;
public $fachbereich_kurzbz;
public $raeume = array();
/**
* 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=time();
$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++)
{
if(!isset($this->std_plan[$i][$j][0]))
$this->std_plan[$i][$j][0]=new stdClass();
$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, $fachbereich_kurzbz=NULL, $lva=NULL)
{
// Parameter Checken
// Typ des Stundenplans
if ($type=='student' || $type=='lektor' || $type=='verband' || $type=='gruppe' || $type=='ort' || $type=='fachbereich' || $type=='lva')
$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;
$this->ort_kurzbz = "all";
}
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;
if($type=='fachbereich')
{
if(is_null($fachbereich_kurzbz))
{
$this->errormsg = 'Fachbereich nicht gesetzt';
return false;
}
$this->fachbereich_kurzbz=$fachbereich_kurzbz;
}
// LVA
if($type=='lva' && $lva==NULL)
{
$this->errormsg='Fehler: LVA-ID ist nicht gesetzt';
return false;
}
elseif($type=='lva')
{
$this->lva=$lva;
}
// 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=".$this->db_add_param($this->pers_uid);
else
$sql_query="SELECT uid, titelpre, titelpost, nachname, vorname, vornamen FROM campus.vw_mitarbeiter WHERE uid=".$this->db_add_param($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' && $this->ort_kurzbz != 'all')
{
$sql_query="SELECT bezeichnung, ort_kurzbz, planbezeichnung, ausstattung, max_person, content_id FROM public.tbl_ort WHERE ort_kurzbz=".$this->db_add_param($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->ort_content_id = $row->content_id;
$this->link.='&ort_kurzbz='.$this->ort_kurzbz; //Link erweitern
}
else
{
$this->errormsg="Dieser Ort existiert nicht";
return false;
}
}
if ($this->type=='ort' && $this->ort_kurzbz == 'all')
{
$sql_query="SELECT bezeichnung, ort_kurzbz, planbezeichnung, ausstattung, max_person, content_id FROM public.tbl_ort WHERE lehre AND ort_kurzbz != 'Dummy'";
//echo $sql_query;
if (!$this->db_query($sql_query))
{
$this->errormsg=$this->db_last_error();
return false;
}
while($row = $this->db_fetch_object())
{
$obj = new stdClass();
$obj->ort_bezeichnung = $row->bezeichnung;
$obj->ort_kurzbz = $row->ort_kurzbz;
$obj->ort_planbezeichnung = $row->planbezeichnung;
$obj->ort_ausstattung = $row->ausstattung;
$obj->ort_max_person = $row->max_person;
$obj->ort_content_id = $row->content_id;
$obj->link.='&ort_kurzbz='.$this->ort_kurzbz; //Link erweitern
array_push($this->raeume, $obj);
}
}
// Studiengangsdaten ermitteln
if ($this->type=='student' || $this->type=='verband' || $this->type=='lva')
{
$sql_query="SELECT bezeichnung, kurzbz, kurzbzlang, typ, UPPER(typ||kurzbz) AS kuerzel, english FROM public.tbl_studiengang WHERE studiengang_kz=".$this->db_add_param($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;
$this->stg_kuerzel = $row->kuerzel;
$this->stg_english = $row->english;
}
}
// 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())
{
if(!isset($this->studiensemester_now))
$this->studiensemester_now = new stdClass();
$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())
{
if(!isset($this->studiensemester_next))
$this->studiensemester_next = new stdClass();
$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', $alle_unr_mitladen=false)
{
// 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, null,$this->fachbereich_kurzbz,$this->lva, $alle_unr_mitladen);
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>';
if(!isset($this->std_plan[$tag][$stunde][$idx]))
$this->std_plan[$tag][$stunde][$idx]=new stdClass();
$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%" border="0" cellspacing="0">'.$this->crlf;
echo ' <TR>'.$this->crlf;
echo ' <TD style="padding-bottom: 5px;" valign="top">'.$this->crlf;
echo ' <P valign="top">';
if ($this->type=='student' || $this->type=='lektor')
echo '<strong>'.$p->t('global/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_kuerzel.' - '.($sprache=='English' && $this->stg_english!=''?$this->stg_english:$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' && $this->ort_kurzbz != 'all')
echo '<strong>'.$p->t('lvplan/raum').': </strong>'.$this->ort_kurzbz.' - '.$this->ort_bezeichnung.' - '.($this->ort_max_person!=''?'( '.$this->ort_max_person.' '.$p->t('lvplan/personen').' )':'').($this->ort_content_id!=''?' - <a href="../../../cms/content.php?content_id='.$this->ort_content_id.'" target="_self">'.$p->t('lvplan/rauminformationenAnzeigen').'</a>':'').'<br>'.$this->ort_ausstattung;
if ($this->type=='lva')
$this->link.='&lva='.$this->lva;
echo '</P>'.$this->crlf;
echo ' <table class="stdplan" style="width: auto; margin: auto;" valign="bottom" align="center">';
//echo ' <tr><td colspan="2" class="stdplan" style="padding:3px;" align="center">'.$p->t('lvplan/semesterplaene').'</td></tr>';
echo ' <tr><td style="padding:3px 15px 0px 15px; margin: 0,0,20px,0;" 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.'&lva='.$this->lva;
//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 ' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>'.$p->t('global/kalender').':&nbsp;&nbsp;&nbsp;</strong>'.$this->crlf;
echo $this->crlf;
//echo ' '.$p->t('lvplan/uebersicht').':&nbsp;<A href="'.$kal_link_ws.'&format=html" target="_blank" title="HTML">'.$this->studiensemester_now->name.'</A>&nbsp;'.$this->crlf;
echo $this->studiensemester_now->name.'<br>'.$this->crlf;
echo ' <A href="'.$kal_link_ws.'&format=html" target="_blank" title="HTML"><IMG src="../../../skin/images/html.png" height="30" alt="HTML" border="0"></A>'.$this->crlf;
echo ' <A href="'.$kal_link_ws.'&format=csv" title="CSV"><IMG src="../../../skin/images/csv.png" height="30" 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="30" 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/ical1.0.png" height="30" 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/ical2.0.png" height="30" alt="vCal Version 2.0" border="0"></A>'.$this->crlf;
echo ' </td><td class="stdplan" style="padding:8px;" align="center">'.$p->t('lvplan/semesterplaene').'</td><td style="padding:3px 15px 0px 15px;" align="center">';
//echo ' &nbsp;&nbsp;&nbsp;&nbsp;'.$p->t('lvplan/uebersicht').':&nbsp;<A href="'.$kal_link_ss.'&format=html" target="_blank" title="HTML">'.$this->studiensemester_next->name.'</A>&nbsp;'.$this->crlf;
echo ' <span style="color:#999">'.$this->studiensemester_next->name.'</span><br>'.$this->crlf;
echo ' <A href="'.$kal_link_ss.'&format=html" target="_blank" title="HTML"><IMG src="../../../skin/images/html_light.png" height="30" alt="HTML" border="0"></A>'.$this->crlf;
echo ' <A href="'.$kal_link_ss.'&format=csv" title="CSV"><IMG src="../../../skin/images/csv_light.png" height="30" 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_light.png" height="30" 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/ical1.0_light.png" height="30" 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/ical2.0_light.png" height="30" alt="iCal Version 2.0" border="0"></A>'.$this->crlf;
echo ' </td></tr></table>'.$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>'.$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;
if ($this->type=='lva')
$link_parameter='&lva='.$this->lva;
// 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 style="text-decoration:none" href="stpl_week.php?type='.$this->type.'&datum='.$this->datum.'&ort_kurzbz='.$prev_ort->ort_kurzbz.'">'.$this->crlf;
echo ' &nbsp;&nbsp;<img class="lvplanbutton" src="../../../skin/images/left_lvplan.png" title="'.$prev_ort->ort_kurzbz.'" />&nbsp;&nbsp;'.$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 style="text-decoration:none" href="stpl_week.php?type='.$this->type.'&datum='.$this->datum.'&ort_kurzbz='.$next_ort->ort_kurzbz.'">'.$this->crlf;
echo ' &nbsp;&nbsp;<img class="lvplanbutton" src="../../../skin/images/right_lvplan.png" title="'.$next_ort->ort_kurzbz.'">&nbsp;&nbsp;'.$this->crlf;
echo ' </a>'.$this->crlf;
}
echo ' </p></form>';
$link_parameter='&ort_kurzbz='.$this->ort_kurzbz;
}
echo ' <p style="color:grey; font-size:17px; vertical-align:center; margin-bottom:0px;" align="center">';
// 4 Wochen zurueck
echo '<a style="text-decoration:none" href="stpl_week.php?type='.$this->type;
echo $link_parameter;
echo '&datum='.$this->datum_prev4week.'">'.$this->crlf;
echo '<img class="lvplanbutton" src="../../../skin/images/moreleft_lvplan.png" title="'.$p->t('lvplan/vierWochenZurueck').'">'.$this->crlf;
echo '</a>';
// 1 Woche zurueck
echo '<a style="text-decoration:none" href="stpl_week.php?type='.$this->type;
echo $link_parameter;
echo '&datum='.$this->datum_prevweek;
echo '">&nbsp;&nbsp;<img class="lvplanbutton" src="../../../skin/images/left_lvplan.png" title="'.$p->t('lvplan/eineWocheZurueck').'">&nbsp;&nbsp;</a>';
// Aktuelle KW
echo '<a style="text-decoration:none" href="stpl_week.php?type='.$this->type;
echo $link_parameter;
echo '" title="'.$p->t('lvplan/aktuelleKW').'">'.$p->t('eventkalender/kw').' '.$this->kalenderwoche;
echo '</a>';
// 1 Woche nach vor
echo '<a style="text-decoration:none" href="stpl_week.php?type='.$this->type;
echo $link_parameter;
echo '&datum='.$this->datum_nextweek;
echo '">&nbsp;&nbsp;<img class="lvplanbutton" src="../../../skin/images/right_lvplan.png" title="'.$p->t('lvplan/eineWocheVor').'">&nbsp;&nbsp;</a>';
// 4 Wochen nach vor
echo '<a style="text-decoration:none" href="stpl_week.php?type='.$this->type;
echo $link_parameter;
echo '&datum='.$this->datum_next4week;
echo '"><img class="lvplanbutton" src="../../../skin/images/moreright_lvplan.png" title="'.$p->t('lvplan/vierWochenVor').'"></a>';
echo '</p>';
//Kalenderjump mit Hoverbox
$this->jahreskalenderjump_hoverbox($this->link);
return true;
}
/**
* Zeichnen der Stundenplanwoche in HTML
*/
public function draw_week($raumres, $user_uid='', $gruppieren=LVPLAN_LEHREINHEITEN_GRUPPIEREN)
{
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 ($raumres && $this->type=='ort')
echo '<form name="reserve" method="post" action="stpl_week.php">'.$this->crlf;
//Tabelle zeichnen
echo ' <table class="stdplan" width="100%" border="0" cellpadding="1" cellspacing="1" name="Stundenplantabelle" align="center">'.$this->crlf;
// Kopfzeile darstellen
echo '<thead><tr>'.$this->crlf;
echo ' <th align="right">'.$p->t('global/stunde').'&nbsp;<br>'.$p->t('global/beginn').'&nbsp;<br>'.$p->t('global/ende').'&nbsp;</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>&nbsp;'.$beginn .'&nbsp;<br>&nbsp;'.$ende.'&nbsp;</div></th>'.$this->crlf;
}
echo '</tr></thead><tbody>'.$this->crlf;
// Von Montag bis Samstag
$datum_now=time();
$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);
if(isset($anmerkung))
unset($anmerkung);
if(isset($titel_arr))
unset($titel_arr);
$reservierung=false;
foreach ($this->std_plan[$i][$j] as $lehrstunde)
{
$unr[]=$lehrstunde->unr;
// Lektoren
$lektor[]=$lehrstunde->lektor;
// Lehrverband
$typ='';
if($lehrstunde->reservierung)
{
$studiengang = new studiengang();
$studiengang->load($lehrstunde->stg_kz);
$typ = $studiengang->typ;
}
$lvb=$typ.$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;
$titel_arr[]=$lehrstunde->titel;
$anmerkung[]=$lehrstunde->anmerkung;
if (!$reservierung)
$reservierung=$lehrstunde->reservierung;
}
if($gruppieren)
{
// 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.='<BR />'.$l;
}
else
$lkt='<BR />'.$lektor[0];
//echo $lkt;
// Lehrverband
if ($this->type!='verband')
{
$lehrverband=array_unique($lehrverband);
sort($lehrverband);
$lvb='';
foreach ($lehrverband as $l)
$lvb.='<BR />'.$l;
}
else
$lvb='<BR />'.$lehrverband[0];
// Lehrfach
if ($this->type=='verband')
{
$lehrfach=array_unique($lehrfach);
sort($lehrfach);
$lf='';
foreach ($lehrfach as $l)
$lf.=$l.'<BR />';
}
else
$lf=$lehrfach[0].'<BR />';
if(LVPLAN_ANMERKUNG_ANZEIGEN)
{
$anmerkung=array_unique($anmerkung);
sort($anmerkung);
$anm='';
foreach ($anmerkung as $a)
if ($a!='')
$anm.='<BR />'.$this->convert_html_chars($a);
else
$anm='';
}
// 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');return false;";
echo '" title="'.$this->convert_html_chars($titel).'" ';
echo ' href="#">';
// Ausgabe
//echo $lf;
echo mb_substr($lf, 0,-strlen('<BR />'));
if($titel!='' && !$reservierung)
{
echo '<img src="../../../skin/images/sticky.png" tooltip="'.$this->convert_html_chars($titel).'"/>';
}
//echo '<BR />';
if ($this->type=='ort' || $this->type=='lektor' || $this->type=='verband')
echo $lvb;
if ($this->type!='lektor')
echo $lkt;
if ($this->type!='ort')
echo '<BR />'.$this->std_plan[$i][$j][0]->ort;
if (LVPLAN_ANMERKUNG_ANZEIGEN)
{
echo $anm;
/* $anmerkung=array_unique($anmerkung);
foreach($anmerkung as $anm)
if($anm!='')
echo '<BR />'.$anm;
echo '<BR />anm'; */
}
echo '</A></DIV>'.$blink_aus.'</td>'.$this->crlf;
}
else
{
// mehrere Einheiten innerhalb einer Stunde sollen getrennt aufgelistet werden
$uEinheiten=array();
for($n=0;$n<count($unr);$n++)
{
$unrIndex=$this->searchForId($unr[$n], $uEinheiten);
if($unrIndex===FALSE)
{
/*
if($unr[$n]=='51561')
{
echo "<br><br>N=$n";
echo "unr:".$unr[$n];
echo "Data:".print_r($uEinheiten,true);
echo "<br><br>";
}*/
$unrIndex=count($uEinheiten);
$uEinheiten[$unrIndex]['unr']=$unr[$n];
$uEinheiten[$unrIndex]['lehrfach']=$lehrfach[$n];
if (isset($this->std_plan[$i][$j][$n]->farbe))
$uEinheiten[$unrIndex]['farbe']=$this->std_plan[$i][$j][$n]->farbe;
}
$uEinheiten[$unrIndex]['ort'][]=$this->std_plan[$i][$j][$n]->ort;
$uEinheiten[$unrIndex]['lehrverband'][]=$lehrverband[$n];
$uEinheiten[$unrIndex]['anmerkung'][]=$anmerkung[$n];
$uEinheiten[$unrIndex]['lektor'][]=$lektor[$n];
$uEinheiten[$unrIndex]['titel'][]=$titel_arr[$n];
}
// Ausgabe einer Stunde im Raster (HTML)
echo ' <td nowrap valign="top">';
// for($n=0;$n<count($uEinheiten);$n++)
foreach($uEinheiten as $key=>$uEinheit)
{
echo '<DIV align="center" ';
if (isset($uEinheit['farbe']))
echo 'style="background-color: #'.$uEinheit['farbe'].'; margin-bottom: 3px;"';
echo '>';
// 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='.$uEinheit['ort'][0]; //.'">'
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');return false;";
echo '" title="'.$this->convert_html_chars($uEinheit['titel'][0]).'" ';
echo ' href="#">';
// Ausgabe
//echo $lf;
echo $uEinheit['lehrfach'];
if($uEinheit['titel'][0]!='' && !$reservierung)
{
echo '<img src="../../../skin/images/sticky.png" tooltip="'.$this->convert_html_chars($uEinheit['titel'][0]).'"/>';
}
echo '<BR />';
if ($this->type=='ort' || $this->type=='lektor' || $this->type=='verband')
{
$uEinheit['lehrverband']=array_unique($uEinheit['lehrverband']);
foreach($uEinheit['lehrverband'] as $ueLehrverband)
echo $ueLehrverband."<BR />";
}
if ($this->type!='lektor')
{
$uEinheit['lektor']=array_unique($uEinheit['lektor']);
foreach($uEinheit['lektor'] as $ueLektor)
echo $ueLektor."<BR />";
}
if ($this->type!='ort' || $this->ort_kurzbz == 'all')
{
$uEinheit['ort']=array_unique($uEinheit['ort']);
foreach($uEinheit['ort'] as $ueOrt)
echo $ueOrt."<BR />";
}
if(LVPLAN_ANMERKUNG_ANZEIGEN)
{
$uEinheit['anmerkung']=array_unique($uEinheit['anmerkung']);
foreach($uEinheit['anmerkung'] as $ueAnmerkung)
if ($ueAnmerkung!='')
echo $ueAnmerkung."<BR />";
}
echo '</A></DIV>';
}
echo '</td>'.$this->crlf;
}
}
else
{
echo ' <td valign="center" align="center">';
$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))
{
$check_all_checkbox='';
echo '<table><tr><br>';
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'))
{
$check_all_checkbox='';
//Lektor
echo '<td>'.$p->t('lvplan/lektor').':</td>
<td><SELECT name="user_uid">'.$this->crlf;
$qry = "SELECT uid, kurzbz, vorname, nachname FROM campus.vw_mitarbeiter
WHERE aktiv=true
ORDER BY nachname, 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->nachname.' '.$row->vorname.' - '.$row->uid.'</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="E">E</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 .= $this->db_add_param($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;
echo '<td><input type="checkbox" name="check_all" onclick="toggle_checkboxes(this);" /> alle auswählen</td>'.$this->crlf;
echo '</tr><tr>';
}
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="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>
<menupopup id="stplPopupMenue">
<menuitem label="Ressourcen zuordnen" oncommand="TimeTableWeekMarkiere(document.popupNode);BetriebsmittelZuordnen(document.popupNode);" />
<menuitem label="Raumvorschlag" oncommand="StplSearchRoom(document.popupNode);" />
<menuitem label="Entfernen" oncommand="TimeTableWeekMarkiere(document.popupNode);TimetableDeleteEntries()" />
</menupopup>
</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 class="stplweek_vbox" style="border:1px solid black; background-color:'.$bgcolor.'"';
if($tooltip!='')
{
echo ' tooltiptext="'.$this->convert_html_chars($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;
unset($kollisionsmeldungen);
if (isset($a_unr))
unset($a_unr);
if (isset($a_lvb))
unset($a_lvb);
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 = ".$this->db_add_param($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 = ".$this->db_add_param($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=".$this->db_add_param($j)."
GROUP BY datum, stunde, student_uid
HAVING count(student_uid)>1 ";
if(count($a_unr)>0)
{
// Nur die Eintraege als kollision anzeigen, die auch aktuell im Tempus sichtbar sind
// Dazu werden die UNRs der betroffenen Studierenden zuerst ein ein Array gruppiert und danach
// verglichen ob die angezeigte UNR dabei ist.
// Etwas kompliziert aber performanter als wenn die betroffenen UNRs zusätzlich zum WHERE hinzugefügt werden
$qry.=" AND array_agg(unr) && ARRAY[".implode('::bigint,',$a_unr)."::bigint] ";
// ==> AND array_agg(unr) && ARRAY[123::bigint,345::bigint]
}
$qry.="ORDER BY datum, stunde, student_uid LIMIT 1;";
if($stud_result = $this->db_query($qry))
{
if($this->db_num_rows($stud_result)>0)
{
$kollision++;
$stud_row = $this->db_fetch_object($stud_result);
foreach($a_unr as $kollision_unr)
$kollisionsmeldungen[$kollision_unr][]=' Studentenkollision '.$stud_row->student_uid;
}
}
}
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)
{
$lvb_unr_arr[$a]=$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++;
$kollisionsmeldungen[$lvb_unr_arr[$a]][]=' Gruppe '.trim($lvb[$a][$b]).' / '.trim($lvb[$c][$d]);
$kollisionsmeldungen[$lvb_unr_arr[$c]][]=' Gruppe '.trim($lvb[$a][$b]).' / '.trim($lvb[$c][$d]);
}
}
}
}
// 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);
$farbe='';
$tooltip_anmerkung=array();
$paramList='';
$z=0;
$reservierung=false;
$stundenplan_ids=array();
$titel='';
if(isset($raumcheck))
unset($raumcheck);
if(isset($lktcheck))
unset($lktcheck);
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.='&amp;reservierung_id'.$z++.'='.$lehrstunde->stundenplan_id;
$reservierung=true;
}
else
{
$paramList.='&amp;stundenplan_id'.$z++.'='.$lehrstunde->stundenplan_id;
$stundenplan_ids[]=$lehrstunde->stundenplan_id;
}
if(isset($lehrstunde->farbe) && $farbe=='')
$farbe=$lehrstunde->farbe;
$titel.=htmlspecialchars($lehrstunde->titel);
$anmerkung=htmlspecialchars($lehrstunde->anmerkung);
$tooltip_anmerkung[]=$titel.' '.$anmerkung;
}
if(isset($raumcheck[$lehrstunde->ort]) && $raumcheck[$lehrstunde->ort]!=$lehrstunde->unr)
{
$kollision++;
$kollisionsmeldungen[$lehrstunde->unr][]=" Ort ".$lehrstunde->ort;
$kollisionsmeldungen[$raumcheck[$lehrstunde->ort]][]=" Ort ".$lehrstunde->ort;
}
else
$raumcheck[$lehrstunde->ort]=$lehrstunde->unr;
if(isset($lktcheck[$lehrstunde->lektor]) && $lktcheck[$lehrstunde->lektor]!=$lehrstunde->unr)
{
if(!in_array($lehrstunde->lektor_uid, unserialize(KOLLISIONSFREIE_USER)))
{
$kollision++;
$kollisionsmeldungen[$lehrstunde->unr][]=" LektorIn ".$lehrstunde->lektor; //." ".$lehrstunde->unr."!=".$lktcheck[$lehrstunde->lektor];
$kollisionsmeldungen[$lktcheck[$lehrstunde->lektor]][]=" LektorIn ".$lehrstunde->lektor; //." ".$lehrstunde->unr."!=".$lktcheck[$lehrstunde->lektor];
}
}
else
$lktcheck[$lehrstunde->lektor]=$lehrstunde->unr;
}
// 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 (isset($kollisionsmeldungen[$unr])
|| (isset($kollisionsmeldung) && count($kollisionsmeldungen, COUNT_RECURSIVE)==0 && $kollision>0))
{
$blink_ein='<html:blink>';// .$kollision;
$blink_aus='</html:blink>';
}
else
{
$blink_ein='';
$blink_aus='';
}
$stg_obj = new studiengang();
$stg_obj->load($stg_kz);
$tooltip_anmerkung = array_unique($tooltip_anmerkung);
$tooltip_gesamt = '('.$updatevonam.') '.implode(',',$tooltip_anmerkung);
if(isset($kollisionsmeldungen[$unr]))
$tooltip_gesamt .= ' Kollision wegen:'.implode(',',array_unique($kollisionsmeldungen[$unr]));
// Ausgabe
echo '<button id="buttonSTPL'.$count.'"
tooltiptext="'.$this->convert_html_chars($tooltip_gesamt).'"
style="border:1px solid transparent;'.((isset($farbe) && $farbe!='')?'background-color:#'.$farbe:'').';-moz-appearance:none"
styleOrig="border:1px solid transparent;'.((isset($farbe) && $farbe!='')?'background-color:#'.$farbe:'').';-moz-appearance:none" ';
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);"
$button_orte = $this->ort_kurzbz;
if($button_orte=='')
$button_orte=$ort[0];
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="'.$button_orte.'">';
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.'"/>';
}
// Zugeteilte Ressourcen Anzeigen
$betriebsmittel = new betriebsmittel();
if($betriebsmittel->getBetriebsmittelStundenplan($stundenplan_ids))
{
if(count($betriebsmittel->result)>0)
{
$ressourceinfo='';
foreach($betriebsmittel->result as $row)
$ressourceinfo.=$row->beschreibung.' ';
echo '<image src="../../skin/images/group.png" tooltip="'.$this->convert_html_chars($ressourceinfo).'"/>';
}
}
echo '<html:br />';
echo $lvb;
if ($this->type!='lektor')
echo $lkt;
if ($this->type!='ort')
echo $orte;
if(LVPLAN_ANMERKUNG_ANZEIGEN)
echo $anmerkung;
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 '<description class="stplweek_tagesinfo">'.date("D",$datum).'-'.$j.'</description>';
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[]='';
if(!isset($lehrverband[$i]))
$lehrverband[$i]= new stdClass();
$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=".$this->db_add_param($r);
$rtype=mb_substr($rtype,3);
//Lektor
$lektor=array_unique($lektor);
$lkt='';
foreach ($lektor as $l)
$lkt.=" OR uid=".$this->db_add_param($l);
$lkt=mb_substr($lkt,3);
// Einheiten
$gruppe=array_unique($gruppe);
$gruppen='';
foreach ($gruppe as $g)
if ($g!='')
$gruppen.=" OR gruppe_kurzbz=".$this->db_add_param($g);
//$gruppen=mb_substr($gruppen,3);
//Lehrverband
//$lehrverband=array_unique($lehrverband);
$lvb='';
foreach ($lehrverband as $l)
{
$lvb.=" OR (studiengang_kz=".$this->db_add_param($l->stg_kz)." AND semester=".$this->db_add_param($l->sem);
if ($l->ver!='' && $l->ver!=' ' && $l->ver!=null)
{
$lvb.=" AND (verband=".$this->db_add_param($l->ver)." OR verband IS NULL OR verband='')";
if ($l->grp!='' && $l->grp!=' ' && $l->grp!=null)
$lvb.=" AND (gruppe=".$this->db_add_param($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>=".$this->db_add_param($this->datum_begin)." AND datum<".$this->db_add_param($this->datum_end)." AND
($lkt $gruppen OR ($lvb) ) AND unr!=".$this->db_add_param($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>=".$this->db_add_param($this->datum_begin)." AND datum<".$this->db_add_param($this->datum_end)." AND unr!=".$this->db_add_param($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>=".$this->db_add_param($this->datum_begin)." AND datum<".$this->db_add_param($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=".$this->db_add_param($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=".$this->db_add_param($r);
$raumtypalt=array_unique($raumtypalt);
foreach ($raumtypalt as $r)
$rtype.=" OR raumtyp_kurzbz=".$this->db_add_param($r);
$rtype=mb_substr($rtype,3);
//Lektor
$lektor=array_unique($lektor);
$lkt='';
foreach ($lektor as $l)
$lkt.=" OR mitarbeiter_uid=".$this->db_add_param($l);
$lkt=mb_substr($lkt,3);
//Dummy Lektor kollidiert nicht
$lkt='(('.$lkt.') AND mitarbeiter_uid not in ('.$this->db_implode4SQL(unserialize(KOLLISIONSFREIE_USER)).'))';
// Gruppen
$gruppen='';
if (isset($gruppe))
{
$gruppe=array_unique($gruppe);
foreach ($gruppe as $g)
$gruppen.=" OR gruppe_kurzbz=".$this->db_add_param($g);
//$gruppen=mb_substr($gruppen,3);
}
//Lehrverband
//$lehrverband=array_unique($lehrverband);
$lvb='';
foreach ($lehrverband as $l)
{
$lvb.=" OR (studiengang_kz=".$this->db_add_param($l->stg_kz)." AND semester=".$this->db_add_param($l->sem);
if ($l->ver!='' && $l->ver!=' ' && $l->ver!=null)
{
$lvb.=" AND (verband=".$this->db_add_param($l->ver)." OR verband IS NULL OR verband='' OR verband=' ')";
if ($l->grp!='' && $l->grp!=' ' && $l->grp!=null)
$lvb.=" AND (gruppe=".$this->db_add_param($l->grp)." OR gruppe IS NULL OR gruppe='' OR gruppe=' ')";
}
$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();
$orte = array();
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>=".$this->db_add_param($datum_begin)." AND datum<".$this->db_add_param($datum_end)." AND
($lkt $gruppen OR ($lvb) )";
if (is_numeric($unr))
$sql_query.=" AND unr!=".$this->db_add_param($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>=".$this->db_add_param($datum_begin)." AND datum<".$this->db_add_param($datum_end)." AND
($rtype)";
if (is_numeric($unr))
$sql_query.=" AND unr!=".$this->db_add_param($unr);
// Reservierungen beruecksichtigen
$sql_query.=" UNION SELECT distinct datum, stunde, ort_kurzbz FROM campus.tbl_reservierung
WHERE datum>=".$this->db_add_param($datum_begin)." AND datum<".$this->db_add_param($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)
{
if(isset($this->std_plan[$t][$s][0]->frei_orte))
{
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
{
if(isset($this->std_plan[$t][$s][0]->frei_orte))
{
// 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)
{
$return = array();
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)
&& !($this->std_plan[$i][$j][$idx]->reservierung && $this->std_plan[$i][$j][$idx]->lektor!=$this->std_plan[$i][$j+1][$idx]->lektor))
{
//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)
&& !($this->std_plan[$i][$j][$idx]->reservierung && $this->std_plan[$i][$j][$idx]->lektor!=$this->std_plan[$i][$j+2][$idx]->lektor))
{
//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)
&& !($this->std_plan[$i][$j][$idx]->reservierung && $this->std_plan[$i][$j][$idx]->lektor!=$this->std_plan[$i][$j+3][$idx]->lektor))
{
//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.(LVPLAN_ANMERKUNG_ANZEIGEN?$this->crlf.$this->std_plan[$i][$j][$idx]->anmerkung:'').'","StundenplanFH","'.$this->std_plan[$i][$j][$idx]->ort.'","Normal","Aus",,"Normal","2"';
}
elseif ($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'.str_replace(',',' ',$lvb.$this->std_plan[$i][$j][$idx]->ort.$this->std_plan[$i][$j][$idx]->lektor.$lehrfach[$idx].$start_date_time_ical.$this->crlf)
.'SUMMARY:'.str_replace(',',' ',$lehrfach[$idx].' '.$this->std_plan[$i][$j][$idx]->ort.' - '.$lvb.$this->crlf)
.'DESCRIPTION:'.str_replace(',',' ',$lehrfach[$idx].'\n'.$this->std_plan[$i][$j][$idx]->lektor.'\n'.$lvb.'\n'.$this->std_plan[$i][$j][$idx]->ort.(LVPLAN_ANMERKUNG_ANZEIGEN?'\n'.$this->std_plan[$i][$j][$idx]->anmerkung:'').$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';
}
elseif ($target=='freebusy')
{
$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
$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
// Zeit in UTC umwandeln
$date = new DateTime($start_date_time_ical, new DateTimeZone('Europe/Vienna'));
$date->setTimezone(new DateTimeZone('UTC'));
$start_date_time_ical = $date->format('Ymd\THis').'Z';
$date = new DateTime($end_date_time_ical, new DateTimeZone('Europe/Vienna'));
$date->setTimezone(new DateTimeZone('UTC'));
$end_date_time_ical = $date->format('Ymd\THis').'Z';
echo $this->crlf,'FREEBUSY: ',$start_date_time_ical,'/',$end_date_time_ical;
}
elseif ($target=='return')
{
$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
$UID = 'FH'.$lvb.$this->std_plan[$i][$j][$idx]->ort.$this->std_plan[$i][$j][$idx]->lektor.$lehrfach[$idx].$start_date_time_ical;
$Summary = $lehrfach[$idx].' '.$this->std_plan[$i][$j][$idx]->ort.' - '.$lvb;
$description = $lehrfach[$idx].'\n'.$this->std_plan[$i][$j][$idx]->lektor.'\n'.$lvb.'\n'.$this->std_plan[$i][$j][$idx]->ort;
$UID = str_replace(',',' ',$UID);
$Summary = str_replace(',',' ',$Summary);
$description = str_replace(',',' ',$description);
$return[]=array('UID'=>$UID,
'unr'=>$unr,
'Summary'=>$Summary,
'Description'=>$description,
'dtstart'=>$start_date_time_ical,
'dtend'=>$end_date_time_ical,
'reservierung'=>$this->std_plan[$i][$j][$idx]->reservierung,
'reservierung_id'=>($this->std_plan[$i][$j][$idx]->reservierung?$this->std_plan[$i][$j][$idx]->stundenplan_id:''),
'updateamum'=>$this->std_plan[$i][$j][$idx]->updateamum,
'data'=>'BEGIN:VEVENT'.$this->crlf
.'UID:'.$UID.$this->crlf
.'SUMMARY:'.$Summary.$this->crlf
.'DESCRIPTION:'.$description.$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.(LVPLAN_ANMERKUNG_ANZEIGEN?$this->crlf.$this->std_plan[$i][$j][$idx]->anmerkung:'').'","Stundenplan",';
echo '"'.$start_date.'","'.$start_time.'","'.$end_date.'","'.$end_time.'",,,,,';
}
}
}
}
$this->datum=jump_day($this->datum, 1);
}
if($target=='return')
return $return;
else
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)
&& !$this->std_plan[$tag][$stunde][$idx]->reservierung && !$this->std_plan[$tag][$stunde][$idx1]->reservierung)
return true;
else
return false;
}
else
return false;
}
protected function searchForId($id, $array)
{
foreach ($array as $key => $val)
{
if ($val['unr'] == $id)
{
return $key;
}
}
return false;
}
/**
* Gibt einen HTML-Dialog mit den Kalenderwochen aus
* @param $link
*/
protected function jahreskalenderjump_hoverbox($link)
{
$sprache = getSprache();
$p=new phrasen($sprache);
$crlf=crlf();
$datum=time();
$woche=kalenderwoche($datum);
$wochenmontag=montag($datum);
echo '<table align="center"><tr valign="top"><td>
<div class="hoverbox">
<div class="preview">
<img src="../../../skin/images/down_lvplan.png" border="0"/>
<div class="hoverbox_inhalt">
<table class="hoverbox"><tr>'.$crlf;
for ($anz=1;$anz<25;$anz++)
{
$linknew=$link.'&datum='.$datum;
if ($woche==53)
$woche=1;
echo ' <td style="padding: 3px;" align="center"><A HREF="'.$linknew.'"><nobr>KW '.$woche.'</nobr><br>'.date('d.m', $wochenmontag).'</A></td>'.$crlf;
if ($anz%8==0)
echo ' </tr><tr align="center">'.$crlf;
$datum+=60*60*24*7;
$woche++;
$wochenmontag+=60*60*24*7;
}
echo ' </tr></table></div></div></div></td></tr></table>'.$crlf;
}
}
?>