excel_horario.php 7.1 KB

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