Showing
3 changed files
with
1 additions
and
674 deletions
BUSQUEDA.md
deleted
100644 → 0
| 1 | -# Lógica del Buscador | ||
| 2 | - | ||
| 3 | -## Resumen | ||
| 4 | -Buscador instantáneo con Fuse.js en cliente. Busca en clasificadores presupuestarios y navega a vistas de detalle. | ||
| 5 | - | ||
| 6 | -## Decisiones de Diseño | ||
| 7 | - | ||
| 8 | -### Motor de búsqueda | ||
| 9 | -- **Tecnología**: Fuse.js (cliente) | ||
| 10 | -- **Razón**: ~1,400 registros totales (~600 entidades + ~450 objetos + ~380 rubros), cabe en memoria, búsqueda instantánea sin latencia | ||
| 11 | - | ||
| 12 | -### Configuración Fuse.js | ||
| 13 | -```javascript | ||
| 14 | -const fuseOptions = { | ||
| 15 | - keys: [ | ||
| 16 | - { name: 'nombre_normalizado', weight: 0.6 }, | ||
| 17 | - { name: 'sigla_normalizada', weight: 0.2 }, | ||
| 18 | - { name: 'codigo_normalizado', weight: 0.2 } | ||
| 19 | - ], | ||
| 20 | - threshold: 0.4, | ||
| 21 | - distance: 100, | ||
| 22 | - includeScore: true, | ||
| 23 | - includeMatches: true, | ||
| 24 | - minMatchCharLength: 2, | ||
| 25 | - ignoreLocation: true | ||
| 26 | -}; | ||
| 27 | -``` | ||
| 28 | - | ||
| 29 | -### Tolerancia a errores | ||
| 30 | -- Normalización de acentos ("andres" → "andrés") | ||
| 31 | -- Case-insensitive ("UMSA" = "umsa") | ||
| 32 | -- Fuzzy matching ("univercidad" → "universidad") | ||
| 33 | - | ||
| 34 | -### Comportamiento | ||
| 35 | -| Parámetro | Valor | | ||
| 36 | -|-----------|-------| | ||
| 37 | -| Debounce | 250ms | | ||
| 38 | -| Mínimo caracteres | 2 | | ||
| 39 | -| Máximo resultados | 15 | | ||
| 40 | -| Navegación | Flechas ↑↓ + Enter + scroll de mouse | | ||
| 41 | - | ||
| 42 | -## Estructura del Índice | ||
| 43 | - | ||
| 44 | -### Índice unificado (implementado) | ||
| 45 | -Todos los clasificadores en un solo array con `tipo`: | ||
| 46 | - | ||
| 47 | -```javascript | ||
| 48 | -// src/lib/services/search.js | ||
| 49 | -const searchData = [ | ||
| 50 | - // Entidades | ||
| 51 | - { | ||
| 52 | - tipo: 'entidad', | ||
| 53 | - codigo: 139, | ||
| 54 | - nombre: 'Universidad Mayor De San Andrés', | ||
| 55 | - sigla: 'UMSA', | ||
| 56 | - contexto: 'Universidades Públicas', | ||
| 57 | - años: 20, | ||
| 58 | - nombre_normalizado: 'universidad mayor de san andres', | ||
| 59 | - sigla_normalizada: 'umsa', | ||
| 60 | - codigo_normalizado: '139' | ||
| 61 | - }, | ||
| 62 | - // Objetos de gasto | ||
| 63 | - { | ||
| 64 | - tipo: 'objeto_gasto', | ||
| 65 | - codigo: '25100', | ||
| 66 | - nombre: 'Pasajes', | ||
| 67 | - sigla: null, | ||
| 68 | - contexto: 'Objeto del Gasto · Partida', | ||
| 69 | - nivel: 'partida', | ||
| 70 | - nombre_normalizado: 'pasajes', | ||
| 71 | - sigla_normalizada: '', | ||
| 72 | - codigo_normalizado: '25100' | ||
| 73 | - }, | ||
| 74 | - // Rubros | ||
| 75 | - { | ||
| 76 | - tipo: 'rubro', | ||
| 77 | - codigo: 13000, | ||
| 78 | - nombre: 'INGRESOS POR IMPUESTOS', | ||
| 79 | - sigla: null, | ||
| 80 | - contexto: 'Rubro · Tipo', | ||
| 81 | - nivel: 'tipo', | ||
| 82 | - nombre_normalizado: 'ingresos por impuestos', | ||
| 83 | - sigla_normalizada: '', | ||
| 84 | - codigo_normalizado: '13000' | ||
| 85 | - } | ||
| 86 | -] | ||
| 87 | -``` | ||
| 88 | - | ||
| 89 | -### Fuentes de datos | ||
| 90 | -- **Entidades**: tabla `ppto.clas_institucional` | ||
| 91 | -- **Objetos de gasto**: tabla `ppto.clas_objetos` | ||
| 92 | -- **Rubros**: tabla `ppto.clas_rubros` | ||
| 93 | - | ||
| 94 | -## Columnas de Búsqueda | ||
| 95 | - | ||
| 96 | -### Entidades (clas_institucional) | ||
| 97 | -| Columna | Buscar | Mostrar | | ||
| 98 | -|---------|--------|---------| | ||
| 99 | -| `desc_entidad` | ✓ | ✓ nombre principal | | ||
| 100 | -| `sigla_entidad` | ✓ | ✓ entre paréntesis | | ||
| 101 | -| `desc_area` | ✗ | ✓ contexto | | ||
| 102 | -| `n_gestiones` | ✗ | ✓ "X años de datos" | | ||
| 103 | -| `entidad` | ✗ | para URL | | ||
| 104 | - | ||
| 105 | -### Objetos de gasto (clas_objetos) | ||
| 106 | -| Columna | Buscar | Mostrar | | ||
| 107 | -|---------|--------|---------| | ||
| 108 | -| `desc_objeto` | ✓ | ✓ nombre principal | | ||
| 109 | -| `objeto` | ✓ | ✓ código (monospace) | | ||
| 110 | -| `nivel` | ✗ | ✓ contexto ("Objeto del Gasto · Partida") | | ||
| 111 | - | ||
| 112 | -### Rubros (clas_rubros) | ||
| 113 | -| Columna | Buscar | Mostrar | | ||
| 114 | -|---------|--------|---------| | ||
| 115 | -| `desc_rubros` | ✓ | ✓ nombre principal | | ||
| 116 | -| `rubro` | ✓ | ✓ código (monospace) | | ||
| 117 | -| `nivel` | ✗ | ✓ contexto ("Rubro · Tipo") | | ||
| 118 | - | ||
| 119 | -## Flujo de Búsqueda | ||
| 120 | - | ||
| 121 | -``` | ||
| 122 | -1. CARGA INICIAL | ||
| 123 | - App monta → descarga clasificadores → construye índice Fuse.js | ||
| 124 | - | ||
| 125 | -2. USUARIO ESCRIBE | ||
| 126 | - Input → debounce 250ms → si ≥2 chars → Fuse.search() | ||
| 127 | - | ||
| 128 | -3. RESULTADOS | ||
| 129 | - Fuse devuelve matches → renderizar lista con highlighting | ||
| 130 | - | ||
| 131 | -4. SELECCIÓN | ||
| 132 | - Click o Enter → navegar a URL según tipo | ||
| 133 | -``` | ||
| 134 | - | ||
| 135 | -## Estructura de URLs | ||
| 136 | - | ||
| 137 | -``` | ||
| 138 | -/entidad/[codigo] → /entidad/139 | ||
| 139 | -/objeto/[codigo] → /objeto/25100 | ||
| 140 | -/rubro/[codigo] → /rubro/13000 | ||
| 141 | -``` | ||
| 142 | - | ||
| 143 | -## Formato de Resultados | ||
| 144 | - | ||
| 145 | -Resultados agrupados por tipo de clasificador: | ||
| 146 | - | ||
| 147 | -``` | ||
| 148 | -┌─────────────────────────────────────────────────────┐ | ||
| 149 | -│ 🔍 [Buscar entidad, objeto de gasto o rubro...] │ | ||
| 150 | -├─────────────────────────────────────────────────────┤ | ||
| 151 | -│ ENTIDADES │ | ||
| 152 | -├─────────────────────────────────────────────────────┤ | ||
| 153 | -│ Universidad Mayor De San Andrés (UMSA) │ | ||
| 154 | -│ Universidades Públicas │ | ||
| 155 | -├─────────────────────────────────────────────────────┤ | ||
| 156 | -│ OBJETOS DEL GASTO │ | ||
| 157 | -├─────────────────────────────────────────────────────┤ | ||
| 158 | -│ 25100 Pasajes │ | ||
| 159 | -│ Objeto del Gasto · Partida │ | ||
| 160 | -├─────────────────────────────────────────────────────┤ | ||
| 161 | -│ RUBROS │ | ||
| 162 | -├─────────────────────────────────────────────────────┤ | ||
| 163 | -│ 13000 INGRESOS POR IMPUESTOS │ | ||
| 164 | -│ Rubro · Tipo │ | ||
| 165 | -└─────────────────────────────────────────────────────┘ | ||
| 166 | -``` | ||
| 167 | - | ||
| 168 | -### Diferencias visuales | ||
| 169 | -- **Entidades**: Nombre + (sigla) en primera línea | ||
| 170 | -- **Objetos de gasto**: Código (monospace) + Nombre en primera línea | ||
| 171 | -- **Rubros**: Código (monospace) + Nombre en primera línea | ||
| 172 | - | ||
| 173 | -## Estados del Buscador | ||
| 174 | - | ||
| 175 | -| Estado | Qué mostrar | | ||
| 176 | -|--------|-------------| | ||
| 177 | -| Vacío (< 2 chars) | Placeholder o sugerencias | | ||
| 178 | -| Cargando índice | Spinner / "Cargando..." | | ||
| 179 | -| Buscando | Nada (es instantáneo) | | ||
| 180 | -| Con resultados | Lista de resultados | | ||
| 181 | -| Sin resultados | "No se encontraron resultados para 'xyz'" | | ||
| 182 | -| Error | "Error al cargar datos" | | ||
| 183 | - | ||
| 184 | -## Estructura de Archivos | ||
| 185 | - | ||
| 186 | -``` | ||
| 187 | -src/lib/ | ||
| 188 | -├── components/ | ||
| 189 | -│ └── search/ | ||
| 190 | -│ ├── SearchBox.svelte ← Input + lógica de búsqueda | ||
| 191 | -│ ├── SearchResults.svelte ← Lista de resultados | ||
| 192 | -│ └── SearchResultItem.svelte ← Item individual | ||
| 193 | -├── services/ | ||
| 194 | -│ ├── supabase.js ← Cliente Supabase | ||
| 195 | -│ └── search.js ← Inicialización Fuse.js | ||
| 196 | -├── stores/ | ||
| 197 | -│ └── searchStore.js ← Estado: query, results, loading | ||
| 198 | -├── utils/ | ||
| 199 | -│ └── normalize.js ← Normalización de texto | ||
| 200 | -└── data/ | ||
| 201 | - └── index.js ← Carga y construcción del índice | ||
| 202 | -``` | ||
| 203 | - | ||
| 204 | -## Estado de Implementación | ||
| 205 | - | ||
| 206 | -| Clasificador | Estado | Tabla | | ||
| 207 | -|--------------|--------|-------| | ||
| 208 | -| Entidades | ✅ Implementado | `ppto.clas_institucional` | | ||
| 209 | -| Objetos de gasto | ✅ Implementado | `ppto.clas_objetos` | | ||
| 210 | -| Rubros | ✅ Implementado | `ppto.clas_rubros` | | ||
| 211 | -| Fuente de financiamiento | ⏳ Pendiente | - | | ||
| 212 | -| Geográfico | ⏳ Pendiente | - | | ||
| 213 | - | ||
| 214 | -## Trabajo Futuro | ||
| 215 | - | ||
| 216 | -### Índice pre-computado | ||
| 217 | -Posibilidad de pre-computar el índice en servidor y servir como JSON estático para mejorar tiempo de carga inicial. | ||
| 218 | - | ||
| 219 | -### Migración a servidor | ||
| 220 | -Si el índice supera ~20,000 registros: | ||
| 221 | -1. Habilitar extensión `pg_trgm` en PostgreSQL | ||
| 222 | -2. Crear índices GIN en columnas de búsqueda | ||
| 223 | -3. Cambiar de Fuse.js a queries con `similarity()` o `%` operator | ||
| 224 | -4. El componente de UI se mantiene igual, solo cambia el servicio | ||
| 225 | - | ||
| 226 | ---- | ||
| 227 | - | ||
| 228 | -*Documento de referencia para la implementación del buscador* |
src/routes/descargas/+page.js
0 → 100644
| 1 | +export const ssr = false; |
tablas.md
deleted
100644 → 0
| 1 | -# Estructura de Bases de Datos - Presupuesto Público Bolivia | ||
| 2 | - | ||
| 3 | -Este documento detalla las tablas, vistas y sus estructuras en el esquema `ppto` de Supabase. | ||
| 4 | - | ||
| 5 | ---- | ||
| 6 | - | ||
| 7 | -## Tablas de Clasificadores | ||
| 8 | - | ||
| 9 | -### 1. `clas_institucional` - Clasificador Institucional | ||
| 10 | - | ||
| 11 | -| Columna | Tipo | Descripción | | ||
| 12 | -|---------|------|-------------| | ||
| 13 | -| entidad | INTEGER | Código único de la entidad | | ||
| 14 | -| desc_entidad | TEXT | Nombre completo de la entidad | | ||
| 15 | -| sigla_entidad | VARCHAR(50) | Sigla de la entidad | | ||
| 16 | -| sector | VARCHAR(10) | Código del sector | | ||
| 17 | -| desc_sector | TEXT | Nombre del sector | | ||
| 18 | -| sigla_sector | VARCHAR(20) | Sigla del sector | | ||
| 19 | -| subsector | VARCHAR(10) | Código del subsector | | ||
| 20 | -| desc_subsector | TEXT | Nombre del subsector | | ||
| 21 | -| sigla_subsector | VARCHAR(20) | Sigla del subsector | | ||
| 22 | -| area | VARCHAR(10) | Código del área | | ||
| 23 | -| desc_area | TEXT | Nombre del área | | ||
| 24 | -| sigla_area | VARCHAR(20) | Sigla del área | | ||
| 25 | -| subarea | VARCHAR(10) | Código de la subárea | | ||
| 26 | -| desc_subarea | TEXT | Nombre de la subárea | | ||
| 27 | -| sigla_subarea | VARCHAR(20) | Sigla de la subárea | | ||
| 28 | -| gestiones | TEXT | Lista CSV de años con datos (ej: "2006,2007,...,2025") | | ||
| 29 | -| n_gestiones | INTEGER | Cantidad de años con datos | | ||
| 30 | - | ||
| 31 | - | ||
| 32 | - | ||
| 33 | ---- | ||
| 34 | - | ||
| 35 | -### 2. `clas_objetos` - Clasificador de Objetos de Gasto | ||
| 36 | - | ||
| 37 | -| Columna | Tipo | Descripción | | ||
| 38 | -|---------|------|-------------| | ||
| 39 | -| nivel | TEXT | Nivel jerárquico: 'grupo', 'subgrupo', 'partida', 'subpartida' | | ||
| 40 | -| objeto | TEXT (PK) | Código del objeto (ej: "10000", "11000", "11100") | | ||
| 41 | -| desc_objeto | TEXT | Descripción vigente del objeto de gasto | | ||
| 42 | -| gestiones | TEXT | Rangos de años donde existe (ej: "2005, 2007-2020, 2022-2026") | | ||
| 43 | -| n_gestiones | INTEGER | Cantidad de años con datos | | ||
| 44 | -| n_variaciones | INTEGER | Cantidad de variaciones históricas en la descripción | | ||
| 45 | -| descripciones | JSONB | Historial de descripciones por rangos de años | | ||
| 46 | - | ||
| 47 | -**Estructura de `descripciones`:** | ||
| 48 | -```json | ||
| 49 | -[ | ||
| 50 | - { | ||
| 51 | - "descripcion": "Descripción vigente del objeto...", | ||
| 52 | - "rangos": "2011-2020, 2022-2026" | ||
| 53 | - }, | ||
| 54 | - { | ||
| 55 | - "descripcion": "Descripción anterior del objeto...", | ||
| 56 | - "rangos": "2005, 2007-2010" | ||
| 57 | - } | ||
| 58 | -] | ||
| 59 | -``` | ||
| 60 | - | ||
| 61 | -**Jerarquía derivada del código `objeto`:** | ||
| 62 | -``` | ||
| 63 | -Nivel Patrón Ejemplo | ||
| 64 | -────────────────────────────────── | ||
| 65 | -grupo X0000 10000, 20000 | ||
| 66 | -subgrupo XX000 11000, 12000 | ||
| 67 | -partida XXX00 11100, 11200 | ||
| 68 | -subpartida XXXX0/X 11110, 11111 | ||
| 69 | -``` | ||
| 70 | - | ||
| 71 | -**Sin índices.** La tabla tiene ~500 filas y se carga completa al inicio. | ||
| 72 | - | ||
| 73 | ---- | ||
| 74 | - | ||
| 75 | -### 3. `clas_rubros` - Clasificador de Rubros (Ingresos) | ||
| 76 | - | ||
| 77 | -| Columna | Tipo | Descripción | | ||
| 78 | -|---------|------|-------------| | ||
| 79 | -| nivel | TEXT | Nivel jerárquico: 'tipo', 'clase', 'cuenta', 'sub_cuenta' | | ||
| 80 | -| rubro | TEXT (PK) | Código del rubro (ej: "1000", "1100", "1110") | | ||
| 81 | -| desc_rubro | TEXT | Descripción vigente del rubro | | ||
| 82 | -| gestiones | TEXT | Rangos de años donde existe (ej: "2005, 2007-2020, 2022-2026") | | ||
| 83 | -| n_gestiones | INTEGER | Cantidad de años con datos | | ||
| 84 | -| n_variaciones | INTEGER | Cantidad de variaciones históricas en la descripción | | ||
| 85 | -| descripciones | JSONB | Historial de descripciones por rangos de años | | ||
| 86 | - | ||
| 87 | -**Estructura de `descripciones`:** | ||
| 88 | -```json | ||
| 89 | -[ | ||
| 90 | - { | ||
| 91 | - "descripcion": "Descripción vigente del rubro...", | ||
| 92 | - "rangos": "2011-2020, 2022-2026" | ||
| 93 | - }, | ||
| 94 | - { | ||
| 95 | - "descripcion": "Descripción anterior del rubro...", | ||
| 96 | - "rangos": "2005, 2007-2010" | ||
| 97 | - } | ||
| 98 | -] | ||
| 99 | -``` | ||
| 100 | - | ||
| 101 | -**Jerarquía derivada del código `rubro`:** | ||
| 102 | -``` | ||
| 103 | -Nivel Patrón Ejemplo | ||
| 104 | -────────────────────────────────── | ||
| 105 | -tipo X000 1000, 2000 | ||
| 106 | -clase XX00 1100, 1200 | ||
| 107 | -cuenta XXX0 1110, 1120 | ||
| 108 | -sub_cuenta XXXX 1111, 1112 | ||
| 109 | -``` | ||
| 110 | - | ||
| 111 | -**Sin índices.** La tabla tiene ~400 filas y se carga completa al inicio. | ||
| 112 | - | ||
| 113 | ---- | ||
| 114 | - | ||
| 115 | -### 4. `clas_finfun` - Clasificador de Finalidad y Función | ||
| 116 | - | ||
| 117 | -| Columna | Tipo | Descripción | | ||
| 118 | -|---------|------|-------------| | ||
| 119 | -| nivel | TEXT | Nivel jerárquico: 'finalidad', 'grpfuncion', 'funcion' | | ||
| 120 | -| finfun | TEXT (PK) | Código de finalidad/función (ej: "1", "11", "111") | | ||
| 121 | -| desc_finfun | TEXT | Descripción vigente de la finalidad/función | | ||
| 122 | -| gestiones | TEXT | Rangos de años donde existe (ej: "2005, 2007-2020, 2022-2026") | | ||
| 123 | -| n_gestiones | INTEGER | Cantidad de años con datos | | ||
| 124 | -| n_variaciones | INTEGER | Cantidad de variaciones históricas en la descripción | | ||
| 125 | -| descripciones | JSONB | Historial de descripciones por rangos de años | | ||
| 126 | - | ||
| 127 | -**Estructura de `descripciones`:** | ||
| 128 | -```json | ||
| 129 | -[ | ||
| 130 | - { | ||
| 131 | - "descripcion": "Descripción vigente de la finalidad/función...", | ||
| 132 | - "rangos": "2011-2020, 2022-2026" | ||
| 133 | - }, | ||
| 134 | - { | ||
| 135 | - "descripcion": "Descripción anterior...", | ||
| 136 | - "rangos": "2005, 2007-2010" | ||
| 137 | - } | ||
| 138 | -] | ||
| 139 | -``` | ||
| 140 | - | ||
| 141 | -**Jerarquía derivada del código `finfun`:** | ||
| 142 | -``` | ||
| 143 | -Nivel Patrón Ejemplo | ||
| 144 | -────────────────────────────────── | ||
| 145 | -finalidad X 1, 2, 3 | ||
| 146 | -grpfuncion XX 11, 12, 21 | ||
| 147 | -funcion XXX+ 111, 112, 211 | ||
| 148 | -``` | ||
| 149 | - | ||
| 150 | -**Sin índices.** La tabla tiene ~200 filas y se carga completa al inicio. | ||
| 151 | - | ||
| 152 | ---- | ||
| 153 | - | ||
| 154 | -## Tablas de Datos Agregados | ||
| 155 | - | ||
| 156 | -### 5. `treemap_objeto` - Datos para Treemap de Objetos de Gasto | ||
| 157 | - | ||
| 158 | -| Columna | Tipo | Descripción | | ||
| 159 | -|---------|------|-------------| | ||
| 160 | -| gestion | INTEGER | Año fiscal (2005-2025) | | ||
| 161 | -| entidad | INTEGER | Código de entidad (0 = Todo el Estado) | | ||
| 162 | -| nivel | VARCHAR(20) | Nivel: 'grupo', 'subgrupo', 'partida', 'subpartida' | | ||
| 163 | -| objeto | INTEGER | Código del objeto | | ||
| 164 | -| desc_objeto | TEXT | Descripción del objeto | | ||
| 165 | -| parent | INTEGER | Código del objeto padre (para jerarquía) | | ||
| 166 | -| devengado | NUMERIC | Monto devengado en Bs | | ||
| 167 | - | ||
| 168 | -**Índices recomendados:** | ||
| 169 | -```sql | ||
| 170 | -CREATE INDEX idx_treemap_objeto_gestion_entidad ON ppto.treemap_objeto(gestion, entidad); | ||
| 171 | -``` | ||
| 172 | - | ||
| 173 | -**Notas:** | ||
| 174 | -- ~1.4 millones de filas | ||
| 175 | -- Entidad 0 representa el agregado de todo el estado | ||
| 176 | -- Cada combinación gestión + entidad debe cargarse como unidad | ||
| 177 | - | ||
| 178 | ---- | ||
| 179 | - | ||
| 180 | -### 6. `entidades_treemap` - Índice de Entidades por Año (Treemap) | ||
| 181 | - | ||
| 182 | -| Columna | Tipo | Descripción | | ||
| 183 | -|---------|------|-------------| | ||
| 184 | -| entidad | INTEGER | Código de la entidad | | ||
| 185 | -| gestion | INTEGER | Año fiscal | | ||
| 186 | -| desc_entidad | TEXT | Nombre de la entidad | | ||
| 187 | -| sigla_entidad | VARCHAR(50) | Sigla de la entidad | | ||
| 188 | - | ||
| 189 | -**Índices recomendados:** | ||
| 190 | -```sql | ||
| 191 | -CREATE INDEX idx_entidades_treemap_gestion ON ppto.entidades_treemap(gestion); | ||
| 192 | -``` | ||
| 193 | - | ||
| 194 | -**SQL para crear (derivada de treemap_objeto):** | ||
| 195 | -```sql | ||
| 196 | -CREATE TABLE ppto.entidades_treemap AS | ||
| 197 | -SELECT DISTINCT | ||
| 198 | - t.entidad, | ||
| 199 | - t.gestion, | ||
| 200 | - c.desc_entidad, | ||
| 201 | - c.sigla_entidad | ||
| 202 | -FROM ppto.treemap_objeto t | ||
| 203 | -LEFT JOIN ppto.clas_institucional c ON t.entidad = c.entidad | ||
| 204 | -WHERE t.entidad > 0; | ||
| 205 | - | ||
| 206 | -CREATE INDEX idx_entidades_treemap_gestion ON ppto.entidades_treemap(gestion); | ||
| 207 | -GRANT SELECT ON ppto.entidades_treemap TO anon, authenticated; | ||
| 208 | -``` | ||
| 209 | - | ||
| 210 | -**Uso:** Poblar dropdown de entidades filtrado por año seleccionado. | ||
| 211 | - | ||
| 212 | ---- | ||
| 213 | - | ||
| 214 | -### 7. `entidades_por_objeto` - Relación Entidades-Objetos | ||
| 215 | - | ||
| 216 | -| Columna | Tipo | Descripción | | ||
| 217 | -|---------|------|-------------| | ||
| 218 | -| entidad | INTEGER | Código de la entidad | | ||
| 219 | -| entidad_desc | TEXT | Nombre de la entidad | | ||
| 220 | -| objeto | INTEGER | Código del objeto | | ||
| 221 | -| nivel | VARCHAR(20) | Nivel del objeto | | ||
| 222 | - | ||
| 223 | -**Índices recomendados:** | ||
| 224 | -```sql | ||
| 225 | -CREATE INDEX idx_entidades_por_objeto_objeto ON ppto.entidades_por_objeto(objeto); | ||
| 226 | -CREATE INDEX idx_entidades_por_objeto_objeto_nivel ON ppto.entidades_por_objeto(objeto, nivel); | ||
| 227 | -``` | ||
| 228 | - | ||
| 229 | -**Uso:** Poblar dropdowns de entidades al ver un objeto específico. | ||
| 230 | - | ||
| 231 | ---- | ||
| 232 | - | ||
| 233 | -### 8. `vista_finfun_estado` - Vista Agregada por Finalidad/Función (Todo el Estado) | ||
| 234 | - | ||
| 235 | -| Columna | Tipo | Descripción | | ||
| 236 | -|---------|------|-------------| | ||
| 237 | -| gestion | INTEGER | Año fiscal | | ||
| 238 | -| finfun | TEXT | Código de finalidad/función | | ||
| 239 | -| total | NUMERIC | Monto total devengado | | ||
| 240 | -| poblacion | INTEGER | Población del año | | ||
| 241 | -| n_entidades | INTEGER | Cantidad de entidades con datos | | ||
| 242 | -| per_capita | NUMERIC | Gasto per cápita (total/población) | | ||
| 243 | -| total_gestion | NUMERIC | Total del Estado en esa gestión | | ||
| 244 | -| prop | NUMERIC | Proporción sobre el total del Estado | | ||
| 245 | -| ranking | INTEGER | Ranking por monto dentro de su nivel | | ||
| 246 | -| n_pares | INTEGER | Cantidad de códigos del mismo nivel | | ||
| 247 | -| top1_entidad | INTEGER | Código de la entidad con mayor gasto | | ||
| 248 | -| top1_entidad_desc | TEXT | Nombre de la entidad top 1 | | ||
| 249 | -| top1_monto | NUMERIC | Monto de la entidad top 1 | | ||
| 250 | -| top1_pct | NUMERIC | Porcentaje del total | | ||
| 251 | -| top2_entidad | INTEGER | Código de la entidad top 2 | | ||
| 252 | -| top2_entidad_desc | TEXT | Nombre de la entidad top 2 | | ||
| 253 | -| top2_monto | NUMERIC | Monto de la entidad top 2 | | ||
| 254 | -| top2_pct | NUMERIC | Porcentaje del total | | ||
| 255 | -| top3_entidad | INTEGER | Código de la entidad top 3 | | ||
| 256 | -| top3_entidad_desc | TEXT | Nombre de la entidad top 3 | | ||
| 257 | -| top3_monto | NUMERIC | Monto de la entidad top 3 | | ||
| 258 | -| top3_pct | NUMERIC | Porcentaje del total | | ||
| 259 | - | ||
| 260 | -**Índices recomendados:** | ||
| 261 | -```sql | ||
| 262 | -CREATE INDEX idx_vista_finfun_estado_finfun ON ppto.vista_finfun_estado(finfun); | ||
| 263 | -CREATE INDEX idx_vista_finfun_estado_finfun_gestion ON ppto.vista_finfun_estado(finfun, gestion); | ||
| 264 | -``` | ||
| 265 | - | ||
| 266 | ---- | ||
| 267 | - | ||
| 268 | -### 9. `vista_finfun_entidad` - Vista por Finalidad/Función y Entidad | ||
| 269 | - | ||
| 270 | -| Columna | Tipo | Descripción | | ||
| 271 | -|---------|------|-------------| | ||
| 272 | -| gestion | INTEGER | Año fiscal | | ||
| 273 | -| finfun | TEXT | Código de finalidad/función | | ||
| 274 | -| nivel | TEXT | Nivel: 'finalidad', 'grpfuncion', 'funcion' | | ||
| 275 | -| entidad | INTEGER | Código de la entidad | | ||
| 276 | -| entidad_desc | TEXT | Nombre de la entidad | | ||
| 277 | -| monto | NUMERIC | Monto devengado | | ||
| 278 | -| per_capita | NUMERIC | Gasto per cápita | | ||
| 279 | -| ranking | INTEGER | Ranking de la entidad para ese finfun | | ||
| 280 | -| prop | NUMERIC | Proporción sobre el total del finfun | | ||
| 281 | -| n_entidades | INTEGER | Total de entidades con ese finfun | | ||
| 282 | - | ||
| 283 | -**Índices recomendados:** | ||
| 284 | -```sql | ||
| 285 | -CREATE INDEX idx_vista_finfun_entidad_finfun ON ppto.vista_finfun_entidad(finfun); | ||
| 286 | -CREATE INDEX idx_vista_finfun_entidad_finfun_entidad ON ppto.vista_finfun_entidad(finfun, entidad); | ||
| 287 | -``` | ||
| 288 | - | ||
| 289 | ---- | ||
| 290 | - | ||
| 291 | -### 10. `entidades_por_finfun` - Relación Entidades-Finalidad/Función | ||
| 292 | - | ||
| 293 | -| Columna | Tipo | Descripción | | ||
| 294 | -|---------|------|-------------| | ||
| 295 | -| finfun | TEXT | Código de finalidad/función | | ||
| 296 | -| nivel | TEXT | Nivel: 'finalidad', 'grpfuncion', 'funcion' | | ||
| 297 | -| entidad | INTEGER | Código de la entidad | | ||
| 298 | -| entidad_desc | TEXT | Nombre de la entidad | | ||
| 299 | - | ||
| 300 | -**Índices recomendados:** | ||
| 301 | -```sql | ||
| 302 | -CREATE INDEX idx_entidades_por_finfun_finfun ON ppto.entidades_por_finfun(finfun); | ||
| 303 | -CREATE INDEX idx_entidades_por_finfun_finfun_nivel ON ppto.entidades_por_finfun(finfun, nivel); | ||
| 304 | -``` | ||
| 305 | - | ||
| 306 | -**Uso:** Poblar dropdowns de entidades al ver una finalidad/función específica. | ||
| 307 | - | ||
| 308 | ---- | ||
| 309 | - | ||
| 310 | -## Vistas Materializadas / Tablas de Consulta | ||
| 311 | - | ||
| 312 | -### 11. `vista_objeto_estado` - Vista Agregada por Objeto (Todo el Estado) | ||
| 313 | - | ||
| 314 | -| Columna | Tipo | Descripción | | ||
| 315 | -|---------|------|-------------| | ||
| 316 | -| objeto | INTEGER | Código del objeto | | ||
| 317 | -| gestion | INTEGER | Año fiscal | | ||
| 318 | -| devengado | NUMERIC | Monto total devengado | | ||
| 319 | -| top1_entidad | TEXT | Entidad con mayor gasto | | ||
| 320 | -| top1_monto | NUMERIC | Monto de la entidad top 1 | | ||
| 321 | -| top1_pct | NUMERIC | Porcentaje del total | | ||
| 322 | -| top2_entidad | TEXT | Segunda entidad con mayor gasto | | ||
| 323 | -| top2_monto | NUMERIC | Monto de la entidad top 2 | | ||
| 324 | -| top2_pct | NUMERIC | Porcentaje del total | | ||
| 325 | -| top3_entidad | TEXT | Tercera entidad con mayor gasto | | ||
| 326 | -| top3_monto | NUMERIC | Monto de la entidad top 3 | | ||
| 327 | -| top3_pct | NUMERIC | Porcentaje del total | | ||
| 328 | - | ||
| 329 | -**Índices recomendados:** | ||
| 330 | -```sql | ||
| 331 | -CREATE INDEX idx_vista_objeto_estado_objeto ON ppto.vista_objeto_estado(objeto); | ||
| 332 | -CREATE INDEX idx_vista_objeto_estado_objeto_gestion ON ppto.vista_objeto_estado(objeto, gestion); | ||
| 333 | -``` | ||
| 334 | - | ||
| 335 | ---- | ||
| 336 | - | ||
| 337 | -### 12. `vista_objeto_entidad` - Vista por Objeto y Entidad | ||
| 338 | - | ||
| 339 | -| Columna | Tipo | Descripción | | ||
| 340 | -|---------|------|-------------| | ||
| 341 | -| objeto | INTEGER | Código del objeto | | ||
| 342 | -| nivel | VARCHAR(20) | Nivel del objeto | | ||
| 343 | -| entidad | INTEGER | Código de la entidad | | ||
| 344 | -| gestion | INTEGER | Año fiscal | | ||
| 345 | -| devengado | NUMERIC | Monto devengado | | ||
| 346 | - | ||
| 347 | -**Índices recomendados:** | ||
| 348 | -```sql | ||
| 349 | -CREATE INDEX idx_vista_objeto_entidad_objeto ON ppto.vista_objeto_entidad(objeto); | ||
| 350 | -CREATE INDEX idx_vista_objeto_entidad_objeto_entidad ON ppto.vista_objeto_entidad(objeto, entidad); | ||
| 351 | -CREATE INDEX idx_vista_objeto_entidad_objeto_nivel_entidad ON ppto.vista_objeto_entidad(objeto, nivel, entidad); | ||
| 352 | -``` | ||
| 353 | - | ||
| 354 | ---- | ||
| 355 | - | ||
| 356 | -## Jerarquías | ||
| 357 | - | ||
| 358 | -### Objetos de Gasto (4 niveles) | ||
| 359 | -``` | ||
| 360 | -Grupo (1xxxx) → Subgrupo (11xxx) → Partida (111xx) → Subpartida (11110) | ||
| 361 | -``` | ||
| 362 | - | ||
| 363 | -### Rubros de Ingresos (4 niveles) | ||
| 364 | -``` | ||
| 365 | -Tipo → Clase → Cuenta → Subcuenta | ||
| 366 | -``` | ||
| 367 | - | ||
| 368 | -### Finalidad y Función (3 niveles) | ||
| 369 | -``` | ||
| 370 | -Finalidad (X) → Grupo Función (XX) → Función (XXX) | ||
| 371 | -``` | ||
| 372 | - | ||
| 373 | -### Institucional (5 niveles) | ||
| 374 | -``` | ||
| 375 | -Sector → Subsector → Área → Subárea → Entidad | ||
| 376 | -``` | ||
| 377 | - | ||
| 378 | ---- | ||
| 379 | - | ||
| 380 | -## Tablas de Vista de Entidad" | ||
| 381 | - | ||
| 382 | -### 13. `entidad_resumen` - Resumen histórico por entidad/DA | ||
| 383 | - | ||
| 384 | -Alimenta los gráficos de historia (area plots) y rankings en la vista de entidad (`/entidad/[codigo]`). | ||
| 385 | - | ||
| 386 | -| Columna | Tipo | Descripción | | ||
| 387 | -|---------|------|-------------| | ||
| 388 | -| tipo | TEXT | Tipo de flujo: 'gastos' o 'ingresos' | | ||
| 389 | -| tipo_codigo | TEXT | Tipo de código: 'entidad', 'entidad_da', 'municipio_ubigeo', etc. | | ||
| 390 | -| codigo | TEXT | Código de la entidad o DA (ej: "1901", "1901.6") | | ||
| 391 | -| desc | TEXT | Nombre de la entidad o DA | | ||
| 392 | -| desc_padre | TEXT | Nombre de la entidad madre (para DAs) | | ||
| 393 | -| gestion | INTEGER | Año fiscal | | ||
| 394 | -| devengado | NUMERIC | Monto devengado en Bs | | ||
| 395 | -| ranking | INTEGER | Posición en ranking por monto dentro de su tipo y gestión | | ||
| 396 | - | ||
| 397 | -**Primary key:** `(tipo, tipo_codigo, codigo, gestion)` | ||
| 398 | - | ||
| 399 | -**Índices:** | ||
| 400 | -```sql | ||
| 401 | -CREATE INDEX idx_entidad_resumen_codigo ON ppto.entidad_resumen (codigo); | ||
| 402 | -CREATE INDEX idx_entidad_resumen_gestion ON ppto.entidad_resumen (gestion); | ||
| 403 | -CREATE INDEX idx_entidad_resumen_tipo_codigo ON ppto.entidad_resumen (tipo_codigo); | ||
| 404 | -``` | ||
| 405 | - | ||
| 406 | -**Notas:** | ||
| 407 | -- ~53K filas | ||
| 408 | -- `codigo` es TEXT para soportar entidades ("1901") y DAs ("1901.6") | ||
| 409 | -- `desc` y `desc_padre` permiten resolver nombres sin joins ni búsquedas externas | ||
| 410 | -- Una fila por combinación tipo + tipo_codigo + código + año | ||
| 411 | - | ||
| 412 | ---- | ||
| 413 | - | ||
| 414 | -### 14. `entidad_distribuciones` - Distribución del gasto/ingreso por clasificador | ||
| 415 | - | ||
| 416 | -Alimenta las barras de composición (clasificadores de gasto e ingreso) en la vista de entidad. | ||
| 417 | - | ||
| 418 | -| Columna | Tipo | Descripción | | ||
| 419 | -|---------|------|-------------| | ||
| 420 | -| id | SERIAL (PK) | Identificador autoincremental | | ||
| 421 | -| tipo | TEXT | Tipo de flujo: 'gastos' o 'ingresos' | | ||
| 422 | -| tipo_codigo | TEXT | Tipo de código: 'entidad', 'entidad_da', etc. | | ||
| 423 | -| codigo | TEXT | Código de la entidad o DA | | ||
| 424 | -| dimension | TEXT | Clasificador: 'objeto', 'finfun', 'acteco', 'rubro', 'organismo' | | ||
| 425 | -| gestion | INTEGER | Año fiscal | | ||
| 426 | -| padre | TEXT | Código del grupo padre en la dimensión | | ||
| 427 | -| desc_padre | TEXT | Descripción del grupo padre | | ||
| 428 | -| hijo | TEXT | Código del ítem hijo | | ||
| 429 | -| desc_hijo | TEXT | Descripción del ítem hijo | | ||
| 430 | -| devengado | NUMERIC | Monto devengado en Bs | | ||
| 431 | - | ||
| 432 | -**Índices:** | ||
| 433 | -```sql | ||
| 434 | -CREATE INDEX idx_entidad_dist_codigo ON ppto.entidad_distribuciones (codigo); | ||
| 435 | -CREATE INDEX idx_entidad_dist_gestion ON ppto.entidad_distribuciones (gestion); | ||
| 436 | -CREATE INDEX idx_entidad_dist_codigo_gestion ON ppto.entidad_distribuciones (codigo, gestion); | ||
| 437 | -``` | ||
| 438 | - | ||
| 439 | -**Notas:** | ||
| 440 | -- ~3.6M filas | ||
| 441 | -- Usa `id SERIAL` como PK porque un mismo `hijo` puede tener distintas descripciones dentro de la misma combinación padre/gestión | ||
| 442 | -- Cada fila es un segmento de las barras de composición: cuánto gastó/ingresó una entidad en un ítem específico de un clasificador en un año | ||
| 443 | - | ||
| 444 | ---- | ||
| 445 | - | ||
| 446 | -*Documento generado para el equipo de sistemas - Marzo 2026* |
-
Please register or login to post a comment