Техническое задание на заявки на покупку карт

Статус: бизнес-правила согласованы; готово к техническому проектированию. Дата: 2026-11-07. Рабочее название раздела: «Брони».

Цель

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

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

В объём входят новая вкладка, обеспеченные заявки с частичным исполнением, автоматические покупки и ставки, связь с ручными покупками, а также переход новых аукционов на распределение цены 85/15.

Согласованные правила

Раздел и поиск

Деньги и покупка с маркета

Выбор подходящего предложения

Сначала бронь покупает самую дешёвую доступную копию на маркете, цена которой не превышает её лимит. В поиске участвуют как банковские лоты, так и пользовательские лоты «по своей цене».

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

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

Права и анонимность

Для броней используются действующие права покупки и участия в аукционах. Автоматическое исполнение не даёт пользователю дополнительных прав по сравнению с соответствующим действием вручную.

Авторы чужих заявок скрыты от пользователей. Уполномоченные администраторы видят автора и историю для разбора операций; административные сведения не попадают в публичные ответы или события обновления.

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

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

Участие в аукционе

Ручная ставка с использованием брони

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

Обязательный сценарий владельца:

  1. У пользователя всего 4A: 3A заморожены в брони, 1A доступен.
  2. Бронь становится первой ставкой 3A.
  3. Другой участник ставит 3.5A; бронь первого пользователя возвращается в ожидание.
  4. Первый пользователь вручную ставит 4A. Для этой ставки используются 3A существующей брони и 1A свободного остатка. Дополнительные свободные 4A не нужны.
  5. При победе списываются ровно 4A. Соответствующее обязательство по покупке исполнено; бронь не должна затем купить лишнюю копию.

Если ручную ставку 4A перебили, возвращается исходная заявка на 3A, а добавленный 1A освобождается. Ручное повышение в конкретном аукционе не меняет цену самой заявки. Для заявки на несколько копий ручная победа исполняет одну из них.

Ожидаемые остатки в обязательном сценарии, в валюте A:

Событие Доступно Удержание ожидающей брони Удержание ставки
До размещения 4 0 0
Создана бронь 3A 1 3 0
Бронь стала ставкой 1 0 3
Другой участник поставил 3.5A 1 3 0
Автор брони поставил 4A вручную 0 0 4
Победа за 4A, карта получена 0 0 0
Вместо победы ставку 4A перебили 1 3 0

Две последние строки — альтернативные исходы. Перенос денег между удержаниями не является новым списанием и не меняет общий денежный остаток пользователя.

Экономика продаж и переход на новые правила

Для пользовательского лота с ценой продажи P и уже выплаченным начислением A:

Доплата, сумма на распределение и возмещение банку в сумме равны P. Пример снижения цены: ранее начислено 2A, продажа за 2A — продавцу ничего дополнительно не начисляется и не списывается, 0.3A распределяются, 1.7A возмещаются банку, а 0.3A ранее выданного начисления остаются расходом банка.

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

Жизненный цикл одной заказанной копии

[Diagram]

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

Обязательные проверки

Требования к реализации денежных операций

Каждая заказанная копия находится ровно в одном состоянии: ожидает исполнения, обеспечивает один конкретный аукцион, куплена или отменена. Частичное исполнение одной заявки не расходует обеспечение её остальных копий.

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

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

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

Конкурентные сценарии проверяются на изолированном PostgreSQL с настоящими транзакциями и управляемыми одновременными запросами. Денежные примеры должны сверяться по кошелькам, удержаниям и журналу, а не только по HTTP-ответу. Внешние операции Senkuro для этих проверок подменяются; живая ковка не нужна.

Публичные ответы API и события обновления не раскрывают автора чужой заявки. Анонимность должна обеспечиваться сервером, а не только скрытием имени в интерфейсе.

Текущая основа проекта

Следующий этап — технический план: схема заявок и обеспечения каждой копии, связь с аукционами и покупками, версия расчёта выплат, API, фоновое исполнение, интерфейс и последовательность выпуска. Настоящее ТЗ определяет поведение и критерии приёмки; реализация и изменения рабочих окружений в эту стадию не входят.