getVcalDia($dia)); else $final_arr[] = array($freq, Vcalendar::DAY => getVcalDia($dia)); } return $final_arr; } function fechaICal($fecha, $hora="", $tz=""){ $fecha = fechaGuion($fecha); if($hora!= ""){ if($tz != ""){ return str_replace('-', '', $fecha).'T'.str_replace(':', '', $hora)." ".$tz; }else{ return str_replace('-', '', $fecha).'T'.str_replace(':', '', $hora); } } return str_replace('-', '', $fecha); } if(!isset($_GET["per"], $_GET["valida"]) ){ echo "Error! La liga proporcionada no es válida."; exit(); } if(isset($_GET["perf"])){ $perfiles = trim(filter_input(INPUT_GET, "perf", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));//limpia texto }else{ $perfiles = "4"; } $periodo = filter_input(INPUT_GET, "per", FILTER_SANITIZE_NUMBER_INT);//limpia texto if(crypt($periodo.$perfiles, "ps") != $_GET["valida"]){ echo "Error! La liga proporcionada no es válida."; exit(); } // Obtiene fecha máxima y min $stmt = $pdo->prepare('Select * from fs_fechaimportante(:periodo, 3)');//periodo $stmt->bindParam(":periodo", $periodo); if(!$stmt->execute()){ echo "Ocurrió un error al cargar las fechas del periodo"; exit(); } $fecha_rs = $stmt->fetch(); $fecha_min = date('d/m/Y', strtotime($fecha_rs["FechaImportante_inicial"].' - 1 month ')); $fecha_max = date('d/m/Y', strtotime($fecha_rs["FechaImportante_final"].' + 1 month ')); $stmt->closeCursor(); $stmt = null; //Obtiene datos de periodo $stmt = $pdo->prepare('Select * from fs_periodo(:periodo, NULL, NULL, true)'); $stmt->bindParam(":periodo", $periodo); if(!$stmt->execute()){ //print_r($stmt->errorInfo()); echo "Ocurrió un error al cargar los datos del periodo"; exit(); } $periodo_rs = $stmt->fetch(); $stmt->closeCursor(); $eventos_display = array();//todos los eventos para exportar $stmt = $pdo->prepare('Select * from fs_calendarioevento(:per, :fecha_i, :fecha_f, :perf, false)'); $stmt->bindParam(":per", $periodo); $stmt->bindParam(":fecha_i", $fecha_min); $stmt->bindParam(":fecha_f", $fecha_max); $stmt->bindParam(":perf", $perfiles); unset($perfiles); if(!$stmt->execute()){ echo "Ocurrió un error al obtener los eventos."; exit(); } $eventos_rs = $stmt->fetchAll(); $stmt->closeCursor(); //------------------------- //Obtiene fechas de periodo $stmt = $pdo->prepare('Select * from fs_periodo(:periodo, NULL, NULL, true)'); $stmt->bindParam(":periodo", $periodo); if(!$stmt->execute()){ echo "Ocurrió un error al cargar los datos del periodo"; exit(); } $periodo_rs = $stmt->fetch(); $stmt->closeCursor(); //Configuración de calendario $tz = "America/Mexico_City"; $config = [ Vcalendar::UNIQUE_ID => "IngenieriaLaSalle", Vcalendar::LANGUAGE=> "es", ]; $calendar = Vcalendar::factory( $config ) // required of some calendar software ->setMethod( Vcalendar::PUBLISH ) ->setXprop( Vcalendar::X_WR_CALNAME, "Ingeniería La Salle ".date('Y,m', strtotime($periodo_rs["Periodo_fecha_inicial"])) ) ->setXprop( Vcalendar::X_WR_CALDESC, "Calendario de Ingeniería ".$periodo_rs["Periodo_desc"] ) ->setXprop( Vcalendar::X_WR_RELCALID,"3E26604A-50F4-4449-8B3E-E4F4932D05B5" ) ->setXprop( Vcalendar::X_WR_TIMEZONE, $tz ); $calendar->VtimezonePopulate( $tz ); $fecha = $periodo_rs["Periodo_fecha_inicial"]; $next_day = date('Y-m-d', strtotime($fecha.' + 1 day ')); //Crea evento iCal $calendar->newVevent() ->setSequence( 0 ) ->setSummary("Inicio de cursos") ->setDtstart($fecha, [ Vcalendar::VALUE => Vcalendar::DATE ]) ->setDtend( $next_day, [ Vcalendar::VALUE => Vcalendar::DATE ]); $fecha = $periodo_rs["Periodo_fecha_final"]; $next_day = date('Y-m-d', strtotime($fecha.' + 1 day ')); //Crea evento iCal $calendar->newVevent() ->setSequence( 0 ) ->setSummary("Fin de cursos") ->setDtstart($fecha, [ Vcalendar::VALUE => Vcalendar::DATE ]) ->setDtend( $next_day, [ Vcalendar::VALUE => Vcalendar::DATE ]); $stmt = $pdo->prepare('Select * from fs_fechaimportante(:periodo, 2)');//extras $stmt->bindParam(":periodo", $periodo); if(!$stmt->execute()){ echo "Ocurrió un error al cargar las fechas del periodo"; exit(); } $fecha_rs = $stmt->fetch(); if( is_array($fecha_rs) && count($fecha_rs) > 0){ $fecha = $fecha_rs["FechaImportante_inicial"]; $next_day = date('Y-m-d', strtotime($fecha.' + 1 day ')); //Crea evento iCal $calendar->newVevent() ->setSequence( 0 ) ->setSummary("Exámenes Extraordinarios") ->setDtstart($fecha, [ Vcalendar::VALUE => Vcalendar::DATE ]) ->setDtend( $next_day, [ Vcalendar::VALUE => Vcalendar::DATE ]) ->setRrule( [ Vcalendar::FREQ => Vcalendar::WEEKLY, Vcalendar::BYDAY => getDiasArray("1,2,3,4,5", false), Vcalendar::UNTIL => new DateTime($fecha_rs["FechaImportante_final"] ), ] ); } $stmt->closeCursor(); $stmt = null; //------------------------- //Recorre eventos foreach($eventos_rs as $evento){ $id_db = $evento["CalendarioEvento_id"]; $fecha = fechaGuion($evento["CalendarioEvento_fecha"]); //Crea evento iCal $icalEvent = $calendar->newVevent() ->setSequence( 0 ) ->setSummary($evento["CalendarioEvento_titulo"]); if(trim($evento["CalendarioEvento_desc"]) != ""){ $icalEvent->setDescription(trim($evento["CalendarioEvento_desc"])); } if($evento["CalendarioEvento_todo_dia"]){//sin hora $next_day = date('Y-m-d', strtotime($fecha.' + 1 day ')); $icalEvent->setDtstart($fecha, [ Vcalendar::VALUE => Vcalendar::DATE ]) ->setDtend( $next_day, [ Vcalendar::VALUE => Vcalendar::DATE ]); }else{//con horas $icalEvent->setDtstart( new DateTime( $fecha.' '.$evento["CalendarioEvento_hora_inicial"], new DateTimezone( $tz ))) ->setDtend( new DateTime( $fecha.' '.$evento["CalendarioEvento_hora_final"], new DateTimezone( $tz ))); } //-- Calcular posibles fechas e insertar fechas en objeto -- switch($evento["CalendarioRepeticion_id"]){ case 1: //diario $icalEvent->setRrule( [ Vcalendar::FREQ => Vcalendar::DAILY, Vcalendar::UNTIL => new DateTime($evento["CalendarioReglas_fecha_final"] ),//no incluyente ] ); break; case 2: //semanal $icalEvent->setRrule( [ Vcalendar::FREQ => Vcalendar::WEEKLY, Vcalendar::BYDAY => getDiasArray($evento["CalendarioReglas_dias_str"], false), /*Vcalendar::BYDAY => [ [ -1, Vcalendar::DAY => Vcalendar::WE ], // last WE [ 3, Vcalendar::DAY => Vcalendar::TH ], // third TH [ 5, Vcalendar::DAY => Vcalendar::FR ], // fifth FR [ Vcalendar::DAY => Vcalendar::MO ] // every MO ],*/ Vcalendar::UNTIL => new DateTime($evento["CalendarioReglas_fecha_final"] ),//no incluyente ] ); break; case 3://mensual $icalEvent->setRrule( [ Vcalendar::FREQ => Vcalendar::MONTHLY, Vcalendar::BYDAY => getDiasArray($evento["CalendarioReglas_dias_str"], true, $evento["CalendarioReglas_semana"]), Vcalendar::UNTIL => new DateTime($evento["CalendarioReglas_fecha_final"] ),//no incluyente ] ); break; } //Obtiene eventos modificados (fechas que cambiaron) $stmt = $pdo->prepare('Select * from fs_calendarioeventoeditado(:id)'); $stmt->bindParam(":id", $id_db); if(!$stmt->execute()){ echo "Ocurrió un error al obtener las fechas editadas."; exit(); } //--Modifica fechas $eventosEditados_rs = $stmt->fetchAll(); $stmt->closeCursor(); foreach($eventosEditados_rs as $modif){ $eventoEdit = $calendar->newVevent() ->setUid( $icalEvent->getUid()) ->setSequence( 1 ) ->setSummary( $icalEvent->getSummary() ) ->setDescription($icalEvent->getDescription()); if($evento["CalendarioEvento_todo_dia"]){//sin hora $next_day = date('Y-m-d', strtotime($modif["CalendarioEventoEditado_fecha_nueva"].' + 1 day ')); $eventoEdit->setDtstart($modif["CalendarioEventoEditado_fecha_nueva"], [ Vcalendar::VALUE => Vcalendar::DATE ]) ->setDtend( $next_day, [ Vcalendar::VALUE => Vcalendar::DATE ]) ->setRecurrenceid( $modif["CalendarioEventoEditado_fecha_origen"], [ Vcalendar::VALUE => Vcalendar::DATE ] );//obtiene fecha que se cambia; }else{//con horas $eventoEdit->setDtstart( new DateTime(fechaICal($modif["CalendarioEventoEditado_fecha_nueva"], $modif["CalendarioEventoEditado_hora_inicial"]), new DateTimezone( $tz )) ) ->setDtend( new DateTime(fechaICal($modif["CalendarioEventoEditado_fecha_nueva"], $modif["CalendarioEventoEditado_hora_final"]), new DateTimezone( $tz )) ) ->setRecurrenceid( fechaICal($modif["CalendarioEventoEditado_fecha_origen"], $evento["CalendarioEvento_hora_inicial"],$tz) );//obtiene fecha que se cambia; } } //--Quitar fechas de excepción if($evento["CalendarioEvento_excepcion_str"] != ""){ foreach(explode(",", $evento["CalendarioEvento_excepcion_str"]) as $ex){ $exArr = explode(" ", $ex); if($evento["CalendarioEvento_todo_dia"]){//sin hora $icalEvent->setExdate( fechaICal($exArr[0]), [ Vcalendar::VALUE => Vcalendar::DATE ] ); }else{ $icalEvent->setExdate( $ex, new DateTimezone( $tz ) ); } } } }//foreach unset($eventos_rs); $data = "[ REMOTE_ADDR = ".$_SERVER['REMOTE_ADDR']." ]"; $data .= "[ QUERY_STRING = ".$_SERVER['QUERY_STRING']." ]"; $logObj = new LogICal(); $logObj->appendLog($data); echo $calendar->vtimezonePopulate()->createCalendar();