mireposicion.php 56 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974
  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 = 2;
  8. $submenu = 23;
  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. //Obtiene fechas de periodo
  16. $stmt = $pdo->prepare('Select * from fs_periodo(:periodo, NULL, NULL, true)');
  17. $stmt->bindParam(":periodo", $_SESSION["periodo_id"]);
  18. if(!$stmt->execute()){
  19. //print_r($stmt->errorInfo());
  20. $errorDesc = "Ocurrió un error al cargar los datos del periodo";
  21. }else{
  22. $periodo_rs = $stmt->fetch();
  23. }
  24. $stmt->closeCursor();
  25. $fecha_min = $periodo_rs["Periodo_fecha_inicial"];
  26. $fecha_max = $periodo_rs["Periodo_fecha_final"];
  27. // ---- Obtiene fechas de vacaciones
  28. $stmt = $pdo->prepare('select * from fs_calendarioevento_categoria(:fini, :ffin, 2, :periodo)');
  29. $stmt->bindParam(":fini", $fecha_min);
  30. $stmt->bindParam(":ffin", $fecha_max);
  31. $stmt->bindParam(":periodo", $_SESSION["periodo_id"]);
  32. if(!$stmt->execute()){
  33. $errorDesc = "Ocurrió un error al cargar las fechas de vacaciones";
  34. }else{
  35. $vacaciones_rs = $stmt->fetchAll();
  36. }
  37. $stmt->closeCursor();
  38. $stmt = null;
  39. $vacacionesArr = array();//Guarda los días individuales de vacaciones
  40. foreach($vacaciones_rs as $evento){
  41. $fecha = fechaGuion($evento["CalendarioEvento_fecha"]);
  42. switch($evento["CalendarioRepeticion_id"]){
  43. case 1: //diario
  44. while (strtotime($fecha) <= strtotime($evento["CalendarioReglas_fecha_final"])) {
  45. $vacacionesArr[] = array("fecha"=> $fecha, "titulo"=>$evento["CalendarioEvento_titulo"]);
  46. $fecha = date ("Y-m-d", strtotime("+1 day", strtotime($fecha)));
  47. }
  48. break;
  49. case 2: //semanal
  50. $diasArr = explode(",", $evento["CalendarioReglas_dias_str"]);
  51. while (strtotime($fecha) <= strtotime($evento["CalendarioReglas_fecha_final"])) {
  52. if(in_array(date("w", strtotime($fecha)), $diasArr) ){//si es el día que quiero
  53. $vacacionesArr[] = array("fecha"=> $fecha, "titulo"=>$evento["CalendarioEvento_titulo"]);
  54. }
  55. $fecha = date ("Y-m-d", strtotime("+1 day", strtotime($fecha)));
  56. }
  57. break;
  58. case 3://mensual
  59. $diasArr = explode(",", $evento["CalendarioReglas_dias_str"]);
  60. //reglas
  61. $weekTxt = array(1=>"first", 2=>"second", 3=>"third", 4=>"fourth", -1=>"last");
  62. $dayname = array("sun", "mon", "tue", "wed", "thu", "fri", "sat");
  63. $fecha = date ("Y-m-01", strtotime($fecha));//empieza a revisar en el primer día del mes
  64. $semana = $evento["CalendarioReglas_semana"];
  65. while (strtotime($fecha) <= strtotime($evento["CalendarioReglas_fecha_final"])) {
  66. foreach($diasArr as $d){
  67. //echo "-->". intval(date("w", strtotime($fecha)))." == ". intval($d)."[".$fecha."]";
  68. if($semana == 1 && intval(date("w", strtotime($fecha))) == intval($d) ){//si el día actual es el que quiero lo guarda
  69. $vacacionesArr[] = array("fecha"=> $fecha, "titulo"=>$evento["CalendarioEvento_titulo"]);
  70. }else{//si no calcula siguiente día
  71. if(intval(date("w", strtotime($fecha))) == intval($d)){
  72. $fechaTmp = date ("Y-m-d", strtotime($weekTxt[$semana-1]." ".$dayname[$d], strtotime($fecha)));
  73. }else{
  74. $fechaTmp = date ("Y-m-d", strtotime($weekTxt[$semana]." ".$dayname[$d], strtotime($fecha)));
  75. }
  76. $vacacionesArr[] = array("fecha"=> $fecha, "titulo"=>$evento["CalendarioEvento_titulo"]);
  77. }
  78. }
  79. $fecha = date ("Y-m-01", strtotime("+1 month", strtotime($fecha)));//siguiente mes primer día
  80. }
  81. break;
  82. default: //no se repite
  83. $vacacionesArr[] = array("fecha"=> $fecha, "titulo"=>$evento["CalendarioEvento_titulo"]);
  84. }
  85. }
  86. ?>
  87. <!DOCTYPE html>
  88. <html lang="es" prefix="og: http://ogp.me/ns#">
  89. <head>
  90. <title>APSA - Facultad de Ingeniería</title>
  91. <meta charset="utf-8">
  92. <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  93. <link rel="icon" type="image/png" href="../img/favicon.png" />
  94. <link rel="stylesheet" href="../css/bootstrap-ulsa.min.css" type="text/css">
  95. <link rel="stylesheet" href="../css/indivisa.css" type="text/css">
  96. <link rel="stylesheet" href="../css/sgi.css?rand=<?php echo rand();?>" type="text/css">
  97. <link rel="stylesheet" href="../css/fa_all.css" type="text/css">
  98. <link rel="stylesheet" href="../css/jquery-ui.css" type="text/css">
  99. <link rel="stylesheet" href="../css/calendar.css" type="text/css">
  100. <script src="../js/util.js"></script>
  101. <style>
  102. .wizard { height: 20px; width: 80%; background: #D0D0D0; }
  103. .wizard.full { background: #D0D0D0; }
  104. .wizard.active > div:first-child { background: #00A6CE; }
  105. .wizard.active > div:last-child { width: 0px; height: 0px; border-style: solid; border-width: 10px 0 10px 6px; border-color: transparent transparent transparent #00a6ce; transform: rotate(0deg); }
  106. </style>
  107. </head>
  108. <body>
  109. <div>
  110. <?php
  111. //--- Objeto que pinta menu
  112. $menuObj = new MainMenu($_SESSION["usuario_id"], $menu, $pdo, APSA, "Captura de reposiciones de clase");//usr, menu, pdo, sist
  113. $menuObj->printMenu();
  114. //Obtiene grupos
  115. $query = "";
  116. if(isset($_POST["fecha_ini"]) && $_POST["fecha_ini"]!=""){
  117. $filter_fini = trim(filter_input(INPUT_POST, "fecha_ini", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));//limpia texto
  118. $query.=":f_ini, ";
  119. }else{
  120. $query.="NULL, ";
  121. }
  122. if(isset($_POST["fecha_fin"]) && $_POST["fecha_fin"]!=""){
  123. $filter_ffin = trim(filter_input(INPUT_POST, "fecha_fin", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));//limpia texto
  124. $query.=":f_fin, ";
  125. }else{
  126. $query.="NULL, ";
  127. }
  128. $stmt = $pdo->prepare('Select * from fs_reposicion(NULL, :periodo, NULL, :prof, '.$query.' NULL, 0, NULL )');
  129. $stmt->bindParam(":periodo", $_SESSION["periodo_id"]);
  130. if(isset($filter_fini)) $stmt->bindParam(":f_ini", $filter_fini);
  131. if(isset($filter_ffin)) $stmt->bindParam(":f_fin", $filter_ffin);
  132. $stmt->bindParam(":prof", $_SESSION["usuario_id"]);
  133. if(!$stmt->execute()){
  134. //print_r($stmt->errorInfo());
  135. $errorDesc = "Ocurrió un error al cargar las reposiciones";
  136. }else{
  137. $reposiciones_rs = $stmt->fetchAll();
  138. }
  139. $stmt->closeCursor();
  140. //Obtiene plan de estudios
  141. $stmt = $pdo->prepare('Select * from fs_planestudio(:nivel, NULL, NULL, true, NULL, NULL)');
  142. $stmt->bindParam(":nivel", $_SESSION["nivel_id"]);
  143. if(!$stmt->execute()){
  144. //print_r($stmt->errorInfo());
  145. $errorDesc = "Ocurrió un error al cargar los planes de estudios";
  146. }else
  147. $plan_rs = $stmt->fetchAll();
  148. $stmt->closeCursor();
  149. //Obtiene fechas de periodo
  150. $stmt = $pdo->prepare('Select * from fs_periodo(:periodo, NULL, NULL, true)');
  151. $stmt->bindParam(":periodo", $_SESSION["periodo_id"]);
  152. if(!$stmt->execute()){
  153. $errorDesc = "Ocurrió un error al cargar las fechas del periodo";
  154. }else{
  155. $periodo_rs = $stmt->fetch();
  156. }
  157. $stmt->closeCursor();
  158. //Salones
  159. $stmt = $pdo->prepare('Select * from fs_salon(NULL, NULL, 0, NULL)');
  160. if(!$stmt->execute()){
  161. $errorDesc = "Error al obtener los salones";
  162. //print_r($stmt->errorInfo());
  163. }
  164. $salones_rs = $stmt->fetchAll();
  165. $stmt->closeCursor();
  166. //Estado reposicion
  167. $stmt = $pdo->prepare('Select * from fs_estadoreposicion(NULL)');
  168. if(!$stmt->execute()){
  169. $errorDesc = "Error al obtener los estados de reposición";
  170. //print_r($stmt->errorInfo());
  171. }
  172. $estado_rs = $stmt->fetchAll();
  173. $stmt->closeCursor();
  174. //Materias
  175. //$stmt = $pdo->prepare('Select * from fs_materiasprofesor(:per, :usr)');
  176. $stmt = $pdo->prepare('SELECT mh."Horario_id", mh."Materia_desc", mh."Grupo_desc", mh."Carrera_prefijo",d."Dia_id", d."Dia_desc", mh."Hora_inicio"
  177. FROM fs_mihorario(:usr, :per, 3) AS mh
  178. INNER JOIN "Dia" d ON mh."Dia_id" = d."Dia_id"
  179. WHERE "TipoHorario_id" = 3
  180. ORDER BY "Grupo_desc", "Materia_desc", d."Dia_id", "Hora_inicio"');
  181. $stmt->bindParam(":per", $_SESSION["periodo_id"]);
  182. $stmt->bindParam(":usr", $_SESSION["usuario_id"]);
  183. if(!$stmt->execute()){
  184. $errorDesc = "Error al obtener las materias";
  185. }
  186. $materias_rs = $stmt->fetchAll();
  187. $stmt->closeCursor();
  188. if($_SESSION["jefe_carrera"] ){
  189. //Profesores del área del profesor
  190. $stmt = $pdo->prepare('Select * from fs_profesoresperiodo_jefe(:per, :usr)');
  191. $stmt->bindParam(":per", $_SESSION["periodo_id"]);
  192. $stmt->bindParam(":usr", $_SESSION["usuario_id"]);
  193. if(!$stmt->execute()){
  194. $errorDesc = "Error al obtener el área del usuario";
  195. //print_r($stmt->errorInfo());
  196. }
  197. $prof_rs = $stmt->fetchAll();
  198. $stmt->closeCursor();
  199. }else if($_SESSION["sgi_administrador"]){
  200. //Profesores del área del profesor
  201. $stmt = $pdo->prepare('Select * from fs_profesoresperiodo_jefe(:per, NULL)');
  202. $stmt->bindParam(":per", $_SESSION["periodo_id"]);
  203. if(!$stmt->execute()){
  204. $errorDesc = "Error al obtener el área del usuario";
  205. //print_r($stmt->errorInfo());
  206. }
  207. $prof_rs = $stmt->fetchAll();
  208. $stmt->closeCursor();
  209. }
  210. $stmt = null;
  211. if(count($plan_rs) == 0){
  212. header("Location: planestudios.php?error=4");
  213. exit();
  214. }
  215. //--Manejo de errores y mensajes de exito
  216. if(isset($_GET["error"]) && is_numeric($_GET["error"])){
  217. switch ($_GET["error"]){
  218. case 0: $errorDesc = "No se reciberon los datos de la reposición."; break;
  219. case 1: $errorDesc = "Ocurrió un error al insertar los datos de la reposición/cambio."; break;
  220. case 2: $errorDesc = "Ocurrió un error al actualizar los datos de la reposición/cambio."; break;
  221. case 3: $errorDesc = "No tienes permisos para realizar esa acción."; break;
  222. case 4: $errorDesc = "Ocurrió un error al cargar los datos de la reposición/cambio."; break;
  223. case 6: $errorDesc = "La reposición/cambio que buscas no existe. Consulta la lista de reopsiciones disponibles en esta sección."; break;
  224. case 7: $errorDesc = "La reposición/cambio se empalma con el horario del grupo y no se puede guardar."; break;
  225. case 8: $errorDesc = "El salón de la reposición está siendo utilizado ese día a esa hora y no se puede guardar."; break;
  226. case 9: $errorDesc = "El profesor está asigndo a otra reposición/cambio el mismo día a la misma hora y no se puede guardar."; break;
  227. case 10: $errorDesc = "El profesor está asigndo a una materia el mismo día a la misma hora y no se puede guardar."; break;
  228. case 11: $errorDesc = "No hay clases asignadas para esa materia y grupo en la fecha de falta."; break;
  229. case 12: $errorDesc = "Ocurrió un error al insertar los datos de la reposición/cambio en el servidor remoto."; break;
  230. case 13: $errorDesc = "Ocurrió un error al actualizar los datos de la reposición/cambio en el servidor remoto."; break;
  231. }
  232. }
  233. if(isset($_GET["ok"]) && is_numeric($_GET["ok"])){
  234. switch ($_GET["ok"]){
  235. case 0: $successDesc = "La reposición/cambio se guardó correctamente."; break;
  236. case 1: $successDesc = "La reposición/cambio se actualizó correctamente."; break;
  237. }
  238. }
  239. ?>
  240. <main class="container-fluid content marco">
  241. <?php if($objSesion->puedeEditar() && !empty($materias_rs) && duracionMinutos(date("Y-m-d H:i:00"), $periodo_rs["Periodo_fecha_final"] ) > 0){ ?>
  242. <div class="row mb-3">
  243. <div class="col-12 text-right">
  244. <button type="button" class="btn btn-outline-secondary abrir-modal" data-tipo="1"><?php echo $ICO["mas"];?> Crear reposición</button>
  245. </div>
  246. </div>
  247. <?php }?>
  248. <?php include_once("../include/errorMessage.php");?>
  249. <?php include("../include/periodoCambio.php");?>
  250. <?php if(empty($materias_rs)){ ?>
  251. <div class="col-12 text-center">
  252. <h4 class="mt-4 text-danger">No tienes materias asignadas en este periodo.</h4>
  253. </div>
  254. <?php }
  255. else if(isset($periodo_rs) && isset($plan_rs)){
  256. ?>
  257. <!-- Filtro -->
  258. <div class="row">
  259. <div class="col-12">
  260. <form action="#" method="post">
  261. <div class="form-box form-box-info">
  262. <div class="form-group row">
  263. <label for="filter_fecha" class="col-4 col-form-label">Fecha inicial</label>
  264. <div class="col-8 col-sm-4">
  265. <input id="filter_fecha_ini" name="fecha_ini" type="text" class="form-control date-picker-filtro" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly="readonly" value="<?php if(!empty($filter_fini)){ echo fechaSlash($filter_fini);}else{ echo fechaSlash($periodo_rs["Periodo_fecha_inicial"]); }?>">
  266. </div>
  267. </div>
  268. <div class="form-group row">
  269. <label for="filter_fecha" class="col-4 col-form-label">Fecha final</label>
  270. <div class="col-8 col-sm-4">
  271. <input id="filter_fecha_fin" name="fecha_fin" type="text" class="form-control date-picker-filtro" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly="readonly" value="<?php if(!empty($filter_ffin)){ echo fechaSlash($filter_ffin);}else{ echo fechaSlash($periodo_rs["Periodo_fecha_final"]); }?>">
  272. </div>
  273. </div>
  274. </div>
  275. <div class="form-group row">
  276. <div class="col-12 text-center">
  277. <button type="submit" class="btn btn-outline-primary"><?php echo $ICO["buscar"]; ?> Filtrar</button>
  278. <button type="button" class="btn btn-outline-danger btn-reset"><?php echo $ICO["borrar"]?> Limpiar</button>
  279. </div>
  280. </div>
  281. </form>
  282. </div>
  283. </div>
  284. <div class="row">
  285. <?php
  286. if(isset($reposiciones_rs) && count($reposiciones_rs)>0){ ?>
  287. <div class="col-12 table-responsive">
  288. <table class="table table-sm table-striped table-white">
  289. <thead class="thead-dark">
  290. <tr >
  291. <th>Estado</th>
  292. <th>Materia</th>
  293. <th>Tipo</th>
  294. <th style="width:160px">Fecha falta</th>
  295. <th style="width:160px">Fecha reposición</th>
  296. <th>Salón</th>
  297. <?php if($objSesion->puedeEditar()){ ?><th>Acciones</th><?php } ?>
  298. </tr>
  299. </thead>
  300. <tbody>
  301. <?php
  302. foreach($reposiciones_rs as $reposicion){
  303. ?>
  304. <tr data-id="<?php echo $reposicion["Reposicion_id"]; ?>" id="id<?php echo $reposicion["Reposicion_id"]; ?>" data-id_cronos="<?php echo $reposicion["Reposicion_id_cronos"]; ?>">
  305. <td class="align-middle text-center" style="color:<?php echo $reposicion["ReposicionEstado_color"];?>" title="<?php echo $reposicion["ReposicionEstado_desc"];?>">
  306. <?php if($reposicion["ReposicionEstado_id"]<3){ ?>
  307. <div class="wizard <?php if(intval($reposicion["ReposicionEstado_id"])==2) echo "active";?> d-flex mx-auto">
  308. <div class="w-50 h-100"></div>
  309. <div class=""></div>
  310. </div>
  311. <?php } else if($reposicion["ReposicionEstado_id"]==3){?>
  312. <div class="text-success text-center pt-1">
  313. <span class="ing-autorizar ing-lg"></span>
  314. </div>
  315. <?php } else {?>
  316. <div class="text-danger text-center pt-1">
  317. <span class="ing-negar ing-lg"></span>
  318. </div>
  319. <?php } ?>
  320. </td>
  321. <td class="align-middle"><?php echo $reposicion["Materia_desc"]; ?>
  322. (<?php
  323. //if($_SESSION["nivel_id"] == 1)
  324. echo $reposicion["Grupo_desc"]." ".$reposicion["Carrera_prefijo"];
  325. //else
  326. //echo $reposicion["Grupo_desc"];
  327. ?>)
  328. </td>
  329. <td class="align-middle">
  330. <?php if($reposicion["esReposicion"]) echo "Reposición"; else echo "Cambio"; ?>
  331. </td>
  332. <td class="align-middle text-center"><?php
  333. $fechaIArr = explode(" ", $reposicion["Reposicion_fecha_falta"]);
  334. $fechaFArr = explode(" ", $reposicion["Reposicion_fecha_falta"]);
  335. echo fechaSlash($fechaIArr[0]);
  336. ?>
  337. </td>
  338. <td class="align-middle text-center"><?php
  339. $fechaIArr = explode(" ", $reposicion["Reposicion_fecha_nueva"]);
  340. $fechaFArr = explode(" ", $reposicion["Reposicion_fecha_nueva"]);
  341. echo fechaSlash($fechaIArr[0])."<br>".date('H:i', strtotime($fechaIArr[1]))." a ".date('H:i', strtotime($fechaFArr[1]." +90 minute"))." hrs.";
  342. ?>
  343. </td>
  344. <td class="align-middle text-center"><?php
  345. if($reposicion["Salon_desc"] != ""){
  346. echo $reposicion["Salon_desc"];
  347. if($reposicion["Salon_desc_larga"] != "")
  348. echo " (".$reposicion["Salon_desc_larga"].")";
  349. }else
  350. echo "-Pendiente-";
  351. ?>
  352. </td>
  353. <?php if($objSesion->puedeEditar()){ ?>
  354. <td class="align-middle text-center icono-acciones">
  355. <?php
  356. //no se cumple la fecha de la reposicion
  357. if(/*duracionMinutos($reposicion["Reposicion_fecha_nueva"], date("Y-m-d H:i:00")) < 0 &&*/ $reposicion["ReposicionEstado_id"] == 1){?>
  358. <a href="#" class="abrir-modal" data-tipo="2" title="Editar"><?php echo $ICO["editar"];?></a>
  359. <a href="#" data-toggle="modal" data-target="#modal_confirm" title="Borrar"><?php echo $ICO["cancelar"];?></a>
  360. <?php } ?>
  361. </td>
  362. <?php } ?>
  363. </tr>
  364. <?php }
  365. ?>
  366. </tbody>
  367. </table>
  368. </div>
  369. <?php } else { ?>
  370. <div class="col-12 text-center">
  371. <h4 class="mt-4 text-danger">No tienes reposiciones disponibles</h4>
  372. </div>
  373. <?php } ?>
  374. </div>
  375. <?php } ?>
  376. </main>
  377. <!--- FOOTER--->
  378. <?php require_once("../include/footer.php"); ?>
  379. <?php if($objSesion->puedeEditar()){ ?>
  380. <!-- Modal -->
  381. <div class="modal fade" id="modal" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true">
  382. <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
  383. <div class="modal-content">
  384. <div class="modal-header">
  385. <h4 class="col-12 modal-title text-center"><span id="modalLabel">Crear Reposición</span>
  386. <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
  387. <span aria-hidden="true">&times;</span>
  388. </button></h4>
  389. </div>
  390. <div class="modal-body">
  391. <form action="./action/reposicion_insert.php" method="post" id="formaModal" onsubmit="return submitForm()">
  392. <input type="hidden" name="id" id="id">
  393. <input type="hidden" name="id_cronos" id="id_cronos">
  394. <input type="hidden" name="estado" value="1">
  395. <div class="form-box">
  396. <?php if($_SESSION["jefe_carrera"] || $_SESSION["sgi_administrador"]){ ?>
  397. <div class="form-group row" id="profBlock">
  398. <label for="prof" class="col-4 col-form-label">Profesor *</label>
  399. <div class="col-8">
  400. <div class="datalist datalist-select mb-1 w-100" id="dlProfesor">
  401. <div class="datalist-input">Profesores del área</div>
  402. <span class="ing-buscar icono"></span>
  403. <ul style="display:none">
  404. <?php foreach($prof_rs as $prof){?>
  405. <li data-id="<?php echo $prof["Usuario_id"];?>" <?php if($prof["Usuario_id"]==$_SESSION["usuario_id"]){ echo "class='selected'";} ?> ><?php echo $prof["Usuario_apellidos"].' '.$prof["Usuario_nombre"];?></li>
  406. <?php } ?>
  407. </ul>
  408. <input type="hidden" id="prof" name="prof" value="">
  409. </div>
  410. </div>
  411. </div>
  412. <?php } ?>
  413. <div class="form-group row" id="materiaBlock">
  414. <label for="horario" class="col-4 col-form-label">Materia *</label>
  415. <div class="col-8">
  416. <div class="datalist datalist-select mb-1 w-100" id="dlMateria">
  417. <div class="datalist-input">Selecciona una materia</div>
  418. <span class="ing-buscar icono"></span>
  419. <ul style="display:none">
  420. <?php foreach($materias_rs as $mat){ ?>
  421. <li data-id="<?php echo $mat["Horario_id"];?>" data-dia="<?php echo $mat["Dia_id"];?>" data-hr="<?php echo substr($mat["Hora_inicio"], 0, 2);?>" data-min="<?php echo substr($mat["Hora_inicio"], 3, 2);?>">
  422. <?php echo $mat["Materia_desc"].' ('.$mat["Grupo_desc"].' '.$mat["Carrera_prefijo"].') - '.$mat["Dia_desc"]." ".substr($mat["Hora_inicio"], 0, -3);?>
  423. </li>
  424. <?php } ?>
  425. </ul>
  426. <input type="hidden" id="horario" name="horario" value="">
  427. </div>
  428. </div>
  429. </div>
  430. <div class="form-group row">
  431. <label for="tipo" class="col-4 col-form-label">Tipo *</label>
  432. <div class="col-8">
  433. <div class="datalist datalist-select mb-1 w-100" id="dlTipo">
  434. <div class="datalist-input">Reposición</div>
  435. <span class="ing-buscar icono"></span>
  436. <ul style="display:none">
  437. <li data-id="1">Reposición</li>
  438. <li data-id="2">Cambio de salón</li>
  439. </ul>
  440. <input type="hidden" id="tipo" name="tipo" value="1">
  441. </div>
  442. </div>
  443. </div>
  444. <div class="form-group row cambio_block materia-block" style="display: none;">
  445. <label for="fecha_cambio" class="col-4 col-form-label">Fecha de cambio *</label>
  446. <div class="col-8">
  447. <input id="fecha_cambio" name="fecha_cambio" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly="readonly" value="">
  448. </div>
  449. </div>
  450. <div class="form-group row repo_block materia-block">
  451. <label for="fecha_falta" class="col-4 col-form-label">Fecha de falta *</label>
  452. <div class="col-8">
  453. <input id="fecha_falta" name="fecha_falta" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly="readonly" value="">
  454. </div>
  455. </div>
  456. <div class="form-group row repo_block materia-block">
  457. <label for="fecha_inicial" class="col-4 col-form-label">Fecha de reposicion *</label>
  458. <div class="col-8">
  459. <input id="fecha_inicial" name="fecha_inicial" type="text" class="form-control date-picker-future" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly="readonly" value="">
  460. <small class="form-text text-muted">Las reposiciones se deben solicitar con al menos 72hrs de anticipación.<br>
  461. Si repones en sábado, consulta los horarios con tu jefe de carrera.
  462. </small>
  463. </div>
  464. </div>
  465. <div class="form-group row materia-block">
  466. <label for="hora_ini" class="col-4 col-form-label" id="hora_nombre">Hora reposición *</label>
  467. <?php $default_h = 7; $default_m = 15;?>
  468. <div class="col-4">
  469. <select name="hora_ini" id="hora_ini" class="form-control" required="required">
  470. <?php for($h = $default_h; $h < HORA_FINAL; $h++){?>
  471. <option value="<?php echo sprintf( '%02d', $h );?>" <?php if($default_h == $h){ echo 'selected="selected"';}?>><?php echo sprintf( '%02d', $h );?></option>
  472. <?php } ?>
  473. </select>
  474. </div>
  475. <div class="col-4">
  476. <select name="min_ini" id="min_ini" class="form-control" required="required">
  477. <?php for($m = 0; $m < 60; $m+=(60/FRACCION_HORA)){?>
  478. <option value="<?php echo sprintf( '%02d', $m );?>" <?php if($default_m == $m){ echo 'selected="selected"';}?>><?php echo sprintf( '%02d', $m );?></option>
  479. <?php } ?>
  480. </select>
  481. </div>
  482. </div>
  483. <div class="form-group row materia-block">
  484. <label for="salon" class="col-4 col-form-label">Alumnos aproximados *</label>
  485. <div class="col-8 col-md-4">
  486. <input type="number" name="alumnos" id="alumnos" class="form-control" value="1" min="1" max="50">
  487. </div>
  488. </div>
  489. <div class="form-group row materia-block">
  490. <label for="aula" class="col-4 col-form-label">Tipo aula *</label>
  491. <div class="col-8">
  492. <div class="datalist datalist-select mb-1 w-100" id="dlAula">
  493. <div class="datalist-input">Salón</div>
  494. <span class="ing-buscar icono"></span>
  495. <ul style="display:none">
  496. <li data-id="1">Salón</li>
  497. <li data-id="2">Sala de cómputo</li>
  498. <li data-id="3">Talleres y laboratorios</li>
  499. </ul>
  500. <input type="hidden" id="aula" name="aula" value="1">
  501. </div>
  502. </div>
  503. </div>
  504. </div>
  505. <div class="form-box form-box-info materia-block">
  506. <div class="form-group row">
  507. <label for="comentario" class="col-4 col-form-label">Comentarios</label>
  508. <div class="col-8">
  509. <p><i>Requerimientos específicos del salón, software especializado, etc.</i></p>
  510. <textarea rows="3" class="form-control" id="comentario" name="comentario"></textarea>
  511. </div>
  512. </div>
  513. </div>
  514. <div class="form-group row mt-3">
  515. <div class="offset-4 col-8">
  516. <button type="submit" class="btn btn-outline-primary materia-block" id="submitBtn" data-tipo="1"><?php echo $ICO["aceptar"];?> Guardar</button>
  517. <button type="reset" class="btn btn-outline-danger" data-dismiss="modal"><?php echo $ICO["cancelar"];?> Cancelar</button>
  518. </div>
  519. </div>
  520. </form>
  521. </div>
  522. </div>
  523. </div>
  524. </div>
  525. <div class="modal fade" id="modal_confirm" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true">
  526. <div class="modal-dialog modal-dialog-centered" role="document">
  527. <div class="modal-content">
  528. <div class="modal-body">
  529. <div class="row">
  530. <div class="col">
  531. <p class="font-weight-bold">¿Estás seguro de que quieres borrar la reposición?</p>
  532. <p>Esta acción no se puede deshacer.</p>
  533. </div>
  534. </div>
  535. </div>
  536. <div class="modal-footer">
  537. <input type="hidden" id="id_borrar" value="">
  538. <input type="hidden" id="id_cronos_borrar" value="">
  539. <button type="button" class="btn btn-outline-primary btn-borrar"><?php echo $ICO["aceptar"];?> Borrar</button>
  540. <button type="button" class="btn btn-outline-danger" data-dismiss="modal" aria-label="Close"><?php echo $ICO["cancelar"];?> Cancelar</button>
  541. </div>
  542. </div>
  543. </div>
  544. </div>
  545. <?php } ?>
  546. </div>
  547. <script src="../js/jquery.min.js"></script>
  548. <script src="../js/jquery-ui.js"></script>
  549. <script src="../js/datepicker-es.js"></script>
  550. <script src="../js/bootstrap/popper.min.js"></script>
  551. <script src="../js/bootstrap/bootstrap.min.js"></script>
  552. <script src="../js/fechas.js"></script>
  553. <script src="../js/sidebarmenu.js"></script>
  554. <script src="../js/datalist.js"></script>
  555. <script>
  556. setDatalist("#periodo", <?php echo $_SESSION["periodo_id"]; ?>);
  557. $(document).on('click', '#dlPeriodo ul li' ,function(){
  558. $("#formaPeriodo").submit();
  559. });
  560. </script>
  561. <script>
  562. $(document).on( "click", ".btn-reset", function(event){
  563. var forma = $(this).parents("form");
  564. forma.find("input[type=text]").val("");
  565. forma.find("select").prop("selectedIndex",0);
  566. forma.submit();
  567. });
  568. </script>
  569. <?php if($objSesion->puedeEditar()){
  570. if(strtotime($periodo_rs["Periodo_fecha_inicial"])>strtotime(date("Y-m-d")) )
  571. $fecha_man = fechaSlash($periodo_rs["Periodo_fecha_inicial"]);
  572. else{
  573. $dias = 3;
  574. if( intval(date("w")) >=3 && intval(date("w"))<=5 )//Mie a Vie
  575. $dias+=3;
  576. else if( intval(date("w")) ==6 )//Sab
  577. $dias+=2;
  578. else if( intval(date("w")) ==0 )//Do
  579. $dias+=1;
  580. $fecha_man = date("d/m/Y", strtotime("+".$dias." day"));
  581. }
  582. ?>
  583. <script>
  584. var vacaciones=[
  585. <?php foreach($vacacionesArr as $v){ echo '"'.$v["fecha"].'",';} ?>
  586. ];
  587. var _dias_asistencia = [];//ya registró asistencia, cambia con ajax
  588. var _dia_valido = 0;
  589. var _fecha_manhana = "<?php echo $fecha_man; ?>";
  590. var _periodo_fecha_inicial = "<?php echo fechaSlash($periodo_rs["Periodo_fecha_inicial"]); ?>";
  591. var _periodo_fecha_final = "<?php echo fechaSlash($periodo_rs["Periodo_fecha_final"]); ?>";
  592. var datepickerOptions_filtro = { dateFormat: "dd/mm/yy", minDate:_periodo_fecha_inicial, maxDate:_periodo_fecha_final};
  593. var datepickerOptions = { dateFormat: "dd/mm/yy", minDate:_periodo_fecha_inicial, maxDate:_periodo_fecha_final,
  594. beforeShowDay: function(date) {
  595. var day = date.getDay();
  596. var dateString = $.datepicker.formatDate("yy-mm-dd", date);
  597. if (day === _dia_valido) {// 0 representa el domingo
  598. if (vacaciones.indexOf(dateString) !== -1 || _dias_asistencia.indexOf(dateString) !== -1)
  599. return [false];
  600. else
  601. return [true];
  602. }else{
  603. return [false];
  604. }
  605. }
  606. };
  607. var datepickerOptions_future = { dateFormat: "dd/mm/yy", minDate:_fecha_manhana, maxDate:_periodo_fecha_final,
  608. beforeShowDay: function(date) {
  609. var day = date.getDay();
  610. var dateString = $.datepicker.formatDate("yy-mm-dd", date);
  611. if (day === 0) {// 0 representa el domingo
  612. return [false];
  613. } else {
  614. if (vacaciones.indexOf(dateString) !== -1) {
  615. return [false];
  616. } else {
  617. return [true];
  618. }
  619. }
  620. }
  621. };
  622. function submitForm(){
  623. var myBtn = $('#submitBtn');
  624. var error = false;
  625. $("#gpo").removeClass("is-invalid");
  626. invalidDatalist("#materia", false);
  627. $("#fecha_inicial").removeClass("is-invalid");
  628. $("#fecha_falta").removeClass("is-invalid");
  629. $("#fecha_cambio").removeClass("is-invalid");
  630. if($("#tipo").val() == 1){//reposición
  631. if($("#fecha_falta").val() == ""){
  632. $("#fecha_falta").addClass("is-invalid");
  633. error = true;
  634. }
  635. if($("#fecha_inicial").val() == ""){//fecha reposición
  636. $("#fecha_inicial").addClass("is-invalid");
  637. error = true;
  638. }
  639. }else{
  640. if($("#fecha_cambio").val() == ""){
  641. $("#fecha_cambio").addClass("is-invalid");
  642. error = true;
  643. }
  644. }
  645. if($("#horario").val().trim() == "" || $("#horario").val() === null){
  646. invalidDatalist("#horario", true);
  647. error = true;
  648. }
  649. if(myBtn.data("tipo") == 2 ){
  650. $('#formaModal').prop("action", "./action/reposicion_update.php");
  651. }else{
  652. $('#formaModal').prop("action", "./action/reposicion_insert.php");
  653. }
  654. return !error;
  655. }
  656. function cambiaTipo(tipo){
  657. if (tipo == 1){//reposición
  658. $(".repo_block").show();
  659. $(".cambio_block").hide();
  660. $(".repo_block").find("input[type=text]").attr("required", true);
  661. $(".cambio_block").find("input[type=text]").removeAttr("required");
  662. $("#hora_nombre").text("Hora reposición *");
  663. }else{//Cambio de salón
  664. $(".repo_block").hide();
  665. $(".cambio_block").show();
  666. $(".repo_block").find("input[type=text]").removeAttr("required");
  667. $(".cambio_block").find("input[type=text]").attr("required", true);
  668. $("#hora_nombre").text("Hora cambio *");
  669. var hora = $("#dlMateria ul li.selected").data("hr");
  670. var min = $("#dlMateria ul li.selected").data("min");
  671. $("#hora_ini").val(hora)
  672. $("#min_ini").val(min)
  673. }
  674. }
  675. $(document).ready(function(){
  676. //fecha de clase
  677. $(".date-picker" ).datepicker(datepickerOptions);
  678. $(".date-picker" ).datepicker( $.datepicker.regional[ "es" ] );
  679. //fecha de clase
  680. $(".date-picker-filtro" ).datepicker(datepickerOptions_filtro);
  681. $(".date-picker-filtro" ).datepicker( $.datepicker.regional[ "es" ] );
  682. //fecha nueva
  683. $(".date-picker-future" ).datepicker(datepickerOptions_future);
  684. $(".date-picker-future" ).datepicker( $.datepicker.regional[ "es" ] );
  685. <?php if($_SESSION["jefe_carrera"] || $_SESSION["sgi_administrador"]){ ?>
  686. function creaOpcion(id_lista, nombre, gpo, dia, hora){
  687. return '<li data-id="'+id_lista+'" >'+nombre+' ('+gpo+') - '+dia+' '+hora.substr(0, 5)+'</li>';
  688. }
  689. $("#dlProfesor ul li").click(function(){//cambia datalist
  690. var pid = $(this).data('id');
  691. //busca materias del profesor
  692. $.ajax({
  693. url: './action/materiasdiaprofesor_select.php',
  694. type: 'POST',
  695. dataType: 'json',
  696. data: { id: pid, },
  697. success: function(result) {
  698. if(result["error"]!= "" && result["error"] !== undefined){
  699. $("#errorBox").collapse('show');
  700. $("#errorBox_text").html(result["error"]);
  701. $('#modal').modal("hide");
  702. }else{
  703. $("#dlMateria ul").html("");
  704. for(i=0; i<result["materias"].length; i++){
  705. var html = creaOpcion(result["materias"][i]["Horario_id"],
  706. result["materias"][i]["Materia_desc"],
  707. result["materias"][i]["Grupo_desc"]+" "+result["materias"][i]["Carrera_prefijo"],
  708. result["materias"][i]["Dia_desc"],
  709. result["materias"][i]["Hora_inicio"]
  710. );
  711. $("#dlMateria ul").append(html);
  712. }
  713. setDatalistFirst("#horario");
  714. }
  715. $('#messageBox')[0].scrollIntoView({ block: "end" });
  716. },
  717. error: function(jqXHR, textStatus, errorThrown ){
  718. $('#modal').modal("hide");
  719. $("#errorBox").collapse('show');
  720. $("#errorBox_text").html(errorThrown);
  721. $('#messageBox')[0].scrollIntoView({ block: "end" });
  722. }
  723. });//ajax
  724. });
  725. <?php } ?>
  726. //Actualiza días elegibles de calendario
  727. $("#dlMateria ul li").click(function(){//cambia datalist
  728. _dia_valido = $(this).data('dia');
  729. var prof = $("#prof").length > 0 ? $("#prof").val() : "";
  730. $.ajax({
  731. url: './action/asistenciasprofesor_select.php',
  732. type: 'POST',
  733. dataType: 'json',
  734. data: { "id": prof, "hor": $(this).data("id") },
  735. success: function(result) {
  736. if(result["error"]!= "" && result["error"] !== undefined){
  737. $("#errorBox").collapse('show');
  738. $("#errorBox_text").html(result["error"]);
  739. $('#modal').modal("hide");
  740. $('#messageBox')[0].scrollIntoView({ block: "end" });
  741. }else{
  742. _dias_asistencia = result["asistenciaArr"];
  743. }
  744. },
  745. error: function(jqXHR, textStatus, errorThrown ){
  746. $('#modal').modal("hide");
  747. $("#errorBox").collapse('show');
  748. $("#errorBox_text").html(errorThrown);
  749. $('#messageBox')[0].scrollIntoView({ block: "end" });
  750. }
  751. });//ajax
  752. $(".date-picker" ).datepicker(datepickerOptions);
  753. var hora = $(this).data("hr");
  754. var min = $(this).data("min");
  755. $("#hora_ini").val(hora)
  756. $("#min_ini").val(min)
  757. });
  758. $("#dlTipo ul li").click(function(){//cambia datalist
  759. cambiaTipo($(this).data('id'));
  760. $(".date-picker" ).datepicker(datepickerOptions);
  761. });
  762. $('#modal_confirm').on('show.bs.modal', function (event) {
  763. var button = $(event.relatedTarget); // Button that triggered the modal
  764. var id = button.parents("tr").data("id");
  765. var id_cronos = button.parents("tr").data("id_cronos");
  766. $("#id_borrar").val(id);
  767. $("#id_cronos_borrar").val(id_cronos);
  768. });
  769. $(".btn-borrar").click(function(){
  770. var id = $("#id_borrar").val();
  771. var cid = $("#id_cronos_borrar").val();
  772. $.ajax({
  773. url: './action/reposicion_delete.php',
  774. type: 'POST',
  775. dataType: 'json',
  776. data: { id: id, id_cronos:cid},
  777. success: function(result) {
  778. if(result["error"]!= "" && result["error"] !== undefined){
  779. $("#errorBox").collapse('show');
  780. $("#errorBox_text").html(result["error"]);
  781. }else{
  782. $("#successBox").collapse('show');
  783. $("#successBox_text").html(result["ok"]);
  784. $("#id"+id).remove();
  785. }
  786. $('#messageBox')[0].scrollIntoView({ block: "end" });
  787. },
  788. error: function(jqXHR, textStatus, errorThrown ){
  789. $("#errorBox").collapse('show');
  790. $("#errorBox_text").html(errorThrown);
  791. $('#messageBox')[0].scrollIntoView({ block: "end" });
  792. }
  793. });//ajax
  794. $('#modal_confirm').modal("hide");
  795. });
  796. $('.abrir-modal').click(function(){
  797. var button = $(this); // Button that triggered the modal
  798. var tipo = button.data('tipo'); // 1 alta, 2 edicion
  799. var modal = $('#modal');
  800. $("#modal .is-invalid").removeClass("is-invalid");
  801. //$(this).find(".form-control:first-child").focus();
  802. $("#errorBox").collapse('hide');
  803. $("#errorBox_text").html("");
  804. if(tipo == 1){//alta
  805. $("#id_cronos").val(0);
  806. $("#submitBtn").data('tipo', 1);
  807. $("#modalLabel").html("Crear Reposición");
  808. modal.find("input[type=text]").val("");
  809. modal.find("#alumnos").val("15");
  810. $("#plan").attr("readonly", false);
  811. $("#sem").attr("readonly", false);
  812. $("#gpo").attr("readonly", false);
  813. //$("#materia").attr("readonly", false);
  814. $("#prof").attr("readonly", false);
  815. disableDatalist("#horario", false);
  816. disableDatalist("#tipo", false);
  817. if($("#prof").length>0)
  818. disableDatalist("#prof", false);
  819. setDatalistFirst("#tipo");
  820. setDatalistFirst("#aula");
  821. setDatalistFirst("#horario");
  822. $("#dlMateria ul li:first").click();
  823. //$(".materia-block").addClass("d-none");
  824. modal.modal('show');
  825. }else{//editar
  826. $("#submitBtn").data('tipo', 2);
  827. $("#modalLabel").html("Editar Reposición");
  828. $("#plan").attr("readonly", true);
  829. $("#sem").attr("readonly", true);
  830. $("#gpo").attr("readonly", true);
  831. //$("#materia").attr("readonly", true);
  832. disableDatalist("#horario");
  833. disableDatalist("#tipo");
  834. if($("#prof").length>0)
  835. disableDatalist("#prof");
  836. $("#prof").attr("readonly", true);
  837. var cid = $(button).parents("tr").data("id");
  838. $("#id").val(cid);
  839. $.ajax({
  840. url: './action/reposicion_select.php',
  841. type: 'POST',
  842. dataType: 'json',
  843. data: { id: cid },
  844. success: function(result) {
  845. if(result["error"]!= "" && result["error"] !== undefined){
  846. modal.modal('hide');
  847. $("#errorBox").collapse('show');
  848. $("#errorBox_text").html(result["error"]);
  849. $('#messageBox')[0].scrollIntoView({ block: "end" });
  850. }else{
  851. setDatalist("#prof", result["profesor"]);
  852. $("#id_cronos").val(result["id_cronos"]);
  853. $('#salon').val(result["salon"]);
  854. $("#fecha_falta").val(result["fecha_falta"]);
  855. $('#hora_ini').val(result["hora_ini"]);
  856. $('#min_ini').val(result["min_ini"]);
  857. $('#comentario').val(result["comentario"]);
  858. $('#alumnos').val(result["alumnos"]);
  859. setDatalist("#horario", result["horario"]);
  860. setDatalist("#profesor", result["profesor"]);
  861. if(result["tipo"]){
  862. setDatalist("#tipo", 1);
  863. cambiaTipo(1);
  864. $("#fecha_inicial").val(result["fecha_inicial"]);
  865. }else{
  866. setDatalist("#tipo", 2);
  867. cambiaTipo(2);
  868. $("#fecha_cambio").val(result["fecha_inicial"]);
  869. }
  870. _dia_valido = parseInt(result["dia"]);
  871. $(".date-picker" ).datepicker(datepickerOptions);
  872. $("#dlTipo ul li:selected").click();
  873. setDatalist("#aula", result["aula"]);
  874. modal.modal('show');
  875. }
  876. },
  877. error: function(jqXHR, textStatus, errorThrown ){
  878. modal.modal('hide');
  879. $("#errorBox").collapse('show');
  880. $("#errorBox_text").html(errorThrown);
  881. $('#messageBox')[0].scrollIntoView({ block: "end" });
  882. }
  883. });//ajax
  884. }
  885. });//show
  886. });
  887. </script>
  888. <?php } ?>
  889. </body>
  890. </html>