COOPENOMICS  v1
Кооперативная Экономика
role_requests.hpp
См. документацию.
1#pragma once
2
3
4#include "../../../lib/core/ram_payer.hpp"
5#include <eosio/eosio.hpp>
6#include <eosio/asset.hpp>
7
8using namespace eosio;
9using std::string;
10
12
16namespace Status {
17 constexpr name PENDING = "pending"_n;
18 constexpr name APPROVED = "approved"_n;
19 constexpr name DECLINED = "declined"_n;
20}
21
25namespace Direction {
26 constexpr name REQUEST = "request"_n;
27 constexpr name INVITE = "invite"_n;
28}
29
33namespace RequestType {
34 constexpr name ROLE = "role"_n;
35 constexpr name RATE_UPDATE = "rateupdate"_n;
36}
37
42namespace Role {
43 constexpr name CREATOR = "creator"_n;
44 constexpr name AUTHOR = "author"_n;
45 constexpr name MASTER = "master"_n;
46 constexpr name NONE = name{};
47}
48
59struct [[eosio::table, eosio::contract(CAPITAL)]] role_request {
60 uint64_t id;
61 eosio::name coopname;
62 checksum256 request_hash;
63 checksum256 project_hash;
64 eosio::name username;
65 eosio::name master;
66 eosio::name role = Role::NONE;
67 eosio::asset rate_per_hour = asset(0, _root_govern_symbol);
68 uint64_t hours_per_day = 0;
69 eosio::asset approved_rate = asset(0, _root_govern_symbol);
70 uint64_t approved_hours = 0;
71 eosio::name direction = Direction::REQUEST;
72 eosio::name request_type = RequestType::ROLE;
73 eosio::name status = Status::PENDING;
74 std::string description;
75 std::string decline_reason;
76 time_point_sec created_at = current_time_point();
77
78 uint64_t primary_key() const { return id; }
79 checksum256 by_request_hash() const { return request_hash; }
80 uint128_t by_project_user() const {
81 return combine_checksum_ids(project_hash, username);
82 }
83};
84
85typedef eosio::multi_index<
86 "rolerequests"_n, role_request,
87 indexed_by<"byhash"_n, const_mem_fun<role_request, checksum256, &role_request::by_request_hash>>,
88 indexed_by<"byprojuser"_n, const_mem_fun<role_request, uint128_t, &role_request::by_project_user>>
90
91inline std::optional<role_request> get_role_request(eosio::name coopname, const checksum256 &request_hash) {
92 role_requests_index t(_capital, coopname.value);
93 auto idx = t.get_index<"byhash"_n>();
94 auto itr = idx.find(request_hash);
95 if (itr == idx.end()) return std::nullopt;
96 return role_request(*itr);
97}
98
99inline role_request get_role_request_or_fail(eosio::name coopname, const checksum256 &request_hash) {
100 auto v = get_role_request(coopname, request_hash);
101 eosio::check(v.has_value(), "Заявка на роль не найдена");
102 return v.value();
103}
104
105inline void create(
106 eosio::name coopname,
107 const checksum256 &request_hash,
108 const checksum256 &project_hash,
109 eosio::name username,
110 eosio::name master,
111 eosio::name role,
112 const eosio::asset &rate_per_hour,
113 uint64_t hours_per_day,
114 eosio::name direction,
115 eosio::name request_type,
116 const std::string &description
117) {
118 role_requests_index t(_capital, coopname.value);
119 eosio::check(!get_role_request(coopname, request_hash).has_value(),
120 "Заявка с указанным хэшем уже существует");
121
122 uint64_t id = get_global_id_in_scope(_capital, coopname, "rolerequests"_n);
123 t.emplace(RamPayer::of(t, coopname), [&](auto &r) {
124 r.id = id;
125 r.coopname = coopname;
126 r.request_hash = request_hash;
127 r.project_hash = project_hash;
128 r.username = username;
129 r.master = master;
130 r.role = role;
131 r.rate_per_hour = rate_per_hour;
132 r.hours_per_day = hours_per_day;
133 r.direction = direction;
134 r.request_type = request_type;
135 r.status = Status::PENDING;
136 r.description = description;
137 r.created_at = current_time_point();
138 });
139}
140
146inline void validate_role_or_fail(eosio::name role) {
147 eosio::check(
148 role == Role::CREATOR || role == Role::AUTHOR || role == Role::MASTER,
149 "Допустимые роли заявки: creator, author, master"
150 );
151}
152
163 eosio::name coopname,
164 const checksum256 &project_hash,
165 eosio::name username,
166 eosio::name role
167) {
168 if (role == Role::AUTHOR) {
170 eosio::permission_level{coopname, "active"_n},
171 _capital,
172 "addauthor"_n,
173 std::make_tuple(coopname, project_hash, username)
174 ).send();
175 } else if (role == Role::MASTER) {
177 eosio::permission_level{coopname, "active"_n},
178 _capital,
179 "setmaster"_n,
180 std::make_tuple(coopname, project_hash, username)
181 ).send();
182 }
183}
184
185inline void approve(
186 eosio::name coopname,
187 uint64_t request_id,
188 const eosio::asset &approved_rate,
189 uint64_t approved_hours
190) {
191 role_requests_index t(_capital, coopname.value);
192 auto itr = t.find(request_id);
193 eosio::check(itr != t.end(), "Заявка не найдена");
194 eosio::check(itr->status == Status::PENDING, "Заявка уже обработана");
195 t.modify(itr, RamPayer::of(t, coopname), [&](auto &r) {
196 r.status = Status::APPROVED;
197 r.approved_rate = approved_rate;
198 r.approved_hours = approved_hours;
199 });
200}
201
202inline void decline(eosio::name coopname, uint64_t request_id, const std::string &reason) {
203 role_requests_index t(_capital, coopname.value);
204 auto itr = t.find(request_id);
205 eosio::check(itr != t.end(), "Заявка не найдена");
206 eosio::check(itr->status == Status::PENDING, "Заявка уже обработана");
207 t.modify(itr, RamPayer::of(t, coopname), [&](auto &r) {
208 r.status = Status::DECLINED;
209 r.decline_reason = reason;
210 });
211}
212
213} // namespace Capital::RoleRequests
214
215// Плательщик за оперативную память строк таблицы — правило в lib/core/ram_payer.hpp.
static constexpr eosio::name _capital
Definition: consts.hpp:171
static constexpr eosio::symbol _root_govern_symbol
Definition: consts.hpp:236
contract
Definition: eosio.msig_tests.cpp:977
permission_level
Definition: eosio.msig_tests.cpp:896
void send(name contract, name action_name, name actor, Args &&... args)
Definition: actions.hpp:10
constexpr name INVITE
Definition: role_requests.hpp:27
constexpr name REQUEST
Definition: role_requests.hpp:26
constexpr name ROLE
Definition: role_requests.hpp:34
constexpr name RATE_UPDATE
Definition: role_requests.hpp:35
constexpr name MASTER
Definition: role_requests.hpp:45
constexpr name AUTHOR
Definition: role_requests.hpp:44
constexpr name CREATOR
Definition: role_requests.hpp:43
constexpr name NONE
Для RATE_UPDATE: поле role не значимо
Definition: role_requests.hpp:46
constexpr name APPROVED
Definition: role_requests.hpp:18
constexpr name PENDING
Definition: role_requests.hpp:17
constexpr name DECLINED
Definition: role_requests.hpp:19
Definition: role_requests.hpp:11
void decline(eosio::name coopname, uint64_t request_id, const std::string &reason)
Definition: role_requests.hpp:202
std::optional< role_request > get_role_request(eosio::name coopname, const checksum256 &request_hash)
Definition: role_requests.hpp:91
void validate_role_or_fail(eosio::name role)
Проверяет, что role входит в допустимый набор Role::{CREATOR, AUTHOR, MASTER}. Контрибьюторы и инвест...
Definition: role_requests.hpp:146
void create(eosio::name coopname, const checksum256 &request_hash, const checksum256 &project_hash, eosio::name username, eosio::name master, eosio::name role, const eosio::asset &rate_per_hour, uint64_t hours_per_day, eosio::name direction, eosio::name request_type, const std::string &description)
Definition: role_requests.hpp:105
eosio::multi_index< "rolerequests"_n, role_request, indexed_by<"byhash"_n, const_mem_fun< role_request, checksum256, &role_request::by_request_hash > >, indexed_by<"byprojuser"_n, const_mem_fun< role_request, uint128_t, &role_request::by_project_user > > > role_requests_index
Definition: role_requests.hpp:89
void apply_role_to_project(eosio::name coopname, const checksum256 &project_hash, eosio::name username, eosio::name role)
Применяет заявленную роль к проекту через inline action: Role::AUTHOR → addauthor,...
Definition: role_requests.hpp:162
role_request get_role_request_or_fail(eosio::name coopname, const checksum256 &request_hash)
Definition: role_requests.hpp:99
void approve(eosio::name coopname, uint64_t request_id, const eosio::asset &approved_rate, uint64_t approved_hours)
Definition: role_requests.hpp:185
eosio::name of(const Table &table, eosio::name coopname)
Definition: ram_payer.hpp:78
Definition: eosio.msig.hpp:34
action(permission_level{ _gateway, "active"_n}, _gateway, "adduser"_n, std::make_tuple(coopname, deposit->username, to_spread, to_circulation, eosio::current_time_point(), true)).send()
RAM_PAYER_CLASS(Capital::RoleRequests::role_request, cooperative)
Очередь заявок на L2-допуск/инвайт и на обновление approved-ставки.
Definition: role_requests.hpp:59
std::string decline_reason
Причина отказа (если DECLINED)
Definition: role_requests.hpp:75
uint64_t id
Внутренний ключ
Definition: role_requests.hpp:60
checksum256 by_request_hash() const
Definition: role_requests.hpp:79
uint64_t primary_key() const
Definition: role_requests.hpp:78
eosio::name username
Заявитель (REQUEST) или кандидат (INVITE)
Definition: role_requests.hpp:64
eosio::name master
Мастер компонента (одобряющий) — при invite на роль master это координатор/председатель
Definition: role_requests.hpp:65
uint128_t by_project_user() const
Definition: role_requests.hpp:80
std::string description
Текст заявки / приглашения (может быть пустым)
Definition: role_requests.hpp:74
checksum256 request_hash
Хеш заявки (анкер)
Definition: role_requests.hpp:62
eosio::name coopname
Кооператив
Definition: role_requests.hpp:61
checksum256 project_hash
Проект / компонент
Definition: role_requests.hpp:63
Definition: table_registrator_orgs.hpp:17
uint64_t get_global_id_in_scope(eosio::name _me, eosio::name scope, eosio::name key)
Definition: table_counts.hpp:62
static uint128_t combine_checksum_ids(const checksum256 &hash, eosio::name username)
Definition: utils.hpp:11