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

14 KiB
Raw Permalink Blame History

Обновления системы - 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

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

При подтверждении выигрышей:

  • Победитель сообщил код верификации
  • Код проверен командой /verify_winner
  • Победитель получил подтверждение
  • Приз передан победителю