KRİTİK HATA 11 Ocak 2025

ÇİFT KDV HESAPLAMA HATASI

Subscription & Cart Modülü - Fiyatlandırma Sistemi Analizi

⚠️ SORUN ÖZETİ

Subscription planlarında YANLIŞ KDV HESAPLAMA yapılıyor!

Plan Sayfasında Gösterilen:
600 TL + KDV
Beklenen: 600 + 120 = 720 TL
Checkout Sayfasında Hesaplanan:
Ara Toplam: 500 TL
KDV (%20): 100 TL
Toplam: 600 TL

Sorun: Bridge servis fiyatı "KDV dahil" sanıyor ve ayrıştırıyor (600 ÷ 1.20 = 500 TL). Sonra Cart tekrar KDV ekliyor (500 × 1.20 = 600 TL). Ama kullanıcıya "600 TL + KDV" gösteriliyor!

📝 Basit Anlatım (Herkes İçin)

Sorun Ne?
Müşteri premium üyelik satın almak istiyor. Plan sayfasında "600 TL + KDV" yazıyor. Müşteri hesap yapıyor: "600 + %20 KDV = 720 TL ödeyeceğim" diye düşünüyor.

Ama sepete eklediğinde checkout sayfasında şöyle görüyor:

Ara Toplam: 500 TL
KDV (%20): 100 TL
Toplam: 600 TL

Müşteri Kafası Karışıyor: "Plan sayfasında 600 TL + KDV diyordu, neden toplam 600 TL oldu? KDV nerede?"

Gerçekte Ne Oluyor?
Sistem arkada şöyle çalışıyor:

  1. Database'de plan fiyatı: 600 TL (yönetici tarafından girilmiş)
  2. Bridge servisi bunu "KDV dahil" sanıyor ve böyle hesaplıyor: 600 ÷ 1.20 = 500 TL (KDV hariç)
  3. Cart modülü 500 TL'ye %20 KDV ekliyor: 500 + 100 = 600 TL
  4. Müşteriye gösterilen: "600 TL + KDV" (ama gerçekte zaten KDV dahil!)

Sonuç: Müşteri 720 TL bekliyor, 600 TL görüyor. Bu kafayı karıştırıyor ve güven kaybına yol açıyor. Ayrıca fiyat gösterimi yanıltıcı! Eğer fiyat zaten KDV dahil ise "600 TL (KDV dahil)" yazmalı.

Nasıl Olmalı?
İki seçenek var:

Seçenek 1 (Önerilen)

Database'e 600 TL girilir (KDV hariç).
Plan sayfasında "600 TL + KDV" gösterilir.
Checkout'ta: Ara Toplam 600 TL, KDV 120 TL, Toplam 720 TL.

Seçenek 2

Database'e 600 TL girilir (KDV dahil).
Plan sayfasında "600 TL (KDV dahil)" veya "500 TL + KDV" gösterilir.
Checkout'ta: Ara Toplam 500 TL, KDV 100 TL, Toplam 600 TL.

🔧 Teknik Detaylar (Geliştiriciler İçin)

Mevcut Durum (HATA)

1

Database - Subscription Plan

Admin panelde cycle price girilir:

