horarios_action.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. <?php
  2. session_start();
  3. require_once '../include/bd_pdo.php';
  4. require_once '../include/xtemplate.class.php';
  5. require_once '../classes/SGI.php';
  6. if(!isset($_POST['id'])){
  7. $return['error'] = 'Error! No se recibieron los datos.';
  8. } else {
  9. define('HORA_INICIO', 6);//hora inicial de horario
  10. define('HORA_FINAL', 22);//hora final de horario
  11. define('FRACCION_HORA', 4);//fracciones en una hora
  12. define('DURACION_MIN', 60);//hora inicial de horario
  13. define('DURACION_MAX', 360);//hora final de horario
  14. define('DURACION_STEP', 15);//fracciones en una hora
  15. define('ALTO_RENGLON', 30);//alto del renglón
  16. $error = '';
  17. switch($_POST['tipo']){
  18. case 1: //Grupos
  19. $horario_rs = SGI::getHorarioGrupo($pdo, filter_input(INPUT_POST, 'id', FILTER_SANITIZE_NUMBER_INT));
  20. $horaMin = horaMin($horario_rs, 'Horario_hora');
  21. $horaMax = horaMax($horario_rs, 'Horario_hora_final');
  22. $dias_rs = SGI::getDias($pdo);
  23. if (empty($error)) {
  24. $xtpl = new XTemplate('../templates/horario_grupo.tpl.html');
  25. foreach($dias_rs as $dia){
  26. $xtpl->assign('DIA', $dia['Dia_desc']);
  27. $xtpl->assign('ID_DIA', $dia['Dia_id']);
  28. $xtpl->parse('main.header');
  29. }
  30. $rs_i = 0;
  31. $spacerArr = array(1=>0,0,0,0,0,0);
  32. $pendiente = '<li class="pendiente">Pendiente</em>';
  33. $horas_dif = intval(date('H', strtotime($horaMax))) - intval(date('H', strtotime($horaMin)));
  34. $sub_prof_num = 0;
  35. $sub_num = 0;
  36. $tiene_submaterias = false;
  37. for($h = date('H', strtotime($horaMin)); $h <= date('H', strtotime($horaMax)); $h++){
  38. $xtpl->assign('HORA', date('H', strtotime($h.':00')));
  39. $xtpl->assign('FRACCIONES', FRACCION_HORA);
  40. $xtpl->parse('main.hora_row.hora');
  41. for($f = 0; $f < FRACCION_HORA; $f++){
  42. foreach($dias_rs as $dia){
  43. if($rs_i < count($horario_rs) && date('H:i', strtotime($horario_rs[$rs_i]['Horario_hora'])) == date('H:i', strtotime($h.':'.($f * (60/FRACCION_HORA)))) && $horario_rs[$rs_i]['Dia_id'] == $dia['Dia_id']){
  44. if((isset($filter_fecha) && strtotime($filter_fecha) >= strtotime($horario_rs[$rs_i]['fecha_inicial']) && strtotime($filter_fecha) <= strtotime($horario_rs[$rs_i]['fecha_final']) ) || !isset($filter_fecha)){
  45. $size = $horario_rs[$rs_i]['Horario_duracion']/(60/FRACCION_HORA);
  46. $spacerArr[$dia['Dia_id']] = $size -1;
  47. $xtpl->assign('ID_DIA', $dia['Dia_id']);
  48. $xtpl->assign('DURACION_SIZE', $size);
  49. $xtpl->assign('ALTO_DIV', $size * ALTO_RENGLON);
  50. $xtpl->assign('MATERIA', $horario_rs[$rs_i]['Materia_desc']);
  51. $xtpl->assign('HORA_I', substr($horario_rs[$rs_i]['Horario_hora'], 0, 5));
  52. $xtpl->assign('HORA_F', substr($horario_rs[$rs_i]['Horario_hora_final'], 0, 5));
  53. if($horario_rs[$rs_i]['Salon_desc'] != '')
  54. if($horario_rs[$rs_i]['Salon_desc_larga'] != '')
  55. $xtpl->assign('SALON', $horario_rs[$rs_i]['Salon_desc'].' ['.$horario_rs[$rs_i]['Salon_desc_larga'].']');
  56. else
  57. $xtpl->assign('SALON', $horario_rs[$rs_i]['Salon_desc']);
  58. else{
  59. if(!isset($horario_rs[$rs_i]['TipoSubmateria_id']) || $horario_rs[$rs_i]['TipoSubmateria_id'] == 0)
  60. $xtpl->assign('SALON', '<em>Pendinte</em>');
  61. else
  62. $xtpl->assign('SALON', '*');
  63. }
  64. //----- Carga profesores ----
  65. if($horario_rs[$rs_i]['TipoSubmateria_id'] == 0)
  66. $profesores_rs = SGI::getProfesorHorarioGrupo($pdo, $horario_rs[$rs_i]['HorarioGrupo_id']);
  67. else { //Con submaterias
  68. //----- Carga submaterias ----
  69. $submaterias_rs = SGI::getSubMateriaHorarioGrupo($pdo, $horario_rs[$rs_i]['HorarioGrupo_id']);
  70. $sub_prof_num = 0;
  71. $nombre_impreso = false;
  72. if(count($submaterias_rs) > 0){
  73. $tiene_submaterias = true;
  74. foreach($submaterias_rs as $submateria){
  75. $xtpl->assign('SUBMATERIA', $submateria['Submateria_desc']);
  76. $xtpl->assign('DIA', diaNombre($horario_rs[$rs_i]['Dia_id']));
  77. //---
  78. $profesores_rs = SGI::getSubMateriaHorarioGrupoProfesor($pdo, $horario_rs[$rs_i]['HorarioGrupo_id'], $submateria['Submateria_id']);
  79. $sub_prof_num += count($profesores_rs);
  80. if(isset($profesores_rs) && count($profesores_rs) > 0){
  81. $profesores_all = '';
  82. foreach($profesores_rs as $profesor){
  83. $prof_nombre = '<li class="profesor">' . $profesor['Usuario_apellidos'] . ' ' . $profesor['Usuario_nombre'] . '</li>';
  84. $profesores_all .= $prof_nombre;
  85. }
  86. $xtpl->assign('PROFESOR_SUB', $profesores_all);
  87. $xtpl->assign('SALON_SUB', $submateria['Salon_desc']);
  88. $xtpl->parse('main.submaterias_block.row.submateria');
  89. if(!$nombre_impreso){
  90. $nombre_impreso = true;
  91. $xtpl->assign('MAT_ROWSPAN', count($submaterias_rs));
  92. $xtpl->parse('main.submaterias_block.row.materia');
  93. }
  94. $xtpl->parse('main.submaterias_block.row');
  95. }//solo si hay profesor
  96. }
  97. }
  98. unset($profesores_rs);
  99. }//fin con submaterias
  100. if(isset($profesores_rs) && count($profesores_rs) > 0){
  101. foreach($profesores_rs as $profesor){
  102. $prof_nombre = '<li class="profesor">' . $profesor['Usuario_apellidos'] . ' ' . $profesor['Usuario_nombre'] . '</li>';
  103. $xtpl->assign('PROFESOR', $prof_nombre);
  104. $xtpl->parse('main.hora_row.td.td_horario.profesor');
  105. }
  106. }else{
  107. if($horario_rs[$rs_i]['TipoSubmateria_id'] == 0){//no pinta maestros electivas o secuenciales
  108. $prof_nombre = $pendiente;
  109. $xtpl->assign('PROFESOR', $prof_nombre);
  110. $xtpl->parse('main.hora_row.td.td_horario.profesor');
  111. }
  112. }
  113. $xtpl->parse('main.hora_row.td.td_horario.hora');
  114. $xtpl->parse('main.hora_row.td.td_horario.texto');
  115. $xtpl->parse('main.hora_row.td.td_horario.spacer');
  116. $xtpl->parse('main.hora_row.td.td_horario');
  117. }else
  118. $xtpl->parse('main.hora_row.td.td_vacio');
  119. $rs_i++;
  120. }else{
  121. if(!isset($spacerArr[$dia['Dia_id']]) || $spacerArr[$dia['Dia_id']] == 0){
  122. $xtpl->assign('ID_DIA', $dia['Dia_id']);
  123. $xtpl->parse('main.hora_row.td.td_vacio');
  124. }else
  125. $spacerArr[$dia['Dia_id']]--;
  126. }
  127. $xtpl->parse('main.hora_row.td');
  128. }
  129. $xtpl->parse('main.hora_row');
  130. }
  131. }
  132. if($tiene_submaterias){
  133. $xtpl->parse('main.submaterias_block.materia');
  134. $xtpl->parse('main.submaterias_block');
  135. }
  136. $xtpl->parse('main');
  137. $return['html'] = $xtpl->text('main');
  138. $return['tabla'] = true;
  139. } else {
  140. $return['html'] = '<div class="marco">
  141. <div class="msgAviso d-flex flex-row justify-content-between align-items-stretch mt-4">
  142. <div class="iconAviso bg-danger d-flex justify-content-center align-items-center"><i class="display-3 ing-cancelar"></i></div>
  143. <div class="txtAviso flex-grow-1 d-flex flex-column justify-content-center align-items-center">
  144. <div class="display-5 indivisa-text-black mb-3">¡Error!</div>
  145. <div class="text-center">' . $error . '</div>
  146. </div>
  147. </div>
  148. </div>';
  149. $return['tabla'] = false;
  150. }
  151. break;
  152. case 2: //Docente
  153. date_default_timezone_set('America/Mexico_City');
  154. $horario_rs = SGI::getHorarioProfesor($pdo, filter_input(INPUT_POST, 'id', FILTER_SANITIZE_NUMBER_INT), date('Y-m-d'));
  155. $horaMin = horaMin($horario_rs, 'Hora_inicio');
  156. $horaMax = horaMax($horario_rs, 'Hora_final');
  157. $dias_rs = SGI::getDias($pdo);
  158. if (empty($error)) {
  159. $xtpl = new XTemplate('../templates/horario_profesor.tpl.html');
  160. foreach($dias_rs as $dia){
  161. $xtpl->assign('DIA', $dia['Dia_desc']);
  162. $xtpl->assign('ID_DIA', $dia['Dia_id']);
  163. $xtpl->parse('main.header');
  164. }
  165. $rs_i = 0;
  166. $spacerArr = array(1=>0,0,0,0,0,0);
  167. $horas_dif = intval(date('H', strtotime($horaMax))) - intval(date('H', strtotime($horaMin)));
  168. for($h = date('H', strtotime($horaMin)); $h <= date('H', strtotime($horaMax)); $h++){
  169. $xtpl->assign('HORA', date('H', strtotime($h.':00')));
  170. $xtpl->assign('FRACCIONES', FRACCION_HORA);
  171. $xtpl->parse('main.hora_row.hora');
  172. for($f = 0; $f < FRACCION_HORA; $f++){
  173. foreach($dias_rs as $dia){
  174. if($rs_i < count($horario_rs) && date('H:i', strtotime($horario_rs[$rs_i]['Hora_inicio'])) == date('H:i', strtotime($h.':'.($f * (60/FRACCION_HORA)))) && $horario_rs[$rs_i]['Dia_id'] == $dia['Dia_id']){
  175. if((isset($filter_fecha) && strtotime($filter_fecha) >= strtotime($horario_rs[$rs_i]['fecha_inicial']) && strtotime($filter_fecha) <= strtotime($horario_rs[$rs_i]['fecha_final']) ) || !isset($filter_fecha)){
  176. $size = $horario_rs[$rs_i]['Duracion']/(60/FRACCION_HORA);
  177. $spacerArr[$dia['Dia_id']] = $size -1;
  178. $xtpl->assign('ID_DIA', $dia['Dia_id']);
  179. $xtpl->assign('DURACION_SIZE', $size);
  180. $xtpl->assign('ALTO_DIV', $size * ALTO_RENGLON);
  181. if ($horario_rs[$rs_i]['TipoHorario_desc'] == 'Docencia'){
  182. $xtpl->assign('HORA_I', substr($horario_rs[$rs_i]['Hora_inicio'], 0, 5));
  183. $xtpl->assign('HORA_F', substr($horario_rs[$rs_i]['Hora_final'], 0, 5));
  184. $xtpl->assign('MATERIA', $horario_rs[$rs_i]['Materia_desc']);
  185. $xtpl->assign('GRUPO', $horario_rs[$rs_i]['Grupo_desc'].' '.$horario_rs[$rs_i]['Carrera_prefijo']);
  186. if($horario_rs[$rs_i]['Salon_desc'] != '') {
  187. if($horario_rs[$rs_i]['Salon_desc_larga'] != '')
  188. $xtpl->assign('SALON', $horario_rs[$rs_i]['Salon_desc'].' ['.$horario_rs[$rs_i]['Salon_desc_larga'].']');
  189. else
  190. $xtpl->assign('SALON', $horario_rs[$rs_i]['Salon_desc']);
  191. } else{
  192. if(!isset($horario_rs[$rs_i]['TipoSubmateria_id']) || $horario_rs[$rs_i]['TipoSubmateria_id'] == 0)
  193. $xtpl->assign('SALON', '<em>Pendinte</em>');
  194. else
  195. $xtpl->assign('SALON', '*');
  196. }
  197. $xtpl->parse('main.hora_row.td.td_horario.hora');
  198. $xtpl->parse('main.hora_row.td.td_horario.texto');
  199. $xtpl->parse('main.hora_row.td.td_horario.grupo');
  200. $xtpl->parse('main.hora_row.td.td_horario.spacer');
  201. $xtpl->parse('main.hora_row.td.td_horario');
  202. } else {
  203. switch ($horario_rs[$rs_i]['TipoHorario_id']){
  204. case 1: $xtpl->assign('CLASE', 'atencion'); break;
  205. case 2: $xtpl->assign('CLASE', 'gestion'); break;
  206. }
  207. $xtpl->assign('HORA_I', substr($horario_rs[$rs_i]['Hora_inicio'], 0, 5));
  208. $xtpl->assign('HORA_F', substr($horario_rs[$rs_i]['Hora_final'], 0, 5));
  209. $xtpl->parse('main.hora_row.td.td_bloque.hora');
  210. $xtpl->parse('main.hora_row.td.td_bloque.spacer');
  211. $xtpl->parse('main.hora_row.td.td_bloque');
  212. }
  213. }else
  214. $xtpl->parse('main.hora_row.td.td_vacio');
  215. $rs_i++;
  216. }else{
  217. if(!isset($spacerArr[$dia['Dia_id']]) || $spacerArr[$dia['Dia_id']] == 0){
  218. $xtpl->assign('ID_DIA', $dia['Dia_id']);
  219. $xtpl->parse('main.hora_row.td.td_vacio');
  220. }else
  221. $spacerArr[$dia['Dia_id']]--;
  222. }
  223. $xtpl->parse('main.hora_row.td');
  224. }
  225. $xtpl->parse('main.hora_row');
  226. }
  227. }
  228. $xtpl->parse('main');
  229. $return['html'] = $xtpl->text('main');
  230. $return['tabla'] = true;
  231. } else {
  232. $return['html'] = '<div class="marco">
  233. <div class="msgAviso d-flex flex-row justify-content-between align-items-stretch mt-4">
  234. <div class="iconAviso bg-danger d-flex justify-content-center align-items-center"><i class="display-3 ing-cancelar"></i></div>
  235. <div class="txtAviso flex-grow-1 d-flex flex-column justify-content-center align-items-center">
  236. <div class="display-5 indivisa-text-black mb-3">¡Error!</div>
  237. <div class="text-center">' . $error . '</div>
  238. </div>
  239. </div>
  240. </div>';
  241. $return['tabla'] = false;
  242. }
  243. break;
  244. case 3: //Extraordinario
  245. if (isset($_POST['plan']) && isset($_POST['semestre']) && isset($_POST['periodo'])) {
  246. $xtpl = new XTemplate('../templates/horario_extras.tpl.html');
  247. //$examenes_extraordinarios = SGI::getExtraordinarios($pdo, filter_input(INPUT_POST, 'periodo', FILTER_SANITIZE_NUMBER_INT), filter_input(INPUT_POST, 'semestre', FILTER_SANITIZE_NUMBER_INT), filter_input(INPUT_POST, 'plan', FILTER_SANITIZE_NUMBER_INT));
  248. //Tiene el id del periodo fijo porque aú no existe un indicador de extraordinarios activos
  249. $examenes_extraordinarios = SGI::getExtraordinarios($pdo, 38, filter_input(INPUT_POST, 'semestre', FILTER_SANITIZE_NUMBER_INT), filter_input(INPUT_POST, 'plan', FILTER_SANITIZE_NUMBER_INT));
  250. if (count($examenes_extraordinarios) == 0){
  251. $xtpl->parse('main.sin_extras');
  252. } else {
  253. foreach ($examenes_extraordinarios as $examen) {
  254. $xtpl->assign('MATERIA', $examen['Materia_desc']);
  255. $salon = $examen["Salon_desc"];
  256. if(!empty($examen["Salon_desc_larga"]))
  257. $salon .= "-".$examen["Salon_desc_larga"];
  258. if (empty($salon))
  259. $xtpl->assign('SALON', '<i>Pendiente</i>');
  260. else
  261. $xtpl->assign('SALON', $salon);
  262. $xtpl->assign('PROFESOR', $examen["Profesor_nombre"] . " " . $examen["Profesor_apellidos"]);
  263. $xtpl->assign('FECHA', substr($examen["Examen_fechahora_inicial"], 0, 10));
  264. $xtpl->assign('HORA', substr($examen["Examen_fechahora_inicial"], 10, 6) . ' - ' . substr($examen["Examen_fechahora_final"], 10, 6));
  265. $xtpl->parse('main.extras.row');
  266. }
  267. $xtpl->parse('main.extras');
  268. }
  269. $xtpl->parse('main');
  270. $return['html'] = $xtpl->text('main');
  271. } else
  272. $return['html'] = '<h3 class="text-danger text-center mt-4">No fue posible obtener los horarios de los extraordinarios</h3>';
  273. break;
  274. }
  275. }
  276. $return['json'] = json_encode($return);
  277. echo json_encode($return);
  278. function horaMin($arr, $campo){
  279. $min = '';
  280. foreach($arr as $horario){
  281. if($min == '' || date('H:i', strtotime($horario[$campo])) < date('H:i', strtotime($min))){
  282. $min = $horario[$campo];
  283. }
  284. }
  285. return date('H:i', strtotime($min));
  286. }
  287. function horaMax($arr, $campo){
  288. $max = '';
  289. foreach($arr as $horario){
  290. if($max == '' || date('H:i', strtotime($horario[$campo])) > date('H:i', strtotime($max))){
  291. $max = $horario[$campo];
  292. }
  293. }
  294. return date('H:i', strtotime($max));
  295. }
  296. function diaNombre($num){
  297. $dias = array('Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado');
  298. return $dias[intval($num)];
  299. }