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:
root 2026-07-03 12:33:53 +00:00
parent e55a4cafcc
commit d4d85bc767
3 changed files with 67 additions and 6 deletions

View File

@ -106,14 +106,37 @@ def load_settings(conn):
# ─── SMS API ─────────────────────────────────────────────────────────────────
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())
if len(clean) < 10:
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:]
# 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"):
clean = "7" + clean
return clean
def send_sms(phone, message, api_id):

View File

@ -89,13 +89,28 @@ def load_settings(conn):
# ─── SMS API ─────────────────────────────────────────────────────────────────
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())
if len(clean) < 10:
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:]
elif not clean.startswith("7"):
elif len(clean) == 10:
clean = "7" + clean
elif not clean.startswith("7") and len(clean) == 11:
clean = "7" + clean[1:]
return clean
def send_sms(phone, message, api_id):

View File

@ -111,14 +111,37 @@ def load_settings(conn):
# ─── SMS API ─────────────────────────────────────────────────────────────────
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())
if len(clean) < 10:
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:]
# 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"):
clean = "7" + clean
return clean
def send_sms(phone, message, api_id):