Основные изменения: ✨ Новые функции: - Система регистрации пользователей с множественными счетами - Автоматическое подтверждение выигрышей через 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
14 KiB
Обновления системы - 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
👤 Владелец: Иван
📨 Владельцу отправлено уведомление
➕ Добавить счета в розыгрыш?
Выберите розыгрыш из списка:
[🎯 Новогодний розыгрыш]
[🎯 Летний розыгрыш]
[❌ Пропустить]
Процесс:
- Администратор добавляет счета командой
/add_account - Система показывает список активных розыгрышей
- Администратор выбирает розыгрыш или пропускает
- Счета автоматически добавляются в выбранный розыгрыш
Преимущества:
- ✅ Экономия времени - не нужно вручную добавлять каждый счет
- ✅ Меньше ошибок - система проверяет дубликаты
- ✅ Удобство - всё в одном процессе
- ✅ Гибкость - можно пропустить добавление
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
class AddAccountStates(StatesGroup):
waiting_for_data = State() # Ожидание данных счетов
choosing_lottery = State() # Выбор розыгрыша
Новые callback handlers
add_to_lottery_{lottery_id}- Добавить счета в розыгрышskip_lottery_add- Пропустить добавление в розыгрыш
Обновленные функции
- add_account_command() - Точка входа, поддерживает оба режима
- process_single_account() - Обработка одного счета из команды
- process_accounts_data() - Обработка пакета счетов
- show_lottery_selection() - Показать выбор розыгрыша
- 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%!
🔍 Отладка и решение проблем
Проблема: Не показываются розыгрыши после добавления счетов
Причина: Нет активных розыгрышей
Решение: Создайте активный розыгрыш через админ-панель
Проблема: Ошибка "Пользователь не найден"
Причина: Клубная карта не зарегистрирована
Решение:
- Попросите пользователя зарегистрироваться через /start
- Или проверьте правильность клубной карты через /user_info
Проблема: "Счет уже существует"
Причина: Этот номер счета уже привязан к другому пользователю
Решение:
- Проверьте номер счета
- Если ошибка - деактивируйте старый: /remove_account <номер>
- Добавьте заново
Проблема: Счет не добавился в розыгрыш
Причина: Счет уже участвует в этом розыгрыше
Решение: Это нормально, система предотвращает дубликаты
📚 Команды для администратора (обновленный список)
Управление счетами:
/add_account- Добавить счета (интерактивно или пакетом)/add_account <club_card> <account>- Быстрое добавление одного счета/remove_account <account>- Деактивировать счет/user_info <club_card>- Информация о пользователе
Управление розыгрышами:
- Создание через интерфейс (кнопка "Создать розыгрыш")
- Проведение через интерфейс (кнопка "Провести розыгрыш")
/winner_status <lottery_id>- Статус победителей
Верификация:
/verify_winner <code> <lottery_id>- Подтвердить выигрыш
🎯 Рекомендации по использованию
Для массового добавления счетов:
-
Подготовьте данные в текстовом файле
2223 11-22-33-44-55-66-77 2223 88-99-00-11-22-33-44 3334 12-34-56-78-90-12-34 ... -
Скопируйте и вставьте в бота
/add_account [Вставить все строки] -
Выберите розыгрыш
-
Проверьте результаты
Для одиночных счетов:
Используйте быстрый режим:
/add_account 2223 11-22-33-44-55-66-77
Для новых пользователей:
- Сначала попросите зарегистрироваться
- Затем добавьте счета
- Счета автоматически будут доступны в розыгрышах
✅ Чек-лист для администратора
При добавлении новых пользователей:
- Пользователь прошел регистрацию (/start → Зарегистрироваться)
- Пользователь получил код верификации
- Добавлены все счета через /add_account
- Счета добавлены в активный розыгрыш
- Пользователю отправлены уведомления
- Проверено через /user_info <club_card>
При проведении розыгрыша:
- Все счета добавлены и активны
- Розыгрыш настроен (призы, описание)
- Нажата кнопка "Провести розыгрыш"
- Победители получили уведомления
- Проверен статус через /winner_status
При подтверждении выигрышей:
- Победитель сообщил код верификации
- Код проверен командой /verify_winner
- Победитель получил подтверждение
- Приз передан победителю