⚠️ Subscription Sistemi - Kritik Eksiklikler & Öneriler

📅 Tarih: 2025-12-03 | 🎯 Tenant: Tüm Tenantlar | 👤 Analiz: Subscription System Architecture

❌ Problem 1: Subscription Süresi Nasıl Hesaplanacak?

Mevcut Durum:

  • subscription_plans tablosunda sadece fiyat bilgisi var
  • price_monthly ve price_yearly alanları mevcut
  • Ama: Subscription kaç gün sürecek? bilgisi yok!
  • Sistem satın alındığında end_date'i nasıl hesaplayacak?

Somut Örnekler:

  • ✅ Kullanıcı "Aylık" plan satın alıyor → 30 gün mü? 1 month mı?
  • ✅ Kullanıcı "Yıllık" plan satın alıyor → 365 gün mü? 12 month mü?
  • ✅ 3 aylık plan eklemek istiyorsun → Sisteme nasıl eklenecek?
  • ✅ 6 aylık plan eklemek istiyorsun → Database'de alan yok!

✅ Çözüm Önerisi:

Option A: Sabit Period'lar (Basit Yaklaşım)

subscription_plans tablosuna eklenecek kolonlar:
- price_daily (decimal, nullable)
- price_weekly (decimal, nullable)
- price_monthly (decimal, nullable)
- price_quarterly (decimal, nullable) → YENİ! 3 ay
- price_semi_annual (decimal, nullable) → YENİ! 6 ay
- price_yearly (decimal, nullable)

Option B: Esnek Period Yapısı (Gelecek-Proof)

subscription_plans tablosuna eklenecek kolonlar:
- billing_cycles (JSON) → {
    "monthly": {"price": 99, "duration_days": 30},
    "quarterly": {"price": 270, "duration_days": 90},
    "semi_annual": {"price": 500, "duration_days": 180},
    "yearly": {"price": 990, "duration_days": 365}
  }

❌ Problem 2: Kullanıcının Aktif Üyeliği Nasıl Takip Edilecek?

Mevcut Durum:

  • Kullanıcı subscription satın alıyor → Nereye kaydedilecek?
  • Start date, end date, status tracking için tablo yok!
  • Auto-renewal nasıl yönetilecek?
  • Trial period tracking yok
  • Subscription expire olduğunda nasıl anlaşılacak?

✅ Çözüm: user_subscriptions Tablosu (ZORUNLU!)

CREATE TABLE user_subscriptions (
    user_subscription_id BIGINT PRIMARY KEY AUTO_INCREMENT,
    user_id BIGINT NOT NULL,
    subscription_plan_id BIGINT NOT NULL,

    -- Süre Yönetimi
    billing_cycle VARCHAR(50) NOT NULL, -- monthly, quarterly, yearly
    start_date DATETIME NOT NULL,
    end_date DATETIME NOT NULL,
    trial_end_date DATETIME NULL, -- Trial varsa

    -- Durum Takibi
    status ENUM('trial', 'active', 'expired', 'cancelled', 'paused') DEFAULT 'active',

    -- Ödeme Yönetimi
    auto_renew BOOLEAN DEFAULT TRUE,
    next_billing_date DATETIME NULL,
    last_payment_date DATETIME NULL,

    -- Metadata
    created_at TIMESTAMP,
    updated_at TIMESTAMP,
    cancelled_at TIMESTAMP NULL,

    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (subscription_plan_id) REFERENCES subscription_plans(subscription_plan_id)
);

❌ Problem 3: Billing Cycle Enum Yok

Mevcut Durum:

  • Cart'ta billing_cycle metadata olarak string kaydediliyor
  • Enum yok, validation yok
  • Frontend'de hardcode "monthly" ve "yearly" var
  • 3 ay, 6 ay eklemek istersen sistem desteklemiyor

✅ Çözüm: Standart Billing Cycle Enum

Billing Cycle Süre Calculation Kullanım
daily 1 gün +1 day Test/Demo için
weekly 7 gün +7 days Kısa süreli kampanyalar
monthly 1 ay +1 month Standart aylık abonelik
quarterly 3 ay +3 months 3 aylık paketler
semi_annual 6 ay +6 months 6 aylık paketler
yearly 1 yıl +1 year Yıllık abonelik
lifetime Sınırsız null (no expiry) Lifetime access

❌ Problem 4: Plan Karşılaştırma Sistemi

Mevcut Durum:

  • Her planın features array'i var
  • Ama karşılaştırma için yapılandırılmamış
  • "Basic planında X var mı?" sorusuna cevap yok
  • Comparison table oluşturmak için structure yok

✅ Çözüm Seçenekleri:

Option A: Mevcut Sistem (Basit, Yeterli)

