24 const eosio::name
ACTIVE =
"active"_n;
25 const eosio::name
VOTING =
"voting"_n;
27 const eosio::name
CLOSED =
"closed"_n;
73 time_point_sec created_at = current_time_point();
77 checksum256
by_hash()
const {
return project_hash; }
81typedef eosio::multi_index<
"projects"_n, project,
82 indexed_by<
"bycreatedat"_n, const_mem_fun<project, uint64_t, &project::by_created_at>>,
83 indexed_by<
"byhash"_n, const_mem_fun<project, checksum256, &project::by_hash>>,
84 indexed_by<
"byparenthash"_n, const_mem_fun<project, checksum256, &project::by_parent_hash>>
97 inline std::optional<project>
get_project(eosio::name coopname,
const checksum256 &project_hash) {
99 auto project_hash_index = projects.get_index<
"byhash"_n>();
101 auto project_itr = project_hash_index.find(project_hash);
102 if (project_itr == project_hash_index.end()) {
118 eosio::check(
project.has_value(),
"Проект с указанным хэшем не найден");
129 checksum256 empty_hash = checksum256();
131 if (parent_hash != empty_hash) {
133 eosio::check(parent_project.parent_hash == empty_hash,
134 "Запрещено создавать проекты глубже одного уровня. У родительского проекта не должно быть своего родителя");
149 inline void create_project(eosio::name coopname,
const checksum256 &project_hash,
const checksum256 &parent_hash,
const std::string &title,
const std::string &description,
const std::string &meta,
bool can_convert_to_project) {
153 projects.emplace(coopname, [&](
auto& row) {
156 row.project_hash = project_hash;
157 row.parent_hash = parent_hash;
158 row.coopname = coopname;
160 row.description = description;
162 row.is_planed =
false;
163 row.can_convert_to_project = can_convert_to_project;
173 inline void add_property_base(eosio::name coopname,
const checksum256 &project_hash,
const eosio::asset &property_amount) {
174 auto exist_project =
get_project(coopname, project_hash);
175 eosio::check(exist_project.has_value(),
"Проект не найден");
178 auto project = projects.find(exist_project->id);
182 p.fact.property_base_pool += property_amount;
185 p.fact.total_contribution += property_amount;
186 p.fact.total = p.fact.total_contribution + p.fact.used_expense_pool;
197 auto exist_project =
get_project(coopname, project_hash);
198 eosio::check(exist_project.has_value(),
"Проект не найден");
201 auto project = projects.find(exist_project->id);
205 p.counts.total_commits++;
212 auto cost_diff = delta.hour_cost - p.fact.hour_cost;
213 p.fact.hour_cost += asset(cost_diff.amount / p.counts.total_commits, p.fact.hour_cost.symbol);
224 p.fact.total = p.fact.total_contribution + p.fact.used_expense_pool;
239 inline void set_master(eosio::name coopname, uint64_t project_id, eosio::name master) {
241 auto project_itr = projects.find(project_id);
243 projects.modify(project_itr, coopname, [&](
auto &p) {
255 inline void update_status(eosio::name coopname,
const checksum256 &project_hash, eosio::name new_status) {
259 auto project = projects.find(exist_project.id);
261 projects.modify(
project, coopname, [&](
auto &p) {
272 inline void set_plan(eosio::name coopname,
const checksum256 &project_hash,
const plan_pool &calculated_plan) {
276 auto project = projects.find(exist_project.id);
278 projects.modify(
project, coopname, [&](
auto &p) {
279 p.
plan = calculated_plan;
294 auto project = projects.find(exist_project.id);
296 projects.modify(
project, coopname, [&](
auto &p) {
303 if (expense_gap.amount > 0) {
306 eosio::asset potential_to_expense =
amount * st.config.expense_pool_percent / 100;
309 to_expense_pool = (potential_to_expense.amount <= expense_gap.amount) ? potential_to_expense : expense_gap;
313 eosio::asset to_invest_pool =
amount - to_expense_pool;
316 p.fact.invest_pool += to_invest_pool;
317 p.fact.accumulated_expense_pool += to_expense_pool;
318 p.fact.total_received_investments +=
amount;
333 inline void expand_expense_pool(eosio::name coopname,
const checksum256 &project_hash,
const eosio::asset &additional_amount) {
337 auto project = projects.find(exist_project.id);
339 projects.modify(
project, coopname, [&](
auto &p) {
350 inline void open_project(eosio::name coopname,
const checksum256 &project_hash) {
354 auto project = projects.find(exist_project.id);
356 projects.modify(
project, coopname, [&](
auto &p) {
378 auto project = projects.find(exist_project.id);
380 projects.modify(
project, coopname, [&](
auto &p) {
381 eosio::check(p.fact.accumulated_expense_pool >=
amount,
382 "Недостаточно средств в пуле расходов");
383 p.fact.accumulated_expense_pool -=
amount;
397 auto project = projects.find(exist_project.id);
399 projects.modify(
project, coopname, [&](
auto &p) {
414 auto project = projects.find(exist_project.id);
416 projects.modify(
project, coopname, [&](
auto &p) {
429 p.counts.total_propertors += 1;
441 p.counts.total_investors += 1;
453 p.counts.total_contributors += 1;
465 p.crps.total_capital_contributors_shares += shares;
477 p.counts.total_authors += 1;
489 p.counts.total_coordinators += 1;
501 p.counts.total_creators += 1;
512 auto project = projects.find(exist_project.id);
515 p.voting.votes_received++;
526 auto project = projects.find(exist_project.id);
529 p.voting.total_voters++;
541 const eosio::asset &shares_amount) {
542 if (shares_amount.amount <= 0) {
549 auto project_itr = projects.find(exist_project.id);
551 projects.modify(project_itr,
_capital, [&](
auto &p) {
552 eosio::check(p.membership.total_shares >= shares_amount,
553 "Недостаточно долей в проекте для вычитания");
555 p.membership.total_shares -= shares_amount;
566 const eosio::asset &shares_amount) {
567 if (shares_amount.amount <= 0) {
574 auto project_itr = projects.find(exist_project.id);
576 projects.modify(project_itr,
_capital, [&](
auto &p) {
577 p.membership.total_shares += shares_amount;
588 const eosio::asset &converted_amount) {
589 if (converted_amount.amount <= 0) {
596 auto project_itr = projects.find(exist_project.id);
598 projects.modify(project_itr,
_capital, [&](
auto &p) {
599 p.membership.converted_funds += converted_amount;
607 auto project_itr = projects.find(exist_project.id);
609 projects.modify(project_itr,
_capital, [&](
auto &p) {
610 p.membership.distributed +=
amount;
628 auto project_itr = projects.find(exist_project.id);
630 projects.modify(project_itr,
_capital, [&](
auto &p) {
631 eosio::check(p.membership.available >=
amount,
632 "Недостаточно доступных членских средств в проекте");
634 p.membership.available -=
amount;
652 auto project_itr = projects.find(exist_project.id);
654 projects.modify(project_itr,
_capital, [&](
auto &p) {
655 p.membership.available +=
amount;
663 auto project_itr = projects.find(project_id);
665 projects.modify(project_itr, coopname, [&](
auto &p) {
666 p.fact.total_returned_investments +=
amount;
677 inline void delete_project(eosio::name coopname,
const checksum256 &project_hash) {
681 auto project_itr = projects.find(exist_project.id);
683 projects.erase(project_itr);
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
uint64_t get_global_id_in_scope(eosio::name _me, eosio::name scope, eosio::name key)
Definition: counts.hpp:61
double calculate_return_base_percent(eosio::asset creators_base_pool, eosio::asset authors_base_pool, eosio::asset coordinators_base_pool, eosio::asset invest_pool)
Функция расчета коэффициента возврата себестоимости (для фактических показателей)
Definition: generation.cpp:23
double calculate_use_invest_percent(eosio::asset creators_base_pool, eosio::asset authors_base_pool, eosio::asset coordinators_base_pool, eosio::asset accumulated_expense_pool, eosio::asset used_expense_pool, eosio::asset total_received_investments)
Функция расчета коэффициента возврата инвестиций для фактических показателей
Definition: generation.cpp:72
const eosio::name COMPLETED
Проект завершен
Definition: projects.hpp:26
const eosio::name PENDING
Проект создан
Definition: projects.hpp:23
const eosio::name VOTING
Проект на голосовании
Definition: projects.hpp:25
const eosio::name CLOSED
Проект закрыт
Definition: projects.hpp:27
const eosio::name ACTIVE
Проект активен для коммитов
Definition: projects.hpp:24
Definition: projects.hpp:15
void increment_total_contributor_shares(eosio::name coopname, const checksum256 &project_hash, eosio::asset shares)
Увеличивает количество вкладчических долей в проекте на указанное количество
Definition: projects.hpp:460
void add_project_converted_funds(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &converted_amount)
Добавляет сконвертированные средства в проект
Definition: projects.hpp:587
void increment_total_investors(eosio::name coopname, const checksum256 &project_hash)
Увеличивает количество инвесторов в проекте на 1.
Definition: projects.hpp:436
void add_membership_available(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &amount)
Добавляет доступные членские средства в проект
Definition: projects.hpp:644
std::optional< project > get_project(eosio::name coopname, const checksum256 &project_hash)
Получает проект по хэшу
Definition: projects.hpp:97
void increment_total_voters(eosio::name coopname, const checksum256 &project_hash)
Увеличивает счетчик общего количества участников голосования в проекте
Definition: projects.hpp:522
void return_expense_funds(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &amount)
Возвращает зарезервированные средства в accumulated_expense_pool.
Definition: projects.hpp:393
void add_project_membership_shares(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &shares_amount)
Добавляет доли в общий пул долей проекта (только от конвертации в кошелек проекта)
Definition: projects.hpp:565
void set_plan(eosio::name coopname, const checksum256 &project_hash, const plan_pool &calculated_plan)
Устанавливает плановые показатели проекта.
Definition: projects.hpp:272
void reserve_expense_funds(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &amount)
Резервирует средства для расхода, уменьшая accumulated_expense_pool.
Definition: projects.hpp:374
project get_project_or_fail(eosio::name coopname, const checksum256 &project_hash)
Получает проект по хэшу, если проект не найден, выбрасывает исключение
Definition: projects.hpp:116
void create_project(eosio::name coopname, const checksum256 &project_hash, const checksum256 &parent_hash, const std::string &title, const std::string &description, const std::string &meta, bool can_convert_to_project)
Создает проект
Definition: projects.hpp:149
void open_project(eosio::name coopname, const checksum256 &project_hash)
Открывает проект для инвестиций, копируя плановые показатели расходов в фактические.
Definition: projects.hpp:350
void increment_total_propertors(eosio::name coopname, const checksum256 &project_hash)
Увеличивает количество проперторов в проекте на 1.
Definition: projects.hpp:424
void set_master(eosio::name coopname, uint64_t project_id, eosio::name master)
Назначает мастера проекта
Definition: projects.hpp:239
void add_investments(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &amount)
Добавляет инвестицию к проекту.
Definition: projects.hpp:290
void increment_total_authors(eosio::name coopname, const checksum256 &project_hash)
Увеличивает количество авторов в проекте на 1.
Definition: projects.hpp:472
void complete_expense(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &amount)
Завершает расход, добавляя сумму в used_expense_pool.
Definition: projects.hpp:410
void increase_total_returned_investments(eosio::name coopname, const uint64_t &project_id, const eosio::asset &amount)
Definition: projects.hpp:660
void increment_total_creators(eosio::name coopname, const checksum256 &project_hash)
Увеличивает количество создателей в проекте на 1.
Definition: projects.hpp:496
void update_status(eosio::name coopname, const checksum256 &project_hash, eosio::name new_status)
Обновляет статус проекта.
Definition: projects.hpp:255
void subtract_project_shares(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &shares_amount)
Уменьшает доли от общего пула долей проекта
Definition: projects.hpp:540
void expand_expense_pool(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &additional_amount)
Увеличивает целевой размер пула расходов проекта.
Definition: projects.hpp:333
void subtract_membership_available(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &amount)
Вычитает доступные членские средства из проекта
Definition: projects.hpp:620
void validate_parent_hash(eosio::name coopname, const checksum256 &parent_hash)
Проверяет валидность parent_hash согласно правилам проектов
Definition: projects.hpp:128
void add_property_base(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &property_amount)
Добавляет имущественный взнос к проекту.
Definition: projects.hpp:173
void increment_votes_received(eosio::name coopname, const checksum256 &project_hash)
Увеличивает счетчик полученных голосов в проекте
Definition: projects.hpp:508
void distribute_membership_funds(eosio::name coopname, const checksum256 &project_hash, asset amount)
Definition: projects.hpp:603
void delete_project(eosio::name coopname, const checksum256 &project_hash)
Удаляет проект
Definition: projects.hpp:677
void increment_total_contributors(eosio::name coopname, const checksum256 &project_hash)
Увеличивает количество зарегистрированных вкладчиков в проекте на 1.
Definition: projects.hpp:448
void increment_total_coordinators(eosio::name coopname, const checksum256 &project_hash)
Увеличивает количество координаторов в проекте на 1.
Definition: projects.hpp:484
void add_commit(eosio::name coopname, const checksum256 &project_hash, const generation_amounts &delta)
Добавляет коммит к проекту, обновляя фактические показатели и счетчик коммитов.
Definition: projects.hpp:196
Definition: balances.cpp:6
eosio::multi_index<"projects"_n, project, indexed_by<"bycreatedat"_n, const_mem_fun< project, uint64_t, &project::by_created_at > >, indexed_by<"byhash"_n, const_mem_fun< project, checksum256, &project::by_hash > >, indexed_by<"byparenthash"_n, const_mem_fun< project, checksum256, &project::by_parent_hash > > > project_index
Definition: projects.hpp:85
global_state get_global_state(name coopname)
Получает текущее глобальное состояние.
Definition: global_state.hpp:66
Definition: eosio.msig.hpp:34
Структура для данных CRPS (Cumulative Reward Per Share) распределения наград
Definition: crps.hpp:18
Структура фактических показателей проекта
Definition: fact_pool.hpp:13
eosio::asset target_expense_pool
Целевой размер расходов (копируется из плана)
Definition: fact_pool.hpp:34
eosio::asset used_expense_pool
Фактически израсходованные средства
Definition: fact_pool.hpp:36
eosio::asset accumulated_expense_pool
Фактически накопленные средства для расходов
Definition: fact_pool.hpp:35
Структура для результатов расчета генерации коммита Содержит только те поля, которые рассчитываются п...
Definition: generation_amounts.hpp:14
eosio::asset total_contribution
Общая сумма вкладов всех пайщиков
Definition: generation_amounts.hpp:36
uint64_t creators_hours
Количество часов создателей в коммите
Definition: generation_amounts.hpp:19
eosio::asset creators_bonus_pool
Премии создателей за коммит
Definition: generation_amounts.hpp:26
eosio::asset contributors_bonus_pool
Премии вкладчиков за коммит
Definition: generation_amounts.hpp:33
eosio::asset hour_cost
Стоимость часа для коммита
Definition: generation_amounts.hpp:16
eosio::asset creators_base_pool
Себестоимость создателей за коммит
Definition: generation_amounts.hpp:22
eosio::asset authors_bonus_pool
Премии авторов за коммит
Definition: generation_amounts.hpp:27
eosio::asset total_generation_pool
Общая сумма генерации коммита
Definition: generation_amounts.hpp:30
eosio::asset authors_base_pool
Авторская себестоимость за коммит
Definition: generation_amounts.hpp:23
Структура плановых показателей проекта
Definition: plan_pool.hpp:13
eosio::asset target_expense_pool
Планируемый размер расходов
Definition: plan_pool.hpp:33
Таблица проектов хранит информацию о проектах кооператива, которые станут результатами.
Definition: projects.hpp:40
name master
Мастер проекта
Definition: projects.hpp:54
checksum256 project_hash
Хэш проекта (внешний ключ)
Definition: projects.hpp:44
std::string description
Описание проекта
Definition: projects.hpp:57
bool can_convert_to_project
Разрешена ли конвертация в кошелек данного проекта
Definition: projects.hpp:51
fact_pool fact
Фактические показатели
Definition: projects.hpp:63
bool is_opened
Открыт ли проект для инвестиций
Definition: projects.hpp:49
eosio::name status
Статус проекта
Definition: projects.hpp:47
crps_data crps
Данные CRPS для распределения наград
Definition: projects.hpp:64
bool is_planed
Запланирован ли проект (установлен план)
Definition: projects.hpp:50
membership_crps membership
Данные CRPS для распределения членских взносов
Definition: projects.hpp:70
uint64_t by_created_at() const
Индекс по времени создания (2)
Definition: projects.hpp:76
uint64_t primary_key() const
Первичный ключ (1)
Definition: projects.hpp:75
voting_data voting
Данные голосования по методу Водянова
Definition: projects.hpp:67
std::string meta
Метаданные проекта
Definition: projects.hpp:58
plan_pool plan
Плановые показатели
Definition: projects.hpp:62
checksum256 by_hash() const
Индекс по хэшу проекта (3)
Definition: projects.hpp:77
counts_data counts
Счетчики участников проекта
Definition: projects.hpp:60
checksum256 by_parent_hash() const
Индекс по хэшу родительского проекта (4)
Definition: projects.hpp:78
std::string title
Название проекта
Definition: projects.hpp:56
uint64_t id
ID проекта (внутренний ключ)
Definition: projects.hpp:41
name coopname
Имя кооператива
Definition: projects.hpp:43
checksum256 parent_hash
Хэш родительского проекта (если есть)
Definition: projects.hpp:45
Структура данных для голосования по методу Водянова
Definition: votes.hpp:35
Definition: membership_crps.hpp:8