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

Запросы одобрений являются частью бизнес-процессов, по ходу которых они запрашиваются. Как только одобрение председателя будет получено - процесс продолжит выполняться по стандартам смарт-контрактов.
Страница запросов одобрений стола председателя - это центральная точка, в которую сводятся все запросы одобрений всех смарт-контрактов всех бизнес-процессов цифрового кооператива.
О нагрузках
В больших кооперативах запросы одобрений могут вызывать задержки и создавать большую нагрузку на председателя совета. Для решения этого, председатель сможет делегировать полномочия одобрений пайщикам или роботу. На текущий момент возможность делегирования не реализована.
Разработчикам¶
Канонические имена полей и типов — в файле 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.