| |
| |
|
|
| """ |
| 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() |