# Quick-View'a Tam Oluşturma/Düzenleme Taşıma — Devam Planı (Handoff)

> Amaç: Tüm tur tiplerinde (kültür, yurtdışı, günübirlik) oluşturma + düzenleme işlemlerini **quick-view drawer** içine, statik sayfalarla **birebir (doğru input tipiyle)** taşımak. Statik sayfalar/route'lar/indeks butonları **Faz 2'ye kadar duruyor**. Bu dosya, evde/başka makinede kaldığın yerden devam edebilmen için tüm mimariyi, yapılanları ve kalan adımları içerir.

## 🎯 Orijinal İstek (ne yapmak istiyoruz — kullanıcının ifadesiyle)

> "Turlarda quick-view dışındaki tüm sayfaları (oluşturma, düzenleme sayfalarını) kaldıracağız. Ama kaldırmadan önce normal sayfalarda olup da quick-view sayfalarında eksik olan çok fazla alan var. Bunların **birebir** olarak quick-view ekranında da olması şart. İlk olarak tüm bu alanları tespit et; bu alanları **doğru input tipiyle** birebir aktar. Turların hepsinde (**günübirlik, kültür ve yurtdışı**) tüm işlemlerin (**edit, create**) quick-view üzerinden yapılmasını istiyorum. Normal statik sayfaları **sonrasında** kaldıracağız. İndeks sayfalarından da **edit butonlarını kaldıracağız** ve **create butonu boş quick-view ekranı açacak**, bilgiler direkt orada doldurulacak. Fakat bunların hepsini aktarsan bile **dosyalar ve butonlar kalsın**; ben inceleyip onaylayınca (Faz 2) bunları da kaldırır ve düzenleriz."

**Kısaca hedef:** create + edit'in tamamı quick-view drawer'ında, statik sayfalarla **eksiksiz alan paritesi** ile. Önce **ekle/tamamla** (Faz 1 — statikler durur), kullanıcı onayından sonra **sil/temizle** (Faz 2).

## Kararlar (kullanıcı onaylı)
1. Rich-text = **tam Quill editörü** (drawer içinde), statikle birebir.
2. "Yeni" = **anında Taslak kayıt + drawer aç** (`quickCreate`), sonra drawer'da doldurulur.
3. **Faz 1'de indekse dokunma**; sadece geçici "Taslak Aç" test butonu eklendi. İndeks butonları + statik silme = **Faz 2**.
4. **Paradigma:** Quick-view'da form mantığı (tek "Kaydet" butonu) yerine **alan-alan anlık inline kayıt** esas. Her alan tıkla→düzenle→blur/Enter ile anında `update-field`'e yazar; "Kaydet" butonları kalkar. Repeater'lar (transfer noktaları / ödeme aşamaları / kategoriler) = **blok otomatik kayıt** (değişince tüm blok tek istekle kaydolur). SEO sekmesi statik `seo.blade.php` ile **birebir** (karakter sayaçları + etiket-çip), ama inline.
5. **Taslak sistemi:** `is_draft` kolonu; `quickCreate` taslak açar; drawer header'ında **"Turu Tamamla"** butonu (is_draft=false + yayına al); taslaklar ana listede GÖRÜNMEZ, ayrı **"Taslaklar"** sayfasında listelenir.

