Русский
Русский
English
Статистика
Реклама

Юристам салют

Как нарисовать холдинг, цепочки владения и посчитать доли КИК

28.10.2020 18:06:09 | Автор: admin
В юридической практике корпоративных юристов относительно недавно (несколько лет назад) появилась необходимость составлять и подавать уведомления о контролируемых иностранных компаниях (КИК) в рамках ст. 25.13 НК РФ. Суть этой обязанности составить и подать документ, в котором будут отражены все связи общества в холдинге по цепочкам от текущего ООО (АО) в РФ до владельца- налогового резидента РФ КИК. Говоря проще, если офшором владеет россиянин (налоговый резидент РФ), а офшор российским ООО (даже через забор промежуточных ООО) более 25 % уведомлению быть. Изюминка в том, что подавать необходимо всем ООО (АО) в которых эта ситуация наблюдается и подавать как сведения о владении более 25%, так и последующие изменения доли владения своевременно, иначе штрафы (100 000 рублей по каждой компании в цепочке ст. 129.6 НК РФ). Так как холдинг (совокупность юр. лиц) организм живой и постоянные изменения долей владения неизбежны, за всем этим надо как-то следить, чтобы не насобирать штрафов. Как упростить работу в данном направлении, автоматизировать ее, посвящена данная статья. Статья также будет интересна с точки зрения графического представления связанных структур, например соц. сетей.


В данной статье не будем останавливаться на юридических аспектах подаваемых уведомлений о КИК, об участии в КИК, рассмотрим техническую сторону вопроса.
Бесспорно, если холдинг, о котором идет речь представляет себя простые структуры вида ООО->КИК->россиянин, то, что-то строить здесь с привлечением машины нецелесообразно, другое дело, если структура ветвится, двоится и нет числа этим сплетениям.
Рассмотрим несколько существующих графических решений, которые упростят работу.
Для удобства визуализации будет использоваться среда jupyter notebook и python.

Networkx.


Данное решение самое древнее из представленных и не может похвастаться своей интерактивностью. О данном пакете есть такая же древняя статья на Хабре.
Однако старое не значит плохое, и данный вариант один из наиболее удачных как в плане рисования, так и в вычислительном.
Установим и импортируем модуль через jupyter:
!pip install networkximport networkx as nx

Также импортируем иные доп. модули, которые помогут нарисовать фигуры:
from matplotlib import pyplot as plt%matplotlib inlineplt.rcParams.update({    'figure.figsize': (7.5, 7.5),    'axes.spines.right': False,    'axes.spines.left': False,    'axes.spines.top': False,    'axes.spines.bottom': False})

Построим с помощью networkx первую сеть:
from pathlib import Pathdata_dir = Path('.') / 'data'# Read edge listG = nx.read_edgelist('example.edgelist')# Draw network#pos = nx.spring_layout(G)pos = nx.spectral_layout(G)#pos = nx.planar_layout(G)nx.draw_networkx(G, pos)plt.gca().margins(0.15, 0.15)

Вот, что получилось:

Как видно, Иванов владеет двумя КИКами, которые, в свою очередь, владеют российскими юр. лицами.

Разберем код выше.
Импортировали модуль и указали откуда будем считывать данные на диске:
from pathlib import Pathdata_dir = Path('.') / 'data'

В текущей директории считали 'example.edgelist':
G = nx.read_edgelist('example.edgelist')

*example.edgelist это обычный текстовый файл вида:
# source targetИванов КИК1Иванов КИК2КИК1 КИК2КИК1 Ромашка_ОООКИК2 Ведро_АО

Значения записаны кто-кем владеет с пробелом между ними.
Далее определили как будет выглядеть сеть:
pos = nx.spectral_layout(G)

Если поменять на pos = nx.spring_layout(G), то она примет вид:

И это расположение, как ни странно, наиболее подходящее для более масштабных структур.
Наконец, нарисовали сеть, обозначив отступы:
nx.draw_networkx(G, pos)plt.gca().margins(0.15, 0.15)

Сохранить картинку просто:
plt.savefig('plot.png')


Как нарисовать сегмент в networkx.


#подграфикH = G.subgraph(['Иванов', 'КИК1', 'Ромашка_ООО'])plt.subplot(212) print("Подграфик:") nx.draw_networkx(H)

Здесь мы отступы не сделали, и названия уехали:


Networkx оперирует понятиями нод(nodes) и связей(edges) между ними. В нашей ситуации ноды это Иванов, КИК1, КИК2, Ромашка_ООО, Ведро_АО. А связи то, что находится в файле example.edgelist.
Посмотреть и то и другое можно просто, обратившись к методам G.nodes и G.edges:


