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

Принять пайщика

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

Принять платеж

Мы здесь рассмотрим стандартную процедуру приёма прямого банковского платежа, который был оплачен пайщиком через QR-код. Автоматизация платежей с помощью платежных провайдером выходит за пределы данного раздела. Однако, следует сказать, что при ее наличии, этот пункт административного процесса будет исполнятся автоматически.

Итак, пайщик совершил платеж, как мы об этом узнаем? На текущий момент система предусматривает ручное подтверждение входящих платежей лицами, обладающих доступом к личному кабинету члена совета и банка (назовем их - кассир). Для этого член совета использует страницу "Реестр платежей" со "Стола Совета".

реестр платежей в меню

Кассир, обладающий доступом к банковскому приложению, видит фактические входящие поступления на расчетный счет и/или получает мобильные оповещения от банка. На основании фактических реквизитов отправителя банковского платежа и данных в личном кабинете кассир принимает решение о подтверждении или отклонении входящего платежа.

реестр платежей

Про отклонение

На текущий момент отклонение - это отсутствие подтверждения. Важно, чтобы реквизиты отправителя платежа совпадали с реквизитами вступающего пайщика. Если они отличаются - кассир должны отказать в приёме платежа и произвести возврат средств по банку.

При получении от кассира нажатия кнопки подтверждения приёма платежа система запросит повторное подтверждение с предупреждением необратимости действия:

предупреждение при подтверждении оплаты

На этом процесс приёма платежа завершается. Следует отметить, что мы в интерфейсе цифрового кооператива отмечаем тип входящего платежа от новых пайщиков как "Регистрационный взнос", однако по банковскому приложению в назначении платежа должно быть указано "Вступительный и мин. паевой взносы", и именно такое назначение платежа закодировано в QR-коде у пайщиков.

Принять решение

Сразу после того, как кассир отметит платеж принятым, все члены совета получат оповещения (push, email) о появлении нового вопроса на повестке собрания совета для голосования. Голосование совета по всем вопросам производится на странице "Повестка совета" рабочего стола совета.

повестка совета

При нажатии на стрелочку в левой части строки повестки развернется содержательная часть вопроса, которая включает в себя подписанный электронный документы: заявления на вступление, соглашение о ЦПП "Цифровой Кошелек", соглашение о порядке и правилах использования простой электронной подписи, подписанное согласие с политикой конфиденциальности, а также пользовательское соглашение.

повестка совета

Для того, чтобы проголосовать по вопросу, ознакомимся с тем, как работает модуль голосования. Он состоит из двух кнопок-индикаторов "ЗА" и "ПРОТИВ", а также центрального индикатора статуса решения.

модуль голосования

Красная иконка с большим пальцем вниз - ПРОТИВ, зеленая иконка с большим пальцем вверх - ЗА. Нажимая на соответствующие иконки - члены совета голосуют. Цифры рядом с иконками обозначают количество проголовавших. Фамилии под иконками обозначают кто конкретно из членов совета проголосовал и как.

Для того, чтобы принять решение по любому вопросу повестки необходимо, чтобы ЗА проголосовало простое большинство членов совета. Если в кооперативе 5 членов совета, то индикатор принятого решения загорится зеленым только тогда, когда проголосует по-крайней мере 3 члена совета ЗА.

А как воздержаться?

Для воздержания по вопросу достаточно не нажимать ни одной кнопки "ЗА" или "ПРОТИВ". В этом случае система подсчитает ваш голос среди тех, кто воздержался от голосования по данному вопросу.

модуль голосования

Как только количество голосов "ЗА" становится достаточным для принятия решения, у председателя совета рядом с модулем голосования появляется кнопка "Утвердить". В этот момент система автоматически формирует протокол собрания совета по вопросу повестки, подсчитывает голоса и подписывает этот новый документ цифровой подписью председателя совета. После чего, этот документ отправляется согласно стандартам в блокчейн, который автоматически исполняет его.

утвердить решение

В результате утверждения стандартизированного решения о приёме пайщика, система сгенерирует протокол следующего вида:

Все члены совета всегда являются участниками электронного голосования по всем вопросам повестки совета, но не голосующие ЗА или ПРОТИВ - автоматически воздерживаются.

протокол решения

Этот протокол может быть найден на странице "Реестр документов" в папке с заявлением пайщика о вступлении в кооператив. Этот же протокол пайщик найдет у себя на странице "Документы" рабочего стола пайщика. Но здесь мы сейчас не об этом. Когда стандартизированное решение принято и утверждено - оно автоматически исполняется. Это означает, что пайщик получит оповещение о том, что он принят в кооператив и одновременно с этим его личный кабинет станет доступен.

Забегая вперёд..

Следует сказать, что система способна работать со стандартизированными решениями (например, вступление пайщика, взнос/возврат имущественных взносов, и т.д.), которые исполняются автоматически согласно стандартам платформы (например - через изменение статуса пайщика, увеличение баланса цифрового кошелька, и т.п.), и произвольными, когда члены совета создают вопрос на повестке и используют модуль голосования для формирования протокола решения совета, которое будет сохранено в системе как принятое, но не будет автоматически исполнено на уровне стандартов его программного кода. Произвольные решения позволяют кооперативам частично автоматизировать процесс принятия решений по любым вопросам своей деятельности вне цифровой платформы, автоматизируя процесс голосования и утверждения протоколов собрания совета. Стандартизированные решения же ведут к изменениям в распределенной базе данных блокчейна согласно стандартам платформы. Подробнее мы рассмотрим произвольные решения на странице "Повестка совета" на столе совета.

Мы здесь не будем рассматривать то, из чего состоит цифровая подпись и какие есть кнопки действий у электронных документов - оставим это соответствующим разделам. Пайщика мы приняли, двигаемся дальше.. Следующий раздел для разработчиков - смело пропускайте его, если вам это не нужно.

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

Канонические имена полей и типов — в файле components/controller/schema.gql монорепозитория; интерактивно — в документации GraphQL-API.

Повестка совета

🛠️ SDK: Queries.Agenda.GetAgenda | Query.getAgenda

Получить список вопросов совета кооператива для голосования Требуемые роли: chairman, member.

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

const variables: Queries.Agenda.GetAgenda.IInput = {
};

const { [Queries.Agenda.GetAgenda.name]: result } = await client.Query(
  Queries.Agenda.GetAgenda.query,
  { variables }
);

Результат:

