feature/chat-system #2
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user