fix: normalize_phone handles +7, 8, text, and multi-number fields
- Two numbers in one field (XXX / YYY) → take first 10 digits - Text in field (Екатерина +7978...) → extract digits only - 8 prefix → 7 (Russian landline style) - 10 digits (no country code) → prepend 7 - All 4 SMS scripts patched (first, second, paid_storage)
This commit is contained in:
parent
e55a4cafcc
commit
d4d85bc767
|
|
@ -106,14 +106,37 @@ def load_settings(conn):
|
||||||
# ─── SMS API ─────────────────────────────────────────────────────────────────
|
# ─── SMS API ─────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
def normalize_phone(phone):
|
def normalize_phone(phone):
|
||||||
"""Нормализует телефон: только цифры, начинается с 7. Возвращает None если пустой."""
|
"""Нормализует телефон: только цифры, начинается с 7. Возвращает None если пустой.
|
||||||
|
|
||||||
|
Обрабатляет:
|
||||||
|
- +7XXX, 7XXX, 8XXX, XXX (без кода страны) → 7XXX
|
||||||
|
- Текст/имена в поле (Екатерина +7978...) → извлекает только цифры
|
||||||
|
- Два номера в одном поле (XXX / YYY) → берёт первый (обрезает до 11 цифр)
|
||||||
|
- Минимум 10 цифр (без 7), максимум 11 (с 7)
|
||||||
|
"""
|
||||||
clean = "".join(c for c in str(phone) if c.isdigit())
|
clean = "".join(c for c in str(phone) if c.isdigit())
|
||||||
if len(clean) < 10:
|
if len(clean) < 10:
|
||||||
return None
|
return None
|
||||||
if clean.startswith("8"):
|
|
||||||
|
# If 8 prefix (Russian landline style) → replace with 7
|
||||||
|
if clean.startswith("8") and len(clean) == 11:
|
||||||
clean = "7" + clean[1:]
|
clean = "7" + clean[1:]
|
||||||
|
# If starts with 7 and is 11 digits → ok
|
||||||
|
elif clean.startswith("7") and len(clean) == 11:
|
||||||
|
pass
|
||||||
|
# If 10 digits (no country code) → prepend 7
|
||||||
|
elif len(clean) == 10:
|
||||||
|
clean = "7" + clean
|
||||||
|
# If too long (multiple numbers concatenated) → take first 10 digits + prepend 7
|
||||||
|
elif len(clean) > 11:
|
||||||
|
# Try to extract first number: look for 10-digit sequence starting with 9
|
||||||
|
# Common case: "9242377967 / 89783225219" → "9242377967" (10 digits)
|
||||||
|
clean10 = clean[:10]
|
||||||
|
clean = "7" + clean10
|
||||||
|
# If starts with 7 but wrong length → prepend 7 to first 10 digits
|
||||||
elif not clean.startswith("7"):
|
elif not clean.startswith("7"):
|
||||||
clean = "7" + clean
|
clean = "7" + clean
|
||||||
|
|
||||||
return clean
|
return clean
|
||||||
|
|
||||||
def send_sms(phone, message, api_id):
|
def send_sms(phone, message, api_id):
|
||||||
|
|
|
||||||
|
|
@ -89,13 +89,28 @@ def load_settings(conn):
|
||||||
# ─── SMS API ─────────────────────────────────────────────────────────────────
|
# ─── SMS API ─────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
def normalize_phone(phone):
|
def normalize_phone(phone):
|
||||||
|
"""Нормализует телефон: только цифры, начинается с 7. Возвращает None если пустой.
|
||||||
|
|
||||||
|
Обрабатывает:
|
||||||
|
- +7XXX, 7XXX, 8XXX, XXX (без кода страны) → 7XXX
|
||||||
|
- Текст/имена в поле (Екатерина +7978...) → извлекает только цифры
|
||||||
|
- Два номера в одном поле (XXX / YYY) → берёт первый
|
||||||
|
- Минимум 10 цифр, максимум 11
|
||||||
|
"""
|
||||||
clean = "".join(c for c in str(phone) if c.isdigit())
|
clean = "".join(c for c in str(phone) if c.isdigit())
|
||||||
if len(clean) < 10:
|
if len(clean) < 10:
|
||||||
return None
|
return None
|
||||||
if clean.startswith("8"):
|
|
||||||
|
if len(clean) > 11:
|
||||||
|
clean = clean[:10]
|
||||||
|
|
||||||
|
if clean.startswith("8") and len(clean) == 11:
|
||||||
clean = "7" + clean[1:]
|
clean = "7" + clean[1:]
|
||||||
elif not clean.startswith("7"):
|
elif len(clean) == 10:
|
||||||
clean = "7" + clean
|
clean = "7" + clean
|
||||||
|
elif not clean.startswith("7") and len(clean) == 11:
|
||||||
|
clean = "7" + clean[1:]
|
||||||
|
|
||||||
return clean
|
return clean
|
||||||
|
|
||||||
def send_sms(phone, message, api_id):
|
def send_sms(phone, message, api_id):
|
||||||
|
|
|
||||||
|
|
@ -111,14 +111,37 @@ def load_settings(conn):
|
||||||
# ─── SMS API ─────────────────────────────────────────────────────────────────
|
# ─── SMS API ─────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
def normalize_phone(phone):
|
def normalize_phone(phone):
|
||||||
"""Нормализует телефон: только цифры, начинается с 7. Возвращает None если пустой."""
|
"""Нормализует телефон: только цифры, начинается с 7. Возвращает None если пустой.
|
||||||
|
|
||||||
|
Обрабатляет:
|
||||||
|
- +7XXX, 7XXX, 8XXX, XXX (без кода страны) → 7XXX
|
||||||
|
- Текст/имена в поле (Екатерина +7978...) → извлекает только цифры
|
||||||
|
- Два номера в одном поле (XXX / YYY) → берёт первый (обрезает до 11 цифр)
|
||||||
|
- Минимум 10 цифр (без 7), максимум 11 (с 7)
|
||||||
|
"""
|
||||||
clean = "".join(c for c in str(phone) if c.isdigit())
|
clean = "".join(c for c in str(phone) if c.isdigit())
|
||||||
if len(clean) < 10:
|
if len(clean) < 10:
|
||||||
return None
|
return None
|
||||||
if clean.startswith("8"):
|
|
||||||
|
# If 8 prefix (Russian landline style) → replace with 7
|
||||||
|
if clean.startswith("8") and len(clean) == 11:
|
||||||
clean = "7" + clean[1:]
|
clean = "7" + clean[1:]
|
||||||
|
# If starts with 7 and is 11 digits → ok
|
||||||
|
elif clean.startswith("7") and len(clean) == 11:
|
||||||
|
pass
|
||||||
|
# If 10 digits (no country code) → prepend 7
|
||||||
|
elif len(clean) == 10:
|
||||||
|
clean = "7" + clean
|
||||||
|
# If too long (multiple numbers concatenated) → take first 10 digits + prepend 7
|
||||||
|
elif len(clean) > 11:
|
||||||
|
# Try to extract first number: look for 10-digit sequence starting with 9
|
||||||
|
# Common case: "9242377967 / 89783225219" → "9242377967" (10 digits)
|
||||||
|
clean10 = clean[:10]
|
||||||
|
clean = "7" + clean10
|
||||||
|
# If starts with 7 but wrong length → prepend 7 to first 10 digits
|
||||||
elif not clean.startswith("7"):
|
elif not clean.startswith("7"):
|
||||||
clean = "7" + clean
|
clean = "7" + clean
|
||||||
|
|
||||||
return clean
|
return clean
|
||||||
|
|
||||||
def send_sms(phone, message, api_id):
|
def send_sms(phone, message, api_id):
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue