COOPENOMICS  v1
Кооперативная Экономика
contributors.hpp
См. документацию.
1#pragma once
2
3using namespace eosio;
4using std::string;
5
6namespace Capital {
7
16 struct [[eosio::table, eosio::contract(CAPITAL)]] contributor {
17 uint64_t id;
18 name coopname;
19 name username;
20 checksum256 contributor_hash;
21 time_point_sec created_at;
22 name status;
23 std::string memo;
24 bool is_external_contract = false;
26 std::vector<checksum256> appendixes;
27
28 eosio::asset rate_per_hour = asset(0, _root_govern_symbol);
29 uint64_t hours_per_day = 0;
30 eosio::asset debt_amount = asset(0, _root_govern_symbol);
31
32 eosio::asset contributed_as_investor = asset(0, _root_govern_symbol);
33 eosio::asset contributed_as_creator = asset(0, _root_govern_symbol);
34 eosio::asset contributed_as_author = asset(0, _root_govern_symbol);
35 eosio::asset contributed_as_coordinator = asset(0, _root_govern_symbol);
36 eosio::asset contributed_as_contributor = asset(0, _root_govern_symbol);
37 eosio::asset contributed_as_propertor = asset(0, _root_govern_symbol);
38
39 uint64_t primary_key() const { return id; }
40 uint64_t by_username() const { return username.value; }
41 checksum256 by_hash() const { return contributor_hash; }
42 uint64_t by_investor_rating() const { return contributed_as_investor.amount; }
43 uint64_t by_creator_rating() const { return contributed_as_creator.amount; }
44 uint64_t by_author_rating() const { return contributed_as_author.amount; }
45 uint64_t by_coordinator_rating() const { return contributed_as_coordinator.amount; }
46 uint64_t by_contributor_rating() const { return contributed_as_contributor.amount; }
47 uint64_t by_propertor_rating() const { return contributed_as_propertor.amount; }
48 uint64_t by_rating() const { return contributed_as_investor.amount + contributed_as_creator.amount + contributed_as_author.amount + contributed_as_coordinator.amount + contributed_as_contributor.amount + contributed_as_propertor.amount; }
49 };
50
51typedef eosio::multi_index<
52 "contributors"_n, contributor,
53 indexed_by<"byusername"_n, const_mem_fun<contributor, uint64_t, &contributor::by_username>>,
54 indexed_by<"byhash"_n, const_mem_fun<contributor, checksum256, &contributor::by_hash>>,
55 indexed_by<"byinvrate"_n, const_mem_fun<contributor, uint64_t, &contributor::by_investor_rating>>,
56 indexed_by<"bycreatorate"_n, const_mem_fun<contributor, uint64_t, &contributor::by_creator_rating>>,
57 indexed_by<"byauthorate"_n, const_mem_fun<contributor, uint64_t, &contributor::by_author_rating>>,
58 indexed_by<"bycoordrate"_n, const_mem_fun<contributor, uint64_t, &contributor::by_coordinator_rating>>,
59 indexed_by<"bycontrate"_n, const_mem_fun<contributor, uint64_t, &contributor::by_contributor_rating>>,
60 indexed_by<"byprprate"_n, const_mem_fun<contributor, uint64_t, &contributor::by_propertor_rating>>,
61 indexed_by<"byrating"_n, const_mem_fun<contributor, uint64_t, &contributor::by_rating>>
63}// namespace Capital
64
66
73 namespace Status {
74 const eosio::name PENDING = "pending"_n;
75 const eosio::name ACTIVE = "active"_n;
76 }
77
78 inline void create_contributor(eosio::name coopname, eosio::name username, checksum256 contributor_hash, bool is_external_contract, document2 contract, eosio::asset rate_per_hour, uint64_t hours_per_day){
79 Capital::contributor_index contributors(_capital, coopname.value);
80
81 contributors.emplace(coopname, [&](auto &c) {
82 c.id = get_global_id_in_scope(_capital, coopname, "contributors"_n);
83 c.coopname = coopname;
84 c.username = username;
85 c.contributor_hash = contributor_hash;
87 c.is_external_contract = is_external_contract;
88 c.contract = contract;
89 c.created_at = eosio::current_time_point();
90 c.rate_per_hour = rate_per_hour;
91 c.hours_per_day = hours_per_day;
92 });
93 }
94
95
96 inline void import_contributor(eosio::name coopname, eosio::name username, checksum256 contributor_hash, std::string memo){
97 Capital::contributor_index contributors(_capital, coopname.value);
98
99 contributors.emplace(coopname, [&](auto &c) {
100 c.id = get_global_id_in_scope(_capital, coopname, "contributors"_n);
101 c.coopname = coopname;
102 c.username = username;
103 c.contributor_hash = contributor_hash;
105 c.is_external_contract = true;
106 c.created_at = eosio::current_time_point();
107 c.memo = memo;
108 c.rate_per_hour = asset(0, _root_govern_symbol);
109 c.hours_per_day = 0;
110 });
111 }
112
113
117 inline void push_appendix_to_contributor(eosio::name coopname, eosio::name username, checksum256 project_hash){
118 contributor_index contributors(_capital, coopname.value);
119 auto username_index = contributors.get_index<"byusername"_n>();
120
121 auto itr = username_index.find(username.value);
122
123 username_index.modify(*itr, _capital, [&](auto &c) {
124 c.appendixes.push_back(project_hash);
125 });
126 }
127
131 inline std::optional<contributor> get_contributor(eosio::name coopname, eosio::name username) {
132 contributor_index contributors(_capital, coopname.value);
133 auto username_index = contributors.get_index<"byusername"_n>();
134
135 auto itr = username_index.find(username.value);
136 if (itr == username_index.end()) {
137 return std::nullopt;
138 }
139
140 return *itr;
141 }
142
143
144
145
149 inline std::optional<contributor> get_contributor_by_hash(eosio::name coopname, const checksum256& contributor_hash) {
150 contributor_index contributors(_capital, coopname.value);
151 auto hash_index = contributors.get_index<"byhash"_n>();
152
153 auto itr = hash_index.find(contributor_hash);
154 if (itr == hash_index.end()) {
155 return std::nullopt;
156 }
157
158 return *itr;
159}
160
161
165inline bool is_contributor_has_appendix_in_project(eosio::name coopname, const checksum256 &project_hash, eosio::name username) {
166 auto contributor = get_contributor(coopname, username);
167 if (!contributor.has_value()) {
168 return false;
169 }
170
171 // Проверяем есть ли project_hash в векторе appendixes
172 for (const auto& appendix_project_hash : contributor->appendixes) {
173 if (appendix_project_hash == project_hash) {
174 return true;
175 }
176 }
177
178 return false;
179}
180
181
185inline std::optional<contributor> get_active_contributor_or_fail(eosio::name coopname, eosio::name username) {
186 auto contributor = get_contributor(coopname, username);
187 eosio::check(contributor.has_value(), "Создатель не подписывал договор УХД");
188 eosio::check(contributor -> status == Status::ACTIVE, "Договор УХД с пайщиком не активен");
189 return contributor;
190}
191
192
196inline std::optional<contributor> get_active_contributor_with_appendix_or_fail(eosio::name coopname, const checksum256 &project_hash, eosio::name username) {
197 auto contributor = get_active_contributor_or_fail(coopname, username);
198 eosio::check(is_contributor_has_appendix_in_project(coopname, project_hash, username),
199 "Пайщик не подписывал приложение к договору УХД для данного проекта");
200 return contributor;
201}
202
206inline void update_contributor_ratings_from_segment(eosio::name coopname, const Capital::Segments::segment& segment) {
207 Capital::contributor_index contributors(_capital, coopname.value);
208 auto username_index = contributors.get_index<"byusername"_n>();
209
210 auto itr = username_index.find(segment.username.value);
211
212 eosio::check(itr != username_index.end(), "Контрибьютор не найден");
213
214 username_index.modify(itr, _capital, [&](auto &c) {
215 if (segment.is_investor) {
216 c.contributed_as_investor += segment.investor_base;
217 }
218
219 if (segment.is_author) {
220 c.contributed_as_author += (segment.author_base + segment.author_bonus);
221 }
222
223 if (segment.is_creator) {
224 c.contributed_as_creator += (segment.creator_base + segment.creator_bonus);
225 }
226
227 if (segment.is_coordinator) {
228 c.contributed_as_coordinator += segment.coordinator_base;
229 }
230
231 if (segment.is_contributor) {
232 c.contributed_as_contributor += segment.contributor_bonus;
233 }
234
235 if (segment.is_propertor) {
236 c.contributed_as_propertor += segment.property_base;
237 }
238 });
239}
240
244inline void increase_debt_amount(eosio::name coopname, eosio::name username, eosio::asset amount) {
245 contributor_index contributors(_capital, coopname.value);
246 auto username_index = contributors.get_index<"byusername"_n>();
247 auto contributor_itr = username_index.find(username.value);
248
249 //TODO: make coopname payer
250 username_index.modify(contributor_itr, _capital, [&](auto &c) {
251 c.debt_amount += amount;
252 });
253}
254
258 inline void decrease_debt_amount(eosio::name coopname, eosio::name username, eosio::asset amount) {
259 contributor_index contributors(_capital, coopname.value);
260 auto username_index = contributors.get_index<"byusername"_n>();
261 auto contributor_itr = username_index.find(username.value);
262
263 eosio::check(contributor_itr->debt_amount >= amount, "Недостаточно долга для погашения");
264
265 //TODO: make coopname payer
266 username_index.modify(contributor_itr, _capital, [&](auto &c) {
267 c.debt_amount -= amount;
268 });
269}
270
274inline void edit_contributor(eosio::name coopname, eosio::name username, eosio::asset rate_per_hour, uint64_t hours_per_day) {
275 contributor_index contributors(_capital, coopname.value);
276 auto username_index = contributors.get_index<"byusername"_n>();
277 auto contributor_itr = username_index.find(username.value);
278
279 eosio::check(contributor_itr != username_index.end(), "Вкладчик не найден");
280
281 username_index.modify(contributor_itr, coopname, [&](auto &c) {
282 c.rate_per_hour = rate_per_hour;
283 c.hours_per_day = hours_per_day;
284 });
285}
286
287}// namespace Capital::Contributors
Контракт Contributor управляет вкладами, распределением вознаграждений и выводом средств для участник...
Definition: contributor.hpp:17
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
const eosio::name ACTIVE
Авторизован/активен
Definition: contributors.hpp:75
const eosio::name PENDING
Ожидает подтверждения
Definition: contributors.hpp:74
Definition: contributors.hpp:65
void update_contributor_ratings_from_segment(eosio::name coopname, const Capital::Segments::segment &segment)
Обновляет накопительные показатели контрибьютора на основе его ролей и вкладов в сегменте
Definition: contributors.hpp:206
void decrease_debt_amount(eosio::name coopname, eosio::name username, eosio::asset amount)
Увеличивает долг контрибьютора
Definition: contributors.hpp:258
std::optional< contributor > get_active_contributor_with_appendix_or_fail(eosio::name coopname, const checksum256 &project_hash, eosio::name username)
Получает участника по имени аккаунта, проверяет активность и членство в проекте.
Definition: contributors.hpp:196
void create_contributor(eosio::name coopname, eosio::name username, checksum256 contributor_hash, bool is_external_contract, document2 contract, eosio::asset rate_per_hour, uint64_t hours_per_day)
Definition: contributors.hpp:78
void increase_debt_amount(eosio::name coopname, eosio::name username, eosio::asset amount)
Увеличивает долг контрибьютора
Definition: contributors.hpp:244
std::optional< contributor > get_contributor_by_hash(eosio::name coopname, const checksum256 &contributor_hash)
Получает участника по хэшу контрибьютора.
Definition: contributors.hpp:149
std::optional< contributor > get_contributor(eosio::name coopname, eosio::name username)
Получает участника по имени аккаунта.
Definition: contributors.hpp:131
void import_contributor(eosio::name coopname, eosio::name username, checksum256 contributor_hash, std::string memo)
Definition: contributors.hpp:96
std::optional< contributor > get_active_contributor_or_fail(eosio::name coopname, eosio::name username)
Получает участника по имени аккаунта и проверяет на активность.
Definition: contributors.hpp:185
bool is_contributor_has_appendix_in_project(eosio::name coopname, const checksum256 &project_hash, eosio::name username)
Проверяет есть ли у контрибьютора приложение для проекта
Definition: contributors.hpp:165
void edit_contributor(eosio::name coopname, eosio::name username, eosio::asset rate_per_hour, uint64_t hours_per_day)
Обновляет параметры вкладчика (часы в день и информацию о себе)
Definition: contributors.hpp:274
void push_appendix_to_contributor(eosio::name coopname, eosio::name username, checksum256 project_hash)
Добавляет project_hash в вектор appendixes у контрибьютора
Definition: contributors.hpp:117
Definition: balances.cpp:6
eosio::multi_index< "contributors"_n, contributor, indexed_by<"byusername"_n, const_mem_fun< contributor, uint64_t, &contributor::by_username > >, indexed_by<"byhash"_n, const_mem_fun< contributor, checksum256, &contributor::by_hash > >, indexed_by<"byinvrate"_n, const_mem_fun< contributor, uint64_t, &contributor::by_investor_rating > >, indexed_by<"bycreatorate"_n, const_mem_fun< contributor, uint64_t, &contributor::by_creator_rating > >, indexed_by<"byauthorate"_n, const_mem_fun< contributor, uint64_t, &contributor::by_author_rating > >, indexed_by<"bycoordrate"_n, const_mem_fun< contributor, uint64_t, &contributor::by_coordinator_rating > >, indexed_by<"bycontrate"_n, const_mem_fun< contributor, uint64_t, &contributor::by_contributor_rating > >, indexed_by<"byprprate"_n, const_mem_fun< contributor, uint64_t, &contributor::by_propertor_rating > >, indexed_by<"byrating"_n, const_mem_fun< contributor, uint64_t, &contributor::by_rating > > > contributor_index
Definition: contributors.hpp:62
Definition: eosio.msig.hpp:34
Таблица сегментов хранит данные о вкладах участника в проект.
Definition: segments.hpp:30
bool is_investor
Является ли участник инвестором
Definition: segments.hpp:43
bool is_coordinator
Является ли участник координатором
Definition: segments.hpp:42
eosio::name username
Имя участника
Definition: segments.hpp:34
bool is_creator
Является ли участник создателем
Definition: segments.hpp:41
bool is_author
Является ли участник автором
Definition: segments.hpp:40
bool is_propertor
Является ли участник пропертором
Definition: segments.hpp:44
bool is_contributor
Является ли участник вкладчиком
Definition: segments.hpp:45
Таблица участников хранит данные индивидуального участника кооператива.
Definition: contributors.hpp:16
std::string memo
Мемо для импортированных контрибьюторов
Definition: contributors.hpp:23
uint64_t id
ID контрибьютора (внутренний ключ)
Definition: contributors.hpp:17
uint64_t primary_key() const
Первичный ключ (1)
Definition: contributors.hpp:39
time_point_sec created_at
Время создания контрибьютора
Definition: contributors.hpp:21
uint64_t by_contributor_rating() const
Индекс по рейтингу контрибьютора (8)
Definition: contributors.hpp:46
uint64_t by_rating() const
Индекс по общему рейтингу (10)
Definition: contributors.hpp:48
name coopname
Имя кооператива
Definition: contributors.hpp:18
name status
Статус контрибьютора
Definition: contributors.hpp:22
document2 contract
Договор УХД
Definition: contributors.hpp:25
uint64_t by_propertor_rating() const
Индекс по рейтингу пропертора (9)
Definition: contributors.hpp:47
uint64_t by_username() const
Индекс по имени пользователя (2)
Definition: contributors.hpp:40
uint64_t by_author_rating() const
Индекс по рейтингу автора (6)
Definition: contributors.hpp:44
uint64_t by_coordinator_rating() const
Индекс по рейтингу координатора (7)
Definition: contributors.hpp:45
uint64_t by_investor_rating() const
Индекс по рейтингу инвестора (4)
Definition: contributors.hpp:42
uint64_t by_creator_rating() const
Индекс по рейтингу создателя (5)
Definition: contributors.hpp:43
checksum256 by_hash() const
Индекс по хэшу контрибьютора (3)
Definition: contributors.hpp:41
name username
Имя пользователя
Definition: contributors.hpp:19
std::vector< checksum256 > appendixes
Вектор хэшей проектов, для которых подписаны приложения
Definition: contributors.hpp:26
checksum256 contributor_hash
Внешний идентификатор контрибьютора
Definition: contributors.hpp:20
Definition: drafts.hpp:28