'No se ha iniciado sesión']); exit(); } $user = Login::get_user(); try { switch ($_SERVER['REQUEST_METHOD']) { case 'GET': $facultad = $_GET['facultad'] ?? $user->facultad['facultad_id'] ?? null; $porcentaje = $_GET['porcentaje'] ?? null; $faltas = $_GET['faltas'] ?? null; if (!isset($facultad) || !is_numeric($facultad)) { $error = 'No se ha seleccionado una facultad'; } else if ((!isset($faltas) || !is_numeric($faltas)) && (!isset($porcentaje) || !is_numeric($porcentaje))) { $error = 'Debe especificar las faltas o el porcentaje'; } else if (isset($faltas) && (!is_numeric($faltas) || $faltas <= 0)) { $error = 'Las faltas deben ser un número mayor a 0'; } else if (isset($porcentaje) && (!is_numeric($porcentaje) || $porcentaje <= 0)) { $error = 'El porcentaje debe ser un número mayor a 0'; } else if (isset($faltas) && isset($porcentaje)) { $error = 'No se puede especificar las faltas y el porcentaje al mismo tiempo'; } else if (!isset($facultad) || !is_numeric($facultad)) { $error = 'Debe especificar una facultad'; } if (isset($error)) { header('HTTP/1.1 400 Bad Request'); echo json_encode(['error' => $error]); exit(); } // Initialize the data array $data = array(); // Check if 'profesor' or 'supervisor' is set and prepare the specific part of the SQL query accordingly. if (isset($_GET['profesor']) || isset($_GET['supervisor'])) { $condition = isset($_GET['profesor']) ? "r.registro_fecha IS NULL AND NOT COALESCE(r.registro_justificada, FALSE)" : "estado_supervisor_id = 2"; $filter = isset($faltas) ? "afcp.faltas >= :faltas" : "afcp.porcentaje >= :porcentaje"; // Prepare the SQL query with placeholders for parameters $data = array_column($db->query( "WITH fechas AS ( SELECT h.horario_id, fechas_clase(h.horario_id, true) AS registro_fecha_ideal, hp.profesor_id FROM horario h JOIN horario_profesor hp USING (horario_id) WHERE (h.PERIODO_ID, h.FACULTAD_ID) = (:periodo_id, :facultad_id) AND hp.profesor_id <> 0 ), asistencia_faltas AS ( SELECT f.profesor_id, COUNT(1) AS total, COUNT(1) FILTER (WHERE $condition AND f.registro_fecha_ideal <= current_date) AS faltas FROM fechas f LEFT JOIN registro r USING (registro_fecha_ideal, horario_id, profesor_id) GROUP BY f.profesor_id ), asistencia_faltas_con_porcentaje AS ( SELECT af.profesor_id, af.faltas, af.total, CASE WHEN af.total > 0 THEN ROUND((af.faltas::NUMERIC / af.total) * 100, 2) ELSE NULL END AS porcentaje FROM asistencia_faltas af WHERE af.faltas > 0 ) SELECT json_build_object( 'profesor', json_build_object( 'profesor_nombre', p.profesor_nombre, 'profesor_clave', p.profesor_clave, 'profesor_correo', p.profesor_correo ), 'profesor_id', afcp.profesor_id, 'faltas', afcp.faltas, 'total', afcp.total, 'porcentaje', afcp.porcentaje ) AS result_json FROM asistencia_faltas_con_porcentaje afcp JOIN profesor p USING (profesor_id) WHERE $filter ORDER BY afcp.porcentaje DESC; ", [ 'periodo_id' => $user->periodo_id, 'facultad_id' => $facultad, ] + (isset($faltas) ? ['faltas' => $faltas] : ['porcentaje' => $porcentaje]) ), 'result_json'); } else { // Send a 400 Bad Request header and an error message in JSON format header('HTTP/1.1 400 Bad Request'); echo json_encode(['error' => 'Especifique si las faltas son de profesor o supervisor']); exit(); } if (empty($data)) { header('HTTP/1.1 404 Not Found'); echo json_encode(['error' => 'No se encontraron faltas']); } else { echo json_encode( array_map(fn($item) => json_decode($item), $data) ); } break; default: header('HTTP/1.1 405 Method Not Allowed'); echo json_encode(['error' => 'Método no permitido']); break; } } catch (PDOException $e) { echo json_encode([ 'error' => $e->getMessage(), 'query' => $db->getLastQuery(), ]); }