diff --git a/controllers/graficos.php b/controllers/graficos.php new file mode 100644 index 0000000..c59fe56 --- /dev/null +++ b/controllers/graficos.php @@ -0,0 +1,525 @@ + $input['id_rango_edad'] ?? null, + 'id_genero' => $input['id_genero'] ?? null, + 'id_examen' => $input['id_examen'] ?? null, + 'fechaInicio' => $input['fechaInicio'] ?? null, + 'fechaFin' => $input['fechaFin'] ?? null, + ]; + + $graficos = new Graficos(); + + switch ($tipoConsulta) { + case 'Femenino': + $cantidad = $graficos->obtenerGeneroFemenino($filtros); + break; + case 'Masculino': + $cantidad = $graficos->obtenerGeneroMasculino($filtros); + break; + case 'Prefiero no decirlo': + $cantidad = $graficos->obtenerGeneroNoDefinido($filtros); + break; + case 'Menor de 18 años': + $cantidad = $graficos->obtenerEdadMenor18($filtros); + break; + case '18 a 24 años': + $cantidad = $graficos->obtenerEdad1824($filtros); + break; + case '25 a 34 años': + $cantidad = $graficos->obtenerEdad2434($filtros); + break; + case '35 a 44 años': + $cantidad = $graficos->obtenerEdad3544($filtros); + break; + case '45 a 54 años': + $cantidad = $graficos->obtenerEdad4554($filtros); + break; + case '55 a 64 años': + $cantidad = $graficos->obtenerEdad5564($filtros); + break; + case '65 años o más': + $cantidad = $graficos->obtenerEdad65oMas($filtros); + break; + case 'Estados': + $cantidad = $graficos->obtenerEstados($filtros); + echo json_encode($cantidad); + exit; + case 'Examenes': + $cantidad = $graficos->obtenerExamenes($filtros); + echo json_encode($cantidad); + exit; + case 'Fechas': + $fechaInicio = $input['fechaInicio'] ?? ''; + $fechaFin = $input['fechaFin'] ?? ''; + $cantidad = $graficos->obtenerFecha($fechaInicio, $fechaFin); + echo json_encode($cantidad); + exit; + default: + $cantidad = 0; + } + + echo json_encode(['cantidad' => $cantidad]); +} + +class Graficos{ + private $Database; + protected $db; + + public function __construct() { + $this->Database = new Database(); + $this->db = $this->Database->getInstance(); + } + + public function obtenerGeneroFemenino($filtros = []) { + $sql = "SELECT COUNT(*) AS Femenino FROM candidato WHERE id_genero = 2"; + $params = []; + $types = ""; + + if (!empty($filtros['id_rango_edad']) && $filtros['id_rango_edad'] !== "NULL") { + $sql .= " AND id_rango_edad = ?"; + $params[] = $filtros['id_rango_edad']; + $types .= "i"; + } + if (!empty($filtros['id_examen']) && $filtros['id_examen'] !== "NULL") { + $sql .= " AND id_examen = ?"; + $params[] = $filtros['id_examen']; + $types .= "i"; + } + if (!empty($filtros['fechaInicio']) && !empty($filtros['fechaFin'])) { + $sql .= " AND DATE(fecha_entrada) >= ? AND DATE(fecha_salida) <= ?"; + $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(); + $output = "0"; + if ($resultado->num_rows > 0) { + $data = $resultado->fetch_assoc(); + $output = $data['Femenino']; + } + $query->close(); + return $output; +} + +public function obtenerGeneroMasculino($filtros = []) { + $sql = "SELECT COUNT(*) AS Masculino FROM candidato WHERE id_genero = 1"; + $params = []; + $types = ""; + + if (!empty($filtros['id_rango_edad']) && $filtros['id_rango_edad'] !== "NULL") { + $sql .= " AND id_rango_edad = ?"; + $params[] = $filtros['id_rango_edad']; + $types .= "i"; + } + if (!empty($filtros['id_examen']) && $filtros['id_examen'] !== "NULL") { + $sql .= " AND id_examen = ?"; + $params[] = $filtros['id_examen']; + $types .= "i"; + } + if (!empty($filtros['fechaInicio']) && !empty($filtros['fechaFin'])) { + $sql .= " AND DATE(fecha_entrada) >= ? AND DATE(fecha_salida) <= ?"; + $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(); + $output = "0"; + if ($resultado->num_rows > 0) { + $data = $resultado->fetch_assoc(); + $output = $data['Masculino']; + } + $query->close(); + return $output; +} + +public function obtenerGeneroNoDefinido($filtros = []) { + $sql = "SELECT COUNT(*) AS NoDefinido FROM candidato WHERE id_genero = 3"; + $params = []; + $types = ""; + + if (!empty($filtros['id_rango_edad']) && $filtros['id_rango_edad'] !== "NULL") { + $sql .= " AND id_rango_edad = ?"; + $params[] = $filtros['id_rango_edad']; + $types .= "i"; + } + if (!empty($filtros['id_examen']) && $filtros['id_examen'] !== "NULL") { + $sql .= " AND id_examen = ?"; + $params[] = $filtros['id_examen']; + $types .= "i"; + } + if (!empty($filtros['fechaInicio']) && !empty($filtros['fechaFin'])) { + $sql .= " AND DATE(fecha_entrada) >= ? AND DATE(fecha_salida) <= ?"; + $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(); + $output = "0"; + if ($resultado->num_rows > 0) { + $data = $resultado->fetch_assoc(); + $output = $data['NoDefinido']; + } + $query->close(); + return $output; +} + +public function obtenerEdadMenor18($filtros = []) { + $sql = "SELECT COUNT(*) AS menorEdad FROM candidato WHERE id_rango_edad = 1"; + $params = []; + $types = ""; + + if (!empty($filtros['id_examen']) && $filtros['id_examen'] !== "NULL") { + $sql .= " AND id_examen = ?"; + $params[] = $filtros['id_examen']; + $types .= "i"; + } + if (!empty($filtros['fechaInicio']) && !empty($filtros['fechaFin'])) { + $sql .= " AND DATE(fecha_entrada) >= ? AND DATE(fecha_salida) <= ?"; + $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(); + $output = "0"; + if ($resultado->num_rows > 0) { + $data = $resultado->fetch_assoc(); + $output = $data['menorEdad']; + } + $query->close(); + return $output; +} + +public function obtenerEdad1824($filtros = []) { + $sql = "SELECT COUNT(*) AS edad1824 FROM candidato WHERE id_rango_edad = 2"; + $params = []; + $types = ""; + + if (!empty($filtros['id_examen']) && $filtros['id_examen'] !== "NULL") { + $sql .= " AND id_examen = ?"; + $params[] = $filtros['id_examen']; + $types .= "i"; + } + if (!empty($filtros['fechaInicio']) && !empty($filtros['fechaFin'])) { + $sql .= " AND DATE(fecha_entrada) >= ? AND DATE(fecha_salida) <= ?"; + $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(); + $output = "0"; + if ($resultado->num_rows > 0) { + $data = $resultado->fetch_assoc(); + $output = $data['edad1824']; + } + $query->close(); + return $output; +} + +public function obtenerEdad2434($filtros = []) { + $sql = "SELECT COUNT(*) AS edad2434 FROM candidato WHERE id_rango_edad = 3"; + $params = []; + $types = ""; + + if (!empty($filtros['id_examen']) && $filtros['id_examen'] !== "NULL") { + $sql .= " AND id_examen = ?"; + $params[] = $filtros['id_examen']; + $types .= "i"; + } + if (!empty($filtros['fechaInicio']) && !empty($filtros['fechaFin'])) { + $sql .= " AND DATE(fecha_entrada) >= ? AND DATE(fecha_salida) <= ?"; + $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(); + $output = "0"; + if ($resultado->num_rows > 0) { + $data = $resultado->fetch_assoc(); + $output = $data['edad2434']; + } + $query->close(); + return $output; +} + +public function obtenerEdad3544($filtros = []) { + $sql = "SELECT COUNT(*) AS edad3544 FROM candidato WHERE id_rango_edad = 4"; + $params = []; + $types = ""; + + if (!empty($filtros['id_examen']) && $filtros['id_examen'] !== "NULL") { + $sql .= " AND id_examen = ?"; + $params[] = $filtros['id_examen']; + $types .= "i"; + } + if (!empty($filtros['fechaInicio']) && !empty($filtros['fechaFin'])) { + $sql .= " AND DATE(fecha_entrada) >= ? AND DATE(fecha_salida) <= ?"; + $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(); + $output = "0"; + if ($resultado->num_rows > 0) { + $data = $resultado->fetch_assoc(); + $output = $data['edad3544']; + } + $query->close(); + return $output; +} + +public function obtenerEdad4554($filtros = []) { + $sql = "SELECT COUNT(*) AS edad4554 FROM candidato WHERE id_rango_edad = 5"; + $params = []; + $types = ""; + + if (!empty($filtros['id_examen']) && $filtros['id_examen'] !== "NULL") { + $sql .= " AND id_examen = ?"; + $params[] = $filtros['id_examen']; + $types .= "i"; + } + if (!empty($filtros['fechaInicio']) && !empty($filtros['fechaFin'])) { + $sql .= " AND DATE(fecha_entrada) >= ? AND DATE(fecha_salida) <= ?"; + $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(); + $output = "0"; + if ($resultado->num_rows > 0) { + $data = $resultado->fetch_assoc(); + $output = $data['edad4554']; + } + $query->close(); + return $output; +} + +public function obtenerEdad5564($filtros = []) { + $sql = "SELECT COUNT(*) AS edad5564 FROM candidato WHERE id_rango_edad = 6"; + $params = []; + $types = ""; + + if (!empty($filtros['id_examen']) && $filtros['id_examen'] !== "NULL") { + $sql .= " AND id_examen = ?"; + $params[] = $filtros['id_examen']; + $types .= "i"; + } + if (!empty($filtros['fechaInicio']) && !empty($filtros['fechaFin'])) { + $sql .= " AND DATE(fecha_entrada) >= ? AND DATE(fecha_salida) <= ?"; + $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(); + $output = "0"; + if ($resultado->num_rows > 0) { + $data = $resultado->fetch_assoc(); + $output = $data['edad5564']; + } + $query->close(); + return $output; +} + +public function obtenerEdad65oMas($filtros = []) { + $sql = "SELECT COUNT(*) AS edad65oMas FROM candidato WHERE id_rango_edad = 7"; + $params = []; + $types = ""; + + if (!empty($filtros['id_examen']) && $filtros['id_examen'] !== "NULL") { + $sql .= " AND id_examen = ?"; + $params[] = $filtros['id_examen']; + $types .= "i"; + } + if (!empty($filtros['fechaInicio']) && !empty($filtros['fechaFin'])) { + $sql .= " AND DATE(fecha_entrada) >= ? AND DATE(fecha_salida) <= ?"; + $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(); + $output = "0"; + if ($resultado->num_rows > 0) { + $data = $resultado->fetch_assoc(); + $output = $data['edad65oMas']; + } + $query->close(); + return $output; +} + +public function obtenerEstados($filtros = []) { + $sql = "SELECT estados.nombre AS estado, COUNT(*) AS cantidad + FROM candidato + INNER JOIN info_candidatos ON candidato.id_candidato = info_candidatos.id_candidato + INNER JOIN estados ON info_candidatos.id_estado = estados.id + WHERE 1=1"; + $params = []; + $types = ""; + + if (!empty($filtros['id_rango_edad']) && $filtros['id_rango_edad'] !== "NULL") { + $sql .= " AND candidato.id_rango_edad = ?"; + $params[] = $filtros['id_rango_edad']; + $types .= "i"; + } + if (!empty($filtros['id_genero']) && $filtros['id_genero'] !== "NULL") { + $sql .= " AND candidato.id_genero = ?"; + $params[] = $filtros['id_genero']; + $types .= "i"; + } + if (!empty($filtros['id_examen']) && $filtros['id_examen'] !== "NULL") { + $sql .= " AND candidato.id_examen = ?"; + $params[] = $filtros['id_examen']; + $types .= "i"; + } + if (!empty($filtros['fechaInicio']) && !empty($filtros['fechaFin'])) { + $sql .= " AND DATE(candidato.fecha_entrada) >= ? AND DATE(candidato.fecha_salida) <= ?"; + $params[] = $filtros['fechaInicio']; + $params[] = $filtros['fechaFin']; + $types .= "ss"; + } + + $sql .= " GROUP BY estados.nombre ORDER BY estados.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; +} + +public function obtenerExamenes($filtros = []) { + $sql = "SELECT examen.nombre_examen AS examen, COUNT(*) AS cantidad + FROM candidato + LEFT JOIN examen ON candidato.id_examen = examen.id_examen + WHERE 1=1"; + $params = []; + $types = ""; + + if (!empty($filtros['id_rango_edad']) && $filtros['id_rango_edad'] !== "NULL") { + $sql .= " AND candidato.id_rango_edad = ?"; + $params[] = $filtros['id_rango_edad']; + $types .= "i"; + } + if (!empty($filtros['id_genero']) && $filtros['id_genero'] !== "NULL") { + $sql .= " AND candidato.id_genero = ?"; + $params[] = $filtros['id_genero']; + $types .= "i"; + } + if (!empty($filtros['id_examen']) && $filtros['id_examen'] !== "NULL") { + $sql .= " AND candidato.id_examen = ?"; + $params[] = $filtros['id_examen']; + $types .= "i"; + } + if (!empty($filtros['fechaInicio']) && !empty($filtros['fechaFin'])) { + $sql .= " AND DATE(candidato.fecha_entrada) >= ? AND DATE(candidato.fecha_salida) <= ?"; + $params[] = $filtros['fechaInicio']; + $params[] = $filtros['fechaFin']; + $types .= "ss"; + } + + $sql .= " GROUP BY examen.nombre_examen ORDER BY examen.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; + +} + +public function obtenerFecha($fechaInicio, $fechaFin) { + $sql = "SELECT COUNT(*) AS cantidad + FROM candidato + WHERE DATE(fecha_entrada) >= ? AND DATE(fecha_entrada) <= ?"; + $query = $this->db->prepare($sql); + $query->bind_param("ss", $fechaInicio, $fechaFin); + $query->execute(); + $resultado = $query->get_result(); + + $data = $resultado->fetch_assoc(); + $query->close(); + // Devuelve un array con un solo objeto para mantener compatibilidad con el frontend + return [ [ 'cantidad' => $data['cantidad'], 'fechaInicio' => $fechaInicio, 'fechaFin' => $fechaFin ] ]; +} +} +?> \ No newline at end of file diff --git a/js/funcionesGraficos.js b/js/funcionesGraficos.js index 203f60a..9afe06a 100644 --- a/js/funcionesGraficos.js +++ b/js/funcionesGraficos.js @@ -1,78 +1,58 @@ -async function recuperarCantidadGenero(tipoConsulta) { +async function recuperarCantidadGenero(tipoConsulta, filtros = {}) { try { - const response = await fetch("/controllers/graficosController.php", { + const response = await fetch("../controllers/graficos.php", { method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ tipoConsulta }), + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ tipoConsulta, ...filtros }), }); - const data = await response.json(); - return data.cantidad || 0; + return data.cantidad || 0; } catch (error) { console.error("Error al recuperar datos:", error); return 0; } } -async function recuperarCantidadEdad(tipoConsulta) { +async function recuperarCantidadEdad(tipoConsulta, filtros = {}) { try { - const response = await fetch("/controllers/graficosController.php", { + const response = await fetch("../controllers/graficos.php", { method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ tipoConsulta }), + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ tipoConsulta, ...filtros }), }); - const data = await response.json(); - return data.cantidad || 0; + return data.cantidad || 0; } catch (error) { console.error("Error al recuperar datos:", error); return 0; } } -async function recuperarCantidadEstado(tipoConsulta) { +async function recuperarCantidadEstado(tipoConsulta, filtros = {}) { try { - const response = await fetch("/controllers/graficosController.php", { + const response = await fetch("../controllers/graficos.php", { method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ tipoConsulta }), + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ tipoConsulta, ...filtros }), }); - const data = await response.json(); - - if (!Array.isArray(data)) { - throw new Error("La respuesta del backend no es un array."); - } - - return data; + if (!Array.isArray(data)) throw new Error("La respuesta del backend no es un array."); + return data; } catch (error) { console.error("Error al recuperar datos de estados:", error); return []; } } -async function recuperarCantidadExamen(tipoConsulta) { +async function recuperarCantidadExamen(tipoConsulta, filtros = {}) { try { - const response = await fetch("/controllers/graficosController.php", { + const response = await fetch("../controllers/graficos.php", { method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ tipoConsulta }), + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ tipoConsulta, ...filtros }), }); - const data = await response.json(); - - if (!Array.isArray(data)) { - throw new Error("La respuesta del backend no es un array"); - } - + if (!Array.isArray(data)) throw new Error("La respuesta del backend no es un array"); return data; } catch (error) { console.error("Error al recuperar datos de examenes:", error); @@ -80,64 +60,99 @@ async function recuperarCantidadExamen(tipoConsulta) { } } - -async function obtenerDatosEdades() { - const edad1 = await recuperarCantidadEdad("Menor de 18 años"); - const edad2 = await recuperarCantidadEdad("18 a 24 años"); - const edad3 = await recuperarCantidadEdad("25 a 34 años"); - const edad4 = await recuperarCantidadEdad("35 a 44 años"); - const edad5 = await recuperarCantidadEdad("45 a 54 años"); - const edad6 = await recuperarCantidadEdad("55 a 64 años"); - const edad7 = await recuperarCantidadEdad("65 años o más"); - - return [edad1, edad2, edad3, edad4, edad5, edad6]; +async function recuperarCantidadFecha(tipoConsulta, filtros = {}) { + try { + const response = await fetch("../controllers/graficos.php", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ tipoConsulta, ...filtros }), + }); + const data = await response.json(); + if (!Array.isArray(data)) throw new Error("La respuesta del backend no es un array."); + return data; + } catch (error) { + console.error("Error al recuperar datos de fechas:", error); + return []; + } } +async function obtenerDatosEdades(filtros = {}) { + const edad1 = await recuperarCantidadEdad("Menor de 18 años", filtros); + const edad2 = await recuperarCantidadEdad("18 a 24 años", filtros); + const edad3 = await recuperarCantidadEdad("25 a 34 años", filtros); + const edad4 = await recuperarCantidadEdad("35 a 44 años", filtros); + const edad5 = await recuperarCantidadEdad("45 a 54 años", filtros); + const edad6 = await recuperarCantidadEdad("55 a 64 años", filtros); + const edad7 = await recuperarCantidadEdad("65 años o más", filtros); + return [edad1, edad2, edad3, edad4, edad5, edad6, edad7]; +} -async function obtenerDatosGeneros() { - const femenino = await recuperarCantidadGenero("Femenino"); - const masculino = await recuperarCantidadGenero("Masculino"); - const noDefinido = await recuperarCantidadGenero("Prefiero no decirlo"); - +async function obtenerDatosGeneros(filtros = {}) { + const femenino = await recuperarCantidadGenero("Femenino", filtros); + const masculino = await recuperarCantidadGenero("Masculino", filtros); + const noDefinido = await recuperarCantidadGenero("Prefiero no decirlo", filtros); return [femenino, masculino, noDefinido]; } -async function obtenerDatosEstados() { +async function obtenerDatosEstados(filtros = {}) { try { - const estados = await recuperarCantidadEstado("Estados"); - + const estados = await recuperarCantidadEstado("Estados", filtros); if (!Array.isArray(estados)) { console.error("Error: 'estados' no es un array. Verifica la respuesta del backend"); return []; } - const estadosValidos = estados.filter(estado => estado.estado && estado.cantidad !== undefined); - - return estadosValidos; + return estadosValidos; } catch (error) { console.error("Error al obtener datos de estados:", error); return []; } } -async function obtenerDatosExamenes() { +async function obtenerDatosExamenes(filtros = {}) { try { - const examenes = await recuperarCantidadExamen("Examenes"); - + const examenes = await recuperarCantidadExamen("Examenes", filtros); if (!Array.isArray(examenes)) { console.error("Error: 'examenes' no es un array. Verifica la respuesta del backend"); return []; } - const examenesValidos = examenes.filter(examen => examen.examen && examen.cantidad !== undefined); - - return examenesValidos; + return examenesValidos; } catch (error) { console.error("Error al obtener datos de examenes:", error); return []; } } +async function obtenerDatosFechas(filtros = {}) { + try { + const fechas = await recuperarCantidadFecha("Fechas", filtros); + if (!Array.isArray(fechas) || !fechas.length) { + return []; + } + // Solo un objeto con la cantidad total + return fechas; + } catch (error) { + console.error("Error al obtener datos de fechas:", error); + return []; + } +} +function getFiltrosSeleccionados() { + return { + id_rango_edad: document.getElementById('id_rango_edad')?.value || "NULL", + id_genero: document.getElementById('id_genero')?.value || "NULL", + id_examen: document.getElementById('id_examen')?.value || "NULL", + fechaInicio: document.getElementById('date1')?.value || "", + fechaFin: document.getElementById('date2')?.value || "" + }; +} -export { obtenerDatosGeneros, obtenerDatosEdades, obtenerDatosEstados, obtenerDatosExamenes }; \ No newline at end of file +export { + obtenerDatosGeneros, + obtenerDatosEdades, + obtenerDatosEstados, + obtenerDatosExamenes, + obtenerDatosFechas, + getFiltrosSeleccionados +}; \ No newline at end of file diff --git a/js/inicio.js b/js/inicio.js index 976a28b..9174413 100644 --- a/js/inicio.js +++ b/js/inicio.js @@ -163,10 +163,67 @@ allProgress.forEach(item=> { -import { obtenerDatosGeneros, obtenerDatosEdades, obtenerDatosEstados,obtenerDatosExamenes } from './funcionesGraficos.js'; +import { + obtenerDatosGeneros, + obtenerDatosEdades, + obtenerDatosEstados, + obtenerDatosExamenes, + obtenerDatosFechas, + getFiltrosSeleccionados +} from './funcionesGraficos.js'; -async function inicializarGrafico() { - const [femenino, masculino, noDefinido] = await obtenerDatosGeneros(""); +// Variables globales para los graficos +let chartGenero = null; +let chartEdad = null; +let chartEstado = null; +let chartExamen = null; +let chartFecha = null; + +// Controla si el filtro de fecha está activo +let filtroFechaActivo = false; + +async function inicializarGraficoFecha(filtros) { + // Solo dibujar si ambas fechas están presentes y el filtro está activo + if (!filtroFechaActivo || !filtros.fechaInicio || !filtros.fechaFin) { + if (chartFecha) { + chartFecha.destroy(); + chartFecha = null; + } + return; + } + + const fechas = await obtenerDatosFechas(filtros); + + if (!fechas.length) { + if (chartFecha) { + chartFecha.destroy(); + chartFecha = null; + } + return; + } + + // Solo un valor total + const cantidad = fechas[0].cantidad; + const label = `Del ${fechas[0].fechaInicio} al ${fechas[0].fechaFin}`; + + const options = { + series: [{ + name: 'Candidatos', + data: [cantidad] + }], + chart: { height: 350, type: 'bar' }, + xaxis: { categories: [label] }, + dataLabels: { enabled: true }, + tooltip: { y: { formatter: val => val + " candidatos" } } + }; + + if (chartFecha) chartFecha.destroy(); + chartFecha = new ApexCharts(document.querySelector("#chart5"), options); + chartFecha.render(); +} + +async function inicializarGrafico(filtros) { + const [femenino, masculino, noDefinido] = await obtenerDatosGeneros(filtros); const options = { series: [ @@ -174,268 +231,132 @@ async function inicializarGrafico() { { name: 'Masculino', data: [masculino] }, { name: 'Prefiero no decirlo', data: [noDefinido] }, ], - chart: { - height: 350, - type: 'bar', - }, - plotOptions: { - bar: { - horizontal: false, - columnWidth: '55%', - borderRadius: 5, - }, - }, - dataLabels: { - enabled: false, - }, - xaxis: { - categories: ['Géneros'], - }, - tooltip: { - y: { - formatter: function (val) { - return val + " personas"; - }, - }, - }, + chart: { height: 350, type: 'bar' }, + plotOptions: { bar: { horizontal: false, columnWidth: '55%', borderRadius: 5 } }, + dataLabels: { enabled: false }, + xaxis: { categories: ['Géneros'] }, + tooltip: { y: { formatter: val => val + " personas" } } }; - const chart = new ApexCharts(document.querySelector("#chart"), options); - chart.render(); + if (chartGenero) chartGenero.destroy(); + chartGenero = new ApexCharts(document.querySelector("#chart"), options); + chartGenero.render(); } -inicializarGrafico(); - -async function inicializarGrafico2() { - const [edad1,edad2,edad3,edad4,edad5,edad6,edad7] = await obtenerDatosEdades(); +async function inicializarGrafico2(filtros) { + const [edad1, edad2, edad3, edad4, edad5, edad6, edad7] = await obtenerDatosEdades(filtros); const options2 = { series: [ { name: 'Menor de 18 años', data: [edad1] }, - { name: '18 a 24 años', data: [edad2] }, - { name: '25 a 34 años', data: [edad3] }, - { name: '35 a 44 años', data: [edad4] }, - { name: '45 a 54 años', data: [edad5] }, - { name: '55 a 64 años', data: [edad6] }, - { name: '65 años o más', data: [edad7] }, + { name: '18 a 24 años', data: [edad2] }, + { name: '25 a 34 años', data: [edad3] }, + { name: '35 a 44 años', data: [edad4] }, + { name: '45 a 54 años', data: [edad5] }, + { name: '55 a 64 años', data: [edad6] }, + { name: '65 años o más', data: [edad7] }, ], - chart: { - height: 350, - type: 'bar', - }, - plotOptions: { - bar: { - horizontal: false, - columnWidth: '55%', - borderRadius: 5, - }, - }, - dataLabels: { - enabled: false, - }, - xaxis: { - categories: ['Edades'], - }, - tooltip: { - y: { - formatter: function (val) { - return val + " Años"; - }, - }, - }, + chart: { height: 350, type: 'bar' }, + plotOptions: { bar: { horizontal: false, columnWidth: '55%', borderRadius: 5 } }, + dataLabels: { enabled: false }, + xaxis: { categories: ['Edades'] }, + tooltip: { y: { formatter: val => val + " Años" } } }; - const chart2 = new ApexCharts(document.querySelector("#chart2"), options2); - chart2.render(); + if (chartEdad) chartEdad.destroy(); + chartEdad = new ApexCharts(document.querySelector("#chart2"), options2); + chartEdad.render(); } -inicializarGrafico2(); +async function inicializarGrafico3(filtros) { + const estados = await obtenerDatosEstados(filtros); + const seriesData = estados.map(estado => ({ + name: estado.estado, + data: [estado.cantidad] + })); -async function inicializarGrafico3() { - try { - const estados = await obtenerDatosEstados(); + const options3 = { + series: seriesData, + chart: { height: 350, type: 'bar' }, + plotOptions: { bar: { horizontal: false, columnWidth: '55%', borderRadius: 5 } }, + dataLabels: { enabled: false }, + xaxis: { categories: estados.map(estado => estado.estado) }, + tooltip: { y: { formatter: val => val + " personas" } } + }; - if (!Array.isArray(estados)) { - console.error("Error: 'estados' no es un array. Verifica la funcion obtenerDatosEstados"); - return; - } + if (chartEstado) chartEstado.destroy(); + chartEstado = new ApexCharts(document.querySelector("#chart3"), options3); + chartEstado.render(); +} - const seriesData = estados.map(estado => ({ - name: estado.estado, - data: [estado.cantidad] - })); +async function inicializarGrafico4(filtros) { + const examenes = await obtenerDatosExamenes(filtros); - const options3 = { - series: seriesData, - chart: { - height: 350, - type: 'bar', - }, - plotOptions: { - bar: { - horizontal: false, - columnWidth: '55%', - borderRadius: 5, - }, - }, - dataLabels: { - enabled: false, - }, - xaxis: { - categories: estados.map(estado => estado.estado), // categorias en el eje X - }, - tooltip: { - y: { - formatter: function (val) { - return val + " personas"; - }, - }, - }, - }; + const seriesData = examenes.map(examen => ({ + name: examen.examen, + data: [examen.cantidad] + })); - const chart3 = new ApexCharts(document.querySelector("#chart3"), options3); - chart3.render(); - } catch (error) { - console.error("Error al inicializar el gráfico 3:", error); + const options4 = { + series: seriesData, + chart: { height: 350, type: 'bar' }, + plotOptions: { bar: { horizontal: false, columnWidth: '55%', borderRadius: 5 } }, + dataLabels: { enabled: false }, + xaxis: { categories: examenes.map(examen => examen.examen) }, + tooltip: { y: { formatter: val => val + " examenes" } } + }; + + if (chartExamen) chartExamen.destroy(); + chartExamen = new ApexCharts(document.querySelector("#chart4"), options4); + chartExamen.render(); +} + +async function actualizarTodosLosGraficos() { + // Si el filtro de fecha está activo, se pasan las fechas, si no, se limpian + let filtros = getFiltrosSeleccionados(); + if (!filtroFechaActivo) { + filtros.fechaInicio = ""; + filtros.fechaFin = ""; } + await inicializarGrafico(filtros); + await inicializarGrafico2(filtros); + await inicializarGrafico3(filtros); + await inicializarGrafico4(filtros); + await inicializarGraficoFecha(filtros); } -inicializarGrafico3(); - -async function inicializarGrafico4() { - try { - const examenes = await obtenerDatosExamenes(); - - if (!Array.isArray(examenes)) { - console.error("Error: 'examenes' no es un array. Verifica la función obtenerDatosExamenes"); - return; - } - - const seriesData = examenes.map(examen => ({ - name: examen.examen, - data: [examen.cantidad] - })); - - const options4 = { - series: seriesData, - chart: { - height: 350, - type: 'bar', - }, - plotOptions: { - bar: { - horizontal: false, - columnWidth: '55%', - borderRadius: 5, - }, - }, - dataLabels: { - enabled: false, - }, - xaxis: { - categories: examenes.map(examen => examen.examen), // categorías en el eje X - }, - tooltip: { - y: { - formatter: function (val) { - return val + " examenes"; - }, - }, - }, - }; - - const chart4 = new ApexCharts(document.querySelector("#chart4"), options4); - chart4.render(); - } catch (error) { - console.error("Error al inicializar el grafico 4:", error); - } -} - - -inicializarGrafico4(); - - +// Espera a que el DOM esté listo antes de agregar eventos document.addEventListener('DOMContentLoaded', () => { - const btnbuscar = document.getElementById('buscar'); - btnbuscar.addEventListener('click', async function () { - const fechaInicioInput = document.getElementById('date1').value; - const fechaFinInput = document.getElementById('date2').value; + // Solo combos, NO fechas + ['id_rango_edad', 'id_genero', 'id_examen'].forEach(id => { + const el = document.getElementById(id); + if (el) el.addEventListener('change', actualizarTodosLosGraficos); + }); - if (fechaInicioInput === "" || fechaFinInput === "") { - alert("Por favor, ingrese ambas fechas."); - return; - } - - // Convertir las fechas al formato YYYY-MM-DD - const fechaInicio = convertirFechaAFormatoISO(fechaInicioInput); - const fechaFin = convertirFechaAFormatoISO(fechaFinInput); - - try { - const response = await fetch('../controllers/graficos.php', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - tipoConsulta: 'Fechas', - fechaInicio: fechaInicio, - fechaFin: fechaFin, - }), + // Botón buscar para fechas + const btnBuscar = document.getElementById('buscar'); + if (btnBuscar) { + btnBuscar.addEventListener('click', () => { + const date1 = document.getElementById('date1').value; + const date2 = document.getElementById('date2').value; + // Solo activa el filtro si ambas fechas están presentes + filtroFechaActivo = !!(date1 && date2); + actualizarTodosLosGraficos(); }); - - const data = await response.json(); - console.log("Respuesta del servidor:", data); - - if (Array.isArray(data) && data.length > 0) { - const seriesData = data.map(fecha => fecha.total); - const categories = data.map((_, index) => `Registro ${index + 1}`); - - const options5 = { - series: [{ - name: 'Cantidad de registros', - data: seriesData, - }], - chart: { - height: 350, - type: 'bar', - }, - plotOptions: { - bar: { - horizontal: false, - columnWidth: '55%', - borderRadius: 5, - }, - }, - dataLabels: { - enabled: false, - }, - xaxis: { - categories: categories, - }, - tooltip: { - y: { - formatter: function (val) { - return val + " registros"; - }, - }, - }, - }; - - const chart5 = new ApexCharts(document.querySelector("#chart5"), options5); - chart5.render(); - } else { - alert("No se encontraron datos para las fechas seleccionadas."); - } - } catch (error) { - console.error("Error al obtener los datos:", error); } -}); -}); -// Función para convertir fechas al formato YYYY-MM-DD -function convertirFechaAFormatoISO(fecha) { - const partes = fecha.split('-'); // Suponiendo que el input usa el formato DD-MM-YYYY - return `${partes[0]}-${partes[1]}-${partes[2]}`; // Retorna YYYY-MM-DD -} + // Botón limpiar para quitar filtro de fecha + const btnLimpiar = document.getElementById('limpiar'); + if (btnLimpiar) { + btnLimpiar.addEventListener('click', () => { + document.getElementById('date1').value = ''; + document.getElementById('date2').value = ''; + filtroFechaActivo = false; + actualizarTodosLosGraficos(); + }); + } + filtroFechaActivo = false; + actualizarTodosLosGraficos(); +}); \ No newline at end of file diff --git a/views/inicio.html b/views/inicio.html index 3fed44c..108a0f7 100644 --- a/views/inicio.html +++ b/views/inicio.html @@ -121,7 +121,27 @@ + +

Fecha

+

Ingresa una fecha de inicio:

+
+ +

Ingresa una fecha de final:

+ +
+ + +
+
+
+

Resultado de registros en el rango de fecha ingresado

+ +
+
+
+
@@ -234,32 +254,6 @@
-
-
-

Ingresa una fecha de inicio:

-
- -

Ingresa una fecha de final:

- -
- -
-
-
-

Fecha

- -
-
-
-
-
@@ -272,6 +266,5 @@ - \ No newline at end of file