290 lines
8.7 KiB
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;
|
|
}
|
|
|
|
}
|
|
?>
|