|
|
|
|
|
|
|
""" |
|
Otomatik Hatırlatma Zamanlayıcısı |
|
Belirli aralıklarla takipleri kontrol eder ve hatırlatma gönderir |
|
""" |
|
|
|
import os |
|
import time |
|
import logging |
|
from datetime import datetime |
|
from typing import List |
|
|
|
|
|
from follow_up_system import FollowUpManager, format_reminder_message |
|
from store_notification import send_store_notification |
|
|
|
logging.basicConfig( |
|
level=logging.INFO, |
|
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' |
|
) |
|
logger = logging.getLogger(__name__) |
|
|
|
class ReminderScheduler: |
|
"""Hatırlatma zamanlayıcısı""" |
|
|
|
def __init__(self, check_interval_minutes: int = 10): |
|
""" |
|
Args: |
|
check_interval_minutes: Kaç dakikada bir kontrol yapılacak |
|
""" |
|
self.check_interval = check_interval_minutes * 60 |
|
self.manager = FollowUpManager() |
|
self.running = False |
|
|
|
def send_reminder(self, follow_up) -> bool: |
|
"""Hatırlatma mesajı gönder""" |
|
|
|
try: |
|
|
|
reminder_message = format_reminder_message(follow_up) |
|
|
|
|
|
result = send_store_notification( |
|
customer_phone=follow_up.customer_phone, |
|
customer_name=follow_up.customer_name, |
|
product_name=follow_up.product_name, |
|
action="reminder", |
|
store_name=follow_up.store_name, |
|
additional_info=f"⏰ TAKİP HATIRLATMASI: {follow_up.original_message}" |
|
) |
|
|
|
if result: |
|
logger.info(f"✅ Hatırlatma gönderildi: {follow_up.id}") |
|
return True |
|
else: |
|
logger.error(f"❌ Hatırlatma gönderilemedi: {follow_up.id}") |
|
return False |
|
|
|
except Exception as e: |
|
logger.error(f"Hatırlatma gönderme hatası: {e}") |
|
return False |
|
|
|
def check_and_send_reminders(self): |
|
"""Bekleyen hatırlatmaları kontrol et ve gönder""" |
|
|
|
logger.info("🔍 Hatırlatmalar kontrol ediliyor...") |
|
|
|
|
|
pending = self.manager.get_pending_reminders() |
|
|
|
if not pending: |
|
logger.info("📭 Bekleyen hatırlatma yok") |
|
return |
|
|
|
logger.info(f"📬 {len(pending)} hatırlatma bulundu") |
|
|
|
|
|
for follow_up in pending: |
|
logger.info(f"📤 Hatırlatma gönderiliyor: {follow_up.customer_phone}") |
|
|
|
if self.send_reminder(follow_up): |
|
|
|
self.manager.mark_as_reminded(follow_up.id) |
|
|
|
|
|
if follow_up.reminded_count >= 2: |
|
self.manager.mark_as_completed(follow_up.id) |
|
logger.info(f"✅ Takip tamamlandı (2 hatırlatma yapıldı): {follow_up.id}") |
|
|
|
|
|
time.sleep(2) |
|
|
|
def send_daily_summary(self): |
|
"""Günlük özet gönder""" |
|
|
|
now = datetime.now() |
|
todays = self.manager.get_todays_follow_ups() |
|
|
|
if not todays: |
|
return |
|
|
|
|
|
summary = f""" |
|
📊 **GÜNLÜK TAKİP ÖZETİ** |
|
📅 {now.strftime('%d.%m.%Y')} |
|
|
|
Bugün takip edilmesi gereken {len(todays)} müşteri var: |
|
""" |
|
|
|
for i, follow_up in enumerate(todays, 1): |
|
status_emoji = "✅" if follow_up.status == "completed" else "⏳" |
|
summary += f""" |
|
{i}. {status_emoji} {follow_up.customer_phone.replace('whatsapp:', '')} |
|
Ürün: {follow_up.product_name} |
|
Durum: {follow_up.status} |
|
""" |
|
|
|
summary += "\n📞 Takipleri tamamlamayı unutmayın!" |
|
|
|
|
|
send_store_notification( |
|
customer_phone="whatsapp:+905439362335", |
|
customer_name="Sistem", |
|
product_name="Günlük Özet", |
|
action="info", |
|
additional_info=summary |
|
) |
|
|
|
logger.info("📊 Günlük özet gönderildi") |
|
|
|
def run(self): |
|
"""Zamanlayıcıyı başlat""" |
|
|
|
self.running = True |
|
logger.info(f"⏰ Hatırlatma zamanlayıcısı başlatıldı") |
|
logger.info(f" Kontrol aralığı: {self.check_interval_minutes} dakika") |
|
|
|
last_summary_date = None |
|
|
|
while self.running: |
|
try: |
|
|
|
self.check_and_send_reminders() |
|
|
|
|
|
now = datetime.now() |
|
if now.hour in [9, 18] and now.date() != last_summary_date: |
|
self.send_daily_summary() |
|
last_summary_date = now.date() |
|
|
|
|
|
logger.info(f"⏳ {self.check_interval_minutes} dakika bekleniyor...") |
|
time.sleep(self.check_interval) |
|
|
|
except KeyboardInterrupt: |
|
logger.info("⏹️ Zamanlayıcı durduruldu") |
|
self.running = False |
|
break |
|
except Exception as e: |
|
logger.error(f"Zamanlayıcı hatası: {e}") |
|
time.sleep(60) |
|
|
|
def stop(self): |
|
"""Zamanlayıcıyı durdur""" |
|
self.running = False |
|
logger.info("⏹️ Zamanlayıcı durduruluyor...") |
|
|
|
def run_scheduler(): |
|
"""Ana fonksiyon""" |
|
|
|
|
|
os.environ['TWILIO_ACCOUNT_SID'] = 'AC643d14a443b9fbcbc17a2828508870a6' |
|
os.environ['TWILIO_AUTH_TOKEN'] = '9203f0328bfd737dc39bf9be5aa97ca9' |
|
|
|
print(""" |
|
╔════════════════════════════════════════╗ |
|
║ TREK TAKİP HATIRLATMA SİSTEMİ ║ |
|
║ Otomatik Müşteri Takibi ║ |
|
╚════════════════════════════════════════╝ |
|
|
|
Ayarlar: |
|
- Kontrol aralığı: 10 dakika |
|
- Günlük özet: 09:00 ve 18:00 |
|
- Mehmet Bey: +905439362335 |
|
|
|
Başlatılıyor... |
|
""") |
|
|
|
scheduler = ReminderScheduler(check_interval_minutes=10) |
|
|
|
try: |
|
scheduler.run() |
|
except KeyboardInterrupt: |
|
print("\n👋 Sistem kapatılıyor...") |
|
scheduler.stop() |
|
|
|
if __name__ == "__main__": |
|
|
|
if os.getenv("TEST_MODE"): |
|
print("🧪 TEST MODU - 1 dakika aralıklarla kontrol") |
|
scheduler = ReminderScheduler(check_interval_minutes=1) |
|
else: |
|
scheduler = ReminderScheduler(check_interval_minutes=10) |
|
|
|
run_scheduler() |