main functions fix

This commit is contained in:
2025-11-15 20:03:49 +09:00
parent e0075d91b6
commit 3a25e6a4cb
18 changed files with 1779 additions and 75 deletions

View File

@@ -2,13 +2,13 @@
Утилиты для работы с клиентскими счетами
"""
import re
from typing import Optional
from typing import Optional, List
def validate_account_number(account_number: str) -> bool:
"""
Проверяет корректность формата номера клиентского счета
Формат: XX-XX-XX-XX-XX-XX-XX-XX (8 пар цифр через дефис)
Формат: XX-XX-XX-XX-XX-XX-XX (7 пар цифр через дефис)
Args:
account_number: Номер счета для проверки
@@ -19,8 +19,8 @@ def validate_account_number(account_number: str) -> bool:
if not account_number:
return False
# Паттерн для 8 пар цифр через дефис
pattern = r'^\d{2}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}$'
# Паттерн для 7 пар цифр через дефис
pattern = r'^\d{2}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}$'
return bool(re.match(pattern, account_number))
@@ -41,12 +41,12 @@ def format_account_number(account_number: str) -> Optional[str]:
# Убираем все символы кроме цифр
digits_only = re.sub(r'\D', '', account_number)
# Проверяем что осталось ровно 16 цифр
if len(digits_only) != 16:
# Проверяем что осталось ровно 14 цифр
if len(digits_only) != 14:
return None
# Форматируем как XX-XX-XX-XX-XX-XX-XX-XX
formatted = '-'.join([digits_only[i:i+2] for i in range(0, 16, 2)])
# Форматируем как XX-XX-XX-XX-XX-XX-XX
formatted = '-'.join([digits_only[i:i+2] for i in range(0, 14, 2)])
return formatted
@@ -60,11 +60,11 @@ def generate_account_number() -> str:
"""
import random
# Генерируем 16 случайных цифр
digits = ''.join([str(random.randint(0, 9)) for _ in range(16)])
# Генерируем 14 случайных цифр
digits = ''.join([str(random.randint(0, 9)) for _ in range(14)])
# Форматируем
return '-'.join([digits[i:i+2] for i in range(0, 16, 2)])
return '-'.join([digits[i:i+2] for i in range(0, 14, 2)])
def mask_account_number(account_number: str, show_last_digits: int = 4) -> str:
@@ -82,7 +82,7 @@ def mask_account_number(account_number: str, show_last_digits: int = 4) -> str:
return "Некорректный номер"
if show_last_digits <= 0:
return "**-**-**-**-**-**-**-**"
return "**-**-**-**-**-**-**"
# Убираем дефисы для работы с цифрами
digits = account_number.replace('-', '')
@@ -93,5 +93,59 @@ def mask_account_number(account_number: str, show_last_digits: int = 4) -> str:
# Создаем маску
masked_digits = '*' * (len(digits) - show_digits) + digits[-show_digits:]
# Возвращаем отформатированный результат
return '-'.join([masked_digits[i:i+2] for i in range(0, 16, 2)])
# Возвращаем отформатированный результат (7 пар)
return '-'.join([masked_digits[i:i+2] for i in range(0, 14, 2)])
def parse_accounts_from_message(text: str) -> List[str]:
"""
Извлекает все валидные номера счетов из текста сообщения
Args:
text: Текст сообщения
Returns:
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:
formatted = format_account_number(match)
if formatted and formatted not in accounts:
accounts.append(formatted)
return accounts
def search_accounts_by_pattern(pattern: str, account_list: List[str]) -> List[str]:
"""
Ищет счета по частичному совпадению (1-2 пары цифр)
Args:
pattern: Паттерн для поиска (например "11-22" или "11")
account_list: Список счетов для поиска
Returns:
List[str]: Список найденных счетов
"""
if not pattern or not account_list:
return []
# Убираем лишние символы из паттерна
clean_pattern = re.sub(r'[^\d-]', '', pattern).strip('-')
if not clean_pattern:
return []
results = []
for account in account_list:
if clean_pattern in account:
results.append(account)
return results