From 34bed51ff7603bb256c491a588bb462fb80237bd Mon Sep 17 00:00:00 2001 From: OliiverHacker Date: Fri, 30 Oct 2020 10:04:51 +0100 Subject: [PATCH] include moodle link in iCal export if moodle addon is installed --- cis/private/lvplan/stpl_kalender.php | 10 +- cis/private/lvplan/stpl_week.php | 7 + include/wochenplan.class.php | 365 ++++++++++++++++++++++++++- 3 files changed, 380 insertions(+), 2 deletions(-) diff --git a/cis/private/lvplan/stpl_kalender.php b/cis/private/lvplan/stpl_kalender.php index 16ea2e48f..2dcb05c95 100644 --- a/cis/private/lvplan/stpl_kalender.php +++ b/cis/private/lvplan/stpl_kalender.php @@ -78,6 +78,7 @@ $target=(isset($_GET['target'])?$_GET['target']:null); $stsem=(isset($_GET['stsem'])?$_GET['stsem']:''); $lva=(isset($_GET['lva'])?$_GET['lva']:''); +$moodle=(isset($_GET['moodle'])?$_GET['moodle']:''); if(isset($_GET["cal"])) { @@ -307,7 +308,14 @@ while($begin<$ende) // Stundenplan der Woche drucken if($format=='csv' || $format=='ical') { - $stdplan->draw_week_csv($target, LVPLAN_KATEGORIE); + if($moodle) + { + $stdplan->draw_week_csv_include_moodle($target, LVPLAN_KATEGORIE); + } + else + { + $stdplan->draw_week_csv($target, LVPLAN_KATEGORIE); + } } elseif($format=='excel') { diff --git a/cis/private/lvplan/stpl_week.php b/cis/private/lvplan/stpl_week.php index d4a7653a2..95a78f37b 100644 --- a/cis/private/lvplan/stpl_week.php +++ b/cis/private/lvplan/stpl_week.php @@ -266,12 +266,17 @@ if (isset($_POST['titel'])) loadAddons(); foreach($addon_obj->result as $addon) { if(file_exists('../../../addons/'.$addon->kurzbz.'/cis/init.js.php')) echo ''; + if($addon->kurzbz === "moodle") + { + $moolde = 'true'; + } } // Wenn Seite fertig geladen ist Addons aufrufen echo ' @@ -489,6 +494,8 @@ $stdplan=new wochenplan($type); if (!isset($datum)) $datum=time(); +$stdplan->moodle=$moolde; + // Benutzergruppe $stdplan->user=$user; // aktueller Benutzer diff --git a/include/wochenplan.class.php b/include/wochenplan.class.php index 066a7157f..3432d3cc0 100644 --- a/include/wochenplan.class.php +++ b/include/wochenplan.class.php @@ -100,6 +100,8 @@ class wochenplan extends basis_db public $errormsg; public $fachbereich_kurzbz; + public $moodle; + public $raeume = array(); /** @@ -508,7 +510,7 @@ class wochenplan extends basis_db 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; + $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.'&moodle='.$this->moodle; $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; @@ -2656,6 +2658,367 @@ class wochenplan extends basis_db 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_include_moodle($target, $lvplan_kategorie) + { + require_once(dirname(__FILE__).'/../addons/moodle/config.inc.php'); + require_once(dirname(__FILE__).'/../addons/moodle/include/moodle_course.class.php'); + + $return = array(); + if (!date("w",$this->datum)) + $this->datum=jump_day($this->datum,1); + $d = date("Y-m-d",$this->datum); + $stsem = getStudiensemesterFromDatum($d); + $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++) + { + $moodle_course = new moodle_course(); + $leId = $this->std_plan[$i][$j][$idx]->unr; + $lvId = $this->std_plan[$i][$j][$idx]->lehrfach_id; + $moodle_link = ''; + + if ($moodle_course->course_exists_for_le($leId)) + { + $moodle_course->getCourseByLeId($leId); + $moodle_link = ADDON_MOODLE_PATH.'/course/view.php?id='.$moodle_course->result[0]->mdl_course_id; + } + elseif ($moodle_course->course_exists_for_lv($lvId, $stsem)) + { + $moodle_course->getAll($lvId, $stsem); + $moodle_link = ADDON_MOODLE_PATH.'/course/view.php?id='.$moodle_course->result[0]->mdl_course_id; + } + + + + 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:'.$moodle_link.'\n'.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.(LVPLAN_ANMERKUNG_ANZEIGEN?'\n'.$this->std_plan[$i][$j][$idx]->anmerkung:''); + + $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