diff --git a/form_datos_extendidos.html b/form_datos_extendidos.html index e758382..a4c1a95 100644 --- a/form_datos_extendidos.html +++ b/form_datos_extendidos.html @@ -111,8 +111,10 @@ <div class="form-group"> <label for="codigo_postal" class="required">Código Postal</label> <input type="number" min="0" step="1" id="codigo_postal" name="codigo_postal" maxlength="10" required> + <button type="button" id="buscarBtn"><span class="material-icons">search</span>Buscar</button> </div> </div> + <div class="form-col"> <div class="form-group"> <label for="id_estado">Estado</label> @@ -253,5 +255,6 @@ <script src="js/form.js"></script> <script src="js/form_datos_extendidos.js"></script> <script src="https://website-widgets.pages.dev/dist/sienna.min.js" defer></script> + <script src="js/buscarCodigo.js"></script> </body> </html> \ No newline at end of file diff --git a/inicio.html b/inicio.html index 7bf8faf..e401a94 100644 --- a/inicio.html +++ b/inicio.html @@ -134,7 +134,7 @@ <div class="data"> <div class="content-data"> <div class="head"> - <h3>Sales Report</h3> + <h3>Generos</h3> <div class="menu"> <i class='bx bx-dots-horizontal-rounded icon'></i> <ul class="menu-link"> @@ -150,63 +150,7 @@ </div> <div class="content-data"> <div class="head"> - <h3>Chatbox</h3> - <div class="menu"> - <i class='bx bx-dots-horizontal-rounded icon'></i> - <ul class="menu-link"> - <li><a href="#">Edit</a></li> - <li><a href="#">Save</a></li> - <li><a href="#">Remove</a></li> - </ul> - </div> - </div> - <div class="chat-box"> - <p class="day"><span>Today</span></p> - <div class="msg"> - <img src="https://images.unsplash.com/photo-1517841905240-472988babdf9?ixid=MnwxMjA3fDB8MHxzZWFyY2h8NHx8cGVvcGxlfGVufDB8fDB8fA%3D%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60" alt=""> - <div class="chat"> - <div class="profile"> - <span class="username">Alan</span> - <span class="time">18:30</span> - </div> - <p>Hello</p> - </div> - </div> - <div class="msg me"> - <div class="chat"> - <div class="profile"> - <span class="time">18:30</span> - </div> - <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Eaque voluptatum eos quam dolores eligendi exercitationem animi nobis reprehenderit laborum! Nulla.</p> - </div> - </div> - <div class="msg me"> - <div class="chat"> - <div class="profile"> - <span class="time">18:30</span> - </div> - <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Ipsam, architecto!</p> - </div> - </div> - <div class="msg me"> - <div class="chat"> - <div class="profile"> - <span class="time">18:30</span> - </div> - <p>Lorem ipsum, dolor sit amet.</p> - </div> - </div> - </div>` - <form action="#"> - <div class="form-group"> - <input type="text" placeholder="Type..."> - <button type="submit" class="btn-send"><i class='bx bxs-send' ></i></button> - </div> - </form> - </div> - <div class="content-data"> - <div class="head"> - <h3>Sales Report</h3> + <h3>Edades</h3> <div class="menu"> <i class='bx bx-dots-horizontal-rounded icon'></i> <ul class="menu-link"> @@ -217,12 +161,12 @@ </div> </div> <div class="chart"> - <div id="basic"></div> + <div id="chart2"></div> </div> </div> <div class="content-data"> <div class="head"> - <h3>Sales Report</h3> + <h3>Estados</h3> <div class="menu"> <i class='bx bx-dots-horizontal-rounded icon'></i> <ul class="menu-link"> @@ -233,12 +177,12 @@ </div> </div> <div class="chart"> - <div id="treemap"></div> + <div id="chart3"></div> </div> </div> <div class="content-data"> <div class="head"> - <h3>Sales Report</h3> + <h3>Examenes</h3> <div class="menu"> <i class='bx bx-dots-horizontal-rounded icon'></i> <ul class="menu-link"> @@ -249,7 +193,7 @@ </div> </div> <div class="chart"> - <div id="polar"></div> + <div id="chart4"></div> </div> </div> </div> @@ -259,7 +203,7 @@ <!-- NAVBAR --> <script src="https://cdn.jsdelivr.net/npm/apexcharts"></script> - <script src="js/inicio.js"></script> + <script type="module" src="js/inicio.js"></script> <script src="https://website-widgets.pages.dev/dist/sienna.min.js" defer></script> </body> </html> \ No newline at end of file diff --git a/js/buscarCodigo.js b/js/buscarCodigo.js new file mode 100644 index 0000000..093b5bf --- /dev/null +++ b/js/buscarCodigo.js @@ -0,0 +1,77 @@ +document.addEventListener("DOMContentLoaded", function() { + var buscarBtn = document.getElementById("buscarBtn"); + + //Añadir un evento al boton de buscar + buscarBtn.addEventListener("click", function() { + var codigoPostal = document.getElementById("codigo_postal").value; + console.log(codigoPostal); + + //verificar si el codigo postal esta vacio + if (codigoPostal) { + //crear la url para la peticion + var url = "./php/buscarCodigo.php?codigo_postal=" + encodeURIComponent(codigoPostal); + + //Realiza una solicitud HTTP GET a la URL especificada + fetch(url) + .then(response => { + //console.log("Estado de la respuesta:", response.status); + //console.log("Contenido de la respuesta:", response); + // Verifica si la respuesta del servidor es exitosa +if (!response.ok) { + throw new Error("Error en la respuesta del servidor"); + } +//Convierte la respuesta a formato JSON +return response.json(); + + + }) + .then(data => { + var estadoSelect = document.getElementById("id_estado"); + var municipioSelect = document.getElementById("id_municipio"); + var coloniaSelect = document.getElementById("id_colonia"); + + // Inicializa los elementos select con una opción por defecto + estadoSelect.innerHTML = "<option value=''>Seleccionar Estado</option>"; + municipioSelect.innerHTML = "<option value=''>Seleccionar Municipios</option>"; + coloniaSelect.innerHTML = "<option value=''>Seleccionar Colonia</option>"; + + // Verifica si se recibieron datos + if (data.length > 0) { + //Crea conjuntos para almacenar estados, ciudades y colonias únicos + let estados = new Set(); + let municipios = new Set(); + let colonias = []; + + // Itera sobre cada fila de datos recibidos + data.forEach(row => { + estados.add(row.estado); + municipios.add(row.municipio); + colonias.push(row.colonia); + }); + + //Añade las opciones de estados al elemento select + estados.forEach(estado => { + estadoSelect.innerHTML += "<option value='" + estado + "'>" + estado + "</option>"; + }); + + //Añade las opciones de ciudades al elemento select + municipios.forEach(municipio => { + municipioSelect.innerHTML += "<option value='" + municipio + "'>" + municipio + "</option>"; + }); + + //Añade las opciones de colonias al elemento select + colonias.forEach(colonia => { + coloniaSelect.innerHTML += "<option value='" + colonia + "'>" + colonia + "</option>"; + }); + } else { + alert("No se encontraron datos para el código postal ingresado."); + } + }) + .catch(error => { + console.error("Error en la solicitud:", error); + }); + } else { + alert("Por favor, ingrese un código postal."); + } + }); +}); diff --git a/js/funcionesGraficos.js b/js/funcionesGraficos.js new file mode 100644 index 0000000..9eec9de --- /dev/null +++ b/js/funcionesGraficos.js @@ -0,0 +1,143 @@ +async function recuperarCantidadGenero(tipoConsulta) { + try { + const response = await fetch("./php/graficos.php", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ tipoConsulta }), + }); + + const data = await response.json(); + return data.cantidad || 0; + } catch (error) { + console.error("Error al recuperar datos:", error); + return 0; + } +} + +async function recuperarCantidadEdad(tipoConsulta) { + try { + const response = await fetch("./php/graficos.php", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ tipoConsulta }), + }); + + const data = await response.json(); + return data.cantidad || 0; + } catch (error) { + console.error("Error al recuperar datos:", error); + return 0; + } +} + +async function recuperarCantidadEstado(tipoConsulta) { + try { + const response = await fetch("./php/graficos.php", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ tipoConsulta }), + }); + + 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 estados:", error); + return []; + } +} + +async function recuperarCantidadExamen(tipoConsulta) { + try { + const response = await fetch("./php/graficos.php", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ tipoConsulta }), + }); + + 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 examenes:", error); + return []; + } +} + + +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 obtenerDatosGeneros() { + const femenino = await recuperarCantidadGenero("Femenino"); + const masculino = await recuperarCantidadGenero("Masculino"); + const noDefinido = await recuperarCantidadGenero("Prefiero no decirlo"); + + return [femenino, masculino, noDefinido]; +} + +async function obtenerDatosEstados() { + try { + const estados = await recuperarCantidadEstado("Estados"); + + 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; + } catch (error) { + console.error("Error al obtener datos de estados:", error); + return []; + } +} + +async function obtenerDatosExamenes() { + try { + const examenes = await recuperarCantidadExamen("Examenes"); + + 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; + } catch (error) { + console.error("Error al obtener datos de examenes:", error); + return []; + } +} + + + +export { obtenerDatosGeneros, obtenerDatosEdades, obtenerDatosEstados, obtenerDatosExamenes }; \ No newline at end of file diff --git a/js/inicio.js b/js/inicio.js index d58114e..1adc04d 100644 --- a/js/inicio.js +++ b/js/inicio.js @@ -2,6 +2,7 @@ const allDropdown = document.querySelectorAll('#sidebar .side-dropdown'); const sidebar = document.getElementById('sidebar'); + allDropdown.forEach(item=> { const a = item.parentElement.querySelector('a:first-child'); a.addEventListener('click', function (e) { @@ -162,193 +163,194 @@ allProgress.forEach(item=> { +import { obtenerDatosGeneros, obtenerDatosEdades, obtenerDatosEstados,obtenerDatosExamenes } from './funcionesGraficos.js'; -// APEXCHART -var options = { - series: [{ - name: 'series1', - data: [31, 40, 28, 51, 42, 109, 100] -}, { - name: 'series2', - data: [11, 32, 45, 32, 34, 52, 41] -}], - chart: { - height: 350, - type: 'area' -}, -dataLabels: { - enabled: false -}, -stroke: { - curve: 'smooth' -}, -xaxis: { - type: 'datetime', - categories: ["2018-09-19T00:00:00.000Z", "2018-09-19T01:30:00.000Z", "2018-09-19T02:30:00.000Z", "2018-09-19T03:30:00.000Z", "2018-09-19T04:30:00.000Z", "2018-09-19T05:30:00.000Z", "2018-09-19T06:30:00.000Z"] -}, -tooltip: { - x: { - format: 'dd/MM/yy HH:mm' - }, -}, -}; +async function inicializarGrafico() { + const [femenino, masculino, noDefinido] = await obtenerDatosGeneros(); -var options2 = { - series: [{ - name: 'Net Profit', - data: [44, 55, 57, 56, 61, 58, 63, 60, 66] - }, { - name: 'Revenue', - data: [76, 85, 101, 98, 87, 105, 91, 114, 94] - }, { - name: 'Free Cash Flow', - data: [35, 41, 36, 26, 45, 48, 52, 53, 41] - }], - chart: { - type: 'bar', - height: 350 - }, - plotOptions: { - bar: { - horizontal: false, - columnWidth: '55%', - borderRadius: 5, - borderRadiusApplication: 'end' - }, - }, - dataLabels: { - enabled: false - }, - stroke: { - show: true, - width: 2, - colors: ['transparent'] - }, - xaxis: { - categories: ['Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct'], - }, - yaxis: { - title: { - text: '$ (thousands)' - } - }, - fill: { - opacity: 1 - }, - tooltip: { - y: { - formatter: function (val) { - return "$ " + val + " thousands" - } - } - } - }; + const options = { + series: [ + { name: 'Femenino', data: [femenino] }, + { 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"; + }, + }, + }, + }; - - var options3 = { - series: [ - { - data: [ - { - x: 'New Delhi', - y: 218 - }, - { - x: 'Kolkata', - y: 149 - }, - { - x: 'Mumbai', - y: 184 - }, - { - x: 'Ahmedabad', - y: 55 - }, - { - x: 'Bangaluru', - y: 84 - }, - { - x: 'Pune', - y: 31 - }, - { - x: 'Chennai', - y: 70 - }, - { - x: 'Jaipur', - y: 30 - }, - { - x: 'Surat', - y: 44 - }, - { - x: 'Hyderabad', - y: 68 - }, - { - x: 'Lucknow', - y: 28 - }, - { - x: 'Indore', - y: 19 - }, - { - x: 'Kanpur', - y: 29 - } - ] - } - ], - legend: { - show: false - }, - chart: { - height: 350, - type: 'treemap' - }, - title: { - text: 'Basic Treemap' - } - }; + const chart = new ApexCharts(document.querySelector("#chart"), options); + chart.render(); +} - var options4 = { - series: [14, 23, 21, 17, 15, 10, 12, 17, 21], - chart: { - type: 'polarArea', - }, - stroke: { - colors: ['#fff'] - }, - fill: { - opacity: 0.8 - }, - responsive: [{ - breakpoint: 480, - options: { - chart: { - width: 200 - }, - legend: { - position: 'bottom' - } - } - }] - }; +inicializarGrafico(); - var chart = new ApexCharts(document.querySelector("#polar"), options4); - chart.render(); +async function inicializarGrafico2() { + const [edad1,edad2,edad3,edad4,edad5,edad6,edad7] = await obtenerDatosEdades(); + + 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] }, + ], + 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"; + }, + }, + }, + }; + + const chart2 = new ApexCharts(document.querySelector("#chart2"), options2); + chart2.render(); +} + +inicializarGrafico2(); - var chart = new ApexCharts(document.querySelector("#chart"), options); - chart.render(); +async function inicializarGrafico3() { + try { + const estados = await obtenerDatosEstados(); - var chart = new ApexCharts(document.querySelector("#basic"), options2); - chart.render(); + if (!Array.isArray(estados)) { + console.error("Error: 'estados' no es un array. Verifica la funcion obtenerDatosEstados"); + return; + } - var basic = new ApexCharts(document.querySelector("#treemap"), options3); - basic.render(); \ No newline at end of file + const seriesData = estados.map(estado => ({ + name: estado.estado, + data: [estado.cantidad] + })); + + 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 chart3 = new ApexCharts(document.querySelector("#chart3"), options3); + chart3.render(); + } catch (error) { + console.error("Error al inicializar el gráfico 3:", error); + } +} + +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(); \ No newline at end of file diff --git a/php/buscarCodigo.php b/php/buscarCodigo.php new file mode 100644 index 0000000..5c0f240 --- /dev/null +++ b/php/buscarCodigo.php @@ -0,0 +1,53 @@ +<?php +// filepath: c:\xampp\htdocs\Proyecto_Lania\LANIA_Proyecto\php\buscarCodigo.php +include 'conexionBd.php'; // Asegúrate de que el archivo esté en la ruta correcta + +header('Content-Type: application/json'); // Aseguramos que la respuesta sea JSON + +// Crear instancia de la conexión +$conexion = new Conexion(); +$conexionBD = $conexion->conectar(); // Establecer conexión + +// Verificar que se ha enviado el parámetro 'codigo_postal' +if (isset($_GET['codigo_postal'])) { + $codigo_postal = $_GET['codigo_postal']; + + // Consulta SQL para obtener estado, ciudad y colonia en base al código postal + $sql = "SELECT e.nombre AS estado, m.nombre AS municipio, c.nombre AS colonia + FROM colonias c + JOIN municipios m ON c.municipio = m.id + JOIN estados e ON m.estado = e.id + WHERE c.codigo_postal = ?"; + + // Verificar que la conexión a la base de datos esté activa + if ($conexionBD) { + // Preparar la sentencia SQL + $stmt = $conexionBD->prepare($sql); + $stmt->bind_param("i", $codigo_postal); // El parámetro es un entero (i) + $stmt->execute(); + + // Obtener los resultados + $result = $stmt->get_result(); + + // Verificar si hay resultados + if ($result->num_rows > 0) { + $data = []; + while ($row = $result->fetch_assoc()) { + $data[] = $row; // Agregar cada resultado a un array + } + echo json_encode($data); // Devolver los resultados en formato JSON + } else { + echo json_encode([]); // Si no hay resultados, devolver un array vacío + } + + $stmt->close(); + } else { + echo json_encode(["error" => "Conexión a la base de datos fallida."]); + } + + $conexionBD->close(); +} else { + // Si no se recibe un código postal, respondemos con un error + echo json_encode(["error" => "Código postal no proporcionado."]); +} +?> \ No newline at end of file diff --git a/php/conexionBd.php b/php/conexionBd.php new file mode 100644 index 0000000..5aca671 --- /dev/null +++ b/php/conexionBd.php @@ -0,0 +1,26 @@ +<?php +class Conexion{ + private $host = "localhost"; + private $dbname = "lania_cc"; + private $user = "root"; + private $password = "password"; + private $conexion; + + + public function conectar() { + $this->conexion = new mysqli($this->host, $this->user, $this->password, $this->dbname); + + if ($this->conexion->connect_error) { + die('Error de conexión: ' . $this->conexion->connect_error); + } + + return $this->conexion; + } + + public function cerrarConexion() { + if ($this->conexion) { + $this->conexion->close(); + } + } +} +?> \ No newline at end of file diff --git a/php/graficos.php b/php/graficos.php new file mode 100644 index 0000000..6afdfec --- /dev/null +++ b/php/graficos.php @@ -0,0 +1,294 @@ +<?php +require_once './conexionBd.php'; + + +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $input = json_decode(file_get_contents('php://input'), true); + $tipoConsulta = $input['tipoConsulta'] ?? ''; + + $graficos = new Graficos(); + + switch ($tipoConsulta) { + case 'Femenino': + $cantidad = $graficos->obtenerGeneroFemenino(); + break; + case 'Masculino': + $cantidad = $graficos->obtenerGeneroMasculino(); + break; + case 'Prefiero no decirlo': + $cantidad = $graficos->obtenerGeneroNoDefinido(); + break; + case 'Menor de 18 años': + $cantidad = $graficos->obtenerEdadMenor18(); + break; + case '18 a 24 años': + $cantidad = $graficos->obtenerEdad1824(); + break; + case '25 a 34 años': + $cantidad = $graficos->obtenerEdad2434(); + break; + case '35 a 44 años': + $cantidad = $graficos->obtenerEdad3544(); + break; + case '45 a 54 años': + $cantidad = $graficos->obtenerEdad4554(); + break; + case '55 a 64 años': + $cantidad = $graficos->obtenerEdad5564(); + break; + case '65 años o más': + $cantidad = $graficos->obtenerEdad65oMas(); + break; + case 'Estados': + $cantidad = $graficos->obtenerEstados(); + echo json_encode($cantidad); // Devolver directamente el array de estados + exit; // Terminar la ejecucion aqui + case 'Examenes': + $cantidad = $graficos->obtenerExamenes(); + echo json_encode($cantidad); // Devolver directamente el array de examenes + exit; // Terminar la ejecucion aqui + default: + $cantidad = 0; + } + + echo json_encode(['cantidad' => $cantidad]); +} + +class Graficos{ + private $conexion; + protected $db; + + public function __construct() { + $this->conexion = new Conexion(); + $this->db = $this->conexion->conectar(); + } + + + public function obtenerGeneroFemenino() { + $query = $this->db->prepare("SELECT COUNT(*) AS Femenino FROM candidato WHERE id_genero = 2 "); + $query->execute(); + $resultado = $query->get_result(); + $output = "0"; + + if($resultado->num_rows > 0) { + while ($data = $resultado->fetch_assoc()) { + $output= $data['Femenino']; + } + } + $query->close(); + $this->db->close(); + + return $output; + } + + public function obtenerGeneroMasculino() { + $query = $this->db->prepare("SELECT COUNT(*) AS Maculino FROM candidato WHERE id_genero = 1 "); + $query->execute(); + $resultado = $query->get_result(); + $output = "0"; + + if($resultado->num_rows > 0) { + while ($data = $resultado->fetch_assoc()) { + $output= $data['Maculino']; + } + } + $query->close(); + $this->db->close(); + + return $output; + } + + public function obtenerGeneroNoDefinido() { + $query = $this->db->prepare("SELECT COUNT(*) AS NoDefinido FROM candidato WHERE id_genero = 3 "); + $query->execute(); + $resultado = $query->get_result(); + $output = "0"; + + if($resultado->num_rows > 0) { + while ($data = $resultado->fetch_assoc()) { + $output= $data['NoDefinido']; + } + } + $query->close(); + $this->db->close(); + + return $output; + } + + public function obtenerEdadMenor18() { + $query = $this->db->prepare("SELECT COUNT(*) AS menorEdad FROM candidato WHERE id_rango_edad = 1"); + $query->execute(); + $resultado = $query->get_result(); + $output = "0"; + + if($resultado->num_rows > 0) { + while ($data = $resultado->fetch_assoc()) { + $output= $data['menorEdad']; + } + } + $query->close(); + $this->db->close(); + + return $output; + } + + public function obtenerEdad1824() { + $query = $this->db->prepare("SELECT COUNT(*) AS edad1824 FROM candidato WHERE id_rango_edad = 2"); + $query->execute(); + $resultado = $query->get_result(); + $output = "0"; + + if($resultado->num_rows > 0) { + while ($data = $resultado->fetch_assoc()) { + $output= $data['edad1824']; + } + } + $query->close(); + $this->db->close(); + + return $output; + } + + public function obtenerEdad2434() { + $query = $this->db->prepare("SELECT COUNT(*) AS edad2434 FROM candidato WHERE id_rango_edad = 3"); + $query->execute(); + $resultado = $query->get_result(); + $output = "0"; + + if($resultado->num_rows > 0) { + while ($data = $resultado->fetch_assoc()) { + $output= $data['edad2434']; + } + } + $query->close(); + $this->db->close(); + + return $output; + } + + public function obtenerEdad3544() { + $query = $this->db->prepare("SELECT COUNT(*) AS edad3544 FROM candidato WHERE id_rango_edad = 4"); + $query->execute(); + $resultado = $query->get_result(); + $output = "0"; + + if($resultado->num_rows > 0) { + while ($data = $resultado->fetch_assoc()) { + $output= $data['edad3544']; + } + } + $query->close(); + $this->db->close(); + + return $output; + } + + + public function obtenerEdad4554() { + $query = $this->db->prepare("SELECT COUNT(*) AS edad4554 FROM candidato WHERE id_rango_edad = 5"); + $query->execute(); + $resultado = $query->get_result(); + $output = "0"; + + if($resultado->num_rows > 0) { + while ($data = $resultado->fetch_assoc()) { + $output= $data['edad4554']; + } + } + $query->close(); + $this->db->close(); + + return $output; + } + + + public function obtenerEdad5564() { + $query = $this->db->prepare("SELECT COUNT(*) AS edad5564 FROM candidato WHERE id_rango_edad = 6"); + $query->execute(); + $resultado = $query->get_result(); + $output = "0"; + + if($resultado->num_rows > 0) { + while ($data = $resultado->fetch_assoc()) { + $output= $data['edad5564']; + } + } + $query->close(); + $this->db->close(); + + return $output; + } + + public function obtenerEdad65oMas() { + $query = $this->db->prepare("SELECT COUNT(*) AS edad65oMas FROM candidato WHERE id_rango_edad = 7"); + $query->execute(); + $resultado = $query->get_result(); + $output = "0"; + + if($resultado->num_rows > 0) { + while ($data = $resultado->fetch_assoc()) { + $output= $data['edad65oMas']; + } + } + $query->close(); + $this->db->close(); + + return $output; + } + + public function obtenerEstados() { + try { + $query = $this->db->prepare(" + SELECT estados.nombre AS estado, COUNT(*) AS cantidad + FROM estados + INNER JOIN info_candidatos ON info_candidatos.id_estado = estados.id + GROUP BY estados.nombre + ORDER BY estados.nombre + "); + $query->execute(); + $resultado = $query->get_result(); + + $estados = []; + while ($data = $resultado->fetch_assoc()) { + $estados[] = $data; + } + + $query->close(); + + error_log(json_encode($estados)); + return $estados; + } catch (Exception $e) { + error_log("Error al obtener los estados: " . $e->getMessage()); + return []; + } +} + +public function obtenerExamenes() { + try { + $query = $this->db->prepare("SELECT nombre_examen AS examen , COUNT(*) AS cantidad + FROM examen + INNER JOIN candidato ON candidato.id_examen = examen.id_examen + GROUP BY nombre_examen + ORDER BY nombre_examen; + "); + $query->execute(); + $resultado = $query->get_result(); + + $examenes = []; + while ($data = $resultado->fetch_assoc()) { + $examenes[] = $data; + } + + $query->close(); + + error_log(json_encode($examenes)); + return $examenes; + } catch (Exception $e) { + error_log("Error al obtener los examenes: " . $e->getMessage()); + return []; + } +} + +} + +?> \ No newline at end of file