interface IOutput {
  getAgenda: <{
      action: {
        account: <string>;
        account_ram_deltas: <{
            account: <string>;
            delta: <number>;
          }[]>;
        action_ordinal: <number>;
        authorization: <{
            actor: <string>;
            permission: <string>;
          }[]>;
        block_id: <string>;
        block_num: <number>;
        chain_id: <string>;
        console: <string>;
        context_free: <boolean>;
        creator_action_ordinal: <number>;
        data: <unknown>; // Данные действия в формате JSON
        elapsed: <number>;
        global_sequence: <string>;
        name: <string>;
        receipt: {
          abi_sequence: <number>;
          act_digest: <string>;
          auth_sequence: <{
              account: <string>;
              sequence: <string>;
            }[]>;
          code_sequence: <number>;
          global_sequence: <string>;
          receiver: <string>;
          recv_sequence: <string>;
        };
        receiver: <string>;
        transaction_id: <string>;
      };
      documents: {
        acts: <{
            action?: {
              account: <string>;
              account_ram_deltas: <{
                  account: <string>;
                  delta: <number>;
                }[]>;
              action_ordinal: <number>;
              actor_certificate?: <({ username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | null | undefined; inn: string; } | { username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | ... 1 more ... | undefined; } | { ...; }) & {}>; // Сертификат пользователя (сокращенная информация)
              authorization: <{
                  actor: <string>;
                  permission: <string>;
                }[]>;
              block_id: <string>;
              block_num: <number>;
              chain_id: <string>;
              console: <string>;
              context_free: <boolean>;
              creator_action_ordinal: <number>;
              data: <unknown>; // Данные действия в формате JSON
              elapsed: <number>;
              global_sequence: <string>;
              name: <string>;
              receipt: {
                abi_sequence: <number>;
                act_digest: <string>;
                auth_sequence: <{
                    account: <string>;
                    sequence: <string>;
                  }[]>;
                code_sequence: <number>;
                global_sequence: <string>;
                receiver: <string>;
                recv_sequence: <string>;
              };
              receiver: <string>;
              transaction_id: <string>;
            };
            documentAggregate?: {
              document: {
                doc_hash: <string>;
                hash: <string>;
                meta: <unknown>;
                meta_hash: <string>;
                signatures: <{
                    id: <number>;
                    is_valid?: <... | ... | ... | ...>;
                    meta: <unknown>;
                    public_key: <string>;
                    signature: <string>;
                    signed_at: <string>;
                    signed_hash: <string>;
                    signer: <string>;
                    signer_certificate?: <... | ...>; // Сертификат подписанта (сокращенная информация)
                  }[]>;
                version: <string>;
              };
              hash: <string>;
              rawDocument?: {
                binary: <string>; // Бинарное содержимое документа (base64)
                full_title: <string>; // Полное название документа
                hash: <string>; // Хэш документа
                html: <string>; // HTML содержимое документа
                meta: <unknown>; // Метаданные документа
              };
            };
          }[]>; // Массив объект(ов) актов с агрегатами, относящихся к заявлению
        decision?: {
          action: {
            account: <string>;
            account_ram_deltas: <{
                account: <string>;
                delta: <number>;
              }[]>;
            action_ordinal: <number>;
            actor_certificate?: <({ username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | null | undefined; inn: string; } | { username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | ... 1 more ... | undefined; } | { ...; }) & {}>; // Сертификат пользователя (сокращенная информация)
            authorization: <{
                actor: <string>;
                permission: <string>;
              }[]>;
            block_id: <string>;
            block_num: <number>;
            chain_id: <string>;
            console: <string>;
            context_free: <boolean>;
            creator_action_ordinal: <number>;
            data: <unknown>; // Данные действия в формате JSON
            elapsed: <number>;
            global_sequence: <string>;
            name: <string>;
            receipt: {
              abi_sequence: <number>;
              act_digest: <string>;
              auth_sequence: <{
                  account: <string>;
                  sequence: <string>;
                }[]>;
              code_sequence: <number>;
              global_sequence: <string>;
              receiver: <string>;
              recv_sequence: <string>;
            };
            receiver: <string>;
            transaction_id: <string>;
          };
          documentAggregate: {
            document: {
              doc_hash: <string>;
              hash: <string>;
              meta: <unknown>;
              meta_hash: <string>;
              signatures: <{
                  id: <number>;
                  is_valid?: <null | boolean>;
                  meta: <unknown>;
                  public_key: <string>;
                  signature: <string>;
                  signed_at: <string>;
                  signed_hash: <string>;
                  signer: <string>;
                  signer_certificate?: <({ username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | null | undefined; inn: string; } | { username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | ... 1 more ... | undefined; } | { ...; }) & {}>; // Сертификат подписанта (сокращенная информация)
                }[]>;
              version: <string>;
            };
            hash: <string>;
            rawDocument?: {
              binary: <string>; // Бинарное содержимое документа (base64)
              full_title: <string>; // Полное название документа
              hash: <string>; // Хэш документа
              html: <string>; // HTML содержимое документа
              meta: <unknown>; // Метаданные документа
            };
          };
          votes_against: <{
              account: <string>;
              account_ram_deltas: <{
                  account: <string>;
                  delta: <number>;
                }[]>;
              action_ordinal: <number>;
              actor_certificate?: <({ username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | null | undefined; inn: string; } | { username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | ... 1 more ... | undefined; } | { ...; }) & {}>; // Сертификат пользователя (сокращенная информация)
              authorization: <{
                  actor: <string>;
                  permission: <string>;
                }[]>;
              block_id: <string>;
              block_num: <number>;
              chain_id: <string>;
              console: <string>;
              context_free: <boolean>;
              creator_action_ordinal: <number>;
              data: <unknown>; // Данные действия в формате JSON
              elapsed: <number>;
              global_sequence: <string>;
              name: <string>;
              receipt: {
                abi_sequence: <number>;
                act_digest: <string>;
                auth_sequence: <{
                    account: <string>;
                    sequence: <string>;
                  }[]>;
                code_sequence: <number>;
                global_sequence: <string>;
                receiver: <string>;
                recv_sequence: <string>;
              };
              receiver: <string>;
              transaction_id: <string>;
            }[]>;
          votes_for: <{
              account: <string>;
              account_ram_deltas: <{
                  account: <string>;
                  delta: <number>;
                }[]>;
              action_ordinal: <number>;
              actor_certificate?: <({ username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | null | undefined; inn: string; } | { username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | ... 1 more ... | undefined; } | { ...; }) & {}>; // Сертификат пользователя (сокращенная информация)
              authorization: <{
                  actor: <string>;
                  permission: <string>;
                }[]>;
              block_id: <string>;
              block_num: <number>;
              chain_id: <string>;
              console: <string>;
              context_free: <boolean>;
              creator_action_ordinal: <number>;
              data: <unknown>; // Данные действия в формате JSON
              elapsed: <number>;
              global_sequence: <string>;
              name: <string>;
              receipt: {
                abi_sequence: <number>;
                act_digest: <string>;
                auth_sequence: <{
                    account: <string>;
                    sequence: <string>;
                  }[]>;
                code_sequence: <number>;
                global_sequence: <string>;
                receiver: <string>;
                recv_sequence: <string>;
              };
              receiver: <string>;
              transaction_id: <string>;
            }[]>;
        };
        links: <{
            document: {
              doc_hash: <string>;
              hash: <string>;
              meta: <unknown>;
              meta_hash: <string>;
              signatures: <{
                  id: <number>;
                  is_valid?: <null | boolean>;
                  meta: <unknown>;
                  public_key: <string>;
                  signature: <string>;
                  signed_at: <string>;
                  signed_hash: <string>;
                  signer: <string>;
                  signer_certificate?: <({ username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | null | undefined; inn: string; } | { username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | ... 1 more ... | undefined; } | { ...; }) & {}>; // Сертификат подписанта (сокращенная информация)
                }[]>;
              version: <string>;
            };
            hash: <string>;
            rawDocument?: {
              binary: <string>; // Бинарное содержимое документа (base64)
              full_title: <string>; // Полное название документа
              hash: <string>; // Хэш документа
              html: <string>; // HTML содержимое документа
              meta: <unknown>; // Метаданные документа
            };
          }[]>; // Массив связанных документов с агрегатами, извлечённых из мета-данных
        statement?: {
          action: {
            account: <string>;
            account_ram_deltas: <{
                account: <string>;
                delta: <number>;
              }[]>;
            action_ordinal: <number>;
            actor_certificate?: <({ username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | null | undefined; inn: string; } | { username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | ... 1 more ... | undefined; } | { ...; }) & {}>; // Сертификат пользователя (сокращенная информация)
            authorization: <{
                actor: <string>;
                permission: <string>;
              }[]>;
            block_id: <string>;
            block_num: <number>;
            chain_id: <string>;
            console: <string>;
            context_free: <boolean>;
            creator_action_ordinal: <number>;
            data: <unknown>; // Данные действия в формате JSON
            elapsed: <number>;
            global_sequence: <string>;
            name: <string>;
            receipt: {
              abi_sequence: <number>;
              act_digest: <string>;
              auth_sequence: <{
                  account: <string>;
                  sequence: <string>;
                }[]>;
              code_sequence: <number>;
              global_sequence: <string>;
              receiver: <string>;
              recv_sequence: <string>;
            };
            receiver: <string>;
            transaction_id: <string>;
          };
          documentAggregate: {
            document: {
              doc_hash: <string>;
              hash: <string>;
              meta: <unknown>;
              meta_hash: <string>;
              signatures: <{
                  id: <number>;
                  is_valid?: <null | boolean>;
                  meta: <unknown>;
                  public_key: <string>;
                  signature: <string>;
                  signed_at: <string>;
                  signed_hash: <string>;
                  signer: <string>;
                  signer_certificate?: <({ username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | null | undefined; inn: string; } | { username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | ... 1 more ... | undefined; } | { ...; }) & {}>; // Сертификат подписанта (сокращенная информация)
                }[]>;
              version: <string>;
            };
            hash: <string>;
            rawDocument?: {
              binary: <string>; // Бинарное содержимое документа (base64)
              full_title: <string>; // Полное название документа
              hash: <string>; // Хэш документа
              html: <string>; // HTML содержимое документа
              meta: <unknown>; // Метаданные документа
            };
          };
        };
      };
      table: {
        approved: <boolean>;
        authorization: {
          doc_hash: <string>; // Хэш содержимого документа
          hash: <string>; // Общий хэш (doc_hash + meta_hash)
          meta: <string>; // Метаинформация документа (в формате JSON-строки)
          meta_hash: <string>; // Хэш мета-данных
          signatures: <{
              id: <number>;
              is_valid?: <null | boolean>;
              meta: <unknown>;
              public_key: <string>;
              signature: <string>;
              signed_at: <string>;
              signed_hash: <string>;
              signer: <string>;
              signer_certificate?: <({ username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | null | undefined; inn: string; } | { username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | ... 1 more ... | undefined; } | { ...; }) & {}>; // Сертификат подписанта (сокращенная информация)
            }[]>; // Вектор подписей
          version: <string>; // Версия стандарта документа
        };
        authorized: <boolean>;
        authorized_by: <string>;
        batch_id: <number>;
        callback_contract?: <null | string>;
        confirm_callback?: <null | string>;
        coopname: <string>;
        created_at: <string>;
        decline_callback?: <null | string>;
        expired_at: <string>;
        hash?: <null | string>;
        id: <number>;
        meta: <string>;
        statement: {
          doc_hash: <string>; // Хэш содержимого документа
          hash: <string>; // Общий хэш (doc_hash + meta_hash)
          meta: <string>; // Метаинформация документа (в формате JSON-строки)
          meta_hash: <string>; // Хэш мета-данных
          signatures: <{
              id: <number>;
              is_valid?: <null | boolean>;
              meta: <unknown>;
              public_key: <string>;
              signature: <string>;
              signed_at: <string>;
              signed_hash: <string>;
              signer: <string>;
              signer_certificate?: <({ username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | null | undefined; inn: string; } | { username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | ... 1 more ... | undefined; } | { ...; }) & {}>; // Сертификат подписанта (сокращенная информация)
            }[]>; // Вектор подписей
          version: <string>; // Версия стандарта документа
        };
        type: <string>;
        username: <string>;
        username_certificate?: <({ username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | null | undefined; inn: string; } | { username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | ... 1 more ... | undefined; } | { ...; }) & {}>; // Сертификат пользователя, создавшего решение
        validated: <boolean>;
        votes_against: <string[]>;
        votes_against_certificates: <unknown[]>; // Сертификаты пользователей, голосовавших "против"
        votes_for: <string[]>;
        votes_for_certificates: <unknown[]>; // Сертификаты пользователей, голосовавших "за"
      };
    }[]>; // Получить список вопросов совета кооператива для голосования

Требуемые роли: chairman, member.
}

