Catastro Digital Pailón

SGC-MV AUTÓNOMO: «CatastroSimple.bo»

Plataforma Web Independiente para Catastro Municipal

CONCEPTO RECTOR

Un sistema web autónomo, alojado en un servidor contratado directamente por el municipio (Hostinger, Neolo, cPanel compartido, o VPS básico), sin dependencia de APIs externas, sin interoperabilidad obligatoria. Una isla tecnológica funcional.

Principio: Un municipio con este sistema puede registrar predios, emitir certificados y ver su padrón sin consultar jamás a otra entidad.

ARQUITECTURA SIMPLIFICADA

Plain text

┌────────────────────────────────────────────┐

│ SERVIDOR CONTRATADO │

│ (cPanel / VPS con LAMP o LEMP Stack) │

├────────────────────────────────────────────┤

│ │

│ Frontend (HTML + CSS + JS vanilla) │

│ Sin frameworks pesados. Bootstrap 5 │

│ │

│ Backend (PHP 8+ sin Laravel) │

│ Funciones puras, rutas simples │

│ │

│ Base de datos (MySQL/MariaDB) │

│ Tablas planas, sin extensiones GIS │

│ │

│ Almacenamiento de archivos (carpetas) │

│ PDFs, fotos, documentos adjuntos │

│ │

└────────────────────────────────────────────┘

Tecnologías concretas:

Frontend: HTML5, CSS3, Bootstrap 5, JavaScript vanilla, Leaflet.js (carga desde CDN, solo para el mapa).

Backend: PHP 8.2 puro, sin framework. MVC simple a mano.

Base de datos: MySQL 8 o MariaDB 10.6.

Mapa base: OpenStreetMap (gratuito, sin API key).

Generación PDF: TCPDF o DomPDF (librería PHP autocontenida).

QR: phpqrcode (librería PHP, genera PNG).

Hosting típico: cPanel con PHPMyAdmin. No requiere Node.js ni Docker.

ESTRUCTURA DE ARCHIVOS (Físico en el servidor)

Plain text

/public_html/

├── index.php # Login público

├── .htaccess # Redirecciones y seguridad básica

├── config.php # Credenciales BD y constantes

├── assets/ # Archivos estáticos

│ ├── css/

│ │ └── estilo.css

│ ├── js/

│ │ ├── mapa.js # Leaflet para registro de predio

│ │ └── funciones.js # Validaciones, peticiones AJAX

│ ├── img/

│ │ ├── logo.png

│ │ └── escudo.png

│ └── librerias/

│ ├── tcpdf/ # Generación de PDFs

│ └── phpqrcode/ # Generación de QR

├── modulos/ # Archivos PHP de funcionalidad

│ ├── auth/

│ │ ├── login.php # Procesa login

│ │ └── logout.php

│ ├── predio/

│ │ ├── listar.php # Tabla con todos los predios

│ │ ├── crear.php # Formulario de registro

│ │ ├── guardar.php # Procesa y guarda en BD

│ │ ├── ver.php # Ficha individual con mapa

│ │ ├── editar.php # Edición de datos alfanuméricos

│ │ ├── actualizar.php # Procesa edición

│ │ └── validar.php # Cambia estado PENDIENTE→VALIDADO

│ ├── certificado/

│ │ ├── listar.php # Historial de certificados emitidos

│ │ ├── emitir.php # Pantalla de emisión

│ │ ├── generar_pdf.php # Crea el PDF firmado

│ │ └── verificar.php # Página pública de verificación QR

│ ├── reporte/

│ │ ├── panel.php # Dashboard con conteos

│ │ └── exportar.php # CSV para Excel

│ └── admin/

│ ├── usuarios.php # CRUD de usuarios del sistema

│ └── configuracion.php # Datos del municipio, logo, escudo

├── uploads/ # Archivos subidos (fotos, documentos)

│ ├── predios/

│ └── certificados/

└── backup/ # Script de backup manual (opcional)

└── backup_db.php

BASE DE DATOS (Esquema MySQL)

4.1 Tabla: usuarios

SQL

CREATE TABLE usuarios (

id INT AUTO_INCREMENT PRIMARY KEY,

nombre VARCHAR(100) NOT NULL,

usuario VARCHAR(50) UNIQUE NOT NULL,

clave_hash VARCHAR(255) NOT NULL,

rol ENUM(‘admin’,’operador’,’consulta’) DEFAULT ‘operador’,

activo TINYINT(1) DEFAULT 1,

creado DATETIME DEFAULT CURRENT_TIMESTAMP

);

