Compare commits

...

5 Commits

Author SHA1 Message Date
nib4k f657ca77a4 Kz company details 2026-06-03 15:29:37 +03:00
nib4k 6982393d03 Check save file result 2026-06-03 15:29:30 +03:00
slrover 227905dc04 Updated docs 2026-04-03 16:52:44 +03:00
slrover e03aed78f0 Fixed reports request 2026-04-03 16:48:44 +03:00
slrover 65c04d1578 Updated sanctions lists output 2026-01-22 15:12:01 +03:00
9 changed files with 49 additions and 27 deletions
Binary file not shown.
Binary file not shown.
@@ -310,15 +310,18 @@
<span class="k">return</span> <span class="n">fal_data</span> <span class="k">return</span> <span class="n">fal_data</span>
<span class="k">def</span><span class="w"> </span><span class="nf">company_in_sanctions_lists</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span> <span class="k">def</span><span class="w"> </span><span class="nf">company_in_sanctions_lists</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Вхождение организации и ее руководителей в санкционные списки</span> <span class="w"> </span><span class="sd">&quot;&quot;&quot;Вхождение организации и ее руководителей в санкционные списки с датами вхождения по типам санкций</span>
<span class="sd"> :return: Признак присутствия или отсутствия в санкционных списках:\n</span> <span class="sd"> :return: Признак присутствия или отсутствия в санкционных списках:\n</span>
<span class="sd"> .. code-block:: python\n</span> <span class="sd"> .. code-block:: python\n</span>
<span class="sd"> {&#39;company_in_list&#39;: False, &#39;persons_in_company_in_list&#39;: False}</span> <span class="sd"> {&#39;company_in_list&#39;: False, \n</span>
<span class="sd"> &#39;persons_in_company_in_list&#39;: False, \n</span>
<span class="sd"> &#39;lists_dates&#39;: [{&#39;type&#39;: &#39;Sema&#39;, &#39;date&#39;: &#39;2025-12-15T00:00:00&#39;}]}</span>
<span class="sd"> :rtype: dict</span> <span class="sd"> :rtype: dict</span>
<span class="sd"> &quot;&quot;&quot;</span> <span class="sd"> &quot;&quot;&quot;</span>
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_focus_base_url</span><span class="si">}</span><span class="s1">/companies/lists&#39;</span><span class="p">)</span> <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_focus_base_url</span><span class="si">}</span><span class="s1">/companies/lists&#39;</span><span class="p">)</span>
<span class="n">sanctions_list</span> <span class="o">=</span> <span class="n">response</span><span class="p">[</span><span class="s1">&#39;sanctionsList&#39;</span><span class="p">]</span> <span class="n">sanctions_list</span> <span class="o">=</span> <span class="n">response</span><span class="p">[</span><span class="s1">&#39;sanctionsList&#39;</span><span class="p">]</span>
<span class="n">lists_data</span> <span class="o">=</span> <span class="n">response</span><span class="p">[</span><span class="s1">&#39;globalSanctionsList&#39;</span><span class="p">][</span><span class="s1">&#39;listDates&#39;</span><span class="p">]</span>
<span class="n">company_in_list</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">company_in_list</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">persons_in_company_in_list</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">persons_in_company_in_list</span> <span class="o">=</span> <span class="p">[]</span>
@@ -336,7 +339,8 @@
<span class="n">sanctions_lists_data</span> <span class="o">=</span> <span class="p">{</span> <span class="n">sanctions_lists_data</span> <span class="o">=</span> <span class="p">{</span>
<span class="s1">&#39;company_in_list&#39;</span><span class="p">:</span> <span class="kc">True</span> <span class="k">if</span> <span class="n">company_in_list</span> <span class="k">else</span> <span class="kc">False</span><span class="p">,</span> <span class="s1">&#39;company_in_list&#39;</span><span class="p">:</span> <span class="kc">True</span> <span class="k">if</span> <span class="n">company_in_list</span> <span class="k">else</span> <span class="kc">False</span><span class="p">,</span>
<span class="s1">&#39;persons_in_company_in_list&#39;</span><span class="p">:</span> <span class="kc">True</span> <span class="k">if</span> <span class="n">persons_in_company_in_list</span> <span class="k">else</span> <span class="kc">False</span> <span class="s1">&#39;persons_in_company_in_list&#39;</span><span class="p">:</span> <span class="kc">True</span> <span class="k">if</span> <span class="n">persons_in_company_in_list</span> <span class="k">else</span> <span class="kc">False</span><span class="p">,</span>
<span class="s1">&#39;lists_data&#39;</span><span class="p">:</span> <span class="n">lists_data</span>
<span class="p">}</span> <span class="p">}</span>
<span class="k">return</span> <span class="n">sanctions_lists_data</span> <span class="k">return</span> <span class="n">sanctions_lists_data</span>
+6 -2
View File
@@ -274,11 +274,15 @@
<dl class="py function"> <dl class="py function">
<dt class="sig sig-object py" id="kontur_focus.FocusCompliance.company_in_sanctions_lists"> <dt class="sig sig-object py" id="kontur_focus.FocusCompliance.company_in_sanctions_lists">
<span class="sig-name descname"><span class="pre">company_in_sanctions_lists</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#kontur_focus.FocusCompliance.company_in_sanctions_lists" title="Ссылка на это определение"></a></dt> <span class="sig-name descname"><span class="pre">company_in_sanctions_lists</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#kontur_focus.FocusCompliance.company_in_sanctions_lists" title="Ссылка на это определение"></a></dt>
<dd><p>Вхождение организации и ее руководителей в санкционные списки</p> <dd><p>Вхождение организации и ее руководителей в санкционные списки с датами вхождения по типам санкций</p>
<dl class="field-list simple"> <dl class="field-list simple">
<dt class="field-odd">Результат<span class="colon">:</span></dt> <dt class="field-odd">Результат<span class="colon">:</span></dt>
<dd class="field-odd"><p><p>Признак присутствия или отсутствия в санкционных списках:</p> <dd class="field-odd"><p><p>Признак присутствия или отсутствия в санкционных списках:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="p">{</span><span class="s1">&#39;company_in_list&#39;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span> <span class="s1">&#39;persons_in_company_in_list&#39;</span><span class="p">:</span> <span class="kc">False</span><span class="p">}</span> <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="p">{</span><span class="s1">&#39;company_in_list&#39;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="s1">&#39;persons_in_company_in_list&#39;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="s1">&#39;lists_dates&#39;</span><span class="p">:</span> <span class="p">[{</span><span class="s1">&#39;type&#39;</span><span class="p">:</span> <span class="s1">&#39;Sema&#39;</span><span class="p">,</span> <span class="s1">&#39;date&#39;</span><span class="p">:</span> <span class="s1">&#39;2025-12-15T00:00:00&#39;</span><span class="p">}]}</span>
</pre></div> </pre></div>
</div> </div>
</p> </p>
File diff suppressed because one or more lines are too long
+9 -1
View File
@@ -33,7 +33,7 @@ class Focus(Request):
return self.get('/egrDetails') return self.get('/egrDetails')
def excerpt(self, path: str = None) -> dict: def excerpt(self, path: str = None) -> dict:
"""Выписка из ЕГРЮЛ/ЕГРИП """Выписка из ЕГРЮЛ/ЕГРИП (только для РФ)
:param path: Путь выгрузки файла. Если не указан, выгружается в текущий каталог. :param path: Путь выгрузки файла. Если не указан, выгружается в текущий каталог.
:type path: str, необязательный :type path: str, необязательный
@@ -41,6 +41,8 @@ class Focus(Request):
:rtype: str :rtype: str
""" """
response = self.get('/excerpt') response = self.get('/excerpt')
if response.status_code != 404:
current_datetime = datetime.now().strftime('%d-%m-%Y_%H-%M') current_datetime = datetime.now().strftime('%d-%m-%Y_%H-%M')
filename = f'Выписка_{self.inn}_{current_datetime}.pdf' filename = f'Выписка_{self.inn}_{current_datetime}.pdf'
@@ -56,6 +58,8 @@ class Focus(Request):
return {'success': True, 'filename': filename, 'path': file_path} return {'success': True, 'filename': filename, 'path': file_path}
except Exception as e: except Exception as e:
return {'success': False, 'message': e} return {'success': False, 'message': e}
else:
return {'success': False, 'message': 'Not found'}
def express_report(self, pdf: bool = True, path: str = None) -> dict: def express_report(self, pdf: bool = True, path: str = None) -> dict:
"""Экспресс-отчет по контрагенту """Экспресс-отчет по контрагенту
@@ -145,3 +149,7 @@ class Focus(Request):
foreign_agents_list = next(lst for lst in self.government_lists() if lst['id'] == 'fcfc856d-89f8-408b-afef-56750cb90fed') foreign_agents_list = next(lst for lst in self.government_lists() if lst['id'] == 'fcfc856d-89f8-408b-afef-56750cb90fed')
return foreign_agents_list['isInList'] return foreign_agents_list['isInList']
def kz_company_details(self):
response = self.get('/kz/companyDetails', bin=self.inn)
return response[0] if response else None
+9 -3
View File
@@ -80,15 +80,18 @@ class FocusCompliance(Request):
return fal_data return fal_data
def company_in_sanctions_lists(self) -> dict: def company_in_sanctions_lists(self) -> dict:
"""Вхождение организации и ее руководителей в санкционные списки """Вхождение организации и ее руководителей в санкционные списки с датами вхождения по типам санкций
:return: Признак присутствия или отсутствия в санкционных списках:\n :return: Признак присутствия или отсутствия в санкционных списках:\n
.. code-block:: python\n .. code-block:: python\n
{'company_in_list': False, 'persons_in_company_in_list': False} {'company_in_list': False, \n
'persons_in_company_in_list': False, \n
'lists_dates': [{'type': 'Sema', 'date': '2025-12-15T00:00:00'}]}
:rtype: dict :rtype: dict
""" """
response = self.get(path=f'{self._focus_base_url}/companies/lists') response = self.get(path=f'{self._focus_base_url}/companies/lists')
sanctions_list = response['sanctionsList'] sanctions_list = response['sanctionsList']
lists_data = response['globalSanctionsList']['listDates']
company_in_list = [] company_in_list = []
persons_in_company_in_list = [] persons_in_company_in_list = []
@@ -106,7 +109,8 @@ class FocusCompliance(Request):
sanctions_lists_data = { sanctions_lists_data = {
'company_in_list': True if company_in_list else False, 'company_in_list': True if company_in_list else False,
'persons_in_company_in_list': True if persons_in_company_in_list else False 'persons_in_company_in_list': True if persons_in_company_in_list else False,
'lists_data': lists_data
} }
return sanctions_lists_data return sanctions_lists_data
@@ -225,6 +229,8 @@ class FocusCompliance(Request):
file_type='docx', file_type='docx',
path=path path=path
) )
if not result['success']:
return {'success': False, 'result': result['message']}
return {'success': True, 'file': result} return {'success': True, 'file': result}
except AttributeError: except AttributeError:
+2 -2
View File
@@ -36,8 +36,8 @@ class Request:
try: try:
response = requests.get(url=full_url, params=payload) response = requests.get(url=full_url, params=payload)
if response.headers['Content-Type'] == 'application/json' or \ if ('Content-Type' in response.headers and response.headers['Content-Type'] == 'application/json') or \
response.headers['Content-Type'] == 'application/json; charset=utf-8': ('Content-Type' in response.headers and response.headers['Content-Type'] == 'application/json; charset=utf-8'):
return response.json() return response.json()
else: else:
return response return response
+1 -1
View File
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
setup( setup(
name="kontur_focus", name="kontur_focus",
version="2025.12.1", version="2026.4.3",
author="Ilya Sapunov", author="Ilya Sapunov",
author_email="me@slrover.ru", author_email="me@slrover.ru",
description="Библиотека-обертка для взаимодействия с REST API Контур.Фокус и Фокус.Комплаенс", description="Библиотека-обертка для взаимодействия с REST API Контур.Фокус и Фокус.Комплаенс",