Total Hire, Hadir, Leave, Shift, Alpha

@if ($builderMode)
@endif
@php $dates = is_array($dashSeries['dates'] ?? null) ? $dashSeries['dates'] : []; $areaPayload = is_array($dashAreaSeries ?? null) ? $dashAreaSeries : []; $morningSeries = is_array($dashSeriesMorning ?? null) ? $dashSeriesMorning : []; $hireCounts = is_array(data_get($areaPayload, 'chart.employee_counts_by_date')) ? data_get($areaPayload, 'chart.employee_counts_by_date') : []; $mOnTime = is_array($morningSeries['checkin_ontime'] ?? null) ? $morningSeries['checkin_ontime'] : []; $mLatePre = is_array($morningSeries['checkin_late_precheck'] ?? null) ? $morningSeries['checkin_late_precheck'] : []; $mLateGrace = is_array($morningSeries['checkin_late_grace'] ?? null) ? $morningSeries['checkin_late_grace'] : []; $mNonShift = is_array($morningSeries['checkin_nonshift'] ?? null) ? $morningSeries['checkin_nonshift'] : []; $mLembur = is_array($morningSeries['checkin_lembur'] ?? null) ? $morningSeries['checkin_lembur'] : []; $mCuti = is_array($morningSeries['cuti'] ?? null) ? $morningSeries['cuti'] : []; $mSick = is_array($morningSeries['sick'] ?? null) ? $morningSeries['sick'] : []; $mAlpha = is_array($morningSeries['missing_checkin_due'] ?? null) ? $morningSeries['missing_checkin_due'] : []; $mWaitingShift = is_array($morningSeries['waiting_shift'] ?? null) ? $morningSeries['waiting_shift'] : []; $dayCount = max(1, count($dates)); $sumArray = fn ($arr) => array_sum(array_map(fn ($v) => (float) $v, is_array($arr) ? $arr : [])); $avgHire = round($sumArray($hireCounts) / $dayCount); $avgHadir = round(($sumArray($mOnTime) + $sumArray($mLatePre) + $sumArray($mLateGrace) + $sumArray($mNonShift) + $sumArray($mLembur)) / $dayCount); $avgLeave = round(($sumArray($mCuti) + $sumArray($mSick)) / $dayCount); $avgAlpha = round($sumArray($mAlpha) / $dayCount); $avgWaitingShift = round($sumArray($mWaitingShift) / $dayCount); $rateBase = max(1, $avgHire); $avgHadirPct = round(($avgHadir / $rateBase) * 100, 1); $avgLeavePct = round(($avgLeave / $rateBase) * 100, 1); $avgAlphaPct = round(($avgAlpha / $rateBase) * 100, 1); $workdayCount = (int) ($areaPayload['workday_count'] ?? 0); $weekendCount = (int) ($areaPayload['weekend_count'] ?? 0); $holidayCount = (int) ($areaPayload['holiday_count'] ?? 0); $holidaySpecialCount = (int) ($areaPayload['holiday_special_count'] ?? 0); @endphp
Attendance Overview
Daily Attendance Summary
Rata-rata Total Hire / Day
{{ number_format($avgHire) }}
Rata-rata Total Hadir / Day
{{ number_format($avgHadir) }} {{ number_format($avgHadirPct, 1) }}%
Rata-rata Leave / Day
{{ number_format($avgLeave) }} {{ number_format($avgLeavePct, 1) }}%
Rata-rata Tidak Hadir / Day
{{ number_format($avgAlpha) }} {{ number_format($avgAlphaPct, 1) }}%
Per Tanggal - klik grafik untuk detail
LEGENDA
Summary
Total Hire
Hadir
Hadir Weekend/Holiday
Leave
Waiting Shift
Shift Belum Selesai
Belum Mulai Kerja
Alpha
Perlu Verifikasi
Tanggal
Weekend
Holiday
Special Holiday

Drilldown
Klik grafik untuk melihat Shift, Non Shift, Cuti, Sakit, Tidak ada log valid, dan Perlu Verifikasi.
Rumus Validasi Harian
Total Hire per Day = Total Hadir + Leave + Tidak Hadir
Rincian Total Hadir
Ontime + Telat Grace + Telat Potongan Salary + Hadir Non Shift + Hadir Off-day/Lembur
{{ $dates[0] ?? '-' }} {{ $dates[count($dates) - 1] ?? '-' }}

