Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| de881f4d15 | |||
| 4cc7d0ac7b |
@@ -86,6 +86,29 @@ class Focus(Request):
|
|||||||
return {'success': False, 'message': e}
|
return {'success': False, 'message': e}
|
||||||
else:
|
else:
|
||||||
return response
|
return response
|
||||||
|
|
||||||
|
def finan(self, path: str = None):
|
||||||
|
"""В файле указана рейтинговая таблица и окончательное заключение о финансовых показателях компании.
|
||||||
|
|
||||||
|
:param path: Путь выгрузки файла. Если не указан, выгружается в текущий каталог, defaults to None
|
||||||
|
:type path: str, optional
|
||||||
|
"""
|
||||||
|
response = self.get('/finan')
|
||||||
|
current_datetime = datetime.now().strftime('%d-%m-%Y_%H-%M')
|
||||||
|
filename = f'Финансовый_анализ_{self.inn}_{current_datetime}.pdf'
|
||||||
|
|
||||||
|
if not path:
|
||||||
|
file_path = os.path.join(self._basedir, filename)
|
||||||
|
else:
|
||||||
|
file_path = os.path.join(path, filename)
|
||||||
|
|
||||||
|
try:
|
||||||
|
with open(file_path, mode='wb') as file:
|
||||||
|
file.write(response.content)
|
||||||
|
|
||||||
|
return {'success': True, 'filename': filename, 'path': file_path}
|
||||||
|
except Exception as e:
|
||||||
|
return {'success': False, 'message': e}
|
||||||
|
|
||||||
def founders_history(self):
|
def founders_history(self):
|
||||||
"""История владения организацией
|
"""История владения организацией
|
||||||
|
|||||||
@@ -7,6 +7,18 @@ from datetime import datetime
|
|||||||
class FocusCompliance(Request):
|
class FocusCompliance(Request):
|
||||||
_basedir = os.path.abspath(os.path.dirname(__file__))
|
_basedir = os.path.abspath(os.path.dirname(__file__))
|
||||||
_focus_base_url = None
|
_focus_base_url = None
|
||||||
|
check_models = [
|
||||||
|
{
|
||||||
|
'name': 'corporate',
|
||||||
|
'description': 'Корпоративный сегмент',
|
||||||
|
'risk_model_id': 'a9457161-0454-448a-bc2c-83a89cd51b42'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': '115-fz',
|
||||||
|
'description': '115 ФЗ для некредитных финансовых организаций',
|
||||||
|
'risk_model_id': '887ee87c-3a43-48d7-a4ad-05c0a64ff53a'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
def __init__(self, inn: str = None, ogrn: str = None):
|
def __init__(self, inn: str = None, ogrn: str = None):
|
||||||
load_dotenv()
|
load_dotenv()
|
||||||
@@ -67,24 +79,33 @@ class FocusCompliance(Request):
|
|||||||
|
|
||||||
return fal_data
|
return fal_data
|
||||||
|
|
||||||
def search_global_company_profiles_id(self) -> list:
|
def search_global_company_profiles_id(self, company_name: str = None) -> list:
|
||||||
"""Поиск сводной информации по санкционным профилям ЮЛ
|
"""Поиск сводной информации по санкционным профилям ЮЛ
|
||||||
|
|
||||||
|
:param company_name: Наименование компании
|
||||||
|
:type company_name: str
|
||||||
:return: Список идентификаторов профилей
|
:return: Список идентификаторов профилей
|
||||||
:rtype: list
|
:rtype: list
|
||||||
"""
|
"""
|
||||||
|
if self.inn:
|
||||||
|
query = self.inn
|
||||||
|
elif company_name:
|
||||||
|
query = company_name
|
||||||
|
else:
|
||||||
|
return {'success': False, 'result': 'Не указан ИНН или наименование контрагента'}
|
||||||
|
|
||||||
try:
|
try:
|
||||||
response = self.get(f'{self._focus_base_url}/companies/profiles/search', query=self.inn)
|
response = self.get(f'{self._focus_base_url}/companies/profiles/search', query=query)
|
||||||
profiles = response['legalEntityProfiles']
|
profiles = response['legalEntityProfiles']
|
||||||
|
|
||||||
if not profiles:
|
if not profiles:
|
||||||
return profiles
|
return {'success': True, 'result': profiles}
|
||||||
elif len(profiles) > 1:
|
elif len(profiles) > 1:
|
||||||
return [profile['id'] for profile in profiles]
|
return {'success': True, 'result': [profile['id'] for profile in profiles]}
|
||||||
else:
|
else:
|
||||||
return [profiles[0]['id']]
|
return {'success': True, 'result': [profiles[0]['id']]}
|
||||||
except KeyError:
|
except KeyError:
|
||||||
return None
|
return {'success': False, 'result': 'Key Error'}
|
||||||
|
|
||||||
def legal_entity_profile_report(self, profile_id_list: list, path: str = None) -> dict:
|
def legal_entity_profile_report(self, profile_id_list: list, path: str = None) -> dict:
|
||||||
"""Получение печатного отчета по профилю ЮЛ
|
"""Получение печатного отчета по профилю ЮЛ
|
||||||
@@ -123,6 +144,33 @@ class FocusCompliance(Request):
|
|||||||
|
|
||||||
return {'success': True, 'files': [result]}
|
return {'success': True, 'files': [result]}
|
||||||
|
|
||||||
|
def full_company_report(self, model: str = '115-fz', path: str = None) -> dict:
|
||||||
|
"""Запрос на полную проверку и построение печатного отчёта по организации
|
||||||
|
|
||||||
|
:param model: Идентификатор модели, по которой пройдет проверка.
|
||||||
|
Идентификатор возвращается в методе «Получение списка рисковых моделей организации»
|
||||||
|
GET /banks/{bankId}/models, defaults to '115-fz'
|
||||||
|
:type model: str, optional
|
||||||
|
:param path: Путь сохранения файла, по-умолчанию файл сохраняется в текущий каталог, defaults to None
|
||||||
|
:type path: str, optional
|
||||||
|
:return: Отчет о результате сохранения файла
|
||||||
|
:rtype: dict
|
||||||
|
"""
|
||||||
|
if model == '115-fz':
|
||||||
|
model_id = [d['risk_model_id'] for d in self.check_models if d['name'] == model][0]
|
||||||
|
else:
|
||||||
|
model_id = [d['risk_model_id'] for d in self.check_models if d['name'] == 'corporate'][0]
|
||||||
|
|
||||||
|
response = self.get(f'{self._focus_base_url}/models/{model_id}/fullCompanyReport')
|
||||||
|
result = self._save_file(
|
||||||
|
filename='Полный_отчет',
|
||||||
|
content=response.content,
|
||||||
|
file_type='docx',
|
||||||
|
path=path
|
||||||
|
)
|
||||||
|
|
||||||
|
return {'success': True, 'files': [result]}
|
||||||
|
|
||||||
# Физлица
|
# Физлица
|
||||||
def person_is_foreign_agent(self):
|
def person_is_foreign_agent(self):
|
||||||
"""Вхождение физлица в список иностранных агентов
|
"""Вхождение физлица в список иностранных агентов
|
||||||
@@ -148,6 +196,35 @@ class FocusCompliance(Request):
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def full_individual_report(self, path: str = None, passport: str = None, fio: str = None) -> dict:
|
||||||
|
"""Запрос на построение печатного отчёта по физ лицу
|
||||||
|
Необходимо обязательно указать либо ИНН, либо ФИО и номер паспорта
|
||||||
|
|
||||||
|
:param path: Путь сохранения файла, по-умолчанию файл сохраняется в текущий каталог, defaults to None
|
||||||
|
:type path: str, optional
|
||||||
|
:param passport: Номер паспорты, defaults to None
|
||||||
|
:type passport: str, optional
|
||||||
|
:param fio: ФИО (хотя бы фамилия и имя), defaults to None
|
||||||
|
:type fio: str, optional
|
||||||
|
:return: Отчет о результате сохранения файла
|
||||||
|
:rtype: dict
|
||||||
|
"""
|
||||||
|
if self.inn:
|
||||||
|
response = self.get(path=f'{self._focus_base_url}/formFullIndividualReport')
|
||||||
|
if not self.inn and passport and fio:
|
||||||
|
response = self.get(path=f'{self._focus_base_url}/formFullIndividualReport', passportNumber=passport, fio=fio)
|
||||||
|
else:
|
||||||
|
return {'success': True, 'result': 'Необходимо указать: либо ИНН, либо ФИО (хотя бы фамилию и имя) и паспорт'}
|
||||||
|
|
||||||
|
result = self._save_file(
|
||||||
|
filename='Полный_отчет',
|
||||||
|
content=response.content,
|
||||||
|
file_type='docx',
|
||||||
|
path=path
|
||||||
|
)
|
||||||
|
|
||||||
|
return {'success': True, 'files': [result]}
|
||||||
|
|
||||||
# Иноагенты
|
# Иноагенты
|
||||||
def get_foreign_agents_list(self, fa_type: str = None) -> list: # Не работает, если нет подключенной лицензии
|
def get_foreign_agents_list(self, fa_type: str = None) -> list: # Не работает, если нет подключенной лицензии
|
||||||
"""Получение списка иноагентов
|
"""Получение списка иноагентов
|
||||||
|
|||||||
2
setup.py
2
setup.py
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
|
|||||||
|
|
||||||
setup(
|
setup(
|
||||||
name="kontur_focus",
|
name="kontur_focus",
|
||||||
version="2025.9.0",
|
version="2025.11.0",
|
||||||
author="Ilya Sapunov",
|
author="Ilya Sapunov",
|
||||||
author_email="sapunov@selectel.ru",
|
author_email="sapunov@selectel.ru",
|
||||||
description="Библиотека-обертка для взаимодействия с REST API Контур.Фокус и Фокус.Комплаенс",
|
description="Библиотека-обертка для взаимодействия с REST API Контур.Фокус и Фокус.Комплаенс",
|
||||||
|
|||||||
Reference in New Issue
Block a user