From babaee0ca3e93d182d7fc8ff7d5f7fb0e5e533a8 Mon Sep 17 00:00:00 2001 From: "Andrew K. Choi" Date: Mon, 17 Nov 2025 10:54:30 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=BF=D0=B0=D1=80=D1=81=D0=B8=D0=BD=D0=B3?= =?UTF-8?q?=20=D0=BA=D0=BB=D1=83=D0=B1=D0=BD=D0=BE=D0=B9=20=D0=BA=D0=B0?= =?UTF-8?q?=D1=80=D1=82=D1=8B=20=D0=B8=D0=B7=20=D1=82=D0=B5=D0=BA=D1=81?= =?UTF-8?q?=D1=82=D0=B0=20=D0=BA=D0=B0=D0=B1=D0=B8=D0=BD=D0=B5=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Клубная карта теперь извлекается как отдельное число ПОСЛЕ счета и суммы - Формат: кабинет дата время СЧЕТ сумма КЛУБНАЯ_КАРТА - Пример: 'Viposnova 16-11-2025 13:48:51 21-04-80-64-68-25-68 0.00 2521' - Карта: 2521 (последнее 4-значное число), а НЕ последние 4 цифры счета - Поиск карты после счета с пропуском сумм (содержат точку) --- .bot.pid | 2 +- src/handlers/account_handlers.py | 55 ++++++++++++++------------------ src/utils/account_utils.py | 17 ++++++++-- 3 files changed, 39 insertions(+), 35 deletions(-) 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)