Документы

🛠️ SDK: Queries.Documents.GetDocuments | Query.getDocuments

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

const variables: Queries.Documents.GetDocuments.IInput = {
  data: {
    actions?: <null | DocumentAction[]>;
    after_block?: <null | number>;
    before_block?: <null | number>;
    filter: <any>;
    limit?: <null | number>;
    page?: <null | number>;
    type?: <null | string>;
    username: <string>;
  };
};

const { [Queries.Documents.GetDocuments.name]: result } = await client.Query(
  Queries.Documents.GetDocuments.query,
  { variables }
);

Результат:

interface IOutput {
  getDocuments: {
    currentPage: <number>; // Текущая страница
    items: <{
        acts: <{
            action?: {
              account: <string>;
              account_ram_deltas: <{
                  account: <string>;
                  delta: <number>;
                }[]>;
              action_ordinal: <number>;
              actor_certificate?: <({ username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | null | undefined; inn: string; } | { username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | ... 1 more ... | undefined; } | { ...; }) & {}>; // Сертификат пользователя (сокращенная информация)
              authorization: <{
                  actor: <string>;
                  permission: <string>;
                }[]>;
              block_id: <string>;
              block_num: <number>;
              chain_id: <string>;
              console: <string>;
              context_free: <boolean>;
              creator_action_ordinal: <number>;
              data: <unknown>; // Данные действия в формате JSON
              elapsed: <number>;
              global_sequence: <string>;
              name: <string>;
              receipt: {
                abi_sequence: <number>;
                act_digest: <string>;
                auth_sequence: <{
                    account: <string>;
                    sequence: <string>;
                  }[]>;
                code_sequence: <number>;
                global_sequence: <string>;
                receiver: <string>;
                recv_sequence: <string>;
              };
              receiver: <string>;
              transaction_id: <string>;
            };
            documentAggregate?: {
              document: {
                doc_hash: <string>;
                hash: <string>;
                meta: <unknown>;
                meta_hash: <string>;
                signatures: <{
                    id: <number>;
                    is_valid?: <... | ... | ... | ...>;
                    meta: <unknown>;
                    public_key: <string>;
                    signature: <string>;
                    signed_at: <string>;
                    signed_hash: <string>;
                    signer: <string>;
                    signer_certificate?: <... | ...>; // Сертификат подписанта (сокращенная информация)
                  }[]>;
                version: <string>;
              };
              hash: <string>;
              rawDocument?: {
                binary: <string>; // Бинарное содержимое документа (base64)
                full_title: <string>; // Полное название документа
                hash: <string>; // Хэш документа
                html: <string>; // HTML содержимое документа
                meta: <unknown>; // Метаданные документа
              };
            };
          }[]>; // Массив объект(ов) актов с агрегатами, относящихся к заявлению
        decision?: {
          action: {
            account: <string>;
            account_ram_deltas: <{
                account: <string>;
                delta: <number>;
              }[]>;
            action_ordinal: <number>;
            actor_certificate?: <({ username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | null | undefined; inn: string; } | { username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | ... 1 more ... | undefined; } | { ...; }) & {}>; // Сертификат пользователя (сокращенная информация)
            authorization: <{
                actor: <string>;
                permission: <string>;
              }[]>;
            block_id: <string>;
            block_num: <number>;
            chain_id: <string>;
            console: <string>;
            context_free: <boolean>;
            creator_action_ordinal: <number>;
            data: <unknown>; // Данные действия в формате JSON
            elapsed: <number>;
            global_sequence: <string>;
            name: <string>;
            receipt: {
              abi_sequence: <number>;
              act_digest: <string>;
              auth_sequence: <{
                  account: <string>;
                  sequence: <string>;
                }[]>;
              code_sequence: <number>;
              global_sequence: <string>;
              receiver: <string>;
              recv_sequence: <string>;
            };
            receiver: <string>;
            transaction_id: <string>;
          };
          documentAggregate: {
            document: {
              doc_hash: <string>;
              hash: <string>;
              meta: <unknown>;
              meta_hash: <string>;
              signatures: <{
                  id: <number>;
                  is_valid?: <null | boolean>;
                  meta: <unknown>;
                  public_key: <string>;
                  signature: <string>;
                  signed_at: <string>;
                  signed_hash: <string>;
                  signer: <string>;
                  signer_certificate?: <({ username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | null | undefined; inn: string; } | { username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | ... 1 more ... | undefined; } | { ...; }) & {}>; // Сертификат подписанта (сокращенная информация)
                }[]>;
              version: <string>;
            };
            hash: <string>;
            rawDocument?: {
              binary: <string>; // Бинарное содержимое документа (base64)
              full_title: <string>; // Полное название документа
              hash: <string>; // Хэш документа
              html: <string>; // HTML содержимое документа
              meta: <unknown>; // Метаданные документа
            };
          };
          votes_against: <{
              account: <string>;
              account_ram_deltas: <{
                  account: <string>;
                  delta: <number>;
                }[]>;
              action_ordinal: <number>;
              actor_certificate?: <({ username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | null | undefined; inn: string; } | { username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | ... 1 more ... | undefined; } | { ...; }) & {}>; // Сертификат пользователя (сокращенная информация)
              authorization: <{
                  actor: <string>;
                  permission: <string>;
                }[]>;
              block_id: <string>;
              block_num: <number>;
              chain_id: <string>;
              console: <string>;
              context_free: <boolean>;
              creator_action_ordinal: <number>;
              data: <unknown>; // Данные действия в формате JSON
              elapsed: <number>;
              global_sequence: <string>;
              name: <string>;
              receipt: {
                abi_sequence: <number>;
                act_digest: <string>;
                auth_sequence: <{
                    account: <string>;
                    sequence: <string>;
                  }[]>;
                code_sequence: <number>;
                global_sequence: <string>;
                receiver: <string>;
                recv_sequence: <string>;
              };
              receiver: <string>;
              transaction_id: <string>;
            }[]>;
          votes_for: <{
              account: <string>;
              account_ram_deltas: <{
                  account: <string>;
                  delta: <number>;
                }[]>;
              action_ordinal: <number>;
              actor_certificate?: <({ username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | null | undefined; inn: string; } | { username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | ... 1 more ... | undefined; } | { ...; }) & {}>; // Сертификат пользователя (сокращенная информация)
              authorization: <{
                  actor: <string>;
                  permission: <string>;
                }[]>;
              block_id: <string>;
              block_num: <number>;
              chain_id: <string>;
              console: <string>;
              context_free: <boolean>;
              creator_action_ordinal: <number>;
              data: <unknown>; // Данные действия в формате JSON
              elapsed: <number>;
              global_sequence: <string>;
              name: <string>;
              receipt: {
                abi_sequence: <number>;
                act_digest: <string>;
                auth_sequence: <{
                    account: <string>;
                    sequence: <string>;
                  }[]>;
                code_sequence: <number>;
                global_sequence: <string>;
                receiver: <string>;
                recv_sequence: <string>;
              };
              receiver: <string>;
              transaction_id: <string>;
            }[]>;
        };
        links: <{
            document: {
              doc_hash: <string>;
              hash: <string>;
              meta: <unknown>;
              meta_hash: <string>;
              signatures: <{
                  id: <number>;
                  is_valid?: <null | boolean>;
                  meta: <unknown>;
                  public_key: <string>;
                  signature: <string>;
                  signed_at: <string>;
                  signed_hash: <string>;
                  signer: <string>;
                  signer_certificate?: <({ username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | null | undefined; inn: string; } | { username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | ... 1 more ... | undefined; } | { ...; }) & {}>; // Сертификат подписанта (сокращенная информация)
                }[]>;
              version: <string>;
            };
            hash: <string>;
            rawDocument?: {
              binary: <string>; // Бинарное содержимое документа (base64)
              full_title: <string>; // Полное название документа
              hash: <string>; // Хэш документа
              html: <string>; // HTML содержимое документа
              meta: <unknown>; // Метаданные документа
            };
          }[]>; // Массив связанных документов с агрегатами, извлечённых из мета-данных
        statement?: {
          action: {
            account: <string>;
            account_ram_deltas: <{
                account: <string>;
                delta: <number>;
              }[]>;
            action_ordinal: <number>;
            actor_certificate?: <({ username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | null | undefined; inn: string; } | { username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | ... 1 more ... | undefined; } | { ...; }) & {}>; // Сертификат пользователя (сокращенная информация)
            authorization: <{
                actor: <string>;
                permission: <string>;
              }[]>;
            block_id: <string>;
            block_num: <number>;
            chain_id: <string>;
            console: <string>;
            context_free: <boolean>;
            creator_action_ordinal: <number>;
            data: <unknown>; // Данные действия в формате JSON
            elapsed: <number>;
            global_sequence: <string>;
            name: <string>;
            receipt: {
              abi_sequence: <number>;
              act_digest: <string>;
              auth_sequence: <{
                  account: <string>;
                  sequence: <string>;
                }[]>;
              code_sequence: <number>;
              global_sequence: <string>;
              receiver: <string>;
              recv_sequence: <string>;
            };
            receiver: <string>;
            transaction_id: <string>;
          };
          documentAggregate: {
            document: {
              doc_hash: <string>;
              hash: <string>;
              meta: <unknown>;
              meta_hash: <string>;
              signatures: <{
                  id: <number>;
                  is_valid?: <null | boolean>;
                  meta: <unknown>;
                  public_key: <string>;
                  signature: <string>;
                  signed_at: <string>;
                  signed_hash: <string>;
                  signer: <string>;
                  signer_certificate?: <({ username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | null | undefined; inn: string; } | { username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | ... 1 more ... | undefined; } | { ...; }) & {}>; // Сертификат подписанта (сокращенная информация)
                }[]>;
              version: <string>;
            };
            hash: <string>;
            rawDocument?: {
              binary: <string>; // Бинарное содержимое документа (base64)
              full_title: <string>; // Полное название документа
              hash: <string>; // Хэш документа
              html: <string>; // HTML содержимое документа
              meta: <unknown>; // Метаданные документа
            };
          };
        };
      }[]>; // Элементы текущей страницы
    totalCount: <number>; // Общее количество элементов
    totalPages: <number>; // Общее количество страниц
  };
}

