💰 Fatura & Ödeme Sistemi

Veritabanı Tabloları Analizi

📅 Tarih: 2025-11-24 10:30 | 🎯 Modüller: Payment, Cart, Shop | 👤 Talep: Fatura/Billing tabloları taraması

📊 Özet İstatistikler

11
Toplam Tablo
3
Modül
2
Veritabanı Seviyesi
92+
Kolon

🏗️ Sistem Mimarisi

Ödeme Sistemi Mimarisi:

Sistem Multi-Tenant ve Polymorphic ilişkiler kullanır.

Her tenant kendi ödeme verilerini saklar. Ödeme tablosu, herhangi bir modelden (ShopOrder, Subscription, vb.) ödeme alabilir.

💳 Modül 1: Payment (Ödeme)

📍 Konum

/Modules/Payment/database/migrations/
/Modules/Payment/database/migrations/tenant/

1️⃣ payment_methods (Ödeme Yöntemleri)

Central + Tenant
Central: database/migrations/
Tenant: database/migrations/tenant/
Kolon Adı Tür Açıklama
payment_method_id id (big int) Birincil anahtar
title json {"tr":"Kredi Kartı","en":"Credit Card"}
slug string unique paytr-credit-card
description json nullable Ödeme yöntemi açıklaması
gateway enum paytr, stripe, iyzico, paypal, manual
gateway_mode enum test | live
gateway_config json nullable API keys, merchant IDs (JSON)
supports_purchase boolean Satış ödemeleri desteklenir
supports_subscription boolean Abonelik ödemeleri desteklenir
supports_donation boolean Bağış ödemeleri desteklenir
fixed_fee decimal(10,2) Sabit ücret
percentage_fee decimal(5,2) Yüzde ücret (%)
min_amount decimal(10,2) nullable Minimum ödeme tutarı
max_amount decimal(14,2) nullable Maksimum ödeme tutarı
supports_installment boolean Taksit desteği
max_installments integer Maksimum taksit sayısı
installment_options json nullable Taksit seçenekleri
supported_currencies json ["TRY","USD","EUR"]
icon string nullable İkon (FontAwesome)
logo_url string nullable Logo URL
sort_order integer Sıralama önceliği
is_active boolean Aktif/Pasif
requires_verification boolean Doğrulama gerekli mi
created_at, updated_at timestamp Zaman damgaları
deleted_at timestamp nullable Soft delete (silinme tarihi)
Önemli: Bu tablo PayTR, Stripe, İyzico, PayPal gibi tüm ödeme gateway'lerinin yönetilmesine izin verir. Her tenant kendi ödeme yöntemlerini özelleştirebilir.

2️⃣ payments (Ödeme İşlemleri)

Central + Tenant
Central: database/migrations/
Tenant: database/migrations/tenant/
Kolon Adı Tür Açıklama
payment_id id (big int) Birincil anahtar
payable_id unsigned big int Polymorphic: ShopOrder, Subscription, vb.
payable_type string Model sınıfı (Modules\Shop\App\Models\ShopOrder)
payment_method_id big int nullable FK → payment_methods
payment_number string unique PAY-2024-00001
payment_type enum purchase, subscription, donation, refund, deposit
amount decimal(12,2) Ödeme tutarı
currency string(3) TRY, USD, EUR
exchange_rate decimal(10,4) Döviz kuru
amount_in_base_currency decimal(12,2) Base para biriminde tutar (TRY)
status enum pending, processing, completed, failed, cancelled, refunded
gateway enum paytr, stripe, iyzico, paypal, manual
gateway_transaction_id string nullable Gateway merchant_oid
gateway_payment_id string nullable Gateway token/payment ID
gateway_response json nullable Tüm gateway response (audit trail)
card_brand string nullable Visa, Mastercard, Amex
card_last_four string(4) nullable Son 4 hanesi (masked)
card_holder_name string nullable Kart sahibi adı
installment_count integer Taksit sayısı
installment_fee decimal(8,2) Taksit ücreti
refund_for_payment_id big int nullable Self-referencing FK (geri ödeme için)
refund_reason text nullable İade sebebi
is_verified boolean Doğrulama durumu
verified_by_user_id big int nullable Doğrulayan admin kullanıcı
verified_at timestamp nullable Doğrulama tarihi
paid_at timestamp nullable Ödeme tarihi
failed_at timestamp nullable Başarısızlık tarihi
refunded_at timestamp nullable İade tarihi
notes text nullable Notlar
metadata json nullable Ek veriler
ip_address string(45) nullable Müşteri IP adresi
user_agent text nullable Tarayıcı bilgisi
created_at, updated_at timestamp Zaman damgaları
deleted_at timestamp nullable Soft delete
Polymorphic Tasarım: ShopOrder, Subscription, Reservation gibi herhangi bir model için ödeme kaydı tutulabilir. payable_type ve payable_id kombinasyonu hangi modelden ödeme aldığını belirler.

