4#include "../../../lib/core/ram_payer.hpp"
5#include <eosio/eosio.hpp>
6#include <eosio/asset.hpp>
19 const eosio::name
READY =
"ready"_n;
23 const eosio::name
ACT1 =
"act1"_n;
46 bool is_author =
false;
47 bool is_creator =
false;
48 bool is_coordinator =
false;
49 bool is_investor =
false;
50 bool is_propertor =
false;
51 bool is_contributor =
false;
52 bool has_vote =
false;
78 double last_author_base_reward_per_share = 0.0;
79 double last_author_bonus_reward_per_share = 0.0;
80 double last_contributor_reward_per_share = 0.0;
104 bool is_votes_calculated =
false;
116 double share_percent = 0.0;
129 typedef eosio::multi_index<
130 "segments"_n, segment,
131 indexed_by<
"byproject"_n, const_mem_fun<segment, checksum256, &segment::by_project_hash>>,
132 indexed_by<
"byprojuser"_n, const_mem_fun<segment, uint128_t, &segment::by_project_user>>
136 inline std::optional<segment>
get_segment(eosio::name coopname,
const checksum256 &project_hash, eosio::name username) {
138 auto idx = segments.get_index<
"byprojuser"_n>();
141 auto it = idx.find(rkey);
142 if (it == idx.end()) {
149 auto maybe_segment =
get_segment(coopname, project_hash, username);
150 eosio::check(maybe_segment.has_value(), msg);
151 return maybe_segment.value();
156 auto segment_itr = segments.find(segment_id);
157 eosio::check(segment_itr != segments.end(), msg);
170 auto project_idx = segments.get_index<
"byproject"_n>();
173 std::vector<uint64_t> author_ids;
175 auto itr = project_idx.find(project_hash);
176 while (itr != project_idx.end() && itr->project_hash == project_hash) {
177 if (itr->is_author) {
178 author_ids.push_back(itr->id);
184 return author_ids.size();
241 return base_contribution + bonus_contribution;
294 auto segment = segments.find(segment_id);
296 eosio::check(
segment != segments.end(),
"Сегмент участника не найден");
301 s.total_segment_cost = s.total_segment_base_cost + s.total_segment_bonus_cost;
303 eosio::check(s.total_segment_cost >= s.investor_base,
"Сумма всех вкладов сегмента должна быть больше или равна сумме инвестиций инвестора");
306 s.intellectual_cost = s.total_segment_cost - s.investor_base;
308 eosio::check(s.intellectual_cost >= s.debt_amount,
"Интеллектуальная стоимость должна быть больше или равна сумме выданных ссуд");
310 s.available_for_program = s.intellectual_cost - s.debt_amount;
312 eosio::check(s.provisional_amount >= s.debt_amount,
"Доступная сумма для конвертации в кошелек должна быть больше или равна сумме выданных ссуд");
314 s.available_for_wallet = s.provisional_amount - s.debt_amount;
318 s.share_percent = (
static_cast<double>(s.intellectual_cost.amount) /
321 s.share_percent = 0.0;
330 eosio::name username, eosio::name new_status) {
332 auto idx = segments.get_index<
"byprojuser"_n>();
334 auto segment_itr = idx.find(key);
336 eosio::check(segment_itr != idx.end(),
"Сегмент участника не найден");
338 idx.modify(segment_itr,
RamPayer::of(idx, coopname), [&](
auto &s) {
339 s.status = new_status;
348 eosio::name username,
351 auto idx = segments.get_index<
"byprojuser"_n>();
353 auto segment_itr = idx.find(key);
355 eosio::check(segment_itr != idx.end(),
"Сегмент участника не найден");
357 idx.modify(segment_itr,
RamPayer::of(idx, coopname), [&](
auto &s) {
362 if (debt_settled_amount.amount > 0) {
363 s.debt_settled += debt_settled_amount;
378 eosio::name username,
379 eosio::asset voting_amount,
380 eosio::asset equal_author_amount,
381 eosio::asset direct_creator_amount) {
383 auto segment_itr = segments.find(
segment.
id);
385 eosio::check(segment_itr != segments.end(),
"Сегмент участника не найден");
387 segments.modify(segment_itr,
RamPayer::of(segments, coopname), [&](
auto &s) {
388 s.voting_bonus = voting_amount;
389 s.equal_author_bonus = equal_author_amount;
390 s.direct_creator_bonus = direct_creator_amount;
391 s.is_votes_calculated =
true;
400 auto segment_itr = segments.find(segment_id);
402 segments.modify(segment_itr,
RamPayer::of(segments, coopname), [&](
auto &s) {
404 s.investor_amount = used_amount;
406 s.investor_base = used_amount;
413 auto segment = segments.find(segment_id);
422 auto segment = segments.find(segment_id);
438 auto segment = segments.find(segment_id);
440 eosio::check(
segment != segments.end(),
"Сегмент участника не найден");
453 auto project_idx = segments.get_index<
"byproject"_n>();
454 std::vector<uint64_t> ids;
456 auto itr = project_idx.find(project_hash);
457 while (itr != project_idx.end() && itr->project_hash == project_hash) {
458 ids.push_back(itr->id);
462 for (uint64_t
id : ids) {
476 segments.emplace(
RamPayer::of(segments, coopname), [&](
auto &g){
478 g.coopname = coopname;
480 g.username = username;
497 auto segment = segments.find(segment_id);
499 eosio::check(
segment != segments.end(),
"Сегмент участника не найден");
505 g.last_author_base_reward_per_share = project.crps.author_base_cumulative_reward_per_share;
506 g.last_author_bonus_reward_per_share = project.crps.author_bonus_cumulative_reward_per_share;
519 auto idx = segments.get_index<
"byproject"_n>();
520 auto it = idx.lower_bound(project_hash);
522 return it != idx.end() && it->project_hash == project_hash;
static constexpr eosio::name _capital
Definition: consts.hpp:171
static constexpr eosio::symbol _root_govern_symbol
Definition: consts.hpp:236
contract
Definition: eosio.msig_tests.cpp:977
share_type amount
Definition: eosio.token_tests.cpp:174
const eosio::name RESULT
Проект завершен
Definition: projects.hpp:27
const eosio::name STATEMENT
Сегмент на стадии взноса результата (заявление подано)
Definition: segments.hpp:20
const eosio::name READY
Проект завершен, ожидает внесения результата
Definition: segments.hpp:19
const eosio::name GENERATION
На генерации результата
Definition: segments.hpp:18
const eosio::name APPROVED
Результат одобрен председателем
Definition: segments.hpp:21
const eosio::name AUTHORIZED
Результат авторизован советом
Definition: segments.hpp:22
const eosio::name SKIPPED
Внесение результата пропущено за отсутствием интеллектуальной части
Definition: segments.hpp:25
const eosio::name CONTRIBUTED
Результат внесён и принят (второй акт подписан)
Definition: segments.hpp:24
const eosio::name ACT1
Первый акт подписан участником
Definition: segments.hpp:23
Definition: segments.hpp:10
segment get_segment_or_fail(eosio::name coopname, const checksum256 &project_hash, eosio::name username, const char *msg)
Definition: segments.hpp:148
eosio::asset calculate_segment_bonus_cost(const segment &seg, const Capital::project &project)
Рассчитывает бонусную стоимость сегмента
Definition: segments.hpp:268
void remove_segment(eosio::name coopname, uint64_t segment_id)
Удаляет сегмент участника
Definition: segments.hpp:436
std::optional< segment > get_segment(eosio::name coopname, const checksum256 &project_hash, eosio::name username)
Definition: segments.hpp:136
uint64_t count_project_authors(eosio::name coopname, const checksum256 &project_hash)
Подсчитывает количество авторов в проекте.
Definition: segments.hpp:168
bool is_voting_participant(eosio::name coopname, const checksum256 &project_hash, eosio::name username)
Проверяет является ли пользователь участником голосования
Definition: segments.hpp:196
uint64_t get_segment_id(eosio::name coopname)
Definition: segments.hpp:369
void decrease_debt_amount(eosio::name coopname, uint64_t segment_id, eosio::asset amount)
Definition: segments.hpp:420
void remove_all_project_segments(eosio::name coopname, const checksum256 &project_hash)
Удаляет все сегменты участников проекта (по secondary index byproject)
Definition: segments.hpp:451
void update_segment_author_status(eosio::name coopname, uint64_t segment_id, const Capital::project &project)
Обновляет сегмент, устанавливая статус автора
Definition: segments.hpp:495
eosio::asset calculate_non_investor_contribution(const segment &seg)
Рассчитывает сумму неинвестиционных вкладов сегмента (для внесения результата)
Definition: segments.hpp:232
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:347
bool has_project_segments(eosio::name coopname, const checksum256 &project_hash)
Проверяет наличие сегментов в проекте
Definition: segments.hpp:517
void increase_debt_amount(eosio::name coopname, uint64_t segment_id, eosio::asset amount)
Definition: segments.hpp:411
void create_author_segment(eosio::name coopname, eosio::name username, const Capital::project &project)
Создает сегмент автора для проекта
Definition: segments.hpp:473
void update_segment_status(eosio::name coopname, const checksum256 &project_hash, eosio::name username, eosio::name new_status)
Обновляет статус результата в сегменте
Definition: segments.hpp:329
void update_segment_total_cost(eosio::name coopname, uint64_t segment_id, const Capital::project &project)
Обновляет все стоимости сегмента (базовые, бонусные и общую)
Definition: segments.hpp:292
bool has_intellectual_contribution_roles(const segment &seg)
Проверяет имеет ли участник роли, требующие внесения интеллектуального результата
Definition: segments.hpp:219
void set_investor_base_amount_on_return_unused(eosio::name coopname, uint64_t segment_id, eosio::asset used_amount)
Definition: segments.hpp:398
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:133
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:376
eosio::asset calculate_segment_base_cost(const segment &seg)
Рассчитывает базовую стоимость сегмента
Definition: segments.hpp:249
segment get_segment_by_id_or_fail(eosio::name coopname, uint64_t segment_id, const char *msg="Сегмент не найден")
Definition: segments.hpp:154
bool is_pure_investor(const segment &seg)
Проверяет является ли участник чистым инвестором (только инвестор, без других интеллектуальных ролей)
Definition: segments.hpp:206
eosio::name of(const Table &table, eosio::name coopname)
Definition: ram_payer.hpp:78
Definition: eosio.msig.hpp:34
RAM_PAYER_CLASS(Capital::Segments::segment, contract)
Таблица сегментов хранит данные о вкладах участника в проект.
Definition: segments.hpp:36
bool is_investor
Является ли участник инвестором
Definition: segments.hpp:49
eosio::asset creator_bonus
Сумма бонусов, которую исполнитель получил за выполнение проекта
Definition: segments.hpp:61
eosio::asset debt_amount
Сумма, которая уже выдана в ссуду
Definition: segments.hpp:96
uint128_t by_project_user() const
Definition: segments.hpp:123
bool is_coordinator
Является ли участник координатором
Definition: segments.hpp:48
checksum256 project_hash
Хэш проекта
Definition: segments.hpp:38
eosio::asset author_bonus
Сумма бонусов, которую автор получил за выполнение проекта
Definition: segments.hpp:65
eosio::name username
Имя участника
Definition: segments.hpp:40
eosio::asset coordinator_base
Сумма себестоимости, которую координатор фактически потратил на выполнение проекта
Definition: segments.hpp:69
uint64_t primary_key() const
Первичный ключ (1)
Definition: segments.hpp:118
checksum256 by_project_hash() const
Индекс по хэшу проекта (2)
Definition: segments.hpp:120
eosio::asset creator_base
Сумма себестоимости, которую исполнитель фактически потратил на выполнение проекта
Definition: segments.hpp:60
eosio::asset author_base
Сумма себестоимости, которую автор фактически потратил на выполнение проекта
Definition: segments.hpp:64
eosio::asset property_base
Стоимость внесенного имущества участника
Definition: segments.hpp:75
uint64_t id
ID сегмента (внутренний ключ)
Definition: segments.hpp:37
eosio::asset voting_bonus
Сумма от голосования авторского пула
Definition: segments.hpp:105
eosio::asset contributor_bonus
Сумма бонусов, которую участник получил от проекта
Definition: segments.hpp:72
bool is_creator
Является ли участник создателем
Definition: segments.hpp:47
bool is_author
Является ли участник автором
Definition: segments.hpp:46
bool is_propertor
Является ли участник пропертором
Definition: segments.hpp:50
bool is_contributor
Является ли участник участником
Definition: segments.hpp:51
eosio::asset direct_creator_bonus
Сумма прямых премий создателю
Definition: segments.hpp:101
bool has_vote
Имеет ли участник право голоса
Definition: segments.hpp:52
eosio::asset investor_base
Фактически используемая сумма инвестора при коэффициенте возврата > 1.
Definition: segments.hpp:57
eosio::name coopname
Имя кооператива
Definition: segments.hpp:39
eosio::asset equal_author_bonus
Сумма равных премий авторам
Definition: segments.hpp:100
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:41
checksum256 project_hash
Хэш проекта (внешний ключ)
Definition: projects.hpp:45
fact_pool fact
Фактические показатели
Definition: projects.hpp:68
eosio::name status
Статус проекта
Definition: projects.hpp:48
crps_data crps
Данные CRPS для распределения наград
Definition: projects.hpp:69
uint64_t get_global_id_in_scope(eosio::name _me, eosio::name scope, eosio::name key)
Definition: table_counts.hpp:62
static uint128_t combine_checksum_ids(const checksum256 &hash, eosio::name username)
Definition: utils.hpp:11