Список платежей

🛠️ SDK: Queries.Gateway.GetPayments | Query.getPayments

Получить список платежей с возможностью фильтрации по типу, статусу и направлению. Требуемые роли: chairman, member. Исключение: доступ разрешен, если

data.username

совпадает с

username

текущего пользователя.

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

const variables: Queries.Gateway.GetPayments.IInput = {
  data?: {
    coopname?: <null | string>; // Название кооператива
    direction?: <null | PaymentDirection>; // Направление платежа
    hash?: <null | string>; // Хэш платежа
    provider?: <null | string>; // Провайдер платежа
    status?: <null | PaymentStatus>; // Статус платежа
    type?: <null | PaymentType>; // Тип платежа
    username?: <null | string>; // Имя пользователя
  };
  options?: {
    limit: <number>; // Количество элементов на странице
    page: <number>; // Номер страницы
    sortBy?: <null | string>; // Ключ сортировки (например, "name")
    sortOrder: <string>; // Направление сортировки ("ASC" или "DESC")
  };
};

const { [Queries.Gateway.GetPayments.name]: result } = await client.Query(
  Queries.Gateway.GetPayments.query,
  { variables }
);

Результат:

interface IOutput {
  getPayments: {
    currentPage: <number>; // Текущая страница
    items: <{
        blockchain_data?: <unknown>; // Данные из блокчейна
        can_change_status: <boolean>; // Можно ли изменить статус
        coopname: <string>; // Название кооператива
        created_at: <unknown>; // Дата создания
        direction: <PaymentDirection>; // Направление платежа
        direction_label: <string>; // Человекочитаемое направление платежа
        expired_at?: <unknown>; // Дата истечения
        formatted_amount: <string>; // Форматированная сумма
        hash?: <null | string>; // Хеш платежа
        id?: <unknown>; // Уникальный идентификатор платежа
        income_hash?: <null | string>; // Хеш входящего платежа (устарело)
        is_final: <boolean>; // Завершен ли платеж окончательно
        memo?: <null | string>; // Дополнительная информация
        message?: <null | string>; // Сообщение
        outcome_hash?: <null | string>; // Хеш исходящего платежа (устарело)
        payment_details?: {
          amount_plus_fee: <string>; // Сумма платежа с учетом комиссии
          amount_without_fee: <string>; // Сумма платежа без учета комиссии
          data: <unknown>; // Данные платежа (QR-код, токен, реквизиты и т.д.)
          fact_fee_percent: <number>; // Фактический процент комиссии
          fee_amount: <string>; // Размер комиссии в абсолютных значениях
          fee_percent: <number>; // Процент комиссии
          tolerance_percent: <number>; // Допустимый процент отклонения
        };
        payment_method_id?: <null | string>; // ID платежного метода
        provider?: <null | string>; // Провайдер платежа
        quantity: <number>; // Количество/сумма
        statement?: <unknown>; // Подписанный документ заявления
        status: <PaymentStatus>; // Статус платежа
        status_label: <string>; // Человекочитаемый статус
        symbol: <string>; // Символ валюты
        type: <PaymentType>; // Тип платежа
        type_label: <string>; // Человекочитаемый тип платежа
        updated_at?: <unknown>; // Дата обновления
        username: <string>; // Имя пользователя
        username_certificate?: <({ username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | null | undefined; inn: string; } | { username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | ... 1 more ... | undefined; } | { ...; }) & {}>; // Сертификат пользователя, создавшего платеж
      }[]>; // Элементы текущей страницы
    totalCount: <number>; // Общее количество элементов
    totalPages: <number>; // Общее количество страниц
  };
}

