examenes.php 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912
  1. <?php
  2. require_once("../include/constantes.php");
  3. require_once("../include/util.php");
  4. require_once("../include/bd_pdo.php");
  5. require_once("../classes/ValidaSesion.php");
  6. require_once("../classes/MainMenu.php");
  7. $menu = 5;
  8. $submenu = 53;
  9. //--- Objeto para validar usuario. El id de usuario lo lee desde sesión
  10. $objSesion = new ValidaSesion($pdo, $submenu, APSA);
  11. if(!$objSesion->tieneAcceso()){
  12. $objSesion->terminaSesion();
  13. }
  14. $objSesion->validaPeriodoUsuario();//si no tiene periodo manda a main
  15. //Periodo
  16. $stmt = $pdo->prepare('Select * from fs_periodo(:id, NULL, NULL, true)');
  17. $stmt->bindParam(":id", $filter_periodo);
  18. if(!$stmt->execute()){
  19. $errorDesc = "Ocurrió un error al cargar el periodo";
  20. }else{
  21. $periodo_rs = $stmt->fetch();
  22. }
  23. $stmt->closeCursor();
  24. ?>
  25. <!DOCTYPE html>
  26. <html lang="es" prefix="og: http://ogp.me/ns#">
  27. <head>
  28. <title>APSA - Facultad de Ingeniería</title>
  29. <meta charset="utf-8">
  30. <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  31. <link rel="icon" type="image/png" href="../img/favicon.png" />
  32. <link rel="stylesheet" href="../css/bootstrap-ulsa.min.css" type="text/css">
  33. <link rel="stylesheet" href="../css/indivisa.css" type="text/css">
  34. <link rel="stylesheet" href="../css/sgi.css?rand=<?php echo rand();?>" type="text/css">
  35. <link rel="stylesheet" href="../css/fa_all.css" type="text/css">
  36. <link rel="stylesheet" href="../css/jquery-ui.css" type="text/css">
  37. <link rel="stylesheet" href="../css/calendar.css" type="text/css">
  38. <link rel="stylesheet" href="../css/toggle.css" type="text/css">
  39. <link rel="stylesheet" href="../css/snackbar.css" type="text/css">
  40. <script src="../js/util.js"></script>
  41. </head>
  42. <body>
  43. <div>
  44. <?php
  45. //--- Objeto que pinta menu
  46. $menuObj = new MainMenu($_SESSION["usuario_id"], $menu, $pdo, APSA, "Exámenes extraordinarios");//usr, menu, pdo, sist
  47. $menuObj->printMenu();
  48. //Obtiene fechas de extraordinarios del periodo
  49. $stmt = $pdo->prepare('Select * from fs_fechaimportante(:periodo, 2)');
  50. $stmt->bindParam(":periodo", $_SESSION["periodo_id"]);
  51. if(!$stmt->execute()){
  52. $errorDesc = "Ocurrió un error al cargar las fechas de extraordinarios del periodo";
  53. }else{
  54. $extras_rs = $stmt->fetch();
  55. if(!isset($extras_rs["FechaImportante_inicial"]) || $extras_rs["FechaImportante_inicial"] == "") $extras_rs["FechaImportante_inicial"] = date ("Y-m-d");
  56. if(!isset($extras_rs["FechaImportante_final"]) || $extras_rs["FechaImportante_final"] == "") $extras_rs["FechaImportante_final"] = date ("Y-m-d");
  57. }
  58. $stmt->closeCursor();
  59. //Obtiene materias
  60. if(isset($_POST["plan"]) && is_numeric($_POST["plan"])){
  61. $filter_plan = filter_input(INPUT_POST, "plan", FILTER_SANITIZE_NUMBER_INT);//limpia texto
  62. $query = "";
  63. if(isset($_POST["sem"]) && is_numeric($_POST["sem"])){
  64. $query .= ":sem,";
  65. $filter_sem = filter_input(INPUT_POST, "sem", FILTER_SANITIZE_NUMBER_INT);//limpia texto
  66. }else{
  67. $query .= "NULL,";
  68. }
  69. if($_SESSION["jefe_carrera"]){
  70. $query .= ":usr";
  71. $filter_usr = $_SESSION["usuario_id"];
  72. }else{
  73. $query .= "NULL";
  74. }
  75. $stmt = $pdo->prepare('Select * from fs_examenextraordinario_materia(NULL, :plan, '.$query.', :per)');
  76. $stmt->bindParam(":plan", $filter_plan);
  77. if(isset($filter_sem)) $stmt->bindParam(":sem", $filter_sem);
  78. if(isset($filter_usr)) $stmt->bindParam(":usr", $filter_usr);
  79. $stmt->bindParam(":per", $_SESSION["periodo_id"]);
  80. if(!$stmt->execute()){
  81. $errorDesc = "Ocurrió un error al cargar las materias";
  82. }else{
  83. $materias_rs = $stmt->fetchAll();
  84. }
  85. $stmt->closeCursor();
  86. }
  87. //Obtiene plan de estudios
  88. $stmt = $pdo->prepare('Select * from fs_planestudio(:nivel, NULL, NULL, true, NULL, NULL)');
  89. $stmt->bindParam(":nivel", $_SESSION["nivel_id"]);
  90. if(!$stmt->execute()){
  91. print_r($stmt->errorInfo());
  92. $errorDesc = "Ocurrió un error al cargar los planes de estudios";
  93. }else
  94. $plan_rs = $stmt->fetchAll();
  95. $stmt->closeCursor();
  96. //Obtiene fechas de periodo
  97. $stmt = $pdo->prepare('Select * from fs_periodo(:periodo, NULL, NULL, true)');
  98. $stmt->bindParam(":periodo", $_SESSION["periodo_id"]);
  99. if(!$stmt->execute()){
  100. $errorDesc = "Ocurrió un error al cargar las fechas del periodo";
  101. }else{
  102. $periodo_rs = $stmt->fetch();
  103. }
  104. $stmt->closeCursor();
  105. //Profesores
  106. $stmt = $pdo->prepare('Select * from fs_profesores()');
  107. if(!$stmt->execute()){
  108. $errorDesc = "Ocurrió un error al cargar los datos de los profesores";
  109. }else
  110. $profesores_rs = $stmt->fetchAll();
  111. $stmt->closeCursor();
  112. //Electivas
  113. $stmt = $pdo->prepare('Select * from fs_electiva_usuario(NULL, :usr)');
  114. $stmt->bindParam(":usr", $_SESSION["usuario_id"]);
  115. if(!$stmt->execute()){
  116. $errorDesc = "Ocurrió un error al cargar los datos de las materias electivas";
  117. }else
  118. $electiva_rs = $stmt->fetchAll();
  119. $stmt->closeCursor();
  120. //Salones
  121. $stmt = $pdo->prepare('Select * from fs_salon(NULL, NULL, 0, NULL)');
  122. if(!$stmt->execute()){
  123. echo "Error al obtener los salones";
  124. print_r($stmt->errorInfo());
  125. }
  126. $salones_rs = $stmt->fetchAll();
  127. $stmt->closeCursor();
  128. $stmt = null;
  129. if(count($plan_rs) == 0){
  130. header("Location: planestudios.php?error=4");
  131. exit();
  132. }
  133. //--Manejo de errores y mensajes de exito
  134. if(isset($_GET["error"]) && is_numeric($_GET["error"])){
  135. switch ($_GET["error"]){
  136. case 0: $errorDesc = "No se reciberon los datos del examen."; break;
  137. case 1: $errorDesc = "Ocurrió un error al insertar los datos del examen."; break;
  138. case 2: $errorDesc = "Ocurrió un error al actualizar los datos del examen."; break;
  139. case 3: $errorDesc = "No tienes permisos para realizar esa acción."; break;
  140. case 4: $errorDesc = "Ocurrió un error al cargar los datos del examen."; break;
  141. case 5: $errorDesc = "Ya existe un examen para la materia ".$_GET["mat"]; break;
  142. case 6: $errorDesc = "El examen que buscas no existe. Consulta la lista de exámenes disponibles en esta sección."; break;
  143. }
  144. }
  145. if(isset($_GET["ok"]) && is_numeric($_GET["ok"])){
  146. switch ($_GET["ok"]){
  147. case 0: $successDesc = "El examen se guardó correctamente."; break;
  148. case 1: $successDesc = "El examen se actualizó correctamente."; break;
  149. }
  150. }
  151. ?>
  152. <main class="container-fluid content marco">
  153. <?php include_once("../include/errorMessage.php");?>
  154. <?php include("../include/periodoCambio.php");?>
  155. <?php
  156. if(isset($periodo_rs) && isset($plan_rs) && isset($profesores_rs)){
  157. ?>
  158. <!-- Filtro -->
  159. <div class="row ">
  160. <div class="col-12">
  161. <form action="#" method="post">
  162. <div class="form-box form-box-info">
  163. <div class="form-group row">
  164. <label for="filter_carrera" class="col-4 col-form-label">Plan de estudios *</label>
  165. <div class="col-8 col-sm-4">
  166. <div class="datalist datalist-select mb-1 w-100">
  167. <div class="datalist-input">Selecciona un plan</div>
  168. <span class="ing-buscar icono"></span>
  169. <ul style="display:none">
  170. <li data-id="">Selecciona un plan</li>
  171. <?php foreach($plan_rs as $plan) {?>
  172. <li data-id="<?php echo $plan["PlanEstudio_id"];?>" <?php if(isset($filter_plan) && $filter_plan == $plan["PlanEstudio_id"]){echo "class='selected'";}?> ><?php echo $plan["Carrera_desc"]." - ".$plan["PlanEstudio_desc"];?></li>
  173. <?php }?>
  174. </ul>
  175. <input type="hidden" id="filter_carrera" name="plan" value="">
  176. </div>
  177. </div>
  178. </div>
  179. <div class="form-group row">
  180. <label for="filter_sem" class="col-4 col-form-label">Semestre *</label>
  181. <div class="col-8 col-sm-4">
  182. <div class="datalist datalist-select mb-1 w-100">
  183. <div class="datalist-input">Mostrar todos</div>
  184. <span class="ing-buscar icono"></span>
  185. <ul style="display:none">
  186. <!--<li data-id="">Mostrar todos</li>-->
  187. <?php for($sem = 1; $sem <= $plan["PlanEstudio_semestres"]; $sem++) {?>
  188. <li data-id="<?php echo $sem;?>" <?php if(isset($filter_sem) && $filter_sem == $sem){echo "class='selected'";}?> ><?php echo $sem;?></li>
  189. <?php }?>
  190. </ul>
  191. <input type="hidden" id="filter_sem" name="sem" value="1">
  192. </div>
  193. </div>
  194. </div>
  195. </div>
  196. <div class="form-group row">
  197. <div class="col-12 text-center">
  198. <button type="submit" class="btn btn-outline-primary"><?php echo $ICO["buscar"]; ?> Filtrar</button>
  199. </div>
  200. </div>
  201. </form>
  202. </div>
  203. </div>
  204. <?php if(isset($materias_rs)){ ?>
  205. <div class="row">
  206. <div class="col-12 table-responsive">
  207. <table class="table table-sm table-striped table-white">
  208. <thead class="thead-dark">
  209. <tr >
  210. <th style="width:50px">&nbsp;</th>
  211. <th>Materia</th>
  212. <th>Aplicación</th>
  213. <th>Salón</th>
  214. <th>Profesor</th>
  215. <?php if($objSesion->puedeEditar()){ ?><th>Acciones</th><?php } ?>
  216. </tr>
  217. </thead>
  218. <tbody>
  219. <?php
  220. if(count($materias_rs) > 0){
  221. //$mat_conElectivas;
  222. foreach($materias_rs as $mat){
  223. if($mat["tieneSubmateria"] && !empty($mat["Examen_id"]))
  224. $mat_conElectivas = array("mat"=>$mat["Materia_id"], "ex"=>$mat["Examen_id"]);
  225. ?>
  226. <tr data-mat="<?php echo $mat["Materia_id"]; ?>" data-id="<?php echo $mat["Examen_id"]; ?>" data-sub="<?php echo $mat["tieneSubmateria"]; ?>" id="id<?php echo $mat["Materia_id"]; ?>">
  227. <?php
  228. $color = "text-success";
  229. $ico = $ICO["aceptar"];
  230. $title = "Examen capturado";
  231. if(empty($mat["Examen_id"])){
  232. $color = "text-danger";
  233. $ico = $ICO["cancelar"];
  234. $title = "Examen sin capturar";
  235. }
  236. ?>
  237. <td class="<?php echo $color;?> text-center" title="<?php echo $title;?>"><?php echo $ico;?></td>
  238. <td><b><?php echo $mat["Materia_desc"]; ?></b>
  239. <br><span style="font-size:85%"><?php echo $mat["Materia_semestre"]; ?> semestre</span>
  240. </td>
  241. <td class="text-center"><?php
  242. if(!empty($mat["Examen_fechahora_inicial"])){
  243. $fechaIArr = explode(" ", $mat["Examen_fechahora_inicial"]);
  244. $fechaFArr = explode(" ", $mat["Examen_fechahora_final"]);
  245. echo fechaSlash($fechaIArr[0]);
  246. ?>
  247. <br>
  248. <span style="font-size:85%" class="text-nowrap"><?php echo date('H:i', strtotime($fechaIArr[1]))." a ".date('H:i', strtotime($fechaFArr[1]))." hrs"; ?></span>
  249. <?php } ?>
  250. </td>
  251. <td class="text-center"><?php
  252. if( $mat["tieneSubmateria"] == 1){
  253. if(!empty($mat["Examen_id"]))
  254. echo "Consulta submaterias";
  255. }else{
  256. if($mat["Salon_desc"] != ""){
  257. echo $mat["Salon_desc"];
  258. if($mat["Salon_desc_larga"] != "")
  259. echo " (".$mat["Salon_desc_larga"].")";
  260. }else
  261. echo "Pendiente";
  262. }
  263. ?>
  264. </td>
  265. <td><?php
  266. if( $mat["tieneSubmateria"] == 1){
  267. if(!empty($mat["Examen_id"]))
  268. echo "Consulta submaterias";
  269. }else{
  270. if($mat["Profesor_id"] != ""){
  271. echo $mat["Profesor_apellidos"]." ".$mat["Profesor_nombre"];
  272. }else
  273. echo "Pendiente";
  274. }
  275. ?>
  276. </td>
  277. <?php if($objSesion->puedeEditar()){ ?>
  278. <td class="text-center icono-acciones">
  279. <a href="#" class="abrir-modal" title="Editar examen"><?php echo $ICO["editar"];?></a>
  280. <?php if(!empty($mat["Examen_id"])){ ?>
  281. <a href="#" data-toggle="modal" data-target="#modal_confirm" title="Borrar examen"><?php echo $ICO["borrar2"];?></a>
  282. <?php } ?>
  283. </td>
  284. <?php } ?>
  285. </tr>
  286. <?php }
  287. }?>
  288. </tbody>
  289. </table>
  290. </div>
  291. </div>
  292. <?php if(!empty($mat_conElectivas) && !empty($mat_conElectivas["ex"])){ ?>
  293. <div class="row justify-content-center mt-4" style="font-size: 85%;">
  294. <div class="col-12 col-md-8">
  295. <table class="table table-sm table-white">
  296. <thead class="thead-dark">
  297. <tr>
  298. <th>Electiva</th>
  299. <th>Nombre</th>
  300. <th>Salón</th>
  301. </tr>
  302. </thead>
  303. <tbody>
  304. <?php
  305. //Electivas
  306. $stmt = $pdo->prepare('Select * from fs_examenextraordinario_submateria(:ex, :mat)');
  307. $stmt->bindParam(":mat", $mat_conElectivas["mat"]);
  308. $stmt->bindParam(":ex", $mat_conElectivas["ex"]);
  309. //echo 'Select * from fs_examenextraordinario_submateria(NULL, '.$mat.')';
  310. if(!$stmt->execute()){
  311. $errorDesc = "Ocurrió un error al cargar los datos de las materias electivas";
  312. }else{
  313. $subexamen_rs = $stmt->fetchAll();
  314. foreach($subexamen_rs as $ex){
  315. $sub_nombre = $ex["Usuario_nombre"]==""?"Pendiente":$ex["Usuario_apellidos"]." ".$ex["Usuario_nombre"];
  316. $sub_salon = $ex["Salon_desc"]==""?"Pendiente":$ex["Salon_desc"];
  317. ?>
  318. <tr>
  319. <td><?php echo $ex["Submateria_desc"];?></td>
  320. <td><?php echo $sub_nombre;?></td>
  321. <td><?php echo $sub_salon;?></td>
  322. </tr>
  323. <?php
  324. }
  325. }
  326. $stmt->closeCursor();
  327. ?>
  328. </tbody>
  329. </table>
  330. </div>
  331. </div>
  332. <?php }//tiene electivas ?>
  333. <?php } //tiene materias ?>
  334. <?php }//puede editar ?>
  335. </main>
  336. <!--- FOOTER--->
  337. <?php require_once("../include/footer.php"); ?>
  338. <?php if($objSesion->puedeEditar()){ ?>
  339. <!-- Modal -->
  340. <div class="modal fade" id="modal" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true">
  341. <div class="modal-dialog modal-dialog-centered" role="document">
  342. <div class="modal-content">
  343. <div class="modal-header">
  344. <h4 class="col-12 modal-title text-center"><span id="modalLabel">Crear Examen</span>
  345. <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
  346. <span aria-hidden="true">&times;</span>
  347. </button></h4>
  348. </div>
  349. <div class="modal-body">
  350. <form action="./action/examen_insert.php" method="post" id="formaModal" >
  351. <input type="hidden" name="id" id="id">
  352. <input type="hidden" name="mat" id="mat">
  353. <div id="copySnack" class="snackbar">Some text some message..</div>
  354. <div class="form-box">
  355. <div class="form-group row bloque-materia">
  356. <label for="prof" class="col-4 col-form-label">Profesor</label>
  357. <div class="col-8">
  358. <select name="prof" id="prof" class="form-control">
  359. <option value="">-Pendiente-</option>
  360. <?php foreach($profesores_rs as $prof){?>
  361. <option value="<?php echo $prof["Usuario_id"]; ?>"><?php echo $prof["Usuario_apellidos"]." ".$prof["Usuario_nombre"]; ?></option>
  362. <?php } ?>
  363. </select>
  364. </div>
  365. </div>
  366. <div class="form-group row bloque_otras" style="display:none">
  367. <label for="fecha_modal" class="col-4 col-form-label">Copiar de otro examen</label>
  368. <div class="col-8 p-2">
  369. <div style="max-height:100px; overflow-x:hidden; overflow-y:auto" id="examen_list">
  370. </div>
  371. </div>
  372. </div>
  373. <div class="form-group row bloque_nueva">
  374. <label for="fecha_modal" class="col-4 col-form-label">Fecha *</label>
  375. <div class="col-8">
  376. <input id="fecha_modal" name="fecha_inicial" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly="readonly" value="<?php echo fechaSlash($periodo_rs["Periodo_fecha_final"]);?>">
  377. </div>
  378. </div>
  379. <div class="form-group row bloque_nueva">
  380. <label for="hora_ini" class="col-4 col-form-label">Hora inicial *</label>
  381. <?php $default_h = 7; $default_m = 15;?>
  382. <div class="col-4">
  383. <select name="hora_ini" id="hora_ini" class="form-control" required="required">
  384. <?php for($h = HORA_INICIO; $h < HORA_FINAL; $h++){?>
  385. <option value="<?php echo sprintf( '%02d', $h );?>" <?php if($default_h == $h){ echo 'selected="selected"';}?>><?php echo sprintf( '%02d', $h );?></option>
  386. <?php } ?>
  387. </select>
  388. </div>
  389. <div class="col-4">
  390. <select name="min_ini" id="min_ini" class="form-control" required="required">
  391. <?php for($m = 0; $m < 60; $m+=(60/FRACCION_HORA)){?>
  392. <option value="<?php echo sprintf( '%02d', $m );?>" <?php if($default_m == $m){ echo 'selected="selected"';}?>><?php echo sprintf( '%02d', $m );?></option>
  393. <?php } ?>
  394. </select>
  395. </div>
  396. </div>
  397. <div class="form-group row bloque_nueva">
  398. <label for="duracion" class="col-4 col-form-label">Duración *</label>
  399. <div class="col-8">
  400. <select name="duracion" id="duracion" class="form-control" required="required">
  401. <option value="45">45 minutos</option>
  402. <?php
  403. $default_d = 90;
  404. for($d = DURACION_MIN; $d<= DURACION_MAX; $d+=DURACION_STEP){?>
  405. <option value="<?php echo $d; ?>" <?php if($default_d == $d){ echo 'selected="selected"'; } ?>><?php echo $d;?> minutos</option>
  406. <?php }?>
  407. </select>
  408. </div>
  409. </div>
  410. <div class="form-group row bloque-materia">
  411. <label for="salon" class="col-4 col-form-label">Salón</label>
  412. <div class="col-8">
  413. <select name="salon" id="salon" class="form-control">
  414. <option value="" data-desc="">-Pendiente-</option>
  415. <?php
  416. $tipo_old = "";
  417. foreach($salones_rs as $salon){
  418. if($tipo_old != $salon["TipoSalon_id"]){
  419. if($tipo_old != "") echo '</optgroup>';
  420. echo '<optgroup label="'.$salon["TipoSalon_desc"].'">';
  421. $tipo_old = $salon["TipoSalon_id"];
  422. }
  423. $desc = $salon["Salon_desc"];
  424. if($salon["Salon_desc_larga"] != ""){ $desc.=" [".$salon["Salon_desc_larga"]."]";}
  425. ?>
  426. <option value="<?php echo $salon["Salon_id"]; ?>" data-desc="<?php echo $salon["Salon_desc"];?>"><?php echo $desc;?></option>
  427. <?php
  428. }
  429. if($tipo_old != "") echo '</optgroup>';
  430. ?>
  431. </select>
  432. </div>
  433. </div>
  434. <?php if(!empty($mat_conElectivas)){?>
  435. <div class="row mt-4 bloque-submateria">
  436. <table class="table table-sm table-white table-striped">
  437. <thead class="thead-dark">
  438. <tr>
  439. <th>Electiva</th>
  440. <th>Salón</th>
  441. <th>Profesor</th>
  442. </tr>
  443. </thead>
  444. <tbody style="font-size:80%">
  445. <?php
  446. $stmt = $pdo->prepare('Select * from fs_submateria(:id, NULL)');
  447. $stmt->bindParam(":id", $mat_conElectivas["mat"]);
  448. if(!$stmt->execute()){
  449. echo "Ocurrió un error al borrar los datos del examen.";
  450. }else{
  451. $sub_rs = $stmt->fetchAll();
  452. $stmt->closeCursor();
  453. foreach($sub_rs as $submateria){
  454. ?>
  455. <tr class="submateria-renglon" id="sub<?php echo $submateria["Submateria_id"]; ?>" data-id="<?php echo $submateria["Submateria_id"]; ?>">
  456. <td class="pt-2"><?php echo $submateria["Submateria_desc"];?></td>
  457. <td>
  458. <select class="form-control salon_electiva">
  459. <option value="" data-desc="">-Pendiente-</option>
  460. <?php
  461. $tipo_old = "";
  462. foreach($salones_rs as $salon){
  463. if($tipo_old != $salon["TipoSalon_id"]){
  464. if($tipo_old != "") echo '</optgroup>';
  465. echo '<optgroup label="'.$salon["TipoSalon_desc"].'">';
  466. $tipo_old = $salon["TipoSalon_id"];
  467. }
  468. $desc = $salon["Salon_desc"];
  469. if($salon["Salon_desc_larga"] != ""){ $desc.=" [".$salon["Salon_desc_larga"]."]";}
  470. ?>
  471. <option value="<?php echo $salon["Salon_id"]; ?>" data-desc="<?php echo $salon["Salon_desc"];?>"><?php echo $desc;?></option>
  472. <?php
  473. }
  474. if($tipo_old != "") echo '</optgroup>';
  475. ?>
  476. </select>
  477. </td>
  478. <td>
  479. <select class="form-control prof_electiva">
  480. <option value="">-Pendiente-</option>
  481. <?php foreach($profesores_rs as $prof){?>
  482. <option value="<?php echo $prof["Usuario_id"]; ?>"><?php echo $prof["Usuario_apellidos"]." ".$prof["Usuario_nombre"]; ?></option>
  483. <?php } ?>
  484. </select>
  485. </td>
  486. </tr>
  487. <?php }//foreach ?>
  488. <?php }//else ?>
  489. </tbody>
  490. </table>
  491. </div>
  492. <?php } ?>
  493. <!-- <div class="row">
  494. <div class="form-check mt-3 mx-auto text-center">
  495. <input type="checkbox" name="copiar" class="form-check-input radio-lg" id="copiar"value="1">
  496. <label class="ml-3 col-form-label form-check-label" for="copiar">Copiar fechas a todas las materias del profesor en el periodo</label>
  497. </div>
  498. </div>-->
  499. </div>
  500. <div class="form-group row">
  501. <div class="offset-4 col-8">
  502. <button type="button" class="btn btn-outline-primary" id="submitBtn" data-tipo="1"><?php echo $ICO["aceptar"];?> Guardar</button>
  503. <button type="reset" class="btn btn-outline-danger" data-dismiss="modal"><?php echo $ICO["cancelar"];?> Cancelar</button>
  504. </div>
  505. </div>
  506. </form>
  507. </div>
  508. </div>
  509. </div>
  510. </div>
  511. <div class="modal fade" id="modal_confirm" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true">
  512. <div class="modal-dialog modal-dialog-centered" role="document">
  513. <div class="modal-content">
  514. <div class="modal-body">
  515. <div class="row">
  516. <div class="col">
  517. <p class="font-weight-bold">¿Estás seguro de que quieres borrar el examen?</p>
  518. <p>Esta acción no se puede deshacer.</p>
  519. </div>
  520. </div>
  521. </div>
  522. <div class="modal-footer">
  523. <input type="hidden" id="id_borrar" value="">
  524. <button type="button" class="btn btn-outline-primary btn-borrar"><?php echo $ICO["aceptar"];?> Borrar</button>
  525. <button type="button" class="btn btn-outline-danger" data-dismiss="modal" aria-label="Close"><?php echo $ICO["cancelar"];?> Cancelar</button>
  526. </div>
  527. </div>
  528. </div>
  529. </div>
  530. <?php } ?>
  531. </div>
  532. <script src="../js/jquery.min.js"></script>
  533. <script src="../js/jquery-ui.js"></script>
  534. <script src="../js/datepicker-es.js"></script>
  535. <script src="../js/bootstrap/popper.min.js"></script>
  536. <script src="../js/bootstrap/bootstrap.min.js"></script>
  537. <script src="../js/fechas.js"></script>
  538. <script src="../js/sidebarmenu.js"></script>
  539. <script src="../js/datalist.js"></script>
  540. <script>
  541. $(document).on( "click", ".btn-reset", function(event){
  542. var forma = $(this).parents("form");
  543. forma.find("input[type=text]").val("");
  544. //forma.find("select").prop("selectedIndex",0);
  545. setDatalistFirst("#filter_carrera");
  546. setDatalistFirst("#filter_sem");
  547. forma.submit();
  548. });
  549. //Para periodoCambio
  550. //$(document).ready(function(){
  551. setDatalist("#periodo", <?php echo $_SESSION["periodo_id"]; ?>);
  552. $(document).on('click', '#dlPeriodo ul li' ,function(){
  553. $("#formaPeriodo").submit();
  554. });
  555. //});
  556. </script>
  557. <?php if($objSesion->puedeEditar()){ ?>
  558. <script src="../js/toggle.js"></script>
  559. <script src="../js/snackbar.js"></script>
  560. <script>
  561. var _periodo_fecha_inicial = "<?php echo fechaSlash($periodo_rs["Periodo_fecha_inicial"]); ?>";
  562. var _periodo_fecha_final = "<?php echo fechaSlash($extras_rs["FechaImportante_final"]);?>";
  563. var datepickerOptions = { dateFormat: "dd/mm/yy", minDate:_periodo_fecha_inicial, maxDate:_periodo_fecha_final };
  564. function loadSemestre(planObj, semObj){//revisa el plan y cambia la cantidad de semestres máximos
  565. var modal = $("#modal");
  566. var semOld = semObj.val();
  567. if(planObj.val() != ""){
  568. $.ajax({
  569. url: './action/planestudios_semestres.php',
  570. type: 'POST',
  571. dataType: 'json',
  572. data: {
  573. id: planObj.val(),
  574. },
  575. success: function(result) {
  576. if(result["error"]!= "" && result["error"] !== undefined){
  577. $("#errorBox").collapse('show');
  578. $("#errorBox_text").html(result["error"]);
  579. modal.modal('hide');
  580. }else{
  581. semObj.find('option:gt('+(result["semestres"])+')').remove();//si sobran, borra
  582. //semObj.find('option').remove();//si sobran, borra
  583. //si faltan, agrega
  584. for(var i = semObj.find('option').length+1; i <= result["semestres"]; i++){
  585. /*if(parseInt(semOld) == i){
  586. semObj.append($("<option></option>").attr("value",i).text(i)).attr("selected", true);
  587. }else{*/
  588. semObj.append($("<option></option>").attr("value",i).text(i));
  589. //}
  590. }
  591. }
  592. },
  593. error: function(jqXHR, textStatus, errorThrown ){
  594. modal.modal('hide');
  595. $("#errorBox").collapse('show');
  596. $("#errorBox_text").html(errorThrown);
  597. }
  598. });//
  599. }
  600. }
  601. function validaForm(){
  602. var myBtn = $('#submitBtn');
  603. var error = false;
  604. $("#prof").removeClass("is-invalid");
  605. $("#fecha_inicial").removeClass("is-invalid");
  606. if($("#fecha_inicial").val() == ""){
  607. $("#fecha_inicial").addClass("is-invalid");
  608. error = true;
  609. }
  610. /*if($("#submitBtn").data('sub')== 0 && ($("#prof").val() == "" || $("#prof").val() === null)){
  611. $("#prof").addClass("is-invalid");
  612. error = true;
  613. }*/
  614. return !error;
  615. }
  616. function creaExamen(materia, fecha, hora, min, duracion, salon){
  617. return '<p class="mb-0 examen-copy" data-fecha="'+fecha+'" data-hora="'+hora+'" data-min="'+min+'" data-duracion="'+duracion+'" data-salon="'+salon+'" >\
  618. <span class="badge badge-secondary d-inline-block text-truncate pointer" style="max-width: 95%;" title="Click para copiar datos">'+materia+'</span></p>';
  619. }
  620. $(document).ready(function(){
  621. $(".date-picker" ).datepicker(datepickerOptions);
  622. $(".date-picker" ).datepicker( $.datepicker.regional[ "es" ] );
  623. loadSemestre( $('#filter_carrera'), $('#filter_sem') );//carga semestres de primer carrera/plan en la lista
  624. $('#modal_confirm').on('show.bs.modal', function (event) {
  625. var button = $(event.relatedTarget); // Button that triggered the modal
  626. var id = button.parents("tr").data("id");
  627. $("#id_borrar").val(id);
  628. });
  629. $(".btn-borrar").click(function(){
  630. var cid = $("#id_borrar").val();
  631. $.ajax({
  632. url: './action/examen_delete.php',
  633. type: 'POST',
  634. dataType: 'json',
  635. data: { id: cid, },
  636. success: function(result) {
  637. if(result["error"]!= "" && result["error"] !== undefined){
  638. $("#errorBox").collapse('show');
  639. $("#errorBox_text").html(result["error"]);
  640. $('#messageBox')[0].scrollIntoView({ block: "end" });
  641. modal.modal('hide');
  642. }else{
  643. location.reload();
  644. }
  645. },
  646. error: function(jqXHR, textStatus, errorThrown ){
  647. $("#errorBox").collapse('show');
  648. $("#errorBox_text").html(errorThrown);
  649. $('#messageBox')[0].scrollIntoView({ block: "end" });
  650. }
  651. });//ajax
  652. $('#modal_confirm').modal("hide");
  653. });
  654. $('.abrir-modal').click(function(){
  655. var button = $(this); // Button that triggered the modal
  656. var examen = button.parents("tr").data('id'); //si tiene el examen ya creado o no
  657. var sub = button.parents("tr").data('sub'); //si tiene submaterias
  658. var modal = $('#modal');
  659. //$(this).find(".form-control:first-child").focus();
  660. $("#errorBox").collapse('hide');
  661. $("#errorBox_text").html("");
  662. $("#mat").val( button.parents("tr").data('mat') );
  663. //$("#copiar").prop("checked",false);
  664. $("#submitBtn").data('sub', sub);
  665. if(sub==1){
  666. $("#modal .bloque-submateria").show();
  667. $("#modal .bloque-materia").hide();
  668. }else{
  669. $("#modal .bloque-submateria").hide();
  670. $("#modal .bloque-materia").show();
  671. }
  672. if(examen == "" || examen == undefined){//alta
  673. $("#submitBtn").data('tipo', 1);
  674. $("#modalLabel").html("Crear Examen");
  675. modal.find("input[type=text]").val("");
  676. modal.find("#duracion").val("90");
  677. modal.find("#prof").prop("selectedIndex", 0);;
  678. modal.find("#salon").prop("selectedIndex", 0);;
  679. modal.modal('show');
  680. $('#fecha_modal').val("<?php echo fechaSlash($extras_rs["FechaImportante_inicial"]); ?>");
  681. }else{//editar
  682. $("#submitBtn").data('tipo', 2);
  683. $("#modalLabel").html("Editar Examen");
  684. $("#id").val(examen);
  685. $.ajax({
  686. url: './action/examen_select.php',
  687. type: 'POST',
  688. dataType: 'json',
  689. data: { id: examen },
  690. success: function(result) {
  691. if(result["error"]!= "" && result["error"] !== undefined){
  692. modal.modal('hide');
  693. $("#errorBox").collapse('show');
  694. $("#errorBox_text").html(result["error"]);
  695. $('#messageBox')[0].scrollIntoView({ block: "end" });
  696. }else{
  697. $('#salon').val(result["salon"]);
  698. $("#fecha_modal").val(result["fecha_inicial"]);
  699. $('#hora_ini').val(result["hora_ini"]);
  700. $('#min_ini').val(result["min_ini"]);
  701. //$('#hora_fin').val(result["hora_fin"]);
  702. $('#duracion').val(result["duracion"]);
  703. $('#prof').val(result["profesor"]);
  704. $('#prof').change();
  705. var i;
  706. if(result["submaterias"]!== undefined){
  707. for(i=0; i<result["submaterias"].length; i++){
  708. $("#sub"+result["submaterias"][i].Submateria_id).find(".salon_electiva").val(result["submaterias"][i].Salon_id);
  709. $("#sub"+result["submaterias"][i].Submateria_id).find(".prof_electiva").val(result["submaterias"][i].Usuario_id);
  710. }
  711. }
  712. modal.modal('show');
  713. }
  714. },
  715. error: function(jqXHR, textStatus, errorThrown ){
  716. modal.modal('hide');
  717. $("#errorBox").collapse('show');
  718. $("#errorBox_text").html(errorThrown);
  719. $('#messageBox')[0].scrollIntoView({ block: "end" });
  720. }
  721. });//ajax
  722. }
  723. });//show
  724. /*
  725. $("#filter_carrera").change(function(){
  726. loadSemestre( $(this), $('#filter_sem') );
  727. });*/
  728. $('#submitBtn').click(function(){
  729. var modal = $('#modal');
  730. if(validaForm()){
  731. var action;
  732. if($(this).data("tipo") == 2 ){
  733. action = "./action/examen_update.php";
  734. }else{
  735. action = "./action/examen_insert.php";
  736. }
  737. var sub = [];
  738. if($(this).data("sub") == 1){
  739. $.each($(".submateria-renglon"), function(){
  740. sub.push( { id: $(this).data("id"),
  741. salon: $(this).find(".salon_electiva").val(),
  742. prof: $(this).find(".prof_electiva").val()});
  743. });
  744. }
  745. var examen = {
  746. mat: $("#mat").val(),
  747. examen: $("#id").val(),
  748. fecha_inicial: $("#fecha_modal").val(),
  749. hora_ini: $("#hora_ini").val(),
  750. min_ini: $("#min_ini").val(),
  751. duracion: $("#duracion").val(),
  752. salon: $("#salon").val(),
  753. profesor: $("#prof").val(),
  754. //copiar:$("#copiar").prop("checked")?1:0,
  755. copiar:0,
  756. submaterias: sub
  757. };
  758. $.ajax({
  759. url: action,
  760. type: 'POST',
  761. dataType: 'json',
  762. data: {json: JSON.stringify(examen)},
  763. success: function(result) {
  764. if(result["error"]!= "" && result["error"] !== undefined){
  765. $("#errorBox").collapse('show');
  766. $("#errorBox_text").html(result["error"]);
  767. $('#messageBox')[0].scrollIntoView({ block: "end" });
  768. modal.modal('hide');
  769. }else{
  770. /*$("#successBox").collapse('show');
  771. $("#successBox_text").html(result["ok"]);*/
  772. location.reload();
  773. }
  774. //$('#messageBox')[0].scrollIntoView({ block: "end" });
  775. },
  776. error: function(jqXHR, textStatus, errorThrown ){
  777. $("#errorBox").collapse('show');
  778. $("#errorBox_text").html(errorThrown);
  779. $('#messageBox')[0].scrollIntoView({ block: "end" });
  780. modal.modal('hide');
  781. }
  782. });//ajax
  783. }
  784. });
  785. $(document).on( "click", ".examen-copy", function(event){
  786. $("#fecha_modal").val($(this).data("fecha"));
  787. $("#hora_ini").val($(this).data("hora"));
  788. $("#min_ini").val($(this).data("min"));
  789. $("#duracion").val($(this).data("duracion"));
  790. $("#salon").val($(this).data("salon"));
  791. showSnack("copySnack", "¡Datos copiados!");
  792. });
  793. $("#prof").change(function(){
  794. $.ajax({
  795. url: './action/examenprofesor_select.php',
  796. type: 'POST',
  797. dataType: 'json',
  798. data: {id: $(this).val()},
  799. success: function(result) {
  800. if(result["error"]!= "" && result["error"] !== undefined){
  801. $("#errorBox").collapse('show');
  802. $("#errorBox_text").html(result["error"]);
  803. $('#messageBox')[0].scrollIntoView({ block: "end" });
  804. modal.modal('hide');
  805. }else{
  806. $("#examen_list").html("");
  807. if(result["examenes"].length == 0){
  808. $("#examen_list").html("<p class='mb-0'><small><i>No hay otros exámenes</i></small>");
  809. $(".bloque_otras").hide();
  810. }else{
  811. $(".bloque_otras").show();
  812. for(var i=0; i<result["examenes"].length; i++){
  813. var ex = result["examenes"][i];
  814. $("#examen_list").append( creaExamen("["+ex["carrera"]+"] "+ex["materia"], ex["fecha"], ex["hora"], ex["min"], ex["duracion"], ex["salon"]));
  815. }
  816. }
  817. }
  818. //$('#messageBox')[0].scrollIntoView({ block: "end" });
  819. },
  820. error: function(jqXHR, textStatus, errorThrown ){
  821. $("#errorBox").collapse('show');
  822. $("#errorBox_text").html(errorThrown);
  823. $('#messageBox')[0].scrollIntoView({ block: "end" });
  824. modal.modal('hide');
  825. }
  826. });//ajax
  827. });
  828. });
  829. </script>
  830. <?php } ?>
  831. </body>
  832. </html>