Приоритет 1 Промокод «бесплатный кейс + холд» в очередь
Что просит ТЗ
Новый тип промокода: даёт открыть указанный кейс бесплатно. Выпавший предмет блокируется (нельзя вывести/продать) до пополнения баланса на заданную сумму. Если пополнения нет — по таймеру предмет сгорает.
Как сделаю
- Новый тип в
PromoCodeType (уже есть enum + поле target_case_id). Добавляю поля промокода: сумма разблокировки и срок холда.
- Активация (поле пополнения) → право на 1 бесплатное открытие выбранного кейса + уведомление с кнопкой перехода.
- Выпавший предмет (
CaseOpening) получает статус «заблокирован»: скрываю кнопки вывода/продажи, показываю плашку с суммой для разблокировки.
- После накопленных пополнений ≥ суммы — снимаю блокировку (предмет становится обычным). Слежу за порогом в момент пополнения.
- Таймер сгорания (настройка в админке): крон-команда гасит просроченные заблокированные предметы.
- Если ввёл промокод, но открыл другой кейс — промокод «сгорает» (помечаю использованным, бесплатность теряется).
- Вместо цены кейса — плашка «Бесплатно» (в т.ч. в фильтрах). Все активации — в лог промокодов (он уже ведётся).
Приоритет 2 Сброс лимита бесплатных кейсов для стримеров в очередь
Что просит ТЗ
В карточке пользователя — возможность разрешить повторное открытие бесплатных кейсов с заданным периодом сброса (например, 24 ч). Через период флаг обнуляется, кейс снова доступен. Бесконечно (до конца подкрутки).
Как сделаю
- В карточке пользователя (Filament), под блоком «Подкрутка», новый блок «Бесплатные кейсы»: чекбокс «Разрешить повторное открытие» + поле «Период сброса (часы/дни)».
- Опора на существующие
UserFreeCaseOpening / ManageFreeCases: при включённом флаге проверка доступности учитывает период — после его истечения от времени последнего открытия кейс снова доступен.
- Для пользователя интерфейс не меняется — всё по таймеру.
Приоритет 3 Апгрейд в общей лайв-ленте в очередь
Что просит ТЗ
Успешные апгрейды показывать в общей ленте сайта (как кейсы). По клику — переход в апгрейд. Неудачные апгрейды в ленту не попадают.
Как сделаю
- Лента кейсов =
cases/live, апгрейд-лента отдельная (upgrade/feed). Добавляю успешные апгрейды (Upgrade) в общий поток ленты единым форматом записи.
- У записи апгрейда клик ведёт на страницу апгрейда (а не кейса).
- Неуспешные апгрейды отфильтровываю.
Приоритет 4 Фейк-лента (боты, автонаполнение ленты) в очередь
Что просит ТЗ
Админ создаёт ботов (аватар + ник), которые по расписанию автоматически наполняют лайв-ленту, имитируя активность. Не влияют на экономику/фонд/аналитику, не имеют баланса, предметы физически не создаются — только запись в ленте.
Как сделаю
- Раздел админки «Фейк-лента → Управление ботами» (создание: аватар, ник) + «Фейк-лента → Настройки» (список кейсов для ботов, пресет редкости, мин/макс кейсов за вброс, интервал).
- Пресет редкости — по образцу существующей подкрутки (
CaseRigPreset): «процент от цены кейса → вероятность».
- Крон-команда: берёт бота с самым старым временем открытия, генерит 1–N записей в ленту (рандом кейс + рандом редкость по пресету), пишет время последнего открытия. Записи помечены как ботовские (флаг), но визуально неотличимы.
- Ботовские записи НЕ трогают фонд, балансы, инвентарь, аналитику — только строка в ленте. Индивидуальный и глобальный вкл/выкл.
- Удаление бота: прошлые записи в ленте остаются (без привязки к активному боту).
Приоритет 5 Выводная квота (вывод только с продаж на маркете) в очередь
Что просит ТЗ
Вывести деньги на карту можно только в пределах суммы, полученной от продажи предметов на маркетплейсе. Выигрыши/продажи с кейсов и апгрейда права на вывод не дают. Квота действует ограниченный срок (по умолчанию 30 дней, FIFO-сгорание), даже если баланс уже потрачен.
Как сделаю
- Журнал квоты: каждая продажа на маркете зачисляет (сумма − комиссия) в баланс И добавляет ту же сумму в квоту вывода со сроком (настройка, дефолт 30 дн).
- Продажи с кейсов/апгрейда квоту НЕ увеличивают.
- Вывод (
WithdrawalRequest) ограничен min(квота, баланс); при выводе списываю и с баланса, и с квоты (FIFO — старые порции первыми).
- Крон гасит просроченные порции квоты. Все операции (приход/расход/сгорание) — в лог.
- ЛК: «Доступно для вывода: X ₽» + список сделок-источников + тултип про срок. Админка: квота в карточке, история, ручное пополнение/уменьшение/продление срока.
🔍 Что выяснил по текущему коду (глубокое изучение 17.06)
- Промокоды: сейчас один тип — бесплатные открытия кейса; заблокированных предметов в системе НЕТ (всё в инвентаре сразу можно продать/вывести). Пополнения и продажи пишутся в общий журнал операций. Есть готовый механизм, который ловит «пополнил на N» — переиспользуем.
- Бесплатные кейсы: учёт «сколько осталось» есть, но без таймеров/сброса. Блок «Подкрутка» в карточке пользователя уже есть (вкл + пресет + «действует до») — блок сброса повешу рядом.
- Лента: общая лента кейсов обновляется опросом каждые 15 сек; лента апгрейдов — отдельная, без перехода по клику. Фонд и аналитика считаются из реальных открытий — поэтому боты пойдут отдельным каналом, чтобы их не задеть.
- Вывод: продажа на маркете и продажа с кейса/апгрейда — это РАЗНЫЕ типы операций в журнале (квоту легко считать только по маркету). Сам вывод на карту сейчас не реализован (только через админку вручную). Есть готовый механизм «срочных» сумм с FIFO-сгоранием за 30 дней — на нём построю квоту.
Часть прежних вопросов ТЗ уже закрывает: в квоту идёт сумма за вычетом комиссии; продажи с кейсов/апгрейда квоту не дают; сброс бесплатных кейсов привязан к сроку окончания подкрутки.
✅ Ответы заказчика (получены 18.06) — решения
- Ф1 порог/окно: пополнение НАКОПИТЕЛЬНО, окно 24 ч после активации. Плашка с инфой «сколько ещё пополнить». Новый промокод-на-кейс заменяет активный старый + уведомление после попытки замены.
- Ф1 сгорание: остаётся с пометкой «сгорел» (не удаляем).
- Ф1 несколько кейсов: один общий порог на все (3 кейса за 500 ₽ → разблок при 500).
- Ф2 тиры: бесплатные кейсы привязаны к сумме пополнения (≥100 — дешёвый, ≥300 — дороже, ≥1000 — топ), каждый по 1 разу на 24 ч. Стримеру выдаём то же; «сброс» = заново выдать тот же набор по периоду.
- Ф2 выбор кейсов: по конкретно выбранным кейсам в админке (не на все скопом).
- Ф4 пресет ботов: отдельный настраиваемый пресет шансов в админке; игрок не отличает бота от реального.
- Ф4 временные «пики» (НОВОЕ): временные пресеты расписания. Пример: 10:00–01:00 МСК — 1–2 кейса каждые 15–30 сек; 01:00–09:00 МСК — 1–2 кейса каждые 1–10 мин. Делаю настраиваемые временные окна с интервалами.
- Ф5 вывод: считаем рабочим; реальную выплату на карту прикрутим позже. Делаю квоту + заявку на вывод от пользователя, выплата пока ручная в админке.
🚧 Прогресс реализации (ветка feat/tz3-dorabotki)
- Фича 1: ✅ каркас (тип промокода, статус «сгорел», поля холда, связь предмета с активацией, хелперы) + ✅ запрет продажи/вывода заблокированного предмета. Тесты зелёные (131). Дальше: блокировка при открытии + окно 24ч/плашка/замена промо + авто-разблокировка при пополнении + крон сгорания + Filament-форма + фронт-плашки.