horariogrupo.php 61 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942
  1. <?php
  2. require_once("../include/nocache.php");
  3. require_once("../include/constantes.php");
  4. require_once("../include/util.php");
  5. require_once("../include/bd_pdo.php");
  6. require_once("../classes/ValidaSesion.php");
  7. require_once("../classes/MainMenu.php");
  8. $menu = 5;
  9. $submenu = 51;
  10. //--- Objeto para validar usuario. El id de usuario lo lee desde sesión
  11. $objSesion = new ValidaSesion($pdo, $submenu, APSA);
  12. if(!$objSesion->tieneAcceso()){
  13. $objSesion->terminaSesion();
  14. }
  15. $objSesion->validaPeriodoUsuario();//si no tiene periodo manda a main
  16. if(!$objSesion->puedeEditar()){
  17. $errorDesc = "No puedes editar el horario.";
  18. }
  19. //Revalida permisos de jefes de carreras
  20. $stmt = $pdo->prepare('Select * from fs_usuario(:id)');
  21. $stmt->bindParam(":id", $_SESSION["usuario_id"]);
  22. if(!$stmt->execute()){
  23. //print_r($stmt->errorInfo());
  24. header("Location: ../index.php?error=2");
  25. exit();
  26. }
  27. $rs = $stmt->fetch();//Devuelve sólo 1 resultado
  28. $_SESSION["jefe_carrera"] = $rs["es_JefeCarrera"];
  29. $rs = null;
  30. unset($rs);
  31. //Obtiene grupos del periodo
  32. $stmt = $pdo->prepare('Select * from fs_grupo(NULL, :periodo) WHERE "Grupo_copia" IS NULL');
  33. $stmt->bindParam(":periodo", $_SESSION["periodo_id"]);
  34. if(!$stmt->execute()){
  35. header("Location: grupos.php?error=4");
  36. exit();
  37. }else{
  38. $grupos_rs = $stmt->fetchAll();
  39. }
  40. $stmt->closeCursor();
  41. if(!is_array($grupos_rs) || count($grupos_rs) == 0){
  42. header("Location: grupos.php?error=5");
  43. exit();
  44. }
  45. if(isset($_POST["grupo"]) && is_numeric($_POST["grupo"]) && $_POST["grupo"] != ""){
  46. $filter_grupo = filter_input(INPUT_POST, "grupo", FILTER_SANITIZE_NUMBER_INT);//limpia texto
  47. $stmt = $pdo->prepare('Select * from fs_grupo(:grupo, :periodo)');
  48. $stmt->bindParam(":periodo", $_SESSION["periodo_id"]);
  49. $stmt->bindParam(":grupo", $filter_grupo);
  50. if(!$stmt->execute()){
  51. $errorDesc = "Ocurrió un error al cargar el grupo.";
  52. }else{
  53. $grupo_actual_rs = $stmt->fetch();
  54. if(!is_array($grupo_actual_rs) || count($grupo_actual_rs) == 0){
  55. $stmt->closeCursor();
  56. header("Location: grupos.php?error=6");
  57. exit();
  58. }
  59. }
  60. $stmt->closeCursor();
  61. //Obtiene materias del grupo
  62. if(!$_SESSION["sgi_administrador"]){
  63. $stmt = $pdo->prepare('Select * from fs_materiagrupo(:plan, :sem, :usr)');
  64. $stmt->bindParam(":usr", $_SESSION["usuario_id"]);
  65. }else{
  66. $stmt = $pdo->prepare('Select * from fs_materiagrupo(:plan, :sem, NULL)');
  67. }
  68. $stmt->bindParam(":plan", $grupo_actual_rs["PlanEstudio_id"]);
  69. $stmt->bindParam(":sem", $grupo_actual_rs["Grupo_semestre"]);
  70. if(!$stmt->execute()){
  71. //header("Location: materias.php?error=2");
  72. $errorDesc = "Error al cargar materias";
  73. //print_r($stmt->errorInfo());
  74. //exit();
  75. }else
  76. $materias_rs = $stmt->fetchAll();
  77. $stmt->closeCursor();
  78. if(!isset($materias_rs) || count($materias_rs) == 0){
  79. $errorDesc = "No tienes materias asignadas. No puedes editar ni crear materias para el grupo.";
  80. }
  81. //Obtiene profesores posibles del grupo
  82. $stmt = $pdo->prepare('Select * from fs_profesores() WHERE "Disponibilidad" = true');
  83. if(!$stmt->execute()){
  84. //header("Location: materias.php?error=2");
  85. $errorDesc = "Error al cargar profesores del grupo";
  86. print_r($stmt->errorInfo());
  87. exit();
  88. }else
  89. $prof_gpo_rs = $stmt->fetchAll();
  90. $stmt->closeCursor();
  91. }
  92. function enBloqueClase($pdo, $hora, $frac, $nivel){
  93. $stmt = $pdo->prepare('Select * from fs_horaclase(:nivel, NULL)');
  94. $stmt->bindParam(":nivel", $nivel);
  95. $stmt->execute();
  96. $bloque_rs = $stmt->fetchAll();
  97. $horaFracc = $hora .":". (60/FRACCION_HORA*$frac).":00";
  98. foreach($bloque_rs as $bloque){
  99. if(strtotime($horaFracc) >= strtotime($bloque["HoraClase_inicio"]) && strtotime($horaFracc) < strtotime($bloque["HoraClase_final"]))
  100. return "fraccion-sugerida";
  101. }
  102. return "";
  103. }
  104. ?>
  105. <!DOCTYPE html>
  106. <html lang="es" prefix="og: http://ogp.me/ns#">
  107. <head>
  108. <title>APSA - Facultad de Ingeniería</title>
  109. <meta charset="utf-8">
  110. <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  111. <link rel="icon" type="image/png" href="../img/favicon.png" />
  112. <link rel="stylesheet" href="../css/bootstrap-ulsa.min.css" type="text/css">
  113. <link rel="stylesheet" href="../css/indivisa.css" type="text/css">
  114. <link rel="stylesheet" href="../css/sgi.css?rand=<?php echo rand();?>" type="text/css">
  115. <link rel="stylesheet" href="../css/fa_all.css" type="text/css">
  116. <link rel="stylesheet" href="../css/jquery-ui.css" type="text/css">
  117. <link rel="stylesheet" href="../css/calendar.css" type="text/css">
  118. <link rel="stylesheet" href="./css/horario.css?rand=<?php echo rand();?>" type="text/css">
  119. <script src="../js/util.js"></script>
  120. </head>
  121. <body>
  122. <div>
  123. <?php
  124. //--- Objeto que pinta menu
  125. $menuObj = new MainMenu($_SESSION["usuario_id"], $menu, $pdo, APSA, "Horarios &raquo; ".$_SESSION["periodo_desc"]);//usr, menu, pdo, sist
  126. $menuObj->printMenu();
  127. //Obtiene fechas de periodo
  128. $stmt = $pdo->prepare('Select * from fs_periodo(:periodo, NULL, NULL, true)');
  129. $stmt->bindParam(":periodo", $_SESSION["periodo_id"]);
  130. if(!$stmt->execute()){
  131. //print_r($stmt->errorInfo());
  132. $errorDesc = "Ocurrió un error al cargar las fechas del periodo";
  133. }else{
  134. $periodo_rs = $stmt->fetch();
  135. }
  136. $stmt->closeCursor();
  137. $stmt = null;
  138. //--Manejo de errores y mensajes de exito
  139. if(isset($_GET["error"]) && is_numeric($_GET["error"])){
  140. switch ($_GET["error"]){
  141. case 0: $errorDesc = "No se reciberon los datos del grupo."; break;
  142. case 1: $errorDesc = "Ocurrió un error al insertar los datos del grupo."; break;
  143. case 2: $errorDesc = "Ocurrió un error al actualizar los datos del grupo."; break;
  144. case 3: $errorDesc = "No tienes permisos para realizar esa acción."; break;
  145. }
  146. }
  147. if(isset($_GET["ok"]) && is_numeric($_GET["ok"])){
  148. switch ($_GET["ok"]){
  149. case 0: $successDesc = "El grupo se guardó correctamente."; break;
  150. case 1: $successDesc = "El grupo se actualizó correctamente."; break;
  151. }
  152. }
  153. ?>
  154. <main class="container-fluid marco pt-3">
  155. <?php
  156. $objSesion2 = new ValidaSesion($pdo, 272, APSA);
  157. if($objSesion2->tieneAcceso()){
  158. ?>
  159. <div class="row">
  160. <div class="col-sm-12 text-right">
  161. <form action="reporte_horariogrupo.php" method="post">
  162. <input type="hidden" name="grupo" value="<?php echo $filter_grupo;?>">
  163. <p><button type="submit" class="btn btn-outline-secondary"><?php echo $ICO["buscar"];?> Consulta de horario</button></p>
  164. </form>
  165. </div>
  166. </div>
  167. <?php } ?>
  168. <?php include_once("../include/errorMessage.php"); ?>
  169. <?php include("../include/periodoCambio.php");?>
  170. <!-- Filtro -->
  171. <div class="row">
  172. <div class="col-12">
  173. <form action="horariogrupo.php" method="post">
  174. <div class="form-box form-box-info">
  175. <div class="form-group row">
  176. <label for="filter_grupo" class="col-4 col-form-label">Grupo</label>
  177. <div class="col-8 col-sm-4">
  178. <!--<select id="filter_grupo" name="grupo" class="form-control">
  179. <option value="">Selecciona un grupo</option>
  180. <?php foreach($grupos_rs as $grupo) {
  181. $nombre = "";
  182. //if($_SESSION["nivel_id"] == 1)
  183. $nombre = $grupo["Grupo_desc"]." ".$grupo["Carrera_prefijo"];
  184. /*else
  185. $nombre = $grupo["Grupo_desc"];*/
  186. ?>
  187. <option value="<?php echo $grupo["Grupo_id"];?>" <?php if(isset($filter_grupo) && $filter_grupo == $grupo["Grupo_id"]){echo "selected='selected'";}?> ><?php echo $nombre;?></option>
  188. <?php } ?>
  189. </select>-->
  190. <div class="datalist datalist-select mb-1 w-100">
  191. <div class="datalist-input">Selecciona un grupo</div>
  192. <span class="ing-buscar icono"></span>
  193. <ul style="display:none">
  194. <?php foreach($grupos_rs as $grupo) {
  195. $nombre = "";
  196. $nombre = $grupo["Grupo_desc"]." ".$grupo["Carrera_prefijo"];
  197. ?>
  198. <li data-id="<?php echo $grupo["Grupo_id"];?>" <?php if(isset($filter_grupo) && $filter_grupo == $grupo["Grupo_id"]){echo "class='selected'";}?> ><?php echo $nombre;?></li>
  199. <?php }?>
  200. </ul>
  201. <input type="hidden" id="filter_grupo" name="grupo" value="">
  202. </div>
  203. </div>
  204. </div>
  205. </div>
  206. <div class="form-group row">
  207. <div class="col-12 text-center">
  208. <button type="button" class="btn btn-outline-primary" id="cambia-grupo"><?php echo $ICO["buscar"]; ?> Ver horario</button>
  209. </div>
  210. </div>
  211. </form>
  212. </div>
  213. </div>
  214. <?php
  215. if(isset($grupo_actual_rs) && isset($materias_rs) ){//Si existe grupo seleccionado carga horario
  216. ?>
  217. <h3 class="mb-3">Grupo <?php echo $grupo_actual_rs["Grupo_desc"]." ".$grupo_actual_rs["Carrera_prefijo"];?></h3>
  218. <?php
  219. $stmt = $pdo->prepare('Select * from fs_dia(NULL)');
  220. if(!$stmt->execute()){
  221. echo "Error al obtener los días";
  222. print_r($stmt->errorInfo());
  223. }
  224. $dias_rs = $stmt->fetchAll();
  225. $stmt->closeCursor();
  226. $stmt = $pdo->prepare('Select * from fs_salon(NULL, NULL, 0, NULL)');
  227. if(!$stmt->execute()){
  228. echo "Error al obtener los salones";
  229. print_r($stmt->errorInfo());
  230. }
  231. $salones_rs = $stmt->fetchAll();
  232. $stmt->closeCursor();
  233. $stmt = null;
  234. /* Definidas en constantes.php
  235. HORA_INICIO = 7;
  236. HORA_FINAL = 22;
  237. FRACCION_HORA = 4;*/
  238. ?>
  239. <div class="row mb-4">
  240. <div class="col-md-6 offset-md-0 col-11 offset-1">
  241. <p class="alert-heading font-weight-bold alert alert-info my-0">
  242. <a class="d-block collapsed" data-toggle="collapse" href="#materiasBox" role="button" aria-expanded="false" aria-controls="materiasBox">
  243. <i class="ing-caret ing-fw float-right"></i> Materias por asignar</a>
  244. </p>
  245. <div class="col-12 collapse alert alert-info expanded-over" id="materiasBox">
  246. <ul class="list-group">
  247. <?php foreach($materias_rs as $materia){?>
  248. <li class="list-group-item d-flex justify-content-between align-items-center text-80">
  249. <span class="d-inline-block text-truncate"><?php echo $materia["Materia_desc"];?></span>
  250. <span class="badge badge-info badge-pill"><span id="horas-materia-<?php echo $materia["Materia_id"]; ?>" data-max="<?php echo $materia["Materia_horasClase"]+$materia["Materia_horasLab"]; ?>">0</span> / <?php echo $materia["Materia_horasClase"]+$materia["Materia_horasLab"]; ?> hrs</span>
  251. </li>
  252. <?php } ?>
  253. </ul>
  254. </div>
  255. </div>
  256. <div class="w-100 d-block d-sm-block d-md-none"></div>
  257. <div class="col-md-5 offset-md-1 col-11 offset-1">
  258. <p class="alert-heading font-weight-bold alert alert-info my-0">
  259. <a class="d-block collapsed" data-toggle="collapse" href="#fechasBox" role="button" aria-expanded="false" aria-controls="fechasBox">
  260. <i class="ing-caret ing-fw float-right"></i> Filtro por fecha</a>
  261. </p>
  262. <div class="col-12 collapse alert alert-info expanded-over" id="fechasBox">
  263. <div class="form-row mb-2">
  264. <div class="col-12">
  265. <form class="form-inline">
  266. <label for="filter_fecha" class="my-1 mr-2">Ver horario para fecha</label>
  267. <input type="text" id="filter_fecha" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" size="10" readonly="readonly">
  268. <div class="input-group-append">
  269. <button class="btn btn-primary" type="reset"><?php echo $ICO['borrar']; ?></button>
  270. </div>
  271. <button type="button" class="btn btn-outline-primary ml-1 btn_filter_fecha">Filtrar</button>
  272. </form>
  273. </div>
  274. <small id="passwordHelpBlock" class="form-text text-muted">
  275. <em><?php echo $ICO['alerta']; ?> Se ocultarán las materias que no estén activas en esa fecha.</em>
  276. </small>
  277. </div>
  278. </div>
  279. </div>
  280. </div>
  281. <?php
  282. $objSesion2 = new ValidaSesion($pdo, 55, APSA);
  283. if($objSesion2->tieneAcceso()){
  284. ?>
  285. <div class="row">
  286. <div class="col-sm-12">
  287. <form action="reporte_horarioprofesores.php" method="post" target="_blank">
  288. <input type="hidden" name="tipo" value="2">
  289. <p>
  290. <button type="submit" class="btn btn-outline-secondary btn-sm"><?php echo $ICO["buscar"];?> Horario profesores</button>
  291. </p>
  292. </form>
  293. </div>
  294. </div>
  295. <?php } ?>
  296. </main>
  297. <div class="container-fluid content marco-wide">
  298. <ul class="nav nav-tabs" id="myTab" role="tablist">
  299. <li class="nav-item">
  300. <a class="nav-link active" id="tab1-tab" data-toggle="tab" href="#tab1" role="tab" aria-controls="calendario" aria-selected="true">Calendario</a>
  301. </li>
  302. <li class="nav-item">
  303. <a class="nav-link" id="tab2-tab" data-toggle="tab" href="#tab2" role="tab" aria-controls="lista" aria-selected="false">Lista</a>
  304. </li>
  305. <li class="nav-item">
  306. <a class="nav-link" id="tab3-tab" data-toggle="tab" href="#tab3" role="tab" aria-controls="lista" aria-selected="false">Disponibilidad de profesores</a>
  307. </li>
  308. </ul>
  309. <div class="tab-content" id="horariosTabContent">
  310. <div class="tab-pane fade show active" id="tab1" role="tabpanel" aria-labelledby="tab1-tab">
  311. <form action="horariogrupo.php" method="post">
  312. <input type="hidden" name="grupo" value="<?php echo $filter_grupo?>">
  313. <div class="mt-2 mb-2">
  314. <p><em>Haz clic en el calendario para asignar una materia.</em></p>
  315. <p><em>Las materias marcadas con <span class="alerta"><?php echo $ICO["alerta"];?></span> necesitan datos.</em>
  316. <div class="row justify-content-md-center">
  317. <div class="col-md-auto">
  318. <table class="table table-sm table-responsive table-borderless table-striped calendario" id="tabla-horario" data-hora-inicio="<?php echo HORA_INICIO;?>" data-fracciones = "<?php echo FRACCION_HORA; ?>">
  319. <thead class="thead-dark">
  320. <tr>
  321. <th>Hora</th>
  322. <?php foreach($dias_rs as $dia){
  323. echo "<th data='dia_".$dia["Dia_id"]."'>".$dia["Dia_desc"]."</th>";
  324. } ?>
  325. </tr>
  326. </thead>
  327. <tbody id="calendario-body">
  328. <?php
  329. $biccell = false;
  330. for($h = HORA_INICIO, $i=0; $h < HORA_FINAL; $h++, $i++){?>
  331. <tr>
  332. <td data-hora="<?php echo $h;?>" data-index="<?php echo $i;?>" class="hora" ><?php echo $h;?>:00 </td>
  333. <?php
  334. if(!$biccell){
  335. $biccell = true;
  336. ?>
  337. <td colspan='<?php echo count($dias_rs); ?>' rowspan='<?php echo (HORA_FINAL-HORA_INICIO); ?>'>
  338. <div class='area-horario'>
  339. <table class="table table-borderless">
  340. <tbody>
  341. <?php
  342. for($h2 = HORA_INICIO; $h2 < HORA_FINAL; $h2++){
  343. for($f = 0; $f < FRACCION_HORA; $f++){
  344. echo "<tr class='dia'>";
  345. foreach($dias_rs as $dia){
  346. //echo "$h2, $f => ".enBloqueClase($h2, $f);
  347. $editable = "";
  348. if($objSesion->puedeEditar() && $objSesion->fechaJefes()) $editable = "editable";;
  349. echo "<td title='".$h2.":".sprintf("%02d", ($f*(60/FRACCION_HORA)))."' data-dia='".$dia["Dia_id"]."' data-hora='".$h2."' data-fraccion='".($f*(60/FRACCION_HORA))."' class='crea-horario fraccion ".$editable." ".enBloqueClase($pdo, $h2, $f, $_SESSION["nivel_id"])."'></td>";
  350. }
  351. echo "</tr>";
  352. }
  353. }
  354. ?>
  355. </tbody>
  356. </table>
  357. <div id="bloque-horarios"></div>
  358. </div>
  359. </td>
  360. <?php
  361. } ?>
  362. </tr>
  363. <?php } ?>
  364. </tbody>
  365. </table>
  366. </div>
  367. </div>
  368. </div>
  369. </form>
  370. </div><!-- fin tab1 -->
  371. <div class="tab-pane fade" id="tab2" role="tabpanel" aria-labelledby="tab2-tab">
  372. <div class="row justify-content-md-center">
  373. <div class="col-12 col-md-10 mt-2 table-responsive">
  374. <form action="./export/xls_lista_horariogrupo.php" method="post" target="_blank">
  375. <input type="hidden" name="grupo" value="<?php echo $filter_grupo;?>">
  376. <p><button type="submit" class="btn btn-outline-secondary btn-sm"><?php echo $ICO["descargar"];?> Descargar listado</button></p>
  377. </form>
  378. <table class="table table-striped table-white">
  379. <thead class="thead-dark">
  380. <tr>
  381. <th>Materia</th>
  382. <th>Día</th>
  383. <th>Horario</th>
  384. <th>Profesores</th>
  385. </tr>
  386. </thead>
  387. <tbody id="materiasListBlock">
  388. <tr>
  389. <td>
  390. <span class="area"><?php echo $ICO_LG["circulo"];?></span>
  391. <span class="font-weight-bold materia"></span><br>
  392. Salón: <span class="salon"></span>
  393. </td>
  394. <td class="dia text-center"></td>
  395. <td class="hora text-center"></td>
  396. <td class="profesores"></td>
  397. </tr>
  398. </tbody>
  399. </table>
  400. </div>
  401. </div>
  402. </div><!-- fin tab2 -->
  403. <div class="tab-pane fade" id="tab3" role="tabpanel" aria-labelledby="tab3-tab">
  404. <div class="row justify-content-md-center">
  405. <div class="col-12 col-md-8 mt-2 mb-2">
  406. <?php if(!isset($prof_gpo_rs) || count($prof_gpo_rs) == 0){?>
  407. <h3 class="text-center text-danger">No hay profesores con disponibilidad de horario asignada</h3>
  408. <?php }else{ ?>
  409. <form action="horariogrupo.php" method="post">
  410. <div class="form-group row">
  411. <label for="filter_prof" class="col-3 col-form-label text-right">Profesor</label>
  412. <div class="col-5">
  413. <select id="filter_prof" name="prof" class="form-control">
  414. <option value="">Selecciona un profesor</option>
  415. <?php foreach($prof_gpo_rs as $prof) {?>
  416. <option value="<?php echo $prof["Usuario_id"];?>" ><?php echo $prof["Usuario_apellidos"]." ".$prof["Usuario_nombre"];?></option>
  417. <?php } ?>
  418. </select>
  419. <small class="form-text text-muted">
  420. * Sólo se muestran los profesores que capturaron su disponibilidad
  421. </small>
  422. </div>
  423. <div class="col-4">
  424. <button type="button" class="btn btn-outline-primary" id="btn-disponibilidad"><?php echo $ICO["buscar"]; ?> Ver disponibilidad</button>
  425. </div>
  426. </div>
  427. </form>
  428. <?php } ?>
  429. </div>
  430. </div>
  431. <?php if(isset($prof_gpo_rs) && count($prof_gpo_rs) > 0){?>
  432. <div class="row justify-content-md-center">
  433. <div class="col-12 mt-2">
  434. <div class="mt-2 mb-2">
  435. <table class="table table-sm table-responsive table-borderless table-striped calendario" id="tabla-horario" data-hora-inicio="<?php echo HORA_INICIO;?>" data-fracciones = "<?php echo FRACCION_HORA; ?>">
  436. <thead class="thead-dark">
  437. <tr>
  438. <th>Hora</th>
  439. <?php foreach($dias_rs as $dia){
  440. echo "<th data='dia_".$dia["Dia_id"]."'>".$dia["Dia_desc"]."</th>";
  441. } ?>
  442. </tr>
  443. </thead>
  444. <tbody>
  445. <?php
  446. $biccell = false;
  447. for($h = HORA_INICIO, $i=0; $h < HORA_FINAL; $h++, $i++){?>
  448. <tr>
  449. <td data-hora="<?php echo $h;?>" data-index="<?php echo $i;?>" class="hora" ><?php echo $h;?>:00 </td>
  450. <?php
  451. if(!$biccell){
  452. $biccell = true;
  453. ?>
  454. <td colspan='<?php echo count($dias_rs); ?>' rowspan='<?php echo (HORA_FINAL-HORA_INICIO); ?>'>
  455. <div class='area-horario'>
  456. <table class="table table-borderless table-striped">
  457. <tbody>
  458. <?php
  459. for($h2 = HORA_INICIO; $h2 < HORA_FINAL; $h2++){
  460. for($f = 0; $f < FRACCION_HORA; $f++){
  461. echo "<tr class='dia'>";
  462. foreach($dias_rs as $dia){
  463. //echo "$h2, $f => ".enBloqueClase($h2, $f);
  464. echo "<td title='".$h2.":".sprintf("%02d", ($f*(60/FRACCION_HORA)))."' data-dia='".$dia["Dia_id"]."' data-hora='".$h2."' data-fraccion='".($f*(60/FRACCION_HORA))."' class='fraccion ".enBloqueClase($pdo, $h2, $f, $_SESSION["nivel_id"])."'></td>";
  465. }
  466. echo "</tr>";
  467. }
  468. }
  469. ?>
  470. </tbody>
  471. </table>
  472. <div id="bloque-disponibilidad"></div>
  473. </div>
  474. </td>
  475. <?php
  476. } ?>
  477. </tr>
  478. <?php } ?>
  479. </tbody>
  480. </table>
  481. </div>
  482. </div>
  483. </div>
  484. <?php } ?>
  485. </div><!-- fin tab3 -->
  486. </div>
  487. <!-- Referencia de colores -->
  488. <?php
  489. $stmt = $pdo->prepare('Select * from fs_areaacademica(NULL, :nivel)');
  490. $stmt->bindParam(":nivel", $_SESSION["nivel_id"]);
  491. $stmt->execute();
  492. $areas_rs = $stmt->fetchAll();
  493. $stmt->closeCursor();
  494. if(count($areas_rs)>0){
  495. ?>
  496. <div class="row justify-content-md-center">
  497. <div class="col-12">
  498. <hr/>
  499. <h5 class="mt-2">Áreas académicas</h5>
  500. </div>
  501. <div class="col-12">
  502. <?php foreach($areas_rs as $area){ ?>
  503. <span class="tipo-area"><span style="color:<?php echo $area["Area_color"]?>"><?php echo $ICO_LG["circulo"];?></span> <?php echo $area["Area_desc"]?></span>
  504. <?php } ?>
  505. </div>
  506. </div>
  507. <?php } ?>
  508. <?php }//end if existe grupo_actual_rs ?>
  509. </div>
  510. <!--- FOOTER--->
  511. <?php require_once("../include/footer.php"); ?>
  512. <?php if(isset($grupo_actual_rs)){
  513. if($objSesion->puedeEditar() && count($materias_rs) > 0){
  514. ?>
  515. <!-- Modal -->
  516. <div class="modal fade" id="modal" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true">
  517. <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
  518. <div class="modal-content">
  519. <div class="modal-header">
  520. <h4 class="col-12 modal-title text-center"><span id="modalLabel">Crear Grupo</span>
  521. <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
  522. <span aria-hidden="true">&times;</span>
  523. </button>
  524. </h4>
  525. </div>
  526. <div class="modal-body ">
  527. <form action="#" method="post" id="formaModal" onsubmit="return false"><!-- submitForm() -->
  528. <input type="hidden" name="id" id="id">
  529. <input type="hidden" name="id_db" id="id_db">
  530. <input type="hidden" name="dia" id="dia">
  531. <input type="hidden" name="hora" id="hora">
  532. <input type="hidden" name="fraccion" id="fraccion">
  533. <div class="form-box">
  534. <div class="form-group row mb-2">
  535. <label class="col-4">Día y hora</label>
  536. <div class="col-8" id="fecha_horario"></div>
  537. </div>
  538. <div class="form-group row">
  539. <label for="materia" class="col-4 col-form-label">Materia *</label>
  540. <div class="col-8">
  541. <select name="materia" id="materia" class="form-control" required="required">
  542. <?php
  543. foreach($materias_rs as $mat){?>
  544. <option value="<?php echo $mat["Materia_id"]; ?>" data-tipo="<?php echo $mat["TipoSubmateria_id"]; ?>" data-color="<?php echo $mat["Area_color"]; ?>"><?php echo $mat["Materia_desc"];?></option>
  545. <?php }?>
  546. </select>
  547. </div>
  548. </div>
  549. <div class="form-group row">
  550. <label for="salon" class="col-4 col-form-label">Salón</label>
  551. <div class="col-8">
  552. <select name="salon" id="salon" class="form-control">
  553. <option value="" data-desc="">-Pendiente-</option>
  554. <?php
  555. $tipo_old = "";
  556. foreach($salones_rs as $salon){
  557. if($tipo_old != $salon["TipoSalon_id"]){
  558. if($tipo_old != "") echo '</optgroup>';
  559. echo '<optgroup label="'.$salon["TipoSalon_desc"].'">';
  560. $tipo_old = $salon["TipoSalon_id"];
  561. }
  562. $desc = $salon["Salon_desc"];
  563. if($salon["Salon_desc_larga"] != ""){ $desc.=" [".$salon["Salon_desc_larga"]."]";}
  564. ?>
  565. <option value="<?php echo $salon["Salon_id"]; ?>" data-desc="<?php echo $salon["Salon_desc"];?>"><?php echo $desc;?></option>
  566. <?php
  567. }
  568. if($tipo_old != "") echo '</optgroup>';
  569. ?>
  570. </select>
  571. <!--<div class="datalist datalist-select mb-1 w-100" id="dlCarrera">
  572. <div class="datalist-input">&nbsp;</div>
  573. <span class="ing-buscar icono"></span>
  574. <ul style="display:none">
  575. <?php
  576. $last_tipo = -1;
  577. foreach($salones_rs as $salon){
  578. if($last_tipo != intval($salon["TipoSalon_id"])){
  579. $last_tipo = intval($salon["TipoSalon_id"]);
  580. ?>
  581. <li data-id="" class="not-selectable"><?php echo $salon["TipoSalon_desc"]; ?></li>
  582. <?php }
  583. $desc = $salon["Salon_desc"];
  584. if($salon["Salon_desc_larga"] != ""){ $desc.=" [".$salon["Salon_desc_larga"]."]";}
  585. ?>
  586. <li data-id="<?php echo $salon["Salon_id"];?>" class="pl-4"><?php echo $desc;?></li>
  587. <?php }?>
  588. </ul>
  589. <input type="hidden" id="carrera" name="carrera" value="">
  590. </div>-->
  591. <?php if(trim($grupo_actual_rs["Salon_sugerido"]) != ""){ ?>
  592. <small id="salonHelpBlock" class="form-text text-muted">
  593. <strong>Sugerido:</strong> <?php echo $grupo_actual_rs["Salon_sugerido"]; ?>
  594. </small>
  595. <?php } ?>
  596. </div>
  597. </div>
  598. </div>
  599. <!-- --- INICIA SUBMATERIA --- -->
  600. <div id="submaterias-block" class="my-4">
  601. <div class="row">
  602. <div class="col">
  603. <table class="table table-sm table-striped table-white">
  604. <thead class="thead-dark">
  605. <tr>
  606. <th>Submateria</th>
  607. <th class="col-submateria-inicial">Inicio</th>
  608. <th class="col-submateria-final">Fin</th>
  609. <th>Activa</th>
  610. </tr>
  611. </thead>
  612. <tbody id="submateria-list">
  613. <tr>
  614. <td>
  615. <span class="submateria-nombre my-2" data-id="0"></span>
  616. </td>
  617. <td>
  618. <input name="submateria_inicial[]" type="text" class="form-control form-control-sm date-picker submateria-inicial" placeholder="dd/mm/aaaa" maxlength="10" readonly="readonly">
  619. </td>
  620. <td>
  621. <input name="submateria_final[]" type="text" class="form-control form-control-sm date-picker submateria-final" placeholder="dd/mm/aaaa" maxlength="10" readonly="readonly">
  622. </td>
  623. <td class="text-center pl-4">
  624. <input name="submateria_activa[]" type="checkbox" class="form-check-input radio-md submateria-activa" value="1" data-nombre="" data-id="">
  625. </td>
  626. </tr>
  627. </tbody>
  628. </table>
  629. </div>
  630. </div>
  631. </div>
  632. <!-- --- FIN SUBMATERIA --- -->
  633. <!-- --- INICIO PROFESOR --- -->
  634. <div class="my-4">
  635. <div class="row mb-2">
  636. <div class="col">
  637. <table class="table table-sm table-borderless table-white">
  638. <thead class="thead-dark">
  639. <tr>
  640. <th class="col-profesor-submateria">Submateria*</th>
  641. <th>Profesor*</th>
  642. <th class="col-profesor-salon">Salón</th>
  643. <th><?php echo $ICO["borrar2"];?></th>
  644. </tr>
  645. </thead>
  646. <tbody id="profesor-list">
  647. <tr>
  648. <td>
  649. <select name="submateria[]" class="form-control form-control-sm profesor-submateria">
  650. </select>
  651. </td>
  652. <td>
  653. <select name="profesor[]" class="form-control form-control-sm profesor">
  654. <option value="">-Pendiente-</option>
  655. </select>
  656. </td>
  657. <td class="col-profesor-salon">
  658. <select name="submateria_salon[]" class="form-control form-control-sm profesor-salon">
  659. <option value="" data-desc="">-Pendiente-</option>
  660. <?php
  661. $tipo_old = "";
  662. foreach($salones_rs as $salon){
  663. if($tipo_old != $salon["TipoSalon_id"]){
  664. if($tipo_old != "") echo '</optgroup>';
  665. echo '<optgroup label="'.$salon["TipoSalon_desc"].'">';
  666. $tipo_old = $salon["TipoSalon_id"];
  667. }
  668. $desc = $salon["Salon_desc"];
  669. if($salon["Salon_desc_larga"] != ""){ $desc.=" [".$salon["Salon_desc_larga"]."]";}
  670. ?>
  671. <option value="<?php echo $salon["Salon_id"]; ?>" data-desc="<?php echo $salon["Salon_desc"];?>" ><?php echo $desc;?></option>
  672. <?php
  673. }
  674. if($tipo_old != "") echo '</optgroup>';
  675. ?>
  676. </select>
  677. </td>
  678. <td class="text-center"><button type="button" class="btn btn-sm btn-outline-danger borra-profesor"><?php echo $ICO["borrar2"];?></button></td>
  679. </tr>
  680. </tbody>
  681. </table>
  682. </div>
  683. </div>
  684. <div class="row mb-2 justify-content-center">
  685. <div class="col-6">
  686. <button type="button" class="btn btn-outline-primary btn-block" id="agrega-profesor"><?php echo $ICO["mas"];?> Agregar <span id="btn-tipo-text">profesor</span></button>
  687. </div>
  688. </div>
  689. </div>
  690. <!-- --- FIN PROFESOR --- -->
  691. <div class="row bg-info my-3 px-3">
  692. <div class="col-12">
  693. <p class="alert-heading py-2">
  694. <a class="d-block collapsed" data-toggle="collapse" href="#avanzadoBox" role="button" aria-expanded="false" aria-controls="collapseExample">
  695. <i class="ing-caret ing-fw float-right"></i> Configuración avanzada</a>
  696. </p>
  697. </div>
  698. <div class="col-12 collapse" id="avanzadoBox">
  699. <div class="form-box">
  700. <div class="row form-group">
  701. <label for="duracion" class="col-4 col-form-label">Duración *</label>
  702. <div class="col-8">
  703. <select name="duracion" id="duracion" class="form-control" required="required">
  704. <option value="45">45 minutos</option>
  705. <?php
  706. for($d = DURACION_MIN; $d<= DURACION_MAX; $d+=DURACION_STEP){?>
  707. <option value="<?php echo $d; ?>" <?php if($grupo_actual_rs["Materia_duracion"] == $d){ echo 'selected="selected"'; } ?>><?php echo $d;?> minutos</option>
  708. <?php }?>
  709. </select>
  710. <div class="invalid-feedback">La duración de la materia tiene conflictos con la materia siguiente o está fuera del horario permitido.</div>
  711. </div>
  712. </div>
  713. <div class="row form-group">
  714. <label for="fecha_inicial" class="col-4 col-form-label">Fecha inicial *</label>
  715. <div class="col-8">
  716. <input id="fecha_inicial" name="fecha_inicial" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly="readonly">
  717. <div class="invalid-feedback">
  718. El rango de fechas es inválido o tiene confricto con otro horario.
  719. </div>
  720. </div>
  721. </div>
  722. <div class="row form-group">
  723. <label for="fecha_final" class="col-4 col-form-label">Fecha final *</label>
  724. <div class="col-8">
  725. <input id="fecha_final" name="fecha_final" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly="readonly">
  726. <div class="invalid-feedback">
  727. El rango de fechas es inválido o tiene confricto con otro horario.
  728. </div>
  729. </div>
  730. </div>
  731. </div>
  732. <hr>
  733. <div id="no-vinculadas-block" class="d-none">
  734. <h5 class="mt-2 font-weight-bold"><span class="ing-link ing-fw"></span> Vincular con grupo</h5>
  735. <p><em>La materia no se puede vicular porque no existen materias relacionadas. <b>Edita las materias</b> para seleccionar cuáles se pueden relacionar entre sí.</em></p>
  736. </div>
  737. <div id="vinculadas-block" class="d-none">
  738. <h5 class="mt-2"><span class="ing-link ing-fw"></span> Vincular con grupo</h5>
  739. <p><em>Al vincular el horario de la materia se crea automáticamente en los grupos seleccionados.</em></p>
  740. <div class="row mb-2">
  741. <div class="col">
  742. <table class="table table-sm table-borderless">
  743. <thead class="table-dark">
  744. <tr>
  745. <th>Grupo y Materia</th>
  746. <th>&nbsp;</th>
  747. </tr>
  748. </thead>
  749. <tbody id="vinculo-list">
  750. <tr>
  751. <td>
  752. <select name="grupo_vinculo[]" class="form-control form-control-sm grupo_vinculo">
  753. <option value="0">- Sin relación -</option>
  754. </select>
  755. </td>
  756. <td class="text-center"><button type="button" class="btn btn-sm btn-outline-danger borra-vinculo" title="Quitar grupo"><?php echo $ICO["borrar2"];?></button></td>
  757. </tr>
  758. </tbody>
  759. </table>
  760. </div>
  761. </div>
  762. <div class="row mb-2 justify-content-center">
  763. <div class="col-6">
  764. <button type="button" class="btn btn-outline-primary btn-block" id="agrega-vinculo"><?php echo $ICO["mas"];?> Agregar grupo para vincular</button>
  765. </div>
  766. </div>
  767. </div>
  768. </div>
  769. </div>
  770. <div class="form-group row">
  771. <div class="col-12 text-center">
  772. <button type="submit" class="btn btn-outline-primary" id="submitBtn" data-tipo="1"><?php echo $ICO["aceptar"];?> Guardar</button>
  773. <button type="reset" class="btn btn-outline-danger" data-dismiss="modal"><?php echo $ICO["cancelar"];?> Cancelar</button>
  774. </div>
  775. </div>
  776. </form>
  777. </div>
  778. </div>
  779. </div>
  780. </div>
  781. <?php } //fin puede editar ?>
  782. <!-- Modal Ver-->
  783. <div class="modal fade" id="modal_ver" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true">
  784. <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
  785. <div class="modal-content">
  786. <div class="modal-header">
  787. <h4 class="col-12 modal-title text-center">Datos del Horario
  788. <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
  789. <span aria-hidden="true">&times;</span>
  790. </button>
  791. </h4>
  792. </div>
  793. <div class="modal-body ">
  794. <div class="row mb-2">
  795. <div class="col-12">
  796. <h5 class="text-center text-primary"><span class="materia"></span><br>
  797. <span class="salon"></span>
  798. </h5>
  799. </div>
  800. </div>
  801. <h5 style="border-bottom:1px solid #006094;" class="pb-2"><?php echo $ICO["profesor"];?> Profesores</h5>
  802. <div class="row mb-2">
  803. <div class="col-12 submaterias"></div>
  804. </div>
  805. <div id="ver-block-vinculados">
  806. <h5 style="border-bottom:1px solid #006094;" class="pb-2"><span class="ing-link ing-fw"></span> Grupos vinculados</h5>
  807. <div class="row mb-2">
  808. <div class="col-12 vinculados"></div>
  809. </div>
  810. </div>
  811. </div>
  812. <div class="modal-footer bg-primary text-white pb-0">
  813. <div class="container-fluid">
  814. <div class="row">
  815. <div class="col-6 text-left"><p><span class="dia"></span>, de <span class="hora_inicial"></span> a <span class="hora_final"></span> hrs.</p></div>
  816. <div class="col-6 text-right"><p>Del <span class="fecha_inicial"></span> al <span class="fecha_final"></span></p></div>
  817. </div>
  818. </div>
  819. </div>
  820. </div>
  821. </div>
  822. </div>
  823. <div class="modal fade" id="modal_confirm" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true">
  824. <div class="modal-dialog modal-dialog-centered" role="document">
  825. <div class="modal-content">
  826. <div class="modal-body">
  827. <div class="row">
  828. <div class="col">
  829. <p class="font-weight-bold">¿Estás seguro de que quieres quitar la materia del horario?</p>
  830. <p>Esta acción no se puede deshacer.</p>
  831. <p id="confirm-vinculada">La materia vinculada no se borrará de los demás grupos, y éstos permaneceran vinculados.</p>
  832. </div>
  833. </div>
  834. </div>
  835. <div class="modal-footer">
  836. <input type="hidden" id="id_borrar" value="">
  837. <button type="button" class="btn btn-outline-primary bloque-borra"><?php echo $ICO["aceptar"];?> Borrar</button>
  838. <button type="button" class="btn btn-outline-danger" data-dismiss="modal" aria-label="Close"><?php echo $ICO["cancelar"];?> Cancelar</button>
  839. </div>
  840. </div>
  841. </div>
  842. </div>
  843. <?php }//fin grupo seleccionado ?>
  844. </div>
  845. <script src="../js/jquery.min.js"></script>
  846. <script src="../js/jquery-ui.js"></script>
  847. <script src="../js/datepicker-es.js"></script>
  848. <script src="../js/bootstrap/popper.min.js"></script>
  849. <script src="../js/bootstrap/bootstrap.min.js"></script>
  850. <script src="./js/horario.js"></script>
  851. <script src="../js/fechas.js"></script>
  852. <script src="./js/horario_list.js"></script>
  853. <script src="./js/disponibilidad_read.js"></script>
  854. <script src="../js/sidebarmenu.js"></script>
  855. <script src="../js/datalist.js"></script>
  856. <script>
  857. setDatalist("#periodo", <?php echo $_SESSION["periodo_id"]; ?>);
  858. $(document).on('click', '#dlPeriodo ul li' ,function(){
  859. $("#formaPeriodo").submit();
  860. });
  861. </script>
  862. <?php if(isset($grupo_actual_rs)){ ?>
  863. <script>
  864. var _grupo_id = <?php echo $grupo_actual_rs["Grupo_id"]; ?>;
  865. var _grupo_duracion = <?php echo $grupo_actual_rs["Materia_duracion"]; ?>;
  866. var _periodo_fecha_inicial = "<?php echo fechaSlash($periodo_rs["Periodo_fecha_inicial"]); ?>";
  867. var _periodo_fecha_final = "<?php echo fechaSlash($periodo_rs["Periodo_fecha_final"]); ?>";
  868. var datepickerOptions = { dateFormat: "dd/mm/yy", minDate:_periodo_fecha_inicial, maxDate:_periodo_fecha_final };
  869. var clasesObj = [];
  870. var _reloadTime = 45; //en segundos, tiempo para refrescar horarios
  871. var _w = 180, _h = 12;//tamaño de bloques
  872. var _frac = parseInt($('#tabla-horario').data('fracciones'));
  873. var _tab_size = 25; //espaciado por cada elemento que colisiona
  874. var _reloadOnClose = false;
  875. var id_obj = 0; //id de objeto actual
  876. var _hora_min = parseInt($('#tabla-horario').data('hora-inicio'));
  877. </script>
  878. <?php if($objSesion->puedeEditar() && $objSesion->fechaJefes() && count($materias_rs) > 0){ ?>
  879. <script src="./js/horario_edicion.js?rand=<?php echo rand();?>"></script>
  880. <?php }else{//no editar ?>
  881. <script src="./js/horario_read.js"></script>
  882. <?php
  883. }//fin on editar
  884. } else {//no hay grupo ?>
  885. <script>
  886. $(document).on( "click", "#cambia-grupo", function(event){
  887. $('#cambia-grupo').parents('form').submit();
  888. });
  889. </script>
  890. <?php }?>
  891. </body>
  892. </html>