📊 KDV Yapısı Analiz Raporu

📅 2025-12-03
🎯 Shop + Subscription + Cart + Payment
🏢 Multi-Tenant Sistem

📋 Özet

Sistemdeki KDV yapısı detaylı analiz edildi. Shop ve Cart modüllerinde KDV altyapısı mevcut ancak Subscription modülünde eksik. Ayrıca KDV dahil/hariç ayrımı yapılmıyor, bu da fiyat kafa karışıklığına yol açabilir.

🛒 Shop Modülü (ShopProduct)

Mevcut Durum Eksik Alan

✅ Var Olan Alanlar

  • tax_rate - KDV oranı (decimal 5,2) - Model: Line 48, 106
  • base_price - Temel fiyat (decimal 12,2) - Migration: Line 56
  • compare_at_price - İndirim öncesi fiyat
  • cost_price - Maliyet fiyatı
  • currency - Para birimi (TRY, USD, EUR)

❌ Eksik Alanlar

  • tax_included - KDV dahil mi hariç mi? (boolean)
  • price_display_mode - Fiyat gösterim şekli (with_tax / without_tax / both)

⚠️ Sorun

Ürün fiyatının KDV dahil mi KDV hariç mi olduğu belli değil. Kullanıcı kafası karışabilir:

  • B2B müşteriler genelde KDV hariç fiyat görmek ister
  • B2C müşteriler genelde KDV dahil fiyat görmek ister
  • Sepette hesaplama yaparken fiyat KDV dahil mi hariç mi anlaşılmıyor
CartService.php - Line 281-282:
// Default KDV %20
return 20.0;

Mevcut kod varsayılan %20 KDV kullanıyor ama ürün bazında farklı KDV oranları tanımlanamıyor (örn: gıda %1, kitap %0).

💳 Subscription Modülü (SubscriptionPlan)

Mevcut Durum KDV Yok

❌ Hiç KDV Alanı Yok!

  • tax_rate - KDV oranı
  • tax_included - KDV dahil mi?
  • price_display_mode - Fiyat gösterim şekli

⚠️ billing_cycles içinde sadece price var, KDV bilgisi hiç yok!

SubscriptionPlan Model - Line 51:
'billing_cycles' => 'array', // {"monthly": {"price": 199.90, "duration_months": 1}}

⚠️ Kritik Sorun

Abonelik planlarında KDV bilgisi hiç yok! Bu durumda:

  • 199,90 TL KDV dahil mi hariç mi belli değil
  • Faturada KDV hesaplaması yapılamaz
  • Yasal olarak KDV bilgisi zorunlu

🛍️ Cart Modülü (CartItem + CartService)

Mevcut Durum KDV Var

✅ Var Olan Alanlar

  • tax_rate - KDV oranı (decimal 5,2) - Migration: Line 39
  • tax_amount - KDV tutarı (decimal 12,2) - Migration: Line 38
  • unit_price - Birim fiyat
  • final_price - İndirim sonrası fiyat
  • subtotal - Ara toplam (KDV hariç)
  • total - Genel toplam (KDV dahil)

❌ Eksik Mantık

  • Ürün fiyatı KDV dahil mi hariç mi anlaşılamıyor
  • KDV hesaplama hatalı olabilir (KDV dahil fiyata tekrar KDV eklenirse çift vergi!)
CartItem Model - Line 176:
// Tax amount'u yeniden hesapla (quantity'ye göre)
$this->tax_amount = $this->subtotal * ($this->tax_rate / 100);

Mevcut hesaplama subtotal * tax_rate yapıyor. Ancak:

💡 Doğru Hesaplama Mantığı

Senaryo 1: Fiyat KDV dahil (tax_included = true)

net_price = base_price / (1 + tax_rate / 100) // KDV'yi çıkar
tax_amount = base_price - net_price // KDV tutarı
subtotal = net_price * quantity // KDV hariç toplam
total = base_price * quantity // KDV dahil toplam

Senaryo 2: Fiyat KDV hariç (tax_included = false)

