88 lines
3.6 KiB
Python
88 lines
3.6 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
|
||
|
||
|
||
# --- Умолчание вида данных (#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
|