Files
new_lottery_bot/docs/ADMIN_COMMANDS.md
Andrew K. Choi 505d26f0e9
Some checks reported errors
continuous-integration/drone/push Build encountered an error
feat: Система автоматического подтверждения выигрышей с поддержкой множественных счетов
Основные изменения:

 Новые функции:
- Система регистрации пользователей с множественными счетами
- Автоматическое подтверждение выигрышей через inline-кнопки
- Механизм переигровки для неподтвержденных выигрышей (24 часа)
- Подтверждение на уровне счетов (каждый счет подтверждается отдельно)
- Скрипт полной очистки базы данных

🔧 Технические улучшения:
- Исправлена ошибка MissingGreenlet при lazy loading (добавлен joinedload/selectinload)
- Добавлено поле claimed_at для отслеживания времени подтверждения
- Пакетное добавление счетов с выбором розыгрыша
- Проверка владения конкретным счетом при подтверждении

📚 Документация:
- docs/AUTO_CONFIRM_SYSTEM.md - Полная документация системы подтверждения
- docs/ACCOUNT_BASED_CONFIRMATION.md - Подтверждение на уровне счетов
- docs/REGISTRATION_SYSTEM.md - Система регистрации
- docs/ADMIN_COMMANDS.md - Команды администратора
- docs/CLEAR_DATABASE.md - Очистка БД
- docs/QUICK_GUIDE.md - Быстрое начало
- docs/UPDATE_LOG.md - Журнал обновлений

🗄️ База данных:
- Миграция 003: Таблицы accounts, winner_verifications
- Миграция 004: Поле claimed_at в таблице winners
- Скрипт scripts/clear_database.py для полной очистки

🎮 Новые команды:
Админские:
- /check_unclaimed <lottery_id> - Проверка неподтвержденных выигрышей
- /redraw <lottery_id> - Повторный розыгрыш
- /add_accounts - Пакетное добавление счетов
- /list_accounts <telegram_id> - Список счетов пользователя

Пользовательские:
- /register - Регистрация с вводом данных
- /my_account - Просмотр своих счетов
- Callback confirm_win_{id} - Подтверждение выигрыша

🛠️ Makefile:
- make clear-db - Очистка всех данных из БД (с подтверждением)

🔒 Безопасность:
- Проверка владения счетом при подтверждении
- Защита от подтверждения чужих счетов
- Независимое подтверждение каждого выигрышного счета

📊 Логика работы:
1. Пользователь регистрируется и добавляет счета
2. Счета участвуют в розыгрыше
3. Победители получают уведомление с кнопкой подтверждения
4. Каждый счет подтверждается отдельно (24 часа на подтверждение)
5. Неподтвержденные выигрыши переигрываются через /redraw
2025-11-16 14:01:30 +09:00

