كيفية رسم شركة قابضة وسلاسل ملكية وحساب أسهم CFC

في الممارسة القانونية لمحامي الشركات ، مؤخرًا نسبيًا (منذ عدة سنوات) ، أصبح من الضروري إعداد وتقديم إخطارات حول الشركات الأجنبية الخاضعة للرقابة (CFCs) بموجب الفن. 25.13 من قانون الضرائب للاتحاد الروسي. يتمثل جوهر هذا الالتزام في إعداد وتقديم مستند يعكس جميع اتصالات الشركة في الحيازة على طول السلاسل من شركة ذات مسؤولية محدودة (JSC) الحالية في الاتحاد الروسي إلى مالك الضريبة المقيم في الاتحاد الروسي CFC. ببساطة ، إذا كان الخارج مملوكًا من قبل روسي (مقيم ضريبي في الاتحاد الروسي) ، وكان الخارج لشركة ذات مسؤولية محدودة روسية (حتى من خلال سياج الشركات ذات المسؤولية المحدودة الوسيطة) أكثر من 25٪ ، فسيكون هناك إخطار. تسليط الضوء على أنه من الضروري التقديم إلى جميع الشركات ذات المسؤولية المحدودة (JSCs) التي لوحظ فيها هذا الموقف وتقديم كل من المعلومات حول ملكية أكثر من 25 ٪ والتغييرات اللاحقة في حصة الملكية في الوقت المناسب ، وإلا غرامات (100000 روبل لكل شركة في السلسلة - المادة 129.6 قانون الضرائب للاتحاد الروسي).نظرًا لأن الحيازة (مجموعة من الكيانات القانونية) هي كائن حي والتغييرات المستمرة في حصص الملكية أمر لا مفر منه ، فمن الضروري مراقبة كل هذا بطريقة ما حتى لا يتم تحصيل الغرامات. كيفية تبسيط العمل في هذا الاتجاه ، أتمتة ذلك ، هذه المقالة مخصصة. ستكون المقالة أيضًا مثيرة للاهتمام من وجهة نظر العرض الرسومي للهياكل ذات الصلة ، على سبيل المثال ، الاجتماعية. الشبكات.







في هذه المقالة ، لن نتطرق إلى الجوانب القانونية للإخطارات المقدمة حول CFC ، حول المشاركة في CFC ، سننظر في الجانب التقني من المشكلة.



مما لا شك فيه ، إذا كانت الحيازة المعنية تقدم نفسها على أنها هياكل بسيطة من النوع LLC-> KIK-> روسي ، فلا يُنصح ببناء شيء هنا بمشاركة آلة ، فهذه مسألة أخرى إذا كانت فروع الهيكل تتضاعف ولا يوجد عدد من هذه التشابكات.



دعنا نلقي نظرة على العديد من حلول الرسومات الحالية التي من شأنها تبسيط عملك.

لسهولة التصور ، سيتم استخدام دفتر jupyter وبيئة بيثون.



الشبكة x



هذا الحل هو الأقدم من بين الحلول المقدمة ولا يمكن أن يتباهى بتفاعله. توجد نفس المقالة القديمة حول هذه الحزمة عن حبري.



ومع ذلك ، فإن القديم لا يعني أنه سيء ​​، وهذا الخيار هو من أنجح الخيارات سواء من حيث الرسم أو الحوسبة.



قم بتثبيت واستيراد الوحدة عبر jupyter:



!pip install networkx
import networkx as nx


نحن أيضا نستورد إضافة أخرى. الوحدات التي ستساعدك على رسم الأشكال:



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})


لنقم ببناء أول شبكة باستخدام 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)


إليك ما حدث:







كما ترى ، يمتلك إيفانوف اثنين من مركبات الكربون الكلورية فلورية ، والتي بدورها تمتلك كيانات قانونية روسية. من قبل الأشخاص.



دعنا نحلل الكود أعلاه.



استوردنا الوحدة وحددنا المكان الذي سنقرأ فيه البيانات الموجودة على القرص من:



from pathlib import Path
data_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 بمفاهيم العقد والروابط بينها. في حالتنا ، العقد هي Ivanov و KIK1 و KIK2 و Romashka_OOO و Bucket_AO. والروابط هي ما يوجد في ملف example.edgelist.



يمكنك ببساطة عرض كلاهما بالرجوع إلى أساليب Gnodes و G.edges:







الرسم البياني الاتجاهي في networkx (قائمة الحافة الموجهة)



دعنا نوضح الشبكة المنشأة قليلاً ، أضف الأسهم:



# 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)


جعلت التغييرات الصغيرة من الممكن رسم صورة أوضح لمن يمتلك من:



في الكود ، كما ترى ، فإن التغييرات طفيفة.



تتمثل الخطوة التالية في إنشاء رسم بياني يظهر فيه حجم حزم الملكية.



للقيام بذلك ، تحتاج إلى التعرف على مفهوم الوزن (الوزن) وهو المعلمة الرئيسية الثالثة التي يمكن أن يعمل بها networkx. لتضمينها في العمل ، تحتاج إلى إضافة نفس هذه الأوزان إلى ملف نصي ، على سبيل المثال:



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


لنقم الآن بإعادة بناء الشبكة باستخدام الأوزان وتعيينها على الرسم البياني:



# 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 هو الملف الذي تم إنشاؤه أعلاه باستخدام أوزان.



نحصل على الصورة التالية:







من يملك من وكيف ، networkx



