# Fiyatlama — spec

*28.07.2026 · Sets'in tanımı · çatı §181, §183*

Bu belge fiyat listesi ve indirim kurallarının tek kaynağıdır. Çatı §181 ve §183 iki cümleyle geçiyordu; buradaki her satır Sets'in 28.07.2026 tarihli tanımından gelir ve **varsayımla doldurulmuş hiçbir satır yoktur** — açık kalan noktalar §6'da işaretlidir.

---

## 1. Ne satılıyor

**Günlük eğitim.** 8 saat bir güne denk gelir; satılan birim gündür. Yarım gün (4 saat), 1 gün (8), 1,5 gün (12), 2 gün (16), 2,5 gün (20) — bugünkü bantlar bunlar.

⚠ **Bantlar admin-tanımlıdır** (AD-08). Sets'in kendi ifadesi *"en uzun eğitim 20 saatti galiba"* idi; bir "galiba"yı koda gömmek, mevzuat ya da operasyon değişince kimsenin bulamayacağı bir sabit bırakır.

## 2. Fiyat matrisi

Fiyat **eğitim tanımının değil, sürenin** fonksiyonudur: aynı süredeki iki eğitim aynı fiyattır.

| | normal | sürekli müşteri | VIP | özel |
|---|---|---|---|---|
| yarım gün (4 sa) | … | … | … | … |
| 1 gün (8 sa) | … | … | … | … |
| 1,5 gün (12 sa) | … | … | … | … |

Satırlar saat bandı, sütunlar müşteri grubu. ⚠ **Düzen bir tercih değil, ekranın işi:** gruplar yan yana durunca indirim merdiveni tek bakışta görünür, ki fiyat listesinin varlık sebebi odur.

### 2.1 İki ayrı liste

**Günlük fiyat listesi** ve **kişi başı fiyat listesi** ayrı listelerdir; ikisi de aynı bant × grup yapısını kullanır *(Sets, 28.07.2026)*. Aynı hücrede iki tutar taşımak yerine iki liste tutulur — teklif kalemi hangisinden beslendiğini söyler.

### 2.2 Grup fiyatı: yüzde varsayılan + hücre ezmesi

Her grup normal fiyattan bir **yüzde** taşır (VIP = normal − %20) ve tek tek hücreler **elle ezilebilir** *(Sets, 28.07.2026)*.

⚠ **Ekran hangisinin hangisi olduğunu göstermek zorundadır.** Türetilmiş hücre soluk, ezilmiş hücre işaretli çizilir; aksi hâlde VIP'in neden tam −%20 olmadığı görünmez ve kimse listeye güvenmez.

### 2.3 KDV

Fiyatlar **KDV hariç** girilir; oran ayarlardan gelir ve teklifte hesaplanır *(Sets, 28.07.2026)*. Oran değişince liste elden geçmez.

## 3. Müşteri grupları

`normal · sürekli müşteri · VIP · özel müşteri` — **admin-tanımlı bir listedir**, kod sabiti değil. Müşteri bir gruba atanır; ataması olmayan müşteri **normal** gruptadır.

Bağ `customers.price_group_id`'dir ve **nullable**: null "fiyatı yok" değil, **varsayılan grup** demektir. Her müşteriye açılışta grup yazmak, 3E varsayılanı yeniden adlandırdığında bir veri taşıma işi doğururdu. Okuma tek yerden yapılır — `Customer::priceGroupOrDefault()`.

⚠ Grup silinirse müşteri **silinmez**, bağı boşalır (`nullOnDelete`). Politika zaten silmeyi reddediyor; foreign key bunu ekranın değil her yolun kuralı yapar.

⚠ **Atama ekranı henüz yok.** Müşteri kartı satış tarafının ekranıdır (`32 Satisci Musteri Karti`) ve o dikey yazılmadı; kolon ve ilişki hazır, kapanış adresi müşteri/teklif turudur.

## 4. Teklifte fiyat

Teklif ekranı **hem normal fiyatı hem müşterinin grubunun fiyatını** gösterir. Satışçı **kalem bazında** indirim yapar.

### 4.1 İndirim iki biçimde girilir