billing_cycles: { "monthly": { "price": 600, // ← Bu KDV dahil mi, hariç mi? BELİRSİZ! "label": {"tr": "Aylık"} } }
2

Frontend - subscription-plans.blade.php

Plan sayfasında gösterilen:

{{ number_format($price, 2) }} TL + KDV // ← "600 TL + KDV" gösteriliyor

Müşteri 720 TL ödeyeceğini düşünüyor!

3

Bridge - SubscriptionCartBridge.php (Satır 100-115)

Cart'a eklerken:

// Cycle'dan fiyat al (KDV dahil!) ← ❌ YANLIŞ VARSAYIM! $priceWithTax = $cycle['price'] ?? 0; // 600 TL $taxRate = $plan->tax_rate ?? 20; // Subscription fiyatları KDV DAHİL gelir! // KDV'yi ayrıştır $priceWithoutTax = $priceWithTax / (1 + ($taxRate / 100)); // $priceWithoutTax = 600 / 1.20 = 500 TL return [ 'unit_price' => $priceWithoutTax, // ← 500 TL 'tax_rate' => $taxRate, // ← 20% ];

Bridge fiyatı "KDV dahil" sanıp ayrıştırıyor!

4

Cart - CartItem.php (Satır 170-180)

Sepet hesaplaması:

public function recalculate(): void { // unit_price = 500 TL (Bridge'den gelen) $this->subtotal = $this->final_price * $this->quantity; // subtotal = 500 * 1 = 500 TL $this->tax_amount = $this->subtotal * ($this->tax_rate / 100); // tax_amount = 500 * 0.20 = 100 TL $this->total = $this->subtotal + $this->tax_amount; // total = 500 + 100 = 600 TL }

Cart 500 TL'ye tekrar %20 KDV ekliyor!

5

Checkout - CheckoutPage.php (Satır 299-301)

Müşteriye gösterilen:

$this->subtotal = $this->items->sum('subtotal'); // 500 TL $this->taxAmount = $this->items->sum('tax_amount'); // 100 TL $this->total = $this->subtotal + $this->taxAmount; // 600 TL
Ara Toplam: 500 TL
KDV (%20): 100 TL
Toplam: 600 TL

Müşteri 720 TL bekliyordu, 600 TL gördü!

İlgili Dosyalar

Modules/Subscription/App/Services/SubscriptionCartBridge.php (Satır 98-134)
Modules/Cart/App/Services/CartService.php (Satır 153-233)
Modules/Cart/App/Models/CartItem.php (Satır 170-182)
Modules/Subscription/resources/views/livewire/front/subscription-plans.blade.php (Satır 383-390)
Modules/Cart/App/Http/Livewire/Front/CheckoutPage.php (Satır 299-301)

📊 Shop Modülü Karşılaştırması (Referans)

Shop modülü DOĞRU çalışıyor. Aynı pattern'i Subscription'a da uygulamalıyız:

ShopProduct Model (Satır 1357-1366)

public function getPriceWithTaxAttribute(): float { if (!$this->base_price) { return 0.0; } $taxRate = $this->tax_rate ?? 20.0; // ✅ DOĞRU: base_price (KDV hariç) üzerine KDV ekliyor return (float) ($this->base_price * (1 + $taxRate / 100)); }

Database

base_price: 1000 TL (KDV HARİÇ)

Runtime Hesaplama

price_with_tax: 1000 × 1.20 = 1200 TL

CartService ShopProduct için price_with_tax accessor'ını kullanıyor (Satır 247). Ama sonra Cart tekrar KDV eklemiyor! Çünkü ShopProduct için KDV zaten dahil fiyat Cart'a gönderiliyor.

✅ Çözüm Önerileri

1

Cycle Price = KDV HARİÇ (Önerilen) ÖNERİLEN

Database'de cycle price'lar KDV hariç girilir. Bridge ayrıştırma yapmaz.

Değişiklikler:

SubscriptionCartBridge.php (Satır 98-134)
// ❌ ESKİ KOD (Kaldır) $priceWithTax = $cycle['price'] ?? 0; $priceWithoutTax = $priceWithTax / (1 + ($taxRate / 100)); return [ 'unit_price' => $priceWithoutTax, // KDV'yi ayrıştırıyor 'tax_rate' => $taxRate, ]; // ✅ YENİ KOD $priceWithoutTax = $cycle['price'] ?? 0; // Direkt KDV hariç fiyat return [ 'unit_price' => $priceWithoutTax, // Ayrıştırma YOK! 'tax_rate' => $taxRate, ];
subscription-plans.blade.php (Satır 383-390)
{{-- Değişiklik YOK - zaten doğru gösteriyor --}} {{ number_format($price, 2) }} TL + KDV {{-- Eğer daha açık olmasını istersen: --}} {{ number_format($price, 2) }} TL (KDV hariç)
KDV dahil: {{ number_format($price * 1.20, 2) }} TL
Database - Admin Panel
// Admin panelde plan oluştururken: billing_cycles: { "monthly": { "price": 600, // ← KDV HARİÇ fiyat (600 + 120 = 720 TL toplam) "label": {"tr": "Aylık"} } }

Sonuç:

Database
600 TL (KDV hariç)
Plan Sayfası
600 TL + KDV
Checkout
600 + 120 = 720 TL
2

Cycle Price = KDV DAHİL (Alternatif)

Database'de cycle price'lar KDV dahil girilir. Bridge ayrıştırma yapar. Frontend gösterimini düzelt.

Değişiklikler:

SubscriptionCartBridge.php
// ✅ Mevcut kod KORU (Bridge ayrıştırma yapıyor, bu doğru) $priceWithTax = $cycle['price'] ?? 0; // 600 TL (KDV dahil) $priceWithoutTax = $priceWithTax / (1 + ($taxRate / 100)); // 500 TL return [ 'unit_price' => $priceWithoutTax, // 500 TL (KDV hariç) 'tax_rate' => $taxRate, // %20 ];
subscription-plans.blade.php (Satır 380-420)
{{-- SEÇENEK A: KDV hariç + KDV göster --}} @php $priceWithoutTax = $price / 1.20; // KDV'yi ayrıştır $taxAmount = $price - $priceWithoutTax; @endphp
{{ number_format($priceWithoutTax, 2) }} TL

+ KDV ({{ number_format($taxAmount, 2) }} TL) = {{ number_format($price, 2) }} TL toplam

{{-- VEYA SEÇENEK B: KDV dahil göster --}}
{{ number_format($price, 2) }} TL

(KDV dahil)

Database - Admin Panel
// Admin panelde plan oluştururken: billing_cycles: { "monthly": { "price": 600, // ← KDV DAHİL fiyat (500 + 100 = 600 TL toplam) "label": {"tr": "Aylık"} } }

Sonuç:

Database
600 TL (KDV dahil)
Plan Sayfası
500 TL + KDV
(veya "600 TL KDV dahil")
Checkout
500 + 100 = 600 TL

💡 Öncelik ve Öneri

Seçenek 1 (KDV Hariç) ÖNERİLİR çünkü:

  • Türkiye'de yaygın kullanım şekli: Fiyatlar KDV hariç gösterilir ("+ KDV" ile)
  • Shop modülü de aynı pattern'i kullanıyor (base_price KDV hariç)
  • Admin panelde fiyat girilirken daha net: "Bu KDV hariç fiyattır"
  • Yasal raporlamada fiyat ayrıştırması daha kolay

Ancak eğer sistem zaten KDV dahil fiyat kabul edecek şekilde tasarlanmışsa (admin panel form, dökümanlar vb.), o zaman Seçenek 2'yi uygula ve sadece frontend gösterimini düzelt!

🔍 Ek Kontrol Noktaları

Admin Panel: Subscription plan oluştururken "cycle price" için açıklama ekle (KDV dahil mi, hariç mi belirt)

Settings Modülü: price_display_mode field'i var mı kontrol et (KDV dahil/hariç tercihi için)

Mevcut Planlar: Database'deki mevcut subscription planlarının fiyatlarını kontrol et ve gerekirse güncelle

Test: Her iki seçenek için de checkout sürecini test et (sepete ekle → checkout → toplam kontrol)

Döküman: Admin dökümanlarını güncelle (plan fiyatı nasıl girilmeli?)

📋 Özet

Sorun

  • Bridge fiyatı "KDV dahil" sanıp ayrıştırıyor
  • Cart tekrar KDV ekliyor (çift hesaplama)
  • Frontend "X TL + KDV" gösteriyor ama checkout'ta farklı
  • Müşteri kafası karışıyor, güven kaybı oluşuyor

Çözüm

  • Seçenek 1: Cycle price KDV hariç, Bridge ayrıştırma yapmasın
  • Seçenek 2: Cycle price KDV dahil, Frontend gösterimini düzelt
  • Admin panel döküman güncelle
  • Mevcut planları kontrol et ve düzelt

Claude AI Code Analizi - 11 Ocak 2025

Subscription & Cart Modül Entegrasyonu - KDV Hesaplama Sistemi