* 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>
Цифровой Кооператив
Платформа «Цифровой Кооператив» — комплексное программное обеспечение для управления кооперативными организациями на основе блокчейна 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.
Разрешено делиться, копировать и распространять материал, адаптировать и создавать производные произведения при условии указания авторства и сохранения той же лицензии. Коммерческое использование запрещено.