docs(matrix): указать разделы ТЗ в новых функциях

This commit is contained in:
PotapovaA 2026-10-21 19:10:45 +03:00
parent 2f08ce4155
commit fabc9b48b2
5 changed files with 14 additions and 10 deletions

View File

@ -29,5 +29,5 @@ async def list_rules(
version_id: uuid.UUID, version_id: uuid.UUID,
service: EliminationRuleServiceDep, service: EliminationRuleServiceDep,
) -> EliminationRulesOut: ) -> EliminationRulesOut:
"""Правила зафиксированной версии либо актуальные сегодня, с основанием выбора.""" """Правила §4 зафиксированной либо последней открытой версии с основанием выбора."""
return await service.list_rules(version_id) return await service.list_rules(version_id)

View File

@ -173,7 +173,7 @@ async def build_intercompany_matrix_preset(
rule_id: uuid.UUID, rule_id: uuid.UUID,
service: IntercompanyMatrixServiceDep, service: IntercompanyMatrixServiceDep,
) -> IntercompanyMatrixOut: ) -> IntercompanyMatrixOut:
"""Cчета пресета с подходящим видом дебета или кредита.""" """Шахматка §6 по счетам сторон правила §4."""
return await service.build_accounts(version_id, mode="PRESET", rule_id=rule_id) return await service.build_accounts(version_id, mode="PRESET", rule_id=rule_id)
@ -189,7 +189,7 @@ async def get_unpaired_osv(
rule_id: uuid.UUID, rule_id: uuid.UUID,
service: IntercompanyMatrixServiceDep, service: IntercompanyMatrixServiceDep,
) -> UnpairedOsvOut: ) -> UnpairedOsvOut:
"""Все строки односторонних ячеек шахматки и их число.""" """Строки свода односторонних ячеек шахматки §6 и их число."""
return await service.get_unpaired_osv(version_id, rule_id) return await service.get_unpaired_osv(version_id, rule_id)
@ -206,6 +206,7 @@ async def export_intercompany_matrix_preset(
service: IntercompanyMatrixServiceDep, service: IntercompanyMatrixServiceDep,
audit: Annotated[RequestAudit, Depends(get_request_audit)], audit: Annotated[RequestAudit, Depends(get_request_audit)],
) -> Response: ) -> Response:
"""XLSX шахматки §6 по правилу §4 с аудитом выгрузки."""
matrix, info = await service.build_export(version_id, mode="PRESET", rule_id=rule_id) matrix, info = await service.build_export(version_id, mode="PRESET", rule_id=rule_id)
return await _export_response(version_id, matrix, info, audit) return await _export_response(version_id, matrix, info, audit)

View File

