fix: parse account number format with club card

- Changed logic to split input by space: left = club card number, right = account number
- Updated add_participants_by_accounts_bulk() to handle '2521 12-64-89-29-62-40-74' format
- Updated remove_participants_by_accounts_bulk() with same logic
- Now shows club card number in details: 'Name (card: 2521, account: 12-64-89-29-62-40-74)'
- Backwards compatible: still works with just account number (no space)
This commit is contained in:
2025-11-17 08:12:25 +09:00
parent 43d46ea6f8
commit ce696b1e76
3 changed files with 185 additions and 19 deletions

View File

@@ -547,17 +547,31 @@ class ParticipationService:
"invalid_accounts": []
}
for account_number in account_numbers:
account_number = account_number.strip()
if not account_number:
for account_input in account_numbers:
account_input = account_input.strip()
if not account_input:
continue
try:
# Валидируем и форматируем номер
# Разделяем по пробелу: левая часть - номер карты, правая - номер счета
parts = account_input.split()
if len(parts) == 2:
card_number = parts[0] # Номер клубной карты
account_number = parts[1] # Номер счета
elif len(parts) == 1:
# Если нет пробела, считаем что это просто номер счета
card_number = None
account_number = parts[0]
else:
results["invalid_accounts"].append(account_input)
results["errors"].append(f"Неверный формат: {account_input}")
continue
# Валидируем и форматируем номер счета
formatted_account = format_account_number(account_number)
if not formatted_account:
results["invalid_accounts"].append(account_number)
results["errors"].append(f"Неверный формат: {account_number}")
results["invalid_accounts"].append(account_input)
results["errors"].append(f"Неверный формат счета: {account_number}")
continue
# Ищем пользователя по номеру счёта
@@ -569,13 +583,19 @@ class ParticipationService:
# Пробуем добавить в розыгрыш
if await ParticipationService.add_participant(session, lottery_id, user.id):
results["added"] += 1
results["details"].append(f"Добавлен: {user.first_name} ({formatted_account})")
detail = f"{user.first_name} ({formatted_account})"
if card_number:
detail = f"{user.first_name} (карта: {card_number}, счёт: {formatted_account})"
results["details"].append(detail)
else:
results["skipped"] += 1
results["details"].append(f"Уже участвует: {user.first_name} ({formatted_account})")
detail = f"{user.first_name} ({formatted_account})"
if card_number:
detail = f"{user.first_name} (карта: {card_number}, счёт: {formatted_account})"
results["details"].append(f"Уже участвует: {detail}")
except Exception as e:
results["errors"].append(f"Ошибка с {account_number}: {str(e)}")
results["errors"].append(f"Ошибка с {account_input}: {str(e)}")
return results
@@ -590,17 +610,31 @@ class ParticipationService:
"invalid_accounts": []
}
for account_number in account_numbers:
account_number = account_number.strip()
if not account_number:
for account_input in account_numbers:
account_input = account_input.strip()
if not account_input:
continue
try:
# Валидируем и форматируем номер
# Разделяем по пробелу: левая часть - номер карты, правая - номер счета
parts = account_input.split()
if len(parts) == 2:
card_number = parts[0] # Номер клубной карты
account_number = parts[1] # Номер счета
elif len(parts) == 1:
# Если нет пробела, считаем что это просто номер счета
card_number = None
account_number = parts[0]
else:
results["invalid_accounts"].append(account_input)
results["errors"].append(f"Неверный формат: {account_input}")
continue
# Валидируем и форматируем номер счета
formatted_account = format_account_number(account_number)
if not formatted_account:
results["invalid_accounts"].append(account_number)
results["errors"].append(f"Неверный формат: {account_number}")
results["invalid_accounts"].append(account_input)
results["errors"].append(f"Неверный формат счета: {account_number}")
continue
# Ищем пользователя по номеру счёта
@@ -613,13 +647,19 @@ class ParticipationService:
# Пробуем удалить из розыгрыша
if await ParticipationService.remove_participant(session, lottery_id, user.id):
results["removed"] += 1
results["details"].append(f"Удалён: {user.first_name} ({formatted_account})")
detail = f"{user.first_name} ({formatted_account})"
if card_number:
detail = f"{user.first_name} (карта: {card_number}, счёт: {formatted_account})"
results["details"].append(detail)
else:
results["not_found"] += 1
results["details"].append(f"Не участвовал: {user.first_name} ({formatted_account})")
detail = f"{user.first_name} ({formatted_account})"
if card_number:
detail = f"{user.first_name} (карта: {card_number}, счёт: {formatted_account})"
results["details"].append(f"Не участвовал: {detail}")
except Exception as e:
results["errors"].append(f"Ошибка с {account_number}: {str(e)}")
results["errors"].append(f"Ошибка с {account_input}: {str(e)}")
return results