checador.js 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628
  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. const btn = document.querySelector('#btnChecar');
  228. // remove btn
  229. btn.classList.add('disabled');
  230. // add spinner
  231. btn.insertAdjacentHTML('afterbegin', '<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>');
  232. try {
  233. const result = await fetch('action_checador.php', {
  234. method: 'POST',
  235. body: data
  236. }).then(response => response.json());
  237. if (!result.ok) {
  238. function not_int_db(clave) {
  239. cambiaVista('#registro', '#not_in_db');
  240. document.querySelector('#clave-no-encontrada').innerHTML = clave;
  241. }
  242. function not_has_horario(nombre_profesor, from = '#registro') {
  243. cambiaVista(from, '#result_no');
  244. document.querySelector('#nombre-profesor').innerHTML = nombre_profesor;
  245. }
  246. switch (result.failure) {
  247. case 'profesor':
  248. not_int_db(clave.value);
  249. break;
  250. case 'horario':
  251. let from;
  252. if (result.avisos.length > 0) {
  253. await show_avisos(result.avisos)
  254. from = '#avisos';
  255. }
  256. else
  257. from = '#registro';
  258. not_has_horario(result.nombre, from);
  259. break;
  260. default:
  261. alert('La clave no es válida');
  262. location.reload();
  263. }
  264. setTimeout(() => {
  265. location.reload();
  266. }, 5000);
  267. return;
  268. }
  269. function show_avisos(avisos) {
  270. return new Promise(resolve => {
  271. if (avisos.length == 0) {
  272. resolve();
  273. return;
  274. }
  275. const lista_avisos = document.querySelector('#lista-avisos');
  276. avisos.forEach(aviso => lista_avisos.innerHTML += `<p>${aviso}</p><hr>`);
  277. cambiaVista('#registro', '#avisos');
  278. //$('#btn-aceptar-avisos').focus();
  279. document.querySelector('#btn-aceptar-avisos').addEventListener('click', () => {
  280. lista_avisos.innerHTML = '';
  281. resolve();
  282. });
  283. });
  284. }
  285. function show_asistencia(nombre, horarios, from) {
  286. cambiaVista(from, '#result_ok');
  287. document.querySelector('#nombre').innerHTML = nombre;
  288. const list_result = document.querySelector('#list-result');
  289. const li_facultad_nombre = list_result.children[0];
  290. const li_element = list_result.children[1];
  291. list_result.innerHTML = '';
  292. // foreach key is facultad (string), value
  293. for (let facultad_nombre in horarios) {
  294. let facultad = li_facultad_nombre.cloneNode(true);
  295. facultad.innerHTML = facultad_nombre;
  296. facultad = list_result.appendChild(facultad);
  297. horarios[facultad_nombre].forEach(horario => {
  298. console.log(horario);
  299. let li = li_element.cloneNode(true);
  300. li = list_result.appendChild(li);
  301. li.querySelector(".mat-desc").innerHTML = horario.materia;
  302. li.querySelector(".mat-fecha").innerHTML = `Inicia ${horario.horario_hora.slice(0, -3)}`;
  303. li.querySelector(".salon").innerHTML = horario.salon;
  304. li.querySelector(".mat-gpo").innerHTML = horario.horario_grupo;
  305. })
  306. }
  307. const estado = document.querySelector('#estado');
  308. //estado.querySelector('img').src = 'imagenes/asistencia.svg';
  309. $('#icon_retardo').hide();
  310. $('#icon_duplicada').hide();
  311. $('#icon_asistencia').show();
  312. const h2 = estado.querySelector('.text-big');
  313. h2.innerHTML = `Asistencia registrada`;
  314. h2.classList.remove('text-warning', 'text-success');
  315. }
  316. function show_duplicadas(nombre, horarios, from) {
  317. show_asistencia(nombre, horarios, from);
  318. texto = `<span style=font-size:50%>
  319. Ya estaba registrada
  320. </span>`
  321. //document.querySelector('#estado').querySelector('img').src = 'imagenes/asistencia.svg';
  322. $('#icon_retardo').hide();
  323. $('#icon_asistencia').hide();
  324. $('#icon_duplicada').show();
  325. $("#estado").find(".text-big").html("Asistencia<br>" + texto).removeClass("text-warning text-success").addClass("text-blue");
  326. const estado = document.querySelector('#estado');
  327. const h2 = estado.querySelector('.text-big');
  328. h2.innerHTML = `Asistencia<br>${texto}`;
  329. h2.classList.remove('text-warning', 'text-success');
  330. }
  331. function show_retardos(nombre, horarios, from) {
  332. show_asistencia(nombre, horarios, from);
  333. texto = `Retardo`;
  334. const estado = document.querySelector('#estado');
  335. const h2 = estado.querySelector('.text-big');
  336. h2.innerHTML = `Retardo`;
  337. h2.classList.remove('text-success', 'text-blue');
  338. h2.classList.add('text-warning');
  339. //estado.querySelector('img').src = 'imagenes/retardo.svg';
  340. $('#icon_asistencia').hide();
  341. $('#icon_duplicada').hide();
  342. $('#icon_retardo').show();
  343. }
  344. const { horarios, duplicadas, avisos } = result;
  345. const { profesor_nombre } = result.profesor;
  346. let retardos = {}, asistencia = {};
  347. // if any horario has retardo = true horarios is an object with facultad as key
  348. if (Object.values(horarios).some(horario => horario.some(h => h.registro_retardo)))
  349. retardos = horarios;
  350. // if any horario has duplicada = true horarios is an object with facultad as key
  351. else
  352. asistencia = horarios;
  353. console.log(retardos, asistencia, avisos, duplicadas);
  354. // Mostrar avisos
  355. await show_avisos(avisos);
  356. const from = avisos.length > 0 ? '#avisos' : '#registro';
  357. // IF DUPLICADAS HAS ELEMENTS (JSON OBJECT)
  358. if (Object.keys(duplicadas).length > 0)
  359. show_duplicadas(profesor_nombre, duplicadas, from);
  360. else if (Object.keys(retardos).length > 0)
  361. show_retardos(profesor_nombre, retardos, from);
  362. else
  363. show_asistencia(profesor_nombre, asistencia, from);
  364. // setTimeout(() => {
  365. // location.reload();
  366. // }, 5000);
  367. } catch (error) {
  368. console.log(error);
  369. cambiaVista('.sub-bloque', '#internet');
  370. checadorAlive(); //Muestra mensaje sin internet y comienza a checar hasta que haya
  371. }
  372. finally {
  373. setTimeout(() => {
  374. location.reload();
  375. }, 5000);
  376. }
  377. });
  378. async function test(type) {
  379. let url;
  380. switch (type) {
  381. case 'retardo':
  382. url = 'json/retardo.json';
  383. break;
  384. case 'duplicada':
  385. url = 'json/duplicada.json';
  386. break;
  387. case 'asistencia':
  388. url = 'json/asistencia.json';
  389. break;
  390. case 'sin_servicio':
  391. url = 'json/no-internet.json';
  392. break;
  393. case 'error':
  394. url = 'json/error.json';
  395. break;
  396. case 'internet':
  397. url = 'json/internet.json';
  398. break;
  399. case 'sin_horario':
  400. url = 'json/sin-horario.json';
  401. break;
  402. case 'clave':
  403. url = 'json/clave-no-encontrada.json';
  404. break;
  405. case 'ok':
  406. url = 'json/asistencia-aviso.json';
  407. break;
  408. case 'sin_horario_aviso':
  409. url = 'json/sin-horario-aviso.json';
  410. break;
  411. }
  412. try {
  413. const result = await fetch(url).then(response => response.json());
  414. if (!result.ok) {
  415. const clave = { value: '123456' }
  416. function not_int_db(clave) {
  417. cambiaVista('#registro', '#not_in_db');
  418. document.querySelector('#clave-no-encontrada').innerHTML = clave;
  419. }
  420. function not_has_horario(nombre_profesor, from = '#registro') {
  421. cambiaVista(from, '#result_no');
  422. document.querySelector('#nombre-profesor').innerHTML = nombre_profesor;
  423. }
  424. switch (result.failure) {
  425. case 'profesor':
  426. not_int_db(clave.value);
  427. break;
  428. case 'horario':
  429. let from;
  430. if (result.avisos.length > 0) {
  431. await show_avisos(result.avisos)
  432. from = '#avisos';
  433. }
  434. else
  435. from = '#registro';
  436. not_has_horario(result.nombre, from);
  437. break;
  438. case 'internet':
  439. cambiaVista('#registro', '#internet');
  440. break;
  441. }
  442. setTimeout(() => {
  443. location.reload();
  444. }, 5000);
  445. return;
  446. }
  447. function show_avisos(avisos) {
  448. return new Promise(resolve => {
  449. if (avisos.length == 0) {
  450. resolve();
  451. return;
  452. }
  453. const lista_avisos = document.querySelector('#lista-avisos');
  454. avisos.forEach(aviso => lista_avisos.innerHTML += `<p>${aviso}</p><hr>`);
  455. cambiaVista('#registro', '#avisos');
  456. //$('#btn-aceptar-avisos').focus();
  457. document.querySelector('#btn-aceptar-avisos').addEventListener('click', () => {
  458. lista_avisos.innerHTML = '';
  459. resolve();
  460. });
  461. });
  462. }
  463. function show_asistencia(nombre, horarios, from) {
  464. cambiaVista(from, '#result_ok');
  465. document.querySelector('#nombre').innerHTML = nombre;
  466. const list_result = document.querySelector('#list-result');
  467. const li_facultad_nombre = list_result.children[0];
  468. const li_element = list_result.children[1];
  469. list_result.innerHTML = '';
  470. // foreach key is facultad (string), value
  471. for (let facultad_nombre in horarios) {
  472. console.log(horarios[facultad_nombre]);
  473. let facultad = li_facultad_nombre.cloneNode(true);
  474. facultad.innerHTML = facultad_nombre;
  475. facultad = list_result.appendChild(facultad);
  476. horarios[facultad_nombre].forEach(horario => {
  477. let li = li_element.cloneNode(true);
  478. li = list_result.appendChild(li);
  479. li.querySelector(".mat-desc").innerHTML = horario.materia;
  480. li.querySelector(".mat-fecha").innerHTML = `Inicia ${horario.horario_hora.slice(0, -3)}`;
  481. li.querySelector(".salon").innerHTML = horario.horario_salon;
  482. li.querySelector(".mat-gpo").innerHTML = horario.horario_grupo;
  483. })
  484. }
  485. const estado = document.querySelector('#estado');
  486. //estado.querySelector('img').src = 'imagenes/asistencia.svg';
  487. $('#icon_retardo').hide();
  488. $('#icon_duplicada').hide();
  489. $('#icon_asistencia').show();
  490. const h2 = estado.querySelector('.text-big');
  491. h2.innerHTML = `Asistencia registrada`;
  492. h2.classList.remove('text-warning', 'text-success', 'txt-blue');
  493. h2.classList.add('text-success');
  494. }
  495. function show_duplicadas(nombre, horarios, from) {
  496. show_asistencia(nombre, horarios, from);
  497. texto = `<span style=font-size:50%>
  498. Ya estaba registrada
  499. </span>`
  500. //document.querySelector('#estado').querySelector('img').src = 'imagenes/duplicada.svg';
  501. $('#icon_retardo').hide();
  502. $('#icon_asistencia').hide();
  503. $('#icon_duplicada').show();
  504. $("#estado").find(".text-big").html("Asistencia<br>" + texto).removeClass("text-warning text-success").addClass("text-blue");
  505. const estado = document.querySelector('#estado');
  506. const h2 = estado.querySelector('.text-big');
  507. h2.innerHTML = `Asistencia<br>${texto}`;
  508. h2.classList.remove('text-warning', 'text-success');
  509. }
  510. function show_retardos(nombre, horarios, from) {
  511. show_asistencia(nombre, horarios, from);
  512. texto = `Retardo`;
  513. const estado = document.querySelector('#estado');
  514. const h2 = estado.querySelector('.text-big');
  515. h2.innerHTML = `Retardo`;
  516. h2.classList.remove('text-success', 'text-blue');
  517. h2.classList.add('text-warning');
  518. $('#icon_asistencia').hide();
  519. $('#icon_duplicada').hide();
  520. $('#icon_retardo').show();
  521. //estado.querySelector('img').src = 'imagenes/retardo.svg';
  522. }
  523. const { horarios, duplicadas, avisos } = result;
  524. const { nombre } = result.profesor;
  525. let retardos = {}, asistencia = {};
  526. // if any horario has retardo = true horarios is an object with facultad as key
  527. if (Object.values(horarios).some(horario => horario.some(h => h.retardo)))
  528. retardos = horarios;
  529. // if any horario has duplicada = true horarios is an object with facultad as key
  530. else
  531. asistencia = horarios;
  532. console.log(retardos, asistencia, avisos, duplicadas);
  533. // Mostrar avisos
  534. await show_avisos(avisos);
  535. const from = avisos.length > 0 ? '#avisos' : '#registro';
  536. // IF DUPLICADAS HAS ELEMENTS (JSON OBJECT)
  537. if (Object.keys(duplicadas).length > 0)
  538. show_duplicadas(nombre, duplicadas, from);
  539. else if (Object.keys(retardos).length > 0)
  540. show_retardos(nombre, retardos, from);
  541. else
  542. show_asistencia(nombre, asistencia, from);
  543. // setTimeout(() => {
  544. // location.reload();
  545. // }, 5000);
  546. } catch (error) {
  547. console.log(error);
  548. cambiaVista('.sub-bloque', '#error_bd');
  549. checadorAlive(); //Muestra mensaje sin internet y comienza a checar hasta que haya
  550. }
  551. finally {
  552. setTimeout(() => {
  553. location.reload();
  554. }, 5000);
  555. }
  556. }