From 24848d0cde68bfc92e5c90899cb6daab93c20713 Mon Sep 17 00:00:00 2001
From: KrivovDE <208969570+kunzite16@users.noreply.github.com>
Date: Wed, 9 Sep 2026 17:52:27 +0300
Subject: [PATCH] Unify Saturn ownership chart design
---
assets/js/app.js | 23 +++++++++++++++++------
1 file changed, 17 insertions(+), 6 deletions(-)
diff --git a/assets/js/app.js b/assets/js/app.js
index 3c882e6..a6261d8 100644
--- a/assets/js/app.js
+++ b/assets/js/app.js
@@ -613,6 +613,12 @@ ulyanovskPages['saturn']={
['2017','32 600 000 тыс. руб.','235 900 тыс. руб.'],['2018','40 700 000 тыс. руб.','3 100 000 тыс. руб.'],['2019','46 600 000 тыс. руб.','1 400 000 тыс. руб.'],['2021','52 300 000 тыс. руб.','2 300 000 тыс. руб.'],['2024','74 160 345 тыс. руб.','11 928 233 тыс. руб.']
],
ownership:'Уставный капитал: 63 122 343 274,000 руб. Акционеры: 86,634% АО «Объединённая двигателестроительная корпорация»; 8,420% Государственная корпорация «Ростех»; 4,048% ФГУП «Российский федеральный ядерный центр — Всероссийский НИИ экспериментальной физики»; 0,594% ПАО «ОДК-Сатурн»; 0,899% неизвестные и/или миноритарные акционеры. Держатель реестра акционеров: АО «РТ-Регистратор». Участие в капитале: 100,000% АО «Новые инструментальные решения»; 100,000% АО «Сатурн-Инструментальный завод»; 100,000% ООО «ОДК-Цифровая инфраструктура»; 100,000% АО «Сатурн-Турборус»; 89,863% ООО «Аутсорсинг Технологии обслуживание»; 80,000% ООО «Рейнольдс».',
+ registryHolder:'АО «РТ-Регистратор»',
+ ownershipDetails:['Номинал акции — 1,000 руб.'],
+ participations:[
+ '100,000% АО «Новые инструментальные решения»','100,000% АО «Сатурн-Инструментальный завод»','100,000% ООО «ОДК-Цифровая инфраструктура»','100,000% АО «Сатурн-Турборус»','89,863% ООО «Аутсорсинг Технологии обслуживание»','80,000% ООО «Рейнольдс»','50,001% PowerJet S.A.','50,000% (!) ЗАО «ПауэрДжет»','30,000% АО «Турборус»','30,000% (!) АО «Смартек»','4,494% (!) ООО «Инжиниринговый центр „Газотурбинные технологии“»'
+ ],
+ branches:['Филиал ПАО «ОДК-Сатурн» — Омское моторостроительное конструкторское бюро','Филиал «Научно-технический центр г. Санкт-Петербург» ПАО «ОДК-Сатурн»']
};
const importedCardBundle=window.BASTION_IMPORTED_CARDS||{cards:{},parentRelations:{},titleIndex:{},mainExtras:{}};
Object.assign(ulyanovskPages,importedCardBundle.cards||{});
@@ -967,7 +973,7 @@ const directOwnershipShares=value=>{
const source=String(value||'').replace(/\r/g,'');
// Для АО берём именно блок «Акционеры», а не проценты обыкновенных
// акций или доли участия самой организации в других компаниях.
- const shareholderBlock=source.match(/(?:Акционеры\s*\(%\s*ОА\)|Участники)\s*:\s*([\s\S]*?)(?=\s*(?:Участие в капитале|ДУ пакетами|Имеет в составе|Имеет филиалы|Имеет выделенные организации|Дополнительная информация)\s*:|$)/i)?.[1];
+ const shareholderBlock=source.match(/(?:Акционеры(?:\s*\(%\s*ОА\))?|Участники)\s*:\s*([\s\S]*?)(?=\s*(?:Держатель реестра акционеров|Участие в капитале|ДУ пакетами|Имеет в составе|Имеет филиалы|Имеет выделенные организации|Дополнительная информация)\s*:|$)/i)?.[1];
const directPart=shareholderBlock||source.split(/участие в капитале:/i)[0];
const shares=[];
for(const line of directPart.split(/\n+|;\s*(?=\d+(?:[,.]\d+)?%)/)){
@@ -998,21 +1004,24 @@ const genericOwnershipDonut=(title,ownership)=>{
// При неполном раскрытии оставляем нейтральный сектор «остальные», а не
// растягиваем известную долю на весь круг. Так площадь каждого сектора
// всегда равна написанному в карточке проценту.
- if(total>100.01)return `
Диаграмма не показана: сумма раскрытых долей превышает 100%.
`;
+ if(total>101)return `
Диаграмма не показана: сумма раскрытых долей превышает 100%.
`;
+ // В отдельных исходных карточках итог немного превышает 100%. Для них
+ // нормализуем только геометрию круга, сохраняя исходные доли в подписях.
+ const geometryScale=total>100?100/total:1;
const visibleShares=total<99.995
?[...shares,{value:100-total,display:'',isRemainder:true}]
:shares;
let angle=0;
const sectors=visibleShares.map((share,index)=>{
const start=angle;
- const end=visibleShares.length===1?359.99:start+share.value*3.6;
+ const end=visibleShares.length===1?359.99:start+share.value*geometryScale*3.6;
const middle=(start+end)/2;
const labelRadius=share.value<5?122:113;
const label=visibleShares.length===1?{x:180,y:68}:polar(labelRadius,middle);
const labelClass=share.value<3?' donut-label--tiny':share.value<5?' donut-label--small':'';
angle=end;
const fill=share.isRemainder?'#4a4d50':ownershipPalette[index%ownershipPalette.length];
- return `${!share.isRemainder&&share.value>=2?`${share.display}`:''}`;
+ return `${!share.isRemainder&&share.value>=2?`${share.display}`:''}`;
}).join('');
return ``;
};
@@ -1020,7 +1029,7 @@ const genericOwnershipLegend=ownership=>{
const shares=directOwnershipShares(ownership);
if(!shares.length)return '';
const visibleShares=shares;
- return visibleShares.map((share,index)=>`