checador.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599
  1. var msgTime = 0;
  2. var modalVisible = false;
  3. var ultimos = [];
  4. var checkInterval = null;
  5. function az(i) {
  6. return `${i < 10 ? '0' : ''}${i}`;
  7. }
  8. function init() {
  9. setInterval(function () {
  10. var current_time = new Date().getTime();
  11. var excecution_time = parseInt((current_time - started_at) / 1000);
  12. var s = new Date((server_time + excecution_time) * 1000);
  13. drawClock(az(s.getHours()), az(s.getMinutes()));
  14. drawFecha(az(s.getDate()), s.getDay(), s.getMonth(), s.getFullYear());
  15. }, 1000);
  16. }
  17. function drawClock(hora, min) {
  18. $('#min').text(min);
  19. $('#hr').text(hora);
  20. }
  21. function drawFecha(dd, dnum, mm, yyyy) {
  22. var meses = ['Ene', 'Feb', 'Mzo', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'];
  23. $('#fecha').text(' ' + meses[mm] + ' ' + dd);
  24. $('#ano').text(yyyy);
  25. }
  26. function modalTimer() {
  27. if (checkInterval === null) {//no es error de internet
  28. setTimeout(function () {
  29. $(".sub-bloque ").addClass("d-none");
  30. $("#registro").removeClass("d-none");
  31. $("#cve").focus();
  32. }
  33. , 7000 + msgTime);
  34. }
  35. }
  36. //--Sin conexión de internet ---
  37. function checadorAlive() {
  38. if (checkInterval == null) {
  39. checkInterval = setInterval(isAlive, 2500);
  40. }
  41. }
  42. function isAlive() {
  43. var alive = false;
  44. try {
  45. $.ajax({
  46. url: 'checador_alive.php',
  47. type: 'POST',
  48. dataType: 'json',
  49. async: false,
  50. timeout: 500,/*ms*/
  51. success: function (result) {
  52. if (result["ok"] != "" && result["ok"] !== undefined) {
  53. cambiaVista('.sub-bloque', '#registro');
  54. $('#db-error').text(result.error);
  55. $("#cve").focus();
  56. alive = true;
  57. clearInterval(checkInterval);
  58. checkInterval = null;
  59. }
  60. },
  61. error: function (jqXHR, textStatus, errorThrown) {
  62. console.log("Sin internet");
  63. }
  64. });//ajax*/
  65. } catch (e) {
  66. console.log("error! ", e);
  67. }
  68. return alive;
  69. }
  70. //--Fin sin conexión de internet ---
  71. function cambiaVista(objHide, objShow) {
  72. $(objHide).addClass("d-none");
  73. $(objShow).removeClass("d-none");
  74. }
  75. function showAviso(avisos) {
  76. cambiaVista('#registro', '#avisos');
  77. const lista = document.querySelector('#lista-avisos');
  78. lista.innerHTML = '';
  79. avisos.forEach(({ aviso_texto: texto }) => {
  80. const li = document.createElement('li');
  81. li.innerHTML = texto;
  82. lista.appendChild(li);
  83. });
  84. }
  85. /*
  86. $('#formaChecador').on('submit', function (e) {
  87. e.preventDefault();
  88. var clave = $("#cve").val();
  89. console.log("clave: ", clave);
  90. $.ajax({
  91. url: 'checador_action.php',
  92. type: 'POST',
  93. dataType: 'json',
  94. data: { cve: $("#cve").val(), facultad: $("#facultad_id").val() },
  95. timeout: 3500,
  96. success: function (result) {
  97. if ((result?.error ?? "") != "") {
  98. console.log(result["error"]);
  99. // avisos
  100. // alert("here")
  101. if (result.nombre != undefined && result.ok == undefined) {
  102. showAviso(result.avisos);
  103. return
  104. cambiaVista('#registro', '#result_no');
  105. $("#nombre-profesor").text(result["nombre"]);
  106. $('#result_no .clave').text(clave);
  107. $("#last-error").text(result["error"]);
  108. }
  109. else if(result.nombre == undefined) {
  110. cambiaVista('#registro', '#not_in_db');
  111. $('#clave-no-encontrada').html(clave);
  112. } else
  113. cambiaVista('#registro', '#internet');
  114. return;
  115. }
  116. $("#list-result").find(".mat-desc").html("");
  117. $("#list-result").find(".mat-fecha").html("");
  118. $("#list-result").find(".mat-salon").html("");
  119. $("#list-result").find(".mat-gpo").html("");
  120. $("#nombre").html(result["nombre"]);
  121. var rows = $("#list-result > li").length;//limpia tabla actual
  122. var resultRows = 0;
  123. //nuevas
  124. if (result["result"] !== undefined && result["result"] != null) resultRows += result["result"].length;
  125. //viejas
  126. if (result["asistencias"] !== undefined && result["asistencias"] != null) resultRows += result["asistencias"].length;
  127. if (rows > resultRows) {//sobran
  128. //borrar renglones extra (rows - result.length) pero dejar al menos 1
  129. while (rows > resultRows && rows > 1) {
  130. $("#list-result li:last-child").remove();
  131. rows--;
  132. }
  133. } else {//faltan, clonar
  134. for (var i = rows; i < resultRows; i++) {
  135. $("#list-result li:first-child").clone(true).appendTo("#list-result");
  136. }
  137. }
  138. //----------
  139. var retardo = false;
  140. //hay elementos checado nuevo?
  141. if (result["result"] !== undefined && result["result"] != null && result["result"].length != 0) {
  142. cambiaVista('#registro', '#result_ok');
  143. $("#list-result").children().each(function (index) {
  144. if (index < result["result"].length) {//llenar info
  145. if (result["result"][index]["grupo"] != "") {
  146. if (result["result"][index]["retardo"]) {
  147. retardo = true;
  148. } else {
  149. retardo = false;
  150. }
  151. $(this).find(".mat-gpo").html("<b>Grupo:</b> " + result["result"][index]["grupo"]);
  152. }
  153. $(this).find(".mat-desc").html(result["result"][index]["materia"]);
  154. $(this).find(".mat-fecha").html("Inicia " + result["result"][index]["hora_inicio"]);
  155. if (result["result"][index]["salon"] != "")
  156. $(this).find(".mat-salon").html("<b>Salón:</b> " + result["result"][index]["salon"]);
  157. //else $(this).find(".mat-salon").html("");
  158. }
  159. });
  160. }
  161. var texto = "";
  162. //hay elementos checado anterior?
  163. if (result["asistencias"] !== undefined && result["asistencias"] != null && result["asistencias"].length != 0) {
  164. cambiaVista('#registro', '#result_ok');
  165. $("#list-result").children().each(function (index) {
  166. if (index < result["asistencias"].length) {//llenar info
  167. if (result["asistencias"][index]["grupo"] != "") {
  168. if (result["asistencias"][index]["retardo"]) {
  169. retardo = true;
  170. } else {
  171. retardo = false;
  172. }
  173. $(this).find(".mat-gpo").html("<b>Grupo:</b> " + result["asistencias"][index]["grupo"]);
  174. }
  175. $(this).find(".mat-desc").html(result["asistencias"][index]["materia"]);
  176. $(this).find(".mat-fecha").html("Inicia " + result["asistencias"][index]["hora_inicio"]);
  177. texto = "<span style=font-size:50%>" +
  178. "Ya estaba registrada" +
  179. "</span>"
  180. if (result["asistencias"][index]["salon"] !== undefined && result["asistencias"][index]["salon"] != "")
  181. $(this).find(".mat-salon").html("<b>Salón:</b> " + result["asistencias"][index]["salon"]);
  182. }
  183. });
  184. }
  185. console.log(texto);
  186. if (retardo) {
  187. $("#estado").find("img").prop("src", "imagenes/retardo.svg");
  188. $("#estado").find("h2").text("Retardo").removeClass("text-success text-blue").addClass("text-warning");
  189. } else {
  190. $("#estado").find("img").prop("src", "imagenes/asistencia.svg");
  191. if (texto == "")
  192. $("#estado").find("h2").text("Asistencia").removeClass("text-warning text-blue").addClass("text-success");
  193. else
  194. $("#estado").find("h2").html("Asistencia<br>" + texto).removeClass("text-warning text-success").addClass("text-blue");
  195. }
  196. if (result.nombre.replace(/ /g, '') == "") {
  197. // if (false) {
  198. console.log(clave)
  199. cambiaVista('#registro', '#not_in_db');
  200. $("#clave-no-encontrada").html(clave);
  201. } else if (resultRows == 0) {
  202. console.log(result)
  203. //$("#nombre-profesor").text(result["nombre"]);
  204. cambiaVista('#registro', '#result_no');
  205. }
  206. },
  207. error: function (jqXHR, textStatus, errorThrown) {
  208. cambiaVista('#registro', '#internet');
  209. $('#db-error').text(textStatus);
  210. checadorAlive();//Muestra mensaje sin internet y comienza a checar hasta que haya
  211. },
  212. complete: function (jqXHR, textStatus) {
  213. $("#cve").val('');
  214. modalTimer();
  215. }
  216. });
  217. });
  218. */
  219. document.querySelector('#formaChecador').addEventListener('submit', async (e) => {
  220. e.preventDefault();
  221. const clave = document.querySelector('#cve');
  222. if (clave.value == '') {
  223. clave.focus(); return;
  224. }
  225. const data = new FormData();
  226. data.append('cve', clave.value);
  227. // try {
  228. const result = await fetch('https://checadores.lci.ulsa.mx/action_checador.php', {
  229. method: 'POST',
  230. body: data
  231. }).then(response => response.json());
  232. if (!result.ok) {
  233. function not_int_db(clave) {
  234. cambiaVista('#registro', '#not_in_db');
  235. document.querySelector('#clave-no-encontrada').innerHTML = clave;
  236. }
  237. function not_has_horario(nombre_profesor, from = '#registro') {
  238. cambiaVista(from, '#result_no');
  239. document.querySelector('#nombre-profesor').innerHTML = nombre_profesor;
  240. }
  241. switch (result.failure) {
  242. case 'profesor':
  243. not_int_db(clave.value);
  244. break;
  245. case 'horario':
  246. let from;
  247. if (result.avisos.length > 0) {
  248. await show_avisos(result.avisos)
  249. from = '#avisos';
  250. }
  251. else
  252. from = '#registro';
  253. not_has_horario(result.nombre, from);
  254. break;
  255. default:
  256. alert('La clave no es válida');
  257. location.reload();
  258. }
  259. setTimeout(() => {
  260. location.reload();
  261. }, 5000);
  262. return;
  263. }
  264. function show_avisos(avisos) {
  265. return new Promise(resolve => {
  266. if (avisos.length == 0) {
  267. resolve();
  268. return;
  269. }
  270. const lista_avisos = document.querySelector('#lista-avisos');
  271. avisos.forEach(aviso => lista_avisos.innerHTML += `<p>${aviso}</p><hr>`);
  272. cambiaVista('#registro', '#avisos');
  273. //$('#btn-aceptar-avisos').focus();
  274. document.querySelector('#btn-aceptar-avisos').addEventListener('click', () => {
  275. lista_avisos.innerHTML = '';
  276. resolve();
  277. });
  278. });
  279. }
  280. function show_asistencia(nombre, horarios, from) {
  281. cambiaVista(from, '#result_ok');
  282. document.querySelector('#nombre').innerHTML = nombre;
  283. const list_result = document.querySelector('#list-result');
  284. const li_facultad_nombre = list_result.children[0];
  285. const li_element = list_result.children[1];
  286. list_result.innerHTML = '';
  287. // foreach key is facultad (string), value
  288. for (let facultad_nombre in horarios) {
  289. let facultad = li_facultad_nombre.cloneNode(true);
  290. facultad.innerHTML = facultad_nombre;
  291. facultad = list_result.appendChild(facultad);
  292. horarios[facultad_nombre].forEach(horario => {
  293. console.log(horario);
  294. let li = li_element.cloneNode(true);
  295. li = list_result.appendChild(li);
  296. li.querySelector(".mat-desc").innerHTML = horario.materia;
  297. li.querySelector(".mat-fecha").innerHTML = `Inicia ${horario.horario_hora.slice(0, -3)}`;
  298. li.querySelector(".salon").innerHTML = horario.salon;
  299. li.querySelector(".mat-gpo").innerHTML = horario.horario_grupo;
  300. })
  301. }
  302. }
  303. function show_duplicadas(nombre, horarios, from) {
  304. show_asistencia(nombre, horarios, from);
  305. texto = `<span style=font-size:50%>
  306. Ya estaba registrada
  307. </span>`
  308. document.querySelector('#estado').querySelector('img').src = 'imagenes/asistencia.svg';
  309. $("#estado").find(".text-big").html("Asistencia<br>" + texto).removeClass("text-warning text-success").addClass("text-blue");
  310. const estado = document.querySelector('#estado');
  311. const h2 = estado.querySelector('.text-big');
  312. h2.innerHTML = `Asistencia<br>${texto}`;
  313. h2.classList.remove('text-warning', 'text-success');
  314. }
  315. function show_retardos(nombre, horarios, from) {
  316. show_asistencia(nombre, horarios, from);
  317. texto = `Retardo`;
  318. const estado = document.querySelector('#estado');
  319. const h2 = estado.querySelector('#asistencia');
  320. h2.innerHTML = `Retardo`;
  321. h2.classList.remove('text-success', 'text-blue');
  322. h2.classList.add('text-warning');
  323. estado.querySelector('img').src = 'imagenes/retardo.svg';
  324. }
  325. const { horarios, duplicadas, avisos } = result;
  326. const { profesor_nombre } = result.profesor;
  327. let retardos = {}, asistencia = {};
  328. // if any horario has retardo = true horarios is an object with facultad as key
  329. if (Object.values(horarios).some(horario => horario.some(h => h.registro_retardo)))
  330. retardos = horarios;
  331. // if any horario has duplicada = true horarios is an object with facultad as key
  332. else
  333. asistencia = horarios;
  334. console.log(retardos, asistencia, avisos, duplicadas);
  335. // Mostrar avisos
  336. await show_avisos(avisos);
  337. const from = avisos.length > 0 ? '#avisos' : '#registro';
  338. // IF DUPLICADAS HAS ELEMENTS (JSON OBJECT)
  339. if (Object.keys(duplicadas).length > 0)
  340. show_duplicadas(profesor_nombre, duplicadas, from);
  341. else if (Object.keys(retardos).length > 0)
  342. show_retardos(profesor_nombre, retardos, from);
  343. else
  344. show_asistencia(profesor_nombre, asistencia, from);
  345. // setTimeout(() => {
  346. // location.reload();
  347. // }, 5000);
  348. /*} catch (error) {
  349. console.log(error);
  350. cambiaVista('.sub-bloque', '#internet');
  351. checadorAlive(); //Muestra mensaje sin internet y comienza a checar hasta que haya
  352. } */
  353. // finally {
  354. setTimeout(() => {
  355. location.reload();
  356. }, 5000);
  357. // }
  358. });
  359. /*
  360. async function test(type) {
  361. let url;
  362. switch (type) {
  363. case 'retardo':
  364. url = 'json/retardo.json';
  365. break;
  366. case 'duplicada':
  367. url = 'json/duplicada.json';
  368. break;
  369. case 'asistencia':
  370. url = 'json/asistencia.json';
  371. break;
  372. case 'sin_servicio':
  373. url = 'json/no-internet.json';
  374. break;
  375. case 'error':
  376. url = 'json/error.json';
  377. break;
  378. case 'internet':
  379. url = 'json/internet.json';
  380. break;
  381. case 'sin_horario':
  382. url = 'json/sin-horario.json';
  383. break;
  384. case 'clave':
  385. url = 'json/clave-no-encontrada.json';
  386. break;
  387. case 'ok':
  388. url = 'json/asistencia-aviso.json';
  389. break;
  390. case 'sin_horario_aviso':
  391. url = 'json/sin-horario-aviso.json';
  392. break;
  393. }
  394. try {
  395. const result = await fetch(url).then(response => response.json());
  396. if (!result.ok) {
  397. const clave = { value: '123456' }
  398. function not_int_db(clave) {
  399. cambiaVista('#registro', '#not_in_db');
  400. document.querySelector('#clave-no-encontrada').innerHTML = clave;
  401. }
  402. function not_has_horario(nombre_profesor, from = '#registro') {
  403. cambiaVista(from, '#result_no');
  404. document.querySelector('#nombre-profesor').innerHTML = nombre_profesor;
  405. }
  406. switch (result.failure) {
  407. case 'profesor':
  408. not_int_db(clave.value);
  409. break;
  410. case 'horario':
  411. let from;
  412. if (result.avisos.length > 0) {
  413. await show_avisos(result.avisos)
  414. from = '#avisos';
  415. }
  416. else
  417. from = '#registro';
  418. not_has_horario(result.nombre, from);
  419. break;
  420. case 'internet':
  421. cambiaVista('#registro', '#internet');
  422. break;
  423. }
  424. setTimeout(() => {
  425. location.reload();
  426. }, 5000);
  427. return;
  428. }
  429. function show_avisos(avisos) {
  430. return new Promise(resolve => {
  431. if (avisos.length == 0) {
  432. resolve();
  433. return;
  434. }
  435. const lista_avisos = document.querySelector('#lista-avisos');
  436. avisos.forEach(aviso => lista_avisos.innerHTML += `<p>${aviso}</p><hr>`);
  437. cambiaVista('#registro', '#avisos');
  438. //$('#btn-aceptar-avisos').focus();
  439. document.querySelector('#btn-aceptar-avisos').addEventListener('click', () => {
  440. lista_avisos.innerHTML = '';
  441. resolve();
  442. });
  443. });
  444. }
  445. function show_asistencia(nombre, horarios, from) {
  446. cambiaVista(from, '#result_ok');
  447. document.querySelector('#nombre').innerHTML = nombre;
  448. const list_result = document.querySelector('#list-result');
  449. const li_facultad_nombre = list_result.children[0];
  450. const li_element = list_result.children[1];
  451. list_result.innerHTML = '';
  452. // foreach key is facultad (string), value
  453. for (let facultad_nombre in horarios) {
  454. console.log(horarios[facultad_nombre]);
  455. let facultad = li_facultad_nombre.cloneNode(true);
  456. facultad.innerHTML = facultad_nombre;
  457. facultad = list_result.appendChild(facultad);
  458. horarios[facultad_nombre].forEach(horario => {
  459. let li = li_element.cloneNode(true);
  460. li = list_result.appendChild(li);
  461. li.querySelector(".mat-desc").innerHTML = horario.materia;
  462. li.querySelector(".mat-fecha").innerHTML = `Inicia ${horario.horario_hora.slice(0, -3)}`;
  463. li.querySelector(".salon").innerHTML = horario.horario_salon;
  464. li.querySelector(".mat-gpo").innerHTML = horario.horario_grupo;
  465. })
  466. }
  467. const estado = document.querySelector('#estado');
  468. estado.querySelector('img').src = 'imagenes/asistencia.svg';
  469. const h2 = estado.querySelector('.text-big');
  470. h2.innerHTML = `Asistencia registrada`;
  471. h2.classList.remove('text-warning', 'text-success', 'txt-blue');
  472. h2.classList.add('text-success');
  473. }
  474. function show_duplicadas(nombre, horarios, from) {
  475. show_asistencia(nombre, horarios, from);
  476. texto = `<span style=font-size:50%>
  477. Ya estaba registrada
  478. </span>`
  479. document.querySelector('#estado').querySelector('img').src = 'imagenes/duplicada.svg';
  480. $("#estado").find(".text-big").html("Asistencia<br>" + texto).removeClass("text-warning text-success").addClass("text-blue");
  481. const estado = document.querySelector('#estado');
  482. const h2 = estado.querySelector('.text-big');
  483. h2.innerHTML = `Asistencia<br>${texto}`;
  484. h2.classList.remove('text-warning', 'text-success');
  485. }
  486. function show_retardos(nombre, horarios, from) {
  487. show_asistencia(nombre, horarios, from);
  488. texto = `Retardo`;
  489. const estado = document.querySelector('#estado');
  490. const h2 = estado.querySelector('.text-big');
  491. h2.innerHTML = `Retardo`;
  492. h2.classList.remove('text-success', 'text-blue');
  493. h2.classList.add('text-warning');
  494. estado.querySelector('img').src = 'imagenes/retardo.svg';
  495. }
  496. const { horarios, duplicadas, avisos } = result;
  497. const { nombre } = result.profesor;
  498. let retardos = {}, asistencia = {};
  499. // if any horario has retardo = true horarios is an object with facultad as key
  500. if (Object.values(horarios).some(horario => horario.some(h => h.retardo)))
  501. retardos = horarios;
  502. // if any horario has duplicada = true horarios is an object with facultad as key
  503. else
  504. asistencia = horarios;
  505. console.log(retardos, asistencia, avisos, duplicadas);
  506. // Mostrar avisos
  507. await show_avisos(avisos);
  508. const from = avisos.length > 0 ? '#avisos' : '#registro';
  509. // IF DUPLICADAS HAS ELEMENTS (JSON OBJECT)
  510. if (Object.keys(duplicadas).length > 0)
  511. show_duplicadas(nombre, duplicadas, from);
  512. else if (Object.keys(retardos).length > 0)
  513. show_retardos(nombre, retardos, from);
  514. else
  515. show_asistencia(nombre, asistencia, from);
  516. // setTimeout(() => {
  517. // location.reload();
  518. // }, 5000);
  519. } catch (error) {
  520. console.log(error);
  521. cambiaVista('.sub-bloque', '#error_bd');
  522. checadorAlive(); //Muestra mensaje sin internet y comienza a checar hasta que haya
  523. }
  524. finally {
  525. setTimeout(() => {
  526. location.reload();
  527. }, 5000);
  528. }
  529. }
  530. */