Cara menggambar perusahaan induk, rantai kepemilikan, dan menghitung saham CFC

Dalam praktik hukum pengacara korporat, relatif baru-baru ini (beberapa tahun yang lalu), menjadi perlu untuk menyusun dan menyampaikan pemberitahuan tentang perusahaan asing yang dikendalikan (CFC) berdasarkan Art. 25.13 dari Kode Pajak Federasi Rusia. Inti dari kewajiban ini adalah untuk menyusun dan menyerahkan dokumen yang akan mencerminkan semua koneksi perusahaan dalam holding di sepanjang rantai dari LLC (JSC) saat ini di Federasi Rusia ke pemilik pajak penduduk Federasi Rusia CFC. Sederhananya, jika lepas pantai dimiliki oleh Rusia (penduduk pajak Federasi Rusia), dan lepas pantai LLC Rusia (bahkan melalui pagar LLC menengah) lebih dari 25% - akan ada pemberitahuan. Sorotannya adalah bahwa perlu untuk menyerahkan kepada semua LLC (JSCs) di mana situasi ini diamati dan untuk menyerahkan baik informasi tentang kepemilikan lebih dari 25% dan perubahan selanjutnya dalam bagian kepemilikan pada waktu yang tepat, jika tidak denda (100.000 rubel untuk setiap perusahaan dalam rantai - Pasal 129.6 Kode Pajak Federasi Rusia).Karena kepemilikan (sekumpulan badan hukum) adalah organisme hidup dan perubahan kepemilikan saham secara konstan tidak dapat dihindari, semua ini perlu untuk dipantau agar tidak dikenakan denda. Cara menyederhanakan pekerjaan ke arah ini, mengotomatiskannya, artikel ini dikhususkan. Artikel juga akan menarik dari sudut pandang penyajian grafis dari struktur terkait, misalnya sosial. jaringan.







Dalam artikel ini, kami tidak akan membahas aspek hukum dari pemberitahuan yang diajukan tentang CFC, tentang partisipasi dalam CFC, kami akan mempertimbangkan sisi teknis dari masalah tersebut.



Tidak diragukan lagi, jika perusahaan induk yang bersangkutan menampilkan dirinya sebagai struktur sederhana dari tipe LLC-> KIK-> Rusia, maka tidak praktis untuk membangun sesuatu di sini dengan keterlibatan mesin, itu masalah lain jika strukturnya bercabang, berlipat ganda dan tidak ada jumlah jalinan ini.



Mari kita lihat beberapa solusi grafis yang ada yang akan menyederhanakan pekerjaan Anda.

Untuk kenyamanan visualisasi, notebook jupyter dan lingkungan python akan digunakan.



Networkx



Solusi ini adalah yang tertua dari yang disajikan dan tidak dapat membanggakan interaktivitasnya. Ada artikel kuno yang sama tentang paket ini di Habré.



Namun, lama bukan berarti buruk, dan opsi ini adalah salah satu yang paling sukses dalam hal menggambar dan komputasi.



Instal dan impor modul melalui jupyter:



!pip install networkx
import networkx as nx


Kami juga mengimpor add lainnya. modul yang akan membantu Anda menggambar bentuk:



from matplotlib import pyplot as plt
%matplotlib inline
plt.rcParams.update({
    'figure.figsize': (7.5, 7.5),
    'axes.spines.right': False,
    'axes.spines.left': False,
    'axes.spines.top': False,
    'axes.spines.bottom': False})


Mari membangun jaringan pertama menggunakan networkx:



from pathlib import Path
data_dir = Path('.') / 'data'
# Read edge list
G = 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)


Inilah yang terjadi:







Seperti yang Anda lihat, Ivanov memiliki dua CFC, yang, pada gilirannya, memiliki badan hukum Rusia. oleh orang.



Mari kita analisis kode di atas.



Kami mengimpor modul dan menentukan di mana kami akan membaca data pada disk dari:



from pathlib import Path
data_dir = Path('.') / 'data'


Direktori saat ini dianggap sebagai 'example.edgelist':



G = nx.read_edgelist('example.edgelist')


* example.edgelist adalah file teks biasa seperti ini:



# source target
 1
 2
1 2
1 _
2 _


Nilai-nilai tersebut dicatat oleh seseorang dengan spasi di antaranya.



Selanjutnya, kami menentukan bagaimana jaringan akan terlihat:



