From 19bf045af2ba723975f21a2ebef44828facc6a80 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Fri, 6 Nov 2026 22:56:37 +0400 Subject: [PATCH] =?UTF-8?q?AURORA-1864:=20=D1=83=20=D0=B3=D1=80=D1=83?= =?UTF-8?q?=D0=BF=D0=BF=D1=8B=20=D0=B0=D0=BB=D1=8C=D1=82=D0=B5=D1=80=D0=BD?= =?UTF-8?q?=D0=B0=D1=82=D0=B8=D0=B2=20=D0=BE=D0=B4=D0=BD=D0=B0=20=D1=86?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=20=E2=80=94=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=BA=D0=B0=20=D0=B2=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83?= =?UTF-8?q?=D0=B7=D1=87=D0=B8=D0=BA=D0=B5=20(#3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 2 +- arm_statements/loader.py | 7 +++++++ tests/test_loader.py | 12 ++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b4c2d9e..0fa9cdf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ - `statement_checks.yaml`: необязательный ключ `group` — группа альтернатив мягких соотношений одной цели. В колонке сошлась хоть одна — нарушений группы нет; не сошлась ни одна — одно нарушение, ближайшая к цели. `group` у жёсткого - соотношения — ошибка загрузки словаря. Подсветка, `needs_check` и подтверждение 2400 (Р-21) не менялись (AURORA-1864). + соотношения или разные цели в одной группе — ошибка загрузки словаря. Подсветка, `needs_check` и подтверждение 2400 (Р-21) не менялись (AURORA-1864). - Соотношения 2400 ОФР — группа `net_profit`: полная форма «2400 = 2300 − 2410 + 2420» и «2400 = 2300 + 2410 + 2460»; в упрощённую добавлено «2400 = 2110 − 2120 − 2330 + 2340 − 2350 + 2410». Положительный 2410 (доход по налогу, ФСБУ 4/2023) больше не даёт ложного предупреждения. diff --git a/arm_statements/loader.py b/arm_statements/loader.py index e4a77e0..541945f 100644 --- a/arm_statements/loader.py +++ b/arm_statements/loader.py @@ -301,6 +301,13 @@ def _load_checks(directory: Path) -> CheckRules: group=group, ) ) + group_targets: dict[tuple[DocumentType, FormVariant, str], str] = {} + for i, rule in enumerate(relations): + if rule.group is None: + continue + known = group_targets.setdefault((rule.form, rule.variant, rule.group), rule.target) + if known != rule.target: + raise _fail(file, f"relations[{i}].group", f"у группы {rule.group!r} разные цели: {known} и {rule.target}") return CheckRules( tolerance=_number(file, "tolerance", _get(file, data, "tolerance")), rounding_tolerance_percent=_number( diff --git a/tests/test_loader.py b/tests/test_loader.py index 860a1ab..a15bf6d 100644 --- a/tests/test_loader.py +++ b/tests/test_loader.py @@ -86,6 +86,18 @@ def test_group_on_strict_relation_rejected(tmp_path: Path) -> None: load_rules(tmp_path) +def test_group_with_different_targets_rejected(tmp_path: Path) -> None: + for path in RULES_DIR.glob("*.yaml"): + (tmp_path / path.name).write_bytes(path.read_bytes()) + target = tmp_path / "statement_checks.yaml" + text = target.read_text(encoding="utf-8") + soft = 'relation: "2500 = 2400 + 2510 + 2520 + 2530", strict: false' + assert soft in text + target.write_text(text.replace(soft, soft + ", group: net_profit"), encoding="utf-8") + with pytest.raises(RulesError, match="statement_checks.*group"): + load_rules(tmp_path) + + def test_code_orders_with_repeats(rules: Rules) -> None: fsbu = rules.code_orders.sequence(Edition.FSBU4, DocumentType.BALANCE, FormVariant.FULL) assert fsbu.count("1220") == len(("1220", "1220")) and "1120" not in fsbu