Checkout Refactoring

Tarih: 2025-11-24 | Tenant: ixtif.com | Amaç: Checkout'u Shop'tan ayırma, dinamik sistem

Mevcut Durum Analizi

Sorun: CheckoutPage Shop'a Bağımlı

Cart modülündeki CheckoutPage.php tamamen Shop modülüne bağımlı:

  • ShopCustomer - Müşteri bilgileri
  • ShopCustomerAddress - Adres bilgileri
  • ShopOrder - Sipariş oluşturma
  • ShopOrderItem - Sipariş kalemleri

Bu yapı sadece fiziksel ürün satışı için çalışır. Dijital ürün, abonelik gibi farklı satış tipleri desteklenmez.

Sorun: Address Tablosu Shop'ta

shop_customer_addresses tablosu Shop modülünde. Bu tablo shop_customers tablosuna bağlı.

Cart bağımsız çalışamıyor çünkü adres bilgisi Shop'tan geliyor.

Hedef Mimari

Dinamik Checkout Sistemi

Checkout sayfası satılan içeriğe göre dinamik olmalı:

Satış Tipi Kargo Adresi Fatura Adresi Örnek
Fiziksel Ürün Gerekli Gerekli Forklift, Transpalet
Dijital Ürün Gerekli DEĞİL Gerekli E-kitap, Yazılım
Abonelik Gerekli DEĞİL Gerekli Muzibu Premium
Hizmet Duruma göre Gerekli Bakım, Kurulum

Yapılacaklar

1. Customer Modülü Oluştur Yüksek Öncelik

Tüm müşteri ve adres bilgilerini yönetecek merkezi modül:

  • customers tablosu - Genel müşteri bilgileri (users tablosuyla ilişkili)
  • customer_addresses tablosu - Adres bilgileri (Shop'tan bağımsız)

Neden? Shop, Subscription, Booking gibi tüm modüller aynı müşteri/adres sistemini kullanabilir.

2. Order Modülü Oluştur Yüksek Öncelik

Genel sipariş yönetimi için merkezi modül:

  • orders tablosu - Polymorphic ilişki (ShopProduct, Subscription, Service)
  • order_items tablosu - Sipariş kalemleri (cartable_type/id ile)

Avantaj: Cart'taki polymorphic yapı Order'a aktarılır. Her türlü içerik sipariş edilebilir.

3. CheckoutPage Refactoring Yüksek Öncelik

Cart modülündeki CheckoutPage'i Shop bağımlılıklarından arındır:

  • ShopCustomer yerine Customer
  • ShopCustomerAddress yerine CustomerAddress
  • ShopOrder yerine Order
  • Dinamik form alanları (kargo adresi göster/gizle)

4. Route Düzenlemesi Orta Öncelik

Cart modülüne checkout route'u ekle:

  • /checkout - Ana checkout sayfası
  • /checkout/success - Başarılı ödeme
  • /checkout/failed - Başarısız ödeme

Shop'tan shop.checkout route'unu kaldır.

5. Cart Model Güncelleme Orta Öncelik

Cart modeli checkout için gerekli bilgileri içermeli:

  • requires_shipping - Kargo gerekli mi? (boolean)
  • is_digital - Dijital ürün mü? (boolean)
  • is_subscription - Abonelik mi? (boolean)

Bu bilgiler CartItem'lardan hesaplanabilir (tüm item'lar dijitalse = dijital sepet).

6. Shop Modülü Temizliği Düşük Öncelik

Shop modülünden checkout ile ilgili gereksiz kodları kaldır:

  • CheckoutRedirectController kaldır
  • shop.checkout route'u kaldır (cart-page.blade.php'deki link)

Migration Planı

Yeni Tablolar

Tablo Modül Açıklama
customers Customer Merkezi müşteri tablosu (users FK)
customer_addresses Customer Müşteri adresleri (billing/shipping)
orders Order Genel siparişler (polymorphic)
order_items Order Sipariş kalemleri (polymorphic)

Mevcut Tablolar

Mevcut Shop tabloları korunacak (geriye uyumluluk için):

  • shop_customers - Mevcut veriler için
  • shop_customer_addresses - Mevcut veriler için
  • shop_orders - Mevcut siparişler için

Yeni siparişler yeni tablolara yazılacak. Eski veriler migrate edilebilir.

Uygulama Sırası

Aşama 1: Temel Altyapı

  1. Customer modülü oluştur (migration + model)
  2. Order modülü oluştur (migration + model)
  3. Tenant migration'ları oluştur
  4. Migration çalıştır

Aşama 2: Checkout Refactoring

  1. CheckoutPage.php'yi yeni modellere geçir
  2. checkout-page.blade.php'yi güncelle (dinamik form)
  3. Cart route'larına checkout ekle
  4. Test et

Aşama 3: Temizlik

  1. Shop'tan gereksiz checkout kodlarını kaldır
  2. cart-page.blade.php'deki shop.checkout linkini güncelle
  3. Test et

Alternatif: Hızlı Çözüm

Eğer Acil İse

Yeni modül oluşturmadan hızlı çözüm:

  1. Cart modülüne checkout_addresses tablosu ekle (JSON olarak cart'ta zaten var)
  2. CheckoutPage'i sadece Cart verilerini kullanacak şekilde güncelle
  3. Order oluşturmayı Payment callback'ine taşı

Dezavantaj: Uzun vadede yine refactoring gerekecek.