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 `
${sectors}
`; }; @@ -1020,7 +1029,7 @@ const genericOwnershipLegend=ownership=>{ const shares=directOwnershipShares(ownership); if(!shares.length)return ''; const visibleShares=shares; - return visibleShares.map((share,index)=>`
${escapeHtml(share.display)}${share.name?linkifyUlyText(share.name,Object.keys(ulyanovskPages)):'—'}
`).join(''); + return visibleShares.map((share,index)=>`
${escapeHtml(share.display)}${share.name?linkifyUlyText(share.name,Object.keys(ulyanovskPages)):'—'}
`).join(''); }; const ownershipTextMarkup=(value,related)=>linkifyUlyText(value,related).replace(/\s(\d+(?:[,.]\d+)?%)/g,'
$1'); // Классификаторы, подготовленные для прототипа из внешних реестров. @@ -1152,6 +1161,8 @@ const renderUlyLomoOrganization=key=>{ const contacts=pairs.filter(([label])=>/^(Телефоны|Факс|E-mail|Интернет-сайт|Сайт|Раскрытие информации)$/.test(label)); const finance=data.finance||[]; const ownership=withoutAuthorizedCapital(data.ownership); + const structureOwner=key==='okb-mei'?'okb':key==='saturn'?'saturn':''; + const structureButton=structureOwner?``:''; const financeContent=finance.length?renderFinanceCharts(finance,data.short||data.title,data.employees,data.preserveSourceMetrics):renderEmployeeChart(data.employees); const financeCompact=finance.length?`
Выручка
${escapeHtml(finance.at(-1)[0])} г.  ${escapeHtml(finance.at(-1)[1])}
Чистая прибыль
${escapeHtml(finance.at(-1)[0])} г.  ${escapeHtml(finance.at(-1)[2])}
`:''; const classifiers=classifierTable(pairs,related); @@ -1187,7 +1198,7 @@ const renderUlyLomoOrganization=key=>{ ${data.legal?``:''} ${informationText?`

Информация

${ulyExpand()}

${informationTitle}

${linkifyUlyText(informationText,related)}
${data.about&&data.history?`

Историческая справка

${linkifyUlyText(data.history,related)}
`:''}
`:''} ${finance.length||data.employees?.length?`

Финансовые показатели

${capitalBadge(data.ownership)}${ulyExpand()}
${financeContent}
${financeCompact}${data.financeNote?`

${escapeHtml(data.financeNote)}

`:''}
`:''} - ${key==='saturn'?saturnOwnershipCard():data.ownership?`

Структура собственности

${key==='okb-mei'?``:''}${ulyExpand()}
${directOwnershipShares(ownership).length?`
${/Акционеры\s*\(%\s*ОА\)/i.test(ownership)?'Акционеры (% ОА)':'Участники (% УК)'}
${genericOwnershipDonut(data.title,ownership)}
${genericOwnershipLegend(ownership)}
`:`
${ownershipTextMarkup(ownership,related)}
`}${ownershipExtras}
`:data.participations?.length?`

Структура собственности

${ulyExpand()}

Участие в капитале (% ОА / % УК)

${data.participations.slice(0,6).map(item=>linkifyUlyText(item,related)).join('

')}
${data.participations.map(item=>linkifyUlyText(item,related)).join('

')}
`:''} + ${data.ownership?`

Структура собственности

${structureButton}${ulyExpand()}
${directOwnershipShares(ownership).length?`
${/Акционеры(?:\s*\(%\s*ОА\))?\s*:/i.test(ownership)?'Акционеры (% ОА)':'Участники (% УК)'}
${genericOwnershipDonut(data.title,ownership)}
${genericOwnershipLegend(ownership)}
`:`
${ownershipTextMarkup(ownership,related)}
`}${ownershipExtras}
`:data.participations?.length?`

Структура собственности

${ulyExpand()}

Участие в капитале (% ОА / % УК)

${data.participations.slice(0,6).map(item=>linkifyUlyText(item,related)).join('

')}
${data.participations.map(item=>linkifyUlyText(item,related)).join('

')}
`:''} ${data.activity||data.licenses?.length||data.specialization?`

Виды деятельности

${ulyExpand()}
${data.activity?`

Основной вид деятельности

${linkifyUlyText(data.activity,related)}
`:''}${data.licenses?.length?`

Действующие лицензии

${data.licenses.map(item=>linkifyUlyText(item,related)).join('

')}
`:''}${data.specialization?`

Специализация

${linkifyUlyText(data.specialization,related)}
`:''}
`:''} ${stabilitySection(data,related)}`; if(data.employees?.length){