Add organization stats endpoint
This commit is contained in:
@@ -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")
|
||||
|
||||
@@ -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 = [
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user