FAQ и полное руководство по работе Savdouz
Практическое руководство по логике платформы: аукционы, ограничения, депозиты, намерения/сделки, бонусы, модерация, споры и Playwright-проверки.
Быстрая навигация
Savdouz — P2P marketplace с аукционной логикой и классифайдами.
- Типы лотов: `auction`, `buy_now`, `classified`.
- Роли: покупатель, продавец, модератор, администратор.
- Ключевая идея: все ключевые действия (ставки, переходы статусов, бонусные операции) защищены транзакционной логикой и журналированием.
- Уведомления: веб + Telegram (если аккаунт привязан).
Основной жизненный цикл: `draft → pending → active → reserved/cooling → ended/sold/cancelled/rejected`.
- Перед публикацией: лот проходит модерацию (кроме отдельных авто-одобрений).
- Аукцион: должен иметь `ends_at`, минимальная длительность 15 минут, максимальная — 30 дней.
- Classified: отдельный публичный формат с автосроком и напоминаниями об окончании.
- Нет товара: система умеет переводить лот в паузу и требовать повторную публикацию.
Ставка проходит многоступенчатую проверку перед записью в базу.
- Лот должен быть активным аукционом и не завершённым по времени.
- Продавец не может ставить на свой лот.
- Пользователь с блокировкой ставок не может делать новые ставки.
- Ставка должна быть не ниже `current_price + bid_step`.
- Для UZS в форме создания/редактирования минимально допустимый `bid_step` — 100.
- Если шаг не задан, движок использует системный fallback `MIN_BID_STEP` (по умолчанию 1000 UZS).
- Если ставка достигает/превышает Buy Now при активном Buy Now, пользователь получает подсказку купить мгновенно.
Anti-snipe (значения по умолчанию):
- Если ставка пришла в последние 5 минут, аукцион продлевается на 3 минуты.
- Максимум 10 продлений на один аукцион.
Auto-bid:
- Если у другого участника есть `max_auto_bid`, система может перебить ставку автоматически на 1 шаг.
- Проигравшему лидеру отправляется `outbid` уведомление.
Платформа поддерживает несколько checkout-режимов, переключаемых фичефлагами.
- Intent mode: победитель подтверждает намерение, далее сделка выполняется офлайн.
- Escrow mode: средства замораживаются до подтверждения получения.
- Simulated payment: режим тестовых платежей для staff.
- Verified pay: флаг для реальных интеграций (по готовности).
Депозит за участие в торгах:
- Для ряда ставок требуется депозит, который удерживается в `BidDeposit`.
- Исходы депозита: `returned`, `applied`, `forfeited`.
- Система делает возврат проигравшим автоматически при корректном закрытии аукциона.
Таймеры оплаты победителя: по умолчанию 2 часа для цифровых/самовывоза и 24 часа для лотов с доставкой.
- Если ставок нет, лот завершается без победителя.
- Если резервная цена не достигнута, продажа не происходит.
- При наличии победителя создаётся запись победителя и запускается пост-аукционный поток.
- Статус лота переходит в `cooling` до подтверждения наличия продавцом.
Intent/Commit flow (по умолчанию):
- Победитель получает `PurchaseIntent` со сроком подтверждения (по умолчанию 60 минут).
- После `commit` создаётся `Deal` со сроком завершения (по умолчанию 72 часа).
- Если intent истёк, может выдаваться страйк и запускаться second-chance для следующего участника.
- Second-chance: отдельный дедлайн (по умолчанию 120 минут), максимум 3 попытки.
Офлайн-оплата: покупатель отмечает оплату, продавец подтверждает получение, система закрывает сделку и обновляет статистику.
Перед публикацией:
- Заполните ключевые поля (название, описание, состояние, город, цену/условия).
- Учитывайте требования к качеству карточки: полное описание и релевантные фото.
- Проверьте доставку/самовывоз и корректность финальной цены.
Ограничения редактирования (защита покупателей):
- После ставок блокируются критичные поля: цена старта, шаг, категория, название, описание, состояние и изображения.
- Лоты `reserved` и `sold` считаются заблокированными для обычного редактирования.
- Ведётся `ListingEditAudit` для всех попыток изменения.
Отмена/удаление: активный лот со ставками отменить или удалить нельзя (исключения только через модератора/админа с аудитом).
Лимиты ставок по trust tier (дефолт):
- `new`: до 5,000,000 UZS.
- `verified`: до 50,000,000 UZS.
- `trusted`: без верхнего лимита.
Депозиты по trust tier (дефолт):
- `new`: порог 500,000; 5%; min 20,000; max 500,000 UZS.
- `verified`: порог 5,000,000; 2%; min 20,000; max 200,000 UZS.
- `trusted`: порог 50,000,000; 1%; min 50,000; max 500,000 UZS.
Антиабьюз:
- Новый аккаунт: максимум 3 активные лидирующие ставки и 5 уникальных аукционов в день.
- Страйки имеют вес и срок распада (по умолчанию 30 дней).
- После 2 страйков может требоваться обязательный депозит.
- После 3 страйков возможна блокировка ставок на 7 дней.
- После 5 страйков возможна блокировка ставок на 30 дней.
Невыкуп: эскалация санкций (24ч → 168ч → 720ч), после 5 невыкупов возможна постоянная блокировка.
Кошелёк баллов: `available`, `pending`, lifetime-метрики и антифрод-флаги.
- По умолчанию: дневной лимит начисления 100,000 и дневной лимит списания 500,000 баллов.
- Срок жизни баллов по умолчанию — 90 дней (если не указан иной в кампании).
Примеры базовых наград (дефолт):
- Ставка: +5.
- Победа в аукционе: +30.
- Daily login: +3.
- Streak 3/7/30: +15/+40/+150.
- Профиль 100%: +75.
Bonus shop:
- Фикс-покупки и shop-аукционы за баллы.
- Можно покупать эффекты для лотов, бустеры, купоны и физические призы.
- Для некоторых товаров действуют `min_user_level`, `seller_only` и `max_per_user`.
Переводы баллов: минимум 1000, максимум 5000 в месяц и не более 3 переводов/месяц, с модерацией запроса админом.
Что проверяется:
- Запрещённые категории/ключевые слова.
- Подозрительные паттерны: обход эскроу, контакты в описании, прямые переводы и т.д.
- Структурные сигналы: слишком короткое описание, отсутствие фото, очень низкая цена.
Статусы очереди: `pending`, `in_review`, `approved`, `rejected`, `escalated`.
AI-аудит:
- Может быть включен для новых лотов.
- Статусы AI: `pass`, `warn`, `fail` + score/summary/payload.
- При сбое внешнего AI используется эвристический fallback.
Жалобы пользователей: создают `Report` и элемент в очереди модерации, затем возможны действия `approve/reject/remove/warn/block/escalate`.
- Пополнение: минимальная сумма 10,000 UZS.
- В dev-конфигурации: прямые интеграции Payme/Click в интерфейсе депозита ограничены для staff-сценариев.
- Баланс: учитывает `available` и `held`; есть верхний порог (по умолчанию 100,000,000 UZS).
- Вывод: создаётся заявка на вывод после проверки корректности карты и суммы.
Если включён escrow:
- Статусы эскроу: `pending`, `funded`, `released`, `refunded`, `partial`, `disputed`.
- Подтверждение доставки сохраняется даже если автовыплата временно блокируется (например, на ручную проверку).
Если используется intent-flow: финальное закрытие сделки идёт через подтверждение сторон и завершение deal-процесса.
Для e2e-тестов используйте Playwright-сценарии из `backend/tests/e2e/`.
Быстрый запуск:
cd backend
python manage.py runserver
pytest tests/e2e/
pytest tests/e2e/ --headed
Если сервер не на localhost:8000:
PLAYWRIGHT_BASE_URL=http://127.0.0.1:8000 pytest tests/e2e/
Что покрывают e2e-тесты:
- Навигация и загрузка ключевых страниц.
- Auth-флоу (логин/регистрация/доступ к приватным разделам).
- Сценарии каталога и карточек лотов.
- Доступ к rewards/loyalty/moderation страницам.
- Отдельная проверка FAQ/manual страницы.
Рекомендуется запускать smoke-набор перед релизом и после изменений в шаблонах/роутинге.
- Не удаётся сделать ставку: проверьте блокировку, лимит trust tier, минимальную сумму и наличие депозита.
- Не удаётся редактировать лот: возможно, лот уже имеет ставки или находится в `reserved/sold`.
- Баллы не начислились: действие могло попасть под cooldown/лимит или бонусная программа отключена в настройках.
- Не видно модерацию: раздел доступен только staff/moderator/admin.