chore(api): format, mypy и тест версии правил; убрать мёртвое as_of (ревью #141)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Andrey Epifancev 2026-10-21 14:04:38 +04:00
parent a8e510e402
commit 367a11ed38
7 changed files with 8 additions and 21 deletions

View File

@ -14,9 +14,7 @@ async def list_rules_with_accounts(
) -> list[tuple[EliminationRule, EliminationRuleAccount | None]]: ) -> list[tuple[EliminationRule, EliminationRuleAccount | None]]:
"""Правила заданной версии либо все правила без `valid_to`.""" """Правила заданной версии либо все правила без `valid_to`."""
condition = ( condition = (
EliminationRule.version_no == version_no EliminationRule.version_no == version_no if version_no is not None else EliminationRule.valid_to.is_(None)
if version_no is not None
else EliminationRule.valid_to.is_(None)
) )
stmt = ( stmt = (
select(EliminationRule, EliminationRuleAccount) select(EliminationRule, EliminationRuleAccount)

View File

@ -340,7 +340,6 @@ class EliminationRulesOut(BaseModel):
version_no: int | None version_no: int | None
is_version_fixed: bool is_version_fixed: bool
as_of: datetime.date | None
rules: list[EliminationRuleOut] rules: list[EliminationRuleOut]

View File

@ -151,9 +151,7 @@ class ConsolidatedOsvService:
"""Свод версии и данные его расчёта; версия вне видимости — 404.""" """Свод версии и данные его расчёта; версия вне видимости — 404."""
return await self.build_with_members(version_id) return await self.build_with_members(version_id)
async def build_with_members( async def build_with_members(self, version_id: uuid.UUID) -> ConsolidatedOsvBuildResult:
self, version_id: uuid.UUID
) -> ConsolidatedOsvBuildResult:
"""Свод и участники периметра, загруженные при его расчёте.""" """Свод и участники периметра, загруженные при его расчёте."""
found = await repo.get_version(self._session, self._scope, version_id) found = await repo.get_version(self._session, self._scope, version_id)
if found is None: if found is None:
@ -224,9 +222,8 @@ class ConsolidatedOsvService:
"rows": len(rows), "rows": len(rows),
}, },
) )
filename = ( period = f"{result.consolidation.year}-{result.consolidation.quarter.value}"
f"svod-osv_{group_name}_{result.consolidation.year}-{result.consolidation.quarter.value}_v{result.version.version_no}.xlsx" filename = f"svod-osv_{group_name}_{period}_v{result.version.version_no}.xlsx"
)
return content, filename return content, filename
async def summary(self, version_id: uuid.UUID) -> OsvSummaryOut: async def summary(self, version_id: uuid.UUID) -> OsvSummaryOut:

View File

@ -54,6 +54,5 @@ class EliminationRuleService:
return EliminationRulesOut( return EliminationRulesOut(
version_no=version_no, version_no=version_no,
is_version_fixed=is_version_fixed, is_version_fixed=is_version_fixed,
as_of=None,
rules=list(by_id.values()), rules=list(by_id.values()),
) )

View File

@ -497,7 +497,7 @@ class IntercompanyMatrixService:
raise DomainValidationError("ACCOUNTS_REQUIRED", "В правиле-пресете нужны счета обеих сторон") raise DomainValidationError("ACCOUNTS_REQUIRED", "В правиле-пресете нужны счета обеих сторон")
debit = _select_accounts(debit_ids, debit_excluded, "D", by_id, children) debit = _select_accounts(debit_ids, debit_excluded, "D", by_id, children)
credit = _select_accounts(credit_ids, credit_excluded, "K", by_id, children) credit = _select_accounts(credit_ids, credit_excluded, "K", by_id, children)
measure = "closing" if rule.measure == "closing" else "turnover" measure: Measure = "closing" if rule.measure == "closing" else "turnover"
return MatrixSelection(debit, credit, measure), rule return MatrixSelection(debit, credit, measure), rule

View File

