3#include <eosio/eosio.hpp>
4#include <eosio/asset.hpp>
17 const eosio::name
READY =
"ready"_n;
21 const eosio::name
ACT1 =
"act1"_n;
44 bool is_author =
false;
45 bool is_creator =
false;
46 bool is_coordinator =
false;
47 bool is_investor =
false;
48 bool is_propertor =
false;
49 bool is_contributor =
false;
50 bool has_vote =
false;
76 double last_author_base_reward_per_share = 0.0;
77 double last_author_bonus_reward_per_share = 0.0;
78 double last_contributor_reward_per_share = 0.0;
102 bool is_votes_calculated =
false;
114 double share_percent = 0.0;
127 typedef eosio::multi_index<
128 "segments"_n, segment,
129 indexed_by<
"byproject"_n, const_mem_fun<segment, checksum256, &segment::by_project_hash>>,
130 indexed_by<
"byprojuser"_n, const_mem_fun<segment, uint128_t, &segment::by_project_user>>
134 inline std::optional<segment>
get_segment(eosio::name coopname,
const checksum256 &project_hash, eosio::name username) {
136 auto idx = segments.get_index<
"byprojuser"_n>();
139 auto it = idx.find(rkey);
140 if (it == idx.end()) {
147 auto maybe_segment =
get_segment(coopname, project_hash, username);
148 eosio::check(maybe_segment.has_value(), msg);
149 return maybe_segment.value();
154 auto segment_itr = segments.find(segment_id);
155 eosio::check(segment_itr != segments.end(), msg);
168 auto project_idx = segments.get_index<
"byproject"_n>();
171 std::vector<uint64_t> author_ids;
173 auto itr = project_idx.find(project_hash);
174 while (itr != project_idx.end() && itr->project_hash == project_hash) {
175 if (itr->is_author) {
176 author_ids.push_back(itr->id);
182 return author_ids.size();
239 return base_contribution + bonus_contribution;
292 auto segment = segments.find(segment_id);
294 eosio::check(
segment != segments.end(),
"Сегмент участника не найден");
296 segments.modify(
segment, coopname, [&](
auto &s) {
299 s.total_segment_cost = s.total_segment_base_cost + s.total_segment_bonus_cost;
301 eosio::check(s.total_segment_cost >= s.investor_base,
"Сумма всех вкладов сегмента должна быть больше или равна сумме инвестиций инвестора");
304 s.intellectual_cost = s.total_segment_cost - s.investor_base;
306 eosio::check(s.intellectual_cost >= s.debt_amount,
"Интеллектуальная стоимость должна быть больше или равна сумме выданных ссуд");
308 s.available_for_program = s.intellectual_cost - s.debt_amount;
310 eosio::check(s.provisional_amount >= s.debt_amount,
"Доступная сумма для конвертации в кошелек должна быть больше или равна сумме выданных ссуд");
312 s.available_for_wallet = s.provisional_amount - s.debt_amount;
316 s.share_percent = (
static_cast<double>(s.intellectual_cost.amount) /
319 s.share_percent = 0.0;
328 eosio::name username, eosio::name new_status) {
330 auto idx = segments.get_index<
"byprojuser"_n>();
332 auto segment_itr = idx.find(key);
334 eosio::check(segment_itr != idx.end(),
"Сегмент участника не найден");
336 idx.modify(segment_itr,
_capital, [&](
auto &s) {
337 s.status = new_status;
346 eosio::name username,
349 auto idx = segments.get_index<
"byprojuser"_n>();
351 auto segment_itr = idx.find(key);
353 eosio::check(segment_itr != idx.end(),
"Сегмент участника не найден");
355 idx.modify(segment_itr, coopname, [&](
auto &s) {
360 if (debt_settled_amount.amount > 0) {
361 s.debt_settled += debt_settled_amount;
376 eosio::name username,
377 eosio::asset voting_amount,
378 eosio::asset equal_author_amount,
379 eosio::asset direct_creator_amount) {
381 auto segment_itr = segments.find(
segment.
id);
383 eosio::check(segment_itr != segments.end(),
"Сегмент участника не найден");
385 segments.modify(segment_itr, coopname, [&](
auto &s) {
386 s.voting_bonus = voting_amount;
387 s.equal_author_bonus = equal_author_amount;
388 s.direct_creator_bonus = direct_creator_amount;
389 s.is_votes_calculated =
true;
398 auto segment_itr = segments.find(segment_id);
400 segments.modify(segment_itr, coopname, [&](
auto &s) {
402 s.investor_amount = used_amount;
404 s.investor_base = used_amount;
411 auto segment = segments.find(segment_id);
413 segments.modify(
segment, coopname, [&](
auto &s) {
420 auto segment = segments.find(segment_id);
424 segments.modify(
segment, coopname, [&](
auto &s) {
436 auto segment = segments.find(segment_id);
438 eosio::check(
segment != segments.end(),
"Сегмент участника не найден");
451 auto project_idx = segments.get_index<
"byproject"_n>();
452 std::vector<uint64_t> ids;
454 auto itr = project_idx.find(project_hash);
455 while (itr != project_idx.end() && itr->project_hash == project_hash) {
456 ids.push_back(itr->id);
460 for (uint64_t
id : ids) {
474 segments.emplace(
_capital, [&](
auto &g){
476 g.coopname = coopname;
478 g.username = username;
495 auto segment = segments.find(segment_id);
497 eosio::check(
segment != segments.end(),
"Сегмент участника не найден");
499 segments.modify(
segment, coopname, [&](
auto &g) {
503 g.last_author_base_reward_per_share = project.crps.author_base_cumulative_reward_per_share;
504 g.last_author_bonus_reward_per_share = project.crps.author_bonus_cumulative_reward_per_share;
517 auto idx = segments.get_index<
"byproject"_n>();
518 auto it = idx.lower_bound(project_hash);
520 return it != idx.end() && it->project_hash == project_hash;
static constexpr eosio::name _capital
Definition: consts.hpp:150
static constexpr eosio::symbol _root_govern_symbol
Definition: consts.hpp:209
contract
Definition: eosio.msig_tests.cpp:977
share_type amount
Definition: eosio.token_tests.cpp:174
const eosio::name RESULT
Проект завершен
Definition: projects.hpp:25
const eosio::name STATEMENT
Сегмент на стадии взноса результата (заявление подано)
Definition: segments.hpp:18
const eosio::name READY
Проект завершен, ожидает внесения результата
Definition: segments.hpp:17
const eosio::name GENERATION
На генерации результата
Definition: segments.hpp:16
const eosio::name APPROVED
Результат одобрен председателем
Definition: segments.hpp:19
const eosio::name AUTHORIZED
Результат авторизован советом
Definition: segments.hpp:20
const eosio::name SKIPPED
Внесение результата пропущено за отсутствием интеллектуальной части
Definition: segments.hpp:23
const eosio::name CONTRIBUTED
Результат внесён и принят (второй акт подписан)
Definition: segments.hpp:22
const eosio::name ACT1
Первый акт подписан участником
Definition: segments.hpp:21
Definition: segments.hpp:8
segment get_segment_or_fail(eosio::name coopname, const checksum256 &project_hash, eosio::name username, const char *msg)
Definition: segments.hpp:146
eosio::asset calculate_segment_bonus_cost(const segment &seg, const Capital::project &project)
Рассчитывает бонусную стоимость сегмента
Definition: segments.hpp:266
void remove_segment(eosio::name coopname, uint64_t segment_id)
Удаляет сегмент участника
Definition: segments.hpp:434
std::optional< segment > get_segment(eosio::name coopname, const checksum256 &project_hash, eosio::name username)
Definition: segments.hpp:134
uint64_t count_project_authors(eosio::name coopname, const checksum256 &project_hash)
Подсчитывает количество авторов в проекте.
Definition: segments.hpp:166
bool is_voting_participant(eosio::name coopname, const checksum256 &project_hash, eosio::name username)
Проверяет является ли пользователь участником голосования
Definition: segments.hpp:194
uint64_t get_segment_id(eosio::name coopname)
Definition: segments.hpp:367
void decrease_debt_amount(eosio::name coopname, uint64_t segment_id, eosio::asset amount)
Definition: segments.hpp:418
void remove_all_project_segments(eosio::name coopname, const checksum256 &project_hash)
Удаляет все сегменты участников проекта (по secondary index byproject)
Definition: segments.hpp:449
void update_segment_author_status(eosio::name coopname, uint64_t segment_id, const Capital::project &project)
Обновляет сегмент, устанавливая статус автора
Definition: segments.hpp:493
eosio::asset calculate_non_investor_contribution(const segment &seg)
Рассчитывает сумму неинвестиционных вкладов сегмента (для внесения результата)
Definition: segments.hpp:230
void update_segment_after_result_contribution(eosio::name coopname, const checksum256 &project_hash, eosio::name username, eosio::asset debt_settled_amount=asset(0, _root_govern_symbol))
Объединенная функция: обновляет сегмент после принятия результата и пересчитывает доли участника Опти...
Definition: segments.hpp:345
bool has_project_segments(eosio::name coopname, const checksum256 &project_hash)
Проверяет наличие сегментов в проекте
Definition: segments.hpp:515
void increase_debt_amount(eosio::name coopname, uint64_t segment_id, eosio::asset amount)
Definition: segments.hpp:409
void create_author_segment(eosio::name coopname, eosio::name username, const Capital::project &project)
Создает сегмент автора для проекта
Definition: segments.hpp:471
void update_segment_status(eosio::name coopname, const checksum256 &project_hash, eosio::name username, eosio::name new_status)
Обновляет статус результата в сегменте
Definition: segments.hpp:327
void update_segment_total_cost(eosio::name coopname, uint64_t segment_id, const Capital::project &project)
Обновляет все стоимости сегмента (базовые, бонусные и общую)
Definition: segments.hpp:290
bool has_intellectual_contribution_roles(const segment &seg)
Проверяет имеет ли участник роли, требующие внесения интеллектуального результата
Definition: segments.hpp:217
void set_investor_base_amount_on_return_unused(eosio::name coopname, uint64_t segment_id, eosio::asset used_amount)
Definition: segments.hpp:396
eosio::multi_index< "segments"_n, segment, indexed_by<"byproject"_n, const_mem_fun< segment, checksum256, &segment::by_project_hash > >, indexed_by<"byprojuser"_n, const_mem_fun< segment, uint128_t, &segment::by_project_user > > > segments_index
Definition: segments.hpp:131
void update_segment_voting_results(eosio::name coopname, const Capital::project &project, const segment &segment, eosio::name username, eosio::asset voting_amount, eosio::asset equal_author_amount, eosio::asset direct_creator_amount)
Обновляет сегмент участника результатами голосования и премиями
Definition: segments.hpp:374
eosio::asset calculate_segment_base_cost(const segment &seg)
Рассчитывает базовую стоимость сегмента
Definition: segments.hpp:247
segment get_segment_by_id_or_fail(eosio::name coopname, uint64_t segment_id, const char *msg="Сегмент не найден")
Definition: segments.hpp:152
bool is_pure_investor(const segment &seg)
Проверяет является ли участник чистым инвестором (только инвестор, без других интеллектуальных ролей)
Definition: segments.hpp:204
Definition: eosio.msig.hpp:34
Таблица сегментов хранит данные о вкладах участника в проект.
Definition: segments.hpp:34
bool is_investor
Является ли участник инвестором
Definition: segments.hpp:47
eosio::asset creator_bonus
Сумма бонусов, которую исполнитель получил за выполнение проекта
Definition: segments.hpp:59
eosio::asset total_segment_base_cost
Общая стоимость базовых вкладов сегмента
Definition: segments.hpp:106
eosio::asset debt_amount
Сумма, которая уже выдана в ссуду
Definition: segments.hpp:94
uint128_t by_project_user() const
Definition: segments.hpp:121
bool is_coordinator
Является ли участник координатором
Definition: segments.hpp:46
checksum256 project_hash
Хэш проекта
Definition: segments.hpp:36
eosio::asset author_bonus
Сумма бонусов, которую автор получил за выполнение проекта
Definition: segments.hpp:63
eosio::name username
Имя участника
Definition: segments.hpp:38
eosio::asset coordinator_base
Сумма себестоимости, которую координатор фактически потратил на выполнение проекта
Definition: segments.hpp:67
uint64_t primary_key() const
Первичный ключ (1)
Definition: segments.hpp:116
checksum256 by_project_hash() const
Индекс по хэшу проекта (2)
Definition: segments.hpp:118
eosio::asset creator_base
Сумма себестоимости, которую исполнитель фактически потратил на выполнение проекта
Definition: segments.hpp:58
eosio::asset author_base
Сумма себестоимости, которую автор фактически потратил на выполнение проекта
Definition: segments.hpp:62
eosio::asset property_base
Стоимость внесенного имущества участника
Definition: segments.hpp:73
uint64_t id
ID сегмента (внутренний ключ)
Definition: segments.hpp:35
eosio::asset voting_bonus
Сумма от голосования авторского пула
Definition: segments.hpp:103
eosio::asset contributor_bonus
Сумма бонусов, которую участник получил от проекта
Definition: segments.hpp:70
bool is_creator
Является ли участник создателем
Definition: segments.hpp:45
bool is_author
Является ли участник автором
Definition: segments.hpp:44
bool is_propertor
Является ли участник пропертором
Definition: segments.hpp:48
bool is_contributor
Является ли участник участником
Definition: segments.hpp:49
eosio::asset direct_creator_bonus
Сумма прямых премий создателю
Definition: segments.hpp:99
bool has_vote
Имеет ли участник право голоса
Definition: segments.hpp:50
eosio::asset investor_base
Фактически используемая сумма инвестора при коэффициенте возврата > 1.
Definition: segments.hpp:55
eosio::name coopname
Имя кооператива
Definition: segments.hpp:37
eosio::asset equal_author_bonus
Сумма равных премий авторам
Definition: segments.hpp:98
double author_base_cumulative_reward_per_share
Накопительная базовая награда на авторскую долю
Definition: crps.hpp:23
double author_bonus_cumulative_reward_per_share
Накопительная бонусная награда на авторскую долю
Definition: crps.hpp:24
eosio::asset total
Стоимость результата интеллектуальной деятельности (равна total_contribution)
Definition: fact_pool.hpp:53
Таблица проектов хранит информацию о проектах кооператива, которые станут результатами.
Definition: projects.hpp:40
checksum256 project_hash
Хэш проекта (внешний ключ)
Definition: projects.hpp:44
fact_pool fact
Фактические показатели
Definition: projects.hpp:67
eosio::name status
Статус проекта
Definition: projects.hpp:47
crps_data crps
Данные CRPS для распределения наград
Definition: projects.hpp:68
uint64_t get_global_id_in_scope(eosio::name _me, eosio::name scope, eosio::name key)
Definition: table_counts.hpp:58
static uint128_t combine_checksum_ids(const checksum256 &hash, eosio::name username)
Definition: utils.hpp:11