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); ?>