Prueba Técnica: Laravel + MySQL + Bootstrap


1. Instrucciones y Requerimientos

Esta aplicación fue desarrollada siguiendo los requerimientos de la prueba técnica:

  • Consumir el Servicio Web del Catálogo Único de Claves Geoestadísticas del INEGI.
  • Obtener y guardar en base de datos los 32 estados y sus respectivos municipios.
  • Mostrar la información en un listado (DataTables) con paginación, búsqueda y ordenamiento.
  • Formatear la población total con separadores de miles.
  • Evitar registros duplicados, asegurando que el proceso de carga sea idempotente.

2. ¿Cómo funciona la aplicación?

Para utilizar la aplicación, primero es necesario iniciar sesión o registrarse. Una vez autenticado, tendrás acceso al Dashboard donde verás el Listado de Estados.

La aplicación se comunica con la API de INEGI. Si es la primera vez que se accede, la base de datos local no tendrá la información, por lo que la aplicación obtiene los datos directamente de la API de forma transparente, los guarda localmente y los muestra en la tabla. Al hacer clic en un estado en el listado, se realiza un proceso similar para obtener y mostrar sus municipios.

3. Implementación y Decisiones de Diseño

Autenticación

Se utiliza el sistema nativo de autenticación basada en sesiones de Laravel para proteger las rutas. El dashboard y las consultas API están restringidos únicamente a usuarios autenticados.

Caché de API

Las respuestas de la API están cacheadas por 1 hora (3600 segundos) mediante el plugin de caché de Saloon en conjunto con el driver de caché de Laravel, reduciendo drásticamente la latencia y la carga en el servidor externo.

Formateo de Datos (Accessors)

El formateo de la población (pob_total) con separadores de miles se maneja elegantemente en los modelos mediante Eloquent Accessors (pobTotal(): Attribute), manteniendo limpia la capa de presentación.

Sincronización DB e Integridad

Los datos usan updateOrCreate garantizando idempotencia. Además, la tabla de municipios está configurada con Cascade on Delete en la DB, por lo que al eliminar un Estado, todos sus municipios se borran automáticamente.

UI y DataTables (Master-Detail)

Se utiliza yajra/laravel-datatables. Para los municipios, se implementó un patrón Master-Detail; la tabla de municipios se carga asíncronamente y se muestra incrustada dentro de la tabla principal (child rows) al expandir un Estado.

4. Manejo y Particularidades de la API (INEGI)

Validación Estricta de Respuestas

Antes de que la respuesta de la API sea transformada en Data Transfer Objects (DTOs), pasa por un middleware de Saloon (ValidateResponseData) que valida rigurosamente la estructura del JSON contra reglas definidas en el método responseRules() de la Request. Esto asegura que la aplicación solo procese información íntegra y predecible.

Resolución de Inconsistencias HTTP

La API de municipios presenta una particularidad: al no encontrar datos, devuelve un estado HTTP 200 OK pero con un código 404 dentro del cuerpo de la respuesta (en el campo result). Para manejar esto de manera estándar, la clase GetMunicipiosRequest sobrescribe el método hasRequestFailed() de Saloon, inspeccionando el JSON interno. Si detecta el error 404, dispara una NotFoundException, permitiendo que la aplicación lo maneje como un verdadero fallo HTTP.