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
14namespace Capital::Projects {
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 }// namespace Capital::Projects::Status
28}// namespace Capital::Projects
29
30namespace Capital {
39struct [[eosio::table, eosio::contract(CAPITAL)]] project {
40 uint64_t id;
41
42 name coopname;
43 checksum256 project_hash;
44 checksum256 parent_hash;
45
46 eosio::name status;
47
48 bool is_opened;
49 bool is_planed;
51
52 // Мастер проекта
53 name master;
54
55 std::string title;
56 std::string description;
57 std::string invite;
58 std::string data;
59 std::string meta;
60
62
64
68
69 // Голосование по методу Водянова
71
72 // Время создания проекта
73 time_point_sec created_at = current_time_point();
74
75 // ВНИМАНИЕ: поле добавлено в ХВОСТ struct и обёрнуто в binary_extension.
76 // Поля в таблицу EOSIO можно дописывать только в конец struct и только через
77 // binary_extension — иначе ломается десериализация уже записанных проектов.
78 // Контракт стоит на проде, строки projects записаны без этого поля: до
79 // прогона capital::migrate оно приходит как absent и читается через
80 // Capital::Projects::debt_ext_or_zero (absent → 0.0000 RUB).
81 //
82 // Зачем поле: сумма непогашенных ссуд по всем сегментам проекта. Это
83 // производная от segments, а не самостоятельное состояние — она нужна,
84 // чтобы деаллокация (diallocate) могла за O(1) понять, есть ли в проекте
85 // выданные ссуды, и не уронить инвариант provisional_amount >= debt_amount
86 // из update_segment_total_cost. Пересчитывается обходом сегментов в
87 // sync_total_debt: при migrate, при выдаче/отклонении ссуды, при конвертации
88 // сегмента и в самой деаллокации.
89 eosio::binary_extension<eosio::asset> total_debt_amount;
90
91 uint64_t primary_key() const { return id; }
92 uint64_t by_created_at() const { return created_at.sec_since_epoch(); }
93 checksum256 by_hash() const { return project_hash; }
94 checksum256 by_parent_hash() const { return parent_hash; }
95};
96
97typedef eosio::multi_index<"projects"_n, project,
98 indexed_by<"bycreatedat"_n, const_mem_fun<project, uint64_t, &project::by_created_at>>,
99 indexed_by<"byhash"_n, const_mem_fun<project, checksum256, &project::by_hash>>,
100 indexed_by<"byparenthash"_n, const_mem_fun<project, checksum256, &project::by_parent_hash>>
102
103}// namespace Capital
104
105namespace Capital::Projects {
113 inline std::optional<project> get_project(eosio::name coopname, const checksum256 &project_hash) {
114 project_index projects(_capital, coopname.value);
115 auto project_hash_index = projects.get_index<"byhash"_n>();
116
117 auto project_itr = project_hash_index.find(project_hash);
118
119 if (project_itr == project_hash_index.end()) {
120 return std::nullopt;
121 }
122
123 return project(*project_itr);
124 }
125
133 inline project get_project_or_fail(eosio::name coopname, const checksum256 &project_hash) {
134 auto project = get_project(coopname, project_hash);
135 eosio::check(project.has_value(), "Проект с указанным хэшем не найден");
136 return project.value();
137 }
138
146 inline project get_project_by_id_or_fail(eosio::name coopname, const uint64_t project_id) {
147 project_index projects(_capital, coopname.value);
148 auto prj = projects.find(project_id);
149 eosio::check(prj != projects.end(), "Проект не найден");
150
151 return project(*prj);
152 }
153
159 inline bool has_component_projects(eosio::name coopname, const checksum256 &project_hash) {
160 project_index projects(_capital, coopname.value);
161 auto parent_idx = projects.get_index<"byparenthash"_n>();
162 auto it = parent_idx.find(project_hash);
163 return it != parent_idx.end() && it->parent_hash == project_hash;
164 }
165
166
173 inline void validate_parent_hash(eosio::name coopname, const checksum256 &parent_hash) {
174 checksum256 empty_hash = checksum256();
175
176 if (parent_hash != empty_hash) {
177 auto parent_project = get_project_or_fail(coopname, parent_hash);
178 eosio::check(parent_project.parent_hash == empty_hash,
179 "Запрещено создавать проекты глубже одного уровня. У родительского проекта не должно быть своего родителя");
180 }
181 }
182
195 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) {
196
197 project_index projects(_capital, coopname.value);
198
199 projects.emplace(coopname, [&](auto& row) {
200 row.id = get_global_id_in_scope(_capital, coopname, "projects"_n);
202 row.project_hash = project_hash;
203 row.parent_hash = parent_hash;
204 row.coopname = coopname;
205 row.title = title;
206 row.description = description;
207 row.invite = invite;
208 row.meta = meta;
209 row.data = data;
210 row.is_planed = false; // Изначально проект не запланирован
211 row.is_authorized = false; // Все проекты требуют инициализации
212 row.authorization = document2(); // Пустой документ авторизации
213 });
214 }
215
227 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) {
228
229 project_index projects(_capital, coopname.value);
230 auto project_itr = projects.find(project_id);
231 eosio::check(project_itr != projects.end(), "Проект не найден");
232 projects.modify(project_itr, coopname, [&](auto& row) {
233 // Всегда обновляем строковые поля
234 row.title = title;
235 row.description = description;
236 row.invite = invite;
237 row.meta = meta;
238 row.data = data;
239 });
240 }
241
248 inline void add_property_base(eosio::name coopname, uint64_t project_id, const eosio::asset &property_amount) {
249 project_index projects(_capital, coopname.value);
250 auto project = projects.find(project_id);
251 eosio::check(project != projects.end(), "Проект не найден");
252 projects.modify(project, _capital, [&](auto &p) {
253 // Добавляем стоимость имущества в пул себестоимостей
254 p.fact.property_base_pool += property_amount;
255
256 // Обновляем общую сумму генерации (имущество - это интеллектуальный вклад)
257 p.fact.total_generation_pool += property_amount;
258
259 // Обновляем общую сумму вкладов
260 p.fact.total_contribution += property_amount;
261 p.fact.total = p.fact.total_contribution;
262 p.fact.total_with_investments = p.fact.total + p.fact.total_used_investments + p.fact.used_expense_pool;
263 });
264 }
265
272 inline void add_commit(eosio::name coopname, uint64_t project_id, const generation_amounts &delta) {
273 project_index projects(_capital, coopname.value);
274 auto project = projects.find(project_id);
275 eosio::check(project != projects.end(), "Проект не найден");
276 projects.modify(project, _capital, [&](auto &p) {
277 // Увеличиваем счетчик коммитов
278 p.counts.total_commits++;
279
280 // Обновляем время создателей
281 p.fact.creators_hours += delta.creators_hours;
282 // Инкрементальное вычисление среднего для стоимости часа
283 if (delta.hour_cost.amount > 0) {
284 // Расчет скользящего среднего:
285 // новая_средняя = (предыдущая_средняя * (n-1) + новое_значение) / n
286 auto previous_commits = p.counts.total_commits - 1;
287 if (previous_commits == 0) {
288 // Первый коммит - просто устанавливаем значение
289 p.fact.hour_cost = delta.hour_cost;
290 } else {
291 // Последующие коммиты - рассчитываем среднее
292 auto weighted_sum = p.fact.hour_cost.amount * previous_commits;
293 auto new_average = (weighted_sum + delta.hour_cost.amount) / p.counts.total_commits;
294 p.fact.hour_cost = asset(new_average, p.fact.hour_cost.symbol);
295 }
296 }
297
298 // Обновляем остальные пулы
299 p.fact.creators_base_pool += delta.creators_base_pool;
300 p.fact.authors_base_pool += delta.authors_base_pool;
301 p.fact.authors_bonus_pool += delta.authors_bonus_pool;
302 p.fact.creators_bonus_pool += delta.creators_bonus_pool;
303
304 // ВАЖНО: total_generation_pool должен включать все интеллектуальные вклады,
305 // включая уже накопленную базу координаторов и имущество
306 p.fact.total_generation_pool = p.fact.creators_base_pool + p.fact.authors_base_pool +
307 p.fact.creators_bonus_pool + p.fact.authors_bonus_pool +
308 p.fact.coordinators_base_pool + p.fact.property_base_pool;
309
310 // Пересчитываем премии участников от обновленной общей генерации
311 p.fact.contributors_bonus_pool = Capital::Core::Generation::calculate_contributors_bonus_pool(p.fact.total_generation_pool);
312
313 // Общая сумма вкладов пайщиков
314 p.fact.total_contribution = p.fact.total_generation_pool + p.fact.contributors_bonus_pool;
315
316 p.fact.total = p.fact.total_contribution;
317 // Пересчитываем коэффициенты
318 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);
319 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);
320
321 // Пересчитываем используемую часть инвестиций и полную стоимость
322 p.fact.total_used_investments = eosio::asset(
323 static_cast<int64_t>(static_cast<double>(p.fact.total_received_investments.amount) * (p.fact.use_invest_percent / 100.0)),
325 );
326 p.fact.total_with_investments = p.fact.total + p.fact.total_used_investments + p.fact.used_expense_pool;
327 });
328 }
329
337 inline void set_master(eosio::name coopname, uint64_t project_id, eosio::name master) {
338 Capital::project_index projects(_capital, coopname.value);
339 auto project_itr = projects.find(project_id);
340 eosio::check(project_itr != projects.end(), "Проект не найден");
341 projects.modify(project_itr, coopname, [&](auto &p) {
342 p.master = master;
343 });
344
345 }
346
353 inline void update_status(eosio::name coopname, uint64_t project_id, eosio::name new_status) {
354 project_index projects(_capital, coopname.value);
355 auto project = projects.find(project_id);
356 eosio::check(project != projects.end(), "Проект не найден");
357
358 projects.modify(project, coopname, [&](auto &p) {
359 p.status = new_status;
360 });
361 }
362
369 inline void set_plan(eosio::name coopname, uint64_t project_id, const plan_pool &calculated_plan) {
370 project_index projects(_capital, coopname.value);
371 auto project = projects.find(project_id);
372 eosio::check(project != projects.end(), "Проект не найден");
373 projects.modify(project, coopname, [&](auto &p) {
374 p.plan = calculated_plan;
375 p.is_planed = true; // Проект теперь запланирован
376 });
377 }
378
385 inline void add_investments(eosio::name coopname, uint64_t project_id, const eosio::asset &amount) {
386 project_index projects(_capital, coopname.value);
387 auto project = projects.find(project_id);
388 eosio::check(project != projects.end(), "Проект не найден");
389
390 projects.modify(project, coopname, [&](auto &p) {
391 // Рассчитываем сколько средств еще нужно для достижения цели по расходам
392 eosio::asset expense_gap = p.plan.target_expense_pool - p.fact.accumulated_expense_pool;
393
394 // Рассчитываем какую часть инвестиций направить в пул расходов
395 eosio::asset to_expense_pool = asset(0, _root_govern_symbol);
396
397 if (expense_gap.amount > 0) {
398 // Рассчитываем процент от инвестиций для пула расходов
399 auto st = Capital::State::get_global_state(coopname);
400 eosio::asset potential_to_expense = amount * st.config.expense_pool_percent / 100;
401
402 // Но не больше, чем нужно для достижения цели
403 to_expense_pool = (potential_to_expense.amount <= expense_gap.amount) ? potential_to_expense : expense_gap;
404 }
405
406 // Остальные средства идут в инвестиционный пул
407 eosio::asset to_invest_pool = amount - to_expense_pool;
408
409 // Обновляем пулы
410 p.fact.invest_pool += to_invest_pool;
411 p.fact.accumulated_expense_pool += to_expense_pool;
412 p.fact.total_received_investments += amount; // Увеличиваем общую сумму полученных инвестиций
413
414 // Пересчитываем коэффициенты возврата
415 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);
416 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);
417
418 // Пересчитываем используемую часть инвестиций и полную стоимость
419 p.fact.total_used_investments = eosio::asset(
420 static_cast<int64_t>(static_cast<double>(p.fact.total_received_investments.amount) * (p.fact.use_invest_percent / 100.0)),
422 );
423 p.fact.total_with_investments = p.fact.total + p.fact.total_used_investments + p.fact.used_expense_pool;
424 });
425 }
426
427
434 inline void expand_expense_pool(eosio::name coopname, uint64_t project_id, const eosio::asset &additional_amount) {
435 project_index projects(_capital, coopname.value);
436 auto project = projects.find(project_id);
437 eosio::check(project != projects.end(), "Проект не найден");
438
439 projects.modify(project, coopname, [&](auto &p) {
440 // Увеличиваем целевой размер пула расходов в фактических показателях
441 p.fact.target_expense_pool += additional_amount;
442 });
443 }
444
450 inline void open_project(eosio::name coopname, uint64_t project_id) {
451
452 project_index projects(_capital, coopname.value);
453 auto project = projects.find(project_id);
454 eosio::check(project != projects.end(), "Проект не найден");
455 projects.modify(project, coopname, [&](auto &p) {
456 // Копируем целевые показатели расходов из плана в факт
457 p.fact.target_expense_pool = p.plan.target_expense_pool;
458
459 // Остальные поля расходов остаются нулевыми (accumulated_expense_pool, used_expense_pool)
460 // так как фактических поступлений и трат еще не было
461
462 // Меняем статус на "opened"
463 p.is_opened = true;
464 });
465 }
466
472 inline void close_project(eosio::name coopname, uint64_t project_id) {
473 project_index projects(_capital, coopname.value);
474 auto project = projects.find(project_id);
475 eosio::check(project != projects.end(), "Проект не найден");
476 projects.modify(project, coopname, [&](auto &p) {
477 // Закрываем проект от инвестиций
478 p.is_opened = false;
479 });
480 }
481
488 inline void reserve_expense_funds(eosio::name coopname, uint64_t project_id, const eosio::asset &amount) {
489 project_index projects(_capital, coopname.value);
490 auto project_for_modify = projects.find(project_id);
491 eosio::check(project_for_modify != projects.end(), "Проект не найден");
492
493
494 projects.modify(project_for_modify, coopname, [&](auto &p) {
495 eosio::check(p.fact.accumulated_expense_pool >= amount,
496 "Недостаточно средств в пуле расходов");
497 p.fact.accumulated_expense_pool -= amount;
498 });
499 }
500
507 inline void return_expense_funds(eosio::name coopname, uint64_t project_id, const eosio::asset &amount) {
508 project_index projects(_capital, coopname.value);
509 auto project_for_modify = projects.find(project_id);
510 eosio::check(project_for_modify != projects.end(), "Проект не найден");
511
512 projects.modify(project_for_modify, coopname, [&](auto &p) {
513 p.fact.accumulated_expense_pool += amount;
514 });
515 }
516
523 inline void complete_expense(eosio::name coopname, uint64_t project_id, const eosio::asset &amount) {
524 project_index projects(_capital, coopname.value);
525 auto project_for_modify = projects.find(project_id);
526 eosio::check(project_for_modify != projects.end(), "Проект не найден");
527
528 projects.modify(project_for_modify, coopname, [&](auto &p) {
529 p.fact.used_expense_pool += amount;
530
531 // Пересчитываем total, т.к. он зависит от вкладов, но больше не включает расходы напрямую
532 p.fact.total = p.fact.total_contribution;
533
534 // Пересчитываем use_invest_percent, т.к. он зависит от used_expense_pool
535 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);
536
537 // Пересчитываем используемую часть инвестиций и полную стоимость
538 p.fact.total_used_investments = eosio::asset(
539 static_cast<int64_t>(static_cast<double>(p.fact.total_received_investments.amount) * (p.fact.use_invest_percent / 100.0)),
541 );
542 p.fact.total_with_investments = p.fact.total + p.fact.total_used_investments + p.fact.used_expense_pool;
543 });
544 }
545
549 inline void increment_total_propertors(eosio::name coopname, uint64_t project_id) {
550 project_index projects(_capital, coopname.value);
551 auto project_for_modify = projects.find(project_id);
552 eosio::check(project_for_modify != projects.end(), "Проект не найден");
553
554 projects.modify(project_for_modify, _capital, [&](auto &p) {
555 p.counts.total_propertors += 1;
556 });
557 }
558
562 inline void increment_total_investors(eosio::name coopname, uint64_t project_id) {
563 project_index projects(_capital, coopname.value);
564 auto project_for_modify = projects.find(project_id);
565 eosio::check(project_for_modify != projects.end(), "Проект не найден");
566
567 projects.modify(project_for_modify, _capital, [&](auto &p) {
568 p.counts.total_investors += 1;
569 });
570 }
571
575 inline void increment_total_contributors(eosio::name coopname, uint64_t project_id) {
576 project_index projects(_capital, coopname.value);
577 auto project_for_modify = projects.find(project_id);
578 eosio::check(project_for_modify != projects.end(), "Проект не найден");
579
580 projects.modify(project_for_modify, _capital, [&](auto &p) {
581 p.counts.total_contributors += 1;
582 });
583 }
584
588 inline void increment_total_contributor_shares(eosio::name coopname, uint64_t project_id, eosio::asset shares) {
589 project_index projects(_capital, coopname.value);
590 auto project_for_modify = projects.find(project_id);
591
592 eosio::check(project_for_modify != projects.end(), "Проект не найден");
593 projects.modify(project_for_modify, _capital, [&](auto &p) {
594 p.crps.total_capital_contributors_shares += shares;
595 });
596 }
597
601 inline void increment_total_authors(eosio::name coopname, uint64_t project_id) {
602 project_index projects(_capital, coopname.value);
603 auto project_for_modify = projects.find(project_id);
604 eosio::check(project_for_modify != projects.end(), "Проект не найден");
605 projects.modify(project_for_modify, _capital, [&](auto &p) {
606 p.counts.total_authors += 1;
607 });
608 }
609
613 inline void increment_total_coordinators(eosio::name coopname, uint64_t project_id) {
614 project_index projects(_capital, coopname.value);
615 auto project_for_modify = projects.find(project_id);
616 eosio::check(project_for_modify != projects.end(), "Проект не найден");
617 projects.modify(project_for_modify, _capital, [&](auto &p) {
618 p.counts.total_coordinators += 1;
619 });
620 }
621
625 inline void increment_total_creators(eosio::name coopname, uint64_t project_id) {
626 project_index projects(_capital, coopname.value);
627 auto project_for_modify = projects.find(project_id);
628 eosio::check(project_for_modify != projects.end(), "Проект не найден");
629 projects.modify(project_for_modify, _capital, [&](auto &p) {
630 p.counts.total_creators += 1;
631 });
632 }
633
637 inline void increment_total_unique_participants(eosio::name coopname, uint64_t project_id) {
638 project_index projects(_capital, coopname.value);
639 auto project_for_modify = projects.find(project_id);
640
641 projects.modify(project_for_modify, _capital, [&](auto &p) {
642 p.counts.total_unique_participants += 1;
643 });
644 }
645
649 inline void increment_votes_received(eosio::name coopname, uint64_t project_id) {
650 project_index projects(_capital, coopname.value);
651 auto project_for_modify = projects.find(project_id);
652 eosio::check(project_for_modify != projects.end(), "Проект не найден");
653
654 projects.modify(project_for_modify, _capital, [&](auto &p) {
655 p.voting.votes_received++;
656 });
657 }
658
659 inline void increase_total_returned_investments(eosio::name coopname, const uint64_t &project_id, const eosio::asset &amount) {
660 // Обновляем проект - увеличиваем сумму возвращенных инвестиций
661 Capital::project_index projects(_capital, coopname.value);
662 auto project_itr = projects.find(project_id);
663 eosio::check(project_itr != projects.end(), "Проект не найден");
664 projects.modify(project_itr, coopname, [&](auto &p) {
665 p.fact.total_returned_investments += amount;
666 });
667
668
669 }
670
677 inline void add_used_for_compensation(eosio::name coopname, uint64_t project_id, const eosio::asset &amount) {
678 project_index projects(_capital, coopname.value);
679 auto project = projects.find(project_id);
680 eosio::check(project != projects.end(), "Проект не найден");
681 projects.modify(project, _capital, [&](auto &p) {
682 p.fact.total_used_for_compensation += amount;
683 });
684 }
685
686
693 inline void subtract_used_for_compensation(eosio::name coopname, uint64_t project_id, const eosio::asset &amount) {
694 project_index projects(_capital, coopname.value);
695 auto project = projects.find(project_id);
696 eosio::check(project != projects.end(), "Проект не найден");
697 eosio::check(project->fact.total_used_for_compensation >= amount, "Недостаточно использованных инвестиций для вычитания");
698
699 projects.modify(project, _capital, [&](auto &p) {
700 p.fact.total_used_for_compensation -= amount;
701 });
702 }
703
709 inline void increment_converted_segments(eosio::name coopname, uint64_t project_id) {
710 project_index projects(_capital, coopname.value);
711 auto project = projects.find(project_id);
712 eosio::check(project != projects.end(), "Проект не найден");
713
714 projects.modify(project, _capital, [&](auto &p) {
715 p.counts.total_converted_segments++;
716 });
717 }
718
725 inline bool are_all_segments_converted(eosio::name coopname, uint64_t project_id) {
726 project_index projects(_capital, coopname.value);
727 auto project = projects.find(project_id);
728 eosio::check(project != projects.end(), "Проект не найден");
729 // Все уникальные участники должны сконвертировать свои сегменты
731 }
732
754 inline eosio::asset calculate_unused_investments(const project &prj) {
755 int64_t used = prj.fact.total_used_for_compensation.amount + prj.fact.used_expense_pool.amount;
756 int64_t unused = prj.fact.total_received_investments.amount - used;
757
758 return eosio::asset(unused > 0 ? unused : 0, _root_govern_symbol);
759 }
760
769 inline eosio::asset debt_ext_or_zero(const eosio::binary_extension<eosio::asset> &v) {
770 if (!v.has_value()) {
771 return eosio::asset(0, _root_govern_symbol);
772 }
773
774 const eosio::asset &a = v.value();
775 if (a.symbol == _root_govern_symbol) {
776 return a;
777 }
778
779 eosio::check(a.amount == 0, "total_debt_amount содержит ненулевую сумму с несовместимым символом");
780 return eosio::asset(0, _root_govern_symbol);
781 }
782
788 inline void delete_project(eosio::name coopname, uint64_t project_id) {
789 project_index projects(_capital, coopname.value);
790 auto project_itr = projects.find(project_id);
791 eosio::check(project_itr != projects.end(), "Проект не найден");
792 projects.erase(project_itr);
793 }
794
798 inline void authorize_project(eosio::name coopname, uint64_t project_id, const document2 &decision) {
799 project_index projects(_capital, coopname.value);
800 auto project_itr = projects.find(project_id);
801 eosio::check(project_itr != projects.end(), "Проект не найден");
802 projects.modify(project_itr, coopname, [&](auto& row) {
803 row.is_authorized = true;
804 row.authorization = decision;
805 });
806 }
807
814 inline void revoke_authorization(eosio::name coopname, uint64_t project_id) {
815 project_index projects(_capital, coopname.value);
816 auto project_itr = projects.find(project_id);
817 eosio::check(project_itr != projects.end(), "Проект не найден");
818 projects.modify(project_itr, coopname, [&](auto& row) {
819 row.is_authorized = false;
820 row.authorization = document2(); // Пустой документ авторизации
821 });
822 }
823
827 inline void increment_total_voters(eosio::name coopname, uint64_t project_id) {
828 project_index projects(_capital, coopname.value);
829 auto project = projects.find(project_id);
830 eosio::check(project != projects.end(), "Проект не найден");
831 projects.modify(project, _capital, [&](auto &p) {
832 p.voting.total_voters++;
833 });
834 }
835
836
837}// namespace Project
static constexpr eosio::name _capital
Definition: consts.hpp:166
static constexpr eosio::symbol _root_govern_symbol
Definition: consts.hpp:231
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 ACTIVE
Проект активен для коммитов
Definition: projects.hpp:23
const eosio::name FINALIZED
Проект финализирован (все конвертации завершены, неиспользованные средства возвращены)
Definition: projects.hpp:26
Definition: project_debts.cpp:11
void increment_total_voters(eosio::name coopname, uint64_t project_id)
Увеличивает счетчик общего количества участников голосования в проекте
Definition: projects.hpp:827
bool has_component_projects(eosio::name coopname, const checksum256 &project_hash)
Есть ли у проекта дочерние проекты-компоненты (их parent_hash совпадает с хэшем родителя)
Definition: projects.hpp:159
void increment_converted_segments(eosio::name coopname, uint64_t project_id)
Инкрементирует счётчик сконвертированных сегментов
Definition: projects.hpp:709
void add_commit(eosio::name coopname, uint64_t project_id, const generation_amounts &delta)
Добавляет коммит к проекту, обновляя фактические показатели и счетчик коммитов.
Definition: projects.hpp:272
std::optional< project > get_project(eosio::name coopname, const checksum256 &project_hash)
Получает проект по хэшу
Definition: projects.hpp:113
void open_project(eosio::name coopname, uint64_t project_id)
Открывает проект для инвестиций, копируя плановые показатели расходов в фактические.
Definition: projects.hpp:450
void update_status(eosio::name coopname, uint64_t project_id, eosio::name new_status)
Обновляет статус проекта.
Definition: projects.hpp:353
void reserve_expense_funds(eosio::name coopname, uint64_t project_id, const eosio::asset &amount)
Резервирует средства для расхода, уменьшая accumulated_expense_pool.
Definition: projects.hpp:488
void increment_votes_received(eosio::name coopname, uint64_t project_id)
Увеличивает счетчик полученных голосов в проекте
Definition: projects.hpp:649
void delete_project(eosio::name coopname, uint64_t project_id)
Удаляет проект
Definition: projects.hpp:788
void add_investments(eosio::name coopname, uint64_t project_id, const eosio::asset &amount)
Добавляет инвестицию к проекту.
Definition: projects.hpp:385
void increment_total_investors(eosio::name coopname, uint64_t project_id)
Увеличивает количество инвесторов в проекте на 1.
Definition: projects.hpp:562
eosio::asset debt_ext_or_zero(const eosio::binary_extension< eosio::asset > &v)
Значение binary_extension<asset> total_debt_amount или ноль в RUB.
Definition: projects.hpp:769
void increment_total_unique_participants(eosio::name coopname, uint64_t project_id)
Увеличивает количество уникальных участников в проекте на 1.
Definition: projects.hpp:637
void add_property_base(eosio::name coopname, uint64_t project_id, const eosio::asset &property_amount)
Добавляет имущественный взнос к проекту.
Definition: projects.hpp:248
void expand_expense_pool(eosio::name coopname, uint64_t project_id, const eosio::asset &additional_amount)
Увеличивает целевой размер пула расходов проекта.
Definition: projects.hpp:434
void increment_total_contributors(eosio::name coopname, uint64_t project_id)
Увеличивает количество зарегистрированных участников в проекте на 1.
Definition: projects.hpp:575
void authorize_project(eosio::name coopname, uint64_t project_id, const document2 &decision)
Устанавливает авторизацию проекта советом
Definition: projects.hpp:798
project get_project_or_fail(eosio::name coopname, const checksum256 &project_hash)
Получает проект по хэшу, если проект не найден, выбрасывает исключение
Definition: projects.hpp:133
void increment_total_coordinators(eosio::name coopname, uint64_t project_id)
Увеличивает количество координаторов в проекте на 1.
Definition: projects.hpp:613
project get_project_by_id_or_fail(eosio::name coopname, const uint64_t project_id)
Получает проект по id.
Definition: projects.hpp:146
void set_master(eosio::name coopname, uint64_t project_id, eosio::name master)
Назначает мастера проекта
Definition: projects.hpp:337
void add_used_for_compensation(eosio::name coopname, uint64_t project_id, const eosio::asset &amount)
Увеличивает сумму использованных для компенсации инвестиций
Definition: projects.hpp:677
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:195
void close_project(eosio::name coopname, uint64_t project_id)
Закрывает проект от инвестиций, устанавливая флаг is_opened = false.
Definition: projects.hpp:472
void increment_total_propertors(eosio::name coopname, uint64_t project_id)
Увеличивает количество проперторов в проекте на 1.
Definition: projects.hpp:549
void increase_total_returned_investments(eosio::name coopname, const uint64_t &project_id, const eosio::asset &amount)
Definition: projects.hpp:659
void subtract_used_for_compensation(eosio::name coopname, uint64_t project_id, const eosio::asset &amount)
Уменьшает сумму использованных для компенсации инвестиций
Definition: projects.hpp:693
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:227
void complete_expense(eosio::name coopname, uint64_t project_id, const eosio::asset &amount)
Завершает расход, добавляя сумму в used_expense_pool.
Definition: projects.hpp:523
eosio::asset calculate_unused_investments(const project &prj)
Считает неиспользованные проектом инвестиции
Definition: projects.hpp:754
void revoke_authorization(eosio::name coopname, uint64_t project_id)
Сбрасывает авторизацию проекта Устанавливает флаг авторизации в false и очищает документ авторизации
Definition: projects.hpp:814
void increment_total_authors(eosio::name coopname, uint64_t project_id)
Увеличивает количество авторов в проекте на 1.
Definition: projects.hpp:601
void validate_parent_hash(eosio::name coopname, const checksum256 &parent_hash)
Проверяет валидность parent_hash согласно правилам проектов
Definition: projects.hpp:173
void increment_total_creators(eosio::name coopname, uint64_t project_id)
Увеличивает количество создателей в проекте на 1.
Definition: projects.hpp:625
void increment_total_contributor_shares(eosio::name coopname, uint64_t project_id, eosio::asset shares)
Увеличивает количество вкладчических долей в проекте на указанное количество
Definition: projects.hpp:588
void return_expense_funds(eosio::name coopname, uint64_t project_id, const eosio::asset &amount)
Возвращает зарезервированные средства в accumulated_expense_pool.
Definition: projects.hpp:507
bool are_all_segments_converted(eosio::name coopname, uint64_t project_id)
Проверяет завершили ли все участники конвертацию сегментов
Definition: projects.hpp:725
void set_plan(eosio::name coopname, uint64_t project_id, const plan_pool &calculated_plan)
Устанавливает плановые показатели проекта.
Definition: projects.hpp:369
global_state get_global_state(name coopname)
Получает текущее глобальное состояние.
Definition: global_state.hpp:118
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:101
Definition: eosio.msig.hpp:34
Структура для данных CRPS (Cumulative Reward Per Share) распределения наград
Definition: crps.hpp:18
Структура фактических показателей проекта
Definition: fact_pool.hpp:13
eosio::asset total_received_investments
Общая сумма всех полученных инвестиций (до распределения)
Definition: fact_pool.hpp:42
eosio::asset target_expense_pool
Целевой размер расходов (копируется из плана)
Definition: fact_pool.hpp:34
eosio::asset used_expense_pool
Фактически израсходованные средства
Definition: fact_pool.hpp:36
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:39
std::string data
Шаблон/данные проекта
Definition: projects.hpp:58
eosio::binary_extension< eosio::asset > total_debt_amount
Сумма непогашенных ссуд по сегментам проекта (производная от segments)
Definition: projects.hpp:89
name master
Мастер проекта
Definition: projects.hpp:53
checksum256 project_hash
Хэш проекта (внешний ключ)
Definition: projects.hpp:43
std::string description
Описание проекта
Definition: projects.hpp:56
fact_pool fact
Фактические показатели
Definition: projects.hpp:66
bool is_opened
Открыт ли проект для инвестиций
Definition: projects.hpp:48
eosio::name status
Статус проекта
Definition: projects.hpp:46
crps_data crps
Данные CRPS для распределения наград
Definition: projects.hpp:67
bool is_planed
Запланирован ли проект (установлен план)
Definition: projects.hpp:49
uint64_t by_created_at() const
Индекс по времени создания (2)
Definition: projects.hpp:92
uint64_t primary_key() const
Первичный ключ (1)
Definition: projects.hpp:91
std::string invite
Приглашение к проекту
Definition: projects.hpp:57
voting_data voting
Данные голосования по методу Водянова
Definition: projects.hpp:70
std::string meta
Метаданные проекта
Definition: projects.hpp:59
plan_pool plan
Плановые показатели
Definition: projects.hpp:65
checksum256 by_hash() const
Индекс по хэшу проекта (3)
Definition: projects.hpp:93
counts_data counts
Счетчики участников проекта
Definition: projects.hpp:63
checksum256 by_parent_hash() const
Индекс по хэшу родительского проекта (4)
Definition: projects.hpp:94
bool is_authorized
Авторизован ли проект советом
Definition: projects.hpp:50
std::string title
Название проекта
Definition: projects.hpp:55
uint64_t id
ID проекта (внутренний ключ)
Definition: projects.hpp:40
name coopname
Имя кооператива
Definition: projects.hpp:42
checksum256 parent_hash
Хэш родительского проекта (если есть)
Definition: projects.hpp:44
document2 authorization
Документ авторизации совета
Definition: projects.hpp:61
Структура данных для голосования по методу Водянова
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