4.2 Tabla: predios

SQL

CREATE TABLE predios (

id INT AUTO_INCREMENT PRIMARY KEY,

codigo VARCHAR(20) UNIQUE NOT NULL, — Autogenerado: PRED-0001

titular_nombre VARCHAR(150) NOT NULL,

titular_ci VARCHAR(20) NOT NULL,

titular_telefono VARCHAR(20),

direccion_catastral VARCHAR(200),

zona VARCHAR(100),

superficie DECIMAL(10,2),

uso ENUM(‘vivienda’,’comercial’,’industrial’,’agricola’,’baldio’,’equipamiento’) NOT NULL,

coordenadas TEXT, — JSON o WKT simple: «[[-16.5,-68.1],[-16.5,-68.0],…]»

estado ENUM(‘pendiente’,’validado’,’conflicto’) DEFAULT ‘pendiente’,

observaciones TEXT,

creado_por INT,

creado DATETIME DEFAULT CURRENT_TIMESTAMP,

actualizado DATETIME ON UPDATE CURRENT_TIMESTAMP,

FOREIGN KEY (creado_por) REFERENCES usuarios(id)

);

4.3 Tabla: predio_adjuntos

SQL

CREATE TABLE predio_adjuntos (

id INT AUTO_INCREMENT PRIMARY KEY,

predio_id INT NOT NULL,

tipo ENUM(‘foto_terreno’,’ci_anverso’,’ci_reverso’,’documento’,’otro’),

ruta VARCHAR(300) NOT NULL,

FOREIGN KEY (predio_id) REFERENCES predios(id) ON DELETE CASCADE

);

4.4 Tabla: certificados

SQL

CREATE TABLE certificados (

id INT AUTO_INCREMENT PRIMARY KEY,

codigo VARCHAR(30) UNIQUE NOT NULL, — CCD-2026-0001

predio_id INT NOT NULL,

emitido_por INT,

fecha_emision DATETIME DEFAULT CURRENT_TIMESTAMP,

fecha_vencimiento DATE,

estado ENUM(‘vigente’,’revocado’,’vencido’) DEFAULT ‘vigente’,

pdf_ruta VARCHAR(300),

qr_ruta VARCHAR(300),

FOREIGN KEY (predio_id) REFERENCES predios(id),

FOREIGN KEY (emitido_por) REFERENCES usuarios(id)

);

4.5 Tabla: configuracion

SQL

CREATE TABLE configuracion (

id INT PRIMARY KEY DEFAULT 1,

municipio_nombre VARCHAR(100),

municipio_departamento VARCHAR(50),

municipio_provincia VARCHAR(50),

alcalde_nombre VARCHAR(100),

responsable_catastro VARCHAR(100),

logo_ruta VARCHAR(300), — Subido desde admin/configuracion.php

escudo_ruta VARCHAR(300),

telefono_contacto VARCHAR(20),

direccion_oficina VARCHAR(200),

certificado_validez_meses INT DEFAULT 12,

ultima_actualizacion DATETIME

);

MAPEO DE PÁGINAS (URLs Públicas y Privadas)

URL

Acceso

Descripción

/

Público

Pantalla de login

/modulos/auth/login.php

POST

Autentica y crea sesión

/modulos/predio/listar.php

Privado

Tabla principal del catastro

/modulos/predio/crear.php

Privado

Formulario de registro nuevo (con mapa)

/modulos/predio/guardar.php

POST

Guarda nuevo predio en BD

/modulos/predio/ver.php?id=X

Privado

Ficha completa del predio

/modulos/predio/validar.php?id=X

Privado (admin)

Cambia estado a Validado

/modulos/certificado/listar.php

Privado

Historial de certificados emitidos

/modulos/certificado/emitir.php?predio=X

Privado

Pantalla de emisión

/modulos/certificado/generar_pdf.php?id=X

POST

Genera PDF y guarda en servidor

/verificar.php?codigo=CCD-2026-0001

Público

Validación ciudadana vía QR

/modulos/reporte/panel.php

Privado

Dashboard con conteos

/modulos/admin/usuarios.php

Privado (admin)

Gestión de operadores

/modulos/admin/configuracion.php

Privado (admin)

Datos institucionales

