fix: парсинг клубной карты из следующей строки
- Поддержка многострочного формата из кабинета - Строка 1: название кабинета, дата, время - Строка 2: номер счета - Строка 3: сумма и клубная карта (последнее 4-значное число) - Если карта не найдена в текущей строке, проверяется следующая
This commit is contained in:
@@ -103,9 +103,11 @@ def parse_accounts_from_message(text: str) -> List[str]:
|
|||||||
Поддерживает формат: "КАРТА СЧЕТ" (например "2521 11-22-33-44-55-66-77")
|
Поддерживает формат: "КАРТА СЧЕТ" (например "2521 11-22-33-44-55-66-77")
|
||||||
или просто "СЧЕТ" (например "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:
|
Args:
|
||||||
text: Текст сообщения
|
text: Текст сообщения
|
||||||
@@ -118,10 +120,10 @@ def parse_accounts_from_message(text: str) -> List[str]:
|
|||||||
|
|
||||||
accounts = []
|
accounts = []
|
||||||
|
|
||||||
# Обработка построчно - для текста из кабинета с мусорными данными
|
# Обработка построчно - для текста из кабинета
|
||||||
lines = text.strip().split('\n')
|
lines = text.strip().split('\n')
|
||||||
|
|
||||||
for line in lines:
|
for line_idx, line in enumerate(lines):
|
||||||
# Разбиваем строку по пробелам
|
# Разбиваем строку по пробелам
|
||||||
parts = line.strip().split()
|
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):
|
if re.match(r'^\d{2}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}$', part):
|
||||||
formatted = format_account_number(part)
|
formatted = format_account_number(part)
|
||||||
if formatted and formatted not in accounts:
|
if formatted and formatted not in accounts:
|
||||||
# Проверяем СЛЕДУЮЩУЮ часть после сумм на номер карты (4 цифры)
|
|
||||||
# Формат: ... СЧЕТ СУММА КАРТА
|
|
||||||
# Пропускаем части с суммами (содержат точку или начинаются с 0.)
|
|
||||||
card = None
|
card = None
|
||||||
|
|
||||||
|
# Сначала проверяем текущую строку на карту после счета
|
||||||
for j in range(i + 1, len(parts)):
|
for j in range(i + 1, len(parts)):
|
||||||
if re.match(r'^\d{4}$', parts[j]):
|
if re.match(r'^\d{4}$', parts[j]):
|
||||||
card = 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]):
|
if not re.match(r'^\d+\.\d+$', parts[j]):
|
||||||
break
|
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:
|
if card:
|
||||||
full_account = f"{card} {formatted}"
|
full_account = f"{card} {formatted}"
|
||||||
if full_account not in accounts:
|
if full_account not in accounts:
|
||||||
|
|||||||
Reference in New Issue
Block a user