123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308 |
- <?php
- /*
- * Recibe los perfiles y periodo por GET.
- */
- require_once("./include/nocache.php");
- require_once("./include/bd_pdo.php");
- require_once("./include/util.php");
- include_once("./include/iCalcreator/autoload.php");
- include_once("./classes/LogICal.php");
- use Kigkonsult\Icalcreator\Vcalendar;
- function getVcalDia($diaNum){
- switch($diaNum){
- case 0: return Vcalendar::SU;
- case 1: return Vcalendar::MO;
- case 2: return Vcalendar::TU;
- case 3: return Vcalendar::WE;
- case 4: return Vcalendar::TH;
- case 5: return Vcalendar::FR;
- case 6: return Vcalendar::SA;
- }
- }
- function getDiasArray($diasStr, $week_num = false, $freq = 0){
- $diasArr = explode(",", $diasStr);
- $final_arr = array();
- foreach($diasArr as $dia){
- if(!$week_num)
- $final_arr[] = array(Vcalendar::DAY => 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();
|