""" Утилиты для работы с клиентскими счетами """ import re from typing import Optional def validate_account_number(account_number: str) -> bool: """ Проверяет корректность формата номера клиентского счета Формат: XX-XX-XX-XX-XX-XX-XX-XX (8 пар цифр через дефис) Args: account_number: Номер счета для проверки Returns: bool: True если формат корректен, False иначе """ 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}$' return bool(re.match(pattern, account_number)) def format_account_number(account_number: str) -> Optional[str]: """ Форматирует номер счета, убирая лишние символы Args: account_number: Исходный номер счета Returns: str: Отформатированный номер счета или None если некорректный """ if not account_number: return None # Убираем все символы кроме цифр digits_only = re.sub(r'\D', '', account_number) # Проверяем что осталось ровно 16 цифр if len(digits_only) != 16: return None # Форматируем как XX-XX-XX-XX-XX-XX-XX-XX formatted = '-'.join([digits_only[i:i+2] for i in range(0, 16, 2)]) return formatted def generate_account_number() -> str: """ Генерирует случайный номер клиентского счета для тестирования Returns: str: Сгенерированный номер счета """ import random # Генерируем 16 случайных цифр digits = ''.join([str(random.randint(0, 9)) for _ in range(16)]) # Форматируем return '-'.join([digits[i:i+2] for i in range(0, 16, 2)]) def mask_account_number(account_number: str, show_last_digits: int = 4) -> str: """ Маскирует номер счета для безопасного отображения Args: account_number: Полный номер счета show_last_digits: Количество последних цифр для отображения Returns: str: Замаскированный номер счета """ if not validate_account_number(account_number): return "Некорректный номер" if show_last_digits <= 0: return "**-**-**-**-**-**-**-**" # Убираем дефисы для работы с цифрами digits = account_number.replace('-', '') # Определяем сколько цифр показать show_digits = min(show_last_digits, len(digits)) # Создаем маску masked_digits = '*' * (len(digits) - show_digits) + digits[-show_digits:] # Возвращаем отформатированный результат return '-'.join([masked_digits[i:i+2] for i in range(0, 16, 2)])