diff --git a/src/handlers/admin_account_handlers.py b/src/handlers/admin_account_handlers.py index db4d266..7290023 100644 --- a/src/handlers/admin_account_handlers.py +++ b/src/handlers/admin_account_handlers.py @@ -43,11 +43,12 @@ async def add_account_command(message: Message, state: FSMContext): await state.set_state(AddAccountStates.waiting_for_data) await message.answer( "💳 **Добавление счетов**\n\n" - "Отправьте данные в формате:\n" - "`клубная_карта номер_счета`\n\n" - "**Для одного счета:**\n" - "`2223 11-22-33-44-55-66-77`\n\n" - "**Для нескольких счетов (каждый с новой строки):**\n" + "📋 **Формат 1 (однострочный):**\n" + "`карта счет`\n" + "Пример: `2223 11-22-33-44-55-66-77`\n\n" + "📋 **Формат 2 (многострочный из таблицы):**\n" + "Скопируйте столбцы со счетами и картами - система сама распознает\n\n" + "**Для нескольких счетов:**\n" "`2223 11-22-33-44-55-66-77`\n" "`2223 88-99-00-11-22-33-44`\n" "`3334 12-34-56-78-90-12-34`\n\n" @@ -121,14 +122,48 @@ async def process_accounts_data(message: Message, state: FSMContext): accounts_data = [] errors = [] - for i, line in enumerate(lines, 1): - parts = line.strip().split() - if len(parts) != 2: - errors.append(f"Строка {i}: неверный формат (ожидается: клубная_карта номер_счета)") + # Универсальный парсер: поддержка однострочного и многострочного формата + i = 0 + while i < len(lines): + line = lines[i].strip() + + # Пропускаем пустые строки и строки с названиями/датами + if not line or any(x in line.lower() for x in ['viposnova', '0.00', ':']): + i += 1 continue - club_card, account_number = parts + # Проверяем, есть ли в строке пробел (однострочный формат: "карта счет") + if ' ' in line: + # Однострочный формат: разделяем по первому пробелу + parts = line.split(maxsplit=1) + if len(parts) == 2: + club_card, account_number = parts + else: + errors.append(f"Строка {i+1}: неверный формат") + i += 1 + continue + else: + # Многострочный формат: текущая строка - счет, следующая - карта + account_number = line + i += 1 + if i >= len(lines): + errors.append(f"Строка {i}: отсутствует номер карты после счета {account_number}") + break + + club_card = lines[i].strip() + # Пропускаем, если следующая строка содержит мусор + if not club_card or any(x in club_card.lower() for x in ['viposnova', '0.00', ':']): + errors.append(f"Строка {i}: некорректный номер карты после счета {account_number}") + i += 1 + continue + club_card = lines[i].strip() + # Пропускаем, если следующая строка содержит мусор + if not club_card or any(x in club_card.lower() for x in ['viposnova', '0.00', ':']): + errors.append(f"Строка {i}: некорректный номер карты после счета {account_number}") + i += 1 + continue + # Создаем счет try: async with async_session_maker() as session: account = await AccountService.create_account( @@ -159,9 +194,11 @@ async def process_accounts_data(message: Message, state: FSMContext): pass except ValueError as e: - errors.append(f"Строка {i} ({club_card} {account_number}): {str(e)}") + errors.append(f"Счет {account_number} (карта {club_card}): {str(e)}") except Exception as e: - errors.append(f"Строка {i}: {str(e)}") + errors.append(f"Счет {account_number}: {str(e)}") + + i += 1 # Формируем отчет text = f"📊 **Результаты добавления счетов**\n\n" diff --git a/src/handlers/chat_handlers.py b/src/handlers/chat_handlers.py index d5d4c18..29ad5a6 100644 --- a/src/handlers/chat_handlers.py +++ b/src/handlers/chat_handlers.py @@ -163,7 +163,8 @@ async def handle_text_message(message: Message): # Обрабатываем в зависимости от режима if settings.mode == 'broadcast': # Режим рассылки с планировщиком - forwarded_ids, success, fail = await broadcast_message_with_scheduler(message, exclude_user_id=message.from_user.id) + # НЕ исключаем отправителя - админ должен видеть все сообщения + forwarded_ids, success, fail = await broadcast_message_with_scheduler(message, exclude_user_id=None) # Сохраняем сообщение в историю await ChatMessageService.save_message(