3️⃣ bank_accounts (Banka Hesapları)

Tenant Only
Tenant: database/migrations/tenant/
Kolon Adı Tür Açıklama
bank_account_id id (big int) Birincil anahtar
bank_name string(100) Ziraat Bankası, Garanti BBVA, vb.
branch_name string(100) nullable Şube adı
branch_code string(20) nullable Şube kodu
account_holder_name string(150) Hesap sahibi adı (firma adı)
account_number string(50) nullable Hesap numarası
iban string(34) IBAN (TR için 26 haneli, max 34)
swift_code string(11) nullable BIC/SWIFT kodu (uluslararası transferler)
currency enum TRY, USD, EUR, GBP, RUB
is_active boolean Aktif/Pasif
sort_order unsigned int Gösterim sırası
description text nullable Müşteriye gösterilecek açıklama
created_at, updated_at timestamp Zaman damgaları
deleted_at timestamp nullable Soft delete
Havale/EFT Ödemeleri İçin: Her tenant havale/EFT ile ödeme kabul edebilmek için kendi banka hesaplarını yönetir.

🛒 Modül 2: Cart (Sepet & Siparişler)

📍 Konum

Central: /Modules/Cart/database/migrations/
Tenant: /Modules/Cart/database/migrations/tenant/

4️⃣ cart_orders (Siparişler)

Central + Tenant
Central: 2025_11_24_000001_create_orders_table.php
Tenant: tenant/2025_11_24_000001_create_orders_table.php
Kolon Adı Tür Açıklama
order_id id (big int) Birincil anahtar
order_number string unique ORD-2024-00001
user_id big int nullable FK → users
order_type enum sale, subscription, service, digital
order_source enum web, admin, mobile, api
status enum pending, confirmed, processing, ready, shipped, delivered, completed, cancelled, refunded
subtotal decimal(14,2) Ara toplam (indirim hariç)
discount_amount decimal(12,2) İndirim tutarı
tax_amount decimal(12,2) Vergi tutarı
shipping_cost decimal(10,2) Kargo ücreti
total_amount decimal(14,2) Toplam tutar
currency string(3) TRY (varsayılan)
payment_status enum pending, partially_paid, paid, refunded, failed
paid_amount decimal(12,2) Ödenen tutar
requires_shipping boolean Kargo gerekli mi
tracking_number string nullable Kargo takip numarası
shipped_at timestamp nullable Kargoya verilme tarihi
delivered_at timestamp nullable Teslim tarihi
coupon_code string nullable Kullanılan kupon
coupon_discount decimal(12,2) Kupon indirimi
customer_name string nullable Müşteri adı (snapshot)
customer_email string Müşteri e-posta
customer_phone string nullable Müşteri telefon
customer_company string nullable Müşteri şirketi
customer_tax_office string nullable Vergi dairesi
customer_tax_number string nullable Vergi/TC Kimlik numarası
billing_address json nullable Fatura adresi (snapshot)
shipping_address json nullable Teslimat adresi (snapshot)
agreed_terms boolean Şartları kabul etti
agreed_privacy boolean Gizlilik politikasını kabul etti
agreed_marketing boolean Pazarlama e-postalarını kabul etti
customer_notes text nullable Müşteri notları
admin_notes text nullable Admin notları
metadata json nullable Ek veriler
ip_address string(45) nullable Müşteri IP adresi
user_agent text nullable Tarayıcı bilgisi
confirmed_at timestamp nullable Onaylanma tarihi
completed_at timestamp nullable Tamamlanma tarihi
cancelled_at timestamp nullable İptal tarihi
created_at, updated_at timestamp Zaman damgaları
deleted_at timestamp nullable Soft delete

