This commit is contained in:
Alex Ant
2026-03-12 14:27:54 +05:00
parent 337ffb47d0
commit bcd9f7c06d
23 changed files with 670 additions and 240 deletions
+12 -2
View File
@@ -1,14 +1,24 @@
<!doctype html>
<html lang="en">
<html lang="ru">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link
rel="preconnect"
href="https://fonts.gstatic.com"
crossorigin
/>
<link
href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,300;0,400;0,600;1,300;1,400&family=JetBrains+Mono:wght@300;400;500&family=Manrope:wght@300;400;500;600&display=swap"
rel="stylesheet"
/>
<title>C9S Калькулятор Выгоды</title>
<meta name="description" content="Калькулятор выгоды для кооперативной экономики: расчет доходности, доли и выплат при участии трудочасами и/или инвестициями. Прозрачные формулы, учет премий, возвратов и членских взносов." />
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.jsx"></script>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>
+8
View File
@@ -1,6 +1,14 @@
import { useEffect } from 'react';
import './styles/app.css';
import { AppProvider } from './providers';
import { TEXTS } from '../shared';
export function App() {
useEffect(() => {
document.title = TEXTS.html.title;
const metaDesc = document.querySelector('meta[name="description"]');
if (metaDesc) metaDesc.setAttribute('content', TEXTS.html.description);
}, []);
return <AppProvider />;
}
-7
View File
@@ -1,10 +1,3 @@
#root {
width: 100%;
margin: 0;
padding: 0;
text-align: center;
}
.calculator-container {
max-width: 100%;
margin: 0 auto;
+184
View File
@@ -0,0 +1,184 @@
:root {
--theme-card-bg: rgba(12, 16, 24, 0.92);
--theme-card-border: rgba(201, 151, 58, 0.2);
--theme-card-shadow: 0 10px 28px rgba(0, 0, 0, 0.3);
--theme-card-head-bg: linear-gradient(180deg, rgba(28, 34, 48, 0.92) 0%, rgba(18, 23, 33, 0.95) 100%);
--theme-card-head-text: #eef0f5;
--theme-card-body-text: #c8cdd8;
--theme-muted-text: #9ea6b7;
--theme-accent: #c9973a;
--theme-disclaimer-bg: rgba(201, 151, 58, 0.16);
--theme-disclaimer-border: rgba(201, 151, 58, 0.4);
--theme-stat-value: #f5f7fb;
--theme-page-title: #f2f4f9;
--theme-page-subtitle: #c8cdd8;
--theme-input-bg: rgba(19, 25, 36, 0.92);
--theme-input-border: rgba(201, 151, 58, 0.35);
--theme-input-text: #eef0f5;
--theme-input-addon-bg: rgba(24, 31, 45, 0.96);
--theme-table-head-bg: rgba(24, 31, 45, 0.95);
--theme-table-row-bg: rgba(15, 20, 30, 0.94);
--theme-table-row-hover: rgba(201, 151, 58, 0.1);
--theme-table-border: rgba(201, 151, 58, 0.18);
}
.ant-card {
border-radius: 10px;
border: 1px solid var(--theme-card-border);
background: var(--theme-card-bg);
box-shadow: var(--theme-card-shadow);
color: var(--theme-card-body-text);
}
.ant-card:hover {
border-color: rgba(201, 151, 58, 0.35);
box-shadow: 0 12px 34px rgba(0, 0, 0, 0.36);
}
.ant-card .ant-card-head {
border-bottom: 1px solid rgba(201, 151, 58, 0.14);
border-top-left-radius: 10px;
border-top-right-radius: 10px;
background: var(--theme-card-head-bg);
}
.ant-card .ant-card-head-title {
color: var(--theme-card-head-text);
font-weight: 600;
letter-spacing: 0.01em;
}
.ant-card .ant-card-body {
color: var(--theme-card-body-text);
}
.ant-card .ant-typography,
.ant-card .ant-statistic-title,
.ant-card .ant-badge-status-text,
.ant-card .ant-descriptions-item-label,
.ant-card .ant-descriptions-item-content {
color: var(--theme-card-body-text);
}
.ant-card .ant-badge-status-text,
.ant-card .ant-badge-status-text span,
.ant-card .ant-badge-status-text b,
.ant-card .ant-badge-status-text strong,
.ant-card .label-text {
color: var(--theme-card-body-text) !important;
}
.ant-card .card-description,
.ant-card .unit-suffix {
color: var(--theme-muted-text);
}
.calculator-page-title {
color: var(--theme-page-title) !important;
}
.calculator-page-subtitle {
color: var(--theme-page-subtitle) !important;
display: block;
}
.ant-card .ant-input-number,
.ant-card .ant-input,
.ant-card .ant-input-affix-wrapper,
.ant-card .ant-input-number-group-addon {
background: var(--theme-input-bg);
border-color: var(--theme-input-border);
color: var(--theme-input-text);
}
.ant-card .ant-input-number-group-addon {
background: var(--theme-input-addon-bg);
color: var(--theme-input-text);
}
.ant-card .ant-input-number-input,
.ant-card .ant-input::placeholder,
.ant-card .ant-input-number-input::placeholder {
color: var(--theme-input-text);
}
.ant-card .ant-input-number:hover,
.ant-card .ant-input:hover,
.ant-card .ant-input-affix-wrapper:hover {
border-color: rgba(201, 151, 58, 0.5);
}
.ant-card .ant-input-number-focused,
.ant-card .ant-input-affix-wrapper-focused,
.ant-card .ant-input:focus,
.ant-card .ant-input:focus-within {
border-color: rgba(201, 151, 58, 0.75);
box-shadow: 0 0 0 2px rgba(201, 151, 58, 0.2);
}
.ant-card .ant-table-wrapper .ant-table,
.ant-card .ant-table-wrapper .ant-table-container,
.ant-card .ant-table-wrapper .ant-table-content,
.ant-card .ant-table-wrapper .ant-table-tbody > tr > td {
background: var(--theme-table-row-bg);
color: var(--theme-card-body-text);
}
.ant-card .ant-table-wrapper .ant-table-thead > tr > th {
background: var(--theme-table-head-bg) !important;
color: var(--theme-card-head-text) !important;
border-color: var(--theme-table-border) !important;
}
.ant-card .ant-table-wrapper .ant-table-tbody > tr > td,
.ant-card .ant-table-wrapper .ant-table-thead > tr > th,
.ant-card .ant-table-wrapper .ant-table-cell,
.ant-card .ant-table-wrapper .ant-table-content table {
border-color: var(--theme-table-border);
}
.ant-card .ant-table-wrapper .ant-table-tbody > tr.ant-table-row:hover > td,
.ant-card .ant-table-wrapper .ant-table-tbody > tr > td.ant-table-cell-row-hover {
background: var(--theme-table-row-hover) !important;
}
.ant-card .ant-table-wrapper .ant-table-placeholder .ant-table-cell {
background: transparent;
color: var(--theme-muted-text);
}
.ant-card .apexcharts-legend.apx-legend-position-bottom.apexcharts-align-center,
.ant-card .apexcharts-legend.apx-legend-position-top.apexcharts-align-center,
.ant-card .apexcharts-legend.apx-legend-position-left.apexcharts-align-center,
.ant-card .apexcharts-legend.apx-legend-position-right.apexcharts-align-center {
justify-content: flex-start !important;
align-items: center;
}
.theme-stat-value .ant-statistic-content {
color: var(--theme-stat-value);
font-size: 30px;
font-weight: 700;
}
.profitability-stats-row .ant-statistic {
text-align: center;
}
.profitability-stats-row .ant-statistic-title {
min-height: 44px;
display: flex;
align-items: flex-end;
justify-content: center;
text-align: center;
line-height: 1.35;
}
.theme-disclaimer {
margin-top: 16px;
padding: 12px;
font-size: 12px;
border-radius: 8px;
border: 1px solid var(--theme-disclaimer-border);
background: var(--theme-disclaimer-bg);
}
+71
View File
@@ -0,0 +1,71 @@
:root {
--shell-gold: #c9973a;
--shell-dark: #080a0e;
--shell-dark-2: #0e1118;
--shell-text: #c8cdd8;
}
* {
box-sizing: border-box;
}
html,
body,
#root {
width: 100%;
min-height: 100%;
}
html {
scroll-behavior: smooth;
}
body {
margin: 0;
color: var(--shell-text);
font-family: 'Manrope', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
line-height: 1.6;
background:
radial-gradient(circle at 18% 12%, rgba(201, 151, 58, 0.12), transparent 42%),
radial-gradient(circle at 90% 10%, rgba(201, 151, 58, 0.08), transparent 48%),
linear-gradient(180deg, var(--shell-dark-2) 0%, var(--shell-dark) 100%);
overflow-x: hidden;
}
body::before {
content: '';
position: fixed;
inset: 0;
pointer-events: none;
z-index: 0;
opacity: 0.28;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.04'/%3E%3C/svg%3E");
}
#root {
position: relative;
z-index: 1;
margin: 0 auto;
max-width: 1320px;
padding: 20px 16px 28px;
}
::-webkit-scrollbar {
width: 6px;
height: 6px;
}
::-webkit-scrollbar-track {
background: rgba(255, 255, 255, 0.04);
}
::-webkit-scrollbar-thumb {
background: rgba(201, 151, 58, 0.45);
border-radius: 999px;
}
@media (max-width: 768px) {
#root {
padding: 12px 10px 20px;
}
}
-58
View File
@@ -1,64 +1,6 @@
:root {
font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
line-height: 1.5;
font-weight: 400;
color-scheme: light dark;
color: rgba(255, 255, 255, 0.87);
background-color:rgb(255, 255, 255);
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
a {
font-weight: 500;
color: #646cff;
text-decoration: inherit;
}
a:hover {
color: #535bf2;
}
body {
margin: 0;
}
h1 {
font-size: 3.2em;
line-height: 1.1;
}
button {
border-radius: 8px;
border: 1px solid transparent;
padding: 0.6em 1.2em;
font-size: 1em;
font-weight: 500;
font-family: inherit;
background-color: #1a1a1a;
cursor: pointer;
transition: border-color 0.25s;
}
button:hover {
border-color: #646cff;
}
button:focus,
button:focus-visible {
outline: 4px auto -webkit-focus-ring-color;
}
@media (prefers-color-scheme: light) {
:root {
color: #213547;
background-color: #ffffff;
}
a:hover {
color: #747bff;
}
button {
background-color: #f9f9f9;
}
}
+2
View File
@@ -1,6 +1,8 @@
import React from 'react'
import ReactDOM from 'react-dom/client'
import { App } from './app/index'
import './app/styles/frame-shell.css'
import './app/styles/calculator-theme.css'
import './app/styles/index.css'
ReactDOM.createRoot(document.getElementById('root')!).render(
+3 -2
View File
@@ -1,4 +1,5 @@
import { Row, Col, Typography } from 'antd';
import { TEXTS } from '../../shared';
import { useState, useEffect, FC } from 'react';
import { calculateBenefits, CALCULATOR_CONSTANTS, ColumnVisibility } from '../../entities/core';
@@ -144,8 +145,8 @@ export const CalculatorPage: FC<CalculatorPageProps> = ({ initialParams }) => {
return (
<div className="calculator-container">
<Title level={2} className="mb-sm">Калькулятор выгоды</Title>
<Text className="mb-md" style={{ display: 'block' }}>от участия в создании платформы и приложений "Кооперативной Экономики"</Text>
<Title level={2} className="mb-sm calculator-page-title">{TEXTS.page.calculatorTitle}</Title>
<Text className="mb-md calculator-page-subtitle">{TEXTS.page.calculatorSubtitle}</Text>
<LegendSection />
+19 -10
View File
@@ -1,4 +1,5 @@
import { Button } from 'antd';
import { TEXTS } from '../../shared';
import { useState, useEffect, FC } from 'react';
import { calculateBenefits, CALCULATOR_CONSTANTS, ColumnVisibility, CalculationParams } from '../../entities/core';
import {
@@ -142,7 +143,7 @@ export const WizardCalculatorPage: FC<WizardCalculatorPageProps> = ({ initialPar
/>
<div style={{ textAlign: 'center', marginTop: 24 }}>
<Button type="primary" size="large" onClick={next}>
Продолжить
{TEXTS.wizard.continue}
</Button>
</div>
</div>
@@ -157,10 +158,10 @@ export const WizardCalculatorPage: FC<WizardCalculatorPageProps> = ({ initialPar
/>
<div style={{ textAlign: 'center', marginTop: 24 }}>
<Button size="large" onClick={prev} style={{ marginRight: 16 }}>
Назад
{TEXTS.wizard.back}
</Button>
<Button type="primary" size="large" onClick={next}>
Продолжить
{TEXTS.wizard.continue}
</Button>
</div>
</div>
@@ -181,10 +182,10 @@ export const WizardCalculatorPage: FC<WizardCalculatorPageProps> = ({ initialPar
/>
<div style={{ textAlign: 'center', marginTop: 24 }}>
<Button size="large" onClick={prev} style={{ marginRight: 16 }}>
Назад
{TEXTS.wizard.back}
</Button>
<Button type="primary" size="large" onClick={next}>
Подробнее
{TEXTS.wizard.moreDetails}
</Button>
</div>
</div>
@@ -213,10 +214,10 @@ export const WizardCalculatorPage: FC<WizardCalculatorPageProps> = ({ initialPar
/>
<div style={{ textAlign: 'center', marginTop: 24 }}>
<Button size="large" onClick={prev} style={{ marginRight: 16 }}>
Назад
{TEXTS.wizard.back}
</Button>
<Button type="primary" size="large" onClick={next}>
Еще подробнее
{TEXTS.wizard.evenMoreDetails}
</Button>
</div>
</div>
@@ -227,10 +228,10 @@ export const WizardCalculatorPage: FC<WizardCalculatorPageProps> = ({ initialPar
<div style={{ marginTop: 24 }}>
<div style={{ textAlign: 'center', marginBottom: 24 }}>
<Button size="large" onClick={prev} style={{ marginRight: 16 }}>
Назад
{TEXTS.wizard.back}
</Button>
<Button type="primary" size="large" onClick={next}>
Перейти к полному калькулятору
{TEXTS.wizard.goToFullCalculator}
</Button>
</div>
<MonthlyResultsTable
@@ -262,7 +263,15 @@ export const WizardCalculatorPage: FC<WizardCalculatorPageProps> = ({ initialPar
};
return (
<div className="calculator-container">
<div
className={`calculator-container ${
currentStep < 5
? currentStep === 3 || currentStep === 4
? 'wizard-container wizard-container-wide'
: 'wizard-container'
: ''
}`}
>
{renderStepContent()}
</div>
);
@@ -23,6 +23,16 @@
width: 100%;
}
.wizard-container {
width: 100%;
max-width: 760px;
margin: 0 auto;
}
.wizard-container-wide {
max-width: 1160px;
}
/* Ограничение ширины для десктопов */
@media (min-width: 769px) {
.input-container .ant-space-compact,
@@ -60,6 +70,14 @@
/* Медиа-запросы */
@media (max-width: 768px) {
.wizard-container {
max-width: 100%;
}
.wizard-container-wide {
max-width: 100%;
}
/* Адаптивное отображение на мобильных */
.result-item {
flex-direction: column;
+1
View File
@@ -1,3 +1,4 @@
export * from './ui';
export * from './lib/urlParams';
export * from './lib/hooks/useUrlParams';
export { TEXTS } from './lib/texts';
+207
View File
@@ -0,0 +1,207 @@
/**
* Все текстовые строки калькулятора.
* Ключ-значение для удобного перевода и централизованного управления.
*/
export const TEXTS = {
// === Страницы ===
page: {
calculatorTitle: 'Калькулятор выгоды',
calculatorSubtitle: 'для пайщиков, участвующих в создании платформы и приложений экосистемы "Кооперативная Экономика"',
},
// === Wizard (пошаговый калькулятор) ===
wizard: {
continue: 'Продолжить',
back: 'Назад',
moreDetails: 'Подробнее',
evenMoreDetails: 'Еще подробнее',
goToFullCalculator: 'Перейти к полному калькулятору',
},
common: {
rublesPerMonth: '₽/мес',
},
// === Легенда ===
legend: {
title: 'Легенда',
executor: 'Исполнитель',
executorDesc: 'Пайщик, который воплощает продукт компетенциями и профессиональным навыком, фиксируя результат в коммитах.',
author: 'Автор / Соавтор',
authorDesc: 'Пайщик, который вносит идею как паевой взнос и сопровождает проект на этапах концепции, модели и реализации.',
investor: 'Инвестор',
investorDesc: 'Пайщик, который вносит денежные средства в программу и получает долю в ОАП с возвратами из членских взносов.',
participant: 'Участник программы',
participantDesc: 'Пайщик Благороста в любой роли: Исполнитель, Автор/Соавтор, Инвестор или Координатор.',
result: 'ОАП',
resultDesc: 'Объект авторских прав платформы "Кооперативная Экономика", формируемый из паевых взносов участников.',
share: 'Доля в ОАП',
shareDesc: 'Имущественная доля пайщика в объекте авторских прав, закрепляемая через паевые взносы.',
bonus: 'Дополнительный паевой взнос',
bonusDesc: 'Капитализируемый взнос, который начисляется участникам программы при росте стоимости ОАП.',
blagorost: 'Благорост',
blagorostDesc: 'Дополнительные паевые взносы участникам программы по коэффициенту золотого сечения (1,618).',
howItWorks: 'Как это работает:',
howItWorksText: 'Взносы Исполнителей и Соавторов формируют себестоимость проектов, а по коэффициенту 1,618 дополнительно формируется Благорост для участников программы. Денежные взносы Инвесторов обеспечивают возврат себестоимости компетенций команд и увеличивают долю в ОАП.',
businessModel: 'Бизнес-модель:',
businessModelText: 'Кооперативы в экосистеме оплачивают членские взносы за документы, проведенные через приложения платформы. Этот поток покрывает текущие расходы кооператива и обеспечивает возвраты участникам программы Благорост.',
},
// === Форма взноса временем ===
contributionForm: {
title: 'Ваш паевой взнос результатом',
description: 'Укажите стоимость вашего взноса как Исполнителя из расчета стоимости вашего времени. Такой взнос увеличивает вашу долю в ОАП и участвует в формировании Благороста через дополнительные паевые взносы участников программы.',
},
// === Форма взноса деньгами ===
investmentForm: {
title: 'Ваш паевой взнос деньгами',
description: 'Сумма денежных средств, которые вы вносите в программу как Инвестор. Денежный взнос увеличивает вашу долю в ОАП и обеспечивает возврат себестоимости компетенций Исполнителей и Соавторов.',
},
// === Возврат стоимости труда ===
withdrawalRate: {
title: 'Возврат себестоимости компетенций',
description: 'Определяет, какую долю стоимости вашего взноса вы возвращаете, а какую оставляете в программе. В модели используется правило "все действуют как вы": такой же процент и поведение применяется к другим Исполнителям и Соавторам.',
},
// === Результаты выгоды ===
profitabilityResults: {
title: 'Предполагаемая выгода участия',
annual: 'Годовых',
creatorBonus: 'Взнос Исполнителя по астрономическому времени',
description: 'Показатель учитывает Благорост, возвраты из членских взносов за документы и взнос Исполнителя по астрономическому времени.',
disclaimer: 'Показатели являются модельной оценкой и могут отличаться от фактических значений в зависимости от динамики взносов, эффективности капитала и поведения участников программы.',
},
// === Результаты взносов (диаграмма) ===
contributionResults: {
title: 'Складочный капитал в первый месяц участия',
pieLabels: {
yourExecutorContribution: 'Ваш взнос Исполнителя',
yourInvestorContribution: 'Ваш взнос Инвестора',
authorsContribution: 'Взнос Авторов / Соавторов',
yourExecutorBonus: 'Ваш взнос Исполнителя по астрономическому времени',
authorsBonus: 'Взнос Авторов / Соавторов по астрономическому времени',
participantsBonus: 'Благорост участникам программы',
participantsBonusResult: 'Благорост участникам программы',
otherInvestorsContribution: 'Взнос других Инвесторов',
otherInvestorsContributionResult: 'Взнос других Инвесторов',
otherCreatorsContribution: 'Взнос других Исполнителей',
otherCreatorsBonus: 'Взнос других Исполнителей по астрономическому времени',
},
tooltips: {
yourExecutorContribution: 'Стоимость вашего паевого взноса как Исполнителя. Эта сумма участвует в расчете возвратов и формировании вашей доли в ОАП.',
yourInvestorContribution: 'Сумма вашего денежного взноса как Инвестора. Она увеличивает долю в ОАП и поддерживает возврат себестоимости команд.',
yourExecutorBonus: 'Часть вашего паевого взноса, отражающая стоимость астрономического времени Исполнителя.',
authorsContribution: 'Суммарная стоимость взносов Авторов/Соавторов в первом месяце, включая ваш проект и проекты других Исполнителей.',
authorsBonus: 'Суммарная часть взносов Авторов/Соавторов по астрономическому времени в первом месяце.',
participantsBonus: 'Благорост участникам программы (Исполнителям, Авторам/Соавторам и Инвесторам), рассчитанный по коэффициенту золотого сечения. Увеличивает общий складочный капитал и распределяется по долям в ОАП.',
otherInvestorsContribution: 'Суммарный денежный взнос других Инвесторов в первом месяце. Повышает общий складочный капитал и обеспечивает возвраты командам.',
otherCreatorsContribution: 'Стоимость паевых взносов результатами других Исполнителей в первом месяце.',
otherCreatorsBonus: 'Часть взносов других Исполнителей по астрономическому времени в первом месяце.',
},
},
// === Параметры системы ===
systemParams: {
title: 'Параметры модели и допущения',
constants: 'Константы',
executorLaborCost: 'Стоимость компетенций Исполнителя',
executorLaborCostTooltip: 'Часть взноса Исполнителя, отражающая стоимость профессиональных компетенций (v\').',
authorLaborCost: 'Стоимость компетенций Соавторов',
authorLaborCostTooltip: 'Часть взноса Соавторов, связанная со стоимостью компетенций и рассчитываемая от взноса Исполнителя.',
executorBonus: 'Стоимость астрономического времени Исполнителя',
executorBonusTooltip: 'Часть взноса Исполнителя, отражающая стоимость астрономического времени (v).',
authorBonus: 'Стоимость астрономического времени Соавторов',
authorBonusTooltip: 'Часть взноса Соавторов, отражающая стоимость астрономического времени.',
participantsBonus: 'Благорост участникам программы',
participantsBonusTooltip: 'Коэффициент золотого сечения (1,618), по которому рассчитывается дополнительная капитализация участникам программы.',
payoutMonths: 'Месяцы выплат',
payoutMonthsTooltip: 'Месяцы выплат — периоды, в которые участникам выплачиваются накопленные членские взносы.',
delayedFirstPayments: 'Отложенные первые выплаты',
delayedFirstPaymentsTooltip: 'Начало накопления членских взносов откладывается на указанное количество месяцев после первого взноса.',
investmentProvision: 'Покрытие себестоимости инвестициями',
investmentProvisionTooltip: 'Модель предполагает, что денежные взносы Инвесторов достаточны для возврата себестоимости компетенций Исполнителей и Соавторов.',
disclaimer: 'Если денежные взносы Инвесторов снижаются, возвраты Исполнителям и Соавторам могут быть перенесены до поступления достаточного объема средств.',
initialCapital: 'Стартовый складочный капитал',
initialCapitalDesc: 'Начальный складочный капитал, на базе которого производится расчет. Фиксируется и публикуется в бухгалтерской отчетности кооператива ежеквартально.',
monthlyContributions: 'Ежемесячные взносы результатами других Исполнителей',
monthlyContributionsDesc: 'Общая сумма паевых взносов результатами других Исполнителей, вносимая ежемесячно после вашего входа в программу. Эти взносы увеличивают складочный капитал и формируют Благорост.',
growthMultiplier: 'Множитель роста взносов результатами',
growthMultiplierDesc: 'Определяет ежемесячную динамику роста взносов результатами других Исполнителей.',
capitalEfficiency: 'Эффективность капитала в месяц',
capitalEfficiencyDesc: 'Показывает, сколько членских взносов за документы формируется на каждый новый рубль складочного капитала в месяц.',
membershipFeeGrowth: 'Множитель роста эффективности капитала',
membershipFeeGrowthDesc: 'Определяет ежемесячный прирост членских взносов по формуле сложного процента, которая применяется на эффективности капитала.',
months: 'мес.',
},
// === Таблица результатов по месяцам ===
monthlyResultsTable: {
title: 'Складочный капитал по месяцам',
brief: 'Кратко',
detailed: 'Подробно',
columns: {
month: 'Месяц',
monthTooltip: 'Номер месяца от начала участия. Месяц 1 - момент вступления, месяц 2 - первый месяц после внесения вашего взноса',
shareholderCapital: 'Складочный капитал',
shareholderCapitalTooltip: 'Общая сумма всех взносов и Премий в системе на конец месяца, с учетом выплат членских взносов, которые уменьшают складочный капитал',
capitalGrowth: 'Прирост складочного капитала',
capitalGrowthTooltip: 'Общий прирост складочного капитала за месяц с учетом всех взносов и Премий',
monthlyGeneration: 'Сумма генерации',
monthlyGenerationTooltip: 'Общая сумма стоимости взносов Исполнителей и Авторов/Соавторов, а также их дополнительных взносов за месяц (без учета Благороста участникам программы и взносов Инвесторов).',
contributorsBonus: 'Благорост участникам программы',
contributorsBonusTooltip: 'Дополнительная капитализация, рассчитываемая по коэффициенту золотого сечения от новых взносов Исполнителей и Авторов/Соавторов.',
monthlyInvestorAmount: 'Взнос других Инвесторов',
monthlyInvestorAmountTooltip: 'Денежный взнос других Инвесторов в текущем месяце',
totalInvestorsAmount: 'Сумма взносов Инвесторов',
totalInvestorsAmountTooltip: 'Накопительная сумма всех взносов всех Инвесторов с начала учета (включая Вас)',
investorsShare: 'Доля Инвесторов',
investorsShareTooltip: 'Процентная доля всех Инвесторов в общем складочном капитале системы',
currentMonthlyContributions: 'Взносы других Исполнителей и Инвесторов',
currentMonthlyContributionsTooltip: 'Общая сумма взносов других Исполнителей и Инвесторов в текущем месяце',
othersCreatorBase: 'Взнос других Исполнителей',
othersCreatorBaseTooltip: 'Базовая стоимость Результатов труда других Исполнителей в текущем месяце',
othersAuthorBase: 'Взнос Соавторов других Исполнителей',
othersAuthorBaseTooltip: 'Стоимость взносов Авторов/Соавторов, связанных с проектами других Исполнителей (61,8% от их базовой стоимости).',
othersCreatorBonus: 'Взнос других Исполнителей по астрономическому времени',
othersCreatorBonusTooltip: 'Часть взносов других Исполнителей, отражающая стоимость их астрономического времени.',
othersAuthorBonus: 'Взнос Соавторов других Исполнителей по астрономическому времени',
othersAuthorBonusTooltip: 'Часть взносов Соавторов других Исполнителей, отражающая стоимость астрономического времени.',
othersWithdrawalAmount: 'Возврат другим Исполнителям и Соавторам',
othersWithdrawalAmountTooltip: 'Сумма возвратов другим Исполнителям и их Соавторам в текущем месяце.',
initialContribution: 'Предполагаемая стоимость вашего паевого взноса',
initialContributionTooltip: 'Общая стоимость вашего взноса на конец месяца, включая первоначальный взнос и накопленную долю в Благоросте.',
creatorShare: 'Ваша предполагаемая доля в ОАП',
creatorShareTooltip: 'Процент вашей доли в общем складочном капитале, который формирует стоимость ОАП.',
monthlyFee: 'Предполагаемые членские взносы за документы',
monthlyFeeTooltip: 'Сумма членских взносов от кооперативов за документы, проведенные через приложения платформы в текущем месяце.',
accumulatedFees: 'Накопленные членские взносы за документооборот',
accumulatedFeesTooltip: 'Общая сумма накопленных членских взносов, ожидающих выплаты',
creatorMembershipFeePayment: 'Ваши предполагаемые возвраты из членских взносов',
creatorMembershipFeePaymentTooltip: 'Сумма, которую вы предположительно получите в текущем месяце: возврат стоимости взноса или выплаты из потока членских взносов.',
},
},
// === Ежемесячные взносы (отдельная секция) ===
monthlyContributions: {
title: 'Ежемесячные взносы результатами других Исполнителей',
sumLabel: 'Сумма взносов в месяц',
sumTooltip: 'Общая сумма паевых взносов результатами других Исполнителей, которые ежемесячно увеличивают складочный капитал и формируют Благорост.',
description: 'Ежемесячная сумма паевых взносов результатами других Исполнителей',
},
// === Footer ===
footer: {
note: 'Модель показывает, как ваш паевой взнос результатом и/или деньгами увеличивает долю в ОАП за счет капитализации и Благороста. Возвраты формируются потоком членских взносов кооперативов за документы в приложениях платформы.',
},
// === HTML (index.html) ===
html: {
title: 'БЛАГОРОСТ — Калькулятор модели',
description: 'Калькулятор модели Благорост: расчет предполагаемой выгоды, доли в ОАП и возвратов при паевых взносах результатом и/или деньгами.',
},
} as const;
export type Texts = typeof TEXTS;
+1 -1
View File
@@ -11,7 +11,7 @@ export const BaseCard: FC<BaseCardProps> = ({
title,
children,
className = 'mb-md',
headStyle = { backgroundColor: '#f0f5ff', fontWeight: 'bold' },
headStyle,
flexGrow = true,
style,
bodyStyle,
@@ -1,4 +1,4 @@
import { BaseCard, LabelText, DescriptionText, SharedTooltip, DebouncedInputSlider } from '../../../shared';
import { BaseCard, DescriptionText, DebouncedInputSlider, TEXTS } from '../../../shared';
import { FC } from 'react';
interface ContributionFormSectionProps {
@@ -11,12 +11,8 @@ export const ContributionFormSection: FC<ContributionFormSectionProps> = ({
onContributionAmountChange,
}) => {
return (
<BaseCard title="Ваш взнос временем">
<BaseCard title={TEXTS.contributionForm.title}>
<div className="input-container" style={{ flex: '1 1 auto', display: 'flex', flexDirection: 'column' }}>
{/* <LabelText> */}
{/* Укажите стоимость труда */}
{/* <SharedTooltip text="Стоимость труда, который вы вносите в систему. Расчитывается как затраченное время на «Результат» по вашей ставке за час." /> */}
{/* </LabelText> */}
<DebouncedInputSlider
value={contributionAmount}
onChange={onContributionAmountChange}
@@ -29,7 +25,7 @@ export const ContributionFormSection: FC<ContributionFormSectionProps> = ({
tooltipFormatter={(value: number | undefined) => `${value?.toLocaleString('ru-RU')}`}
/>
<DescriptionText>
Укажите стоимость труда, который Вы вносите в «Результат» как «Исполнитель». Взнос увеличивает вашу долю в складочном капитале и создаёт «Премии», которые капитализируются новыми взносами "трудом" и возвращаются из числа членских взносов кооперативов за использование системы электронного документооборота платформы. Стоимость взноса расчитывается как затраченное время на «Результат» по вашей ставке за час.
{TEXTS.contributionForm.description}
</DescriptionText>
</div>
</BaseCard>
@@ -1,6 +1,6 @@
import { Typography, Row, Col } from 'antd';
import { FC, useEffect, useState } from 'react';
import { BaseCard, LabelText, SharedTooltip } from '../../../shared';
import { BaseCard, SharedTooltip, TEXTS } from '../../../shared';
import ReactApexChart from 'react-apexcharts';
const { Text } = Typography;
@@ -53,15 +53,15 @@ export const ContributionResultsSection: FC<ContributionResultsSectionProps> = (
// Метки для графика
const pieLabels = [
'Ваш взнос «Исполнителя»',
'Ваш взнос «Инвестора»',
'Взнос «Авторов»',
'Ваша «Прибавка» «Исполнителя»',
'«Прибавка» «Авторов»',
'«Прибавка» «Участников»',
'Вклад других «Инвесторов»',
'Взнос других «Создателей»',
'«Прибавка» других «Создателей»'
TEXTS.contributionResults.pieLabels.yourExecutorContribution,
TEXTS.contributionResults.pieLabels.yourInvestorContribution,
TEXTS.contributionResults.pieLabels.authorsContribution,
TEXTS.contributionResults.pieLabels.yourExecutorBonus,
TEXTS.contributionResults.pieLabels.authorsBonus,
TEXTS.contributionResults.pieLabels.participantsBonus,
TEXTS.contributionResults.pieLabels.otherInvestorsContribution,
TEXTS.contributionResults.pieLabels.otherCreatorsContribution,
TEXTS.contributionResults.pieLabels.otherCreatorsBonus,
];
// Цвета для графика
@@ -107,6 +107,7 @@ export const ContributionResultsSection: FC<ContributionResultsSectionProps> = (
colors: pieColors,
legend: {
position: 'bottom',
horizontalAlign: 'left',
fontSize: '14px',
},
dataLabels: {
@@ -129,7 +130,8 @@ export const ContributionResultsSection: FC<ContributionResultsSectionProps> = (
height: 300
},
legend: {
position: 'bottom'
position: 'bottom',
horizontalAlign: 'left'
}
}
}]
@@ -137,70 +139,70 @@ export const ContributionResultsSection: FC<ContributionResultsSectionProps> = (
}, [creatorBaseValue, authorBaseValue, creatorBonus, authorBonus, additionalCapitalization, initialMonthlyInvestorAmount, investorAmount, firstMonthOthersCreatorBase, firstMonthOthersAuthorBase, firstMonthOthersCreatorBonus, firstMonthOthersAuthorBonus]);
return (
<BaseCard title="Складочный капитал в первый месяц">
<BaseCard title={TEXTS.contributionResults.title}>
<Row gutter={[16, 16]}>
<Col xs={24} lg={12} className='mt-md'>
<div className="result-item">
<Text>
Ваш взнос «Исполнителя»:
<SharedTooltip text="Стоимость вашего «Результата» труда, который вы внесли в систему. Это то, за что вы можете получить возврат, в зависимости от процента возврата стоимости." />
{TEXTS.contributionResults.pieLabels.yourExecutorContribution}:
<SharedTooltip text={TEXTS.contributionResults.tooltips.yourExecutorContribution} />
</Text>
<Text strong>{creatorBaseValue.toLocaleString('ru-RU')} </Text>
</div>
<div className="result-item">
<Text>
Ваш взнос «Инвестора»:
<SharedTooltip text="Сумма денежных средств, которые вы внесли как «Инвестор». Этот взнос не создаёт премий, но увеличивает вашу долю в складочном капитале." />
{TEXTS.contributionResults.pieLabels.yourInvestorContribution}:
<SharedTooltip text={TEXTS.contributionResults.tooltips.yourInvestorContribution} />
</Text>
<Text strong>{investorAmount.toLocaleString('ru-RU')} </Text>
</div>
<div className="result-item">
<Text>
Ваша «Прибавка» «Исполнителя»:
<SharedTooltip text="Дополнительная сумма, которую система начисляет Вам как «Создателю» «Результата» (100% от стоимости вашего «Результата» за вычетом выплаченной компенсации стоимости труда). «Прибавка» всегда капитализируется и увеличивает вашу долю в складочном капитале." />
{TEXTS.contributionResults.pieLabels.yourExecutorBonus}:
<SharedTooltip text={TEXTS.contributionResults.tooltips.yourExecutorBonus} />
</Text>
<Text strong>{creatorBonus.toLocaleString('ru-RU')} </Text>
</div>
<div className="result-item">
<Text>
Взнос «Авторов»:
<SharedTooltip text="Общая стоимость труда всех «Авторов» в первом месяце (61.8% от стоимости всех «Результатов»). Включает как ваших «Авторов», так и «Авторов» других «Создателей»." />
{TEXTS.contributionResults.pieLabels.authorsContribution}:
<SharedTooltip text={TEXTS.contributionResults.tooltips.authorsContribution} />
</Text>
<Text strong>{((authorBaseValue || 0) + (firstMonthOthersAuthorBase || 0)).toLocaleString('ru-RU')} </Text>
</div>
<div className="result-item">
<Text>
«Прибавка» «Авторов»:
<SharedTooltip text="Общая сумма «Премий» всех «Авторов» (100% от стоимости их труда). Включает «Премии» как ваших «Авторов», так и «Авторов» других «Создателей». «Премии» капитализируются в складочном капитале." />
{TEXTS.contributionResults.pieLabels.authorsBonus}:
<SharedTooltip text={TEXTS.contributionResults.tooltips.authorsBonus} />
</Text>
<Text strong>{((authorBonus || 0) + (firstMonthOthersAuthorBonus || 0)).toLocaleString('ru-RU')} </Text>
</div>
<div className="result-item">
<Text>
«Прибавка» «Ранние участники»:
<SharedTooltip text="Дополнительная капитализация для «Ранние участники» («Авторов», «Исполнителей» и «Инвесторов»), рассчитанная по коэффициенту золотого сечения (161.8% от суммы стоимости и премий «Авторов» и «Исполнителей» за вычетом их возвратов). Эта «Прибавка» увеличивает общий складочный капитал и распределяется между всеми участниками согласно доле." />
{TEXTS.contributionResults.pieLabels.participantsBonusResult}:
<SharedTooltip text={TEXTS.contributionResults.tooltips.participantsBonus} />
</Text>
<Text strong>{additionalCapitalization.toLocaleString('ru-RU')} </Text>
</div>
<div className="result-item">
<Text>
Взнос других «Инвесторов»:
<SharedTooltip text="Суммарный взнос других «Инвесторов» в первом месяце, т.е. не Ваш. Этот взнос влияет на общий складочный капитал и обеспечивает возврат стоимости взносов «Авторов» и «Исполнителей»." />
{TEXTS.contributionResults.pieLabels.otherInvestorsContributionResult}:
<SharedTooltip text={TEXTS.contributionResults.tooltips.otherInvestorsContribution} />
</Text>
<Text strong>{initialMonthlyInvestorAmount.toLocaleString('ru-RU')} </Text>
</div>
<div className="result-item">
<Text>
Взнос других «Создателей»:
<SharedTooltip text="Стоимость «Результатов» труда других «Создателей» в первом месяце (если вы действуете только как инвестор). Эти взносы учитываются в общей генерации и влияют на распределение капитала." />
{TEXTS.contributionResults.pieLabels.otherCreatorsContribution}:
<SharedTooltip text={TEXTS.contributionResults.tooltips.otherCreatorsContribution} />
</Text>
<Text strong>{firstMonthOthersCreatorBase.toLocaleString('ru-RU')} </Text>
</div>
<div className="result-item">
<Text>
«Прибавка» других «Создателей»:
<SharedTooltip text="Дополнительная сумма, начисляемая другим «Исполнителям» (100% от стоимости их «Результатов»). Эта «Прибавка» капитализируется в складочном капитале." />
{TEXTS.contributionResults.pieLabels.otherCreatorsBonus}:
<SharedTooltip text={TEXTS.contributionResults.tooltips.otherCreatorsBonus} />
</Text>
<Text strong>{firstMonthOthersCreatorBonus.toLocaleString('ru-RU')} </Text>
</div>
+2 -5
View File
@@ -1,16 +1,13 @@
import { Typography } from 'antd';
import { FC } from 'react';
import { TEXTS } from '../../../shared';
const { Text } = Typography;
export const FooterNote: FC = () => {
return (
<div className="footer-note">
<Text type="secondary">
Модель демонстрирует рост вашей доли от взносов других участников при взносе результатом и/или деньгами.
Капитализация распределяется пропорционально долям, что увеличивает ваш взнос с каждым месяцем.
Членские взносы кооперативов за электронный документооборот обеспечивают возврат взносов.
</Text>
<Text type="secondary">{TEXTS.footer.note}</Text>
</div>
);
};
@@ -1,4 +1,4 @@
import { BaseCard, LabelText, DescriptionText, SharedTooltip, DebouncedInputSlider } from '../../../shared';
import { BaseCard, DescriptionText, DebouncedInputSlider, TEXTS } from '../../../shared';
import { FC } from 'react';
interface InvestmentFormSectionProps {
@@ -11,7 +11,7 @@ export const InvestmentFormSection: FC<InvestmentFormSectionProps> = ({
onInvestorAmountChange,
}) => {
return (
<BaseCard title="Ваш взнос деньгами">
<BaseCard title={TEXTS.investmentForm.title}>
<div className="input-container" style={{ flex: '1 1 auto', display: 'flex', flexDirection: 'column' }}>
<DebouncedInputSlider
value={investorAmount}
@@ -25,7 +25,7 @@ export const InvestmentFormSection: FC<InvestmentFormSectionProps> = ({
tooltipFormatter={(value: number | undefined) => `${value?.toLocaleString('ru-RU')}`}
/>
<DescriptionText>
Сумма денежных средств, которые вы вносите в «Результат» как «Инвестор». Взнос деньгами увеличивает вашу долю в складочном капитале и позволяет авторам и исполнителям получать выплаты по стоимости их труда.
{TEXTS.investmentForm.description}
</DescriptionText>
</div>
</BaseCard>
+25 -25
View File
@@ -1,6 +1,6 @@
import { FC } from 'react';
import { Typography, Divider, Row, Col } from 'antd';
import { BaseCard } from '../../../shared';
import { BaseCard, TEXTS } from '../../../shared';
import '../styles/legend.css';
import { UserOutlined, BulbOutlined, DollarCircleOutlined, TeamOutlined, FileTextOutlined } from '@ant-design/icons';
@@ -9,71 +9,71 @@ const { Text } = Typography;
export const LegendSection: FC = () => {
return (
<BaseCard
title="Легенда"
title={TEXTS.legend.title}
className="mb-md"
>
<Row gutter={[16, 16]}>
<Col xs={24} sm={12} lg={6}>
<div className="legend-role">
<Text className="legend-role-title"><UserOutlined style={{ fontSize: 24, marginRight: 8 }} />«Исполнитель»</Text>
<Text>Участник, который создаёт результат, внося своё время.</Text>
<Text className="legend-role-title"><UserOutlined style={{ fontSize: 24, marginRight: 8 }} />{TEXTS.legend.executor}</Text>
<Text>{TEXTS.legend.executorDesc}</Text>
</div>
</Col>
<Col xs={24} sm={12} lg={6}>
<div className="legend-role">
<Text className="legend-role-title"><BulbOutlined style={{ fontSize: 24, marginRight: 8 }} />«Автор»</Text>
<Text>Участник, который предложил проектную идею для «Результата».</Text>
<Text className="legend-role-title"><BulbOutlined style={{ fontSize: 24, marginRight: 8 }} />{TEXTS.legend.author}</Text>
<Text>{TEXTS.legend.authorDesc}</Text>
</div>
</Col>
<Col xs={24} sm={12} lg={6}>
<div className="legend-role">
<Text className="legend-role-title"><DollarCircleOutlined style={{ fontSize: 24, marginRight: 8 }} />«Инвестор»</Text>
<Text>Участник, который предоставляет денежные средства для создания результата.</Text>
<Text className="legend-role-title"><DollarCircleOutlined style={{ fontSize: 24, marginRight: 8 }} />{TEXTS.legend.investor}</Text>
<Text>{TEXTS.legend.investorDesc}</Text>
</div>
</Col>
<Col xs={24} sm={12} lg={6}>
<div className="legend-role">
<Text className="legend-role-title"><TeamOutlined style={{ fontSize: 24, marginRight: 8 }} />Участник</Text>
<Text>Любой участник системы, получающий выгоду от капитализации взносов в результат.</Text>
<Text className="legend-role-title"><TeamOutlined style={{ fontSize: 24, marginRight: 8 }} />{TEXTS.legend.participant}</Text>
<Text>{TEXTS.legend.participantDesc}</Text>
</div>
</Col>
</Row>
<Row gutter={[16, 16]} style={{ marginTop: '25px' }} justify={"space-around"}>
<Col xs={24} lg={6} style={{ display: 'flex', justifyContent: 'center' }}>
<Row gutter={[16, 16]} style={{ marginTop: '25px' }} justify="start">
<Col xs={24} lg={6} style={{ display: 'flex', justifyContent: 'flex-start' }}>
<div className="legend-role">
<Text className="legend-role-title"><FileTextOutlined style={{ fontSize: 24, marginRight: 8 }} />«Результат»</Text>
<Text>Полезный объект интеллектуальной собственности - программа, презентация, приложение, метод, ...</Text>
<Text className="legend-role-title"><FileTextOutlined style={{ fontSize: 24, marginRight: 8 }} />{TEXTS.legend.result}</Text>
<Text>{TEXTS.legend.resultDesc}</Text>
</div>
</Col>
<Col xs={24} lg={6} style={{ display: 'flex', justifyContent: 'center' }}>
<Col xs={24} lg={6} style={{ display: 'flex', justifyContent: 'flex-start' }}>
<div className="legend-role">
<Text className="legend-role-title"><FileTextOutlined style={{ fontSize: 24, marginRight: 8 }} />«Доля»</Text>
<Text>Часть складочного капитала, выраженная в праве требования возврата паевого взноса из кооператива.</Text>
<Text className="legend-role-title"><FileTextOutlined style={{ fontSize: 24, marginRight: 8 }} />{TEXTS.legend.share}</Text>
<Text>{TEXTS.legend.shareDesc}</Text>
</div>
</Col>
<Col xs={24} lg={6} style={{ display: 'flex', justifyContent: 'center' }}>
<Col xs={24} lg={6} style={{ display: 'flex', justifyContent: 'flex-start' }}>
<div className="legend-role">
<Text className="legend-role-title"><FileTextOutlined style={{ fontSize: 24, marginRight: 8 }} />«Прибавка»</Text>
<Text>Дополнительный взнос, который образуется при внесении «Результата» в кооператив.</Text>
<Text className="legend-role-title"><FileTextOutlined style={{ fontSize: 24, marginRight: 8 }} />{TEXTS.legend.bonus}</Text>
<Text>{TEXTS.legend.bonusDesc}</Text>
</div>
</Col>
<Col xs={24} lg={6} style={{ display: 'flex', justifyContent: 'center' }}>
<Col xs={24} lg={6} style={{ display: 'flex', justifyContent: 'flex-start' }}>
<div className="legend-role">
<Text className="legend-role-title"><FileTextOutlined style={{ fontSize: 24, marginRight: 8 }} />«Благорост»</Text>
<Text>Увеличение «Доли» в «Результате» от «Премий».</Text>
<Text className="legend-role-title"><FileTextOutlined style={{ fontSize: 24, marginRight: 8 }} />{TEXTS.legend.blagorost}</Text>
<Text>{TEXTS.legend.blagorostDesc}</Text>
</div>
</Col>
</Row>
<Divider />
<div className="legend-description">
<Text>
<strong>Как это работает:</strong> Каждый взнос «Исполнителя» в «Результат» образует дополнительные взносы («Премии») для «Исполнителей», «Авторов» и «Ранние участники», которые определяются по золотому сечению, увеличивая «Долю» и «Результат» в целом. Денежные взносы «Инвесторов» не образуют дополнительных взносов («Премий») и обеспечивают компенсацию стоимости труда «Авторов» и «Исполнителей».
<strong>{TEXTS.legend.howItWorks}</strong> {TEXTS.legend.howItWorksText}
</Text>
</div>
<div className="legend-description">
<Text>
<strong>Бизнес-модель:</strong> Увеличение «Результатов» ведет к расширению экосистемы платформы «Кооперативной Экономики», где подключенные кооперативы оплачивают членские взносы за электронный документооборот по минимальной подписке и по факту за каждый произведенный документ. Эти членские взносы составляют основной источник обеспечения возвратов сформированной выгоды для «Ранние участники».
<strong>{TEXTS.legend.businessModel}</strong> {TEXTS.legend.businessModelText}
</Text>
</div>
</BaseCard>
@@ -1,4 +1,4 @@
import { BaseCard, LabelText, DescriptionText, SharedTooltip, DebouncedInputSlider } from '../../../shared';
import { BaseCard, LabelText, DescriptionText, SharedTooltip, DebouncedInputSlider, TEXTS } from '../../../shared';
import { FC } from 'react';
interface MonthlyContributionsSectionProps {
@@ -11,11 +11,11 @@ export const MonthlyContributionsSection: FC<MonthlyContributionsSectionProps> =
onMonthlyContributionsChange,
}) => {
return (
<BaseCard title="Ежемесячные взносы результатами других исполнителей">
<BaseCard title={TEXTS.monthlyContributions.title}>
<div className="input-container" style={{ flex: '1 1 auto', display: 'flex', flexDirection: 'column' }}>
<LabelText>
Сумма взносов в месяц
<SharedTooltip text="Общая сумма взносов результатами других исполнителей, вносимая ими в систему ежемесячно после вашего внесения результата. Эти взносы создают «Премии», которые увеличивают складочный капитал и приносят выгоду всем участникам, включая Вас." />
{TEXTS.monthlyContributions.sumLabel}
<SharedTooltip text={TEXTS.monthlyContributions.sumTooltip} />
</LabelText>
<DebouncedInputSlider
value={monthlyContributions}
@@ -25,12 +25,10 @@ export const MonthlyContributionsSection: FC<MonthlyContributionsSectionProps> =
step={100000}
formatter={(value: number | string) => `${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ' ')}
parser={(value: string | undefined) => value ? Number(value.replace(/\s/g, '')) : 0}
addonAfter="₽/мес"
tooltipFormatter={(value: number | undefined) => `${value?.toLocaleString('ru-RU')} ₽/мес`}
addonAfter={TEXTS.common.rublesPerMonth}
tooltipFormatter={(value: number | undefined) => `${value?.toLocaleString('ru-RU')} ${TEXTS.common.rublesPerMonth}`}
/>
<DescriptionText>
Ежемесячная сумма взносов результатами других исполнителей
</DescriptionText>
<DescriptionText>{TEXTS.monthlyContributions.description}</DescriptionText>
</div>
</BaseCard>
);
@@ -1,7 +1,9 @@
import { Table, Switch } from 'antd';
import { FC, useState } from 'react';
import { MonthlyResult, ColumnVisibility } from '../../../entities/core';
import { BaseCard, SharedTooltip } from '../../../shared';
import { BaseCard, SharedTooltip, TEXTS } from '../../../shared';
const C = TEXTS.monthlyResultsTable.columns;
interface MonthlyResultsTableProps {
results: MonthlyResult[];
@@ -25,117 +27,115 @@ export const MonthlyResultsTable: FC<MonthlyResultsTableProps> = ({
// Колонки для таблицы результатов
const allColumns = [
{
title: columnTitle('Месяц', 'Номер месяца от начала участия. Месяц 1 - момент вступления, месяц 2 - первый месяц после внесения вашего взноса'),
title: columnTitle(C.month, C.monthTooltip),
dataIndex: 'month',
key: 'month',
render: (value: number) => value + 1
},
{
title: columnTitle('Складочный капитал', 'Общая сумма всех взносов и «Премий» в системе на конец месяца, с учетом выплат членских взносов, которые уменьшают складочный капитал'),
title: columnTitle(C.shareholderCapital, C.shareholderCapitalTooltip),
dataIndex: 'shareholderCapital',
key: 'shareholderCapital',
render: (value: number) => value.toLocaleString('ru-RU') + ' RUB'
},
{
title: columnTitle('Прирост складочного капитала', 'Общий прирост складочного капитала за месяц с учетом всех взносов и «Премий»'),
title: columnTitle(C.capitalGrowth, C.capitalGrowthTooltip),
dataIndex: 'capitalGrowth',
key: 'capitalGrowth',
render: (value: number) => value.toLocaleString('ru-RU') + ' RUB'
},
{
title: columnTitle('Сумма генерации', 'Общая сумма стоимости взносов «Результатов» труда «Исполнителей» и «Авторов», а также их «Премий» (без учёта «Премий» «Ранние участники» и взносов «Инвесторов») за месяц'),
title: columnTitle(C.monthlyGeneration, C.monthlyGenerationTooltip),
dataIndex: 'monthlyGeneration',
key: 'monthlyGeneration',
render: (value: number) => value.toLocaleString('ru-RU') + ' RUB'
},
{
title: columnTitle('«Прибавка» «Ранние участники»', 'Дополнительная капитализация от новых взносов «Результатами» труда «Исполнителей» и «Авторов» (161.8% от суммы стоимости труда и их «Премий» за вычетом возвратов)'),
title: columnTitle(C.contributorsBonus, C.contributorsBonusTooltip),
dataIndex: 'contributorsBonus',
key: 'contributorsBonus',
render: (value: number) => value.toLocaleString('ru-RU') + ' RUB'
},
{
title: columnTitle('Взнос других «Инвесторов»', 'Денежный взнос других «Инвесторов» в текущем месяце'),
title: columnTitle(C.monthlyInvestorAmount, C.monthlyInvestorAmountTooltip),
dataIndex: 'monthlyInvestorAmount',
key: 'monthlyInvestorAmount',
render: (value: number) => value.toLocaleString('ru-RU') + ' RUB'
},
{
title: columnTitle('Сумма взносов «Инвесторов»', 'Накопительная сумма всех взносов всех «Инвесторов» с начала учета (включая Вас)'),
title: columnTitle(C.totalInvestorsAmount, C.totalInvestorsAmountTooltip),
dataIndex: 'totalInvestorsAmount',
key: 'totalInvestorsAmount',
render: (value: number) => value.toLocaleString('ru-RU') + ' RUB'
},
{
title: columnTitle('Доля «Инвесторов»', 'Процентная доля всех «Инвесторов» в общем складочном капитале системы'),
title: columnTitle(C.investorsShare, C.investorsShareTooltip),
dataIndex: 'investorsShare',
key: 'investorsShare',
render: (value: number) => value + ' %'
},
{
title: columnTitle('Взносы других «Исполнителей» и «Инвесторов»', 'Общая сумма взносов других «Исполнителей» и «Инвесторов» в текущем месяце'),
title: columnTitle(C.currentMonthlyContributions, C.currentMonthlyContributionsTooltip),
dataIndex: 'currentMonthlyContributions',
key: 'currentMonthlyContributions',
render: (value: number) => value.toLocaleString('ru-RU') + ' RUB'
},
,
{
title: columnTitle('Взнос других «Исполнителей»', 'Базовая стоимость «Результатов» труда других «Исполнителей» в текущем месяце'),
title: columnTitle(C.othersCreatorBase, C.othersCreatorBaseTooltip),
dataIndex: 'othersCreatorBase',
key: 'othersCreatorBase',
render: (value: number) => value.toLocaleString('ru-RU') + ' RUB'
},
{
title: columnTitle('Взнос «Авторов» других', 'Стоимость труда «Авторов», связанных с «Результатами» других «Исполнителей» (61.8% от их базовой стоимости)'),
title: columnTitle(C.othersAuthorBase, C.othersAuthorBaseTooltip),
dataIndex: 'othersAuthorBase',
key: 'othersAuthorBase',
render: (value: number) => value.toLocaleString('ru-RU') + ' RUB'
},
{
title: columnTitle('«Прибавка» других «Создателей»', 'Дополнительная сумма, начисляемая другим «Исполнителям» (100% от стоимости их «Результатов»)'),
title: columnTitle(C.othersCreatorBonus, C.othersCreatorBonusTooltip),
dataIndex: 'othersCreatorBonus',
key: 'othersCreatorBonus',
render: (value: number) => value.toLocaleString('ru-RU') + ' RUB'
},
{
title: columnTitle('«Прибавка» «Авторов» других', 'Дополнительная сумма, начисляемая «Авторам» других «Создателей» (100% от стоимости их труда)'),
title: columnTitle(C.othersAuthorBonus, C.othersAuthorBonusTooltip),
dataIndex: 'othersAuthorBonus',
key: 'othersAuthorBonus',
render: (value: number) => value.toLocaleString('ru-RU') + ' RUB'
},
{
title: columnTitle('Возврат другим', 'Сумма возврата стоимости «Результатов» другим «Исполнителям» и их «Авторам» в текущем месяце'),
title: columnTitle(C.othersWithdrawalAmount, C.othersWithdrawalAmountTooltip),
dataIndex: 'othersWithdrawalAmount',
key: 'othersWithdrawalAmount',
render: (value: number) => value.toLocaleString('ru-RU') + ' RUB'
},
{
title: columnTitle('Предполагаемая стоимость вашего взноса', 'Общая сумма вашего взноса на конец месяца, включая первоначальный взнос и накопленную долю в «Прибавка»х «Ранние участники»'),
title: columnTitle(C.initialContribution, C.initialContributionTooltip),
dataIndex: 'initialContribution',
key: 'initialContribution',
render: (value: number) => value.toLocaleString('ru-RU') + ' RUB'
},
{
title: columnTitle('Ваша предполагаемая доля', 'Процент Вашей доли в общем складочном капитале системы'),
title: columnTitle(C.creatorShare, C.creatorShareTooltip),
dataIndex: 'creatorShare',
key: 'creatorShare',
render: (value: number) => value + ' %'
},
{
title: columnTitle('Предполагаемые членские взносы за документооборот', 'Сумма членских взносов за электронный документооборот, получаемые от подключенных кооперативов в текущем месяце'),
title: columnTitle(C.monthlyFee, C.monthlyFeeTooltip),
dataIndex: 'monthlyFee',
key: 'monthlyFee',
render: (value: number) => value.toLocaleString('ru-RU') + ' RUB'
},
{
title: columnTitle('Накопленные членские взносы за документооборот', 'Общая сумма накопленных членских взносов, ожидающих выплаты'),
title: columnTitle(C.accumulatedFees, C.accumulatedFeesTooltip),
dataIndex: 'accumulatedFees',
key: 'accumulatedFees',
render: (value: number) => value.toLocaleString('ru-RU') + ' RUB'
},
{
title: columnTitle('Ваши предполагаемые возвраты', 'Сумма, которую вы предположительно получите в текущем месяце (возврат стоимости «Результата» в 1 месяце или членские взносы в последующих месяцах выплат)'),
title: columnTitle(C.creatorMembershipFeePayment, C.creatorMembershipFeePaymentTooltip),
dataIndex: 'creatorMembershipFeePayment',
key: 'creatorMembershipFeePayment',
render: (value: number) => value.toLocaleString('ru-RU') + ' RUB'
@@ -159,14 +159,14 @@ export const MonthlyResultsTable: FC<MonthlyResultsTableProps> = ({
.filter(Boolean) as Exclude<typeof allColumns[number], undefined>[]; // Явно приводим к массиву колонок без undefined
return (
<BaseCard title="Складочный капитал по месяцам" className="mt-lg mb-md">
<BaseCard title={TEXTS.monthlyResultsTable.title} className="mt-lg mb-md">
<div style={{ marginBottom: 16, textAlign: 'right' }}>
<span style={{ marginRight: 8 }}>Кратко</span>
<span style={{ marginRight: 8 }}>{TEXTS.monthlyResultsTable.brief}</span>
<Switch
checked={isDetailedView}
onChange={setIsDetailedView}
/>
<span style={{ marginLeft: 8 }}>Подробно</span>
<span style={{ marginLeft: 8 }}>{TEXTS.monthlyResultsTable.detailed}</span>
</div>
<Table
dataSource={results}
@@ -1,6 +1,6 @@
import { Typography, Row, Col, Statistic } from 'antd';
import { FC } from 'react';
import { BaseCard, DescriptionText } from '../../../shared';
import { BaseCard, DescriptionText, TEXTS } from '../../../shared';
const { Text } = Typography;
@@ -24,36 +24,34 @@ export const ProfitabilityResultsSection: FC<ProfitabilityResultsSectionProps> =
creatorBonus,
}) => {
return (
<BaseCard title="Предполагаемая выгода">
<Row gutter={16} align="bottom" style={{ marginBottom: 16 }}>
<BaseCard title={TEXTS.profitabilityResults.title}>
<Row className="profitability-stats-row" gutter={16} align="bottom" style={{ marginBottom: 16 }}>
<Col flex="1 1 50%">
<Statistic
title="Годовых"
className="theme-stat-value"
title={TEXTS.profitabilityResults.annual}
value={annualYield}
precision={2}
suffix="%"
valueStyle={{ color: '#111', fontWeight: 700, fontSize: 30 }}
/>
</Col>
<Col flex="1 1 50%">
<Statistic
title="«Прибавка» «Исполнителя»"
className="theme-stat-value"
title={TEXTS.profitabilityResults.creatorBonus}
value={creatorBonus}
precision={0}
prefix="+"
suffix="₽"
valueStyle={{ color: '#111', fontWeight: 700, fontSize: 30 }}
/>
</Col>
</Row>
<DescriptionText>
Включает в себя: предполагаемую выгоду от дополнительных взносов («Премий»), увеличивающих стоимость Вашего права требования; членские взносы кооперативов за использование электронного документооборота платформы; а также единоразовую «Премию» «Исполнителя» за взнос трудом.
{TEXTS.profitabilityResults.description}
</DescriptionText>
<div className="disclaimer" style={{ marginTop: '16px', fontSize: '12px', background: 'rgba(223, 136, 64, 0.68)', padding: '12px', borderRadius: '8px' }}>
<div className="theme-disclaimer">
<Text italic>
Указанное значение годовой выгоды является предположительным и может изменяться как в большую так и в меньшую сторону в зависимости
от фактической эффективности использования капитала, динамики прироста новых взносов,
а также поведения «Авторов» и «Создателей» в отношении возвратов стоимости их труда.
{TEXTS.profitabilityResults.disclaimer}
</Text>
</div>
</BaseCard>
@@ -1,6 +1,6 @@
import { Row, Col, Space, Badge } from 'antd';
import { FC } from 'react';
import { BaseCard, LabelText, DescriptionText, SharedTooltip, DebouncedInputSlider } from '../../../shared';
import { BaseCard, LabelText, DescriptionText, SharedTooltip, DebouncedInputSlider, TEXTS } from '../../../shared';
import { CALCULATOR_CONSTANTS } from '../../../entities/core/model/constants';
@@ -30,7 +30,7 @@ export const SystemParamsSection: FC<SystemParamsSectionProps> = ({
onMonthlyContributionsChange,
}) => {
return (
<BaseCard title="Параметры и Допущения">
<BaseCard title={TEXTS.systemParams.title}>
<Row gutter={[32, 24]}>
{/* Левая колонка — константы */}
<Col xs={24} md={12}>
@@ -40,14 +40,14 @@ export const SystemParamsSection: FC<SystemParamsSectionProps> = ({
word-break: break-all;
}
`}</style>
<LabelText style={{ width: '100%', textAlign: 'center' }}>Константы</LabelText>
<LabelText style={{ width: '100%', textAlign: 'center' }}>{TEXTS.systemParams.constants}</LabelText>
<Space direction="vertical" size={16} style={{ width: '100%', alignItems: 'flex-start' }}>
<Badge
color="#13c2c2"
text={
<span>
Стоимость труда «Исполнителя»: <b>{(100).toFixed(1)}%</b>
<SharedTooltip text="Доля «Исполнителя» — это часть, которую получает «Исполнитель» «Результата» труда (100% от его стоимости)." />
{TEXTS.systemParams.executorLaborCost}: <b>{(100).toFixed(1)}%</b>
<SharedTooltip text={TEXTS.systemParams.executorLaborCostTooltip} />
</span>
}
/>
@@ -55,8 +55,8 @@ export const SystemParamsSection: FC<SystemParamsSectionProps> = ({
color="#52c41a"
text={
<span>
Стоимость труда «Автора» от «Исполнителя»: <b>{(CALCULATOR_CONSTANTS.AUTHOR_RATIO * 100).toFixed(1)}%</b>
<SharedTooltip text="Доля «Автора» — это часть, которую получает «Автор» «Результата» (61.8% от стоимости «Исполнителя»)." />
{TEXTS.systemParams.authorLaborCost}: <b>{(CALCULATOR_CONSTANTS.AUTHOR_RATIO * 100).toFixed(1)}%</b>
<SharedTooltip text={TEXTS.systemParams.authorLaborCostTooltip} />
</span>
}
/>
@@ -64,8 +64,8 @@ export const SystemParamsSection: FC<SystemParamsSectionProps> = ({
color="#1890ff"
text={
<span>
«Прибавка» «Исполнителя»: <b>{(CALCULATOR_CONSTANTS.CREATOR_BONUS_RATIO * 100).toFixed(0)}%</b>
<SharedTooltip text="«Прибавка» «Исполнителя» — дополнительная сумма, начисляемая «Создателю» (100% от его стоимости)." />
{TEXTS.systemParams.executorBonus}: <b>{(CALCULATOR_CONSTANTS.CREATOR_BONUS_RATIO * 100).toFixed(0)}%</b>
<SharedTooltip text={TEXTS.systemParams.executorBonusTooltip} />
</span>
}
/>
@@ -73,8 +73,8 @@ export const SystemParamsSection: FC<SystemParamsSectionProps> = ({
color="#722ed1"
text={
<span>
«Прибавка» «Автора»: <b>{(CALCULATOR_CONSTANTS.AUTHOR_BONUS_RATIO * 100).toFixed(0)}%</b>
<SharedTooltip text="«Прибавка» «Автора» — дополнительная сумма, начисляемая «Автору» (100% от его стоимости)." />
{TEXTS.systemParams.authorBonus}: <b>{(CALCULATOR_CONSTANTS.AUTHOR_BONUS_RATIO * 100).toFixed(0)}%</b>
<SharedTooltip text={TEXTS.systemParams.authorBonusTooltip} />
</span>
}
/>
@@ -82,8 +82,8 @@ export const SystemParamsSection: FC<SystemParamsSectionProps> = ({
color="#faad14"
text={
<span>
«Прибавка» «Ранние участники»: <b>{CALCULATOR_CONSTANTS.GOLDEN_RATIO * 100}%</b>
<SharedTooltip text="«Прибавка» «Ранние участники» — коэффициент (1.618), по которому рассчитывается дополнительная выгода для ранних участников." />
{TEXTS.systemParams.participantsBonus}: <b>{CALCULATOR_CONSTANTS.GOLDEN_RATIO * 100}%</b>
<SharedTooltip text={TEXTS.systemParams.participantsBonusTooltip} />
</span>
}
/>
@@ -91,8 +91,8 @@ export const SystemParamsSection: FC<SystemParamsSectionProps> = ({
color="#d4380d"
text={
<span>
Месяцы выплат: <b>{CALCULATOR_CONSTANTS.PAYOUT_MONTHS.join(', ')}</b>
<SharedTooltip text="Месяцы выплат — периоды, в которые участникам выплачиваются накопленные членские взносы." />
{TEXTS.systemParams.payoutMonths}: <b>{CALCULATOR_CONSTANTS.PAYOUT_MONTHS.join(', ')}</b>
<SharedTooltip text={TEXTS.systemParams.payoutMonthsTooltip} />
</span>
}
/>
@@ -100,8 +100,8 @@ export const SystemParamsSection: FC<SystemParamsSectionProps> = ({
color="#9254de"
text={
<span>
Отложенные первые выплаты: <b>{CALCULATOR_CONSTANTS.DELAYED_FIRST_PAYMENTS} мес.</b>
<SharedTooltip text="Начало накопления членских взносов откладывается на указанное количество месяцев после первого взноса." />
{TEXTS.systemParams.delayedFirstPayments}: <b>{CALCULATOR_CONSTANTS.DELAYED_FIRST_PAYMENTS} {TEXTS.systemParams.months}</b>
<SharedTooltip text={TEXTS.systemParams.delayedFirstPaymentsTooltip} />
</span>
}
/>
@@ -109,16 +109,14 @@ export const SystemParamsSection: FC<SystemParamsSectionProps> = ({
color="#d4380d"
text={
<span>
Обеспечение инвестициями: <b>100%</b>
<SharedTooltip text="Модель предполагает, что каждый месяц в систему инвестируются средства, обеспечивающие возвраты стоимости труда «Исполнителям» и «Авторам» в полном объеме." />
{TEXTS.systemParams.investmentProvision}: <b>100%</b>
<SharedTooltip text={TEXTS.systemParams.investmentProvisionTooltip} />
</span>
}
/>
</Space>
<div className="disclaimer" style={{ marginTop: '16px', fontSize: '12px', background: 'rgba(223, 136, 64, 0.68)', padding: '12px', borderRadius: '8px' }}>
<span style={{ fontStyle: 'italic' }}>
При снижении уровня взносов от инвесторов возвраты стоимости труда «Исполнителям» и «Авторам» могут быть отложены до поступления достаточного объёма новых инвестиций.
</span>
<div className="theme-disclaimer">
<span style={{ fontStyle: 'italic' }}>{TEXTS.systemParams.disclaimer}</span>
</div>
</div>
</Col>
@@ -127,7 +125,7 @@ export const SystemParamsSection: FC<SystemParamsSectionProps> = ({
<Space direction="vertical" size={32} style={{ width: '100%' }}>
{/* Стартовая капитализация */}
<div className="p-md">
<LabelText>Стартовый складочный капитал</LabelText>
<LabelText>{TEXTS.systemParams.initialCapital}</LabelText>
<DebouncedInputSlider
value={initialCapital}
onChange={onInitialCapitalChange}
@@ -141,12 +139,12 @@ export const SystemParamsSection: FC<SystemParamsSectionProps> = ({
sliderStyle={{ marginBottom: 16 }}
/>
<DescriptionText>
Начальный складочный капитал, на базе которого производится расчет. Фиксируется и публикуется в бухгалтерской отчетности кооператива ежеквартально.
{TEXTS.systemParams.initialCapitalDesc}
</DescriptionText>
</div>
{/* Ежемесячные взносы результатами других создателей */}
<div className="p-md" >
<LabelText>Ежемесячные взносы трудом других «Создателей»</LabelText>
<LabelText>{TEXTS.systemParams.monthlyContributions}</LabelText>
<DebouncedInputSlider
value={monthlyContributions}
onChange={onMonthlyContributionsChange}
@@ -155,17 +153,17 @@ export const SystemParamsSection: FC<SystemParamsSectionProps> = ({
step={100000}
formatter={(value: number | string) => `${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ' ')}
parser={(value: string | undefined) => value ? Number(value.replace(/\s/g, '')) : 0}
addonAfter="₽/мес"
tooltipFormatter={(value: number | undefined) => `${value?.toLocaleString('ru-RU')} ₽/мес`}
addonAfter={TEXTS.common.rublesPerMonth}
tooltipFormatter={(value: number | undefined) => `${value?.toLocaleString('ru-RU')} ${TEXTS.common.rublesPerMonth}`}
sliderStyle={{ marginBottom: 16 }}
/>
<DescriptionText>
Общая сумма взносов «Результатами» других «Создателей», вносимая ими в систему ежемесячно после вашего внесения «Результата». Эти взносы создают «Премии», которые увеличивают складочный капитал и приносят выгоду всем участникам, включая Вас.
{TEXTS.systemParams.monthlyContributionsDesc}
</DescriptionText>
</div>
{/* Множитель роста взносов результатами */}
<div className="p-md" >
<LabelText>Множитель роста взносов «Результатами»</LabelText>
<LabelText>{TEXTS.systemParams.growthMultiplier}</LabelText>
<DebouncedInputSlider
value={growthMultiplier}
onChange={onGrowthMultiplierChange}
@@ -177,12 +175,12 @@ export const SystemParamsSection: FC<SystemParamsSectionProps> = ({
unitSuffix="%"
/>
<DescriptionText>
Определяет динамику роста «Результатов» - насколько увеличиваются взносы «Результатов» других «Создателей» каждый месяц
{TEXTS.systemParams.growthMultiplierDesc}
</DescriptionText>
</div>
{/* Эффективность капитала */}
<div className="p-md" >
<LabelText>Эффективность капитала в месяц</LabelText>
<LabelText>{TEXTS.systemParams.capitalEfficiency}</LabelText>
<DebouncedInputSlider
value={membershipFee}
onChange={onMembershipFeeChange}
@@ -194,12 +192,12 @@ export const SystemParamsSection: FC<SystemParamsSectionProps> = ({
unitSuffix="%"
/>
<DescriptionText>
Эффективность показывает, сколько членских взносов приходит за электронный документооборот на каждый новый рубль складочного капитала в месяц.
{TEXTS.systemParams.capitalEfficiencyDesc}
</DescriptionText>
</div>
{/* Множитель роста членских взносов */}
<div className="p-md" >
<LabelText>Множитель роста эффективности капитала</LabelText>
<LabelText>{TEXTS.systemParams.membershipFeeGrowth}</LabelText>
<DebouncedInputSlider
value={membershipFeeGrowthMultiplier}
onChange={onMembershipFeeGrowthMultiplierChange}
@@ -211,7 +209,7 @@ export const SystemParamsSection: FC<SystemParamsSectionProps> = ({
unitSuffix="%"
/>
<DescriptionText>
Определяет ежемесячный прирост членских взносов по формуле сложного процента, которая применяется на эффективности капитала.
{TEXTS.systemParams.membershipFeeGrowthDesc}
</DescriptionText>
</div>
</Space>
@@ -1,4 +1,4 @@
import { BaseCard, LabelText, DescriptionText, SharedTooltip, DebouncedInputSlider } from '../../../shared';
import { BaseCard, DescriptionText, DebouncedInputSlider, TEXTS } from '../../../shared';
import { FC } from 'react';
interface WithdrawalRateSectionProps {
@@ -11,7 +11,7 @@ export const WithdrawalRateSection: FC<WithdrawalRateSectionProps> = ({
onWithdrawalRateChange,
}) => {
return (
<BaseCard title="Возврат стоимости труда">
<BaseCard title={TEXTS.withdrawalRate.title}>
<div>
<div className="slider-container">
<DebouncedInputSlider
@@ -27,12 +27,7 @@ export const WithdrawalRateSection: FC<WithdrawalRateSectionProps> = ({
/>
</div>
<DescriptionText>
Определяет долю стоимости труда, которая будет выплачена после внесения «Результата» в кооператив. Оставленная в кооперативе часть стоимости капитализируется новыми взносами «Исполнителей». Важно: в этой модели мы предполагаем, что `Все действуют как Вы` - т.е. каждый исполнитель и автор будет возвращать такую же часть стоимости, какую Вы укажите здесь для себя.
{/* {withdrawalRate === 0
? "Вся стоимость труда остается в системе (максимальная выгода)"
: withdrawalRate === 100
? "Вся стоимость труда возвращается при внесении «Результата» (минимальная выгода)"
: "Часть стоимости труда возвращается, а часть капитализируется новыми «Результатами»"} */}
{TEXTS.withdrawalRate.description}
</DescriptionText>
</div>
</BaseCard>