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 examen."; }else{ $json = json_decode($_POST["json"], true); $materia = $json["mat"]; $fecha = $json["fecha_inicial"]; $hora_ini = $json["hora_ini"];//limpia texto $min_ini = $json["min_ini"]; $duracion = $json["duracion"]; //$copiar = $json["copiar"]; $copiar = 0; if(!empty($json["profesor"])) $prof = $json["profesor"]; if(!empty($json["salon"])) $salon = $json["salon"]; $query = ""; $query.= (!empty($salon) ? ":salon," : "NULL,"); $query.= (!empty($prof) ? ":prof" : "NULL"); $fecha_ini = fechaGuion($fecha)." ".$hora_ini.":".$min_ini; $fecha_fin = date('Y-m-d H:i:00', strtotime($fecha_ini.' + '.$duracion.' minute')); $exLog = array(); $error = false; try { $pdo->beginTransaction(); if(!empty($salon) && !empty($prof)){//revisa que el profesor actual no esté en otros salones a la misma hora $stmt = $pdo->prepare('Select * from fs_validasalon_examen(:f_ini, :f_fin, :periodo, :salon, :prof)'); $stmt->bindParam(":f_ini", $fecha_ini); $stmt->bindParam(":f_fin", $fecha_fin); $stmt->bindParam(":periodo", $_SESSION["periodo_id"]); $stmt->bindParam(":salon", $salon); $stmt->bindParam(":prof", $prof); if(!$stmt->execute()){ $return["error"] = "Ocurrió un error al insertar los datos del examen."; $error = true; }else{ $choque = $stmt->fetch(); if(!empty($choque)){ $error = true; $return["error"] = "El profesor ya está asignado al salón ".$choque["Salon_desc"]." [".$choque["Materia_desc"]."] en la misma fecha y hora."; } } $stmt->closeCursor(); if(!$error){ $stmt = $pdo->prepare('Select * from fs_validaprofesorsalon_examen(:f_ini, :f_fin, :periodo, :salon, :prof)'); $stmt->bindParam(":f_ini", $fecha_ini); $stmt->bindParam(":f_fin", $fecha_fin); $stmt->bindParam(":periodo", $_SESSION["periodo_id"]); $stmt->bindParam(":salon", $salon); $stmt->bindParam(":prof", $prof); if(!$stmt->execute()){ $return["error"] = "Ocurrió un error al insertar los datos del examen."; $error = true; }else{ $choque = $stmt->fetch(); if(!empty($choque)){ $error = true; $return["error"] = "El salón ya está asignado al profesor ".$choque["Usuario_nombre"]." ".$choque["Usuario_apellidos"]."[".$choque["Materia_desc"]."] en la misma fecha y hora."; } } $stmt->closeCursor(); } } if(!$error){ // --- Si no existe inserta $query = ""; $query.= (isset($salon) ? ":salon," : "NULL,"); $query.= (isset($prof) ? ":prof," : "NULL,"); $query.= "NULL,";//grupo if($copiar==0 || empty($prof)){ $stmt = $pdo->prepare('Select * from fi_examen(:f_ini, :f_fin, :mat, true,'.$query.' :periodo)'); $stmt->bindParam(":f_ini", $fecha_ini); $stmt->bindParam(":f_fin", $fecha_fin); if(!empty($salon)) $stmt->bindParam(":salon", $salon); if(!empty($prof)) $stmt->bindParam(":prof", $prof); $stmt->bindParam(":periodo", $_SESSION["periodo_id"]); $stmt->bindParam(":mat", $materia); if(!$stmt->execute()){ $return["error"] = "Ocurrió un error al insertar los datos del examen."; $error = true; }else{ $rs = $stmt->fetch(); $ex_id = $rs["fi_examen"]; $exLog[] = $ex_id;//solo para el log $stmt->closeCursor(); $stmt = null; unset($rs); if(!empty($json["submaterias"]) && count($json["submaterias"])){ foreach($json["submaterias"] as $sub){ if(!empty($sub["salon"]) || !empty($sub["prof"])){ $query = ""; $query.= (!empty($sub["salon"]) ? ":salon," : "NULL,"); $query.= (!empty($sub["prof"]) ? ":prof" : "NULL"); $stmt = $pdo->prepare('Select * from fi_examensubmateria(:ex, :mat, :sub, '.$query.')'); $stmt->bindParam(":ex", $ex_id); $stmt->bindParam(":mat", $materia); $stmt->bindParam(":sub", $sub["id"]); if(!empty($sub["salon"])) $stmt->bindParam(":salon", $sub["salon"]); if(!empty($sub["prof"])) $stmt->bindParam(":prof", $sub["prof"]); if(!$stmt->execute()){ $return["error"] = "Ocurrió un error al insertar los datos del examen de la electiva."; $error = true; } } } if(!empty($stmt)) $stmt->closeCursor(); } $stmt = null; } }else {//duplicar y sí hay profesor $stmt = $pdo->prepare('select * from fs_materiasprofesor(:periodo,:prof)'); $stmt->bindParam(":prof", $prof); $stmt->bindParam(":periodo", $_SESSION["periodo_id"]); if(!$stmt->execute()){ $return["error"] = "Ocurrió un error al obtener las materias relacionadas."; $error = true; }else{ $materiasArr = $stmt->fetchAll(); //$return["materias"] = $materiasArr; $stmt->closeCursor(); foreach($materiasArr as $mat){ //borra todas los examenes de las materias del profesor if(empty($mat["Submateria_id"])) $stmt = $pdo->prepare('Select * from fd_examenprofesorperiodo(:prof, :periodo, :mat, true)');//true es materia else $stmt = $pdo->prepare('Select * from fd_examenprofesorperiodo(:prof, :periodo, :mat, false)');//false es submateri $stmt->bindParam(":prof", $prof); $stmt->bindParam(":periodo", $_SESSION["periodo_id"]); $stmt->bindParam(":mat", $mat["Materia_id"]); if(!$stmt->execute()){ $return["error"] = "Ocurrió un error al borrar los exámenes anteriores."; $error = true; } if(!$error){ if(empty($mat["Submateria_id"])) $stmt = $pdo->prepare('Select * from fi_examen(:f_ini, :f_fin, :mat, true,'.$query.' :periodo)');//true es materia else $stmt = $pdo->prepare('Select * from fi_examen(:f_ini, :f_fin, :mat, false,'.$query.' :periodo)');//false es submateria $stmt->bindParam(":f_ini", $fecha_ini); $stmt->bindParam(":f_fin", $fecha_fin); if(!empty($salon)) $stmt->bindParam(":salon", $salon); if(!empty($prof)) $stmt->bindParam(":prof", $prof); $stmt->bindParam(":periodo", $_SESSION["periodo_id"]); $stmt->bindParam(":mat", $mat["Materia_id"]); if(!$stmt->execute()){ $return["error"] = "Ocurrió un error al insertar los datos del examen."; $error = true; }else{ $rs = $stmt->fetch(); $ex_id = $rs["fi_examen"]; $exLog[] = $ex_id; $stmt->closeCursor(); $stmt = null; unset($rs); if(!empty($json["submaterias"]) && count($json["submaterias"])){ foreach($json["submaterias"] as $sub){ if(!empty($sub["salon"]) || !empty($sub["prof"])){ $query2 = ""; $query2.= (!empty($sub["salon"]) ? ":salon," : "NULL,"); $query2.= (!empty($sub["prof"]) ? ":prof" : "NULL"); $stmt = $pdo->prepare('Select * from fi_examensubmateria(:ex, :mat, :sub, '.$query2.')'); $stmt->bindParam(":ex", $ex_id); $stmt->bindParam(":mat", $mat["Materia_id"]); $stmt->bindParam(":sub", $sub["id"]); if(!empty($sub["salon"])) $stmt->bindParam(":salon", $sub["salon"]); if(!empty($sub["prof"])) $stmt->bindParam(":prof", $sub["prof"]); if(!$stmt->execute()){ $return["error"] = "Ocurrió un error al insertar los datos del examen de la electiva."; $error = true; } } } $stmt->closeCursor(); } } } }//foreach $stmt = null; } }//copiar } if($error){ $pdo->rollBack(); }else{ $pdo->commit(); $log = new LogActividad(); $desc_log = "Inserta examen nuevo ID[".implode(',', $exLog)."] Fechas[".$fecha_ini."][".$fecha_fin."] Periodo[".$_SESSION["periodo_id"]."] Materia[".$materia."] Salon[".$salon."]"; //$desc_log = "Inserta examen nuevo ID[] Fechas[".$fecha_ini."][".$fecha_fin."] Periodo[".$_SESSION["periodo_id"]."] Materia[".$materia."] Salon[".$salon."]"; $log->appendLog($_SESSION["usuario_id"], $_SESSION["usuario_nombre"]." ".$_SESSION["usuario_apellidos"], $desc_log); $return["ok"] = "ok"; } }catch(PDOException $e) { $pdo->rollBack(); $return["error"] = "Error al insertar el examen".$e->getMessage(); } } $return["json"] = json_encode($return); echo json_encode($return); ?>