Add organization stats endpoint
All checks were successful
CI/CD Pipeline / Quality Gate (push) Successful in 24s
CI/CD Pipeline / Build and Push Images (push) Successful in 10s
CI/CD Pipeline / Internal Notify (push) Successful in 0s
CI/CD Pipeline / Deploy Dev in Dokploy (push) Successful in 1s

This commit is contained in:
2026-05-12 17:48:54 +02:00
parent ab3e672a8d
commit 89607356b7
6 changed files with 342 additions and 13 deletions

View File

@@ -697,6 +697,112 @@ class ParsersViewSetTest(APITestCase):
self.assertEqual(unified_response.data["data"][0]["id"], report.id)
self.assertEqual(unified_response.data["data"][0]["title"], report.file_name)
def test_fns_financial_results_searches_and_orders_by_registry_organization(self):
alpha_org = RegisterOrganizationFactory(
pn_name='alpha "ФНС"',
mn_ogrn=1027700000001,
mn_inn=7701000001,
)
beta_org = RegisterOrganizationFactory(
pn_name='Beta "ФНС"',
mn_ogrn=1027700000002,
mn_inn=7701000002,
)
alpha_report = FinancialReport.objects.create(
external_id="fns-alpha",
ogrn=str(alpha_org.mn_ogrn),
registry_organization=alpha_org,
file_name=f"fin_fns-alpha_{alpha_org.mn_ogrn}.xlsx",
file_hash=fake.sha256(raw_output=False),
load_batch=1,
status=FinancialReport.Status.SUCCESS,
source=FinancialReport.SourceType.API,
)
beta_report = FinancialReport.objects.create(
external_id="fns-beta",
ogrn=str(beta_org.mn_ogrn),
registry_organization=beta_org,
file_name=f"fin_fns-beta_{beta_org.mn_ogrn}.xlsx",
file_hash=fake.sha256(raw_output=False),
load_batch=1,
status=FinancialReport.Status.SUCCESS,
source=FinancialReport.SourceType.API,
)
self.client.force_authenticate(self.user)
name_response = self.client.get(
"/api/v1/parsers/results/fns_financial/",
{"search": "alpha"},
)
inn_response = self.client.get(
"/api/v1/parsers/results/fns_financial/",
{"search": str(beta_org.mn_inn)},
)
ordered_response = self.client.get(
"/api/v1/parsers/results/fns_financial/",
{"ordering": "organisation_name"},
)
self.assertEqual(name_response.status_code, status.HTTP_200_OK)
self.assertEqual(
[item["id"] for item in name_response.data["data"]],
[alpha_report.id],
)
self.assertEqual(
name_response.data["data"][0]["organisation_name"],
alpha_org.pn_name,
)
self.assertEqual(name_response.data["data"][0]["inn"], str(alpha_org.mn_inn))
self.assertEqual(inn_response.status_code, status.HTTP_200_OK)
self.assertEqual(
[item["id"] for item in inn_response.data["data"]],
[beta_report.id],
)
self.assertEqual(ordered_response.status_code, status.HTTP_200_OK)
self.assertEqual(
[item["id"] for item in ordered_response.data["data"]],
[alpha_report.id, beta_report.id],
)
def test_eis_results_order_text_case_insensitively_and_by_amount(self):
low_amount = GenericParserRecord.objects.create(
load_batch=1,
source=ParserLoadLog.Source.PROCUREMENTS_44FZ,
external_id="amount-low",
organisation_name="alpha customer",
title="Low amount",
amount="10.00",
)
high_amount = GenericParserRecord.objects.create(
load_batch=1,
source=ParserLoadLog.Source.PROCUREMENTS_44FZ,
external_id="amount-high",
organisation_name="Beta customer",
title="High amount",
amount="20.00",
)
self.client.force_authenticate(self.user)
amount_response = self.client.get(
"/api/v1/eis/procurements-44fz/",
{"ordering": "amount"},
)
name_response = self.client.get(
"/api/v1/eis/procurements-44fz/",
{"ordering": "-organisation_name"},
)
self.assertEqual(amount_response.status_code, status.HTTP_200_OK)
self.assertEqual(
[item["id"] for item in amount_response.data["data"]],
[low_amount.id, high_amount.id],
)
self.assertEqual(name_response.status_code, status.HTTP_200_OK)
self.assertEqual(
[item["id"] for item in name_response.data["data"]],
[high_amount.id, low_amount.id],
)
def test_system_logs_admin_only(self):
log = ParserLoadLogFactory()
url_logs = reverse("api_v1:system:parser-logs-list")

View File

@@ -6,7 +6,7 @@ import io
from datetime import date
from unittest.mock import patch
from apps.registers.models import Organization, RegistryMembershipPeriod
from apps.registers.models import Organization, Register, RegistryMembershipPeriod
from django.core.files.uploadedfile import SimpleUploadedFile
from django.db import IntegrityError
from django.urls import reverse
@@ -198,6 +198,55 @@ class RegistersViewsTest(APITestCase):
"/api/v2/registers/rosatom-goz/upload/",
)
def test_stat_organizations_endpoint_returns_registry_cards(self):
opk_registry, _ = Register.objects.get_or_create(name="Реестр предприятий ОПК")
rosatom_registry, _ = Register.objects.get_or_create(
name="Реестр госкорпорации Росатом"
)
roscosmos_goz_registry, _ = Register.objects.get_or_create(
name="Реестр госкорпорации Роскосмос ГОЗ"
)
opk_organization = OrganizationFactory()
shared_organization = OrganizationFactory()
inactive_organization = OrganizationFactory()
RegistryMembershipPeriodFactory(
registry=opk_registry,
organization=opk_organization,
)
RegistryMembershipPeriodFactory(
registry=rosatom_registry,
organization=opk_organization,
)
RegistryMembershipPeriodFactory(
registry=rosatom_registry,
organization=shared_organization,
)
RegistryMembershipPeriodFactory(
registry=roscosmos_goz_registry,
organization=inactive_organization,
ended_at=date(2026, 6, 1),
)
response = self.client.get("/api/v1/stat/organizations/")
self.assertEqual(response.status_code, status.HTTP_200_OK)
payload = response.data["data"]
self.assertEqual(payload["total_organizations"], 3)
self.assertEqual(payload["active_registry_organizations"], 2)
self.assertEqual(payload["counts"]["total"], 3)
self.assertEqual(payload["counts"]["opk"], 1)
self.assertEqual(payload["counts"]["rosatom"], 2)
self.assertEqual(payload["counts"]["roscosmos-goz"], 0)
cards_by_slug = {item["slug"]: item for item in payload["cards"]}
self.assertEqual(
cards_by_slug["total"]["title"],
"Общее количество организаций",
)
self.assertEqual(
cards_by_slug["rosatom"]["registry_name"],
"Реестр госкорпорации Росатом",
)
def test_v2_registry_slug_upload_does_not_refresh_snapshots_after_import_error(self):
rows = [
{