diff --git a/.bot.pid b/.bot.pid index e0b353f..1807423 100644 --- a/.bot.pid +++ b/.bot.pid @@ -1 +1 @@ -812830 +822376 diff --git a/src/handlers/account_services.py b/src/handlers/account_services.py index 73765c1..2b94906 100644 --- a/src/handlers/account_services.py +++ b/src/handlers/account_services.py @@ -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 } diff --git a/src/utils/account_utils.py b/src/utils/account_utils.py index 8db2f2a..d2f4e01 100644 --- a/src/utils/account_utils.py +++ b/src/utils/account_utils.py @@ -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