@php $pageTitle = 'Reservasi'; $filterActive = $search !== '' || $status || $dari || $sampai; $statusColors = [ 'menunggu_konfirmasi' => 'warning', 'dikonfirmasi' => 'primary', 'check_in' => 'info', 'selesai' => 'success', 'dibatalkan' => 'secondary', ]; $statusServisLabels = $statusServisLabels ?? [ 'menunggu' => 'Menunggu', 'dikerjakan' => 'Dikerjakan', 'selesai' => 'Selesai', 'diambil' => 'Diambil', ]; $statusServisBadges = $statusServisBadges ?? [ 'menunggu' => 'warning', 'dikerjakan' => 'info', 'selesai' => 'success', 'diambil' => 'primary', ]; $whatsappStatusLabels = [ 'menunggu' => 'Menunggu', 'terkirim' => 'Terkirim', 'gagal' => 'Gagal', ]; $whatsappStatusBadges = [ 'menunggu' => 'warning', 'terkirim' => 'success', 'gagal' => 'danger', ]; $statusItems = collect($statusLabels) ->map(fn ($label, $value) => [ 'label' => $label, 'count' => $statusCounts[$value] ?? 0, 'color' => $statusColors[$value] ?? 'secondary', 'url' => route('admin.reservasi.index', ['status' => $value]), 'active' => $status === $value, ]) ->values() ->all(); @endphp @push('styles') @endpush @include('admin.partials.page-head') @include('admin.partials.page-header', [ 'title' => 'Reservasi', 'subtitle' => $subtitle, 'subtitleId' => 'reservasi-subtitle', 'icon' => 'bx bx-calendar-check', ]) @if (! $pusherConfigured)
Notifikasi real-time belum aktif. Halaman ini memakai polling setiap 30 detik. Isi kredensial Pusher di .env lalu ubah BROADCAST_CONNECTION=pusher untuk mengaktifkan notifikasi instan.
@else
Notifikasi real-time Pusher aktif untuk reservasi baru.
@endif
Reset
@forelse ($reservasis as $reservasi) @php $statusValue = $reservasi->status->value; $layananLabel = $reservasi->layanan->pluck('nama')->join(', '); @endphp @empty @endforelse
Daftar reservasi beserta pelanggan, kendaraan, layanan, jadwal, dan statusnya
Kode Pelanggan Kendaraan Layanan Jadwal Status Aksi
{{ $reservasi->kode }}
{{ $reservasi->created_at?->translatedFormat('d M Y H:i') }}
{{ $reservasi->pelanggan?->name ?? '-' }}
{{ $reservasi->pelanggan?->no_hp ?: 'Nomor HP belum diisi' }}
{{ $reservasi->kendaraan?->plat_nomor ?? '-' }}
{{ trim(($reservasi->kendaraan?->merk?->nama ?? '').' '.($reservasi->kendaraan?->model ?? '')) ?: '-' }}
{{ $layananLabel ?: 'Belum ada layanan' }} {{ $reservasi->slot?->tanggal?->translatedFormat('d M Y') ?? '-' }}
{{ $reservasi->slot ? substr($reservasi->slot->jam_mulai, 0, 5).' – '.substr($reservasi->slot->jam_selesai, 0, 5) : '-' }}
{{ $statusLabels[$statusValue] ?? $statusValue }} @if ($statusValue === 'menunggu_konfirmasi')
@csrf @method('PATCH')
@endif @if (in_array($statusValue, ['menunggu_konfirmasi', 'dikonfirmasi'], true)) @endif
@if ($filterActive) Reset @endif
@if ($reservasis->total() > 0) @endif
@foreach ($reservasis as $reservasi) @php $statusValue = $reservasi->status->value; $layananLabel = $reservasi->layanan->pluck('nama')->join(', '); $servis = $reservasi->servis; $servisStatusValue = $servis?->status?->value; $canCheckIn = $statusValue === 'dikonfirmasi' && ! $servis; $canSendCompleted = $servisStatusValue !== null && in_array($servisStatusValue, ['selesai', 'diambil'], true); $canSendReminder = $statusValue === 'selesai' && $canSendCompleted; $nomorWhatsapp = $reservasi->pelanggan?->no_hp; $nomorWhatsappValid = \App\Support\WhatsappLink::normalize($nomorWhatsapp) !== null; $pernahDitolak = $reservasi->whatsappLogs->contains( fn ($log) => $log->jenis?->value === 'penolakan_reservasi' ); $waActions = []; if ($statusValue === 'dikonfirmasi') { $waActions[] = [ 'jenis' => 'konfirmasi_reservasi', 'label' => 'Kirim WA Konfirmasi', 'class' => 'btn-outline-primary', ]; } if ($statusValue === 'dibatalkan' && $pernahDitolak) { $waActions[] = [ 'jenis' => 'penolakan_reservasi', 'label' => 'Kirim WA Penolakan', 'class' => 'btn-outline-danger', ]; } if ($canSendCompleted) { $waActions[] = [ 'jenis' => 'servis_selesai', 'label' => 'Kirim WA Servis Selesai', 'class' => 'btn-outline-success', ]; } if ($canSendReminder) { $waActions[] = [ 'jenis' => 'pengingat_servis', 'label' => 'Kirim WA Pengingat', 'class' => 'btn-outline-success', ]; } @endphp @endforeach
@push('scripts') @endpush @include('admin.partials.modal-auto-open') @include('admin.partials.page-foot')