24 KiB
24 KiB
🎨 Kapadokya Kuralları - Görsel Akış Diyagramı
📊 Kural Akış Şeması
┌─────────────────────────────────────────────────────────────┐
│ AUTO_SEED İTİNERARY OLUŞTURMA │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 1. TRIP + DAYS + PLACES VERİLERİNİ ÇEK │
│ - Trip bilgileri │
│ - Günler (trip_days) │
│ - Tüm yerler (places) │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 2. İLGİ ALANINA GÖRE PUANLA │
│ getPlacesByInterests(allPlaces, interests) │
│ → scoredPlaces (puanlanmış yerler) │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 3. CONTEXT HAZIRLA │
│ - usedPlaceIds = new Set<string>() │
│ - balloonAdded = false │
└─────────────────────────────────────────────────────────────┘
│
▼
┌───────────────────────────────────┐
│ HER GÜN İÇİN DÖNGÜ │
└───────────────────────────────────┘
│
┌───────────────────┴───────────────────┐
│ │
▼ ▼
┌──────────────────┐ ┌──────────────────┐
│ BALON KONTROLÜ │ │ FLEXIBLE PLACES │
│ │ │ │
│ shouldAddBalloon│ │ FOR LOOP │
│ ✅ Gün 2 │ │ ┌────────────┐ │
│ ✅ İlgi var │ │ │ MAX_PER_DAY│ │
│ ✅ Henüz yok │ │ │ kontrolü │ │
│ │ │ └────────────┘ │
│ → Balon ekle │ │ ┌────────────┐ │
│ → balloonAdded │ │ │ usedPlaceIds│ │
│ = true │ │ │ kontrolü │ │
└──────────────────┘ │ └────────────┘ │
│ ┌────────────┐ │
│ │ isHotel │ │
│ │ kontrolü │ │
│ └────────────┘ │
│ ┌────────────┐ │
│ │✨ YENİ! │ │
│ │isValidForDay│ │
│ │ kontrolü │ │
│ └────────────┘ │
│ → Yer ekle │
└──────────────────┘
│
▼
┌──────────────────┐
│ SMART RESTAURANT │
│ │
│ getCentroid() │
│ → Merkez bul │
│ │
│ findNearest() │
│ → En yakın │
│ restaurant │
│ │
│ → Ortaya ekle │
└──────────────────┘
│
▼
┌──────────────────┐
│ MIN FILL │
│ │
│ IF dayPlaces.len │
│ < MIN_PER_DAY │
│ │
│ FOR LOOP │
│ ┌────────────┐ │
│ │ MIN_PER_DAY│ │
│ │ kontrolü │ │
│ └────────────┘ │
│ ┌────────────┐ │
│ │ usedPlaceIds│ │
│ │ kontrolü │ │
│ └────────────┘ │
│ ┌────────────┐ │
│ │ isHotel │ │
│ │ kontrolü │ │
│ └────────────┘ │
│ ┌────────────┐ │
│ │✨ YENİ! │ │
│ │isValidForDay│ │
│ │ kontrolü │ │
│ └────────────┘ │
│ → Yer ekle │
└──────────────────┘
│
▼
┌──────────────────┐
│ INSERT PLACES │
│ │
│ trip_places │
│ tablosuna ekle │
└──────────────────┘
│
▼
┌──────────────────┐
│ TOUR ASSIGNMENT │
│ │
│ analyzeTripPlan │
│ matchDailyTour │
└──────────────────┘
│
▼
✅ TAMAMLANDI
🔍 isValidForDay() Detaylı Akış
┌─────────────────────────────────────────────────────────────┐
│ isValidForDay(place, dayPlaces, │
│ usedPlaceIds, { balloonAdded }) │
└─────────────────────────────────────────────────────────────┘
│
▼
┌───────────────────────┐
│ 1️⃣ TEKRARLAMA KONTROLÜ│
│ │
│ usedPlaceIds.has(id)? │
└───────────────────────┘
│ │
│ EVET │ HAYIR
▼ ▼
┌──────┐ ┌──────────────────┐
│ ❌ │ │ 2️⃣ KATEGORİ BELİRLE│
│REDDET│ │ │
└──────┘ │ getPlaceCategory │
│ (place.type) │
└──────────────────┘
│
┌───────────────┼───────────────┐
│ │ │
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ EXCLUDED │ │ FIXED_TIME│ │ LIMITED │
└──────────┘ └──────────┘ └──────────┘
│ │ │
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ ❌ REDDET│ │balloonAdded?│ │dayPlaces │
│ │ │ EVET HAYIR│ │has LIMITED?│
│ Hotel │ │ │ │ │ │ EVET HAYIR│
└──────────┘ │ ▼ ▼ │ │ │ │ │
│ ❌ ✅ │ │ ▼ ▼ │
│ REDDET İZİN│ │ ❌ ✅ │
└──────────┘ │ REDDET İZİN│
└──────────┘
│
▼
┌──────────┐
│ FLEXIBLE │
│ │
│ ✅ İZİN │
│ │
│ Museum │
│ Park │
│ Viewpoint│
└──────────┘
📊 Kategori Matrisi
┌─────────────┬──────────────┬──────────────┬──────────────┬──────────────┐
│ Kategori │ Günde Kaç │ Aynı Tip │ Tekrar │ Örnek │
├─────────────┼──────────────┼──────────────┼──────────────┼──────────────┤
│ FLEXIBLE │ Birden fazla│ ✅ │ ❌ │ museum, park │
├─────────────┼──────────────┼──────────────┼──────────────┼──────────────┤
│ LIMITED │ 1 │ ❌ │ ❌ │ restaurant │
├─────────────┼──────────────┼──────────────┼──────────────┼──────────────┤
│ EXCLUDED │ 0 │ ❌ │ ❌ │ hotel │
├─────────────┼──────────────┼──────────────┼──────────────┼──────────────┤
│ FIXED_TIME │ Trip'te 1 │ ❌ │ ❌ │ balloon │
└─────────────┴──────────────┴──────────────┴──────────────┴──────────────┘
🎯 Örnek Senaryo Akışı
2 Günlük Seyahat (Balloon + History + Nature)
┌─────────────────────────────────────────────────────────────┐
│ GÜN 1 │
└─────────────────────────────────────────────────────────────┘
1️⃣ BALON KONTROLÜ
shouldAddBalloon(0, 2, ['balloon', 'history'], false)
→ dayIndex !== 1 → ❌ HAYIR
2️⃣ FLEXIBLE PLACES
┌─────────────────────────────────────────────┐
│ Göreme Açık Hava Müzesi (museum) │
│ ✅ isValidForDay → FLEXIBLE → İZİN │
└─────────────────────────────────────────────┘
┌─────────────────────────────────────────────┐
│ Paşabağ Vadisi (valley) │
│ ✅ isValidForDay → FLEXIBLE → İZİN │
└─────────────────────────────────────────────┘
┌─────────────────────────────────────────────┐
│ Uçhisar Kalesi (viewpoint) │
│ ✅ isValidForDay → FLEXIBLE → İZİN │
└─────────────────────────────────────────────┘
3️⃣ SMART RESTAURANT
getCentroid([Göreme, Paşabağ, Uçhisar])
→ Merkez: (38.65, 34.85)
findNearest(restaurants, merkez, 1.5km)
→ Seten Restaurant (0.8km)
┌─────────────────────────────────────────────┐
│ Seten Restaurant (restaurant) │
│ ✅ isValidForDay → LIMITED → İZİN │
│ (günde henüz LIMITED yok) │
└─────────────────────────────────────────────┘
4️⃣ MIN FILL
dayPlaces.length = 4 >= MIN_PER_DAY (3)
→ Atla
✅ GÜN 1 SONUÇ:
1. Göreme Açık Hava Müzesi
2. Seten Restaurant
3. Paşabağ Vadisi
4. Uçhisar Kalesi
┌─────────────────────────────────────────────────────────────┐
│ GÜN 2 │
└─────────────────────────────────────────────────────────────┘
1️⃣ BALON KONTROLÜ
shouldAddBalloon(1, 2, ['balloon', 'history'], false)
→ dayIndex === 1 → ✅ EVET
┌─────────────────────────────────────────────┐
│ Balon Turu (hot_air_balloon) │
│ ✅ Eklendi │
│ → balloonAdded = true │
└─────────────────────────────────────────────┘
2️⃣ FLEXIBLE PLACES
┌─────────────────────────────────────────────┐
│ Göreme Açık Hava Müzesi (museum) │
│ ❌ isValidForDay → usedPlaceIds.has(id) │
│ → REDDET (tekrarlama) │
└─────────────────────────────────────────────┘
┌─────────────────────────────────────────────┐
│ Zelve Açık Hava Müzesi (museum) │
│ ✅ isValidForDay → FLEXIBLE → İZİN │
└─────────────────────────────────────────────┘
┌─────────────────────────────────────────────┐
│ Devrent Vadisi (valley) │
│ ✅ isValidForDay → FLEXIBLE → İZİN │
└─────────────────────────────────────────────┘
3️⃣ SMART RESTAURANT
getCentroid([Balon, Zelve, Devrent])
→ Merkez: (38.68, 34.88)
findNearest(restaurants, merkez, 1.5km)
→ Dibek Restaurant (1.2km)
┌─────────────────────────────────────────────┐
│ Dibek Restaurant (restaurant) │
│ ✅ isValidForDay → LIMITED → İZİN │
│ (günde henüz LIMITED yok) │
└─────────────────────────────────────────────┘
4️⃣ MIN FILL
dayPlaces.length = 4 >= MIN_PER_DAY (3)
→ Atla
✅ GÜN 2 SONUÇ:
1. Balon Turu
2. Zelve Açık Hava Müzesi
3. Dibek Restaurant
4. Devrent Vadisi
📈 Kural Etkinliği
┌─────────────────────────────────────────────────────────────┐
│ KURAL ETKİNLİĞİ │
└─────────────────────────────────────────────────────────────┘
ÖNCE (Kurallar Pasif):
┌─────────────────────────────────────────────────────────┐
│ GÜN 1: 5 yer │
│ - Göreme Müzesi │
│ - Seten Restaurant │
│ - Cafe Safak ← SORUN: 2 LIMITED aynı günde │
│ - Sultan Cave Suites ← SORUN: Hotel timeline'da │
│ - Uçhisar Kalesi │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ GÜN 2: 4 yer │
│ - Balon Turu │
│ - Göreme Müzesi ← SORUN: Tekrar │
│ - Dibek Restaurant │
│ - Paşabağ Vadisi │
└─────────────────────────────────────────────────────────┘
SONRA (Kurallar Aktif):
┌─────────────────────────────────────────────────────────┐
│ GÜN 1: 4 yer │
│ - Göreme Müzesi │
│ - Seten Restaurant │
│ - Paşabağ Vadisi │
│ - Uçhisar Kalesi │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ GÜN 2: 4 yer │
│ - Balon Turu │
│ - Zelve Müzesi ← Farklı müze │
│ - Dibek Restaurant │
│ - Devrent Vadisi │
└─────────────────────────────────────────────────────────┘
✅ İYİLEŞTİRMELER:
- ❌ Cafe Safak reddedildi (LIMITED kuralı)
- ❌ Sultan Cave Suites reddedildi (EXCLUDED kuralı)
- ❌ Göreme Müzesi tekrarı reddedildi (Tekrarlama kuralı)
- ✅ Her gün dengeli ve çeşitli yerler
Versiyon: 1.0
Tarih: 2025
Durum: ✅ Aktif