3#include <eosio/eosio.hpp>
4#include <eosio/asset.hpp>
40 bool is_author =
false;
41 bool is_creator =
false;
42 bool is_coordinator =
false;
43 bool is_investor =
false;
44 bool is_propertor =
false;
45 bool is_contributor =
false;
46 bool has_vote =
false;
72 double last_author_base_reward_per_share = 0.0;
73 double last_author_bonus_reward_per_share = 0.0;
74 double last_contributor_reward_per_share = 0.0;
116 typedef eosio::multi_index<
117 "segments"_n, segment,
118 indexed_by<
"byproject"_n, const_mem_fun<segment, checksum256, &segment::by_project_hash>>,
119 indexed_by<
"byprojuser"_n, const_mem_fun<segment, uint128_t, &segment::by_project_user>>
123 inline std::optional<segment>
get_segment(eosio::name coopname,
const checksum256 &project_hash, eosio::name username) {
125 auto idx = segments.get_index<
"byprojuser"_n>();
128 auto it = idx.find(rkey);
129 if (it == idx.end()) {
136 auto maybe_segment =
get_segment(coopname, project_hash, username);
137 eosio::check(maybe_segment.has_value(), msg);
138 return *maybe_segment;
149 auto project_idx = segments.get_index<
"byproject"_n>();
151 std::vector<segment> authors;
152 auto itr = project_idx.find(project_hash);
153 while (itr != project_idx.end() && itr->project_hash == project_hash) {
154 if (itr->is_author) {
155 authors.push_back(*itr);
170 auto project_idx = segments.get_index<
"byproject"_n>();
172 std::vector<segment> creators;
173 auto itr = project_idx.find(project_hash);
174 while (itr != project_idx.end() && itr->project_hash == project_hash) {
175 if (itr->is_creator) {
176 creators.push_back(*itr);
191 auto project_idx = segments.get_index<
"byproject"_n>();
193 std::vector<segment> coordinators;
194 auto itr = project_idx.find(project_hash);
195 while (itr != project_idx.end() && itr->project_hash == project_hash) {
196 if (itr->is_coordinator) {
197 coordinators.push_back(*itr);
212 auto project_idx = segments.get_index<
"byproject"_n>();
214 std::vector<segment> investors;
215 auto itr = project_idx.find(project_hash);
216 while (itr != project_idx.end() && itr->project_hash == project_hash) {
217 if (itr->is_investor) {
218 investors.push_back(*itr);
233 auto project_idx = segments.get_index<
"byproject"_n>();
236 auto itr = project_idx.find(project_hash);
237 while (itr != project_idx.end() && itr->project_hash == project_hash) {
238 if (itr->is_author) {
267inline bool is_segment_updated(eosio::name coopname,
const checksum256 &project_hash, eosio::name username) {
291 return author_updated && coordinator_updated && contributor_updated && invest_pool_updated && creators_base_pool_updated;
298 const char* msg =
"Сегмент не обновлен. Необходимо выполнить rfrshsegment") {
362 auto idx = segments.get_index<
"byprojuser"_n>();
364 auto segment_itr = idx.find(key);
366 eosio::check(segment_itr != idx.end(),
"Сегмент участника не найден");
370 idx.modify(segment_itr,
_capital, [&](
auto &s) {
373 s.total_segment_cost = s.total_segment_base_cost + s.total_segment_bonus_cost;
381 eosio::name username, eosio::name new_status) {
383 auto idx = segments.get_index<
"byprojuser"_n>();
385 auto segment_itr = idx.find(key);
387 eosio::check(segment_itr != idx.end(),
"Сегмент участника не найден");
389 idx.modify(segment_itr,
_capital, [&](
auto &s) {
390 s.status = new_status;
399 eosio::name username,
402 auto idx = segments.get_index<
"byprojuser"_n>();
404 auto segment_itr = idx.find(key);
406 eosio::check(segment_itr != idx.end(),
"Сегмент участника не найден");
408 idx.modify(segment_itr, coopname, [&](
auto &s) {
413 if (debt_settled_amount.amount > 0) {
414 s.debt_settled += debt_settled_amount;
423 eosio::name username,
424 eosio::asset voting_amount,
425 eosio::asset equal_author_amount,
426 eosio::asset direct_creator_amount) {
428 auto idx = segments.get_index<
"byprojuser"_n>();
430 auto segment_itr = idx.find(key);
432 eosio::check(segment_itr != idx.end(),
"Сегмент участника не найден");
434 idx.modify(segment_itr, coopname, [&](
auto &s) {
435 s.voting_bonus = voting_amount;
436 s.equal_author_bonus = equal_author_amount;
437 s.direct_creator_bonus = direct_creator_amount;
446 auto segment_itr = segments.find(segment_id);
448 segments.modify(segment_itr, coopname, [&](
auto &s) {
450 s.investor_amount = used_amount;
457 auto segment = segments.find(segment_id);
459 segments.modify(
segment, coopname, [&](
auto &s) {
466 auto segment = segments.find(segment_id);
470 segments.modify(
segment, coopname, [&](
auto &s) {
481inline void remove_segment(eosio::name coopname,
const checksum256 &project_hash, eosio::name username) {
483 auto idx = segments.get_index<
"byprojuser"_n>();
485 auto segment_itr = idx.find(key);
487 eosio::check(segment_itr != idx.end(),
"Сегмент участника не найден");
489 idx.erase(segment_itr);
501 auto idx = segments.get_index<
"byproject"_n>();
502 auto it = idx.lower_bound(project_hash);
504 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:210
contract
Definition: eosio.msig_tests.cpp:977
share_type amount
Definition: eosio.token_tests.cpp:174
const eosio::name COMPLETED
Проект завершен
Definition: projects.hpp:26
project get_project_or_fail(eosio::name coopname, const checksum256 &project_hash)
Получает проект по хэшу, если проект не найден, выбрасывает исключение
Definition: projects.hpp:116
const eosio::name ACCEPTED
Результат принят советом
Definition: segments.hpp:18
const eosio::name GENERATION
На генерации результата
Definition: segments.hpp:16
const eosio::name COMPLETED
Сконвертирован
Definition: segments.hpp:19
const eosio::name CONTRIBUTED
Результат внесён, долг погашен, готов к конвертации
Definition: segments.hpp:17
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:135
eosio::asset calculate_segment_bonus_cost(const segment &seg, const Capital::project &project)
Рассчитывает бонусную стоимость сегмента
Definition: segments.hpp:326
std::vector< segment > get_project_creators(eosio::name coopname, const checksum256 &project_hash)
Получает всех создателей проекта.
Definition: segments.hpp:168
std::optional< segment > get_segment(eosio::name coopname, const checksum256 &project_hash, eosio::name username)
Definition: segments.hpp:123
uint64_t count_project_authors(eosio::name coopname, const checksum256 &project_hash)
Подсчитывает количество авторов в проекте.
Definition: segments.hpp:231
bool is_voting_participant(eosio::name coopname, const checksum256 &project_hash, eosio::name username)
Проверяет является ли пользователь участником голосования
Definition: segments.hpp:255
std::vector< segment > get_project_investors(eosio::name coopname, const checksum256 &project_hash)
Получает всех инвесторов проекта.
Definition: segments.hpp:210
void decrease_debt_amount(eosio::name coopname, uint64_t segment_id, eosio::asset amount)
Definition: segments.hpp:464
eosio::asset calculate_total_segment_cost(const segment &seg, const Capital::project &project)
Рассчитывает общую стоимость сегмента
Definition: segments.hpp:353
std::vector< segment > get_project_coordinators(eosio::name coopname, const checksum256 &project_hash)
Получает всех координаторов проекта.
Definition: segments.hpp:189
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:398
bool has_project_segments(eosio::name coopname, const checksum256 &project_hash)
Проверяет наличие сегментов в проекте
Definition: segments.hpp:499
void increase_debt_amount(eosio::name coopname, uint64_t segment_id, eosio::asset amount)
Definition: segments.hpp:455
std::vector< segment > get_project_authors(eosio::name coopname, const checksum256 &project_hash)
Получает всех авторов проекта.
Definition: segments.hpp:147
void check_segment_is_updated(eosio::name coopname, const checksum256 &project_hash, eosio::name username, const char *msg="Сегмент не обновлен. Необходимо выполнить rfrshsegment")
Проверяет является ли сегмент обновленным или падает с ошибкой
Definition: segments.hpp:297
void update_segment_status(eosio::name coopname, const checksum256 &project_hash, eosio::name username, eosio::name new_status)
Обновляет статус результата в сегменте
Definition: segments.hpp:380
void update_segment_voting_results(eosio::name coopname, const checksum256 &project_hash, eosio::name username, eosio::asset voting_amount, eosio::asset equal_author_amount, eosio::asset direct_creator_amount)
Обновляет сегмент участника результатами голосования и премиями
Definition: segments.hpp:422
void set_investor_base_amount_on_return_unused(eosio::name coopname, uint64_t segment_id, eosio::asset used_amount)
Definition: segments.hpp:444
void update_segment_total_cost(eosio::name coopname, const checksum256 &project_hash, eosio::name username)
Обновляет все стоимости сегмента (базовые, бонусные и общую)
Definition: segments.hpp:360
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:120
bool is_segment_updated(eosio::name coopname, const checksum256 &project_hash, eosio::name username)
Проверяет является ли сегмент обновленным (CRPS актуален и инвестиции синхронизированы)
Definition: segments.hpp:267
void remove_segment(eosio::name coopname, const checksum256 &project_hash, eosio::name username)
Удаляет сегмент участника
Definition: segments.hpp:481
eosio::asset calculate_segment_base_cost(const segment &seg)
Рассчитывает базовую стоимость сегмента
Definition: segments.hpp:307
Definition: eosio.msig.hpp:34
Таблица сегментов хранит данные о вкладах участника в проект.
Definition: segments.hpp:30
double last_author_base_reward_per_share
Последняя зафиксированная базовая награда на долю для авторов
Definition: segments.hpp:72
bool is_investor
Является ли участник инвестором
Definition: segments.hpp:43
eosio::asset creator_bonus
Сумма бонусов, которую создатель получил за выполнение проекта
Definition: segments.hpp:55
eosio::asset debt_amount
Сумма, которая уже выдана в ссуду
Definition: segments.hpp:90
double last_author_bonus_reward_per_share
Последняя зафиксированная бонусная награда на долю для авторов
Definition: segments.hpp:73
uint128_t by_project_user() const
Definition: segments.hpp:110
bool is_coordinator
Является ли участник координатором
Definition: segments.hpp:42
checksum256 project_hash
Хэш проекта
Definition: segments.hpp:32
eosio::asset author_bonus
Сумма бонусов, которую автор получил за выполнение проекта
Definition: segments.hpp:59
eosio::name username
Имя участника
Definition: segments.hpp:34
eosio::asset coordinator_base
Сумма себестоимости, которую координатор фактически потратил на выполнение проекта
Definition: segments.hpp:63
uint64_t primary_key() const
Первичный ключ (1)
Definition: segments.hpp:105
checksum256 by_project_hash() const
Индекс по хэшу проекта (2)
Definition: segments.hpp:107
eosio::asset creator_base
Сумма себестоимости, которую создатель фактически потратил на выполнение проекта
Definition: segments.hpp:54
eosio::asset author_base
Сумма себестоимости, которую автор фактически потратил на выполнение проекта
Definition: segments.hpp:58
eosio::asset last_known_coordinators_investment_pool
Последняя известная сумма инвестиций координаторов
Definition: segments.hpp:86
eosio::asset property_base
Стоимость внесенного имущества участника
Definition: segments.hpp:69
uint64_t id
ID сегмента (внутренний ключ)
Definition: segments.hpp:31
eosio::asset last_known_creators_base_pool
Последняя известная сумма базового пула создателей
Definition: segments.hpp:83
eosio::asset last_known_invest_pool
Последняя известная сумма инвестиций в проекте
Definition: segments.hpp:80
eosio::asset voting_bonus
Сумма от голосования авторского пула
Definition: segments.hpp:98
eosio::asset contributor_bonus
Сумма бонусов, которую вкладчик получил от проекта
Definition: segments.hpp:66
bool is_author
Является ли участник автором
Definition: segments.hpp:40
bool is_contributor
Является ли участник вкладчиком
Definition: segments.hpp:45
eosio::asset direct_creator_bonus
Сумма прямых премий создателю
Definition: segments.hpp:95
bool has_vote
Имеет ли участник право голоса
Definition: segments.hpp:46
eosio::asset investor_base
Фактически используемая сумма инвестора при коэффициенте возврата > 1.
Definition: segments.hpp:51
eosio::name coopname
Имя кооператива
Definition: segments.hpp:33
eosio::asset equal_author_bonus
Сумма равных премий авторам
Definition: segments.hpp:94
double last_contributor_reward_per_share
Последняя зафиксированная награда на долю для вкладчиков
Definition: segments.hpp:74
double author_base_cumulative_reward_per_share
Накопительная базовая награда на авторскую долю
Definition: crps.hpp:23
double contributor_cumulative_reward_per_share
Накопительная награда на вкладчическую долю
Definition: crps.hpp:25
double author_bonus_cumulative_reward_per_share
Накопительная бонусная награда на авторскую долю
Definition: crps.hpp:24
eosio::asset invest_pool
Фактические инвестиции от инвесторов (после вычета расходов)
Definition: fact_pool.hpp:39
eosio::asset coordinators_investment_pool
Фактические инвестиции, привлеченные координаторами
Definition: fact_pool.hpp:40
eosio::asset creators_base_pool
Фактическая себестоимость создателей
Definition: fact_pool.hpp:23
Таблица проектов хранит информацию о проектах кооператива, которые станут результатами.
Definition: projects.hpp:40
fact_pool fact
Фактические показатели
Definition: projects.hpp:63
eosio::name status
Статус проекта
Definition: projects.hpp:47
crps_data crps
Данные CRPS для распределения наград
Definition: projects.hpp:64
static uint128_t combine_checksum_ids(const checksum256 &hash, eosio::name username)
Definition: utils.hpp:9