SEGURIDAD BÁSICA AUTOCONTENIDA

Sin depender de AGETIC, ni OAuth, ni Azure AD, la seguridad es simple pero suficiente:

HTTPS: Certificado SSL Let’s Encrypt gratuito desde cPanel.

Contraseñas: password_hash() con bcrypt. Nunca texto plano.

Sesiones: PHP session_start() con HttpOnly y Secure en cookies.

SQL Injection: PDO con prepared statements.

XSS: htmlspecialchars() en todas las salidas de datos de usuario.

CSRF: Token único por formulario generado con bin2hex(random_bytes(32)).

Rate limit: Contador simple de intentos de login en tabla login_attempts.

Acceso a archivos: .htaccess con Deny from all en carpetas sensibles.

FLUJOS DE USUARIO PRINCIPALES

7.1 Registro de Predio (Operador)

Inicia sesión → Pantalla listar.php.

Clic en «Nuevo Predio» → crear.php.

Llena formulario: Datos del titular, dirección, uso y dibuja polígono en mapa Leaflet.

Sube fotos (terreno + CI).

Clic en «Guardar» → guardar.php procesa y guarda.

Redirige a ver.php?id=nuevo mostrando ficha.

7.2 Emisión de Certificado (Operador o Admin)

Busca predio en listar.php (filtro por nombre o CI).

Verifica que estado sea «Validado».

Clic en «Emitir Certificado» → emitir.php?predio=X.

Confirma datos pre-llenados.

Clic en «Generar Certificado» → generar_pdf.php.

PDF guardado en /uploads/certificados/. Pantalla muestra enlace de descarga.

7.3 Verificación Ciudadana (Público)

Ciudadano escanea QR con su celular.

Navegador abre verificar.php?codigo=CCD-2026-0001.

Muestra datos del certificado: Código, Titular, Superficie, Uso y Estado (VIGENTE / REVOCADO).

DESPLIEGUE EN 10 PASOS (Para un técnico básico)

Hosting: Contratar cPanel compartido con PHP 8+, MySQL (Bs 300-600/año).

Dominio: Adquirir .gob.bo o similar (Bs 150/año).

Subir archivos: Vía FTP (FileZilla) a /public_html/.

Base de Datos: Desde PHPMyAdmin, ejecutar el script SQL completo.

config.php: Editar credenciales de BD y nombre del municipio.

SSL: Activar Let’s Encrypt desde cPanel (1 clic).

Admin: Correr script instalar.php una vez para crear usuario admin inicial.

Configuración: Entrar a /admin/configuracion.php y llenar datos institucionales.

Logos: Subir logo y escudo desde la pantalla de configuración.

Listo: El sistema está operativo para registrar el primer predio.

COSTO TOTAL DE PROPIEDAD (Anual aproximado)

Concepto

Costo en Bs

Hosting cPanel (Hostinger/Neolo)

400

Dominio .gob.bo (Nic.bo)

150

Desarrollo único del sistema

25.000 (pago único)

Mantenimiento y soporte (opcional)

3.000

Capacitación (2 días presencial)

1.500

TOTAL PRIMER AÑO

30.050

AÑOS SIGUIENTES

3.550

ADMINISTRACIÓN AUTÓNOMA (Sin soporte eterno)

Backup automático: Script PHP simple que se ejecuta por cron y envía un .sql al correo del responsable cada semana.

Actualizaciones: El municipio es dueño del código. No depende de contratos estatales.

Migración futura: Datos en MySQL estándar. Cualquier técnico puede exportar a otros sistemas si el municipio crece.

RESUMEN GRÁFICO DEL SISTEMA

Plain text

┌─────────────────────────────────┐

│ CatastroSimple.bo │

│ (dominio propio del municipio) │

└─────────────────────────────────┘

┌──────────────┼──────────────┐

▼ ▼ ▼

┌─────────┐ ┌─────────┐ ┌─────────┐

│REGISTRAR│ │ EMITIR │ │ VER │

│ PREDIO │ │CERTIF. │ │ PADRÓN │

└─────────┘ └─────────┘ └─────────┘

│ │ │

└──────────────┼──────────────┘

┌──────────────────┐

│ MySQL │

│ 4 tablas │

│ + fotos en HD │

└──────────────────┘

┌──────────────┴──────────────┐

│ │

┌─────────┐ ┌──────────┐

│ BACKUP │ │ CIUDADANO│