Направленный график в networkx (Directed edge list).


Проясним немного построенную сеть, добавим стрелочки:
# Read edge listG = nx.read_edgelist(    str('example.edgelist'),    create_using=nx.DiGraph)pos = nx.spectral_layout(G)# Draw networknx.draw_networkx(G, pos, arrowsize=20)plt.gca().margins(0.15, 0.15)

Небольшие изменения позволили нарисовать более внятную картину кто кем владеет:

В коде, как можно заметить, изменения минимальны.

Следующий этап построение графика, где будут видны размеры пакетов владения.
Для этого надо познакомиться с понятием веса (weight) это третий основной параметр, с которым может работать networkx. Чтобы его включить в работу, в текстовый файл надо добавить эти самые веса, например так:
# source targetИванов КИК1 100Иванов КИК2 100КИК1 КИК2 50КИК1 Ромашка_ООО 100КИК2 Ведро_АО 100

Теперь заново построим сеть, используя уже веса и обозначим их на графике:
# Read edge listG = nx.read_weighted_edgelist(    str('example2.edgelist'))# Extract weightsweights = [d['weight'] for s, t, d in G.edges(data=True)]nx.draw_networkx(G,pos)labels = nx.get_edge_attributes(G,'weight')nx.draw_networkx_edge_labels(G,pos,edge_labels=labels)plt.gca().margins(0.15, 0.15)

*example2.edgelist это файл, который сформирован выше с весами.
Получим вот такую картину:


Кто кем и как владеет, networkx.


Теперь нам как юристам-программистам, надо понять, в какой последовательности и в каком размере владеет Иванов, например компанией Ведро_АО и владеет ли вообще. Это требуется, чтобы определить в разветвленном холдинге факт владения и все цепочки до целевой ООО (АО), чтобы потом эти цепочки прописать в уведомление по КИК.

С помощью networkx сделать это можно следующим образом:
list(nx.all_simple_paths(G,'Иванов', 'Ведро_АО'))

В качестве первого аргумента идет нода-владелец, вторым нода, до которой мы будем строить пути.
Используя данный метод можно увидеть, что Ведром_АО Иванов владеет по следующим цепочкам:
[['Иванов', 'КИК1', 'КИК2', 'Ведро_АО'], ['Иванов', 'КИК2', 'Ведро_АО']]

Графически это подтверждается.
Узнать долю владения можно перемножив веса между соответствующими нодами: 1*0,5*1=0,5, 1*1=1. Доля более 25%, уведомление необходимо подавать.
В коде перемножение делается следующими костылями (более изящный метод пока не найден):
x=0b=0c=[]for i in list(nx.all_simple_paths(G,'Иванов', 'Ведро_АО')):        for a in i:                if x>len(i)-2:            pass                                else:                        b=int(nx.bidirectional_dijkstra(G, i[x],i[x+1])[0])#доля владения                                   x+=1            c.append(b/100)              print(c)import numpy as npprint(np.prod(c))

x=0b=0c=[]for i in list(nx.all_shortest_paths(G,'Иванов', 'Ведро_АО')):    for a in i:                if x>len(i)-2:            pass                              else:                        b=int(nx.bidirectional_dijkstra(G, i[x],i[x+1])[0])#доля владения                                   x+=1            c.append(b/100)              print(c)import numpy as npprint(np.prod(c))

В первом случае выведет долю 0,5, во втором 1.

Какие еще есть доступные варианты визуализации? Например, Netwulf.

Netwulf


Документация находится здесь.

Сама сеть интерактивна, в этом ее основной плюс. После установки python пакета, построим сеть:
import netwulf as nwplt.figure(figsize=(200,200))G = nx.read_weighted_edgelist(str('example2.edgelist'),create_using=nx.DiGraph)pos = nx.spring_layout(G)nw.visualize(G)

После запуска кода, jupyter подвисает, а в дополнительно открывшемся окне браузера виден результат:

Справа на панели видны опции, изменение которых влияет в режиме онлайн на построенную сеть.
Минус данного пакета пока нельзя отобразить веса и стрелки между нодами, но авторы обещали это доработать.
*чтобы вернуться в jupyter понадобится нажать на опцию post to python:


Еще один неплохой вариант подобной визуализации для python молодой проект webweb.

Webweb.