@ -12,7 +12,7 @@ from src.models.accounting import ChartOfAccount, EliminationRule, EliminationRu
async def list_rules_with_accounts( async def list_rules_with_accounts(
session: AsyncSession, version_no: int | None session: AsyncSession, version_no: int | None
) -> list[tuple[EliminationRule, EliminationRuleAccount | None]]: ) -> list[tuple[EliminationRule, EliminationRuleAccount | None]]:
"""Правила заданной версии либо открытые правила последней версии.""" """Правила §4 заданной либо последней открытой версии."""
condition = ( condition = (
EliminationRule.version_no == version_no EliminationRule.version_no == version_no
if version_no is not None if version_no is not None
@ -35,16 +35,17 @@ async def list_rules_with_accounts(
def _current_open_version_stmt(): def _current_open_version_stmt():
"""Запрос номера последней открытой версии правил §4."""
return select(func.max(EliminationRule.version_no)).where(EliminationRule.valid_to.is_(None)) return select(func.max(EliminationRule.version_no)).where(EliminationRule.valid_to.is_(None))
async def current_open_version_no(session: AsyncSession) -> int | None: async def current_open_version_no(session: AsyncSession) -> int | None:
"""Номер последней версии, в которой есть открытые правила.""" """Номер последней версии с открытыми правилами §4."""
return await session.scalar(_current_open_version_stmt()) return await session.scalar(_current_open_version_stmt())
def is_valid_for_version(rule: EliminationRule | None, version_no: int | None) -> bool: def is_valid_for_version(rule: EliminationRule | None, version_no: int | None) -> bool:
"""Проверить номер версии либо отсутствие `valid_to`.""" """Проверить версию правила §4 либо отсутствие `valid_to`."""
return rule is not None and (rule.version_no == version_no if version_no is not None else rule.valid_to is None) return rule is not None and (rule.version_no == version_no if version_no is not None else rule.valid_to is None)
@ -76,7 +77,7 @@ async def list_rule_accounts(
async def rule_with_account( async def rule_with_account(
session: AsyncSession, rule_id: uuid.UUID session: AsyncSession, rule_id: uuid.UUID
) -> tuple[EliminationRule | None, list[EliminationRuleAccount]]: ) -> tuple[EliminationRule | None, list[EliminationRuleAccount]]:
"""Правило и его счета; `company_no` задаёт сторону, `is_excluded` — исключение.""" """Правило §4 и его счета; `company_no` задаёт сторону, `is_excluded` — исключение."""
rule = await session.get(EliminationRule, rule_id) rule = await session.get(EliminationRule, rule_id)
if rule is None: if rule is None:
return None, [] return None, []

View File

@ -21,6 +21,7 @@ class EliminationRuleService:
self._scope = scope self._scope = scope
async def list_rules(self, consolidation_version_id: uuid.UUID) -> EliminationRulesOut: async def list_rules(self, consolidation_version_id: uuid.UUID) -> EliminationRulesOut:
"""Правила §4 версии консолидации с проверкой видимости и основанием выбора."""
found = await consolidations_repo.get_version(self._session, self._scope, consolidation_version_id) found = await consolidations_repo.get_version(self._session, self._scope, consolidation_version_id)
if found is None: if found is None:
raise NotFoundError(VERSION_NOT_FOUND) raise NotFoundError(VERSION_NOT_FOUND)

View File

@ -109,6 +109,7 @@ class MatrixExportInfo:
@property @property
def preset_details(self) -> tuple[StatementType, int, int, str, str]: def preset_details(self) -> tuple[StatementType, int, int, str, str]:
"""Реквизиты правила §4 для имени и шапки XLSX шахматки §6."""
details = ( details = (
self.rule_statement_type, self.rule_statement_type,
self.rule_no, self.rule_no,
@ -215,7 +216,7 @@ def calculate_matrix(
def get_unpaired_rows(rows: Iterable[ConsolidatedRow], matrix: IntercompanyMatrixOut) -> list[ConsolidatedRow]: def get_unpaired_rows(rows: Iterable[ConsolidatedRow], matrix: IntercompanyMatrixOut) -> list[ConsolidatedRow]:
"""Строки свода, попавшие только на одну сторону пары компаний в шахматке.""" """Строки свода, попавшие только на одну сторону пары шахматки §6."""
entry_ids = { entry_ids = {
entry_id entry_id
for cell in matrix.cells for cell in matrix.cells
@ -429,7 +430,7 @@ class IntercompanyMatrixService:
return result.matrix, info return result.matrix, info
async def get_unpaired_osv(self, version_id: uuid.UUID, rule_id: uuid.UUID) -> UnpairedOsvOut: async def get_unpaired_osv(self, version_id: uuid.UUID, rule_id: uuid.UUID) -> UnpairedOsvOut:
"""Все строки свода без встречной стороны в шахматке заданного пресета.""" """Строки свода без встречной стороны в шахматке §6 заданного пресета."""
result = await self._build_accounts( result = await self._build_accounts(
version_id, mode="PRESET", debit_account_ids=(), credit_account_ids=(), rule_id=rule_id version_id, mode="PRESET", debit_account_ids=(), credit_account_ids=(), rule_id=rule_id
) )
@ -443,7 +444,7 @@ class IntercompanyMatrixService:
by_id: dict[uuid.UUID, ChartOfAccount], by_id: dict[uuid.UUID, ChartOfAccount],
children: dict[uuid.UUID, list[uuid.UUID]], children: dict[uuid.UUID, list[uuid.UUID]],
) -> tuple[MatrixSelection, EliminationRule]: ) -> tuple[MatrixSelection, EliminationRule]:
"""Выбрать счета и показатель пресета для версии консолидации.""" """Выбрать стороны счетов и показатель правила §4 для шахматки §6."""
if rule_id is None: if rule_id is None:
raise DomainValidationError("RULE_REQUIRED", "Выберите правило-пресет") raise DomainValidationError("RULE_REQUIRED", "Выберите правило-пресет")
rule, rule_accounts = await elimination_rules_repo.rule_with_account(self._session, rule_id) rule, rule_accounts = await elimination_rules_repo.rule_with_account(self._session, rule_id)