net_price = base_price // Zaten KDV hariç
tax_amount = base_price * (tax_rate / 100) // KDV tutarı hesapla
subtotal = base_price * quantity // KDV hariç toplam
total = subtotal + (tax_amount * quantity) // KDV ekle

💰 Payment Modülü

Payment modülü sadece ödeme gateway entegrasyonu yapıyor. KDV hesaplaması Cart ve Order modüllerinde yapılıyor.

✅ Payment modülünde KDV için ekstra bir şey yapmaya gerek yok.

📊 Türkiye KDV Oranları (2025)

KDV Oranı Ürün/Hizmet Kategorisi Örnekler
%0 İhracat, uluslararası taşımacılık Yurtdışı satışlar
%1 Temel gıda, yayın Ekmek, süt, gazete, kitap
%10 Bazı gıda ve tekstil Makarna, tekstil ürünleri
%20 Genel (varsayılan) Elektronik, mobilya, endüstriyel ekipman, yazılım, hizmetler

⚠️ Sisteminiz İçin Geçerli

İxtif (endüstriyel ekipman) için varsayılan %20 KDV uygun. Ancak:

  • B2B satışlarda fiyat gösterimi KDV hariç olmalı
  • B2C satışlarda fiyat gösterimi KDV dahil olmalı
  • Faturada her iki bilgi de ayrı ayrı yazılmalı

✅ Önerilen Çözüm

1. Migration Ekleme (Shop + Subscription)

Hem shop_products hem subscription_plans tablolarına şu alanları ekle:

$table->boolean('tax_included')->default(true);
// true = Fiyat KDV dahil, false = Fiyat KDV hariç

$table->enum('price_display_mode', ['with_tax', 'without_tax', 'both'])
->default('with_tax');
// with_tax = Sadece KDV dahil göster
// without_tax = Sadece KDV hariç göster
// both = Her iki fiyatı da göster (B2B için ideal)

2. CartService'i Güncelle

setPricing() metodunda doğru hesaplama yap:

if ($item->tax_included) {
// Fiyat KDV dahil → KDV'yi çıkar
$netPrice = $unitPrice / (1 + $taxRate / 100);
$taxAmount = $unitPrice - $netPrice;
} else {
// Fiyat KDV hariç → KDV'yi ekle
$netPrice = $unitPrice;
$taxAmount = $unitPrice * ($taxRate / 100);
}

$cartItem->unit_price = $netPrice; // Her zaman NET fiyat kaydet
$cartItem->tax_amount = $taxAmount;
$cartItem->final_price = $netPrice + $taxAmount;

3. Frontend Gösterim

Ürün kartlarında ve detay sayfalarında:

  • B2B kullanıcı: "999,00 TL + KDV" (KDV hariç göster)
  • B2C kullanıcı: "1.198,80 TL (KDV dahil)" (KDV dahil göster)
  • Both mode: "999,00 TL + KDV = 1.198,80 TL" (her ikisini göster)

4. Admin Panel

Ürün/Plan eklerken admin'e sor:

  • ☑️ Girdiğiniz fiyat KDV dahil mi?
  • ☑️ KDV oranı nedir? (%20, %10, %1, %0)
  • ☑️ Kullanıcıya nasıl gösterilsin? (KDV dahil / KDV hariç / İkisi de)

🎯 Sonuç

Mevcut Durum

  • Shop: KDV oranı var ama dahil/hariç ayrımı yok
  • Subscription: KDV altyapısı hiç yok
  • Cart: KDV hesaplama var ama mantık eksik
  • Payment: Sorun yok (Cart'tan aldığı veriyi kullanıyor)

Yapılması Gerekenler

  • 1️⃣ Migration: tax_included + price_display_mode ekle
  • 2️⃣ CartService: Doğru KDV hesaplama mantığı yaz
  • 3️⃣ Admin: Ürün eklerken KDV bilgisi sor
  • 4️⃣ Frontend: Kullanıcıya göre fiyat gösterimi ayarla

⚠️ Özellikle Subscription modülü acil düzenlenmeli, yasal zorunluluk!