{{-- Kültür/Yurtdışı turu tarih formu alanları (ekle/düzenle ortak) — SADE DEFTER DÜZENİ. Her alan tek satır (etiket + kompakt kontrol), bölümler ince başlıklarla ayrılır; sık kullanılanlar açık, nadir kullanılanlar katlanır. Görünüm _qv-date-form-ui'de; alan adları ve JS kancaları (data-qd-*) DEĞİŞMEDİ. Opsiyonel: $d (TourDate|null), $copyDates (Collection), $suggestStart, $suggestEnd --}} @php $d = $d ?? null; $copyDates = $copyDates ?? collect(); $suggestStart = $suggestStart ?? null; $suggestEnd = $suggestEnd ?? null; $startVal = $d && $d->start_date ? \Carbon\Carbon::parse($d->start_date)->format('Y-m-d') : ($suggestStart ?? ''); $endVal = $d && $d->end_date ? \Carbon\Carbon::parse($d->end_date)->format('Y-m-d') : ($suggestEnd ?? ''); // Tarih-seviyesi (pazaryeri-dışı) kopyalanabilir alanlar $priceFields = ['room_capacity','child_min_age','child_max_age','infant_min_age','infant_max_age','early_booking_discount','last_minute_discount','group_discount','special_discount','min_group_size','discount_reason']; // Pazaryeri fiyat matrisi alanları — etiketler TEK kaynaktan (App\Support\TourFareCatalog). // Bebek kabul edilmiyorsa bebek fiyatı hiç sorulmaz (forTour bunu eler). $mpFields = collect(\App\Support\TourFareCatalog::forTour((bool) $tour->infant_allowed)) ->map(fn ($f) => ['key' => $f['column'], 'label' => $f['label'], 'short' => $f['short']])->all(); $mpList = $tour->product?->marketplaces ?? collect(); // Mevcut fiyatlar: [marketplace_id][classKey] => satır $mpExisting = []; if ($d) { foreach ($d->marketplacePrices as $mpp) { $ck = $mpp->tour_class_id ?? 'none'; $mpExisting[$mpp->marketplace_id][$ck] = $mpp; } } $mpClasses = $pricingClasses ?? collect(); $mpUseClasses = (bool) ($tour->use_pricing_classes ?? false); // Seri üretim yalnızca yeni tarih eklerken anlamlı (statik dates.blade ile aynı kural). $isNew = !$d; // ── Yaş aralıkları: yeni tarihte turun genel ayarından otomatik çekilir ── $ageFields = ['child_min_age', 'child_max_age', 'infant_min_age', 'infant_max_age']; $ageVals = []; foreach ($ageFields as $af) { $ageVals[$af] = $d ? $d->{$af} : ($tour->{$af} ?? null); } $agesEmpty = collect($ageVals)->every(fn ($v) => $v === null); $agesMatchTour = collect($ageFields)->every(fn ($af) => (string) ($ageVals[$af] ?? '') === (string) ($tour->{$af} ?? '')); $fmtAge = fn ($min, $max) => ($min === null && $max === null) ? '—' : (($min ?? '?') . '–' . ($max ?? '?') . ' yaş'); $ageSummary = 'Çocuk ' . $fmtAge($ageVals['child_min_age'], $ageVals['child_max_age']) . ($tour->infant_allowed ? ' · Bebek ' . $fmtAge($ageVals['infant_min_age'], $ageVals['infant_max_age']) : ''); $ageChip = $agesEmpty ? ['Tanımsız', 'empty'] : ($agesMatchTour ? ['Turun genel ayarı', 'auto'] : ['Bu tarihe özel', 'custom']); $cppOn = (bool) ($d?->use_custom_payment_plan); $stages = is_array($d?->payment_schedule ?? null) ? $d->payment_schedule : []; $stageTriggers = ['at_booking' => 'Rezervasyonda', 'days_before_departure' => 'Kalkıştan X gün önce', 'on_departure' => 'Kalkışta']; // Katlanır bölümlerin kapalı başlık özetleri $discFields = ['early_booking_discount' => 'Erken', 'last_minute_discount' => 'Son dakika', 'group_discount' => 'Grup', 'special_discount' => 'Özel']; $discParts = []; foreach ($discFields as $df => $dl) { if ($d && $d->$df !== null && (float) $d->$df > 0) $discParts[] = $dl . ' %' . rtrim(rtrim(number_format((float) $d->$df, 2, ',', ''), '0'), ','); } $discSummary = $discParts ? implode(' · ', $discParts) : 'İndirim tanımlanmadı'; $ruleNames = ['early_booking_rule' => 'Erken rez.', 'last_minute_rule' => 'Son dakika', 'booking_deadline_rule' => 'Son rezervasyon']; $ruleParts = []; foreach ($ruleNames as $rn => $rl) { $rv = $d?->$rn; if (is_array($rv) && !empty($rv['mode'])) $ruleParts[] = $rl; } $ruleSummary = $ruleParts ? implode(' · ', $ruleParts) . ' tanımlı' : 'Turun genel kuralları geçerli'; $cppSummary = $cppOn ? (count($stages) ? count($stages) . ' aşama tanımlı' : 'Açık — henüz aşama yok') : 'Turun genel ödeme planı geçerli'; @endphp @include('agency.products._qv-date-form-ui')
@if($copyDates->count()) @endif {{-- ══ TARİH ══ --}}
{{-- ══ KAPASİTE ══ --}}
@if($tour->infant_allowed) @endif
{{-- ══ FİYATLAR — günübirlikteki minimal matris ══ --}}
@include('agency.products._qv-date-prices-mini', [ 'marketplaces' => $mpList, 'existing' => $mpExisting, 'fields' => $mpFields, 'classes' => $mpClasses, 'useClasses' => $mpUseClasses, ])
{{-- ══ SEZON & DURUM ══ --}}
Notlar
{{-- ══ YAŞ ARALIKLARI (kapalı başlar) ══ --}}
{{-- ══ İNDİRİMLER (katlanır) ══ --}}
{{-- ══ ZAMAN KURALLARI (katlanır) ══ --}}
{{-- ══ BU TARİHE ÖZEL ÖDEME PLANI (katlanır) ══ --}}
@if($isNew) {{-- ══ SERİ TARİH (katlanır) — işaretlenirse form dates.bulk'a gider ══ --}}
@endif