Alejandro Rosales 2 سال پیش
والد
کامیت
ec382e989a
100فایلهای تغییر یافته به همراه9268 افزوده شده و 9222 حذف شده
  1. 43 43
      action/action_asistencias.php
  2. 100 100
      action/action_asistencias_excel.php
  3. 56 56
      action/action_auditoria.php
  4. 8 8
      action/action_avisos_delete.php
  5. 27 27
      action/action_avisos_insert.php
  6. 51 51
      action/action_avisos_update.php
  7. 24 24
      action/action_carreras.php
  8. 19 19
      action/action_carreras_insert.php
  9. 16 16
      action/action_carreras_select.php
  10. 18 18
      action/action_carreras_update.php
  11. 15 15
      action/action_diasfestivos_borra.php
  12. 48 48
      action/action_diasfestivos_insert.php
  13. 19 19
      action/action_diasfestivos_select.php
  14. 31 31
      action/action_diasfestivos_update.php
  15. 41 41
      action/action_estado_supervisor.php
  16. 50 50
      action/action_facultad.php
  17. 23 23
      action/action_facultades_insert.php
  18. 15 15
      action/action_facultades_select.php
  19. 17 17
      action/action_facultades_update.php
  20. 26 26
      action/action_fechas_clase.php
  21. 23 23
      action/action_grupo.php
  22. 28 28
      action/action_grupo_horario.php
  23. 34 34
      action/action_horario.php
  24. 41 41
      action/action_horario_create.php
  25. 37 37
      action/action_horario_delete.php
  26. 51 51
      action/action_horario_excel.php
  27. 38 38
      action/action_horario_profesor.php
  28. 48 48
      action/action_horario_update.php
  29. 33 33
      action/action_justificar.php
  30. 41 42
      action/action_login.php
  31. 25 25
      action/action_materias.php
  32. 7 7
      action/action_materias_select.php
  33. 10 10
      action/action_materias_update.php
  34. 16 16
      action/action_new_horario.php
  35. 16 16
      action/action_periodos_insert.php
  36. 7 7
      action/action_periodos_select.php
  37. 17 17
      action/action_periodos_update.php
  38. 27 27
      action/action_periodousuario_update.php
  39. 39 39
      action/action_permisos_update.php
  40. 13 13
      action/action_profesor.php
  41. 39 39
      action/action_profesor_faltas.php
  42. 6 6
      action/action_profesores_borra.php
  43. 74 74
      action/action_profesores_insert.php
  44. 10 10
      action/action_profesores_select.php
  45. 35 35
      action/action_profesores_update.php
  46. 54 54
      action/action_reposiciones.php
  47. 50 50
      action/action_revisar_excel.php
  48. 10 10
      action/action_roles_insert.php
  49. 10 10
      action/action_roles_select.php
  50. 10 10
      action/action_roles_update.php
  51. 36 36
      action/action_tiempos_update.php
  52. 22 22
      action/action_usuario.php
  53. 21 21
      action/action_usuarios_insert.php
  54. 7 7
      action/action_usuarios_select.php
  55. 14 14
      action/action_usuarios_update.php
  56. 9 9
      action/carrera_find.php
  57. 36 36
      action/force_session.php
  58. 59 59
      action/registro_supervisor.php
  59. 27 27
      action/rutas.php
  60. 72 72
      action/rutas_salón_horario.php
  61. 24 24
      action/schemas/registro_supervisor.json
  62. 25 25
      action/usuario_find.php
  63. 285 285
      alta_de_horario.php
  64. 421 376
      auditoría.php
  65. 264 264
      avisos.php
  66. 434 434
      avisos_crear.php
  67. 436 436
      avisos_editar.php
  68. 57 57
      base.php
  69. 138 138
      bypass.php
  70. 812 812
      carreras.php
  71. 73 73
      class/c_logasistencia.php
  72. 142 129
      class/c_login.php
  73. 14 14
      class/c_menu.php
  74. 56 56
      class/connection.php
  75. 1612 1612
      consultar_horario.php
  76. 46 46
      css/checador.css
  77. 9 9
      css/custominputfile.min.css
  78. 189 189
      css/richtext.css
  79. 234 234
      demo.html
  80. 342 342
      días_festivos.php
  81. 110 110
      editar_horario.php
  82. 208 208
      excel_horario.php
  83. 282 282
      facultades.php
  84. 134 134
      horario_profesor.php
  85. 5 5
      import/html_css_files.php
  86. 104 104
      import/html_footer.php
  87. 21 21
      import/html_forms.php
  88. 138 138
      import/html_forms_asistencia.php
  89. 110 110
      import/html_forms_justificacion.php
  90. 162 162
      import/html_forms_vista.php
  91. 149 160
      import/html_header.php
  92. 31 32
      import/html_header_index.php
  93. 46 46
      import/html_navtoggle.php
  94. 41 41
      import/html_scroll.php
  95. 64 63
      import/periodo.php
  96. 63 63
      include/bd_pdo.php
  97. 165 165
      include/func_excel.php
  98. 10 10
      include/func_string.php
  99. BIN
      include/lastbackup.tar
  100. 13 13
      include/nocache.php

+ 43 - 43
action/action_asistencias.php

@@ -1,43 +1,43 @@
-<?php
-$ruta = "../";
-require_once "../class/c_login.php";
-
-// check if the session is started
-if (!isset($_SESSION['user']))
-    die(json_encode(['error' => 'No se ha iniciado sesión']));
-
-$user = unserialize($_SESSION['user']);
-
-extract($_POST);
-
-$initial_date = DateTime::createFromFormat('d/m/Y', $fecha_inicial);
-$final_date = DateTime::createFromFormat('d/m/Y', $fecha_final);
-
-if ($initial_date > $final_date) {
-    echo json_encode(['error' => 'La fecha inicial no puede ser mayor a la fecha final']);
-    die;
-}
-// Nombre del profesor es opcional
-$params = [
-    ':carrera' => empty($carrera) ? null : $carrera,
-    ':periodo' => $periodo,
-    ':nombre' => empty($nombre) ? null : $nombre,
-    ':clave' => empty($clave) ? null : $clave,
-    ':initial_date' => $initial_date->format('Y-m-d'),
-    ':final_date' => $final_date->format('Y-m-d'),
-    ':facultad' => $facultad,
-];
-
-$response = json_encode(
-    [
-        "retardo" => query("SELECT FS_HAS_RETARDO(:facultad) retardo", [
-            'facultad' => $facultad
-        ]),
-        "reporte" => queryAll(
-            "SELECT * FROM fs_asistencia_reporte(:carrera, :periodo, :clave, :nombre, :facultad, :initial_date, :final_date) where total > 0",
-            $params
-        )
-    ]
-);
-$user->print_to_log("Genera reporte de asistencias", old: $params);
-echo $response;
+<?php
+$ruta = "../";
+require_once "../class/c_login.php";
+
+// check if the session is started
+if (!isset($_SESSION['user']))
+    die(json_encode(['error' => 'No se ha iniciado sesión']));
+
+$user = unserialize($_SESSION['user']);
+
+extract($_POST);
+
+$initial_date = DateTime::createFromFormat('d/m/Y', $fecha_inicial);
+$final_date = DateTime::createFromFormat('d/m/Y', $fecha_final);
+
+if ($initial_date > $final_date) {
+    echo json_encode(['error' => 'La fecha inicial no puede ser mayor a la fecha final']);
+    die;
+}
+// Nombre del profesor es opcional
+$params = [
+    ':carrera' => empty($carrera) ? null : $carrera,
+    ':periodo' => $periodo,
+    ':nombre' => empty($nombre) ? null : $nombre,
+    ':clave' => empty($clave) ? null : $clave,
+    ':initial_date' => $initial_date->format('Y-m-d'),
+    ':final_date' => $final_date->format('Y-m-d'),
+    ':facultad' => $facultad,
+];
+
+$response = json_encode(
+    [
+        "retardo" => query("SELECT FS_HAS_RETARDO(:facultad) retardo", [
+            'facultad' => $facultad
+        ]),
+        "reporte" => queryAll(
+            "SELECT * FROM fs_asistencia_reporte(:carrera, :periodo, :clave, :nombre, :facultad, :initial_date, :final_date) where total > 0",
+            $params
+        )
+    ]
+);
+$user->print_to_log("Genera reporte de asistencias", old: $params);
+echo $response;

+ 100 - 100
action/action_asistencias_excel.php

@@ -1,100 +1,100 @@
-<?php
-$ruta = "../";
-require_once "../vendor/autoload.php";
-require_once "../class/c_login.php";
-    
-if (!isset($_SESSION['user']))
-    die(json_encode(['error' => 'No se ha iniciado sesión']));
-
-$user = unserialize($_SESSION['user']);
-$user->print_to_log('Genera excel de asistencias');
-
-use PhpOffice\PhpSpreadsheet\Spreadsheet;
-
-$spreadsheet = new Spreadsheet();
-$sheet = $spreadsheet->getActiveSheet();
-
-//crea imagen 
-$drawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing();
-$drawing->setName('La Salle');
-$drawing->setDescription('La Salle');
-$drawing->setPath('../imagenes/logo.png'); // put your path and image here
-$drawing->setCoordinates('A1');
-$drawing->setHeight(100);
-$drawing->setOffsetX(10);
-//agrega imagen
-$drawing->setWorksheet($spreadsheet->getActiveSheet());
-
-
-// In POST
-/** Array
- * * nombre
- * * clave
- * * id
- * * total
- * * asistencias
- * * faltas
- * * justificaciones
- * * retardos
- */
-
-$retardo = query("SELECT COALESCE(FS_HAS_RETARDO(:facultad), FALSE) AS retardo", [':facultad' => $user->facultad['facultad_id']])['retardo'];
-extract($_POST);
-
-$row = 6;
-
-$sheet->setCellValue("A$row", 'Clave');
-$sheet->setCellValue("B$row", 'Profesor');
-$sheet->setCellValue("C$row", 'Asistencias');
-$sheet->setCellValue("D$row", 'Faltas');
-$sheet->setCellValue("E$row", 'Justificaciones');
-$sheet->setCellValue("F$row", 'Retardos');
-$sheet->setCellValue("G$row", 'Total');
-
-// $row++;
-$col = 0;
-# die(print_r($asistencias, true));
-foreach (json_decode($asistencias, true) as $profesor) {
-    $row++;
-    $sheet->setCellValue("A$row", $profesor['profesor_clave']);
-    $sheet->setCellValue("B$row", $profesor['profesor_nombre']);
-    $sheet->setCellValue("C$row", $profesor['asistencias']);
-    $sheet->setCellValue("D$row", $profesor['faltas']);
-    $sheet->setCellValue("E$row", $profesor['justificaciones']);
-    $sheet->setCellValue("F$row", $profesor['retardos']);
-    $sheet->setCellValue("G$row", $profesor['total']);
-}
-
-# Style
-$sheet->getStyle("A6:G$row")->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
-$sheet->getStyle("A6:G$row")->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
-$sheet->getStyle("A6:G$row")->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER);
-$sheet->getStyle("A6:G$row")->getAlignment()->setWrapText(true);
-$sheet->getStyle("A6:G$row")->getFont()->setSize(12);
-$sheet->getStyle("A6:G$row")->getFont()->setName('Indivisa Sans');
-# Autosize columns
-foreach (range('A', 'G') as $column) {
-    $sheet->getColumnDimension($column)->setAutoSize(true);
-}
-# filters in the column
-$sheet->setAutoFilter("A6:G6");
-
-if (!$retardo) # hide column
-    $sheet->getColumnDimension('F')->setVisible(false);
-
-#$writer = new Xlsx($spreadsheet);
-$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
-# $writer->save('asistencias.xlsx');
-
-// download
-header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
-header('Content-Disposition: attachment;filename="asistencias.xlsx"');
-header('Cache-Control: max-age=0');
-
-// cache expires in 60 seconds (1 minute)
-header('Expires: mon 26 jul 1997 05:00:00 gmt');
-header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
-header('Cache-Control: cache, must-revalidate');
-header('Pragma: public');
-
-$writer->save('php://output');
+<?php
+$ruta = "../";
+require_once "../vendor/autoload.php";
+require_once "../class/c_login.php";
+    
+if (!isset($_SESSION['user']))
+    die(json_encode(['error' => 'No se ha iniciado sesión']));
+
+$user = unserialize($_SESSION['user']);
+$user->print_to_log('Genera excel de asistencias');
+
+use PhpOffice\PhpSpreadsheet\Spreadsheet;
+
+$spreadsheet = new Spreadsheet();
+$sheet = $spreadsheet->getActiveSheet();
+
+//crea imagen 
+$drawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing();
+$drawing->setName('La Salle');
+$drawing->setDescription('La Salle');
+$drawing->setPath('../imagenes/logo.png'); // put your path and image here
+$drawing->setCoordinates('A1');
+$drawing->setHeight(100);
+$drawing->setOffsetX(10);
+//agrega imagen
+$drawing->setWorksheet($spreadsheet->getActiveSheet());
+
+
+// In POST
+/** Array
+ * * nombre
+ * * clave
+ * * id
+ * * total
+ * * asistencias
+ * * faltas
+ * * justificaciones
+ * * retardos
+ */
+
+$retardo = query("SELECT COALESCE(FS_HAS_RETARDO(:facultad), FALSE) AS retardo", [':facultad' => $user->facultad['facultad_id']])['retardo'];
+extract($_POST);
+
+$row = 6;
+
+$sheet->setCellValue("A$row", 'Clave');
+$sheet->setCellValue("B$row", 'Profesor');
+$sheet->setCellValue("C$row", 'Asistencias');
+$sheet->setCellValue("D$row", 'Faltas');
+$sheet->setCellValue("E$row", 'Justificaciones');
+$sheet->setCellValue("F$row", 'Retardos');
+$sheet->setCellValue("G$row", 'Total');
+
+// $row++;
+$col = 0;
+# die(print_r($asistencias, true));
+foreach (json_decode($asistencias, true) as $profesor) {
+    $row++;
+    $sheet->setCellValue("A$row", $profesor['profesor_clave']);
+    $sheet->setCellValue("B$row", $profesor['profesor_nombre']);
+    $sheet->setCellValue("C$row", $profesor['asistencias']);
+    $sheet->setCellValue("D$row", $profesor['faltas']);
+    $sheet->setCellValue("E$row", $profesor['justificaciones']);
+    $sheet->setCellValue("F$row", $profesor['retardos']);
+    $sheet->setCellValue("G$row", $profesor['total']);
+}
+
+# Style
+$sheet->getStyle("A6:G$row")->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
+$sheet->getStyle("A6:G$row")->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
+$sheet->getStyle("A6:G$row")->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER);
+$sheet->getStyle("A6:G$row")->getAlignment()->setWrapText(true);
+$sheet->getStyle("A6:G$row")->getFont()->setSize(12);
+$sheet->getStyle("A6:G$row")->getFont()->setName('Indivisa Sans');
+# Autosize columns
+foreach (range('A', 'G') as $column) {
+    $sheet->getColumnDimension($column)->setAutoSize(true);
+}
+# filters in the column
+$sheet->setAutoFilter("A6:G6");
+
+if (!$retardo) # hide column
+    $sheet->getColumnDimension('F')->setVisible(false);
+
+#$writer = new Xlsx($spreadsheet);
+$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
+# $writer->save('asistencias.xlsx');
+
+// download
+header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
+header('Content-Disposition: attachment;filename="asistencias.xlsx"');
+header('Cache-Control: max-age=0');
+
+// cache expires in 60 seconds (1 minute)
+header('Expires: mon 26 jul 1997 05:00:00 gmt');
+header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
+header('Cache-Control: cache, must-revalidate');
+header('Pragma: public');
+
+$writer->save('php://output');

+ 56 - 56
action/action_auditoria.php

@@ -1,57 +1,57 @@
-<?
-#input $_GET['id_espacio_sgu']
-#output rutas: [ ...ruta, salones: [{...salon}] ]
-header('Content-Type: application/json charset=utf-8');
-$information = [
-    'GET' => [
-        #'periodo_id',
-    ],
-];
-$ruta = "../";
-require_once "../class/c_login.php";
-// check method
-try {
-
-
-    if ($_SERVER['REQUEST_METHOD'] === 'GET') {
-        array_walk($information['GET'], function ($value) {
-            if (!array_key_exists($value, $_GET)) {
-                http_response_code(400);
-                echo json_encode(['error' => "$value is required"]);
-                exit;
-            }
-        });
-
-        $data = $db->query("SELECT *, horario_view.facultad_id FROM registro
-                            JOIN horario_view USING (horario_id)
-                            LEFT JOIN estado_supervisor USING (estado_supervisor_id)
-                            LEFT JOIN profesor USING (profesor_id)
-                            LEFT JOIN usuario ON usuario.usuario_id = registro.supervisor_id
-                            ORDER BY registro_fecha_ideal DESC, horario_hora ASC, registro_fecha_supervisor ASC");
-
-        $last_query = [
-            'query' => $db->getLastQuery(),
-        ];
-
-        echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
-    } else {
-        http_response_code(405);
-        echo json_encode(['error' => 'method not allowed']);
-        exit;
-
-    }
-
-} catch (PDOException $th) {
-    http_response_code(500);
-    echo json_encode([
-        'error' => $th->getMessage(),
-        'query' => $db->getLastQuery(),
-    ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
-    exit;
-} catch (Exception $th) {
-    http_response_code(500);
-    echo json_encode([
-        'error' => $th->getMessage(),
-    ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
-    exit;
+<?
+#input $_GET['id_espacio_sgu']
+#output rutas: [ ...ruta, salones: [{...salon}] ]
+header('Content-Type: application/json charset=utf-8');
+$information = [
+    'GET' => [
+        #'periodo_id',
+    ],
+];
+$ruta = "../";
+require_once "../class/c_login.php";
+// check method
+try {
+
+
+    if ($_SERVER['REQUEST_METHOD'] === 'GET') {
+        array_walk($information['GET'], function ($value) {
+            if (!array_key_exists($value, $_GET)) {
+                http_response_code(400);
+                echo json_encode(['error' => "$value is required"]);
+                exit;
+            }
+        });
+
+        $data = $db->query("SELECT *, horario_view.facultad_id, horario_view.periodo_id FROM registro
+                            JOIN horario_view USING (horario_id)
+                            LEFT JOIN estado_supervisor USING (estado_supervisor_id)
+                            LEFT JOIN profesor USING (profesor_id)
+                            LEFT JOIN usuario ON usuario.usuario_id = registro.supervisor_id
+                            ORDER BY registro_fecha_ideal DESC, horario_hora ASC, registro_fecha_supervisor ASC");
+
+        $last_query = [
+            'query' => $db->getLastQuery(),
+        ];
+
+        echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
+    } else {
+        http_response_code(405);
+        echo json_encode(['error' => 'method not allowed']);
+        exit;
+
+    }
+
+} catch (PDOException $th) {
+    http_response_code(500);
+    echo json_encode([
+        'error' => $th->getMessage(),
+        'query' => $db->getLastQuery(),
+    ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
+    exit;
+} catch (Exception $th) {
+    http_response_code(500);
+    echo json_encode([
+        'error' => $th->getMessage(),
+    ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
+    exit;
 }

+ 8 - 8
action/action_avisos_delete.php

@@ -1,9 +1,9 @@
-<?php
-$ruta = '../';
-require_once '../include/bd_pdo.php';
-global $pdo;
-
-$sql = "SELECT fu_update_estado_aviso(false, :id)";
-$params = [':id' => $_POST['id']];
-echo json_encode(query($sql, $params, false));
+<?php
+$ruta = '../';
+require_once '../include/bd_pdo.php';
+global $pdo;
+
+$sql = "SELECT fu_update_estado_aviso(false, :id)";
+$params = [':id' => $_POST['id']];
+echo json_encode(query($sql, $params, false));
 ?>

+ 27 - 27
action/action_avisos_insert.php

@@ -1,28 +1,28 @@
-<?php
-$ruta = '../';
-require_once '../include/bd_pdo.php';
-global $pdo;
-
-$profesores = [];
-
-if(isset($_POST['tipo'])){
-    foreach($_POST['tipo'] as $tipo){
-        $profesores_carrera = query("SELECT profesor_id FROM fs_profesor_carrera(:carrera_id)", [':carrera_id' => $tipo], false);
-        foreach($profesores_carrera as $profesor){
-            array_push($profesores, $profesor['profesor_id']);
-        }
-
-    }
-}
-$sql = "SELECT fi_aviso(:fecha_inicial, :fecha_final, :texto, :facultad)";
-$params = [':fecha_inicial' => $_POST['fecha_inicial'], ':fecha_final' => $_POST['fecha_final'], ':texto' => $_POST['texto'], ':facultad' => $_POST['facultad']];
-$aviso_id = query($sql, $params, true);
-
-$sql = "SELECT fi_aviso_profesor(:aviso_id, :profesor_id)";
-foreach($profesores as $profesor_id){
-    $params = [':aviso_id' => $aviso_id['fi_aviso'], ':profesor_id' => $profesor_id];
-    query($sql, $params, false);
-}
-header("Location: ../avisos.php");
-exit();
+<?php
+$ruta = '../';
+require_once '../include/bd_pdo.php';
+global $pdo;
+
+$profesores = [];
+
+if(isset($_POST['tipo'])){
+    foreach($_POST['tipo'] as $tipo){
+        $profesores_carrera = query("SELECT profesor_id FROM fs_profesor_carrera(:carrera_id)", [':carrera_id' => $tipo], false);
+        foreach($profesores_carrera as $profesor){
+            array_push($profesores, $profesor['profesor_id']);
+        }
+
+    }
+}
+$sql = "SELECT fi_aviso(:fecha_inicial, :fecha_final, :texto, :facultad)";
+$params = [':fecha_inicial' => $_POST['fecha_inicial'], ':fecha_final' => $_POST['fecha_final'], ':texto' => $_POST['texto'], ':facultad' => $_POST['facultad']];
+$aviso_id = query($sql, $params, true);
+
+$sql = "SELECT fi_aviso_profesor(:aviso_id, :profesor_id)";
+foreach($profesores as $profesor_id){
+    $params = [':aviso_id' => $aviso_id['fi_aviso'], ':profesor_id' => $profesor_id];
+    query($sql, $params, false);
+}
+header("Location: ../avisos.php");
+exit();
 ?>

+ 51 - 51
action/action_avisos_update.php

@@ -1,52 +1,52 @@
-<?php
-$ruta = '../';
-require_once '../include/bd_pdo.php';
-global $pdo;
-
-$aviso = query("SELECT * FROM fs_aviso(:id, null, null, null, 0, null)", [':id' => $_POST['aviso_id']], true);
-if(isset($_POST['fecha_final'])){
-    $fecha_fin = $_POST['fecha_final'];
-}else{
-    $fecha_fin = $aviso['aviso_fecha_final'];
-}
-if(isset($_POST['texto'])){
-    $texto = $_POST['texto'];
-}else{
-    $texto = $aviso['aviso_texto'];
-}
-if(isset($_POST['fecha_inicial'])){
-    $fecha_inicio = $_POST['fecha_inicial'];
-}else{
-    $fecha_inicio = $aviso['aviso_fecha_inicial'];
-}
-
-$sql = "SELECT fu_update_aviso(:id, :fecha_fin, :texto, :fecha_inicio)";
-$params = [':id' => $_POST['aviso_id'], ':fecha_fin' => $fecha_fin, ':texto' => $texto, ':fecha_inicio' => $fecha_inicio];
-query($sql, $params, true);
-
-query("SELECT fd_aviso_profesor(:aviso_id)", [':aviso_id' => $_POST['aviso_id']], false);
-
-$profesores = [];
-if(isset($_POST['tipo'])){
-    foreach($_POST['tipo'] as $tipo){
-        $profesores_carrera = query("SELECT profesor_id FROM fs_profesor_carrera(:carrera_id)", [':carrera_id' => $tipo], false);
-        foreach($profesores_carrera as $profesor){
-            array_push($profesores, $profesor['profesor_id']);
-        }
-
-    }
-}
-
-
-foreach($_POST['usuario'] as $profesor){
-    array_push($profesores, $profesor);
-}
-$sql = "SELECT fi_aviso_profesor(:aviso_id, :profesor_id)";
-foreach($profesores as $profesor_id){
-    $params = [':aviso_id' => $_POST['aviso_id'], ':profesor_id' => $profesor_id];
-    query($sql, $params, false);
-}
-
-header("Location: ../avisos.php");
-exit();
+<?php
+$ruta = '../';
+require_once '../include/bd_pdo.php';
+global $pdo;
+
+$aviso = query("SELECT * FROM fs_aviso(:id, null, null, null, 0, null)", [':id' => $_POST['aviso_id']], true);
+if(isset($_POST['fecha_final'])){
+    $fecha_fin = $_POST['fecha_final'];
+}else{
+    $fecha_fin = $aviso['aviso_fecha_final'];
+}
+if(isset($_POST['texto'])){
+    $texto = $_POST['texto'];
+}else{
+    $texto = $aviso['aviso_texto'];
+}
+if(isset($_POST['fecha_inicial'])){
+    $fecha_inicio = $_POST['fecha_inicial'];
+}else{
+    $fecha_inicio = $aviso['aviso_fecha_inicial'];
+}
+
+$sql = "SELECT fu_update_aviso(:id, :fecha_fin, :texto, :fecha_inicio)";
+$params = [':id' => $_POST['aviso_id'], ':fecha_fin' => $fecha_fin, ':texto' => $texto, ':fecha_inicio' => $fecha_inicio];
+query($sql, $params, true);
+
+query("SELECT fd_aviso_profesor(:aviso_id)", [':aviso_id' => $_POST['aviso_id']], false);
+
+$profesores = [];
+if(isset($_POST['tipo'])){
+    foreach($_POST['tipo'] as $tipo){
+        $profesores_carrera = query("SELECT profesor_id FROM fs_profesor_carrera(:carrera_id)", [':carrera_id' => $tipo], false);
+        foreach($profesores_carrera as $profesor){
+            array_push($profesores, $profesor['profesor_id']);
+        }
+
+    }
+}
+
+
+foreach($_POST['usuario'] as $profesor){
+    array_push($profesores, $profesor);
+}
+$sql = "SELECT fi_aviso_profesor(:aviso_id, :profesor_id)";
+foreach($profesores as $profesor_id){
+    $params = [':aviso_id' => $_POST['aviso_id'], ':profesor_id' => $profesor_id];
+    query($sql, $params, false);
+}
+
+header("Location: ../avisos.php");
+exit();
 ?>

+ 24 - 24
action/action_carreras.php

@@ -1,24 +1,24 @@
-<?php
-header('Content-Type: application/json');
-
-$ruta = "../";
-require_once "../class/c_login.php";
-
-// check if the session is started
-if (!isset($_SESSION['user']))
-    die(json_encode(['error' => 'No se ha iniciado sesión']));
-
-$user = unserialize($_SESSION['user']);
-
-$ruta = "../";
-require_once "../include/bd_pdo.php";
-
-$nivel = $db->where("id", $_POST['periodo'])->getOne("fs_periodo", "nivel_id");
-$carreras = $db
-    ->where("nivel", $nivel)
-    ->where("facultad", $_POST['facultad'])
-    ->get("fs_carrera", null, "id, carrera");
-
-$user->print_to_log("Crea carrera", old: $_POST);
-
-die(json_encode($carreras));
+<?php
+header('Content-Type: application/json');
+
+$ruta = "../";
+require_once "../class/c_login.php";
+
+// check if the session is started
+if (!isset($_SESSION['user']))
+    die(json_encode(['error' => 'No se ha iniciado sesión']));
+
+$user = unserialize($_SESSION['user']);
+
+$ruta = "../";
+require_once "../include/bd_pdo.php";
+
+$nivel = $db->where("id", $_POST['periodo'])->getOne("fs_periodo", "nivel_id");
+$carreras = $db
+    ->where("nivel", $nivel)
+    ->where("facultad", $_POST['facultad'])
+    ->get("fs_carrera", null, "id, carrera");
+
+$user->print_to_log("Crea carrera", old: $_POST);
+
+die(json_encode($carreras));

+ 19 - 19
action/action_carreras_insert.php

@@ -1,19 +1,19 @@
-<?php
-$ruta = "../";
-require_once "../class/c_login.php";
-
-// check if the session is started
-if (!isset($_SESSION['user']))
-    die(json_encode(['error' => 'No se ha iniciado sesión']));
-
-$user = unserialize($_SESSION['user']);
-$ruta = "../";
-require_once "../include/bd_pdo.php";
-$sql = "SELECT fi_carrera(:nombre, :idfacultad, :idnivel, true, :estado)";
-$params = [':nombre' => mb_strtoupper($_POST['nombre']), ':idfacultad' => $_POST['facultad'], ':idnivel' => $_POST['nivel'], ':estado' => $_POST['estado']];
-
-print_r($_POST);
-echo json_encode(query($sql, $params, true));
-$user->print_to_log("Crea carrera", new: $params);
-header("Location: ../carreras.php?facultad=" . $_POST['facultad']);
-exit();
+<?php
+$ruta = "../";
+require_once "../class/c_login.php";
+
+// check if the session is started
+if (!isset($_SESSION['user']))
+    die(json_encode(['error' => 'No se ha iniciado sesión']));
+
+$user = unserialize($_SESSION['user']);
+$ruta = "../";
+require_once "../include/bd_pdo.php";
+$sql = "SELECT fi_carrera(:nombre, :idfacultad, :idnivel, true, :estado)";
+$params = [':nombre' => mb_strtoupper($_POST['nombre']), ':idfacultad' => $_POST['facultad'], ':idnivel' => $_POST['nivel'], ':estado' => $_POST['estado']];
+
+print_r($_POST);
+echo json_encode(query($sql, $params, true));
+$user->print_to_log("Crea carrera", new: $params);
+header("Location: ../carreras.php?facultad=" . $_POST['facultad']);
+exit();

+ 16 - 16
action/action_carreras_select.php

@@ -1,16 +1,16 @@
-<?php
-$ruta = "../";
-require_once "../class/c_login.php";
-
-// check if the session is started
-if (!isset($_SESSION['user']))
-    die(json_encode(['error' => 'No se ha iniciado sesión']));
-
-$user = unserialize($_SESSION['user']);
-$ruta = "../";
-require_once "../include/bd_pdo.php";
-global $pdo;
-$sql = "SELECT * FROM  fs_carreras(:idfacultad, :idcarrera, null)";
-$params = [':idfacultad' => $_POST['idfacultad'], ':idcarrera' => $_POST['idcarrera']];
-$user->print_to_log("Crea carrera", old: $params);
-echo json_encode(query($sql, $params, true));
+<?php
+$ruta = "../";
+require_once "../class/c_login.php";
+
+// check if the session is started
+if (!isset($_SESSION['user']))
+    die(json_encode(['error' => 'No se ha iniciado sesión']));
+
+$user = unserialize($_SESSION['user']);
+$ruta = "../";
+require_once "../include/bd_pdo.php";
+global $pdo;
+$sql = "SELECT * FROM  fs_carreras(:idfacultad, :idcarrera, null)";
+$params = [':idfacultad' => $_POST['idfacultad'], ':idcarrera' => $_POST['idcarrera']];
+$user->print_to_log("Crea carrera", old: $params);
+echo json_encode(query($sql, $params, true));

+ 18 - 18
action/action_carreras_update.php

@@ -1,19 +1,19 @@
-<?php
-$ruta = "../";
-require_once "../class/c_login.php";
-
-// check if the session is started
-if (!isset($_SESSION['user']))
-    die(json_encode(['error' => 'No se ha iniciado sesión']));
-
-$user = unserialize($_SESSION['user']);
-$ruta = "../";
-require_once "../include/bd_pdo.php";
-$old = query("SELECT * FROM FS_CARRERA WHERE ID = :id", [':id' => $_POST['id']]);
-$sql = "SELECT fu_updatecarrera(:idcarrera, :nombre, :activa, :idnivel)";
-print_r($_POST);
-$params = [':idcarrera' => $_POST['id'], ':nombre' => mb_strtoupper($_POST['nombre']), ':activa' => $_POST['estado'], ':idnivel' => $_POST['nivel']];
-query($sql, $params, true);
-$user->print_to_log("Actualiza carrera.", old: $old, new: $params);
-header("Location: ../carreras.php?facultad=" . $_POST['facultad']);
+<?php
+$ruta = "../";
+require_once "../class/c_login.php";
+
+// check if the session is started
+if (!isset($_SESSION['user']))
+    die(json_encode(['error' => 'No se ha iniciado sesión']));
+
+$user = unserialize($_SESSION['user']);
+$ruta = "../";
+require_once "../include/bd_pdo.php";
+$old = query("SELECT * FROM FS_CARRERA WHERE ID = :id", [':id' => $_POST['id']]);
+$sql = "SELECT fu_updatecarrera(:idcarrera, :nombre, :activa, :idnivel)";
+print_r($_POST);
+$params = [':idcarrera' => $_POST['id'], ':nombre' => mb_strtoupper($_POST['nombre']), ':activa' => $_POST['estado'], ':idnivel' => $_POST['nivel']];
+query($sql, $params, true);
+$user->print_to_log("Actualiza carrera.", old: $old, new: $params);
+header("Location: ../carreras.php?facultad=" . $_POST['facultad']);
 exit();

+ 15 - 15
action/action_diasfestivos_borra.php

@@ -1,15 +1,15 @@
-<?php
-$ruta = "../";
-require_once "../class/c_login.php";
-
-// check if the session is started
-if (!isset($_SESSION['user']))
-    die(json_encode(['error' => 'No se ha iniciado sesión']));
-
-$user = unserialize($_SESSION['user']);
-$ruta = "../";
-require_once "../include/bd_pdo.php";
-#$sql = "SELECT * FROM diasfestivos WHERE diasfestivos_id = :id";
-$sql = "DELETE FROM diasfestivos WHERE diasfestivos_id = :id";
-$params = [':id' => $_POST['id']];
-echo json_encode(query($sql, $params, false));
+<?php
+$ruta = "../";
+require_once "../class/c_login.php";
+
+// check if the session is started
+if (!isset($_SESSION['user']))
+    die(json_encode(['error' => 'No se ha iniciado sesión']));
+
+$user = unserialize($_SESSION['user']);
+$ruta = "../";
+require_once "../include/bd_pdo.php";
+#$sql = "SELECT * FROM diasfestivos WHERE diasfestivos_id = :id";
+$sql = "DELETE FROM diasfestivos WHERE diasfestivos_id = :id";
+$params = [':id' => $_POST['id']];
+echo json_encode(query($sql, $params, false));

+ 48 - 48
action/action_diasfestivos_insert.php

@@ -1,48 +1,48 @@
-<?php
-$ruta = "../";
-require_once "../class/c_login.php";
-
-// check if the session is started
-if (!isset($_SESSION['user']))
-    die(json_encode(['error' => 'No se ha iniciado sesión']));
-
-$user = unserialize($_SESSION['user']);
-$ruta = "../";
-require_once "../include/bd_pdo.php";
-global $pdo;
-print_r($_POST);
-if ($_POST['periodo'] == 0) {
-    $periodo = null;
-} else {
-    $periodo = $_POST['periodo'];
-}
-if (isset($_POST['rango'])) {
-    $diaInicio  = new DateTime(date("Y-m-d", strtotime(str_replace("/", "-", $_POST['diaFestivo']))));
-    $diaFin = new DateTime(date("Y-m-d", strtotime(str_replace("/", "-", $_POST['diaFestivoFin']))));
-    $cantidad = $diaFin->diff($diaInicio);
-    $date = date("Y-m-d", strtotime(str_replace("/", "-", $_POST['diaFestivo'])));
-    for ($dias = 0; $dias <= $cantidad->days; $dias++) {
-        $sql = "SELECT fi_diasfestivos(:periodo, :dia)";
-        $params = [':periodo' => $periodo, ':dia' => $date];
-        query($sql, $params, false);
-        $date = date("Y-m-d", strtotime($date . "+ 1 days"));
-    }
-    header("Location: ../días_festivos.php");
-    exit();
-} else {
-    $sql = "SELECT * FROM fs_diasfestivos(null, :dia)";
-    $params = [':dia' => $_POST['diaFestivo']];
-    $dia_general = query($sql, $params, false);
-    $sql = "SELECT * FROM fs_diasfestivos(null, null, :periodo, :dia)";
-    $params = [':periodo' => $periodo, ":dia" => $_POST['diaFestivo']];
-    $dia = query($sql, $params, false);
-    if (!$dia && !$dia_general) { //no hay repetidos
-        $sql = "SELECT fi_diasfestivos(:periodo, :dia)";
-        $id = query($sql, $params, false);
-        header("Location: ../días_festivos.php");
-        exit();
-    } else {
-        header("Location: ../días_festivos.php?error=1");
-        exit();
-    }
-}
+<?php
+$ruta = "../";
+require_once "../class/c_login.php";
+
+// check if the session is started
+if (!isset($_SESSION['user']))
+    die(json_encode(['error' => 'No se ha iniciado sesión']));
+
+$user = unserialize($_SESSION['user']);
+$ruta = "../";
+require_once "../include/bd_pdo.php";
+global $pdo;
+print_r($_POST);
+if ($_POST['periodo'] == 0) {
+    $periodo = null;
+} else {
+    $periodo = $_POST['periodo'];
+}
+if (isset($_POST['rango'])) {
+    $diaInicio  = new DateTime(date("Y-m-d", strtotime(str_replace("/", "-", $_POST['diaFestivo']))));
+    $diaFin = new DateTime(date("Y-m-d", strtotime(str_replace("/", "-", $_POST['diaFestivoFin']))));
+    $cantidad = $diaFin->diff($diaInicio);
+    $date = date("Y-m-d", strtotime(str_replace("/", "-", $_POST['diaFestivo'])));
+    for ($dias = 0; $dias <= $cantidad->days; $dias++) {
+        $sql = "SELECT fi_diasfestivos(:periodo, :dia)";
+        $params = [':periodo' => $periodo, ':dia' => $date];
+        query($sql, $params, false);
+        $date = date("Y-m-d", strtotime($date . "+ 1 days"));
+    }
+    header("Location: ../días_festivos.php");
+    exit();
+} else {
+    $sql = "SELECT * FROM fs_diasfestivos(null, :dia)";
+    $params = [':dia' => $_POST['diaFestivo']];
+    $dia_general = query($sql, $params, false);
+    $sql = "SELECT * FROM fs_diasfestivos(null, null, :periodo, :dia)";
+    $params = [':periodo' => $periodo, ":dia" => $_POST['diaFestivo']];
+    $dia = query($sql, $params, false);
+    if (!$dia && !$dia_general) { //no hay repetidos
+        $sql = "SELECT fi_diasfestivos(:periodo, :dia)";
+        $id = query($sql, $params, false);
+        header("Location: ../días_festivos.php");
+        exit();
+    } else {
+        header("Location: ../días_festivos.php?error=1");
+        exit();
+    }
+}

+ 19 - 19
action/action_diasfestivos_select.php

@@ -1,19 +1,19 @@
-<?php
-$ruta = "../";
-require_once "../class/c_login.php";
-
-// check if the session is started
-if (!isset($_SESSION['user']))
-    die(json_encode(['error' => 'No se ha iniciado sesión']));
-
-$user = unserialize($_SESSION['user']);
-$ruta = "../";
-require_once "../include/bd_pdo.php";
-global $pdo;
-$params = [':id' => $_POST['id']];
-if ($_POST['periodo'] == 0) {
-    $sql = "SELECT * FROM fs_diasfestivos(:id, null)";
-} else {
-    $sql = "SELECT * FROM fs_diasfestivos(null, :id, null, null)";
-}
-echo json_encode(query($sql, $params, true));
+<?php
+$ruta = "../";
+require_once "../class/c_login.php";
+
+// check if the session is started
+if (!isset($_SESSION['user']))
+    die(json_encode(['error' => 'No se ha iniciado sesión']));
+
+$user = unserialize($_SESSION['user']);
+$ruta = "../";
+require_once "../include/bd_pdo.php";
+global $pdo;
+$params = [':id' => $_POST['id']];
+if ($_POST['periodo'] == 0) {
+    $sql = "SELECT * FROM fs_diasfestivos(:id, null)";
+} else {
+    $sql = "SELECT * FROM fs_diasfestivos(null, :id, null, null)";
+}
+echo json_encode(query($sql, $params, true));

+ 31 - 31
action/action_diasfestivos_update.php

@@ -1,31 +1,31 @@
-<?php
-$ruta = "../";
-require_once "../class/c_login.php";
-
-// check if the session is started
-if (!isset($_SESSION['user']))
-    die(json_encode(['error' => 'No se ha iniciado sesión']));
-
-$user = unserialize($_SESSION['user']);
-$ruta = "../";
-require_once "../include/bd_pdo.php";
-global $pdo;
-if ($_POST['periodo'] == 0) {
-    $periodo = null;
-} else
-    $periodo = $_POST['periodo'];
-$sql = "SELECT * FROM fs_diasfestivos(null, :dia) WHERE diasfestivos_id != :id";
-$params = [':dia' => $_POST['diaFestivo'], ':id' => $_POST['id']];
-$dia_general = query($sql, $params, false);
-$sql = "SELECT * FROM fs_diasfestivos(null, null, :periodo, :dia) WHERE diasfestivos_id != :id";
-$params = [':periodo' => $periodo, ':dia' => $_POST['diaFestivo'], ':id' => $_POST['id']];
-$dia = query($sql, $params, false);
-if (!$dia && !$dia_general) { //no hay repetidos
-    $sql = "SELECT fu_update_diasfestivos(:id, :dia, :periodo)";
-    query($sql, $params, false);
-    header("Location: ../días_festivos.php");
-    exit();
-} else { //es repetido
-    header("Location: ../días_festivos.php?error=1");
-    exit();
-}
+<?php
+$ruta = "../";
+require_once "../class/c_login.php";
+
+// check if the session is started
+if (!isset($_SESSION['user']))
+    die(json_encode(['error' => 'No se ha iniciado sesión']));
+
+$user = unserialize($_SESSION['user']);
+$ruta = "../";
+require_once "../include/bd_pdo.php";
+global $pdo;
+if ($_POST['periodo'] == 0) {
+    $periodo = null;
+} else
+    $periodo = $_POST['periodo'];
+$sql = "SELECT * FROM fs_diasfestivos(null, :dia) WHERE diasfestivos_id != :id";
+$params = [':dia' => $_POST['diaFestivo'], ':id' => $_POST['id']];
+$dia_general = query($sql, $params, false);
+$sql = "SELECT * FROM fs_diasfestivos(null, null, :periodo, :dia) WHERE diasfestivos_id != :id";
+$params = [':periodo' => $periodo, ':dia' => $_POST['diaFestivo'], ':id' => $_POST['id']];
+$dia = query($sql, $params, false);
+if (!$dia && !$dia_general) { //no hay repetidos
+    $sql = "SELECT fu_update_diasfestivos(:id, :dia, :periodo)";
+    query($sql, $params, false);
+    header("Location: ../días_festivos.php");
+    exit();
+} else { //es repetido
+    header("Location: ../días_festivos.php?error=1");
+    exit();
+}

+ 41 - 41
action/action_estado_supervisor.php

@@ -1,42 +1,42 @@
-<?
-#input $_GET['id_espacio_sgu']
-define("INFORMATION", [
-    'GET' => [
-    ],
-]);
-#output rutas: [ ...ruta, salones: [{...salon}] ]
-header('Content-Type: application/json charset=utf-8');
-#return html
-$ruta = "../";
-require_once "../class/c_login.php";
-// check method
-try {
-    if ($_SERVER['REQUEST_METHOD'] === 'GET') {
-        // check parameters
-        $raw = file_get_contents('php://input');
-        $post_get = json_decode($raw, true);
-        
-        $data = $db->get('estado_supervisor');
-        echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
-    } else {
-        http_response_code(405);
-        echo json_encode(['error' => 'method not allowed']);
-        exit;
-
-    }
-
-} catch (PDOException $th) {
-    http_response_code(500);
-    echo json_encode([
-        'error' => $th->getMessage(),
-        'query' => $db->getLastQuery(),
-        'post_data' => $post_get,
-    ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
-    exit;
-} catch (Exception $th) {
-    http_response_code(500);
-    echo json_encode([
-        'error' => $th->getMessage(),
-    ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
-    exit;
+<?
+#input $_GET['id_espacio_sgu']
+define("INFORMATION", [
+    'GET' => [
+    ],
+]);
+#output rutas: [ ...ruta, salones: [{...salon}] ]
+header('Content-Type: application/json charset=utf-8');
+#return html
+$ruta = "../";
+require_once "../class/c_login.php";
+// check method
+try {
+    if ($_SERVER['REQUEST_METHOD'] === 'GET') {
+        // check parameters
+        $raw = file_get_contents('php://input');
+        $post_get = json_decode($raw, true);
+        
+        $data = $db->get('estado_supervisor');
+        echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
+    } else {
+        http_response_code(405);
+        echo json_encode(['error' => 'method not allowed']);
+        exit;
+
+    }
+
+} catch (PDOException $th) {
+    http_response_code(500);
+    echo json_encode([
+        'error' => $th->getMessage(),
+        'query' => $db->getLastQuery(),
+        'post_data' => $post_get,
+    ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
+    exit;
+} catch (Exception $th) {
+    http_response_code(500);
+    echo json_encode([
+        'error' => $th->getMessage(),
+    ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
+    exit;
 }

+ 50 - 50
action/action_facultad.php

@@ -1,51 +1,51 @@
-<?
-$information = [
-    'GET' => [],
-];
-header('Content-Type: application/json charset=utf-8');
-$ruta = "../";
-require_once "../class/c_login.php";
-
-// check if the session is started
-if (!isset($_SESSION['user'])) {
-    http_response_code(500);
-    echo json_encode([
-        'error' => 'No se ha iniciado sesión'
-    ]);
-    exit;
-}
-
-$user = unserialize($_SESSION['user']);
-try {
-    if ($_SERVER['REQUEST_METHOD'] === 'GET') {
-        // check parameters
-        array_walk($information['GET'], function ($value) {
-            if (!array_key_exists($value, $_GET)) {
-                http_response_code(400);
-                echo json_encode(['error' => "$value is required"]);
-                exit;
-            }
-        });
-        // step 1: get subrutas
-        $data = $db->get('facultad');
-
-        echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
-    } else {
-        http_response_code(405);
-        echo json_encode(['error' => 'method not allowed']);
-        exit;
-    }
-} catch (PDOException $th) {
-    http_response_code(500);
-    echo json_encode([
-        'error' => $th->getMessage(),
-        'query' => $db->getLastQuery(),
-    ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
-    exit;
-} catch (Exception $th) {
-    http_response_code(500);
-    echo json_encode([
-        'error' => $th->getMessage(),
-    ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
-    exit;
+<?
+$information = [
+    'GET' => [],
+];
+header('Content-Type: application/json charset=utf-8');
+$ruta = "../";
+require_once "../class/c_login.php";
+
+// check if the session is started
+if (!isset($_SESSION['user'])) {
+    http_response_code(500);
+    echo json_encode([
+        'error' => 'No se ha iniciado sesión'
+    ]);
+    exit;
+}
+
+$user = unserialize($_SESSION['user']);
+try {
+    if ($_SERVER['REQUEST_METHOD'] === 'GET') {
+        // check parameters
+        array_walk($information['GET'], function ($value) {
+            if (!array_key_exists($value, $_GET)) {
+                http_response_code(400);
+                echo json_encode(['error' => "$value is required"]);
+                exit;
+            }
+        });
+        // step 1: get subrutas
+        $data = $db->get('facultad');
+
+        echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
+    } else {
+        http_response_code(405);
+        echo json_encode(['error' => 'method not allowed']);
+        exit;
+    }
+} catch (PDOException $th) {
+    http_response_code(500);
+    echo json_encode([
+        'error' => $th->getMessage(),
+        'query' => $db->getLastQuery(),
+    ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
+    exit;
+} catch (Exception $th) {
+    http_response_code(500);
+    echo json_encode([
+        'error' => $th->getMessage(),
+    ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
+    exit;
 }

+ 23 - 23
action/action_facultades_insert.php

@@ -1,23 +1,23 @@
-<?php
-$ruta = "../";
-require_once "../class/c_login.php";
-
-// check if the session is started
-if (!isset($_SESSION['user']))
-    die(json_encode(['error' => 'No se ha iniciado sesión']));
-
-$user = unserialize($_SESSION['user']);
-$ruta = "../";
-require_once "../include/bd_pdo.php";
-global $pdo;
-$sql = "SELECT fi_facultad(:nombre, :activa)";
-$params = [':nombre' => mb_strtoupper($_POST['nombre']), ':activa' => $_POST['estado']];
-$fac_id = query($sql, $params, true);
-$sql = "SELECT fi_tiempo_checado(:idfacultad, :idnivel, :antes, :despues, :retardo)";
-$params = [':idfacultad' => $fac_id['fi_facultad'], ':idnivel' => 1, ':antes' => -15, ':despues' => 16, ':retardo' => 31];
-query($sql, $params, false);
-$params = [':idfacultad' => $fac_id['fi_facultad'], ':idnivel' => 2, ':antes' => -15, ':despues' => 16, ':retardo' => 31];
-query($sql, $params, false);
-print_r($fac_id);
-header("Location: ../carreras.php?facultad=" . $fac_id['fi_facultad']);
-exit();
+<?php
+$ruta = "../";
+require_once "../class/c_login.php";
+
+// check if the session is started
+if (!isset($_SESSION['user']))
+    die(json_encode(['error' => 'No se ha iniciado sesión']));
+
+$user = unserialize($_SESSION['user']);
+$ruta = "../";
+require_once "../include/bd_pdo.php";
+global $pdo;
+$sql = "SELECT fi_facultad(:nombre, :activa)";
+$params = [':nombre' => mb_strtoupper($_POST['nombre']), ':activa' => $_POST['estado']];
+$fac_id = query($sql, $params, true);
+$sql = "SELECT fi_tiempo_checado(:idfacultad, :idnivel, :antes, :despues, :retardo)";
+$params = [':idfacultad' => $fac_id['fi_facultad'], ':idnivel' => 1, ':antes' => -15, ':despues' => 16, ':retardo' => 31];
+query($sql, $params, false);
+$params = [':idfacultad' => $fac_id['fi_facultad'], ':idnivel' => 2, ':antes' => -15, ':despues' => 16, ':retardo' => 31];
+query($sql, $params, false);
+print_r($fac_id);
+header("Location: ../carreras.php?facultad=" . $fac_id['fi_facultad']);
+exit();

+ 15 - 15
action/action_facultades_select.php

@@ -1,15 +1,15 @@
-<?php
-$ruta = "../";
-require_once "../class/c_login.php";
-
-// check if the session is started
-if (!isset($_SESSION['user']))
-    die(json_encode(['error' => 'No se ha iniciado sesión']));
-
-$user = unserialize($_SESSION['user']);
-$ruta = "../";
-require_once "../include/bd_pdo.php";
-global $pdo;
-$sql = "SELECT * FROM facultad WHERE facultad_id = :idFacultad";
-$params = [':idFacultad' => $_POST['id_facultad']];
-echo json_encode(query($sql, $params, false));
+<?php
+$ruta = "../";
+require_once "../class/c_login.php";
+
+// check if the session is started
+if (!isset($_SESSION['user']))
+    die(json_encode(['error' => 'No se ha iniciado sesión']));
+
+$user = unserialize($_SESSION['user']);
+$ruta = "../";
+require_once "../include/bd_pdo.php";
+global $pdo;
+$sql = "SELECT * FROM facultad WHERE facultad_id = :idFacultad";
+$params = [':idFacultad' => $_POST['id_facultad']];
+echo json_encode(query($sql, $params, false));

+ 17 - 17
action/action_facultades_update.php

@@ -1,17 +1,17 @@
-<?php
-$ruta = "../";
-require_once "../class/c_login.php";
-
-// check if the session is started
-if (!isset($_SESSION['user']))
-    die(json_encode(['error' => 'No se ha iniciado sesión']));
-
-$user = unserialize($_SESSION['user']);
-$ruta = "../";
-require_once "../include/bd_pdo.php";
-global $pdo;
-$sql = "SELECT fu_updatefacultad(:nombre, :activa, :id)";
-$params = [':nombre' => mb_strtoupper($_POST['nombre']), ':activa' => $_POST['estado'], ':id' => $_POST['id']];
-query($sql, $params, false);
-header("Location: ../facultades.php");
-exit();
+<?php
+$ruta = "../";
+require_once "../class/c_login.php";
+
+// check if the session is started
+if (!isset($_SESSION['user']))
+    die(json_encode(['error' => 'No se ha iniciado sesión']));
+
+$user = unserialize($_SESSION['user']);
+$ruta = "../";
+require_once "../include/bd_pdo.php";
+global $pdo;
+$sql = "SELECT fu_updatefacultad(:nombre, :activa, :id)";
+$params = [':nombre' => mb_strtoupper($_POST['nombre']), ':activa' => $_POST['estado'], ':id' => $_POST['id']];
+query($sql, $params, false);
+header("Location: ../facultades.php");
+exit();

+ 26 - 26
action/action_fechas_clase.php

@@ -1,26 +1,26 @@
-<?php
-$ruta = "../";
-require_once "../class/c_login.php";
-
-if (!isset($_SESSION['user']))
-    die(json_encode(['error' => 'No se ha iniciado sesión']));
-
-$user = unserialize($_SESSION['user']);
-$ruta = "../";
-require_once "../include/bd_pdo.php";
-
-// if method is get
-header("Content-Type: application/json");
-if ($_SERVER['REQUEST_METHOD'] === 'GET') {
-    $user->print_to_log("Acceso a reposiciones");
-    if (empty($_GET['horario_id']))
-        die(json_encode(['error' => 'No se ha enviado el id del horario']));
-    // fecha greater than today
-    $reposiciones = $db->query("SELECT fecha, EXTRACT(DOW FROM fecha) as day, EXTRACT(MONTH FROM fecha) as month, EXTRACT(YEAR FROM fecha) as year, EXTRACT(DAY FROM fecha) as dia_mes FROM fechas_clase(:horario_id) WHERE fecha > CURRENT_DATE", [
-        'horario_id' => $_GET['horario_id']
-    ]);
-    echo json_encode([
-        'status' => 'success',
-        'data' => $reposiciones
-    ]);
-}
+<?php
+$ruta = "../";
+require_once "../class/c_login.php";
+
+if (!isset($_SESSION['user']))
+    die(json_encode(['error' => 'No se ha iniciado sesión']));
+
+$user = unserialize($_SESSION['user']);
+$ruta = "../";
+require_once "../include/bd_pdo.php";
+
+// if method is get
+header("Content-Type: application/json");
+if ($_SERVER['REQUEST_METHOD'] === 'GET') {
+    $user->print_to_log("Acceso a reposiciones");
+    if (empty($_GET['horario_id']))
+        die(json_encode(['error' => 'No se ha enviado el id del horario']));
+    // fecha greater than today
+    $reposiciones = $db->query("SELECT fecha, EXTRACT(DOW FROM fecha) as day, EXTRACT(MONTH FROM fecha) as month, EXTRACT(YEAR FROM fecha) as year, EXTRACT(DAY FROM fecha) as dia_mes FROM fechas_clase(:horario_id) WHERE fecha > CURRENT_DATE", [
+        'horario_id' => $_GET['horario_id']
+    ]);
+    echo json_encode([
+        'status' => 'success',
+        'data' => $reposiciones
+    ]);
+}

+ 23 - 23
action/action_grupo.php

@@ -1,23 +1,23 @@
-<?php
-$ruta = "../";
-require_once "../class/c_login.php";
-
-// check if the session is started
-if (!isset($_SESSION['user']))
-    die(json_encode(['error' => 'No se ha iniciado sesión']));
-
-$user = unserialize($_SESSION['user']);
-$ruta = "../";
-require_once("../include/bd_pdo.php");
-extract($_POST);
-$params = ['per' => $_POST['periodo'], 'fac' => $_POST['facultad'], 'car' => $_POST['carrera']];
-
-$user->print_to_log("Acceso a grupos", old: $params);
-$grupos = queryAll("SELECT DISTINCT LENGTH(GRUPO), GRUPO FROM fs_horario_basic WHERE PERIODO_ID = COALESCE(:per, PERIODO_ID) AND FACULTAD_ID = COALESCE(:fac, FACULTAD_ID) AND CARRERA_ID = COALESCE(:car, CARRERA_ID) ORDER BY LENGTH(GRUPO), GRUPO", $params);
-
-$grupos = array_map(fn ($grupo) => $grupo['grupo'], $grupos);
-
-echo json_encode([
-    'status' => 'success',
-    'grupos' => $grupos
-]);
+<?php
+$ruta = "../";
+require_once "../class/c_login.php";
+
+// check if the session is started
+if (!isset($_SESSION['user']))
+    die(json_encode(['error' => 'No se ha iniciado sesión']));
+
+$user = unserialize($_SESSION['user']);
+$ruta = "../";
+require_once("../include/bd_pdo.php");
+extract($_POST);
+$params = ['per' => $_POST['periodo'], 'fac' => $_POST['facultad'], 'car' => $_POST['carrera']];
+
+$user->print_to_log("Acceso a grupos", old: $params);
+$grupos = queryAll("SELECT DISTINCT LENGTH(GRUPO), GRUPO FROM fs_horario_basic WHERE PERIODO_ID = COALESCE(:per, PERIODO_ID) AND FACULTAD_ID = COALESCE(:fac, FACULTAD_ID) AND CARRERA_ID = COALESCE(:car, CARRERA_ID) ORDER BY LENGTH(GRUPO), GRUPO", $params);
+
+$grupos = array_map(fn ($grupo) => $grupo['grupo'], $grupos);
+
+echo json_encode([
+    'status' => 'success',
+    'grupos' => $grupos
+]);

+ 28 - 28
action/action_grupo_horario.php

@@ -1,28 +1,28 @@
-<?php
-header('Content-Type: application/json');
-
-$ruta = "../";
-require_once("../include/bd_pdo.php");
-
-$grupo = isset($_GET['grupo']) ? $_GET['grupo'] : 1;
-$grupo_horarios = $db->querySingle(
-    "WITH bloques AS (
-    SELECT id, hora_inicio, hora_fin
-    FROM public.bloque_horario
-    WHERE grupo = ?
-    ORDER BY hora_inicio ASC
-) 
-
-SELECT json_agg(json_build_object(
-    'id', id,
-    'hora_inicio', hora_inicio,
-    'hora_fin', hora_fin,
-	'selected', current_time between hora_inicio and hora_fin
-)) AS bloque_horario
-FROM bloques
-",
-    [$grupo]
-)['bloque_horario'];
-
-
-echo $grupo_horarios;
+<?php
+header('Content-Type: application/json');
+
+$ruta = "../";
+require_once("../include/bd_pdo.php");
+
+$grupo = isset($_GET['grupo']) ? $_GET['grupo'] : 1;
+$grupo_horarios = $db->querySingle(
+    "WITH bloques AS (
+    SELECT id, hora_inicio, hora_fin
+    FROM public.bloque_horario
+    WHERE grupo = ?
+    ORDER BY hora_inicio ASC
+) 
+
+SELECT json_agg(json_build_object(
+    'id', id,
+    'hora_inicio', hora_inicio,
+    'hora_fin', hora_fin,
+	'selected', current_time between hora_inicio and hora_fin
+)) AS bloque_horario
+FROM bloques
+",
+    [$grupo]
+)['bloque_horario'];
+
+
+echo $grupo_horarios;

+ 34 - 34
action/action_horario.php

@@ -1,35 +1,35 @@
-<?php
-header('Content-Type: application/json');
-
-$ruta = "../";
-require_once("../include/bd_pdo.php");
-
-extract($_POST);
-
-$dias = array("domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado");
-$horarios = $db
-    ->get("fs_horario($periodo, $carrera, '$grupo', true)");
-
-// get each id from $horarios (might be duplicate)
-
-try {
-    $horarios = array_map(function ($horario) use ($dias, $db) {
-        $horario['profesores'] = array_map(
-            fn ($profesor) =>
-            $db->where("id", $profesor)->getOne("fs_profesor"),
-            explode(",", substr($horario['profesores'], 1, -1))
-        );
-        $horario['dia'] = $dias[$horario['dia']];
-        return $horario;
-    }, $horarios);
-} catch (Exception $e) {
-    die(json_encode([
-        "status" => "error",
-        "message" => $e->getMessage(),
-    ]));
-}
-?>
-<?= json_encode([
-    "status" => "success",
-    "horario" => $horarios,
+<?php
+header('Content-Type: application/json');
+
+$ruta = "../";
+require_once("../include/bd_pdo.php");
+
+extract($_POST);
+
+$dias = array("domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado");
+$horarios = $db
+    ->get("fs_horario($periodo, $carrera, '$grupo', true)");
+
+// get each id from $horarios (might be duplicate)
+
+try {
+    $horarios = array_map(function ($horario) use ($dias, $db) {
+        $horario['profesores'] = array_map(
+            fn ($profesor) =>
+            $db->where("id", $profesor)->getOne("fs_profesor"),
+            explode(",", substr($horario['profesores'], 1, -1))
+        );
+        $horario['dia'] = $dias[$horario['dia']];
+        return $horario;
+    }, $horarios);
+} catch (Exception $e) {
+    die(json_encode([
+        "status" => "error",
+        "message" => $e->getMessage(),
+    ]));
+}
+?>
+<?= json_encode([
+    "status" => "success",
+    "horario" => $horarios,
 ]) ?>

+ 41 - 41
action/action_horario_create.php

@@ -1,41 +1,41 @@
-<?php
-$ruta = "../";
-require_once "../class/c_login.php";
-
-// check if the session is started
-if (!isset($_SESSION['user']))
-	die(json_encode(['error' => 'No se ha iniciado sesión']));
-
-$user = unserialize($_SESSION['user']);
-$ruta = "../";
-require_once "../include/bd_pdo.php";
-
-extract($_POST);
-
-$params = [
-	"hora" => $hora,
-	"salon" => $salón,
-	"facultad_id" => $facultad,
-	"periodo" => $periodo,
-	"grupo" => $grupo,
-	"materia_id" => $materia,
-	"dia" => $día,
-	"duracion" => $duración,
-	"profesores" => "{{$profesores}}",
-];
-
-header("Content-Type: application/json");
-$user->print_to_log("Creación de horario", new: $params);
-
-try {
-	$db->insert("fs_horario", $params);
-} catch (Exception $e) {
-	die(json_encode([
-		"status" => "error",
-		"message" => "No se pudo crear el horario",
-	]));
-}
-die(json_encode([
-	"status" => "success",
-	"message" => "Horario creado correctamente",
-]));
+<?php
+$ruta = "../";
+require_once "../class/c_login.php";
+
+// check if the session is started
+if (!isset($_SESSION['user']))
+	die(json_encode(['error' => 'No se ha iniciado sesión']));
+
+$user = unserialize($_SESSION['user']);
+$ruta = "../";
+require_once "../include/bd_pdo.php";
+
+extract($_POST);
+
+$params = [
+	"hora" => $hora,
+	"salon" => $salón,
+	"facultad_id" => $facultad,
+	"periodo" => $periodo,
+	"grupo" => $grupo,
+	"materia_id" => $materia,
+	"dia" => $día,
+	"duracion" => $duración,
+	"profesores" => "{{$profesores}}",
+];
+
+header("Content-Type: application/json");
+$user->print_to_log("Creación de horario", new: $params);
+
+try {
+	$db->insert("fs_horario", $params);
+} catch (Exception $e) {
+	die(json_encode([
+		"status" => "error",
+		"message" => "No se pudo crear el horario",
+	]));
+}
+die(json_encode([
+	"status" => "success",
+	"message" => "Horario creado correctamente",
+]));

+ 37 - 37
action/action_horario_delete.php

@@ -1,38 +1,38 @@
-<?php
-$ruta = "../";
-require_once "../class/c_login.php";
-
-// check if the session is started
-if (!isset($_SESSION['user']))
-	die(json_encode(['error' => 'No se ha iniciado sesión']));
-
-$user = unserialize($_SESSION['user']);
-
-extract($_POST);
-try {
-    $old = $db
-        ->where('horario_id', $id)
-        ->getOne('horario');
-
-    $user->print_to_log("Eliminación de horario", old: $old);
-    
-    $horario = $db
-        ->where('id', $id)
-        ->delete('fs_horario');
-} catch (Exception $e) {
-    // if message contains "Integrity constraint violation"
-    $message = (strpos($e->getMessage(), 'Foreign') !== false)
-                ? "No se puede eliminar el registro, tiene datos asociados"
-                : "Error al eliminar el registro";
-
-    die(json_encode([
-        "status" => "error",
-        "message" => $message,
-        "response" => $e->getMessage(),
-    ]));
-}
-
-die(json_encode([ 
-    "status" => "success",
-    "message" => "Horario eliminado correctamente",
+<?php
+$ruta = "../";
+require_once "../class/c_login.php";
+
+// check if the session is started
+if (!isset($_SESSION['user']))
+	die(json_encode(['error' => 'No se ha iniciado sesión']));
+
+$user = unserialize($_SESSION['user']);
+
+extract($_POST);
+try {
+    $old = $db
+        ->where('horario_id', $id)
+        ->getOne('horario');
+
+    $user->print_to_log("Eliminación de horario", old: $old);
+    
+    $horario = $db
+        ->where('id', $id)
+        ->delete('fs_horario');
+} catch (Exception $e) {
+    // if message contains "Integrity constraint violation"
+    $message = (strpos($e->getMessage(), 'Foreign') !== false)
+                ? "No se puede eliminar el registro, tiene datos asociados"
+                : "Error al eliminar el registro";
+
+    die(json_encode([
+        "status" => "error",
+        "message" => $message,
+        "response" => $e->getMessage(),
+    ]));
+}
+
+die(json_encode([ 
+    "status" => "success",
+    "message" => "Horario eliminado correctamente",
 ]));

+ 51 - 51
action/action_horario_excel.php

@@ -1,51 +1,51 @@
-<?php
-$ruta = "../";
-require_once "../include/bd_pdo.php";
-require_once "../include/func_excel.php";
-
-extract($_POST);
-
-# $carrera;
-# $facultad;
-
-$horarios = json_decode($data, true);
-
-// make sure profesores are in the database
-foreach ($horarios as $horario) {
-    $params = [
-        'materia' => $horario['materia'],
-        'carrera' => $carrera,
-    ];
-    $horario['materia'] = query("SELECT FI_MATERIA(:materia, :carrera) id", $params)['id'];
-
-    $params = [
-        'clave' => $horario['clave'],
-        'nombre' => $horario['nombre'],
-        'correo' => $horario['correo'],
-        'grado' => $horario['grado'],
-        'facultad' => $facultad,
-    ];
-
-    $horario['profesor'] = query("SELECT FI_PROFESOR(:nombre, :clave, :facultad, :correo, :grado) id", $params)['id'];
-    $horario = array_diff_key($horario, array_flip(['clave', 'nombre', 'correo', 'grado', '']));
-    $horario['periodo'] = $periodo;
-    $horario['facultad'] = $facultad;
-    
-    try {
-        query(
-            "SELECT FI_HORARIO(:horario::VARCHAR, :profesor::INT, :materia::INT, :facultad::INT, :periodo::INT, :grupo::VARCHAR, :salon::VARCHAR)",
-            $horario
-        );
-    } catch (Exception $e) {
-        die(json_encode([
-            "status" => "error",
-            "sql" => $e->getMessage(),
-            "message" => "Error al cargar el archivo",
-        ]));
-    }
-}
-?>
-<?= json_encode([
-    "status" => "success",
-    "message" => "Horarios guardado con éxito",
-]) ?>
+<?php
+$ruta = "../";
+require_once "../include/bd_pdo.php";
+require_once "../include/func_excel.php";
+
+extract($_POST);
+
+# $carrera;
+# $facultad;
+
+$horarios = json_decode($data, true);
+
+// make sure profesores are in the database
+foreach ($horarios as $horario) {
+    $params = [
+        'materia' => $horario['materia'],
+        'carrera' => $carrera,
+    ];
+    $horario['materia'] = query("SELECT FI_MATERIA(:materia, :carrera) id", $params)['id'];
+
+    $params = [
+        'clave' => $horario['clave'],
+        'nombre' => $horario['nombre'],
+        'correo' => $horario['correo'],
+        'grado' => $horario['grado'],
+        'facultad' => $facultad,
+    ];
+
+    $horario['profesor'] = query("SELECT FI_PROFESOR(:nombre, :clave, :facultad, :correo, :grado) id", $params)['id'];
+    $horario = array_diff_key($horario, array_flip(['clave', 'nombre', 'correo', 'grado', '']));
+    $horario['periodo'] = $periodo;
+    $horario['facultad'] = $facultad;
+    
+    try {
+        query(
+            "SELECT FI_HORARIO(:horario::VARCHAR, :profesor::INT, :materia::INT, :facultad::INT, :periodo::INT, :grupo::VARCHAR, :salon::VARCHAR)",
+            $horario
+        );
+    } catch (Exception $e) {
+        die(json_encode([
+            "status" => "error",
+            "sql" => $e->getMessage(),
+            "message" => "Error al cargar el archivo",
+        ]));
+    }
+}
+?>
+<?= json_encode([
+    "status" => "success",
+    "message" => "Horarios guardado con éxito",
+]) ?>

+ 38 - 38
action/action_horario_profesor.php

@@ -1,38 +1,38 @@
-<?php
-header('Content-Type: application/json');
-$ruta = "../";
-require_once("../include/bd_pdo.php");
-
-$dias = array("domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado");
-
-try {
-    if(empty($_POST['profesor_id']))
-        throw new Exception("No se ha especificado un profesor");
-        
-    // RECORD LAST QUERY
-    $horarios = $db->query("SELECT * FROM fs_horario(_periodo_id => ?, _last => true, _profesor_id => ?) ORDER BY MATERIA", [
-        $_POST['periodo_id'],
-        $_POST['profesor_id'],
-    ]);
-    
-    $horarios = array_map(function ($horario) use ($dias, $db) {
-        $horario['profesores'] = array_map(
-            fn ($profesor) =>
-            $db->where("id", $profesor)->getOne("fs_profesor"),
-            explode(",", substr($horario['profesores'], 1, -1))
-        );
-        $horario['dia'] = $dias[$horario['dia']];
-        return $horario;
-    }, $horarios);
-    die(json_encode([
-        "status" => "success",
-        "data" => $horarios,
-        // "data" => [],
-    ]));
-} catch (Exception $e) {
-    die(json_encode([
-        "status" => "error",
-        "message" => $e->getMessage(),
-        "query" => $db->getLastQuery(),
-    ]));
-}
+<?php
+header('Content-Type: application/json');
+$ruta = "../";
+require_once("../include/bd_pdo.php");
+
+$dias = array("domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado");
+
+try {
+    if(empty($_POST['profesor_id']))
+        throw new Exception("No se ha especificado un profesor");
+        
+    // RECORD LAST QUERY
+    $horarios = $db->query("SELECT * FROM fs_horario(_periodo_id => ?, _last => true, _profesor_id => ?) ORDER BY MATERIA", [
+        $_POST['periodo_id'],
+        $_POST['profesor_id'],
+    ]);
+    
+    $horarios = array_map(function ($horario) use ($dias, $db) {
+        $horario['profesores'] = array_map(
+            fn ($profesor) =>
+            $db->where("id", $profesor)->getOne("fs_profesor"),
+            explode(",", substr($horario['profesores'], 1, -1))
+        );
+        $horario['dia'] = $dias[$horario['dia']];
+        return $horario;
+    }, $horarios);
+    die(json_encode([
+        "status" => "success",
+        "data" => $horarios,
+        // "data" => [],
+    ]));
+} catch (Exception $e) {
+    die(json_encode([
+        "status" => "error",
+        "message" => $e->getMessage(),
+        "query" => $db->getLastQuery(),
+    ]));
+}

+ 48 - 48
action/action_horario_update.php

@@ -1,48 +1,48 @@
-<?php
-header('Content-Type: application/json');
-$ruta = "../";
-require_once "../class/c_login.php";
-
-// check if the session is started
-if (!isset($_SESSION['user']))
-    die(json_encode(['error' => 'No se ha iniciado sesión']));
-
-$user = unserialize($_SESSION['user']);
-
-$horario = array_map(fn ($value) => $_POST[$value], array_filter([
-    "hora" => "hora",
-    "dia" => "día",
-    "salon" => "salón",
-    "duracion" => "duración",
-], fn ($value) => !empty($_POST[$value])));
-
-if (!empty($_POST['profesores']))
-    $horario["profesores"] = "{ {$_POST['profesores']} }";
-
-try {
-    $id = $_POST['id'] ?? 0;
-
-    $old = $db
-        ->where("horario_id", $id)
-        ->getOne("horario");
-    
-    $horario = $db
-        ->where("id", $id)
-        ->update("fs_horario", $horario);
-
-    $new = $db
-        ->orderBy("horario_id", "DESC")
-        ->getOne("horario");
-        
-    $user->print_to_log("Actualización de horario", old: $old, new: $new);
-} catch (Exception $e) {
-    die(json_encode([
-        "status" => "error",
-        "message" => $e->getMessage(),
-        'POST' => $_POST,
-    ]));
-}
-
-die(json_encode([
-    "status" => "success",
-]));
+<?php
+header('Content-Type: application/json');
+$ruta = "../";
+require_once "../class/c_login.php";
+
+// check if the session is started
+if (!isset($_SESSION['user']))
+    die(json_encode(['error' => 'No se ha iniciado sesión']));
+
+$user = unserialize($_SESSION['user']);
+
+$horario = array_map(fn ($value) => $_POST[$value], array_filter([
+    "hora" => "hora",
+    "dia" => "día",
+    "salon" => "salón",
+    "duracion" => "duración",
+], fn ($value) => !empty($_POST[$value])));
+
+if (!empty($_POST['profesores']))
+    $horario["profesores"] = "{ {$_POST['profesores']} }";
+
+try {
+    $id = $_POST['id'] ?? 0;
+
+    $old = $db
+        ->where("horario_id", $id)
+        ->getOne("horario");
+    
+    $horario = $db
+        ->where("id", $id)
+        ->update("fs_horario", $horario);
+
+    $new = $db
+        ->orderBy("horario_id", "DESC")
+        ->getOne("horario");
+        
+    $user->print_to_log("Actualización de horario", old: $old, new: $new);
+} catch (Exception $e) {
+    die(json_encode([
+        "status" => "error",
+        "message" => $e->getMessage(),
+        'POST' => $_POST,
+    ]));
+}
+
+die(json_encode([
+    "status" => "success",
+]));

+ 33 - 33
action/action_justificar.php

@@ -1,33 +1,33 @@
-<?php
-$ruta = "../";
-require_once "../class/c_login.php";
-
-extract($_POST);
-
-/* print_r($claves);
-exit; */
-
-$fecha = DateTime::createFromFormat('d/m/Y', $fecha);
-
-if (isset($hora)) {
-    $claves = [[
-        'clave' => $clave,
-        'hora' => $hora,
-        'id' => $id
-    ]];
-}
-foreach ($claves as $horario)
-    try {
-        $profesor_id = $horario["clave"];
-        query("SELECT fi_registrar_asistencia(:id::INT, FALSE, ARRAY[ NOW(), :fecha::DATE + :hora::TIME ]::TIMESTAMP[], :profesor_id::INT, TRUE)", [
-            ":fecha" => $fecha->format('Y-m-d'),
-            ":hora" => $horario["hora"],
-            ":id" => $horario["id"],
-            ":profesor_id" => $profesor_id
-        ]);
-    }
-    catch (Exception $e) {
-        die( json_encode(["error" => $e->getMessage()]) );
-    }
-
-die(json_encode(["success" => true]));
+<?php
+$ruta = "../";
+require_once "../class/c_login.php";
+
+extract($_POST);
+
+/* print_r($claves);
+exit; */
+
+$fecha = DateTime::createFromFormat('d/m/Y', $fecha);
+
+if (isset($hora)) {
+    $claves = [[
+        'clave' => $clave,
+        'hora' => $hora,
+        'id' => $id
+    ]];
+}
+foreach ($claves as $horario)
+    try {
+        $profesor_id = $horario["clave"];
+        query("SELECT fi_registrar_asistencia(:id::INT, FALSE, ARRAY[ NOW(), :fecha::DATE + :hora::TIME ]::TIMESTAMP[], :profesor_id::INT, TRUE)", [
+            ":fecha" => $fecha->format('Y-m-d'),
+            ":hora" => $horario["hora"],
+            ":id" => $horario["id"],
+            ":profesor_id" => $profesor_id
+        ]);
+    }
+    catch (Exception $e) {
+        die( json_encode(["error" => $e->getMessage()]) );
+    }
+
+die(json_encode(["success" => true]));

+ 41 - 42
action/action_login.php

@@ -1,43 +1,42 @@
-<?php
-/* 
- * Valida usuario con la BD y devuelve contraseña para validar con PHP
- * 
- * Recibe:
- *  POST: usuario, password
- * 
- * Error:
- *  0 - No se recibieron datos
- *  1 - Usuario/Contraseña incorrectos
- *  2 - Usuario no esta en BD
- *  3 - No existe usuario
- * 
- * Success:
- *  Redirecciona a inicio.php
- */
-include_once("../include/nocache.php"); //continue on error
-$ruta = "../";
-require_once("../include/bd_pdo.php"); //die on error
-require_once("../class/c_login.php");
-require_once("../include/util.php");
-require_once("../include/nusoap/nusoap.php");
-
-if (!isset($_POST["username"]) || !isset($_POST["passwd"]))
-    die(header("Location: ../index.php?error=0"));
-
-$usr = trim(filter_input(INPUT_POST, "username")); //limpia texto
-$pass = $_POST["passwd"];
-
-$user = Login::validUser($usr, $pass);
-
-if (is_array($user)) {
-    $_SESSION['error'] = true;
-    // build query params
-    $params = http_build_query($user);
-    header("Location: ../index.php?$params");
-} else {
-    $_SESSION['user'] = serialize($user);
-
-    header("Location: " . (isset($_SESSION['ruta']) ? $_SESSION['ruta'] : "../main.php"));
-}
-
+<?php
+/* 
+ * Valida usuario con la BD y devuelve contraseña para validar con PHP
+ * 
+ * Recibe:
+ *  POST: usuario, password
+ * 
+ * Error:
+ *  0 - No se recibieron datos
+ *  1 - Usuario/Contraseña incorrectos
+ *  2 - Usuario no esta en BD
+ *  3 - No existe usuario
+ * 
+ * Success:
+ *  Redirecciona a inicio.php
+ */
+include_once "../include/nocache.php"; //continue on error
+$ruta = "../";
+require_once "../include/bd_pdo.php"; //die on error
+require_once "../class/c_login.php";
+require_once "../include/util.php";
+
+if (!isset($_POST["username"]) || !isset($_POST["passwd"]))
+    die(header("Location: ../index.php?error=0"));
+
+$usr = trim(filter_input(INPUT_POST, "username")); //limpia texto
+$pass = $_POST["passwd"];
+
+$user = Login::validUser($usr, $pass);
+
+if (is_array($user)) {
+    $_SESSION['error'] = true;
+    // build query params
+    $params = http_build_query($user);
+    header("Location: ../index.php?$params");
+} else {
+    $_SESSION['user'] = serialize($user);
+
+    header("Location: " . (isset($_SESSION['ruta']) ? $_SESSION['ruta'] : "../main.php"));
+}
+
 exit;

+ 25 - 25
action/action_materias.php

@@ -1,26 +1,26 @@
-<?php
-$ruta = "../";
-require_once "../class/c_login.php";
-
-extract($_POST);
-# print_r($_POST); exit;
-
-if (!isset($_SESSION['user']))
-    die(header('Location: index.php'));
-
-$user = unserialize($_SESSION['user']);
-
-if (!$user->admin && ($access = $user->access('asistencia')) == 'n')
-    die(json_encode(['error' => true]));
-
-$user->print_to_log('Consultar materias');
-$materias = queryAll(
-    "SELECT id, nombre FROM FS_MATERIA WHERE carrera = COALESCE(:carrera, carrera) ORDER BY nombre",
-    [':carrera' => empty($carrera) ? null : $carrera]
-);
-?>
-
-<?= json_encode([
-    'status' => 'success',
-    'materias' => $materias,
+<?php
+$ruta = "../";
+require_once "../class/c_login.php";
+
+extract($_POST);
+# print_r($_POST); exit;
+
+if (!isset($_SESSION['user']))
+    die(header('Location: index.php'));
+
+$user = unserialize($_SESSION['user']);
+
+if (!$user->admin && ($access = $user->access('asistencia')) == 'n')
+    die(json_encode(['error' => true]));
+
+$user->print_to_log('Consultar materias');
+$materias = queryAll(
+    "SELECT id, nombre FROM FS_MATERIA WHERE carrera = COALESCE(:carrera, carrera) ORDER BY nombre",
+    [':carrera' => empty($carrera) ? null : $carrera]
+);
+?>
+
+<?= json_encode([
+    'status' => 'success',
+    'materias' => $materias,
 ]); ?>

+ 7 - 7
action/action_materias_select.php

@@ -1,8 +1,8 @@
-<?php
-    $ruta = "../";
-    require_once "../include/bd_pdo.php";
-    global $pdo;
-    $sql="SELECT * FROM materia WHERE materia_id = :idMateria";
-    $params = ['idMateria' => $_POST['idmateria']];
-    echo json_encode(query($sql, $params, false));
+<?php
+    $ruta = "../";
+    require_once "../include/bd_pdo.php";
+    global $pdo;
+    $sql="SELECT * FROM materia WHERE materia_id = :idMateria";
+    $params = ['idMateria' => $_POST['idmateria']];
+    echo json_encode(query($sql, $params, false));
 ?>

+ 10 - 10
action/action_materias_update.php

@@ -1,11 +1,11 @@
-<?php
-    $ruta = "../";
-    require_once "../include/bd_pdo.php";
-    global $pdo;
-
-    $sql = "UPDATE materia SET materia_nombre = :nombre WHERE materia_id = :id";
-    $params = array(':nombre' => mb_strtoupper($_POST["nombre"]), ':id' => $_POST["id"]);
-    $hecho = query($sql, $params, false);
-    header("Location: ../materias.php");
-    exit();
+<?php
+    $ruta = "../";
+    require_once "../include/bd_pdo.php";
+    global $pdo;
+
+    $sql = "UPDATE materia SET materia_nombre = :nombre WHERE materia_id = :id";
+    $params = array(':nombre' => mb_strtoupper($_POST["nombre"]), ':id' => $_POST["id"]);
+    $hecho = query($sql, $params, false);
+    header("Location: ../materias.php");
+    exit();
 ?>

+ 16 - 16
action/action_new_horario.php

@@ -1,17 +1,17 @@
-<!-- fi_horario(
-	p_hora character varying,
-	p_materia character varying,
-	p_clave character varying,
-	p_nombre character varying,
-	p_grado character varying,
-	p_correo character varying,
-	p_facultad integer,
-	p_carrera integer,
-	p_grupo character varying DEFAULT NULL::character varying,
-	p_salon character varying DEFAULT NULL::character varying) -->
-
-<?php
-$ruta = "../";
-require_once "../include/bd_pdo.php";
-
+<!-- fi_horario(
+	p_hora character varying,
+	p_materia character varying,
+	p_clave character varying,
+	p_nombre character varying,
+	p_grado character varying,
+	p_correo character varying,
+	p_facultad integer,
+	p_carrera integer,
+	p_grupo character varying DEFAULT NULL::character varying,
+	p_salon character varying DEFAULT NULL::character varying) -->
+
+<?php
+$ruta = "../";
+require_once "../include/bd_pdo.php";
+
 $sql = "SELECT fi_horario(:hora, :materia, :clave, :nombre, :grado, :correo, :facultad, :carrera, :grupo, :salon)";

+ 16 - 16
action/action_periodos_insert.php

@@ -1,17 +1,17 @@
-<?php
-    $ruta = "../";
-    require_once "../include/bd_pdo.php";
-    global $pdo;
-    $sql = "SELECT fi_periodo(:fecha_inicio, :fecha_fin, :estado, :nombre, :nivel, :facultad)";
-    $params = [
-        ':fecha_inicio' => $_POST['fecha_inicial'],
-        ':fecha_fin' => $_POST['fecha_final'],
-        ':estado' => $_POST['estadoP'],
-        ':nombre' => mb_strtoupper($_POST['nombreP']),
-        ':nivel' => $_POST['nivelP'],
-        ':facultad' => $_POST['facultadP']
-    ];
-    echo json_encode(query($sql, $params, true));
-    header("Location: ../carreras.php?facultad=".$_POST['facultadP']);
-    exit();
+<?php
+    $ruta = "../";
+    require_once "../include/bd_pdo.php";
+    global $pdo;
+    $sql = "SELECT fi_periodo(:fecha_inicio, :fecha_fin, :estado, :nombre, :nivel, :facultad)";
+    $params = [
+        ':fecha_inicio' => $_POST['fecha_inicial'],
+        ':fecha_fin' => $_POST['fecha_final'],
+        ':estado' => $_POST['estadoP'],
+        ':nombre' => mb_strtoupper($_POST['nombreP']),
+        ':nivel' => $_POST['nivelP'],
+        ':facultad' => $_POST['facultadP']
+    ];
+    echo json_encode(query($sql, $params, true));
+    header("Location: ../carreras.php?facultad=".$_POST['facultadP']);
+    exit();
 ?>

+ 7 - 7
action/action_periodos_select.php

@@ -1,8 +1,8 @@
-<?php
-    $ruta = "../";
-    require_once "../include/bd_pdo.php";
-    global $pdo;
-    $sql = "SELECT * FROM fs_periodo WHERE facultad_id = :idfacultad AND id = :idperiodo";
-    $params = [':idfacultad' => $_POST['idfacultad'], ':idperiodo' => $_POST['idperiodo']];
-    echo json_encode(query($sql, $params, true));
+<?php
+    $ruta = "../";
+    require_once "../include/bd_pdo.php";
+    global $pdo;
+    $sql = "SELECT * FROM fs_periodo WHERE facultad_id = :idfacultad AND id = :idperiodo";
+    $params = [':idfacultad' => $_POST['idfacultad'], ':idperiodo' => $_POST['idperiodo']];
+    echo json_encode(query($sql, $params, true));
 ?>

+ 17 - 17
action/action_periodos_update.php

@@ -1,18 +1,18 @@
-<?php
-    $ruta = "../";
-    require_once "../include/bd_pdo.php";
-    global $pdo;
-    print_r($_POST);
-    $sql = "SELECT fu_update_periodo(:periodo_id, :fecha_inicio, :fecha_final, :estado, :nombre, :nivel)";
-    $params = [
-        ':periodo_id' => $_POST['idP'],
-        ':fecha_inicio' => $_POST['fecha_inicial'],
-        ':fecha_final' => $_POST['fecha_final'],
-        ':estado' => $_POST['estadoP'],
-        ':nombre' => mb_strtoupper($_POST['nombreP']),
-        ':nivel' => $_POST['nivelP']
-    ];
-    echo json_encode(query($sql, $params, true));
-    header("Location: ../carreras.php?facultad=".$_POST['facultadP']);
-    exit();
+<?php
+    $ruta = "../";
+    require_once "../include/bd_pdo.php";
+    global $pdo;
+    print_r($_POST);
+    $sql = "SELECT fu_update_periodo(:periodo_id, :fecha_inicio, :fecha_final, :estado, :nombre, :nivel)";
+    $params = [
+        ':periodo_id' => $_POST['idP'],
+        ':fecha_inicio' => $_POST['fecha_inicial'],
+        ':fecha_final' => $_POST['fecha_final'],
+        ':estado' => $_POST['estadoP'],
+        ':nombre' => mb_strtoupper($_POST['nombreP']),
+        ':nivel' => $_POST['nivelP']
+    ];
+    echo json_encode(query($sql, $params, true));
+    header("Location: ../carreras.php?facultad=".$_POST['facultadP']);
+    exit();
 ?>

+ 27 - 27
action/action_periodousuario_update.php

@@ -1,27 +1,27 @@
-<?php
-$ruta = "../";
-require_once "../class/c_login.php";
-
-if (!isset($_SESSION['user'])) {
-    header('Location: index.php');
-    exit;
-} else
-    $user = unserialize($_SESSION['user']);
-
-$params = array(':id' => $user->user['id'], ':per' => $_POST['id']);
-$user->print_to_log('Actualizando periodo from ' . $user->periodo . ' to ' . $_POST['id']);
-
-query("SELECT FU_UPDATEPERIODO(:id, :per)", $params);
-$user->periodo = $params[':per'];
-
-# if the user is admin, also update the facultad in user object
-if ($user->admin) {
-    $facultad = query("SELECT FACULTAD_ID id, FACULTAD f FROM FS_PERIODO WHERE ID = :id", [':id' => $user->periodo]);
-    $user->facultad = array(
-        'facultad_id' => $facultad["id"],
-        'facultad' => $facultad["f"],
-    );
-}
-
-$_SESSION['user'] = serialize($user);
-header("Location: {$_POST["target"]}");
+<?php
+$ruta = "../";
+require_once "../class/c_login.php";
+
+if (!isset($_SESSION['user'])) {
+    header('Location: index.php');
+    exit;
+} else
+    $user = unserialize($_SESSION['user']);
+
+$params = array(':id' => $user->user['id'], ':per' => $_POST['id']);
+$user->print_to_log('Actualizando periodo from ' . $user->periodo . ' to ' . $_POST['id']);
+
+query("SELECT FU_UPDATEPERIODO(:id, :per)", $params);
+$user->periodo = $params[':per'];
+
+# if the user is admin, also update the facultad in user object
+if ($user->admin) {
+    $facultad = query("SELECT FACULTAD_ID id, FACULTAD f FROM FS_PERIODO WHERE ID = :id", [':id' => $user->periodo]);
+    $user->facultad = array(
+        'facultad_id' => $facultad["id"],
+        'facultad' => $facultad["f"],
+    );
+}
+
+$_SESSION['user'] = serialize($user);
+header("Location: {$_POST["target"]}");

+ 39 - 39
action/action_permisos_update.php

@@ -1,40 +1,40 @@
-<?php
-    $ruta = "../";
-    require_once "../include/bd_pdo.php";
-    global $pdo;
-    if(isset($_POST['lectura']))
-        $ver = $_POST['lectura'];
-    if(isset($_POST['editar']))
-        $editar = $_POST['editar'];
-    foreach($editar as $edit){
-        $edit_separado = explode("_", $edit);
-        $completo[]=$edit_separado;
-    }
-    #echo "<br><br><br><br>";
-    #print_r($ver);
-    #print_r($editar);
-    query("SELECT fd_permiso()", null, false);
-    foreach($ver as $lectura){
-        $igual=false;
-        $ver_separado = explode("_", $lectura);
-        #print_r($ver_separado);
-        foreach($completo as $comp){
-            if($ver_separado[0] == $comp[0] && $ver_separado[1] == $comp[1]){
-                #echo " igual";
-                $igual=true;
-                break;
-            }
-        }
-        #echo "<br>";
-        if(!$igual)
-            $completo[]=$ver_separado;
-    }
-    #print_r($completo);
-    foreach($completo as $actual){
-        $sql = "SELECT fi_permiso(:pagina, :rol, :tipo)";
-        $params = [':pagina' => $actual['0'], ':rol' => $actual['1'], ':tipo' => $actual['2']];
-        query($sql, $params, false);
-    }
-    header("Location: ../permisos.php");
-    exit();
+<?php
+    $ruta = "../";
+    require_once "../include/bd_pdo.php";
+    global $pdo;
+    if(isset($_POST['lectura']))
+        $ver = $_POST['lectura'];
+    if(isset($_POST['editar']))
+        $editar = $_POST['editar'];
+    foreach($editar as $edit){
+        $edit_separado = explode("_", $edit);
+        $completo[]=$edit_separado;
+    }
+    #echo "<br><br><br><br>";
+    #print_r($ver);
+    #print_r($editar);
+    query("SELECT fd_permiso()", null, false);
+    foreach($ver as $lectura){
+        $igual=false;
+        $ver_separado = explode("_", $lectura);
+        #print_r($ver_separado);
+        foreach($completo as $comp){
+            if($ver_separado[0] == $comp[0] && $ver_separado[1] == $comp[1]){
+                #echo " igual";
+                $igual=true;
+                break;
+            }
+        }
+        #echo "<br>";
+        if(!$igual)
+            $completo[]=$ver_separado;
+    }
+    #print_r($completo);
+    foreach($completo as $actual){
+        $sql = "SELECT fi_permiso(:pagina, :rol, :tipo)";
+        $params = [':pagina' => $actual['0'], ':rol' => $actual['1'], ':tipo' => $actual['2']];
+        query($sql, $params, false);
+    }
+    header("Location: ../permisos.php");
+    exit();
 ?>

+ 13 - 13
action/action_profesor.php

@@ -1,14 +1,14 @@
-<?php
-$ruta = "../";
-require_once("../include/bd_pdo.php");
-
-extract($_GET);
-
-$profesores = $db
-    ->where("facultad_id", $facultad ?? 0)
-    ->get("fs_profesor");
-
-echo json_encode([
-    "status" => "success",
-    "profesores" => $profesores
+<?php
+$ruta = "../";
+require_once("../include/bd_pdo.php");
+
+extract($_GET);
+
+$profesores = $db
+    ->where("facultad_id", $facultad ?? 0)
+    ->get("fs_profesor");
+
+echo json_encode([
+    "status" => "success",
+    "profesores" => $profesores
 ]);

+ 39 - 39
action/action_profesor_faltas.php

@@ -1,40 +1,40 @@
-<?php
-$ruta = "../";
-require_once "../include/bd_pdo.php";
-
-// die(print_r($_POST, true));
-
-extract($_POST);
-// if hora fin is null, then subtract half an hour from hora inicio and set hora fin to hora inicio + half an hour
-$hora_fin = empty($hora_fin) ? $hora_inicio : $hora_fin;
-
-$hora_inicio = date('H:i:s', strtotime($hora_inicio < '07:00' ? '07:00' : $hora_inicio) - 1800);
-$hora_fin = date('H:i:s', strtotime($hora_fin > '22:00' ? '22:00' : $hora_fin) + 1800);
-
-die(json_encode(
-    array_map(fn ($row) => array_merge(
-        $db->where('id', $row['profesor_id'])->getOne('fs_profesor'),
-        $db->where('id', $row['materia_id'])->getOne('fs_materia'),
-        $row
-    ),
-    queryAll(   
-    "SELECT REPORTE.*
-        FROM fs_asistencia_profesorreporte(null, :periodo, null, :fecha, :fecha) AS REPORTE
-        JOIN PROFESOR P ON P.PROFESOR_ID = REPORTE.PROFESOR_ID
-        WHERE HORA_CHECADO IS NULL
-        AND HORA BETWEEN :inicio AND :fin
-        AND P.PROFESOR_CLAVE ILIKE COALESCE(:clave, P.PROFESOR_CLAVE) and UNACCENT(P.PROFESOR_NOMBRE) ILIKE UNACCENT(COALESCE(:nombre, P.PROFESOR_NOMBRE))
-        AND FECHA = :fecha
-    ORDER BY HORA, MATERIA",
-    [
-        'periodo' => $periodo,
-        'fecha' => $fecha,
-        'inicio' => $hora_inicio,
-        'fin' => $hora_fin,
-        'clave' => empty($clave) ? null : "%$clave%",
-        'nombre' => empty($nombre) ? null : "%$nombre%"
-    ]
-))));
-
-
+<?php
+$ruta = "../";
+require_once "../include/bd_pdo.php";
+
+// die(print_r($_POST, true));
+
+extract($_POST);
+// if hora fin is null, then subtract half an hour from hora inicio and set hora fin to hora inicio + half an hour
+$hora_fin = empty($hora_fin) ? $hora_inicio : $hora_fin;
+
+$hora_inicio = date('H:i:s', strtotime($hora_inicio < '07:00' ? '07:00' : $hora_inicio) - 1800);
+$hora_fin = date('H:i:s', strtotime($hora_fin > '22:00' ? '22:00' : $hora_fin) + 1800);
+
+die(json_encode(
+    array_map(fn ($row) => array_merge(
+        $db->where('id', $row['profesor_id'])->getOne('fs_profesor'),
+        $db->where('id', $row['materia_id'])->getOne('fs_materia'),
+        $row
+    ),
+    queryAll(   
+    "SELECT REPORTE.*
+        FROM fs_asistencia_profesorreporte(null, :periodo, null, :fecha, :fecha) AS REPORTE
+        JOIN PROFESOR P ON P.PROFESOR_ID = REPORTE.PROFESOR_ID
+        WHERE HORA_CHECADO IS NULL
+        AND HORA BETWEEN :inicio AND :fin
+        AND P.PROFESOR_CLAVE ILIKE COALESCE(:clave, P.PROFESOR_CLAVE) and UNACCENT(P.PROFESOR_NOMBRE) ILIKE UNACCENT(COALESCE(:nombre, P.PROFESOR_NOMBRE))
+        AND FECHA = :fecha
+    ORDER BY HORA, MATERIA",
+    [
+        'periodo' => $periodo,
+        'fecha' => $fecha,
+        'inicio' => $hora_inicio,
+        'fin' => $hora_fin,
+        'clave' => empty($clave) ? null : "%$clave%",
+        'nombre' => empty($nombre) ? null : "%$nombre%"
+    ]
+))));
+
+
 #ECHO "$hora_inicio - $hora_fin";

+ 6 - 6
action/action_profesores_borra.php

@@ -1,7 +1,7 @@
-<?php
-    $ruta = "../";
-    require_once "../include/bd_pdo.php";
-    $sql = "SELECT fu_estado_facultad_profesor(:idprofesor, :idfacultad, :estado)";
-    $params = [':idprofesor' => $_POST['id_profesor'], ':idfacultad' => $_POST['id_facultad'], ':estado' => $_POST['estado']];
-    echo json_encode(query($sql, $params, false));
+<?php
+    $ruta = "../";
+    require_once "../include/bd_pdo.php";
+    $sql = "SELECT fu_estado_facultad_profesor(:idprofesor, :idfacultad, :estado)";
+    $params = [':idprofesor' => $_POST['id_profesor'], ':idfacultad' => $_POST['id_facultad'], ':estado' => $_POST['estado']];
+    echo json_encode(query($sql, $params, false));
 ?>

+ 74 - 74
action/action_profesores_insert.php

@@ -1,75 +1,75 @@
-<?php
-    $ruta = "../";
-    require_once "../include/bd_pdo.php";
-    $id = trim(filter_input(INPUT_POST, "id", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));
-    if(isset($_POST["dlfacultad"]))
-        $facultad = trim(filter_input(INPUT_POST, "dlfacultad", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));
-    else
-        $facultad = trim(filter_input(INPUT_POST, "mfacultad", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));
-    $clave = trim(filter_input(INPUT_POST, "mclave", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));
-    $grado = trim(filter_input(INPUT_POST, "grado", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));
-    $nombre = trim(filter_input(INPUT_POST, "nombre", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));
-    $grado = mb_strtoupper($grado);
-    if(!empty($grado)){
-        if(!ctype_space($grado)){
-            if($grado[strlen($grado)-1] != '.')
-                $grado.='.';
-        }
-        else{
-            $grado="";
-        }
-    }
-    $fs_profesores = query(//revisar si existe la clave del profesor
-        "SELECT * FROM fs_profesor WHERE clave = :clave",
-        array(":clave" => $_POST["mclave"]),
-        true
-    );
-    if(!$fs_profesores){//hay que crearlo desde 0 (profesor) y agregarlo a su facultad(facultad_profesor)
-        $profesor_id = query(
-            "SELECT public.fi_profesor(
-                :nombre, 
-                :clave, 
-                :facultad, 
-                null, 
-                :grado
-            )",
-            array(":nombre" => mb_strtoupper($nombre), ":clave" => $clave, ":facultad" => $facultad, ":grado" => $grado),
-            true
-        );
-        header("Location: ../profesores.php");
-        exit();
-    }
-    else{//el profesor ya existe
-        $profac = query(
-            "SELECT * FROM facultad_profesor WHERE facultad_id = :facultad AND profesor_id = :profesor",
-            array(":facultad" => $facultad, ":profesor" => $fs_profesores["id"]),
-            true
-        );
-        if(!$profac){//agregarlo a la facultad (facultad_profesor)
-            query(
-                "SELECT fi_facultad_profesor(
-                    :facultad, 
-                    :profesor
-                )",
-                array(":facultad" => $facultad, ":profesor" => $fs_profesores["id"]),
-                true
-            );
-            header("Location: ../profesores.php");
-            exit();
-        }
-        else{//regresar error (ya existe este profesor en esta facultad)
-            //print_r($profac);
-            if(!$profac['fp_activo']){
-                query(
-                    "SELECT fu_estado_facultad_profesor(:idprofesor, :idfacultad, :estado)",
-                    array(":idprofesor" => $fs_profesores["id"], ":idfacultad" => $facultad, ":estado" => true),
-                    true
-                );
-                header("Location: ../profesores.php");
-                exit();
-            }
-            header("Location: ../profesores.php?error=1");
-            #exit();
-        }
-    }
+<?php
+    $ruta = "../";
+    require_once "../include/bd_pdo.php";
+    $id = trim(filter_input(INPUT_POST, "id", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));
+    if(isset($_POST["dlfacultad"]))
+        $facultad = trim(filter_input(INPUT_POST, "dlfacultad", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));
+    else
+        $facultad = trim(filter_input(INPUT_POST, "mfacultad", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));
+    $clave = trim(filter_input(INPUT_POST, "mclave", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));
+    $grado = trim(filter_input(INPUT_POST, "grado", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));
+    $nombre = trim(filter_input(INPUT_POST, "nombre", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));
+    $grado = mb_strtoupper($grado);
+    if(!empty($grado)){
+        if(!ctype_space($grado)){
+            if($grado[strlen($grado)-1] != '.')
+                $grado.='.';
+        }
+        else{
+            $grado="";
+        }
+    }
+    $fs_profesores = query(//revisar si existe la clave del profesor
+        "SELECT * FROM fs_profesor WHERE clave = :clave",
+        array(":clave" => $_POST["mclave"]),
+        true
+    );
+    if(!$fs_profesores){//hay que crearlo desde 0 (profesor) y agregarlo a su facultad(facultad_profesor)
+        $profesor_id = query(
+            "SELECT public.fi_profesor(
+                :nombre, 
+                :clave, 
+                :facultad, 
+                null, 
+                :grado
+            )",
+            array(":nombre" => mb_strtoupper($nombre), ":clave" => $clave, ":facultad" => $facultad, ":grado" => $grado),
+            true
+        );
+        header("Location: ../profesores.php");
+        exit();
+    }
+    else{//el profesor ya existe
+        $profac = query(
+            "SELECT * FROM facultad_profesor WHERE facultad_id = :facultad AND profesor_id = :profesor",
+            array(":facultad" => $facultad, ":profesor" => $fs_profesores["id"]),
+            true
+        );
+        if(!$profac){//agregarlo a la facultad (facultad_profesor)
+            query(
+                "SELECT fi_facultad_profesor(
+                    :facultad, 
+                    :profesor
+                )",
+                array(":facultad" => $facultad, ":profesor" => $fs_profesores["id"]),
+                true
+            );
+            header("Location: ../profesores.php");
+            exit();
+        }
+        else{//regresar error (ya existe este profesor en esta facultad)
+            //print_r($profac);
+            if(!$profac['fp_activo']){
+                query(
+                    "SELECT fu_estado_facultad_profesor(:idprofesor, :idfacultad, :estado)",
+                    array(":idprofesor" => $fs_profesores["id"], ":idfacultad" => $facultad, ":estado" => true),
+                    true
+                );
+                header("Location: ../profesores.php");
+                exit();
+            }
+            header("Location: ../profesores.php?error=1");
+            #exit();
+        }
+    }
 ?>

+ 10 - 10
action/action_profesores_select.php

@@ -1,10 +1,10 @@
-<?php
-$ruta = "../";
-require_once "../include/bd_pdo.php";
-
-global $pdo;
-
-$sql = "SELECT * FROM profesor WHERE profesor_id = :idProfesor";
-$params = [':idProfesor' => $_POST['profesor']];
-
-echo json_encode(query($sql, $params, false));
+<?php
+$ruta = "../";
+require_once "../include/bd_pdo.php";
+
+global $pdo;
+
+$sql = "SELECT * FROM profesor WHERE profesor_id = :idProfesor";
+$params = [':idProfesor' => $_POST['profesor']];
+
+echo json_encode(query($sql, $params, false));

+ 35 - 35
action/action_profesores_update.php

@@ -1,36 +1,36 @@
-<?php
-    $ruta = "../";
-    require_once "../include/bd_pdo.php";
-    global $pdo;
-
-    $profesor = query(
-        "SELECT * FROM profesor WHERE :clave = profesor_clave",
-        array(":clave" => $_POST["mclave"]),
-        true
-    );
-    if($profesor){
-        if($profesor['profesor_id'] != $_POST['id']){
-            echo "clave en uso";
-            header("Location: ../profesores.php?error=2");
-            exit();
-        }
-    }
-    $grado = $_POST['grado'];
-    $grado = mb_strtoupper($grado);
-    if(!empty($grado)){
-        if(!ctype_space($grado)){
-            if($grado[strlen($grado)-1] != '.')
-                $grado.='.';
-        }
-        else{
-            $grado="";
-        }
-    }
-    print_r($_POST);
-    $sql = "SELECT public.fu_updateprofesor(:id, :clave, :nombre, :grado)";
-    $params = array(':id' => $_POST["id"], ':clave' => $_POST["mclave"], ':nombre' => mb_strtoupper($_POST["nombre"]), ':grado' => $grado);
-    $hecho = query($sql, $params, false);
-
-    header("Location: ../profesores.php", true, 307);
-    exit();
+<?php
+    $ruta = "../";
+    require_once "../include/bd_pdo.php";
+    global $pdo;
+
+    $profesor = query(
+        "SELECT * FROM profesor WHERE :clave = profesor_clave",
+        array(":clave" => $_POST["mclave"]),
+        true
+    );
+    if($profesor){
+        if($profesor['profesor_id'] != $_POST['id']){
+            echo "clave en uso";
+            header("Location: ../profesores.php?error=2");
+            exit();
+        }
+    }
+    $grado = $_POST['grado'];
+    $grado = mb_strtoupper($grado);
+    if(!empty($grado)){
+        if(!ctype_space($grado)){
+            if($grado[strlen($grado)-1] != '.')
+                $grado.='.';
+        }
+        else{
+            $grado="";
+        }
+    }
+    print_r($_POST);
+    $sql = "SELECT public.fu_updateprofesor(:id, :clave, :nombre, :grado)";
+    $params = array(':id' => $_POST["id"], ':clave' => $_POST["mclave"], ':nombre' => mb_strtoupper($_POST["nombre"]), ':grado' => $grado);
+    $hecho = query($sql, $params, false);
+
+    header("Location: ../profesores.php", true, 307);
+    exit();
 ?>

+ 54 - 54
action/action_reposiciones.php

@@ -1,54 +1,54 @@
-<?php
-$ruta = "../";
-require_once "../class/c_login.php";
-
-if (!isset($_SESSION['user']))
-    die(json_encode(['error' => 'No se ha iniciado sesión']));
-
-$user = unserialize($_SESSION['user']);
-$ruta = "../";
-require_once "../include/bd_pdo.php";
-
-// if method is get
-header("Content-Type: application/json");
-if ($_SERVER['REQUEST_METHOD'] === 'GET') {
-    $user->print_to_log("Acceso a reposiciones");
-    $reposiciones = $db
-        ->where('periodo_id', $_GET['periodo_id'] ?? null)
-        ->where('profesor_id', $_GET['profesor_id'] ?? [])
-        ->get("reposicion");
-    echo json_encode([
-        'status' => 'success',
-        'reposiciones' => $reposiciones
-    ]);
-} elseif ($_SERVER['REQUEST_METHOD'] === 'POST') {
-    $user->print_to_log("Creación de reposición", new: $params);
-    try {
-        $requiredParams = ['horario_id', 'fecha', 'hora', 'duracion_id', 'descripcion', 'profesor_id', 'salon', 'unidad', 'periodo_id', 'fecha_clase'];
-
-        // Filter params based on requiredParams
-        $params = array_filter($_POST, function ($key) use ($requiredParams) {
-            return in_array($key, $requiredParams);
-        }, ARRAY_FILTER_USE_KEY);
-
-        // Check if all required params are present
-        if (count($params) !== count($requiredParams)) {
-            throw new Exception('Falta uno o más parámetros requeridos');
-        }
-
-        $db->insert("reposicion", $params);
-
-        // Return success response
-        echo json_encode([
-            "status" => "success",
-            "message" => "Reposición creada correctamente",
-        ]);
-    } catch (Exception $e) {
-        // Return error response
-        echo json_encode([
-            "status" => "error",
-            "message" => "No se pudo crear la reposición",
-            "error" => $e->getMessage(),
-        ]);
-    }
-}
+<?php
+$ruta = "../";
+require_once "../class/c_login.php";
+
+if (!isset($_SESSION['user']))
+    die(json_encode(['error' => 'No se ha iniciado sesión']));
+
+$user = unserialize($_SESSION['user']);
+$ruta = "../";
+require_once "../include/bd_pdo.php";
+
+// if method is get
+header("Content-Type: application/json");
+if ($_SERVER['REQUEST_METHOD'] === 'GET') {
+    $user->print_to_log("Acceso a reposiciones");
+    $reposiciones = $db
+        ->where('periodo_id', $_GET['periodo_id'] ?? null)
+        ->where('profesor_id', $_GET['profesor_id'] ?? [])
+        ->get("reposicion");
+    echo json_encode([
+        'status' => 'success',
+        'reposiciones' => $reposiciones
+    ]);
+} elseif ($_SERVER['REQUEST_METHOD'] === 'POST') {
+    $user->print_to_log("Creación de reposición", new: $params);
+    try {
+        $requiredParams = ['horario_id', 'fecha', 'hora', 'duracion_id', 'descripcion', 'profesor_id', 'salon', 'unidad', 'periodo_id', 'fecha_clase'];
+
+        // Filter params based on requiredParams
+        $params = array_filter($_POST, function ($key) use ($requiredParams) {
+            return in_array($key, $requiredParams);
+        }, ARRAY_FILTER_USE_KEY);
+
+        // Check if all required params are present
+        if (count($params) !== count($requiredParams)) {
+            throw new Exception('Falta uno o más parámetros requeridos');
+        }
+
+        $db->insert("reposicion", $params);
+
+        // Return success response
+        echo json_encode([
+            "status" => "success",
+            "message" => "Reposición creada correctamente",
+        ]);
+    } catch (Exception $e) {
+        // Return error response
+        echo json_encode([
+            "status" => "error",
+            "message" => "No se pudo crear la reposición",
+            "error" => $e->getMessage(),
+        ]);
+    }
+}

+ 50 - 50
action/action_revisar_excel.php

@@ -1,50 +1,50 @@
-<?php
-#display PHP errors
-
-$ruta = "../";
-require_once "../include/bd_pdo.php";
-require_once "../include/func_excel.php";
-require_once "../include/func_string.php";
-
-use PhpOffice\PhpSpreadsheet\IOFactory;
-
-$reader = IOFactory::createReader("Xlsx");
-$reader->setReadDataOnly(true);
-
-$file = $_FILES['archivo'];
-
-
-$spreadsheet = $reader->load($file['tmp_name'][0]);
-
-$data = [];
-
-try {
-
-    foreach_sheet(
-        $spreadsheet, // object $spreadsheet
-        function (array $row_data, int $i, string $sheet) {
-            global $horario, $data;
-
-            if (renglón_vacío($row_data)) return;
-            validar_registro($row_data, $i);
-
-            $horario["horario"] = horario($row_data, $i, $sheet);
-
-            foreach (array_filter($row_data) as $key => $value)
-                $horario = array_merge($horario, ($key == 'maestro') ? columna_nombre($value) : [$key => $value]);
-
-            $data[] = $horario;
-        }
-    );
-
-    die(json_encode([
-        "status" => "success",
-        "message" => "Horario revisado con éxito, se leyeron: " . count($data) . " registros",
-        "data" => $data
-    ]));
-} catch (Exception $e) {
-    die(json_encode([
-        "status" => "error",
-        "message" => $e->getMessage(),
-    ]));
-}
+<?php
+#display PHP errors
+
+$ruta = "../";
+require_once "../include/bd_pdo.php";
+require_once "../include/func_excel.php";
+require_once "../include/func_string.php";
+
+use PhpOffice\PhpSpreadsheet\IOFactory;
+
+$reader = IOFactory::createReader("Xlsx");
+$reader->setReadDataOnly(true);
+
+$file = $_FILES['archivo'];
+
+
+$spreadsheet = $reader->load($file['tmp_name'][0]);
+
+$data = [];
+
+try {
+
+    foreach_sheet(
+        $spreadsheet, // object $spreadsheet
+        function (array $row_data, int $i, string $sheet) {
+            global $horario, $data;
+
+            if (renglón_vacío($row_data)) return;
+            validar_registro($row_data, $i);
+
+            $horario["horario"] = horario($row_data, $i, $sheet);
+
+            foreach (array_filter($row_data) as $key => $value)
+                $horario = array_merge($horario, ($key == 'maestro') ? columna_nombre($value) : [$key => $value]);
+
+            $data[] = $horario;
+        }
+    );
+
+    die(json_encode([
+        "status" => "success",
+        "message" => "Horario revisado con éxito, se leyeron: " . count($data) . " registros",
+        "data" => $data
+    ]));
+} catch (Exception $e) {
+    die(json_encode([
+        "status" => "error",
+        "message" => $e->getMessage(),
+    ]));
+}

+ 10 - 10
action/action_roles_insert.php

@@ -1,11 +1,11 @@
-<?php
-    $ruta = "../";
-    require_once "../include/bd_pdo.php";
-    global $pdo;
-    print_r($_POST);
-    $sql = "INSERT INTO rol (rol_titulo) VALUES (:nombre)";
-    $params = [':nombre' => mb_strtoupper($_POST['mtitulo'])];
-    $hecho = query($sql, $params, true);
-    header("Location: ../roles.php");
-    exit();
+<?php
+    $ruta = "../";
+    require_once "../include/bd_pdo.php";
+    global $pdo;
+    print_r($_POST);
+    $sql = "INSERT INTO rol (rol_titulo) VALUES (:nombre)";
+    $params = [':nombre' => mb_strtoupper($_POST['mtitulo'])];
+    $hecho = query($sql, $params, true);
+    header("Location: ../roles.php");
+    exit();
 ?>

+ 10 - 10
action/action_roles_select.php

@@ -1,11 +1,11 @@
-<?php
-    $ruta = "../";
-    require_once "../include/bd_pdo.php";
-
-    global $pdo;
-
-    $sql = "SELECT * FROM rol WHERE rol_id = :idRol";
-    $params = [':idRol' => $_POST['rol']];
-    
-    echo json_encode( query($sql, $params, true));
+<?php
+    $ruta = "../";
+    require_once "../include/bd_pdo.php";
+
+    global $pdo;
+
+    $sql = "SELECT * FROM rol WHERE rol_id = :idRol";
+    $params = [':idRol' => $_POST['rol']];
+    
+    echo json_encode( query($sql, $params, true));
 ?>

+ 10 - 10
action/action_roles_update.php

@@ -1,11 +1,11 @@
-<?php
-    $ruta = "../";
-    require_once "../include/bd_pdo.php";
-    global $pdo;
-    $sql = "UPDATE rol SET rol_titulo = :nombre WHERE rol_id = :id";
-    $params = array(':nombre' => mb_strtoupper($_POST['mtitulo']), ':id' => $_POST['id']);
-    print_r($_POST);
-    $hecho = query($sql, $params, false);
-    header("Location: ../roles.php", true, 307);
-    exit();
+<?php
+    $ruta = "../";
+    require_once "../include/bd_pdo.php";
+    global $pdo;
+    $sql = "UPDATE rol SET rol_titulo = :nombre WHERE rol_id = :id";
+    $params = array(':nombre' => mb_strtoupper($_POST['mtitulo']), ':id' => $_POST['id']);
+    print_r($_POST);
+    $hecho = query($sql, $params, false);
+    header("Location: ../roles.php", true, 307);
+    exit();
 ?>

+ 36 - 36
action/action_tiempos_update.php

@@ -1,37 +1,37 @@
-<?php
-$ruta = "../";
-require_once "../include/bd_pdo.php";
-print_r($_POST);
-
-$fs_tiempo = query(
-    "SELECT * FROM fs_tiempo_checado(:facultad, 1)", [':facultad' => $_POST['facultadT']], true
-);
-
-if($fs_tiempo){
-    $sql = "SELECT fu_update_tiempo_checado(:idfacultad, :idnivel, :antes, :despues, :retardo)";
-    $params = [':idfacultad' => $_POST['facultadT'], ':idnivel' => 1, ':antes' => -1*$_POST['antesL'], ':despues' => $_POST['despuesL']+1, ':retardo' => $_POST['retardoL']+$_POST['despuesL']+1];
-}
-else{
-    $sql = "SELECT fi_tiempo_checado(:idfacultad, :idnivel, :antes, :despues, :retardo)";
-    $params = [':idfacultad' => $_POST['facultadT'], ':idnivel' => 1, ':antes' => -1*$_POST['antesL'], ':despues' => $_POST['despuesL']+1, ':retardo' => $_POST['retardoL']+$_POST['despuesL']+1];
-}
-query($sql, $params, false);
-
-
-$fs_tiempo2 = query(
-    "SELECT * FROM fs_tiempo_checado(:facultad, 2)", [':facultad' => $_POST['facultadT']], true
-);
-
-if($fs_tiempo2){
-    $sql = "SELECT fu_update_tiempo_checado(:idfacultad, :idnivel, :antes, :despues, :retardo)";
-    $params = [':idfacultad' => $_POST['facultadT'], ':idnivel' => 2, ':antes' => -1*$_POST['antesP'], ':despues' => $_POST['despuesP']+1, ':retardo' => $_POST['retardoP']+$_POST['despuesP']+1];
-}
-else{
-    $sql = "SELECT fi_tiempo_checado(:idfacultad, :idnivel, :antes, :despues, :retardo)";
-    $params = [':idfacultad' => $_POST['facultadT'], ':idnivel' => 2, ':antes' => -1*$_POST['antesP'], ':despues' => $_POST['despuesP']+1, ':retardo' => $_POST['retardoP']+$_POST['despuesP']+1];
-}
-query($sql, $params, false);
-
-header("Location: ../carreras.php?facultad=".$_POST['facultadT']);
-exit();
+<?php
+$ruta = "../";
+require_once "../include/bd_pdo.php";
+print_r($_POST);
+
+$fs_tiempo = query(
+    "SELECT * FROM fs_tiempo_checado(:facultad, 1)", [':facultad' => $_POST['facultadT']], true
+);
+
+if($fs_tiempo){
+    $sql = "SELECT fu_update_tiempo_checado(:idfacultad, :idnivel, :antes, :despues, :retardo)";
+    $params = [':idfacultad' => $_POST['facultadT'], ':idnivel' => 1, ':antes' => -1*$_POST['antesL'], ':despues' => $_POST['despuesL']+1, ':retardo' => $_POST['retardoL']+$_POST['despuesL']+1];
+}
+else{
+    $sql = "SELECT fi_tiempo_checado(:idfacultad, :idnivel, :antes, :despues, :retardo)";
+    $params = [':idfacultad' => $_POST['facultadT'], ':idnivel' => 1, ':antes' => -1*$_POST['antesL'], ':despues' => $_POST['despuesL']+1, ':retardo' => $_POST['retardoL']+$_POST['despuesL']+1];
+}
+query($sql, $params, false);
+
+
+$fs_tiempo2 = query(
+    "SELECT * FROM fs_tiempo_checado(:facultad, 2)", [':facultad' => $_POST['facultadT']], true
+);
+
+if($fs_tiempo2){
+    $sql = "SELECT fu_update_tiempo_checado(:idfacultad, :idnivel, :antes, :despues, :retardo)";
+    $params = [':idfacultad' => $_POST['facultadT'], ':idnivel' => 2, ':antes' => -1*$_POST['antesP'], ':despues' => $_POST['despuesP']+1, ':retardo' => $_POST['retardoP']+$_POST['despuesP']+1];
+}
+else{
+    $sql = "SELECT fi_tiempo_checado(:idfacultad, :idnivel, :antes, :despues, :retardo)";
+    $params = [':idfacultad' => $_POST['facultadT'], ':idnivel' => 2, ':antes' => -1*$_POST['antesP'], ':despues' => $_POST['despuesP']+1, ':retardo' => $_POST['retardoP']+$_POST['despuesP']+1];
+}
+query($sql, $params, false);
+
+header("Location: ../carreras.php?facultad=".$_POST['facultadT']);
+exit();
 ?>

+ 22 - 22
action/action_usuario.php

@@ -1,22 +1,22 @@
-<?php
-$ruta = "../";
-require_once '../class/c_login.php';
-
-// print_r($_POST); exit;
-
-if (($user = Login::validUser($_POST['username'], $_POST['passwd'])) === false) {
-    echo json_encode("error");
-    exit;
-}
-
-$facultades = queryAll("SELECT DISTINCT ID, FACULTAD FROM FS_FACULTAD WHERE ACTIVA");
-
-for ($i = 0; $i < count($facultades); $i++) {
-    # print_r($facultades[$i]);
-    $facultades[$i]['usuarios'] = queryAll(
-        "SELECT ID, USERNAME FROM FS_USUARIO WHERE facultad = :facultad",
-        array(":facultad" => $facultades[$i]["id"])
-    );
-}
-
-echo json_encode($facultades);
+<?php
+$ruta = "../";
+require_once '../class/c_login.php';
+
+// print_r($_POST); exit;
+
+if (($user = Login::validUser($_POST['username'], $_POST['passwd'])) === false) {
+    echo json_encode("error");
+    exit;
+}
+
+$facultades = queryAll("SELECT DISTINCT ID, FACULTAD FROM FS_FACULTAD WHERE ACTIVA");
+
+for ($i = 0; $i < count($facultades); $i++) {
+    # print_r($facultades[$i]);
+    $facultades[$i]['usuarios'] = queryAll(
+        "SELECT ID, USERNAME FROM FS_USUARIO WHERE facultad = :facultad",
+        array(":facultad" => $facultades[$i]["id"])
+    );
+}
+
+echo json_encode($facultades);

+ 21 - 21
action/action_usuarios_insert.php

@@ -1,22 +1,22 @@
-<?php
-    $ruta = "../";
-    require_once "../include/bd_pdo.php";
-    global $pdo;
-    if(isset($_POST['dlfacultad']))
-        $facultad=$_POST['dlfacultad'];
-    else
-        $facultad=$_POST['mfacultad'];
-
-    $hecho = query("SELECT * FROM fs_usuario WHERE clave = :clave", [':clave' => $_POST['mclave']], true);
-    if(!$hecho){
-        $sql = "SELECT fi_usuario(:nombre, :correo, :clave, :rol, :facultad)";
-        $params = [':nombre' => mb_strtoupper($_POST['mnombre']), ':correo' => $_POST['mcorreo'], ':clave' => $_POST['mclave'], ':rol' => $_POST['mrol'], ':facultad' => $facultad];
-        $hecho = query($sql, $params, true);
-        header("Location: ../usuarios.php", true, 307);
-        exit();
-    }
-    else{
-        header("Location: ../usuarios.php?error=1");
-        exit();
-    }    
+<?php
+    $ruta = "../";
+    require_once "../include/bd_pdo.php";
+    global $pdo;
+    if(isset($_POST['dlfacultad']))
+        $facultad=$_POST['dlfacultad'];
+    else
+        $facultad=$_POST['mfacultad'];
+
+    $hecho = query("SELECT * FROM fs_usuario WHERE clave = :clave", [':clave' => $_POST['mclave']], true);
+    if(!$hecho){
+        $sql = "SELECT fi_usuario(:nombre, :correo, :clave, :rol, :facultad)";
+        $params = [':nombre' => mb_strtoupper($_POST['mnombre']), ':correo' => $_POST['mcorreo'], ':clave' => $_POST['mclave'], ':rol' => $_POST['mrol'], ':facultad' => $facultad];
+        $hecho = query($sql, $params, true);
+        header("Location: ../usuarios.php", true, 307);
+        exit();
+    }
+    else{
+        header("Location: ../usuarios.php?error=1");
+        exit();
+    }    
 ?>

+ 7 - 7
action/action_usuarios_select.php

@@ -1,8 +1,8 @@
-<?php
-    $ruta = "../";
-    require_once "../include/bd_pdo.php";
-    global $pdo;
-    $sql = "SELECT * FROM usuario WHERE usuario_id = :idUsuario";
-    $params = [':idUsuario' => $_POST['usuario']];
-    echo json_encode(query($sql, $params, true));
+<?php
+    $ruta = "../";
+    require_once "../include/bd_pdo.php";
+    global $pdo;
+    $sql = "SELECT * FROM usuario WHERE usuario_id = :idUsuario";
+    $params = [':idUsuario' => $_POST['usuario']];
+    echo json_encode(query($sql, $params, true));
 ?>

+ 14 - 14
action/action_usuarios_update.php

@@ -1,15 +1,15 @@
-<?php
-    $ruta = "../";
-    require_once "../include/bd_pdo.php";
-    global $pdo;
-    if(isset($_POST['dlfacultad']))
-        $facultad=$_POST['dlfacultad'];
-    else
-        $facultad=$_POST['mfacultad'];
-    $sql = "SELECT fu_update_usuario(:id, :nombre, :correo, :clave, :rol, :facultad)";
-    $params = array(':id' => $_POST['id'], ':nombre' => mb_strtoupper($_POST['mnombre']), ':correo' => $_POST['mcorreo'], ':clave' => $_POST['mclave'], ':rol' => $_POST['mrol'], ':facultad' => $facultad);
-    #print_r($_POST);
-    $hecho = query($sql, $params, false);
-    header("Location: ../usuarios.php", true, 307);
-    exit();
+<?php
+    $ruta = "../";
+    require_once "../include/bd_pdo.php";
+    global $pdo;
+    if(isset($_POST['dlfacultad']))
+        $facultad=$_POST['dlfacultad'];
+    else
+        $facultad=$_POST['mfacultad'];
+    $sql = "SELECT fu_update_usuario(:id, :nombre, :correo, :clave, :rol, :facultad)";
+    $params = array(':id' => $_POST['id'], ':nombre' => mb_strtoupper($_POST['mnombre']), ':correo' => $_POST['mcorreo'], ':clave' => $_POST['mclave'], ':rol' => $_POST['mrol'], ':facultad' => $facultad);
+    #print_r($_POST);
+    $hecho = query($sql, $params, false);
+    header("Location: ../usuarios.php", true, 307);
+    exit();
 ?>

+ 9 - 9
action/carrera_find.php

@@ -1,10 +1,10 @@
-<?php
-$ruta = '../';
-require_once '../include/bd_pdo.php';
-global $pdo;
-
-$sql = "SELECT * FROM fs_carreras(:fac, null, null)";
-$params = [':fac' => $_POST['fac_id']];
-
-echo json_encode(query($sql, $params, false));
+<?php
+$ruta = '../';
+require_once '../include/bd_pdo.php';
+global $pdo;
+
+$sql = "SELECT * FROM fs_carreras(:fac, null, null)";
+$params = [':fac' => $_POST['fac_id']];
+
+echo json_encode(query($sql, $params, false));
 ?>

+ 36 - 36
action/force_session.php

@@ -1,37 +1,37 @@
-<?php
-$ruta = "../";
-require_once '../class/c_login.php';
-
-# print_r($_POST); exit;
-extract($_POST); // $usuario
-Login::log_out();
-
-$user = query("SELECT * FROM FS_USUARIO WHERE ID = :id", [":id" => $usuario]);
-// die(json_encode($user));
-
-$facultad = [
-    "facultad_id" => $user["facultad"],
-    "facultad" => $user["facultad_nombre"]
-];
-
-$rol = [
-    "rol_id" => $user["rol"],
-    "rol" => $user["titulo"]
-];
-
-$admin = false;
-
-$periodo = $user["periodo"];
-
-$user = [
-    "id" => $user["id"],
-    "nombre" => $user["username"]
-];
-
-$user = new Login($user, $facultad, $rol, $admin, $periodo);
-if (isset($_SESSION))
-    session_start();
-$_SESSION['user'] = serialize($user);
-
-header("Location: ../main.php");
+<?php
+$ruta = "../";
+require_once '../class/c_login.php';
+
+# print_r($_POST); exit;
+extract($_POST); // $usuario
+Login::log_out();
+
+$user = query("SELECT * FROM FS_USUARIO WHERE ID = :id", [":id" => $usuario]);
+// die(json_encode($user));
+
+$facultad = [
+    "facultad_id" => $user["facultad"],
+    "facultad" => $user["facultad_nombre"]
+];
+
+$rol = [
+    "rol_id" => $user["rol"],
+    "rol" => $user["titulo"]
+];
+
+$admin = false;
+
+$periodo = $user["periodo"];
+
+$user = [
+    "id" => $user["id"],
+    "nombre" => $user["username"]
+];
+
+$user = new Login($user, $facultad, $rol, $admin, $periodo);
+if (isset($_SESSION))
+    session_start();
+$_SESSION['user'] = serialize($user);
+
+header("Location: ../main.php");
 exit;

+ 59 - 59
action/registro_supervisor.php

@@ -1,60 +1,60 @@
-<?
-#input $_GET['id_espacio_sgu']
-define("INFORMATION", [
-    'POST' => [
-        'profesor_id',
-        'horario_id',
-        'estado',
-        'comentario',
-        'supervisor_id',
-    ],
-]);
-#output rutas: [ ...ruta, salones: [{...salon}] ]
-header('Content-Type: application/json charset=utf-8');
-#return html
-$ruta = "../";
-require_once "../class/c_login.php";
-// check method
-try {
-    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
-        // check parameters
-        $raw = file_get_contents('php://input');
-        $post_data = json_decode($raw, true);
-        // if it's a list
-        // step 1: get subrutas
-        if (empty($post_data)) {
-            http_response_code(400);
-            echo json_encode(['error' => 'No hay clases pendientes']);
-            exit;
-        }
-
-        $data = $db->query(
-            'INSERT INTO registro (profesor_id, horario_id, registro_fecha_supervisor, estado_supervisor_id, registro_fecha_ideal, supervisor_id, comentario)
-            VALUES' .
-            implode(',', array_map(fn($x) => "({$x['profesor_id']} , {$x['horario_id']}, NOW()," . (is_null($x['estado']) ? 'null' : $x['estado']) . ", NOW(), {$x['supervisor_id']}," . (empty($x['comentario']) ? 'null' : "'{$x['comentario']}'") . ')', $post_data))
-            . ' ON CONFLICT (profesor_id, horario_id, registro_fecha_ideal) DO UPDATE SET estado_supervisor_id = EXCLUDED.estado_supervisor_id, registro_fecha_supervisor = NOW(), comentario = EXCLUDED.comentario
-            RETURNING *'
-        );
-        echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
-    } else {
-        http_response_code(405);
-        echo json_encode(['error' => 'method not allowed']);
-        exit;
-
-    }
-
-} catch (PDOException $th) {
-    http_response_code(500);
-    echo json_encode([
-        'error' => $th->getMessage(),
-        'query' => $db->getLastQuery(),
-        'post_data' => $post_data,
-    ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
-    exit;
-} catch (Exception $th) {
-    http_response_code(500);
-    echo json_encode([
-        'error' => $th->getMessage(),
-    ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
-    exit;
+<?
+#input $_GET['id_espacio_sgu']
+define("INFORMATION", [
+    'POST' => [
+        'profesor_id',
+        'horario_id',
+        'estado',
+        'comentario',
+        'supervisor_id',
+    ],
+]);
+#output rutas: [ ...ruta, salones: [{...salon}] ]
+header('Content-Type: application/json charset=utf-8');
+#return html
+$ruta = "../";
+require_once "../class/c_login.php";
+// check method
+try {
+    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
+        // check parameters
+        $raw = file_get_contents('php://input');
+        $post_data = json_decode($raw, true);
+        // if it's a list
+        // step 1: get subrutas
+        if (empty($post_data)) {
+            http_response_code(400);
+            echo json_encode(['error' => 'No hay clases pendientes']);
+            exit;
+        }
+
+        $data = $db->query(
+            'INSERT INTO registro (profesor_id, horario_id, registro_fecha_supervisor, estado_supervisor_id, registro_fecha_ideal, supervisor_id, comentario)
+            VALUES' .
+            implode(',', array_map(fn($x) => "({$x['profesor_id']} , {$x['horario_id']}, NOW()," . (is_null($x['estado']) ? 'null' : $x['estado']) . ", NOW(), {$x['supervisor_id']}," . (empty($x['comentario']) ? 'null' : "'{$x['comentario']}'") . ')', $post_data))
+            . ' ON CONFLICT (profesor_id, horario_id, registro_fecha_ideal) DO UPDATE SET estado_supervisor_id = EXCLUDED.estado_supervisor_id, registro_fecha_supervisor = NOW(), comentario = EXCLUDED.comentario, supervisor_id = EXCLUDED.supervisor_id
+            RETURNING *'
+        );
+        echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
+    } else {
+        http_response_code(405);
+        echo json_encode(['error' => 'method not allowed']);
+        exit;
+
+    }
+
+} catch (PDOException $th) {
+    http_response_code(500);
+    echo json_encode([
+        'error' => $th->getMessage(),
+        'query' => $db->getLastQuery(),
+        'post_data' => $post_data,
+    ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
+    exit;
+} catch (Exception $th) {
+    http_response_code(500);
+    echo json_encode([
+        'error' => $th->getMessage(),
+    ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
+    exit;
 }

+ 27 - 27
action/rutas.php

@@ -1,28 +1,28 @@
-<?
-header('Content-Type: application/json charset=utf-8');
-$ruta = "../";
-require_once "../class/c_login.php";
-
-$universidad_la_salle = $db
-    ->where('salon', 'UNIVERSIDAD LA SALLE', 'ILIKE')
-    ->getOne('salon_view');
-
-$rutas =
-    array_map(
-        function (&$ruta) use ($db) {
-            $ruta['subrutas'] =
-                $db
-                    ->where('id_espacio_padre', $ruta['id_espacio_sgu'])
-                    ->orderBy('salon')
-                    ->get('salon_view');
-            return $ruta;
-
-        },
-        $db
-            ->where('id_espacio_padre', $universidad_la_salle['id_espacio_sgu'])
-            ->orderBy('salon')
-            ->get('salon_view')
-    );
-
-// echo json_encode($universidad_la_salle, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); EXIT;
+<?
+header('Content-Type: application/json charset=utf-8');
+$ruta = "../";
+require_once "../class/c_login.php";
+
+$universidad_la_salle = $db
+    ->where('salon', 'UNIVERSIDAD LA SALLE', 'ILIKE')
+    ->getOne('salon_view');
+
+$rutas =
+    array_map(
+        function ($ruta) use ($db) {
+            $ruta['subrutas'] =
+                $db
+                    ->where('id_espacio_padre', $ruta['id_espacio_sgu'])
+                    ->orderBy('salon')
+                    ->get('salon_view');
+            return $ruta;
+
+        },
+        $db
+            ->where('id_espacio_padre', $universidad_la_salle['id_espacio_sgu'])
+            ->orderBy('salon')
+            ->get('salon_view')
+    );
+
+// echo json_encode($universidad_la_salle, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); EXIT;
 echo json_encode($rutas, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);

+ 72 - 72
action/rutas_salón_horario.php

@@ -1,73 +1,73 @@
-<?
-#input $_GET['id_espacio_sgu']
-$information = [
-    'GET' => [
-        'id_espacio_sgu',
-        'bloque_horario_id',
-    ],
-];
-#output rutas: [ ...ruta, salones: [{...salon}] ]
-header('Content-Type: application/json charset=utf-8');
-$ruta = "../";
-require_once "../class/c_login.php";
-// check method
-try {
-    if ($_SERVER['REQUEST_METHOD'] === 'GET') {
-        // check parameters
-        array_walk($information['GET'], function ($value) {
-            if (!array_key_exists($value, $_GET)) {
-                http_response_code(400);
-                echo json_encode(['error' => "$value is required"]);
-                exit;
-            }
-        });
-        // step 1: get subrutas
-        $data = $db
-            ->where('tiene_salones')
-            ->where("{$_GET['id_espacio_sgu']} = ANY(id_espacio_sgu_array)")
-            ->get('salon_view');
-
-        // step 3: get horarios
-        $data = array_map(
-            fn($ruta) => array_merge(
-                [
-                    'horarios' => $db
-                        ->join('periodo', 'periodo.periodo_id = horario_view.periodo_id')
-                        ->join('bloque_horario', '(bloque_horario.hora_inicio, bloque_horario.hora_fin) OVERLAPS (horario_view.horario_hora, horario_view.horario_hora + horario_view.duracion)')
-                        ->join('salon_view', 'salon_view.salon_id = horario_view.salon_id')
-                        ->join('horario_profesor', 'horario_profesor.horario_id = horario_view.horario_id')
-                        ->join('profesor', 'profesor.profesor_id = horario_profesor.profesor_id')
-                        ->join('registro', '(registro.profesor_id, registro.horario_id, registro.registro_fecha_ideal) = (profesor.profesor_id, horario_view.horario_id, CURRENT_DATE)', 'LEFT')
-                        ->where('CURRENT_DATE BETWEEN periodo.periodo_fecha_inicio AND periodo.periodo_fecha_fin')
-                        ->where('horario_dia = EXTRACT(DOW FROM CURRENT_DATE)')
-                        ->where('bloque_horario.id', $_GET['bloque_horario_id'])
-                        ->where('id_espacio_padre', $ruta['id_espacio_sgu'])
-                        ->get('horario_view', null, '*, horario_view.horario_id, profesor.profesor_id'),
-                ],
-                $ruta
-            ),
-            $data
-        );
-
-        echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
-    } else {
-        http_response_code(405);
-        echo json_encode(['error' => 'method not allowed']);
-        exit;
-
-    }
-
-} catch (PDOException $th) {
-    http_response_code(500);
-    echo json_encode([
-        'error' => $th->getMessage(),
-        'query' => $db->getLastQuery(),
-    ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
-    exit;
-} catch (Exception $th) {
-    http_response_code(500);
-    echo json_encode([
-        'error' => $th->getMessage(),
-    ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
-    exit;
+<?
+#input $_GET['id_espacio_sgu']
+$information = [
+    'GET' => [
+        'id_espacio_sgu',
+        'bloque_horario_id',
+    ],
+];
+#output rutas: [ ...ruta, salones: [{...salon}] ]
+header('Content-Type: application/json charset=utf-8');
+$ruta = "../";
+require_once "../class/c_login.php";
+// check method
+try {
+    if ($_SERVER['REQUEST_METHOD'] === 'GET') {
+        // check parameters
+        array_walk($information['GET'], function ($value) {
+            if (!array_key_exists($value, $_GET)) {
+                http_response_code(400);
+                echo json_encode(['error' => "$value is required"]);
+                exit;
+            }
+        });
+        // step 1: get subrutas
+        $data = $db
+            ->where('tiene_salones')
+            ->where("{$_GET['id_espacio_sgu']} = ANY(id_espacio_sgu_array)")
+            ->get('salon_view');
+
+        // step 3: get horarios
+        $data = array_map(
+            fn($ruta) => array_merge(
+                [
+                    'horarios' => $db
+                        ->join('periodo', 'periodo.periodo_id = horario_view.periodo_id')
+                        ->join('bloque_horario', '(bloque_horario.hora_inicio, bloque_horario.hora_fin) OVERLAPS (horario_view.horario_hora, horario_view.horario_hora + horario_view.duracion)')
+                        ->join('salon_view', 'salon_view.salon_id = horario_view.salon_id')
+                        ->join('horario_profesor', 'horario_profesor.horario_id = horario_view.horario_id')
+                        ->join('profesor', 'profesor.profesor_id = horario_profesor.profesor_id')
+                        ->join('registro', '(registro.profesor_id, registro.horario_id, registro.registro_fecha_ideal) = (profesor.profesor_id, horario_view.horario_id, CURRENT_DATE)', 'LEFT')
+                        ->where('CURRENT_DATE BETWEEN periodo.periodo_fecha_inicio AND periodo.periodo_fecha_fin')
+                        ->where('horario_dia = EXTRACT(DOW FROM CURRENT_DATE)')
+                        ->where('bloque_horario.id', $_GET['bloque_horario_id'])
+                        ->where('id_espacio_padre', $ruta['id_espacio_sgu'])
+                        ->get('horario_view', null, '*, horario_view.horario_id, profesor.profesor_id'),
+                ],
+                $ruta
+            ),
+            $data
+        );
+
+        echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
+    } else {
+        http_response_code(405);
+        echo json_encode(['error' => 'method not allowed']);
+        exit;
+
+    }
+
+} catch (PDOException $th) {
+    http_response_code(500);
+    echo json_encode([
+        'error' => $th->getMessage(),
+        'query' => $db->getLastQuery(),
+    ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
+    exit;
+} catch (Exception $th) {
+    http_response_code(500);
+    echo json_encode([
+        'error' => $th->getMessage(),
+    ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
+    exit;
 }

+ 24 - 24
action/schemas/registro_supervisor.json

@@ -1,24 +1,24 @@
-{
-    "type": "array",
-    "items": {
-        "type": "object",
-        "properties": {
-            "profesor_id": {
-                "type": "integer"
-            },
-            "horario_id": {
-                "type": "integer"
-            },
-            "estado": {
-                "type": ["integer", "null"]
-            },
-            "comentario": {
-                "type": "string"
-            },
-            "supervisor_id": {
-                "type": "integer"
-            }
-        },
-        "required": ["profesor_id", "horario_id", "comentario", "supervisor_id"]
-    }
-}
+{
+    "type": "array",
+    "items": {
+        "type": "object",
+        "properties": {
+            "profesor_id": {
+                "type": "integer"
+            },
+            "horario_id": {
+                "type": "integer"
+            },
+            "estado": {
+                "type": ["integer", "null"]
+            },
+            "comentario": {
+                "type": "string"
+            },
+            "supervisor_id": {
+                "type": "integer"
+            }
+        },
+        "required": ["profesor_id", "horario_id", "comentario", "supervisor_id"]
+    }
+}

+ 25 - 25
action/usuario_find.php

@@ -1,26 +1,26 @@
-<?php 
-$ruta = '../';
-require_once '../include/bd_pdo.php';
-global $pdo;
-
-if($_POST['nombre']==""){
-    $nombre = null;
-}else{
-    $nombre = $_POST['nombre'];
-}
-if($_POST['clave']==""){
-    $clave = null;
-}else{
-    $clave = $_POST['clave'];
-}
-if($_POST['facultad']==""){
-    $facultad = null;
-}else{
-    $facultad = $_POST['facultad'];
-}
-
-$sql = "SELECT * FROM fs_profesores(:nombre, :clave, :facultad) ORDER BY profesor_nombre";
-$params = [':nombre' => $nombre, ':clave' => $clave, ':facultad' => $facultad];
-
-echo json_encode(query($sql, $params, false));
+<?php 
+$ruta = '../';
+require_once '../include/bd_pdo.php';
+global $pdo;
+
+if($_POST['nombre']==""){
+    $nombre = null;
+}else{
+    $nombre = $_POST['nombre'];
+}
+if($_POST['clave']==""){
+    $clave = null;
+}else{
+    $clave = $_POST['clave'];
+}
+if($_POST['facultad']==""){
+    $facultad = null;
+}else{
+    $facultad = $_POST['facultad'];
+}
+
+$sql = "SELECT * FROM fs_profesores(:nombre, :clave, :facultad) ORDER BY profesor_nombre";
+$params = [':nombre' => $nombre, ':clave' => $clave, ':facultad' => $facultad];
+
+echo json_encode(query($sql, $params, false));
 ?>

+ 285 - 285
alta_de_horario.php

@@ -1,286 +1,286 @@
-<?php
-require_once 'class/c_login.php';
-if (!isset($_SESSION['user'])) 
-    die(header('Location: index.php'));
-    
-$user = unserialize($_SESSION['user']);
-$user->access();
-if (!$user->admin && in_array($user->acceso, ['r', 'n']))
-    die(header('Location: main.php?error=1'));
-
-$user->print_to_log('Consultar: Alta de horario');
-?>
-<!DOCTYPE html>
-<html lang="en">
-
-<head>
-    <title>Cargar horario desde Excel | <?= $user->facultad['facultad'] ?? 'General' ?></title>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
-    <?php include_once "import/html_css_files.php"; ?>
-</head>
-
-<body style="display: block;">
-    <?php
-    include('include/constantes.php');
-    include("import/html_header.php");
-    html_header("Cargar horario desde Excel", "Sistema de gestión de checador");
-    ?>
-    <main class="container content marco content-margin" id="local-app">
-        <div class="row mb-3">
-            <div class="col-12 text-right">
-                <button class="btn btn-outline-secondary" data-toggle="modal" data-target="#modalDescargarPlantilla">
-                    <span class="ing-descarga ing-fw"></span>
-                    Descargar plantilla
-                </button>
-            </div>
-        </div>
-        <section id="message"></section>
-        <?php require('import/periodo.php') ?>
-        <form>
-            <div class="form-group">
-                <div class="form-box">
-                    <?php
-                    $periodo = $db->where('id', $user->periodo)->getOne('fs_periodo');
-                    $carreras = $db
-                    ->where('nivel', $periodo['nivel_id'])
-                    ->where('facultad', $user->facultad['facultad_id'])
-                    ->orderBy('carrera')
-                    ->get('fs_carrera');
-                    ?>
-                    <div class="form-group row" id="input-carrera">
-
-                        <label for="filter_carrera" class="col-4 col-form-label">Carrera</label>
-                        <div class="col-6">
-                            <div id="dlcarrera" class="datalist datalist-select mb-1 w-100">
-                                <div class="datalist-input">Seleccionar carrera</div>
-                                <span class="ing-buscar icono"></span>
-                                <ul style="display:none">
-                                    <?php
-                                    foreach ($carreras as $carrera) {
-                                    ?>
-                                        <li data-id="<?= $carrera['id'] ?>">
-                                            <?= $carrera['carrera'] ?>
-                                        </li>
-                                    <?php
-                                    }
-                                    ?>
-                                </ul>
-                                <input type="hidden" id="filter_carrera" name="carrera" value="">
-                            </div>
-                        </div>
-
-                    </div>
-
-                    <div class="form-group row" id="input-file">
-                        <label for="excel" class="col-4 col-form-label">Archivo de horarios</label>
-                        <div class="col-8 col-sm-6">
-                            <input class="form-control-file" id="excel" name="archivo" accept=".xlsx, .xls" require>
-                        </div>
-                    </div>
-
-                    <div class="form-group mt-5 row justify-content-center">
-                        <!-- on click reload -->
-                        <button id="btn-cancelar" type="button" class="btn btn-danger mx-2" onclick="location.reload()">
-                            <span class="ing-cancelar"></span>
-                            Cancelar
-                        </button>
-
-                        <button id="btn-cargar" type="button" class="btn btn-primary" onclick="submit_files()">
-                            <span class="ing-guardar"></span>
-                            Guardar horario
-                        </button>
-                    </div>
-                </div>
-            </div>
-
-        </form>
-    </main>
-
-    <div class="modal fade" id="modalDescargarPlantilla" tabindex="-1" aria-labelledby="descargarPlantillaModalLabel" aria-hidden="true">
-        <div class="modal-dialog modal-xl modal-dialog-centered modal-dialog-scrollable">
-            <div class="modal-content">
-                <div class="modal-header">
-                    <h5 class="modal-title" id="descargarPlantillaModalLabel">Instrucciones</h5>
-                    <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
-                        <span aria-hidden="true">&times;</span>
-                    </button>
-                </div>
-                <div class="modal-body">
-                    <ol>
-                        <li> Los encabezados deberán mantenerse en todo momento, tal cual se encuentran en la plantilla. </li>
-                        <li> Las horas válidas son de 7:00 a 22:00 en bloques de 15 minutos. </li>
-                        <li> La columna DURACIÓN es la duración de una clase en horas. Si la clase es de 7:15–8:45 se pone que la hora de la clase es de 7:15 con una duración de 180. </li>
-                        <!-- <li> Únicamente las columnas de … </li> -->
-                        <li> Si se encuentra un error en la revisión del archivo no se guardará ningún registro. </li>
-                        <li> Una vez revisado el archivo haz clic en el botón [Guardar horario] para que se guarde la información. </li>
-
-                    </ol>
-                </div>
-
-                <div class="modal-footer">
-                    <button type="button" class="btn btn-danger" data-dismiss="modal">Aceptar</button>
-                    <button type="button" class="btn btn-primary" id="descargarPlantilla"><span class="ing-descarga"></span> Descargar</button>
-                    <button type="button" class="btn btn-primary" id="descargarPlantillaEjemplo"><span class="ing-descarga"></span> Descargar ejemplo</button>
-                </div>
-            </div>
-        </div>
-    </div>
-
-</body>
-<?php
-require_once("import/html_footer.php");
-require_once("js/messages.php")
-?>
-<script src="js/scrollables.js"></script>
-<script src="js/jquery.min.js"></script>
-<script src="js/bootstrap/bootstrap.min.js"></script>
-
-<script src="js/custominputfile.min-es.js"></script>
-<link rel="stylesheet" href="css/custominputfile.min.css">
-<script src="js/fetchlib.js"></script>
-<script>
-    var datum = []
-
-    $(document).ready(function() {
-
-        $('#excel').customFile({
-            allowed: ['xlsx', 'xls'],
-            maxFiles: 1,
-            callbacks: {
-                onSuccess: async function(item) {
-                    var formData = $.customFile.serialize('archivo');
-
-                    const {
-                        status,
-                        message,
-                        data
-                    } = await fetch('action/action_revisar_excel.php', {
-                            method: 'POST',
-                            body: formData,
-                        })
-                        .then(response => response.json())
-                        .catch(error => {
-                            return {
-                                status: 'error',
-                                message: 'Error al cargar el archivo',
-                            }
-                        });
-
-                    if (status == 'error') {
-                        triggerMessage(message, 'Error en el formato del archivo');
-                        item.destroy();
-                        return
-                    }
-
-                    triggerMessage(message + " Haz clic en el botón <b>Guardar horario</b> para guardar los datos", `Archivo revisado, aún <b>no guardado</b>`, 'primary');
-                    datum = data;
-                    // hide form
-                    document.querySelector('#input-file').classList.add('d-none');
-                    document.querySelector('#input-carrera').classList.add('d-none');
-
-                    // show button
-                    document.querySelector('#btn-cargar').classList.remove('d-none');
-                    document.querySelector('#btn-cancelar').classList.remove('d-none');
-                },
-            }
-        });
-
-        // hide
-        document.querySelector('#input-file').classList.add('d-none');
-        document.querySelector('#btn-cancelar').classList.add('d-none');
-        document.querySelector('#btn-cargar').classList.add('d-none');
-        // on click in carrera
-        [... document.querySelectorAll('#dlcarrera ul li')].forEach(
-            li => li.addEventListener('click', () => {
-                document.querySelector('#input-file').classList.remove('d-none')
-            })
-        )
-    })
-
-    async function submit_files() {
-        // disable button
-        const button = document.querySelector('#btn-cargar');
-        // add class disabled to button
-        button.classList.add('disabled');
-        // disable button
-        button.disabled = true;
-
-        // add loading icon
-        button.innerHTML = '<span class="ing-cargando"></span> Cargando...';
-
-        let missing = [];
-
-        let carrera = $('#filter_carrera').val();
-        if (carrera == '') missing.push('Carrera');
-
-        if (datum.length == 0) missing.push('Archivo de horarios');
-
-        let facultad = <?= $user->facultad['facultad_id'] ?>;
-
-        if (missing.length > 0) {
-            messageMissingInputs(missing);
-
-            // remove class disabled to button
-            button.classList.remove('disabled');
-            // enable button
-            button.disabled = false;
-
-            // remove loading icon
-            button.innerHTML = '<span class="ing-guardar"></span> Guardar horario';
-
-            return;
-        }
-
-        const formData = new FormData();
-
-        formData.append('carrera', carrera);
-        formData.append('facultad', facultad);
-        formData.append('periodo', <?= $user->periodo ?>);
-        formData.append('data', JSON.stringify(datum));
-
-
-        const {
-            status,
-            message
-        } = await fetch('action/action_horario_excel.php', {
-                method: 'POST',
-                body: formData
-            })
-            .then(response => response.json())
-            .catch(error => {
-                return {
-                    status: 'error',
-                    message: 'Error al cargar el archivo',
-                }
-            });
-
-        triggerMessage(message, (status == 'error') ? 'Error al guardar el archivo' : 'Horarios guardados', (status == 'error') ? 'danger' : 'success');
-
-        // await 1 second
-        // await setTimeout(() => {}, 1000);
-
-        // remove class disabled to
-        button.classList.remove('disabled');
-        // enable button
-        button.disabled = false;
-        button.innerHTML = 'Cargar otro horario';
-
-        // refresh page
-        button.onclick = () => location.reload()
-
-        // hide button
-        document.querySelector('#btn-cancelar').classList.add('d-none');
-    }
-
-    document.querySelector('#descargarPlantilla').addEventListener('click', function() {
-        window.open('template/plantilla.xlsx', '_blank');
-    });
-
-    document.querySelector('#descargarPlantillaEjemplo').addEventListener('click', function() {
-        window.open('template/ejemplo.xlsx', '_blank');
-    });
-</script>
-
-
+<?php
+require_once 'class/c_login.php';
+if (!isset($_SESSION['user'])) 
+    die(header('Location: index.php'));
+    
+$user = unserialize($_SESSION['user']);
+$user->access();
+if (!$user->admin && in_array($user->acceso, ['r', 'n']))
+    die(header('Location: main.php?error=1'));
+
+$user->print_to_log('Consultar: Alta de horario');
+?>
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <title>Cargar horario desde Excel | <?= $user->facultad['facultad'] ?? 'General' ?></title>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+    <?php include_once "import/html_css_files.php"; ?>
+</head>
+
+<body style="display: block;">
+    <?php
+    include('include/constantes.php');
+    include("import/html_header.php");
+    html_header("Cargar horario desde Excel", "Sistema de gestión de checador");
+    ?>
+    <main class="container content marco content-margin" id="local-app">
+        <div class="row mb-3">
+            <div class="col-12 text-right">
+                <button class="btn btn-outline-secondary" data-toggle="modal" data-target="#modalDescargarPlantilla">
+                    <span class="ing-descarga ing-fw"></span>
+                    Descargar plantilla
+                </button>
+            </div>
+        </div>
+        <section id="message"></section>
+        <?php require('import/periodo.php') ?>
+        <form>
+            <div class="form-group">
+                <div class="form-box">
+                    <?php
+                    $periodo = $db->where('id', $user->periodo)->getOne('fs_periodo');
+                    $carreras = $db
+                    ->where('nivel', $periodo['nivel_id'])
+                    ->where('facultad', $user->facultad['facultad_id'])
+                    ->orderBy('carrera')
+                    ->get('fs_carrera');
+                    ?>
+                    <div class="form-group row" id="input-carrera">
+
+                        <label for="filter_carrera" class="col-4 col-form-label">Carrera</label>
+                        <div class="col-6">
+                            <div id="dlcarrera" class="datalist datalist-select mb-1 w-100">
+                                <div class="datalist-input">Seleccionar carrera</div>
+                                <span class="ing-buscar icono"></span>
+                                <ul style="display:none">
+                                    <?php
+                                    foreach ($carreras as $carrera) {
+                                    ?>
+                                        <li data-id="<?= $carrera['id'] ?>">
+                                            <?= $carrera['carrera'] ?>
+                                        </li>
+                                    <?php
+                                    }
+                                    ?>
+                                </ul>
+                                <input type="hidden" id="filter_carrera" name="carrera" value="">
+                            </div>
+                        </div>
+
+                    </div>
+
+                    <div class="form-group row" id="input-file">
+                        <label for="excel" class="col-4 col-form-label">Archivo de horarios</label>
+                        <div class="col-8 col-sm-6">
+                            <input class="form-control-file" id="excel" name="archivo" accept=".xlsx, .xls" require>
+                        </div>
+                    </div>
+
+                    <div class="form-group mt-5 row justify-content-center">
+                        <!-- on click reload -->
+                        <button id="btn-cancelar" type="button" class="btn btn-danger mx-2" onclick="location.reload()">
+                            <span class="ing-cancelar"></span>
+                            Cancelar
+                        </button>
+
+                        <button id="btn-cargar" type="button" class="btn btn-primary" onclick="submit_files()">
+                            <span class="ing-guardar"></span>
+                            Guardar horario
+                        </button>
+                    </div>
+                </div>
+            </div>
+
+        </form>
+    </main>
+
+    <div class="modal fade" id="modalDescargarPlantilla" tabindex="-1" aria-labelledby="descargarPlantillaModalLabel" aria-hidden="true">
+        <div class="modal-dialog modal-xl modal-dialog-centered modal-dialog-scrollable">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <h5 class="modal-title" id="descargarPlantillaModalLabel">Instrucciones</h5>
+                    <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">&times;</span>
+                    </button>
+                </div>
+                <div class="modal-body">
+                    <ol>
+                        <li> Los encabezados deberán mantenerse en todo momento, tal cual se encuentran en la plantilla. </li>
+                        <li> Las horas válidas son de 7:00 a 22:00 en bloques de 15 minutos. </li>
+                        <li> La columna DURACIÓN es la duración de una clase en horas. Si la clase es de 7:15–8:45 se pone que la hora de la clase es de 7:15 con una duración de 180. </li>
+                        <!-- <li> Únicamente las columnas de … </li> -->
+                        <li> Si se encuentra un error en la revisión del archivo no se guardará ningún registro. </li>
+                        <li> Una vez revisado el archivo haz clic en el botón [Guardar horario] para que se guarde la información. </li>
+
+                    </ol>
+                </div>
+
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-danger" data-dismiss="modal">Aceptar</button>
+                    <button type="button" class="btn btn-primary" id="descargarPlantilla"><span class="ing-descarga"></span> Descargar</button>
+                    <button type="button" class="btn btn-primary" id="descargarPlantillaEjemplo"><span class="ing-descarga"></span> Descargar ejemplo</button>
+                </div>
+            </div>
+        </div>
+    </div>
+
+</body>
+<?php
+require_once("import/html_footer.php");
+require_once("js/messages.php")
+?>
+<script src="js/scrollables.js"></script>
+<script src="js/jquery.min.js"></script>
+<script src="js/bootstrap/bootstrap.min.js"></script>
+
+<script src="js/custominputfile.min-es.js"></script>
+<link rel="stylesheet" href="css/custominputfile.min.css">
+<script src="js/fetchlib.js"></script>
+<script>
+    var datum = []
+
+    $(document).ready(function() {
+
+        $('#excel').customFile({
+            allowed: ['xlsx', 'xls'],
+            maxFiles: 1,
+            callbacks: {
+                onSuccess: async function(item) {
+                    var formData = $.customFile.serialize('archivo');
+
+                    const {
+                        status,
+                        message,
+                        data
+                    } = await fetch('action/action_revisar_excel.php', {
+                            method: 'POST',
+                            body: formData,
+                        })
+                        .then(response => response.json())
+                        .catch(error => {
+                            return {
+                                status: 'error',
+                                message: 'Error al cargar el archivo',
+                            }
+                        });
+
+                    if (status == 'error') {
+                        triggerMessage(message, 'Error en el formato del archivo');
+                        item.destroy();
+                        return
+                    }
+
+                    triggerMessage(message + " Haz clic en el botón <b>Guardar horario</b> para guardar los datos", `Archivo revisado, aún <b>no guardado</b>`, 'primary');
+                    datum = data;
+                    // hide form
+                    document.querySelector('#input-file').classList.add('d-none');
+                    document.querySelector('#input-carrera').classList.add('d-none');
+
+                    // show button
+                    document.querySelector('#btn-cargar').classList.remove('d-none');
+                    document.querySelector('#btn-cancelar').classList.remove('d-none');
+                },
+            }
+        });
+
+        // hide
+        document.querySelector('#input-file').classList.add('d-none');
+        document.querySelector('#btn-cancelar').classList.add('d-none');
+        document.querySelector('#btn-cargar').classList.add('d-none');
+        // on click in carrera
+        [... document.querySelectorAll('#dlcarrera ul li')].forEach(
+            li => li.addEventListener('click', () => {
+                document.querySelector('#input-file').classList.remove('d-none')
+            })
+        )
+    })
+
+    async function submit_files() {
+        // disable button
+        const button = document.querySelector('#btn-cargar');
+        // add class disabled to button
+        button.classList.add('disabled');
+        // disable button
+        button.disabled = true;
+
+        // add loading icon
+        button.innerHTML = '<span class="ing-cargando"></span> Cargando...';
+
+        let missing = [];
+
+        let carrera = $('#filter_carrera').val();
+        if (carrera == '') missing.push('Carrera');
+
+        if (datum.length == 0) missing.push('Archivo de horarios');
+
+        let facultad = <?= $user->facultad['facultad_id'] ?>;
+
+        if (missing.length > 0) {
+            messageMissingInputs(missing);
+
+            // remove class disabled to button
+            button.classList.remove('disabled');
+            // enable button
+            button.disabled = false;
+
+            // remove loading icon
+            button.innerHTML = '<span class="ing-guardar"></span> Guardar horario';
+
+            return;
+        }
+
+        const formData = new FormData();
+
+        formData.append('carrera', carrera);
+        formData.append('facultad', facultad);
+        formData.append('periodo', <?= $user->periodo ?>);
+        formData.append('data', JSON.stringify(datum));
+
+
+        const {
+            status,
+            message
+        } = await fetch('action/action_horario_excel.php', {
+                method: 'POST',
+                body: formData
+            })
+            .then(response => response.json())
+            .catch(error => {
+                return {
+                    status: 'error',
+                    message: 'Error al cargar el archivo',
+                }
+            });
+
+        triggerMessage(message, (status == 'error') ? 'Error al guardar el archivo' : 'Horarios guardados', (status == 'error') ? 'danger' : 'success');
+
+        // await 1 second
+        // await setTimeout(() => {}, 1000);
+
+        // remove class disabled to
+        button.classList.remove('disabled');
+        // enable button
+        button.disabled = false;
+        button.innerHTML = 'Cargar otro horario';
+
+        // refresh page
+        button.onclick = () => location.reload()
+
+        // hide button
+        document.querySelector('#btn-cancelar').classList.add('d-none');
+    }
+
+    document.querySelector('#descargarPlantilla').addEventListener('click', function() {
+        window.open('template/plantilla.xlsx', '_blank');
+    });
+
+    document.querySelector('#descargarPlantillaEjemplo').addEventListener('click', function() {
+        window.open('template/ejemplo.xlsx', '_blank');
+    });
+</script>
+
+
 </html>

+ 421 - 376
auditoría.php

@@ -1,377 +1,422 @@
-<!DOCTYPE html>
-<html lang="en">
-
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>Supervisor</title>
-    <?php
-    include 'import/html_css_files.php';
-    ?>
-    <style>
-        [v-cloak] {
-            display: none;
-        }
-    </style>
-</head>
-
-<body>
-    <?
-    $redirect = $_SERVER['PHP_SELF'];
-    include "import/html_header.php";
-    global $user;
-    html_header(
-        "Registro de asistencia - Vicerrectoría Académica",
-        "Sistema de gestión de checador",
-    );
-
-    #include "import/periodo.php";
-    ?>
-
-    <main class="container-fluid px-4 mt-4" id="app" v-cloak @vue:mounted="mounted">
-        <form action="">
-            <div class="form-box">
-                <div class="form-group row">
-                    <label for="periodo" class="col-4 col-form-label">Facultad</label>
-                    <div class="col-6">
-                        <div id="dlPeriodo" class="datalist datalist-select mb-1 w-100">
-                            <div class="datalist-input">Selecciona una facultad</div>
-                            <span class="ing-buscar icono"></span>
-                            <ul style="display:none">
-                                <li class="datalist-option" data-id="0" @click="store.filters.facultad_id = null;">
-                                    Todas las facultades
-                                </li>
-                                <li class="datalist-option" v-for="facultad in store.facultades.data"
-                                    :key="facultad.facultad_id" :data-id="facultad.facultad_id"
-                                    @click="store.filters.facultad_id = facultad.facultad_id">
-                                    (<small> {{facultad.clave_dependencia}} </small>) {{ facultad.facultad_nombre }}
-                                </li>
-                            </ul>
-                            <input type="hidden" id="facultad_id" name="id">
-                        </div>
-                    </div>
-                </div>
-                <div class="form-group row align-items-center">
-                    <label for="switchFecha" class="col-4 col-form-label">
-                        Fecha
-                        <!-- switch -->
-                        <div class="custom-control custom-switch">
-                            <input type="checkbox" class="custom-control-input" id="switchFecha"
-                                v-model="store.filters.switchFecha" @input="store.filters.switchFechas">
-                            <label class="custom-control-label" for="switchFecha"></label>
-                        </div>
-                    </label>
-                    <div class="col-3" v-if="store.filters.switchFecha">
-                        <div class="form-row">
-                            <input id="fecha_inicio" name="fecha_inicio" class="form-control date-picker"
-                                placeholder="Seleccione una fecha de inicio" readonly
-                                v-model="store.filters.fecha_inicio">
-                        </div>
-                    </div>
-                    <div class="col-3" v-if="store.filters.switchFecha">
-                        <div class="form-row">
-                            <input id="fecha_fin" name="fecha_fin" class="form-control date-picker"
-                                placeholder="Seleccione una fecha final" readonly v-model="store.filters.fecha_fin">
-                        </div>
-                    </div>
-
-                    <div class="col-6" v-if="!store.filters.switchFecha">
-                        <div class="form-row">
-                            <input id="fecha" name="fecha" class="form-control date-picker"
-                                placeholder="Seleccione una fecha" readonly v-model="store.filters.fecha">
-                        </div>
-                    </div>
-                </div>
-                <div class="form-group row">
-                    <label for="profesor" class="col-4 col-form-label">Profesor</label>
-                    <div class="col-6">
-                        <div class="form-row justify-content-around align-items-center">
-                            <input id="profesor" name="profesor" class="form-control col-11 mr-1 px-2"
-                                placeholder="Seleccione una profesor" list="dlProfesor"
-                                v-model="store.filters.profesor">
-                            <button type="button" class="btn btn-info btn-sm form-control col ml-auto"
-                                @click="store.filters.profesor = null">
-                                <i class="ing-borrar"></i>
-                            </button>
-                        </div>
-                        <datalist id="dlProfesor">
-                            <option v-for="profesor in profesores" :key="profesor.profesor_id"
-                                :value="`(${profesor.profesor_clave}) ${profesor.profesor_nombre}`">
-                        </datalist>
-                    </div>
-                </div>
-                <div class="form-group row">
-                    <label for="periodo" class="col-4 col-form-label">Asistencia</label>
-                    <div class="col-6">
-                        <div class="form-row justify-content-around align-items-center">
-                            <div id="dlPeriodo" class="datalist datalist-select mb-1 w-100">
-                                <div class="datalist-input" id="estados">Selecciona un estado de asistencia</div>
-                                <span class="ing-buscar icono"></span>
-                                <ul style="display:none">
-                                    <li class="datalist-option" data-id="0" @click="store.filters.estados = [];">
-                                        Todos los registros
-                                    </li>
-                                    <li class="datalist-option" v-for="estado in store.estados.data"
-                                        :key="estado.estado_supervisor_id" :data-id="estado.estado_supervisor_id"
-                                        @click="store.filters.estados = store.toggle(store.filters.estados, estado.estado_supervisor_id); ; setTimeout(store.estados.printEstados, 0);">
-                                        <span class="badge"
-                                            :class="`badge-${store.filters.estados.includes(estado.estado_supervisor_id) ? 'dark' : estado.estado_color}`"><i
-                                                :class="estado.estado_icon"></i> {{estado.nombre}}</span>
-                                    </li>
-                                </ul>
-                                <input type="hidden" id="estado_id" name="estado_id">
-                            </div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-
-        </form>
-        <div class="mt-3 d-flex justify-content-center flex-wrap">
-            <!-- refresh -->
-            <div class="table-responsive">
-                <table class="table table-hover table-striped table-bordered table-sm">
-                    <thead class="thead-dark">
-                        <tr>
-                            <th scope="col" class="text-center align-middle px-2">
-                                <button @click="registros.invertir" class="btn btn-info mr-3"
-                                    v-if="registros.relevant.length > 1">
-                                    <i class="ing-cambiar ing-rotate-90"></i>
-                                </button>
-                                Fecha
-                            </th>
-                            <th scope="col" class="text-center align-middle px-2">Salón</th>
-                            <th scope="col" class="text-center align-middle px-2">Profesor</th>
-
-                            <th scope="col" class="text-center align-middle px-2">Horario</th>
-                            <th scope="col" class="text-center align-middle px-2">Registro</th>
-                            <th scope="col" class="text-center align-middle px-2">Supervisor</th>
-                        </tr>
-                    </thead>
-                    <tbody>
-                        <tr v-if="registros.relevant.length == 0">
-                            <td colspan="7" class="text-center">No hay clases en este horario</td>
-                        </tr>
-                        <tr v-for="registro in registros.relevant" :key="registro.registro_id">
-                            <td class="text-center align-middle px-2">{{ registro.registro_fecha_ideal }}
-                            </td>
-                            <td class="text-center align-middle px-2">{{ registro.salon }}</td>
-                            <td class="text-center align-middle px-2">
-                                <div class="col-12">
-                                    <strong>{{ registro.profesor_clave }}</strong>
-                                    {{ registro.profesor_nombre }}
-                                </div>
-                                <div class="col-12">
-                                    <button type="button" class="btn btn-outline-dark btn-sm"
-                                        @click="store.current.clase_vista = registro" data-toggle="modal"
-                                        data-target="#ver-detalle">
-                                        Ver detalle <i class="ing-ojo"></i>
-                                    </button>
-                                </div>
-                            </td>
-
-
-                            <td class="text-center align-middle px-2">{{ registro.horario_hora.slice(0,5) }} - {{
-                                registro.horario_fin.slice(0,5) }}</td>
-                            <!--  -->
-                            <td class="text-center align-middle px-2">
-                                <div v-if="registro.registro_fecha">
-                                    <div class="col-12">
-                                        Registro <small>{{ registro.registro_fecha.slice(11,16) }}</small>
-                                    </div>
-                                </div>
-                                <div v-else>
-                                    <strong>
-                                        <div class="col-12">
-                                            <span class="badge badge-danger"><i class="ing-cancelar"></i></span>
-                                        </div>
-                                        <div class="col-12 mt-2">
-                                            Sin registro
-                                        </div>
-                                    </strong>
-                                </div>
-                            </td>
-
-                            <!-- Sí checó supervisor -->
-                            <td class="text-center align-middle px-2">
-                                <div v-if="registro.registro_fecha_supervisor">
-                                    <div class="row">
-                                        <div class="col-12">
-                                            <strong>{{ registro.usuario_nombre }}</strong>
-                                        </div>
-                                        <div class="col-12">
-                                            Hora
-                                            <small>{{ registro.registro_fecha_supervisor.slice(11,19) }}</small>
-                                        </div>
-                                        <div class="col-12 mt-2">
-                                            <span class="badge" :class="`badge-${registro.estado_color}`">
-                                                <i :class="`${registro.estado_icon}`"></i>
-                                                <strong>{{ registro.nombre }}</strong>
-                                            </span>
-                                        </div>
-                                    </div>
-                                    <!-- comentario -->
-                                    <hr v-if="registro.comentario">
-                                    <div class="col-12 " @click="registros.mostrarComentario(registro.registro_id)"
-                                        v-if="registro.comentario" style="cursor: pointer;">
-                                        <strong class="badge badge-primary">Observaciones:</strong>
-                                        <small class="text-truncate">{{registro.comentario.slice(0,
-                                            25)}}{{registro.comentario.length > 10 ? '...' : ''}}</small>
-                                    </div>
-                                </div>
-
-                                <!-- No checó -->
-                                <div v-else>
-                                    <div class="col-12">
-                                        <span class="badge badge-danger"><i class="ing-cancelar"></i></span>
-                                    </div>
-                                    <div class="col-12 mt-2">
-                                        <strong>Sin registro</strong>
-                                    </div>
-                                </div>
-                            </td>
-                        </tr>
-                    </tbody>
-                </table>
-            </div>
-        </div>
-
-
-        <div class="modal" tabindex="-1" id="ver-comentario">
-            <div class="modal-dialog modal-dialog-centered modal-xl">
-                <div class="modal-content">
-                    <div class="modal-header">
-                        <h5 class="modal-title">Comentario</h5>
-                        <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
-                            <span aria-hidden="true">&times;</span>
-                        </button>
-                    </div>
-                    <div class="modal-body">
-                        <div class="container">
-                            <div class="input-group">
-                                <textarea class="form-control" aria-label="Comentarios de la clase" rows="5"
-                                    v-model="store.current.comentario" disabled></textarea>
-                            </div>
-                        </div>
-
-                    </div>
-                    <div class="modal-footer">
-                        <button type="button" class="btn btn-outline-primary" data-dismiss="modal">
-                            Aceptar
-                        </button>
-                    </div>
-                </div>
-            </div>
-        </div>
-        <div class="modal" tabindex="-1" id="ver-detalle">
-            <div class="modal-dialog modal-dialog-centered modal-xl" v-if="clase_vista">
-                <div class="modal-content">
-                    <div class="modal-header">
-                        <h2 class="modal-title" :data-id="clase_vista.horario_id">Detalle de la clase</h2>
-                        <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
-                            <span aria-hidden="true">&times;</span>
-                        </button>
-                    </div>
-                    <div class="modal-body">
-                        <div class="container">
-                            <div class="row">
-                                <section class="col-12 col-md-6">
-                                    <h4 class="h4">Profesor</h4>
-                                    <div class="row">
-                                        <div class="col-12">
-                                            <strong>Nombre:</strong>
-                                            {{ clase_vista.profesor_nombre }}
-                                        </div>
-                                        <div class="col-12">
-                                            <strong>Correo:</strong>
-                                            <a :href="`mailto:${clase_vista.profesor_correo}`"><strong>{{
-                                                    clase_vista.profesor_correo }}</strong></a>
-                                        </div>
-                                        <div class="col-12">
-                                            <strong>Clave:</strong>
-                                            {{ clase_vista.profesor_clave }}
-                                        </div>
-                                        <div class="col-12">
-                                            <strong>Facultad:</strong>
-                                            {{ clase_vista.facultad }}
-                                        </div>
-                                    </div>
-                                </section>
-                                <section class="col-12 col-md-6">
-                                    <h4 class="h4">Clase</h4>
-                                    <div class="row">
-                                        <div class="col-12">
-                                            <strong>Materia:</strong>
-                                            {{ clase_vista.materia }}
-                                        </div>
-                                        <div class="col-12">
-                                            <strong>Carrera:</strong>
-                                            {{ clase_vista.carrera }}
-                                        </div>
-                                        <div class="col-12">
-                                            <strong>Nivel:</strong>
-                                            {{ clase_vista.nivel}}
-                                        </div>
-                                        <div class="col-12">
-                                            <strong>Grupo:</strong>
-                                            {{ clase_vista.horario_grupo }}
-                                        </div>
-                                        <div class="col-12">
-                                            <strong>Horario:</strong>
-                                            <!-- hora hh:mm:ss to hh:mm -->
-                                            {{ clase_vista.horario_hora?.slice(0, 5) }} - {{
-                                            clase_vista.horario_fin?.slice(0, 5) }}
-                                        </div>
-                                        <div class="col-12">
-                                            <strong>Salón:</strong>
-                                            {{ clase_vista.salon }}
-                                        </div>
-                                    </div>
-                                </section>
-                            </div>
-                            <div class="row">
-                                <section class="col-12">
-                                    <h4 class="h4 mt-4">Registro</h4>
-                                    <div class="row">
-                                        <div class="col-12 text-center" v-if="!clase_vista.registro_fecha">
-                                            <strong><span class="badge badge-danger"><i class="ing-cancelar"></i></span>
-                                                El profesor aún no ha registrado su asistencia</strong>
-                                        </div>
-                                        <div class="col-6 text-center" v-else>
-                                            El profesor registró su asistencia a las
-                                            <code>{{clase_vista.registro_fecha.slice(11, 16)}}</code>
-                                            <hr>
-                                            <p v-if="!clase_vista.registro_retardo" class="text-center">
-                                                <span class="badge badge-success"><i class="ing-aceptar"></i></span>
-                                                A tiempo
-                                            </p>
-                                            <p v-else class="text-center">
-                                                <span class="badge badge-warning"><i class="ing-retardo"></i></span>
-                                                Con retardo
-                                            </p>
-                                        </div>
-                                    </div>
-                                </section>
-                            </div>
-                        </div>
-                    </div>
-                    <div class="modal-footer">
-                        <!-- botón aceptar -->
-                        <button type="button" class="btn btn-outline-primary" data-dismiss="modal">
-                            <i class="ing-aceptar"></i>
-                            Aceptar
-                        </button>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </main>
-    <script src="js/jquery.min.js"></script>
-    <script src="js/jquery-ui.js"></script>
-    <script src="js/bootstrap/bootstrap.min.js"></script>
-    <script src="js/datalist.js"></script>
-    <script src="js/datepicker-es.js"></script>
-    <script src="js/auditoría.js" type="module"></script>
-</body>
-
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Supervisor</title>
+    <?php
+    include 'import/html_css_files.php';
+    ?>
+    <style>
+        [v-cloak] {
+            display: none;
+        }
+    </style>
+</head>
+
+<body>
+    <?
+    $redirect = $_SERVER['PHP_SELF'];
+    include "import/html_header.php";
+    global $user;
+    html_header(
+        "Registro de asistencia - Vicerrectoría Académica",
+        "Sistema de gestión de checador",
+    );
+    ?>
+
+    <main class="container-fluid px-4 mt-4" id="app" v-cloak @vue:mounted="mounted">
+        <form action="">
+            <?php include "import/periodo.php" ?>
+            <div class="form-box">
+                <div class="form-group row">
+                    <label for="dlFacultad" class="col-4 col-form-label">Facultad</label>
+                    <div class="col-6">
+                        <div id="dlFacultad" class="datalist datalist-select mb-1 w-100">
+                            <div class="datalist-input">Selecciona una facultad</div>
+                            <span class="ing-buscar icono"></span>
+                            <ul style="display:none">
+                                <li class="datalist-option" data-id="0" @click="store.filters.facultad_id = null;">
+                                    Todas las facultades
+                                </li>
+                                <li class="datalist-option" v-for="facultad in store.facultades.data"
+                                    :key="facultad.facultad_id" :data-id="facultad.facultad_id"
+                                    @click="store.filters.facultad_id = facultad.facultad_id">
+                                    (<small> {{facultad.clave_dependencia}} </small>) {{ facultad.facultad_nombre }}
+                                </li>
+                            </ul>
+                            <input type="hidden" id="facultad_id" name="id">
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group row align-items-center">
+                    <label for="switchFecha" class="col-4 col-form-label">
+                        Fecha
+                        <!-- switch -->
+                        <div class="custom-control custom-switch">
+                            <input type="checkbox" class="custom-control-input" id="switchFecha"
+                                v-model="store.filters.switchFecha" @input="store.filters.switchFechas">
+                            <label class="custom-control-label" for="switchFecha"></label>
+                        </div>
+                    </label>
+                    <div class="col-3" v-if="store.filters.switchFecha">
+                        <div class="form-row">
+                            <input id="fecha_inicio" name="fecha_inicio" class="form-control date-picker"
+                                placeholder="Seleccione una fecha de inicio" readonly
+                                v-model="store.filters.fecha_inicio">
+                        </div>
+                    </div>
+                    <div class="col-3" v-if="store.filters.switchFecha">
+                        <div class="form-row">
+                            <input id="fecha_fin" name="fecha_fin" class="form-control date-picker"
+                                placeholder="Seleccione una fecha final" readonly v-model="store.filters.fecha_fin">
+                        </div>
+                    </div>
+
+                    <div class="col-6" v-if="!store.filters.switchFecha">
+                        <div class="form-row">
+                            <input id="fecha" name="fecha" class="form-control date-picker"
+                                placeholder="Seleccione una fecha" readonly v-model="store.filters.fecha">
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group row" v-if="store.bloques_horario.data.length > 0">
+                    <label for="dlBloqueHorarios" class="col-4 col-form-label">Bloque horarios</label>
+                    <div class="col-6">
+                        <div id="dlBloqueHorarios" class="datalist datalist-select mb-1 w-100">
+                            <div class="datalist-input">
+                                {{ store.bloques_horario.data.find(bloque => bloque.selected).hora_inicio.substr(0,5)
+                                }} -
+                                {{ store.bloques_horario.data.find(bloque => bloque.selected).hora_fin.substr(0,5) }}
+                            </div>
+                            <span class="ing-buscar icono"></span>
+                            <ul style="display:none">
+                                <li class="datalist-option not-selectable">
+                                    Mañana
+                                </li>
+
+                                <li class="datalist-option" :class="{selected: bloque.selected}"
+                                    v-for="bloque in store.bloques_horario.data.filter(bloque => bloque.hora_inicio < '13:00:00')"
+                                    :key="bloque.id" :data-id="bloque.id" @click="store.filters.bloque_horario = bloque.id">
+                                    {{ bloque.hora_inicio.substr(0,5) }} - {{ bloque.hora_fin.substr(0,5) }}
+                                </li>
+                                <li class="datalist-option not-selectable">
+                                    Tarde
+                                </li>
+                                <li class="datalist-option" :class="{selected: bloque.selected}"
+                                    v-for="bloque in store.bloques_horario.data.filter(bloque => bloque.hora_inicio >= '13:00:00')"
+                                    :key="bloque.id" :data-id="bloque.id" @click="store.filters.bloque_horario = bloque.id">
+                                    {{ bloque.hora_inicio.substr(0,5) }} - {{ bloque.hora_fin.substr(0,5) }}
+                                </li>
+
+                            </ul>
+                            <input type="hidden" id="bloque_id" name="id">
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group row">
+                    <label for="profesor" class="col-4 col-form-label">Profesor</label>
+                    <div class="col-6">
+                        <div class="form-row justify-content-around align-items-center">
+                            <input id="profesor" name="profesor" class="form-control col-11 mr-1 px-2"
+                                placeholder="Seleccione una profesor" list="dlProfesor"
+                                v-model="store.filters.profesor">
+                            <button type="button" class="btn btn-info btn-sm form-control col ml-auto"
+                                @click="store.filters.profesor = null">
+                                <i class="ing-borrar"></i>
+                            </button>
+                        </div>
+                        <datalist id="dlProfesor">
+                            <option v-for="profesor in profesores" :key="profesor.profesor_id"
+                                :value="`(${profesor.profesor_clave}) ${profesor.profesor_nombre}`">
+                        </datalist>
+                    </div>
+                </div>
+                <div class="form-group row">
+                    <label for="dlAsistencia" class="col-4 col-form-label">Asistencia</label>
+                    <div class="col-6">
+                        <div class="form-row justify-content-around align-items-center">
+                            <div id="dlAsitencia" class="datalist datalist-select mb-1 w-100">
+                                <div class="datalist-input" id="estados">Selecciona un estado de asistencia</div>
+                                <span class="ing-buscar icono"></span>
+                                <ul style="display:none">
+                                    <li class="datalist-option" data-id="0" @click="store.filters.estados = [];">
+                                        Todos los registros
+                                    </li>
+                                    <li class="datalist-option" v-for="estado in store.estados.data"
+                                        :key="estado.estado_supervisor_id" :data-id="estado.estado_supervisor_id"
+                                        @click="store.filters.estados = store.toggle(store.filters.estados, estado.estado_supervisor_id); ; setTimeout(store.estados.printEstados, 0);">
+                                        <span class="badge"
+                                            :class="`badge-${store.filters.estados.includes(estado.estado_supervisor_id) ? 'dark' : estado.estado_color}`"><i
+                                                :class="estado.estado_icon"></i> {{estado.nombre}}</span>
+                                    </li>
+                                </ul>
+                                <input type="hidden" id="estado_id" name="estado_id">
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+        </form>
+        <div class="mt-3 d-flex justify-content-center flex-wrap">
+            <!-- botón descargar -->
+
+            <div class="btn-group my-3" v-if="registros.relevant.length">
+                <button type="button" class="btn btn-info mr-3" @click="registros.descargar"
+                    :disabled="!registros.relevant.length">
+                    <i class="ing-descarga"></i>
+                    Descargar reporte
+                </button>
+            </div>
+
+            <!-- refresh -->
+            <div class="table-responsive">
+                <table class="table table-hover table-striped table-bordered table-sm">
+                    <thead class="thead-dark">
+                        <tr>
+                            <th scope="col" class="text-center align-middle px-2">
+                                <button @click="registros.invertir" class="btn btn-info mr-3"
+                                    v-if="registros.relevant.length > 1">
+                                    <i class="ing-cambiar ing-rotate-90"></i>
+                                </button>
+                                Fecha
+                            </th>
+                            <th scope="col" class="text-center align-middle px-2">Salón</th>
+                            <th scope="col" class="text-center align-middle px-2">Profesor</th>
+
+                            <th scope="col" class="text-center align-middle px-2">Horario</th>
+                            <th scope="col" class="text-center align-middle px-2">Registro</th>
+                            <th scope="col" class="text-center align-middle px-2">Supervisor</th>
+                        </tr>
+                    </thead>
+                    <tbody>
+                        <tr v-if="registros.relevant.length == 0">
+                            <td colspan="7" class="text-center">No hay clases en este horario</td>
+                        </tr>
+                        <tr v-for="registro in registros.relevant" :key="registro.registro_id">
+                            <td class="text-center align-middle px-2">{{ registro.registro_fecha_ideal }}
+                            </td>
+                            <td class="text-center align-middle px-2">{{ registro.salon }}</td>
+                            <td class="text-center align-middle px-2">
+                                <div class="col-12">
+                                    <strong>{{ registro.profesor_clave }}</strong>
+                                    {{ registro.profesor_nombre }}
+                                </div>
+                                <div class="col-12">
+                                    <button type="button" class="btn btn-outline-dark btn-sm"
+                                        @click="store.current.clase_vista = registro" data-toggle="modal"
+                                        data-target="#ver-detalle">
+                                        Ver detalle <i class="ing-ojo"></i>
+                                    </button>
+                                </div>
+                            </td>
+
+
+                            <td class="text-center align-middle px-2">{{ registro.horario_hora.slice(0,5) }} - {{
+                                registro.horario_fin.slice(0,5) }}</td>
+                            <!--  -->
+                            <td class="text-center align-middle px-2">
+                                <div v-if="registro.registro_fecha">
+                                    <div class="col-12">
+                                        Registro <small>{{ registro.registro_fecha.slice(11,16) }}</small>
+                                    </div>
+                                </div>
+                                <div v-else>
+                                    <strong>
+                                        <div class="col-12">
+                                            <span class="badge badge-danger"><i class="ing-cancelar"></i></span>
+                                        </div>
+                                        <div class="col-12 mt-2">
+                                            Sin registro
+                                        </div>
+                                    </strong>
+                                </div>
+                            </td>
+
+                            <!-- Sí checó supervisor -->
+                            <td class="text-center align-middle px-2">
+                                <div v-if="registro.registro_fecha_supervisor">
+                                    <div class="row">
+                                        <div class="col-12">
+                                            <strong>{{ registro.usuario_nombre }}</strong>
+                                        </div>
+                                        <div class="col-12">
+                                            Hora
+                                            <small>{{ registro.registro_fecha_supervisor.slice(11,19) }}</small>
+                                        </div>
+                                        <div class="col-12 mt-2">
+                                            <span class="badge" :class="`badge-${registro.estado_color}`">
+                                                <i :class="`${registro.estado_icon}`"></i>
+                                                <strong>{{ registro.nombre }}</strong>
+                                            </span>
+                                        </div>
+                                    </div>
+                                    <!-- comentario -->
+                                    <hr v-if="registro.comentario">
+                                    <div class="col-12 " @click="registros.mostrarComentario(registro.registro_id)"
+                                        v-if="registro.comentario" style="cursor: pointer;">
+                                        <strong class="badge badge-primary">Observaciones:</strong>
+                                        <small class="text-truncate">{{registro.comentario.slice(0,
+                                            25)}}{{registro.comentario.length > 10 ? '...' : ''}}</small>
+                                    </div>
+                                </div>
+
+                                <!-- No checó -->
+                                <div v-else>
+                                    <div class="col-12">
+                                        <span class="badge badge-danger"><i class="ing-cancelar"></i></span>
+                                    </div>
+                                    <div class="col-12 mt-2">
+                                        <strong>Sin registro</strong>
+                                    </div>
+                                </div>
+                            </td>
+                        </tr>
+                    </tbody>
+                </table>
+            </div>
+        </div>
+
+
+        <div class="modal" tabindex="-1" id="ver-comentario">
+            <div class="modal-dialog modal-dialog-centered modal-xl">
+                <div class="modal-content">
+                    <div class="modal-header">
+                        <h5 class="modal-title">Comentario</h5>
+                        <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
+                            <span aria-hidden="true">&times;</span>
+                        </button>
+                    </div>
+                    <div class="modal-body">
+                        <div class="container">
+                            <div class="input-group">
+                                <textarea class="form-control" aria-label="Comentarios de la clase" rows="5"
+                                    v-model="store.current.comentario" disabled></textarea>
+                            </div>
+                        </div>
+
+                    </div>
+                    <div class="modal-footer">
+                        <button type="button" class="btn btn-outline-primary" data-dismiss="modal">
+                            Aceptar
+                        </button>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="modal" tabindex="-1" id="ver-detalle">
+            <div class="modal-dialog modal-dialog-centered modal-xl" v-if="clase_vista">
+                <div class="modal-content">
+                    <div class="modal-header">
+                        <h2 class="modal-title" :data-id="clase_vista.horario_id">Detalle de la clase</h2>
+                        <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
+                            <span aria-hidden="true">&times;</span>
+                        </button>
+                    </div>
+                    <div class="modal-body">
+                        <div class="container">
+                            <div class="row">
+                                <section class="col-12 col-md-6">
+                                    <h4 class="h4">Profesor</h4>
+                                    <div class="row">
+                                        <div class="col-12">
+                                            <strong>Nombre:</strong>
+                                            {{ clase_vista.profesor_nombre }}
+                                        </div>
+                                        <div class="col-12">
+                                            <strong>Correo:</strong>
+                                            <a :href="`mailto:${clase_vista.profesor_correo}`"><strong>{{
+                                                    clase_vista.profesor_correo }}</strong></a>
+                                        </div>
+                                        <div class="col-12">
+                                            <strong>Clave:</strong>
+                                            {{ clase_vista.profesor_clave }}
+                                        </div>
+                                        <div class="col-12">
+                                            <strong>Facultad:</strong>
+                                            {{ clase_vista.facultad }}
+                                        </div>
+                                    </div>
+                                </section>
+                                <section class="col-12 col-md-6">
+                                    <h4 class="h4">Clase</h4>
+                                    <div class="row">
+                                        <div class="col-12">
+                                            <strong>Materia:</strong>
+                                            {{ clase_vista.materia }}
+                                        </div>
+                                        <div class="col-12">
+                                            <strong>Carrera:</strong>
+                                            {{ clase_vista.carrera }}
+                                        </div>
+                                        <div class="col-12">
+                                            <strong>Nivel:</strong>
+                                            {{ clase_vista.nivel}}
+                                        </div>
+                                        <div class="col-12">
+                                            <strong>Grupo:</strong>
+                                            {{ clase_vista.horario_grupo }}
+                                        </div>
+                                        <div class="col-12">
+                                            <strong>Horario:</strong>
+                                            <!-- hora hh:mm:ss to hh:mm -->
+                                            {{ clase_vista.horario_hora?.slice(0, 5) }} - {{
+                                            clase_vista.horario_fin?.slice(0, 5) }}
+                                        </div>
+                                        <div class="col-12">
+                                            <strong>Salón:</strong>
+                                            {{ clase_vista.salon }}
+                                        </div>
+                                    </div>
+                                </section>
+                            </div>
+                            <div class="row">
+                                <section class="col-12">
+                                    <h4 class="h4 mt-4">Registro</h4>
+                                    <div class="row">
+                                        <div class="col-12 text-center" v-if="!clase_vista.registro_fecha">
+                                            <strong><span class="badge badge-danger"><i class="ing-cancelar"></i></span>
+                                                El profesor aún no ha registrado su asistencia</strong>
+                                        </div>
+                                        <div class="col-6 text-center" v-else>
+                                            El profesor registró su asistencia a las
+                                            <code>{{clase_vista.registro_fecha.slice(11, 16)}}</code>
+                                            <hr>
+                                            <p v-if="!clase_vista.registro_retardo" class="text-center">
+                                                <span class="badge badge-success"><i class="ing-aceptar"></i></span>
+                                                A tiempo
+                                            </p>
+                                            <p v-else class="text-center">
+                                                <span class="badge badge-warning"><i class="ing-retardo"></i></span>
+                                                Con retardo
+                                            </p>
+                                        </div>
+                                    </div>
+                                </section>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="modal-footer">
+                        <!-- botón aceptar -->
+                        <button type="button" class="btn btn-outline-primary" data-dismiss="modal">
+                            <i class="ing-aceptar"></i>
+                            Aceptar
+                        </button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </main>
+    <script src="js/jquery.min.js"></script>
+    <script src="js/jquery-ui.js"></script>
+    <script src="js/bootstrap/bootstrap.min.js"></script>
+    <!-- <script src="js/datalist.js"></script> -->
+    <script src="js/datepicker-es.js"></script>
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.5/FileSaver.min.js"></script>
+
+    <script src="js/auditoría.js" type="module"></script>
+</body>
+
 </html>

+ 264 - 264
avisos.php

@@ -1,265 +1,265 @@
-<?php
-require_once 'class/c_login.php';
-require_once 'include/bd_pdo.php';
-include 'include/constantes.php';
-
-if(!isset($_SESSION['user'])){
-    header('Location: index.php');
-    exit;
-}
-else
-    $user = unserialize($_SESSION['user']);
-$user->access();
-if(!$user->admin && $user->acceso == 'n'){
-    header('Location: main.php?error=1');
-}else{
-    $user->print_to_log('Avisos');
-}
-$fac = $user->facultad['facultad_id'];
-if($user->admin){
-    $fac = null;
-}
-$limit = 20;
-if(isset($_POST['filter_fecha']) && $_POST['filter_fecha'] != ""){
-    $filter_fecha = $_POST['filter_fecha'];
-}
-else{
-    $filter_fecha = null;
-}
-if(isset($_GET['pag'])){
-    $pag = $_GET['pag'] - 1;
-}else{
-    $pag = 0;
-}
-if($user->admin){
-    $count = query("SELECT count(1) FROM fs_aviso(null, :fecha, :facultad_id, null, 0, null)", [':fecha' => $filter_fecha, ':facultad_id' => $fac], true);
-    $fs_avisos = query("SELECT * FROM fs_aviso(null, :fecha, :facultad_id, :limite, :offset, null)", [':fecha' => $filter_fecha, ':facultad_id' => $fac, ':limite' => $limit, ':offset' => $pag * $limit], false);
-}else{
-    $count = query("SELECT count(1) FROM fs_aviso(null, :fecha, :facultad_id, null, 0, true)", [':fecha' => $filter_fecha, ':facultad_id' => $fac], true);
-    $fs_avisos = query("SELECT * FROM fs_aviso(null, :fecha, :facultad_id, :limite, :offset, true)", [':fecha' => $filter_fecha, ':facultad_id' => $fac, ':limite' => $limit, ':offset' => $pag * $limit], false);
-}
-$paginas = ceil($count['count'] / $limit);
-?>
-<!DOCTYPE html>
-<html lang="en">
-
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>Avisos</title>
-    <link rel="stylesheet" href="css/jquery-ui.css">
-    <link rel="stylesheet" href="css/calendar.css">
-    <?php
-    include 'import/html_css_files.php';
-    ?>
-</head>
-
-<body>
-    <?php
-    include "import/html_header.php";
-    html_header(
-        "Avisos",
-        "Gestión de Checador "
-    );
-    $user->access();
-    ?>
-    <main class="content marco">
-        <?php if($user->acceso == 'w') {?>
-        <div class="row">
-            <div class="col-12 text-right">
-                <a href="avisos_crear.php">
-                    <button type="button" class="btn btn-outline-secondary"><span class="ing-mas ing-fw"></span>Crear Aviso</button>
-                </a>
-            </div>
-        </div>
-        <?php } ?>
-        <!-- Filtro -->
-        <div class="row">
-            <div class="col-12">
-                <form action="avisos.php" method="post">
-                    <div class="form-box">
-                        <div class="form-group row">
-                            <label for="filter_fecha" class="col-4 con-form-label">Fecha</label>
-                            <div class="col-8 col-sm-4">
-                                <input id="filter_fecha" name="filter_fecha" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly="" value="<?php if(isset($filter_fecha)){ echo $filter_fecha; } ?>">
-                            </div>
-                        </div>
-                        <p class="offset-4">Se muestran los avisos posteriores a la fecha</p>
-                    </div>
-                    <div class="form-group">
-                        <div class="col-12 text-center">
-                            <button type="submit" class="btn btn-outline-primary">
-                                <span class="ing-buscar ing-fw"></span>
-                                Filtrar
-                            </button>
-                            <button type="button" class="btn btn-outline-danger btn-reset">
-                                <span class="ing-borrar ing-fw"></span>
-                                Limpiar
-                            </button>
-                        </div>
-                    </div>
-                </form>
-            </div>
-        </div>
-        <div id="message"></div>
-        <!-- Tabla -->
-        <div class="row">
-            <div class="col-12 table-responsive">
-                <table class="table table-sm table-striped table-white">
-                    <thead class="thead-dark">
-                        <tr>
-                            <th>Estado</th>
-                            <?php if($user->acceso == 'w') {?>
-                                <th>Facultad</th>
-                                <?php }?>
-                                <th>Fechas</th>
-                                <th>Mensaje</th>
-                            <?php if($user->acceso == 'w') {?>
-                            <th>Acciones</th>
-                            <?php }?>
-                        </tr>
-                    </thead>
-                    <tbody>
-                        <?php $today = date('Y-m-j');
-                            foreach($fs_avisos as $aviso){
-                            $color2 = 'danger';
-                            $title2 = 'Inactivo';
-                            $color = 'danger';
-                            $title = 'Fuera de tiempo';
-                            $icono = 'retardo';
-                            if($today >= $aviso['aviso_fecha_inicial'] && $today <= $aviso['aviso_fecha_final']){
-                                $color = 'success';
-                                $title = 'En tiempo';
-                                $icono = 'reloj';
-                            }else if($today < $aviso['aviso_fecha_inicial']){
-                                $color = 'warning';
-                                $title = 'Antes de tiempo';
-                            }
-                            if($aviso['aviso_estado'] == true){
-                                $color2 = 'success';
-                                $title2 = 'Activo';
-                            }
-                            $day = explode("-", $aviso['aviso_fecha_inicial']);
-                            $dia_inicial = $day['2'].'/'.$day['1'].'/'.$day[0];
-                            $day = explode("-", $aviso['aviso_fecha_final']);
-                            $dia_final = $day['2'].'/'.$day['1'].'/'.$day[0];
-                            ?>
-                            <tr data-id="<?= $aviso['aviso_id'] ?>" id="<?= $aviso['aviso_id'] ?>">
-                                <td class="text-center"><?php if($user->admin){ ?> <span class="ing-bullet text-<?= $color2 ?>" title="<?= $title2 ?>"></span> <?php } ?> <span class="ing-<?= $icono ?> text-<?= $color ?>" title="<?= $title ?>"></span></td>
-                                <?php if($user->acceso == 'w') {?>
-                                    <td><?= $aviso['facultad_nombre'] ?></td>
-                                <?php }?>
-                                <td><?= $dia_inicial ?> - <?= $dia_final ?></td>
-                                <td><?= $aviso['aviso_texto'] ?></td>
-                                <?php if($user->acceso == 'w') {?>
-                                    <td class="text-center">
-                                        <a href="avisos_editar.php?id=<?= $aviso['aviso_id'] ?>" title="Editar"><span class="ing-editar"></span></a>
-                                        <?php if($aviso['aviso_estado'] == true){ ?>
-                                            <a href="#" data-toggle="modal" data-target="#modal_confirm" title="Borrar"><span class="ing-basura"></span></a>
-                                        <?php } ?>
-                                    </td>
-                                <?php }?>
-                            </tr>
-                        <?php } ?>
-                    </tbody>
-                </table>
-            </div>
-        </div>
-        <nav aria-label="paginas">
-            <ul class="pagination justify-content-end">
-                <?php if($pag != 0){ ?>
-                    <li class="page-item">
-                    <a class="page-link" href="avisos.php?pag=<?= $pag ?>" aria-label="Previous">
-                        <span aria-hidden="true">&laquo;</span>
-                    </a>
-                    </li>
-                <?php } ?>
-                <?php for($i = 0; $i < $paginas; $i++){ ?>
-                    <li class="page-item <?php if($i == $pag){ echo"active"; } ?>" <?php if($i == $pag){ echo 'aria-current="page"'; } ?>><a class="page-link" href="avisos.php?pag=<?= $i+1 ?>"><?= $i+1 ?></a></li>
-
-                <?php }
-                if(($pag + 1) < $paginas){ ?>
-                    <li class="page-item">
-                    <a class="page-link" href="avisos.php?pag=<?= $pag + 2 ?>" aria-label="Next">
-                        <span aria-hidden="true">&raquo;</span>
-                    </a>
-                    </li>
-                <?php } ?>
-            </ul>
-        </nav>
-    </main>
-    <?php
-    include "import/html_footer.php";
-    ?>
-
-    <?php if($user->acceso == 'w') {?>
-    <div class="modal fade" id="modal_confirm" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true">
-        <div class="modal-dialog modal-dialog-centered" role="document">
-            <div class="modal-content">
-                <div class="modal-body">
-                    <div class="row">
-                        <div class="col">
-                            <p class="font-weight-bold">¿Estás seguro de que quieres borrar el aviso?</p>
-                            <p>Esta acción no se puede deshacer.</p>
-                        </div>
-                    </div>
-                </div>
-                <div class="modal-footer">
-                    <input type="hidden" id="id_borrar" value="">
-                    <button type="button" class="btn btn-outline-primary btn-borrar"><?php echo $ICO["aceptar"];?> Borrar</button>
-                    <button type="button" class="btn btn-outline-danger" data-dismiss="modal" aria-label="Close"><?php echo $ICO["cancelar"];?> Cancelar</button>
-                </div>
-            </div>
-        </div>    
-    </div>
-    <?php } ?>
-
-    <script src="js/jquery.min.js"></script>
-    <script src="js/jquery-ui.js"></script>
-    <script src="js/bootstrap/bootstrap.min.js"></script>
-    <script src="js/datalist.js"></script>
-    <script src="js/datepicker-es.js"></script>
-    <?php
-        require_once 'js/messages.php';
-    ?>
-    <script>
-        var today = new Date();
-        $(".date-picker").datepicker($.datepicker.regional["es"]);
-        $(".date-picker").datepicker({
-            dateFormat: "dd/mm/yyyy",
-            changeMonth: true,
-        });
-
-        $(document).on( "click", ".btn-reset", function(event){
-            var forma = $(this).parents("form");
-            forma.find("input[type=text]").val("");
-            forma.find("select").prop("selectedIndex",0);
-            forma.submit();
-        });
-
-        $('#modal_confirm').on('show.bs.modal', function (event) {
-            var button = $(event.relatedTarget); // Button that triggered the modal
-            var id = button.parents("tr").data("id");
-            $("#id_borrar").val(id);
-        });
-
-        $('.btn-borrar').click(function(){
-            var cid = $('#id_borrar').val();
-            $.ajax({
-                url: './action/action_avisos_delete.php',
-                type: 'POST',
-                dataType: 'json',
-                data: {id: cid},
-                success: function(result){
-                    console.log("bien");
-                },
-                error: function(){
-                    console.log(cid);
-                }
-            });
-            $('#modal_confirm').modal("hide");
-            location.reload();
-        });
-    </script>
-</body>
+<?php
+require_once 'class/c_login.php';
+require_once 'include/bd_pdo.php';
+include 'include/constantes.php';
+
+if(!isset($_SESSION['user'])){
+    header('Location: index.php');
+    exit;
+}
+else
+    $user = unserialize($_SESSION['user']);
+$user->access();
+if(!$user->admin && $user->acceso == 'n'){
+    header('Location: main.php?error=1');
+}else{
+    $user->print_to_log('Avisos');
+}
+$fac = $user->facultad['facultad_id'];
+if($user->admin){
+    $fac = null;
+}
+$limit = 20;
+if(isset($_POST['filter_fecha']) && $_POST['filter_fecha'] != ""){
+    $filter_fecha = $_POST['filter_fecha'];
+}
+else{
+    $filter_fecha = null;
+}
+if(isset($_GET['pag'])){
+    $pag = $_GET['pag'] - 1;
+}else{
+    $pag = 0;
+}
+if($user->admin){
+    $count = query("SELECT count(1) FROM fs_aviso(null, :fecha, :facultad_id, null, 0, null)", [':fecha' => $filter_fecha, ':facultad_id' => $fac], true);
+    $fs_avisos = query("SELECT * FROM fs_aviso(null, :fecha, :facultad_id, :limite, :offset, null)", [':fecha' => $filter_fecha, ':facultad_id' => $fac, ':limite' => $limit, ':offset' => $pag * $limit], false);
+}else{
+    $count = query("SELECT count(1) FROM fs_aviso(null, :fecha, :facultad_id, null, 0, true)", [':fecha' => $filter_fecha, ':facultad_id' => $fac], true);
+    $fs_avisos = query("SELECT * FROM fs_aviso(null, :fecha, :facultad_id, :limite, :offset, true)", [':fecha' => $filter_fecha, ':facultad_id' => $fac, ':limite' => $limit, ':offset' => $pag * $limit], false);
+}
+$paginas = ceil($count['count'] / $limit);
+?>
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Avisos</title>
+    <link rel="stylesheet" href="css/jquery-ui.css">
+    <link rel="stylesheet" href="css/calendar.css">
+    <?php
+    include 'import/html_css_files.php';
+    ?>
+</head>
+
+<body>
+    <?php
+    include "import/html_header.php";
+    html_header(
+        "Avisos",
+        "Gestión de Checador "
+    );
+    $user->access();
+    ?>
+    <main class="content marco">
+        <?php if($user->acceso == 'w') {?>
+        <div class="row">
+            <div class="col-12 text-right">
+                <a href="avisos_crear.php">
+                    <button type="button" class="btn btn-outline-secondary"><span class="ing-mas ing-fw"></span>Crear Aviso</button>
+                </a>
+            </div>
+        </div>
+        <?php } ?>
+        <!-- Filtro -->
+        <div class="row">
+            <div class="col-12">
+                <form action="avisos.php" method="post">
+                    <div class="form-box">
+                        <div class="form-group row">
+                            <label for="filter_fecha" class="col-4 con-form-label">Fecha</label>
+                            <div class="col-8 col-sm-4">
+                                <input id="filter_fecha" name="filter_fecha" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly="" value="<?php if(isset($filter_fecha)){ echo $filter_fecha; } ?>">
+                            </div>
+                        </div>
+                        <p class="offset-4">Se muestran los avisos posteriores a la fecha</p>
+                    </div>
+                    <div class="form-group">
+                        <div class="col-12 text-center">
+                            <button type="submit" class="btn btn-outline-primary">
+                                <span class="ing-buscar ing-fw"></span>
+                                Filtrar
+                            </button>
+                            <button type="button" class="btn btn-outline-danger btn-reset">
+                                <span class="ing-borrar ing-fw"></span>
+                                Limpiar
+                            </button>
+                        </div>
+                    </div>
+                </form>
+            </div>
+        </div>
+        <div id="message"></div>
+        <!-- Tabla -->
+        <div class="row">
+            <div class="col-12 table-responsive">
+                <table class="table table-sm table-striped table-white">
+                    <thead class="thead-dark">
+                        <tr>
+                            <th>Estado</th>
+                            <?php if($user->acceso == 'w') {?>
+                                <th>Facultad</th>
+                                <?php }?>
+                                <th>Fechas</th>
+                                <th>Mensaje</th>
+                            <?php if($user->acceso == 'w') {?>
+                            <th>Acciones</th>
+                            <?php }?>
+                        </tr>
+                    </thead>
+                    <tbody>
+                        <?php $today = date('Y-m-j');
+                            foreach($fs_avisos as $aviso){
+                            $color2 = 'danger';
+                            $title2 = 'Inactivo';
+                            $color = 'danger';
+                            $title = 'Fuera de tiempo';
+                            $icono = 'retardo';
+                            if($today >= $aviso['aviso_fecha_inicial'] && $today <= $aviso['aviso_fecha_final']){
+                                $color = 'success';
+                                $title = 'En tiempo';
+                                $icono = 'reloj';
+                            }else if($today < $aviso['aviso_fecha_inicial']){
+                                $color = 'warning';
+                                $title = 'Antes de tiempo';
+                            }
+                            if($aviso['aviso_estado'] == true){
+                                $color2 = 'success';
+                                $title2 = 'Activo';
+                            }
+                            $day = explode("-", $aviso['aviso_fecha_inicial']);
+                            $dia_inicial = $day['2'].'/'.$day['1'].'/'.$day[0];
+                            $day = explode("-", $aviso['aviso_fecha_final']);
+                            $dia_final = $day['2'].'/'.$day['1'].'/'.$day[0];
+                            ?>
+                            <tr data-id="<?= $aviso['aviso_id'] ?>" id="<?= $aviso['aviso_id'] ?>">
+                                <td class="text-center"><?php if($user->admin){ ?> <span class="ing-bullet text-<?= $color2 ?>" title="<?= $title2 ?>"></span> <?php } ?> <span class="ing-<?= $icono ?> text-<?= $color ?>" title="<?= $title ?>"></span></td>
+                                <?php if($user->acceso == 'w') {?>
+                                    <td><?= $aviso['facultad_nombre'] ?></td>
+                                <?php }?>
+                                <td><?= $dia_inicial ?> - <?= $dia_final ?></td>
+                                <td><?= $aviso['aviso_texto'] ?></td>
+                                <?php if($user->acceso == 'w') {?>
+                                    <td class="text-center">
+                                        <a href="avisos_editar.php?id=<?= $aviso['aviso_id'] ?>" title="Editar"><span class="ing-editar"></span></a>
+                                        <?php if($aviso['aviso_estado'] == true){ ?>
+                                            <a href="#" data-toggle="modal" data-target="#modal_confirm" title="Borrar"><span class="ing-basura"></span></a>
+                                        <?php } ?>
+                                    </td>
+                                <?php }?>
+                            </tr>
+                        <?php } ?>
+                    </tbody>
+                </table>
+            </div>
+        </div>
+        <nav aria-label="paginas">
+            <ul class="pagination justify-content-end">
+                <?php if($pag != 0){ ?>
+                    <li class="page-item">
+                    <a class="page-link" href="avisos.php?pag=<?= $pag ?>" aria-label="Previous">
+                        <span aria-hidden="true">&laquo;</span>
+                    </a>
+                    </li>
+                <?php } ?>
+                <?php for($i = 0; $i < $paginas; $i++){ ?>
+                    <li class="page-item <?php if($i == $pag){ echo"active"; } ?>" <?php if($i == $pag){ echo 'aria-current="page"'; } ?>><a class="page-link" href="avisos.php?pag=<?= $i+1 ?>"><?= $i+1 ?></a></li>
+
+                <?php }
+                if(($pag + 1) < $paginas){ ?>
+                    <li class="page-item">
+                    <a class="page-link" href="avisos.php?pag=<?= $pag + 2 ?>" aria-label="Next">
+                        <span aria-hidden="true">&raquo;</span>
+                    </a>
+                    </li>
+                <?php } ?>
+            </ul>
+        </nav>
+    </main>
+    <?php
+    include "import/html_footer.php";
+    ?>
+
+    <?php if($user->acceso == 'w') {?>
+    <div class="modal fade" id="modal_confirm" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true">
+        <div class="modal-dialog modal-dialog-centered" role="document">
+            <div class="modal-content">
+                <div class="modal-body">
+                    <div class="row">
+                        <div class="col">
+                            <p class="font-weight-bold">¿Estás seguro de que quieres borrar el aviso?</p>
+                            <p>Esta acción no se puede deshacer.</p>
+                        </div>
+                    </div>
+                </div>
+                <div class="modal-footer">
+                    <input type="hidden" id="id_borrar" value="">
+                    <button type="button" class="btn btn-outline-primary btn-borrar"><?php echo $ICO["aceptar"];?> Borrar</button>
+                    <button type="button" class="btn btn-outline-danger" data-dismiss="modal" aria-label="Close"><?php echo $ICO["cancelar"];?> Cancelar</button>
+                </div>
+            </div>
+        </div>    
+    </div>
+    <?php } ?>
+
+    <script src="js/jquery.min.js"></script>
+    <script src="js/jquery-ui.js"></script>
+    <script src="js/bootstrap/bootstrap.min.js"></script>
+    <script src="js/datalist.js"></script>
+    <script src="js/datepicker-es.js"></script>
+    <?php
+        require_once 'js/messages.php';
+    ?>
+    <script>
+        var today = new Date();
+        $(".date-picker").datepicker($.datepicker.regional["es"]);
+        $(".date-picker").datepicker({
+            dateFormat: "dd/mm/yyyy",
+            changeMonth: true,
+        });
+
+        $(document).on( "click", ".btn-reset", function(event){
+            var forma = $(this).parents("form");
+            forma.find("input[type=text]").val("");
+            forma.find("select").prop("selectedIndex",0);
+            forma.submit();
+        });
+
+        $('#modal_confirm').on('show.bs.modal', function (event) {
+            var button = $(event.relatedTarget); // Button that triggered the modal
+            var id = button.parents("tr").data("id");
+            $("#id_borrar").val(id);
+        });
+
+        $('.btn-borrar').click(function(){
+            var cid = $('#id_borrar').val();
+            $.ajax({
+                url: './action/action_avisos_delete.php',
+                type: 'POST',
+                dataType: 'json',
+                data: {id: cid},
+                success: function(result){
+                    console.log("bien");
+                },
+                error: function(){
+                    console.log(cid);
+                }
+            });
+            $('#modal_confirm').modal("hide");
+            location.reload();
+        });
+    </script>
+</body>
 </html>

+ 434 - 434
avisos_crear.php

@@ -1,435 +1,435 @@
-<?php
-require_once 'class/c_login.php';
-require_once 'include/bd_pdo.php';
-
-if(!isset($_SESSION['user'])){
-    header('Location: index.php');
-    exit;
-}
-else
-    $user = unserialize($_SESSION['user']);
-$user->access('Avisos');
-if(!$user->admin && $user->acceso == 'n'){
-    header('Location: main.php?error=1');
-}else{
-    $user->print_to_log('Avisos Crear');
-}
-$fac = $user->facultad['facultad_id'];
-if($user->admin){
-    $fac = null;
-}
-$fs_carreras = query('SELECT * FROM fs_carreras(:fac, null, null)', [':fac' => $fac], false);
-$fs_facultades = query('SELECT * FROM facultad WHERE facultad_activa = true', null, false);
-?>
-<!DOCTYPE html>
-<html lang="en">
-
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>Avisos Crear</title>
-    <link rel="stylesheet" href="css/jquery-ui.css">
-    <link rel="stylesheet" href="css/calendar.css">
-    <link rel="stylesheet" href="css/richtext.css" type="text/css">
-    <link rel="stylesheet" href="css/fa_all.css" type="text/css">
-    <?php
-    include 'import/html_css_files.php';
-    ?>
-</head>
-
-<body>
-    <?php
-    include "import/html_header.php";
-    html_header(
-        "CREAR AVISO",
-        "Gestión de Checador "
-    );
-    $user->access('Avisos');
-    ?>
-    <main class="content marco">
-        <div class="row">
-            <div class="col-12">
-                <form action="./action/action_avisos_insert.php" method="post" id="formaModal" onsubmit="return validaCampos()">
-                    <div class="form-box">
-                        <?php if($user->admin){ ?>
-                            <div class="form-group row">
-                                <label for="facultad" class="col-4 col-form-label">Facultad *</label>
-                                <div class="col-8 col-sm-4">
-                                    <div class="datalist datalist-select mb-1 w-100">
-                                        <div class="datalist-input">Mostrar todas</div>
-                                        <span class="ing-buscar icono"></span>
-                                        <ul style="display: none;">
-                                            <?php foreach($fs_facultades as $facultad){ ?>
-                                            <li data-id="<?= $facultad['facultad_id'] ?>" class="pl-4"><?= $facultad['facultad_nombre'] ?></li>
-                                            <?php } ?>
-                                        </ul>
-                                        <input type="hidden" id="facultad" name="facultad" value="">
-                                    </div>
-                                </div>
-                            </div>
-                        <?php }else {?>
-                            <input type="hidden" name="facultad" id="facultad" value="<?= $fac ?>">
-                        <?php }?>
-                        <div class="form-group row">
-                            <label for="fecha_inicial" class="col-4 col-form-label">Fecha inicial *</label>
-                            <div class="col-8 col-sm-4">
-                                <input id="fecha_inicial" name="fecha_inicial" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly="readonly">
-                                <div class="invalid-feedback">No es una fecha valida</div>
-                            </div>
-                        </div>
-                        <div class="form-group row">
-                            <label for="fecha_final" class="col-4 col-form-label">Fecha Final *</label>
-                            <div class="col-8 col-sm-4">
-                                <input id="fecha_final" name="fecha_final" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly="readonly">
-                                <div class="invalid-feedback">No es una fecha valida</div>
-                            </div>
-                        </div>
-                        <div class="form-group row">
-                            <label for="texto" class="col-4 col-form-label">Aviso *</label>
-                            <div class="col-8">
-                                <textarea name="texto" id="texto" class="richtext" rows="10"></textarea>
-                                <div class="invalid-feedback">No puede estar vacio</div>
-                            </div>
-                        </div>
-                        <div class="form-group row tipo_aviso">
-                            <label class="col-4 col-form-label">Enviar aviso:</label>
-                            <div class="col-4 pt-2">
-                                <div class="custom-control custom-switch">
-                                    <input type="checkbox" class="custom-control-input tipo-switch" name="bloque_tipo" id="bloque_tipo" value="1" data-box="profesorBox" data-select="tipo_box">
-                                    <label class="custom-control-label" for="bloque_tipo">Por carrera</label>
-                                </div>
-                            </div>
-                            <div class="col-4 pt-2">
-                                <div class="custom-control custom-switch">
-                                    <input type="checkbox" class="custom-control-input tipo-switch"  name="bloque_usr" id="bloque_usr" value="1" data-box="administrativoBox" data-select="usuario_box">
-                                    <label class="custom-control-label" for="bloque_usr">Por nombre</label>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="invalid-feedback offset-4">No hay profesores para mandar el aviso</div>
-                        <div class="collapse" id="profesorBox">
-                            <h3>Carreras</h3>
-                            <p>Utiliza el botón para asignar las carreras que recibirán el aviso.</p>
-                            <div class="form-group row">
-                                <div class="col-10">
-                                    <select name="tipo[]" id="tipo_box" class="form-control" multiple="multiple" size="5">
-                                    </select>
-                                </div>
-                                <div class="col-2">
-                                    <p><button type="button" class="btn btn-outline-primary"  data-toggle="modal" data-target="#modal_carrera"><span class="ing-mas ing-fw"></span> Asignar</button></p>
-                                    <p><button type="button" class="btn btn-outline-danger btn-quita-tipo"><span class="ing-menos ing-fw"></span> Quitar</button></p>
-                                </div>
-                            </div>
-                        </div>
-                        
-                        <div class="collapse" id="administrativoBox">
-                            <h3>Nombre de profesores</h3>
-                            <p>Utiliza el botón para asignar los profesores que recibirán el aviso.</p>
-                            <div class="form-group row">
-                                <div class="col-10">
-                                    <select name="usuario[]" id="usuario_box" class="form-control" multiple="multiple" size="5">
-                                    </select>
-                                    </div>
-                                    <div class="col-2">
-                                        <p><button type="button" class="btn btn-outline-primary"  data-toggle="modal" data-target="#modal_usr"><span class="ing-mas ing-fw"></span> Asignar</button></p>
-                                        <p><button type="button" class="btn btn-outline-danger btn-quita-usr"><span class="ing-menos ing-fw"></span> Quitar</button></p>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="form-group row mt-2">
-                            <div class="col-12 text-center">
-                                <button type="submit" class="btn btn-outline-primary" id="submitBtn" data-tipo="1"><span class="ing-aceptar"></span> Guardar</button>
-                                <a href="avisos.php" class="btn btn-outline-danger"><span class="ing-cancelar"></span> Cancelar</a>
-                            </div>
-                        </div>
-                    </form>
-                </div>
-            </div>
-        </main>
-        <!-- Footer -->
-    <?php
-    include "import/html_footer.php";
-    ?>
-
-    <!-- Modal -->
-    <div class="modal fade" id="modal_carrera" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true" data-backdrop="static" data-keyboard="false">
-        <div class="modal-dialog modal-dialog-centered" role="document">
-            <div class="modal-content">
-                <div class="modal-header">
-                    <h4 class="col-12 modal-title text-center">Carreras
-                        <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
-                            <span aria-hidden="true">&times;</span>
-                        </button>
-                    </h4>
-                </div>
-                <div class="modal-body">
-                    <div style="max-height:400px; overflow-y:auto; overflow-x:hidden;">
-                        <table class="table table-sm table-striped table-white">
-                            <thead class="thead-dark">
-                                <tr>
-                                    <th>Carrera</th>
-                                    <th>Asignar</th>
-                                </tr>
-                            </thead>
-                            <tbody id="table-result-carrera">
-                                <tr class="tipo-row">
-                                    <td class="carrera-nombre"></td>
-                                    <td class="carrera-agrega text-center"><button type="button" class="btn btn-outline-primary btn-sm invisible btn-agrega-carrera"><span class="ing-mas"></span></button></td>
-                                </tr>    
-                            </tbody>
-                        </table>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </div>
-
-    <div class="modal fade" id="modal_usr" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true" data-backdrop="static" data-keyboard="false">
-        <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
-            <div class="modal-content">
-                <div class="modal-header">
-                    <h4 class="col-12 modal-title text-center">Busca Usuarios
-                        <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
-                            <span aria-hidden="true">&times;</span>
-                        </button>
-                    </h4>
-                </div>
-                <div class="modal-body">
-                    <form id="forma_buscar-usr" onsubmit="return false">
-                        <div class="form-box">
-                            <div class="form-group row">
-                                <label for="filter_desc" class="col-4 col-form-label">Nombre</label>
-                                <div class="col-8">
-                                    <input id="filter_desc" name="desc" type="text" class="form-control">
-                                </div>
-                            </div>
-                            <div class="form-group row">
-                                <label for="filter_clave" class="col-4 col-form-label">Clave ULSA</label>
-                                <div class="col-8">
-                                    <input id="filter_clave" name="clave" type="text" class="form-control">
-                                </div>
-                            </div>
-                        </div>
-                        <div class="for-group row">
-                            <div class="offset-4">
-                                <button type="submit" class="btn btn-outline-primary" id="btn-busca-usr"><span class="ing-buscar"></span> Buscar</button>
-                                <button type="button" class="btn btn-outline-danger" data-dismiss="modal" aria-label="Close"><span class="ing-cancelar"></span> Cerrar</button>
-                            </div>
-                        </div>
-                    </form>
-                    <div style="max-height:400px; overflow-y:auto; overflow-x:hidden;">
-                        <table class="table table-sm table-striped table-white mt-3">
-                            <thead class="thead-dark">
-                                <tr>
-                                    <th>Usuario</th>
-                                    <th style="width: 20%;">Asignar</th>
-                                </tr>
-                            </thead>
-                            <tbody id="table-result-usr">
-                                <tr class="usr-row">
-                                    <td class="usr-nombre"></td>
-                                    <td class="usr-agrega text-center"><button type="button" class="btn btn-outline-primary btn-sm invisible btn-agrega-usr"><span class="ing-mas"></span></button></td>
-                                </tr>
-                            </tbody>
-                        </table>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </div>
-
-    <script src="js/jquery.min.js"></script>
-    <script src="js/jquery-ui.js"></script>
-    <script src="js/bootstrap/bootstrap.min.js"></script>
-    <script src="js/datalist.js"></script>
-    <script src="js/datepicker-es.js"></script>
-    <script src="./js/richtext.js"></script>
-    <?php
-        require_once 'js/messages.php';
-    ?>
-    <script>
-        var today = new Date();
-        $(".date-picker").datepicker($.datepicker.regional["es"]);
-        $(".date-picker").datepicker({
-            dateFormat: "dd/mm/yyyy",
-            changeMonth: true,
-        });
-        $(document).ready(function(){
-            $('.richtext').richText();
-            //var today = new Date();
-            $("#fecha_inicial").datepicker("option", "minDate", today);
-            $("#fecha_final").datepicker("option", "minDate", today);
-            $('#fecha_inicial').datepicker("setDate", today);
-            $('#fecha_final').datepicker("setDate", today);
-            setDatalistFirst('#facultad');
-        });
-
-        $(document).on( "change", ".tipo-switch", function(event){
-            if($(this).data("box") !== undefined){
-                if($(this).prop('checked')){
-                    $('#'+$(this).data("box")).collapse('show');
-                }else{
-                    $('#'+$(this).data("box")).collapse('hide');
-                }
-            }
-            $('#bloque_tipo').removeClass("is-invalid");
-            $('#bloque_usr').removeClass("is-invalid");
-        });
-
-        $(document).on( "click", ".btn-agrega-carrera", function(event){
-            var id = $(this).data("id");
-            var text = $(this).data("text");
-            if($('#tipo_box option[value="' + id + '"]').length == 0){
-                $("#tipo_box").append($("<option></option>").attr("value",id).text(text));
-            }
-            $(this).parents("tr").addClass("d-none");
-        });
-
-        $(document).on( "click", ".btn-quita-tipo", function(event){
-            var id = $("#tipo_box option:selected").val();
-            $("#arow_"+id).removeClass("d-none");
-            $("#tipo_box option:selected").remove();
-        });
-
-        $(document).on( "click", ".modal-open", function(event){
-            $(".area-row").removeClass("d-none");
-            $('#area > option').each(function() {
-                $("#row_"+$(this).val()).addClass("d-none");
-            });
-            $('#modal').modal("show");
-        });
-
-        $(document).on('click', '#btn-busca-usr', function(event){
-            var nombre = $('#filter_desc').val();
-            var clave = $('#filter_clave').val();
-            var fac = $('#facultad').val();
-            $('#table-result-usr').show();
-            $.ajax({
-                url: 'action/usuario_find.php',
-                type: 'POST',
-                dataType: 'json',
-                data: {nombre: nombre, clave: clave, facultad: fac},
-                success: function(result){
-                    console.log(result.length);
-                    $("#table-result-usr").find(".usr-nombre").html("");
-                    $("#table-result-usr").find(".usr-agrega button").addClass("invisible");
-                    var rows = $("#table-result-usr > tr").length;//limpia tabla actual
-                    if(rows > result.length){
-                        while(rows > result.length && rows > 1){
-                            $("#table-result-usr .usr-row:last-child").remove();
-                            rows--;
-                        }
-                    }else{
-                        for(var i=rows; i<result.length; i++){
-                            $("#table-result-usr .usr-row:first-child").clone(true).appendTo("#table-result-usr");
-                        }
-                    }
-                    if(result.length != 0){
-                        $('#table-result-usr').children().each(function(index){
-                            if(index < result.length){
-                                $(this).find('.usr-nombre').html(result[index]['profesor_nombre']);
-                                $(this).find('.usr-agrega button').data("id", result[index]['profesor_id']);
-                                $(this).find('.usr-agrega button').data("text", result[index]['profesor_nombre']);
-                                $(this).find(".usr-agrega button").removeClass("invisible");
-                            }
-                        })
-                    }
-                },
-                error: function(){
-                    console.log('error');
-                }
-            });
-        });
-
-        $(document).on( "click", ".btn-agrega-usr", function(event){
-            var id = $(this).data("id");
-            var text = $(this).data("text");
-            var rows = $("#table-result-usr > tr").length;//limpia tabla actual
-
-            if($('#usuario_box option[value="' + id + '"]').length == 0){
-                $("#usuario_box").append($("<option></option>").attr("value",id).text(text));
-            }
-            if(rows > 1)
-                $(this).parents("tr").remove();
-            else{
-                $(this).parents("tr").hide();
-                $("#filter_desc-usr").val("");
-            }
-        });
-
-        $(document).on( "click", ".btn-quita-usr", function(event){
-            $("#usuario_box option:selected").remove();
-        });
-
-        function validaCampos(){
-            var error = false;
-            var inicio = $('#fecha_inicial').val();
-            var fin = $('#fecha_final').val();
-            var aux = inicio.split('/');
-            inicio = aux[2]+'-'+aux[1]+'-'+aux[0];
-            aux = fin.split('/');
-            fin = aux[2]+'-'+aux[1]+'-'+aux[0];
-            if(fin < inicio){
-                $('#fecha_final').addClass('is-invalid');
-                error = true;
-            }
-            if($('#texto').val() == ""){
-                $('#texto').addClass('is-invalid');
-                error = true;
-            }
-            if($('select').find('option').length == 0){
-                error = true;
-                $('.tipo_aviso').addClass('is-invalid');
-            }else{
-                $('.tipo_aviso').removeClass('is-invalid');
-            }
-            if(error == true){
-                return false;
-            }else{
-                $('#tipo_box option').prop('selected', true);
-                $('#usuario_box option').prop('selected', true);
-                $('#formaModal').prop('action', './action/action_avisos_insert.php');
-            }
-        }
-
-        $('#modal_carrera').on('show.bs.modal', function(event){
-            var fac_id = $('#facultad').val();
-            $.ajax({
-                url: 'action/carrera_find.php',
-                type: 'POST',
-                dataType: 'json',
-                data: {fac_id: fac_id},
-                success: function(result){
-                    $("#table-result-carrera").find(".carrera-nombre").html("");
-                    $("#table-result-carrera").find(".carrera-agrega button").addClass("invisible");
-                    var rows = $("#table-result-carrera > tr").length;
-                    if(rows > result.length){
-                        while(rows > result.length && rows > 1){
-                            $("#table-result-carrera .tipo-row:last-child").remove();
-                            rows--;
-                        }
-                    }else{
-                        for(var i=rows; i<result.length; i++){
-                            $("#table-result-carrera .tipo-row:first-child").clone(true).appendTo("#table-result-carrera");
-                        }
-                    }
-                    if(result.length != 0){
-                        $("#table-result-carrera").children().each(function(index){
-                            if(index < result.length){
-                                $(this).find('.carrera-nombre').html(result[index]['carrera_nombre']);
-                                $(this).find('.carrera-agrega button').data("id", result[index]['carrera_id']);
-                                $(this).find('.carrera-agrega button').data("text", result[index]['carrera_nombre']);
-                                $(this).find(".carrera-agrega button").removeClass("invisible");
-                            }
-                        })
-                    }
-                },
-                error: function(){
-                    console.log("Error");
-                }
-            });
-        })
-    </script>
-</body>
+<?php
+require_once 'class/c_login.php';
+require_once 'include/bd_pdo.php';
+
+if(!isset($_SESSION['user'])){
+    header('Location: index.php');
+    exit;
+}
+else
+    $user = unserialize($_SESSION['user']);
+$user->access('Avisos');
+if(!$user->admin && $user->acceso == 'n'){
+    header('Location: main.php?error=1');
+}else{
+    $user->print_to_log('Avisos Crear');
+}
+$fac = $user->facultad['facultad_id'];
+if($user->admin){
+    $fac = null;
+}
+$fs_carreras = query('SELECT * FROM fs_carreras(:fac, null, null)', [':fac' => $fac], false);
+$fs_facultades = query('SELECT * FROM facultad WHERE facultad_activa = true', null, false);
+?>
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Avisos Crear</title>
+    <link rel="stylesheet" href="css/jquery-ui.css">
+    <link rel="stylesheet" href="css/calendar.css">
+    <link rel="stylesheet" href="css/richtext.css" type="text/css">
+    <link rel="stylesheet" href="css/fa_all.css" type="text/css">
+    <?php
+    include 'import/html_css_files.php';
+    ?>
+</head>
+
+<body>
+    <?php
+    include "import/html_header.php";
+    html_header(
+        "CREAR AVISO",
+        "Gestión de Checador "
+    );
+    $user->access('Avisos');
+    ?>
+    <main class="content marco">
+        <div class="row">
+            <div class="col-12">
+                <form action="./action/action_avisos_insert.php" method="post" id="formaModal" onsubmit="return validaCampos()">
+                    <div class="form-box">
+                        <?php if($user->admin){ ?>
+                            <div class="form-group row">
+                                <label for="facultad" class="col-4 col-form-label">Facultad *</label>
+                                <div class="col-8 col-sm-4">
+                                    <div class="datalist datalist-select mb-1 w-100">
+                                        <div class="datalist-input">Mostrar todas</div>
+                                        <span class="ing-buscar icono"></span>
+                                        <ul style="display: none;">
+                                            <?php foreach($fs_facultades as $facultad){ ?>
+                                            <li data-id="<?= $facultad['facultad_id'] ?>" class="pl-4"><?= $facultad['facultad_nombre'] ?></li>
+                                            <?php } ?>
+                                        </ul>
+                                        <input type="hidden" id="facultad" name="facultad" value="">
+                                    </div>
+                                </div>
+                            </div>
+                        <?php }else {?>
+                            <input type="hidden" name="facultad" id="facultad" value="<?= $fac ?>">
+                        <?php }?>
+                        <div class="form-group row">
+                            <label for="fecha_inicial" class="col-4 col-form-label">Fecha inicial *</label>
+                            <div class="col-8 col-sm-4">
+                                <input id="fecha_inicial" name="fecha_inicial" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly="readonly">
+                                <div class="invalid-feedback">No es una fecha valida</div>
+                            </div>
+                        </div>
+                        <div class="form-group row">
+                            <label for="fecha_final" class="col-4 col-form-label">Fecha Final *</label>
+                            <div class="col-8 col-sm-4">
+                                <input id="fecha_final" name="fecha_final" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly="readonly">
+                                <div class="invalid-feedback">No es una fecha valida</div>
+                            </div>
+                        </div>
+                        <div class="form-group row">
+                            <label for="texto" class="col-4 col-form-label">Aviso *</label>
+                            <div class="col-8">
+                                <textarea name="texto" id="texto" class="richtext" rows="10"></textarea>
+                                <div class="invalid-feedback">No puede estar vacio</div>
+                            </div>
+                        </div>
+                        <div class="form-group row tipo_aviso">
+                            <label class="col-4 col-form-label">Enviar aviso:</label>
+                            <div class="col-4 pt-2">
+                                <div class="custom-control custom-switch">
+                                    <input type="checkbox" class="custom-control-input tipo-switch" name="bloque_tipo" id="bloque_tipo" value="1" data-box="profesorBox" data-select="tipo_box">
+                                    <label class="custom-control-label" for="bloque_tipo">Por carrera</label>
+                                </div>
+                            </div>
+                            <div class="col-4 pt-2">
+                                <div class="custom-control custom-switch">
+                                    <input type="checkbox" class="custom-control-input tipo-switch"  name="bloque_usr" id="bloque_usr" value="1" data-box="administrativoBox" data-select="usuario_box">
+                                    <label class="custom-control-label" for="bloque_usr">Por nombre</label>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="invalid-feedback offset-4">No hay profesores para mandar el aviso</div>
+                        <div class="collapse" id="profesorBox">
+                            <h3>Carreras</h3>
+                            <p>Utiliza el botón para asignar las carreras que recibirán el aviso.</p>
+                            <div class="form-group row">
+                                <div class="col-10">
+                                    <select name="tipo[]" id="tipo_box" class="form-control" multiple="multiple" size="5">
+                                    </select>
+                                </div>
+                                <div class="col-2">
+                                    <p><button type="button" class="btn btn-outline-primary"  data-toggle="modal" data-target="#modal_carrera"><span class="ing-mas ing-fw"></span> Asignar</button></p>
+                                    <p><button type="button" class="btn btn-outline-danger btn-quita-tipo"><span class="ing-menos ing-fw"></span> Quitar</button></p>
+                                </div>
+                            </div>
+                        </div>
+                        
+                        <div class="collapse" id="administrativoBox">
+                            <h3>Nombre de profesores</h3>
+                            <p>Utiliza el botón para asignar los profesores que recibirán el aviso.</p>
+                            <div class="form-group row">
+                                <div class="col-10">
+                                    <select name="usuario[]" id="usuario_box" class="form-control" multiple="multiple" size="5">
+                                    </select>
+                                    </div>
+                                    <div class="col-2">
+                                        <p><button type="button" class="btn btn-outline-primary"  data-toggle="modal" data-target="#modal_usr"><span class="ing-mas ing-fw"></span> Asignar</button></p>
+                                        <p><button type="button" class="btn btn-outline-danger btn-quita-usr"><span class="ing-menos ing-fw"></span> Quitar</button></p>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="form-group row mt-2">
+                            <div class="col-12 text-center">
+                                <button type="submit" class="btn btn-outline-primary" id="submitBtn" data-tipo="1"><span class="ing-aceptar"></span> Guardar</button>
+                                <a href="avisos.php" class="btn btn-outline-danger"><span class="ing-cancelar"></span> Cancelar</a>
+                            </div>
+                        </div>
+                    </form>
+                </div>
+            </div>
+        </main>
+        <!-- Footer -->
+    <?php
+    include "import/html_footer.php";
+    ?>
+
+    <!-- Modal -->
+    <div class="modal fade" id="modal_carrera" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true" data-backdrop="static" data-keyboard="false">
+        <div class="modal-dialog modal-dialog-centered" role="document">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <h4 class="col-12 modal-title text-center">Carreras
+                        <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
+                            <span aria-hidden="true">&times;</span>
+                        </button>
+                    </h4>
+                </div>
+                <div class="modal-body">
+                    <div style="max-height:400px; overflow-y:auto; overflow-x:hidden;">
+                        <table class="table table-sm table-striped table-white">
+                            <thead class="thead-dark">
+                                <tr>
+                                    <th>Carrera</th>
+                                    <th>Asignar</th>
+                                </tr>
+                            </thead>
+                            <tbody id="table-result-carrera">
+                                <tr class="tipo-row">
+                                    <td class="carrera-nombre"></td>
+                                    <td class="carrera-agrega text-center"><button type="button" class="btn btn-outline-primary btn-sm invisible btn-agrega-carrera"><span class="ing-mas"></span></button></td>
+                                </tr>    
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <div class="modal fade" id="modal_usr" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true" data-backdrop="static" data-keyboard="false">
+        <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <h4 class="col-12 modal-title text-center">Busca Usuarios
+                        <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
+                            <span aria-hidden="true">&times;</span>
+                        </button>
+                    </h4>
+                </div>
+                <div class="modal-body">
+                    <form id="forma_buscar-usr" onsubmit="return false">
+                        <div class="form-box">
+                            <div class="form-group row">
+                                <label for="filter_desc" class="col-4 col-form-label">Nombre</label>
+                                <div class="col-8">
+                                    <input id="filter_desc" name="desc" type="text" class="form-control">
+                                </div>
+                            </div>
+                            <div class="form-group row">
+                                <label for="filter_clave" class="col-4 col-form-label">Clave ULSA</label>
+                                <div class="col-8">
+                                    <input id="filter_clave" name="clave" type="text" class="form-control">
+                                </div>
+                            </div>
+                        </div>
+                        <div class="for-group row">
+                            <div class="offset-4">
+                                <button type="submit" class="btn btn-outline-primary" id="btn-busca-usr"><span class="ing-buscar"></span> Buscar</button>
+                                <button type="button" class="btn btn-outline-danger" data-dismiss="modal" aria-label="Close"><span class="ing-cancelar"></span> Cerrar</button>
+                            </div>
+                        </div>
+                    </form>
+                    <div style="max-height:400px; overflow-y:auto; overflow-x:hidden;">
+                        <table class="table table-sm table-striped table-white mt-3">
+                            <thead class="thead-dark">
+                                <tr>
+                                    <th>Usuario</th>
+                                    <th style="width: 20%;">Asignar</th>
+                                </tr>
+                            </thead>
+                            <tbody id="table-result-usr">
+                                <tr class="usr-row">
+                                    <td class="usr-nombre"></td>
+                                    <td class="usr-agrega text-center"><button type="button" class="btn btn-outline-primary btn-sm invisible btn-agrega-usr"><span class="ing-mas"></span></button></td>
+                                </tr>
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <script src="js/jquery.min.js"></script>
+    <script src="js/jquery-ui.js"></script>
+    <script src="js/bootstrap/bootstrap.min.js"></script>
+    <script src="js/datalist.js"></script>
+    <script src="js/datepicker-es.js"></script>
+    <script src="./js/richtext.js"></script>
+    <?php
+        require_once 'js/messages.php';
+    ?>
+    <script>
+        var today = new Date();
+        $(".date-picker").datepicker($.datepicker.regional["es"]);
+        $(".date-picker").datepicker({
+            dateFormat: "dd/mm/yyyy",
+            changeMonth: true,
+        });
+        $(document).ready(function(){
+            $('.richtext').richText();
+            //var today = new Date();
+            $("#fecha_inicial").datepicker("option", "minDate", today);
+            $("#fecha_final").datepicker("option", "minDate", today);
+            $('#fecha_inicial').datepicker("setDate", today);
+            $('#fecha_final').datepicker("setDate", today);
+            setDatalistFirst('#facultad');
+        });
+
+        $(document).on( "change", ".tipo-switch", function(event){
+            if($(this).data("box") !== undefined){
+                if($(this).prop('checked')){
+                    $('#'+$(this).data("box")).collapse('show');
+                }else{
+                    $('#'+$(this).data("box")).collapse('hide');
+                }
+            }
+            $('#bloque_tipo').removeClass("is-invalid");
+            $('#bloque_usr').removeClass("is-invalid");
+        });
+
+        $(document).on( "click", ".btn-agrega-carrera", function(event){
+            var id = $(this).data("id");
+            var text = $(this).data("text");
+            if($('#tipo_box option[value="' + id + '"]').length == 0){
+                $("#tipo_box").append($("<option></option>").attr("value",id).text(text));
+            }
+            $(this).parents("tr").addClass("d-none");
+        });
+
+        $(document).on( "click", ".btn-quita-tipo", function(event){
+            var id = $("#tipo_box option:selected").val();
+            $("#arow_"+id).removeClass("d-none");
+            $("#tipo_box option:selected").remove();
+        });
+
+        $(document).on( "click", ".modal-open", function(event){
+            $(".area-row").removeClass("d-none");
+            $('#area > option').each(function() {
+                $("#row_"+$(this).val()).addClass("d-none");
+            });
+            $('#modal').modal("show");
+        });
+
+        $(document).on('click', '#btn-busca-usr', function(event){
+            var nombre = $('#filter_desc').val();
+            var clave = $('#filter_clave').val();
+            var fac = $('#facultad').val();
+            $('#table-result-usr').show();
+            $.ajax({
+                url: 'action/usuario_find.php',
+                type: 'POST',
+                dataType: 'json',
+                data: {nombre: nombre, clave: clave, facultad: fac},
+                success: function(result){
+                    console.log(result.length);
+                    $("#table-result-usr").find(".usr-nombre").html("");
+                    $("#table-result-usr").find(".usr-agrega button").addClass("invisible");
+                    var rows = $("#table-result-usr > tr").length;//limpia tabla actual
+                    if(rows > result.length){
+                        while(rows > result.length && rows > 1){
+                            $("#table-result-usr .usr-row:last-child").remove();
+                            rows--;
+                        }
+                    }else{
+                        for(var i=rows; i<result.length; i++){
+                            $("#table-result-usr .usr-row:first-child").clone(true).appendTo("#table-result-usr");
+                        }
+                    }
+                    if(result.length != 0){
+                        $('#table-result-usr').children().each(function(index){
+                            if(index < result.length){
+                                $(this).find('.usr-nombre').html(result[index]['profesor_nombre']);
+                                $(this).find('.usr-agrega button').data("id", result[index]['profesor_id']);
+                                $(this).find('.usr-agrega button').data("text", result[index]['profesor_nombre']);
+                                $(this).find(".usr-agrega button").removeClass("invisible");
+                            }
+                        })
+                    }
+                },
+                error: function(){
+                    console.log('error');
+                }
+            });
+        });
+
+        $(document).on( "click", ".btn-agrega-usr", function(event){
+            var id = $(this).data("id");
+            var text = $(this).data("text");
+            var rows = $("#table-result-usr > tr").length;//limpia tabla actual
+
+            if($('#usuario_box option[value="' + id + '"]').length == 0){
+                $("#usuario_box").append($("<option></option>").attr("value",id).text(text));
+            }
+            if(rows > 1)
+                $(this).parents("tr").remove();
+            else{
+                $(this).parents("tr").hide();
+                $("#filter_desc-usr").val("");
+            }
+        });
+
+        $(document).on( "click", ".btn-quita-usr", function(event){
+            $("#usuario_box option:selected").remove();
+        });
+
+        function validaCampos(){
+            var error = false;
+            var inicio = $('#fecha_inicial').val();
+            var fin = $('#fecha_final').val();
+            var aux = inicio.split('/');
+            inicio = aux[2]+'-'+aux[1]+'-'+aux[0];
+            aux = fin.split('/');
+            fin = aux[2]+'-'+aux[1]+'-'+aux[0];
+            if(fin < inicio){
+                $('#fecha_final').addClass('is-invalid');
+                error = true;
+            }
+            if($('#texto').val() == ""){
+                $('#texto').addClass('is-invalid');
+                error = true;
+            }
+            if($('select').find('option').length == 0){
+                error = true;
+                $('.tipo_aviso').addClass('is-invalid');
+            }else{
+                $('.tipo_aviso').removeClass('is-invalid');
+            }
+            if(error == true){
+                return false;
+            }else{
+                $('#tipo_box option').prop('selected', true);
+                $('#usuario_box option').prop('selected', true);
+                $('#formaModal').prop('action', './action/action_avisos_insert.php');
+            }
+        }
+
+        $('#modal_carrera').on('show.bs.modal', function(event){
+            var fac_id = $('#facultad').val();
+            $.ajax({
+                url: 'action/carrera_find.php',
+                type: 'POST',
+                dataType: 'json',
+                data: {fac_id: fac_id},
+                success: function(result){
+                    $("#table-result-carrera").find(".carrera-nombre").html("");
+                    $("#table-result-carrera").find(".carrera-agrega button").addClass("invisible");
+                    var rows = $("#table-result-carrera > tr").length;
+                    if(rows > result.length){
+                        while(rows > result.length && rows > 1){
+                            $("#table-result-carrera .tipo-row:last-child").remove();
+                            rows--;
+                        }
+                    }else{
+                        for(var i=rows; i<result.length; i++){
+                            $("#table-result-carrera .tipo-row:first-child").clone(true).appendTo("#table-result-carrera");
+                        }
+                    }
+                    if(result.length != 0){
+                        $("#table-result-carrera").children().each(function(index){
+                            if(index < result.length){
+                                $(this).find('.carrera-nombre').html(result[index]['carrera_nombre']);
+                                $(this).find('.carrera-agrega button').data("id", result[index]['carrera_id']);
+                                $(this).find('.carrera-agrega button').data("text", result[index]['carrera_nombre']);
+                                $(this).find(".carrera-agrega button").removeClass("invisible");
+                            }
+                        })
+                    }
+                },
+                error: function(){
+                    console.log("Error");
+                }
+            });
+        })
+    </script>
+</body>
 </html>

+ 436 - 436
avisos_editar.php

@@ -1,437 +1,437 @@
-<?php
-require_once 'class/c_login.php';
-require_once 'include/bd_pdo.php';
-
-if (!isset($_SESSION['user'])) {
-    header('Location: index.php');
-    exit;
-} else
-    $user = unserialize($_SESSION['user']);
-$user->access('Avisos');
-if (!$user->admin && $user->acceso == 'n') {
-    header('Location: main.php?error=1');
-} else {
-    $user->print_to_log('Avisos Editar');
-}
-$fac = $user->facultad['facultad_id'];
-if ($user->admin) {
-    $fac = null;
-}
-$fs_aviso = query('SELECT * FROM fs_aviso(:aviso_id, null, :facultad_id, null, 0, null)', [':aviso_id' => $_GET['id'], ':facultad_id' => $fac], true);
-$fs_carreras = query('SELECT * FROM fs_carreras(:fac, null, null)', [':fac' => $fs_aviso['facultad_id']], false);
-$fs_usr = query('SELECT * FROM fs_profesor_aviso(:aviso_id)', [':aviso_id' => $_GET['id']], false);
-$today = date('Y-m-d');
-$edit = $today < $fs_aviso['aviso_fecha_inicial'];
-?>
-<!DOCTYPE html>
-<html lang="en">
-
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>Avisos Crear</title>
-    <link rel="stylesheet" href="css/jquery-ui.css">
-    <link rel="stylesheet" href="css/calendar.css">
-    <link rel="stylesheet" href="css/richtext.css" type="text/css">
-    <link rel="stylesheet" href="css/fa_all.css" type="text/css">
-    <?php
-    include 'import/html_css_files.php';
-    ?>
-</head>
-
-<body>
-    <?php
-    include "import/html_header.php";
-    html_header(
-        "EDITAR AVISO",
-        "Gestión de Checador "
-    );
-    $user->access('Avisos');
-    ?>
-    <main class="content marco">
-        <div class="row">
-            <div class="col-12">
-                <form action="./action/action_avisos_update.php" method="post" id="formaModal" onsubmit="return validaCampos()">
-                    <input type="hidden" name="aviso_id" id="aviso_id" value="<?= $fs_aviso['aviso_id'] ?>">
-                    <div class="form-box">
-                        <div class="form-group row">
-                            <label for="fecha_inicial" class="col-4 col-form-label">Fecha inicial</label>
-                            <div class="col-8 col-sm-4">
-                                <?php if ($edit) { ?>
-                                    <input id="fecha_inicial" name="fecha_inicial" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly="readonly" value="<?php $day = explode("-", $fs_aviso['aviso_fecha_inicial']);
-                                                                                                                                                                                                                        $dia_inicial = $day['2'] . '/' . $day['1'] . '/' . $day[0];
-                                                                                                                                                                                                                        echo $dia_inicial; ?>">
-                                    <div class="invalid-feedback">No es una fecha valida</div>
-                                <?php } else { ?>
-                                    <div>
-                                        <?php $day = explode("-", $fs_aviso['aviso_fecha_inicial']);
-                                        $dia_inicial = $day['2'] . '/' . $day['1'] . '/' . $day[0];
-                                        echo $dia_inicial; ?>
-                                    </div>
-                                <?php } ?>
-                            </div>
-                        </div>
-                        <div class="form-group row">
-                            <label for="fecha_final" class="col-4 col-form-label">Fecha Final *</label>
-                            <div class="col-8 col-sm-4">
-                                <input id="fecha_final" name="fecha_final" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly="readonly" value="<?php $day = explode("-", $fs_aviso['aviso_fecha_final']);
-                                                                                                                                                                                                                $dia_final = $day['2'] . '/' . $day['1'] . '/' . $day[0];
-                                                                                                                                                                                                                echo $dia_final; ?>">
-                                <div class="invalid-feedback">No es una fecha valida</div>
-                            </div>
-                        </div>
-                        <div class="form-group row">
-                            <label for="texto" class="col-4 col-form-label">Aviso *</label>
-                            <div class="col-8">
-                                <?php if ($edit == true) { ?>
-                                    <textarea name="texto" id="texto" class="richtext" rows="10" readonly="readonly"><?= $fs_aviso['aviso_texto'] ?></textarea>
-                                <?php } else { ?>
-                                    <p><?= $fs_aviso['aviso_texto'] ?></p>
-                                <?php } ?>
-                            </div>
-                        </div>
-                        <?php if ($edit) { ?>
-                            <div class="form-group row tipo_aviso">
-                                <label class="col-4 col-form-label">Enviar aviso:</label>
-                                <div class="col-4 pt-2">
-                                    <div class="custom-control custom-switch">
-                                        <input type="checkbox" class="custom-control-input tipo-switch" name="bloque_tipo" id="bloque_tipo" value="1" data-box="profesorBox" data-select="tipo_box">
-                                        <label class="custom-control-label" for="bloque_tipo">Por carrera</label>
-                                    </div>
-                                </div>
-                                <div class="col-4 pt-2">
-                                    <div class="custom-control custom-switch">
-                                        <input type="checkbox" class="custom-control-input tipo-switch" name="bloque_usr" id="bloque_usr" value="1" data-box="administrativoBox" data-select="usuario_box">
-                                        <label class="custom-control-label" for="bloque_usr">Por nombre</label>
-                                    </div>
-                                </div>
-                            </div>
-                            <div class="invalid-feedback offset-4">No hay profesores para mandar el aviso</div>
-                            <div class="collapse" id="profesorBox">
-                                <h3>Carreras</h3>
-                                <p>Utiliza el botón para asignar las carreras que recibirán el aviso.</p>
-                                <div class="form-group row">
-                                    <div class="col-10">
-                                        <select name="tipo[]" id="tipo_box" class="form-control" multiple="multiple" size="5">
-                                        </select>
-                                    </div>
-                                    <div class="col-2">
-                                        <p><button type="button" class="btn btn-outline-primary" data-toggle="modal" data-target="#modal_carrera"><span class="ing-mas ing-fw"></span> Asignar</button></p>
-                                        <p><button type="button" class="btn btn-outline-danger btn-quita-tipo"><span class="ing-menos ing-fw"></span> Quitar</button></p>
-                                    </div>
-                                </div>
-                            </div>
-
-                            <div class="collapse" id="administrativoBox">
-                                <h3>Nombre de profesores</h3>
-                                <p>Utiliza el botón para asignar los profesores que recibirán el aviso.</p>
-                                <div class="form-group row">
-                                    <div class="col-10">
-                                        <select name="usuario[]" id="usuario_box" class="form-control" multiple="multiple" size="5">
-                                            <?php
-                                            foreach ($fs_usr as $usuario) {
-                                                echo "<option value='" . $usuario['profesor_id'] . "'>" . $usuario['profesor_nombre'] . "</option>";
-                                            }
-                                            ?>
-                                        </select>
-                                    </div>
-                                    <div class="col-2">
-                                        <p><button type="button" class="btn btn-outline-primary" data-toggle="modal" data-target="#modal_usr"><span class="ing-mas ing-fw"></span> Asignar</button></p>
-                                        <p><button type="button" class="btn btn-outline-danger btn-quita-usr"><span class="ing-menos ing-fw"></span> Quitar</button></p>
-                                    </div>
-                                </div>
-                            </div>
-                    </div>
-                <?php } else {
-                            $num_prof = round(count($fs_usr) / 2);
-                ?>
-                    <h3>Profesores que recibirán el aviso</h3>
-                    <div class="row" style="max-height:400px; overflow-y:auto; overflow-x:hidden;">
-                        <div class="col-5">
-                            <div>
-                                <ul>
-                                    <?php for ($i = 0; $i < $num_prof; $i++) {
-                                        echo "<li>" . $fs_usr[$i]['profesor_nombre'] . "</li>";
-                                    } ?>
-                                </ul>
-                            </div>
-                        </div>
-                        <div class="col-5">
-                            <div>
-                                <ul>
-                                    <?php for ($i = $i; $i < count($fs_usr); $i++) {
-                                        echo "<li>" . $fs_usr[$i]['profesor_nombre'] . "</li>";
-                                    } ?>
-                                </ul>
-                            </div>
-                        </div>
-                    </div>
-                <?php } ?>
-                <div class="form-group row mt-2">
-                    <div class="col-12 text-center">
-                        <button type="submit" class="btn btn-outline-primary" id="submitBtn" data-tipo="1"><span class="ing-aceptar"></span> Guardar</button>
-                        <a href="avisos.php" class="btn btn-outline-danger"><span class="ing-cancelar"></span> Cancelar</a>
-                    </div>
-                </div>
-                </form>
-            </div>
-        </div>
-    </main>
-    <!-- Footer -->
-    <?php
-    include "import/html_footer.php";
-    ?>
-
-    <!-- Modal -->
-    <div class="modal fade" id="modal_carrera" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true" data-backdrop="static" data-keyboard="false">
-        <div class="modal-dialog modal-dialog-centered" role="document">
-            <div class="modal-content">
-                <div class="modal-header">
-                    <h4 class="col-12 modal-title text-center">Carreras
-                        <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
-                            <span aria-hidden="true">&times;</span>
-                        </button>
-                    </h4>
-                </div>
-                <div class="modal-body">
-                    <table class="table table-sm table-striped table-white">
-                        <thead class="thead-dark">
-                            <tr>
-                                <th>Carrera</th>
-                                <th>Asignar</th>
-                            </tr>
-                        </thead>
-                        <tbody>
-                            <?php $count = 1;
-                            foreach ($fs_carreras as $carrera) { ?>
-                                <tr class="tipo-row" id="arow_<?= $carrera['carrera_id'] ?>">
-                                    <td><?= $carrera['carrera_nombre'] ?></td>
-                                    <td class="text-center"><button type="button" class="btn btn-outline-primary btn-sm btn-agrega-tipo" data-id="<?= $carrera['carrera_id'] ?>" data-text="<?= $carrera['carrera_nombre'] ?>"><span class="ing-mas"></span></button></td>
-                                </tr>
-                            <?php $count++;
-                            } ?>
-                        </tbody>
-                    </table>
-                </div>
-            </div>
-        </div>
-    </div>
-
-    <div class="modal fade" id="modal_usr" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true" data-backdrop="static" data-keyboard="false">
-        <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
-            <div class="modal-content">
-                <div class="modal-header">
-                    <h4 class="col-12 modal-title text-center">Busca Usuarios
-                        <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
-                            <span aria-hidden="true">&times;</span>
-                        </button>
-                    </h4>
-                </div>
-                <div class="modal-body">
-                    <form id="forma_buscar-usr" onsubmit="return false">
-                        <input type="hidden" id="facultad" name="facultad" value="<?= $fac ?>">
-                        <div class="form-box">
-                            <div class="form-group row">
-                                <label for="filter_desc" class="col-4 col-form-label">Nombre</label>
-                                <div class="col-8">
-                                    <input id="filter_desc" name="desc" type="text" class="form-control">
-                                </div>
-                            </div>
-                            <div class="form-group row">
-                                <label for="filter_clave" class="col-4 col-form-label">Clave ULSA</label>
-                                <div class="col-8">
-                                    <input id="filter_clave" name="clave" type="text" class="form-control">
-                                </div>
-                            </div>
-                        </div>
-                        <div class="for-group row">
-                            <div class="col-12 text-center">
-                                <button type="submit" class="btn btn-outline-primary" id="btn-busca-usr"><span class="ing-buscar"></span> Buscar</button>
-                                <button type="button" class="btn btn-outline-danger" data-dismiss="modal" aria-label="Close"><span class="ing-cancelar"></span> Cerrar</button>
-                            </div>
-                        </div>
-                    </form>
-                    <div style="max-height:400px; overflow-y:auto; overflow-x:hidden;">
-                        <table class="table table-sm table-striped table-white mt-3">
-                            <thead class="thead-dark">
-                                <tr>
-                                    <th>Usuario</th>
-                                    <th style="width: 20%;">Asignar</th>
-                                </tr>
-                            </thead>
-                            <tbody id="table-result-usr">
-                                <tr class="usr-row">
-                                    <td class="usr-nombre"></td>
-                                    <td class="usr-agrega text-center"><button type="button" class="btn btn-outline-primary btn-sm invisible btn-agrega-usr"><span class="ing-mas"></span></button></td>
-                                </tr>
-                            </tbody>
-                        </table>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </div>
-
-    <script src="js/jquery.min.js"></script>
-    <script src="js/jquery-ui.js"></script>
-    <script src="js/bootstrap/bootstrap.min.js"></script>
-    <script src="js/datalist.js"></script>
-    <script src="js/datepicker-es.js"></script>
-    <script src="./js/richtext.js"></script>
-    <?php
-    require_once 'js/messages.php';
-    ?>
-    <script>
-        var today = new Date();
-        $(".date-picker").datepicker($.datepicker.regional["es"]);
-        $(".date-picker").datepicker({
-            dateFormat: "dd/mm/yyyy",
-            changeMonth: true,
-        });
-        $(document).ready(function() {
-            $('.richtext').richText();
-            $("#fecha_final").datepicker("option", "minDate", today);
-            $("#fecha_inicial").datepicker("option", "minDate", today);
-            <?php
-            if (count($fs_usr) > 0) { ?>
-                $('#bloque_usr').prop("checked", true);
-                $('#administrativoBox').collapse('show');
-            <?php } if ($edit == false) { ?>
-                $('.richText-editor').removeAttr("contentEditable");
-            <?php }
-            ?>
-
-        });
-
-        $(document).on("change", ".tipo-switch", function(event) {
-            if ($(this).data("box") !== undefined) {
-                if ($(this).prop('checked')) {
-                    $('#' + $(this).data("box")).collapse('show');
-                } else {
-                    $('#' + $(this).data("box")).collapse('hide');
-                }
-            }
-            $('#bloque_tipo').removeClass("is-invalid");
-            $('#bloque_usr').removeClass("is-invalid");
-        });
-
-        $(document).on("click", ".btn-agrega-tipo", function(event) {
-            var id = $(this).data("id");
-            var text = $(this).data("text");
-            if ($('#tipo_box option[value="' + id + '"]').length == 0) {
-                $("#tipo_box").append($("<option></option>").attr("value", id).text(text));
-            }
-            $(this).parents("tr").addClass("d-none");
-        });
-
-        $(document).on("click", ".btn-quita-tipo", function(event) {
-            var id = $("#tipo_box option:selected").val();
-            $("#arow_" + id).removeClass("d-none");
-            $("#tipo_box option:selected").remove();
-        });
-
-        $(document).on("click", ".modal-open", function(event) {
-            $(".area-row").removeClass("d-none");
-            $('#area > option').each(function() {
-                $("#row_" + $(this).val()).addClass("d-none");
-            });
-            $('#modal').modal("show");
-        });
-
-        $(document).on('click', '#btn-busca-usr', function(event) {
-            var nombre = $('#filter_desc').val();
-            var clave = $('#filter_clave').val();
-            var fac = $('#facultad').val();
-            $('#table-result-usr').show();
-            $.ajax({
-                url: 'action/usuario_find.php',
-                type: 'POST',
-                dataType: 'json',
-                data: {
-                    nombre: nombre,
-                    clave: clave,
-                    facultad: fac
-                },
-                success: function(result) {
-                    console.log(result.length);
-                    $("#table-result-usr").find(".usr-nombre").html("");
-                    $("#table-result-usr").find(".usr-agrega button").addClass("invisible");
-                    var rows = $("#table-result-usr > tr").length; //limpia tabla actual
-                    if (rows > result.length) {
-                        while (rows > result.length && rows > 1) {
-                            $("#table-result-usr .usr-row:last-child").remove();
-                            rows--;
-                        }
-                    } else {
-                        for (var i = rows; i < result.length; i++) {
-                            $("#table-result-usr .usr-row:first-child").clone(true).appendTo("#table-result-usr");
-                        }
-                    }
-                    if (result.length != 0) {
-                        $('#table-result-usr').children().each(function(index) {
-                            if (index < result.length) {
-                                $(this).find('.usr-nombre').html(result[index]['profesor_nombre']);
-                                $(this).find('.usr-agrega button').data("id", result[index]['profesor_id']);
-                                $(this).find('.usr-agrega button').data("text", result[index]['profesor_nombre']);
-                                $(this).show();
-                                $(this).find(".usr-agrega button").removeClass("invisible");
-                            }
-                        })
-                    }
-                },
-                error: function() {
-                    console.log('error');
-                }
-            });
-        });
-
-        $(document).on("click", ".btn-agrega-usr", function(event) {
-            var id = $(this).data("id");
-            var text = $(this).data("text");
-            var rows = $("#table-result-usr > tr").length; //limpia tabla actual
-
-            if ($('#usuario_box option[value="' + id + '"]').length == 0) {
-                $("#usuario_box").append($("<option></option>").attr("value", id).text(text));
-            }
-            if (rows > 1)
-                $(this).parents("tr").remove();
-            else {
-                $(this).parents("tr").hide();
-                $("#filter_desc-usr").val("");
-            }
-        });
-
-        $(document).on("click", ".btn-quita-usr", function(event) {
-            $("#usuario_box option:selected").remove();
-        });
-
-        function validaCampos() {
-            var error = false;
-            var inicio = $('#fecha_inicial').val();
-            var fin = $('#fecha_final').val();
-            var aux = inicio.split('/');
-            inicio = aux[2] + '-' + aux[1] + '-' + aux[0];
-            aux = fin.split('/');
-            fin = aux[2] + '-' + aux[1] + '-' + aux[0];
-            if (fin < inicio) {
-                $('#fecha_final').addClass('is-invalid');
-                error = true;
-            }
-            if ($('select').find('option').length == 0) {
-                error = true;
-                $('.tipo_aviso').addClass('is-invalid');
-            } else {
-                $('.tipo_aviso').removeClass('is-invalid');
-            }
-            if (error) {
-                return false;
-            } else {
-                $('#tipo_box option').prop('selected', true);
-                $('#usuario_box option').prop('selected', true);
-                $('#formaModal').prp('action', './action/action_avisos_update.php');
-            }
-        }
-    </script>
-</body>
-
+<?php
+require_once 'class/c_login.php';
+require_once 'include/bd_pdo.php';
+
+if (!isset($_SESSION['user'])) {
+    header('Location: index.php');
+    exit;
+} else
+    $user = unserialize($_SESSION['user']);
+$user->access('Avisos');
+if (!$user->admin && $user->acceso == 'n') {
+    header('Location: main.php?error=1');
+} else {
+    $user->print_to_log('Avisos Editar');
+}
+$fac = $user->facultad['facultad_id'];
+if ($user->admin) {
+    $fac = null;
+}
+$fs_aviso = query('SELECT * FROM fs_aviso(:aviso_id, null, :facultad_id, null, 0, null)', [':aviso_id' => $_GET['id'], ':facultad_id' => $fac], true);
+$fs_carreras = query('SELECT * FROM fs_carreras(:fac, null, null)', [':fac' => $fs_aviso['facultad_id']], false);
+$fs_usr = query('SELECT * FROM fs_profesor_aviso(:aviso_id)', [':aviso_id' => $_GET['id']], false);
+$today = date('Y-m-d');
+$edit = $today < $fs_aviso['aviso_fecha_inicial'];
+?>
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Avisos Crear</title>
+    <link rel="stylesheet" href="css/jquery-ui.css">
+    <link rel="stylesheet" href="css/calendar.css">
+    <link rel="stylesheet" href="css/richtext.css" type="text/css">
+    <link rel="stylesheet" href="css/fa_all.css" type="text/css">
+    <?php
+    include 'import/html_css_files.php';
+    ?>
+</head>
+
+<body>
+    <?php
+    include "import/html_header.php";
+    html_header(
+        "EDITAR AVISO",
+        "Gestión de Checador "
+    );
+    $user->access('Avisos');
+    ?>
+    <main class="content marco">
+        <div class="row">
+            <div class="col-12">
+                <form action="./action/action_avisos_update.php" method="post" id="formaModal" onsubmit="return validaCampos()">
+                    <input type="hidden" name="aviso_id" id="aviso_id" value="<?= $fs_aviso['aviso_id'] ?>">
+                    <div class="form-box">
+                        <div class="form-group row">
+                            <label for="fecha_inicial" class="col-4 col-form-label">Fecha inicial</label>
+                            <div class="col-8 col-sm-4">
+                                <?php if ($edit) { ?>
+                                    <input id="fecha_inicial" name="fecha_inicial" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly="readonly" value="<?php $day = explode("-", $fs_aviso['aviso_fecha_inicial']);
+                                                                                                                                                                                                                        $dia_inicial = $day['2'] . '/' . $day['1'] . '/' . $day[0];
+                                                                                                                                                                                                                        echo $dia_inicial; ?>">
+                                    <div class="invalid-feedback">No es una fecha valida</div>
+                                <?php } else { ?>
+                                    <div>
+                                        <?php $day = explode("-", $fs_aviso['aviso_fecha_inicial']);
+                                        $dia_inicial = $day['2'] . '/' . $day['1'] . '/' . $day[0];
+                                        echo $dia_inicial; ?>
+                                    </div>
+                                <?php } ?>
+                            </div>
+                        </div>
+                        <div class="form-group row">
+                            <label for="fecha_final" class="col-4 col-form-label">Fecha Final *</label>
+                            <div class="col-8 col-sm-4">
+                                <input id="fecha_final" name="fecha_final" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly="readonly" value="<?php $day = explode("-", $fs_aviso['aviso_fecha_final']);
+                                                                                                                                                                                                                $dia_final = $day['2'] . '/' . $day['1'] . '/' . $day[0];
+                                                                                                                                                                                                                echo $dia_final; ?>">
+                                <div class="invalid-feedback">No es una fecha valida</div>
+                            </div>
+                        </div>
+                        <div class="form-group row">
+                            <label for="texto" class="col-4 col-form-label">Aviso *</label>
+                            <div class="col-8">
+                                <?php if ($edit == true) { ?>
+                                    <textarea name="texto" id="texto" class="richtext" rows="10" readonly="readonly"><?= $fs_aviso['aviso_texto'] ?></textarea>
+                                <?php } else { ?>
+                                    <p><?= $fs_aviso['aviso_texto'] ?></p>
+                                <?php } ?>
+                            </div>
+                        </div>
+                        <?php if ($edit) { ?>
+                            <div class="form-group row tipo_aviso">
+                                <label class="col-4 col-form-label">Enviar aviso:</label>
+                                <div class="col-4 pt-2">
+                                    <div class="custom-control custom-switch">
+                                        <input type="checkbox" class="custom-control-input tipo-switch" name="bloque_tipo" id="bloque_tipo" value="1" data-box="profesorBox" data-select="tipo_box">
+                                        <label class="custom-control-label" for="bloque_tipo">Por carrera</label>
+                                    </div>
+                                </div>
+                                <div class="col-4 pt-2">
+                                    <div class="custom-control custom-switch">
+                                        <input type="checkbox" class="custom-control-input tipo-switch" name="bloque_usr" id="bloque_usr" value="1" data-box="administrativoBox" data-select="usuario_box">
+                                        <label class="custom-control-label" for="bloque_usr">Por nombre</label>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="invalid-feedback offset-4">No hay profesores para mandar el aviso</div>
+                            <div class="collapse" id="profesorBox">
+                                <h3>Carreras</h3>
+                                <p>Utiliza el botón para asignar las carreras que recibirán el aviso.</p>
+                                <div class="form-group row">
+                                    <div class="col-10">
+                                        <select name="tipo[]" id="tipo_box" class="form-control" multiple="multiple" size="5">
+                                        </select>
+                                    </div>
+                                    <div class="col-2">
+                                        <p><button type="button" class="btn btn-outline-primary" data-toggle="modal" data-target="#modal_carrera"><span class="ing-mas ing-fw"></span> Asignar</button></p>
+                                        <p><button type="button" class="btn btn-outline-danger btn-quita-tipo"><span class="ing-menos ing-fw"></span> Quitar</button></p>
+                                    </div>
+                                </div>
+                            </div>
+
+                            <div class="collapse" id="administrativoBox">
+                                <h3>Nombre de profesores</h3>
+                                <p>Utiliza el botón para asignar los profesores que recibirán el aviso.</p>
+                                <div class="form-group row">
+                                    <div class="col-10">
+                                        <select name="usuario[]" id="usuario_box" class="form-control" multiple="multiple" size="5">
+                                            <?php
+                                            foreach ($fs_usr as $usuario) {
+                                                echo "<option value='" . $usuario['profesor_id'] . "'>" . $usuario['profesor_nombre'] . "</option>";
+                                            }
+                                            ?>
+                                        </select>
+                                    </div>
+                                    <div class="col-2">
+                                        <p><button type="button" class="btn btn-outline-primary" data-toggle="modal" data-target="#modal_usr"><span class="ing-mas ing-fw"></span> Asignar</button></p>
+                                        <p><button type="button" class="btn btn-outline-danger btn-quita-usr"><span class="ing-menos ing-fw"></span> Quitar</button></p>
+                                    </div>
+                                </div>
+                            </div>
+                    </div>
+                <?php } else {
+                            $num_prof = round(count($fs_usr) / 2);
+                ?>
+                    <h3>Profesores que recibirán el aviso</h3>
+                    <div class="row" style="max-height:400px; overflow-y:auto; overflow-x:hidden;">
+                        <div class="col-5">
+                            <div>
+                                <ul>
+                                    <?php for ($i = 0; $i < $num_prof; $i++) {
+                                        echo "<li>" . $fs_usr[$i]['profesor_nombre'] . "</li>";
+                                    } ?>
+                                </ul>
+                            </div>
+                        </div>
+                        <div class="col-5">
+                            <div>
+                                <ul>
+                                    <?php for ($i = $i; $i < count($fs_usr); $i++) {
+                                        echo "<li>" . $fs_usr[$i]['profesor_nombre'] . "</li>";
+                                    } ?>
+                                </ul>
+                            </div>
+                        </div>
+                    </div>
+                <?php } ?>
+                <div class="form-group row mt-2">
+                    <div class="col-12 text-center">
+                        <button type="submit" class="btn btn-outline-primary" id="submitBtn" data-tipo="1"><span class="ing-aceptar"></span> Guardar</button>
+                        <a href="avisos.php" class="btn btn-outline-danger"><span class="ing-cancelar"></span> Cancelar</a>
+                    </div>
+                </div>
+                </form>
+            </div>
+        </div>
+    </main>
+    <!-- Footer -->
+    <?php
+    include "import/html_footer.php";
+    ?>
+
+    <!-- Modal -->
+    <div class="modal fade" id="modal_carrera" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true" data-backdrop="static" data-keyboard="false">
+        <div class="modal-dialog modal-dialog-centered" role="document">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <h4 class="col-12 modal-title text-center">Carreras
+                        <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
+                            <span aria-hidden="true">&times;</span>
+                        </button>
+                    </h4>
+                </div>
+                <div class="modal-body">
+                    <table class="table table-sm table-striped table-white">
+                        <thead class="thead-dark">
+                            <tr>
+                                <th>Carrera</th>
+                                <th>Asignar</th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                            <?php $count = 1;
+                            foreach ($fs_carreras as $carrera) { ?>
+                                <tr class="tipo-row" id="arow_<?= $carrera['carrera_id'] ?>">
+                                    <td><?= $carrera['carrera_nombre'] ?></td>
+                                    <td class="text-center"><button type="button" class="btn btn-outline-primary btn-sm btn-agrega-tipo" data-id="<?= $carrera['carrera_id'] ?>" data-text="<?= $carrera['carrera_nombre'] ?>"><span class="ing-mas"></span></button></td>
+                                </tr>
+                            <?php $count++;
+                            } ?>
+                        </tbody>
+                    </table>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <div class="modal fade" id="modal_usr" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true" data-backdrop="static" data-keyboard="false">
+        <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <h4 class="col-12 modal-title text-center">Busca Usuarios
+                        <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
+                            <span aria-hidden="true">&times;</span>
+                        </button>
+                    </h4>
+                </div>
+                <div class="modal-body">
+                    <form id="forma_buscar-usr" onsubmit="return false">
+                        <input type="hidden" id="facultad" name="facultad" value="<?= $fac ?>">
+                        <div class="form-box">
+                            <div class="form-group row">
+                                <label for="filter_desc" class="col-4 col-form-label">Nombre</label>
+                                <div class="col-8">
+                                    <input id="filter_desc" name="desc" type="text" class="form-control">
+                                </div>
+                            </div>
+                            <div class="form-group row">
+                                <label for="filter_clave" class="col-4 col-form-label">Clave ULSA</label>
+                                <div class="col-8">
+                                    <input id="filter_clave" name="clave" type="text" class="form-control">
+                                </div>
+                            </div>
+                        </div>
+                        <div class="for-group row">
+                            <div class="col-12 text-center">
+                                <button type="submit" class="btn btn-outline-primary" id="btn-busca-usr"><span class="ing-buscar"></span> Buscar</button>
+                                <button type="button" class="btn btn-outline-danger" data-dismiss="modal" aria-label="Close"><span class="ing-cancelar"></span> Cerrar</button>
+                            </div>
+                        </div>
+                    </form>
+                    <div style="max-height:400px; overflow-y:auto; overflow-x:hidden;">
+                        <table class="table table-sm table-striped table-white mt-3">
+                            <thead class="thead-dark">
+                                <tr>
+                                    <th>Usuario</th>
+                                    <th style="width: 20%;">Asignar</th>
+                                </tr>
+                            </thead>
+                            <tbody id="table-result-usr">
+                                <tr class="usr-row">
+                                    <td class="usr-nombre"></td>
+                                    <td class="usr-agrega text-center"><button type="button" class="btn btn-outline-primary btn-sm invisible btn-agrega-usr"><span class="ing-mas"></span></button></td>
+                                </tr>
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <script src="js/jquery.min.js"></script>
+    <script src="js/jquery-ui.js"></script>
+    <script src="js/bootstrap/bootstrap.min.js"></script>
+    <script src="js/datalist.js"></script>
+    <script src="js/datepicker-es.js"></script>
+    <script src="./js/richtext.js"></script>
+    <?php
+    require_once 'js/messages.php';
+    ?>
+    <script>
+        var today = new Date();
+        $(".date-picker").datepicker($.datepicker.regional["es"]);
+        $(".date-picker").datepicker({
+            dateFormat: "dd/mm/yyyy",
+            changeMonth: true,
+        });
+        $(document).ready(function() {
+            $('.richtext').richText();
+            $("#fecha_final").datepicker("option", "minDate", today);
+            $("#fecha_inicial").datepicker("option", "minDate", today);
+            <?php
+            if (count($fs_usr) > 0) { ?>
+                $('#bloque_usr').prop("checked", true);
+                $('#administrativoBox').collapse('show');
+            <?php } if ($edit == false) { ?>
+                $('.richText-editor').removeAttr("contentEditable");
+            <?php }
+            ?>
+
+        });
+
+        $(document).on("change", ".tipo-switch", function(event) {
+            if ($(this).data("box") !== undefined) {
+                if ($(this).prop('checked')) {
+                    $('#' + $(this).data("box")).collapse('show');
+                } else {
+                    $('#' + $(this).data("box")).collapse('hide');
+                }
+            }
+            $('#bloque_tipo').removeClass("is-invalid");
+            $('#bloque_usr').removeClass("is-invalid");
+        });
+
+        $(document).on("click", ".btn-agrega-tipo", function(event) {
+            var id = $(this).data("id");
+            var text = $(this).data("text");
+            if ($('#tipo_box option[value="' + id + '"]').length == 0) {
+                $("#tipo_box").append($("<option></option>").attr("value", id).text(text));
+            }
+            $(this).parents("tr").addClass("d-none");
+        });
+
+        $(document).on("click", ".btn-quita-tipo", function(event) {
+            var id = $("#tipo_box option:selected").val();
+            $("#arow_" + id).removeClass("d-none");
+            $("#tipo_box option:selected").remove();
+        });
+
+        $(document).on("click", ".modal-open", function(event) {
+            $(".area-row").removeClass("d-none");
+            $('#area > option').each(function() {
+                $("#row_" + $(this).val()).addClass("d-none");
+            });
+            $('#modal').modal("show");
+        });
+
+        $(document).on('click', '#btn-busca-usr', function(event) {
+            var nombre = $('#filter_desc').val();
+            var clave = $('#filter_clave').val();
+            var fac = $('#facultad').val();
+            $('#table-result-usr').show();
+            $.ajax({
+                url: 'action/usuario_find.php',
+                type: 'POST',
+                dataType: 'json',
+                data: {
+                    nombre: nombre,
+                    clave: clave,
+                    facultad: fac
+                },
+                success: function(result) {
+                    console.log(result.length);
+                    $("#table-result-usr").find(".usr-nombre").html("");
+                    $("#table-result-usr").find(".usr-agrega button").addClass("invisible");
+                    var rows = $("#table-result-usr > tr").length; //limpia tabla actual
+                    if (rows > result.length) {
+                        while (rows > result.length && rows > 1) {
+                            $("#table-result-usr .usr-row:last-child").remove();
+                            rows--;
+                        }
+                    } else {
+                        for (var i = rows; i < result.length; i++) {
+                            $("#table-result-usr .usr-row:first-child").clone(true).appendTo("#table-result-usr");
+                        }
+                    }
+                    if (result.length != 0) {
+                        $('#table-result-usr').children().each(function(index) {
+                            if (index < result.length) {
+                                $(this).find('.usr-nombre').html(result[index]['profesor_nombre']);
+                                $(this).find('.usr-agrega button').data("id", result[index]['profesor_id']);
+                                $(this).find('.usr-agrega button').data("text", result[index]['profesor_nombre']);
+                                $(this).show();
+                                $(this).find(".usr-agrega button").removeClass("invisible");
+                            }
+                        })
+                    }
+                },
+                error: function() {
+                    console.log('error');
+                }
+            });
+        });
+
+        $(document).on("click", ".btn-agrega-usr", function(event) {
+            var id = $(this).data("id");
+            var text = $(this).data("text");
+            var rows = $("#table-result-usr > tr").length; //limpia tabla actual
+
+            if ($('#usuario_box option[value="' + id + '"]').length == 0) {
+                $("#usuario_box").append($("<option></option>").attr("value", id).text(text));
+            }
+            if (rows > 1)
+                $(this).parents("tr").remove();
+            else {
+                $(this).parents("tr").hide();
+                $("#filter_desc-usr").val("");
+            }
+        });
+
+        $(document).on("click", ".btn-quita-usr", function(event) {
+            $("#usuario_box option:selected").remove();
+        });
+
+        function validaCampos() {
+            var error = false;
+            var inicio = $('#fecha_inicial').val();
+            var fin = $('#fecha_final').val();
+            var aux = inicio.split('/');
+            inicio = aux[2] + '-' + aux[1] + '-' + aux[0];
+            aux = fin.split('/');
+            fin = aux[2] + '-' + aux[1] + '-' + aux[0];
+            if (fin < inicio) {
+                $('#fecha_final').addClass('is-invalid');
+                error = true;
+            }
+            if ($('select').find('option').length == 0) {
+                error = true;
+                $('.tipo_aviso').addClass('is-invalid');
+            } else {
+                $('.tipo_aviso').removeClass('is-invalid');
+            }
+            if (error) {
+                return false;
+            } else {
+                $('#tipo_box option').prop('selected', true);
+                $('#usuario_box option').prop('selected', true);
+                $('#formaModal').prp('action', './action/action_avisos_update.php');
+            }
+        }
+    </script>
+</body>
+
 </html>

+ 57 - 57
base.php

@@ -1,58 +1,58 @@
-<?php
-require_once 'class/c_login.php';
-require_once 'include/bd_pdo.php';
-
-if(!isset($_SESSION['user'])){
-    header('Location: index.php');
-    exit;
-}
-else
-    $user = unserialize($_SESSION['user']);
-$user->access('usuarios');
-if(!$user->admin && $user->acceso == 'n'){
-    header('Location: main.php?error=1');
-}else{
-    $user->print_to_log('Base');
-}
-$fac = $user->facultad['facultad_id'] ?? -1;
-if($user->admin){
-    $fac=null;
-}
-?>
-<!DOCTYPE html>
-<html lang="en">
-
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>Base</title>
-    <?php
-    include 'import/html_css_files.php';
-    ?>
-    <script src="js/messages.js" defer></script>
-</head>
-
-<body>
-    <?php
-    include "import/html_header.php";
-    html_header(
-        "PROFESORES",
-        "Gestión de Checador "
-    );
-    ?>
-    <main class="content marco">
-    </main>
-    <?php
-    include "import/html_footer.php";
-    ?>
-    <script src="js/jquery.min.js"></script>
-    <script src="js/bootstrap/bootstrap.min.js"></script>
-    <?php
-        require_once 'js/messages.php';
-    ?>
-    <script>
-        
-    </script>
-</body>
-
+<?php
+require_once 'class/c_login.php';
+require_once 'include/bd_pdo.php';
+
+if(!isset($_SESSION['user'])){
+    header('Location: index.php');
+    exit;
+}
+else
+    $user = unserialize($_SESSION['user']);
+$user->access('usuarios');
+if(!$user->admin && $user->acceso == 'n'){
+    header('Location: main.php?error=1');
+}else{
+    $user->print_to_log('Base');
+}
+$fac = $user->facultad['facultad_id'] ?? -1;
+if($user->admin){
+    $fac=null;
+}
+?>
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Base</title>
+    <?php
+    include 'import/html_css_files.php';
+    ?>
+    <script src="js/messages.js" defer></script>
+</head>
+
+<body>
+    <?php
+    include "import/html_header.php";
+    html_header(
+        "PROFESORES",
+        "Gestión de Checador "
+    );
+    ?>
+    <main class="content marco">
+    </main>
+    <?php
+    include "import/html_footer.php";
+    ?>
+    <script src="js/jquery.min.js"></script>
+    <script src="js/bootstrap/bootstrap.min.js"></script>
+    <?php
+        require_once 'js/messages.php';
+    ?>
+    <script>
+        
+    </script>
+</body>
+
 </html>

+ 138 - 138
bypass.php

@@ -1,139 +1,139 @@
-<?php
-if (isset($_GET["error"]) && is_numeric($_GET["error"])) {
-    switch ($_GET["error"]) {
-        case 0:
-            $errorDesc = "No se reciberon datos.";
-            break;
-        case 1:
-            $errorDesc = "El usuario y/o contraseña son incorrectos.";
-            break;
-        case 2:
-            $errorDesc = "El usuario no tiene permisos de ingresar.";
-            break;
-        case 3:
-            $errorDesc = "El usuario y/o contraseña son incorrectos.";
-            break;
-    }
-}
-?>
-<!DOCTYPE html>
-<html lang="es" prefix="og: http://ogp.me/ns#">
-
-<head>
-    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-    <title>.: Administrador de checador :.</title>
-
-    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
-    <link rel="icon" type="image/png" href="imagenes/favicon.png" />
-    <link rel="stylesheet" href="css/bootstrap-ulsa.min.css" type="text/css">
-    <link rel="stylesheet" href="css/indivisa.css" type="text/css">
-    <link rel="stylesheet" href="css/sgi.css?rand=<?= rand() ?>" type="text/css">
-    <link rel="stylesheet" href="css/index.css" type="text/css">
-
-<body>
-    <!-- HEADER -->
-    <?php include "import/html_header.php";
-    html_header("Checador inicio de sesión"); ?>
-    <main class="container-fluid content d-flex justify-content-center align-items-center">
-        <div class="logSize p-5 bg-white defaultShadow">
-            <div class="row mb-4">
-                <div class="col-sm-12">
-                    <h1 class="mb-1">Iniciar sesión</h1>
-                </div>
-            </div>
-            <form method="post" action="action/force_session.php" id="session">
-                <div class="row user">
-                    <div class="col">
-                        <p class="text-center font-weight-bold text-info">Utiliza tu usuario y contraseña institucionales</p>
-                    </div>
-                </div>
-                <div class="form-group row user">
-                    <div class="input-group px-4">
-                        <div class="input-group-prepend secondary">
-                            <div class="input-group-text bg-primary text-white"><i class="ing-usuario ing-fw"></i></div>
-                        </div>
-                        <input class="form-control form-control-lg" type="text" autocomplete="username" placeholder="Usuario (ad)" id="username" name="username" value="" autofocus="true" maxlength="10" />
-                    </div>
-                </div>
-                <div class="form-group row user">
-                    <div class="input-group mb-2 px-4">
-                        <div class="input-group-prepend">
-                            <div class="input-group-text bg-primary text-white"><i class="ing-pass ing-fw"></i></div>
-                        </div>
-                        <input class="form-control form-control-lg" type="password" autocomplete="current-password" placeholder="Contraseña" id="passwd" name="passwd" value="" maxlength="50" />
-                    </div>
-                </div>
-                <!-- Usuario -->
-                <div class="form-group row" id="cold-bypass">
-                    <div class="input-group mb-2 px-4">
-                        <div id="dlUsuario" class="datalist datalist-select mb-1 w-100">
-                            <div class="datalist-input">Selecciona un usuario</div>
-                            <span class="ing-buscar icono"></span>
-                            <ul style="display:none">
-
-                            </ul>
-                            <input type="hidden" id="user" name="usuario" value="">
-                        </div>
-                    </div>
-                </div>
-                <div class="error">
-                    <?php if (isset($_GET["error"])) { ?>
-                        <p class="text-danger text-center font-weight-bold">¡ERROR! <?= $errorDesc ?></p>
-                    <?php } ?>
-                </div>
-                <p class="text-center">
-                    <button type="submit" class="btn btn-lg btn-outline-primary btn-ing arrow">Ingresar</button>
-                </p>
-            </form>
-        </div>
-    </main>
-    <!--- FOOTER--->
-    <?php require_once("import/html_footer.php"); ?>
-
-    <script src="js/jquery.min.js"></script>
-    <script src="js/bootstrap/bootstrap.min.js"></script>
-    <script src="js/bootstrap/popper.min.js"></script>
-    <script src="js/sidebarmenu.js"></script>
-    <script src="js/datalist.js"></script>
-    <script>
-        $("#cold-bypass").hide();
-        // on submit, prevent default
-        $("#session").submit(function(e) {
-            if ($("#user").val() != "") {
-                $(this).unbind('submit').submit();
-                return;
-            }
-            e.preventDefault();
-            // dlUsuario has a value force session and redirect to main.php
-            // get the form data
-            var formData = {
-                'username': $('input[name=username]').val(),
-                'passwd': $('input[name=passwd]').val(),
-            };
-
-            $.post("action/action_usuario.php", formData, function(data) {
-                console.log(data);
-                $(".error").html("");
-                if (data == "error") {
-                    $(".error").html("<p class='text-danger text-center font-weight-bold'>¡ERROR! El usuario y/o contraseña son incorrectos.</p>");
-                    return;
-                }
-                $("#cold-bypass").show();
-                data.forEach(function(element) {
-                    // console.log(element);
-                    $("#dlUsuario ul").append(`<li class="not-selectable" data-id="${element.id}">${element.facultad}</li>`);
-                    element.usuarios.forEach(function(usuario) {
-                        $("#dlUsuario ul").append(`<li data-id="${usuario.id}">${usuario.username}</li>`);
-                    });
-                });
-
-                // hide username and password
-                $(".user").hide();
-
-            }, 'json');
-        });
-    </script>
-
-</body>
-
+<?php
+if (isset($_GET["error"]) && is_numeric($_GET["error"])) {
+    switch ($_GET["error"]) {
+        case 0:
+            $errorDesc = "No se reciberon datos.";
+            break;
+        case 1:
+            $errorDesc = "El usuario y/o contraseña son incorrectos.";
+            break;
+        case 2:
+            $errorDesc = "El usuario no tiene permisos de ingresar.";
+            break;
+        case 3:
+            $errorDesc = "El usuario y/o contraseña son incorrectos.";
+            break;
+    }
+}
+?>
+<!DOCTYPE html>
+<html lang="es" prefix="og: http://ogp.me/ns#">
+
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+    <title>.: Administrador de checador :.</title>
+
+    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+    <link rel="icon" type="image/png" href="imagenes/favicon.png" />
+    <link rel="stylesheet" href="css/bootstrap-ulsa.min.css" type="text/css">
+    <link rel="stylesheet" href="css/indivisa.css" type="text/css">
+    <link rel="stylesheet" href="css/sgi.css?rand=<?= rand() ?>" type="text/css">
+    <link rel="stylesheet" href="css/index.css" type="text/css">
+
+<body>
+    <!-- HEADER -->
+    <?php include "import/html_header.php";
+    html_header("Checador inicio de sesión"); ?>
+    <main class="container-fluid content d-flex justify-content-center align-items-center">
+        <div class="logSize p-5 bg-white defaultShadow">
+            <div class="row mb-4">
+                <div class="col-sm-12">
+                    <h1 class="mb-1">Iniciar sesión</h1>
+                </div>
+            </div>
+            <form method="post" action="action/force_session.php" id="session">
+                <div class="row user">
+                    <div class="col">
+                        <p class="text-center font-weight-bold text-info">Utiliza tu usuario y contraseña institucionales</p>
+                    </div>
+                </div>
+                <div class="form-group row user">
+                    <div class="input-group px-4">
+                        <div class="input-group-prepend secondary">
+                            <div class="input-group-text bg-primary text-white"><i class="ing-usuario ing-fw"></i></div>
+                        </div>
+                        <input class="form-control form-control-lg" type="text" autocomplete="username" placeholder="Usuario (ad)" id="username" name="username" value="" autofocus="true" maxlength="10" />
+                    </div>
+                </div>
+                <div class="form-group row user">
+                    <div class="input-group mb-2 px-4">
+                        <div class="input-group-prepend">
+                            <div class="input-group-text bg-primary text-white"><i class="ing-pass ing-fw"></i></div>
+                        </div>
+                        <input class="form-control form-control-lg" type="password" autocomplete="current-password" placeholder="Contraseña" id="passwd" name="passwd" value="" maxlength="50" />
+                    </div>
+                </div>
+                <!-- Usuario -->
+                <div class="form-group row" id="cold-bypass">
+                    <div class="input-group mb-2 px-4">
+                        <div id="dlUsuario" class="datalist datalist-select mb-1 w-100">
+                            <div class="datalist-input">Selecciona un usuario</div>
+                            <span class="ing-buscar icono"></span>
+                            <ul style="display:none">
+
+                            </ul>
+                            <input type="hidden" id="user" name="usuario" value="">
+                        </div>
+                    </div>
+                </div>
+                <div class="error">
+                    <?php if (isset($_GET["error"])) { ?>
+                        <p class="text-danger text-center font-weight-bold">¡ERROR! <?= $errorDesc ?></p>
+                    <?php } ?>
+                </div>
+                <p class="text-center">
+                    <button type="submit" class="btn btn-lg btn-outline-primary btn-ing arrow">Ingresar</button>
+                </p>
+            </form>
+        </div>
+    </main>
+    <!--- FOOTER--->
+    <?php require_once("import/html_footer.php"); ?>
+
+    <script src="js/jquery.min.js"></script>
+    <script src="js/bootstrap/bootstrap.min.js"></script>
+    <script src="js/bootstrap/popper.min.js"></script>
+    <script src="js/sidebarmenu.js"></script>
+    <script src="js/datalist.js"></script>
+    <script>
+        $("#cold-bypass").hide();
+        // on submit, prevent default
+        $("#session").submit(function(e) {
+            if ($("#user").val() != "") {
+                $(this).unbind('submit').submit();
+                return;
+            }
+            e.preventDefault();
+            // dlUsuario has a value force session and redirect to main.php
+            // get the form data
+            var formData = {
+                'username': $('input[name=username]').val(),
+                'passwd': $('input[name=passwd]').val(),
+            };
+
+            $.post("action/action_usuario.php", formData, function(data) {
+                console.log(data);
+                $(".error").html("");
+                if (data == "error") {
+                    $(".error").html("<p class='text-danger text-center font-weight-bold'>¡ERROR! El usuario y/o contraseña son incorrectos.</p>");
+                    return;
+                }
+                $("#cold-bypass").show();
+                data.forEach(function(element) {
+                    // console.log(element);
+                    $("#dlUsuario ul").append(`<li class="not-selectable" data-id="${element.id}">${element.facultad}</li>`);
+                    element.usuarios.forEach(function(usuario) {
+                        $("#dlUsuario ul").append(`<li data-id="${usuario.id}">${usuario.username}</li>`);
+                    });
+                });
+
+                // hide username and password
+                $(".user").hide();
+
+            }, 'json');
+        });
+    </script>
+
+</body>
+
 </html>

+ 812 - 812
carreras.php

@@ -1,813 +1,813 @@
-<?php
-require_once 'class/c_login.php';
-require_once 'include/bd_pdo.php';
-
-if (!isset($_SESSION['user'])){
-    header('Location: index.php');
-    exit;
-}
-else
-    $user = unserialize($_SESSION['user']);
-$user->access('facultades');
-if(!$user->admin && $user->acceso == 'n'){
-    header('Location: main.php?error=1');
-}else{
-    $user->print_to_log('Carreras');
-}
-if(!$user->admin && $user->facultad['facultad_id']!=$_GET['facultad']){
-    header('Location: carreras.php?facultad='.$user->facultad['facultad_id']);
-    $mal=true;
-}
-$mal=false;
-?>
-<!DOCTYPE html>
-<html lang="en">
-
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>Carreras</title>
-    <link rel="stylesheet" href="css/jquery-ui.css">
-    <link rel="stylesheet" href="css/calendar.css">
-    <link rel="stylesheet" href="css/toggle.css" type="text/css">
-    <?php
-    include 'import/html_css_files.php';
-    ?>
-</head>
-
-<body>
-    <?php
-    if(isset($_GET['facultad'])){
-        $facultad=query("SELECT facultad_nombre FROM facultad WHERE facultad_id = :facultad", array(":facultad" => $_GET['facultad']), true);
-        $fs_carreras = query(
-            "SELECT * FROM fs_carreras(:idfacultad, null, null)",
-            array(':idfacultad' => $_GET['facultad']),
-            single:false
-        );
-    }
-    include "import/html_header.php";
-    html_header(
-        "CARRERAS | " . $facultad['facultad_nombre'],
-        "Gestión de Checador "
-    );
-    $user->access('facultades');
-    
-
-    $fs_niveles = query(
-        "SELECT * FROM nivel", null, false
-    );
-
-    $fs_periodos = query(
-        "SELECT * FROM fs_periodos(:idfacultad) WHERE estado = 'Activo' ",
-        array(':idfacultad' => $_GET['facultad']),
-        false
-    );
-
-    $fs_tiempoLic = query(
-        "SELECT * FROM fs_tiempo_checado(:idfacultad, 1)",
-        array(':idfacultad' => $_GET['facultad']),
-        true
-    );
-    $fs_tiempoPos = query(
-        "SELECT * FROM fs_tiempo_checado(:idfacultad, 2)",
-        array(':idfacultad' => $_GET['facultad']),
-        true
-    );
-    ?>
-    <main class="content marco">
-        <?php #if($mal==true){ ?>
-            <div class="row">
-                <div class="col-12 text-left">
-                    <a href="facultades.php" title="Volver">
-                        <button type="button" class="btn btn-outline-secondary"><span class="ing-regresar ing-fw"></span>Volver</button>
-                    </a>
-                </div>
-            </div>
-        <?php #} ?>
-        <div id="message"></div>
-        <ul class="nav nav-tabs mt-3" id="myTab" role="tablist">
-            <li class="nav-item" role="presentation">
-                <button class="nav-link active" id="periodo-tab" data-toggle="tab" data-target="#periodo" type="button" role="tab" aria-controls="periodo" aria-selected="true">Periodo</button>
-            </li>
-            <li class="nav-item" role="presentation">
-                <button class="nav-link" id="carrera-tab" data-toggle="tab" data-target="#carrera" type="button" role="tab" aria-controls="carrera" aria-selected="false">Carrera</button>
-            </li>
-            <li class="nav-item" role="presentation">
-                <button class="nav-link" id="carrera-tab" data-toggle="tab" data-target="#tiempos" type="button" role="tab" aria-controls="tiempos" aria-selected="false">Tiempos</button>
-            </li>
-        </ul>
-        <div class="tab-content" id="myTabContent">
-            <!-- PERIODOS -->
-            
-            <div class="tab-pane fade show active" id="periodo" role="tabpanel" aria-labelledby="periodo-tab">
-                <div class="row mt-3">
-                    <?php if($user->acceso == 'w')  {?>
-                    <div class="col-12 text-right">
-                        <button type="button" class="btn btn-outline-secondary" data-toggle="modal" data-target="#modal_periodo" data-tipo="1"><span class="ing-mas ing-fw"></span>Agregar periodo</button>
-                    </div>
-                    <?php }?>
-                </div>
-                <!-- Tabla -->
-                <div class="row mt-3">
-                    <div class="col-12 table-responsive">
-                        <table class="table table-sm table-striped table-white">
-                            <thead class="thead-dark">
-                                <tr>
-                                    <th>Estado</th>
-                                    <th>Nivel</th>
-                                    <th>Periodo</th>
-                                    <th>Inicio</th>
-                                    <th>Fin</th>
-                                    <?php if($user->acceso == 'w')  {?>
-                                    <th>Acciones</th>
-                                    <?php }?>
-                                </tr>
-                            </thead>
-                            <tbody>
-                                <?php foreach($fs_periodos as $periodo){
-                                    $title=$periodo['estado'];
-                                    if($title=='Activo')
-                                        $color="success";
-                                    else
-                                        $color="danger";
-                                    ?>
-                                <tr data-id="<?= $periodo['id']?>" id="<?= $periodo['id']?>" >
-                                    <td class="text-<?= $color ?> text-center" title="<?= $title?>">
-                                        <span class="ing-bullet"></span>
-                                    </td>
-                                    <td class="text-primary">
-                                        <?= $periodo['nivel']?>
-                                    </td>
-                                    <td class="text-primary">
-                                        <?= $periodo['periodo']?>
-                                    </td>
-                                    <td class="text-primary">
-                                        <?= $periodo['inicio']?>
-                                    </td>
-                                    <td class="text-primary">
-                                        <?= $periodo['fin']?>
-                                    </td>
-                                    <?php if($user->acceso == 'w')  {?>
-                                    <td class="text-center icono-acciones">
-                                        <a href="#" data-toggle="modal" data-target="#modal_periodo" data-tipo="2" title="Editar"><span class="ing-editar ing-fw"></span></a>
-                                    </td>
-                                    <?php }?>
-                                </tr>
-                                <?php } ?>
-                            </tbody>
-                        </table>
-                    </div>
-                </div>
-            </div>
-            <!-- CARRERAS -->
-            <div class="tab-pane fade" id="carrera" role="tabpanel" aria-labelledby="carrera-tab">
-                <div class="row mt-3">
-                    <?php if($user->acceso == 'w')  {?>
-                    <div class="col-12 text-right">
-                        <button type="button" class="btn btn-outline-secondary" data-toggle="modal" data-target="#modal" data-tipo="1"><span class="ing-mas ing-fw"></span>Crear carrera</button>
-                    </div>
-                    <?php }?>
-                </div>
-                <!-- Tabla -->
-                <div class="row mt-3">
-                    <div class="col-12 table-responsive">
-                        <table class="table table-sm table-striped table-white">
-                            <thead class="thead-dark">
-                                <tr>
-                                    <th>Estado</th>
-                                    <th>Nivel</th>
-                                    <th>Carrera</th>
-                                    <?php if($user->acceso == 'w')  {?>
-                                    <th>Acciones</th>
-                                    <?php }?>
-                                </tr>
-                            </thead>
-                            <tbody>
-                                <?php
-                                foreach($fs_carreras as $carrera){
-                                    $color = "danger";
-                                    $title = "Inactiva";
-                                    if($carrera["carrera_activa"]==1){
-                                    $color ="success";
-                                    $title="Activa";
-                                    }
-                                    $nivel='Licenciatura';
-                                    if($carrera['nivel_id']==2)
-                                        $nivel='Posgrado';
-                                ?>
-                                <tr data-id="<?php echo $carrera['carrera_id'];?>" id="<?php echo $carrera['carrera_id'];?>">
-                                    <td class="text-<?php echo $color;?> text-center" title="<?php echo $title;?>">
-                                        <span class="ing-bullet"></span>
-                                    </td>
-                                    <td class="text-primary"><?php echo $nivel;?></td>
-                                    <td class="text-primary"><?php echo $carrera["carrera_nombre"];?></td>
-                                    <?php if($user->acceso == 'w')  {?>
-                                    <td class="text-center icono-acciones">
-                                        <a href="#" data-toggle="modal" data-target="#modal" data-tipo="2" title="Editar"><span class="ing-editar ing-fw"></span></a>
-                                    </td>
-                                    <?php }?>
-                                </tr>
-                                <?php }?>
-                            </tbody>
-                        </table>
-                    </div>
-                </div>
-            </div>
-            <!-- Tiempos -->
-            <div class="tab-pane fade" id="tiempos" role="tabpanel" aria-labelledby="tiempos-tab">
-                <p class="mt-4">Asigna los minutos de tolerancia antes y después del horario de clase</p>
-                
-                <form action="" method="post" id="formaModalTiempos" onsubmit="return valida_camposT()">
-                    <input type="hidden" name="facultadT" id="facultadT">
-                    <h3 class="text-center">Licenciatura</h3>
-                <div class="row mt-3" style="border:solid 2px; border-radius: 8px;">
-                    <div class="offset-1 col-2 text-center">
-                        Antes
-                        <input id="antesL" name="antesL" type="number" class="form-control text-center" maxlenth="10">
-                            <div class="invalid-feedback">
-                                Debe ser un numero mayor que 0
-                            </div>
-                            min 
-                        </div>
-                        <div class="col-2 text-center bg-light mt-4 mb-4">
-                            <h5 class="mt-2">Hora de clase</h5>
-                        </div>
-                        <div class="col-2 text-center">
-                            Despues
-                            <input id="despuesL" name="despuesL" type="number" class="form-control text-center" maxlenth="10">
-                            <div class="invalid-feedback">
-                                Debe ser un numero mayor que 0
-                            </div>
-                            min
-                        </div>
-                        <div class="col-2 text-center retardoLic">
-                            Retardos
-                            <input id="retardoL" name="retardoL" type="number" class="form-control text-center" maxlenth="10">
-                            <div class="invalid-feedback">
-                                Debe ser un numero mayor que 0
-                            </div>
-                            min
-                        </div>
-                        <div class="col-3 text-center">
-                            ¿Tiene retardos?<br>
-                            <div class="custom-control custom-switch mt-2">
-                                <input type="checkbox" class="custom-control-input tipo-switch"  name="retardoLic" id="retardoLic" value="1">
-                                <label class="custom-control-label" for="retardoLic">Si</label>
-                            </div>
-                        </div>
-                    </div>
-                    <br><br>
-                    <h3 class="text-center">Posgrado</h3>
-                    <div class="row mt-3" style="border:solid 2px; border-radius: 8px;">
-                        <div class="offset-1 col-2 text-center">
-                            Antes
-                            <input id="antesP" name="antesP" type="number" class="form-control text-center" maxlenth="10">
-                            <div class="invalid-feedback">
-                                Debe ser un numero mayor que 0
-                            </div>
-                            min
-                        </div>
-                        <div class="col-2 text-center bg-light mt-4 mb-4">
-                            <h5 class="mt-2">Hora de clase</h5>
-                        </div>
-                        <div class="col-2 text-center">
-                            Despues
-                            <input id="despuesP" name="despuesP" type="number" class="form-control text-center" maxlenth="10">
-                            <div class="invalid-feedback">
-                                Debe ser un numero mayor que 0
-                            </div>
-                            min
-                        </div>
-                        <div class="col-2 text-center retardoPos">
-                            Retardo
-                            <input id="retardoP" name="retardoP" type="number" class="form-control text-center" maxlenth="10">
-                            <div class="invalid-feedback">
-                                Debe ser un numero mayor que 0
-                            </div>
-                            min
-                        </div>
-                        <div class="col-3 text-center">
-                            ¿Tiene retardos?<br>
-                            <div class="custom-control custom-switch mt-2">
-                                <input type="checkbox" class="custom-control-input tipo-switch"  name="retardoPos" id="retardoPos" value="1">
-                                <label class="custom-control-label" for="retardoPos"></label>
-                            </div>
-                        </div>
-                    </div>
-                    <br>
-                </form>
-                <div class="form-group row mt-3">
-                    <div class="offset-4 col-8">
-                        <button class="btn btn-outline-primary" id="submitBtnT">
-                            <span class="ing-aceptar ing-fw"></span> Guardar
-                        </button>
-                        <button type="reset" id="reset" class="btn btn-outline-danger" data-dismiss="modal">
-                            <span class="ing-cancelar ing-fw"></span> Limpiar
-                        </button>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </main>
-    <!-- Footer -->
-    <?php
-    include "import/html_footer.php";
-    ?>
-    <!-- Modal -->
-    <div class="modal fade" id="modal_periodo" tabindex="-1" role="dialog" arialabelledby="modal" aria-hidden="true">
-        <div class="modal-dialog modal-dialog-centered" role="document">
-            <div class="modal-content">
-                <div class="modal-header">
-                    <h4 class="col-12 modal-title text-center">
-                        <span id="modalLabelP">
-                            Editar periodo
-                        </span>
-                        <button type="button" class="close text-white" data-dismiss="modal" aria-label="close">
-                            <span aria-hidden="true">&times;</span>
-                        </button>
-                    </h4>
-                </div>
-                <div class="modal-body">
-                    <form action="" method="post" id="formaModalP" onsubmit="return valida_camposP()">
-                        <input type="hidden" name="idP" id="idP">
-                        <input type="hidden" name="facultadP" id="facultadP" value="<?php echo $_GET['facultad']; ?>">
-                        <div class="form-box">
-                            <div class="form-group row">
-                                <label for="nombreP" class="col-4 col-form-label">Nombre *</label>
-                                <div class="col-8">
-                                    <input id="nombreP" name="nombreP" type="text" class="form-control" maxlength="100">
-                                    <div class="invalid-feedback" id="nombreP-error">Campo obligatorio</div>
-                                </div>
-                            </div>
-                            <div class="form-group row">
-                                <label for="inicio" class="col-4 col-form-label">Fecha de inicio *</label>
-                                <div class="col-8">
-                                    <input id="fecha_inicial" name="fecha_inicial" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly="">
-                                    <div class="invalid-feedback">Debe seleccionar una fecha</div>
-                                </div>
-                            </div>
-                            <div class="form-group row">
-                                <label for="fin" class="col-4 col-form-label">Fecha de fin *</label>
-                                <div class="col-8">
-                                    <input id="fecha_final" name="fecha_final" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly="">
-                                    <div class="invalid-feedback">Debe seleccionar una fecha</div>
-                                </div>
-                            </div>
-                            <div class="form-group row">
-                                <label for="nivelP" class="col-4 col-form-label">Nivel *</label>
-                                <div class="col-8">
-                                    <div class="datalist datalist-select mb-1 w-100">
-                                        <div class="datalist-input">Mostrar todos</div>
-                                        <span class="ing-buscar icono"></span>
-                                        <ul style="display:none">
-                                            <?php foreach($fs_niveles as $pnivel){?>
-                                                <li data-id="<?php echo $pnivel['nivel_id']?>" class="pl-4"><?php echo $pnivel['nivel_nombre'] ?></li>
-                                            <?php }?>
-                                        </ul>
-                                        <input type="hidden" id="nivelP" name="nivelP" value="">
-                                    </div>
-                                    <div class="invalid-feedback">Debe seleccionar un nivel</div>
-                                </div>
-                            </div>
-                            <div class="form-group row">
-                                <label for="estadoP" class="col-4 col-form-label">Estado *</label>
-                                <div class="col-4">
-                                    <div class="form-check form-check-inline">
-                                        <input class="form-check-input radio-lg" type="radio" id="estado_activoP" name="estadoP" value="1" checked="checked">
-                                        <label for="estado_activoP" class="col-form-label">Activo</label>
-                                    </div>
-                                </div>
-                                <div class="col-4">
-                                    <div class="form-check form-check-inline">
-                                        <input class="form-check-input radio-lg" type="radio" id="estado_inactivoP" name="estadoP" value="2">
-                                        <label for="estado_inactivoP" class="col-form-label">Inactivo</label>
-                                    </div>
-                                </div>
-                            </div>
-                            <div class="from-group row">
-                                <div class="offset-4 col-8">
-                                    <button type="submit" class="btn btn-outline-primary" id="submitBtnP" data-tipo="1">
-                                        <span class="ing-aceptar ing-fw"></span> Guardar
-                                    </button>
-                                    <button type="reset" class="btn btn-outline-danger" data-dismiss="modal">
-                                        <span class="ing-cancelar ing-fw"></span> Cancelar
-                                    </button>
-                                </div>
-                            </div>
-                        </div>
-                    </form>
-                </div>
-            </div>
-        </div>
-    </div>
-    <div class="modal fade" id="modal" tabindex="-1" role="dialog" arialabelledby="modal" aria-hidden="true">
-        <div class="modal-dialog modal-dialog-centered" role="document">
-            <div class="modal-content">
-                <div class="modal-header">
-                    <h4 class="col-12 modal-title text-center">
-                        <span id="modalLabel">
-                            Editar nombre de Carrera
-                        </span>
-                        <button type="button" class="close text-white" data-dismiss="modal" aria-label="close">
-                            <span aria-hidden="true">&times;</span>
-                        </button>
-                    </h4>
-                </div>
-                <div class="modal-body">
-                    <form action="" method="post" id="formaModal" onsubmit="return valida_campos()">
-                        <input type="hidden" name="id" id="id">
-                        <input type="hidden" name="facultad" id="facultad" value="<?php echo $_GET['facultad']; ?>">
-                        <div class="form-box">
-                            <div class="form-group row">
-                                <label for="nivel" class="col-4 col-form-label">Nivel *</label>
-                                <div class="col-8">
-                                    <div class="datalist datalist-select mb-1 w-100">
-                                        <div class="datalist-input">Mostrar todos</div>
-                                        <span class="ing-buscar icono"></span>
-                                        <ul style="display:none">
-                                            
-                                            <?php foreach($fs_niveles as $pnivel){?>
-                                                <li data-id="<?php echo $pnivel['nivel_id']?>" class="pl-4"><?php echo $pnivel['nivel_nombre'] ?></li>
-                                            <?php }?>
-                                        </ul>
-                                        <input type="hidden" id="nivel" name="nivel" value="">
-                                    </div>
-                                </div>
-                            </div>
-                            <div class="form-group row">
-                                <label for="nombre" class="col-4 col-form-label">Nombre *</label>
-                                <div class="col-8">
-                                    <input id="nombre" name="nombre" type="text" class="form-control" maxlength="100">
-                                    <div class="invalid-feedback" id="nombre-error">Campo obligatorio</div>
-                                </div>
-                            </div>
-                            <div class="form-group row">
-                                <label for="estado" class="col-4 col-form-label">Estado *</label>
-                                <div class="col-4">
-                                    <div class="form-check form-check-inline">
-                                        <input class="form-check-input radio-lg" type="radio" id="estado_activo" name="estado" value="1" checked="checked">
-                                        <label for="estado_activo" class="col-form-label">Activo</label>
-                                    </div>
-                                </div>
-                                <div class="col-4">
-                                    <div class="form-check form-check-inline">
-                                        <input class="form-check-input radio-lg" type="radio" id="estado_inactivo" name="estado" value="0">
-                                        <label for="estado_inactivo" class="col-form-label">Inactivo</label>
-                                    </div>
-                                </div>
-                            </div>
-                            <div class="from-group row">
-                                <div class="offset-4 col-8">
-                                    <button type="submit" class="btn btn-outline-primary" id="submitBtn" data-tipo="1">
-                                        <span class="ing-aceptar ing-fw"></span> Guardar
-                                    </button>
-                                    <button type="reset" class="btn btn-outline-danger" id="reset" data-dismiss="modal">
-                                        <span class="ing-cancelar ing-fw"></span> Cancelar
-                                    </button>
-                                </div>
-                            </div>
-                        </div>
-                    </form>
-                </div>
-            </div>
-        </div>
-    </div>
-    <script src="js/jquery.min.js"></script>
-    <script src="js/jquery-ui.js"></script>
-    <script src="js/bootstrap/bootstrap.min.js"></script>
-    <script src="js/datalist.js"></script>
-    <script src="js/datepicker-es.js"></script>
-    <script src="js/toggle.js"></script>
-    <?php
-        require_once 'js/messages.php';
-    ?>
-    <script>
-        $('#retardoLic').change(function(){
-            if($(this).is(':checked')){
-                $('.retardoLic').show();
-            }
-            else{
-                $('.retardoLic').hide();
-                $('#retardoL').val("0");
-            }
-        });
-        $('#retardoPos').change(function(){
-            if($(this).is(':checked')){
-                $('.retardoPos').show();
-            }
-            else{
-                $('.retardoPos').hide();
-                $('#retardoP').val("0");
-            }
-        });
-        $('#reset').on('click', function(){
-            $('#antesL').val("<?= -1*($fs_tiempoLic['desde_asistencia'] ?? 0) ?>");
-            $('#despuesL').val("<?= ($fs_tiempoLic['hasta_asistencia'] ?? 1)-1 ?>");
-            $('#retardoL').val("<?= ($fs_tiempoLic['hasta_retardo'] ?? 0) - ($fs_tiempoLic['hasta_asistencia'] ?? 0) ?>");
-            $('#antesP').val("<?= -1*($fs_tiempoPos['desde_asistencia'] ?? 0) ?>");
-            $('#despuesP').val("<?= ($fs_tiempoPos['hasta_asistencia'] ?? 1)-1 ?>");
-            $('#retardoP').val("<?= ($fs_tiempoPos['hasta_retardo'] ?? 0) - ($fs_tiempoPos['hasta_asistencia'] ?? 0) ?>");
-            <?php
-                if(($fs_tiempoLic['hasta_asistencia'] ?? 0) == ($fs_tiempoLic['hasta_retardo'] ?? 0)){ ?>
-                    $('.retardoLic').hide();
-                    $('#retardoL').val("0");
-                    $('#retardoLic').prop("checked", false).change();
-                    <?php }
-                else{ ?>
-                        $('#retardoLic').prop("checked", true).change();
-                <?php }
-                if(($fs_tiempoPos['hasta_asistencia'] ?? 0) == ($fs_tiempoPos['hasta_retardo'] ?? 0)){ ?>
-                    $('.retardoPos').hide();
-                    $('#retardoP').val("0");
-                    $('#retardoPos').prop("checked", false).change();
-                <?php }
-                else{ ?>
-                        $('#retardoPos').prop("checked", true).change();
-                <?php }
-                ?>
-            $('#antesL').removeClass("is-invalid");
-            $('#despuesL').removeClass("is-invalid");
-            $('#retardoL').removeClass("is-invalid");
-            $('#antesP').removeClass("is-invalid");
-            $('#despuesP').removeClass("is-invalid");
-            $('#retardoP').removeClass("is-invalid");
-        });
-        $(".date-picker").datepicker($.datepicker.regional["es"]);
-        $(".date-picker").datepicker({
-            dateFormat: "dd/mm/yyyy",
-            changeMonth: true,
-        });
-
-        $('#submitBtnT').on('click', function(){
-            //$('#antesL').addClass("is-invalid");
-            $('#formaModalTiempos').submit();
-        });
-
-        var today = new Date();
-
-        function valida_camposT(){
-            var error=false;
-            if($('#antesL').val()==""){
-                $('#antesL').addClass("is-invalid");
-                error=true;
-            }
-            if($('#antesL').val()<0){
-                $('#antesL').addClass("is-invalid");
-                error=true;
-            }
-            if(isNaN($('#antesL').val())){
-                $('#antesL').addClass("is-invalid");
-                error=true;
-            }
-            if($('#despuesL').val()==""){
-                $('#despuesL').addClass("is-invalid");
-                error=true;
-            }
-            if($('#despuesL').val()<0){
-                $('#despuesL').addClass("is-invalid");
-                error=true;
-            }
-            if(isNaN($('#despuesL').val())){
-                $('#despuesL').addClass("is-invalid");
-                error=true;
-            }
-            if($('#retardoL').val()==""){
-                $('#retardoL').addClass("is-invalid");
-                error=true;
-            }
-            if($('#retardoL').val()<0){
-                $('#retardoL').addClass("is-invalid");
-                error=true;
-            }
-            if(isNaN($('#retardoL').val())){
-                $('#retardoL').addClass("is-invalid");
-                error=true;
-            }
-            if($('#antesP').val()==""){
-                $('#antesP').addClass("is-invalid");
-                error=true;
-            }
-            if(isNaN($('#antesP').val())){
-                $('#antesP').addClass("is-invalid");
-                error=true;
-            }
-            if($('#despuesP').val()==""){
-                $('#despuesP').addClass("is-invalid");
-                error=true;
-            }
-            if(isNaN($('#despuesP').val())){
-                $('#despuesP').addClass("is-invalid");
-                error=true;
-            }
-            if($('#retardoP').val()==""){
-                $('#retardoP').addClass("is-invalid");
-                error=true;
-            }
-            if(isNaN($('#retardoP').val())){
-                $('#retardoP').addClass("is-invalid");
-                error=true;
-            }
-            if(!error){
-                $('#formaModalTiempos').prop("action", "./action/action_tiempos_update.php");
-            }else{
-                return false;
-            }
-        }
-
-        function valida_camposP(){
-            var error=false;
-            if($("#fecha_inicial").val()==""){
-                $("#fecha_inicial").addClass("is-invalid");
-                error=true;
-            }
-            if($("#fecha_final").val()==""){
-                $("#fecha_final").addClass("is-invalid");
-                error=true;
-            }
-            if($("#nombreP").val()==""){
-                $("#nombreP").addClass("is-invalid");
-                $("#nombreP-error").html("Campo obligatorio");
-                error=true;
-            }
-            if($("#nombreP").val()[0]==" "){
-                $("#nombreP").addClass("is-invalid");
-                $("#nombreP-error").html("No puede haber espacios al inicio");
-                error=true;
-            }
-            if($("#nivelP").val()==""){
-                error=true;
-                $("#nivelP").addClass("is-invalid");
-            }
-            if(error){
-                return false;
-            }else{
-                var btn = $("#submitBtnP");
-                if(btn.data("tipo")==2)//update
-                    $("#formaModalP").prop("action", "./action/action_periodos_update.php");
-                else{//insert
-                    $("#formaModalP").prop("action", "./action/action_periodos_insert.php");
-                }
-            }
-        }
-
-        <?php if(!$fs_carreras && !$fs_periodos){ ?>
-            triggerMessage("No se encontraron carreras ni periodos en esta facultad", "Error");
-        <?php } else if(!$fs_carreras){?>
-            triggerMessage("No se encontraron carreras en esta facultad", "Error");
-        <?php } else if(!$fs_periodos){?>
-            triggerMessage("No se encontraron periodos en esta facultad", "Error");
-        <?php }?>
-
-        function valida_campos(){
-            var error=false;
-            if($("#nombre").val()==""){
-                $("#nombre").addClass("is-invalid");
-                $("#nombre-error").html("Campo obligatorio");
-                error=true;
-            }
-            if($("#nombre").val()[0]==" "){
-                $("#nombre").addClass("is-invalid");
-                $("#nombre-error").html("No puede haber espacios al inicio");
-                error=true;
-            }
-            if($("#nivel").val()==""){
-                error=true;
-            }
-            if($('#estado_activo').prop('checked') == false && $('#estado_inactivo').prop('checked') == false){
-                error=true;
-            }
-            if(error){
-                return false;
-            }else{
-                var btn = $('#submitBtn');
-                if(btn.data("tipo")==2)//update
-                    $("#formaModal").prop("action", "./action/action_carreras_update.php");
-                else//insert
-                    $("#formaModal").prop("action", "./action/action_carreras_insert.php");
-            }
-        }
-
-        $('#modal_periodo').on('show.bs.modal', function(event){//datos periodo 
-            var button = $(event.relatedTarget);
-            var tipo = button.data('tipo');
-            $("#nombreP").removeClass("is-invalid");
-            if(tipo==1){//crear
-                $('#modalLabelP').html("Agregar periodo");
-                $("#submitBtnP").data("tipo", 1);
-                $("#fecha_inicial").datepicker("setDate", today);
-                $("#fecha_final").datepicker("setDate", today);
-                $("#nombreP").val("");
-                $("#estado_activoP").prop("checked", true);
-                setDatalist("#nivelP",1);
-                $("li").removeClass("selected");
-                var fi = $("#fecha_inicial").datepicker("getDate");
-                //$("#fecha_final").datepicker("option", "minDate", fi);
-            }else{//editar
-                $('#modalLabelP').html("Editar periodo");
-                $("#submitBtnP").data("tipo", 2);
-                var id = $(event.relatedTarget).parents("tr").data("id");
-                var fac = $("#facultadP").val();
-                $.ajax({
-                    url:"action/action_periodos_select.php",
-                    type:"post",
-                    dataType:"json",
-                    data:{idfacultad: fac, idperiodo: id},
-                    success:function(result){
-                        //console.log(result);
-                        $("#idP").val(result["id"]);
-                        $("#facultadP").val(result["facultad_id"]);
-                        $("#nombreP").val(result["periodo"]);
-                        var date = new Date(result["inicio"])
-                        date.setDate(date.getDate() + 1);
-                        $("#fecha_inicial").datepicker("setDate", date);
-                        date = new Date(result["fin"])
-                        date.setDate(date.getDate() + 1);
-                        $("#fecha_final").datepicker("setDate", date);
-                        //$(".datalist-input").html(result["nivel"]);
-                        setDatalist("#nivelP",result["nivel_id"]);
-                        var fi = $("#fecha_inicial").datepicker("getDate");
-                        //$("#fecha_final").datepicker("option", "minDate", fi);
-                        var ff = $("#fecha_final").datepicker("getDate");
-                        //$("#fecha_inicial").datepicker("option", "maxDate", ff);
-                        if(result['estado']=="Activo"){
-                            $('#estado_activoP').prop('checked', true);
-                        }else{
-                            $('#estado_inactivoP').prop('checked', true);
-                        }
-                    },
-                    error: function(){console.log("Error")}
-                });
-            }
-        })
-
-        $('#modal').on('show.bs.modal', function(event){
-            var button = $(event.relatedTarget);
-            var tipo = button.data('tipo');
-            var modal = $(this);
-            $("#nombre").removeClass("is-invalid");
-            if(tipo == 1){//crear
-                $("#submitBtn").data('tipo', 1);
-                $("#modalLabel").html("Crear Carrera");
-                $("#nombre").val("");
-                $('#estado_activo').prop('checked', true);
-                $('li').removeClass('selected');
-                $(".datalist-input").html("Mostrar todas");
-                $("#nivel").val("");
-            }else{//editar
-                $("#submitBtn").data('tipo', 2);
-                $("#modalLabel").html("Editar Carrera");
-                $("#nombre").val("");
-                $('#estado_activo').prop('checked', true);
-                var id = $(event.relatedTarget).parents("tr").data("id");
-                var fac = $("#facultad").val();
-                $.ajax({
-                    url:"action/action_carreras_select.php",
-                    type:"post",
-                    dataType:"json",
-                    data:{idfacultad: fac, idcarrera: id},
-                    success:function(result){
-                        //console.log(result);
-                        $("#id").val(result["carrera_id"]);
-                        $("#nombre").val(result["carrera_nombre"])
-                        if(result['carrera_activa']==1){
-                            $('#estado_activo').prop('checked', true);
-                        }else{
-                            $('#estado_inactivo').prop('checked', true);
-                        }
-                        setDatalist("#nivel", result["nivel_id"]);
-                    },
-                    error: function(){console.log("Error")}
-                });
-            }
-        });
-        $(document).ready(function(){
-            $('#antesL').val("<?= -1*($fs_tiempoLic['desde_asistencia'] ?? 0) ?>");
-            $('#despuesL').val("<?= ($fs_tiempoLic['hasta_asistencia'] ?? 1)-1 ?>");
-            $('#retardoL').val("<?= ($fs_tiempoLic['hasta_retardo'] ?? 1) - ($fs_tiempoLic['hasta_asistencia'] ?? 0) ?>");
-            $('#antesP').val("<?= -1*($fs_tiempoPos['desde_asistencia'] ?? 0) ?>");
-            $('#despuesP').val("<?= ($fs_tiempoPos['hasta_asistencia'] ?? 1) -1 ?>");
-            $('#retardoP').val("<?= ($fs_tiempoPos['hasta_retardo'] ?? 1) - ($fs_tiempoPos['hasta_asistencia'] ?? 0) ?>");
-            $('#facultadT').val("<?= $_GET['facultad'] ?>");
-            <?php
-                if(($fs_tiempoLic['hasta_asistencia'] ?? 0) == ($fs_tiempoLic['hasta_retardo'] ?? 0)){ ?>
-                    $('.retardoLic').hide();
-                    $('#retardoL').val("0");
-                    $('#retardoLic').prop("checked", false).change();
-                    <?php }
-                else{ ?>
-                        $('#retardoLic').prop("checked", true).change();
-                    <?php }
-                if(($fs_tiempoPos['hasta_asistencia'] ?? 0) == ($fs_tiempoPos['hasta_retardo'] ?? 0)){ ?>
-                    $('.retardoPos').hide();
-                    $('#retardoP').val("0");
-                    $('#retardoPos').prop("checked", false).change();
-                <?php }
-                else{ ?>
-                        $('#retardoPos').prop("checked", true).change();
-                <?php }
-            ?>
-        });
-    </script>
-</body>
-
+<?php
+require_once 'class/c_login.php';
+require_once 'include/bd_pdo.php';
+
+if (!isset($_SESSION['user'])){
+    header('Location: index.php');
+    exit;
+}
+else
+    $user = unserialize($_SESSION['user']);
+$user->access('facultades');
+if(!$user->admin && $user->acceso == 'n'){
+    header('Location: main.php?error=1');
+}else{
+    $user->print_to_log('Carreras');
+}
+if(!$user->admin && $user->facultad['facultad_id']!=$_GET['facultad']){
+    header('Location: carreras.php?facultad='.$user->facultad['facultad_id']);
+    $mal=true;
+}
+$mal=false;
+?>
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Carreras</title>
+    <link rel="stylesheet" href="css/jquery-ui.css">
+    <link rel="stylesheet" href="css/calendar.css">
+    <link rel="stylesheet" href="css/toggle.css" type="text/css">
+    <?php
+    include 'import/html_css_files.php';
+    ?>
+</head>
+
+<body>
+    <?php
+    if(isset($_GET['facultad'])){
+        $facultad=query("SELECT facultad_nombre FROM facultad WHERE facultad_id = :facultad", array(":facultad" => $_GET['facultad']), true);
+        $fs_carreras = query(
+            "SELECT * FROM fs_carreras(:idfacultad, null, null)",
+            array(':idfacultad' => $_GET['facultad']),
+            single:false
+        );
+    }
+    include "import/html_header.php";
+    html_header(
+        "CARRERAS | " . $facultad['facultad_nombre'],
+        "Gestión de Checador "
+    );
+    $user->access('facultades');
+    
+
+    $fs_niveles = query(
+        "SELECT * FROM nivel", null, false
+    );
+
+    $fs_periodos = query(
+        "SELECT * FROM fs_periodos(:idfacultad) WHERE estado = 'Activo' ",
+        array(':idfacultad' => $_GET['facultad']),
+        false
+    );
+
+    $fs_tiempoLic = query(
+        "SELECT * FROM fs_tiempo_checado(:idfacultad, 1)",
+        array(':idfacultad' => $_GET['facultad']),
+        true
+    );
+    $fs_tiempoPos = query(
+        "SELECT * FROM fs_tiempo_checado(:idfacultad, 2)",
+        array(':idfacultad' => $_GET['facultad']),
+        true
+    );
+    ?>
+    <main class="content marco">
+        <?php #if($mal==true){ ?>
+            <div class="row">
+                <div class="col-12 text-left">
+                    <a href="facultades.php" title="Volver">
+                        <button type="button" class="btn btn-outline-secondary"><span class="ing-regresar ing-fw"></span>Volver</button>
+                    </a>
+                </div>
+            </div>
+        <?php #} ?>
+        <div id="message"></div>
+        <ul class="nav nav-tabs mt-3" id="myTab" role="tablist">
+            <li class="nav-item" role="presentation">
+                <button class="nav-link active" id="periodo-tab" data-toggle="tab" data-target="#periodo" type="button" role="tab" aria-controls="periodo" aria-selected="true">Periodo</button>
+            </li>
+            <li class="nav-item" role="presentation">
+                <button class="nav-link" id="carrera-tab" data-toggle="tab" data-target="#carrera" type="button" role="tab" aria-controls="carrera" aria-selected="false">Carrera</button>
+            </li>
+            <li class="nav-item" role="presentation">
+                <button class="nav-link" id="carrera-tab" data-toggle="tab" data-target="#tiempos" type="button" role="tab" aria-controls="tiempos" aria-selected="false">Tiempos</button>
+            </li>
+        </ul>
+        <div class="tab-content" id="myTabContent">
+            <!-- PERIODOS -->
+            
+            <div class="tab-pane fade show active" id="periodo" role="tabpanel" aria-labelledby="periodo-tab">
+                <div class="row mt-3">
+                    <?php if($user->acceso == 'w')  {?>
+                    <div class="col-12 text-right">
+                        <button type="button" class="btn btn-outline-secondary" data-toggle="modal" data-target="#modal_periodo" data-tipo="1"><span class="ing-mas ing-fw"></span>Agregar periodo</button>
+                    </div>
+                    <?php }?>
+                </div>
+                <!-- Tabla -->
+                <div class="row mt-3">
+                    <div class="col-12 table-responsive">
+                        <table class="table table-sm table-striped table-white">
+                            <thead class="thead-dark">
+                                <tr>
+                                    <th>Estado</th>
+                                    <th>Nivel</th>
+                                    <th>Periodo</th>
+                                    <th>Inicio</th>
+                                    <th>Fin</th>
+                                    <?php if($user->acceso == 'w')  {?>
+                                    <th>Acciones</th>
+                                    <?php }?>
+                                </tr>
+                            </thead>
+                            <tbody>
+                                <?php foreach($fs_periodos as $periodo){
+                                    $title=$periodo['estado'];
+                                    if($title=='Activo')
+                                        $color="success";
+                                    else
+                                        $color="danger";
+                                    ?>
+                                <tr data-id="<?= $periodo['id']?>" id="<?= $periodo['id']?>" >
+                                    <td class="text-<?= $color ?> text-center" title="<?= $title?>">
+                                        <span class="ing-bullet"></span>
+                                    </td>
+                                    <td class="text-primary">
+                                        <?= $periodo['nivel']?>
+                                    </td>
+                                    <td class="text-primary">
+                                        <?= $periodo['periodo']?>
+                                    </td>
+                                    <td class="text-primary">
+                                        <?= $periodo['inicio']?>
+                                    </td>
+                                    <td class="text-primary">
+                                        <?= $periodo['fin']?>
+                                    </td>
+                                    <?php if($user->acceso == 'w')  {?>
+                                    <td class="text-center icono-acciones">
+                                        <a href="#" data-toggle="modal" data-target="#modal_periodo" data-tipo="2" title="Editar"><span class="ing-editar ing-fw"></span></a>
+                                    </td>
+                                    <?php }?>
+                                </tr>
+                                <?php } ?>
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            </div>
+            <!-- CARRERAS -->
+            <div class="tab-pane fade" id="carrera" role="tabpanel" aria-labelledby="carrera-tab">
+                <div class="row mt-3">
+                    <?php if($user->acceso == 'w')  {?>
+                    <div class="col-12 text-right">
+                        <button type="button" class="btn btn-outline-secondary" data-toggle="modal" data-target="#modal" data-tipo="1"><span class="ing-mas ing-fw"></span>Crear carrera</button>
+                    </div>
+                    <?php }?>
+                </div>
+                <!-- Tabla -->
+                <div class="row mt-3">
+                    <div class="col-12 table-responsive">
+                        <table class="table table-sm table-striped table-white">
+                            <thead class="thead-dark">
+                                <tr>
+                                    <th>Estado</th>
+                                    <th>Nivel</th>
+                                    <th>Carrera</th>
+                                    <?php if($user->acceso == 'w')  {?>
+                                    <th>Acciones</th>
+                                    <?php }?>
+                                </tr>
+                            </thead>
+                            <tbody>
+                                <?php
+                                foreach($fs_carreras as $carrera){
+                                    $color = "danger";
+                                    $title = "Inactiva";
+                                    if($carrera["carrera_activa"]==1){
+                                    $color ="success";
+                                    $title="Activa";
+                                    }
+                                    $nivel='Licenciatura';
+                                    if($carrera['nivel_id']==2)
+                                        $nivel='Posgrado';
+                                ?>
+                                <tr data-id="<?php echo $carrera['carrera_id'];?>" id="<?php echo $carrera['carrera_id'];?>">
+                                    <td class="text-<?php echo $color;?> text-center" title="<?php echo $title;?>">
+                                        <span class="ing-bullet"></span>
+                                    </td>
+                                    <td class="text-primary"><?php echo $nivel;?></td>
+                                    <td class="text-primary"><?php echo $carrera["carrera_nombre"];?></td>
+                                    <?php if($user->acceso == 'w')  {?>
+                                    <td class="text-center icono-acciones">
+                                        <a href="#" data-toggle="modal" data-target="#modal" data-tipo="2" title="Editar"><span class="ing-editar ing-fw"></span></a>
+                                    </td>
+                                    <?php }?>
+                                </tr>
+                                <?php }?>
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            </div>
+            <!-- Tiempos -->
+            <div class="tab-pane fade" id="tiempos" role="tabpanel" aria-labelledby="tiempos-tab">
+                <p class="mt-4">Asigna los minutos de tolerancia antes y después del horario de clase</p>
+                
+                <form action="" method="post" id="formaModalTiempos" onsubmit="return valida_camposT()">
+                    <input type="hidden" name="facultadT" id="facultadT">
+                    <h3 class="text-center">Licenciatura</h3>
+                <div class="row mt-3" style="border:solid 2px; border-radius: 8px;">
+                    <div class="offset-1 col-2 text-center">
+                        Antes
+                        <input id="antesL" name="antesL" type="number" class="form-control text-center" maxlenth="10">
+                            <div class="invalid-feedback">
+                                Debe ser un numero mayor que 0
+                            </div>
+                            min 
+                        </div>
+                        <div class="col-2 text-center bg-light mt-4 mb-4">
+                            <h5 class="mt-2">Hora de clase</h5>
+                        </div>
+                        <div class="col-2 text-center">
+                            Despues
+                            <input id="despuesL" name="despuesL" type="number" class="form-control text-center" maxlenth="10">
+                            <div class="invalid-feedback">
+                                Debe ser un numero mayor que 0
+                            </div>
+                            min
+                        </div>
+                        <div class="col-2 text-center retardoLic">
+                            Retardos
+                            <input id="retardoL" name="retardoL" type="number" class="form-control text-center" maxlenth="10">
+                            <div class="invalid-feedback">
+                                Debe ser un numero mayor que 0
+                            </div>
+                            min
+                        </div>
+                        <div class="col-3 text-center">
+                            ¿Tiene retardos?<br>
+                            <div class="custom-control custom-switch mt-2">
+                                <input type="checkbox" class="custom-control-input tipo-switch"  name="retardoLic" id="retardoLic" value="1">
+                                <label class="custom-control-label" for="retardoLic">Si</label>
+                            </div>
+                        </div>
+                    </div>
+                    <br><br>
+                    <h3 class="text-center">Posgrado</h3>
+                    <div class="row mt-3" style="border:solid 2px; border-radius: 8px;">
+                        <div class="offset-1 col-2 text-center">
+                            Antes
+                            <input id="antesP" name="antesP" type="number" class="form-control text-center" maxlenth="10">
+                            <div class="invalid-feedback">
+                                Debe ser un numero mayor que 0
+                            </div>
+                            min
+                        </div>
+                        <div class="col-2 text-center bg-light mt-4 mb-4">
+                            <h5 class="mt-2">Hora de clase</h5>
+                        </div>
+                        <div class="col-2 text-center">
+                            Despues
+                            <input id="despuesP" name="despuesP" type="number" class="form-control text-center" maxlenth="10">
+                            <div class="invalid-feedback">
+                                Debe ser un numero mayor que 0
+                            </div>
+                            min
+                        </div>
+                        <div class="col-2 text-center retardoPos">
+                            Retardo
+                            <input id="retardoP" name="retardoP" type="number" class="form-control text-center" maxlenth="10">
+                            <div class="invalid-feedback">
+                                Debe ser un numero mayor que 0
+                            </div>
+                            min
+                        </div>
+                        <div class="col-3 text-center">
+                            ¿Tiene retardos?<br>
+                            <div class="custom-control custom-switch mt-2">
+                                <input type="checkbox" class="custom-control-input tipo-switch"  name="retardoPos" id="retardoPos" value="1">
+                                <label class="custom-control-label" for="retardoPos"></label>
+                            </div>
+                        </div>
+                    </div>
+                    <br>
+                </form>
+                <div class="form-group row mt-3">
+                    <div class="offset-4 col-8">
+                        <button class="btn btn-outline-primary" id="submitBtnT">
+                            <span class="ing-aceptar ing-fw"></span> Guardar
+                        </button>
+                        <button type="reset" id="reset" class="btn btn-outline-danger" data-dismiss="modal">
+                            <span class="ing-cancelar ing-fw"></span> Limpiar
+                        </button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </main>
+    <!-- Footer -->
+    <?php
+    include "import/html_footer.php";
+    ?>
+    <!-- Modal -->
+    <div class="modal fade" id="modal_periodo" tabindex="-1" role="dialog" arialabelledby="modal" aria-hidden="true">
+        <div class="modal-dialog modal-dialog-centered" role="document">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <h4 class="col-12 modal-title text-center">
+                        <span id="modalLabelP">
+                            Editar periodo
+                        </span>
+                        <button type="button" class="close text-white" data-dismiss="modal" aria-label="close">
+                            <span aria-hidden="true">&times;</span>
+                        </button>
+                    </h4>
+                </div>
+                <div class="modal-body">
+                    <form action="" method="post" id="formaModalP" onsubmit="return valida_camposP()">
+                        <input type="hidden" name="idP" id="idP">
+                        <input type="hidden" name="facultadP" id="facultadP" value="<?php echo $_GET['facultad']; ?>">
+                        <div class="form-box">
+                            <div class="form-group row">
+                                <label for="nombreP" class="col-4 col-form-label">Nombre *</label>
+                                <div class="col-8">
+                                    <input id="nombreP" name="nombreP" type="text" class="form-control" maxlength="100">
+                                    <div class="invalid-feedback" id="nombreP-error">Campo obligatorio</div>
+                                </div>
+                            </div>
+                            <div class="form-group row">
+                                <label for="inicio" class="col-4 col-form-label">Fecha de inicio *</label>
+                                <div class="col-8">
+                                    <input id="fecha_inicial" name="fecha_inicial" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly="">
+                                    <div class="invalid-feedback">Debe seleccionar una fecha</div>
+                                </div>
+                            </div>
+                            <div class="form-group row">
+                                <label for="fin" class="col-4 col-form-label">Fecha de fin *</label>
+                                <div class="col-8">
+                                    <input id="fecha_final" name="fecha_final" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly="">
+                                    <div class="invalid-feedback">Debe seleccionar una fecha</div>
+                                </div>
+                            </div>
+                            <div class="form-group row">
+                                <label for="nivelP" class="col-4 col-form-label">Nivel *</label>
+                                <div class="col-8">
+                                    <div class="datalist datalist-select mb-1 w-100">
+                                        <div class="datalist-input">Mostrar todos</div>
+                                        <span class="ing-buscar icono"></span>
+                                        <ul style="display:none">
+                                            <?php foreach($fs_niveles as $pnivel){?>
+                                                <li data-id="<?php echo $pnivel['nivel_id']?>" class="pl-4"><?php echo $pnivel['nivel_nombre'] ?></li>
+                                            <?php }?>
+                                        </ul>
+                                        <input type="hidden" id="nivelP" name="nivelP" value="">
+                                    </div>
+                                    <div class="invalid-feedback">Debe seleccionar un nivel</div>
+                                </div>
+                            </div>
+                            <div class="form-group row">
+                                <label for="estadoP" class="col-4 col-form-label">Estado *</label>
+                                <div class="col-4">
+                                    <div class="form-check form-check-inline">
+                                        <input class="form-check-input radio-lg" type="radio" id="estado_activoP" name="estadoP" value="1" checked="checked">
+                                        <label for="estado_activoP" class="col-form-label">Activo</label>
+                                    </div>
+                                </div>
+                                <div class="col-4">
+                                    <div class="form-check form-check-inline">
+                                        <input class="form-check-input radio-lg" type="radio" id="estado_inactivoP" name="estadoP" value="2">
+                                        <label for="estado_inactivoP" class="col-form-label">Inactivo</label>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="from-group row">
+                                <div class="offset-4 col-8">
+                                    <button type="submit" class="btn btn-outline-primary" id="submitBtnP" data-tipo="1">
+                                        <span class="ing-aceptar ing-fw"></span> Guardar
+                                    </button>
+                                    <button type="reset" class="btn btn-outline-danger" data-dismiss="modal">
+                                        <span class="ing-cancelar ing-fw"></span> Cancelar
+                                    </button>
+                                </div>
+                            </div>
+                        </div>
+                    </form>
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="modal fade" id="modal" tabindex="-1" role="dialog" arialabelledby="modal" aria-hidden="true">
+        <div class="modal-dialog modal-dialog-centered" role="document">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <h4 class="col-12 modal-title text-center">
+                        <span id="modalLabel">
+                            Editar nombre de Carrera
+                        </span>
+                        <button type="button" class="close text-white" data-dismiss="modal" aria-label="close">
+                            <span aria-hidden="true">&times;</span>
+                        </button>
+                    </h4>
+                </div>
+                <div class="modal-body">
+                    <form action="" method="post" id="formaModal" onsubmit="return valida_campos()">
+                        <input type="hidden" name="id" id="id">
+                        <input type="hidden" name="facultad" id="facultad" value="<?php echo $_GET['facultad']; ?>">
+                        <div class="form-box">
+                            <div class="form-group row">
+                                <label for="nivel" class="col-4 col-form-label">Nivel *</label>
+                                <div class="col-8">
+                                    <div class="datalist datalist-select mb-1 w-100">
+                                        <div class="datalist-input">Mostrar todos</div>
+                                        <span class="ing-buscar icono"></span>
+                                        <ul style="display:none">
+                                            
+                                            <?php foreach($fs_niveles as $pnivel){?>
+                                                <li data-id="<?php echo $pnivel['nivel_id']?>" class="pl-4"><?php echo $pnivel['nivel_nombre'] ?></li>
+                                            <?php }?>
+                                        </ul>
+                                        <input type="hidden" id="nivel" name="nivel" value="">
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="form-group row">
+                                <label for="nombre" class="col-4 col-form-label">Nombre *</label>
+                                <div class="col-8">
+                                    <input id="nombre" name="nombre" type="text" class="form-control" maxlength="100">
+                                    <div class="invalid-feedback" id="nombre-error">Campo obligatorio</div>
+                                </div>
+                            </div>
+                            <div class="form-group row">
+                                <label for="estado" class="col-4 col-form-label">Estado *</label>
+                                <div class="col-4">
+                                    <div class="form-check form-check-inline">
+                                        <input class="form-check-input radio-lg" type="radio" id="estado_activo" name="estado" value="1" checked="checked">
+                                        <label for="estado_activo" class="col-form-label">Activo</label>
+                                    </div>
+                                </div>
+                                <div class="col-4">
+                                    <div class="form-check form-check-inline">
+                                        <input class="form-check-input radio-lg" type="radio" id="estado_inactivo" name="estado" value="0">
+                                        <label for="estado_inactivo" class="col-form-label">Inactivo</label>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="from-group row">
+                                <div class="offset-4 col-8">
+                                    <button type="submit" class="btn btn-outline-primary" id="submitBtn" data-tipo="1">
+                                        <span class="ing-aceptar ing-fw"></span> Guardar
+                                    </button>
+                                    <button type="reset" class="btn btn-outline-danger" id="reset" data-dismiss="modal">
+                                        <span class="ing-cancelar ing-fw"></span> Cancelar
+                                    </button>
+                                </div>
+                            </div>
+                        </div>
+                    </form>
+                </div>
+            </div>
+        </div>
+    </div>
+    <script src="js/jquery.min.js"></script>
+    <script src="js/jquery-ui.js"></script>
+    <script src="js/bootstrap/bootstrap.min.js"></script>
+    <script src="js/datalist.js"></script>
+    <script src="js/datepicker-es.js"></script>
+    <script src="js/toggle.js"></script>
+    <?php
+        require_once 'js/messages.php';
+    ?>
+    <script>
+        $('#retardoLic').change(function(){
+            if($(this).is(':checked')){
+                $('.retardoLic').show();
+            }
+            else{
+                $('.retardoLic').hide();
+                $('#retardoL').val("0");
+            }
+        });
+        $('#retardoPos').change(function(){
+            if($(this).is(':checked')){
+                $('.retardoPos').show();
+            }
+            else{
+                $('.retardoPos').hide();
+                $('#retardoP').val("0");
+            }
+        });
+        $('#reset').on('click', function(){
+            $('#antesL').val("<?= -1*($fs_tiempoLic['desde_asistencia'] ?? 0) ?>");
+            $('#despuesL').val("<?= ($fs_tiempoLic['hasta_asistencia'] ?? 1)-1 ?>");
+            $('#retardoL').val("<?= ($fs_tiempoLic['hasta_retardo'] ?? 0) - ($fs_tiempoLic['hasta_asistencia'] ?? 0) ?>");
+            $('#antesP').val("<?= -1*($fs_tiempoPos['desde_asistencia'] ?? 0) ?>");
+            $('#despuesP').val("<?= ($fs_tiempoPos['hasta_asistencia'] ?? 1)-1 ?>");
+            $('#retardoP').val("<?= ($fs_tiempoPos['hasta_retardo'] ?? 0) - ($fs_tiempoPos['hasta_asistencia'] ?? 0) ?>");
+            <?php
+                if(($fs_tiempoLic['hasta_asistencia'] ?? 0) == ($fs_tiempoLic['hasta_retardo'] ?? 0)){ ?>
+                    $('.retardoLic').hide();
+                    $('#retardoL').val("0");
+                    $('#retardoLic').prop("checked", false).change();
+                    <?php }
+                else{ ?>
+                        $('#retardoLic').prop("checked", true).change();
+                <?php }
+                if(($fs_tiempoPos['hasta_asistencia'] ?? 0) == ($fs_tiempoPos['hasta_retardo'] ?? 0)){ ?>
+                    $('.retardoPos').hide();
+                    $('#retardoP').val("0");
+                    $('#retardoPos').prop("checked", false).change();
+                <?php }
+                else{ ?>
+                        $('#retardoPos').prop("checked", true).change();
+                <?php }
+                ?>
+            $('#antesL').removeClass("is-invalid");
+            $('#despuesL').removeClass("is-invalid");
+            $('#retardoL').removeClass("is-invalid");
+            $('#antesP').removeClass("is-invalid");
+            $('#despuesP').removeClass("is-invalid");
+            $('#retardoP').removeClass("is-invalid");
+        });
+        $(".date-picker").datepicker($.datepicker.regional["es"]);
+        $(".date-picker").datepicker({
+            dateFormat: "dd/mm/yyyy",
+            changeMonth: true,
+        });
+
+        $('#submitBtnT').on('click', function(){
+            //$('#antesL').addClass("is-invalid");
+            $('#formaModalTiempos').submit();
+        });
+
+        var today = new Date();
+
+        function valida_camposT(){
+            var error=false;
+            if($('#antesL').val()==""){
+                $('#antesL').addClass("is-invalid");
+                error=true;
+            }
+            if($('#antesL').val()<0){
+                $('#antesL').addClass("is-invalid");
+                error=true;
+            }
+            if(isNaN($('#antesL').val())){
+                $('#antesL').addClass("is-invalid");
+                error=true;
+            }
+            if($('#despuesL').val()==""){
+                $('#despuesL').addClass("is-invalid");
+                error=true;
+            }
+            if($('#despuesL').val()<0){
+                $('#despuesL').addClass("is-invalid");
+                error=true;
+            }
+            if(isNaN($('#despuesL').val())){
+                $('#despuesL').addClass("is-invalid");
+                error=true;
+            }
+            if($('#retardoL').val()==""){
+                $('#retardoL').addClass("is-invalid");
+                error=true;
+            }
+            if($('#retardoL').val()<0){
+                $('#retardoL').addClass("is-invalid");
+                error=true;
+            }
+            if(isNaN($('#retardoL').val())){
+                $('#retardoL').addClass("is-invalid");
+                error=true;
+            }
+            if($('#antesP').val()==""){
+                $('#antesP').addClass("is-invalid");
+                error=true;
+            }
+            if(isNaN($('#antesP').val())){
+                $('#antesP').addClass("is-invalid");
+                error=true;
+            }
+            if($('#despuesP').val()==""){
+                $('#despuesP').addClass("is-invalid");
+                error=true;
+            }
+            if(isNaN($('#despuesP').val())){
+                $('#despuesP').addClass("is-invalid");
+                error=true;
+            }
+            if($('#retardoP').val()==""){
+                $('#retardoP').addClass("is-invalid");
+                error=true;
+            }
+            if(isNaN($('#retardoP').val())){
+                $('#retardoP').addClass("is-invalid");
+                error=true;
+            }
+            if(!error){
+                $('#formaModalTiempos').prop("action", "./action/action_tiempos_update.php");
+            }else{
+                return false;
+            }
+        }
+
+        function valida_camposP(){
+            var error=false;
+            if($("#fecha_inicial").val()==""){
+                $("#fecha_inicial").addClass("is-invalid");
+                error=true;
+            }
+            if($("#fecha_final").val()==""){
+                $("#fecha_final").addClass("is-invalid");
+                error=true;
+            }
+            if($("#nombreP").val()==""){
+                $("#nombreP").addClass("is-invalid");
+                $("#nombreP-error").html("Campo obligatorio");
+                error=true;
+            }
+            if($("#nombreP").val()[0]==" "){
+                $("#nombreP").addClass("is-invalid");
+                $("#nombreP-error").html("No puede haber espacios al inicio");
+                error=true;
+            }
+            if($("#nivelP").val()==""){
+                error=true;
+                $("#nivelP").addClass("is-invalid");
+            }
+            if(error){
+                return false;
+            }else{
+                var btn = $("#submitBtnP");
+                if(btn.data("tipo")==2)//update
+                    $("#formaModalP").prop("action", "./action/action_periodos_update.php");
+                else{//insert
+                    $("#formaModalP").prop("action", "./action/action_periodos_insert.php");
+                }
+            }
+        }
+
+        <?php if(!$fs_carreras && !$fs_periodos){ ?>
+            triggerMessage("No se encontraron carreras ni periodos en esta facultad", "Error");
+        <?php } else if(!$fs_carreras){?>
+            triggerMessage("No se encontraron carreras en esta facultad", "Error");
+        <?php } else if(!$fs_periodos){?>
+            triggerMessage("No se encontraron periodos en esta facultad", "Error");
+        <?php }?>
+
+        function valida_campos(){
+            var error=false;
+            if($("#nombre").val()==""){
+                $("#nombre").addClass("is-invalid");
+                $("#nombre-error").html("Campo obligatorio");
+                error=true;
+            }
+            if($("#nombre").val()[0]==" "){
+                $("#nombre").addClass("is-invalid");
+                $("#nombre-error").html("No puede haber espacios al inicio");
+                error=true;
+            }
+            if($("#nivel").val()==""){
+                error=true;
+            }
+            if($('#estado_activo').prop('checked') == false && $('#estado_inactivo').prop('checked') == false){
+                error=true;
+            }
+            if(error){
+                return false;
+            }else{
+                var btn = $('#submitBtn');
+                if(btn.data("tipo")==2)//update
+                    $("#formaModal").prop("action", "./action/action_carreras_update.php");
+                else//insert
+                    $("#formaModal").prop("action", "./action/action_carreras_insert.php");
+            }
+        }
+
+        $('#modal_periodo').on('show.bs.modal', function(event){//datos periodo 
+            var button = $(event.relatedTarget);
+            var tipo = button.data('tipo');
+            $("#nombreP").removeClass("is-invalid");
+            if(tipo==1){//crear
+                $('#modalLabelP').html("Agregar periodo");
+                $("#submitBtnP").data("tipo", 1);
+                $("#fecha_inicial").datepicker("setDate", today);
+                $("#fecha_final").datepicker("setDate", today);
+                $("#nombreP").val("");
+                $("#estado_activoP").prop("checked", true);
+                setDatalist("#nivelP",1);
+                $("li").removeClass("selected");
+                var fi = $("#fecha_inicial").datepicker("getDate");
+                //$("#fecha_final").datepicker("option", "minDate", fi);
+            }else{//editar
+                $('#modalLabelP').html("Editar periodo");
+                $("#submitBtnP").data("tipo", 2);
+                var id = $(event.relatedTarget).parents("tr").data("id");
+                var fac = $("#facultadP").val();
+                $.ajax({
+                    url:"action/action_periodos_select.php",
+                    type:"post",
+                    dataType:"json",
+                    data:{idfacultad: fac, idperiodo: id},
+                    success:function(result){
+                        //console.log(result);
+                        $("#idP").val(result["id"]);
+                        $("#facultadP").val(result["facultad_id"]);
+                        $("#nombreP").val(result["periodo"]);
+                        var date = new Date(result["inicio"])
+                        date.setDate(date.getDate() + 1);
+                        $("#fecha_inicial").datepicker("setDate", date);
+                        date = new Date(result["fin"])
+                        date.setDate(date.getDate() + 1);
+                        $("#fecha_final").datepicker("setDate", date);
+                        //$(".datalist-input").html(result["nivel"]);
+                        setDatalist("#nivelP",result["nivel_id"]);
+                        var fi = $("#fecha_inicial").datepicker("getDate");
+                        //$("#fecha_final").datepicker("option", "minDate", fi);
+                        var ff = $("#fecha_final").datepicker("getDate");
+                        //$("#fecha_inicial").datepicker("option", "maxDate", ff);
+                        if(result['estado']=="Activo"){
+                            $('#estado_activoP').prop('checked', true);
+                        }else{
+                            $('#estado_inactivoP').prop('checked', true);
+                        }
+                    },
+                    error: function(){console.log("Error")}
+                });
+            }
+        })
+
+        $('#modal').on('show.bs.modal', function(event){
+            var button = $(event.relatedTarget);
+            var tipo = button.data('tipo');
+            var modal = $(this);
+            $("#nombre").removeClass("is-invalid");
+            if(tipo == 1){//crear
+                $("#submitBtn").data('tipo', 1);
+                $("#modalLabel").html("Crear Carrera");
+                $("#nombre").val("");
+                $('#estado_activo').prop('checked', true);
+                $('li').removeClass('selected');
+                $(".datalist-input").html("Mostrar todas");
+                $("#nivel").val("");
+            }else{//editar
+                $("#submitBtn").data('tipo', 2);
+                $("#modalLabel").html("Editar Carrera");
+                $("#nombre").val("");
+                $('#estado_activo').prop('checked', true);
+                var id = $(event.relatedTarget).parents("tr").data("id");
+                var fac = $("#facultad").val();
+                $.ajax({
+                    url:"action/action_carreras_select.php",
+                    type:"post",
+                    dataType:"json",
+                    data:{idfacultad: fac, idcarrera: id},
+                    success:function(result){
+                        //console.log(result);
+                        $("#id").val(result["carrera_id"]);
+                        $("#nombre").val(result["carrera_nombre"])
+                        if(result['carrera_activa']==1){
+                            $('#estado_activo').prop('checked', true);
+                        }else{
+                            $('#estado_inactivo').prop('checked', true);
+                        }
+                        setDatalist("#nivel", result["nivel_id"]);
+                    },
+                    error: function(){console.log("Error")}
+                });
+            }
+        });
+        $(document).ready(function(){
+            $('#antesL').val("<?= -1*($fs_tiempoLic['desde_asistencia'] ?? 0) ?>");
+            $('#despuesL').val("<?= ($fs_tiempoLic['hasta_asistencia'] ?? 1)-1 ?>");
+            $('#retardoL').val("<?= ($fs_tiempoLic['hasta_retardo'] ?? 1) - ($fs_tiempoLic['hasta_asistencia'] ?? 0) ?>");
+            $('#antesP').val("<?= -1*($fs_tiempoPos['desde_asistencia'] ?? 0) ?>");
+            $('#despuesP').val("<?= ($fs_tiempoPos['hasta_asistencia'] ?? 1) -1 ?>");
+            $('#retardoP').val("<?= ($fs_tiempoPos['hasta_retardo'] ?? 1) - ($fs_tiempoPos['hasta_asistencia'] ?? 0) ?>");
+            $('#facultadT').val("<?= $_GET['facultad'] ?>");
+            <?php
+                if(($fs_tiempoLic['hasta_asistencia'] ?? 0) == ($fs_tiempoLic['hasta_retardo'] ?? 0)){ ?>
+                    $('.retardoLic').hide();
+                    $('#retardoL').val("0");
+                    $('#retardoLic').prop("checked", false).change();
+                    <?php }
+                else{ ?>
+                        $('#retardoLic').prop("checked", true).change();
+                    <?php }
+                if(($fs_tiempoPos['hasta_asistencia'] ?? 0) == ($fs_tiempoPos['hasta_retardo'] ?? 0)){ ?>
+                    $('.retardoPos').hide();
+                    $('#retardoP').val("0");
+                    $('#retardoPos').prop("checked", false).change();
+                <?php }
+                else{ ?>
+                        $('#retardoPos').prop("checked", true).change();
+                <?php }
+            ?>
+        });
+    </script>
+</body>
+
 </html>

+ 73 - 73
class/c_logasistencia.php

@@ -1,73 +1,73 @@
-<?php
-/* 
- * Objeto para leer y escribir datos de log de intentos de asistencia realizadas por el usuario
- */
-
-namespace classes;
-
-define("MAX_LINES", 200);
-class LogAsistencias
-{
-    //put your code here
-    private $file, $month, $year;
-    private $dir;
-
-    function __construct($ruta = null)
-    {
-        // die ruta
-        $this->month = date("m");
-        $this->year = date("Y");
-        $this->dir = ($ruta ?? '') . "log/";
-        $this->updateFilename();
-    }
-
-    function setMes(string $mes)
-    {
-        $this->month = $mes;
-        $this->updateFilename();
-    }
-    function setAno(string $ano)
-    {
-        $this->year = $ano;
-        $this->updateFilename();
-    }
-
-    private function updateFilename()
-    {
-        $this->file = "asistencias_" . $this->year . "_" . $this->month . ".log";
-    }
-    private function cleanLog($text)
-    { //remueve || de los textos
-        return trim(str_ireplace("||", "", $text));
-    }
-
-    function appendLog($claveULSA, $nombre, $desc)
-    {
-        $filename = $this->dir . $this->file;
-        if (!file_exists($this->dir)) {
-            mkdir($this->dir, 0755, true);
-        }
-        if (file_exists($this->dir)) {
-            $data = date('Y-m-d H:i:s') . "||" . $this->cleanLog($claveULSA) . "||" . $this->cleanLog($desc) . "||" . $this->cleanLog($nombre) . "\n";
-            /*echo*/
-            file_put_contents($filename, $data, FILE_APPEND);
-        }
-    }
-    function getLog($mes = "", $ano = "")
-    {
-        if ($mes != "") $this->setMes($mes);
-        if ($ano != "") $this->setAno($ano);
-        $filename = $this->dir . $this->file;
-        if (file_exists($filename)) {
-            //return array_slice(file ($filename , FILE_SKIP_EMPTY_LINES) , -10);
-            $lines = file($filename, FILE_SKIP_EMPTY_LINES);
-            //echo "antes: ".count($lines);
-            if (count($lines) > MAX_LINES) {
-                $lines = array_slice($lines, MAX_LINES * (-1));
-            }
-            //echo "despues: ".count($lines);
-            return $lines;
-        } else
-            return array();
-    }
-}
+<?php
+/* 
+ * Objeto para leer y escribir datos de log de intentos de asistencia realizadas por el usuario
+ */
+
+namespace classes;
+
+define("MAX_LINES", 200);
+class LogAsistencias
+{
+    //put your code here
+    private $file, $month, $year;
+    private $dir;
+
+    function __construct($ruta = null)
+    {
+        // die ruta
+        $this->month = date("m");
+        $this->year = date("Y");
+        $this->dir = ($ruta ?? '') . "log/";
+        $this->updateFilename();
+    }
+
+    function setMes(string $mes)
+    {
+        $this->month = $mes;
+        $this->updateFilename();
+    }
+    function setAno(string $ano)
+    {
+        $this->year = $ano;
+        $this->updateFilename();
+    }
+
+    private function updateFilename()
+    {
+        $this->file = "asistencias_" . $this->year . "_" . $this->month . ".log";
+    }
+    private function cleanLog($text)
+    { //remueve || de los textos
+        return trim(str_ireplace("||", "", $text));
+    }
+
+    function appendLog($claveULSA, $nombre, $desc)
+    {
+        $filename = $this->dir . $this->file;
+        if (!file_exists($this->dir)) {
+            mkdir($this->dir, 0755, true);
+        }
+        if (file_exists($this->dir)) {
+            $data = date('Y-m-d H:i:s') . "||" . $this->cleanLog($claveULSA) . "||" . $this->cleanLog($desc) . "||" . $this->cleanLog($nombre) . "\n";
+            /*echo*/
+            file_put_contents($filename, $data, FILE_APPEND);
+        }
+    }
+    function getLog($mes = "", $ano = "")
+    {
+        if ($mes != "") $this->setMes($mes);
+        if ($ano != "") $this->setAno($ano);
+        $filename = $this->dir . $this->file;
+        if (file_exists($filename)) {
+            //return array_slice(file ($filename , FILE_SKIP_EMPTY_LINES) , -10);
+            $lines = file($filename, FILE_SKIP_EMPTY_LINES);
+            //echo "antes: ".count($lines);
+            if (count($lines) > MAX_LINES) {
+                $lines = array_slice($lines, MAX_LINES * (-1));
+            }
+            //echo "despues: ".count($lines);
+            return $lines;
+        } else
+            return array();
+    }
+}

+ 142 - 129
class/c_login.php

@@ -1,130 +1,143 @@
-<?php
-date_default_timezone_set('America/Mexico_City');
-$currentTime = time();
-$endOfDay = strtotime('tomorrow') - 1;
-$remainingTime = $endOfDay - $currentTime;
-
-session_set_cookie_params($remainingTime, '/', $_SERVER['HTTP_HOST'], false, true);
-
-require_once($ruta ?? '') . "include/bd_pdo.php";
-require_once($ruta ?? '') . "class/c_logasistencia.php";
-require_once($ruta ?? '') . "include/nusoap/nusoap.php";
-
-session_start();
-class Login
-{
-    public string $acceso;
-    public function __construct(public array $user, public array $facultad, public array $rol, public bool $admin, public ?int $periodo, public bool $supervisor, public bool $jefe_carrera, public bool $profesor)
-    {
-    }
-    public function print_to_log(string $desc, array $old = null, array $new = null): void
-    {
-        $log = new classes\LogAsistencias($_ENV["RUTA_RAIZ"]);
-        if ($old)
-            $desc .= " |#| OLD:" . json_encode($old);
-        if ($new)
-            $desc .= " |#| NEW:" . json_encode($new);
-        $log->appendLog($this->user["id"], $this->user["nombre"], $desc);
-    }
-    public function access(string $pagina = null): void
-    {
-        if ($this->admin) {
-            $this->acceso = "w";
-            return;
-        }
-
-        # print_r( $access );
-        $this->acceso = query(
-            'SELECT tipo FROM PERMISO_VIEW WHERE ID = :usr AND PAGINA_RUTA ILIKE :ruta',
-            array(
-                ':usr' => $this->user["id"],
-                ':ruta' => $pagina ?? substr(basename($_SERVER['PHP_SELF']), 0, -4)
-            )
-        )["tipo"] ?? 'n';
-    }
-    public function __toString(): string
-    {
-        return "Usuario: {$this->user["nombre"]} ({$this->user["id"]}), Es admin: {$this->admin}, supervisor: {$this->supervisor}, jefe carrera: {$this->jefe_carrera}, profesor: {$this->profesor}";
-    }
-    private static function validaUsuario($user, $pass): bool
-    {
-        file_put_contents('php://stderr', $user);
-        if (in_array($user, ['ad017045']) and $pass == "admin")
-            return true;
-        $client = new nusoap_client('http://200.13.89.2/validacion.php?wsdl', 'wsdl');
-        $client->getError() and die('Error al crear el cliente: ' . $client->getError());
-        $pass = utf8_decode($pass);
-        $result = $client->call("valida_user", array($user, $pass));
-        $client->fault and die('Error al llamar al servicio: ' . $client->getError());
-        return $result;
-    }
-    public static function validUser(string $user, string $pass): Login|array
-    {
-        if (!Login::validaUsuario($user, $pass)) {
-            return [
-                'error' => true,
-                'msg' => 'Error al autenticar usuario'
-            ];
-        }
-        global $db;
-
-        if ($db->has("FS_VALIDACLAVEULSA('$user')")) {
-            #die (Login::validaUsuario($user, $pass));
-            $fs_validaclaveulsa = $db->querySingle(
-                'SELECT * FROM FS_VALIDACLAVEULSA(?)',
-                [$user]
-            );
-
-            $user = array(
-                'id' => $fs_validaclaveulsa["id"],
-                'nombre' => $fs_validaclaveulsa["nombre"],
-            );
-            $facultad = array(
-                'facultad_id' => $fs_validaclaveulsa["facultad_id"],
-                'facultad' => $fs_validaclaveulsa["facultad"],
-            );
-            $rol = array(
-                'id' => $fs_validaclaveulsa["rol_id"],
-                'rol' => $fs_validaclaveulsa["rol"]
-            );
-            $supervisor = $db
-                ->join('rol', 'rol.rol_id = usuario.rol_id')
-                ->where('usuario_id', $user["id"])
-                ->where('rol.rol_titulo', 'Supervisor')
-                ->has('usuario');
-            $jefe_carrera = $db->where('usuario_id', $user["id"])->has('usuario_carrera');
-
-            $admin = $fs_validaclaveulsa["is_admin"];
-            $periodo = $fs_validaclaveulsa["periodo_id"];
-
-            return new Login($user, $facultad, $rol, $admin, $periodo, $supervisor, $jefe_carrera, false);
-        } else if ($db->where('profesor_clave', preg_replace('/^do0*/', '', $user))->has("profesor")) {
-            $profesor = $db->where('profesor_clave', preg_replace('/^do0*/', '', $user))->getOne("profesor");
-            $user = array(
-                'id' => $profesor["profesor_clave"],
-                'nombre' => $profesor["profesor_nombre"],
-            );
-            $facultad = $rol = array(
-                'facultad_id' => null,
-                'facultad' => 'Docente',
-            );
-
-            $supervisor = false;
-            $jefe_carrera = false;
-            $admin = false;
-            $periodo = null;
-            // CREATE A COOKIE FOR THE REST OF THE day for example: 23:00 then duration will be 1 hour
-            setcookie("profesor", $user["id"], strtotime('today midnight') + 86400, "/");
-            return new Login($user, $facultad, $rol, $admin, $periodo, $supervisor, $jefe_carrera, true);
-        } else
-            return [
-                'error' => true,
-                'msg' => 'Usuario no encontrado'
-            ];
-    }
-    public static function log_out(): void
-    {
-        session_start();
-        session_destroy();
-    }
+<?php
+ini_set('display_errors', 1);
+ini_set('display_startup_errors', 1);
+error_reporting(E_ALL);
+
+date_default_timezone_set('America/Mexico_City');
+$currentTime = time();
+$endOfDay = strtotime('tomorrow') - 1;
+$remainingTime = $endOfDay - $currentTime;
+
+session_set_cookie_params($remainingTime, '/', $_SERVER['HTTP_HOST'], false, true);
+session_start();
+
+require_once($ruta ?? '') . "include/bd_pdo.php";
+require_once($ruta ?? '') . "class/c_logasistencia.php";
+require_once($ruta ?? '') . "vendor/autoload.php";
+
+
+class Login
+{
+    public string $acceso;
+    public function __construct(public array $user, public array $facultad, public array $rol, public bool $admin, public ?int $periodo, public bool $supervisor, public bool $jefe_carrera, public bool $profesor)
+    {
+    }
+    public function print_to_log(string $desc, array $old = null, array $new = null): void
+    {
+        $log = new classes\LogAsistencias($_ENV["RUTA_RAIZ"]);
+        if ($old)
+            $desc .= " |#| OLD:" . json_encode($old);
+        if ($new)
+            $desc .= " |#| NEW:" . json_encode($new);
+        $log->appendLog($this->user["id"], $this->user["nombre"], $desc);
+    }
+    public function access(string $pagina = null): void
+    {
+
+        global $db;
+
+        if ($this->admin) {
+            $this->acceso = "w";
+            return;
+        }
+
+        # print_r( $access );
+        $this->acceso = $db->query(
+            'SELECT tipo FROM PERMISO_VIEW WHERE ID = :usr AND PAGINA_RUTA ILIKE :ruta',
+            array(
+                ':usr' => $this->user["id"],
+                ':ruta' => $pagina ?? substr(basename($_SERVER['PHP_SELF']), 0, -4)
+            )
+        )["tipo"] ?? 'n';
+    }
+    public function __toString(): string
+    {
+        return "Usuario: {$this->user["nombre"]} ({$this->user["id"]}), Es admin: {$this->admin}, supervisor: {$this->supervisor}, jefe carrera: {$this->jefe_carrera}, profesor: {$this->profesor}";
+    }
+    private static function validaUsuario($user, $pass): bool
+    {
+        file_put_contents('php://stderr', $user);
+        if ($user == 'ad017045' and $pass == "admin")
+            return true;
+
+        $client = new nusoap_client('http://200.13.89.2/validacion.php?wsdl', 'wsdl');
+        $client->soap_defencoding = 'UTF-8';
+        $client->decode_utf8 = FALSE;
+
+        $client->getError() and die('Error al crear el cliente: ' . $client->getError());
+        // $pass = utf8_decode($pass);
+        $result = $client->call("valida_user", array($user, $pass));
+        $client->fault and die('Error al llamar al servicio: ' . $client->getError());
+        return $result;
+    }
+    public static function validUser(string $user, string $pass): Login|array
+    {
+        if (Login::validaUsuario($user, $pass) === false) {
+            return [
+                'error' => true,
+                'msg' => 'Error al autenticar usuario'
+            ];
+        }
+        global $db;
+
+        if ($db->has("FS_VALIDACLAVEULSA('$user')")) {
+            #die (Login::validaUsuario($user, $pass));
+            $fs_validaclaveulsa = $db->querySingle(
+                'SELECT * FROM FS_VALIDACLAVEULSA(?)',
+                [$user]
+            );
+
+            $user = array(
+                'id' => $fs_validaclaveulsa["id"],
+                'nombre' => $fs_validaclaveulsa["nombre"],
+                'clave' => $db->where('usuario_id', $fs_validaclaveulsa["id"])->getOne("usuario")["usuario_clave"]
+            );
+            $facultad = array(
+                'facultad_id' => $fs_validaclaveulsa["facultad_id"],
+                'facultad' => $fs_validaclaveulsa["facultad"],
+            );
+            $rol = array(
+                'id' => $fs_validaclaveulsa["rol_id"],
+                'rol' => $fs_validaclaveulsa["rol"]
+            );
+            $supervisor = $db
+                ->join('rol', 'rol.rol_id = usuario.rol_id')
+                ->where('usuario_id', $user["id"])
+                ->where('rol.rol_titulo', 'Supervisor')
+                ->has('usuario');
+            $jefe_carrera = $db->where('usuario_id', $user["id"])->has('usuario_carrera');
+
+            $admin = $fs_validaclaveulsa["is_admin"];
+            $periodo = $fs_validaclaveulsa["periodo_id"];
+
+            return new Login($user, $facultad, $rol, $admin, $periodo, $supervisor, $jefe_carrera, false);
+        } else if ($db->where('profesor_clave',     preg_replace('/^do0*/', '', $user), 'ilike')->has("profesor")) {
+            $profesor = $db->where('profesor_clave', preg_replace('/^do0*/', '', $user), 'ilike')->getOne("profesor");
+            $user = array(
+                'id' => $profesor["profesor_clave"],
+                'nombre' => $profesor["profesor_nombre"],
+            );
+            $facultad = array(
+                'facultad_id' => null,
+                'facultad' => null,
+            );
+            $rol = array(
+                'id' => null,
+                'rol' => 'Docente'
+            );
+
+            // CREATE A COOKIE FOR THE REST OF THE day for example: 23:00 then duration will be 1 hour
+            setcookie("profesor", $user["id"], strtotime('today midnight') + 86400, "/");
+            return new Login($user, $facultad, $rol, admin: false, periodo: null, supervisor: false, jefe_carrera: false, profesor: true);
+        } else
+            return [
+                'error' => true,
+                'msg' => 'Usuario no encontrado'
+            ];
+    }
+    public static function log_out(): void
+    {
+        session_start();
+        session_destroy();
+    }
 }

+ 14 - 14
class/c_menu.php

@@ -1,15 +1,15 @@
-<?php
-class Menu {
-    private array $menu = [];
-
-    public function __construct() {
-        $this->conn = new Connection();
-    }
-
-    public function getMenu() {
-        $sql = "SELECT * FROM menu";
-        $result = $this->conn->getConnection()->query($sql);
-        $this->menu = $result->fetchAll();
-        return $this->menu;
-    }
+<?php
+class Menu {
+    private array $menu = [];
+
+    public function __construct() {
+        $this->conn = new Connection();
+    }
+
+    public function getMenu() {
+        $sql = "SELECT * FROM menu";
+        $result = $this->conn->getConnection()->query($sql);
+        $this->menu = $result->fetchAll();
+        return $this->menu;
+    }
 }

+ 56 - 56
class/connection.php

@@ -1,57 +1,57 @@
-<?php
-define("DB_HOST",($_SERVER["SERVER_NAME"] == "localhost") ? "200.13.89.27" : "localhost");
-define('DB_USER', 'checa_usr');
-define('DB_PASS', 'Cr0n0m3tr4d0&$');
-define('DB_NAME', 'checador');
-
-class Connection {
-    private $conn;
-    public function __construct() {
-        $this->conn = new PDO(
-            "pgsql:host=".DB_HOST.";dbname=".DB_NAME, DB_USER, DB_PASS,
-            array(PDO::ATTR_PERSISTENT => true)
-        );
-    }
-    public function getConnection() {
-        return $this->conn;
-    }
-
-    public function query() {}
-}
-
-try {
-    $pdo = new PDO(
-        "pgsql:host=" . DB_HOST . ";dbname=" . DB_NAME, DB_USER, DB_PASS,
-        array(
-            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
-            PDO::ATTR_PERSISTENT => true
-        )
-    );
-} catch (PDOException $e) {
-    print "Error!: " . $e->getMessage() . "<br/>";
-    die();
-}
-
-function SQL(string $sql, array $params = [])
-{
-    global $pdo;
-    $stmt = $pdo->prepare($sql);
-    foreach ($params as $key => $value) {
-        // bind Parameter
-        $stmt->bindParam($key, $value);
-    }
-    $stmt->execute($params);
-    return $stmt->fetchAll();
-}
-
-function filter_by(array $array, array $fields): array
-{
-    $result = [];
-    foreach ($array as $key => $value) {
-        $result[$key] = [];
-        foreach ($fields as $field) {
-            $result[$key][$field] = $value[$field];
-        }
-    }
-    return $result;
+<?php
+define("DB_HOST",($_SERVER["SERVER_NAME"] == "localhost") ? "200.13.89.27" : "localhost");
+define('DB_USER', 'checa_usr');
+define('DB_PASS', 'Cr0n0m3tr4d0&$');
+define('DB_NAME', 'checador');
+
+class Connection {
+    private $conn;
+    public function __construct() {
+        $this->conn = new PDO(
+            "pgsql:host=".DB_HOST.";dbname=".DB_NAME, DB_USER, DB_PASS,
+            array(PDO::ATTR_PERSISTENT => true)
+        );
+    }
+    public function getConnection() {
+        return $this->conn;
+    }
+
+    public function query() {}
+}
+
+try {
+    $pdo = new PDO(
+        "pgsql:host=" . DB_HOST . ";dbname=" . DB_NAME, DB_USER, DB_PASS,
+        array(
+            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
+            PDO::ATTR_PERSISTENT => true
+        )
+    );
+} catch (PDOException $e) {
+    print "Error!: " . $e->getMessage() . "<br/>";
+    die();
+}
+
+function SQL(string $sql, array $params = [])
+{
+    global $pdo;
+    $stmt = $pdo->prepare($sql);
+    foreach ($params as $key => $value) {
+        // bind Parameter
+        $stmt->bindParam($key, $value);
+    }
+    $stmt->execute($params);
+    return $stmt->fetchAll();
+}
+
+function filter_by(array $array, array $fields): array
+{
+    $result = [];
+    foreach ($array as $key => $value) {
+        $result[$key] = [];
+        foreach ($fields as $field) {
+            $result[$key][$field] = $value[$field];
+        }
+    }
+    return $result;
 }

+ 1612 - 1612
consultar_horario.php

@@ -1,1613 +1,1613 @@
-<?php
-require_once 'class/c_login.php';
-if (!isset($_SESSION['user']))
-    die(header('Location: index.php'));
-
-$user = unserialize($_SESSION['user']);
-$user->access();
-if (!$user->admin && in_array($user->acceso, ['n']))
-    die(header('Location: main.php?error=1'));
-
-$user->print_to_log('Consultar horario');
-
-$write = $user->admin || in_array($user->acceso, ['w']);
-// var_dump($user);
-?>
-<!DOCTYPE html>
-<html lang="en">
-
-<head>
-    <title>Consultar horario |
-        <?= $user->facultad['facultad'] ?? 'General' ?>
-    </title>
-    <meta charset="utf-8">
-    <meta http-equiv="content-type" content="text/plain; charset=UTF-8" />
-    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
-    <?php include_once "import/html_css_files.php"; ?>
-</head>
-<!--  -->
-
-<body style="display: block;">
-    <?php
-    include('include/constantes.php');
-    include("import/html_header.php");
-    html_header("Consultar horario", "Sistema de gestión de checador");
-    ?>
-    <?= "<!-- $user -->" ?>
-    <main class="container content marco content-margin" id="local-app">
-        <section id="message"></section>
-        <?php require('import/periodo.php') ?>
-
-        <!-- Nuevo horario -->
-        <form>
-            <div class="form-group">
-                <div class="form-box">
-                    <?php
-                    #$carreras = query("SELECT * FROM FS_CARRERA WHERE FACULTAD = :fac AND PERIODO = COALESCE(:per, PERIODO) ORDER BY CARRERA", [":fac" => $user->facultad['facultad_id'], ":per" => $user->periodo], single: false);
-                    // repliaction of the query in the database with database class
-                    $nivel = $user->periodo ? $db->where('id', $user->periodo)->getOne('fs_periodo') : false;
-
-                    $carreras = $nivel ? $db
-                        ->orderBy('carrera')
-                        ->where('facultad', $nivel['facultad_id'])
-                        ->where('nivel', $nivel['nivel_id'])
-                        ->get('fs_carrera', 100, 'id, carrera') : [];
-
-                    ?>
-                    <div class="form-group row">
-                        <label for="filter_carrera" class="col-4 col-form-label">Carrera</label>
-                        <div class="col-6 ">
-                            <div id="dlcarrera" class="datalist datalist-select mb-1 w-100">
-                                <div class="datalist-input">Seleccionar carrera</div>
-                                <span class="ing-buscar icono"></span>
-                                <ul style="display:none">
-                                    <?php
-                                    foreach ($carreras as $carrera) {
-                                        ?>
-                                        <li data-id="<?= $carrera['id'] ?>">
-                                            <?= $carrera['carrera'] ?>
-                                        </li>
-                                        <?php
-                                    }
-                                    ?>
-                                </ul>
-                                <input type="hidden" id="filter_carrera" name="carrera" value="">
-                            </div>
-                        </div>
-                    </div>
-
-                    <!-- Grupo -->
-
-                    <div class="form-group row">
-                        <label for="filter_grupo" class="col-4 col-form-label">Grupo</label>
-                        <div class="col-6 ">
-                            <div id="dlgrupo" class="datalist datalist-select mb-1 w-100">
-                                <div class="datalist-input">Seleccionar grupo</div>
-                                <span class="ing-buscar icono"></span>
-                                <ul style="display:none">
-                                </ul>
-                                <input type="hidden" id="filter_grupo" name="grupo" value="">
-                            </div>
-                        </div>
-                    </div>
-
-                    <div class="form-group mt-4 row justify-content-center">
-                        <?php if ($write) { ?>
-                            <button type="button" id="nuevo" class="btn btn-outline-primary ml-4 d-none"
-                                title="Nuevo horario" data-toggle="modal" data-target="#modal-editar">
-                                <span class="ing-mas ing-fw"></span> Nuevo
-                            </button>
-                        <?php } ?>
-                    </div>
-                </div>
-            </div>
-
-        </form>
-        <!-- Horario is a (table with one a cell) within a table 
-        7:15 - 8:45, 8:45 - 10:15, 10:30 - 12:00, 12:00 - 13:30
-        de lunes a viernes, a excepción de que tenga sábado
-    -->
-        <div id="btn-excel-horario" class="mb-2 float-right hidden">
-            <button class="btn btn-outline-secondary " title="Exportar a Excel">
-                <span class="ing-descarga ing-fw"></span> Exportar a Excel
-            </button>
-        </div>
-        <!-- Table responsive -->
-        <div class="table-responsive">
-            <table class="table table-bordered table-sm table-responsive-sm" id="table-horario">
-                <thead class="thead-dark">
-                    <tr id="headers">
-                        <th scope="col" class="text-center">Hora</th>
-                        <th scope="col" class="text-center">Lunes</th>
-                        <th scope="col" class="text-center">Martes</th>
-                        <th scope="col" class="text-center">Miércoles</th>
-                        <th scope="col" class="text-center">Jueves</th>
-                        <th scope="col" class="text-center">Viernes</th>
-                        <th scope="col" class="text-center">Sábado</th>
-                    </tr>
-                </thead>
-                <tbody id="horario"></tbody>
-            </table>
-        </div>
-
-        <div class="modal fade" id="modal-editar" tabindex="-1" aria-labelledby="modal-editar" aria-hidden="true"
-            data-backdrop="static" data-keyboard="false">
-            <div class="modal-dialog modal-dialog-centered modal-lg">
-                <div class="modal-content">
-                    <div class="modal-header">
-                        <h5 class="col-12 modal-title text-center">Horario
-                            <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
-                                <span aria-hidden="true">&times;</span>
-                            </button>
-                        </h5>
-                    </div>
-                    <div class="modal-body">
-                        <section id="message_editar"></section>
-
-                        <!-- Hora inicio CLOCKPICKER -->
-                        <div class="form-box">
-                            <div class="form-group row">
-                                <label for="dli-grupo" class="col-4 col-form-label">Grupo</label>
-                                <div class="col-6">
-                                    <div id="grupoModal" class="datalist datalist-select mb-1 w-100">
-                                        <div class="datalist-input text-center"></div>
-                                        <span class="ing-buscar icono"></span>
-                                        <ul style="display:none">
-                                            <li data-id="" class="text-center">Nuevo grupo</li>
-                                        </ul>
-                                        <input type="hidden" name="dli-grupo" id="dli-grupo" value="" />
-                                    </div>
-                                </div>
-                            </div>
-                            <div class="form-grupo row mb-3">
-                                <div class="col-4"></div>
-                                <div class="col-6">
-                                    <input type="text" id="grupo" name="grupo" value="" class="form-control"
-                                        placeholder="Grupo" required="required" hidden>
-                                    <div class="invalid-feedback">
-                                        Por favor, ingrese un grupo.
-                                    </div>
-                                </div>
-                            </div>
-                            <div class="form-group row">
-                                <label for="materia" class="col-4 col-form-label">Materia</label>
-                                <div class="col-6">
-                                    <input list="lista_materias" name="dlMateria" id="dlMateria"
-                                        class="form-control text-center" placeholder="Materia" required="required">
-                                    <datalist id="lista_materias"></datalist>
-                                    <input type="hidden" id="materia" name="materia" value="">
-                                    <div class="invalid-feedback">
-                                        Por favor, seleccione una materia.
-                                    </div>
-                                </div>
-                            </div>
-
-                            <div class="form-group row">
-                                <label for="editor_hora" class="col-4 col-form-label">Hora</label>
-                                <div class="col-3">
-                                    <div id="dlhora" class="datalist datalist-select mb-1">
-                                        <div class="datalist-input text-center"></div>
-                                        <span class="ing-buscar icono"></span>
-                                        <ul style="display:none">
-                                            <?php foreach (range(7, 21) as $hora) { ?>
-                                                <li data-id='<?= $hora ?>'><?= str_pad($hora, 2, "0", STR_PAD_LEFT) ?></li>
-                                            <?php } ?>
-                                        </ul>
-                                        <input type="hidden" id="selector_horas" name="horas" value="">
-                                    </div>
-                                </div>
-                                <div class="col-3">
-                                    <div id="dlminuto" class="datalist datalist-select mb-1">
-                                        <div class="datalist-input text-center"></div>
-                                        <span class="ing-buscar icono"></span>
-                                        <ul style="display:none">
-                                            <?php foreach (range(0, 45, 15) as $minuto) { ?>
-                                                <li data-id='<?= $minuto ?>'><?= str_pad($minuto, 2, "0", STR_PAD_LEFT) ?>
-                                                </li>
-                                            <?php } ?>
-                                        </ul>
-                                        <input type="hidden" id="selector_minutos" name="minutos" value="">
-                                    </div>
-                                </div>
-                            </div>
-
-                            <!-- Día -->
-                            <div class="form-group row">
-                                <label for="editor_dia" class="col-4 col-form-label">Día</label>
-                                <div class="col-6 ">
-                                    <div id="dldia" class="datalist datalist-select mb-1 w-100">
-                                        <div class="datalist-input">Seleccionar día</div>
-                                        <span class="ing-buscar icono"></span>
-                                        <ul style="display:none">
-                                            <li data-id="1">Lunes</li>
-                                            <li data-id="2">Martes</li>
-                                            <li data-id="3">Miércoles</li>
-                                            <li data-id="4">Jueves</li>
-                                            <li data-id="5">Viernes</li>
-                                            <li data-id="6">Sábado</li>
-                                        </ul>
-                                        <input type="hidden" id="editor_dia" name="dia" value="">
-                                    </div>
-                                </div>
-                            </div>
-
-                            <!-- Duración -->
-                            <div class="form-group row">
-                                <label for="editor_duración" class="col-4 col-form-label">Duración</label>
-                                <div class="col-6 ">
-                                    <div id="dlduración" class="datalist datalist-select mb-1 w-100">
-                                        <div class="datalist-input">Seleccionar duración</div>
-                                        <span class="ing-buscar icono"></span>
-                                        <ul style="display:none">
-                                            <?php
-                                            $duraciones = $db->orderBy('duracion_bloques')->get("duracion");
-                                            foreach ($duraciones as $duración) {
-                                                $nombre = $duración['duracion_nombre'];
-                                                $id = $duración['duracion_id'];
-                                                $bloques = $duración['duracion_bloques'];
-                                                ?>
-                                                <li data-id="<?= $id; ?>" data-bloques="<?= $bloques; ?>"><?= $nombre; ?>
-                                                </li>
-                                                <?php
-                                            }
-                                            ?>
-                                        </ul>
-                                        <input type="hidden" id="editor_duración" name="duración" value="">
-                                    </div>
-                                    <div class="invalid-feedback">
-                                        La duración supera el límite (22:00).
-                                    </div>
-                                </div>
-                            </div>
-
-                            <!-- Profesor -->
-                            <div class="form-group row">
-                                <label for="editor_profesor" class="col-4 col-form-label">Profesor</label>
-                                <div class="col-6">
-                                    <input list="lista_profesores" name="dlProfesor" id="dlProfesor"
-                                        class="form-control" placeholder="Profesor" required="required">
-                                    <div class="valid-feedback">
-                                        Profesor encontrado
-                                    </div>
-                                    <div class="invalid-feedback">
-                                        Profesor no encontrado
-                                    </div>
-                                    <datalist id="lista_profesores">
-                                        <?php
-                                        $profesores = $db->get("profesor");
-                                        foreach ($profesores as $profesor) {
-                                        ?>
-                                            <option data-clave="<?= $profesor['profesor_clave'] ?>" data-profesor="<?= $profesor['profesor_nombre'] ?>" data-id="<?= $id; ?>" value="<?= "{$profesor['profesor_clave']} | {$profesor['profesor_grado']} {$profesor['profesor_nombre']}" ?>"></option>
-                                        <?php
-                                        }
-                                        ?>
-                                    </datalist>
-                                    <ul class="list-group" id="profesores"></ul>
-                                    <input type="hidden" id="editor_profesor" name="profesor" value="">
-                                </div>
-                            </div>
-
-                            <!-- Salón -->
-                            <div class="form-group row">
-                                <label for="editor_salón" class="col-4 col-form-label">Salón</label>
-                                <div class="col-6">
-                                    <input type="text" class="form-control" id="editor_salón" name="salón"
-                                        placeholder="Salón" maxlength="100" required="required">
-                                    <div class="invalid-feedback">
-                                        El salón no puede estar vacío.
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                    <div class="modal-footer">
-                        <button data-id="" type="button" class="btn btn-primary" id="btn-guardar"><i
-                                class="ing-guardar ing"></i> Guardar</button>
-                        <button type="button" class="btn btn-outline-primary" data-dismiss="modal">Cancelar</button>
-                    </div>
-                </div>
-            </div>
-        </div>
-        <div class="modal" id="modal-borrar" tabindex="-1" aria-labelledby="modal-borrar" aria-hidden="true">
-            <div class="modal-dialog modal-dialog-centered modal-lg">
-                <div class="modal-content">
-                    <div class="modal-header">
-                        <h5 class="col-12 modal-title text-center">Horario
-                            <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
-                                <span aria-hidden="true">&times;</span>
-                            </button>
-                        </h5>
-                    </div>
-                    <div class="modal-body text-center">
-                        <h5>¿Está seguro de eliminar el horario?</h5>
-
-                        <div class="form-group mt-4 row justify-content-center" style="gap: 1rem;">
-                            <button id="btn-borrar" type="button" class="btn btn-danger">
-                                <i class="ing-borrar ing"></i>
-                                Borrar
-                            </button>
-
-                            <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancelar</button>
-                        </div>
-
-                    </div>
-                </div>
-            </div>
-        </div>
-        <div class="modal fade" id="modal-choose" tabindex="-1" aria-labelledby="modal-choose" aria-hidden="true">
-            <div class="modal-dialog modal-dialog-centered modal-lg">
-                <div class="modal-content">
-                    <div class="modal-header">
-                        <h5 class="col-12 modal-title text-center">Seleccionar horarios en conflicto
-                            <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
-                                <span aria-hidden="true">&times;</span>
-                            </button>
-                        </h5>
-                    </div>
-                    <div class="modal-body">
-                        <div class="row">
-                            <div class="col-12">
-                                <div class="alert alert-danger" role="alert">
-                                    <h4 class="alert-heading">
-                                        <i class="ing-importante ing"></i>
-                                        ¡Atención!
-                                    </h4>
-                                    <p>Los siguientes horarios tienen conflicto con el horario que intenta guardar.</p>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="row">
-                            <div class="col-12">
-                                <div class="table-responsive">
-                                    <table class="table table-striped table-hover">
-                                        <thead>
-                                            <tr>
-                                                <th scope="col">Hora</th>
-                                                <th scope="col">Materia</th>
-                                                <th scope="col">Profesores</th>
-                                                <th scope="col">Salón</th>
-
-                                                <?php if ($write == "true") { ?>
-                                                    <th class="text-center" scope="col">Editar</th>
-                                                    <th class="text-center" scope="col">Borrar</th>
-                                                <?php } ?>
-
-                                            </tr>
-                                        </thead>
-                                        <tbody id="conflictos">
-                                        </tbody>
-                                    </table>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </main>
-</body>
-<?php
-require_once("import/html_footer.php");
-?>
-<script src="js/scrollables.js"></script>
-
-<script src="js/bootstrap/bootstrap.min.js"></script>
-<!-- use the latest version -->
-<script src="js/moment.js"></script>
-<!-- <script src="js/datalist.js"></script> -->
-<script type="module">
-    import {
-        triggerMessage
-    } from './module/messages.js';
-    var gHorarios = [];
-    var datalists = {
-        día: [document.querySelector('#dldia div'), document.querySelector('#dldia div').innerText],
-        duración: [document.querySelector('#dlduración div'), document.querySelector('#dlduración div').innerText],
-    }
-
-    /**@Auxiliary functions */
-    function listProfesor({
-        id,
-        grado,
-        profesor,
-        clave
-    }) {
-        const lista = document.getElementById("dlProfesor");
-        lista.innerHTML = "";
-        lista.classList.remove("is-invalid");
-        const li = document.createElement('li');
-        li.setAttribute('data-id', id);
-        li.classList.add('list-group-item', 'd-flex', 'justify-content-between', 'align-items-center');
-        li.innerHTML = `${clave} | ${grado ?? ''} ${profesor}`
-
-        const btn = document.createElement('button');
-        btn.setAttribute('type', 'button');
-        btn.classList.add('badge', 'badge-danger', 'badge-pill', 'border-0');
-        btn.onclick = _ => li.remove();
-
-        const i = document.createElement('i');
-        i.classList.add('ing-cancelar');
-        btn.appendChild(i);
-        li.appendChild(btn);
-
-        document.getElementById("profesores").appendChild(li);
-    }
-
-    function compareHours(hora1, hora2) {
-        // parseInt each hour and minute
-        const [h1, m1,] = hora1.split(":").map(x => parseInt(x));
-        const [h2, m2,] = hora2.split(":").map(x => parseInt(x));
-
-        if (h1 > h2)
-            return 1;
-        else if (h1 < h2)
-            return -1;
-        else if (m1 > m2)
-            return 1;
-        else if (m1 < m2)
-            return -1;
-        else
-            return 0;
-    }
-    async function buscarGrupo() {
-        const carrera = document.querySelector("#filter_carrera").value;
-        const grupo = document.querySelector("#filter_grupo").value;
-
-        if (carrera == "" || grupo == "") {
-            triggerMessage("El nombre del grupo y la carrera son requeridos", "Faltan campos");
-            return;
-        }
-        const formData = new FormData();
-
-        formData.append("carrera", carrera);
-        formData.append("grupo", grupo);
-        formData.append("periodo", document.querySelector("#periodo").value);
-        formData.append('facultad', '<?= $user->facultad['facultad_id'] ?>');
-
-        try {
-            gHorarios = [];
-            const {
-                status,
-                horario: horarios,
-            } = await fetch("action/action_horario.php", {
-                method: "POST",
-                body: formData
-            }).then(res => res.json());
-
-            if (status != "success") {
-                triggerMessage(response.message, "Error");
-            }
-            // show the table
-            table.style.display = "table";
-            document.querySelectorAll('.hidden').forEach(element => element.style.display = "block");
-            // clear the table
-            table.innerHTML = empty_table;
-
-            if (horarios.length == 0) {
-                window.location.reload();
-                return;
-            }
-            // fill the table
-            gHorarios = horarios;
-
-            function conflicts(horario1, horario2) {
-                const {
-                    hora: hora_inicio1,
-                    hora_final: hora_final1,
-                    dia: dia1,
-                } = horario1;
-
-                const {
-                    hora: hora_inicio2,
-                    hora_final: hora_final2,
-                    dia: dia2,
-                } = horario2;
-
-
-                // if the days are different, there is no conflict
-                if (dia1 != dia2) {
-                    return false;
-                }
-
-                const compareInicios = compareHours(hora_inicio1, hora_inicio2);
-                const compareFinales = compareHours(hora_final1, hora_final2);
-                const compareInicioFinal = compareHours(hora_inicio1, hora_final2);
-                const compareFinalInicio = compareHours(hora_final1, hora_inicio2);
-
-                // if the horario is inside the other
-                if (compareInicios === 0 || compareFinales === 0)
-                    return true
-                if (compareInicios === 1 && compareInicioFinal === -1)
-                    return true
-                if (compareFinales === -1 && compareFinalInicio === 1)
-                    return true
-
-                // if the horario is outside the other
-                if (compareInicios === -1 && compareFinales === 1)
-                    return true
-
-                return false;
-            }
-            // remove the next 5 cells
-            function removeNextCells(horas, minutos, dia, cells = 5) {
-                [...Array(cells).keys()].map(i => i + 1).forEach(i => {
-                    const minute = (minutos + i * 15)
-                    const next_minute = (minute % 60).toString().padStart(2, "0");
-                    const next_hour = (horas + Math.floor(minute / 60))
-
-                    document.getElementById(`hora-${next_hour}:${next_minute}-${dia}`).remove()
-                });
-            }
-
-            function newBlock(horario, edit = false) {
-                function move(horario, cells) {
-                    const {
-                        hora: hora_inicio,
-                        dia,
-                    } = horario;
-
-                    const [horas, minutos] = hora_inicio.split(":").map(x => parseInt(x));
-
-                    const cell = document.getElementById(`hora-${horas}:${minutos.toString().padStart(2, "0")}-${dia}`);
-
-                    const {
-                        top,
-                        left
-                    } = cell.getBoundingClientRect();
-
-                    const block = document.getElementById(`block-${horario.id}`);
-
-                    block.style.top = `${top}px`;
-                    block.style.left = `${left}px`;
-
-                    removeNextCells(horas, minutos, dia, cells);
-                }
-                const {
-                    id,
-                    materia,
-                    salon,
-                    profesores,
-                    hora: hora_inicio,
-                    dia,
-                    bloques
-                } = horario;
-
-                const [horas, minutos] = hora_inicio.split(":").map(x => parseInt(x));
-                const hora = `${horas}:${minutos.toString().padStart(2, "0")}`;
-                horario.hora = hora;
-
-                const cell = document.getElementById(`hora-${hora}-${dia}`);
-
-
-                cell.dataset.ids = id;
-
-                const float_menu = /*html*/
-                    `<div class="menu-flotante p-2" style="opacity: .7;" >
-                        <a class="mx-2" href="#" data-toggle="modal" data-target="#modal-editar">
-                            <i class="ing-editar ing"></i>
-                        </a>
-                        <a class="mx-2" href="#" data-toggle="modal" data-target="#modal-borrar">
-                            <i class="ing-basura ing" > </i>
-                        </a>
-                    </div>
-                    `
-
-                cell.innerHTML = /*html*/ `
-                <div style="overflow-y: auto; overflow-x: hidden; height: 100%;" id="block-${id}" class="position-absolute w-100 h-100">
-                    <small class="text-gray">${hora}</small> 
-                    <b class="title">${materia}</b> <br>
-                    <br><span>Salón: </span>${salon} <br>
-                    <small class="my-2">
-                        ${profesores.map(({ grado, profesor }) => /*html*/ ` <span class="ing ing-formacion mx-1"></span>${grado ?? ''} ${profesor}`).join("<br>")}
-                    </small>
-                </div>
-                ${edit && float_menu}`
-
-                cell.classList.add("bloque-clase", "position-relative");
-                cell.rowSpan = bloques;
-                // draggable
-                cell.draggable = <?= $write ? "true" : "false" ?>;
-
-                bloques > 0 ? removeNextCells(horas, minutos, dia, bloques - 1) : null;
-            }
-
-            function newConflictBlock(horarios, edit = false) {
-                const first_horario = horarios[0];
-                const [horas, minutos] = first_horario.hora.split(":").map(x => parseInt(x));
-                const hora = `${horas}:${minutos.toString().padStart(2, "0")}`;
-                const ids = horarios.map(horario => horario.id);
-                const cell = document.getElementById(`hora-${hora}-${first_horario.dia}`);
-                if (cell == null) {
-                    console.error(`Error: No se encontró la celda: hora-${hora}-${first_horario.dia}`);
-                    return;
-                }
-                cell.dataset.ids = ids.join(",");
-
-                // replace the content of the cell
-                cell.innerHTML = /* HTML */ `
-                <small class='text-danger'>
-                    ${hora}
-                </small>
-                <div class="d-flex justify-content-center align-items-center mt-4">
-                    <div class="d-flex flex-column justify-content-center align-items-center">
-                        <span class="ing ing-importante text-danger" style="font-size: 2rem;"></span>
-                        <b class='text-danger'>
-                            Empalme de ${ids.length} horarios
-                        </b>
-                        <hr>
-                        <i class="text-danger"> Ver horarios &#8230;</i>
-                    </div>
-                </div>
-                `;
-
-                // the text must be centered
-                // cell.style.backgroundColor = "#f6cfd6";
-                cell.classList.add("conflict", "bloque-clase");
-                // add cursor clickable role = "button"
-                cell.setAttribute("role", "button");
-
-                // add the event listener for the cell
-                cell.addEventListener("click", () => {
-                    $("#modal-choose").modal("show");
-                    const ids = cell.getAttribute("data-ids").split(",").map(x => parseInt(x));
-                    const horarios = gHorarios.filter(horario => ids.includes(horario.id));
-                    const tbody = document.querySelector("#modal-choose tbody");
-                    tbody.innerHTML = "";
-                    horarios.sort((a, b) => compareHours(a.hora, b.hora)).forEach(horario => {
-                        const {
-                            materia,
-                            dia,
-                            hora,
-                            hora_final,
-                            profesores,
-                            salon,
-                            id,
-                        } = horario;
-
-                        // remove the last 00 of the hour
-                        const [horaFmt, hora_finalFmt] = [hora, hora_final].map(hora => hora.slice(0, -3))
-                        const buttons = /* HTML */ `
-                                <td class="text-center">
-                                    <button class="btn btn-sm btn-primary dismiss-editar" data-toggle="modal" data-target="#modal-editar">
-                                        <i class="ing-editar ing"></i>
-                                    </button>
-                                </td>
-                                <td class="text-center">
-                                    <button class="btn btn-sm btn-danger dismiss-editar" data-toggle="modal" data-target="#modal-borrar">
-                                        <i class="ing-basura ing"></i>
-                                    </button>
-                                </td>`
-
-                        tbody.innerHTML += /* HTML */ `
-                            <tr data-ids="${id}">
-                                <td><small>${horaFmt}-${hora_finalFmt}</small></td>
-                                <td>${materia}</td>
-                                <td>
-                                    ${profesores.map(({ grado, profesor }) => `${grado ?? ''} ${profesor}`).join(", ")}
-                                </td>
-                                <td>${salon}</td>
-                                ${edit ? buttons : ""}
-                            </tr>`;
-                    });
-
-                    document.querySelectorAll(".dismiss-editar").forEach(btn => {
-                        btn.addEventListener("click", () => $("#modal-choose").modal("hide"));
-                    });
-
-                });
-
-                // blocks is (firsthour - lasthour) / 15 minutes
-                // sum the duracion_bloques of each horario
-                function getDuration(hora_i, hora_f) {
-                    const [horas_i, minutos_i] = hora_i.split(":").map(x => parseInt(x));
-                    const [horas_f, minutos_f] = hora_f.split(":").map(x => parseInt(x));
-                    const date_i = new Date(0, 0, 0, horas_i, minutos_i);
-                    const date_f = new Date(0, 0, 0, horas_f, minutos_f);
-                    const diff = date_f - date_i;
-                    return diff / (1000 * 60 * 15);
-                }
-
-                const lastHorario = horarios[horarios.length - 1];
-                // remove the next cells
-                // get the max hora_final
-                const maxHoraFinal = horarios.reduce((max, horario) => {
-                    const [horas, minutos] = horario.hora_final.split(":").map(x => parseInt(x));
-                    const date = new Date(0, 0, 0, horas, minutos);
-                    return date > max ? date : max;
-                }, new Date(0, 0, 0, 0, 0));
-
-                const blocks = getDuration(first_horario.hora, `${maxHoraFinal.getHours()}:${maxHoraFinal.getMinutes()}`);
-                cell.rowSpan = blocks
-                removeNextCells(horas, minutos, first_horario.dia, blocks - 1);
-            }
-
-            const conflictBlocks = horarios.filter((horario, index, arrayHorario) =>
-                arrayHorario.filter((_, i) => i != index).some(horario2 =>
-                    conflicts(horario, horario2)))
-                .sort((a, b) => compareHours(a.hora, b.hora));
-
-            const classes = horarios.filter(horario => !conflictBlocks.includes(horario));
-
-            const conflictBlocksPacked = []; // array of sets
-            conflictBlocks.forEach(horario => {
-                const setIndex = conflictBlocksPacked.findIndex(set => set.some(horario2 => conflicts(horario, horario2)));
-                if (setIndex === -1) {
-                    conflictBlocksPacked.push([horario]);
-                } else {
-                    conflictBlocksPacked[setIndex].push(horario);
-                }
-            })
-
-            classes.forEach(horario =>
-                newBlock(horario, <?= $write ?>)
-            )
-
-            conflictBlocksPacked.forEach(horarios =>
-                newConflictBlock(horarios, <?= $write ?>)
-            )
-
-            // remove the elements that are not in the limits
-            let max_hour = Math.max(...horarios.map(horario => {
-                const lastMoment = moment(horario.hora, "HH:mm").add(horario.bloques * 15, "minutes");
-                const lastHour = moment(`${lastMoment.hours()}:00`, "HH:mm");
-                const hourInt = parseInt(lastMoment.format("HH"));
-
-                return lastMoment.isSame(lastHour) ? hourInt - 1 : hourInt;
-            }));
-
-            let min_hour = Math.min(...horarios.map(horario => parseInt(horario.hora.split(":")[0])));
-
-            document.querySelectorAll("tbody#horario tr").forEach(hora => {
-                const hora_id = parseInt(hora.id.split("-")[1].split(":")[0]);
-                (hora_id < min_hour || hora_id > max_hour) ? hora.remove() : null;
-            })
-
-            // if there is no sábado, remove the column
-            if (!horarios.some(horario => horario.dia == "sábado")) {
-                document.querySelectorAll("tbody#horario td").forEach(td => {
-                    if (td.id.split("-")[2] == "sábado") {
-                        td.remove();
-                    }
-                });
-
-                // remove the header (the last)
-                document.querySelector("#headers").lastElementChild.remove();
-            }
-            // adjust width
-            const ths = document.querySelectorAll("tr#headers th");
-            ths.forEach((th, key) =>
-                th.style.width = (key == 0) ? "5%" : `${95 / (ths.length - 1)}%`
-            );
-
-            // search item animation
-            const menúFlontantes = document.querySelectorAll(".menu-flotante");
-            menúFlontantes.forEach((element) => {
-                element.classList.add("d-none");
-                element.parentElement.addEventListener("mouseover", () =>
-                    element.classList.remove("d-none")
-                );
-                element.parentElement.addEventListener("mouseout", (e) =>
-                    element.classList.add("d-none")
-                );
-            });
-
-        } catch (error) {
-            triggerMessage("Error al cargar el horario", "Error");
-            triggerMessage(error, "Error");
-        }
-
-        // droppables
-        // forall the .bloque-elements add the event listeners for drag and drop
-        <?php if ($write): ?>
-            document.querySelectorAll(".bloque-clase").forEach(element => {
-                function dragStart() {
-                    this.classList.add("dragging");
-                }
-
-                function dragEnd() {
-                    this.classList.remove("dragging");
-                }
-
-                element.addEventListener("dragstart", dragStart);
-                element.addEventListener("dragend", dragEnd);
-            });
-
-        // forall the cells that are not .bloque-clase add the event listeners for drag and drop
-        document.querySelectorAll("td:not(.bloque-clase)").forEach(element => {
-            function dragOver(e) {
-                e.preventDefault();
-                this.classList.add("dragging-over");
-            }
-
-            function dragLeave() {
-                this.classList.remove("dragging-over");
-            }
-
-            function drop() {
-                this.classList.remove("dragging-over");
-                const dragging = document.querySelector(".dragging");
-
-                const id = /* for data-ids */ dragging.getAttribute("data-ids");
-                const hora = /* for data-hora */ this.id.split("-")[1];
-                const días = ["lunes", "martes", "miércoles", "jueves", "viernes", "sábado"];
-                let día = /* for data-dia */ this.id.split("-")[2];
-                día = días.indexOf(día) + 1;
-
-                //  rowspan
-                const bloques = parseInt(dragging.getAttribute("rowspan"));
-                const horaMoment = moment(hora, "HH:mm");
-                const horaFin = horaMoment.add(bloques * 15, "minutes");
-
-                const limit = moment('22:00', 'HH:mm');
-
-                if (horaFin.isAfter(limit)) {
-                    triggerMessage("No se puede mover el bloque a esa hora", "Error");
-
-                    // scroll to the top
-                    window.scrollTo(0, 0);
-                    return;
-                }
-
-                // get the horario
-                // remove the horario
-                const bloque = document.querySelector(`.bloque-clase[data-ids="${id}"]`);
-
-                // remove all children
-                while (bloque.firstChild) {
-                    bloque.removeChild(bloque.firstChild);
-                }
-
-                // prepend a loading child
-                const loading = `<div class="spinner-border" role="status" style="width: 3rem; height: 3rem;">
-                                        <span class="sr-only">Loading...</span>
-                                    </div>`;
-                bloque.insertAdjacentHTML("afterbegin", loading);
-                // add style vertical-align: middle
-                bloque.style.verticalAlign = "middle";
-                bloque.classList.add("text-center");
-                // remove draggable
-                bloque.removeAttribute("draggable");
-
-                moveHorario(id, día, hora);
-            }
-
-            element.addEventListener("dragover", dragOver);
-            element.addEventListener("dragleave", dragLeave);
-            element.addEventListener("drop", drop);
-        });
-        <?php endif; ?>
-    }
-    async function guardar(id) {
-        const btn = document.querySelector("#btn-guardar");
-        const clone = btn.cloneNode(true);
-
-        const data = {
-            dia: document.querySelector("#editor_dia"),
-            salon: document.querySelector("#editor_salón"),
-            //vprofesor: document.querySelector("#editor_profesor"),
-            duración: document.querySelector("#editor_duración")
-        };
-
-        const dia = data.dia.value;
-        const salon = data.salon.value;
-
-        if (salon == "") {
-            return;
-        }
-
-        const hora = document.querySelector("#selector_horas").value;
-        const minutos = document.querySelector("#selector_minutos").value;
-        const bloques = document.querySelector("#dlduración li.selected")?.getAttribute("data-bloques");
-
-        if (bloques == null) {
-            document.querySelector("#dlduración").classList.add("is-invalid");
-            return;
-        }
-
-        const start = moment(`${hora}:${minutos}`, "HH:mm").add(bloques * 15, "minutes");
-        const end = moment("22:00", "HH:mm");
-
-        if (start.isAfter(end)) {
-            document.querySelector("#dlduración").classList.add("is-invalid");
-            return;
-        }
-
-        const profesoresList = [...document.querySelectorAll("#profesores li")];
-
-        if (profesoresList.length == 0) {
-            return;
-        }
-
-        const formData = new FormData();
-        // const id = btn.getAttribute("data-id");
-        formData.append("id", id);
-        formData.append("hora", `${hora}:${minutos}`);
-        formData.append("día", dia);
-        formData.append("salón", salon);
-        const profesores = profesoresList.map(li => li.getAttribute("data-id"));
-        formData.append("duración", data.duración.value);
-        formData.append("profesores", profesores.join(","));
-
-        // loading btn
-        btn.innerHTML = 'Guardando...';
-        // disable btn
-        btn.disabled = true;
-
-        const response = await fetch("action/action_horario_update.php", {
-            method: "POST",
-            body: formData
-        }).then(res => res.json());
-
-        if (response.status == "success") {
-            triggerMessage("Horario actualizado", "Éxito", "success");
-            btn.innerHTML = '<i class="ing-aceptar ing"></i> Guardado';
-            btn.classList.add("btn-success");
-            btn.classList.remove("btn-primary");
-
-            // return to the initial state
-            setTimeout(() => {
-                buscarGrupo();
-                btn.replaceWith(clone);
-                $("#modal-editar").modal("hide");
-            }, 100);
-        } else {
-            triggerMessage(response.message, "Error");
-            btn.replaceWith(clone);
-
-            $("#modal-editar").modal("hide");
-        }
-
-    }
-    async function borrarHorario(id) {
-        const btn = document.querySelector("#btn-borrar");
-        const clone = btn.cloneNode(true);
-
-        const formData = new FormData();
-        formData.append("id", id);
-
-        const response = await fetch("action/action_horario_delete.php", {
-            method: "POST",
-            body: formData
-        }).then(res => res.json());
-
-        if (response.status == "success") {
-            triggerMessage('Horario borrado', "Éxito", "success");
-            btn.innerHTML = '<i class="ing-aceptar ing"></i> Borrado';
-            btn.classList.add("btn-success");
-            btn.classList.remove("btn-danger");
-
-            // return to the initial state
-            setTimeout(() => {
-                buscarGrupo();
-                btn.replaceWith(clone);
-                $("#modal-borrar").modal("hide");
-            }, 1000);
-        } else {
-            triggerMessage(response.message, "Error");
-            btn.replaceWith(clone);
-
-            $("#modal-borrar").modal("hide");
-        }
-
-    }
-    function guardarHorario() {
-        let goBack = false;
-        const data = {
-            grupo: document.querySelector("#grupo"),
-            dia: document.querySelector("#editor_dia"),
-            salon: document.querySelector("#editor_salón"),
-            profesor: document.querySelector("#new_profesor"),
-            duración: document.querySelector("#editor_duración"),
-            materia: document.querySelector("#dlMateria")
-        };
-
-        const dia = data.dia.value;
-        const salon = data.salon.value;
-        const profesor = data.profesor.value;
-        const materia = data.materia.value;
-        const duración = data.duración.value;
-
-        if (duración == "") {
-            invalidDatalist("#new_duración");
-            goBack = true;
-        }
-
-        if (profesor == "") {
-            data.profesor.classList.add("is-invalid");
-            goBack = true;
-        }
-
-        if (salon == "") {
-            data.salon.classList.add("is-invalid");
-            goBack = true;
-        }
-
-        if (dia == "") {
-            invalidDatalist("#new_dia");
-            goBack = true;
-        }
-
-        if (materia == "") {
-            data.materia.classList.add("is-invalid");
-            goBack = true;
-        }
-
-        const hora = document.querySelector("#new_horas").value;
-        if (hora == "") {
-            invalidDatalist("#new_horas");
-            goBack = true;
-        }
-        const minutos = document.querySelector("#new_minutos").value;
-        if (minutos == "") {
-            invalidDatalist("#new_minutos");
-            goBack = true;
-        }
-
-        const bloques = document.querySelector("#dlNewDuración li.selected")?.getAttribute("data-bloques");
-        const start = moment(`${hora}:${minutos}`, "HH:mm").add(bloques * 15, "minutes");
-        const end = moment("22:00", "HH:mm");
-
-        if (start.isAfter(end)) {
-            document.querySelector("#dlNewDuración").classList.add("is-invalid");
-            goBack = true;
-        }
-
-        if (goBack) {
-            return;
-        }
-
-        const formData = new FormData();
-        formData.append("grupo", document.querySelector("#filter_grupo").value);
-        formData.append("hora", `${hora}:${minutos}`);
-        formData.append("día", dia);
-        formData.append("salón", salon);
-        formData.append("profesor", profesor);
-        formData.append("duración", data.duración.value);
-        formData.append("periodo", "<?= $user->periodo ?>");
-        formData.append("materia", materia);
-        formData.append("facultad", "<?= $user->facultad['facultad_id'] ?>");
-
-
-        fetch("action/action_horario_create.php", {
-            method: "POST",
-            body: formData
-        }).then(res => res.json()).then(response => {
-            const carrera = document.querySelector("#dlcarrera li.selected")
-            // call it's click event
-            carrera?.click();
-            if (response.status == "success") {
-                triggerMessage("Horario guardado", "Éxito", "success");
-                btn.innerHTML = /* html */ `<i class="ing-aceptar ing"></i> Guardado`;
-                btn.classList.add("btn-success");
-                btn.classList.remove("btn-primary");
-
-                // return to the initial state
-                setTimeout(() => {
-                    btn.classList.remove("btn-success");
-                    btn.classList.add("btn-primary");
-
-
-                    // this modal
-                    $("#modal-nuevo").modal("hide");
-                    const modalNuevo = document.querySelector("#modal-nuevo");
-                    modalNuevo.querySelectorAll("input").forEach(input => {
-                        input.value = "";
-                    });
-
-                    // reset the datalist
-                    modalNuevo.querySelectorAll(".datalist").forEach(datalist => {
-                        const cloneDatalist = modalNuevoClone.querySelector(`#${datalist.id}`).cloneNode(true);
-                        // log
-                        datalist.replaceWith(cloneDatalist);
-                    });
-                    // remove all is-valid and is-invalid
-                    modalNuevo.querySelectorAll(".is-valid, .is-invalid").forEach(el => {
-                        el.classList.remove("is-valid", "is-invalid");
-                    });
-
-                }, 100);
-            } else {
-                triggerMessage(response.message, "Error");
-                $("#modal-nuevo").modal("hide");
-            }
-        }).then(() => {
-            buscarGrupo();
-        }).catch(err => {
-            triggerMessage(err, "Error");
-
-            $("#modal-nuevo").modal("hide");
-        });
-
-        // buscarGrupo();
-    }
-    function moveHorario(id, día, hora) {
-
-        const formData = new FormData();
-
-        formData.append("id", id);
-        formData.append("hora", hora);
-        formData.append("día", día);
-
-        fetch("action/action_horario_update.php", {
-            method: "POST",
-            body: formData
-        }).then(res => res.json()).then(response => {
-            if (response.status == "success") {
-                triggerMessage("Horario movido", "Éxito", "success");
-            } else {
-                triggerMessage(response.message, "Error");
-            }
-        }).then(() => {
-            buscarGrupo();
-        }).catch(err => {
-            triggerMessage(err, "Error");
-        });
-
-    }
-    function extractFromModal() {
-        // remove all is-valid and is-invalid
-        document.querySelectorAll(".is-valid, .is-invalid").forEach(el =>
-            el.classList.remove("is-valid", "is-invalid")
-        );
-        let goBack = false;
-        const modalNuevo = document.querySelector("#modal-nuevo");
-        const data = {
-            dia: document.querySelector("#editor_dia"),
-            salon: document.querySelector("#editor_salón"),
-            duración: document.querySelector("#editor_duración")
-        };
-
-        const dia = data.dia.value;
-        const salon = data.salon.value;
-        const hora = document.querySelector("#selector_horas").value;
-        const minutos = document.querySelector("#selector_minutos").value;
-        const bloques = document.querySelector("#dlduración li.selected")?.getAttribute("data-bloques");
-        const materia = document.querySelector("#dlMateria");
-        const grupo = document.querySelector("input#grupo");
-
-        const start = moment(`${hora}:${minutos}`, "HH:mm").add(bloques * 15, "minutes");
-        const end = moment("22:00", "HH:mm");
-        const profesoresList = [...document.querySelectorAll("#profesores li")];
-
-        if (data.duración.value == "") {
-            invalidDatalist("#editor_duración");
-            goBack = true;
-        }
-
-        if (dia == "") {
-            invalidDatalist("#editor_dia");
-            goBack = true;
-        }
-
-        if (start.isAfter(end)) {
-            document.querySelector("#dlduración").classList.add("is-invalid");
-            goBack = true;
-        }
-
-        if (salon == "") {
-            data.salon.classList.add("is-invalid");
-            goBack = true;
-        }
-
-        if (profesoresList.length == 0) {
-            document.querySelector("#dlProfesor").classList.add("is-invalid");
-            goBack = true;
-        }
-
-        if (materia.value == "" || materia.classList.contains("is-invalid")) {
-            document.querySelector("#dlMateria").classList.add("is-invalid");
-            goBack = true;
-        }
-
-        if (grupo.value == "") {
-            grupo.classList.add("is-invalid");
-            goBack = true;
-        }
-
-
-        if (goBack) return null;
-
-        const materia_id = document.querySelector(`#lista_materias option[value="${materia.value}"]`).getAttribute("data-id");
-
-        const formData = new FormData();
-        formData.append("hora", `${hora}:${minutos}`);
-        formData.append("día", dia);
-        formData.append("salón", salon);
-        const profesores = profesoresList.map(li => li.getAttribute("data-id"));
-        formData.append("duración", data.duración.value);
-        formData.append("profesores", profesores.join(","));
-        formData.append("materia", materia_id);
-
-        return formData;
-    }
-    function resetFormModal() {
-        const modalNuevo = document.querySelector("#modal-editar");
-        modalNuevo.querySelectorAll("input").forEach(input => input.value = "");
-
-        // remove all is-valid and is-invalid
-        modalNuevo.querySelectorAll(".is-valid, .is-invalid").forEach(el => el.classList.remove("is-valid", "is-invalid"));
-        modalNuevo.querySelectorAll(".datalist-invalid").forEach(el => el.classList.remove("datalist-invalid"));
-        modalNuevo.querySelector("#profesores").innerHTML = "";
-
-        // reset the datalist
-        for (var key in datalists)
-            datalists[key][0].innerText = datalists[key][1];
-        // remove disabled attribute
-        modalNuevo.querySelectorAll("[disabled]").forEach(el => el.removeAttribute("disabled"));
-        // remove bg-info
-        modalNuevo.querySelectorAll(".bg-info").forEach(el => el.classList.remove("bg-info"));
-    }
-    function insertHorario(horario) {
-        const fetchOptions = {
-            method: "POST",
-            body: horario
-        };
-
-        return fetch("action/action_horario_create.php", fetchOptions).then(res => res.json()).then(response => {
-            if (response.status == "success") {
-                triggerMessage("Horario insertado", "Éxito", "success");
-            } else {
-                triggerMessage(response.message, "Error");
-            }
-        }).then(() => {
-            // if the table isn't displayed, just show a message
-            if (table.style.display == "none") {
-                triggerMessage("Horario insertado", "Éxito", "success");
-                return;
-            }
-
-            buscarGrupo();
-        }).catch(err => {
-            triggerMessage(err, "Error");
-        });
-    }
-    // initial state
-    {
-        // fill the table with empty cells
-        [...Array(16).keys()].map(x => x + 7).forEach(hora => {
-            // add 7 rows for each hour
-            [0, 15, 30, 45].map(minute => minute.toString().padStart(2, '0')).forEach(minute => {
-                const tr = document.createElement("tr");
-                tr.id = `hora-${hora}:${minute}`;
-                tr.classList.add(hora > 13 ? "tarde" : "mañana");
-                if (minute == 0) {
-                    const th = document.createElement("th");
-                    th.classList.add("text-center");
-                    th.scope = "row";
-                    th.rowSpan = 4;
-                    th.innerText = `${hora}:00`;
-                    th.style.verticalAlign = "middle";
-                    tr.appendChild(th);
-                }
-
-                ["lunes", "martes", "miércoles", "jueves", "viernes", "sábado"].forEach(día => {
-                    const td = document.createElement("td");
-                    td.id = `hora-${hora}:${minute}-${día}`;
-                    tr.appendChild(td);
-                });
-                document.querySelector("tbody#horario").appendChild(tr);
-            });
-        })
-
-        // add an inital height to the table cells
-        // query selector All tds and ths inside the tbody#horario
-        // previous query selector: "tbody#horario td, tbody#horario tr"
-        document.querySelectorAll("tbody#horario td, tbody#horario tr").forEach(element => element.style.height = "2.5rem");
-        document.getElementById('dlProfesor').addEventListener('input', function (e) {
-            var input = document.getElementById('dlProfesor');
-            var value = input.value;
-            var option = document.querySelector(`option[value="${value}"]`);
-
-            if (value == "") {
-                input.classList.remove("is-invalid");
-                return;
-            }
-
-            if (!option) {
-                document.getElementById('editor_profesor').value = "";
-                // remove is valid class
-                input.classList.remove("is-valid");
-                // add is invalid class
-                input.classList.add("is-invalid");
-                return
-            }
-
-            var id = option.getAttribute('data-id');
-            if (!document.querySelector(`li[data-id="${id}"]`))
-                listProfesor({
-                    id: id,
-                    grado: option.getAttribute('data-grado'),
-                    profesor: option.getAttribute('data-profesor'),
-                    clave: option.getAttribute('data-clave')
-                });
-            e.target.value = "";
-        });
-        document.getElementById('dlMateria').addEventListener('input', function (e) {
-            var input = document.getElementById('dlMateria');
-            var value = input.value;
-            var option = document.querySelector(`option[value="${value}"]`);
-
-            if (value == "") {
-                input.classList.remove("is-invalid");
-                return;
-            }
-
-            if (!option) {
-                // remove is valid class
-                input.classList.remove("is-valid");
-                // add is invalid class
-                input.classList.add("is-invalid");
-                return;
-            }
-
-            input.classList.remove("is-invalid");
-        });
-    }
-
-    // state
-    const table = document.querySelector("table");
-    const empty_table = table.innerHTML;
-    document.querySelectorAll('.hidden').forEach(element => element.style.display = "none");
-    // hide the table
-    table.style.display = "none";
-    disableDatalist("#filter_grupo");
-
-    document.getElementById("btn-excel-horario").addEventListener("click", () => {
-        const formData = new FormData();
-        const grupo = document.getElementById("filter_grupo").value;
-        formData.append("grupo", grupo);
-        formData.append('sábado', gHorarios.some(horario => horario.dia == "sábado"));
-        formData.append("horarios", JSON.stringify(gHorarios));
-        // min and max hour
-        formData.append("min", gHorarios.reduce((min, horario) => {
-            const hora = horario.hora.split(":").map(x => parseInt(x))[0]
-            return Math.min(hora, min);
-        }, 24));
-        formData.append("max", gHorarios.reduce((max, horario) => {
-            const {
-                hora,
-                bloques
-            } = horario;
-            // after hour
-            const lastHour = moment(hora, "HH:mm").add(bloques * 15, "minutes");
-            const lastMoment = moment(`${lastHour.format("HH")}:00`, "HH:mm");
-            const intHour = parseInt(lastHour.format("HH"));
-
-            return Math.max(lastMoment.isSame(lastHour) ? intHour - 1 : intHour, max);
-        }, 0));
-
-        fetch("export/horario_excel.php", {
-            method: "POST",
-            body: formData
-        })
-            .then(response => response.blob())
-            .then(blob => {
-                const url = window.URL.createObjectURL(blob);
-                const a = document.createElement('a');
-                a.style.display = 'none';
-                a.setAttribute('href', url);
-                a.setAttribute('download', `horario-${grupo}.xlsx`);
-                document.body.appendChild(a);
-                a.click();
-                window.URL.revokeObjectURL(url);
-            })
-            .catch(() => triggerMessage("error", "Error al exportar el horario"));
-    });
-    // on click the li element, inside datalist #dlcarera
-    document.querySelectorAll("#dlcarrera li").forEach(async li => {
-        li.addEventListener("click", async () => {
-            // get the data-id from the li element
-            const carrera = li.getAttribute("data-id");
-            const facultad = '<?= $user->facultad['facultad_id'] ?>';
-            const periodo = '<?= $user->periodo ?>';
-
-            const formData = new FormData();
-            formData.append("carrera", carrera);
-            formData.append("facultad", facultad);
-            formData.append("periodo", periodo);
-
-            const dlgrupo = document.querySelector("#dlgrupo ul");
-            const grupoModal = document.querySelector("#grupoModal ul");
-            const promptDL = document.querySelector("#dlgrupo .datalist-input");
-
-            try {
-                const {
-                    status,
-                    grupos
-                } = await fetch("action/action_grupo.php", {
-                    method: "POST",
-                    body: formData
-                }).then(res => res.json());
-
-                dlgrupo.innerHTML = "";
-
-                if (status != "success") {
-                    throw new Error("Error al cargar los grupos");
-                } else if (grupos.length == 0) {
-                    throw new Error("No hay grupos para esta carrera, puedes crear uno nuevo");
-                }
-
-                document.getElementById("message").innerHTML = "";
-                grupoModal.querySelectorAll("li:not(:first-child)").forEach(li => li.remove());
-                document.querySelector("#grupo").setAttribute("hidden", true);
-                grupos.forEach(grupo => {
-                    const li = document.createElement("li");
-                    // data-id is the id of the group
-                    li.setAttribute("data-id", grupo);
-                    li.textContent = grupo;
-                    dlgrupo.appendChild(li);
-                    li.addEventListener("click", async () => await setTimeout(buscarGrupo, 0))
-
-                    // remove from grupoModal all the li elements except the first one
-                    grupoModal.appendChild(li.cloneNode(true));
-                });
-
-                // on click the li element, inside datalist #grupoModal
-                document.querySelectorAll("#grupoModal li").forEach(li => {
-                    li.addEventListener("click", () => {
-                        const grupo = li.getAttribute("data-id");
-                        const filter_grupo = document.querySelector("#grupo");
-                        filter_grupo.classList.remove("is-invalid");
-                        if (grupo == "")
-                            filter_grupo.removeAttribute("hidden");
-                        else
-                            filter_grupo.setAttribute("hidden", true);
-                        filter_grupo.value = grupo;
-                    });
-                });
-                disableDatalist("#filter_grupo", false);
-
-            } catch (error) {
-                // remove Error: from the error message
-                error = error.toString().replace("Error: ", "");
-                triggerMessage(error, "Error", "warning");
-                console.error(error);
-                disableDatalist("#filter_grupo", true);
-            } finally {
-                document.querySelector("#nuevo").classList.remove("d-none");
-                // write Seleccionar grupo
-                promptDL.textContent = "Seleccionar grupo";
-                console.log(promptDL);
-                // to #filter_grupo input value
-                const filter_grupo = document.querySelector("#filter_grupo");
-                filter_grupo.value = "";
-                table.style.display = "none";
-            }
-
-            const datalist = document.querySelector("#materias");
-            const materias = await fetch("action/action_materias.php", {
-                method: "POST",
-                body: formData
-            }).then(res => res.json());
-        });
-
-    })
-    // on modal edit, show the data
-    $("#modal-editar").on("show.bs.modal", async function (event) {
-        document.querySelectorAll("#modal-editar .is-invalid, #modal-editar .is-valid")?.forEach(element => element.classList.remove("is-invalid", "is-valid"));
-
-
-        const button = event.relatedTarget;
-        const parentId = button.parentElement.parentElement.getAttribute("data-ids");
-        const grupo = document.querySelector("#filter_grupo").value;
-        setDatalist("#dli-grupo", grupo);
-        document.querySelector("#grupo").value = grupo;
-        document.querySelector("#grupo").setAttribute("hidden", true);
-
-        if (parentId == null) {
-            resetFormModal();
-            disableDatalist("#dli-grupo", false);
-            setDatalist("#dli-grupo", grupo);
-            document.querySelector("#grupo").value = grupo;
-            if (grupo == "")
-                document.querySelector("#grupo").removeAttribute("hidden");
-
-            // search the data-id of the day and click it
-            setDatalistFirst("#selector_horas");
-            setDatalist("#selector_minutos", 15);
-            const input_materia = document.getElementById('dlMateria');
-            const formData = new FormData();
-            formData.append("carrera", document.querySelector("#filter_carrera").value);
-
-            try {
-                const {
-                    status,
-                    materias,
-                } = await fetch("action/action_materias.php", {
-                    method: "POST",
-                    body: formData
-                }).then(res => res.json());
-
-                if (status != "success")
-                    throw new Error("Error al cargar las materias");
-                else if (materias.length == 0)
-                    throw new Error("No hay materias para esta carrera");
-
-                const dlMateria = document.querySelector("#lista_materias");
-                dlMateria.innerHTML = "";
-                materias.forEach(materia => {
-                    const option = document.createElement("option");
-                    option.setAttribute("data-id", materia.id);
-                    option.setAttribute("value", materia.nombre);
-                    dlMateria.appendChild(option);
-                });
-
-            } catch (error) {
-                // remove Error: from the error message
-                error = error.toString().replace("Error: ", "");
-                triggerMessage(error, "Error, no se pudo cargar las materias");
-                console.error(error);
-            }
-
-            const btnGuardar = document.getElementById('btn-guardar');
-            // btnGuardar.onclick = () => guardar(id);
-
-
-            btnGuardar.onclick = async () => {
-                const formData = extractFromModal();
-                if (formData == null)
-                    return;
-                // check if a field is empty
-                for (const value of formData.values())
-                    if (value == "")
-                        return triggerMessage("Todos los campos son obligatorios", "Error", "danger", "message_editar", true);
-                formData.append("facultad", <?= $user->facultad['facultad_id'] ?>);
-                formData.append("periodo", <?= $user->periodo ?>);
-                formData.append("grupo", document.querySelector("input#grupo").value);
-
-                await insertHorario(formData);
-                resetFormModal();
-                $("#modal-editar").modal("hide");
-            };
-
-            return;
-        }
-        const {
-            id,
-            dia,
-            hora,
-            materia,
-            salon,
-            profesores,
-            duracion
-        } = gHorarios?.find(horario => horario.id == parentId);
-
-        // search the data-id of the day and click it
-        const númeroDía = ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'].reduce((acc, curr, key) => (curr == dia) ? key : acc);
-        document.querySelector(`#dldia li[data-id="${númeroDía}"]`)?.click();
-        document.querySelector(`#dlduración li[data-id="${duracion}"]`)?.click();
-        const horas = hora.split(":")[0];
-        const minutos = hora.split(":")[1];
-        setDatalist("#selector_horas", horas);
-        setDatalist("#selector_minutos", minutos);
-        document.getElementById('editor_salón').value = salon;
-        const input_materia = document.getElementById('dlMateria');
-        input_materia.value = materia;
-        // disable the input
-        input_materia.setAttribute("disabled", true);
-        input_materia.classList.add("bg-info");
-
-        disableDatalist("#dli-grupo")
-
-        // get the option with data-id profesor
-        document.getElementById("profesores").innerHTML = "";
-        profesores.forEach(listProfesor);
-
-        const btnGuardar = document.getElementById('btn-guardar');
-        btnGuardar.onclick = () => guardar(id);
-    })
-    $("#modal-borrar").modal({
-        show: false,
-        backdrop: "static",
-        keyboard: false,
-    })
-    $("#modal-borrar").on("show.bs.modal", async function (event) {
-        const button = event.relatedTarget;
-        const id = button.parentElement.parentElement.getAttribute("data-ids");
-
-        const btnBorrar = document.getElementById('btn-borrar');
-        btnBorrar.onclick = () => borrarHorario(id);
-    })
-</script>
-
+<?php
+require_once 'class/c_login.php';
+if (!isset($_SESSION['user']))
+    die(header('Location: index.php'));
+
+$user = unserialize($_SESSION['user']);
+$user->access();
+if (!$user->admin && in_array($user->acceso, ['n']))
+    die(header('Location: main.php?error=1'));
+
+$user->print_to_log('Consultar horario');
+
+$write = $user->admin || in_array($user->acceso, ['w']);
+// var_dump($user);
+?>
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <title>Consultar horario |
+        <?= $user->facultad['facultad'] ?? 'General' ?>
+    </title>
+    <meta charset="utf-8">
+    <meta http-equiv="content-type" content="text/plain; charset=UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+    <?php include_once "import/html_css_files.php"; ?>
+</head>
+<!--  -->
+
+<body style="display: block;">
+    <?php
+    include('include/constantes.php');
+    include("import/html_header.php");
+    html_header("Consultar horario", "Sistema de gestión de checador");
+    ?>
+    <?= "<!-- $user -->" ?>
+    <main class="container content marco content-margin" id="local-app">
+        <section id="message"></section>
+        <?php require('import/periodo.php') ?>
+
+        <!-- Nuevo horario -->
+        <form>
+            <div class="form-group">
+                <div class="form-box">
+                    <?php
+                    #$carreras = query("SELECT * FROM FS_CARRERA WHERE FACULTAD = :fac AND PERIODO = COALESCE(:per, PERIODO) ORDER BY CARRERA", [":fac" => $user->facultad['facultad_id'], ":per" => $user->periodo], single: false);
+                    // repliaction of the query in the database with database class
+                    $nivel = $user->periodo ? $db->where('id', $user->periodo)->getOne('fs_periodo') : false;
+
+                    $carreras = $nivel ? $db
+                        ->orderBy('carrera')
+                        ->where('facultad', $nivel['facultad_id'])
+                        ->where('nivel', $nivel['nivel_id'])
+                        ->get('fs_carrera', 100, 'id, carrera') : [];
+
+                    ?>
+                    <div class="form-group row">
+                        <label for="filter_carrera" class="col-4 col-form-label">Carrera</label>
+                        <div class="col-6 ">
+                            <div id="dlcarrera" class="datalist datalist-select mb-1 w-100">
+                                <div class="datalist-input">Seleccionar carrera</div>
+                                <span class="ing-buscar icono"></span>
+                                <ul style="display:none">
+                                    <?php
+                                    foreach ($carreras as $carrera) {
+                                        ?>
+                                        <li data-id="<?= $carrera['id'] ?>">
+                                            <?= $carrera['carrera'] ?>
+                                        </li>
+                                        <?php
+                                    }
+                                    ?>
+                                </ul>
+                                <input type="hidden" id="filter_carrera" name="carrera" value="">
+                            </div>
+                        </div>
+                    </div>
+
+                    <!-- Grupo -->
+
+                    <div class="form-group row">
+                        <label for="filter_grupo" class="col-4 col-form-label">Grupo</label>
+                        <div class="col-6 ">
+                            <div id="dlgrupo" class="datalist datalist-select mb-1 w-100">
+                                <div class="datalist-input">Seleccionar grupo</div>
+                                <span class="ing-buscar icono"></span>
+                                <ul style="display:none">
+                                </ul>
+                                <input type="hidden" id="filter_grupo" name="grupo" value="">
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="form-group mt-4 row justify-content-center">
+                        <?php if ($write) { ?>
+                            <button type="button" id="nuevo" class="btn btn-outline-primary ml-4 d-none"
+                                title="Nuevo horario" data-toggle="modal" data-target="#modal-editar">
+                                <span class="ing-mas ing-fw"></span> Nuevo
+                            </button>
+                        <?php } ?>
+                    </div>
+                </div>
+            </div>
+
+        </form>
+        <!-- Horario is a (table with one a cell) within a table 
+        7:15 - 8:45, 8:45 - 10:15, 10:30 - 12:00, 12:00 - 13:30
+        de lunes a viernes, a excepción de que tenga sábado
+    -->
+        <div id="btn-excel-horario" class="mb-2 float-right hidden">
+            <button class="btn btn-outline-secondary " title="Exportar a Excel">
+                <span class="ing-descarga ing-fw"></span> Exportar a Excel
+            </button>
+        </div>
+        <!-- Table responsive -->
+        <div class="table-responsive">
+            <table class="table table-bordered table-sm table-responsive-sm" id="table-horario">
+                <thead class="thead-dark">
+                    <tr id="headers">
+                        <th scope="col" class="text-center">Hora</th>
+                        <th scope="col" class="text-center">Lunes</th>
+                        <th scope="col" class="text-center">Martes</th>
+                        <th scope="col" class="text-center">Miércoles</th>
+                        <th scope="col" class="text-center">Jueves</th>
+                        <th scope="col" class="text-center">Viernes</th>
+                        <th scope="col" class="text-center">Sábado</th>
+                    </tr>
+                </thead>
+                <tbody id="horario"></tbody>
+            </table>
+        </div>
+
+        <div class="modal fade" id="modal-editar" tabindex="-1" aria-labelledby="modal-editar" aria-hidden="true"
+            data-backdrop="static" data-keyboard="false">
+            <div class="modal-dialog modal-dialog-centered modal-lg">
+                <div class="modal-content">
+                    <div class="modal-header">
+                        <h5 class="col-12 modal-title text-center">Horario
+                            <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
+                                <span aria-hidden="true">&times;</span>
+                            </button>
+                        </h5>
+                    </div>
+                    <div class="modal-body">
+                        <section id="message_editar"></section>
+
+                        <!-- Hora inicio CLOCKPICKER -->
+                        <div class="form-box">
+                            <div class="form-group row">
+                                <label for="dli-grupo" class="col-4 col-form-label">Grupo</label>
+                                <div class="col-6">
+                                    <div id="grupoModal" class="datalist datalist-select mb-1 w-100">
+                                        <div class="datalist-input text-center"></div>
+                                        <span class="ing-buscar icono"></span>
+                                        <ul style="display:none">
+                                            <li data-id="" class="text-center">Nuevo grupo</li>
+                                        </ul>
+                                        <input type="hidden" name="dli-grupo" id="dli-grupo" value="" />
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="form-grupo row mb-3">
+                                <div class="col-4"></div>
+                                <div class="col-6">
+                                    <input type="text" id="grupo" name="grupo" value="" class="form-control"
+                                        placeholder="Grupo" required="required" hidden>
+                                    <div class="invalid-feedback">
+                                        Por favor, ingrese un grupo.
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="form-group row">
+                                <label for="materia" class="col-4 col-form-label">Materia</label>
+                                <div class="col-6">
+                                    <input list="lista_materias" name="dlMateria" id="dlMateria"
+                                        class="form-control text-center" placeholder="Materia" required="required">
+                                    <datalist id="lista_materias"></datalist>
+                                    <input type="hidden" id="materia" name="materia" value="">
+                                    <div class="invalid-feedback">
+                                        Por favor, seleccione una materia.
+                                    </div>
+                                </div>
+                            </div>
+
+                            <div class="form-group row">
+                                <label for="editor_hora" class="col-4 col-form-label">Hora</label>
+                                <div class="col-3">
+                                    <div id="dlhora" class="datalist datalist-select mb-1">
+                                        <div class="datalist-input text-center"></div>
+                                        <span class="ing-buscar icono"></span>
+                                        <ul style="display:none">
+                                            <?php foreach (range(7, 21) as $hora) { ?>
+                                                <li data-id='<?= $hora ?>'><?= str_pad($hora, 2, "0", STR_PAD_LEFT) ?></li>
+                                            <?php } ?>
+                                        </ul>
+                                        <input type="hidden" id="selector_horas" name="horas" value="">
+                                    </div>
+                                </div>
+                                <div class="col-3">
+                                    <div id="dlminuto" class="datalist datalist-select mb-1">
+                                        <div class="datalist-input text-center"></div>
+                                        <span class="ing-buscar icono"></span>
+                                        <ul style="display:none">
+                                            <?php foreach (range(0, 45, 15) as $minuto) { ?>
+                                                <li data-id='<?= $minuto ?>'><?= str_pad($minuto, 2, "0", STR_PAD_LEFT) ?>
+                                                </li>
+                                            <?php } ?>
+                                        </ul>
+                                        <input type="hidden" id="selector_minutos" name="minutos" value="">
+                                    </div>
+                                </div>
+                            </div>
+
+                            <!-- Día -->
+                            <div class="form-group row">
+                                <label for="editor_dia" class="col-4 col-form-label">Día</label>
+                                <div class="col-6 ">
+                                    <div id="dldia" class="datalist datalist-select mb-1 w-100">
+                                        <div class="datalist-input">Seleccionar día</div>
+                                        <span class="ing-buscar icono"></span>
+                                        <ul style="display:none">
+                                            <li data-id="1">Lunes</li>
+                                            <li data-id="2">Martes</li>
+                                            <li data-id="3">Miércoles</li>
+                                            <li data-id="4">Jueves</li>
+                                            <li data-id="5">Viernes</li>
+                                            <li data-id="6">Sábado</li>
+                                        </ul>
+                                        <input type="hidden" id="editor_dia" name="dia" value="">
+                                    </div>
+                                </div>
+                            </div>
+
+                            <!-- Duración -->
+                            <div class="form-group row">
+                                <label for="editor_duración" class="col-4 col-form-label">Duración</label>
+                                <div class="col-6 ">
+                                    <div id="dlduración" class="datalist datalist-select mb-1 w-100">
+                                        <div class="datalist-input">Seleccionar duración</div>
+                                        <span class="ing-buscar icono"></span>
+                                        <ul style="display:none">
+                                            <?php
+                                            $duraciones = $db->orderBy('duracion_bloques')->get("duracion");
+                                            foreach ($duraciones as $duración) {
+                                                $nombre = $duración['duracion_nombre'];
+                                                $id = $duración['duracion_id'];
+                                                $bloques = $duración['duracion_bloques'];
+                                                ?>
+                                                <li data-id="<?= $id; ?>" data-bloques="<?= $bloques; ?>"><?= $nombre; ?>
+                                                </li>
+                                                <?php
+                                            }
+                                            ?>
+                                        </ul>
+                                        <input type="hidden" id="editor_duración" name="duración" value="">
+                                    </div>
+                                    <div class="invalid-feedback">
+                                        La duración supera el límite (22:00).
+                                    </div>
+                                </div>
+                            </div>
+
+                            <!-- Profesor -->
+                            <div class="form-group row">
+                                <label for="editor_profesor" class="col-4 col-form-label">Profesor</label>
+                                <div class="col-6">
+                                    <input list="lista_profesores" name="dlProfesor" id="dlProfesor"
+                                        class="form-control" placeholder="Profesor" required="required">
+                                    <div class="valid-feedback">
+                                        Profesor encontrado
+                                    </div>
+                                    <div class="invalid-feedback">
+                                        Profesor no encontrado
+                                    </div>
+                                    <datalist id="lista_profesores">
+                                        <?php
+                                        $profesores = $db->get("profesor");
+                                        foreach ($profesores as $profesor) {
+                                        ?>
+                                            <option data-clave="<?= $profesor['profesor_clave'] ?>" data-profesor="<?= $profesor['profesor_nombre'] ?>" data-id="<?= $id; ?>" value="<?= "{$profesor['profesor_clave']} | {$profesor['profesor_grado']} {$profesor['profesor_nombre']}" ?>"></option>
+                                        <?php
+                                        }
+                                        ?>
+                                    </datalist>
+                                    <ul class="list-group" id="profesores"></ul>
+                                    <input type="hidden" id="editor_profesor" name="profesor" value="">
+                                </div>
+                            </div>
+
+                            <!-- Salón -->
+                            <div class="form-group row">
+                                <label for="editor_salón" class="col-4 col-form-label">Salón</label>
+                                <div class="col-6">
+                                    <input type="text" class="form-control" id="editor_salón" name="salón"
+                                        placeholder="Salón" maxlength="100" required="required">
+                                    <div class="invalid-feedback">
+                                        El salón no puede estar vacío.
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="modal-footer">
+                        <button data-id="" type="button" class="btn btn-primary" id="btn-guardar"><i
+                                class="ing-guardar ing"></i> Guardar</button>
+                        <button type="button" class="btn btn-outline-primary" data-dismiss="modal">Cancelar</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="modal" id="modal-borrar" tabindex="-1" aria-labelledby="modal-borrar" aria-hidden="true">
+            <div class="modal-dialog modal-dialog-centered modal-lg">
+                <div class="modal-content">
+                    <div class="modal-header">
+                        <h5 class="col-12 modal-title text-center">Horario
+                            <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
+                                <span aria-hidden="true">&times;</span>
+                            </button>
+                        </h5>
+                    </div>
+                    <div class="modal-body text-center">
+                        <h5>¿Está seguro de eliminar el horario?</h5>
+
+                        <div class="form-group mt-4 row justify-content-center" style="gap: 1rem;">
+                            <button id="btn-borrar" type="button" class="btn btn-danger">
+                                <i class="ing-borrar ing"></i>
+                                Borrar
+                            </button>
+
+                            <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancelar</button>
+                        </div>
+
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="modal fade" id="modal-choose" tabindex="-1" aria-labelledby="modal-choose" aria-hidden="true">
+            <div class="modal-dialog modal-dialog-centered modal-lg">
+                <div class="modal-content">
+                    <div class="modal-header">
+                        <h5 class="col-12 modal-title text-center">Seleccionar horarios en conflicto
+                            <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
+                                <span aria-hidden="true">&times;</span>
+                            </button>
+                        </h5>
+                    </div>
+                    <div class="modal-body">
+                        <div class="row">
+                            <div class="col-12">
+                                <div class="alert alert-danger" role="alert">
+                                    <h4 class="alert-heading">
+                                        <i class="ing-importante ing"></i>
+                                        ¡Atención!
+                                    </h4>
+                                    <p>Los siguientes horarios tienen conflicto con el horario que intenta guardar.</p>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="row">
+                            <div class="col-12">
+                                <div class="table-responsive">
+                                    <table class="table table-striped table-hover">
+                                        <thead>
+                                            <tr>
+                                                <th scope="col">Hora</th>
+                                                <th scope="col">Materia</th>
+                                                <th scope="col">Profesores</th>
+                                                <th scope="col">Salón</th>
+
+                                                <?php if ($write == "true") { ?>
+                                                    <th class="text-center" scope="col">Editar</th>
+                                                    <th class="text-center" scope="col">Borrar</th>
+                                                <?php } ?>
+
+                                            </tr>
+                                        </thead>
+                                        <tbody id="conflictos">
+                                        </tbody>
+                                    </table>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </main>
+</body>
+<?php
+require_once("import/html_footer.php");
+?>
+<script src="js/scrollables.js"></script>
+
+<script src="js/bootstrap/bootstrap.min.js"></script>
+<!-- use the latest version -->
+<script src="js/moment.js"></script>
+<!-- <script src="js/datalist.js"></script> -->
+<script type="module">
+    import {
+        triggerMessage
+    } from './module/messages.js';
+    var gHorarios = [];
+    var datalists = {
+        día: [document.querySelector('#dldia div'), document.querySelector('#dldia div').innerText],
+        duración: [document.querySelector('#dlduración div'), document.querySelector('#dlduración div').innerText],
+    }
+
+    /**@Auxiliary functions */
+    function listProfesor({
+        id,
+        grado,
+        profesor,
+        clave
+    }) {
+        const lista = document.getElementById("dlProfesor");
+        lista.innerHTML = "";
+        lista.classList.remove("is-invalid");
+        const li = document.createElement('li');
+        li.setAttribute('data-id', id);
+        li.classList.add('list-group-item', 'd-flex', 'justify-content-between', 'align-items-center');
+        li.innerHTML = `${clave} | ${grado ?? ''} ${profesor}`
+
+        const btn = document.createElement('button');
+        btn.setAttribute('type', 'button');
+        btn.classList.add('badge', 'badge-danger', 'badge-pill', 'border-0');
+        btn.onclick = _ => li.remove();
+
+        const i = document.createElement('i');
+        i.classList.add('ing-cancelar');
+        btn.appendChild(i);
+        li.appendChild(btn);
+
+        document.getElementById("profesores").appendChild(li);
+    }
+
+    function compareHours(hora1, hora2) {
+        // parseInt each hour and minute
+        const [h1, m1,] = hora1.split(":").map(x => parseInt(x));
+        const [h2, m2,] = hora2.split(":").map(x => parseInt(x));
+
+        if (h1 > h2)
+            return 1;
+        else if (h1 < h2)
+            return -1;
+        else if (m1 > m2)
+            return 1;
+        else if (m1 < m2)
+            return -1;
+        else
+            return 0;
+    }
+    async function buscarGrupo() {
+        const carrera = document.querySelector("#filter_carrera").value;
+        const grupo = document.querySelector("#filter_grupo").value;
+
+        if (carrera == "" || grupo == "") {
+            triggerMessage("El nombre del grupo y la carrera son requeridos", "Faltan campos");
+            return;
+        }
+        const formData = new FormData();
+
+        formData.append("carrera", carrera);
+        formData.append("grupo", grupo);
+        formData.append("periodo", document.querySelector("#periodo").value);
+        formData.append('facultad', '<?= $user->facultad['facultad_id'] ?>');
+
+        try {
+            gHorarios = [];
+            const {
+                status,
+                horario: horarios,
+            } = await fetch("action/action_horario.php", {
+                method: "POST",
+                body: formData
+            }).then(res => res.json());
+
+            if (status != "success") {
+                triggerMessage(response.message, "Error");
+            }
+            // show the table
+            table.style.display = "table";
+            document.querySelectorAll('.hidden').forEach(element => element.style.display = "block");
+            // clear the table
+            table.innerHTML = empty_table;
+
+            if (horarios.length == 0) {
+                window.location.reload();
+                return;
+            }
+            // fill the table
+            gHorarios = horarios;
+
+            function conflicts(horario1, horario2) {
+                const {
+                    hora: hora_inicio1,
+                    hora_final: hora_final1,
+                    dia: dia1,
+                } = horario1;
+
+                const {
+                    hora: hora_inicio2,
+                    hora_final: hora_final2,
+                    dia: dia2,
+                } = horario2;
+
+
+                // if the days are different, there is no conflict
+                if (dia1 != dia2) {
+                    return false;
+                }
+
+                const compareInicios = compareHours(hora_inicio1, hora_inicio2);
+                const compareFinales = compareHours(hora_final1, hora_final2);
+                const compareInicioFinal = compareHours(hora_inicio1, hora_final2);
+                const compareFinalInicio = compareHours(hora_final1, hora_inicio2);
+
+                // if the horario is inside the other
+                if (compareInicios === 0 || compareFinales === 0)
+                    return true
+                if (compareInicios === 1 && compareInicioFinal === -1)
+                    return true
+                if (compareFinales === -1 && compareFinalInicio === 1)
+                    return true
+
+                // if the horario is outside the other
+                if (compareInicios === -1 && compareFinales === 1)
+                    return true
+
+                return false;
+            }
+            // remove the next 5 cells
+            function removeNextCells(horas, minutos, dia, cells = 5) {
+                [...Array(cells).keys()].map(i => i + 1).forEach(i => {
+                    const minute = (minutos + i * 15)
+                    const next_minute = (minute % 60).toString().padStart(2, "0");
+                    const next_hour = (horas + Math.floor(minute / 60))
+
+                    document.getElementById(`hora-${next_hour}:${next_minute}-${dia}`).remove()
+                });
+            }
+
+            function newBlock(horario, edit = false) {
+                function move(horario, cells) {
+                    const {
+                        hora: hora_inicio,
+                        dia,
+                    } = horario;
+
+                    const [horas, minutos] = hora_inicio.split(":").map(x => parseInt(x));
+
+                    const cell = document.getElementById(`hora-${horas}:${minutos.toString().padStart(2, "0")}-${dia}`);
+
+                    const {
+                        top,
+                        left
+                    } = cell.getBoundingClientRect();
+
+                    const block = document.getElementById(`block-${horario.id}`);
+
+                    block.style.top = `${top}px`;
+                    block.style.left = `${left}px`;
+
+                    removeNextCells(horas, minutos, dia, cells);
+                }
+                const {
+                    id,
+                    materia,
+                    salon,
+                    profesores,
+                    hora: hora_inicio,
+                    dia,
+                    bloques
+                } = horario;
+
+                const [horas, minutos] = hora_inicio.split(":").map(x => parseInt(x));
+                const hora = `${horas}:${minutos.toString().padStart(2, "0")}`;
+                horario.hora = hora;
+
+                const cell = document.getElementById(`hora-${hora}-${dia}`);
+
+
+                cell.dataset.ids = id;
+
+                const float_menu = /*html*/
+                    `<div class="menu-flotante p-2" style="opacity: .7;" >
+                        <a class="mx-2" href="#" data-toggle="modal" data-target="#modal-editar">
+                            <i class="ing-editar ing"></i>
+                        </a>
+                        <a class="mx-2" href="#" data-toggle="modal" data-target="#modal-borrar">
+                            <i class="ing-basura ing" > </i>
+                        </a>
+                    </div>
+                    `
+
+                cell.innerHTML = /*html*/ `
+                <div style="overflow-y: auto; overflow-x: hidden; height: 100%;" id="block-${id}" class="position-absolute w-100 h-100">
+                    <small class="text-gray">${hora}</small> 
+                    <b class="title">${materia}</b> <br>
+                    <br><span>Salón: </span>${salon} <br>
+                    <small class="my-2">
+                        ${profesores.map(({ grado, profesor }) => /*html*/ ` <span class="ing ing-formacion mx-1"></span>${grado ?? ''} ${profesor}`).join("<br>")}
+                    </small>
+                </div>
+                ${edit && float_menu}`
+
+                cell.classList.add("bloque-clase", "position-relative");
+                cell.rowSpan = bloques;
+                // draggable
+                cell.draggable = <?= $write ? "true" : "false" ?>;
+
+                bloques > 0 ? removeNextCells(horas, minutos, dia, bloques - 1) : null;
+            }
+
+            function newConflictBlock(horarios, edit = false) {
+                const first_horario = horarios[0];
+                const [horas, minutos] = first_horario.hora.split(":").map(x => parseInt(x));
+                const hora = `${horas}:${minutos.toString().padStart(2, "0")}`;
+                const ids = horarios.map(horario => horario.id);
+                const cell = document.getElementById(`hora-${hora}-${first_horario.dia}`);
+                if (cell == null) {
+                    console.error(`Error: No se encontró la celda: hora-${hora}-${first_horario.dia}`);
+                    return;
+                }
+                cell.dataset.ids = ids.join(",");
+
+                // replace the content of the cell
+                cell.innerHTML = /* HTML */ `
+                <small class='text-danger'>
+                    ${hora}
+                </small>
+                <div class="d-flex justify-content-center align-items-center mt-4">
+                    <div class="d-flex flex-column justify-content-center align-items-center">
+                        <span class="ing ing-importante text-danger" style="font-size: 2rem;"></span>
+                        <b class='text-danger'>
+                            Empalme de ${ids.length} horarios
+                        </b>
+                        <hr>
+                        <i class="text-danger"> Ver horarios &#8230;</i>
+                    </div>
+                </div>
+                `;
+
+                // the text must be centered
+                // cell.style.backgroundColor = "#f6cfd6";
+                cell.classList.add("conflict", "bloque-clase");
+                // add cursor clickable role = "button"
+                cell.setAttribute("role", "button");
+
+                // add the event listener for the cell
+                cell.addEventListener("click", () => {
+                    $("#modal-choose").modal("show");
+                    const ids = cell.getAttribute("data-ids").split(",").map(x => parseInt(x));
+                    const horarios = gHorarios.filter(horario => ids.includes(horario.id));
+                    const tbody = document.querySelector("#modal-choose tbody");
+                    tbody.innerHTML = "";
+                    horarios.sort((a, b) => compareHours(a.hora, b.hora)).forEach(horario => {
+                        const {
+                            materia,
+                            dia,
+                            hora,
+                            hora_final,
+                            profesores,
+                            salon,
+                            id,
+                        } = horario;
+
+                        // remove the last 00 of the hour
+                        const [horaFmt, hora_finalFmt] = [hora, hora_final].map(hora => hora.slice(0, -3))
+                        const buttons = /* HTML */ `
+                                <td class="text-center">
+                                    <button class="btn btn-sm btn-primary dismiss-editar" data-toggle="modal" data-target="#modal-editar">
+                                        <i class="ing-editar ing"></i>
+                                    </button>
+                                </td>
+                                <td class="text-center">
+                                    <button class="btn btn-sm btn-danger dismiss-editar" data-toggle="modal" data-target="#modal-borrar">
+                                        <i class="ing-basura ing"></i>
+                                    </button>
+                                </td>`
+
+                        tbody.innerHTML += /* HTML */ `
+                            <tr data-ids="${id}">
+                                <td><small>${horaFmt}-${hora_finalFmt}</small></td>
+                                <td>${materia}</td>
+                                <td>
+                                    ${profesores.map(({ grado, profesor }) => `${grado ?? ''} ${profesor}`).join(", ")}
+                                </td>
+                                <td>${salon}</td>
+                                ${edit ? buttons : ""}
+                            </tr>`;
+                    });
+
+                    document.querySelectorAll(".dismiss-editar").forEach(btn => {
+                        btn.addEventListener("click", () => $("#modal-choose").modal("hide"));
+                    });
+
+                });
+
+                // blocks is (firsthour - lasthour) / 15 minutes
+                // sum the duracion_bloques of each horario
+                function getDuration(hora_i, hora_f) {
+                    const [horas_i, minutos_i] = hora_i.split(":").map(x => parseInt(x));
+                    const [horas_f, minutos_f] = hora_f.split(":").map(x => parseInt(x));
+                    const date_i = new Date(0, 0, 0, horas_i, minutos_i);
+                    const date_f = new Date(0, 0, 0, horas_f, minutos_f);
+                    const diff = date_f - date_i;
+                    return diff / (1000 * 60 * 15);
+                }
+
+                const lastHorario = horarios[horarios.length - 1];
+                // remove the next cells
+                // get the max hora_final
+                const maxHoraFinal = horarios.reduce((max, horario) => {
+                    const [horas, minutos] = horario.hora_final.split(":").map(x => parseInt(x));
+                    const date = new Date(0, 0, 0, horas, minutos);
+                    return date > max ? date : max;
+                }, new Date(0, 0, 0, 0, 0));
+
+                const blocks = getDuration(first_horario.hora, `${maxHoraFinal.getHours()}:${maxHoraFinal.getMinutes()}`);
+                cell.rowSpan = blocks
+                removeNextCells(horas, minutos, first_horario.dia, blocks - 1);
+            }
+
+            const conflictBlocks = horarios.filter((horario, index, arrayHorario) =>
+                arrayHorario.filter((_, i) => i != index).some(horario2 =>
+                    conflicts(horario, horario2)))
+                .sort((a, b) => compareHours(a.hora, b.hora));
+
+            const classes = horarios.filter(horario => !conflictBlocks.includes(horario));
+
+            const conflictBlocksPacked = []; // array of sets
+            conflictBlocks.forEach(horario => {
+                const setIndex = conflictBlocksPacked.findIndex(set => set.some(horario2 => conflicts(horario, horario2)));
+                if (setIndex === -1) {
+                    conflictBlocksPacked.push([horario]);
+                } else {
+                    conflictBlocksPacked[setIndex].push(horario);
+                }
+            })
+
+            classes.forEach(horario =>
+                newBlock(horario, <?= $write ?>)
+            )
+
+            conflictBlocksPacked.forEach(horarios =>
+                newConflictBlock(horarios, <?= $write ?>)
+            )
+
+            // remove the elements that are not in the limits
+            let max_hour = Math.max(...horarios.map(horario => {
+                const lastMoment = moment(horario.hora, "HH:mm").add(horario.bloques * 15, "minutes");
+                const lastHour = moment(`${lastMoment.hours()}:00`, "HH:mm");
+                const hourInt = parseInt(lastMoment.format("HH"));
+
+                return lastMoment.isSame(lastHour) ? hourInt - 1 : hourInt;
+            }));
+
+            let min_hour = Math.min(...horarios.map(horario => parseInt(horario.hora.split(":")[0])));
+
+            document.querySelectorAll("tbody#horario tr").forEach(hora => {
+                const hora_id = parseInt(hora.id.split("-")[1].split(":")[0]);
+                (hora_id < min_hour || hora_id > max_hour) ? hora.remove() : null;
+            })
+
+            // if there is no sábado, remove the column
+            if (!horarios.some(horario => horario.dia == "sábado")) {
+                document.querySelectorAll("tbody#horario td").forEach(td => {
+                    if (td.id.split("-")[2] == "sábado") {
+                        td.remove();
+                    }
+                });
+
+                // remove the header (the last)
+                document.querySelector("#headers").lastElementChild.remove();
+            }
+            // adjust width
+            const ths = document.querySelectorAll("tr#headers th");
+            ths.forEach((th, key) =>
+                th.style.width = (key == 0) ? "5%" : `${95 / (ths.length - 1)}%`
+            );
+
+            // search item animation
+            const menúFlontantes = document.querySelectorAll(".menu-flotante");
+            menúFlontantes.forEach((element) => {
+                element.classList.add("d-none");
+                element.parentElement.addEventListener("mouseover", () =>
+                    element.classList.remove("d-none")
+                );
+                element.parentElement.addEventListener("mouseout", (e) =>
+                    element.classList.add("d-none")
+                );
+            });
+
+        } catch (error) {
+            triggerMessage("Error al cargar el horario", "Error");
+            triggerMessage(error, "Error");
+        }
+
+        // droppables
+        // forall the .bloque-elements add the event listeners for drag and drop
+        <?php if ($write): ?>
+            document.querySelectorAll(".bloque-clase").forEach(element => {
+                function dragStart() {
+                    this.classList.add("dragging");
+                }
+
+                function dragEnd() {
+                    this.classList.remove("dragging");
+                }
+
+                element.addEventListener("dragstart", dragStart);
+                element.addEventListener("dragend", dragEnd);
+            });
+
+        // forall the cells that are not .bloque-clase add the event listeners for drag and drop
+        document.querySelectorAll("td:not(.bloque-clase)").forEach(element => {
+            function dragOver(e) {
+                e.preventDefault();
+                this.classList.add("dragging-over");
+            }
+
+            function dragLeave() {
+                this.classList.remove("dragging-over");
+            }
+
+            function drop() {
+                this.classList.remove("dragging-over");
+                const dragging = document.querySelector(".dragging");
+
+                const id = /* for data-ids */ dragging.getAttribute("data-ids");
+                const hora = /* for data-hora */ this.id.split("-")[1];
+                const días = ["lunes", "martes", "miércoles", "jueves", "viernes", "sábado"];
+                let día = /* for data-dia */ this.id.split("-")[2];
+                día = días.indexOf(día) + 1;
+
+                //  rowspan
+                const bloques = parseInt(dragging.getAttribute("rowspan"));
+                const horaMoment = moment(hora, "HH:mm");
+                const horaFin = horaMoment.add(bloques * 15, "minutes");
+
+                const limit = moment('22:00', 'HH:mm');
+
+                if (horaFin.isAfter(limit)) {
+                    triggerMessage("No se puede mover el bloque a esa hora", "Error");
+
+                    // scroll to the top
+                    window.scrollTo(0, 0);
+                    return;
+                }
+
+                // get the horario
+                // remove the horario
+                const bloque = document.querySelector(`.bloque-clase[data-ids="${id}"]`);
+
+                // remove all children
+                while (bloque.firstChild) {
+                    bloque.removeChild(bloque.firstChild);
+                }
+
+                // prepend a loading child
+                const loading = `<div class="spinner-border" role="status" style="width: 3rem; height: 3rem;">
+                                        <span class="sr-only">Loading...</span>
+                                    </div>`;
+                bloque.insertAdjacentHTML("afterbegin", loading);
+                // add style vertical-align: middle
+                bloque.style.verticalAlign = "middle";
+                bloque.classList.add("text-center");
+                // remove draggable
+                bloque.removeAttribute("draggable");
+
+                moveHorario(id, día, hora);
+            }
+
+            element.addEventListener("dragover", dragOver);
+            element.addEventListener("dragleave", dragLeave);
+            element.addEventListener("drop", drop);
+        });
+        <?php endif; ?>
+    }
+    async function guardar(id) {
+        const btn = document.querySelector("#btn-guardar");
+        const clone = btn.cloneNode(true);
+
+        const data = {
+            dia: document.querySelector("#editor_dia"),
+            salon: document.querySelector("#editor_salón"),
+            //vprofesor: document.querySelector("#editor_profesor"),
+            duración: document.querySelector("#editor_duración")
+        };
+
+        const dia = data.dia.value;
+        const salon = data.salon.value;
+
+        if (salon == "") {
+            return;
+        }
+
+        const hora = document.querySelector("#selector_horas").value;
+        const minutos = document.querySelector("#selector_minutos").value;
+        const bloques = document.querySelector("#dlduración li.selected")?.getAttribute("data-bloques");
+
+        if (bloques == null) {
+            document.querySelector("#dlduración").classList.add("is-invalid");
+            return;
+        }
+
+        const start = moment(`${hora}:${minutos}`, "HH:mm").add(bloques * 15, "minutes");
+        const end = moment("22:00", "HH:mm");
+
+        if (start.isAfter(end)) {
+            document.querySelector("#dlduración").classList.add("is-invalid");
+            return;
+        }
+
+        const profesoresList = [...document.querySelectorAll("#profesores li")];
+
+        if (profesoresList.length == 0) {
+            return;
+        }
+
+        const formData = new FormData();
+        // const id = btn.getAttribute("data-id");
+        formData.append("id", id);
+        formData.append("hora", `${hora}:${minutos}`);
+        formData.append("día", dia);
+        formData.append("salón", salon);
+        const profesores = profesoresList.map(li => li.getAttribute("data-id"));
+        formData.append("duración", data.duración.value);
+        formData.append("profesores", profesores.join(","));
+
+        // loading btn
+        btn.innerHTML = 'Guardando...';
+        // disable btn
+        btn.disabled = true;
+
+        const response = await fetch("action/action_horario_update.php", {
+            method: "POST",
+            body: formData
+        }).then(res => res.json());
+
+        if (response.status == "success") {
+            triggerMessage("Horario actualizado", "Éxito", "success");
+            btn.innerHTML = '<i class="ing-aceptar ing"></i> Guardado';
+            btn.classList.add("btn-success");
+            btn.classList.remove("btn-primary");
+
+            // return to the initial state
+            setTimeout(() => {
+                buscarGrupo();
+                btn.replaceWith(clone);
+                $("#modal-editar").modal("hide");
+            }, 100);
+        } else {
+            triggerMessage(response.message, "Error");
+            btn.replaceWith(clone);
+
+            $("#modal-editar").modal("hide");
+        }
+
+    }
+    async function borrarHorario(id) {
+        const btn = document.querySelector("#btn-borrar");
+        const clone = btn.cloneNode(true);
+
+        const formData = new FormData();
+        formData.append("id", id);
+
+        const response = await fetch("action/action_horario_delete.php", {
+            method: "POST",
+            body: formData
+        }).then(res => res.json());
+
+        if (response.status == "success") {
+            triggerMessage('Horario borrado', "Éxito", "success");
+            btn.innerHTML = '<i class="ing-aceptar ing"></i> Borrado';
+            btn.classList.add("btn-success");
+            btn.classList.remove("btn-danger");
+
+            // return to the initial state
+            setTimeout(() => {
+                buscarGrupo();
+                btn.replaceWith(clone);
+                $("#modal-borrar").modal("hide");
+            }, 1000);
+        } else {
+            triggerMessage(response.message, "Error");
+            btn.replaceWith(clone);
+
+            $("#modal-borrar").modal("hide");
+        }
+
+    }
+    function guardarHorario() {
+        let goBack = false;
+        const data = {
+            grupo: document.querySelector("#grupo"),
+            dia: document.querySelector("#editor_dia"),
+            salon: document.querySelector("#editor_salón"),
+            profesor: document.querySelector("#new_profesor"),
+            duración: document.querySelector("#editor_duración"),
+            materia: document.querySelector("#dlMateria")
+        };
+
+        const dia = data.dia.value;
+        const salon = data.salon.value;
+        const profesor = data.profesor.value;
+        const materia = data.materia.value;
+        const duración = data.duración.value;
+
+        if (duración == "") {
+            invalidDatalist("#new_duración");
+            goBack = true;
+        }
+
+        if (profesor == "") {
+            data.profesor.classList.add("is-invalid");
+            goBack = true;
+        }
+
+        if (salon == "") {
+            data.salon.classList.add("is-invalid");
+            goBack = true;
+        }
+
+        if (dia == "") {
+            invalidDatalist("#new_dia");
+            goBack = true;
+        }
+
+        if (materia == "") {
+            data.materia.classList.add("is-invalid");
+            goBack = true;
+        }
+
+        const hora = document.querySelector("#new_horas").value;
+        if (hora == "") {
+            invalidDatalist("#new_horas");
+            goBack = true;
+        }
+        const minutos = document.querySelector("#new_minutos").value;
+        if (minutos == "") {
+            invalidDatalist("#new_minutos");
+            goBack = true;
+        }
+
+        const bloques = document.querySelector("#dlNewDuración li.selected")?.getAttribute("data-bloques");
+        const start = moment(`${hora}:${minutos}`, "HH:mm").add(bloques * 15, "minutes");
+        const end = moment("22:00", "HH:mm");
+
+        if (start.isAfter(end)) {
+            document.querySelector("#dlNewDuración").classList.add("is-invalid");
+            goBack = true;
+        }
+
+        if (goBack) {
+            return;
+        }
+
+        const formData = new FormData();
+        formData.append("grupo", document.querySelector("#filter_grupo").value);
+        formData.append("hora", `${hora}:${minutos}`);
+        formData.append("día", dia);
+        formData.append("salón", salon);
+        formData.append("profesor", profesor);
+        formData.append("duración", data.duración.value);
+        formData.append("periodo", "<?= $user->periodo ?>");
+        formData.append("materia", materia);
+        formData.append("facultad", "<?= $user->facultad['facultad_id'] ?>");
+
+
+        fetch("action/action_horario_create.php", {
+            method: "POST",
+            body: formData
+        }).then(res => res.json()).then(response => {
+            const carrera = document.querySelector("#dlcarrera li.selected")
+            // call it's click event
+            carrera?.click();
+            if (response.status == "success") {
+                triggerMessage("Horario guardado", "Éxito", "success");
+                btn.innerHTML = /* html */ `<i class="ing-aceptar ing"></i> Guardado`;
+                btn.classList.add("btn-success");
+                btn.classList.remove("btn-primary");
+
+                // return to the initial state
+                setTimeout(() => {
+                    btn.classList.remove("btn-success");
+                    btn.classList.add("btn-primary");
+
+
+                    // this modal
+                    $("#modal-nuevo").modal("hide");
+                    const modalNuevo = document.querySelector("#modal-nuevo");
+                    modalNuevo.querySelectorAll("input").forEach(input => {
+                        input.value = "";
+                    });
+
+                    // reset the datalist
+                    modalNuevo.querySelectorAll(".datalist").forEach(datalist => {
+                        const cloneDatalist = modalNuevoClone.querySelector(`#${datalist.id}`).cloneNode(true);
+                        // log
+                        datalist.replaceWith(cloneDatalist);
+                    });
+                    // remove all is-valid and is-invalid
+                    modalNuevo.querySelectorAll(".is-valid, .is-invalid").forEach(el => {
+                        el.classList.remove("is-valid", "is-invalid");
+                    });
+
+                }, 100);
+            } else {
+                triggerMessage(response.message, "Error");
+                $("#modal-nuevo").modal("hide");
+            }
+        }).then(() => {
+            buscarGrupo();
+        }).catch(err => {
+            triggerMessage(err, "Error");
+
+            $("#modal-nuevo").modal("hide");
+        });
+
+        // buscarGrupo();
+    }
+    function moveHorario(id, día, hora) {
+
+        const formData = new FormData();
+
+        formData.append("id", id);
+        formData.append("hora", hora);
+        formData.append("día", día);
+
+        fetch("action/action_horario_update.php", {
+            method: "POST",
+            body: formData
+        }).then(res => res.json()).then(response => {
+            if (response.status == "success") {
+                triggerMessage("Horario movido", "Éxito", "success");
+            } else {
+                triggerMessage(response.message, "Error");
+            }
+        }).then(() => {
+            buscarGrupo();
+        }).catch(err => {
+            triggerMessage(err, "Error");
+        });
+
+    }
+    function extractFromModal() {
+        // remove all is-valid and is-invalid
+        document.querySelectorAll(".is-valid, .is-invalid").forEach(el =>
+            el.classList.remove("is-valid", "is-invalid")
+        );
+        let goBack = false;
+        const modalNuevo = document.querySelector("#modal-nuevo");
+        const data = {
+            dia: document.querySelector("#editor_dia"),
+            salon: document.querySelector("#editor_salón"),
+            duración: document.querySelector("#editor_duración")
+        };
+
+        const dia = data.dia.value;
+        const salon = data.salon.value;
+        const hora = document.querySelector("#selector_horas").value;
+        const minutos = document.querySelector("#selector_minutos").value;
+        const bloques = document.querySelector("#dlduración li.selected")?.getAttribute("data-bloques");
+        const materia = document.querySelector("#dlMateria");
+        const grupo = document.querySelector("input#grupo");
+
+        const start = moment(`${hora}:${minutos}`, "HH:mm").add(bloques * 15, "minutes");
+        const end = moment("22:00", "HH:mm");
+        const profesoresList = [...document.querySelectorAll("#profesores li")];
+
+        if (data.duración.value == "") {
+            invalidDatalist("#editor_duración");
+            goBack = true;
+        }
+
+        if (dia == "") {
+            invalidDatalist("#editor_dia");
+            goBack = true;
+        }
+
+        if (start.isAfter(end)) {
+            document.querySelector("#dlduración").classList.add("is-invalid");
+            goBack = true;
+        }
+
+        if (salon == "") {
+            data.salon.classList.add("is-invalid");
+            goBack = true;
+        }
+
+        if (profesoresList.length == 0) {
+            document.querySelector("#dlProfesor").classList.add("is-invalid");
+            goBack = true;
+        }
+
+        if (materia.value == "" || materia.classList.contains("is-invalid")) {
+            document.querySelector("#dlMateria").classList.add("is-invalid");
+            goBack = true;
+        }
+
+        if (grupo.value == "") {
+            grupo.classList.add("is-invalid");
+            goBack = true;
+        }
+
+
+        if (goBack) return null;
+
+        const materia_id = document.querySelector(`#lista_materias option[value="${materia.value}"]`).getAttribute("data-id");
+
+        const formData = new FormData();
+        formData.append("hora", `${hora}:${minutos}`);
+        formData.append("día", dia);
+        formData.append("salón", salon);
+        const profesores = profesoresList.map(li => li.getAttribute("data-id"));
+        formData.append("duración", data.duración.value);
+        formData.append("profesores", profesores.join(","));
+        formData.append("materia", materia_id);
+
+        return formData;
+    }
+    function resetFormModal() {
+        const modalNuevo = document.querySelector("#modal-editar");
+        modalNuevo.querySelectorAll("input").forEach(input => input.value = "");
+
+        // remove all is-valid and is-invalid
+        modalNuevo.querySelectorAll(".is-valid, .is-invalid").forEach(el => el.classList.remove("is-valid", "is-invalid"));
+        modalNuevo.querySelectorAll(".datalist-invalid").forEach(el => el.classList.remove("datalist-invalid"));
+        modalNuevo.querySelector("#profesores").innerHTML = "";
+
+        // reset the datalist
+        for (var key in datalists)
+            datalists[key][0].innerText = datalists[key][1];
+        // remove disabled attribute
+        modalNuevo.querySelectorAll("[disabled]").forEach(el => el.removeAttribute("disabled"));
+        // remove bg-info
+        modalNuevo.querySelectorAll(".bg-info").forEach(el => el.classList.remove("bg-info"));
+    }
+    function insertHorario(horario) {
+        const fetchOptions = {
+            method: "POST",
+            body: horario
+        };
+
+        return fetch("action/action_horario_create.php", fetchOptions).then(res => res.json()).then(response => {
+            if (response.status == "success") {
+                triggerMessage("Horario insertado", "Éxito", "success");
+            } else {
+                triggerMessage(response.message, "Error");
+            }
+        }).then(() => {
+            // if the table isn't displayed, just show a message
+            if (table.style.display == "none") {
+                triggerMessage("Horario insertado", "Éxito", "success");
+                return;
+            }
+
+            buscarGrupo();
+        }).catch(err => {
+            triggerMessage(err, "Error");
+        });
+    }
+    // initial state
+    {
+        // fill the table with empty cells
+        [...Array(16).keys()].map(x => x + 7).forEach(hora => {
+            // add 7 rows for each hour
+            [0, 15, 30, 45].map(minute => minute.toString().padStart(2, '0')).forEach(minute => {
+                const tr = document.createElement("tr");
+                tr.id = `hora-${hora}:${minute}`;
+                tr.classList.add(hora > 13 ? "tarde" : "mañana");
+                if (minute == 0) {
+                    const th = document.createElement("th");
+                    th.classList.add("text-center");
+                    th.scope = "row";
+                    th.rowSpan = 4;
+                    th.innerText = `${hora}:00`;
+                    th.style.verticalAlign = "middle";
+                    tr.appendChild(th);
+                }
+
+                ["lunes", "martes", "miércoles", "jueves", "viernes", "sábado"].forEach(día => {
+                    const td = document.createElement("td");
+                    td.id = `hora-${hora}:${minute}-${día}`;
+                    tr.appendChild(td);
+                });
+                document.querySelector("tbody#horario").appendChild(tr);
+            });
+        })
+
+        // add an inital height to the table cells
+        // query selector All tds and ths inside the tbody#horario
+        // previous query selector: "tbody#horario td, tbody#horario tr"
+        document.querySelectorAll("tbody#horario td, tbody#horario tr").forEach(element => element.style.height = "2.5rem");
+        document.getElementById('dlProfesor').addEventListener('input', function (e) {
+            var input = document.getElementById('dlProfesor');
+            var value = input.value;
+            var option = document.querySelector(`option[value="${value}"]`);
+
+            if (value == "") {
+                input.classList.remove("is-invalid");
+                return;
+            }
+
+            if (!option) {
+                document.getElementById('editor_profesor').value = "";
+                // remove is valid class
+                input.classList.remove("is-valid");
+                // add is invalid class
+                input.classList.add("is-invalid");
+                return
+            }
+
+            var id = option.getAttribute('data-id');
+            if (!document.querySelector(`li[data-id="${id}"]`))
+                listProfesor({
+                    id: id,
+                    grado: option.getAttribute('data-grado'),
+                    profesor: option.getAttribute('data-profesor'),
+                    clave: option.getAttribute('data-clave')
+                });
+            e.target.value = "";
+        });
+        document.getElementById('dlMateria').addEventListener('input', function (e) {
+            var input = document.getElementById('dlMateria');
+            var value = input.value;
+            var option = document.querySelector(`option[value="${value}"]`);
+
+            if (value == "") {
+                input.classList.remove("is-invalid");
+                return;
+            }
+
+            if (!option) {
+                // remove is valid class
+                input.classList.remove("is-valid");
+                // add is invalid class
+                input.classList.add("is-invalid");
+                return;
+            }
+
+            input.classList.remove("is-invalid");
+        });
+    }
+
+    // state
+    const table = document.querySelector("table");
+    const empty_table = table.innerHTML;
+    document.querySelectorAll('.hidden').forEach(element => element.style.display = "none");
+    // hide the table
+    table.style.display = "none";
+    disableDatalist("#filter_grupo");
+
+    document.getElementById("btn-excel-horario").addEventListener("click", () => {
+        const formData = new FormData();
+        const grupo = document.getElementById("filter_grupo").value;
+        formData.append("grupo", grupo);
+        formData.append('sábado', gHorarios.some(horario => horario.dia == "sábado"));
+        formData.append("horarios", JSON.stringify(gHorarios));
+        // min and max hour
+        formData.append("min", gHorarios.reduce((min, horario) => {
+            const hora = horario.hora.split(":").map(x => parseInt(x))[0]
+            return Math.min(hora, min);
+        }, 24));
+        formData.append("max", gHorarios.reduce((max, horario) => {
+            const {
+                hora,
+                bloques
+            } = horario;
+            // after hour
+            const lastHour = moment(hora, "HH:mm").add(bloques * 15, "minutes");
+            const lastMoment = moment(`${lastHour.format("HH")}:00`, "HH:mm");
+            const intHour = parseInt(lastHour.format("HH"));
+
+            return Math.max(lastMoment.isSame(lastHour) ? intHour - 1 : intHour, max);
+        }, 0));
+
+        fetch("export/horario_excel.php", {
+            method: "POST",
+            body: formData
+        })
+            .then(response => response.blob())
+            .then(blob => {
+                const url = window.URL.createObjectURL(blob);
+                const a = document.createElement('a');
+                a.style.display = 'none';
+                a.setAttribute('href', url);
+                a.setAttribute('download', `horario-${grupo}.xlsx`);
+                document.body.appendChild(a);
+                a.click();
+                window.URL.revokeObjectURL(url);
+            })
+            .catch(() => triggerMessage("error", "Error al exportar el horario"));
+    });
+    // on click the li element, inside datalist #dlcarera
+    document.querySelectorAll("#dlcarrera li").forEach(async li => {
+        li.addEventListener("click", async () => {
+            // get the data-id from the li element
+            const carrera = li.getAttribute("data-id");
+            const facultad = '<?= $user->facultad['facultad_id'] ?>';
+            const periodo = '<?= $user->periodo ?>';
+
+            const formData = new FormData();
+            formData.append("carrera", carrera);
+            formData.append("facultad", facultad);
+            formData.append("periodo", periodo);
+
+            const dlgrupo = document.querySelector("#dlgrupo ul");
+            const grupoModal = document.querySelector("#grupoModal ul");
+            const promptDL = document.querySelector("#dlgrupo .datalist-input");
+
+            try {
+                const {
+                    status,
+                    grupos
+                } = await fetch("action/action_grupo.php", {
+                    method: "POST",
+                    body: formData
+                }).then(res => res.json());
+
+                dlgrupo.innerHTML = "";
+
+                if (status != "success") {
+                    throw new Error("Error al cargar los grupos");
+                } else if (grupos.length == 0) {
+                    throw new Error("No hay grupos para esta carrera, puedes crear uno nuevo");
+                }
+
+                document.getElementById("message").innerHTML = "";
+                grupoModal.querySelectorAll("li:not(:first-child)").forEach(li => li.remove());
+                document.querySelector("#grupo").setAttribute("hidden", true);
+                grupos.forEach(grupo => {
+                    const li = document.createElement("li");
+                    // data-id is the id of the group
+                    li.setAttribute("data-id", grupo);
+                    li.textContent = grupo;
+                    dlgrupo.appendChild(li);
+                    li.addEventListener("click", async () => await setTimeout(buscarGrupo, 0))
+
+                    // remove from grupoModal all the li elements except the first one
+                    grupoModal.appendChild(li.cloneNode(true));
+                });
+
+                // on click the li element, inside datalist #grupoModal
+                document.querySelectorAll("#grupoModal li").forEach(li => {
+                    li.addEventListener("click", () => {
+                        const grupo = li.getAttribute("data-id");
+                        const filter_grupo = document.querySelector("#grupo");
+                        filter_grupo.classList.remove("is-invalid");
+                        if (grupo == "")
+                            filter_grupo.removeAttribute("hidden");
+                        else
+                            filter_grupo.setAttribute("hidden", true);
+                        filter_grupo.value = grupo;
+                    });
+                });
+                disableDatalist("#filter_grupo", false);
+
+            } catch (error) {
+                // remove Error: from the error message
+                error = error.toString().replace("Error: ", "");
+                triggerMessage(error, "Error", "warning");
+                console.error(error);
+                disableDatalist("#filter_grupo", true);
+            } finally {
+                document.querySelector("#nuevo").classList.remove("d-none");
+                // write Seleccionar grupo
+                promptDL.textContent = "Seleccionar grupo";
+                console.log(promptDL);
+                // to #filter_grupo input value
+                const filter_grupo = document.querySelector("#filter_grupo");
+                filter_grupo.value = "";
+                table.style.display = "none";
+            }
+
+            const datalist = document.querySelector("#materias");
+            const materias = await fetch("action/action_materias.php", {
+                method: "POST",
+                body: formData
+            }).then(res => res.json());
+        });
+
+    })
+    // on modal edit, show the data
+    $("#modal-editar").on("show.bs.modal", async function (event) {
+        document.querySelectorAll("#modal-editar .is-invalid, #modal-editar .is-valid")?.forEach(element => element.classList.remove("is-invalid", "is-valid"));
+
+
+        const button = event.relatedTarget;
+        const parentId = button.parentElement.parentElement.getAttribute("data-ids");
+        const grupo = document.querySelector("#filter_grupo").value;
+        setDatalist("#dli-grupo", grupo);
+        document.querySelector("#grupo").value = grupo;
+        document.querySelector("#grupo").setAttribute("hidden", true);
+
+        if (parentId == null) {
+            resetFormModal();
+            disableDatalist("#dli-grupo", false);
+            setDatalist("#dli-grupo", grupo);
+            document.querySelector("#grupo").value = grupo;
+            if (grupo == "")
+                document.querySelector("#grupo").removeAttribute("hidden");
+
+            // search the data-id of the day and click it
+            setDatalistFirst("#selector_horas");
+            setDatalist("#selector_minutos", 15);
+            const input_materia = document.getElementById('dlMateria');
+            const formData = new FormData();
+            formData.append("carrera", document.querySelector("#filter_carrera").value);
+
+            try {
+                const {
+                    status,
+                    materias,
+                } = await fetch("action/action_materias.php", {
+                    method: "POST",
+                    body: formData
+                }).then(res => res.json());
+
+                if (status != "success")
+                    throw new Error("Error al cargar las materias");
+                else if (materias.length == 0)
+                    throw new Error("No hay materias para esta carrera");
+
+                const dlMateria = document.querySelector("#lista_materias");
+                dlMateria.innerHTML = "";
+                materias.forEach(materia => {
+                    const option = document.createElement("option");
+                    option.setAttribute("data-id", materia.id);
+                    option.setAttribute("value", materia.nombre);
+                    dlMateria.appendChild(option);
+                });
+
+            } catch (error) {
+                // remove Error: from the error message
+                error = error.toString().replace("Error: ", "");
+                triggerMessage(error, "Error, no se pudo cargar las materias");
+                console.error(error);
+            }
+
+            const btnGuardar = document.getElementById('btn-guardar');
+            // btnGuardar.onclick = () => guardar(id);
+
+
+            btnGuardar.onclick = async () => {
+                const formData = extractFromModal();
+                if (formData == null)
+                    return;
+                // check if a field is empty
+                for (const value of formData.values())
+                    if (value == "")
+                        return triggerMessage("Todos los campos son obligatorios", "Error", "danger", "message_editar", true);
+                formData.append("facultad", <?= $user->facultad['facultad_id'] ?>);
+                formData.append("periodo", <?= $user->periodo ?>);
+                formData.append("grupo", document.querySelector("input#grupo").value);
+
+                await insertHorario(formData);
+                resetFormModal();
+                $("#modal-editar").modal("hide");
+            };
+
+            return;
+        }
+        const {
+            id,
+            dia,
+            hora,
+            materia,
+            salon,
+            profesores,
+            duracion
+        } = gHorarios?.find(horario => horario.id == parentId);
+
+        // search the data-id of the day and click it
+        const númeroDía = ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'].reduce((acc, curr, key) => (curr == dia) ? key : acc);
+        document.querySelector(`#dldia li[data-id="${númeroDía}"]`)?.click();
+        document.querySelector(`#dlduración li[data-id="${duracion}"]`)?.click();
+        const horas = hora.split(":")[0];
+        const minutos = hora.split(":")[1];
+        setDatalist("#selector_horas", horas);
+        setDatalist("#selector_minutos", minutos);
+        document.getElementById('editor_salón').value = salon;
+        const input_materia = document.getElementById('dlMateria');
+        input_materia.value = materia;
+        // disable the input
+        input_materia.setAttribute("disabled", true);
+        input_materia.classList.add("bg-info");
+
+        disableDatalist("#dli-grupo")
+
+        // get the option with data-id profesor
+        document.getElementById("profesores").innerHTML = "";
+        profesores.forEach(listProfesor);
+
+        const btnGuardar = document.getElementById('btn-guardar');
+        btnGuardar.onclick = () => guardar(id);
+    })
+    $("#modal-borrar").modal({
+        show: false,
+        backdrop: "static",
+        keyboard: false,
+    })
+    $("#modal-borrar").on("show.bs.modal", async function (event) {
+        const button = event.relatedTarget;
+        const id = button.parentElement.parentElement.getAttribute("data-ids");
+
+        const btnBorrar = document.getElementById('btn-borrar');
+        btnBorrar.onclick = () => borrarHorario(id);
+    })
+</script>
+
 </html>

+ 46 - 46
css/checador.css

@@ -1,46 +1,46 @@
-
-body {
-    font-family: 'indivisa-text';
-    /*background-image: linear-gradient(rgba(0,29,104, 0.3), rgba(0,29,104, 0.3)), url('../imagenes/fondochecador.png');*/
-    background-image:  url('../imagenes/fondochecador.jpg');
-    background-repeat: no-repeat;
-    background-attachment: fixed;
-    background-size: cover;
-    background-position: center;
-    height: 100%;
-    overflow: hidden;
-}
-
-.hora{font-size: 4rem; border-right: 2px solid #d21034; line-height: 1.1; padding-bottom: 8px;}
-.fecha{font-size: 1.9rem; line-height: 1.2em; }
-.facultad{font-size: 1.5rem; font-weight: bold; color: #aaa;}
-.checa-box{width:800px; min-height: 380px; -webkit-box-shadow: 0px 0px 5px 1px rgba(150,150,150,0.2); -moz-box-shadow: 0px 0px 5px 1px rgba(150,150,150,0.2); box-shadow: 0px 0px 5px 1px rgba(150,150,150,0.2);}
-
-h1, h2, h3 {letter-spacing: 1px; position: relative; color: #001e61;}
-.subtitle:before{ content: ''; position: absolute; bottom: -8px; left: 0; width: 80px; display: block; background: #d21034; height: 3px; }
-
-.text-big{font-size:3.6rem;}
-#list-result{font-size:1.15rem;}
-#list-result li{margin:0.2em 0; border-bottom: 1px dashed #969696;}
-
-.text-clave{ outline: none; color: #b7b7b7 !important; background: transparent; border: 1px solid #dbdcdd; border-radius: 5px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; font-size: 12px; font-weight: 300; vertical-align: middle; text-align:center; padding: 10px 20px;}
-.text-clave:focus{ color: #001d68 !important; border-color: #001d68;}
-.sin-servicio, .text-clave{font-size:1.7rem;}
-.aviso{ font-size:120%;}
-.mensaje{ font-size: 7vh; }
-
-@media (max-width: 768px) {
-    .hora{ font-size: 3.2rem;}
-    .fecha{font-size: 1.4rem;}
-    .checa-box{width:100%;}
-    .text-big{font-size:3rem;}
-    .sin-servicio, .text-clave{font-size:1.2rem;}
-}
-@media (max-width: 576px) {
-    .hora{font-size: 2rem !important;}
-    .fecha, .titulo{font-size: 1rem;}
-    #logo{width: 75%;}
-    .facultad{font-size: 1.2rem}
-    .text-big{font-size:2.8rem;}
-    
-}
+
+body {
+    font-family: 'indivisa-text';
+    /*background-image: linear-gradient(rgba(0,29,104, 0.3), rgba(0,29,104, 0.3)), url('../imagenes/fondochecador.png');*/
+    background-image:  url('../imagenes/fondochecador.jpg');
+    background-repeat: no-repeat;
+    background-attachment: fixed;
+    background-size: cover;
+    background-position: center;
+    height: 100%;
+    overflow: hidden;
+}
+
+.hora{font-size: 4rem; border-right: 2px solid #d21034; line-height: 1.1; padding-bottom: 8px;}
+.fecha{font-size: 1.9rem; line-height: 1.2em; }
+.facultad{font-size: 1.5rem; font-weight: bold; color: #aaa;}
+.checa-box{width:800px; min-height: 380px; -webkit-box-shadow: 0px 0px 5px 1px rgba(150,150,150,0.2); -moz-box-shadow: 0px 0px 5px 1px rgba(150,150,150,0.2); box-shadow: 0px 0px 5px 1px rgba(150,150,150,0.2);}
+
+h1, h2, h3 {letter-spacing: 1px; position: relative; color: #001e61;}
+.subtitle:before{ content: ''; position: absolute; bottom: -8px; left: 0; width: 80px; display: block; background: #d21034; height: 3px; }
+
+.text-big{font-size:3.6rem;}
+#list-result{font-size:1.15rem;}
+#list-result li{margin:0.2em 0; border-bottom: 1px dashed #969696;}
+
+.text-clave{ outline: none; color: #b7b7b7 !important; background: transparent; border: 1px solid #dbdcdd; border-radius: 5px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; font-size: 12px; font-weight: 300; vertical-align: middle; text-align:center; padding: 10px 20px;}
+.text-clave:focus{ color: #001d68 !important; border-color: #001d68;}
+.sin-servicio, .text-clave{font-size:1.7rem;}
+.aviso{ font-size:120%;}
+.mensaje{ font-size: 7vh; }
+
+@media (max-width: 768px) {
+    .hora{ font-size: 3.2rem;}
+    .fecha{font-size: 1.4rem;}
+    .checa-box{width:100%;}
+    .text-big{font-size:3rem;}
+    .sin-servicio, .text-clave{font-size:1.2rem;}
+}
+@media (max-width: 576px) {
+    .hora{font-size: 2rem !important;}
+    .fecha, .titulo{font-size: 1rem;}
+    #logo{width: 75%;}
+    .facultad{font-size: 1.2rem}
+    .text-big{font-size:2.8rem;}
+    
+}

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 9 - 9
css/custominputfile.min.css


+ 189 - 189
css/richtext.css

@@ -1,190 +1,190 @@
-.richText {
-	position: relative;
-	border: 1px solid #D6D8D8;
-	background: #D6D8D8;
-	width: 100%;
-	border-radius: 0.25rem;
-}
-
-.richText .richText-toolbar ul {
-	padding: 0 !important;
-	margin: 0 !important;
-	display: flex;
-	flex-wrap: wrap;
-        justify-content: left;/*center*/
-}
-
-.richText .richText-toolbar ul li {
-	list-style: none;
-}
-
-.richText .richText-toolbar ul li a {
-	display: block;
-	padding: 0.25rem 0.5rem;
-	cursor: pointer;
-	-webkit-transition: color 0.4s;
-	-moz-transition: color 0.4s;
-	transition: color 0.4s;
-}
-
-.richText .richText-toolbar ul li a:hover {
-	color: #001d68;
-}
-
-.richText .richText-toolbar ul li a .fa, .richText .richText-toolbar ul li a .fas, .richText .richText-toolbar ul li a .far, .richText .richText-toolbar ul li a svg {
-	pointer-events: none;
-}
-
-.richText .richText-toolbar ul li[data-disable="true"] {
-	opacity: 0.1;
-}
-
-.richText .richText-toolbar ul li[data-disable="true"] a {
-	cursor: default;
-}
-
-.richText .richText-toolbar ul li:not([data-disable="true"]).is-selected .richText-dropdown-outer {
-	display: block;
-}
-
-.richText .richText-toolbar ul:after {
-	display: block;
-	content: "";
-	clear: both;
-}
-
-.richText .richText-toolbar:last-child {
-	font-size: 0.75rem;
-}
-
-.richText .richText-toolbar:after {
-	display: block;
-	clear: both;
-	content: "";
-}
-
-.richText .richText-form select {cursor: pointer;}
-
-.richText .richText-editor {
-	padding: 0.5rem;
-	background-color: #FFFFFF;
-	height: 15rem;
-	outline: none;
-	overflow-y: scroll;
-	overflow-x: auto;
-}
-
-.richText .richText-toolbar ul li a .richText-dropdown-outer {
-	display: none;
-	position: absolute;
-	top: 0;
-	left: 0;
-	right: 0;
-	bottom: 0;
-	background-color: rgba(0, 0, 0, 0.3);
-	cursor: default;
-}
-
-.richText .richText-toolbar ul li a .richText-dropdown-outer .richText-dropdown {
-	position: relative;
-	z-index:10;
-	display: block;
-	margin: 3% auto 0 auto;
-	background-color: #D6D8D8;
-	border: 0.1rem solid #777777;
-	border-radius: 0.25rem;
-	    padding: 0.75rem;
-    padding-top: 1.5rem;
-	max-width: 90%;
-	-webkit-box-shadow: 0 0 5px 0 #777777;
-	-moz-box-shadow: 0 0 5px 0 #777777;
-	box-shadow: 0 0 5px 0 #777777;
-}
-
-.richText .richText-toolbar ul li a .richText-dropdown-outer .richText-dropdown .richText-dropdown-close {
-	position: absolute;
-	top: 0.25rem;
-	right: 0.5rem;
-	color: #CE0E2D;
-	cursor: pointer;
-}
-
-.richText .richText-toolbar ul li a .richText-dropdown-outer .richText-dropdown .richText-dropdown-close:hover {
-	opacity: 0.5
-}
-
-.richText-form-item{
-    position: relative;
-    display: flex;
-    flex-wrap: wrap;
-    align-items: stretch;
-    width: 100%;
-}
-
-.richText .richText-form label {
-   display: flex;
-    align-items: left;/*center*/
-    padding: 0.375rem 0.75rem;
-    margin-bottom: 0;
-    font-size: 1rem;
-    font-weight: 400;
-    line-height: 1.5;
-	font-weight: 600;
-    text-align: left;/*center*/
-    white-space: nowrap;
-}
-
-.richText .richText-form input[type="text"], .richText .richText-form input[type="file"], .richText .richText-form input[type="number"], .richText .richText-form select {
-	display: block;
-    height: calc(1.5em + 0.75rem + 2px);
-    padding: 0.375rem 0.75rem;
-    font-size: 1rem;
-    font-weight: 400;
-    line-height: 1.5;
-    color: #777777;
-    background-color: #FFFFFF;
-    background-clip: padding-box;
-    border: 1px solid #D6D8DB;
-    border-radius: 0.25rem;
-    transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
-    position: relative;
-    flex: 1 1 auto;
-    width: 1%;
-    margin-bottom: 0;
-}
-
-.richText .richText-toolbar ul li a .richText-dropdown-outer ul.richText-dropdown {list-style: none;}
-.richText .richText-toolbar ul li a .richText-dropdown-outer ul.richText-dropdown li {display: block;float: none;font-family: Calibri,Verdana,Helvetica,sans-serif;}
-.richText .richText-toolbar ul li a .richText-dropdown-outer ul.richText-dropdown li a {display: block;padding: 10px 15px;border-bottom: #EFEFEF solid 1px;}
-.richText .richText-toolbar ul li a .richText-dropdown-outer ul.richText-dropdown li a:hover {background-color: #FFFFFF;}
-.richText .richText-toolbar ul li a .richText-dropdown-outer ul.richText-dropdown li.inline {margin: 10px 6px;float: left;}
-.richText .richText-toolbar ul li a .richText-dropdown-outer ul.richText-dropdown li.inline a {display: block;padding: 0;margin: 0;border: none;-webkit-border-radius: 50%;-moz-border-radius: 50%;border-radius: 50%;-webkit-box-shadow: 0 0 10px 0 #999;-moz-box-shadow: 0 0 10px 0 #999;box-shadow: 0 0 10px 0 #999;}
-.richText .richText-toolbar ul li a .richText-dropdown-outer ul.richText-dropdown li.inline a span {display: block;height: 30px;width: 30px;-webkit-border-radius: 50%;-moz-border-radius: 50%;border-radius: 50%;}
-
-
-.richText .richText-undo, .richText .richText-redo {
-	float: left;
-	display: block;
-	padding: 0.5rem;
-	cursor: pointer;
-}
-
-.richText .richText-undo.is-disabled, .richText .richText-redo.is-disabled {
-	opacity: 0.4;
-}
-
-.richText .richText-help {
-	display: none;
-}
-
-/*
-.richText .richText-initial {margin-bottom: -4px;padding: 10px;background-color: #282828;border: none;color: #33FF33;font-family: Monospace,Calibri,Verdana,Helvetica,sans-serif;max-width: 100%;min-width: 100%;width: 100%;min-height: 400px;height: 400px;}
-.richText .richText-editor ul, .richText .richText-editor ol {margin: 10px 25px;}
-.richText .richText-editor:focus {border-left: #3498db solid 2px;}
-.richText .richText-editor table {margin: 10px 0;border-spacing: 0;width: 100%;}
-.richText .richText-editor table td, .richText .richText-editor table th {padding: 10px;border: #EFEFEF solid 1px;}
-.richText .richText-help {float: right;display: block;padding: 10px 15px;cursor: pointer;}
-.richText .richText-help-popup a {color: #3498db;text-decoration: underline;}
-.richText .richText-help-popup hr {margin: 10px auto 5px auto;border: none;border-top: #EFEFEF solid 1px;}
-.richText .richText-list.list-rightclick {position: absolute;background-color: #FAFAFA;border-right: #EFEFEF solid 1px;border-bottom: #EFEFEF solid 1px;}
+.richText {
+	position: relative;
+	border: 1px solid #D6D8D8;
+	background: #D6D8D8;
+	width: 100%;
+	border-radius: 0.25rem;
+}
+
+.richText .richText-toolbar ul {
+	padding: 0 !important;
+	margin: 0 !important;
+	display: flex;
+	flex-wrap: wrap;
+        justify-content: left;/*center*/
+}
+
+.richText .richText-toolbar ul li {
+	list-style: none;
+}
+
+.richText .richText-toolbar ul li a {
+	display: block;
+	padding: 0.25rem 0.5rem;
+	cursor: pointer;
+	-webkit-transition: color 0.4s;
+	-moz-transition: color 0.4s;
+	transition: color 0.4s;
+}
+
+.richText .richText-toolbar ul li a:hover {
+	color: #001d68;
+}
+
+.richText .richText-toolbar ul li a .fa, .richText .richText-toolbar ul li a .fas, .richText .richText-toolbar ul li a .far, .richText .richText-toolbar ul li a svg {
+	pointer-events: none;
+}
+
+.richText .richText-toolbar ul li[data-disable="true"] {
+	opacity: 0.1;
+}
+
+.richText .richText-toolbar ul li[data-disable="true"] a {
+	cursor: default;
+}
+
+.richText .richText-toolbar ul li:not([data-disable="true"]).is-selected .richText-dropdown-outer {
+	display: block;
+}
+
+.richText .richText-toolbar ul:after {
+	display: block;
+	content: "";
+	clear: both;
+}
+
+.richText .richText-toolbar:last-child {
+	font-size: 0.75rem;
+}
+
+.richText .richText-toolbar:after {
+	display: block;
+	clear: both;
+	content: "";
+}
+
+.richText .richText-form select {cursor: pointer;}
+
+.richText .richText-editor {
+	padding: 0.5rem;
+	background-color: #FFFFFF;
+	height: 15rem;
+	outline: none;
+	overflow-y: scroll;
+	overflow-x: auto;
+}
+
+.richText .richText-toolbar ul li a .richText-dropdown-outer {
+	display: none;
+	position: absolute;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	background-color: rgba(0, 0, 0, 0.3);
+	cursor: default;
+}
+
+.richText .richText-toolbar ul li a .richText-dropdown-outer .richText-dropdown {
+	position: relative;
+	z-index:10;
+	display: block;
+	margin: 3% auto 0 auto;
+	background-color: #D6D8D8;
+	border: 0.1rem solid #777777;
+	border-radius: 0.25rem;
+	    padding: 0.75rem;
+    padding-top: 1.5rem;
+	max-width: 90%;
+	-webkit-box-shadow: 0 0 5px 0 #777777;
+	-moz-box-shadow: 0 0 5px 0 #777777;
+	box-shadow: 0 0 5px 0 #777777;
+}
+
+.richText .richText-toolbar ul li a .richText-dropdown-outer .richText-dropdown .richText-dropdown-close {
+	position: absolute;
+	top: 0.25rem;
+	right: 0.5rem;
+	color: #CE0E2D;
+	cursor: pointer;
+}
+
+.richText .richText-toolbar ul li a .richText-dropdown-outer .richText-dropdown .richText-dropdown-close:hover {
+	opacity: 0.5
+}
+
+.richText-form-item{
+    position: relative;
+    display: flex;
+    flex-wrap: wrap;
+    align-items: stretch;
+    width: 100%;
+}
+
+.richText .richText-form label {
+   display: flex;
+    align-items: left;/*center*/
+    padding: 0.375rem 0.75rem;
+    margin-bottom: 0;
+    font-size: 1rem;
+    font-weight: 400;
+    line-height: 1.5;
+	font-weight: 600;
+    text-align: left;/*center*/
+    white-space: nowrap;
+}
+
+.richText .richText-form input[type="text"], .richText .richText-form input[type="file"], .richText .richText-form input[type="number"], .richText .richText-form select {
+	display: block;
+    height: calc(1.5em + 0.75rem + 2px);
+    padding: 0.375rem 0.75rem;
+    font-size: 1rem;
+    font-weight: 400;
+    line-height: 1.5;
+    color: #777777;
+    background-color: #FFFFFF;
+    background-clip: padding-box;
+    border: 1px solid #D6D8DB;
+    border-radius: 0.25rem;
+    transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+    position: relative;
+    flex: 1 1 auto;
+    width: 1%;
+    margin-bottom: 0;
+}
+
+.richText .richText-toolbar ul li a .richText-dropdown-outer ul.richText-dropdown {list-style: none;}
+.richText .richText-toolbar ul li a .richText-dropdown-outer ul.richText-dropdown li {display: block;float: none;font-family: Calibri,Verdana,Helvetica,sans-serif;}
+.richText .richText-toolbar ul li a .richText-dropdown-outer ul.richText-dropdown li a {display: block;padding: 10px 15px;border-bottom: #EFEFEF solid 1px;}
+.richText .richText-toolbar ul li a .richText-dropdown-outer ul.richText-dropdown li a:hover {background-color: #FFFFFF;}
+.richText .richText-toolbar ul li a .richText-dropdown-outer ul.richText-dropdown li.inline {margin: 10px 6px;float: left;}
+.richText .richText-toolbar ul li a .richText-dropdown-outer ul.richText-dropdown li.inline a {display: block;padding: 0;margin: 0;border: none;-webkit-border-radius: 50%;-moz-border-radius: 50%;border-radius: 50%;-webkit-box-shadow: 0 0 10px 0 #999;-moz-box-shadow: 0 0 10px 0 #999;box-shadow: 0 0 10px 0 #999;}
+.richText .richText-toolbar ul li a .richText-dropdown-outer ul.richText-dropdown li.inline a span {display: block;height: 30px;width: 30px;-webkit-border-radius: 50%;-moz-border-radius: 50%;border-radius: 50%;}
+
+
+.richText .richText-undo, .richText .richText-redo {
+	float: left;
+	display: block;
+	padding: 0.5rem;
+	cursor: pointer;
+}
+
+.richText .richText-undo.is-disabled, .richText .richText-redo.is-disabled {
+	opacity: 0.4;
+}
+
+.richText .richText-help {
+	display: none;
+}
+
+/*
+.richText .richText-initial {margin-bottom: -4px;padding: 10px;background-color: #282828;border: none;color: #33FF33;font-family: Monospace,Calibri,Verdana,Helvetica,sans-serif;max-width: 100%;min-width: 100%;width: 100%;min-height: 400px;height: 400px;}
+.richText .richText-editor ul, .richText .richText-editor ol {margin: 10px 25px;}
+.richText .richText-editor:focus {border-left: #3498db solid 2px;}
+.richText .richText-editor table {margin: 10px 0;border-spacing: 0;width: 100%;}
+.richText .richText-editor table td, .richText .richText-editor table th {padding: 10px;border: #EFEFEF solid 1px;}
+.richText .richText-help {float: right;display: block;padding: 10px 15px;cursor: pointer;}
+.richText .richText-help-popup a {color: #3498db;text-decoration: underline;}
+.richText .richText-help-popup hr {margin: 10px auto 5px auto;border: none;border-top: #EFEFEF solid 1px;}
+.richText .richText-list.list-rightclick {position: absolute;background-color: #FAFAFA;border-right: #EFEFEF solid 1px;border-bottom: #EFEFEF solid 1px;}
 .richText .richText-list.list-rightclick li {padding: 5px 7px;cursor: pointer;list-style: none;}*/

+ 234 - 234
demo.html

@@ -1,235 +1,235 @@
-<link rel="stylesheet" href="css/indivisa.css">
-<p class="container">
-    <i class="ing-fb1"></i> ing-fb1
-</p>
-<p class="container">
-    <i class="ing-fb2"></i> ing-fb2
-</p>
-<p class="container">
-    <i class="ing-tw1"></i> ing-tw1
-</p>
-<p class="container">
-    <i class="ing-tw2"></i> ing-tw2
-</p>
-<p class="container">
-    <i class="ing-in1"></i> ing-in1
-</p>
-<p class="container">
-    <i class="ing-in2"></i> ing-in2
-</p>
-<p class="container">
-    <i class="ing-instra1"></i> ing-instra1
-</p>
-<p class="container">
-    <i class="ing-instra2"></i> ing-instra2
-</p>
-<p class="container">
-    <i class="ing-youtube"></i> ing-youtube
-</p>
-<p class="container">
-    <i class="ing-telefono"></i> ing-telefono
-</p>
-<p class="container">
-    <i class="ing-mail"></i> ing-mail
-</p>
-<p class="container">
-    <i class="ing-link"></i> ing-link
-</p>
-<p class="container">
-    <i class="ing-ubicacion"></i> ing-ubicacion
-</p>
-<p class="container">
-    <i class="ing-puntos"></i> ing-puntos
-</p>
-<p class="container">
-    <i class="ing-usuario"></i> ing-usuario
-</p>
-<p class="container">
-    <i class="ing-pass"></i> ing-pass
-</p>
-<p class="container">
-    <i class="ing-menu"></i> ing-menu
-</p>
-<p class="container">
-    <i class="ing-salir"></i> ing-salir
-</p>
-<p class="container">
-    <i class="ing-flecha"></i> ing-flecha
-</p>
-<p class="container">
-    <i class="ing-cambiar"></i> ing-cambiar
-</p>
-<p class="container">
-    <i class="ing-caret"></i> ing-caret
-</p>
-<p class="container">
-    <i class="ing-aceptar"></i> ing-aceptar
-</p>
-<p class="container">
-    <i class="ing-cancelar"></i> ing-cancelar
-</p>
-<p class="container">
-    <i class="ing-mas"></i> ing-mas
-</p>
-<p class="container">
-    <i class="ing-menos"></i> ing-menos
-</p>
-<p class="container">
-    <i class="ing-editar"></i> ing-editar
-</p>
-<p class="container">
-    <i class="ing-buscar"></i> ing-buscar
-</p>
-<p class="container">
-    <i class="ing-ojo"></i> ing-ojo
-</p>
-<p class="container">
-    <i class="ing-borrar"></i> ing-borrar
-</p>
-<p class="container">
-    <i class="ing-basura"></i> ing-basura
-</p>
-<p class="container">
-    <i class="ing-camara"></i> ing-camara
-</p>
-<p class="container">
-    <i class="ing-importante"></i> ing-importante
-</p>
-<p class="container">
-    <i class="ing-bullet"></i> ing-bullet
-</p>
-<p class="container">
-    <i class="ing-home"></i> ing-home
-</p>
-<p class="container">
-    <i class="ing-formacion"></i> ing-formacion
-</p>
-<p class="container">
-    <i class="ing-empleo"></i> ing-empleo
-</p>
-<p class="container">
-    <i class="ing-insignia1"></i> ing-insignia1
-</p>
-<p class="container">
-    <i class="ing-insignia2"></i> ing-insignia2
-</p>
-<p class="container">
-    <i class="ing-insignia3"></i> ing-insignia3
-</p>
-<p class="container">
-    <i class="ing-insignia4"></i> ing-insignia4
-</p>
-<p class="container">
-    <i class="ing-eventos"></i> ing-eventos
-</p>
-<p class="container">
-    <i class="ing-reporte"></i> ing-reporte
-</p>
-<p class="container">
-    <i class="ing-catalogo"></i> ing-catalogo
-</p>
-<p class="container">
-    <i class="ing-evalua-cartel"></i> ing-evalua-cartel
-</p>
-<p class="container">
-    <i class="ing-revision-cartel"></i> ing-revision-cartel
-</p>
-<p class="container">
-    <i class="ing-reporte-resultados"></i> ing-reporte-resultados
-</p>
-<p class="container">
-    <i class="ing-mi-cartel"></i> ing-mi-cartel
-</p>
-<p class="container">
-    <i class="ing-galeria1"></i> ing-galeria1
-</p>
-<p class="container">
-    <i class="ing-galeria2"></i> ing-galeria2
-</p>
-<p class="container">
-    <i class="ing-iniciar-sesion"></i> ing-iniciar-sesion
-</p>
-<p class="container">
-    <i class="ing-finalistas"></i> ing-finalistas
-</p>
-<p class="container">
-    <i class="ing-comite"></i> ing-comite
-</p>
-<p class="container">
-    <i class="ing-administrador"></i> ing-administrador
-</p>
-<p class="container">
-    <i class="ing-estrella1"></i> ing-estrella1
-</p>
-<p class="container">
-    <i class="ing-estrella2"></i> ing-estrella2
-</p>
-<p class="container">
-    <i class="ing-carga-archivo"></i> ing-carga-archivo
-</p>
-<p class="container">
-    <i class="ing-carga-multiple"></i> ing-carga-multiple
-</p>
-<p class="container">
-    <i class="ing-descarga"></i> ing-descarga
-</p>
-<p class="container">
-    <i class="ing-autorizar"></i> ing-autorizar
-</p>
-<p class="container">
-    <i class="ing-negar"></i> ing-negar
-</p>
-<p class="container">
-    <i class="ing-no-cargado"></i> ing-no-cargado
-</p>
-<p class="container">
-    <i class="ing-alumnos"></i> ing-alumnos
-</p>
-<p class="container">
-    <i class="ing-cardex"></i> ing-cardex
-</p>
-<p class="container">
-    <i class="ing-configuracion"></i> ing-configuracion
-</p>
-<p class="container">
-    <i class="ing-listado-menus"></i> ing-listado-menus
-</p>
-<p class="container">
-    <i class="ing-mi-cuenta"></i> ing-mi-cuenta
-</p>
-<p class="container">
-    <i class="ing-ver"></i> ing-ver
-</p>
-<p class="container">
-    <i class="ing-grafica"></i> ing-grafica
-</p>
-<p class="container">
-    <i class="ing-clic"></i> ing-clic
-</p>
-<p class="container">
-    <i class="ing-guardar"></i> ing-guardar
-</p>
-<p class="container">
-    <i class="ing-regresar"></i> ing-regresar
-</p>
-<p class="container">
-    <i class="ing-cuadrado"></i> ing-cuadrado
-</p>
-<p class="container">
-    <i class="ing-imprimir"></i> ing-imprimir
-</p>
-<p class="container">
-    <i class="ing-importante2"></i> ing-importante2
-</p>
-<p class="container">
-    <i class="ing-copiar"></i> ing-copiar
-</p>
-<p class="container">
-    <i class="ing-reloj"></i> ing-reloj
-</p>
-<p class="container">
-    <i class="ing-retardo"></i> ing-retardo
-</p>
-<p class="container">
-    <i class="ing-justificar"></i> ing-justificar
+<link rel="stylesheet" href="css/indivisa.css">
+<p class="container">
+    <i class="ing-fb1"></i> ing-fb1
+</p>
+<p class="container">
+    <i class="ing-fb2"></i> ing-fb2
+</p>
+<p class="container">
+    <i class="ing-tw1"></i> ing-tw1
+</p>
+<p class="container">
+    <i class="ing-tw2"></i> ing-tw2
+</p>
+<p class="container">
+    <i class="ing-in1"></i> ing-in1
+</p>
+<p class="container">
+    <i class="ing-in2"></i> ing-in2
+</p>
+<p class="container">
+    <i class="ing-instra1"></i> ing-instra1
+</p>
+<p class="container">
+    <i class="ing-instra2"></i> ing-instra2
+</p>
+<p class="container">
+    <i class="ing-youtube"></i> ing-youtube
+</p>
+<p class="container">
+    <i class="ing-telefono"></i> ing-telefono
+</p>
+<p class="container">
+    <i class="ing-mail"></i> ing-mail
+</p>
+<p class="container">
+    <i class="ing-link"></i> ing-link
+</p>
+<p class="container">
+    <i class="ing-ubicacion"></i> ing-ubicacion
+</p>
+<p class="container">
+    <i class="ing-puntos"></i> ing-puntos
+</p>
+<p class="container">
+    <i class="ing-usuario"></i> ing-usuario
+</p>
+<p class="container">
+    <i class="ing-pass"></i> ing-pass
+</p>
+<p class="container">
+    <i class="ing-menu"></i> ing-menu
+</p>
+<p class="container">
+    <i class="ing-salir"></i> ing-salir
+</p>
+<p class="container">
+    <i class="ing-flecha"></i> ing-flecha
+</p>
+<p class="container">
+    <i class="ing-cambiar"></i> ing-cambiar
+</p>
+<p class="container">
+    <i class="ing-caret"></i> ing-caret
+</p>
+<p class="container">
+    <i class="ing-aceptar"></i> ing-aceptar
+</p>
+<p class="container">
+    <i class="ing-cancelar"></i> ing-cancelar
+</p>
+<p class="container">
+    <i class="ing-mas"></i> ing-mas
+</p>
+<p class="container">
+    <i class="ing-menos"></i> ing-menos
+</p>
+<p class="container">
+    <i class="ing-editar"></i> ing-editar
+</p>
+<p class="container">
+    <i class="ing-buscar"></i> ing-buscar
+</p>
+<p class="container">
+    <i class="ing-ojo"></i> ing-ojo
+</p>
+<p class="container">
+    <i class="ing-borrar"></i> ing-borrar
+</p>
+<p class="container">
+    <i class="ing-basura"></i> ing-basura
+</p>
+<p class="container">
+    <i class="ing-camara"></i> ing-camara
+</p>
+<p class="container">
+    <i class="ing-importante"></i> ing-importante
+</p>
+<p class="container">
+    <i class="ing-bullet"></i> ing-bullet
+</p>
+<p class="container">
+    <i class="ing-home"></i> ing-home
+</p>
+<p class="container">
+    <i class="ing-formacion"></i> ing-formacion
+</p>
+<p class="container">
+    <i class="ing-empleo"></i> ing-empleo
+</p>
+<p class="container">
+    <i class="ing-insignia1"></i> ing-insignia1
+</p>
+<p class="container">
+    <i class="ing-insignia2"></i> ing-insignia2
+</p>
+<p class="container">
+    <i class="ing-insignia3"></i> ing-insignia3
+</p>
+<p class="container">
+    <i class="ing-insignia4"></i> ing-insignia4
+</p>
+<p class="container">
+    <i class="ing-eventos"></i> ing-eventos
+</p>
+<p class="container">
+    <i class="ing-reporte"></i> ing-reporte
+</p>
+<p class="container">
+    <i class="ing-catalogo"></i> ing-catalogo
+</p>
+<p class="container">
+    <i class="ing-evalua-cartel"></i> ing-evalua-cartel
+</p>
+<p class="container">
+    <i class="ing-revision-cartel"></i> ing-revision-cartel
+</p>
+<p class="container">
+    <i class="ing-reporte-resultados"></i> ing-reporte-resultados
+</p>
+<p class="container">
+    <i class="ing-mi-cartel"></i> ing-mi-cartel
+</p>
+<p class="container">
+    <i class="ing-galeria1"></i> ing-galeria1
+</p>
+<p class="container">
+    <i class="ing-galeria2"></i> ing-galeria2
+</p>
+<p class="container">
+    <i class="ing-iniciar-sesion"></i> ing-iniciar-sesion
+</p>
+<p class="container">
+    <i class="ing-finalistas"></i> ing-finalistas
+</p>
+<p class="container">
+    <i class="ing-comite"></i> ing-comite
+</p>
+<p class="container">
+    <i class="ing-administrador"></i> ing-administrador
+</p>
+<p class="container">
+    <i class="ing-estrella1"></i> ing-estrella1
+</p>
+<p class="container">
+    <i class="ing-estrella2"></i> ing-estrella2
+</p>
+<p class="container">
+    <i class="ing-carga-archivo"></i> ing-carga-archivo
+</p>
+<p class="container">
+    <i class="ing-carga-multiple"></i> ing-carga-multiple
+</p>
+<p class="container">
+    <i class="ing-descarga"></i> ing-descarga
+</p>
+<p class="container">
+    <i class="ing-autorizar"></i> ing-autorizar
+</p>
+<p class="container">
+    <i class="ing-negar"></i> ing-negar
+</p>
+<p class="container">
+    <i class="ing-no-cargado"></i> ing-no-cargado
+</p>
+<p class="container">
+    <i class="ing-alumnos"></i> ing-alumnos
+</p>
+<p class="container">
+    <i class="ing-cardex"></i> ing-cardex
+</p>
+<p class="container">
+    <i class="ing-configuracion"></i> ing-configuracion
+</p>
+<p class="container">
+    <i class="ing-listado-menus"></i> ing-listado-menus
+</p>
+<p class="container">
+    <i class="ing-mi-cuenta"></i> ing-mi-cuenta
+</p>
+<p class="container">
+    <i class="ing-ver"></i> ing-ver
+</p>
+<p class="container">
+    <i class="ing-grafica"></i> ing-grafica
+</p>
+<p class="container">
+    <i class="ing-clic"></i> ing-clic
+</p>
+<p class="container">
+    <i class="ing-guardar"></i> ing-guardar
+</p>
+<p class="container">
+    <i class="ing-regresar"></i> ing-regresar
+</p>
+<p class="container">
+    <i class="ing-cuadrado"></i> ing-cuadrado
+</p>
+<p class="container">
+    <i class="ing-imprimir"></i> ing-imprimir
+</p>
+<p class="container">
+    <i class="ing-importante2"></i> ing-importante2
+</p>
+<p class="container">
+    <i class="ing-copiar"></i> ing-copiar
+</p>
+<p class="container">
+    <i class="ing-reloj"></i> ing-reloj
+</p>
+<p class="container">
+    <i class="ing-retardo"></i> ing-retardo
+</p>
+<p class="container">
+    <i class="ing-justificar"></i> ing-justificar
 </p>

+ 342 - 342
días_festivos.php

@@ -1,343 +1,343 @@
-<?php
-require_once 'class/c_login.php';
-require_once 'include/bd_pdo.php';
-
-if(!isset($_SESSION['user'])){
-    header('Location: index.php');
-    exit;
-}
-else
-    $user = unserialize($_SESSION['user']);
-$user->access();
-if(!$user->admin && $user->acceso == 'n'){
-    header('Location: main.php?error=1');
-}else{
-    $user->print_to_log('Dias_festivos');
-}
-if(isset($_GET['facultad'])){
-    $fac = $_GET['facultad'];
-}else if($user->admin){
-    $fac = null;
-}else{
-    $fac = $user->facultad['facultad_id'];
-}
-?>
-<!DOCTYPE html>
-<html lang="en">
-
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>Días Festivos</title>
-    <link rel="stylesheet" href="css/jquery-ui.css">
-    <link rel="stylesheet" href="css/calendar.css">
-    <link rel="stylesheet" href="css/toggle.css" type="text/css">
-    <?php
-    include 'import/html_css_files.php';
-    ?>
-</head>
-
-<body>
-    <?php
-    include "import/html_header.php";
-    html_header(
-        "DÍAS FESTIVOS",
-        "Gestión de Checador "
-    );
-    $user->access();
-    $fs_dias_festivos = query("SELECT * FROM fs_diasfestivos(:facultad, null, null, null) ORDER BY diasfestivos_dia", [':facultad' => $fac], false);
-    $fs_periodos = query("SELECT * FROM fs_periodos(null, null) WHERE estado = 'Activo'", null, false);
-    $fs_dias_festivos_generales = query("SELECT * FROM fs_diasfestivos(null, null) ORDER BY diasfestivos_dia", null, false);
-    ?>
-    <main class="content marco">
-        <?php if($user->admin){ ?>
-        <div class="col-12 text-right">
-            <button type="button" class="btn btn-outline-secondary" data-toggle="modal" data-target="#modal" data-tipo="1"><span class="ing-mas ing-fw"></span> Agregar Día Festivo</button>
-        </div>
-        <?php } ?>
-        <div id="message"></div>
-        <!-- Tabla -->
-        <?php if($fs_dias_festivos || $fs_dias_festivos_generales){ ?>
-            <div class="row mt-3">
-                <div class="col-12 table-responsive">
-                    <table class="table table-sm table-striped table-white">
-                        <thead class="thead-dark">
-                            <tr>
-                                <th>Día</th>
-                                <th>Periodo</th>
-                                <th>Nivel</th>
-                                <?php if($user->admin){ ?>
-                                <th>Facultad</th>
-                                <th>Acciones</th>
-                                <?php } ?>
-                            </tr>
-                        </thead>
-                        <tbody>
-                            <?php foreach($fs_dias_festivos as $dia){ ?>
-                            <tr data-id="<?= $dia['diasfestivos_id'] ?>" id="<?= $dia['diasfestivos_id'] ?>" data-periodo="1">
-                                <td class="text-center"><?php $day =  explode("-", $dia['diasfestivos_dia']);
-                                                            echo $day['2']."-".$day['1']."-".$day['0'];
-                                                        ?></td>
-                                <td class="text-center"><?= $dia['periodo_nombre'] ?></td>
-                                <td class="text-center"><?= $dia['nivel_nombre'] ?></td>
-                                <?php if($user->admin){ ?>
-                                <td class="text-center"><?= $dia['facultad_nombre'] ?></td>
-                                <td class="text-center icono-acciones">
-                                    <a href="#" data-toggle="modal" data-target="#modal" data-tipo="2" title="Editar"><span class="ing-editar ing-fw"></span></a>
-                                    <a href="#" data-toggle="modal" data-target="#modal_confirm" title="Borrar"><span class="ing-basura ing-fw"></span></a>
-                                </td>
-                                <?php } ?>
-                            </tr>
-                            <?php } ?>
-                            <?php foreach($fs_dias_festivos_generales as $dia){ ?>
-                            <tr data-id="<?= $dia['diasfestivos_id'] ?>" id="<?= $dia['diasfestivos_id'] ?>" data-periodo="0">
-                                <td class="text-center"><?php $day =  explode("-", $dia['diasfestivos_dia']);
-                                                            echo $day['2']."-".$day['1']."-".$day['0'];
-                                                        ?></td>
-                                <td class="text-center">Todos</td>
-                                <td class="text-center">Todos</td>    
-                                <?php if($user->admin){ ?>
-                                <td class="text-center">Todas</td>
-                                <td class="text-center icono-acciones">
-                                    <a href="#" data-toggle="modal" data-target="#modal" data-tipo="2" title="Editar"><span class="ing-editar ing-fw"></span></a>
-                                    <a href="#" data-toggle="modal" data-target="#modal_confirm" title="Borrar"><span class="ing-basura ing-fw"></span></a>
-                                </td>
-                                <?php } ?>
-                            </tr>    
-                            <?php } ?>
-                        </tbody>
-                    </table>
-                </div>
-            </div>
-        <?php } ?>
-    </main>
-    <!-- Footer -->
-    <?php
-    include "import/html_footer.php";
-    ?>
-    <!-- Modal -->
-    <div class="modal fade" id="modal" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true">
-        <div class="modal-dialog modal-dialog-centered" role="document">
-            <div class="modal-content">
-                <div class="modal-header">
-                    <h4 class="col-12 modal-title text-center">
-                        <span id="modalLabel">
-                            Editar Día Festivo
-                        </span>
-                        <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
-                            <span aria-hidden="true">&times;</span>
-                        </button>
-                    </h4>
-                </div>
-                <div class="modal-body">
-                    <form action="" method="post" id="formaModal" onsubmit="return valida_campos()">
-                        <input type="hidden" name="id" id="id">
-                        <div class="form-box">
-                            <div class="form-group row">
-                                <label for="periodo" class="col-3 col-form-label">Periodo *</label>
-                                <div class="col-8">
-                                    <div class="datalist datalist-select mb-1 w-100">
-                                        <div class="datalist-input" id="fac">Mostrar todos</div>
-                                        <span class="ing-buscar icono"></span>
-                                        <ul style="display:none">
-                                            <li data-id="0" class="pl4-">Todos</li>
-                                            <?php foreach($fs_periodos as $periodo){ ?>
-                                                <li data-id="<?= $periodo['id'] ?>" class="pl4-"> <?php echo $periodo['periodo']." ".$periodo['facultad']." - ".$periodo['nivel']; ?></li>
-                                            <?php } ?>
-                                            </ul>
-                                        <input type="hidden" id="periodo" name="periodo" value="">
-                                    </div>
-                                </div>
-                            </div>
-                            <div class="form-group row" id="rangoDiv">
-                                <label for="rango" class="col-3 col-form-label">Rango</label>
-                                <div class="col-8">
-                                    <input type="checkbox" data-toggle="toggle" data-onstyle="success" data-offstyle="danger" data-on="SI" data-off="NO" data-size="s" id="rango" name="rango">
-                                </div>
-                            </div>
-                            <div class="form-group row" id="diasFestivos">
-                                <label for="diaFestivo" class="col-3 col-form-label">Día festivo *</label>
-                                <div class="col-4" id="dia">
-                                    <input id="diaFestivo" name="diaFestivo" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly="">
-                                </div>
-                                <div class="col-1 diaFestivoRango">
-                                    -
-                                </div>
-                                <div class="col-4 diaFestivoRango" id="diaFestivoRango">
-                                    <input id="diaFestivoFin" name="diaFestivoFin" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly="">
-                                </div>
-                                <div class="invalid-feedback">Debe seleccionar una fecha</div>
-                            </div>
-                            <div class="form-group row">
-                                <div class="offset-4 col-8">
-                                    <button type="submit" class="btn btn-outline-primary" id="submitBtn" data-tipo="1">
-                                        <span class="ing-aceptar ing-fw"></span> Guardar
-                                    </button>
-                                    <button type="reset" class="btn btn-outline-danger" data-dismiss="modal">
-                                        <span class="ing-cancelar ing-fw"></span> Cancelar
-                                    </button>
-                                </div>
-                            </div>
-                        </div>
-                    </form>
-                </div>
-            </div>
-        </div>
-    </div>
-
-    <div class="modal fade" id="modal_confirm" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true">
-        <div class="modal-dialog modal-dialog-centered" role="document">
-            <div class="modal-content">
-                <div class="modal-body">
-                    <div class="row">
-                        <div class="col">
-                            <p class="font-weight-bold">¿Estás seguro de querer borrar el día festivo?</p>
-                        </div>
-                    </div>
-                </div>
-                <div class="modal-footer">
-                    <input type="hidden" id="id_borrar" value="">
-                    <button type="button" class="btn btn-outline-primary btn-borrar"><span class="ing-aceptar ing-fw"></span> Borrar</button>
-                    <button type="button" class="btn btn-outline-danger" data-dismiss="modal" aria-label="Close"><span class="ing-cancelar ing-fw"></span> Cancelar</button>
-                </div>
-            </div>
-        </div>
-    </div>
-
-    <script src="js/jquery.min.js"></script>
-    <script src="js/jquery-ui.js"></script>
-    <script src="js/bootstrap/bootstrap.min.js"></script>
-    <script src="js/datalist.js"></script>
-    <script src="js/datepicker-es.js"></script>
-    <script src="js/toggle.js"></script>
-    <?php
-        require_once 'js/messages.php';
-    ?>
-    <script>
-        $(document).ready(function(){
-            $('.diaFestivoRango').hide();
-        });
-        $('#rango').change(function(){
-            if($(this).is(':checked')){
-                $('#diaFestivoFin').val('');
-                $('.diaFestivoRango').show();
-                $('#diaFestivoFin').datepicker("setDate", today);
-            }
-            else{
-                $('.diaFestivoRango').hide();
-            }
-        });
-
-        $('#modal_confirm').on('show.bs.modal', function(event){
-            var button = $(event.relatedTarget);
-            var id = button.parents("tr").data("id");
-            $("#id_borrar").val(id);
-        });
-
-        $(".btn-borrar").click(function(){
-            var id = $("#id_borrar").val();
-            $.ajax({
-                url: 'action/action_diasfestivos_borra.php',
-                type: 'post',
-                dataType: 'json',
-                data:{id: id},
-                success:function(result){
-                    location.reload();
-                },
-                error: function(){console.log("Error")}
-            });
-        });
-
-        var today = new Date();
-        $(".date-picker").datepicker($.datepicker.regional["es"]);
-        $(".date-picker").datepicker({
-            dateFormat: "dd/mm/yyyy",
-            changeMonth: true,
-        });
-
-    <?php if(!$fs_dias_festivos && !$fs_dias_festivos_generales){ ?>
-        triggerMessage("No se encontraron días festivos", "Error");
-    <?php } ?>
-
-        $('#modal').on('show.bs.modal', function (event){
-            var button = $(event.relatedTarget);
-            var tipo = button.data('tipo');
-            var modal = $(this);
-            if(tipo==1){//agregar
-                $('#modalLabel').html("Agregar Día Festivo");
-                $('#submitBtn').data('tipo', 1);
-                $('#diaFestivo').datepicker("setDate", today);
-                $('#diaFestivoFin').datepicker("setDate", today);
-                setDatalistFirst("#periodo");
-                $('#rangoDiv').show();
-                $('#dia').removeClass('col-9');
-                $('#dia').addClass('col-4');
-            }
-            else{
-                $('#modalLabel').html("Editar Día Festivo");
-                $('#submitBtn').data('tipo', 2);
-                $('#rangoDiv').hide();
-                $('#dia').removeClass('col-4');
-                $('#dia').addClass('col-9');
-                var id = $(event.relatedTarget).parents('tr').data('id');
-                var periodo = $(event.relatedTarget).parents('tr').data('periodo');
-                $.ajax({
-                    url:"action/action_diasfestivos_select.php",
-                    type:"post",
-                    dataType:"json",
-                    data:{id: id, periodo: periodo},
-                    success:function(result){
-                        console.log(result);
-                        $('#id').val(result['diasfestivos_id']);
-                        if(!result['periodo_id']){
-                            setDatalist('#periodo', 0);
-                        }else{
-                            setDatalist('#periodo', result['periodo_id']);
-                        }
-                        var date = new Date(result['diasfestivos_dia']);
-                        date.setDate(date.getDate() + 1);
-                        $('#diaFestivo').datepicker("setDate", date);
-                    },
-                    error: function(){console.log("Error")}
-                });
-            }
-        });
-
-        function valida_campos(){
-            var error=false;
-            if($("#diaFestivo").val()==""){
-                $("#diaFestivo").addClass("is-invalid");
-                error=true;
-            }
-            var inicio = $("#diaFestivo").val();
-            var fin = $("#diaFestivoFin").val();
-            var aux = inicio.split("/");
-            inicio = aux[2] +"-"+ aux[1] +"-"+ aux[0];
-            aux = fin.split("/");
-            fin = aux[2] +"-"+ aux[1] +"-"+ aux[0];
-            console.log(inicio);
-            if((fin < inicio || fin == inicio)  && $("#rango").is(':checked')){
-                $('#diaFestivoFin').addClass("is-invalid");
-                error=true;
-            }
-            if(error){
-                return false;
-            }else{
-                var btn = $("#submitBtn");
-                if(btn.data("tipo") == 2){//update
-                    $("#formaModal").prop("action", "./action/action_diasfestivos_update.php");
-                }
-                else{//insert
-                    $("#formaModal").prop("action", "./action/action_diasfestivos_insert.php");
-                }
-            }
-        }
-        
-        <?php if(isset($_GET['error'])){ 
-            if($_GET['error'] == 1){ ?>
-                triggerMessage("Este dia festivo ya existe", "Error");
-        <?php }
-        } ?>
-    </script>
-</body>
+<?php
+require_once 'class/c_login.php';
+require_once 'include/bd_pdo.php';
+
+if(!isset($_SESSION['user'])){
+    header('Location: index.php');
+    exit;
+}
+else
+    $user = unserialize($_SESSION['user']);
+$user->access();
+if(!$user->admin && $user->acceso == 'n'){
+    header('Location: main.php?error=1');
+}else{
+    $user->print_to_log('Dias_festivos');
+}
+if(isset($_GET['facultad'])){
+    $fac = $_GET['facultad'];
+}else if($user->admin){
+    $fac = null;
+}else{
+    $fac = $user->facultad['facultad_id'];
+}
+?>
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Días Festivos</title>
+    <link rel="stylesheet" href="css/jquery-ui.css">
+    <link rel="stylesheet" href="css/calendar.css">
+    <link rel="stylesheet" href="css/toggle.css" type="text/css">
+    <?php
+    include 'import/html_css_files.php';
+    ?>
+</head>
+
+<body>
+    <?php
+    include "import/html_header.php";
+    html_header(
+        "DÍAS FESTIVOS",
+        "Gestión de Checador "
+    );
+    $user->access();
+    $fs_dias_festivos = query("SELECT * FROM fs_diasfestivos(:facultad, null, null, null) ORDER BY diasfestivos_dia", [':facultad' => $fac], false);
+    $fs_periodos = query("SELECT * FROM fs_periodos(null, null) WHERE estado = 'Activo'", null, false);
+    $fs_dias_festivos_generales = query("SELECT * FROM fs_diasfestivos(null, null) ORDER BY diasfestivos_dia", null, false);
+    ?>
+    <main class="content marco">
+        <?php if($user->admin){ ?>
+        <div class="col-12 text-right">
+            <button type="button" class="btn btn-outline-secondary" data-toggle="modal" data-target="#modal" data-tipo="1"><span class="ing-mas ing-fw"></span> Agregar Día Festivo</button>
+        </div>
+        <?php } ?>
+        <div id="message"></div>
+        <!-- Tabla -->
+        <?php if($fs_dias_festivos || $fs_dias_festivos_generales){ ?>
+            <div class="row mt-3">
+                <div class="col-12 table-responsive">
+                    <table class="table table-sm table-striped table-white">
+                        <thead class="thead-dark">
+                            <tr>
+                                <th>Día</th>
+                                <th>Periodo</th>
+                                <th>Nivel</th>
+                                <?php if($user->admin){ ?>
+                                <th>Facultad</th>
+                                <th>Acciones</th>
+                                <?php } ?>
+                            </tr>
+                        </thead>
+                        <tbody>
+                            <?php foreach($fs_dias_festivos as $dia){ ?>
+                            <tr data-id="<?= $dia['diasfestivos_id'] ?>" id="<?= $dia['diasfestivos_id'] ?>" data-periodo="1">
+                                <td class="text-center"><?php $day =  explode("-", $dia['diasfestivos_dia']);
+                                                            echo $day['2']."-".$day['1']."-".$day['0'];
+                                                        ?></td>
+                                <td class="text-center"><?= $dia['periodo_nombre'] ?></td>
+                                <td class="text-center"><?= $dia['nivel_nombre'] ?></td>
+                                <?php if($user->admin){ ?>
+                                <td class="text-center"><?= $dia['facultad_nombre'] ?></td>
+                                <td class="text-center icono-acciones">
+                                    <a href="#" data-toggle="modal" data-target="#modal" data-tipo="2" title="Editar"><span class="ing-editar ing-fw"></span></a>
+                                    <a href="#" data-toggle="modal" data-target="#modal_confirm" title="Borrar"><span class="ing-basura ing-fw"></span></a>
+                                </td>
+                                <?php } ?>
+                            </tr>
+                            <?php } ?>
+                            <?php foreach($fs_dias_festivos_generales as $dia){ ?>
+                            <tr data-id="<?= $dia['diasfestivos_id'] ?>" id="<?= $dia['diasfestivos_id'] ?>" data-periodo="0">
+                                <td class="text-center"><?php $day =  explode("-", $dia['diasfestivos_dia']);
+                                                            echo $day['2']."-".$day['1']."-".$day['0'];
+                                                        ?></td>
+                                <td class="text-center">Todos</td>
+                                <td class="text-center">Todos</td>    
+                                <?php if($user->admin){ ?>
+                                <td class="text-center">Todas</td>
+                                <td class="text-center icono-acciones">
+                                    <a href="#" data-toggle="modal" data-target="#modal" data-tipo="2" title="Editar"><span class="ing-editar ing-fw"></span></a>
+                                    <a href="#" data-toggle="modal" data-target="#modal_confirm" title="Borrar"><span class="ing-basura ing-fw"></span></a>
+                                </td>
+                                <?php } ?>
+                            </tr>    
+                            <?php } ?>
+                        </tbody>
+                    </table>
+                </div>
+            </div>
+        <?php } ?>
+    </main>
+    <!-- Footer -->
+    <?php
+    include "import/html_footer.php";
+    ?>
+    <!-- Modal -->
+    <div class="modal fade" id="modal" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true">
+        <div class="modal-dialog modal-dialog-centered" role="document">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <h4 class="col-12 modal-title text-center">
+                        <span id="modalLabel">
+                            Editar Día Festivo
+                        </span>
+                        <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
+                            <span aria-hidden="true">&times;</span>
+                        </button>
+                    </h4>
+                </div>
+                <div class="modal-body">
+                    <form action="" method="post" id="formaModal" onsubmit="return valida_campos()">
+                        <input type="hidden" name="id" id="id">
+                        <div class="form-box">
+                            <div class="form-group row">
+                                <label for="periodo" class="col-3 col-form-label">Periodo *</label>
+                                <div class="col-8">
+                                    <div class="datalist datalist-select mb-1 w-100">
+                                        <div class="datalist-input" id="fac">Mostrar todos</div>
+                                        <span class="ing-buscar icono"></span>
+                                        <ul style="display:none">
+                                            <li data-id="0" class="pl4-">Todos</li>
+                                            <?php foreach($fs_periodos as $periodo){ ?>
+                                                <li data-id="<?= $periodo['id'] ?>" class="pl4-"> <?php echo $periodo['periodo']." ".$periodo['facultad']." - ".$periodo['nivel']; ?></li>
+                                            <?php } ?>
+                                            </ul>
+                                        <input type="hidden" id="periodo" name="periodo" value="">
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="form-group row" id="rangoDiv">
+                                <label for="rango" class="col-3 col-form-label">Rango</label>
+                                <div class="col-8">
+                                    <input type="checkbox" data-toggle="toggle" data-onstyle="success" data-offstyle="danger" data-on="SI" data-off="NO" data-size="s" id="rango" name="rango">
+                                </div>
+                            </div>
+                            <div class="form-group row" id="diasFestivos">
+                                <label for="diaFestivo" class="col-3 col-form-label">Día festivo *</label>
+                                <div class="col-4" id="dia">
+                                    <input id="diaFestivo" name="diaFestivo" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly="">
+                                </div>
+                                <div class="col-1 diaFestivoRango">
+                                    -
+                                </div>
+                                <div class="col-4 diaFestivoRango" id="diaFestivoRango">
+                                    <input id="diaFestivoFin" name="diaFestivoFin" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly="">
+                                </div>
+                                <div class="invalid-feedback">Debe seleccionar una fecha</div>
+                            </div>
+                            <div class="form-group row">
+                                <div class="offset-4 col-8">
+                                    <button type="submit" class="btn btn-outline-primary" id="submitBtn" data-tipo="1">
+                                        <span class="ing-aceptar ing-fw"></span> Guardar
+                                    </button>
+                                    <button type="reset" class="btn btn-outline-danger" data-dismiss="modal">
+                                        <span class="ing-cancelar ing-fw"></span> Cancelar
+                                    </button>
+                                </div>
+                            </div>
+                        </div>
+                    </form>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <div class="modal fade" id="modal_confirm" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true">
+        <div class="modal-dialog modal-dialog-centered" role="document">
+            <div class="modal-content">
+                <div class="modal-body">
+                    <div class="row">
+                        <div class="col">
+                            <p class="font-weight-bold">¿Estás seguro de querer borrar el día festivo?</p>
+                        </div>
+                    </div>
+                </div>
+                <div class="modal-footer">
+                    <input type="hidden" id="id_borrar" value="">
+                    <button type="button" class="btn btn-outline-primary btn-borrar"><span class="ing-aceptar ing-fw"></span> Borrar</button>
+                    <button type="button" class="btn btn-outline-danger" data-dismiss="modal" aria-label="Close"><span class="ing-cancelar ing-fw"></span> Cancelar</button>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <script src="js/jquery.min.js"></script>
+    <script src="js/jquery-ui.js"></script>
+    <script src="js/bootstrap/bootstrap.min.js"></script>
+    <script src="js/datalist.js"></script>
+    <script src="js/datepicker-es.js"></script>
+    <script src="js/toggle.js"></script>
+    <?php
+        require_once 'js/messages.php';
+    ?>
+    <script>
+        $(document).ready(function(){
+            $('.diaFestivoRango').hide();
+        });
+        $('#rango').change(function(){
+            if($(this).is(':checked')){
+                $('#diaFestivoFin').val('');
+                $('.diaFestivoRango').show();
+                $('#diaFestivoFin').datepicker("setDate", today);
+            }
+            else{
+                $('.diaFestivoRango').hide();
+            }
+        });
+
+        $('#modal_confirm').on('show.bs.modal', function(event){
+            var button = $(event.relatedTarget);
+            var id = button.parents("tr").data("id");
+            $("#id_borrar").val(id);
+        });
+
+        $(".btn-borrar").click(function(){
+            var id = $("#id_borrar").val();
+            $.ajax({
+                url: 'action/action_diasfestivos_borra.php',
+                type: 'post',
+                dataType: 'json',
+                data:{id: id},
+                success:function(result){
+                    location.reload();
+                },
+                error: function(){console.log("Error")}
+            });
+        });
+
+        var today = new Date();
+        $(".date-picker").datepicker($.datepicker.regional["es"]);
+        $(".date-picker").datepicker({
+            dateFormat: "dd/mm/yyyy",
+            changeMonth: true,
+        });
+
+    <?php if(!$fs_dias_festivos && !$fs_dias_festivos_generales){ ?>
+        triggerMessage("No se encontraron días festivos", "Error");
+    <?php } ?>
+
+        $('#modal').on('show.bs.modal', function (event){
+            var button = $(event.relatedTarget);
+            var tipo = button.data('tipo');
+            var modal = $(this);
+            if(tipo==1){//agregar
+                $('#modalLabel').html("Agregar Día Festivo");
+                $('#submitBtn').data('tipo', 1);
+                $('#diaFestivo').datepicker("setDate", today);
+                $('#diaFestivoFin').datepicker("setDate", today);
+                setDatalistFirst("#periodo");
+                $('#rangoDiv').show();
+                $('#dia').removeClass('col-9');
+                $('#dia').addClass('col-4');
+            }
+            else{
+                $('#modalLabel').html("Editar Día Festivo");
+                $('#submitBtn').data('tipo', 2);
+                $('#rangoDiv').hide();
+                $('#dia').removeClass('col-4');
+                $('#dia').addClass('col-9');
+                var id = $(event.relatedTarget).parents('tr').data('id');
+                var periodo = $(event.relatedTarget).parents('tr').data('periodo');
+                $.ajax({
+                    url:"action/action_diasfestivos_select.php",
+                    type:"post",
+                    dataType:"json",
+                    data:{id: id, periodo: periodo},
+                    success:function(result){
+                        console.log(result);
+                        $('#id').val(result['diasfestivos_id']);
+                        if(!result['periodo_id']){
+                            setDatalist('#periodo', 0);
+                        }else{
+                            setDatalist('#periodo', result['periodo_id']);
+                        }
+                        var date = new Date(result['diasfestivos_dia']);
+                        date.setDate(date.getDate() + 1);
+                        $('#diaFestivo').datepicker("setDate", date);
+                    },
+                    error: function(){console.log("Error")}
+                });
+            }
+        });
+
+        function valida_campos(){
+            var error=false;
+            if($("#diaFestivo").val()==""){
+                $("#diaFestivo").addClass("is-invalid");
+                error=true;
+            }
+            var inicio = $("#diaFestivo").val();
+            var fin = $("#diaFestivoFin").val();
+            var aux = inicio.split("/");
+            inicio = aux[2] +"-"+ aux[1] +"-"+ aux[0];
+            aux = fin.split("/");
+            fin = aux[2] +"-"+ aux[1] +"-"+ aux[0];
+            console.log(inicio);
+            if((fin < inicio || fin == inicio)  && $("#rango").is(':checked')){
+                $('#diaFestivoFin').addClass("is-invalid");
+                error=true;
+            }
+            if(error){
+                return false;
+            }else{
+                var btn = $("#submitBtn");
+                if(btn.data("tipo") == 2){//update
+                    $("#formaModal").prop("action", "./action/action_diasfestivos_update.php");
+                }
+                else{//insert
+                    $("#formaModal").prop("action", "./action/action_diasfestivos_insert.php");
+                }
+            }
+        }
+        
+        <?php if(isset($_GET['error'])){ 
+            if($_GET['error'] == 1){ ?>
+                triggerMessage("Este dia festivo ya existe", "Error");
+        <?php }
+        } ?>
+    </script>
+</body>
 </html>

+ 110 - 110
editar_horario.php

@@ -1,111 +1,111 @@
-<?php
-require_once 'class/c_login.php';
-
-if (!isset($_SESSION['user'])) {
-    header('Location: index.php');
-    exit;
-} else
-    $user = unserialize($_SESSION['user']);
-
-if (!$user->admin)
-    header('Location: main.php?error=1');
-?>
-<!DOCTYPE html>
-<html lang="en">
-
-<head>
-    <meta charset="UTF-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>Editar Horarios | <?php echo $_SESSION['facultad'] ?? "Administrador"; ?></title>
-    <link rel="icon" type="image/png" href="imagenes/favicon.png" />
-    <link rel="stylesheet" href="css/bootstrap-ulsa.min.css" type="text/css">
-    <link rel="stylesheet" href="css/indivisa.css" type="text/css">
-    <link rel="stylesheet" href="css/sgi.css?rand=<?php echo rand(); ?>" type="text/css">
-</head>
-
-<body>
-    <?php
-    include "import/html_header.php";
-    html_header("Editar Horarios", "Gestión de Checador");
-    ?>
-
-    <!-- Create a schedule design -->
-    <main class="content marco">
-        <div class="container-fluid">
-            <div class="row">
-                <div class="col-sm-12">
-                    <!-- Nivel select option -->
-                    <div class="form-group">
-                        <label for="nivel">Nivel</label>
-                        <select class="form-control" id="nivel">
-                            <option value="0">Selecciona un nivel</option>
-                            <option value="1">Nivel 1</option>
-                            <option value="2">Nivel 2</option>
-                            <option value="3">Nivel 3</option>
-                            <option value="4">Nivel 4</option>
-                            <option value="5">Nivel 5</option>
-                            <option value="6">Nivel 6</option>
-                            <option value="7">Nivel 7</option>
-                            <option value="8">Nivel 8</option>
-                            <option value="9">Nivel 9</option>
-                            <option value="10">Nivel 10</option>
-                        </select>
-
-                    </div>
-
-                </div>
-            </div>
-
-            <!-- Table Schedule -->
-            <div class="row">
-                <div class="col-sm-12">
-                    <table class="table table-bordered table-hover">
-                        <thead>
-                            <tr>
-                                <th scope="col">Hora</th>
-                                <th scope="col">Lunes</th>
-                                <th scope="col">Martes</th>
-                                <th scope="col">Miércoles</th>
-                                <th scope="col">Jueves</th>
-                                <th scope="col">Viernes</th>
-                                <th scope="col">Sábado</th>
-                                <th scope="col">Domingo</th>
-                            </tr>
-                        </thead>
-                        <tbody>
-                            <tr>
-                                <th scope="row">7:00 - 8:00</th>
-                                <!-- Matemáticas Martes id horario: 3 edit -->
-                                <td>
-                                </td>
-                        </tbody>
-                    </table>
-                </div>
-            </div>
-        </div>
-    </main>
-    <?php
-    include "import/html_footer.php";
-    ?>
-</body>
-
-</html>
-<?php
-
-function get_horarios($facultad_id): array
-{
-    $dias = array("lun", "mar", "mié", "jue", "vie", "sáb",);
-    foreach ($dias as $dia) {
-        $horarios = query(
-            "SELECT * FROM HORARIO_VIEW
-            WHERE FACULTAD_ID = :facultad_id AND DIA = :dia
-            ORDER BY HORA",
-            array(":facultad_id" => $facultad_id, ":dia" => $dia)
-        );
-        foreach ($horarios as $h)
-            $horario[$dia][] = $h;
-    }
-    return $horario;
-}
+<?php
+require_once 'class/c_login.php';
+
+if (!isset($_SESSION['user'])) {
+    header('Location: index.php');
+    exit;
+} else
+    $user = unserialize($_SESSION['user']);
+
+if (!$user->admin)
+    header('Location: main.php?error=1');
+?>
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="UTF-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Editar Horarios | <?php echo $_SESSION['facultad'] ?? "Administrador"; ?></title>
+    <link rel="icon" type="image/png" href="imagenes/favicon.png" />
+    <link rel="stylesheet" href="css/bootstrap-ulsa.min.css" type="text/css">
+    <link rel="stylesheet" href="css/indivisa.css" type="text/css">
+    <link rel="stylesheet" href="css/sgi.css?rand=<?php echo rand(); ?>" type="text/css">
+</head>
+
+<body>
+    <?php
+    include "import/html_header.php";
+    html_header("Editar Horarios", "Gestión de Checador");
+    ?>
+
+    <!-- Create a schedule design -->
+    <main class="content marco">
+        <div class="container-fluid">
+            <div class="row">
+                <div class="col-sm-12">
+                    <!-- Nivel select option -->
+                    <div class="form-group">
+                        <label for="nivel">Nivel</label>
+                        <select class="form-control" id="nivel">
+                            <option value="0">Selecciona un nivel</option>
+                            <option value="1">Nivel 1</option>
+                            <option value="2">Nivel 2</option>
+                            <option value="3">Nivel 3</option>
+                            <option value="4">Nivel 4</option>
+                            <option value="5">Nivel 5</option>
+                            <option value="6">Nivel 6</option>
+                            <option value="7">Nivel 7</option>
+                            <option value="8">Nivel 8</option>
+                            <option value="9">Nivel 9</option>
+                            <option value="10">Nivel 10</option>
+                        </select>
+
+                    </div>
+
+                </div>
+            </div>
+
+            <!-- Table Schedule -->
+            <div class="row">
+                <div class="col-sm-12">
+                    <table class="table table-bordered table-hover">
+                        <thead>
+                            <tr>
+                                <th scope="col">Hora</th>
+                                <th scope="col">Lunes</th>
+                                <th scope="col">Martes</th>
+                                <th scope="col">Miércoles</th>
+                                <th scope="col">Jueves</th>
+                                <th scope="col">Viernes</th>
+                                <th scope="col">Sábado</th>
+                                <th scope="col">Domingo</th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                            <tr>
+                                <th scope="row">7:00 - 8:00</th>
+                                <!-- Matemáticas Martes id horario: 3 edit -->
+                                <td>
+                                </td>
+                        </tbody>
+                    </table>
+                </div>
+            </div>
+        </div>
+    </main>
+    <?php
+    include "import/html_footer.php";
+    ?>
+</body>
+
+</html>
+<?php
+
+function get_horarios($facultad_id): array
+{
+    $dias = array("lun", "mar", "mié", "jue", "vie", "sáb",);
+    foreach ($dias as $dia) {
+        $horarios = query(
+            "SELECT * FROM HORARIO_VIEW
+            WHERE FACULTAD_ID = :facultad_id AND DIA = :dia
+            ORDER BY HORA",
+            array(":facultad_id" => $facultad_id, ":dia" => $dia)
+        );
+        foreach ($horarios as $h)
+            $horario[$dia][] = $h;
+    }
+    return $horario;
+}
 ?>

+ 208 - 208
excel_horario.php

@@ -1,209 +1,209 @@
-<?php
-require_once 'class/c_login.php';
-if (!isset($_SESSION['user'])) {
-    header('Location: index.php');
-    exit;
-} else
-    $user = unserialize($_SESSION['user']);
-
-
-$user->access('excel_horario');
-
-if (!$user->admin && in_array($user->acceso, ['r', 'n'])) {
-    // die($access);
-    header('Location: main.php?error=1');
-} else {
-    $user->print_to_log('Consultar asistencia');
-}
-?>
-<!DOCTYPE html>
-<html lang="en">
-
-<head>
-    <title>Cargar horario desde Excel | <?= $user->facultad['facultad'] ?? 'General' ?></title>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
-    <?php include_once "import/html_css_files.php"; ?>
-</head>
-
-<body style="display: block;">
-    <?php
-    include('include/constantes.php');
-    include("import/html_header.php");
-    html_header("Cargar horario desde Excel", "Gestión de Checador");
-    ?>
-    <main class="container content content-margin" id="local-app">
-        <section id="message"></section>
-        <?php require('import/periodo.php') ?>
-        <form>
-            <div class="form-group">
-                <div class="form-box">
-                    <?php
-                    $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);
-                    #die(print_r($carreras, true));
-                    ?>
-                    <div class="form-group row">
-                        <label for="filter_carrera" class="col-4 col-form-label">Carrera</label>
-                        <div class="col-6 ">
-                            <div id="dlcarrera" class="datalist datalist-select mb-1 w-100">
-                                <div class="datalist-input">Seleccionar carrera</div>
-                                <span class="ing-buscar icono"></span>
-                                <ul style="display:none">
-                                    <?php
-                                    foreach ($carreras as $carrera) {
-                                    ?>
-                                        <li data-id="<?= $carrera['id'] ?>">
-                                            <?= $carrera['carrera'] ?>
-                                        </li>
-                                    <?php
-                                    }
-                                    ?>
-                                </ul>
-                                <input type="hidden" id="filter_carrera" name="carrera" value="">
-                            </div>
-                        </div>
-                    </div>
-
-                    <div class="form-group row">
-                        <label for="excel" class="col-4 col-form-label">Archivo de horarios</label>
-                        <div class="col-8 col-sm-6">
-                            <input class="form-control-file" id="excel" name="archivo" accept=".xlsx, .xls" require>
-                        </div>
-                    </div>
-
-                    <div class="form-group mt-5 row justify-content-center">
-
-                        <button id="btn-cargar" type="button" class="btn btn-primary" onclick="submit_files()">
-                            <span class="ing-guardar"></span>
-                            Cargar horario
-                        </button>
-                    </div>
-                </div>
-            </div>
-
-        </form>
-    </main>
-</body>
-<?php
-require_once("import/html_footer.php");
-require_once("js/messages.php")
-?>
-<script src="js/scrollables.js"></script>
-<script src="js/jquery.min.js"></script>
-<script src="js/bootstrap/bootstrap.min.js"></script>
-
-<script src="js/custominputfile.min-es.js"></script>
-<link rel="stylesheet" href="css/custominputfile.min.css">
-<script src="js/fetchlib.js"></script>
-<script lang="jquery">
-    var datum = []
-
-    $(document).ready(function() {
-
-        $('#excel').customFile({
-            allowed: ['xlsx', 'xls'],
-            maxFiles: 1,
-            callbacks: {
-                onSuccess: async function(item) {
-                    var formData = $.customFile.serialize('archivo');
-
-                    const {
-                        status,
-                        message,
-                        data
-                    } = await fetch('action/action_revisar_excel.php', {
-                            method: 'POST',
-                            body: formData
-                        })
-                        .then(response => response.json())
-                        .catch(error => {
-                            return {
-                                status: 'error',
-                                message: 'Error al cargar el archivo',
-                            }
-                        });
-
-                    if (status == 'error') {
-                        triggerMessage(message, 'Error en el formato del archivo');
-                        item.destroy();
-                        return
-                    }
-
-                    triggerMessage(message, `Archivo revisado`, 'success');
-                    datum = data;
-                },
-            }
-        });
-    })
-
-    async function submit_files() {
-        // disable button
-        const button = document.querySelector('#btn-cargar');
-        // add class disabled to button
-        button.classList.add('disabled');
-        // disable button
-        button.disabled = true;
-
-        // add loading icon
-        button.innerHTML = '<span class="ing-cargando"></span> Cargando...';
-
-        let missing = [];
-
-        let carrera = $('#filter_carrera').val();
-        if (carrera == '') missing.push('Carrera');
-
-        if (datum.length == 0) missing.push('Archivo de horarios');
-
-        let facultad = <?= $user->facultad['facultad_id'] ?>;
-
-        if (missing.length > 0) {
-            messageMissingInputs(missing);
-
-            // remove class disabled to button
-            button.classList.remove('disabled');
-            // enable button
-            button.disabled = false;
-
-            // remove loading icon
-            button.innerHTML = '<span class="ing-guardar"></span> Cargar horario';
-
-            return;
-        }
-
-        formData.append('carrera', carrera);
-        formData.append('facultad', facultad);
-        formData.append('data', JSON.stringify(datum));
-
-
-        const {
-            status,
-            message
-        } = await fetch('action/action_horario_excel.php', {
-                method: 'POST',
-                body: formData
-            })
-            .then(response => response.json())
-            .catch(error => {
-                return {
-                    status: 'error',
-                    message: 'Error al cargar el archivo',
-                }
-            });
-
-        if (status == 'error') {
-            triggerMessage(message, 'Error al guardar el archivo');
-            return
-        }
-
-        triggerMessage(message, `Horarios guardados`, 'success');
-
-        // await 1 second
-        await new Promise(resolve => setTimeout(resolve, 1000));
-
-        // reload page
-        location.reload();
-    }
-</script>
-
-
+<?php
+require_once 'class/c_login.php';
+if (!isset($_SESSION['user'])) {
+    header('Location: index.php');
+    exit;
+} else
+    $user = unserialize($_SESSION['user']);
+
+
+$user->access('excel_horario');
+
+if (!$user->admin && in_array($user->acceso, ['r', 'n'])) {
+    // die($access);
+    header('Location: main.php?error=1');
+} else {
+    $user->print_to_log('Consultar asistencia');
+}
+?>
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <title>Cargar horario desde Excel | <?= $user->facultad['facultad'] ?? 'General' ?></title>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+    <?php include_once "import/html_css_files.php"; ?>
+</head>
+
+<body style="display: block;">
+    <?php
+    include('include/constantes.php');
+    include("import/html_header.php");
+    html_header("Cargar horario desde Excel", "Gestión de Checador");
+    ?>
+    <main class="container content content-margin" id="local-app">
+        <section id="message"></section>
+        <?php require('import/periodo.php') ?>
+        <form>
+            <div class="form-group">
+                <div class="form-box">
+                    <?php
+                    $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);
+                    #die(print_r($carreras, true));
+                    ?>
+                    <div class="form-group row">
+                        <label for="filter_carrera" class="col-4 col-form-label">Carrera</label>
+                        <div class="col-6 ">
+                            <div id="dlcarrera" class="datalist datalist-select mb-1 w-100">
+                                <div class="datalist-input">Seleccionar carrera</div>
+                                <span class="ing-buscar icono"></span>
+                                <ul style="display:none">
+                                    <?php
+                                    foreach ($carreras as $carrera) {
+                                    ?>
+                                        <li data-id="<?= $carrera['id'] ?>">
+                                            <?= $carrera['carrera'] ?>
+                                        </li>
+                                    <?php
+                                    }
+                                    ?>
+                                </ul>
+                                <input type="hidden" id="filter_carrera" name="carrera" value="">
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="form-group row">
+                        <label for="excel" class="col-4 col-form-label">Archivo de horarios</label>
+                        <div class="col-8 col-sm-6">
+                            <input class="form-control-file" id="excel" name="archivo" accept=".xlsx, .xls" require>
+                        </div>
+                    </div>
+
+                    <div class="form-group mt-5 row justify-content-center">
+
+                        <button id="btn-cargar" type="button" class="btn btn-primary" onclick="submit_files()">
+                            <span class="ing-guardar"></span>
+                            Cargar horario
+                        </button>
+                    </div>
+                </div>
+            </div>
+
+        </form>
+    </main>
+</body>
+<?php
+require_once("import/html_footer.php");
+require_once("js/messages.php")
+?>
+<script src="js/scrollables.js"></script>
+<script src="js/jquery.min.js"></script>
+<script src="js/bootstrap/bootstrap.min.js"></script>
+
+<script src="js/custominputfile.min-es.js"></script>
+<link rel="stylesheet" href="css/custominputfile.min.css">
+<script src="js/fetchlib.js"></script>
+<script lang="jquery">
+    var datum = []
+
+    $(document).ready(function() {
+
+        $('#excel').customFile({
+            allowed: ['xlsx', 'xls'],
+            maxFiles: 1,
+            callbacks: {
+                onSuccess: async function(item) {
+                    var formData = $.customFile.serialize('archivo');
+
+                    const {
+                        status,
+                        message,
+                        data
+                    } = await fetch('action/action_revisar_excel.php', {
+                            method: 'POST',
+                            body: formData
+                        })
+                        .then(response => response.json())
+                        .catch(error => {
+                            return {
+                                status: 'error',
+                                message: 'Error al cargar el archivo',
+                            }
+                        });
+
+                    if (status == 'error') {
+                        triggerMessage(message, 'Error en el formato del archivo');
+                        item.destroy();
+                        return
+                    }
+
+                    triggerMessage(message, `Archivo revisado`, 'success');
+                    datum = data;
+                },
+            }
+        });
+    })
+
+    async function submit_files() {
+        // disable button
+        const button = document.querySelector('#btn-cargar');
+        // add class disabled to button
+        button.classList.add('disabled');
+        // disable button
+        button.disabled = true;
+
+        // add loading icon
+        button.innerHTML = '<span class="ing-cargando"></span> Cargando...';
+
+        let missing = [];
+
+        let carrera = $('#filter_carrera').val();
+        if (carrera == '') missing.push('Carrera');
+
+        if (datum.length == 0) missing.push('Archivo de horarios');
+
+        let facultad = <?= $user->facultad['facultad_id'] ?>;
+
+        if (missing.length > 0) {
+            messageMissingInputs(missing);
+
+            // remove class disabled to button
+            button.classList.remove('disabled');
+            // enable button
+            button.disabled = false;
+
+            // remove loading icon
+            button.innerHTML = '<span class="ing-guardar"></span> Cargar horario';
+
+            return;
+        }
+
+        formData.append('carrera', carrera);
+        formData.append('facultad', facultad);
+        formData.append('data', JSON.stringify(datum));
+
+
+        const {
+            status,
+            message
+        } = await fetch('action/action_horario_excel.php', {
+                method: 'POST',
+                body: formData
+            })
+            .then(response => response.json())
+            .catch(error => {
+                return {
+                    status: 'error',
+                    message: 'Error al cargar el archivo',
+                }
+            });
+
+        if (status == 'error') {
+            triggerMessage(message, 'Error al guardar el archivo');
+            return
+        }
+
+        triggerMessage(message, `Horarios guardados`, 'success');
+
+        // await 1 second
+        await new Promise(resolve => setTimeout(resolve, 1000));
+
+        // reload page
+        location.reload();
+    }
+</script>
+
+
 </html>

+ 282 - 282
facultades.php

@@ -1,283 +1,283 @@
-<?php
-require_once 'class/c_login.php';
-require_once 'include/bd_pdo.php';
-
-if (!isset($_SESSION['user'])){
-    header('Location: index.php');
-    exit;
-}
-else
-    $user = unserialize($_SESSION['user']);
-$user->access();
-if(!$user->admin && $user->acceso == 'n'){
-    header('Location: main.php?error=1');
-}else{
-    $user->print_to_log('Facultades');
-}
-if($user->admin!=true){
-    header('Location: carreras.php?facultad='.$user->facultad['facultad_id']);
-}
-?>
-<!DOCTYPE html>
-<html lang="en">
-
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>Facultades</title>
-    <?php
-    include 'import/html_css_files.php';
-    ?>
-</head>
-
-<body>
-    <?php
-    include "import/html_header.php";
-    html_header(
-        "FACULTADES",
-        "Gestión de Checador "
-    );
-    $user->access();
-    if(isset($_POST["estado"])){
-        echo "estado=".$_POST["estado"];
-    }
-
-    if(isset($_POST["desc"])){
-        $desc=$_POST["desc"];
-        $filter_desc = trim(filter_input(INPUT_POST, "desc", FILTER_SANITIZE_STRING, array('flags' => FILTER_FLAG_STRIP_LOW)));
-    }else{
-        $desc=null;
-    }
-    if($user->admin==true){
-    $fs_facultades = query(
-        "SELECT * FROM fs_facultades(:nombre)",
-        array(":nombre" => $desc),
-        single:false
-    );
-    }else{
-        $fs_facultades = query(
-            "SELECT * FROM fs_facultades(:nombre) where facultad_id = :facultad",
-            array(":nombre" => $desc, ":facultad" => $user->facultad["facultad_id"]),
-            single:false
-        );
-    }
-    ?>
-    <main class="content marco">
-        <?php if($user->admin==true)  {?>
-        <div class="row">
-            <div class="col-12 text-right">
-                <button type="button" class="btn btn-outline-secondary" data-toggle="modal" data-target="#modal" data-tipo="1"><span class="ing-mas ing-fw"></span>Crear facultad</button>
-            </div>
-        </div>
-        <?php }?>
-        <!-- Filtro -->
-        <div class="row">
-            <div class="col-12">
-                <form action="facultades.php" method="post">
-                    <div class="form-box">
-                        <div class="form-group row">
-                            <label for="filter_desc" class="col-4 col-form-label">Facultad</label>
-                            <div class="col-8 col-sm-4">
-                                <input id="filter_desc" name="desc" type="text" class="form-control"<?php if(isset($filter_desc)){ echo'value="'.$filter_desc.'"';}?>>
-                            </div>
-                        </div>
-                    </div>
-                    <div class="form-group row">
-                        <div class="col-12 text-center">
-                            <button type="submit" class="btn btn-outline-primary">
-                                <span class="ing-buscar ing-fw"></span>
-                                Filtrar
-                            </button>
-                            <button type="submit" class="btn btn-outline-danger btn-reset">
-                                <span class="ing-borrar ing-fw"></span>
-                                Limpiar
-                            </button>
-                        </div>
-                    </div>
-                </form>
-            </div>
-        </div>
-
-        <!-- Tabla -->
-        <div class="row">
-            <div class="col-12 table-responsive">
-                <table class="table table-sm table-striped table-white">
-                    <thead class="thead-dark">
-                        <tr>
-                            <th>Estado</th>
-                            <th>Facultad</th>
-                            <?php if($user->acceso == 'w')  {?>
-                            <th>Acciones</th>
-                            <?php }?>
-                        </tr>
-                    </thead>
-                    <tbody>
-                        <?php
-                        foreach($fs_facultades as $facultad){
-                        ?>
-                        <tr data-id="<?php echo $facultad["facultad_id"];?>" id="<?php echo $facultad["facultad_id"];?>">
-                            <?php
-                                $color = "danger";
-                                $title = "Inactiva";
-                                if($facultad["facultad_activa"]==1){
-                                $color ="success";
-                                $title="Activa";
-                                }
-                            ?>
-                            <td class="text-<?php echo $color;?> text-center" title="<?php echo $title;?>">
-                                <span class="ing-bullet"></span>
-                            </td>
-                            <td class="text-primary"><?php echo $facultad["facultad_nombre"];?></td>
-                            <?php if($user->acceso == 'w')  {?>
-                            <td class="text-center icono-acciones">
-                                <a href="#" data-toggle="modal" data-target="#modal" data-tipo="2" title="Editar"><span class="ing-editar ing-fw"></span></a>
-                                <a href="carreras.php?facultad=<?php echo $facultad["facultad_id"];?>" title="Agregar carreras o periodos"><span class="ing-mas inf-fw"></span></a>
-                            </td>
-                            <?php }?>
-                        </tr>
-                        <?php }?>
-                    </tbody>
-                </table>
-                <div id="message"></div>
-            </div>
-        </div>
-    </main>
-    <!-- Footer -->
-    <?php
-    include "import/html_footer.php";
-    ?>
-    <!-- Modal -->
-    <div class="modal fade" id="modal" tabindex="-1" role="dialog" arialabelledby="modal" aria-hidden="true">
-        <div class="modal-dialog modal-dialog-centered" role="document">
-            <div class="modal-content">
-                <div class="modal-header">
-                    <h4 class="col-12 modal-title text-center">
-                        <span id="modalLabel">
-                            Editar nombre de Facultad
-                        </span>
-                        <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
-                            <span aria-hidden="true">&times;</span>
-                        </button>
-                    </h4>
-                </div>
-                <div class="modal-body">
-                    <form action="" method="post" id="formaModal" onsubmit="return valida_campos()">
-                        <input type="hidden" name="id" id="id">
-                        <div class="form-box">
-                            <div class="form-group row">
-                                <label for="nombre" class="col-4 col-form-label">Nombre *</label>
-                                <div class="col-8">
-                                    <input id="nombre" name="nombre" type="text" class="form-control" maxlength="100">
-                                </div>
-                            </div>
-                            <div class="form-group row">
-                                <label for="estado" class="col-4 col-form-label">Estado *</label>
-                                <div class="col-4">
-                                    <div class="form-check form-check-inline">
-                                        <input class="form-check-input radio-lg" type="radio" id="estado_activo" name="estado" value="1" checked="checked">
-                                        <label for="estado_activo" class="col-form-label">Activo</label>
-                                    </div>
-                                </div>
-                                <div class="col-4">
-                                    <div class="form-check form-check-inline">
-                                        <input class="form-check-input radio-lg" type="radio" id="estado_inactivo" name="estado" value="0">
-                                        <label for="estado_inactivo" class="col-form-label">Inactivo</label>
-                                    </div>
-                                </div>
-                            </div>
-                            <div class ="form-group row mt-3">
-                                <div class="offset-4 col-8">
-                                    <button type="submit" class="btn btn-outline-primary" id="submitBtn" data-tipo="1">
-                                        <span class="ing-aceptar ing-fw"></span> Guardar
-                                    </button>
-                                    <button type="reset" class="btn btn-outline-danger" data-dismiss="modal">
-                                        <span class="ing-cancelar ing-fw"></span> Cancelar
-                                    </button>
-                                </div>
-                            </div>
-                        </div>
-                    </form>
-                </div>
-            </div>
-        </div>
-    </div>
-    <script src="js/jquery.min.js"></script>
-    <script src="js/bootstrap/bootstrap.min.js"></script>
-    <?php
-        require_once 'js/messages.php';
-    ?>
-    <script>
-        <?php if(!$fs_facultades){?>
-            triggerMessage("No se encontraron facultades con estos datos", "Error");
-        <?php }?>
-
-        function valida_campos(){
-            var error=false;
-            if($("#nombre").val()==""){
-                $("#nombre").addClass("is-invalid");
-                error=true;
-            }else{
-                $("#nombre").removeClass("is-invalid");
-            }
-            if($('#estado_activo').prop('checked') == false && $('#estado_inactivo').prop('checked') == false){
-                error=true;
-            }
-            if(error){
-                return false;
-            }else{
-                var btn = $('#submitBtn');
-                if(btn.data("tipo")==2)//update
-                    $('#formaModal').prop("action", "./action/action_facultades_update.php");
-                else//insert
-                    $('#formaModal').prop("action", "./action/action_facultades_insert.php");
-            }
-        }
-
-        $(document).on("click", ".btn-reset", function(event){
-            var forma = $(this).parents("form");
-            forma.find("input[type=text]").val("");
-            setDatalistFirst("#filter_desc");
-            forma.submit();
-        });
-
-        $('#modal').on('show.bs.modal', function(event){
-            var button = $(event.relatedTarget);
-            var tipo = button.data('tipo');
-            var modal = $(this);
-            if(tipo == 1){//crear
-                $("#submitBtn").data('tipo', 1);
-                $("#modalLabel").html("Crear Facultad");
-                $("#nombre").val("");
-                $('#estado_inactivo').prop('checked', false);
-                $('#estado_activo').prop('checked', true);
-            }else{//editar
-                $("#submitBtn").data('tipo', 2);
-                $("#modalLabel").html("Editar Facultad");
-                $("#nombre").val("");
-                $('#estado_inactivo').prop('checked', false);
-                $('#estado_activo').prop('checked', true);
-                var id = $(event.relatedTarget).parents("tr").data("id");
-                $.ajax({
-                    url:"action/action_facultades_select.php",
-                    type:"post",
-                    dataType:"json",
-                    data:{id_facultad: id},
-                    success:function(result){
-                        $("#id").val(result[0]["facultad_id"]);
-                        $("#nombre").val(result[0]["facultad_nombre"]);
-                        if(result[0]["facultad_activa"]==1){
-                            $('#estado_inactivo').prop('checked', false);
-                            $('#estado_activo').prop('checked', true);
-                        }else{
-                            $('#estado_inactivo').prop('checked', true);
-                            $('#estado_activo').prop('checked', false);
-                        }
-                    },
-                    error: function(){console.log("Error")}
-                });
-            }
-        });
-    </script>
-</body>
-
+<?php
+require_once 'class/c_login.php';
+require_once 'include/bd_pdo.php';
+
+if (!isset($_SESSION['user'])){
+    header('Location: index.php');
+    exit;
+}
+else
+    $user = unserialize($_SESSION['user']);
+$user->access();
+if(!$user->admin && $user->acceso == 'n'){
+    header('Location: main.php?error=1');
+}else{
+    $user->print_to_log('Facultades');
+}
+if($user->admin!=true){
+    header('Location: carreras.php?facultad='.$user->facultad['facultad_id']);
+}
+?>
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Facultades</title>
+    <?php
+    include 'import/html_css_files.php';
+    ?>
+</head>
+
+<body>
+    <?php
+    include "import/html_header.php";
+    html_header(
+        "FACULTADES",
+        "Gestión de Checador "
+    );
+    $user->access();
+    if(isset($_POST["estado"])){
+        echo "estado=".$_POST["estado"];
+    }
+
+    if(isset($_POST["desc"])){
+        $desc=$_POST["desc"];
+        $filter_desc = trim(filter_input(INPUT_POST, "desc", FILTER_SANITIZE_STRING, array('flags' => FILTER_FLAG_STRIP_LOW)));
+    }else{
+        $desc=null;
+    }
+    if($user->admin==true){
+    $fs_facultades = query(
+        "SELECT * FROM fs_facultades(:nombre)",
+        array(":nombre" => $desc),
+        single:false
+    );
+    }else{
+        $fs_facultades = query(
+            "SELECT * FROM fs_facultades(:nombre) where facultad_id = :facultad",
+            array(":nombre" => $desc, ":facultad" => $user->facultad["facultad_id"]),
+            single:false
+        );
+    }
+    ?>
+    <main class="content marco">
+        <?php if($user->admin==true)  {?>
+        <div class="row">
+            <div class="col-12 text-right">
+                <button type="button" class="btn btn-outline-secondary" data-toggle="modal" data-target="#modal" data-tipo="1"><span class="ing-mas ing-fw"></span>Crear facultad</button>
+            </div>
+        </div>
+        <?php }?>
+        <!-- Filtro -->
+        <div class="row">
+            <div class="col-12">
+                <form action="facultades.php" method="post">
+                    <div class="form-box">
+                        <div class="form-group row">
+                            <label for="filter_desc" class="col-4 col-form-label">Facultad</label>
+                            <div class="col-8 col-sm-4">
+                                <input id="filter_desc" name="desc" type="text" class="form-control"<?php if(isset($filter_desc)){ echo'value="'.$filter_desc.'"';}?>>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="form-group row">
+                        <div class="col-12 text-center">
+                            <button type="submit" class="btn btn-outline-primary">
+                                <span class="ing-buscar ing-fw"></span>
+                                Filtrar
+                            </button>
+                            <button type="submit" class="btn btn-outline-danger btn-reset">
+                                <span class="ing-borrar ing-fw"></span>
+                                Limpiar
+                            </button>
+                        </div>
+                    </div>
+                </form>
+            </div>
+        </div>
+
+        <!-- Tabla -->
+        <div class="row">
+            <div class="col-12 table-responsive">
+                <table class="table table-sm table-striped table-white">
+                    <thead class="thead-dark">
+                        <tr>
+                            <th>Estado</th>
+                            <th>Facultad</th>
+                            <?php if($user->acceso == 'w')  {?>
+                            <th>Acciones</th>
+                            <?php }?>
+                        </tr>
+                    </thead>
+                    <tbody>
+                        <?php
+                        foreach($fs_facultades as $facultad){
+                        ?>
+                        <tr data-id="<?php echo $facultad["facultad_id"];?>" id="<?php echo $facultad["facultad_id"];?>">
+                            <?php
+                                $color = "danger";
+                                $title = "Inactiva";
+                                if($facultad["facultad_activa"]==1){
+                                $color ="success";
+                                $title="Activa";
+                                }
+                            ?>
+                            <td class="text-<?php echo $color;?> text-center" title="<?php echo $title;?>">
+                                <span class="ing-bullet"></span>
+                            </td>
+                            <td class="text-primary"><?php echo $facultad["facultad_nombre"];?></td>
+                            <?php if($user->acceso == 'w')  {?>
+                            <td class="text-center icono-acciones">
+                                <a href="#" data-toggle="modal" data-target="#modal" data-tipo="2" title="Editar"><span class="ing-editar ing-fw"></span></a>
+                                <a href="carreras.php?facultad=<?php echo $facultad["facultad_id"];?>" title="Agregar carreras o periodos"><span class="ing-mas inf-fw"></span></a>
+                            </td>
+                            <?php }?>
+                        </tr>
+                        <?php }?>
+                    </tbody>
+                </table>
+                <div id="message"></div>
+            </div>
+        </div>
+    </main>
+    <!-- Footer -->
+    <?php
+    include "import/html_footer.php";
+    ?>
+    <!-- Modal -->
+    <div class="modal fade" id="modal" tabindex="-1" role="dialog" arialabelledby="modal" aria-hidden="true">
+        <div class="modal-dialog modal-dialog-centered" role="document">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <h4 class="col-12 modal-title text-center">
+                        <span id="modalLabel">
+                            Editar nombre de Facultad
+                        </span>
+                        <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
+                            <span aria-hidden="true">&times;</span>
+                        </button>
+                    </h4>
+                </div>
+                <div class="modal-body">
+                    <form action="" method="post" id="formaModal" onsubmit="return valida_campos()">
+                        <input type="hidden" name="id" id="id">
+                        <div class="form-box">
+                            <div class="form-group row">
+                                <label for="nombre" class="col-4 col-form-label">Nombre *</label>
+                                <div class="col-8">
+                                    <input id="nombre" name="nombre" type="text" class="form-control" maxlength="100">
+                                </div>
+                            </div>
+                            <div class="form-group row">
+                                <label for="estado" class="col-4 col-form-label">Estado *</label>
+                                <div class="col-4">
+                                    <div class="form-check form-check-inline">
+                                        <input class="form-check-input radio-lg" type="radio" id="estado_activo" name="estado" value="1" checked="checked">
+                                        <label for="estado_activo" class="col-form-label">Activo</label>
+                                    </div>
+                                </div>
+                                <div class="col-4">
+                                    <div class="form-check form-check-inline">
+                                        <input class="form-check-input radio-lg" type="radio" id="estado_inactivo" name="estado" value="0">
+                                        <label for="estado_inactivo" class="col-form-label">Inactivo</label>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class ="form-group row mt-3">
+                                <div class="offset-4 col-8">
+                                    <button type="submit" class="btn btn-outline-primary" id="submitBtn" data-tipo="1">
+                                        <span class="ing-aceptar ing-fw"></span> Guardar
+                                    </button>
+                                    <button type="reset" class="btn btn-outline-danger" data-dismiss="modal">
+                                        <span class="ing-cancelar ing-fw"></span> Cancelar
+                                    </button>
+                                </div>
+                            </div>
+                        </div>
+                    </form>
+                </div>
+            </div>
+        </div>
+    </div>
+    <script src="js/jquery.min.js"></script>
+    <script src="js/bootstrap/bootstrap.min.js"></script>
+    <?php
+        require_once 'js/messages.php';
+    ?>
+    <script>
+        <?php if(!$fs_facultades){?>
+            triggerMessage("No se encontraron facultades con estos datos", "Error");
+        <?php }?>
+
+        function valida_campos(){
+            var error=false;
+            if($("#nombre").val()==""){
+                $("#nombre").addClass("is-invalid");
+                error=true;
+            }else{
+                $("#nombre").removeClass("is-invalid");
+            }
+            if($('#estado_activo').prop('checked') == false && $('#estado_inactivo').prop('checked') == false){
+                error=true;
+            }
+            if(error){
+                return false;
+            }else{
+                var btn = $('#submitBtn');
+                if(btn.data("tipo")==2)//update
+                    $('#formaModal').prop("action", "./action/action_facultades_update.php");
+                else//insert
+                    $('#formaModal').prop("action", "./action/action_facultades_insert.php");
+            }
+        }
+
+        $(document).on("click", ".btn-reset", function(event){
+            var forma = $(this).parents("form");
+            forma.find("input[type=text]").val("");
+            setDatalistFirst("#filter_desc");
+            forma.submit();
+        });
+
+        $('#modal').on('show.bs.modal', function(event){
+            var button = $(event.relatedTarget);
+            var tipo = button.data('tipo');
+            var modal = $(this);
+            if(tipo == 1){//crear
+                $("#submitBtn").data('tipo', 1);
+                $("#modalLabel").html("Crear Facultad");
+                $("#nombre").val("");
+                $('#estado_inactivo').prop('checked', false);
+                $('#estado_activo').prop('checked', true);
+            }else{//editar
+                $("#submitBtn").data('tipo', 2);
+                $("#modalLabel").html("Editar Facultad");
+                $("#nombre").val("");
+                $('#estado_inactivo').prop('checked', false);
+                $('#estado_activo').prop('checked', true);
+                var id = $(event.relatedTarget).parents("tr").data("id");
+                $.ajax({
+                    url:"action/action_facultades_select.php",
+                    type:"post",
+                    dataType:"json",
+                    data:{id_facultad: id},
+                    success:function(result){
+                        $("#id").val(result[0]["facultad_id"]);
+                        $("#nombre").val(result[0]["facultad_nombre"]);
+                        if(result[0]["facultad_activa"]==1){
+                            $('#estado_inactivo').prop('checked', false);
+                            $('#estado_activo').prop('checked', true);
+                        }else{
+                            $('#estado_inactivo').prop('checked', true);
+                            $('#estado_activo').prop('checked', false);
+                        }
+                    },
+                    error: function(){console.log("Error")}
+                });
+            }
+        });
+    </script>
+</body>
+
 </html>

+ 134 - 134
horario_profesor.php

@@ -1,135 +1,135 @@
-<?php
-require_once 'class/c_login.php';
-if (!isset($_SESSION['user']))
-    die(header('Location: index.php'));
-
-$user = unserialize($_SESSION['user']);
-$user->access();
-if (!$user->admin && in_array($user->acceso, ['n']))
-    die(header('Location: main.php?error=1'));
-
-$user->print_to_log('Consultar horario');
-
-$write = $user->admin || in_array($user->acceso, ['w']);
-// var_dump($user);
-?>
-<!DOCTYPE html>
-<html lang="en">
-
-<head>
-    <title>Consultar horario | <?= $user->facultad['facultad'] ?? 'General' ?></title>
-    <meta charset="utf-8">
-    <meta http-equiv="content-type" content="text/plain; charset=UTF-8" />
-    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
-    <?php include_once "import/html_css_files.php"; ?>
-
-    <script src="js/scrollables.js" defer></script>
-    <script src="js/jquery.min.js" defer></script>
-    <script src="js/bootstrap/bootstrap.min.js" defer></script>
-
-    <script src="js/messages.js" defer></script>
-    <script>
-        const write = <?= $write ? 'true' : 'false' ?>;
-    </script>
-    <script src="js/moment.js" defer></script>
-    <script src="js/horario_profesor.js" defer></script>
-</head>
-<!--  -->
-
-<body style="display: block;">
-    <?php
-    include('include/constantes.php');
-    include("import/html_header.php");
-    html_header("Consultar horario", "Sistema de gestión de checador");
-    ?>
-    <?= "<!-- $user -->" ?>
-    <main class="container content marco content-margin" id="local-app">
-        <section id="message"></section>
-        <?php require('import/periodo.php') ?>
-
-        <form id="form" class="form-horizontal">
-            <div class="form-group">
-                <div class="form-box">
-                    <input type="hidden" name="periodo" value="<?= $user->periodo ?>" />
-                    <div class="form-group row">
-                        <label for="clave_profesor" class="col-4 col-form-label">Profesor</label>
-                        <div class="col-6">
-                            <input list="lista_profesores" name="clave_profesor" id="clave_profesor" class="form-control" placeholder="Profesor" required="required">
-                            <div class="valid-feedback">
-                                Profesor encontrado
-                            </div>
-                            <div class="invalid-feedback">
-                                Profesor no encontrado
-                            </div>
-                            <datalist id="lista_profesores">
-                                <?php
-                                $profesores = $db->where('facultad_id', $user->facultad['facultad_id'])->get("fs_profesor");
-                                foreach ($profesores as $profesor) {
-                                    extract($profesor);
-                                ?>
-                                    <option data-grado="<?= $grado ?>" data-clave="<?= $clave ?>" data-profesor="<?= $profesor ?>" data-id="<?= $id; ?>" value="<?= "$clave | $grado $profesor" ?>"></option>
-                                <?php
-                                }
-                                ?>
-                            </datalist>
-                            <ul class="list-group" id="profesores"></ul>
-                            <input type="hidden" id="periodo_id" name="periodo_id" value="<?= $user->periodo ?>">
-                            <input type="hidden" id="profesor_id" name="profesor_id" value="">
-                        </div>
-                    </div>
-
-                    <!-- ICO-BUSCAR FILTRAR & ICO-BORRAR LIMPIAR -->
-                    <div class="form-group row justify-content-center">
-                        <button class="btn btn-outline-primary mr-2">
-                            <span class="ing-buscar icono"></span>
-                            Buscar horario
-                        </button>
-                        <button type="button" class="btn btn-outline-danger" onclick="location.reload()">
-                            <span class="ing-borrar icono"></span>
-                            Limpiar
-                        </button>
-                    </div>
-                </div>
-            </div>
-        </form>
-        <div class="form-group mt-4 row justify-content-center">
-            <?php if ($write) { ?>
-                <button type="button" id="nuevo" class="btn btn-outline-primary ml-4 d-none" title="Nuevo horario" data-toggle="modal" data-target="#modal-editar">
-                    <span class="ing-mas ing-fw"></span> Nuevo
-                </button>
-            <?php } ?>
-        </div>
-        </div>
-        </div>
-
-        </form>
-        <!-- Horario is a (table with one a cell) within a table 
-            7:15 - 8:45, 8:45 - 10:15, 10:30 - 12:00, 12:00 - 13:30
-            de lunes a viernes, a excepción de que tenga sábado
-        -->
-        <div id="btn-excel-horario" class="mb-2 float-right hidden">
-            <button class="btn btn-outline-secondary " title="Exportar a Excel">
-                <span class="ing-descarga ing-fw"></span> Exportar a Excel
-            </button>
-        </div>
-        <!-- Table responsive -->
-        <div class="table-responsive">
-            <table class="table table-bordered table-sm table-responsive-md" id="table-horario">
-                <thead class="thead-dark">
-                    <tr id="headers">
-                        <th scope="col" class="text-center">Hora</th>
-                        <th scope="col" class="text-center">Lunes</th>
-                        <th scope="col" class="text-center">Martes</th>
-                        <th scope="col" class="text-center">Miércoles</th>
-                        <th scope="col" class="text-center">Jueves</th>
-                        <th scope="col" class="text-center">Viernes</th>
-                        <th scope="col" class="text-center">Sábado</th>
-                    </tr>
-                </thead>
-                <tbody id="horario"></tbody>
-            </table>
-        </div>
-    </main>
-</body>
-
+<?php
+require_once 'class/c_login.php';
+if (!isset($_SESSION['user']))
+    die(header('Location: index.php'));
+
+$user = unserialize($_SESSION['user']);
+$user->access();
+if (!$user->admin && in_array($user->acceso, ['n']))
+    die(header('Location: main.php?error=1'));
+
+$user->print_to_log('Consultar horario');
+
+$write = $user->admin || in_array($user->acceso, ['w']);
+// var_dump($user);
+?>
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <title>Consultar horario | <?= $user->facultad['facultad'] ?? 'General' ?></title>
+    <meta charset="utf-8">
+    <meta http-equiv="content-type" content="text/plain; charset=UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+    <?php include_once "import/html_css_files.php"; ?>
+
+    <script src="js/scrollables.js" defer></script>
+    <script src="js/jquery.min.js" defer></script>
+    <script src="js/bootstrap/bootstrap.min.js" defer></script>
+
+    <script src="js/messages.js" defer></script>
+    <script>
+        const write = <?= $write ? 'true' : 'false' ?>;
+    </script>
+    <script src="js/moment.js" defer></script>
+    <script src="js/horario_profesor.js" defer></script>
+</head>
+<!--  -->
+
+<body style="display: block;">
+    <?php
+    include('include/constantes.php');
+    include("import/html_header.php");
+    html_header("Consultar horario", "Sistema de gestión de checador");
+    ?>
+    <?= "<!-- $user -->" ?>
+    <main class="container content marco content-margin" id="local-app">
+        <section id="message"></section>
+        <?php require('import/periodo.php') ?>
+
+        <form id="form" class="form-horizontal">
+            <div class="form-group">
+                <div class="form-box">
+                    <input type="hidden" name="periodo" value="<?= $user->periodo ?>" />
+                    <div class="form-group row">
+                        <label for="clave_profesor" class="col-4 col-form-label">Profesor</label>
+                        <div class="col-6">
+                            <input list="lista_profesores" name="clave_profesor" id="clave_profesor" class="form-control" placeholder="Profesor" required="required">
+                            <div class="valid-feedback">
+                                Profesor encontrado
+                            </div>
+                            <div class="invalid-feedback">
+                                Profesor no encontrado
+                            </div>
+                            <datalist id="lista_profesores">
+                                <?php
+                                $profesores = $db->where('facultad_id', $user->facultad['facultad_id'])->get("fs_profesor");
+                                foreach ($profesores as $profesor) {
+                                    extract($profesor);
+                                ?>
+                                    <option data-grado="<?= $grado ?>" data-clave="<?= $clave ?>" data-profesor="<?= $profesor ?>" data-id="<?= $id; ?>" value="<?= "$clave | $grado $profesor" ?>"></option>
+                                <?php
+                                }
+                                ?>
+                            </datalist>
+                            <ul class="list-group" id="profesores"></ul>
+                            <input type="hidden" id="periodo_id" name="periodo_id" value="<?= $user->periodo ?>">
+                            <input type="hidden" id="profesor_id" name="profesor_id" value="">
+                        </div>
+                    </div>
+
+                    <!-- ICO-BUSCAR FILTRAR & ICO-BORRAR LIMPIAR -->
+                    <div class="form-group row justify-content-center">
+                        <button class="btn btn-outline-primary mr-2">
+                            <span class="ing-buscar icono"></span>
+                            Buscar horario
+                        </button>
+                        <button type="button" class="btn btn-outline-danger" onclick="location.reload()">
+                            <span class="ing-borrar icono"></span>
+                            Limpiar
+                        </button>
+                    </div>
+                </div>
+            </div>
+        </form>
+        <div class="form-group mt-4 row justify-content-center">
+            <?php if ($write) { ?>
+                <button type="button" id="nuevo" class="btn btn-outline-primary ml-4 d-none" title="Nuevo horario" data-toggle="modal" data-target="#modal-editar">
+                    <span class="ing-mas ing-fw"></span> Nuevo
+                </button>
+            <?php } ?>
+        </div>
+        </div>
+        </div>
+
+        </form>
+        <!-- Horario is a (table with one a cell) within a table 
+            7:15 - 8:45, 8:45 - 10:15, 10:30 - 12:00, 12:00 - 13:30
+            de lunes a viernes, a excepción de que tenga sábado
+        -->
+        <div id="btn-excel-horario" class="mb-2 float-right hidden">
+            <button class="btn btn-outline-secondary " title="Exportar a Excel">
+                <span class="ing-descarga ing-fw"></span> Exportar a Excel
+            </button>
+        </div>
+        <!-- Table responsive -->
+        <div class="table-responsive">
+            <table class="table table-bordered table-sm table-responsive-md" id="table-horario">
+                <thead class="thead-dark">
+                    <tr id="headers">
+                        <th scope="col" class="text-center">Hora</th>
+                        <th scope="col" class="text-center">Lunes</th>
+                        <th scope="col" class="text-center">Martes</th>
+                        <th scope="col" class="text-center">Miércoles</th>
+                        <th scope="col" class="text-center">Jueves</th>
+                        <th scope="col" class="text-center">Viernes</th>
+                        <th scope="col" class="text-center">Sábado</th>
+                    </tr>
+                </thead>
+                <tbody id="horario"></tbody>
+            </table>
+        </div>
+    </main>
+</body>
+
 </html>

+ 5 - 5
import/html_css_files.php

@@ -1,6 +1,6 @@
-<link rel="icon" type="image/png" href="imagenes/favicon.png" />
-<link rel="stylesheet" href="css/bootstrap-ulsa.min.css" type="text/css">
-<link rel="stylesheet" href="css/indivisa.css" type="text/css">
-<link rel="stylesheet" href="css/sgi.css?rand=<?php echo rand(); ?>" type="text/css">
-<link rel="stylesheet" href="css/style.css">
+<link rel="icon" type="image/png" href="imagenes/favicon.png" />
+<link rel="stylesheet" href="css/bootstrap-ulsa.min.css" type="text/css">
+<link rel="stylesheet" href="css/indivisa.css" type="text/css">
+<link rel="stylesheet" href="css/sgi.css?rand=<?php echo rand(); ?>" type="text/css">
+<link rel="stylesheet" href="css/style.css">
 <link rel="stylesheet" href="css/jquery-ui.css">

+ 104 - 104
import/html_footer.php

@@ -1,105 +1,105 @@
-<div class="container-fluid">
-    <footer class="footer" >
-        <div class="footerTop">
-        <div class="container">
-                <div class="logotipo">
-                    <img src="imagenes/lasalle-logo-blanco.png" alt="Universidad La Salle" width="15%">
-                    <h3> <span>Profesionales</span>con <strong>Valor</strong></h3>
-                </div>
-                <div class="ubicacion">
-                    <div class="address">
-                        <div class="tabs">
-                            <ul class="nav list-inline" id="tabsFooter" role="tablist">
-                                <li class="list-inline-item">
-                                    <a class="nav-link  active" id="unidad1-tab" data-toggle="tab" href="#unidad1" role="tab" aria-controls="calendario" aria-selected="true">Unidad Condesa</a>
-                                </li>
-                                <li class="list-inline-item">
-                                    <a class="nav-link " id="unidad2-tab" data-toggle="tab" href="#unidad2" role="tab" aria-controls="lista" aria-selected="false">Unidad Santa Teresa</a>
-                                </li>
-                                <li class="list-inline-item">
-                                    <a class="nav-link " id="unidad3-tab" data-toggle="tab" href="#unidad3" role="tab" aria-controls="lista" aria-selected="false">Unidad San Fernando</a>
-                                </li>
-                                <li class="list-inline-item">
-                                    <a class="nav-link" id="unidad4-tab" data-toggle="tab" href="#unidad4" role="tab" aria-controls="lista" aria-selected="false">Unidad Santa Lucía</a>
-                                </li>
-                            </ul>
-                            <div class="tab-content" id="tabsCont">
-                                <div class="tab-pane fade show active" id="unidad1" role="tabpanel" aria-labelledby="unidad1-tab">
-                                    <p>Benjamín Franklin No 45, Col. Condesa, Alc. Cuauhtémoc, CDMX, CP 06140 <span class="tel">Tel. <a href="tel:+525552789500">55 5278-9500</a> / <a href="tel:+8005272553">800 LASALLE</a></span><br>
-                                    <a class="btnMap " href="https://www.google.com/maps/place/Universidad+La+Salle/@19.4085702,-99.1810039,15z/data=!4m5!3m4!1s0x0:0x3108b5797f9c9ecd!8m2!3d19.4085702!4d-99.1810039" target="_blank"> <span class="fas fa-map-marker-alt mr-1"></span>¿Cómo llegar?</a></p>
-                                </div>
-                                <div class="tab-pane fade" id="unidad2" role="tabpanel" aria-labelledby="unidad2-tab">
-                                    <p>Camino a Santa Teresa 811, Col. Rinconada del Pedregal, Alc. Tlalpan, CDMX, CP 14010 <span class="tel">Tel. <a href="tel:5552789500">55 5278-9500</a> / <a href="tel:+8005272553">800 LASALLE</a></span><br>
-                                    <a class="btnMap " href="https://www.google.com/maps/place/Universidad+La+Salle+Unidad+Santa+Teresa/@19.299013,-99.196093,15z/data=!4m5!3m4!1s0x0:0xdfc2b61c9b67aac2!8m2!3d19.299013!4d-99.196093" target="_blank"> <span class="fas fa-map-marker-alt mr-1"></span>¿Cómo llegar?</a></p>
-                                </div>
-                                <div class="tab-pane fade" id="unidad3" role="tabpanel" aria-labelledby="unidad3-tab">
-                                    <p>Av. De Las Fuentes 17, Col. Tlalpan, Alc. Tlalpan, CDMX, CP 14000 <span class="tel">Tel. <a href="tel:+525552789500">55 5278-9500</a> / <a href="tel:+8005272553">800 LASALLE</a></span><br>
-                                    <a class="btnMap " href="https://www.google.com/maps/place/Universidad+La+Salle+Facultad+de+Medicina/@19.2930318,-99.1720808,15z/data=!4m5!3m4!1s0x0:0x29b7725e5a004277!8m2!3d19.2930318!4d-99.1720808" target="_blank"> <span class="fas fa-map-marker-alt mr-1"></span>¿Cómo llegar?</a></p>
-                                </div>
-                                <div class="tab-pane fade" id="unidad4" role="tabpanel" aria-labelledby="unidad4-tab">
-                                    <p>Av. Tamaulipas 3, Col. Zona Federal, Alc. Álvaro Obregón, CDMX, CP 01357 <span class="tel">Tel. <a href="tel:5556021130">55 5602-1130</a> </span><br>
-                                    <a class="btnMap " href="https://www.google.com/maps/place/Unidad+Deportiva+La+Salle/@19.3662852,-99.2421597,15z/data=!4m5!3m4!1s0x0:0x88e0334f044bc518!8m2!3d19.3662852!4d-99.2421597" target="_blank"> <span class="fas fa-map-marker-alt mr-1"></span>¿Cómo llegar?</a></p>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                    <div class="redes">
-                        <h4>Compartir :</h4>
-                        <ul>
-                            <li><a href="https://www.facebook.com/LaSalleMXIngenieria" target="_blank"><i class="fab fa-facebook-f fa-fw"></i></a></li>
-                            <!--<li><a href="https://twitter.com/lasalle_mx" target="_blank"><i class="fab fa-twitter fa-fw"></i></a></li>-->
-                            <li><a href="https://www.youtube.com/user/IngenieriaLaSalle/" target="_blank"><i class="fab fa-youtube fa-fw"></i></a></li>
-                            <!--<li><a href="https://www.instagram.com/lasalle_mx/" target="_blank"><i class="fab fa-instagram fa-fw"></i></a></li>-->
-                            <!--<li><a href="https://www.linkedin.com/school/universidad-la-salle?pathWildcard=24227" target="_blank"><i class="fab fa-linkedin-in fa-fw"></i></a></li>-->
-                        </ul>
-                    </div>
-                </div>
-            </div>
-        </div>
-        <div class="footerMiddle">
-            <div class="container">
-                <div class="row justify-content-md-center">
-                    <nav class="col-12 col-md-10">
-                        <a class="footerMore menuMore" href="#">Sistema y Red La Salle</a>
-                        <ul>
-                            <li><a href="http://bajio.delasalle.edu.mx/" target="_blank">Bajío</a></li>
-                            <li><a href="http://www.lasalle.mx/" target="_blank">Ciudad de México</a></li>
-                            <li><a href="http://lasallecancun.edu.mx/" target="_blank">Cancún</a></li>
-                            <li><a href="http://www.ulsapuebla.mx/" target="_blank">Puebla</a></li>
-                            <li><a href="http://www.ulsapuebla.mx/" target="_blank">Chihuahua</a></li>
-                            <li><a href="http://www.lasallecuernavaca.edu.mx/wp/" target="_blank">Cuernavaca</a></li>
-                            <li><a href="http://www.ulsalaguna.edu.mx/" target="_blank">Laguna</a></li>
-                            <li><a href="http://www.lasallemorelia.edu.mx/" target="_blank">Morelia</a></li>
-                            <li><a href="http://www.ulsaneza.edu.mx/" target="_blank">Nezahualcóyotl</a></li>
-                            <li><a href="http://www.ulsa-noroeste.edu.mx/n2015/" target="_blank">Noroeste</a></li>
-                            <li><a href="http://www.ulsaoaxaca.edu.mx/" target="_blank">Oaxaca</a></li>
-                            <li><a href="http://www.lasallep.edu.mx/" target="_blank">Pachuca</a></li>
-                            <li><a href="https://www.ulsasaltillo.edu.mx/" target="_blank">Saltillo</a></li>
-                            <li><a href="https://www.lasallevictoria.edu.mx/" target="_blank">Victoria</a></li>
-                        </ul>
-                    </nav>
-                </div>
-            </div>
-        </div>
-        <div class="footerBottom">
-            <div class="container">
-                <div class="logotipos">
-                    <ul>
-                        <li><a href="http://redlasalle.mx/" target="_blank"><img src="imagenes/la-salle-logo-red-universidades.png" alt="La Salle - logotipo" class="img-responsive" width="80"></a></li>
-                    <li><a href="http://ialu.org/english/" target="_blank"><img src="imagenes/la-salle-logo-international-ia.png" alt="La Salle - logotipo" class="img-responsive" width="80"></a></li>
-                    </ul>
-                </div>
-                <div class="legales">
-                    <a class="footerMore menuMore" href="#">Legales</a>
-                    <ul>
-                        <li><a href="https://lasalle.mx/globales/contacto.html" target="_blank">Contacto</a></li>
-                        <li><a href="https://lasalle.mx/globales/terminos-y-condiciones.html" target="_blank">Términos y condiciones</a></li>
-                        <li><a href="https://lasalle.mx/globales/aviso-de-privacidad.html" target="_blank">Aviso de Privacidad</a></li>
-                        <!--<li><a href="https://lasalle.mx/globales/mapa-de-sitio.html" target="_blank">Mapa de sitio</a></li>
-                        <li><a href="https://lasalle.mx/globales/preguntas-frecuentes/" target="_blank">Preguntas frecuentes</a></li>-->
-                    </ul>
-                </div>
-            </div>
-        </div>
-    </footer>
+<div class="container-fluid">
+    <footer class="footer" >
+        <div class="footerTop">
+        <div class="container">
+                <div class="logotipo">
+                    <img src="imagenes/lasalle-logo-blanco.png" alt="Universidad La Salle" width="15%">
+                    <h3> <span>Profesionales</span>con <strong>Valor</strong></h3>
+                </div>
+                <div class="ubicacion">
+                    <div class="address">
+                        <div class="tabs">
+                            <ul class="nav list-inline" id="tabsFooter" role="tablist">
+                                <li class="list-inline-item">
+                                    <a class="nav-link  active" id="unidad1-tab" data-toggle="tab" href="#unidad1" role="tab" aria-controls="calendario" aria-selected="true">Unidad Condesa</a>
+                                </li>
+                                <li class="list-inline-item">
+                                    <a class="nav-link " id="unidad2-tab" data-toggle="tab" href="#unidad2" role="tab" aria-controls="lista" aria-selected="false">Unidad Santa Teresa</a>
+                                </li>
+                                <li class="list-inline-item">
+                                    <a class="nav-link " id="unidad3-tab" data-toggle="tab" href="#unidad3" role="tab" aria-controls="lista" aria-selected="false">Unidad San Fernando</a>
+                                </li>
+                                <li class="list-inline-item">
+                                    <a class="nav-link" id="unidad4-tab" data-toggle="tab" href="#unidad4" role="tab" aria-controls="lista" aria-selected="false">Unidad Santa Lucía</a>
+                                </li>
+                            </ul>
+                            <div class="tab-content" id="tabsCont">
+                                <div class="tab-pane fade show active" id="unidad1" role="tabpanel" aria-labelledby="unidad1-tab">
+                                    <p>Benjamín Franklin No 45, Col. Condesa, Alc. Cuauhtémoc, CDMX, CP 06140 <span class="tel">Tel. <a href="tel:+525552789500">55 5278-9500</a> / <a href="tel:+8005272553">800 LASALLE</a></span><br>
+                                    <a class="btnMap " href="https://www.google.com/maps/place/Universidad+La+Salle/@19.4085702,-99.1810039,15z/data=!4m5!3m4!1s0x0:0x3108b5797f9c9ecd!8m2!3d19.4085702!4d-99.1810039" target="_blank"> <span class="fas fa-map-marker-alt mr-1"></span>¿Cómo llegar?</a></p>
+                                </div>
+                                <div class="tab-pane fade" id="unidad2" role="tabpanel" aria-labelledby="unidad2-tab">
+                                    <p>Camino a Santa Teresa 811, Col. Rinconada del Pedregal, Alc. Tlalpan, CDMX, CP 14010 <span class="tel">Tel. <a href="tel:5552789500">55 5278-9500</a> / <a href="tel:+8005272553">800 LASALLE</a></span><br>
+                                    <a class="btnMap " href="https://www.google.com/maps/place/Universidad+La+Salle+Unidad+Santa+Teresa/@19.299013,-99.196093,15z/data=!4m5!3m4!1s0x0:0xdfc2b61c9b67aac2!8m2!3d19.299013!4d-99.196093" target="_blank"> <span class="fas fa-map-marker-alt mr-1"></span>¿Cómo llegar?</a></p>
+                                </div>
+                                <div class="tab-pane fade" id="unidad3" role="tabpanel" aria-labelledby="unidad3-tab">
+                                    <p>Av. De Las Fuentes 17, Col. Tlalpan, Alc. Tlalpan, CDMX, CP 14000 <span class="tel">Tel. <a href="tel:+525552789500">55 5278-9500</a> / <a href="tel:+8005272553">800 LASALLE</a></span><br>
+                                    <a class="btnMap " href="https://www.google.com/maps/place/Universidad+La+Salle+Facultad+de+Medicina/@19.2930318,-99.1720808,15z/data=!4m5!3m4!1s0x0:0x29b7725e5a004277!8m2!3d19.2930318!4d-99.1720808" target="_blank"> <span class="fas fa-map-marker-alt mr-1"></span>¿Cómo llegar?</a></p>
+                                </div>
+                                <div class="tab-pane fade" id="unidad4" role="tabpanel" aria-labelledby="unidad4-tab">
+                                    <p>Av. Tamaulipas 3, Col. Zona Federal, Alc. Álvaro Obregón, CDMX, CP 01357 <span class="tel">Tel. <a href="tel:5556021130">55 5602-1130</a> </span><br>
+                                    <a class="btnMap " href="https://www.google.com/maps/place/Unidad+Deportiva+La+Salle/@19.3662852,-99.2421597,15z/data=!4m5!3m4!1s0x0:0x88e0334f044bc518!8m2!3d19.3662852!4d-99.2421597" target="_blank"> <span class="fas fa-map-marker-alt mr-1"></span>¿Cómo llegar?</a></p>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="redes">
+                        <h4>Compartir :</h4>
+                        <ul>
+                            <li><a href="https://www.facebook.com/LaSalleMXIngenieria" target="_blank"><i class="fab fa-facebook-f fa-fw"></i></a></li>
+                            <!--<li><a href="https://twitter.com/lasalle_mx" target="_blank"><i class="fab fa-twitter fa-fw"></i></a></li>-->
+                            <li><a href="https://www.youtube.com/user/IngenieriaLaSalle/" target="_blank"><i class="fab fa-youtube fa-fw"></i></a></li>
+                            <!--<li><a href="https://www.instagram.com/lasalle_mx/" target="_blank"><i class="fab fa-instagram fa-fw"></i></a></li>-->
+                            <!--<li><a href="https://www.linkedin.com/school/universidad-la-salle?pathWildcard=24227" target="_blank"><i class="fab fa-linkedin-in fa-fw"></i></a></li>-->
+                        </ul>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="footerMiddle">
+            <div class="container">
+                <div class="row justify-content-md-center">
+                    <nav class="col-12 col-md-10">
+                        <a class="footerMore menuMore" href="#">Sistema y Red La Salle</a>
+                        <ul>
+                            <li><a href="http://bajio.delasalle.edu.mx/" target="_blank">Bajío</a></li>
+                            <li><a href="http://www.lasalle.mx/" target="_blank">Ciudad de México</a></li>
+                            <li><a href="http://lasallecancun.edu.mx/" target="_blank">Cancún</a></li>
+                            <li><a href="http://www.ulsapuebla.mx/" target="_blank">Puebla</a></li>
+                            <li><a href="http://www.ulsapuebla.mx/" target="_blank">Chihuahua</a></li>
+                            <li><a href="http://www.lasallecuernavaca.edu.mx/wp/" target="_blank">Cuernavaca</a></li>
+                            <li><a href="http://www.ulsalaguna.edu.mx/" target="_blank">Laguna</a></li>
+                            <li><a href="http://www.lasallemorelia.edu.mx/" target="_blank">Morelia</a></li>
+                            <li><a href="http://www.ulsaneza.edu.mx/" target="_blank">Nezahualcóyotl</a></li>
+                            <li><a href="http://www.ulsa-noroeste.edu.mx/n2015/" target="_blank">Noroeste</a></li>
+                            <li><a href="http://www.ulsaoaxaca.edu.mx/" target="_blank">Oaxaca</a></li>
+                            <li><a href="http://www.lasallep.edu.mx/" target="_blank">Pachuca</a></li>
+                            <li><a href="https://www.ulsasaltillo.edu.mx/" target="_blank">Saltillo</a></li>
+                            <li><a href="https://www.lasallevictoria.edu.mx/" target="_blank">Victoria</a></li>
+                        </ul>
+                    </nav>
+                </div>
+            </div>
+        </div>
+        <div class="footerBottom">
+            <div class="container">
+                <div class="logotipos">
+                    <ul>
+                        <li><a href="http://redlasalle.mx/" target="_blank"><img src="imagenes/la-salle-logo-red-universidades.png" alt="La Salle - logotipo" class="img-responsive" width="80"></a></li>
+                    <li><a href="http://ialu.org/english/" target="_blank"><img src="imagenes/la-salle-logo-international-ia.png" alt="La Salle - logotipo" class="img-responsive" width="80"></a></li>
+                    </ul>
+                </div>
+                <div class="legales">
+                    <a class="footerMore menuMore" href="#">Legales</a>
+                    <ul>
+                        <li><a href="https://lasalle.mx/globales/contacto.html" target="_blank">Contacto</a></li>
+                        <li><a href="https://lasalle.mx/globales/terminos-y-condiciones.html" target="_blank">Términos y condiciones</a></li>
+                        <li><a href="https://lasalle.mx/globales/aviso-de-privacidad.html" target="_blank">Aviso de Privacidad</a></li>
+                        <!--<li><a href="https://lasalle.mx/globales/mapa-de-sitio.html" target="_blank">Mapa de sitio</a></li>
+                        <li><a href="https://lasalle.mx/globales/preguntas-frecuentes/" target="_blank">Preguntas frecuentes</a></li>-->
+                    </ul>
+                </div>
+            </div>
+        </div>
+    </footer>
 </div>

+ 21 - 21
import/html_forms.php

@@ -1,22 +1,22 @@
-<?php // Necesita sesión y BD abiertas
-require_once "include/constantes.php";
-?>
-<link rel="stylesheet" href="css/jquery-ui.css">
-<link rel="stylesheet" href="css/calendar.css">
-<?php
-require_once "import/periodo.php";
-?>
-<script src="js/jquery.min.js"></script>
-<script src="js/jquery-ui.js"></script>
-<script src="js/datepicker-es.js"></script>
-
-<?php include_once "js/messages.php"; ?>
-
-
-<!-- <script>
-    $(".date-picker").datepicker($.datepicker.regional["es"]);
-    $(".date-picker").datepicker({
-        dateFormat: "dd/mm/yyyy",
-        changeMonth: true,
-    });
+<?php // Necesita sesión y BD abiertas
+require_once "include/constantes.php";
+?>
+<link rel="stylesheet" href="css/jquery-ui.css">
+<link rel="stylesheet" href="css/calendar.css">
+<?php
+require_once "import/periodo.php";
+?>
+<script src="js/jquery.min.js"></script>
+<script src="js/jquery-ui.js"></script>
+<script src="js/datepicker-es.js"></script>
+
+<?php include_once "js/messages.php"; ?>
+
+
+<!-- <script>
+    $(".date-picker").datepicker($.datepicker.regional["es"]);
+    $(".date-picker").datepicker({
+        dateFormat: "dd/mm/yyyy",
+        changeMonth: true,
+    });
 </script> -->

+ 138 - 138
import/html_forms_asistencia.php

@@ -1,139 +1,139 @@
-<?php
-include_once "import/html_forms.php";
-?>
-
-
-<form id="asistencia">
-    <div class="form-box">
-        <input type="hidden" name="facultad" value="<?= $user->facultad['facultad_id']; ?>">
-        <?php
-        $periodo = $db->where('id', $user->periodo)->getOne('fs_periodo');
-        $carreras = $db
-            ->where('nivel', $periodo['nivel_id'])
-            ->where('facultad', $user->facultad['facultad_id'])
-            ->orderBy('carrera')
-            ->get('fs_carrera');
-
-        ?>
-        <div class="form-group row">
-            <label for="filter_carrera" class="col-4 col-form-label">Carrera</label>
-            <div class="col-6 ">
-                <div id="dlcarrera" class="datalist datalist-select mb-1 w-100">
-                    <div class="datalist-input">Seleccionar todas las carreras</div>
-                    <span class="ing-buscar icono"></span>
-                    <ul style="display:none">
-                        <li data-id="">Seleccionar todas las carreras</li>
-                        <?php
-                        foreach ($carreras as $carrera) {
-                        ?>
-                            <li data-id="<?= $carrera['id'] ?>">
-                                <?= $carrera['carrera'] ?>
-                            </li>
-                        <?php
-                        }
-                        ?>
-                    </ul>
-                    <input type="hidden" id="filter_carrera" name="carrera" value="">
-                </div>
-            </div>
-        </div>
-
-        <div class="form-group row">
-            <label for="filterClave" class="col-4 col-form-label">Clave</label>
-            <div class="col-6 ">
-                <input type="text" class="form-control" id="filterClave" name="clave" placeholder="Clave del profesor (opcional)" value="<?= $clave ?? '' ?>" pattern="(do)?[0-9]{3,6}" title="La clave debe tener 8 caracteres, los primeros 2 deben ser letras y los últimos 6 números" minlength="3" maxlength="8">
-            </div>
-        </div>
-        <div class="form-group row">
-            <label for="filterNombre" class="col-4 col-form-label">Nombre</label>
-            <div class="col-6 ">
-                <input type="text" class="form-control" id="filterNombre" name="nombre" placeholder="Nombre del profesor (opcional)">
-            </div>
-        </div>
-
-        <div class="form-group row">
-            <label for="fecha_inicial" class="col-4 col-form-label">Fecha inicial</label>
-            <div class="col-8 col-sm-4">
-                <input id="fecha_inicial" name="fecha_inicial" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly>
-                <div class="invalid-feedback">No es una fecha válida.</div>
-            </div>
-        </div>
-        <div class="form-group row">
-            <label for="fecha_final" class="col-4 col-form-label">Fecha final</label>
-            <div class="col-8 col-sm-4">
-                <input id="fecha_final" name="fecha_final" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly>
-                <div class="invalid-feedback">No es una fecha válida o el rango es incorrecto.</div>
-            </div>
-        </div>
-    </div>
-    <div class="form-group row justify-content-center">
-        <button type="submit" class="btn btn-outline-primary mr-2" id="btn-buscar"><?php echo $ICO["buscar"]; ?> Buscar asistencias</button>
-        <button type="button" class="btn btn-outline-danger" onclick="window.location.href = window.location.href"><?php echo $ICO["borrar"]; ?> Limpiar</button>
-    </div>
-
-</form>
-
-<script>
-    var today = new Date();
-    $(".date-picker").datepicker($.datepicker.regional["es"]);
-    $(".date-picker").datepicker({
-        dateFormat: "dd/mm/yyyy",
-        changeMonth: true,
-    });
-    <?php
-    $periodo = query("SELECT * FROM FS_PERIODO WHERE ID = :periodo", [":periodo" => $user->periodo]);
-    echo "// Período: {$periodo["inicio"]} - {$periodo["fin"]}\n";
-    echo "// Fecha inicial: " . ($fecha_inicial ?? 'n/a') . " - Fecha final: " . ($fecha_final ?? 'n/a') . "\n";
-    ?>
-    // $periodo format = Y-m-d
-    const inicio = new Date(<?= date('Y, m-1, d', strtotime($periodo['inicio'])) ?>); 
-    var fecha_inicial = new Date(<?= date('Y, m-1, d', strtotime($fecha_inicial ?? $periodo['inicio'])) ?>)
-    var fecha_final = new Date(<?= date('Y, m-1, d', strtotime($fecha_final   ?? $periodo['fin'])) ?>)
-    const limit = new Date(Math.min(today, fecha_final));
-
-    console.log(`today: ${today}, fecha_inicial: ${fecha_inicial}, fecha_final: ${fecha_final}`);
-    $("#fecha_inicial").datepicker("option", "minDate", inicio);
-    $("#fecha_inicial").datepicker("option", "maxDate", limit);
-    $("#fecha_final").datepicker("option", "minDate", fecha_inicial);
-    $("#fecha_final").datepicker("option", "maxDate", limit);
-    // if today is in the period, set the initial date to today
-    $("#fecha_inicial").datepicker("setDate", fecha_inicial);
-    $("#fecha_final").datepicker("setDate", today <= fecha_final ? today : fecha_final);
-
-    // if the datepicker is changed, check if the range is valid
-    makeRequiredDatalist("#filter_facultad", true);
-    makeRequiredDatalist("#filter_carrera", true);
-
-
-    $(document).on('click', '#dlFacultad ul li', function() {
-        var id = $(this).data('id');
-        // remove all option
-        $('#dlcarrera ul').empty();
-        disableDatalist("#filter_carrera", false);
-        $.post(
-            'action/action_carreras.php', {
-                facultad: id,
-                periodo: $('#periodo').val()
-            },
-            function(data) {
-                $('#dlcarrera ul').append("<li>Seleccionar todas</li>");
-                for (var i = 0; i < data.length; i++)
-                    $('#dlcarrera ul').append(`<li data-id="${data[i].id}">${data[i].carrera}</li>`);
-                setDatalistFirst("#filter_carrera")
-            },
-            'json'
-        )
-    });
-
-    $(document).on('change', '#fecha_inicial', function() {
-        var fi = $(this).datepicker("getDate");
-        $("#fecha_final").datepicker("option", "minDate", fi);
-    });
-
-    $(document).on('change', '#fecha_final', function() {
-        var ff = $(this).datepicker("getDate");
-        $("#fecha_inicial").datepicker("option", "maxDate", ff);
-    });
-
-
+<?php
+include_once "import/html_forms.php";
+?>
+
+
+<form id="asistencia">
+    <div class="form-box">
+        <input type="hidden" name="facultad" value="<?= $user->facultad['facultad_id']; ?>">
+        <?php
+        $periodo = $db->where('id', $user->periodo)->getOne('fs_periodo');
+        $carreras = $db
+            ->where('nivel', $periodo['nivel_id'])
+            ->where('facultad', $user->facultad['facultad_id'])
+            ->orderBy('carrera')
+            ->get('fs_carrera');
+
+        ?>
+        <div class="form-group row">
+            <label for="filter_carrera" class="col-4 col-form-label">Carrera</label>
+            <div class="col-6 ">
+                <div id="dlcarrera" class="datalist datalist-select mb-1 w-100">
+                    <div class="datalist-input">Seleccionar todas las carreras</div>
+                    <span class="ing-buscar icono"></span>
+                    <ul style="display:none">
+                        <li data-id="">Seleccionar todas las carreras</li>
+                        <?php
+                        foreach ($carreras as $carrera) {
+                        ?>
+                            <li data-id="<?= $carrera['id'] ?>">
+                                <?= $carrera['carrera'] ?>
+                            </li>
+                        <?php
+                        }
+                        ?>
+                    </ul>
+                    <input type="hidden" id="filter_carrera" name="carrera" value="">
+                </div>
+            </div>
+        </div>
+
+        <div class="form-group row">
+            <label for="filterClave" class="col-4 col-form-label">Clave</label>
+            <div class="col-6 ">
+                <input type="text" class="form-control" id="filterClave" name="clave" placeholder="Clave del profesor (opcional)" value="<?= $clave ?? '' ?>" pattern="(do)?[0-9]{3,6}" title="La clave debe tener 8 caracteres, los primeros 2 deben ser letras y los últimos 6 números" minlength="3" maxlength="8">
+            </div>
+        </div>
+        <div class="form-group row">
+            <label for="filterNombre" class="col-4 col-form-label">Nombre</label>
+            <div class="col-6 ">
+                <input type="text" class="form-control" id="filterNombre" name="nombre" placeholder="Nombre del profesor (opcional)">
+            </div>
+        </div>
+
+        <div class="form-group row">
+            <label for="fecha_inicial" class="col-4 col-form-label">Fecha inicial</label>
+            <div class="col-8 col-sm-4">
+                <input id="fecha_inicial" name="fecha_inicial" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly>
+                <div class="invalid-feedback">No es una fecha válida.</div>
+            </div>
+        </div>
+        <div class="form-group row">
+            <label for="fecha_final" class="col-4 col-form-label">Fecha final</label>
+            <div class="col-8 col-sm-4">
+                <input id="fecha_final" name="fecha_final" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly>
+                <div class="invalid-feedback">No es una fecha válida o el rango es incorrecto.</div>
+            </div>
+        </div>
+    </div>
+    <div class="form-group row justify-content-center">
+        <button type="submit" class="btn btn-outline-primary mr-2" id="btn-buscar"><?php echo $ICO["buscar"]; ?> Buscar asistencias</button>
+        <button type="button" class="btn btn-outline-danger" onclick="window.location.href = window.location.href"><?php echo $ICO["borrar"]; ?> Limpiar</button>
+    </div>
+
+</form>
+
+<script>
+    var today = new Date();
+    $(".date-picker").datepicker($.datepicker.regional["es"]);
+    $(".date-picker").datepicker({
+        dateFormat: "dd/mm/yyyy",
+        changeMonth: true,
+    });
+    <?php
+    $periodo = query("SELECT * FROM FS_PERIODO WHERE ID = :periodo", [":periodo" => $user->periodo]);
+    echo "// Período: {$periodo["inicio"]} - {$periodo["fin"]}\n";
+    echo "// Fecha inicial: " . ($fecha_inicial ?? 'n/a') . " - Fecha final: " . ($fecha_final ?? 'n/a') . "\n";
+    ?>
+    // $periodo format = Y-m-d
+    const inicio = new Date(<?= date('Y, m-1, d', strtotime($periodo['inicio'])) ?>); 
+    var fecha_inicial = new Date(<?= date('Y, m-1, d', strtotime($fecha_inicial ?? $periodo['inicio'])) ?>)
+    var fecha_final = new Date(<?= date('Y, m-1, d', strtotime($fecha_final   ?? $periodo['fin'])) ?>)
+    const limit = new Date(Math.min(today, fecha_final));
+
+    console.log(`today: ${today}, fecha_inicial: ${fecha_inicial}, fecha_final: ${fecha_final}`);
+    $("#fecha_inicial").datepicker("option", "minDate", inicio);
+    $("#fecha_inicial").datepicker("option", "maxDate", limit);
+    $("#fecha_final").datepicker("option", "minDate", fecha_inicial);
+    $("#fecha_final").datepicker("option", "maxDate", limit);
+    // if today is in the period, set the initial date to today
+    $("#fecha_inicial").datepicker("setDate", fecha_inicial);
+    $("#fecha_final").datepicker("setDate", today <= fecha_final ? today : fecha_final);
+
+    // if the datepicker is changed, check if the range is valid
+    makeRequiredDatalist("#filter_facultad", true);
+    makeRequiredDatalist("#filter_carrera", true);
+
+
+    $(document).on('click', '#dlFacultad ul li', function() {
+        var id = $(this).data('id');
+        // remove all option
+        $('#dlcarrera ul').empty();
+        disableDatalist("#filter_carrera", false);
+        $.post(
+            'action/action_carreras.php', {
+                facultad: id,
+                periodo: $('#periodo').val()
+            },
+            function(data) {
+                $('#dlcarrera ul').append("<li>Seleccionar todas</li>");
+                for (var i = 0; i < data.length; i++)
+                    $('#dlcarrera ul').append(`<li data-id="${data[i].id}">${data[i].carrera}</li>`);
+                setDatalistFirst("#filter_carrera")
+            },
+            'json'
+        )
+    });
+
+    $(document).on('change', '#fecha_inicial', function() {
+        var fi = $(this).datepicker("getDate");
+        $("#fecha_final").datepicker("option", "minDate", fi);
+    });
+
+    $(document).on('change', '#fecha_final', function() {
+        var ff = $(this).datepicker("getDate");
+        $("#fecha_inicial").datepicker("option", "maxDate", ff);
+    });
+
+
 </script>

+ 110 - 110
import/html_forms_justificacion.php

@@ -1,111 +1,111 @@
-<?php
-include_once "import/html_forms.php";
-?>
-
-<link rel="stylesheet" href="css/clockpicker.css">
-<form id="justificar">
-    <div class="form-box">
-        <div class="col-md-6 col-sm-12 text-center mb-3">
-            Selecciona la fecha que deseas justificar.
-        </div>
-        <div class="form-group row">
-            <label for="filter_fecha" class="col-4 col-form-label">Fecha *</label>
-            <div class="col-6 ">
-                <input id="filter_fecha" name="fecha" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly>
-                <div class="invalid-feedback">No es una fecha válida.</div>
-            </div>
-        </div>
-        <!-- Hora inicio CLOCKPICKER -->
-        <div class="form-group row">
-            <label for="filter_hora_inicio" class="col-4 col-form-label">Hora estimada *</label>
-            <div class="input-group clockpicker col-6 ">
-                <input id="filter_hora_inicio" name="hora_inicio" type="text" class="form-control" placeholder="hh:mm" maxlength="5" required="required" readonly>
-                <div class="input-group-append">
-                    <span class="input-group-text" onclick="$('#filter_hora_inicio').focus();">
-                        <i class="ing-reloj"></i>
-                    </span>
-                </div>
-                <div class="invalid-feedback">No es una hora válida.</div>
-            </div>
-
-        </div>
-
-        <!-- Hora fin -->
-        <div class="form-group row">
-            <label for="filter_hora_fin" class="col-4 col-form-label">Hora límite</label>
-            <div class="input-group clockpicker col-6">
-                <input id="filter_hora_fin" name="hora_fin" type="text" class="form-control" placeholder="hh:mm" maxlength="5" readonly>
-                <div class="input-group-append">
-                    <span class="input-group-text" onclick="$('#filter_hora_fin').focus();">
-                        <i class="ing-reloj"></i>
-                    </span>
-                </div>
-                <div class="invalid-feedback">No es una hora válida.</div>
-            </div>
-        </div>
-        <!-- ClaveULSA -->
-        <div class="form-group row">
-            <label for="filter_clave" class="col-4 col-form-label">Clave</label>
-            <div class="col-6">
-                <input id="filter_clave" name="clave" type="text" class="form-control" pattern="(do)?[0-9]{3,6}" placeholder="Clave del profesor (do)" maxlength="8" title="Clave del profesor (do)">
-                <div class="invalid-feedback">No es una clave válida.</div>
-            </div>
-        </div>
-
-        <!-- Nombre -->
-        <div class="form-group row">
-            <label for="filter_nombre" class="col-4 col-form-label">Nombre</label>
-            <div class="col-6">
-                <input id="filter_nombre" name="nombre" type="text" class="form-control" placeholder="Nombre del profesor" maxlength="50" title="Nombre del profesor">
-                <div class="invalid-feedback">No es un nombre válido.</div>
-            </div>
-        </div>
-        <!-- button center -->
-        <div class="form-group row justify-content-center p-3">
-            <button class="btn btn-primary mr-3" id="main-button" type="button">
-                <?= $ICO['buscar'] ?>
-                Buscar profesores
-            </button>
-            <!-- reload page -->
-            <button type="button" class="btn btn-outline-danger" onclick="location.reload();">
-                <span class="ing-borrar icono"></span>
-                Limpiar
-            </button>
-        </div>
-
-    </div>
-
-</form>
-
-<script src="js/clockpicker.js"></script>
-<script>
-    $(".date-picker").datepicker($.datepicker.regional["es"]);
-    $(".date-picker").datepicker({
-        dateFormat: "dd/mm/yyyy",
-        changeMonth: true,
-    });
-
-    $('.clockpicker').clockpicker({
-        placement: 'bottom',
-        align: 'right',
-        donetext: 'Aceptar',
-        autoclose: true,
-        'default': 'now',
-
-        afterShow: function() {
-            $('.clockpicker-minutes').find('.clockpicker-tick').filter(function() {
-                return $(this).text() % 5 !== 0;
-            }).remove();
-
-            $('.clockpicker-hours').find('.clockpicker-tick').filter(function(index, element) {
-                let num = parseInt($(element).text());
-                let condition = num < 7 || num > 22;
-                return condition;
-            }).remove();
-        }
-
-    });
-    // only accept from 7:00 to 22:00
-
-
+<?php
+include_once "import/html_forms.php";
+?>
+
+<link rel="stylesheet" href="css/clockpicker.css">
+<form id="justificar">
+    <div class="form-box">
+        <div class="col-md-6 col-sm-12 text-center mb-3">
+            Selecciona la fecha que deseas justificar.
+        </div>
+        <div class="form-group row">
+            <label for="filter_fecha" class="col-4 col-form-label">Fecha *</label>
+            <div class="col-6 ">
+                <input id="filter_fecha" name="fecha" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly>
+                <div class="invalid-feedback">No es una fecha válida.</div>
+            </div>
+        </div>
+        <!-- Hora inicio CLOCKPICKER -->
+        <div class="form-group row">
+            <label for="filter_hora_inicio" class="col-4 col-form-label">Hora estimada *</label>
+            <div class="input-group clockpicker col-6 ">
+                <input id="filter_hora_inicio" name="hora_inicio" type="text" class="form-control" placeholder="hh:mm" maxlength="5" required="required" readonly>
+                <div class="input-group-append">
+                    <span class="input-group-text" onclick="$('#filter_hora_inicio').focus();">
+                        <i class="ing-reloj"></i>
+                    </span>
+                </div>
+                <div class="invalid-feedback">No es una hora válida.</div>
+            </div>
+
+        </div>
+
+        <!-- Hora fin -->
+        <div class="form-group row">
+            <label for="filter_hora_fin" class="col-4 col-form-label">Hora límite</label>
+            <div class="input-group clockpicker col-6">
+                <input id="filter_hora_fin" name="hora_fin" type="text" class="form-control" placeholder="hh:mm" maxlength="5" readonly>
+                <div class="input-group-append">
+                    <span class="input-group-text" onclick="$('#filter_hora_fin').focus();">
+                        <i class="ing-reloj"></i>
+                    </span>
+                </div>
+                <div class="invalid-feedback">No es una hora válida.</div>
+            </div>
+        </div>
+        <!-- ClaveULSA -->
+        <div class="form-group row">
+            <label for="filter_clave" class="col-4 col-form-label">Clave</label>
+            <div class="col-6">
+                <input id="filter_clave" name="clave" type="text" class="form-control" pattern="(do)?[0-9]{3,6}" placeholder="Clave del profesor (do)" maxlength="8" title="Clave del profesor (do)">
+                <div class="invalid-feedback">No es una clave válida.</div>
+            </div>
+        </div>
+
+        <!-- Nombre -->
+        <div class="form-group row">
+            <label for="filter_nombre" class="col-4 col-form-label">Nombre</label>
+            <div class="col-6">
+                <input id="filter_nombre" name="nombre" type="text" class="form-control" placeholder="Nombre del profesor" maxlength="50" title="Nombre del profesor">
+                <div class="invalid-feedback">No es un nombre válido.</div>
+            </div>
+        </div>
+        <!-- button center -->
+        <div class="form-group row justify-content-center p-3">
+            <button class="btn btn-primary mr-3" id="main-button" type="button">
+                <?= $ICO['buscar'] ?>
+                Buscar profesores
+            </button>
+            <!-- reload page -->
+            <button type="button" class="btn btn-outline-danger" onclick="location.reload();">
+                <span class="ing-borrar icono"></span>
+                Limpiar
+            </button>
+        </div>
+
+    </div>
+
+</form>
+
+<script src="js/clockpicker.js"></script>
+<script>
+    $(".date-picker").datepicker($.datepicker.regional["es"]);
+    $(".date-picker").datepicker({
+        dateFormat: "dd/mm/yyyy",
+        changeMonth: true,
+    });
+
+    $('.clockpicker').clockpicker({
+        placement: 'bottom',
+        align: 'right',
+        donetext: 'Aceptar',
+        autoclose: true,
+        'default': 'now',
+
+        afterShow: function() {
+            $('.clockpicker-minutes').find('.clockpicker-tick').filter(function() {
+                return $(this).text() % 5 !== 0;
+            }).remove();
+
+            $('.clockpicker-hours').find('.clockpicker-tick').filter(function(index, element) {
+                let num = parseInt($(element).text());
+                let condition = num < 7 || num > 22;
+                return condition;
+            }).remove();
+        }
+
+    });
+    // only accept from 7:00 to 22:00
+
+
 </script>

+ 162 - 162
import/html_forms_vista.php

@@ -1,163 +1,163 @@
-<section id="message"></section>
-<?php
-$target = '/checador_otros/admin_checador/reporte_de_asistencias.php';
-$id = $_POST['id'];
-include_once "import/html_forms.php";
-
-$carreras = queryAll("SELECT DISTINCT carrera, id, facultad FROM FS_CARRERA WHERE ID IN (SELECT distinct CARRERA_ID FROM FS_HORARIO_BASIC WHERE :id  IN (SELECT HORARIO_ID FROM HORARIO_PROFESOR WHERE PROFESOR_ID = :id) AND PERIODO_ID = :per)", [':id' => $id, ':per' => $user->periodo]);
-// materia por carrera
-#print_r($carreras);
-$materias = queryAll("SELECT DISTINCT * FROM FS_MATERIA WHERE CARRERA = COALESCE(:car, CARRERA)  AND ID IN (SELECT distinct materia_id FROM HORARIO WHERE :id IN (SELECT HORARIO_ID FROM HORARIO_PROFESOR WHERE PROFESOR_ID = :id) AND PERIODO_ID = :per) ORDER BY NOMBRE", [":car" => empty($carrera) ? null : $carrera, ':id' => $id, ':per' => $user->periodo]);
-#exit();
-$periodo = query("SELECT inicio, fin FROM FS_PERIODO WHERE ID = :per", [':per' => $user->periodo]);
-?>
-
-
-<form action="#" method="post" id="form" class="form-horizontal">
-    <input type="hidden" name="id" value="<?= $id; ?>" />
-    <input type="hidden" name="periodo" value="<?= $user->periodo ?>" />
-    <input type="hidden" name="facultad" value="<?= $user->facultad['facultad_id'] ?>" />
-    <input type="hidden" name="clave" value="<?= $profesor['clave'] ?>" />
-    <div class="form-box">
-        <div class="form-group row">
-            <label for="filter_carrera" class="col-4 col-form-label">Carrera</label>
-            <div class="col-6">
-                <div id="dlcarrera" class="datalist datalist-select mb-1 w-100">
-                    <div class="datalist-input">Todas las carreras</div>
-                    <span class="ing-buscar icono"></span>
-                    <ul style="display:none">
-                        <!-- Seleccionar todas -->
-                        <li data-value="0">Todas las carreras</li>
-                        <?php foreach ($carreras as $car) {
-                        ?>
-                            <li data-id="<?= $car['id'] ?>" class="<?= ($car['id'] == $carrera) ? "selected" : '' ?>" onclick="carreras(<?= $car['id'] ?>)">
-                                <?= $car['carrera'] ?>
-                            </li>
-                        <?php } ?>
-                    </ul>
-                    <input type="hidden" id="filter_carrera" name="carrera" value="">
-                </div>
-            </div>
-        </div>
-        <!-- Materia -->
-        <div class="form-group row">
-            <label for="filter_materia" class="col-4 col-form-label">Materia</label>
-            <div class="col-6">
-                <div id="dlmateria" class="datalist datalist-select mb-1 w-100">
-                    <div class="datalist-input">Todas las materias</div>
-                    <span class="ing-buscar icono"></span>
-                    <ul style="display:none">
-                        <li data-value="0">Todas las materias</li>
-                        <?php foreach ($materias as $materia) { ?>
-                            <li data-id="<?= $materia['id']; ?>" class="<?= ($materia['id'] == $_POST['materia']) ? "selected" : '' ?>">
-                                <?= $materia['nombre']; ?>
-                            </li>
-                        <?php } ?>
-                    </ul>
-                    <input type="hidden" id="filter_materia" name="materia" value="">
-                </div>
-            </div>
-        </div>
-
-        <!-- Fecha inicial y fecha final -->
-        <div class="form-group row">
-            <label for="fecha_inicial" class="col-4 col-form-label">Fecha inicial</label>
-            <div class="col-8 col-sm-4">
-                <input id="fecha_inicial" name="fecha_inicial" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly>
-                <div class="invalid-feedback">No es una fecha válida.</div>
-            </div>
-        </div>
-        <div class="form-group row">
-            <label for="fecha_final" class="col-4 col-form-label">Fecha final</label>
-            <div class="col-8 col-sm-4">
-                <input id="fecha_final" name="fecha_final" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly>
-                <div class="invalid-feedback">No es una fecha válida o el rango es incorrecto.</div>
-            </div>
-        </div>
-    </div>
-
-    <!-- ICO-BUSCAR FILTRAR & ICO-BORRAR LIMPIAR -->
-    <div class="form-group row justify-content-center">
-        <button type="button" class="btn btn-outline-primary mr-2" onclick="if(validateForm) submit('vista_profesor.php')">
-            <span class="ing-buscar icono"></span>
-            Filtrar
-        </button>
-        <button type="button" class="btn btn-outline-danger" onclick="reset_form(); submit('vista_profesor.php')">
-            <span class="ing-borrar icono"></span>
-            Limpiar
-        </button>
-    </div>
-</form>
-<?php
-include_once "js/messages.php";
-?>
-<script>
-    $(".date-picker").datepicker($.datepicker.regional["es"]);
-    $(".date-picker").datepicker({
-        dateFormat: "dd/mm/yyyy",
-        changeMonth: true,
-    });
-    var today = new Date();
-
-    var fecha_inicial = new Date(<?= $fecha_inicial->format("Y, m-1, d") ?>);
-    var fecha_inicial_periodo = new Date(<?= date("Y, m-1, d", strtotime($periodo['inicio'])) ?>);
-    var fecha_final = new Date(<?= $fecha_final->format("Y, m-1, d") ?>);
-    var fecha_final_periodo = new Date(<?= date("Y, m-1, d", strtotime($periodo['fin'])) ?>);
-    var limit = new Date(Math.min(today, fecha_final_periodo));
-    // if today is in the period, set the initial date to today
-    $("#fecha_inicial").datepicker("option", "minDate", fecha_inicial_periodo);
-    $("#fecha_inicial").datepicker("option", "maxDate", limit);
-    $("#fecha_final").datepicker("option", "minDate", fecha_inicial_periodo);
-    $("#fecha_final").datepicker("option", "maxDate", limit);
-
-    $("#fecha_inicial").datepicker("setDate", fecha_inicial);
-    $("#fecha_final").datepicker("setDate", today <= fecha_final ? today : fecha_final);
-
-    function reset_form() {
-        $("#fecha_inicial").datepicker("setDate", fecha_inicial_periodo);
-        $("#fecha_final").datepicker("setDate", today <= fecha_inicial_periodo ? today : fecha_final_periodo);
-        setDatalistFirst("#filter_carrera");
-        setDatalistFirst("#filter_materia");
-        disableDatalist("#filter_materia");
-    }
-
-    <?php if (empty($carrera)) { ?>
-        disableDatalist("#filter_materia", true);
-    <?php } ?>
-
-
-    // $("#fecha_inicial").on("change", function() {
-    //     var fecha_inicial = $("#fecha_inicial").datepicker("getDate");
-    //     var fecha_final = $("#fecha_final").datepicker("getDate");
-    //     if (fecha_final < fecha_inicial) {
-    //         $("#fecha_final").datepicker("setDate", fecha_inicial);
-    //     }
-    //     $("#fecha_final").datepicker("option", "minDate", fecha_inicial);
-    // });
-
-    // $("#fecha_final").on("change", function() {
-    //     var fecha_inicial = $("#fecha_inicial").datepicker("getDate");
-    //     var fecha_final = $("#fecha_final").datepicker("getDate");
-    //     if (fecha_final < fecha_inicial) {
-    //         $("#fecha_inicial").datepicker("setDate", fecha_final);
-    //     }
-    //     $("#fecha_inicial").datepicker("option", "maxDate", fecha_final);
-    // });
-    // Datalist carrera then select materia
-    $(document).on('click', '#dlcarrera li', function() {
-        // if this is empty
-        // console.log($(this).attr('data-value'));
-        if ($(this).attr('data-value') == '0')
-            disableDatalist("#filter_materia", true);
-    });
-
-    $(document).on('change', '#fecha_inicial', function() {
-        let fi = $(this).datepicker("getDate");
-        $("#fecha_final").datepicker("option", "minDate", fi);
-    });
-
-    $(document).on('change', '#fecha_final', function() {
-        let ff = $(this).datepicker("getDate");
-        $("#fecha_inicial").datepicker("option", "maxDate", ff);
-    });
+<section id="message"></section>
+<?php
+$target = '/checador_otros/admin_checador/reporte_de_asistencias.php';
+$id = $_POST['id'];
+include_once "import/html_forms.php";
+
+$carreras = queryAll("SELECT DISTINCT carrera, id, facultad FROM FS_CARRERA WHERE ID IN (SELECT distinct CARRERA_ID FROM FS_HORARIO_BASIC WHERE :id  IN (SELECT HORARIO_ID FROM HORARIO_PROFESOR WHERE PROFESOR_ID = :id) AND PERIODO_ID = :per)", [':id' => $id, ':per' => $user->periodo]);
+// materia por carrera
+#print_r($carreras);
+$materias = queryAll("SELECT DISTINCT * FROM FS_MATERIA WHERE CARRERA = COALESCE(:car, CARRERA)  AND ID IN (SELECT distinct materia_id FROM HORARIO WHERE :id IN (SELECT HORARIO_ID FROM HORARIO_PROFESOR WHERE PROFESOR_ID = :id) AND PERIODO_ID = :per) ORDER BY NOMBRE", [":car" => empty($carrera) ? null : $carrera, ':id' => $id, ':per' => $user->periodo]);
+#exit();
+$periodo = query("SELECT inicio, fin FROM FS_PERIODO WHERE ID = :per", [':per' => $user->periodo]);
+?>
+
+
+<form action="#" method="post" id="form" class="form-horizontal">
+    <input type="hidden" name="id" value="<?= $id; ?>" />
+    <input type="hidden" name="periodo" value="<?= $user->periodo ?>" />
+    <input type="hidden" name="facultad" value="<?= $user->facultad['facultad_id'] ?>" />
+    <input type="hidden" name="clave" value="<?= $profesor['clave'] ?>" />
+    <div class="form-box">
+        <div class="form-group row">
+            <label for="filter_carrera" class="col-4 col-form-label">Carrera</label>
+            <div class="col-6">
+                <div id="dlcarrera" class="datalist datalist-select mb-1 w-100">
+                    <div class="datalist-input">Todas las carreras</div>
+                    <span class="ing-buscar icono"></span>
+                    <ul style="display:none">
+                        <!-- Seleccionar todas -->
+                        <li data-value="0">Todas las carreras</li>
+                        <?php foreach ($carreras as $car) {
+                        ?>
+                            <li data-id="<?= $car['id'] ?>" class="<?= ($car['id'] == $carrera) ? "selected" : '' ?>" onclick="carreras(<?= $car['id'] ?>)">
+                                <?= $car['carrera'] ?>
+                            </li>
+                        <?php } ?>
+                    </ul>
+                    <input type="hidden" id="filter_carrera" name="carrera" value="">
+                </div>
+            </div>
+        </div>
+        <!-- Materia -->
+        <div class="form-group row">
+            <label for="filter_materia" class="col-4 col-form-label">Materia</label>
+            <div class="col-6">
+                <div id="dlmateria" class="datalist datalist-select mb-1 w-100">
+                    <div class="datalist-input">Todas las materias</div>
+                    <span class="ing-buscar icono"></span>
+                    <ul style="display:none">
+                        <li data-value="0">Todas las materias</li>
+                        <?php foreach ($materias as $materia) { ?>
+                            <li data-id="<?= $materia['id']; ?>" class="<?= ($materia['id'] == $_POST['materia']) ? "selected" : '' ?>">
+                                <?= $materia['nombre']; ?>
+                            </li>
+                        <?php } ?>
+                    </ul>
+                    <input type="hidden" id="filter_materia" name="materia" value="">
+                </div>
+            </div>
+        </div>
+
+        <!-- Fecha inicial y fecha final -->
+        <div class="form-group row">
+            <label for="fecha_inicial" class="col-4 col-form-label">Fecha inicial</label>
+            <div class="col-8 col-sm-4">
+                <input id="fecha_inicial" name="fecha_inicial" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly>
+                <div class="invalid-feedback">No es una fecha válida.</div>
+            </div>
+        </div>
+        <div class="form-group row">
+            <label for="fecha_final" class="col-4 col-form-label">Fecha final</label>
+            <div class="col-8 col-sm-4">
+                <input id="fecha_final" name="fecha_final" type="text" class="form-control date-picker" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly>
+                <div class="invalid-feedback">No es una fecha válida o el rango es incorrecto.</div>
+            </div>
+        </div>
+    </div>
+
+    <!-- ICO-BUSCAR FILTRAR & ICO-BORRAR LIMPIAR -->
+    <div class="form-group row justify-content-center">
+        <button type="button" class="btn btn-outline-primary mr-2" onclick="if(validateForm) submit('vista_profesor.php')">
+            <span class="ing-buscar icono"></span>
+            Filtrar
+        </button>
+        <button type="button" class="btn btn-outline-danger" onclick="reset_form(); submit('vista_profesor.php')">
+            <span class="ing-borrar icono"></span>
+            Limpiar
+        </button>
+    </div>
+</form>
+<?php
+include_once "js/messages.php";
+?>
+<script>
+    $(".date-picker").datepicker($.datepicker.regional["es"]);
+    $(".date-picker").datepicker({
+        dateFormat: "dd/mm/yyyy",
+        changeMonth: true,
+    });
+    var today = new Date();
+
+    var fecha_inicial = new Date(<?= $fecha_inicial->format("Y, m-1, d") ?>);
+    var fecha_inicial_periodo = new Date(<?= date("Y, m-1, d", strtotime($periodo['inicio'])) ?>);
+    var fecha_final = new Date(<?= $fecha_final->format("Y, m-1, d") ?>);
+    var fecha_final_periodo = new Date(<?= date("Y, m-1, d", strtotime($periodo['fin'])) ?>);
+    var limit = new Date(Math.min(today, fecha_final_periodo));
+    // if today is in the period, set the initial date to today
+    $("#fecha_inicial").datepicker("option", "minDate", fecha_inicial_periodo);
+    $("#fecha_inicial").datepicker("option", "maxDate", limit);
+    $("#fecha_final").datepicker("option", "minDate", fecha_inicial_periodo);
+    $("#fecha_final").datepicker("option", "maxDate", limit);
+
+    $("#fecha_inicial").datepicker("setDate", fecha_inicial);
+    $("#fecha_final").datepicker("setDate", today <= fecha_final ? today : fecha_final);
+
+    function reset_form() {
+        $("#fecha_inicial").datepicker("setDate", fecha_inicial_periodo);
+        $("#fecha_final").datepicker("setDate", today <= fecha_inicial_periodo ? today : fecha_final_periodo);
+        setDatalistFirst("#filter_carrera");
+        setDatalistFirst("#filter_materia");
+        disableDatalist("#filter_materia");
+    }
+
+    <?php if (empty($carrera)) { ?>
+        disableDatalist("#filter_materia", true);
+    <?php } ?>
+
+
+    // $("#fecha_inicial").on("change", function() {
+    //     var fecha_inicial = $("#fecha_inicial").datepicker("getDate");
+    //     var fecha_final = $("#fecha_final").datepicker("getDate");
+    //     if (fecha_final < fecha_inicial) {
+    //         $("#fecha_final").datepicker("setDate", fecha_inicial);
+    //     }
+    //     $("#fecha_final").datepicker("option", "minDate", fecha_inicial);
+    // });
+
+    // $("#fecha_final").on("change", function() {
+    //     var fecha_inicial = $("#fecha_inicial").datepicker("getDate");
+    //     var fecha_final = $("#fecha_final").datepicker("getDate");
+    //     if (fecha_final < fecha_inicial) {
+    //         $("#fecha_inicial").datepicker("setDate", fecha_final);
+    //     }
+    //     $("#fecha_inicial").datepicker("option", "maxDate", fecha_final);
+    // });
+    // Datalist carrera then select materia
+    $(document).on('click', '#dlcarrera li', function() {
+        // if this is empty
+        // console.log($(this).attr('data-value'));
+        if ($(this).attr('data-value') == '0')
+            disableDatalist("#filter_materia", true);
+    });
+
+    $(document).on('change', '#fecha_inicial', function() {
+        let fi = $(this).datepicker("getDate");
+        $("#fecha_final").datepicker("option", "minDate", fi);
+    });
+
+    $(document).on('change', '#fecha_final', function() {
+        let ff = $(this).datepicker("getDate");
+        $("#fecha_inicial").datepicker("option", "maxDate", ff);
+    });
 </script>

+ 149 - 160
import/html_header.php

@@ -1,160 +1,149 @@
-<script defer src="js/sidebarmenu.js"></script>
-
-
-<?php
-require_once 'class/c_login.php';
-$ruta = "../";
-require_once 'include/bd_pdo.php';
-
-if (!isset($_SESSION['user'])) {
-    if (isset($redirect))
-        $_SESSION['ruta'] = $redirect;
-
-    header('Location: index.php');
-}
-
-$user = unserialize($_SESSION['user']);
-
-function html_header($title, $header = null)
-{
-    global $user;
-    $grupos = queryAll("SELECT * FROM GRUPO ORDER BY grupo_nombre");
-
-    if ($user->admin)
-        $paginas = queryAll("SELECT * FROM pagina ORDER BY pagina_ruta");
-    else
-        $paginas = queryAll("SELECT * FROM PERMISO_VIEW WHERE id = :id ORDER BY pagina_ruta", array(":id" => $user->user['id']));
-
-    ?>
-    <aside id="sidebar" class="bg-light defaultShadow d-flex flex-column p-4">
-        <div class="d-flex align-items-center mb-5">
-            <div class="logotipo"><a href="https://lasalle.mx/" target="_blank"><img src="imagenes/logo_lasalle.png"></a>
-            </div>
-            <div class="flex-grow-1 d-flex justify-content-end">
-                <nav class="navbar navbar-expand d-none d-flex">
-                    <ul class="navbar-nav">
-
-                    </ul>
-                </nav>
-                <div class="d-flex mainMenu justify-content-center align-items-center">
-                    <div class="max-h iconSesion">
-                        <a href="salir.php" class="iconOff max-h pl-3 d-flex justify-content-start align-items-center"><i
-                                class="ing-salir"></i></a>
-                    </div>
-                    <div class="max-h">
-                        <div class="bg-primary rounded-circle pointer max-h max-w d-flex justify-content-center align-items-center"
-                            id="dismiss">
-                            <span class="text-white iconMenuSidebar ing-cancelar"></span>
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </div>
-        <div class="accordion px-2" id="accordionMenu">
-            <p class="mb-0 mt-3 ml-4 pl-1">
-                <a class="d-block side-menu" href="main.php">
-                    <span class="ing-home"></span> Menú
-                </a>
-            </p>
-
-            <?php
-            if ($user->admin) { ?>
-                <p class="mb-0 mt-3 ml-4 pl-1">
-                    <a href="permisos.php" class="d-block side-menu">
-                        <span class="ing-pass"></span> Permisos
-                    </a>
-                </p>
-            <?php }
-            $cont = 0;
-            foreach ($grupos as $grupo) {
-                ?>
-                <p class="mb-0 mt-3">
-                    <a class="d-block side-menu collapsed" data-toggle="collapse" href="#menu_<?= $cont ?>" role="button"
-                        aria-expanded="false">
-                        <i class="ing-caret ing-fw mr-2"></i>
-                        <span class="<?= $grupo['grupo_icon'] ?>"></span>
-                        <?= ucfirst($grupo['grupo_nombre']) ?>
-                    </a>
-                </p>
-                <div id="menu_<?= $cont ?>" class="collapse" data-parent="#accordionMenu" style>
-                    <ul class="fa-ul">
-                        <?php
-                        foreach ($paginas as $pagina) {
-                            #print_r($paginas);
-                            $page = ucfirst(str_replace('_', ' ', $pagina['pagina_ruta']));
-                            $user->access($pagina['pagina_ruta'] ?? '');
-                            if ($grupo['grupo_id'] == $pagina['grupo_id']) {
-                                if ($user->admin || $user->acceso != 'n') {
-                                    ?>
-                                    <li class="mt-1">
-                                        <a href="<?= $pagina['pagina_ruta'] ?>.php">
-                                            <?= $page ?>
-                                        </a>
-                                    </li>
-                                <?php }
-                            }
-                        }
-                        ?>
-                    </ul>
-                </div>
-                <?php $cont++;
-            }
-            ?>
-        </div>
-    </aside>
-    <div class="overlay"></div>
-    <header class="sticky-top bg-white">
-        <div class="container marco menu d-flex align-items-center">
-            <div class="logotipo">
-                <a href="https://lasalle.mx/" target="_blank">
-                    <img src="imagenes/logo_lasalle.png">
-                </a>
-            </div>
-            <div class="flex-grow-1 d-flex justify-content-end">
-                <nav class="navbar navbar-expand-lg d-flex">
-                    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav"
-                        aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
-                        <span class="navbar-toggler-icon"></span>
-                    </button>
-                    <div class="collapse navbar-collapse" id="navbarNav">
-                        <ul class="navbar-nav">
-                            <!-- Add your navigation items here -->
-                        </ul>
-                    </div>
-                </nav>
-                <div class="d-flex mainMenu justify-content-center align-items-center">
-                    <div class="max-h iconSesion">
-                        <a href="salir.php" class="iconOff max-h pl-3 d-flex justify-content-start align-items-center">
-                            <i class="ing-salir"></i>
-                        </a>
-                    </div>
-                    <div class="max-h">
-                        <span id="sidebarCollapse" style="font-size: 44px;"
-                            class="ing-menu bg-white rounded-circle pointer max-w d-flex justify-content-center align-items-center"></span>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </header>
-
-    <div class="row bg-info mx-0 barra-gris d-flex flex-column">
-        <?php
-        if ($header != null) {
-            ?>
-            <div class="marco">
-                <div class="col-sm-12">
-                    <h2 class="text-muted">
-                        <?= $header; ?>
-                </div>
-            </div>
-        <?php } ?>
-        <div class="marco">
-            <div class="col-sm-12 py-3">
-                <h2 class="text-uppercase">
-                    <?= $title; ?>
-                </h2>
-            </div>
-        </div>
-    </div>
-<?php }
-?>
+<script defer src="js/sidebarmenu.js"></script>
+
+
+<?php
+require_once 'class/c_login.php';
+$ruta = "../";
+require_once 'include/bd_pdo.php';
+
+if (!isset($_SESSION['user'])) {
+    if (isset($redirect))
+        $_SESSION['ruta'] = $redirect;
+
+    header('Location: index.php');
+}
+
+$user = unserialize($_SESSION['user']);
+if ($user->admin):
+    ?><!-- <pre><? var_dump($user) ?></pre> -->
+<?
+endif;
+$grupos = $user->admin ? queryAll("SELECT * FROM GRUPO ORDER BY grupo_nombre") : $db->query("SELECT * FROM GRUPO WHERE grupo_id IN (SELECT grupo_id FROM PERMISO_VIEW WHERE id = :id) ORDER BY grupo_nombre", array(":id" => $user->user['id']));
+
+function html_header($title, $header = null)
+{
+    global $grupos, $user, $db;
+    ?>
+    <aside id="sidebar" class="bg-light defaultShadow d-flex flex-column p-4">
+        <div class="d-flex align-items-center mb-5">
+            <div class="logotipo"><a href="https://lasalle.mx/" target="_blank"><img src="imagenes/logo_lasalle.png"></a>
+            </div>
+            <div class="flex-grow-1 d-flex justify-content-end">
+                <nav class="navbar navbar-expand d-none d-flex">
+                    <ul class="navbar-nav">
+
+                    </ul>
+                </nav>
+                <div class="d-flex mainMenu justify-content-center align-items-center">
+                    <div class="max-h iconSesion">
+                        <a href="salir.php" class="iconOff max-h pl-3 d-flex justify-content-start align-items-center"><i
+                                class="ing-salir"></i></a>
+                    </div>
+                    <div class="max-h">
+                        <div class="bg-primary rounded-circle pointer max-h max-w d-flex justify-content-center align-items-center"
+                            id="dismiss">
+                            <span class="text-white iconMenuSidebar ing-cancelar"></span>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="accordion px-2" id="accordionMenu">
+            <p class="mb-0 mt-3 ml-4 pl-1">
+                <a class="d-block side-menu" href="main.php">
+                    <span class="ing-home"></span> Menú
+                </a>
+            </p>
+
+            <?php
+            if ($user->admin) { ?>
+                <p class="mb-0 mt-3 ml-4 pl-1">
+                    <a href="permisos.php" class="d-block side-menu">
+                        <span class="ing-pass"></span> Permisos
+                    </a>
+                </p>
+            <?php }
+            foreach ($grupos as $key => $grupo) {
+                ?>
+                <p class="mb-0 mt-3">
+                    <a class="d-block side-menu collapsed" data-toggle="collapse" href="#menu_<?= $key ?>" role="button"
+                        aria-expanded="false">
+                        <i class="ing-caret ing-fw mr-2"></i>
+                        <span class="<?= $grupo['grupo_icon'] ?>"></span>
+                        <?= ucfirst($grupo['grupo_nombre']) ?>
+                    </a>
+                </p>
+                <div id="menu_<?= $key ?>" class="collapse" data-parent="#accordionMenu" style>
+                    <ul class="fa-ul">
+                        <?
+                        foreach ($user->admin ? $db->query("SELECT * FROM PAGINA WHERE grupo_id = :grupo_id ORDER BY pagina_titulo", array(":grupo_id" => $grupo['grupo_id'])) : $db->query("SELECT * FROM PAGINA WHERE grupo_id = :grupo_id and pagina_id IN (SELECT pagina_id FROM PERMISO_VIEW WHERE id = :id) ORDER BY pagina_titulo", array(":grupo_id" => $grupo['grupo_id'], ":id" => $user->user['id']))
+                            as $pagina):
+                            ?>
+                            <li class="mt-1">
+                                <a href="<?= $pagina['pagina_ruta'] ?>.php">
+                                    <?= $pagina['pagina_titulo'] ?>
+                                </a>
+                            </li>
+                        <? endforeach; ?>
+                    </ul>
+                </div>
+                <?php
+            }
+            ?>
+        </div>
+    </aside>
+    <div class="overlay"></div>
+    <header class="sticky-top bg-white">
+        <div class="container marco menu d-flex align-items-center">
+            <div class="logotipo">
+                <a href="https://lasalle.mx/" target="_blank">
+                    <img src="imagenes/logo_lasalle.png">
+                </a>
+            </div>
+            <div class="flex-grow-1 d-flex justify-content-end">
+                <nav class="navbar navbar-expand-lg d-flex">
+                    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav"
+                        aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
+                        <span class="navbar-toggler-icon"></span>
+                    </button>
+                    <div class="collapse navbar-collapse" id="navbarNav">
+                        <ul class="navbar-nav">
+                            <!-- Add your navigation items here -->
+                        </ul>
+                    </div>
+                </nav>
+                <div class="d-flex mainMenu justify-content-center align-items-center">
+                    <div class="max-h iconSesion">
+                        <a href="salir.php" class="iconOff max-h pl-3 d-flex justify-content-start align-items-center">
+                            <i class="ing-salir"></i>
+                        </a>
+                    </div>
+                    <div class="max-h">
+                        <span id="sidebarCollapse" style="font-size: 44px;"
+                            class="ing-menu bg-white rounded-circle pointer max-w d-flex justify-content-center align-items-center"></span>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </header>
+
+    <div class="row bg-info mx-0 barra-gris d-flex flex-column">
+        <?php
+        if ($header != null) {
+            ?>
+            <div class="marco">
+                <div class="col-sm-12">
+                    <h2 class="text-muted">
+                        <?= $header; ?>
+                </div>
+            </div>
+        <?php } ?>
+        <div class="marco">
+            <div class="col-sm-12 py-3">
+                <h2 class="text-uppercase">
+                    <?= $title; ?>
+                </h2>
+            </div>
+        </div>
+    </div>
+<? } ?>

+ 31 - 32
import/html_header_index.php

@@ -1,32 +1,31 @@
-<?php
-require "include/constantes.php";
-function html_header($title, $header = null, $links = [])
-{
-?>
-    <nav class="navbar sticky-top navbar-light bg-white">
-        <header class="container-fluid">
-            <div class="menu">
-                <a class="navbar-brand" href="/"><img id="logo" src="imagenes/logo_lasalle.png" border="0" class="img-fluid" /></a>
-
-            </div>
-        </header>
-    </nav>
-    <!-- Barra azul -->
-    <div class="row bg-info mx-0 barra-gris">
-        <?php
-        if ($header != null) {
-        ?>
-            <div class="marco">
-                <div class="col-sm-12">
-                    <h2 class="text-muted"><?= $header; ?>
-                </div>
-            </div>
-        <?php } ?>
-        <div class="marco">
-            <div class="col-sm-12 py-3">
-                <h2 class="text-uppercase"><?= $title; ?></h2>
-            </div>
-        </div>
-    </div>
-<?php
-}
+<?php
+require "include/constantes.php";
+function html_header($title, $header = null, $links = [])
+{
+?>
+    <nav class="navbar sticky-top navbar-light bg-white">
+        <header class="container-fluid">
+            <div class="menu">
+                <a class="navbar-brand" href="/"><img id="logo" src="imagenes/logo_lasalle.png" class="img-fluid" /></a>
+            </div>
+        </header>
+    </nav>
+    <!-- Barra azul -->
+    <div class="row bg-info mx-0 barra-gris">
+        <?php
+        if ($header != null) {
+        ?>
+            <div class="marco">
+                <div class="col-sm-12">
+                    <h2 class="text-muted"><?= $header; ?>
+                </div>
+            </div>
+        <?php } ?>
+        <div class="marco">
+            <div class="col-sm-12 py-3">
+                <h2 class="text-uppercase"><?= $title; ?></h2>
+            </div>
+        </div>
+    </div>
+<?php
+}

+ 46 - 46
import/html_navtoggle.php

@@ -1,47 +1,47 @@
-<?php
-# Componente, desplegable para la barra de navegación con los contenidos del menú (i.e. módulos con sus páginas)
-
-require_once 'class/c_login.php';
-
-if (!isset($_SESSION['user'])) {
-    header('Location: index.php');
-exit;
-}
-else
-    $user = $_SESSION['user'];
-
-$pages = query('SELECT * FROM FS_MODULOS', single: false);
-$modules = query('SELECT DISTINCT id, titulo FROM FS_MODULOS', single: false);
-
-?>
-
-<!-- Cuando se le hace click al hamburguer button se despliega un menú en la derecha -->
-
-
-<div class="collapse navbar-collapse" id="navbarNav">
-    <ul class="navbar-nav">
-        <?php
-        foreach ($modules as $module) {
-        ?>
-            <li class="nav-item dropdown">
-                <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
-                    <?php echo ucfirst($module['titulo']); ?>
-                </a>
-                <div class="dropdown-menu" aria-labelledby="navbarDropdown">
-                    <?php
-                    foreach ($pages as $page)
-                        if ($page['id'] == $module['id']) {
-                    ?>
-                        <a class="dropdown-item" href="<?php echo $page['ruta'] . ".php"; ?>">
-                            <?php echo ucfirst(str_replace('_', ' ', $page['ruta'])); ?>
-                        </a>
-                    <?php
-                        }
-                    ?>
-                </div>
-            </li>
-        <?php
-        }
-        ?>
-    </ul>
+<?php
+# Componente, desplegable para la barra de navegación con los contenidos del menú (i.e. módulos con sus páginas)
+
+require_once 'class/c_login.php';
+
+if (!isset($_SESSION['user'])) {
+    header('Location: index.php');
+exit;
+}
+else
+    $user = $_SESSION['user'];
+
+$pages = query('SELECT * FROM FS_MODULOS', single: false);
+$modules = query('SELECT DISTINCT id, titulo FROM FS_MODULOS', single: false);
+
+?>
+
+<!-- Cuando se le hace click al hamburguer button se despliega un menú en la derecha -->
+
+
+<div class="collapse navbar-collapse" id="navbarNav">
+    <ul class="navbar-nav">
+        <?php
+        foreach ($modules as $module) {
+        ?>
+            <li class="nav-item dropdown">
+                <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                    <?php echo ucfirst($module['titulo']); ?>
+                </a>
+                <div class="dropdown-menu" aria-labelledby="navbarDropdown">
+                    <?php
+                    foreach ($pages as $page)
+                        if ($page['id'] == $module['id']) {
+                    ?>
+                        <a class="dropdown-item" href="<?php echo $page['ruta'] . ".php"; ?>">
+                            <?php echo ucfirst(str_replace('_', ' ', $page['ruta'])); ?>
+                        </a>
+                    <?php
+                        }
+                    ?>
+                </div>
+            </li>
+        <?php
+        }
+        ?>
+    </ul>
 </div>

+ 41 - 41
import/html_scroll.php

@@ -1,42 +1,42 @@
-<?php
-include_once "include/constantes.php";
-?>
-
-<a href="#top" id="scroll-up" class="btn btn-primary btn-sm" role="button" aria-pressed="true" style="display: none; position: fixed; bottom: 3rem; right: 1rem;">
-    <?= $ICO['arriba'] ?>
-</a>
-<!-- Scroll down -->
-<a href="#bottom" id="scroll-down" class="btn btn-primary btn-sm" role="button" aria-pressed="true" style="display: none; position: fixed; bottom: 1rem; right: 1rem;">
-    <?= $ICO['abajo'] ?>
-</a>
-
-<script>
-    $(document).ready(function() {
-        $(window).scroll(function() {
-            if ($(this).scrollTop() > 100) {
-                $('#scroll-up').fadeIn();
-            } else {
-                $('#scroll-up').fadeOut();
-            }
-
-            if ($(this).scrollTop() < $(document).height() - $(window).height() - 100) {
-                $('#scroll-down').fadeIn();
-            } else {
-                $('#scroll-down').fadeOut();
-            }
-        });
-        $('#scroll-up').click(function() {
-            $("html, body").animate({
-                scrollTop: 0
-            }, 600);
-            return false;
-        });
-
-        $('#scroll-down').click(function() {
-            $("html, body").animate({
-                scrollTop: $(document).height()
-            }, 600);
-            return false;
-        });
-    });
+<?php
+include_once "include/constantes.php";
+?>
+
+<a href="#top" id="scroll-up" class="btn btn-primary btn-sm" role="button" aria-pressed="true" style="display: none; position: fixed; bottom: 3rem; right: 1rem;">
+    <?= $ICO['arriba'] ?>
+</a>
+<!-- Scroll down -->
+<a href="#bottom" id="scroll-down" class="btn btn-primary btn-sm" role="button" aria-pressed="true" style="display: none; position: fixed; bottom: 1rem; right: 1rem;">
+    <?= $ICO['abajo'] ?>
+</a>
+
+<script>
+    $(document).ready(function() {
+        $(window).scroll(function() {
+            if ($(this).scrollTop() > 100) {
+                $('#scroll-up').fadeIn();
+            } else {
+                $('#scroll-up').fadeOut();
+            }
+
+            if ($(this).scrollTop() < $(document).height() - $(window).height() - 100) {
+                $('#scroll-down').fadeIn();
+            } else {
+                $('#scroll-down').fadeOut();
+            }
+        });
+        $('#scroll-up').click(function() {
+            $("html, body").animate({
+                scrollTop: 0
+            }, 600);
+            return false;
+        });
+
+        $('#scroll-down').click(function() {
+            $("html, body").animate({
+                scrollTop: $(document).height()
+            }, 600);
+            return false;
+        });
+    });
 </script>

+ 64 - 63
import/periodo.php

@@ -1,64 +1,65 @@
-<script src="js/jquery.min.js"></script>
-
-<form action="action/action_periodousuario_update.php" method="post" id="formaPeriodo">
-    <div class="row">
-        <div class="col-12">
-            <?php
-            $target = $target ?? strtok($_SERVER["REQUEST_URI"], '?');
-            $niveles = array_map(
-                fn($nivel) => array_merge(
-                    $nivel,
-                    ['periodos' => $db->where('nivel_id', $nivel['nivel_id'])->get('periodo_view')]
-                ), $db->get("nivel")
-            );
-
-            // collect facultad_id's with facultad from $periodos
-            ?>
-            <input type="hidden" name="target" value="<?= $target ?>">
-            <div class="form-box">
-                <div class="form-group row">
-                    <label for="periodo" class="col-4 col-form-label">Cambiar de periodo</label>
-                    <div class="col-6">
-                        <div id="dlPeriodo" class="datalist datalist-select mb-1 w-100">
-                            <div class="datalist-input">Selecciona un periodo</div>
-                            <span class="ing-buscar icono"></span>
-                            <ul style="display:none">
-                                <?php
-                                foreach ($niveles as $nivel) {
-                                    ?>
-                                    <li data-id="<?= $nivel['nivel_id'] ?>" class="not-selectable disable">
-                                        <?= $nivel['nivel_nombre'] ?>
-                                    </li>
-                                    <?
-                                    $periodos_rs = $db->query(
-                                        'SELECT * FROM fs_periodo(NULL, :nivel,	4)',
-                                        [':nivel' => $nivel['nivel_id']]
-                                    );
-                                    foreach ($periodos_rs as $per) {
-                                        ?>
-                                        <li data-id="<?= $per['periodo_id'] ?>" <?php if ($user->periodo == $per["periodo_id"]) {
-                                              echo 'class="selected"';
-                                          } ?>>
-                                            <?= $per['periodo_nombre'] ?>
-                                        </li>
-                                    <?php } ?>
-                                <?php } ?>
-                            </ul>
-                            <input type="hidden" id="periodo" name="id" value="">
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </div>
-</form>
-
-<script src="./js/datalist.js"></script>
-<script>
-    setDatalist('#periodo', <?php echo $user->periodo; ?>)
-    makeRequiredDatalist("#periodo", true);
-
-    $(document).on('click', '#dlPeriodo ul li', function () {
-        $('#formaPeriodo').submit();
-    });
+<script src="js/jquery.min.js"></script>
+
+<form action="action/action_periodousuario_update.php" method="post" id="formaPeriodo">
+    <div class="row">
+        <div class="col-12">
+            <?php
+            $target = $target ?? strtok($_SERVER["REQUEST_URI"], '?');
+            $niveles = array_map(
+                fn($nivel) => array_merge(
+                    $nivel,
+                    ['periodos' => $db->where('nivel_id', $nivel['nivel_id'])->get('periodo_view')]
+                ), $db->get("nivel")
+            );
+
+            // collect facultad_id's with facultad from $periodos
+            ?>
+            <input type="hidden" name="target" value="<?= $target ?>">
+            <div class="form-box">
+                <div class="form-group row">
+                    <label for="periodo" class="col-4 col-form-label">Cambiar de periodo</label>
+                    <div class="col-6">
+                        <div id="dlPeriodo" class="datalist datalist-select mb-1 w-100">
+                            <div class="datalist-input">Selecciona un periodo</div>
+                            <span class="ing-buscar icono"></span>
+                            <ul style="display:none">
+                                <?php
+                                foreach ($niveles as $nivel) {
+                                    ?>
+                                    <li data-id="<?= $nivel['nivel_id'] ?>" class="not-selectable disable">
+                                        <?= $nivel['nivel_nombre'] ?>
+                                    </li>
+                                    <?
+                                    $periodos_rs = $db->query(
+                                        'SELECT * FROM fs_periodo(NULL, :nivel,	4)',
+                                        [':nivel' => $nivel['nivel_id']]
+                                    );
+                                    array_walk($periodos_rs, function ($per) {
+                                        global $user;
+                                        ?>
+                                        <li data-id="<?= $per['periodo_id'] ?>" <?php if ($user->periodo == $per["periodo_id"]) {
+                                              echo 'class="selected"';
+                                          } ?>>
+                                            <?= $per['periodo_nombre'] ?>
+                                        </li>
+                                    <?php }); ?>
+                                <?php } ?>
+                            </ul>
+                            <input type="hidden" id="periodo" name="id" value="">
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</form>
+
+<script src="./js/datalist.js"></script>
+<script defer>
+    setDatalist('#periodo', <?php echo $user->periodo; ?>)
+    makeRequiredDatalist("#periodo", true);
+
+    $(document).on('click', '#dlPeriodo ul li:not(.not-selectable)', function () {
+        $('#formaPeriodo').submit();
+    });
 </script>

+ 63 - 63
include/bd_pdo.php

@@ -1,63 +1,63 @@
-<?php
-require_once ($ruta ?? "./") . "vendor/autoload.php";
-$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
-$dotenv->load();
-use \SeinopSys\PostgresDb;
-
-# Connect to the database
-try {
-    // Postgres
-    $pdo = new PDO("pgsql:host=" . $_ENV['DB_HOST'] . ";dbname=" . $_ENV['DB_NAME'], $_ENV['DB_USER'], $_ENV['DB_PASS']);
-    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
-
-    $db = new PostgresDb();
-    $db->setConnection($pdo);
-} catch (PDOException $e) {
-    echo "Error: " . $e->getMessage();
-}
-
-// check recursivelly if the array has only empty strings
-function is_response_empty($array)
-{
-    foreach ($array as $value) {
-        if (is_array($value)) {
-            if (!is_response_empty($value)) {
-                return false;
-            }
-        } else {
-            if (!empty($value)) {
-                return false;
-            }
-        }
-    }
-    return true;
-}
-
-// SQL function
-function query(string $sql, array $params = null, bool $single = true)
-{
-    global $pdo;
-    try {
-        $stmt = $pdo->prepare($sql);
-        $stmt->execute($params);
-        $response = $single ?  $stmt->fetch(PDO::FETCH_ASSOC) : $stmt->fetchAll(PDO::FETCH_ASSOC);
-
-        return $response;
-    } catch (PDOException $e) {
-        echo "Error: " . $e->getMessage();
-        return false;
-    } finally {
-        $stmt->closeCursor();
-        $stmt = null;
-    }
-}
-
-function queryAll(string $sql, array $params = null)
-{
-    return query($sql, $params, false);
-}
-
-function toSQLArray(array $array): string
-{
-    return sprintf("{%s}", implode(", ", $array));
-}
+<?php
+require_once ($ruta ?? "./") . "vendor/autoload.php";
+$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
+$dotenv->load();
+use \SeinopSys\PostgresDb;
+
+# Connect to the database
+try {
+    // Postgres
+    $pdo = new PDO("pgsql:host=" . $_ENV['DB_HOST'] . ";dbname=" . $_ENV['DB_NAME'], $_ENV['DB_USER'], $_ENV['DB_PASS']);
+    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+
+    $db = new PostgresDb();
+    $db->setConnection($pdo);
+} catch (PDOException $e) {
+    echo "Error: " . $e->getMessage();
+}
+
+// check recursivelly if the array has only empty strings
+function is_response_empty($array)
+{
+    foreach ($array as $value) {
+        if (is_array($value)) {
+            if (!is_response_empty($value)) {
+                return false;
+            }
+        } else {
+            if (!empty($value)) {
+                return false;
+            }
+        }
+    }
+    return true;
+}
+
+// SQL function
+function query(string $sql, array $params = null, bool $single = true)
+{
+    global $pdo;
+    try {
+        $stmt = $pdo->prepare($sql);
+        $stmt->execute($params);
+        $response = $single ?  $stmt->fetch(PDO::FETCH_ASSOC) : $stmt->fetchAll(PDO::FETCH_ASSOC);
+
+        return $response;
+    } catch (PDOException $e) {
+        echo "Error: " . $e->getMessage();
+        return false;
+    } finally {
+        $stmt->closeCursor();
+        $stmt = null;
+    }
+}
+
+function queryAll(string $sql, array $params = null)
+{
+    return query($sql, $params, false);
+}
+
+function toSQLArray(array $array): string
+{
+    return sprintf("{%s}", implode(", ", $array));
+}

+ 165 - 165
include/func_excel.php

@@ -1,165 +1,165 @@
-<?php
-
-
-require_once "../vendor/autoload.php";
-require_once "../include/bd_pdo.php";
-
-$columnas = array(
-    "SALÓN",
-    "GRUPO",
-    "CLAVE",
-    "DOCENTE",
-    "MATERIA",
-    "LUNES",
-    "MARTES",
-    "MIÉRCOLES",
-    "JUEVES",
-    "VIERNES",
-    "SÁBADO",
-    "DURACIÓN",
-);
-
-$cl = ['salon', 'grupo', 'clave', 'maestro', 'materia',];
-
-define('HORARIO', 5);
-define('COLUMNA_MAXIMA', chr(count($columnas) + ord('A') - 1));
-function columna_nombre(string $columna): array
-{
-    $nombre = "";
-    $datos_nombre = explode(" ", str_replace(array("\n", chr(10), chr(13)), " ", trim(preg_replace('/_x([0-9a-fA-F]{4})_/', ' ', $columna))));
-    $temp_nombre = explode(".", $datos_nombre[0]);
-    if (count($temp_nombre) > 1) {
-        $nombre .= $temp_nombre[1] . " ";
-        $grado = $temp_nombre[0] . ".";
-        array_shift($datos_nombre);
-    } else
-        $grado = strpos($datos_nombre[0], ".") !== false ? array_shift($datos_nombre) : null;
-
-    $email = strpos($columna, "@") !== false ? array_pop($datos_nombre) : null;
-    $nombre .= implode(" ", $datos_nombre);
-
-    return array(
-        "grado" => $grado,
-        "nombre" => trim($nombre),
-        "correo" => $email,
-    );
-}
-###
-function validar_columnas(object $sheet): void
-{
-    global $columnas;
-    $diff = array_diff(array_map(fn ($col) => trim($col), get_columns($sheet)), $columnas);
-    #array clean
-    if (!empty($diff)) {
-        $diff = array_filter($diff, fn ($col) => !empty($col));
-        throw new Exception("Error en el formato del archivo: " . (empty($diff) ? "Columnas vacías" : "Columnas incorrectas: [" . implode(", ", $diff) . "]"));
-    }
-}
-###
-function get_columns(object $sheet)
-{
-    global $columnas;
-    $columns = array();
-    foreach ($sheet->getRowIterator(1, 1) as  $row)
-        foreach ($row->getCellIterator() as $index => $cell) {
-            $columns[$index] = mb_strtoupper($cell->getValue() ?? "");
-            if ($index == COLUMNA_MAXIMA) break;
-        }
-    return $columns;
-}
-###
-function foreach_sheet(object $workbook, callable $callback = null): void
-{
-
-    $sheets = $workbook->getSheetNames();
-    // validate columns
-    foreach ($sheets as $sheet) {
-        $worksheet = $workbook->getSheetByName($sheet);
-        validar_columnas($worksheet);
-        foreach_register($worksheet, $callback, $sheet);
-    }
-}
-###
-function foreach_register(object $worksheet, callable $callback = null, string $sheet): void
-{
-    foreach ($worksheet->getRowIterator(2) as $key => $row) {
-        $row_data = array();
-        foreach ($row->getCellIterator() as $index => $cell) {
-            $row_data[] = str_replace(' ', '', $cell->getValue() ?? "");
-            if ($index == COLUMNA_MAXIMA) break;
-        }
-
-        if ($callback !== null) {
-            $callback($row_data, $key, $sheet);
-        }
-    }
-}
-
-function horario(array &$row, int $fila, string $sheet): string
-{
-    global $cl, $db;
-    date_default_timezone_set('UTC');
-    $horario_tostring = "";
-    for ($i = HORARIO; $i < count($row) - 1; $i++) {
-        // echo $row[$i] . "  $i\n";
-        if (!empty(trim($row[$i] ?? ""))) {
-            $row[$i] = str_replace(array(" -", "- ", " - "), "-", $row[$i]);
-            $separar_por_espacios = EXPLODE(" ", trim(preg_replace('!\s+!', ' ', $row[$i])));
-            foreach ($separar_por_espacios as $horario) {
-                $hora = // if string includes : then is string else is excel date
-                    (strpos($horario, ":") === false)
-                    ?   \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($horario)->format('H:i')
-                    :   preg_replace('/[^0-9:]/', '', str_replace('.', ':', trim((strpos($horario, "-") !== false) ? explode("-", $horario)[0] : $horario)));
-
-                if (
-                    $hora > "22:00" || $hora < "07:00" || explode(":", $hora)[1]  % 15 !== 0
-                ) {
-                    throw new Exception("Error en el formato del archivo: Hora incorrecta [$hora] en la fila $fila, hoja $sheet.");
-                }
-
-                $duración = end($row);
-                if ($duración <= 180 and $duración >= 30 and $duración % 15 == 0)
-                    $bloques = $duración / 15;
-                else if ($duración <= 3 and $duración >= 0.5)
-                    $bloques = $duración * 60 / 15;
-                else
-                    throw new Exception("Error en el formato del archivo: Duración [$duración] incorrecta en la fila $fila, hoja $sheet.");
-                
-                $duraciónID = $db->where("duracion_bloques", $bloques)->get("duracion", 1, "duracion_id")[0]["duracion_id"];
-                $horario_tostring .= ($i - 4) . ",$hora,$duraciónID;";
-            }
-        }
-    }
-
-    $row = array_combine($cl, array_intersect_key($row, array_keys($cl)));
-    $horario_tostring = substr($horario_tostring, 0, -1);
-    if (empty($horario_tostring))
-        throw new Exception("Error en el formato del archivo: No se encontró horario en la fila $fila, hoja $sheet.");
-
-    return $horario_tostring;
-}
-
-function validar_registro(array $row, int $fila): void
-{
-    $tiene_horario = false;
-    for ($i = 0; $i < HORARIO - 1; $i++)
-        if (empty(trim($row[$i])))
-            throw new Exception("Error faltan datos en la fila $fila de la hoja");
-
-    for ($i = HORARIO; $i < COLUMNA_MAXIMA; $i++)
-        if ($tiene_horario = !empty($row[$i]))
-            break;
-
-    if (!$tiene_horario)
-        throw new Exception("Error en el formato del archivo: No se encontró horario en la fila $fila.");
-}
-
-
-function renglón_vacío(array $row)
-{
-    foreach ($row as $columna)
-        if (!empty($columna))
-            return false;
-
-    return true;
-}
+<?php
+
+
+require_once "../vendor/autoload.php";
+require_once "../include/bd_pdo.php";
+
+$columnas = array(
+    "SALÓN",
+    "GRUPO",
+    "CLAVE",
+    "DOCENTE",
+    "MATERIA",
+    "LUNES",
+    "MARTES",
+    "MIÉRCOLES",
+    "JUEVES",
+    "VIERNES",
+    "SÁBADO",
+    "DURACIÓN",
+);
+
+$cl = ['salon', 'grupo', 'clave', 'maestro', 'materia',];
+
+define('HORARIO', 5);
+define('COLUMNA_MAXIMA', chr(count($columnas) + ord('A') - 1));
+function columna_nombre(string $columna): array
+{
+    $nombre = "";
+    $datos_nombre = explode(" ", str_replace(array("\n", chr(10), chr(13)), " ", trim(preg_replace('/_x([0-9a-fA-F]{4})_/', ' ', $columna))));
+    $temp_nombre = explode(".", $datos_nombre[0]);
+    if (count($temp_nombre) > 1) {
+        $nombre .= $temp_nombre[1] . " ";
+        $grado = $temp_nombre[0] . ".";
+        array_shift($datos_nombre);
+    } else
+        $grado = strpos($datos_nombre[0], ".") !== false ? array_shift($datos_nombre) : null;
+
+    $email = strpos($columna, "@") !== false ? array_pop($datos_nombre) : null;
+    $nombre .= implode(" ", $datos_nombre);
+
+    return array(
+        "grado" => $grado,
+        "nombre" => trim($nombre),
+        "correo" => $email,
+    );
+}
+###
+function validar_columnas(object $sheet): void
+{
+    global $columnas;
+    $diff = array_diff(array_map(fn ($col) => trim($col), get_columns($sheet)), $columnas);
+    #array clean
+    if (!empty($diff)) {
+        $diff = array_filter($diff, fn ($col) => !empty($col));
+        throw new Exception("Error en el formato del archivo: " . (empty($diff) ? "Columnas vacías" : "Columnas incorrectas: [" . implode(", ", $diff) . "]"));
+    }
+}
+###
+function get_columns(object $sheet)
+{
+    global $columnas;
+    $columns = array();
+    foreach ($sheet->getRowIterator(1, 1) as  $row)
+        foreach ($row->getCellIterator() as $index => $cell) {
+            $columns[$index] = mb_strtoupper($cell->getValue() ?? "");
+            if ($index == COLUMNA_MAXIMA) break;
+        }
+    return $columns;
+}
+###
+function foreach_sheet(object $workbook, callable $callback = null): void
+{
+
+    $sheets = $workbook->getSheetNames();
+    // validate columns
+    foreach ($sheets as $sheet) {
+        $worksheet = $workbook->getSheetByName($sheet);
+        validar_columnas($worksheet);
+        foreach_register($worksheet, $callback, $sheet);
+    }
+}
+###
+function foreach_register(object $worksheet, callable $callback = null, string $sheet): void
+{
+    foreach ($worksheet->getRowIterator(2) as $key => $row) {
+        $row_data = array();
+        foreach ($row->getCellIterator() as $index => $cell) {
+            $row_data[] = str_replace(' ', '', $cell->getValue() ?? "");
+            if ($index == COLUMNA_MAXIMA) break;
+        }
+
+        if ($callback !== null) {
+            $callback($row_data, $key, $sheet);
+        }
+    }
+}
+
+function horario(array &$row, int $fila, string $sheet): string
+{
+    global $cl, $db;
+    date_default_timezone_set('UTC');
+    $horario_tostring = "";
+    for ($i = HORARIO; $i < count($row) - 1; $i++) {
+        // echo $row[$i] . "  $i\n";
+        if (!empty(trim($row[$i] ?? ""))) {
+            $row[$i] = str_replace(array(" -", "- ", " - "), "-", $row[$i]);
+            $separar_por_espacios = EXPLODE(" ", trim(preg_replace('!\s+!', ' ', $row[$i])));
+            foreach ($separar_por_espacios as $horario) {
+                $hora = // if string includes : then is string else is excel date
+                    (strpos($horario, ":") === false)
+                    ?   \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($horario)->format('H:i')
+                    :   preg_replace('/[^0-9:]/', '', str_replace('.', ':', trim((strpos($horario, "-") !== false) ? explode("-", $horario)[0] : $horario)));
+
+                if (
+                    $hora > "22:00" || $hora < "07:00" || explode(":", $hora)[1]  % 15 !== 0
+                ) {
+                    throw new Exception("Error en el formato del archivo: Hora incorrecta [$hora] en la fila $fila, hoja $sheet.");
+                }
+
+                $duración = end($row);
+                if ($duración <= 180 and $duración >= 30 and $duración % 15 == 0)
+                    $bloques = $duración / 15;
+                else if ($duración <= 3 and $duración >= 0.5)
+                    $bloques = $duración * 60 / 15;
+                else
+                    throw new Exception("Error en el formato del archivo: Duración [$duración] incorrecta en la fila $fila, hoja $sheet.");
+                
+                $duraciónID = $db->where("duracion_bloques", $bloques)->get("duracion", 1, "duracion_id")[0]["duracion_id"];
+                $horario_tostring .= ($i - 4) . ",$hora,$duraciónID;";
+            }
+        }
+    }
+
+    $row = array_combine($cl, array_intersect_key($row, array_keys($cl)));
+    $horario_tostring = substr($horario_tostring, 0, -1);
+    if (empty($horario_tostring))
+        throw new Exception("Error en el formato del archivo: No se encontró horario en la fila $fila, hoja $sheet.");
+
+    return $horario_tostring;
+}
+
+function validar_registro(array $row, int $fila): void
+{
+    $tiene_horario = false;
+    for ($i = 0; $i < HORARIO - 1; $i++)
+        if (empty(trim($row[$i])))
+            throw new Exception("Error faltan datos en la fila $fila de la hoja");
+
+    for ($i = HORARIO; $i < COLUMNA_MAXIMA; $i++)
+        if ($tiene_horario = !empty($row[$i]))
+            break;
+
+    if (!$tiene_horario)
+        throw new Exception("Error en el formato del archivo: No se encontró horario en la fila $fila.");
+}
+
+
+function renglón_vacío(array $row)
+{
+    foreach ($row as $columna)
+        if (!empty($columna))
+            return false;
+
+    return true;
+}

+ 10 - 10
include/func_string.php

@@ -1,10 +1,10 @@
-<?php
-namespace utils;
-function simpify_string(string $string): string
-{
-    $string = mb_strtolower($string);
-    
-    $string_without_accents = str_replace(array('á', 'é', 'í', 'ó', 'ú', 'ñ'), array('a', 'e', 'i', 'o', 'u', 'n'), $string);
-    $string_without_spaces = str_replace(' ', '', $string_without_accents);
-    return $string_without_spaces;
-}
+<?php
+namespace utils;
+function simpify_string(string $string): string
+{
+    $string = mb_strtolower($string);
+    
+    $string_without_accents = str_replace(array('á', 'é', 'í', 'ó', 'ú', 'ñ'), array('a', 'e', 'i', 'o', 'u', 'n'), $string);
+    $string_without_spaces = str_replace(' ', '', $string_without_accents);
+    return $string_without_spaces;
+}

BIN
include/lastbackup.tar


+ 13 - 13
include/nocache.php

@@ -1,14 +1,14 @@
-<?php
-/* 
- * Headers apra evitar caché de la página
- */
-//no index
-header("X-Robots-Tag: noindex, nofollow", true);
-//no caché
-header('Expires: Sun, 01 Jan 2014 00:00:00 GMT');
-header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
-header('Cache-Control: no-store, no-cache, must-revalidate');
-header('Cache-Control: post-check=0, pre-check=0', false);
-header('Pragma: no-cache');
-date_default_timezone_set('America/Mexico_City');
+<?php
+/* 
+ * Headers apra evitar caché de la página
+ */
+//no index
+header("X-Robots-Tag: noindex, nofollow", true);
+//no caché
+header('Expires: Sun, 01 Jan 2014 00:00:00 GMT');
+header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
+header('Cache-Control: no-store, no-cache, must-revalidate');
+header('Cache-Control: post-check=0, pre-check=0', false);
+header('Pragma: no-cache');
+date_default_timezone_set('America/Mexico_City');
 ?>

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است