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

После указания суммы система сформирует платежное поручение, используя главного платёжного провайдера кооператива (по умолчанию — это QR-код для оплаты банковским переводом на расчетный счет кооператива).

После совершения оплаты, и после того, как кассир подтвердит получение платежа, произойдет зачисление суммы на лицевой счет главного кошелька. Сразу после этого он готов к использованию в приложениях.
Разработчикам¶
Канонические имена полей и типов — в файле components/controller/schema.gql монорепозитория; интерактивно — в документации GraphQL-API.
Создать платёж (депозит / пополнение)¶
🛠️ SDK: Mutations.Gateway.CreateDepositPayment | Mutation.createDepositPayment
Создание объекта паевого платежа производится мутацией createDepositPayment. Выполнение мутации возвращает идентификатор платежа и данные для его совершения в зависимости от выбранного платежного провайдера. Требуемые роли: chairman, member.
import { Mutations } from '@coopenomics/sdk';
const variables: Mutations.Gateway.CreateDepositPayment.IInput = {
data: {
quantity: <number>; // Сумма взноса
symbol: <string>; // Символ валюты
username: <string>; // Имя аккаунта пользователя
};
};
const { [Mutations.Gateway.CreateDepositPayment.name]: result } = await client.Mutation(
Mutations.Gateway.CreateDepositPayment.mutation,
{ variables }
);
Результат:
interface IOutput {
createDepositPayment: {
blockchain_data?: <unknown>; // Данные из блокчейна
can_change_status: <boolean>; // Можно ли изменить статус
coopname: <string>; // Название кооператива
created_at: <unknown>; // Дата создания
direction: <PaymentDirection>; // Направление платежа
direction_label: <string>; // Человекочитаемое направление платежа
expired_at?: <unknown>; // Дата истечения
formatted_amount: <string>; // Форматированная сумма
hash?: <null | string>; // Хеш платежа
id?: <unknown>; // Уникальный идентификатор платежа
income_hash?: <null | string>; // Хеш входящего платежа (устарело)
is_final: <boolean>; // Завершен ли платеж окончательно
memo?: <null | string>; // Дополнительная информация
message?: <null | string>; // Сообщение
outcome_hash?: <null | string>; // Хеш исходящего платежа (устарело)
payment_details?: {
amount_plus_fee: <string>; // Сумма платежа с учетом комиссии
amount_without_fee: <string>; // Сумма платежа без учета комиссии
data: <unknown>; // Данные платежа (QR-код, токен, реквизиты и т.д.)
fact_fee_percent: <number>; // Фактический процент комиссии
fee_amount: <string>; // Размер комиссии в абсолютных значениях
fee_percent: <number>; // Процент комиссии
tolerance_percent: <number>; // Допустимый процент отклонения
};
payment_method_id?: <null | string>; // ID платежного метода
provider?: <null | string>; // Провайдер платежа
quantity: <number>; // Количество/сумма
statement?: <unknown>; // Подписанный документ заявления
status: <PaymentStatus>; // Статус платежа
status_label: <string>; // Человекочитаемый статус
symbol: <string>; // Символ валюты
type: <PaymentType>; // Тип платежа
type_label: <string>; // Человекочитаемый тип платежа
updated_at?: <unknown>; // Дата обновления
username: <string>; // Имя пользователя
username_certificate?: <({ username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | null | undefined; inn: string; } | { username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | ... 1 more ... | undefined; } | { ...; }) & {}>; // Сертификат пользователя, создавшего платеж
};
}
Изменить статус платежа¶
🛠️ SDK: Mutations.Gateway.SetPaymentStatus | Mutation.setPaymentStatus
Управление статусом платежа осущствляется мутацией setPaymentStatus. При переходе платежа в статус PAID вызывается эффект в блокчейне, который завершает операцию автоматическим переводом платежа в статус COMPLETED. При установке статуса REFUNDED запускается процесс отмены платежа в блокчейне. Остальные статусы не приводят к эффектам в блокчейне. Требуемые роли: chairman, member.
import { Mutations } from '@coopenomics/sdk';
const variables: Mutations.Gateway.SetPaymentStatus.IInput = {
data: {
id: <string>; // Идентификатор платежа, для которого устанавливается статус
status: <PaymentStatus>; // Новый статус платежа
};
};
const { [Mutations.Gateway.SetPaymentStatus.name]: result } = await client.Mutation(
Mutations.Gateway.SetPaymentStatus.mutation,
{ variables }
);
Результат:
interface IOutput {
setPaymentStatus: <ModelTypes["GatewayPayment"]>;
}
Список платежей¶
🛠️ SDK: Queries.Gateway.GetPayments | Query.getPayments
Получить список платежей с возможностью фильтрации по типу, статусу и направлению. Требуемые роли: chairman, member. Исключение: доступ разрешен, если
data.username
совпадает с
username
текущего пользователя.
import { Queries } from '@coopenomics/sdk';
const variables: Queries.Gateway.GetPayments.IInput = {
data?: {
coopname?: <null | string>; // Название кооператива
direction?: <null | PaymentDirection>; // Направление платежа
hash?: <null | string>; // Хэш платежа
provider?: <null | string>; // Провайдер платежа
status?: <null | PaymentStatus>; // Статус платежа
type?: <null | PaymentType>; // Тип платежа
username?: <null | string>; // Имя пользователя
};
options?: {
limit: <number>; // Количество элементов на странице
page: <number>; // Номер страницы
sortBy?: <null | string>; // Ключ сортировки (например, "name")
sortOrder: <string>; // Направление сортировки ("ASC" или "DESC")
};
};
const { [Queries.Gateway.GetPayments.name]: result } = await client.Query(
Queries.Gateway.GetPayments.query,
{ variables }
);
Результат:
interface IOutput {
getPayments: {
currentPage: <number>; // Текущая страница
items: <{
blockchain_data?: <unknown>; // Данные из блокчейна
can_change_status: <boolean>; // Можно ли изменить статус
coopname: <string>; // Название кооператива
created_at: <unknown>; // Дата создания
direction: <PaymentDirection>; // Направление платежа
direction_label: <string>; // Человекочитаемое направление платежа
expired_at?: <unknown>; // Дата истечения
formatted_amount: <string>; // Форматированная сумма
hash?: <null | string>; // Хеш платежа
id?: <unknown>; // Уникальный идентификатор платежа
income_hash?: <null | string>; // Хеш входящего платежа (устарело)
is_final: <boolean>; // Завершен ли платеж окончательно
memo?: <null | string>; // Дополнительная информация
message?: <null | string>; // Сообщение
outcome_hash?: <null | string>; // Хеш исходящего платежа (устарело)
payment_details?: {
amount_plus_fee: <string>; // Сумма платежа с учетом комиссии
amount_without_fee: <string>; // Сумма платежа без учета комиссии
data: <unknown>; // Данные платежа (QR-код, токен, реквизиты и т.д.)
fact_fee_percent: <number>; // Фактический процент комиссии
fee_amount: <string>; // Размер комиссии в абсолютных значениях
fee_percent: <number>; // Процент комиссии
tolerance_percent: <number>; // Допустимый процент отклонения
};
payment_method_id?: <null | string>; // ID платежного метода
provider?: <null | string>; // Провайдер платежа
quantity: <number>; // Количество/сумма
statement?: <unknown>; // Подписанный документ заявления
status: <PaymentStatus>; // Статус платежа
status_label: <string>; // Человекочитаемый статус
symbol: <string>; // Символ валюты
type: <PaymentType>; // Тип платежа
type_label: <string>; // Человекочитаемый тип платежа
updated_at?: <unknown>; // Дата обновления
username: <string>; // Имя пользователя
username_certificate?: <({ username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | null | undefined; inn: string; } | { username: string; type: AccountType; first_name: string; last_name: string; middle_name?: string | ... 1 more ... | undefined; } | { ...; }) & {}>; // Сертификат пользователя, создавшего платеж
}[]>; // Элементы текущей страницы
totalCount: <number>; // Общее количество элементов
totalPages: <number>; // Общее количество страниц
};
}
Баланс программного кошелька¶
🛠️ SDK: Queries.Wallet.GetProgramWallet | Query.getProgramWallet
Получить один программный кошелек по фильтру Требуемые роли: chairman, member.
import { Queries } from '@coopenomics/sdk';
const variables: Queries.Wallet.GetProgramWallet.IInput = {
filter: {
coopname?: <null | string>; // Фильтр по имени кооператива
program_id?: <null | string>; // Фильтр по ID программы
program_type?: <null | ProgramType>; // Фильтр по типу программы
username?: <null | string>; // Фильтр по имени пользователя
};
options: {
limit: <number>; // Количество элементов на странице
page: <number>; // Номер страницы
sortBy?: <null | string>; // Ключ сортировки (например, "name")
sortOrder: <string>; // Направление сортировки ("ASC" или "DESC")
};
};
const { [Queries.Wallet.GetProgramWallet.name]: result } = await client.Query(
Queries.Wallet.GetProgramWallet.query,
{ variables }
);
Результат:
interface IOutput {
getProgramWallet?: <undefined | {
agreement_id: <unknown>; // Идентификатор соглашения
available: <string>; // Доступный баланс (формат: "100.0000 RUB")
blockNum?: <null | number>; // Номер блока последнего обновления
blocked: <string>; // Заблокированный баланс (формат: "100.0000 RUB")
coopname: <string>; // Имя кооператива
id: <unknown>; // Уникальный идентификатор кошелька в блокчейне
membership_contribution: <string>; // Паевой взнос (формат: "100.0000 RUB")
program_id: <unknown>; // Идентификатор программы
program_type?: <null | ProgramType>; // Тип программы
username: <string>; // Имя пользователя
}>; // Получить один программный кошелек по фильтру
Требуемые роли: chairman, member.
}