init commit
This commit is contained in:
97
account_utils.py
Normal file
97
account_utils.py
Normal file
@@ -0,0 +1,97 @@
|
||||
"""
|
||||
Утилиты для работы с клиентскими счетами
|
||||
"""
|
||||
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)])
|
||||
Reference in New Issue
Block a user