fix: парсинг клубной карты из следующей строки

- Поддержка многострочного формата из кабинета
- Строка 1: название кабинета, дата, время
- Строка 2: номер счета
- Строка 3: сумма и клубная карта (последнее 4-значное число)
- Если карта не найдена в текущей строке, проверяется следующая
This commit is contained in:
2025-11-17 10:55:52 +09:00
parent babaee0ca3
commit 57da952b80
2 changed files with 18 additions and 9 deletions

View File

@@ -103,9 +103,11 @@ def parse_accounts_from_message(text: str) -> List[str]:
Поддерживает формат: "КАРТА СЧЕТ" (например "2521 11-22-33-44-55-66-77")
или просто "СЧЕТ" (например "11-22-33-44-55-66-77")
Также обрабатывает текст из кабинета с мусором:
"Viposnova 16-11-2025 22:19:36 17-24-66-42-38-31-53 0.00 2918"
Формат: кабинет дата время СЧЕТ сумма КЛУБНАЯ_КАРТА
Также обрабатывает многострочный текст из кабинета:
Строка 1: "Viposnova 16-11-2025 22:19:36"
Строка 2: "17-24-66-42-38-31-53"
Строка 3: "0.00 2918"
Формат: строка со счетом, следующая строка с суммой и клубной картой
Args:
text: Текст сообщения
@@ -118,10 +120,10 @@ def parse_accounts_from_message(text: str) -> List[str]:
accounts = []
# Обработка построчно - для текста из кабинета с мусорными данными
# Обработка построчно - для текста из кабинета
lines = text.strip().split('\n')
for line in lines:
for line_idx, line in enumerate(lines):
# Разбиваем строку по пробелам
parts = line.strip().split()
@@ -131,10 +133,9 @@ 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 цифры)
# Формат: ... СЧЕТ СУММА КАРТА
# Пропускаем части с суммами (содержат точку или начинаются с 0.)
card = None
# Сначала проверяем текущую строку на карту после счета
for j in range(i + 1, len(parts)):
if re.match(r'^\d{4}$', parts[j]):
card = parts[j]
@@ -143,6 +144,14 @@ def parse_accounts_from_message(text: str) -> List[str]:
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: