Showing
20 changed files
with
619 additions
and
105 deletions
| ... | @@ -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 | ... | ... |
| ... | @@ -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) | ... | ... |
models/daily.py
0 → 100644
| 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() | ... | ... |
routers/daily.py
0 → 100644
| 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 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] | ... | ... |
| ... | @@ -24,7 +24,7 @@ class ClasInstitucional(OrmBaseModel): | ... | @@ -24,7 +24,7 @@ class ClasInstitucional(OrmBaseModel): |
| 24 | subarea: str | None | 24 | subarea: str | None |
| 25 | desc_subarea: str | None | 25 | desc_subarea: str | None |
| 26 | sigla_subarea: str | None | 26 | sigla_subarea: str | None |
| 27 | - | 27 | + |
| 28 | gestiones: str | None | 28 | gestiones: str | None |
| 29 | n_gestiones: int | None | 29 | n_gestiones: int | None |
| 30 | 30 | ||
| ... | @@ -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 | ... | ... |
schemas/daily.py
0 → 100644
| 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 |
schemas/entity.py
0 → 100644
| 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 | ... | ... |
-
Please register or login to post a comment