Üyelik Sistemi - Tam Teknik Dokümantasyon

Tarih: 2025-11-23 | Versiyon: 6 | Her Kolonun Detaylı Açıklaması
Genel Bakış
5
Rename Edilecek Tablo
2
Yeni Tablo
10
Users'a Yeni Kolon
3
Mevcut Tablo (Kullanılacak)

Aşama 1: Tablo İsimlerini Değiştir (Rename)

Bu tablolar Shop modülünde oluşturulmuş ama hiç kullanılmamış (0 kayıt). "shop_" prefix'ini kaldırıp universal hale getiriyoruz.

shop_subscription_plans subscription_plans
subscription_plans RENAME
Üyelik paketlerini tanımlar. Muzibu'da Premium/VIP, İxtif'te ücretsiz plan gibi. Her tenant kendi planlarını oluşturabilir.
Kolon Tip Açıklama
subscription_plan_id bigint PK Planın benzersiz ID'si. Otomatik artan sayı.
title json Planın adı (çoklu dil desteği).
{"tr": "Premium Üyelik", "en": "Premium Membership"}
slug varchar unique URL-dostu benzersiz isim. Kodda referans için kullanılır.
premium, vip, free, enterprise
description json Plan açıklaması (çoklu dil). Satış sayfasında gösterilir.
features json Planın özellikleri listesi. Fiyatlandırma sayfasında tick listesi olarak gösterilir.
["Sınırsız dinleme", "Offline mod", "HQ ses"]
price_daily decimal(10,2) Günlük fiyat. Çoğu durumda kullanılmaz, 0 olabilir.
price_weekly decimal(10,2) Haftalık fiyat. Kısa süreli denemeler için.
price_monthly decimal(10,2) Aylık fiyat. En yaygın kullanılan seçenek.
299.00 (Muzibu Premium)
price_quarterly decimal(10,2) 3 aylık fiyat. Orta vadeli indirimli seçenek.
price_yearly decimal(10,2) Yıllık fiyat. Genelde 2 ay bedava hesabıyla.
2999.00 (Muzibu Premium Yıllık)
currency varchar(3) Para birimi kodu.
TRY, USD, EUR
has_trial boolean Bu plan deneme süresi sunuyor mu?
true = Evet, 7 gün ücretsiz dene
trial_days integer Deneme süresi kaç gün? has_trial true ise geçerli.
7, 14, 30
requires_payment_method boolean Deneme için kart bilgisi gerekli mi? true ise deneme başlatmak için kart ister.
max_products integer Plan limiti: Maksimum ürün sayısı. E-ticaret için. 0 = sınırsız.
max_orders integer Plan limiti: Aylık maksimum sipariş. E-ticaret için. 0 = sınırsız.
max_storage_mb integer Plan limiti: Depolama alanı (MB). Dosya yükleme için.
1024 = 1GB, 0 = sınırsız
custom_limits json Özel limitler. Tenant'a göre farklı limitler tanımlanabilir.
{"max_playlists": 100, "max_downloads": 500}
has_analytics boolean Analitik paneline erişim var mı?
has_priority_support boolean Öncelikli destek hakkı var mı?
has_api_access boolean API erişimi var mı? Geliştirici planları için.
enabled_features json Aktif özellik kodları. Kod içinde kontrol edilir.
["offline_mode", "hq_audio", "no_ads"]
default_billing_cycle varchar Varsayılan faturalama periyodu.
monthly, yearly, quarterly
sort_order integer Sıralama. Fiyatlandırma sayfasında gösterim sırası.
is_featured boolean Öne çıkan plan mı? Vurgulanır.
is_popular boolean Popüler plan mı? "En Popüler" etiketi gösterilir.
badge_text varchar Özel etiket metni.
%40 İndirim, Yeni, Tavsiye Edilen
highlight_color varchar Vurgu rengi. Kartın border rengi.
#3b82f6, gold, #10b981
is_active boolean Plan aktif mi? false ise yeni abonelik alamaz.
is_public boolean Herkese açık mı? false ise sadece özel link ile erişilir.
subscribers_count integer Cache: Toplam abone sayısı. Performans için.
terms text Kullanım koşulları. Ödeme öncesi kabul edilir.
notes text Admin notları. Kullanıcıya gösterilmez.
metadata json Ek veriler. Gelecek özellikler için esnek alan.
shop_subscriptions subscriptions
subscriptions RENAME
Kullanıcıların aktif aboneliklerini takip eder. Her ödeme dönemi, durum, yenileme tarihi burada tutulur.
Kolon Tip Açıklama
subscription_id bigint PK Aboneliğin benzersiz ID'si.
customer_id bigint FK Kullanıcı ID'si. users tablosuna bağlı.
users.id → customer_id
plan_id bigint FK Hangi plana abone? subscription_plans tablosuna bağlı.
subscription_number varchar unique Abonelik numarası. Faturalarda ve destek taleplerinde kullanılır.
SUB-2025-00001
status varchar Abonelik durumu. İş mantığının kalbi.
trialing = Deneme
active = Aktif
past_due = Ödeme gecikmiş
paused = Duraklatılmış
cancelled = İptal edilmiş
expired = Süresi dolmuş
billing_cycle varchar Faturalama periyodu. Ne sıklıkla ödeme alınıyor?
monthly, yearly, quarterly, weekly
price_per_cycle decimal(10,2) Dönem başına ödenen tutar. Kupon uygulanmış fiyat.
299.00 (aylık), 2999.00 (yıllık)
currency varchar(3) Ödeme para birimi.
has_trial boolean Bu abonelik deneme ile mi başladı?
trial_days integer Kaç günlük deneme süresi verildi?
trial_ends_at timestamp Deneme ne zaman bitiyor? Bu tarihte ödeme alınır veya abonelik düşer.
2025-12-01 00:00:00
started_at timestamp Abonelik ne zaman başladı? İlk kayıt tarihi.
current_period_start timestamp Mevcut faturalama döneminin başlangıcı.
1 Kasım 2025
current_period_end timestamp Mevcut faturalama döneminin sonu. Bu tarihe kadar hizmet alır.
30 Kasım 2025
next_billing_date timestamp Sonraki ödeme tarihi. Cron job bu tarihi kontrol eder.
1 Aralık 2025
cancelled_at timestamp İptal tarihi. İptal edildiyse ne zaman? Null ise aktif.
expires_at timestamp Aboneliğin tamamen biteceği tarih. İptal edilse bile bu tarihe kadar kullanabilir.
payment_method_id bigint FK Kayıtlı ödeme yöntemi. Otomatik yenilemede kullanılır.
auto_renew boolean Otomatik yenilensin mi? true ise dönem sonunda kart çekilir.
billing_cycles_completed integer Tamamlanan dönem sayısı. Sadakat programları için kullanılabilir.
12 = 1 yıldır abone
total_paid decimal(10,2) Cache: Toplam ödenen tutar. Raporlama için.
cancellation_reason varchar İptal nedeni kodu. Analytics için.
too_expensive, not_using, switched_competitor
cancellation_feedback text İptal geri bildirimi. Kullanıcının yazdığı açıklama.
notes text Admin notları.
metadata json Ek veriler. PayTR subscription_id, kupon bilgisi vb.
{"paytr_token": "xxx", "coupon_used": "WELCOME50"}
shop_customer_groups customer_groups
customer_groups RENAME
Müşteri grupları/seviyeleri. VIP müşteriler, toptan alıcılar, kurumsal hesaplar gibi farklı müşteri segmentleri için özel kurallar tanımlar.
Kolon Tip Açıklama
customer_group_id bigint PK Grup ID'si.
title json Grup adı.
VIP Müşteriler, Toptan Alıcılar, Kurumsal
slug varchar unique URL-dostu benzersiz kod.
description json Grup açıklaması.
discount_percentage decimal(5,2) Sabit indirim oranı. Bu gruptaki herkes bu indirimi alır.
10.00 = %10 indirim
has_special_pricing boolean Özel fiyatlandırma var mı? true ise ürünlerde bu gruba özel fiyat tanımlanabilir.
price_on_request_only boolean Fiyat gizli mi? true ise "Fiyat için arayın" gösterilir.
can_see_stock boolean Stok miktarını görebilir mi?
can_request_quote boolean Teklif isteyebilir mi?
can_purchase_on_credit boolean Vadeli alışveriş yapabilir mi?
credit_limit decimal(10,2) Kredi limiti. Vadeli alışveriş için maksimum borç.
50000.00 TL
payment_term_days integer Ödeme vadesi (gün). Vadeli alışverişte kaç gün içinde ödenmeli?
30 = 30 gün vade
tax_exempt boolean Vergiden muaf mı? İhracat için.
tax_exempt_number varchar Vergi muafiyet numarası.
free_shipping boolean Ücretsiz kargo hakkı var mı?
free_shipping_threshold decimal(10,2) Ücretsiz kargo limiti. Bu tutarın üzerinde kargo bedava.
500.00 = 500 TL üzeri ücretsiz
loyalty_points_multiplier decimal(3,2) Puan çarpanı. Sadakat programında ekstra puan.
1.50 = %50 fazla puan
requires_approval boolean Gruba katılım onay gerektirir mi? true ise admin onaylamalı.
is_default boolean Varsayılan grup mu? Yeni üyeler bu gruba atanır.
is_active boolean Grup aktif mi?
sort_order integer Sıralama.
color_code varchar Grup rengi. Admin panelinde tanımlama için.
#FFD700 (Gold), #3B82F6 (Blue)
shop_coupons coupons
coupons RENAME
Universal kupon sistemi. Hem shop ürünlerinde hem subscription ödemelerinde kullanılabilir. Çok kapsamlı ve esnek yapı.
Kolon Tip Açıklama
coupon_id bigint PK Kupon ID'si.
title json Kupon başlığı. Admin ve raporlarda gösterilir.
Yılbaşı Kampanyası, İlk Alışveriş İndirimi
code varchar unique Kupon kodu. Kullanıcının girdiği kod.
WELCOME50, NEWYEAR2025, VIP20
description json Kupon açıklaması.
coupon_type varchar İndirim türü.
percentage = Yüzde indirim (%20)
fixed_amount = Sabit tutar (50 TL)
free_shipping = Ücretsiz kargo
buy_x_get_y = X al Y bedava
discount_percentage decimal(5,2) İndirim yüzdesi. coupon_type = percentage ise kullanılır.
20.00 = %20
discount_amount decimal(10,2) Sabit indirim tutarı. coupon_type = fixed_amount ise kullanılır.
50.00 = 50 TL indirim
max_discount_amount decimal(10,2) Maksimum indirim. Yüzde indirimlerde tavan.
%20 indirim, max 100 TL
buy_quantity integer X al Y bedava için: Kaç tane al?
get_quantity integer X al Y bedava için: Kaç tane bedava?
applicable_product_ids json Geçerli ürün ID'leri. Boş ise tüm ürünlerde geçerli.
usage_limit_total integer Toplam kullanım limiti. 0 = sınırsız.
100 = Sadece ilk 100 kişi
usage_limit_per_customer integer Kişi başı kullanım limiti.
1 = Her müşteri 1 kez kullanabilir
used_count integer Cache: Kaç kez kullanıldı?
minimum_order_amount decimal(10,2) Minimum sepet tutarı.
200 TL üzeri alışverişlerde geçerli
maximum_order_amount decimal(10,2) Maksimum sepet tutarı. Nadir kullanılır.
minimum_items integer Minimum ürün adedi.
3 ürün ve üzeri alışverişlerde
applies_to varchar Nerelerde geçerli?
all = Her yerde
subscription = Sadece abonelik
shop = Sadece mağaza
specific_products = Belirli ürünler
category_ids json Geçerli kategori ID'leri.
product_ids json Geçerli ürün ID'leri.
brand_ids json Geçerli marka ID'leri.
excluded_category_ids json Hariç tutulan kategoriler. Bu kategorilerde geçersiz.
excluded_product_ids json Hariç tutulan ürünler.
customer_eligibility varchar Kimler kullanabilir?
all = Herkes
specific_customers = Belirli müşteriler
customer_groups = Belirli gruplar
first_order = İlk siparişte
customer_group_ids json Geçerli müşteri grup ID'leri.
customer_ids json Geçerli müşteri ID'leri. VIP kodları için.
valid_from timestamp Geçerlilik başlangıcı. Bu tarihten önce kullanılamaz.
valid_until timestamp Geçerlilik bitişi. Bu tarihten sonra kullanılamaz.
can_combine_with_other_coupons boolean Başka kuponlarla birleştirilebilir mi?
can_combine_with_sales boolean İndirimli ürünlerde de geçerli mi?
is_active boolean Kupon aktif mi?
is_public boolean Herkese açık mı? true ise sitede gösterilebilir.
banner_text varchar Banner metni. Sitede gösterilecek promosyon yazısı.
WELCOME50 ile %50 indirim!
banner_color varchar Banner rengi.
terms text Kullanım koşulları.
notes text Admin notları.
metadata json Ek veriler.
shop_coupon_usages coupon_usages
coupon_usages RENAME
Kupon kullanım kayıtları. Kim, ne zaman, nerede kullandı? Polymorphic yapıda hem sipariş hem abonelik için çalışır.
Kolon Tip Açıklama
coupon_usage_id bigint PK Kullanım kaydı ID'si.
coupon_id bigint FK Hangi kupon kullanıldı?
customer_id bigint FK Kim kullandı?
usable_type varchar Polymorphic: Nerede kullanıldı?
App\Models\ShopOrder
App\Models\Subscription
usable_id bigint Polymorphic: Sipariş veya abonelik ID'si.
discount_amount decimal(10,2) Uygulanan indirim tutarı.
original_amount decimal(10,2) İndirim öncesi tutar.
final_amount decimal(10,2) İndirim sonrası ödenen tutar.
used_at timestamp Ne zaman kullanıldı?