**Yüzde olarak ve tutar olarak** *(Sets, 28.07.2026)*. Gerekçe pratik: yuvarlak rakam tutturmak yüzdeyle zordur ve bu pazarda yuvarlak rakam bekleniyor. İkisi de aynı alana yazılır, hangisi girildiyse öbürü hesaplanır.

### 4.2 İndirim limiti iki yerde kontrol edilir

**Global azami indirim** ve **satışçı başına özel limit** tanımlanır; limit **hem kalemde hem teklif toplamında** kontrol edilir *(Sets, 28.07.2026)*. Hangisi aşılırsa teklif onaya gider.

⚠ İkisi birden olmasının sebebi: yalnız toplam kontrol edilirse bir kalemde uçuk indirim verip başka kalemden dengelemek mümkün olur; yalnız kalem kontrol edilirse her kalemi limitin dibinden geçirip toplamda limiti aşmak mümkün olur.

## 5. Fiyat tarihçesi

**İkisi birden** *(Sets, 28.07.2026)*:

1. Teklif kalemi fiyatı **dondurur** — kaleme kopyalanır. İmzalanmış bir teklifin sonradan değişmesi kabul edilemez (AD-11).
2. Liste **sürümlenir** ve kalem hangi sürümden geldiğini kaydeder. Denetimde *"o gün liste neydi"* sorusu ancak böyle cevaplanır.

### 5.1 Sürüm nasıl ilerler *(Sets, 06.08.2026)*

⛔ **Liste tektir, sürüm kazanır.** Tür başına (günlük / kişi başı) tek bir liste vardır; her satır o listenin numaralı bir **sürümüdür**. Fiyat değişecekse *"Yeni sürüm oluştur"* denir: mevcut sürümün bütün hücreleri — hangilerinin elle girildiği bilgisi dahil — **taslak** bir sürüme kopyalanır, düzeltilir, sonra *"Yayınla"* denir.

⛔ **Yayınlamak öncekini KAPATMAZ.** Eski sürüm satırlarıyla, tarihiyle, her şeyiyle durur; yalnızca *en yeni* olmaktan çıkar. Sebebi Sets'in kendi cümlesi: *"o anda aktif teklif vardır, aktif eğitim vardır, bekleyen fatura vardır — ilişkisel olarak devam etmek zorunda."*

⚠ Bunun için bir şey yapmak **gerekmez**: tutar teklif kalemine kopyalanır, kalem hangi sürümden geldiğini kaydeder, ve geçerli liste araması zaten *"yayımlanmış, başlamış olanların en yenisi"*dir. `effective_to` yazılmaz — otomatik kapatma fikri denendi ve **yanlış** bulundu.

⛔ **Bir sürüm, kendisinden TEKLİF KESİLDİĞİNDE kapanır** — yayımlandığında değil. Kuralın koruduğu şey delildir; hiçbir kalemin işaret etmediği sürümde delil yoktur. Tek yönlü kapıdır: ilk kalem yazıldığı an sonsuza kadar kapanır.

⚠ **Boş sürüm yayımlanamaz.** Yayımlansa güncel liste olur ve her teklif hiçbir tutar bulamaz.

⚠ Ekranda üç durum vardır: **Taslak · Yayında · Arşiv**. Üçü de satırlardan türetilir, saklanmaz.

## 6. Açık kalanlar

| # | Ne | Not |
|---|---|---|
| 1 | Para birimi | Bugün tek pazar, tek para birimi varsayılıyor. Çoklu para birimi istenirse liste sürümüne kolon gerekir — **sorulacak, varsayılmayacak**. |
| 2 | Dikey/müşteri-özel fiyat tablosu | Çatı §181 *"istenirse dikey/müşteri-özel fiyat tabloları"* diyor. Grup mekanizması müşteri-özeli zaten karşılıyor (her müşteriye kendi grubu açılabilir); **dikey** ayrımı için ihtiyaç doğduğunda konuşulacak. |
| 3 | Maliyet tarafı | Çatı §181: fiyat ve maliyet ayrı yapılar, kâr = fark. Maliyet (eğitmen, ulaşım, konaklama) bu spec'in kapsamı dışında. |
