restyle
This commit is contained in:
+12
-2
@@ -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>
|
||||
|
||||
@@ -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 />;
|
||||
}
|
||||
@@ -1,10 +1,3 @@
|
||||
#root {
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.calculator-container {
|
||||
max-width: 100%;
|
||||
margin: 0 auto;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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(
|
||||
|
||||
@@ -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 />
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
+2
-1
@@ -1,3 +1,4 @@
|
||||
export * from './ui';
|
||||
export * from './lib/urlParams';
|
||||
export * from './lib/hooks/useUrlParams';
|
||||
export * from './lib/hooks/useUrlParams';
|
||||
export { TEXTS } from './lib/texts';
|
||||
@@ -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;
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user