diff --git a/.bot.pid b/.bot.pid index 445d7be..8c121d5 100644 --- a/.bot.pid +++ b/.bot.pid @@ -1 +1 @@ -948258 +960923 diff --git a/src/handlers/account_handlers.py b/src/handlers/account_handlers.py index 5281768..510db34 100644 --- a/src/handlers/account_handlers.py +++ b/src/handlers/account_handlers.py @@ -53,7 +53,7 @@ async def detect_account_input(message: Message, state: FSMContext): if not accounts: return # Счета не обнаружены, пропускаем - # Извлекаем номера клубных карт из последних 4 цифр каждого счета + # Извлекаем номера клубных карт и определяем владельцев from ..core.services import UserService from ..core.registration_services import AccountService @@ -61,41 +61,34 @@ async def detect_account_input(message: Message, state: FSMContext): accounts_with_owners = [] for account in accounts: - # Извлекаем только номер счета (без карты если есть) + # Парсим строку счета: может быть "КАРТА СЧЕТ" или просто "СЧЕТ" parts = account.split() - account_number = parts[-1] if parts else account - # Извлекаем последние 4 цифры (номер клубной карты) - digits_only = account_number.replace('-', '').replace(' ', '') - if len(digits_only) >= 4: - club_card = digits_only[-4:] # Последние 4 цифры - - # Ищем пользователя по номеру клубной карты + club_card = None + account_number = None + + if len(parts) == 2: + # Формат: "КАРТА СЧЕТ" (например "2521 21-04-80-64-68-25-68") + club_card = parts[0] + account_number = parts[1] + elif len(parts) == 1: + # Формат: только "СЧЕТ" (например "21-04-80-64-68-25-68") + account_number = parts[0] + + # Если есть номер клубной карты, ищем владельца + user = None + owner_info = None + if club_card: user = await UserService.get_user_by_club_card(session, club_card) - if user: owner_info = f"@{user.username}" if user.username else user.first_name - accounts_with_owners.append({ - 'account': account, - 'club_card': club_card, - 'owner': owner_info, - 'user_id': user.id - }) - else: - accounts_with_owners.append({ - 'account': account, - 'club_card': club_card, - 'owner': None, - 'user_id': None - }) - else: - # Счет неверного формата - accounts_with_owners.append({ - 'account': account, - 'club_card': None, - 'owner': None, - 'user_id': None - }) + + accounts_with_owners.append({ + 'account': account, + 'club_card': club_card, + 'owner': owner_info, + 'user_id': user.id if user else None + }) # Сохраняем счета в состоянии await state.update_data( diff --git a/src/utils/account_utils.py b/src/utils/account_utils.py index b480ad5..19f933a 100644 --- a/src/utils/account_utils.py +++ b/src/utils/account_utils.py @@ -105,6 +105,7 @@ def parse_accounts_from_message(text: str) -> List[str]: Также обрабатывает текст из кабинета с мусором: "Viposnova 16-11-2025 22:19:36 17-24-66-42-38-31-53 0.00 2918" + Формат: кабинет дата время СЧЕТ сумма КЛУБНАЯ_КАРТА Args: text: Текст сообщения @@ -130,9 +131,19 @@ def parse_accounts_from_message(text: str) -> List[str]: if re.match(r'^\d{2}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}$', part): formatted = format_account_number(part) if formatted and formatted not in accounts: - # Проверяем предыдущую часть на номер карты (4 цифры) - if i > 0 and re.match(r'^\d{4}$', parts[i-1]): - card = parts[i-1] + # Проверяем СЛЕДУЮЩУЮ часть после сумм на номер карты (4 цифры) + # Формат: ... СЧЕТ СУММА КАРТА + # Пропускаем части с суммами (содержат точку или начинаются с 0.) + card = None + for j in range(i + 1, len(parts)): + if re.match(r'^\d{4}$', parts[j]): + card = parts[j] + break + # Если нашли не сумму и не карту - выходим + if not re.match(r'^\d+\.\d+$', parts[j]): + break + + if card: full_account = f"{card} {formatted}" if full_account not in accounts: accounts.append(full_account)