* feat(marketplace): Story 1.2 — регистрация оферты в AgreementRegistry Перепиcано через существующий core-механизм `AgreementRegistrationPort` (закрытый PR #369 шёл через параллельный coop_cpp_registry — техдолг). Аналогично тому, как Capital регистрирует свои оферты — register-capital-in-agreement-registry.ts. - constants/marketplace-agreement-ids.ts — MARKETPLACE_EXTENSION_NAME='market', MARKETPLACE_OFFER_AGREEMENT_ID='order_table_offer', MARKETPLACE_AGREEMENT_TYPE='order_table', MARKETPLACE_OFFER_TEMPLATE_REGISTRY_ID=0 (placeholder; Story 1.7 заменит на реальный registry_id из платформенной document factory, по аналогии с Cooperative.Registry.GeneratorOffer/BlagorostOffer). - application/registration/register-marketplace-in-agreement-registry.ts — чистая функция: при ID>0 зовёт port.registerAgreement с одной офертой (applicable_account_types: individual + entrepreneur, order: 7); при ID<=0 возвращает false без вызовов. Programs marketplace не регистрирует — Стол заказов ЦПП без program-надстройки. - marketplace-extension.module — @Inject(AGREEMENT_REGISTRATION_PORT) + вызов registerMarketplaceInAgreementRegistry в initialize после initBucket; info-лог при skip и при успешной регистрации, error при exception. Tests: - tests/unit/marketplace/marketplace-plugin-register.test.ts (3 кейса): чистая функция — port не вызван пока placeholder=0, константы согласованы, programs не регистрируются. - tests/unit/marketplace/marketplace-plugin-initialize.test.ts — обновлён конструктор (добавлен makeAgreementPort стаб); 4 кейса Story 1.1 продолжают проходить. 10/10 unit-тестов зелёных, tsc 0 ошибок. Ref: blago/.../components/3-minimalnyy-produkt/_bmad-output/implementation-artifacts/spec-1-2-cpp-registry-link.md (spec будет переписан вместе с blago-issue после merge). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(marketplace): MARKETPLACE_AGREEMENT_TYPE = 'marketplace' (валидный eosio::name) Per review PR #370: 'order_table' содержит '_' — не валидный eosio::name (допустимы только [.a-z1-5], max 12). В lib/consts.hpp уже определено program-имя `_marketplace_program = "marketplace"_n` (program_id=2), его и принимает `soviet::coagreements`/`sndagreement`. - MARKETPLACE_AGREEMENT_TYPE: 'order_table' → 'marketplace'. - MARKETPLACE_OFFER_AGREEMENT_ID: 'order_table_offer' → 'marketplace_offer' (консистентно с 'generator_offer'/'blagorost_offer' у Capital). - AgreementRegistrationSpec.agreement_type — JSDoc уточнён: должен быть eosio::name (max 12, без `_`), пример обновлён. - Тест проверяет eosio::name regex `/^[.a-z1-5]{1,12}$/` для type. 10/10 unit зелёные, tsc 0 ошибок. * feat(marketplace): Story 1.3 — доступ к Столу заказов по членству Реализует: - MarketplaceMembershipGuard: 401 (нет JWT), 403 (status != active), server-secret bypass, формирует request.currentMember и ctx.currentMember для GraphQL. - mapUserRoleToCoreRoles: user.role → core_roles[] - 'user' → ['User'] - 'member' → ['User', 'Member'] - 'chairman' → ['User', 'Member', 'Chairman'] - 'admin'/unknown → [] - @CurrentMarketplaceMember decorator + MarketplaceCurrentMemberDTO ({username, core_roles[], marketplace_roles[]}). - Query marketplaceWhoAmI(): возвращает контекст текущего пайщика для фронта (UI открывается на primary столе по роли). - marketplace_roles[] пока пустой — наполняется в Story 1.6. Тесты: 18/18 зелёных (5 mapper + 6 guard + 4 initialize + 3 register). tsc 0 ошибок. --------- Co-authored-by: coopops <coopos@coopenomics.world> Co-authored-by: Claude Opus 4.7 (1M context) <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.
Разрешено делиться, копировать и распространять материал, адаптировать и создавать производные произведения при условии указания авторства и сохранения той же лицензии. Коммерческое использование запрещено.