│ SEMANAL │ │ Verifica │

│ al correo│ │ con QR │

└─────────┘ └──────────┘

Este sistema es realista, instalable en una tarde, operable con una laptop de 10 años, sin dependencias externas ni pagos recurrentes a terceros. El municipio es dueño absoluto de sus datos y su código.


Análisis del Proyecto «CatastroSimple.bo»

El documento describe una propuesta de software denominada «CatastroSimple.bo», diseñada específicamente para la gestión catastral en municipios que buscan soberanía tecnológica y simplicidad operativa. A continuación, presento un análisis de los puntos clave:

1. Filosofía de Independencia (Soberanía de Datos)

El concepto rector rompe con la tendencia actual de «SaaS» (Software as a Service) o sistemas centralizados estatales. Al proponer una «isla tecnológica», el municipio evita la burocracia de integraciones técnicas complejas (APIs) y los riesgos de caídas de servicios externos. La propiedad del código y la base de datos reside 100% en el servidor local o contratado por la alcaldía.

2. Viabilidad Técnica y Sostenibilidad

La elección del stack LAMP (Linux, Apache, MySQL, PHP) es sumamente acertada para el contexto propuesto:

  • Bajos Requisitos: Puede correr en prácticamente cualquier servidor económico (incluso un cPanel de $50 USD al año).

  • Facilidad de Mantenimiento: PHP «vanilla» (puro) asegura que cualquier programador con conocimientos básicos pueda realizar ajustes, sin necesidad de aprender frameworks complejos como Laravel o React que evolucionan (y quedan obsoletos) rápidamente.

  • Manejo Geográfico Simplificado: Al usar Leaflet.js y almacenar coordenadas en formato JSON/Texto, se evita la complejidad de extensiones como PostGIS, facilitando las copias de seguridad y la portabilidad de los datos.

3. Seguridad y Transparencia

A pesar de su sencillez, el sistema incorpora pilares de seguridad modernos:

  • Validación Ciudadana: La inclusión de códigos QR para la verificación pública de certificados es una medida excelente contra la falsificación de documentos físicos.

  • Prácticas Estándar: El uso de password_hash() y sentencias preparadas (PDO) mitiga los ataques más comunes en la web (Inyección SQL).

4. Análisis de Costos

El presupuesto planteado es altamente competitivo. En el mercado de software gubernamental, los sistemas de catastro suelen costar cientos de miles de bolivianos y conllevan costos de mantenimiento prohibitivos. Un costo operativo anual de 3.550 Bs es perfectamente asumible incluso para el municipio más pequeño de Bolivia.

5. Puntos de Atención (Riesgos)

  • Falta de Interoperabilidad: Aunque es una ventaja para la autonomía, a largo plazo podría ser un reto si el gobierno central exige reportes en formatos específicos. Sin embargo, la estructura de base de datos «plana» facilita la exportación de archivos CSV o Excel.

  • Responsabilidad del Backup: Al ser un sistema autónomo, el municipio es el único responsable de sus respaldos. El script de backup al correo es una solución ingeniosa, pero requiere supervisión humana constante para asegurar que el espacio de correo no se llene.

Conclusión

CatastroSimple.bo es una solución pragmática y realista. No intenta «reinventar la rueda», sino proporcionar una herramienta funcional que digitaliza procesos manuales sin añadir una carga técnica o financiera insostenible. Es ideal para municipios rurales o medianos que necesitan orden administrativo inmediato.


Entendido. Aquí tienes el texto completo del documento solicitado, consolidado y sin modificaciones, manteniendo la estructura de sistema autónomo para un municipio en Bolivia:

SGC-MV AUTÓNOMO: «CatastroSimple.bo»
Plataforma Web Independiente para Catastro Municipal

1. CONCEPTO RECTOR
Un sistema web autónomo, alojado en un servidor contratado directamente por el municipio (Hostinger, Neolo, cPanel compartido, o VPS básico), sin dependencia de APIs externas, sin interoperabilidad obligatoria. Una isla tecnológica funcional.

**Principio:** Un municipio con este sistema puede registrar predios, emitir certificados y ver su padrón sin consultar jamás a otra entidad.

2. ARQUITECTURA SIMPLIFICADA