5️⃣ cart_order_items (Sipariş Ürünleri)

Central + Tenant
Central: 2025_11_24_000002_create_order_items_table.php
Tenant: tenant/2025_11_24_000002_create_order_items_table.php
Kolon Adı Tür Açıklama
order_item_id id (big int) Birincil anahtar
order_id big int FK → cart_orders (cascade)
orderable_id unsigned big int Polymorphic: ShopProduct, vb.
orderable_type string Model sınıfı (Modules\Shop\App\Models\ShopProduct)
item_title string Ürün adı
item_sku string nullable Ürün SKU
item_image string nullable Ürün görseli URL
item_description text nullable Ürün açıklaması
quantity integer Adet
unit_price decimal(12,2) Birim fiyat (indirim öncesi)
discount_amount decimal(12,2) Birim başına indirim tutarı
tax_rate decimal(5,2) Vergi oranı (%)
tax_amount decimal(12,2) Vergi tutarı
subtotal decimal(12,2) Ara toplam (quantity × unit_price)
total decimal(12,2) Satır toplamı (subtotal + tax)
original_currency string(3) nullable Orijinal para birimi
original_price decimal(12,2) nullable Orijinal fiyat (döviz çevrilmeden)
conversion_rate decimal(10,4) Döviz çevrim oranı
status enum pending, confirmed, shipped, delivered, cancelled, refunded
is_digital boolean Dijital ürün mü
download_url string nullable İndirme URL'si (dijital ürünler)
download_count integer İndirme sayısı
download_expires_at timestamp nullable İndirme sona erme tarihi
options json nullable Varyant seçenekleri (renk, beden, vb.)
metadata json nullable Ek veriler
created_at, updated_at timestamp Zaman damgaları
deleted_at timestamp nullable Soft delete

6️⃣ cart_addresses (Müşteri Adresleri)

Central + Tenant
Central: 2025_11_24_000003_create_addresses_table.php
Tenant: tenant/2025_11_24_000003_create_addresses_table.php
Kolon Adı Tür Açıklama
address_id id (big int) Birincil anahtar
user_id big int FK → users (cascade)
address_type enum billing, shipping, both
title string nullable Adres başlığı (Ev, İş, vb.)
first_name string Ad
last_name string Soyad
company_name string nullable Şirket adı (B2B)
tax_office string nullable Vergi dairesi (B2B faturalar için)
tax_number string nullable Vergi numarası / TC Kimlik
phone string Telefon numarası
email string nullable E-posta adresi
address_line_1 text Adres (sokak, bina no)
address_line_2 text nullable Adres 2 (daire no, vb.)
neighborhood string nullable Mahalle
district string İlçe
city string Şehir/İl
postal_code string(10) nullable Posta kodu
country_code string(2) Ülke kodu (ISO 3166-1: TR, US, DE)
is_default_billing boolean Varsayılan fatura adresi
is_default_shipping boolean Varsayılan teslimat adresi
delivery_notes text nullable Teslimat notları (kapıcıya söyleyin, vb.)
metadata json nullable Ek veriler
created_at, updated_at timestamp Zaman damgaları
deleted_at timestamp nullable Soft delete
Açıklama: Kullanıcıların fatura ve teslimat adreslerini önceden kaydetmelerine ve siparişlerde seçmelerine izin verir.

🏪 Modül 3: Shop (E-Ticaret)

📍 Konum

Tenant: /Modules/Shop/database/migrations/tenant/

7️⃣ shop_orders (Siparişler)

Tenant Only
Tenant: 017_create_shop_orders_table.php
Açıklama: Shop modülü, Cart modülüne benzer şekilde kendi orders tablosuna sahiptir. Yapı neredeyse aynı olsa da, Shop modülü daha eski tasarımı kullanır. Yeni projeler Cart modülünü tercih etmelidir.

8️⃣ shop_order_items (Sipariş Ürünleri)

