@extends('layouts.app') @php use Illuminate\Support\Facades\Storage; @endphp @section('content')
Ringkasan Hari Ini

Home

Pantau kehadiran, catat aktivitas khusus, dan lihat validasi terbaru dalam satu tampilan yang nyaman dibaca.

@if (session('status'))

Sukses

{{ session('status') }}

@endif @if ($errors->has('absensi'))

Peringatan

{{ $errors->first('absensi') }}

@if($errors->has('show_confirm_button'))
@csrf Batal
@endif
@endif @if ($errors->any())

Periksa kembali

@endif @php $clockInDisabled = isset($canClockIn) ? ! $canClockIn : false; $clockOutDisabled = isset($canClockOut) ? ! $canClockOut : false; $specialDisabled = isset($canMarkSpecial) ? ! $canMarkSpecial : false; $todayClock = $todayAttendance?->clock_in?->timezone(config('app.timezone')); $todayClockOut = $todayAttendance?->clock_out?->timezone(config('app.timezone')); $todayStatus = $todayAttendance?->status; $openClockLabel = $openClockInTime?->format('H:i'); @endphp
00:00:00
@csrf

Selfie Masuk

Ambil foto langsung atau unggah manual sebelum absen.

Preview selfie

Tekan "Buka Kamera" lalu "Ambil Foto" untuk mengambil selfie.

@if($clockInDisabled)

Anda sudah memiliki absensi untuk hari ini @if($todayClock) (masuk {{ $todayClock->format('H:i') }}{{ $todayClockOut ? ', keluar ' . $todayClockOut->format('H:i') : '' }}). @elseif(isset($openClockLabel)) sejak {{ $openClockLabel }}. @endif

@endif
@csrf

Absen Keluar

Klik tombol ini ketika selesai bekerja.

@if($clockOutDisabled)

Belum ada absensi masuk yang perlu ditutup.

@elseif($openClockInTime)

Absensi masuk dibuka {{ $openClockInTime->format('H:i') }}. Jangan lupa tutup sebelum membuat absensi baru.

@endif
@csrf

Catatan Sakit

Gunakan ketika tidak masuk karena alasan kesehatan.

@if($specialDisabled)

Absensi khusus hanya bisa dibuat jika belum ada absensi di hari ini.

@endif
@csrf

Catatan Izin

Informasikan alasan izin tanpa hadir di kantor.

@if($specialDisabled)

Absensi izin hanya tersedia ketika belum ada absensi hari ini.

@endif
Validasi Benar

Absensi Diterima

Total data yang diterima: {{ number_format($verifiedCount ?? 0) }}

Pastikan Anda menekan tombol Absen Masuk dan Absen Keluar dalam satu hari kerja agar status tercatat sebagai Benar.

Validasi Ditolak

Absensi Tidak Diterima

Total data yang ditolak: {{ number_format($rejectedCount ?? 0) }}

Jika salah satu dari absen masuk atau keluar belum dilakukan, data akan ditandai Tidak Diterima. Lengkapi keduanya untuk menghindari penolakan.

Export CSV
@php $selectedDate = now()->toDateString(); if (isset($items) && count($items) > 0) { $sampleItem = $items[0] ?? null; if ($sampleItem && $sampleItem->clock_in) { $selectedDate = $sampleItem->clock_in->toDateString(); } } $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; }; @endphp
@forelse ($items as $i => $row) @php $in = $row->clock_in ? $row->clock_in->timezone(config('app.timezone')) : null; $out = $row->clock_out ? $row->clock_out->timezone(config('app.timezone')) : null; $minutes = ($in && $out) ? $out->diffInMinutes($in) : 0; $dur = $minutes ? sprintf('%02d jam %02d mnt', intdiv($minutes,60), $minutes%60) : '-'; @endphp @php $status = $effectiveStatus($row); @endphp @php $isVerified = $row->is_verified; $statusLower = $status; $verifyClass = $isVerified ? 'pill-success' : 'pill-danger'; if ($statusLower === 'sakit') { $verifyClass = 'pill-warning'; } elseif ($statusLower === 'izin') { $verifyClass = 'pill-info'; } @endphp @php $userNote = $row->note ? trim($row->note) : null; @endphp @php $adminNote = $row->admin_note ? trim($row->admin_note) : null; @endphp @empty @endforelse
# Tanggal Masuk Keluar Durasi Status Validasi Jobdesk Catatan Pegawai Catatan Admin Selfie Aksi
{{ $items->firstItem() + $i }} {{ $row->clock_in ? $row->clock_in->timezone(config('app.timezone'))->format('d M Y') : '-' }} {{ $row->clock_in ? $row->clock_in->timezone(config('app.timezone'))->format('H:i') : '-' }} {{ $row->clock_out ? $row->clock_out->timezone(config('app.timezone'))->format('H:i') : '-' }}{{ $dur }}{{ strtoupper($status) }} @php // Asumsi $item->clock_in dan $item->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 {{ $row->jobdesk ? strtoupper($row->jobdesk) : 'Belum ditetapkan' }} {{ $userNote ?? 'Tidak ada catatan pegawai' }} {{ $adminNote ?? 'Tidak ada catatan admin' }} @php $selfieRoute = null; if ($row->selfie_photo) { $basename = basename($row->selfie_photo); $selfieRoute = route('selfie.show', ['filename' => $basename]); } $hasLocation = $row->clock_in_latitude && $row->clock_in_longitude; @endphp
@if($selfieRoute) @else
Tidak ada selfie
@endif
@if($hasLocation)
Lat {{ number_format($row->clock_in_latitude, 6) }}
Lon {{ number_format($row->clock_in_longitude, 6) }}
Akurasi {{ $row->clock_in_accuracy ? round($row->clock_in_accuracy) . 'm' : '-' }}
Lokasi {{ $row->clock_in_location_name ?? '-' }}
@endif
Edit
Belum ada data absensi.
{{ $items->links() }}
@endsection