Месяц на XEX: от изменения ставки до выплаченного запроса.
Шесть станций. Две из них не откроются для одного человека. Вот каждая — и то, что она записывает.
Ваш план вознаграждений — это конфигурация, а не код.
Ставки, ранги, лестницы, пороги, пулы и условия по каждому пакету редактируются в структурированных формах и сохраняются как новая версия. Никто не пишет JSON и никто не выпускает релиз, чтобы поменять один процент.
Сохранение не делает ставку действующей. На версии проставляется версия движка, который будет её исполнять, и она остаётся черновиком, пока её не утвердит второй оператор. Самоутверждение отклоняется дважды — один раз в Go и один раз в базе данных, — поэтому его нельзя обойти прямым вызовом API и нельзя обойти оператором, у которого есть все роли.
Поскольку версия движка записана на самой версии плана, изменение того, как платформа считает, — это новая версия движка, а не тихое изменение того, сколько ваш план выплатил в прошлом месяце. Рабочее пространство можно закрепить за движком или перевести на новый осознанно.
internal/program · migrations · POST /v1/admin/programs/{version}/approve
Участники платят на ваши счета, а не на наши.
Пакет оцениваете и продаёте вы. Деньги приходят на счёт, который принадлежит вам, а платформе лишь сообщают, что они пришли.
Возврат в вашу же кассу
rails.host_handoff
Перевод в сети
rails.onchain_transfer
Банковский перевод
rails.bank_transfer
Alipay
rails.alipay
WeChat Pay
rails.wechat_pay
M-PESA
rails.mpesa
Каждый из этих каналов настраивается вашими учётными данными и на ваших счетах. Конфигурация канала отказывается сохранять данные, совпадающие с собственными данными платформы, — эта проверка существует именно потому, что «давайте пока используем наши» — это то, как поставщик софта случайно становится платёжной организацией.
internal/rails
Шесть движков, одна книга.
Каждый движок пишет свои строки, каждая строка несёт идентификатор породившего её правила, и все они попадают в одну книгу, куда можно только дописывать.
Прямая рекомендация
internal/direct
Командный дифференциал
internal/team
Оверрайд равного ранга
internal/samerank
Ранги
internal/rank
Мировой пул
internal/pool
Клубы и индивидуальные решения
internal/club · internal/accommodations
Ни одна ставка не зашита в код движка — конфигурация является единственным источником, который движки читают. Каждый движок ведут эталонные наборы данных, и набор тестов на Go прогоняет их при любом изменении; когда за всем этим стоят настоящие деньги, это единственный способ сохранить честность расчётного движка.
Расчётный период сначала идёт вхолостую.
Период рассчитывается в черновые строки, которые никому ничего не платят. Вы читаете, что он сделает, и затем его утверждает кто-то другой.
Консоль показывает суммарные вознаграждения черновика против денежных продаж периода за вычетом возвратов. Если это отношение выше заданного вами потолка, период вообще нельзя утвердить — проверка закрывается при сбое и живёт в самом пути утверждения, а не в отчёте, который кто-то прочитает потом.
Утверждение должно прийти от оператора, отличного от того, кто создал период. Проводку можно продолжить: прерванный на середине период завершают повторным запуском, а не ручной сверкой двух наполовину проведённых периодов. Ненужный черновик отбрасывается, и отбрасывание тоже идемпотентно.
internal/runs · /admin/runs
Участник запрашивает выплату. Платите вы.
Запрос резервирует ровно те строки книги, что нужно, и выпускает поручение. Платформа никогда не держит деньги, которые велит вам перевести.
Точные строки, зарезервированы
internal/claims
Отмена проигрывает расчёту
internal/claims
Нет системы расчётов? Есть консоль.
internal/httpapi/payouts.go
Что видит участник.
Ваши участники читают портал куда чаще, чем вы читаете консоль, и то, что он говорит, — это и есть голос вашей программы.
Тринадцать экранов портала на десяти языках, включая языки справа налево. Балансы, команда, доход по типам, пакеты, выплаты, споры и сам план — всё это рисуется из той же конфигурации, которую исполняют движки, поэтому участник читает одни и те же слова до вступления и после.
Любое ненормальное состояние несёт причину и следующее действие. Просто «ограничено по региону» — это тупик; здешнее уведомление говорит, почему и что делать. Участник, не согласный с цифрой, открывает спор, который идёт от открыт к на рассмотрении и дальше к решён или отклонён, с приложенным аудиторским следом — для вас это куда лучший исход, чем тот же участник, спорящий со своим наставником в групповом чате.
app/[locale]/portal · internal/disputes · i18n
Посмотрите, сколько это стоит, или возьмите песочницу.
Песочница бесплатна на любом тарифе и представляет собой продукт целиком — не демо, из которого вырезали всё интересное.