### Kültür turlarında UYGULANDI (2026-07-15 / 2026-07-16)
- **Bug fix (itinerary):** `TourItineraryController` `tour_id` → `cultural_tour_id` (4 yer, `exists:` tablo adı dahil); program ekleme/sıralama çalışıyor.
- **Inline geçiş:** `overview` (Genel Bilgiler) formu → `_qv-general-inline` (skalerler `_qv-field`, HTML alanları YENİ `_qv-quill-inline`, ulaşım/transfer/kategori/ödeme blokları YENİ `_qv-inline-blocks` ile otomatik kayıt). "Genel Bilgileri Kaydet" butonu kalktı.
- **`updateField` genişletildi:** htmlFields (`description`, `places_to_visit`, `inclusions`, `exclusions`, `cancellation_policy`, `terms_conditions`), timeFields (`flight_departure_time`), ulaşım (`transportation_method`/`departure_flight_number`/`transportation_notes`/`has_transfer_points`), **havalimanları** (`departure_airports`/`arrival_airports`, serbest metin). Yan etkiler: `name`→slug + ürün adı/slug senkronu, `days`→duration/nights. Whitelist dışı → 422.
- **Yeni endpoint'ler:** `transfer-points`, `categories`, `publish-draft`, `drafts` (+ mevcut `payment-plan`/`quick-create`/`update-field`).
- **SEO sekmesi:** `_qv-seo-inline` + `_qv-seo-ui` — alanlar diğer sekmelerle aynı inline `_qv-field` tasarımında; **canlı Google (SERP) arama önizlemesi** (yazarken + kayıttan sonra güncellenir); 60/160 karakter sayaçları; etiket-çip arayüzü.
- **Tur programı UI:** modern **timeline kartları** (gün rozeti + bağlayıcı çizgi + hover) ve genişletilmiş ekle/düzenle formu (`.pqv-itin-*` stilleri; `_quick-view-styles`).
- **Alan boyutlandırma:** `_qv-field`'a `wide`/`itemClass` parametreleri; tur adı tam satır & geniş input; header başlığından da tur adı **büyük/geniş** input ile düzenlenebilir (`qv-title-editable`); uçak seçilince havalimanı + uçuş alanları geniş.
- **Taslak sistemi:** `is_draft` migration + model (scopeDraft/notDraft); `quickCreate` `is_draft=true`; drawer header'ında **"Taslaktan Çıkar"** butonu (publishDraft); `index()` taslakları gizler; `drafts()` + `drafts.blade.php`; durum rozeti/etiketi is_draft ile tutarlı (Taslak/Yayında/Gizli/Pasif). Backfill migration `2026_07_16_000001` eski sızmış taslakları düzeltti.
- **İndeks:** "Taslaklar" + "Yeni Taslak" butonları başlıktaki "Yeni Kültür Turu" yanında (data-table `headerActions`).
- **AJAX yanıt bug fix:** `destroy` ve `duplicate` artık AJAX'a **JSON** dönüyor (önceden redirect→sessiz hata→çift tıklama→404). Sil/Kopyala JS'leri doğru header + hata yönetimiyle güncellendi.
- **Statikler durur** (Faz 2): `updateGeneral`/`updateSeo`/`_qv-general-form`/statik sayfalar silinmedi; kültür quick-view'ı artık inline partial'ları kullanıyor.

### Yurtdışı + Günübirlik UYGULANDI (2026-07-16) — Faz 1 TAMAMLANDI

**Yurtdışı (yurtdisi-turlari):** kültürün birebir kopyası.
- `is_draft` migration (`2026_07_16_000002`) + model (fillable/cast/scope). Backfill YAZILMADI — yurtdışında `quickCreate` hiç olmadığı için sızmış taslak yok.
- Controller: `quickCreate`, `updateTransferPoints`, `updateCategories`, `publishDraft`, `drafts`, `updatePaymentPlan`; `updateGeneral`/`updateSeo`/`destroy`/`duplicate` → expectsJson JSON; `updateField` whitelist (html/time/ulaşım/havalimanı + slug/duration yan etkileri); `quickView` categories+templates; `index()` taslakları gizler.
- Route: `drafts`(GET, `/{yurtdisiTur}` ÖNCESİNDE), `quick-create`, `payment-plan`, `transfer-points`, `categories`, `publish-draft`.
- Quick-view baştan yazıldı (inline), `drafts.blade.php` eklendi, indekse Taslaklar/Yeni Taslak butonları.
- **BUG FIX (kritik):** `yurtdisi-turlari/quick-view.blade.php` `$editBase`'i `kultur-turlari` idi → yurtdışı quick-view'daki TÜM inline düzenlemeler aynı id'li KÜLTÜR turuna yazıyordu. Düzeltildi.
- BOM: dosya baştan yazılırken BOM kaldırıldı (kültür/günübirlik zaten BOM'suz; BOM drawer HTML'ine çöp karakter basıyordu).

