calendario_update.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. <?php
  2. /* AJAX
  3. * Inserta datos del objeto para el calendario
  4. * Recibe:
  5. * json
  6. * Return:
  7. * id insertado o cadena de error
  8. */
  9. require_once("../../include/constantes.php");
  10. require_once("../../include/nocache.php");
  11. require_once("../../include/bd_pdo.php");
  12. require_once("../../include/util.php");
  13. require_once("../../classes/ValidaSesion.php");
  14. require_once("../classes/LogActividad.php");//die on error
  15. require_once("../classes/Evento.php");
  16. //--- Objeto para validar usuario. El id de usuario lo lee desde sesión
  17. $objSesion = new ValidaSesion($pdo, 112, GEMA);
  18. if(!$objSesion->tieneAcceso() || !$objSesion->puedeEditar()){
  19. $return["error"] = "Error! No tienes permisos para realizar esta acción.";
  20. }else if(!isset($_POST["json"])){
  21. $return["error"] = "Error! No se recibió la información del evento.";
  22. }else{
  23. $clase = json_decode($_POST["json"], true);
  24. $clase["todo_dia"] = filter_var($clase["todo_dia"], FILTER_VALIDATE_BOOLEAN);
  25. $return["error"] = "";
  26. try {
  27. $pdo->beginTransaction();
  28. $error = false;
  29. //---- Insertar ----------
  30. //Actualiza evento
  31. $stmt = $pdo->prepare('Select * from fu_calendarioevento(:id, :titulo, NULL, :per, :desc, NULL, true)');
  32. $stmt->bindParam(":id", $clase["id_db"]);
  33. $stmt->bindParam(":titulo", $clase["titulo"]);
  34. $stmt->bindParam(":desc", $clase["desc"]);
  35. //if($clase["periodo"] != 0){ $stmt->bindParam(":per", $_SESSION["periodo_id"]);}
  36. $stmt->bindParam(":per", $_SESSION["periodo_id"]);
  37. if(!$stmt->execute()){
  38. $t = $stmt->errorInfo();
  39. $return["error"] .= "Ocurrió un error al actualizar el evento '".$clase["titulo"]."'".$t[2];
  40. $error = true;
  41. }
  42. $stmt->closeCursor();
  43. //Borra perfiles
  44. /*$stmt = $pdo->prepare('Select * from fd_calendarioevento_perfil(:id)');
  45. $stmt->bindParam(":id", $clase["id_db"]);
  46. if(!$stmt->execute()){
  47. $t = $stmt->errorInfo();
  48. $return["error"] .= "Ocurrió un error al borrar los perfiles del evento '".$clase["titulo"]."'".$t[2];
  49. $error = true;
  50. }
  51. $stmt->closeCursor();
  52. //Inserta Perfiles
  53. if(!$error && is_array($clase["perfiles"]) ){
  54. foreach($clase["perfiles"] as $perfil){
  55. if(!$error){
  56. $stmt = $pdo->prepare('Select * from fi_calendarioevento_perfil(:id, :perf)');
  57. $stmt->bindParam(":id", $clase["id_db"]);
  58. $stmt->bindParam(":perf", $perfil);
  59. if(!$stmt->execute()){
  60. $t = $stmt->errorInfo();
  61. $return["error"] .= "Ocurrió un error al insertar los perfiles. ".$t[2];
  62. $error = true;
  63. }
  64. $stmt->closeCursor();
  65. }
  66. }
  67. }//fin profesores*/
  68. //Actualiza insignia
  69. if($clase["tiene_evidencia"]){
  70. $stmt = $pdo->prepare('Select * from fu_insignia(:id, :titulo, :desc, :tipo, :puesto, true, :evidencia)');
  71. $stmt->bindParam(":evidencia", $clase["evidencia"]);
  72. }else{
  73. $stmt = $pdo->prepare('Select * from fu_insignia(:id, :titulo, :desc, :tipo, :puesto, false, NULL)');
  74. }
  75. $stmt->bindParam(":id", $clase["insignia_id"]);
  76. $stmt->bindParam(":titulo", $clase["titulo"]);
  77. $stmt->bindParam(":desc", $clase["desc"]);
  78. $stmt->bindParam(":tipo", $clase["tipo"]);
  79. $stmt->bindParam(":puesto", $clase["puesto"]);
  80. if(!$stmt->execute()){
  81. $t = $stmt->errorInfo();
  82. $return["error"] .= "Ocurrió un error al actualizar la insignia '".$clase["titulo"]."'".$t[2];
  83. $error = true;
  84. }
  85. $stmt->closeCursor();
  86. //Inserta insignia General
  87. if($clase["tiene_inscripciones"]){
  88. $fecha_ini = fechaGuion($clase["insc_ini"]);
  89. $fecha_fin = fechaGuion($clase["insc_fin"])." ".$clase["insc_hora_fin"].":00";
  90. $stmt = $pdo->prepare('Select * from fu_insigniageneral(:insignia, :evento, :fecha_ini, :fecha_fin)');
  91. $stmt->bindParam(":fecha_ini", $fecha_ini);
  92. $stmt->bindParam(":fecha_fin", $fecha_fin);
  93. }else{
  94. $stmt = $pdo->prepare('Select * from fu_insigniageneral(:insignia, :evento, NULL, NULL)');
  95. }
  96. $stmt->bindParam(":insignia", $clase["insignia_id"]);
  97. $stmt->bindParam(":evento", $clase["id_db"]);
  98. if(!$stmt->execute()){
  99. $t = $stmt->errorInfo();
  100. $return["error"] .= "Ocurrió un error al actualizar la insignia general'".$clase["titulo"]."'".$t[2];
  101. $error = true;
  102. }
  103. $stmt->closeCursor();
  104. //
  105. //Borra e Inserta atributos
  106. if(!$error && !empty($clase["atributos"]) ){
  107. $stmt = $pdo->prepare('Select * from fd_insignia_atributoegreso(:id, NULL)');
  108. $stmt->bindParam(":id", $clase["insignia_id"]);
  109. if(!$stmt->execute()){
  110. $t = $stmt->errorInfo();
  111. $return["error"] .= "Ocurrió un error al actualizar los atributos. ".$t[2];
  112. $error = true;
  113. }else{
  114. $stmt->closeCursor();
  115. //Inserta atributos
  116. $stmt = $pdo->prepare('Select * from fi_insignia_atributoegreso(:id, :atr, :nivel)');
  117. $stmt->bindParam(":id", $clase["insignia_id"]);
  118. for($i=0; $i< count($clase["atributos"]) && !$error; $i++){
  119. if($clase["atributos"][$i]["id"] != 0){
  120. $stmt->bindParam(":atr", $clase["atributos"][$i]["id"]);
  121. $stmt->bindParam(":nivel", $clase["atributos"][$i]["nivel"]);
  122. $return["query"] = "[Select * from fi_insignia_atributoegreso(".$clase["insignia_id"].", ".$clase["atributos"][$i]["id"].", ".$clase["atributos"][$i]["nivel"].")] ";
  123. if(!$stmt->execute()){
  124. $t = $stmt->errorInfo();
  125. $return["error"] .= "Ocurrió un error al insertar los atributos. ".$t[2];
  126. $error = true;
  127. }
  128. }
  129. }
  130. $stmt->closeCursor();
  131. }
  132. }
  133. //Revisa cambio de día
  134. if(!$error && $clase["cambio_fecha"]){
  135. //--Obtiene todos los eventos dentro del rango del periodo para los perfiles indicados
  136. $stmt = $pdo->prepare('Select * from fs_calendarioevento_reglas(:id)');
  137. $stmt->bindParam(":id", $clase["id_db"]);
  138. if(!$stmt->execute()){
  139. $t = $stmt->errorInfo();
  140. $return["error"] .= "Ocurrió un error al obtener los eventos.".$t[2];
  141. $error = true;
  142. }
  143. $unico = false;
  144. if(!$error){
  145. $evento = $stmt->fetch();
  146. $stmt->closeCursor();
  147. //Recorre eventos
  148. $eventoObj = new Evento($evento["CalendarioEvento_id"], $evento["CalendarioEvento_titulo"],$evento["CalendarioEvento_desc"],
  149. $evento["Periodo_id"] ,$evento["CalendarioEvento_fecha"], $evento["CalendarioEvento_todo_dia"],
  150. $evento["CalendarioEvento_hora_inicial"],$evento["CalendarioEvento_hora_final"]);
  151. //-- Calcular posibles fechas e insertar fechas en objeto --
  152. $fecha = fechaGuion($evento["CalendarioEvento_fecha"]);
  153. switch($evento["CalendarioRepeticion_id"]){
  154. case 1: //diario
  155. while (strtotime($fecha) <= strtotime($evento["CalendarioReglas_fecha_final"])) {
  156. $eventoObj->addFecha($fecha);
  157. $fecha = date ("Y-m-d", strtotime("+1 day", strtotime($fecha)));
  158. }
  159. break;
  160. case 2: //semanal
  161. $diasArr = explode(",", $evento["CalendarioReglas_dias_str"]);
  162. while (strtotime($fecha) <= strtotime($evento["CalendarioReglas_fecha_final"])) {
  163. if(in_array(date("w", strtotime($fecha)), $diasArr) ){//si es el día que quiero
  164. $eventoObj->addFecha($fecha);
  165. }
  166. $fecha = date ("Y-m-d", strtotime("+1 day", strtotime($fecha)));
  167. }
  168. break;
  169. case 3://mensual
  170. $diasArr = explode(",", $evento["CalendarioReglas_dias_str"]);
  171. //reglas
  172. $weekTxt = array(1=>"first", 2=>"second", 3=>"third", 4=>"fourth", -1=>"last");
  173. $dayname = array("sun", "mon", "tue", "wed", "thu", "fri", "sat");
  174. $fecha = date ("Y-m-01", strtotime($fecha));//empieza a revisar en el primer día del mes
  175. $semana = $evento["CalendarioReglas_semana"];
  176. while (strtotime($fecha) <= strtotime($evento["CalendarioReglas_fecha_final"])) {
  177. foreach($diasArr as $d){
  178. //echo "-->". intval(date("w", strtotime($fecha)))." == ". intval($d)."[".$fecha."]";
  179. if($semana == 1 && intval(date("w", strtotime($fecha))) == intval($d) ){//si el día actual es el que quiero lo guarda
  180. $eventoObj->addFecha($fecha);
  181. }else{//si no calcula siguiente día
  182. if(intval(date("w", strtotime($fecha))) == intval($d)){
  183. $fechaTmp = date ("Y-m-d", strtotime($weekTxt[$semana-1]." ".$dayname[$d], strtotime($fecha)));
  184. }else{
  185. $fechaTmp = date ("Y-m-d", strtotime($weekTxt[$semana]." ".$dayname[$d], strtotime($fecha)));
  186. }
  187. $eventoObj->addFecha($fechaTmp);
  188. }
  189. }
  190. $fecha = date ("Y-m-01", strtotime("+1 month", strtotime($fecha)));//siguiente mes primer día
  191. }
  192. break;
  193. default: //no se repite
  194. $unico = true;
  195. $eventoObj->addFecha($fecha);
  196. }
  197. if($unico){
  198. if($clase["todo_dia"]){
  199. $stmt = $pdo->prepare('Select * from fu_calendarioevento_fecha(:id, :fecha, NULL, NULL)');
  200. }else{
  201. $stmt = $pdo->prepare('Select * from fu_calendarioevento_fecha(:id, :fecha, :hora_i, :hora_f)');
  202. $stmt->bindParam(":hora_i", $clase["hora_ini"]);
  203. $stmt->bindParam(":hora_f", $clase["hora_fin"]);
  204. }
  205. $stmt->bindParam(":id", $clase["id_db"]);
  206. $stmt->bindParam(":fecha", $clase["fecha_nueva"]);
  207. //$return["debug"] = "Select * from fu_calendarioevento_fecha(".$clase["id_db"].", ".$clase["fecha_nueva"].", :hora_i, :hora_f)";
  208. if(!$stmt->execute()){
  209. $t = $stmt->errorInfo();
  210. $return["error"] .= "Ocurrió un error al editar la fecha.".$t[2];
  211. $error = true;
  212. }
  213. }else{
  214. //Obtiene eventos modificados (fechas que cambiaron)
  215. $stmt = $pdo->prepare('Select * from fs_calendarioeventoeditado(:id)');
  216. $stmt->bindParam(":id", $clase["id_db"]);
  217. if(!$stmt->execute()){
  218. $t = $stmt->errorInfo();
  219. $return["error"] .= "Ocurrió un error al obtener las fechas editadas.".$t[2];
  220. $error = true;
  221. }
  222. if(!$error){
  223. //modifica fechas
  224. $eventosEditados_rs = $stmt->fetchAll();
  225. $stmt->closeCursor();
  226. foreach($eventosEditados_rs as $modif){
  227. $eventoObj->replaceFecha($modif["CalendarioEventoEditado_fecha_origen"], $modif["CalendarioEventoEditado_fecha_nueva"], $modif["CalendarioEventoEditado_hora_inicial"], $modif["CalendarioEventoEditado_hora_final"]);
  228. }
  229. //Quitar fechas de excepción
  230. foreach(explode(",", $evento["CalendarioEvento_excepcion_str"]) as $ex){
  231. $eventoObj->removeFecha($ex);
  232. }
  233. //revisa que la fecha del evento nueva no se repita con las fechas que ya tenía el evento
  234. /*if($eventoObj->hasFecha($clase["fecha_nueva"])){
  235. $return["error"] .= "El evento ya ocurre en esa fecha y no se puede duplicar.";
  236. $error = true;
  237. }else{*/
  238. //modifica la fecha
  239. if($clase["todo_dia"]){
  240. $stmt = $pdo->prepare('Select * from fi_calendarioeventoeditado(:id, :fecha_o, :fecha_n, NULL, NULL)');
  241. }else{
  242. $stmt = $pdo->prepare('Select * from fi_calendarioeventoeditado(:id, :fecha_o, :fecha_n, :hora_i, :hora_f)');
  243. $stmt->bindParam(":hora_i", $clase["hora_ini"]);
  244. $stmt->bindParam(":hora_f", $clase["hora_fin"]);
  245. }
  246. $stmt->bindParam(":id", $eventoObj->id_db);
  247. $stmt->bindParam(":fecha_o", $clase["fecha_orig"]);
  248. $stmt->bindParam(":fecha_n", $clase["fecha_nueva"]);
  249. if(!$stmt->execute()){
  250. $t = $stmt->errorInfo();
  251. $return["error"] .= "Ocurrió un error al editar la fecha.".$t[2];
  252. $error = true;
  253. }
  254. //}
  255. }
  256. }//fin no unico
  257. }
  258. }//fin hay cambio de fecha
  259. if(!$error){
  260. $pdo->commit();
  261. unset($return["error"]);
  262. $return["ok"] = "El evento se editó correctamente";
  263. //Inserta Log
  264. $log = new LogActividad();
  265. $desc_log = "Actualiza evento EventoID[".$clase["id_db"]."] Titulo[".$clase["titulo"]."] Original[".$clase["fecha_orig"]."] Día[".$clase["fecha_nueva"]."] HoraIni[".$clase["hora_ini"]."] HoraFin[".$clase["hora_fin"]."]";
  266. $log->appendLog($_SESSION["usuario_id"], $_SESSION["usuario_nombre"]." ".$_SESSION["usuario_apellidos"], $desc_log);
  267. }else
  268. $pdo->rollBack();
  269. $stmt = null; // cierra conexion
  270. } catch(PDOException $e) {
  271. $pdo->rollBack();
  272. $return["error"] = "Ocurrió un error al actualizar los datos del evento.". $e->getMessage();;
  273. }
  274. }
  275. $return["json"] = json_encode($return);
  276. echo json_encode($return);
  277. ?>