287 lines
7.9 KiB
Markdown
287 lines
7.9 KiB
Markdown
# 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)
|
||
```typescript
|
||
// ✅ 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)
|
||
```typescript
|
||
// ✅ 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.)
|
||
```typescript
|
||
// ✅ 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)
|
||
```typescript
|
||
// ✅ 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ı**
|
||
```typescript
|
||
// ✅ 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:**
|
||
```typescript
|
||
const {
|
||
shouldAddBalloon,
|
||
getPlacesByInterests,
|
||
getTypicalDuration,
|
||
MAX_PLACES_PER_DAY,
|
||
MIN_PLACES_PER_DAY,
|
||
BALLOON_PLACE_TYPE,
|
||
} = await import('@/config/cappadocia-rules');
|
||
```
|
||
|
||
**SONRA:**
|
||
```typescript
|
||
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:**
|
||
```typescript
|
||
/* ---- 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:**
|
||
```typescript
|
||
/* ---- 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:**
|
||
```typescript
|
||
/* ---- 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:**
|
||
```typescript
|
||
/* ---- 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:**
|
||
```typescript
|
||
const usedPlaceIds = new Set();
|
||
```
|
||
|
||
**SONRA:**
|
||
```typescript
|
||
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)
|
||
```typescript
|
||
['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ı)
|
||
```typescript
|
||
['restaurant', 'cafe']
|
||
```
|
||
- Günde sadece 1 tane
|
||
- Restaurant VEYA cafe (ikisi birden olamaz)
|
||
|
||
### EXCLUDED (Hariç)
|
||
```typescript
|
||
['hotel', 'accommodation', 'lodging']
|
||
```
|
||
- Asla timeline'a eklenmez
|
||
- Sadece başlangıç noktası
|
||
|
||
### FIXED_TIME (Sabit Saatli)
|
||
```typescript
|
||
['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)
|