Tenant Only
Tenant: 018_create_shop_order_items_table.php
Açıklama: Shop modülü siparişlerin ürünlerini saklar. Polymorphic ilişki yerine doğrudan product_id kullanır.

9️⃣ shop_order_addresses (Sipariş Adresleri)

Tenant Only
Tenant: 019_create_shop_order_addresses_table.php
Açıklama: Sipariş anında fatura ve teslimat adreslerinin snapshot'ı saklanır. Değişim durumunda tarihsel verileri korur.

🔟 shop_customer_addresses (Müşteri Adresleri)

Tenant Only
Tenant: 013_create_shop_customer_addresses_table.php
Açıklama: Shop müşterilerinin kayıtlı adreslerini yönetir. Cart modülü User bazlı adresler kullanırken, Shop modülü Customer bazlı adresler kullanır (ödev Shop müşteri sistemi).

🔗 İlişkiler Diyagramı

Ödeme Akışı

cart_orders (order_id) ↓ (polymorphic: payable) payments (payable_id, payable_type) ↓ (payment_method_id) payment_methods (payment_method_id) Örnek: - payment.payable_type = "Modules\Cart\App\Models\Order" - payment.payable_id = 123 → Order #123'ün ödemesini temsil eder

Sipariş Mimarisi

cart_orders (order_id) ├─ cart_order_items (order_id) │ ├─ orderable_type = "Modules\Shop\App\Models\ShopProduct" │ └─ orderable_id = 789 │ └─ Müşteri Bilgileri (JSON) ├─ billing_address (JSON snapshot) └─ shipping_address (JSON snapshot) Alternativ (Shop): shop_orders (order_id) ├─ shop_order_items (order_id) │ └─ product_id (doğrudan FK) │ ├─ shop_order_addresses │ ├─ address_type = 'billing' │ └─ address_type = 'shipping' │ └─ shop_customer_addresses └─ customer_id (müşteri seçimi)

Adres Yönetimi

users (user_id) └─ cart_addresses (user_id) └─ address_type: billing | shipping | both Alternativ (Shop): shop_customers (customer_id) └─ shop_customer_addresses (customer_id) └─ address_type: billing | shipping | both shop_orders (order_id) └─ shop_order_addresses (order_id) └─ address_type: billing | shipping └─ snapshot (snapshot at order time)

📂 Veritabanı Konumları

Central Database (tuufi_db)

Tablolar:
  • payment_methods (global ödeme yöntemleri)
  • payments (global ödeme kaydı)
  • cart_orders (global siparişler)
  • cart_order_items (global sipariş ürünleri)
  • cart_addresses (global adresler)

Tenant Database (tenant_X_db)

Tablolar:
  • payment_methods (tenant-specific)
  • payments (tenant-specific)
  • bank_accounts (havale/EFT hesapları)
  • cart_orders (tenant siparişleri)
  • cart_order_items (tenant sipariş ürünleri)
  • cart_addresses (tenant adresler)
  • shop_orders (eski Shop siparişleri)
  • shop_order_items (eski Shop sipariş ürünleri)
  • shop_order_addresses (eski Shop adresler)
  • shop_customer_addresses (eski Shop müşteri adresleri)

💡 Önemli Bulgular

1. Polymorphic Tasarım

Payments tablosu polymorphic morph kullanarak herhangi bir modelden (ShopOrder, Subscription, vb.) ödeme alabilir. Bu, ödeme sistemini genel ve esnek kılmaktadır.

2. Snapshot Mimarisi

Siparişin tarihsel verilerini korumak için JSON snapshot'lar kullanılır (billing_address, shipping_address, ürün snapshot'ları). Bu, sipariş alındıktan sonra ürün/fiyat değişirse bile orijinal verileri saklar.

3. Dual Modüller

Hem Shop hem de Cart modüllerinde benzer order/address tabloları vardır. Eski projeler Shop kullanırken, yeni projeler Cart modülünü tercih etmelidir. Uzun vadede Cart modülü standart olacaktır.

4. Multi-Tenant Yapı

