diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..62c8935 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea/ \ No newline at end of file diff --git a/controllers/CandidatoController.php b/controllers/CandidatoController.php index 448b184..fb8c357 100644 --- a/controllers/CandidatoController.php +++ b/controllers/CandidatoController.php @@ -22,8 +22,8 @@ class CandidatoController { $id_tipo_id = $_POST['id_tipo_id']; $id_rango_edad = $_POST['id_rango_edad']; $id_genero = $_POST['id_genero']; - - $insertId = self::$candidatoModel->registrarCandidato( + + return self::$candidatoModel->registrarCandidato( $nombres, $primer_apellido, $segundo_apellido, @@ -34,12 +34,27 @@ class CandidatoController { $id_rango_edad, $id_genero ); - - return $insertId; } public static function registrarInfoCandidato() { $id_candidato = $_POST['id_candidato']; + + $exiteInfo = self::existeRegistroInfoCandidato($id_candidato); + if ($exiteInfo) { + return [ + "estado" => "error", + "mensaje" => "Ya existe un registro de información para este candidato." + ]; + } + + if(!self::existeIdCandidato($id_candidato)){ + return [ + "estado" => "error", + "mensaje" => "El ID del candidato no existe." + ]; + } + + $id_pais = $_POST['id_pais']; $id_estado = $_POST['id_estado']; $id_municipio = $_POST['id_municipio']; @@ -50,8 +65,10 @@ class CandidatoController { $motivo_examen = $_POST['motivo_examen']; $calificacion_servicio = $_POST['calificacion_servicio']; $consentimiento_pub = $_POST['consentimiento_pub']; - - $insertId = self::$candidatoModel->registrarInfoCandidatos( + + $fecha_salida = $_POST['fecha_salida']; + + return self::$candidatoModel->registrarInfoCandidatos( $id_candidato, $id_pais, $id_estado, @@ -62,10 +79,22 @@ class CandidatoController { $nombre_empresa_institucion, $motivo_examen, $calificacion_servicio, - $consentimiento_pub + $consentimiento_pub, + $fecha_salida ); + } - return $insertId; + public static function existeRegistroInfoCandidato($id_candidato) { + return self::$candidatoModel->verificarRegistroInfoCandidato($id_candidato); + } + + public static function existeIdCandidato($id_candidato){ + $resultado = self::$candidatoModel->existeIdCandidato($id_candidato); + if($resultado['estado'] === 'exitoso'){ + return true; + } else { + return false; + } } } diff --git a/controllers/CatalogosController.php b/controllers/CatalogosController.php index de417bd..5ff85f8 100644 --- a/controllers/CatalogosController.php +++ b/controllers/CatalogosController.php @@ -1,6 +1,6 @@ <?php -require_once __DIR__ . '/../models/Catalogos.php'; +require_once __DIR__ . '/../models/CatalogosModel.php'; class CatalogosController { private static $catalogosModel = null; @@ -12,20 +12,81 @@ class CatalogosController { } public static function obtenerInfiCodigoPostal($codigo_postal){ - $result = self::$catalogosModel->obtenerInfiCodigoPostal($codigo_postal); - return $result; + return self::$catalogosModel->obtenerInfiCodigoPostal($codigo_postal); + } + + public static function obtenerGiros(){ + return self::$catalogosModel->obtenerGiros(); + } + + public static function obtenerNombresExamenes(){ + return self::$catalogosModel->obtenerNombresExamenes(); + } + + public static function obtenerTiposIdentificacion(){ + return self::$catalogosModel->obtenerTiposIdentificacion(); + } + + public static function obtenerRangosEdad(){ + return self::$catalogosModel->obtenerRangosEdad(); + } + + public static function obtenerNivelesEstudio(){ + return self::$catalogosModel->obtenerNivelesEstudio(); + } + + public static function obtenerNombresEmpresasInstituciones(){ + return self::$catalogosModel->obtenerNombresEmpresasInstituciones(); } } CatalogosController::inicializar(); -if($_SERVER['REQUEST_METHOD'] == 'GET' && isset($_GET['codigo_postal'])) { +// Petición GET para información del código postal +if($_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['codigo_postal'])) { header('Content-Type: application/json'); $codigo_postal = $_GET['codigo_postal']; $result = CatalogosController::obtenerInfiCodigoPostal($codigo_postal); - echo $result; + echo json_encode($result); } +if($_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['obtener']) && $_GET['obtener'] === 'giros') { + header('Content-Type: application/json'); + $result = CatalogosController::obtenerGiros(); + echo json_encode($result); +} + +if($_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['obtener']) && $_GET['obtener'] === 'examenes') { + header('Content-Type: application/json'); + $result = CatalogosController::obtenerNombresExamenes(); + echo json_encode($result); +} + +if($_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['obtener']) && $_GET['obtener'] === 'identificacion') { + header('Content-Type: application/json'); + $result = CatalogosController::obtenerTiposIdentificacion(); + echo json_encode($result); +} + +if($_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['obtener']) && $_GET['obtener'] === 'rangosedad') { + header('Content-Type: application/json'); + $result = CatalogosController::obtenerRangosEdad(); + echo json_encode($result); +} + +if($_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['obtener']) && $_GET['obtener'] === 'nivelesestudio') { + header('Content-Type: application/json'); + $result = CatalogosController::obtenerNivelesEstudio(); + echo json_encode($result); +} + +if($_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['obtener']) && $_GET['obtener'] === 'empresasinstituciones') { + header('Content-Type: application/json'); + $result = CatalogosController::obtenerNombresEmpresasInstituciones(); + echo json_encode($result); +} + + ?> \ No newline at end of file diff --git a/controllers/registrarInfoCandidato.php b/controllers/registrarInfoCandidato.php index 239a5a2..16dd02a 100644 --- a/controllers/registrarInfoCandidato.php +++ b/controllers/registrarInfoCandidato.php @@ -4,11 +4,20 @@ require_once __DIR__ . '/CandidatoController.php'; // Manejar la solicitud POST para registrar información un candidato if ($_SERVER['REQUEST_METHOD'] === 'POST') { - $insertId = CandidatoController::registrarInfoCandidato(); - if($insertId > 0){ - echo json_encode(['registroExitoso' => true, 'message' => 'Se ha registrado la información correctamente.']); - } else { - echo json_encode(['registroExitoso' => false, 'message' => 'Error al registrar la información.']); + $respuesta = CandidatoController::registrarInfoCandidato(); + + if(isset($respuesta["estado"]) && $respuesta["estado"] === "exitoso") { + echo json_encode([ + "estado" => "exitoso", + "mensaje" => "Se ha registrado la información correctamente.", + "res" => "id_candidato: " . $respuesta["mensaje"] + ]); + } else if( isset($respuesta["estado"]) ){ + echo json_encode([ + "estado" => "error", + "mensaje" => "Error al registrar la información.", + "res" => $respuesta["mensaje"] + ]); } } diff --git a/form_datos_basicos.html b/form_datos_basicos.html index 5e90348..4c2110b 100644 --- a/form_datos_basicos.html +++ b/form_datos_basicos.html @@ -123,57 +123,28 @@ <div> <label for="id_examen">Examen:</label> <select name="id_examen" id="id_examen" required> - <option value="">Selecciona un examen</option> - <option value="1">Cisco</option> - <option value="2">IBM</option> - <option value="3">Microsoft</option> - <option value="4">Oracle</option> - <option value="5">SAP</option> - <option value="6">CompTIA</option> - <option value="7">Amazon Web Services</option> - <option value="8">Google Cloud Platform</option> - <option value="9">Salesforce</option> - <option value="10">Red Hat</option> - <option value="11">VMWare</option> - <option value="12">Palo Alto Networks</option> - <option value="13">Fornitet</option> - <option value="14">Juniper Networks</option> - <option value="15">Otros</option> + <option value="NULL">Selecciona un examen</option> </select><br> </div> <div> <label for="id_tipo_id">Tipo de Identificación:</label> <select name="id_tipo_id" id="id_tipo_id" required> - <option value="">Selecciona el tipo de identificación</option> - <option value="1">INE</option> - <option value="2">Pasaporte</option> - <option value="3">CURP</option> - <option value="4">RFC</option> - <option value="5">Cédila Profesional</option> - <option value="6">Licencia de conducir</option> - <option value="7">Otro</option> + <option value="NULL">Selecciona el tipo de identificación</option> </select><br> </div> <div> <label for="id_rango_edad">Rango de edad:</label> <select name="id_rango_edad" id="id_rango_edad" required> - <option value="">Selecciona un rango de edad</option> - <option value="1">Menos de 18</option> - <option value="2">18-24</option> - <option value="3">24-34</option> - <option value="4">35-44</option> - <option value="5">45-54</option> - <option value="6">55-64</option> - <option value="7">65 o más</option> + <option value="NULL">Selecciona un rango de edad</option> </select><br> </div> <div> <label for="id_genero">Género:</label> <select name="id_genero" id="id_genero" required> - <option value="">Selecciona un género</option> + <option value="NULL">Selecciona un género</option> <option value="1">Masculino</option> <option value="2">Femenino</option> <option value="3">Prefiero no decir</option> @@ -192,7 +163,7 @@ <!-- NAVBAR --> <script src="js/form.js"></script> - <script src="js/form_datos_basicos.js""" + <script src="js/form_datos_basicos.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/form_datos_extendidos.html b/form_datos_extendidos.php similarity index 56% rename from form_datos_extendidos.html rename to form_datos_extendidos.php index 68ce611..b44da9f 100644 --- a/form_datos_extendidos.html +++ b/form_datos_extendidos.php @@ -1,3 +1,15 @@ +<?php +if($_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['id_candidato'])){ + // Verifica si se ha pasado el id_candidato como parámetro GET + $id_candidato = $_GET['id_candidato']; + // Si no se pasa el id_candidato + //header("Location: inicio.html"); + //exit(); +} else { // TEST // + $id_candidato = 0; +} // TEST \\ +?> + <!DOCTYPE html> <html lang="en"> <head> @@ -81,66 +93,69 @@ <!-- MAIN --> <main> - <h1 class="title">Datos Extendidos</h1> + <h1 class="title">Datos</h1> <ul class="breadcrumbs"> - <li><a href="#">Formularios</a></li> + <li><a href="#">Formulario</a></li> <li class="divider">/</li> - <li><a href="#" class="active">Datos Extendidos</a></li> + <li><a href="#" class="active">Datos</a></li> </ul> <div class="form-container"> + <!-- Formulario --> <form id="formulario-datos-extendido" method="post" action="#"> <div class="form-section"> <br> <h3>Ubicación</h3> <br> <div class="form-row"> - <input type="hidden" id="id_candidato" name="id_candidato"> + <label for="id_candidato">ID del candidato</label> + <input type="number" id="id_candidato" name="id_candidato" value="<?php echo $id_candidato; ?>"> + <div class="form-col"> <div class="form-group"> <label for="id_pais" class="required">País</label> <select id="id_pais" name="id_pais" required> - <option value="">Seleccione...</option> - <!-- Aquí irían los países desde la base de datos --> + <option value="NULL">Seleccione su país</option> <option value="1">México</option> <option value="2">Otro</option> </select> </div> </div> + <div class="form-col"> <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> + <label for="codigo_postal">Código postal</label> + <input type="number" id="codigo_postal" name="codigo_postal" maxlength="5" disabled> + <br> + <input type="button" class="btn" id="buscarBtn" value="Buscar" disabled> </div> </div> <div class="form-col"> <div class="form-group"> <label for="id_estado">Estado</label> - <select id="id_estado" name="id_estado"> - <option value="">Seleccione...</option> + <select id="id_estado" name="id_estado" disabled> + <option value="NULL">Seleccione su estado</option> <!-- Aquí irían los estados desde la base de datos --> </select> </div> </div> - </div> - - <div class="form-row"> + <div class="form-col"> <div class="form-group"> <label for="id_municipio">Municipio</label> - <select id="id_municipio" name="id_municipio"> - <option value="">Seleccione...</option> + <select id="id_municipio" name="id_municipio" disabled> + <option value="NULL">Seleccione su municipio</option> <!-- Aquí irían los municipios desde la base de datos --> </select> </div> </div> + <div class="form-col"> <div class="form-group"> <label for="id_colonia">Colonia</label> - <select id="id_colonia" name="id_colonia"> - <option value="">Seleccione...</option> + <select id="id_colonia" name="id_colonia" disabled> + <option value="NULL">Seleccione su colonia</option> <!-- Aquí irían las colonias desde la base de datos --> </select> </div> @@ -151,81 +166,58 @@ <!-- Sección 3: Información Académica y Laboral --> <div class="form-section"> <br> - <h3>Información Académica/Laboral</h3> + <h3>Información académica/laboral</h3> <br> <div class="form-row"> - <div class="form-col"> - <div class="form-group"> - <label for="id_nivel" class="required">Nivel de Estudios</label> - <select id="id_nivel" name="id_nivel" required> - <option value="">Seleccione...</option> - <option value="1">Primaria</option> - <option value="2">Secundaria</option> - <option value="3">Bachillerato</option> - <option value="4">Técnico Superior Universitario</option> - <option value="5">Licenciatura</option> - <option value="6">Maestría</option> - <option value="7">Doctorado</option> - <option value="8">Otro</option> - </select> - </div> - </div> - <div class="form-col"> - <div class="form-group"> - <label for="id_giro" class="required">Giro</label> - <select id="id_giro" name="id_giro" required> - <option value="">Seleccione...</option> - <option value="1">Tecnologías de la Información</option> - <option value="2">Gobierno</option> - <option value="3">Finanzas</option> - <option value="4">Salud</option> - <option value="5">Educación</option> - <option value="6">Telecomunicaciones</option> - <option value="7">Retail</option> - <option value="8">Manufactura</option> - <option value="9">Logística y Transporte</option> - <option value="10">Construcción</option> - <option value="11">Turismo y Hospitalidad</option> - <option value="12">Energía y Recursos Naturales</option> - <option value="13">Agricultura y Alimentación</option> - <option value="14">Medios de Comunicación y Entretenimiento</option> - <option value="15">Otros</option> - </select> - </div> - </div> - </div> - - <div class="form-group"> - <label for="nombre_empresa">Nombre de la Empresa/Institución</label> - <input type="text" id="nombre_empresa" name="nombre_empresa" - maxlength="100"> - </div> - - <div class="form-group"> - <label for="motivo_examen">Motivo del Examen</label> - <textarea id="motivo_examen" name="motivo_examen" rows="3"></textarea> - </div> + <div class="form-col"> + <div class="form-group"> + <label for="id_nivel" class="required">Nivel de Estudios</label> + <select id="id_nivel" name="id_nivel" required> + <option value="NULL">Seleccione una opción</option> + </select> + </div> + </div> + + <div class="form-col"> + <div class="form-group"> + <label for="nombre_empresa">Nombre de la empresa/institución</label> + <input type="text" id="nombre_empresa" list="sugerencias_ei" maxlength="100"> + <datalist id="sugerencias_ei"></datalist> + </div> + </div> + + <div class="form-col"> + <div class="form-group"> + <label for="id_giro" class="required">Giro de la empresa/institución</label> + <select id="id_giro" name="id_giro" required> + <option value="NULL">Seleccione una opción</option> + </select> + </div> + </div> + + <div class="form-group"> + <label for="motivo_examen">Motivo del Examen</label> + <textarea id="motivo_examen" name="motivo_examen" rows="3"></textarea> + </div> + </div> </div> <!-- Sección 4: Evaluación y Consentimiento --> <div class="form-section"> - - <br> - <h3>Evaluación y Consentimiento</h3> - <br> + <br><h3>Evaluación</h3><br> <div class="form-group"> - <p>Calificación del Servicio</p> + <p>Calificación del servicio</p> <br> - <label for="calificacion_servicio">¿Qué tan satisfecho estás con nuestra institución en general, considerando la calidad de las instalaciones, la atención del personal y el proceso de certificación?</label> + <label for="calificacion_servicio">Considerando la calidad de las instalaciones, la atención del personal y el proceso de certificación, ¿cuál es su nivel general de satisfacción con nuestra institución?</label> <br> <select id="calificacion_servicio" name="calificacion_servicio" class="select-emoji"> - <option value="">Seleccione una calificación...</option> - <option value="1">😡 Muy insatisfecho</option> - <option value="2">😕 Insatisfecho</option> - <option value="3">😐 Neutral</option> - <option value="4">🙂 Satisfecho</option> - <option value="5">😄 Muy satisfecho</option> + <option value="NULL">Seleccione una calificación...</option> + <option value="1">🙁 Muy insatisfecho</option> + <option value="2">😕 Insatisfecho</option> + <option value="3">😐 Neutral</option> + <option value="4">🙂 Satisfecho</option> + <option value="5">😐 Muy satisfecho</option> </select> </div> @@ -233,7 +225,7 @@ <div class="form-group"> <input type="checkbox" id="consentimiento_pub" name="consentimiento_pub" value="1" checked> - <label for="consentimiento_pub" style="display: inline;">Doy mi consentimiento para la publicación de mis datos</label> + <label for="consentimiento_pub" style="display: inline;">Consiento que mis datos personales sean tratados de conformidad con los términos y condiciones informados en el presente <a href="#">aviso de privacidad</a>.</label> </div> </div> @@ -254,7 +246,7 @@ <script src="js/form.js"></script> <script src="js/form_datos_extendidos.js"></script> - <script src="js/buscarCodigo.js"></script> + <!-- <script src="js/buscarCodigo.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/inicio.html b/inicio.html index 7bf8faf..20fd276 100644 --- a/inicio.html +++ b/inicio.html @@ -33,7 +33,7 @@ <a href="#"><i class='bx bxs-notepad icon' ></i> Formularios <i class='bx bx-chevron-right icon-right' ></i></a> <ul class="side-dropdown"> <li><a href="form_datos_basicos.html">Datos Básicos</a></li> - <li><a href="form_datos_extendidos.html">Datos Extendidos</a></li> + <li><a href="form_datos_extendidos.php">Datos Extendidos</a></li> </ul> </li> </ul> diff --git a/js/buscarCodigo b/js/buscarCodigo new file mode 100644 index 0000000..c13022a --- /dev/null +++ b/js/buscarCodigo @@ -0,0 +1,140 @@ +document.addEventListener("DOMContentLoaded", function () { + const buscarBtn = document.getElementById("buscarBtn"); + const paisSelect = document.getElementById("id_pais"); + const inputCodigoPostal = document.getElementById("codigo_postal"); + const inputButtonBuscarCodigoPostal = document.getElementById("buscarBtn"); + const estadoSelect = document.getElementById("id_estado"); + const municipioSelect = document.getElementById("id_municipio"); + const coloniaSelect = document.getElementById("id_colonia"); + const giroSelect = document.getElementById("id_giro"); + + llenarSelectGiro(); + + // Añadir un evento de cambio al select de país + paisSelect.addEventListener("change", function() { + // Si el país es México, habilitar el campo de código postal + if (paisSelect.value === "1") { + inputCodigoPostal.removeAttribute("disabled"); + inputButtonBuscarCodigoPostal.removeAttribute("disabled"); + } else { + // Si el país no es México, deshabilitar el campo de código postal + inputCodigoPostal.setAttribute("disabled", "disabled"); + inputButtonBuscarCodigoPostal.setAttribute("disabled", "disabled"); + } + }); + + //Añadir un evento al boton de buscar + buscarBtn.addEventListener("click", function () { + let inputCodigoPostal = document.getElementById("codigo_postal").value; + + //verificar si el codigo postal esta vacio + if (inputCodigoPostal) { + + // Limpia los selects antes de llenarlos + estadoSelect.innerHTML = "<option value='NULL'>Seleccione su estado</option>"; + municipioSelect.innerHTML = "<option value='NULL'>Seleccione su municipio</option>"; + coloniaSelect.innerHTML = "<option value='NULL'>Seleccione su colonia</option>"; + + // Construye la URL para la solicitud + let url = "./controllers/CatalogosController.php?codigo_postal=" + encodeURIComponent(inputCodigoPostal); + + // 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.json()); + + // Verifica si la respuesta del servidor es exitosa + if (!response.ok) { + throw new Error("Error en la respuesta del servidor"); + } + + // Convertir la respuesta a JSON + return response.json(); + }) + .then(data => { + // Verifica si se recibieron datos + if (data.length > 0) { + + // Quitar disable a los selects + estadoSelect.removeAttribute("disabled"); + estadoSelect.setAttribute("required", "required"); + municipioSelect.removeAttribute("disabled"); + municipioSelect.setAttribute("required", "required"); + coloniaSelect.removeAttribute("disabled"); + coloniaSelect.setAttribute("required", "required"); + + //Crea conjuntos para almacenar estados, ciudades y colonias + let estados = new Map(); + let municipios = new Map(); + let colonias = new Map(); + + // Itera sobre cada fila de datos recibidos + data.forEach(row => { + console.log(row); + estados.set(row['id_estado'], row['estado']); + municipios.set(row['id_municipio'], row['municipio']); + colonias.set(row['id_colonia'], row['colonia']); + }); + + // Añade las opciones de estados al elemento select + for (let [id_estado, estado] of estados) { + estadoSelect.innerHTML += "<option value='" + id_estado + "'>" + estado + "</option>"; + } + + // Añade las opciones de ciudades al elemento select + for (let [id_municipio, municipio] of municipios) { + municipioSelect.innerHTML += "<option value='" + id_municipio + "'>" + municipio + "</option>"; + } + + // Añade las opciones de colonias al elemento select + for (let [id_colonia, colonia] of colonias) { + coloniaSelect.innerHTML += "<option value='" + id_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."); + } + }); + + + function llenarSelectGiro() { + + // URL para la solicitud + let url = "./controllers/CatalogosController.php?obtener=giros"; + + // Realiza una solicitud HTTP GET a la URL especificada + fetch(url) + .then(response => { + // Verifica si la respuesta del servidor es exitosa + if (!response.ok) { + throw new Error("Error en la respuesta del servidor"); + } + + // Convertir la respuesta a JSON + return response.json(); + }) + .then(data => { + // Verifica si se recibieron datos + if (data.length > 0) { + + // Añade las opciones de giros al elemento select + data.forEach(row => { + giroSelect.innerHTML += "<option value='" + row.id_giro + "'>" + row.descripcion + "</option>"; + }); + } else { + alert("No se encontraron datos para los giros."); + } + }) + .catch(error => { + console.error("Error en la solicitud:", error); + }); + } +}); diff --git a/js/buscarCodigo.js b/js/buscarCodigo.js deleted file mode 100644 index b821922..0000000 --- a/js/buscarCodigo.js +++ /dev/null @@ -1,76 +0,0 @@ -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) { - console.log("Código postal ingresado:", codigoPostal); - //crear la url para la peticion - const url = "./controllers/CatalogosController.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.json()); - // Verifica si la respuesta del servidor es exitosa - if (!response.ok) { - throw new Error("Error en la respuesta del servidor"); - } - //Convierte la respuesta que es unu array de objetos 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/form_datos_basicos.js b/js/form_datos_basicos.js index f3c8cb3..912fb6a 100644 --- a/js/form_datos_basicos.js +++ b/js/form_datos_basicos.js @@ -1,6 +1,101 @@ const formulario = document.getElementById("formulario-datos-basicos"); const notificacion = document.getElementById("mensaje-error"); +obtenerNombresExamenes(); +obtenerTiposIdentificacion(); +obtenerRangosEdad(); + +function obtenerNombresExamenes(){ + let url = "./controllers/CatalogosController.php?obtener=examenes"; + fetch(url) + .then(response => response.json()) + .then(data => { + const selectExamen = document.getElementById('id_examen'); + let examen = new Map(); + + // Iterar sobre cada fila y mapear por por id_examen, nombre_examen + data.forEach(row =>{ + examen.set(row['id_examen'], row['nombre_examen']); + }) + + // LLenar opciones del select de examen + for (let [id_examen, nombre_examen] of examen) { + selectExamen.innerHTML += "<option value='" + id_examen + "'>" + nombre_examen + "</option>"; + } + + }) + .catch(error => console.error('Error al obtener los exámenes:', error)); +} + +function obtenerTiposIdentificacion(){ + let url = "./controllers/CatalogosController.php?obtener=identificacion"; + fetch(url) + .then(response => response.json()) + .then(data => { + const selectTipoId = document.getElementById('id_tipo_id'); + + let tipoId = new Map(); + + // Iterar sobre cada fila y mapear por por id_tipo_id, descripcion + data.forEach(row =>{ + tipoId.set(row['id_tipo_id'], row['descripcion']); + }) + + // LLenar opciones del select de examen + for (let [id_tipo_id, descripcion] of tipoId) { + selectTipoId.innerHTML += "<option value='" + id_tipo_id + "'>" + descripcion + "</option>"; + } + }) + .catch(error => console.error('Error al obtener los tipos de identificación:', error)); +} + +function obtenerRangosEdad(){ + let url = "./controllers/CatalogosController.php?obtener=rangosedad"; + fetch(url) + .then(response => response.json()) + .then(data => { + const selectRangoEdad = document.getElementById('id_rango_edad'); + + let tipoId = new Map(); + + // Iterar sobre cada fila y mapear por por id_tipo_id, descripcion + data.forEach(row =>{ + tipoId.set(row['id_rango_edad'], row['descripcion']); + }) + + // LLenar opciones del select de examen + for (let [id_rango_edad, descripcion] of tipoId) { + selectRangoEdad.innerHTML += "<option value='" + id_rango_edad + "'>" + descripcion + "</option>"; + } + }) + .catch(error => console.error('Error al obtener rangos de edad:', error)); +} + +// Validaciones - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +function selectExamenValido(){ + const selectExamen = document.getElementById('id_examen'); + const idExamen = selectExamen.value; + return idExamen !== "NULL"; +} + +function selectTipoIdentificacionValido(){ + const selectTipoId = document.getElementById('id_tipo_id'); + const idTipoId = selectTipoId.value; + return idTipoId !== "NULL"; +} + +function selectRangoEdadValido(){ + const selectRangoEdad = document.getElementById('id_rango_edad'); + const idRangoEdad = selectRangoEdad.value; + return idRangoEdad !== "NULL"; +} + +function selectGeneroValido(){ + const selectGenero = document.getElementById('id_genero'); + const idGenero = selectGenero.value; + return idGenero !== "NULL"; +} // Función para validar el nombre function validarNombre(nombre) { const nombreRegex = /^[a-zA-ZÀ-ÿ\s]+$/; // Permite letras y espacios @@ -25,6 +120,8 @@ function validarCorreo(correo) { return correoRegex.test(correo); } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Validaciones + formulario.addEventListener("submit", async(event) => { event.preventDefault(); @@ -75,6 +172,19 @@ formulario.addEventListener("submit", async(event) => { errores.push("El número telefónico debe ser un número de 10 dígitos. "); } + if(!selectExamenValido()){ + errores.push("Seleccione un examen. "); + } + if(!selectTipoIdentificacionValido()){ + errores.push("Seleccione un tipo de identificación. "); + } + if(!selectRangoEdadValido()){ + errores.push("Seleccione un rango de edad. "); + } + if(!selectGeneroValido()){ + errores.push("Seleccione un género. "); + } + // Si hay errores, mostrarlos y detener el envío if (errores.length > 0) { notificacion.textContent = errores.join("\n"); @@ -84,9 +194,8 @@ formulario.addEventListener("submit", async(event) => { // Preparar datos para envío const formData = new FormData(); - //formData.append("id_candidato", idCandidato); - //formData.append("fecha_entrada", fechaEntrada); - //formData.append("fecha_salida", fechaSalida); + //formData.append("fecha_entrada", fechaEntrada); // No se usa porque tiene valor default + //formData.append("fecha_salida", fechaSalida); // Se llena al completar el otro formulario de información formData.append("nombres", nombres); formData.append("primer_apellido", primerApellido); formData.append("segundo_apellido", segundoApellido); @@ -103,10 +212,10 @@ formulario.addEventListener("submit", async(event) => { method: "POST", body: formData, }); - + // Obtener respuesta de petición de registro const resultado = await respuesta.json(); - + // Verificar si el registro fue exitoso if (resultado.registroExitoso) { alert('Se guardó la información correctamente'); diff --git a/js/form_datos_extendidos.js b/js/form_datos_extendidos.js index b40ef89..c4dcd97 100644 --- a/js/form_datos_extendidos.js +++ b/js/form_datos_extendidos.js @@ -1,65 +1,353 @@ -const formulario = document.getElementById("formulario-datos-extendido"); -const notificacion = document.getElementById("mensaje-error"); +document.addEventListener("DOMContentLoaded", function () { + const formulario = document.getElementById("formulario-datos-extendido"); + const notificacion = document.getElementById("mensaje-error"); + const buscarBtn = document.getElementById("buscarBtn"); + const paisSelect = document.getElementById("id_pais"); + const inputCodigoPostal = document.getElementById("codigo_postal"); + const inputButtonBuscarCodigoPostal = document.getElementById("buscarBtn"); + const estadoSelect = document.getElementById("id_estado"); + const municipioSelect = document.getElementById("id_municipio"); + const coloniaSelect = document.getElementById("id_colonia"); + const giroSelect = document.getElementById("id_giro"); + const nivelEstudioSelect = document.getElementById("id_nivel"); + const selectCalificacionServicio = document.getElementById("calificacion_servicio"); + const dataListEmpresasInstituciones = document.getElementById("sugerencias_ei"); -formulario.addEventListener("submit", async(event) => { - event.preventDefault(); - - // Limpiar mensaje de error previo - notificacion.textContent = ""; - notificacion.style.display = "none"; + llenarSelectGiro(); + llenarSelectNivelesEstudio(); + llenarDataListEmpresasInstituciones(); - // Obtener valores de los campos - const idCandidato = document.getElementById('id_candidato').value; - const idPais = document.getElementById('id_pais').value; - const codigoPostal = document.getElementById('codigo_postal').value; // campo numérico, no necesita trim - const idEstado = document.getElementById('id_estado').value; - const idMunicipio = document.getElementById('id_municipio').value; - const idColonia = document.getElementById('id_colonia').value; - - const idNivel = document.getElementById('id_nivel').value; - const idGiro = document.getElementById('id_giro').value; - const nombreEmpresa = document.getElementById('nombre_empresa').value.trim(); - const motivoExamen = document.getElementById('motivo_examen').value.trim(); - - const calificacionServicio = document.getElementById('calificacion_servicio').value; - const consentimientoPub = document.getElementById('consentimiento_pub').checked; - - var id = 6; + // FUNCIONES - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + function llenarSelectGiro() { + // URL para la solicitud + let url = "./controllers/CatalogosController.php?obtener=giros"; - // Preparar datos para envío - const formData = new FormData(); - formData.append("id_candidato", id); - formData.append("id_pais", idPais); - formData.append("codigo_postal", codigoPostal); - formData.append("id_estado", idEstado); - formData.append("id_municipio", idMunicipio); - formData.append("id_colonia", idColonia); - formData.append("id_nivel", idNivel); - formData.append("id_giro", idGiro); + // Realiza una solicitud HTTP GET a la URL especificada + fetch(url) + .then(response => { + // Verifica si la respuesta del servidor es exitosa + if (!response.ok) { + throw new Error("llenarSelectGiro(): Error en la respuesta del servidor."); + } - formData.append("nombre_empresa_institucion", nombreEmpresa); - formData.append("motivo_examen", motivoExamen); + // Convertir la respuesta a JSON + return response.json(); + }) + .then(data => { + // Verifica si se recibieron datos + if (data.length > 0) { - formData.append("calificacion_servicio", calificacionServicio); - formData.append("consentimiento_pub", consentimientoPub ? 1 : 0); + // Añade las opciones de giros al elemento select + data.forEach(row => { + giroSelect.innerHTML += "<option value='" + row.id_giro + "'>" + row.descripcion + "</option>"; + }); + } else { + alert("llenarSelectGiro(): No se encontraron datos para los giros."); + } + }) + .catch(error => { + console.error("llenarSelectGiro(): Error en la solicitud. ", error); + }); + } - try { - const respuesta = await fetch('controllers/registrarInfoCandidato.php', { - method: "POST", - body: formData, - }); - - const resultado = await respuesta.json(); - - if (resultado.registroExitoso) { - alert('Se guardó la información correctamente'); - window.location.href = 'inicio.html'; + function llenarSelectNivelesEstudio(){ + let url = "./controllers/CatalogosController.php?obtener=nivelesestudio"; + // Petición fetch y llenado de select + fetch(url) + .then(response => { + if (!response.ok) { + throw new Error("llenarSelectNivelesEstudio(): Error en la respuesta del servidor."); + } + return response.json(); + }) + .then(data => { + if (data.length > 0) { + data.forEach(row => { + nivelEstudioSelect.innerHTML += "<option value='" + row.id_nivel + "'>" + row.descripcion + "</option>"; + }); + } else { + alert("llenarSelectNivelesEstudio(): No se encontraron datos para los giros."); + } + }) + .catch(error => { + console.error("llenarSelectNivelesEstudio(): Error en la solicitud. ", error); + }); + } + + function llenarDataListEmpresasInstituciones(){ + let url = "./controllers/CatalogosController.php?obtener=empresasinstituciones"; + fetch(url) + .then(response => response.json()) + .then(data => { + if (data.length > 0) { + data.forEach(row => { + dataListEmpresasInstituciones.innerHTML += "<option value='" + row.nombre_empresa_institucion + "'>" + row.nombre_empresa_institucion + "</option>"; + }); + } else { + alert("llenarDataListEmpresasInstituciones(): No se encontraron datos para las empresas o instituciones."); + } + }) + .catch(error => { + console.error("llenarDataListEmpresasInstituciones(): Error en la solicitud. ", error); + }); + + } + + // Función para obtener fecha en formato: 2025-04-27 09:05:18 + function obtenerFechaActual() { + const ahora = new Date(); + + const anio = ahora.getFullYear(); + const mes = String(ahora.getMonth() + 1).padStart(2, '0'); // Mes comienza en 0 + const dia = String(ahora.getDate()).padStart(2, '0'); + + const horas = String(ahora.getHours()).padStart(2, '0'); + const minutos = String(ahora.getMinutes()).padStart(2, '0'); + const segundos = String(ahora.getSeconds()).padStart(2, '0'); + + return `${anio}-${mes}-${dia} ${horas}:${minutos}:${segundos}`; + } + + function selectPaisValido(){ + return paisSelect.value !== "NULL"; + } + function selectNivelEstudioValido(){ + return nivelEstudioSelect.value !== "NULL"; + } + function selectGiroValido(){ + return giroSelect.value !== "NULL"; + } + function selectCalificacionServicioValido(){ + return selectCalificacionServicio.value !== "NULL"; + } + + function selectEstadoValido(){ + if(paisSelect.value === "1"){ + return estadoSelect.value !== "NULL"; + } + return true; + } + function selectMunicipioValido(){ + if(paisSelect.value === "1"){ + return municipioSelect.value !== "NULL"; + } + return true; + } + function selectColoniaValido(){ + if(paisSelect.value === "1"){ + return coloniaSelect.value !== "NULL"; + } + return true; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - FUNCIONES + + // EVENTOS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + // Añadir un evento de cambio al select de país + paisSelect.addEventListener("change", function() { + // Si el país es México, habilitar el campo de código postal + if (paisSelect.value === "1") { + inputCodigoPostal.removeAttribute("disabled"); + inputButtonBuscarCodigoPostal.removeAttribute("disabled"); } else { - notificacion.textContent = resultado.mensaje; + // Si el país no es México, deshabilitar el campo de código postal + inputCodigoPostal.setAttribute("disabled", "disabled"); + inputButtonBuscarCodigoPostal.setAttribute("disabled", "disabled"); + } + }); + + //Añadir un evento al boton de buscar + buscarBtn.addEventListener("click", function () { + let inputCodigoPostal = document.getElementById("codigo_postal").value; + + //verificar si el codigo postal esta vacio + if (inputCodigoPostal) { + + // Limpia los selects antes de llenarlos + estadoSelect.innerHTML = "<option value='NULL'>Seleccione su estado</option>"; + municipioSelect.innerHTML = "<option value='NULL'>Seleccione su municipio</option>"; + coloniaSelect.innerHTML = "<option value='NULL'>Seleccione su colonia</option>"; + + // Construye la URL para la solicitud + let url = "./controllers/CatalogosController.php?codigo_postal=" + encodeURIComponent(inputCodigoPostal); + + // 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.json()); + + // Verifica si la respuesta del servidor es exitosa + if (!response.ok) { + throw new Error("Error en la respuesta del servidor"); + } + + // Convertir la respuesta a JSON + return response.json(); + }) + .then(data => { + // Verifica si se recibieron datos + if (data.length > 0) { + + // Quitar disable a los selects + estadoSelect.removeAttribute("disabled"); + estadoSelect.setAttribute("required", "required"); + municipioSelect.removeAttribute("disabled"); + municipioSelect.setAttribute("required", "required"); + coloniaSelect.removeAttribute("disabled"); + coloniaSelect.setAttribute("required", "required"); + + //Crea conjuntos para almacenar estados, ciudades y colonias + let estados = new Map(); + let municipios = new Map(); + let colonias = new Map(); + + // Itera sobre cada fila de datos recibidos + data.forEach(row => { + //console.log(row); + estados.set(row['id_estado'], row['estado']); + municipios.set(row['id_municipio'], row['municipio']); + colonias.set(row['id_colonia'], row['colonia']); + }); + + // Añade las opciones de estados al elemento select + for (let [id_estado, estado] of estados) { + estadoSelect.innerHTML += "<option value='" + id_estado + "'>" + estado + "</option>"; + } + + // Añade las opciones de ciudades al elemento select + for (let [id_municipio, municipio] of municipios) { + municipioSelect.innerHTML += "<option value='" + id_municipio + "'>" + municipio + "</option>"; + } + + // Añade las opciones de colonias al elemento select + for (let [id_colonia, colonia] of colonias) { + coloniaSelect.innerHTML += "<option value='" + id_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."); + } + }); + + formulario.addEventListener("submit", async(event) => { + event.preventDefault(); + + // Limpiar mensaje de error previo + notificacion.textContent = ""; + notificacion.style.display = "none"; + + // Obtener valores de los campos + const idCandidato = document.getElementById('id_candidato').value; + const idPais = document.getElementById('id_pais').value; + const codigoPostal = document.getElementById('codigo_postal').value; + const idEstado = document.getElementById('id_estado').value; + const idMunicipio = document.getElementById('id_municipio').value; + const idColonia = document.getElementById('id_colonia').value; + + const idNivel = document.getElementById('id_nivel').value; + const idGiro = document.getElementById('id_giro').value; + const nombreEmpresa = document.getElementById('nombre_empresa').value.trim(); + const motivoExamen = document.getElementById('motivo_examen').value.trim(); + + const calificacionServicio = document.getElementById('calificacion_servicio').value; + const consentimientoPub = document.getElementById('consentimiento_pub').checked; + + const fechaSalida = obtenerFechaActual(); + + + let validaciones = []; + + if(!selectPaisValido()){ + validaciones.push("Seleccione un país. "); + } + if(!selectNivelEstudioValido()){ + validaciones.push("Seleccione un nivel de estudio."); + } + if(!selectGiroValido()){ + validaciones.push("Seleccione un giro. "); + } + if(!selectCalificacionServicioValido()){ + validaciones.push("Seleccione una calificación de servicio. "); + } + if(!selectEstadoValido()){ + validaciones.push("Seleccione un estado. "); + } + if(!selectMunicipioValido()){ + validaciones.push("Seleccione un municipio. "); + } + if(!selectColoniaValido()){ + validaciones.push("Seleccione una colonia. "); + } + + if(validaciones.length > 0){ + alert("Campos requeridos sin llenar"); + notificacion.textContent = validaciones.join("\n"); + notificacion.style.display = "block"; + return; + } + + // Preparar datos para envío + const formData = new FormData(); + formData.append("id_candidato", idCandidato); + formData.append("id_pais", idPais); + formData.append("codigo_postal", codigoPostal); + formData.append("id_estado", idEstado); + formData.append("id_municipio", idMunicipio); + formData.append("id_colonia", idColonia); + formData.append("id_nivel", idNivel); + formData.append("id_giro", idGiro); + + formData.append("nombre_empresa_institucion", nombreEmpresa); + formData.append("motivo_examen", motivoExamen); + + formData.append("calificacion_servicio", calificacionServicio); + if (consentimientoPub) { + formData.append("consentimiento_pub", 1); + } else { + formData.append("consentimiento_pub", 0); + } + + formData.append("fecha_salida", fechaSalida); + + // TEST + //alert("FORMULARIO ENVIADO"); + + // TEST: Pintar en consola datos del formData + // for (let [key, value] of formData.entries()) { + // console.log(key + ": ", value); + // } + + try { + const respuesta = await fetch('controllers/registrarInfoCandidato.php', { + method: "POST", + body: formData, + }); + + const resultado = await respuesta.json(); + + if (resultado.estado === "exitoso") { + console.log(resultado.res); + alert('Se guardó la información correctamente'); + //window.location.href = 'inicio.html'; + } else if(resultado.estado === "error") { + console.error(resultado.res); + notificacion.textContent = resultado.mensaje; + notificacion.style.display = "block"; + } + } catch (error) { + notificacion.textContent = "Lo sentimos, ocurrió un error: " + error.message; notificacion.style.display = "block"; } - } catch (error) { - notificacion.textContent = "Lo sentimos, ocurrió un error: " + error.message; - notificacion.style.display = "block"; - } -}); \ No newline at end of file + }); + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - EVENTOS +}); + diff --git a/models/CandidatoModel.php b/models/CandidatoModel.php index f5494f2..b15fdfa 100644 --- a/models/CandidatoModel.php +++ b/models/CandidatoModel.php @@ -11,18 +11,21 @@ class CandidatoModel { } /** - * Insertar información de candidatos en la base de datos. - * @param int $id_candidato ID del candidato. - * @param int $id_pais ID del país. - * @param int $id_estado ID del estado. - * @param int $id_municipio ID del municipio. - * @param int $id_colonia ID de la colonia. - * @param int $id_nivel ID del nivel máxímo de estudios. - * @param int $id_giro ID del giro de la empresa. - * @param string $nombre_empresa_institucion Nombre de la empresa o institución de la que proviene el candidato. - * @param string $motivo_examen Motivo del examen. - * @param int $calificacion_servicio Calificación del servicio. - * @param int $consentimiento_pub Consentimiento para la publicación de datos. + * Registra la información de un candidato y su fecha de salida + * + * @param int $id_candidato ID del candidato + * @param int $id_pais ID del país + * @param int|null $id_estado ID del estado + * @param int|null $id_municipio ID del municipio + * @param int|null $id_colonia ID de la colonia + * @param int $id_nivel ID del nivel + * @param int $id_giro ID del giro + * @param string $nombre_empresa_institucion Nombre de la empresa o institución + * @param string $motivo_examen Motivo del examen + * @param int $calificacion_servicio Calificación del servicio + * @param int $consentimiento_pub Consentimiento de publicación + * @param string $fecha_salida Fecha de salida + * @return array Retorna un array asociativo con las claves "estado" y "mensaje" */ public function registrarInfoCandidatos( $id_candidato, @@ -35,38 +38,126 @@ class CandidatoModel { $nombre_empresa_institucion, $motivo_examen, $calificacion_servicio, - $consentimiento_pub + $consentimiento_pub, + $fecha_salida ) { - $sql = "INSERT INTO info_candidatos ( id_candidato, id_pais, id_estado, id_municipio, id_colonia, id_nivel, id_giro, nombre_empresa_institucion, motivo_examen, calificacion_servicio, consentimiento_pub ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; - $stmt = $this->conn->prepare($sql); - if ($stmt === false) { - throw new Exception("Error en la preparación de la consulta: " . $this->conn->error); - } - - $stmt->bind_param( - "iiiiiiissii", - $id_candidato, - $id_pais, - $id_estado, - $id_municipio, - $id_colonia, - $id_nivel, - $id_giro, - $nombre_empresa_institucion, - $motivo_examen, - $calificacion_servicio, - $consentimiento_pub - ); - - if (!$stmt->execute()) { - throw new Exception("Error al insertar datos de información del candidato: " . $stmt->error); - } - - $insertId = $stmt->insert_id; + try { - $stmt->close(); + // Si el país no es México (ID 1), se asignan valores nulos a los campos de ubicación + if ($id_pais !== 1) { + $id_estado = null; + $id_municipio = null; + $id_colonia = null; + } - return $insertId; + $sql = "INSERT INTO info_candidatos ( + id_candidato, id_pais, id_estado, id_municipio, id_colonia, + id_nivel, id_giro, nombre_empresa_institucion, motivo_examen, + calificacion_servicio, consentimiento_pub + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + + $stmt = $this->conn->prepare($sql); + if ($stmt === false) { + return [ + "estado" => "error", + "mensaje" => "Error en la preparación de la consulta: " . $this->conn->error + ]; + } + + $stmt->bind_param( + "iiiiiiissii", + $id_candidato, + $id_pais, + $id_estado, + $id_municipio, + $id_colonia, + $id_nivel, + $id_giro, + $nombre_empresa_institucion, + $motivo_examen, + $calificacion_servicio, + $consentimiento_pub + ); + + if (!$stmt->execute()) { + return [ + "estado" => "error", + "mensaje" => "Error al insertar datos del candidato: " . $stmt->error + ]; + } + + $stmt->close(); + + // Registrar fecha de salida + $resultadoFecha = $this->registrarFechaSalida($id_candidato, $fecha_salida); + if (isset($resultadoFecha["estado"]) && $resultadoFecha["estado"] === "error") { + return $resultadoFecha; // Propagar el error desde registrarFechaSalida + } + + // Retornar éxito + return [ + "estado" => "exitoso", + "mensaje" => $id_candidato + ]; + + } catch (Exception $e) { + return [ + "estado" => "error", + "mensaje" => "Error en el registro: " . $e->getMessage() + ]; + } + } + + /** + * Registra la fecha de salida de un candidato + * + * @param int $id_candidato ID del candidato + * @param string $fecha_salida Fecha de salida + * @return array Retorna un array asociativo con las claves "estado" y "mensaje" + */ + private function registrarFechaSalida($id_candidato, $fecha_salida) { + try { + // Si no hay fecha de salida, retornar éxito sin hacer nada + if (empty($fecha_salida)) { + return [ + "estado" => "exitoso", + "mensaje" => "No se registró fecha de salida" + ]; + } + + // Consulta update + $sql = "UPDATE candidato SET fecha_salida = ? WHERE id_candidato = ?"; + $stmt = $this->conn->prepare($sql); + + if ($stmt === false) { + return [ + "estado" => "error", + "mensaje" => "Error en la preparación de la consulta de fecha: " . $this->conn->error + ]; + } + + $stmt->bind_param("si",$fecha_salida,$id_candidato); + + if (!$stmt->execute()) { + return [ + "estado" => "error", + "mensaje" => "Error al registrar fecha de salida: " . $stmt->error + ]; + } + + $stmt->close(); + + return [ + "estado" => "exitoso", + "mensaje" => "Fecha de salida registrada correctamente" + ]; + + } catch (Exception $e) { + return [ + "estado" => "error", + "mensaje" => "Error al registrar fecha de salida: " . $e->getMessage() + ]; + } } /** @@ -117,6 +208,73 @@ class CandidatoModel { return $insertId; } + + /** + * Verificar si ya existe un registro de información del candidato en la base de datos. + * @param int $id_candidato ID del candidato. + * @return bool true si existe un registro, false en caso contrario. + */ + public function verificarRegistroInfoCandidato($id_candidato) { + $sql = "SELECT COUNT(*) as count FROM info_candidatos WHERE id_candidato = ?"; + $stmt = $this->conn->prepare($sql); + if ($stmt === false) { + throw new Exception("Error en la preparación de la consulta: " . $this->conn->error); + } + $stmt->bind_param("i", $id_candidato); + if (!$stmt->execute()) { + throw new Exception("Error al ejecutar la consulta: " . $stmt->error); + } + $result = $stmt->get_result(); + $row = $result->fetch_assoc(); + $stmt->close(); + return $row['count'] > 0; + } + + public function existeIdCandidato($id_candidato) { + try { + $sql = "SELECT COUNT(*) as count FROM candidato WHERE id_candidato = ?"; + + $stmt = $this->conn->prepare($sql); + if ($stmt === false) { + return [ + "estado" => "error", + "mensaje" => "Error en la preparación de la consulta: " . $this->conn->error + ]; + } + + $stmt->bind_param("i", $id_candidato); + + if (!$stmt->execute()) { + return [ + "estado" => "error", + "mensaje" => "Error al ejecutar la consulta: " . $stmt->error + ]; + } + + $result = $stmt->get_result(); + $stmt->close(); + $row = $result->fetch_assoc(); + + if($row['count'] > 0){ + return [ + "estado" => "exitoso", + "mensaje" => "ID de candidato existe" + ]; + } else { + return [ + "estado" => "error", + "mensaje" => "ID de candidato no existe" + ]; + } + + } catch (Exception $e) { + return [ + "estado" => "error", + "mensaje" => "Error al verificar ID de candidato: " . $e->getMessage() + ]; + } + } + public function obtenerCandidatoPorId($id_candidato) { $sql = "SELECT * FROM candidato WHERE id_candidato = ?"; $stmt = $this->conn->prepare($sql); diff --git a/models/Catalogos.php b/models/CatalogosModel.php similarity index 73% rename from models/Catalogos.php rename to models/CatalogosModel.php index d607cad..a4a8f2b 100644 --- a/models/Catalogos.php +++ b/models/CatalogosModel.php @@ -9,98 +9,15 @@ class Catalogos{ $this->conn = Database::getInstance(); } - public function obtenerGeneros(){ - $sql = "SELECT id_genero, descripcion FROM genero"; - $result = $this->conn->query($sql); - - $generos = []; - while($row = $result->fetch_assoc()){ - $generos[] = $row; - } - - return $generos; - } - - public function obtenerRangosEdad(){ - $sql = "SELECT id_rango_edad, descripcion FROM rango_edad"; - $result = $this->conn->query($sql); - - $rangos = []; - while($row = $result->fetch_assoc()){ - $rangos[] = $row; - } - - return $rangos; - } - - public function obtenerTiposIdentificacion(){ - $sql = "SELECT id_tipo_id, descripcion FROM tipo_identificacion ORDER BY descripcion"; - $result = $this->conn->query($sql); - - $tipos = []; - while($row = $result->fetch_assoc()){ - $tipos[] = $row; - } - - return $tipos; - } - - public function obtenerNivelesEstudio(){ - $sql = "SELECT id_nivel, descripcion FROM nivel_estudio"; - $result = $this->conn->query($sql); - - $niveles = []; - while($row = $result->fetch_assoc()){ - $niveles[] = $row; - } - - return $niveles; - } - - public function obtenerGiros(){ - $sql = "SELECT id_giro, descripcion FROM giro ORDER BY descripcion"; - $result = $this->conn->query($sql); - - $giros = []; - while($row = $result->fetch_assoc()){ - $giros[] = $row; - } - - return $giros; - } - - public function obtenerExamenes(){ - $sql = "SELECT id_examen, nombre_examen FROM examen ORDER BY nombre_examen"; - $result = $this->conn->query($sql); - - $examenes = []; - while($row = $result->fetch_assoc()){ - $examenes[] = $row; - } - - return $examenes; - } - - public function obtenerPaises(){ - $sql = "SELECT int as id, nombre FROM paises ORDER BY nombre"; - $result = $this->conn->query($sql); - - $paises = []; - while($row = $result->fetch_assoc()){ - $paises[] = $row; - } - - return $paises; - } - /** * Obtiene el estado, municipio y colonia en base al código postal proporcionado. * @param int $codigo_postal El código postal a buscar. + * @return array Un array con los datos de estado, municipio y colonia. */ public function obtenerInfiCodigoPostal($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 + $sql = "SELECT e.id AS id_estado, e.nombre AS estado, m.id AS id_municipio, m.nombre AS municipio, c.id AS id_colonia, c.nombre AS colonia FROM colonias c JOIN municipios m ON c.municipio = m.id JOIN estados e ON m.estado = e.id @@ -114,18 +31,111 @@ class Catalogos{ // Obtener los resultados $result = $stmt->get_result(); + $stmt->close(); + $data = []; // Verificar si hay resultados if ($result->num_rows > 0) { - $data = []; while ($row = $result->fetch_assoc()) { $data[] = $row; // Agregar cada resultado a un array } - return json_encode($data); // Devolver los resultados en formato JSON + return $data; } else { - return json_encode([]); // Si no hay resultados, devolver un array vacío + return $data; } - $stmt->close(); + } + + /** + * Obtiene los giros. + * @return array + */ + public function obtenerGiros(){ + $sql = "SELECT id_giro, descripcion FROM giro ORDER BY descripcion"; + $result = $this->conn->query($sql); + + $giros = []; + while($row = $result->fetch_assoc()){ + $giros[] = $row; + } + + return $giros; + } + + /** + * Obtiene los nombres de los examenes disponibles. + * @return array Lista del nombre de la institución a la que pertenece el examen. + */ + public function obtenerNombresExamenes(){ + $sql = "SELECT id_examen, nombre_examen FROM examen ORDER BY nombre_examen"; + + $result = $this->conn->query($sql); + + $examenes = []; + while($row = $result->fetch_assoc()){ + $examenes[] = $row; + } + + return $examenes; + } + + /** + * Obtener los tipos de identificación. + * @return array + */ + public function obtenerTiposIdentificacion(){ + $sql = "SELECT id_tipo_id, descripcion FROM tipo_identificacion ORDER BY descripcion"; + $result = $this->conn->query($sql); + + $tipos = []; + while($row = $result->fetch_assoc()){ + $tipos[] = $row; + } + + return $tipos; + } + + /** + * Obtiene los rangos de edad. + * @return array + */ + public function obtenerRangosEdad(){ + $sql = "SELECT id_rango_edad, descripcion FROM rango_edad"; + $result = $this->conn->query($sql); + + $rangos = []; + while($row = $result->fetch_assoc()){ + $rangos[] = $row; + } + + return $rangos; + } + + /** + * Obtiene los niveles de estudio. + * @return array + */ + public function obtenerNivelesEstudio(){ + $sql = "SELECT id_nivel, descripcion FROM nivel_estudio"; + $result = $this->conn->query($sql); + + $niveles = []; + while($row = $result->fetch_assoc()){ + $niveles[] = $row; + } + + return $niveles; + } + + public function obtenerNombresEmpresasInstituciones(){ + $sql = "SELECT DISTINCT nombre_empresa_institucion FROM info_candidatos"; + $result = $this->conn->query($sql); + + $empresas = []; + while($row = $result->fetch_assoc()){ + $empresas[] = $row; + } + + return $empresas; } } diff --git a/test.php b/test.php index 2514088..3eb5c73 100644 --- a/test.php +++ b/test.php @@ -4,11 +4,4 @@ // UsuarioController::registrarUsuario("root", "root"); - -require_once __DIR__ . '/models/Catalogos.php'; -$catalogoModel = new Catalogos(); -$array = $catalogoModel->obtenerGeneros(); - -// Pintar arraycompleto en bruto de la variable $arrayInfoCodigoPostal -print_r($array); ?> \ No newline at end of file