Ö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.
| 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) |
| 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 |
| 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 |
| 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 |
| 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 |
| 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ı |
| 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 |
Payments tablosu polymorphic morph kullanarak herhangi bir modelden (ShopOrder, Subscription, vb.) ödeme alabilir. Bu, ödeme sistemini genel ve esnek kılmaktadır.
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.
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.
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.
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).
Her sipariş ve ürün satırında discount_amount, tax_amount, tax_rate tutulur. Bu, karmaşık vergi ve indirim hesaplamalarını destekler.
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.
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.