Rafael Lopez

descargas

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*
1 +export const ssr = false;
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*