{{-- EKSTRA HİZMET KARTI — müşteri Künyesiyle AYNI defter (ledger) tasarımı. Alan panelleri components/quick-view/ledger-card + ledger-row ile çizilir: her alan tek satır, tıkla → yerinde düzenle, blur/Enter → update-field'e PATCH, hover'da kopyala/düzenle, boş alanlar soluk placeholder ile görünür. Ledger'a satır olarak sığmayan iki blok aynı dilde ayrıca tasarlandı: • Tutar Dökümü (.esr) — makbuz kuyruğu: sağa hizalı rakamlar, toplamdan önce kesikli ayraç. Fiyat/vergi satırları düzenlenince ANINDA yeniden hesaplanır (pfx:saved olayı), başlıktaki ölçüler de eşitlenir. • İlişkili Satışlar (.ess) — kart içinde kart yok; kıl payı çizgili hareket satırları, hover'da müşteri kartına atlama düğmesi. Not: bileşen etiketi içindeki route() tek tırnakla yazılır; çift tırnak Blade'in x-component ayrıştırıcısını erken kapatıp derlemeyi bozuyor. --}} @php $editBase = 'agency.products.extra-services'; $uf = route("$editBase.update-field", $service); $boolOptions = [['value' => '1', 'label' => 'Evet'], ['value' => '0', 'label' => 'Hayır']]; $categoryOptions = collect([['value' => '', 'label' => 'Kategorisiz']]) ->merge($categories->map(fn ($c) => ['value' => (string) $c->id, 'label' => $c->name]))->values()->all(); $taxOptions = collect([['value' => '', 'label' => 'Vergisiz']]) ->merge($taxRates->map(fn ($t) => [ 'value' => (string) (float) $t->rate, 'label' => $t->name . ' %' . rtrim(rtrim(number_format((float) $t->rate, 2, ',', '.'), '0'), ','), ]))->values()->all(); $unitOptions = collect([['value' => '', 'label' => 'Birimsiz']]) ->merge(collect($units)->map(fn ($l, $v) => ['value' => $v, 'label' => $l])->values())->values()->all(); $currencyOptions = $currencies->map(fn ($c) => ['value' => $c->code, 'label' => $c->code])->values()->all(); if (! $currencyOptions) { $currencyOptions = [['value' => 'TRY', 'label' => 'TRY']]; } // Tutar dökümü: vergi dahil girildiyse net geri hesaplanır $rate = $service->tax_rate !== null ? (float) $service->tax_rate : null; $price = (float) $service->price; if ($rate === null) { $net = $price; $tax = 0.0; $gross = $price; } elseif ($service->tax_included) { $net = round($price / (1 + $rate / 100), 2); $gross = $price; $tax = round($gross - $net, 2); } else { $net = $price; $tax = round($price * $rate / 100, 2); $gross = round($price + $tax, 2); } $num = fn ($v) => number_format($v, 2, ',', '.'); $money = fn ($v) => $num($v) . ' ' . $service->currency; $ratePretty = $rate === null ? '' : rtrim(rtrim(number_format($rate, 2, ',', '.'), '0'), ','); $taxRowLabel = $rate === null ? 'Vergi' : (($service->tax_name ?: 'Vergi') . ' (%' . $ratePretty . ')'); // Toplamın nereden geldiğini tek satırda anlatır — blok, aritmetiğin ötesinde // yalnızca bu bilgiyi ekler. $formula = $rate === null ? 'Vergi tanımlı değil; net ve satış tutarı aynıdır.' : ($service->tax_included ? $num($gross) . ' ÷ ' . number_format(1 + $rate / 100, 2, ',', '.') . ' = ' . $num($net) . ' net · fiyat vergi dahil girilmiş' : $num($net) . ' × %' . $ratePretty . ' = ' . $num($tax) . ' vergi · fiyat vergi hariç girilmiş'); /** Tek satır tanımı — müşteri Künyesindeki $row ile aynı sözleşme. */ $row = function (string $label, ?string $field, $value, ?string $text = null, array $o = []) { return [ 'label' => $label, 'field' => $field, 'type' => $o['type'] ?? 'text', 'value' => $value === null ? '' : (string) $value, 'text' => $text === null ? ($value === null ? '' : (string) $value) : $text, 'options' => $o['options'] ?? null, 'mono' => $o['mono'] ?? false, 'ph' => $o['ph'] ?? null, ]; }; @endphp {{-- slim: minimal başlık — avatar yok, başlık + rozetler tek şeritte (sabit QV tasarımı) --}} {{-- Header'da avatar yok (slim); yığın tutamağı ikonu buradan okur --}} {{ $service->is_active ? 'Aktif' : 'Pasif' }} {{ $service->code ?? '—' }} {{ $service->category?->name ?? 'Kategorisiz' }}
FİYAT {{ $money($price) }}
{{ $rate === null ? 'VERGİSİZ' : 'VERGİ DAHİL' }} {{ $money($gross) }}
{{-- ── GENEL ── --}}
{{-- Künye: hizmetin tüm alanları tek defterde --}} @include('components.quick-view.ledger-card', ['card' => [ 'title' => 'Hizmet Künyesi', 'icon' => 'fa-tags', 'url' => $uf, 'sections' => [ ['title' => 'Tanım', 'icon' => 'fa-circle-info', 'rows' => [ $row('Hizmet Adı', 'name', $service->name, null, ['ph' => 'Örn. VQ Alan Vergisi']), $row('Kategori', 'category_id', (string) ($service->category_id ?? ''), $service->category?->name ?? '', ['type' => 'select', 'options' => $categoryOptions, 'ph' => 'Kategorisiz']), $row('Fiyat Birimi', 'unit', (string) ($service->unit ?? ''), $service->unit_label ?? '', ['type' => 'select', 'options' => $unitOptions, 'ph' => 'Birimsiz']), $row('Açıklama', 'description', $service->description, null, ['type' => 'textarea', 'ph' => 'Bu hizmet neyi kapsıyor?']), ]], ['title' => 'Fiyatlandırma', 'icon' => 'fa-coins', 'rows' => [ $row('Fiyat', 'price', $service->price, $num($price), ['type' => 'number', 'mono' => true]), $row('Para Birimi', 'currency', $service->currency, $service->currency, ['type' => 'select', 'options' => $currencyOptions]), $row('Vergi Oranı', 'tax_rate', $rate !== null ? (string) $rate : '', $rate === null ? '' : $service->tax_label, ['type' => 'select', 'options' => $taxOptions, 'ph' => 'Vergisiz']), ]], ], ]]) {{-- Tutar dökümü — makbuz kuyruğu. Fiyat/vergi düzenlenince anında tazelenir. --}}
Tutar Dökümü
Net Tutar {{ $num($net) }}{{ $service->currency }}
{{ $taxRowLabel }} {{ $num($tax) }}{{ $service->currency }}
Satış Tutarı {{ $num($gross) }}{{ $service->currency }}

