fix: align reporting forms and demo analytics
All checks were successful
CI/CD Pipeline / Code Quality Checks (push) Successful in 2m21s
CI/CD Pipeline / Run Tests (push) Successful in 4m23s
CI/CD Pipeline / Build and Push Dev Images (push) Successful in 32s
CI/CD Pipeline / Deploy Dev via Compose (push) Successful in 52s

This commit is contained in:
2026-07-28 11:07:47 +02:00
parent ff0b2bdfca
commit df0f41b9c0
31 changed files with 1627 additions and 328 deletions

View File

@@ -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."""