pos = nx.spectral_layout(G)


Jika kita mengubah ke pos = nx.spring_layout (G), maka akan berbentuk:







Dan anehnya, susunan ini paling cocok untuk struktur yang lebih besar.



Akhirnya, kami menarik jaring, menandai indentasi:



nx.draw_networkx(G, pos)
plt.gca().margins(0.15, 0.15)


Sangat mudah untuk menyimpan gambar:



plt.savefig('plot.png')


Cara menggambar segmen di networkx



#
H = G.subgraph(['', '1', '_'])
plt.subplot(212) 
print(":") 
nx.draw_networkx(H)


Kami tidak membuat







indentasi di sini, dan nama "kiri": Networkx beroperasi dengan konsep node dan tautan di antara mereka. Dalam situasi kami, node tersebut adalah Ivanov, KIK1, KIK2, Romashka_OOO, Bucket_AO. Dan tautannya adalah apa yang ada di file example.edgelist.



Anda dapat melihat keduanya hanya dengan mengacu pada metode G.nodes dan G.edges:







Grafik arah di networkx (Daftar tepi terarah)



Mari kita perjelas sedikit jaringan yang dibangun, tambahkan panah:



# Read edge list
G = nx.read_edgelist(
    str('example.edgelist'),
    create_using=nx.DiGraph)
pos = nx.spectral_layout(G)
# Draw network
nx.draw_networkx(G, pos, arrowsize=20)
plt.gca().margins(0.15, 0.15)


Perubahan kecil memungkinkan untuk melukiskan gambaran yang lebih jelas tentang siapa yang memiliki siapa:



Dalam kode, seperti yang Anda lihat, perubahannya minimal.



Langkah selanjutnya adalah membuat grafik di mana ukuran paket kepemilikan akan terlihat.



Untuk melakukan ini, Anda perlu berkenalan dengan konsep bobot (bobot) adalah parameter utama ketiga yang dapat digunakan oleh networkx. Untuk memasukkannya dalam pekerjaan, Anda perlu menambahkan bobot yang sama ini ke file teks, misalnya:



# source target
 1 100
 2 100
1 2 50
1 _ 100
2 _ 100


Sekarang mari kita membangun kembali jaringan menggunakan bobot dan menetapkannya pada grafik:



# Read edge list
G = nx.read_weighted_edgelist(
    str('example2.edgelist'))
