@php $detailRows = $serviceOrder->sparparts->count() + $serviceOrder->charges->count(); $hasNotes = $serviceOrder->diagnosis || $serviceOrder->technician_notes; $isLargeDoc = $detailRows > 3 || ($detailRows > 1 && $hasNotes); $paperLabel = $isLargeDoc ? 'A4 lebih nyaman untuk detail banyak' : 'A5 ideal untuk servis ringkas'; $paperNote = $isLargeDoc ? 'Template tidak mengunci ukuran kertas. Untuk detail servis yang panjang, A4 biasanya paling aman; margin, orientasi, dan skala tetap bisa Anda atur sendiri di browser.' : 'Untuk nota servis sederhana, A5 biasanya paling pas. Jika detail bertambah, Anda bisa cetak ke A4 atau menyesuaikan skala tanpa mengubah layout inti.'; $rawAppName = $settings['app_name'] ?? 'GMComp'; $brandedAppName = preg_replace_callback('/GMComp/i', function ($m) { return 'GMComp'; }, htmlspecialchars($rawAppName, ENT_QUOTES, 'UTF-8')); $statusClass = 's-antri'; if ($serviceOrder->status === 'selesai') { $statusClass = 's-selesai'; } elseif (in_array($serviceOrder->status, ['dalam_perbaikan', 'siap_diambil', 'menunggu_sparepart'])) { $statusClass = 's-proses'; } $spTotal = $serviceOrder->sparparts->sum('subtotal'); $chTotal = $serviceOrder->charges->sum('amount'); $final = $serviceOrder->final_cost ?? $serviceOrder->calculateFinalCost(); $change = (float) ($serviceOrder->change_amount ?? 0); $paid = $serviceOrder->payment ? $serviceOrder->payment->amount : null; $paidShow = $change > 0 ? ($final + $change) : ($paid ?? $final); @endphp
{{-- HEADER --}}
{!! $brandedAppName !!}
@if(!empty($settings['app_address'])){{ $settings['app_address'] }}
@endif @if(!empty($settings['app_phone']))Telp: {{ $settings['app_phone'] }}@if(!empty($settings['app_email']))  |  {{ $settings['app_email'] }}@endif @endif
Nota Servis
{{ $serviceOrder->order_number }}
Masuk: {{ $serviceOrder->received_at->format('d/m/Y H:i') }} WIB @if($serviceOrder->estimated_finish) — Est. Selesai: {{ $serviceOrder->estimated_finish->format('d/m/Y') }} @endif
{{ $serviceOrder->status_label }}
{{-- TOP 2-COLUMN: Pelanggan+Perangkat | Transaksi+Ringkasan --}}
{{-- LEFT: Pelanggan & Perangkat --}}
Data Pelanggan & Perangkat
Pelanggan {{ $serviceOrder->customer?->name }}
@if($serviceOrder->customer?->phone)
Telepon {{ $serviceOrder->customer->phone }}
@endif
Perangkat {{ $serviceOrder->device_type }}{{ $serviceOrder->device_brand ? ' '.$serviceOrder->device_brand : '' }}
@if($serviceOrder->device_model)
Model {{ $serviceOrder->device_model }}
@endif @if($serviceOrder->serial_number)
S/N {{ $serviceOrder->serial_number }}
@endif @if($serviceOrder->device_condition)
Kondisi Fisik {{ $serviceOrder->device_condition }}
@endif @if($serviceOrder->accessories)
Kelengkapan {{ $serviceOrder->accessories }}
@endif
{{-- RIGHT: Transaksi info + Ringkasan Biaya --}}
Transaksi & Ringkasan Biaya
Teknisi {{ $serviceOrder->technician?->name ?? '-' }}
Diterima oleh {{ $serviceOrder->receivedBy?->name ?? '-' }}
Est. Biaya Awal Rp {{ number_format($serviceOrder->estimated_cost ?? 0, 0, ',', '.') }}
@if($spTotal > 0)
Sparepart Rp {{ number_format($spTotal, 0, ',', '.') }}
@endif @if($chTotal > 0)
Biaya Servis Rp {{ number_format($chTotal, 0, ',', '.') }}
@endif
TOTAL Rp {{ number_format($final, 0, ',', '.') }}
@if($serviceOrder->payment)
Dibayar ({{ ucfirst($serviceOrder->payment->payment_method) }}) Rp {{ number_format($paidShow, 0, ',', '.') }}
@if($change > 0)
Kembalian Rp {{ number_format($change, 0, ',', '.') }}
@endif @else
Belum Dibayar -
@endif
{{-- .top-grid --}} {{-- KELUHAN --}}
Keluhan Pelanggan
{{ $serviceOrder->complaint }}
{{-- DIAGNOSA & TINDAKAN --}} @if($serviceOrder->diagnosis)
Diagnosa & Tindakan
{{ $serviceOrder->diagnosis->diagnosis }}
@if($serviceOrder->diagnosis->action_plan)
{{ $serviceOrder->diagnosis->action_plan }}
@endif
@endif @if($serviceOrder->technician_notes)
Catatan Teknisi
{{ $serviceOrder->technician_notes }}
@endif {{-- SPAREPART TABLE --}} @if($serviceOrder->sparparts->count() > 0)
Sparepart Digunakan
@foreach($serviceOrder->sparparts as $i => $sp) @endforeach
# Nama Sparepart Qty Harga Subtotal
{{ $i + 1 }} {{ $sp->product?->name }} {{ $sp->quantity }} Rp {{ number_format($sp->unit_price, 0, ',', '.') }} Rp {{ number_format($sp->subtotal, 0, ',', '.') }}
@endif {{-- BIAYA SERVIS TABLE --}} @if($serviceOrder->charges->count() > 0)
Biaya Jasa Servis
@foreach($serviceOrder->charges as $i => $ch) @endforeach
# Keterangan Jumlah
{{ $i + 1 }} {{ $ch->description }} Rp {{ number_format($ch->amount, 0, ',', '.') }}
@endif {{-- GARANSI --}}
Garansi Servis: {{ $serviceOrder->warranty_service_days }} hari Garansi Sparepart: {{ $serviceOrder->warranty_part_days }} hari
{{-- SIGNATURES --}}
Penerima / Pelanggan
{{ $serviceOrder->customer?->name }}
Teknisi / Petugas
{{ $serviceOrder->technician?->name ?? ($settings['app_name'] ?? 'GMComp') }}
{{-- FOOTER --}} @php $footerText = $settings['receipt_footer'] ?? ('Terima kasih atas kepercayaan Anda — ' . ($settings['app_name'] ?? 'GMComp')); @endphp
{{-- .page --}}
{{-- .screen-wrap --}}