**Günübirlik (gunubirlik-turlar):** deltalarla.
- Migration `2026_07_16_000003`: `is_draft`, `child_min_age`/`child_max_age`/`infant_max_age`, `payment_plan`/`payment_plan_enabled`/`online_payment_enabled`/`online_deposit_percent`, `auto_guarantee_on_min`; ayrıca `day_tour_dates`'e `auto_guarantee_on_min`/`payment_schedule`/`use_custom_payment_plan`.
- **Kullanıcı kararı:** yaş alanları + ödeme planı/kesin kalkış günübirliğe TAM porte edildi (sadece kolon değil, motor da). `DepartureInventoryService::applySeatColumns`'a otomatik kesin kalkış eklendi — günübirlikte `guarantee_departure` yok, karşılığı `is_guaranteed`+`guaranteed_at`+`status`; min katılımcı tur'dan okunur (day_tour_dates'te `min_participants` kolonu yok).
- Controller: `quickCreate` (start_time/end_time NOT NULL → 09:00/18:00, `description=''`, days/nights YOK), `updateCategories`, `publishDraft`, `drafts`, `updatePaymentPlan`, `updateMarketplacePrices`; `updateField` (+html, +`recurring_days` CSV, +yeni kolonlar, slug yan etkisi, saat boşaltma 422); `updateSeo` artık `tags`'i de kaydediyor (statik sayfa post ediyordu ama yutuluyordu).
- Quick-view: overview → `_qv-general-inline` (`productType=day`), SEO → `_qv-seo-inline`, ayarlara datetime + kesin kalkış + kademeli ödeme, pricing sekmesine yaş aralıkları + pazaryeri bazlı fiyat bloğu; eksik script include'ları (`_qv-general-ui`/`_qv-richtext`/`_qv-inline-blocks`/`_qv-seo-ui`) eklendi.
- **Transfer noktaları günübirlikte YOK** (day_tours'ta kolon yok, modelde ilişki yok) — `_qv-general-inline` `@unless($isDay)` ile gizler, `$transferUrl` de günübirlikte üretilmez.

**Paylaşılan partial'larda yapılan değişiklikler:**
- `_qv-general-inline`: günübirlik için `start_time`/`end_time` (time) + `recurring_days` (checkbox→CSV) eklendi; `$transferUrl` koşullu.
- `_qv-inline-blocks`: `data-qv-csv-save` (checkbox grubu→CSV→update-field) ve `data-qv-mpprices-save` (pazaryeri fiyatları) handler'ları; `send()`'e hata yakalama.
- `_qv-seo-inline`: SERP önizleme URL'si `kultur-turlari` hard-code'luydu → `$urlSegment` ile editBase'den türetiliyor.

### KALAN İŞLER
- **Faz 2 (kullanıcı onayından sonra):** Üç tur tipinde de indeks "Düzenle" butonlarını kaldır, "Yeni …" butonunu taslak akışına bağla (`openDraftQuickView`); statik `create/general/settings/seo/pricing` blade'lerini + route/redirect metotlarını + `_nav` linklerini + `_qv-general-form`/`updateGeneral`/`updateSeo`'yu temizle.
- **Günübirlik tarih sekmesi:** `auto_guarantee_on_min`/`payment_schedule` tarih bazlı override UI'ı henüz yok (kültür/yurtdışında var). Kolonlar ve motor hazır; sadece arayüz eklenecek.
- **Bilinen ayrı bug (düzeltilmedi):** `duplicate()` `replicate()` ile `product_id`'yi de kopyaladığı için kopya tur orijinalin Product'ını PAYLAŞIYOR (kültür+yurtdışı). `attach()` unique'e takılmasın diye `syncWithoutDetaching`'e çevrildi ama asıl tasarım sorunu duruyor — kopya kendi Product'ını almalı mı, karar gerekiyor.

---

## Mimari & Yeniden Kullanılabilir Parçalar (hepsi yazıldı, kültürde çalışıyor)

Drawer, `openQuickView(url,tab)` ile HTML çekip `setHtmlAndRunScripts` ile enjekte eder: **inline `<script>`'ler çalışır ama `DOMContentLoaded` çalışmaz** → tüm init'ler top-level IIFE + idempotent olmalı.

- **`resources/views/components/quick-view-drawer.blade.php`** — drawer motoru. Eklendi: `window.openDraftQuickView(createUrl)` (POST → dönen `quick_view_url`'i açar).
- **`resources/views/agency/products/_quick-view-crud-script.blade.php`** — `data-pqv-save` form motoru. `PQV.formToObj` iç içe alan adlarını (`name[k]`, `name[k1][k2]`, `name[]`) nested objeye çevirir (daha önce geliştirildi). Formlar mevcut controller endpoint'lerine JSON POST/PUT eder, sonra `PQV.reload(tab)` ile drawer'ı yeniler.
- **`_qv-field.blade.php`** — inline tek-alan editleme (text/number/date/**datetime-local**/select/textarea/bool). `update-field` (PATCH) endpoint'ine gider. Bool = select (Evet/Hayır).
- **`_qv-richtext.blade.php`** (YENİ) — enjekte içerikte çalışan idempotent Quill init. Her `.qv-quill` için editör kurar, `.qv-quill-wrap` içindeki `.qv-quill-input` hidden'ına HTML yazar. Quill layout'ta zaten **global** (`agency/layouts/app.blade.php` satır 33-34, v2.0.3).
- **`_qv-quill-field.blade.php`** (YENİ) — tek rich-text alanı. Params: `name`, `label`, `value` (HTML), `hint`.
- **`_qv-general-form.blade.php`** (YENİ) — **3 tur tipinin paylaştığı** tam "Genel Bilgiler" formu. Param `productType` ∈ `cultural|international|day`. `data-pqv-save` PUT → `{editBase}.update-general`. İçerir: tüm skalerler, 6 Quill alanı, ulaşım bloğu + transfer_points repeater (day hariç), kategoriler çoklu-seçim, günübirlik için `recurring_days` + `start_time`/`end_time`.
- **`_qv-general-ui.blade.php`** (YENİ) — delegasyonlu JS: ulaşım şekli göster/gizle, transfer noktaları ekle/sil, **ödeme planı aşaması** ekle/sil. Bir kez bağlanır.

### Backend deseni (kültürde uygulandı — TourController)
- `updateGeneral()` / `updateSeo()` → `$request->expectsJson()` ise `response()->json(['success'=>true,...])`.
- `quickCreate()` → minimum zorunlu alanlarla Taslak Tour + Product oluşturur (`is_active/is_public/is_bookable=false`, ad="Yeni …", şehir=ilk şehir, kod otomatik), JSON `{success, quick_view_url}` döner. Route: `.quick-create` (POST).
- `quickView()` → forma kategori ağacı + şablon koleksiyonlarını da geçirir (`categories`, `cancellationPolicies`, `termsConditions`, `inclusionsTemplates`, `exclusionsTemplates`).
- `updateField` whitelist genişletildi: bool'a `auto_guarantee_on_min`, `online_payment_enabled`, `payment_plan_enabled`; yeni `$decimalFields=['online_deposit_percent']`.
- `updatePaymentPlan()` (YENİ) → yalnızca `payment_plan` aşamalarını güvenle kaydeder (marketplace'e DOKUNMAZ). Route: `.payment-plan` (POST). (Not: settings.update'e kısmi POST marketplace'leri siler — o yüzden ayrı endpoint.)

---

## ✅ TAMAMLANAN — Kültür Turları (kultur-turlari) referans implementasyon

**Controller** `app/Http/Controllers/Agency/Tour/TourController.php`: updateGeneral/updateSeo JSON, `quickCreate`, `updatePaymentPlan`, updateField whitelist, quickView extra veriler.
**Routes** `routes/agency.php` (kultur-turlari grubu): `quick-create`, `payment-plan` eklendi.
**Quick-view** `resources/views/agency/products/kultur-turlari/quick-view.blade.php`:
- Overview sekmesi → `@include('agency.products._qv-general-form', [... 'productType'=>'cultural'])`.
- Settings sekmesi → published/expires **datetime-local**; yeni "Rezervasyon & Kesin Kalkış" (auto_guarantee_on_min) + "Kademeli Ödeme Planı" bölümü (payment_plan_enabled/online_payment_enabled/online_deposit_percent inline + aşama repeater formu → `payment-plan`).
- Altına include'lar: `_qv-general-ui`, `_qv-richtext`.
**İndeks** `kultur-turlari/index.blade.php`: sağ-alt **geçici** "Taslak Aç (drawer)" butonu → `openDraftQuickView(route('...quick-create'))`.

Durum: `php artisan view:cache` temiz, `php -l` temiz, route'lar kayıtlı. **Tarayıcı testi kullanıcı tarafından yapılacak.**

---

## ⏳ KALAN İŞLER

### 1) Yurtdışı Turları (yurtdisi-turlari) — kültürün BİREBİR kopyası
Dosyalar: `app/Http/Controllers/Agency/InternationalTour/InternationalTourController.php`, `resources/views/agency/products/yurtdisi-turlari/quick-view.blade.php`, `.../index.blade.php`, `routes/agency.php` (yurtdisi grubu).

Adımlar (kültürdeki değişiklikleri route param `{yurtdisiTur}` + slug `yurtdisi-turu` + editBase ile birebir uygula):
- **Controller:** `updateGeneral`/`updateSeo` → expectsJson JSON; `quickCreate()` (slug `yurtdisi-turu`, ad "Yeni Yurt Dışı Turu"); `updatePaymentPlan()`; `updateField` whitelist genişlet; `quickView()`'a categories+templates ekle. (Tüm metotlar TourController'daki ile aynı; kopyala-uyarla.)
- **Routes:** `quick-create` + `payment-plan` route'ları ekle.
- **Quick-view:** overview → `_qv-general-form` (`productType=>'international'`); settings ekleri (datetime + auto_guarantee + kademeli ödeme bölümü); include `_qv-general-ui` + `_qv-richtext`.
- **İndeks:** geçici "Taslak Aç" butonu.
- Yurtdışı dosyalarında **UTF-8 BOM** var (1. satır); yeni satırlarda dikkat.

### 2) Günübirlik Turlar (gunubirlik-turlar) — deltalar var
Dosyalar: `app/Http/Controllers/Agency/DayTour/DayTourController.php`, `DayTourSettingsController.php`, `DayTourPricingController.php`, `resources/views/agency/products/gunubirlik-turlar/quick-view.blade.php`, `.../index.blade.php`, `routes/agency.php` (gunubirlik grubu).

- **Controller (DayTour):** updateGeneral/updateSeo → JSON; `quickCreate()` — DAYTOUR EK: `start_time`/`end_time` **NOT NULL** (varsayılan 09:00/18:00) + `adult_price/child_price/infant_price` (varsayılan 0); slug `gunubirlik-tur`; `days` YOK. updateField whitelist genişlet; `quickView()` categories+templates.
- **Genel form:** `_qv-general-form` zaten `productType=>'day'` destekliyor (days yerine start/end time + `recurring_days[]` checkbox grubu, ulaşım bloğu gizli). Overview'i buna çevir.
- **Pricing sekmesi (günübirliğe özel):** mevcut adult/child/infant/currency + EKLE: `child_min_age`, `child_max_age`, `infant_max_age` (number) + `marketplace_prices[{mpId}][adult/child/infant_price]` **per-marketplace repeater** → `pricing.update`. (Bu repeater için `_qv-general-ui` benzeri bir add/remove JS veya doğrudan tüm marketplace'leri listeleyen statik satırlar.)
- **Settings:** kültürdeki eklemeler (datetime; günübirlikte payment_plan/auto_guarantee kolonları VAR MI kontrol et — yoksa yalnızca datetime + mevcutlar). Not: DayTour `updateSettings` beyaz listesinde `instant_booking` eksik (statik bug); istenirse düzelt.
- **İndeks:** geçici "Taslak Aç" butonu.
- DayTour model'de `recurring_days` array cast olmalı (kontrol et).

### 3) Doğrulama (her tur tipi için, tarayıcıdan — giriş yaptıktan sonra)
1. İndekste "Taslak Aç" → Taslak oluşur + drawer açılır.
2. Genel: 6 Quill alanı biçimli kaydediliyor; ulaşım (uçak→uçuş alanları, karayolu→transfer repeater ekle/sil); kategori ekle/çıkar; kaydet→yenile→kalıcı.
3. Settings: datetime saatli; kademeli ödeme aşaması ekle/sil→kaydet.
4. Günübirlik: recurring_days + pricing yaş + marketplace fiyatları.
5. Regresyon: statik sayfalar + indeks eski butonları çalışıyor; `php artisan view:cache` temiz.

---

## ⚠️ Ertelenen / Notlar
- **Şablon-prefill dropdown'ları** (inclusions/exclusions/terms/cancellation için hazır metin seçip editöre doldurma) ertelendi — sadece kolaylık, saklanan alan değil. `quickView` koleksiyonları geçiyor; istenirse `_qv-general-form`'a option `data-content` + JS ile eklenebilir. `cancellation_policy_definition_id` gerçek kolon DEĞİL (prefill), o yüzden formdan çıkarıldı.
- **Kategori ağacı** şu an düz checkbox listesi (parent/child hiyerarşisi görsel olarak düzleştirildi) — işlevsel; istenirse ağaç görünümü eklenir.
- `updateField` sonrası datetime alanının **display**'i gün olarak formatlanıyor (kayıt saati tutuyor); kozmetik.

## Faz 2 (kullanıcı onayından SONRA — bu turda YAPILMADI)
- İndeks "Yeni" butonunu `openDraftQuickView(...quick-create)`'e yönlendir; geçici test butonunu kaldır; satır "Düzenle" butonlarını kaldır (satıra tıklama zaten drawer açıyor).
- Statik `create`/`general`/`settings`/`seo`/`pricing` blade'lerini, ilgili route'ları ve controller'ların GET/redirect metotlarını sil; `_nav` statik linklerini temizle.

---

## Bu oturumda ayrıca tamamlanan (bağlam) — hepsi bu commit'te
- Fiyatlandırma modülü kaldırıldı → tarih bazlı oda fiyatlandırması (single/ek yatak/1.-2. çocuk/oda kapasitesi/bebek yaşları) — kültür+yurtdışı.
- Kademeli ödeme konfig (tur + tarih override), tarih kopyalama + seri oluşturma, kart/tablo görünüm (localStorage).
- Tarih & tur genel bilgilerinden başlangıç/bitiş saatleri kaldırıldı (uçuş kalkış saati + numarası kaldı).
- İndirim geçerlilik + son rezervasyon için esnek kurallar (tarih-saat / göreli: yayın/kalkış/rez-kapanış referanslı).
- "Min katılımcıda otomatik kesin kalkış" (tur+tarih) + operasyon otomatik geçiş.
- Migration'lar `2026_07_14_000001..000005` — **evde `php artisan migrate` çalıştır** (000005 bekliyor olabilir).

### Evde ilk yapılacaklar
```bash
git pull
php artisan migrate
php artisan view:clear
php artisan optimize:clear
```

> **2026-07-16 sonrası:** `2026_07_16_000002` (yurtdışı is_draft) ve `2026_07_16_000003` (günübirlik is_draft + yaş + ödeme planı + day_tour_dates) bekliyor — `php artisan migrate` çalıştırılmadan yurtdışı/günübirlik quick-view'ı AÇILMAZ (kolonlar yok).
