📊 Subscription Manage Component - Yeni Sistem Analizi

Admin panelden manuel abonelik oluşturma sayfasını yeni dinamik cycle sistemine uyarlama
📅 2025-12-05 🎯 Tenant: muzibu.com 👤 Admin Subscription Manage

🔴 Mevcut Durum - Sorunlar

❌ Legacy Billing Cycle

Component hala eski billing_cycle enum kullanıyor (monthly, yearly...)

Sorun: Yeni dinamik cycle sistemi (15 gün, 45 gün, deneme-3-gun...) desteklenmiyor!

❌ Cycle Metadata Eksik

cycle_key ve cycle_metadata field'leri tam kullanılmıyor

Sorun: Seçilen cycle'ın label, badge, promo_text bilgileri kaydedilmiyor!

❌ Status Eksiklikleri

View'da paused ve pending_payment status'leri var ama component'te tam desteklenmiyor

Sorun: Abonelik duraklatma ve ödeme bekleme senaryoları eksik!

❌ Trial Plan Mantığı Yok

Plan'ın is_trial field'i kontrol edilmiyor

Sorun: Deneme planı seçildiğinde otomatik trial mantığı çalışmıyor!

❌ Hardcoded Currency

currency her zaman 'TRY' olarak hardcoded

Sorun: Plan'ın currency field'i kullanılmıyor (USD/EUR/TRY desteği yok)!

❌ Subscription Number Manuel

subscription_number model tarafından otomatik oluşturuluyor ama component bunu bilmiyor

Not: Model boot() içinde zaten generate ediliyor, component'te gereksiz kod var

✅ Yeni Sistem - Dinamik Cycle Mimarisi

🔄 Sistem Akışı

1

Admin Plan Seçer

Plan seçildiğinde plan'ın billing_cycles JSON field'inden tüm cycle'lar çekilir

$plan->billing_cycles = {
  "1-aylik": {label: {tr: "1 Aylık"}, price: 99.90, duration_days: 30},
  "12-aylik": {label: {tr: "12 Aylık"}, price: 999.90, duration_days: 365},
  "deneme-7-gun": {label: {tr: "7 Günlük Deneme"}, price: 0, duration_days: 7}
}
2

Cycle Seçimi

Admin dropdown'dan bir cycle seçer (örn: "12-aylik")

Seçilen cycle'ın fiyatı, süresi, trial bilgisi otomatik yüklenir

3

Cycle Metadata Kaydı

Seçilen cycle'ın TÜM bilgileri cycle_metadata field'ine JSON olarak kaydedilir

cycle_key = "12-aylik"
cycle_metadata = {
  label: {tr: "12 Aylık", en: "12 Months"},
  duration_days: 365,
  price: 999.90,
  compare_price: 1199.00,
  trial_days: null,
  badge: {text: "En Popüler", color: "success"},
  promo_text: {tr: "2 ay bedava!"},
  sort_order: 2
}
4

Tarih Hesaplaması

Başlangıç tarihi + duration_days = Bitiş tarihi

started_at = 2025-12-05
duration_days = 365
current_period_end = 2026-12-05
next_billing_date = 2026-12-05
5

Trial Kontrolü

Eğer cycle'da trial_days varsa veya plan is_trial=true ise:

has_trial = true

trial_days = X set edilir

trial_ends_at hesaplanır

status = 'trial' olabilir

🆕 Subscription Tablosu - Güncel Field'lar

✅ Dinamik Cycle

  • cycle_key - Seçilen cycle anahtarı
  • cycle_metadata - Cycle bilgileri (JSON)
  • billing_cycle - Legacy (nullable)

✅ Tarih Yönetimi

  • started_at - Başlangıç tarihi
  • current_period_start - Dönem başlangıcı
  • current_period_end - Dönem bitişi
  • next_billing_date - Sonraki fatura

✅ Trial Yönetimi

  • has_trial - Deneme kullandı mı?
  • trial_days - Deneme süresi (gün)
  • trial_ends_at - Deneme bitiş tarihi

✅ Ödeme & Para Birimi

  • price_per_cycle - Döngü fiyatı
  • currency - Para birimi (TRY/USD/EUR)
  • total_paid - Toplam ödenen
  • billing_cycles_completed - Tamamlanan döngü

✅ Durum Yönetimi

  • status - active, trial, paused, cancelled, expired, pending_payment
  • auto_renew - Otomatik yenileme
  • cancelled_at - İptal tarihi

✅ Diğer

  • subscription_number - Otomatik (SUB-XXX)
  • payment_method_id - Ödeme yöntemi
  • cancellation_reason - İptal nedeni
  • metadata - Ek bilgiler (JSON)

📋 Yapılacaklar - Component Güncellemesi

1

Component: updatedSubscriptionPlanId() Güncelleme

Ne Yapılacak:

  • ✅ Plan seçildiğinde $plan->billing_cycles çek
  • $this->available_cycles property'sine ata
  • ✅ Plan'ın is_trial field'ini kontrol et
  • ✅ Plan'ın currency field'ini $this->currency'ye ata
  • ✅ İlk cycle'ı otomatik seç (cycle_key)
2

Component: updatedCycleKey() İyileştirme

