feat: Система автоматического подтверждения выигрышей с поддержкой множественных счетов
Some checks reported errors
continuous-integration/drone/push Build encountered an error

Основные изменения:

 Новые функции:
- Система регистрации пользователей с множественными счетами
- Автоматическое подтверждение выигрышей через 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
This commit is contained in:
2025-11-16 14:01:30 +09:00
parent 31c4c5382a
commit 505d26f0e9
21 changed files with 4217 additions and 68 deletions

424
docs/UPDATE_LOG.md Normal file
View File

@@ -0,0 +1,424 @@
# Обновления системы - 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
- [ ] Победитель получил подтверждение
- [ ] Приз передан победителю