123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 |
- <?php
- /* AJAX
- * Inserta datos del objeto para el calendario
- * Recibe:
- * json
- * Return:
- * id insertado o cadena de error
- */
- require_once("../../include/constantes.php");
- require_once("../../include/nocache.php");
- require_once("../../include/bd_pdo.php");
- require_once("../../include/util.php");
- require_once("../../classes/ValidaSesion.php");
- require_once("../classes/LogActividad.php");//die on error
- require_once("../classes/Evento.php");
- //--- Objeto para validar usuario. El id de usuario lo lee desde sesión
- $objSesion = new ValidaSesion($pdo, 57, APSA);
- if(!$objSesion->tieneAcceso() || !$objSesion->puedeEditar()){
- $return["error"] = "Error! No tienes permisos para realizar esta acción.";
- }else if(!isset($_POST["json"])){
- $return["error"] = "Error! No se recibió la información del evento.";
- }else{
- $clase = json_decode($_POST["json"], true);
- $clase["todo_dia"] = filter_var($clase["todo_dia"], FILTER_VALIDATE_BOOLEAN);
- $return["error"] = "";
-
- try {
- $pdo->beginTransaction();
- $error = false;
-
- //---- Insertar ----------
- $sql_per = ':per';
- if($clase["periodo"] == 0){
- $sql_per = 'NULL';
- }
- //Actualiza evento
- $stmt = $pdo->prepare('Select * from fu_calendarioevento(:id, :titulo, :cat, '.$sql_per.', :desc, NULL, false)');
- $stmt->bindParam(":id", $clase["id_db"]);
- $stmt->bindParam(":titulo", $clase["titulo"]);
- $stmt->bindParam(":cat", $clase["cat"]);
- $stmt->bindParam(":desc", $clase["desc"]);
- if($clase["periodo"] != 0){ $stmt->bindParam(":per", $_SESSION["periodo_id"]);}
- if(!$stmt->execute()){
- $t = $stmt->errorInfo();
- $return["error"] .= "Ocurrió un error al actualizar el evento '".$clase["titulo"]."'".$t[2];
- $error = true;
- }
- $stmt->closeCursor();
-
- //Borra perfiles
- $stmt = $pdo->prepare('Select * from fd_calendarioevento_perfil(:id)');
- $stmt->bindParam(":id", $clase["id_db"]);
- if(!$stmt->execute()){
- $t = $stmt->errorInfo();
- $return["error"] .= "Ocurrió un error al borrar los perfiles del evento '".$clase["titulo"]."'".$t[2];
- $error = true;
- }
- $stmt->closeCursor();
-
-
- //Inserta Perfiles
- if(!$error && is_array($clase["perfiles"]) ){
- foreach($clase["perfiles"] as $perfil){
- if(!$error){
- $stmt = $pdo->prepare('Select * from fi_calendarioevento_perfil(:id, :perf)');
- $stmt->bindParam(":id", $clase["id_db"]);
- $stmt->bindParam(":perf", $perfil);
- if(!$stmt->execute()){
- $t = $stmt->errorInfo();
- $return["error"] .= "Ocurrió un error al insertar los perfiles. ".$t[2];
- $error = true;
- }
- $stmt->closeCursor();
- }
- }
- }//fin profesores
-
- //Revisa cambio de día
- if($clase["cambio_fecha"]){
- //--Obtiene todos los eventos dentro del rango del periodo para los perfiles indicados
- $stmt = $pdo->prepare('Select * from fs_calendarioevento_reglas(:id)');
- $stmt->bindParam(":id", $clase["id_db"]);
- if(!$stmt->execute()){
- $t = $stmt->errorInfo();
- $return["error"] .= "Ocurrió un error al obtener los eventos.".$t[2];
- $error = true;
- }
- $unico = false;
- if(!$error){
- $evento = $stmt->fetch();
- $stmt->closeCursor();
- //Recorre eventos
- $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"]);
- //-- Calcular posibles fechas e insertar fechas en objeto --
- $fecha = fechaGuion($evento["CalendarioEvento_fecha"]);
- switch($evento["CalendarioRepeticion_id"]){
- case 1: //diario
- while (strtotime($fecha) <= strtotime($evento["CalendarioReglas_fecha_final"])) {
- $eventoObj->addFecha($fecha);
- $fecha = date ("Y-m-d", strtotime("+1 day", strtotime($fecha)));
- }
- break;
- case 2: //semanal
- $diasArr = explode(",", $evento["CalendarioReglas_dias_str"]);
- while (strtotime($fecha) <= strtotime($evento["CalendarioReglas_fecha_final"])) {
- if(in_array(date("w", strtotime($fecha)), $diasArr) ){//si es el día que quiero
- $eventoObj->addFecha($fecha);
- }
- $fecha = date ("Y-m-d", strtotime("+1 day", strtotime($fecha)));
- }
- break;
- case 3://mensual
- $diasArr = explode(",", $evento["CalendarioReglas_dias_str"]);
- //reglas
- $weekTxt = array(1=>"first", 2=>"second", 3=>"third", 4=>"fourth", -1=>"last");
- $dayname = array("sun", "mon", "tue", "wed", "thu", "fri", "sat");
- $fecha = date ("Y-m-01", strtotime($fecha));//empieza a revisar en el primer día del mes
- $semana = $evento["CalendarioReglas_semana"];
- while (strtotime($fecha) <= strtotime($evento["CalendarioReglas_fecha_final"])) {
- foreach($diasArr as $d){
- //echo "-->". intval(date("w", strtotime($fecha)))." == ". intval($d)."[".$fecha."]";
- if($semana == 1 && intval(date("w", strtotime($fecha))) == intval($d) ){//si el día actual es el que quiero lo guarda
- $eventoObj->addFecha($fecha);
- }else{//si no calcula siguiente día
- if(intval(date("w", strtotime($fecha))) == intval($d)){
- $fechaTmp = date ("Y-m-d", strtotime($weekTxt[$semana-1]." ".$dayname[$d], strtotime($fecha)));
- }else{
- $fechaTmp = date ("Y-m-d", strtotime($weekTxt[$semana]." ".$dayname[$d], strtotime($fecha)));
- }
- $eventoObj->addFecha($fechaTmp);
- }
- }
- $fecha = date ("Y-m-01", strtotime("+1 month", strtotime($fecha)));//siguiente mes primer día
- }
- break;
- default: //no se repite
- $unico = true;
- $eventoObj->addFecha($fecha);
- }
- if($unico){
- if($clase["todo_dia"]){
- $stmt = $pdo->prepare('Select * from fu_calendarioevento_fecha(:id, :fecha, NULL, NULL)');
- }else{
- $stmt = $pdo->prepare('Select * from fu_calendarioevento_fecha(:id, :fecha, :hora_i, :hora_f)');
- $stmt->bindParam(":hora_i", $clase["hora_ini"]);
- $stmt->bindParam(":hora_f", $clase["hora_fin"]);
- }
- $stmt->bindParam(":id", $eventoObj->id_db);
- $stmt->bindParam(":fecha", $clase["fecha_nueva"]);
-
- if(!$stmt->execute()){
- $t = $stmt->errorInfo();
- $return["error"] .= "Ocurrió un error al editar la fecha.".$t[2];
- $error = true;
- }
-
- }else{
- //Obtiene eventos modificados (fechas que cambiaron)
- $stmt = $pdo->prepare('Select * from fs_calendarioeventoeditado(:id)');
- $stmt->bindParam(":id", $eventoObj->id_db);
- if(!$stmt->execute()){
- $t = $stmt->errorInfo();
- $return["error"] .= "Ocurrió un error al obtener las fechas editadas.".$t[2];
- $error = true;
- }
- if(!$error){
- //modifica fechas
- $eventosEditados_rs = $stmt->fetchAll();
- $stmt->closeCursor();
- foreach($eventosEditados_rs as $modif){
- $eventoObj->replaceFecha($modif["CalendarioEventoEditado_fecha_origen"], $modif["CalendarioEventoEditado_fecha_nueva"], $modif["CalendarioEventoEditado_hora_inicial"], $modif["CalendarioEventoEditado_hora_final"]);
- }
- //Quitar fechas de excepción
- foreach(explode(",", $evento["CalendarioEvento_excepcion_str"]) as $ex){
- $eventoObj->removeFecha($ex);
- }
- //revisa que la fecha del evento nueva no se repita con las fechas que ya tenía el evento
- /*if($eventoObj->hasFecha($clase["fecha_nueva"])){
- $return["error"] .= "El evento ya ocurre en esa fecha y no se puede duplicar.";
- $error = true;
- }else{*/
- //modifica la fecha
- if($clase["todo_dia"]){
- $stmt = $pdo->prepare('Select * from fi_calendarioeventoeditado(:id, :fecha_o, :fecha_n, NULL, NULL)');
- }else{
- $stmt = $pdo->prepare('Select * from fi_calendarioeventoeditado(:id, :fecha_o, :fecha_n, :hora_i, :hora_f)');
- $stmt->bindParam(":hora_i", $clase["hora_ini"]);
- $stmt->bindParam(":hora_f", $clase["hora_fin"]);
- }
- $stmt->bindParam(":id", $eventoObj->id_db);
- $stmt->bindParam(":fecha_o", $clase["fecha_orig"]);
- $stmt->bindParam(":fecha_n", $clase["fecha_nueva"]);
- if(!$stmt->execute()){
- $t = $stmt->errorInfo();
- $return["error"] .= "Ocurrió un error al editar la fecha.".$t[2];
- $error = true;
- }
- //}
- }
- }//fin no unico
- }
- }//fin hay cambio de fecha
-
- if(!$error){
- $pdo->commit();
- unset($return["error"]);
- $return["ok"] = "El evento se editó correctamente";
-
- //Inserta Log
- $log = new LogActividad();
- $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"]."]";
- $log->appendLog($_SESSION["usuario_id"], $_SESSION["usuario_nombre"]." ".$_SESSION["usuario_apellidos"], $desc_log);
-
- }else
- $pdo->rollBack();
- $stmt = null; // cierra conexion
- } catch(PDOException $e) {
- $pdo->rollBack();
- $return["error"] = "Ocurrió un error al insertar los datos del evento.";
- }
- }
- $return["json"] = json_encode($return);
- echo json_encode($return);
- ?>
|