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