Перейти к содержанию

Разработчикам

sequenceDiagram
  participant Client
  participant SDK

  Client->>SDK: Accounts.RegisterAccount
  Client->>SDK: Agreements.Generate* (4 документа)
  Client->>SDK: Participants.GenerateParticipantApplication (ссылки на все соглашения)
  Client->>SDK: Gateway.CreateInitialPayment
  Client->>SDK: Gateway.SetPaymentStatus
  Client->>SDK: Soviet.AcceptParticipant
  Client->>SDK: Participants.RegisterParticipant

1. Создать аккаунт

Заводим учётную запись будущего пайщика и получаем ключи/токены для дальнейших подписей.

🛠️ SDK: Mutations.Accounts.RegisterAccount | 🔗 GraphQL API: Mutation.registerAccount

import { Mutations } from '@coopenomics/sdk';

const variables: Mutations.Accounts.RegisterAccount.IInput = {
  data: {
    email: <string>; // Электронная почта
    entrepreneur_data?: <{
        bank_account: {
          account_number: <string>; // Номер банковского счета
          bank_name: <string>; // Название банка
          card_number?: <string | null>; // Номер карты
          currency: <string>; // Валюта счета
          details: {
            bik: <string>; // БИК банка
            corr: <string>; // Корреспондентский счет
            kpp: <string>; // КПП банка
          };
        };
        birthdate: <string>; // Дата рождения
        city: <string>; // Город
        country: <Country>; // Страна
        details: {
          inn: <string>; // ИНН
          ogrn: <string>; // ОГРН
        };
        first_name: <string>; // Имя
        full_address: <string>; // Полный адрес
        last_name: <string>; // Фамилия
        middle_name: <string>; // Отчество
        phone: <string>; // Телефон
      } | null>; // Данные индивидуального предпринимателя
    individual_data?: <{
        birthdate: <string>; // Дата рождения
        first_name: <string>; // Имя
        full_address: <string>; // Полный адрес
        last_name: <string>; // Фамилия
        middle_name: <string>; // Отчество
        passport?: <{
            code: <string>;
            issued_at: <string>;
            issued_by: <string>;
            number: <number>;
            series: <number>;
          } | null>; // Данные паспорта
        phone: <string>; // Телефон
      } | null>; // Данные физического лица
    organization_data?: <{
        bank_account: {
          account_number: <string>; // Номер банковского счета
          bank_name: <string>; // Название банка
          card_number?: <string | null>; // Номер карты
          currency: <string>; // Валюта счета
          details: {
            bik: <string>; // БИК банка
            corr: <string>; // Корреспондентский счет
            kpp: <string>; // КПП банка
          };
        };
        city: <string>; // Город
        country: <string>; // Страна
        details: {
          inn: <string>;
          kpp: <string>;
          ogrn: <string>;
        };
        fact_address: <string>; // Фактический адрес
        full_address: <string>; // Полный адрес
        full_name: <string>; // Полное наименование организации
        phone: <string>; // Телефон
        represented_by: {
          based_on: <string>;
          first_name: <string>;
          last_name: <string>;
          middle_name: <string>;
          position: <string>;
        };
        short_name: <string>; // Краткое наименование организации
        type: <OrganizationType>; // Тип организации
      } | null>; // Данные организации
    public_key: <string>; // Публичный ключ
    referer?: <string | null>; // Имя аккаунта реферера
    type: <AccountType>; // Тип аккаунта
    username: <string>; // Имя пользователя
  };
};

const { [Mutations.Accounts.RegisterAccount.name]: result } = await client.Mutation(
  Mutations.Accounts.RegisterAccount.mutation,
  { variables }
);
Результат
interface IOutput {
}

2. Подготовить пакет документов и заявление

Выпускаем обязательные соглашения, подписываем их и прикладываем к заявлению на вступление. Сгенерировать заявление: 🛠️ SDK: Mutations.Participants.GenerateParticipantApplication | 🔗 GraphQL API: Mutation.generateParticipantApplication

import { Mutations } from '@coopenomics/sdk';

const variables: Mutations.Participants.GenerateParticipantApplication.IInput = {
  data: {
    block_num?: <number | null>; // Номер блока, на котором был создан документ
    braname: <string>; // Имя аккаунта кооперативного участка
    coopname: <string>; // Название кооператива, связанное с документом
    created_at?: <string | null>; // Дата и время создания документа
    generator?: <string | null>; // Имя генератора, использованного для создания документа
    lang?: <string | null>; // Язык документа
    links?: <string[] | null>; // Ссылки, связанные с документом
    signature?: <string | null>; // Изображение собственноручной подписи (base-64)
    skip_save: <boolean>; // Флаг пропуска сохранения документа (используется для предварительной генерации и демонстрации пользователю)
    timezone?: <string | null>; // Часовой пояс, в котором был создан документ
    title?: <string | null>; // Название документа
    username: <string>; // Имя пользователя, создавшего документ
    version?: <string | null>; // Версия генератора, использованного для создания документа
  };
  options?: {
    lang?: <string | null>; // Язык документа
    skip_save?: <boolean | null>; // Пропустить сохранение
  };
};

