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

24 KiB
Raw Permalink Blame History

🎨 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