@ -221,8 +221,8 @@ async def test_preset_uses_current_rules_when_version_unfixed(
listed = await client.get(f"/consolidations/versions/{world.version.id}/elimination-rules") listed = await client.get(f"/consolidations/versions/{world.version.id}/elimination-rules")
assert listed.status_code == OK, listed.text assert listed.status_code == OK, listed.text
assert listed.json()["is_version_fixed"] is False assert listed.json()["is_version_fixed"] is False
assert listed.json()["version_no"] == rule.version_no assert listed.json()["version_no"] is None
assert listed.json()["as_of"] is not None assert "as_of" not in listed.json()
assert str(rule.id) in {item["id"] for item in listed.json()["rules"]} assert str(rule.id) in {item["id"] for item in listed.json()["rules"]}
response = await client.get(url) response = await client.get(url)
assert response.status_code == OK, response.text assert response.status_code == OK, response.text
@ -238,7 +238,6 @@ async def test_preset_uses_current_rules_when_version_unfixed(
assert fixed.status_code == OK, fixed.text assert fixed.status_code == OK, fixed.text
assert fixed.json()["is_version_fixed"] is True assert fixed.json()["is_version_fixed"] is True
assert fixed.json()["version_no"] == rule.version_no assert fixed.json()["version_no"] == rule.version_no
assert fixed.json()["as_of"] is None
missing_url = f"/consolidations/versions/{world.version.id}/intercompany-matrix/preset/{uuid.uuid4()}" missing_url = f"/consolidations/versions/{world.version.id}/intercompany-matrix/preset/{uuid.uuid4()}"
missing = await client.get(missing_url) missing = await client.get(missing_url)
assert missing.status_code == NOT_FOUND assert missing.status_code == NOT_FOUND

View File

@ -33,9 +33,7 @@ def _rule() -> SimpleNamespace:
(SimpleNamespace(version_no=3, valid_to="2026-12-31"), 3, True), (SimpleNamespace(version_no=3, valid_to="2026-12-31"), 3, True),
], ],
) )
def test_rule_is_valid_for_version( def test_rule_is_valid_for_version(rule: SimpleNamespace | None, version_no: int | None, expected: bool) -> None:
rule: SimpleNamespace | None, version_no: int | None, expected: bool
) -> None:
assert rules_repo.is_valid_for_version(rule, version_no) is expected assert rules_repo.is_valid_for_version(rule, version_no) is expected
@ -69,7 +67,6 @@ async def test_fixed_rules_use_version_number(monkeypatch: pytest.MonkeyPatch) -
assert result.is_version_fixed is True assert result.is_version_fixed is True
assert result.version_no == rule.version_no assert result.version_no == rule.version_no
assert result.as_of is None
assert [item.id for item in result.rules] == [rule.id] assert [item.id for item in result.rules] == [rule.id]
assert result.rules[0].company_1.accounts == [account_id] assert result.rules[0].company_1.accounts == [account_id]
listed.assert_awaited_once_with(session, rule.version_no) listed.assert_awaited_once_with(session, rule.version_no)
@ -91,7 +88,6 @@ async def test_unfixed_rules_use_open_valid_to(monkeypatch: pytest.MonkeyPatch)
assert result.is_version_fixed is False assert result.is_version_fixed is False
assert result.version_no is None assert result.version_no is None
assert result.as_of is None
assert [item.id for item in result.rules] == [rule.id] assert [item.id for item in result.rules] == [rule.id]
listed.assert_awaited_once_with(session, None) listed.assert_awaited_once_with(session, None)
@ -110,6 +106,5 @@ async def test_no_current_rules_returns_empty_with_unfixed_flag(monkeypatch: pyt
assert result.is_version_fixed is False assert result.is_version_fixed is False
assert result.version_no is None assert result.version_no is None
assert result.as_of is None
assert result.rules == [] assert result.rules == []
listed.assert_awaited_once_with(session, None) listed.assert_awaited_once_with(session, None)