pr0nstar

VI

1 __pycache__/ 1 __pycache__/
2 *.pyc 2 *.pyc
3 - 3 +.codex
......
...@@ -15,7 +15,8 @@ from aiocache import caches ...@@ -15,7 +15,8 @@ from aiocache import caches
15 from presupuestov1.routers import ( 15 from presupuestov1.routers import (
16 project, 16 project,
17 entity, 17 entity,
18 - classifier 18 + classifier,
19 + daily,
19 ) 20 )
20 21
21 22
...@@ -28,7 +29,7 @@ logging.getLogger('api_proy2').setLevel(logging.DEBUG) ...@@ -28,7 +29,7 @@ logging.getLogger('api_proy2').setLevel(logging.DEBUG)
28 29
29 30
30 app = FastAPI( 31 app = FastAPI(
31 - title='Jorvi API', 32 + title='MEFP presupuestosv1 API',
32 middleware=[ 33 middleware=[
33 Middleware( 34 Middleware(
34 RawContextMiddleware, 35 RawContextMiddleware,
...@@ -44,6 +45,7 @@ app.include_router(entity.router) ...@@ -44,6 +45,7 @@ app.include_router(entity.router)
44 app.include_router(classifier.router_objeto) 45 app.include_router(classifier.router_objeto)
45 app.include_router(classifier.router_acteco) 46 app.include_router(classifier.router_acteco)
46 app.include_router(classifier.router_finfun) 47 app.include_router(classifier.router_finfun)
48 +app.include_router(daily.router)
47 49
48 50
49 51
......
...@@ -4,4 +4,5 @@ from . import ( ...@@ -4,4 +4,5 @@ from . import (
4 finfun, 4 finfun,
5 objeto, 5 objeto,
6 treemap, 6 treemap,
7 + daily,
7 ) 8 )
......
...@@ -14,6 +14,10 @@ from sqlalchemy.dialects.postgresql import JSONB ...@@ -14,6 +14,10 @@ from sqlalchemy.dialects.postgresql import JSONB
14 from typing import Any 14 from typing import Any
15 15
16 16
17 +###############################################################################
18 +# Gasto
19 +###############################################################################
20 +
17 class ClasInstitucional(Base): 21 class ClasInstitucional(Base):
18 __tablename__ = "clas_institucional" 22 __tablename__ = "clas_institucional"
19 __table_args__ = ( 23 __table_args__ = (
...@@ -45,16 +49,8 @@ class ClasInstitucional(Base): ...@@ -45,16 +49,8 @@ class ClasInstitucional(Base):
45 n_gestiones: Mapped[int | None] = mapped_column(Integer) 49 n_gestiones: Mapped[int | None] = mapped_column(Integer)
46 50
47 51
48 -class ClasObjetos(Base): 52 +class ClasBase():
49 - __tablename__ = "clas_objetos"
50 - __table_args__ = (
51 - Index("idx_clas_objetos_entidad", "objeto"),
52 - {"schema": "web"},
53 - )
54 -
55 nivel: Mapped[str | None] = mapped_column(Text) 53 nivel: Mapped[str | None] = mapped_column(Text)
56 - objeto: Mapped[str] = mapped_column(Text, primary_key=True)
57 - desc_objeto: Mapped[str | None] = mapped_column(Text)
58 54
59 gestiones: Mapped[str | None] = mapped_column(Text) 55 gestiones: Mapped[str | None] = mapped_column(Text)
60 n_gestiones: Mapped[int | None] = mapped_column(Integer) 56 n_gestiones: Mapped[int | None] = mapped_column(Integer)
...@@ -63,55 +59,98 @@ class ClasObjetos(Base): ...@@ -63,55 +59,98 @@ class ClasObjetos(Base):
63 descripciones: Mapped[list[dict[str, Any]] | None] = mapped_column(JSONB) 59 descripciones: Mapped[list[dict[str, Any]] | None] = mapped_column(JSONB)
64 60
65 61
66 -class ClasRubros(Base): 62 +class ClasObjetos(ClasBase, Base):
67 - __tablename__ = "clas_rubros" 63 + __tablename__ = "clas_objetos"
68 __table_args__ = ( 64 __table_args__ = (
69 - Index("idx_clas_rubros_entidad", "rubro"), 65 + Index("idx_clas_objetos_entidad", "objeto"),
70 {"schema": "web"}, 66 {"schema": "web"},
71 ) 67 )
72 68
73 - nivel: Mapped[str | None] = mapped_column(Text) 69 + objeto: Mapped[str] = mapped_column(Text, primary_key=True)
74 - rubro: Mapped[str] = mapped_column(Text, primary_key=True) 70 + desc_objeto: Mapped[str | None] = mapped_column(Text)
75 - desc_rubro: Mapped[str | None] = mapped_column(Text)
76 -
77 - gestiones: Mapped[str | None] = mapped_column(Text)
78 - n_gestiones: Mapped[int | None] = mapped_column(Integer)
79 - n_variaciones: Mapped[int | None] = mapped_column(Integer)
80 -
81 - descripciones: Mapped[list[dict[str, Any]] | None] = mapped_column(JSONB)
82 71
83 72
84 -class ClasFinfun(Base): 73 +class ClasFinfun(ClasBase, Base):
85 __tablename__ = "clas_finfun" 74 __tablename__ = "clas_finfun"
86 __table_args__ = ( 75 __table_args__ = (
87 Index("idx_clas_finfun_entidad", "finfun"), 76 Index("idx_clas_finfun_entidad", "finfun"),
88 {"schema": "web"}, 77 {"schema": "web"},
89 ) 78 )
90 79
91 - nivel: Mapped[str | None] = mapped_column(Text)
92 finfun: Mapped[str] = mapped_column(Text, primary_key=True) 80 finfun: Mapped[str] = mapped_column(Text, primary_key=True)
93 desc_finfun: Mapped[str | None] = mapped_column(Text) 81 desc_finfun: Mapped[str | None] = mapped_column(Text)
94 82
95 - gestiones: Mapped[str | None] = mapped_column(Text)
96 - n_gestiones: Mapped[int | None] = mapped_column(Integer)
97 - n_variaciones: Mapped[int | None] = mapped_column(Integer)
98 -
99 - descripciones: Mapped[list[dict[str, Any]] | None] = mapped_column(JSONB)
100 83
101 - 84 +class ClasActeco(ClasBase, Base):
102 -class ClasActeco(Base):
103 __tablename__ = "clas_acteco" 85 __tablename__ = "clas_acteco"
104 __table_args__ = ( 86 __table_args__ = (
105 Index("idx_clas_acteco_entidad", "acteco"), 87 Index("idx_clas_acteco_entidad", "acteco"),
106 {"schema": "web"}, 88 {"schema": "web"},
107 ) 89 )
108 90
109 - nivel: Mapped[str | None] = mapped_column(Text)
110 acteco: Mapped[str] = mapped_column(Text, primary_key=True) 91 acteco: Mapped[str] = mapped_column(Text, primary_key=True)
111 desc_acteco: Mapped[str | None] = mapped_column(Text) 92 desc_acteco: Mapped[str | None] = mapped_column(Text)
112 93
94 +
95 +class ClasGeografico(ClasBase, Base):
96 + __tablename__ = "clas_geografico"
97 + __table_args__ = (
98 + Index("idx_clas_geografico_ubigeo", "ubigeo"),
99 + {"schema": "web"},
100 + )
101 +
102 + ubigeo: Mapped[str] = mapped_column(Text, primary_key=True)
103 + desc_ubigeo: Mapped[str | None] = mapped_column(Text)
104 + municipio_ubigeo: Mapped[int | None] = mapped_column(Integer)
105 +
106 +
107 +###############################################################################
108 +# Ingreso
109 +###############################################################################
110 +
111 +class ClasRubros(ClasBase, Base):
112 + __tablename__ = "clas_rubros"
113 + __table_args__ = (
114 + Index("idx_clas_rubros_entidad", "rubro"),
115 + {"schema": "web"},
116 + )
117 +
118 + rubro: Mapped[str] = mapped_column(Text, primary_key=True)
119 + desc_rubro: Mapped[str | None] = mapped_column(Text)
120 +
121 +
122 +class ClasFuentes(ClasBase, Base):
123 + __tablename__ = "clas_fuentes"
124 + __table_args__ = (
125 + Index("idx_clas_fuentes_fuente", "fuente"),
126 + {"schema": "web"},
127 + )
128 +
129 + fuente: Mapped[int] = mapped_column(Integer, primary_key=True)
130 + desc_fuente: Mapped[str] = mapped_column(Text)
131 +
132 + grupo_fuente: Mapped[int] = mapped_column(Integer)
133 + desc_grupo_fuente: Mapped[str] = mapped_column(Text)
134 +
135 +
136 +class ClasOrganismos(Base):
137 + __tablename__ = "clas_organismos"
138 + __table_args__ = (
139 + Index("idx_clas_organismos_organismo", "organismo"),
140 + {"schema": "web"},
141 + )
142 +
143 + organismo: Mapped[int] = mapped_column(Integer, primary_key=True)
144 + desc_organismo: Mapped[str] = mapped_column(Text)
145 + sigla_organismo: Mapped[str] = mapped_column(String(20))
146 +
147 + organismo_grupo: Mapped[int] = mapped_column(Integer)
148 + desc_organismo_grupo: Mapped[str] = mapped_column(Text)
149 + sigla_organismo_grupo: Mapped[str] = mapped_column(String(20))
150 +
151 + organismo_subgrupo: Mapped[int] = mapped_column(Integer)
152 + desc_organismo_subgrupo: Mapped[str] = mapped_column(Text)
153 + sigla_organismo_subgrupo: Mapped[str] = mapped_column(String(20))
154 +
113 gestiones: Mapped[str | None] = mapped_column(Text) 155 gestiones: Mapped[str | None] = mapped_column(Text)
114 n_gestiones: Mapped[int | None] = mapped_column(Integer) 156 n_gestiones: Mapped[int | None] = mapped_column(Integer)
115 - n_variaciones: Mapped[int | None] = mapped_column(Integer)
116 -
117 - descripciones: Mapped[list[dict[str, Any]] | None] = mapped_column(JSONB)
......
1 +from sqlalchemy.orm import Mapped, mapped_column
2 +from presupuestov1.model import Base
3 +
4 +from sqlalchemy import (
5 + Integer,
6 + String,
7 + Text,
8 + Numeric,
9 + Index,
10 + MetaData,
11 + Boolean,
12 + DateTime
13 +)
14 +from datetime import datetime
15 +
16 +
17 +class UpdateStatus(Base):
18 + __tablename__ = "diario_status"
19 + __table_args__ = (
20 + {"schema": "web"},
21 + )
22 +
23 + id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
24 +
25 + fecha_actualizacion: Mapped[datetime] = mapped_column(DateTime)
26 + status: Mapped[bool] = mapped_column(Boolean)
27 +
28 +
29 +class EjecucionClasificadores(Base):
30 + __tablename__ = "diario_ejecucion_clasificadores"
31 + __table_args__ = (
32 + Index("idx_ejecucion_clasificadores_dias", "dias"),
33 + Index("idx_ejecucion_clasificadores_transferencias", "transferencias"),
34 + {"schema": "web"},
35 + )
36 +
37 + id: Mapped[int] = mapped_column(Integer, primary_key=True)
38 +
39 + transferencias: Mapped[bool] = mapped_column(Boolean)
40 + dias: Mapped[int] = mapped_column(Integer)
41 + clasificador: Mapped[str] = mapped_column(String(48))
42 +
43 + devengado: Mapped[float] = mapped_column(Numeric(30, 15))
44 +
45 + padre: Mapped[str] = mapped_column(Text)
46 + hijo: Mapped[str] = mapped_column(Text)
47 +
48 +
49 +class EjecucionEntidades(Base):
50 + __tablename__ = "diario_ejecucion_entidades"
51 + __table_args__ = (
52 + Index("idx_ejecucion_entidades_dias", "dias"),
53 + Index("idx_ejecucion_entidades_transferencias", "transferencias"),
54 + Index("idx_ejecucion_entidades_entidad", "entidad"),
55 + {"schema": "web"},
56 + )
57 +
58 + id: Mapped[int] = mapped_column(Integer, primary_key=True)
59 +
60 + transferencias: Mapped[bool] = mapped_column(Boolean)
61 + dias: Mapped[int] = mapped_column(Integer)
62 + entidad: Mapped[int] = mapped_column(Integer)
63 +
64 + vigente: Mapped[float] = mapped_column(Numeric(30, 15))
65 + devengado: Mapped[float] = mapped_column(Numeric(30, 15))
66 + ejecucion: Mapped[float] = mapped_column(Numeric)
67 +
68 + entidad_desc_area: Mapped[str] = mapped_column(Text)
69 + entidad_desc_entidad: Mapped[str] = mapped_column(Text)
70 +
71 +
72 +class Timeline(Base):
73 + __tablename__ = "diario_timeline"
74 + __table_args__ = (
75 + Index("idx_diario_timeline_entidad", "entidad"),
76 + {"schema": "web"},
77 + )
78 +
79 + id: Mapped[int] = mapped_column(Integer, primary_key=True)
80 +
81 + entidad: Mapped[int] = mapped_column(Integer)
82 + devengado: Mapped[float] = mapped_column(Numeric(30, 15))
83 +
84 + entidad_desc_area: Mapped[str] = mapped_column(Text)
85 + entidad_desc_entidad: Mapped[str] = mapped_column(Text)
86 + desc_programa: Mapped[str] = mapped_column(Text)
87 + desc_actividad_proyecto: Mapped[str] = mapped_column(Text)
88 +
89 +
90 +class TimeSeries(Base):
91 + __tablename__ = "diario_timeseries"
92 +
93 + id: Mapped[int] = mapped_column(Integer, primary_key=True)
94 +
95 + fecha: Mapped[str] = mapped_column(String(10))
96 + devengado: Mapped[float] = mapped_column(Numeric(30, 15))
97 + diferencia: Mapped[float] = mapped_column(Numeric(30, 15))
98 + dias: Mapped[int] = mapped_column(Integer)
...@@ -9,6 +9,7 @@ from sqlalchemy import ( ...@@ -9,6 +9,7 @@ from sqlalchemy import (
9 Index, 9 Index,
10 MetaData, 10 MetaData,
11 ) 11 )
12 +from sqlalchemy import and_, or_
12 13
13 14
14 class TreemapObjeto(Base): 15 class TreemapObjeto(Base):
...@@ -23,14 +24,17 @@ class TreemapObjeto(Base): ...@@ -23,14 +24,17 @@ class TreemapObjeto(Base):
23 id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) 24 id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
24 25
25 gestion: Mapped[int] = mapped_column(Integer) 26 gestion: Mapped[int] = mapped_column(Integer)
27 + entidad_area: Mapped[str | None] = mapped_column(String(9))
26 entidad: Mapped[int] = mapped_column(Integer) 28 entidad: Mapped[int] = mapped_column(Integer)
27 objeto: Mapped[int] = mapped_column(Integer) 29 objeto: Mapped[int] = mapped_column(Integer)
28 nivel: Mapped[str | None] = mapped_column(String(20)) 30 nivel: Mapped[str | None] = mapped_column(String(20))
29 31
30 - desc_objeto: Mapped[str | None] = mapped_column(Text)
31 parent: Mapped[int | None] = mapped_column(Integer) 32 parent: Mapped[int | None] = mapped_column(Integer)
32 devengado: Mapped[float | None] = mapped_column(Numeric(30, 15)) 33 devengado: Mapped[float | None] = mapped_column(Numeric(30, 15))
33 34
35 + desc_entidad: Mapped[str | None] = mapped_column(Text)
36 + desc_objeto: Mapped[str | None] = mapped_column(Text)
37 +
34 38
35 class TreemapFinFun(Base): 39 class TreemapFinFun(Base):
36 __tablename__ = "treemap_finfun" 40 __tablename__ = "treemap_finfun"
...@@ -44,14 +48,17 @@ class TreemapFinFun(Base): ...@@ -44,14 +48,17 @@ class TreemapFinFun(Base):
44 id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) 48 id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
45 49
46 gestion: Mapped[int] = mapped_column(Integer) 50 gestion: Mapped[int] = mapped_column(Integer)
51 + entidad_area: Mapped[str | None] = mapped_column(String(9))
47 entidad: Mapped[int] = mapped_column(Integer) 52 entidad: Mapped[int] = mapped_column(Integer)
48 finfun: Mapped[str] = mapped_column(String(9)) 53 finfun: Mapped[str] = mapped_column(String(9))
49 nivel: Mapped[str | None] = mapped_column(String(20)) 54 nivel: Mapped[str | None] = mapped_column(String(20))
50 55
51 - desc_finfun: Mapped[str | None] = mapped_column(Text)
52 parent: Mapped[str | None] = mapped_column(String(9)) 56 parent: Mapped[str | None] = mapped_column(String(9))
53 devengado: Mapped[float | None] = mapped_column(Numeric(30, 15)) 57 devengado: Mapped[float | None] = mapped_column(Numeric(30, 15))
54 58
59 + desc_entidad: Mapped[str | None] = mapped_column(Text)
60 + desc_finfun: Mapped[str | None] = mapped_column(Text)
61 +
55 62
56 class TreemapActeco(Base): 63 class TreemapActeco(Base):
57 __tablename__ = "treemap_acteco" 64 __tablename__ = "treemap_acteco"
...@@ -65,14 +72,17 @@ class TreemapActeco(Base): ...@@ -65,14 +72,17 @@ class TreemapActeco(Base):
65 id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) 72 id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
66 73
67 gestion: Mapped[int] = mapped_column(Integer) 74 gestion: Mapped[int] = mapped_column(Integer)
75 + entidad_area: Mapped[str | None] = mapped_column(String(9))
68 entidad: Mapped[int] = mapped_column(Integer) 76 entidad: Mapped[int] = mapped_column(Integer)
69 acteco: Mapped[str] = mapped_column(String(9)) 77 acteco: Mapped[str] = mapped_column(String(9))
70 nivel: Mapped[str | None] = mapped_column(String(20)) 78 nivel: Mapped[str | None] = mapped_column(String(20))
71 79
72 - desc_acteco: Mapped[str | None] = mapped_column(Text)
73 parent: Mapped[str | None] = mapped_column(String(9)) 80 parent: Mapped[str | None] = mapped_column(String(9))
74 devengado: Mapped[float | None] = mapped_column(Numeric(30, 15)) 81 devengado: Mapped[float | None] = mapped_column(Numeric(30, 15))
75 82
83 + desc_entidad: Mapped[str | None] = mapped_column(Text)
84 + desc_acteco: Mapped[str | None] = mapped_column(Text)
85 +
76 86
77 ############################################################################### 87 ###############################################################################
78 # fns 88 # fns
...@@ -90,7 +100,10 @@ def get_clas_entities(query_filters, db, query, ClassObject, object_id): ...@@ -90,7 +100,10 @@ def get_clas_entities(query_filters, db, query, ClassObject, object_id):
90 if query.gestion is None: 100 if query.gestion is None:
91 query.gestion = 0 101 query.gestion = 0
92 102
93 - query_filters.append(ClassObject.gestion == query.gestion) 103 + query_filters.extend([
104 + ClassObject.devengado > 0,
105 + ClassObject.gestion == query.gestion,
106 + ])
94 107
95 if query.id is not None: 108 if query.id is not None:
96 ids = query.id.split(',') 109 ids = query.id.split(',')
......
...@@ -26,6 +26,11 @@ router_finfun = APIRouter( ...@@ -26,6 +26,11 @@ router_finfun = APIRouter(
26 tags=['finfun'], 26 tags=['finfun'],
27 ) 27 )
28 28
29 +router_ubigeo = APIRouter(
30 + prefix='/ubigeo',
31 + tags=['ubigeo'],
32 +)
33 +
29 34
30 ############################################################################### 35 ###############################################################################
31 # GET 36 # GET
...@@ -46,21 +51,50 @@ def fetch_object_classifier(db: Session = Depends(model.get_db)): ...@@ -46,21 +51,50 @@ def fetch_object_classifier(db: Session = Depends(model.get_db)):
46 return _fetch_classifier('finfun', db) 51 return _fetch_classifier('finfun', db)
47 52
48 53
49 -@router_objeto.get('/{object_id}', response_model=schemas.classifier.ClasObjetos) 54 +@router_ubigeo.get('/clasificador', response_model=List[schemas.classifier.ClasGeografico])
50 -def fetch_clas( 55 +def fetch_object_classifier(db: Session = Depends(model.get_db)):
56 + return _fetch_classifier('ubigeo', db)
57 +
58 +
59 +@router_objeto.get('/{object_id}', response_model=schemas.objeto.ClasObjetosEstados)
60 +def fetch_objeto_estado(
51 object_id: str, 61 object_id: str,
52 db: Session = Depends(model.get_db), 62 db: Session = Depends(model.get_db),
53 ): 63 ):
64 + ClasEstado = models.objeto.ObjetoEstado
65 + estados = db.query(ClasEstado).filter(
66 + ClasEstado.objeto == object_id,
67 + ).all()
68 +
54 ClasObjetos = models.classifier.ClasObjetos 69 ClasObjetos = models.classifier.ClasObjetos
55 - return db.query(ClasObjetos).filter( 70 + objeto = db.query(ClasObjetos).filter(
56 - ClasObjetos.objeto == '{}.0'.format(object_id) 71 + ClasObjetos.objeto == object_id
57 ).one() 72 ).one()
58 73
74 + setattr(objeto, 'estados', estados)
75 + return objeto
76 +
77 +
78 +@router_objeto.get('/{object_id}/entidades', response_model=List[schemas.objeto.ObjetoEntidad])
79 +def fetch_objeto_entidad(
80 + object_id: str,
81 + db: Session = Depends(model.get_db),
82 + query: schema.QueryParams = Depends(),
83 +):
84 + gestion = query.gestion or 0
85 + ClasObjetos = models.objeto.ObjetoEntidad
86 +
87 + return db.query(ClasObjetos).filter(
88 + ClasObjetos.objeto == object_id,
89 + ClasObjetos.gestion == gestion
90 + ).all()
91 +
59 92
60 -@router_objeto.get('/{object_id}/entidades', response_model=List[schemas.treemap.TreemapObjeto]) 93 +@router_objeto.get('/{object_id}/entidades/map', response_model=List[schemas.treemap.TreemapObjeto])
61 -def fetch_clas( 94 +def fetch_objeto_treemap(
62 object_id: str, 95 object_id: str,
63 db: Session = Depends(model.get_db), 96 db: Session = Depends(model.get_db),
97 + query: schema.QueryParams = Depends(),
64 ): 98 ):
65 Treemap = models.treemap.TreemapObjeto 99 Treemap = models.treemap.TreemapObjeto
66 return models.treemap.get_clas_entities( 100 return models.treemap.get_clas_entities(
...@@ -69,21 +103,60 @@ def fetch_clas( ...@@ -69,21 +103,60 @@ def fetch_clas(
69 ], db, query, Treemap, 'entidad' 103 ], db, query, Treemap, 'entidad'
70 ) 104 )
71 105
72 -@router_acteco.get('/{acteco_id}', response_model=schemas.classifier.ClasActeco) 106 +@router_objeto.get('/{object_id}/entidades/{entidad_id}', response_model=List[schemas.objeto.ObjetoEntidad])
73 -def fetch_clas( 107 +def fetch_objeto_entidad_single(
108 + object_id: str,
109 + entidad_id: int,
110 + db: Session = Depends(model.get_db),
111 + query: schema.QueryParams = Depends(),
112 +):
113 + ClasObjetos = models.objeto.ObjetoEntidad
114 +
115 + return db.query(ClasObjetos).filter(
116 + ClasObjetos.objeto == object_id,
117 + ClasObjetos.entidad == entidad_id
118 + ).all()
119 +
120 +
121 +@router_acteco.get('/{acteco_id}', response_model=schemas.acteco.ClasActecoEstados)
122 +def fetch_objeto_estado(
74 acteco_id: str, 123 acteco_id: str,
75 db: Session = Depends(model.get_db), 124 db: Session = Depends(model.get_db),
76 ): 125 ):
126 + ClasEstado = models.objeto.ActecoEstado
127 + estados = db.query(ClasEstado).filter(
128 + ClasEstado.acteco == acteco_id,
129 + ).all()
130 +
77 ClasActeco = models.classifier.ClasActeco 131 ClasActeco = models.classifier.ClasActeco
78 - return db.query(ClasActeco).filter( 132 + acteco = db.query(ClasActeco).filter(
79 ClasActeco.acteco == acteco_id 133 ClasActeco.acteco == acteco_id
80 ).one() 134 ).one()
81 135
136 + setattr(acteco, 'estados', estados)
137 + return acteco
138 +
139 +
140 +@router_acteco.get('/{acteco_id}/entidades', response_model=List[schemas.acteco.ActecoEntidad])
141 +def fetch_acteco_entidad(
142 + acteco_id: str,
143 + db: Session = Depends(model.get_db),
144 + query: schema.QueryParams = Depends(),
145 +):
146 + gestion = query.gestion or 0
147 + ClasObjetos = models.acteco.ActecoEntidad
148 +
149 + return db.query(ClasObjetos).filter(
150 + ClasObjetos.acteco == acteco_id,
151 + ClasObjetos.gestion == gestion
152 + ).all()
82 153
83 -@router_acteco.get('/{acteco_id}/entidades', response_model=List[schemas.treemap.TreemapActeco]) 154 +
84 -def fetch_clas( 155 +@router_acteco.get('/{acteco_id}/entidades/map', response_model=List[schemas.treemap.TreemapActeco])
156 +def fetch_acteco_treemap(
85 acteco_id: str, 157 acteco_id: str,
86 db: Session = Depends(model.get_db), 158 db: Session = Depends(model.get_db),
159 + query: schema.QueryParams = Depends(),
87 ): 160 ):
88 Treemap = models.treemap.TreemapActeco 161 Treemap = models.treemap.TreemapActeco
89 return models.treemap.get_clas_entities( 162 return models.treemap.get_clas_entities(
...@@ -93,21 +166,60 @@ def fetch_clas( ...@@ -93,21 +166,60 @@ def fetch_clas(
93 ) 166 )
94 167
95 168
96 -@router_finfun.get('/{finfun_id}', response_model=schemas.classifier.ClasFinfun) 169 +@router_acteco.get('/{acteco_id}/entidades/{entidad_id}', response_model=List[schemas.acteco.ActecoEntidad])
97 -def fetch_clas( 170 +def fetch_acteco_entidad_single(
171 + acteco_id: str,
172 + entidad_id: int,
173 + db: Session = Depends(model.get_db),
174 + query: schema.QueryParams = Depends(),
175 +):
176 + ClasObjetos = models.acteco.ActecoEntidad
177 +
178 + return db.query(ClasObjetos).filter(
179 + ClasObjetos.acteco == acteco_id,
180 + ClasObjetos.entidad == entidad_id
181 + ).all()
182 +
183 +
184 +@router_finfun.get('/{finfun_id}', response_model=schemas.finfun.ClasFinfunEstados)
185 +def fetch_finfun_estado(
98 finfun_id: str, 186 finfun_id: str,
99 db: Session = Depends(model.get_db), 187 db: Session = Depends(model.get_db),
100 ): 188 ):
189 + ClasEstado = models.finfun.FinfunEstado
190 + estados = db.query(ClasEstado).filter(
191 + ClasEstado.finfun == finfun_id
192 + ).all()
193 +
101 ClasFinfun = models.classifier.ClasFinfun 194 ClasFinfun = models.classifier.ClasFinfun
102 - return db.query(ClasFinfun).filter( 195 + finfun = db.query(ClasFinfun).filter(
103 ClasFinfun.finfun == finfun_id 196 ClasFinfun.finfun == finfun_id
104 ).one() 197 ).one()
105 198
199 + setattr(finfun, 'estados', estados)
200 + return finfun
106 201
107 -@router_finfun.get('/{finfun_id}/entidades', response_model=List[schemas.treemap.TreemapFinFun]) 202 +
108 -def fetch_clas( 203 +@router_finfun.get('/{finfun_id}/entidades', response_model=List[schemas.finfun.FinfunEntidad])
204 +def fetch_finfun_entidad(
109 finfun_id: str, 205 finfun_id: str,
110 db: Session = Depends(model.get_db), 206 db: Session = Depends(model.get_db),
207 + query: schema.QueryParams = Depends(),
208 +):
209 + gestion = query.gestion or 0
210 + ClasObjetos = models.finfun.FinfunEntidad
211 +
212 + return db.query(ClasObjetos).filter(
213 + ClasObjetos.finfun == finfun_id,
214 + ClasObjetos.gestion == gestion
215 + ).all()
216 +
217 +
218 +@router_finfun.get('/{finfun_id}/entidades/map', response_model=List[schemas.treemap.TreemapFinFun])
219 +def fetch_finfun_treemap(
220 + finfun_id: str,
221 + db: Session = Depends(model.get_db),
222 + query: schema.QueryParams = Depends(),
111 ): 223 ):
112 Treemap = models.treemap.TreemapFinFun 224 Treemap = models.treemap.TreemapFinFun
113 return models.treemap.get_clas_entities( 225 return models.treemap.get_clas_entities(
...@@ -116,6 +228,19 @@ def fetch_clas( ...@@ -116,6 +228,19 @@ def fetch_clas(
116 ], db, query, Treemap, 'entidad' 228 ], db, query, Treemap, 'entidad'
117 ) 229 )
118 230
231 +@router_finfun.get('/{finfun_id}/entidades/{entidad_id}', response_model=List[schemas.finfun.FinfunEntidad])
232 +def fetch_finfun_entidad_single(
233 + finfun_id: str,
234 + entidad_id: int,
235 + db: Session = Depends(model.get_db),
236 + query: schema.QueryParams = Depends(),
237 +):
238 + ClasObjetos = models.finfun.FinfunEntidad
239 +
240 + return db.query(ClasObjetos).filter(
241 + ClasObjetos.finfun == finfun_id,
242 + ClasObjetos.entidad == entidad_id
243 + ).all()
119 244
120 ############################################################################### 245 ###############################################################################
121 # priv 246 # priv
...@@ -126,5 +251,6 @@ def _fetch_classifier(clas, db): ...@@ -126,5 +251,6 @@ def _fetch_classifier(clas, db):
126 'objeto': models.classifier.ClasObjetos, 251 'objeto': models.classifier.ClasObjetos,
127 'acteco': models.classifier.ClasActeco, 252 'acteco': models.classifier.ClasActeco,
128 'finfun': models.classifier.ClasFinfun, 253 'finfun': models.classifier.ClasFinfun,
254 + 'ubigeo': models.classifier.ClasGeografico,
129 }[clas] 255 }[clas]
130 return db.query(ClassObject).all() 256 return db.query(ClassObject).all()
......
1 +from typing import List
2 +
3 +from fastapi import APIRouter, Depends
4 +from sqlalchemy.orm import Session, aliased
5 +from sqlalchemy import func
6 +
7 +from presupuestov1 import model, schema, schemas, models
8 +
9 +
10 +router = APIRouter(
11 + prefix='/diario',
12 + tags=['diario'],
13 +)
14 +
15 +
16 +###############################################################################
17 +# GET
18 +###############################################################################
19 +
20 +@router.get('/status', response_model=schemas.daily.UpdateStatus)
21 +def fetch_status(
22 + db: Session = Depends(model.get_db),
23 +):
24 + Daily = models.daily.UpdateStatus
25 + return db.query(Daily).order_by(
26 + Daily.fecha_actualizacion.desc()
27 + ).first()
28 +
29 +
30 +@router.get('/clasificadores', response_model=List[schemas.daily.EjecucionClasificadores])
31 +def fetch_clasificadores(
32 + db: Session = Depends(model.get_db),
33 + query: schema.DailyParams = Depends(),
34 +):
35 + Daily = models.daily.EjecucionClasificadores
36 +
37 + filters = []
38 + if query.transferencias is not None:
39 + filters.append(Daily.transferencias == query.transferencias)
40 + if query.dias is not None:
41 + filters.append(Daily.dias == query.dias)
42 +
43 + return db.query(Daily).filter(*filters).all()
44 +
45 +
46 +@router.get('/entidades', response_model=List[schemas.daily.EjecucionEntidades])
47 +def fetch_entidades(
48 + db: Session = Depends(model.get_db),
49 + query: schema.DailyParams = Depends(),
50 +):
51 + Daily = models.daily.EjecucionEntidades
52 + transferencias = query.transferencias or False # :O
53 + page = query.page or 1
54 + page_size = 10
55 +
56 + filters = []
57 + if not transferencias:
58 + filters.append(Daily.transferencias == query.transferencias)
59 + if query.dias is not None:
60 + filters.append(Daily.dias == query.dias)
61 + if query.entidad is not None:
62 + filters.append(Daily.entidad == query.entidad)
63 +
64 + return db.query(Daily).filter(*filters).offset(
65 + (page - 1) * page_size
66 + ).limit(page_size).all()
67 +
68 +
69 +@router.get('/timeline', response_model=List[schemas.daily.Timeline])
70 +def fetch_timeline(
71 + db: Session = Depends(model.get_db),
72 + query: schema.DailyParams = Depends(),
73 +):
74 + Daily = models.daily.Timeline
75 + page = query.page or 1
76 + page_size = 10
77 +
78 + if query.entidad is not None:
79 + return db.query(Daily).filter(
80 + Daily.entidad == query.entidad
81 + ).order_by(
82 + Daily.devengado.desc()
83 + ).offset(
84 + (page - 1) * page_size
85 + ).limit(page_size).all()
86 +
87 + # top 10 entidades
88 + top_entities = db.query(
89 + Daily.entidad
90 + ).group_by(
91 + Daily.entidad
92 + ).order_by(
93 + func.sum(Daily.devengado).desc()
94 + ).limit(10).subquery()
95 +
96 + # ordena las filas por devengado desc por cada una de las top 10 entidades
97 + ranked = db.query(
98 + Daily,
99 + func.row_number().over(
100 + partition_by=Daily.entidad,
101 + order_by=Daily.devengado.desc()
102 + ).label('row_num')
103 + ).filter(
104 + Daily.entidad.in_(top_entities)
105 + ).subquery()
106 +
107 + # top 10 filas por cada una de las top 10 entidades
108 + RankedTimeline = aliased(Daily, ranked)
109 + return db.query(RankedTimeline).filter(
110 + ranked.c.row_num <= page_size
111 + ).order_by(
112 + RankedTimeline.entidad,
113 + RankedTimeline.devengado.desc()
114 + ).all()
115 +
116 +
117 +@router.get('/timeseries', response_model=List[schemas.daily.TimeSeries])
118 +def fetch_timeseries(
119 + db: Session = Depends(model.get_db),
120 +):
121 + return db.query(models.daily.TimeSeries).all()
...@@ -8,8 +8,6 @@ from sqlalchemy import and_, or_ ...@@ -8,8 +8,6 @@ from sqlalchemy import and_, or_
8 8
9 from presupuestov1 import model, schema, constant, schemas, models, search 9 from presupuestov1 import model, schema, constant, schemas, models, search
10 10
11 -from aiocache import cached
12 -
13 11
14 router = APIRouter( 12 router = APIRouter(
15 prefix='/entidad', 13 prefix='/entidad',
...@@ -21,16 +19,26 @@ router = APIRouter( ...@@ -21,16 +19,26 @@ router = APIRouter(
21 # GET 19 # GET
22 ############################################################################### 20 ###############################################################################
23 21
24 -@router.get('/{entity_id:int}', response_model=schemas.classifier.ClasInstitucional) 22 +@router.get('/{entity_id:int}', response_model=schemas.entity.ClasInstitucionalIngresosGastos)
25 def fetch_entity( 23 def fetch_entity(
26 entity_id: int, 24 entity_id: int,
27 db: Session = Depends(model.get_db), 25 db: Session = Depends(model.get_db),
28 ): 26 ):
27 + TreemapObjeto = models.treemap.TreemapObjeto
28 + gastos = db.query(TreemapObjeto).filter(
29 + TreemapObjeto.entidad == entity_id,
30 + TreemapObjeto.objeto == 0
31 + ).all()
32 +
29 ClasInstitucional = models.classifier.ClasInstitucional 33 ClasInstitucional = models.classifier.ClasInstitucional
30 - return db.query(ClasInstitucional).filter( 34 + entidad = db.query(ClasInstitucional).filter(
31 ClasInstitucional.entidad == entity_id 35 ClasInstitucional.entidad == entity_id
32 ).one() 36 ).one()
33 37
38 + setattr(entidad, 'gastos', gastos)
39 +
40 + return entidad
41 +
34 42
35 @router.get('/clasificador', response_model=List[schemas.classifier.ClasInstitucional]) 43 @router.get('/clasificador', response_model=List[schemas.classifier.ClasInstitucional])
36 def fetch_classifier( 44 def fetch_classifier(
...@@ -51,7 +59,7 @@ def fetch_entity_objetos( ...@@ -51,7 +59,7 @@ def fetch_entity_objetos(
51 ) 59 )
52 60
53 61
54 -router.get('/{entity_id:int}/finfuns', response_model=List[schemas.treemap.TreemapFinFun]) 62 +@router.get('/{entity_id:int}/finfuns', response_model=List[schemas.treemap.TreemapFinFun])
55 def fetch_entity_finfuns( 63 def fetch_entity_finfuns(
56 entity_id: int, 64 entity_id: int,
57 db: Session = Depends(model.get_db), 65 db: Session = Depends(model.get_db),
...@@ -73,4 +81,3 @@ def fetch_entity_actecos( ...@@ -73,4 +81,3 @@ def fetch_entity_actecos(
73 return models.treemap.get_entity_connections( 81 return models.treemap.get_entity_connections(
74 entity_id, db, query, TreemapActeco, 'acteco' 82 entity_id, db, query, TreemapActeco, 'acteco'
75 ) 83 )
76 -
......
...@@ -4,18 +4,23 @@ from typing import Optional ...@@ -4,18 +4,23 @@ from typing import Optional
4 from pydantic import BaseModel, ConfigDict, Field, root_validator 4 from pydantic import BaseModel, ConfigDict, Field, root_validator
5 from fastapi import Query 5 from fastapi import Query
6 6
7 -
8 class OrmBaseModel(BaseModel): 7 class OrmBaseModel(BaseModel):
9 model_config = ConfigDict(from_attributes=True) 8 model_config = ConfigDict(from_attributes=True)
10 9
11 10
12 class SearchQueryParams(BaseModel): 11 class SearchQueryParams(BaseModel):
13 - page: Optional[int] = Query(default=1) 12 + page: Optional[int] = Query(default=1, le=100)
14 - q: Optional[str] = Query(default=None, max_length=128) 13 + q: Optional[str] = Query(default=None, min_length=3, max_length=128)
15 order: Optional[str] = Query(default=None, max_length=5) 14 order: Optional[str] = Query(default=None, max_length=5)
16 is_class: Optional[bool] = Query(default=None) 15 is_class: Optional[bool] = Query(default=None)
17 class_: Optional[str] = Query(default=None) 16 class_: Optional[str] = Query(default=None)
18 17
19 class QueryParams(BaseModel): 18 class QueryParams(BaseModel):
20 id: Optional[str] = Query(default=None) 19 id: Optional[str] = Query(default=None)
21 - gestion: Optional[int] = Query(default=None) 20 + gestion: Optional[int] = Query(default=0)
21 +
22 +class DailyParams(BaseModel):
23 + transferencias: Optional[bool] = Query(default=False)
24 + dias: Optional[int] = Query(default=None)
25 + entidad: Optional[int] = Query(default=None, ge=0, le=10000)
26 + page: Optional[int] = Query(default=1, ge=1, le=100)
......
1 from . import ( 1 from . import (
2 - acteco,
3 classifier, 2 classifier,
3 + acteco,
4 finfun, 4 finfun,
5 objeto, 5 objeto,
6 treemap, 6 treemap,
7 - project 7 + project,
8 + entity,
9 + daily,
8 ) 10 )
......
1 +from typing import List
2 +
1 from presupuestov1.schema import OrmBaseModel 3 from presupuestov1.schema import OrmBaseModel
4 +from presupuestov1 import schemas
2 5
3 6
4 class ActecoEstado(OrmBaseModel): 7 class ActecoEstado(OrmBaseModel):
5 gestion: int 8 gestion: int
6 acteco: str 9 acteco: str
7 total: float | None 10 total: float | None
8 - poblacion: int | None 11 + poblacion: float | None
9 n_entidades: int | None 12 n_entidades: int | None
10 per_capita: float | None 13 per_capita: float | None
11 total_gestion: float | None 14 total_gestion: float | None
...@@ -16,11 +19,11 @@ class ActecoEstado(OrmBaseModel): ...@@ -16,11 +19,11 @@ class ActecoEstado(OrmBaseModel):
16 top1_entidad_desc: str | None 19 top1_entidad_desc: str | None
17 top1_monto: float | None 20 top1_monto: float | None
18 top1_pct: float | None 21 top1_pct: float | None
19 - top2_entidad: int | None 22 + top2_entidad: int | None | float
20 top2_entidad_desc: str | None 23 top2_entidad_desc: str | None
21 top2_monto: float | None 24 top2_monto: float | None
22 top2_pct: float | None 25 top2_pct: float | None
23 - top3_entidad: int | None 26 + top3_entidad: int | None | float
24 top3_entidad_desc: str | None 27 top3_entidad_desc: str | None
25 top3_monto: float | None 28 top3_monto: float | None
26 top3_pct: float | None 29 top3_pct: float | None
...@@ -37,3 +40,7 @@ class ActecoEntidad(OrmBaseModel): ...@@ -37,3 +40,7 @@ class ActecoEntidad(OrmBaseModel):
37 ranking: int | None 40 ranking: int | None
38 prop: float | None 41 prop: float | None
39 n_entidades: int | None 42 n_entidades: int | None
43 +
44 +
45 +class ClasActecoEstados(schemas.classifier.ClasActeco):
46 + estados: List[ActecoEstado]
......
...@@ -35,42 +35,66 @@ def get_clasdesc(name): ...@@ -35,42 +35,66 @@ def get_clasdesc(name):
35 **{'gestion': str, 'desc_{}'.format(name): str}, 35 **{'gestion': str, 'desc_{}'.format(name): str},
36 ) 36 )
37 37
38 - 38 +class ClasBase(OrmBaseModel):
39 -class ClasObjetos(OrmBaseModel):
40 nivel: str | None 39 nivel: str | None
41 - objeto: str
42 - desc_objeto: str | None
43 gestiones: str | None 40 gestiones: str | None
44 n_gestiones: int | None 41 n_gestiones: int | None
45 n_variaciones: int | None 42 n_variaciones: int | None
46 - descripciones: list[get_clasdesc('objeto')] | None
47 43
48 44
49 -class ClasRubros(OrmBaseModel): 45 +class ClasObjetos(ClasBase):
50 - nivel: str | None 46 + objeto: str
51 - rubro: str 47 + desc_objeto: str | None
52 - desc_rubro: str | None 48 + descripciones: list[get_clasdesc('objeto')] | None
53 - gestiones: str | None
54 - n_gestiones: int | None
55 - n_variaciones: int | None
56 - descripciones: list[get_clasdesc('rubro')] | None
57 49
58 50
59 -class ClasFinfun(OrmBaseModel): 51 +class ClasFinfun(ClasBase):
60 - nivel: str | None
61 finfun: str 52 finfun: str
62 desc_finfun: str | None 53 desc_finfun: str | None
63 - gestiones: str | None
64 - n_gestiones: int | None
65 - n_variaciones: int | None
66 descripciones: list[get_clasdesc('finfun')] | None 54 descripciones: list[get_clasdesc('finfun')] | None
67 55
68 56
69 -class ClasActeco(OrmBaseModel): 57 +class ClasActeco(ClasBase):
70 - nivel: str | None
71 acteco: str 58 acteco: str
72 desc_acteco: str | None 59 desc_acteco: str | None
60 + descripciones: list[get_clasdesc('acteco')] | None
61 +
62 +
63 +class ClasGeografico(ClasBase):
64 + ubigeo: str
65 + desc_ubigeo: str | None
66 + municipio_ubigeo: int | None
67 + descripciones: list[get_clasdesc('ubigeo')] | None
68 +
69 +
70 +# Ingresos
71 +
72 +class ClasOrganismos(OrmBaseModel):
73 + organismo: int
74 + desc_organismo: str | None
75 + sigla_organismo: str | None
76 +
77 + organismo_grupo: int | None
78 + desc_organismo_grupo: str | None
79 + sigla_organismo_grupo: str | None
80 +
81 + organismo_subgrupo: int | None
82 + desc_organismo_subgrupo: str | None
83 + sigla_organismo_subgrupo: str | None
84 +
73 gestiones: str | None 85 gestiones: str | None
74 n_gestiones: int | None 86 n_gestiones: int | None
75 - n_variaciones: int | None 87 +
76 - descripciones: list[get_clasdesc('acteco')] | None 88 +
89 +class ClasRubros(ClasBase):
90 + rubro: str
91 + desc_rubro: str | None
92 + descripciones: list[get_clasdesc('rubro')] | None
93 +
94 +
95 +class ClasFuentes(ClasBase):
96 + fuente: str
97 + desc_fuente: str | None
98 + grupo_fuente: str
99 + desc_grupo_fuente: str | None
100 + descripciones: list[get_clasdesc('fuente')] | None
......
1 +from datetime import datetime
2 +
3 +from presupuestov1.schema import OrmBaseModel
4 +
5 +
6 +class UpdateStatus(OrmBaseModel):
7 + fecha_actualizacion: datetime
8 + status: bool
9 +
10 +
11 +class EjecucionClasificadores(OrmBaseModel):
12 + transferencias: bool
13 + dias: int
14 + clasificador: str
15 + devengado: float | None
16 + padre: str | None
17 + hijo: str | None
18 +
19 +
20 +class EjecucionEntidades(OrmBaseModel):
21 + transferencias: bool
22 + dias: int
23 + entidad: int
24 + vigente: float | None
25 + devengado: float | None
26 + ejecucion: float | None
27 + entidad_desc_area: str | None
28 + entidad_desc_entidad: str | None
29 +
30 +
31 +class Timeline(OrmBaseModel):
32 + entidad: int
33 + devengado: float | None
34 + entidad_desc_area: str | None
35 + entidad_desc_entidad: str | None
36 + desc_programa: str | None
37 + desc_actividad_proyecto: str | None
38 +
39 +
40 +class TimeSeries(OrmBaseModel):
41 + fecha: str
42 + devengado: float | None
43 + diferencia: float | None
44 + dias: int
1 +from typing import List
2 +
3 +from presupuestov1.schema import OrmBaseModel
4 +from presupuestov1 import schemas
5 +
6 +
7 +class ClasInstitucionalIngresosGastos(schemas.classifier.ClasInstitucional):
8 + gastos: List[schemas.treemap.TreemapObjeto]
1 +from typing import List
2 +
1 from presupuestov1.schema import OrmBaseModel 3 from presupuestov1.schema import OrmBaseModel
4 +from presupuestov1 import schemas
2 5
3 6
4 class EntidadesPorFinfun(OrmBaseModel): 7 class EntidadesPorFinfun(OrmBaseModel):
...@@ -12,7 +15,7 @@ class FinfunEstado(OrmBaseModel): ...@@ -12,7 +15,7 @@ class FinfunEstado(OrmBaseModel):
12 gestion: int 15 gestion: int
13 finfun: str 16 finfun: str
14 total: float | None 17 total: float | None
15 - poblacion: int | None 18 + poblacion: float | None
16 n_entidades: int | None 19 n_entidades: int | None
17 per_capita: float | None 20 per_capita: float | None
18 total_gestion: float | None 21 total_gestion: float | None
...@@ -23,11 +26,11 @@ class FinfunEstado(OrmBaseModel): ...@@ -23,11 +26,11 @@ class FinfunEstado(OrmBaseModel):
23 top1_entidad_desc: str | None 26 top1_entidad_desc: str | None
24 top1_monto: float | None 27 top1_monto: float | None
25 top1_pct: float | None 28 top1_pct: float | None
26 - top2_entidad: int | None 29 + top2_entidad: int | None | float
27 top2_entidad_desc: str | None 30 top2_entidad_desc: str | None
28 top2_monto: float | None 31 top2_monto: float | None
29 top2_pct: float | None 32 top2_pct: float | None
30 - top3_entidad: int | None 33 + top3_entidad: int | None | float
31 top3_entidad_desc: str | None 34 top3_entidad_desc: str | None
32 top3_monto: float | None 35 top3_monto: float | None
33 top3_pct: float | None 36 top3_pct: float | None
...@@ -44,3 +47,7 @@ class FinfunEntidad(OrmBaseModel): ...@@ -44,3 +47,7 @@ class FinfunEntidad(OrmBaseModel):
44 ranking: int | None 47 ranking: int | None
45 prop: float | None 48 prop: float | None
46 n_entidades: int | None 49 n_entidades: int | None
50 +
51 +
52 +class ClasFinfunEstados(schemas.classifier.ClasFinfun):
53 + estados: List[FinfunEstado]
......
1 +from typing import List
2 +
1 from presupuestov1.schema import OrmBaseModel 3 from presupuestov1.schema import OrmBaseModel
4 +from presupuestov1 import schemas
2 5
3 6
4 class EntidadesPorObjeto(OrmBaseModel): 7 class EntidadesPorObjeto(OrmBaseModel):
...@@ -12,7 +15,7 @@ class ObjetoEstado(OrmBaseModel): ...@@ -12,7 +15,7 @@ class ObjetoEstado(OrmBaseModel):
12 gestion: int 15 gestion: int
13 objeto: str 16 objeto: str
14 total: float | None 17 total: float | None
15 - poblacion: int | None 18 + poblacion: float | None
16 n_entidades: int | None 19 n_entidades: int | None
17 per_capita: float | None 20 per_capita: float | None
18 total_gestion: float | None 21 total_gestion: float | None
...@@ -44,3 +47,7 @@ class ObjetoEntidad(OrmBaseModel): ...@@ -44,3 +47,7 @@ class ObjetoEntidad(OrmBaseModel):
44 ranking: int | None 47 ranking: int | None
45 prop: float | None 48 prop: float | None
46 n_entidades: int | None 49 n_entidades: int | None
50 +
51 +
52 +class ClasObjetosEstados(schemas.classifier.ClasObjetos):
53 + estados: List[ObjetoEstado]
......
...@@ -4,7 +4,6 @@ from presupuestov1.schema import BaseModel ...@@ -4,7 +4,6 @@ from presupuestov1.schema import BaseModel
4 4
5 5
6 class ProjectSearch(BaseModel): 6 class ProjectSearch(BaseModel):
7 - gestion: int
8 devengado: float 7 devengado: float
9 is_class: bool 8 is_class: bool
10 class_: str 9 class_: str
......
...@@ -7,8 +7,8 @@ from pydantic import field_serializer ...@@ -7,8 +7,8 @@ from pydantic import field_serializer
7 class Treemap(OrmBaseModel): 7 class Treemap(OrmBaseModel):
8 gestion: int 8 gestion: int
9 entidad: int 9 entidad: int
10 + entidad_area: str | None
10 nivel: str | None 11 nivel: str | None
11 - parent: int | None
12 devengado: float | None 12 devengado: float | None
13 13
14 @field_serializer('devengado') 14 @field_serializer('devengado')
...@@ -18,15 +18,21 @@ class Treemap(OrmBaseModel): ...@@ -18,15 +18,21 @@ class Treemap(OrmBaseModel):
18 18
19 19
20 class TreemapObjeto(Treemap): 20 class TreemapObjeto(Treemap):
21 - objeto: str 21 + objeto: int
22 + parent: int | None
22 desc_objeto: str | None 23 desc_objeto: str | None
24 + desc_entidad: str | None
23 25
24 26
25 class TreemapFinFun(Treemap): 27 class TreemapFinFun(Treemap):
26 finfun: str 28 finfun: str
29 + parent: str | None
27 desc_finfun: str | None 30 desc_finfun: str | None
31 + desc_entidad: str | None
28 32
29 33
30 class TreemapActeco(Treemap): 34 class TreemapActeco(Treemap):
31 acteco: str 35 acteco: str
32 - desc_actividad: str | None 36 + parent: str | None
37 + desc_acteco: str | None
38 + desc_entidad: str | None
......
...@@ -15,7 +15,6 @@ COLLECTION = 'presup_actpro_fts' ...@@ -15,7 +15,6 @@ COLLECTION = 'presup_actpro_fts'
15 schema = { 15 schema = {
16 'name': COLLECTION, 16 'name': COLLECTION,
17 'fields': [ 17 'fields': [
18 - {'name': 'gestion', 'type': 'int32', 'facet': True},
19 {'name': 'devengado', 'type': 'float'}, 18 {'name': 'devengado', 'type': 'float'},
20 {'name': 'is_class', 'type': 'bool'}, 19 {'name': 'is_class', 'type': 'bool'},
21 {'name': 'class_', 'type': 'string'}, 20 {'name': 'class_', 'type': 'string'},
...@@ -58,7 +57,6 @@ def do_search(query, page, is_class, class_=None, order=None): ...@@ -58,7 +57,6 @@ def do_search(query, page, is_class, class_=None, order=None):
58 if (page is not None) and (page > 0) and (page < 100): 57 if (page is not None) and (page > 0) and (page < 100):
59 search_parameters_['page'] = page 58 search_parameters_['page'] = page
60 59
61 - search_parameters_['sort_by'] = 'devengado:desc'
62 if order == 'asc': 60 if order == 'asc':
63 search_parameters_['sort_by'] = 'devengado:asc' 61 search_parameters_['sort_by'] = 'devengado:asc'
64 62
......