fix: restore code-less FNS financial reports
Some checks failed
CI/CD Pipeline / Quality Gate (push) Failing after 39s
CI/CD Pipeline / Build and Push Images (push) Has been skipped
CI/CD Pipeline / Internal Notify (push) Successful in 0s
CI/CD Pipeline / Deploy Dev via Compose (push) Has been skipped

This commit is contained in:
2026-08-04 23:25:31 +02:00
parent ef92cc4610
commit 1bc98796ab
6 changed files with 818 additions and 39 deletions

View File

@@ -2,6 +2,9 @@
Тесты для FNS парсера бухгалтерской отчетности.
"""
from pathlib import Path
from tempfile import TemporaryDirectory
from apps.parsers.clients.fns.parser import FNSExcelParser, FNSParserError
from apps.parsers.clients.fns.schemas import ParsedReport, ReportLine
from apps.parsers.models import FinancialReport
@@ -10,6 +13,7 @@ from apps.parsers.services import (
FNSReportService,
)
from django.test import TestCase
from openpyxl import Workbook
from organizations.models import Organization
from tests.apps.parsers.organization_helpers import create_directory_organization
@@ -274,6 +278,103 @@ class TestFNSParserParseValue(TestCase):
self.assertIsNone(FNSExcelParser._parse_value(fake.word()))
class TestFNSExcelParserWorkbook(TestCase):
"""Регрессии поддерживаемых структур бухгалтерских XLSX."""
def test_parses_workbook_without_line_code_column(self):
with TemporaryDirectory() as temp_directory:
path = Path(temp_directory) / "fin_0130160_1187700006273.xlsx"
workbook = Workbook()
worksheet = workbook.active
worksheet.append(["Форма №1", 2020, None, 2021, None])
worksheet.append(
["Бухгалтерский баланс", "Начало", "Конец", "Начало", "Конец"]
)
worksheet.append(["Баланс", 60_232, 234_841, 234_841, 244_479])
worksheet.append(["Внеоборотные активы", None, None, None, None])
worksheet.append(["Итого", 1_878, 7_071, 7_071, 18_709])
worksheet.append(["Форма №3", 2020, None, 2021, None])
worksheet.append(
[
"Отчет об изменении капитала",
"Начало",
"Конец",
"Начало",
"Конец",
]
)
worksheet.append(["Добавочный капитал", None, None, None, None])
worksheet.append(["Увеличение - всего", 0, 10, 10, 20])
worksheet.append(["переоценка имущества", 0, 10, 10, 20])
worksheet.append(["Уменьшение - всего", 0, 5, 5, 6])
worksheet.append(["реорганизация ЮЛ", 0, 5, 5, 6])
worksheet.append(["Резервный капитал", None, None, None, None])
worksheet.append(["переоценка имущества", 0, -5, -5, -6])
worksheet.append(["Форма №4", 2020, None, 2021, None])
worksheet.append(
[
"Отчет о движении денежных средств",
"Начало",
"Конец",
"Начало",
"Конец",
]
)
worksheet.append(["Денежные потоки от инвестиционных операций", None, None])
worksheet.append(["Поступления всего", 0, 100, 100, 200])
worksheet.append(["Сальдо", 0, 100, 100, 200])
worksheet.append(["Форма №6", 2020, None, 2021, None])
worksheet.append(
[
"Отчет о целевом использовании полученных средств",
"Начало",
"Конец",
"Начало",
"Конец",
]
)
worksheet.append(["Поступило средств", None, None, None, None])
worksheet.append(["Итого", 0, 10, 10, 20])
worksheet.append(["Использовано средств", None, None, None, None])
worksheet.append(["Итого", 0, 5, 5, 6])
workbook.save(path)
report = FNSExcelParser.parse_file(path)
self.assertEqual(report.external_id, "0130160")
self.assertEqual(report.ogrn, "1187700006273")
self.assertEqual(report.years, {2020, 2021})
self.assertEqual(
{line.line_code for line in report.lines},
{
"1100",
"1600",
"3310",
"3312",
"3320",
"3322",
"3326",
"4200",
"4210",
"6200",
"6300",
},
)
def test_rejects_codeless_value_row_without_known_accounting_code(self):
with TemporaryDirectory() as temp_directory:
path = Path(temp_directory) / "fin_0000001_1187700006273.xlsx"
workbook = Workbook()
worksheet = workbook.active
worksheet.append(["Форма №1", 2021, None])
worksheet.append(["Бухгалтерский баланс", "Начало", "Конец"])
worksheet.append(["Неизвестная строка", 1, 2])
workbook.save(path)
with self.assertRaisesMessage(FNSParserError, "не определен код строки"):
FNSExcelParser.parse_file(path)
class TestFNSReportServiceIntegration(TestCase):
"""Интеграционные тесты сервиса FNSReportService."""