Her kupon türünün nasıl çalışacağı, hangi modüllere dokunacağı ve zorluk seviyesi
| Kupon Türü | Zorluk | Dokunulan Modüller | Ödeme Akışı |
|---|---|---|---|
| Yüzdelik İndirim | Kolay | Coupon Cart | Mevcut akışta kalır |
| Sabit Tutar İndirim | Kolay | Coupon Cart | Mevcut akışta kalır |
| Ücretsiz Kargo | Kolay | Coupon Cart | Mevcut akışta kalır |
| X Al Y Öde | Orta | Coupon Cart | Sepet mantığı değişir |
| Deneme Süresi Uzatma | Orta | Coupon Subscription User | Ödeme akışına GİRMEZ |
| Bedava Gün Kuponu | Orta | Coupon Subscription User | Ödeme akışına GİRMEZ |
| Referans / Davet Kuponu | Karmaşık | Coupon Subscription User Payment | İki taraflı + tetiklemeli |
percentage
Kolay
Zaten destekliyor. Coupon::apply() hesaplama hazır.
CheckoutPage.php → applyCoupon/removeCoupon metodları
checkout-page.blade.php → kupon input + indirim satırı UI
PayTR'ye grandTotal gidiyor — kupon düşüldükten sonraki tutar otomatik gider.
Abonelik süresi değişmez. Sadece ödenen tutar düşer.
fixed_amount
Kolay
Zaten destekliyor. Coupon::apply() → min($discount, $amount) ile sepeti geçmez.
Yüzdelik indirimle aynı entegrasyon. Tek fark hesaplama formülü.
Yüzdelik indirim yapıldığında bu da otomatik çalışır. Ek iş gerekmez.
free_shipping
Kolay
Cart::recalculateTotals() içinde shipping_cost sıfırlanır.
Order'da da aynı şekilde.
Şu an için bekletebilirsiniz. Altyapıda hazır olacak, ileride aktif edilir.
buy_x_get_y
Orta
Coupon::apply() şu an sadece percentage ve fixed_amount hesaplıyor. buy_x_get_y mantığı eklenmeli: sepetteki en ucuz ürünü bul, düş.
Sepette minimum buy_quantity adet ürün olmalı. CartItem'ları fiyata göre sırala → en ucuz get_quantity kadarını bedava yap.
Muzibu'da çoğu satış tek ürün (abonelik). Sepette 3+ ürün nadiren olabilir. Bu tür düşük öncelikli kalabilir.
trial_extension
Orta
Nasıl çalışır?
Kullanıcı kodu girer → Ödeme sayfasına gitmez → Direkt subscription_expires_at güncellenir → Anında premium olur.
Bu tür checkout'tan geçmez! Ayrı bir kupon giriş sayfası veya profil sayfasında kupon alanı gerekir.
coupons migration → coupon_type enum'a 'trial_extension' eklenmeli
Coupon.php model → extra_days alanı veya metadata kullanımı
CouponService.php → applyTrialExtension() yeni metod
SubscriptionService.php → extendByDays(User, int $days) yeni metod
Subscription.php model → Yeni subscription kaydı (price=0, source='coupon') veya mevcut uzatma
users.subscription_expires_at → recalculateSubscriptionExpiry() çağrılır
Kupon girişi için: profil sayfasına kupon alanı VEYA ayrı /kupon sayfası
free_days
Orta
Deneme Süresi Uzatma ile Teknik Olarak Aynı
"Deneme Süresi Uzatma" ve "Bedava Gün Kuponu" arkada aynı işi yapar: subscription_expires_at'a +X gün ekler.
Fark sadece isimlendirme ve pazarlama:
Trial hakkı bitmiş kullanıcılara "bir şans daha". Genelde yeni üyeler için.
Premium kullanıcıya +X gün hediye. Kampanya, sadakat ödülü, özür kuponu olarak.
Öneri: İkisini tek tür altında birleştir: free_days. Admin panelinde "gün sayısı" girer, kuponun adını/açıklamasını istediği gibi yazar ("Deneme Uzatma", "Hediye Premium" vs.).
referral
Karmaşık
coupon_type enum'a 'referral' eklenmeli
Coupon model → referrer_reward_type, referrer_reward_value alanları
CouponService → referral logic (2 taraflı ödül)
CouponUsage → referred_by_user_id ilişkisi
Davet edilen kayıt olduğunda → davet edenin subscription_expires_at'ı otomatik uzatılmalı
Kayıt formuna "Referans kodu" alanı eklenmeli. referred_by user ilişkisi.
Davet edilen checkout'ta otomatik indirim uygulanabilir (percentage/fixed ile aynı akış)
Kayıt formu → referans kodu alanı
Profil → "Davet linkin" bölümü
Profil → "Davet ettiğin kişiler" listesi
En karmaşık tür. Kupon sistemi + kullanıcı kaydı + abonelik + ödeme → 4 modül aynı anda etkileşir. Ayrı faz olarak planlanması önerilir.
| Modül / Dosya | % / ₺ İndirim | Ü. Kargo | X Al Y Öde | Bedava Gün | Referans |
|---|---|---|---|---|---|
| Coupon | — | — | + | ++ | +++ |
| ↳ CouponService.php | hazır | hazır | güncelle | yeni metod | yeni metod |
| ↳ Coupon.php model | hazır | hazır | hazır | apply() güncelle | yeni alanlar |
| ↳ Migration (enum) | — | — | — | enum değişir | enum değişir |
| Cart / Checkout | ++ | + | ++ | — | — |
| ↳ CheckoutPage.php | yeni metodlar | shipping=0 | item mantığı | — | — |
| ↳ checkout-page.blade.php | kupon UI | kupon UI | kupon UI | — | — |
| Subscription | — | — | — | ++ | ++ |
| ↳ SubscriptionService.php | — | — | — | extendByDays() | extendByDays() |
| User | — | — | — | + | ++ |
| Payment | — | — | — | — | + |
| Frontend (Yeni) | — | — | — | + | +++ |
Yüzdelik + Sabit Tutar + Ücretsiz Kargo → Checkout entegrasyonu + Rapor sayfaları
Etkilenen: Coupon (mevcut) + Cart/Checkout (2 dosya) — Diğer modüller değişmez
free_days türü + Subscription entegrasyonu + Kupon giriş noktası (profil veya ayrı sayfa)
Etkilenen: Coupon (migration + service) + Subscription (yeni metod) + User (expires_at) + Frontend (yeni alan)
İki taraflı ödül sistemi + Kayıt akışı değişikliği + Profil davet bölümü
Etkilenen: Coupon + Subscription + User/Auth + Payment + Frontend (3+ yeni alan) — Tüm modüller etkileşir