development part
This commit is contained in:
@@ -0,0 +1,5 @@
|
||||
BASE_PATH=~/dacom-code/foundation
|
||||
DOCS_PATH=~/dacom-code/foundation/docsdocsdocs/mono/site
|
||||
SDK_PATH=/Users/darksun/dacom-code/foundation/monocoop/components/coopjs/docs
|
||||
START_PATH=~/dacom-code/foundation/docsdocsdocs/mono/docs
|
||||
|
||||
Binary file not shown.
Vendored
BIN
Binary file not shown.
@@ -0,0 +1,123 @@
|
||||
Аккаунт в MONO - это составной объект с информацией о пользователе. Он составляется из информации, которая описывает состояние пользователя на разных уровнях работы платформы с идентификацией по имени пользователя - username.
|
||||
|
||||
Username — это уникальный идентификатор пользователя в системе. Он состоит из 12 латинских букв без пробелов и специальных символов. С помощью него производится сквозная идентификация принадлежности аккаунта к пользователю во всех кооперативных системах платформы.
|
||||
|
||||
## Объект аккаунта
|
||||
У каждого аккаунта есть 4 уровня хранения информации, их удобно проследить по объекту {{ get_graphql_definition("Account") }} в GraphQL-API:
|
||||
|
||||
|
||||
{{ get_graphql_definition("BlockchainAccount") }} - объект аккаунта в блокчейне содержит системную информацию, такую как публичные ключи доступа, доступные вычислительные ресурсы, информация об установленном смарт-контракте, и т.д. и т.п. Это системный уровень обслуживания, где у каждого пайщика есть аккаунт, но не каждый аккаунт может быть пайщиком в каком-либо кооперативе. Все смарт-контракты устанавливаются и исполняются на этом уровне.
|
||||
|
||||
{{ get_graphql_definition("UserAccount") }} - объект пользователя кооперативной экономики содержит в блокчейне информацию о типе аккаунта пайщика, а также, обезличенные публичные данные (хэши) для верификации пайщиков между кооперативами. Этот уровень предназначен для хранения информации пайщика, которая необходима всем кооперативам, но не относится к какому-либо из них конкретно.
|
||||
|
||||
{{ get_graphql_definition("ParticipantAccount") }} - объект пайщика кооператива в таблице блокчейне, который определяет членство пайщика в конкретном кооперативе. Поскольку MONO обслуживает только один кооператив, то в participant_account обычно содержится информация, которая описывает членство пайщика в этом кооперативе. Этот объект обезличен, публичен, и хранится в блокчейне.
|
||||
|
||||
{{ get_graphql_definition("ProviderAccount") }} - объект аккаунта в системе учёта провайдера, т.е. MONO. Здесь хранится приватная информация о пайщике кооператива, которая содержит его приватные данные. Эти данные не публикуются в блокчейне и не выходят за пределы базы данных провайдера. Они используются для заполнения шаблонов документов при нажатии соответствующих кнопок на платформе. Также, эта информация используется провайдером для организации входа пользователя в систему по наличию соответстветсвия между email и username в его базе данных и блокчейне ([подробнее](/documentation/auth/#about-auth))
|
||||
|
||||
<a id="register-account"></a>
|
||||
## Зарегистрировать аккаунт
|
||||
{{ get_sdk_doc("Mutations", "Accounts", "RegisterAccount") }} | {{ get_graphql_doc("Mutation.registerAccount") }}
|
||||
|
||||
Вызов мутации регистрации аккаунта создаёт объект аккаунта в системе учета провайдера. После вызова, пользователь получает возможность входа в систему на основании предоставленного при регистрации публичного ключа и адреса электронной почты.
|
||||
|
||||
|
||||
!!! note ""
|
||||
Успешный вызов мутации НЕ означает, что пользователь становится пайщиком и получает блокчейн-аккаунт. При вызове мутации пользователь получает только объект {{ get_graphql_definition("ProviderAccount") }}, а для его перехода в пайщики необходимо пройти дополнительный путь, описанный в разделе [Регистрация Пайщика](/documentation/participants).
|
||||
|
||||
{{ get_typedoc_desc("Mutations.Accounts.RegisterAccount") }}
|
||||
|
||||
|
||||
Регистрация аккаунта производится мутацией RegisterAccount, где в качестве переменных принимаются данные пользователя одного из трех типов, определяемых в перечислении AccountType: Individual (физическое лицо), Organization (юридическое лицо) или Entrepreneur (индивидуальный предприниматель).
|
||||
|
||||
При указании типа пользователя Individual необходимо передать объект individual_data с данными физлица, при регистрации Organization - ожидается обязательная передача organization_data, при указании типа Entrepreneur - entrepreneur_data.
|
||||
|
||||
Имя пользователя username и публичный ключ public_key генерируются вызовом метода generateAccount из SDK:
|
||||
|
||||
```typescript
|
||||
|
||||
import {generateAccount} from '@coopenomics/sdk'
|
||||
|
||||
const account = generateAccount()
|
||||
|
||||
```
|
||||
|
||||
В объекте account после генерации аккаунта содержится имя пользователя, приватный и публичный ключ. Сгенерированный приватный ключ из объекта аккаунта будет требоваться для входа в систему после регистрации.
|
||||
|
||||
```typescript
|
||||
|
||||
// console.log(account)
|
||||
{
|
||||
name: "abcd1234wxyz",
|
||||
privateKey: "5JxyzABC1234567890defGHIJKLMNopqRSTUV",
|
||||
publicKey: "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5SozEZ8i8jUBS6yX79y6"
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
Используя сгенерированный объект аккаунта с ключами, проводим регистрацию в системе учёта провайдера:
|
||||
|
||||
{{ get_typedoc_input("Mutations.Accounts.RegisterAccount") }}
|
||||
|
||||
|
||||
По-умолчанию, каждый пайщик регистрирует новый аккаунт в том кооперативе, в который вступает. Кооператив, при этом, самостоятельно управляет процессом восстановления ключей доступа, в случае их утери.
|
||||
|
||||
<a id="get-account"></a>
|
||||
## Извлечь аккаунт
|
||||
{{ get_sdk_doc("Queries", "Accounts", "GetAccount") }} | {{ get_graphql_doc("Query.getAccount") }}
|
||||
|
||||
Запрос извлечения объекта аккаунта по username. Может быть выполнен председателем или членом совета на любой аккаунт, или пользователем, с собственным username. Если запрос совершает пользователь, то он должен предоставить свой username, который совпадёт с тем именем аккаунта, которое будет извлечено из JWT на бэкенде.
|
||||
|
||||
Аккаунты извлекаются по именам пользователей с помощью запроса GetAccount. В случае, если у username нет какого-либо уровня аккаунта из представленных выше, то он будет возвращен, тогда как все остальные, которые есть - будут.
|
||||
|
||||
<!-- {{ get_typedoc_desc("Queries.Accounts.GetAccount") }} -->
|
||||
|
||||
{{ get_typedoc_input("Queries.Accounts.GetAccount") }}
|
||||
|
||||
<a id="get-accounts"></a>
|
||||
## Извлечь лист аккаунтов
|
||||
{{ get_sdk_doc("Queries", "Accounts", "GetAccounts") }} | {{ get_graphql_doc("Query.getAccounts") }}
|
||||
|
||||
{{ get_typedoc_desc("Queries.Accounts.GetAccounts") }}
|
||||
|
||||
{{ get_typedoc_input("Queries.Accounts.GetAccounts") }}
|
||||
|
||||
Результат будет представлен в виде объекта с массивом items, где каждый элемент массива - это составной объект аккаунта.
|
||||
|
||||
<a id="update-account"></a>
|
||||
## Обновить аккаунт
|
||||
{{ get_sdk_doc("Mutations", "Accounts", "UpdateAccount") }} | {{ get_graphql_doc("Mutation.updateAccount") }}
|
||||
|
||||
{{ get_typedoc_desc("Mutations.Accounts.UpdateAccount") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.Accounts.UpdateAccount") }}
|
||||
|
||||
Обновление персональных данных в базе MONO производится добавлением нового объекта с указанием последнего необратимого блока в блокчейне, что позволяет использовать исторические данные для сверки и восстановления документов. Вся история изменений данных аккаунтов сохраняется.
|
||||
|
||||
|
||||
<a id="reset-key"></a>
|
||||
## Восстановить доступ к аккаунту
|
||||
В случае утери ключи, доступ к аккаунту возможно восстановить только с помощью его замены в блокчейне. Для этого, необходимо последовательно применить две мутации: StartResetKey и ResetKey.
|
||||
|
||||
### Получить токен для замены
|
||||
{{ get_sdk_doc("Mutations", "Accounts", "StartResetKey") }} | {{ get_graphql_doc("Mutation.startResetKey") }}
|
||||
|
||||
{{ get_typedoc_desc("Mutations.Accounts.UpdateAccount") }}
|
||||
|
||||
|
||||
### Заменить ключ
|
||||
{{ get_sdk_doc("Mutations", "Accounts", "ResetKey") }} | {{ get_graphql_doc("Mutation.resetKey") }}
|
||||
|
||||
{{ get_typedoc_desc("Mutations.Accounts.ResetKey") }}
|
||||
|
||||
|
||||
|
||||
<!-- ## Удалить аккаунт
|
||||
{{ get_sdk_doc("Mutations", "Accounts", "RegisterAccount") }} | {{ get_graphql_doc("Mutation.registerAccount") }}
|
||||
|
||||
{{ get_typedoc_desc("Mutations.Accounts.DeleteAccount") }}
|
||||
-->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
Соглашение - это цифровой документ, подтверждающий согласие пайщика с условиями участия.
|
||||
|
||||
Соглашения между пайщиком и кооперативом фиксируются в блокчейне с учётом их версий. При обновлении шаблона соглашения в блокчейне - пайщику будет необходимо обновить свою подпись на соглашении.
|
||||
|
||||
Подробнее о параметрах генерации цифровых документов смотри в разделе [Документы](/documentation/documents)
|
||||
|
||||
## Соглашение о ЦПП "Цифровой Кошелёк"
|
||||
{{ get_sdk_doc("Mutations", "Agreements", "GenerateWalletAgreement") }} | {{ get_graphql_doc("Mutation.generateWalletAgreement") }}
|
||||
|
||||
Соглашение описывает условия участия в целевой потребительской программе "Цифровой Кошелёк", участие в которой предоставляет пайщику возможность совершать паевые взносы в цифровой среде платформы "Кооперативной Экономики".
|
||||
|
||||
{{ get_typedoc_desc("Mutations.Agreements.GenerateWalletAgreement") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.Agreements.GenerateWalletAgreement") }}
|
||||
|
||||
|
||||
|
||||
## Согласие с политикой конфиденциальности
|
||||
{{ get_sdk_doc("Mutations", "Agreements", "GeneratePrivacyAgreement") }} | {{ get_graphql_doc("Mutation.generatePrivacyAgreement") }}
|
||||
|
||||
{{ get_typedoc_desc("Mutations.Agreements.GeneratePrivacyAgreement") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.Agreements.GeneratePrivacyAgreement") }}
|
||||
|
||||
|
||||
|
||||
## Соглашение о простой электронной подписи
|
||||
{{ get_sdk_doc("Mutations", "Agreements", "GenerateSignatureAgreement") }} | {{ get_graphql_doc("Mutation.generateSignatureAgreement") }}
|
||||
|
||||
{{ get_typedoc_desc("Mutations.Agreements.GenerateSignatureAgreement") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.Agreements.GenerateSignatureAgreement") }}
|
||||
|
||||
|
||||
|
||||
## Пользовательское соглашение
|
||||
{{ get_sdk_doc("Mutations", "Agreements", "GenerateUserAgreement") }} | {{ get_graphql_doc("Mutation.generateUserAgreement") }}
|
||||
|
||||
{{ get_typedoc_desc("Mutations.Agreements.GenerateUserAgreement") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.Agreements.GenerateUserAgreement") }}
|
||||
|
||||
|
||||
## Отправить соглашение
|
||||
|
||||
{{ get_sdk_doc("Mutations", "Agreements", "SendAgreement") }} | {{ get_graphql_doc("Mutation.sendAgreement") }}
|
||||
|
||||
{{ get_typedoc_desc("Mutations.Agreements.SendAgreement") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.Agreements.SendAgreement") }}
|
||||
|
||||
|
||||
@@ -0,0 +1,152 @@
|
||||
Аудентификация в системе производится посредством проверки цифровой подписи пайщика на метке времени в часов поясе UTC. Метка времени представляет собой текущую дату в формате ISO 8601, которая переведена в строку. Полученная строка подписывается приватным ключом доступа пайщика. Подпись, вместе с меткой времени и электронной почтой пайщика отправляется на бэкенд MONO для проверки.
|
||||
|
||||
Проверка осуществляется путём восстановления из цифровой подписи метки времени - публичного ключа от аккаунта пайщика, с дальнейшей его сверкой с тем ключом, который достоверно принадлежит пайщику и хранится в блокчейне. Если сверка ключей проходит успешно, то бэкенд возвращает JWT для дальнейшего быстрого доступа пайщика к системе. Приватный ключ пайщика, при этом, в MONO никогда не передаётся.
|
||||
|
||||
## Контроль ролей
|
||||
Контроль прав доступа производится с помощью ролей (RBAC - role based access controll). В системе используются три роли: председатель (chairman), член совета (member) и пайщик (user). Все роли хранятся в блокчейне в таблице совета. MONO не управляет ролями напрямую, а только проверяет их с помощью публичной информации, которая содержится в таблицах смарт-контрактов блокчейна.
|
||||
|
||||
|
||||
## Простой вход
|
||||
Для упрощения работы с MONO, в SDK-клиенте есть метод login, который обеспечивает простой вход:
|
||||
|
||||
```typescript
|
||||
const client = createClient({
|
||||
baseUrl: "http://127.0.0.1:2998/v1/graphql",
|
||||
blockchainUrl: "http://127.0.0.1:8888",
|
||||
chainId: "f50256680336ee6daaeee93915b945c1166b5dfc98977adcb717403ae225c559",
|
||||
});
|
||||
|
||||
const wif = 'приватный_ключ'
|
||||
|
||||
const result = await client.login(wif)
|
||||
|
||||
```
|
||||
В результате будет получена пара ключей доступа и объект аккаунта. Токен доступа будет установлен в клиенте автоматически, и теперь клиент может использоваться для вызова запросов, мутаций или подписок в MONO, которые требуют аудентификации.
|
||||
|
||||
!!!note ""
|
||||
При использовании метода login из sdk, произойдет вычисление цифровой подписи на метке времени, вызов мутации Login, установка полученных JWT-токенов и приватного ключа `wif` в SDK-клиенте для дальнейшего использования.
|
||||
|
||||
!!!warning "ВАЖНО"
|
||||
SDK-клиент __НЕ__ обеспечивает постоянное хранение JWT-токенов и приватного ключа в себе. Организация постоянного хранения реализуется сторонними средствами.
|
||||
|
||||
|
||||
<a id="about-auth"></a>
|
||||
## Подробно о входе
|
||||
{{ get_sdk_doc("Mutations", "Auth", "Login") }} | {{ get_graphql_doc("Mutation.login") }}
|
||||
|
||||
Под капотом метода login в sdk-client выполняется серия операций, которая обеспечивает вход в систему на основании цифровой подписи метки времени без передачи ключа на сервер.
|
||||
|
||||
Для входа необходимо воспользоваться методом Login в GraphQL, предварительно подготовив подпись на метке времени с помощью пакета @wharfkit/session или любого аналогичного.
|
||||
|
||||
Устанавливаем пакет @wharfkit, если требуется:
|
||||
|
||||
```bash
|
||||
pnpm install @wharfkit/session
|
||||
```
|
||||
|
||||
Готовим метку времени и подпись:
|
||||
```typescript
|
||||
import { Bytes, Checksum256, PrivateKey } from '@wharfkit/session';
|
||||
|
||||
//извлекаем текущую метку времени
|
||||
const now = new Date().toISOString();
|
||||
//создаём объект приватного ключа из строки с ключом
|
||||
const privateKey = PrivateKey.fromString(wif)
|
||||
//преобразуем строку с меткой времени в байты
|
||||
const bytes = Bytes.fromString(now, 'utf8')
|
||||
//хэшируем байты
|
||||
const checksum = Checksum256.hash(bytes)
|
||||
//подписываем байты
|
||||
const signature = privateKey.signDigest(checksum)
|
||||
```
|
||||
|
||||
После подготовки метки времени now и подписи signature, мы можем воспользоваться мутацией Login в SDK для получения JWT-токенов в MONO:
|
||||
|
||||
```typescript
|
||||
import { Mutations } from "@coopenomics/sdk";
|
||||
|
||||
const variables: Mutations.Auth.Login.IInput = {
|
||||
data: {
|
||||
"email": "email_пайщика",
|
||||
now,
|
||||
signature
|
||||
}
|
||||
}
|
||||
|
||||
const { [Mutations.Auth.Login.name]: result } = await client.Mutation(
|
||||
Mutations.Auth.Login.mutation,
|
||||
{
|
||||
variables,
|
||||
}
|
||||
);
|
||||
|
||||
```
|
||||
В результате успешного выполнения мутации мы получим объект с информацией о пользователе и парой JWT-ключей. Для аудентификации вызовов методов необходимо установить access-ключ в SDK-клиент, воспользовававшись методом setToken на клиенте.
|
||||
|
||||
```typescript
|
||||
client.setToken(result.auth.tokens.access.token)
|
||||
```
|
||||
|
||||
После установки токена все запросы через SDK-клиент будут аудентифицированы с ролью пользователя. Фактически аудентификация производится путём установки заголовка authorization: Bearer <access_token> во все последующие запросы к MONO.
|
||||
|
||||
|
||||
Кроме того, для осуществления подписей документов, необходимо установить приватный ключ `wif` в sdk-клиент:
|
||||
|
||||
```typescript
|
||||
const wif = <приватный_ключ>
|
||||
client.setWif(wif)
|
||||
```
|
||||
|
||||
Таким образом, для аудентификации пользователя в системе используется JWT, а для подписей документов приватный ключ `wif`, управление которыми осуществляет SDK.
|
||||
|
||||
|
||||
### Сверка ключей
|
||||
MONO, получая объект с электронной почтой, проверяет - а есть ли в его внутренней системе учёта пользователь, который зарегистрирован под этой почтой. Если пользователь найден, то найдено и его имя аккаунта, под которым он зарегистрирован в блокчейне. По имени аккаунта извлекается объект пользователя из блокчейна со всеми наборами его публичных ключей.
|
||||
|
||||
Далее, происходит восстановление публичного ключа из подписи, которая оставлена на метке времени и передана в MONO. Если восстановление публичного ключа удалось успешно произвести, то производится сверка полученного публичного ключа с тем, который сохранён в блокчейне.
|
||||
|
||||
После успешной сверки ключей проверяется метка времени. Если метка старше, чем 10 секунд, запрос на вход будет отклонён. Если же все проверки пройдены, то MONO создаёт JWT-токены и возвращает их вместе с объектом аккаунта. Вход - успешен!
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant User as Пользователь
|
||||
participant MONO as MONO
|
||||
participant Blockchain as Блокчейн
|
||||
|
||||
User->>MONO: Отправляет объект с email и подписью
|
||||
MONO->>MONO: Проверяет, есть ли пользователь в системе по email
|
||||
MONO->>Blockchain: Запрашивает объект пользователя и его публичные ключи
|
||||
Blockchain-->>MONO: Возвращает публичные ключи
|
||||
|
||||
MONO->>MONO: Восстанавливает публичный ключ из подписи
|
||||
MONO->>MONO: Сверяет полученный ключ с ключом в блокчейне
|
||||
MONO->>MONO: Проверяет метку времени
|
||||
|
||||
MONO->>MONO: Создаёт JWT-токены
|
||||
MONO-->>User: Возвращает JWT и объект аккаунта
|
||||
|
||||
|
||||
```
|
||||
|
||||
### Сверка ролей
|
||||
Для проведения сверки ролей используется таблица __boards__ контракта __soviet__ кооператива, в которой представлены все члены совета с именами их аккаунтов и ролей. При изменении содержания таблицы в блокчейне, MONO изменяет роль пользователя в своей базе данных. Напрямую методов для изменения ролей пользователей MONO не предоставляет. Роли пользователей изменяются только таблицей __boards__ в контракте __soviet__ на основании состояния состава совета.
|
||||
|
||||
В процессе сверки JWT токена MONO извлекает из базы данных объект аккаунта пользователя, в котором указана роль. Если эта роль присутствует в списке разрешенных ролей для выполнения запроса, мутации или подписки, то действие будет разрешено. Если роль отсутствует, то MONO вернёт ошибку с 401 кодом - Unauthorized.
|
||||
|
||||
Исключением для этого правила проверки ролей является наличие поля username в параметрах запроса, которое совпадает с именем пользователя, которое будет извлечено из JWT. Это означает, что зарегистрированный пользователь, у которого есть JWT-токен, может использовать его для запросов, подписок или мутаций, связанных с его собственным аккаунтом.
|
||||
|
||||
Например, если запрос getAccount требует роли члена совета или председателя для выполнения, то только они и могут извлечь объект аккаунта любого пользователя в системе. Однако, каждый пользователь может извлечь свой собственный объект аккаунта в обход проверки ролей, т.к. это его собственные данные, и для этого, ему необходимо передать username, который совпадает с тем, под которым он авторизован в системе.
|
||||
|
||||
|
||||
## Обновление токенов
|
||||
{{ get_sdk_doc("Mutations", "Auth", "Refresh") }} | {{ get_graphql_doc("Mutation.refresh") }}
|
||||
|
||||
У JWT-токена типа access ограниченное время жизни, которое необходимо продлевать с помощью вызова метода Refresh и передачи токена для обновления.
|
||||
|
||||
{{ get_typedoc_input("Mutations.Auth.Refresh") }}
|
||||
|
||||
## Выход из системы
|
||||
{{ get_sdk_doc("Mutations", "Auth", "Logout") }} | {{ get_graphql_doc("Mutation.logout") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.Auth.Logout") }}
|
||||
|
||||
@@ -0,0 +1,113 @@
|
||||
Кооперативный участок — это структурное подразделение кооператива, объединяющее пайщиков на основе географического или функционального признака. Он имеет председателя, который управляет участком, а также может иметь отдельные внутренние правила, активы и обязательства в рамках общей кооперативной структуры. Кооперативный участок действует в соответствии с уставом кооператива, но может обладать автономией в операционной деятельности, обеспечивая локальное самоуправление.
|
||||
|
||||
Кооперативный участок может функцонионировать как пункт выдачи заказов, где председатель или его доверенные лица принимают и отпускают имущество по доверенности от председателя кооператива. Кооперативным участкам автоматически доступны все [целевые потребительские программы кооператива](/documentation/programs).
|
||||
|
||||
На текущий момент образование кооперативных участков юридически производится за пределами платформы MONO и [Кооперативной Экономики](https://coopenomics.world). Это связано с тем, что логика кооперативных смарт-контрактов, отвечающая за корректную организацию кооперативного участка еще не реализована.
|
||||
|
||||
Однако, платформа сегодня позволяет добавлять кооперативные участки, организованные за её пределами, и использовать их как пункты выдачи заказов или для других целей, например, для распределения пайщиков при переходе на мажоритарную систему голосования.
|
||||
|
||||
Когда в кооперативе на платформе образовано больше 3 кооперативных участков, то он автоматически переходит на двухэтапную (мажоритарную) систему проведения общих собраний. Принцип работы мажоритарной системы голосования на общих собраниях подробно рассматривается на страницах методологии [Кооперативной Экономики](https://coopenomics.world).
|
||||
|
||||
При переходе на мажоритарную систему голосования, каждому пайщику необходимо выбрать кооперативный участок. Выяснить, выбрал ли пайщик кооперативный участок можно с помощью запроса [получения аккаунта](/documentation/accounts/#get-account), где в объекте `ParticipantAccount` в строке `braname` должно быть задано имя кооперативного участка. Если кооператив мажоритарен, а `braname` у пайщика не задан, то для него будет ограничена возможность участия в общих собраниях.
|
||||
|
||||
Выяснить, мажоритарен ли кооператив, возможно получением объекта [системной информации](/documentation/system), где в объекте `CooperativeOperatorAccount` в строке `is_branched` указано является ли кооператив мажоритарным. Данную опцию необходимо уточнять в процессе [регистрации пайщика](documentation/participants/#register-participant), т.к. после перехода на мажоритарную систему управления система будет требовать установки кооперативного участка сразу при регистрации.
|
||||
|
||||
Добавление кооперативных участков осуществляется на основании документа, подтверждающего их организацию, председателем совета. Председатель совета может удалить или отредактировать кооперативный участок, изменить председателя кооперативного участка и назначать/снимать доверенных лиц кооперативного участка (не больше 3), которые будут иметь возможность подписывать документы о приёме-выдачи имущества на кооперативном участке наравне с председателем кооперативного участка.
|
||||
|
||||
!!!note ""
|
||||
После реализации кооперативных смарт-контрактов, отвечающих за полное управление кооперативными участками, многие из методов на этой страницы будут заменены.
|
||||
|
||||
|
||||
## Получить список кооперативных участков
|
||||
|
||||
{{ get_sdk_doc("Queries", "Branches", "GetBranches") }} | {{ get_graphql_doc("Query.getBranches") }}
|
||||
|
||||
Поля `trusted` и `trustee` содержат персональную о председателе кооператива и его доверенных лицах, и могут быть получены только председателем кооператива или членом совета. Пользователи с ролью `User` при запросе этих полей получат ошибку 401 `Unathorized`.
|
||||
|
||||
{{ get_typedoc_input("Queries.Branches.GetBranches") }}
|
||||
|
||||
|
||||
Запрос {{ get_sdk_doc("Queries", "Branches", "GetPublicBranches") }} позволяет отдельно запрашивать только публичную информацию о кооперативных участках и она может использоваться пользователями с ролью User, в то время как запрос {{ get_sdk_doc("Queries", "Branches", "GetBranches") }} получает подробную информацию о председателе кооперативного участка и доверенных им лицах, и может быть использован только лицами, обладающими для этого достаточными правами доступа.
|
||||
|
||||
Результат:
|
||||
|
||||
{{ get_typedoc_definition("Queries.Branches.GetBranches", "IOutput") }}
|
||||
|
||||
|
||||
## Добавить кооперативный участок
|
||||
{{ get_sdk_doc("Mutations", "Branches", "CreateBranch") }} | {{ get_graphql_doc("Mutation.createBranch") }}
|
||||
|
||||
|
||||
{{ get_typedoc_input("Mutations.Branches.CreateBranch") }}
|
||||
|
||||
|
||||
Результат:
|
||||
|
||||
{{ get_typedoc_definition("Mutations.Branches.CreateBranch", "IOutput") }}
|
||||
|
||||
|
||||
## Удалить кооперативный участок
|
||||
{{ get_sdk_doc("Mutations", "Branches", "DeleteBranch") }} | {{ get_graphql_doc("Mutation.deleteBranch") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.Branches.DeleteBranch") }}
|
||||
|
||||
Результат:
|
||||
|
||||
{{ get_typedoc_definition("Mutations.Branches.DeleteBranch", "IOutput") }}
|
||||
|
||||
|
||||
|
||||
## Добавить доверенное лицо кооперативного участка
|
||||
{{ get_sdk_doc("Mutations", "Branches", "AddTrustedAccount") }} | {{ get_graphql_doc("Mutation.addTrustedAccount") }}
|
||||
|
||||
Доверенное лицо устанавливается с помощью мутации `AddTrustedAccount` с передачей имени аккаунта доверенного лица в качестве аргумента. Также, необходимо передать имя кооператива и имя кооперативного участка, в котором добавляется доверенное лицо. Вызвать мутацию может только председатель совета кооператива.
|
||||
|
||||
{{ get_typedoc_input("Mutations.Branches.AddTrustedAccount") }}
|
||||
|
||||
Результат:
|
||||
|
||||
{{ get_typedoc_definition("Mutations.Branches.AddTrustedAccount", "IOutput") }}
|
||||
|
||||
|
||||
## Удалить доверенное лицо кооперативного участка
|
||||
{{ get_sdk_doc("Mutations", "Branches", "DeleteTrustedAccount") }} | {{ get_graphql_doc("Mutation.deleteTrustedAccount") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.Branches.DeleteTrustedAccount") }}
|
||||
|
||||
Результат:
|
||||
|
||||
{{ get_typedoc_definition("Mutations.Branches.DeleteTrustedAccount", "IOutput") }}
|
||||
|
||||
|
||||
|
||||
|
||||
## Изменить кооперативный участок
|
||||
{{ get_sdk_doc("Mutations", "Branches", "EditBranch") }} | {{ get_graphql_doc("Mutation.editBranch") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.Branches.EditBranch") }}
|
||||
|
||||
Результат:
|
||||
|
||||
{{ get_typedoc_definition("Mutations.Branches.EditBranch", "IOutput") }}
|
||||
|
||||
|
||||
## Сгенерировать документ, подтверждающий выбор кооперативного участка
|
||||
{{ get_sdk_doc("Mutations", "Branches", "GenerateSelectBranchDocument") }} | {{ get_graphql_doc("Mutation.generateSelectBranchDocument") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.Branches.GenerateSelectBranchDocument") }}
|
||||
|
||||
Результат:
|
||||
|
||||
{{ get_typedoc_definition("Mutations.Branches.GenerateSelectBranchDocument", "IOutput") }}
|
||||
|
||||
|
||||
## Выбрать кооперативный участок
|
||||
{{ get_sdk_doc("Mutations", "Branches", "SelectBranch") }} | {{ get_graphql_doc("Mutation.selectBranch") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.Branches.SelectBranch") }}
|
||||
|
||||
Результат:
|
||||
|
||||
{{ get_typedoc_definition("Mutations.Branches.SelectBranch", "IOutput") }}
|
||||
|
||||
|
||||
@@ -0,0 +1,213 @@
|
||||
Для работы с MONO вам необходимо обладать ключом доступа к аккаунту кооператива, который заключил соглашение с оператором платформы на подключение к "Кооперативной Экономике".
|
||||
|
||||
Получить ключ доступа можно пройдя регистрацию на testnet.coopenomics.world в качестве потребительского кооператива. Перейдите на сайт testnet.coopenomics.world и пройдите регистрацию, используя произвольные данные.
|
||||
|
||||
После прохождения регистрации, на этапе оплаты, дождитесь подтверждения от оператора о приёме вашего кооператива в качестве пайщика. После этого, вы попадете в личный кабинет оператора, и увидите кнопку "Подключить Кооператив".
|
||||
|
||||
Нажмите на кнопку "Подключить Кооператив", прочитайте соглашение и примите его своей цифровой подписью. После вашей подписи соглашения на подключение, оператору платформы необходимо подтвердить ваше подключение. Для ускорения процесса подтверждения напишите на почту: coopenomics@yandex.ru.
|
||||
|
||||
После получения подтверждения вы можете использовать полученный приватный ключ кооператива для инициализации вашего MONO-приложения следуя инструкциям ниже.
|
||||
|
||||
## Инициализация
|
||||
Для начала работы вашему приложению MONO необходимо сообщить информацию о том кооперативе, для которого он будет работать. Для инициализации используйте метод initSystem:
|
||||
|
||||
{{ get_sdk_doc("Mutations", "System", "InitSystem") }} | {{ get_graphql_doc("mutation.initSystem") }}
|
||||
|
||||
Пример вызова:
|
||||
|
||||
```typescript
|
||||
import { Mutations, OrganizationType } from "@coopenomics/sdk";
|
||||
|
||||
const variables: Mutations.System.InitSystem.IInput = {
|
||||
data: {
|
||||
organization_data: {
|
||||
bank_account: {
|
||||
account_number: "40703810338000220228",
|
||||
bank_name: "АО Альфа-Банк",
|
||||
currency: "RUB",
|
||||
details: {
|
||||
bik: "044525593",
|
||||
corr: "30101810200000000593",
|
||||
kpp: "770801001"
|
||||
}
|
||||
},
|
||||
city: "Санкт-Петербург",
|
||||
country: "Russia",
|
||||
details: {
|
||||
inn: "7826012345",
|
||||
kpp: "782601001",
|
||||
ogrn: "1234567890123"
|
||||
},
|
||||
fact_address: "190000, г. Санкт-Петербург, ул. Ленина, д. 5, офис 12",
|
||||
full_address: "190000, г. Санкт-Петербург, ул. Ленина, д. 5, офис 12",
|
||||
full_name: 'Потребительский Кооператив "Ромашка"',
|
||||
phone: "+78121234567",
|
||||
represented_by: {
|
||||
based_on: "Решение общего собрания №2",
|
||||
first_name: "Иван",
|
||||
last_name: "Петров",
|
||||
middle_name: "Сергеевич",
|
||||
position: "Председатель"
|
||||
},
|
||||
short_name: "ПК Ромашка",
|
||||
type: OrganizationType.COOP
|
||||
},
|
||||
vars: {
|
||||
confidential_email: "privacy@romashka-coop.ru",
|
||||
confidential_link: "romashka-coop.ru/privacy",
|
||||
contact_email: "contact@romashka-coop.ru",
|
||||
coopname: "romashka",
|
||||
full_abbr: "потребительский кооператив",
|
||||
full_abbr_dative: "потребительскому кооперативу",
|
||||
full_abbr_genitive: "потребительского кооператива",
|
||||
name: "Ромашка",
|
||||
participant_application: {
|
||||
protocol_day_month_year: "15 мая 2024 г.",
|
||||
protocol_number: "15-05-2024"
|
||||
},
|
||||
passport_request: "yes",
|
||||
privacy_agreement: {
|
||||
protocol_day_month_year: "15 мая 2024 г.",
|
||||
protocol_number: "15-05-2024"
|
||||
},
|
||||
short_abbr: "ПК",
|
||||
signature_agreement: {
|
||||
protocol_day_month_year: "15 мая 2024 г.",
|
||||
protocol_number: "15-05-2024"
|
||||
},
|
||||
user_agreement: {
|
||||
protocol_day_month_year: "15 мая 2024 г.",
|
||||
protocol_number: "15-05-2024"
|
||||
},
|
||||
wallet_agreement: {
|
||||
protocol_day_month_year: "15 мая 2024 г.",
|
||||
protocol_number: "15-05-2024"
|
||||
},
|
||||
website: "ромашка-кооп.рф"
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// вызываем метод SDK для инициализации и передаём объект с переменными
|
||||
const { [Mutations.System.InitSystem.name]: result } = await client.Mutation(
|
||||
Mutations.System.InitSystem.mutation, { variables }
|
||||
);
|
||||
|
||||
|
||||
```
|
||||
В результате успешного выполнения мутации, в хранилище приватных данных кооператива будет добавлена запись об организации, пайщиками которой будут становиться пользователи.
|
||||
|
||||
|
||||
## Установка ключа
|
||||
На бэкенде приложения MONO хранится приватный ключ кооператива, которым он совершает автоматическую оплату вычислительных ресурсов блокчейна, а также, подписывает транзакции для него. Ключ хранится в зашифрованном виде в базе данных, извлекается оттуда и расшифровывается для использования только когда это необходимо.
|
||||
|
||||
MONO для функционирования необходим приватный активный ключ от аккаунта кооператива, которым сможет выполнять основные операции в блокчейне. Чтобы предоставить ключ бэкенду MONO, необходимо выполнить операцию setWif по его добавлению:
|
||||
|
||||
{{ get_sdk_doc("Mutations", "System", "SetWif") }} | {{ get_graphql_doc("Mutation.setWif") }}
|
||||
|
||||
```typescript
|
||||
import { Mutations } from "@coopenomics/sdk";
|
||||
|
||||
const variables: Mutations.System.InstallSystem.IInput = {
|
||||
data: {
|
||||
permission: "active",
|
||||
username: "имя_аккаунта_кооператива",
|
||||
wif: "приватный_ключ"
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
Ключ будет зашифрован и сохранён в базе данных кооператива для дальнейшего использования, например, для оплаты регистрации аккаунтов.
|
||||
|
||||
|
||||
## Установка совета
|
||||
После успешного выполнения инициализации необходимо установить членов совета с указанием их приватных данных. Для этого используем метод installSystem:
|
||||
|
||||
{{ get_sdk_doc("Mutations", "System", "InstallSystem") }} | {{ get_graphql_doc("Mutation.installSystem") }}
|
||||
|
||||
```typescript
|
||||
import { Mutations } from "@coopenomics/sdk";
|
||||
|
||||
// Формируем объект для добавления в систему chairman (председатель) и member (член совета)
|
||||
const variables: Mutations.System.InstallSystem.IInput = {
|
||||
data: {
|
||||
soviet: [
|
||||
{
|
||||
individual_data: {
|
||||
birthdate: "1980-05-15",
|
||||
first_name: "Иван",
|
||||
last_name: "Петров",
|
||||
middle_name: "Алексеевич",
|
||||
full_address: "Москва, ул. Тверская, д. 10, кв. 5",
|
||||
phone: "+79161234567",
|
||||
email: 'ivan-petrov@romashka.com'
|
||||
},
|
||||
role: "chairman"
|
||||
},
|
||||
{
|
||||
individual_data: {
|
||||
birthdate: "1992-09-23",
|
||||
first_name: "Алексей",
|
||||
last_name: "Смирнов",
|
||||
middle_name: "Владимирович",
|
||||
full_address: "Санкт-Петербург, пр. Невский, д. 45, кв. 12",
|
||||
phone: "+79217654321"
|
||||
email: "aleksei-smirnov@yandex.ru"
|
||||
},
|
||||
role: "member"
|
||||
}
|
||||
//... продолжить столько раз, сколько членов в совете кооператива
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const { [Mutations.System.InstallSystem.name]: result } = await client.Mutation(
|
||||
Mutations.System.InstallSystem.mutation,
|
||||
{
|
||||
variables,
|
||||
}
|
||||
);
|
||||
|
||||
```
|
||||
|
||||
Всем указанным физическим лицам будут зарегистрированы имена аккаунтов в блокчейне, а MONO сохранит данные физических лиц в своей базе и отправит приглашения для членов совета на указанные электронные почтовые адреса.
|
||||
|
||||
!!! note ""
|
||||
При регистрации аккаунтов в блокчейне с аккаунта кооператива списываются AXON. Поэтому, убедитесь, что у вас есть AXON в достаточном количестве. Стоимость регистрации одного аккаунта ~1 AXON, или ~10 рублей.
|
||||
|
||||
|
||||
<!-- TODO перевести на подписи -->
|
||||
|
||||
|
||||
## Выпуск ключей
|
||||
|
||||
После того, как все члены совета будут добавлены методом installSystem, каждый из них получит оповещение на электронную почту с приглашением получить приватный ключ доступа к системе своего кооператива. Срок действия ссылки для выпуска ключа - 24 часа.
|
||||
|
||||
Если по истечению 24 часов ссылка не будет использована, то члену совета для входа будет необходимо воспользоваться методом сброса приватного ключа к его аккаунту. Для этого в терминале ему необходимо нажать кнопку "потяряли ключ?" и следовать инструкциям (см. подробнее [здесь](/participants/restore).
|
||||
|
||||
Выпуск ключа осуществляется на стороне пользователя в браузерном клиенте, и для этого ему необходимо перейти по ссылке, которую он получит, и завершить процесс генерации ключа. После чего, отправить его публичную часть в MONO для установки в блокчейне методом resetKey.
|
||||
|
||||
{{ get_sdk_doc("Mutations", "System", "InstallSystem") }} | {{ get_graphql_doc("Mutation.installSystem") }}
|
||||
|
||||
```typescript
|
||||
import { Mutations } from "@coopenomics/sdk";
|
||||
|
||||
const variables: Mutations.Auth.ResetKey.IInput = {
|
||||
data: {
|
||||
public_key: "EOS....публичный_ключ",
|
||||
token: "токен,_полученный_на_email"
|
||||
}
|
||||
}
|
||||
|
||||
const { [Mutations.Auth.ResetKey.name]: result } = await client.Mutation(
|
||||
Mutations.Auth.ResetKey.mutation,
|
||||
{
|
||||
variables,
|
||||
}
|
||||
);
|
||||
|
||||
```
|
||||
|
||||
|
||||
После выпуска ключа и установки его в блокчейне методом ResetKey, пайщик может воспользоваться входом.
|
||||
@@ -0,0 +1,199 @@
|
||||
`Решение` - это утвержденное протоколом собрания совета юридическое действие в кооперативе.
|
||||
|
||||
Все решения принимаются онлайн-голосованием членов совета на платформе. После успешного голосования председатель утверждает автоматически-сформированный протокол собрания совета, а блокчейн - исполняет его.
|
||||
|
||||
Решения бывают: `стандартизированные` и `свободные`.
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[Решение] -->|создаётся и исполняется автоматически| B[Стандартизированное]
|
||||
A -->|создаётся и исполняется вручную| C[Свободное]
|
||||
|
||||
B -->|Предложение поступает от смарт-контрактов| D[Повестка]
|
||||
D -->|Вопрос выносится на голосование| E[Голосование]
|
||||
E -->|Решение принято| F[Утверждение председателем]
|
||||
F -->|Фиксация в реестре| G[Исполняется автоматически]
|
||||
|
||||
C -->|Предложение поступает от членов совета| H[Повестка]
|
||||
H -->|Вопрос выносится на голосование| I[Голосование]
|
||||
I -->|Решение принято| J[Утверждение председателем]
|
||||
J -->|Фиксация в реестре| K[Исполняется вручную]
|
||||
```
|
||||
|
||||
`Стандартизированные` решения принимаются по типичным вопросам, такие как: приём пайщика, приём паевого взноса финансовыми средствами, приём паевого взноса имуществом, возврат паевого взноса финансовыми средствами, возврат паевого взноса имуществом, выход пайщика из кооператива, и т.д. и т.п.
|
||||
|
||||
`Стандартизированные` решения полностью автоматизированы, предложения на вопросы для голосование в них формируются автоматически и фиксируются в повестке для дальнейшего голосования совета. После проведения голосования и утверждения председателем совета, решение будет исполнено автоматически - например, пайщик будет добавлен в реестр, взносы зафиксируются в фондах, и т.д. и т.п..
|
||||
|
||||
Таким образом, `стандартизированные` решения полностью автоматизированы в том плане, что входящие данные по ним формируются системой автоматически на основе действий пайщика и не требуют участия администрации кооператива в подготовке документов - документы по стандартазированным решениям готовятся и исполняются автоматически.
|
||||
|
||||
`Свободные` решения свободны в том плане, что вопрос на повестку и проект решения по этому вопросу предлагается членом совета на голосование всему совету. Если голосование прошло успешно и решение принято, то оно фиксируется в реестре документов и не приводит к автоматическому исполнению содержимого. Исполнение свободного решения производится советом `вручную`,
|
||||
|
||||
`Свободные` и `стандартизированные` решения предоставляют совету возможность легко и просто принимать решения по любым вопросам удаленно, на основе простой электронной подписи.
|
||||
|
||||
__Общий порядок принятия решений__
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Смарт-контракт/Член совета
|
||||
participant Платформа
|
||||
participant Члены совета
|
||||
participant Председатель
|
||||
participant Блокчейн
|
||||
participant Реестр
|
||||
|
||||
Смарт-контракт/Член совета ->> Платформа: Формирует предложение (стандартизированное/свободное)
|
||||
Платформа ->> Члены совета: Выставляет на голосование (48 часов)
|
||||
loop В течение 48 часов
|
||||
Члены совета ->> Платформа: Голосуют (ЗА / ПРОТИВ / Воздержался)
|
||||
end
|
||||
|
||||
alt Проголосовало 50%+ ЗА
|
||||
Платформа ->> Председатель: Генерация протокола
|
||||
Председатель ->> Платформа: Подписывает протокол
|
||||
Платформа ->> Блокчейн: Фиксирует решение
|
||||
alt Решение стандартизированное
|
||||
Блокчейн ->> Блокчейн: Исполняет решение (изменение статусов, балансов и т. д.)
|
||||
end
|
||||
Блокчейн ->> Реестр: Записывает в реестр решений
|
||||
else Решение не принято
|
||||
Платформа ->> Платформа: Вопрос снимается с повестки
|
||||
end
|
||||
|
||||
|
||||
```
|
||||
|
||||
__I. В смарт-контракт совета поступает `стандартизированное` или `свободное` предложение на повестку дня для голосования совета.__
|
||||
|
||||
`Стандартизированные` предложения поступают от кооперативных смарт-контрактов, которые каждый согласно своей бизнес-логике подразумевают необходимость решения совета на каком-либо этапе своего исполнения. Например, `стандартизированное` предложение на повестку о приёме пайщика возникает сразу после получения оплаты вступительного взноса, и никак иначе.
|
||||
|
||||
Исполнение `стандартизированных` решений приводит к появлению эффектов, например, таких как "изменение баланса лицевого счёта", или "изменение статуса пайщика", которые фиксируются в блокчейне согласно бизнес-логике смарт-контрактов [Кооперативной Экономики](https://coopenomics.world).
|
||||
|
||||
`Свободные` предложения и проекты решения по ним формируются членами совета вручную. Они не предлагаются автоматически и решения по ним не приводят к эффектам в блокчейне.
|
||||
|
||||
__II. Члены совета голосуют ЗА, ПРОТИВ, или воздерживаются от голосования по вопросу.__
|
||||
|
||||
Каждый вопрос на повестке - это отдельное собрание совета, решение которого фиксируется отдельным протоколом. Один вопрос - один протокол. За один день может быть проведено неограниченное количество собраний совета и получено неограниченное количество протоколов решений.
|
||||
|
||||
Решение по вопросу необходимо принять за 48 часов. Решение считается принятым, если ЗА него проголосовало 50% членов совета. По истечению 48 часов, если решение не принято, вопрос с повестки снимается автоматически.
|
||||
|
||||
__III. Принятое решение утверждается председателем совета.__
|
||||
|
||||
Если совет кооператива принял положительное решение, то оно должно быть утверждено простой электронной подписью председателя совета на протоколе.
|
||||
|
||||
Протоколы формируются полностью автоматически на основе информации о пайщике, совершаемом им `стандартизированном` действии (если такое есть), о членах совета, и информации о их голосовании по вопросу. На основе всей этой информации система автоматически генерирует по запросу председателя протокол собрания совета.
|
||||
|
||||
Председатель подписывает сгенерированный протокол собрания совета своей электронной подписью, и отправляет его в блокчейн, тем самым, утверждая и исполняя принятое решение.
|
||||
|
||||
`Свободные` решения принимаются идентично `стандартизированным`, однако вопрос на голосование и предлагаемое решение формируется членом совета через заполнение двух полей: `предлагаемый вопрос на повестку` и `предлагаемое решение`. На основе этих данных формируется цифровой документ предложения повестки дня, которая используется при формировании протокола принятого решения.
|
||||
|
||||
__IV. Все принятые решения фиксируются в реестре.__
|
||||
|
||||
Все принятые решения фиксируются в реестре. Подробнее о реестре документов смотри раздел [Документы](/documentation/documents).
|
||||
|
||||
|
||||
|
||||
## Просмотреть повестку
|
||||
{{ get_sdk_doc("Queries", "Agenda", "GetAgenda") }} | {{ get_graphql_doc("Mutation.getAgenda") }}
|
||||
|
||||
{{ get_typedoc_desc("Queries.Agenda.GetAgenda") }}
|
||||
|
||||
{{ get_typedoc_input("Queries.Agenda.GetAgenda") }}
|
||||
|
||||
В результате исполнения запроса будет возвращён массив пакетов документов, каждый из которых содержит информацию о состоянии голосования по вопросу, о членах совета, их персональных данных и подписах, которые они оставили, а также о пайщике, который является участником юридического действия, и его личных данных.
|
||||
|
||||
Выполнение запроса доступно только для членов совета. Подробнее о содержании пакета документов смотри раздел [Документы](/documentation/documents).
|
||||
|
||||
## Проголосовать за решение
|
||||
{{ get_sdk_doc("Mutations", "Decisions", "VoteFor") }} | {{ get_graphql_doc("Mutation.voteFor") }}
|
||||
|
||||
{{ get_typedoc_desc("Mutations.Decisions.VoteFor") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.Decisions.VoteFor") }}
|
||||
|
||||
|
||||
## Проголосовать против решения
|
||||
{{ get_sdk_doc("Mutations", "Decisions", "VoteAgainst") }} | {{ get_graphql_doc("Mutation.voteAgainst") }}
|
||||
|
||||
{{ get_typedoc_desc("Mutations.Decisions.VoteAgainst") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.Decisions.VoteAgainst") }}
|
||||
|
||||
|
||||
## Воздержаться от голосования
|
||||
Для того, чтобы члену совета воздержаться от голосования, достаточно не голосовать ЗА или ПРОТИВ решения в течение 48 часов. Специального действия для воздержания не предусмотрено.
|
||||
|
||||
<a id="authorize-decision"></a>
|
||||
## Утвердить решение
|
||||
{{ get_sdk_doc("Mutations", "Decisions", "Authorize") }} | {{ get_graphql_doc("Mutation.authorize") }}
|
||||
|
||||
{{ get_typedoc_desc("Mutations.Decisions.Authorize") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.Decisions.Authorize") }}
|
||||
|
||||
|
||||
## Исполнить решение
|
||||
{{ get_sdk_doc("Mutations", "Decisions", "Exec") }} | {{ get_graphql_doc("Mutation.exec") }}
|
||||
|
||||
{{ get_typedoc_desc("Mutations.Decisions.Exec") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.Decisions.Exec") }}
|
||||
|
||||
|
||||
|
||||
## Стандартизированные решения
|
||||
|
||||
### Решение о приёме пайщика
|
||||
{{ get_sdk_doc("Mutations", "Participants", "GenerateParticipantApplicationDecision") }} | {{ get_graphql_doc("Mutation.generateParticipantApplicationDecision") }}
|
||||
|
||||
Предложение на повестку формируется автоматически при [регистрации пайщика](/documentation/participants) на основании заполненного и подписанного заявления о вступлении в кооператив. Решение по вопросу приёма пайщика принимается советом на голосовании. После принятия положительного решения, председатель должен сформировать протокол решения собрания совета с помощью мутации:
|
||||
|
||||
{{ get_typedoc_input("Mutations.Participants.GenerateParticipantApplicationDecision") }}
|
||||
|
||||
Полученный с помощью этой мутации цифровой документ необходимо использовать при [Утверждении решения](/documentation/decisions#authorize-decision). Не обязательные параметры в мутации выше устанавливаются автоматически и передаются только для повторной регенации документа на основе ранее полученных мета-данных.
|
||||
|
||||
|
||||
## Свободные решения
|
||||
Процесс предложения решения на повестку состоит из трех этапов:
|
||||
|
||||
1. Создать предложение и сохранить его в базе MONO для дальнейшей генерации документа.
|
||||
|
||||
2. Сгенерировать документ повестки собрания совета.
|
||||
|
||||
3. Опубликовать вопрос в повестке собрания совета.
|
||||
|
||||
После голосования совета и принятия решения председатель вызывает метод генерации протокола свободного решения и использует его для [утверждения](/documentation/decisions/#authorize-decision).
|
||||
|
||||
|
||||
### Создать предложение решения
|
||||
{{ get_sdk_doc("Mutations", "FreeDecisions", "CreateProjectOfFreeDecision") }} | {{ get_graphql_doc("Mutation.createProjectOfFreeDecision") }}
|
||||
|
||||
Предложение вопроса и его решения создаётся с помощью мутации `CreateProjectOfFreeDecision`, которая получает информацию о вопросе и его решении, и сохраняет для дальнейшего использования при генерации документа.
|
||||
|
||||
{{ get_typedoc_input("Mutations.FreeDecisions.CreateProjectOfFreeDecision") }}
|
||||
|
||||
|
||||
### Сгенерировать документ предложения решения
|
||||
{{ get_sdk_doc("Mutations", "FreeDecisions", "GenerateProjectOfFreeDecision") }} | {{ get_graphql_doc("Mutation.generateProjectOfFreeDecision") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.FreeDecisions.GenerateProjectOfFreeDecision") }}
|
||||
|
||||
|
||||
### Опубликовать документ повестки с предложением
|
||||
{{ get_sdk_doc("Mutations", "FreeDecisions", "PublishProjectOfFreeDecision") }} | {{ get_graphql_doc("Mutation.publishProjectOfFreeDecision") }}
|
||||
|
||||
Предложение повестки дня публикуется в смарт-контракте с помощью мутации `PublishProjectOfFreeDecision`. Сразу после публикации повестки совет может приступать к голосованию.
|
||||
|
||||
{{ get_typedoc_input("Mutations.FreeDecisions.PublishProjectOfFreeDecision") }}
|
||||
|
||||
|
||||
|
||||
### Сгенерировать протокол свободного решения по предложению
|
||||
{{ get_sdk_doc("Mutations", "FreeDecisions", "GenerateFreeDecision") }} | {{ get_graphql_doc("Mutation.generateFreeDecision") }}
|
||||
|
||||
Протокол свободного решения генерируется на основании принятого решения, а также документа с предложением, которое было опубликовано членом совета. После генерации протокола свободного решения председатель должен [утвердить](/documentation/decisions/#authorize-decision) его для фиксации в реестре [Документов](/documentation/documents).
|
||||
|
||||
{{ get_typedoc_input("Mutations.FreeDecisions.GenerateFreeDecision") }}
|
||||
|
||||
Результат исполнения:
|
||||
|
||||
{{ get_typedoc_definition("Mutations.FreeDecisions.GenerateFreeDecision", "IOutput") }}
|
||||
@@ -0,0 +1,228 @@
|
||||
Документ — это объект, несущий юридически-значимую информацию, необходимую для работы кооператива и подтверждения прав пайщиков или других участников. Взаимодействие с документом включает в себя его подготовку, подписание и публикацию в блокчейне. При этом документ всегда состоит из двух частей:
|
||||
|
||||
`Публичная часть` — хранится в блокчейне в анонимизированном виде, не раскрывает конфиденциальных данных пайщика и включает минимальный набор сведений, достаточный для проверки подлинности документа. При наличии приватных данных, хранящихся вне блокчейна, этот документ может быть полностью восстановлен.
|
||||
|
||||
`Приватная часть` — хранится во внутренней базе данных платформы MONO. Эта часть содержит личные или иные конфиденциальные данные пайщика, информацию о содержании документа, подписи, дополнительные детали и всё то, что не должно публиковаться публично. Из неё же берётся необходимая информация для генерации, регенерации и сверки документа с его публичной частью, которая была зафиксирована в блокчейне.
|
||||
|
||||
При этом все документы, публикуемые в блокчейне, анонимизированно фиксируются через соответствующие смарт-контракты, что обеспечивает прозрачный и неизменяемый учёт без раскрытия приватных сведений.
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A("Цифровой Документ")
|
||||
B("Обезличенная часть")
|
||||
C("Приватная часть")
|
||||
|
||||
A -->|зафиксировано в блокчейне| B
|
||||
A -->|хранится в MONO| C
|
||||
|
||||
```
|
||||
|
||||
## Фиксация документов
|
||||
|
||||
Каждый раз, когда пользователь (пайщик) формирует документ, он генерируется платформой MONO на основании данных, которые уже есть во внутренней базе кооператива. При генерации создаётся как PDF-версия (бинарное представление), так и HTML-версия (для удобного отображения в интерфейсе). Параллельно формируется hash PDF-файла и метаданные, необходимые для будущей регенерации.
|
||||
|
||||
Когда пользователь подписывает сформированный документ (PDF-хэш), подпись вместе с публичным ключом и мета-данными отправляется обратно на платформу MONO, и уже MONO публикует эту информацию в блокчейн через вызов соответствующих мутаций смарт-контрактов.
|
||||
|
||||
Таким образом, пайщик напрямую не отправляет документ в блокчейн: за него это делает MONO, храня всю детальную информацию у себя, но публикуя в блокчейне лишь зашифрованные или анонимизированные данные, достаточные для удостоверения подлинности документа.
|
||||
|
||||
## Структура данных в блокчейне
|
||||
|
||||
Смарт-контракты в блокчейне фиксируют документ в обезличенном виде. Вызов мутации, отвечающей за публикацию документа, сохраняет в блокчейне следующую структуру:
|
||||
|
||||
```ts
|
||||
interface ISignedDocument {
|
||||
hash: <string> // Хэш-сумма подписанного PDF-документа
|
||||
signature: <string> // Подпись хэш-суммы
|
||||
public_key: <string> // Публичный ключ, которым подписан документ
|
||||
meta: <string> // Строка с JSON-объектом мета-информации о документе
|
||||
}
|
||||
```
|
||||
|
||||
Где `hash` - позволяет однозначно идентифицировать документ, `signature` и `public_key` обеспечивают криптографическую верификацию подлинности подписи, а `meta` содержит дополнительную информацию (в формате JSON), позволяющую в будущем восстановить содержание документа (используя данные из внутренней базы MONO).
|
||||
|
||||
Таким образом, вся конфиденциальная часть документа (тексты, личные данные, детали договора и т.д.) не вводятся в публичный реестр блокчейна. Блокчейн хранит лишь контрольные суммы и ограниченный набор открытых сведений, необходимые для проверки и восстановления документа.
|
||||
|
||||
## Процесс генерации и подписания документа
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant U as Пайщик (Пользователь)
|
||||
participant M as MONO
|
||||
participant BC as Блокчейн (смарт-контракт)
|
||||
|
||||
U->>M: 1) Запрос на генерацию документа (Generate...)
|
||||
M->>U: Возвращает IGeneratedDocument <br/>(PDF/HTML, хэш, метаданные)
|
||||
U->>U: 2) Подписывает документ<br/>(hash) приватным ключом
|
||||
U->>M: Передаёт подписанный документ (signature, public_key)
|
||||
M->>BC: 3) Публикует ISignedDocument<br/>(hash, signature, public_key, meta)
|
||||
BC-->>M: Извлекает и сохраняет публичные данные (хэш и пр.)
|
||||
|
||||
```
|
||||
|
||||
`1. Инициирующее действие (заявление)`
|
||||
|
||||
Пользователь инициирует процесс, вызывая мутацию с префиксом Generate.
|
||||
|
||||
В ответ `MONO` формирует документ:
|
||||
|
||||
```ts
|
||||
interface IGeneratedDocument {
|
||||
binary: <string> // base64-кодированное содержимое PDF
|
||||
full_title: <string> // Полное название документа
|
||||
hash: <string> // Хэш-сумма PDF-файла
|
||||
html: <string> // HTML-версия документа
|
||||
meta: <MetaDocument> // Объект метаданных
|
||||
}
|
||||
```
|
||||
|
||||
`2. Подпись документа`
|
||||
|
||||
На полученный `hash` документ пользователь накладывает цифровую подпись с помощью своего приватного ключа:
|
||||
|
||||
```ts
|
||||
import { Wallet } from '@coopenomics/sdk'
|
||||
|
||||
const wallet = new Wallet({
|
||||
chain_url: <string>, // конечная точка блокчейна
|
||||
chain_id: <string>, // идентификатор блокчейна
|
||||
})
|
||||
|
||||
wallet.setWif(<username>, <wif>) //установить имя пользователя и приватный ключ для подписи
|
||||
|
||||
//подписать документ
|
||||
const signedDocument = wallet.signDocument(generatedDocument)
|
||||
|
||||
```
|
||||
|
||||
`3. Публикация в блокчейне`
|
||||
|
||||
Пользователь вызывает «публикующую» мутацию `MONO` и передаёт подписанный документ в качестве аргумента. `MONO` производит необходимые проверки, после чего, публикует документ в блокчейне.
|
||||
|
||||
В результате, публичные данные документа (хэш, подпись, публичный ключ и мета-данные) фиксируются в блокчейне, а кооперативный смарт-контракт, который связан с опубликованным документом, продолжает своё исполнение по ходу своей бизнес-логики.
|
||||
|
||||
|
||||
## Пакет документов
|
||||
Пакет документов представляет собой набор всех документов, относящихся к определённому процессу внутри кооператива (например, вступление в кооператив, взнос или возврат имущества имущества, подписание соглашений и т.д.).
|
||||
|
||||
Минимальный пакет всегда содержит хотя бы одно заявление (StatementDetail), опубликованное в блокчейне. В зависимости от бизнес-логики смарт-контракта, к заявлению могут добавляться и другие
|
||||
документы:
|
||||
|
||||
- Протокол Решения (DecisionDetail), содержащий данные о том, как совет кооператива принял решение по заявлению.
|
||||
|
||||
- Акты (ActDetail), завершающие юридически значимые действия, например, передача имущества.
|
||||
|
||||
- Связанные документы (GeneratedDocument), которые могут прикладываться к заявлению и подписываться вместе с ним (соглашения об использовании платформы, политике конфиденциальности и т.д.).
|
||||
|
||||
`MONO` собирает документы, связанные с исходным заявлением, в единый пакет. В этом пакете сохраняются как публичные данные, извлечённые из блокчейна (подписи, хэши, статусы), так и приватные данные (конкретное содержимое документов), которые могут быть показаны только тем, кто имеет право их видеть (пайщик, члены совета, председатель и т.д.).
|
||||
|
||||
|
||||
Если после публикации документа в блокчейне с помощью соответствующей мутации, логика смарт-контракта подразумевает, что необходимо собрать совет кооператива для голосования по вопросу в заявлении, то автоматически создаётся объект будущего протокола решения (DecisionDetail), в котором фиксируется процесс голосования и утверждения.
|
||||
|
||||
|
||||
|
||||
|
||||
Структурно пакет может выглядеть так, как показано в диаграмме (см. «Структурная диаграмма пакета документов»).
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
A["📂 Пакет документов (DocumentPackage)"] -->|Содержит| B["📄 Заявление (StatementDetail)"]
|
||||
A -->|Может содержать| C["📜 Протокол Решения (DecisionDetail)"]
|
||||
A -->|Может содержать| D["📜 Акты (ActDetail)"]
|
||||
A -->|Может содержать| E["🔗 Связанные документы (GeneratedDocument)"]
|
||||
|
||||
B -->|Основано на| F["⚡ Расширенное действие в блокчейне (ExtendedBlockchainAction)"]
|
||||
B -->|Содержит| G["📑 Документ заявления (GeneratedDocument)"]
|
||||
|
||||
C -->|Основано на| H["⚡ Расширенное действие в блокчейне (ExtendedBlockchainAction)"]
|
||||
C -->|Содержит| I["📑 Документ протокола решения (GeneratedDocument)"]
|
||||
C -->|Голоса| J["✅ Голоса 'за' (ExtendedBlockchainAction)"] & K["❌ Голоса 'против' (ExtendedBlockchainAction)"]
|
||||
|
||||
D -->|Может содержать| L["⚡ Расширенное действие в блокчейне (ExtendedBlockchainAction)"]
|
||||
D -->|Связан с| M["📑 Документ акта (GeneratedDocument)"]
|
||||
|
||||
F -->|Содержит| Z["👤 Информацию о заявителе"]
|
||||
H -->|Содержит| X["👤 Информацию о председателе"]
|
||||
J & K -->|Содержит| O["👤 Информацию о члене совета"]
|
||||
L -->|Содержит| MM["👤 Информацию о председателе (КУ)"]
|
||||
L -->|Содержит| NN["👤 Информацию о пайщике"]
|
||||
|
||||
|
||||
```
|
||||
|
||||
## Статусы документов
|
||||
При публикации в блокчейне каждый документ, в зависимости от контекста и бизнес-логики, получает статус:
|
||||
|
||||
- `submitted` (входящий) — документ ещё не завершён, ему требуется решение совета или иное дальнейшее действие.
|
||||
|
||||
- `resolved` (принятый) — документ получил финальную юридическую силу. Это означает, что все необходимые действия выполнены, голоса совета собраны (если были нужны), акт подписан (если требовалось), и смарт-контракт отметил его как завершённый.
|
||||
|
||||
- `rejected` (отклонённый) - документ отклонён. Это означает, что изначально входящий документ отклонён в процессе рассмотрения советом.
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
A("submitted (входящий)") --> B("rejected (отклоненный)")
|
||||
A --> C("resolved (принятый)")
|
||||
```
|
||||
|
||||
При этом все статусы навсегда сохраняются в блокчейне для каждого документа. Даже если документ, находящийся в статусе `submitted`, в итоге отклонён советом, он всё равно останется в этом статусе (и дополнительно переходит в `rejected`), так как данные в публичном реестре не редактируются и не удаляются задним числом.
|
||||
|
||||
Соответственно:
|
||||
|
||||
- Входящий (`submitted`) документ отражает факт, что не все требования закрыты и решение по нему ещё может быть не принято либо принято отрицательно (но мы увидим это не по статусу, а по факту отсутствия закрывающего действия).
|
||||
|
||||
- Принятый (`resolved`) документ свидетельствует о завершённом процессе и имеет всю юридическую силу в реестре кооператива.
|
||||
|
||||
- Отклоненный (`rejected`) документ свидетельствует о прерванном процессе и не имеет юридической силы.
|
||||
|
||||
|
||||
## Регенерация документов и хранение в MONO
|
||||
|
||||
Внутренняя база MONO хранит всё документы, их приватные части, исторические данные, а также привязку к хэшам, которые были опубликованы в блокчейне. Когда пользователь или член совета запрашивает пакет документов, `MONO`:
|
||||
|
||||
- Извлекает публичные данные по документам из блокчейна (через смарт-контракты).
|
||||
|
||||
- Находит приватные данные в своей БД, сопоставляя их по `hash`.
|
||||
|
||||
- Собирает итоговый пакет, в котором каждому опубликованному действию (ExtendedBlockchainAction) соответствует документ с нужными вложениями (PDF, HTML, метаданные).
|
||||
|
||||
Благодаря этому подходу, платформа может регенерировать любой документ в том же виде, в котором он был подписан и отправлен в блокчейн, и сверить заново сгенерированный документ с тем, который был опубликован в блокчейне, тем самым, верифицировав то, что документ создан корректно, а цифровая подпись на нём - валидна.
|
||||
|
||||
## Связанные документы
|
||||
|
||||
Часто к заявлению или другому документу требуется приложить дополнительные договоры, согласия, соглашения и прочие документы, которые, в свою очередь, могут быть подписаны и закреплены криптографически. Это делается путём добавления в поле `meta` списка (массива) хэш-сумм связанных документов. Подписывая один документ, пайщик тем самым подтверждает связь с другими документами и своё согласие с ними именно в той версии, с которой он ознакомлен.
|
||||
|
||||
Пример: когда пользователь вступает в кооператив, он одновременно потверждает согласие с политикой конфиденциальности, условиями целевой программы «Цифрового Кошелька», а также правила использования простой электронной подписи и пользовательское соглашение. Хэши всех этих документов указываются в поле `meta` инициирующего заявления на вступление в кооператив, а подробное содержимое каждого документа хранится в базе `MONO`.
|
||||
|
||||
В итоге, вся последовательность от первого инициирующего заявления до заключительного акта, если он предусмотрен бизнес-логикой, превращается в связный пакет документов:
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
Z("Инициирующее заявление<br/>(submitted)") -->|Если требуется решение совета| A("Собрание совета и голосование")
|
||||
Z -->|Если решение совета не требуется| B("Перевод<br/>в resolved")
|
||||
A -->|Решение принято| D("Подпись актов (при необходимости)")
|
||||
A -->|Решение не принято| C("Отклонение -> rejected")
|
||||
D -->|Подписи получены| B("resolved")
|
||||
|
||||
```
|
||||
|
||||
- Заявление (StatementDetail) и его подпись в блокчейне инициирует цепочку принятия решений или сразу переводит документ в статус `resolved` (принятое), если решение по вопросу не требуется;
|
||||
|
||||
- Протокол решения (DecisionDetail) собирает голоса членов совета и ожидает утверждения подписью председателя, если это предусмотрено смарт-контрактом как реакция на инициирующее заявление;
|
||||
|
||||
- Акты (ActDetail) подписывается пайщиком и председателем (кооперативного участка), если такое требование есть у смарт-контракта как реакция на инициирующее заявление. Крайняя подпись на акте переводит документ в статус `resolved` и фиксирует его в реестре;
|
||||
|
||||
- Прикреплённые (связанные) документы, позволяющие зафиксировать другие важные файлы в рамках этого же пакета;
|
||||
|
||||
Такой пакет становится частью списка всех «принятых» решений и документов кооператива, который в любой момент может быть выгружен для проведения аудита, юридических проверок или отчетности перед надзорными органами.
|
||||
|
||||
|
||||
|
||||
## Получить список пакетов документов
|
||||
|
||||
{{ get_sdk_doc("Queries", "Documents", "GetDocuments") }} | {{ get_graphql_doc("Query.getDocuments") }}
|
||||
|
||||
{{ get_typedoc_input("Queries.Documents.GetDocuments") }}
|
||||
|
||||
Результат исполнения:
|
||||
|
||||
{{ get_typedoc_definition("Queries.Documents.GetDocuments", "IOutput") }}
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
Расширения — это специализированные программы, которые расширяют функциональные возможности MONO, добавляя новые инструменты, сервисы и автоматизированные процессы. Они позволяют гибко адаптировать систему под потребности кооператива, улучшая взаимодействие между пайщиками, советом и инфраструктурой MONO.
|
||||
|
||||
Расширения бывают: __внутренними__ и __внешними__.
|
||||
|
||||
Внутренние расширения реализуются непосредственно в моно-репозитории на Github. Они глубоко интегрированы в само приложение MONO и выстраиваются по его же архитектурным принципам. При подключении внутреннего расширения разворачивается микросервис, который добавляет в единую точку graphQL-API новые запросы, методы и подписки, которые отвечают за работу с конкретно этим расширением, или не добавляет ничего и просто выполняет свою функцию.
|
||||
|
||||
Внешние расширения реализуются отдельно и интегрируются с MONO посредством iframe с возможностью обмена сообщениями. Это позволяет интегрировать в MONO любой внешний сервис, основываясь только на обмене простыми сообщениями о запросе подписи или предоставления доступа. На текущий момент внешние расширения временно недоступны.
|
||||
|
||||
Внутренние расширения MONO можно разделить на две основные категории: __утилиты__ и __витрины__. Однако явной границы между ними нет, т.к. любая витрина может быть слегка утилитой, а любая утилита - слегка витриной. Это разделение условное.
|
||||
|
||||
Утилиты расширяют функцию автоматизации деятельности кооператива, например: обеспечивают автоматизированный приём платежей, проводят верификации пайщиков, исполняют делегированные советом поручения, и т.д. и т.п. Т.е. помогают совету кооператива удовлетворять потребности пайщиков с помощью автоматизации рутиных процессов.
|
||||
|
||||
Витрины предоставляет пайщикам интерфейсы для кооперации, основанные доступных кооперативных смарт-контрактах в [Кооперативной Экономики](https://coopenomics.world). Это могут быть: маркетплейсы, страницы предложений поставки имущества, страницы аренды, коллективных закупок, и т.д. и т.п. Т.е. предлагают пайщикам и совету кнопки, запросы, мутации или подписки, которые позволяют кооперарировать иначе.
|
||||
|
||||
Каждое расширение содержит в себе схему данных [zod](https://zod.dev/) в поле `schema` с описаниями каждого поля, и поле `config`, в которое устанавливаются используемая расширением конфигурация согласно его схеме, и, возможно, отображаются какие-то неизменямые извне данные. Поэтому, для установки, необходимо передать `config` согласно zod-схеме в поле `schema`.
|
||||
|
||||
## Получить список расширений
|
||||
|
||||
{{ get_sdk_doc("Queries", "Extensions", "GetExtensions") }} | {{ get_graphql_doc("Query.getExtensions") }}
|
||||
|
||||
|
||||
{{ get_typedoc_input("Queries.Extensions.GetExtensions") }}
|
||||
|
||||
|
||||
Результат:
|
||||
|
||||
{{ get_typedoc_definition("Queries.Extensions.GetExtensions", "IOutput") }}
|
||||
|
||||
## Установить расширение
|
||||
{{ get_sdk_doc("Mutations", "Extensions", "InstallExtension") }} | {{ get_graphql_doc("Mutation.installExtension") }}
|
||||
|
||||
|
||||
{{ get_typedoc_input("Mutations.Extensions.InstallExtension") }}
|
||||
|
||||
|
||||
Результат:
|
||||
|
||||
{{ get_typedoc_definition("Mutations.Extensions.InstallExtension", "IOutput") }}
|
||||
|
||||
|
||||
|
||||
## Удалить расширение
|
||||
{{ get_sdk_doc("Mutations", "Extensions", "UninstallExtension") }} | {{ get_graphql_doc("Mutation.uninstallExtension") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.Extensions.UninstallExtension") }}
|
||||
|
||||
|
||||
Результат:
|
||||
|
||||
{{ get_typedoc_definition("Mutations.Extensions.UninstallExtension", "IOutput") }}
|
||||
|
||||
|
||||
## Обновить расширение
|
||||
{{ get_sdk_doc("Mutations", "Extensions", "UpdateExtension") }} | {{ get_graphql_doc("Mutation.updateExtension") }}
|
||||
|
||||
Для временного отключения расширения флаг `enabled` установить в `false`.
|
||||
|
||||
{{ get_typedoc_input("Mutations.Extensions.UpdateExtension") }}
|
||||
|
||||
|
||||
Результат:
|
||||
|
||||
{{ get_typedoc_definition("Mutations.Extensions.UpdateExtension", "IOutput") }}
|
||||
|
||||
|
||||
## Опубликовать расширение
|
||||
|
||||
Функционал добавления внешних расширений временно не доступен.
|
||||
@@ -0,0 +1,166 @@
|
||||
Фонды - это счета кооператива в [кошельке](/documentation/wallet) для учёта движения паевых, членских и вступительных взносов пайщиков.
|
||||
|
||||
Фонды бывают: `возвратные` и `невозвратные`.
|
||||
|
||||
Единственным возвратным фондом является паевой фонд. При поступлении средств на него у кооператива возникает обязательство по возврату средств пайщику. Все прочие фонды являются невозвратными, т.е. при поступлении средств в эти фонды у кооператива уже нет обязательств по их возврату пайщикам.
|
||||
|
||||
Фонды бывают: `накопительные` и `списания`.
|
||||
|
||||
Накопительные фонды накапливают финансовые средства в себя с каждого [членского взноса](/documentation/payments) пайщиков согласно распределению в процентах между всеми накопительными фондами. Фонды списания подобны статьям, по которым кооператив может списывать доступные, ранее накопленные финансовые средства.
|
||||
|
||||
<!-- Фонды бывают: `обязательные` и `не обязательные`. -->
|
||||
|
||||
В Кошельке фондов кооператива есть следующие обязательные счета, использование которых регулируется смарт-контрактами [Кооперативной Экономики](https://coopenomics.world):
|
||||
|
||||
- __Паевой__ - учитывает все паевые взносы пайщиков, увеличивается при взносах и уменьшается при их возврате пайщикам. Является возвратным фондом. Всё что вносится в паевой фонд - подлежит возврату, и должно использоваться кооперативом только для удовлетворения потребности пайщика по его поручению.
|
||||
|
||||
- __Неделимый__ - обязательный накопительный фонд членских взносов пайщиков, который передаётся какому-либо кооперативу при ликвидации кооператива.
|
||||
|
||||
- __Резервный__ - обязательный накопительный фонд членских взносов пайщиков, который формирует резерв для погашения финансовых обязательств кооператива, которые могут возникнуть в процессе его операционной деятельности.
|
||||
|
||||
- __Развития кооперации__ - обязательный накопительный фонд членских взносов пайщиков, который используется для финансирования образовательных, консультационных, инфраструктурных и иных программ, направленных на развитие и укрепление кооператива.
|
||||
|
||||
- __Вступительный__ - обязательный накопительный фонд вступительных взносов пайщиков, которые по закону должны использоваться только для списания через счет хозяйственной деятельности.
|
||||
|
||||
- __Остаточный__ - обязательный накопительный фонд членских взносов пайщиков, которые остались после распределения по всем фондам накопления кооператива и будут использоваться для дальнейшего списания в будущем.
|
||||
|
||||
- __Хозяйственной деятельности__ - обязательный фонд списания расходов, через который проходят все расходы кооператива с `остаточного` счёта.
|
||||
|
||||
- __Взаимопомощи__ - обязательный фонд списания на нужды помощи пайщикам, который использует `остаточный` счет как источник средств.
|
||||
|
||||
|
||||
## Как это работает
|
||||
|
||||
|
||||
```mermaid
|
||||
graph LR;
|
||||
|
||||
%% Внешние платежи пайщика
|
||||
A[Регистрационный платеж] -->|Обработан| B[Вступительный и паевой взнос]
|
||||
B -- Вступительный --> C[Фонд вступительных взносов]
|
||||
B -- Паевой --> D[Паевой фонд кооператива]
|
||||
|
||||
|
||||
%% Паевой взнос
|
||||
X[Паевой платеж] -->|Обработан| E[Паевой взнос]
|
||||
E[Паевой взнос] -->|Увеличение| D
|
||||
E -->|Увеличение| F[Паевой счёт пайщика]
|
||||
|
||||
%% Возврат паевого взноса
|
||||
G[Заявление на возврат] -->|Решение| H[Платеж возврата]
|
||||
H -->|Уменьшение| D
|
||||
H -->|Уменьшение| F
|
||||
|
||||
%% Участие в программе
|
||||
I[Участие в программе] -->|Членский взнос| J{Распределение}
|
||||
|
||||
%% Распределение членского взноса
|
||||
J -- 1% --> K[Неделимый фонд]
|
||||
J -- 15% --> L[Резервный фонд]
|
||||
J -- 5% --> M[Фонд развития кооперации]
|
||||
J -- 79% --> N[Остаточный фонд]
|
||||
|
||||
%% Списание из остаточного фонда
|
||||
N -->|Списание| O{Фонды списания}
|
||||
O -- Расходы --> P[Фонд хозяйственной деятельности]
|
||||
O -- Помощь пайщикам --> Q[Фонд взаимопомощи]
|
||||
|
||||
```
|
||||
|
||||
Первые взносы, которые оплачивает пайщик одним [Регистрационным Платежом](/documentation/payments) - это вступительный и минимальный паевый взносы. Вступительные взнос фиксируется в фонде вступительных взносов кооператива, а минимальный паевый взнос - в паевом фонде.
|
||||
|
||||
В кошельке пайщике отображается сумма минимально-паевого взноса, которая будет возвращена при выходе пайщика из кооператива. При возврате минимального паевого взноса - паевой фонд будет уменьшен на эту сумму.
|
||||
|
||||
Следующий взнос, который может совершить пайщик - паевой, который будет зафиксирован в [Кошельке](documentation/wallet) пайщика и паевом фонде. Кошелёк позволяет пополнять себя платежами и использовать себя как "буфер" для взносов в целевые потребительские программы кооператива и дальнейших возвратов из них.
|
||||
|
||||
Платежи, которые поступают в Кошелёк на паевой счёт - безусловно возвратные. Пайщик может сформировать заявление на возврат и получить платежом возврата свой паевой взнос обратно на банковский счёт. При совершении платежа возврата паевой фонд будет уменьшен на сумму возврата.
|
||||
|
||||
Когда пайщик принимает решение участвовать в какой-либо [целевой потребительской программе](/documentation/programs) кооператива, то он принимает её условия. В её условиях описан принцип взымания членских взносов, или их отсутствие. Членские взносы взымаются по условиям программы и отправляются для распределения по невозвратным фондам.
|
||||
|
||||
Членский взнос пайщика распределяется среди всех фондов накопления в их процентном соотношении, которое всегда составляет 100% от суммы взноса. Обычно, при старте `MONO` в кооперативе 4 фонда накопления со следующим распределением:
|
||||
|
||||
- Неделимый фонд - 1%
|
||||
|
||||
- Резервный фонд - 15%
|
||||
|
||||
- Фонд развития кооперации - 5%
|
||||
|
||||
- Остаточный фонд - 79%
|
||||
|
||||
Кооператив может создавать дополнительные фонды накопления из числа средств остаточного фонда, всего до 12 штук. Редактировать наименования и процентные распределения между обязательными фондами кооператив не может. Все добавляемые кооперативом фонды накопления будут уменьшать остаточный фонд, но не будут влиять на процентное соотношение распределений неделимого, резервного фонда и фонда развития кооперации.
|
||||
|
||||
Остаточный фонд может использоваться кооперативом для списания по любому фонду списания. Среди них два обязательных фонда: `хозяйственной деятельности` и `взаимопомощи` и любое количество не обязательных, которые может добавить кооператив.
|
||||
|
||||
Использование средств любого фонда регулируется смарт-контрактами на основании требуемых для этого документов и процессов. Так, остаточный фонд списывается на расходы по служебным запискам и решениям совета, а неделимый, резервный и фонд развития кооперации могут использоваться только по решениям общего собрания пайщиков.
|
||||
|
||||
|
||||
|
||||
|
||||
## Получить кошелёк фондов кооператива
|
||||
{{ get_sdk_doc("Queries", "Funds", "GetFunds") }} | {{ get_graphql_doc("Query.getFunds") }}
|
||||
|
||||
{{ get_typedoc_input("Queries.Funds.GetFunds") }}
|
||||
|
||||
Результат:
|
||||
|
||||
{{ get_typedoc_definition("Queries.Funds.GetFunds", "IOutput") }}
|
||||
|
||||
|
||||
## Создать фонд накопления
|
||||
{{ get_sdk_doc("Mutations", "Funds", "CreateAccumulationFund") }} | {{ get_graphql_doc("Mutation.createAccumulationFund") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.Funds.CreateAccumulationFund") }}
|
||||
|
||||
Результат:
|
||||
|
||||
{{ get_typedoc_definition("Mutations.Funds.CreateAccumulationFund", "IOutput") }}
|
||||
|
||||
|
||||
## Создать фонд списания
|
||||
{{ get_sdk_doc("Mutations", "Funds", "CreateExpenseFund") }} | {{ get_graphql_doc("Mutation.createExpenseFund") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.Funds.CreateExpenseFund") }}
|
||||
|
||||
Результат:
|
||||
|
||||
{{ get_typedoc_definition("Mutations.Funds.CreateExpenseFund", "IOutput") }}
|
||||
|
||||
|
||||
## Сгенерировать документ служебной записки
|
||||
{{ get_sdk_doc("Mutations", "Funds", "GenerateExpenditureMemo") }} | {{ get_graphql_doc("Mutation.generateExpenditureMemo") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.Funds.GenerateExpenditureMemo") }}
|
||||
|
||||
Результат:
|
||||
|
||||
{{ get_typedoc_definition("Mutations.Funds.GenerateExpenditureMemo", "IOutput") }}
|
||||
|
||||
|
||||
## Опубликовать служебную записку
|
||||
{{ get_sdk_doc("Mutations", "Funds", "PublishExpenditureMemo") }} | {{ get_graphql_doc("Mutation.publishExpenditureMemo") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.Funds.PublishExpenditureMemo") }}
|
||||
|
||||
Результат:
|
||||
|
||||
{{ get_typedoc_definition("Mutations.Funds.PublishExpenditureMemo", "IOutput") }}
|
||||
|
||||
После публикации служебной записки вопрос автоматически поступит в совет на голосование для принятия решения.
|
||||
|
||||
## Сгенерировать решение совета по записке
|
||||
{{ get_sdk_doc("Mutations", "Funds", "GenerateExpenditureMemoDecision") }} | {{ get_graphql_doc("Mutation.generateExpenditureMemoDecision") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.Funds.GenerateExpenditureMemoDecision") }}
|
||||
|
||||
Результат:
|
||||
|
||||
{{ get_typedoc_definition("Mutations.Funds.GenerateExpenditureMemoDecision", "IOutput") }}
|
||||
|
||||
После принятия решения об использовании средств остаточного фонда, `MONO` создаст объект исходящего платежа в пользу банковского счёта пайщика или погасит его образовавшуюся задолженность, если финансовые средства фактически были использованы до создания записки.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,128 @@
|
||||
MONO — это программный комплекс для управления кооперативом. Он может использоваться полностью, включая терминальные интерфейсы и их расширения, либо частично, когда MONO выполняет роль бэкенда для внешних интерфейсов взаимодействия с пайщиками.
|
||||
|
||||
Всё взаимодействие между компонентами MONO осуществляется через [GraphQL-API](/graphql). Он предоставляет язык запросов и среду их выполнения, позволяя клиентам запрашивать только необходимые данные и минимизируя избыточную передачу информации. Кроме того, единая схема API объединяет в себе все сервисы, включая запросы, мутации и подписки на данные как самого приложения MONO, так и всех подключенных расширений.
|
||||
|
||||
|
||||
## Преимущества
|
||||
|
||||
Язык запросов GraphQL-API позволяет уменьшить количество методов на бэкенде MONO для обработки информации, которые зачастную служат получению или обновлению информации о каком-нибудь узком аспекте одной рабочей сущности. Из-за чего количество методов в API растёт, как и программный код, который требуется для их обработки, а полезная нагрузка в каждом вызове API - падает. Программного кода становится всё больше - а пользы от него в каждом методе - всё меньше.
|
||||
|
||||
Язык [GraphQL-API](/graphql) позволяет сократить количество программного кода для обработки запросов на бэкенде MONO, а также, позволяет объединить все сервисы (включая сторонние) в одную конечную точку и одну динамичную документацию, которая составляется в реальном времени на основе структур объектов из программного кода. Так мы получаем возможность объединить в одной конечной точке все внутренние и внешние сервисы API, и использовать их в одной среде построения и выполнения запросов, даже если они написаны на разных языках программирования.
|
||||
|
||||
С помощью языка [GraphQL-API](/graphql) мы можем накладывать требования прав доступа не только на вызов отдельных методов запросов, мутаций и подписок, но и на конкретные поля, которые пользователь может запросить, обладая своим уровнем доступа. Так, один и тот же метод извлечения информации может использоваться пайщиком и председателем совета, однако, председатель совета может запросить большее количество полей, чем пайщик.
|
||||
|
||||
Кроме того, на сайтах и мобильных приложениях, для их реактивного быстродействия, важно уменьшить количество передаваемой информации до предела. [GraphQL-API](/graphql) позволяет это сделать, предоставляя разработчикам свободу выбирать только те поля с информацией для извлечения, которые им необходими для реализации текущей бизнес-задач прямо сейчас.
|
||||
|
||||
Также всё это означает, что для осуществления запросов, мутаций или подписок понадобится только один SDK-клиент, который реализует работу со схемами [GraphQL-API](/graphql). А все сервисы, которые будут доступны по [GraphQL-API](/graphql), автоматически будут доступны из SDK является авто-генерируемым на основании схем [GraphQL-API](/graphql). Это очень удобно и обеспечивает максимальный уровень типизации и связности данных.
|
||||
|
||||
И еще один аргумент почему [GraphQL-API](/graphql) - с ним нам нет необходимости держать отдельные технологии для обмена информацией в реальном времени. Используя подписки [GraphQL-API](/graphql), сервер MONO способен доставлять обновления без сторонней имплементации протокола WebSocket.
|
||||
|
||||
Получается, что [GraphQL-API](/graphql) - это всё в одном.
|
||||
|
||||
|
||||
## Как с этим работать
|
||||
|
||||
GraphQL — это язык запросов и среда выполнения, позволяющие клиентам получать только те данные, которые нужны, и тем самым снижать лишнюю передачу информации. В MONO все операции — чтение (queries), запись (mutations) и подписки (subscriptions) — описаны в единой схеме, доступной через GraphQL-API. Эта схема объединяет сервисы самого MONO и всех его расширений.
|
||||
|
||||
В GraphQL все входные и выходные данные описаны типами в схемах. Если у поля или аргумента есть ! (например, String!), значит это поле обязательное и не может быть null. Если в схеме просто String, значит поле необязательное. Благодаря такому типизированному описанию вы чётко знаете, какие данные ожидаются на вход и какие поля можно запросить на выходе.
|
||||
|
||||
|
||||
### Playground
|
||||
|
||||
Любой экземпляр MONO предоставляет GraphQL Playground по адресу:
|
||||
|
||||
```
|
||||
http://{{base}}:2998/v1/graphql
|
||||
```
|
||||
Playground - это визуальный инструмент, где вы пишете и тестируете запросы, мутации, подписки. Справа находится вкладка Docs. В ней перечислены все доступные типы, поля и операции, а также их описания и требования к ролям для выполнения.
|
||||
|
||||
Также, вся документация доступна по ссылке: [GraphQL-API](/graphql).
|
||||
|
||||
## Запросы
|
||||
|
||||
Например, мы хотим извлечь информацию об аккаунте с помощью запроса getAccount.
|
||||
|
||||
Ссылка на схему в документации {{get_graphql_doc("query.getAccount")}}
|
||||
|
||||
Запрос getAccount, согласно схеме, возвращает объект Account, в котором есть:
|
||||
|
||||
```
|
||||
username: String! — имя аккаунта кооператива
|
||||
blockchain_account: BlockchainAccount — системный аккаунт в блокчейне
|
||||
participant_account: ParticipantAccount — пайщик кооператива
|
||||
provider_account: MonoAccount — учётная запись провайдера
|
||||
user_account: UserAccount — пользовательский аккаунт кооперативной экономики
|
||||
```
|
||||
|
||||
|
||||
|
||||
Чтобы получить эти данные, в Playground можно написать:
|
||||
|
||||
```graphql
|
||||
query getAccountExample($username: String!) {
|
||||
getAccount(data: { username: $username }) {
|
||||
username
|
||||
blockchain_account {
|
||||
# Укажите нужные поля схемы
|
||||
}
|
||||
provider_account {
|
||||
# Укажите нужные поля схемы
|
||||
}
|
||||
participant_account {
|
||||
# Укажите нужные поля схемы
|
||||
}
|
||||
user_account {
|
||||
# Укажите нужные поля схемы
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
Во вкладке Query Variables задайте:
|
||||
|
||||
```
|
||||
{
|
||||
"username": "имя_аккаунта"
|
||||
}
|
||||
```
|
||||
|
||||
Запускаете запрос — и в ответе получите только те поля, которые запросили. Если появится ошибка о недостатке прав, убедитесь, что ваш пользователь имеет требуемую роль (например, chairman, member и т.п.).
|
||||
|
||||
## Мутации
|
||||
Для изменения или добавления данных GraphQL использует мутации. Например, мутация createDeposit создаёт объект платёжа паевого взноса. У мутации могут есть обязательные поля, которые тоже описаны в схеме.
|
||||
|
||||
Ссылка на схему в документации {{get_graphql_doc("mutation.createDeposit")}}
|
||||
|
||||
Пример:
|
||||
|
||||
```graphql
|
||||
mutation createDepositExample($username: String!, $quantity: String!) {
|
||||
createDeposit(data: {
|
||||
username: $username
|
||||
quantity: $quantity
|
||||
}) {
|
||||
id
|
||||
amount
|
||||
status
|
||||
data
|
||||
# любые другие поля Payment
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
И передаём переменные:
|
||||
```
|
||||
{
|
||||
"username": "voskhod",
|
||||
"quantity": "100.00 RUB"
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
Результат вернёт новый объект Payment. В схеме указано, какие поля там есть (например, id, amount, data, status).
|
||||
|
||||
|
||||
## Подписки
|
||||
Подписка на изменение тех или иных параметров системы осуществляется аналогично запросам и мутациям. Они позволяют получать обновления в реальном времени, например, когда статус платежа меняется. Структура подписки схожа с запросом, только начинается словом subscription.
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
MONO является клиентом ["Кооперативной Экономики"](https://coopenomics.world), и подключается к блокчейну COOPOS по API, и дополняет распределенную базу данных - централизованным хранилищем персональных данных пайщиков и их документов.
|
||||
|
||||
MONO запускается в выделенных копиях и подключается к собственной базе данных, что полностью исключает возможность любого пересечения приватных данных кооперативов. Все данные всех кооперативов в MONO - автономны и выделенны в свои подсистемы, что позволяет легко переносить их между облаками и собственными серверами, в случае возникновения такой необходимости.
|
||||
|
||||
Вся основная бизнес-логика, отвечающая за процессы кооперации, хранится в блокчейне ["Кооперативной Экономики"](https://coopenomics.world), который называется COOPOS - операционная система для кооперации. В цифровой среде COOPOS исполняются кооперативные смарт-контракты, реализующие сценарии кооперации согласно методологии [союза потребительских обществ "РУСЬ"](https://coopenomics.world).
|
||||
|
||||
Подключение к ["Кооперативной Экономике"](https://coopenomics.world) осуществляется оператором блокчейна COOPOS - Потребительским Кооперативом "ВОСХОД". Чтобы иметь возможность подключить MONO или другой экземпляр программного продукта к платформе ["Кооперативной Экономики"](https://coopenomics.world) к блокчейну COOPOS, кооперативу необходимо стать пайщиков ПК ВОСХОД и заключить соглашение на подключение к ["Кооперативной Экономике"](https://coopenomics.world) с ним.
|
||||
|
||||
Однако, поскольку блокчейн и смарт-контракты платформы ["Кооперативной Экономики"](https://coopenomics.world) распространяются по открытой лицензии и исходный код опубликован на ["Github"](https://https://github.com/coopenomics), то любой кооператив имеет техническую возможность запустить альтернативную платформу COOPOS и быть оператором на ней - в этом наша децентрализация.
|
||||
|
||||
!!! note "Подключение без оператора"
|
||||
Подключение к платформе без членства в кооперативе-операторе невозможно по той причине, что в рамках цифровой среды блокчейна ["Кооперативной Экономики"](https://coopenomics.world) используются утилити-токен AXON для учёта количества хранимой, обрабатываемой и передаваемой информации в каждом конкретном кооперативе, и оборот этих токенов легально допустим только в рамках ограниченного круга лиц кооперативного контура. За пределами этого контура начинается действие закона о Цифровых Финансовых Активах. А внутри кооперативного контура - этого закона для нас нет.
|
||||
|
||||
MONO представляет собой бэкенд с API и фронтенд с универсальным приложением, который мы называем терминал. Терминал осуществляет подключение конечного пользователя к платформе ["Кооперативной Экономики"](https://coopenomics.world) и предоставляет интерфейс с кнопками. При нажатии кнопок пользователем, сигнал поступает на бэкенд MONO по API, где в зависимисти от команды, производится проверка контроля прав доступа, и затем вызывается API платформы ["Кооперативной Экономики"](https://coopenomics.world), если это необходимо. Также, если необходимо, производится модификация вспомогательной базы данных кооператива - сохранение документов, информации о пайщиках, платежах, и т.д. и т.п.
|
||||
|
||||
Таким образом, MONO является программным посредником между блокчейн-платформой ["Кооперативной Экономики"](https://coopenomics.world) и конечным пользователем, обеспечивая для него реализацию кнопок в интерфейсе и набор вспомогательных программных средств, чтобы все эти кнопки работали на создание кооперативной выгоды для пайщиков, а совет кооператива - обладал всей полнотой необходимой информацией для принятия решений и дальнейшей отчетности по операциям кому угодно, если и когда это потребуется.
|
||||
@@ -1,16 +1,32 @@
|
||||
# Введение
|
||||
Добро пожаловать. Данный раздел создан для технических специалистов, которые принимают или планируют принять участие в строительстве кооперативной экономики. Здесь представлена общая техническая документация программного комплекса Цифрового Кошелька, необходимая для интеграций действующих продуктов и разработки новых на его основе.
|
||||
Добро пожаловать в раздел технической документации платформы MONO. Платформа MONO предназначена автоматизировать взаимоотношения между пайщиками и кооперативом в ["Кооперативной Экономике"](https://coopenomics.world), и предоставляет систему управления взаимоотношениями с пайщиками (SRM - Shareholder Relation Management).
|
||||
|
||||
Платформа MONO подключается к ["Кооперативной Экономике"](https://coopenomics.world), и предоставляет средства для автоматизированного сбора первичных документов, управления принятием решений членам совета кооператива, для генерации и цифровой подписи электронных документов, для просмотра и управления реестром пайщиков, платежей и всех произведенных документов кооператива.
|
||||
|
||||
Кроме того, MONO позволяет расширять базовый функционал взаимоотношений с пайщиками с помощью расширений витринами или утилитами, где каждая витрина - это доступ пайщиков к целевой потребительской программе, принятой в кооперативе, а утилита - это средство автоматизации для руководства кооператива.
|
||||
|
||||
|
||||
<!--
|
||||
## Как пользоваться документацией
|
||||
|
||||
Документация
|
||||
|
||||
позволяя расширять базовый функционал цифровыми целевыми потребительскими программами чер.
|
||||
|
||||
|
||||
{{ get_sdk_doc("Mutations", "Account", "DeleteAccount") }}
|
||||
|
||||
{{ get_graphql_doc("query-getAccount") }}
|
||||
|
||||
## Назначение
|
||||
Система предназначена автоматизировать документооборот в потребительских кооперативах посредством [кооперативных смарт-контрактов](/#-) и технологии блокчейн, реализующих принципы [методологии](/metodology) потребительской кооперации ["СПО РУСЬ"](https://союз-русь.рф/).
|
||||
Система предназначена автоматизировать документооборот в потребительских кооперативах посредством [кооперативных смарт-контрактов](/#-) и технологии блокчейн, реализующих принципы [методологии](/metodology) потребительской кооперации ["СПО РУСЬ"](https://союз-русь.рф/). -->
|
||||
|
||||
<!-- Запуская программный комплекс Цифрового Кошелька и подключаясь к Кооперативной Экономике, вы поддерживаете создание справедливого мира единого сознания без ссудного процента и циклических кризисов перепроизводства долга. [Подробнее](/). -->
|
||||
|
||||
## Компоненты
|
||||
Ниже представлены ссылки на низкоуровневую техническую документацию. Данный раздел, как и сам продукт Цифрового Кошелька, находится в разработке, поэтому, финализация документации в этом разделе пока преждевременна.
|
||||
<!-- ## Компоненты
|
||||
Ниже представлены ссылки на низкоуровневую техническую документацию. Данный раздел, как и сам продукт Цифрового Кошелька, находится в разработке, поэтому, финализация документации в этом разделе пока преждевременна. -->
|
||||
|
||||
<!-- [Смарт-контракты](#){ .md-button .md-button--primary } [Блокчейн](#){ .md-button .md-button--primary } [API](#){ .md-button .md-button--primary } [Библиотека типов](#){ .md-button .md-button--primary } [Генератор документов](#){ .md-button .md-button--primary } -->
|
||||
|
||||
<!--
|
||||
<div class="grid cards" markdown>
|
||||
|
||||
- __Операционная система__
|
||||
@@ -47,11 +63,11 @@
|
||||
|
||||
Основной бэкенд-сервис, представляющий систему авторизации для доступа к документам кооператива и инструментам управления им.
|
||||
|
||||
[:octicons-arrow-right-24: Подробнее](/coopback)
|
||||
[:octicons-arrow-right-24: Подробнее](/graphql)
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
|
||||
<!--
|
||||
@@ -0,0 +1,54 @@
|
||||
# Полный установка
|
||||
|
||||
Для старта MONO склонируйте репозиторий:
|
||||
|
||||
```
|
||||
git clone https://github.com/coopenomics/mono
|
||||
```
|
||||
|
||||
Выполните установку пакетов:
|
||||
|
||||
```
|
||||
cd mono
|
||||
pnpm install
|
||||
```
|
||||
|
||||
Скопируйте конфигурационный файл бэкенда:
|
||||
|
||||
```
|
||||
cp components/coopback/.env-example components/coopback/.env
|
||||
```
|
||||
|
||||
Скопируйте конфигурационный файл фронтенда:
|
||||
|
||||
```
|
||||
cp components/terminal/src/config/Env.ts components/terminal/src/config/Env.ts
|
||||
```
|
||||
|
||||
Скопируйте конфигурационный файл парсера:
|
||||
```
|
||||
cp components/cooparser/.env-example components/cooparser/.env
|
||||
```
|
||||
|
||||
Настройте переменные окружения во всех скопированных конфигурационных файлах.
|
||||
|
||||
!!! note ""
|
||||
При подключении к тестовой среде использовать следующие конечные точки блокчейна: https://api-testnet.coopenomics.world, при работе с производственной сетью: https://api.coopenomics.world
|
||||
|
||||
|
||||
После конфигурации произведите сборку MONO из корня:
|
||||
|
||||
```
|
||||
pnpm run build
|
||||
```
|
||||
|
||||
И выполните запуск MONO:
|
||||
```
|
||||
pnpm run dev
|
||||
```
|
||||
|
||||
|
||||
После запуска приложение бэкенда будет доступно на localhost:2998, приложение фронтенда на localhost:3005. Парсер блокчейна начнёт обработку блоков и откроет свой API для извлечения исторических данных на localhost:4000.
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,226 @@
|
||||
Пайщик - это пользователь, у которого есть принадлежащий ему объект аккаунта пайщика {{ get_graphql_definition("ParticipantAccount") }}, содержащий информацию о его членстве в кооперативе. Аккаунт пайщика выдаётся кооперативом, при прохождении полной процедуры регистрации пайщика, или при добавлении ранее зарегистрированного пайщика в систему.
|
||||
|
||||
|
||||
|
||||
<!-- Для генерации заявления должна использоваться собственноручная подпись пайщика в формате png, закодированная в base64. В мета-данных заявления должны присутствовать ссылки на хэши 4 подписанных соглашений. После генерации заявления с ссылками на соглашения и валидной собственноручной подписью, на заявление накладывается цифровая подпись пайщика. -->
|
||||
|
||||
|
||||
## Регистрация пайщика
|
||||
|
||||
Аккаунт пайщика {{ get_graphql_definition("ParticipantAccount") }} выдаётся пользователю смарт-контрактом при прохождении полной процедуры регистрации пайщика. После завершения процедуры аккаунт пайщика будет доступен в объекте {{ get_graphql_definition("Account") }} -> {{ get_graphql_definition("ParticipantAccount") }} при [получении аккаунта пользователя](/documentation/accounts/#get-account).
|
||||
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
autonumber
|
||||
participant U as Пользователь
|
||||
participant SDK as SDK
|
||||
participant SYS as Блокчейн
|
||||
participant GOV as Совет Кооператива
|
||||
|
||||
Note over U,SYS: Общий процесс регистрации пайщика
|
||||
|
||||
U->>SDK: Регистрация аккаунта
|
||||
SDK->>SYS: Проверка мажоритарности кооператива
|
||||
|
||||
alt Кооператив мажоритарен
|
||||
U->>SDK: Выбор кооперативного участка
|
||||
else
|
||||
Note over U,SYS: Участок не требуется
|
||||
end
|
||||
|
||||
U->>SDK: Предгенерация 4х соглашений и заявления на вступление
|
||||
SDK->>U: Отображение документов
|
||||
U->>SDK: Приём собственноручной подписи
|
||||
U->>SDK: Генерация заявления с собственнручной подписью
|
||||
SDK->>U: Заявление с собственноручной подписью
|
||||
U->>SDK: Цифровая подпись пакета документов
|
||||
|
||||
SDK->>SYS: Отправка пакета документов
|
||||
U->>SDK: Оплата вступительного и паевого взноса
|
||||
SDK->>SYS: Подтверждение оплаты
|
||||
|
||||
SYS->>GOV: Вынесение вопроса в повестку
|
||||
GOV->>SYS: Решение совета
|
||||
SYS->>U: Уведомление о принятии в кооператив
|
||||
|
||||
|
||||
```
|
||||
|
||||
### 1. Регистрация аккаунта
|
||||
|
||||
Пользователь заполняет форму и регистрирует аккаунт провайдера, как это описано в разделе [Регистрация Аккаунта](/documentation/accounts/#register-account).
|
||||
|
||||
### 2. Выбор кооперативного участка
|
||||
|
||||
Пользователю необходимо выбрать кооперативный участок в том случае, если кооператив перешёл на мажоритарную систему управления, организовав `>= 3` кооперативных участков в своём кооперативе. В случае, если кооператив - мажоритарен, пользователю потребуется предоставить выбор идентификатора кооперативного участка, председателю которого он делегирует свой голос на общих собраниях.
|
||||
|
||||
Для того, чтобы выяснить, является ли кооператив мажоритарным, необходимо [извлечь объект системной информации SystemInfo](/documentation/system), обратиться в нём к {{ get_graphql_definition("CooperativeOperatorAccount") }}, и извлечь булево свойство `is_branched`.
|
||||
|
||||
Значение `true` в `is_branched` означает, что кооператив - мажоритарный, и пайщику при регистрации будет необходимо предоставить идентификатор имени кооперативного участка, иначе, регистрация пайщика будет отклонена. Извлечение списка кооперативных участков описано в разделе [Получить Кооперативные Участки](/documentation/branches). Для отправки последующей отправки документов на регистрацию пайщика, потребуется выбрать из списка параметр `braname` - имя аккаунта кооперативного участка, при котором регистрируется пайщик.
|
||||
|
||||
<!-- TODO подправить ссылку выше после добавления раздела -->
|
||||
|
||||
### 3. Предгенерация документов
|
||||
Для того, чтобы сгенерировать пайщику персональное заявление на вступление и все сопутствующие соглашения, и показать их ему в том виде, в котором он будет подписывать, необходимо произвести предгенерацию пакета документов.
|
||||
|
||||
<a id="pregeneration-applicaion"></a>
|
||||
#### Заявление на вступление
|
||||
{{ get_sdk_doc("Mutations", "Participants", "GenerateApplication") }} | {{ get_graphql_doc("Mutation.generateParticipantApplication") }}
|
||||
|
||||
Мутация для генерации заявления на вступление пайщика в кооператив вызывается с параметром signature, который может быть пустым для пред-генерации, или содержать png изображение подписи в кодировке base64 для основной генерации. Массив links будет пустым для пред-генерации, но обязательно должен содержать хэши 4-х соглашений для основной генерации.
|
||||
|
||||
{{ get_typedoc_desc("Mutations.Participants.GenerateApplication") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.Decisions.GenerateApplication") }}
|
||||
|
||||
|
||||
#### Соглашение о ЦПП "Цифровой Кошелёк"
|
||||
{{ get_sdk_doc("Mutations", "Agreements", "GenerateWalletAgreement") }} | {{ get_graphql_doc("Mutation.generateWalletAgreement") }}
|
||||
|
||||
{{ get_typedoc_desc("Mutations.Agreements.GenerateWalletAgreement") }}
|
||||
|
||||
#### Соглашение о простой электронной подписи
|
||||
{{ get_sdk_doc("Mutations", "Agreements", "GenerateSignatureAgreement") }} | {{ get_graphql_doc("Mutation.generateSignatureAgreement") }}
|
||||
|
||||
{{ get_typedoc_desc("Mutations.Agreements.GenerateSignatureAgreement") }}
|
||||
|
||||
#### Пользовательское соглашение
|
||||
{{ get_sdk_doc("Mutations", "Agreements", "GenerateUserAgreement") }} | {{ get_graphql_doc("Mutation.generateUserAgreement") }}
|
||||
|
||||
{{ get_typedoc_desc("Mutations.Agreements.GenerateUserAgreement") }}
|
||||
|
||||
#### Согласие с политикой конфиденциальности
|
||||
{{ get_sdk_doc("Mutations", "Agreements", "GeneratePrivacyAgreement") }} | {{ get_graphql_doc("Mutation.generatePrivacyAgreement") }}
|
||||
|
||||
{{ get_typedoc_desc("Mutations.Agreements.GeneratePrivacyAgreement") }}
|
||||
|
||||
В результате предгенерации будет получены объекты с документами, которые могут быть продемонстрированы пользователю перед запросом его собственноручной подписи. Кроме того, предгенерация необходима, чтобы криптографически связать заявление на вступление с соглашениями на этапе основной генерации после получения собственноручной подписи.
|
||||
|
||||
|
||||
### 4. Собственноручная подпись
|
||||
Для получения собственноручной подписи пользователя используется вспомогательный набор методов {{ get_sdk_doc("Methods", "Canvas") }}. Для начала процесса получения собственноручной подписи необходимо создать область для подписи с помощью `Canvas.createCanvas()`, передав `id` элемента `div`, в котором будет размещен `canvas`.
|
||||
|
||||
```ts
|
||||
import { Methods } from '@coopenomics/sdk'
|
||||
|
||||
//создаём canvas в контейнере signature-area
|
||||
const container = document.getElementById('signature-area') as HTMLElement
|
||||
const { canvas, ctx } = Methods.Canvas.createCanvas(container, 500, 300)
|
||||
```
|
||||
|
||||
После чего, необходимо подписаться на события и вызывать методы для рисования:
|
||||
|
||||
```ts
|
||||
|
||||
//создаём объект состояния
|
||||
const drawingState: Methods.Canvas.DrawingState = { drawing: false, lastX: 0, lastY: 0 }
|
||||
|
||||
//подписка на нажатие
|
||||
canvas.addEventListener('mousedown', (e) => Methods.Canvas.startDrawing(e, canvas, drawingState))
|
||||
//подписка на движение
|
||||
canvas.addEventListener('mousemove', (e) => Methods.Canvas.draw(e, canvas, ctx, drawingState))
|
||||
//подписка на отжатие
|
||||
canvas.addEventListener('mouseup', () => Methods.Canvas.endDrawing(drawingState))
|
||||
```
|
||||
|
||||
После завершения процесса собственноручной подписи, необходимо извлечь её методом {{ get_sdk_doc("Methods", "Canvas", "getSignature") }} и, при необходимости, очистить область с {{ get_sdk_doc("Methods", "Canvas", "clearCanvas") }}.
|
||||
|
||||
```ts
|
||||
const signature = Methods.Canvas.getSignature(canvas)
|
||||
Methods.Canvas.clearCanvas(canvas, ctx)
|
||||
//console.log(signature) // "data:image/png;base64,iVBORw0..."
|
||||
```
|
||||
|
||||
В результате, у вас будет строковое представление изображения собственноручной подписи пользователя, которое теперь необходимо использовать на основной генерации заявления на вступление в кооператив.
|
||||
|
||||
### 5. Генерация заявления
|
||||
{{ get_sdk_doc("Mutations", "Participants", "GenerateApplication") }} | {{ get_graphql_doc("Mutation.generateApplication") }}
|
||||
|
||||
Основная генерация заявления производится аналогично [предгенерации](/documentation/participants/pregeneration-applicaion), однако, в `signature` необходимо передать полученную ранее собственноручную подпись, а в массиве `links` указать хэши всех ранее сгенерированных соглашений.
|
||||
|
||||
```typescript
|
||||
const variables: Mutations.Participants.GenerateApplication.IInput = {
|
||||
data: {
|
||||
singature: <полученная ранее строка с изображением подписи в png/base64>,
|
||||
links: [participantApplication.hash, signatureAgreement.hash, userAgreement.hash, privacyAgreement.hash]
|
||||
username: <имя аккаунта пользователя>,
|
||||
coopname: <имя аккаунта кооператива>
|
||||
}
|
||||
|
||||
const { [Mutations.Participants.GenerateApplication.name]: participantApplication2 } = await client.Mutation(
|
||||
Mutations.Participants.GenerateApplication.mutation,
|
||||
{
|
||||
variables,
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
```
|
||||
|
||||
В результате исполнения мутации будет возвращён объект заявления, который сгенерирован с применением его собственноручной подписи. Все документы будут сохранены в MONO и криптографически связаны с пользователем, между собой, и его собственноручной подписью.
|
||||
|
||||
|
||||
|
||||
### 5. Подпись документов
|
||||
|
||||
Теперь у нас есть полный пакет документов: 4 соглашения с этапа пред-генерации и 1 заявление с предыдущего этапа, которое включает собственноручную подпись пользователя и хэш-ссылки на соглашения.
|
||||
|
||||
Теперь необходимо подписать все эти 5 документов. Цифровая подпись осуществляется методом класса {{ get_class_doc("Wallet", "signDocument") }}, активный инстанс которого есть в SDK-клиенте. Вы можете использовать `client.Wallet.signDocument(doc)` на действующем экземпляре клиента или создать новый экземпляр класса Wallet, импортировав его из SDK:
|
||||
|
||||
```ts
|
||||
//или используем существующий инстанс кошелька в клиенте
|
||||
client.Wallet.setWif(username, wif)
|
||||
|
||||
//последовательно подписываем все документы:
|
||||
const signedSignatureAgreement = client.Wallet.signDocument(signatureAgreement)
|
||||
const signedUserAgreement = client.Wallet.signDocument(userAgreement)
|
||||
const signedWalletAgreement = client.Wallet.signDocument(walletAgreement)
|
||||
const signedPrivacyAgreement = client.Wallet.signDocument(privacyAgreement)
|
||||
const signedParticipantApplication = client.Wallet.signDocument(participantApplication2)
|
||||
```
|
||||
|
||||
Для успешной подписи документов в SDK-клиенте должен быть [установлен](/documentation/auth/#about-auth) приватный ключ. В результате, каждый документ будет подписан подготовлен к отправке приведением к необходимому формату.
|
||||
|
||||
|
||||
### 6. Отправка документов
|
||||
{{ get_sdk_doc("Mutations", "Participants", "RegisterParticipant") }} | {{ get_graphql_doc("Mutation.registerParticipant") }}
|
||||
|
||||
Регистрация пайщика производится мутацией RegisterParticipant с передачей подписанного заявления и соглашений. Отправленный пакет документов сохраняется в MONO для пользователя и ожидает поступления оплаты взносов перед отправкой в совет на голосование.
|
||||
|
||||
{{ get_typedoc_input("Mutations.Participants.RegisterParticipant") }}
|
||||
|
||||
|
||||
### 7. Оплата взносов
|
||||
|
||||
{{ get_sdk_doc("Mutations", "Payments", "CreateInitial") }} | {{ get_graphql_doc("Mutation.createInitial") }}
|
||||
|
||||
Перед тем, как принятые документы будут отправлены в повестку совета на голосование, новому пайщику необходимо оплатить вступительный и минимальный паевый взносы (одним платежом).
|
||||
|
||||
{{ get_typedoc_desc("Mutations.Payments.CreateInitial") }}
|
||||
|
||||
Подробнее о доступных платежных провайдерах и управлении платежами смотри раздел [Платежи](/documentation/payments). После получения подтверждения о поступлении платежа (статус платежа `PAID`), пользователю будет зарегистрирован аккаунт в блокчейне, а пакет документов пайщика поставлен в повестку голосования совета кооператива.
|
||||
|
||||
### 8. Получение решения совета
|
||||
|
||||
После поступления платежа вопрос добавляется в повестку голосования совета, где каждый член совета голосует за решение о приёме нового пайщика, а председатель - утверждает это решение. Процесс принятия решения советом описан в разделе [Решения](/documentation/decisions).
|
||||
|
||||
После того, как совет примет решение, оно будет автоматически исполнено: обновятся все реестры, будут созданы счета, открыты кошельки и т.д., а пользователь получит уведомление на электронную почту о том, что он принят в кооператив. С этого момента он является пайщиком, обладает объектом {{ get_graphql_definition("ParticipantAccount") }} в {{ get_graphql_definition("Account") }}, и может участвовать во всех целевых потребительских программах кооператива.
|
||||
|
||||
|
||||
## Добавление пайщика
|
||||
{{ get_sdk_doc("Mutations", "Participants", "AddParticipant") }} | {{ get_graphql_doc("Mutation.addParticipant") }}
|
||||
|
||||
Иногда необходимо добавить в цифровую систему уже действующего пайщика кооператива. В таком случае, нам не нужно проводить регистрацию пайщика по полному процессу, а достаточно сразу добавить его в систему.
|
||||
|
||||
|
||||
!!!danger ""
|
||||
Данная мутация должна использоваться `ТОГДА И ТОЛЬКО ТОГДА`, когда решение совета кооператива уже принято и оформлено в `бумажном` протоколе, а пайщик фактически совершил взносы в кооператив. Т.е. юридически пользователь уже является пайщиком кооператива и его необходимо только добавить в систему, переведя взаимоотношения с ним в цифровую форму.
|
||||
<!-- Использование данной мутации без наличия `бумажного` протокола решения собрания совета и оплаченных взносов пайщика, может привести к аннулированию им всех операций на платформе через суд. -->
|
||||
|
||||
{{ get_typedoc_desc("Mutations.Participants.AddParticipant") }}
|
||||
|
||||
В результате исполнения мутации, пайщик будет добавлен в кооператив, а ему на электронную почту выслано приглашение на получение приватного ключа доступа к системе. Воспользовавшись им, он сможет войти в систему.
|
||||
|
||||
Однако, для получения полной функциональности, ему необходимо предоставить 4 базовых подписанных соглашения, как это описано в разделе [Соглашения](/documentation/agreements). Без наличия подписанных соглашений, функционал платформы для него может быть ограничен.
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
Метод платежа - это реквизиты, по которым кооператив совершает возвраты взносов пайщику.
|
||||
|
||||
## Получить список методов платежа
|
||||
{{ get_sdk_doc("Queries", "PaymentMethods", "GetPaymentMethods") }} | {{ get_graphql_doc("Query.getPaymentMethods") }}
|
||||
|
||||
{{ get_typedoc_input("Queries.PaymentMethods.GetPaymentMethods") }}
|
||||
|
||||
Результат:
|
||||
|
||||
{{ get_typedoc_definition("Queries.PaymentMethods.GetPaymentMethods", "IOutput") }}
|
||||
|
||||
|
||||
## Добавить банковский счёт
|
||||
{{ get_sdk_doc("Mutations", "PaymentMethods", "CreateBankAccount") }} | {{ get_graphql_doc("Mutation.createBankAccount") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.PaymentMethods.CreateBankAccount") }}
|
||||
|
||||
Результат:
|
||||
|
||||
{{ get_typedoc_definition("Mutations.PaymentMethods.CreateBankAccount", "IOutput") }}
|
||||
|
||||
|
||||
## Удалить метод платежа
|
||||
{{ get_sdk_doc("Mutations", "PaymentMethods", "DeletePaymentMethod") }} | {{ get_graphql_doc("Mutation.deletePaymentMethod") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.PaymentMethods.DeletePaymentMethod") }}
|
||||
|
||||
Результат:
|
||||
|
||||
{{ get_typedoc_definition("Mutations.PaymentMethods.DeletePaymentMethod", "IOutput") }}
|
||||
|
||||
## Обновить банковский счёт
|
||||
{{ get_sdk_doc("Mutations", "PaymentMethods", "UpdateBankAccount") }} | {{ get_graphql_doc("Mutation.updateBankAccount") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.PaymentMethods.UpdateBankAccount") }}
|
||||
|
||||
Результат:
|
||||
|
||||
{{ get_typedoc_definition("Mutations.PaymentMethods.UpdateBankAccount", "IOutput") }}
|
||||
|
||||
@@ -0,0 +1,125 @@
|
||||
## Типы взносов
|
||||
|
||||
[Кошельки](/documentation/wallet) управляют учётом взносов пайщиков на их лицевых счетах и фондах кооператива. Когда пайщик совершает взнос - это фиксируются на счетах в [кошельке](/documentation/wallet) пайщика и [фондах](/documentation/funds) кооператива.
|
||||
|
||||
Взносы бывают: `вступительные`, `паевые`, `членские`.
|
||||
|
||||
Вступительный взнос оплачивается пайщиком однократно при вступлении в кооператив.
|
||||
|
||||
Паевые взносы совершают пайщики, чтобы затем получить возврат паевого взноса с выгодой в качестве удовлетворения потребности.
|
||||
|
||||
Членские взносы берутся при участии в целевых потребительских программах в фиксированной сумме или как % от суммы паевого взноса, и используются для пополнения [невозвратных фондов](/documentation/funds) кооператива. Подробнее о членских взносах смотри разделы [Фондов](/documentation/funds) и [Программ](/documentation/programs).
|
||||
|
||||
`Вступительные` и `Паевые` взносы принимаются через совершение `Платежа`. Приём паевых взносов не ограничивается только платежами, и может осуществляться любым имуществом, но это выходит за описание данного раздела.
|
||||
|
||||
## Платежи
|
||||
|
||||
`Платеж` - это информационное сообщение, которое порождается, обрабатывается и преобразуется платежным провайдером и советом во взнос. Платеж создаётся и обрабатывается провайдером платежей на основании поручения пользователя, а взносы принимаются и обрабатываются смарт-контрактами после успешного получения платежа.
|
||||
|
||||
|
||||
```mermaid
|
||||
flowchart TB
|
||||
%% Определение платежей
|
||||
REG_PAYMENT["Регистрационный платеж"]
|
||||
SHARE_PAYMENT["Паевой платеж"]
|
||||
REFUND_PAYMENT["Платеж возврата"]
|
||||
SHARE_REFUND["Возврат паевого взноса"]
|
||||
|
||||
%% Взносы
|
||||
ENTRY_FEE["Вступительный взнос"]
|
||||
MIN_SHARE["Минимальный паевой взнос"]
|
||||
SHARE_CONTRIBUTION["Паевой взнос"]
|
||||
|
||||
%% Связи
|
||||
REG_PAYMENT --> ENTRY_FEE
|
||||
REG_PAYMENT --> MIN_SHARE
|
||||
SHARE_PAYMENT --> SHARE_CONTRIBUTION
|
||||
|
||||
%% Добавленные блоки
|
||||
SHARE_REFUND --> REFUND_PAYMENT
|
||||
|
||||
%% Цветовые стили (платежи выделены красным, шрифт принудительно чёрный)
|
||||
style REG_PAYMENT stroke:#ff6666,stroke-width:2px
|
||||
style SHARE_PAYMENT stroke:#ff6666,stroke-width:2px
|
||||
style REFUND_PAYMENT stroke:#ff6666,stroke-width:2px
|
||||
|
||||
```
|
||||
|
||||
Платежи обладают суммой и типом. В системе предусмотрено два типа платежей: регистрационные и паевые. Регистрационные платежи порождают одновременно два типа взносов: вступительный и минимальный паевый взносы, которые требуются совершить при регистрации нового пайщика.
|
||||
|
||||
Вступительный взнос направляется в фонд кооператива для дальнейшего списания на расходы и хранится там до принятия советом соответствующего решения на списание. Минимальный паевый взнос помещается в кошелёк пайщика и паевый фонд кооператива. Причина же, почему эти взносы вообще появились - это успешный `регистрационный платеж`.
|
||||
|
||||
Кроме `регистрационного платежа`, который порождает вступительный и минимальные паевые взносы для регистрации пайщика, в системе существуют `паевые платежи`, которые после успешной обработки добавляются в кошелёк пайщика и увеличивают паевый фонд кооператива.
|
||||
|
||||
Паевые взносы отображаются в [Кошельке](/documentation/wallet) и могут быть использованы в [Целевых Программах](/documentation/programs) для удовлетворения потребностей пайщиков кооператива. При использовании паевых средств в [Целевых Программах](/documentation/programs) могут взыматься членские взносы, размер которых определяется условиями программы.
|
||||
|
||||
Все паевые взносы безусловно возвратные и должны быть возвращены кооперативом по требованию пайщика в границах баланса его паевого счёта. Минимальный паевый взнос, при этом, возвращается при выходе пайщика из кооператива. Управление возвратами паевых взносов производится смарт-контрактами, на основе которых бэкенд MONO создаёт `платежи возврата`, которые обрабатываются администрацией кооператива.
|
||||
|
||||
Подробнее о методологии кооперации смотри на сайте платформы "[Кооперативная Экономика](https://coopenomics.world). Здесь же нам важен принцип - платежи порождают взносы. Платежи обрабатываются платежными провайдерами, а взносы - смарт-контрактами.
|
||||
|
||||
|
||||
## Платежные провайдеры
|
||||
|
||||
Подключение платежных провайдеров производится через установку и конфигурацию [расширений](/documentation/extensions). Получить список подключенных провайдеров с их идентификаторами возможно с помощью запроса [getPaymentProviders](/documentation/payments/get-payment-providers)
|
||||
<!--
|
||||
__Дефолтный провайдер__: `qrpay` - оплата по QR-коду.
|
||||
|
||||
__Опциональный провайдер__: `yookassa` - оплата через сервис виджета [Yookassa](https://yookassa.ru)
|
||||
-->
|
||||
|
||||
Каждый провайдер умеет по-своему создавать платежи и обрабатывать платежи. Количество платежных провайдеров в системе не ограничено. Какие конкретно провайдеры подключены в конкретном кооперативе - определяет сам кооператив с помощью установки [расширений](/documentation/extensions).
|
||||
|
||||
|
||||
Например, провайдер `qrpay` возвращает в `result.data` строку с реквизитами в формате, который при пребразовании в QR-код и его сканировании банковским приложением, распознаётся им и приводит к автоматическому заполнению полей реквизитов и суммы для оплаты. Обработка платежа производится "вручную" через изменение администратором статуса платежа.
|
||||
|
||||
Провайдер `yookassa` (если подключен и настроен) возвращает токен платежа `confirmation_token` в `result.data`, который может быть пребразован в [платежный виджет](https://yookassa.ru/developers/payment-acceptance/integration-scenarios/widget/quick-start#preparation-pages) и встроен в сайт для приёма платежей. Обработка происходит автоматически при поступлении оповещения от Yookassa на бэкенд MONO.
|
||||
|
||||
<a id="get-payment-providers"></a>
|
||||
## Список активных провайдеров
|
||||
{{ get_sdk_doc("Queries", "Payments", "GetPaymentProviders") }} | {{ get_graphql_doc("Query.getPaymentProviders") }}
|
||||
|
||||
Запрос по извлечению списка провайдеров возвращает идентификаторы провайдеров и схемы их данных.
|
||||
|
||||
## Вступительный и минимальный паевой взносы
|
||||
{{ get_sdk_doc("Mutations", "Payments", "CreateInitialPayment") }} | {{ get_graphql_doc("Mutation.createInitialPayment") }}
|
||||
|
||||
В процессе [регистрации пайщика](/documentation/participants) необходимо совершить вступительный и минимальный паевый взносы, выполнив регистрационный платеж. Для создания регистрационного платежа необходимо вызвать мутацию CreateInitialPayment.
|
||||
|
||||
{{ get_typedoc_desc("Mutations.Payments.CreateInitialPayment") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.Payments.CreateInitialPayment") }}
|
||||
|
||||
|
||||
## Паевый взнос
|
||||
{{ get_sdk_doc("Mutations", "Payments", "CreateDepositPayment") }} | {{ get_graphql_doc("Mutation.createDepositPayment") }}
|
||||
|
||||
{{ get_typedoc_desc("Mutations.Payments.CreateDepositPayment") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.Payments.CreateDepositPayment") }}
|
||||
|
||||
|
||||
## Список платежей
|
||||
{{ get_sdk_doc("Queries", "Payments", "GetPayments") }} | {{ get_graphql_doc("Query.getPayments") }}
|
||||
|
||||
{{ get_typedoc_desc("Queries.Payments.GetPayments") }}
|
||||
|
||||
{{ get_typedoc_input("Queries.Payments.GetPayments") }}
|
||||
|
||||
|
||||
## Платеж возврата
|
||||
{{ get_sdk_doc("Mutations", "Payments", "CreateWithdraw") }} | {{ get_graphql_doc("Mutation.createWithdraw") }}
|
||||
|
||||
{{ get_typedoc_desc("Mutations.Payments.CreateWithdraw") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.Payments.CreateWithdraw") }}
|
||||
|
||||
|
||||
|
||||
## Управление платежами
|
||||
{{ get_sdk_doc("Mutations", "Payments", "SetPaymentStatus") }} | {{ get_graphql_doc("Mutation.setPaymentStatus") }}
|
||||
|
||||
{{ get_typedoc_desc("Mutations.Payments.SetPaymentStatus") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.Payments.SetPaymentStatus") }}
|
||||
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
Целевые потребительские программы — это организованные кооперативом механизмы коллективного потребления, направленные на удовлетворение конкретных потребностей пайщиков. Они основаны на совместном финансировании, коллективных закупках или иных формах кооперации, обеспечивающих доступ к товарам, услугам или ресурсам на более выгодных условиях. Программы могут охватывать различные сферы, такие как жильё, транспорт, образование, здравоохранение, страхование и другие направления, способствуя повышению уровня жизни пайщиков за счёт объединения их ресурсов и интересов.
|
||||
|
||||
На платформе [Кооперативной Экономики](https://coopenomics.world) все целевые потребительские программы стандартизированы и связаны со смарт-контрактами, которые поддерживают их корректное исполнение согласно правил и положений программы. Непосредственными управлениями взносами и возвратами взносов управляют смарт-контракты, которые применяют данную целевую программу и подключены к ней. Каждый из них реализует свою логику реализации механизмов кооперации, но все они применяют общий способ расчёта стоимости участия в программе, который указан в объекте программы при её создании в кооперативе.
|
||||
|
||||
Кооператив может создавать целевые программы по шаблонам и использовать их в [Расширениях](/documentation/extensions) при использовании [Витрин](/documentation/extensions). При подключении какой-либо [Витрины](/documentation/extensions) потребуется указать параметры целевой потребительской программы, по которой она будет функционировать.
|
||||
|
||||
При создании целевой потребительской программы в кооперативе используется идентификатор шаблона стандартизированной целевой потребительской программы, описания программы для отображения на ветринах, а также, информация о способе расчёта членских взносов при участии в ней.
|
||||
|
||||
|
||||
## Получить программы
|
||||
{{ get_sdk_doc("Queries", "Programs", "GetPrograms") }} | {{ get_graphql_doc("Query.getPrograms") }}
|
||||
|
||||
{{ get_typedoc_input("Queries.Programs.GetPrograms") }}
|
||||
|
||||
Результат:
|
||||
|
||||
{{ get_typedoc_definition("Queries.Programs.GetPrograms", "IOutput") }}
|
||||
|
||||
## Создать программу
|
||||
{{ get_sdk_doc("Mutations", "Programs", "CreateProgram") }} | {{ get_graphql_doc("Mutation.createProgram") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.Programs.CreateProgram") }}
|
||||
|
||||
Результат:
|
||||
|
||||
{{ get_typedoc_definition("Mutations.Programs.CreateProgram", "IOutput") }}
|
||||
|
||||
|
||||
## Обновить программу
|
||||
{{ get_sdk_doc("Mutations", "Programs", "UpdateProgram") }} | {{ get_graphql_doc("Mutation.updateProgram") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.Programs.UpdateProgram") }}
|
||||
|
||||
Результат:
|
||||
|
||||
{{ get_typedoc_definition("Mutations.Programs.UpdateProgram", "IOutput") }}
|
||||
|
||||
## Остановить программу
|
||||
{{ get_sdk_doc("Mutations", "Programs", "StopProgram") }} | {{ get_graphql_doc("Mutation.stopProgram") }}
|
||||
|
||||
{{ get_typedoc_input("Mutations.Programs.StopProgram") }}
|
||||
|
||||
Результат:
|
||||
|
||||
{{ get_typedoc_definition("Mutations.Programs.StopProgram", "IOutput") }}
|
||||
|
||||
@@ -0,0 +1,132 @@
|
||||
Для удобства разработки доступен [SDK-клиент](/sdk), который обеспечивает удобный программный доступ к запросам, мутациям и подпискам [GraphQL-API](/graphql) с типизацией входных и выходных данных на TypeScript. Он упрощает программное взаимодействие с MONO, делая интеграцию максимально простой. В настоящий момент [SDK-клиент](/sdk) доступен только на TypeScript. Если ваш проект использует другой язык, вам потребуется обратиться к документации [GraphQL-API](/graphql) и создать собственный клиент на основе предоставленных схем данных.
|
||||
|
||||
[SDK](/sdk) реализует структурированное пространство имён запросов, мутаций, подписок, и классов, необходимых для взаимодействия с `MONO`. Основная цель SDK - предоставить инструменты для разработчиков, которые предельно упростят интеграцию с `MONO` и [Кооперативной Экономикой](https://coopenomics.world).
|
||||
|
||||
[SDK](/sdk) основан на гененаторе [GraphQL-Zeus](https://github.com/graphql-editor/graphql-zeus), который на основании схемы данных [GraphQL-API](/graphql) генерирует типизированный клиент доступа, упрощающий разработку и интеграцию с `MONO`.
|
||||
|
||||
## Как пользоваться
|
||||
|
||||
Для начала, нам потребуется подключенный к `MONO` клиент:
|
||||
|
||||
```ts
|
||||
import { createClient } from '@coopenomics/sdk'
|
||||
|
||||
// создаём клиента
|
||||
const client = createClient({
|
||||
api_url: "http://127.0.0.1:2998/v1/graphql", //адрес MONO GraphQL-API
|
||||
chain_url: "https://api.coopenomics.world", //адрес конечной точки блокчейна
|
||||
chain_id: "6e37f9ac0f0ea717bfdbf57d1dd5d7f0e2d773227d9659a63bbf86eec0326c1b", //идентификатор цепочки публичной сети
|
||||
});
|
||||
|
||||
```
|
||||
|
||||
Созданный клиент обладает встроенными фабриками для вызова мутаций, запросов, и подписок в `MONO`, а также, методами для работы с блокчейном и цифровой подписью.
|
||||
|
||||
Для аудентификации клиента необходимо токен доступа через вызов метода:
|
||||
|
||||
```ts
|
||||
client.setToken(<token>)
|
||||
```
|
||||
|
||||
Подробнее о получении токенов доступа смотри раздел [Аудентификация](/documentation/auth).
|
||||
|
||||
|
||||
### Запросы
|
||||
Для того, чтобы создать запрос на получение информации из `MONO`, необходимо извлечь его из пространства имён `Queries`, выбрав соответствующий область. Пространство запроса включает в себя:
|
||||
|
||||
- Интерфейс входных данных `IInput`
|
||||
- Интерфейс выходных данных `IOutput`
|
||||
- Селектор запроса `query`
|
||||
- Имя запроса `name`
|
||||
- Требуемую роль `role` для выполнения запроса
|
||||
|
||||
Все запросы выполняются типично в следующем порядке на примере извлечения аккаунта {{ get_sdk_doc("Queries", "Accounts", "GetAccount") }}:
|
||||
|
||||
```ts
|
||||
// импортируем пространство запросов
|
||||
import { Queries } from '@coopenomics/sdk'
|
||||
|
||||
// формируем объект с параметрами запроса согласно интерфейсу IInput
|
||||
const variables: Queries.Accounts.GetAccount.IInput = {
|
||||
data: {
|
||||
username: <string>; // Имя аккаунта пользователя
|
||||
};
|
||||
};
|
||||
|
||||
// отправляем запрос и получаем результат в result
|
||||
const { [Queries.Accounts.GetAccount.name]: result } = await client.Query(
|
||||
Queries.Accounts.GetAccount.query,
|
||||
{ variables }
|
||||
);
|
||||
|
||||
```
|
||||
|
||||
Где `Queries.Accounts.GetAccount.name` - это имя запроса, по ключу которого в ответе будет типизированный `result` в соответствии с интерфейсом `Queries.Accounts.GetAccount.IOutput`, а `Queries.Accounts.GetAccount.query` - это предварительно сформированный селектор для получения `result`.
|
||||
|
||||
Таким образом, для выполнения любого запроса необходимо только знать пространство имени в SDK и использовать данные из него для отправки запроса. В `role` же содержится вспомогательная информация, которая сообщает о том, какая минимальная роль пользователя допустима для совершения запроса.
|
||||
|
||||
|
||||
### Мутации
|
||||
Мутация - это способ изменения данных в `MONO` через [GraphQL-API](/graphql). Мутации производятся аналогично запросам, для их проведения необходимо извлечь её из пространства имён `Mutations`, выбрав соответствующую область. Пространство мутации включает в себя:
|
||||
|
||||
- Интерфейс входных данных `IInput`
|
||||
- Интерфейс выходных данных `IOutput`
|
||||
- Селектор мутации `mutation`
|
||||
- Имя мутации `name`
|
||||
- Требуемую роль `role` для выполнения мутации
|
||||
|
||||
Все запросы выполняются типично в следующем порядке на примере паевого взноса {{ get_sdk_doc("Mutations", "Payments", "CreateDepositPayment") }}:
|
||||
|
||||
```ts
|
||||
// импортируем пространство мутаций
|
||||
import { Mutations } from '@coopenomics/sdk'
|
||||
|
||||
// формируем объект с параметрами запроса согласно интерфейсу IInput
|
||||
const variables: Queries.Payments.CreateDepositPayment.IInput = {
|
||||
data: {
|
||||
username: <string>; // Имя аккаунта пользователя
|
||||
quantity: <string>; // Сумма взноса
|
||||
};
|
||||
};
|
||||
|
||||
// отправляем мутацию и получаем результат в result
|
||||
const { [Mutations.Payments.CreateDepositPayment.name]: result } = await client.Query(
|
||||
Mutations.Payments.CreateDepositPayment.mutation,
|
||||
{ variables }
|
||||
);
|
||||
|
||||
```
|
||||
Типизированный результат исполнения мутации согласно интерфейсу `Mutations.Payments.CreateDepositPayment.IOutput` будет возвращен в переменной `result`.
|
||||
|
||||
|
||||
### Классы
|
||||
|
||||
Пространство имён классов содержит вспомогательные классы для работы с `MONO`, например, класс `Blockchain` отвечает за извлечение таблиц и отправку транзакций в блокчейне, класс `Canvas` - за извлечение собственноручной подписи пайщика в необходимом формате для `MONO`, класс `Document` - обеспечивает вычисление и восстановление цифровой подписи документов, и т.д. и т.п.
|
||||
|
||||
|
||||
|
||||
### Системное пространство
|
||||
|
||||
Иногда при создании запросов или выполнении мутаций могут требоваться специализированные списки, которые находятся в пространстве имён `Zeus`. На примере мутации для изменения статуса платежа:
|
||||
|
||||
```ts
|
||||
import { Zeus, Mutations } from '@coopenomics/sdk'
|
||||
|
||||
|
||||
const variables: Mutations.Payments.SetPaymentStatus.IInput = {
|
||||
data: {
|
||||
id: <string>; // Идентификатор платежа, для которого устанавливается статус
|
||||
status: Zeus.PaymentStatus.PAID; // используем список статусов платежей для указания оплаченного платежа
|
||||
};
|
||||
};
|
||||
|
||||
const { [Mutations.Payments.SetPaymentStatus.name]: result } = await client.Mutation(
|
||||
Mutations.Payments.SetPaymentStatus.mutation,
|
||||
{ variables }
|
||||
);
|
||||
```
|
||||
|
||||
Полный набор списков доступен в документации [SDK](/documentation/sdk) в пространстве имён Zeus.
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
## Получить системную информацию
|
||||
|
||||
{{ get_sdk_doc("Queries", "System", "GetSystemInfo") }} | {{ get_graphql_doc("Query.getSystemInfo") }}
|
||||
|
||||
{{ get_typedoc_input("Queries.System.GetSystemInfo") }}
|
||||
|
||||
Результат исполнения:
|
||||
|
||||
{{ get_typedoc_definition("Queries.System.GetSystemInfo", "IOutput") }}
|
||||
@@ -0,0 +1,77 @@
|
||||
Кошелёк — это средство учёта взносов пайщика.
|
||||
|
||||
Он создаётся автоматически при регистрации пайщика и фиксирует его баланс, участие в программах и движение средств. Кооператив принимает программу кошелька при подключении к [Кооперативной Экономике](https://coopenomics.world), обеспечивая единые правила учёта и управления средствами пайщиков.
|
||||
|
||||
Кошельки управляют учётом взносов пайщиков на их лицевых счетах и фондах кооператива.
|
||||
|
||||
Кошелёк позволяет пайщику пополнять паевой счёт без заявления, по факту участия в целевой потребительской программе простым [платежом](/documentation/payments). Средства на паевой счёт пайщика зачисляются после того, как платежных провайдер и/или член совета/администрации кооператива подтвердит факт поступления средств на банковский счёт. Сразу после этого паевой счёт будет пополнен и доступен пайщику для использования в [целевых потребительских программах](/documentation/programs) на [витринах](/documentation/extensions).
|
||||
|
||||
```mermaid
|
||||
graph TD;
|
||||
A[Паевой взнос] -->|Подтверждение платежа| B[Паевой счёт кошелька пайщика]
|
||||
B -->|Участие в программе| C[Блокировка средств]
|
||||
C -->|Средства временно недоступны| B
|
||||
|
||||
C -->|Завершение участия| D{Разблокировка или списание}
|
||||
|
||||
D --Разблокировка--> B
|
||||
D --Возврат паевого взноса--> E[Имуществом или результатом услуги]
|
||||
D --Возврат паевого взноса--> F[Банковским переводом]
|
||||
|
||||
D -->|Часть средств распределяется| G[Невозвратные фонды кооператива]
|
||||
|
||||
|
||||
```
|
||||
|
||||
С паевого счёта кошелька производятся списания при участии в целевых потребительских программах. Возвраты средств из целевых потребительских программ также производятся на паевой счёт кошелька. Возвраты средств с паевого счета кошелька на банковский счёт пайщика производится по цифровому заявлению пайщика [платежом возврата](/documentation/payments).
|
||||
|
||||
Все взносы в целевые потребительские программы совершаются с паевого счёта кошелька. Средства на паевом счёте кошелька, при этом, блокируются на период участия в программе. Т.е. паевый счёт кошелька не уменьшается, но увеличивается его заблокированная часть.
|
||||
|
||||
После окончания периода участия в целевой потребительской программы по какому-либо её условию, производится возврат заблокированных средств на паевой счёт или окончательное их списание, в случае возврата имуществом.
|
||||
|
||||
В случае взносов имуществом по какому-либо смарт-контракту, который это предусматривает, заблокированный паевый счёт кошелька также будет увеличен на сумму взноса на период участия. В дальнейшем, эта сумма может быть разблокирована на паевом счёте по условиям участия в целевой потребительской программе, например, при поставках имущества через контракт кооплейса.
|
||||
|
||||
!!!note "Фонды"
|
||||
Подобно тому, как у каждого пайщика есть персональный кошелёк для учёта взносов, у кооператива есть общие кошельки для учёта всех паевых и членских взносов пайщиков, они называются - [Фонды](/documentation/funds).
|
||||
|
||||
|
||||
Обязательное условие для использования кошелька является наличие подписанного соглашения о [ЦПП "Цифровой Кошелёк"](/documentation/agreements).
|
||||
|
||||
## Извлечь кошелёк
|
||||
{{ get_sdk_doc("Queries", "Wallets", "GetWallet") }} | {{ get_graphql_doc("Query.getWallet") }}
|
||||
|
||||
{{ get_typedoc_input("Queries.Wallets.GetWallet") }}
|
||||
|
||||
Результат:
|
||||
|
||||
{{ get_typedoc_definition("Queries.Wallets.GetWallet", "IOutput") }}
|
||||
|
||||
|
||||
## Совершить паевой взнос
|
||||
Для совершения паевого взноса необходимо создать [Платеж](/documentation/payments) паевого взноса и успешно провести его. Сразу после подтверждения поступления платежа - сумма платежа будет зачислена на паевой счёт.
|
||||
|
||||
## Сгенерировать заявление на возврат паевого взноса
|
||||
{{ get_sdk_doc("Mutations", "Wallets", "GenerateWithdrawRequest") }} | {{ get_graphql_doc("Mutation.generateWithdrawRequest") }}
|
||||
|
||||
Для получения возврата паевого взноса необходимо сгенерировать заявление на возврат, которое будет основанием для проведения собрания совета.
|
||||
|
||||
{{ get_typedoc_input("Mutations.Wallets.GenerateWithdrawRequest") }}
|
||||
|
||||
Результат:
|
||||
|
||||
{{ get_typedoc_definition("Mutations.Wallets.GenerateWithdrawRequest", "IOutput") }}
|
||||
|
||||
|
||||
## Получить возврат паевого взноса
|
||||
{{ get_sdk_doc("Mutations", "Wallets", "CreateWithdrawRequest") }} | {{ get_graphql_doc("Mutation.сreateWithdrawRequest") }}
|
||||
|
||||
Публикация ранее сгенерированного заявления на возврат паевого взноса немедленно заблокирует средства на паевом счёте кошелька пайщика и создаст вопрос на повестке дня для голосования совета.
|
||||
|
||||
После проведения собрания совета и принятия советом решения о возврате паевого взноса, будет сформирован объект [платежа возврата](/documentation/payments), который необходимо обработать члену администрации кооператива. Финально, обработка платежа возврата спишет заблокированные средства со счёта кошелька пайщика.
|
||||
|
||||
{{ get_typedoc_input("Mutations.Wallets.CreateWithdrawRequest") }}
|
||||
|
||||
Результат:
|
||||
|
||||
{{ get_typedoc_definition("Mutations.Wallets.CreateWithdrawRequest", "IOutput") }}
|
||||
|
||||
+16683
File diff suppressed because it is too large
Load Diff
+1
@@ -0,0 +1 @@
|
||||
function scrollSpy(){var l=5,e=document.querySelector("html"),c=(e&&(e=window.getComputedStyle(e).scrollPaddingTop)&&"string"==typeof e&&"auto"!==e&&e.endsWith("px")&&(l+=parseInt(e.split("px")[0])),"nav-scroll-active"),i=null,d=[];function t(){i=null;var e=document.querySelectorAll("[data-traverse-target]");Array.prototype.forEach.call(e,function(e){d.push({id:e.id,top:e.offsetTop})})}var n=debounce(function(){t(),o()},500),o=debounce(function(){var e,t,n,o,r=(e=>{for(var t=e+l,n=0;n<d.length;n++){var o=d[n+1];if(t>=d[n].top&&(!o||t<o.top))return n}return-1})(document.documentElement.scrollTop||document.body.scrollTop);r!==i&&(r=d[i=r],e=document.querySelector("."+c),t=s(r=r?document.querySelector('#nav a[href="#'+r.id+'"]'):null),n=(o=s(e))!==t,o&&n&&u(o,!1),t&&n&&u(t,!0),r&&(r.classList.add(c),r.scrollIntoViewIfNeeded?r.scrollIntoViewIfNeeded():!r.scrollIntoView||0<=(o=(o=r).getBoundingClientRect()).top&&0<=o.left&&o.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&o.right<=(window.innerWidth||document.documentElement.clientWidth)||r.scrollIntoView({block:"center",inline:"start"})),e)&&e.classList.remove(c)},100);function u(e,t){for(var n=t?"add":"remove";e;)e.classList[n]("nav-scroll-expand"),e=s(e.parentNode)}function s(e){return e&&e.closest?e.closest(".nav-group-section"):null}setTimeout(function(){t(),o(),window.addEventListener("scroll",o),window.addEventListener("resize",n)},300)}function toggleMenu(){var t="drawer-open",e=document.querySelector("#spectaql .sidebar-open-button"),n=document.querySelector("#spectaql #sidebar .close-button"),o=document.querySelector("#spectaql .drawer-overlay");function r(){var e=document.querySelector("#spectaql #page");e.classList.contains(t)?e.classList.remove(t):e.classList.add(t)}e.addEventListener("click",r),n.addEventListener("click",r),o.addEventListener("click",r)}function debounce(e,t){var n=null;return function(){clearTimeout(n),n=setTimeout(function(){e.apply(null)},t)}}window.addEventListener("DOMContentLoaded",e=>{toggleMenu(),scrollSpy()});
|
||||
+1
File diff suppressed because one or more lines are too long
@@ -0,0 +1,50 @@
|
||||
|
||||
# Регистрация пайщика
|
||||
|
||||
Будущий пайщик вводит свою электронную почту.
|
||||
|
||||

|
||||
|
||||
Заполняет персональную информацию и соглашается с политикой обработки персональных данных.
|
||||
|
||||

|
||||
|
||||
Получает идентификатор аккаунта и приватный ключ для цифровой подписи, надежно сохраняет их.
|
||||
|
||||

|
||||
|
||||
Ознакамливается с заявлением на вступление, Уставом, положением о ЭЦП, ЦПП “Кошелёк”, и пользовательским соглашением.
|
||||
|
||||

|
||||
|
||||
Оставляет собственноручную подпись пальцем по сенсорному экрану или рукой со вложенной компьютерной мышью.
|
||||
|
||||

|
||||
|
||||
Оплачивает вступительный взнос в Вашем кооперативе на счёт Вашего кооператива со своей банковской карты.
|
||||
|
||||
<aside>
|
||||
💡 При оплате вступительного взноса на [testnet.copenomics.world](http://testnet.copenomics.world) используйте **только** следующие тестовые данные карты:
|
||||
|
||||
номер карты - 5555 5555 5555 4444
|
||||
дата - 12/12
|
||||
CVC - 123
|
||||
|
||||
</aside>
|
||||
|
||||

|
||||
|
||||
Подтвердить, что оплата была произведена именно со своей банковской карты. Это важно для некоторых спорных случаев.
|
||||
|
||||

|
||||
|
||||
Дождаться решения совета о приёме в пайщики.
|
||||
|
||||

|
||||
|
||||
После получения решения, войти в кошелёк.
|
||||
|
||||

|
||||
|
||||
|
||||

|
||||
@@ -0,0 +1 @@
|
||||
TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false.
|
||||
@@ -0,0 +1,92 @@
|
||||
:root {
|
||||
--light-hl-0: #795E26;
|
||||
--dark-hl-0: #DCDCAA;
|
||||
--light-hl-1: #000000;
|
||||
--dark-hl-1: #D4D4D4;
|
||||
--light-hl-2: #A31515;
|
||||
--dark-hl-2: #CE9178;
|
||||
--light-hl-3: #008000;
|
||||
--dark-hl-3: #6A9955;
|
||||
--light-hl-4: #AF00DB;
|
||||
--dark-hl-4: #C586C0;
|
||||
--light-hl-5: #001080;
|
||||
--dark-hl-5: #9CDCFE;
|
||||
--light-hl-6: #0000FF;
|
||||
--dark-hl-6: #569CD6;
|
||||
--light-hl-7: #0070C1;
|
||||
--dark-hl-7: #4FC1FF;
|
||||
--light-hl-8: #267F99;
|
||||
--dark-hl-8: #4EC9B0;
|
||||
--light-hl-9: #098658;
|
||||
--dark-hl-9: #B5CEA8;
|
||||
--light-code-background: #FFFFFF;
|
||||
--dark-code-background: #1E1E1E;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: light) { :root {
|
||||
--hl-0: var(--light-hl-0);
|
||||
--hl-1: var(--light-hl-1);
|
||||
--hl-2: var(--light-hl-2);
|
||||
--hl-3: var(--light-hl-3);
|
||||
--hl-4: var(--light-hl-4);
|
||||
--hl-5: var(--light-hl-5);
|
||||
--hl-6: var(--light-hl-6);
|
||||
--hl-7: var(--light-hl-7);
|
||||
--hl-8: var(--light-hl-8);
|
||||
--hl-9: var(--light-hl-9);
|
||||
--code-background: var(--light-code-background);
|
||||
} }
|
||||
|
||||
@media (prefers-color-scheme: dark) { :root {
|
||||
--hl-0: var(--dark-hl-0);
|
||||
--hl-1: var(--dark-hl-1);
|
||||
--hl-2: var(--dark-hl-2);
|
||||
--hl-3: var(--dark-hl-3);
|
||||
--hl-4: var(--dark-hl-4);
|
||||
--hl-5: var(--dark-hl-5);
|
||||
--hl-6: var(--dark-hl-6);
|
||||
--hl-7: var(--dark-hl-7);
|
||||
--hl-8: var(--dark-hl-8);
|
||||
--hl-9: var(--dark-hl-9);
|
||||
--code-background: var(--dark-code-background);
|
||||
} }
|
||||
|
||||
:root[data-theme='light'] {
|
||||
--hl-0: var(--light-hl-0);
|
||||
--hl-1: var(--light-hl-1);
|
||||
--hl-2: var(--light-hl-2);
|
||||
--hl-3: var(--light-hl-3);
|
||||
--hl-4: var(--light-hl-4);
|
||||
--hl-5: var(--light-hl-5);
|
||||
--hl-6: var(--light-hl-6);
|
||||
--hl-7: var(--light-hl-7);
|
||||
--hl-8: var(--light-hl-8);
|
||||
--hl-9: var(--light-hl-9);
|
||||
--code-background: var(--light-code-background);
|
||||
}
|
||||
|
||||
:root[data-theme='dark'] {
|
||||
--hl-0: var(--dark-hl-0);
|
||||
--hl-1: var(--dark-hl-1);
|
||||
--hl-2: var(--dark-hl-2);
|
||||
--hl-3: var(--dark-hl-3);
|
||||
--hl-4: var(--dark-hl-4);
|
||||
--hl-5: var(--dark-hl-5);
|
||||
--hl-6: var(--dark-hl-6);
|
||||
--hl-7: var(--dark-hl-7);
|
||||
--hl-8: var(--dark-hl-8);
|
||||
--hl-9: var(--dark-hl-9);
|
||||
--code-background: var(--dark-code-background);
|
||||
}
|
||||
|
||||
.hl-0 { color: var(--hl-0); }
|
||||
.hl-1 { color: var(--hl-1); }
|
||||
.hl-2 { color: var(--hl-2); }
|
||||
.hl-3 { color: var(--hl-3); }
|
||||
.hl-4 { color: var(--hl-4); }
|
||||
.hl-5 { color: var(--hl-5); }
|
||||
.hl-6 { color: var(--hl-6); }
|
||||
.hl-7 { color: var(--hl-7); }
|
||||
.hl-8 { color: var(--hl-8); }
|
||||
.hl-9 { color: var(--hl-9); }
|
||||
pre, code { background: var(--code-background); }
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 14 KiB |
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAE72dW5PbuBGF/4sqj64k671k4zfZI8tTGXtkSR7XZis1BVPQCDFF0iDoWEntf0/xKgAE0E2p4ddB93conkOQBCnN7/+bKf5NzV7MXqWsLHk5ezYrmDrMXsyO+a5KefmXbuDPB3VMZ89mn0W2m7346dksOYh0J3k2e/H7APnI0pSrMyNpewdGO26ifnj+6x//+uPZwHhbKaZEnjk2ZRhCbcw8SfIqU0FOX4MCrvmTKBWXXROKa/WgdG5vs6LS8CJTXO5ZglNou02h5z//ou3h2/tKGQLqVCDZbacF/+vf//bDz881gWNHOit8ZVKwT8h91LebMj/qChk78gvpdeuIrAdwzUuu/sFPSH/b4ijGdmhaR3toJCs7PLWHHRY0b6OYVJMcNDoi2GjyKb20yFEMNTVoXTXZoLUfih1TfMrka3REsNbkU1prkaNYa2rQWmuyPdbq5s6fJOdHDp2uhyqUm0uecckUX0nxlSWnoRsp4WsnTBJCjCJWGBnSjCEEaQKHEAInlr5zI54ypirJLw3KGBA1Kg65OGFxCUWOi0MyVmAcUujIfCi5vDQtRm/UoJhKcTJiaUSOh6kWKxmmCjoU7V3upbGwuqMGw9aKE42RSuRw2Hqx4mHrYC5zKnUI5qFSB5Tjd/mTyEBSU0WYoDOTIikajTQRZy6N82ceOAXc5U95FT7iO1puf1wKY2oooTMNLoY1NZjUmxqIWNjZS17Cx19XR2xPT6XyZ+CRG9ST6RzqiYgZ8qVkWXJwLUSfmX0Nbhl4t9vKqlR8h1g6GMijLro0BDQIshGiUyYloEOSmwAfPNBfSc4Ubwkot/WGCEYbeEqPTXAUew0JWmcNNGjqDU/5JFP1hgimGnhKU01wFFMNCVpTDTTS1AvmZ1djNJMjztJugYimR52rnRJgCBY7oSYc1+fyCIZrcEqbdWwUczUBWks1MH4hlac86bpu8qSCVkEGsRAggtlBOUr7w0JRAhGUpI1IUAp+Yqt1oUKiN0QIhYGnDIEJjmK6IUFrsoFG3MctvimeldB7POcqnJNZqViaDl1ItN1Gl5qQCEF2gnjKBIWESHIUEoCf/GfiMuPHjVGsd8jQmu8SiGS/Q4o6AA4J5Msfk/03u+KYb2kQO2/TY9lu6ZB7bvERZ5DXkvMbngjwJGIUojxuVx5WMv83T9T9XgfghQIQuqDhJQlyN0GMMoZ4WZJU4uXQNzyXBcjVHSs5Ti3yyLhV4mXFqRchJE4ddDqunGeCmNh5+U5zDSAXP0Hfbb4JC4KZWlWfUlEeroxUiBIrUUFN8kCF1eLlKagbIU5BPcRF1opJJRJRMODNW70O+9hV60GjzTa6LIZECMIXxFOmLSREEq+QAP6Md26aF0UqEuuTASEIYyKFAhClDgkkFy00gDB9iADBK0OFOflN2Bz6s+Al4t83bHHOi5dswPcOH/66q/8W4SXnNEdvpHi5lKiz5NSIFhyXGn1KXCqoi6dT/YzrLVeHfAdcPumVE9aoXrLsM+K9CIs/6qXMG6BEkjdIgzZvgBpR3gAV5LsyBmdCJBzd0ULh0qKPhVMlYjBcejGi4dJBPh+5bLYY9UYLxliJPhYOjYihGKvFiMRYBX92wpyXppyRbniRl0J1nSi4q5E8Yx4ZuoD5BCKkyyNFGS2PBPLd6ttMKMHS6SEwG6OFwJKhD4EtEDEEllSMEFgSiHe2+sBsFFMVboqxmyKYP5KgNH4Mj2L6SIbW8BEecSbZnErFjyGT2wrkO1xCoYHnYrq0jNEEKXFAKdMxxpOkYowFD/3u7a0JDmr1EUzU6ZQ+GtwoVuoKtG7qZMxc/lHsEU62heQWdlg673pgBNM6NKVbHRJ5g4c+7PRycssMOJ1xJjaCfYYApYkG2HtC1e18X3EpXN9y7QZwz1i9v3DYUyb9vuGSK+/iwQh4Lr42XiH0xeEKQnHR8rkfQju9PyO/VFyepjKbJuAJmZoQBa06onVXXHuHqdHM81wKX+de6bXP/PUznu1YwLtmHH0Q42hDJVkKbO71CRgRidy3uVc7bwMxrvt/6qDHTvqhgyVXE4haNZX/TvbVGXBTaXLgZF+bBScUNYk3L3Ml00w0e2JYaSmQGmqz6W21FCjNtdCYQ77/WmTA3KEEe9BPYur1VGHx0K8Oio+LCwlopQePsTH05cYeP/GrjUuuJlKNDiovvfyr3fSTaQ56L//aQ94LxiQFekWkF7ngBZHlsJI7lT7qpEoPqHN1imAFotkBFJrgPuzMVMcxRK2a2F+TTeWpRaX10YRjvPMttfXgCWtrS94tr99m+xwkGtVUzjnZVzvnptLM5072tXO5E+pPg56Hf3LXc876r1PW6ranQvvUPKuOHUMbN3m/6g/f6xL9E2qAbszffMeyJ698P+hvv5dPLBP/bRY+vRi7yI/zPD/WWIGHxTqof3dznafubdIL/Jg2D4HN0Qv8mPongwOQ87AfsZSsOLy/W0iZyzOk/1c6DUYvMUH1f9MZoda8LPKs5M4ZQgf2haEpYZ4KVpoBaCeFNsb9KHT4z9O0LitXMi9COKsKwi6+KckS9dAf+U6qXTQVesN5gQLXhRD8NVfJ4XWVJeZjDI1qVIA4mR/b32rR06PTtAII1rw9L5L7on6H3rd5dhEMHXaQ13erBkS28W2i4uZpBUgYvI3jOgjdnG+9wGEUhXlgaeXfOLMEAr5lhZfUjYGIfMdTvwHnYQg05Oi+UOa9sIazi9BQAAeCVikTmXdfDaMQZs3LPP3K5WC5e7vGZViwdxP1AhimKtl8Hv8MbdVAyE3CUiZf5Tvunp208Qko997TC3CwG74X9atwnpnOLsJB+z0eQPYlILCZt0WeBc8XoyoQW30qEykKmOwonALf5t2kCdKHSgi/PVTZjsuuOjRnOCsh/IfsP5IVK5kfRek+AIwKCPfgPY4eMEfPMKG7P+F5GAa1Jy0Pph3EQoCjZlwGgT8KdWj9Yem7Kk39V3LOSgy+3kvv2JE3u8yLNqogbN01l0/+qVIvwMDe5PlnL6gexEDquw3/5jSjECY5MBE8G+sFEGxfX8yGYHoBeKm2nq/evL973P62WjxuFqv5er69X7sWANorNmd5YD3hzWJ+s1hvvMBuPES432z97febbaAX/kCYz7DZztfbx4f5+vHd/O3CjzLKArw/nRH77hTQIR7Nrl9+0lcu6oh4O5vRQPfyS+rtXX5JA5239Y1uxtL6uHtZiVR5OaNKBLUp3L03V508XK02QF5JXjDJ28uCFVOH0gselwa43RVGffNXl3qhVl2AOL7JtFDum0yToZ3x/RytCMnqTvUoZFcbIEM0BOFUcPeNuY2yCgNMcz3S4oyXJUe9bW7CiK4GIjUbGwY1JQEOK0SzzOGl9AVhBipQVl2AuONJvuuOsPI2G6+jWWRPfUBhL3i685vQDgf6i0qK/am7pjX+5a1FsgsDTNndjbwOBFWrCZCUZF+5LDm44+zCEVNfiU+a7yy9SoXx1bMzUR8fg/4PKln+sfN8AAA="
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,3 @@
|
||||
<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>Country | @coopenomics/coopjs</title><meta name="description" content="Documentation for @coopenomics/coopjs"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget tsd-toolbar-icon search no-caption"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-search"></use></svg></label><input type="text" id="tsd-search-field" aria-label="Search"/></div><div class="field"><div id="tsd-toolbar-links"></div></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">@coopenomics/coopjs</a></div><div class="table-cell" id="tsd-widgets"><a href="#" class="tsd-widget tsd-toolbar-icon menu no-caption" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb"><li><a href="../modules.html">@coopenomics/coopjs</a></li><li><a href="Country.html">Country</a></li></ul><h1>Enumeration Country</h1></div><section class="tsd-panel tsd-comment"><div class="tsd-comment tsd-typography"><p>Страна регистрации пользователя</p>
|
||||
</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/coopenomics/monocoop/blob/20f1fc51b12ec0d1713545bdde7a74ee6618647a/components/coopjs/src/zeus/index.ts#L9122">components/coopjs/src/zeus/index.ts:9122</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" role="button" aria-expanded="false" tabIndex="0"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-chevronSmall"></use></svg> Index</h5></summary><div class="tsd-accordion-details"><section class="tsd-index-section"><h3 class="tsd-index-heading">Enumeration Members</h3><div class="tsd-index-list"><a href="Country.html#Russia" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-16"></use></svg><span>Russia</span></a>
|
||||
</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Enumeration Members</h2><section class="tsd-panel tsd-member"><a id="Russia" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>Russia</span><a href="#Russia" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><div class="tsd-signature"><span class="tsd-kind-enum-member">Russia</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">"Russia"</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/coopenomics/monocoop/blob/20f1fc51b12ec0d1713545bdde7a74ee6618647a/components/coopjs/src/zeus/index.ts#L9123">components/coopjs/src/zeus/index.ts:9123</a></li></ul></aside></section></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-index-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><h4 class="uppercase">Member Visibility</h4><form><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></form></div><div class="tsd-theme-toggle"><h4 class="uppercase">Theme</h4><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-index-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>On This Page</h3></summary><div class="tsd-accordion-details"><a href="#Russia" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-16"></use></svg><span>Russia</span></a></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1"></use></svg><span>@coopenomics/coopjs</span></a><ul class="tsd-small-nested-navigation" id="tsd-nav-container" data-base=".."><li>Loading...</li></ul></nav></div></div></div><footer></footer><div class="overlay"></div></body></html>
|
||||
@@ -0,0 +1,3 @@
|
||||
<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>LangType | @coopenomics/coopjs</title><meta name="description" content="Documentation for @coopenomics/coopjs"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget tsd-toolbar-icon search no-caption"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-search"></use></svg></label><input type="text" id="tsd-search-field" aria-label="Search"/></div><div class="field"><div id="tsd-toolbar-links"></div></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">@coopenomics/coopjs</a></div><div class="table-cell" id="tsd-widgets"><a href="#" class="tsd-widget tsd-toolbar-icon menu no-caption" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb"><li><a href="../modules.html">@coopenomics/coopjs</a></li><li><a href="LangType.html">LangType</a></li></ul><h1>Enumeration LangType</h1></div><section class="tsd-panel tsd-comment"><div class="tsd-comment tsd-typography"><p>Язык документа</p>
|
||||
</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/coopenomics/monocoop/blob/20f1fc51b12ec0d1713545bdde7a74ee6618647a/components/coopjs/src/zeus/index.ts#L9126">components/coopjs/src/zeus/index.ts:9126</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" role="button" aria-expanded="false" tabIndex="0"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-chevronSmall"></use></svg> Index</h5></summary><div class="tsd-accordion-details"><section class="tsd-index-section"><h3 class="tsd-index-heading">Enumeration Members</h3><div class="tsd-index-list"><a href="LangType.html#ru" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-16"></use></svg><span>ru</span></a>
|
||||
</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Enumeration Members</h2><section class="tsd-panel tsd-member"><a id="ru" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>ru</span><a href="#ru" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><div class="tsd-signature"><span class="tsd-kind-enum-member">ru</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">"ru"</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/coopenomics/monocoop/blob/20f1fc51b12ec0d1713545bdde7a74ee6618647a/components/coopjs/src/zeus/index.ts#L9127">components/coopjs/src/zeus/index.ts:9127</a></li></ul></aside></section></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-index-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><h4 class="uppercase">Member Visibility</h4><form><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></form></div><div class="tsd-theme-toggle"><h4 class="uppercase">Theme</h4><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-index-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>On This Page</h3></summary><div class="tsd-accordion-details"><a href="#ru" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-16"></use></svg><span>ru</span></a></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1"></use></svg><span>@coopenomics/coopjs</span></a><ul class="tsd-small-nested-navigation" id="tsd-nav-container" data-base=".."><li>Loading...</li></ul></nav></div></div></div><footer></footer><div class="overlay"></div></body></html>
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,3 @@
|
||||
<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>RegisterRole | @coopenomics/coopjs</title><meta name="description" content="Documentation for @coopenomics/coopjs"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget tsd-toolbar-icon search no-caption"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-search"></use></svg></label><input type="text" id="tsd-search-field" aria-label="Search"/></div><div class="field"><div id="tsd-toolbar-links"></div></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">@coopenomics/coopjs</a></div><div class="table-cell" id="tsd-widgets"><a href="#" class="tsd-widget tsd-toolbar-icon menu no-caption" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb"><li><a href="../modules.html">@coopenomics/coopjs</a></li><li><a href="RegisterRole.html">RegisterRole</a></li></ul><h1>Enumeration RegisterRole</h1></div><section class="tsd-panel tsd-comment"><div class="tsd-comment tsd-typography"><p>Роль пользователя при регистрации</p>
|
||||
</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/coopenomics/monocoop/blob/20f1fc51b12ec0d1713545bdde7a74ee6618647a/components/coopjs/src/zeus/index.ts#L9148">components/coopjs/src/zeus/index.ts:9148</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" role="button" aria-expanded="false" tabIndex="0"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-chevronSmall"></use></svg> Index</h5></summary><div class="tsd-accordion-details"><section class="tsd-index-section"><h3 class="tsd-index-heading">Enumeration Members</h3><div class="tsd-index-list"><a href="RegisterRole.html#User" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-16"></use></svg><span>User</span></a>
|
||||
</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Enumeration Members</h2><section class="tsd-panel tsd-member"><a id="User" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>User</span><a href="#User" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><div class="tsd-signature"><span class="tsd-kind-enum-member">User</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">"User"</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/coopenomics/monocoop/blob/20f1fc51b12ec0d1713545bdde7a74ee6618647a/components/coopjs/src/zeus/index.ts#L9149">components/coopjs/src/zeus/index.ts:9149</a></li></ul></aside></section></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-index-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><h4 class="uppercase">Member Visibility</h4><form><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></form></div><div class="tsd-theme-toggle"><h4 class="uppercase">Theme</h4><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-index-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>On This Page</h3></summary><div class="tsd-accordion-details"><a href="#User" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-16"></use></svg><span>User</span></a></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1"></use></svg><span>@coopenomics/coopjs</span></a><ul class="tsd-small-nested-navigation" id="tsd-nav-container" data-base=".."><li>Loading...</li></ul></nav></div></div></div><footer></footer><div class="overlay"></div></body></html>
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,3 @@
|
||||
<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>Country | @coopenomics/coopjs</title><meta name="description" content="Documentation for @coopenomics/coopjs"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget tsd-toolbar-icon search no-caption"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-search"></use></svg></label><input type="text" id="tsd-search-field" aria-label="Search"/></div><div class="field"><div id="tsd-toolbar-links"></div></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">@coopenomics/coopjs</a></div><div class="table-cell" id="tsd-widgets"><a href="#" class="tsd-widget tsd-toolbar-icon menu no-caption" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb"><li><a href="../modules.html">@coopenomics/coopjs</a></li><li><a href="../modules/Zeus.html">Zeus</a></li><li><a href="Zeus.Country.html">Country</a></li></ul><h1>Enumeration Country</h1></div><section class="tsd-panel tsd-comment"><div class="tsd-comment tsd-typography"><p>Страна регистрации пользователя</p>
|
||||
</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/coopenomics/monocoop/blob/baaaaf01bf4d55cff6141c14de441d39526a3c6f/components/coopjs/src/zeus/index.ts#L9122">components/coopjs/src/zeus/index.ts:9122</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" role="button" aria-expanded="false" tabIndex="0"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-chevronSmall"></use></svg> Index</h5></summary><div class="tsd-accordion-details"><section class="tsd-index-section"><h3 class="tsd-index-heading">Enumeration Members</h3><div class="tsd-index-list"><a href="Zeus.Country.html#Russia" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-16"></use></svg><span>Russia</span></a>
|
||||
</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Enumeration Members</h2><section class="tsd-panel tsd-member"><a id="Russia" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>Russia</span><a href="#Russia" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><div class="tsd-signature"><span class="tsd-kind-enum-member">Russia</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">"Russia"</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/coopenomics/monocoop/blob/baaaaf01bf4d55cff6141c14de441d39526a3c6f/components/coopjs/src/zeus/index.ts#L9123">components/coopjs/src/zeus/index.ts:9123</a></li></ul></aside></section></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-index-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><h4 class="uppercase">Member Visibility</h4><form><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></form></div><div class="tsd-theme-toggle"><h4 class="uppercase">Theme</h4><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-index-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>On This Page</h3></summary><div class="tsd-accordion-details"><a href="#Russia" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-16"></use></svg><span>Russia</span></a></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1"></use></svg><span>@coopenomics/coopjs</span></a><ul class="tsd-small-nested-navigation" id="tsd-nav-container" data-base=".."><li>Loading...</li></ul></nav></div></div></div><footer></footer><div class="overlay"></div></body></html>
|
||||
@@ -0,0 +1,3 @@
|
||||
<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>LangType | @coopenomics/coopjs</title><meta name="description" content="Documentation for @coopenomics/coopjs"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget tsd-toolbar-icon search no-caption"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-search"></use></svg></label><input type="text" id="tsd-search-field" aria-label="Search"/></div><div class="field"><div id="tsd-toolbar-links"></div></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">@coopenomics/coopjs</a></div><div class="table-cell" id="tsd-widgets"><a href="#" class="tsd-widget tsd-toolbar-icon menu no-caption" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb"><li><a href="../modules.html">@coopenomics/coopjs</a></li><li><a href="../modules/Zeus.html">Zeus</a></li><li><a href="Zeus.LangType.html">LangType</a></li></ul><h1>Enumeration LangType</h1></div><section class="tsd-panel tsd-comment"><div class="tsd-comment tsd-typography"><p>Язык документа</p>
|
||||
</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/coopenomics/monocoop/blob/baaaaf01bf4d55cff6141c14de441d39526a3c6f/components/coopjs/src/zeus/index.ts#L9126">components/coopjs/src/zeus/index.ts:9126</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" role="button" aria-expanded="false" tabIndex="0"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-chevronSmall"></use></svg> Index</h5></summary><div class="tsd-accordion-details"><section class="tsd-index-section"><h3 class="tsd-index-heading">Enumeration Members</h3><div class="tsd-index-list"><a href="Zeus.LangType.html#ru" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-16"></use></svg><span>ru</span></a>
|
||||
</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Enumeration Members</h2><section class="tsd-panel tsd-member"><a id="ru" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>ru</span><a href="#ru" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><div class="tsd-signature"><span class="tsd-kind-enum-member">ru</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">"ru"</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/coopenomics/monocoop/blob/baaaaf01bf4d55cff6141c14de441d39526a3c6f/components/coopjs/src/zeus/index.ts#L9127">components/coopjs/src/zeus/index.ts:9127</a></li></ul></aside></section></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-index-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><h4 class="uppercase">Member Visibility</h4><form><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></form></div><div class="tsd-theme-toggle"><h4 class="uppercase">Theme</h4><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-index-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>On This Page</h3></summary><div class="tsd-accordion-details"><a href="#ru" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-16"></use></svg><span>ru</span></a></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1"></use></svg><span>@coopenomics/coopjs</span></a><ul class="tsd-small-nested-navigation" id="tsd-nav-container" data-base=".."><li>Loading...</li></ul></nav></div></div></div><footer></footer><div class="overlay"></div></body></html>
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,3 @@
|
||||
<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>RegisterRole | @coopenomics/coopjs</title><meta name="description" content="Documentation for @coopenomics/coopjs"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget tsd-toolbar-icon search no-caption"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-search"></use></svg></label><input type="text" id="tsd-search-field" aria-label="Search"/></div><div class="field"><div id="tsd-toolbar-links"></div></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">@coopenomics/coopjs</a></div><div class="table-cell" id="tsd-widgets"><a href="#" class="tsd-widget tsd-toolbar-icon menu no-caption" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb"><li><a href="../modules.html">@coopenomics/coopjs</a></li><li><a href="../modules/Zeus.html">Zeus</a></li><li><a href="Zeus.RegisterRole.html">RegisterRole</a></li></ul><h1>Enumeration RegisterRole</h1></div><section class="tsd-panel tsd-comment"><div class="tsd-comment tsd-typography"><p>Роль пользователя при регистрации</p>
|
||||
</div><div class="tsd-comment tsd-typography"></div></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/coopenomics/monocoop/blob/baaaaf01bf4d55cff6141c14de441d39526a3c6f/components/coopjs/src/zeus/index.ts#L9148">components/coopjs/src/zeus/index.ts:9148</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" role="button" aria-expanded="false" tabIndex="0"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-chevronSmall"></use></svg> Index</h5></summary><div class="tsd-accordion-details"><section class="tsd-index-section"><h3 class="tsd-index-heading">Enumeration Members</h3><div class="tsd-index-list"><a href="Zeus.RegisterRole.html#User" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-16"></use></svg><span>User</span></a>
|
||||
</div></section></div></details></section></section><section class="tsd-panel-group tsd-member-group"><h2>Enumeration Members</h2><section class="tsd-panel tsd-member"><a id="User" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>User</span><a href="#User" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><div class="tsd-signature"><span class="tsd-kind-enum-member">User</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">"User"</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/coopenomics/monocoop/blob/baaaaf01bf4d55cff6141c14de441d39526a3c6f/components/coopjs/src/zeus/index.ts#L9149">components/coopjs/src/zeus/index.ts:9149</a></li></ul></aside></section></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-index-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><h4 class="uppercase">Member Visibility</h4><form><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></form></div><div class="tsd-theme-toggle"><h4 class="uppercase">Theme</h4><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-index-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>On This Page</h3></summary><div class="tsd-accordion-details"><a href="#User" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-16"></use></svg><span>User</span></a></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1"></use></svg><span>@coopenomics/coopjs</span></a><ul class="tsd-small-nested-navigation" id="tsd-nav-container" data-base=".."><li>Loading...</li></ul></nav></div></div></div><footer></footer><div class="overlay"></div></body></html>
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,6 @@
|
||||
<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>clearCanvas | @coopenomics/coopjs</title><meta name="description" content="Documentation for @coopenomics/coopjs"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget tsd-toolbar-icon search no-caption"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-search"></use></svg></label><input type="text" id="tsd-search-field" aria-label="Search"/></div><div class="field"><div id="tsd-toolbar-links"></div></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">@coopenomics/coopjs</a></div><div class="table-cell" id="tsd-widgets"><a href="#" class="tsd-widget tsd-toolbar-icon menu no-caption" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb"><li><a href="../modules.html">@coopenomics/coopjs</a></li><li><a href="../modules/Methods.html">Methods</a></li><li><a href="../modules/Methods.Canvas.html">Canvas</a></li><li><a href="Methods.Canvas.clearCanvas.html">clearCanvas</a></li></ul><h1>Function clearCanvas</h1></div><section class="tsd-panel"><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="clearCanvas" class="tsd-anchor"></a><span class="tsd-kind-call-signature">clear<wbr/>Canvas</span><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">canvas</span>, <span class="tsd-kind-parameter">ctx</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">void</span><a href="#clearCanvas" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></li><li class="tsd-description"><div class="tsd-comment tsd-typography"><p>Полностью очищает указанный canvas.</p>
|
||||
</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">canvas</span>: <span class="tsd-signature-type">HTMLCanvasElement</span></span><div class="tsd-comment tsd-typography"><p>Элемент canvas, который необходимо очистить.</p>
|
||||
</div><div class="tsd-comment tsd-typography"></div></li><li><span><span class="tsd-kind-parameter">ctx</span>: <span class="tsd-signature-type">CanvasRenderingContext2D</span></span><div class="tsd-comment tsd-typography"><p>Контекст рисования canvas.</p>
|
||||
</div><div class="tsd-comment tsd-typography"></div></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"><h4>Example</h4><pre><code class="language-ts"><span class="hl-4">Methods</span><span class="hl-1">.</span><span class="hl-4">Canvas</span><span class="hl-1">.</span><span class="hl-0">clearCanvas</span><span class="hl-1">(</span><span class="hl-4">canvas</span><span class="hl-1">, </span><span class="hl-4">ctx</span><span class="hl-1">)</span>
|
||||
</code><button>Copy</button></pre>
|
||||
</div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/coopenomics/monocoop/blob/baaaaf01bf4d55cff6141c14de441d39526a3c6f/components/coopjs/src/methods/canvas/clearCanvas.ts#L12">components/coopjs/src/methods/canvas/clearCanvas.ts:12</a></li></ul></aside></li></ul></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-index-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><h4 class="uppercase">Member Visibility</h4><form><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></form></div><div class="tsd-theme-toggle"><h4 class="uppercase">Theme</h4><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1"></use></svg><span>@coopenomics/coopjs</span></a><ul class="tsd-small-nested-navigation" id="tsd-nav-container" data-base=".."><li>Loading...</li></ul></nav></div></div></div><footer></footer><div class="overlay"></div></body></html>
|
||||
@@ -0,0 +1,8 @@
|
||||
<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>createCanvas | @coopenomics/coopjs</title><meta name="description" content="Documentation for @coopenomics/coopjs"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget tsd-toolbar-icon search no-caption"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-search"></use></svg></label><input type="text" id="tsd-search-field" aria-label="Search"/></div><div class="field"><div id="tsd-toolbar-links"></div></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">@coopenomics/coopjs</a></div><div class="table-cell" id="tsd-widgets"><a href="#" class="tsd-widget tsd-toolbar-icon menu no-caption" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb"><li><a href="../modules.html">@coopenomics/coopjs</a></li><li><a href="../modules/Methods.html">Methods</a></li><li><a href="../modules/Methods.Canvas.html">Canvas</a></li><li><a href="Methods.Canvas.createCanvas.html">createCanvas</a></li></ul><h1>Function createCanvas</h1></div><section class="tsd-panel"><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="createCanvas" class="tsd-anchor"></a><span class="tsd-kind-call-signature">create<wbr/>Canvas</span><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">container</span>, <span class="tsd-kind-parameter">width</span><span class="tsd-signature-symbol">?</span>, <span class="tsd-kind-parameter">height</span><span class="tsd-signature-symbol">?</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">{ </span><br/><span> </span><span class="tsd-kind-property">canvas</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">HTMLCanvasElement</span><span class="tsd-signature-symbol">; </span><br/><span> </span><span class="tsd-kind-property">ctx</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">CanvasRenderingContext2D</span><span class="tsd-signature-symbol">; </span><br/><span class="tsd-signature-symbol">}</span><a href="#createCanvas" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></li><li class="tsd-description"><div class="tsd-comment tsd-typography"><p>Создаёт элемент <code><canvas></code> внутри указанного контейнера и возвращает его вместе с 2D контекстом.</p>
|
||||
</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">container</span>: <span class="tsd-signature-type">HTMLElement</span></span><div class="tsd-comment tsd-typography"><p>HTML-элемент, внутри которого создаётся canvas.</p>
|
||||
</div><div class="tsd-comment tsd-typography"></div></li><li><span><span class="tsd-kind-parameter">width</span>: <span class="tsd-signature-type">number</span><span class="tsd-signature-symbol"> = 300</span></span><div class="tsd-comment tsd-typography"><p>Ширина canvas (по умолчанию 300).</p>
|
||||
</div><div class="tsd-comment tsd-typography"></div></li><li><span><span class="tsd-kind-parameter">height</span>: <span class="tsd-signature-type">number</span><span class="tsd-signature-symbol"> = 150</span></span><div class="tsd-comment tsd-typography"><p>Высота canvas (по умолчанию 150).</p>
|
||||
</div><div class="tsd-comment tsd-typography"></div></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-symbol">{ </span><br/><span> </span><span class="tsd-kind-property">canvas</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">HTMLCanvasElement</span><span class="tsd-signature-symbol">; </span><br/><span> </span><span class="tsd-kind-property">ctx</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">CanvasRenderingContext2D</span><span class="tsd-signature-symbol">; </span><br/><span class="tsd-signature-symbol">}</span></h4><p>Объект <code>{ canvas, ctx }</code>, где <code>canvas</code> — сам элемент, <code>ctx</code> — контекст 2D.</p>
|
||||
<ul class="tsd-parameters"><li class="tsd-parameter"><h5><span class="tsd-kind-property">canvas</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">HTMLCanvasElement</span></h5></li><li class="tsd-parameter"><h5><span class="tsd-kind-property">ctx</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">CanvasRenderingContext2D</span></h5></li></ul><div class="tsd-comment tsd-typography"><h4>Example</h4><pre><code class="language-ts"><span class="hl-6">const</span><span class="hl-1"> { </span><span class="hl-7">canvas</span><span class="hl-1">, </span><span class="hl-7">ctx</span><span class="hl-1"> } = </span><span class="hl-4">Methods</span><span class="hl-1">.</span><span class="hl-4">Canvas</span><span class="hl-1">.</span><span class="hl-0">createCanvas</span><span class="hl-1">(</span><span class="hl-4">document</span><span class="hl-1">.</span><span class="hl-4">body</span><span class="hl-1">, </span><span class="hl-8">500</span><span class="hl-1">, </span><span class="hl-8">300</span><span class="hl-1">)</span><br/><span class="hl-4">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-4">canvas</span><span class="hl-1">.</span><span class="hl-4">width</span><span class="hl-1">, </span><span class="hl-4">canvas</span><span class="hl-1">.</span><span class="hl-4">height</span><span class="hl-1">) </span><span class="hl-5">// 500, 300</span>
|
||||
</code><button>Copy</button></pre>
|
||||
</div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/coopenomics/monocoop/blob/baaaaf01bf4d55cff6141c14de441d39526a3c6f/components/coopjs/src/methods/canvas/createCanvas.ts#L15">components/coopjs/src/methods/canvas/createCanvas.ts:15</a></li></ul></aside></li></ul></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-index-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><h4 class="uppercase">Member Visibility</h4><form><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></form></div><div class="tsd-theme-toggle"><h4 class="uppercase">Theme</h4><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1"></use></svg><span>@coopenomics/coopjs</span></a><ul class="tsd-small-nested-navigation" id="tsd-nav-container" data-base=".."><li>Loading...</li></ul></nav></div></div></div><footer></footer><div class="overlay"></div></body></html>
|
||||
@@ -0,0 +1,9 @@
|
||||
<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>draw | @coopenomics/coopjs</title><meta name="description" content="Documentation for @coopenomics/coopjs"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget tsd-toolbar-icon search no-caption"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-search"></use></svg></label><input type="text" id="tsd-search-field" aria-label="Search"/></div><div class="field"><div id="tsd-toolbar-links"></div></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">@coopenomics/coopjs</a></div><div class="table-cell" id="tsd-widgets"><a href="#" class="tsd-widget tsd-toolbar-icon menu no-caption" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb"><li><a href="../modules.html">@coopenomics/coopjs</a></li><li><a href="../modules/Methods.html">Methods</a></li><li><a href="../modules/Methods.Canvas.html">Canvas</a></li><li><a href="Methods.Canvas.draw.html">draw</a></li></ul><h1>Function draw</h1></div><section class="tsd-panel"><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="draw" class="tsd-anchor"></a><span class="tsd-kind-call-signature">draw</span><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">e</span>, <span class="tsd-kind-parameter">canvas</span>, <span class="tsd-kind-parameter">ctx</span>, <span class="tsd-kind-parameter">state</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">void</span><a href="#draw" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></li><li class="tsd-description"><div class="tsd-comment tsd-typography"><p>Function: draw</p>
|
||||
<p>Выполняет рисование линии от предыдущей точки к текущей, обновляя координаты.</p>
|
||||
</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">e</span>: <span class="tsd-signature-type">MouseEvent</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">TouchEvent</span></span><div class="tsd-comment tsd-typography"><p>Событие мыши или касания.</p>
|
||||
</div><div class="tsd-comment tsd-typography"></div></li><li><span><span class="tsd-kind-parameter">canvas</span>: <span class="tsd-signature-type">HTMLCanvasElement</span></span><div class="tsd-comment tsd-typography"><p>Элемент canvas, на котором рисуется.</p>
|
||||
</div><div class="tsd-comment tsd-typography"></div></li><li><span><span class="tsd-kind-parameter">ctx</span>: <span class="tsd-signature-type">CanvasRenderingContext2D</span></span><div class="tsd-comment tsd-typography"><p>Контекст рисования.</p>
|
||||
</div><div class="tsd-comment tsd-typography"></div></li><li><span><span class="tsd-kind-parameter">state</span>: <a href="../interfaces/Methods.Canvas.IDrawingState.html" class="tsd-signature-type tsd-kind-interface">IDrawingState</a></span><div class="tsd-comment tsd-typography"><p>Объект состояния рисования.</p>
|
||||
</div><div class="tsd-comment tsd-typography"></div></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"><h4>Example</h4><pre><code class="language-ts"><span class="hl-4">canvas</span><span class="hl-1">.</span><span class="hl-0">addEventListener</span><span class="hl-1">(</span><span class="hl-2">'mousemove'</span><span class="hl-1">, (</span><span class="hl-4">e</span><span class="hl-1">) </span><span class="hl-6">=></span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-4">Methods</span><span class="hl-1">.</span><span class="hl-4">Canvas</span><span class="hl-1">.</span><span class="hl-0">draw</span><span class="hl-1">(</span><span class="hl-4">e</span><span class="hl-1">, </span><span class="hl-4">canvas</span><span class="hl-1">, </span><span class="hl-4">ctx</span><span class="hl-1">, </span><span class="hl-4">drawingState</span><span class="hl-1">)</span><br/><span class="hl-1">})</span>
|
||||
</code><button>Copy</button></pre>
|
||||
</div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/coopenomics/monocoop/blob/baaaaf01bf4d55cff6141c14de441d39526a3c6f/components/coopjs/src/methods/canvas/draw.ts#L20">components/coopjs/src/methods/canvas/draw.ts:20</a></li></ul></aside></li></ul></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-index-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><h4 class="uppercase">Member Visibility</h4><form><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></form></div><div class="tsd-theme-toggle"><h4 class="uppercase">Theme</h4><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1"></use></svg><span>@coopenomics/coopjs</span></a><ul class="tsd-small-nested-navigation" id="tsd-nav-container" data-base=".."><li>Loading...</li></ul></nav></div></div></div><footer></footer><div class="overlay"></div></body></html>
|
||||
@@ -0,0 +1,5 @@
|
||||
<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>endDrawing | @coopenomics/coopjs</title><meta name="description" content="Documentation for @coopenomics/coopjs"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget tsd-toolbar-icon search no-caption"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-search"></use></svg></label><input type="text" id="tsd-search-field" aria-label="Search"/></div><div class="field"><div id="tsd-toolbar-links"></div></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">@coopenomics/coopjs</a></div><div class="table-cell" id="tsd-widgets"><a href="#" class="tsd-widget tsd-toolbar-icon menu no-caption" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb"><li><a href="../modules.html">@coopenomics/coopjs</a></li><li><a href="../modules/Methods.html">Methods</a></li><li><a href="../modules/Methods.Canvas.html">Canvas</a></li><li><a href="Methods.Canvas.endDrawing.html">endDrawing</a></li></ul><h1>Function endDrawing</h1></div><section class="tsd-panel"><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="endDrawing" class="tsd-anchor"></a><span class="tsd-kind-call-signature">end<wbr/>Drawing</span><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">state</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">void</span><a href="#endDrawing" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></li><li class="tsd-description"><div class="tsd-comment tsd-typography"><p>Завершает процесс рисования, устанавливая <code>drawing = false</code>.</p>
|
||||
</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">state</span>: <a href="../interfaces/Methods.Canvas.IDrawingState.html" class="tsd-signature-type tsd-kind-interface">IDrawingState</a></span><div class="tsd-comment tsd-typography"><p>Объект состояния рисования.</p>
|
||||
</div><div class="tsd-comment tsd-typography"></div></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"><h4>Example</h4><pre><code class="language-ts"><span class="hl-4">canvas</span><span class="hl-1">.</span><span class="hl-0">addEventListener</span><span class="hl-1">(</span><span class="hl-2">'mouseup'</span><span class="hl-1">, () </span><span class="hl-6">=></span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-4">Methods</span><span class="hl-1">.</span><span class="hl-4">Canvas</span><span class="hl-1">.</span><span class="hl-0">endDrawing</span><span class="hl-1">(</span><span class="hl-4">drawingState</span><span class="hl-1">)</span><br/><span class="hl-1">})</span>
|
||||
</code><button>Copy</button></pre>
|
||||
</div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/coopenomics/monocoop/blob/baaaaf01bf4d55cff6141c14de441d39526a3c6f/components/coopjs/src/methods/canvas/endDrawing.ts#L16">components/coopjs/src/methods/canvas/endDrawing.ts:16</a></li></ul></aside></li></ul></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-index-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><h4 class="uppercase">Member Visibility</h4><form><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></form></div><div class="tsd-theme-toggle"><h4 class="uppercase">Theme</h4><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1"></use></svg><span>@coopenomics/coopjs</span></a><ul class="tsd-small-nested-navigation" id="tsd-nav-container" data-base=".."><li>Loading...</li></ul></nav></div></div></div><footer></footer><div class="overlay"></div></body></html>
|
||||
@@ -0,0 +1,6 @@
|
||||
<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>getSignature | @coopenomics/coopjs</title><meta name="description" content="Documentation for @coopenomics/coopjs"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget tsd-toolbar-icon search no-caption"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-search"></use></svg></label><input type="text" id="tsd-search-field" aria-label="Search"/></div><div class="field"><div id="tsd-toolbar-links"></div></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">@coopenomics/coopjs</a></div><div class="table-cell" id="tsd-widgets"><a href="#" class="tsd-widget tsd-toolbar-icon menu no-caption" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb"><li><a href="../modules.html">@coopenomics/coopjs</a></li><li><a href="../modules/Methods.html">Methods</a></li><li><a href="../modules/Methods.Canvas.html">Canvas</a></li><li><a href="Methods.Canvas.getSignature.html">getSignature</a></li></ul><h1>Function getSignature</h1></div><section class="tsd-panel"><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="getSignature" class="tsd-anchor"></a><span class="tsd-kind-call-signature">get<wbr/>Signature</span><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">canvas</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><a href="#getSignature" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></li><li class="tsd-description"><div class="tsd-comment tsd-typography"><p>Извлекает текущее содержимое canvas в формате base64 (PNG).</p>
|
||||
</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">canvas</span>: <span class="tsd-signature-type">HTMLCanvasElement</span></span><div class="tsd-comment tsd-typography"><p>Элемент canvas, из которого извлекается собственноручная подпись.</p>
|
||||
</div><div class="tsd-comment tsd-typography"></div></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">string</span></h4><p>Строка в формате base64, содержащая изображение.</p>
|
||||
<div class="tsd-comment tsd-typography"><h4>Example</h4><pre><code class="language-ts"><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">sign</span><span class="hl-1"> = </span><span class="hl-4">Methods</span><span class="hl-1">.</span><span class="hl-4">Canvas</span><span class="hl-1">.</span><span class="hl-0">getSignature</span><span class="hl-1">(</span><span class="hl-4">canvas</span><span class="hl-1">)</span><br/><span class="hl-4">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-4">sign</span><span class="hl-1">) </span><span class="hl-5">// "data:image/png;base64,iVBORw0..."</span>
|
||||
</code><button>Copy</button></pre>
|
||||
</div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/coopenomics/monocoop/blob/baaaaf01bf4d55cff6141c14de441d39526a3c6f/components/coopjs/src/methods/canvas/getSignature.ts#L14">components/coopjs/src/methods/canvas/getSignature.ts:14</a></li></ul></aside></li></ul></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-index-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><h4 class="uppercase">Member Visibility</h4><form><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></form></div><div class="tsd-theme-toggle"><h4 class="uppercase">Theme</h4><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1"></use></svg><span>@coopenomics/coopjs</span></a><ul class="tsd-small-nested-navigation" id="tsd-nav-container" data-base=".."><li>Loading...</li></ul></nav></div></div></div><footer></footer><div class="overlay"></div></body></html>
|
||||
@@ -0,0 +1,7 @@
|
||||
<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>startDrawing | @coopenomics/coopjs</title><meta name="description" content="Documentation for @coopenomics/coopjs"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget tsd-toolbar-icon search no-caption"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-search"></use></svg></label><input type="text" id="tsd-search-field" aria-label="Search"/></div><div class="field"><div id="tsd-toolbar-links"></div></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">@coopenomics/coopjs</a></div><div class="table-cell" id="tsd-widgets"><a href="#" class="tsd-widget tsd-toolbar-icon menu no-caption" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb"><li><a href="../modules.html">@coopenomics/coopjs</a></li><li><a href="../modules/Methods.html">Methods</a></li><li><a href="../modules/Methods.Canvas.html">Canvas</a></li><li><a href="Methods.Canvas.startDrawing.html">startDrawing</a></li></ul><h1>Function startDrawing</h1></div><section class="tsd-panel"><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="startDrawing" class="tsd-anchor"></a><span class="tsd-kind-call-signature">start<wbr/>Drawing</span><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">e</span>, <span class="tsd-kind-parameter">canvas</span>, <span class="tsd-kind-parameter">state</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">void</span><a href="#startDrawing" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></li><li class="tsd-description"><div class="tsd-comment tsd-typography"><p>Запускает процесс рисования, фиксируя начальные координаты.</p>
|
||||
</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">e</span>: <span class="tsd-signature-type">MouseEvent</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">TouchEvent</span></span><div class="tsd-comment tsd-typography"><p>Событие мыши или касания.</p>
|
||||
</div><div class="tsd-comment tsd-typography"></div></li><li><span><span class="tsd-kind-parameter">canvas</span>: <span class="tsd-signature-type">HTMLCanvasElement</span></span><div class="tsd-comment tsd-typography"><p>Элемент canvas, на котором происходит рисование.</p>
|
||||
</div><div class="tsd-comment tsd-typography"></div></li><li><span><span class="tsd-kind-parameter">state</span>: <a href="../interfaces/Methods.Canvas.IDrawingState.html" class="tsd-signature-type tsd-kind-interface">IDrawingState</a></span><div class="tsd-comment tsd-typography"><p>Объект состояния рисования.</p>
|
||||
</div><div class="tsd-comment tsd-typography"></div></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div class="tsd-comment tsd-typography"><h4>Example</h4><pre><code class="language-ts"><span class="hl-4">canvas</span><span class="hl-1">.</span><span class="hl-0">addEventListener</span><span class="hl-1">(</span><span class="hl-2">'mousedown'</span><span class="hl-1">, (</span><span class="hl-4">e</span><span class="hl-1">) </span><span class="hl-6">=></span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-4">Methods</span><span class="hl-1">.</span><span class="hl-4">Canvas</span><span class="hl-1">.</span><span class="hl-0">startDrawing</span><span class="hl-1">(</span><span class="hl-4">e</span><span class="hl-1">, </span><span class="hl-4">canvas</span><span class="hl-1">, </span><span class="hl-4">drawingState</span><span class="hl-1">)</span><br/><span class="hl-1">})</span>
|
||||
</code><button>Copy</button></pre>
|
||||
</div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/coopenomics/monocoop/blob/baaaaf01bf4d55cff6141c14de441d39526a3c6f/components/coopjs/src/methods/canvas/startDrawing.ts#L17">components/coopjs/src/methods/canvas/startDrawing.ts:17</a></li></ul></aside></li></ul></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-index-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><h4 class="uppercase">Member Visibility</h4><form><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></form></div><div class="tsd-theme-toggle"><h4 class="uppercase">Theme</h4><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1"></use></svg><span>@coopenomics/coopjs</span></a><ul class="tsd-small-nested-navigation" id="tsd-nav-container" data-base=".."><li>Loading...</li></ul></nav></div></div></div><footer></footer><div class="overlay"></div></body></html>
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user