نحن الآن ، كمبرمجين - محامين ، نحتاج إلى فهم التسلسل والمبلغ الذي يمتلكه إيفانوف ، على سبيل المثال ، Bucket_AO ، وما إذا كان يمتلكها على الإطلاق. هذا مطلوب من أجل تحديد حقيقة الملكية في الحيازة المتفرعة وجميع السلاسل إلى شركة LLC المستهدفة (JSC) ، بحيث يمكن تسجيل هذه السلاسل لاحقًا في إشعار CFC.



باستخدام networkx ، يمكنك القيام بذلك على النحو التالي:



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


الوسيطة الأولى هي عقدة المالك ، والثانية هي العقدة التي سنبني عليها المسارات.



باستخدام هذه الطريقة ، يمكنك أن ترى أن Bucket_AO الخاص بإيفانوف ينتمي إلى السلاسل التالية:



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


هذا مؤكد بيانيا.



يمكنك معرفة حصة الملكية بضرب الأوزان بين العقد المقابلة: 1 * 0.5 * 1 = 0.5 ، 1 * 1 = 1. حصة تزيد عن 25٪ ، يجب إرسال الإخطار.



في الكود ، يتم الضرب بالعكازات التالية (لم يتم العثور على طريقة أكثر أناقة بعد):



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))


في الحالة الأولى ، ستعرض جزءًا من 0.5 ، في الحالة الثانية 1.



ما هي خيارات التصور الأخرى المتاحة؟ على سبيل المثال ، Netwulf.



نت وولف



التوثيق هنا .



الشبكة نفسها تفاعلية ، وهذه هي ميزتها الرئيسية. بعد تثبيت حزمة python ، لنقم ببناء الشبكة:



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)


بعد تشغيل الكود ، يتجمد jupyter ، وفي نافذة متصفح إضافية تفتح ، يمكنك رؤية النتيجة:







على الجانب الأيمن من اللوحة ، يمكنك رؤية الخيارات التي تؤثر على الشبكة المبنية عبر الإنترنت.



عيب هذه الحزمة هو أنه ليس من الممكن بعد عرض الأوزان والسهام بين العقد ، لكن المؤلفين وعدوا بتنقيحها.



* للعودة إلى jupyter ، تحتاج إلى النقر فوق خيار "post to python": خيار







آخر جيد لمثل هذا التصور للبيثون هو مشروع الويب الصغير.



ويب ويب



التوثيق هنا .



تم بناء الشبكة بطريقة مماثلة:



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()






من المزايا الواضحة على netwulf: القدرة على إبراز العقد الرئيسية بالألوان ، والبحث عن نص عن العقد مع إبراز على الشبكة:







باختصار ، يمكننا القول أن المتحدرين من networkx - netwulf و webweb جيدون لبناء صورة سريعة لهيكل عقد صغير. تحتوي كلتا الوحدتين على وضع التجميد لتجميد العقد التي تلتصق ببعضها البعض في كومة واحدة بسبب تفاعل الرسم البياني. ومع ذلك ، حتى عند استخدامها ، ليس من السهل العمل مع الهياكل واسعة النطاق حيث يزيد عدد العقد عن 200.



"الركيزة" من وزارة المالية ، ملكية صليب وحلقة



كل شيء سيكون جيدًا جدًا عند إنشاء مثل هذه الهياكل ، إن لم يكن لشيء واحد يفسد الصورة بأكملها. ومع ذلك ، يكمن هذا في حقيقة أن ممتلكات الشركة تمتلك نفسها من خلال كيانات قانونية أخرى. الوجوه وهذا ما يسمى بالملكية المتقاطعة أو الحلقية.



في الصور الموجودة في رسائل من وزارة المالية (على سبيل المثال ، من 02.07.2013 -4-13 / 11912) يبدو هكذا.



الملكية المشتركة: على شكل حلقة







:







لنرى كيف تحدد networkx الروابط الخاصة بنظام الملكية المشتركة لمشاركة D في B.



لننشئ قائمة edgelist بروابط:



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


بعد بناء شبكة بأوزان ، يمكنك أن ترى أن التغذية المرتدة بين A و B لا تنعكس:







يمكن رؤيتها إذا قمت ببناء شبكة بدون أوزان ، مع أسهم:







ماذا عن الحسابات؟ ما هي الحصة التراكمية لـ D في B؟



كل شيء يبدو شفافًا هنا ، 45٪



ويعطي networkx قائمة الأوامر (nx.all_simple_paths (G، 'D'، 'B')):

[['D'، 'B']]

لكن ليس كل شيء بهذه البساطة.



وتقول وزارة المالية إن الحصة الإجمالية لـ D في B يتم تحديدها بالصيغة التالية:







وستكون 57.69٪.



ماذا أفعل؟ Networkx ضعيف؟



لا على الإطلاق ، ستكشف networkx عن مثل هذه المواقف ، لكن صيغة الحساب ستكون مختلفة ، وفقًا لـ "حرف القانون".



يمكن حل المشكلة جزئيًا عن طريق إضافة مدخلات

AA

BB إلى قائمة الحافة

علاوة على ذلك ، من خلال قائمة الأوامر (nx.nodes_with_selfloops (G)) ، يمكنك عرض العقد بالمشاركة في حد ذاتها ، ولكن هذا لا يزال غير مأخوذ في الاعتبار عند تحديد المسارات من D إلى B.



تحميل دفتر jupyter - هنا .



All Articles