# ТЗ: Evrone Classified — сайт объявлений

Демонстрационная версия документа · категория «Коммерция» · №03

> Это демонстрационное техническое задание: оно показывает структуру и глубину
> документа, который передаётся вместе с прототипом. Боевое ТЗ по этому солюшену
> готовится и заменит этот файл.

## 1. Суть решения

Подача объявлений, фасетный поиск, чат с антифродом, платное продвижение.

Площадка сводит покупателя и продавца, деньги через неё не ходят; монетизация — размещение и продвижение. Подача объявления с фото и модерацией, фасетный поиск и гео-фильтры, чат покупатель–продавец с антифрод-маскировкой контактов, избранное и подписки на поисковые запросы, платные услуги продвижения (поднятие, выделение, VIP), тарифы для профессиональных продавцов (пакеты объявлений, автозагрузка фидом).

## 2. Технологический стек

| Слой | Решение |
|---|---|
| Backend | Ruby on Rails 8, PostgreSQL |
| Frontend | Hotwire (Turbo + Stimulus), Tailwind CSS |
| Фоновые задачи | Solid Queue |
| Файлы | Active Storage, S3-совместимое хранилище |
| Деплой | Docker, Kamal, production + staging |

## 3. Роли

- Пользователь
- Профессиональный продавец
- Модератор

## 4. Модель данных

### 4.1. Listing

```
title: string
category_id: references
price: integer
geo: point
state: enum # черновик, на модерации, активно, снято
promoted_until: datetime, nullable
```

### 4.2. Conversation

```
listing_id: references
buyer_id: references
masked_contacts: boolean
messages: has_many
```

### 4.3. PromotionPackage

```
kind: enum # поднятие, выделение, VIP
price: integer
duration_days: integer
```

## 5. Ключевые сценарии

1. Пользователь подаёт объявление с фото, оно уходит на автомодерацию и затем публикуется
2. Поиск с фасетами и гео-фильтрами, сохранение поискового запроса с подпиской
3. Чат покупателя и продавца с маскировкой контактов до подтверждения сделки
4. Профессиональный продавец загружает объявления фидом по тарифу

## 6. Интеграции

- Антифрод и модерация контента
- Платежи за продвижение
- Гео-сервис
- Загрузка фидов

## 7. Нефункциональные требования

- Серверный рендеринг, работоспособность ключевых страниц без JavaScript
- Мобильная адаптивность обязательна
- Роли и права проверяются на уровне сервера, а не интерфейса
- Логирование действий пользователей по значимым операциям
- Покрытие тестами моделей и ключевых сценариев
- Развёртывание одной командой, окружения production и staging

## 8. Состав MVP

Одна вертикаль — подача, поиск, чат, продвижение.

## 9. Критерии приёмки

1. Все сценарии из раздела 5 проходят end-to-end на тестовом стенде
2. Роли из раздела 3 видят только то, что им положено
3. Интеграции из раздела 6 работают через слой адаптеров и переключаются конфигурацией
4. Прототип разворачивается из репозитория одной командой
5. Документация по запуску и переменным окружения лежит в README
