fix: align reporting forms and demo analytics
All checks were successful
All checks were successful
This commit is contained in:
@@ -1,7 +1,12 @@
|
||||
"""Tests for FormF6 services."""
|
||||
|
||||
from io import BytesIO
|
||||
|
||||
from apps.core.excel import ExcelValidationError
|
||||
from apps.form_6.models import FormF6Record
|
||||
from apps.form_6.services import FormF6Parser, FormF6Service
|
||||
from django.test import TestCase
|
||||
from openpyxl import Workbook
|
||||
|
||||
from tests.apps.organization.factories import OrganizationFactory
|
||||
|
||||
@@ -48,6 +53,82 @@ class FormF6ServiceTest(TestCase):
|
||||
class FormF6ParserTest(TestCase):
|
||||
"""Tests for FormF6Parser."""
|
||||
|
||||
@staticmethod
|
||||
def _current_template_file(
|
||||
*,
|
||||
total_equipment: int = 100,
|
||||
age_under_5: int | float = 20,
|
||||
total_header: str = "Всего",
|
||||
) -> BytesIO:
|
||||
workbook = Workbook()
|
||||
sheet = workbook.active
|
||||
row_1 = [None] * 38
|
||||
row_2 = [None] * 38
|
||||
row_3 = [None] * 38
|
||||
row_4 = [None] * 38
|
||||
row_1[:6] = [
|
||||
"Наименование организации",
|
||||
"ОКПО",
|
||||
"ОГРН",
|
||||
"ИНН",
|
||||
"Код строки",
|
||||
"Категория",
|
||||
]
|
||||
row_1[6] = "Количество оборудования на конец года ед."
|
||||
row_1[10] = "Из установленного оборудования – оборудование в возрасте, единиц"
|
||||
row_1[35:38] = [
|
||||
"Средняя сменность работы",
|
||||
"Количество рабочих мест без оборудования",
|
||||
"Примечание",
|
||||
]
|
||||
row_2[10], row_2[15], row_2[20], row_2[25], row_2[30] = (
|
||||
"До 5 лет",
|
||||
"От 5 до 10 лет",
|
||||
"От 10 до 15 лет",
|
||||
"От 15 до 20 лет",
|
||||
"Свыше 20 лет",
|
||||
)
|
||||
row_3[6:10] = [
|
||||
total_header,
|
||||
"Введенное в эксплуатацию в отчетном году",
|
||||
"Выведенное из эксплуатации в отчетном году",
|
||||
"Импортное оборудование",
|
||||
]
|
||||
for start in (10, 15, 20, 25, 30):
|
||||
row_3[start : start + 5] = [
|
||||
"Всего",
|
||||
"Импортного оборудования",
|
||||
"Коэффициент использования оборудования в производстве",
|
||||
"Доля фактического времени работы оборудования, использованного для производства ПВН, %",
|
||||
"Средневзвешенный коэффициент загрузки",
|
||||
]
|
||||
for row in (row_1, row_2, row_3, row_4):
|
||||
sheet.append(row)
|
||||
|
||||
ages = [age_under_5, 25, 20, 20, 15]
|
||||
imported = [4, 5, 4, 4, 3]
|
||||
values = [
|
||||
"Тестовая организация Ф-6",
|
||||
"90000001",
|
||||
"1267700000017",
|
||||
"6234567890",
|
||||
"101",
|
||||
"Основное технологическое оборудование",
|
||||
total_equipment,
|
||||
12,
|
||||
7,
|
||||
sum(imported),
|
||||
]
|
||||
for total, imported_total in zip(ages, imported, strict=True):
|
||||
values.extend([total, imported_total, 75, 20, 0.8])
|
||||
values.extend([1.5, 4, "Тестовые согласованные данные"])
|
||||
sheet.append(values)
|
||||
|
||||
file = BytesIO()
|
||||
workbook.save(file)
|
||||
file.seek(0)
|
||||
return file
|
||||
|
||||
def test_get_column_mappings_returns_mappings(self):
|
||||
"""Test get_column_mappings returns correct mappings."""
|
||||
parser = FormF6Parser(report_year=2026, report_quarter=1)
|
||||
@@ -59,6 +140,41 @@ class FormF6ParserTest(TestCase):
|
||||
field_names = [m.field_name for m in mappings]
|
||||
self.assertIn("row_code", field_names)
|
||||
self.assertIn("total_equipment", field_names)
|
||||
self.assertIn("commissioned_equipment", field_names)
|
||||
self.assertIn("age_over_20_imported", field_names)
|
||||
|
||||
def test_parse_current_template_maps_all_age_buckets(self):
|
||||
OrganizationFactory.create(inn="6234567890")
|
||||
parser = FormF6Parser(report_year=2026, report_quarter=1)
|
||||
|
||||
result = parser.parse(self._current_template_file())
|
||||
|
||||
self.assertEqual(result.loaded_count, 1)
|
||||
record = FormF6Record.objects.get()
|
||||
self.assertEqual(record.total_equipment, 100)
|
||||
self.assertEqual(record.commissioned_equipment, 12)
|
||||
self.assertEqual(record.decommissioned_equipment, 7)
|
||||
self.assertEqual(record.age_under_5, 20)
|
||||
self.assertEqual(record.age_over_20, 15)
|
||||
self.assertEqual(record.age_over_20_imported, 3)
|
||||
|
||||
def test_rejects_non_integral_equipment_counts_before_creating_records(self):
|
||||
OrganizationFactory.create(inn="6234567890")
|
||||
parser = FormF6Parser(report_year=2026, report_quarter=1)
|
||||
|
||||
with self.assertRaises(ExcelValidationError):
|
||||
parser.parse(self._current_template_file(age_under_5=20.5))
|
||||
|
||||
self.assertFalse(FormF6Record.objects.exists())
|
||||
|
||||
def test_rejects_incompatible_template_before_creating_records(self):
|
||||
OrganizationFactory.create(inn="6234567890")
|
||||
parser = FormF6Parser(report_year=2026, report_quarter=1)
|
||||
|
||||
with self.assertRaises(ExcelValidationError):
|
||||
parser.parse(self._current_template_file(total_header="Импортное"))
|
||||
|
||||
self.assertFalse(FormF6Record.objects.exists())
|
||||
|
||||
def test_create_record_uses_existing_organization(self):
|
||||
"""Report imports reuse existing organizations when available."""
|
||||
|
||||
Reference in New Issue
Block a user