From 09e4ecd527268f564ddfc24a27d08649fa720d6e Mon Sep 17 00:00:00 2001
From: VictorMongeM <victor.monge.morales@gmail.com>
Date: Wed, 30 Apr 2025 14:47:05 -0600
Subject: [PATCH] codigo postal

---
 controllers/CatalogosController.php | 31 ++++++++++++
 form_datos_extendidos.html          |  5 +-
 js/buscarCodigo.js                  | 76 +++++++++++++++++++++++++++++
 models/Catalogos.php                | 51 ++++++++++---------
 4 files changed, 140 insertions(+), 23 deletions(-)
 create mode 100644 controllers/CatalogosController.php
 create mode 100644 js/buscarCodigo.js

diff --git a/controllers/CatalogosController.php b/controllers/CatalogosController.php
new file mode 100644
index 0000000..de417bd
--- /dev/null
+++ b/controllers/CatalogosController.php
@@ -0,0 +1,31 @@
+<?php
+
+require_once __DIR__ . '/../models/Catalogos.php';
+
+class CatalogosController {
+    private static $catalogosModel = null;
+
+    public static function inicializar() {
+        if (self::$catalogosModel === null) {
+            self::$catalogosModel = new Catalogos();
+        }
+    }
+
+    public static function obtenerInfiCodigoPostal($codigo_postal){
+        $result = self::$catalogosModel->obtenerInfiCodigoPostal($codigo_postal);
+        return $result;
+    }
+
+}
+
+CatalogosController::inicializar();
+
+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;
+}
+
+?>
\ No newline at end of file
diff --git a/form_datos_extendidos.html b/form_datos_extendidos.html
index d602654..68ce611 100644
--- a/form_datos_extendidos.html
+++ b/form_datos_extendidos.html
@@ -110,9 +110,11 @@
 							<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">
+									<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>
@@ -252,6 +254,7 @@
 	
 	<script src="js/form.js"></script>
 	<script src="js/form_datos_extendidos.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/js/buscarCodigo.js b/js/buscarCodigo.js
new file mode 100644
index 0000000..b821922
--- /dev/null
+++ b/js/buscarCodigo.js
@@ -0,0 +1,76 @@
+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/models/Catalogos.php b/models/Catalogos.php
index c33f2ff..d607cad 100644
--- a/models/Catalogos.php
+++ b/models/Catalogos.php
@@ -93,32 +93,39 @@ class Catalogos{
         return $paises;
     }
 
-    public function obtenerInfoCodigoPostal($codigoPostal) {
-        $sql = "
-            SELECT 
-                e.nombre    AS id_estado,
-                m.nombre    AS id_municipio,
-                c.nombre    AS id_colonia
-            FROM colonias c
-            JOIN municipios m ON c.municipio = m.id
-            JOIN estados   e ON m.estado   = e.id
-            WHERE c.codigo_postal = ?
-        ";
+    /**
+     * Obtiene el estado, municipio y colonia en base al código postal proporcionado.
+     * @param int $codigo_postal El código postal a buscar.
+     */
+    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
+                FROM colonias c
+                JOIN municipios m ON c.municipio = m.id
+                JOIN estados e ON m.estado = e.id
+                WHERE c.codigo_postal = ?";
+    
+        // Preparar la sentencia SQL
         $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", $codigoPostal);
-        if (!$stmt->execute()) {
-            throw new Exception("Error al ejecutar la consulta CP: " . $stmt->error);
-        }
+        $stmt->bind_param("i", $codigo_postal);
+        $stmt->execute();
+
+        // Obtener los resultados
         $result = $stmt->get_result();
-        $info = [];
-        while ($row = $result->fetch_assoc()) {
-            $info[] = $row;
+
+        // 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
+        } else {
+            return json_encode([]);  // Si no hay resultados, devolver un array vacío
         }
+
         $stmt->close();
-        return $info;
     }
 
 }