feature/chat-system #2
@@ -199,30 +199,52 @@ class AccountParticipationService:
|
||||
session: AsyncSession,
|
||||
lottery_id: int,
|
||||
account_number: str,
|
||||
place: int,
|
||||
prize: Optional[str] = None
|
||||
) -> Dict[str, Any]:
|
||||
place: int = 1,
|
||||
prize: str = ""
|
||||
):
|
||||
"""
|
||||
Установить счет как победителя на указанное место
|
||||
Устанавливает счет как победителя в розыгрыше.
|
||||
Поддерживает формат: "КАРТА СЧЕТ" или просто "СЧЕТ"
|
||||
"""
|
||||
formatted_account = format_account_number(account_number)
|
||||
# Разделяем номер карты и счета, если они указаны вместе
|
||||
card_number = None
|
||||
parts = account_number.split()
|
||||
|
||||
if len(parts) == 2:
|
||||
# Формат: "КАРТА СЧЕТ"
|
||||
card_number = parts[0]
|
||||
account_to_format = parts[1]
|
||||
elif len(parts) == 1:
|
||||
# Формат: только "СЧЕТ"
|
||||
account_to_format = parts[0]
|
||||
else:
|
||||
return {
|
||||
"success": False,
|
||||
"message": f"❌ Неверный формат: {account_number}"
|
||||
}
|
||||
|
||||
# Форматируем номер счета
|
||||
formatted_account = format_account_number(account_to_format)
|
||||
if not formatted_account:
|
||||
return {
|
||||
"success": False,
|
||||
"message": f"Неверный формат счета: {account_number}"
|
||||
"message": f"❌ Неверный формат счета: {account_number}"
|
||||
}
|
||||
|
||||
# Проверяем, участвует ли счет в розыгрыше
|
||||
# Проверяем, что счет участвует в розыгрыше
|
||||
participation = await session.execute(
|
||||
select(Participation).where(
|
||||
Participation.lottery_id == lottery_id,
|
||||
Participation.account_number == formatted_account
|
||||
)
|
||||
)
|
||||
if not participation.scalar_one_or_none():
|
||||
participation = participation.scalar_one_or_none()
|
||||
|
||||
if not participation:
|
||||
card_info = f" (карта: {card_number})" if card_number else ""
|
||||
return {
|
||||
"success": False,
|
||||
"message": f"Счет {formatted_account} не участвует в розыгрыше"
|
||||
"message": f"❌ Счет {formatted_account}{card_info} не участвует в розыгрыше"
|
||||
}
|
||||
|
||||
# Проверяем, не занято ли уже это место
|
||||
@@ -255,9 +277,10 @@ class AccountParticipationService:
|
||||
|
||||
await session.commit()
|
||||
|
||||
card_info = f" (карта: {card_number})" if card_number else ""
|
||||
return {
|
||||
"success": True,
|
||||
"message": f"Счет {formatted_account} установлен победителем на место {place}",
|
||||
"message": f"✅ Счет {formatted_account}{card_info} установлен победителем на место {place}",
|
||||
"account_number": formatted_account,
|
||||
"place": place
|
||||
}
|
||||
|
||||
@@ -99,26 +99,44 @@ def mask_account_number(account_number: str, show_last_digits: int = 4) -> str:
|
||||
|
||||
def parse_accounts_from_message(text: str) -> List[str]:
|
||||
"""
|
||||
Извлекает все валидные номера счетов из текста сообщения
|
||||
Извлекает все валидные номера счетов из текста сообщения.
|
||||
Поддерживает формат: "КАРТА СЧЕТ" (например "2521 11-22-33-44-55-66-77")
|
||||
или просто "СЧЕТ" (например "11-22-33-44-55-66-77")
|
||||
|
||||
Args:
|
||||
text: Текст сообщения
|
||||
|
||||
Returns:
|
||||
List[str]: Список найденных и отформатированных номеров счетов
|
||||
List[str]: Список найденных строк (может включать номер карты и счета через пробел)
|
||||
"""
|
||||
if not text:
|
||||
return []
|
||||
|
||||
accounts = []
|
||||
# Ищем паттерны счетов в тексте (7 пар цифр)
|
||||
pattern = r'\b\d{2}[-\s]?\d{2}[-\s]?\d{2}[-\s]?\d{2}[-\s]?\d{2}[-\s]?\d{2}[-\s]?\d{2}\b'
|
||||
matches = re.findall(pattern, text)
|
||||
|
||||
for match in matches:
|
||||
# Паттерн 1: номер карты (4 цифры) + пробел + счет (7 пар цифр)
|
||||
pattern_with_card = r'\b(\d{4})\s+(\d{2}[-\s]?\d{2}[-\s]?\d{2}[-\s]?\d{2}[-\s]?\d{2}[-\s]?\d{2}[-\s]?\d{2})\b'
|
||||
matches_with_card = re.findall(pattern_with_card, text)
|
||||
|
||||
for card, account in matches_with_card:
|
||||
formatted = format_account_number(account)
|
||||
if formatted:
|
||||
full_account = f"{card} {formatted}"
|
||||
if full_account not in accounts:
|
||||
accounts.append(full_account)
|
||||
|
||||
# Паттерн 2: только счет (7 пар цифр) - для обратной совместимости
|
||||
pattern_only_account = r'\b\d{2}[-\s]?\d{2}[-\s]?\d{2}[-\s]?\d{2}[-\s]?\d{2}[-\s]?\d{2}[-\s]?\d{2}\b'
|
||||
matches_only = re.findall(pattern_only_account, text)
|
||||
|
||||
for match in matches_only:
|
||||
# Проверяем, что этот счет еще не был добавлен как часть "карта + счет"
|
||||
formatted = format_account_number(match)
|
||||
if formatted and formatted not in accounts:
|
||||
accounts.append(formatted)
|
||||
if formatted:
|
||||
# Проверяем, нет ли уже этого счета с картой
|
||||
already_added = any(formatted in acc for acc in accounts)
|
||||
if not already_added and formatted not in accounts:
|
||||
accounts.append(formatted)
|
||||
|
||||
return accounts
|
||||
|
||||
|
||||
Reference in New Issue
Block a user