"""Factories for external data models.""" import factory from apps.external_data.models import ( ArbitrationCase, BankruptcyProcedure, DefenseUnreliableSupplier, FinancialReport, FinancialReportLine, IndustrialCertificate, IndustrialProduct, InformationSecurityRegistryEntry, LaborVacancy, ManufacturerRegistryEntry, ProsecutorCheck, PublicProcurement, ) from faker import Faker from tests.apps.organization.factories import OrganizationFactory fake = Faker("ru_RU") class IndustrialProductFactory(factory.django.DjangoModelFactory): class Meta: model = IndustrialProduct organization = factory.SubFactory(OrganizationFactory) product_name = factory.LazyAttribute(lambda _: fake.sentence(nb_words=3)) product_class = "electronics" okpd2_code = "26.51.53" tnved_code = "9015.10" 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 organization = factory.SubFactory(OrganizationFactory) registration_number = factory.Sequence(lambda n: f"{2_900_000_000 + n}") law_type = "294_fz" control_authority = "Центральное управление Ростехнадзора" prosecutor_office = "Московская городская прокуратура" start_date = factory.LazyAttribute(lambda _: fake.date_this_decade()) status = "planned" class PublicProcurementFactory(factory.django.DjangoModelFactory): class Meta: model = PublicProcurement organization = factory.SubFactory(OrganizationFactory) purchase_number = factory.Sequence(lambda n: f"{37_310_000_000_000_0000 + n:019d}") law_type = "44_fz" status = "signing" contract_amount = factory.LazyAttribute( lambda _: fake.pydecimal(left_digits=8, right_digits=2, positive=True) ) contract_date = factory.LazyAttribute(lambda _: fake.date_this_year()) execution_start_date = factory.LazyAttribute(lambda _: fake.date_this_year()) execution_end_date = factory.LazyAttribute( lambda _: fake.date_between(start_date="+30d", end_date="+365d") ) purchase_name = factory.LazyAttribute(lambda _: fake.sentence(nb_words=6)) class ArbitrationCaseFactory(factory.django.DjangoModelFactory): class Meta: model = ArbitrationCase organization = factory.SubFactory(OrganizationFactory) case_number = factory.Sequence(lambda n: f"А40-{16_000 + n}/2026") court_name = "Арбитражный суд города Москвы" party_role = "defendant" status = "hearing_scheduled" decision_date = factory.LazyAttribute(lambda _: fake.date_this_year()) class InformationSecurityRegistryEntryFactory(factory.django.DjangoModelFactory): class Meta: model = InformationSecurityRegistryEntry organization = factory.SubFactory(OrganizationFactory) registry_name = "Реестр лицензий на деятельность по технической защите конфиденциальной информации" presence_status = "present" entry_number = "77-001234" issued_at = factory.LazyAttribute(lambda _: fake.date_this_year()) expires_at = factory.LazyAttribute(lambda _: fake.date_this_year()) class BankruptcyProcedureFactory(factory.django.DjangoModelFactory): class Meta: model = BankruptcyProcedure organization = factory.SubFactory(OrganizationFactory) external_id = factory.Sequence(lambda n: f"fedresurs:{n}") message_type = "Сообщение о намерении" message_date = factory.LazyAttribute(lambda _: fake.date_this_year()) case_number = factory.Sequence(lambda n: f"А40-{20_000 + n}/2026") status = "published" source_url = factory.Sequence(lambda n: f"https://fedresurs.ru/message/{n}") class DefenseUnreliableSupplierFactory(factory.django.DjangoModelFactory): class Meta: model = DefenseUnreliableSupplier organization = factory.SubFactory(OrganizationFactory) external_id = factory.Sequence(lambda n: f"fas-goz:{n}") registry_source = "fas_goz" registry_number = factory.Sequence(lambda n: f"ГОЗ-{n:04d}") supplier_name = factory.LazyAttribute(lambda obj: obj.organization.name) reason = "Уклонение от заключения контракта" included_at = factory.LazyAttribute(lambda _: fake.date_this_year()) status = "active" source_url = factory.Sequence(lambda n: f"https://fas.gov.ru/register/{n}") class LaborVacancyFactory(factory.django.DjangoModelFactory): class Meta: model = LaborVacancy organization = factory.SubFactory(OrganizationFactory) external_id = factory.Sequence(lambda n: f"trudvsem:{n}") vacancy_source = "trudvsem" title = "Инженер-испытатель" status = "open" 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