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

Платежи и взносы

Типы взносов

Кошельки управляют учётом взносов пайщиков на их лицевых счетах и фондах кооператива. Когда пайщик совершает взнос - это фиксируются на счетах в кошельке пайщика и фондах кооператива.

Взносы бывают: вступительные, паевые, членские.

Вступительный взнос оплачивается пайщиком однократно при вступлении в кооператив.

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

Членские взносы берутся при участии в целевых потребительских программах в фиксированной сумме или как % от суммы паевого взноса, и используются для пополнения невозвратных фондов кооператива. Подробнее о членских взносах смотри разделы Фондов и Программ.

Вступительные и Паевые взносы принимаются через совершение Платежа. Приём паевых взносов не ограничивается только платежами, и может осуществляться любым имуществом, но это выходит за описание данного раздела.

Платежи

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

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

Платежи обладают суммой и типом. В системе предусмотрено два типа платежей: регистрационные и паевые. Регистрационные платежи порождают одновременно два типа взносов: вступительный и минимальный паевый взносы, которые требуются совершить при регистрации нового пайщика.

Вступительный взнос направляется в фонд кооператива для дальнейшего списания на расходы и хранится там до принятия советом соответствующего решения на списание. Минимальный паевый взнос помещается в кошелёк пайщика и паевый фонд кооператива. Причина же, почему эти взносы вообще появились - это успешный регистрационный платеж.

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

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

Все паевые взносы безусловно возвратные и должны быть возвращены кооперативом по требованию пайщика в границах баланса его паевого счёта. Минимальный паевый взнос, при этом, возвращается при выходе пайщика из кооператива. Управление возвратами паевых взносов производится смарт-контрактами, на основе которых бэкенд MONO создаёт платежи возврата, которые обрабатываются администрацией кооператива.

Подробнее о методологии кооперации смотри на сайте платформы "Кооперативная Экономика. Здесь же нам важен принцип - платежи порождают взносы. Платежи обрабатываются платежными провайдерами, а взносы - смарт-контрактами.

Платежные провайдеры

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

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

Например, провайдер qrpay возвращает в result.data строку с реквизитами в формате, который при пребразовании в QR-код и его сканировании банковским приложением, распознаётся им и приводит к автоматическому заполнению полей реквизитов и суммы для оплаты. Обработка платежа производится "вручную" через изменение администратором статуса платежа.

Провайдер yookassa (если подключен и настроен) возвращает токен платежа confirmation_token в result.data, который может быть пребразован в платежный виджет и встроен в сайт для приёма платежей. Обработка происходит автоматически при поступлении оповещения от Yookassa на бэкенд MONO.

Список активных провайдеров

⚠️ 🛠️ SDK: Queries.Payments.GetPaymentProviders не найден | 🔗 GraphQL API: Query.getPaymentProviders

Запрос по извлечению списка провайдеров возвращает идентификаторы провайдеров и схемы их данных.

Вступительный и минимальный паевой взносы

🛠️ SDK: Mutations.Payments.CreateInitialPayment | 🔗 GraphQL API: Mutation.createInitialPayment

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

Создание объекта регистрационного платежа производится мутацией CreateInitial. Выполнение мутации возвращает идентификатор платежа и данные для его совершения в зависимости от выбранного платежного провайдера.

import { Mutations } from '@coopenomics/sdk'; 

const variables = {
  data: {
    username: <string>; // Имя аккаунта пользователя
  };
};

const { [Mutations.Payments.CreateInitialPayment.name]: result } = await client.Mutation(
  Mutations.Payments.CreateInitialPayment.mutation,
  { variables }
);

Паевый взнос

🛠️ SDK: Mutations.Payments.CreateDepositPayment | 🔗 GraphQL API: Mutation.createDepositPayment

Создание объекта паевого платежа производится мутацией CreateDeposit. Выполнение мутации возвращает идентификатор платежа и данные для его совершения в зависимости от выбранного платежного провайдера.

import { Mutations } from '@coopenomics/sdk'; 

const variables = {
  data: {
    quantity: <string>; // Сумма взноса
    username: <string>; // Имя аккаунта пользователя
  };
};

const { [Mutations.Payments.CreateDepositPayment.name]: result } = await client.Mutation(
  Mutations.Payments.CreateDepositPayment.mutation,
  { variables }
);

Список платежей

🛠️ SDK: Queries.Payments.GetPayments | 🔗 GraphQL API: Query.getPayments

Получить список платежей

import { Queries } from '@coopenomics/sdk'; 

const variables = {
  data: {
    blockchain_id?: <null | string>; // Идентификатор платежа в блокчейне
    id?: <null | string>; // Идентификатор платежа во внутренней системе
    status?: <null | PaymentStatus>; // Статус платежа
    username?: <null | string>; // Имя пользователя для фильтрации платежей
  };
};

const { [Queries.Payments.GetPayments.name]: result } = await client.Query(
  Queries.Payments.GetPayments.query,
  { variables }
);

Платеж возврата

⚠️ 🛠️ SDK: Mutations.Payments.CreateWithdraw не найден | 🔗 GraphQL API: Mutation.createWithdraw

⚠️ Описание для Mutations.Payments.CreateWithdraw не найдено

⚠️ Mutations.Payments.CreateWithdraw не найден

Управление платежами

🛠️ SDK: Mutations.Payments.SetPaymentStatus | 🔗 GraphQL API: Mutation.setPaymentStatus

Управление статусом платежа осущствляется мутацией setPaymentStatus. При переходе платежа в статус PAID вызывается эффект в блокчейне, который завершает операцию автоматическим переводом платежа в статус COMPLETED. При установке статуса REFUNDED запускается процесс отмены платежа в блокчейне. Остальные статусы не приводят к эффектам в блокчейне.

import { Mutations } from '@coopenomics/sdk'; 

const variables = {
  data: {
    id: <string>; // Идентификатор платежа, для которого устанавливается статус
    status: <PaymentStatus>; // Новый статус платежа
  };
};

const { [Mutations.Payments.SetPaymentStatus.name]: result } = await client.Mutation(
  Mutations.Payments.SetPaymentStatus.mutation,
  { variables }
);