{{-- KALKIŞ KÜNYESİ — operasyon kartının özet alanları, ortak defter tasarımıyla. Müşteri / satış kartlarındaki kalıbın aynısı: her alan tek satır, solda küçük etiket, sağda değer, hover'da kopyala. Daha önce bu bilgiler altı ayrı "kutu kart" halindeydi (kapasite, rezervasyon, ciro, maliyet, net…); rakamlar yan yana değil ALT ALTA okunduğunda karşılaştırılabiliyor ve kart üç ekran boyu kısalıyor. Yalnızca operasyon notu yazılabilir (updateField beyaz listesinde tek alan o); geri kalan satırlar hesaplanmış değerlerdir, salt okunur. Beklenen: $vm, $cap, $op, $badge, $start, $end, $dateLabel, $resourceCost, $net, $updateUrl --}} @php $opsMoney = fn ($v) => number_format((float) $v, 0, ',', '.') . '₺'; /** Salt okunur tek satır (alan adı yok → yalnızca kopyalanır). */ $opsRo = fn (string $label, $text, array $o = []) => [ 'label' => $label, 'field' => null, 'type' => 'text', 'value' => (string) ($text ?? ''), 'text' => (string) ($text ?? ''), 'mono' => $o['mono'] ?? false, 'ph' => $o['ph'] ?? null, ]; $opsSections = []; // ── Kalkış ── $opsGuaranteeText = null; if ($op && $op->guaranteed_at) { $opsGuaranteeText = ($op->guaranteed_mode === 'manual' ? 'Manuel' : 'Otomatik') . ' · ' . $op->guaranteed_at->translatedFormat('d.m.Y H:i') . ($op->guaranteedBy ? ' · ' . ($op->guaranteedBy->full_name ?? $op->guaranteedBy->name) : ''); } $opsSections[] = [ 'title' => 'Kalkış', 'icon' => 'fa-calendar-day', 'rows' => array_values(array_filter([ $opsRo('Tarih', $dateLabel, ['mono' => true]), $opsRo('Gün', $start?->translatedFormat('l')), $opsRo('Saat', $vm['start_time'], ['mono' => true, 'ph' => 'Saat girilmedi']), $opsRo('Tur', $vm['tour_name']), $opsRo('Tur Kodu', $vm['tour_code'], ['mono' => true]), $opsRo('Tip', $vm['type_label']), $opsRo('Durum', $badge['label']), $opsGuaranteeText ? $opsRo('Kesin Kalkış', $opsGuaranteeText) : null, ($op && $op->departure_status === 'cancelled') ? $opsRo('İptal Gerekçesi', $op->cancellation_reason ?: 'Belirtilmedi') : null, ])), ]; // ── Doluluk ── // "Kalan" kapasite sınırsızken anlamsızdır; ∞ yazmak yerine satır boş kalır // ve boş-alan sayacına düşer — kullanıcı eksik bilgiyi kendisi görür. $opsSections[] = [ 'title' => 'Doluluk', 'icon' => 'fa-users', 'rows' => [ $opsRo('Kapasite', $cap['used'] . ' / ' . ($cap['total'] ?: '∞'), ['mono' => true]), $opsRo('Doluluk', '%' . $cap['occupancy'], ['mono' => true]), $opsRo('Kalan', $cap['total'] ? $cap['remaining'] : '', ['mono' => true, 'ph' => 'Kapasite sınırsız']), $opsRo('Rezerve', $cap['reserved'], ['mono' => true]), $opsRo('Rezervasyon', $vm['res_count'], ['mono' => true]), $opsRo('Yolcu', $vm['pax'], ['mono' => true]), ], ]; // ── Finans ── $opsSections[] = [ 'title' => 'Finans', 'icon' => 'fa-coins', 'rows' => [ $opsRo('Toplam Ciro', $opsMoney($vm['revenue']), ['mono' => true]), $opsRo('Kesin Ciro', $opsMoney($vm['revenue_won']), ['mono' => true]), $opsRo('Potansiyel Ciro', $opsMoney($vm['revenue_potential']), ['mono' => true]), $opsRo('Kaynak Maliyeti', $opsMoney($resourceCost), ['mono' => true]), $opsRo('Net (kesin − maliyet)', $opsMoney($net), ['mono' => true]), ], ]; // ── Not ── // Kartın TEK yazılabilir alanı. $op null olabilir: tarih için henüz operasyon // kaydı açılmamıştır, ilk not kaydında oluşur. $opsSections[] = [ 'title' => 'Not', 'icon' => 'fa-note-sticky', 'rows' => [[ 'label' => 'Operasyon Notu', 'field' => 'operation_notes', 'type' => 'textarea', 'value' => (string) ($op?->operation_notes ?? ''), 'text' => (string) ($op?->operation_notes ?? ''), 'ph' => 'Kalkışa dair not ekleyin', ]], ]; @endphp @include('components.quick-view.ledger-card', ['card' => [ 'title' => 'Kalkış Künyesi', 'icon' => 'fa-clipboard-check', 'url' => $updateUrl, 'class' => 'pfx-lw', 'foldable' => true, 'sections' => $opsSections, ]])