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

287 lines
7.9 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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)