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

7.9 KiB
Raw Permalink Blame History

Kapadokya Kuralları Aktivasyonu

📋 Özet

Kapadokya kuralları dosyasında (/src/config/cappadocia-rules.ts) tanımlı ancak kullanılmayan kurallar başarıyla aktive edildi. Artık otomatik seyahat planı oluşturma (AUTO_SEED) sırasında tüm yer tipi kuralları uygulanıyor.

Aktive Edilen Kurallar

1. LIMITED Yerler (Restaurant, Cafe)

// ✅ Günde sadece 1 restaurant VEYA 1 cafe
// ❌ Aynı günde hem restaurant hem cafe olamaz

Davranış:

  • Bir günde maksimum 1 LIMITED tip yer (restaurant veya cafe)
  • Eğer günde zaten bir restaurant varsa, cafe eklenemez
  • Eğer günde zaten bir cafe varsa, restaurant eklenemez

2. EXCLUDED Yerler (Hotel)

// ✅ Oteller timeline'a asla eklenmez
// ✅ Sadece başlangıç noktası olarak kullanılır

Davranış:

  • Hotel tipi yerler timeline'a hiçbir zaman eklenmez
  • Oteller sadece seyahatin başlangıç noktası olarak kullanılır
  • isValidForDay() fonksiyonu otelleri otomatik olarak reddeder

3. FLEXIBLE Yerler (Museum, Park, Viewpoint, Valley, vb.)

// ✅ Günde birden fazla olabilir
// ✅ Aynı tipten birden fazla yer eklenebilir

Davranış:

  • Bir günde birden fazla müze, park, viewpoint eklenebilir
  • Aynı tipten (örneğin 2 müze) yer eklenebilir
  • Esneklik sağlar, günlük maksimum yer sayısına kadar

4. FIXED_TIME Yerler (Balloon)

// ✅ Trip başına sadece 1 kez
// ✅ shouldAddBalloon() ile kontrol ediliyor (zaten çalışıyor)

Davranış:

  • Balon uçuşu trip başına sadece 1 kez eklenir
  • Tercihen 2. günde eklenir (1 günlük seyahatte 1. gün)
  • shouldAddBalloon() fonksiyonu ile kontrol edilir (zaten aktifti)

5. Tekrarlama Kuralı

// ✅ Aynı yer farklı günlerde tekrar eklenemez
// ✅ usedPlaceIds Set'i ile kontrol ediliyor

Davranış:

  • Bir yer bir kez kullanıldıktan sonra başka günlerde tekrar eklenemez
  • usedPlaceIds Set'i ile trip seviyesinde takip edilir
  • Örnek: Göreme Açık Hava Müzesi 1. günde eklendiyse, 2. günde eklenemez

🔧 Yapılan Değişiklikler

Dosya: /src/db/api.ts

1 Import Listesi Genişletildi (Satır 894-904)

ÖNCE:

const {
  shouldAddBalloon,
  getPlacesByInterests,
  getTypicalDuration,
  MAX_PLACES_PER_DAY,
  MIN_PLACES_PER_DAY,
  BALLOON_PLACE_TYPE,
} = await import('@/config/cappadocia-rules');

SONRA:

const {
  shouldAddBalloon,
  getPlacesByInterests,
  getTypicalDuration,
  MAX_PLACES_PER_DAY,
  MIN_PLACES_PER_DAY,
  BALLOON_PLACE_TYPE,
  isValidForDay,           // ← YENİ: Yer validasyonu
  getPlaceCategory,        // ← YENİ: Yer kategorisi
  PLACE_TYPE_CATEGORIES,   // ← YENİ: Kategori tanımları
} = await import('@/config/cappadocia-rules');

2 FLEXIBLE PLACES Kısmına Kural Kontrolü Eklendi (Satır 1027-1040)

ÖNCE:

/* ---- FLEXIBLE PLACES (museum, park, viewpoint...) -------------- */
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;

  dayPlaces.push(place);
  usedPlaceIds.add(place.id);
}

SONRA:

/* ---- FLEXIBLE PLACES (museum, park, viewpoint...) -------------- */
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 (LIMITED, EXCLUDED, FLEXIBLE)
  if (!isValidForDay(place, dayPlaces, usedPlaceIds, { balloonAdded })) {
    continue;
  }

  dayPlaces.push(place);
  usedPlaceIds.add(place.id);
}

3 MIN FILL Kısmına Kural Kontrolü Eklendi (Satır 1073-1088)

ÖNCE:

/* ---- MIN FILL -------------------------------------------------- */
if (dayPlaces.length < MIN_PER_DAY) {
  for (const p of scoredPlaces) {
    if (dayPlaces.length >= MIN_PER_DAY) break;
    if (usedPlaceIds.has(p.id)) continue;
    if (isHotel(p)) continue;

    dayPlaces.push(p);
    usedPlaceIds.add(p.id);
  }
}

