fix: группировка записей по маркеру Viposnova
Some checks reported errors
continuous-integration/drone/push Build encountered an error
Some checks reported errors
continuous-integration/drone/push Build encountered an error
- Одна запись = от 'Viposnova' до следующего 'Viposnova' - Все строки между маркерами объединяются в одну запись - Извлечение счета и клубной карты из объединенной записи - Пример: 'Viposnova 16-11-2025 22:19:36 17-24-66-42-38-31-53 0.00 2918'
This commit is contained in:
@@ -104,10 +104,10 @@ def parse_accounts_from_message(text: str) -> List[str]:
|
|||||||
или просто "СЧЕТ" (например "11-22-33-44-55-66-77")
|
или просто "СЧЕТ" (например "11-22-33-44-55-66-77")
|
||||||
|
|
||||||
Также обрабатывает многострочный текст из кабинета:
|
Также обрабатывает многострочный текст из кабинета:
|
||||||
Строка 1: "Viposnova 16-11-2025 22:19:36"
|
Запись начинается со слова "Viposnova" и содержит несколько строк до следующего "Viposnova":
|
||||||
Строка 2: "17-24-66-42-38-31-53"
|
"Viposnova 16-11-2025 22:19:36
|
||||||
Строка 3: "0.00 2918"
|
17-24-66-42-38-31-53
|
||||||
Формат: строка со счетом, следующая строка с суммой и клубной картой
|
0.00 2918"
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
text: Текст сообщения
|
text: Текст сообщения
|
||||||
@@ -120,45 +120,55 @@ def parse_accounts_from_message(text: str) -> List[str]:
|
|||||||
|
|
||||||
accounts = []
|
accounts = []
|
||||||
|
|
||||||
# Обработка построчно - для текста из кабинета
|
# Группируем строки по записям (от "Viposnova" до следующего "Viposnova")
|
||||||
lines = text.strip().split('\n')
|
lines = text.strip().split('\n')
|
||||||
|
current_record = []
|
||||||
|
records = []
|
||||||
|
|
||||||
for line_idx, line in enumerate(lines):
|
for line in lines:
|
||||||
# Разбиваем строку по пробелам
|
stripped = line.strip()
|
||||||
parts = line.strip().split()
|
# Если строка начинается с 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):
|
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):
|
if re.match(r'^\d{2}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}$', part):
|
||||||
formatted = format_account_number(part)
|
account_number = format_account_number(part)
|
||||||
if formatted and formatted not in accounts:
|
account_idx = i
|
||||||
card = None
|
break
|
||||||
|
|
||||||
# Сначала проверяем текущую строку на карту после счета
|
if not account_number or account_number in accounts:
|
||||||
for j in range(i + 1, len(parts)):
|
continue
|
||||||
if re.match(r'^\d{4}$', parts[j]):
|
|
||||||
card = parts[j]
|
|
||||||
break
|
|
||||||
# Если нашли не сумму и не карту - выходим
|
|
||||||
if not re.match(r'^\d+\.\d+$', parts[j]):
|
|
||||||
break
|
|
||||||
|
|
||||||
# Если карты нет в текущей строке, проверяем следующую строку
|
# Ищем клубную карту (4-значное число после счета)
|
||||||
if not card and line_idx + 1 < len(lines):
|
card = None
|
||||||
next_line_parts = lines[line_idx + 1].strip().split()
|
if account_idx is not None:
|
||||||
# Ищем 4-значное число в следующей строке (обычно последнее)
|
for j in range(account_idx + 1, len(parts)):
|
||||||
for next_part in next_line_parts:
|
if re.match(r'^\d{4}$', parts[j]):
|
||||||
if re.match(r'^\d{4}$', next_part):
|
card = parts[j]
|
||||||
card = next_part
|
break
|
||||||
|
|
||||||
if card:
|
# Добавляем результат
|
||||||
full_account = f"{card} {formatted}"
|
if card:
|
||||||
if full_account not in accounts:
|
full_account = f"{card} {account_number}"
|
||||||
accounts.append(full_account)
|
if full_account not in accounts:
|
||||||
else:
|
accounts.append(full_account)
|
||||||
# Добавляем только счет
|
else:
|
||||||
accounts.append(formatted)
|
accounts.append(account_number)
|
||||||
|
|
||||||
# Если построчная обработка ничего не нашла, используем старый метод
|
# Если построчная обработка ничего не нашла, используем старый метод
|
||||||
if not accounts:
|
if not accounts:
|
||||||
|
|||||||
Reference in New Issue
Block a user