Документация здесь.
Строится сеть схожим образом:
from webweb import Webweb = Web(title='kitchen_sink')web.display.networkName = 'tree'web.display.networkLayer = 2web.display.colorBy = 'ring'web.display.sizeBy = 'degree'web.display.gravity = .3web.display.charge = 30web.display.linkLength = 15web.display.colorPalette = 'Greens'web.display.scaleLinkOpacity = Falseweb.display.scaleLinkWidth = Truefrom pathlib import Pathdata_dir = Path('.') / 'data'# Read edge listG = nx.read_edgelist('example.edgelist',create_using=nx.DiGraph)plt.figure(figsize=(200,200))# Draw networkpos = nx.spring_layout(G)Web(list(G.edges)).show()



Из явных преимуществ перед netwulf: возможность выделения цветом ключевых нод, текстовый поиск нод с подсветкой на сети:


Резюмируя, можно сказать, что развивающиеся потомки networkx netwulf и webweb хороши для построения быстрой картинки структуры небольшого холдинга. У обоих модулей есть режим freeze, чтобы заморозить ноды, которые слипаются в одну кучу в силу интерактивности графика. Однако даже используя их непросто работать с масштабными структурами, где количество нод больше 200.

Подножка от Минфина, перекрестное и кольцевое владение.


Все было бы совсем хорошо при построении подобных структур, если бы не одно но, которое портит всю картину. Это но заключается в том, что в холдингах общества владеют сами собой через другие юр. лица и это называется либо перекрестное либо кольцевое владение.
На картинках в письмах от Минфина (например от 02.07.2013 ОА-4-13/11912) это выглядит так.
Перекрестное владение:

Кольцевое:


Посмотрим, как определит связи networkx для схемы перекрестного владения участия D в B.
Создадим edgelist со связями:
# source targetD B 45B A 40A B 55E A 60

Построив сеть с весами, можно увидеть, что обратная связь между A и B не отражена:

Ее можно увидеть, если построить сеть без весов, со стрелками:


Что с расчетами? Какова совокупная доля D в B?
Тут кажется все прозрачно, 45%
И networkx выдает при команде list(nx.all_simple_paths(G,'D', 'B')):
[['D', 'B']]
Но не все так просто.
Минфин говорит, совокупная доля D в B определяется по формуле:

И составит 57,69%.

Что делать? networkx бессильна?
Вовсе нет, networkx позволит выявить подобные ситуации, но вот формула расчета будет другой, согласно букве Закона.
Частично проблему можно снять, добавив в edgelist записи
A A
B B
Далее командой list(nx.nodes_with_selfloops(G)) можно посмотреть ноды с участием в самих себе, но при определении путей из D в B это все равно не учитывается.

jupyter тетрадка скачать здесь.
Подробнее..

Маяки в ЕГРЮЛ с python

21.05.2021 10:23:30 | Автор: admin

На сайте nalog.ru есть очень удобный сервис, который покрывает такие страхи владельца бизнеса как увод компании из под контроля без участия самого владельца. Отчасти естественно покрывает, так как если захотят увести компанию, один сервис налоговой в этом не поможет.
Сервис уведомляет владельца предприятия, если в налоговую попало заявление о внесении каких-либо изменений в отношении данных компании, содержащихся в ЕГРЮЛ. Далее владелец может среагировать на ситуацию, заблокировав регистрацию изменений, если они не были им инициированы. Чтобы реализовать этот своеобразный мониторинг, необходимо поставить на компанию так называемый маяк. В данной статье посмотрим, как работает сервис, как и кто может поставить маяки, сколько их можно поставить и как все это сделать пакетно с помощью python.
Сам сервис находится по адресу на сайте налоговой здесь.

Немного о страхах за бизнес.



Ссылка на оригинал картинки.
До появления описанных возможностей по мониторингу данных компании в ЕГРЮЛ было все грустно. Чтобы случайно не проснуться и узнать, что ты больше не владелец компании, каждый собственник придумывал свои решения. Один заказывал с регулярной периодичностью выписки ЕГРЮЛ на бумаге, что вовсе не гарантировало, что по истечение 7 дней компания не изменит владельца, другой с такой же регулярностью заглядывал в электронный ЕГРЮЛ, надеясь поймать неблагоприятный момент, третий договаривался в самой налоговой, оставляя там соответствующие письма-пожелания.
Можно долго рассуждать на тему, что ранее практика была не совершенна, и через институт добросовестного приобретателя можно было приобрести чужую компанию. Владелец узнавал об этом постфактум, когда ничего уже сделать было нельзя.

Как работает сервис сейчас.



