70 lines
2.7 KiB
Python
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
|