reporte_insignias.php 49 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932
  1. <?php
  2. require_once("../include/constantes.php");
  3. require_once("../include/bd_pdo.php");
  4. require_once("../classes/ValidaSesion.php");
  5. require_once("../classes/MainMenu.php");
  6. require_once("../include/util.php");
  7. $menu = 11;
  8. $submenu = 115;
  9. //--- Objeto para validar usuario. El id de usuario lo lee desde sesión
  10. $objSesion = new ValidaSesion($pdo, $submenu, GEMA);
  11. if (!$objSesion->tieneAcceso()) {
  12. $objSesion->terminaSesion();
  13. }
  14. $objSesion->validaPeriodoUsuario(); //si no tiene periodo manda a main
  15. if (!$objSesion->puedeEditar()) {
  16. header("Location: main.php?error=3");
  17. exit();
  18. }
  19. //Obtiene plan de estudios
  20. $stmt = $pdo->prepare('SELECT * from fs_planestudio(:nivel, NULL, NULL, true, NULL, NULL) WHERE "Carrera_esComun" IS NOT true');
  21. $stmt->bindParam(":nivel", $_SESSION["nivel_id"]);
  22. if (!$stmt->execute()) {
  23. print_r($stmt->errorInfo());
  24. $errorDesc = "Ocurrió un error al cargar los planes de estudios";
  25. } else
  26. $plan_rs = $stmt->fetchAll();
  27. $stmt->closeCursor();
  28. $stmt = null;
  29. if (count($plan_rs) == 0) {
  30. header("Location: planestudios.php?error=4");
  31. exit();
  32. }
  33. //Obtiene carrera
  34. $stmt = $pdo->prepare('SELECT * from fs_carrera(NULL, :nivel, false)');
  35. $stmt->bindParam(":nivel", $_SESSION["nivel_id"]);
  36. if (!$stmt->execute()) {
  37. print_r($stmt->errorInfo());
  38. $errorDesc = "Ocurrió un error al cargar los planes de estudios";
  39. } else
  40. $carrera_rs = $stmt->fetchAll();
  41. $stmt->closeCursor();
  42. $stmt = null;
  43. if (count($plan_rs) == 0) {
  44. header("Location: planestudios.php?error=4");
  45. exit();
  46. }
  47. ?>
  48. <!DOCTYPE html>
  49. <html lang="es" prefix="og: http://ogp.me/ns#">
  50. <head>
  51. <title>GEMA - Facultad de Ingeniería</title>
  52. <meta charset="utf-8">
  53. <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  54. <link rel="icon" type="image/png" href="../img/favicon.png" />
  55. <link rel="stylesheet" href="../css/bootstrap-ulsa.min.css" type="text/css">
  56. <link rel="stylesheet" href="../css/indivisa.css" type="text/css">
  57. <link rel="stylesheet" href="../css/sgi.css?rand=<?php echo rand(); ?>" type="text/css">
  58. <link rel="stylesheet" href="../css/fa_all.css" type="text/css">
  59. <link rel="stylesheet" href="../css/jquery-ui.css" type="text/css">
  60. <link rel="stylesheet" href="../css/calendar.css" type="text/css">
  61. </head>
  62. <body>
  63. <div>
  64. <?php
  65. //--- Objeto que pinta menu
  66. $menuObj = new MainMenu($_SESSION["usuario_id"], $menu, $pdo, GEMA, "Reporte de insignias de alumnos"); //usr, menu, pdo, sist
  67. $menuObj->printMenu();
  68. //--Manejo de errores y mensajes de exito
  69. if (isset($_GET["error"]) && is_numeric($_GET["error"])) {
  70. switch ($_GET["error"]) {
  71. case 0:
  72. $errorDesc = "No se reciberon los datos para generar la insignia.";
  73. break;
  74. case 1:
  75. $errorDesc = "No tienes permiso de realizar esta acción.";
  76. break;
  77. case 3:
  78. $errorDesc = "Ningún alumno seleccionado tiene insignias.";
  79. break;
  80. }
  81. }
  82. ?>
  83. <main class="container-fluid content marco">
  84. <div class="row ">
  85. <div class="col-12">
  86. <?php $show_all=true; include("../include/periodoCambio.php"); ?>
  87. <form action="./export/pdf_insignias_borrador.php" method="post" target="_blank" id="forma">
  88. <div class="form-box form-box">
  89. <?php include_once("../include/errorMessage.php"); ?>
  90. <p class="text-center">Busca los alumnos a los que desees generar su reporte de insignias.</p>
  91. <div class="form-group row">
  92. <label for="alumnos" class="col-4 col-form-label">Alumnos *</label>
  93. <div class="col-6 col-sm-4">
  94. <select multiple="multiple" class="form-control" name="alumnos[]" id="alumnos" size="4">
  95. </select>
  96. <div class="invalid-feedback" id="feedback1">Debes agregar al menos 1 alumno</div>
  97. </div>
  98. <div class="col-2 col-sm-4">
  99. <button type="button" class="btn btn-outline-primary btn-sm col-8" data-toggle="modal" data-target="#modal" data-tipo="1">
  100. <?php echo $ICO["mas"]; ?> Agregar a alumnos
  101. </button>
  102. <button type="button" class="btn btn-outline-danger mt-2 btn-sm col-8" id="btn-quitar">
  103. <?php echo $ICO["borrar"]; ?> Quitar seleccionados
  104. </button>
  105. <button type="button" class="btn btn-outline-danger mt-2 btn-sm col-8" onclick="limpiarAlumnos()">
  106. <?php echo $ICO["borrar"]; ?> Quitar Todos
  107. </button>
  108. </div>
  109. </div>
  110. </div>
  111. </form>
  112. </div>
  113. </div>
  114. <div class="row text-center justify-content-center">
  115. <p class="col-2"><b>Con insignias:</b> <span id="cuenta-alumnos-insignias">0</span></p>
  116. <p class="col-2"><b>Sin insignias:</b> <span id="cuenta-alumnos-sin_insignias">0</span></p>
  117. <p class="col-2"><b>Total: </b><span id="total-alumnos">0</span></p>
  118. </div>
  119. <p class="text-center">
  120. <!-- Button trigger modal -->
  121. <button type="button" class="btn btn-outline-primary" data-toggle="modal" data-target="#consultaModal">
  122. <?php echo $ICO["ojo"]; ?> Vista previa alumnos
  123. </button>
  124. <button type="button" class="btn btn-primary" id="trigger-pdf-modal">
  125. <?php echo $ICO["descargar"]; ?> Generar PDF
  126. </button>
  127. <button type="button" class="btn btn-primary" id="btn-send">
  128. <?php echo $ICO["lista"]; ?> Generar borrador
  129. </button>
  130. </p>
  131. </main>
  132. <!--- FOOTER--->
  133. <?php require_once("../include/footer.php"); ?>
  134. <!-- Modal de query -->
  135. <div class=" modal fade" id="modal" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true">
  136. <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
  137. <div class="modal-content">
  138. <div class="modal-header">
  139. <h4 class="col-12 modal-title text-center"><span id="modalLabel">Consultar insignias de los alumnos</span>
  140. <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
  141. <span aria-hidden="true">&times;</span>
  142. </button>
  143. </h4>
  144. </div>
  145. <form action="#" method="post" id="formaModal">
  146. <div class="modal-body">
  147. <nav class="d-flex justify-content-center">
  148. <div class="nav nav-tabs" id="nav-tab" role="tablist">
  149. <a class="nav-item nav-link active" id="nav-individual-tab" data-toggle="tab" href="#nav-individual" role="tab" aria-controls="nav-individual" aria-selected="true">Alumno individual</a>
  150. <a class="nav-item nav-link" id="nav-grupal-tab" data-toggle="tab" href="#nav-grupal" role="tab" aria-controls="nav-grupal" aria-selected="false">Alumnos grupal</a>
  151. </div>
  152. </nav>
  153. <div class="tab-content" id="nav-tabContent">
  154. <div class="tab-pane fade show active" id="nav-individual" role="tabpanel" aria-labelledby="nav-individual-tab">
  155. <p>Busca alumnos por nombre y/o clave para agregarlos al reporte.</p>
  156. <div class="form-box">
  157. <div class="form-group row">
  158. <label for="nombre" class="col-4 col-form-label">Nombre</label>
  159. <div class="col-8">
  160. <input id="nombre" name="nombre" type="text" class="form-control" maxlength="50">
  161. </div>
  162. </div>
  163. <div class="form-group row">
  164. <label for="clave" class="col-4 col-form-label">Clave</label>
  165. <div class="col-8">
  166. <input id="clave" name="clave" type="text" class="form-control" maxlength="7">
  167. </div>
  168. </div>
  169. <div class="form-group row">
  170. <label for="plan" class="col-4 col-form-label">Carrera</label>
  171. <div class="col-8">
  172. <div class="datalist datalist-select mb-1 w-100">
  173. <div class="datalist-input">Ver todas</div>
  174. <span class="ing-buscar icono"></span>
  175. <ul style="display:none">
  176. <li data-id="">Ver todos</li>
  177. <?php foreach ($plan_rs as $plan) { ?>
  178. <li data-id="<?php echo $plan["PlanEstudio_id"]; ?>"><?php echo $plan["Carrera_desc"] . " " . $plan["PlanEstudio_desc"]; ?></li>
  179. <?php } ?>
  180. </ul>
  181. <input type="hidden" id="plan" name="plan" value="">
  182. </div>
  183. </div>
  184. </div>
  185. </div>
  186. <div class="form-group row">
  187. <div class="offset-4 col-8">
  188. <button type="button" class="btn btn-outline-primary" id="buscaBtn"><?php echo $ICO["aceptar"]; ?> Buscar</button>
  189. <button type="button" class="btn btn-outline-danger" data-dismiss="modal"><?php echo $ICO["cancelar"]; ?> Cancelar</button>
  190. </div>
  191. </div>
  192. <div class="row collapse" id="addedBox">
  193. <div class="col-12">
  194. <div class="alert alert-success">
  195. <button type="button" class="close" data-toggle="collapse" href="#addedBox" aria-controls="addedBox" aria-expanded="true">×</button>
  196. <span class="ing-aceptar ing-fw float-left" style="font-size:2em"></span>
  197. <p class="pt-1" style="margin-left:60px" id="addedBox_text">El usuario se asignó correctamente al reporte</p>
  198. </div>
  199. </div>
  200. </div>
  201. <div class="alert alert-secondary d-none" role="alert" id="ya_dentro">
  202. <p>
  203. El usuario ya se encuentra en el reporte
  204. </p>
  205. </div>
  206. <div id="resultados" class="d-none">
  207. <p>Solo se mostrarán los primeros <strong><?php echo MAX_ROWS; ?></strong> resultados.</p>
  208. <table class="table table-sm table-striped table-white">
  209. <thead class="thead-dark">
  210. <tr>
  211. <th style="width:30px">Estado</th>
  212. <th>Clave</th>
  213. <th>Nombre</th>
  214. <th>Programa</th>
  215. <th>Acciones</th>
  216. </tr>
  217. </thead>
  218. <tbody id="table-result">
  219. <tr class="alumno-row">
  220. <td class="res-estado text-center"><span class="res-icon"><?php echo $ICO_LG["circulo"]; ?></span></td>
  221. <td class="res-clave text-center"></td>
  222. <td class="res-nombre"></td>
  223. <td class="res-carrera"></td>
  224. <td class="res-agrega text-center"><button type="button" onclick="" class="btn btn-outline-primary btn-sm btn-agrega-nombre"><?php echo $ICO["mas"]; ?></button></td>
  225. </tr>
  226. </tbody>
  227. </table>
  228. </div>
  229. <p id="sin_alumnos" class="d-none text-danger text-center">No hay alumnos que coincidan con los parámetros de búsqueda</p>
  230. </div>
  231. <div class="tab-pane fade" id="nav-grupal" role="tabpanel" aria-labelledby="nav-grupal-tab">
  232. <p>Agrega a grupos al reporte buscándolos por semestre y carrera.</p>
  233. <div class="form-box">
  234. <div class="form-group row">
  235. <label for="semestre" class="col-4 col-form-label">Semestre</label>
  236. <div class="col-8">
  237. <div class="datalist datalist-select mb-1 w-100">
  238. <div class="datalist-input">1</div>
  239. <span class="ing-buscar icono"></span>
  240. <ul style="display:none">
  241. <?php for ($semestre = 1; $semestre <= 9; $semestre++) { ?>
  242. <li data-id="<?php echo $semestre; ?>"><?php echo $semestre; ?></li>
  243. <?php } ?>
  244. </ul>
  245. <input type="hidden" id="semestre" name="semestre" value="1">
  246. </div>
  247. </div>
  248. </div>
  249. <div class="form-group row">
  250. <label for="plan" class="col-4 col-form-label">Carrera</label>
  251. <div class="col-8">
  252. <div class="datalist datalist-select mb-1 w-100">
  253. <div class="datalist-input">Ver todos</div>
  254. <span class="ing-buscar icono"></span>
  255. <ul style="display:none">
  256. <li data-id="">Ver todos</li>
  257. <?php foreach ($carrera_rs as $carrera) { ?>
  258. <li data-id="<?php echo $carrera["Carrera_id"]; ?>"><?php echo $carrera["Carrera_desc"]; ?></li>
  259. <?php } ?>
  260. </ul>
  261. <input type="hidden" id="carrera" name="carrera" value="">
  262. </div>
  263. </div>
  264. </div>
  265. </div>
  266. <div class="form-group row">
  267. <div class="offset-4 col-8">
  268. <button type="button" class="btn btn-outline-primary" id="asignarBtn"><?php echo $ICO["aceptar"]; ?> Asignar</button>
  269. <button type="button" class="btn btn-outline-danger" data-dismiss="modal"><?php echo $ICO["cancelar"]; ?> Cancelar</button>
  270. </div>
  271. </div>
  272. </div>
  273. </div>
  274. </div>
  275. </form>
  276. </div>
  277. </div>
  278. </div>
  279. <!-- Modal de consulta -->
  280. <div class="modal fade" id="consultaModal" tabindex="-1" role="dialog" aria-labelledby="consultaModalLabel" aria-hidden="true">
  281. <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
  282. <div class="modal-content">
  283. <div class="modal-header">
  284. <h4 class="col-12 modal-title text-center"><span id="modalLabel">Vista previa de las insignias de cada alumno</span>
  285. <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
  286. <span aria-hidden="true">&times;</span>
  287. </button>
  288. </h4>
  289. </div>
  290. <div class="modal-body">
  291. <!-- Exctract selected alumnos from select -->
  292. <div class="row">
  293. <div class="col-12">
  294. <div class="form-box">
  295. <div class="form-group row">
  296. <label for="alumnos" class="col-4 col-form-label">Alumnos</label>
  297. <div class="col-8">
  298. <div class="datalist datalist-select mb-1 w-100">
  299. <div class="datalist-input" id="alumno_seleccionado">Seleccionar alumnos</div>
  300. <span class="ing-buscar icono"></span>
  301. <ul id="consultaDataList" style="display:none">
  302. </ul>
  303. <input type="hidden" id="alumnosVistaPrev" value="">
  304. </div>
  305. </div>
  306. </div>
  307. </div>
  308. <table class="table table-sm table-white d-none" id="vista_previa">
  309. <thead class="thead-dark">
  310. <tr>
  311. <th style="width: 120px;">Tipo</th>
  312. <th>Insignia</th>
  313. </tr>
  314. </thead>
  315. <tbody></tbody>
  316. </table>
  317. <div class="alert alert-secondary d-none" id="sin_insignias">
  318. <p>El alumno no tiene insignias asignadas</p>
  319. </div>
  320. <div class="alert alert-secondary d-none" id="sin_alumnos_con_insignias">
  321. <p>No hay ningún alumno con insignias asignadas</p>
  322. </div>
  323. <div class="alert alert-dark d-none" role="alert" id="sin_alumnos_vista">
  324. <p>No hay ningún alumno en el recuadro</p>
  325. </div>
  326. </div>
  327. </div>
  328. </div>
  329. <div class="modal-footer">
  330. <button type="button" class="btn btn-secondary" data-dismiss="modal">Cerrar vista previa</button>
  331. </div>
  332. </div>
  333. </div>
  334. </div>
  335. <!--- Modal del PDF -->
  336. <div class="modal fade" id="pdfModal" tabindex="-1" role="dialog" aria-labelledby="pdfModalLabel" aria-hidden="true">
  337. <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
  338. <div class="modal-content">
  339. <div class="modal-header">
  340. <h4 class="col-12 modal-title text-center"><span id="modalLabel">Asignar insignia a alumnos</span>
  341. <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
  342. <span aria-hidden="true">&times;</span>
  343. </button>
  344. </h4>
  345. </div>
  346. <div class="modal-body">
  347. <form action="./export/pdf_insignias.php" method="post" target="_blank" id="forma-modal">
  348. <div class="form-box">
  349. <div class="form-group row">
  350. <label for="fecha_carta" class="col-4 col-form-label">Fecha de la carta *</label>
  351. <div class="col-4">
  352. <input id="fecha_carta" name="fecha_carta" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly="readonly" value="<?php echo date("d/m/Y"); ?>">
  353. </div>
  354. </div>
  355. <div class="form-group row d-none">
  356. <label for="fecha_carta" class="col-4 col-form-label">Estilo de la carta</label>
  357. <div class="col-4">
  358. <div class="datalist datalist-select mb-1 w-100">
  359. <div class="datalist-input">Normal</div>
  360. <span class="ing-buscar icono"></span>
  361. <ul style="display:none">
  362. <li data-id="carta.css">Normal</li>
  363. <li data-id="carta-ea.css">Espacio ampliado</li>
  364. <li data-id="carta-er.css">Espacio reducido</li>
  365. </ul>
  366. <input type="hidden" id="estilo" name="estilo" value="carta.css">
  367. </div>
  368. </div>
  369. </div>
  370. <div class="form-group row align-items-center">
  371. <label for="fecha_carta" class="col-4 col-form-label">Espacio de la carta </label>
  372. <div class="col-4">
  373. <div class="slidecontainer">
  374. <input type="range" min="-10" max="100" value="10" class="slider w-100" id="tamano" step="10" name="tamano">
  375. </div>
  376. </div>
  377. <div class="col-4">
  378. <span id="espacio-px">10px</span>
  379. </div>
  380. </div>
  381. <div class="form-group row align-items-center" id="tipo_descarga">
  382. <label class="col-4 col-form-label">Tipo de descarga</label>
  383. <div class="col-3 ">
  384. <div class="form-check form-check-inline">
  385. <input class="form-check-input radio-lg radio_descarga" type="radio" id="multiple_no" name="inter" value="0" checked="true">
  386. <label for="multiple_no" class="col-form-label">Archivo único</label>
  387. </div>
  388. </div>
  389. <div class="col-4 ">
  390. <div class="form-check form-check-inline">
  391. <input class="form-check-input radio-lg radio_descarga" type="radio" id="multiple_si" name="inter" value="1">
  392. <label for="multiple_si" class="col-form-label">Archivos separados</label>
  393. </div>
  394. </div>
  395. </div>
  396. <div class="form-group row align-items-center">
  397. <label class="col-4 col-form-label" for="firmado">Firmado</label>
  398. <div class="col-3 ">
  399. <div class="form-check form-check-inline">
  400. <input class="form-check-input radio-lg" type="radio" id="normal" name="firmado" value="1">
  401. <label for="normal" class="col-form-label">Sí</label>
  402. </div>
  403. </div>
  404. <div class="col-4 ">
  405. <div class="form-check form-check-inline">
  406. <input class="form-check-input radio-lg" type="radio" id="sin_firmas" name="firmado" value="0" checked="true">
  407. <label for="sin_firmas" class="col-form-label">No</label>
  408. </div>
  409. </div>
  410. </div>
  411. </div>
  412. <div id="alumnos-clon"></div>
  413. </form>
  414. <!-- progress bar -->
  415. <div class="progress">
  416. <div class="progress-bar progress-bar-striped progress-bar-animated" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%">
  417. <span class="sr-only">0%</span>
  418. </div>
  419. </div>
  420. </div>
  421. <div class="modal-footer">
  422. <button type="button" class="btn btn-outline-primary" id="btn-pdf"><?php echo $ICO["descargar"]; ?> Descargar PDF</button>
  423. <button type="button" class="btn btn-outline-danger" data-dismiss="modal"><?php echo $ICO["cancelar"]; ?> Cerrar</button>
  424. </div>
  425. </div>
  426. </div>
  427. </div>
  428. <script src="../js/jquery.min.js"></script>
  429. <script src="../js/jquery-ui.js"></script>
  430. <script src="../js/datepicker-es.js"></script>
  431. <script src="../js/bootstrap/popper.min.js"></script>
  432. <script src="../js/bootstrap/bootstrap.min.js"></script>
  433. <script src="../js/sidebarmenu.js"></script>
  434. <script src="../js/datalist.js"></script>
  435. <script src="../js/util.js"></script>
  436. <script>
  437. var ListaAlumnos = [];
  438. var setIDAlumnos = new Set();
  439. setDatalist("#periodo", <?php echo $_SESSION["periodo_id"]; ?>);
  440. $(document).on('click', '#dlPeriodo ul li', function() {
  441. $("#formaPeriodo").submit();
  442. });
  443. /***
  444. * Funciones para quitar a los alumnos del listado
  445. */
  446. // on supr key press
  447. $("#alumnos").on("keydown", function(e) {
  448. // count the number of selected items
  449. if (e.keyCode == 46) {
  450. e.preventDefault();
  451. $("#btn-quitar").click();
  452. }
  453. });
  454. $("#btn-quitar").click(function() {
  455. // get each selected option in an array
  456. var selectedOptions = $('#alumnos option:selected');
  457. // get the values of each selected option
  458. var selected = selectedOptions.length;
  459. if (selected == 0) return;
  460. var total = parseInt($("#total-alumnos").text());
  461. var sin_insignias_selected = 0;
  462. var con_insignias_selected = 0;
  463. var sin_insignias = parseInt($("#cuenta-alumnos-sin_insignias").text());
  464. var con_insignias = parseInt($("#cuenta-alumnos-insignias").text());
  465. selectedOptions.each(function() {
  466. var num = parseInt($(this).text().match(/\d+/g)[0]);
  467. if (num > 0) {
  468. con_insignias_selected++;
  469. } else {
  470. sin_insignias_selected++;
  471. }
  472. var id = $(this).val();
  473. // remove spaces from the value string
  474. id = id.replace(/\s/g, '');
  475. // remove the option from the select
  476. $(this).remove();
  477. // remove the value from the array
  478. setIDAlumnos.delete(parseInt(id));
  479. // remove from ListaAlumnos
  480. ListaAlumnos = ListaAlumnos.filter(function(el) {
  481. return el.id != id;
  482. });
  483. });
  484. $("#total-alumnos").text(total - selected);
  485. $("#cuenta-alumnos-insignias").text(con_insignias - con_insignias_selected);
  486. $("#cuenta-alumnos-sin_insignias").text(sin_insignias - sin_insignias_selected);
  487. $("#alumnos option:selected").remove();
  488. });
  489. $('#nombre').keydown(function(event) {
  490. if (event.keyCode == 13) {
  491. $("#buscaBtn").trigger('click');
  492. }
  493. });
  494. $('#clave').keydown(function(event) {
  495. if (event.keyCode == 13) {
  496. $("#buscaBtn").trigger('click');
  497. }
  498. });
  499. /***
  500. * Funciones para agregar a los alumnos al listado
  501. */
  502. // Checar que el alumno ya exista en la lista
  503. function enLista(lista, clave) {
  504. var found = false;
  505. $(lista + " option").each(function(index) {
  506. if (parseInt($(this).prop("value")) == parseInt(clave)) {
  507. found = true;
  508. }
  509. });
  510. return found;
  511. }
  512. // Agregar alumnos al listado
  513. function nuevaOption(id, nombre, clave, insignias) {
  514. if (!enLista("#alumnos", id)) {
  515. var html = `<option value="${id}"> ${insignias} [ ${clave} ] ${nombre} </option>`;
  516. // append to alumnos
  517. $("#alumnos").append(html);
  518. return true
  519. }
  520. return false;
  521. }
  522. // Checar que haya alumnos en el listado
  523. function validaAlumnos() {
  524. $(".is-invalid").removeClass("is-invalid");
  525. if ($("#alumnos option").length == 0) {
  526. $("#alumnos").addClass("is-invalid");
  527. return false
  528. }
  529. return true
  530. }
  531. $('#consultaModal').on('show.bs.modal', function(e) {
  532. $("#sin_alumnos_con_insignias").addClass("d-none");
  533. $("#sin_alumnos_vista").addClass("d-none");
  534. var alumnos_con_insignias = 0;
  535. // foreach alumno in ListaAlumnos
  536. $("table#vista_previa").addClass("d-none");
  537. $("#consultaModal #alumno_seleccionado").text("Seleccionar alumnos");
  538. $("#consultaDataList").empty();
  539. $("#consultaDataList").append(`<li data-id="-1">Seleccionar alumnos</li>`);
  540. if (ListaAlumnos.length == 0) {
  541. $("#sin_alumnos_vista").removeClass("d-none");
  542. return;
  543. }
  544. ListaAlumnos.forEach(function(alumno, index) {
  545. if (alumno.insignias.length > 0) {
  546. $("#consultaDataList").append(`<li data-id="${index}">[ ${alumno.clave} ] ${alumno.nombre}</li>`);
  547. alumnos_con_insignias++;
  548. }
  549. });
  550. if (alumnos_con_insignias == 0)
  551. $("#sin_alumnos_con_insignias").removeClass("d-none");
  552. });
  553. // On click dataList consulta Modal
  554. $('#consultaDataList').on('click', 'li', function() {
  555. $("#sin_insignias").addClass("d-none");
  556. var index = $(this).data('id');
  557. // if id is not undefined
  558. if (index < 0) {
  559. $("table#vista_previa").addClass("d-none");
  560. return;
  561. }
  562. var alumno = ListaAlumnos[index];
  563. if (alumno.insignias.length == 0) {
  564. $("table#vista_previa").addClass("d-none");
  565. $("#sin_insignias").removeClass("d-none");
  566. return;
  567. }
  568. $("table#vista_previa").removeClass("d-none");
  569. $("table#vista_previa tbody").empty();
  570. alumno.insignias.forEach(function(insignia) {
  571. var html = `<tr class="alumno-row">
  572. <td class="res-tipo text-center" style="color: ${insignia.Insignia_color}">
  573. <span class="res-icon">
  574. <?php echo $ICO_LG["circulo"]; ?>
  575. </span>
  576. </td>
  577. <td class="res-nombre">${insignia.Insignia_titulo}</td>
  578. </tr>`
  579. $("table#vista_previa tbody").append(html);
  580. });
  581. });
  582. function show_error(error) {
  583. $("#errorBox").collapse('show');
  584. $("#errorBox_text").html(error);
  585. $('#messageBox')[0].scrollIntoView({
  586. block: "end"
  587. });
  588. }
  589. async function show_ok(message) {
  590. $("#successBox").collapse('show');
  591. $("#successBox_text").html(message);
  592. await setTimeout(function() {
  593. $("#successBox").collapse('hide');
  594. }, 3000);
  595. }
  596. $(document).on("click", ".btn-agrega-nombre", async function(event) {
  597. $("#ya_dentro").addClass("d-none");
  598. var id = $(this).data("id");
  599. var insignias = 0;
  600. let response = await fetch(`./action/alumno_insignias_select.php`, {
  601. method: "POST",
  602. body: JSON.stringify({
  603. id: id
  604. })
  605. }).then(response => response.json());
  606. if (response.error) {
  607. show_error(response.error);
  608. return;
  609. } else {
  610. var alumno = response.alumno;
  611. if (!setIDAlumnos.has(alumno.id)) {
  612. setIDAlumnos.add(alumno.id);
  613. ListaAlumnos.push(alumno);
  614. }
  615. insignias += alumno.insignias.length;
  616. }
  617. $("#total-alumnos").text(ListaAlumnos.length);
  618. var con_insignias = parseInt($("#cuenta-alumnos-insignias").text());
  619. var sin_insignias = parseInt($("#cuenta-alumnos-sin_insignias").text());
  620. if (insignias > 0)
  621. con_insignias++;
  622. else
  623. sin_insignias++;
  624. $("#cuenta-alumnos-insignias").text(con_insignias);
  625. $("#cuenta-alumnos-sin_insignias").text(sin_insignias);
  626. var nombre = $(this).data("nombre");
  627. if (nuevaOption(id, nombre, $(this).data("clave"), insignias)) {
  628. $(this).parents("tr").hide();
  629. } else {
  630. $("#ya_dentro").removeClass("d-none");
  631. }
  632. $("#nombre").val("");
  633. $("#clave").val("");
  634. setDatalistFirst("#plan");
  635. });
  636. $('#modal').on('show.bs.modal', function(e) {
  637. //$("#clave").focus();
  638. $("#nombre").val("");
  639. $("#clave").val("");
  640. setDatalistFirst("#plan");
  641. $("#addedBox").collapse('hide');
  642. });
  643. $(document).ready(function() {
  644. $(".date-picker").datepicker({
  645. dateFormat: "dd/mm/yy",
  646. changeMonth: true,
  647. changeYear: true
  648. });
  649. $(".date-picker").datepicker($.datepicker.regional["es"]);
  650. // $("#forma").prop("action", "./export/pdf_nombramientos.php");
  651. $("#multiple_no").prop("checked", true);
  652. $(".radio_descarga").change(function() {
  653. if ($(this).val() == 0) {
  654. $("#forma").prop("action", "./export/pdf_insignias.php");
  655. } else {
  656. $("#forma").prop("action", "./export/pdf_insignias_split.php");
  657. }
  658. });
  659. $("#trigger-pdf-modal").click(function() {
  660. $(".progress-bar").addClass("d-none");
  661. $("#alumnos option").prop("selected", true);
  662. if (validaAlumnos()) {
  663. $("#pdfModal").modal("show");
  664. }
  665. $('#alumnos option').prop("selected", false);
  666. });
  667. $("#btn-send").click(function() {
  668. $("#alumnos option").prop("selected", true);
  669. if (validaAlumnos()) $("#forma").submit();
  670. $('#alumnos option').prop("selected", false);
  671. });
  672. $("#buscaBtn").click(function() {
  673. $("#addedBox").collapse('hide');
  674. $(".is-invalid").removeClass("is-invalid");
  675. if (trim($("#nombre").val()) == "" && trim($("#clave").val()) == "") {
  676. $("#nombre").addClass("is-invalid");
  677. $("#clave").addClass("is-invalid");
  678. } else {
  679. var form = $("#formaModal");
  680. $.ajax({
  681. url: './action/alumnobusca_select.php',
  682. type: 'POST',
  683. dataType: 'json',
  684. data: {
  685. 'nombre': $("#nombre").val(),
  686. 'clave': $("#clave").val(),
  687. 'plan': $("#plan").val()
  688. },
  689. success: function(result) {
  690. if (result["error"] != "" && result["error"] !== undefined) {
  691. show_error(result["error"]);
  692. $("#modal").modal('hide');
  693. } else {
  694. //cargar tabla de alumnos
  695. var rows = $("#table-result .alumno-row").length; //cuenta accesos actuales
  696. $("#table-result .alumno-row").show(); //cuenta accesos actuales
  697. if (rows > result["alumno"].length) { //sobran
  698. //borrar renglones extra (rows - result.length) pero dejar al menos 1
  699. while (rows > result["alumno"].length && rows > 1) {
  700. $("#table-result .alumno-row:last-child").remove();
  701. rows--;
  702. }
  703. } else { //faltan
  704. // clone the rest of the rows
  705. for (var i = 0; i < (result["alumno"].length - rows); i++) {
  706. $("#table-result .alumno-row:first-child").clone(true).appendTo("#table-result");
  707. }
  708. }
  709. if (result["alumno"].length != 0) { //hay alumnos?
  710. $("#resultados").removeClass("d-none");
  711. $("#sin_alumnos").addClass("d-none");
  712. $("#table-result").children().each(function(index) {
  713. if (index < result["alumno"].length) { //llenar info
  714. $(this).removeClass("d-none");
  715. $(this).find(".res-estado").css("color", result["alumno"][index]["estado_color"]);
  716. $(this).find(".res-clave").html(result["alumno"][index]["claveULSA"]);
  717. $(this).find(".res-nombre").html(result["alumno"][index]["nombre"]);
  718. $(this).find(".res-carrera").html(result["alumno"][index]["carrera"]);
  719. $(this).find(".btn-agrega-nombre").data("id", result["alumno"][index]["id"]);
  720. $(this).find(".btn-agrega-nombre").data("nombre", result["alumno"][index]["nombre"]);
  721. $(this).find(".btn-agrega-nombre").data("clave", result["alumno"][index]["claveULSA"]);
  722. $(this).find(".btn-agrega-nombre").data("carrera", result["alumno"][index]["carrera"]);
  723. $(this).find(".btn-agrega-nombre").data("color", result["alumno"][index]["estado_color"]);
  724. }
  725. });
  726. } else { //sin alumnos
  727. $("#resultados").addClass("d-none");
  728. $("#sin_alumnos").removeClass("d-none");
  729. }
  730. }
  731. },
  732. error: function(jqXHR, textStatus, errorThrown) {
  733. show_error(errorThrown);
  734. }
  735. }); //ajax
  736. }
  737. });
  738. // Fetch from TEMP_insignias.php
  739. $('#asignarBtn').click(async function() {
  740. console.log("<?php echo $_SESSION['periodo_id']; ?>");
  741. console.log(`Semestre: ${$('#semestre').val()} y carrera: ${$('#carrera').val()}`);
  742. const response = await fetch("./action/alumnos_semestre_select.php", {
  743. method: "POST",
  744. body: JSON.stringify({
  745. semestre: $("#semestre").val(),
  746. carrera: $("#carrera").val()
  747. })
  748. })
  749. .then(response => {
  750. if (response.ok)
  751. return response.json();
  752. else
  753. throw new Error(`${response.status} ${response.statusText}`);
  754. })
  755. .catch(error =>
  756. show_error(error.message)
  757. );
  758. if (response.error !== undefined && response.error !== "")
  759. show_error(response.error);
  760. else {
  761. // comprobar que no haya duplicados
  762. response.alumnos.forEach(alumno => {
  763. if (!setIDAlumnos.has(alumno.id)) {
  764. setIDAlumnos.add(alumno.id);
  765. ListaAlumnos.push(alumno);
  766. }
  767. });
  768. console.log(response.alumnos);
  769. var count_alumnos = response.alumnos.length + parseInt($("#total-alumnos").text());
  770. var con_insignias = parseInt($("#cuenta-alumnos-insignias").text());
  771. var sin_insignias = parseInt($("#cuenta-alumnos-sin_insignias").text());
  772. // iterate over array
  773. response.alumnos.forEach(alumno => {
  774. if (alumno.insignias.length > 0) {
  775. con_insignias++;
  776. } else {
  777. sin_insignias++;
  778. }
  779. nuevaOption(alumno.id, alumno.nombre, alumno.clave, alumno.insignias.length)
  780. show_ok("Grupo agregado correctamente");
  781. });
  782. $("#total-alumnos").text(count_alumnos);
  783. $("#cuenta-alumnos-insignias").text(con_insignias);
  784. $("#cuenta-alumnos-sin_insignias").text(sin_insignias);
  785. }
  786. $("#modal").modal("hide");
  787. })
  788. });
  789. $("#btn-pdf").click(async function() {
  790. $("#alumnos-clon").html("");
  791. // clone without id
  792. var clon = $("#alumnos").clone().addClass("d-none").appendTo("#alumnos-clon");
  793. clon.prop("id", "alumnos-multiple-clon");
  794. $("#alumnos-multiple-clon option").prop("selected", true);
  795. // if multiple is checked
  796. if ($("#multiple_si").is(":checked")) {
  797. $(".progress-bar").removeClass("d-none");
  798. $(".progress-bar").css("width", "25%");
  799. $("#forma-modal").attr("action", "export/pdf_insignias_split.php");
  800. var form = $("#forma-modal");
  801. var url = form.attr('action');
  802. var data = form.serialize();
  803. $.ajax({
  804. type: 'POST',
  805. url: url,
  806. data: data,
  807. // gateway timeout error
  808. timeout: 60000,
  809. success: async function(data) {
  810. $(".progress-bar").css("width", "100%");
  811. console.log(data);
  812. await window.open("export/zip/cartas_insignias.zip", "_blank");
  813. }
  814. });
  815. } else {
  816. $("#forma-modal").attr("action", "./export/pdf_insignias.php");
  817. $("#forma-modal").submit();
  818. }
  819. });
  820. $("#tamano").change(function() {
  821. console.log($("#tamano").val());
  822. $("#espacio-px").html((parseInt($(this).val()) + 20) + "px");
  823. });
  824. function limpiarAlumnos() {
  825. $("#alumnos").html("");
  826. $("#total-alumnos").text("0");
  827. $("#cuenta-alumnos-insignias").text("0");
  828. $("#cuenta-alumnos-sin_insignias").text("0");
  829. ListaAlumnos = [];
  830. setIDAlumnos.clear();
  831. }
  832. </script>
  833. </body>
  834. </html>