# Админ-панель ThaiForTravel

Админ-панель открывается на `/admin/` того же backend-домена. Для входа
используются `ADMIN_USERNAME`, `ADMIN_PASSWORD` и `ADMIN_SESSION_SECRET`.
Сессия хранится в защищённой HttpOnly cookie и по умолчанию действует 12 часов.

## Определения показателей

- **Всего пользователей** — уникальные Telegram-пользователи, известные backend.
- **Активные пользователи** — пользователи, которые в выбранный период открывали
  Mini App или взаимодействовали с ботом.
- **Заявки** — созданные заявки всех типов: экскурсии, трансферы, быстрый подбор и
  план отдыха.
- **Конверсия в заявку** — уникальные пользователи с заявкой / активные
  пользователи за период.
- **Сумма бронирований** — согласованная стоимость заявок со статусом
  `CONFIRMED` или `COMPLETED`. Заявки без заполненной стоимости не включаются.
- **Выручка** — сумма платежей со статусом `PAID` по дате оплаты.
- **Средний чек** — сумма бронирований / количество подтверждённых и завершённых
  заявок с заполненной согласованной стоимостью.
- **Неотвеченные чаты** — диалоги в состоянии `WAITING_MANAGER`.

Все даты отчёта считаются в часовом поясе `Asia/Bangkok`.
Все операционные суммы фиксируются в тайских батах (`THB`); смешение валют
запрещено на уровне API и базы данных.
Фильтр периода применяется к заявкам по дате создания, к оплатам по дате
платежа, а к клиентам — по дате появления или активности. Текущая очередь
`WAITING_MANAGER` всегда показывает всех ожидающих ответа независимо от периода;
остальные статусы чатов фильтруются по дате последнего сообщения. Фильтр клиента
ищет по имени, телефону, username и Telegram ID.

## Покрытие данных

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

Входящие сообщения Telegram сохраняются с момента миграции. Ответы, отправленные
из админ-панели или резервного Telegram-топика, меняют состояние диалога
автоматически. Админка и OkoCRM пока не обмениваются исходящими сообщениями:
ответ, отправленный только через OkoCRM, не снимет чат с очереди админки, а ответ
из админки не появится в истории OkoCRM. До подключения outbound webhook/API
нужно отвечать конкретному клиенту из одного выбранного канала.

## Доступ и безопасность

- не публиковать admin-пароль и session secret в репозитории;
- использовать отдельный длинный пароль и случайный secret минимум 32 символа;
- открывать `/admin/` только через HTTPS;
- не кэшировать `/admin/api/*`;
- ограничить доступ по IP через reverse proxy как дополнительную защиту, если
  менеджеры работают из фиксированных сетей или VPN.