Her plan kendi features array'ine sahip. Karşılaştırma frontend'de manual yapılır.

Premium Plan features:
["fas fa-infinity|Sınırsız ürün", "fas fa-headset|7/24 Destek"]

Basic Plan features:
["fas fa-box|100 Ürün Limiti", "fas fa-envelope|Email Destek"]

Basit Hızlı

Option B: Feature Matrix (Gelişmiş)

Ayrı plan_features tablosu, her özellik tanımlı, planlar işaretler.

plan_features tablosu:
feature_id | name | icon | category
1 | Unlimited Products | fas fa-infinity | products
2 | 24/7 Support | fas fa-headset | support

plan_feature_pivot:
subscription_plan_id | feature_id | included | limit_value
1 | 1 | true | null
1 | 2 | true | null
2 | 1 | false | 100

Kompleks Esnek

🎯 Karar Noktaları - Senin Seçimlerin

Karar 1: Billing Cycle Yapısı

A) Sabit Kolonlar (Önerilir)
  • ✅ Basit migration
  • ✅ Admin panelde her fiyat ayrı input
  • ✅ Hızlı development
  • ❌ Yeni period eklemek için migration gerekir
B) JSON Billing Cycles (Gelecek-proof)
  • ✅ Sınırsız period eklenebilir
  • ✅ Her period'a custom duration
  • ❌ Admin panelde JSON form gerekir
  • ❌ Daha kompleks kod

Karar 2: Hangi Billing Cycle'lar Aktif Olacak?

Sisteme şimdilik hangi cycle'ları eklemek istiyorsun?

  • [ ] Daily (1 gün) - Test/Demo için
  • [ ] Weekly (7 gün) - Kampanyalar için
  • [✓] Monthly (1 ay) - ZORUNLU
  • [ ] Quarterly (3 ay) - İstiyor musun?
  • [ ] Semi-Annual (6 ay) - İstiyor musun?
  • [✓] Yearly (1 yıl) - ZORUNLU
  • [ ] Lifetime - Tek seferlik ödeme

Karar 3: Trial Period

Şu an trial_days kolonu var ama kullanılmıyor. Trial sistemi aktif olacak mı?

  • [✓] Evet - Trial period sonrası auto-charge
  • [ ] Hayır - Direkt ücretli başlasın

Karar 4: Auto-Renewal

Subscription bittiğinde otomatik yenileme olacak mı?

  • [✓] Evet - Auto-renew varsayılan (kullanıcı kapatabilir)
  • [ ] Hayır - Manuel renewal

Karar 5: Feature Comparison

  • [✓] Option A: Mevcut sistem yeterli (her plan kendi features)
  • [ ] Option B: Feature matrix sistemi kur (kompleks)

🚀 Önerilen Implementation Planı

Faz 1: Database Schema (ZORUNLU) Kritik

  1. subscription_plans tablosuna ek kolonlar:
    • price_quarterly (3 ay fiyatı - opsiyonel)
    • price_semi_annual (6 ay fiyatı - opsiyonel)
  2. user_subscriptions tablosu oluştur (YENİ!)
  3. billing_cycle enum validation ekle

Faz 2: Backend Logic Kritik

  1. Checkout'ta subscription oluşturma:
    • Payment success → user_subscriptions create
    • Start date = now
    • End date = start_date + billing_cycle duration
    • Trial varsa: status = 'trial', trial_end_date set
  2. Subscription status checker (cron job):
    • Her gün expired subscription'ları kontrol et
    • Auto-renew true ise → Payment charge et
    • Auto-renew false ise → Status = 'expired'

Faz 3: Admin Panel Önemli

  1. Plan yönetiminde yeni fiyat inputları ekle
  2. User subscriptions listesi
  3. Subscription status manuel değiştirebilme

Faz 4: Frontend Opsiyonel

  1. 3 ay, 6 ay seçenekleri ekle (karar verirsen)
  2. Comparison table sayfası
  3. User dashboard'ta aktif subscription göster

💡 Sonuç & Tavsiye

Şu Anki Sistem:

Eksik Sadece plan tanımlama ve cart'a ekleme var. Gerçek subscription logic yok!

Minimum Viable Product (MVP) için:

  1. user_subscriptions tablosu mutlaka oluşturulmalı
  2. Monthly ve Yearly billing cycle'lar yeterli (3-6 ay şimdilik gerek yok)
  3. Checkout sonrası subscription creation logic yazılmalı
  4. Cron job ile expired subscription kontrolü
  5. Feature comparison için mevcut sistem yeterli

Gelecek İçin:

  • Quarterly ve Semi-Annual period'lar eklenebilir
  • Feature matrix sistemi kurulabilir
  • Usage-based billing (API call count vb.) eklenebilir