validacionesHorario.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. <?php
  2. /*
  3. * Valida conflictos de horario, salones y profesores
  4. * Recibe: conexión pdo
  5. * Regresan: textos de error
  6. * Success: texto vacío
  7. */
  8. function profesorEnSubmateria($sub, $arr){
  9. if(count($arr) > 0){
  10. $pos = 0;
  11. foreach($arr as $elem){
  12. if(intval($sub) == intval($elem["submateria"]))
  13. return $pos;
  14. $pos++;
  15. }
  16. }
  17. return -1;
  18. }
  19. function getFecha($arr, $id, $campo){
  20. foreach($arr as $sub){
  21. if($sub["submateria"] == $id)
  22. return $sub[$campo];
  23. }
  24. }
  25. function validaHorasMateria($pdo, $grupo, $materia, $materia_nombre, $duracion, $vinculadas = false){
  26. $stmt = $pdo->prepare('Select * from fs_valida_horasmateria(:gpo, :mat, :duracion)');
  27. $stmt->bindParam(":gpo", $grupo);
  28. $stmt->bindParam(":mat", $materia);
  29. $stmt->bindParam(":duracion", $duracion);
  30. if(!$stmt->execute()){
  31. $t = $stmt->errorInfo();
  32. return "No se puede grabar el horario. Ocurrió un error al validar las horas de la materia '".$materia_nombre."'. ";//.$t[2];
  33. }
  34. $invalido_rs = $stmt->fetch();
  35. $stmt->closeCursor();
  36. $stmt = null;
  37. $vinculadasTxt = ".";
  38. if($vinculadas){
  39. $vinculadasTxt = " en la materia vinculada.";
  40. }
  41. if(count($invalido_rs) > 0 && !$invalido_rs["fs_valida_horasmateria"]){
  42. return "No se puede grabar el horario. La materia <strong>".$materia_nombre."</strong> sobrepasa el límite de horas del grupo".$vinculadasTxt;
  43. }
  44. return "";
  45. }
  46. function validaConflictoHoras($pdo, $grupo, $dia, $hora, $materia, $materia_nombre, $fecha_inicial, $fecha_final, $duracion, $vinculadas = false){
  47. $stmt = $pdo->prepare('Select * from fs_valida_horariogrupo(:gpo, :dia, :hora, :mat, :fecha_ini, :fecha_fin, :duracion)');
  48. $stmt->bindParam(":gpo", $grupo);
  49. $stmt->bindParam(":dia", $dia);
  50. $stmt->bindParam(":hora", $hora);
  51. $stmt->bindParam(":mat", $materia);
  52. $stmt->bindParam(":fecha_ini", $fecha_inicial);
  53. $stmt->bindParam(":fecha_fin", $fecha_final);
  54. $stmt->bindParam(":duracion", $duracion);
  55. if(!$stmt->execute()){
  56. $t = $stmt->errorInfo();
  57. return "No se puede grabar el horario. Ocurrió un error al validar la materia '".$materia_nombre."'. ";//.$t[2];
  58. }
  59. $invalido_rs = $stmt->fetchAll();
  60. $stmt->closeCursor();
  61. $stmt = null;
  62. $vinculadasTxt = ".";
  63. if($vinculadas){
  64. $vinculadasTxt = " en la materia vinculada.";
  65. }
  66. if(count($invalido_rs) > 0 && isset($invalido_rs[0]["Materia_desc"])){
  67. return "No se puede grabar el horario. La materia <strong>".$invalido_rs[0]["Materia_desc"]."</strong> ya está ocupando el horario".$vinculadasTxt;
  68. }
  69. return "";
  70. }
  71. function validaConflictoSalon($pdo, $grupo, $dia, $hora, $materia, $materia_nombre, $fecha_inicial, $fecha_final, $duracion, $salon, $profesores, $submaterias, $vinculadas = false){
  72. if($salon == ""){
  73. $stmt = $pdo->prepare('Select * from fs_validasalon_horariogrupo(:gpo, :dia, :hora, :mat, NULL, :fecha_ini, :fecha_fin, :duracion)');
  74. }else{
  75. $stmt = $pdo->prepare('Select * from fs_validasalon_horariogrupo(:gpo, :dia, :hora, :mat, :salon, :fecha_ini, :fecha_fin, :duracion)');
  76. $stmt->bindParam(":salon", $salon);
  77. }
  78. $stmt->bindParam(":gpo", $grupo);
  79. $stmt->bindParam(":dia", $dia);
  80. $stmt->bindParam(":hora", $hora);
  81. $stmt->bindParam(":mat", $materia);
  82. $stmt->bindParam(":fecha_ini", $fecha_inicial);
  83. $stmt->bindParam(":fecha_fin", $fecha_final);
  84. $stmt->bindParam(":duracion", $duracion);
  85. if(!$stmt->execute()){
  86. $t = $stmt->errorInfo();
  87. return "No se puede grabar el horario. Ocurrió un error al validar la materia '".$materia_nombre."'. ";//.$t[2];
  88. }
  89. $invalido_rs = $stmt->fetchAll();
  90. $stmt->closeCursor();
  91. $vinculadasTxt = "";
  92. if($vinculadas){
  93. $vinculadasTxt = " en la materia vinculada";
  94. }
  95. if(count($invalido_rs) > 0 && isset($invalido_rs[0]["Materia_desc"])){
  96. return "No se puede grabar el horario".$vinculadasTxt.". La materia <strong>".$materia_nombre."</strong> utiliza el mismo salón (<strong>".$invalido_rs[0]["Salon_desc"]."</strong>) que <strong>".$invalido_rs[0]["Materia_desc"]."</strong> del grupo <strong>".$invalido_rs[0]["Grupo_desc"]."</strong> el mismo día a la misma hora.";
  97. }
  98. if(is_array($profesores) ){
  99. foreach($profesores as $profesor){
  100. if(!isset($profesor["salon"]) || $profesor["salon"] == ""){
  101. $stmt = $pdo->prepare('Select * from fs_validasalon_horariogrupo(:gpo, :dia, :hora, :mat, NULL, :fecha_ini, :fecha_fin, :duracion)');
  102. }else{
  103. $stmt = $pdo->prepare('Select * from fs_validasalon_horariogrupo(:gpo, :dia, :hora, :mat, :salon, :fecha_ini, :fecha_fin, :duracion)');
  104. $stmt->bindParam(":salon", $profesor["salon"]);
  105. }
  106. $stmt->bindParam(":mat", $materia);
  107. $stmt->bindParam(":gpo", $grupo);
  108. $stmt->bindParam(":dia", $dia);
  109. $stmt->bindParam(":hora", $hora);
  110. $fecha_tmp = isset($profesor["submateria"])?fechaGuion(getFecha($submaterias, $profesor["submateria"], "fecha_inicial")):"";
  111. if($fecha_tmp == "")
  112. $fecha_tmp = $fecha_inicial;
  113. $stmt->bindParam(":fecha_ini", $fecha_tmp);
  114. $fecha_tmp = isset($profesor["submateria"])?fechaGuion(getFecha($submaterias, $profesor["submateria"], "fecha_final")):"";
  115. if($fecha_tmp == "")
  116. $fecha_tmp = $fecha_final;
  117. $stmt->bindParam(":fecha_fin", $fecha_tmp);
  118. $stmt->bindParam(":duracion", $duracion);
  119. $vinculadasTxt = ".";
  120. if($vinculadas){
  121. $vinculadasTxt = " en la materia vinculada.";
  122. }
  123. if(!$stmt->execute()){
  124. $t = $stmt->errorInfo();
  125. return "No se puede grabar el horario. Ocurrió un error al validar el salón de la materia '".$materia_nombre."'".$vinculadasTxt;//.$t[2];
  126. }
  127. $invalido_rs = $stmt->fetchAll();
  128. $stmt->closeCursor();
  129. $stmt = null;
  130. if(count($invalido_rs) > 0 && isset($invalido_rs[0]["Materia_desc"])){
  131. return "No se puede grabar el horario. La materia <strong>".$materia_nombre."</strong> utiliza el mismo salón (<strong>".$invalido_rs[0]["Salon_desc"]."</strong>) que <strong>".$invalido_rs[0]["Materia_desc"]."</strong> del grupo <strong>".$invalido_rs[0]["Grupo_desc"]."</strong> el mismo día a la misma hora.";
  132. }
  133. }
  134. }//fin submaterias
  135. return "";
  136. }
  137. function validaConflictoProfesor($pdo, $grupo, $dia, $hora, $materia, $materia_nombre, $fecha_inicial, $fecha_final, $duracion, $profesores, $submaterias, $tipo, $vinculadas = false){
  138. if(is_array($profesores) ){
  139. //--Materias sin submaterias
  140. foreach($profesores as $profesor){
  141. if($profesor["profesor"] != ""){
  142. $stmt = $pdo->prepare('Select * from fs_validaprofesor_horariogrupo(:gpo, :dia, :hora, :mat, :prof, :fecha_ini, :fecha_fin, :duracion)');
  143. $stmt->bindParam(":gpo", $grupo);
  144. $stmt->bindParam(":dia", $dia);
  145. $stmt->bindParam(":hora", $hora);
  146. $stmt->bindParam(":mat", $materia);
  147. $stmt->bindParam(":prof", $profesor["profesor"]);
  148. if($tipo == 0){//sin submaterias
  149. $fecha_tmpI = $fecha_inicial;
  150. $fecha_tmpF = $fecha_final;
  151. }else{//con submaterias
  152. $i = profesorEnSubmateria($profesor["submateria"], $submaterias);//obtiene pos en el arreglo de submaterias
  153. if($i == -1 || fechaGuion($submaterias[$i]["fecha_inicial"]) == ""){
  154. $fecha_tmpI = $fecha_inicial;
  155. $fecha_tmpF = $fecha_final;
  156. }else{//periodo completo
  157. $fecha_tmpI = fechaGuion($submaterias[$i]["fecha_inicial"]);
  158. $fecha_tmpF = fechaGuion($submaterias[$i]["fecha_final"]);
  159. }
  160. }
  161. $stmt->bindParam(":fecha_ini", $fecha_tmpI);
  162. $stmt->bindParam(":fecha_fin", $fecha_tmpF);
  163. $stmt->bindParam(":duracion", $duracion);
  164. $vinculadasTxt = ".";
  165. if($vinculadas){
  166. $vinculadasTxt = " en la materia vinculada.";
  167. }
  168. if(!$stmt->execute()){
  169. $t = $stmt->errorInfo();
  170. return "No se puede grabar el horario. Ocurrió un error al validar el profesor de la materia '".$materia_nombre."'".$vinculadasTxt;//.$t[2];
  171. }
  172. $invalido_rs = $stmt->fetchAll();
  173. $stmt->closeCursor();
  174. $stmt = null;
  175. if(count($invalido_rs) > 0 && isset($invalido_rs[0]["Materia_desc"])){
  176. $debug = "Select * from fs_validaprofesor_horariogrupo( $grupo, $dia, $hora, $materia, ".$profesor["profesor"].", $fecha_tmpI, $fecha_tmpF, $duracion)";
  177. return "No se puede grabar el horario".$vinculadasTxt." El profesor ya está asignado el mismo día al mismo tiempo a la materia <strong>".$invalido_rs[0]["Materia_desc"]."</strong> del grupo <strong>".$invalido_rs[0]["Grupo_desc"]."</strong>.".$debug;
  178. }
  179. }
  180. }//fin foreach
  181. }
  182. }
  183. function validaConflictoProfesorSalon($pdo, $grupo, $dia, $hora, $mat, $salon, $salon_nombre, $fecha_inicial, $fecha_final, $duracion, $profesores, $submaterias, $tipo, $vinculadas = false){
  184. if(is_array($profesores) ){
  185. //--Materias sin submaterias
  186. foreach($profesores as $profesor){
  187. if($profesor["profesor"] != ""){
  188. $stmt = $pdo->prepare('Select * from fs_validaprofesorsalon_horariogrupo(:gpo, :dia, :hora, :mat, :sal, :prof, :fecha_ini, :fecha_fin, :duracion)');
  189. $stmt->bindParam(":gpo", $grupo);
  190. $stmt->bindParam(":dia", $dia);
  191. $stmt->bindParam(":hora", $hora);
  192. $stmt->bindParam(":mat", $mat);
  193. $stmt->bindParam(":sal", $salon);
  194. $stmt->bindParam(":prof", $profesor["profesor"]);
  195. if($tipo == 0){//sin submaterias
  196. $fecha_tmpI = $fecha_inicial;
  197. $fecha_tmpF = $fecha_final;
  198. }else{//con submaterias
  199. $i = profesorEnSubmateria($profesor["submateria"], $submaterias);//obtiene pos en el arreglo de submaterias
  200. if($i == -1 || fechaGuion($submaterias[$i]["fecha_inicial"]) == ""){
  201. $fecha_tmpI = $fecha_inicial;
  202. $fecha_tmpF = $fecha_final;
  203. }else{//periodo completo
  204. $fecha_tmpI = fechaGuion($submaterias[$i]["fecha_inicial"]);
  205. $fecha_tmpF = fechaGuion($submaterias[$i]["fecha_final"]);
  206. }
  207. }
  208. $stmt->bindParam(":fecha_ini", $fecha_tmpI);
  209. $stmt->bindParam(":fecha_fin", $fecha_tmpF);
  210. $stmt->bindParam(":duracion", $duracion);
  211. $vinculadasTxt = ".";
  212. if($vinculadas){
  213. $vinculadasTxt = " en la materia vinculada.";
  214. }
  215. if(!$stmt->execute()){
  216. $t = $stmt->errorInfo();
  217. return "No se puede grabar el horario. Ocurrió un error al validar el profesor ".$vinculadasTxt.$t[2];
  218. }
  219. $invalido_rs = $stmt->fetchAll();
  220. $stmt->closeCursor();
  221. $stmt = null;
  222. if(count($invalido_rs) > 0 && isset($invalido_rs[0]["Salon_desc"])){
  223. return "No se puede grabar el horario".$vinculadasTxt." El profesor está asignado el mismo día al mismo tiempo en un salón distinto al <strong>".$salon_nombre."</strong> en el grupo <strong>".$invalido_rs[0]["Grupo_desc"]."</strong>.";
  224. }
  225. }
  226. }//fin foreach
  227. }
  228. }
  229. function validaConflictoReposicionSalon($pdo, $reposicion, $periodo, $fecha_ini, $duracion, $salon){
  230. $fecha_fin = date('Y-m-d H:i:00', strtotime($fecha_ini.' + '.$duracion.' minute'));
  231. $stmt = $pdo->prepare('Select * from fs_validasalon_reposicion(:rep, :periodo, :salon, :fecha_ini, :fecha_fin)');
  232. $stmt->bindParam(":rep", $reposicion);
  233. $stmt->bindParam(":salon", $salon);
  234. $stmt->bindParam(":periodo", $periodo);
  235. $stmt->bindParam(":fecha_ini", $fecha_ini);
  236. $stmt->bindParam(":fecha_fin", $fecha_fin);
  237. //echo "Select * from fs_validasalon_reposicion($reposicion, $periodo, $salon, '$fecha_ini', '$fecha_fin')<br>";
  238. if(!$stmt->execute()){
  239. $t = $stmt->errorInfo();
  240. return "No se puede validar el salón. Ocurrió un error al validar la reposición. ".$t[2];
  241. }
  242. $invalido_rs = $stmt->fetchAll();
  243. $stmt->closeCursor();
  244. $stmt = null;
  245. if(count($invalido_rs) > 0 && isset($invalido_rs[0]["Materia_desc"])){
  246. return "La reposición utiliza el mismo salón (<strong>".$invalido_rs[0]["Salon_desc"]."</strong>) que la reposición de <strong>".$invalido_rs[0]["Materia_desc"]."</strong> del grupo <strong>".$invalido_rs[0]["Grupo_desc"]."</strong> el mismo día a la misma hora.";
  247. }
  248. return "";
  249. }
  250. function validaConflictoReposicionProfesorSalon($pdo, $reposicion, $periodo, $fecha_ini, $duracion, $profesor){
  251. if($profesor != ""){
  252. $fecha_fin = date('Y-m-d H:i:00', strtotime($fecha_ini.' + '.$duracion.' minute'));
  253. $stmt = $pdo->prepare('Select * from fs_validaprofesorsalon_reposicion(:rep, :periodo, :prof, :fecha_ini, :fecha_fin)');
  254. $stmt->bindParam(":rep", $reposicion);
  255. $stmt->bindParam(":periodo", $periodo);
  256. $stmt->bindParam(":fecha_ini", $fecha_ini);
  257. $stmt->bindParam(":fecha_fin", $fecha_fin);
  258. $stmt->bindParam(":prof", $profesor);
  259. if(!$stmt->execute()){
  260. $t = $stmt->errorInfo();
  261. return "No se puede validar el profesor. Ocurrió un error al validar la reposición. ".$t[2];
  262. }
  263. $invalido_rs = $stmt->fetchAll();
  264. $stmt->closeCursor();
  265. $stmt = null;
  266. if(count($invalido_rs) > 0 && isset($invalido_rs[0]["Materia_desc"])){
  267. return "El profesor ya está asignado a una reposición (<strong>".$invalido_rs[0]["Materia_desc"]."</strong>) el mismo día al mismo tiempo.";
  268. }
  269. return "";
  270. }
  271. }
  272. ?>