«`
┌────────────────────────────────────────────┐
│ SERVIDOR CONTRATADO │
│ (cPanel / VPS con LAMP o LEMP Stack) │
├────────────────────────────────────────────┤
│ │
│ Frontend (HTML + CSS + JS vanilla) │
│ Sin frameworks pesados. Bootstrap 5 │
│ │
│ Backend (PHP 8+ sin Laravel) │
│ Funciones puras, rutas simples │
│ │
│ Base de datos (MySQL/MariaDB) │
│ Tablas planas, sin extensiones GIS │
│ │
│ Almacenamiento de archivos (carpetas) │
│ PDFs, fotos, documentos adjuntos │
│ │
└────────────────────────────────────────────┘
«`

**Tecnologías concretas:**
* **Frontend:** HTML5, CSS3, Bootstrap 5, JavaScript vanilla, Leaflet.js (carga desde CDN, solo para el mapa).
* **Backend:** PHP 8.2 puro, sin framework. MVC simple a mano.
* **Base de datos:** MySQL 8 o MariaDB 10.6.
* **Mapa base:** OpenStreetMap (gratuito, sin API key).
* **Generación PDF:** TCPDF o DomPDF (librería PHP autocontenida).
* **QR:** phpqrcode (librería PHP, genera PNG).
* **Hosting típico:** cPanel con PHPMyAdmin. No requiere Node.js ni Docker.

3. ESTRUCTURA DE ARCHIVOS (Físico en el servidor)

«`
/public_html/

├── index.php # Login público
├── .htaccess # Redirecciones y seguridad básica
├── config.php # Credenciales BD y constantes

├── assets/ # Archivos estáticos
│ ├── css/
│ │ └── estilo.css
│ ├── js/
│ │ ├── mapa.js # Leaflet para registro de predio
│ │ └── funciones.js # Validaciones, peticiones AJAX
│ ├── img/
│ │ ├── logo.png
│ │ └── escudo.png
│ └── librerias/
│ ├── tcpdf/ # Generación de PDFs
│ └── phpqrcode/ # Generación de QR

├── modulos/ # Archivos PHP de funcionalidad
│ ├── auth/
│ │ ├── login.php # Procesa login
│ │ └── logout.php
│ ├── predio/
│ │ ├── listar.php # Tabla con todos los predios
│ │ ├── crear.php # Formulario de registro
│ │ ├── guardar.php # Procesa y guarda en BD
│ │ ├── ver.php # Ficha individual con mapa
│ │ ├── editar.php # Edición de datos alfanuméricos
│ │ ├── actualizar.php # Procesa edición
│ │ └── validar.php # Cambia estado PENDIENTE→VALIDADO
│ ├── certificado/
│ │ ├── listar.php # Historial de certificados emitidos
│ │ ├── emitir.php # Pantalla de emisión
│ │ ├── generar_pdf.php # Crea el PDF firmado
│ │ └── verificar.php # Página pública de verificación QR
│ ├── reporte/
│ │ ├── panel.php # Dashboard con conteos
│ │ └── exportar.php # CSV para Excel
│ └── admin/
│ ├── usuarios.php # CRUD de usuarios del sistema
│ └── configuracion.php # Datos del municipio, logo, escudo

├── uploads/ # Archivos subidos (fotos, documentos)
│ ├── predios/
│ └── certificados/

└── backup/ # Script de backup manual (opcional)
└── backup_db.php
«`

4. BASE DE DATOS (Esquema MySQL)

**4.1 Tabla: usuarios**
«`sql
CREATE TABLE usuarios (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
usuario VARCHAR(50) UNIQUE NOT NULL,
clave_hash VARCHAR(255) NOT NULL,
rol ENUM(‘admin’,’operador’,’consulta’) DEFAULT ‘operador’,
activo TINYINT(1) DEFAULT 1,
creado DATETIME DEFAULT CURRENT_TIMESTAMP
);
«`

**4.2 Tabla: predios**
«`sql
CREATE TABLE predios (
id INT AUTO_INCREMENT PRIMARY KEY,
codigo VARCHAR(20) UNIQUE NOT NULL, — Autogenerado: PRED-0001
titular_nombre VARCHAR(150) NOT NULL,
titular_ci VARCHAR(20) NOT NULL,
titular_telefono VARCHAR(20),
direccion_catastral VARCHAR(200),
zona VARCHAR(100),
superficie DECIMAL(10,2),
uso ENUM(‘vivienda’,’comercial’,’industrial’,’agricola’,’baldio’,’equipamiento’) NOT NULL,
coordenadas TEXT, — JSON o WKT simple: «[[-16.5,-68.1],[-16.5,-68.0],…]»
estado ENUM(‘pendiente’,’validado’,’conflicto’) DEFAULT ‘pendiente’,
observaciones TEXT,
creado_por INT,
creado DATETIME DEFAULT CURRENT_TIMESTAMP,
actualizado DATETIME ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (creado_por) REFERENCES usuarios(id)
);
«`

