Coverage for api/services/dadata.py: 33%
34 statements
« prev ^ index » next coverage.py v7.6.2, created at 2024-10-10 03:02 +0300
« prev ^ index » next coverage.py v7.6.2, created at 2024-10-10 03:02 +0300
1import asyncio
3import config
4from dadata import Dadata
5from exceptions import INNNotFound
6from logging_config import logger
7from sotrans_models.models.organizations import OrganizationCreateModel
8from sotrans_models.models.services.dadata import (
9 DadataOrganizationData,
10 OrgType,
11)
14class DadataAPI:
15 def __init__(self):
16 self.token = config.DadataConfig.DADATA_TOKEN
17 self.dadata = Dadata(self.token)
19 def _extract_data(self, result):
20 try:
21 data = result[0]["data"]
22 except IndexError:
23 logger.info("No data for inn")
24 raise INNNotFound
25 return {
26 "name_full_with_opf": data["name"]["full_with_opf"],
27 "name_short_with_opf": data["name"]["short_with_opf"],
28 "address": data["address"]["data"]["source"],
29 "ogrn": data["ogrn"],
30 "ogrn_date": str(data["ogrn_date"]),
31 "ownership_type": data["opf"]["short"],
32 "okopf": data["opf"]["code"],
33 "okved": data["okved"],
34 "okved_type": data["okved_type"],
35 "okato": data["okato"],
36 "oktmo": data["oktmo"],
37 "okpo": data["okpo"],
38 "okogu": data["okogu"],
39 "okfs": data["okved"],
40 "inn": data["inn"],
41 "registration_date": str(data["state"]["registration_date"]),
42 "status": data["state"]["status"],
43 "employee_count": data["employee_count"],
44 "okveds": data["okveds"],
45 "authorities": data["authorities"],
46 }
48 async def get_company_info(self, inn: str) -> DadataOrganizationData:
49 result = await asyncio.to_thread(self.dadata.find_by_id, "party", inn)
50 extracted_data = self._extract_data(result)
52 if result[0]["data"]["type"] == "LEGAL":
53 type_org = OrgType.LEGAL
54 # from pprint import pprint
55 # pprint(result)
56 extracted_data.update(
57 {
58 "kpp": result[0]["data"]["kpp"],
59 "management_name": result[0]["data"]["management"]["name"]
60 if result[0]["data"]["management"]
61 else None,
62 "management_post": result[0]["data"]["management"]["post"]
63 if result[0]["data"]["management"]
64 else None,
65 "finance_tax_system": result[0]["data"]["finance"][
66 "tax_system"
67 ]
68 if result[0]["data"]["finance"]
69 else None,
70 }
71 )
72 else:
73 type_org = OrgType.INDIVIDUAL
74 head = f"{result[0]['data']['fio']['surname']} {result[0]['data']['fio']['name']} {result[0]['data']['fio']['patronymic']}"
75 extracted_data["fio"] = head
77 org_data = DadataOrganizationData(**extracted_data, type=type_org)
78 return org_data
81async def verify_inn(inn: str) -> OrganizationCreateModel:
82 dadata_connector = DadataAPI()
83 # try:
84 dadata_response = await dadata_connector.get_company_info(inn)
85 # except INNNotFound:
86 # return False
87 organization_details = OrganizationCreateModel(
88 name=dadata_response.name_full_with_opf,
89 short_name=dadata_response.name_short_with_opf,
90 inn=dadata_response.inn,
91 head=dadata_response.fio,
92 ownership_type=dadata_response.ownership_type,
93 legal_address=dadata_response.address,
94 factual_address=dadata_response.address,
95 kpp=dadata_response.kpp,
96 ogrn=dadata_response.ogrn,
97 registration_date=str(dadata_response.ogrn_date),
98 # taxation_type=company_details.data.finance_tax_system, # Premium required
99 # ifns_code=company_details.data. ABSENT
100 # bik=company_details.data., ABSENT
101 # bank=company_details.data.bank, ABSENT
102 # email=company_details.data.email, ABSENT
103 # phone=company_details.data, ABSENT
104 # logo=company_details.data.im, ABSENT
105 )
106 return organization_details