Ne Yapılacak:

  • ✅ Seçilen cycle'ın price'ını $this->price_per_cycle'ye ata
  • ✅ Seçilen cycle'ın duration_days'ını kullanarak bitiş tarihini hesapla
  • ✅ Eğer cycle'da trial_days varsa:
    • $this->has_trial = true
    • $this->trial_days = X
    • $this->status = 'trial' (opsiyonel)
  • ✅ Cycle metadata'yı geçici property'de tut (save'de kullanılacak)
3

Component: save() Metodu Güncelleme

Ne Yapılacak:

  • cycle_key field'ini ekle (seçilen cycle anahtarı)
  • cycle_metadata field'ini ekle (seçilen cycle'ın TÜM bilgileri)
  • currency'yi plan'dan al (hardcoded 'TRY' KALDIR!)
  • has_trial, trial_days, trial_ends_at doğru hesapla
  • current_period_start = started_at
  • next_billing_date = current_period_end
  • billing_cycle field'ini KALDIR (nullable legacy field)
  • ⚠️ subscription_number model'de otomatik, component'te GEREKSIZ!
4

View: Cycle Dropdown Güncelleme

Ne Yapılacak:

  • ✅ Cycle dropdown 'da her cycle için:
    • → Label: {{ $cycle['label']['tr'] }}
    • → Duration: {{ $cycle['duration_days'] }} gün
    • → Price: ₺{{ $cycle['price'] }}
    • → Compare Price: ₺{{ $cycle['compare_price'] }} (eğer varsa)
    • → Trial Days: 🎁 {{ $cycle['trial_days'] }} gün deneme (eğer varsa)
  • ✅ Seçilen cycle'ın detaylarını preview kartında göster (badge, promo_text...)
5

Component: Yeni Property'ler Ekle

Eklenecek Property'ler:

public $currency = 'TRY'; // Plan'dan gelecek
public $selected_cycle_metadata = []; // Seçilen cycle bilgileri

Not: available_cycles zaten var, güzel!

6

View: Currency Symbol Dinamik

Ne Yapılacak:

  • ✅ Hardcoded sembolü yerine dinamik currency kullan
  • ✅ Helper fonksiyon: currency_symbol($currency)
  • ✅ Örnek: TRY → ₺, USD → $, EUR → €

🧪 Test Senaryoları

Test 1: Normal Plan (12 Aylık)

  • ✅ Kullanıcı seç
  • ✅ Plan seç (Premium - 12 Aylık)
  • ✅ Cycle dropdown'da "12 Aylık (365 gün • ₺999.90)" görünmeli
  • ✅ Fiyat otomatik doldurulmalı
  • ✅ Bitiş tarihi = Bugün + 365 gün
  • ✅ Kaydet → cycle_key = "12-aylik"
  • cycle_metadata doğru kaydedilmeli

Test 2: Trial Plan (Deneme)

  • ✅ Plan seç (is_trial = true olan plan)
  • ✅ Cycle dropdown'da "3 Günlük Deneme (3 gün • ₺0.00)" görünmeli
  • has_trial checkbox otomatik aktif olmalı
  • trial_days = 3 otomatik doldurulmalı
  • ✅ Bitiş tarihi = Bugün + 3 gün
  • ✅ Kaydet → trial_ends_at hesaplanmalı
  • status = 'trial' olabilir

Test 3: Özel Süre (15 Gün)

  • ✅ Plan'da "15-gunluk" cycle'ı varsa
  • ✅ Cycle dropdown'da görünmeli
  • ✅ duration_days = 15
  • ✅ Bitiş tarihi = Bugün + 15 gün
  • cycle_key = "15-gunluk"
  • cycle_metadata'da duration_days doğru

Test 4: Currency (USD Plan)

  • ✅ Plan'ın currency = 'USD' olsun
  • ✅ Fiyatlar $ sembolü ile görünmeli
  • ✅ Kaydet → currency = 'USD'
  • ✅ Hardcoded 'TRY' kullanılmamalı!

Test 5: Badge & Promo Text

  • ✅ Cycle'da badge varsa (örn: "En Popüler")
  • ✅ Preview kartında badge gösterilmeli
  • ✅ promo_text varsa (örn: "2 ay bedava!")
  • ✅ Preview kartında promo gösterilmeli
  • ✅ Kaydet → cycle_metadata'da badge + promo kaydedilmeli

Test 6: Edit (Mevcut Subscription)

  • ✅ Mevcut subscription'ı aç (edit)
  • cycle_key doğru yüklensin
  • cycle_metadata preview'da gösterilsin
  • ✅ Cycle değiştirilirse yeni metadata kaydedilsin

📌 Özet - Kritik Değişiklikler

✅ Eklenenler

  • cycle_key field
  • cycle_metadata field
  • • Dinamik currency
  • • Trial plan mantığı
  • • Badge & promo preview

❌ Kaldırılanlar

  • • Legacy billing_cycle enum
  • • Hardcoded 'TRY' currency
  • • Manuel subscription_number

⚡ İyileştirmeler

  • • Cycle dropdown daha bilgilendirici
  • • Otomatik tarih hesaplama
  • • Trial otomatik set
  • • Currency symbol dinamik
  • • Metadata preview kartı