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
425 lines
14 KiB
Markdown
425 lines
14 KiB
Markdown
# Обновления системы - 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
|
||
- [ ] Победитель получил подтверждение
|
||
- [ ] Приз передан победителю
|