70 lines
2.7 KiB
Python

"""Пакетное чтение 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