ical_calendario.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. <?php
  2. /*
  3. * Recibe los perfiles y a busca los eventos del periodo en sesión
  4. */
  5. require_once("../../include/constantes.php");
  6. require_once("../../include/nocache.php");
  7. require_once("../../include/bd_pdo.php");
  8. require_once("../../include/util.php");
  9. require_once("../../classes/ValidaSesion.php");
  10. include_once("../../include/iCalcreator/autoload.php");
  11. use Kigkonsult\Icalcreator\Vcalendar;
  12. function getVcalDia($diaNum){
  13. switch($diaNum){
  14. case 0: return Vcalendar::SU;
  15. case 1: return Vcalendar::MO;
  16. case 2: return Vcalendar::TU;
  17. case 3: return Vcalendar::WE;
  18. case 4: return Vcalendar::TH;
  19. case 5: return Vcalendar::FR;
  20. case 6: return Vcalendar::SA;
  21. }
  22. }
  23. function getDiasArray($diasStr, $week_num = false, $freq = 0){
  24. $diasArr = explode(",", $diasStr);
  25. $final_arr = array();
  26. foreach($diasArr as $dia){
  27. if(!$week_num)
  28. $final_arr[] = array(Vcalendar::DAY => getVcalDia($dia));
  29. else
  30. $final_arr[] = array($freq, Vcalendar::DAY => getVcalDia($dia));
  31. }
  32. return $final_arr;
  33. }
  34. function fechaICal($fecha, $hora="", $tz=""){
  35. $fecha = fechaGuion($fecha);
  36. if($hora!= ""){
  37. if($tz != ""){
  38. return str_replace('-', '', $fecha).'T'.str_replace(':', '', $hora)." ".$tz;
  39. }else{
  40. return str_replace('-', '', $fecha).'T'.str_replace(':', '', $hora);
  41. }
  42. }
  43. return str_replace('-', '', $fecha);
  44. }
  45. $objSesion = new ValidaSesion($pdo, 57, APSA);
  46. if(!$objSesion->tieneAcceso() ){
  47. echo "Error! No tienes permisos para realizar esta acción.";
  48. exit();
  49. }else if(!isset($_POST["perfiles"])){
  50. echo "Error! No se recibió la información de los perfiles.";
  51. exit();
  52. }else{
  53. $perfiles = trim(filter_input(INPUT_POST, "perfiles", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));//limpia texto
  54. //$fecha_min = fechaGuion(trim(filter_input(INPUT_POST, "fecha_min", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW))));//limpia texto
  55. //$fecha_max = fechaGuion(trim(filter_input(INPUT_POST, "fecha_max", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW))));//limpia texto
  56. // Obtiene fecha máxima y min
  57. $stmt = $pdo->prepare('Select * from fs_fechaimportante(:periodo, 3)');//periodo
  58. $stmt->bindParam(":periodo", $_SESSION["periodo_id"]);
  59. if(!$stmt->execute()){
  60. $errorDesc = "Ocurrió un error al cargar las fechas del periodo";
  61. }else{
  62. $fecha_rs = $stmt->fetch();
  63. $fecha_min = date('d/m/Y', strtotime($fecha_rs["FechaImportante_inicial"].' - 1 month '));
  64. $fecha_max = date('d/m/Y', strtotime($fecha_rs["FechaImportante_final"].' + 1 month '));
  65. }
  66. $stmt->closeCursor();
  67. $stmt = null;
  68. //Obtiene datos de periodo
  69. $stmt = $pdo->prepare('Select * from fs_periodo(:periodo, NULL, NULL, true)');
  70. $stmt->bindParam(":periodo", $_SESSION["periodo_id"]);
  71. if(!$stmt->execute()){
  72. //print_r($stmt->errorInfo());
  73. $errorDesc = "Ocurrió un error al cargar los datos del periodo";
  74. }else{
  75. $periodo_rs = $stmt->fetch();
  76. }
  77. $stmt->closeCursor();
  78. $eventos_display = array();//todos los eventos para exportar
  79. $stmt = $pdo->prepare('Select * from fs_calendarioevento(:per, :fecha_i, :fecha_f, :perf, false)');
  80. $stmt->bindParam(":per", $_SESSION["periodo_id"]);
  81. $stmt->bindParam(":fecha_i", $fecha_min);
  82. $stmt->bindParam(":fecha_f", $fecha_max);
  83. $stmt->bindParam(":perf", $perfiles);
  84. unset($perfiles);
  85. $error = false;
  86. if(!$stmt->execute()){
  87. $t = $stmt->errorInfo();
  88. echo "Ocurrió un error al obtener los eventos.".$t[2];
  89. exit();
  90. $error = true;
  91. }
  92. if(!$error){
  93. $eventos_rs = $stmt->fetchAll();
  94. $stmt->closeCursor();
  95. //Configuración de calendario
  96. $tz = "America/Mexico_City";
  97. $config = [
  98. Vcalendar::UNIQUE_ID => "IngenieriaLaSalle",
  99. Vcalendar::LANGUAGE=> "es",
  100. ];
  101. $calendar = Vcalendar::factory( $config )
  102. // required of some calendar software
  103. ->setMethod( Vcalendar::PUBLISH )
  104. ->setXprop( Vcalendar::X_WR_CALNAME, "Ingeniería La Salle" )
  105. ->setXprop( Vcalendar::X_WR_CALDESC, "Calendario de Ingeniería ".$periodo_rs["Periodo_desc"] )
  106. ->setXprop( Vcalendar::X_WR_RELCALID,"3E26604A-50F4-4449-8B3E-E4F4932D05B5" )
  107. ->setXprop( Vcalendar::X_WR_TIMEZONE, $tz );
  108. $calendar->VtimezonePopulate( $tz );
  109. //-------------------------
  110. //Obtiene fechas de periodo
  111. $stmt = $pdo->prepare('Select * from fs_periodo(:periodo, NULL, NULL, true)');
  112. $stmt->bindParam(":periodo", $_SESSION["periodo_id"]);
  113. if(!$stmt->execute()){
  114. //print_r($stmt->errorInfo());
  115. $errorDesc = "Ocurrió un error al cargar los datos del periodo";
  116. }else{
  117. $periodo_rs = $stmt->fetch();
  118. }
  119. $stmt->closeCursor();
  120. $fecha = $periodo_rs["Periodo_fecha_inicial"];
  121. $next_day = date('Y-m-d', strtotime($fecha.' + 1 day '));
  122. //Crea evento iCal
  123. $calendar->newVevent()
  124. ->setSequence( 0 )
  125. ->setSummary("Inicio de cursos")
  126. ->setDtstart($fecha, [ Vcalendar::VALUE => Vcalendar::DATE ])
  127. ->setDtend( $next_day, [ Vcalendar::VALUE => Vcalendar::DATE ]);
  128. $fecha = $periodo_rs["Periodo_fecha_final"];
  129. $next_day = date('Y-m-d', strtotime($fecha.' + 1 day '));
  130. //Crea evento iCal
  131. $calendar->newVevent()
  132. ->setSequence( 0 )
  133. ->setSummary("Fin de cursos")
  134. ->setDtstart($fecha, [ Vcalendar::VALUE => Vcalendar::DATE ])
  135. ->setDtend( $next_day, [ Vcalendar::VALUE => Vcalendar::DATE ]);
  136. $stmt = $pdo->prepare('Select * from fs_fechaimportante(:periodo, 2)');//extras
  137. $stmt->bindParam(":periodo", $_SESSION["periodo_id"]);
  138. if(!$stmt->execute()){
  139. $errorDesc = "Ocurrió un error al cargar las fechas del periodo";
  140. }else{
  141. $fecha_rs = $stmt->fetch();
  142. if(is_array($fecha_rs) && count($fecha_rs) > 0){
  143. $fecha = $fecha_rs["FechaImportante_inicial"];
  144. $next_day = date('Y-m-d', strtotime($fecha.' + 1 day '));
  145. //Crea evento iCal
  146. $calendar->newVevent()
  147. ->setSequence( 0 )
  148. ->setSummary("Exámenes Extraordinarios")
  149. ->setDtstart($fecha, [ Vcalendar::VALUE => Vcalendar::DATE ])
  150. ->setDtend( $next_day, [ Vcalendar::VALUE => Vcalendar::DATE ])
  151. ->setRrule(
  152. [
  153. Vcalendar::FREQ => Vcalendar::WEEKLY,
  154. Vcalendar::BYDAY => getDiasArray("1,2,3,4,5", false),
  155. Vcalendar::UNTIL => new DateTime($fecha_rs["FechaImportante_final"] ),
  156. ]
  157. );
  158. }
  159. }
  160. $stmt->closeCursor();
  161. $stmt = null;
  162. //-------------------------
  163. //Recorre eventos
  164. foreach($eventos_rs as $evento){
  165. /*,$evento["CalendarioCategoria_id"], $evento["CalendarioCategoria_desc"],
  166. * $evento["CalendarioCategoria_color"], $evento["Periodo_id"] ,,
  167. * , ,);
  168. */
  169. $id_db = $evento["CalendarioEvento_id"];
  170. $fecha = fechaGuion($evento["CalendarioEvento_fecha"]);
  171. //Crea evento iCal
  172. $icalEvent = $calendar->newVevent()
  173. ->setSequence( 0 )
  174. ->setSummary($evento["CalendarioEvento_titulo"]);
  175. if(trim($evento["CalendarioEvento_desc"]) != ""){
  176. $icalEvent->setDescription(trim($evento["CalendarioEvento_desc"]));
  177. }
  178. if($evento["CalendarioEvento_todo_dia"]){//sin hora
  179. $next_day = date('Y-m-d', strtotime($fecha.' + 1 day '));
  180. $icalEvent->setDtstart($fecha, [ Vcalendar::VALUE => Vcalendar::DATE ])
  181. ->setDtend( $next_day, [ Vcalendar::VALUE => Vcalendar::DATE ]);
  182. }else{//con horas
  183. $icalEvent->setDtstart( new DateTime( $fecha.' '.$evento["CalendarioEvento_hora_inicial"], new DateTimezone( $tz )))
  184. ->setDtend( new DateTime( $fecha.' '.$evento["CalendarioEvento_hora_final"], new DateTimezone( $tz )));
  185. }
  186. //-- Calcular posibles fechas e insertar fechas en objeto --
  187. switch($evento["CalendarioRepeticion_id"]){
  188. case 1: //diario
  189. $icalEvent->setRrule(
  190. [
  191. Vcalendar::FREQ => Vcalendar::DAILY,
  192. Vcalendar::UNTIL => new DateTime($evento["CalendarioReglas_fecha_final"] ),//no incluyente
  193. ]
  194. );
  195. break;
  196. case 2: //semanal
  197. $icalEvent->setRrule(
  198. [
  199. Vcalendar::FREQ => Vcalendar::WEEKLY,
  200. Vcalendar::BYDAY => getDiasArray($evento["CalendarioReglas_dias_str"], false),
  201. /*Vcalendar::BYDAY => [
  202. [ -1, Vcalendar::DAY => Vcalendar::WE ], // last WE
  203. [ 3, Vcalendar::DAY => Vcalendar::TH ], // third TH
  204. [ 5, Vcalendar::DAY => Vcalendar::FR ], // fifth FR
  205. [ Vcalendar::DAY => Vcalendar::MO ] // every MO
  206. ],*/
  207. Vcalendar::UNTIL => new DateTime($evento["CalendarioReglas_fecha_final"] ),//no incluyente
  208. ]
  209. );
  210. break;
  211. case 3://mensual
  212. $icalEvent->setRrule(
  213. [
  214. Vcalendar::FREQ => Vcalendar::MONTHLY,
  215. Vcalendar::BYDAY => getDiasArray($evento["CalendarioReglas_dias_str"], true, $evento["CalendarioReglas_semana"]),
  216. Vcalendar::UNTIL => new DateTime($evento["CalendarioReglas_fecha_final"] ),//no incluyente
  217. ]
  218. );
  219. break;
  220. }
  221. //Obtiene eventos modificados (fechas que cambiaron)
  222. $stmt = $pdo->prepare('Select * from fs_calendarioeventoeditado(:id)');
  223. $stmt->bindParam(":id", $id_db);
  224. if(!$stmt->execute()){
  225. $t = $stmt->errorInfo();
  226. echo "Ocurrió un error al obtener las fechas editadas.".$t[2];
  227. exit();
  228. $error = true;
  229. break;
  230. }
  231. if(!$error){
  232. //--Modifica fechas
  233. $eventosEditados_rs = $stmt->fetchAll();
  234. $stmt->closeCursor();
  235. foreach($eventosEditados_rs as $modif){
  236. $eventoEdit = $calendar->newVevent()
  237. ->setUid( $icalEvent->getUid())
  238. ->setSequence( 1 )
  239. ->setSummary( $icalEvent->getSummary() )
  240. ->setDescription($icalEvent->getDescription());
  241. if($evento["CalendarioEvento_todo_dia"]){//sin hora
  242. $next_day = date('Y-m-d', strtotime($modif["CalendarioEventoEditado_fecha_nueva"].' + 1 day '));
  243. $eventoEdit->setDtstart($modif["CalendarioEventoEditado_fecha_nueva"], [ Vcalendar::VALUE => Vcalendar::DATE ])
  244. ->setDtend( $next_day, [ Vcalendar::VALUE => Vcalendar::DATE ])
  245. ->setRecurrenceid( $modif["CalendarioEventoEditado_fecha_origen"], [ Vcalendar::VALUE => Vcalendar::DATE ] );//obtiene fecha que se cambia;
  246. }else{//con horas
  247. $eventoEdit->setDtstart(
  248. new DateTime(fechaICal($modif["CalendarioEventoEditado_fecha_nueva"], $modif["CalendarioEventoEditado_hora_inicial"]), new DateTimezone( $tz ))
  249. )
  250. ->setDtend(
  251. new DateTime(fechaICal($modif["CalendarioEventoEditado_fecha_nueva"], $modif["CalendarioEventoEditado_hora_final"]), new DateTimezone( $tz ))
  252. )
  253. ->setRecurrenceid( fechaICal($modif["CalendarioEventoEditado_fecha_origen"], $evento["CalendarioEvento_hora_inicial"],$tz) );//obtiene fecha que se cambia;
  254. }
  255. }
  256. //--Quitar fechas de excepción
  257. if($evento["CalendarioEvento_excepcion_str"] != ""){
  258. foreach(explode(",", $evento["CalendarioEvento_excepcion_str"]) as $ex){
  259. $exArr = explode(" ", $ex);
  260. if($evento["CalendarioEvento_todo_dia"]){//sin hora
  261. $icalEvent->setExdate( fechaICal($exArr[0]), [ Vcalendar::VALUE => Vcalendar::DATE ] );
  262. }else{
  263. $icalEvent->setExdate( $ex, new DateTimezone( $tz ) );
  264. }
  265. }
  266. }
  267. }
  268. }//foreach
  269. unset($eventos_rs);
  270. }//not error
  271. if(!$error){
  272. $calendar->returnCalendar("calendarioIng.ics");
  273. //echo $calendar->vtimezonePopulate()->createCalendar();
  274. }
  275. }