BF-WAB / reminder_scheduler.py
SamiKoen's picture
Fix WhatsApp Business number and add follow-up system
756c103
#!/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()