Теперь в сообщениях об ошибках показывается:
- Только номер счета (без номера карты)
- Номер карты в скобках где уместно
Пример: 'Неверный формат счета: 41-78-72-49-24-43-35 (карта: 2522)'
Вместо: 'Неверный формат счета: 2522 41-78-72-49-24-43-35'
Проблема:
- UserService.get_user_by_account() искал в User.account_number (старое поле)
- Новая система хранит счета в отдельной таблице Account
Решение:
- Заменен на AccountService.get_account_owner() в обеих функциях
- add_participants_by_accounts_bulk()
- remove_participants_by_accounts_bulk()
- Теперь правильно находит владельцев через таблицу Account
- Улучшены сообщения об ошибках с указанием номера карты
Проблема: при массовом добавлении/удалении использовался простой split(),
который не обрабатывал формат 'КАРТА СЧЕТ' корректно
Решение:
- Заменил простой split('\n') и split(',') на parse_accounts_from_message()
- Теперь все массовые операции используют единую логику парсинга
- Корректно обрабатывается формат '2522 63-30-90-57-17-91-75'
Затронутые функции:
- process_bulk_add_accounts()
- process_bulk_remove_accounts()
Заменен подход с негативными lookbehind на удаление найденных совпадений:
- Сначала находим все 'КАРТА СЧЕТ' паттерны
- Заменяем их пробелами в копии текста
- Потом ищем только счета в оставшемся тексте
- Это предотвращает дублирование типа '25-22-63-30-90-57-17'
Исправления:
1. Парсинг счетов (parse_accounts_from_message):
- Исправлено дублирование счетов при формате 'КАРТА СЧЕТ'
- Добавлены негативные lookbehind для корректного разбора
- Теперь '2521 11-22-33-44-55-66-77' парсится только 1 раз
2. Уведомления победителям:
- Создан новый модуль src/utils/notifications.py
- Добавлена функция notify_winners_async()
- Уведомления отправляются автоматически после розыгрыша
- Поддержка счетов и обычных пользователей
- Включает кнопки подтверждения для победителей по счетам
- Updated parse_accounts_from_message() to support 'CARD ACCOUNT' format
- Updated set_account_as_winner() to split by space before formatting
- Added card number display in success/error messages
- Now winner setting works with format '2521 45-59-19-91-23-80-37'
- Changed logic to split input by space: left = club card number, right = account number
- Updated add_participants_by_accounts_bulk() to handle '2521 12-64-89-29-62-40-74' format
- Updated remove_participants_by_accounts_bulk() with same logic
- Now shows club card number in details: 'Name (card: 2521, account: 12-64-89-29-62-40-74)'
- Backwards compatible: still works with just account number (no space)
- Removed duplicate admin callback handlers from main.py (moved to admin_panel.py)
- Removed unused methods from BotController (handle_admin_panel, handle_lottery_management, handle_conduct_lottery_admin, handle_conduct_lottery)
- Removed unused keyboard methods from ui.py (get_lottery_management_keyboard, get_lottery_keyboard, get_conduct_lottery_keyboard)
- Simplified IBotController interface to only essential methods
- Simplified IKeyboardBuilder interface to only used methods
- Fixed cmd_admin handler to directly show admin panel
- Bot now uses centralized admin handlers from admin_panel.py
- Updated admin panel keyboard to match admin_panel.py handlers
- Changed registration button logic: show only for unregistered non-admins
- Added missing methods to IBotController interface
- Updated get_main_keyboard to accept is_registered parameter
- Simplified admin panel structure with proper callback routing
- Removed test callback button from production UI
- Created ADMIN_PANEL_STRUCTURE.md and ADMIN_PANEL_TESTING.md documentation