Proje: Okul Database · Hub: Okul Database — Tables
customer_agreements Tablosu
Her B2B sözleşme kaydı. Gelir analizinin temel kaynağı.
Tam Kolon Listesi
| Kolon | Tip | Nullable | Default | Açıklama |
|---|---|---|---|---|
id | increments | NO | — | PK |
recurred_agreement_id | unsignedInt | YES | NULL | Yenileme kaynağı sözleşme → customer_agreements.id |
customer_id | int | NO | — | → customers.id |
rci | varchar(255) | YES | NULL | RCI kodu |
admin_user_id | int | YES | NULL | Sözleşmeyi oluşturan admin |
sales_campaign_id | unsignedInt | YES | NULL | → sales_campaigns.id |
campaign | varchar(20) | YES | NULL | Kampanya kodu |
agreement_type | enum | NO | — | Enum değerleri aşağıda |
agreement_code | varchar(255) | YES | NULL | Sözleşme numarası |
agreement_image_id | int | YES | NULL | İmzalı belge medya ID |
first_payment_amount | double | YES | NULL | İlk ödeme tutarı |
payment_amount | double | YES | NULL | Taksit tutarı |
payment_amount_backup | double | YES | NULL | Yedek taksit tutarı |
price | double | NO | — | Toplam sözleşme bedeli |
is_recurring | tinyInt | NO | 0 | 1=Yinelenen, 0=Tek seferlik |
is_winback | boolean | NO | false | 1=Winback sözleşmesi |
payment_day | smallInt | YES | NULL | Aylık ödeme günü |
employee_id | int | YES | NULL | Yetkili çalışan ID |
employee_position | varchar(255) | YES | NULL | Yetkili pozisyonu |
employee_name | varchar(255) | YES | NULL | Yetkili adı |
email | varchar(255) | YES | NULL | Sözleşme e-posta |
phone | varchar(255) | YES | NULL | Sözleşme telefonu |
notes | text | YES | NULL | Notlar |
status | varchar(255) | YES | NULL | Sözleşme durumu |
financial_status | varchar(100) | YES | NULL | Finansal durum |
reject_reason | text | YES | NULL | Ret nedeni (metin) |
reject_reason_id | varchar(255) | YES | NULL | Ret nedeni ID |
rejected_at | date | YES | NULL | Ret tarihi |
agreement_date | date | NO | — | Sözleşme imza tarihi |
rnd_project | varchar(255) | YES | NULL | AR-GE proje kodu |
product_arge | json | NO | — | AR-GE ürün listesi (JSON) |
products | json | NO | — | Ürün listesi (JSON) |
missing_inputs | json | NO | — | Eksik bilgiler (JSON) |
participation_fee | varchar(255) | YES | '0' | Katılım ücreti |
monthly_listing_price | varchar(255) | YES | '0' | Aylık listeleme ücreti |
agreement_renew_date | date | YES | NULL | Yenileme tarihi |
created_at | timestamp | NO | — | |
updated_at | timestamp | NO | — | |
deleted_at | timestamp | YES | NULL | Soft delete |
agreement_type Enum Değerleri
| Değer | Açıklama |
|---|---|
fixed | Sabit fiyatlı sözleşme |
regular | Standart sözleşme |
zero_tax_arge | Sıfır KDV, AR-GE projesi |
subscription | Abonelik modeli |
subscription_arge | Abonelik + AR-GE |
status Değerleri
| Değer | Açıklama |
|---|---|
active | Aktif sözleşme |
inactive | Pasif sözleşme |
pending | Onay bekliyor |
rejected | Reddedildi |
cancelled | İptal edildi |
JSON Kolonları
products Yapısı (örnek)
[
{
"id": 1,
"name": "Premium Listeleme",
"quantity": 1,
"price": 5000
}
]product_arge Yapısı
AR-GE projesi kapsamındaki ürün detayları.
missing_inputs Yapısı
Eksik sözleşme alanlarının listesi — onboarding takibi için.
JSON parse sorguları (MySQL 5.7+):
-- İlk ürün adını çek
SELECT id, JSON_UNQUOTE(JSON_EXTRACT(products, '$[0].name')) as ilk_urun
FROM customer_agreements WHERE deleted_at IS NULL;
-- JSON içinde ürün adı ara
SELECT id FROM customer_agreements
WHERE JSON_SEARCH(products, 'one', 'Premium%') IS NOT NULL;Önemli İş Kuralları
recurred_agreement_id NOT NULL→ Bu sözleşme bir yenileme. Kaynak sözleşmeye bakılabilir.is_winback = true→ Daha önce kaybedilmiş müşteri geri kazanıldı.is_recurring = 1→ Taksitli ödeme yapısı var.payment_day→ Aylık ödeme günü (1-31 arası gün numarası).agreement_date→ İmza tarihi;agreement_renew_date→ yenileme vadesi.
İlişkiler
customer_agreements
→ customer_id : customers
←→ payments (1:N) — taksit ödemeleri
←→ customer_agreements_renew_logs (1:N)
←→ customer_agreements_renew_discounts (1:N)
←→ customer_user_agreement_signs (1:N)
Örnek Sorgular
-- Aktif sözleşme müşterileri ve toplam gelir
SELECT ca.customer_id, c.firm_name,
COUNT(ca.id) as sozlesme_sayisi,
SUM(ca.price) as toplam_bedel,
MIN(ca.agreement_date) as ilk_sozlesme,
MAX(ca.agreement_date) as son_sozlesme
FROM customer_agreements ca
JOIN customers c ON c.id = ca.customer_id
WHERE ca.deleted_at IS NULL AND ca.status = 'active'
GROUP BY ca.customer_id, c.firm_name
ORDER BY toplam_bedel DESC;
-- Yenileme analizi
SELECT COUNT(*) as yenileme_sayisi,
AVG(ca.price) as ort_bedel,
SUM(CASE WHEN ca.is_winback THEN 1 ELSE 0 END) as winback_sayisi
FROM customer_agreements ca
WHERE ca.recurred_agreement_id IS NOT NULL
AND ca.deleted_at IS NULL;Related
- table-payments — Sözleşmeye bağlı ödemeler
- table-customers — Müşteri detayı
- domain-payments — Payments domain