Изменить статус платежа

🛠️ SDK: Mutations.Gateway.SetPaymentStatus | Mutation.setPaymentStatus

Управление статусом платежа осущствляется мутацией setPaymentStatus. При переходе платежа в статус PAID вызывается эффект в блокчейне, который завершает операцию автоматическим переводом платежа в статус COMPLETED. При установке статуса REFUNDED запускается процесс отмены платежа в блокчейне. Остальные статусы не приводят к эффектам в блокчейне. Требуемые роли: chairman, member.

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"]>;
}

Утвердить запрос председателем

🛠️ SDK: Mutations.Chairman.ConfirmApprove | Mutation.chairmanConfirmApprove

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

const variables: Mutations.Chairman.ConfirmApprove.IInput = {
  data: {
    approval_hash: <string>; // Хеш одобрения для идентификации
    approved_document?: <null | {
        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>; // Версия стандарта документа
      }>; // Одобренный документ в формате JSON
    coopname: <string>; // Название кооператива
  };
};

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

Результат:

interface IOutput {
  chairmanConfirmApprove: {
    _created_at: <unknown>; // Дата создания записи
    _id: <string>; // Внутренний ID базы данных
    _updated_at: <unknown>; // Дата последнего обновления записи
    approval_hash: <string>; // Хеш одобрения для идентификации
    approved_document?: {
      document: {
        doc_hash: <string>;
        hash: <string>;
        meta: <unknown>;
        meta_hash: <string>;
        signatures: <{
            id: <number>;
            is_valid?: <null | boolean>;
            meta: <unknown>;
            public_key: <string>;
            signature: <string>;
            signed_at: <string>;
            signed_hash: <string>;
            signer: <string>;
            signer_certificate?: <({ username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | null | undefined; inn: string; } | { username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | ... 1 more ... | undefined; } | { ...; }) & {}>; // Сертификат подписанта (сокращенная информация)
          }[]>;
        version: <string>;
      };
      hash: <string>;
      rawDocument?: {
        binary: <string>; // Бинарное содержимое документа (base64)
        full_title: <string>; // Полное название документа
        hash: <string>; // Хэш документа
        html: <string>; // HTML содержимое документа
        meta: <unknown>; // Метаданные документа
      };
    };
    block_num?: <null | number>; // Номер блока крайней синхронизации с блокчейном
    callback_action_approve: <string>; // Действие обратного вызова при одобрении
    callback_action_decline: <string>; // Действие обратного вызова при отклонении
    callback_contract: <string>; // Контракт обратного вызова для обработки результата
    coopname: <string>; // Название кооператива
    created_at: <unknown>; // Дата создания одобрения
    document?: {
      document: {
        doc_hash: <string>;
        hash: <string>;
        meta: <unknown>;
        meta_hash: <string>;
        signatures: <{
            id: <number>;
            is_valid?: <null | boolean>;
            meta: <unknown>;
            public_key: <string>;
            signature: <string>;
            signed_at: <string>;
            signed_hash: <string>;
            signer: <string>;
            signer_certificate?: <({ username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | null | undefined; inn: string; } | { username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | ... 1 more ... | undefined; } | { ...; }) & {}>; // Сертификат подписанта (сокращенная информация)
          }[]>;
        version: <string>;
      };
      hash: <string>;
      rawDocument?: {
        binary: <string>; // Бинарное содержимое документа (base64)
        full_title: <string>; // Полное название документа
        hash: <string>; // Хэш документа
        html: <string>; // HTML содержимое документа
        meta: <unknown>; // Метаданные документа
      };
    };
    id?: <null | number>; // ID одобрения в блокчейне
    meta: <string>; // Метаданные одобрения в формате JSON
    present: <boolean>; // Флаг присутствия записи в блокчейне
    status: <ApprovalStatus>; // Статус одобрения
    username: <string>; // Имя пользователя, запросившего одобрение
  };
}