Klik bar pada tanggal di grafik untuk menampilkan detail per-area.
Workday per Area (Waiting Shift, Alpha, Cuti, Sakit, Hadir, Telat)
Off-day per Area: Kehadiran dianggap Lembur
Catatan: weekend/holiday tidak dihitung sebagai alpha/cuti/sakit. Jika ada kehadiran di off-day, itu masuk lembur.
@foreach ((array) ($areaPayload['areas'] ?? []) as $r) @php $w = is_array($r['workday'] ?? null) ? $r['workday'] : []; $we = is_array($r['weekend'] ?? null) ? $r['weekend'] : []; $h = is_array($r['holiday'] ?? null) ? $r['holiday'] : []; $hs = is_array($r['holiday_special'] ?? null) ? $r['holiday_special'] : []; @endphp @endforeach
Area Karyawan Shift (Planned) Alpha (WD) Perlu Verifikasi (WD) Cuti (WD) Sakit (WD) Not Paid (WD) Hadir Shift (WD) Telat Precheck (WD) Telat Grace (WD) Hadir NonShift (WD) Lembur Weekend Telat Weekend (P/G) Lembur Holiday Telat Holiday (P/G) Lembur Holiday Special Telat H-Special (P/G)
{{ $r['label'] ?? '-' }} {{ number_format((int) ($r['employees'] ?? 0)) }} {{ number_format((int) ($w['shift_planned'] ?? 0)) }} {{ number_format((int) ($w['alpha'] ?? 0)) }} {{ number_format((int) ($w['verify'] ?? 0)) }} {{ number_format((int) ($w['cuti'] ?? 0)) }} {{ number_format((int) ($w['sick'] ?? 0)) }} {{ number_format((int) ($w['leave_no_pay'] ?? 0)) }} {{ number_format((int) ($w['hadir_shift'] ?? 0)) }} {{ number_format((int) ($w['late_precheck'] ?? 0)) }} {{ number_format((int) ($w['late_grace'] ?? 0)) }} {{ number_format((int) ($w['hadir_nonshift'] ?? 0)) }} {{ number_format((int) ($we['hadir'] ?? 0)) }} {{ number_format((int) ($we['late_precheck'] ?? 0)) }}/{{ number_format((int) ($we['late_grace'] ?? 0)) }} {{ number_format((int) ($h['hadir'] ?? 0)) }} {{ number_format((int) ($h['late_precheck'] ?? 0)) }}/{{ number_format((int) ($h['late_grace'] ?? 0)) }} {{ number_format((int) ($hs['hadir'] ?? 0)) }} {{ number_format((int) ($hs['late_precheck'] ?? 0)) }}/{{ number_format((int) ($hs['late_grace'] ?? 0)) }}
@include('dashboard.partials.individual-record')

Total Jam

@if ($builderMode)
@endif
@php $hours = is_array($dashSeries['hours'] ?? null) ? $dashSeries['hours'] : []; $maxHours = 0.0; foreach ($hours as $v) { $maxHours = max($maxHours, (float) $v); } if ($maxHours <= 0) $maxHours = 1.0; @endphp
{{ number_format((float) ($dashTotals['hours'] ?? 0), 2) }}
jam
@foreach ($hours as $idx => $v) @php $val = (float) $v; $pct = max(0, min(100, round(($val / $maxHours) * 100, 2))); $barPayload = ['kind' => 'hours', 'date' => $dates[$idx] ?? null, 'hours' => $val, 'max' => $maxHours]; @endphp
{{ $val > 0 ? number_format($val, 2) : '' }}
@endforeach

Total Salary (Net)

@if ($builderMode)
@endif
@php $salary = is_array($dashSeries['salary'] ?? null) ? $dashSeries['salary'] : []; $maxSalary = 0.0; foreach ($salary as $v) { $maxSalary = max($maxSalary, (float) $v); } if ($maxSalary <= 0) $maxSalary = 1.0; @endphp
Rp {{ number_format((float) ($dashTotals['salary_net'] ?? 0), 0, ',', '.') }}