, * Andreas Oesterreicher and * Rudolf Hangl . */ /**************************************************************************** * @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'); class wochenplan extends basis_db { public $conn; // @brief Connection zur Datenbank public $crlf; // @brief Return Linefeed public $type; // @brief Typ des Plans (Student, Lektor, Verband, Ort) public $user; // @brief Benutzergruppe public $user_uid; // @brief id in der Datenbank des Benutzers public $link; // @brief Link auf eigene Seite public $kal_link; // @brief Link auf den kalender public $stg_kz; // @brief Kennzahl des Studiengangs public $stg_bez; // @brief Bezeichnung Studiengang public $stg_kurzbz; // @brief Kurzbezeichnung Studiengang public $stg_kurzbzlang;// @brief lange Kurzbezeichnung Studiengang public $sem; // @brief Semester public $ver; // @brief Verband (A,B,C,...) public $grp; // @brief Gruppe (1,2) public $pers_uid; // @brief Account Name der Person (PK) public $pers_titelpost; // @brief Titel der Person public $pers_titelpre; // @brief Titel der Person public $pers_nachname; // @brief Personendaten public $pers_vorname; // @brief Personendaten public $pers_vornamen; // @brief Personendaten public $ort_kurzbz; // @brief Ort PK public $ort_bezeichnung; public $ort_planbezeichnung; public $ort_ausstattung; public $ort_max_person; public $gruppe_kurzbz; public $gruppe_bezeichnung; public $datum; // @brief Datum des Montags der zu zeichnenden Woche public $datum_nextweek; public $datum_next4week; public $datum_prevweek; public $datum_prev4week; public $datum_begin; public $datum_end; public $kalenderwoche; public $studiensemester_now; public $studiensemester_next; public $std_plan; public $stunde; public $wochenplan; public $errormsg; public $fachbereich_kurzbz; /** * 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) { // Parameter Checken // Typ des Stundenplans if ($type=='student' || $type=='lektor' || $type=='verband' || $type=='gruppe' || $type=='ort' || $type=='fachbereich') $this->type=$type; else { $this->errormsg='Error: type is not defined!'; return false; } // Person if (($type=='student' || $type=='lektor') && ($uid==NULL || $uid=='')) { $this->errormsg='Fehler: uid der Person ist nicht gesetzt'; return false; } else $this->pers_uid=$uid; // Ort if ($type=='ort' && $ort_kurzbz==NULL) { $this->errormsg='Fehler: Kurzbezeichnung des Orts ist nicht gesetzt'; return false; } elseif ($type=='ort') $this->ort_kurzbz=$ort_kurzbz; else $this->ort_kurzbz=''; // Lehrverband if ($type=='verband' && $studiengang_kz==NULL) { $this->errormsg='Fehler: Kennzahl des Studiengangs ist nicht gesetzt'; return false; } elseif($type=='verband') { $this->stg_kz=$studiengang_kz; $this->sem=$sem; $this->ver=$ver; $this->grp=$grp; } // Einheit if ($type=='gruppe' && $gruppe==NULL) { $this->errormsg='Fehler: Kurzbezeichnung der Gruppe ist nicht gesetzt'; return false; } elseif ($type=='gruppe') $this->gruppe_kurzbz=$gruppe; if($type=='fachbereich') { if(is_null($fachbereich_kurzbz)) { $this->errormsg = 'Fachbereich nicht gesetzt'; return false; } $this->fachbereich_kurzbz=$fachbereich_kurzbz; } // 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') { $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; } } // Studiengangsdaten ermitteln if ($this->type=='student' || $this->type=='verband') { $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()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') { // 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); 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.'
'; $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.'
'; 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.'
'; } unset($this->wochenplan); return true; } /** * Schreibt den Stundenplan Header im HTML-Format * */ public function draw_header() { $sprache = getSprache(); $p=new phrasen($sprache); echo ''.$this->crlf; echo ' '.$this->crlf; echo ' '.$this->crlf; // Kalenderjump //echo ' '.$this->crlf; echo ' '.$this->crlf; echo '
'.$this->crlf; echo '

'; if ($this->type=='student' || $this->type=='lektor') echo ''.$p->t('global/person').': '.$this->pers_titelpre.' '.$this->pers_vorname.' '.$this->pers_nachname.' '.$this->pers_titelpost.' - '.$this->pers_uid.'
'; if ($this->type=='student' || $this->type=='verband') { echo ''.$p->t('global/studiengang').': '.$this->stg_kuerzel.' - '.($sprache=='English' && $this->stg_english!=''?$this->stg_english:$this->stg_bez).'
'; echo $p->t('global/semester').': '.$this->sem.'
'; if ($this->ver!='0' && $this->ver!='' && $this->ver!=null) echo $p->t('global/verband').': '.$this->ver.'
'; if ($this->grp!='0' && $this->grp!='' && $this->grp!=null) echo $p->t('global/gruppe').': '.$this->grp.'
'; $this->link.='&stg_kz='.$this->stg_kz.'&sem='.$this->sem.'&ver='.$this->ver.'&grp='.$this->grp; } if ($this->type=='ort') echo ''.$p->t('lvplan/raum').': '.$this->ort_kurzbz.' - '.$this->ort_bezeichnung.' - '.($this->ort_max_person!=''?'( '.$this->ort_max_person.' '.$p->t('lvplan/personen').' )':'').($this->ort_content_id!=''?' - '.$p->t('lvplan/rauminformationenAnzeigen').'':'').'
'.$this->ort_ausstattung; echo '

'.$this->crlf; echo ' '; //echo ' '; echo '
'.$p->t('lvplan/semesterplaene').'
'.$this->crlf; //Kalender $this->kal_link.='&pers_uid='.$this->pers_uid.'&ort_kurzbz='.$this->ort_kurzbz.'&stg_kz='.$this->stg_kz.'&sem='.$this->sem.'&ver='.$this->ver.'&grp='.$this->grp.'&gruppe_kurzbz='.$this->gruppe_kurzbz; //global $kalender_begin_ws, $kalender_ende_ws, $kalender_begin_ss, $kalender_ende_ss; $kal_link_ws=$this->kal_link.'&begin='.$this->studiensemester_now->start.'&ende='.$this->studiensemester_now->ende; $kal_link_ss=$this->kal_link.'&begin='.$this->studiensemester_next->start.'&ende='.$this->studiensemester_next->ende; //echo '        '.$p->t('global/kalender').':   '.$this->crlf; echo $this->crlf; //echo ' '.$p->t('lvplan/uebersicht').': '.$this->studiensemester_now->name.' '.$this->crlf; echo $this->studiensemester_now->name.'
'.$this->crlf; echo ' HTML'.$this->crlf; echo ' CSV'.$this->crlf; echo ' CSV-Outlook'.$this->crlf; echo ' vCal Version 1.0'.$this->crlf; echo ' vCal Version 2.0'.$this->crlf; echo '
'.$p->t('lvplan/semesterplaene').''; //echo '     '.$p->t('lvplan/uebersicht').': '.$this->studiensemester_next->name.' '.$this->crlf; echo ' '.$this->studiensemester_next->name.'
'.$this->crlf; echo ' HTML'.$this->crlf; echo ' CSV'.$this->crlf; echo ' CSV-Outlook'.$this->crlf; echo ' iCal Version 1.0'.$this->crlf; echo ' iCal Version 2.0'.$this->crlf; echo '
'.$this->crlf; echo '
'.$this->crlf; //jahreskalenderjump($this->link); //echo '
'.$this->crlf.$this->crlf; // Jump Wochenweise if ($this->type=='verband') $link_parameter='&stg_kz='.$this->stg_kz.'&sem='.$this->sem.'&ver='.$this->ver.'&grp='.$this->grp; if ($this->type=='student' || $this->type=='lektor') $link_parameter='&pers_uid='.$this->pers_uid; // Ort Jump if ($this->type=='ort') { // Orte abfragen $sql_query="SELECT * FROM public.tbl_ort WHERE aktiv AND lehre ORDER BY ort_kurzbz"; if(!$this->db_query($sql_query)) die($this->db_last_error()); $num_rows_ort=$this->db_num_rows(); // vorigen Ort bestimmen for ($i=0;$i<($num_rows_ort-1);$i++) { $row = $this->db_fetch_object(null,$i+1); if ($row->ort_kurzbz==$this->ort_kurzbz) $prev_ort=$this->db_fetch_object(null,$i); } // naechsten Ort bestimmen for ($i=1;$i<$num_rows_ort;$i++) { $row = $this->db_fetch_object(null, $i-1); if ($row->ort_kurzbz==$this->ort_kurzbz) $next_ort=$this->db_fetch_object(null,$i); } // Ort Jump echo '
'.$this->crlf; echo '

'.$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 ' '.$this->crlf; echo '     '.$this->crlf; echo ' '.$this->crlf; } echo " '.$this->crlf; if (isset($next_ort)) { echo ' '.$this->crlf; echo '     '.$this->crlf; echo ' '.$this->crlf; } echo '

'; $link_parameter='&ort_kurzbz='.$this->ort_kurzbz; } echo '

'; // 4 Wochen zurueck echo ''.$this->crlf; echo ''.$this->crlf; echo ''; // 1 Woche zurueck echo '    '; // Aktuelle KW echo ''.$p->t('eventkalender/kw').' '.$this->kalenderwoche; echo ''; // 1 Woche nach vor echo '    '; // 4 Wochen nach vor echo ''; echo '

'; //Kalenderjump mit Hoverbox jahreskalenderjump_hoverbox($this->link); return true; } /** * Zeichnen der Stundenplanwoche in HTML */ public function draw_week($raumres, $user_uid='', $gruppieren=LVPLAN_LEHREINHEITEN_GRUPPIEREN) { global $tagbez; $sprache = getSprache(); $spracheLoad = new sprache(); $spracheLoad->load($sprache); $p=new phrasen($sprache); $o_datum=new datum(); // Stundentafel abfragen $sql_query="SELECT stunde, beginn, ende FROM lehre.tbl_stunde ORDER BY stunde"; if(!$this->db_query($sql_query)) die($this->db_last_error()); $result_stunde = $this->db_result; $num_rows_stunde = $this->db_num_rows($result_stunde); // Formularbeginn wenn Lektor if ($raumres && $this->type=='ort') echo '
'.$this->crlf; //Tabelle zeichnen echo ' '.$this->crlf; // Kopfzeile darstellen echo ''.$this->crlf; echo ' '.$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 ' '.$this->crlf; } echo ''.$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 ''.$this->crlf; //.strftime("%A %d %B %Y",$this->datum) echo ''.$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.='
'.$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]; // Lehrfach if ($this->type=='verband') { $lehrfach=array_unique($lehrfach); sort($lehrfach); $lf=''; foreach ($lehrfach as $l) $lf.=$l.'
'; } else $lf=$lehrfach[0].'
'; if(LVPLAN_ANMERKUNG_ANZEIGEN) { $anmerkung=array_unique($anmerkung); sort($anmerkung); $anm=''; foreach ($anmerkung as $a) $anm.='
'.$a; } // Blinken oder nicht ? if ($kollision) { $blink_ein=''.$kollision; $blink_aus=''; } else { $blink_ein=''; $blink_aus=''; } // Ausgabe einer Stunde im Raster (HTML) echo ' '.$this->crlf; } else { // mehrere Einheiten innerhalb einer Stunde sollen getrennt aufgelistet werden $uEinheiten=array(); for($n=0;$n
N=$n"; echo "unr:".$unr[$n]; echo "Data:".print_r($uEinheiten,true); echo "

"; }*/ $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 '
'.$this->crlf; } } else { echo ' '.$this->crlf; } } echo ' '.$this->crlf; $datum=jump_day($datum, 1); } echo '
'.$p->t('global/stunde').' 
'.$p->t('global/beginn').' 
'.$p->t('global/ende').' 
'.$stunde.'
 '.$beginn .' 
 '.$ende.' 
'.strftime("%A",$datum).'
'.strftime("%e. %b %Y",$datum).'
'.$tagbez[$spracheLoad->index][$i].'
'.strftime("%e. %b %Y",$datum).'
std_plan[$i][$j][0]->farbe)) echo 'style="background-color: #'.$this->std_plan[$i][$j][0]->farbe.';"'; echo '>'.$blink_ein.''.$blink_aus.''; // for($n=0;$n$uEinheit) { echo '
'; // Link zu Details setzten echo '' 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 ''; } echo '
'; if ($this->type=='ort' || $this->type=='lektor' || $this->type=='verband') { $uEinheit['lehrverband']=array_unique($uEinheit['lehrverband']); foreach($uEinheit['lehrverband'] as $ueLehrverband) echo $ueLehrverband."
"; } if ($this->type!='lektor') { $uEinheit['lektor']=array_unique($uEinheit['lektor']); foreach($uEinheit['lektor'] as $ueLektor) echo $ueLektor."
"; } if ($this->type!='ort') { $uEinheit['ort']=array_unique($uEinheit['ort']); foreach($uEinheit['ort'] as $ueOrt) echo $ueOrt."
"; } if(LVPLAN_ANMERKUNG_ANZEIGEN) { $uEinheit['anmerkung']=array_unique($uEinheit['anmerkung']); foreach($uEinheit['anmerkung'] as $ueAnmerkung) echo $ueAnmerkung."
"; } echo '
'; } echo '
'; $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 ''; //&& $datum>=$datum_now echo '
'.$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 '
'; echo ' '.$this->crlf; echo ' '.$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 ''.$this->crlf; echo ''.$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 ''; //Semester echo ' '.$this->crlf; //Verband echo ''.$this->crlf; //Gruppe echo ''.$this->crlf; //Spezialgruppe echo ''.$this->crlf; echo ''.$this->crlf; echo ''; } else { echo ' '.$this->crlf; } echo ''; echo '
'.$p->t('global/titel').':'.$p->t('global/beschreibung').': '.$p->t('lvplan/lektor').':
'.$p->t('global/studiengang').': '.$p->t('global/semester').': '.$p->t('global/verband').': '.$p->t('global/gruppe').': '.$p->t('lvplan/spezialgruppe').': alle auswählen
'; echo ' '.$this->crlf; echo ' '.$this->crlf; echo ' '.$this->crlf; echo ' '.$this->crlf; echo '
'; echo ' '.$p->t('lvplan/reservierungenLoeschen').' '; } } /** * 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 ' '; //Tabelle zeichnen echo ''; echo ''; echo ' '; for ($i=0;$i<$num_rows_stunde; $i++) echo ' '; echo ''; echo ''; // Kopfzeile darstellen echo ''.$this->crlf; echo ' '.$this->crlf; //BeginnEnde 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 ' '.$this->crlf; } echo ''; // 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 ''; echo ''.date("l",$datum).''.date("j.m. y",$datum).''; echo ''; for ($k=0; $k<$num_rows_stunde; $k++) { $tooltip=''; $row = $this->db_fetch_object($result_stunde, $k); $j=$row->stunde; if (isset($wunsch[$i][$j])) { $index=$wunsch[$i][$j]; if($index==-3) { //Wenn eine Zeitsperre eingetragen ist, dann diese im Tooltiptext anzeigen $zeitsperre = new zeitsperre(); $zeitsperre->getSperreByDate($this->pers_uid, date('Y-m-d',$datum), $j); foreach($zeitsperre->result as $sperren) { if($tooltip!='') $tooltip.=', '; $tooltip.=$sperren->zeitsperretyp_kurzbz.' - '.$sperren->bezeichnung; } } } else $index=1; if ($index=='') $index=1; $bgcolor=$cfgStdBgcolor[$index+3]; if ($isferien) { $bgcolor='#FFFF55'; //Wenn Ferien eingetragen sind, dann die Bezeichnung im Tooltiptext anzeigen foreach($ferien->getFerien($datum) as $bezeichnung) { if($tooltip!='') $tooltip.=', '; $tooltip .= $bezeichnung; } } echo ''; if (isset($this->std_plan[$i][$j][0]->lehrfach)) { // Daten aufbereiten if (isset($lvb)) unset($lvb); //$lvb=array(); $kollision=-1; if (isset($a_unr)) unset($a_unr); foreach ($this->std_plan[$i][$j] as $lehrstunde) { $a_unr[]=$lehrstunde->unr; $a_lvb[$lehrstunde->unr][]=$lehrstunde->sem.$lehrstunde->ver.$lehrstunde->grp; } // Unterrichtsnummer (Kollision?) $a_unr=array_unique($a_unr); $kollision+=count($a_unr); //Kollisionspruefung Studentenebene if($kollision_student=='true') { $kollision=0; $studiensemester = getStudiensemesterFromDatum(date('Y-m-d',$datum)); $qry = "SELECT datum, stunde, student_uid, count(student_uid) AS anzahl FROM ( SELECT sub_stpl_uid.unr, sub_stpl_uid.datum, sub_stpl_uid.stunde, sub_stpl_uid.student_uid FROM ( SELECT stpl.unr, stpl.datum, stpl.stunde, tbl_benutzergruppe.uid AS student_uid FROM lehre.tbl_stundenplandev stpl JOIN public.tbl_benutzergruppe USING (gruppe_kurzbz) WHERE tbl_benutzergruppe.studiensemester_kurzbz::text = ".$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 ORDER BY datum, stunde, student_uid LIMIT 1; "; if($this->db_query($qry)) if($this->db_num_rows()>0) $kollision++; } else { //Kollisionspruefung LVB Ebene // Ist es bei LVB-Ansicht wirklich eine Kollision? if ($kollision>0 && $this->type=='verband') { $kollision=0; $a=0; foreach ($a_unr as $unr) { array_unique($a_lvb[$unr]); $lvb[$a++]=$a_lvb[$unr]; } for ($a=0;$astd_plan[$i][$j] as $lehrstunde) { if ($lehrstunde->unr==$unr) { // Lektoren $lektor[]=$lehrstunde->lektor; // Lehrverband $lvb=$lehrstunde->stg.'-'.$lehrstunde->sem; if ($lehrstunde->ver!=null && $lehrstunde->ver!='0' && $lehrstunde->ver!='') { $lvb.=$lehrstunde->ver; if ($lehrstunde->grp!=null && $lehrstunde->grp!='0' && $lehrstunde->grp!='') $lvb.=$lehrstunde->grp; } if (count($lehrstunde->gruppe_kurzbz)>0) $lvb=$lehrstunde->gruppe_kurzbz; $lehrverband[]=$lvb; // Lehrfach $lf=htmlspecialchars($lehrstunde->lehrfach); if (isset($lehrstunde->lehrform)) $lf.='-'.$lehrstunde->lehrform; $lehrfach[]=$lf; $ort[]=$lehrstunde->ort; $stg_kz=$lehrstunde->stg_kz; $updateamum[]=mb_substr($lehrstunde->updateamum,0,16); $updatevon[]=$lehrstunde->updatevon; if ($lehrstunde->reservierung) { $paramList.='&reservierung_id'.$z++.'='.$lehrstunde->stundenplan_id; $reservierung=true; } else $paramList.='&stundenplan_id'.$z++.'='.$lehrstunde->stundenplan_id; if(isset($lehrstunde->farbe)) $farbe=$lehrstunde->farbe; $titel=htmlspecialchars($lehrstunde->titel); $anmerkung=htmlspecialchars($lehrstunde->anmerkung); } } // Lektoren //if ($this->type!='lektor') $lektor=array_unique($lektor); sort($lektor); $lkt=''; foreach ($lektor as $l) $lkt.=$l.''; // Lehrverband //if ($this->type!='verband') $lehrverband=array_unique($lehrverband); sort($lehrverband); $lvb=''; foreach ($lehrverband as $l) $lvb.=$l.''; // Lehrfach //if ($this->type=='verband') $lehrfach=array_unique($lehrfach); sort($lehrfach); $lf=''; foreach ($lehrfach as $l) $lf.=$l.''; // Ort //if ($this->type=='verband') $ort=array_unique($ort); sort($ort); $orte=''; foreach ($ort as $o) $orte.=$o.''; // Update Von $updatevon=array_unique($updatevon); sort($updatevon); $updatevonam='Geaendert von '; foreach ($updatevon as $u) $updatevonam.=$u.', '; // Update Am $updateamum=array_unique($updateamum); sort($updateamum); $updatevonam.='am '; foreach ($updateamum as $u) $updatevonam.=$u.' '; // Blinken oder nicht ? if ($kollision) { $blink_ein='';// .$kollision; $blink_aus=''; } else { $blink_ein=''; $blink_aus=''; } $stg_obj = new studiengang(); $stg_obj->load($stg_kz); // Ausgabe echo ''; } } 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 ''.$this->crlf; } echo ""; $datum=jump_day($datum, 1); } // Fuszzeile darstellen if (!$semesterplan) { echo ''.$this->crlf; echo ' '.$this->crlf; //BeginnEnde 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 ' '.$this->crlf; } echo ''; } echo ''; echo ''; } /** * Funktion load_stpl_search sucht Vorschlag fuer Stundenverschiebung * * @param datum der Aktuellen Woche * @param stpl_id Array der stundenplan_id's * @param db_stpl_table Name der DB-Tabelle * @return true oder false */ public function load_stpl_search($datum,$stpl_id,$db_stpl_table, $block=1) { // Initatialisierung der Variablen $lehrverband=array(); // Name der View $stpl_view='lehre.'.VIEW_BEGIN.$db_stpl_table; $stpl_view_id=$db_stpl_table.TABLE_ID; //Kalenderdaten setzen $this->datum=montag($datum); $this->datum_begin=$this->datum; $this->datum_end=jump_week($this->datum_begin, 1); // Formatieren fuer Datenbankabfragen $this->datum_begin=date("Y-m-d",$this->datum_begin); $this->datum_end=date("Y-m-d",$this->datum_end); // Stundentafel abfragen $sql_query='SELECT min(stunde),max(stunde)FROM lehre.tbl_stunde'; if(!$this->db_query($sql_query)) die($this->db_last_error()); $row = $this->db_fetch_object(); $min_stunde=$row->min; $max_stunde=$row->max; // Stundenplaneintraege holen $sql_query="SELECT * FROM $stpl_view WHERE"; $stplids=''; foreach ($stpl_id as $id) $stplids.=" OR $stpl_view_id=$id"; $stplids=mb_substr($stplids,3); $sql_query.=$stplids; //echo $sql_query; if(!$this->db_query($sql_query)) die($this->db_last_error()); $num_rows_stpl=$this->db_num_rows(); // Daten aufbereiten $leids=''; for ($i=0;$i<$num_rows_stpl;$i++) { $row=$this->db_fetch_object(null,$i); //$block=$row->stundenblockung; //$raumtyp[$i]=$row->raumtyp; //$raumtypalt[$i]=$row->raumtypalternativ; if ($row->gruppe_kurzbz!=null) $gruppe[]=$row->gruppe_kurzbz; else $gruppe[]=''; $lehrverband[$i]->stg_kz=$row->studiengang_kz; $lehrverband[$i]->sem=$row->semester; $lehrverband[$i]->ver=$row->verband; $lehrverband[$i]->grp=$row->gruppe; $leids.="$row->lehreinheit_id,"; $lektor[$i]=$row->uid; $unr=$row->unr; } if($leids!='') { // Raumtypen $leids = mb_substr($leids, 0, mb_strlen($leids)-1); $qry = "SELECT raumtyp, raumtypalternativ FROM lehre.tbl_lehreinheit WHERE lehreinheit_id IN ($leids)"; if($this->db_query($qry)){ while($row = $this->db_fetch_object()) { $raumtyp[]=$row->raumtyp; $raumtyp[]=$row->raumtypalternativ; } } } $raumtyp=array_unique($raumtyp); $rtype=''; foreach ($raumtyp as $r) $rtype.=" OR raumtyp_kurzbz=".$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!='_DummyLektor')"; // 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(); for ($i=0;$i<$num_orte;$i++) { $row = $this->db_fetch_object(null, $i); $orte[]=$row->ort_kurzbz; } // Suche nach freien Orten. Bei 'lva_multi_search' wird die Schleife (do) aktiv $count=0; $rest=$offenestunden; if ($rest<=0 && $type=='lva_multi_search') { $this->errormsg.='Es sind bereits alle Stunden verplant!'; return false; } $datum=$this->datum; $datum_begin=$this->datum_begin; $datum_end=$this->datum_end; // Raster vorbereiten for ($t=1;$t<=TAGE_PRO_WOCHE;$t++) for ($s=$min_stunde;$s<=$max_stunde;$s++) { @$raster[$t][$s]->ort=array(); $raster[$t][$s]->kollision=false; } do { // Raster vorbereiten for ($t=1;$t<=TAGE_PRO_WOCHE;$t++) { for ($s=$min_stunde;$s<=$max_stunde;$s++) { if (isset($raster[$t][$s])) unset($raster[$t][$s]); @$raster[$t][$s]->ort=array(); $raster[$t][$s]->kollision=false; } } // Stundenplanabfrage bauen (Wo ist Kollision?) $sql_query="SELECT DISTINCT datum, stunde FROM $stpl_table WHERE datum>=".$this->db_add_param($datum_begin)." AND datum<".$this->db_add_param($datum_end)." AND ($lkt $gruppen OR ($lvb) )"; if (is_numeric($unr)) $sql_query.=" AND unr!=".$this->db_add_param($unr); if(!$this->db_query($sql_query)) { $this->errormsg = $this->db_last_error().$sql_query; return false; } // Kollisionen ins Raster eintragen while($row = $this->db_fetch_object()) { $mtag=mb_substr($row->datum, 8,2); $month=mb_substr($row->datum, 5,2); $jahr=mb_substr($row->datum, 0,4); $tag=date("w",mktime(12,0,0,$month,$mtag,$jahr)); $raster[$tag][$row->stunde]->kollision=true; } // Stundenplanabfrage bauen (Wo ist besetzt?) $sql_query="SELECT DISTINCT datum, stunde, ort_kurzbz FROM $stpl_view JOIN public.tbl_ortraumtyp USING (ort_kurzbz) WHERE datum>=".$this->db_add_param($datum_begin)." AND datum<".$this->db_add_param($datum_end)." AND ($rtype)"; if (is_numeric($unr)) $sql_query.=" AND unr!=".$this->db_add_param($unr); // Reservierungen beruecksichtigen $sql_query.=" UNION SELECT distinct datum, stunde, ort_kurzbz FROM campus.tbl_reservierung WHERE datum>=".$this->db_add_param($datum_begin)." AND datum<".$this->db_add_param($datum_end); if(!$this->db_query($sql_query)) { $this->errormsg = $this->db_last_error().$sql_query; return false; } while($row = $this->db_fetch_object()) { $mtag=mb_substr($row->datum, 8,2); $month=mb_substr($row->datum, 5,2); $jahr=mb_substr($row->datum, 0,4); $tag=date("w",mktime(12,0,0,$month,$mtag,$jahr)); $raster[$tag][$row->stunde]->ort[]=$row->ort_kurzbz; } // Moegliche Orte fuer den Vorschlag in den Stundenplan eintragen. // $this->std_plan[$t][$s][0]->frei_orte ist ein Array mit den in Frage kommenden Orten // der Wert von $this->std_plan[$t][$s][0]->frei_orte[$ort_kurzbz] gibt an, wie viele // kollisionen bei der Zuteilung entstehen for ($t=1;$t<=TAGE_PRO_WOCHE;$t++) { for ($s=1;$s<=$max_stunde;$s++) { //Blockung passt in die Maximalstundenanzahl if (($s+$blck)<=($max_stunde+1)) { if($count==0) { // Freie Orte beim 1. Durchlauf zuteilen foreach($orte as $ort) $this->std_plan[$t][$s][0]->frei_orte[$ort]=(isset($this->std_plan[$t][$s][0]->frei_orte[$ort])?$this->std_plan[$t][$s][0]->frei_orte[$ort]:0); } // Besetzte Orte eintragen foreach ($raster[$t][$s]->ort as $ort) { if(in_array($ort, $orte)) $this->std_plan[$t][$s][0]->frei_orte[$ort]=(isset($this->std_plan[$t][$s][0]->frei_orte[$ort])?$this->std_plan[$t][$s][0]->frei_orte[$ort]+1:1); } //Kollision mit Gruppe if($raster[$t][$s]->kollision) { foreach ($this->std_plan[$t][$s][0]->frei_orte as $ort=>$value) { if(in_array($ort, $orte)) $this->std_plan[$t][$s][0]->frei_orte[$ort]=(isset($this->std_plan[$t][$s][0]->frei_orte[$ort])?$this->std_plan[$t][$s][0]->frei_orte[$ort]+1:1); } } // Blockung beruecksichtigen for ($b=1;$b<$block && ($s+$block)<=($max_stunde+1);$b++) { if (!$raster[$t][$s+$b]->kollision) { // Wenn keine Gruppenkollision vorhanden ist, dann die kollidierenden Raeume eintragen foreach ($raster[$t][$s+$b]->ort as $ort) { if(in_array($ort, $orte)) $this->std_plan[$t][$s][0]->frei_orte[$ort]=(isset($this->std_plan[$t][$s][0]->frei_orte[$ort])?$this->std_plan[$t][$s][0]->frei_orte[$ort]+1:1); } } else { // Bei Gruppenkollision den Wert bei allen Raumen erhoehen foreach ($this->std_plan[$t][$s][0]->frei_orte as $ort=>$value) $this->std_plan[$t][$s][0]->frei_orte[$ort]=(isset($this->std_plan[$t][$s][0]->frei_orte[$ort])?$this->std_plan[$t][$s][0]->frei_orte[$ort]+1:1); } } } else { // Wenn sich die Verplanung mit der Blockung nicht mehr ausgeht, dann keine Raeume vorschlagen @$this->std_plan[$t][$s][0]->frei_orte=array(); } } } // Variablen abgleichen $rest-=$block; if ($block>$rest) $block=$rest; $datum=jump_week($datum,$wr); $datum_begin=$datum; $datum_end=jump_week($datum_begin, 1); // Formatieren fuer Datenbankabfragen $datum_begin=date("Y-m-d",$datum_begin); $datum_end=date("Y-m-d",$datum_end); $count++; } while($type=='lva_multi_search' && $rest>0); return true; } /** * Funktion draw_week_csv Stundenplan im CSV-Format * * @param target Ziel-System zB Outlook * @return true oder false */ public function draw_week_csv($target, $lvplan_kategorie) { $return = array(); if (!date("w",$this->datum)) $this->datum=jump_day($this->datum,1); $num_rows_stunde=$this->db_num_rows($this->stunde); for ($i=1; $i<=TAGE_PRO_WOCHE; $i++) { $blocked=array(); $gruppiert=array(); for ($k=0; $k<$num_rows_stunde; $k++) { $row = $this->db_fetch_object($this->stunde, $k); $j=$row->stunde; // get id of hour if (isset($this->std_plan[$i][$j][0]->lehrfach)) { // Daten aufbereiten if (isset($unr)) unset($unr); if (isset($lektor)) unset($lektor); if (isset($lehrverband)) unset($lehrverband); if (isset($lehrfach)) unset($lehrfach); foreach ($this->std_plan[$i][$j] as $lehrstunde) { $unr[]=$lehrstunde->unr; // Lektoren $lektor[]=$lehrstunde->lektor; // Lehrverband $lvb=$lehrstunde->stg.'-'.$lehrstunde->sem; if ($lehrstunde->ver!=null && $lehrstunde->ver!='0' && $lehrstunde->ver!='') { $lvb.=$lehrstunde->ver; if ($lehrstunde->grp!=null && $lehrstunde->grp!='0' && $lehrstunde->grp!='') $lvb.=$lehrstunde->grp; } if (count($lehrstunde->gruppe_kurzbz)>0) $lvb=$lehrstunde->gruppe_kurzbz; $lehrverband[]=$lvb; // Lehrfach $lf=$lehrstunde->lehrfach; //echo "\n!!!!Lehrfach $lf\n"; if (isset($lehrstunde->lehrform)) $lf.='-'.$lehrstunde->lehrform; $lehrfach[]=$lf; $titel=$lehrstunde->titel; $anmerkung=$lehrstunde->anmerkung; } // Unterrichtsnummer (Kollision?) $unr=array_unique($unr); if(!isset($kollision)) $kollision=0; $kollision+=count($unr); // Lektoren if ($this->type!='lektor') { $lektor=array_unique($lektor); sort($lektor); $lkt=''; foreach ($lektor as $l) $lkt.=$l.' '; } else $lkt=$lektor[0]; //echo $lkt; // Lehrverband if ($this->type!='verband') { $lehrverband=array_unique($lehrverband); sort($lehrverband); $lvb=''; foreach ($lehrverband as $l) $lvb.=$l.' '; } else $lvb=$lehrverband[0]; $row = $this->db_fetch_object($this->stunde, $k); $start_time=$row->beginn; for($idx=0;$idxstd_plan[$i][$j]);$idx++) { if(!isset($this->std_plan[$i][$j][$idx])) { continue; } /** * Wenn Lektoren in mehreren Raeumen gleichzeitig unterrichten * Oder mehrere Lektoren /Gruppen im selben Raum sind werden diese * zu einem Eintrag zusammengruppiert. * * Zusammengruppiert werden nur Eintraege die am gleichen Tag * in der gleichen Stunde stattfinden. * * Es wird nur der erste Eintrag ausgegeben. Die restlichen werden uebersprungen da * die Lektoren, Gruppen und Raeume bereits zum Ersten Eintrag hinzugefuegt wurden. */ if(isset($gruppiert[$this->std_plan[$i][$j][$idx]->unr]) && $gruppiert[$this->std_plan[$i][$j][$idx]->unr]>0) { $gruppiert[$this->std_plan[$i][$j][$idx]->unr]--; continue; } /** * Unterricht der ueber mehrere Stunden geht wird nicht einzeln Exportiert, * sondern zusammengeblockt. (in maximal 4er Bloecke) * * Es wird nur ein Eintrag geschrieben, die restlichen werden uebersprungen. * Vor dem Ueberspringen des Eintrages werden jedoch noch die dazu Gruppierten Eintraege * ermittelt und dann ebenfalls uebersprungen */ $blockcontinue=false; if(isset($blocked[$this->std_plan[$i][$j][$idx]->unr]) && $blocked[$this->std_plan[$i][$j][$idx]->unr]>0) { $blocked[$this->std_plan[$i][$j][$idx]->unr]--; $blockcontinue=true; } if(!$blockcontinue) { // Blockungen ueber mehrere Stunden erkennen if (isset($this->std_plan[$i][$j+1][$idx]) && isset($this->std_plan[$i][$j+1][$idx]->stundenplan_id) && ($this->std_plan[$i][$j][$idx]->unr == $this->std_plan[$i][$j+1][$idx]->unr) && $this->std_plan[$i][$j][$idx]!='0' && $k<($num_rows_stunde-1)) { //2er Block if(isset($blocked[$this->std_plan[$i][$j][$idx]->unr])) $blocked[$this->std_plan[$i][$j][$idx]->unr]++; else $blocked[$this->std_plan[$i][$j][$idx]->unr]=1; $row = $this->db_fetch_object($this->stunde, ($k+1)); $end_time=$row->ende; if (isset($this->std_plan[$i][$j+2][$idx]) && isset($this->std_plan[$i][$j+2][$idx]->stundenplan_id) && ($this->std_plan[$i][$j][$idx]->unr == $this->std_plan[$i][$j+2][$idx]->unr) && $k<($num_rows_stunde-2)) { //3er Block $blocked[$this->std_plan[$i][$j][$idx]->unr]++; $row = $this->db_fetch_object($this->stunde, ($k+2)); $end_time=$row->ende; if (isset($this->std_plan[$i][$j+3][$idx]) && isset($this->std_plan[$i][$j+3][$idx]->stundenplan_id) && ($this->std_plan[$i][$j][$idx]->unr == $this->std_plan[$i][$j+3][$idx]->unr) && $k<($num_rows_stunde-3)) { //4er Block $blocked[$this->std_plan[$i][$j][$idx]->unr]++; $row = $this->db_fetch_object($this->stunde, ($k+3)); $end_time=$row->ende; } } } else { $row = $this->db_fetch_object($this->stunde, $k); $end_time=$row->ende; } } //Wenn im selben Raum mehrere Lektoren sind bzw mehrere Gruppen //dann werden diese zusammengruppiert und als ein Eintrag angezeigt for($idx1=0;$idx1std_plan[$i][$j]);$idx1++) { if($idx!=$idx1) { if($this->kannGruppieren($i,$j,$idx,$idx1)) { if(isset($gruppiert[$this->std_plan[$i][$j][$idx]->unr])) $gruppiert[$this->std_plan[$i][$j][$idx]->unr]++; else $gruppiert[$this->std_plan[$i][$j][$idx]->unr]=1; //Bezeichnungen zusammenfuehren //Lektoren if(!mb_strstr($this->std_plan[$i][$j][$idx1]->lektor,$this->std_plan[$i][$j][$idx]->lektor)) { $this->std_plan[$i][$j][$idx]->lektor.=' / '.$this->std_plan[$i][$j][$idx1]->lektor; } //Ort if(!mb_strstr($this->std_plan[$i][$j][$idx1]->ort,$this->std_plan[$i][$j][$idx]->ort)) { $this->std_plan[$i][$j][$idx]->ort.=' / '.$this->std_plan[$i][$j][$idx1]->ort; } //Gruppen if(isset($lehrverband[$idx]) && isset($lehrverband[$idx1])) { if(!mb_strstr($lehrverband[$idx], $lehrverband[$idx1])) $lehrverband[$idx].=' / '.$lehrverband[$idx1]; } } } } //Geblockte Eintraege werden uebersprungen nachdem die Gruppierung ermittelt wurde if($blockcontinue) { continue; } $start_date=date("d.m.Y",$this->datum); $end_date=$start_date; if(isset($lehrverband[$idx])) $lvb = $lehrverband[$idx]; if ($target=='outlook') { //"Betreff","Beginnt am","Beginnt um","Endet am","Endet um","Ganztaegiges Ereignis","Erinnerung Ein/Aus","Erinnerung am","Erinnerung um","Besprechungsplanung","Erforderliche Teilnehmer","Optionale Teilnehmer","Besprechungsressourcen","Abrechnungsinformationen","Beschreibung", //"Kategorien","Ort","Prioritaet","Privat","Reisekilometer","Vertraulichkeit","Zeitspanne zeigen als" echo $this->crlf.'"'.$this->std_plan[$i][$j][$idx]->lehrfach.(isset($this->std_plan[$i][$j][$idx]->lehrform) && $this->std_plan[$i][$j][$idx]->lehrform!=''?'-'.$this->std_plan[$i][$j][$idx]->lehrform:'').($lvb!=''?' - '.$lvb:'').'","'.$start_date.'","'.$start_time.'","'.$end_date.'","'.$end_time.'","Aus","Aus",,,,,,,,"Stundenplan'; echo $this->crlf.$this->std_plan[$i][$j][$idx]->lehrfach.$this->crlf.$this->std_plan[$i][$j][$idx]->lektor.$this->crlf.$lvb.$this->crlf.$this->std_plan[$i][$j][$idx]->ort.(LVPLAN_ANMERKUNG_ANZEIGEN?$this->crlf.$this->std_plan[$i][$j][$idx]->anmerkung:'').'","StundenplanFH","'.$this->std_plan[$i][$j][$idx]->ort.'","Normal","Aus",,"Normal","2"'; } elseif ($target=='ical') { $sda = explode(".",$start_date); //sda start date array $sta = explode(":",$start_time); //sta start time array $eda = explode(".",$end_date); //eda end date array $eta = explode(":",$end_time); //eta end time array //Die Zeitzone muss angegeben werden, da sonst der Google Kalender die Endzeiten nicht richtig erkennt // diese wird in stpl_kalender global definiert und bei den Start und Ende Zeiten mitangegeben $start_date_time_ical = $sda[2].$sda[1].$sda[0].'T'.sprintf('%02s',($sta[0])).$sta[1].$sta[2]; //neu gruppieren der Startzeit und des Startdatums $end_date_time_ical = $eda[2].$eda[1].$eda[0].'T'.sprintf('%02s',($eta[0])).$eta[1].$eta[2]; //neu gruppieren der Startzeit und des Startdatums echo $this->crlf.'BEGIN:VEVENT'.$this->crlf .'UID:'.'FH'.str_replace(',',' ',$lvb.$this->std_plan[$i][$j][$idx]->ort.$this->std_plan[$i][$j][$idx]->lektor.$lehrfach[$idx].$start_date_time_ical.$this->crlf) .'SUMMARY:'.str_replace(',',' ',$lehrfach[$idx].' '.$this->std_plan[$i][$j][$idx]->ort.' - '.$lvb.$this->crlf) .'DESCRIPTION:'.str_replace(',',' ',$lehrfach[$idx].'\n'.$this->std_plan[$i][$j][$idx]->lektor.'\n'.$lvb.'\n'.$this->std_plan[$i][$j][$idx]->ort.(LVPLAN_ANMERKUNG_ANZEIGEN?'\n'.$this->std_plan[$i][$j][$idx]->anmerkung:'').$this->crlf) .'LOCATION:'.$this->std_plan[$i][$j][$idx]->ort.$this->crlf .'CATEGORIES:'.$lvplan_kategorie.$this->crlf .'DTSTART;TZID=Europe/Vienna:'.$start_date_time_ical.$this->crlf .'DTEND;TZID=Europe/Vienna:'.$end_date_time_ical.$this->crlf .'END:VEVENT'; } elseif ($target=='freebusy') { $sda = explode(".",$start_date); //sda start date array $sta = explode(":",$start_time); //sta start time array $eda = explode(".",$end_date); //eda end date array $eta = explode(":",$end_time); //eta end time array //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,'FREEBUSY: ',$start_date_time_ical,'/',$end_date_time_ical; } elseif ($target=='return') { $sda = explode(".",$start_date); //sda start date array $sta = explode(":",$start_time); //sta start time array $eda = explode(".",$end_date); //eda end date array $eta = explode(":",$end_time); //eta end time array //Die Zeitzone muss angegeben werden, da sonst der Google Kalender die Endzeiten nicht richtig erkennt // diese wird in stpl_kalender global definiert und bei den Start und Ende Zeiten mitangegeben $start_date_time_ical = $sda[2].$sda[1].$sda[0].'T'.sprintf('%02s',($sta[0])).$sta[1].$sta[2]; //neu gruppieren der Startzeit und des Startdatums $end_date_time_ical = $eda[2].$eda[1].$eda[0].'T'.sprintf('%02s',($eta[0])).$eta[1].$eta[2]; //neu gruppieren der Startzeit und des Startdatums $UID = 'FH'.$lvb.$this->std_plan[$i][$j][$idx]->ort.$this->std_plan[$i][$j][$idx]->lektor.$lehrfach[$idx].$start_date_time_ical; $Summary = $lehrfach[$idx].' '.$this->std_plan[$i][$j][$idx]->ort.' - '.$lvb; $description = $lehrfach[$idx].'\n'.$this->std_plan[$i][$j][$idx]->lektor.'\n'.$lvb.'\n'.$this->std_plan[$i][$j][$idx]->ort; $UID = str_replace(',',' ',$UID); $Summary = str_replace(',',' ',$Summary); $description = str_replace(',',' ',$description); $return[]=array('UID'=>$UID, 'unr'=>$unr, 'Summary'=>$Summary, 'Description'=>$description, 'dtstart'=>$start_date_time_ical, 'dtend'=>$end_date_time_ical, '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)) return true; else return false; } else return false; } } function jahreskalenderjump_hoverbox($link) //Mit Hoverbox Effekt { $sprache = getSprache(); $p=new phrasen($sprache); $crlf=crlf(); $datum=time(); $woche=kalenderwoche($datum); $wochenmontag=montag($datum); echo '
'.$crlf; for ($anz=1;$anz<25;$anz++) { $linknew=$link.'&datum='.$datum; if ($woche==53) $woche=1; echo ' '.$crlf; if ($anz%8==0) echo ' '.$crlf; $datum+=60*60*24*7; $woche++; $wochenmontag+=60*60*24*7; } echo '
KW '.$woche.'
'.date('d.m', $wochenmontag).'
'.$crlf; } function searchForId($id, $array) { foreach ($array as $key => $val) { if ($val['unr'] == $id) { return $key; } } return false; } ?>