**4.3 Tabla: predio_adjuntos**
«`sql
CREATE TABLE predio_adjuntos (
id INT AUTO_INCREMENT PRIMARY KEY,
predio_id INT NOT NULL,
tipo ENUM(‘foto_terreno’,’ci_anverso’,’ci_reverso’,’documento’,’otro’),
ruta VARCHAR(300) NOT NULL,
FOREIGN KEY (predio_id) REFERENCES predios(id) ON DELETE CASCADE
);
«`

**4.4 Tabla: certificados**
«`sql
CREATE TABLE certificados (
id INT AUTO_INCREMENT PRIMARY KEY,
codigo VARCHAR(30) UNIQUE NOT NULL, — CCD-2026-0001
predio_id INT NOT NULL,
emitido_por INT,
fecha_emision DATETIME DEFAULT CURRENT_TIMESTAMP,
fecha_vencimiento DATE,
estado ENUM(‘vigente’,’revocado’,’vencido’) DEFAULT ‘vigente’,
pdf_ruta VARCHAR(300),
qr_ruta VARCHAR(300),
FOREIGN KEY (predio_id) REFERENCES predios(id),
FOREIGN KEY (emitido_por) REFERENCES usuarios(id)
);
«`

**4.5 Tabla: configuracion**
«`sql
CREATE TABLE configuracion (
id INT PRIMARY KEY DEFAULT 1,
municipio_nombre VARCHAR(100),
municipio_departamento VARCHAR(50),
municipio_provincia VARCHAR(50),
alcalde_nombre VARCHAR(100),
responsable_catastro VARCHAR(100),
logo_ruta VARCHAR(300), — Subido desde admin/configuracion.php
escudo_ruta VARCHAR(300),
telefono_contacto VARCHAR(20),
direccion_oficina VARCHAR(200),
certificado_validez_meses INT DEFAULT 12,
ultima_actualizacion DATETIME
);
«`

5. MAPEO DE PÁGINAS (URLs Públicas y Privadas)

| URL | Acceso | Descripción |
| :— | :— | :— |
| / | Público | Pantalla de login |
| /modulos/auth/login.php | POST | Autentica y crea sesión |
| /modulos/predio/listar.php | Privado | Tabla principal del catastro |
| /modulos/predio/crear.php | Privado | Formulario de registro nuevo (con mapa) |
| /modulos/predio/guardar.php | POST | Guarda nuevo predio en BD |
| /modulos/predio/ver.php?id=X | Privado | Ficha completa del predio |
| /modulos/predio/validar.php?id=X | Privado (admin) | Cambia estado a Validado |
| /modulos/certificado/listar.php | Privado | Historial de certificados emitidos |
| /modulos/certificado/emitir.php?predio=X | Privado | Pantalla de emisión |
| /modulos/certificado/generar_pdf.php?id=X | POST | Genera PDF y guarda en servidor |
| /verificar.php?codigo=CCD-2026-0001 | Público | Validación ciudadana vía QR |
| /modulos/reporte/panel.php | Privado | Dashboard con conteos |
| /modulos/admin/usuarios.php | Privado (admin) | Gestión de operadores |
| /modulos/admin/configuracion.php | Privado (admin) | Datos institucionales |

6. SEGURIDAD BÁSICA AUTOCONTENIDA

Sin depender de AGETIC, ni OAuth, ni Azure AD, la seguridad es simple pero suficiente:

* **HTTPS:** Certificado SSL Let’s Encrypt gratuito desde cPanel.
* **Contraseñas:** `password_hash()` con bcrypt. Nunca texto plano.
* **Sesiones:** PHP `session_start()` con HttpOnly y Secure en cookies.
* **SQL Injection:** PDO con prepared statements.
* **XSS:** `htmlspecialchars()` en todas las salidas de datos de usuario.
* **CSRF:** Token único por formulario generado con `bin2hex(random_bytes(32))`.
* **Rate limit:** Contador simple de intentos de login en tabla `login_attempts`.
* **Acceso a archivos:** `.htaccess` con `Deny from all` en carpetas sensibles.

