Gelen isteği alır, ürünü database'den çeker, ShopCartBridge ile stok/fiyat kontrolü yapar.
5
CartService - Sepet Bulma
1. Öncelik: localStorage'dan gelen cart_id ile sepet bulunur. 2. Fallback: Session ID ile sepet bulunur. 3. Oluşturma: Yoksa yeni sepet oluşturulur.
6
CartService - Item Ekleme
Aynı ürün zaten sepette mi?
→ Varsa: Quantity artırılır, fiyatlar yeniden hesaplanır.
→ Yoksa: Yeni CartItem oluşturulur. Fiyat, vergi, currency conversion hesaplanır.
7
Cart Recalculation
Sepet toplamları yeniden hesaplanır: subtotal, tax_amount, total, items_count
8
API Response
Başarılı response döner: { success: true, data: { cart_id, item_count, total } }
9
Frontend Update
1. localStorage Güncelleme:cart_id kaydedilir. 2. Event Dispatch:window.dispatchEvent('cart-updated') ve Livewire.dispatch('cartUpdated') 3. CartWidget Refresh: Header'daki mini sepet güncellenir (badge + item count).
💡 Önemli Özellik:ensureTenantContext() metodu sayesinde central database'de yanlışlıkla cart sorgusu yapılması engellenir. Tenant context yoksa işlem yapılmaz.
Cart Model - Sepet Verisi
Database Tablosu:carts
customer_id: Kayıtlı kullanıcı (nullable - guest için null)
session_id: Session tracking (guest için zorunlu)
status: active, converted, abandoned, merged
items_count: Toplam ürün adedi
subtotal: Ara toplam (vergi hariç)
tax_amount: Toplam vergi tutarı
total: Genel toplam (vergi dahil)
coupon_code + coupon_discount: İndirim kuponu
billing_address + shipping_address: Adres bilgileri (JSON)
abandoned_at: Terk edilme zamanı
recovery_token: Sepet kurtarma linki için
💡 Tenant Protection: Model'de booted() metodu ile global scope ekleniyor. Tenant context yoksa hiçbir sorgu sonuç döndürmez.
CartItem Model - Polymorphic Items
Database Tablosu:cart_items
cartable_type + cartable_id:Polymorphic Relationship(Esnek ilişki - ShopProduct, Subscription, Service vb. olabilir)
product_id: Backward compatibility için (eski sistemlerle uyumluluk)
💡 Önemli: API, cart_id parametresini destekliyor. Bu sayede localStorage ile persistent cart çalışıyor. Kullanıcı sayfayı yenileyip sepete ürün eklese bile aynı sepet kullanılıyor.
✅ Güçlü Yönler
Polymorphic Design - Esnek Item Sistemi: CartItem modeli polymorphic relationship kullanıyor. Sadece Shop ürünleri değil, Subscription, Service, Course gibi her türlü item sepete eklenebilir. Gelecekte yeni item türleri eklemek çok kolay.
Currency Conversion - Döviz Dönüşümü: Ürünler USD/EUR gibi dövizlerle fiyatlandırılabilir. CartService otomatik olarak TRY'ye çevirir. original_currency, original_price, conversion_rate metadata olarak saklanır.
Stock Validation - Stok Kontrolü: ShopCartBridge servisi ile stok kontrolü yapılıyor. stock_tracking, allow_backorder, lead_time_days gibi özellikler destekleniyor.
Tax Calculation - Vergi Hesaplama: Her item için ayrı vergi oranı (tax_rate) saklanıyor. Sepet toplamında vergi ayrı ayrı hesaplanıp gösteriliyor.
Guest + Registered User Support - Misafir ve Üye Desteği: Hem misafir kullanıcılar (session_id ile) hem kayıtlı kullanıcılar (customer_id ile) sepet oluşturabiliyor. Login sonrası mergeGuestCart() ile sepetler birleştiriliyor.
API-First Approach - API Öncelikli Yaklaşım: Homepage product card API kullanıyor. Bu sayede gelecekte mobile app, SPA, headless commerce gibi farklı frontend'ler kolayca entegre edilebilir.
Event-Driven Updates - Olay Bazlı Güncellemeler: Sepete ürün eklenince CartWidget otomatik güncelleniyor. Event sistemi sayesinde farklı componentler birbirine bağlı çalışıyor.
Tenant Context Protection - Tenant Koruma: Cart ve CartItem modellerinde global scope ile tenant context kontrolü yapılıyor. Central database'de yanlışlıkla cart sorgusu yapılması engelleniyor.
Display Data Snapshot - Veri Anlık Görüntüsü:item_title, item_image, item_sku gibi display bilgileri cart_items tablosuna kaydediliyor. Ürün silinse veya güncellense bile sepette doğru bilgiler gösteriliyor.
⚡ İyileştirme Fırsatları
Homepage vs Shop Pages - Tutarlılık Eksikliği: Homepage product card Alpine.js + API kullanırken, shop sayfaları Livewire kullanıyor. İki farklı yaklaşım kafa karıştırıcı. Öneri: Tüm sayfalar API kullansın veya tüm sayfalar Livewire kullansın.
Event Duplication - Olay Duplikasyonu: Hem Livewire.dispatch('cartUpdated') hem window.dispatchEvent('cart-updated') kullanılıyor. İki farklı event sistemi gereksiz. Öneri: Tek bir event sistemi seç (Livewire events daha güçlü, Alpine.js ile de uyumlu).
Error Handling - Hata Yönetimi: API hata mesajları kullanıcıya alert() ile gösteriliyor. Modern UX için toast notification veya inline error message kullanılmalı. Öneri: Alpine.js notification component veya Livewire flash messages.
Optimistic Updates - İyimser Güncellemeler: Sepete ürün eklenince buton "loading" state'e geçiyor ama CartWidget hemen güncellenmiyor. API response beklenene kadar kullanıcı badge güncellemesini görmüyor. Öneri: Optimistic update - item_count anında artırılsın, API fail olursa geri alınsın.
Cart Abandonment - Terk Edilen Sepet:abandoned_at, recovery_token, recovery_email_sent_at fieldları var ama recovery sistemi pasif. Öneri: Cron job ile terk edilen sepetler tespit edilip kullanıcıya e-posta gönderilebilir.
Real-time Stock Check - Gerçek Zamanlı Stok Kontrolü: Sepete ekleme sırasında stok kontrolü yapılıyor ama sepet sayfasında güncel stok durumu kontrol edilmiyor. Kullanıcı 1 saat önce eklediği ürünü satın almaya çalışırken stok bitmiş olabilir. Öneri: Checkout başlamadan önce checkStock() metodu çağrılmalı.
Coupon Validation - Kupon Doğrulama:applyCoupon() metodu var ama kupon validasyonu yok. Kupon kodu kontrol edilmiyor, indirim miktarı direk parametre olarak geliyor. Öneri: Coupon modülü eklenmeli, kupon kodları database'de tutulmalı, geçerlilik, kullanım limiti, minimum tutar gibi kurallar uygulanmalı.
Performance - N+1 Query Problemi: Product card'da getFirstMediaWithFallback() her ürün için ayrı media sorgusu yapıyor olabilir. Öneri: Homepage controller'da ürünler çekilirken with('media') ile eager loading yapılmalı.
Analytics - Sepet Analitiği: Sepete ekleme, sepetten çıkarma, terk edilme gibi olaylar track edilmiyor. Öneri: Google Analytics veya internal analytics sistemi ile sepet olayları loglanmalı. Hangi ürünler çok sepete ekleniyor ama satın alınmıyor? (conversion funnel analysis)
🚀 Geliştirme Önerileri
Kısa Vadeli İyileştirmeler (1-2 Hafta)
CartWidget localStorage sync düzelt: Sayfa yüklendiğinde localStorage cart_id ile otomatik refresh.
Neden Yüksek? API-first approach, polymorphic design, multi-tenant architecture, event-driven updates. Gelecekte mobile app, SPA, headless commerce kolayca entegre edilebilir.