Watch
1
0
Fork
You've already forked Seyyed_arc
0
forked from hesabix/arc
Seyyed_arc/hesabixAPI/app/utils/phone_utils.py
2026-04-14 19:34:55 +03:30

93 lines
3 KiB
Python
Executable file

from __future__ import annotations
import re
from typing import Optional
def normalize_phone_number(phone: str) -> str:
"""
نرمال‌سازی شماره تلفن به فرمت استاندارد بهین اس ام اس
فرمت خروجی: 0912xxxxxxx (یازده کاراکتر با شروع 09)
Args:
phone: شماره تلفن در هر فرمت
Returns:
شماره تلفن نرمال‌سازی شده
Raises:
ValueError: اگر فرمت شماره نامعتبر باشد
"""
if not phone:
raise ValueError("شماره تلفن خالی است")
# حذف فاصله، خط تیره، پرانتز و سایر کاراکترهای غیرعددی
phone = re.sub(r'[\s\-\(\)\.]', '', phone.strip())
# حذف + و 00 از ابتدا
if phone.startswith('+98'):
phone = '0' + phone[3:]
elif phone.startswith('0098'):
phone = '0' + phone[4:]
elif phone.startswith('98'):
phone = '0' + phone[2:]
# اطمینان از شروع با 0
if not phone.startswith('0'):
phone = '0' + phone
# بررسی طول (باید 11 رقم باشد)
if len(phone) != 11:
raise ValueError(f"طول شماره تلفن نامعتبر: {len(phone)} رقم (باید 11 رقم باشد)")
# بررسی شروع با 09
if not phone.startswith('09'):
raise ValueError(f"شماره تلفن باید با 09 شروع شود: {phone}")
# بررسی اینکه فقط عدد باشد
if not phone.isdigit():
raise ValueError(f"شماره تلفن باید فقط شامل اعداد باشد: {phone}")
return phone
def format_phone_for_behinsms(phone: str) -> str:
"""
فرمت‌سازی شماره برای ارسال به بهین اس ام اس
این تابع فقط شماره را normalize می‌کند و همان را برمی‌گرداند
چون بهین اس ام اس فرمت 0912xxxxxxx را می‌پذیرد
Args:
phone: شماره تلفن
Returns:
شماره فرمت شده برای بهین اس ام اس
"""
return normalize_phone_number(phone)
def validate_iranian_mobile(phone: str) -> bool:
"""
اعتبارسنجی شماره موبایل ایرانی
Args:
phone: شماره موبایل
Returns:
True اگر شماره معتبر باشد
"""
try:
normalized = normalize_phone_number(phone)
# بررسی اینکه با یکی از پیش‌شماره‌های معتبر موبایل شروع شود
valid_prefixes = ['0910', '0911', '0912', '0913', '0914', '0915', '0916', '0917', '0918', '0919',
'0920', '0921', '0922', '0923', '0930', '0931', '0932', '0933', '0934', '0935',
'0936', '0937', '0938', '0939', '0940', '0941', '0942', '0943', '0950', '0951',
'0952', '0953', '0954', '0955', '0960', '0961', '0962', '0963', '0964', '0970',
'0971', '0972', '0973', '0980', '0981', '0982', '0983', '0990', '0991', '0992',
'0993', '0994']
return any(normalized.startswith(prefix) for prefix in valid_prefixes)
except ValueError:
return False