Files
mono/components/contracts/cpp/lib/domain/index.hpp
T
Alex Ant a02e0fe0bf
Publish Docs / build-and-publish-docs (push) Failing after 15m19s
feat(marketplace): Story 11.1 — 18 canonical actions через Ledger2::apply на 13 операциях (#375)
* 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>
2026-05-15 11:25:07 +05:00

85 lines
3.0 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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"