Aşama 2: Yeni Tablolar

user_devices YENİ
Kullanıcının giriş yaptığı cihazları takip eder. Cihaz limiti kontrolü, güvenlik (yeni cihaz uyarısı), oturum yönetimi için kullanılır.
Kolon Tip Açıklama
id bigint PK Cihaz kaydı ID'si.
user_id bigint FK Hangi kullanıcıya ait? users tablosuna bağlı.
device_id varchar unique Cihaz parmak izi (fingerprint). Browser + IP + UserAgent hash'i. Aynı cihazı tanımak için kullanılır.
a1b2c3d4e5f6...
device_name varchar Kullanıcı dostu cihaz adı. UserAgent'dan parse edilir.
Chrome on Windows, Safari on iPhone
browser varchar Tarayıcı adı ve versiyonu.
Chrome 119, Safari 17, Firefox 120
platform varchar İşletim sistemi.
Windows 11, macOS 14, iOS 17, Android 14
ip_address varchar Son giriş IP adresi. Güvenlik için.
192.168.1.1, 2001:db8::1
location varchar IP'den tespit edilen konum. Şüpheli giriş tespiti için.
İstanbul, Türkiye
last_activity timestamp Son aktivite zamanı. Her istekte güncellenir. Cihaz seçiminde "en son kullanılan" gösterimi için.
is_current boolean Şu an aktif cihaz mı? Her oturumda sadece 1 cihaz current olabilir.
is_trusted boolean Güvenilir cihaz mı? Kullanıcı "bu cihazı hatırla" derse true olur. 2FA'da bu cihazda kod sorulmaz.
created_at timestamp İlk giriş tarihi.
updated_at timestamp Son güncelleme tarihi.
login_logs YENİ
Tüm giriş denemelerini kaydeder (başarılı ve başarısız). Güvenlik analizi, brute force tespiti, kullanıcı aktivite raporu için.
Kolon Tip Açıklama
id bigint PK Log kaydı ID'si.
user_id bigint FK nullable Kullanıcı ID'si. Başarısız girişlerde null olabilir (kullanıcı bulunamadıysa).
email varchar Girişte kullanılan email. Başarısız girişlerde user_id null olsa bile email'i kaydederiz.
ip_address varchar Giriş yapılan IP adresi.
user_agent text Tam UserAgent string'i. Detaylı analiz için.
browser varchar Parse edilmiş tarayıcı adı.
platform varchar Parse edilmiş işletim sistemi.
device_type varchar Cihaz türü.
desktop, mobile, tablet
country varchar IP'den tespit edilen ülke. GeoIP ile.
Türkiye, Germany, United States
city varchar IP'den tespit edilen şehir.
İstanbul, Berlin, New York
status varchar Giriş sonucu.
success = Başarılı giriş
failed = Başarısız (yanlış şifre)
blocked = Engellendi (çok fazla deneme)
2fa_required = 2FA bekleniyor
2fa_failed = 2FA kodu yanlış
failure_reason varchar Başarısızlık nedeni.
invalid_password = Yanlış şifre
user_not_found = Kullanıcı bulunamadı
account_locked = Hesap kilitli
account_inactive = Hesap deaktif
device_limit_reached = Cihaz limiti aşıldı
metadata json Ek veriler. 2FA bilgileri, device_id vb.
{"2fa_method": "sms", "attempts": 3}
created_at timestamp Giriş denemesi zamanı.

