From e882601b85f23d4de156d8b28156151738668459 Mon Sep 17 00:00:00 2001 From: "Andrew K. Choi" Date: Mon, 17 Nov 2025 10:57:18 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=B3=D1=80=D1=83=D0=BF=D0=BF=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=B7=D0=B0=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=BF=D0=BE=20=D0=BC=D0=B0=D1=80=D0=BA=D0=B5?= =?UTF-8?q?=D1=80=D1=83=20Viposnova?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Одна запись = от 'Viposnova' до следующего 'Viposnova' - Все строки между маркерами объединяются в одну запись - Извлечение счета и клубной карты из объединенной записи - Пример: 'Viposnova 16-11-2025 22:19:36 17-24-66-42-38-31-53 0.00 2918' --- src/utils/account_utils.py | 86 +++++++++++++++++++++----------------- 1 file changed, 48 insertions(+), 38 deletions(-) diff --git a/src/utils/account_utils.py b/src/utils/account_utils.py index b429c7d..8c7a8da 100644 --- a/src/utils/account_utils.py +++ b/src/utils/account_utils.py @@ -104,10 +104,10 @@ def parse_accounts_from_message(text: str) -> List[str]: или просто "СЧЕТ" (например "11-22-33-44-55-66-77") Также обрабатывает многострочный текст из кабинета: - Строка 1: "Viposnova 16-11-2025 22:19:36" - Строка 2: "17-24-66-42-38-31-53" - Строка 3: "0.00 2918" - Формат: строка со счетом, следующая строка с суммой и клубной картой + Запись начинается со слова "Viposnova" и содержит несколько строк до следующего "Viposnova": + "Viposnova 16-11-2025 22:19:36 + 17-24-66-42-38-31-53 + 0.00 2918" Args: text: Текст сообщения @@ -120,45 +120,55 @@ def parse_accounts_from_message(text: str) -> List[str]: accounts = [] - # Обработка построчно - для текста из кабинета + # Группируем строки по записям (от "Viposnova" до следующего "Viposnova") lines = text.strip().split('\n') + current_record = [] + records = [] - for line_idx, line in enumerate(lines): - # Разбиваем строку по пробелам - parts = line.strip().split() + for line in lines: + stripped = line.strip() + # Если строка начинается с Viposnova и у нас уже есть текущая запись - сохраняем её + if stripped.startswith('Viposnova') and current_record: + records.append(' '.join(current_record)) + current_record = [stripped] + else: + current_record.append(stripped) + + # Добавляем последнюю запись + if current_record: + records.append(' '.join(current_record)) + + # Обрабатываем каждую запись + for record in records: + parts = record.split() - # Ищем в каждой части паттерны счетов + # Ищем счет в записи + account_number = None + account_idx = None for i, part in enumerate(parts): - # Проверяем, является ли эта часть счетом (7 пар цифр через дефис) 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: - 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 not card and line_idx + 1 < len(lines): - next_line_parts = lines[line_idx + 1].strip().split() - # Ищем 4-значное число в следующей строке (обычно последнее) - for next_part in next_line_parts: - if re.match(r'^\d{4}$', next_part): - card = next_part - - if card: - full_account = f"{card} {formatted}" - if full_account not in accounts: - accounts.append(full_account) - else: - # Добавляем только счет - accounts.append(formatted) + account_number = format_account_number(part) + account_idx = i + break + + if not account_number or account_number in accounts: + continue + + # Ищем клубную карту (4-значное число после счета) + card = None + if account_idx is not None: + for j in range(account_idx + 1, len(parts)): + if re.match(r'^\d{4}$', parts[j]): + card = parts[j] + break + + # Добавляем результат + if card: + full_account = f"{card} {account_number}" + if full_account not in accounts: + accounts.append(full_account) + else: + accounts.append(account_number) # Если построчная обработка ничего не нашла, используем старый метод if not accounts: