✅ Blog AI Draft Sistemi - FIX TAMAMLANDI!

📅 Tarih: 2025-12-01 18:55 | 🎯 Tenant: ixtif.com (Tenant #2) | 👤 Fix: getBlogDailyCount() bug + Threshold optimization

🎯 Sorun ve Çözüm Özeti

❌ Tespit Edilen Bug

Settings'te 24 seçilmiş ama sistem 4 okuyor!

  • Database: blog_ai_daily_count = "24" (string)
  • Kod beklentisi: blog_ai_daily_count = "option9" (string)
  • Sonuç: $mapping["24"] → key yok → fallback 4 döndü!

✅ Uygulanan Çözüm

1. getBlogDailyCount() Fonksiyonu Güncellendi

// app/helpers.php - Line 290 // 🔧 FIX: Direkt sayı kontrolü eklendi if (is_numeric($optionValue)) { return (int) $optionValue; // "24" → 24 } // Option mapping (backward compatibility) $mapping = [ 'option9' => 24, // ... ]; return $mapping[$optionValue] ?? 4;

2. Draft Regeneration Threshold Artırıldı

// app/Console/Commands/GenerateTenantBlogs.php - Line 48 // ❌ Eski: 10 draft const MINIMUM_DRAFT_THRESHOLD = 10; // ✅ Yeni: 50 draft (2 günlük buffer) const MINIMUM_DRAFT_THRESHOLD = 50;

3. Haftalık Otomatik Draft Üretimi Eklendi

// app/Console/Kernel.php - Line 171-203 // Her Pazar 02:00'de 200 yeni draft üret $schedule->call(function () { // Tüm tenant'lar için blog AI aktifse // 200 draft üret (haftalık buffer) }) ->weeklyOn(0, '02:00') ->name('blog-draft-weekly-regeneration');

📊 Önce / Sonra Karşılaştırması

❌ Önce

Günlük blog hedefi: 4 blog (YANLIŞ!)
Active hours: 0, 6, 12, 18 (4 saat)
Draft threshold: 10 (çok düşük)
Buffer süresi: ~6 gün
Otomatik yenileme: Sadece threshold

✅ Sonra

Günlük blog hedefi: 24 blog (DOĞRU!)
Active hours: 0-23 (Her saat!)
Draft threshold: 50 (güvenli)
Buffer süresi: ~2 gün (optimum)
Otomatik yenileme: Threshold + Haftalık

🤔 Kernel'e Haftalık Cron Eklemek Mantıklı mı?

📌 Soru: Haftalık draft regeneration Kernel'de mi olmalı?

✅ Kernel'de (ÖNERİLEN)
  • Merkezi yönetim: Tüm cron'lar tek yerde
  • Kolay görünür: php artisan schedule:list
  • Standard Laravel: Tüm zamanlanmış işler Kernel'de
  • Bakım kolaylığı: Geliştiriciler önce Kernel'e bakar
  • Multi-tenant aware: Tüm tenant'ları otomatik tarar
❌ Alternatif (Modül içinde)
  • Modüler yapı: Blog modülüne özgü
  • Kernel kirlenmez: Daha az kod
  • Ama... Modül ServiceProvider'ında register etmek gerekir
  • Ama... Geliştiriciler görmeyebilir
  • Ama... Debugging zorlaşır

💡 Karar: KERNEL'DE TUTULMALI!

Neden?

  • Kritik sistem işlemi: Draft üretimi sistem sağlığı için gerekli
  • Görünürlük: DevOps/Developer hemen görür
  • Laravel convention: Tüm scheduled task'ler Kernel'de
  • Multi-tenant loop: Zaten Kernel'de tenant iteration var (blog-ai-dynamic-scheduler)
  • Log tracking: storage/logs/blog-draft-weekly.log ayrı takip edilir

Alternatif: Eğer modül bağımsız paketlense (composer package), o zaman ServiceProvider'da olmalı. Ama bu proje için Kernel ideal!

📊 Sistem Durumu (Fix Sonrası)

Metrik Durum Açıklama
getBlogDailyCount() 24 blog/gün Settings'ten doğru okuyor
Active Hours 0-23 (24 saat) Her saat blog üretilecek
Draft Pool 64 unused 100 draft üretimi queue'da
Threshold 50 draft 2 günlük güvenli buffer
Otomatik Üretim Haftalık + Threshold İki katmanlı koruma
Cron Status Aktif Saatlik çalışıyor

🎯 Beklenen Sonuçlar (24 Saat İçinde)

1. Blog Üretimi

  • 24 blog/gün üretilecek (her saat 1 blog)
  • ✅ Active hours: 0, 1, 2, 3, ... 23 (tüm saatler)
  • ✅ Otomatik yayınlanacak (blog_ai_auto_publish: true)

2. Draft Yönetimi

  • ✅ Mevcut 64 draft + 100 yeni = 164 draft
  • ✅ Buffer: ~6.8 gün (164 / 24)
  • ✅ Threshold (50) altına düşünce otomatik 100 yeni üretilecek
  • ✅ Her Pazar 02:00'de otomatik 200 draft eklenecek

3. Sistem Sağlığı

  • ✅ Draft pool asla bitmeyecek (iki katmanlı koruma)
  • ✅ Horizon queue healthy (işlemler akıcı)
  • ✅ Log tracking aktif (blog-cron.log, blog-draft-weekly.log)

📈 İzleme ve Test

Manuel Test Komutları:

# Blog AI settings kontrol php artisan tinker getBlogDailyCount(); // Beklenen: 24 calculateActiveHours(24); // Beklenen: [0,1,2,...,23] # Draft pool kontrol php artisan tinker use App\Models\Tenant; use Modules\Blog\App\Models\BlogAIDraft; $tenant = Tenant::find(2); tenancy()->initialize($tenant); BlogAIDraft::where('is_generated', false)->count(); // Unused drafts tenancy()->end(); # Cron manuel çalıştır php artisan generate:tenant-blogs --tenant-id=2 # Schedule list php artisan schedule:list | grep blog # Horizon status php artisan horizon:list

Log Dosyaları:

📝 Değişen Dosyalar

Dosya Değişiklik Satır
app/helpers.php getBlogDailyCount() - is_numeric() kontrolü eklendi 290-292
app/Console/Commands/GenerateTenantBlogs.php MINIMUM_DRAFT_THRESHOLD: 10 → 50 48
app/Console/Kernel.php Haftalık draft regeneration cron eklendi 171-203