diff --git a/cis/public/freebusy_lvplan.php b/cis/public/freebusy_lvplan.php new file mode 100755 index 000000000..5b3da0891 --- /dev/null +++ b/cis/public/freebusy_lvplan.php @@ -0,0 +1,92 @@ + + */ +/** + * Dieses Script liefert die FreeBusy Informationen + * + * Aufruf: http://www.example.com/cis/public/freebusy.php/[uid] + * zB + * http://www.example.com/cis/public/freebusy.php/oesi + */ +require_once('../../config/cis.config.inc.php'); +require_once('../../include/benutzer.class.php'); +require_once('../../include/functions.inc.php'); +require_once('../../include/wochenplan.class.php'); + +$uid = mb_substr($_SERVER['PATH_INFO'],1); + +$bn = new benutzer(); +if(!$bn->load($uid)) + die('User invalid'); + +if(check_lektor($uid)) + $type='lektor'; +else + $type='student'; + + +header("Content-Type: text/calendar; charset=UTF-8"); + +echo "BEGIN:VCALENDAR\n"; +echo "VERSION:2.0\n"; +echo "PRODID:-//FH TECHNIKUM WIEN//EN\n"; +echo "METHOD:PUBLISH\n"; +echo 'ORGANIZER;CN=',$bn->vorname,' ',$bn->nachname,':mailto:',$uid,'@',DOMAIN,"\n"; +echo 'DTSTAMP:',date('Ymd', mktime(date('H'),date('i'),date('s'),date('m'),date('d')-5,date('Y'))),'T',date('Hms'),"Z\n"; +echo 'DTSTART:',date('Ymd', mktime(0,0,0,date('m'),date('d')-5,date('Y'))),"T000000Z\n"; +echo 'DTEND:',date('Ymd', mktime(0,0,0,date('m'),date('d')+30,date('Y'))),"T000000Z\n"; +echo 'URL:',APP_ROOT,'cis/public/freebusy_lvplan.php/',$uid,"\n"; +echo "BEGIN:VFREEBUSY"; + +// Stundenplanobjekt erzeugen +$stdplan = new wochenplan($type); +$stdplan->crlf="\n"; + +// Zusaetzliche Daten laden +if(!$stdplan->load_data($type,$uid)) +{ + die($stdplan->errormsg); +} + +$begin = mktime(0,0,0,date('m'),date('d')-5,date('Y')); +$ende = mktime(0,0,0,date('m'),date('d')+30,date('Y')); +$db_stpl_table = 'stundenplan'; +$i=0; +// Kalender erstellen +while($begin<$ende) +{ +$i++; + if(!date("w",$begin)) + $begin=jump_day($begin,1); + + $stdplan->init_stdplan(); + $datum=$begin; + $begin+=604800; // eine Woche + + // Stundenplan einer Woche laden + if(!$stdplan->load_week($datum,$db_stpl_table)) + { + die($stdplan->errormsg); + } + $stdplan->draw_week_csv('freebusy', LVPLAN_KATEGORIE); +} + +echo "\nEND:VFREEBUSY"; +echo "\nEND:VCALENDAR"; +?> \ No newline at end of file diff --git a/include/lehreinheit.class.php b/include/lehreinheit.class.php index e49f49e77..9268f8089 100644 --- a/include/lehreinheit.class.php +++ b/include/lehreinheit.class.php @@ -478,6 +478,9 @@ class lehreinheit extends basis_db $this->errormsg =''; + $stg_obj = new studiengang(); + $stg_obj->getAll(); + $ignore_reservation=false; $ignore_zeitsperre=false; // Parameter Checken @@ -498,6 +501,7 @@ class lehreinheit extends basis_db AND (ort_kurzbz='".addslashes($ort)."' OR $sql_lkt)"; if (is_numeric($this->unr)) $sql_query.=" AND unr!='".addslashes($this->unr)."'"; + if (!$this->db_query($sql_query)) { $this->errormsg=$this->db_last_error(); @@ -509,84 +513,114 @@ class lehreinheit extends basis_db //Check if ($anzahl==0) { - // Reservierungen pruefen? - if (!$ignore_reservation) - { - // Datenbank abfragen ( studiengang_kz, titel, beschreibung ) - //Lektoren SQL - $sql_lkt=''; - foreach ($this->mitarbeiter_uid as $lkt) - $sql_lkt.="OR uid='$lkt' "; - $sql_lkt=mb_substr($sql_lkt,3); - $sql_lkt="(($sql_lkt) AND uid!='_DummyLektor')"; - $sql_query="SELECT reservierung_id AS id, uid AS lektor, stg_kurzbz, ort_kurzbz, semester, verband, gruppe, gruppe_kurzbz, datum, stunde - FROM lehre.vw_reservierung - WHERE datum='".addslashes($datum)."' AND stunde='".addslashes($stunde)."' - AND (ort_kurzbz='".addslashes($ort)."' OR $sql_lkt)"; - // Verband SQL - //$sql_query.="(studiengang_kz=$this->studiengang_kz AND semester=$this->sem"; - //if ($this->ver!=null && $this->ver!='' && $this->ver!=' ') - // $sql_query.=" AND (verband='$this->ver' OR verband IS NULL OR verband='' OR verband=' ')"; - //if ($this->grp!=null && $this->grp!='' && $this->grp!=' ') - // $sql_query.=" AND (gruppe='$this->grp' OR gruppe IS NULL OR gruppe='' OR gruppe=' ')"; - //if ($this->gruppe_kurzbz!=null && $this->gruppe_kurzbz!='' && $this->gruppe_kurzbz!=' ') - // $sql_query.=" AND (gruppe_kurzbz='$this->gruppe_kurzbz')"; - //$sql_query.="))"; + //Gruppen / Verbaende pruefen + $sql_query="SELECT $stpl_id, studiengang_kz, semester, verband, gruppe_kurzbz, stunde FROM $stpl_table + WHERE datum='".addslashes($datum)."' AND stunde='".addslashes($stunde)."'"; + if (is_numeric($this->unr)) + $sql_query.=" AND unr!='".addslashes($this->unr)."' AND (1=2 "; - //echo $sql_query.'
'; - if (!$this->db_query($sql_query)) - { - $this->errormsg=$sql_query.$this->db_last_error(); - return false; - } - $erg_res=$this->db_result; - $anz_res=$this->db_num_rows($erg_res); - //Check - if ($anz_res==0) - { - // Zeitsperren pruefen? - if (!$ignore_zeitsperre) - { - // Datenbank abfragen ( studiengang_kz, titel, beschreibung ) - //Lektoren SQL - $sql_lkt=''; - foreach ($this->mitarbeiter_uid as $lkt) - $sql_lkt.="OR mitarbeiter_uid='$lkt' "; - $sql_lkt=mb_substr($sql_lkt,3); - $sql_query="SELECT * FROM campus.tbl_zeitsperre - WHERE ($sql_lkt) AND - ( (vondatum<'$datum' AND bisdatum>'$datum') - OR (vondatum='$datum' AND bisdatum='$datum' AND vonstunde<=$stunde AND bisstunde>=$stunde) - OR (vondatum='$datum' AND bisdatum>'$datum' AND vonstunde<=$stunde) - OR (vondatum<'$datum' AND bisdatum='$datum' AND bisstunde>=$stunde) )"; - //echo $sql_query.'
'; - if (!$this->db_query($sql_query)) - { - $this->errormsg=$sql_query.$this->db_last_error(); - return false; - } - $erg_zs=$this->db_result; - $anz_zs=$this->db_num_rows($erg_zs); - //Check - if ($anz_zs==0) - return true; - else - { - $row=$this->db_fetch_object($erg_zs); - $this->errormsg="Kollision (Zeitsperre): $row->zeitsperre_id|$row->mitarbeiter_uid|$row->zeitsperretyp_kurzbz|$row->bezeichnung|$row->vondatum/$row->vonstunde-$row->bisdatum/$row->bisstunde - $row->vertretung_uid"; - return false; - } - } - return true; - } + for($anz=0;$anzstudiengang_kz);$anz++) + { + $sql_query.=" OR ((studiengang_kz=".$this->studiengang_kz[$anz]." AND semester=".$this->semester[$anz].")"; + + if ($this->gruppe_kurzbz[$anz]!=null && $this->gruppe_kurzbz[$anz]!='' && $this->gruppe_kurzbz[$anz]!=' ') + $sql_query.=" OR (gruppe_kurzbz='".$this->gruppe_kurzbz[$anz]."')"; else { - $row=$this->db_fetch_object($erg_res); - $this->errormsg="Kollision (Reservierung): $row->id|$row->lektor|$row->ort_kurzbz|$row->stg_kurzbz-$row->semester$row->verband$row->gruppe$row->gruppe_kurzbz - $row->datum/$row->stunde"; - return false; - } + if ($this->verband[$anz]!=null && $this->verband[$anz]!='' && $this->verband[$anz]!=' ') + $sql_query.=" AND (verband='".$this->verband[$anz]."' OR verband IS NULL OR verband='' OR verband=' ')"; + if ($this->gruppe[$anz]!=null && $this->gruppe[$anz]!='' && $this->gruppe[$anz]!=' ') + $sql_query.=" AND (gruppe='".$this->gruppe[$anz]."' OR gruppe IS NULL OR gruppe='' OR gruppe=' ')"; + } + $sql_query.=')'; + } + $sql_query.=")"; + + if (!$this->db_query($sql_query)) + { + $this->errormsg=$this->db_last_error(); + return false; + } + $erg_stpl=$this->db_result; + + $anzahl=$this->db_num_rows($erg_stpl); + if($anzahl==0) + { + // Reservierungen pruefen? + if (!$ignore_reservation) + { + // Datenbank abfragen ( studiengang_kz, titel, beschreibung ) + //Lektoren SQL + $sql_lkt=''; + foreach ($this->mitarbeiter_uid as $lkt) + $sql_lkt.="OR uid='$lkt' "; + $sql_lkt=mb_substr($sql_lkt,3); + $sql_lkt="(($sql_lkt) AND uid!='_DummyLektor')"; + $sql_query="SELECT reservierung_id AS id, uid AS lektor, stg_kurzbz, ort_kurzbz, semester, verband, gruppe, gruppe_kurzbz, datum, stunde + FROM lehre.vw_reservierung + WHERE datum='".addslashes($datum)."' AND stunde='".addslashes($stunde)."' + AND (ort_kurzbz='".addslashes($ort)."' OR $sql_lkt)"; + + if (!$this->db_query($sql_query)) + { + $this->errormsg=$sql_query.$this->db_last_error(); + return false; + } + $erg_res=$this->db_result; + $anz_res=$this->db_num_rows($erg_res); + //Check + if ($anz_res==0) + { + // Zeitsperren pruefen? + if (!$ignore_zeitsperre) + { + // Datenbank abfragen ( studiengang_kz, titel, beschreibung ) + //Lektoren SQL + $sql_lkt=''; + foreach ($this->mitarbeiter_uid as $lkt) + $sql_lkt.="OR mitarbeiter_uid='$lkt' "; + $sql_lkt=mb_substr($sql_lkt,3); + $sql_query="SELECT * FROM campus.tbl_zeitsperre + WHERE ($sql_lkt) AND + ( (vondatum<'$datum' AND bisdatum>'$datum') + OR (vondatum='$datum' AND bisdatum='$datum' AND vonstunde<=$stunde AND bisstunde>=$stunde) + OR (vondatum='$datum' AND bisdatum>'$datum' AND vonstunde<=$stunde) + OR (vondatum<'$datum' AND bisdatum='$datum' AND bisstunde>=$stunde) )"; + //echo $sql_query.'
'; + if (!$this->db_query($sql_query)) + { + $this->errormsg=$sql_query.$this->db_last_error(); + return false; + } + $erg_zs=$this->db_result; + $anz_zs=$this->db_num_rows($erg_zs); + //Check + if ($anz_zs==0) + return true; + else + { + $row=$this->db_fetch_object($erg_zs); + $this->errormsg="Kollision (Zeitsperre): $row->zeitsperre_id|$row->mitarbeiter_uid|$row->zeitsperretyp_kurzbz|$row->bezeichnung|$row->vondatum/$row->vonstunde-$row->bisdatum/$row->bisstunde - $row->vertretung_uid"; + return false; + } + } + return true; + } + else + { + $row=$this->db_fetch_object($erg_res); + $this->errormsg="Kollision (Reservierung): $row->id|$row->lektor|$row->ort_kurzbz|$row->stg_kurzbz-$row->semester$row->verband$row->gruppe$row->gruppe_kurzbz - $row->datum/$row->stunde"; + return false; + } + } + return true; + } + else + { + $row=$this->db_fetch_object($erg_stpl); + $this->errormsg="Kollision mit StundenplanID($stpl_id): ".$row->$stpl_id." | $datum - $row->stunde | $ort | ".($row->gruppe_kurzbz!=''?$row->gruppe_kurzbz:$stg_obj->kuerzel_arr[$row->studiengang_kz]."-$row->semester$row->verband$row->gruppe"); + return false; } - return true; } else { diff --git a/include/lehrstunde.class.php b/include/lehrstunde.class.php index b4b102fe4..9cef694b3 100644 --- a/include/lehrstunde.class.php +++ b/include/lehrstunde.class.php @@ -562,12 +562,18 @@ class lehrstunde extends basis_db if($kollision_student=='false') { $sql_query.=" OR (studiengang_kz='".addslashes($this->studiengang_kz)."' AND semester='".addslashes($this->sem)."'"; - if ($this->ver!=null && $this->ver!='' && $this->ver!=' ') - $sql_query.=" AND (verband='".addslashes($this->ver)."' OR verband IS NULL OR verband='' OR verband=' ')"; - if ($this->grp!=null && $this->grp!='' && $this->grp!=' ') - $sql_query.=" AND (gruppe='".addslashes($this->grp)."' OR gruppe IS NULL OR gruppe='' OR gruppe=' ')"; - if ($this->gruppe_kurzbz!=null && $this->gruppe_kurzbz!='' && $this->gruppe_kurzbz!=' ') - $sql_query.=" AND (gruppe_kurzbz='".addslashes($this->gruppe_kurzbz)."' OR gruppe_kurzbz IS null)"; + if($this->gruppe_kurzbz!=null && $this->gruppe_kurzbz!='' && $this->gruppe_kurzbz!=' ') + { + $sql_query.=" OR (gruppe_kurzbz='".addslashes($this->gruppe_kurzbz)."')"; + } + else + { + if ($this->ver!=null && $this->ver!='' && $this->ver!=' ') + $sql_query.=" AND (verband='".addslashes($this->ver)."' OR verband IS NULL OR verband='' OR verband=' ')"; + if ($this->grp!=null && $this->grp!='' && $this->grp!=' ') + $sql_query.=" AND (gruppe='".addslashes($this->grp)."' OR gruppe IS NULL OR gruppe='' OR gruppe=' ')"; + } + $sql_query.=")"; } $sql_query.=") AND unr!='".addslashes($this->unr)."'"; @@ -577,7 +583,7 @@ class lehrstunde extends basis_db $this->errormsg=$sql_query.$this->db_last_error(); return true; } - + $anz=$this->db_num_rows($erg_stpl); if ($anz==0) { diff --git a/include/wochenplan.class.php b/include/wochenplan.class.php index aa5cd5e8d..b035fbc53 100644 --- a/include/wochenplan.class.php +++ b/include/wochenplan.class.php @@ -1428,7 +1428,7 @@ class wochenplan extends basis_db if ($l->grp!='' && $l->grp!=' ' && $l->grp!=null) $lvb.=" AND (gruppe='".addslashes($l->grp)."' OR gruppe IS NULL OR gruppe='')"; } - //if ($gruppen=='') + //if ($gruppen!='') // $lvb.=' AND gruppe_kurzbz IS NULL'; $lvb.=')'; } @@ -1718,8 +1718,7 @@ class wochenplan extends basis_db if ($l->grp!='' && $l->grp!=' ' && $l->grp!=null) $lvb.=" AND (gruppe='".addslashes($l->grp)."' OR gruppe IS NULL OR gruppe='' OR gruppe=' ')"; } - if ($gruppen=='') - $lvb.=' AND gruppe_kurzbz IS NULL'; + $lvb.=')'; } $lvb=mb_substr($lvb,3); @@ -1873,9 +1872,7 @@ class wochenplan extends basis_db { // 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); - } } } } @@ -1886,7 +1883,6 @@ class wochenplan extends basis_db } } } - // Variablen abgleichen $rest-=$block; if ($block>$rest) @@ -2131,7 +2127,7 @@ class wochenplan extends basis_db echo $this->crlf.'"'.$this->std_plan[$i][$j][$idx]->lehrfach.(isset($this->std_plan[$i][$j][$idx]->lehrform) && $this->std_plan[$i][$j][$idx]->lehrform!=''?'-'.$this->std_plan[$i][$j][$idx]->lehrform:'').($lvb!=''?' - '.$lvb:'').'","'.$start_date.'","'.$start_time.'","'.$end_date.'","'.$end_time.'","Aus","Aus",,,,,,,,"Stundenplan'; echo $this->crlf.$this->std_plan[$i][$j][$idx]->lehrfach.$this->crlf.$this->std_plan[$i][$j][$idx]->lektor.$this->crlf.$lvb.$this->crlf.$this->std_plan[$i][$j][$idx]->ort.'","StundenplanFH","'.$this->std_plan[$i][$j][$idx]->ort.'","Normal","Aus",,"Normal","2"'; } - else if ($target=='ical') + elseif ($target=='ical') { $sda = explode(".",$start_date); //sda start date array $sta = explode(":",$start_time); //sta start time array @@ -2153,6 +2149,30 @@ class wochenplan extends basis_db .'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; + /* + echo $this->crlf.'BEGIN:VEVENT'.$this->crlf + .'UID:'.'FH'.$lvb.$this->std_plan[$i][$j][$idx]->ort.$this->std_plan[$i][$j][$idx]->lektor.$lehrfach[$idx].$start_date_time_ical.$this->crlf + .'SUMMARY:'.$lehrfach[$idx].' '.$this->std_plan[$i][$j][$idx]->ort.' - '.$lvb.$this->crlf + .'DESCRIPTION:'.$lehrfach[$idx].'\n'.$this->std_plan[$i][$j][$idx]->lektor.'\n'.$lvb.'\n'.$this->std_plan[$i][$j][$idx]->ort.$this->crlf + .'LOCATION:'.$this->std_plan[$i][$j][$idx]->ort.$this->crlf + .'CATEGORIES:'.$lvplan_kategorie.$this->crlf + .'DTSTART;TZID=Europe/Vienna:'.$start_date_time_ical.$this->crlf + .'DTEND;TZID=Europe/Vienna:'.$end_date_time_ical.$this->crlf + .'END:VEVENT'; + */ + } else { echo $this->crlf.'"'.$lehrfach[$idx].'","'.$lvplan_kategorie.'","'.$this->std_plan[$i][$j][$idx]->ort.'","Stundenplan'.$this->crlf.$this->std_plan[$i][$j][$idx]->lehrfach.$this->crlf;