{{-- Tarih başına pazaryeri × sınıf fiyat matrisi. Beklenen: $marketplaces : Marketplace koleksiyonu (defaultCurrency ile) $existing : [marketplace_id][classKey] => (TourDateMarketplacePrice) — mevcut fiyatlar $fields : [['key'=>'adult_price','label'=>'…','short'=>'…','hint'=>'…','icon'=>'…'], ...] short/hint/icon opsiyoneldir (günübirlik eski dizisi yalnız key+label veriyor). Konaklamalı turlarda dizi App\Support\TourFareCatalog'tan üretilir. $namePrefix : input name öneki (varsayılan 'marketplace_prices') $classes : aktif fiyat sınıfları (kullanılmıyorsa boş) $useClasses : sınıf modu açık mı $primaryUrl : (ops.) ana pazarı kaydeden endpoint — verilirse matris içinden ana pazar seçilebilir --}} @php $marketplaces = $marketplaces ?? collect(); $existing = $existing ?? []; $fields = $fields ?? []; $namePrefix = $namePrefix ?? 'marketplace_prices'; $classes = $classes ?? collect(); $useClasses = ($useClasses ?? false) && $classes->isNotEmpty(); $primaryUrl = $primaryUrl ?? null; // Satır listesi: sınıflıysa sınıflar, değilse tek "none" $classRows = $useClasses ? $classes->values() : collect([null]); // Alan tanımlarını normalize et: short/hint/icon opsiyonel $fields = collect($fields)->map(fn ($f) => [ 'key' => $f['key'], 'label' => $f['label'] ?? $f['key'], 'short' => $f['short'] ?? ($f['label'] ?? $f['key']), 'hint' => $f['hint'] ?? null, 'icon' => $f['icon'] ?? null, ])->values()->all(); // Sınıf kapasitesi eksik girilmişse: kalan kontenjan en yüksek sınıftan fiyatlanır (tarih notu) $mppCapSum = $useClasses ? collect(is_array(($tour ?? null)?->class_capacities ?? null) ? $tour->class_capacities : []) ->only($classes->pluck('id')->all())->sum(fn ($v) => (int) $v) : 0; $mppHighest = ($useClasses && $mppCapSum > 0) ? \App\Models\Agency\TourClass::highestOf($classes) : null; // ── Ana pazar ── // Üründe AÇIKÇA tanımlıysa o kullanılır. Tanımlı değilse arayüz bir varsayılana düşer // (base para birimli pazar → yoksa ilk pazar) ama bu durum kullanıcıya UYARI olarak // gösterilir: satışta hangi pazarın fiyatının geleceği belirsizdir. $primaryMpId = (int) (($tour ?? null)?->product?->primary_marketplace_id ?? 0); $primaryExplicit = $primaryMpId > 0 && $marketplaces->contains('id', $primaryMpId); if (!$primaryExplicit) { $primaryMpId = (int) (optional($marketplaces->first(fn($m) => $m->defaultCurrency && $m->defaultCurrency->is_base))->id ?? (optional($marketplaces->first())->id ?? 0)); } // Ana pazar kartı listenin başına alınır (matris hesapları ilk karta "is-primary" der). $marketplaces = $marketplaces->sortBy(fn($m) => $m->id === $primaryMpId ? 0 : 1)->values(); $mppPrimaryMp = $marketplaces->first(); // Fiyatı olan pazar sayısı — özet ve "yalnız dolu olanlar" filtresi için $mppFilledIds = collect($existing)->filter(function ($rows) use ($fields) { return collect($rows)->contains(function ($row) use ($fields) { return collect($fields)->contains(fn ($f) => (float) ($row->{$f['key']} ?? 0) > 0); }); })->keys()->map(fn ($k) => (int) $k)->all(); $mppFilledCount = count($mppFilledIds); // 4+ pazaryerinde ana pazar dışındakiler katlanmış başlar: ekranda asıl doldurulan kart // ana pazardır, diğerleri kurdan türer — açık bırakmak 40+ input'luk dikey duvar yaratıyor. $mppFoldOthers = $marketplaces->count() > 3; // Açılır-kapanır mod (tarih formlarında yer kazanmak için; qd-fold stilleri _qv-dates-ui'de) $collapsible = $collapsible ?? false; if ($collapsible) { $baseKey = $useClasses ? (optional($classes->firstWhere('is_base', true))->id ?? 'none') : 'none'; $primaryAdult = $mppPrimaryMp ? ($existing[$mppPrimaryMp->id][$baseKey] ?? null)?->adult_price : null; $mppAdultLabel = \App\Support\TourFareCatalog::short('adult'); $mppSummary = $primaryAdult !== null ? $mppAdultLabel . ' ' . number_format((float) $primaryAdult, 0, ',', '.') . ' ' . ($mppPrimaryMp->defaultCurrency->code ?? '') . ' · ' . ($primaryExplicit ? 'ana pazar: ' . $mppPrimaryMp->name : 'ana pazar seçilmedi') : ($primaryExplicit ? 'Henüz fiyat girilmedi' : 'Fiyat yok · ana pazar seçilmedi'); } @endphp @if($collapsible)