Отклонить запрос председателем

🛠️ SDK: Mutations.Chairman.DeclineApprove | Mutation.chairmanDeclineApprove

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

const variables: Mutations.Chairman.DeclineApprove.IInput = {
  data: {
    approval_hash: <string>; // Хеш одобрения для идентификации
    coopname: <string>; // Название кооператива
    reason: <string>; // Причина отклонения
  };
};

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

Результат:

interface IOutput {
  chairmanDeclineApprove: {
    _created_at: <unknown>; // Дата создания записи
    _id: <string>; // Внутренний ID базы данных
    _updated_at: <unknown>; // Дата последнего обновления записи
    approval_hash: <string>; // Хеш одобрения для идентификации
    approved_document?: {
      document: {
        doc_hash: <string>;
        hash: <string>;
        meta: <unknown>;
        meta_hash: <string>;
        signatures: <{
            id: <number>;
            is_valid?: <null | boolean>;
            meta: <unknown>;
            public_key: <string>;
            signature: <string>;
            signed_at: <string>;
            signed_hash: <string>;
            signer: <string>;
            signer_certificate?: <({ username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | null | undefined; inn: string; } | { username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | ... 1 more ... | undefined; } | { ...; }) & {}>; // Сертификат подписанта (сокращенная информация)
          }[]>;
        version: <string>;
      };
      hash: <string>;
      rawDocument?: {
        binary: <string>; // Бинарное содержимое документа (base64)
        full_title: <string>; // Полное название документа
        hash: <string>; // Хэш документа
        html: <string>; // HTML содержимое документа
        meta: <unknown>; // Метаданные документа
      };
    };
    block_num?: <null | number>; // Номер блока крайней синхронизации с блокчейном
    callback_action_approve: <string>; // Действие обратного вызова при одобрении
    callback_action_decline: <string>; // Действие обратного вызова при отклонении
    callback_contract: <string>; // Контракт обратного вызова для обработки результата
    coopname: <string>; // Название кооператива
    created_at: <unknown>; // Дата создания одобрения
    document?: {
      document: {
        doc_hash: <string>;
        hash: <string>;
        meta: <unknown>;
        meta_hash: <string>;
        signatures: <{
            id: <number>;
            is_valid?: <null | boolean>;
            meta: <unknown>;
            public_key: <string>;
            signature: <string>;
            signed_at: <string>;
            signed_hash: <string>;
            signer: <string>;
            signer_certificate?: <({ username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | null | undefined; inn: string; } | { username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | ... 1 more ... | undefined; } | { ...; }) & {}>; // Сертификат подписанта (сокращенная информация)
          }[]>;
        version: <string>;
      };
      hash: <string>;
      rawDocument?: {
        binary: <string>; // Бинарное содержимое документа (base64)
        full_title: <string>; // Полное название документа
        hash: <string>; // Хэш документа
        html: <string>; // HTML содержимое документа
        meta: <unknown>; // Метаданные документа
      };
    };
    id?: <null | number>; // ID одобрения в блокчейне
    meta: <string>; // Метаданные одобрения в формате JSON
    present: <boolean>; // Флаг присутствия записи в блокчейне
    status: <ApprovalStatus>; // Статус одобрения
    username: <string>; // Имя пользователя, запросившего одобрение
  };
}

