mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-06-01 20:29:29 +00:00
2677 lines
98 KiB
PHP
2677 lines
98 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;
|
|
echo ' - '.$this->ort_bezeichnung;
|
|
echo ($this->ort_max_person!=''?' - ( '.$this->ort_max_person.' '.$p->t('lvplan/personen').' )':'');
|
|
echo ($this->ort_content_id!=''?' - <a href="../../../cms/content.php?content_id='.$this->ort_content_id.'" target="_self">'.$p->t('lvplan/rauminformationenAnzeigen').'</a>':'');
|
|
echo '<span id="software"></span>';
|
|
echo '<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 ' <strong>'.$p->t('global/kalender').': </strong>'.$this->crlf;
|
|
echo $this->crlf;
|
|
//echo ' '.$p->t('lvplan/uebersicht').': <A href="'.$kal_link_ws.'&format=html" target="_blank" title="HTML">'.$this->studiensemester_now->name.'</A> '.$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=excel" title="excel"><IMG src="../../../skin/images/xls.png" height="30" alt="Excel" 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 ' '.$p->t('lvplan/uebersicht').': <A href="'.$kal_link_ss.'&format=html" target="_blank" title="HTML">'.$this->studiensemester_next->name.'</A> '.$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=excel" title="excel"><IMG src="../../../skin/images/xls_light.png" height="30" alt="Excel" 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 ' <img class="lvplanbutton" src="../../../skin/images/left_lvplan.png" 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 style="text-decoration:none" href="stpl_week.php?type='.$this->type.'&datum='.$this->datum.'&ort_kurzbz='.$next_ort->ort_kurzbz.'">'.$this->crlf;
|
|
echo ' <img class="lvplanbutton" src="../../../skin/images/right_lvplan.png" title="'.$next_ort->ort_kurzbz.'"> '.$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 '"> <img class="lvplanbutton" src="../../../skin/images/left_lvplan.png" title="'.$p->t('lvplan/eineWocheZurueck').'"> </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 '"> <img class="lvplanbutton" src="../../../skin/images/right_lvplan.png" title="'.$p->t('lvplan/eineWocheVor').'"> </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')
|
|
{
|
|
$ort = new ort();
|
|
$ort->load($this->ort_kurzbz);
|
|
if($ort->reservieren)
|
|
echo '<form name="reserve" method="post" action="stpl_week.php">'.$this->crlf;
|
|
else
|
|
$raumres=false;
|
|
}
|
|
|
|
//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').' <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=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>';
|
|
}
|
|
else
|
|
{
|
|
if($this->type=='ort')
|
|
{
|
|
echo '<table><tr><td><br>';
|
|
echo '<span style="color: orange">'.$p->t('lvplan/raumreservierungAufZeitraumEingeschraenkt',array(date("d.m.Y",$datum_res_lektor_start),date("d.m.Y",$datum_res_lektor_ende))).'</span>';
|
|
echo '</td></tr></table>';
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 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
|
|
$stunden_arr=array();
|
|
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);
|
|
$stunden_arr[$row->stunde]['beginn']=$beginn;
|
|
$stunden_arr[$row->stunde]['ende']=$ende;
|
|
$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];
|
|
|
|
// Sonntag wie Ferien markieren
|
|
if($i==7)
|
|
$bgcolor='#FFFF55';
|
|
|
|
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.='&reservierung_id'.$z++.'='.$lehrstunde->stundenplan_id;
|
|
$reservierung=true;
|
|
}
|
|
else
|
|
{
|
|
if(!in_array($lehrstunde->stundenplan_id, $stundenplan_ids))
|
|
{
|
|
$paramList.='&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)"':'').'
|
|
/>';
|
|
}
|
|
}
|
|
}
|
|
|
|
if(defined('TEMPUS_TAGESINFO_FORMAT'))
|
|
$tagesinfo = TEMPUS_TAGESINFO_FORMAT;
|
|
else
|
|
$tagesinfo = '%t %s';
|
|
$tagesinfo = str_replace('%t',date("D",$datum),$tagesinfo);
|
|
$tagesinfo = str_replace('%b',$stunden_arr[$j]['beginn'],$tagesinfo);
|
|
$tagesinfo = str_replace('%e',$stunden_arr[$j]['ende'],$tagesinfo);
|
|
$tagesinfo = str_replace('%s',$j,$tagesinfo);
|
|
echo '<description class="stplweek_tagesinfo">'.$tagesinfo.'</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));
|
|
if(!isset($raster[$tag][$row->stunde]))
|
|
$raster[$tag][$row->stunde]=new stdClass();
|
|
$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);
|
|
if (isset($lektor_uids))
|
|
unset($lektor_uids);
|
|
if (isset($stunden_arr))
|
|
unset($stunden_arr);
|
|
foreach ($this->std_plan[$i][$j] as $lehrstunde)
|
|
{
|
|
|
|
$unr[]=$lehrstunde->unr;
|
|
// Lektoren
|
|
$lektor[]=$lehrstunde->lektor;
|
|
$lektor_uids[]=$lehrstunde->lektor_uid;
|
|
// Lehrverband
|
|
$lvb=$lehrstunde->stg.'-'.$lehrstunde->sem;
|
|
$stunden_arr[]=$j;
|
|
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.
|
|
*
|
|
* 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
|
|
|
|
$blockflag=false;
|
|
for($blockstunden=1;$blockstunden<=$num_rows_stunde;$blockstunden++)
|
|
{
|
|
if (isset($this->std_plan[$i][$j+$blockstunden][$idx]) && isset($this->std_plan[$i][$j+$blockstunden][$idx]->stundenplan_id)
|
|
&& ($this->std_plan[$i][$j][$idx]->unr == $this->std_plan[$i][$j+$blockstunden][$idx]->unr)
|
|
&& $this->std_plan[$i][$j][$idx]!='0' && $k<($num_rows_stunde-$blockstunden)
|
|
&& !($this->std_plan[$i][$j][$idx]->reservierung && $this->std_plan[$i][$j][$idx]->lektor!=$this->std_plan[$i][$j+$blockstunden][$idx]->lektor))
|
|
{
|
|
|
|
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+$blockstunden));
|
|
$stunden_arr[]=$row->stunde;
|
|
$end_time=$row->ende;
|
|
$blockflag=true;
|
|
}
|
|
else
|
|
{
|
|
if(!$blockflag)
|
|
{
|
|
$row = $this->db_fetch_object($this->stunde, $k);
|
|
$stunden_arr[]=$row->stunde;
|
|
$end_time=$row->ende;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//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.$end_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.$end_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,
|
|
'lehrfach_id'=>(isset($this->std_plan[$i][$j][$idx]->lehrfach_id)?$this->std_plan[$i][$j][$idx]->lehrfach_id:''),
|
|
'ort'=>$this->std_plan[$i][$j][$idx]->ort,
|
|
'lektor_uid'=>array_unique($lektor_uids),
|
|
'gruppen'=>array_unique($lehrverband),
|
|
'stunden'=>array_unique($stunden_arr),
|
|
'titel'=>$this->std_plan[$i][$j][$idx]->titel,
|
|
'unr'=>$unr,
|
|
'Summary'=>$Summary,
|
|
'Description'=>$description,
|
|
'start_date'=>$start_date,
|
|
'end_date'=>$end_date,
|
|
'start_time'=>$start_time,
|
|
'end_time'=>$end_time,
|
|
'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;
|
|
}
|
|
}
|
|
?>
|