# Extract weights
weights = [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 adalah file yang dibuat di atas dengan bobot.



Mari kita dapatkan gambar berikut:







Siapa yang memiliki siapa dan bagaimana, networkx



Sekarang, sebagai pengacara-programmer, kita perlu memahami dalam urutan apa dan dalam jumlah apa yang dimiliki Ivanov, misalnya, Bucket_AO, dan apakah dia memilikinya atau tidak. Ini diperlukan untuk menentukan fakta kepemilikan di holding yang bercabang dan semua rantai ke target LLC (JSC), sehingga nantinya rantai ini dapat didaftarkan di notifikasi CFC.



Dengan networkx, Anda dapat melakukan ini sebagai berikut:



list(nx.all_simple_paths(G,'', '_'))


Argumen pertama adalah node pemilik, yang kedua adalah node tempat kita akan membangun jalur.



Dengan menggunakan metode ini, Anda dapat melihat bahwa Bucket_AO Ivanov termasuk dalam rantai berikut:



[['', '1', '2', '_'], ['', '2', '_']]


Ini dikonfirmasi secara grafis.



Anda dapat mengetahui bagian kepemilikan dengan mengalikan bobot di antara node yang sesuai: 1 * 0,5 * 1 = 0,5, 1 * 1 = 1. Bagikan lebih dari 25%, pemberitahuan harus diserahkan.



Dalam kode, perkalian dilakukan dengan kruk berikut (metode yang lebih elegan belum ditemukan):



x=0
b=0
c=[]
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 np
print(np.prod(c))


x=0
b=0
c=[]
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 np
print(np.prod(c))


Dalam kasus pertama, ini akan menampilkan pecahan 0,5, dalam kasus kedua 1.



Opsi visualisasi apa lagi yang tersedia? Misalnya, Netwulf.



Netwulf



Dokumentasinya ada di sini .



Jaringan itu sendiri bersifat interaktif, inilah keuntungan utamanya. Setelah menginstal paket python, mari kita bangun jaringan:



import netwulf as nw
plt.figure(figsize=(200,200))
G = nx.read_weighted_edgelist(str('example2.edgelist'),create_using=nx.DiGraph)
pos = nx.spring_layout(G)
nw.visualize(G)


Setelah menjalankan kode, jupyter membeku, dan di jendela browser tambahan yang terbuka, Anda dapat melihat hasilnya:







Di sisi kanan panel, Anda dapat melihat opsi, perubahan yang mempengaruhi jaringan yang dibangun secara online.



Kekurangan dari paket ini adalah belum memungkinkan untuk menampilkan bobot dan tanda panah antar node, namun penulis berjanji untuk memperbaikinya.



* untuk kembali ke jupyter, Anda perlu mengklik opsi "post to python":







Opsi bagus lainnya untuk visualisasi python seperti itu adalah proyek webweb muda.



Webweb



Dokumentasinya ada di sini .



Jaringan dibangun dengan cara yang serupa:



from webweb import Web
web = Web(title='kitchen_sink')

web.display.networkName = 'tree'
web.display.networkLayer = 2
web.display.colorBy = 'ring'
web.display.sizeBy = 'degree'
web.display.gravity = .3
web.display.charge = 30
web.display.linkLength = 15
web.display.colorPalette = 'Greens'
web.display.scaleLinkOpacity = False
web.display.scaleLinkWidth = True

from pathlib import Path
data_dir = Path('.') / 'data'
# Read edge list
G = nx.read_edgelist('example.edgelist',create_using=nx.DiGraph)
plt.figure(figsize=(200,200))
# Draw network
pos = nx.spring_layout(G)
Web(list(G.edges)).show()






Dari keuntungan nyata atas netwulf: kemampuan untuk menyorot simpul kunci dengan warna, pencarian teks untuk simpul dengan disorot pada jaringan:







Singkatnya, kita dapat mengatakan bahwa keturunan yang berkembang dari networkx - netwulf dan webweb bagus untuk membangun gambaran cepat dari struktur sebuah holding kecil. Kedua modul memiliki mode pembekuan untuk membekukan node yang saling menempel karena interaktivitas grafik. Namun, meskipun menggunakannya, tidak mudah untuk bekerja dengan struktur berskala besar, di mana jumlah node lebih dari 200.



"Footboard" dari Kementerian Keuangan, kepemilikan salib dan cincin



Semuanya akan sangat baik ketika membangun struktur seperti itu, jika bukan karena satu hal yang merusak keseluruhan gambar. Namun, hal ini terletak pada kenyataan bahwa kepemilikan perusahaan itu sendiri melalui badan hukum lain. wajah dan ini disebut kepemilikan silang atau cincin.



Pada gambar dalam surat dari Kementerian Keuangan (misalnya, dari 02.07.2013 -4-13 / 11912) terlihat seperti ini.



Kepemilikan







Silang :







Berbentuk cincin: Mari kita lihat bagaimana networkx mendefinisikan tautan untuk skema kepemilikan silang dari partisipasi D di B.



Mari buat edgelist dengan tautan:



# source target
D B 45
B A 40
A B 55
E A 60


Setelah membangun jaringan dengan bobot, Anda dapat melihat bahwa umpan balik antara A dan B tidak tercermin:







Hal itu dapat dilihat jika Anda membangun jaringan tanpa bobot, dengan tanda panah:







Bagaimana dengan perhitungannya? Berapa bagian kumulatif D di B?



Semuanya tampak transparan di sini, 45%



Dan networkx memberikan perintah daftar (nx.all_simple_paths (G, 'D', 'B')):

[['D', 'B']]

Tapi tidak semuanya sesederhana itu.



Kementerian Keuangan mengatakan total bagian D di B ditentukan dengan rumus:







Dan akan menjadi 57,69%.



Apa yang harus dilakukan? networkx tidak berdaya?



Tidak sama sekali, networkx akan mengungkap situasi seperti itu, tetapi rumus perhitungannya akan berbeda, sesuai dengan “surat Undang-undang”.



Masalah ini dapat diselesaikan sebagian dengan menambahkan entri

AA

BB ke edgelist

Lebih lanjut, dengan daftar perintah (nx.nodes_with_selfloops (G)), Anda dapat melihat node dengan partisipasi di dalamnya, tetapi ini masih belum diperhitungkan saat menentukan jalur dari D ke B.



unduh notebook jupyter - di sini .



All Articles