feat: import mostovik exchange sections
All checks were successful
CI/CD Pipeline / Run Tests (push) Successful in 6m12s
CI/CD Pipeline / Code Quality Checks (push) Successful in 6m19s
CI/CD Pipeline / Build Docker Images (push) Successful in 2m21s
CI/CD Pipeline / Push to Gitea Registry (push) Successful in 1s
CI/CD Pipeline / Deploy to Server (push) Successful in 1s

This commit is contained in:
2026-05-27 23:13:40 +02:00
parent bd8e1a8400
commit d1b0cd7945
49 changed files with 1831 additions and 319 deletions

View File

@@ -5,9 +5,13 @@ from apps.external_data.models import (
ArbitrationCase,
BankruptcyProcedure,
DefenseUnreliableSupplier,
FinancialReport,
FinancialReportLine,
IndustrialCertificate,
IndustrialProduct,
InformationSecurityRegistryEntry,
LaborVacancy,
ManufacturerRegistryEntry,
ProsecutorCheck,
PublicProcurement,
)
@@ -30,6 +34,32 @@ class IndustrialProductFactory(factory.django.DjangoModelFactory):
registry_number = factory.Sequence(lambda n: f"{1000 + n}/2026")
class IndustrialCertificateFactory(factory.django.DjangoModelFactory):
class Meta:
model = IndustrialCertificate
organization = factory.SubFactory(OrganizationFactory)
certificate_number = factory.Sequence(lambda n: f"CERT-{n:04d}")
issue_date = factory.LazyAttribute(lambda _: fake.date_this_year())
expiry_date = factory.LazyAttribute(lambda _: fake.date_this_decade())
certificate_file_url = factory.Sequence(
lambda n: f"https://minpromtorg.gov.ru/cert/{n}"
)
organisation_name = factory.LazyAttribute(lambda obj: obj.organization.name)
ogrn = factory.LazyAttribute(lambda obj: obj.organization.ogrn)
class ManufacturerRegistryEntryFactory(factory.django.DjangoModelFactory):
class Meta:
model = ManufacturerRegistryEntry
organization = factory.SubFactory(OrganizationFactory)
full_legal_name = factory.LazyAttribute(lambda obj: obj.organization.name)
inn = factory.LazyAttribute(lambda obj: obj.organization.inn)
ogrn = factory.LazyAttribute(lambda obj: obj.organization.ogrn)
address = factory.LazyAttribute(lambda _: fake.address())
class ProsecutorCheckFactory(factory.django.DjangoModelFactory):
class Meta:
model = ProsecutorCheck
@@ -126,3 +156,30 @@ class LaborVacancyFactory(factory.django.DjangoModelFactory):
published_at = factory.LazyAttribute(lambda _: fake.date_this_year())
salary_amount = "175000.00"
source_url = factory.Sequence(lambda n: f"https://trudvsem.ru/vacancy/{n}")
class FinancialReportFactory(factory.django.DjangoModelFactory):
class Meta:
model = FinancialReport
organization = factory.SubFactory(OrganizationFactory)
external_id = factory.Sequence(lambda n: f"fin-{n:04d}")
ogrn = factory.LazyAttribute(lambda obj: obj.organization.ogrn)
file_name = factory.Sequence(lambda n: f"fin_{n:04d}.xlsx")
file_hash = factory.Sequence(lambda n: f"{n:064x}"[-64:])
load_batch = factory.Sequence(lambda n: n + 1)
status = "success"
source = "api"
class FinancialReportLineFactory(factory.django.DjangoModelFactory):
class Meta:
model = FinancialReportLine
report = factory.SubFactory(FinancialReportFactory)
form_code = "1"
line_code = "1600"
line_name = "Баланс"
year = 2025
period_start = 1000
period_end = 1500

View File

@@ -12,9 +12,13 @@ from tests.apps.external_data.factories import (
ArbitrationCaseFactory,
BankruptcyProcedureFactory,
DefenseUnreliableSupplierFactory,
FinancialReportFactory,
FinancialReportLineFactory,
IndustrialCertificateFactory,
IndustrialProductFactory,
InformationSecurityRegistryEntryFactory,
LaborVacancyFactory,
ManufacturerRegistryEntryFactory,
ProsecutorCheckFactory,
PublicProcurementFactory,
)
@@ -48,6 +52,33 @@ class ExternalDataApiTest(APITestCase):
response.data["results"][0]["organization"], str(self.organization.id)
)
def test_manufacturing_source_endpoints_are_exposed(self):
IndustrialCertificateFactory.create(
organization=self.organization,
certificate_number="CERT-001",
issue_date=date(2026, 1, 10),
)
ManufacturerRegistryEntryFactory.create(
organization=self.organization,
full_legal_name="АО Альфа",
)
IndustrialCertificateFactory.create(organization=self.other_organization)
ManufacturerRegistryEntryFactory.create(organization=self.other_organization)
certificates_response = self.client.get(
f"/api/v1/industrial-certificates/?organization={self.organization.id}"
"&issue_date_from=2026-01-01&issue_date_to=2026-12-31"
)
manufacturers_response = self.client.get(
f"/api/v1/manufacturers/?organization={self.organization.id}"
"&search=Альфа"
)
self.assertEqual(certificates_response.status_code, status.HTTP_200_OK)
self.assertEqual(manufacturers_response.status_code, status.HTTP_200_OK)
self.assertEqual(certificates_response.data["count"], 1)
self.assertEqual(manufacturers_response.data["count"], 1)
def test_prosecutor_checks_support_date_range_filters(self):
ProsecutorCheckFactory.create(
organization=self.organization,
@@ -163,3 +194,20 @@ class ExternalDataApiTest(APITestCase):
vacancies_response.data["results"][0]["title"],
"Инженер-испытатель",
)
def test_financial_reports_endpoint_returns_lines(self):
report = FinancialReportFactory.create(
organization=self.organization,
status="success",
)
FinancialReportLineFactory.create(report=report, line_code="1600")
FinancialReportFactory.create(organization=self.other_organization)
response = self.client.get(
f"/api/v1/financial-reports/?organization={self.organization.id}"
"&status=success"
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data["count"], 1)
self.assertEqual(response.data["results"][0]["lines"][0]["line_code"], "1600")