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 "membership_crps.hpp"
10#include "global_state.hpp"
11
12using namespace eosio;
13using std::string;
14
22 namespace Status {
23 const eosio::name PENDING = "pending"_n;
24 const eosio::name ACTIVE = "active"_n;
25 const eosio::name VOTING = "voting"_n;
26 const eosio::name COMPLETED = "completed"_n;
27 const eosio::name CLOSED = "closed"_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
67
68 // Голосование по методу Водянова
70
71 // Членские взносы
73
74 // Время создания проекта
75 time_point_sec created_at = current_time_point();
76
77 uint64_t primary_key() const { return id; }
78 uint64_t by_created_at() const { return created_at.sec_since_epoch(); }
79 checksum256 by_hash() const { return project_hash; }
80 checksum256 by_parent_hash() const { return parent_hash; }
81};
82
83typedef eosio::multi_index<"projects"_n, project,
84 indexed_by<"bycreatedat"_n, const_mem_fun<project, uint64_t, &project::by_created_at>>,
85 indexed_by<"byhash"_n, const_mem_fun<project, checksum256, &project::by_hash>>,
86 indexed_by<"byparenthash"_n, const_mem_fun<project, checksum256, &project::by_parent_hash>>
88
89}// namespace Capital
90
91namespace Capital::Projects {
99 inline std::optional<project> get_project(eosio::name coopname, const checksum256 &project_hash) {
100 project_index projects(_capital, coopname.value);
101 auto project_hash_index = projects.get_index<"byhash"_n>();
102
103 auto project_itr = project_hash_index.find(project_hash);
104 if (project_itr == project_hash_index.end()) {
105 return std::nullopt;
106 }
107
108 return *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;
122 }
123
130 inline void validate_parent_hash(eosio::name coopname, const checksum256 &parent_hash) {
131 checksum256 empty_hash = checksum256();
132
133 if (parent_hash != empty_hash) {
134 auto parent_project = get_project_or_fail(coopname, parent_hash);
135 eosio::check(parent_project.parent_hash == empty_hash,
136 "Запрещено создавать проекты глубже одного уровня. У родительского проекта не должно быть своего родителя");
137 }
138 }
139
153 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, bool can_convert_to_project) {
154
155 project_index projects(_capital, coopname.value);
156
157 projects.emplace(coopname, [&](auto& row) {
158 row.id = get_global_id_in_scope(_capital, coopname, "projects"_n);
160 row.project_hash = project_hash;
161 row.parent_hash = parent_hash;
162 row.coopname = coopname;
163 row.title = title;
164 row.description = description;
165 row.invite = invite;
166 row.meta = meta;
167 row.data = data;
168 row.is_planed = false; // Изначально проект не запланирован
169 row.can_convert_to_project = can_convert_to_project; // Разрешена ли конвертация в кошелек проекта
170 });
171 }
172
185 inline void edit_project(eosio::name coopname, const checksum256 &project_hash, const std::string &title, const std::string &description, const std::string &invite, const std::string &meta, const std::string &data, bool can_convert_to_project) {
186
187 project_index projects(_capital, coopname.value);
188 auto project_hash_index = projects.get_index<"byhash"_n>();
189 auto project_itr = project_hash_index.find(project_hash);
190
191 project_hash_index.modify(project_itr, coopname, [&](auto& row) {
192 // Всегда обновляем строковые поля
193 row.title = title;
194 row.description = description;
195 row.invite = invite;
196 row.meta = meta;
197 row.data = data;
198
199 row.can_convert_to_project = can_convert_to_project;
200
201 });
202 }
203
210 inline void add_property_base(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &property_amount) {
211 auto exist_project = get_project(coopname, project_hash);
212 eosio::check(exist_project.has_value(), "Проект не найден");
213
214 project_index projects(_capital, coopname.value);
215 auto project = projects.find(exist_project->id);
216
217 projects.modify(project, _capital, [&](auto &p) {
218 // Добавляем стоимость имущества в пул себестоимостей
219 p.fact.property_base_pool += property_amount;
220
221 // Обновляем общую сумму вкладов
222 p.fact.total_contribution += property_amount;
223 p.fact.total = p.fact.total_contribution + p.fact.used_expense_pool;
224 });
225 }
226
233 inline void add_commit(eosio::name coopname, const checksum256 &project_hash, const generation_amounts &delta) {
234 auto exist_project = get_project(coopname, project_hash);
235 eosio::check(exist_project.has_value(), "Проект не найден");
236
237 project_index projects(_capital, coopname.value);
238 auto project = projects.find(exist_project->id);
239
240 projects.modify(project, _capital, [&](auto &p) {
241 // Увеличиваем счетчик коммитов
242 p.counts.total_commits++;
243
244 // Обновляем время создателей
245 p.fact.creators_hours += delta.creators_hours;
246
247 // Инкрементальное вычисление среднего для стоимости часа
248 if (delta.hour_cost.amount > 0) {
249 auto cost_diff = delta.hour_cost - p.fact.hour_cost;
250 p.fact.hour_cost += asset(cost_diff.amount / p.counts.total_commits, p.fact.hour_cost.symbol);
251 }
252
253 // Обновляем остальные пулы
254 p.fact.creators_base_pool += delta.creators_base_pool;
255 p.fact.authors_base_pool += delta.authors_base_pool;
256 p.fact.authors_bonus_pool += delta.authors_bonus_pool;
257 p.fact.creators_bonus_pool += delta.creators_bonus_pool;
258 p.fact.total_generation_pool += delta.total_generation_pool;
259 p.fact.contributors_bonus_pool += delta.contributors_bonus_pool;
260 p.fact.total_contribution += delta.total_contribution;
261 p.fact.total = p.fact.total_contribution + p.fact.used_expense_pool;
262
263 // Пересчитываем коэффициенты
264 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);
265 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);
266 });
267 }
268
276 inline void set_master(eosio::name coopname, uint64_t project_id, eosio::name master) {
277 Capital::project_index projects(_capital, coopname.value);
278 auto project_itr = projects.find(project_id);
279
280 projects.modify(project_itr, coopname, [&](auto &p) {
281 p.master = master;
282 });
283
284 }
285
292 inline void update_status(eosio::name coopname, const checksum256 &project_hash, eosio::name new_status) {
293 auto exist_project = get_project_or_fail(coopname, project_hash);
294
295 project_index projects(_capital, coopname.value);
296 auto project = projects.find(exist_project.id);
297
298 projects.modify(project, coopname, [&](auto &p) {
299 p.status = new_status;
300 });
301 }
302
309 inline void set_plan(eosio::name coopname, const checksum256 &project_hash, const plan_pool &calculated_plan) {
310 auto exist_project = get_project_or_fail(coopname, project_hash);
311
312 project_index projects(_capital, coopname.value);
313 auto project = projects.find(exist_project.id);
314
315 projects.modify(project, coopname, [&](auto &p) {
316 p.plan = calculated_plan;
317 p.is_planed = true; // Проект теперь запланирован
318 });
319 }
320
327 inline void add_investments(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &amount) {
328 auto exist_project = get_project_or_fail(coopname, project_hash);
329
330 project_index projects(_capital, coopname.value);
331 auto project = projects.find(exist_project.id);
332
333 projects.modify(project, coopname, [&](auto &p) {
334 // Рассчитываем сколько средств еще нужно для достижения цели по расходам
335 eosio::asset expense_gap = p.plan.target_expense_pool - p.fact.accumulated_expense_pool;
336
337 // Рассчитываем какую часть инвестиций направить в пул расходов
338 eosio::asset to_expense_pool = asset(0, _root_govern_symbol);
339
340 if (expense_gap.amount > 0) {
341 // Рассчитываем процент от инвестиций для пула расходов
342 auto st = Capital::State::get_global_state(coopname);
343 eosio::asset potential_to_expense = amount * st.config.expense_pool_percent / 100;
344
345 // Но не больше, чем нужно для достижения цели
346 to_expense_pool = (potential_to_expense.amount <= expense_gap.amount) ? potential_to_expense : expense_gap;
347 }
348
349 // Остальные средства идут в инвестиционный пул
350 eosio::asset to_invest_pool = amount - to_expense_pool;
351
352 // Обновляем пулы
353 p.fact.invest_pool += to_invest_pool;
354 p.fact.accumulated_expense_pool += to_expense_pool;
355 p.fact.total_received_investments += amount; // Увеличиваем общую сумму полученных инвестиций
356
357 // Пересчитываем коэффициенты возврата
358 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);
359 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);
360 });
361 }
362
363
370 inline void expand_expense_pool(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &additional_amount) {
371 auto exist_project = get_project_or_fail(coopname, project_hash);
372
373 project_index projects(_capital, coopname.value);
374 auto project = projects.find(exist_project.id);
375
376 projects.modify(project, coopname, [&](auto &p) {
377 // Увеличиваем целевой размер пула расходов в фактических показателях
378 p.fact.target_expense_pool += additional_amount;
379 });
380 }
381
387 inline void open_project(eosio::name coopname, const checksum256 &project_hash) {
388 auto exist_project = get_project_or_fail(coopname, project_hash);
389
390 project_index projects(_capital, coopname.value);
391 auto project = projects.find(exist_project.id);
392
393 projects.modify(project, coopname, [&](auto &p) {
394 // Копируем целевые показатели расходов из плана в факт
395 p.fact.target_expense_pool = p.plan.target_expense_pool;
396
397 // Остальные поля расходов остаются нулевыми (accumulated_expense_pool, used_expense_pool)
398 // так как фактических поступлений и трат еще не было
399
400 // Меняем статус на "opened"
401 p.is_opened = true;
402 });
403 }
404
410 inline void close_project(eosio::name coopname, const checksum256 &project_hash) {
411 auto exist_project = get_project_or_fail(coopname, project_hash);
412
413 project_index projects(_capital, coopname.value);
414 auto project = projects.find(exist_project.id);
415
416 projects.modify(project, coopname, [&](auto &p) {
417 // Закрываем проект от инвестиций
418 p.is_opened = false;
419 });
420 }
421
428 inline void reserve_expense_funds(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &amount) {
429 auto exist_project = get_project_or_fail(coopname, project_hash);
430
431 project_index projects(_capital, coopname.value);
432 auto project = projects.find(exist_project.id);
433
434 projects.modify(project, coopname, [&](auto &p) {
435 eosio::check(p.fact.accumulated_expense_pool >= amount,
436 "Недостаточно средств в пуле расходов");
437 p.fact.accumulated_expense_pool -= amount;
438 });
439 }
440
447 inline void return_expense_funds(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &amount) {
448 auto exist_project = get_project_or_fail(coopname, project_hash);
449
450 project_index projects(_capital, coopname.value);
451 auto project = projects.find(exist_project.id);
452
453 projects.modify(project, coopname, [&](auto &p) {
455 });
456 }
457
464 inline void complete_expense(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &amount) {
465 auto exist_project = get_project_or_fail(coopname, project_hash);
466
467 project_index projects(_capital, coopname.value);
468 auto project = projects.find(exist_project.id);
469
470 projects.modify(project, coopname, [&](auto &p) {
472 });
473 }
474
478 inline void increment_total_propertors(eosio::name coopname, const checksum256 &project_hash) {
479 project_index projects(_capital, coopname.value);
480 auto project = projects.find(Capital::Projects::get_project_or_fail(coopname, project_hash).id);
481
482 projects.modify(project, _capital, [&](auto &p) {
483 p.counts.total_propertors += 1;
484 });
485 }
486
490 inline void increment_total_investors(eosio::name coopname, const checksum256 &project_hash) {
491 project_index projects(_capital, coopname.value);
492 auto project = projects.find(Capital::Projects::get_project_or_fail(coopname, project_hash).id);
493
494 projects.modify(project, _capital, [&](auto &p) {
495 p.counts.total_investors += 1;
496 });
497 }
498
502 inline void increment_total_contributors(eosio::name coopname, const checksum256 &project_hash) {
503 project_index projects(_capital, coopname.value);
504 auto project = projects.find(Capital::Projects::get_project_or_fail(coopname, project_hash).id);
505
506 projects.modify(project, _capital, [&](auto &p) {
507 p.counts.total_contributors += 1;
508 });
509 }
510
514 inline void increment_total_contributor_shares(eosio::name coopname, const checksum256 &project_hash, eosio::asset shares) {
515 project_index projects(_capital, coopname.value);
516 auto project = projects.find(Capital::Projects::get_project_or_fail(coopname, project_hash).id);
517
518 projects.modify(project, _capital, [&](auto &p) {
519 p.crps.total_capital_contributors_shares += shares;
520 });
521 }
522
526 inline void increment_total_authors(eosio::name coopname, const checksum256 &project_hash) {
527 project_index projects(_capital, coopname.value);
528 auto project = projects.find(Capital::Projects::get_project_or_fail(coopname, project_hash).id);
529
530 projects.modify(project, _capital, [&](auto &p) {
531 p.counts.total_authors += 1;
532 });
533 }
534
538 inline void increment_total_coordinators(eosio::name coopname, const checksum256 &project_hash) {
539 project_index projects(_capital, coopname.value);
540 auto project = projects.find(Capital::Projects::get_project_or_fail(coopname, project_hash).id);
541
542 projects.modify(project, _capital, [&](auto &p) {
543 p.counts.total_coordinators += 1;
544 });
545 }
546
550 inline void increment_total_creators(eosio::name coopname, const checksum256 &project_hash) {
551 project_index projects(_capital, coopname.value);
552 auto project = projects.find(Capital::Projects::get_project_or_fail(coopname, project_hash).id);
553
554 projects.modify(project, _capital, [&](auto &p) {
555 p.counts.total_creators += 1;
556 });
557 }
558
562 inline void increment_votes_received(eosio::name coopname, const checksum256 &project_hash) {
563 auto exist_project = get_project_or_fail(coopname, project_hash);
564
565 project_index projects(_capital, coopname.value);
566 auto project = projects.find(exist_project.id);
567
568 projects.modify(project, _capital, [&](auto &p) {
569 p.voting.votes_received++;
570 });
571 }
572
576 inline void increment_total_voters(eosio::name coopname, const checksum256 &project_hash) {
577 auto exist_project = get_project_or_fail(coopname, project_hash);
578
579 project_index projects(_capital, coopname.value);
580 auto project = projects.find(exist_project.id);
581
582 projects.modify(project, _capital, [&](auto &p) {
583 p.voting.total_voters++;
584 });
585 }
586
587
594 inline void subtract_project_shares(eosio::name coopname, const checksum256 &project_hash,
595 const eosio::asset &shares_amount) {
596 if (shares_amount.amount <= 0) {
597 return; // Не вычитаем нулевые или отрицательные суммы
598 }
599
600 auto exist_project = get_project_or_fail(coopname, project_hash);
601
602 project_index projects(_capital, coopname.value);
603 auto project_itr = projects.find(exist_project.id);
604
605 projects.modify(project_itr, _capital, [&](auto &p) {
606 eosio::check(p.membership.total_shares >= shares_amount,
607 "Недостаточно долей в проекте для вычитания");
608
609 p.membership.total_shares -= shares_amount;
610 });
611 }
612
619 inline void add_project_membership_shares(eosio::name coopname, const checksum256 &project_hash,
620 const eosio::asset &shares_amount) {
621 if (shares_amount.amount <= 0) {
622 return; // Не добавляем нулевые или отрицательные суммы
623 }
624
625 auto exist_project = get_project_or_fail(coopname, project_hash);
626
627 project_index projects(_capital, coopname.value);
628 auto project_itr = projects.find(exist_project.id);
629
630 projects.modify(project_itr, _capital, [&](auto &p) {
631 p.membership.total_shares += shares_amount;
632 });
633 }
634
641 inline void add_project_converted_funds(eosio::name coopname, const checksum256 &project_hash,
642 const eosio::asset &converted_amount) {
643 if (converted_amount.amount <= 0) {
644 return; // Не добавляем нулевые или отрицательные суммы
645 }
646
647 auto exist_project = get_project_or_fail(coopname, project_hash);
648
649 project_index projects(_capital, coopname.value);
650 auto project_itr = projects.find(exist_project.id);
651
652 projects.modify(project_itr, _capital, [&](auto &p) {
653 p.membership.converted_funds += converted_amount;
654 });
655 }
656
657 inline void distribute_membership_funds(eosio::name coopname, const checksum256 &project_hash, asset amount) {
658 auto exist_project = get_project_or_fail(coopname, project_hash);
659
660 project_index projects(_capital, coopname.value);
661 auto project_itr = projects.find(exist_project.id);
662
663 projects.modify(project_itr, _capital, [&](auto &p) {
664 p.membership.distributed += amount;
665 });
666 }
667
674 inline void subtract_membership_available(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &amount) {
675 if (amount.amount <= 0) {
676 return; // Не вычитаем нулевые или отрицательные суммы
677 }
678
679 auto exist_project = get_project_or_fail(coopname, project_hash);
680
681 project_index projects(_capital, coopname.value);
682 auto project_itr = projects.find(exist_project.id);
683
684 projects.modify(project_itr, _capital, [&](auto &p) {
685 eosio::check(p.membership.available >= amount,
686 "Недостаточно доступных членских средств в проекте");
687
688 p.membership.available -= amount;
689 });
690 }
691
698 inline void add_membership_available(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &amount) {
699 if (amount.amount <= 0) {
700 return; // Не добавляем нулевые или отрицательные суммы
701 }
702
703 auto exist_project = get_project_or_fail(coopname, project_hash);
704
705 project_index projects(_capital, coopname.value);
706 auto project_itr = projects.find(exist_project.id);
707
708 projects.modify(project_itr, _capital, [&](auto &p) {
709 p.membership.available += amount;
710 });
711 }
712
713
714 inline void increase_total_returned_investments(eosio::name coopname, const uint64_t &project_id, const eosio::asset &amount) {
715 // Обновляем проект - увеличиваем сумму возвращенных инвестиций
716 Capital::project_index projects(_capital, coopname.value);
717 auto project_itr = projects.find(project_id);
718
719 projects.modify(project_itr, coopname, [&](auto &p) {
720 p.fact.total_returned_investments += amount;
721 });
722
723
724 }
725
731 inline void delete_project(eosio::name coopname, const checksum256 &project_hash) {
732 auto exist_project = get_project_or_fail(coopname, project_hash);
733
734 project_index projects(_capital, coopname.value);
735 auto project_itr = projects.find(exist_project.id);
736
737 projects.erase(project_itr);
738 }
739
740}// namespace Project
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:514
void add_project_converted_funds(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &converted_amount)
Добавляет сконвертированные средства в проект
Definition: projects.hpp:641
void increment_total_investors(eosio::name coopname, const checksum256 &project_hash)
Увеличивает количество инвесторов в проекте на 1.
Definition: projects.hpp:490
void add_membership_available(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &amount)
Добавляет доступные членские средства в проект
Definition: projects.hpp:698
std::optional< project > get_project(eosio::name coopname, const checksum256 &project_hash)
Получает проект по хэшу
Definition: projects.hpp:99
void increment_total_voters(eosio::name coopname, const checksum256 &project_hash)
Увеличивает счетчик общего количества участников голосования в проекте
Definition: projects.hpp:576
void return_expense_funds(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &amount)
Возвращает зарезервированные средства в accumulated_expense_pool.
Definition: projects.hpp:447
void add_project_membership_shares(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &shares_amount)
Добавляет доли в общий пул долей проекта (только от конвертации в кошелек проекта)
Definition: projects.hpp:619
void set_plan(eosio::name coopname, const checksum256 &project_hash, const plan_pool &calculated_plan)
Устанавливает плановые показатели проекта.
Definition: projects.hpp:309
void reserve_expense_funds(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &amount)
Резервирует средства для расхода, уменьшая accumulated_expense_pool.
Definition: projects.hpp:428
project get_project_or_fail(eosio::name coopname, const checksum256 &project_hash)
Получает проект по хэшу, если проект не найден, выбрасывает исключение
Definition: projects.hpp:118
void open_project(eosio::name coopname, const checksum256 &project_hash)
Открывает проект для инвестиций, копируя плановые показатели расходов в фактические.
Definition: projects.hpp:387
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, bool can_convert_to_project)
Создает проект
Definition: projects.hpp:153
void increment_total_propertors(eosio::name coopname, const checksum256 &project_hash)
Увеличивает количество проперторов в проекте на 1.
Definition: projects.hpp:478
void set_master(eosio::name coopname, uint64_t project_id, eosio::name master)
Назначает мастера проекта
Definition: projects.hpp:276
void edit_project(eosio::name coopname, const checksum256 &project_hash, const std::string &title, const std::string &description, const std::string &invite, const std::string &meta, const std::string &data, bool can_convert_to_project)
Редактирует существующий проект
Definition: projects.hpp:185
void add_investments(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &amount)
Добавляет инвестицию к проекту.
Definition: projects.hpp:327
void increment_total_authors(eosio::name coopname, const checksum256 &project_hash)
Увеличивает количество авторов в проекте на 1.
Definition: projects.hpp:526
void complete_expense(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &amount)
Завершает расход, добавляя сумму в used_expense_pool.
Definition: projects.hpp:464
void increase_total_returned_investments(eosio::name coopname, const uint64_t &project_id, const eosio::asset &amount)
Definition: projects.hpp:714
void increment_total_creators(eosio::name coopname, const checksum256 &project_hash)
Увеличивает количество создателей в проекте на 1.
Definition: projects.hpp:550
void update_status(eosio::name coopname, const checksum256 &project_hash, eosio::name new_status)
Обновляет статус проекта.
Definition: projects.hpp:292
void subtract_project_shares(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &shares_amount)
Уменьшает доли от общего пула долей проекта
Definition: projects.hpp:594
void expand_expense_pool(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &additional_amount)
Увеличивает целевой размер пула расходов проекта.
Definition: projects.hpp:370
void subtract_membership_available(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &amount)
Вычитает доступные членские средства из проекта
Definition: projects.hpp:674
void validate_parent_hash(eosio::name coopname, const checksum256 &parent_hash)
Проверяет валидность parent_hash согласно правилам проектов
Definition: projects.hpp:130
void close_project(eosio::name coopname, const checksum256 &project_hash)
Закрывает проект от инвестиций, устанавливая флаг is_opened = false.
Definition: projects.hpp:410
void add_property_base(eosio::name coopname, const checksum256 &project_hash, const eosio::asset &property_amount)
Добавляет имущественный взнос к проекту.
Definition: projects.hpp:210
void increment_votes_received(eosio::name coopname, const checksum256 &project_hash)
Увеличивает счетчик полученных голосов в проекте
Definition: projects.hpp:562
void distribute_membership_funds(eosio::name coopname, const checksum256 &project_hash, asset amount)
Definition: projects.hpp:657
void delete_project(eosio::name coopname, const checksum256 &project_hash)
Удаляет проект
Definition: projects.hpp:731
void increment_total_contributors(eosio::name coopname, const checksum256 &project_hash)
Увеличивает количество зарегистрированных вкладчиков в проекте на 1.
Definition: projects.hpp:502
void increment_total_coordinators(eosio::name coopname, const checksum256 &project_hash)
Увеличивает количество координаторов в проекте на 1.
Definition: projects.hpp:538
void add_commit(eosio::name coopname, const checksum256 &project_hash, const generation_amounts &delta)
Добавляет коммит к проекту, обновляя фактические показатели и счетчик коммитов.
Definition: projects.hpp:233
global_state get_global_state(name coopname)
Получает текущее глобальное состояние.
Definition: global_state.hpp:66
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:87
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
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
bool can_convert_to_project
Разрешена ли конвертация в кошелек данного проекта
Definition: projects.hpp:51
fact_pool fact
Фактические показатели
Definition: projects.hpp:65
bool is_opened
Открыт ли проект для инвестиций
Definition: projects.hpp:49
eosio::name status
Статус проекта
Definition: projects.hpp:47
crps_data crps
Данные CRPS для распределения наград
Definition: projects.hpp:66
bool is_planed
Запланирован ли проект (установлен план)
Definition: projects.hpp:50
membership_crps membership
Данные CRPS для распределения членских взносов
Definition: projects.hpp:72
uint64_t by_created_at() const
Индекс по времени создания (2)
Definition: projects.hpp:78
uint64_t primary_key() const
Первичный ключ (1)
Definition: projects.hpp:77
std::string invite
Приглашение к проекту
Definition: projects.hpp:58
voting_data voting
Данные голосования по методу Водянова
Definition: projects.hpp:69
std::string meta
Метаданные проекта
Definition: projects.hpp:60
plan_pool plan
Плановые показатели
Definition: projects.hpp:64
checksum256 by_hash() const
Индекс по хэшу проекта (3)
Definition: projects.hpp:79
counts_data counts
Счетчики участников проекта
Definition: projects.hpp:62
checksum256 by_parent_hash() const
Индекс по хэшу родительского проекта (4)
Definition: projects.hpp:80
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: counts.hpp:8
Definition: membership_crps.hpp:8