fix: группировка записей по маркеру Viposnova
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:
2025-11-17 10:57:18 +09:00
parent 57da952b80
commit e882601b85

View File

@@ -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
account_number = format_account_number(part)
account_idx = i
break
# Сначала проверяем текущую строку на карту после счета
for j in range(i + 1, len(parts)):
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 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}"
full_account = f"{card} {account_number}"
if full_account not in accounts:
accounts.append(full_account)
else:
# Добавляем только счет
accounts.append(formatted)
accounts.append(account_number)
# Если построчная обработка ничего не нашла, используем старый метод
if not accounts: