COOPENOMICS  v1
Кооперативная Экономика
debts.hpp
См. документацию.
1#pragma once
2
3#include <eosio/eosio.hpp>
4#include <eosio/asset.hpp>
5
6using namespace eosio;
7using std::string;
8
9namespace Capital::Debts {
10
17namespace Status {
18 constexpr name CREATED = "created"_n;
19 constexpr name APPROVED = "approved"_n;
20 constexpr name AUTHORIZED = "authorized"_n;
21 constexpr name PAID = "paid"_n;
22}
23
32struct [[eosio::table, eosio::contract(CAPITAL)]] debt {
33 uint64_t id;
34 eosio::name coopname;
35 eosio::name username;
36 eosio::name status = Status::CREATED;
37 checksum256 debt_hash;
38 checksum256 project_hash;
39 time_point_sec repaid_at;
40 asset amount;
44 std::string memo;
45
46 uint64_t primary_key() const { return id; }
47
48 uint64_t by_username() const { return username.value; }
49 checksum256 by_debt_hash() const { return debt_hash; }
50 checksum256 by_project_hash() const { return project_hash; }
51};
52
53typedef eosio::multi_index<
54 "debts"_n,
55 debt,
56 indexed_by<"byusername"_n, const_mem_fun<debt, uint64_t, &debt::by_username>>,
57 indexed_by<"bydebthash"_n, const_mem_fun<debt, checksum256, &debt::by_debt_hash>>,
58 indexed_by<"byprojhash"_n, const_mem_fun<debt, checksum256, &debt::by_project_hash>>
60
64inline std::optional<debt> get_debt(eosio::name coopname, const checksum256 &debt_hash) {
65 debts_index debts(_capital, coopname.value);
66 auto hash_index = debts.get_index<"bydebthash"_n>();
67
68 auto itr = hash_index.find(debt_hash);
69 if (itr == hash_index.end()) {
70 return std::nullopt;
71 }
72
73 return *itr;
74}
75
79inline debt get_debt_or_fail(eosio::name coopname, const checksum256 &debt_hash, const char* msg = "Долг не найден") {
80 auto maybe_debt = get_debt(coopname, debt_hash);
81 eosio::check(maybe_debt.has_value(), msg);
82 return *maybe_debt;
83}
84
88inline void create_debt(
89 eosio::name coopname,
90 eosio::name username,
91 const checksum256 &project_hash,
92 const checksum256 &debt_hash,
93 const asset &amount,
94 const time_point_sec &repaid_at,
95 const document2 &statement,
96 eosio::name payer = name{}
97) {
98 if (payer == name{}) payer = coopname;
99
100 // Проверяем что долга с таким хэшем еще нет
101 auto exist_debt = get_debt(coopname, debt_hash);
102 eosio::check(!exist_debt.has_value(), "Ссуда с указанным hash уже существует");
103
104 debts_index debts(_capital, coopname.value);
105 auto debt_id = get_global_id_in_scope(_capital, coopname, "debts"_n);
106
107 debts.emplace(payer, [&](auto &d){
108 d.id = debt_id;
109 d.coopname = coopname;
110 d.username = username;
111 d.status = Status::CREATED;
112 d.debt_hash = debt_hash;
113 d.project_hash = project_hash;
114 d.amount = amount;
115 d.statement = statement;
116 d.repaid_at = repaid_at;
117 });
118}
119
124 eosio::name coopname,
125 const checksum256 &debt_hash,
126 eosio::name new_status,
127 eosio::name payer = name{},
128 const document2 &document = document2{},
129 const std::string &memo = ""
130) {
131 if (payer == name{}) payer = coopname;
132
133 auto exist_debt = get_debt_or_fail(coopname, debt_hash);
134
135 debts_index debts(_capital, coopname.value);
136 auto debt = debts.find(exist_debt.id);
137
138 debts.modify(debt, payer, [&](auto &d) {
139 d.status = new_status;
140
141 if (new_status == Status::APPROVED) {
142 d.approved_statement = document;
143 } else if (new_status == Status::AUTHORIZED) {
144 d.authorization = document;
145 }
146
147 if (!memo.empty()) {
148 d.memo = memo;
149 }
150 });
151}
152
156inline void delete_debt(eosio::name coopname, const checksum256 &debt_hash) {
157 auto exist_debt = get_debt_or_fail(coopname, debt_hash);
158
159 debts_index debts(_capital, coopname.value);
160 auto debt = debts.find(exist_debt.id);
161
162 debts.erase(debt);
163}
164
169 eosio::name coopname,
170 eosio::name username,
171 const checksum256 &debt_hash,
172 const document2 &statement
173) {
175 _capital,
176 coopname,
177 username,
178 statement,
180 debt_hash,
181 _capital,
182 "approvedebt"_n,
183 "declinedebt"_n,
184 std::string("")
185 );
186}
187
192 eosio::name coopname,
193 eosio::name username,
194 const checksum256 &debt_hash,
195 const document2 &statement
196) {
198 _capital,
199 coopname,
200 username,
202 debt_hash,
203 _capital,
206 statement,
207 std::string("")
208 );
209}
210
211
212
213
214} // namespace Capital::Debts
static constexpr eosio::name _capital
Definition: consts.hpp:150
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
constexpr name PAID
Долг выплачен (готов к использованию)
Definition: debts.hpp:21
constexpr name AUTHORIZED
Долг авторизован советом
Definition: debts.hpp:20
constexpr name APPROVED
Долг одобрен
Definition: debts.hpp:19
constexpr name CREATED
Долг создан
Definition: debts.hpp:18
Definition: debts.hpp:9
void create_debt_agenda(eosio::name coopname, eosio::name username, const checksum256 &debt_hash, const document2 &statement)
Создает агенду в совете для долга
Definition: debts.hpp:191
std::optional< debt > get_debt(eosio::name coopname, const checksum256 &debt_hash)
Получает долг по хэшу
Definition: debts.hpp:64
void delete_debt(eosio::name coopname, const checksum256 &debt_hash)
Удаляет долг
Definition: debts.hpp:156
void create_debt(eosio::name coopname, eosio::name username, const checksum256 &project_hash, const checksum256 &debt_hash, const asset &amount, const time_point_sec &repaid_at, const document2 &statement, eosio::name payer=name{})
Создает долг в таблице
Definition: debts.hpp:88
debt get_debt_or_fail(eosio::name coopname, const checksum256 &debt_hash, const char *msg="Долг не найден")
Получает долг по хэшу или падает с ошибкой
Definition: debts.hpp:79
eosio::multi_index< "debts"_n, debt, indexed_by<"byusername"_n, const_mem_fun< debt, uint64_t, &debt::by_username > >, indexed_by<"bydebthash"_n, const_mem_fun< debt, checksum256, &debt::by_debt_hash > >, indexed_by<"byprojhash"_n, const_mem_fun< debt, checksum256, &debt::by_project_hash > > > debts_index
Definition: debts.hpp:59
void create_debt_approval(eosio::name coopname, eosio::name username, const checksum256 &debt_hash, const document2 &statement)
Создает аппрув для долга
Definition: debts.hpp:168
void update_debt_status(eosio::name coopname, const checksum256 &debt_hash, eosio::name new_status, eosio::name payer=name{}, const document2 &document=document2{}, const std::string &memo="")
Обновляет статус долга
Definition: debts.hpp:123
constexpr eosio::name CREATE_DEBT
Definition: shared_names.hpp:103
constexpr eosio::name AUTHORIZE_DEBT
Definition: shared_names.hpp:59
constexpr eosio::name DECLINE_DEBT
Definition: shared_names.hpp:61
constexpr eosio::name CREATE_DEBT
Definition: shared_names.hpp:93
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
eosio::multi_index< "debts"_n, debt, indexed_by<"byusername"_n, const_mem_fun< debt, uint64_t, &debt::by_username > >, indexed_by<"bydebthash"_n, const_mem_fun< debt, checksum256, &debt::by_debt_hash > >, indexed_by<"byprojhash"_n, const_mem_fun< debt, checksum256, &debt::by_project_hash > > > debts_index
Definition: shared_debts.hpp:28
Таблица долгов хранит данные о ссудах участников проектов.
Definition: debts.hpp:32
uint64_t primary_key() const
Первичный ключ (1)
Definition: debts.hpp:46
uint64_t by_username() const
Индекс по имени пользователя (2)
Definition: debts.hpp:48
eosio::name username
Имя пользователя
Definition: debts.hpp:35
asset amount
Сумма долга
Definition: debts.hpp:40
time_point_sec repaid_at
Дата погашения долга
Definition: debts.hpp:39
checksum256 project_hash
Хэш проекта
Definition: debts.hpp:38
checksum256 by_project_hash() const
Индекс по хэшу проекта (4)
Definition: debts.hpp:50
uint64_t id
ID долга (внутренний ключ)
Definition: debts.hpp:33
document2 statement
Заявление на ссуду
Definition: debts.hpp:41
checksum256 debt_hash
Хэш долга
Definition: debts.hpp:37
document2 approved_statement
Одобренное заявление
Definition: debts.hpp:42
document2 authorization
Авторизация совета
Definition: debts.hpp:43
std::string memo
Примечание
Definition: debts.hpp:44
checksum256 by_debt_hash() const
Индекс по хэшу долга (3)
Definition: debts.hpp:49
eosio::name coopname
Имя кооператива
Definition: debts.hpp:34
Definition: shared_debts.hpp:1
eosio::name status
Definition: shared_debts.hpp:5
Definition: drafts.hpp:28
Definition: drafts.hpp:7