a lot of changes
This commit is contained in:
@@ -21,7 +21,7 @@ alwaysApply: false
|
||||
* @brief Завершение голосования для конкретного участника по методу Водянова.
|
||||
* Рассчитывает полные итоговые суммы участника включая:
|
||||
* - Результаты голосования по Водянову: (сумма голосов + общая сумма распределения) / количество голосующих
|
||||
* - Фиксированные распределения: 61.8% авторских премий равно между авторами, 61.8% создательских премий прямо создателям
|
||||
* - Фиксированные распределения: 61.8% авторских премий равно между авторами, 61.8% исполнительских премий прямо создателям
|
||||
* Обновляет сегмент участника с итоговыми суммами раздельно по пулам
|
||||
* @param coopname Наименование кооператива
|
||||
* @param username Наименование пользователя-участника голосования
|
||||
|
||||
@@ -25,7 +25,7 @@ alwaysApply: false
|
||||
### Диаграммы последовательности:
|
||||
- Использовать ТОЛЬКО sequenceDiagram вместо graph или flowchart
|
||||
- Участники (participant) называть понятными русскими именами:
|
||||
- "Вкладчик" вместо "User" или "Участник"
|
||||
- "Участник" вместо "User" или "Участник"
|
||||
- "Capital Contract" вместо технических названий
|
||||
- "Soviet Contract", "Gateway Contract" для системных контрактов
|
||||
- В сообщениях использовать ЧЕЛОВЕКО-ЧИТАЕМЫЕ описания вместо технических имен методов:
|
||||
@@ -47,7 +47,7 @@ alwaysApply: false
|
||||
\htmlonly
|
||||
<div class="mermaid">
|
||||
sequenceDiagram
|
||||
participant V as Вкладчик
|
||||
participant V as Участник
|
||||
participant C as Capital Contract
|
||||
participant S as Soviet Contract
|
||||
|
||||
@@ -66,12 +66,12 @@ sequenceDiagram
|
||||
Пример оформления процесса
|
||||
/**
|
||||
|
||||
@defgroup public_capital_registration_process Процесс регистрации вкладчиков
|
||||
@defgroup public_capital_registration_process Процесс регистрации участников
|
||||
@ingroup public_capital_processes
|
||||
|
||||
@pre предварительные условия
|
||||
|
||||
Процесс приёма договора УХД от пайщика, фиксации его статуса как вкладчика
|
||||
Процесс приёма договора УХД от пайщика, фиксации его статуса как участника
|
||||
и обеспечения технической возможности участвовать в проектах и программе капитализации.
|
||||
|
||||
``` cpp
|
||||
|
||||
@@ -35,7 +35,7 @@ alwaysApply: false
|
||||
* @brief Завершение голосования для конкретного участника по методу Водянова.
|
||||
* Рассчитывает полные итоговые суммы участника включая:
|
||||
* - Результаты голосования по Водянову: (сумма голосов + общая сумма распределения) / количество голосующих
|
||||
* - Фиксированные распределения: 61.8% авторских премий равно между авторами, 61.8% создательских премий прямо создателям
|
||||
* - Фиксированные распределения: 61.8% авторских премий равно между авторами, 61.8% исполнительских премий прямо создателям
|
||||
* Обновляет сегмент участника с итоговыми суммами раздельно по пулам
|
||||
* @param coopname Наименование кооператива
|
||||
* @param username Наименование пользователя-участника голосования
|
||||
|
||||
@@ -25,7 +25,7 @@ alwaysApply: false
|
||||
### Диаграммы последовательности:
|
||||
- Использовать ТОЛЬКО sequenceDiagram вместо graph или flowchart
|
||||
- Участники (participant) называть понятными русскими именами:
|
||||
- "Вкладчик" вместо "User" или "Участник"
|
||||
- "Участник" вместо "User" или "Участник"
|
||||
- "Capital Contract" вместо технических названий
|
||||
- "Soviet Contract", "Gateway Contract" для системных контрактов
|
||||
- В сообщениях использовать ЧЕЛОВЕКО-ЧИТАЕМЫЕ описания вместо технических имен методов:
|
||||
@@ -47,7 +47,7 @@ alwaysApply: false
|
||||
\htmlonly
|
||||
<div class="mermaid">
|
||||
sequenceDiagram
|
||||
participant V as Вкладчик
|
||||
participant V as Участник
|
||||
participant C as Capital Contract
|
||||
participant S as Soviet Contract
|
||||
|
||||
@@ -66,12 +66,12 @@ sequenceDiagram
|
||||
Пример оформления процесса
|
||||
/**
|
||||
|
||||
@defgroup public_capital_registration_process Процесс регистрации вкладчиков
|
||||
@defgroup public_capital_registration_process Процесс регистрации участников
|
||||
@ingroup public_capital_processes
|
||||
|
||||
@pre предварительные условия
|
||||
|
||||
Процесс приёма договора УХД от пайщика, фиксации его статуса как вкладчика
|
||||
Процесс приёма договора УХД от пайщика, фиксации его статуса как участника
|
||||
и обеспечения технической возможности участвовать в проектах и программе капитализации.
|
||||
|
||||
``` cpp
|
||||
|
||||
@@ -3,14 +3,14 @@
|
||||
* @defgroup public_capital_debt_process Выдача ссуды
|
||||
* @ingroup public_capital_processes
|
||||
*
|
||||
* Процесс выдачи беспроцентных ссуд Вкладчикам проекта на основании их трудовых
|
||||
* Процесс выдачи беспроцентных ссуд Участникам проекта на основании их трудовых
|
||||
* и иных вкладов. Ссуды ограничены provisional_amount сегмента и погашаются
|
||||
* автоматически при внесении результата в кооператив.
|
||||
*
|
||||
* ## Назначение процесса
|
||||
*
|
||||
* Система ссуд обеспечивает Вкладчикам компенсацию трудозатрат в процессе работы над проектом:
|
||||
* - Вкладчики получают средства до завершения проекта
|
||||
* Система ссуд обеспечивает Участникам компенсацию трудозатрат в процессе работы над проектом:
|
||||
* - Участники получают средства до завершения проекта
|
||||
* - Размер ссуды ограничен фактическими вкладами и привлечёнными инвестициями
|
||||
* - Ссуды беспроцентные, что стимулирует активное участие
|
||||
* - Ссулы автоматически погашаются при внесении результата исключает проблемы с возвратом
|
||||
@@ -18,7 +18,7 @@
|
||||
* ## Математические основы расчёта ссуд
|
||||
*
|
||||
* ### Базовая формула доступной себестоимости
|
||||
* Доступная себестоимость - это себестоимость труда, которую вкладчик может использовать для получения ссуды.
|
||||
* Доступная себестоимость - это себестоимость труда, которую участник может использовать для получения ссуды.
|
||||
*
|
||||
* ``` cpp
|
||||
* provisional_amount = (creator_base + author_base + coordinator_base) × (return_base_percent / 100)
|
||||
@@ -31,15 +31,15 @@
|
||||
* - return_base_percent - коэффициент доступности средств (зависит от количества инвестиций)
|
||||
*
|
||||
* ### Ограничения на выдачу
|
||||
* - Долг Вкладчика по проекту меньше доступной себестоимости (debt_amount < provisional_amount)
|
||||
* - Вкладчик находится в одной из или нескольких ролях: автор, создатель или координатор
|
||||
* - Долг Участника по проекту меньше доступной себестоимости (debt_amount < provisional_amount)
|
||||
* - Участник находится в одной из или нескольких ролях: автор, исполнитель или координатор
|
||||
*
|
||||
* ## Диаграмма процесса
|
||||
*
|
||||
* \htmlonly
|
||||
* <div class="mermaid">
|
||||
* sequenceDiagram
|
||||
* participant P as Вкладчик
|
||||
* participant P as Участник
|
||||
* participant C as Capital Contract
|
||||
* participant S as Soviet Contract
|
||||
* participant G as Gateway Contract
|
||||
@@ -48,7 +48,7 @@
|
||||
* P->>C: 1. createdebt(заявление на ссуду)
|
||||
* Note over C: Проверка лимитов
|
||||
* Note over C: debt_amount + amount ≤ provisional_amount
|
||||
* Note over C: Увеличение debt_amount в сегменте вкладчика
|
||||
* Note over C: Увеличение debt_amount в сегменте участника
|
||||
*
|
||||
* C->>S: 2. soviet::create_approval
|
||||
*
|
||||
@@ -88,19 +88,19 @@
|
||||
*
|
||||
* ### Шаг 1: Создание заявления на получение ссуды
|
||||
*
|
||||
* Вкладчик подаёт заявление на получение беспроцентной ссуды через действие @ref capital::createdebt.
|
||||
* Участник подаёт заявление на получение беспроцентной ссуды через действие @ref capital::createdebt.
|
||||
*
|
||||
* @pre Предварительные условия:
|
||||
* - Проект находится в активном статусе
|
||||
* - Вкладчик имеет активный сегмент в проекте
|
||||
* - Общий долг Вкладчика плюс запрашиваемая сумма меньше или равна сумме доступной себестоимости
|
||||
* - Участник имеет активный сегмент в проекте
|
||||
* - Общий долг Участника плюс запрашиваемая сумма меньше или равна сумме доступной себестоимости
|
||||
* - Сумма доступной себестоимости больше нуля (есть вклады, обеспеченные инвестициями)
|
||||
*
|
||||
* @note Доступная себестоимость (provisional_amount) представляет собой себестоимость вкладов Вкладчика,
|
||||
* @note Доступная себестоимость (provisional_amount) представляет собой себестоимость вкладов Участника,
|
||||
* скорректированную на коэффициент возврата. Этот коэффициент показывает, какая часть базовых
|
||||
* затрат обеспечена привлечёнными в проект инвестициями. Чем больше инвестиций привлечено,
|
||||
* тем выше коэффициент и тем больше средств доступно для выдачи в виде ссуд.
|
||||
* Коэффициент возврата себестоимости не превышает 100% от себестоимости затрат Вкладчиков.
|
||||
* Коэффициент возврата себестоимости не превышает 100% от себестоимости затрат Участников.
|
||||
* При превышении количества инвестиций суммы затрат, у инвесторов уменьшается коэффициент использования инвестиций, и они получат часть средств назад при закрытии проекта.
|
||||
*
|
||||
* <b>Входящие параметры:</b>
|
||||
@@ -110,7 +110,7 @@
|
||||
*
|
||||
* @post Результат выполнения:
|
||||
* - 📄 Создаётся заявление в таблице Capital::debts
|
||||
* - Резервируется сумма долга в сегменте Вкладчика, что не позволяет повторно отправлять заявления
|
||||
* - Резервируется сумма долга в сегменте Участника, что не позволяет повторно отправлять заявления
|
||||
*
|
||||
* ### Шаг 2: Одобрение заявки председателем
|
||||
*
|
||||
@@ -138,23 +138,23 @@
|
||||
* - При отклонении заявка закрывается
|
||||
*
|
||||
* @note Совет рассматривает целесообразность выдачи, оценивает риски для проекта
|
||||
* и утверждает выдачу ссуды по заявлению вкладчика или отклоняет его.
|
||||
* и утверждает выдачу ссуды по заявлению участника или отклоняет его.
|
||||
*
|
||||
* ### Шаг 4: Подтверждение оплаты
|
||||
* Лицо, обладающее доступом к расчётному счёту кооператива совершает исходящий платеж и отмечает его выполненным.
|
||||
* Контракт @ref public_gateway "Шлюза" подтверждает успешное перечисление средств Вкладчику через действие @ref capital::debtpaycnfrm.
|
||||
* Контракт @ref public_gateway "Шлюза" подтверждает успешное перечисление средств Участнику через действие @ref capital::debtpaycnfrm.
|
||||
*
|
||||
* @pre Предварительные условия:
|
||||
* - 📄 Совет авторизовал выдачу ссуды
|
||||
* - Gateway инициировал платёж
|
||||
|
||||
* @post Результат выполнения:
|
||||
* - 📄 Фиксируется факт получения средств Вкладчиком
|
||||
* - 📄 Фиксируется факт получения средств Участником
|
||||
* - Создаётся запись в контракте @ref public_loan "Ссуд"
|
||||
* - Увеличивается общий долг Вкладчика в системе
|
||||
* - Вкладчик получает средства на свой банковский счёт
|
||||
* - Увеличивается общий долг Участника в системе
|
||||
* - Участник получает средства на свой банковский счёт
|
||||
*
|
||||
* @note Создание записи о долге в контракте loan фиксирует обязательство Вкладчика
|
||||
* @note Создание записи о долге в контракте loan фиксирует обязательство Участника
|
||||
* по возврату полученных средств, информация о котором доступна в том числе и в других контрактах.
|
||||
*
|
||||
* ### Альтернативные пути: Отклонение и отказы
|
||||
@@ -166,7 +166,7 @@
|
||||
* @post Результат выполнения:
|
||||
* - Заявка удаляется из системы
|
||||
* - Размер долга в сегменте уменьшается
|
||||
* - Вкладчик может подать заявку повторно
|
||||
* - Участник может подать заявку повторно
|
||||
*
|
||||
* #### Отклонение заявки
|
||||
*
|
||||
@@ -181,20 +181,20 @@
|
||||
* Ссуды погашаются автоматически при внесении результата через действие @ref capital::pushrslt.
|
||||
*
|
||||
* @pre Предварительные условия:
|
||||
* - Вкладчик вносит результат через pushrslt
|
||||
* - Участник вносит результат через pushrslt
|
||||
* - Указывается сумма долга для погашения
|
||||
*
|
||||
* @post Результат выполнения:
|
||||
* - Сумма долга вычитается из стоимости результата после его внесения
|
||||
* - Производится зачёт через контракт @ref public_loan
|
||||
* - Списывается долг в контракте @ref public_loan
|
||||
* - Уменьшаются обязательства Вкладчика
|
||||
* - Уменьшаются обязательства Участника
|
||||
*
|
||||
* @note Автоматическое погашение обеспечивает защиту от рисков невозврата средств.
|
||||
*
|
||||
* ## Примеры расчёта доступных ссуд
|
||||
*
|
||||
* ### Пример 1: Создатель с коммитами
|
||||
* ### Пример 1: Исполнитель с коммитами
|
||||
* - Себестоимость работы создателя = 100,000 рублей (50 часов × 2000 рублей/час)
|
||||
* - Коэффициент возврата = 80% (инвестиции покрывают 80% себестоимости затрат)
|
||||
* - Обеспеченная сумма = 100,000 × 0.8 = 80,000 рублей
|
||||
@@ -212,8 +212,8 @@
|
||||
* - Обеспеченная сумма = 6,400 × 0.8 = 5,120 рублей
|
||||
* - <b>Доступная ссуда: до 5,120 рублей</b>
|
||||
*
|
||||
* @note В примерах показано, как размер доступной ссуды зависит от фактических вкладов Вкладчика и
|
||||
* коэффициента обеспеченности инвестициями. Чем больше Вкладчик вложил и чем больше инвестиций
|
||||
* @note В примерах показано, как размер доступной ссуды зависит от фактических вкладов Участника и
|
||||
* коэффициента обеспеченности инвестициями. Чем больше Участник вложил и чем больше инвестиций
|
||||
* привлечено в проект, тем больше средств доступно для получения в виде ссуды.
|
||||
*
|
||||
* ## Влияние на конвертацию сегмента
|
||||
|
||||
+5
-5
@@ -3,14 +3,14 @@
|
||||
* @defgroup public_capital_fundprog_process Фондирование членских взносов на программу
|
||||
* @ingroup public_capital_processes
|
||||
*
|
||||
* Кооператив может направлять накопленные членские взносы на распределение между всеми вкладчиками программы "Капитализация" в целях обеспечения возвратов их вкладов.
|
||||
* Кооператив может направлять накопленные членские взносы на распределение между всеми участниками программы "Капитализация" в целях обеспечения возвратов их вкладов.
|
||||
* Источником для регистрации входящих членских взносов является кошелек накопленных членских взносов кооператива.
|
||||
*
|
||||
* Процесс использует механизм CRPS - обновляет кумулятивный показатель на уровне программы
|
||||
* без одновременного пересчета персональных кошельков вкладчиков. Расчёты долей по каждому вкладчику запрашиваются отдельно по @ref public_capital_refresh_program_process "процессу обновления кошелька программы".
|
||||
* без одновременного пересчета персональных кошельков участников. Расчёты долей по каждому участнику запрашиваются отдельно по @ref public_capital_refresh_program_process "процессу обновления кошелька программы".
|
||||
*
|
||||
* @note CRPS помогает обойти ограничения блокчейна на количество одновременных математических вычислений, которые должны быть выполнены при приёме блока в цепочку каждым делегатом.
|
||||
* Алгоритм позволяет динамично распределять общий пул среди вкладчиков независимо друг от друга и производя вычисления только для одного вкладчика за раз. Подробнее о алгоритме здесь: @ref public_capital_crps_algorithm.
|
||||
* Алгоритм позволяет динамично распределять общий пул среди участников независимо друг от друга и производя вычисления только для одного участника за раз. Подробнее о алгоритме здесь: @ref public_capital_crps_algorithm.
|
||||
*
|
||||
* Формула обновления кумулятивного показателя:
|
||||
*
|
||||
@@ -39,9 +39,9 @@
|
||||
* ### Шаг 1: Регистрация членских взносов программы
|
||||
* @ref capital::fundprog "Регистрация входящих членских взносов по программе"
|
||||
*
|
||||
* Кооператив направляет накопленные членские взносы на распределение между вкладчиками программы капитализации.
|
||||
* Кооператив направляет накопленные членские взносы на распределение между участниками программы капитализации.
|
||||
* Для этого требуется вызов от авторизованного контракта (soviet/gateway) с указанием кооператива,
|
||||
* суммы взноса и мемо. Метод валидирует сумму и обновляет кумулятивный показатель CRPS. После регистрации взноса вкладчики могут самостоятельно обновить свои начисления через @ref public_capital_refresh_program_process "процесс обновления кошелька программы". Или, кооператив может обновить эту информацию за них, но по одному.
|
||||
* суммы взноса и мемо. Метод валидирует сумму и обновляет кумулятивный показатель CRPS. После регистрации взноса участники могут самостоятельно обновить свои начисления через @ref public_capital_refresh_program_process "процесс обновления кошелька программы". Или, кооператив может обновить эту информацию за них, но по одному.
|
||||
*
|
||||
* @post Обновление показателя CRPS для программы капитализации
|
||||
*
|
||||
|
||||
+11
-11
@@ -3,12 +3,12 @@
|
||||
@defgroup public_capital_refresh_program_process Обновление кошелька программы
|
||||
@ingroup public_capital_processes
|
||||
|
||||
Процесс обновления в кошельке вкладчика информации о накопленном обеспечения членскими взносами в программе для возврата.
|
||||
Процесс обновления в кошельке участника информации о накопленном обеспечения членскими взносами в программе для возврата.
|
||||
Использует алгоритм CRPS для расчёта персональных начислений на основе
|
||||
кумулятивного показателя программы и доли вкладчика.
|
||||
кумулятивного показателя программы и доли участника.
|
||||
|
||||
Процесс обновляет доступные средства в кошельке программы вкладчика на основе разности между
|
||||
текущим кумулятивным показателем программы и персональным слепком вкладчика.
|
||||
Процесс обновляет доступные средства в кошельке программы участника на основе разности между
|
||||
текущим кумулятивным показателем программы и персональным слепком участника.
|
||||
|
||||
@note кошелёк программы содержит информацию о накопленных членских взносах, доступных к возврату.
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
\htmlonly
|
||||
<div class="mermaid">
|
||||
sequenceDiagram
|
||||
participant P as Вкладчик
|
||||
participant P as Участник
|
||||
participant C as Capital Contract
|
||||
|
||||
P->>C: 1. Обновление кошелька программы
|
||||
@@ -29,27 +29,27 @@ sequenceDiagram
|
||||
</div>
|
||||
\endhtmlonly
|
||||
|
||||
@pre Вкладчик имеет баланс в программе капитализации
|
||||
@pre Участник имеет баланс в программе капитализации
|
||||
|
||||
## Пошаговое описание
|
||||
|
||||
### Шаг 1: Обновление кошелька программы
|
||||
@ref capital::refreshprog "Обновление кошелька программы"
|
||||
|
||||
Вкладчик инициирует обновление своего кошелька программы для обновления информации о доступных средствах к возврату из числа членских взносов в программу.
|
||||
Участник инициирует обновление своего кошелька программы для обновления информации о доступных средствах к возврату из числа членских взносов в программу.
|
||||
|
||||
Механика расчёта:
|
||||
- доля участника равна сумме заблокированных средств и доступных средств в кошельке программы
|
||||
- delta_crps равна разности кумулятивного показателя программы и персонального слепка вкладчика
|
||||
- delta_crps равна разности кумулятивного показателя программы и персонального слепка участника
|
||||
- новые начисления равны произведению delta_crps на долю участника
|
||||
|
||||
Вкладчик получает начисления пропорционально своей доле в программе.
|
||||
Участник получает начисления пропорционально своей доле в программе.
|
||||
Алгоритм CRPS обеспечивает справедливое распределение с учётом времени
|
||||
вхождения в программу и исключает начисления задним числом.
|
||||
|
||||
@note Математический пример:
|
||||
Вкладчик с долей 100000 рублей при кумулятивном показателе программы равном 0.15
|
||||
и персональном слепке вкладчика равном 0.05 получит: (0.15 - 0.05) * 100000 = 10000 рублей.
|
||||
Участник с долей 100000 рублей при кумулятивном показателе программы равном 0.15
|
||||
и персональном слепке участника равном 0.05 получит: (0.15 - 0.05) * 100000 = 10000 рублей.
|
||||
|
||||
@post доступные средства в кошельке программы увеличиваются на сумму новых начислений
|
||||
@post персональный слепок CRPS устанавливается равным кумулятивному показателю программы
|
||||
|
||||
+14
-14
@@ -3,20 +3,20 @@
|
||||
@defgroup public_capital_withdraw_from_program_process Возврат паевого взноса из программы
|
||||
@ingroup public_capital_processes
|
||||
|
||||
Процесс возврата накопленных средств вкладчикам из программы капитализации представляет
|
||||
Процесс возврата накопленных средств участникам из программы капитализации представляет
|
||||
собой формализованную процедуру частичного или полного вывода членских взносов,
|
||||
ранее внесенных вкладчиком в программу. Процесс включает подачу заявления вкладчиком,
|
||||
ранее внесенных участником в программу. Процесс включает подачу заявления участником,
|
||||
проверку достаточности накопленных средств, резервирование запрашиваемой суммы,
|
||||
принятие решения советом кооператива и непосредственный перевод средств в
|
||||
главный кошелёкек вкладчика. При отклонении заявления советом зарезервированная сумма возвращается
|
||||
в кошелек вкладчика в программе капитализации.
|
||||
главный кошелёкек участника. При отклонении заявления советом зарезервированная сумма возвращается
|
||||
в кошелек участника в программе капитализации.
|
||||
|
||||
## Диаграмма процесса
|
||||
|
||||
\htmlonly
|
||||
<div class="mermaid">
|
||||
sequenceDiagram
|
||||
participant P as Вкладчик
|
||||
participant P as Участник
|
||||
participant C as Capital Contract
|
||||
participant S as Soviet Contract
|
||||
participant W as Wallet Contract
|
||||
@@ -33,17 +33,17 @@ sequenceDiagram
|
||||
S->>C: 5. Авторизация возврата
|
||||
Note over C: Подтверждение операции
|
||||
C->>W: 6. Перевод средств в главный кошелёкёк
|
||||
Note over W: Средства становятся<br/>доступны вкладчику
|
||||
Note over W: Средства становятся<br/>доступны участнику
|
||||
else Отклонение советом
|
||||
S->>C: 5. Отклонение заявления
|
||||
Note over C: Возврат зарезервированной<br/>суммы в кошелек вкладчика
|
||||
Note over C: Возврат зарезервированной<br/>суммы в кошелек участника
|
||||
end
|
||||
</div>
|
||||
\endhtmlonly
|
||||
|
||||
## Подача заявления вкладчиком
|
||||
## Подача заявления участником
|
||||
|
||||
Вкладчик указывает сумму для возврата из программы капитализации. Система проверяет достаточность накопленных средств в программе. При успешной проверке запрашиваемая сумма резервируется (блокируется) в кошельке вкладчика в программе.
|
||||
Участник указывает сумму для возврата из программы капитализации. Система проверяет достаточность накопленных средств в программе. При успешной проверке запрашиваемая сумма резервируется (блокируется) в кошельке участника в программе.
|
||||
|
||||
## Рассмотрение председателем
|
||||
|
||||
@@ -55,16 +55,16 @@ sequenceDiagram
|
||||
|
||||
## Исполнение решения
|
||||
|
||||
При одобрении средства переводятся в главный кошелёкек вкладчика. При отклонении зарезервированная сумма возвращается в кошелек вкладчика в программе капитализации.
|
||||
При одобрении средства переводятся в главный кошелёкек участника. При отклонении зарезервированная сумма возвращается в кошелек участника в программе капитализации.
|
||||
|
||||
## Создание заявления на возврат из программы
|
||||
@ref capital::createwthd3 "Создание заявления на возврат из программы"
|
||||
|
||||
Вкладчик подаёт заявление на возврат части накопленных членских взносов из программы капитализации:
|
||||
Участник подаёт заявление на возврат части накопленных членских взносов из программы капитализации:
|
||||
|
||||
@pre <b>Входящий документ:</b> Заявление на возврат части паевого взноса из программы "Капитализация"
|
||||
@pre <b>Предварительные условия:</b>
|
||||
- Вкладчик имеет положительный баланс доступных средств в программе
|
||||
- Участник имеет положительный баланс доступных средств в программе
|
||||
- Запрашиваемая сумма не превышает доступный баланс
|
||||
|
||||
<b>Механика возврата:</b>
|
||||
@@ -72,7 +72,7 @@ sequenceDiagram
|
||||
- Проверяется достаточность доступных средств
|
||||
- Сумма резервируется для возврата, что уменьшает доступный баланс в кошельке программы
|
||||
|
||||
<b>Результат:</b> Заявление создано, средства зарезервированы для возврата. После применения возврата доступная сумма к возврату уменьшается, так как уменьшается сумма на кошельке вкладчика в программе.
|
||||
<b>Результат:</b> Заявление создано, средства зарезервированы для возврата. После применения возврата доступная сумма к возврату уменьшается, так как уменьшается сумма на кошельке участника в программе.
|
||||
|
||||
## Авторизация возврата из программы
|
||||
@ref capital::capauthwthd3 "Авторизация возврата из программы"
|
||||
@@ -86,7 +86,7 @@ sequenceDiagram
|
||||
@ref capital::capdeclwthd3 "Отклонение возврата из программы"
|
||||
|
||||
При отклонении заявления:
|
||||
- Сумма возвращается в кошелек вкладчика в программе капитализации
|
||||
- Сумма возвращается в кошелек участника в программе капитализации
|
||||
- Заявление удаляется из системы
|
||||
|
||||
## Эффекты процесса
|
||||
|
||||
+8
-8
@@ -3,16 +3,16 @@
|
||||
@defgroup public_capital_fundproj_process Фондирование членских взносов на проект
|
||||
@ingroup public_capital_processes
|
||||
|
||||
Кооператив может направлять накопленные членские взносы на распределение между всеми вкладчиками конкретного проекта.
|
||||
Кооператив может направлять накопленные членские взносы на распределение между всеми участниками конкретного проекта.
|
||||
Источником для регистрации входящих членских взносов является кошелек накопленных членских взносов кооператива по конкретному проекту.
|
||||
Распределяемые членские взносы на проект являются обеспечением для возврата паевых взносов вкладчиков, которые выбрали проектное направление при @ref public_capital_conversion_process "конвертации результата"
|
||||
Распределяемые членские взносы на проект являются обеспечением для возврата паевых взносов участников, которые выбрали проектное направление при @ref public_capital_conversion_process "конвертации результата"
|
||||
по процессу @ref public_capital_withdraw_from_project_process "возврата средств из кошелька проекта".
|
||||
|
||||
Процесс использует механизм CRPS - обновляет кумулятивный показатель на уровне проекта
|
||||
без одновременного пересчета персональных кошельков вкладчиков. Расчёты долей по каждому вкладчику запрашиваются отдельно по @ref public_capital_refresh_project_process "процессу обновления кошелька проекта".
|
||||
без одновременного пересчета персональных кошельков участников. Расчёты долей по каждому участнику запрашиваются отдельно по @ref public_capital_refresh_project_process "процессу обновления кошелька проекта".
|
||||
|
||||
@note CRPS помогает обойти ограничения блокчейна на количество одновременных математических вычислений, которые должны быть выполнены при приёме блока в цепочку каждым делегатом.
|
||||
Алгоритм позволяет динамично распределять общий пул среди вкладчиков независимо друг от друга и производя вычисления только для одного вкладчика за раз.
|
||||
Алгоритм позволяет динамично распределять общий пул среди участников независимо друг от друга и производя вычисления только для одного участника за раз.
|
||||
|
||||
Формула обновления кумулятивного показателя:
|
||||
|
||||
@@ -43,14 +43,14 @@ sequenceDiagram
|
||||
### Шаг 1: Регистрация членских взносов проекта
|
||||
@ref capital::fundproj "Регистрация входящих членских взносов по проекту"
|
||||
|
||||
Кооператив направляет накопленные членские взносы на распределение между вкладчиками конкретного проекта.
|
||||
Кооператив направляет накопленные членские взносы на распределение между участниками конкретного проекта.
|
||||
Для этого требуется вызов от авторизованного контракта (soviet/gateway) с указанием кооператива,
|
||||
хеша проекта, суммы взноса и мемо. Метод валидирует сумму, проверяет существование проекта и наличие долей,
|
||||
затем обновляет кумулятивный показатель CRPS для данного проекта. После регистрации взноса вкладчики могут самостоятельно обновить свои начисления через @ref public_capital_refresh_project_process "процесс обновления кошелька проекта". Или, кооператив может обновить эту информацию за них, но по одному.
|
||||
затем обновляет кумулятивный показатель CRPS для данного проекта. После регистрации взноса участники могут самостоятельно обновить свои начисления через @ref public_capital_refresh_project_process "процесс обновления кошелька проекта". Или, кооператив может обновить эту информацию за них, но по одному.
|
||||
|
||||
@post Обновление показателя CRPS для конкретного проекта
|
||||
@post Средства становятся доступны для распределения между вкладчиками проекта
|
||||
@post Обеспечение формируется для последующего возврата паевых взносов вкладчиков
|
||||
@post Средства становятся доступны для распределения между участниками проекта
|
||||
@post Обеспечение формируется для последующего возврата паевых взносов участников
|
||||
|
||||
## Эффекты процесса
|
||||
@include{doc} fundproj-effect.dox
|
||||
|
||||
+11
-11
@@ -3,12 +3,12 @@
|
||||
@defgroup public_capital_refresh_project_process Обновления кошелька проекта
|
||||
@ingroup public_capital_processes
|
||||
|
||||
Процесс обновления в кошельке вкладчика информации о накопленном обеспечении членскими взносами по конкретному проекту для возврата.
|
||||
Процесс обновления в кошельке участника информации о накопленном обеспечении членскими взносами по конкретному проекту для возврата.
|
||||
Использует алгоритм CRPS для расчёта персональных начислений на основе
|
||||
кумулятивного показателя проекта и доли вкладчика.
|
||||
кумулятивного показателя проекта и доли участника.
|
||||
|
||||
Процесс обновляет кошелёк проекта вкладчика на основе разности между
|
||||
текущим кумулятивным показателем проекта и персональным слепком вкладчика.
|
||||
Процесс обновляет кошелёк проекта участника на основе разности между
|
||||
текущим кумулятивным показателем проекта и персональным слепком участника.
|
||||
|
||||
@note кошелёк проекта содержит информацию о накопленных членских взносах от конкретного проекта, доступных к возврату.
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
\htmlonly
|
||||
<div class="mermaid">
|
||||
sequenceDiagram
|
||||
participant P as Вкладчик
|
||||
participant P as Участник
|
||||
participant C as Capital Contract
|
||||
|
||||
P->>C: 1. Обновление кошелька проекта
|
||||
@@ -29,28 +29,28 @@ sequenceDiagram
|
||||
</div>
|
||||
\endhtmlonly
|
||||
|
||||
@pre Вкладчик обладает кошельком в конкретном проекте
|
||||
@pre Участник обладает кошельком в конкретном проекте
|
||||
|
||||
## Пошаговое описание
|
||||
|
||||
### Шаг 1: Обновление кошелька проекта
|
||||
@ref capital::refreshproj "Обновление кошелька проекта"
|
||||
|
||||
Вкладчик инициирует обновление своего кошелька проекта для получения
|
||||
Участник инициирует обновление своего кошелька проекта для получения
|
||||
накопленных доходов от проектных членских взносов.
|
||||
|
||||
Механика расчёта:
|
||||
- доля участника равна количеству долей участника в конкретном проекте
|
||||
- delta_crps равна разности кумулятивного показателя проекта и персонального слепка вкладчика
|
||||
- delta_crps равна разности кумулятивного показателя проекта и персонального слепка участника
|
||||
- новые начисления равны произведению delta_crps на долю участника
|
||||
|
||||
Вкладчик получает начисления пропорционально своей доле в проекте.
|
||||
Участник получает начисления пропорционально своей доле в проекте.
|
||||
Алгоритм CRPS обеспечивает справедливое распределение с учётом времени
|
||||
вхождения в проект и исключает начисления задним числом.
|
||||
|
||||
@note Математический пример:
|
||||
Вкладчик с долей 1000 рублей при кумулятивном показателе проекта равном 0.15
|
||||
и персональном слепке вкладчика равном 0.05 получит: (0.15 - 0.05) * 1000 = 100 рублей.
|
||||
Участник с долей 1000 рублей при кумулятивном показателе проекта равном 0.15
|
||||
и персональном слепке участника равном 0.05 получит: (0.15 - 0.05) * 1000 = 100 рублей.
|
||||
|
||||
@post доступные средства в кошельке проекта увеличиваются на сумму новых начислений
|
||||
@post персональный слепок CRPS в кошельке проекта устанавливается равным кумулятивному показателю проекта
|
||||
|
||||
+13
-13
@@ -3,20 +3,20 @@
|
||||
@defgroup public_capital_withdraw_from_project_process Возврат паевого взноса из проекта
|
||||
@ingroup public_capital_processes
|
||||
|
||||
Процесс возврата накопленных средств вкладчикам из конкретного проекта представляет
|
||||
Процесс возврата накопленных средств участникам из конкретного проекта представляет
|
||||
собой формализованную процедуру частичного или полного вывода членских взносов,
|
||||
ранее внесенных вкладчиком в проект. Процесс включает подачу заявления вкладчиком,
|
||||
ранее внесенных участником в проект. Процесс включает подачу заявления участником,
|
||||
проверку достаточности накопленных средств, резервирование запрашиваемой суммы,
|
||||
принятие решения советом кооператива и непосредственный перевод средств в
|
||||
главный кошелёкек вкладчика. При отклонении заявления советом зарезервированная сумма возвращается
|
||||
в кошелек вкладчика в проекте.
|
||||
главный кошелёкек участника. При отклонении заявления советом зарезервированная сумма возвращается
|
||||
в кошелек участника в проекте.
|
||||
|
||||
## Диаграмма процесса
|
||||
|
||||
\htmlonly
|
||||
<div class="mermaid">
|
||||
sequenceDiagram
|
||||
participant P as Вкладчик
|
||||
participant P as Участник
|
||||
participant C as Capital Contract
|
||||
participant S as Soviet Contract
|
||||
|
||||
@@ -36,14 +36,14 @@ sequenceDiagram
|
||||
Note over C: Перевод средств в главный кошелёкёк
|
||||
else Отклонение советом
|
||||
S->>C: 5. Отклонение заявления
|
||||
Note over C: Возврат зарезервированной суммы<br/>в кошелек вкладчика
|
||||
Note over C: Возврат зарезервированной суммы<br/>в кошелек участника
|
||||
end
|
||||
</div>
|
||||
\endhtmlonly
|
||||
|
||||
## Подача заявления вкладчиком
|
||||
## Подача заявления участником
|
||||
|
||||
Вкладчик указывает сумму для возврата из конкретного проекта. Система проверяет достаточность накопленных средств в проекте. При успешной проверке запрашиваемая сумма резервируется (блокируется) в кошельке вкладчика в проекте.
|
||||
Участник указывает сумму для возврата из конкретного проекта. Система проверяет достаточность накопленных средств в проекте. При успешной проверке запрашиваемая сумма резервируется (блокируется) в кошельке участника в проекте.
|
||||
|
||||
## Рассмотрение председателем
|
||||
|
||||
@@ -55,16 +55,16 @@ sequenceDiagram
|
||||
|
||||
## Исполнение решения
|
||||
|
||||
При одобрении средства переводятся в главный кошелёкек вкладчика. При отклонении зарезервированная сумма возвращается в кошелек вкладчика в проекте.
|
||||
При одобрении средства переводятся в главный кошелёкек участника. При отклонении зарезервированная сумма возвращается в кошелек участника в проекте.
|
||||
|
||||
## Создание заявления на возврат из проекта
|
||||
@ref capital::createwthd2 "Создание заявления на возврат из проекта"
|
||||
|
||||
Вкладчик подаёт заявление на возврат части накопленных членских взносов из конкретного проекта:
|
||||
Участник подаёт заявление на возврат части накопленных членских взносов из конкретного проекта:
|
||||
|
||||
@pre <b>Входящий документ:</b> Заявление на возврат части паевого взноса из проекта
|
||||
@pre <b>Предварительные условия:</b>
|
||||
- Вкладчик имеет положительный баланс доступных средств в проекте
|
||||
- Участник имеет положительный баланс доступных средств в проекте
|
||||
- Запрашиваемая сумма не превышает доступный баланс
|
||||
|
||||
<b>Механика возврата:</b>
|
||||
@@ -72,7 +72,7 @@ sequenceDiagram
|
||||
- Проверяется достаточность доступных средств
|
||||
- Сумма резервируется для возврата, что уменьшает доступный баланс в кошельке проекта
|
||||
|
||||
<b>Результат:</b> Заявление создано, средства зарезервированы для возврата. После применения возврата доступная сумма к возврату уменьшается, так как уменьшается сумма на кошельке вкладчика в проекте.
|
||||
<b>Результат:</b> Заявление создано, средства зарезервированы для возврата. После применения возврата доступная сумма к возврату уменьшается, так как уменьшается сумма на кошельке участника в проекте.
|
||||
|
||||
## Авторизация возврата из проекта
|
||||
@ref capital::capauthwthd2 "Авторизация возврата из проекта"
|
||||
@@ -86,7 +86,7 @@ sequenceDiagram
|
||||
@ref capital::capdeclwthd2 "Отклонение возврата из проекта"
|
||||
|
||||
При отклонении заявления:
|
||||
- Сумма возвращается в кошелек вкладчика в проекте
|
||||
- Сумма возвращается в кошелек участника в проекте
|
||||
- Заявление удаляется из системы
|
||||
|
||||
## Эффекты процесса
|
||||
|
||||
+2
-2
@@ -3,7 +3,7 @@
|
||||
* Одобряет расход в проекте и отправляет в совет:
|
||||
* - Проверяет подлинность одобренного заявления
|
||||
* - Валидирует статус расхода (должен быть created)
|
||||
* - Проверяет что создатель является участником проекта
|
||||
* - Проверяет что исполнитель является участником проекта
|
||||
* - Одобряет расход (обновляет статус)
|
||||
* - Отправляет в совет для рассмотрения
|
||||
* @param coopname Наименование кооператива
|
||||
@@ -24,7 +24,7 @@ void capital::approveexpns(name coopname, name approver, checksum256 expense_has
|
||||
auto expense = Capital::Expenses::get_expense_or_fail(coopname, expense_hash);
|
||||
eosio::check(expense.status == Capital::Expenses::Status::CREATED, "Расход должен быть в статусе 'created'");
|
||||
|
||||
// Проверяем что создатель является участником проекта
|
||||
// Проверяем что исполнитель является участником проекта
|
||||
auto contributor = Capital::Contributors::get_active_contributor_with_appendix_or_fail(coopname, expense.project_hash, expense.username);
|
||||
|
||||
// Одобряем расход (простое обновление статуса)
|
||||
|
||||
+6
-6
@@ -3,14 +3,14 @@
|
||||
@defgroup public_capital_create_expense_process Списание расходов
|
||||
@ingroup public_capital_processes
|
||||
|
||||
Процесс создания, одобрения, авторизации и оплаты операционных расходов проекта из накопленного пула расходов представляет собой формализованную процедуру, которая позволяет вкладчикам проекта запрашивать расходы на операционные нужды проекта. Процесс включает подачу заявления вкладчиком, проверку достаточности накопленных средств в пуле расходов, резервирование запрашиваемой суммы, одобрение председателем и авторизацию советом кооператива. После авторизации происходит перевод средств через платёжный шлюз для оплаты расходов проекта.
|
||||
Процесс создания, одобрения, авторизации и оплаты операционных расходов проекта из накопленного пула расходов представляет собой формализованную процедуру, которая позволяет участникам проекта запрашивать расходы на операционные нужды проекта. Процесс включает подачу заявления участником, проверку достаточности накопленных средств в пуле расходов, резервирование запрашиваемой суммы, одобрение председателем и авторизацию советом кооператива. После авторизации происходит перевод средств через платёжный шлюз для оплаты расходов проекта.
|
||||
|
||||
## Диаграмма процесса
|
||||
|
||||
\htmlonly
|
||||
<div class="mermaid">
|
||||
sequenceDiagram
|
||||
participant P as Вкладчик
|
||||
participant P as Участник
|
||||
participant C as Capital Contract
|
||||
participant S as Soviet Contract
|
||||
participant G as Gateway Contract
|
||||
@@ -36,11 +36,11 @@ sequenceDiagram
|
||||
|
||||
## Подача заявления о расходе
|
||||
|
||||
Вкладчик проекта подает заявление о необходимости расхода с указанием суммы расхода, описания назначения и обоснования в заявлении. Система проверяет подлинность заявления и корректность данных.
|
||||
Участник проекта подает заявление о необходимости расхода с указанием суммы расхода, описания назначения и обоснования в заявлении. Система проверяет подлинность заявления и корректность данных.
|
||||
|
||||
## Проверка участия в проекте
|
||||
|
||||
Система проверяет наличие активного договора УХД вкладчика в проекте. Только активные вкладчики с подписанными приложениями могут создавать расходы.
|
||||
Система проверяет наличие активного договора УХД участника в проекте. Только активные участники с подписанными приложениями могут создавать расходы.
|
||||
|
||||
## Проверка уникальности расхода
|
||||
|
||||
@@ -72,11 +72,11 @@ sequenceDiagram
|
||||
## Создание заявления о расходе
|
||||
@ref capital::createexpnse "Создание расхода"
|
||||
|
||||
Вкладчик проекта подаёт заявление о необходимости операционного расхода:
|
||||
Участник проекта подаёт заявление о необходимости операционного расхода:
|
||||
|
||||
@pre <b>Входящий документ:</b> Заявление о необходимости операционного расхода проекта
|
||||
@pre <b>Предварительные условия:</b>
|
||||
- Вкладчик имеет активный договор УХД в проекте
|
||||
- Участник имеет активный договор УХД в проекте
|
||||
- Накопленные средства пула расходов достаточны для покрытия расхода
|
||||
- Сумма расхода положительная
|
||||
|
||||
|
||||
+2
-2
@@ -3,7 +3,7 @@
|
||||
* Создает расход в проекте с резервированием средств:
|
||||
* - Проверяет подлинность заявления о расходе
|
||||
* - Валидирует сумму расхода (положительная)
|
||||
* - Проверяет что создатель является участником проекта
|
||||
* - Проверяет что исполнитель является участником проекта
|
||||
* - Валидирует уникальность расхода по хешу
|
||||
* - Проверяет доступность средств в пуле расходов проекта
|
||||
* - Резервирует средства в проекте
|
||||
@@ -29,7 +29,7 @@ void capital::createexpnse(eosio::name coopname, checksum256 expense_hash, check
|
||||
|
||||
eosio::check(amount.amount > 0, "Сумма должна быть положительной");
|
||||
|
||||
// Проверяем что создатель является участником проекта
|
||||
// Проверяем что исполнитель является участником проекта
|
||||
auto contributor = Capital::Contributors::get_active_contributor_with_appendix_or_fail(coopname, project_hash, creator);
|
||||
|
||||
// Проверяем что расхода с таким хэшем нет
|
||||
|
||||
@@ -35,7 +35,7 @@ void capital::approvecmmt(eosio::name coopname, eosio::name master, checksum256
|
||||
commit.amounts.authors_base_pool,
|
||||
commit.amounts.authors_bonus_pool);
|
||||
|
||||
// Распределяем премии вкладчиков между всеми вкладчиками проекта через CRPS
|
||||
// Распределяем премии участников между всеми участниками проекта через CRPS
|
||||
Capital::Core::increment_contributors_crps_in_project(coopname, commit.project_hash, commit.amounts.contributors_bonus_pool);
|
||||
|
||||
// Удаляем коммит после обработки
|
||||
|
||||
+11
-11
@@ -3,18 +3,18 @@
|
||||
@defgroup public_capital_commit_creation_process Создание коммита
|
||||
@ingroup public_capital_processes
|
||||
|
||||
Процесс фиксации трудозатрат создателя на проекте через создание коммита с указанием потраченного времени. Коммит инициирует пересчет затрат авторов и расчет будущих взносов всех вкладчиков. Процесс включает фиксацию трудозатрат создателем, проверку прав, уникальности коммита, расчет затрат и взносов, создание коммита в статусе ожидания одобрения, и последующее одобрение или отклонение мастером проекта.
|
||||
Процесс фиксации трудозатрат создателя на проекте через создание коммита с указанием потраченного времени. Коммит инициирует пересчет затрат авторов и расчет будущих взносов всех участников. Процесс включает фиксацию трудозатрат создателем, проверку прав, уникальности коммита, расчет затрат и взносов, создание коммита в статусе ожидания одобрения, и последующее одобрение или отклонение мастером проекта.
|
||||
|
||||
@pre Проект находится в активном состоянии
|
||||
@pre Создатель имеет действующий договор УХД
|
||||
@pre Создатель подписал приложение к проекту
|
||||
@pre Исполнитель имеет действующий договор УХД
|
||||
@pre Исполнитель подписал приложение к проекту
|
||||
|
||||
## Диаграмма процесса
|
||||
|
||||
\htmlonly
|
||||
<div class="mermaid">
|
||||
sequenceDiagram
|
||||
participant С as Создатель
|
||||
participant С as Исполнитель
|
||||
participant C as Capital Contract
|
||||
participant G as Core Generation
|
||||
participant М as Мастер проекта
|
||||
@@ -24,7 +24,7 @@ sequenceDiagram
|
||||
Note over C: Валидация прав создателя
|
||||
Note over C: Проверка уникальности коммита
|
||||
C->>G: 2. Расчет затрат и взносов
|
||||
Note over G: Пересчет авторских затрат<br/>Расчет долей вкладчиков программы
|
||||
Note over G: Пересчет авторских затрат<br/>Расчет долей участников программы
|
||||
G->>C: 3. Создание коммита в статусе ОЖИДАНИЕ
|
||||
Note over C: Коммит создан, ожидает одобрения мастера
|
||||
М->>C: 4. Одобрение коммита
|
||||
@@ -39,7 +39,7 @@ sequenceDiagram
|
||||
|
||||
## Фиксация трудозатрат создателем
|
||||
|
||||
Создатель инициирует фиксацию трудозатрат после выполнения работы над проектом с указанием количества потраченных часов. Коммит представляет зафиксированные трудозатраты создателя и служит основой для пересчета затрат авторов проекта, расчета будущих взносов вкладчиков программы капитализации и определения экономических показателей проекта.
|
||||
Исполнитель инициирует фиксацию трудозатрат после выполнения работы над проектом с указанием количества потраченных часов. Коммит представляет зафиксированные трудозатраты создателя и служит основой для пересчета затрат авторов проекта, расчета будущих взносов участников программы капитализации и определения экономических показателей проекта.
|
||||
|
||||
## Валидация прав создателя
|
||||
|
||||
@@ -51,7 +51,7 @@ sequenceDiagram
|
||||
|
||||
## Расчет затрат и взносов
|
||||
|
||||
Система выполняет автоматический расчет базового вознаграждения создателя, пересчета затрат авторов проекта на основе новых трудозатрат и расчета будущих взносов всех вкладчиков программы капитализации при их участии в проекте. Расчет учитывает индивидуальную почасовую ставку создателя и автоматически распределяет суммы по категориям участников.
|
||||
Система выполняет автоматический расчет базового вознаграждения создателя, пересчета затрат авторов проекта на основе новых трудозатрат и расчета будущих взносов всех участников программы капитализации при их участии в проекте. Расчет учитывает индивидуальную почасовую ставку создателя и автоматически распределяет суммы по категориям участников.
|
||||
|
||||
## Создание коммита в ожидании одобрения
|
||||
|
||||
@@ -60,19 +60,19 @@ sequenceDiagram
|
||||
## Создание коммита
|
||||
@ref capital::createcmmt "Создание коммита"
|
||||
|
||||
Создатель инициирует фиксацию трудозатрат после выполнения работы над проектом:
|
||||
Исполнитель инициирует фиксацию трудозатрат после выполнения работы над проектом:
|
||||
|
||||
@pre <b>Предварительные условия:</b>
|
||||
- Проект находится в активном состоянии
|
||||
- Создатель имеет действующий договор УХД
|
||||
- Создатель подписал приложение к проекту
|
||||
- Исполнитель имеет действующий договор УХД
|
||||
- Исполнитель подписал приложение к проекту
|
||||
|
||||
<b>Механика создания коммита:</b>
|
||||
- Выполняется проверка прав создателя
|
||||
- Проверяется уникальность хеша коммита
|
||||
- Рассчитываются затраты и будущие взносы
|
||||
|
||||
<b>Результат:</b> Коммит создан и ожидает одобрения от мастера проекта. При одобрении происходит пересчет затрат авторов проекта и расчет будущих взносов вкладчиков программы капитализации.
|
||||
<b>Результат:</b> Коммит создан и ожидает одобрения от мастера проекта. При одобрении происходит пересчет затрат авторов проекта и расчет будущих взносов участников программы капитализации.
|
||||
|
||||
@post Требуется авторизация создателя
|
||||
@post Создан коммит с зафиксированными трудозатратами
|
||||
|
||||
+3
-3
@@ -3,8 +3,8 @@
|
||||
* @defgroup public_capital_segment_refresh_process Обновления сегмента участника
|
||||
* @ingroup public_capital_processes
|
||||
*
|
||||
* Процесс пересчета стоимостей будущего взноса вкладчика и лимитов ссуд с учетом новых поступивших взносов.
|
||||
* Метод актуализирует состояние сегмента вкладчика в проекте.
|
||||
* Процесс пересчета стоимостей будущего взноса участника и лимитов ссуд с учетом новых поступивших взносов.
|
||||
* Метод актуализирует состояние сегмента участника в проекте.
|
||||
*
|
||||
* \htmlonly
|
||||
* <div class="mermaid">
|
||||
@@ -26,7 +26,7 @@
|
||||
*
|
||||
* Кооператив инициирует обновление сегмента участника когда:
|
||||
* - Необходимо пересчитать лимиты ссуд
|
||||
* - Поступили новые вклады, которые могли повлиять на сегмент вкладчика
|
||||
* - Поступили новые вклады, которые могли повлиять на сегмент участника
|
||||
*
|
||||
* ### Шаг 2: Проверка существования проекта
|
||||
* <b>Действие:</b> Валидация целевого проекта
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
/**
|
||||
* @brief Добавляет вкладчика в проект через CRPS систему
|
||||
* Добавляет вкладчика в проект через систему CRPS с автоматическими проверками:
|
||||
* @brief Добавляет участника в проект через CRPS систему
|
||||
* Добавляет участника в проект через систему CRPS с автоматическими проверками:
|
||||
* - Проверяет существование проекта
|
||||
* - Выполняет проверки через CRPS систему (активный договор УХД, приложение к проекту, положительный баланс)
|
||||
* - Добавляет вкладчика через CRPS систему
|
||||
* - Добавляет участника через CRPS систему
|
||||
* @param coopname Наименование кооператива
|
||||
* @param project_hash Хеш проекта
|
||||
* @param username Наименование пользователя-вкладчика
|
||||
* @param username Наименование пользователя-участника
|
||||
* @ingroup public_actions
|
||||
* @ingroup public_capital_actions
|
||||
|
||||
@@ -24,10 +24,10 @@ void capital::regshare(eosio::name coopname, checksum256 project_hash, eosio::na
|
||||
auto exist_segment = Capital::Segments::get_segment(coopname, project_hash, username);
|
||||
|
||||
if (exist_segment.has_value()) {
|
||||
// Проверяем что пользователь не зарегистрирован в проекте как вкладчик
|
||||
eosio::check(!exist_segment -> is_contributor, "Вкладчик уже зарегистрирован в проекте");
|
||||
// Проверяем что пользователь не зарегистрирован в проекте как участник
|
||||
eosio::check(!exist_segment -> is_contributor, "Участник уже зарегистрирован в проекте");
|
||||
}
|
||||
|
||||
// Добавляем вкладчика
|
||||
// Добавляем участника
|
||||
Capital::Core::upsert_contributor_segment(coopname, project_hash, username);
|
||||
}
|
||||
+22
-22
@@ -1,9 +1,9 @@
|
||||
/**
|
||||
|
||||
@defgroup public_capital_share_registration_process Регистрация доли вкладчика
|
||||
@defgroup public_capital_share_registration_process Регистрация доли участника
|
||||
@ingroup public_capital_processes
|
||||
|
||||
Процесс, при котором вкладчик, являющийся участником программы "Капитализация", регистрирует свою долю в конкретном проекте для получения премий из пула премий вкладчиков. Процесс позволяет вкладчику участвовать в распределении премий проекта пропорционально своему балансу в программе "Капитализация".
|
||||
Процесс, при котором участник, являющийся участником программы "Капитализация", регистрирует свою долю в конкретном проекте для получения премий из пула премий участников. Процесс позволяет участнику участвовать в распределении премий проекта пропорционально своему балансу в программе "Капитализация".
|
||||
|
||||
@pre
|
||||
- Активный договор УХД с кооперативом
|
||||
@@ -16,43 +16,43 @@
|
||||
\htmlonly
|
||||
<div class="mermaid">
|
||||
sequenceDiagram
|
||||
participant В as Вкладчик
|
||||
participant В as Участник
|
||||
participant C as Capital Contract
|
||||
|
||||
В->>C: 1. Запрос регистрации доли
|
||||
Note over C: Проверка существования проекта
|
||||
Note over C: Проверка условий участия
|
||||
Note over C: Регистрация доли вкладчика
|
||||
Note over C: Регистрация доли участника
|
||||
</div>
|
||||
\endhtmlonly
|
||||
|
||||
## Запрос регистрации доли вкладчиком
|
||||
## Запрос регистрации доли участником
|
||||
|
||||
Вкладчик, который уже участвует в программе "Капитализация", самостоятельно инициирует процесс регистрации своей доли в проекте. Это необходимо для получения премий вкладчиков проекта.
|
||||
Участник, который уже участвует в программе "Капитализация", самостоятельно инициирует процесс регистрации своей доли в проекте. Это необходимо для получения премий участников проекта.
|
||||
|
||||
## Проверка существования проекта
|
||||
|
||||
Система проверяет, что проект существует и доступен для регистрации долей вкладчиков. Проект должен быть активным и принимать участников.
|
||||
Система проверяет, что проект существует и доступен для регистрации долей участников. Проект должен быть активным и принимать участников.
|
||||
|
||||
## Проверка условий участия
|
||||
|
||||
Система проверяет выполнение всех требований для участия в проекте:
|
||||
- Наличие активного договора УХД с кооперативом у вкладчика
|
||||
- Наличие активного договора УХД с кооперативом у участника
|
||||
- Наличие подписанного приложения к конкретному проекту
|
||||
- Положительный баланс вкладчика в программе "Капитализация"
|
||||
- Техническая возможность участия в распределении премий вкладчиков
|
||||
- Положительный баланс участника в программе "Капитализация"
|
||||
- Техническая возможность участия в распределении премий участников
|
||||
|
||||
## Регистрация доли вкладчика
|
||||
## Регистрация доли участника
|
||||
|
||||
Система создает сегмент вкладчика в проекте для учета его доли:
|
||||
Система создает сегмент участника в проекте для учета его доли:
|
||||
- Регистрирует долю пропорционально балансу в программе капитализации
|
||||
- Устанавливает связь между программой и проектом
|
||||
- Активирует пересчет доли в премиях вкладчиков при следующем @ref public_capital_segment_refresh_process "обновлении сегмента"
|
||||
- Активирует пересчет доли в премиях участников при следующем @ref public_capital_segment_refresh_process "обновлении сегмента"
|
||||
|
||||
## Регистрация доли вкладчика
|
||||
@ref capital::regshare "Добавление вкладчика"
|
||||
## Регистрация доли участника
|
||||
@ref capital::regshare "Добавление участника"
|
||||
|
||||
Вкладчик, который уже участвует в программе "Капитализация", самостоятельно инициирует процесс регистрации своей доли в проекте:
|
||||
Участник, который уже участвует в программе "Капитализация", самостоятельно инициирует процесс регистрации своей доли в проекте:
|
||||
|
||||
@pre <b>Предварительные условия:</b>
|
||||
- Активный договор УХД с кооперативом
|
||||
@@ -62,14 +62,14 @@ sequenceDiagram
|
||||
|
||||
<b>Механика регистрации:</b>
|
||||
- Выполняется проверка существования проекта
|
||||
- Проверяются условия участия вкладчика
|
||||
- Создается сегмент вкладчика в проекте
|
||||
- Проверяются условия участия участника
|
||||
- Создается сегмент участника в проекте
|
||||
|
||||
<b>Результат:</b> Вкладчик зарегистрирован в проекте и имеет право на получение премий пропорционально своему балансу в программе "Капитализация".
|
||||
<b>Результат:</b> Участник зарегистрирован в проекте и имеет право на получение премий пропорционально своему балансу в программе "Капитализация".
|
||||
|
||||
@post Требуется авторизация вкладчика
|
||||
@post Создан сегмент вкладчика в проекте
|
||||
@post Активирован автоматический расчет доли вкладчика
|
||||
@post Требуется авторизация участника
|
||||
@post Создан сегмент участника в проекте
|
||||
@post Активирован автоматический расчет доли участника
|
||||
|
||||
## Связанные процессы
|
||||
|
||||
|
||||
+1
-1
@@ -61,7 +61,7 @@
|
||||
- Средства зачисляются в пул инвестиций проекта
|
||||
- Обновляется баланс программы капитализации
|
||||
|
||||
@note Распределение аллоцированных средств между пулом расходов и инвестиционным пулом проекта определяется в конфигурации кооператива. Если у проекта есть плановые непокрытые расходы, то в накопительный пул расходов выделяется процент от аллоцированной суммы, который установлен в конфигурации контракта параметром @c expense_pool_percent. Например, если у кооператива установлено значение 20% для пула расходов, то при аллокации средств в размере 10000 руб, в пул расходов пойдет 2000 руб, а оставшиеся 8000 руб пойдут в инвестиционный пул для обеспечения себестоимости затрат вкладчиков. При этом, если плановый пул расходов уже достаточно покрыт, то вся сумма может пойти в инвестиционный пул.
|
||||
@note Распределение аллоцированных средств между пулом расходов и инвестиционным пулом проекта определяется в конфигурации кооператива. Если у проекта есть плановые непокрытые расходы, то в накопительный пул расходов выделяется процент от аллоцированной суммы, который установлен в конфигурации контракта параметром @c expense_pool_percent. Например, если у кооператива установлено значение 20% для пула расходов, то при аллокации средств в размере 10000 руб, в пул расходов пойдет 2000 руб, а оставшиеся 8000 руб пойдут в инвестиционный пул для обеспечения себестоимости затрат участников. При этом, если плановый пул расходов уже достаточно покрыт, то вся сумма может пойти в инвестиционный пул.
|
||||
|
||||
* ### Шаг 5: Активация использования средств
|
||||
* <b>Действие:</b> Интеграция в систему проекта
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
* @ingroup public_capital_processes
|
||||
*
|
||||
* Процесс управления инвестициями в программу "Капитализация", позволяющий
|
||||
* вкладчикам направлять средства в общую программу с последующим централизованным
|
||||
* участникам направлять средства в общую программу с последующим централизованным
|
||||
* распределением по проектам. Процесс включает создание заявки на инвестирование,
|
||||
* блокировку средств, одобрение или отклонение советом кооператива, а также
|
||||
* перевод средств в программу или возврат инвестору.
|
||||
|
||||
+2
-2
@@ -3,7 +3,7 @@
|
||||
* @defgroup public_capital_project_investment_process Инвестиции в проект
|
||||
* @ingroup public_capital_processes
|
||||
*
|
||||
* Процесс привлечения денежных средств от вкладчиков в конкретный проект.
|
||||
* Процесс привлечения денежных средств от участников в конкретный проект.
|
||||
* Инвестиции распределяются между инвестиционным пулом и пулом расходов
|
||||
* в соответствии с настройками кооператива. Процесс включает создание заявки
|
||||
* на инвестицию, блокировку средств, одобрение или отклонение советом кооператива,
|
||||
@@ -73,7 +73,7 @@
|
||||
* - <b>На расходы:</b> часть средств направляется в пул расходов проекта
|
||||
* - <b>В инвестиционный пул:</b> остаток средств направляется в инвестиционный пул
|
||||
|
||||
@note Распределение инвестиций между пулом расходов и инвестиционным пулом определяется в конфигурации кооператива. Если у проекта есть плановые непокрытые расходы, то в накопительный пул расходов выделяется процент от инвестиции, который установлен в конфигурации контракта параметром @c expense_pool_percent. Например, если у кооператива установлено значение 20% для пула расходов, то при поступлении инвестиции в размере 10000 руб, в пул расходов пойдет 2000 руб, а оставшиеся 8000 руб пойдут в инвестиционный пул для обеспечения себестоимости затрат вкладчиков. При этом, если плановый пул расходов уже достаточно покрыт, то вся инвестиция может пойти в инвестиционный пул.
|
||||
@note Распределение инвестиций между пулом расходов и инвестиционным пулом определяется в конфигурации кооператива. Если у проекта есть плановые непокрытые расходы, то в накопительный пул расходов выделяется процент от инвестиции, который установлен в конфигурации контракта параметром @c expense_pool_percent. Например, если у кооператива установлено значение 20% для пула расходов, то при поступлении инвестиции в размере 10000 руб, в пул расходов пойдет 2000 руб, а оставшиеся 8000 руб пойдут в инвестиционный пул для обеспечения себестоимости затрат участников. При этом, если плановый пул расходов уже достаточно покрыт, то вся инвестиция может пойти в инвестиционный пул.
|
||||
|
||||
* <b>Обновление показателей проекта:</b>
|
||||
* @post увеличение накопленного пула расходов проекта
|
||||
|
||||
+14
-14
@@ -1,8 +1,8 @@
|
||||
/**
|
||||
@defgroup public_capital_edit_contributor_process Редактирование параметров вкладчика
|
||||
@defgroup public_capital_edit_contributor_process Редактирование параметров участника
|
||||
@ingroup public_capital_processes
|
||||
|
||||
Процесс обновления параметров существующего вкладчика кооператива.
|
||||
Процесс обновления параметров существующего участника кооператива.
|
||||
Позволяет изменить количество рабочих часов в день.
|
||||
|
||||
\htmlonly
|
||||
@@ -12,9 +12,9 @@
|
||||
participant Capital as Capital Contract
|
||||
|
||||
К->>Capital: 1. Запрос на редактирование параметров
|
||||
Note over Capital: Проверка существования вкладчика
|
||||
Note over Capital: Проверка существования участника
|
||||
Note over Capital: Проверка статуса ACTIVE
|
||||
Capital->>Capital: 2. Обновление параметров вкладчика
|
||||
Capital->>Capital: 2. Обновление параметров участника
|
||||
Note over Capital: hours_per_day обновлен
|
||||
</div>
|
||||
\endhtmlonly
|
||||
@@ -22,29 +22,29 @@
|
||||
## Пошаговое описание процесса
|
||||
|
||||
### Шаг 1: Запрос на редактирование
|
||||
<b>Действие:</b> @ref capital::editcontrib "редактирование параметров вкладчика"
|
||||
<b>Действие:</b> @ref capital::editcontrib "редактирование параметров участника"
|
||||
|
||||
Кооператив отправляет запрос на обновление параметров вкладчика с новыми значениями
|
||||
hours_per_day. Система проверяет существование вкладчика и его активный статус.
|
||||
Кооператив отправляет запрос на обновление параметров участника с новыми значениями
|
||||
hours_per_day. Система проверяет существование участника и его активный статус.
|
||||
|
||||
@post Проверено существование активного вкладчика
|
||||
@post Проверено существование активного участника
|
||||
|
||||
### Шаг 2: Обновление параметров
|
||||
<b>Действие:</b> @ref capital::editcontrib "обновление записи вкладчика"
|
||||
<b>Действие:</b> @ref capital::editcontrib "обновление записи участника"
|
||||
|
||||
Система обновляет поле hours_per_day в записи вкладчика новым значением.
|
||||
Система обновляет поле hours_per_day в записи участника новым значением.
|
||||
|
||||
@post Обновлен параметр hours_per_day вкладчика
|
||||
@post Обновлен параметр hours_per_day участника
|
||||
|
||||
## Результат процесса
|
||||
|
||||
После успешного завершения:
|
||||
1. Обновлен параметр hours_per_day вкладчика
|
||||
2. Вкладчик может продолжать участие в проектах с новыми параметрами
|
||||
1. Обновлен параметр hours_per_day участника
|
||||
2. Участник может продолжать участие в проектах с новыми параметрами
|
||||
|
||||
## Связанные процессы
|
||||
|
||||
- @ref public_capital_registration_process "Регистрация вкладчиков"
|
||||
- @ref public_capital_registration_process "Регистрация участников"
|
||||
- @ref public_capital_joining_process "Получение допуска к проекту"
|
||||
|
||||
*/}
|
||||
|
||||
+5
-5
@@ -1,8 +1,8 @@
|
||||
/**
|
||||
* @brief Редактирование параметров вкладчика
|
||||
* Обновляет поля hours_per_day и about для существующего вкладчика
|
||||
* @brief Редактирование параметров участника
|
||||
* Обновляет поля hours_per_day и about для существующего участника
|
||||
* @param coopname Наименование кооператива
|
||||
* @param username Наименование пользователя-вкладчика
|
||||
* @param username Наименование пользователя-участника
|
||||
* @param hours_per_day Количество часов в день
|
||||
* @param about Информация о себе
|
||||
* @ingroup public_actions
|
||||
@@ -13,7 +13,7 @@
|
||||
void capital::editcontrib(eosio::name coopname, eosio::name username, eosio::asset rate_per_hour, uint64_t hours_per_day) {
|
||||
require_auth(coopname);
|
||||
|
||||
// Проверяем существование активного вкладчика
|
||||
// Проверяем существование активного участника
|
||||
Capital::Contributors::get_active_contributor_or_fail(coopname, username);
|
||||
|
||||
Wallet::validate_asset(rate_per_hour);
|
||||
@@ -22,6 +22,6 @@ void capital::editcontrib(eosio::name coopname, eosio::name username, eosio::ass
|
||||
eosio::check(rate_per_hour.amount <= 30000000, "Ставка за час должна быть не более 30000000");
|
||||
eosio::check(hours_per_day <= 8, "Количество часов в день должно быть не более 8");
|
||||
|
||||
// Обновляем параметры вкладчика
|
||||
// Обновляем параметры участника
|
||||
Capital::Contributors::edit_contributor(coopname, username, rate_per_hour, hours_per_day);
|
||||
};
|
||||
|
||||
+6
-6
@@ -3,15 +3,15 @@
|
||||
@defgroup public_capital_joining_process Допуск к проекту
|
||||
@ingroup public_capital_processes
|
||||
|
||||
@pre Пайщик имеет активный договор УХД и статус вкладчика
|
||||
@pre Пайщик имеет активный договор УХД и статус участника
|
||||
|
||||
Процесс подписания приложений к договору УХД для участия вкладчика в конкретном проекте.
|
||||
Процесс подписания приложений к договору УХД для участия участника в конкретном проекте.
|
||||
Приложение к договору УХД определяет проект, по которому ведется участие в хозяйственной деятельности.
|
||||
|
||||
\htmlonly
|
||||
<div class="mermaid">
|
||||
sequenceDiagram
|
||||
participant V as Вкладчик
|
||||
participant V as Участник
|
||||
participant C as Capital Contract
|
||||
participant S as Soviet Contract
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
### Шаг 1: Подача заявки на допуск к проекту
|
||||
@ref capital::getclearance "подача заявки на допуск к проекту"
|
||||
|
||||
Вкладчик с активным договором УХД подает заявку для участия в конкретном проекте.
|
||||
Участник с активным договором УХД подает заявку для участия в конкретном проекте.
|
||||
Необходимо предоставить подписанное приложение к договору УХД с указанием хеша проекта.
|
||||
|
||||
@post создается запись в таблице допуска со статусом PENDING
|
||||
@@ -45,7 +45,7 @@
|
||||
приложение к договору УХД своей подписью на документе.
|
||||
|
||||
@post статус допуска изменяется с PENDING на ACTIVE
|
||||
@post вкладчик получает право участвовать в проекте
|
||||
@post участник получает право участвовать в проекте
|
||||
@post становится возможным создание коммитов и инвестиций в проект
|
||||
|
||||
### Шаг 3: Отклонение заявки (альтернативный путь)
|
||||
@@ -54,7 +54,7 @@
|
||||
При отклонении заявки председателем или советом запись удаляется
|
||||
с указанием причины отказа.
|
||||
|
||||
@post вкладчик не получает доступ к участию в проекте
|
||||
@post участник не получает доступ к участию в проекте
|
||||
|
||||
## Документы процесса
|
||||
@include{doc} joining-process-docs.dox
|
||||
|
||||
+19
-19
@@ -1,8 +1,8 @@
|
||||
/**
|
||||
@defgroup public_capital_import_contributor_process Импорт вкладчиков
|
||||
@defgroup public_capital_import_contributor_process Импорт участников
|
||||
@ingroup public_capital_processes
|
||||
|
||||
Процесс импорта внешних вкладчиков с автоматическим созданием записи в системе,
|
||||
Процесс импорта внешних участников с автоматическим созданием записи в системе,
|
||||
открытием программного кошелька и внесением первоначальных взносов.
|
||||
Используется для добавления существующего распределения вкладов пайщиков кооператива в цифровую систему.
|
||||
|
||||
@@ -13,11 +13,11 @@
|
||||
participant К as Capital Contract
|
||||
participant С as Soviet Contract
|
||||
|
||||
А->>К: 1. Импорт вкладчика с взносами
|
||||
А->>К: 1. Импорт участника с взносами
|
||||
Note over К: Проверка отсутствия конфигурации кооператива
|
||||
Note over К: Валидация суммы взносов
|
||||
Note over К: Проверка уникальности вкладчика
|
||||
К->>К: 2. Создание записи вкладчика
|
||||
Note over К: Проверка уникальности участника
|
||||
К->>К: 2. Создание записи участника
|
||||
Note over К: Статус ACTIVE, внешний договор
|
||||
К->>С: 3. Открытие программного кошелька
|
||||
Note over С: Создание кошелька в программе капитализации
|
||||
@@ -28,31 +28,31 @@
|
||||
|
||||
## Пошаговое описание процесса
|
||||
|
||||
### Шаг 1: Импорт вкладчика с взносами
|
||||
<b>Действие:</b> @ref capital::importcontrib "импорт вкладчика"
|
||||
### Шаг 1: Импорт участника с взносами
|
||||
<b>Действие:</b> @ref capital::importcontrib "импорт участника"
|
||||
|
||||
Администратор кооператива инициирует импорт внешнего вкладчика с указанием суммы первоначальных взносов.
|
||||
Администратор кооператива инициирует импорт внешнего участника с указанием суммы первоначальных взносов.
|
||||
Система проверяет, что кооператив еще не имеет установленной конфигурации, валидирует сумму взносов
|
||||
и проверяет уникальность вкладчика по имени и хешу.
|
||||
и проверяет уникальность участника по имени и хешу.
|
||||
|
||||
@post Проверяется отсутствие конфигурации кооператива
|
||||
@post Валидируется сумма взносов
|
||||
@post Проверяется уникальность вкладчика
|
||||
@post Проверяется уникальность участника
|
||||
|
||||
### Шаг 2: Создание записи вкладчика
|
||||
<b>Действие:</b> @ref capital::importcontrib "создание записи вкладчика"
|
||||
### Шаг 2: Создание записи участника
|
||||
<b>Действие:</b> @ref capital::importcontrib "создание записи участника"
|
||||
|
||||
Система создает запись вкладчика со статусом ACTIVE, помечая его как импортированного
|
||||
Система создает запись участника со статусом ACTIVE, помечая его как импортированного
|
||||
с внешним договором УХД и фиксированной почасовой ставкой.
|
||||
|
||||
@post Создается запись вкладчика со статусом ACTIVE
|
||||
@post Создается запись участника со статусом ACTIVE
|
||||
@post Устанавливается флаг внешнего договора УХД
|
||||
@post Фиксируется почасовая ставка для импортированного вкладчика
|
||||
@post Фиксируется почасовая ставка для импортированного участника
|
||||
|
||||
### Шаг 3: Открытие программного кошелька
|
||||
<b>Действие:</b> @ref soviet::openprogwall "открытие кошелька программы"
|
||||
|
||||
Система открывает программный кошелек вкладчика в программе капитализации для учета
|
||||
Система открывает программный кошелек участника в программе капитализации для учета
|
||||
его членских взносов и участия в распределении доходов.
|
||||
|
||||
@post Создается программный кошелек в программе капитализации
|
||||
@@ -61,7 +61,7 @@
|
||||
### Шаг 4: Зачисление первоначальных взносов
|
||||
<b>Действие:</b> @ref capital::importcontrib "зачисление взносов"
|
||||
|
||||
Система зачисляет указанную сумму первоначальных взносов в программный кошелек вкладчика,
|
||||
Система зачисляет указанную сумму первоначальных взносов в программный кошелек участника,
|
||||
блокируя средства для участия в программе капитализации.
|
||||
|
||||
@post Зачисляются первоначальные взносы в программный кошелек
|
||||
@@ -71,7 +71,7 @@
|
||||
## Результат процесса
|
||||
|
||||
После успешного завершения:
|
||||
1. Внешний вкладчик становится полноценным участником системы капитализации
|
||||
1. Внешний участник становится полноценным участником системы капитализации
|
||||
2. Открыт программный кошелек для участии в программе капитализации
|
||||
3. Внесены первоначальные взносы в программу капитализации
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
|
||||
## Связанные процессы
|
||||
|
||||
- @ref public_capital_registration_process "Регистрация новых вкладчиков"
|
||||
- @ref public_capital_registration_process "Регистрация новых участников"
|
||||
- @ref public_capital_joining_process "Получение допуска к проекту"
|
||||
|
||||
*/
|
||||
|
||||
+12
-12
@@ -1,23 +1,23 @@
|
||||
/**
|
||||
* @brief Импорт внешнего вкладчика с автоматическим созданием записи и внесением взносов
|
||||
* Создает запись вкладчика в системе капитализации для внешних участников кооператива:
|
||||
* @brief Импорт внешнего участника с автоматическим созданием записи и внесением взносов
|
||||
* Создает запись участника в системе капитализации для внешних участников кооператива:
|
||||
* - Проверяет отсутствие конфигурации кооператива для возможности импорта
|
||||
* - Валидирует сумму первоначальных взносов
|
||||
* - Создает запись вкладчика со статусом ACTIVE и внешним договором УХД
|
||||
* - Создает запись участника со статусом ACTIVE и внешним договором УХД
|
||||
* - Открывает программный кошелек в программе капитализации
|
||||
* - Зачисляет первоначальные взносы с блокировкой средств
|
||||
* @param coopname Наименование кооператива
|
||||
* @param username Наименование импортируемого вкладчика
|
||||
* @param contributor_hash Уникальный хеш для идентификации вкладчика
|
||||
* @param username Наименование импортируемого участника
|
||||
* @param contributor_hash Уникальный хеш для идентификации участника
|
||||
* @param contribution_amount Сумма первоначальных взносов в программу капитализации
|
||||
* @param memo Мемо для импортированных вкладчиков
|
||||
* @param memo Мемо для импортированных участников
|
||||
* @ingroup public_actions
|
||||
* @ingroup public_capital_actions
|
||||
*
|
||||
* @note Авторизация требуется от аккаунта: @p coopname
|
||||
* @note Импорт возможен только до установки конфигурации кооператива
|
||||
*
|
||||
* @post Создается запись вкладчика со статусом ACTIVE
|
||||
* @post Создается запись участника со статусом ACTIVE
|
||||
* @post Открывается программный кошелек в программе капитализации
|
||||
* @post Зачисляются первоначальные взносы с блокировкой средств
|
||||
*/
|
||||
@@ -27,21 +27,21 @@ void capital::importcontrib(eosio::name coopname, eosio::name username, checksum
|
||||
// Проверка, что конфиг кооператива еще не установлен
|
||||
Capital::global_state_table global_state_inst(_self, _self.value);
|
||||
auto global_state_itr = global_state_inst.find(coopname.value);
|
||||
eosio::check(global_state_itr == global_state_inst.end(), "Невозможно импортировать вкладчика: кооператив уже имеет установленную конфигурацию");
|
||||
eosio::check(global_state_itr == global_state_inst.end(), "Невозможно импортировать участника: кооператив уже имеет установленную конфигурацию");
|
||||
|
||||
// Проверка суммы взносов
|
||||
Wallet::validate_asset(contribution_amount);
|
||||
eosio::check(contribution_amount.amount > 0, "Сумма взносов должна быть положительной");
|
||||
|
||||
// Проверка, что вкладчик еще не существует
|
||||
// Проверка, что участник еще не существует
|
||||
auto existing_contributor = Capital::Contributors::get_contributor(coopname, username);
|
||||
eosio::check(!existing_contributor.has_value(), "Вкладчик уже существует");
|
||||
eosio::check(!existing_contributor.has_value(), "Участник уже существует");
|
||||
|
||||
// Проверка, что contributor_hash уникален
|
||||
auto existing_by_hash = Capital::Contributors::get_contributor_by_hash(coopname, contributor_hash);
|
||||
eosio::check(!existing_by_hash.has_value(), "Хэш вкладчика не уникален");
|
||||
eosio::check(!existing_by_hash.has_value(), "Хэш участника не уникален");
|
||||
|
||||
// Создание вкладчика
|
||||
// Создание участника
|
||||
Capital::Contributors::import_contributor(
|
||||
coopname,
|
||||
username,
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* @brief Принимает принятый председателем договор УХД и активирует вкладчика по нему
|
||||
* @brief Принимает принятый председателем договор УХД и активирует участника по нему
|
||||
* Активирует пайщика в системе кооператива после одобрения договора УХД:
|
||||
* - Проверяет подлинность договора УХД
|
||||
* - Валидирует статус пайщика (должен быть PENDING)
|
||||
|
||||
+5
-5
@@ -1,9 +1,9 @@
|
||||
/**
|
||||
* @brief Отклоняет председателем договор УХД и удаляет вкладчика из базы
|
||||
* Отклоняет регистрацию вкладчика и удаляет его из системы кооператива:
|
||||
* - Проверяет существование вкладчика по хешу
|
||||
* - Валидирует статус вкладчика (должен быть PENDING)
|
||||
* - Удаляет вкладчика из базы данных с указанием причины
|
||||
* @brief Отклоняет председателем договор УХД и удаляет участника из базы
|
||||
* Отклоняет регистрацию участника и удаляет его из системы кооператива:
|
||||
* - Проверяет существование участника по хешу
|
||||
* - Валидирует статус участника (должен быть PENDING)
|
||||
* - Удаляет участника из базы данных с указанием причины
|
||||
* @param coopname Имя кооператива
|
||||
* @param username Наименование пользователя, отклонившего регистрацию
|
||||
* @param contributor_hash Хэш контрибьютора
|
||||
|
||||
+16
-16
@@ -1,9 +1,9 @@
|
||||
/**
|
||||
|
||||
@defgroup public_capital_registration_process Регистрация вкладчиков
|
||||
@defgroup public_capital_registration_process Регистрация участников
|
||||
@ingroup public_capital_processes
|
||||
|
||||
Процесс приёма договора УХД от пайщика, смены его статуса с кандидата в вкладчики на активного вкладчика
|
||||
Процесс приёма договора УХД от пайщика, смены его статуса с кандидата в участники на активного участника
|
||||
и обеспечения технической возможности участвовать в проектах и программе капитализации.
|
||||
|
||||
\htmlonly
|
||||
@@ -16,11 +16,11 @@
|
||||
П->>К: 1. Подача договора УХД
|
||||
Note over К: Проверка уникальности кандидата
|
||||
Note over К: Валидация договора УХД
|
||||
К->>К: 2. Создание записи кандидата в вкладчики
|
||||
К->>К: 2. Создание записи кандидата в участники
|
||||
К->>С: 3. Направление на одобрение
|
||||
alt Одобрение
|
||||
С->>К: 4. Авторизация регистрации
|
||||
Note over К: Смена статуса: кандидат → вкладчик
|
||||
Note over К: Смена статуса: кандидат → участник
|
||||
Note over К: Создание программного кошелька
|
||||
else Отклонение
|
||||
С->>К: 4. Отклонение регистрации
|
||||
@@ -39,16 +39,16 @@
|
||||
Система проверяет уникальность кандидата и хеша контрибьютора, валидирует договор УХД.
|
||||
|
||||
@post Передан договор УХД
|
||||
@post Создается запись кандидата в вкладчики
|
||||
@post Создается запись кандидата в участники
|
||||
@post Создается заявка на одобрение
|
||||
|
||||
### Шаг 2: Создание записи кандидата в вкладчики
|
||||
### Шаг 2: Создание записи кандидата в участники
|
||||
<b>Действие:</b> @ref capital::regcontrib "создание записи кандидата"
|
||||
|
||||
Система создает запись кандидата в вкладчики со статусом PENDING с зафиксированными параметрами:
|
||||
Система создает запись кандидата в участники со статусом PENDING с зафиксированными параметрами:
|
||||
почасовой ставкой, договором УХД и уникальным хешем.
|
||||
|
||||
@post Создается запись кандидата в вкладчики со статусом PENDING
|
||||
@post Создается запись кандидата в участники со статусом PENDING
|
||||
|
||||
### Шаг 3: Направление на одобрение
|
||||
<b>Действие:</b> @ref Soviet::create_approval "направление заявки на рассмотрение"
|
||||
@@ -59,24 +59,24 @@
|
||||
@post Создается заявка на одобрение
|
||||
|
||||
### Шаг 4: Авторизация регистрации
|
||||
<b>Действие:</b> @ref capital::approvereg "одобрение регистрации вкладчика"
|
||||
<b>Действие:</b> @ref capital::approvereg "одобрение регистрации участника"
|
||||
|
||||
Председатель одобряет регистрацию вкладчика. Система меняет статус кандидата с PENDING на ACTIVE,
|
||||
превращая его в полноправного вкладчика, и создает программный кошелек для участия в проектах.
|
||||
Председатель одобряет регистрацию участника. Система меняет статус кандидата с PENDING на ACTIVE,
|
||||
превращая его в полноправного участника, и создает программный кошелек для участия в проектах.
|
||||
|
||||
@post Изменяется статус кандидата на ACTIVE (кандидат становится вкладчиком)
|
||||
@post Создается программный кошелек для вкладчика
|
||||
@post Изменяется статус кандидата на ACTIVE (кандидат становится участником)
|
||||
@post Создается программный кошелек для участника
|
||||
|
||||
<b>Альтернатива:</b> @ref capital::declinereg "отклонение регистрации"
|
||||
|
||||
При отклонении система удаляет запись кандидата в вкладчики из базы данных с указанием причины отказа.
|
||||
При отклонении система удаляет запись кандидата в участники из базы данных с указанием причины отказа.
|
||||
|
||||
@post Удаляется запись кандидата в вкладчики
|
||||
@post Удаляется запись кандидата в участники
|
||||
|
||||
## Результат процесса
|
||||
|
||||
После успешного завершения:
|
||||
1. Пайщик-кандидат становится полноправным вкладчиком со статусом ACTIVE
|
||||
1. Пайщик-кандидат становится полноправным участником со статусом ACTIVE
|
||||
2. Зафиксированы условия оценки трудового вклада
|
||||
3. Создана правовая основа для участия в проектах через договор УХД
|
||||
4. Открыт программный кошелек для операций по проектам
|
||||
|
||||
+7
-7
@@ -3,12 +3,12 @@
|
||||
@defgroup public_capital_add_author_process Добавления соавтора проекта
|
||||
@ingroup public_capital_processes
|
||||
|
||||
@pre Вкладчик имеет активное приложение к договору УХД для данного проекта
|
||||
@pre Вкладчик еще не является автором проекта
|
||||
@pre Участник имеет активное приложение к договору УХД для данного проекта
|
||||
@pre Участник еще не является автором проекта
|
||||
@pre Не превышен лимит авторов проекта
|
||||
|
||||
Процесс назначения мастером проекта соавторов из числа вкладчиков, обладающих экспертизой
|
||||
и видением для планирования результата интеллектуальной деятельности, а также, вкладчиков, исторически причастных к рождению идею. Соавторы участвуют в планировании проекта
|
||||
Процесс назначения мастером проекта соавторов из числа участников, обладающих экспертизой
|
||||
и видением для планирования результата интеллектуальной деятельности, а также, участников, исторически причастных к рождению идею. Соавторы участвуют в планировании проекта
|
||||
и определении требований к результату. Авторы могут быть и создателями одновременно, фиксируя свой вклад коммитами.
|
||||
|
||||
\htmlonly
|
||||
@@ -18,7 +18,7 @@
|
||||
participant C as Capital Contract
|
||||
|
||||
M->>C: 1. Добавление соавтора проекта
|
||||
Note over C: Проверка статуса вкладчика
|
||||
Note over C: Проверка статуса участника
|
||||
Note over C: Валидация лимитов авторов
|
||||
Note over C: Создание авторского сегмента
|
||||
</div>
|
||||
@@ -27,13 +27,13 @@
|
||||
### Шаг 1: Добавление соавтора проекта
|
||||
Действие: @ref capital::addauthor "добавление соавтора проекта"
|
||||
|
||||
Мастер добавляет вкладчика в роли соавтора к проекту для участия в планировании
|
||||
Мастер добавляет участника в роли соавтора к проекту для участия в планировании
|
||||
и определении требований к будущему результату. Соавторы обладают экспертизой
|
||||
и видением того, что должно быть создано, участвуют в формировании концепции проекта
|
||||
на этапе планирования, в отличие от создателей, которые фиксируют трудозатраты
|
||||
коммитами на этапе генерации.
|
||||
|
||||
@post вкладчик получает право на авторские доли в результате проекта
|
||||
@post участник получает право на авторские доли в результате проекта
|
||||
@post активируется участие в авторском распределении премий
|
||||
@post предоставляется право голоса на голосовании за пул премий по системе Водянова
|
||||
*/
|
||||
+5
-5
@@ -10,7 +10,7 @@
|
||||
* Установка мастера проекта обеспечивает назначение ответственного за управление проектом,
|
||||
* который будет осуществлять централизованную координацию работы команды, контролировать
|
||||
* качество и сроки выполнения задач, а также выступать в роли связующего звена между
|
||||
* вкладчиками проекта и кооперативом. Мастер играет ключевую роль в успешной реализации
|
||||
* участниками проекта и кооперативом. Мастер играет ключевую роль в успешной реализации
|
||||
* проекта и несет персональную ответственность за достижение поставленных целей и результатов.
|
||||
* Мастер при добавлении к проекту становится его соавтором.
|
||||
*
|
||||
@@ -20,7 +20,7 @@
|
||||
* participant К as Кооператив
|
||||
* participant ПК as Контракт Capital
|
||||
* participant П as Проект
|
||||
* participant В as Вкладчик
|
||||
* participant В as Участник
|
||||
*
|
||||
* К->>ПК: 1. Инициация назначения мастера
|
||||
* Note over ПК: Проверка существования проекта
|
||||
@@ -30,12 +30,12 @@
|
||||
* ПК->>В: 4. Проверка договора УХД
|
||||
* В->>ПК: 5. Подтверждение активного договора
|
||||
* ПК->>П: 6. Проверка участия в проекте
|
||||
* alt Вкладчик - участник проекта
|
||||
* alt Участник - участник проекта
|
||||
* П->>ПК: 7. Подтверждение участия
|
||||
* ПК->>П: 8. Назначение мастера
|
||||
* П->>К: 9. Мастер назначен
|
||||
* else Вкладчик не участник
|
||||
* ПК->>К: Ошибка: вкладчик не участник проекта
|
||||
* else Участник не участник
|
||||
* ПК->>К: Ошибка: участник не участник проекта
|
||||
* end
|
||||
* else Проект не существует
|
||||
* ПК->>К: Ошибка: проект не найден
|
||||
|
||||
+1
-1
@@ -102,7 +102,7 @@
|
||||
* 2. Себестоимость авторов составляет 61.8% от себестоимости создателей (золотое сечение)
|
||||
* 3. Координаторские премии рассчитываются как процент от общей суммы (настраивается в конфиге контракта кооператива, 4% по дефолту)
|
||||
* 4. Премии создателей и авторов составляют 100% от их себестоимости
|
||||
* 5. Премии вкладчиков составляют 161.8% от себестоимости вкладов авторов, создателей, координаторов
|
||||
* 5. Премии участников составляют 161.8% от себестоимости вкладов авторов, создателей, координаторов
|
||||
*
|
||||
* ### Пример расчёта (500 часов, 2000 RUB/час, 4% координаторам)
|
||||
*
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@
|
||||
* - Валидирует сумму и описание имущества
|
||||
* - Создает предложение и отправляет на одобрение
|
||||
* @param coopname Наименование кооператива
|
||||
* @param username Наименование пользователя-вкладчика
|
||||
* @param username Наименование пользователя-участника
|
||||
* @param property_hash Хеш программного имущественного взноса
|
||||
* @param property_amount Стоимость имущества
|
||||
* @param property_description Описание имущества
|
||||
|
||||
+6
-6
@@ -12,7 +12,7 @@
|
||||
* \htmlonly
|
||||
* <div class="mermaid">
|
||||
* sequenceDiagram
|
||||
* participant P as Собственник
|
||||
* participant P as Пропертор
|
||||
* participant C as Capital Contract
|
||||
* participant S as Soviet Contract
|
||||
* participant W as Кошелек программы
|
||||
@@ -42,13 +42,13 @@
|
||||
* ### Шаг 1: Создание заявления на программный имущественный взнос
|
||||
* @ref capital::createpgprp "Создание имущественного взноса в программу"
|
||||
*
|
||||
* Собственник подаёт заявление на внесение имущества в программу "Капитализации":
|
||||
* Пропертор подаёт заявление на внесение имущества в программу "Капитализации":
|
||||
*
|
||||
* <b>Входящий документ:</b> Заявление на паевой взнос "Исключительные права на имущество" (подписано участником)
|
||||
*
|
||||
* <b>Предварительные условия:</b>
|
||||
* - Собственник имеет активный договор УХД
|
||||
* - Собственник подписал соглашение об условиях ЦПП "Капитализация"
|
||||
* - Пропертор имеет активный договор УХД
|
||||
* - Пропертор подписал соглашение об условиях ЦПП "Капитализация"
|
||||
* - Имущество соответствует требованиям кооператива
|
||||
*
|
||||
* <b>Входящие параметры:</b>
|
||||
@@ -88,7 +88,7 @@
|
||||
* ### Шаг 4: Подписание акта №1 участником
|
||||
* @ref capital::act1pgprp "Подписание акта №1 участником"
|
||||
*
|
||||
* Собственник подписывает акт приёма-передачи имущества:
|
||||
* Пропертор подписывает акт приёма-передачи имущества:
|
||||
*
|
||||
* <b>Входящий документ:</b> Акт приёма-передачи доли в имуществе (подпись участника)
|
||||
*
|
||||
@@ -132,7 +132,7 @@
|
||||
*
|
||||
* ## Связанные процессы
|
||||
*
|
||||
* - @ref public_capital_registration_process "Регистрация вкладчиков" - требуется активный договор УХД
|
||||
* - @ref public_capital_registration_process "Регистрация участников" - требуется активный договор УХД
|
||||
* - @ref public_capital_project_property_process "Имущественные взносы в проект" - альтернативное направление
|
||||
* - @ref public_capital_membership_process "Распределение членских взносов" - получение доходов
|
||||
* - @ref public_capital_conversion_process "Конвертация взносов" - имущественные взносы направляются в программу
|
||||
|
||||
+1
-1
@@ -8,7 +8,7 @@
|
||||
* - Валидирует сумму и описание имущества
|
||||
* - Создает предложение и отправляет на одобрение
|
||||
* @param coopname Наименование кооператива
|
||||
* @param username Наименование пользователя-вкладчика
|
||||
* @param username Наименование пользователя-участника
|
||||
* @param project_hash Хеш проекта
|
||||
* @param property_hash Хеш имущественного взноса
|
||||
* @param property_amount Стоимость имущества
|
||||
|
||||
+5
-5
@@ -12,7 +12,7 @@
|
||||
* \htmlonly
|
||||
* <div class="mermaid">
|
||||
* sequenceDiagram
|
||||
* participant O as Собственник
|
||||
* participant O as Пропертор
|
||||
* participant C as Capital Contract
|
||||
* participant S as Soviet Contract
|
||||
*
|
||||
@@ -37,14 +37,14 @@
|
||||
* ### Шаг 1: Создание заявления на паевой взнос имуществом
|
||||
* @ref capital::createpjprp "Создание имущественного взноса в проект"
|
||||
*
|
||||
* Собственник подает заявление на внесение имущества в активный проект:
|
||||
* Пропертор подает заявление на внесение имущества в активный проект:
|
||||
*
|
||||
* <b>Входящий документ:</b> Заявление на паевой взнос имуществом
|
||||
*
|
||||
* <b>Предварительные условия:</b>
|
||||
* - Проект в статусе `active`
|
||||
* - Собственник имеет активный договор УХД
|
||||
* - Собственник подписал приложение к договору для данного проекта
|
||||
* - Пропертор имеет активный договор УХД
|
||||
* - Пропертор подписал приложение к договору для данного проекта
|
||||
*
|
||||
* <b>Входящие параметры:</b>
|
||||
* - property_amount - оценочная стоимость имущества
|
||||
@@ -60,7 +60,7 @@
|
||||
*
|
||||
* <b>Результат:</b> Создана заявка на имущественный взнос
|
||||
*
|
||||
* <b>Важно:</b> На этом этапе создается только предварительное предложение по имущественному взносу. Фактическое внесение имущества происходит на стадии приёма результата проекта, когда проект проходит стадию генерации и формирует готовый результат. В этот момент имущество передается наравне с другими вкладчиками проекта с подписанием акта приёма-передачи.
|
||||
* <b>Важно:</b> На этом этапе создается только предварительное предложение по имущественному взносу. Фактическое внесение имущества происходит на стадии приёма результата проекта, когда проект проходит стадию генерации и формирует готовый результат. В этот момент имущество передается наравне с другими участниками проекта с подписанием акта приёма-передачи.
|
||||
*
|
||||
* ### Шаг 2: Принятие имущественного взноса
|
||||
* @ref capital::approvepjprp "Принятие имущественного взноса в проект"
|
||||
|
||||
+2
-2
@@ -20,7 +20,7 @@
|
||||
\htmlonly
|
||||
<div class="mermaid">
|
||||
sequenceDiagram
|
||||
participant В as Вкладчик
|
||||
participant В as Участник
|
||||
participant C as Capital Contract
|
||||
participant W as Wallet Contract
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
### Шаг 1: Конвертация сегмента
|
||||
<b>Действие:</b> @ref capital::convertsegm "конвертация сегмента участника"
|
||||
|
||||
Вкладчик распределяет свои доступные средства между тремя направлениями согласно
|
||||
Участник распределяет свои доступные средства между тремя направлениями согласно
|
||||
выбранной стратегии. Система проверяет соблюдение всех ограничений:
|
||||
- Долг должен быть погашен (debt_settled >= debt_amount)
|
||||
- Общая сумма конвертации равна всем взносам участника минус погашенный долг
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
- 📄 Заявление на внесение паевого взноса доли в результате интеллектуальной деятельности с опциональным погашением ссуды (если брал)
|
||||
- 📄 Визирующая подпись председателя на заявл. на паевой взнос результатом
|
||||
- 📄 Решение совета о приёме паевого взноса результатом
|
||||
- 📄 Подписаный акт приёма-передачи от вкладчика
|
||||
- 📄 Подписаный акт приёма-передачи от участника
|
||||
- 📄 Подписаный акт приёма-передачи от председателя
|
||||
@note здесь при взносе результата собственники имущества должны одновременно внести своё имущество
|
||||
+21
-21
@@ -4,14 +4,14 @@
|
||||
* @ingroup public_capital_processes
|
||||
*
|
||||
* Процесс приёма паевого взноса результатом интеллектуальной деятельности
|
||||
* после завершения проекта. Фиксирует доли вкладчиков для последующей конвертации.
|
||||
* после завершения проекта. Фиксирует доли участников для последующей конвертации.
|
||||
*
|
||||
* ## Диаграмма процесса
|
||||
*
|
||||
* \htmlonly
|
||||
* <div class="mermaid">
|
||||
* sequenceDiagram
|
||||
* participant P as Вкладчик
|
||||
* participant P as Участник
|
||||
* participant C as Capital Contract
|
||||
* participant S as Soviet Contract
|
||||
* participant L as Loan Contract
|
||||
@@ -32,9 +32,9 @@
|
||||
* S->>C: 6. authrslt(решение совета)
|
||||
* Note over C: Статус сегмента = AUTHORIZED
|
||||
*
|
||||
* P->>C: 7. signact1(акт №1 от вкладчика)
|
||||
* P->>C: 7. signact1(акт №1 от участника)
|
||||
* Note over C: Статус сегмента = ACT1
|
||||
* Note over C: Подпись вкладчика на акте
|
||||
* Note over C: Подпись участника на акте
|
||||
*
|
||||
* alt Принятие председателем
|
||||
* S->>C: 8. signact2(акт №2 от председателя)
|
||||
@@ -58,17 +58,17 @@
|
||||
* ### Шаг 1: Подача заявления на взнос результатом
|
||||
* Подача заявления на паевой взнос результатом
|
||||
*
|
||||
* Вкладчик подаёт итоговое заявление на взнос результатом интеллектуальной деятельности:
|
||||
* Участник подаёт итоговое заявление на взнос результатом интеллектуальной деятельности:
|
||||
*
|
||||
* <b>Входящий документ:</b> Заявление на паевой взнос результатом (подписано вкладчиком)
|
||||
* <b>Входящий документ:</b> Заявление на паевой взнос результатом (подписано участником)
|
||||
*
|
||||
* <b>Предварительные условия:</b>
|
||||
* - Проект в статусе `completed` (голосование завершено)
|
||||
* - Сегмент вкладчика в статусе `READY`
|
||||
* - Сегмент участника в статусе `READY`
|
||||
* - Сегмент обновлён (выполнен rfrshsegment)
|
||||
*
|
||||
* <b>Входящие суммы должны соответствовать расчётам:</b>
|
||||
* - contribution_amount == total_segment_cost (полная стоимость вклада вкладчика)
|
||||
* - contribution_amount == total_segment_cost (полная стоимость вклада участника)
|
||||
* - debt_amount == segment.debt_amount (сумма к погашению)
|
||||
*
|
||||
* <b>Расчёты и обновления:</b>
|
||||
@@ -108,15 +108,15 @@
|
||||
* - Статус сегмента → `AUTHORIZED`
|
||||
* - Становится возможным подписание актов приёма-передачи
|
||||
*
|
||||
* ### Шаг 4: Подписание акта №1 вкладчиком
|
||||
* Подписание акта №1 вкладчиком
|
||||
* ### Шаг 4: Подписание акта №1 участником
|
||||
* Подписание акта №1 участником
|
||||
*
|
||||
* Вкладчик подписывает акт приёма-передачи доли в результате:
|
||||
* Участник подписывает акт приёма-передачи доли в результате:
|
||||
* - Подтверждает передачу своей доли кооперативу
|
||||
* - Соглашается с расчётом вознаграждения
|
||||
* - Фиксирует своё согласие на условия приёма
|
||||
*
|
||||
* <b>Входящий документ:</b> Акт приёма-передачи (подпись вкладчика)
|
||||
* <b>Входящий документ:</b> Акт приёма-передачи (подпись участника)
|
||||
*
|
||||
* <b>Результат:</b>
|
||||
* - Статус сегмента → `ACT1`
|
||||
@@ -130,7 +130,7 @@
|
||||
* - Фиксирует обязательства кооператива по выплатам
|
||||
* - Завершает процедуру приёма паевого взноса
|
||||
*
|
||||
* <b>Входящий документ:</b> Акт приёма-передачи (подписи вкладчика и председателя)
|
||||
* <b>Входящий документ:</b> Акт приёма-передачи (подписи участника и председателя)
|
||||
*
|
||||
* <b>Финальные изменения:</b>
|
||||
* - Статус сегмента → `CONTRIBUTED`
|
||||
@@ -143,7 +143,7 @@
|
||||
* - Заявление отклоняется до передачи в совет
|
||||
* - Временный объект `results` удаляется
|
||||
* - Статус сегмента возвращается к `READY`
|
||||
* - Вкладчик может подать исправленное заявление
|
||||
* - Участник может подать исправленное заявление
|
||||
*
|
||||
* #### Отклонение советом
|
||||
* - Совет не принимает результат на любом этапе (до авторизации или после)
|
||||
@@ -155,36 +155,36 @@
|
||||
*
|
||||
* ### Природа паевого взноса
|
||||
* - Результат интеллектуальной деятельности передается как имущественный вклад
|
||||
* - Вкладчик получает паевые права в кооперативе
|
||||
* - Участник получает паевые права в кооперативе
|
||||
* - Кооператив становится обладателем исключительных прав на результат
|
||||
*
|
||||
* ### Документооборот
|
||||
* - <b>Заявление</b> - волеизъявление вкладчика о намерении совершить паевой взнос
|
||||
* - <b>Заявление</b> - волеизъявление участника о намерении совершить паевой взнос
|
||||
* - <b>Решение совета</b> - протокол собрания совета с решением и приёме взноса
|
||||
* - <b>Акты приёма-передачи</b> - фиксация перехода прав
|
||||
*
|
||||
* ## Структура итогового вознаграждения
|
||||
*
|
||||
* После завершения процесса вкладчик получает:
|
||||
* После завершения процесса участник получает:
|
||||
*
|
||||
* ### Базовая часть (себестоимость)
|
||||
* - <b>Создатель:</b> creator_base (стоимость коммитов)
|
||||
* - <b>Исполнитель:</b> creator_base (стоимость коммитов)
|
||||
* - <b>Автор:</b> author_base (61.8% от создателей)
|
||||
* - <b>Координатор:</b> coordinator_base (% от привлечённых инвестиций)
|
||||
* - <b>Инвестор:</b> investor_base (использованная часть инвестиций)
|
||||
* - <b>Собственник:</b> property_base (стоимость имущественного взноса)
|
||||
* - <b>Пропертор:</b> property_base (стоимость имущественного взноса)
|
||||
*
|
||||
* ### Премиальная часть (бонусы)
|
||||
* - <b>Создатели:</b> creator_bonus (100% от базы)
|
||||
* - <b>Авторы:</b> author_bonus (равная часть + голосование)
|
||||
* - <b>Вкладчики:</b> contributor_bonus (161.8% от генерации)
|
||||
* - <b>Участники:</b> contributor_bonus (161.8% от генерации)
|
||||
* - <b>Голосование:</b> voting_bonus (по методу Водянова)
|
||||
*
|
||||
* ## Результат процесса
|
||||
*
|
||||
* @post:
|
||||
* 1. Результат интеллектуальной деятельности принят кооперативом как паевой взнос
|
||||
* 2. Погашена ссуда вкладчика (если была)
|
||||
* 2. Погашена ссуда участника (если была)
|
||||
* 3. Сегмент в статусе CONTRIBUTED и готов к конвертации в различные кошельки кооператива
|
||||
* 4. Статусы сегмента и результата синхронизированы на каждом этапе процесса
|
||||
*
|
||||
|
||||
+24
-24
@@ -2,32 +2,32 @@
|
||||
* @defgroup public_capital_calculate_votes_process Подсчет голосов по методу Водянова
|
||||
* @ingroup public_capital_processes
|
||||
*
|
||||
* Процесс завершения голосования для конкретного вкладчика с расчетом итоговых сумм
|
||||
* Процесс завершения голосования для конкретного участника с расчетом итоговых сумм
|
||||
* по методу Водянова.
|
||||
*
|
||||
* ## Назначение процесса
|
||||
*
|
||||
* Подсчет голосов по методу Водянова обеспечивает:
|
||||
* - Расчет итоговых сумм вкладчика по результатам голосования
|
||||
* - Расчет итоговых сумм участника по результатам голосования
|
||||
* - Применение метода Водянова: (сумма голосов + средняя сумма распределения) / количество голосующих
|
||||
* - Распределение фиксированных премий авторам и создателям
|
||||
* - Обновление сегмента вкладчика с итоговыми суммами
|
||||
* - Обновление сегмента участника с итоговыми суммами
|
||||
*
|
||||
* \htmlonly
|
||||
* <div class="mermaid">
|
||||
* sequenceDiagram
|
||||
* participant У as Вкладчик
|
||||
* participant У as Участник
|
||||
* participant ПК as Контракт Capital
|
||||
* participant П as Проект
|
||||
*
|
||||
* У->>ПК: 1. Завершение голосования вкладчика
|
||||
* У->>ПК: 1. Завершение голосования участника
|
||||
* Note over ПК: Проверка статуса проекта
|
||||
* ПК->>П: 2. Проверка статуса и завершения голосования
|
||||
* alt Проект завершен и голосование завершено
|
||||
* П->>ПК: 3. Подтверждение статуса
|
||||
* ПК->>ПК: 4. Получение сегмента вкладчика
|
||||
* ПК->>ПК: 4. Получение сегмента участника
|
||||
* ПК->>ПК: 5. Расчет итоговых сумм
|
||||
* ПК->>ПК: 6. Обновление сегмента вкладчика
|
||||
* ПК->>ПК: 6. Обновление сегмента участника
|
||||
* else Проект или голосование не завершены
|
||||
* ПК->>У: Ошибка: проект или голосование не завершены
|
||||
* end
|
||||
@@ -37,9 +37,9 @@
|
||||
* ## Пошаговое описание процесса
|
||||
*
|
||||
* ### Шаг 1: Инициация подсчета голосов
|
||||
* <b>Действие:</b> @ref capital::calcvotes "Завершение голосования вкладчика"
|
||||
* <b>Действие:</b> @ref capital::calcvotes "Завершение голосования участника"
|
||||
*
|
||||
* Инициируется процесс подсчета голосов для конкретного вкладчика
|
||||
* Инициируется процесс подсчета голосов для конкретного участника
|
||||
* после завершения голосования по проекту.
|
||||
*
|
||||
* @post Проверка авторизации кооператива
|
||||
@@ -50,18 +50,18 @@
|
||||
* Система проверяет, что:
|
||||
* - Проект находится в статусе завершенного голосования
|
||||
* - Голосование по проекту завершено
|
||||
* - Вкладчик является вкладчиком голосования
|
||||
* - Участник является участником голосования
|
||||
*
|
||||
* @post Подтвержден статус проекта как "завершенное голосование"
|
||||
* @post Подтверждено завершение голосования
|
||||
* @post Подтверждено участие пользователя в голосовании
|
||||
*
|
||||
* ### Шаг 3: Получение сегмента вкладчика
|
||||
* <b>Действие:</b> Загрузка данных вкладчика
|
||||
* ### Шаг 3: Получение сегмента участника
|
||||
* <b>Действие:</b> Загрузка данных участника
|
||||
*
|
||||
* Система получает сегмент вкладчика для расчета его итоговых сумм.
|
||||
* Система получает сегмент участника для расчета его итоговых сумм.
|
||||
*
|
||||
* @post Получен сегмент вкладчика
|
||||
* @post Получен сегмент участника
|
||||
*
|
||||
* ### Шаг 4: Расчет итоговых сумм
|
||||
* <b>Действие:</b> Вычисление результатов голосования
|
||||
@@ -69,21 +69,21 @@
|
||||
* Система рассчитывает три типа итоговых сумм:
|
||||
* - Результаты по методу Водянова: (сумма голосов + средняя сумма распределения) / количество голосующих
|
||||
* - Равные распределения авторам: 61.8% авторских премий равномерно между авторами
|
||||
* - Прямые распределения создателям: 61.8% создательских премий
|
||||
* - Прямые распределения создателям: 61.8% исполнительских премий
|
||||
*
|
||||
* @post Рассчитаны все итоговые суммы вкладчика
|
||||
* @post Рассчитаны все итоговые суммы участника
|
||||
*
|
||||
* ### Шаг 5: Обновление сегмента вкладчика
|
||||
* ### Шаг 5: Обновление сегмента участника
|
||||
* <b>Действие:</b> Сохранение результатов
|
||||
*
|
||||
* Система обновляет сегмент вкладчика с рассчитанными итоговыми суммами
|
||||
* Система обновляет сегмент участника с рассчитанными итоговыми суммами
|
||||
* раздельно по пулам для дальнейшего использования.
|
||||
*
|
||||
* @post Сегмент вкладчика обновлен с итоговыми суммами
|
||||
* @post Сегмент участника обновлен с итоговыми суммами
|
||||
*
|
||||
* ## Метод расчета по Водянову
|
||||
*
|
||||
* Метод Водянова для расчета итоговой суммы вкладчика:
|
||||
* Метод Водянова для расчета итоговой суммы участника:
|
||||
* ```
|
||||
* итоговая_сумма = (сумма_голосов + средняя_сумма_распределения) / количество_голосующих
|
||||
* ```
|
||||
@@ -92,14 +92,14 @@
|
||||
*
|
||||
* Система также рассчитывает фиксированные распределения:
|
||||
* - 61.8% авторских премий распределяются равномерно между всеми авторами
|
||||
* - 61.8% создательских премий распределяются напрямую создателям
|
||||
* - 61.8% исполнительских премий распределяются напрямую создателям
|
||||
*
|
||||
* ## Результат процесса
|
||||
*
|
||||
* После завершения процесса:
|
||||
* 1. Рассчитаны все итоговые суммы вкладчика
|
||||
* 2. Сегмент вкладчика обновлен с результатами голосования
|
||||
* 3. Вкладчик получил свою долю по результатам голосования
|
||||
* 1. Рассчитаны все итоговые суммы участника
|
||||
* 2. Сегмент участника обновлен с результатами голосования
|
||||
* 3. Участник получил свою долю по результатам голосования
|
||||
*
|
||||
* ## Связанные процессы
|
||||
*
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* @brief Завершение голосования для конкретного участника по методу Водянова
|
||||
* Рассчитывает полные итоговые суммы участника включая:
|
||||
* - Результаты голосования по Водянову: (сумма голосов + средняя сумма распределения) / количество голосующих
|
||||
* - Фиксированные распределения: 61.8% авторских премий равно между авторами, 61.8% создательских премий прямо создателям
|
||||
* - Фиксированные распределения: 61.8% авторских премий равно между авторами, 61.8% исполнительских премий прямо создателям
|
||||
* Обновляет сегмент участника с итоговыми суммами раздельно по пулам
|
||||
* @param coopname Наименование кооператива
|
||||
* @param username Наименование пользователя-участника голосования
|
||||
|
||||
@@ -2,21 +2,21 @@
|
||||
* @defgroup public_capital_submit_vote_process Голосование по методу Водянова
|
||||
* @ingroup public_capital_processes
|
||||
*
|
||||
* Процесс распределения голосующей суммы вкладчиком между другими вкладчиками проекта
|
||||
* Процесс распределения голосующей суммы участником между другими участниками проекта
|
||||
* по методу Водянова и сохранения результатов голосования в системе.
|
||||
*
|
||||
* ## Назначение процесса
|
||||
*
|
||||
* Подача голоса по методу Водянова обеспечивает:
|
||||
* - Распределение голосующей суммы вкладчика между другими вкладчиками проекта
|
||||
* - Распределение голосующей суммы участника между другими участниками проекта
|
||||
* - Валидацию корректности распределения голосов
|
||||
* - Сохранение голосов в системе для последующего подсчета
|
||||
* - Учет голоса в общем количестве полученных голосов вкладчиками
|
||||
* - Учет голоса в общем количестве полученных голосов участниками
|
||||
*
|
||||
* \htmlonly
|
||||
* <div class="mermaid">
|
||||
* sequenceDiagram
|
||||
* participant У as Вкладчик
|
||||
* participant У as Участник
|
||||
* participant ПК as Контракт Capital
|
||||
* participant П as Проект
|
||||
*
|
||||
@@ -25,7 +25,7 @@
|
||||
* ПК->>П: 2. Проверка статуса и срока голосования
|
||||
* alt Проект в статусе голосования
|
||||
* П->>ПК: 3. Подтверждение статуса
|
||||
* ПК->>ПК: 4. Валидация вкладчика голосования
|
||||
* ПК->>ПК: 4. Валидация участника голосования
|
||||
* ПК->>ПК: 5. Проверка корректности голосов
|
||||
* ПК->>ПК: 6. Сохранение голосов
|
||||
* ПК->>П: 7. Обновление счетчика голосов
|
||||
@@ -40,7 +40,7 @@
|
||||
* ### Шаг 1: Инициация подачи голоса
|
||||
* <b>Действие:</b> @ref capital::submitvote "Подача голоса по методу Водянова"
|
||||
*
|
||||
* Вкладчик распределяет свою голосующую сумму между другими вкладчиками проекта
|
||||
* Участник распределяет свою голосующую сумму между другими участниками проекта
|
||||
* в рамках голосования по методу Водянова.
|
||||
*
|
||||
* @post Проверка авторизации кооператива
|
||||
@@ -55,12 +55,12 @@
|
||||
* @post Подтвержден статус проекта как "голосование"
|
||||
* @post Подтверждено, что срок голосования не истек
|
||||
*
|
||||
* ### Шаг 3: Валидация вкладчика голосования
|
||||
* <b>Действие:</b> Проверка прав вкладчика
|
||||
* ### Шаг 3: Валидация участника голосования
|
||||
* <b>Действие:</b> Проверка прав участника
|
||||
*
|
||||
* Система проверяет, что:
|
||||
* - Вкладчик является вкладчиком голосования по проекту (автор или создатель)
|
||||
* - Вкладчик еще не голосовал по данному проекту
|
||||
* - Участник является участником голосования по проекту (автор или исполнитель)
|
||||
* - Участник еще не голосовал по данному проекту
|
||||
*
|
||||
* @post Подтверждено участие пользователя в голосовании
|
||||
* @post Подтверждено, что пользователь еще не голосовал
|
||||
@@ -69,11 +69,11 @@
|
||||
* <b>Действие:</b> Валидация распределения голосов
|
||||
*
|
||||
* Система проверяет корректность распределения голосов:
|
||||
* - Вкладчик не голосует за себя
|
||||
* - Все получатели голосов являются вкладчиками голосования
|
||||
* - Участник не голосует за себя
|
||||
* - Все получатели голосов являются участниками голосования
|
||||
* - Нет повторяющихся получателей голосов
|
||||
* - Все суммы голосов положительные
|
||||
* - Количество получателей равно общему количеству вкладчиков минус один (сам вкладчик)
|
||||
* - Количество получателей равно общему количеству участников минус один (сам участник)
|
||||
* - Общая сумма голосов равна активной голосующей сумме
|
||||
* - Сумма голосов плюс равная не голосующая сумма равна общей сумме на распределении
|
||||
*
|
||||
@@ -100,16 +100,16 @@
|
||||
* <b>Обязательные требования:</b>
|
||||
* - Проект должен быть в статусе голосования
|
||||
* - Срок голосования не должен быть истекшим
|
||||
* - Вкладчик должен быть вкладчиком голосования
|
||||
* - Вкладчик еще не голосовал по данному проекту
|
||||
* - Участник должен быть участником голосования
|
||||
* - Участник еще не голосовал по данному проекту
|
||||
* - Распределение голосов должно соответствовать правилам метода Водянова
|
||||
*
|
||||
* ## Результат процесса
|
||||
*
|
||||
* post"
|
||||
* 1. Голоса вкладчика сохранены в системе
|
||||
* 1. Голоса участника сохранены в системе
|
||||
* 2. Счетчик полученных голосов обновлен
|
||||
* 3. Вкладчик больше не может голосовать по данному проекту
|
||||
* 3. Участник больше не может голосовать по данному проекту
|
||||
*
|
||||
* ## Связанные процессы
|
||||
*
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
const double CREATORS_BONUS_COEFFICIENT = 1; ///< Коэффициент премий создателей от своей себестоимости (100%)
|
||||
const double AUTHOR_BASE_COEFFICIENT = 0.618; ///< Коэффициент авторской себестоимости от себестоимости создателя (61.8%)
|
||||
const double AUTHOR_BONUS_COEFFICIENT = 1; ///< Коэффициент премий авторов от своей себестоимости (100%)
|
||||
const double CONTRIBUTORS_BONUS_COEFFICIENT = 1.618; ///< Коэффициент премий вкладчиков от себестоимостей создателей, авторов и координаторов (161.8%)
|
||||
const double CONTRIBUTORS_BONUS_COEFFICIENT = 1.618; ///< Коэффициент премий участников от себестоимостей создателей, авторов и координаторов (161.8%)
|
||||
const uint32_t MAX_PROJECT_AUTHORS = 12; ///< Максимальное количество авторов в проекте
|
||||
const uint64_t MAX_RATE_PER_HOUR = 30000000; ///< Максимальная ставка за час
|
||||
const uint64_t MAX_HOURS_PER_DAY = 12; ///< Максимальное количество часов в день
|
||||
@@ -252,11 +252,11 @@ public:
|
||||
[[eosio::action]]
|
||||
void declinereg(eosio::name coopname, eosio::name username, checksum256 contributor_hash, std::string reason);
|
||||
|
||||
// Редактирование вкладчиков
|
||||
// Редактирование участников
|
||||
[[eosio::action]]
|
||||
void editcontrib(eosio::name coopname, eosio::name username, eosio::asset rate_per_hour, uint64_t hours_per_day);
|
||||
|
||||
// Импорт вкладчиков
|
||||
// Импорт участников
|
||||
[[eosio::action]]
|
||||
void importcontrib(eosio::name coopname, eosio::name username, checksum256 contributor_hash, eosio::asset contribution_amount, std::string memo);
|
||||
|
||||
|
||||
@@ -12,22 +12,22 @@
|
||||
* за результаты интеллектуальной деятельности в рамках кооперативной экономики.
|
||||
* Он обеспечивает:
|
||||
*
|
||||
* - Регистрацию и управление вкладчиками (участниками проектов)
|
||||
* - Регистрацию и управление участниками (участниками проектов)
|
||||
* - Планирование и управление жизненным циклом проектов
|
||||
* - Учёт различных видов вкладов (интеллектуальных, имущественных, денежных)
|
||||
* - Справедливое распределение премий по методу Водянова
|
||||
* - Капитализацию результатов через цифровую целевую потребительскую программу "Капитализация"
|
||||
* - Управление членскими взносами и их распределением среди вкладчиков
|
||||
* - Управление членскими взносами и их распределением среди участников
|
||||
* - Масштабируемое распределение вознаграждений через алгоритм @ref public_capital_crps_algorithm "CRPS (накопленная награда на долю)"
|
||||
*
|
||||
* ## Роли участников
|
||||
* - **Пайщик** - участник кооператива, не обладающий подписанным договором на участие в хозяйственной деятельности (УХД)
|
||||
* - **Вкладчик** - пайщик, принимающий участие в генерации результата интеллектуальной деятельности по договору УХД и проектным приложениям к нему
|
||||
* - **Пайщик** - член кооператива, не обладающий подписанным договором на участие в хозяйственной деятельности (УХД)
|
||||
* - **Участник** - пайщик, принимающий участие в генерации результата интеллектуальной деятельности по договору УХД и проектным приложениям к нему
|
||||
* - **Автор** - вкладчик авторских прав на результат интеллектуальной деятельности
|
||||
* - **Создатель** - вкладчик, вносящий время на создание результата интеллектуальной деятельности
|
||||
* - **Исполнитель** - вкладчик, вносящий время на создание результата интеллектуальной деятельности
|
||||
* - **Координатор** - вкладчик инвестиционного плана проекта, привлекающий инвестиции для проекта
|
||||
* - **Инвестор** - вкладчик денежных средств в программу или проект
|
||||
* - **Собственник** - вкладчик имущества (не денежного) в программу или проект
|
||||
* - **Пропертор** - вкладчик имущества (не денежного) в программу или проект
|
||||
* - **Мастер** - вкладчик, ответственный за управление проектом и его результат
|
||||
|
||||
*
|
||||
@@ -36,14 +36,14 @@
|
||||
* регулирующий отношения между пайщиком и кооперативом в рамках кооперативной экономики, на основании которого пайщик принимает участие в генерации результата интеллектуальной деятельности.
|
||||
* - **Проектное приложение к договору УХД** - Дополнительный документ, регулирующий отношения между пайщиком и кооперативом в рамках проекта.
|
||||
* - **Идея** - образ состояния будущего результата и его общественной пользы, описанный по форме проекта.
|
||||
* - **Проект** - идея, принятая в кооператив для дальнейшей реализации вкладчиками.
|
||||
* - **Проект** - идея, принятая в кооператив для дальнейшей реализации участниками.
|
||||
* - **Мета-проект** - проект, который состоит из нескольких проектов (компонентов или этапов).
|
||||
* - **Результат интеллектуальной деятельности** - результат, полученный в результате реализации проекта.
|
||||
* - **Генерация** - процесс создания результата интеллектуальной деятельности.
|
||||
* - **Капитализация** - процесс роста стоимости доли вкладчика в результатах интеллектуальной деятельности.
|
||||
* - **Капитализация** - процесс роста стоимости доли участника в результатах интеллектуальной деятельности.
|
||||
* - **Идеократия** - концепция оценки общественной стоимости идей в кооперативной экономике.
|
||||
* - **Золотое сечение** - Математический коэффициент (0.618), используемый для гармоничного
|
||||
* распределения вознаграждений между вкладчиками.
|
||||
* распределения вознаграждений между участниками.
|
||||
* - **ЦПП "Капитализация"** - Целевая Потребительская Программа долгосрочного накопления
|
||||
* и капитализации результатов интеллектуальной деятельности.
|
||||
* - **Программа** - сокращение от ЦПП "Капитализация".
|
||||
@@ -52,26 +52,26 @@
|
||||
* - **Кошелёк Проекта** - персональный счёт для хранения паевого взноса, которое допускает возврат паевого взноса из числа членских взносов по проекту;
|
||||
* - **Кошелёк Договора** - персональный счёт для хранения суммы паевых взносов по всем проектам;
|
||||
* - **Коммит** - фиксация трудозатрат создателя в проекте, формирующая себестоимость
|
||||
* и премии вкладчиков.
|
||||
* и премии участников.
|
||||
* - **Голосование по методу Водянова** - Демократический процесс распределения части премий
|
||||
* между вкладчиками через взаимную оценку вклада.
|
||||
* между участниками через взаимную оценку вклада.
|
||||
* - **CRPS (Cumulative Reward Per Share)** - Алгоритм кумулятивного вознаграждения на долю,
|
||||
* обеспечивающий распределение выгоды между вкладчиками пропорционально их вкладу.
|
||||
* - **Сегмент** - объект в памяти блокчейна, в котором содержится информация о вкладе вкладчиков в проект.
|
||||
* - **Конвертация сегментов** - Процесс перераспределения доступных средств вкладчика после внесения результата интеллектуальной деятельности между
|
||||
* обеспечивающий распределение выгоды между участниками пропорционально их вкладу.
|
||||
* - **Сегмент** - объект в памяти блокчейна, в котором содержится информация о вкладе участников в проект.
|
||||
* - **Конвертация сегментов** - Процесс перераспределения доступных средств участника после внесения результата интеллектуальной деятельности между
|
||||
* тремя направлениями: ЦПП "Цифровой кошелёк", ЦПП "Капитализация" и проектный кошелёк приложения к договору УХД.
|
||||
* - **Базовая себестоимость** - Стоимость фактических затрат вкладчиков, рассчитанные
|
||||
* - **Базовая себестоимость** - Стоимость фактических затрат участников, рассчитанные
|
||||
* по ставке часа создателей, стоимости имущества собственников, денежных средств инвесторов и инвестиционного плана координаторов, вложенных в проект.
|
||||
* - **Премия генерации** - вознаграждение, выплачиваемое авторам и создателям за их вклад в проект.
|
||||
* - **Премия капитализации** - вознаграждение, выплачиваемое вкладчикам за их вклад в проект пропорционально их вкладам в ЦПП "Капитализация".
|
||||
* - **Членские взносы** - выгода вкладчиков от использования результатов их интеллектуальной деятельности.
|
||||
* - **Сеньораж** - выгода вкладчиков от роста количества членских взносов кооперативов за использование платформы кооперативной экономики.
|
||||
* - **Проектная выгода** - выгода вкладчиков от использования конкретных
|
||||
* результатов проекта, распределяемая между вкладчиками в этом проекте, которые сохранили в нём доли.
|
||||
* - **Премия капитализации** - вознаграждение, выплачиваемое участникам за их вклад в проект пропорционально их вкладам в ЦПП "Капитализация".
|
||||
* - **Членские взносы** - выгода участников от использования результатов их интеллектуальной деятельности.
|
||||
* - **Сеньораж** - выгода участников от роста количества членских взносов кооперативов за использование платформы кооперативной экономики.
|
||||
* - **Проектная выгода** - выгода участников от использования конкретных
|
||||
* результатов проекта, распределяемая между участниками в этом проекте, которые сохранили в нём доли.
|
||||
* - **Имущественные взносы** - взносы участников в виде имущества по оценочной стоимости в проект или программу.
|
||||
* - **Интеллектуальные взносы** - взносы участников в виде результатов затраченного времени по проекту.
|
||||
* - **Инвестиционные взносы** - взносы участников в виде денежных средств.
|
||||
* - **Обеспеченная сумма** - доступная сумма денежных средств для получения ссуд вкладчика, рассчитанная с учетом всех ограничений и лимитов.
|
||||
* - **Обеспеченная сумма** - доступная сумма денежных средств для получения ссуд участника, рассчитанная с учетом всех ограничений и лимитов.
|
||||
* - **Сумма компенсации** - процент от базовой стоимости сегмента авторов, создателей и координаторов, доступный для конвертации в ЦПП "Цифровой Кошелек" при учёте внесённых инвесторами инвестиций.
|
||||
* - **Коэффициент использования инвестиций** - показатель эффективности использования привлечённых в проект инвестиций.
|
||||
* - **Сумма возврата неиспользованных инвестиций** - сумма неиспользованных инвестиций, которые подлежат возврату в цифровой кошелек инвестора.
|
||||
@@ -94,7 +94,7 @@
|
||||
*
|
||||
* ### Идеократия и общественно-полезное время
|
||||
*
|
||||
* В основе математической модели контракта лежит принцип распределения справедливой выгоды между вкладчиками
|
||||
* В основе математической модели контракта лежит принцип распределения справедливой выгоды между участниками
|
||||
* согласно концепции "Общественно-полезного времени", разработанной в рамках теорий Побиска-Кузнецова
|
||||
* и связанной с проектом Общегосударственной автоматизированной системы учета и обработки информации (ОГАС) академика Глушкова.
|
||||
*
|
||||
@@ -241,14 +241,14 @@
|
||||
* #### 2. Процесс Капитализации
|
||||
*
|
||||
* **Цель**: Трансформация сгенерированной стоимости в капитализируемые активы, обеспечивающие
|
||||
* долгосрочный рост и справедливое распределение выгоды среди вкладчиков.
|
||||
* долгосрочный рост и справедливое распределение выгоды среди участников.
|
||||
*
|
||||
* **Основной принцип**: Капитализация обеспечивает рост стоимости через механизм
|
||||
* золотого сечения, где каждый новый **интеллектуальный** вклад добавляет ценность предыдущим вложениям.
|
||||
*
|
||||
* **Математические формулы капитализации**:
|
||||
*
|
||||
* Премии всех вкладчиков (капитализация):
|
||||
* Премии всех участников (капитализация):
|
||||
* \f[
|
||||
* Bonus_{contributors} = Total_{generation} \times 1.618
|
||||
* \f]
|
||||
@@ -271,7 +271,7 @@
|
||||
* </div>
|
||||
* \endhtmlonly
|
||||
*
|
||||
* Капитализация распределяется между всеми вкладчиками пропорционально их доле в целевой потребительской программе "Капитализация".
|
||||
* Капитализация распределяется между всеми участниками пропорционально их доле в целевой потребительской программе "Капитализация".
|
||||
*
|
||||
* Дополнительная информация о Идеократии: https://blog.coopenomics.world/2025/04/08/идеократия/
|
||||
*
|
||||
@@ -292,13 +292,13 @@
|
||||
* <div class="mermaid">
|
||||
* sequenceDiagram
|
||||
* participant C as Кооператив
|
||||
* participant V as Вкладчики
|
||||
* participant V as Участники
|
||||
* participant Proj as Проект
|
||||
* participant Prog as Программа
|
||||
*
|
||||
* Note over C,Prog: Подготовительная фаза
|
||||
* C->>C: Конфигурация системы
|
||||
* V->>C: Регистрация вкладчиков
|
||||
* V->>C: Регистрация участников
|
||||
* C->>Proj: Создание проекта
|
||||
* C->>Proj: Установка мастера
|
||||
* C->>Proj: Добавление авторов
|
||||
@@ -315,7 +315,7 @@
|
||||
* V->>Prog: Инвестирование в программу
|
||||
* V->>Prog: Имущественные взносы
|
||||
* C->>Proj: Аллокация средств
|
||||
* V->>Proj: Регистрация доли вкладчика
|
||||
* V->>Proj: Регистрация доли участника
|
||||
* Note right of V: Регистрация доли для получения доли в результате
|
||||
* end
|
||||
*
|
||||
@@ -387,14 +387,14 @@
|
||||
*
|
||||
* Установка базовых параметров системы капитализации для кооператива.
|
||||
*
|
||||
* **Процесс:** @ref public_capital_import_contributor_process "Импорт вкладчиков"
|
||||
* **Процесс:** @ref public_capital_import_contributor_process "Импорт участников"
|
||||
*
|
||||
* Импорт внешних участников кооператива с автоматическим созданием записей и внесением первоначальных взносов.
|
||||
* Доступно только до установки конфигурации кооператива.
|
||||
*
|
||||
* **Процесс:** @ref public_capital_registration_process "Регистрация вкладчиков"
|
||||
* **Процесс:** @ref public_capital_registration_process "Регистрация участников"
|
||||
*
|
||||
* Приём договоров УХД от пайщиков для получения статуса вкладчика и права участия в проектах.
|
||||
* Приём договоров УХД от пайщиков для получения статуса участника и права участия в проектах.
|
||||
*
|
||||
* ### Инициализация проекта
|
||||
* **Процесс:** @ref public_capital_project_creation_process "Создание проекта"
|
||||
@@ -403,7 +403,7 @@
|
||||
*
|
||||
* **Процесс:** @ref public_capital_set_master_process "Установка мастера проекта"
|
||||
*
|
||||
* Назначение ответственного вкладчика за управление проектом и контроль результата.
|
||||
* Назначение ответственного участника за управление проектом и контроль результата.
|
||||
*
|
||||
* **Процесс:** @ref public_capital_add_author_process "Добавление авторов"
|
||||
*
|
||||
@@ -415,7 +415,7 @@
|
||||
*
|
||||
* **Процесс:** @ref public_capital_joining_process "Присоединение к проекту"
|
||||
*
|
||||
* Подписание приложений к договору УХД вкладчиками для формального допуска к генерации.
|
||||
* Подписание приложений к договору УХД участниками для формального допуска к генерации.
|
||||
*
|
||||
* ## Фаза 2: Привлечение инвестиций
|
||||
*
|
||||
@@ -449,7 +449,7 @@
|
||||
*
|
||||
* Внесение материальных активов в программу капитализации для общего пула.
|
||||
*
|
||||
* **Процесс:** @ref public_capital_share_registration_process "Регистрация доли вкладчика"
|
||||
* **Процесс:** @ref public_capital_share_registration_process "Регистрация доли участника"
|
||||
*
|
||||
* Формальная регистрация права на получение доходов пропорционально программным вложениям.
|
||||
*
|
||||
@@ -524,7 +524,7 @@
|
||||
* ## Фаза 5: Приём результата
|
||||
|
||||
Формальное принятие созданного интеллектуального результата в активы кооператива
|
||||
и финализация всех расчетов с вкладчиками.
|
||||
и финализация всех расчетов с участниками.
|
||||
|
||||
### Интеграция результата
|
||||
**Процесс:** @ref public_capital_result_process "Приём результата в кооператив"
|
||||
@@ -534,11 +534,11 @@
|
||||
### Финализация вкладов
|
||||
**Процесс:** @ref public_capital_conversion_process "Конвертация сегментов"
|
||||
|
||||
Преобразование накопленных вкладов вкладчиков в выбранные ими формы активов.
|
||||
Преобразование накопленных вкладов участников в выбранные ими формы активов.
|
||||
|
||||
**Процесс:** @ref public_capital_unused_return_process "Возврат неиспользованных инвестиций"
|
||||
|
||||
Автоматический возврат неизрасходованной части инвестиций в цифровые кошельки вкладчиков.
|
||||
Автоматический возврат неизрасходованной части инвестиций в цифровые кошельки участников.
|
||||
|
||||
### Управление остаточными средствами
|
||||
**Процесс:** @ref public_capital_deallocation_process "Диаллокация средств из проекта"
|
||||
@@ -547,11 +547,11 @@
|
||||
|
||||
**Процесс:** @ref withdraw_from_program_process "Возврат из программы капитализации"
|
||||
|
||||
Возврат накопленных доходов вкладчикам из программы капитализации.
|
||||
Возврат накопленных доходов участникам из программы капитализации.
|
||||
|
||||
**Процесс:** @ref withdraw_from_project_process "Возврат из проекта"
|
||||
|
||||
Возврат доли паевого взноса вкладчикам, сохранившим средства в проекте.
|
||||
Возврат доли паевого взноса участникам, сохранившим средства в проекте.
|
||||
|
||||
### Архивирование
|
||||
**Процесс:** @ref public_capital_project_deletion_process "Удаление проекта"
|
||||
@@ -574,7 +574,7 @@
|
||||
* выбирает направление конвертации своих вкладов из следующих вариантов:
|
||||
*
|
||||
* **Конвертация в цифровой кошелек** - прямой доступ к вознаграждениям с возможностью
|
||||
* свободного распоряжения средствами. Доступно для трудовых взносов (авторских, создательских, координаторских).
|
||||
* свободного распоряжения средствами. Доступно для трудовых взносов (авторских, исполнительских, координаторских).
|
||||
*
|
||||
* **Конвертация в программу капитализации** - передача средств в программу для капитализации
|
||||
* новыми интеллектуальными вкладами с обеспечением возврата механизмом сеньоража.
|
||||
@@ -597,9 +597,9 @@
|
||||
|
||||
* После прохождения полного жизненного цикла:
|
||||
* 1. Создан результат интеллектуальной деятельности и внесён в кооператив как паевой взнос
|
||||
* 2. Справедливо распределены вознаграждения между вкладчиками
|
||||
* 2. Справедливо распределены вознаграждения между участниками
|
||||
* 3. Возвращены неиспользованные инвестиции
|
||||
* 4. Зафиксированы доли вкладчиков для получения членских взносов и возврата паевых взносов
|
||||
* 4. Зафиксированы доли участников для получения членских взносов и возврата паевых взносов
|
||||
*
|
||||
* ## Алгоритм CRPS
|
||||
* @ref public_capital_crps_algorithm "Алгоритм CRPS (Cumulative Reward Per Share)" - математическая основа
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* @defgroup public_capital_crps_algorithm Алгоритм CRPS
|
||||
* @ingroup public_capital
|
||||
*
|
||||
* Алгоритм обеспечивает справедливое и эффективное распределение различных типов наград между вкладчиками.
|
||||
* Алгоритм обеспечивает справедливое и эффективное распределение различных типов наград между участниками.
|
||||
*
|
||||
* CRPS расшифровывается как Cumulative Reward Per Share - кумулятивное вознаграждение на долю.
|
||||
* Это алгоритм распределения вознаграждений, который позволяет справедливо делить средства между
|
||||
@@ -60,24 +60,24 @@
|
||||
* текущим кумулятивным показателем и его персональным слепком, умноженная на количество долей автора.
|
||||
* Поскольку у каждого автора по одной доле, каждый получит 1000 рублей.
|
||||
*
|
||||
* Вкладчики получают вознаграждения пропорционально своим долям в проекте. Эта система обеспечивает,
|
||||
* Участники получают вознаграждения пропорционально своим долям в проекте. Эта система обеспечивает,
|
||||
* что чем больше доля участника в проекте, тем больше вознаграждение он получит от общих доходов.
|
||||
*
|
||||
* Вкладчические премии рассчитываются на основе баланса долей участника в программе капитализации.
|
||||
* Когда в проект поступают новые вознаграждения для вкладчиков, система определяет общую сумму
|
||||
* всех долей в проекте и рассчитывает прирост вознаграждения на каждую долю. Каждый вкладчик
|
||||
* Когда в проект поступают новые вознаграждения для участников, система определяет общую сумму
|
||||
* всех долей в проекте и рассчитывает прирост вознаграждения на каждую долю. Каждый участник
|
||||
* имеет персональный слепок кумулятивного показателя, который используется для точного расчета
|
||||
* полагающихся ему средств.
|
||||
*
|
||||
* При обновлении данных вкладчика система вычисляет разницу между текущим кумулятивным показателем
|
||||
* и сохраненным значением, затем умножает эту разницу на количество долей вкладчика. Такой механизм
|
||||
* При обновлении данных участника система вычисляет разницу между текущим кумулятивным показателем
|
||||
* и сохраненным значением, затем умножает эту разницу на количество долей участника. Такой механизм
|
||||
* гарантирует справедливое распределение средств пропорционально вкладу каждого участника.
|
||||
*
|
||||
* Рассмотрим проект с тремя вкладчиками, имеющими 100, 200 и 300 долей соответственно. Общее количество
|
||||
* Рассмотрим проект с тремя участниками, имеющими 100, 200 и 300 долей соответственно. Общее количество
|
||||
* долей составляет 600. При поступлении вознаграждения в 6000 рублей система рассчитывает прирост
|
||||
* на долю: @f$\frac{6000}{600} = 10@f$ рублей на долю. Этот прирост добавляется к кумулятивному показателю.
|
||||
*
|
||||
* Вкладчик с 100 долями получит 1000 рублей, с 200 долями - 2000 рублей, а с 300 долями - 3000 рублей.
|
||||
* Участник с 100 долями получит 1000 рублей, с 200 долями - 2000 рублей, а с 300 долями - 3000 рублей.
|
||||
* Система автоматически корректируется при изменении баланса долей, обеспечивая точность расчетов
|
||||
* даже при динамическом изменении состава участников.
|
||||
*
|
||||
@@ -161,7 +161,7 @@
|
||||
* в любой момент времени.
|
||||
*
|
||||
* CRPS демонстрирует высокую гибкость в применении к различным сценариям распределения.
|
||||
* Он одинаково эффективно работает как для премий авторов и вкладчиков, так и для
|
||||
* Он одинаково эффективно работает как для премий авторов и участников, так и для
|
||||
* членских взносов и координаторских вознаграждений. Алгоритм может быть адаптирован
|
||||
* под любые требования кооперативной экономики.
|
||||
*
|
||||
@@ -194,7 +194,7 @@
|
||||
* решением для систем, требующих масштабируемости и точности расчетов.
|
||||
*
|
||||
* Независимо от типа вознаграждения - будь то авторские премии, вознаграждения
|
||||
* вкладчиков, членские взносы или координаторские премии - CRPS обеспечивает
|
||||
* участников, членские взносы или координаторские премии - CRPS обеспечивает
|
||||
* одинаково высокий уровень справедливости и эффективности распределения.
|
||||
* Это делает его незаменимым компонентом современной кооперативной экономики.
|
||||
*/
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
@defgroup capital_meta_projects Мета-проекты
|
||||
@ingroup public_capital
|
||||
|
||||
Мета-проект - это проект-аккумулятор, который позволяет объединить вкладчиков
|
||||
Мета-проект - это проект-аккумулятор, который позволяет объединить участников
|
||||
из нескольких завершенных проектов-компонентов под единым интеллектуальным результатом
|
||||
для получения членских взносов от его использования.
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
Без мета-проектов возникает проблема:
|
||||
- В магазине приложений пришлось бы публиковать каждый проект-компонент отдельно
|
||||
- У каждого компонента были бы свои вкладчики
|
||||
- У каждого компонента были бы свои участники
|
||||
- При выпуске новой версии команды разработчиков остаются изолированными
|
||||
- Отсутствует преемственность между версиями и компонентами
|
||||
|
||||
@@ -21,8 +21,8 @@
|
||||
|
||||
Мета-проект решает эту проблему:
|
||||
- В магазине публикуется <b>один</b> интеллектуальный результат (мета-проект)
|
||||
- Все вкладчики из завершенных компонентов объединяются в едином кошельке
|
||||
- Новые вкладчики присоединяются к существующим, а не заменяют их
|
||||
- Все участники из завершенных компонентов объединяются в едином кошельке
|
||||
- Новые участники присоединяются к существующим, а не заменяют их
|
||||
- Сохраняется преемственность между версиями и релизами
|
||||
|
||||
## Основные принципы
|
||||
@@ -30,22 +30,22 @@
|
||||
### Мета-проект как аккумулятор
|
||||
|
||||
Мета-проект функционирует как <b>проект-аккумулятор</b>:
|
||||
- Накапливает вкладчиков из завершенных проектов-компонентов
|
||||
- Накапливает участников из завершенных проектов-компонентов
|
||||
- Обеспечивает им получение членских взносов от использования результата
|
||||
- Позволяет новым вкладчикам присоединиться через новые компоненты
|
||||
- Создает единое сообщество вкладчиков вокруг интеллектуального результата
|
||||
- Позволяет новым участникам присоединиться через новые компоненты
|
||||
- Создает единое сообщество участников вокруг интеллектуального результата
|
||||
|
||||
### Принцип накопления вкладчиков
|
||||
### Принцип накопления участников
|
||||
|
||||
Мета-проект не просто объединяет проекты, а <b>накапливает вкладчиков</b>:
|
||||
Мета-проект не просто объединяет проекты, а <b>накапливает участников</b>:
|
||||
|
||||
1. <b>Первоначальные вкладчики</b>: При завершении первого компонента вкладчики,
|
||||
1. <b>Первоначальные участники</b>: При завершении первого компонента участники,
|
||||
выбравшие "сохранение в проекте", переходят в мета-проект
|
||||
|
||||
2. <b>Новые вкладчики</b>: При создании новых проектов-компонентов привлекаются
|
||||
новые вкладчики, которые после завершения тоже присоединяются к мета-проекту
|
||||
2. <b>Новые участники</b>: При создании новых проектов-компонентов привлекаются
|
||||
новые участники, которые после завершения тоже присоединяются к мета-проекту
|
||||
|
||||
3. <b>Объединение</b>: Все вкладчики оказываются в одном кошельке мета-проекта
|
||||
3. <b>Объединение</b>: Все участники оказываются в одном кошельке мета-проекта
|
||||
и получают членские взносы от использования общего результата
|
||||
|
||||
4. <b>Непрерывность</b>: Процесс может продолжаться неограниченно долго
|
||||
@@ -71,7 +71,7 @@ createproj({
|
||||
Когда проект-компонент завершается и происходит конвертация сегментов:
|
||||
- Средства участников, выбравших "сохранение в проекте",
|
||||
автоматически <b>переводятся в кошелек мета-проекта</b>
|
||||
- Это обеспечивает централизованный сбор долей и распределение выгоды среди всех вкладчиков всех компонентов
|
||||
- Это обеспечивает централизованный сбор долей и распределение выгоды среди всех участников всех компонентов
|
||||
|
||||
### Размывание долей
|
||||
|
||||
@@ -85,45 +85,45 @@ createproj({
|
||||
### Проблема без мета-проекта
|
||||
|
||||
Без использования мета-проекта в магазине приложений пришлось бы публиковать:
|
||||
- "Маркетплейс v1.0" (вкладчики: Алекс, Мария, Иван)
|
||||
- "Маркетплейс v1.1" (вкладчики: Ольга, Петр)
|
||||
- "Маркетплейс v2.0" (вкладчики: Николай, Светлана)
|
||||
- "Мобильное приложение" (вкладчики: Анна, Дмитрий)
|
||||
- "Маркетплейс v1.0" (участники: Алекс, Мария, Иван)
|
||||
- "Маркетплейс v1.1" (участники: Ольга, Петр)
|
||||
- "Маркетплейс v2.0" (участники: Николай, Светлана)
|
||||
- "Мобильное приложение" (участники: Анна, Дмитрий)
|
||||
|
||||
Каждый компонент маркетплейса - отдельное приложение с отдельными вкладчиками.
|
||||
Каждый компонент маркетплейса - отдельное приложение с отдельными участниками.
|
||||
|
||||
### Решение через мета-проект
|
||||
|
||||
С мета-проектом в магазине публикуется:
|
||||
- <b>"Маркетплейс"</b> (вкладчики: Алекс, Мария, Иван, Ольга, Петр, Николай, Светлана, Анна, Дмитрий)
|
||||
- <b>"Маркетплейс"</b> (участники: Алекс, Мария, Иван, Ольга, Петр, Николай, Светлана, Анна, Дмитрий)
|
||||
|
||||
Все вкладчики объединены в одном кошельке и получают членские взносы от одного приложения.
|
||||
Все участники объединены в одном кошельке и получают членские взносы от одного приложения.
|
||||
|
||||
### Поэтапное накопление вкладчиков
|
||||
### Поэтапное накопление участников
|
||||
|
||||
1. <b>Первый компонент</b>: Создается "Маркетплейс v1.0" с вкладчиками Алекс, Мария, Иван
|
||||
1. <b>Первый компонент</b>: Создается "Маркетплейс v1.0" с участниками Алекс, Мария, Иван
|
||||
|
||||
2. <b>Формирование мета-проекта</b>: При создании "Маркетплейс v1.1" указывается
|
||||
родитель - "v1.0" становится мета-проектом
|
||||
|
||||
3. <b>Первое накопление</b>: После завершения "v1.1" вкладчики Ольга и Петр
|
||||
присоединяются к вкладчикам Алекс, Мария, Иван в кошельке мета-проекта
|
||||
3. <b>Первое накопление</b>: После завершения "v1.1" участники Ольга и Петр
|
||||
присоединяются к участникам Алекс, Мария, Иван в кошельке мета-проекта
|
||||
|
||||
4. <b>Продолжение накопления</b>: При завершении "v2.0" и "Мобильного приложения"
|
||||
все новые вкладчики тоже присоединяются к общему кошельку
|
||||
все новые участники тоже присоединяются к общему кошельку
|
||||
|
||||
5. <b>Общие членские взносы</b>: Все девять вкладчиков получают долю от
|
||||
5. <b>Общие членские взносы</b>: Все девять участников получают долю от
|
||||
членских взносов за использование маркетплейса
|
||||
|
||||
### Преимущества мета-проекта
|
||||
|
||||
- <b>Преемственность команд</b>: Вкладчики ранних версий остаются частью команды
|
||||
- <b>Преемственность команд</b>: Участники ранних версий остаются частью команды
|
||||
и при выпуске новых версий
|
||||
|
||||
- <b>Накопление экспертизы</b>: Опыт разработки предыдущих версий помогает
|
||||
в создании новых компонентов
|
||||
|
||||
- <b>Совместные членские взносы</b>: Все вкладчики получают долю от общих доходов
|
||||
- <b>Совместные членские взносы</b>: Все участники получают долю от общих доходов
|
||||
от использования всех созданных версий
|
||||
|
||||
- <b>Мотивация к качеству</b>: Компоненты должны быть качественными,
|
||||
|
||||
@@ -4,7 +4,7 @@ namespace Capital::Core {
|
||||
|
||||
|
||||
/**
|
||||
* @brief Обновляет CRPS поля в проекте для вкладчиков при добавлении наград
|
||||
* @brief Обновляет CRPS поля в проекте для участников при добавлении наград
|
||||
*/
|
||||
void increment_contributors_crps_in_project(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &reward_amount) {
|
||||
Capital::project_index projects(_capital, coopname.value);
|
||||
@@ -30,10 +30,10 @@ namespace Capital::Core {
|
||||
|
||||
|
||||
/**
|
||||
* @brief Создает или обновляет запись вкладчика в таблице segments.
|
||||
* @brief Создает или обновляет запись участника в таблице segments.
|
||||
* @param coopname Имя кооператива (scope таблицы).
|
||||
* @param project_hash Хэш проекта.
|
||||
* @param username Имя пользователя вкладчика.
|
||||
* @param username Имя пользователя участника.
|
||||
*/
|
||||
void upsert_contributor_segment(eosio::name coopname, const checksum256 &project_hash,
|
||||
eosio::name username) {
|
||||
@@ -53,9 +53,9 @@ void upsert_contributor_segment(eosio::name coopname, const checksum256 &project
|
||||
g.coopname = coopname;
|
||||
g.project_hash = project_hash;
|
||||
g.username = username;
|
||||
g.is_contributor = true; // Устанавливаем флаг вкладчика
|
||||
g.is_contributor = true; // Устанавливаем флаг участника
|
||||
g.capital_contributor_shares = user_shares; // Доли равны балансу в программе капитализации
|
||||
// Инициализируем CRPS поля для вкладчика текущими значениями
|
||||
// Инициализируем CRPS поля для участника текущими значениями
|
||||
g.last_contributor_reward_per_share = project.crps.contributor_cumulative_reward_per_share;
|
||||
});
|
||||
|
||||
@@ -69,7 +69,7 @@ void upsert_contributor_segment(eosio::name coopname, const checksum256 &project
|
||||
|
||||
segments.modify(segment, _capital, [&](auto &g) {
|
||||
if (!g.is_contributor) {
|
||||
// Становится новым вкладчиком
|
||||
// Становится новым участником
|
||||
g.is_contributor = true;
|
||||
g.capital_contributor_shares = user_shares;
|
||||
g.last_contributor_reward_per_share = project.crps.contributor_cumulative_reward_per_share;
|
||||
@@ -90,16 +90,16 @@ void upsert_contributor_segment(eosio::name coopname, const checksum256 &project
|
||||
});
|
||||
|
||||
if (became_contributor) {
|
||||
// Увеличиваем счетчик зарегистрированных вкладчиков
|
||||
// Увеличиваем счетчик зарегистрированных участников
|
||||
Capital::Projects::increment_total_contributors(coopname, project_hash);
|
||||
// Увеличиваем счетчик долей для нового вкладчика
|
||||
// Увеличиваем счетчик долей для нового участника
|
||||
Capital::Projects::increment_total_contributor_shares(coopname, project_hash, user_shares);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Обновляет награды вкладчика в сегменте
|
||||
* @brief Обновляет награды участника в сегменте
|
||||
*/
|
||||
void refresh_contributor_segment(eosio::name coopname, const checksum256 &project_hash, eosio::name username) {
|
||||
Segments::segments_index segments(_capital, coopname.value);
|
||||
@@ -113,7 +113,7 @@ void upsert_contributor_segment(eosio::name coopname, const checksum256 &project
|
||||
auto project = Capital::Projects::get_project_or_fail(coopname, project_hash);
|
||||
|
||||
segments.modify(segment_it, _capital, [&](auto &s) {
|
||||
// Обновляем награды вкладчика через CRPS алгоритм
|
||||
// Обновляем награды участника через CRPS алгоритм
|
||||
if (s.capital_contributor_shares.amount > 0) {
|
||||
// Разность наград на долю
|
||||
double reward_per_share_delta = project.crps.contributor_cumulative_reward_per_share - s.last_contributor_reward_per_share;
|
||||
|
||||
@@ -15,7 +15,7 @@ namespace Capital::Core {
|
||||
const eosio::asset &base_reward, const eosio::asset &bonus_reward);
|
||||
|
||||
/**
|
||||
* @brief Обновляет CRPS поля в проекте для вкладчиков при добавлении наград
|
||||
* @brief Обновляет CRPS поля в проекте для участников при добавлении наград
|
||||
*/
|
||||
void increment_contributors_crps_in_project(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &reward_amount);
|
||||
|
||||
@@ -40,7 +40,7 @@ namespace Capital::Core {
|
||||
void refresh_coordinator_segment(eosio::name coopname, const checksum256 &project_hash, eosio::name username);
|
||||
|
||||
/**
|
||||
* @brief Обновляет награды вкладчика в сегменте
|
||||
* @brief Обновляет награды участника в сегменте
|
||||
*/
|
||||
void refresh_contributor_segment(eosio::name coopname, const checksum256 &project_hash, eosio::name username);
|
||||
|
||||
@@ -80,7 +80,7 @@ namespace Capital::Core {
|
||||
eosio::name username, const eosio::asset &property_amount);
|
||||
|
||||
/**
|
||||
* @brief Создает или обновляет запись вкладчика в таблице segments.
|
||||
* @brief Создает или обновляет запись участника в таблице segments.
|
||||
*/
|
||||
void upsert_contributor_segment(eosio::name coopname, const checksum256 &project_hash,
|
||||
eosio::name username);
|
||||
|
||||
@@ -9,7 +9,7 @@ namespace Capital::Core::Generation {
|
||||
|
||||
|
||||
/**
|
||||
* @brief Функция расчета премий вкладчиков (для фактических показателей)
|
||||
* @brief Функция расчета премий участников (для фактических показателей)
|
||||
*/
|
||||
eosio::asset calculate_contributors_bonus_pool(eosio::asset total_generation_pool) {
|
||||
return eosio::asset(int64_t(static_cast<double>(
|
||||
@@ -153,10 +153,10 @@ namespace Capital::Core::Generation {
|
||||
|
||||
plan.total_generation_pool = plan.creators_base_pool + plan.authors_base_pool + plan.coordinators_base_pool + plan.creators_bonus_pool + plan.authors_bonus_pool;
|
||||
|
||||
// расчет премий вкладчиков
|
||||
// расчет премий участников
|
||||
plan.contributors_bonus_pool = calculate_contributors_bonus_pool(plan.total_generation_pool);
|
||||
|
||||
// Общая планируемая сумма генерации с вкладчиками
|
||||
// Общая планируемая сумма генерации с участниками
|
||||
plan.total = plan.total_generation_pool + plan.contributors_bonus_pool + plan.target_expense_pool;
|
||||
|
||||
return plan;
|
||||
@@ -190,12 +190,12 @@ namespace Capital::Core::Generation {
|
||||
// расчет общей суммы генерации коммита (без координаторов, они учитываются отдельно)
|
||||
fact.total_generation_pool = fact.creators_base_pool + fact.authors_base_pool + fact.creators_bonus_pool + fact.authors_bonus_pool;
|
||||
|
||||
// Расчет премий вкладчиков от общей суммы генерации коммита
|
||||
// Расчет премий участников от общей суммы генерации коммита
|
||||
fact.contributors_bonus_pool = eosio::asset(int64_t(static_cast<double>(
|
||||
fact.total_generation_pool.amount
|
||||
) * CONTRIBUTORS_BONUS_COEFFICIENT), _root_govern_symbol);
|
||||
|
||||
// Расчет общей суммы вкладов всех пайщиков (генерация + премии вкладчиков)
|
||||
// Расчет общей суммы вкладов всех пайщиков (генерация + премии участников)
|
||||
fact.total_contribution = fact.total_generation_pool + fact.contributors_bonus_pool;
|
||||
|
||||
return fact;
|
||||
@@ -280,10 +280,10 @@ namespace Capital::Core::Generation {
|
||||
p.fact.return_base_percent = calculate_return_base_percent(p.fact.creators_base_pool, p.fact.authors_base_pool, p.fact.coordinators_base_pool, p.fact.invest_pool);
|
||||
p.fact.use_invest_percent = calculate_use_invest_percent(p.fact.creators_base_pool, p.fact.authors_base_pool, p.fact.coordinators_base_pool, p.fact.accumulated_expense_pool, p.fact.used_expense_pool, p.fact.total_received_investments);
|
||||
|
||||
// Пересчитываем премии вкладчиков, т.к. премии координаторов влияют на премии вкладчиков
|
||||
// Пересчитываем премии участников, т.к. премии координаторов влияют на премии участников
|
||||
p.fact.contributors_bonus_pool = calculate_contributors_bonus_pool(p.fact.total_generation_pool);
|
||||
|
||||
// Пересчитываем общую сумму вкладов всех пайщиков (генерация + премии вкладчиков)
|
||||
// Пересчитываем общую сумму вкладов всех пайщиков (генерация + премии участников)
|
||||
p.fact.total_contribution = p.fact.total_generation_pool + p.fact.contributors_bonus_pool;
|
||||
|
||||
// Пересчитываем общую сумму с расходами
|
||||
|
||||
@@ -21,12 +21,12 @@ namespace Capital::Core::Generation {
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief Функция расчета премий вкладчиков (для фактических показателей)
|
||||
* @brief Функция расчета премий участников (для фактических показателей)
|
||||
*/
|
||||
eosio::asset calculate_contributors_bonus_pool(const fact_pool& fact);
|
||||
|
||||
/**
|
||||
* @brief Функция расчета премий вкладчиков (для плановых показателей)
|
||||
* @brief Функция расчета премий участников (для плановых показателей)
|
||||
*/
|
||||
eosio::asset calculate_contributors_bonus_pool(const plan_pool& plan);
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@ namespace Capital::Core::Voting {
|
||||
result.authors_equal_per_author = eosio::asset(0, authors_bonus_pool.symbol);
|
||||
}
|
||||
|
||||
// Создательские премии
|
||||
// Исполнительские премии
|
||||
result.creators_direct_spread = eosio::asset(
|
||||
int64_t(static_cast<double>(creators_bonus_pool.amount) * creators_direct_percent),
|
||||
creators_bonus_pool.symbol
|
||||
|
||||
@@ -30,7 +30,7 @@ namespace Capital {
|
||||
eosio::asset debt_amount = asset(0, _root_govern_symbol); ///< Сумма долга
|
||||
|
||||
eosio::asset contributed_as_investor = asset(0, _root_govern_symbol); ///< Сумма, вложенная в проект как инвестор
|
||||
eosio::asset contributed_as_creator = asset(0, _root_govern_symbol); ///< Сумма, вложенная в проект как создатель
|
||||
eosio::asset contributed_as_creator = asset(0, _root_govern_symbol); ///< Сумма, вложенная в проект как исполнитель
|
||||
eosio::asset contributed_as_author = asset(0, _root_govern_symbol); ///< Сумма, вложенная в проект как автор
|
||||
eosio::asset contributed_as_coordinator = asset(0, _root_govern_symbol); ///< Сумма, вложенная в проект как координатор
|
||||
eosio::asset contributed_as_contributor = asset(0, _root_govern_symbol); ///< Сумма, вложенная в проект как контрибьютор
|
||||
@@ -184,7 +184,7 @@ inline bool is_contributor_has_appendix_in_project(eosio::name coopname, const c
|
||||
*/
|
||||
inline std::optional<contributor> get_active_contributor_or_fail(eosio::name coopname, eosio::name username) {
|
||||
auto contributor = get_contributor(coopname, username);
|
||||
eosio::check(contributor.has_value(), "Создатель не подписывал договор УХД");
|
||||
eosio::check(contributor.has_value(), "Исполнитель не подписывал договор УХД");
|
||||
eosio::check(contributor -> status == Status::ACTIVE, "Договор УХД с пайщиком не активен");
|
||||
return contributor;
|
||||
}
|
||||
@@ -269,14 +269,14 @@ inline void increase_debt_amount(eosio::name coopname, eosio::name username, eos
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Обновляет параметры вкладчика (часы в день и информацию о себе)
|
||||
* @brief Обновляет параметры участника (часы в день и информацию о себе)
|
||||
*/
|
||||
inline void edit_contributor(eosio::name coopname, eosio::name username, eosio::asset rate_per_hour, uint64_t hours_per_day) {
|
||||
contributor_index contributors(_capital, coopname.value);
|
||||
auto username_index = contributors.get_index<"byusername"_n>();
|
||||
auto contributor_itr = username_index.find(username.value);
|
||||
|
||||
eosio::check(contributor_itr != username_index.end(), "Вкладчик не найден");
|
||||
eosio::check(contributor_itr != username_index.end(), "Участник не найден");
|
||||
|
||||
username_index.modify(contributor_itr, coopname, [&](auto &c) {
|
||||
c.rate_per_hour = rate_per_hour;
|
||||
|
||||
@@ -12,7 +12,7 @@ struct counts_data {
|
||||
uint64_t total_creators = 0; ///< Общее количество создателей в проекте
|
||||
uint64_t total_investors = 0; ///< Общее количество инвесторов в проекте
|
||||
uint64_t total_propertors = 0; ///< Общее количество проперторов в проекте
|
||||
uint64_t total_contributors = 0; ///< Общее количество зарегистрированных вкладчиков в проекте
|
||||
uint64_t total_contributors = 0; ///< Общее количество зарегистрированных участников в проекте
|
||||
uint64_t total_commits = 0; ///< Общее количество коммитов в проекте
|
||||
};
|
||||
|
||||
@@ -16,8 +16,8 @@ namespace Capital {
|
||||
* Все CRPS поля используют double для высокой точности без проблем с overflow
|
||||
*/
|
||||
struct crps_data {
|
||||
// Общее количество долей вкладчиков (изменяется только при регистрации/обновлении долей участников)
|
||||
eosio::asset total_capital_contributors_shares = asset(0, _root_govern_symbol); ///< Сумма всех capital_contributor_shares зарегистрированных вкладчиков
|
||||
// Общее количество долей участников (изменяется только при регистрации/обновлении долей участников)
|
||||
eosio::asset total_capital_contributors_shares = asset(0, _root_govern_symbol); ///< Сумма всех capital_contributor_shares зарегистрированных участников
|
||||
|
||||
// Накопительные награды на долю (double для точности)
|
||||
double author_base_cumulative_reward_per_share = 0.0; ///< Накопительная базовая награда на авторскую долю
|
||||
|
||||
@@ -104,7 +104,7 @@ namespace Capital::Expenses {
|
||||
* @param coopname Имя кооператива.
|
||||
* @param project_hash Хэш проекта.
|
||||
* @param expense_hash Хэш расхода.
|
||||
* @param username Создатель расхода.
|
||||
* @param username Исполнитель расхода.
|
||||
* @param amount Сумма расхода.
|
||||
* @param description Описание.
|
||||
* @param statement Служебная записка.
|
||||
|
||||
@@ -28,7 +28,7 @@ struct fact_pool {
|
||||
// Пулы премий
|
||||
eosio::asset creators_bonus_pool = asset(0, _root_govern_symbol); ///< Фактические премии создателей
|
||||
eosio::asset authors_bonus_pool = asset(0, _root_govern_symbol); ///< Фактические премии авторов
|
||||
eosio::asset contributors_bonus_pool = asset(0, _root_govern_symbol); ///< Фактические премии вкладчиков
|
||||
eosio::asset contributors_bonus_pool = asset(0, _root_govern_symbol); ///< Фактические премии участников
|
||||
|
||||
// Поля для управления расходами (только в фактических показателях)
|
||||
eosio::asset target_expense_pool = asset(0, _root_govern_symbol); ///< Целевой размер расходов (копируется из плана)
|
||||
@@ -42,14 +42,14 @@ struct fact_pool {
|
||||
eosio::asset total_received_investments = asset(0, _root_govern_symbol); ///< Общая сумма всех полученных инвестиций (до распределения)
|
||||
eosio::asset total_returned_investments = asset(0, _root_govern_symbol); ///< Общая сумма возвращенных неиспользованных инвестиций
|
||||
|
||||
// Общая сумма генерации (без вкладчиков)
|
||||
// Общая сумма генерации (без участников)
|
||||
eosio::asset total_generation_pool = asset(0, _root_govern_symbol); ///< Общая фактическая сумма генерации
|
||||
|
||||
// Общая сумма вкладов всех пайщиков (генерация + премии вкладчиков)
|
||||
// Общая сумма вкладов всех пайщиков (генерация + премии участников)
|
||||
eosio::asset total_contribution = asset(0, _root_govern_symbol); ///< Общая сумма вкладов всех пайщиков
|
||||
|
||||
// Общая сумма генерации (с вкладчиками)
|
||||
eosio::asset total = asset(0, _root_govern_symbol); ///< Общая фактическая сумма генерации с вкладчиками
|
||||
// Общая сумма генерации (с участниками)
|
||||
eosio::asset total = asset(0, _root_govern_symbol); ///< Общая фактическая сумма генерации с участниками
|
||||
};
|
||||
|
||||
} // namespace Capital
|
||||
@@ -29,8 +29,8 @@ struct generation_amounts {
|
||||
// Общая сумма генерации коммита
|
||||
eosio::asset total_generation_pool = asset(0, _root_govern_symbol); ///< Общая сумма генерации коммита
|
||||
|
||||
// Премии вкладчиков рассчитываются от total_generation_pool
|
||||
eosio::asset contributors_bonus_pool = asset(0, _root_govern_symbol); ///< Премии вкладчиков за коммит
|
||||
// Премии участников рассчитываются от total_generation_pool
|
||||
eosio::asset contributors_bonus_pool = asset(0, _root_govern_symbol); ///< Премии участников за коммит
|
||||
|
||||
// Общая сумма вкладов всех пайщиков
|
||||
eosio::asset total_contribution = asset(0, _root_govern_symbol); ///< Общая сумма вкладов всех пайщиков
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
namespace Capital::Memo {
|
||||
inline std::string get_import_contributor_memo(checksum256 contributor_hash, eosio::asset contribution_amount) {
|
||||
return "Импорт вкладчика с договором УХД: " + checksum256_to_hex(contributor_hash) + " с паевым взносом по программе 'Капитализация': " + contribution_amount.to_string();
|
||||
return "Импорт участника с договором УХД: " + checksum256_to_hex(contributor_hash) + " с паевым взносом по программе 'Капитализация': " + contribution_amount.to_string();
|
||||
}
|
||||
|
||||
inline std::string get_debt_memo(eosio::name username) {
|
||||
|
||||
@@ -27,7 +27,7 @@ struct plan_pool {
|
||||
// Пулы премий
|
||||
eosio::asset creators_bonus_pool = asset(0, _root_govern_symbol); ///< Планируемые премии создателей
|
||||
eosio::asset authors_bonus_pool = asset(0, _root_govern_symbol); ///< Планируемые премии авторов
|
||||
eosio::asset contributors_bonus_pool = asset(0, _root_govern_symbol); ///< Планируемые премии вкладчиков
|
||||
eosio::asset contributors_bonus_pool = asset(0, _root_govern_symbol); ///< Планируемые премии участников
|
||||
|
||||
// Пул расходов (только планируемый размер)
|
||||
eosio::asset target_expense_pool = asset(0, _root_govern_symbol); ///< Планируемый размер расходов
|
||||
@@ -38,11 +38,11 @@ struct plan_pool {
|
||||
eosio::asset program_invest_pool = asset(0, _root_govern_symbol); ///< Планируемые программные инвестиции
|
||||
eosio::asset total_received_investments = asset(0, _root_govern_symbol); ///< Планируемая общая сумма инвестиций (до распределения)
|
||||
|
||||
// Общая сумма генерации (без вкладчиков)
|
||||
// Общая сумма генерации (без участников)
|
||||
eosio::asset total_generation_pool = asset(0, _root_govern_symbol); ///< Общая планируемая сумма генерации
|
||||
|
||||
// Общая сумма генерации (с вкладчиками)
|
||||
eosio::asset total = asset(0, _root_govern_symbol); ///< Общая планируемая сумма генерации с вкладчиками
|
||||
// Общая сумма генерации (с участниками)
|
||||
eosio::asset total = asset(0, _root_govern_symbol); ///< Общая планируемая сумма генерации с участниками
|
||||
};
|
||||
|
||||
} // namespace Capital
|
||||
@@ -505,7 +505,7 @@ namespace Capital::Projects {
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Увеличивает количество зарегистрированных вкладчиков в проекте на 1
|
||||
* @brief Увеличивает количество зарегистрированных участников в проекте на 1
|
||||
*/
|
||||
inline void increment_total_contributors(eosio::name coopname, const checksum256 &project_hash) {
|
||||
project_index projects(_capital, coopname.value);
|
||||
|
||||
@@ -45,7 +45,7 @@ namespace Capital::Segments {
|
||||
bool is_coordinator = false; ///< Является ли участник координатором
|
||||
bool is_investor = false; ///< Является ли участник инвестором
|
||||
bool is_propertor = false; ///< Является ли участник пропертором
|
||||
bool is_contributor = false; ///< Является ли участник вкладчиком
|
||||
bool is_contributor = false; ///< Является ли участник участником
|
||||
bool has_vote = false; ///< Имеет ли участник право голоса
|
||||
|
||||
/// Вклады
|
||||
@@ -54,8 +54,8 @@ namespace Capital::Segments {
|
||||
eosio::asset investor_base = asset(0, _root_govern_symbol); ///< Фактически используемая сумма инвестора при коэффициенте возврата > 1
|
||||
|
||||
// Основная информация о вкладе создателя
|
||||
eosio::asset creator_base = asset(0, _root_govern_symbol); ///< Сумма себестоимости, которую создатель фактически потратил на выполнение проекта
|
||||
eosio::asset creator_bonus = asset(0, _root_govern_symbol); ///< Сумма бонусов, которую создатель получил за выполнение проекта
|
||||
eosio::asset creator_base = asset(0, _root_govern_symbol); ///< Сумма себестоимости, которую исполнитель фактически потратил на выполнение проекта
|
||||
eosio::asset creator_bonus = asset(0, _root_govern_symbol); ///< Сумма бонусов, которую исполнитель получил за выполнение проекта
|
||||
|
||||
// Основная информация о вкладе автора
|
||||
eosio::asset author_base = asset(0, _root_govern_symbol); ///< Сумма себестоимости, которую автор фактически потратил на выполнение проекта
|
||||
@@ -65,8 +65,8 @@ namespace Capital::Segments {
|
||||
eosio::asset coordinator_investments = asset(0, _root_govern_symbol); ///< Сумма инвестиций, которую координатор привлек в проект
|
||||
eosio::asset coordinator_base = asset(0, _root_govern_symbol); ///< Сумма себестоимости, которую координатор фактически потратил на выполнение проекта
|
||||
|
||||
// Основная информация о вкладе вкладчика
|
||||
eosio::asset contributor_bonus = asset(0, _root_govern_symbol); ///< Сумма бонусов, которую вкладчик получил от проекта
|
||||
// Основная информация о вкладе участника
|
||||
eosio::asset contributor_bonus = asset(0, _root_govern_symbol); ///< Сумма бонусов, которую участник получил от проекта
|
||||
|
||||
// Имущественные взносы
|
||||
eosio::asset property_base = asset(0, _root_govern_symbol); ///< Стоимость внесенного имущества участника
|
||||
@@ -74,10 +74,10 @@ namespace Capital::Segments {
|
||||
// CRPS поля для масштабируемого распределения наград
|
||||
double last_author_base_reward_per_share = 0.0; ///< Последняя зафиксированная базовая награда на долю для авторов
|
||||
double last_author_bonus_reward_per_share = 0.0; ///< Последняя зафиксированная бонусная награда на долю для авторов
|
||||
double last_contributor_reward_per_share = 0.0; ///< Последняя зафиксированная награда на долю для вкладчиков
|
||||
double last_contributor_reward_per_share = 0.0; ///< Последняя зафиксированная награда на долю для участников
|
||||
|
||||
// Доли в программе и проекте
|
||||
eosio::asset capital_contributor_shares = asset(0, _root_govern_symbol); ///< Количество долей вкладчика в программе капитализации
|
||||
eosio::asset capital_contributor_shares = asset(0, _root_govern_symbol); ///< Количество долей участника в программе капитализации
|
||||
|
||||
// Последняя известная сумма инвестиций в проекте для расчета provisional_amount
|
||||
eosio::asset last_known_invest_pool = asset(0, _root_govern_symbol); ///< Последняя известная сумма инвестиций в проекте
|
||||
@@ -342,7 +342,7 @@ inline eosio::asset calculate_segment_bonus_cost(const segment& seg, const Capit
|
||||
total += seg.author_bonus;
|
||||
}
|
||||
|
||||
// Премии вкладчиков
|
||||
// Премии участников
|
||||
total += seg.contributor_bonus;
|
||||
|
||||
return total;
|
||||
|
||||
@@ -20,9 +20,9 @@ namespace Capital {
|
||||
*/
|
||||
struct voting_amounts {
|
||||
eosio::asset authors_equal_spread = asset(0, _root_govern_symbol); ///< 62.8% авторских премий поровну
|
||||
eosio::asset creators_direct_spread = asset(0, _root_govern_symbol); ///< 62.8% создательских премий каждому
|
||||
eosio::asset creators_direct_spread = asset(0, _root_govern_symbol); ///< 62.8% исполнительских премий каждому
|
||||
eosio::asset authors_bonuses_on_voting = asset(0, _root_govern_symbol); ///< 38.2% авторских премий на голосование
|
||||
eosio::asset creators_bonuses_on_voting = asset(0, _root_govern_symbol); ///< 38.2% создательских премий на голосование
|
||||
eosio::asset creators_bonuses_on_voting = asset(0, _root_govern_symbol); ///< 38.2% исполнительских премий на голосование
|
||||
eosio::asset total_voting_pool = asset(0, _root_govern_symbol); ///< Общая сумма для распределения по Водянову (авторы + создатели)
|
||||
eosio::asset active_voting_amount = asset(0, _root_govern_symbol); ///< Общая голосующая сумма = total_voting_pool * (voters-1)/voters
|
||||
eosio::asset equal_voting_amount = asset(0, _root_govern_symbol); ///< Средняя сумма на каждого участника (total_voting_pool / voters)
|
||||
|
||||
@@ -113,7 +113,7 @@ contracts/cpp/
|
||||
|
||||
### Создание коммита
|
||||
```
|
||||
Создатель → createcmmt → Создание коммита → Master::create_approval() → Аппрув в таблице
|
||||
Исполнитель → createcmmt → Создание коммита → Master::create_approval() → Аппрув в таблице
|
||||
```
|
||||
|
||||
### Одобрение коммита
|
||||
|
||||
@@ -27,7 +27,7 @@ namespace Names {
|
||||
constexpr eosio::name SIGN_ACT1_PROGRAM_PROPERTY = "act1pgprp"_n;
|
||||
constexpr eosio::name SIGN_ACT2_PROGRAM_PROPERTY = "act2pgprp"_n;
|
||||
|
||||
// Коллбэки для регистрации вкладчиков
|
||||
// Коллбэки для регистрации участников
|
||||
constexpr eosio::name APPROVE_CONTRIBUTOR = "approvereg"_n;
|
||||
constexpr eosio::name DECLINE_CONTRIBUTOR = "declinereg"_n;
|
||||
|
||||
|
||||
@@ -0,0 +1,155 @@
|
||||
# Механизм отправки уведомлений
|
||||
|
||||
## Обзор архитектуры
|
||||
|
||||
Система уведомлений построена на базе **NOVU** - платформы для управления уведомлениями, интегрированной с контроллером через типизированные воркфлоу.
|
||||
|
||||
## Компоненты системы
|
||||
|
||||
### 1. Пакет @coopenomics/notifications (workflows/)
|
||||
Содержит определения всех воркфлоу уведомлений:
|
||||
|
||||
- **Структура воркфлоу**: Каждый воркфлоу экспортирует `id`, `payloadSchema` (Zod) и шаги (email, push, in_app)
|
||||
- **Неймспейсы**: `Workflows.ApprovalRequest`, `Workflows.NewTransfer` и т.д.
|
||||
- **Типизация**: Каждый воркфлоу имеет строго типизированный интерфейс payload
|
||||
- **Синхронизация**: Воркфлоу автоматически синхронизируются с NOVU API через sync сервис
|
||||
|
||||
### 2. NOVU инфраструктура в контроллере
|
||||
|
||||
#### Порты и интерфейсы (domain/notification/)
|
||||
- `NovuWorkflowPort` - основной порт для работы с воркфлоу
|
||||
- `WorkflowTriggerDomainInterface` - структура данных для запуска уведомления
|
||||
- Типизированные интерфейсы для получателей, акторов и результатов
|
||||
|
||||
#### Адаптеры (infrastructure/novu/)
|
||||
- `NovuWorkflowAdapter` - HTTP клиент для NOVU API
|
||||
- Отправляет триггеры через `/v1/events/trigger`
|
||||
- Поддерживает как одиночные, так и пакетные отправки
|
||||
|
||||
### 3. Сервисы уведомлений (application/)
|
||||
|
||||
#### NotificationSenderService
|
||||
Центральный сервис отправки уведомлений:
|
||||
- `sendNotificationToUser()` - отправка конкретному пользователю
|
||||
- `sendNotificationToUsers()` - множественная отправка
|
||||
- `sendNotificationToAll()` - broadcast всем пользователям
|
||||
- Использует subscriber_id из аккаунтов пользователей
|
||||
|
||||
## Способы запуска уведомлений
|
||||
|
||||
### 1. Подписка на дельты блокчейна
|
||||
```typescript
|
||||
@OnEvent(`delta::${SovietContract.contractName.production}::${SovietContract.Tables.Approvals.tableName}`)
|
||||
async handleApprovalDelta(delta: IDelta)
|
||||
```
|
||||
- Срабатывает при изменениях в таблицах блокчейна
|
||||
- Пример: `ApprovalNotificationService` следит за новыми запросами на одобрение
|
||||
|
||||
### 2. Подписка на действия блокчейна
|
||||
```typescript
|
||||
@OnEvent(`action::${SovietContract.contractName.production}::${SovietContract.Actions.Decisions.CreateAgenda.actionName}`)
|
||||
async handleCreateAgenda(actionData: ActionDomainInterface)
|
||||
```
|
||||
- Срабатывает при выполнении контрактов
|
||||
- Пример: `AgendaNotificationService` реагирует на добавление вопросов в повестку
|
||||
|
||||
### 3. Вызов из мутаций/API
|
||||
```typescript
|
||||
await this.notificationSenderService.sendNotificationToUser(
|
||||
username,
|
||||
Workflows.Welcome.id,
|
||||
{ userName: 'Иван' }
|
||||
);
|
||||
```
|
||||
- Прямой вызов из бизнес-логики
|
||||
- Пример: приветственные уведомления при регистрации
|
||||
|
||||
## Процесс отправки уведомления
|
||||
|
||||
### 1. Подготовка данных
|
||||
- Обогащение данными из блокчейна/базы (имена пользователей, кооперативы)
|
||||
- Формирование типизированного payload согласно схеме воркфлоу
|
||||
- Получение subscriber_id получателя
|
||||
|
||||
### 2. Создание триггера
|
||||
```typescript
|
||||
const triggerData: WorkflowTriggerDomainInterface = {
|
||||
name: Workflows.ApprovalRequest.id,
|
||||
to: {
|
||||
subscriberId: chairman.username,
|
||||
email: chairmanEmail,
|
||||
},
|
||||
payload: {
|
||||
chairmanName,
|
||||
requestTitle,
|
||||
authorName,
|
||||
// ... другие поля
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
### 3. Отправка через NOVU API
|
||||
- Адаптер отправляет HTTP POST на NOVU
|
||||
- Возвращает transactionId для отслеживания
|
||||
- NOVU обрабатывает шаги воркфлоу (email, push, in_app)
|
||||
|
||||
## Типичные паттерны использования
|
||||
|
||||
### Уведомление председателю
|
||||
```typescript
|
||||
// Получить председателя
|
||||
const chairmen = await this.accountPort.getAccounts({ role: 'chairman' });
|
||||
|
||||
// Сформировать payload
|
||||
const payload: Workflows.ApprovalRequest.IPayload = { /* ... */ };
|
||||
|
||||
// Отправить
|
||||
await this.novuWorkflowAdapter.triggerWorkflow({
|
||||
name: Workflows.ApprovalRequest.id,
|
||||
to: { subscriberId: chairman.username, email: chairmanEmail },
|
||||
payload
|
||||
});
|
||||
```
|
||||
|
||||
### Множественная отправка членам совета
|
||||
```typescript
|
||||
// Получить всех членов совета
|
||||
const members = await this.accountPort.getAccounts({ role: 'member' });
|
||||
|
||||
// Подготовить события для каждого
|
||||
const events = members.map(member => ({
|
||||
to: { subscriberId: member.username, email: member.email },
|
||||
payload: agendaPayload
|
||||
}));
|
||||
|
||||
// Пакетная отправка
|
||||
await this.novuWorkflowAdapter.triggerBulkWorkflow({
|
||||
name: 'noviy-vopros-na-povestke',
|
||||
events
|
||||
});
|
||||
```
|
||||
|
||||
### Реакция на перевод токенов
|
||||
```typescript
|
||||
@OnEvent(`action::${TokenContract.contractName.production}::${TokenContract.Actions.Transfer.actionName}`)
|
||||
async handleTransferNotification(action: IAction) {
|
||||
// Извлечь данные перевода
|
||||
const transferData = action.data as TokenContract.Actions.Transfer.ITransfer;
|
||||
|
||||
// Отправить через NotificationSenderService
|
||||
await this.notificationSenderService.sendNotificationToUser(
|
||||
transferData.to,
|
||||
Workflows.NewTransfer.id,
|
||||
{ quantity: transferData.quantity }
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
## Особенности реализации
|
||||
|
||||
- **Типизация**: Строгая типизация payload через Zod схемы
|
||||
- **Subscriber ID**: Используется username как subscriber_id в NOVU
|
||||
- **Обогащение данных**: Перед отправкой данные обогащаются именами, названиями кооперативов
|
||||
- **Обработка ошибок**: Логирование без прерывания основного потока
|
||||
- **Фильтрация**: Проверка принадлежности к кооперативу (coopname)
|
||||
- **Каналы**: Поддержка email, push, in_app уведомлений
|
||||
@@ -31,7 +31,7 @@ type Account {
|
||||
private_account: PrivateAccount
|
||||
|
||||
"""
|
||||
объект аккаунта в системе учёта провайдера, т.е. MONO. Здесь хранится приватная информация о пайщике кооператива, которая содержит его приватные данные. Эти данные не публикуются в блокчейне и не выходят за пределы базы данных провайдера. Они используются для заполнения шаблонов документов при нажатии соответствующих кнопок на платформе.
|
||||
объект аккаунта в системе учёта провайдера, т.е. MONO. Здесь хранится приватная информация о пайщике кооператива, которая содержит его приватные данные. Эти данные не публикуются в блокчейне и не выходят за пределы базы данных провайдера. Они используются для заполнения шаблонов документов при нажатии соответствующих кнопок на платформе.
|
||||
"""
|
||||
provider_account: MonoAccount
|
||||
|
||||
@@ -1602,7 +1602,7 @@ type CapitalCommitAmounts {
|
||||
"""Бонусный пул авторов"""
|
||||
authors_bonus_pool: String
|
||||
|
||||
"""Бонусный пул вкладчиков"""
|
||||
"""Бонусный пул участников"""
|
||||
contributors_bonus_pool: String
|
||||
|
||||
"""Базовый пул создателей"""
|
||||
@@ -1669,7 +1669,7 @@ type CapitalConfigObject {
|
||||
voting_period_in_days: Float!
|
||||
}
|
||||
|
||||
"""Вкладчик кооператива в системе CAPITAL"""
|
||||
"""Участник кооператива в системе CAPITAL"""
|
||||
type CapitalContributor {
|
||||
"""Дата создания записи"""
|
||||
_created_at: DateTime!
|
||||
@@ -1692,19 +1692,19 @@ type CapitalContributor {
|
||||
"""Статус из блокчейна"""
|
||||
blockchain_status: String!
|
||||
|
||||
"""Контракт вкладчика"""
|
||||
"""Контракт участника"""
|
||||
contract: DocumentAggregate
|
||||
|
||||
"""Вклад как автор"""
|
||||
contributed_as_author: String!
|
||||
|
||||
"""Вклад как вкладчик"""
|
||||
"""Вклад как участник"""
|
||||
contributed_as_contributor: String!
|
||||
|
||||
"""Вклад как координатор"""
|
||||
contributed_as_coordinator: String!
|
||||
|
||||
"""Вклад как создатель"""
|
||||
"""Вклад как исполнитель"""
|
||||
contributed_as_creator: String!
|
||||
|
||||
"""Вклад как инвестор"""
|
||||
@@ -1713,7 +1713,7 @@ type CapitalContributor {
|
||||
"""Вклад как собственник имущества"""
|
||||
contributed_as_propertor: String!
|
||||
|
||||
"""Хеш вкладчика"""
|
||||
"""Хеш участника"""
|
||||
contributor_hash: String!
|
||||
|
||||
"""Название кооператива"""
|
||||
@@ -1746,16 +1746,16 @@ type CapitalContributor {
|
||||
"""Ставка за час работы"""
|
||||
rate_per_hour: String!
|
||||
|
||||
"""Статус вкладчика"""
|
||||
"""Статус участника"""
|
||||
status: ContributorStatus!
|
||||
|
||||
"""Имя пользователя"""
|
||||
username: String!
|
||||
}
|
||||
|
||||
"""Параметры фильтрации для запросов вкладчиков CAPITAL"""
|
||||
"""Параметры фильтрации для запросов участников CAPITAL"""
|
||||
input CapitalContributorFilter {
|
||||
"""Фильтр по хешу вкладчика"""
|
||||
"""Фильтр по хешу участника"""
|
||||
contributor_hash: String
|
||||
|
||||
"""Фильтр по названию кооператива"""
|
||||
@@ -1768,11 +1768,11 @@ input CapitalContributorFilter {
|
||||
is_external_contract: Boolean
|
||||
|
||||
"""
|
||||
Фильтр по project_hash - показывает только вкладчиков, у которых в appendixes есть указанный project_hash
|
||||
Фильтр по project_hash - показывает только участников, у которых в appendixes есть указанный project_hash
|
||||
"""
|
||||
project_hash: String
|
||||
|
||||
"""Фильтр по статусу вкладчика"""
|
||||
"""Фильтр по статусу участника"""
|
||||
status: ContributorStatus
|
||||
|
||||
"""Фильтр по имени пользователя"""
|
||||
@@ -2389,7 +2389,7 @@ type CapitalProjectCountsData {
|
||||
"""Общее количество коммитов"""
|
||||
total_commits: Int!
|
||||
|
||||
"""Общее количество вкладчиков"""
|
||||
"""Общее количество участников"""
|
||||
total_contributors: Int!
|
||||
|
||||
"""Общее количество координаторов"""
|
||||
@@ -2416,10 +2416,10 @@ type CapitalProjectCrpsData {
|
||||
"""Накопительный коэффициент вознаграждения за бонусный вклад авторов"""
|
||||
author_bonus_cumulative_reward_per_share: Float!
|
||||
|
||||
"""Накопительный коэффициент вознаграждения вкладчиков"""
|
||||
"""Накопительный коэффициент вознаграждения участников"""
|
||||
contributor_cumulative_reward_per_share: Float!
|
||||
|
||||
"""Общее количество долей вкладчиков капитала"""
|
||||
"""Общее количество долей участников капитала"""
|
||||
total_capital_contributors_shares: String!
|
||||
}
|
||||
|
||||
@@ -2434,7 +2434,7 @@ type CapitalProjectFactPool {
|
||||
"""Бонусный пул авторов"""
|
||||
authors_bonus_pool: String!
|
||||
|
||||
"""Бонусный пул вкладчиков"""
|
||||
"""Бонусный пул участников"""
|
||||
contributors_bonus_pool: String!
|
||||
|
||||
"""Базовый пул координаторов"""
|
||||
@@ -2589,6 +2589,9 @@ type CapitalProjectPermissions {
|
||||
|
||||
"""Является ли пользователь гостем (неавторизованным)"""
|
||||
is_guest: Boolean!
|
||||
|
||||
"""Есть ли запрос на получение допуска в рассмотрении"""
|
||||
pending_clearance: Boolean!
|
||||
}
|
||||
|
||||
"""Плановые показатели проекта"""
|
||||
@@ -2599,7 +2602,7 @@ type CapitalProjectPlanPool {
|
||||
"""Бонусный пул авторов"""
|
||||
authors_bonus_pool: String!
|
||||
|
||||
"""Бонусный пул вкладчиков"""
|
||||
"""Бонусный пул участников"""
|
||||
contributors_bonus_pool: String!
|
||||
|
||||
"""Базовый пул координаторов"""
|
||||
@@ -2645,12 +2648,12 @@ type CapitalProjectPlanPool {
|
||||
use_invest_percent: Float!
|
||||
}
|
||||
|
||||
"""Статистика времени вкладчика по проекту"""
|
||||
"""Статистика времени участника по проекту"""
|
||||
type CapitalProjectTimeStats {
|
||||
"""Доступное время для коммита (по завершённым задачам)"""
|
||||
available_hours: Float!
|
||||
|
||||
"""Хеш вкладчика"""
|
||||
"""Хеш участника"""
|
||||
contributor_hash: String!
|
||||
|
||||
"""Время в ожидании (по незавершённым задачам)"""
|
||||
@@ -2794,10 +2797,10 @@ type CapitalSegment {
|
||||
"""Номер блока крайней синхронизации с блокчейном"""
|
||||
block_num: Float
|
||||
|
||||
"""Доли вкладчиков капитала"""
|
||||
"""Доли участников капитала"""
|
||||
capital_contributor_shares: String!
|
||||
|
||||
"""Бонусный вклад вкладчика"""
|
||||
"""Бонусный вклад участника"""
|
||||
contributor_bonus: String!
|
||||
|
||||
"""Название кооператива"""
|
||||
@@ -2845,7 +2848,7 @@ type CapitalSegment {
|
||||
"""Роль автора"""
|
||||
is_author: Boolean!
|
||||
|
||||
"""Роль вкладчика"""
|
||||
"""Роль участника"""
|
||||
is_contributor: Boolean!
|
||||
|
||||
"""Роль координатора"""
|
||||
@@ -2869,7 +2872,7 @@ type CapitalSegment {
|
||||
"""Последняя награда за бонусный вклад автора на долю в проекте"""
|
||||
last_author_bonus_reward_per_share: Float!
|
||||
|
||||
"""Последняя награда вкладчика на акцию"""
|
||||
"""Последняя награда участника на акцию"""
|
||||
last_contributor_reward_per_share: Float!
|
||||
|
||||
"""Последняя известная сумма инвестиций координаторов"""
|
||||
@@ -2926,7 +2929,7 @@ input CapitalSegmentFilter {
|
||||
"""Фильтр по роли автора"""
|
||||
is_author: Boolean
|
||||
|
||||
"""Фильтр по роли вкладчика"""
|
||||
"""Фильтр по роли участника"""
|
||||
is_contributor: Boolean
|
||||
|
||||
"""Фильтр по роли координатора"""
|
||||
@@ -3057,7 +3060,7 @@ input CapitalStoryFilter {
|
||||
}
|
||||
|
||||
"""
|
||||
Агрегированная статистика времени по задачам с информацией о задачах и вкладчиках
|
||||
Агрегированная статистика времени по задачам с информацией о задачах и участниках
|
||||
"""
|
||||
type CapitalTimeEntriesByIssues {
|
||||
"""Доступное время для коммита (по завершённым задачам)"""
|
||||
@@ -3066,10 +3069,10 @@ type CapitalTimeEntriesByIssues {
|
||||
"""Количество закоммиченных часов"""
|
||||
committed_hours: Float!
|
||||
|
||||
"""Хеш вкладчика"""
|
||||
"""Хеш участника"""
|
||||
contributor_hash: String!
|
||||
|
||||
"""Имя вкладчика"""
|
||||
"""Имя участника"""
|
||||
contributor_name: String!
|
||||
|
||||
"""Название кооператива"""
|
||||
@@ -3100,7 +3103,7 @@ type CapitalTimeEntriesByIssues {
|
||||
"""Параметры фильтрации для запросов записей времени CAPITAL"""
|
||||
input CapitalTimeEntriesFilter {
|
||||
"""
|
||||
Хеш вкладчика (опционально, если не указан - вернёт записи всех вкладчиков проекта)
|
||||
Хеш участника (опционально, если не указан - вернёт записи всех участников проекта)
|
||||
"""
|
||||
contributor_hash: String
|
||||
|
||||
@@ -3124,7 +3127,7 @@ input CapitalTimeEntriesFilter {
|
||||
username: String
|
||||
}
|
||||
|
||||
"""Запись времени вкладчика"""
|
||||
"""Запись времени участника"""
|
||||
type CapitalTimeEntry {
|
||||
"""Дата создания записи"""
|
||||
_created_at: String!
|
||||
@@ -3138,7 +3141,7 @@ type CapitalTimeEntry {
|
||||
"""Хеш коммита"""
|
||||
commit_hash: String
|
||||
|
||||
"""Хеш вкладчика"""
|
||||
"""Хеш участника"""
|
||||
contributor_hash: String!
|
||||
|
||||
"""Название кооператива"""
|
||||
@@ -3177,7 +3180,7 @@ type CapitalTimeStats {
|
||||
|
||||
"""Входные данные для гибкого запроса статистики времени"""
|
||||
input CapitalTimeStatsInput {
|
||||
"""Хеш вкладчика (опционально)"""
|
||||
"""Хеш участника (опционально)"""
|
||||
contributor_hash: String
|
||||
|
||||
"""Название кооператива (опционально)"""
|
||||
@@ -3411,7 +3414,7 @@ type ContactsDTO {
|
||||
phone: String!
|
||||
}
|
||||
|
||||
"""Статус вкладчика в системе CAPITAL"""
|
||||
"""Статус участника в системе CAPITAL"""
|
||||
enum ContributorStatus {
|
||||
ACTIVE
|
||||
APPROVED
|
||||
@@ -3742,7 +3745,7 @@ input CreateExpenseInput {
|
||||
"""Имя аккаунта кооператива"""
|
||||
coopname: String!
|
||||
|
||||
"""Создатель расхода"""
|
||||
"""Исполнитель расхода"""
|
||||
creator: String!
|
||||
|
||||
"""Описание расхода"""
|
||||
@@ -4963,10 +4966,10 @@ input GetCapitalStoryByHashInput {
|
||||
}
|
||||
|
||||
input GetContributorInput {
|
||||
"""ID вкладчика"""
|
||||
"""ID участника"""
|
||||
_id: String
|
||||
|
||||
"""Хеш вкладчика"""
|
||||
"""Хеш участника"""
|
||||
contributor_hash: String
|
||||
|
||||
"""Имя пользователя"""
|
||||
@@ -5107,7 +5110,7 @@ input ImportContributorInput {
|
||||
"""Сумма вклада"""
|
||||
contribution_amount: String!
|
||||
|
||||
"""Хэш вкладчика"""
|
||||
"""Хэш участника"""
|
||||
contributor_hash: String!
|
||||
|
||||
"""Имя аккаунта кооператива"""
|
||||
@@ -5699,7 +5702,7 @@ type Mutation {
|
||||
"""Удаление истории по хэшу"""
|
||||
capitalDeleteStory(data: DeleteCapitalStoryByHashInput!): Boolean!
|
||||
|
||||
"""Редактирование параметров вкладчика в CAPITAL контракте"""
|
||||
"""Редактирование параметров участника в CAPITAL контракте"""
|
||||
capitalEditContributor(data: EditContributorInput!): Transaction!
|
||||
|
||||
"""Редактирование проекта в CAPITAL контракте"""
|
||||
@@ -5782,7 +5785,7 @@ type Mutation {
|
||||
"""Сгенерировать заявление о вкладе результатов"""
|
||||
capitalGenerateResultContributionStatement(data: GenerateDocumentInput!, options: GenerateDocumentOptionsInput): GeneratedDocument!
|
||||
|
||||
"""Импорт вкладчика в CAPITAL контракт"""
|
||||
"""Импорт участника в CAPITAL контракт"""
|
||||
capitalImportContributor(data: ImportContributorInput!): Transaction!
|
||||
|
||||
"""Подписание приложения в CAPITAL контракте"""
|
||||
@@ -5803,7 +5806,7 @@ type Mutation {
|
||||
"""Обновление сегмента в CAPITAL контракте"""
|
||||
capitalRefreshSegment(data: RefreshSegmentInput!): CapitalSegment
|
||||
|
||||
"""Регистрация вкладчика в CAPITAL контракте"""
|
||||
"""Регистрация участника в CAPITAL контракте"""
|
||||
capitalRegisterContributor(data: RegisterContributorInput!): Transaction!
|
||||
|
||||
"""Установка конфигурации CAPITAL контракта"""
|
||||
@@ -5818,7 +5821,7 @@ type Mutation {
|
||||
"""Подписание акта о вкладе результатов председателем"""
|
||||
capitalSignActAsChairman(data: SignActAsChairmanInput!): CapitalSegment!
|
||||
|
||||
"""Подписание акта о вкладе результатов вкладчиком"""
|
||||
"""Подписание акта о вкладе результатов участником"""
|
||||
capitalSignActAsContributor(data: SignActAsContributorInput!): CapitalSegment!
|
||||
|
||||
"""Запуск проекта в CAPITAL контракте"""
|
||||
@@ -7078,10 +7081,10 @@ type Query {
|
||||
"""Получение списка коммитов кооператива с фильтрацией"""
|
||||
capitalCommits(filter: CapitalCommitFilter, options: PaginationInput): PaginatedCapitalCommitsPaginationResult!
|
||||
|
||||
"""Получение вкладчика по ID, имени пользователя или хешу вкладчика"""
|
||||
"""Получение участника по ID, имени пользователя или хешу участника"""
|
||||
capitalContributor(data: GetContributorInput!): CapitalContributor
|
||||
|
||||
"""Получение списка вкладчиков кооператива с фильтрацией"""
|
||||
"""Получение списка участников кооператива с фильтрацией"""
|
||||
capitalContributors(filter: CapitalContributorFilter, options: PaginationInput): PaginatedCapitalContributorsPaginationResult!
|
||||
|
||||
"""Получение списка циклов кооператива с фильтрацией"""
|
||||
@@ -7151,11 +7154,11 @@ type Query {
|
||||
capitalTimeEntries(filter: CapitalTimeEntriesFilter, options: PaginationInput): PaginatedCapitalTimeEntriesPaginationResult!
|
||||
|
||||
"""
|
||||
Получение пагинированного списка агрегированных записей времени по задачам с информацией о задачах и вкладчиках
|
||||
Получение пагинированного списка агрегированных записей времени по задачам с информацией о задачах и участниках
|
||||
"""
|
||||
capitalTimeEntriesByIssues(filter: CapitalTimeEntriesFilter, options: PaginationInput): PaginatedCapitalTimeEntriesByIssuesPaginationResult!
|
||||
|
||||
"""Гибкий запрос статистики времени вкладчиков по проектам с пагинацией"""
|
||||
"""Гибкий запрос статистики времени участников по проектам с пагинацией"""
|
||||
capitalTimeStats(data: CapitalTimeStatsInput, options: PaginationInput): CapitalTimeStats!
|
||||
|
||||
"""Получение голоса по внутреннему ID базы данных"""
|
||||
@@ -8938,4 +8941,4 @@ input WebPushSubscriptionKeysInput {
|
||||
|
||||
"""P256DH ключ для шифрования"""
|
||||
p256dh: String!
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -38,7 +38,7 @@ export class AgendaNotificationService implements OnModuleInit {
|
||||
* Обработчик действия soviet::createagenda
|
||||
* Отправляет уведомления всем членам совета о новом вопросе на повестке
|
||||
*/
|
||||
@OnEvent(`action::${SovietContract.contractName.production}::createagenda`)
|
||||
@OnEvent(`action::${SovietContract.contractName.production}::${SovietContract.Actions.Decisions.CreateAgenda.actionName}`)
|
||||
async handleCreateAgenda(actionData: ActionDomainInterface): Promise<void> {
|
||||
try {
|
||||
const action = actionData.data as any;
|
||||
|
||||
+4
-3
@@ -8,6 +8,7 @@ import config from '~/config/config';
|
||||
import { SovietContract } from 'cooptypes';
|
||||
import type { ActionDomainInterface } from '~/domain/parser/interfaces/action-domain.interface';
|
||||
import type { WorkflowTriggerDomainInterface } from '~/domain/notification/interfaces/workflow-trigger-domain.interface';
|
||||
import { Workflows } from '@coopenomics/notifications';
|
||||
|
||||
/**
|
||||
* Сервис для отправки уведомлений о принятых решениях совета
|
||||
@@ -65,8 +66,8 @@ export class DecisionNotificationService implements OnModuleInit {
|
||||
// Получаем отображаемое имя пользователя
|
||||
const userName = await this.accountPort.getDisplayName(username);
|
||||
|
||||
// Формируем данные для workflow
|
||||
const payload = {
|
||||
// Формируем данные для workflow (без приватных данных)
|
||||
const payload: Workflows.DecisionApproved.IPayload = {
|
||||
userName,
|
||||
decisionTitle: `Решение №${action.decision_id}`,
|
||||
coopname: action.coopname,
|
||||
@@ -76,7 +77,7 @@ export class DecisionNotificationService implements OnModuleInit {
|
||||
|
||||
// Отправляем уведомление
|
||||
const triggerData: WorkflowTriggerDomainInterface = {
|
||||
name: 'reshenie-soveta-prinyato',
|
||||
name: Workflows.DecisionApproved.id,
|
||||
to: {
|
||||
subscriberId: username,
|
||||
email: userEmail,
|
||||
|
||||
+7
-4
@@ -7,6 +7,7 @@ import config from '~/config/config';
|
||||
import type { WorkflowTriggerDomainInterface } from '~/domain/notification/interfaces/workflow-trigger-domain.interface';
|
||||
import type { PaymentDomainEntity } from '~/domain/gateway/entities/payment-domain.entity';
|
||||
import { PaymentStatusEnum } from '~/domain/gateway/enums/payment-status.enum';
|
||||
import { Workflows } from '@coopenomics/notifications';
|
||||
|
||||
/**
|
||||
* Сервис для отправки уведомлений о статусе платежей
|
||||
@@ -50,10 +51,12 @@ export class PaymentNotificationService implements OnModuleInit {
|
||||
// Получаем отображаемое имя пользователя
|
||||
const userName = await this.accountPort.getDisplayName(payment.username);
|
||||
|
||||
// Формируем данные для workflow
|
||||
const workflowName = payment.status === PaymentStatusEnum.COMPLETED ? 'platezh-zavershen' : 'platezh-otmenen';
|
||||
// Выбираем workflow в зависимости от статуса платежа
|
||||
const workflowId =
|
||||
payment.status === PaymentStatusEnum.COMPLETED ? Workflows.PaymentCompleted.id : Workflows.PaymentCancelled.id;
|
||||
|
||||
const payload = {
|
||||
// Формируем данные для workflow (без приватных данных)
|
||||
const payload: Workflows.PaymentCompleted.IPayload | Workflows.PaymentCancelled.IPayload = {
|
||||
userName,
|
||||
paymentAmount: payment.quantity.toFixed(2),
|
||||
paymentCurrency: payment.symbol,
|
||||
@@ -64,7 +67,7 @@ export class PaymentNotificationService implements OnModuleInit {
|
||||
|
||||
// Отправляем уведомление
|
||||
const triggerData: WorkflowTriggerDomainInterface = {
|
||||
name: workflowName,
|
||||
name: workflowId,
|
||||
to: {
|
||||
subscriberId: payment.username,
|
||||
email: userEmail,
|
||||
|
||||
+1
-1
@@ -77,7 +77,7 @@ export class NotificationEventService {
|
||||
// Отправляем уведомление используя воркфлоу из пакета @coopenomics/notifications
|
||||
await this.notificationSenderService.sendNotificationToUser(
|
||||
recipientUsername,
|
||||
Workflows.NewTransfer.workflow.workflowId, // 'vkhodyaschiy-perevod'
|
||||
Workflows.NewTransfer.id, // 'vkhodyaschiy-perevod'
|
||||
notificationPayload
|
||||
);
|
||||
|
||||
|
||||
+3
-2
@@ -4,6 +4,7 @@ import { NovuWorkflowAdapter } from '~/infrastructure/novu/novu-workflow.adapter
|
||||
import { NOVU_WORKFLOW_PORT } from '~/domain/notification/interfaces/novu-workflow.port';
|
||||
import { ACCOUNT_EXTENSION_PORT, AccountExtensionPort } from '~/domain/extension/ports/account-extension-port';
|
||||
import type { WorkflowTriggerDomainInterface } from '~/domain/notification/interfaces/workflow-trigger-domain.interface';
|
||||
import { Workflows } from '@coopenomics/notifications';
|
||||
|
||||
/**
|
||||
* Сервис для отправки уведомлений участникам
|
||||
@@ -43,13 +44,13 @@ export class ParticipantNotificationService implements OnModuleInit {
|
||||
const userName = await this.accountPort.getDisplayName(username);
|
||||
|
||||
// Формируем данные для workflow (без приватных данных)
|
||||
const payload = {
|
||||
const payload: Workflows.Welcome.IPayload = {
|
||||
userName,
|
||||
};
|
||||
|
||||
// Отправляем уведомление
|
||||
const triggerData: WorkflowTriggerDomainInterface = {
|
||||
name: 'dobro-pozhalovat',
|
||||
name: Workflows.Welcome.id,
|
||||
to: {
|
||||
subscriberId: username,
|
||||
email: userEmail,
|
||||
|
||||
@@ -89,7 +89,7 @@ export class AccountDomainInteractor {
|
||||
|
||||
this.logger.log(`Успешно обновлен аккаунт ${data.username}`);
|
||||
|
||||
// Эмитим событие об обновлении аккаунта для синхронизации с вкладчиками
|
||||
// Эмитим событие об обновлении аккаунта для синхронизации с участниками
|
||||
this.eventsService.emit('account::updated', {
|
||||
username: data.username,
|
||||
account,
|
||||
|
||||
@@ -2,13 +2,13 @@
|
||||
|
||||
## Общее описание
|
||||
|
||||
Система учёта времени предназначена для автоматического отслеживания рабочего времени вкладчиков в проектах кооператива. Основная идея заключается в том, что вкладчики получают "пассивный доход" времени за активные задачи, которые они ведут в проектах.
|
||||
Система учёта времени предназначена для автоматического отслеживания рабочего времени участников в проектах кооператива. Основная идея заключается в том, что участники получают "пассивный доход" времени за активные задачи, которые они ведут в проектах.
|
||||
|
||||
### Основные принципы работы
|
||||
|
||||
1. **Автоматический учёт**: Система работает по крону каждый час и автоматически начисляет время вкладчикам за активные задачи (IN_PROGRESS)
|
||||
2. **Индивидуальные лимиты**: Каждый вкладчик имеет индивидуальный лимит часов в день (поле `hours_per_day`), по умолчанию 0 часов
|
||||
3. **Равномерное распределение**: Если у вкладчика несколько активных задач, общее доступное время (согласно индивидуальному лимиту) распределяется между ними поровну
|
||||
1. **Автоматический учёт**: Система работает по крону каждый час и автоматически начисляет время участникам за активные задачи (IN_PROGRESS)
|
||||
2. **Индивидуальные лимиты**: Каждый участник имеет индивидуальный лимит часов в день (поле `hours_per_day`), по умолчанию 0 часов
|
||||
3. **Равномерное распределение**: Если у участника несколько активных задач, общее доступное время (согласно индивидуальному лимиту) распределяется между ними поровну
|
||||
4. **Условная доступность**: Время становится доступным для фиксации в коммит только после завершения соответствующих задач (DONE статус)
|
||||
|
||||
## Архитектура системы
|
||||
@@ -26,7 +26,7 @@
|
||||
```typescript
|
||||
{
|
||||
_id: string,
|
||||
contributor_hash: string, // Хеш вкладчика
|
||||
contributor_hash: string, // Хеш участника
|
||||
issue_hash: string, // Хеш задачи
|
||||
project_hash: string, // Хеш проекта
|
||||
coopname: string, // Название кооператива
|
||||
@@ -51,21 +51,21 @@
|
||||
async trackTime(): Promise<void> {
|
||||
const today = new Date().toISOString().split('T')[0];
|
||||
|
||||
// Получаем всех активных вкладчиков из всех кооперативов
|
||||
// Получаем всех активных участников из всех кооперативов
|
||||
const activeContributors = await this.getAllActiveContributors();
|
||||
|
||||
// Обрабатываем каждого вкладчика
|
||||
// Обрабатываем каждого участника
|
||||
for (const contributor of activeContributors) {
|
||||
await this.trackTimeForContributor(contributor, today);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Обработка вкладчика
|
||||
### Обработка участника
|
||||
|
||||
```typescript
|
||||
private async trackTimeForContributor(contributor, date): Promise<void> {
|
||||
// 1. Получаем активные задачи вкладчика
|
||||
// 1. Получаем активные задачи участника
|
||||
const activeIssues = await this.getContributorActiveIssues(contributor);
|
||||
|
||||
// 2. Рассчитываем распределение времени
|
||||
@@ -108,22 +108,22 @@ private async calculateTimeDistributionPerIssue(contributor, activeIssues, date)
|
||||
### Примеры распределения времени
|
||||
|
||||
#### Сценарий 1: 1 активная задача (лимита 8 часов)
|
||||
- Вкладчик имеет 1 активную задачу
|
||||
- Участник имеет 1 активную задачу
|
||||
- Каждый час начисляется 1 час на эту задачу
|
||||
- Максимум 8 часов в день
|
||||
|
||||
#### Сценарий 2: 2 активные задачи (лимита 8 часов)
|
||||
- Вкладчик имеет 2 активные задачи
|
||||
- Участник имеет 2 активные задачи
|
||||
- Каждый час начисляется по 0.5 часа на каждую задачу
|
||||
- Максимум 4 часа на задачу в день (8/2)
|
||||
|
||||
#### Сценарий 3: 4 активные задачи (лимита 8 часов)
|
||||
- Вкладчик имеет 4 активные задачи
|
||||
- Участник имеет 4 активные задачи
|
||||
- Каждый час начисляется по 0.25 часа на каждую задачу
|
||||
- Максимум 2 часа на задачу в день (8/4)
|
||||
|
||||
#### Сценарий 4: Вкладчик с индивидуальным лимитом 6 часов
|
||||
- Вкладчик имеет 2 активные задачи, лимит 6 часов в день
|
||||
#### Сценарий 4: Участник с индивидуальным лимитом 6 часов
|
||||
- Участник имеет 2 активные задачи, лимит 6 часов в день
|
||||
- Каждый час начисляется по 0.5 часа на каждую задачу
|
||||
- Максимум 3 часа на задачу в день (6/2)
|
||||
|
||||
@@ -142,30 +142,30 @@ private async calculateTimeDistributionPerIssue(contributor, activeIssues, date)
|
||||
|
||||
### Примеры сценариев
|
||||
|
||||
#### Сценарий 1: Вкладчик работает над задачей, но не завершает её
|
||||
- Вкладчик имеет активную задачу IN_PROGRESS
|
||||
#### Сценарий 1: Участник работает над задачей, но не завершает её
|
||||
- Участник имеет активную задачу IN_PROGRESS
|
||||
- Каждый час начисляется 1 час в pending_hours
|
||||
- available_hours = 0 (нет завершённых задач)
|
||||
- total_uncommitted_hours = pending_hours
|
||||
|
||||
#### Сценарий 2: Вкладчик завершает задачу
|
||||
- Вкладчик работает над задачей IN_PROGRESS (начисляется время в pending_hours)
|
||||
#### Сценарий 2: Участник завершает задачу
|
||||
- Участник работает над задачей IN_PROGRESS (начисляется время в pending_hours)
|
||||
- Переводит задачу в DONE
|
||||
- Время перемещается из pending_hours в available_hours
|
||||
- Теперь время доступно для коммита
|
||||
|
||||
#### Сценарий 3: Смешанный сценарий
|
||||
- Вкладчик имеет 2 активные задачи IN_PROGRESS (начисляется по 0.5 часа на каждую в pending_hours)
|
||||
- Участник имеет 2 активные задачи IN_PROGRESS (начисляется по 0.5 часа на каждую в pending_hours)
|
||||
- Завершает одну задачу (DONE)
|
||||
- Время по завершённой задаче перемещается в available_hours
|
||||
- available_hours = 4 часа, pending_hours = 4 часа (по второй задаче)
|
||||
- total_uncommitted_hours = 8 часов
|
||||
|
||||
## Активные задачи вкладчика
|
||||
## Активные задачи участника
|
||||
|
||||
Задача считается активной, если:
|
||||
- Статус = `IssueStatus.IN_PROGRESS`
|
||||
- Вкладчик является создателем задачи (`creator_hash` содержит хеш вкладчика)
|
||||
- Участник является создателем задачи (`creator_hash` содержит хеш участника)
|
||||
|
||||
```typescript
|
||||
private async getContributorActiveIssues(contributor): Promise<any[]> {
|
||||
@@ -180,7 +180,7 @@ private async getContributorActiveIssues(contributor): Promise<any[]> {
|
||||
|
||||
### Фиксация времени в коммит
|
||||
|
||||
Когда вкладчик делает коммит в проект, можно зафиксировать часть незакоммиченного времени, но **только по завершённым задачам** (статус DONE):
|
||||
Когда участник делает коммит в проект, можно зафиксировать часть незакоммиченного времени, но **только по завершённым задачам** (статус DONE):
|
||||
|
||||
```typescript
|
||||
async commitTime(contributorHash, projectHash, hours, commitHash): Promise<void> {
|
||||
@@ -189,7 +189,7 @@ async commitTime(contributorHash, projectHash, hours, commitHash): Promise<void>
|
||||
projectHash, contributorHash
|
||||
);
|
||||
|
||||
// Получаем завершённые задачи вкладчика в этом проекте
|
||||
// Получаем завершённые задачи участника в этом проекте
|
||||
const completedIssues = await this.issueRepository.findCompletedByProjectAndCreatorsHashs(
|
||||
projectHash, [contributorHash]
|
||||
);
|
||||
@@ -258,7 +258,7 @@ async createCommit(data: CreateCommitDomainInput): Promise<TransactResult> {
|
||||
- **pending_hours**: Время по незавершённым задачам (IN_PROGRESS), которое станет доступным после завершения задач
|
||||
- **total_uncommitted_hours**: available_hours + pending_hours (весь незакоммиченный объём)
|
||||
|
||||
### Статистика по проекту для вкладчика
|
||||
### Статистика по проекту для участника
|
||||
|
||||
```typescript
|
||||
interface TimeStatsDomainInterface {
|
||||
@@ -271,7 +271,7 @@ interface TimeStatsDomainInterface {
|
||||
}
|
||||
```
|
||||
|
||||
### Проекты вкладчика со статистикой
|
||||
### Проекты участника со статистикой
|
||||
|
||||
```typescript
|
||||
interface ContributorProjectsTimeStatsDomainInterface {
|
||||
@@ -292,8 +292,8 @@ interface ContributorProjectsTimeStatsDomainInterface {
|
||||
|
||||
### Основные методы TimeTrackingInteractor
|
||||
|
||||
1. **getTimeStats(data)** - Статистика времени вкладчика по проекту
|
||||
2. **getContributorProjectsTimeStats(data)** - Проекты вкладчика со статистикой
|
||||
1. **getTimeStats(data)** - Статистика времени участника по проекту
|
||||
2. **getContributorProjectsTimeStats(data)** - Проекты участника со статистикой
|
||||
3. **getTimeEntries(data, options)** - Пагинированные записи времени
|
||||
4. **getFlexibleTimeStats(data, options)** - Гибкий запрос статистики
|
||||
5. **trackTime()** - Основная логика учёта (cron)
|
||||
@@ -332,12 +332,12 @@ interface ContributorProjectsTimeStatsDomainInterface {
|
||||
## Сценарии использования
|
||||
|
||||
### 1. Автоматический учёт времени
|
||||
- Каждый час система проверяет активных вкладчиков
|
||||
- Для каждого вкладчика начисляет время за активные задачи
|
||||
- Каждый час система проверяет активных участников
|
||||
- Для каждого участника начисляет время за активные задачи
|
||||
- Время распределяется равномерно между задачами
|
||||
|
||||
### 2. Просмотр статистики
|
||||
- Вкладчик может посмотреть время по проектам
|
||||
- Участник может посмотреть время по проектам
|
||||
- Видит committed/uncommitted/available часы
|
||||
- Может планировать коммиты
|
||||
|
||||
@@ -350,7 +350,7 @@ interface ContributorProjectsTimeStatsDomainInterface {
|
||||
### 4. Отчёты и аналитика
|
||||
- Гибкие запросы статистики по разным фильтрам
|
||||
- Пагинация для больших объёмов данных
|
||||
- Группировка по проектам/вкладчикам
|
||||
- Группировка по проектам/участникам
|
||||
|
||||
## Архитектурные принципы
|
||||
|
||||
@@ -371,7 +371,7 @@ interface ContributorProjectsTimeStatsDomainInterface {
|
||||
|
||||
## Особенности реализации
|
||||
|
||||
1. **Индивидуальные лимиты**: Каждый вкладчик имеет индивидуальный лимит часов в день (поле `hours_per_day`), по умолчанию 8 часов (применяется только в периодическом распределении времени)
|
||||
1. **Индивидуальные лимиты**: Каждый участник имеет индивидуальный лимит часов в день (поле `hours_per_day`), по умолчанию 8 часов (применяется только в периодическом распределении времени)
|
||||
2. **Равномерность**: Равное распределение между активными задачами (IN_PROGRESS)
|
||||
3. **Условная доступность**: Время для коммита доступно только после завершения задач (DONE)
|
||||
4. **Без ограничений при коммите**: При фиксации времени в коммит можно использовать всё накопленное время по завершённым задачам
|
||||
@@ -385,14 +385,14 @@ interface ContributorProjectsTimeStatsDomainInterface {
|
||||
## Мониторинг и отладка
|
||||
|
||||
- Логирование всех операций в TimeTrackingInteractor
|
||||
- Отслеживание ошибок обработки отдельных вкладчиков
|
||||
- Отслеживание ошибок обработки отдельных участников
|
||||
- Проверка консистентности данных
|
||||
- Мониторинг работы cron задач
|
||||
|
||||
## Расширение системы
|
||||
|
||||
Возможные улучшения:
|
||||
- Настраиваемые лимиты времени на вкладчика
|
||||
- Настраиваемые лимиты времени на участника
|
||||
- Разные стратегии распределения времени
|
||||
- Приоритеты задач
|
||||
- Уведомления о начислении времени
|
||||
|
||||
+3
-3
@@ -34,9 +34,9 @@ export class CreateExpenseInputDTO implements CreateExpenseDomainInput {
|
||||
@IsString({ message: 'Описание расхода должно быть строкой' })
|
||||
description!: string;
|
||||
|
||||
@Field(() => String, { description: 'Создатель расхода' })
|
||||
@IsNotEmpty({ message: 'Создатель расхода не должен быть пустым' })
|
||||
@IsString({ message: 'Создатель расхода должен быть строкой' })
|
||||
@Field(() => String, { description: 'Исполнитель расхода' })
|
||||
@IsNotEmpty({ message: 'Исполнитель расхода не должен быть пустым' })
|
||||
@IsString({ message: 'Исполнитель расхода должен быть строкой' })
|
||||
creator!: string;
|
||||
|
||||
@Field(() => SignedDigitalDocumentInputDTO, { description: 'Служебная записка о расходе' })
|
||||
|
||||
+1
-1
@@ -54,7 +54,7 @@ export class CommitAmountsOutputDTO {
|
||||
|
||||
@Field(() => String, {
|
||||
nullable: true,
|
||||
description: 'Бонусный пул вкладчиков',
|
||||
description: 'Бонусный пул участников',
|
||||
})
|
||||
contributors_bonus_pool?: string;
|
||||
|
||||
|
||||
+4
-4
@@ -1,14 +1,14 @@
|
||||
import { ObjectType, InputType, Field, Float } from '@nestjs/graphql';
|
||||
|
||||
/**
|
||||
* GraphQL Output DTO для статистики времени вкладчика по проекту
|
||||
* GraphQL Output DTO для статистики времени участника по проекту
|
||||
*/
|
||||
@ObjectType('CapitalTimeStats', {
|
||||
description: 'Статистика времени вкладчика по проекту',
|
||||
description: 'Статистика времени участника по проекту',
|
||||
})
|
||||
export class TimeStatsOutputDTO {
|
||||
@Field(() => String, {
|
||||
description: 'Хеш вкладчика',
|
||||
description: 'Хеш участника',
|
||||
})
|
||||
contributor_hash!: string;
|
||||
|
||||
@@ -46,7 +46,7 @@ export class TimeStatsOutputDTO {
|
||||
})
|
||||
export class TimeStatsInputDTO {
|
||||
@Field(() => String, {
|
||||
description: 'Хеш вкладчика',
|
||||
description: 'Хеш участника',
|
||||
})
|
||||
contributor_hash!: string;
|
||||
|
||||
|
||||
+5
-5
@@ -2,10 +2,10 @@ import { InputType, Field } from '@nestjs/graphql';
|
||||
import { ContributorStatus } from '../../../domain/enums/contributor-status.enum';
|
||||
|
||||
/**
|
||||
* Input DTO для фильтрации вкладчиков
|
||||
* Input DTO для фильтрации участников
|
||||
*/
|
||||
@InputType('CapitalContributorFilter', {
|
||||
description: 'Параметры фильтрации для запросов вкладчиков CAPITAL',
|
||||
description: 'Параметры фильтрации для запросов участников CAPITAL',
|
||||
})
|
||||
export class ContributorFilterInputDTO {
|
||||
@Field(() => String, {
|
||||
@@ -22,13 +22,13 @@ export class ContributorFilterInputDTO {
|
||||
|
||||
@Field(() => ContributorStatus, {
|
||||
nullable: true,
|
||||
description: 'Фильтр по статусу вкладчика',
|
||||
description: 'Фильтр по статусу участника',
|
||||
})
|
||||
status?: ContributorStatus;
|
||||
|
||||
@Field(() => String, {
|
||||
nullable: true,
|
||||
description: 'Фильтр по хешу вкладчика',
|
||||
description: 'Фильтр по хешу участника',
|
||||
})
|
||||
contributor_hash?: string;
|
||||
|
||||
@@ -46,7 +46,7 @@ export class ContributorFilterInputDTO {
|
||||
|
||||
@Field(() => String, {
|
||||
nullable: true,
|
||||
description: 'Фильтр по project_hash - показывает только вкладчиков, у которых в appendixes есть указанный project_hash',
|
||||
description: 'Фильтр по project_hash - показывает только участников, у которых в appendixes есть указанный project_hash',
|
||||
})
|
||||
project_hash?: string;
|
||||
}
|
||||
|
||||
+6
-6
@@ -7,7 +7,7 @@ import { BaseOutputDTO } from '~/shared/dto/base.dto';
|
||||
* GraphQL Output DTO для сущности Contributor
|
||||
*/
|
||||
@ObjectType('CapitalContributor', {
|
||||
description: 'Вкладчик кооператива в системе CAPITAL',
|
||||
description: 'Участник кооператива в системе CAPITAL',
|
||||
})
|
||||
export class ContributorOutputDTO extends BaseOutputDTO {
|
||||
@Field(() => Int, {
|
||||
@@ -16,12 +16,12 @@ export class ContributorOutputDTO extends BaseOutputDTO {
|
||||
id!: number;
|
||||
|
||||
@Field(() => ContributorStatus, {
|
||||
description: 'Статус вкладчика',
|
||||
description: 'Статус участника',
|
||||
})
|
||||
status!: ContributorStatus;
|
||||
|
||||
@Field(() => String, {
|
||||
description: 'Хеш вкладчика',
|
||||
description: 'Хеш участника',
|
||||
})
|
||||
contributor_hash!: string;
|
||||
|
||||
@@ -78,7 +78,7 @@ export class ContributorOutputDTO extends BaseOutputDTO {
|
||||
contributed_as_investor!: string;
|
||||
|
||||
@Field(() => String, {
|
||||
description: 'Вклад как создатель',
|
||||
description: 'Вклад как исполнитель',
|
||||
})
|
||||
contributed_as_creator!: string;
|
||||
|
||||
@@ -93,7 +93,7 @@ export class ContributorOutputDTO extends BaseOutputDTO {
|
||||
contributed_as_coordinator!: string;
|
||||
|
||||
@Field(() => String, {
|
||||
description: 'Вклад как вкладчик',
|
||||
description: 'Вклад как участник',
|
||||
})
|
||||
contributed_as_contributor!: string;
|
||||
|
||||
@@ -108,7 +108,7 @@ export class ContributorOutputDTO extends BaseOutputDTO {
|
||||
created_at!: string;
|
||||
|
||||
@Field(() => DocumentAggregateDTO, {
|
||||
description: 'Контракт вкладчика',
|
||||
description: 'Контракт участника',
|
||||
nullable: true,
|
||||
})
|
||||
contract?: DocumentAggregateDTO | null;
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@ import { Type } from 'class-transformer';
|
||||
import type { EditContributorDomainInput } from '../../../domain/actions/edit-contributor-domain-input.interface';
|
||||
|
||||
/**
|
||||
* GraphQL DTO для редактирования вкладчика CAPITAL контракта
|
||||
* GraphQL DTO для редактирования участника CAPITAL контракта
|
||||
*/
|
||||
@InputType('EditContributorInput')
|
||||
export class EditContributorInputDTO implements EditContributorDomainInput {
|
||||
|
||||
+3
-3
@@ -2,11 +2,11 @@ import { Field, InputType } from '@nestjs/graphql';
|
||||
import { IsString, IsOptional, ValidateIf } from 'class-validator';
|
||||
|
||||
/**
|
||||
* DTO для получения вкладчика
|
||||
* DTO для получения участника
|
||||
*/
|
||||
@InputType('GetContributorInput')
|
||||
export class GetContributorInputDTO {
|
||||
@Field(() => String, { nullable: true, description: 'ID вкладчика' })
|
||||
@Field(() => String, { nullable: true, description: 'ID участника' })
|
||||
@IsString()
|
||||
@IsOptional()
|
||||
_id?: string;
|
||||
@@ -16,7 +16,7 @@ export class GetContributorInputDTO {
|
||||
@IsOptional()
|
||||
username?: string;
|
||||
|
||||
@Field(() => String, { nullable: true, description: 'Хеш вкладчика' })
|
||||
@Field(() => String, { nullable: true, description: 'Хеш участника' })
|
||||
@IsString()
|
||||
@IsOptional()
|
||||
contributor_hash?: string;
|
||||
|
||||
+4
-4
@@ -3,7 +3,7 @@ import { IsNotEmpty, IsString } from 'class-validator';
|
||||
import type { ImportContributorDomainInput } from '../../../domain/actions/import-contributor-domain-input.interface';
|
||||
|
||||
/**
|
||||
* GraphQL DTO для импорта вкладчика в CAPITAL контракт
|
||||
* GraphQL DTO для импорта участника в CAPITAL контракт
|
||||
*/
|
||||
@InputType('ImportContributorInput')
|
||||
export class ImportContributorInputDTO implements ImportContributorDomainInput {
|
||||
@@ -17,9 +17,9 @@ export class ImportContributorInputDTO implements ImportContributorDomainInput {
|
||||
@IsString({ message: 'Имя аккаунта пользователя должно быть строкой' })
|
||||
username!: string;
|
||||
|
||||
@Field(() => String, { description: 'Хэш вкладчика' })
|
||||
@IsNotEmpty({ message: 'Хэш вкладчика не должен быть пустым' })
|
||||
@IsString({ message: 'Хэш вкладчика должен быть строкой' })
|
||||
@Field(() => String, { description: 'Хэш участника' })
|
||||
@IsNotEmpty({ message: 'Хэш участника не должен быть пустым' })
|
||||
@IsString({ message: 'Хэш участника должен быть строкой' })
|
||||
contributor_hash!: string;
|
||||
|
||||
@Field(() => String, { description: 'Сумма вклада' })
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@ import type { RegisterContributorDomainInput } from '../../../domain/actions/reg
|
||||
import { SignedDigitalDocumentInputDTO } from '~/application/document/dto/signed-digital-document-input.dto';
|
||||
|
||||
/**
|
||||
* GraphQL DTO для регистрации вкладчика CAPITAL контракта
|
||||
* GraphQL DTO для регистрации участника CAPITAL контракта
|
||||
*/
|
||||
@InputType('RegisterContributorInput')
|
||||
export class RegisterContributorInputDTO implements RegisterContributorDomainInput {
|
||||
|
||||
+9
@@ -81,6 +81,15 @@ export class ProjectPermissionsOutputDTO {
|
||||
})
|
||||
has_clearance!: boolean;
|
||||
|
||||
/**
|
||||
* Есть ли у пользователя запрос на получение допуска в рассмотрении
|
||||
* true если у пользователя есть приложение со статусом CREATED для данного проекта
|
||||
*/
|
||||
@Field(() => Boolean, {
|
||||
description: 'Есть ли запрос на получение допуска в рассмотрении',
|
||||
})
|
||||
pending_clearance!: boolean;
|
||||
|
||||
/**
|
||||
* Является ли пользователь гостем (неавторизованным)
|
||||
* true только если пользователь не авторизован, false для всех авторизованных пользователей
|
||||
|
||||
+5
-5
@@ -41,7 +41,7 @@ export class CapitalProjectCountsDataOutputDTO {
|
||||
total_propertors!: number;
|
||||
|
||||
@Field(() => Int, {
|
||||
description: 'Общее количество вкладчиков',
|
||||
description: 'Общее количество участников',
|
||||
})
|
||||
total_contributors!: number;
|
||||
|
||||
@@ -104,7 +104,7 @@ export class CapitalProjectPlanPoolOutputDTO {
|
||||
authors_bonus_pool!: string;
|
||||
|
||||
@Field(() => String, {
|
||||
description: 'Бонусный пул вкладчиков',
|
||||
description: 'Бонусный пул участников',
|
||||
})
|
||||
contributors_bonus_pool!: string;
|
||||
|
||||
@@ -202,7 +202,7 @@ export class CapitalProjectFactPoolOutputDTO {
|
||||
authors_bonus_pool!: string;
|
||||
|
||||
@Field(() => String, {
|
||||
description: 'Бонусный пул вкладчиков',
|
||||
description: 'Бонусный пул участников',
|
||||
})
|
||||
contributors_bonus_pool!: string;
|
||||
|
||||
@@ -270,7 +270,7 @@ export class CapitalProjectFactPoolOutputDTO {
|
||||
})
|
||||
export class CapitalProjectCrpsDataOutputDTO {
|
||||
@Field(() => String, {
|
||||
description: 'Общее количество долей вкладчиков капитала',
|
||||
description: 'Общее количество долей участников капитала',
|
||||
})
|
||||
total_capital_contributors_shares!: string;
|
||||
|
||||
@@ -285,7 +285,7 @@ export class CapitalProjectCrpsDataOutputDTO {
|
||||
author_bonus_cumulative_reward_per_share!: number;
|
||||
|
||||
@Field(() => Float, {
|
||||
description: 'Накопительный коэффициент вознаграждения вкладчиков',
|
||||
description: 'Накопительный коэффициент вознаграждения участников',
|
||||
})
|
||||
contributor_cumulative_reward_per_share!: number;
|
||||
}
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@ import { SignedDigitalDocumentInputDTO } from '~/application/document/dto/signed
|
||||
import type { SignActAsContributorDomainInput } from '~/extensions/capital/domain/actions/sign-act-as-contributor-domain-input.interface';
|
||||
|
||||
/**
|
||||
* GraphQL DTO для подписания акта вкладчиком CAPITAL контракта
|
||||
* GraphQL DTO для подписания акта участником CAPITAL контракта
|
||||
*/
|
||||
@InputType('SignActAsContributorInput')
|
||||
export class SignActAsContributorInputDTO implements Omit<SignActAsContributorDomainInput, 'username'> {
|
||||
|
||||
+1
-1
@@ -64,7 +64,7 @@ export class SegmentFilterInputDTO {
|
||||
|
||||
@Field(() => Boolean, {
|
||||
nullable: true,
|
||||
description: 'Фильтр по роли вкладчика',
|
||||
description: 'Фильтр по роли участника',
|
||||
})
|
||||
is_contributor?: boolean;
|
||||
|
||||
|
||||
+5
-5
@@ -68,7 +68,7 @@ export class SegmentOutputDTO extends BaseOutputDTO {
|
||||
is_propertor!: boolean;
|
||||
|
||||
@Field(() => Boolean, {
|
||||
description: 'Роль вкладчика',
|
||||
description: 'Роль участника',
|
||||
})
|
||||
is_contributor!: boolean;
|
||||
|
||||
@@ -121,9 +121,9 @@ export class SegmentOutputDTO extends BaseOutputDTO {
|
||||
})
|
||||
coordinator_base!: string;
|
||||
|
||||
// Вклады вкладчика
|
||||
// Вклады участника
|
||||
@Field(() => String, {
|
||||
description: 'Бонусный вклад вкладчика',
|
||||
description: 'Бонусный вклад участника',
|
||||
})
|
||||
contributor_bonus!: string;
|
||||
|
||||
@@ -145,13 +145,13 @@ export class SegmentOutputDTO extends BaseOutputDTO {
|
||||
last_author_bonus_reward_per_share!: number;
|
||||
|
||||
@Field(() => Float, {
|
||||
description: 'Последняя награда вкладчика на акцию',
|
||||
description: 'Последняя награда участника на акцию',
|
||||
})
|
||||
last_contributor_reward_per_share!: number;
|
||||
|
||||
// Доли в программе и проекте
|
||||
@Field(() => String, {
|
||||
description: 'Доли вкладчиков капитала',
|
||||
description: 'Доли участников капитала',
|
||||
})
|
||||
capital_contributor_shares!: string;
|
||||
|
||||
|
||||
+1
-1
@@ -10,7 +10,7 @@ import { ProjectTimeStatsOutputDTO } from './project-time-stats.dto';
|
||||
export class TimeStatsInputDTO {
|
||||
@Field(() => String, {
|
||||
nullable: true,
|
||||
description: 'Хеш вкладчика (опционально)',
|
||||
description: 'Хеш участника (опционально)',
|
||||
})
|
||||
contributor_hash?: string;
|
||||
|
||||
|
||||
+9
-9
@@ -1,10 +1,10 @@
|
||||
import { ObjectType, InputType, Field, Float } from '@nestjs/graphql';
|
||||
|
||||
/**
|
||||
* GraphQL Output DTO для статистики времени по проекту вкладчика
|
||||
* GraphQL Output DTO для статистики времени по проекту участника
|
||||
*/
|
||||
@ObjectType('CapitalProjectTimeStats', {
|
||||
description: 'Статистика времени вкладчика по проекту',
|
||||
description: 'Статистика времени участника по проекту',
|
||||
})
|
||||
export class ProjectTimeStatsOutputDTO {
|
||||
@Field(() => String, {
|
||||
@@ -18,7 +18,7 @@ export class ProjectTimeStatsOutputDTO {
|
||||
project_name!: string;
|
||||
|
||||
@Field(() => String, {
|
||||
description: 'Хеш вкладчика',
|
||||
description: 'Хеш участника',
|
||||
})
|
||||
contributor_hash!: string;
|
||||
|
||||
@@ -44,27 +44,27 @@ export class ProjectTimeStatsOutputDTO {
|
||||
}
|
||||
|
||||
/**
|
||||
* GraphQL Input DTO для запроса списка проектов с статистикой времени вкладчика
|
||||
* GraphQL Input DTO для запроса списка проектов с статистикой времени участника
|
||||
*/
|
||||
@InputType('CapitalContributorProjectsTimeStatsInput', {
|
||||
description: 'Входные данные для запроса списка проектов с статистикой времени вкладчика',
|
||||
description: 'Входные данные для запроса списка проектов с статистикой времени участника',
|
||||
})
|
||||
export class ContributorProjectsTimeStatsInputDTO {
|
||||
@Field(() => String, {
|
||||
description: 'Хеш вкладчика',
|
||||
description: 'Хеш участника',
|
||||
})
|
||||
contributor_hash!: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* GraphQL Output DTO для списка проектов с статистикой времени вкладчика
|
||||
* GraphQL Output DTO для списка проектов с статистикой времени участника
|
||||
*/
|
||||
@ObjectType('CapitalContributorProjectsTimeStats', {
|
||||
description: 'Список проектов с статистикой времени вкладчика',
|
||||
description: 'Список проектов с статистикой времени участника',
|
||||
})
|
||||
export class ContributorProjectsTimeStatsOutputDTO {
|
||||
@Field(() => String, {
|
||||
description: 'Хеш вкладчика',
|
||||
description: 'Хеш участника',
|
||||
})
|
||||
contributor_hash!: string;
|
||||
|
||||
|
||||
+3
-3
@@ -4,7 +4,7 @@ import { ObjectType, Field, Float } from '@nestjs/graphql';
|
||||
* GraphQL Output DTO для агрегированной статистики времени по задачам
|
||||
*/
|
||||
@ObjectType('CapitalTimeEntriesByIssues', {
|
||||
description: 'Агрегированная статистика времени по задачам с информацией о задачах и вкладчиках',
|
||||
description: 'Агрегированная статистика времени по задачам с информацией о задачах и участниках',
|
||||
})
|
||||
export class TimeEntriesByIssuesOutputDTO {
|
||||
@Field(() => String, {
|
||||
@@ -28,12 +28,12 @@ export class TimeEntriesByIssuesOutputDTO {
|
||||
project_name!: string;
|
||||
|
||||
@Field(() => String, {
|
||||
description: 'Хеш вкладчика',
|
||||
description: 'Хеш участника',
|
||||
})
|
||||
contributor_hash!: string;
|
||||
|
||||
@Field(() => String, {
|
||||
description: 'Имя вкладчика',
|
||||
description: 'Имя участника',
|
||||
})
|
||||
contributor_name!: string;
|
||||
|
||||
|
||||
+1
-1
@@ -15,7 +15,7 @@ export class TimeEntriesFilterInputDTO {
|
||||
|
||||
@Field(() => String, {
|
||||
nullable: true,
|
||||
description: 'Хеш вкладчика (опционально, если не указан - вернёт записи всех вкладчиков проекта)',
|
||||
description: 'Хеш участника (опционально, если не указан - вернёт записи всех участников проекта)',
|
||||
})
|
||||
contributor_hash?: string;
|
||||
|
||||
|
||||
+2
-2
@@ -4,7 +4,7 @@ import { ObjectType, Field, Float } from '@nestjs/graphql';
|
||||
* GraphQL Output DTO для записи времени
|
||||
*/
|
||||
@ObjectType('CapitalTimeEntry', {
|
||||
description: 'Запись времени вкладчика',
|
||||
description: 'Запись времени участника',
|
||||
})
|
||||
export class TimeEntryOutputDTO {
|
||||
@Field(() => String, {
|
||||
@@ -13,7 +13,7 @@ export class TimeEntryOutputDTO {
|
||||
_id!: string;
|
||||
|
||||
@Field(() => String, {
|
||||
description: 'Хеш вкладчика',
|
||||
description: 'Хеш участника',
|
||||
})
|
||||
contributor_hash!: string;
|
||||
|
||||
|
||||
+10
-10
@@ -32,11 +32,11 @@ export class ParticipationManagementResolver {
|
||||
constructor(private readonly participationManagementService: ParticipationManagementService) {}
|
||||
|
||||
/**
|
||||
* Мутация для регистрации вкладчика в CAPITAL контракте
|
||||
* Мутация для регистрации участника в CAPITAL контракте
|
||||
*/
|
||||
@Mutation(() => TransactionDTO, {
|
||||
name: 'capitalRegisterContributor',
|
||||
description: 'Регистрация вкладчика в CAPITAL контракте',
|
||||
description: 'Регистрация участника в CAPITAL контракте',
|
||||
})
|
||||
@UseGuards(GqlJwtAuthGuard, RolesGuard)
|
||||
@AuthRoles(['chairman'])
|
||||
@@ -48,11 +48,11 @@ export class ParticipationManagementResolver {
|
||||
}
|
||||
|
||||
/**
|
||||
* Мутация для импорта вкладчика в CAPITAL контракт
|
||||
* Мутация для импорта участника в CAPITAL контракт
|
||||
*/
|
||||
@Mutation(() => TransactionDTO, {
|
||||
name: 'capitalImportContributor',
|
||||
description: 'Импорт вкладчика в CAPITAL контракт',
|
||||
description: 'Импорт участника в CAPITAL контракт',
|
||||
})
|
||||
@UseGuards(GqlJwtAuthGuard, RolesGuard)
|
||||
@AuthRoles(['chairman'])
|
||||
@@ -80,11 +80,11 @@ export class ParticipationManagementResolver {
|
||||
}
|
||||
|
||||
/**
|
||||
* Мутация для редактирования вкладчика в CAPITAL контракте
|
||||
* Мутация для редактирования участника в CAPITAL контракте
|
||||
*/
|
||||
@Mutation(() => TransactionDTO, {
|
||||
name: 'capitalEditContributor',
|
||||
description: 'Редактирование параметров вкладчика в CAPITAL контракте',
|
||||
description: 'Редактирование параметров участника в CAPITAL контракте',
|
||||
})
|
||||
@UseGuards(GqlJwtAuthGuard, RolesGuard)
|
||||
@AuthRoles(['chairman'])
|
||||
@@ -98,11 +98,11 @@ export class ParticipationManagementResolver {
|
||||
// ============ ЗАПРОСЫ ВКЛАДЧИКОВ ============
|
||||
|
||||
/**
|
||||
* Получение всех вкладчиков с фильтрацией
|
||||
* Получение всех участников с фильтрацией
|
||||
*/
|
||||
@Query(() => paginatedContributorsResult, {
|
||||
name: 'capitalContributors',
|
||||
description: 'Получение списка вкладчиков кооператива с фильтрацией',
|
||||
description: 'Получение списка участников кооператива с фильтрацией',
|
||||
})
|
||||
async getContributors(
|
||||
@Args('filter', { nullable: true }) filter?: ContributorFilterInputDTO,
|
||||
@@ -112,11 +112,11 @@ export class ParticipationManagementResolver {
|
||||
}
|
||||
|
||||
/**
|
||||
* Получение вкладчика по критериям поиска
|
||||
* Получение участника по критериям поиска
|
||||
*/
|
||||
@Query(() => ContributorOutputDTO, {
|
||||
name: 'capitalContributor',
|
||||
description: 'Получение вкладчика по ID, имени пользователя или хешу вкладчика',
|
||||
description: 'Получение участника по ID, имени пользователя или хешу участника',
|
||||
nullable: true,
|
||||
})
|
||||
async getContributor(@Args('data') data: GetContributorInputDTO): Promise<ContributorOutputDTO | null> {
|
||||
|
||||
+2
-2
@@ -152,11 +152,11 @@ export class ResultSubmissionResolver {
|
||||
// ============ ПОДПИСАНИЕ АКТОВ ============
|
||||
|
||||
/**
|
||||
* Мутация для подписания акта вкладчиком
|
||||
* Мутация для подписания акта участником
|
||||
*/
|
||||
@Mutation(() => SegmentOutputDTO, {
|
||||
name: 'capitalSignActAsContributor',
|
||||
description: 'Подписание акта о вкладе результатов вкладчиком',
|
||||
description: 'Подписание акта о вкладе результатов участником',
|
||||
})
|
||||
@UseGuards(GqlJwtAuthGuard, RolesGuard)
|
||||
@AuthRoles(['participant'])
|
||||
|
||||
+2
-2
@@ -29,7 +29,7 @@ export class TimeTrackerResolver {
|
||||
*/
|
||||
@Query(() => FlexibleTimeStatsOutputDTO, {
|
||||
name: 'capitalTimeStats',
|
||||
description: 'Гибкий запрос статистики времени вкладчиков по проектам с пагинацией',
|
||||
description: 'Гибкий запрос статистики времени участников по проектам с пагинацией',
|
||||
})
|
||||
@UseGuards(GqlJwtAuthGuard, RolesGuard)
|
||||
@AuthRoles(['chairman', 'member', 'user'])
|
||||
@@ -62,7 +62,7 @@ export class TimeTrackerResolver {
|
||||
@Query(() => paginatedTimeEntriesByIssuesResult, {
|
||||
name: 'capitalTimeEntriesByIssues',
|
||||
description:
|
||||
'Получение пагинированного списка агрегированных записей времени по задачам с информацией о задачах и вкладчиках',
|
||||
'Получение пагинированного списка агрегированных записей времени по задачам с информацией о задачах и участниках',
|
||||
})
|
||||
@UseGuards(GqlJwtAuthGuard, RolesGuard)
|
||||
@AuthRoles(['chairman', 'member', 'user'])
|
||||
|
||||
+7
-7
@@ -6,10 +6,10 @@ import { AccountDomainEntity } from '~/domain/account/entities/account-domain.en
|
||||
import { AccountExtensionPort, ACCOUNT_EXTENSION_PORT } from '~/domain/extension/ports/account-extension-port';
|
||||
|
||||
/**
|
||||
* Сервис синхронизации вкладчиков при обновлении аккаунтов
|
||||
* Сервис синхронизации участников при обновлении аккаунтов
|
||||
*
|
||||
* Подписывается на события обновления аккаунтов и обновляет
|
||||
* соответствующие вкладчики с новыми данными display_name
|
||||
* соответствующие участники с новыми данными display_name
|
||||
*/
|
||||
@Injectable()
|
||||
export class ContributorAccountSyncService implements OnModuleInit {
|
||||
@@ -24,7 +24,7 @@ export class ContributorAccountSyncService implements OnModuleInit {
|
||||
}
|
||||
|
||||
async onModuleInit() {
|
||||
this.logger.log('Сервис синхронизации вкладчиков с аккаунтами инициализирован');
|
||||
this.logger.log('Сервис синхронизации участников с аккаунтами инициализирован');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -37,7 +37,7 @@ export class ContributorAccountSyncService implements OnModuleInit {
|
||||
|
||||
const contributor = await this.contributorRepository.findByUsername(eventData.username);
|
||||
if (!contributor) {
|
||||
this.logger.debug(`Не найдено вкладчиков для пользователя ${eventData.username}`);
|
||||
this.logger.debug(`Не найдено участников для пользователя ${eventData.username}`);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -51,12 +51,12 @@ export class ContributorAccountSyncService implements OnModuleInit {
|
||||
// Сохраняем обновленную сущность
|
||||
await this.contributorRepository.update(contributor);
|
||||
|
||||
this.logger.debug(`Обновлен display_name для вкладчика ${contributor._id}`);
|
||||
this.logger.debug(`Обновлен display_name для участника ${contributor._id}`);
|
||||
} catch (error: any) {
|
||||
this.logger.error(`Ошибка обновления вкладчика ${contributor._id}: ${error.message}`, error.stack);
|
||||
this.logger.error(`Ошибка обновления участника ${contributor._id}: ${error.message}`, error.stack);
|
||||
}
|
||||
|
||||
this.logger.log(`Завершено обновление вкладчика для пользователя ${eventData.username}`);
|
||||
this.logger.log(`Завершено обновление участника для пользователя ${eventData.username}`);
|
||||
} catch (error: any) {
|
||||
this.logger.error(`Ошибка обработки события обновления аккаунта ${eventData.username}: ${error.message}`, error.stack);
|
||||
}
|
||||
|
||||
+3
-3
@@ -61,13 +61,13 @@ export class GenerationService {
|
||||
* Проверяет доступ пользователя к проекту
|
||||
*/
|
||||
private async checkProjectAccess(username: string, coopname: string, projectHash: string): Promise<void> {
|
||||
// Находим вкладчика по username и coopname
|
||||
// Находим участника по username и coopname
|
||||
const contributor = await this.contributorRepository.findByUsernameAndCoopname(username, coopname);
|
||||
if (!contributor) {
|
||||
throw new Error(`Вкладчик с договором не найден`);
|
||||
throw new Error(`Участник с договором не найден`);
|
||||
}
|
||||
|
||||
// Проверяем, что у вкладчика есть доступ к проекту
|
||||
// Проверяем, что у участника есть доступ к проекту
|
||||
if (!contributor.appendixes.includes(projectHash)) {
|
||||
throw new Error(`У вас нет доступа к проекту`);
|
||||
}
|
||||
|
||||
+6
-6
@@ -30,14 +30,14 @@ export class ParticipationManagementService {
|
||||
) {}
|
||||
|
||||
/**
|
||||
* Импорт вкладчика в CAPITAL контракт
|
||||
* Импорт участника в CAPITAL контракт
|
||||
*/
|
||||
async importContributor(data: ImportContributorInputDTO): Promise<TransactResult> {
|
||||
return await this.participationManagementInteractor.importContributor(data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Регистрация вкладчика в CAPITAL контракте
|
||||
* Регистрация участника в CAPITAL контракте
|
||||
*/
|
||||
async registerContributor(data: RegisterContributorInputDTO): Promise<TransactResult> {
|
||||
const result = await this.participationManagementInteractor.registerContributor(data);
|
||||
@@ -52,7 +52,7 @@ export class ParticipationManagementService {
|
||||
}
|
||||
|
||||
/**
|
||||
* Редактирование вкладчика в CAPITAL контракте
|
||||
* Редактирование участника в CAPITAL контракте
|
||||
*/
|
||||
async editContributor(data: EditContributorInputDTO): Promise<TransactResult> {
|
||||
return await this.participationManagementInteractor.editContributor(data);
|
||||
@@ -61,7 +61,7 @@ export class ParticipationManagementService {
|
||||
// ============ МЕТОДЫ ЧТЕНИЯ ДАННЫХ ============
|
||||
|
||||
/**
|
||||
* Получение всех вкладчиков с фильтрацией
|
||||
* Получение всех участников с фильтрацией
|
||||
*/
|
||||
async getContributors(
|
||||
filter?: ContributorFilterInputDTO,
|
||||
@@ -86,7 +86,7 @@ export class ParticipationManagementService {
|
||||
}
|
||||
|
||||
/**
|
||||
* Получение вкладчика по ID
|
||||
* Получение участника по ID
|
||||
*/
|
||||
async getContributorById(_id: string): Promise<ContributorOutputDTO | null> {
|
||||
const contributor = await this.participationManagementInteractor.getContributorById(_id);
|
||||
@@ -94,7 +94,7 @@ export class ParticipationManagementService {
|
||||
}
|
||||
|
||||
/**
|
||||
* Получение вкладчика по критериям поиска
|
||||
* Получение участника по критериям поиска
|
||||
*/
|
||||
async getContributorByCriteria(criteria: {
|
||||
_id?: string;
|
||||
|
||||
+13
-3
@@ -90,14 +90,14 @@ export class PermissionsService {
|
||||
}
|
||||
|
||||
/**
|
||||
* Проверяет, является ли пользователь вкладчиком проекта
|
||||
* Проверяет, является ли пользователь участником проекта
|
||||
* @param username - имя пользователя (может быть undefined для гостей)
|
||||
* @param coopname - имя кооператива
|
||||
* @param projectHash - хеш проекта
|
||||
* @returns true если пользователь является вкладчиком проекта (имеет подтвержденное приложение)
|
||||
* @returns true если пользователь является участником проекта (имеет подтвержденное приложение)
|
||||
*/
|
||||
private async isProjectContributor(username: string | undefined, coopname: string, projectHash: string): Promise<boolean> {
|
||||
// Если username не указан, пользователь не является вкладчиком
|
||||
// Если username не указан, пользователь не является участником
|
||||
if (!username) {
|
||||
return false;
|
||||
}
|
||||
@@ -208,6 +208,7 @@ export class PermissionsService {
|
||||
can_manage_authors: false,
|
||||
can_set_plan: false,
|
||||
has_clearance: false,
|
||||
pending_clearance: false,
|
||||
is_guest: true,
|
||||
};
|
||||
}
|
||||
@@ -230,6 +231,9 @@ export class PermissionsService {
|
||||
can_manage_authors: true,
|
||||
can_set_plan: true,
|
||||
has_clearance: hasClearance,
|
||||
pending_clearance: project.coopname
|
||||
? (await this.appendixRepository.findCreatedByUsernameAndProjectHash(username, project.project_hash)) !== null
|
||||
: false,
|
||||
is_guest: false,
|
||||
};
|
||||
}
|
||||
@@ -246,6 +250,11 @@ export class PermissionsService {
|
||||
? await this.isProjectContributor(username, project.coopname, project.project_hash)
|
||||
: false;
|
||||
|
||||
// Проверяем, есть ли у пользователя запрос на получение допуска в рассмотрении
|
||||
const hasPendingClearance = project.coopname
|
||||
? (await this.appendixRepository.findCreatedByUsernameAndProjectHash(username, project.project_hash)) !== null
|
||||
: false;
|
||||
|
||||
// Расчет прав:
|
||||
// can_edit_project: только мастер проекта
|
||||
const can_edit_project = isMaster;
|
||||
@@ -277,6 +286,7 @@ export class PermissionsService {
|
||||
can_manage_authors,
|
||||
can_set_plan,
|
||||
has_clearance: isContributor,
|
||||
pending_clearance: hasPendingClearance,
|
||||
is_guest: false,
|
||||
};
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user