Alex Ant 83e6b654a9
Publish Docs / build-and-publish-docs (push) Failing after 11m31s
fix(marketplace): Эпик 11 техдолг 598-16 — выплата поставщику через gateway (L12) (#389)
* feat(marketplace): Эпик 11 техдолг 598-16 — split signchair и lazy payout (L12)

Locked Decision L12 — выплата поставщику должна выполняться только после
фактического банковского перевода кассиром, не атомарно с приёмкой имущества.
Текущая реализация signchair выполняла composite-пару o.mkt.purch + o.mkt.payout
в одной транзакции — ledger закрывал обязательство Кт 51 ДО реального
cashflow, формальное расхождение между bookkeeping и расчётным счётом.

Изменения:

C++ контракт marketplace:
- signchair оставляет только o.mkt.purch (Дт 10 / Кт 86); status
  supply_prepared → accepted_to_coop, current_warehouse_braname = accept_braname.
- Новый action `payout(coopname, order_hash)` с require_auth(coopname) — единственная
  операция o.mkt.payout (Дт 86 / Кт 51); статус Order'а не меняется.
- Order struct +bool payout_done — guard от двойного списания со счёта 51.

YAML стандарт p.mkt.supply:
- В actions добавлен marketplace::payout (actor: backend).
- В transitions: signchair → operations [o.mkt.purch]; новый transition
  accepted_to_coop → accepted_to_coop через payout с operations [o.mkt.payout].
- В operations: o.mkt.payout.triggered_by = marketplace::payout (раньше signchair).
- Сценарий: step 6 — приёмка без оплаты; новый step 6a — подтверждение выплаты.
- Описание состояния accepted_to_coop отражает открытое обязательство выплаты.

cooptypes:
- IPayout interface (coopname, order_hash); actions/payOut.ts wrapper.
- IOrder + payout_done: IBool.
- Index/jsdoc signChair приведён в соответствие.

Backend controller:
- MarketplaceCanonicalBlockchainPort.payOut + adapter с require_auth(coopname).

Что НЕ входит:
- MarketplaceOutgoingPaymentService.confirm — сервиса ещё нет (ожидается
  в Story 5.6 Эпика 5); реализуется отдельно поверх этого port'а.

Сборка:
- cdt build marketplace зелёный, ABI = 19 actions (был 18 + payout),
  order.payout_done присутствует.
- pnpm --filter cooptypes build green.
- pnpm exec tsc --noEmit (controller) green.

Refs: 598-14 / 598-16 (E11 техдолг), Locked Decision L12.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* refactor(marketplace): payout проходит через gateway с callback'ами payconfirm/paydecline

Уточнение архитектуры техдолга 598-16: исходящая выплата поставщику не должна
быть единичным action'ом контракта marketplace — она проходит через
существующий contract gateway, который умеет принимать запрос и дёргать
callback'и обратно по факту действия кассира. Перепроектировано:

C++ контракт marketplace:
- `payout(coopname, order_hash)` — backend инициирует исходящий платёж;
  inline-вызовом `Gateway::create_outcome` регистрирует запись в
  `gateway::outcomes` со статусом pending и callback'ами на marketplace.
  Ledger2 не двигается; статус Order'а не меняется.
- `payconfirm(coopname, outcome_hash)` — callback от `gateway::outcomplete`
  (require_auth(_gateway)) после действия кассира. ТОЛЬКО здесь применяется
  `Ledger2::apply(o.mkt.payout, ...)` — Дт 86 / Кт 51.
- `paydecline(coopname, outcome_hash, reason)` — callback от
  `gateway::outdecline` (require_auth(_gateway)). Без ledger-движения;
  обязательство Кт 86 остаётся открытым; reason сохраняется на Order.
- Order struct: убран `bool payout_done`, заменён на
  `eosio::name payout_status` (none/pending/completed/declined) + `string
  payout_decline_reason`. Введён namespace OrderPayoutStatus.

YAML стандарт p.mkt.supply: добавлены три новых action, transitions
accepted_to_coop → accepted_to_coop через payout/payconfirm/paydecline,
scenario 6a/6b + alternative «Кассир отклонил банковский перевод», роль
`gateway` в списке ролей; `o.mkt.payout.triggered_by` = `payconfirm`.

cooptypes:
- IPayout (без изменений по сигнатуре), новые IPayConfirm/IPayDecline.
- IOrder: payout_status + payout_decline_reason (вместо payout_done).
- payOut/payConfirm/payDecline action wrappers; index.ts экспорт.

Controller:
- MarketplaceCanonicalBlockchainPort.payOut — обновлён docstring; backend
  callback'и НЕ отправляет (parser2 подхватывает delta).

Документация:
- `components/contracts/cpp/marketplace/payout-via-gateway.md` — шпаргалка
  для агентов: триплет действий, под-граф payout_status, контрактные
  детали, anti-patterns, источники правды.

Сборка:
- cdt build marketplace зелёный; ABI = 21 action (было 19 + payconfirm +
  paydecline); order.payout_status:name, payout_decline_reason:string.
- pnpm --filter cooptypes build green.
- pnpm exec tsc --noEmit (controller) green.

Refs: 598-14 / 598-16 (E11 техдолг), Locked Decision L12.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: coopops <coopos@coopenomics.world>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-16 20:02:54 +05:00
2026-04-11 00:44:16 +05:00
2026-01-20 21:23:02 +05:00
2026-04-04 00:13:22 +05:00
2024-07-11 15:33:17 +05:00
2026-05-04 11:23:58 +00:00
2026-01-21 21:49:35 +05:00
2026-03-29 17:50:44 +05:00
2026-04-04 00:13:22 +05:00
2026-05-13 21:44:14 +05:00
2025-10-14 22:06:23 +05:00
2025-07-03 18:03:31 +05:00
2026-02-28 12:57:15 +05:00

Цифровой Кооператив

License Node pnpm

Платформа «Цифровой Кооператив» — комплексное программное обеспечение для управления кооперативными организациями на основе блокчейна EOSIO. Система обеспечивает полный цикл управления кооперативом: от регистрации пайщиков и электронного документооборота до проведения собраний и финансового учёта. Построена на принципах прозрачности, децентрализации и простой электронной подписи.

Проект является частью экосистемы Кооперативная Экономика.

Архитектура

Компонент Пакет Описание
boot @coopenomics/boot CLI для инициализации и управления блокчейн-инфраструктурой
cleos @coopenomics/cleos Утилита командной строки для работы с блокчейн-кошельком
contracts @coopenomics/contracts Смарт-контракты EOSIO на C++
controller @coopenomics/controller GraphQL API сервер (NestJS)
cooptypes cooptypes Общие типы и интерфейсы блокчейн-контрактов
desktop @coopenomics/desktop Рабочий стол кооператива (Vue 3 + Quasar)
factory @coopenomics/factory Генератор юридических документов
migrator migrator Утилита миграции данных
notifications @coopenomics/notifications Библиотека уведомлений на основе Novu
parser @coopenomics/parser Индексатор блокчейна через State History Plugin
sdk @coopenomics/sdk TypeScript SDK для GraphQL API
setup @coopenomics/setup Мастер первоначальной настройки

Быстрый старт

Предварительные требования

  • Node.js >= 20
  • pnpm 9
  • Docker и Docker Compose
  • WeasyPrint (для генерации PDF)

Установка

pnpm install

Конфигурация

pnpm run setup

Интерактивный мастер создаст необходимые .env файлы для всех компонентов.

Запуск инфраструктуры

docker compose up -d
pnpm run reboot

Разработка

Бэкенд (controller + parser)

pnpm run dev:backend

Фронтенд (desktop)

pnpm run dev:desktop

Библиотеки (factory + cooptypes)

pnpm run dev:lib

Все сервисы одновременно

pnpm run dev:all

Примечание: установка пакетов производится только через фильтр: pnpm add <пакет> --filter <компонент>

Тестирование

# Все тесты
pnpm run test

# Юнит-тесты (cooptypes, parser, notifications)
pnpm run test:unit

# Компонентные тесты (factory)
pnpm run test:component

# Интеграционные тесты (boot + blockchain)
pnpm run test:integration

Сборка

# Библиотеки (cooptypes, factory)
pnpm run build:lib

# Смарт-контракты
pnpm run build:contracts:all

# Desktop (SSR)
pnpm --filter @coopenomics/desktop run build

Лицензия

Продукт Потребительского Кооператива «ВОСХОД» распространяется по лицензии BY-NC-SA 4.0.

Разрешено делиться, копировать и распространять материал, адаптировать и создавать производные произведения при условии указания авторства и сохранения той же лицензии. Коммерческое использование запрещено.

S
Description
No description provided
Readme 1 GiB
Languages
TypeScript 62.6%
Vue 15.1%
C++ 13.4%
Python 4.9%
JavaScript 2.2%
Other 1.6%