7.9 KiB
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
usedPlaceIdsSet'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
-
Kural Tanımları:
/src/config/cappadocia-rules.ts- Tüm kuralların tanımlandığı dosya
isValidForDay()fonksiyonugetPlaceCategory()fonksiyonuPLACE_TYPE_CATEGORIESsabiti
-
Kural Uygulaması:
/src/db/api.tsgenerateAutoSeedItinerary()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
- ✅ Kurallar aktive edildi
- ⏳ Kullanıcı testleri yapılmalı
- ⏳ Farklı senaryolar denenmeliş
- ⏳ 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)