{{ $formula }}

{{-- Fiyata vergi dahil mi: dökümü doğrudan çevirdiği için burada, defter satırı olarak. Vergi yoksa satır anlamsız → gizlenir. --}}
@include('components.quick-view.ledger-row', ['r' => $row('Fiyata Vergi Dahil', 'tax_included', $service->tax_included ? '1' : '0', $service->tax_included ? 'Evet' : 'Hayır', ['type' => 'select', 'options' => $boolOptions])])
@if($service->unit_label) Tutarlar {{ $service->unit_label }} üzerindendir. @else Vergi oranını değiştirdiğinizde döküm ve başlıktaki tutarlar anında yenilenir. @endif
{{-- ── İLİŞKİLİ SATIŞLAR ── --}}
İlişkili Satışlar @if(($relatedSalesTotal ?? 0) > 0) {{ $relatedSalesTotal }} satış @endif
@forelse(($relatedSales ?? collect()) as $sale)
#{{ $sale->sale_code }} {{ $sale->customer?->full_name ?: 'Müşterisiz' }} {{ $sale->status_label }} · {{ $sale->created_at?->format('d.m.Y') }} {{ number_format((float) $sale->total_amount, 2, ',', '.') }}{{ $sale->currency }} @if($sale->customer_id) @endif
@empty
Henüz bir satışa eklenmemiş Satış kartındaki Ürün & Hizmet Kataloğu → Ekstra Hizmetler sekmesinden eklendiğinde burada listelenir.
@endforelse @if(($relatedSalesTotal ?? 0) > ($relatedSales ?? collect())->count())
Son {{ ($relatedSales ?? collect())->count() }} satış gösteriliyor — toplam {{ $relatedSalesTotal }} satışta kullanılmış.
@endif
{{-- ── AYARLAR ── --}}
@include('components.quick-view.ledger-card', ['card' => [ 'title' => 'Ayarlar', 'icon' => 'fa-cog', 'url' => $uf, 'class' => 'pfx-lw', 'note' => 'Pasif hizmetler satış kartındaki Ekstra Hizmetler listesinde görünmez. Ekstra hizmetler bir satış kanalı değildir: tek başına satılmaz, mevcut bir satışa ek kalem olarak eklenir.', 'sections' => [ ['title' => 'Durum & Sıralama', 'icon' => 'fa-toggle-on', 'rows' => [ $row('Aktif', 'is_active', $service->is_active ? '1' : '0', $service->is_active ? 'Evet' : 'Hayır', ['type' => 'select', 'options' => $boolOptions]), $row('Liste Sırası', 'sort_order', $service->sort_order, $service->sort_order === null ? '' : (string) $service->sort_order, ['type' => 'number', 'mono' => true, 'ph' => '0']), ]], ], ]]) @include('components.quick-view.ledger-card', ['card' => [ 'title' => 'Kayıt Bilgileri', 'icon' => 'fa-clock-rotate-left', 'class' => 'pfx-lw', 'sections' => [ ['title' => 'Sistem', 'icon' => 'fa-database', 'muted' => true, 'rows' => [ $row('Hizmet No', null, '#' . ($service->code ?? $service->id), null, ['mono' => true]), $row('Oluşturan', null, $service->creator?->name), $row('Oluşturma', null, $service->created_at?->format('d.m.Y H:i'), null, ['mono' => true]), $row('Son Güncelleme', null, $service->updated_at?->format('d.m.Y H:i'), null, ['mono' => true]), ]], ], ]]) {{-- Geri alınamaz işlem: defter dilinde, ama kırmızı kıl payı çizgiyle ayrışır --}}
Hizmeti Sil

Silinen hizmet satış ekranındaki listede görünmez. Geçmiş satışlardaki kalemler etkilenmez — tutarlar olduğu gibi kalır.

{{-- Silme sonrası kayıt yok: quick-view yenilenemez, drawer kapatılıp liste tazelenir --}}
@once @endonce {{-- Ortak ledger stil + davranış (bir kez bağlanır) --}} @include('components.quick-view.ledger-ui') @include('agency.products._quick-view-styles') @include('agency.products._quick-view-crud-script')