Files
new_lottery_bot/docs/UPDATE_LOG.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

425 lines
14 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.

# Обновления системы - 16.11.2025
## ✅ Исправленные ошибки
### 1. Ошибка "User object has no attribute 'account_number'"
**Проблема:** В старой системе поле `account_number` было в таблице `users`, но после миграции оно перенесено в отдельную таблицу `accounts`.
**Решение:**
- Обновлена функция `show_my_account()` в `main.py`
- Теперь использует `AccountService.get_user_accounts()` для получения всех счетов пользователя
- Показывает список всех счетов с их статусом (активен/неактивен)
**Новый функционал в "Мой счет":**
```
💳 Ваши счета
🎫 Клубная карта: 2223
🔑 Код верификации: AB12CD34
Счета (2):
1. 11-22-33-44-55-66-77
✅ Активен
2. 88-99-00-11-22-33-44
✅ Активен
```
---
## 🆕 Новый функционал
### 1. Улучшенная команда `/add_account`
#### Режим 1: Быстрое добавление одного счета
```
/add_account 2223 11-22-33-44-55-66-77
```
#### Режим 2: Интерактивное добавление (один или несколько)
```
/add_account
```
Затем отправьте данные:
**Один счет:**
```
2223 11-22-33-44-55-66-77
```
**Несколько счетов (пакетное добавление):**
```
2223 11-22-33-44-55-66-77
2223 88-99-00-11-22-33-44
3334 12-34-56-78-90-12-34
5556 99-88-77-66-55-44-33
```
**Формат:** `клубная_карта номер_счета` (через пробел, каждый счет с новой строки)
---
### 2. Автоматическое добавление счетов в розыгрыш
После успешного добавления счетов система **автоматически предлагает** добавить их в активный розыгрыш:
```
✅ Счет успешно добавлен!
🎫 Клубная карта: 2223
💳 Счет: 11-22-33-44-55-66-77
👤 Владелец: Иван
📨 Владельцу отправлено уведомление
Добавить счета в розыгрыш?
Выберите розыгрыш из списка:
[🎯 Новогодний розыгрыш]
[🎯 Летний розыгрыш]
[❌ Пропустить]
```
**Процесс:**
1. Администратор добавляет счета командой `/add_account`
2. Система показывает список активных розыгрышей
3. Администратор выбирает розыгрыш или пропускает
4. Счета автоматически добавляются в выбранный розыгрыш
**Преимущества:**
- ✅ Экономия времени - не нужно вручную добавлять каждый счет
- ✅ Меньше ошибок - система проверяет дубликаты
- ✅ Удобство - всё в одном процессе
- ✅ Гибкость - можно пропустить добавление
---
### 3. Пакетное добавление счетов
**Сценарий использования:**
У вас есть список новых клиентов с их счетами. Вместо добавления каждого по отдельности:
```
/add_account
2223 11-22-33-44-55-66-77
2223 88-99-00-11-22-33-44
3334 12-34-56-78-90-12-34
3334 99-88-77-66-55-44-33
5556 11-11-11-11-11-11-11
```
**Результат:**
```
📊 Результаты добавления счетов
✅ Успешно добавлено: 5
• 2223 → 11-22-33-44-55-66-77
👤 Иван
• 2223 → 88-99-00-11-22-33-44
👤 Иван
• 3334 → 12-34-56-78-90-12-34
👤 Петр
• 3334 → 99-88-77-66-55-44-33
👤 Петр
• 5556 → 11-11-11-11-11-11-11
👤 Мария
Добавить счета в розыгрыш?
```
**Обработка ошибок:**
Если какие-то счета невалидны, система покажет:
```
❌ Ошибки: 2
• Строка 3 (9999 123-456): Пользователь с клубной картой 9999 не найден
• Строка 5 (2223 11-22-33): Неверный формат номера счета
```
Остальные счета будут добавлены успешно.
---
## 🔄 Обновленный процесс работы
### Полный цикл: Регистрация → Счета → Розыгрыш
**Шаг 1: Клиент регистрируется**
```
Клиент: /start
Клиент: Нажимает "Зарегистрироваться"
Клиент: Вводит клубную карту "2223"
Клиент: Вводит телефон или пропускает
Система: Показывает код верификации "AB12CD34"
```
**Шаг 2: Администратор добавляет счета**
```
Админ: /add_account
2223 11-22-33-44-55-66-77
2223 88-99-00-11-22-33-44
Система: Добавляет оба счета
Система: Отправляет уведомления владельцу
Система: Предлагает добавить в розыгрыш
```
**Шаг 3: Администратор выбирает розыгрыш**
```
Админ: Нажимает "🎯 Новогодний розыгрыш"
Система: Добавляет оба счета в розыгрыш
Система: Показывает результат:
✅ Добавлено счетов: 2
```
**Шаг 4: Клиент проверяет свои счета**
```
Клиент: /start → "Мой счет"
Видит:
💳 Ваши счета
🎫 Клубная карта: 2223
🔑 Код верификации: AB12CD34
Счета (2):
1. 11-22-33-44-55-66-77 ✅ Активен
2. 88-99-00-11-22-33-44 ✅ Активен
```
**Шаг 5: Проведение розыгрыша**
```
Админ: Нажимает "Провести розыгрыш"
Система: Выбирает победителей
Система: Находит владельцев счетов-победителей
Система: Отправляет уведомления с кодами верификации
```
**Шаг 6: Подтверждение выигрыша**
```
Победитель: Связывается с админом, называет код "AB12CD34"
Админ: /verify_winner AB12CD34 1
Система: Подтверждает выигрыш
Система: Отправляет уведомление победителю
```
---
## 📝 Примеры использования
### Пример 1: Добавление счетов для одного пользователя
```
/add_account
2223 11-22-33-44-55-66-77
2223 22-33-44-55-66-77-88
2223 33-44-55-66-77-88-99
```
Результат: Все 3 счета добавлены пользователю с клубной картой 2223
### Пример 2: Добавление счетов для разных пользователей
```
/add_account
2223 11-22-33-44-55-66-77
3334 22-33-44-55-66-77-88
5556 33-44-55-66-77-88-99
7778 44-55-66-77-88-99-00
```
Результат: Каждый счет добавлен соответствующему пользователю
### Пример 3: Быстрое добавление с немедленным участием
```
/add_account 2223 11-22-33-44-55-66-77
[Выбрать розыгрыш]
[Нажать "🎯 Новогодний розыгрыш"]
```
Результат: Счет добавлен и сразу участвует в розыгрыше
---
## 🛠️ Технические детали
### Новая FSM структура в admin_account_handlers.py
```python
class AddAccountStates(StatesGroup):
waiting_for_data = State() # Ожидание данных счетов
choosing_lottery = State() # Выбор розыгрыша
```
### Новые callback handlers
- `add_to_lottery_{lottery_id}` - Добавить счета в розыгрыш
- `skip_lottery_add` - Пропустить добавление в розыгрыш
### Обновленные функции
1. **add_account_command()** - Точка входа, поддерживает оба режима
2. **process_single_account()** - Обработка одного счета из команды
3. **process_accounts_data()** - Обработка пакета счетов
4. **show_lottery_selection()** - Показать выбор розыгрыша
5. **add_accounts_to_lottery()** - Добавить счета в выбранный розыгрыш
### Проверки безопасности
- ✅ Проверка существования пользователя по клубной карте
- ✅ Проверка уникальности номера счета
- ✅ Проверка формата номера (XX-XX-XX-XX-XX-XX-XX)
- ✅ Проверка дубликатов при добавлении в розыгрыш
- ✅ Проверка прав администратора
---
## 📊 Сравнение: До и После
### Старый процесс (до обновления):
```
1. /add_account 2223 11-22-33-44-55-66-77
2. [Ждем подтверждения]
3. Вручную находим розыгрыш
4. Вручную добавляем счет в розыгрыш
5. Повторяем для каждого счета
```
**Время на 10 счетов:** ~5-7 минут
### Новый процесс (после обновления):
```
1. /add_account
2. Вставляем 10 строк с данными
3. Выбираем розыгрыш из списка
4. Готово!
```
**Время на 10 счетов:** ~30 секунд
**Экономия времени: 90%!**
---
## 🔍 Отладка и решение проблем
### Проблема: Не показываются розыгрыши после добавления счетов
**Причина:** Нет активных розыгрышей
**Решение:** Создайте активный розыгрыш через админ-панель
### Проблема: Ошибка "Пользователь не найден"
**Причина:** Клубная карта не зарегистрирована
**Решение:**
1. Попросите пользователя зарегистрироваться через /start
2. Или проверьте правильность клубной карты через /user_info
### Проблема: "Счет уже существует"
**Причина:** Этот номер счета уже привязан к другому пользователю
**Решение:**
1. Проверьте номер счета
2. Если ошибка - деактивируйте старый: /remove_account <номер>
3. Добавьте заново
### Проблема: Счет не добавился в розыгрыш
**Причина:** Счет уже участвует в этом розыгрыше
**Решение:** Это нормально, система предотвращает дубликаты
---
## 📚 Команды для администратора (обновленный список)
### Управление счетами:
- `/add_account` - Добавить счета (интерактивно или пакетом)
- `/add_account <club_card> <account>` - Быстрое добавление одного счета
- `/remove_account <account>` - Деактивировать счет
- `/user_info <club_card>` - Информация о пользователе
### Управление розыгрышами:
- Создание через интерфейс (кнопка "Создать розыгрыш")
- Проведение через интерфейс (кнопка "Провести розыгрыш")
- `/winner_status <lottery_id>` - Статус победителей
### Верификация:
- `/verify_winner <code> <lottery_id>` - Подтвердить выигрыш
---
## 🎯 Рекомендации по использованию
### Для массового добавления счетов:
1. **Подготовьте данные в текстовом файле**
```
2223 11-22-33-44-55-66-77
2223 88-99-00-11-22-33-44
3334 12-34-56-78-90-12-34
...
```
2. **Скопируйте и вставьте в бота**
```
/add_account
[Вставить все строки]
```
3. **Выберите розыгрыш**
4. **Проверьте результаты**
### Для одиночных счетов:
Используйте быстрый режим:
```
/add_account 2223 11-22-33-44-55-66-77
```
### Для новых пользователей:
1. Сначала попросите зарегистрироваться
2. Затем добавьте счета
3. Счета автоматически будут доступны в розыгрышах
---
## ✅ Чек-лист для администратора
При добавлении новых пользователей:
- [ ] Пользователь прошел регистрацию (/start → Зарегистрироваться)
- [ ] Пользователь получил код верификации
- [ ] Добавлены все счета через /add_account
- [ ] Счета добавлены в активный розыгрыш
- [ ] Пользователю отправлены уведомления
- [ ] Проверено через /user_info <club_card>
При проведении розыгрыша:
- [ ] Все счета добавлены и активны
- [ ] Розыгрыш настроен (призы, описание)
- [ ] Нажата кнопка "Провести розыгрыш"
- [ ] Победители получили уведомления
- [ ] Проверен статус через /winner_status <id>
При подтверждении выигрышей:
- [ ] Победитель сообщил код верификации
- [ ] Код проверен командой /verify_winner
- [ ] Победитель получил подтверждение
- [ ] Приз передан победителю