# Поддержка пользователей / тикеты В проекте есть два канала поддержки: - внешняя ссылка `SUPPORT_LINK`, которая ведет пользователя в Telegram-чат, канал, форму или любой другой публичный URL; - встроенные тикеты Web App / Mini App, если включен `SUPPORT_TICKETS_ENABLED`. Внешняя ссылка остается простым резервным каналом. Тикеты дают полноценный диалог внутри личного кабинета: пользователь создает обращение, видит историю ответов, получает счетчик непрочитанных сообщений, а администратор отвечает из админ-панели. ## Пользовательский сценарий Раздел **Поддержка** появляется в Web App, когда `SUPPORT_TICKETS_ENABLED=True`. Пользователь может: - создать тикет с темой, категорией, приоритетом и первым сообщением; - выбрать категорию `billing`, `technical`, `account` или `other`; - выбрать приоритет `normal` или `high`; - открыть список своих тикетов с фильтром по активным и всем обращениям; - отвечать в открытом тикете и видеть ответы поддержки; - перейти по `SUPPORT_LINK`, если нужна внешняя поддержка. Заблокированные пользователи не могут создавать тикеты и отвечать в них. Для пользователей показываются только обычные сообщения: внутренние заметки администраторов скрыты. ## Админский сценарий В админ-панели тикеты доступны в разделе **Коммуникации -> Поддержка**. Доступ проверяется так же, как и для остальных `/api/admin/*`: нужна Web App-сессия пользователя, чей Telegram ID указан в `ADMIN_IDS`. Администратор может: - видеть сводку по открытым, ожидающим ответа, закрытым и непрочитанным тикетам; - фильтровать обращения по статусу, приоритету, категории и назначенному администратору; - искать по теме, username, имени и email пользователя; - сортировать по обновлению, созданию или важности; - отвечать пользователю, менять статус, категорию, приоритет и исполнителя; - оставлять внутренние заметки, которые видны только администраторам; - открыть карточку пользователя и видеть контекст подписки: тариф, статус, остаток времени, обычный и premium-трафик. Статусы тикета: `open`, `awaiting_user`, `awaiting_admin`, `resolved`, `closed`. При создании тикет сразу получает статус `awaiting_admin`; ответ пользователя переводит незакрытый тикет в `awaiting_admin`, ответ администратора - в `awaiting_user`. Закрытые статусы считаются `resolved` и `closed`. ## Уведомления Новые тикеты и ответы пользователя могут отправляться в Telegram-уведомления администраторам и в лог-чат. Для отдельного топика поддержки используйте `LOG_SUPPORT_THREAD_ID`; если он пустой, сообщения идут в общий `LOG_THREAD_ID`/чат по настройкам логирования. Повторные уведомления по одному непрочитанному тикету ограничиваются cooldown-настройками, чтобы не заспамить админов: - `SUPPORT_ADMIN_NOTIFICATION_COOLDOWN_SECONDS` - пауза для Telegram/log уведомлений; - `SUPPORT_ADMIN_EMAIL_COOLDOWN_SECONDS` - пауза для email-уведомлений. Email-уведомления администраторам включаются через `SUPPORT_ADMIN_EMAIL_NOTIFICATIONS_ENABLED=True`. Письма отправляются только администраторам из `ADMIN_IDS`, у которых в базе есть email. Для отправки нужен рабочий SMTP-конфиг, как и для [входа по email](email-login.md). Ответ администратора и закрытие тикета дополнительно отправляются пользователю в Telegram, если у него есть Telegram-аккаунт, и на email, если он привязан. ## Настройки | Переменная | Назначение | | --- | --- | | `SUPPORT_LINK` | Внешняя ссылка поддержки. Показывается в боте и Web App как быстрый способ связаться с командой. | | `SUPPORT_TICKETS_ENABLED` | Включает раздел тикетов в Mini App и разрешает создание обращений. | | `SUPPORT_TICKET_MAX_BODY_LENGTH` | Максимальная длина сообщения тикета. | | `SUPPORT_TICKET_MAX_SUBJECT_LENGTH` | Максимальная длина темы тикета. | | `SUPPORT_TICKET_RATE_LIMIT_PER_HOUR` | Сколько новых тикетов пользователь может создать за час; `0` отключает лимит. | | `LOG_SUPPORT` | Включает Telegram/log уведомления по тикетам поддержки. | | `LOG_SUPPORT_THREAD_ID` | Необязательный ID топика в лог-чате для сообщений поддержки. | | `SUPPORT_ADMIN_EMAIL_NOTIFICATIONS_ENABLED` | Включает email-уведомления администраторам о новых тикетах и ответах пользователей. | | `SUPPORT_ADMIN_NOTIFICATION_COOLDOWN_SECONDS` | Минимальная пауза между повторными Telegram/log уведомлениями по одному непрочитанному тикету. | | `SUPPORT_ADMIN_EMAIL_COOLDOWN_SECONDS` | Минимальная пауза между повторными email-уведомлениями по одному непрочитанному тикету. | Все эти параметры описаны в [env-vars.md](../configuration/env-vars.md). Основной рекомендуемый способ менять их - админка **Система -> Настройки -> Поддержка**; значения применяются как override поверх `.env`. ## API и хранение Пользовательские маршруты: - `GET /api/support/tickets` - список тикетов пользователя; - `POST /api/support/tickets` - создать тикет; - `GET /api/support/tickets/{id}` - открыть тикет; - `POST /api/support/tickets/{id}/messages` - отправить ответ; - `POST /api/support/tickets/{id}/read` - отметить сообщения прочитанными; - `GET /api/support/unread` - счетчик непрочитанных ответов поддержки. Админские маршруты находятся под `/api/admin/support/*`: список, карточка тикета, ответ, изменение статуса/приоритета/категории/исполнителя, отметка прочитанного и статистика. Данные хранятся в таблицах `support_tickets` и `support_ticket_messages`; миграция применяется автоматически сервисом `migrate` при `docker compose up -d --build`.