const { [Mutations.Participants.GenerateParticipantApplication.name]: result } = await client.Mutation(
  Mutations.Participants.GenerateParticipantApplication.mutation,
  { variables }
);

И аналогично сопутствующие документы соглашений: Сгенерировать и подписать обязательные соглашения (каждое — отдельный документ):

  1. Соглашение о ЦПП "Цифровой Кошелек" 🛠️ SDK: Mutations.Agreements.GenerateWalletAgreement | 🔗 GraphQL API: Mutation.generateWalletAgreement

  2. Политика конфиденциальности 🛠️ SDK: Mutations.Agreements.GeneratePrivacyAgreement | 🔗 GraphQL API: Mutation.generatePrivacyAgreement

  3. Соглашение о порядке и правилах использования простой электронной подписи 🛠️ SDK: Mutations.Agreements.GenerateSignatureAgreement | 🔗 GraphQL API: Mutation.generateSignatureAgreement

  4. Пользовательское соглашение 🛠️ SDK: Mutations.Agreements.GenerateUserAgreement | 🔗 GraphQL API: Mutation.generateUserAgreement

3. Создать регистрационный платёж

Выпускаем платёж на вступительный и минимальный паевой взносы и отмечаем его поступление. 🛠️ SDK: Mutations.Gateway.CreateInitialPayment | 🔗 GraphQL API: Mutation.createInitialPayment

import { Mutations } from '@coopenomics/sdk';

const variables: Mutations.Gateway.CreateInitialPayment.IInput = {
  data: {
    username: <string>; // Имя аккаунта пользователя
  };
};

const { [Mutations.Gateway.CreateInitialPayment.name]: result } = await client.Mutation(
  Mutations.Gateway.CreateInitialPayment.mutation,
  { variables }
);
Результат
interface IOutput {
}

4. Подтвердить приём платежа

После фактического поступления средств отметить статус:

🛠️ SDK: Mutations.Gateway.SetPaymentStatus | 🔗 GraphQL API: Mutation.setPaymentStatus

import { Mutations } from '@coopenomics/sdk';

const variables: Mutations.Gateway.SetPaymentStatus.IInput = {
  data: {
    id: <string>; // Идентификатор платежа, для которого устанавливается статус
    status: <PaymentStatus>; // Новый статус платежа
  };
};

const { [Mutations.Gateway.SetPaymentStatus.name]: result } = await client.Mutation(
  Mutations.Gateway.SetPaymentStatus.mutation,
  { variables }
);
Результат
interface IOutput {
  setPaymentStatus: <ModelTypes["GatewayPayment"]>;
}

4. Провести голосование и утвердить решение

Фиксируем решение совета. Сейчас фронтенд отправляет транзакцию и протокол напрямую в блокчейн, используя класс голосования 🛠️ Classes.Vote.voteFor. Планируемая SDK-обёртка (без макроса, чтобы не ломать сборку): Mutations.Soviet.AcceptParticipant — для передачи результата голосования и протокола.

5. Завершить регистрацию

Фиксируем принятого пайщика, выдаём доступы/роли и открываем доступ к рабочему месту. 🛠️ SDK: Mutations.Participants.RegisterParticipant | 🔗 GraphQL API: Mutation.registerParticipant

import { Mutations } from '@coopenomics/sdk';

