'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', 'estado_color', 'estado_icon', 'estado_supervisor.estado_supervisor_id', 'horario.facultad_id', 'usuario_nombre', 'registro_fecha_supervisor', 'comentario', 'registro_justificada', 'justificacion', 'reposicion_id' ]; $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')); $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') )) )))); $_SESSION['horarios'] = $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'], ]) ), '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' ELSE 'primary' 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) ORDER BY fechas.registro_fecha_ideal, horario_hora", $fechas ); echo json_encode($Horarios); } 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; }