|
COOPENOMICS
v1
Кооперативная Экономика
|
Canonical helpers контракта marketplace (Story 11.1). Подробнее...
Пространства имен | |
| namespace | ClaimStatus |
| Статусы гарантийной претензии поставщику (процесс p.mkt.claim). | |
| namespace | Memo |
| namespace | OrderPayoutStatus |
Состояние выплаты поставщику по Order'у (Locked Decision L12, E11 техдолг 598-16). Выплата идёт через gateway::createoutpay → действие кассира → callback marketplace::payconfirm / marketplace::paydecline. | |
| namespace | OrderStatus |
| Статусы Order'а в процессе p.mkt.supply. | |
| namespace | ReturnStatus |
| Рабочие статусы заявления на гарантийный возврат (процесс p.mkt.return). | |
| namespace | WroffStatus |
| Статусы проекта решения совета о списании скоропорта (процесс p.mkt.wroff). | |
Классы | |
| struct | convert_target |
| Адресат перевода по Заявлению 1110: заказ и его доля перевода. Подробнее... | |
| struct | order |
| On-chain Order — анкер процесса p.mkt.supply. Подробнее... | |
| struct | return_request |
| On-chain Заявление на гарантийный возврат — анкер процесса p.mkt.return. Подробнее... | |
| struct | UserWalletAvailable |
| struct | warranty_claim |
| On-chain гарантийная претензия поставщику — анкер процесса p.mkt.claim (компонент 68, задача 99D-13; решение владельца 08.09.2026). Подробнее... | |
| struct | writeoff_proposal |
| On-chain Проект решения совета о списании скоропорта — анкер процесса p.mkt.wroff. Подробнее... | |
| struct | wroff_item |
| Позиция к списанию в составе writeoff_proposal. Подробнее... | |
Определения типов | |
| typedef eosio::multi_index< "orders"_n, order, eosio::indexed_by<"byhash"_n, eosio::const_mem_fun< order, checksum256, &order::by_hash > >, eosio::indexed_by<"byorderer"_n, eosio::const_mem_fun< order, uint64_t, &order::by_orderer > >, eosio::indexed_by<"byofferer"_n, eosio::const_mem_fun< order, uint64_t, &order::by_offerer > >, eosio::indexed_by<"bystatus"_n, eosio::const_mem_fun< order, uint64_t, &order::by_status > >, eosio::indexed_by<"bybatch"_n, eosio::const_mem_fun< order, checksum256, &order::by_batch > >, eosio::indexed_by<"byoffer"_n, eosio::const_mem_fun< order, checksum256, &order::by_offer > >, eosio::indexed_by<"bydelivbra"_n, eosio::const_mem_fun< order, uint64_t, &order::by_delivery_bra > >, eosio::indexed_by<"byacceptbra"_n, eosio::const_mem_fun< order, uint64_t, &order::by_accept_bra > > > | orders_index |
| typedef eosio::multi_index< "retrequests"_n, return_request, eosio::indexed_by<"byhash"_n, eosio::const_mem_fun< return_request, checksum256, &return_request::by_hash > >, eosio::indexed_by<"byorderer"_n, eosio::const_mem_fun< return_request, uint64_t, &return_request::by_orderer > >, eosio::indexed_by<"bystatus"_n, eosio::const_mem_fun< return_request, uint64_t, &return_request::by_status > >, eosio::indexed_by<"byorigorder"_n, eosio::const_mem_fun< return_request, uint64_t, &return_request::by_original_order > > > | return_requests_index |
| typedef eosio::multi_index< "claims"_n, warranty_claim, eosio::indexed_by<"byhash"_n, eosio::const_mem_fun< warranty_claim, checksum256, &warranty_claim::by_hash > >, eosio::indexed_by<"bysupplier"_n, eosio::const_mem_fun< warranty_claim, uint64_t, &warranty_claim::by_supplier > >, eosio::indexed_by<"bystatus"_n, eosio::const_mem_fun< warranty_claim, uint64_t, &warranty_claim::by_status > >, eosio::indexed_by<"byorigorder"_n, eosio::const_mem_fun< warranty_claim, uint64_t, &warranty_claim::by_original_order > > > | warranty_claims_index |
| typedef eosio::multi_index< "wroffprops"_n, writeoff_proposal, eosio::indexed_by<"byhash"_n, eosio::const_mem_fun< writeoff_proposal, checksum256, &writeoff_proposal::by_hash > >, eosio::indexed_by<"bystatus"_n, eosio::const_mem_fun< writeoff_proposal, uint64_t, &writeoff_proposal::by_status > > > | writeoff_proposals_index |
Функции | |
| bool | is_valid_unit_symbol (const eosio::symbol &sym) |
| void | check_quantity (const eosio::asset &quantity) |
| Валидация количества: корректный asset, известная единица, положительное. Подробнее... | |
| void | check_packaging (const eosio::asset &quantity, const eosio::asset &package_size) |
| eosio::asset | calc_cost (const eosio::asset &quantity, const eosio::asset &unit_price, const eosio::asset &package_size=eosio::asset(0, _unit_piece)) |
| eosio::asset | pro_rata (const eosio::asset &total, int64_t part, int64_t whole) |
| std::optional< order > | get_order_by_hash (eosio::name coopname, const checksum256 &order_hash) |
| order | get_order_by_hash_or_fail (eosio::name coopname, const checksum256 &order_hash, const std::string &msg="Заказ не найден по хэшу") |
| void | update_order (eosio::name coopname, uint64_t order_id, const std::function< void(order &)> &fn) |
| std::optional< eosio::asset > | get_asset_extension (const eosio::binary_extension< eosio::asset > &ext) |
| eosio::asset | get_accepted_cost (const order &o) |
| eosio::asset | get_payout_withheld (const order &o) |
| Долг поставщика, уже удержанный при инициации выплаты; без суммы — ноль. Подробнее... | |
| bool | is_supplier_settlement_open (const order &o) |
| void | erase_order (eosio::name coopname, uint64_t order_id) |
| uint64_t | next_return_request_id (eosio::name coopname) |
| bool | has_open_return_request (eosio::name coopname, const order &o) |
| std::optional< return_request > | get_return_request_by_hash (eosio::name coopname, const checksum256 &request_hash) |
| return_request | get_return_request_by_hash_or_fail (eosio::name coopname, const checksum256 &request_hash, const std::string &msg="Заявление на возврат не найдено по хэшу") |
| void | update_return_request (eosio::name coopname, uint64_t request_id, const std::function< void(return_request &)> &fn) |
| void | erase_return_request (eosio::name coopname, uint64_t request_id) |
| void | check_return_request_branch (eosio::name coopname, const return_request &r, eosio::name braname) |
| std::optional< writeoff_proposal > | get_writeoff_proposal_by_hash (eosio::name coopname, const checksum256 &proposal_hash) |
| writeoff_proposal | get_writeoff_proposal_by_hash_or_fail (eosio::name coopname, const checksum256 &proposal_hash, const std::string &msg="Проект списания не найден по хэшу") |
| void | update_writeoff_proposal (eosio::name coopname, uint64_t proposal_id, const std::function< void(writeoff_proposal &)> &fn) |
| void | erase_writeoff_proposal (eosio::name coopname, uint64_t proposal_id) |
| std::optional< warranty_claim > | get_claim_by_hash (eosio::name coopname, const checksum256 &claim_hash) |
| warranty_claim | get_claim_by_hash_or_fail (eosio::name coopname, const checksum256 &claim_hash, const std::string &msg="Гарантийная претензия поставщику не найдена по хэшу") |
| void | update_claim (eosio::name coopname, uint64_t claim_id, const std::function< void(warranty_claim &)> &fn) |
| UserWalletAvailable | get_user_wallet_balance (eosio::name coopname, eosio::name wallet_id, eosio::name username) |
| uint64_t | get_membership_fee_percent (eosio::name coopname) |
| eosio::asset | calc_membership_fee (const eosio::asset &base, uint64_t fee_percent) |
| Сумма членского взноса от базы по ставке (целочисленно, вниз). Подробнее... | |
| eosio::asset | get_order_membership_fee (const order &o) |
| Членский взнос заказа (ноль — взнос не начислялся). Подробнее... | |
| void | require_member_fee (eosio::name coopname, eosio::name orderer, const eosio::asset &membership_fee) |
| void | lock_order_body (eosio::name coopname, uint64_t order_id, eosio::name orderer, const checksum256 &order_hash, const eosio::asset &body, const std::string &program_memo, const std::string &wallet_memo) |
| void | lock_membership_fee (eosio::name coopname, uint64_t order_id, eosio::name orderer, const checksum256 &order_hash, const eosio::asset &fee, const std::string &memo) |
| void | refund_membership_fee_if_any (eosio::name coopname, const order &o) |
| void | refund_order_full (eosio::name coopname, const order &o) |
| void | clear_issue_documents (order &o) |
| eosio::asset | refusal_penalty_share (const eosio::asset &base) |
| Удерживаемая часть суммы (округление вниз — остаток в пользу пайщика). Подробнее... | |
| void | retain_refusal_penalty (eosio::name coopname, const order &o) |
| bool | has_orders_at_branch (eosio::name coopname, eosio::name braname) |
| void | check_member_can_exit (eosio::name coopname, eosio::name username) |
| void | settle_member_fund_on_exit (eosio::name actor, eosio::name coopname, eosio::name username, const checksum256 &exit_hash) |
| void | refund_return_fee (eosio::name coopname, eosio::name braname, const return_request &r) |
| bool | refund_return_fee_if_available (eosio::name coopname, eosio::name braname, const return_request &r) |
Переменные | |
| constexpr uint64_t | DEFAULT_MEMBERSHIP_FEE_PERCENT = 300000 |
| constexpr uint64_t | REFUSAL_PENALTY_PERCENT = 50 |
Canonical helpers контракта marketplace (Story 11.1).
Donor-helpers (get_request_by_hash, get_shipment_by_hash, namespace DocumentNames, marketplace_callback_actions) удалены вместе с соответствующими actions и таблицами (AR30).
Этот файл содержит только утилиты доступа к canonical-сущностям трёх процессов p.mkt.supply / p.mkt.return / p.mkt.wroff и helper'ы для проверки доступного баланса (для createorder guard'а Locked Decision L6).
Возврат членского взноса участка при гарантийном возврате (p.mkt.return, задача 99D-15). Общая часть onmktrtauth и payretfee: взнос ушёл участку на выдаче (o.brn.common), и к моменту возврата участок мог его распределить. Тогда branch::retfee не проходит, а ронять из-за этого решение совета нельзя — имущество и паевой возвращаются сразу, взнос доводится позже.
| typedef eosio::multi_index< "orders"_n, order, eosio::indexed_by<"byhash"_n, eosio::const_mem_fun<order, checksum256, &order::by_hash> >, eosio::indexed_by<"byorderer"_n, eosio::const_mem_fun<order, uint64_t, &order::by_orderer> >, eosio::indexed_by<"byofferer"_n, eosio::const_mem_fun<order, uint64_t, &order::by_offerer> >, eosio::indexed_by<"bystatus"_n, eosio::const_mem_fun<order, uint64_t, &order::by_status> >, eosio::indexed_by<"bybatch"_n, eosio::const_mem_fun<order, checksum256, &order::by_batch> >, eosio::indexed_by<"byoffer"_n, eosio::const_mem_fun<order, checksum256, &order::by_offer> >, eosio::indexed_by<"bydelivbra"_n, eosio::const_mem_fun<order, uint64_t, &order::by_delivery_bra> >, eosio::indexed_by<"byacceptbra"_n, eosio::const_mem_fun<order, uint64_t, &order::by_accept_bra> > > Marketplace::orders_index |
| typedef eosio::multi_index< "retrequests"_n, return_request, eosio::indexed_by<"byhash"_n, eosio::const_mem_fun<return_request, checksum256, &return_request::by_hash> >, eosio::indexed_by<"byorderer"_n, eosio::const_mem_fun<return_request, uint64_t, &return_request::by_orderer> >, eosio::indexed_by<"bystatus"_n, eosio::const_mem_fun<return_request, uint64_t, &return_request::by_status> >, eosio::indexed_by<"byorigorder"_n, eosio::const_mem_fun<return_request, uint64_t, &return_request::by_original_order> > > Marketplace::return_requests_index |
| typedef eosio::multi_index< "claims"_n, warranty_claim, eosio::indexed_by<"byhash"_n, eosio::const_mem_fun<warranty_claim, checksum256, &warranty_claim::by_hash> >, eosio::indexed_by<"bysupplier"_n, eosio::const_mem_fun<warranty_claim, uint64_t, &warranty_claim::by_supplier> >, eosio::indexed_by<"bystatus"_n, eosio::const_mem_fun<warranty_claim, uint64_t, &warranty_claim::by_status> >, eosio::indexed_by<"byorigorder"_n, eosio::const_mem_fun<warranty_claim, uint64_t, &warranty_claim::by_original_order> > > Marketplace::warranty_claims_index |
| typedef eosio::multi_index< "wroffprops"_n, writeoff_proposal, eosio::indexed_by<"byhash"_n, eosio::const_mem_fun<writeoff_proposal, checksum256, &writeoff_proposal::by_hash> >, eosio::indexed_by<"bystatus"_n, eosio::const_mem_fun<writeoff_proposal, uint64_t, &writeoff_proposal::by_status> > > Marketplace::writeoff_proposals_index |
|
inline |
Стоимость заказа. Два режима отпуска (Эпик 18):
unit_price — цена за базовую единицу; cost = количество × цена / 10^precision(количества), half-up.unit_price — цена за упаковку; cost = (количество / размер_упаковки) × цена. Деление точное — кратность гарантирует check_packaging, копейка не округляется. Цена — money-asset в _root_govern_symbol; результат — в её символе. int128 против переполнения (крупные партии: тонны × цена).
|
inline |
Сумма членского взноса от базы по ставке (целочисленно, вниз).
|
inline |
Выход пайщика не оставит в Столе заказов незавершённого: резерв под заказы вернётся только выдачей или отменой (решение владельца, задача 99D-15), а решение совета по открытой заявке на возврат зачислило бы паевой и взнос на заблокированный аккаунт (задача 99D-16).
|
inline |
Валидация упаковочного отпуска. package_size — содержимое одной упаковки в базовой единице (той же, что и количество). package_size.amount == 0 — отпуск «по мере» (весовой/наливной/поштучный): проверок нет, цена за базовую единицу. package_size.amount > 0 — упаковочный отпуск: символ упаковки равен символу количества, размер положителен, а количество кратно упаковке (заказать/выдать можно только целое число упаковок).
|
inline |
Валидация количества: корректный asset, известная единица, положительное.
|
inline |
Заявление на возврат рассматривает кооперативный участок выдачи заказа: имущество вернётся на его склад, а членский взнос списывается с его общего кошелька. Участок приходит параметром действия, поэтому сверяется с заказом на цепи — уполномоченный чужого участка решение по заявлению не проводит.
|
inline |
Снятие документов начатой выдачи с заказа (отказ совета, отмена оператором): заявление, протокол и обе подписи акта очищаются, факт возвращается к заказу.
|
inline |
|
inline |
|
inline |
|
inline |
Принятая стоимость заказа — база долга поставщику (Дт 10 / Кт 76 на приёмке, Дт 76 / Кт 51 на выплате). У заказов, принятых до появления поля, суммы нет: тогда берётся fact_cost, как читалось раньше.
|
inline |
Денежное расширение строки заказа, если в нём действительно сумма. Расширения сериализуются по порядку: когда контракт записывает более позднее поле, все предыдущие ложатся пустым asset без символа ("0 "). Это не сумма, а отсутствие данных — сравнение или вычитание с ним цепь отвергает («comparison of assets with different symbols»), так 11.09.2026 на тестнете встали выдача прежних заказов и выплаты поставщикам. value_or(def) у binary_extension не помечен const — читаем через has_value()/value().
|
inline |
|
inline |
|
inline |
Единая ставка членского взноса кооператива (HUNDR_PERCENTS = 100%); нет явной настройки (singleton не создан) — берётся стандартный дефолт.
|
inline |
|
inline |
|
inline |
Членский взнос заказа (ноль — взнос не начислялся).
|
inline |
Долг поставщика, уже удержанный при инициации выплаты; без суммы — ноль.
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
По заказу есть незакрытая заявка на возврат. Номера стёртых заявок выдаются заново, поэтому заявка с номером из заказа относится к нему, только если совпадает хэш заказа.
|
inline |
Участок занят Столом заказов: он участок выдачи или приёмки хотя бы одного заказа (пока по заказу открыта заявка на возврат, заказ тоже жив).
|
inline |
Выплата поставщику по заказу ещё не завершена: заказ нельзя стирать — обратные вызовы шлюза (payconfirm / paydecline) и повторная инициация ищут его по хэшу (задача 99D-14).
|
inline |
|
inline |
Списание членского взноса участка под заказ с внутреннего членского кошелька (o.mkt.fee, w.mkt.member → w.mkt.fee); no-op для нулевого взноса.
|
inline |
Паевое тело заказа (и доплата по факту) фондируется двумя паевыми кошельками каждым в свою очередь: сначала свободный паевой «Стола заказов» w.mkt.share (туда возвращаются паевые средства при отменах, недовыдачах и гарантийных возвратах), остаток — с главного паевого Цифрового кошелька w.wal.share. Обе части ложатся одним паевым резервом w.mkt.order (o.mkt.lockp и o.mkt.lock, без проводок — все кошельки на 80). При нехватке — отказ.
|
inline |
Номер новой заявки на возврат. Ноль не выдаётся: в заказе return_request_id == 0 означает «возврата по заказу не было», а available_primary_key на пустой таблице (заявки стираются терминалами) возвращает ноль — тогда по такому заказу открывался бы второй возврат, а closeorder не видел бы открытой заявки (задача 99D-16).
|
inline |
Доля суммы, пропорциональная части от целого, с округлением половины вверх (то же правило, что в calc_cost). Применяется там, где сумму нельзя пересчитать от цены — её надо разделить ровно так, как она сложилась: стоимость возвращаемой части выданного, доля членского взноса и т. п. При part == whole результат равен исходной сумме без потери копейки.
|
inline |
Полный возврат членского взноса заказа на членский кошелёк «Стола заказов» w.mkt.member (o.mkt.refund) при отмене/отклонении/истечении; no-op для заказов без взноса. Частичный возврат при недовыдаче — в issueact2. Членский остаётся членским: обратно в паевой не транслируется, идёт в зачёт следующего заказа.
|
inline |
Полный возврат резерва заказа на свободный паевой «Стола заказов» и сторно членского взноса (бесплатная отмена: до акцепта поставщиком либо заказ из остатка кооператива — поставщика и его риска нет).
|
inline |
Взнос по заявке на возврат: из общего кошелька участка в пул взносов (branch::retfee) и из пула на членский кошелёк программы (o.mkt.refund).
|
inline |
Взнос возвращается, только если общий кошелёк участка его держит; иначе false — заявка остаётся ждать пополнения (статус feepend).
|
inline |
Удерживаемая часть суммы (округление вниз — остаток в пользу пайщика).
|
inline |
Членский взнос участка под заказ идёт только с внутреннего членского кошелька программы w.mkt.member (уточнение владельца 06.09.2026: членские средства, вернувшиеся при отменах и гарантийных возвратах, оплачивают только членские взносы следующих заказов; тело заказа всегда паевое). Недостающую часть взноса пайщик заранее перевёл действием convert по заявлению 1110 — здесь кошелька обязано хватать на взнос целиком.
|
inline |
Отказ пайщика от получения позиции после акцепта поставщиком: удержание 50%. Тело заказа и членский взнос делятся пополам — удержанная половина уходит в общий кошелёк КУ выдачи (тело — транзитом через пул взносов o.mkt.penalty, затем единым Branch::accrue вместе с удержанной половиной взноса), вторая половина возвращается пайщику на свободный паевой «Стола заказов». Имущество остаётся на складе КУ (без движения по счёту 10) — кооператив несёт риск уже оплаченной поставки, под который и держится удержание. Долг поставщику (Кт 76 с приёмки) удержание не трогает: он гасится выплатой своим чередом.
|
inline |
Выход состоялся: остаток членского кошелька программы не возвращается и в паевой не транслируется — через пул взносов (o.mkt.exfee) уходит в общий кошелёк участка, к которому прикреплён пайщик (o.brn.common). Пайщик без участка или участок удалён — остаток остаётся в пуле. actor — контракт, проводящий выход (его разрешение подписывает операции).
|
inline |
|
inline |
|
inline |
|
inline |
|
constexpr |
Дефолтная ставка членского взноса нового кооператива — 30% (HUNDR_PERCENTS = 100%). Действует, пока председатель явно не настроит свою ставку через setfee (в т.ч. явный 0 — взнос осознанно отключён, это по-прежнему доступно, просто больше не подразумевается молчаливым «не настроено»).
|
inlineconstexpr |
Доля удержания при отказе пайщика от получения после акцепта поставщиком. Hard-code (определяется Положением целевой потребительской программы).