excel_horario.php 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. <?php
  2. require_once 'class/c_login.php';
  3. if (!isset($_SESSION['user'])) {
  4. header('Location: index.php');
  5. exit;
  6. } else
  7. $user = unserialize($_SESSION['user']);
  8. $user->access('excel_horario');
  9. if (!$user->admin && in_array($user->acceso, ['r', 'n'])) {
  10. // die($access);
  11. header('Location: main.php?error=1');
  12. } else {
  13. $user->print_to_log('Consultar asistencia');
  14. }
  15. ?>
  16. <!DOCTYPE html>
  17. <html lang="en">
  18. <head>
  19. <title>Cargar horario desde Excel | <?= $user->facultad['facultad'] ?? 'General' ?></title>
  20. <meta charset="utf-8">
  21. <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  22. <?php include_once "import/html_css_files.php"; ?>
  23. </head>
  24. <body style="display: block;">
  25. <?php
  26. include('include/constantes.php');
  27. include("import/html_header.php");
  28. html_header("Cargar horario desde Excel", "Gestión de Checador");
  29. ?>
  30. <main class="container content content-margin" id="local-app">
  31. <section id="message"></section>
  32. <?php require('import/periodo.php') ?>
  33. <form>
  34. <div class="form-group">
  35. <div class="form-box">
  36. <?php
  37. $carreras = query("SELECT * FROM FS_CARRERA WHERE FACULTAD = COALESCE(:fac, FACULTAD) AND PERIODO = COALESCE(:per, PERIODO) ORDER BY CARRERA", [":fac" => $user->facultad['facultad_id'], ":per" => $user->periodo], single: false);
  38. #die(print_r($carreras, true));
  39. ?>
  40. <div class="form-group row">
  41. <label for="filter_carrera" class="col-4 col-form-label">Carrera</label>
  42. <div class="col-6 ">
  43. <div id="dlcarrera" class="datalist datalist-select mb-1 w-100">
  44. <div class="datalist-input">Seleccionar carrera</div>
  45. <span class="ing-buscar icono"></span>
  46. <ul style="display:none">
  47. <?php
  48. foreach ($carreras as $carrera) {
  49. ?>
  50. <li data-id="<?= $carrera['id'] ?>">
  51. <?= $carrera['carrera'] ?>
  52. </li>
  53. <?php
  54. }
  55. ?>
  56. </ul>
  57. <input type="hidden" id="filter_carrera" name="carrera" value="">
  58. </div>
  59. </div>
  60. </div>
  61. <div class="form-group row">
  62. <label for="excel" class="col-4 col-form-label">Archivo de horarios</label>
  63. <div class="col-8 col-sm-6">
  64. <input class="form-control-file" id="excel" name="archivo" accept=".xlsx, .xls" require>
  65. </div>
  66. </div>
  67. <div class="form-group mt-5 row justify-content-center">
  68. <button id="btn-cargar" type="button" class="btn btn-primary" onclick="submit_files()">
  69. <span class="ing-guardar"></span>
  70. Cargar horario
  71. </button>
  72. </div>
  73. </div>
  74. </div>
  75. </form>
  76. </main>
  77. </body>
  78. <?php
  79. require_once("import/html_footer.php");
  80. require_once("js/messages.php")
  81. ?>
  82. <script src="js/scrollables.js"></script>
  83. <script src="js/jquery.min.js"></script>
  84. <script src="js/bootstrap/bootstrap.min.js"></script>
  85. <script src="js/custominputfile.min-es.js"></script>
  86. <link rel="stylesheet" href="css/custominputfile.min.css">
  87. <script src="js/fetchlib.js"></script>
  88. <script lang="jquery">
  89. var datum = []
  90. $(document).ready(function() {
  91. $('#excel').customFile({
  92. allowed: ['xlsx', 'xls'],
  93. maxFiles: 1,
  94. callbacks: {
  95. onSuccess: async function(item) {
  96. var formData = $.customFile.serialize('archivo');
  97. const {
  98. status,
  99. message,
  100. data
  101. } = await fetch('action/action_revisar_excel.php', {
  102. method: 'POST',
  103. body: formData
  104. })
  105. .then(response => response.json())
  106. .catch(error => {
  107. return {
  108. status: 'error',
  109. message: 'Error al cargar el archivo',
  110. }
  111. });
  112. if (status == 'error') {
  113. triggerMessage(message, 'Error en el formato del archivo');
  114. item.destroy();
  115. return
  116. }
  117. triggerMessage(message, `Archivo revisado`, 'success');
  118. datum = data;
  119. },
  120. }
  121. });
  122. })
  123. async function submit_files() {
  124. // disable button
  125. const button = document.querySelector('#btn-cargar');
  126. // add class disabled to button
  127. button.classList.add('disabled');
  128. // disable button
  129. button.disabled = true;
  130. // add loading icon
  131. button.innerHTML = '<span class="ing-cargando"></span> Cargando...';
  132. let missing = [];
  133. let carrera = $('#filter_carrera').val();
  134. if (carrera == '') missing.push('Carrera');
  135. if (datum.length == 0) missing.push('Archivo de horarios');
  136. let facultad = <?= $user->facultad['facultad_id'] ?>;
  137. if (missing.length > 0) {
  138. messageMissingInputs(missing);
  139. // remove class disabled to button
  140. button.classList.remove('disabled');
  141. // enable button
  142. button.disabled = false;
  143. // remove loading icon
  144. button.innerHTML = '<span class="ing-guardar"></span> Cargar horario';
  145. return;
  146. }
  147. formData.append('carrera', carrera);
  148. formData.append('facultad', facultad);
  149. formData.append('data', JSON.stringify(datum));
  150. const {
  151. status,
  152. message
  153. } = await fetch('action/action_horario_excel.php', {
  154. method: 'POST',
  155. body: formData
  156. })
  157. .then(response => response.json())
  158. .catch(error => {
  159. return {
  160. status: 'error',
  161. message: 'Error al cargar el archivo',
  162. }
  163. });
  164. if (status == 'error') {
  165. triggerMessage(message, 'Error al guardar el archivo');
  166. return
  167. }
  168. triggerMessage(message, `Horarios guardados`, 'success');
  169. // await 1 second
  170. await new Promise(resolve => setTimeout(resolve, 1000));
  171. // reload page
  172. location.reload();
  173. }
  174. </script>
  175. </html>