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

Паевой взнос

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

Для совершения паевого взноса необходимо нажать кнопку «совершить взнос», которая покажет форму для указания суммы:

ввести сумму пополнения

После указания суммы система сформирует платежное поручение, используя главного платёжного провайдера кооператива (по умолчанию — это 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.
}