Payment tabloları Central ve Tenant olmak üzere iki yerde tanımlanır. Her tenant kendi payment_methods ve payments verilerine sahiptir. Bank_accounts ve diğer tenant-specific veriler sadece Tenant database'inde bulunur.

5. Havale/EFT Sistemi

bank_accounts tablosu ile her tenant havale/EFT ödeme kabul edebilir. Müşteriler siparişlerinde banka hesapları seçerek manuel ödeme yapar (admin onayı sonrasında).

6. İndirim & Vergi Yönetimi

Her sipariş ve ürün satırında discount_amount, tax_amount, tax_rate tutulur. Bu, karmaşık vergi ve indirim hesaplamalarını destekler.

7. Soft Delete Kullanımı

Tüm ana tablolar soft delete (deleted_at) destekler. Veriler fiziksel olarak silinmez, sadece işaretlenir. Denetim ve veri kurtarma için yararlıdır.

8. Refund (İade) Sistemi

payments tablosundaki refund_for_payment_id kullanarak self-referencing ilişki ile geri ödeme zincirleri oluşturulabilir. Aynı sipariş için kısmi iadeler de mümkündür.

📋 Faydalı Sorgular

1. Beklemede Olan Ödemeler

SELECT * FROM payments WHERE status = 'pending' AND created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY) ORDER BY created_at DESC;

2. Tamamlanmayan Siparişler

SELECT co.*, COUNT(coi.order_item_id) as item_count, SUM(coi.total) as items_total FROM cart_orders co LEFT JOIN cart_order_items coi ON co.order_id = coi.order_id WHERE co.status IN ('pending', 'processing') AND co.payment_status != 'paid' GROUP BY co.order_id ORDER BY co.created_at DESC;

3. Müşteri Ödeme Geçmişi

SELECT p.*, pm.title, co.order_number, co.total_amount FROM payments p LEFT JOIN payment_methods pm ON p.payment_method_id = pm.payment_method_id LEFT JOIN cart_orders co ON p.payable_type = 'Modules\Cart\App\Models\Order' AND p.payable_id = co.order_id WHERE p.payable_type = 'Modules\Cart\App\Models\Order' AND co.user_id = ? ORDER BY p.created_at DESC;

4. Havale Bekleme Siparişleri

SELECT co.* FROM cart_orders co WHERE co.payment_status = 'pending' AND JSON_EXTRACT(co.billing_address, '$.payment_method') = 'bank_transfer' ORDER BY co.created_at DESC;

📁 Migration Dosyaları Özet

Payment Module (Central):
  • /Modules/Payment/database/migrations/2025_11_09_001_create_payment_methods_table.php
  • /Modules/Payment/database/migrations/2025_11_09_002_create_payments_table.php
  • /Modules/Payment/database/migrations/2025_11_12_010000_create_payment_gateway_settings.php (Settings)
Payment Module (Tenant):
  • /Modules/Payment/database/migrations/tenant/2025_11_09_001_create_payment_methods_table.php
  • /Modules/Payment/database/migrations/tenant/2025_11_09_002_create_payments_table.php
  • /Modules/Payment/database/migrations/tenant/2025_11_12_020000_create_bank_accounts_table.php
Cart Module (Central):
  • /Modules/Cart/database/migrations/2025_11_24_000001_create_orders_table.php
  • /Modules/Cart/database/migrations/2025_11_24_000002_create_order_items_table.php
  • /Modules/Cart/database/migrations/2025_11_24_000003_create_addresses_table.php
Cart Module (Tenant):
  • /Modules/Cart/database/migrations/tenant/2025_11_24_000001_create_orders_table.php
  • /Modules/Cart/database/migrations/tenant/2025_11_24_000002_create_order_items_table.php
  • /Modules/Cart/database/migrations/tenant/2025_11_24_000003_create_addresses_table.php
Shop Module (Tenant Only):
  • /Modules/Shop/database/migrations/tenant/017_create_shop_orders_table.php
  • /Modules/Shop/database/migrations/tenant/018_create_shop_order_items_table.php
  • /Modules/Shop/database/migrations/tenant/019_create_shop_order_addresses_table.php
  • /Modules/Shop/database/migrations/tenant/013_create_shop_customer_addresses_table.php