treemap.py 3.73 KB
from sqlalchemy.orm import Mapped, mapped_column
from presupuestov1.model import Base

from sqlalchemy import (
    Integer,
    String,
    Text,
    Numeric,
    Index,
    MetaData,
)
from sqlalchemy import and_, or_


class TreemapObjeto(Base):
    __tablename__ = "treemap_objeto"
    __table_args__ = (
        Index("idx_treemap_objeto_gestion_entidad", "gestion", "entidad"),
        Index("idx_treemap_objeto_nivel", "nivel"),
        {"schema": "web"},
    )

    # PK compuesta inferida para uso ORM
    id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)

    gestion: Mapped[int] = mapped_column(Integer)
    entidad_area: Mapped[str | None] = mapped_column(String(9))
    entidad: Mapped[int] = mapped_column(Integer)
    objeto: Mapped[int] = mapped_column(Integer)
    nivel: Mapped[str | None] = mapped_column(String(20))

    parent: Mapped[int | None] = mapped_column(Integer)
    devengado: Mapped[float | None] = mapped_column(Numeric(30, 15))

    desc_entidad: Mapped[str | None] = mapped_column(Text)
    desc_objeto: Mapped[str | None] = mapped_column(Text)


class TreemapFinFun(Base):
    __tablename__ = "treemap_finfun"
    __table_args__ = (
        Index("idx_treemap_finfun_gestion_entidad", "gestion", "entidad"),
        Index("idx_treemap_finfun_nivel", "nivel"),
        {"schema": "web"},
    )

    # PK compuesta inferida para uso ORM
    id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)

    gestion: Mapped[int] = mapped_column(Integer)
    entidad_area: Mapped[str | None] = mapped_column(String(9))
    entidad: Mapped[int] = mapped_column(Integer)
    finfun: Mapped[str] = mapped_column(String(9))
    nivel: Mapped[str | None] = mapped_column(String(20))

    parent: Mapped[str | None] = mapped_column(String(9))
    devengado: Mapped[float | None] = mapped_column(Numeric(30, 15))

    desc_entidad: Mapped[str | None] = mapped_column(Text)
    desc_finfun: Mapped[str | None] = mapped_column(Text)


class TreemapActeco(Base):
    __tablename__ = "treemap_acteco"
    __table_args__ = (
        Index("idx_treemap_acteco_gestion_entidad", "gestion", "entidad"),
        Index("idx_treemap_acteco_nivel", "nivel"),
        {"schema": "web"},
    )

    # PK compuesta inferida para uso ORM
    id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)

    gestion: Mapped[int] = mapped_column(Integer)
    entidad_area: Mapped[str | None] = mapped_column(String(9))
    entidad: Mapped[int] = mapped_column(Integer)
    acteco: Mapped[str] = mapped_column(String(9))
    nivel: Mapped[str | None] = mapped_column(String(20))

    parent: Mapped[str | None] = mapped_column(String(9))
    devengado: Mapped[float | None] = mapped_column(Numeric(30, 15))

    desc_entidad: Mapped[str | None] = mapped_column(Text)
    desc_acteco: Mapped[str | None] = mapped_column(Text)


###############################################################################
# fns
###############################################################################

def get_entity_connections(entity_id, db, query, ClassObject, object_id):
    query_filters = [
        ClassObject.entidad == entity_id,
    ]

    return get_clas_entities(query_filters, db, query, ClassObject, object_id)


def get_clas_entities(query_filters, db, query, ClassObject, object_id):
    if query.gestion is None:
        query.gestion = 0

    query_filters.extend([
        ClassObject.devengado > 0,
        ClassObject.gestion == query.gestion,
    ])

    if query.id is not None:
        ids = query.id.split(',')
        ids = [int(_.strip()) for _ in ids]

        ids = or_([getattr(ClassObject, object_id) == _ for _ in ids])
        query_filters.append(ids)

    return db.query(ClassObject).filter(and_(*query_filters)).all()