Proje: Okul Database · Hub: Okul Database — Tables

payments Tablosu

Taksit veya tek seferlik ödeme kayıtları. Transaction-level finansal veri.


Tam Kolon Listesi

KolonTipNullableDefaultAçıklama
idincrementsNOPK
customer_idunsignedIntNOcustomers.id (INDEX)
customer_agreement_idunsignedIntYESNULLcustomer_agreements.id (INDEX)
product_price_idunsignedIntYESNULLproduct_prices.id
inflation_rate_idunsignedIntYESNULLinflation_rates.id
recurring_monthintYESNULLTaksit sırası (1-based; NULL = tek seferlik)
amountdecimal(12,2)NOÖdeme tutarı (TL)
tax_ratedecimalYESNULLKDV oranı (% cinsinden)
payment_methodvarchar(50)YESNULLÖdeme yöntemi
statusvarchar(50)NODurum — enum değerleri aşağıda
transaction_idvarchar(255)YESNULLÖdeme sağlayıcı işlem ID
paid_attimestampYESNULLÖdeme tarihi (NULL = henüz ödenmedi)
due_datedateYESNULLVade tarihi
notestextYESNULLNotlar
created_attimestampNO
updated_attimestampNO
deleted_attimestampYESNULLSoft delete

status Enum Değerleri

DeğerTR Karşılığıpaid_atBaşarılı mı
pendingBeklemedeNULL
successBaşarılı≠ NULL
failedBaşarısızNULL
future_paymentGelecek ÖdemeNULL
future_payment_failedGelecek Ödeme BaşarısızNULL
payment_requestÖdeme TalebiNULL
cancelledİptal EdildiNULL
refundİade
in_progressİşlemdeNULL
in_progress_failedİşlemde BaşarısızNULL

Tahsilat analizi için filtre: status = 'success' AND paid_at IS NOT NULL


payment_transactions — Detay Log Tablosu

KolonTipAçıklama
payment_idFKpayments.id
transaction_idvarchar(255)Ödeme sağlayıcı ID
statusvarchar(50)Girişim durumu
amountdecimal(12,2)Denenen tutar
gateway_responsejsonHam API yanıtı (iyzico/banka)
created_attimestamp

Bir ödeme birden fazla girişim içerebilir (retry). Finansal analiz için payments kullan; debug için payment_transactions.


İlişkiler

customer_agreements (1) ──< payments (N) ──< payment_transactions (N)

Indexes

IndexTipKolonlar
PRIMARYPKid
FKINDEXcustomer_id
FKINDEXcustomer_agreement_id
payments_deleted_at_indexINDEXdeleted_at

Hazır Sorgu Kalıpları

-- Temel tahsilat filtresi
FROM payments
WHERE deleted_at IS NULL
  AND status = 'success'
  AND paid_at IS NOT NULL
 
-- Aylık gelir
SELECT DATE_FORMAT(paid_at, '%Y-%m') as ay,
       SUM(amount) as gelir,
       COUNT(*) as odeme_sayisi,
       COUNT(DISTINCT customer_agreement_id) as sozlesme_sayisi
FROM payments
WHERE deleted_at IS NULL AND status = 'success' AND paid_at IS NOT NULL
GROUP BY DATE_FORMAT(paid_at, '%Y-%m')
ORDER BY ay;
 
-- Başarısız ödeme oranı
SELECT status,
       COUNT(*) as sayi,
       ROUND(100.0 * COUNT(*) / SUM(COUNT(*)) OVER(), 2) as pct
FROM payments
WHERE deleted_at IS NULL
GROUP BY status;
 
-- Gecikmiş / vadesi geçmiş ödemeler
SELECT p.*, c.name as musteri, c.firm_name
FROM payments p
JOIN customers c ON c.id = p.customer_id
WHERE p.deleted_at IS NULL
  AND p.status IN ('pending', 'future_payment')
  AND p.due_date < CURDATE()
ORDER BY p.due_date ASC;
 
-- Müşteri bazlı toplam tahsilat ve borç
SELECT p.customer_id,
       SUM(CASE WHEN p.status = 'success' THEN p.amount ELSE 0 END) as tahsilat,
       SUM(CASE WHEN p.status IN ('pending','future_payment') THEN p.amount ELSE 0 END) as bekleyen,
       COUNT(CASE WHEN p.status IN ('failed','future_payment_failed') THEN 1 END) as basarisiz_girisim
FROM payments p
WHERE p.deleted_at IS NULL
GROUP BY p.customer_id;