Commit eb63ac0a40de2018a418c87d5acf37807b161256
1 parent
157aa295
Reorganización: archivos del proyecto en la raíz del repositorio. Eliminación de…
… estructura anidada incorrecta.
Showing
120 changed files
with
30 additions
and
1496 deletions
.agents/rules/gis-geoserver.md deleted
| 1 | ---- | |
| 2 | -trigger: always_on | |
| 3 | ---- | |
| 4 | - | |
| 5 | -Regla 0. Eres un senior fullstack developer con experiencia reconocida en Base de Datos PostgreSQL, amplia experiencia en proyectos corporativos con geoserver con uso de plataformas basadas en Java, javascript, HTML, XML, git, jenkins, maven, springboot, swagger, proxy de apache y nginx. | |
| 6 | - | |
| 7 | -Regla 1. El ambiente de desarrollo y compilación se encuentra en el 192.168.1.123. | |
| 8 | -El JENKINS a usar está en este servidor. Los comandos del jenkins se ejecutan en el servidor 192.168.1.123. | |
| 9 | -El MAVEN a usar está en este servidor. Los comandos maven se ejecutan en el servidor 192.168.1.123. | |
| 10 | -El DOCKER a usar está en el servidor 192.168.1.123. Los comandos docker se ejecutan en el servidor192.168.1.123. | |
| 11 | -Todas las compilaciones se ejecutarán en el servidor 192.168.1.123. | |
| 12 | - | |
| 13 | -La base de datos georreferenciada SIGEM del Postgis está en este servidor y el superuser es el usuario registrado en el motor de base de datos como: | |
| 14 | -Usuario: sigem_user | |
| 15 | -Contraseña: sigem_pass | |
| 16 | - | |
| 17 | -Regla 2. Las bases de datos alfanuméricas de los municipios a usar vinculadas a la base de datos georreferenciada Postgis serán definidas dinámicamente usando la tabla ENTIDADES la Base de Datos SIGEMWEB en el servidor 192.168.1.254 | |
| 18 | - | |
| 19 | -Regla 3. El proxypass principal de redireccionamiento reside en el servidor 192.168.1.10 | |
| 20 | - | |
| 21 | -El proxypass maestro de redireccionamiento reside en el servidor 192.168.1.20 | |
| 22 | - | |
| 23 | -Regla 4. Para el LOGIN, el código del municipio es seleccionado por el usuario de la aplicación al loguearse. | |
| 24 | -Para el LOGIN siempre se utiliza en año actual. | |
| 25 | -Para las pruebas de LOGIN se usa el usuario 'operador' y el pase 'ataj800306465'. | |
| 26 | - | |
| 27 | -Regla 5. Los parámetros para la visualización y despliegue de mapas en el geoserver deberá usarse el registro correspondiente al municipio que se obtiene en la tabla ENTIDADES. El código del municipio es seleccionado por el usuario de la aplicación al loguearse. | |
| 28 | -Por ejemplo: | |
| 29 | -select * from public.entidades WHERE activo= TRUE AND entidad= 505 ; | |
| 30 | - | |
| 31 | -Los parámetros disponibles son: | |
| 32 | - sigem_site character varying(100) | |
| 33 | - sigem_dbname character varying(100) | |
| 34 | - latlong character varying(70) | |
| 35 | - lng character varying(35) | |
| 36 | - lat character varying(35) | |
| 37 | - zoom character varying(2) | |
| 38 | - mapa_base character varying(100) | |
| 39 | - boundno character varying(70) | |
| 40 | - boundse character varying(70) | |
| 41 | - maxzoom character varying(2) | |
| 42 | - minzoom character varying(2) | |
| 43 | - | |
| 44 | -La base de datos del municipio con los datos de liquidaciones de deudas y pagos se encuentran la base de datos remota referida por las columnas sigem_site y sigem_dbname para definir el string de conexión incluida credenciales. Se usa la tabla ENTIDADES de la Base de Datos SIGEMWEB del servidor 192.168.1.254 y se use el registro correspondiente a la entidad seleccionada usando la columna entidad. | |
| 45 | - | |
| 46 | -La visualización de mapas será en 2D y no se usará 3D en este proyecto. | |
| 47 | - | |
| 48 | -El servicio de Postgres Versión 17 en el servidor 192.168.1.254 usa el puerto 5432, usuario: postgres y password: x25yvaga2017 | |
| 49 | - | |
| 50 | -Regla 6. Para la construcción en la compilación, se usa JAVA21 del 192.168.1.123 | |
| 51 | - | |
| 52 | -Regla 7. Credenciales para acceso al 192.168.1.123 | |
| 53 | -cbareiro/x25yvaga2023 | |
| 54 | -root/x25yvaga2023 | |
| 55 | - | |
| 56 | -Regla 8. Credenciales para acceso al 192.168.1.10 | |
| 57 | -cbareiro/x25yvaga2020 | |
| 58 | -root/x25yvaga2021 | |
| 59 | - | |
| 60 | -Regla 9. Credenciales para acceso al 192.168.1.20 | |
| 61 | -cbareiro/x25yvaga2020 | |
| 62 | -root/x25yvaga2020 | |
| 63 | - | |
| 64 | -Regla 10. Credenciales para acceso al 192.168.1.129 | |
| 65 | -cbareiro/x25yvaga2025 | |
| 66 | - | |
| 67 | -Regla 11. Credenciales para JENKINS EN 192.168.1.123 | |
| 68 | -Usuario: admin | |
| 69 | -Contraseña: x25yvaga2024 | |
| 70 | - | |
| 71 | -Regla 12. Para el despliegue del módulo GIS, el Jenkinsfile ya tiene configurado el ID de credencial SSH como sigem-server-123, el cual utiliza el usuario root para las operaciones automáticas de scp y docker compose en ese servidor. | |
| 72 | - | |
| 73 | -Regla 13. Apache Tomcat | |
| 74 | -Los siguientes usuarios estan configurados en Tomcat para la administracion del servidor de | |
| 75 | -aplicaciones y el despliegue de servicios. Cada usuario tiene roles especificos asignados. | |
| 76 | - | |
| 77 | -Tomcat Manager | |
| 78 | -Usuario Password | |
| 79 | -usuario: manager pase: x25yvaga2023 Roles: manager-gui | |
| 80 | - | |
| 81 | -admin geoserver admin, manager-gui | |
| 82 | -GeoServer Web UI | |
| 83 | -usuario: admin pase: geoserver Roles: admin, manager-gui | |
| 84 | -http://192.168.1.123:8080/geoserver | |
| 85 | - | |
| 86 | -Regla 14. Administración del GEOSERVER. | |
| 87 | -Los siguientes endpoints son los puntos de acceso principales del sistema GeoServer desplegado: | |
| 88 | -Servicio URL | |
| 89 | -GeoServer Web UI http://192.168.1.123:8080/geoserver | |
| 90 | -Tomcat Manager http://192.168.1.123:8080/manager/html | |
| 91 | -WMS (Mapas) http://192.168.1.123:8080/geoserver/wms | |
| 92 | -WFS (Vectores) http://192.168.1.123:8080/geoserver/wfs | |
| 93 | -WCS (Coberturas) http://192.168.1.123:8080/geoserver/wcs | |
| 94 | -REST API http://192.168.1.123:8080/geoserver/rest | |
| 95 | - | |
| 96 | -Regla 15. La aplicación se desplegará en el servidor 192.168.1.123 | |
| 97 | -La carpeta de trabajo es: /yvyape/proyectos/sigem-gis | |
| 98 | - | |
| 99 | -Regla 16. Conexión FDW y Sincronización de Vistas. | |
| 100 | -Esta conexión vía Foreign Data Wrapper deberá utilizarse para toda consulta que requiera obtener datos de la base de datos remota del municipio. | |
| 101 | -La aplicación GIS-GEOSERVER procederá a usar el código del municipio seleccionado en el LOGIN por parte del usuario. Si el valor de la columna ACTIVO = true entonces se verificará si existe el FDW de ese municipio. Si no existe que lo cree para el servidor de ese municipio en la base de datos georreferenciada del GIS-GEOSERVER. | |
| 102 | -Independientemente de si el FDW ya existía, el sistema debe **recrear o refrescar obligatoriamente** las vistas de unión locales (`vw_lotes_morosidad_X` y `vw_mejoras_morosidad_X`) en cada LOGIN o actualización manual para asegurar la sincronización de los datos numéricos de morosidad. | |
| 103 | - | |
| 104 | -Regla 17. Para el repositorio de código fuente se usa el servidor de git 192.168.1.100 Para acceso al repositorio git usar usuario: cbareiro@yvaga.com.py y password carlos57 | |
| 105 | -Para la conexión al proyecto git se usa git@git.yvaga.com.py:geo/gis-geoserver.git con SSH. | |
| 106 | -Para la conexión al proyecto git se usa http://git.yvaga.com.py/geo/gis-geoserver.git con HTTP. | |
| 107 | - | |
| 108 | -Regla 18. Para usar SSH desde el equipo local Windows 11, debes usar la aplicación Bitvise con usuario cbareiro. | |
| 109 | - | |
| 110 | -Regla 19: Uso obligatorio de ./mvnw clean package -DskipTests para builds ágiles. | |
| 111 | - | |
| 112 | -Regla 20. Para el FrontEnd las llamadas usarán /gis-geoserver/ como prefijo base. | |
| 113 | -El acceso al FrontEnd será por https://sigemtest.yvaga.com.py/gis-geoserver/login. | |
| 114 | - | |
| 115 | -Regla 21. Para el BackEnd el camino es server.servlet.context-path=/gis-geoserver. | |
| 116 | - | |
| 117 | -Regla 22: Integridad de Comandos Remotos (Bitvise) | |
| 118 | -Está vinculada a la Regla 18. | |
| 119 | -Queda prohibido el uso de comandos printf, echo o concatenaciones multilínea complejas directamente dentro de sexec para crear archivos en el servidor. | |
| 120 | -Ante la necesidad de crear o modificar un archivo completo (como docker-compose.yml o Dockerfile), se debe crear el archivo localmente primero y utilizar sftpc para subirlo. Esto garantiza que el contenido llegue íntegro y sin errores de formato causados por el shell de Windows. | |
| 121 | - | |
| 122 | -Regla 23. Columnas de Unión (Joins). | |
| 123 | -Para toda vista de unión entre tablas locales del GIS (`eXXX_lotes_conccc`, `eXXX_mejoras`) y las tablas remotas del FDW, se debe utilizar obligatoriamente la columna **`ccc`** (Clave Catastral Común) como clave de relación. Queda prohibido el uso de la columna `lote_codigo` para este fin en la Entidad 505 y sucesivas que compartan el mismo esquema. | |
| 124 | -Esta es la definición de vista que funciona: | |
| 125 | -CREATE OR REPLACE VIEW public.vw_lotes_morosidad_505 AS | |
| 126 | -SELECT | |
| 127 | - l.*, | |
| 128 | - m.inm_ficha, | |
| 129 | - m.inm_ctacatastral, | |
| 130 | - m.trb_total_deuda, | |
| 131 | - m.trb_total_pago, | |
| 132 | - m.ultimo_pago | |
| 133 | -FROM public.e505_lotes_conccc l | |
| 134 | -LEFT JOIN fdw_505.v_liq_entidad_totalxobjeto m ON l.ccc = m.inm_ctacatastral | |
| 135 | - | |
| 136 | -Regla 24. Resiliencia del LOGIN. | |
| 137 | -Toda orquestación de servicios secundarios (GeoServer REST API, habilitación de MVT, etc.) invocada durante el proceso de LOGIN debe ser **no-bloqueante**. Esto implica el uso obligatorio de bloques `try-catch` para capturar cualquier fallo externo y la configuración de un tiempo de espera (**timeout**) máximo de **2 segundo** por conexión, para no comprometer la fluidez del acceso al sistema. | |
| 138 | - | |
| 139 | -Regla 25. Protocolo de Registro de Logros (Hitos). | |
| 140 | -Ante cada logro o funcionalidad nueva validada que requiera un registro oficial, se añadirá (append) una entrada al archivo `VERSION.txt` (local y remoto) en formato texto plano, siguiendo el formato: "Version SIG (Abril 2026) - AAAA.MM.DD.HH.MM.SS ID DOCKER: ". Aqui´se debería agregar el id único del docker usado, A esto se le debe agregar un texto de observación mío. | |
| 141 | -Este registro oficial deberá ser autorizado por el usuario. Se aplica solamente por indicaciones del usuario cuando confirme algún hito de éxito que le interese. | |
| 142 | 0 | \ No newline at end of file |
.gitignore
0 → 100644
| 1 | +# Build artifacts | |
| 2 | +target/ | |
| 3 | +*.jar | |
| 4 | +*.war | |
| 5 | +*.class | |
| 6 | + | |
| 7 | +# Maven wrapper cache | |
| 8 | +.mvn/repository/ | |
| 9 | + | |
| 10 | +# IDE files | |
| 11 | +.idea/ | |
| 12 | +*.iml | |
| 13 | +.vscode/ | |
| 14 | +*.swp | |
| 15 | + | |
| 16 | +# Temp and logs | |
| 17 | +*.log | |
| 18 | +*.tmp | |
| 19 | +*.bak | |
| 20 | + | |
| 21 | +# Docker temp | |
| 22 | +docker-compose.yml.remote.tmp | |
| 23 | + | |
| 24 | +# Binary / export files | |
| 25 | +*.gpkg | |
| 26 | +project.zip | |
| 27 | + | |
| 28 | +# Not related to this project | |
| 29 | +sigem_kafka/ | |
| 30 | +.agents/ | ... | ... |
GIS-GEOSERVER/.mvn/wrapper/maven-wrapper.properties renamed to .mvn/wrapper/maven-wrapper.properties
GIS-GEOSERVER/0 renamed to 0
GIS-GEOSERVER/Dockerfile renamed to Dockerfile
GIS-GEOSERVER/FdwService.java renamed to FdwService.java
GIS-GEOSERVER/docker-compose.yml.remote.tmp deleted
| 1 | -version: '3.8' | |
| 2 | -services: | |
| 3 | - gis-geoserver-backend: | |
| 4 | - image: sigem/gis-geoserver-app:latest | |
| 5 | - container_name: sigem-gis-backend | |
| 6 | - restart: unless-stopped | |
| 7 | - ports: | |
| 8 | - - "8081:8081" | |
| 9 | - volumes: | |
| 10 | - - /home/cbareiro/sigem-gis/gis-geoserver.jar:/app.jar | |
| 11 | - environment: | |
| 12 | - - TZ=America/Asuncion | |
| 13 | - - GIS_DB_HOST=proyecto-postgres-1 | |
| 14 | - networks: | |
| 15 | - - sigem-net | |
| 16 | - - proyecto_sigem_network | |
| 17 | - | |
| 18 | -networks: | |
| 19 | - sigem-net: | |
| 20 | - driver: bridge | |
| 21 | - proyecto_sigem_network: | |
| 22 | - external: true |
GIS-GEOSERVER/project.zip deleted
No preview for this file type
GIS-GEOSERVER/sigem_export.gpkg deleted
No preview for this file type
GIS-GEOSERVER/target/classes/application.properties deleted
| 1 | -server.port=8081 | |
| 2 | -server.servlet.context-path=/gis-geoserver | |
| 3 | - | |
| 4 | -# Configuración JPA (No gestionada por auto-configuración, pero usada manualmente) | |
| 5 | -spring.jpa.hibernate.ddl-auto=none | |
| 6 | -spring.jpa.show-sql=true | |
| 7 | -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect | |
| 8 | -spring.application.name=gis-geoserver | |
| 9 | - | |
| 10 | -# JPA Config | |
| 11 | -spring.datasource.master.url=jdbc:postgresql://192.168.1.254:5432/sigemweb | |
| 12 | -spring.datasource.master.username=postgres | |
| 13 | -spring.datasource.master.password=x25yvaga2017 | |
| 14 | -spring.datasource.gis.url=jdbc:postgresql://proyecto-postgres-1:5432/sigem | |
| 15 | -spring.datasource.gis.username=sigem_user | |
| 16 | -spring.datasource.gis.password=sigem_pass | |
| 17 | - | |
| 18 | -# Configuración de GeoServer Interno | |
| 19 | -geoserver.url=http://192.168.1.123:8083/geoserver | |
| 20 | -geoserver.username=admin | |
| 21 | -geoserver.password=geoserver | |
| 22 | -geoserver.workspace=sigem | |
| 23 | -geoserver.datastore=sigem_datastore |
GIS-GEOSERVER/target/classes/com/sigem/gis/GisApplication.class deleted
No preview for this file type
GIS-GEOSERVER/target/classes/com/sigem/gis/WebConfig.class deleted
No preview for this file type
GIS-GEOSERVER/target/classes/com/sigem/gis/config/DataSourceConfig.class deleted
No preview for this file type
GIS-GEOSERVER/target/classes/com/sigem/gis/controller/AdminController.class deleted
No preview for this file type
GIS-GEOSERVER/target/classes/com/sigem/gis/controller/GisController.class deleted
No preview for this file type
GIS-GEOSERVER/target/classes/com/sigem/gis/controller/ProxyController.class deleted
No preview for this file type
GIS-GEOSERVER/target/classes/com/sigem/gis/controller/WebViewController.class deleted
No preview for this file type
GIS-GEOSERVER/target/classes/com/sigem/gis/security/AuthController.class deleted
No preview for this file type
GIS-GEOSERVER/target/classes/com/sigem/gis/security/AuthRequest.class deleted
No preview for this file type
GIS-GEOSERVER/target/classes/com/sigem/gis/security/AuthResponse.class deleted
No preview for this file type
GIS-GEOSERVER/target/classes/com/sigem/gis/security/JwtAuthenticationFilter.class deleted
No preview for this file type
GIS-GEOSERVER/target/classes/com/sigem/gis/security/JwtUtil.class deleted
No preview for this file type
GIS-GEOSERVER/target/classes/com/sigem/gis/security/SecurityConfig.class deleted
No preview for this file type
GIS-GEOSERVER/target/classes/com/sigem/gis/service/FdwService.class deleted
No preview for this file type
GIS-GEOSERVER/target/classes/com/sigem/gis/service/GeoServerService.class deleted
No preview for this file type
GIS-GEOSERVER/target/classes/static/landing.html deleted
| 1 | -<!DOCTYPE html> | |
| 2 | -<html lang="es"> | |
| 3 | -<head> | |
| 4 | - <meta charset="utf-8"> | |
| 5 | - <meta name="viewport" content="width=device-width, initial-scale=1"> | |
| 6 | - <title>SIGEMWEB - Dashboard</title> | |
| 7 | - | |
| 8 | - <!-- Google Font: Source Sans Pro --> | |
| 9 | - <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback"> | |
| 10 | - <!-- Font Awesome --> | |
| 11 | - <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css"> | |
| 12 | - <!-- Theme style --> | |
| 13 | - <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/admin-lte@3.2/dist/css/adminlte.min.css"> | |
| 14 | - <style> | |
| 15 | - .content-wrapper { padding: 0; margin-left: 250px; height: calc(100vh - 57px); overflow: hidden; } | |
| 16 | - iframe#main-iframe { width: 100%; height: 100%; border: none; } | |
| 17 | - .brand-link { background-color: #0056b3 !important; color: white !important; font-weight: bold;} | |
| 18 | - .main-header { background-color: #006ddb !important; border-bottom: none; } | |
| 19 | - .navbar-light .navbar-nav .nav-link { color: white; font-weight: 600;} | |
| 20 | - /* Treeview in popup */ | |
| 21 | - .modal-treeview ul { list-style-type: none; padding-left: 20px; } | |
| 22 | - .modal-treeview li { margin-bottom: 5px; cursor: default;} | |
| 23 | - .modal-treeview li span { font-size: 14px; font-weight: 500; } | |
| 24 | - .modal-treeview li span.clickable:hover { color: #0056b3; cursor: pointer; font-weight: bold; } | |
| 25 | - </style> | |
| 26 | -</head> | |
| 27 | -<body class="hold-transition sidebar-mini layout-fixed"> | |
| 28 | -<div class="wrapper"> | |
| 29 | - | |
| 30 | - <!-- Navbar --> | |
| 31 | - <nav class="main-header navbar navbar-expand navbar-light"> | |
| 32 | - <!-- Left navbar links --> | |
| 33 | - <ul class="navbar-nav"> | |
| 34 | - <li class="nav-item"> | |
| 35 | - <a class="nav-link" data-widget="pushmenu" href="#" role="button"><i class="fas fa-bars"></i></a> | |
| 36 | - </li> | |
| 37 | - <li class="nav-item d-none d-sm-inline-block"> | |
| 38 | - <span class="nav-link" style="color: white; font-size: 18px; margin-left:10px;">Municipalidad de <span id="nav-entidad-text" style="font-weight: 800;">...</span> <span style="font-size: 14px; font-weight: 300;">¡Emergente y Sostenible!</span></span> | |
| 39 | - </li> | |
| 40 | - </ul> | |
| 41 | - | |
| 42 | - <!-- Right navbar links --> | |
| 43 | - <ul class="navbar-nav ml-auto"> | |
| 44 | - <li class="nav-item dropdown"> | |
| 45 | - <a class="nav-link" data-toggle="dropdown" href="#" style="color: white;"> | |
| 46 | - <i class="far fa-user mr-2"></i> <span id="nav-user-text">Cargando...</span> | |
| 47 | - </a> | |
| 48 | - <div class="dropdown-menu dropdown-menu-lg dropdown-menu-right"> | |
| 49 | - <a href="#" class="dropdown-item" onclick="cerrarSesion()"> | |
| 50 | - <i class="fas fa-sign-out-alt mr-2 text-danger"></i> Cerrar Sesión | |
| 51 | - </a> | |
| 52 | - </div> | |
| 53 | - </li> | |
| 54 | - </ul> | |
| 55 | - </nav> | |
| 56 | - <!-- /.navbar --> | |
| 57 | - | |
| 58 | - <!-- Main Sidebar Container --> | |
| 59 | - <aside class="main-sidebar sidebar-dark-primary elevation-4"> | |
| 60 | - <!-- Brand Logo --> | |
| 61 | - <a href="#" class="brand-link text-center mb-2"> | |
| 62 | - <span class="brand-text"><b>SIGEM</b>WEB</span> | |
| 63 | - </a> | |
| 64 | - | |
| 65 | - <!-- Sidebar Menu --> | |
| 66 | - <nav class="mt-2"> | |
| 67 | - <ul class="nav nav-pills nav-sidebar flex-column text-sm" data-widget="treeview" role="menu" data-accordion="false"> | |
| 68 | - | |
| 69 | - <li class="nav-item"> | |
| 70 | - <a href="#" class="nav-link" onclick="loadContent('/gis-geoserver/widgets')"> | |
| 71 | - <i class="nav-icon fas fa-tachometer-alt"></i> | |
| 72 | - <p>Dashboard <span class="right badge badge-primary">New</span></p> | |
| 73 | - </a> | |
| 74 | - </li> | |
| 75 | - | |
| 76 | - <!-- Legacy Tree --> | |
| 77 | - <li class="nav-item menu-open"> | |
| 78 | - <a href="#" class="nav-link active" style="background-color: #343a40;"> | |
| 79 | - <i class="nav-icon fas fa-chart-line"></i> | |
| 80 | - <p> | |
| 81 | - Control de Gestión | |
| 82 | - <i class="right fas fa-angle-left"></i> | |
| 83 | - </p> | |
| 84 | - </a> | |
| 85 | - <ul class="nav nav-treeview"> | |
| 86 | - <li class="nav-item menu-open"> | |
| 87 | - <a href="#" class="nav-link"> | |
| 88 | - <i class="far fa-dot-circle nav-icon"></i> | |
| 89 | - <p>Mapas <i class="right fas fa-angle-left"></i></p> | |
| 90 | - </a> | |
| 91 | - <ul class="nav nav-treeview" style="margin-left: 10px;"> | |
| 92 | - <li class="nav-item menu-open"> | |
| 93 | - <a href="#" class="nav-link"> | |
| 94 | - <i class="fas fa-map nav-icon text-info"></i> | |
| 95 | - <p>Tributarios <i class="right fas fa-angle-left"></i></p> | |
| 96 | - </a> | |
| 97 | - <ul class="nav nav-treeview" style="margin-left: 10px;"> | |
| 98 | - <li class="nav-item"> | |
| 99 | - <a href="#" class="nav-link" data-toggle="modal" data-target="#modalMorosidad"> | |
| 100 | - <i class="fas fa-layer-group nav-icon text-warning"></i> | |
| 101 | - <p>Mapa Morosidad/Pago</p> | |
| 102 | - </a> | |
| 103 | - </li> | |
| 104 | - </ul> | |
| 105 | - </li> | |
| 106 | - </ul> | |
| 107 | - </li> | |
| 108 | - </ul> | |
| 109 | - </li> | |
| 110 | - | |
| 111 | - <!-- Dummy Options --> | |
| 112 | - <li class="nav-header">OTRAS OPCIONES</li> | |
| 113 | - <li class="nav-item"> | |
| 114 | - <a href="#" class="nav-link" onclick="notImplemented()"> | |
| 115 | - <i class="nav-icon fas fa-file-invoice-dollar text-muted"></i> | |
| 116 | - <p>Liquidaciones</p> | |
| 117 | - </a> | |
| 118 | - </li> | |
| 119 | - <li class="nav-item"> | |
| 120 | - <a href="#" class="nav-link" onclick="notImplemented()"> | |
| 121 | - <i class="nav-icon fas fa-users text-muted"></i> | |
| 122 | - <p>Contribuyentes</p> | |
| 123 | - </a> | |
| 124 | - </li> | |
| 125 | - | |
| 126 | - </ul> | |
| 127 | - </nav> | |
| 128 | - <!-- /.sidebar-menu --> | |
| 129 | - </aside> | |
| 130 | - | |
| 131 | - <!-- Content Wrapper. Contains page content --> | |
| 132 | - <div class="content-wrapper"> | |
| 133 | - <iframe id="main-iframe" src="/gis-geoserver/widgets"></iframe> | |
| 134 | - </div> | |
| 135 | - | |
| 136 | - <!-- Main Footer --> | |
| 137 | - <footer class="main-footer" style="padding: 5px; font-size: 12px;"> | |
| 138 | - <strong>Sistema de Información Geográfica Municipal.</strong> | |
| 139 | - Todos los derechos reservados. | |
| 140 | - </footer> | |
| 141 | -</div> | |
| 142 | -<!-- ./wrapper --> | |
| 143 | - | |
| 144 | -<!-- Modal Pop-up para Selección de Mapa (Exactamente como el legado) --> | |
| 145 | -<div class="modal fade" id="modalMorosidad" tabindex="-1" role="dialog" aria-hidden="true"> | |
| 146 | - <div class="modal-dialog modal-sm" role="document" style="margin-top: 15vh;"> | |
| 147 | - <div class="modal-content shadow-lg" style="border: 1px solid #17a2b8;"> | |
| 148 | - <div class="modal-header bg-info" style="padding: 10px;"> | |
| 149 | - <h6 class="modal-title" style="font-weight: bold;"><i class="fas fa-filter"></i> Selección Capas Geo</h6> | |
| 150 | - <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close"> | |
| 151 | - <span aria-hidden="true">×</span> | |
| 152 | - </button> | |
| 153 | - </div> | |
| 154 | - <div class="modal-body modal-treeview"> | |
| 155 | - <ul> | |
| 156 | - <li><i class="fas fa-minus-square mr-1 text-secondary"></i> <span>MAPA DE MOROSIDAD</span> | |
| 157 | - <ul> | |
| 158 | - <li><i class="fas fa-plus-square mr-1 text-secondary"></i> <span>IMPUESTOS ADEUDADOS</span> | |
| 159 | - <ul> | |
| 160 | - <li><i class="fas fa-plus mr-1 text-muted"></i> <span class="clickable" onclick="notImplemented()">Impuesto Inmobiliario</span></li> | |
| 161 | - <li><i class="fas fa-plus mr-1 text-muted"></i> <span class="clickable" onclick="notImplemented()">Patente Comercial</span></li> | |
| 162 | - <li><i class="fas fa-plus-square mr-1 text-secondary"></i> <span>Todos</span> | |
| 163 | - <ul> | |
| 164 | - <li><i class="far fa-window-restore mr-1 text-muted"></i> <span class="clickable" onclick="notImplemented()">POR TOTAL</span></li> | |
| 165 | - <li><i class="far fa-clock mr-1 text-muted"></i> <span class="text-primary font-weight-bold clickable" onclick="loadMap()">ULTIMO PAGO / TODOS</span></li> | |
| 166 | - </ul> | |
| 167 | - </li> | |
| 168 | - </ul> | |
| 169 | - </li> | |
| 170 | - <li><i class="fas fa-plus-square mr-1 text-muted"></i> <span class="clickable" onclick="notImplemented()">IMPUESTOS PAGADOS</span></li> | |
| 171 | - </ul> | |
| 172 | - </li> | |
| 173 | - </ul> | |
| 174 | - </div> | |
| 175 | - </div> | |
| 176 | - </div> | |
| 177 | -</div> | |
| 178 | - | |
| 179 | -<!-- jQuery --> | |
| 180 | -<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> | |
| 181 | -<!-- Bootstrap 4 --> | |
| 182 | -<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script> | |
| 183 | -<!-- AdminLTE App --> | |
| 184 | -<script src="https://cdn.jsdelivr.net/npm/admin-lte@3.2/dist/js/adminlte.min.js"></script> | |
| 185 | - | |
| 186 | -<script> | |
| 187 | - // Recuperar datos de sesión | |
| 188 | - const token = localStorage.getItem('jwt'); | |
| 189 | - const userName = localStorage.getItem('user_name'); | |
| 190 | - const entidad = localStorage.getItem('entidad'); | |
| 191 | - | |
| 192 | - if (!token) { | |
| 193 | - window.location.href = "/gis-geoserver/login"; | |
| 194 | - } | |
| 195 | - | |
| 196 | - document.getElementById('nav-user-text').innerText = userName || 'Operador Local'; | |
| 197 | - document.getElementById('nav-entidad-text').innerText = entidad || 'N/D'; | |
| 198 | - | |
| 199 | - function notImplemented() { | |
| 200 | - alert("OPCIÓN NO IMPLEMENTADA"); | |
| 201 | - } | |
| 202 | - | |
| 203 | - function loadContent(url) { | |
| 204 | - document.getElementById('main-iframe').src = url; | |
| 205 | - } | |
| 206 | - | |
| 207 | - function loadMap() { | |
| 208 | - // Cierra el modal de forma programática usando jQuery de Bootstrap | |
| 209 | - $('#modalMorosidad').modal('hide'); | |
| 210 | - // Redirige el iframe central hacia nuestro impecable mapas.html | |
| 211 | - loadContent('/gis-geoserver/mapas'); | |
| 212 | - } | |
| 213 | - | |
| 214 | - function cerrarSesion() { | |
| 215 | - localStorage.clear(); | |
| 216 | - window.location.href = "/gis-geoserver/login"; | |
| 217 | - } | |
| 218 | -</script> | |
| 219 | -</body> | |
| 220 | -</html> |
GIS-GEOSERVER/target/classes/static/login.html deleted
| 1 | -<!DOCTYPE html> | |
| 2 | -<html lang="es"> | |
| 3 | -<head> | |
| 4 | - <meta charset="utf-8"> | |
| 5 | - <meta name="viewport" content="width=device-width, initial-scale=1"> | |
| 6 | - <title>Inicie Sesión - Ecosistema SIGEM</title> | |
| 7 | - | |
| 8 | - <!-- Google Font: Source Sans Pro (Estandar de AdminLTE) --> | |
| 9 | - <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback"> | |
| 10 | - <!-- Font Awesome --> | |
| 11 | - <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css"> | |
| 12 | - <!-- Theme style AdminLTE 3 --> | |
| 13 | - <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/admin-lte@3.2/dist/css/adminlte.min.css"> | |
| 14 | - <style> | |
| 15 | - .login-page { | |
| 16 | - background: linear-gradient(135deg, #e0eafc 0%, #cfdef3 100%); | |
| 17 | - } | |
| 18 | - .card-primary.card-outline { | |
| 19 | - border-top: 3px solid #0056b3; | |
| 20 | - } | |
| 21 | - .btn-primary { | |
| 22 | - background-color: #0056b3; | |
| 23 | - border-color: #0056b3; | |
| 24 | - } | |
| 25 | - .btn-primary:hover { | |
| 26 | - background-color: #004494; | |
| 27 | - border-color: #004494; | |
| 28 | - } | |
| 29 | - .login-logo a { | |
| 30 | - color: #333 !important; | |
| 31 | - } | |
| 32 | - </style> | |
| 33 | -</head> | |
| 34 | -<body class="hold-transition login-page"> | |
| 35 | -<div class="login-box"> | |
| 36 | - <div class="login-logo"> | |
| 37 | - <a href="#"><b>SIGEM</b>WEB</a> | |
| 38 | - </div> | |
| 39 | - <!-- /.login-logo --> | |
| 40 | - <div class="card card-outline card-primary shadow-lg"> | |
| 41 | - <div class="card-body login-card-body rounded"> | |
| 42 | - <p class="login-box-msg font-weight-bold" style="color: #555;">Visor Georreferenciado Multi-Tenant</p> | |
| 43 | - | |
| 44 | - <form id="loginForm"> | |
| 45 | - <label for="municipioSearch" class="text-xs text-muted mb-1" style="font-size: 0.8rem; text-transform: uppercase;">1. Entidad (Municipalidad)</label> | |
| 46 | - <div class="input-group mb-2"> | |
| 47 | - <input type="text" id="municipioSearch" class="form-control" placeholder="Buscar municipio (ej. 505)" autocomplete="off"> | |
| 48 | - <div class="input-group-append"> | |
| 49 | - <div class="input-group-text"> | |
| 50 | - <span class="fas fa-search"></span> | |
| 51 | - </div> | |
| 52 | - </div> | |
| 53 | - </div> | |
| 54 | - <div class="form-group mb-3"> | |
| 55 | - <select id="entidad" class="form-control" required size="3" style="height: 85px; cursor: pointer; font-size: 0.9rem;"> | |
| 56 | - <option value="505">Entidad 505 (Piloto GIS)</option> | |
| 57 | - <option value="800">Entidad 800 (Pruebas)</option> | |
| 58 | - <option value="900">Entidad 900 (Desarrollo)</option> | |
| 59 | - </select> | |
| 60 | - </div> | |
| 61 | - | |
| 62 | - <label class="text-xs text-muted mb-1" style="font-size: 0.8rem; text-transform: uppercase;">2. Credenciales</label> | |
| 63 | - <div class="input-group mb-3"> | |
| 64 | - <input type="text" id="username" class="form-control" placeholder="Usu_alias (ej. operador)" required autocomplete="username"> | |
| 65 | - <div class="input-group-append"> | |
| 66 | - <div class="input-group-text"> | |
| 67 | - <span class="fas fa-user"></span> | |
| 68 | - </div> | |
| 69 | - </div> | |
| 70 | - </div> | |
| 71 | - <div class="input-group mb-3"> | |
| 72 | - <input type="password" id="password" class="form-control" placeholder="Tu clave alfanumérica" required autocomplete="current-password"> | |
| 73 | - <div class="input-group-append"> | |
| 74 | - <div class="input-group-text"> | |
| 75 | - <span class="fas fa-lock"></span> | |
| 76 | - </div> | |
| 77 | - </div> | |
| 78 | - </div> | |
| 79 | - | |
| 80 | - <div id="error-msg" class="alert alert-danger p-2 mb-3 text-center" style="display:none; font-size: 13px;"></div> | |
| 81 | - | |
| 82 | - <div class="row mt-4"> | |
| 83 | - <div class="col-12"> | |
| 84 | - <button type="submit" class="btn btn-primary btn-block font-weight-bold" id="btn-login" style="padding: 10px;"> | |
| 85 | - <span id="btn-text">INICIAR SESIÓN</span> | |
| 86 | - <div class="spinner-border spinner-border-sm text-light" id="spinner" role="status" style="display:none; margin: auto;"></div> | |
| 87 | - </button> | |
| 88 | - </div> | |
| 89 | - </div> | |
| 90 | - </form> | |
| 91 | - </div> | |
| 92 | - <!-- /.login-card-body --> | |
| 93 | - </div> | |
| 94 | -</div> | |
| 95 | -<!-- /.login-box --> | |
| 96 | - | |
| 97 | -<!-- jQuery --> | |
| 98 | -<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> | |
| 99 | -<!-- Bootstrap 4 --> | |
| 100 | -<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script> | |
| 101 | -<!-- AdminLTE App --> | |
| 102 | -<script src="https://cdn.jsdelivr.net/npm/admin-lte@3.2/dist/js/adminlte.min.js"></script> | |
| 103 | - | |
| 104 | -<script> | |
| 105 | - // Filtro interactivo de municipios | |
| 106 | - const searchInput = document.getElementById('municipioSearch'); | |
| 107 | - const selectEntidad = document.getElementById('entidad'); | |
| 108 | - const originalOptions = Array.from(selectEntidad.options); | |
| 109 | - | |
| 110 | - searchInput.addEventListener('input', (e) => { | |
| 111 | - const text = e.target.value.toLowerCase(); | |
| 112 | - selectEntidad.innerHTML = ''; | |
| 113 | - originalOptions.forEach(opt => { | |
| 114 | - if (opt.text.toLowerCase().includes(text) || opt.value.includes(text)) { | |
| 115 | - selectEntidad.appendChild(opt); | |
| 116 | - } | |
| 117 | - }); | |
| 118 | - if (selectEntidad.options.length > 0) { | |
| 119 | - selectEntidad.options[0].selected = true; | |
| 120 | - } | |
| 121 | - }); | |
| 122 | - | |
| 123 | - // Limpiar sesión previa si por error caen al login | |
| 124 | - localStorage.removeItem('jwt'); | |
| 125 | - localStorage.removeItem('user_name'); | |
| 126 | - | |
| 127 | - document.getElementById('loginForm').addEventListener('submit', function(e) { | |
| 128 | - e.preventDefault(); | |
| 129 | - | |
| 130 | - const username = document.getElementById('username').value; | |
| 131 | - const password = document.getElementById('password').value; | |
| 132 | - const entidad = document.getElementById('entidad').value; | |
| 133 | - const errorMsg = document.getElementById('error-msg'); | |
| 134 | - const btnText = document.getElementById('btn-text'); | |
| 135 | - const spinner = document.getElementById('spinner'); | |
| 136 | - | |
| 137 | - // Bloquear UI | |
| 138 | - errorMsg.style.display = 'none'; | |
| 139 | - btnText.style.display = 'none'; | |
| 140 | - spinner.style.display = 'block'; | |
| 141 | - document.getElementById('btn-login').disabled = true; | |
| 142 | - | |
| 143 | - const payload = { | |
| 144 | - username: username, | |
| 145 | - password: password, | |
| 146 | - entidad: entidad | |
| 147 | - }; | |
| 148 | - | |
| 149 | - fetch('/gis-geoserver/api/auth/login', { | |
| 150 | - method: 'POST', | |
| 151 | - headers: { 'Content-Type': 'application/json' }, | |
| 152 | - body: JSON.stringify(payload) | |
| 153 | - }) | |
| 154 | - .then(response => { | |
| 155 | - if (!response.ok) { | |
| 156 | - return response.json().then(errData => { | |
| 157 | - throw new Error(errData.message || "Credenciales incorrectas."); | |
| 158 | - }); | |
| 159 | - } | |
| 160 | - return response.json(); | |
| 161 | - }) | |
| 162 | - .then(data => { | |
| 163 | - // LOGIN EXITOOSO! | |
| 164 | - localStorage.setItem('jwt', data.token); | |
| 165 | - localStorage.setItem('user_name', data.nombre); // Nombre completo del usuario | |
| 166 | - localStorage.setItem('entidad', entidad); | |
| 167 | - | |
| 168 | - // Persistir metadatos del Visor | |
| 169 | - localStorage.setItem('map_lat', data.lat); | |
| 170 | - localStorage.setItem('map_lng', data.lng); | |
| 171 | - localStorage.setItem('map_zoom', data.zoom); | |
| 172 | - localStorage.setItem('map_min_zoom', data.minZoom); | |
| 173 | - localStorage.setItem('map_max_zoom', data.maxZoom); | |
| 174 | - localStorage.setItem('mapa_base_id', data.mapaBase); | |
| 175 | - localStorage.setItem('map_bounds', data.bounds); | |
| 176 | - | |
| 177 | - // Redirigir a la URL del Mapas | |
| 178 | - window.location.href = "/gis-geoserver/landing"; | |
| 179 | - }) | |
| 180 | - .catch(error => { | |
| 181 | - // LOGIN ERROR | |
| 182 | - errorMsg.innerText = error.message; | |
| 183 | - errorMsg.style.display = 'block'; | |
| 184 | - | |
| 185 | - // Restaurar UI | |
| 186 | - btnText.style.display = 'block'; | |
| 187 | - spinner.style.display = 'none'; | |
| 188 | - document.getElementById('btn-login').disabled = false; | |
| 189 | - }); | |
| 190 | - }); | |
| 191 | -</script> | |
| 192 | -</body> | |
| 193 | -</html> |
GIS-GEOSERVER/target/classes/static/mapas.html deleted
| 1 | -<!DOCTYPE html> | |
| 2 | -<html lang="es"> | |
| 3 | - | |
| 4 | -<head> | |
| 5 | - <meta charset="UTF-8"> | |
| 6 | - <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| 7 | - <title>SISTEMA GIS - MapLibre 3D Elite</title> | |
| 8 | - <script> | |
| 9 | - if (!localStorage.getItem('jwt')) { | |
| 10 | - window.location.href = '/gis-geoserver/login'; | |
| 11 | - } | |
| 12 | - </script> | |
| 13 | - <!-- MapLibre GL JS --> | |
| 14 | - <script src="https://unpkg.com/maplibre-gl@3.6.2/dist/maplibre-gl.js"></script> | |
| 15 | - <link href="https://unpkg.com/maplibre-gl@3.6.2/dist/maplibre-gl.css" rel="stylesheet" /> | |
| 16 | - <style> | |
| 17 | - body, | |
| 18 | - html { | |
| 19 | - height: 100%; | |
| 20 | - margin: 0; | |
| 21 | - font-family: 'Inter', Arial, sans-serif; | |
| 22 | - background-color: #0f172a; | |
| 23 | - color: #fff; | |
| 24 | - overflow: hidden; | |
| 25 | - } | |
| 26 | - | |
| 27 | - .header { | |
| 28 | - height: 60px; | |
| 29 | - background: #1e293b; | |
| 30 | - display: flex; | |
| 31 | - align-items: center; | |
| 32 | - padding: 0 20px; | |
| 33 | - box-shadow: 0 4px 10px rgba(0, 0, 0, 0.5); | |
| 34 | - font-weight: bold; | |
| 35 | - justify-content: space-between; | |
| 36 | - position: relative; | |
| 37 | - z-index: 1001; | |
| 38 | - } | |
| 39 | - | |
| 40 | - .logout-btn { | |
| 41 | - background: rgba(255, 255, 255, 0.1); | |
| 42 | - border: 1px solid rgba(255, 255, 255, 0.3); | |
| 43 | - color: white; | |
| 44 | - padding: 8px 16px; | |
| 45 | - border-radius: 8px; | |
| 46 | - cursor: pointer; | |
| 47 | - transition: all 0.2s; | |
| 48 | - } | |
| 49 | - | |
| 50 | - .logout-btn:hover { | |
| 51 | - background: #ef4444; | |
| 52 | - border-color: #ef4444; | |
| 53 | - } | |
| 54 | - | |
| 55 | - .app-container { | |
| 56 | - display: flex; | |
| 57 | - height: calc(100vh - 60px); | |
| 58 | - } | |
| 59 | - | |
| 60 | - .sidebar { | |
| 61 | - width: 340px; | |
| 62 | - background: #0f172a; | |
| 63 | - border-right: 1px solid rgba(255, 255, 255, 0.1); | |
| 64 | - overflow-y: auto; | |
| 65 | - padding: 20px; | |
| 66 | - flex-shrink: 0; | |
| 67 | - } | |
| 68 | - | |
| 69 | - .menu-title { | |
| 70 | - font-size: 11px; | |
| 71 | - color: #64748b; | |
| 72 | - font-weight: 700; | |
| 73 | - text-transform: uppercase; | |
| 74 | - margin: 25px 0 10px; | |
| 75 | - letter-spacing: 1px; | |
| 76 | - } | |
| 77 | - | |
| 78 | - .menu-item { | |
| 79 | - padding: 12px 16px; | |
| 80 | - border-radius: 10px; | |
| 81 | - cursor: pointer; | |
| 82 | - display: flex; | |
| 83 | - align-items: center; | |
| 84 | - gap: 12px; | |
| 85 | - color: #94a3b8; | |
| 86 | - transition: all 0.2s; | |
| 87 | - margin-bottom: 4px; | |
| 88 | - border: 1px solid transparent; | |
| 89 | - text-decoration: none; | |
| 90 | - } | |
| 91 | - | |
| 92 | - .menu-item:hover { | |
| 93 | - background: rgba(255, 255, 255, 0.05); | |
| 94 | - color: #fff; | |
| 95 | - } | |
| 96 | - | |
| 97 | - .menu-item.active { | |
| 98 | - background: rgba(59, 130, 246, 0.1); | |
| 99 | - color: #3b82f6; | |
| 100 | - border-color: rgba(59, 130, 246, 0.3); | |
| 101 | - } | |
| 102 | - | |
| 103 | - .submenu { | |
| 104 | - padding-left: 10px; | |
| 105 | - margin-bottom: 15px; | |
| 106 | - } | |
| 107 | - | |
| 108 | - #map { | |
| 109 | - flex: 1; | |
| 110 | - position: relative; | |
| 111 | - } | |
| 112 | - | |
| 113 | - /* Stats Dashboard Overlay */ | |
| 114 | - .stats-grid { | |
| 115 | - display: grid; | |
| 116 | - grid-template-columns: 1fr 1fr; | |
| 117 | - gap: 10px; | |
| 118 | - margin-bottom: 20px; | |
| 119 | - } | |
| 120 | - | |
| 121 | - .stat-card { | |
| 122 | - background: rgba(255, 255, 255, 0.03); | |
| 123 | - padding: 15px; | |
| 124 | - border-radius: 12px; | |
| 125 | - border: 1px solid rgba(255, 255, 255, 0.05); | |
| 126 | - } | |
| 127 | - | |
| 128 | - .stat-label { | |
| 129 | - font-size: 11px; | |
| 130 | - color: #64748b; | |
| 131 | - text-transform: uppercase; | |
| 132 | - font-weight: 600; | |
| 133 | - } | |
| 134 | - | |
| 135 | - .stat-value { | |
| 136 | - font-size: 18px; | |
| 137 | - font-weight: 700; | |
| 138 | - color: #fff; | |
| 139 | - margin-top: 5px; | |
| 140 | - } | |
| 141 | - | |
| 142 | - /* Map Title Overlay */ | |
| 143 | - .map-title-overlay { | |
| 144 | - position: absolute; | |
| 145 | - top: 20px; | |
| 146 | - left: 50%; | |
| 147 | - transform: translateX(-50%); | |
| 148 | - background: rgba(15, 23, 42, 0.9); | |
| 149 | - padding: 8px 24px; | |
| 150 | - border-radius: 50px; | |
| 151 | - border: 1px solid rgba(255, 255, 255, 0.1); | |
| 152 | - color: #fff; | |
| 153 | - font-weight: 700; | |
| 154 | - font-size: 13px; | |
| 155 | - z-index: 1000; | |
| 156 | - backdrop-filter: blur(8px); | |
| 157 | - text-transform: uppercase; | |
| 158 | - letter-spacing: 1px; | |
| 159 | - } | |
| 160 | - | |
| 161 | - /* Toggle 3D Control */ | |
| 162 | - .map-controls-floating { | |
| 163 | - position: absolute; | |
| 164 | - top: 20px; | |
| 165 | - right: 20px; | |
| 166 | - z-index: 1000; | |
| 167 | - display: flex; | |
| 168 | - flex-direction: column; | |
| 169 | - gap: 10px; | |
| 170 | - } | |
| 171 | - | |
| 172 | - .map-btn { | |
| 173 | - background: rgba(15, 23, 42, 0.9); | |
| 174 | - border: 1px solid rgba(255, 255, 255, 0.1); | |
| 175 | - color: white; | |
| 176 | - padding: 10px; | |
| 177 | - border-radius: 10px; | |
| 178 | - cursor: pointer; | |
| 179 | - backdrop-filter: blur(8px); | |
| 180 | - display: flex; | |
| 181 | - align-items: center; | |
| 182 | - gap: 8px; | |
| 183 | - font-weight: 600; | |
| 184 | - font-size: 12px; | |
| 185 | - transition: all 0.2s; | |
| 186 | - } | |
| 187 | - | |
| 188 | - .map-btn:hover { | |
| 189 | - background: #1e293b; | |
| 190 | - border-color: #3b82f6; | |
| 191 | - } | |
| 192 | - | |
| 193 | - .map-btn.active { | |
| 194 | - background: #3b82f6; | |
| 195 | - border-color: #3b82f6; | |
| 196 | - } | |
| 197 | - | |
| 198 | - /* Legend */ | |
| 199 | - .legend { | |
| 200 | - position: absolute; | |
| 201 | - bottom: 30px; | |
| 202 | - right: 30px; | |
| 203 | - background: rgba(15, 23, 42, 0.9); | |
| 204 | - padding: 15px; | |
| 205 | - border-radius: 12px; | |
| 206 | - border: 1px solid rgba(255, 255, 255, 0.1); | |
| 207 | - backdrop-filter: blur(10px); | |
| 208 | - color: white; | |
| 209 | - font-size: 12px; | |
| 210 | - z-index: 1000; | |
| 211 | - box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5); | |
| 212 | - display: none; | |
| 213 | - } | |
| 214 | - | |
| 215 | - .legend-item { | |
| 216 | - display: flex; | |
| 217 | - align-items: center; | |
| 218 | - gap: 8px; | |
| 219 | - margin-bottom: 5px; | |
| 220 | - } | |
| 221 | - | |
| 222 | - .legend-color { | |
| 223 | - width: 12px; | |
| 224 | - height: 12px; | |
| 225 | - border-radius: 3px; | |
| 226 | - } | |
| 227 | - | |
| 228 | - /* Custom Popup Style */ | |
| 229 | - .maplibregl-popup-content { | |
| 230 | - background: #1e293b; | |
| 231 | - color: white; | |
| 232 | - border-radius: 12px; | |
| 233 | - padding: 0; | |
| 234 | - border: 1px solid rgba(255, 255, 255, 0.1); | |
| 235 | - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5); | |
| 236 | - } | |
| 237 | - | |
| 238 | - .maplibregl-popup-tip { | |
| 239 | - border-top-color: #1e293b; | |
| 240 | - } | |
| 241 | - | |
| 242 | - .popup-header { | |
| 243 | - background: #3b82f6; | |
| 244 | - padding: 12px; | |
| 245 | - border-radius: 10px 10px 0 0; | |
| 246 | - font-weight: 700; | |
| 247 | - font-size: 13px; | |
| 248 | - text-transform: uppercase; | |
| 249 | - } | |
| 250 | - | |
| 251 | - .popup-body { | |
| 252 | - padding: 15px; | |
| 253 | - } | |
| 254 | - | |
| 255 | - .popup-stat { | |
| 256 | - margin-bottom: 10px; | |
| 257 | - } | |
| 258 | - | |
| 259 | - .popup-label { | |
| 260 | - font-size: 10px; | |
| 261 | - color: #64748b; | |
| 262 | - text-transform: uppercase; | |
| 263 | - } | |
| 264 | - | |
| 265 | - .popup-value { | |
| 266 | - font-size: 13px; | |
| 267 | - font-weight: 600; | |
| 268 | - } | |
| 269 | - | |
| 270 | - /* Leyenda de morosidad con Glassmorphism */ | |
| 271 | - .map-legend { | |
| 272 | - position: absolute; | |
| 273 | - bottom: 30px; | |
| 274 | - right: 20px; | |
| 275 | - background: rgba(15, 23, 42, 0.85); | |
| 276 | - padding: 18px; | |
| 277 | - border-radius: 16px; | |
| 278 | - border: 1px solid rgba(255, 255, 255, 0.1); | |
| 279 | - color: #f1f5f9; | |
| 280 | - font-size: 11px; | |
| 281 | - z-index: 1000; | |
| 282 | - backdrop-filter: blur(12px); | |
| 283 | - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5); | |
| 284 | - max-width: 240px; | |
| 285 | - } | |
| 286 | - | |
| 287 | - .legend-item { | |
| 288 | - display: flex; | |
| 289 | - align-items: center; | |
| 290 | - margin-bottom: 8px; | |
| 291 | - gap: 10px; | |
| 292 | - } | |
| 293 | - | |
| 294 | - .legend-color { | |
| 295 | - width: 30px; | |
| 296 | - height: 12px; | |
| 297 | - border-radius: 4px; | |
| 298 | - border: 1px solid rgba(255, 255, 255, 0.1); | |
| 299 | - } | |
| 300 | - | |
| 301 | - /* Capas Switcher */ | |
| 302 | - .layer-switcher { | |
| 303 | - position: absolute; | |
| 304 | - top: 20px; | |
| 305 | - right: 50px; | |
| 306 | - background: rgba(13, 17, 23, 0.9); | |
| 307 | - padding: 10px; | |
| 308 | - border-radius: 8px; | |
| 309 | - border: 1px solid rgba(255, 255, 255, 0.1); | |
| 310 | - z-index: 10; | |
| 311 | - } | |
| 312 | - </style> | |
| 313 | -</head> | |
| 314 | - | |
| 315 | -<body> | |
| 316 | - <div class="header"> | |
| 317 | - <div>SIGEM GIS <span id="user-greeting" | |
| 318 | - style="font-size: 13px; font-weight: normal; margin-left: 10px; opacity: 0.7;"></span></div> | |
| 319 | - <button class="logout-btn" onclick="logout()">Cerrar Sesión</button> | |
| 320 | - </div> | |
| 321 | - <div class="app-container"> | |
| 322 | - <div class="sidebar"> | |
| 323 | - <div id="stats-dashboard"> | |
| 324 | - <div class="menu-title">Resumen Municipal</div> | |
| 325 | - <div class="stats-grid"> | |
| 326 | - <div class="stat-card"> | |
| 327 | - <div class="stat-label">Total Lotes</div> | |
| 328 | - <div id="stat-lotes" class="stat-value">...</div> | |
| 329 | - </div> | |
| 330 | - <div class="stat-card"> | |
| 331 | - <div class="stat-label">Morosidad</div> | |
| 332 | - <div id="stat-morosos" class="stat-value" style="color: #f87171;">...</div> | |
| 333 | - </div> | |
| 334 | - </div> | |
| 335 | - </div> | |
| 336 | - | |
| 337 | - <div class="menu-title">Control de Gestión</div> | |
| 338 | - <div id="menu-reset" class="menu-item active" onclick="resetMap()">Capas Base</div> | |
| 339 | - | |
| 340 | - <div class="menu-title">Mapas Tributarios</div> | |
| 341 | - <div class="submenu"> | |
| 342 | - <div id="menu-ultimo-pago" class="menu-item" onclick="setHeatmap('ultimo-pago')">Por Último Pago | |
| 343 | - </div> | |
| 344 | - <div id="menu-percentiles" class="menu-item" onclick="setHeatmap('percentiles')">Por Total | |
| 345 | - (Percentiles)</div> | |
| 346 | - <div id="menu-wms-test" class="menu-item" onclick="toggleWmsLayer()" | |
| 347 | - style="color: #fbbf24; border-top: 1px dashed #444; margin-top: 5px; font-weight: bold; display: none;"> | |
| 348 | - Vista PNG (Full) <span id="wms-status" style="font-size: 9px; opacity: 0.6;">[OFF]</span> | |
| 349 | - </div> | |
| 350 | - </div> | |
| 351 | - | |
| 352 | - <div class="menu-title">Administración</div> | |
| 353 | - <div id="btn-update-data" class="menu-item" onclick="updateMunicipalData()" style="color: #60a5fa;"> | |
| 354 | - <span id="update-icon"></span> <span id="update-text">Actualizar FDW</span> | |
| 355 | - </div> | |
| 356 | - | |
| 357 | - </div> | |
| 358 | - | |
| 359 | - <div id="map"> | |
| 360 | - <!-- Leyenda Dinámica --> | |
| 361 | - <div class="map-legend" id="legend" style="display: none;"> | |
| 362 | - <div id="legend-content"></div> | |
| 363 | - <div | |
| 364 | - style="font-size: 10px; margin-top: 10px; border-top: 1px solid #333; padding-top: 5px; color: #888;"> | |
| 365 | - Fuente: Sistema SIGEM</div> | |
| 366 | - </div> | |
| 367 | - | |
| 368 | - <!-- Selector de Capas Base --> | |
| 369 | - <div class="layer-switcher" style="position: absolute; top: 15px; left: 15px; z-index: 1000;"> | |
| 370 | - <select id="base-layer-select" | |
| 371 | - style="background: rgba(15, 23, 42, 0.9); color: white; border: 1px solid rgba(255,255,255,0.2); padding: 5px 10px; border-radius: 8px; font-size: 11px; cursor: pointer; backdrop-filter: blur(8px);"> | |
| 372 | - <option value="dark">CartoDB Dark</option> | |
| 373 | - <option value="streets">OpenStreetMap</option> | |
| 374 | - <option value="satellite">Esri Satélite</option> | |
| 375 | - <option value="google">Google Satélite</option> | |
| 376 | - </select> | |
| 377 | - </div> | |
| 378 | - <div id="map-title" class="map-title-overlay">Vista Cartográfica General</div> | |
| 379 | - </div> | |
| 380 | - </div> | |
| 381 | - | |
| 382 | - <script> | |
| 383 | - const userName = localStorage.getItem('user_name'); | |
| 384 | - if (userName) document.getElementById('user-greeting').innerText = `| Bienvenido, ${userName}`; | |
| 385 | - | |
| 386 | - const entidad = localStorage.getItem('entidad') || '505'; | |
| 387 | - const token = localStorage.getItem('jwt'); | |
| 388 | - const geoserverBase = 'gwc/service/wmts'; | |
| 389 | - | |
| 390 | - function logout() { | |
| 391 | - localStorage.clear(); | |
| 392 | - window.location.href = '/gis-geoserver/login'; | |
| 393 | - } | |
| 394 | - | |
| 395 | - // --- Inicialización del Mapa --- | |
| 396 | - const lat = parseFloat(localStorage.getItem('map_lat')) || -25.449; | |
| 397 | - const lng = parseFloat(localStorage.getItem('map_lng')) || -56.443; | |
| 398 | - const zoom = parseInt(localStorage.getItem('map_zoom')) || 15; | |
| 399 | - | |
| 400 | - const map = new maplibregl.Map({ | |
| 401 | - container: 'map', | |
| 402 | - style: { | |
| 403 | - version: 8, | |
| 404 | - sources: { | |
| 405 | - 'raster-tiles': { | |
| 406 | - type: 'raster', | |
| 407 | - tiles: ['https://a.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png'], | |
| 408 | - tileSize: 256, | |
| 409 | - attribution: '© CartoDB' | |
| 410 | - } | |
| 411 | - }, | |
| 412 | - layers: [{ | |
| 413 | - id: 'basemap', | |
| 414 | - type: 'raster', | |
| 415 | - source: 'raster-tiles', | |
| 416 | - minzoom: 0, | |
| 417 | - maxzoom: 20 | |
| 418 | - }] | |
| 419 | - }, | |
| 420 | - center: [lng, lat], | |
| 421 | - zoom: zoom, | |
| 422 | - pitch: 0, | |
| 423 | - bearing: 0, | |
| 424 | - antialias: true | |
| 425 | - }); | |
| 426 | - | |
| 427 | - map.addControl(new maplibregl.NavigationControl({ position: 'bottom-left' })); | |
| 428 | - | |
| 429 | - // --- Carga de Capas Vectoriales --- | |
| 430 | - map.on('load', () => { | |
| 431 | - initGisSources(); | |
| 432 | - loadMunicipalStats(); | |
| 433 | - }); | |
| 434 | - | |
| 435 | - function initGisSources() { | |
| 436 | - console.log("Cargando fuentes vectoriales (MVT)..."); | |
| 437 | - | |
| 438 | - // Fuente de Lotes (MVT) - TMS Nativo de GeoServer | |
| 439 | - if (!map.getSource('lotes-mvt')) { | |
| 440 | - map.addSource('lotes-mvt', { | |
| 441 | - type: 'vector', | |
| 442 | - tiles: [ | |
| 443 | - `${window.location.origin}/gis-geoserver/gwc/service/tms/1.0.0/sigem:vw_lotes_morosidad_${entidad}@XYZ-900913@pbf/{z}/{x}/{y}.pbf` | |
| 444 | - ], | |
| 445 | - scheme: 'tms' | |
| 446 | - }); | |
| 447 | - } | |
| 448 | - | |
| 449 | - // Capa de Lotes (2D) - Visibilidad Inicial Mejorada | |
| 450 | - if (!map.getLayer('lotes-layer')) { | |
| 451 | - map.addLayer({ | |
| 452 | - id: 'lotes-layer', | |
| 453 | - type: 'fill', | |
| 454 | - source: 'lotes-mvt', | |
| 455 | - 'source-layer': `vw_lotes_morosidad_${entidad}`, | |
| 456 | - paint: { | |
| 457 | - 'fill-color': 'rgba(59, 130, 246, 0.1)', // Azul tenue inicial | |
| 458 | - 'fill-outline-color': 'rgba(255, 255, 255, 0.3)' // Borde blanco visible | |
| 459 | - } | |
| 460 | - }); | |
| 461 | - } | |
| 462 | - | |
| 463 | - // Fuente de Mejoras (MVT) - TMS Nativo de GeoServer | |
| 464 | - if (!map.getSource('mejoras-mvt')) { | |
| 465 | - map.addSource('mejoras-mvt', { | |
| 466 | - type: 'vector', | |
| 467 | - tiles: [ | |
| 468 | - `${window.location.origin}/gis-geoserver/gwc/service/tms/1.0.0/sigem:e${entidad}_mejoras@XYZ-900913@pbf/{z}/{x}/{y}.pbf` | |
| 469 | - ], | |
| 470 | - scheme: 'tms' | |
| 471 | - }); | |
| 472 | - } | |
| 473 | - | |
| 474 | - // [PRUEBA CONTROLADA] Fuente Raster WMS (Renderizado en Servidor) | |
| 475 | - if (!map.getSource('lotes-wms')) { | |
| 476 | - map.addSource('lotes-wms', { | |
| 477 | - 'type': 'raster', | |
| 478 | - 'tiles': [ | |
| 479 | - `${window.location.origin}/gis-geoserver/sigem/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&LAYERS=sigem:vw_lotes_morosidad_${entidad}&STYLES=morosidad_style_wms&FORMAT=image/png&TRANSPARENT=TRUE&WIDTH=256&HEIGHT=256&SRS=EPSG:3857&BBOX={bbox-epsg-3857}` | |
| 480 | - ], | |
| 481 | - 'tileSize': 256 | |
| 482 | - }); | |
| 483 | - } | |
| 484 | - | |
| 485 | - if (!map.getLayer('lotes-wms-layer')) { | |
| 486 | - map.addLayer({ | |
| 487 | - 'id': 'lotes-wms-layer', | |
| 488 | - 'type': 'raster', | |
| 489 | - 'source': 'lotes-wms', | |
| 490 | - 'paint': { 'raster-opacity': 0.8 }, | |
| 491 | - 'layout': { 'visibility': 'none' } | |
| 492 | - }); // Agregamos al final | |
| 493 | - } | |
| 494 | - | |
| 495 | - // Capa de Mejoras (Inicialmente oculta o 2D) | |
| 496 | - if (!map.getLayer('mejoras-layer')) { | |
| 497 | - map.addLayer({ | |
| 498 | - id: 'mejoras-layer', | |
| 499 | - type: 'fill', | |
| 500 | - source: 'mejoras-mvt', | |
| 501 | - 'source-layer': `e${entidad}_mejoras`, | |
| 502 | - paint: { | |
| 503 | - 'fill-color': 'rgba(59, 130, 246, 0.2)', | |
| 504 | - 'fill-outline-color': 'rgba(59, 130, 246, 0.5)' | |
| 505 | - } | |
| 506 | - }); | |
| 507 | - } | |
| 508 | - } | |
| 509 | - | |
| 510 | - // --- Lógica de Capas Base (Estricto Fondo Nativo) --- | |
| 511 | - const baseConfig = { | |
| 512 | - 'dark': { url: 'https://a.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png', sourceMax: 20 }, | |
| 513 | - 'streets': { url: 'https://a.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png', sourceMax: 20 }, | |
| 514 | - 'satellite': { url: 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', sourceMax: 17 }, | |
| 515 | - 'google': { url: 'https://mt1.google.com/vt/lyrs=s&x={x}&y={y}&z={z}', sourceMax: 21 } | |
| 516 | - }; | |
| 517 | - | |
| 518 | - document.getElementById('base-layer-select').addEventListener('change', (e) => { | |
| 519 | - const config = baseConfig[e.target.value]; | |
| 520 | - | |
| 521 | - if (map.getLayer('basemap')) map.removeLayer('basemap'); | |
| 522 | - if (map.getSource('raster-tiles')) map.removeSource('raster-tiles'); | |
| 523 | - | |
| 524 | - map.addSource('raster-tiles', { | |
| 525 | - type: 'raster', | |
| 526 | - tiles: [config.url], | |
| 527 | - tileSize: 256, | |
| 528 | - maxzoom: config.sourceMax // Limite del satélite, a partir de acá MapLibre estirará la foto | |
| 529 | - }); | |
| 530 | - | |
| 531 | - // Empujar el fondo debajo de todas las capas existentes (cero interferencia visual) | |
| 532 | - let zIndexFloor = null; | |
| 533 | - const currentLayers = map.getStyle().layers; | |
| 534 | - if (currentLayers.length > 0) { | |
| 535 | - zIndexFloor = currentLayers[0].id; | |
| 536 | - } | |
| 537 | - | |
| 538 | - map.addLayer({ | |
| 539 | - id: 'basemap', | |
| 540 | - type: 'raster', | |
| 541 | - source: 'raster-tiles', | |
| 542 | - minzoom: 0, // Dibuja desde el espacio | |
| 543 | - maxzoom: 23 // Dibuja hasta nivel vecinal, reciclando loseta gracias a sourceMax | |
| 544 | - }, zIndexFloor); | |
| 545 | - }); | |
| 546 | - | |
| 547 | - // Lógica de 3D eliminada por requerimiento de usuario | |
| 548 | - | |
| 549 | - | |
| 550 | - // --- Mapa de Calor (Heatmap) via Expresiones --- | |
| 551 | - function setHeatmap(type) { | |
| 552 | - document.querySelectorAll('.menu-item').forEach(el => el.classList.remove('active')); | |
| 553 | - const titleEl = document.getElementById('map-title'); | |
| 554 | - const legendEl = document.getElementById('legend'); | |
| 555 | - const legendContent = document.getElementById('legend-content'); | |
| 556 | - legendEl.style.display = 'block'; | |
| 557 | - | |
| 558 | - if (type === 'ultimo-pago') { | |
| 559 | - document.getElementById('menu-ultimo-pago').classList.add('active'); | |
| 560 | - titleEl.textContent = 'Morosidad - Último Pago'; | |
| 561 | - map.setLayoutProperty('lotes-layer', 'visibility', 'visible'); | |
| 562 | - | |
| 563 | - // Mostrar botón de prueba WMS solo en este modo | |
| 564 | - document.getElementById('menu-wms-test').style.display = 'block'; | |
| 565 | - | |
| 566 | - legendContent.innerHTML = ` | |
| 567 | - <strong style="color: #60a5fa;">ÚLTIMO PAGO</strong><br><br> | |
| 568 | - <div class="legend-item"><div class="legend-color" style="background: #6b9070;"></div> 2026</div> | |
| 569 | - <div class="legend-item"><div class="legend-color" style="background: #b5c47a;"></div> 2025</div> | |
| 570 | - <div class="legend-item"><div class="legend-color" style="background: #ffd966;"></div> 2024</div> | |
| 571 | - <div class="legend-item"><div class="legend-color" style="background: #f08060;"></div> 2023</div> | |
| 572 | - <div class="legend-item"><div class="legend-color" style="background: #d05660;"></div> 2022</div> | |
| 573 | - <div class="legend-item"><div class="legend-color" style="background: #a91d1d;"></div> 2021</div> | |
| 574 | - <div class="legend-item"><div class="legend-color" style="background: #64748b;"></div> SIN DEUDA / PRESCRIPTAS</div> | |
| 575 | - `; | |
| 576 | - | |
| 577 | - map.setPaintProperty('lotes-layer', 'fill-color', [ | |
| 578 | - 'step', | |
| 579 | - ['get', 'ultimo_pago'], | |
| 580 | - '#a91d1d', // < 2021 | |
| 581 | - 2021, '#a91d1d', | |
| 582 | - 2022, '#d05660', | |
| 583 | - 2023, '#f08060', | |
| 584 | - 2024, '#ffd966', | |
| 585 | - 2025, '#b5c47a', | |
| 586 | - 2026, '#6b9070' | |
| 587 | - ]); | |
| 588 | - } else if (type === 'percentiles') { | |
| 589 | - document.getElementById('menu-percentiles').classList.add('active'); | |
| 590 | - titleEl.textContent = 'Morosidad - Total Adeudado'; | |
| 591 | - map.setLayoutProperty('lotes-layer', 'visibility', 'visible'); | |
| 592 | - | |
| 593 | - // Ocultar botón de prueba WMS | |
| 594 | - document.getElementById('menu-wms-test').style.display = 'none'; | |
| 595 | - | |
| 596 | - legendContent.innerHTML = ` | |
| 597 | - <strong style="color: #60a5fa;">TOTAL ADEUDADO</strong><br><br> | |
| 598 | - <div class="legend-item"><div class="legend-color" style="background: #a91d1d;"></div> > 2.099.321 Gs</div> | |
| 599 | - <div class="legend-item"><div class="legend-color" style="background: #f08060;"></div> <= 2.099.321 Gs</div> | |
| 600 | - <div class="legend-item"><div class="legend-color" style="background: #ffd966;"></div> <= 1.226.945 Gs</div> | |
| 601 | - <div class="legend-item"><div class="legend-color" style="background: #b5c47a;"></div> <= 714.968 Gs</div> | |
| 602 | - <div class="legend-item"><div class="legend-color" style="background: #6b9070;"></div> <= 351.584 Gs</div> | |
| 603 | - <div class="legend-item"><div class="legend-color" style="background: #64748b;"></div> NO REGISTRADOS</div> | |
| 604 | - `; | |
| 605 | - | |
| 606 | - map.setPaintProperty('lotes-layer', 'fill-color', [ | |
| 607 | - 'step', | |
| 608 | - ['get', 'trb_total_deuda'], | |
| 609 | - '#6b9070', // < 351k | |
| 610 | - 351585, '#b5c47a', | |
| 611 | - 714969, '#ffd966', | |
| 612 | - 1226946, '#f08060', | |
| 613 | - 2099322, '#a91d1d' | |
| 614 | - ]); | |
| 615 | - } | |
| 616 | - // Aseguramos que el borde sea visible en modo heatmap | |
| 617 | - map.setPaintProperty('lotes-layer', 'fill-outline-color', 'rgba(255, 255, 255, 0.4)'); | |
| 618 | - } | |
| 619 | - | |
| 620 | - function resetMap() { | |
| 621 | - document.querySelectorAll('.menu-item').forEach(el => el.classList.remove('active')); | |
| 622 | - document.getElementById('menu-reset').classList.add('active'); | |
| 623 | - document.getElementById('map-title').textContent = 'Vista Cartográfica General'; | |
| 624 | - document.getElementById('legend').style.display = 'none'; | |
| 625 | - map.setPaintProperty('lotes-layer', 'fill-color', 'rgba(255, 255, 255, 0.05)'); | |
| 626 | - | |
| 627 | - // Ocultamos WMS si está activo al resetear | |
| 628 | - if(map.getLayer('lotes-wms-layer')) { | |
| 629 | - map.setLayoutProperty('lotes-wms-layer', 'visibility', 'none'); | |
| 630 | - document.getElementById('wms-status').innerText = '[OFF]'; | |
| 631 | - document.getElementById('menu-wms-test').classList.remove('active'); | |
| 632 | - } | |
| 633 | - // Ocultar botón de prueba WMS al resetear | |
| 634 | - document.getElementById('menu-wms-test').style.display = 'none'; | |
| 635 | - } | |
| 636 | - | |
| 637 | - // --- Control de Prueba Controlada WMS --- | |
| 638 | - function toggleWmsLayer() { | |
| 639 | - const entidad = localStorage.getItem('entidad') || '505'; | |
| 640 | - | |
| 641 | - // Si la capa no existe, la creamos | |
| 642 | - if (!map.getSource('lotes-wms')) { | |
| 643 | - map.addSource('lotes-wms', { | |
| 644 | - 'type': 'raster', | |
| 645 | - 'tiles': [ | |
| 646 | - `${window.location.origin}/gis-geoserver/sigem/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&LAYERS=sigem:vw_lotes_morosidad_${entidad}&STYLES=morosidad_style_wms&FORMAT=image/png&TRANSPARENT=TRUE&WIDTH=256&HEIGHT=256&SRS=EPSG:3857&BBOX={bbox-epsg-3857}` | |
| 647 | - ], | |
| 648 | - 'tileSize': 256 | |
| 649 | - }); | |
| 650 | - | |
| 651 | - map.addLayer({ | |
| 652 | - 'id': 'lotes-wms-layer', | |
| 653 | - 'type': 'raster', | |
| 654 | - 'source': 'lotes-wms', | |
| 655 | - 'layout': { 'visibility': 'none' }, | |
| 656 | - 'paint': { 'raster-opacity': 0.8 } | |
| 657 | - }, 'lotes-layer'); // Debajo de la capa de interacción MVT | |
| 658 | - } | |
| 659 | - | |
| 660 | - const isVisible = map.getLayoutProperty('lotes-wms-layer', 'visibility') === 'visible'; | |
| 661 | - const nextVisibility = isVisible ? 'none' : 'visible'; | |
| 662 | - const statusEl = document.getElementById('wms-status'); | |
| 663 | - const menuEl = document.getElementById('menu-wms-test'); | |
| 664 | - | |
| 665 | - map.setLayoutProperty('lotes-wms-layer', 'visibility', nextVisibility); | |
| 666 | - | |
| 667 | - if (nextVisibility === 'visible') { | |
| 668 | - statusEl.innerText = '[ON]'; | |
| 669 | - menuEl.classList.add('active'); | |
| 670 | - // Opcional: Ocultar MVT para mejor rendimiento visual en PNG Full | |
| 671 | - // map.setLayoutProperty('lotes-layer', 'visibility', 'none'); | |
| 672 | - } else { | |
| 673 | - statusEl.innerText = '[OFF]'; | |
| 674 | - menuEl.classList.remove('active'); | |
| 675 | - map.setLayoutProperty('lotes-layer', 'visibility', 'visible'); | |
| 676 | - } | |
| 677 | - } | |
| 678 | - | |
| 679 | - // --- Popups Instantáneos (MVT Data) --- | |
| 680 | - map.on('click', 'lotes-layer', (e) => { | |
| 681 | - const props = e.features[0].properties; | |
| 682 | - const content = ` | |
| 683 | - <div class="popup-header">ESTADO DE CUENTA: ${props.ccc || 'N/A'}</div> | |
| 684 | - <div class="popup-body"> | |
| 685 | - <div class="popup-grid" style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> | |
| 686 | - <div class="popup-stat"> | |
| 687 | - <div class="popup-label">Nro Ficha</div> | |
| 688 | - <div class="popup-value">${props.inm_ficha || '0'}</div> | |
| 689 | - </div> | |
| 690 | - <div class="popup-stat"> | |
| 691 | - <div class="popup-label">Cta. Catastral</div> | |
| 692 | - <div class="popup-value" style="font-size: 11px;">${props.inm_ctacatastral || 'N/A'}</div> | |
| 693 | - </div> | |
| 694 | - </div> | |
| 695 | - <hr style="opacity: 0.1; margin: 10px 0;"> | |
| 696 | - <div class="popup-stat"> | |
| 697 | - <div class="popup-label">Total Adeudado</div> | |
| 698 | - <div class="popup-value" style="color: #f87171; font-size: 16px;">Gs. ${props.trb_total_deuda ? parseFloat(props.trb_total_deuda).toLocaleString('es-PY') : '0'}</div> | |
| 699 | - </div> | |
| 700 | - <div class="popup-grid" style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 10px;"> | |
| 701 | - <div class="popup-stat"> | |
| 702 | - <div class="popup-label">Total Pagado</div> | |
| 703 | - <div class="popup-value" style="color: #10b981;">Gs. ${props.trb_total_pago ? parseFloat(props.trb_total_pago).toLocaleString('es-PY') : '0'}</div> | |
| 704 | - </div> | |
| 705 | - <div class="popup-stat"> | |
| 706 | - <div class="popup-label">Último Pago</div> | |
| 707 | - <div class="popup-value">${props.ultimo_pago || 'Nunca'}</div> | |
| 708 | - </div> | |
| 709 | - </div> | |
| 710 | - <button class="logout-btn" style="width: 100%; margin-top: 15px; font-size: 11px; background: #60a5fa; color: #fff;">📄 Ver Detalles SIGEM</button> | |
| 711 | - </div> | |
| 712 | - `; | |
| 713 | - | |
| 714 | - new maplibregl.Popup() | |
| 715 | - .setLngLat(e.lngLat) | |
| 716 | - .setHTML(content) | |
| 717 | - .addTo(map); | |
| 718 | - }); | |
| 719 | - | |
| 720 | - map.on('mouseenter', 'lotes-layer', () => map.getCanvas().style.cursor = 'pointer'); | |
| 721 | - map.on('mouseleave', 'lotes-layer', () => map.getCanvas().style.cursor = ''); | |
| 722 | - | |
| 723 | - async function updateMunicipalData() { | |
| 724 | - const btn = document.getElementById('btn-update-data'); | |
| 725 | - const icon = document.getElementById('update-icon'); | |
| 726 | - const text = document.getElementById('update-text'); | |
| 727 | - | |
| 728 | - btn.style.pointerEvents = 'none'; | |
| 729 | - btn.style.opacity = '0.5'; | |
| 730 | - text.innerText = 'Procesando FDW...'; | |
| 731 | - icon.classList.add('rotating'); // Podríamos añadir CSS para rotar | |
| 732 | - | |
| 733 | - try { | |
| 734 | - const res = await fetch(`/gis-geoserver/api/admin/fdw/update/${entidad}`, { | |
| 735 | - method: 'POST', | |
| 736 | - headers: { 'Authorization': `Bearer ${token}` } | |
| 737 | - }); | |
| 738 | - const data = await res.json(); | |
| 739 | - | |
| 740 | - if (data.success) { | |
| 741 | - alert("✅ Éxito: " + data.message); | |
| 742 | - location.reload(); // Recargamos para ver los cambios | |
| 743 | - } else { | |
| 744 | - alert("❌ Error: " + data.message); | |
| 745 | - } | |
| 746 | - } catch (err) { | |
| 747 | - console.error("Error en update:", err); | |
| 748 | - alert("❌ Error de conexión con el servidor de administración."); | |
| 749 | - } finally { | |
| 750 | - btn.style.pointerEvents = 'auto'; | |
| 751 | - btn.style.opacity = '1'; | |
| 752 | - text.innerText = 'Actualizar FDW'; | |
| 753 | - } | |
| 754 | - } | |
| 755 | - | |
| 756 | - async function loadMunicipalStats() { | |
| 757 | - try { | |
| 758 | - const res = await fetch(`/gis-geoserver/api/gis/entidad/${entidad}/resumen`, { | |
| 759 | - headers: { 'Authorization': `Bearer ${token}` } | |
| 760 | - }); | |
| 761 | - const data = await res.json(); | |
| 762 | - document.getElementById('stat-lotes').innerText = data.total_lotes.toLocaleString(); | |
| 763 | - document.getElementById('stat-morosos').innerText = data.lotes_con_deuda.toLocaleString(); | |
| 764 | - } catch (err) { console.error("Error stats:", err); } | |
| 765 | - } | |
| 766 | - </script> | |
| 767 | -</body> | |
| 768 | - | |
| 769 | -</html> | |
| 770 | 0 | \ No newline at end of file |
GIS-GEOSERVER/target/classes/static/widgets.html deleted
| 1 | -<!DOCTYPE html> | |
| 2 | -<html lang="es"> | |
| 3 | -<head> | |
| 4 | - <meta charset="utf-8"> | |
| 5 | - <meta name="viewport" content="width=device-width, initial-scale=1"> | |
| 6 | - <!-- Google Font: Source Sans Pro --> | |
| 7 | - <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback"> | |
| 8 | - <!-- Font Awesome --> | |
| 9 | - <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css"> | |
| 10 | - <!-- Theme style AdminLTE 3 --> | |
| 11 | - <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/admin-lte@3.2/dist/css/adminlte.min.css"> | |
| 12 | - <style> | |
| 13 | - body { background-color: #f4f6f9; padding: 20px; font-family: 'Source Sans Pro', sans-serif; } | |
| 14 | - .welcome-header { font-size: 24px; color: #333; margin-bottom: 20px; font-weight: 600;} | |
| 15 | - </style> | |
| 16 | -</head> | |
| 17 | -<body> | |
| 18 | - <div class="welcome-header"> | |
| 19 | - <i class="fas fa-home text-primary"></i> Tablero General (Estadísticas Simuladas) | |
| 20 | - </div> | |
| 21 | - | |
| 22 | - <div class="row"> | |
| 23 | - <!-- Tarjeta 1 --> | |
| 24 | - <div class="col-lg-3 col-6"> | |
| 25 | - <div class="small-box bg-info shadow-sm"> | |
| 26 | - <div class="inner"> | |
| 27 | - <h3>99,999</h3> | |
| 28 | - <p>Lotes Registrados</p> | |
| 29 | - </div> | |
| 30 | - <div class="icon"> | |
| 31 | - <i class="fas fa-map-marked-alt"></i> | |
| 32 | - </div> | |
| 33 | - <a href="#" class="small-box-footer" onclick="alert('OPCIÓN NO IMPLEMENTADA')">Más info <i class="fas fa-arrow-circle-right"></i></a> | |
| 34 | - </div> | |
| 35 | - </div> | |
| 36 | - <!-- Tarjeta 2 --> | |
| 37 | - <div class="col-lg-3 col-6"> | |
| 38 | - <div class="small-box bg-success shadow-sm"> | |
| 39 | - <div class="inner"> | |
| 40 | - <h3>Gs. ---<sup style="font-size: 20px"></sup></h3> | |
| 41 | - <p>Recaudación del Día</p> | |
| 42 | - </div> | |
| 43 | - <div class="icon"> | |
| 44 | - <i class="fas fa-hand-holding-usd"></i> | |
| 45 | - </div> | |
| 46 | - <a href="#" class="small-box-footer" onclick="alert('OPCIÓN NO IMPLEMENTADA')">Más info <i class="fas fa-arrow-circle-right"></i></a> | |
| 47 | - </div> | |
| 48 | - </div> | |
| 49 | - | |
| 50 | - <!-- Tarjeta 3 --> | |
| 51 | - <div class="col-lg-3 col-6"> | |
| 52 | - <div class="small-box bg-warning shadow-sm"> | |
| 53 | - <div class="inner"> | |
| 54 | - <h3>---</h3> | |
| 55 | - <p>Nuevas Actividades Comerciales</p> | |
| 56 | - </div> | |
| 57 | - <div class="icon"> | |
| 58 | - <i class="fas fa-store"></i> | |
| 59 | - </div> | |
| 60 | - <a href="#" class="small-box-footer" onclick="alert('OPCIÓN NO IMPLEMENTADA')">Más info <i class="fas fa-arrow-circle-right"></i></a> | |
| 61 | - </div> | |
| 62 | - </div> | |
| 63 | - <!-- Tarjeta 4 --> | |
| 64 | - <div class="col-lg-3 col-6"> | |
| 65 | - <div class="small-box bg-danger shadow-sm"> | |
| 66 | - <div class="inner"> | |
| 67 | - <h3>45%</h3> | |
| 68 | - <p>Índice General de Morosidad</p> | |
| 69 | - </div> | |
| 70 | - <div class="icon"> | |
| 71 | - <i class="fas fa-chart-pie"></i> | |
| 72 | - </div> | |
| 73 | - <a href="#" class="small-box-footer" onclick="alert('OPCIÓN NO IMPLEMENTADA')">Más info <i class="fas fa-arrow-circle-right"></i></a> | |
| 74 | - </div> | |
| 75 | - </div> | |
| 76 | - </div> | |
| 77 | - | |
| 78 | - <div class="row mt-4"> | |
| 79 | - <div class="col-12"> | |
| 80 | - <div class="card card-outline card-primary shadow-sm" style="border-top: 3px solid #0056b3;"> | |
| 81 | - <div class="card-header"> | |
| 82 | - <h3 class="card-title text-muted"><i class="fas fa-info-circle mr-1"></i> Estado del Sistema</h3> | |
| 83 | - </div> | |
| 84 | - <div class="card-body"> | |
| 85 | - <p class="text-secondary text-sm">Use el menú lateral para navegar por los distintos módulos administrativos. La funcionalidad de Mapas Tributarios se encuentra activa bajo "Control de Gestión -> Mapas". Otras opciones en despliegue.</p> | |
| 86 | - </div> | |
| 87 | - </div> | |
| 88 | - </div> | |
| 89 | - </div> | |
| 90 | - | |
| 91 | -<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> | |
| 92 | -<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script> | |
| 93 | -</body> | |
| 94 | -</html> |
GIS-GEOSERVER/target/gis-geoserver-0.0.1-SNAPSHOT.jar deleted
No preview for this file type
GIS-GEOSERVER/target/gis-geoserver-0.0.1-SNAPSHOT.jar.original deleted
No preview for this file type
GIS-GEOSERVER/target/maven-archiver/pom.properties deleted
GIS-GEOSERVER/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted
| 1 | -com\sigem\gis\WebConfig.class | |
| 2 | -com\sigem\gis\security\JwtUtil.class | |
| 3 | -com\sigem\gis\service\FdwService.class | |
| 4 | -com\sigem\gis\service\GeoServerService.class | |
| 5 | -com\sigem\gis\security\AuthResponse.class | |
| 6 | -com\sigem\gis\security\AuthRequest.class | |
| 7 | -com\sigem\gis\controller\WebViewController.class | |
| 8 | -com\sigem\gis\security\JwtAuthenticationFilter.class | |
| 9 | -com\sigem\gis\config\DataSourceConfig.class | |
| 10 | -com\sigem\gis\controller\GisController.class | |
| 11 | -com\sigem\gis\security\SecurityConfig.class | |
| 12 | -com\sigem\gis\controller\AdminController.class | |
| 13 | -com\sigem\gis\controller\ProxyController.class | |
| 14 | -com\sigem\gis\GisApplication.class | |
| 15 | -com\sigem\gis\security\AuthController.class |
GIS-GEOSERVER/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted
| 1 | -C:\desarrollo\Antigravity\GIS-GEOSERVER\src\main\java\com\sigem\gis\security\AuthController.java | |
| 2 | -C:\desarrollo\Antigravity\GIS-GEOSERVER\src\main\java\com\sigem\gis\GisApplication.java | |
| 3 | -C:\desarrollo\Antigravity\GIS-GEOSERVER\src\main\java\com\sigem\gis\security\SecurityConfig.java | |
| 4 | -C:\desarrollo\Antigravity\GIS-GEOSERVER\src\main\java\com\sigem\gis\config\DataSourceConfig.java | |
| 5 | -C:\desarrollo\Antigravity\GIS-GEOSERVER\src\main\java\com\sigem\gis\controller\WebViewController.java | |
| 6 | -C:\desarrollo\Antigravity\GIS-GEOSERVER\src\main\java\com\sigem\gis\controller\AdminController.java | |
| 7 | -C:\desarrollo\Antigravity\GIS-GEOSERVER\src\main\java\com\sigem\gis\security\JwtAuthenticationFilter.java | |
| 8 | -C:\desarrollo\Antigravity\GIS-GEOSERVER\src\main\java\com\sigem\gis\controller\GisController.java | |
| 9 | -C:\desarrollo\Antigravity\GIS-GEOSERVER\src\main\java\com\sigem\gis\service\GeoServerService.java | |
| 10 | -C:\desarrollo\Antigravity\GIS-GEOSERVER\src\main\java\com\sigem\gis\service\FdwService.java | |
| 11 | -C:\desarrollo\Antigravity\GIS-GEOSERVER\src\main\java\com\sigem\gis\security\AuthRequest.java | |
| 12 | -C:\desarrollo\Antigravity\GIS-GEOSERVER\src\main\java\com\sigem\gis\WebConfig.java | |
| 13 | -C:\desarrollo\Antigravity\GIS-GEOSERVER\src\main\java\com\sigem\gis\controller\ProxyController.java | |
| 14 | -C:\desarrollo\Antigravity\GIS-GEOSERVER\src\main\java\com\sigem\gis\security\AuthResponse.java | |
| 15 | -C:\desarrollo\Antigravity\GIS-GEOSERVER\src\main\java\com\sigem\gis\security\JwtUtil.java |
GIS-GEOSERVER/GeoServerService.java renamed to GeoServerService.java
GIS-GEOSERVER/Jenkinsfile renamed to Jenkinsfile
GIS-GEOSERVER/ProxyController.java renamed to ProxyController.java
GIS-GEOSERVER/RestTemplateConfig.java renamed to RestTemplateConfig.java
GIS-GEOSERVER/SecurityConfig.java renamed to SecurityConfig.java
GIS-GEOSERVER/SecurityConfig_master.java renamed to SecurityConfig_master.java
GIS-GEOSERVER/VERSION.txt renamed to VERSION.txt
GIS-GEOSERVER/apache_ssl_update.conf renamed to apache_ssl_update.conf
GIS-GEOSERVER/application_master.properties renamed to application_master.properties
GIS-GEOSERVER/check_geom.sql renamed to check_geom.sql
GIS-GEOSERVER/check_rule5.sql renamed to check_rule5.sql
GIS-GEOSERVER/control_gestion.php renamed to control_gestion.php
GIS-GEOSERVER/dbconf.php renamed to dbconf.php
GIS-GEOSERVER/debug_db.sh renamed to debug_db.sh
GIS-GEOSERVER/detect_locks.sql renamed to detect_locks.sql
GIS-GEOSERVER/diag_db.sh renamed to diag_db.sh
GIS-GEOSERVER/diag_db_docker.sh renamed to diag_db_docker.sh
GIS-GEOSERVER/diag_fdw.sql renamed to diag_fdw.sql
GIS-GEOSERVER/diag_schema_505.sql renamed to diag_schema_505.sql
GIS-GEOSERVER/diag_v28.sh renamed to diag_v28.sh
No preview for this file type
GIS-GEOSERVER/docker-compose-v33.yml renamed to docker-compose-v33.yml
GIS-GEOSERVER/docker-compose.integrated.yml renamed to docker-compose.integrated.yml
GIS-GEOSERVER/docker-compose.v18.yml renamed to docker-compose.v18.yml
GIS-GEOSERVER/docker-compose.yml renamed to docker-compose.yml
GIS-GEOSERVER/docker-compose_v20.yml renamed to docker-compose_v20.yml
GIS-GEOSERVER/docker-compose_v22.yml renamed to docker-compose_v22.yml
GIS-GEOSERVER/docker-compose_v24.yml renamed to docker-compose_v24.yml
GIS-GEOSERVER/docker-compose_v25.yml renamed to docker-compose_v25.yml
GIS-GEOSERVER/docker-compose_v26.yml renamed to docker-compose_v26.yml
GIS-GEOSERVER/extensions.sql renamed to extensions.sql
GIS-GEOSERVER/extract_carto.sh renamed to extract_carto.sh
GIS-GEOSERVER/fix_fdw_direct.sql renamed to fix_fdw_direct.sql
GIS-GEOSERVER/gwc_lotes.xml renamed to gwc_lotes.xml
GIS-GEOSERVER/gwc_mejoras.xml renamed to gwc_mejoras.xml
GIS-GEOSERVER/inject_gis.sh renamed to inject_gis.sh
GIS-GEOSERVER/liq_por_tipo.php renamed to liq_por_tipo.php
GIS-GEOSERVER/login.html renamed to login.html
GIS-GEOSERVER/login_institucional_bksp.html renamed to login_institucional_bksp.html
GIS-GEOSERVER/loginform.php renamed to loginform.php
GIS-GEOSERVER/main_login.php renamed to main_login.php
GIS-GEOSERVER/mapa_main.js renamed to mapa_main.js
GIS-GEOSERVER/mapa_mapStyles.js renamed to mapa_mapStyles.js
GIS-GEOSERVER/mapa_parametros.js renamed to mapa_parametros.js
GIS-GEOSERVER/mapas.html renamed to mapas.html
GIS-GEOSERVER/mapas_legacy.html renamed to mapas_legacy.html
GIS-GEOSERVER/mapas_repatriado.html renamed to mapas_repatriado.html
GIS-GEOSERVER/mapas_restoration.html renamed to mapas_restoration.html
GIS-GEOSERVER/morosidad_style_wms.sld renamed to morosidad_style_wms.sld
GIS-GEOSERVER/mvnw renamed to mvnw
GIS-GEOSERVER/mvnw.cmd renamed to mvnw.cmd
GIS-GEOSERVER/pom.xml renamed to pom.xml
GIS-GEOSERVER/restore_db_v18.sh renamed to restore_db_v18.sh
GIS-GEOSERVER/run_backup.sh renamed to run_backup.sh
GIS-GEOSERVER/run_v18_upgrade.sh renamed to run_v18_upgrade.sh
GIS-GEOSERVER/search_menu.sh renamed to search_menu.sh
GIS-GEOSERVER/show_fdw.sql renamed to show_fdw.sql
sigem_kafka deleted
| 1 | -Subproject commit e9ad97dbf12357d36f10d254ae420fa4fcf05b98 |
GIS-GEOSERVER/sigemtest.yvaga.com.py-le-ssl.conf renamed to sigemtest.yvaga.com.py-le-ssl.conf
GIS-GEOSERVER/sigemtest_original.vhost renamed to sigemtest_original.vhost
GIS-GEOSERVER/sigemtest_restored.vhost renamed to sigemtest_restored.vhost
GIS-GEOSERVER/sigemtest_v20_isolated.vhost renamed to sigemtest_v20_isolated.vhost
GIS-GEOSERVER/src/main/java/com/sigem/gis/GisApplication.java renamed to src/main/java/com/sigem/gis/GisApplication.java
GIS-GEOSERVER/src/main/java/com/sigem/gis/WebConfig.java renamed to src/main/java/com/sigem/gis/WebConfig.java
GIS-GEOSERVER/src/main/java/com/sigem/gis/config/DataSourceConfig.java renamed to src/main/java/com/sigem/gis/config/DataSourceConfig.java
GIS-GEOSERVER/src/main/java/com/sigem/gis/controller/AdminController.java renamed to src/main/java/com/sigem/gis/controller/AdminController.java
GIS-GEOSERVER/src/main/java/com/sigem/gis/controller/GisController.java renamed to src/main/java/com/sigem/gis/controller/GisController.java
GIS-GEOSERVER/src/main/java/com/sigem/gis/controller/ProxyController.java renamed to src/main/java/com/sigem/gis/controller/ProxyController.java
GIS-GEOSERVER/src/main/java/com/sigem/gis/controller/WebViewController.java renamed to src/main/java/com/sigem/gis/controller/WebViewController.java
GIS-GEOSERVER/src/main/java/com/sigem/gis/security/AuthController.java renamed to src/main/java/com/sigem/gis/security/AuthController.java
GIS-GEOSERVER/src/main/java/com/sigem/gis/security/AuthRequest.java renamed to src/main/java/com/sigem/gis/security/AuthRequest.java
GIS-GEOSERVER/src/main/java/com/sigem/gis/security/AuthResponse.java renamed to src/main/java/com/sigem/gis/security/AuthResponse.java
GIS-GEOSERVER/src/main/java/com/sigem/gis/security/JwtAuthenticationFilter.java renamed to src/main/java/com/sigem/gis/security/JwtAuthenticationFilter.java
GIS-GEOSERVER/src/main/java/com/sigem/gis/security/JwtUtil.java renamed to src/main/java/com/sigem/gis/security/JwtUtil.java
GIS-GEOSERVER/src/main/java/com/sigem/gis/security/SecurityConfig.java renamed to src/main/java/com/sigem/gis/security/SecurityConfig.java
GIS-GEOSERVER/src/main/java/com/sigem/gis/service/FdwService.java renamed to src/main/java/com/sigem/gis/service/FdwService.java
GIS-GEOSERVER/src/main/java/com/sigem/gis/service/GeoServerService.java renamed to src/main/java/com/sigem/gis/service/GeoServerService.java
GIS-GEOSERVER/src/main/resources/application.properties renamed to src/main/resources/application.properties
GIS-GEOSERVER/src/main/resources/static/landing.html renamed to src/main/resources/static/landing.html
GIS-GEOSERVER/src/main/resources/static/login.html renamed to src/main/resources/static/login.html
GIS-GEOSERVER/src/main/resources/static/mapas.html renamed to src/main/resources/static/mapas.html
GIS-GEOSERVER/src/main/resources/static/widgets.html renamed to src/main/resources/static/widgets.html
GIS-GEOSERVER/tomcat-users.xml renamed to tomcat-users.xml
GIS-GEOSERVER/upgrade_to_v18.sh renamed to upgrade_to_v18.sh
GIS-GEOSERVER/upload_geojson.sh renamed to upload_geojson.sh
GIS-GEOSERVER/verify_db.sh renamed to verify_db.sh
GIS-GEOSERVER/yvyape_vhost.txt renamed to yvyape_vhost.txt