reposiciones.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. <?php
  2. require_once 'class/c_login.php';
  3. if (!isset($_SESSION['user']))
  4. die(header('Location: index.php'));
  5. $user = unserialize($_SESSION['user']);
  6. $user->access();
  7. if (!$user->admin && in_array($user->acceso, ['n']))
  8. die(header('Location: main.php?error=1'));
  9. $user->print_to_log('Consultar horario');
  10. $write = $user->admin || in_array($user->acceso, ['w']);
  11. $en_fecha = $db->querySingle("SELECT ESTA_EN_PERIODO(NOW()::DATE, :periodo_id)", [':periodo_id' => $user->periodo_id])['esta_en_periodo'];
  12. $periodo_fin = $db->querySingle("SELECT periodo_fecha_fin FROM periodo WHERE periodo_id = :periodo_id", [':periodo_id' => $user->periodo_id])['periodo_fecha_fin'];
  13. ?>
  14. <!DOCTYPE html>
  15. <html lang="en">
  16. <head>
  17. <title>Consultar horario | <?= $user->facultad['facultad'] ?? 'General' ?></title>
  18. <meta charset="utf-8">
  19. <meta http-equiv="content-type" content="text/plain; charset=UTF-8" />
  20. <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  21. <?php include_once "import/html_css_files.php"; ?>
  22. <link rel="stylesheet" href="css/jquery-ui.css">
  23. <link rel="stylesheet" href="css/richtext.css" type="text/css">
  24. <link rel="stylesheet" href="css/clockpicker.css">
  25. <link rel="stylesheet" href="css/calendar.css">
  26. <link rel="stylesheet" href="css/fa_all.css" type="text/css">
  27. <script src="js/scrollables.js" defer></script>
  28. <script>
  29. const write = <?= $write ? 'true' : 'false' ?>;
  30. </script>
  31. <script src="js/moment.js" defer></script>
  32. </head>
  33. <!-- -->
  34. <body style="display: block;">
  35. <?php
  36. include('include/constantes.php');
  37. include("import/html_header.php");
  38. html_header("Consultar horario", "Sistema de gestión de checador");
  39. ?>
  40. <?= "<!-- $user -->" ?>
  41. <main class="container content marco content-margin" id="local-app">
  42. <section id="message"></section>
  43. <?php require('import/periodo.php') ?>
  44. <!-- Botón para abrir el modal -->
  45. <span class="d-inline-block" tabindex="0" data-toggle="tooltip" <?php if (!$en_fecha) : ?> title="No se puede crear una reposición fuera de la fecha de reposición" <?php endif; ?>>
  46. <button type="button" class="btn btn-primary" data-toggle="modal" <?php if ($en_fecha) : ?>data-target="#crearReposición" <?php else : ?>disabled style="pointer-events: none;" <?php endif; ?>>
  47. Crear Reposición
  48. </button>
  49. </span>
  50. <!-- Modal del formulario -->
  51. <div class="modal fade" id="crearReposición" tabindex="-1" role="dialog" aria-labelledby="crearReposiciónLabel" aria-hidden="true">
  52. <div class="modal-dialog modal-xl" role="document">
  53. <div class="modal-content">
  54. <div class="modal-header">
  55. <h5 class="modal-title" id="crearReposiciónLabel">Crear Reposición</h5>
  56. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  57. <span aria-hidden="true">&times;</span>
  58. </button>
  59. </div>
  60. <div class="modal-body">
  61. <form id="form" class="form-horizontal">
  62. <div class="form-group step" id="step-1">
  63. <div class="form-box">
  64. <div class="form-group row">
  65. <label for="clave_profesor" class="col-4 col-form-label">Profesor</label>
  66. <div class="col-8">
  67. <input list="lista_profesores" name="clave_profesor" id="clave_profesor" class="form-control" placeholder="Profesor" required="required">
  68. <div class="valid-feedback">
  69. Profesor encontrado
  70. </div>
  71. <div class="invalid-feedback">
  72. Profesor no encontrado
  73. </div>
  74. <datalist id="lista_profesores">
  75. <?php
  76. $profesores = $db->query('SELECT * FROM fs_profesor A WHERE facultad_id = :facultad_id AND EXISTS (
  77. SELECT * FROM horario join HORARIO_PROFESOR ON horario.HORARIO_ID = HORARIO_PROFESOR.horario_id WHERE HORARIO_PROFESOR.profesor_id = A.id AND HORARIO.periodo_id = :periodo_id
  78. ) ORDER BY grado, nombre', [':facultad_id' => $user->facultad['facultad_id'], ':periodo_id' => $user->periodo_id]);
  79. foreach ($profesores as $profesor) {
  80. extract($profesor);
  81. ?>
  82. <option data-grado="<?= $grado ?>" data-clave="<?= $clave ?>" data-profesor="<?= $profesor ?>" data-id="<?= $id; ?>" value="<?= "$clave | $grado $profesor" ?>"></option>
  83. <?php
  84. }
  85. ?>
  86. </datalist>
  87. <ul class="list-group" id="profesores"></ul>
  88. <input type="hidden" id="periodo_id" name="periodo_id" value="<?= $user->periodo_id ?>">
  89. <input type="hidden" id="profesor_id" name="profesor_id" value="">
  90. </div>
  91. </div>
  92. </div>
  93. </div>
  94. <div class="form-group step" id="step-2">
  95. <div class="form-box">
  96. <div class="form-group row">
  97. <label for="horario_reponer" class="col-4 col-form-label">Horario a reponer</label>
  98. <div class="col-8">
  99. <select name="horario_reponer" id="horario_reponer" class="form-control" required="required">
  100. </select>
  101. </div>
  102. </div>
  103. </div>
  104. <input type="hidden" name="horario_id" id="horario_id">
  105. </div>
  106. <div class="form-group step" id="step-3">
  107. <div class="form-box">
  108. <div class="form-group row">
  109. <label for="fechas_clase" class="col-4 col-form-label">Fecha de clase</label>
  110. <div class="col-8">
  111. <select name="fechas_clase" id="fechas_clase" class="form-control" required="required">
  112. </select>
  113. </div>
  114. </div>
  115. </div>
  116. </div>
  117. <div class="form-group step" id="step-4">
  118. <div class="form-box">
  119. <div class="form-group row">
  120. <label for="fecha_reponer" class="col-4 col-form-label">Fecha de reposición</label>
  121. <div class="col-6">
  122. <input type="text" placeholder="dd/mm/aaaa" name="fecha_reponer" id="fecha_reponer" class="form-control date-picker" required="required">
  123. </div>
  124. </div>
  125. <div class="form-group row">
  126. <label for="hora" class="col-4 col-form-label">Hora</label>
  127. <div class="col-3">
  128. <div id="hora" class="datalist datalist-select mb-1">
  129. <div class="datalist-input text-center">hh</div>
  130. <span class="ing-buscar icono"></span>
  131. <ul style="display:none">
  132. <?php foreach (range(7, 21) as $hora) { ?>
  133. <li data-id='<?= $hora ?>'><?= str_pad($hora, 2, "0", STR_PAD_LEFT) ?></li>
  134. <?php } ?>
  135. </ul>
  136. <input type="hidden" id="hora_reponer" name="horas" value="">
  137. </div>
  138. </div>
  139. <div class="col-3">
  140. <div id="minutos" class="datalist datalist-select mb-1">
  141. <div class="datalist-input text-center">mm</div>
  142. <span class="ing-buscar icono"></span>
  143. <ul style="display:none">
  144. <?php foreach (range(0, 45, 15) as $minuto) { ?>
  145. <li data-id='<?= $minuto ?>'><?= str_pad($minuto, 2, "0", STR_PAD_LEFT) ?></li>
  146. <?php } ?>
  147. </ul>
  148. <input type="hidden" id="minutos_reponer" name="minutos" value="">
  149. </div>
  150. </div>
  151. </div>
  152. </div>
  153. </div>
  154. <div class="form-group step" id="step-5">
  155. <div class="form-box">
  156. <div class="form-group row">
  157. <label for="descripcion_reposicion" class="col-4 col-form-label">Comentarios</label>
  158. <div class="col-6">
  159. <textarea name="descripcion_reposicion" id="descripcion_reposicion" rows="4" required="required" placeholder="Se requiere proyector, etc." maxlength="255" class="form-control"></textarea>
  160. </div>
  161. </div>
  162. <div class="form-group row align-items-center">
  163. <label class="col-4 col-form-label" for="sala">¿En sala de cómputo?</label>
  164. <div class="col-6">
  165. <div class="custom-control custom-switch">
  166. <input type="checkbox" class="custom-control-input" id="sala">
  167. <label class="custom-control-label" for="sala"></label>
  168. </div>
  169. </div>
  170. </div>
  171. </div>
  172. </div>
  173. </form>
  174. </div>
  175. <div class="modal-footer justify-content-center">
  176. <button class="btn btn-secondary" type="button" id="prev-button">Anterior</button>
  177. <button class="btn btn-secondary" type="button" id="next-button" disabled data-toggle="modal" data-target="#confirmationModal">Proponer reposición</button>
  178. </div>
  179. <!-- Modal confirmación -->
  180. <div class="modal fade" id="confirmationModal" tabindex="-1" role="dialog" aria-labelledby="confirmationModalLabel" aria-hidden="true">
  181. <div class="modal-dialog modal-sm" role="document">
  182. <div class="modal-content">
  183. <div class="modal-header">
  184. <h5 class="modal-title" id="confirmationModalLabel">Confirmación</h5>
  185. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  186. <span aria-hidden="true">&times;</span>
  187. </button>
  188. </div>
  189. <div class="modal-body">
  190. <p>¿Estás seguro de que deseas proponer la reposición?</p>
  191. <small>Recuerda que la aprobará tu jefe de carrera.</small>
  192. </div>
  193. <div class="modal-footer">
  194. <button type="button" class="btn btn-info" onclick="$('#confirmationModal').modal('hide');">Cancelar</button>
  195. <button type="button" class="btn btn-primary" data-dismiss="modal">Aceptar</button>
  196. </div>
  197. </div>
  198. </div>
  199. </div>
  200. </div>
  201. </div>
  202. </div>
  203. </main>
  204. </body>
  205. <script src="js/jquery.min.js"></script>
  206. <script src="js/bootstrap/popper.min.js"></script>
  207. <script src="js/bootstrap/bootstrap.min.js"></script>
  208. <script src="js/richtext.js"></script>
  209. <script src="js/clockpicker.js"></script>
  210. <script src="js/jquery-ui.js"></script>
  211. <script src="js/datepicker-es.js"></script>
  212. <script>
  213. $(document).ready(function() {
  214. $('.richtext').richText({
  215. fontList: ['indivisa-text', 'Arial'],
  216. imageUpload: true,
  217. placeholder: 'Escribe aquí la información de la reposición: necesito un proyector, etc.',
  218. });
  219. });
  220. $(".date-picker").datepicker($.datepicker.regional.es);
  221. $(".date-picker").datepicker({
  222. dateFormat: "dd/mm/yyyy",
  223. changeMonth: true,
  224. beforeShowDay: function(date) {
  225. // Disable Sundays (0 represents Sunday)
  226. return [date.getDay() != 0, ''];
  227. // Disable 2020-05-01
  228. }
  229. });
  230. // the minimum is today + 3 laboral days
  231. function getNextWorkingDay(date) {
  232. const day = date.getDay(); // Get the day of the week (0-6, where 0 is Sunday)
  233. // Check if it's Saturday (6), if so, add 2 days
  234. if (day === 6) {
  235. date.setDate(date.getDate() + 2);
  236. }
  237. // Add 1 day to skip to the next day
  238. date.setDate(date.getDate() + 1);
  239. // Check if it's a Sunday (0), if so, add 1 day
  240. if (date.getDay() === 0) {
  241. date.setDate(date.getDate() + 1);
  242. }
  243. // Add laboral days
  244. let laboralDaysCount = 1; // Start with 1 to account for the current day
  245. while (laboralDaysCount < 3) {
  246. date.setDate(date.getDate() + 1); // Add a day
  247. if (date.getDay() !== 6) { // Skip Saturdays
  248. laboralDaysCount++;
  249. }
  250. }
  251. return date;
  252. }
  253. $(".date-picker").datepicker("option", "minDate", getNextWorkingDay(new Date()));
  254. // the maximum is periodo_fin
  255. $(".date-picker").datepicker("option", "maxDate", new Date("<?= $periodo_fin ?>T03:24:00"));
  256. $(function() {
  257. $('[data-toggle="tooltip"]').tooltip()
  258. })
  259. </script>
  260. <script src="js/messages.js"></script>
  261. <script type="module" src="js/reposiciones.js"></script>
  262. </html>