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

@@ -52,16 +52,21 @@ class OrganizationSourceBackfillResult:
updated_financial_lines: int = 0
unresolved: int = 0
def plus(self, other: OrganizationSourceBackfillResult) -> OrganizationSourceBackfillResult:
def plus(
self, other: OrganizationSourceBackfillResult
) -> OrganizationSourceBackfillResult:
return OrganizationSourceBackfillResult(
scanned=self.scanned + other.scanned,
created_organizations=self.created_organizations + other.created_organizations,
created_organizations=self.created_organizations
+ other.created_organizations,
created_extensions=self.created_extensions + other.created_extensions,
updated_extensions=self.updated_extensions + other.updated_extensions,
created_records=self.created_records + other.created_records,
updated_records=self.updated_records + other.updated_records,
created_financial_lines=self.created_financial_lines + other.created_financial_lines,
updated_financial_lines=self.updated_financial_lines + other.updated_financial_lines,
created_financial_lines=self.created_financial_lines
+ other.created_financial_lines,
updated_financial_lines=self.updated_financial_lines
+ other.updated_financial_lines,
unresolved=self.unresolved + other.unresolved,
)
@@ -131,14 +136,20 @@ class OrganizationSourceBackfillService:
with transaction.atomic():
for adapter in adapters:
scanned += 1
organization, organization_created = cls._resolve_or_create_organization(adapter)
(
organization,
organization_created,
) = cls._resolve_or_create_organization(adapter)
if organization is None:
unresolved += 1
continue
if organization_created:
created_organizations += 1
extension, extension_created = descriptor.extension_model.objects.get_or_create(
(
extension,
extension_created,
) = descriptor.extension_model.objects.get_or_create(
organization=organization,
defaults={
"source_group": descriptor.source_group,
@@ -149,9 +160,14 @@ class OrganizationSourceBackfillService:
if extension_created:
created_extensions += 1
else:
updated_extensions += cls._update_extension(extension, descriptor, adapter)
updated_extensions += cls._update_extension(
extension, descriptor, adapter
)
source_record, record_created = OrganizationSourceRecord.objects.update_or_create(
(
source_record,
record_created,
) = OrganizationSourceRecord.objects.update_or_create(
legacy_model=adapter.legacy_model,
legacy_pk=adapter.legacy_pk,
defaults={
@@ -174,7 +190,9 @@ class OrganizationSourceBackfillService:
updated_records += 1
if adapter.source == ParserLoadLog.Source.FNS_REPORTS:
line_result = cls._backfill_financial_lines(source_record, adapter.legacy_pk)
line_result = cls._backfill_financial_lines(
source_record, adapter.legacy_pk
)
created_financial_lines += line_result[0]
updated_financial_lines += line_result[1]
@@ -204,7 +222,10 @@ class OrganizationSourceBackfillService:
if extension.title != descriptor.title:
extension.title = descriptor.title
changed = True
if adapter.load_batch is not None and extension.last_load_batch != adapter.load_batch:
if (
adapter.load_batch is not None
and extension.last_load_batch != adapter.load_batch
):
extension.last_load_batch = adapter.load_batch
changed = True
if changed:
@@ -371,7 +392,9 @@ class OrganizationSourceBackfillService:
@staticmethod
def _refresh_extension_counters(extension_ids: set[str]) -> None:
for extension in OrganizationSourceExtension.objects.filter(uid__in=extension_ids):
for extension in OrganizationSourceExtension.objects.filter(
uid__in=extension_ids
):
aggregate = extension.records.aggregate(
records_count=Count("uid"),
first_seen_at=Min("created_at"),
@@ -540,13 +563,16 @@ class OrganizationSourceBackfillService:
url: str = "",
payload: dict[str, Any] | None = None,
) -> LegacyRecordAdapter:
normalized_inn, normalized_kpp, normalized_ogrn, normalized_ogrip = (
normalize_identity_fields(
inn=inn,
kpp=kpp,
ogrn=ogrn,
ogrip=ogrip,
)
(
normalized_inn,
normalized_kpp,
normalized_ogrn,
normalized_ogrip,
) = normalize_identity_fields(
inn=inn,
kpp=kpp,
ogrn=ogrn,
ogrip=ogrip,
)
return LegacyRecordAdapter(
source=str(descriptor.source),