#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 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 # Import our modules 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 # Saniyeye çevir self.manager = FollowUpManager() self.running = False def send_reminder(self, follow_up) -> bool: """Hatırlatma mesajı gönder""" try: # Hatırlatma mesajını hazırla reminder_message = format_reminder_message(follow_up) # Mehmet Bey'e bildirim gönder result = send_store_notification( customer_phone=follow_up.customer_phone, customer_name=follow_up.customer_name, product_name=follow_up.product_name, action="reminder", # Yeni tip: hatırlatma 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...") # Bekleyen hatırlatmaları al pending = self.manager.get_pending_reminders() if not pending: logger.info("📭 Bekleyen hatırlatma yok") return logger.info(f"📬 {len(pending)} hatırlatma bulundu") # Her birini gönder for follow_up in pending: logger.info(f"📤 Hatırlatma gönderiliyor: {follow_up.customer_phone}") if self.send_reminder(follow_up): # Başarılıysa durumu güncelle self.manager.mark_as_reminded(follow_up.id) # Eğer çok kez hatırlatma yapıldıysa tamamlanmış say 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}") # Mesajlar arası bekle (rate limit) 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 # Özet mesajı hazırla 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!" # Özet bildirimi gönder send_store_notification( customer_phone="whatsapp:+905439362335", # Direkt Mehmet Bey 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: # Hatırlatmaları kontrol et self.check_and_send_reminders() # Günlük özet zamanı mı? (Saat 09:00 ve 18:00) now = datetime.now() if now.hour in [9, 18] and now.date() != last_summary_date: self.send_daily_summary() last_summary_date = now.date() # Bekle 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) # Hata durumunda 1 dakika bekle def stop(self): """Zamanlayıcıyı durdur""" self.running = False logger.info("⏹️ Zamanlayıcı durduruluyor...") def run_scheduler(): """Ana fonksiyon""" # Twilio credentials'ları ayarla 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__": # Test modda çalıştır (1 dakika aralıklarla) 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()