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 FormF3 services."""
from decimal import Decimal
from io import BytesIO
from apps.form_3.models import FormF3Record
from apps.form_3.services import FormF3Parser, FormF3Service
from django.test import TestCase
from openpyxl import Workbook
from tests.apps.organization.factories import OrganizationFactory
@@ -48,6 +53,72 @@ class FormF3ServiceTest(TestCase):
class FormF3ParserTest(TestCase):
"""Tests for FormF3Parser."""
@staticmethod
def _current_template_file() -> BytesIO:
headers = [
"Наименование организации",
"ОКПО",
"ОГРН",
"ИНН",
"Отгруженные товары собственного производства, выполненные работы и услуги собственными силами в фактических ценах - всего",
"Отгруженные товары собственного производства, выполненные работы и услуги собственными силами в фактических ценах, из них инновационные товары, работы, услуги",
"Всего основных фондов (без незавершенных активов и не включая земельные участки и объекты природопользования)",
"Станочный парк и оборудование, всего по предприятию",
"Станочный парк и оборудование - импортное оборудование",
"Оборудование с возрастом от 5 до 10 лет",
"Оборудование с возрастом до 5 лет",
"Фактический (физический) износ оборудования, %",
"Средний уровень загрузки производственных мощностей (всего)",
"Средний уровень загрузки производственных мощностей военного производства",
"Средний возраст сотрудников",
"Количество работников предприятия до 20 лет",
"Количество работников предприятия 20-29 лет",
"Количество работников предприятия 30-39 лет",
"Количество работников предприятия 40-49 лет",
"Количество работников предприятия 50-59 лет",
"Количество работников предприятия старше 60 лет",
]
workbook = Workbook()
sheet = workbook.active
sheet.append(headers)
sheet.append(
[None, None, None, None]
+ ["тыс. руб."] * 3
+ ["ед."] * 4
+ ["%"] * 3
+ ["лет"]
+ ["чел."] * 6
)
sheet.append(
[
"Тестовая организация Ф-3",
"90000001",
"1267700000017",
"3234567890",
352,
222,
85,
46,
17,
13,
14,
21,
79,
65,
42,
4,
18,
28,
26,
17,
7,
]
)
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 = FormF3Parser(report_year=2026, report_quarter=1)
@@ -57,8 +128,24 @@ class FormF3ParserTest(TestCase):
self.assertTrue(len(mappings) > 0)
field_names = [m.field_name for m in mappings]
self.assertIn("avg_employees", field_names)
self.assertIn("total_equipment", field_names)
self.assertIn("shipped_goods_total", field_names)
self.assertIn("machine_tools_and_equipment", field_names)
self.assertIn("average_employee_age", field_names)
self.assertNotIn("avg_employees", field_names)
def test_parse_current_template_maps_equipment_and_personnel_columns(self):
OrganizationFactory.create(inn="3234567890")
parser = FormF3Parser(report_year=2026, report_quarter=1)
result = parser.parse(self._current_template_file())
self.assertEqual(result.loaded_count, 1)
record = FormF3Record.objects.get()
self.assertEqual(record.shipped_goods_total, Decimal("352"))
self.assertEqual(record.machine_tools_and_equipment, 46)
self.assertEqual(record.imported_equipment, 17)
self.assertEqual(record.average_employee_age, Decimal("42"))
self.assertEqual(record.employees_30_39, 28)
def test_create_record_uses_existing_organization(self):
"""Report imports reuse existing organizations when available."""
@@ -69,8 +156,8 @@ class FormF3ParserTest(TestCase):
row_data = {
"inn": "3234567890",
"name": "Тестовая организация Ф-3",
"avg_employees": 100,
"total_equipment": 50,
"machine_tools_and_equipment": 50,
"average_employee_age": 42,
}
record = parser.create_record(row_data)