, * 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'); 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->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); 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); 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'"; 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; 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); 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', $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 $stunde=$this->wochenplan->lehrstunden[$i]->stunde; // naechste freie Stelle im Array suchen while (isset($this->std_plan[$tag][$stunde][$idx]->lektor_uid)) $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; } 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 '

'; 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' && $this->ort_kurzbz != 'all') { echo ''.$p->t('lvplan/raum').': '.$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!=''?' - '.$p->t('lvplan/rauminformationenAnzeigen').'':''); echo ''; echo '
'.$this->ort_ausstattung; } if ($this->type=='lva') $this->link.='&lva='.$this->lva; echo '

'.$this->crlf; echo ' '; echo '
'.$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; $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 $this->crlf; echo $this->studiensemester_now->name.'
'.$this->crlf; echo ' HTML'.$this->crlf; echo ' Excel'.$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 ' '.$this->studiensemester_next->name.'
'.$this->crlf; echo ' HTML'.$this->crlf; echo ' Excel'.$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.$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 '
'.$this->crlf; echo '

'.$this->crlf; 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 $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); $stundenplandev_belegt = array(); // Formularbeginn wenn Lektor if ($raumres && $this->type=='ort') { $ort = new ort(); $ort->load($this->ort_kurzbz); if ($ort->reservieren) { echo '
'.$this->crlf; // In tbl_stundenplandev schauen ob dort der Raum bereits belegt ist $qry = "SELECT distinct datum, stunde FROM lehre.tbl_stundenplandev WHERE datum>=".$this->db_add_param($this->datum_begin)." AND datum<=".$this->db_add_param($this->datum_end)." AND ort_kurzbz=".$this->db_add_param($this->ort_kurzbz); if($result_devbelegt = $this->db_query($qry)) { while($row_devbelegt = $this->db_fetch_object($result_devbelegt)) { $stundenplandev_belegt[$row_devbelegt->datum][$row_devbelegt->stunde]=true; } } } else $raumres=false; } //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); 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; 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]; // 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) if ($a!='') $anm.='
'.$this->convert_html_chars($a); else $anm=''; } // 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;$nsearchForId($unr[$n], $uEinheiten); if ($unrIndex===false) { $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.' 
'.$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.''; foreach($uEinheiten as $key=>$uEinheit) { echo '
'; // Link zu Details setzten echo ''; // Ausgabe echo $uEinheit['lehrfach']; if ($uEinheit['titel'][0]!='' && !$reservierung) { echo ''; } echo '
'; if ($this->type=='ort' || $this->type=='lektor' || $this->type=='verband' || $this->type=='lva') { $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' || $this->ort_kurzbz == 'all') { $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) if ($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)) { // Wenn die Stunde bereits in der tbl_stundenplandev verplant ist // darf die Stunde nicht reserviert werden if(!isset($stundenplandev_belegt[$datum_m][$j])) echo ''; else echo $p->t('lvplan/reserviertInDev'); } 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').' '; } else { if ($this->type=='ort') { echo '

'; echo ''.$p->t('lvplan/raumreservierungAufZeitraumEingeschraenkt',array(date("d.m.Y",$datum_res_lektor_start),date("d.m.Y",$datum_res_lektor_ende))).''; echo '
'; } } } /** * 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) { 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; $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 ' '.$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]; // 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 ''; if (isset($this->std_plan[$i][$j][0]->lehrfach)) { // Daten aufbereiten if (isset($lvb)) unset($lvb); $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;$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 { 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 $lektor=array_unique($lektor); sort($lektor); $lkt=''; foreach ($lektor as $l) $lkt.=$l.''; // Lehrverband $lehrverband=array_unique($lehrverband); sort($lehrverband); $lvb=''; foreach ($lehrverband as $l) $lvb.=$l.''; // Lehrfach $lehrfach=array_unique($lehrfach); sort($lehrfach); $lf=''; foreach ($lehrfach as $l) $lf.=$l.''; // Ort $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 (isset($kollisionsmeldungen[$unr]) || (isset($kollisionsmeldung) && count($kollisionsmeldungen, COUNT_RECURSIVE)==0 && $kollision>0)) { $blink_ein=''; $blink_aus=''; } 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 ''; } } 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; 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; 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); 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); $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='')"; } $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"; 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); 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); // 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; if (!$this->db_query($sql_query)) die($this->db_last_error()); $num_rows_lva=$this->db_num_rows(); $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; } // Blockung eindeutig? $blck=$block[0]; $block=array_unique($block); if (count($block)==1) $block=$blck; else { $this->errormsg.='Blockung ist nicht eindeutig!'; return false; } // 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); } //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"; // 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; 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]; // Lehrverband if ($this->type!='verband') { $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. * * 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; } else { break; } } } } //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.$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 '
'.$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; } } ?>