COOPENOMICS  v1
Кооперативная Экономика
results.hpp
См. документацию.
1#pragma once
2
3using namespace eosio;
4using std::string;
5
6namespace Capital::Results {
13 namespace Status {
14 const eosio::name CREATED = "created"_n;
15 const eosio::name APPROVED = "approved"_n;
16 const eosio::name AUTHORIZED = "authorized"_n;
17 const eosio::name DECLINED = "declined"_n;
18 const eosio::name ACT1 = "act1"_n;
19 const eosio::name ACT2 = "act2"_n;
20 }
21}
22
23namespace Capital {
24
33 struct [[eosio::table, eosio::contract(CAPITAL)]] result {
34 uint64_t id;
35 checksum256 project_hash;
36 checksum256 result_hash;
37
38 eosio::name coopname;
39 eosio::name username;
40
41 eosio::name status = Capital::Results::Status::CREATED;
42 time_point_sec created_at = current_time_point();
43
44 eosio::asset debt_amount = asset(0, _root_govern_symbol);
45 eosio::asset total_amount = asset(0, _root_govern_symbol);
46
50
51 uint64_t primary_key() const { return id; }
52 uint64_t by_username() const { return username.value; }
53 checksum256 by_hash() const { return result_hash; }
54 checksum256 by_project_hash() const { return project_hash; }
55
56 uint128_t by_project_user() const {
57 return combine_checksum_ids(project_hash, username);
58 }
59 };
60
61typedef eosio::multi_index<"results"_n, result,
62 indexed_by<"byusername"_n, const_mem_fun<result, uint64_t, &result::by_username>>,
63 indexed_by<"byhash"_n, const_mem_fun<result, checksum256, &result::by_hash>>,
64 indexed_by<"byprojecthash"_n, const_mem_fun<result, checksum256, &result::by_project_hash>>,
65 indexed_by<"byprojuser"_n, const_mem_fun<result, uint128_t, &result::by_project_user>>
67
68
69namespace Results {
70
71inline std::optional<result> get_result(eosio::name coopname, const checksum256 &result_hash) {
72 result_index results(_capital, coopname.value);
73 auto idx = results.get_index<"byhash"_n>();
74
75 auto it = idx.find(result_hash);
76 if (it == idx.end()) {
77 return std::nullopt;
78 }
79 return *it;
80}
81
82inline std::optional<result> get_result_by_project_and_username(eosio::name coopname, const checksum256 &project_hash, eosio::name username) {
83 result_index results(_capital, coopname.value);
84 auto idx = results.get_index<"byprojuser"_n>();
85 auto rkey = combine_checksum_ids(project_hash, username);
86
87 auto it = idx.find(rkey);
88 if (it == idx.end()) {
89 return std::nullopt;
90 }
91 return *it;
92}
93
94inline result get_result_by_project_and_username_or_fail(eosio::name coopname, const checksum256 &project_hash, eosio::name username, const char* msg) {
95 auto c = get_result_by_project_and_username(coopname, project_hash, username);
96 eosio::check(c.has_value(), msg);
97 return *c;
98}
99
103inline void create_result_for_participant(eosio::name coopname, const checksum256 &project_hash,
104 eosio::name username, const checksum256 &result_hash,
105 eosio::asset segment_cost, eosio::asset debt_amount, const document2 &statement) {
106 result_index results(_capital, coopname.value);
107
108 // Проверяем, что результат ещё не создан
109 auto existing = get_result_by_project_and_username(coopname, project_hash, username);
110 eosio::check(!existing.has_value(), "Результат уже создан для данного участника");
111
112 results.emplace(_capital, [&](auto &r) {
113 r.id = results.available_primary_key();
114 r.project_hash = project_hash;
115 r.result_hash = result_hash;
116 r.coopname = coopname;
117 r.username = username;
119 r.total_amount = segment_cost;
120 r.debt_amount = debt_amount;
121 r.statement = statement;
122 r.created_at = current_time_point();
123 });
124}
125
126
130inline void delete_result(eosio::name coopname, const checksum256 &project_hash,
131 eosio::name username) {
132 // Удаляем объект результата
133 auto result_opt = get_result_by_project_and_username(coopname, project_hash, username);
134 if (result_opt.has_value()) {
135 result_index results(_capital, coopname.value);
136 auto result_itr = results.find(result_opt->id);
137 results.erase(result_itr);
138 }
139
140}
141
145inline void update_result_status(eosio::name coopname, const checksum256 &result_hash, eosio::name new_status) {
146 auto exist_result = get_result(coopname, result_hash);
147 eosio::check(exist_result.has_value(), "Объект результата не найден");
148
149 result_index results(_capital, coopname.value);
150 auto result = results.find(exist_result->id);
151
152 results.modify(result, _capital, [&](auto &r){
153 r.status = new_status;
154 });
155}
156
160inline void set_result_authorization(eosio::name coopname, const checksum256 &result_hash, const document2 &authorization) {
161 auto exist_result = get_result(coopname, result_hash);
162 eosio::check(exist_result.has_value(), "Объект результата не найден");
163
164 result_index results(_capital, coopname.value);
165 auto result = results.find(exist_result->id);
166
167 results.modify(result, _capital, [&](auto &r){
168 r.authorization = authorization;
169 });
170}
171
175inline void set_result_approved_statement(eosio::name coopname, const checksum256 &result_hash, const document2 &approved_statement) {
176 auto exist_result = get_result(coopname, result_hash);
177 eosio::check(exist_result.has_value(), "Объект результата не найден");
178
179 result_index results(_capital, coopname.value);
180 auto result = results.find(exist_result->id);
181
182 results.modify(result, _capital, [&](auto &r){
183 r.statement = approved_statement;
184 });
185}
186
190inline void set_result_act1(eosio::name coopname, const checksum256 &result_hash, const document2 &act) {
191 auto exist_result = get_result(coopname, result_hash);
192 eosio::check(exist_result.has_value(), "Объект результата не найден");
193
194 result_index results(_capital, coopname.value);
195 auto result = results.find(exist_result->id);
196
197 results.modify(result, coopname, [&](auto &r){
198 r.act = act;
199 });
200}
201
205inline void set_result_act2(eosio::name coopname, const checksum256 &result_hash, const document2 &act) {
206 auto exist_result = get_result(coopname, result_hash);
207 eosio::check(exist_result.has_value(), "Объект результата не найден");
208
209 result_index results(_capital, coopname.value);
210 auto result = results.find(exist_result->id);
211
212 results.modify(result, coopname, [&](auto &r){
213 r.act = act;
214 });
215}
216
220inline void send_result_to_soviet(eosio::name coopname, eosio::name username, const checksum256 &result_hash, const document2 &approved_statement) {
222 _capital,
223 coopname,
224 username,
226 result_hash,
227 _capital,
230 approved_statement,
231 std::string("")
232 );
233}
234
238inline void send_result_for_approval(eosio::name coopname, eosio::name username, const checksum256 &result_hash, const document2 &statement) {
240 _capital,
241 coopname,
242 username,
243 statement,
245 result_hash,
246 _capital,
249 std::string("")
250 );
251}
252
253} // namespace Results
254
255} // namespace Capital
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
action act
Definition: eosio.msig_tests.cpp:974
const eosio::name ACT2
Второй акт подписан
Definition: results.hpp:19
const eosio::name ACT1
Первый акт подписан
Definition: results.hpp:18
const eosio::name CREATED
Заявление подано
Definition: results.hpp:14
const eosio::name AUTHORIZED
Авторизовано советом
Definition: results.hpp:16
const eosio::name APPROVED
Одобрено председателем
Definition: results.hpp:15
const eosio::name DECLINED
Отклонено советом
Definition: results.hpp:17
Definition: results.hpp:6
result get_result_by_project_and_username_or_fail(eosio::name coopname, const checksum256 &project_hash, eosio::name username, const char *msg)
Definition: results.hpp:94
void set_result_authorization(eosio::name coopname, const checksum256 &result_hash, const document2 &authorization)
Устанавливает документ авторизации результата
Definition: results.hpp:160
void set_result_act1(eosio::name coopname, const checksum256 &result_hash, const document2 &act)
Устанавливает первый акт результата
Definition: results.hpp:190
void delete_result(eosio::name coopname, const checksum256 &project_hash, eosio::name username)
Удаляет объект результата
Definition: results.hpp:130
void set_result_act2(eosio::name coopname, const checksum256 &result_hash, const document2 &act)
Устанавливает второй акт результата
Definition: results.hpp:205
void set_result_approved_statement(eosio::name coopname, const checksum256 &result_hash, const document2 &approved_statement)
Устанавливает одобренное заявление результата
Definition: results.hpp:175
std::optional< result > get_result(eosio::name coopname, const checksum256 &result_hash)
Definition: results.hpp:71
void send_result_for_approval(eosio::name coopname, eosio::name username, const checksum256 &result_hash, const document2 &statement)
Отправляет результат на одобрение председателем
Definition: results.hpp:238
std::optional< result > get_result_by_project_and_username(eosio::name coopname, const checksum256 &project_hash, eosio::name username)
Definition: results.hpp:82
void send_result_to_soviet(eosio::name coopname, eosio::name username, const checksum256 &result_hash, const document2 &approved_statement)
Отправляет результат на рассмотрение в совет
Definition: results.hpp:220
void create_result_for_participant(eosio::name coopname, const checksum256 &project_hash, eosio::name username, const checksum256 &result_hash, eosio::asset segment_cost, eosio::asset debt_amount, const document2 &statement)
Создает результат для конкретного участника
Definition: results.hpp:103
void update_result_status(eosio::name coopname, const checksum256 &result_hash, eosio::name new_status)
Обновляет статус результата
Definition: results.hpp:145
Definition: balances.cpp:6
eosio::multi_index<"results"_n, result, indexed_by<"byusername"_n, const_mem_fun< result, uint64_t, &result::by_username > >, indexed_by<"byhash"_n, const_mem_fun< result, checksum256, &result::by_hash > >, indexed_by<"byprojecthash"_n, const_mem_fun< result, checksum256, &result::by_project_hash > >, indexed_by<"byprojuser"_n, const_mem_fun< result, uint128_t, &result::by_project_user > > > result_index
Definition: results.hpp:66
constexpr eosio::name AUTHORIZE_RESULT
Definition: shared_names.hpp:64
constexpr eosio::name DECLINE_RESULT
Definition: shared_names.hpp:65
constexpr eosio::name CREATE_RESULT
Definition: shared_names.hpp:114
constexpr eosio::name APPROVE_RESULT
Definition: shared_names.hpp:66
constexpr eosio::name CREATE_RESULT
Definition: shared_names.hpp:92
void create_agenda(name calling_contract, CREATEAGENDA_SIGNATURE)
Создаёт агенду в совете
Definition: shared_soviet.hpp:50
void create_approval(name calling_contract, CREATEAPPRV_SIGNATURE)
Создаёт аппрув в совете
Definition: shared_soviet.hpp:73
Definition: eosio.msig.hpp:34
Таблица результатов хранит данные о результатах участников проектов.
Definition: results.hpp:33
eosio::name username
Имя пользователя
Definition: results.hpp:39
uint64_t primary_key() const
Первичный ключ (1)
Definition: results.hpp:51
checksum256 by_project_hash() const
Индекс по хэшу проекта (4)
Definition: results.hpp:54
document2 authorization
Решение совета
Definition: results.hpp:48
uint128_t by_project_user() const
Definition: results.hpp:56
document2 act
Акт
Definition: results.hpp:49
uint64_t id
ID результата (внутренний ключ)
Definition: results.hpp:34
eosio::name coopname
Имя кооператива
Definition: results.hpp:38
checksum256 result_hash
Хэш результата
Definition: results.hpp:36
uint64_t by_username() const
Индекс по имени пользователя (2)
Definition: results.hpp:52
checksum256 project_hash
Хэш проекта
Definition: results.hpp:35
document2 statement
Заявление
Definition: results.hpp:47
checksum256 by_hash() const
Индекс по хэшу результата (3)
Definition: results.hpp:53
Definition: drafts.hpp:28
static uint128_t combine_checksum_ids(const checksum256 &hash, eosio::name username)
Definition: utils.hpp:9