add-preset-shahmatka #141

Merged
aep merged 24 commits from add-preset-shahmatka into main 2026-10-22 17:57:14 +03:00
5 changed files with 14 additions and 10 deletions
Showing only changes of commit fabc9b48b2 - Show all commits

View File

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

View File

@ -173,7 +173,7 @@ async def build_intercompany_matrix_preset(
rule_id: uuid.UUID,
service: IntercompanyMatrixServiceDep,
) -> IntercompanyMatrixOut:
"""Cчета пресета с подходящим видом дебета или кредита."""
"""Шахматка §6 по счетам сторон правила §4."""
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,
service: IntercompanyMatrixServiceDep,
) -> UnpairedOsvOut:
"""Все строки односторонних ячеек шахматки и их число."""
"""Строки свода односторонних ячеек шахматки §6 и их число."""
return await service.get_unpaired_osv(version_id, rule_id)
@ -206,6 +206,7 @@ async def export_intercompany_matrix_preset(
service: IntercompanyMatrixServiceDep,
audit: Annotated[RequestAudit, Depends(get_request_audit)],
) -> Response:
"""XLSX шахматки §6 по правилу §4 с аудитом выгрузки."""
matrix, info = await service.build_export(version_id, mode="PRESET", rule_id=rule_id)
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(
session: AsyncSession, version_no: int | None
) -> list[tuple[EliminationRule, EliminationRuleAccount | None]]:
"""Правила заданной версии либо открытые правила последней версии."""
"""Правила §4 заданной либо последней открытой версии."""
condition = (
EliminationRule.version_no == version_no
if version_no is not None
@ -35,16 +35,17 @@ async def list_rules_with_accounts(
def _current_open_version_stmt():
"""Запрос номера последней открытой версии правил §4."""
return select(func.max(EliminationRule.version_no)).where(EliminationRule.valid_to.is_(None))
async def current_open_version_no(session: AsyncSession) -> int | None:
"""Номер последней версии, в которой есть открытые правила."""
"""Номер последней версии с открытыми правилами §4."""
return await session.scalar(_current_open_version_stmt())
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)
@ -76,7 +77,7 @@ async def list_rule_accounts(
async def rule_with_account(
session: AsyncSession, rule_id: uuid.UUID
) -> tuple[EliminationRule | None, list[EliminationRuleAccount]]:
"""Правило и его счета; `company_no` задаёт сторону, `is_excluded` — исключение."""
"""Правило §4 и его счета; `company_no` задаёт сторону, `is_excluded` — исключение."""
rule = await session.get(EliminationRule, rule_id)
if rule is None:
return None, []

View File

@ -21,6 +21,7 @@ class EliminationRuleService:
self._scope = scope
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)
if found is None:
raise NotFoundError(VERSION_NOT_FOUND)

View File

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