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

Запросы одобрений

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

запросы одобрений

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

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

О нагрузках

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

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

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

Список запросов на одобрение

🛠️ SDK: Queries.Chairman.GetApprovals | Query.chairmanApprovals

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

const variables: Queries.Chairman.GetApprovals.IInput = {
  filter?: {
    approval_hash?: <null | string>; // Поиск по хешу одобрения
    coopname?: <null | string>; // Фильтр по названию кооператива
    created_from?: <any>; // Фильтр по дате создания (от)
    created_to?: <any>; // Фильтр по дате создания (до)
    statuses?: <null | ApprovalStatus[]>; // Фильтр по статусам одобрений
    username?: <null | string>; // Фильтр по имени пользователя
  };
  options?: {
    limit: <number>; // Количество элементов на странице
    page: <number>; // Номер страницы
    sortBy?: <null | string>; // Ключ сортировки (например, "name")
    sortOrder: <string>; // Направление сортировки ("ASC" или "DESC")
  };
};

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

Результат:

interface IOutput {
  chairmanApprovals: {
    currentPage: <number>; // Текущая страница
    items: <{
        _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>; // Имя пользователя, запросившего одобрение
      }[]>; // Элементы текущей страницы
    totalCount: <number>; // Общее количество элементов
    totalPages: <number>; // Общее количество страниц
  };
}

Один запрос на одобрение

🛠️ SDK: Queries.Chairman.GetApproval | Query.chairmanApproval

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

const variables: Queries.Chairman.GetApproval.IInput = {
  id: <string>;
};

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

Результат:

interface IOutput {
  chairmanApproval?: <undefined | {
      _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>; // Имя пользователя, запросившего одобрение
    }>; // Получение одобрения по внутреннему ID базы данных
}

Подтвердить одобрение

🛠️ 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>; // Имя пользователя, запросившего одобрение
  };
}

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