Добавить пайщика

🛠️ SDK: Mutations.Participants.AddParticipant | Mutation.addParticipant

  import { Mutations, Zeus} from '@coopenomics/sdk'

  const variables: Mutations.Participants.AddParticipant.IInput = {
      data: {
        created_at: "<фактическая дата регистрации пайщика>",
        email: "<email пайщика>",
        initial: <внесенный вступительного взнос (100.0000 RUB)>,
        minimum: <внесенный мин. паевый взнос (300.0000 RUB)>,

        //флаг распределения вступительного взноса по фондам указывает то,
        // следует ли системе добавить вступительный взнос в фонд для дальнейшего списания (true),
        // или он был ранее добавлен и списан на хозяйственные расходы (false).
        spread_initial: false | true,
        //тип добавляемого аккаунта - физлицо, юрлицо или организация
        type: <Zeus.AccountType.Individual | Zeus.AccountType.Entrepreneur | Zeus.AccountType.Organization>

        //передать один из объектов с данными
        individual_data: {<объект с данными физлица> },
        organization_data: {<объект с данными ИП> },
        entrepreneur_data: {<объект с данными организации> },
      }
    }

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

/** Добавить активного пайщика, который вступил в кооператив, не используя платформу (заполнив заявление собственноручно, оплатив вступительный и минимальный паевый взносы, и получив протокол решения совета) Требуемые роли: chairman, member.

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

const variables: Mutations.Participants.AddParticipant.IInput = {
  data: {
    created_at: <string>; // Дата создания аккаунта в строковом формате даты EOSIO по UTC (2024-12-28T06:58:52.500)
    email: <string>; // Электронная почта
    entrepreneur_data?: <null | {
        bank_account: {
          account_number: <string>; // Номер банковского счета
          bank_name: <string>; // Название банка
          card_number?: <null | string>; // Номер карты
          currency: <string>; // Валюта счета
          details: {
            bik: <string>; // БИК банка
            corr: <string>; // Корреспондентский счет
            kpp: <string>; // КПП банка
          };
        };
        birthdate: <string>; // Дата рождения
        city: <string>; // Город
        country: <Russia>; // Страна
        details: {
          inn: <string>; // ИНН
          ogrn: <string>; // ОГРН
        };
        first_name: <string>; // Имя
        full_address: <string>; // Полный адрес
        last_name: <string>; // Фамилия
        middle_name: <string>; // Отчество
        phone: <string>; // Телефон
      }>; // Данные индивидуального предпринимателя
    individual_data?: <null | {
        birthdate: <string>; // Дата рождения
        first_name: <string>; // Имя
        full_address: <string>; // Полный адрес
        last_name: <string>; // Фамилия
        middle_name: <string>; // Отчество
        passport?: <null | {
            code: <string>;
            issued_at: <string>;
            issued_by: <string>;
            number: <number>;
            series: <number>;
          }>; // Данные паспорта
        phone: <string>; // Телефон
      }>; // Данные физического лица
    initial: <string>; // Вступительный взнос, который был внесён пайщиком
    minimum: <string>; // Минимальный паевый взнос, который был внесён пайщиком
    organization_data?: <null | {
        bank_account: {
          account_number: <string>; // Номер банковского счета
          bank_name: <string>; // Название банка
          card_number?: <null | string>; // Номер карты
          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>; // Тип организации
      }>; // Данные организации
    referer?: <null | string>; // Имя аккаунта реферера
    spread_initial: <boolean>; // Флаг распределения вступительного взноса в невозвратный фонд вступительных взносов кооператива
    type: <AccountType>; // Тип аккаунта
  };
};

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

Результат:

interface IOutput {
  addParticipant: {
    blockchain_account?: {
      account_name: <string>; // Имя аккаунта
      core_liquid_balance?: <null | string>; // Баланс
      cpu_limit: {
        available: <string>; // Доступные ресурсы
        current_used?: <null | string>; // Текущее использование ресурсов
        last_usage_update_time?: <null | string>; // Время последнего обновления использования ресурсов
        max: <string>; // Максимальное количество ресурсов
        used: <string>; // Использовано ресурсов
      };
      cpu_weight: <string>; // Вес CPU
      created: <string>; // Дата создания
      head_block_num: <number>; // Номер последнего блока
      head_block_time: <string>; // Время последнего блока
      last_code_update: <string>; // Время последнего обновления кода
      net_limit: {
        available: <string>; // Доступные ресурсы
        current_used?: <null | string>; // Текущее использование ресурсов
        last_usage_update_time?: <null | string>; // Время последнего обновления использования ресурсов
        max: <string>; // Максимальное количество ресурсов
        used: <string>; // Использовано ресурсов
      };
      net_weight: <string>; // Вес сети
      permissions: <{
          parent: <string>; // Родительское разрешение
          perm_name: <string>; // Имя разрешения
          required_auth: {
            accounts: <{
                permission: {
                  actor: <string>; // Актор
                  permission: <string>; // Разрешение
                };
                weight: <number>; // Вес
              }[]>; // Уровни разрешений
            keys: <{
                key: <string>; // Ключ
                weight: <number>; // Вес
              }[]>; // Ключи
            threshold: <number>; // Порог
            waits: <{
                wait_sec: <number>; // Время ожидания в секундах
                weight: <number>; // Вес
              }[]>; // Вес ожидания
          };
        }[]>; // Разрешения
      privileged: <boolean>; // Флаг привилегий
      ram_quota: <number>; // Квота RAM
      ram_usage: <number>; // Использование RAM
      refund_request?: {
        cpu_amount: <string>; // Сумма CPU
        net_amount: <string>; // Сумма сети
        owner: <string>; // Владелец
        request_time: <string>; // Время запроса
      };
      rex_info?: <null | string>; // Информация о REX
      self_delegated_bandwidth?: {
        cpu_weight: <string>; // Вес CPU
        from: <string>; // Отправитель
        net_weight: <string>; // Вес сети
        to: <string>; // Получатель
      };
      total_resources?: {
        cpu_weight: <string>; // Вес CPU
        net_weight: <string>; // Вес сети
        owner: <string>; // Владелец
        ram_bytes: <number>; // Используемая RAM
      };
      voter_info?: <null | string>; // Информация о голосовании
    };
    participant_account?: {
      braname?: <null | string>; // Имя кооперативного участка
      created_at: <unknown>; // Время создания записи о члене
      has_vote: <boolean>; // LEGACY Флаг, имеет ли член право голоса
      initial_amount?: <null | string>; // Сумма вступительного взноса
      is_initial: <boolean>; // LEGACY Флаг, внесен ли регистрационный взнос
      is_minimum: <boolean>; // LEGACY Флаг, внесен ли минимальный паевый взнос
      last_min_pay: <unknown>; // Время последнего минимального платежа
      last_update: <unknown>; // Время последнего обновления информации о члене
      minimum_amount?: <null | string>; // Сумма минимального паевого взноса
      status: <string>; // Статус члена кооператива (accepted | blocked)
      type?: <null | string>; // Тип участника (individual | entrepreneur | organization)
      username: <string>; // Уникальное имя члена кооператива
    };
    private_account?: {
      entrepreneur_data?: {
        birthdate: <string>; // Дата рождения
        city: <string>; // Город
        country: <string>; // Страна
        details: {
          inn: <string>; // ИНН
          ogrn: <string>; // ОГРН
        };
        email: <string>; // Email
        first_name: <string>; // Имя
        full_address: <string>; // Юридический адрес
        last_name: <string>; // Фамилия
        middle_name: <string>; // Отчество
        phone: <string>; // Телефон
        username: <string>; // Имя аккаунта
      };
      individual_data?: {
        birthdate: <string>; // Дата рождения
        email: <string>; // Email
        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>; // Серия паспорта
        };
        phone: <string>; // Телефон
        username: <string>; // Имя аккаунта
      };
      organization_data?: {
        city: <string>; // Город
        country: <string>; // Страна
        details: {
          inn: <string>; // ИНН
          kpp: <string>; // КПП
          ogrn: <string>; // ОГРН
        };
        email: <string>; // Email
        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: <string>; // Тип организации
        username: <string>; // Имя аккаунта организации
      };
      type: <AccountType>; // Тип аккаунта
    };
    provider_account?: {
      email: <string>; // Электронная почта пользователя
      has_account: <boolean>; // Есть ли у пользователя аккаунт
      initial_order?: <null | string>; // ID начального заказа
      is_email_verified: <boolean>; // Подтверждена ли электронная почта
      is_registered: <boolean>; // Зарегистрирован ли пользователь
      message?: <null | string>; // Сообщение
      public_key: <string>; // Публичный ключ пользователя
      referer: <string>; // Реферер пользователя
      role: <string>; // Роль пользователя
      status: <UserStatus>; // Статус пользователя
      subscriber_hash: <string>; // Хэш подписчика для уведомлений
      subscriber_id: <string>; // Идентификатор подписчика для уведомлений
      type: <string>; // Тип пользователя
      username: <string>; // Имя пользователя
    };
    user_account?: {
      meta: <string>; // Метаинформация
      referer: <string>; // Реферал
      registered_at: <string>; // Дата регистрации
      registrator: <string>; // Регистратор
      status: <string>; // Статус аккаунта
      storages: <string[]>; // Список хранилищ
      type: <string>; // Тип учетной записи
      username: <string>; // Имя аккаунта
      verifications: <{
          created_at: <string>; // Дата создания верификации
          is_verified: <boolean>; // Флаг верификации
          last_update: <string>; // Дата последнего обновления верификации
          notice: <string>; // Заметка верификации
          procedure: <string>; // Процедура верификации
          verificator: <string>; // Имя верификатора
        }[]>; // Дата регистрации
    };
    username: <string>; // Имя аккаунта кооператива
  };
}

Решение совета по заявлению (документ)

🛠️ SDK: Mutations.Participants.GenerateParticipantApplicationDecision | Mutation.generateParticipantApplicationDecision

Сгенерировать документ протокол решения собрания совета Требуемые роли: chairman, member.

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

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

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

Результат:

interface IOutput {
  generateParticipantApplicationDecision: {
    binary: <string>; // Бинарное содержимое документа (base64)
    full_title: <string>; // Полное название документа
    hash: <string>; // Хэш документа
    html: <string>; // HTML содержимое документа
    meta: <unknown>; // Метаданные документа
  };
}

Часть шагов (голос по решению совета, исполнение ряда решений) выполняется подписью и отправкой транзакции в блокчейн через Client.Blockchain / класс Blockchain в пакете @coopenomics/sdk, а не отдельной мутацией GraphQL; см. 🛠️ Classes.Blockchain и 🛠️ Classes.Client.