Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W
50 lines
2.0 KiB
Python
50 lines
2.0 KiB
Python
"""Строки ИНН на уровне листа ОСВ: страховка после классификации (R-8, design №24; change osv-inn-rows-layouts, #35)."""
|
||
|
||
import pytest
|
||
from gridbuilder import L, M, sheet_from_rows
|
||
|
||
from src.parser.deadline import Deadline
|
||
from src.parser.osv import OsvParser
|
||
from src.parser.rules import Rules, load_rules
|
||
|
||
TIMEOUT_SECONDS = 60
|
||
DETAIL = "Детализация по субсчетам, субконто: Подразделения, Контрагенты"
|
||
A = (None, None, 760000, 760000, None, None)
|
||
INN_A = 7701234560
|
||
|
||
|
||
@pytest.fixture(scope="module")
|
||
def rules() -> Rules:
|
||
return load_rules()
|
||
|
||
|
||
def test_inn_glued_to_row_that_is_not_a_counterparty_needs_check(rules: Rules) -> None:
|
||
head: list[list[object]] = [
|
||
["ООО Зерновая"],
|
||
["Оборотно-сальдовая ведомость по счету 60"],
|
||
["Период: 9 месяцев 2025 г."],
|
||
[DETAIL],
|
||
["Выводимые данные: сумма"],
|
||
[],
|
||
["Субконто", M("Сальдо на начало периода", 2), M("Оборот за период", 2), M("Сальдо на конец периода", 2)],
|
||
[None, "Дебет", "Кредит", "Дебет", "Кредит", "Дебет", "Кредит"],
|
||
]
|
||
sheet = sheet_from_rows(
|
||
[
|
||
*head,
|
||
[L(0), "60.01", *A], # 9
|
||
[L(1), INN_A, *A], # 10
|
||
[L(1), "ООО Альфа", *A], # 11
|
||
[L(0), "Итого", *A],
|
||
]
|
||
)
|
||
|
||
result = OsvParser(rules).parse_sheet(sheet, Deadline(TIMEOUT_SECONDS))
|
||
document, ok = result.document, result.ok
|
||
warnings = [note.message for note in result.notes]
|
||
|
||
assert [(row.row_value, row.group_type) for row in document.rows][1:2] == [("ООО Альфа", "DEPARTMENT")]
|
||
assert not ok
|
||
expected = f"строка 10: ИНН {INN_A} отнесён к строке 11, но она не контрагент — проверьте"
|
||
assert expected in warnings, warnings
|