@extends('layouts.app') @php use Illuminate\Support\Str; use Illuminate\Support\Carbon; @endphp @push('head') @endpush @section('content') @php $currentItems = collect($items->items()); $totalRecords = $items->total(); $selectedDate = $filterDate; $effectiveStatus = function ($row) use ($selectedDate) { $status = strtolower($row->status ?? ''); if (in_array($status, ['sakit', 'izin'], true)) { return $status; } if ($selectedDate === '2026-04-18') { return 'hadir'; } return $status; }; $hadirCount = $currentItems->filter(fn ($row) => $effectiveStatus($row) === 'hadir')->count(); $izinSakitCount = $currentItems->filter(fn ($row) => in_array($effectiveStatus($row), ['izin', 'sakit'], true))->count(); $unverifiedCount = $currentItems->filter(fn ($row) => ! $row->is_verified)->count(); $completeAdminData = $currentItems->filter(fn ($row) => filled($row->jobdesk) && filled($row->admin_note))->count(); @endphp
Dashboard Admin

Data Absensi

Pantau rekaman kehadiran, validasi, serta catatan admin dalam satu tampilan yang rapi dan responsif.

Total Riwayat {{ number_format($totalRecords) }} Seluruh data absensi tersimpan
Hadir (Halaman Ini) {{ $hadirCount }} Pegawai berstatus hadir
Izin / Sakit {{ $izinSakitCount }} Perlu perhatian lanjutan
Catatan Lengkap {{ $completeAdminData }} Jobdesk & catatan terisi
Belum Tervalidasi {{ $unverifiedCount }} Menunggu verifikasi admin
Reset
Menampilkan {{ $items->firstItem() ?? 0 }}–{{ $items->lastItem() ?? 0 }} Total {{ number_format($totalRecords) }} data Halaman {{ $items->currentPage() }} dari {{ $items->lastPage() }}
@forelse ($items as $i => $row) @php $clockIn = $row->clock_in?->timezone(config('app.timezone')); $clockOut = $row->clock_out?->timezone(config('app.timezone')); $selfiePath = null; if ($row->selfie_photo) { $selfiePath = route('selfie.show', ['filename' => basename($row->selfie_photo)]); } $status = $effectiveStatus($row); $statusClass = match ($status) { 'hadir' => 'absensi-status hadir', 'sakit', 'izin' => 'absensi-status sakit', default => 'absensi-status default', }; $adminNote = $row->admin_note ? trim($row->admin_note) : null; $hasJobdesk = filled($row->jobdesk); $hasAdminNote = filled($adminNote); $hasBoth = $hasJobdesk && $hasAdminNote; $isVerified = (bool) $row->is_verified; $displayDate = $clockIn?->format('d M Y') ?? ($row->clock_in?->format('d M Y') ?? '-'); @endphp @empty @endforelse
# Nama NIK Keahlian Tanggal Masuk Keluar Status Validasi Catatan Admin Selfie Jobdesk & Catatan Aksi
{{ $items->firstItem() + $i }} {{ $row->user->name ?? '-' }} {{ $row->user->nik ?? '-' }} @if(isset($row->user->skill)) @if($row->user->skill === 'mechanic') Mekanik @elseif($row->user->skill === 'welder') Welder @else Belum diatur @endif @else - @endif {{ $displayDate }} {{ $clockIn?->format('H:i') ?? '-' }} {{ $clockOut?->format('H:i') ?? '-' }} {{ strtoupper($status ?: '-') }} @php // Asumsi $absensi->clock_in dan $absensi->clock_out adalah Carbon instance $durasiJam = ($row->clock_in && $row->clock_out) ? $row->clock_in->diffInHours($row->clock_out) : 0; @endphp @if($durasiJam < 12) DITOLAK @else BENAR @endif {{ $adminNote ?? 'Tidak ada catatan admin' }} @php $hasLocation = $row->clock_in_latitude && $row->clock_in_longitude; @endphp
@if ($selfiePath) Selfie Lihat @else Tidak Ada Selfie @endif @if($hasLocation)
Lat {{ number_format($row->clock_in_latitude, 5) }}
Lon {{ number_format($row->clock_in_longitude, 5) }}
Akurasi {{ $row->clock_in_accuracy ? round($row->clock_in_accuracy) . 'm' : '-' }}
Lokasi {{ $row->clock_in_location_name ?? '-' }}
@endif
{{ $hasBoth ? 'Lengkap' : 'Belum Lengkap' }}
@csrf
@if ($status === 'hadir') @else Jobdesk tersedia saat status HADIR @endif
@csrf @method('DELETE')
Belum ada data absensi.
@endsection