# 🚫 Предотвращение дубликатов SMS

## Проблема
1. SMS отправлялись **повторно на один и тот же номер**
2. SMS отправлялись **на ВСЕ номера из объявления** (если их несколько)

## Решение

### 1️⃣ Отправка только на ОДИН номер из объявления
Теперь бот берет **только первый номер** из списка телефонов объявления.

### 2️⃣ Проверка дубликатов
Перед отправкой SMS бот проверяет:
- ✅ Отправлялось ли SMS на этот номер ранее
- ✅ Если отправлялось - пропускает этот номер
- ✅ Если не отправлялось - отправляет SMS и сохраняет в базу

### 3️⃣ Корректная очистка номеров
Используется **одна и та же функция очистки** номеров:
- В `spam_sms.py` для отправки
- В `functions.py` для проверки дубликатов
- Формат: `380XXXXXXXXX` (международный)

## Изменения в коде

### 📁 `app/database/models.py`
Добавлена новая модель для отслеживания отправленных номеров:

```python
class SentPhones(Base):
    """Отслеживает номера, на которые уже отправлялись SMS"""
    __tablename__ = 'sent_phones'
    
    id = Column(Integer, primary_key=True)
    phone_number = Column(String(20), unique=True)  # Уникальный номер
    ad_id = Column(String(50))
    ad_name = Column(String(255))
    sent_at = Column(DateTime)
    is_successful = Column(Boolean)
```

### 📁 `app/database/crud_static.py`
Добавлены функции:
- `filter_new_phones(phones)` - фильтрация новых номеров
- `mark_phone_sent(phone, ad_id, ad_name, is_successful)` - отметка как отправленного
- `is_phone_sent(phone)` - проверка отправки
- `get_sent_phones_count()` - подсчет уникальных номеров

### 📁 `app/functions.py`
Логика обработки номеров:

```python
# 1. Очищаем ВСЕ номера
clean_phones = []
for phone in all_phones:
    cleaned = clean_phone_number(phone)  # Та же функция что в spam_sms
    if cleaned:
        clean_phones.append(cleaned)

# 2. Берем ТОЛЬКО ПЕРВЫЙ номер
if clean_phones:
    first_phone = [clean_phones[0]]
    
    # 3. Проверяем - не отправляли ли уже на него
    new_phones = await filter_new_phones(first_phone)
    
    # 4. Отправляем только если не отправляли
    if new_phones:
        sms_result = await send_sms(new_phones)
        
        # 5. Отмечаем как отправленный
        await mark_phone_sent(
            phone_number=new_phones[0],
            ad_id=ad_id,
            ad_name=ad_name,
            is_successful=True
        )
```

### 📁 `app/user/usermenu.py`
Добавлена статистика уникальных номеров:

```python
📱 Уникальные номера:
🎯 Получили SMS: {stats['unique_phones']}
```

## Примеры работы

### ✅ Первая отправка
```
Объявление: BMW X5 2020
Номера: ["(098) 123-45-67", "(050) 987-65-43"]
→ Очистка: ["380981234567", "380509876543"]
→ Берем первый: ["380981234567"]
→ Проверка: номер новый
→ Отправка SMS: SUCCESS
→ Сохранение в базу: phone=380981234567, is_successful=True
```

### 🚫 Повторная попытка
```
Объявление: BMW X5 2020 (то же)
Номера: ["(098) 123-45-67", "(050) 987-65-43"]
→ Очистка: ["380981234567", "380509876543"]
→ Берем первый: ["380981234567"]
→ Проверка: номер уже в базе
→ Пропускаем: "Все номера уже получали SMS"
```

## База данных

### Таблица `sent_phones`
| id | phone_number | ad_id | ad_name | sent_at | is_successful |
|----|-------------|--------|---------|---------|---------------|
| 1 | 380981234567 | 38912161 | BMW X5 2020 | 2025-10-14 | true |
| 2 | 380509876543 | 38967268 | Audi A6 2021 | 2025-10-14 | true |

## Преимущества

✅ **Нет повторных SMS на один номер**
✅ **Экономия на SMS** (отправка только на один номер из объявления)
✅ **Избежание спама** (продавец не получит несколько одинаковых SMS)
✅ **Статистика** по уникальным номерам
✅ **История** всех отправок

## Как проверить работу

1. Запустите парсинг
2. Проверьте логи:
   ```
   📱 Очищенные номера для SMS: ['380981234567', '380509876543']
   📱 Используем первый номер из списка: ['380981234567']
   Из 1 номеров 1 новых для отправки
   ```
3. Повторно обработайте то же объявление:
   ```
   Из 1 номеров 0 новых для отправки
   📱 Все номера уже получали SMS
   ```
4. Проверьте статистику в боте:
   ```
   📱 Уникальные номера:
   🎯 Получили SMS: 150
   ```

## Очистка истории

Если нужно очистить историю отправленных номеров:

```sql
DELETE FROM sent_phones;
```

Или через Python:
```python
from app.database.crud_static import *
# Удалить все записи о отправленных номерах
```

