"""Пакетное чтение goodwill и привязанных подтверждённых ББ.""" from collections.abc import Collection from uuid import UUID from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from src.models.accounting import ChartOfAccount from src.models.consolidation import ConsolidationDocument from src.models.enums import DocumentStatus, StatementType from src.models.files import Document from src.models.kfo import Goodwill from src.models.statements import ( FinancialStatementColumn as Column, ) from src.models.statements import ( FinancialStatementLine as Line, ) from src.models.statements import ( FinancialStatementMeta as Meta, ) from src.models.statements import ( FinancialStatementValue as Value, ) async def saved(session: AsyncSession, version_id: UUID, *, included_only: bool = False) -> list[Goodwill]: stmt = select(Goodwill).where(Goodwill.consolidation_version_id == version_id) if included_only: stmt = stmt.where(Goodwill.include_in_kfo.is_(True)) return list((await session.scalars(stmt)).all()) async def accounts(session: AsyncSession) -> list[ChartOfAccount]: """Только 58.01 и потомки по parent_id; полный справочник в память не загружается.""" tree = select(ChartOfAccount.id).where(ChartOfAccount.code == "58.01").cte("goodwill_accounts", recursive=True) tree = tree.union(select(ChartOfAccount.id).join(tree, ChartOfAccount.parent_id == tree.c.id)) return list((await session.scalars(select(ChartOfAccount).join(tree, ChartOfAccount.id == tree.c.id))).all()) async def forms(session: AsyncSession, version_id: UUID, company_ids: Collection[UUID] | None = None): stmt = ( select(Document, Meta) .join(Meta, Meta.document_id == Document.id) .join(ConsolidationDocument, ConsolidationDocument.document_id == Document.id) .where( ConsolidationDocument.consolidation_version_id == version_id, Document.status == DocumentStatus.CONFIRMED, Meta.statement_type == StatementType.balance, ) ) if company_ids is not None: stmt = stmt.where(Document.legal_entity_id.in_(company_ids)) return list((await session.execute(stmt)).all()) async def form_data(session: AsyncSession, ids: list[UUID]): columns = list((await session.scalars(select(Column).where(Column.meta_id.in_(ids)))).all()) values = list( ( await session.execute( select(Line, Value.column_id, Value.amount) .outerjoin(Value, Value.line_id == Line.id) .where(Line.meta_id.in_(ids), Line.line_code.in_(["1310", "1350"])) ) ).all() ) return columns, values