reporte_calendarioeventos.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. <?php
  2. require_once("../include/constantes.php");
  3. require_once("../include/bd_pdo.php");
  4. require_once("../classes/ValidaSesion.php");
  5. require_once("../classes/MainMenu.php");
  6. require_once("../include/util.php");
  7. require_once("./classes/Evento.php");
  8. $menu = 7;
  9. $submenu = 76;
  10. //--- Objeto para validar usuario. El id de usuario lo lee desde sesión
  11. $objSesion = new ValidaSesion($pdo, $submenu, APSA);
  12. if(!$objSesion->tieneAcceso()){
  13. $objSesion->terminaSesion();
  14. }
  15. $objSesion->validaPeriodoUsuario();//si no tiene periodo manda a main
  16. function findCategoria($list, $id){
  17. for($i=0; $i< count($list); $i++){
  18. if(intval($list[$i]["id"]) == intval($id))
  19. return $i;
  20. }
  21. return -1;
  22. }
  23. ?>
  24. <!DOCTYPE html>
  25. <html lang="es" prefix="og: http://ogp.me/ns#">
  26. <head>
  27. <title>APSA - Facultad de Ingeniería</title>
  28. <meta charset="utf-8">
  29. <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  30. <link rel="icon" type="image/png" href="../img/favicon.png" />
  31. <link rel="stylesheet" href="../css/bootstrap-ulsa.min.css" type="text/css">
  32. <link rel="stylesheet" href="../css/indivisa.css" type="text/css">
  33. <link rel="stylesheet" href="../css/sgi.css?rand=<?php echo rand();?>" type="text/css">
  34. <link rel="stylesheet" href="../css/fa_all.css" type="text/css">
  35. <link rel="stylesheet" href="../css/jquery-ui.css" type="text/css">
  36. <link rel="stylesheet" href="../css/calendar.css" type="text/css">
  37. <script src="../js/util.js"></script>
  38. </head>
  39. <body>
  40. <div>
  41. <?php
  42. //--- Objeto que pinta menu
  43. $menuObj = new MainMenu($_SESSION["usuario_id"], $menu, $pdo, APSA, "Eventos en calendario");//usr, menu, pdo, sist
  44. $menuObj->printMenu();
  45. $perfiles = '1,2,3,4';
  46. $eventos_list = array();//eventos con todas las fechas para pintarse. Arreglo de Objeto evento
  47. $error = false;
  48. //-------------------------
  49. //Obtiene fechas de periodo
  50. $stmt = $pdo->prepare('Select * from fs_periodo(:periodo, NULL, NULL, true)');
  51. $stmt->bindParam(":periodo", $_SESSION["periodo_id"]);
  52. if(!$stmt->execute()){
  53. //print_r($stmt->errorInfo());
  54. $errorDesc ="Ocurrió un error al cargar los datos del periodo.";
  55. $error = true;
  56. }else{
  57. $periodo_rs = $stmt->fetch();
  58. }
  59. if(!$error){
  60. $stmt->closeCursor();
  61. $mes=date("m", strtotime($periodo_rs["Periodo_fecha_inicial"]));
  62. $anho=date("Y", strtotime($periodo_rs["Periodo_fecha_inicial"]));
  63. $eventoObj = new Evento(-2, "Inicio de cursos","",0, "Fechas importantes", PERIODO_COLOR, $_SESSION["periodo_id"], $periodo_rs["Periodo_fecha_inicial"], true,"","", false);
  64. $eventoObj->addFecha($periodo_rs["Periodo_fecha_inicial"]);
  65. $eventos_list = array_merge($eventos_list, $eventoObj->getEventList_All($periodo_rs["Periodo_fecha_inicial"], $periodo_rs["Periodo_fecha_final"]));
  66. $eventoObj = new Evento(-1, "Fin de cursos","",0, "Fechas importantes", PERIODO_COLOR, $_SESSION["periodo_id"], $periodo_rs["Periodo_fecha_final"], true,"","", false);
  67. $eventoObj->addFecha($periodo_rs["Periodo_fecha_final"]);
  68. $eventos_list = array_merge($eventos_list, $eventoObj->getEventList_All($periodo_rs["Periodo_fecha_inicial"], $periodo_rs["Periodo_fecha_final"]));
  69. }
  70. $stmt = $pdo->prepare('Select * from fs_fechaimportante(:periodo, 2)');//extras
  71. $stmt->bindParam(":periodo", $_SESSION["periodo_id"]);
  72. if(!$stmt->execute()){
  73. $errorDesc = "Ocurrió un error al cargar las fechas del periodo.";
  74. $error = true;
  75. }else{
  76. $fecha_rs = $stmt->fetch();
  77. if(is_array($fecha_rs) && count($fecha_rs) > 0){
  78. $eventoObj = new Evento(0, "Exámenes Extraordinarios", "",0, "Fechas importantes", EXTRAS_COLOR, $_SESSION["periodo_id"], $fecha_rs["FechaImportante_inicial"], true,"","", false);
  79. $fecha = $fecha_rs["FechaImportante_inicial"];
  80. $diasArr = array(1,2,3,4,5);
  81. while (strtotime($fecha) <= strtotime($fecha_rs["FechaImportante_final"])) {
  82. if(in_array(date("w", strtotime($fecha)), $diasArr) ){//si es el día que quiero
  83. $eventoObj->addFecha($fecha);
  84. }
  85. $fecha = date ("Y-m-d", strtotime("+1 day", strtotime($fecha)));
  86. }
  87. $eventos_list = array_merge($eventos_list, $eventoObj->getEventList_All($periodo_rs["Periodo_fecha_inicial"], $periodo_rs["Periodo_fecha_final"]));
  88. }
  89. }
  90. $stmt->closeCursor();
  91. $stmt = null;
  92. //-------------------------
  93. // Obtiene fecha máxima y min
  94. $stmt = $pdo->prepare('Select * from fs_fechaimportante(:periodo, 3)');//periodo
  95. $stmt->bindParam(":periodo", $_SESSION["periodo_id"]);
  96. if(!$stmt->execute()){
  97. $errorDesc = "Ocurrió un error al cargar las fechas del periodo.";
  98. }else{
  99. $fecha_rs = $stmt->fetch();
  100. $fecha_min = date('Y-m-d', strtotime($fecha_rs["FechaImportante_inicial"].' - 1 month '));
  101. $fecha_max = date('Y-m-d', strtotime($fecha_rs["FechaImportante_final"].' + 1 month '));
  102. }
  103. $stmt->closeCursor();
  104. $stmt = null;
  105. //--Obtiene todos los eventos dentro del rango del periodo para los perfiles indicados
  106. $stmt = $pdo->prepare('Select * from fs_calendarioevento(:per, :fecha_i, :fecha_f, :perf, false)');
  107. $stmt->bindParam(":per", $_SESSION["periodo_id"]);
  108. $stmt->bindParam(":fecha_i", $fecha_min);
  109. $stmt->bindParam(":fecha_f", $fecha_max);
  110. $stmt->bindParam(":perf", $perfiles);
  111. unset($perfiles);
  112. if(!$stmt->execute()){
  113. $t = $stmt->errorInfo();
  114. $errorDesc = "Ocurrió un error al obtener los eventos.";
  115. $error = true;
  116. }
  117. $eventos_rs = $stmt->fetchAll();
  118. $stmt->closeCursor();
  119. //Recorre eventos
  120. foreach($eventos_rs as $evento){
  121. $eventoObj = new Evento($evento["CalendarioEvento_id"], $evento["CalendarioEvento_titulo"],$evento["CalendarioEvento_desc"],$evento["CalendarioCategoria_id"], $evento["CalendarioCategoria_desc"], $evento["CalendarioCategoria_color"], $evento["Periodo_id"] ,$evento["CalendarioEvento_fecha"], $evento["CalendarioEvento_todo_dia"], $evento["CalendarioEvento_hora_inicial"],$evento["CalendarioEvento_hora_final"]);
  122. $stmt = $pdo->prepare('Select * from fs_calendarioevento_perfil(:id)');
  123. $stmt->bindParam(":id", $evento["CalendarioEvento_id"]);
  124. if($stmt->execute()){
  125. $perf_rs = $stmt->fetchAll();
  126. $stmt->closeCursor();
  127. foreach($perf_rs as $perf){
  128. $eventoObj->addPerfil($perf);
  129. }
  130. }else{
  131. $errorDesc = "Error al obtener perfiles.";
  132. $error = true;
  133. }
  134. if(!$error){
  135. //-- Calcular posibles fechas e insertar fechas en objeto --
  136. $fecha = fechaGuion($evento["CalendarioEvento_fecha"]);
  137. switch($evento["CalendarioRepeticion_id"]){
  138. case 1: //diario
  139. while (strtotime($fecha) <= strtotime($evento["CalendarioReglas_fecha_final"])) {
  140. $eventoObj->addFecha($fecha);
  141. $fecha = date ("Y-m-d", strtotime("+1 day", strtotime($fecha)));
  142. }
  143. break;
  144. case 2: //semanal
  145. $diasArr = explode(",", $evento["CalendarioReglas_dias_str"]);
  146. while (strtotime($fecha) <= strtotime($evento["CalendarioReglas_fecha_final"])) {
  147. if(in_array(date("w", strtotime($fecha)), $diasArr) ){//si es el día que quiero
  148. $eventoObj->addFecha($fecha);
  149. }
  150. $fecha = date ("Y-m-d", strtotime("+1 day", strtotime($fecha)));
  151. }
  152. break;
  153. case 3://mensual
  154. $diasArr = explode(",", $evento["CalendarioReglas_dias_str"]);
  155. //reglas
  156. $weekTxt = array(1=>"first", 2=>"second", 3=>"third", 4=>"fourth", -1=>"last");
  157. $dayname = array("sun", "mon", "tue", "wed", "thu", "fri", "sat");
  158. $fecha = date ("Y-m-01", strtotime($fecha));//empieza a revisar en el primer día del mes
  159. $semana = $evento["CalendarioReglas_semana"];
  160. while (strtotime($fecha) <= strtotime($evento["CalendarioReglas_fecha_final"])) {
  161. foreach($diasArr as $d){
  162. //echo "-->". intval(date("w", strtotime($fecha)))." == ". intval($d)."[".$fecha."]";
  163. if($semana == 1 && intval(date("w", strtotime($fecha))) == intval($d) ){//si el día actual es el que quiero lo guarda
  164. $eventoObj->addFecha($fecha);
  165. }else{//si no calcula siguiente día
  166. if(intval(date("w", strtotime($fecha))) == intval($d)){
  167. $fechaTmp = date ("Y-m-d", strtotime($weekTxt[$semana-1]." ".$dayname[$d], strtotime($fecha)));
  168. }else{
  169. $fechaTmp = date ("Y-m-d", strtotime($weekTxt[$semana]." ".$dayname[$d], strtotime($fecha)));
  170. }
  171. $eventoObj->addFecha($fechaTmp);
  172. }
  173. }
  174. $fecha = date ("Y-m-01", strtotime("+1 month", strtotime($fecha)));//siguiente mes primer día
  175. }
  176. break;
  177. default: //no se repite
  178. $eventoObj->addFecha($fecha);
  179. }
  180. //Obtiene eventos modificados (fechas que cambiaron)
  181. $stmt = $pdo->prepare('Select * from fs_calendarioeventoeditado(:id)');
  182. $stmt->bindParam(":id", $eventoObj->id_db);
  183. if(!$stmt->execute()){
  184. $t = $stmt->errorInfo();
  185. $errorDesc = "Ocurrió un error al obtener las fechas editadas.".$t[2];
  186. $error = true;
  187. }
  188. }
  189. if(!$error){
  190. //modifica fechas
  191. $eventosEditados_rs = $stmt->fetchAll();
  192. $stmt->closeCursor();
  193. foreach($eventosEditados_rs as $modif){
  194. $eventoObj->replaceFecha($modif["CalendarioEventoEditado_fecha_origen"], $modif["CalendarioEventoEditado_fecha_nueva"], $modif["CalendarioEventoEditado_hora_inicial"], $modif["CalendarioEventoEditado_hora_final"]);
  195. }
  196. //Quitar fechas de excepción
  197. foreach(explode(",", $evento["CalendarioEvento_excepcion_str"]) as $ex){
  198. $eventoObj->removeFecha($ex);
  199. }
  200. //Descompone el objeto en un arreglo con todas las fechas y agrega a lista al total del calendario
  201. $eventos_list = array_merge($eventos_list, $eventoObj->getEventList_All($fecha_min, $fecha_max));
  202. }
  203. }//foreach
  204. //Agrupar por categoría
  205. $stmt = $pdo->prepare('Select * from fs_calendariocategoria(NULL)');
  206. if(!$stmt->execute()){
  207. $t = $stmt->errorInfo();
  208. $errorDesc = "Ocurrió un error al obtener las fechas editadas.".$t[2];
  209. $error =true;
  210. }else{
  211. $cat_rs = $stmt->fetchAll();
  212. }
  213. $categoria_list = array();
  214. foreach($cat_rs as $cat){
  215. $categoria_list[] = array("id"=>$cat["CalendarioCategoria_id"], "desc"=>$cat["CalendarioCategoria_desc"], "color"=>$cat["CalendarioCategoria_color"], "total"=>0);
  216. }
  217. foreach($eventos_list as $evento){
  218. $pos = findCategoria($categoria_list, $evento["categoria"]);
  219. if($pos >= 0){
  220. $categoria_list[$pos]["total"]++;
  221. }
  222. }
  223. ?>
  224. <main class="container-fluid content marco">
  225. <?php include_once("../include/errorMessage.php"); ?>
  226. <?php include("../include/periodoCambio.php");?>
  227. <?php if($periodo_rs["Periodo_id"] !=""){?>
  228. <p>Eventos en el periodo <b><?php echo fechaSlash($fecha_min)." a ". fechaSlash($fecha_max);?></b></p>
  229. <div class="row justify-content-center">
  230. <div class="col-12 col-md-8 table-responsive">
  231. <table class="table table-sm table-striped table-white">
  232. <thead class="thead-dark">
  233. <tr >
  234. <th style="width:8%"></th>
  235. <th>Categoría</th>
  236. <th>Total de eventos</th>
  237. </tr>
  238. </thead>
  239. <tbody>
  240. <?php foreach($categoria_list as $cat){ ?>
  241. <tr>
  242. <td class="text-center" style="color:<?php echo $cat["color"];?>"><?php echo $ICO_LG["circulo"];?></td>
  243. <td class="text-center"><?php echo $cat["desc"];?></td>
  244. <td class="text-center"><?php echo $cat["total"];?></td>
  245. </tr>
  246. <?php }//for ?>
  247. </tbody>
  248. </table>
  249. </div>
  250. </div>
  251. <?php }//if periodo ?>
  252. </main>
  253. <!--- FOOTER--->
  254. <?php require_once("../include/footer.php"); ?>
  255. </div>
  256. <script src="../js/jquery.min.js"></script>
  257. <script src="../js/bootstrap/popper.min.js"></script>
  258. <script src="../js/bootstrap/bootstrap.min.js"></script>
  259. <script src="../js/sidebarmenu.js"></script>
  260. <script src="../js/datalist.js"></script>
  261. <script>
  262. setDatalist("#periodo", <?php echo $_SESSION["periodo_id"]; ?>);
  263. $(document).on('click', '#dlPeriodo ul li' ,function(){
  264. $("#formaPeriodo").submit();
  265. });
  266. </script>
  267. </body>
  268. </html>