arm-tabular-parser/api/tests/unit/parser/test_inn_rows_osv.py
Andrey Epifancev 598d2c8fae Умолчание БУ по строкам вывода, без реэкспорта row_data_type (#58)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 12:17:18 +04:00

88 lines
3.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Строки ИНН на уровне листа ОСВ: страховка после классификации (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
# --- Умолчание вида данных (#58, T6.1) ---
BU_DEFAULT_WARNING = "вид данных в шапке не указан — строки без метки приняты как БУ"
def _labelled_sheet(bu_label: object) -> object:
return sheet_from_rows(
[
["Оборотно-сальдовая ведомость по счету 60 за 1 квартал 2025 г."],
[
"Счет",
None,
M("Сальдо на начало периода", 2),
M("Обороты за период", 2),
M("Сальдо на конец периода", 2),
],
["Контрагенты", "Показатели", "Дебет", "Кредит", "Дебет", "Кредит", "Дебет", "Кредит"],
[L(0), "60", bu_label, *A],
[L(1), "ООО Альфа", bu_label, *A],
[L(1), None, "НУ", *A],
[L(0), "Итого", bu_label, *A],
]
)
def test_default_warning_not_given_when_all_rows_are_labelled(rules: Rules) -> None:
result = OsvParser(rules).parse_sheet(_labelled_sheet("БУ"), Deadline(TIMEOUT_SECONDS)) # type: ignore[arg-type]
assert BU_DEFAULT_WARNING not in [note.message for note in result.notes]
assert result.document.header.data_type is None
def test_default_warning_given_once_when_rows_have_no_label(rules: Rules) -> None:
result = OsvParser(rules).parse_sheet(_labelled_sheet(None), Deadline(TIMEOUT_SECONDS)) # type: ignore[arg-type]
assert [note.message for note in result.notes].count(BU_DEFAULT_WARNING) == 1