Ссылка на оригинал картинки.
Все сделано очень удобно.
Сервис предоставляет возможность заинтересованному лицу (любому лицу) сформировать запрос о направлении по указанному им адресу электронной почты информации о факте представления в налоговый орган после размещения такого запроса документов в отношении указанного в таком запросе юридического лица, индивидуального предпринимателя.

Запрашиваемая информация будет направляться налоговым органом на адрес электронной почты (E-mail), указанный при регистрации (авторизации) заявителя в сервисе, не позднее рабочего дня, следующего за днем получения налоговым органом документов в отношении указанного в запросе юридического лица, индивидуального предпринимателя, в виде сообщения.
Вот как выглядит данное сообщение:


О чем оно говорит? В сообщении говорится о том, что кто-то подал заявление о внесении изменений в ЕГРЮЛ и, если ничего не делать, эти изменения произойдут. Какие изменения, налоговая не раскрывает.

Чтобы поставить маяк на компанию после авторизации надо подать новый запрос, нажав на кнопку Новый запрос:

Далее необходимо вбить ОГРН либо ОГРНИП, нажать добавить:


Все просто и бесплатно. Данную процедуру придется повторять всего лишь 1 раз в год. По истечение срока будет уведомление, что сроки заканчиваются.
Единственное неудобство это 100 маяков (ранее было 50) на одного зарегистрированного в системе и придется регистрировать несколько аккаунтов, если обществ для мониторинга много:


Еще одно неудобство при добавлении новой компании в мониторинг, сервис подвисает, видимо, что-то проверяя:

В общем, на 100 запросов может уйти продолжительное время.
Чтобы это превозмочь, воспользуемся python.

Из пушки по воробьям.



Ссылка на оригинал картинки.
Может кто-то сказать. Тем не менее, если программа сэкономит кому-то пару часов рабочего времени это приятно.
Итак, наша программа на python будет заходить на сайт сервиса, авторизоваться, устанавливать маяки на общества по ОГРН, беря последние из excel-таблицы.
Импорты:
from selenium import webdriverfrom selenium.webdriver.common.keys import Keysimport timeimport openpyxl

Авторизация на сайте:
browser = webdriver.Firefox()time.sleep (5)browser.get ('https://service.nalog.ru/regmon/')time.sleep(5)act = browser.find_element_by_id('email')act.click()for i in 'email@yandex.ru':        act.send_keys(i)        time.sleep (0.1)        act = browser.find_element_by_id('password')act.click()i=0for i in 'password':        act.send_keys(i)        time.sleep (0.1)act.submit()time.sleep(5)

*не забываем email и пароль указать.

Открываем таблицу, берем из нее данные и используем их во благо:
wb = openpyxl.load_workbook('ВыпискиЕГРЮЛ.xlsx')sheet=wb.get_sheet_by_name('Лист1')# столбец с выписками ЕГРЮЛx=2#a = tuple (str(sheet.cell(row=x, column=1).value)) # получаем кортеж из ОГРН в ячейке A2for x in range (2,sheet.max_row):        a = str(sheet.cell(row=x, column=1).value).strip()        if a=='None':            pass        else:                a = tuple (str(sheet.cell(row=x, column=1).value).strip())                 act = browser.find_element_by_css_selector('.float-right > button:nth-child(1)')                act.click()                time.sleep(4)                act = browser.find_element_by_id('ogrn')                act.click()                                # вводим посимвольно в строку ОГРН, т.к. ввод сразу всего ОГРН не корректно обрабатывается                i=0                for i in range (13):                        act.send_keys(a[i])                        time.sleep (0.05)                        i+=1                act = browser.find_element_by_css_selector('div.regmon-tab-content:nth-child(3) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > button:nth-child(2)')                act.click()                time.sleep(15)                try:                        act = browser.find_element_by_css_selector('.btn-alert')                except:                        time.sleep(10)                        act = browser.find_element_by_css_selector('.btn-alert')                act.click()                time.sleep(3)                x += 1browser.quit()


После того, как программа отработает на сервисе будет таблица примерно следующего вида:


Маяки поставлены, спасибо за внимание.

Ссылка на оригинал картинки и анекдот оттуда
Заказчик на объекте принимает работу у подрядчика.
Тот подводит его к выкопанной шахте диаметром 3 метра и глубиной 50 метров, заглядывают туда, а на дне горит прожектор.
Заказчик: Что за херня???
Подрядчик: Вот же чертеж! По нему и сделали.
Заказчик (переворачивая чертеж на 180 градусов): Это маяк, бл*! МАЯК!

Скачать программу и тестовую excel-таблицу здесь.
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru