horarios.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
  1. <?php
  2. /*
  3. idPeriodo: identificador del periodo a consultar (obligatorio, número entero)
  4. claveFacultad: clave de la facultad a consultar (opcional, cadena)
  5. claveCarrera: clave de la carrera a consultar (opcional, cadena)
  6. claveProfesor: clave del empleado a consultar (opcional, cadena)
  7. fecha: fecha de la clase (opcional, cadena en formato yyyy-MM-dd)
  8. */
  9. ini_set('display_errors', 1);
  10. ini_set('display_startup_errors', 1);
  11. ini_set('post_max_size', 1);
  12. ini_set('max_execution_time', 8*60);
  13. error_reporting(E_ALL);
  14. date_default_timezone_set('America/Mexico_City');
  15. $ruta = "../";
  16. $ruta_superior = dirname(__DIR__);
  17. require_once $ruta_superior."/include/bd_pdo_rest.php";
  18. require_once __DIR__."/token.php";
  19. require_once __DIR__."/LogCambios.php";
  20. //--------------ACTUALIZA HORARIOS--------------------------
  21. if(!empty($_GET["fecha"])){
  22. $hoy = $_GET["fecha"];
  23. }else{
  24. $hoy = date("Y-m-d");
  25. }
  26. $dia_hoy = date("w", strtotime($hoy));
  27. function compareByHash($a, $b) {
  28. return strcmp($a['hash'], $b['hash']);
  29. }
  30. $debug = false;
  31. if(isset($_GET["debug"])){
  32. $debug = true;
  33. print_r( $db->querySingle('select now()'));
  34. }
  35. $periodo_sgu_old = 0;
  36. $log_desc = "";
  37. /*$cambiocarreras_rs = $db->query('SELECT CLAVE_MATERIA, clave_carrera FROM materia join carrera using(carrera_id)');
  38. function getCarrera($claveBuscar){
  39. global $cambiocarreras_rs;
  40. $i = array_search($claveBuscar, array_column($cambiocarreras_rs, 'clave_materia'));
  41. if($i>=0)
  42. return $cambiocarreras_rs[$i]["clave_carrera"];
  43. return $cambiocarreras_rs[0]["clave_carrera"];
  44. }*/
  45. //------------------ACTUALIZA SALONES----------------------
  46. $pag = "https://portal.ulsa.edu.mx/servicios/AuditoriaAsistencialRest/AuditoriaAsistencialService.svc/auditoriaAsistencial/catalogos/espacios/seleccionar";
  47. $curl = curl_init();
  48. curl_setopt_array($curl, [
  49. CURLOPT_URL => $pag,
  50. CURLOPT_RETURNTRANSFER => true,
  51. //CURLOPT_ENCODING => "",
  52. //CURLOPT_MAXREDIRS => 10,
  53. // CURLOPT_TIMEOUT => 0,
  54. //CURLOPT_CUSTOMREQUEST => "POST",
  55. CURLOPT_POSTFIELDS => json_encode([]),
  56. CURLOPT_HTTPHEADER => [
  57. "token: ".$token,
  58. "username: SGU_APSA_AUD_ASIST",
  59. "Content-Type: application/json",
  60. 'Transfer-Encoding: chunked'
  61. ],
  62. ]);
  63. $response = curl_exec($curl);
  64. $err = curl_error($curl);
  65. curl_close($curl);
  66. if ($err)
  67. die("cURL Error #:$err");
  68. $salonesData = json_decode($response, true);
  69. //$salonesTotal_rs = $db->count('salon');
  70. $salonesTotal_rs = $db->where('salon_id', 0, '>')->count('salon');
  71. echo "$salonesTotal_rs tiene " . count($salonesData) . " salones<br>";
  72. //if($salonesTotal_rs < count($salonesData)){//faltan salones en BD
  73. $salones_rs = $db->query('SELECT id_espacio_sgu, salon FROM salon');
  74. //claves de espacios
  75. $arreglo_espacios = array_map(function ($item) {
  76. return $item['id_espacio_sgu'];
  77. }, $salones_rs);
  78. $arreglo_nombres = array_map(function ($item) {
  79. return $item['salon'];
  80. }, $salones_rs);
  81. foreach($salonesData as $data){
  82. if( !in_array($data["IdEspacio"], $arreglo_espacios) || !in_array($data["NombreEspacio"], $arreglo_nombres)){
  83. //Insertar espacio
  84. if($debug){
  85. echo "Espacio nuevo: ".$data["NombreEspacio"]."<br>";
  86. }else{
  87. $db->query('INSERT INTO SALON (salon, id_espacio_sgu, id_espacio_padre) VALUES (:salon, :id, :id_padre)
  88. ON CONFLICT (id_espacio_sgu) DO UPDATE SET salon = :salon',
  89. [":salon"=>$data["NombreEspacio"], ":id"=>$data["IdEspacio"], ":id_padre"=>$data["IdEspacioPadre"]]);
  90. }
  91. }
  92. }
  93. //}
  94. // -----------------------------
  95. $pag = "https://portal.ulsa.edu.mx/servicios/AuditoriaAsistencialRest/AuditoriaAsistencialService.svc/auditoriaAsistencial/seleccionar";
  96. $elementos_bd_total = [];
  97. $elementos_sgu_total = [];
  98. $periodo_sgu_old = 0;
  99. try{
  100. $pdo->beginTransaction();
  101. $periodos_rs = $db->query('SELECT periodo_id, id_periodo_sgu, nivel_id FROM periodo WHERE :hoy BETWEEN periodo_fecha_inicio AND periodo_fecha_fin AND id_periodo_sgu != 0 ORDER BY periodo_id',
  102. [":hoy"=>$hoy]);
  103. foreach ($periodos_rs as $per){
  104. //Verifica si el día de hoy es festivo
  105. $vacacion_rs = $db->querySingle('select es_festivo(:per, :hoy)', [":per"=>$per["periodo_id"], ":hoy"=>$hoy]);
  106. if($vacacion_rs["es_festivo"]){
  107. if($debug){
  108. echo "<h3>Dia festivo en Periodo: ".$per["id_periodo_sgu"]."[".$per["periodo_id"]."]</h3>";
  109. }
  110. continue;
  111. }
  112. $carreras_rs = $db->query('SELECT c.clave_carrera, c.carrera_id FROM carrera c WHERE nivel_id = :nivel',
  113. [":nivel"=>$per["nivel_id"]]);
  114. if($debug){
  115. echo "<h3>Periodo: ".$per["id_periodo_sgu"]."[".$per["periodo_id"]."] nivel: ".$per["nivel_id"]."</h3>";
  116. //print_r($carreras_rs);
  117. }
  118. if ($periodo_sgu_old != $per["id_periodo_sgu"]){
  119. $periodo_sgu_old = $per["id_periodo_sgu"];
  120. $params = [
  121. 'idPeriodo'=>$per["id_periodo_sgu"],
  122. 'fecha'=>$hoy
  123. ];
  124. $curl = curl_init();
  125. curl_setopt_array($curl, [
  126. CURLOPT_URL => $pag,
  127. CURLOPT_RETURNTRANSFER => true,
  128. //CURLOPT_ENCODING => "",
  129. //CURLOPT_MAXREDIRS => 10,
  130. //CURLOPT_TIMEOUT => 0,
  131. //CURLOPT_CUSTOMREQUEST => "POST",
  132. CURLOPT_POSTFIELDS => json_encode($params),
  133. CURLOPT_HTTPHEADER => [
  134. "token: ".$token,
  135. "username: SGU_APSA_AUD_ASIST",
  136. "Content-Type: application/json"
  137. ],
  138. ]);
  139. $response = curl_exec($curl);
  140. $err = curl_error($curl);
  141. /*echo "Response<br>";
  142. print_r($response);*/
  143. curl_close($curl);
  144. if ($err)
  145. die("cURL Error #:$err");
  146. }
  147. $selectedData = json_decode($response, true);
  148. //claves de carreras en el periodo
  149. $arreglo_claves = array_map(function ($item) {
  150. return $item['clave_carrera'];
  151. }, $carreras_rs);
  152. //print_r($selectedData); exit();
  153. $sguHash = array();
  154. if(!empty($selectedData)){
  155. //Recorre SGU y genera hash
  156. foreach( $selectedData as $row ){
  157. if(!$row["EsMateriaPorReposicion"]){
  158. $carrera = $row["ClaveCarrera"];
  159. if(is_null($carrera) || empty($carrera))
  160. $carrera = '0';
  161. /*else{
  162. if(!$row["EsMateriaPorAsignacion"])
  163. $carrera = getCarrera($row["ClaveMateria"]);
  164. }*/
  165. $sguHash[] = array(
  166. "hash"=>( trim($row["HoraInicio"]."|".($row["NombreMateria"])."|".(trim($row["ClaveProfesor"])==""?"000000":trim($row["ClaveProfesor"]))."|".$row["IdEspacio"]."|".$per["periodo_id"]) ),
  167. "data"=>$row,
  168. "per"=>$per["periodo_id"]
  169. );
  170. }else{//reposición
  171. <<<<<<< HEAD
  172. if(in_array($row["ClaveCarrera"] , $arreglo_claves)){
  173. //busca yyyy-mm-dd hh:mm:ss en la cadena
  174. if (preg_match("/\d{4}-\d{2}-\d{2} de \d{2}:\d{2}:\d{2}/", $row["Observaciones"], $matches)) {
  175. $fecha_orig = str_replace(" de", "", $matches[0]);
  176. $fecha_nueva = $row["FechaStr"]." ".$row["HoraInicio"];
  177. $hora_fin_nueva = $row["HoraFin"];
  178. if($debug){
  179. echo "<br>SELECT * FROM fi_reposicion_sgu('$fecha_orig', '".$hora_fin_nueva."','".$fecha_nueva."' ,'".$row["ClaveProfesor"]."', ".$per["periodo_id"].", ".$row["IdEspacio"].")";
  180. }else{
  181. $db->query('SELECT * FROM fi_reposicion_sgu(:fecha_orig, :hora_fin, :fecha_rep, :prof, :per, :salon)',
  182. [":fecha_orig"=>$fecha_orig, ":hora_fin"=>$hora_fin_nueva, ":fecha_rep"=>$fecha_nueva, ":prof"=>$row["ClaveProfesor"], ":per"=>$per["periodo_id"], ":salon"=>$row["IdEspacio"] ]);
  183. $log_desc .="SELECT * FROM fi_reposicion_sgu($fecha_orig, ".$fecha_nueva.", ".$row["ClaveProfesor"].", ".$per["periodo_id"].") ## ";
  184. }
  185. }else{
  186. if($debug)
  187. echo "No se encontró fecha y hora en: ".$row["Observaciones"]."<br>";
  188. }
  189. =======
  190. try{
  191. if(in_array($row["ClaveCarrera"] , $arreglo_claves)){
  192. //busca yyyy-mm-dd hh:mm:ss en la cadena
  193. if (preg_match("/\d{4}-\d{2}-\d{2} de \d{2}:\d{2}:\d{2}/", $row["Observaciones"], $matches)) {
  194. $fecha_orig = str_replace(" de", "", $matches[0]);
  195. $fecha_nueva = $row["FechaStr"]." ".$row["HoraInicio"];
  196. $hora_fin_nueva = $row["HoraFin"];
  197. if($debug){
  198. echo "<br>SELECT * FROM fi_reposicion_sgu('$fecha_orig', '".$hora_fin_nueva."','".$fecha_nueva."' ,'".$row["ClaveProfesor"]."', ".$per["periodo_id"].", ".$row["IdEspacio"].")";
  199. }else{
  200. $db->query('SELECT * FROM fi_reposicion_sgu(:fecha_orig, :hora_fin, :fecha_rep, :prof, :per, :salon)',
  201. [":fecha_orig"=>$fecha_orig, ":hora_fin"=>$hora_fin_nueva, ":fecha_rep"=>$fecha_nueva, ":prof"=>$row["ClaveProfesor"], ":per"=>$per["periodo_id"], ":salon"=>$row["IdEspacio"] ]);
  202. $log_desc .="SELECT * FROM fi_reposicion_sgu($fecha_orig, ".$fecha_nueva.", ".$row["ClaveProfesor"].", ".$per["periodo_id"].") ## ";
  203. }
  204. }else{
  205. if($debug)
  206. echo "No se encontró fecha y hora en: ".$row["Observaciones"]."<br>";
  207. }
  208. }
  209. }catch(Exception $e){
  210. echo "ERROR Reposición<br>".$e->getMessage();
  211. >>>>>>> 7688f1aac1824c234bc5f19b154e9ad1f4808d4f
  212. }
  213. }
  214. }
  215. unset($selectedData);
  216. }
  217. echo count($sguHash)."Total <br>";
  218. $horarios_sgu = [];
  219. /*
  220. print_r($carreras_rs);
  221. echo "<br><hr><br>";*/
  222. print_r($arreglo_claves);
  223. echo "<br><hr><br>";
  224. //$areacomun = array();
  225. foreach($sguHash as $sgu){
  226. if(in_array($sgu["data"]["ClaveCarrera"] , $arreglo_claves) /*&& !in_array($sgu["data"]["ClaveMateria"], $areacomun)*/){
  227. $horarios_sgu[] = $sgu;
  228. }
  229. }
  230. //print_r($horarios_sgu);exit();
  231. unset($sguHash);
  232. $elementos_sgu_total = array_merge($elementos_sgu_total, $horarios_sgu);
  233. //Recorre BD y genera hash
  234. $horarios_rs = $db->query('SELECT * FROM fs_horarios_hash(:dia, :periodo, :fecha)',
  235. [':dia' => $dia_hoy, ':periodo' => $per["periodo_id"], ':fecha'=>$hoy]);
  236. //echo "**** SELECT * FROM fs_horarios_hash($dia_hoy, ".$per["periodo_id"].")<br>";
  237. //usort($horarios_rs, 'compareByHash');
  238. $elementos_bd_total = array_merge($elementos_bd_total, $horarios_rs);
  239. }//foreach periodo
  240. //print_r($elementos_sgu_total);
  241. //exit();
  242. if($debug){
  243. echo "<h3>Resumen</h3>";
  244. echo "<h5>SGU [".count($elementos_sgu_total)."]</h5>";
  245. echo "<h5>BD [".count($elementos_bd_total)."]</h5>";
  246. }
  247. // Extraer los "hash" de $lista y $lista2 en arreglos separados
  248. $hashes_sgu = array_column($elementos_sgu_total, 'hash');
  249. $hashes_bd = array_column($elementos_bd_total, 'hash');
  250. //print_r($elementos_sgu_total);
  251. //------------------
  252. // Encontrar los "hash" que están en $sgu pero no están en $bd
  253. $hashes_no_en_sgu = array_diff($hashes_bd, $hashes_sgu);
  254. if($debug) echo "hashes_no_en_sgu ".count($hashes_no_en_sgu)."<br>";
  255. if(count($hashes_no_en_sgu)>0){
  256. // Ahora puedes obtener los elementos completos que cumplen la condición original
  257. $elementos_no_en_sgu = array_filter($elementos_bd_total, function ($item) use ($hashes_no_en_sgu) {
  258. return in_array($item['hash'], $hashes_no_en_sgu);
  259. });
  260. if($debug){
  261. print_r($elementos_no_en_sgu);
  262. echo "Sobran ".count($elementos_no_en_sgu)." en BD<br>";
  263. }
  264. //Update fecha_fin
  265. $log_desc = "";
  266. foreach($elementos_no_en_sgu as $row){
  267. <<<<<<< HEAD
  268. if($debug){
  269. echo "<br>SELECT * FROM fu_horario_deshabilita(".$row["horario_id"].");";
  270. }else{
  271. $db->query('SELECT * FROM fu_horario_deshabilita(:horario)', [":horario"=>$row["horario_id"]]);
  272. $log_desc .="SELECT * FROM fu_horario_deshabilita(".$row["horario_id"].") ## ";
  273. =======
  274. try{
  275. if($debug){
  276. echo "<br>SELECT * FROM fu_horario_deshabilita(".$row["horario_id"].");";
  277. }else{
  278. $db->query('SELECT * FROM fu_horario_deshabilita(:horario)', [":horario"=>$row["horario_id"]]);
  279. $log_desc .="SELECT * FROM fu_horario_deshabilita(".$row["horario_id"].") ## ";
  280. }
  281. }catch(Exception $e){
  282. echo "ERROR horario deshabilita<br>".$e->getMessage();
  283. >>>>>>> 7688f1aac1824c234bc5f19b154e9ad1f4808d4f
  284. }
  285. }
  286. if(!$debug && !empty($log_desc)){
  287. $log = new LogCambios(__DIR__."/log/");
  288. $log->appendLog($log_desc);
  289. }
  290. }
  291. // Encontrar los "hash" que están en $sgu pero no están en $bd
  292. $hashes_no_en_bd = array_diff($hashes_sgu, $hashes_bd);
  293. //echo "hashes_no_en_bd ".count($hashes_no_en_bd)."<br>";
  294. if(count($hashes_no_en_bd)>0){
  295. // Ahora puedes obtener los elementos completos que cumplen la condición original
  296. $elementos_no_en_bd = array_filter($elementos_sgu_total, function ($item) use ($hashes_no_en_bd) {
  297. return in_array($item['hash'], $hashes_no_en_bd);
  298. });
  299. if($debug){
  300. echo "<br>Faltan ".count($elementos_no_en_bd)." en BD<br>";
  301. print_r($elementos_no_en_bd); echo "<br>";
  302. }
  303. //Inserts
  304. foreach($elementos_no_en_bd as $row){
  305. if($row["data"]["ClaveMateria"] == "-")
  306. $row["data"]["ClaveMateria"] = "";
  307. if($debug){
  308. echo "<br>SELECT * FROM fi_horario($dia_hoy, '".$row["data"]["HoraInicio"]."','".$row["data"]["HoraFin"]."','"
  309. .$row["data"]["ClaveDependencia"]."','"
  310. .$row["data"]["ClaveCarrera"]."','"
  311. .$row["data"]["NombreMateria"]."','"
  312. .$row["data"]["ClaveMateria"]."','"
  313. .$row["data"]["ClaveProfesor"]."','"
  314. .$row["data"]["NombreProfesor"]."','"
  315. .$row["data"]["CorreoElectronico"]."','"
  316. .$row["data"]["Grupo"]."',"
  317. .$row["data"]["IdEspacio"].","
  318. .$row["per"].");";
  319. if($row["data"]["EsMateriaPorAsignacion"]){ echo " ***Asignacion directa***";}
  320. }else{
  321. $horario_new_rs = $db->querySingle('SELECT * FROM fi_horario(:hoy, :ini, :fin, :dep, :carr, :nom_mat, :cve_mat, :cve_prof, :nom_prof, :correo, :gpo, :espacio, :periodo)',
  322. [":hoy"=>$dia_hoy,
  323. ":ini"=>$row["data"]["HoraInicio"],
  324. ":fin"=>$row["data"]["HoraFin"],
  325. ":dep"=>$row["data"]["ClaveDependencia"],
  326. ":carr"=>$row["data"]["ClaveCarrera"],
  327. ":nom_mat"=>$row["data"]["NombreMateria"],
  328. ":cve_mat"=>$row["data"]["ClaveMateria"],
  329. ":cve_prof"=>$row["data"]["ClaveProfesor"]==""?"000000":$row["data"]["ClaveProfesor"],
  330. ":nom_prof"=>$row["data"]["NombreProfesor"],
  331. ":correo"=>$row["data"]["CorreoElectronico"],
  332. ":gpo"=>$row["data"]["Grupo"],
  333. ":espacio"=>$row["data"]["IdEspacio"],
  334. ":periodo"=>$row["per"]
  335. ]
  336. );
  337. //echo $horario_new_rs["fi_horario"]."<br>";
  338. if($horario_new_rs["fi_horario"] > 0){
  339. if($row["data"]["EsMateriaPorAsignacion"]){
  340. $matasig_rs = $db->querySingle('SELECT * FROM fi_materia_asignacion(:hor,:mat,:carr, :prof)',
  341. [":hor"=>$horario_new_rs["fi_horario"],
  342. ":mat"=>$row["data"]["NombreMateria"],
  343. ":carr"=>$row["data"]["Carrera"],
  344. ":prof"=>$row["data"]["NombreProfesor"]
  345. ]
  346. );
  347. }
  348. $log_desc .="SELECT * FROM fi_horario($dia_hoy, '".$row["data"]["HoraInicio"]."','".$row["data"]["HoraFin"]."','"
  349. .$row["data"]["ClaveDependencia"]."','"
  350. .$row["data"]["ClaveCarrera"]."','"
  351. .$row["data"]["NombreMateria"]."','"
  352. .$row["data"]["ClaveMateria"]."','"
  353. .$row["data"]["ClaveProfesor"]."','"
  354. .$row["data"]["NombreProfesor"]."','"
  355. .$row["data"]["CorreoElectronico"]."','"
  356. .$row["data"]["Grupo"]."',"
  357. .$row["data"]["IdEspacio"]."); [ID=".$horario_new_rs["fi_horario"]."] ##";
  358. }
  359. }
  360. }
  361. if(!$debug && !empty($log_desc)){
  362. $log = new LogCambios(__DIR__."/log/");
  363. $log->appendLog($log_desc);
  364. }
  365. }
  366. $stmt = null; // cierra conexion
  367. if($debug) {
  368. echo "<br><br><hr><br><br>";
  369. usort($elementos_sgu_total, 'compareByHash');
  370. usort($elementos_bd_total, 'compareByHash');
  371. echo "<table><tr>";
  372. echo "<td valign='top'>";
  373. echo "<h5>SGU [".count($elementos_sgu_total)."]</h5>";
  374. foreach($elementos_sgu_total as $sgu){
  375. echo $sgu["hash"]."<br>";
  376. }
  377. echo "</td>";
  378. echo "<td valign='top'>";
  379. echo "<h5>BD [".count($elementos_bd_total)."]</h5>";
  380. foreach($elementos_bd_total as $sgu){
  381. echo $sgu["hash"]." [".$sgu["horario_id"]."]<br>";
  382. }
  383. echo "</td>";
  384. echo "</tr></table>";
  385. }else{
  386. $pdo->commit();
  387. echo "Commit";
  388. }
  389. } catch(PDOException $e) {
  390. echo "Error";
  391. "ERROR BD! ".$e->getMessage();
  392. $pdo->rollBack();
  393. if(!$debug){
  394. $log = new LogCambios(__DIR__."/log/");
  395. $log->appendLog("ERROR BD! ".$e->getMessage());
  396. }
  397. print_r($e->getMessage());
  398. } catch(Exception $e2){
  399. echo "Error";
  400. print_r($e2->getMessage());
  401. }
  402. ?>