a02e0fe0bf
Publish Docs / build-and-publish-docs (push) Failing after 15m19s
* fix(ledger2): handle WalletOp::REVOKE in walletop dispatcher (Story 11.4) REVOKE (op_code=6) was added to enum and OPERATION_REGISTRY for o.mkt.consum (2026-05-11), but walletop.cpp rejected op_code > 4. Added explicit case: списывает amount с wallet_from.blocked в пустоту, без зачисления; L3-зеркало для USER_SHARED. NONE добавлен как unreachable case для исчерпывающего switch. Прерывает блокер для Story 11.1 (canonical marketplace actions). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * feat(marketplace): canonical scaffolding — entity tables + 18 action skeletons (Story 11.1) Удалены donor-actions старой клиринговой модели (AR30): - 50 .cpp файлов в components/contracts/cpp/marketplace/src/{deliver_on_offer, deliver_on_order,shipment,dispute_on_offer,корень}; - legacy marketplace.{cpp,hpp} с ~30 actions (orderoffer/accept/supply/dispute/ shipment/etc) на legacy Wallet:: API мимо ledger2; - три donor entity-таблицы: lib/domain/table_marketplace_{requests,segments, shipments}.hpp; - lib/core/marketplace/marketplace.hpp donor-helpers (get_request_by_hash, get_shipment_by_hash, namespace DocumentNames клирингового состава). Создана canonical инфраструктура трёх процессов p.mkt.{supply,return,wroff}: - lib/domain/table_marketplace_orders.hpp — Order entity с полным жизненным циклом p.mkt.supply (active → cancelled / accepted → ship_ready → supply_prepared → accepted_to_coop → ready_to_receive → received), 8 secondary индексов, поля для трассировки signsupp/signchair/ signiss1/signiss2 АПП-документов и warranty_until для submretrn гарда. - lib/domain/table_marketplace_return_requests.hpp — ReturnRequest entity для p.mkt.return (pending_review → approved_for_visit → return_accepted / rejected_at_ku / rejected_remote), original_consume_op_id для compensating-forward трассировки (d6 A4), photos vector<checksum256>. - lib/domain/table_marketplace_writeoff_proposals.hpp — WriteoffProposal entity для p.mkt.wroff с vector<wroff_item> per-КУ позиций. - lib/core/marketplace/marketplace.hpp — canonical helpers get_*_by_hash[_or_fail] / update_* + cross-contract get_user_wallet_balance для guard'а Locked Decision L6 в createorder. Контракт marketplace.{cpp,hpp} переписан целиком под 18 canonical actions (p.mkt.supply 10 + p.mkt.return 5 + p.mkt.wroff 3) согласно YAML-стандартам рядом с .hpp. Каждый action — отдельный .cpp файл в marketplace/src/ по образцу Capital'а; на этом коммите все 18 — skeleton с eosio::check(false, "TODO Story 11.1 Шаг N: <action> ещё не реализован") и подробным @brief docstring'ом со ссылкой на Story / guards / ledger2- операции из YAML. Реальная реализация actions — последующими коммитами (Шаги 4-6 спецификации Story 11.1). Batch (consolidated request) намеренно НЕ выведен в on-chain entity — Locked Decision L10: backend-only сущность, on-chain действия per-Order; batch_hash на Order'е — opaque ссылка для трассировки. Foundation Story 11.4 на месте (предыдущий коммит): WalletOp::REVOKE обработан walletop dispatcher'ом; OPERATION_REGISTRY содержит все 13 marketplace-операций; счета 10/91 в LEDGER2_ACCOUNT_MAP. Spec артефакт: blago/production/1-prilozhenie-stol-zakazov/components/ 3-minimalnyy-produkt/_bmad-output/implementation-artifacts/ spec-11-1-ledger2-marketplace-ops.md. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * feat(marketplace): implement createorder action (Story 4.1, p.mkt.supply) Первая реализация canonical action — proof-of-pattern для остальных 17. Серия трёх ledger2-операций (атомарно в одной транзакции Antelope): - o.wal.conv (conditional, недостача из w.wal.share); - o.mkt.assign (conditional, недостача из w.wal.member); - o.mkt.block (всегда, total_cost на w.mkt.member). L6 guard через cross-contract read трёх кошельков (Marketplace:: get_user_wallet_balance) — фейлится с понятной ошибкой если суммарных средств не хватает. process_hash для всех трёх ops = order_hash. Создан Order entity со status=ACTIVE; cycle_type валидируется по enum (timebased/volumebased/opensubscr/individual). actual_quantity и fact_cost ставятся равными quantity/total_cost — обновятся в signiss2 при выдаче. Plus: rename WroffStatus::DRAFT → PROPOSED (DRAFT конфликтует с macro из lib/consts.hpp; on-chain строка осталась "draft"_n как в YAML). Build: pnpm build:contract:test marketplace — green. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * feat(marketplace): implement 17 canonical actions (Story 11.1, p.mkt.{supply,return,wroff}) Реализованы все оставшиеся 17 actions поверх createorder (proof-of-pattern): p.mkt.supply (9 actions, дополнительно к уже реализованному createorder): - cancelorder — отмена до акцепта; o.mkt.unblk; ACTIVE → CANCELLED. - expirecycle — закрытие цикла; threshold_reached==false → o.mkt.unblk per order + ACTIVE → CANCELLED; threshold_reached==true — no-op (backend формирует batch). - acceptbatch — поставщик акцепт; ACTIVE → ACCEPTED, batch_hash зафиксирован; без ledger2 (L10). - declinebatch — отказ до акцепта; o.mkt.unblk per order + ACTIVE → CANCELLED. - prepship — сборка партии; ACCEPTED → SHIP_READY; shipping_method валидируется (varianta | variantb). - signsupp — первая подпись АПП приёмки поставщиком; verify_document_or_fail ({offerer}); SHIP_READY → SUPPLY_PREPARED + acceptance_act_signsupp. - signchair — закрывающая подпись АПП приёмки председателем; per-Order Ledger2::apply(o.mkt.purch) + Ledger2::apply(o.mkt.payout) атомарно; SUPPLY_PREPARED → ACCEPTED_TO_COOP + acceptance_act_signchair. - signiss1 — открытие выдачи председателем; verify_document_or_fail({chairman}); ACCEPTED_TO_COOP → READY_TO_RECEIVE + issue_act_signiss1. - signiss2 — финальная подпись заказчика с поддержкой actual_quantity ≠ ordered: при actual<ordered — o.mkt.unblk на разницу; при actual>ordered — L6 guard на доступность diff в трёх кошельках, conditional o.wal.conv + o.mkt.assign + o.mkt.block на разницу; всегда — o.mkt.consum + o.mkt.consum2 на fact_cost; READY_TO_RECEIVE → RECEIVED + warranty_until. p.mkt.return (5 actions): - submretrn — заявление на возврат; гард warranty_until > now; создание return_request в PENDING_REVIEW; order.return_request_id для двусторонней связи. photos обязательны. - aprretrem — удалённое одобрение визита; PENDING_REVIEW → APPROVED_FOR_VISIT. - rejretrem — удалённый отказ; PENDING_REVIEW → REJECTED_REMOTE + reason_remote. - accretrn — приём возврата на очном осмотре; Ledger2::apply(o.mkt.return) + Ledger2::apply(o.mkt.return2) (compensating forward, не revert); APPROVED_FOR_VISIT → RETURN_ACCEPTED. - rejretrn — отказ на очном осмотре; APPROVED_FOR_VISIT → REJECTED_AT_KU + reason_visit. p.mkt.wroff (3 actions): - propwroff — формирование проекта списания; total_amount = Σ items.amount; PROPOSED. - execwroff — исполнение per-item: Ledger2::apply(o.mkt.wroff) + Ledger2::apply(o.mkt.wroff2) каждой позиции; PROPOSED → EXECUTED; process_hash единый = proposal.hash, item.ku_chairman как username для per-КУ аналитики. - declwroff — отклонение советом; PROPOSED → REJECTED + reject_reason. Все compose'ятся через единый Ledger2::apply orchestrator, не нарушая foundation Story 11.4. Composite-операции (consum+consum2, return+return2, wroff+wroff2) в одной транзакции Antelope обеспечивают атомарность L1 проводок через транзит счёта 91. Cross-contract balance read через Marketplace::get_user_wallet_balance(_ledger2 scope) — для L6-гарда createorder и signiss2 (correction>). Build: pnpm build:contract:test marketplace — green. Foundation: walletop REVOKE + 13 marketplace operations + WalletOp NONE/REVOKE + счета 10/91 + кошельки w.mkt.{member,payout} — на месте (предыдущие коммиты). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * refactor(marketplace): структура по процессам + чистка избыточных дат on-chain Структура: - src/p.mkt.supply/ — 10 actions процесса прямой поставки-приобретения (createorder, cancelorder, expirecycle, acceptbatch, declinebatch, prepship, signsupp, signchair, signiss1, signiss2); - src/p.mkt.return/ — 5 actions процесса гарантийного возврата (submretrn, aprretrem, rejretrem, accretrn, rejretrn); - src/p.mkt.wroff/ — 3 actions процесса утилизации скоропорта (списания) (propwroff, execwroff, declwroff). Имена подпапок 1:1 совпадают с process_type из YAML-стандартов рядом — прозрачная навигация от .cpp к стандарту. Удалены избыточные date-поля из 3 entity-таблиц (orders / return_requests / writeoff_proposals): created_at, accepted_at, shipped_at, received_to_coop_at, ready_at, received_at, cancelled_at, reviewed_at, resolved_at, proposed_at, decided_at. Контракт ничего не проверяет по этим датам — все timestamp'ы переходов состояний восстанавливаются на бэкенде из blockchain_actions[at] по соответствующим actions через ParserClient. Сокращает RAM-стоимость state на каждый Order / ReturnRequest / WriteoffProposal. Сохранено on-chain: - order.warranty_until — нужно для guard'а submretrn (`now() < warranty_until`) без cross-action lookup; вычисляется в signiss2 как signiss2.timestamp + warranty_period_secs. - batch_hash, status, документы (acceptance_act_signsupp/signchair, issue_act_signiss1/signiss2, statement, decision_remote/visit, protocol, photos), reason fields, fact_cost / actual_quantity, items для wroff_proposal, links (return_request_id, original_order_id, original_consume_op_id) — это смысловая on-chain информация, не выводимая из истории. Удалены secondary-индексы bycreated и byproposed (бэкенд индексирует по сохранённым в Postgres timestamp'ам блоков, on-chain pagination по чрон. порядку = по primary key id). Build: pnpm build:contract:test marketplace — green. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * refactor(marketplace): ревью PR #375 — braname/branch, per-Order, memos, без prepship - ku_chairman заменён на braname (приёмка/выдача) в Order; в return_request привязка к КУ удалена — каждое решение принимает braname параметром, авторизация через Branch::is_user_authorized (председатель/trustee/доверенные) - Все per-batch actions теперь per-Order (acceptorder/declineorder/expireorder, signsupp/signchair); векторов order_hashes нет — backend проходит циклом - prepship удалён как избыточный шаг (после acceptorder сразу signsupp); OrderStatus::SHIP_READY убран - execwroff per-item: один item за вызов с item_index; финализация PROPOSED → EXECUTED автоматически после исполнения последней позиции; declwroff фейлится если хотя бы одна позиция уже исполнена - propwroff валидирует существование braname для каждого item через get_branch_or_fail - Memos вынесены в lib/core/marketplace/memo.hpp по аналогии с Capital::Memo; все Ledger2::apply используют человекочитаемые memo с подстановкой id - Все eosio::check сообщения переписаны на пользовательский русский текст без префиксов action/Locked Decision (UI показывает их напрямую) - walletop REVOKE дополнен подробным docstring: разница с BURN (blocked vs available, обязательная пара Dr/Cr, отсутствие альтернативы через UNBLOCK+BURN) Build: marketplace.wasm + ledger2.wasm — green под coopos 5.2. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * feat(marketplace): order.current_warehouse_braname (текущая точка хранения) Поле введено сейчас, чтобы избежать binary_extension при включении полноценного процесса перемещения имущества между КУ после релиза. Заполнение: - signchair (приёмка кооперативом): current_warehouse_braname = accept_braname - signiss1 (готово к выдаче): current_warehouse_braname = delivery_braname Промежуточные перемещения между приёмным и выдающим КУ контрактом не подписываются (бездокументарно) — точка хранения переходит «скачком» в момент готовности к выдаче. Подписание ТТН по внутренним передачам — отдельная история после релиза, текущее поле даёт ей точку расширения без миграции. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: coopops <coopos@coopenomics.world> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
85 lines
3.0 KiB
C++
85 lines
3.0 KiB
C++
#pragma once
|
||
|
||
// Агрегатор определений таблиц и связанных domain-заголовков (раньше — drafts/accounts/coops/… в корне lib).
|
||
|
||
// drafts
|
||
#include "document_core.hpp"
|
||
#include "table_draft_drafts.hpp"
|
||
#include "table_draft_translations.hpp"
|
||
|
||
// accounts (registrator)
|
||
#include "account_payer.hpp"
|
||
#include "org_data.hpp"
|
||
#include "registrator_account_access.hpp"
|
||
#include "table_registrator_accounts.hpp"
|
||
#include "table_registrator_coops.hpp"
|
||
#include "table_registrator_orgs.hpp"
|
||
#include "table_registrator_verification.hpp"
|
||
#include "table_registrator_candidates.hpp"
|
||
#include "table_registrator_candidates_legacy.hpp"
|
||
|
||
// coops (soviet)
|
||
#include "coops_access_helpers.hpp"
|
||
#include "table_soviet_addresses.hpp"
|
||
#include "table_soviet_boards.hpp"
|
||
#include "table_soviet_decisions.hpp"
|
||
#include "table_soviet_participants.hpp"
|
||
#include "table_soviet_staff.hpp"
|
||
#include "table_soviet_approvals.hpp"
|
||
|
||
#include "table_counts.hpp"
|
||
|
||
#include "permissions.hpp"
|
||
#include "rammarket.hpp"
|
||
|
||
#include "table_balances_balances.hpp"
|
||
#include "table_soviet_progwallets.hpp"
|
||
|
||
#include "table_soviet_agreements.hpp"
|
||
#include "table_soviet_agreements3.hpp"
|
||
#include "table_soviet_coagreements.hpp"
|
||
#include "table_soviet_programs.hpp"
|
||
|
||
#include "table_fund_accfunds.hpp"
|
||
#include "table_fund_coopwallet.hpp"
|
||
#include "table_fund_expfunds.hpp"
|
||
#include "table_fund_fwithdraws.hpp"
|
||
|
||
#include "table_branch_branches.hpp"
|
||
#include "table_branch_branchstat.hpp"
|
||
|
||
// wallet / gateway / ledger / loan / marketplace
|
||
#include "table_wallet_deposits.hpp"
|
||
#include "table_wallet_users.hpp"
|
||
#include "table_wallet_withdraws.hpp"
|
||
#include "table_gateway_incomes.hpp"
|
||
#include "table_gateway_outcomes.hpp"
|
||
#include "table_ledger_laccount.hpp"
|
||
#include "table_ledger_writeoffs.hpp"
|
||
#include "table_ledger2_wallet.hpp"
|
||
#include "table_ledger2_account.hpp"
|
||
#include "table_ledger2_userwallets.hpp"
|
||
// Epic 1 addendum (2026-04-18): journal+wjournal удалены из RAM; история
|
||
// собирается на бэкенде из blockchain_actions[ledger2::apply/walletop/debit/credit]
|
||
// и blockchain_deltas[ledger2::accounts/wallets].
|
||
#include "table_ledger2_meta.hpp"
|
||
#include "table_loan_debts.hpp"
|
||
#include "table_loan_summaries.hpp"
|
||
|
||
// marketplace (Story 11.1, canonical) — anchor-таблицы трёх процессов
|
||
// p.mkt.supply / p.mkt.return / p.mkt.wroff. Donor-таблицы (requests/segments/
|
||
// shipments) удалены вместе с donor-actions (AR30). Batch (consolidated request)
|
||
// — backend-only, on-chain не хранится (Locked Decision L10).
|
||
#include "table_marketplace_orders.hpp"
|
||
#include "table_marketplace_return_requests.hpp"
|
||
#include "table_marketplace_writeoff_proposals.hpp"
|
||
|
||
// apps (каталог приложений)
|
||
#include "table_apps_packages.hpp"
|
||
#include "table_apps_releases.hpp"
|
||
#include "table_apps_subs.hpp"
|
||
#include "table_apps_coops.hpp"
|
||
#include "table_apps_pricings.hpp"
|
||
#include "table_apps_globals.hpp"
|
||
#include "table_apps_clients.hpp"
|