COOPENOMICS  v1
Кооперативная Экономика
projects.hpp
См. документацию.
1#pragma once
2
3#include "plan_pool.hpp"
4#include "fact_pool.hpp"
5#include "crps.hpp"
7#include "votes.hpp"
8#include "counts.hpp"
9#include "global_state.hpp"
10
11using namespace eosio;
12using std::string;
13
21 namespace Status {
22 const eosio::name PENDING = "pending"_n;
23 const eosio::name ACTIVE = "active"_n;
24 const eosio::name VOTING = "voting"_n;
25 const eosio::name RESULT = "result"_n;
26 const eosio::name FINALIZED = "finalized"_n;
27 const eosio::name CANCELLED = "cancelled"_n;
28 }// namespace Capital::Projects::Status
29}// namespace Capital::Projects
30
31namespace Capital {
40struct [[eosio::table, eosio::contract(CAPITAL)]] project {
41 uint64_t id;
42
43 name coopname;
44 checksum256 project_hash;
45 checksum256 parent_hash;
46
47 eosio::name status;
48
49 bool is_opened;
50 bool is_planed;
52
53 // Мастер проекта
54 name master;
55
56 std::string title;
57 std::string description;
58 std::string invite;
59 std::string data;
60 std::string meta;
61
63
65
69
70 // Голосование по методу Водянова
72
73 // Время создания проекта
74 time_point_sec created_at = current_time_point();
75
76 uint64_t primary_key() const { return id; }
77 uint64_t by_created_at() const { return created_at.sec_since_epoch(); }
78 checksum256 by_hash() const { return project_hash; }
79 checksum256 by_parent_hash() const { return parent_hash; }
80};
81
82typedef eosio::multi_index<"projects"_n, project,
83 indexed_by<"bycreatedat"_n, const_mem_fun<project, uint64_t, &project::by_created_at>>,
84 indexed_by<"byhash"_n, const_mem_fun<project, checksum256, &project::by_hash>>,
85 indexed_by<"byparenthash"_n, const_mem_fun<project, checksum256, &project::by_parent_hash>>
87
88}// namespace Capital
89
90namespace Capital::Projects {
98 inline std::optional<project> get_project(eosio::name coopname, const checksum256 &project_hash) {
99 project_index projects(_capital, coopname.value);
100 auto project_hash_index = projects.get_index<"byhash"_n>();
101
102 auto project_itr = project_hash_index.find(project_hash);
103
104 if (project_itr == project_hash_index.end()) {
105 return std::nullopt;
106 }
107
108 return project(*project_itr);
109 }
110
118 inline project get_project_or_fail(eosio::name coopname, const checksum256 &project_hash) {
119 auto project = get_project(coopname, project_hash);
120 eosio::check(project.has_value(), "Проект с указанным хэшем не найден");
121 return project.value();
122 }
123
131 inline project get_project_by_id_or_fail(eosio::name coopname, const uint64_t project_id) {
132 project_index projects(_capital, coopname.value);
133 auto prj = projects.find(project_id);
134 eosio::check(prj != projects.end(), "Проект не найден");
135
136 return project(*prj);
137 }
138
144 inline bool has_component_projects(eosio::name coopname, const checksum256 &project_hash) {
145 project_index projects(_capital, coopname.value);
146 auto parent_idx = projects.get_index<"byparenthash"_n>();
147 auto it = parent_idx.find(project_hash);
148 return it != parent_idx.end() && it->parent_hash == project_hash;
149 }
150
151
158 inline void validate_parent_hash(eosio::name coopname, const checksum256 &parent_hash) {
159 checksum256 empty_hash = checksum256();
160
161 if (parent_hash != empty_hash) {
162 auto parent_project = get_project_or_fail(coopname, parent_hash);
163 eosio::check(parent_project.parent_hash == empty_hash,
164 "Запрещено создавать проекты глубже одного уровня. У родительского проекта не должно быть своего родителя");
165 }
166 }
167
180 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 &invite, const std::string &meta, const std::string &data) {
181
182 project_index projects(_capital, coopname.value);
183
184 projects.emplace(coopname, [&](auto& row) {
185 row.id = get_global_id_in_scope(_capital, coopname, "projects"_n);
187 row.project_hash = project_hash;
188 row.parent_hash = parent_hash;
189 row.coopname = coopname;
190 row.title = title;
191 row.description = description;
192 row.invite = invite;
193 row.meta = meta;
194 row.data = data;
195 row.is_planed = false; // Изначально проект не запланирован
196 row.is_authorized = false; // Все проекты требуют инициализации
197 row.authorization = document2(); // Пустой документ авторизации
198 });
199 }
200
212 inline void edit_project(eosio::name coopname, uint64_t project_id, const std::string &title, const std::string &description, const std::string &invite, const std::string &meta, const std::string &data) {
213
214 project_index projects(_capital, coopname.value);
215 auto project_itr = projects.find(project_id);
216 eosio::check(project_itr != projects.end(), "Проект не найден");
217 projects.modify(project_itr, coopname, [&](auto& row) {
218 // Всегда обновляем строковые поля
219 row.title = title;
220 row.description = description;
221 row.invite = invite;
222 row.meta = meta;
223 row.data = data;
224 });
225 }
226
233 inline void add_property_base(eosio::name coopname, uint64_t project_id, const eosio::asset &property_amount) {
234 project_index projects(_capital, coopname.value);
235 auto project = projects.find(project_id);
236 eosio::check(project != projects.end(), "Проект не найден");
237 projects.modify(project, _capital, [&](auto &p) {
238 // Добавляем стоимость имущества в пул себестоимостей
239 p.fact.property_base_pool += property_amount;
240
241 // Обновляем общую сумму генерации (имущество - это интеллектуальный вклад)
242 p.fact.total_generation_pool += property_amount;
243
244 // Обновляем общую сумму вкладов
245 p.fact.total_contribution += property_amount;
246 p.fact.total = p.fact.total_contribution;
247 p.fact.total_with_investments = p.fact.total + p.fact.total_used_investments + p.fact.used_expense_pool;
248 });
249 }
250
257 inline void add_commit(eosio::name coopname, uint64_t project_id, const generation_amounts &delta) {
258 project_index projects(_capital, coopname.value);
259 auto project = projects.find(project_id);
260 eosio::check(project != projects.end(), "Проект не найден");
261 projects.modify(project, _capital, [&](auto &p) {
262 // Увеличиваем счетчик коммитов
263 p.counts.total_commits++;
264
265 // Обновляем время создателей
266 p.fact.creators_hours += delta.creators_hours;
267 // Инкрементальное вычисление среднего для стоимости часа
268 if (delta.hour_cost.amount > 0) {
269 // Расчет скользящего среднего:
270 // новая_средняя = (предыдущая_средняя * (n-1) + новое_значение) / n
271 auto previous_commits = p.counts.total_commits - 1;
272 if (previous_commits == 0) {
273 // Первый коммит - просто устанавливаем значение
274 p.fact.hour_cost = delta.hour_cost;
275 } else {
276 // Последующие коммиты - рассчитываем среднее
277 auto weighted_sum = p.fact.hour_cost.amount * previous_commits;
278 auto new_average = (weighted_sum + delta.hour_cost.amount) / p.counts.total_commits;
279 p.fact.hour_cost = asset(new_average, p.fact.hour_cost.symbol);
280 }
281 }
282
283 // Обновляем остальные пулы
284 p.fact.creators_base_pool += delta.creators_base_pool;
285 p.fact.authors_base_pool += delta.authors_base_pool;
286 p.fact.authors_bonus_pool += delta.authors_bonus_pool;
287 p.fact.creators_bonus_pool += delta.creators_bonus_pool;
288
289 // ВАЖНО: total_generation_pool должен включать все интеллектуальные вклады,
290 // включая уже накопленную базу координаторов и имущество
291 p.fact.total_generation_pool = p.fact.creators_base_pool + p.fact.authors_base_pool +
292 p.fact.creators_bonus_pool + p.fact.authors_bonus_pool +
293 p.fact.coordinators_base_pool + p.fact.property_base_pool;
294
295 // Пересчитываем премии участников от обновленной общей генерации
296 p.fact.contributors_bonus_pool = Capital::Core::Generation::calculate_contributors_bonus_pool(p.fact.total_generation_pool);
297
298 // Общая сумма вкладов пайщиков
299 p.fact.total_contribution = p.fact.total_generation_pool + p.fact.contributors_bonus_pool;
300
301 p.fact.total = p.fact.total_contribution;
302 // Пересчитываем коэффициенты
303 p.fact.return_base_percent = Capital::Core::Generation::calculate_return_base_percent(p.fact.creators_base_pool, p.fact.authors_base_pool, p.fact.coordinators_base_pool, p.fact.invest_pool);
304 p.fact.use_invest_percent = Capital::Core::Generation::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);
305
306 // Пересчитываем используемую часть инвестиций и полную стоимость
307 p.fact.total_used_investments = eosio::asset(
308 static_cast<int64_t>(static_cast<double>(p.fact.total_received_investments.amount) * (p.fact.use_invest_percent / 100.0)),
310 );
311 p.fact.total_with_investments = p.fact.total + p.fact.total_used_investments + p.fact.used_expense_pool;
312 });
313 }
314
322 inline void set_master(eosio::name coopname, uint64_t project_id, eosio::name master) {
323 Capital::project_index projects(_capital, coopname.value);
324 auto project_itr = projects.find(project_id);
325 eosio::check(project_itr != projects.end(), "Проект не найден");
326 projects.modify(project_itr, coopname, [&](auto &p) {
327 p.master = master;
328 });
329
330 }
331
338 inline void update_status(eosio::name coopname, uint64_t project_id, eosio::name new_status) {
339 project_index projects(_capital, coopname.value);
340 auto project = projects.find(project_id);
341 eosio::check(project != projects.end(), "Проект не найден");
342
343 projects.modify(project, coopname, [&](auto &p) {
344 p.status = new_status;
345 });
346 }
347
354 inline void set_plan(eosio::name coopname, uint64_t project_id, const plan_pool &calculated_plan) {
355 project_index projects(_capital, coopname.value);
356 auto project = projects.find(project_id);
357 eosio::check(project != projects.end(), "Проект не найден");
358 projects.modify(project, coopname, [&](auto &p) {
359 p.plan = calculated_plan;
360 p.is_planed = true; // Проект теперь запланирован
361 });
362 }
363
370 inline void add_investments(eosio::name coopname, uint64_t project_id, const eosio::asset &amount) {
371 project_index projects(_capital, coopname.value);
372 auto project = projects.find(project_id);
373 eosio::check(project != projects.end(), "Проект не найден");
374
375 projects.modify(project, coopname, [&](auto &p) {
376 // Рассчитываем сколько средств еще нужно для достижения цели по расходам
377 eosio::asset expense_gap = p.plan.target_expense_pool - p.fact.accumulated_expense_pool;
378
379 // Рассчитываем какую часть инвестиций направить в пул расходов
380 eosio::asset to_expense_pool = asset(0, _root_govern_symbol);
381
382 if (expense_gap.amount > 0) {
383 // Рассчитываем процент от инвестиций для пула расходов
384 auto st = Capital::State::get_global_state(coopname);
385 eosio::asset potential_to_expense = amount * st.config.expense_pool_percent / 100;
386
387 // Но не больше, чем нужно для достижения цели
388 to_expense_pool = (potential_to_expense.amount <= expense_gap.amount) ? potential_to_expense : expense_gap;
389 }
390
391 // Остальные средства идут в инвестиционный пул
392 eosio::asset to_invest_pool = amount - to_expense_pool;
393
394 // Обновляем пулы
395 p.fact.invest_pool += to_invest_pool;
396 p.fact.accumulated_expense_pool += to_expense_pool;
397 p.fact.total_received_investments += amount; // Увеличиваем общую сумму полученных инвестиций
398
399 // Пересчитываем коэффициенты возврата
400 p.fact.return_base_percent = Capital::Core::Generation::calculate_return_base_percent(p.fact.creators_base_pool, p.fact.authors_base_pool, p.fact.coordinators_base_pool, p.fact.invest_pool);
401 p.fact.use_invest_percent = Capital::Core::Generation::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);
402
403 // Пересчитываем используемую часть инвестиций и полную стоимость
404 p.fact.total_used_investments = eosio::asset(
405 static_cast<int64_t>(static_cast<double>(p.fact.total_received_investments.amount) * (p.fact.use_invest_percent / 100.0)),
407 );
408 p.fact.total_with_investments = p.fact.total + p.fact.total_used_investments + p.fact.used_expense_pool;
409 });
410 }
411
412
419 inline void expand_expense_pool(eosio::name coopname, uint64_t project_id, const eosio::asset &additional_amount) {
420 project_index projects(_capital, coopname.value);
421 auto project = projects.find(project_id);
422 eosio::check(project != projects.end(), "Проект не найден");
423
424 projects.modify(project, coopname, [&](auto &p) {
425 // Увеличиваем целевой размер пула расходов в фактических показателях
426 p.fact.target_expense_pool += additional_amount;
427 });
428 }
429
435 inline void open_project(eosio::name coopname, uint64_t project_id) {
436
437 project_index projects(_capital, coopname.value);
438 auto project = projects.find(project_id);
439 eosio::check(project != projects.end(), "Проект не найден");
440 projects.modify(project, coopname, [&](auto &p) {
441 // Копируем целевые показатели расходов из плана в факт
442 p.fact.target_expense_pool = p.plan.target_expense_pool;
443
444 // Остальные поля расходов остаются нулевыми (accumulated_expense_pool, used_expense_pool)
445 // так как фактических поступлений и трат еще не было
446
447 // Меняем статус на "opened"
448 p.is_opened = true;
449 });
450 }
451
457 inline void close_project(eosio::name coopname, uint64_t project_id) {
458 project_index projects(_capital, coopname.value);
459 auto project = projects.find(project_id);
460 eosio::check(project != projects.end(), "Проект не найден");
461 projects.modify(project, coopname, [&](auto &p) {
462 // Закрываем проект от инвестиций
463 p.is_opened = false;
464 });
465 }
466
473 inline void reserve_expense_funds(eosio::name coopname, uint64_t project_id, const eosio::asset &amount) {
474 project_index projects(_capital, coopname.value);
475 auto project_for_modify = projects.find(project_id);
476 eosio::check(project_for_modify != projects.end(), "Проект не найден");
477
478
479 projects.modify(project_for_modify, coopname, [&](auto &p) {
480 eosio::check(p.fact.accumulated_expense_pool >= amount,
481 "Недостаточно средств в пуле расходов");
482 p.fact.accumulated_expense_pool -= amount;
483 });
484 }
485
492 inline void return_expense_funds(eosio::name coopname, uint64_t project_id, const eosio::asset &amount) {
493 project_index projects(_capital, coopname.value);
494 auto project_for_modify = projects.find(project_id);
495 eosio::check(project_for_modify != projects.end(), "Проект не найден");
496
497 projects.modify(project_for_modify, coopname, [&](auto &p) {
498 p.fact.accumulated_expense_pool += amount;
499 });
500 }
501
508 inline void complete_expense(eosio::name coopname, uint64_t project_id, const eosio::asset &amount) {
509 project_index projects(_capital, coopname.value);
510 auto project_for_modify = projects.find(project_id);
511 eosio::check(project_for_modify != projects.end(), "Проект не найден");
512
513 projects.modify(project_for_modify, coopname, [&](auto &p) {
514 p.fact.used_expense_pool += amount;
515
516 // Пересчитываем total, т.к. он зависит от вкладов, но больше не включает расходы напрямую
517 p.fact.total = p.fact.total_contribution;
518
519 // Пересчитываем use_invest_percent, т.к. он зависит от used_expense_pool
520 p.fact.use_invest_percent = Capital::Core::Generation::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);
521
522 // Пересчитываем используемую часть инвестиций и полную стоимость
523 p.fact.total_used_investments = eosio::asset(
524 static_cast<int64_t>(static_cast<double>(p.fact.total_received_investments.amount) * (p.fact.use_invest_percent / 100.0)),
526 );
527 p.fact.total_with_investments = p.fact.total + p.fact.total_used_investments + p.fact.used_expense_pool;
528 });
529 }
530
534 inline void increment_total_propertors(eosio::name coopname, uint64_t project_id) {
535 project_index projects(_capital, coopname.value);
536 auto project_for_modify = projects.find(project_id);
537 eosio::check(project_for_modify != projects.end(), "Проект не найден");
538
539 projects.modify(project_for_modify, _capital, [&](auto &p) {
540 p.counts.total_propertors += 1;
541 });
542 }
543
547 inline void increment_total_investors(eosio::name coopname, uint64_t project_id) {
548 project_index projects(_capital, coopname.value);
549 auto project_for_modify = projects.find(project_id);
550 eosio::check(project_for_modify != projects.end(), "Проект не найден");
551
552 projects.modify(project_for_modify, _capital, [&](auto &p) {
553 p.counts.total_investors += 1;
554 });
555 }
556
560 inline void increment_total_contributors(eosio::name coopname, uint64_t project_id) {
561 project_index projects(_capital, coopname.value);
562 auto project_for_modify = projects.find(project_id);
563 eosio::check(project_for_modify != projects.end(), "Проект не найден");
564
565 projects.modify(project_for_modify, _capital, [&](auto &p) {
566 p.counts.total_contributors += 1;
567 });
568 }
569
573 inline void increment_total_contributor_shares(eosio::name coopname, uint64_t project_id, eosio::asset shares) {
574 project_index projects(_capital, coopname.value);
575 auto project_for_modify = projects.find(project_id);
576
577 eosio::check(project_for_modify != projects.end(), "Проект не найден");
578 projects.modify(project_for_modify, _capital, [&](auto &p) {
579 p.crps.total_capital_contributors_shares += shares;
580 });
581 }
582
586 inline void increment_total_authors(eosio::name coopname, uint64_t project_id) {
587 project_index projects(_capital, coopname.value);
588 auto project_for_modify = projects.find(project_id);
589 eosio::check(project_for_modify != projects.end(), "Проект не найден");
590 projects.modify(project_for_modify, _capital, [&](auto &p) {
591 p.counts.total_authors += 1;
592 });
593 }
594
598 inline void increment_total_coordinators(eosio::name coopname, uint64_t project_id) {
599 project_index projects(_capital, coopname.value);
600 auto project_for_modify = projects.find(project_id);
601 eosio::check(project_for_modify != projects.end(), "Проект не найден");
602 projects.modify(project_for_modify, _capital, [&](auto &p) {
603 p.counts.total_coordinators += 1;
604 });
605 }
606
610 inline void increment_total_creators(eosio::name coopname, uint64_t project_id) {
611 project_index projects(_capital, coopname.value);
612 auto project_for_modify = projects.find(project_id);
613 eosio::check(project_for_modify != projects.end(), "Проект не найден");
614 projects.modify(project_for_modify, _capital, [&](auto &p) {
615 p.counts.total_creators += 1;
616 });
617 }
618
622 inline void increment_total_unique_participants(eosio::name coopname, uint64_t project_id) {
623 project_index projects(_capital, coopname.value);
624 auto project_for_modify = projects.find(project_id);
625
626 projects.modify(project_for_modify, _capital, [&](auto &p) {
627 p.counts.total_unique_participants += 1;
628 });
629 }
630
634 inline void increment_votes_received(eosio::name coopname, uint64_t project_id) {
635 project_index projects(_capital, coopname.value);
636 auto project_for_modify = projects.find(project_id);
637 eosio::check(project_for_modify != projects.end(), "Проект не найден");
638
639 projects.modify(project_for_modify, _capital, [&](auto &p) {
640 p.voting.votes_received++;
641 });
642 }
643
644 inline void increase_total_returned_investments(eosio::name coopname, const uint64_t &project_id, const eosio::asset &amount) {
645 // Обновляем проект - увеличиваем сумму возвращенных инвестиций
646 Capital::project_index projects(_capital, coopname.value);
647 auto project_itr = projects.find(project_id);
648 eosio::check(project_itr != projects.end(), "Проект не найден");
649 projects.modify(project_itr, coopname, [&](auto &p) {
650 p.fact.total_returned_investments += amount;
651 });
652
653
654 }
655
662 inline void add_used_for_compensation(eosio::name coopname, uint64_t project_id, const eosio::asset &amount) {
663 project_index projects(_capital, coopname.value);
664 auto project = projects.find(project_id);
665 eosio::check(project != projects.end(), "Проект не найден");
666 projects.modify(project, _capital, [&](auto &p) {
667 p.fact.total_used_for_compensation += amount;
668 });
669 }
670
671
678 inline void subtract_used_for_compensation(eosio::name coopname, uint64_t project_id, const eosio::asset &amount) {
679 project_index projects(_capital, coopname.value);
680 auto project = projects.find(project_id);
681 eosio::check(project != projects.end(), "Проект не найден");
682 eosio::check(project->fact.total_used_for_compensation >= amount, "Недостаточно использованных инвестиций для вычитания");
683
684 projects.modify(project, _capital, [&](auto &p) {
685 p.fact.total_used_for_compensation -= amount;
686 });
687 }
688
694 inline void increment_converted_segments(eosio::name coopname, uint64_t project_id) {
695 project_index projects(_capital, coopname.value);
696 auto project = projects.find(project_id);
697 eosio::check(project != projects.end(), "Проект не найден");
698
699 projects.modify(project, _capital, [&](auto &p) {
700 p.counts.total_converted_segments++;
701 });
702 }
703
710 inline bool are_all_segments_converted(eosio::name coopname, uint64_t project_id) {
711 project_index projects(_capital, coopname.value);
712 auto project = projects.find(project_id);
713 eosio::check(project != projects.end(), "Проект не найден");
714 // Все уникальные участники должны сконвертировать свои сегменты
716 }
717
723 inline void delete_project(eosio::name coopname, uint64_t project_id) {
724 project_index projects(_capital, coopname.value);
725 auto project_itr = projects.find(project_id);
726 eosio::check(project_itr != projects.end(), "Проект не найден");
727 projects.erase(project_itr);
728 }
729
733 inline void authorize_project(eosio::name coopname, uint64_t project_id, const document2 &decision) {
734 project_index projects(_capital, coopname.value);
735 auto project_itr = projects.find(project_id);
736 eosio::check(project_itr != projects.end(), "Проект не найден");
737 projects.modify(project_itr, coopname, [&](auto& row) {
738 row.is_authorized = true;
739 row.authorization = decision;
740 });
741 }
742
749 inline void revoke_authorization(eosio::name coopname, uint64_t project_id) {
750 project_index projects(_capital, coopname.value);
751 auto project_itr = projects.find(project_id);
752 eosio::check(project_itr != projects.end(), "Проект не найден");
753 projects.modify(project_itr, coopname, [&](auto& row) {
754 row.is_authorized = false;
755 row.authorization = document2(); // Пустой документ авторизации
756 });
757 }
758
762 inline void increment_total_voters(eosio::name coopname, uint64_t project_id) {
763 project_index projects(_capital, coopname.value);
764 auto project = projects.find(project_id);
765 eosio::check(project != projects.end(), "Проект не найден");
766 projects.modify(project, _capital, [&](auto &p) {
767 p.voting.total_voters++;
768 });
769 }
770
771
772}// namespace Project
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
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
eosio::asset calculate_contributors_bonus_pool(eosio::asset total_generation_pool)
Функция расчета премий участников (для фактических показателей)
Definition: generation.cpp:14
const eosio::name RESULT
Проект завершен
Definition: projects.hpp:25
const eosio::name PENDING
Проект создан
Definition: projects.hpp:22
const eosio::name VOTING
Проект на голосовании
Definition: projects.hpp:24
const eosio::name CANCELLED
Проект отменен
Definition: projects.hpp:27
const eosio::name ACTIVE
Проект активен для коммитов
Definition: projects.hpp:23
const eosio::name FINALIZED
Проект финализирован (все конвертации завершены, неиспользованные средства возвращены)
Definition: projects.hpp:26
Definition: projects.hpp:14
void increment_total_voters(eosio::name coopname, uint64_t project_id)
Увеличивает счетчик общего количества участников голосования в проекте
Definition: projects.hpp:762
bool has_component_projects(eosio::name coopname, const checksum256 &project_hash)
Есть ли у проекта дочерние проекты-компоненты (их parent_hash совпадает с хэшем родителя)
Definition: projects.hpp:144
void increment_converted_segments(eosio::name coopname, uint64_t project_id)
Инкрементирует счётчик сконвертированных сегментов
Definition: projects.hpp:694
void add_commit(eosio::name coopname, uint64_t project_id, const generation_amounts &delta)
Добавляет коммит к проекту, обновляя фактические показатели и счетчик коммитов.
Definition: projects.hpp:257
std::optional< project > get_project(eosio::name coopname, const checksum256 &project_hash)
Получает проект по хэшу
Definition: projects.hpp:98
void open_project(eosio::name coopname, uint64_t project_id)
Открывает проект для инвестиций, копируя плановые показатели расходов в фактические.
Definition: projects.hpp:435
void update_status(eosio::name coopname, uint64_t project_id, eosio::name new_status)
Обновляет статус проекта.
Definition: projects.hpp:338
void reserve_expense_funds(eosio::name coopname, uint64_t project_id, const eosio::asset &amount)
Резервирует средства для расхода, уменьшая accumulated_expense_pool.
Definition: projects.hpp:473
void increment_votes_received(eosio::name coopname, uint64_t project_id)
Увеличивает счетчик полученных голосов в проекте
Definition: projects.hpp:634
void delete_project(eosio::name coopname, uint64_t project_id)
Удаляет проект
Definition: projects.hpp:723
void add_investments(eosio::name coopname, uint64_t project_id, const eosio::asset &amount)
Добавляет инвестицию к проекту.
Definition: projects.hpp:370
void increment_total_investors(eosio::name coopname, uint64_t project_id)
Увеличивает количество инвесторов в проекте на 1.
Definition: projects.hpp:547
void increment_total_unique_participants(eosio::name coopname, uint64_t project_id)
Увеличивает количество уникальных участников в проекте на 1.
Definition: projects.hpp:622
void add_property_base(eosio::name coopname, uint64_t project_id, const eosio::asset &property_amount)
Добавляет имущественный взнос к проекту.
Definition: projects.hpp:233
void expand_expense_pool(eosio::name coopname, uint64_t project_id, const eosio::asset &additional_amount)
Увеличивает целевой размер пула расходов проекта.
Definition: projects.hpp:419
void increment_total_contributors(eosio::name coopname, uint64_t project_id)
Увеличивает количество зарегистрированных участников в проекте на 1.
Definition: projects.hpp:560
void authorize_project(eosio::name coopname, uint64_t project_id, const document2 &decision)
Устанавливает авторизацию проекта советом
Definition: projects.hpp:733
project get_project_or_fail(eosio::name coopname, const checksum256 &project_hash)
Получает проект по хэшу, если проект не найден, выбрасывает исключение
Definition: projects.hpp:118
void increment_total_coordinators(eosio::name coopname, uint64_t project_id)
Увеличивает количество координаторов в проекте на 1.
Definition: projects.hpp:598
project get_project_by_id_or_fail(eosio::name coopname, const uint64_t project_id)
Получает проект по id.
Definition: projects.hpp:131
void set_master(eosio::name coopname, uint64_t project_id, eosio::name master)
Назначает мастера проекта
Definition: projects.hpp:322
void add_used_for_compensation(eosio::name coopname, uint64_t project_id, const eosio::asset &amount)
Увеличивает сумму использованных для компенсации инвестиций
Definition: projects.hpp:662
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 &invite, const std::string &meta, const std::string &data)
Создает проект
Definition: projects.hpp:180
void close_project(eosio::name coopname, uint64_t project_id)
Закрывает проект от инвестиций, устанавливая флаг is_opened = false.
Definition: projects.hpp:457
void increment_total_propertors(eosio::name coopname, uint64_t project_id)
Увеличивает количество проперторов в проекте на 1.
Definition: projects.hpp:534
void increase_total_returned_investments(eosio::name coopname, const uint64_t &project_id, const eosio::asset &amount)
Definition: projects.hpp:644
void subtract_used_for_compensation(eosio::name coopname, uint64_t project_id, const eosio::asset &amount)
Уменьшает сумму использованных для компенсации инвестиций
Definition: projects.hpp:678
void edit_project(eosio::name coopname, uint64_t project_id, const std::string &title, const std::string &description, const std::string &invite, const std::string &meta, const std::string &data)
Редактирует существующий проект
Definition: projects.hpp:212
void complete_expense(eosio::name coopname, uint64_t project_id, const eosio::asset &amount)
Завершает расход, добавляя сумму в used_expense_pool.
Definition: projects.hpp:508
void revoke_authorization(eosio::name coopname, uint64_t project_id)
Сбрасывает авторизацию проекта Устанавливает флаг авторизации в false и очищает документ авторизации
Definition: projects.hpp:749
void increment_total_authors(eosio::name coopname, uint64_t project_id)
Увеличивает количество авторов в проекте на 1.
Definition: projects.hpp:586
void validate_parent_hash(eosio::name coopname, const checksum256 &parent_hash)
Проверяет валидность parent_hash согласно правилам проектов
Definition: projects.hpp:158
void increment_total_creators(eosio::name coopname, uint64_t project_id)
Увеличивает количество создателей в проекте на 1.
Definition: projects.hpp:610
void increment_total_contributor_shares(eosio::name coopname, uint64_t project_id, eosio::asset shares)
Увеличивает количество вкладчических долей в проекте на указанное количество
Definition: projects.hpp:573
void return_expense_funds(eosio::name coopname, uint64_t project_id, const eosio::asset &amount)
Возвращает зарезервированные средства в accumulated_expense_pool.
Definition: projects.hpp:492
bool are_all_segments_converted(eosio::name coopname, uint64_t project_id)
Проверяет завершили ли все участники конвертацию сегментов
Definition: projects.hpp:710
void set_plan(eosio::name coopname, uint64_t project_id, const plan_pool &calculated_plan)
Устанавливает плановые показатели проекта.
Definition: projects.hpp:354
global_state get_global_state(name coopname)
Получает текущее глобальное состояние.
Definition: global_state.hpp:72
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:86
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 total_used_for_compensation
Общая сумма инвестиций, использованных для компенсации трудозатрат
Definition: fact_pool.hpp:44
Структура для результатов расчета генерации коммита Содержит только те поля, которые рассчитываются п...
Definition: generation_amounts.hpp:14
uint64_t creators_hours
Количество часов создателей в коммите
Definition: generation_amounts.hpp:19
eosio::asset creators_bonus_pool
Премии создателей за коммит
Definition: generation_amounts.hpp:26
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 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
std::string data
Шаблон/данные проекта
Definition: projects.hpp:59
name master
Мастер проекта
Definition: projects.hpp:54
checksum256 project_hash
Хэш проекта (внешний ключ)
Definition: projects.hpp:44
std::string description
Описание проекта
Definition: projects.hpp:57
fact_pool fact
Фактические показатели
Definition: projects.hpp:67
bool is_opened
Открыт ли проект для инвестиций
Definition: projects.hpp:49
eosio::name status
Статус проекта
Definition: projects.hpp:47
crps_data crps
Данные CRPS для распределения наград
Definition: projects.hpp:68
bool is_planed
Запланирован ли проект (установлен план)
Definition: projects.hpp:50
uint64_t by_created_at() const
Индекс по времени создания (2)
Definition: projects.hpp:77
uint64_t primary_key() const
Первичный ключ (1)
Definition: projects.hpp:76
std::string invite
Приглашение к проекту
Definition: projects.hpp:58
voting_data voting
Данные голосования по методу Водянова
Definition: projects.hpp:71
std::string meta
Метаданные проекта
Definition: projects.hpp:60
plan_pool plan
Плановые показатели
Definition: projects.hpp:66
checksum256 by_hash() const
Индекс по хэшу проекта (3)
Definition: projects.hpp:78
counts_data counts
Счетчики участников проекта
Definition: projects.hpp:64
checksum256 by_parent_hash() const
Индекс по хэшу родительского проекта (4)
Definition: projects.hpp:79
bool is_authorized
Авторизован ли проект советом
Definition: projects.hpp:51
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
document2 authorization
Документ авторизации совета
Definition: projects.hpp:62
Структура данных для голосования по методу Водянова
Definition: votes.hpp:35
Definition: counts.hpp:8
uint64_t total_unique_participants
Definition: counts.hpp:9
uint64_t total_converted_segments
Общее количество сконвертированных сегментов
Definition: counts.hpp:17
Definition: table_soviet_decisions.hpp:20
Definition: document_core.hpp:27
uint64_t get_global_id_in_scope(eosio::name _me, eosio::name scope, eosio::name key)
Definition: table_counts.hpp:58