const variables: Mutations.Participants.RegisterParticipant.IInput = {
  data: {
    blagorost_offer?: <{
        doc_hash: <string>; // Хэш содержимого документа
        hash: <string>; // Общий хэш (doc_hash + meta_hash)
        meta: <any>; // Метаинформация документа
        meta_hash: <string>; // Хэш мета-данных
        signatures: <{
            id: <number>; // Идентификатор номера подписи
            meta: <string>; // Мета-данные подписи
            public_key: <string>; // Публичный ключ
            signature: <string>; // Подпись хэша
            signed_at: <string>; // Время подписания
            signed_hash: <string>; // Подписанный хэш
            signer: <string>; // Аккаунт подписавшего
          }[]>; // Вектор подписей
        version: <string>; // Версия стандарта документа
      } | null>; // Подписанный документ соглашения по капитализации (опционально, только если требуется)
    braname?: <string | null>; // Имя кооперативного участка
    generator_offer?: <{
        doc_hash: <string>; // Хэш содержимого документа
        hash: <string>; // Общий хэш (doc_hash + meta_hash)
        meta: <any>; // Метаинформация документа
        meta_hash: <string>; // Хэш мета-данных
        signatures: <{
            id: <number>; // Идентификатор номера подписи
            meta: <string>; // Мета-данные подписи
            public_key: <string>; // Публичный ключ
            signature: <string>; // Подпись хэша
            signed_at: <string>; // Время подписания
            signed_hash: <string>; // Подписанный хэш
            signer: <string>; // Аккаунт подписавшего
          }[]>; // Вектор подписей
        version: <string>; // Версия стандарта документа
      } | null>; // Подписанный документ оферты по программе "Генератор" (опционально, только для программы generation)
    privacy_agreement: {
      doc_hash: <string>; // Хэш содержимого документа
      hash: <string>; // Общий хэш (doc_hash + meta_hash)
      meta: <any>; // Метаинформация документа
      meta_hash: <string>; // Хэш мета-данных
      signatures: <{
          id: <number>; // Идентификатор номера подписи
          meta: <string>; // Мета-данные подписи
          public_key: <string>; // Публичный ключ
          signature: <string>; // Подпись хэша
          signed_at: <string>; // Время подписания
          signed_hash: <string>; // Подписанный хэш
          signer: <string>; // Аккаунт подписавшего
        }[]>; // Вектор подписей
      version: <string>; // Версия стандарта документа
    };
    program_key?: <ProgramKey | null>; // Ключ выбранной программы регистрации
    signature_agreement: {
      doc_hash: <string>; // Хэш содержимого документа
      hash: <string>; // Общий хэш (doc_hash + meta_hash)
      meta: <any>; // Метаинформация документа
      meta_hash: <string>; // Хэш мета-данных
      signatures: <{
          id: <number>; // Идентификатор номера подписи
          meta: <string>; // Мета-данные подписи
          public_key: <string>; // Публичный ключ
          signature: <string>; // Подпись хэша
          signed_at: <string>; // Время подписания
          signed_hash: <string>; // Подписанный хэш
          signer: <string>; // Аккаунт подписавшего
        }[]>; // Вектор подписей
      version: <string>; // Версия стандарта документа
    };
    statement: {
      doc_hash: <string>; // Хэш содержимого документа
      hash: <string>; // Общий хэш (doc_hash + meta_hash)
      meta: {
        block_num: <number>; // Номер блока, на котором был создан документ
        braname: <string>; // Имя аккаунта кооперативного участка
        coopname: <string>; // Название кооператива, связанное с документом
        created_at: <string>; // Дата и время создания документа
        generator: <string>; // Имя генератора, использованного для создания документа
        lang: <string>; // Язык документа
        links: <string[]>; // Ссылки, связанные с документом
        registry_id: <number>; // ID документа в реестре
        signature?: <string | null>; // Изображение собственноручной подписи (base-64)
        skip_save: <boolean>; // Флаг пропуска сохранения документа (используется для предварительной генерации и демонстрации пользователю)
        timezone: <string>; // Часовой пояс, в котором был создан документ
        title: <string>; // Название документа
        username: <string>; // Имя пользователя, создавшего документ
        version: <string>; // Версия генератора, использованного для создания документа
      };
      meta_hash: <string>; // Хэш мета-данных
      signatures: <{
          id: <number>; // Идентификатор номера подписи
          meta: <string>; // Мета-данные подписи
          public_key: <string>; // Публичный ключ
          signature: <string>; // Подпись хэша
          signed_at: <string>; // Время подписания
          signed_hash: <string>; // Подписанный хэш
          signer: <string>; // Аккаунт подписавшего
        }[]>; // Вектор подписей
      version: <string>; // Версия стандарта документа
    };
    user_agreement: {
      doc_hash: <string>; // Хэш содержимого документа
      hash: <string>; // Общий хэш (doc_hash + meta_hash)
      meta: <any>; // Метаинформация документа
      meta_hash: <string>; // Хэш мета-данных
      signatures: <{
          id: <number>; // Идентификатор номера подписи
          meta: <string>; // Мета-данные подписи
          public_key: <string>; // Публичный ключ
          signature: <string>; // Подпись хэша
          signed_at: <string>; // Время подписания
          signed_hash: <string>; // Подписанный хэш
          signer: <string>; // Аккаунт подписавшего
        }[]>; // Вектор подписей
      version: <string>; // Версия стандарта документа
    };
    username: <string>; // Имя аккаунта пайщика
    wallet_agreement: {
      doc_hash: <string>; // Хэш содержимого документа
      hash: <string>; // Общий хэш (doc_hash + meta_hash)
      meta: <any>; // Метаинформация документа
      meta_hash: <string>; // Хэш мета-данных
      signatures: <{
          id: <number>; // Идентификатор номера подписи
          meta: <string>; // Мета-данные подписи
          public_key: <string>; // Публичный ключ
          signature: <string>; // Подпись хэша
          signed_at: <string>; // Время подписания
          signed_hash: <string>; // Подписанный хэш
          signer: <string>; // Аккаунт подписавшего
        }[]>; // Вектор подписей
      version: <string>; // Версия стандарта документа
    };
  };
};

const { [Mutations.Participants.RegisterParticipant.name]: result } = await client.Mutation(
  Mutations.Participants.RegisterParticipant.mutation,
  { variables }
);
Результат
interface IOutput {
}