38980-vm/app-9w9pd00g5j41/CAPPADOCIA_RULES_BEFORE_AFTER.md
2026-03-04 18:25:09 +00:00

326 lines
7.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Kapadokya Kuralları: Önce vs Sonra
## 📊 Davranış Karşılaştırması
### Senaryo 1: Restaurant/Cafe Ekleme
#### ❌ ÖNCE (Kurallar Pasif)
```
GÜN 1:
✅ Göreme Açık Hava Müzesi (museum)
✅ Seten Restaurant (restaurant)
✅ Cafe Safak (cafe) ← SORUN: Aynı günde hem restaurant hem cafe
✅ Uçhisar Kalesi (viewpoint)
```
#### ✅ SONRA (Kurallar Aktif)
```
GÜN 1:
✅ Göreme Açık Hava Müzesi (museum)
✅ Seten Restaurant (restaurant)
❌ Cafe Safak (cafe) ← REDDEDİLDİ: LIMITED kuralı (günde 1 tane)
✅ Uçhisar Kalesi (viewpoint)
```
**Sonuç:** Günde sadece 1 restaurant VEYA 1 cafe eklenir.
---
### Senaryo 2: Hotel Ekleme
#### ❌ ÖNCE (Kurallar Pasif)
```
GÜN 1:
✅ Sultan Cave Suites (hotel) ← SORUN: Hotel timeline'da görünüyor
✅ Göreme Açık Hava Müzesi (museum)
✅ Seten Restaurant (restaurant)
```
#### ✅ SONRA (Kurallar Aktif)
```
GÜN 1:
❌ Sultan Cave Suites (hotel) ← REDDEDİLDİ: EXCLUDED kuralı
✅ Göreme Açık Hava Müzesi (museum)
✅ Seten Restaurant (restaurant)
BAŞLANGIÇ NOKTASI:
📍 Sultan Cave Suites (hotel) ← Sadece başlangıç noktası olarak kullanılır
```
**Sonuç:** Oteller asla timeline'a eklenmez, sadece başlangıç noktası olarak kullanılır.
---
### Senaryo 3: Aynı Yer Tekrarı
#### ❌ ÖNCE (Kurallar Pasif)
```
GÜN 1:
✅ Göreme Açık Hava Müzesi (museum)
✅ Seten Restaurant (restaurant)
GÜN 2:
✅ Göreme Açık Hava Müzesi (museum) ← SORUN: Aynı müze tekrar eklendi
✅ Dibek Restaurant (restaurant)
```
#### ✅ SONRA (Kurallar Aktif)
```
GÜN 1:
✅ Göreme Açık Hava Müzesi (museum)
✅ Seten Restaurant (restaurant)
GÜN 2:
❌ Göreme Açık Hava Müzesi (museum) ← REDDEDİLDİ: Tekrarlama kuralı
✅ Zelve Açık Hava Müzesi (museum) ← Farklı müze eklendi
✅ Dibek Restaurant (restaurant)
```
**Sonuç:** Aynı yer farklı günlerde tekrar eklenemez.
---
### Senaryo 4: Flexible Yerler (Müze/Park)
#### ✅ ÖNCE (Kurallar Pasif)
```
GÜN 1:
✅ Göreme Açık Hava Müzesi (museum)
✅ Zelve Açık Hava Müzesi (museum)
✅ Paşabağ Vadisi (valley)
✅ Uçhisar Kalesi (viewpoint)
```
#### ✅ SONRA (Kurallar Aktif)
```
GÜN 1:
✅ Göreme Açık Hava Müzesi (museum)
✅ Zelve Açık Hava Müzesi (museum) ← FLEXIBLE: Aynı tipten birden fazla olabilir
✅ Paşabağ Vadisi (valley)
✅ Uçhisar Kalesi (viewpoint)
```
**Sonuç:** FLEXIBLE yerler için davranış değişmedi (zaten doğru çalışıyordu).
---
### Senaryo 5: Balon Ekleme
#### ✅ ÖNCE (Kurallar Pasif)
```
GÜN 1:
✅ Göreme Açık Hava Müzesi (museum)
✅ Seten Restaurant (restaurant)
GÜN 2:
✅ Balon Turu (hot_air_balloon) ← Zaten doğru çalışıyordu
✅ Zelve Açık Hava Müzesi (museum)
```
#### ✅ SONRA (Kurallar Aktif)
```
GÜN 1:
✅ Göreme Açık Hava Müzesi (museum)
✅ Seten Restaurant (restaurant)
GÜN 2:
✅ Balon Turu (hot_air_balloon) ← FIXED_TIME: Trip başına 1 kez
✅ Zelve Açık Hava Müzesi (museum)
```
**Sonuç:** Balon kuralı için davranış değişmedi (zaten doğru çalışıyordu).
---
## 🎯 Kural Kategorileri
### FLEXIBLE (Esnek)
```typescript
['museum', 'park', 'viewpoint', 'valley', 'historical_site', 'church', 'cave', 'underground_city']
```
**Davranış:**
- ✅ Günde birden fazla olabilir
- ✅ Aynı tipten birden fazla yer eklenebilir
- ✅ Maksimum yer sayısına kadar serbest
**Örnek:**
```
GÜN 1:
✅ Göreme Açık Hava Müzesi (museum)
✅ Zelve Açık Hava Müzesi (museum) ← 2. müze
✅ Derinkuyu Yeraltı Şehri (underground_city)
✅ Uçhisar Kalesi (viewpoint)
```
---
### LIMITED (Sınırlı)
```typescript
['restaurant', 'cafe']
```
**Davranış:**
- ✅ Günde sadece 1 tane
- ❌ Restaurant VEYA cafe (ikisi birden olamaz)
- ✅ Farklı günlerde farklı restaurant/cafe olabilir
**Örnek:**
```
GÜN 1:
✅ Seten Restaurant (restaurant)
❌ Cafe Safak (cafe) ← REDDEDİLDİ
GÜN 2:
✅ Dibek Restaurant (restaurant) ← Farklı gün, farklı restaurant
```
---
### EXCLUDED (Hariç)
```typescript
['hotel', 'accommodation', 'lodging']
```
**Davranış:**
- ❌ Asla timeline'a eklenmez
- ✅ Sadece başlangıç noktası olarak kullanılır
- ✅ Trip metadata'sında saklanır
**Örnek:**
```
TIMELINE:
❌ Sultan Cave Suites (hotel) ← Asla eklenmez
BAŞLANGIÇ NOKTASI:
📍 Sultan Cave Suites (hotel) ← Sadece burada kullanılır
```
---
### FIXED_TIME (Sabit Saatli)
```typescript
['hot_air_balloon', 'hot-air-balloon']
```
**Davranış:**
- ✅ Trip başına 1 kez
- ✅ Tercihen 2. günde (1 günlük seyahatte 1. gün)
- ✅ Sadece sunrise zaman bloğunda
- ❌ 2. balon eklenemez
**Örnek:**
```
GÜN 1:
✅ Göreme Açık Hava Müzesi (museum)
GÜN 2:
✅ Balon Turu (hot_air_balloon) ← Trip başına 1 kez
✅ Zelve Açık Hava Müzesi (museum)
GÜN 3:
❌ 2. Balon Turu ← REDDEDİLDİ
✅ Paşabağ Vadisi (valley)
```
---
## 📈 İstatistikler
### Önce (Kurallar Pasif)
- ❌ Günde 2-3 restaurant/cafe eklenebiliyordu
- ❌ Oteller timeline'a eklenebiliyordu
- ❌ Aynı yer farklı günlerde tekrar eklenebiliyordu
- ✅ Balon kuralı çalışıyordu
- ✅ Flexible yerler çalışıyordu
### Sonra (Kurallar Aktif)
- ✅ Günde sadece 1 restaurant/cafe
- ✅ Oteller timeline'a eklenmez
- ✅ Aynı yer tekrar eklenemez
- ✅ Balon kuralı çalışıyor
- ✅ Flexible yerler çalışıyor
---
## 🔍 Kod Karşılaştırması
### FLEXIBLE PLACES Bölümü
#### ❌ ÖNCE
```typescript
for (const place of scoredPlaces) {
if (dayPlaces.length >= MAX_PER_DAY) break;
if (usedPlaceIds.has(place.id)) continue;
if (isHotel(place)) continue;
if (isRestaurant(place)) continue; // ← Manuel kontrol
dayPlaces.push(place);
usedPlaceIds.add(place.id);
}
```
#### ✅ SONRA
```typescript
for (const place of scoredPlaces) {
if (dayPlaces.length >= MAX_PER_DAY) break;
if (usedPlaceIds.has(place.id)) continue;
if (isHotel(place)) continue;
// ✨ KURAL KONTROLÜ: Type-based validation
if (!isValidForDay(place, dayPlaces, usedPlaceIds, { balloonAdded })) {
continue; // ← Otomatik kural kontrolü
}
dayPlaces.push(place);
usedPlaceIds.add(place.id);
}
```
---
## 🎓 Öğrenilen Dersler
### 1. Type-Based Rules
- ✅ Her yer tipi için ayrı kurallar
- ✅ Kategori bazlı davranış
- ✅ Esnek ve genişletilebilir yapı
### 2. Validation Function
- ✅ Tek bir fonksiyon (`isValidForDay`)
- ✅ Tüm kuralları kontrol eder
- ✅ Kolay test edilebilir
### 3. Context Passing
-`balloonAdded` gibi trip-level state
-`dayPlaces` ile gün-level state
-`usedPlaceIds` ile trip-level tekrarlama kontrolü
---
## 🚀 Sonuç
### Aktive Edilen Kurallar
1.**LIMITED** - Restaurant/Cafe limiti
2.**EXCLUDED** - Hotel hariç tutma
3.**FLEXIBLE** - Müze/Park esnekliği (zaten çalışıyordu)
4.**FIXED_TIME** - Balon kuralı (zaten çalışıyordu)
5.**Tekrarlama** - Aynı yer tekrarı önleme (zaten çalışıyordu)
### Değişiklik Sayısı
- **Dosya:** 1 (`/src/db/api.ts`)
- **Satır:** 4 değişiklik
- **Import:** 3 yeni fonksiyon/sabit
- **Validation:** 2 yeni kontrol noktası
### Test Durumu
- ✅ TypeScript tip kontrolü geçti
- ✅ Lint hataları yok (sadece önceden var olanlar)
- ⏳ Kullanıcı testleri bekleniyor
---
**Tarih:** 2025
**Durum:** ✅ Tamamlandı
**Versiyon:** 1.0