319 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Админские команды - Руководство
## 🎯 Управление счетами
### `/add_account` - Добавить счет пользователю
Привязывает счет к зарегистрированному пользователю по клубной карте.
**Формат:**
```
/add_account <club_card> <account_number>
```
**Пример:**
```
/add_account 2223 11-22-33-44-55-66-77
```
**Что происходит:**
- Система проверяет существование пользователя с указанной клубной картой
- Создает новую запись счета в таблице `accounts`
- Отправляет уведомление владельцу о добавлении счета
- Счет становится активным и может участвовать в розыгрышах
**Возможные ошибки:**
- "Пользователь с клубной картой X не найден" - пользователь не зарегистрирован
- "Счет уже существует" - этот номер счета уже привязан к другому пользователю
---
### `/remove_account` - Деактивировать счет
Делает счет неактивным (не удаляет из БД).
**Формат:**
```
/remove_account <account_number>
```
**Пример:**
```
/remove_account 11-22-33-44-55-66-77
```
**Что происходит:**
- Устанавливает флаг `is_active = False`
- Счет остается в БД, но не может участвовать в новых розыгрышах
- История участия сохраняется
---
## 🏆 Управление выигрышами
### `/verify_winner` - Подтвердить выигрыш
Подтверждает выигрыш по коду верификации пользователя.
**Формат:**
```
/verify_winner <verification_code> <lottery_id>
```
**Пример:**
```
/verify_winner AB12CD34 1
```
**Процесс верификации:**
1. Пользователь сообщает администратору свой код верификации
2. Администратор проверяет, что пользователь является победителем указанного розыгрыша
3. Система устанавливает флаг `is_claimed = True` для выигрыша
4. Отправляется уведомление победителю о подтверждении
**Что происходит:**
- Поиск пользователя по коду верификации
- Проверка наличия выигрыша в указанном розыгрыше
- Установка флага `is_claimed = True`
- Отправка подтверждающего сообщения победителю
**Возможные ошибки:**
- "Розыгрыш не найден" - неверный lottery_id
- "Выигрыш не найден" - неверный код или пользователь не победитель
- "Выигрыш уже был подтвержден" - повторная попытка подтверждения
---
### `/winner_status` - Статус победителей
Показывает всех победителей розыгрыша и их статус подтверждения.
**Формат:**
```
/winner_status <lottery_id>
```
**Пример:**
```
/winner_status 1
```
**Отображаемая информация:**
- 🏆 Место и приз
- 👤 Имя и клубная карта победителя
- 💳 Номер счета (если участвовал через счет)
- ✅ Статус подтверждения (подтвержден / ожидает)
- 📨 Статус уведомления (отправлено / нет)
**Статусы:**
- ✅ - Выигрыш подтвержден (`is_claimed = True`)
- ⏳ - Ожидает подтверждения (`is_claimed = False`)
- 📨 - Уведомление отправлено (`is_notified = True`)
- 📭 - Уведомление не отправлено (`is_notified = False`)
---
## 👤 Информация о пользователе
### `/user_info` - Информация о пользователе
Показывает полную информацию о пользователе по клубной карте.
**Формат:**
```
/user_info <club_card>
```
**Пример:**
```
/user_info 2223
```
**Отображаемая информация:**
- 🎫 Клубная карта
- 👤 Имя и Telegram username
- 📞 Телефон (если указан)
- 🔑 Код верификации
- 📅 Дата регистрации
- 💳 Список всех счетов (активные и неактивные)
- 🏆 История выигрышей
---
## 🔄 Автоматические уведомления
При проведении розыгрыша (`/conduct` через кнопку) система автоматически:
1. **Определяет владельцев счетов-победителей**
- Ищет запись в таблице `accounts`
- Находит владельца через `owner_id`
2. **Создает токен верификации**
- Генерирует уникальный токен для каждого выигрыша
- Устанавливает срок действия 24 часа
- Сохраняет в таблице `winner_verifications`
3. **Отправляет уведомление победителю**
```
🎉 Поздравляем! Ваш счет выиграл!
🎯 Розыгрыш: Название розыгрыша
🏆 Место: 1
🎁 Приз: Приз первого места
💳 Счет: 11-22-33-44-55-66-77
🔑 Ваш код верификации: AB12CD34
Для получения приза свяжитесь с администратором
и предоставьте этот код.
```
4. **Устанавливает флаг уведомления**
- `is_notified = True` в таблице `winners`
---
## 🔐 Система верификации
### Как это работает:
1. **При регистрации пользователя:**
- Генерируется уникальный 8-символьный код (например, `AB12CD34`)
- Сохраняется в `users.verification_code`
- Пользователь может посмотреть свой код через `/my_code`
2. **При выигрыше:**
- Владельцу счета отправляется сообщение с его кодом верификации
- Создается токен в таблице `winner_verifications`
3. **При подтверждении выигрыша:**
- Администратор запрашивает код у победителя
- Вводит команду `/verify_winner AB12CD34 1`
- Система проверяет соответствие кода и наличие выигрыша
- Устанавливает `is_claimed = True`
### Преимущества:
- 🔒 **Безопасность**: Только владелец знает свой код
- ✅ **Проверка**: Невозможно подтвердить чужой выигрыш
- 📊 **Отслеживание**: Полная история подтверждений
- ⏱️ **Контроль**: Токены имеют срок действия
---
## 📊 Типичные сценарии
### Сценарий 1: Новый пользователь с двумя счетами
```
1. Пользователь: /start → "Зарегистрироваться"
2. Пользователь: Вводит клубную карту "2223"
3. Пользователь: Вводит телефон или пропускает
4. Система: Показывает код верификации "AB12CD34"
5. Админ: /add_account 2223 11-22-33-44-55-66-77
6. Админ: /add_account 2223 88-99-00-11-22-33-44
7. Пользователь: /my_accounts
→ Видит оба счета
```
### Сценарий 2: Проведение розыгрыша и подтверждение
```
1. Админ: Создает розыгрыш через интерфейс
2. Счета участвуют автоматически
3. Админ: Нажимает "Провести розыгрыш"
4. Система: Автоматически отправляет уведомления:
"🎉 Поздравляем! Ваш счет выиграл!
💳 Счет: 11-22-33-44-55-66-77
🔑 Ваш код верификации: AB12CD34"
5. Победитель: Связывается с админом, называет код "AB12CD34"
6. Админ: /verify_winner AB12CD34 1
7. Система: Подтверждает выигрыш, отправляет уведомление победителю
```
### Сценарий 3: Проверка статуса всех победителей
```
1. Админ: /winner_status 1
Результат:
🏆 Победители розыгрыша 'Новогодний розыгрыш':
✅ 1 место - Главный приз
👤 Иван (КК: 2223)
💳 11-22-33-44-55-66-77
✅ Подтвержден
⏳ 2 место - Второй приз
👤 Петр (КК: 3334)
💳 22-33-44-55-66-77-88
⏳ Ожидает подтверждения
```
---
## 🛠️ Техническая информация
### Таблицы базы данных:
**accounts** - Счета пользователей
- `account_number` - Номер счета (формат XX-XX-XX-XX-XX-XX-XX)
- `owner_id` - ID владельца (FK → users.id)
- `is_active` - Активен ли счет
- `created_at` - Дата создания
**winner_verifications** - Токены верификации выигрышей
- `winner_id` - ID выигрыша (FK → winners.id)
- `verification_token` - Уникальный токен
- `is_verified` - Подтвержден ли
- `verified_at` - Время подтверждения
- `expires_at` - Срок действия (24 часа)
**winners** - Победители (расширенная)
- Добавлены поля: `is_notified`, `is_claimed`
**users** - Пользователи (расширенная)
- Добавлены поля: `club_card_number`, `phone`, `is_registered`, `verification_code`
---
## 📝 Полезные команды для пользователей
- `/start` - Главное меню / регистрация
- `/my_code` - Показать свой код верификации
- `/my_accounts` - Список моих счетов
---
## ⚠️ Важные замечания
1. **Код верификации** - строго конфиденциальная информация
2. **Один счет** = один владелец (нельзя передать счет другому)
3. **Деактивация счета** - не удаляет историю участия
4. **Токены верификации** - действуют 24 часа
5. **Уведомления** - отправляются автоматически только если пользователь зарегистрирован
---
## 🆘 Решение проблем
**Пользователь не получил уведомление о выигрыше:**
- Проверить `/winner_status <lottery_id>` - должна быть отметка 📨
- Возможно, пользователь заблокировал бота
- Проверить telegram_id пользователя через `/user_info`
**Не получается подтвердить выигрыш:**
- Проверить код верификации: `/user_info <club_card>`
- Убедиться что lottery_id верный
- Проверить что выигрыш еще не подтвержден
**Счет не добавляется:**
- Убедиться что пользователь зарегистрирован
- Проверить формат номера счета (7 пар цифр через дефис)
- Проверить что счет уникален (не добавлен другому пользователю)