LANIA_Proyecto/controllers/graficos.php

290 lines
8.7 KiB
PHP

<?php
require_once '../config/Database.php';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$input = json_decode(file_get_contents('php://input'), true);
$tipoConsulta = $input['tipoConsulta'] ?? '';
$graficos = new Graficos();
// Casos especiales para tarjetas de promedio
if (
$tipoConsulta === "Femenino" ||
$tipoConsulta === "Masculino" ||
$tipoConsulta === "Prefiero no decir"
) {
$cantidad = $graficos->obtenerCantidadPorGenero($tipoConsulta);
echo json_encode(["cantidad" => $cantidad]);
exit;
}
// Solo un filtro a la vez
$filtros = [];
if (!empty($input['id_rango_edad'])) $filtros['id_rango_edad'] = $input['id_rango_edad'];
else if (!empty($input['id_genero'])) $filtros['id_genero'] = $input['id_genero'];
else if (!empty($input['id_examen'])) $filtros['id_examen'] = $input['id_examen'];
else if (!empty($input['fechaInicio']) && !empty($input['fechaFin'])) {
$filtros['fechaInicio'] = $input['fechaInicio'];
$filtros['fechaFin'] = $input['fechaFin'];
}
switch ($tipoConsulta) {
case 'Generos':
$cantidad = $graficos->obtenerGeneros($filtros);
echo json_encode($cantidad);
exit;
case 'Edades':
$cantidad = $graficos->obtenerEdades($filtros);
echo json_encode($cantidad);
exit;
case 'Estados':
$cantidad = $graficos->obtenerEstados($filtros);
echo json_encode($cantidad);
exit;
case 'Examenes':
$cantidad = $graficos->obtenerExamenes($filtros);
echo json_encode($cantidad);
exit;
case 'Fechas':
$cantidad = $graficos->obtenerFechas($filtros);
echo json_encode($cantidad);
exit;
case 'ResumenGenero': // NUEVO
$cantidad = $graficos->obtenerResumenGenero($filtros);
echo json_encode($cantidad);
exit;
default:
echo json_encode([]);
exit;
}
}
class Graficos{
private $Database;
protected $db;
public function __construct() {
$this->Database = new Database();
$this->db = $this->Database->getInstance();
}
// NUEVO: Para tarjetas de promedio
public function obtenerCantidadPorGenero($genero) {
$sql = "SELECT COUNT(*) as cantidad
FROM candidato c
INNER JOIN genero g ON c.id_genero = g.id_genero
WHERE g.descripcion = ?";
$query = $this->db->prepare($sql);
$query->bind_param("s", $genero);
$query->execute();
$resultado = $query->get_result();
$row = $resultado->fetch_assoc();
$query->close();
return intval($row['cantidad']);
}
// Gráfico de Géneros
public function obtenerGeneros($filtros = []) {
$sql = "SELECT g.descripcion AS genero, COUNT(*) AS cantidad
FROM candidato c
INNER JOIN genero g ON c.id_genero = g.id_genero
WHERE 1=1";
$params = [];
$types = "";
if (!empty($filtros['id_genero'])) {
$sql .= " AND c.id_genero = ?";
$params[] = $filtros['id_genero'];
$types .= "i";
}
if (!empty($filtros['fechaInicio']) && !empty($filtros['fechaFin'])) {
$sql .= " AND DATE(c.fecha_entrada) >= ? AND DATE(c.fecha_entrada) <= ?";
$params[] = $filtros['fechaInicio'];
$params[] = $filtros['fechaFin'];
$types .= "ss";
}
$sql .= " GROUP BY g.descripcion ORDER BY g.descripcion";
$query = $this->db->prepare($sql);
if ($params) $query->bind_param($types, ...$params);
$query->execute();
$resultado = $query->get_result();
$generos = [];
while ($data = $resultado->fetch_assoc()) {
$generos[] = $data;
}
$query->close();
return $generos;
}
// Gráfico de Edades
public function obtenerEdades($filtros = []) {
$sql = "SELECT r.descripcion AS rango_edad, COUNT(*) AS cantidad
FROM candidato c
INNER JOIN rango_edad r ON c.id_rango_edad = r.id_rango_edad
WHERE 1=1";
$params = [];
$types = "";
if (!empty($filtros['id_rango_edad'])) {
$sql .= " AND c.id_rango_edad = ?";
$params[] = $filtros['id_rango_edad'];
$types .= "i";
}
if (!empty($filtros['fechaInicio']) && !empty($filtros['fechaFin'])) {
$sql .= " AND DATE(c.fecha_entrada) >= ? AND DATE(c.fecha_entrada) <= ?";
$params[] = $filtros['fechaInicio'];
$params[] = $filtros['fechaFin'];
$types .= "ss";
}
$sql .= " GROUP BY r.descripcion ORDER BY r.id_rango_edad";
$query = $this->db->prepare($sql);
if ($params) $query->bind_param($types, ...$params);
$query->execute();
$resultado = $query->get_result();
$edades = [];
while ($data = $resultado->fetch_assoc()) {
$edades[] = $data;
}
$query->close();
return $edades;
}
// Gráfico de Estados
public function obtenerEstados($filtros = []) {
$sql = "SELECT e.nombre AS estado, COUNT(*) AS cantidad
FROM info_candidatos i
INNER JOIN estados e ON i.id_estado = e.id
WHERE 1=1";
$params = [];
$types = "";
if (!empty($filtros['id_estado'])) {
$sql .= " AND i.id_estado = ?";
$params[] = $filtros['id_estado'];
$types .= "i";
}
if (!empty($filtros['fechaInicio']) && !empty($filtros['fechaFin'])) {
$sql .= " AND DATE(i.fecha_entrada) >= ? AND DATE(i.fecha_entrada) <= ?";
$params[] = $filtros['fechaInicio'];
$params[] = $filtros['fechaFin'];
$types .= "ss";
}
$sql .= " GROUP BY e.nombre ORDER BY e.nombre";
$query = $this->db->prepare($sql);
if ($params) $query->bind_param($types, ...$params);
$query->execute();
$resultado = $query->get_result();
$estados = [];
while ($data = $resultado->fetch_assoc()) {
$estados[] = $data;
}
$query->close();
return $estados;
}
// Gráfico de Exámenes
public function obtenerExamenes($filtros = []) {
$sql = "SELECT ex.nombre_examen AS examen, COUNT(*) AS cantidad
FROM candidato c
INNER JOIN examen ex ON c.id_examen = ex.id_examen
WHERE 1=1";
$params = [];
$types = "";
if (!empty($filtros['id_examen'])) {
$sql .= " AND c.id_examen = ?";
$params[] = $filtros['id_examen'];
$types .= "i";
}
if (!empty($filtros['fechaInicio']) && !empty($filtros['fechaFin'])) {
$sql .= " AND DATE(c.fecha_entrada) >= ? AND DATE(c.fecha_entrada) <= ?";
$params[] = $filtros['fechaInicio'];
$params[] = $filtros['fechaFin'];
$types .= "ss";
}
$sql .= " GROUP BY ex.nombre_examen ORDER BY ex.nombre_examen";
$query = $this->db->prepare($sql);
if ($params) $query->bind_param($types, ...$params);
$query->execute();
$resultado = $query->get_result();
$examenes = [];
while ($data = $resultado->fetch_assoc()) {
$examenes[] = $data;
}
$query->close();
return $examenes;
}
// Gráfico de Fechas
public function obtenerFechas($filtros = []) {
$sql = "SELECT COUNT(*) AS cantidad
FROM candidato
WHERE 1=1";
$params = [];
$types = "";
if (!empty($filtros['fechaInicio']) && !empty($filtros['fechaFin'])) {
$sql .= " AND DATE(fecha_entrada) >= ? AND DATE(fecha_entrada) <= ?";
$params[] = $filtros['fechaInicio'];
$params[] = $filtros['fechaFin'];
$types .= "ss";
}
$query = $this->db->prepare($sql);
if ($params) $query->bind_param($types, ...$params);
$query->execute();
$resultado = $query->get_result();
$fechas = [];
while ($data = $resultado->fetch_assoc()) {
$fechas[] = $data;
}
$query->close();
return $fechas;
}
public function obtenerResumenGenero($filtros = []) {
$sql = "SELECT g.descripcion AS genero, COUNT(*) AS cantidad
FROM candidato c
INNER JOIN genero g ON c.id_genero = g.id_genero
WHERE 1=1";
$params = [];
$types = "";
if (!empty($filtros['id_genero'])) {
$sql .= " AND c.id_genero = ?";
$params[] = $filtros['id_genero'];
$types .= "i";
}
if (!empty($filtros['fechaInicio']) && !empty($filtros['fechaFin'])) {
$sql .= " AND DATE(c.fecha_entrada) >= ? AND DATE(c.fecha_entrada) <= ?";
$params[] = $filtros['fechaInicio'];
$params[] = $filtros['fechaFin'];
$types .= "ss";
}
$sql .= " GROUP BY g.descripcion ORDER BY g.descripcion";
$query = $this->db->prepare($sql);
if ($params) $query->bind_param($types, ...$params);
$query->execute();
$resultado = $query->get_result();
$generos = [];
while ($data = $resultado->fetch_assoc()) {
$generos[] = $data;
}
$query->close();
return $generos;
}
}
?>