SONRA:

/* ---- MIN FILL -------------------------------------------------- */
if (dayPlaces.length < MIN_PER_DAY) {
  for (const p of scoredPlaces) {
    if (dayPlaces.length >= MIN_PER_DAY) break;
    if (usedPlaceIds.has(p.id)) continue;
    if (isHotel(p)) continue;

    // ✨ KURAL KONTROLÜ: Type-based validation (LIMITED, EXCLUDED, FLEXIBLE)
    if (!isValidForDay(p, dayPlaces, usedPlaceIds, { balloonAdded })) {
      continue;
    }

    dayPlaces.push(p);
    usedPlaceIds.add(p.id);
  }
}

4 TypeScript Tipi Düzeltildi (Satır 950)

ÖNCE:

const usedPlaceIds = new Set();

SONRA:

const usedPlaceIds = new Set<string>();

🧪 Test Senaryoları

Senaryo 1: Restaurant Limiti

Beklenen: Günde sadece 1 restaurant/cafe
Test: 2 gün, balloon yok, 2 restaurant seçili
Sonuç: Her gün 1 restaurant eklenmeli

Senaryo 2: Balloon Kuralı

Beklenen: Sadece 1 balon, 2. günde
Test: 3 gün, balloon seçili
Sonuç: 2. gün balon eklenmeli, diğer günlerde olmamalı

Senaryo 3: Hotel Exclusion

Beklenen: Hiçbir otel timeline'da görünmemeli
Test: Otelli trip oluştur
Sonuç: Otel sadece başlangıç noktası olmalı

Senaryo 4: Aynı Yer Tekrarı

Beklenen: Aynı müze farklı günlerde tekrar eklenmemeli
Test: 2 gün, aynı müze 2 kez seçili
Sonuç: Müze sadece 1 gün eklenmeli

Senaryo 5: Flexible Yerler

Beklenen: Aynı günde birden fazla müze/park eklenebilmeli
Test: 3 gün, 5 müze seçili
Sonuç: Günlük maksimuma kadar müze eklenebilmeli

📊 Kural Kategorileri

FLEXIBLE (Esnek)

['museum', 'park', 'viewpoint', 'valley', 'historical_site', 'church', 'cave', 'underground_city']
  • Günde birden fazla olabilir
  • Aynı tipten birden fazla yer eklenebilir

LIMITED (Sınırlı)

['restaurant', 'cafe']
  • Günde sadece 1 tane
  • Restaurant VEYA cafe (ikisi birden olamaz)

EXCLUDED (Hariç)

['hotel', 'accommodation', 'lodging']
  • Asla timeline'a eklenmez
  • Sadece başlangıç noktası

FIXED_TIME (Sabit Saatli)

['hot_air_balloon', 'hot-air-balloon']
  • Trip başına 1 kez
  • Özel zaman kuralları (sunrise)

🎯 Etki

Önceki Durum

  • Aynı günde birden fazla restaurant eklenebiliyordu
  • Oteller timeline'a eklenebiliyordu
  • Yer tipi kategorileri kullanılmıyordu
  • Balon kuralı çalışıyordu
  • Tekrarlama önleme çalışıyordu

Yeni Durum

  • Günde sadece 1 restaurant/cafe
  • Oteller timeline'a eklenmez
  • Yer tipi kategorileri aktif
  • Balon kuralı çalışıyor (değişmedi)
  • Tekrarlama önleme çalışıyor (değişmedi)

🔍 İlgili Dosyalar

  1. Kural Tanımları: /src/config/cappadocia-rules.ts

    • Tüm kuralların tanımlandığı dosya
    • isValidForDay() fonksiyonu
    • getPlaceCategory() fonksiyonu
    • PLACE_TYPE_CATEGORIES sabiti
  2. Kural Uygulaması: /src/db/api.ts

    • generateAutoSeedItinerary() fonksiyonu
    • Satır 887-1150 arası
    • AUTO_SEED modu için otomatik plan oluşturma

📝 Notlar

  • Tüm değişiklikler geriye uyumludur
  • Mevcut seyahatler etkilenmez
  • Sadece yeni oluşturulan AUTO_SEED seyahatler yeni kuralları kullanır
  • TypeScript tip güvenliği sağlandı
  • Lint hataları yok (sadece önceden var olan hatalar mevcut)

🚀 Sonraki Adımlar

  1. Kurallar aktive edildi
  2. Kullanıcı testleri yapılmalı
  3. Farklı senaryolar denenmeliş
  4. Gerekirse kural parametreleri ayarlanmalı (örn: günlük maksimum yer sayısı)

Tarih: 2025
Durum: Tamamlandı
Etkilenen Dosyalar: 1 (/src/db/api.ts)
Değişiklik Sayısı: 4 (3 fonksiyonel + 1 tip düzeltmesi)