Aşama 3: Users Tablosuna Yeni Kolonlar

users (yeni kolonlar) GÜNCELLEME
Mevcut users tablosuna eklenecek yeni kolonlar. Üyelik, güvenlik ve kurumsal özellikler için.
Kolon Tip Açıklama
customer_group_id bigint FK nullable Hangi müşteri grubuna ait? customer_groups tablosuna bağlı. Null ise varsayılan grup uygulanır.
VIP, Toptan, Kurumsal grupları
device_limit integer nullable Kullanıcıya özel cihaz limiti. Null ise sistem varsayılanı (1) uygulanır. Admin belirli kullanıcılara farklı limit verebilir.
null = varsayılan(1), 3, 5, 0 = sınırsız
is_approved boolean default true Hesap onaylandı mı? Admin onayı gerektiren sistemlerde false ile başlar. Onaylanana kadar giriş yapamaz.
failed_login_attempts integer default 0 Ardışık başarısız giriş denemesi sayısı. Başarılı girişte sıfırlanır. Brute force koruması için.
5 başarısız = hesap kilitle
locked_until timestamp nullable Hesap ne zamana kadar kilitli? Bu tarih geçene kadar giriş yapamaz.
30 dakika kilitleme
two_factor_enabled boolean default false 2FA aktif mi? true ise girişte SMS kodu istenir.
two_factor_phone varchar nullable 2FA SMS gönderilecek telefon numarası. phone alanından farklı olabilir.
+905551234567
is_corporate boolean default false Kurumsal hesap mı? true ise alt hesap oluşturabilir. Sadece Muzibu için.
corporate_code varchar unique nullable Kurumsal davet kodu. Alt hesaplar bu kodla kayıt olur.
ACME-2025, CORP-XYZ123
parent_user_id bigint FK nullable Üst hesap (kurumsal ana hesap) ID'si. Bu kullanıcı bir alt hesapsa ana hesabı gösterir. Ödeme ana hesaptan alınır.

Mevcut Tablolar (Değişiklik Yok)

Bu tablolar olduğu gibi kullanılacak:

payments - Polymorphic ödeme kayıtları (Subscription için Payable implement edilecek)
payment_methods - Ödeme yöntemleri (PayTR, Havale vb.)
bank_accounts - Banka hesapları
sessions - Laravel session yönetimi
password_reset_tokens - Şifre sıfırlama
activity_log - Spatie aktivite logları
settings_groups / settings_values - Ayar yönetimi
jobs / failed_jobs - Queue sistemi (mail, cron)

Uygulama Sırası

  1. Tablo Rename Migration
    shop_* tablolarını universal isimlere çevir
  2. Yeni Tablo Migration
    user_devices ve login_logs tablolarını oluştur
  3. Users Tablosu Migration
    Yeni kolonları ekle
  4. Universal Modeller
    app/Models/ altında yeni model dosyaları
  5. Servisler
    SubscriptionService, DeviceService, CouponService vb.
  6. SettingManagement Grupları
    Auth ayarları için seeder