"""Строки ИНН на уровне листа ОСВ: страховка после классификации (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