123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- <?
- require_once "{$_SERVER['DOCUMENT_ROOT']}/class/c_login.php";
- header('Content-Type: application/json');
- if (!Login::is_logged()) {
- header('HTTP/1.1 401 Unauthorized');
- echo json_encode(['error' => '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
- fcc.registro_fecha_ideal,
- fcc.horario_id,
- hp.profesor_id
- FROM fechas_clase_cache fcc
- JOIN horario_profesor hp USING (horario_id)
- JOIN horario h USING (horario_id)
- WHERE (h.PERIODO_ID, h.FACULTAD_ID) = (:periodo_id, :facultad_id) and 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(),
- ]);
- }
|