horariogrupo_update.php 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670
  1. <?php
  2. /* AJAX
  3. * Selecciona los datos de la carrera
  4. * Recibe:
  5. * id - ID de grupo,
  6. * json
  7. * Return:
  8. * resultado o cadena de error
  9. */
  10. require_once("../../include/constantes.php");
  11. require_once("../../include/nocache.php");
  12. require_once("../../include/bd_pdo.php");
  13. require_once("../../include/util.php");
  14. require_once("../include/validacionesHorario.php");
  15. require_once("../../classes/ValidaSesion.php");
  16. require_once("../classes/LogActividad.php");//die on error
  17. function in_arrayAsociativo($busca, $arreglo, $key ){
  18. for($i = 0; $i < count($arreglo); $i++){
  19. if($arreglo[$i][$key] == $busca){
  20. return true;
  21. }
  22. }
  23. return false;
  24. }
  25. function pos_arrayAsociativo($busca, $arreglo, $key ){
  26. for($i = 0; $i < count($arreglo); $i++){
  27. if($arreglo[$i][$key] == $busca){
  28. return $i;
  29. }
  30. }
  31. return -1;
  32. }
  33. function in_arrayProfesoresHorario($busca, $arreglo, $key, $sub=false ){
  34. for($i = 0; $i < count($arreglo); $i++){
  35. if($arreglo[$i][$key] == $busca && ((!$sub && ($arreglo[$i]["submateria"] == "" || $arreglo[$i]["submateria"] == 0) ) || ($sub == true && intval($arreglo[$i]["submateria"]) > 0 ))){
  36. return true;
  37. }
  38. }
  39. return false;
  40. }
  41. function in_arraySubmateriaProfesoresHorario($busca1, $busca2, $arreglo, $key1, $key2){
  42. for($i = 0; $i < count($arreglo); $i++){
  43. if($arreglo[$i][$key1] == $busca1 && $arreglo[$i][$key2] == $busca2){
  44. return true;
  45. }
  46. }
  47. return false;
  48. }
  49. function pos_arraySubmateriaProfesoresHorario($busca1, $busca2, $arreglo, $key1, $key2){
  50. for($i = 0; $i < count($arreglo); $i++){
  51. if($arreglo[$i][$key1] == $busca1 && $arreglo[$i][$key2] == $busca2){
  52. return $i;
  53. }
  54. }
  55. return -1;
  56. }
  57. function in_arrayProfesoresNuevo($busca, $arreglo, $key2, $key1, $sub=false ){
  58. for($i = 0; $i < count($arreglo); $i++){
  59. if($arreglo[$i][$key2] == $busca[$key1] && ((!$sub && ($busca["submateria"] == "" || $busca["submateria"] == 0) ) || ($sub == true && intval($busca["submateria"]) > 0 ))){
  60. return true;
  61. }
  62. }
  63. return false;
  64. }
  65. function in_arraySubmateriaNueva($busca, $arreglo, $key = "submateria", $activa=true ){
  66. for($i = 0; $i < count($arreglo); $i++){
  67. if($arreglo[$i][$key] == $busca && $arreglo[$i]["activa"] == $activa){
  68. return true;
  69. }
  70. }
  71. return false;
  72. }
  73. function submateriaTieneProfesor($sub_id, $profesoresArr){
  74. foreach($profesoresArr as $prof){
  75. if(intval($prof["submateria"]) == intval($sub_id)){
  76. return true;
  77. }
  78. }
  79. return false;
  80. }
  81. $ok_tmp = "";
  82. //--- Objeto para validar usuario. El id de usuario lo lee desde sesión
  83. $objSesion = new ValidaSesion($pdo, 51, APSA);
  84. if(!$objSesion->tieneAcceso() || !$objSesion->puedeEditar()){
  85. $return["error"] = "Error! No tienes permisos para realizar esta acción.";
  86. }else if(!isset($_POST["json"])){
  87. $return["error"] = "Error! No se recibió la información del grupo.";
  88. }else{
  89. //$grupo = filter_input(INPUT_POST, "id", FILTER_SANITIZE_NUMBER_INT);//limpia texto
  90. $move = filter_input(INPUT_POST, "move", FILTER_SANITIZE_NUMBER_INT);//limpia texto
  91. $clase = json_decode($_POST["json"], true);
  92. $submateria = $clase["submaterias"];
  93. $return["error"] = "";
  94. $return["debug"] = "";
  95. try {
  96. $pdo->beginTransaction();
  97. $error = false;
  98. $arregloQuery = array();
  99. $grupo = $clase["grupo"];
  100. if(!isset($clase["vinculos"]) || count($clase["vinculos"]) == 0){
  101. //---- Valida que no haya conflicto de horas ----------
  102. $errorTxt = validaConflictoHoras($pdo, $clase["grupo"], $clase["dia"], $clase["hora"], $clase["materia"], $clase["materia_nombre"], fechaGuion($clase["fecha_inicial"]), fechaGuion($clase["fecha_final"]), $clase["duracion"]);
  103. if($errorTxt != ""){
  104. $return["error"] = $errorTxt;
  105. $return["json"] = json_encode($return);
  106. $return["reload"] = true;
  107. echo json_encode($return);
  108. exit();
  109. }
  110. //---- Valida que no haya conflicto de salones ----------
  111. $errorTxt = validaConflictoSalon($pdo, $clase["grupo"], $clase["dia"], $clase["hora"], $clase["materia"], $clase["materia_nombre"], fechaGuion($clase["fecha_inicial"]), fechaGuion($clase["fecha_final"]), $clase["duracion"], $clase["salon"], $clase["profesores"], $clase["submaterias"]);
  112. if($errorTxt != ""){
  113. $return["error"] = $errorTxt;
  114. $return["json"] = json_encode($return);
  115. $return["reload"] = true;
  116. echo json_encode($return);
  117. exit();
  118. }
  119. //---- Valida que no haya conflicto de profesores ----------
  120. $errorTxt = validaConflictoProfesor($pdo, $clase["grupo"], $clase["dia"], $clase["hora"], $clase["materia"], $clase["materia_nombre"], fechaGuion($clase["fecha_inicial"]), fechaGuion($clase["fecha_final"]), $clase["duracion"], $clase["profesores"], $clase["submaterias"], $clase["tipo"]);
  121. if($errorTxt != ""){
  122. $return["error"] = $errorTxt;
  123. $return["json"] = json_encode($return);
  124. $return["reload"] = true;
  125. echo json_encode($return);
  126. exit();
  127. }
  128. //---- Valida que no haya conflicto de profesores con salón ----------
  129. $errorTxt = validaConflictoProfesorSalon($pdo, $clase["grupo"], $clase["dia"], $clase["hora"], $clase["materia"], $clase["salon"], $clase["salon_nombre"], fechaGuion($clase["fecha_inicial"]), fechaGuion($clase["fecha_final"]), $clase["duracion"], $clase["profesores"], $clase["submaterias"], $clase["tipo"]);
  130. if($errorTxt != ""){
  131. $return["error"] = $errorTxt;
  132. $return["json"] = json_encode($return);
  133. $return["reload"] = true;
  134. echo json_encode($return);
  135. exit();
  136. }
  137. }
  138. //Si tiene vinculos, revisa que no haya conflictos en su grupo
  139. if(count($clase["vinculos"]) > 0){
  140. foreach($clase["vinculos"] as $vinculo){
  141. $grupo = $vinculo["grupo"];
  142. //---- Valida que no haya conflicto de horas ----------
  143. $errorTxt = validaConflictoHoras($pdo, $grupo, $clase["dia"], $clase["hora"], $vinculo["materia"], $vinculo["materia_nombre"], fechaGuion($clase["fecha_inicial"]), fechaGuion($clase["fecha_final"]), $clase["duracion"], true);
  144. if($errorTxt != ""){
  145. $return["error"] = $errorTxt;
  146. $return["json"] = json_encode($return);
  147. $return["reload"] = true;
  148. echo json_encode($return);
  149. exit();
  150. }
  151. //---- Valida que no haya conflicto de salon en mismo dia hora ----------
  152. $errorTxt = validaConflictoSalon($pdo, $grupo, $clase["dia"], $clase["hora"], $vinculo["materia"], $vinculo["materia_nombre"], fechaGuion($clase["fecha_inicial"]), fechaGuion($clase["fecha_final"]), $clase["duracion"], $clase["salon"], $clase["profesores"], $clase["submaterias"], true);
  153. if($errorTxt != ""){
  154. $return["error"] = $errorTxt;
  155. $return["json"] = json_encode($return);
  156. $return["reload"] = true;
  157. echo json_encode($return);
  158. exit();
  159. }
  160. //---- Valida que no haya conflicto de profesores ----------
  161. $errorTxt = validaConflictoProfesor($pdo, $grupo, $clase["dia"], $clase["hora"], $vinculo["materia"], $vinculo["materia_nombre"], fechaGuion($clase["fecha_inicial"]), fechaGuion($clase["fecha_final"]), $clase["duracion"], $clase["profesores"], $clase["submaterias"], $clase["tipo"], true);
  162. if($errorTxt != ""){
  163. $return["error"] = $errorTxt;
  164. $return["json"] = json_encode($return);
  165. $return["reload"] = true;
  166. echo json_encode($return);
  167. exit();
  168. }
  169. //---- Valida que no haya conflicto de profesores con salón ----------
  170. $errorTxt = validaConflictoProfesorSalon($pdo, $clase["grupo"], $clase["dia"], $clase["hora"], $vinculo["materia"], $clase["salon"], $clase["salon_nombre"], fechaGuion($clase["fecha_inicial"]), fechaGuion($clase["fecha_final"]), $clase["duracion"], $clase["profesores"], $clase["submaterias"], $clase["tipo"], true);
  171. if($errorTxt != ""){
  172. $return["error"] = $errorTxt;
  173. $return["json"] = json_encode($return);
  174. $return["reload"] = true;
  175. echo json_encode($return);
  176. exit();
  177. }
  178. }
  179. }
  180. //---- Actualiza ----------
  181. if(!$error){
  182. //Actualiza Horario grupo
  183. if($clase["salon"] == "" || is_null($clase["salon"]) || !is_int($clase["salon"])){
  184. $stmt = $pdo->prepare('Select * from fu_horariogrupo(:id, :mat, :dia, :hora, NULL, :usr, :fecha_ini, :fecha_fin, :duracion)');
  185. }else{
  186. $stmt = $pdo->prepare('Select * from fu_horariogrupo(:id, :mat, :dia, :hora, :salon, :usr, :fecha_ini, :fecha_fin, :duracion)');
  187. $stmt->bindParam(":salon", $clase["salon"]);
  188. }
  189. $stmt->bindParam(":id", $clase["id_db"]);
  190. $stmt->bindParam(":dia", $clase["dia"]);
  191. $stmt->bindParam(":hora", $clase["hora"]);
  192. $stmt->bindParam(":mat", $clase["materia"]);
  193. $stmt->bindParam(":usr", $_SESSION["usuario_id"]);
  194. $fecha_tmpI = fechaGuion($clase["fecha_inicial"]);
  195. $stmt->bindParam(":fecha_ini", $fecha_tmpI);
  196. $fecha_tmpF = fechaGuion($clase["fecha_final"]);
  197. $stmt->bindParam(":fecha_fin", $fecha_tmpF);
  198. $stmt->bindParam(":duracion", $clase["duracion"]);
  199. if(!$stmt->execute()){
  200. $t = $stmt->errorInfo();
  201. $return["error"] .= "Ocurrió un error al actualizar el horario de la materia '".$clase["materia_nombre"]."'. ".$t[2];
  202. $error = true;
  203. }
  204. $stmt->closeCursor();
  205. if(intval($move) != 1){//No fue sólo movimiento
  206. //--------- NEW ---- v
  207. //Profesores de materia
  208. $stmt = $pdo->prepare('Select * from fs_profesorhorariogrupo(:id)');
  209. $stmt->bindParam(":id", $clase["id_db"]);//horario grupo id
  210. $stmt->execute();
  211. $profesor_rs = $stmt->fetchAll();//materias que están actualmente
  212. $stmt->closeCursor();
  213. foreach($profesor_rs as $profesor){//recorre actuales
  214. if(!in_arrayProfesoresHorario($profesor["Usuario_id"], $clase["profesores"], "profesor", false) && !$error){
  215. //no esta en la nueva, borra
  216. $stmt = $pdo->prepare('Select * from fd_profesorhorariogrupo(:id, :prof)');
  217. $stmt->bindParam(":id", $clase["id_db"]);
  218. $stmt->bindParam(":prof", $profesor["Usuario_id"]);
  219. if(!$stmt->execute()){
  220. $t = $stmt->errorInfo();
  221. $return["error"] .= "Ocurrió un error al remover los profesores de '".$clase["materia_nombre"]."' ".$t[2];
  222. $error = true;
  223. }
  224. $stmt->closeCursor();
  225. }
  226. }
  227. foreach($clase["profesores"] as $profesor_new){//recorre nuevos
  228. if($profesor_new["submateria"] =="" && !in_arrayProfesoresNuevo($profesor_new, $profesor_rs, "Usuario_id", "profesor", false) && !$error){
  229. //no esta en la anterior, inserta
  230. $stmt = $pdo->prepare('Select * from fi_profesorhorariogrupo(:id, :prof)');
  231. $stmt->bindParam(":id", $clase["id_db"]);
  232. $stmt->bindParam(":prof", $profesor_new["profesor"]);
  233. if(!$stmt->execute()){
  234. $t = $stmt->errorInfo();
  235. $return["error"] .= "Ocurrió un error al actualizar los profesores de '".$clase["materia_nombre"]."' ".$t[2];
  236. $error = true;
  237. }
  238. $stmt->closeCursor();
  239. }
  240. }
  241. //--Submaterias --
  242. $stmt = $pdo->prepare('Select * from fs_submateriahorariogrupo(:id) WHERE "Submateria_activa" = true; ');//se trae todas
  243. $stmt->bindParam(":id", $clase["id_db"]);//horario grupo id
  244. $stmt->execute();
  245. $submateriaOld_rs = $stmt->fetchAll();//materias que están actualmente
  246. $stmt->closeCursor();
  247. //$subInserted = "**";
  248. foreach($submateriaOld_rs as $submateriaOld){//recorre actuales
  249. $pos = pos_arrayAsociativo($submateriaOld["Submateria_id"], $clase["submaterias"], "submateria"); //$clase["submaterias"] trae todas las posibilidades
  250. if( $clase["submaterias"][$pos]["activa"] == false && !$error){
  251. //no esta activa en la nueva, borra
  252. $stmt = $pdo->prepare('Select * from fd_submateriahorariogrupo(:id, :sub)');//cambiar DELETE, cambiar fd_profesorsubmateriahorariogrupo por fd_submateriaprofesorhorariogrupo
  253. $stmt->bindParam(":id", $clase["id_db"]);
  254. $stmt->bindParam(":sub", $submateriaOld["Submateria_id"]);
  255. //$subInserted .= "Borra [".$clase["id_db"].", ".$submateriaOld["Submateria_id"]."] ";
  256. if(!$stmt->execute()){
  257. $t = $stmt->errorInfo();
  258. $return["error"] .= "Ocurrió un error al remover la submateria de '".$clase["materia_nombre"]."' ".$t[2];
  259. $error = true;
  260. }
  261. $stmt->closeCursor();
  262. }//no hay else, porque no hay update
  263. }
  264. foreach($clase["submaterias"] as $submateriaNew){//recorre nuevos
  265. //if(!in_arrayProfesoresNuevo($submateriaNew, $profesor_rs, "Usuario_id", "profesor", true) && !$error){
  266. //$subInserted.="Checa[ ".boolval($submateriaNew["activa"])." | ".pos_arrayAsociativo(intval($submateriaNew["submateria"]), $submateriaOld_rs, "Submateria_id")."]";
  267. if( boolval($submateriaNew["activa"]) == true && !in_arrayAsociativo(intval($submateriaNew["submateria"]), $submateriaOld_rs, "Submateria_id") && !$error){
  268. //Inserta submateria
  269. $query = ":id, :mat, :sub, ";
  270. if(isset($submateriaNew["fecha_inicial"]) && isset($submateriaNew["fecha_final"]) && $submateriaNew["fecha_inicial"] != "" && $submateriaNew["fecha_final"] != ""){
  271. $query .=":fecha_ini, :fecha_fin ";
  272. }else{
  273. $query .="NULL, NULL ";
  274. }
  275. //$subInserted .= "Inserta[".$clase["id_db"].", ".$submateriaNew["submateria"]."] ";
  276. $stmt = $pdo->prepare('Select * from fi_submateriahorariogrupo('.$query.')');//submateria
  277. $stmt->bindParam(":id", $clase["id_db"]);
  278. $stmt->bindParam(":mat", $clase["materia"]);
  279. $stmt->bindParam(":sub", $submateriaNew["submateria"]);
  280. if($submateriaNew["fecha_inicial"] != "" && $submateriaNew["fecha_final"] != ""){
  281. $stmt->bindParam(":fecha_ini", $submateriaNew["fecha_inicial"]);
  282. $stmt->bindParam(":fecha_fin", $submateriaNew["fecha_final"]);
  283. }
  284. if(!$stmt->execute()){
  285. $t = $stmt->errorInfo();
  286. $return["error"] .= "Ocurrió un error al insertar la submateria '".$submateriaNew["submateria_nombre"]."' ".$t[2];
  287. $error = true;
  288. }
  289. $stmt->closeCursor();
  290. }
  291. }
  292. //$subInserted .= "**";
  293. //--Profesores de submateria
  294. $stmt = $pdo->prepare('Select * from fs_submateriahorariogrupoprofesor(:id, NULL)');
  295. $stmt->bindParam(":id", $clase["id_db"]);//horario grupo id
  296. $stmt->execute();
  297. $profesor_rs = $stmt->fetchAll();//materias que están actualmente
  298. $stmt->closeCursor();
  299. foreach($profesor_rs as $profesor_old){//recorre actuales
  300. //if(!in_arrayProfesoresHorario($profesor["Usuario_id"], $clase["profesores"], "profesor", true) && !$error){
  301. if(!in_arraySubmateriaProfesoresHorario($profesor_old["Submateria_id"], $profesor_old["Usuario_id"], $clase["profesores"], "submateria" , "profesor") && !$error){
  302. //no esta en la nueva, borra
  303. $stmt = $pdo->prepare('Select * from fd_submateriaprofesorhorariogrupo(:id, :sub, :prof)');//cambiar DELETE, cambiar fd_profesorsubmateriahorariogrupo por fd_submateriaprofesorhorariogrupo
  304. $stmt->bindParam(":id", $clase["id_db"]);
  305. $stmt->bindParam(":sub", $profesor_old["Submateria_id"]);
  306. $stmt->bindParam(":prof", $profesor_old["Usuario_id"]);
  307. if(!$stmt->execute()){
  308. $t = $stmt->errorInfo();
  309. $return["error"] .= "Ocurrió un error al remover los profesores de '".$clase["materia_nombre"]."' ".$t[2];
  310. $error = true;
  311. }
  312. $stmt->closeCursor();
  313. }else{
  314. //actualiza actuales
  315. $pos = pos_arraySubmateriaProfesoresHorario($profesor_old["Submateria_id"], $profesor_old["Usuario_id"], $clase["profesores"], "submateria" , "profesor");
  316. if($pos >=0 && $profesor_old["Salon_id"] != $clase["profesores"][$pos]["salon"] ){//salones diferentes
  317. //Inserta submateria
  318. $query = ":id, :sub, :usr, ";
  319. if(isset($clase["profesores"][$pos]["salon"]) && $clase["profesores"][$pos]["salon"] != "" && $clase["profesores"][$pos]["salon"] != 0){
  320. $query .=":salon";
  321. }else{
  322. $query .="NULL";
  323. }
  324. $stmt = $pdo->prepare('Select * from fu_submateriaprofesorhorariogrupo('.$query.')');//submateria
  325. $stmt->bindParam(":id", $clase["id_db"]);
  326. $stmt->bindParam(":sub", $clase["profesores"][$pos]["submateria"]);
  327. $stmt->bindParam(":usr", $clase["profesores"][$pos]["profesor"]);
  328. if(isset($clase["profesores"][$pos]["salon"]) && $clase["profesores"][$pos]["salon"] != "" && $clase["profesores"][$pos]["salon"] != 0) $stmt->bindParam(":salon", $clase["profesores"][$pos]["salon"]);
  329. if(!$stmt->execute()){
  330. $t = $stmt->errorInfo();
  331. $return["error"] .= "Ocurrió un error al actualizar el salón de la submateria '".$profesor_old["submaterias"][$pos]["submateria_nombre"]."' ".$t[2];
  332. $error = true;
  333. }
  334. $stmt->closeCursor();
  335. }//fin existe submateria
  336. }
  337. }
  338. foreach($clase["profesores"] as $profesor_new){//recorre nuevos
  339. //if(!in_arrayProfesoresNuevo($profesor_new, $profesor_rs, "Usuario_id", "profesor", true) && !$error){
  340. if(!in_arraySubmateriaProfesoresHorario($profesor_new["submateria"], $profesor_new["profesor"], $profesor_rs, "Submateria_id" , "Usuario_id") && !$error){
  341. //inserta submateria
  342. //Buscar datos de la submateria con los del profesor
  343. //$pos = pos_arrayAsociativo($profesor_new["submateria"], $clase["submaterias"], "submateria");
  344. //if($pos >=0 ){//existe en submaterias
  345. //no esta en la anterior, inserta prof
  346. if($profesor_new["salon"] != ""){
  347. $query =":salon";
  348. }else{
  349. $query ="NULL";
  350. }
  351. $stmt = $pdo->prepare('Select * from fi_submateriahorariogrupoprofesor(:id, :mat, :sub, :prof,'. $query.')');
  352. $stmt->bindParam(":id", $clase["id_db"]);
  353. $stmt->bindParam(":mat", $clase["materia"]);
  354. $stmt->bindParam(":sub", $profesor_new["submateria"]);
  355. $stmt->bindParam(":prof", $profesor_new["profesor"]);
  356. if($profesor_new["salon"] != "") $stmt->bindParam(":salon", $profesor_new["salon"]);
  357. if(!$stmt->execute()){
  358. $t = $stmt->errorInfo();
  359. $return["error"] .= "Ocurrió un error al actualizar los profesores de submateria de '".$clase["materia_nombre"]."' ".$t[2];
  360. $error = true;
  361. }
  362. $stmt->closeCursor();
  363. //}//fin existe submateria
  364. }
  365. }
  366. //----------- FIN NEW -----^
  367. }//fin move
  368. }//no error
  369. //---Actualiza vinculos
  370. if(!$error && count($clase["vinculos"]) > 0){
  371. //$return["horariogrupo"] = array();//tmp debug
  372. //Submaterias posibles en materia original NEW
  373. $stmt = $pdo->prepare('Select * from fs_submateria(:mat, NULL)');
  374. $stmt->bindParam(":mat", $clase["materia"]);
  375. $stmt->execute();
  376. $submateriaPosibleOriginal_rs = $stmt->fetchAll();//submaterias que se pueden asignar
  377. $stmt->closeCursor();
  378. foreach($clase["vinculos"] as $vinculo){
  379. if($clase["salon"] == ""){
  380. $stmt = $pdo->prepare('Select * from fu_horariogrupo(:id, :mat, :dia, :hora, NULL, :usr, :fecha_ini, :fecha_fin, :duracion)');
  381. }else{
  382. $stmt = $pdo->prepare('Select * from fu_horariogrupo(:id, :mat, :dia, :hora, :salon, :usr, :fecha_ini, :fecha_fin, :duracion)');
  383. $stmt->bindParam(":salon", $clase["salon"]);
  384. }
  385. $stmt->bindParam(":id", $vinculo["id_db"]);
  386. $stmt->bindParam(":dia", $clase["dia"]);
  387. $stmt->bindParam(":hora", $clase["hora"]);
  388. $stmt->bindParam(":mat", $vinculo["materia"]);
  389. $stmt->bindParam(":usr", $_SESSION["usuario_id"]);
  390. $fecha_tmpI = fechaGuion($clase["fecha_inicial"]);
  391. $stmt->bindParam(":fecha_ini", $fecha_tmpI);
  392. $fecha_tmpF = fechaGuion($clase["fecha_final"]);
  393. $stmt->bindParam(":fecha_fin", $fecha_tmpF);
  394. $stmt->bindParam(":duracion", $clase["duracion"]);
  395. //$return["horariogrupo"][] = 'Select * from fu_horariogrupo('.$vinculo["id_db"].', '.$vinculo["materia"].', '.$clase["dia"].', '.$clase["hora"].', '.$clase["salon"].', '.$_SESSION["usuario_id"].', '.$fecha_tmpI.', '.$fecha_tmpF.', '.$clase["duracion"].')';
  396. if(!$stmt->execute()){
  397. $t = $stmt->errorInfo();
  398. $return["error"] .= "Ocurrió un error al actualizar el horario de la materia '".$clase["materia_nombre"]."'. ".$t[2];
  399. $error = true;
  400. }
  401. $stmt->closeCursor();
  402. // No se puede actualizar submaterias de materia vinculada porque no se conoce el ID
  403. if(intval($move) != 1){//No fue sólo movimiento
  404. //Obtiene ids de horarios vinculados
  405. //Borra profesores y submaterias
  406. if(!$error){
  407. //--------- NEW ---- v
  408. //Profesores de materia
  409. $stmt = $pdo->prepare('Select * from fs_profesorhorariogrupo(:id)');
  410. $stmt->bindParam(":id", $vinculo["id_db"]);//horario grupo id
  411. $stmt->execute();
  412. $profesor_rs = $stmt->fetchAll();//materias que están actualmente
  413. $stmt->closeCursor();
  414. foreach($profesor_rs as $profesor){//recorre actuales
  415. if(!in_arrayProfesoresHorario($profesor["Usuario_id"], $clase["profesores"], "profesor", false) && !$error){
  416. //no esta en la nueva, borra
  417. $stmt = $pdo->prepare('Select * from fd_profesorhorariogrupo(:id, :prof)');
  418. $stmt->bindParam(":id", $vinculo["id_db"]);
  419. $stmt->bindParam(":prof", $profesor["Usuario_id"]);
  420. if(!$stmt->execute()){
  421. $t = $stmt->errorInfo();
  422. $return["error"] .= "Ocurrió un error al remover los profesores de '".$vinculo["materia_nombre"]."' ".$t[2];
  423. $error = true;
  424. }
  425. $stmt->closeCursor();
  426. }
  427. }
  428. foreach($clase["profesores"] as $profesor_new){//recorre nuevos
  429. if($profesor_new["submateria"] =="" && !in_arrayProfesoresNuevo($profesor_new, $profesor_rs, "Usuario_id", "profesor", false) && !$error){
  430. //no esta en la anterior, inserta
  431. $stmt = $pdo->prepare('Select * from fi_profesorhorariogrupo(:id, :prof)');
  432. $stmt->bindParam(":id", $vinculo["id_db"]);
  433. $stmt->bindParam(":prof", $profesor_new["profesor"]);
  434. if(!$stmt->execute()){
  435. $t = $stmt->errorInfo();
  436. $return["error"] .= "Ocurrió un error al actualizar los profesores vinculados de '".$vinculo["materia_nombre"]."' ".$t[2];
  437. $error = true;
  438. }
  439. $stmt->closeCursor();
  440. }
  441. }
  442. /*
  443. //Profesores actuales de submateria vinculada
  444. $stmt = $pdo->prepare('Select * from fs_submateriahorariogrupoprofesor(:id, NULL)');
  445. $stmt->bindParam(":id", $vinculo["id_db"]);//horario grupo id
  446. $stmt->execute();
  447. $profesor_rs = $stmt->fetchAll();//profesores que están actualmente en vinculo
  448. $stmt->closeCursor();
  449. //Submaterias posibles en materia vinculada
  450. $stmt = $pdo->prepare('Select * from fs_submateria(:mat, NULL)');
  451. $stmt->bindParam(":mat", $vinculo["materia"]);//horario grupo id TODO vinculo o clase?
  452. $stmt->execute();
  453. $submateriaPosibleVinculo_rs = $stmt->fetchAll();//submaterias que se pueden asignar
  454. $stmt->closeCursor();
  455. //Submaterias en materia vinculada
  456. $stmt = $pdo->prepare('Select * from fs_submateriahorariogrupo(:id) WHERE "Submateria_activa" = true; ');
  457. $stmt->bindParam(":id", $vinculo["id_db"]);//horario grupo id
  458. $stmt->execute();
  459. $submateriaOld_rs = $stmt->fetchAll();//submaterias que están actualmente
  460. $stmt->closeCursor();
  461. //Nuevo
  462. foreach($submateriaOld_rs as $submateriaOld){//recorre actuales
  463. $pos = pos_arrayAsociativo($submateriaOld["Submateria_id"], $clase["submaterias"], "submateria"); //$clase["submaterias"] trae todas las posibilidades
  464. if( $clase["submaterias"][$pos]["activa"] == false && !$error){
  465. //no esta activa en la nueva
  466. $stmt = $pdo->prepare('Select * from fd_submateriahorariogrupo(:id, :sub)');//cambiar DELETE, cambiar fd_profesorsubmateriahorariogrupo por fd_submateriaprofesorhorariogrupo
  467. $stmt->bindParam(":id", $vinculo["id_db"]);
  468. $stmt->bindParam(":sub", $submateriaOld["Submateria_id"]);
  469. //$subInserted .= "Borra [".$clase["id_db"].", ".$submateriaOld["Submateria_id"]."] ";
  470. if(!$stmt->execute()){
  471. $t = $stmt->errorInfo();
  472. $return["error"] .= "Ocurrió un error al remover la submateria de '".$clase["materia_nombre"]."' ".$t[2];
  473. $error = true;
  474. }
  475. $stmt->closeCursor();
  476. }//no hay else, porque no hay update
  477. }
  478. foreach($clase["submaterias"] as $submateriaNew){//recorre nuevos
  479. if( boolval($submateriaNew["activa"]) == true && !in_arrayAsociativo(intval($submateriaNew["submateria"]), $submateriaOld_rs, "Submateria_id")
  480. && in_arrayAsociativo(intval($submateriaNew["submateria"]), $submateriaPosibleVinculo_rs, "Submateria_id") && !$error){
  481. //Inserta submateria
  482. $query = ":id, :mat, :sub, ";
  483. if(isset($submateriaNew["fecha_inicial"]) && isset($submateriaNew["fecha_final"]) && $submateriaNew["fecha_inicial"] != "" && $submateriaNew["fecha_final"] != ""){
  484. $query .=":fecha_ini, :fecha_fin ";
  485. }else{
  486. $query .="NULL, NULL ";
  487. }
  488. //$subInserted .= "Inserta[".$clase["id_db"].", ".$submateriaNew["submateria"]."] ";
  489. $stmt = $pdo->prepare('Select * from fi_submateriahorariogrupo('.$query.')');//submateria
  490. $stmt->bindParam(":id", $vinculo["id_db"]);
  491. $stmt->bindParam(":mat", $clase["materia"]);
  492. $stmt->bindParam(":sub", $submateriaNew["submateria"]);
  493. if($submateriaNew["fecha_inicial"] != "" && $submateriaNew["fecha_final"] != ""){
  494. $stmt->bindParam(":fecha_ini", $submateriaNew["fecha_inicial"]);
  495. $stmt->bindParam(":fecha_fin", $submateriaNew["fecha_final"]);
  496. }
  497. if(!$stmt->execute()){
  498. $t = $stmt->errorInfo();
  499. $return["error"] .= "Ocurrió un error al insertar la submateria '".$submateriaNew["submateria_nombre"]."' ".$t[2];
  500. $error = true;
  501. }
  502. $stmt->closeCursor();
  503. }
  504. }
  505. //--
  506. foreach($profesor_rs as $profesor_old){//recorre actuales en vínculo
  507. if(in_arrayAsociativo($profesor_old["Submateria_id"], $submateriaPosibleOriginal_rs, "Submateria_id") && !$error){//prof de vinculada tiene área de submateria afectada original
  508. if(!in_arrayProfesoresHorario($profesor_old["Usuario_id"], $clase["profesores"], "profesor", true)){
  509. //está en las submaterias actuales, pero no esta en la nueva, borra
  510. $stmt = $pdo->prepare('Select * from fd_submateriaprofesorhorariogrupo(:id, :sub, :prof)');//cambiar DELETE, cambiar fd_profesorsubmateriahorariogrupo por fd_submateriaprofesorhorariogrupo
  511. $stmt->bindParam(":id", $vinculo["id_db"]);
  512. $stmt->bindParam(":sub", $profesor_old["Submateria_id"]);
  513. $stmt->bindParam(":prof", $profesor_old["Usuario_id"]);
  514. if(!$stmt->execute()){
  515. $t = $stmt->errorInfo();
  516. $return["error"] .= "Ocurrió un error al remover los profesores vinculados de '".$clase["materia_nombre"]."' ".$t[2];
  517. $error = true;
  518. }
  519. $stmt->closeCursor();
  520. }//Si el profesor
  521. else{//actualiza actuales
  522. //$pos = pos_arrayAsociativo((int)$profesor_old["Submateria_id"], $clase["submaterias"], "submateria");
  523. $pos = pos_arraySubmateriaProfesoresHorario($profesor_old["Submateria_id"], $profesor_old["Usuario_id"], $clase["profesores"], "submateria" , "profesor");
  524. $return["debug"] .= "inserta sub vinculada ".$profesor_old["Submateria_id"]."[$pos]";
  525. if($pos >=0 ){//existe en submaterias
  526. //Inserta submateria
  527. $query = ":id, :sub, :usr, ";
  528. if(isset($clase["profesores"][$pos]["salon"]) && $clase["profesores"][$pos]["salon"] != "" && $clase["profesores"][$pos]["salon"] != 0){
  529. $query .=":salon";
  530. }else{
  531. $query .="NULL";
  532. }
  533. $stmt = $pdo->prepare('Select * from fu_submateriaprofesorhorariogrupo('.$query.')');//submateria
  534. $stmt->bindParam(":id", $vinculo["id_db"]);
  535. $stmt->bindParam(":sub", $clase["profesores"][$pos]["submateria"]);
  536. $stmt->bindParam(":usr", $clase["profesores"][$pos]["profesor"]);
  537. if(isset($clase["profesores"][$pos]["salon"]) && $clase["profesores"][$pos]["salon"] != "" && $clase["profesores"][$pos]["salon"] != 0) $stmt->bindParam(":salon", $clase["profesores"][$pos]["salon"]);
  538. if(!$stmt->execute()){
  539. $t = $stmt->errorInfo();
  540. $return["error"] .= "Ocurrió un error al actualizar el salón de la submateria vinculada '".$profesor_old["submaterias"][$pos]["submateria_nombre"]."' ".$t[2];
  541. $error = true;
  542. }
  543. $stmt->closeCursor();
  544. }//fin existe submateria
  545. }
  546. }
  547. }
  548. foreach($clase["profesores"] as $profesor_new){//recorre nuevos
  549. if(in_arrayAsociativo($profesor_new["submateria"], $submateriaPosibleVinculo_rs, "Submateria_id") && !$error){//prof nuevo tiene área de submateria vinculada
  550. //inserta submateria
  551. //if(!in_arrayProfesoresNuevo($profesor_new, $profesor_rs, "Usuario_id", "profesor", true) && !$error){
  552. if(!in_arraySubmateriaProfesoresHorario($profesor_new["submateria"], $profesor_new["profesor"], $profesor_rs, "Submateria_id" , "Usuario_id") && !$error){
  553. if($profesor_new["salon"] != ""){
  554. $query =":salon";
  555. }else{
  556. $query ="NULL";
  557. }
  558. $stmt = $pdo->prepare('Select * from fi_submateriahorariogrupoprofesor(:id, :mat, :sub, :prof,'. $query.')');
  559. $stmt->bindParam(":id", $vinculo["id_db"]);
  560. $stmt->bindParam(":mat", $vinculo["materia"]);
  561. $stmt->bindParam(":sub", $profesor_new["submateria"]);
  562. $stmt->bindParam(":prof", $profesor_new["profesor"]);
  563. if($profesor_new["salon"] != "") $stmt->bindParam(":salon", $profesor_new["salon"]);
  564. if(!$stmt->execute()){
  565. $t = $stmt->errorInfo();
  566. $return["error"] .= "Ocurrió un error al actualizar los profesores de submateria de '".$clase["materia_nombre"]."' ".$t[2];
  567. $error = true;
  568. }
  569. $stmt->closeCursor();
  570. }
  571. }//fin submateria
  572. }*/
  573. //----------- FIN NEW -----^
  574. }//fin horarios vinculados
  575. }//fin move
  576. }//fin foreach
  577. }//Fin vinculos
  578. if(!$error){
  579. $pdo->commit();
  580. unset($return["error"]);
  581. $return["ok"] = "El horario se guardó correctamente. ".$ok_tmp;
  582. //Inserta Log
  583. $log = new LogActividad();
  584. /*if(isset($vinculo["grupo"]))
  585. $desc_log = "Actualiza horario GrupoID[".$vinculo["grupo"]."] [".$clase["materia"]."] Nombre[".$clase["materia_nombre"]."] antes[".$clase["materia_orig"]."] Día[".$clase["dia"]."] antes[".$clase["dia_orig"]."] Hora[".$clase["hora"]."] antes[".$clase["hora_orig"]."] Duración[".$clase["duracion"]."] Fecha de inicio[".$clase["fecha_inicial"]."] Fecha de fin[".$clase["fecha_final"]."]";
  586. else*/
  587. $desc_log = "Actualiza horario GrupoID[".$clase["materia"]."] Nombre[".$clase["materia_nombre"]."] antes[".$clase["materia_orig"]."] Día[".$clase["dia"]."] antes[".$clase["dia_orig"]."] Hora[".$clase["hora"]."] antes[".$clase["hora_orig"]."] Duración[".$clase["duracion"]."] Fecha de inicio[".$clase["fecha_inicial"]."] Fecha de fin[".$clase["fecha_final"]."]";
  588. $log->appendLog($_SESSION["usuario_id"], $_SESSION["usuario_nombre"]." ".$_SESSION["usuario_apellidos"], $desc_log);
  589. //---Inserta vinculos
  590. if(count($clase["vinculos"]) > 0){
  591. foreach($clase["vinculos"] as $vinculo){
  592. $desc_log = "Actualiza horario por vínculo [".$vinculo["materia"]."] Nombre[".$vinculo["materia_nombre"]."] Día[".$clase["dia"]."] antes[".$clase["dia_orig"]."] Hora[".$clase["hora"]."] antes[".$clase["hora_orig"]."] Duración[".$clase["duracion"]."] Fecha de inicio[".$clase["fecha_inicial"]."] Fecha de fin[".$clase["fecha_final"]."]";
  593. $log->appendLog($_SESSION["usuario_id"], $_SESSION["usuario_nombre"]." ".$_SESSION["usuario_apellidos"], $desc_log);
  594. }
  595. }
  596. }else
  597. $pdo->rollBack();
  598. $stmt = null; // cierra conexion
  599. } catch(PDOException $e) {
  600. $pdo->rollBack();
  601. $return["error"] = "Ocurrió un error al insertar los datos de los horarios.".$e->getMessage();
  602. }
  603. }
  604. $return["json"] = json_encode($return);
  605. echo json_encode($return);
  606. ?>