COOPENOMICS  v1
Кооперативная Экономика
expenses.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
18 namespace Status {
19 const eosio::name CREATED = "created"_n;
20 const eosio::name APPROVED = "approved"_n;
21 const eosio::name AUTHORIZED = "authorized"_n;
22 const eosio::name PAID = "paid"_n;
23 const eosio::name DECLINED = "declined"_n;
24 }
25}
26
27namespace Capital {
28
37 struct [[eosio::table, eosio::contract(CAPITAL)]] expense {
38 uint64_t id;
39 name coopname;
40 name username;
41
43 checksum256 project_hash;
44 checksum256 expense_hash;
45 uint64_t fund_id;
46 eosio::asset amount;
47 std::string description;
48
52
53 time_point_sec spended_at = current_time_point();
54
55 uint64_t primary_key() const { return id; }
56 uint64_t by_username() const { return username.value; }
57 checksum256 by_expense_hash() const { return expense_hash; }
58 checksum256 by_project_hash() const { return project_hash; }
59 };
60
61 typedef eosio::multi_index<
62 "expenses"_n, expense,
63 indexed_by<"byusername"_n, const_mem_fun<expense, uint64_t, &expense::by_username>>,
64 indexed_by<"byhash"_n, const_mem_fun<expense, checksum256, &expense::by_expense_hash>>,
65 indexed_by<"byprojhash"_n, const_mem_fun<expense, checksum256, &expense::by_project_hash>>
67
68
75 inline std::optional<expense> get_expense(eosio::name coopname, const checksum256 &hash) {
76 expense_index expenses(_capital, coopname.value);
77 auto expense_index = expenses.get_index<"byhash"_n>();
78
79 auto itr = expense_index.find(hash);
80 if (itr == expense_index.end()) {
81 return std::nullopt;
82 }
83
84 return expense(*itr);
85}
86
87} // namespace Capital
88
89namespace Capital::Expenses {
90
91
98 inline expense get_expense_or_fail(eosio::name coopname, const checksum256 &expense_hash) {
99 auto expense = Capital::get_expense(coopname, expense_hash);
100 eosio::check(expense.has_value(), "Расход с указанным хэшем не найден");
101 return expense.value();
102 }
103
114 inline void create_expense(eosio::name coopname, const checksum256 &project_hash,
115 const checksum256 &expense_hash, eosio::name username,
116 const eosio::asset &amount,
117 const std::string &description, const document2 &statement) {
118
119 Capital::expense_index expenses(_capital, coopname.value);
120 uint64_t expense_id = get_global_id_in_scope(_capital, coopname, "expenses"_n);
121
122 expenses.emplace(RamPayer::of(expenses, coopname), [&](auto &e) {
123 e.id = expense_id;
124 e.coopname = coopname;
125 e.username = username;
126 e.project_hash = project_hash;
127 e.expense_hash = expense_hash;
129 e.status = Expenses::Status::CREATED;
130 e.spended_at = current_time_point();
131 e.expense_statement = statement;
132 e.amount = amount;
133 e.description = description;
134 });
135 }
136
143 inline void set_approved(eosio::name coopname, uint64_t expense_id,
144 const document2 &approved_statement) {
145 Capital::expense_index expenses(_capital, coopname.value);
146 auto expense = expenses.find(expense_id);
147
148 eosio::check(expense != expenses.end(), "Расход не найден");
149
150 expenses.modify(expense, RamPayer::of(expenses, coopname), [&](auto &e) {
152 e.approved_statement = approved_statement;
153 });
154 }
155
162 inline void set_authorized(eosio::name coopname, uint64_t expense_id,
163 const document2 &authorization) {
164 Capital::expense_index expenses(_capital, coopname.value);
165 auto expense = expenses.find(expense_id);
166 eosio::check(expense != expenses.end(), "Расход не найден");
167
168 expenses.modify(expense, RamPayer::of(expenses, coopname), [&](auto &e) {
170 e.authorization = authorization;
171 });
172 }
173
179 inline void delete_expense(eosio::name coopname, uint64_t expense_id) {
180 Capital::expense_index expenses(_capital, coopname.value);
181 auto expense = expenses.find(expense_id);
182 eosio::check(expense != expenses.end(), "Расход не найден");
183
184 expenses.erase(expense);
185 }
186
187} // namespace Capital::Expenses
188
189namespace Capital {
190
197 struct [[eosio::table, eosio::contract(CAPITAL)]] program_expense {
198 uint64_t id;
199 name coopname;
200 name username;
201
203 checksum256 expense_hash;
204 uint64_t fund_id;
205 eosio::asset amount;
206 std::string description;
207
211
212 time_point_sec spended_at = current_time_point();
213
214 uint64_t primary_key() const { return id; }
215 uint64_t by_username() const { return username.value; }
216 checksum256 by_expense_hash() const { return expense_hash; }
217 };
218
219 typedef eosio::multi_index<
220 "progexpenses"_n, program_expense,
221 indexed_by<"byusername"_n, const_mem_fun<program_expense, uint64_t, &program_expense::by_username>>,
222 indexed_by<"byhash"_n, const_mem_fun<program_expense, checksum256, &program_expense::by_expense_hash>>
224
225 inline std::optional<program_expense> get_program_expense(eosio::name coopname, const checksum256 &hash) {
226 program_expense_index t(_capital, coopname.value);
227 auto idx = t.get_index<"byhash"_n>();
228 auto itr = idx.find(hash);
229 if (itr == idx.end()) return std::nullopt;
230 return program_expense(*itr);
231 }
232
233} // namespace Capital
234
235namespace Capital::Expenses {
236
237 inline program_expense get_program_expense_or_fail(eosio::name coopname, const checksum256 &expense_hash) {
238 auto v = Capital::get_program_expense(coopname, expense_hash);
239 eosio::check(v.has_value(), "Программный расход с указанным хэшем не найден");
240 return v.value();
241 }
242
244 eosio::name coopname,
245 const checksum256 &expense_hash,
246 eosio::name username,
247 const eosio::asset &amount,
248 const std::string &description,
249 const document2 &statement
250 ) {
251 Capital::program_expense_index t(_capital, coopname.value);
252 uint64_t id = get_global_id_in_scope(_capital, coopname, "progexpenses"_n);
253
254 t.emplace(RamPayer::of(t, coopname), [&](auto &e) {
255 e.id = id;
256 e.coopname = coopname;
257 e.username = username;
258 e.expense_hash = expense_hash;
260 e.status = Status::CREATED;
261 e.spended_at = current_time_point();
262 e.expense_statement = statement;
263 e.amount = amount;
264 e.description = description;
265 });
266 }
267
268 inline void delete_program_expense(eosio::name coopname, uint64_t id) {
269 Capital::program_expense_index t(_capital, coopname.value);
270 auto itr = t.find(id);
271 eosio::check(itr != t.end(), "Программный расход не найден");
272 t.erase(itr);
273 }
274
275} // namespace Capital::Expenses
276
277// Плательщик за оперативную память строк таблицы — правило в lib/core/ram_payer.hpp.
Шасси расходов — 8 actions, MVP только Благорост.
Definition: expense.hpp:143
static constexpr eosio::name _capital
Definition: consts.hpp:171
contract
Definition: eosio.msig_tests.cpp:977
share_type amount
Definition: eosio.token_tests.cpp:174
RAM_PAYER_CLASS(Capital::expense, cooperative)
const eosio::name AUTHORIZED
Расход авторизован советом
Definition: expenses.hpp:21
const eosio::name DECLINED
Расход отклонен
Definition: expenses.hpp:23
const eosio::name PAID
Расход оплачен
Definition: expenses.hpp:22
const eosio::name APPROVED
Расход одобрен председателем
Definition: expenses.hpp:20
const eosio::name CREATED
Расход создан
Definition: expenses.hpp:19
Definition: expenses.hpp:11
void delete_expense(eosio::name coopname, uint64_t expense_id)
Удаляет запись расхода из таблицы.
Definition: expenses.hpp:179
void set_approved(eosio::name coopname, uint64_t expense_id, const document2 &approved_statement)
Обновляет статус и одобренную записку расхода.
Definition: expenses.hpp:143
program_expense get_program_expense_or_fail(eosio::name coopname, const checksum256 &expense_hash)
Definition: expenses.hpp:237
expense get_expense_or_fail(eosio::name coopname, const checksum256 &expense_hash)
Получает расход по хэшу или вызывает ошибку.
Definition: expenses.hpp:98
void create_expense(eosio::name coopname, const checksum256 &project_hash, const checksum256 &expense_hash, eosio::name username, const eosio::asset &amount, const std::string &description, const document2 &statement)
Создает запись расхода в таблице.
Definition: expenses.hpp:114
void create_program_expense(eosio::name coopname, const checksum256 &expense_hash, eosio::name username, const eosio::asset &amount, const std::string &description, const document2 &statement)
Definition: expenses.hpp:243
void delete_program_expense(eosio::name coopname, uint64_t id)
Definition: expenses.hpp:268
void set_authorized(eosio::name coopname, uint64_t expense_id, const document2 &authorization)
Обновляет статус и авторизацию расхода.
Definition: expenses.hpp:162
Definition: balances.cpp:6
std::optional< program_expense > get_program_expense(eosio::name coopname, const checksum256 &hash)
Definition: expenses.hpp:225
std::optional< expense > get_expense(eosio::name coopname, const checksum256 &hash)
Получает расход по хэшу.
Definition: expenses.hpp:75
eosio::multi_index< "progexpenses"_n, program_expense, indexed_by<"byusername"_n, const_mem_fun< program_expense, uint64_t, &program_expense::by_username > >, indexed_by<"byhash"_n, const_mem_fun< program_expense, checksum256, &program_expense::by_expense_hash > > > program_expense_index
Definition: expenses.hpp:223
eosio::multi_index< "expenses"_n, expense, indexed_by<"byusername"_n, const_mem_fun< expense, uint64_t, &expense::by_username > >, indexed_by<"byhash"_n, const_mem_fun< expense, checksum256, &expense::by_expense_hash > >, indexed_by<"byprojhash"_n, const_mem_fun< expense, checksum256, &expense::by_project_hash > > > expense_index
Definition: expenses.hpp:66
eosio::name of(const Table &table, eosio::name coopname)
Definition: ram_payer.hpp:78
Definition: eosio.msig.hpp:34
Таблица расходов хранит информацию о расходах проектов кооператива.
Definition: expenses.hpp:37
checksum256 by_project_hash() const
Индекс по хэшу проекта (4)
Definition: expenses.hpp:58
uint64_t by_username() const
Индекс по имени пользователя (2)
Definition: expenses.hpp:56
eosio::asset amount
Сумма расхода
Definition: expenses.hpp:46
name coopname
Имя кооператива
Definition: expenses.hpp:39
std::string description
Публичное описание расхода
Definition: expenses.hpp:47
uint64_t id
ID расхода (внутренний ключ)
Definition: expenses.hpp:38
document2 expense_statement
Служебная записка
Definition: expenses.hpp:49
document2 approved_statement
Принятая записка председателем или доверенным
Definition: expenses.hpp:50
uint64_t fund_id
Идентификатор фонда списания (expfunds в контакте fund)
Definition: expenses.hpp:45
checksum256 expense_hash
Хэш расхода
Definition: expenses.hpp:44
checksum256 by_expense_hash() const
Индекс по хэшу расхода (3)
Definition: expenses.hpp:57
uint64_t primary_key() const
Первичный ключ (1)
Definition: expenses.hpp:55
document2 authorization
Утвержденная записка советом
Definition: expenses.hpp:51
name username
Имя пользователя, создавшего расход
Definition: expenses.hpp:40
checksum256 project_hash
Хэш проекта, связанного с расходом
Definition: expenses.hpp:43
Таблица программных расходов — целевые списания «Благорост», не привязанные к конкретному проекту.
Definition: expenses.hpp:197
name username
Инициатор расхода (председатель / казначей)
Definition: expenses.hpp:200
std::string description
Описание (для отчётности)
Definition: expenses.hpp:206
document2 approved_statement
Записка, принятая председателем
Definition: expenses.hpp:209
name coopname
Имя кооператива
Definition: expenses.hpp:199
uint64_t id
Внутренний ключ
Definition: expenses.hpp:198
uint64_t primary_key() const
Definition: expenses.hpp:214
document2 authorization
Решение совета
Definition: expenses.hpp:210
checksum256 expense_hash
Хеш расхода — анкер процесса p.cap.expns.
Definition: expenses.hpp:203
checksum256 by_expense_hash() const
Definition: expenses.hpp:216
uint64_t fund_id
Идентификатор фонда списания
Definition: expenses.hpp:204
uint64_t by_username() const
Definition: expenses.hpp:215
eosio::asset amount
Сумма расхода
Definition: expenses.hpp:205
document2 expense_statement
Служебная записка (ProgramExpenseStatement)
Definition: expenses.hpp:208
static constexpr uint64_t GENERAL_EXPENSES
Общехозяйственные расходы (содержание ПО)
Definition: ledger.hpp:113
static constexpr uint64_t ECONOMIC_ACTIVITY_FUND
Фонд обеспечения хозяйственной деятельности
Definition: ledger.hpp:130
Definition: table_registrator_orgs.hpp:17
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:62