From 7b1755c872432727b97ba4012576d4b5ca04e4f7 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 21 Feb 2025 12:33:30 -0600 Subject: [PATCH] =?UTF-8?q?Auditor=C3=ADa=20relevante?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- action/action_auditoria copy.php | 197 ------------------------------- action/action_auditoria.php | 77 +++++++++--- 2 files changed, 62 insertions(+), 212 deletions(-) delete mode 100644 action/action_auditoria copy.php diff --git a/action/action_auditoria copy.php b/action/action_auditoria copy.php deleted file mode 100644 index 0604d5d..0000000 --- a/action/action_auditoria copy.php +++ /dev/null @@ -1,197 +0,0 @@ - 'unauthorized'])); -} -$user = unserialize($_SESSION['user']); - -// check method -try { - if ($_SERVER['REQUEST_METHOD'] === 'GET') { - // pg_send_query($db->getConnection(), "REFRESH MATERIALIZED VIEW CONCURRENTLY PUBLIC.AUDITORIA_MAT"); - $baseDate = $_GET['fecha'] ?? $_GET['fecha_fin'] ?? null; - - $params = [ - // ':periodo_id' => $_GET['periodo_id'] > 0 ? $user->periodo_id : null, - - 'usuario_id' => $user->user['id'], - ]; - - $db->where('usuario_id', $user->user['id'])->delete('last_auditoria'); - - // Define relevant columns - $relevant_columns = [ - 'registro_id', - 'registro_fecha_ideal', - 'horario_id', - 'profesor_id', - 'salon', - 'profesor_clave', - 'profesor_nombre', - 'horario_hora', - 'horario_fin', - 'registro_fecha', - 'color', - 'estado_color', - 'estado_icon', - 'estado_supervisor_id', - 'facultad_id', - 'usuario_nombre', - 'registro_fecha_supervisor', - 'comentario', - 'registro_justificada', - 'justificacion', - 'reposicion_id' - ]; - - $relevant_columns_string = implode(', ', $relevant_columns); - - $_SESSION['fecha_inicio'] = $_GET['fecha'] ?? $_GET['fecha_inicio'] ?? date('Y-m-d'); - $_SESSION['fecha_fin'] = date('Y-m-d H:i:s', strtotime(($baseDate ?? 'now') . ' +24 hours')); - - $periodos = array_column($db->query('SELECT periodo_id FROM periodo WHERE (:fecha_inicio, :fecha_fin) OVERLAPS (periodo_fecha_inicio, periodo_fecha_fin)', [ - 'fecha_inicio' => $_SESSION['fecha_inicio'], - 'fecha_fin' => $_SESSION['fecha_fin'], - ]), 'periodo_id'); - - $daysArray = array_values(array_unique(array_map( - fn(DateTime $date) => (int) $date->format('w'), - iterator_to_array(new DatePeriod( - new DateTime($_SESSION['fecha_inicio']), - new DateInterval('P1D'), - (new DateTime($_SESSION['fecha_fin']))->modify('+1 day') - )) - ))); - $relevant_columns_string = implode(', ', $relevant_columns); - $days_array_string = implode(', ', $daysArray); - $periodos_string = implode(', ', $periodos); - - $data = $db->query( - "WITH horarios AS ( - SELECT horario.horario_id, - horario.facultad_id, - horario.horario_fecha_inicio, - horario.horario_fecha_fin, - horario.horario_grupo, - horario.horario_hora, - salon_view_mat.salon, - salon_view_mat.salon_array, - COALESCE(materia.materia_nombre, materia_asignacion.materia_asignacion_materia) AS materia, - COALESCE(carrera.carrera_nombre, materia_asignacion.materia_asignacion_carrera) AS carrera, - facultad_1.facultad_nombre AS facultad, - nivel.nivel_nombre AS nivel, - horario.horario_fin - FROM horario - LEFT JOIN materia USING (materia_id) - LEFT JOIN carrera USING (carrera_id) - LEFT JOIN materia_asignacion USING (horario_id) - JOIN facultad facultad_1 ON facultad_1.facultad_id = horario.facultad_id - JOIN nivel ON carrera.nivel_id = nivel.nivel_id - JOIN salon_view_mat USING (salon_id) - - WHERE - :fecha_inicio BETWEEN HORARIO_FECHA_INICIO AND COALESCE(HORARIO_FECHA_FIN, CURRENT_DATE) - AND HORARIO_DIA IN ($days_array_string) - AND PERIODO_ID IN ($periodos_string) - AND CARRERA.FACULTAD_ID = COALESCE(:facultad_id, CARRERA.FACULTAD_ID) - - ), fechas AS ( - SELECT fechas_clase(h.horario_id, false) AS registro_fecha_ideal, - h.horario_id - FROM horarios h - ) - SELECT usuario.usuario_id, - usuario.usuario_nombre, - registro.registro_id, - registro.registro_fecha, - registro.registro_retardo, - registro.registro_justificada, - registro.registro_fecha_supervisor, - registro.justificacion, - registro.comentario, - registro.registro_fecha_justificacion, - profesor.profesor_id, - profesor.profesor_nombre, - profesor.profesor_clave, - profesor.profesor_correo, - horarios.horario_id, - horarios.materia, - horarios.carrera, - horarios.facultad_id, - horarios.facultad, - horarios.nivel, - horarios.horario_hora, - horarios.horario_fin, - horarios.horario_grupo, - horarios.salon, - horarios.salon_array, - fechas.registro_fecha_ideal, - estado_supervisor.estado_supervisor_id, - estado_supervisor.nombre, - estado_supervisor.estado_color, - estado_supervisor.estado_icon, - justificador.usuario_nombre AS justificador_nombre, - justificador.usuario_clave AS justificador_clave, - facultad.facultad_nombre AS justificador_facultad, - rol.rol_titulo AS justificador_rol, - registro.reposicion_id, - reposicion.reposicion_fecha, - reposicion.reposicion_hora, - salon_reposicion.salon AS reposicion_salon, - salon_reposicion.salon_array AS reposicion_salon_array, - CASE - WHEN registro.registro_retardo THEN 'warning'::text - ELSE 'primary'::text - END AS color - FROM horarios - JOIN fechas USING (horario_id) - JOIN horario_profesor USING (horario_id) - JOIN profesor USING (profesor_id) - LEFT JOIN registro USING (horario_id, registro_fecha_ideal, profesor_id) - LEFT JOIN reposicion USING (reposicion_id) - LEFT JOIN salon_view_mat salon_reposicion ON salon_reposicion.salon_id = reposicion.salon_id - JOIN estado_supervisor ON estado_supervisor.estado_supervisor_id = COALESCE(registro.estado_supervisor_id, 0) - LEFT JOIN usuario ON usuario.usuario_id = registro.supervisor_id - LEFT JOIN usuario justificador ON justificador.usuario_id = registro.justificador_id - LEFT JOIN rol ON rol.rol_id = justificador.rol_id - LEFT JOIN facultad ON facultad.facultad_id = justificador.facultad_id - WHERE REGISTRO_FECHA_IDEAL + HORARIO_HORA between :fecha_inicio AND :fecha_fin - ORDER BY registro_fecha_ideal, horario_fin desc", - [ - ':facultad_id' => $user->facultad['facultad_id'], - ':fecha_inicio' => $_SESSION['fecha_inicio'], - ':fecha_fin' => $_SESSION['fecha_fin'], - ] - ); - - echo json_encode($data); - } 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 | JSON_UNESCAPED_SLASHES | JSON_PARTIAL_OUTPUT_ON_ERROR); - exit; -} catch (Exception $th) { - http_response_code(500); - echo json_encode([ - 'error' => $th->getMessage(), - ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); - exit; -} \ No newline at end of file diff --git a/action/action_auditoria.php b/action/action_auditoria.php index 6f9b91e..3d0fc5a 100644 --- a/action/action_auditoria.php +++ b/action/action_auditoria.php @@ -42,11 +42,10 @@ try { 'horario_hora', 'horario_fin', 'registro_fecha', - 'color', 'estado_color', 'estado_icon', - 'estado_supervisor_id', - 'facultad_id', + 'estado_supervisor.estado_supervisor_id', + 'horario.facultad_id', 'usuario_nombre', 'registro_fecha_supervisor', 'comentario', @@ -54,25 +53,73 @@ try { 'justificacion', 'reposicion_id' ]; - - $relevant_columns_string = implode(', ', $relevant_columns); + $RelevantColumns = implode(', ', $relevant_columns); $_SESSION['fecha_inicio'] = $_GET['fecha'] ?? $_GET['fecha_inicio'] ?? date('Y-m-d'); $_SESSION['fecha_fin'] = date('Y-m-d H:i:s', strtotime(($baseDate ?? 'now') . ' +24 hours')); - $data = $db->query( - "SELECT $relevant_columns_string FROM PUBLIC.AUDITORIA_MAT - WHERE FACULTAD_ID = COALESCE(:facultad_id, FACULTAD_ID) - AND REGISTRO_FECHA_IDEAL + HORARIO_HORA between :fecha_inicio AND :fecha_fin - ORDER BY registro_fecha_ideal, horario_hora DESC", - [ + $fechas = [ + 'fecha_inicio' => $_SESSION['fecha_inicio'], + 'fecha_fin' => $_SESSION['fecha_fin'], + ]; + + $PeriodosHorarios = implode(',', array_column( + $db->query( + 'SELECT periodo_id FROM periodo WHERE (:fecha_inicio, :fecha_fin) OVERLAPS (periodo_fecha_inicio, periodo_fecha_fin)', + $fechas + ), + 'periodo_id' + )); + + $DaysWeek = implode(',', array_values(array_unique(array_map( + fn(DateTime $date) => (int) $date->format('w'), + iterator_to_array(new DatePeriod( + new DateTime($_SESSION['fecha_inicio']), + new DateInterval('P1D'), + (new DateTime($_SESSION['fecha_fin']))->modify('+1 day') + )) + )))); + + $HorariosID = implode(',', array_column($db->query( + "SELECT horario_id FROM horario + WHERE horario_dia IN ($DaysWeek) + AND periodo_id IN ($PeriodosHorarios) + AND :fecha_inicio BETWEEN horario_fecha_inicio AND COALESCE(horario_fecha_fin, :fecha_fin) + AND facultad_id = COALESCE(:facultad_id, facultad_id)", + array_merge($fechas, [ ':facultad_id' => $user->facultad['facultad_id'], - ':fecha_inicio' => $_SESSION['fecha_inicio'], - ':fecha_fin' => $_SESSION['fecha_fin'], - ] + ]) + ), 'horario_id')); + + + $Horarios = $db->query( + "WITH fechas AS ( + SELECT fechas_clase( + _horario_id => h.horario_id, + _todos => false, + _fecha_inicio => :fecha_inicio, + _fecha_fin => :fecha_fin + ) AS registro_fecha_ideal, h.horario_id + FROM horario h WHERE horario_id IN ($HorariosID) + ) + SELECT + $RelevantColumns, + CASE + WHEN registro.registro_retardo THEN 'warning'::text + ELSE 'primary'::text + END AS color + FROM horario + NATURAL JOIN fechas + NATURAL JOIN horario_profesor + NATURAL JOIN profesor + NATURAL JOIN salon + LEFT JOIN REGISTRO USING (profesor_id, registro_fecha_ideal, horario_id) + LEFT JOIN usuario ON usuario.usuario_id = REGISTRO.supervisor_id + JOIN estado_supervisor ON estado_supervisor.estado_supervisor_id = COALESCE(REGISTRO.estado_supervisor_id, 0)", + $fechas ); - echo json_encode($data); + echo json_encode($Horarios); } else { http_response_code(405); echo json_encode(['error' => 'method not allowed']);