Решения
Решение
- это утвержденное протоколом собрания совета юридическое действие в кооперативе.
Все решения принимаются онлайн-голосованием членов совета на платформе. После успешного голосования председатель утверждает автоматически-сформированный протокол собрания совета, а блокчейн - исполняет его.
Решения бывают: стандартизированные
и свободные
.
graph TD
A[Решение] -->|создаётся и исполняется автоматически| B[Стандартизированное]
A -->|создаётся и исполняется вручную| C[Свободное]
B -->|Предложение поступает от смарт-контрактов| D[Повестка]
D -->|Вопрос выносится на голосование| E[Голосование]
E -->|Решение принято| F[Утверждение председателем]
F -->|Фиксация в реестре| G[Исполняется автоматически]
C -->|Предложение поступает от членов совета| H[Повестка]
H -->|Вопрос выносится на голосование| I[Голосование]
I -->|Решение принято| J[Утверждение председателем]
J -->|Фиксация в реестре| K[Исполняется вручную]
Стандартизированные
решения принимаются по типичным вопросам, такие как: приём пайщика, приём паевого взноса финансовыми средствами, приём паевого взноса имуществом, возврат паевого взноса финансовыми средствами, возврат паевого взноса имуществом, выход пайщика из кооператива, и т.д. и т.п.
Стандартизированные
решения полностью автоматизированы, предложения на вопросы для голосование в них формируются автоматически и фиксируются в повестке для дальнейшего голосования совета. После проведения голосования и утверждения председателем совета, решение будет исполнено автоматически - например, пайщик будет добавлен в реестр, взносы зафиксируются в фондах, и т.д. и т.п..
Таким образом, стандартизированные
решения полностью автоматизированы в том плане, что входящие данные по ним формируются системой автоматически на основе действий пайщика и не требуют участия администрации кооператива в подготовке документов - документы по стандартазированным решениям готовятся и исполняются автоматически.
Свободные
решения свободны в том плане, что вопрос на повестку и проект решения по этому вопросу предлагается членом совета на голосование всему совету. Если голосование прошло успешно и решение принято, то оно фиксируется в реестре документов и не приводит к автоматическому исполнению содержимого. Исполнение свободного решения производится советом вручную
,
Свободные
и стандартизированные
решения предоставляют совету возможность легко и просто принимать решения по любым вопросам удаленно, на основе простой электронной подписи.
Общий порядок принятия решений
sequenceDiagram
participant Смарт-контракт/Член совета
participant Платформа
participant Члены совета
participant Председатель
participant Блокчейн
participant Реестр
Смарт-контракт/Член совета ->> Платформа: Формирует предложение (стандартизированное/свободное)
Платформа ->> Члены совета: Выставляет на голосование (48 часов)
loop В течение 48 часов
Члены совета ->> Платформа: Голосуют (ЗА / ПРОТИВ / Воздержался)
end
alt Проголосовало 50%+ ЗА
Платформа ->> Председатель: Генерация протокола
Председатель ->> Платформа: Подписывает протокол
Платформа ->> Блокчейн: Фиксирует решение
alt Решение стандартизированное
Блокчейн ->> Блокчейн: Исполняет решение (изменение статусов, балансов и т. д.)
end
Блокчейн ->> Реестр: Записывает в реестр решений
else Решение не принято
Платформа ->> Платформа: Вопрос снимается с повестки
end
I. В смарт-контракт совета поступает стандартизированное
или свободное
предложение на повестку дня для голосования совета.
Стандартизированные
предложения поступают от кооперативных смарт-контрактов, которые каждый согласно своей бизнес-логике подразумевают необходимость решения совета на каком-либо этапе своего исполнения. Например, стандартизированное
предложение на повестку о приёме пайщика возникает сразу после получения оплаты вступительного взноса, и никак иначе.
Исполнение стандартизированных
решений приводит к появлению эффектов, например, таких как "изменение баланса лицевого счёта", или "изменение статуса пайщика", которые фиксируются в блокчейне согласно бизнес-логике смарт-контрактов Кооперативной Экономики.
Свободные
предложения и проекты решения по ним формируются членами совета вручную. Они не предлагаются автоматически и решения по ним не приводят к эффектам в блокчейне.
II. Члены совета голосуют ЗА, ПРОТИВ, или воздерживаются от голосования по вопросу.
Каждый вопрос на повестке - это отдельное собрание совета, решение которого фиксируется отдельным протоколом. Один вопрос - один протокол. За один день может быть проведено неограниченное количество собраний совета и получено неограниченное количество протоколов решений.
Решение по вопросу необходимо принять за 48 часов. Решение считается принятым, если ЗА него проголосовало 50% членов совета. По истечению 48 часов, если решение не принято, вопрос с повестки снимается автоматически.
III. Принятое решение утверждается председателем совета.
Если совет кооператива принял положительное решение, то оно должно быть утверждено простой электронной подписью председателя совета на протоколе.
Протоколы формируются полностью автоматически на основе информации о пайщике, совершаемом им стандартизированном
действии (если такое есть), о членах совета, и информации о их голосовании по вопросу. На основе всей этой информации система автоматически генерирует по запросу председателя протокол собрания совета.
Председатель подписывает сгенерированный протокол собрания совета своей электронной подписью, и отправляет его в блокчейн, тем самым, утверждая и исполняя принятое решение.
Свободные
решения принимаются идентично стандартизированным
, однако вопрос на голосование и предлагаемое решение формируется членом совета через заполнение двух полей: предлагаемый вопрос на повестку
и предлагаемое решение
. На основе этих данных формируется цифровой документ предложения повестки дня, которая используется при формировании протокола принятого решения.
IV. Все принятые решения фиксируются в реестре.
Все принятые решения фиксируются в реестре. Подробнее о реестре документов смотри раздел Документы.
Просмотреть повестку¶
🛠️ SDK: Queries.Agenda.GetAgenda | 🔗 GraphQL API: Mutation.getAgenda
Получить список вопросов совета кооператива для голосования
import { Queries } from '@coopenomics/sdk';
const variables = {
};
const { [Queries.Agenda.GetAgenda.name]: result } = await client.Query(
Queries.Agenda.GetAgenda.query,
{ variables }
);
В результате исполнения запроса будет возвращён массив пакетов документов, каждый из которых содержит информацию о состоянии голосования по вопросу, о членах совета, их персональных данных и подписах, которые они оставили, а также о пайщике, который является участником юридического действия, и его личных данных.
Выполнение запроса доступно только для членов совета. Подробнее о содержании пакета документов смотри раздел Документы.
Проголосовать за решение¶
⚠️ 🛠️ SDK: Mutations.Decisions.VoteFor не найден | 🔗 GraphQL API: Mutation.voteFor
⚠️ Описание для Mutations.Decisions.VoteFor
не найдено
⚠️ Mutations.Decisions.VoteFor
не найден
Проголосовать против решения¶
⚠️ 🛠️ SDK: Mutations.Decisions.VoteAgainst не найден | 🔗 GraphQL API: Mutation.voteAgainst
⚠️ Описание для Mutations.Decisions.VoteAgainst
не найдено
⚠️ Mutations.Decisions.VoteAgainst
не найден
Воздержаться от голосования¶
Для того, чтобы члену совета воздержаться от голосования, достаточно не голосовать ЗА или ПРОТИВ решения в течение 48 часов. Специального действия для воздержания не предусмотрено.
Утвердить решение¶
⚠️ 🛠️ SDK: Mutations.Decisions.Authorize не найден | 🔗 GraphQL API: Mutation.authorize
⚠️ Описание для Mutations.Decisions.Authorize
не найдено
⚠️ Mutations.Decisions.Authorize
не найден
Исполнить решение¶
⚠️ 🛠️ SDK: Mutations.Decisions.Exec не найден | 🔗 GraphQL API: Mutation.exec
⚠️ Описание для Mutations.Decisions.Exec
не найдено
⚠️ Mutations.Decisions.Exec
не найден
Стандартизированные решения¶
Решение о приёме пайщика¶
🛠️ SDK: Mutations.Participants.GenerateParticipantApplicationDecision | 🔗 GraphQL API: Mutation.generateParticipantApplicationDecision
Предложение на повестку формируется автоматически при регистрации пайщика на основании заполненного и подписанного заявления о вступлении в кооператив. Решение по вопросу приёма пайщика принимается советом на голосовании. После принятия положительного решения, председатель должен сформировать протокол решения собрания совета с помощью мутации:
import { Mutations } from '@coopenomics/sdk';
const variables = {
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?: {
skip_save?: <null | boolean>; // Пропустить сохранение
};
};
const { [Mutations.Participants.GenerateParticipantApplicationDecision.name]: result } = await client.Mutation(
Mutations.Participants.GenerateParticipantApplicationDecision.mutation,
{ variables }
);
Полученный с помощью этой мутации цифровой документ необходимо использовать при Утверждении решения. Не обязательные параметры в мутации выше устанавливаются автоматически и передаются только для повторной регенации документа на основе ранее полученных мета-данных.
Свободные решения¶
Процесс предложения решения на повестку состоит из трех этапов:
-
Создать предложение и сохранить его в базе MONO для дальнейшей генерации документа.
-
Сгенерировать документ повестки собрания совета.
-
Опубликовать вопрос в повестке собрания совета.
После голосования совета и принятия решения председатель вызывает метод генерации протокола свободного решения и использует его для утверждения.
Создать предложение решения¶
🛠️ SDK: Mutations.FreeDecisions.CreateProjectOfFreeDecision | 🔗 GraphQL API: Mutation.createProjectOfFreeDecision
Предложение вопроса и его решения создаётся с помощью мутации CreateProjectOfFreeDecision
, которая получает информацию о вопросе и его решении, и сохраняет для дальнейшего использования при генерации документа.
import { Mutations } from '@coopenomics/sdk';
const variables = {
data: {
decision: <string>; // Проект решения, которое предлагается принять
question: <string>; // Вопрос, который выносится на повестку
};
};
const { [Mutations.FreeDecisions.CreateProjectOfFreeDecision.name]: result } = await client.Mutation(
Mutations.FreeDecisions.CreateProjectOfFreeDecision.mutation,
{ variables }
);
Сгенерировать документ предложения решения¶
🛠️ SDK: Mutations.FreeDecisions.GenerateProjectOfFreeDecision | 🔗 GraphQL API: Mutation.generateProjectOfFreeDecision
import { Mutations } from '@coopenomics/sdk';
const variables = {
data: {
block_num?: <null | number>; // Номер блока, на котором был создан документ
coopname: <string>; // Название кооператива, связанное с документом
created_at?: <null | string>; // Дата и время создания документа
generator?: <null | string>; // Имя генератора, использованного для создания документа
lang?: <null | string>; // Язык документа
links?: <null | string[]>; // Ссылки, связанные с документом
project_id: <string>; // Идентификатор проекта решения
timezone?: <null | string>; // Часовой пояс, в котором был создан документ
title?: <null | string>; // Название документа
username: <string>; // Имя пользователя, создавшего документ
version?: <null | string>; // Версия генератора, использованного для создания документа
};
options?: {
skip_save?: <null | boolean>; // Пропустить сохранение
};
};
const { [Mutations.FreeDecisions.GenerateProjectOfFreeDecision.name]: result } = await client.Mutation(
Mutations.FreeDecisions.GenerateProjectOfFreeDecision.mutation,
{ variables }
);
Опубликовать документ повестки с предложением¶
🛠️ SDK: Mutations.FreeDecisions.PublishProjectOfFreeDecision | 🔗 GraphQL API: Mutation.publishProjectOfFreeDecision
Предложение повестки дня публикуется в смарт-контракте с помощью мутации PublishProjectOfFreeDecision
. Сразу после публикации повестки совет может приступать к голосованию.
import { Mutations } from '@coopenomics/sdk';
const variables = {
data: {
coopname: <string>; // Имя аккаунта кооператива
document: {
hash: <string>; // Хэш документа
meta: {
block_num: <number>; // Номер блока, на котором был создан документ
coopname: <string>; // Название кооператива, связанное с документом
created_at: <string>; // Дата и время создания документа
generator: <string>; // Имя генератора, использованного для создания документа
lang: <string>; // Язык документа
links: <string[]>; // Ссылки, связанные с документом
project_id: <string>; // Идентификатор проекта решения
registry_id: <number>; // ID документа в реестре
timezone: <string>; // Часовой пояс, в котором был создан документ
title: <string>; // Название документа
username: <string>; // Имя пользователя, создавшего документ
version: <string>; // Версия генератора, использованного для создания документа
};
public_key: <string>; // Публичный ключ документа
signature: <string>; // Подпись документа
};
meta: <string>; // Строка мета-информации
username: <string>; // Имя аккаунта пользователя
};
};
const { [Mutations.FreeDecisions.PublishProjectOfFreeDecision.name]: result } = await client.Mutation(
Mutations.FreeDecisions.PublishProjectOfFreeDecision.mutation,
{ variables }
);
Сгенерировать протокол свободного решения по предложению¶
🛠️ SDK: Mutations.FreeDecisions.GenerateFreeDecision | 🔗 GraphQL API: Mutation.generateFreeDecision
Протокол свободного решения генерируется на основании принятого решения, а также документа с предложением, которое было опубликовано членом совета. После генерации протокола свободного решения председатель должен утвердить его для фиксации в реестре Документов.
import { Mutations } from '@coopenomics/sdk';
const variables = {
data: {
block_num?: <null | number>; // Номер блока, на котором был создан документ
coopname: <string>; // Название кооператива, связанное с документом
created_at?: <null | string>; // Дата и время создания документа
decision_id: <number>; // Идентификатор протокола решения собрания совета
generator?: <null | string>; // Имя генератора, использованного для создания документа
lang?: <null | string>; // Язык документа
links?: <null | string[]>; // Ссылки, связанные с документом
project_id: <string>; // Идентификатор проекта решения
timezone?: <null | string>; // Часовой пояс, в котором был создан документ
title?: <null | string>; // Название документа
username: <string>; // Имя пользователя, создавшего документ
version?: <null | string>; // Версия генератора, использованного для создания документа
};
options?: {
skip_save?: <null | boolean>; // Пропустить сохранение
};
};
const { [Mutations.FreeDecisions.GenerateFreeDecision.name]: result } = await client.Mutation(
Mutations.FreeDecisions.GenerateFreeDecision.mutation,
{ variables }
);
Результат исполнения:
interface IOutput {
generateFreeDecision: {
binary: <string>; // Бинарное содержимое документа (base64)
full_title: <string>; // Полное название документа
hash: <string>; // Хэш документа
html: <string>; // HTML содержимое документа
meta: {
block_num: <number>; // Номер блока, на котором был создан документ
coopname: <string>; // Название кооператива, связанное с документом
created_at: <string>; // Дата и время создания документа
decision_id: <unknown>;
generator: <string>; // Имя генератора, использованного для создания документа
lang: <ru>; // Язык документа
links: <string[]>; // Ссылки, связанные с документом
project_id: <string>; // Идентификатор проекта решения
registry_id: <number>; // ID документа в реестре
timezone: <string>; // Часовой пояс, в котором был создан документ
title: <string>; // Название документа
username: <string>; // Имя пользователя, создавшего документ
version: <string>; // Версия генератора, использованного для создания документа
};
};
}