feat: migrate parser data to source records
Some checks failed
CI/CD Pipeline / Quality Gate (push) Failing after 14s
CI/CD Pipeline / Build and Push Images (push) Has been skipped
CI/CD Pipeline / Deploy Dev in Dokploy (push) Has been skipped
CI/CD Pipeline / Internal Notify (push) Successful in 0s

This commit is contained in:
2026-05-19 20:21:31 +02:00
parent 1c7c7238be
commit b8a18d6da4
46 changed files with 2689 additions and 6179 deletions

View File

@@ -284,6 +284,44 @@ class OrganizationSourceExtensionsApiV2Test(APITestCase):
self.assertEqual(response_organization["kpp"], "180001001")
self.assertEqual(response_organization["ogrn"], organization.ogrn)
def test_source_record_organization_keeps_canonical_inn_with_leading_zero(self):
organization = Organization.objects.create(
name='ООО "Башнефть-Добыча"',
inn="0277106840",
ogrn="1090280032699",
)
extension = PlannedInspectionExtension.objects.create(
organization=organization,
title="Плановые проверки Генпрокуратуры России",
)
OrganizationSourceRecord.objects.create(
extension=extension,
record_type="inspection",
source="inspections",
external_id="INSP-LEADING-ZERO-INN",
title="Проверка организации с ведущим нулем",
)
registry_organization = RegistryOrganizationFactory(
pn_name='ООО "Башнефть-Добыча"',
mn_inn=277106840,
mn_ogrn=int(organization.ogrn),
in_kpp=27701001,
)
RegistryMembershipPeriodFactory(organization=registry_organization)
response = self.client.get(
reverse("api_v2:organizations:organization-source-records-list"),
{
"has_registry": "true",
"source_group": "planned_inspections",
},
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
response_organization = response.data["data"][0]["organization"]
self.assertEqual(response_organization["inn"], "0277106840")
self.assertEqual(response_organization["ogrn"], organization.ogrn)
def test_flat_source_records_searches_payload_values_displayed_in_tables(self):
target = Organization.objects.create(
name='ООО "Поиск по payload"',

View File

@@ -101,6 +101,59 @@ class OrganizationSourceIngestionServiceTest(TestCase):
self.assertEqual(record.payload["version"], 2)
self.assertEqual(record.load_batch, 44)
def test_save_records_does_not_attach_identified_record_to_name_only_org(self):
name_only = Organization.objects.create(name="Acme Security")
result = OrganizationSourceIngestionService.save_records(
source=ParserLoadLog.Source.FSTEC,
load_batch=45,
records=[
SourceRecordInput(
external_id="fstec-5066",
title="Weblock",
organization_name="Acme Security",
inn="7713497980",
ogrn="1237700253306",
payload={"identity_enrichment": {"status": "matched"}},
)
],
)
self.assertEqual(result.created_records, 1)
organization = Organization.objects.get(inn="7713497980")
self.assertNotEqual(organization.uid, name_only.uid)
self.assertEqual(organization.ogrn, "1237700253306")
record = OrganizationSourceRecord.objects.get(external_id="fstec-5066")
self.assertEqual(record.extension.organization, organization)
self.assertFalse(name_only.source_extensions.exists())
def test_save_records_fills_missing_identity_on_resolved_organization(self):
partial = Organization.objects.create(
name="1237700253306",
ogrn="1237700253306",
)
OrganizationSourceIngestionService.save_records(
source=ParserLoadLog.Source.FSTEC,
load_batch=46,
records=[
SourceRecordInput(
external_id="fstec-5067",
title="Weblock",
organization_name="Acme Security",
inn="7713497980",
ogrn="1237700253306",
)
],
)
partial.refresh_from_db()
self.assertEqual(partial.inn, "7713497980")
self.assertEqual(partial.ogrn, "1237700253306")
self.assertEqual(partial.name, "Acme Security")
record = OrganizationSourceRecord.objects.get(external_id="fstec-5067")
self.assertEqual(record.extension.organization, partial)
def test_save_financial_report_writes_financial_lines_without_legacy_report(self):
result = OrganizationSourceIngestionService.save_records(
source=ParserLoadLog.Source.FNS_REPORTS,