7. FLUJOS DE USUARIO PRINCIPALES

**7.1 Registro de Predio (Operador)**
1. Inicia sesión → Pantalla `listar.php`.
2. Clic en «Nuevo Predio» → `crear.php`.
3. Llena formulario: Datos del titular, dirección, uso y dibuja polígono en mapa Leaflet.
4. Sube fotos (terreno + CI).
5. Clic en «Guardar» → `guardar.php` procesa y guarda.
6. Redirige a `ver.php?id=nuevo` mostrando ficha.

**7.2 Emisión de Certificado (Operador o Admin)**
1. Busca predio en `listar.php` (filtro por nombre o CI).
2. Verifica que estado sea «Validado».
3. Clic en «Emitir Certificado» → `emitir.php?predio=X`.
4. Confirma datos pre-llenados.
5. Clic en «Generar Certificado» → `generar_pdf.php`.
6. PDF guardado en `/uploads/certificados/`. Pantalla muestra enlace de descarga.

**7.3 Verificación Ciudadana (Público)**
1. Ciudadano escanea QR con su celular.
2. Navegador abre `verificar.php?codigo=CCD-2026-0001`.
3. Muestra datos del certificado: Código, Titular, Superficie, Uso y Estado (VIGENTE / REVOCADO).

8. DESPLIEGUE EN 10 PASOS (Para un técnico básico)

1. **Hosting:** Contratar cPanel compartido con PHP 8+, MySQL (Bs 300-600/año).
2. **Dominio:** Adquirir .gob.bo o similar (Bs 150/año).
3. **Subir archivos:** Vía FTP (FileZilla) a `/public_html/`.
4. **Base de Datos:** Desde PHPMyAdmin, ejecutar el script SQL completo.
5. **config.php:** Editar credenciales de BD y nombre del municipio.
6. **SSL:** Activar Let’s Encrypt desde cPanel (1 clic).
7. **Admin:** Correr script `instalar.php` una vez para crear usuario admin inicial.
8. **Configuración:** Entrar a `/admin/configuracion.php` y llenar datos institucionales.
9. **Logos:** Subir logo y escudo desde la pantalla de configuración.
10. **Listo:** El sistema está operativo para registrar el primer predio.

9. COSTO TOTAL DE PROPIEDAD (Anual aproximado)

| Concepto | Costo en Bs |
| :— | :— |
| Hosting cPanel (Hostinger/Neolo) | 400 |
| Dominio .gob.bo (Nic.bo) | 150 |
| Desarrollo único del sistema | 25.000 (pago único) |
| Mantenimiento y soporte (opcional) | 3.000 |
| Capacitación (2 días presencial) | 1.500 |
| **TOTAL PRIMER AÑO** | **30.050** |
| **AÑOS SIGUIENTES** | **3.550** |

10. ADMINISTRACIÓN AUTÓNOMA (Sin soporte eterno)

* **Backup automático:** Script PHP simple que se ejecuta por cron y envía un `.sql` al correo del responsable cada semana.
* **Actualizaciones:** El municipio es dueño del código. No depende de contratos estatales.
* **Migración futura:** Datos en MySQL estándar. Cualquier técnico puede exportar a otros sistemas si el municipio crece.

RESUMEN GRÁFICO DEL SISTEMA

«`
┌─────────────────────────────────┐
│ CatastroSimple.bo │
│ (dominio propio del municipio) │
└─────────────────────────────────┘

┌──────────────┼──────────────┐
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│REGISTRAR│ │ EMITIR │ │ VER │
│ PREDIO │ │CERTIF. │ │ PADRÓN │
└─────────┘ └─────────┘ └─────────┘
│ │ │
└──────────────┼──────────────┘

┌──────────────────┐
│ MySQL │
│ 4 tablas │
│ + fotos en HD │
└──────────────────┘

┌──────────────┴──────────────┐
│ │
┌─────────┐ ┌──────────┐
│ BACKUP │ │ CIUDADANO│
│ SEMANAL │ │ Verifica │
│ al correo│ │ con QR │
└─────────┘ └──────────┘
«`

Este sistema es realista, instalable en una tarde, operable con una laptop de 10 años, sin dependencias externas ni pagos recurrentes a terceros. El municipio es dueño absoluto de sus datos y su código.

Scroll al inicio