@php // Hasil pengecekan pada rentang filter: (1) data missing yang belum // dikonfirmasi, (2) status pull finger per status karyawan yang sesuai // dengan cakupan report (belum di-pull / sudah di-pull namun belum lengkap). // Keduanya dikumpulkan dalam $unconfirmed_missing. $unconfirmedMissing = $unconfirmed_missing ?? null; $pullStatus = (array) ($unconfirmedMissing['pull_status'] ?? []); $pullByStatus = (array) ($pullStatus['by_status'] ?? []); $pullNotPulledCount = count((array) ($pullStatus['not_pulled_dates'] ?? [])); $pullIncompleteCount = count((array) ($pullStatus['incomplete_dates'] ?? [])); $hasMissing = !empty($unconfirmedMissing['total_rows']); $hasPullIssue = !empty($pullByStatus); // Status karyawan dalam cakupan report (diisi service/dipakai juga sebagai // konteks pengecekan missing). $selectedStatusIds = $unconfirmedMissing['status_karyawan_ids'] ?? ($filter['status_karyawan_ids'] ?? []); $alertTitles = []; $hideConditions = []; if ($hasPullIssue) { $alertTitles[] = 'Status Pull Finger Belum Lengkap'; $hideConditions[] = count($selectedStatusIds) === 1 ? 'seluruh tanggal pada rentang filter sudah di-pull (lengkap)' : 'seluruh tanggal pada rentang filter sudah di-pull (lengkap) untuk status karyawan pada filter'; } if ($hasMissing) { $alertTitles[] = 'Data Missing Belum Dikonfirmasi'; $hideConditions[] = 'seluruh data missing yang belum dikonfirmasi sudah dikonfirmasi'; } // Nama status karyawan terpilih, sebagai konteks pengecekan missing. $statusNamesById = collect($status_karyawan_options ?? [])->mapWithKeys(function ($status) { return [(string) $status->id => (string) $status->nama]; }); $selectedStatusNames = collect($selectedStatusIds) ->map(fn ($id) => $statusNamesById[(string) $id] ?? ('Status ' . $id)) ->values(); // Batas badge tanggal yang ditampilkan per status (sisanya "+N tanggal"). $maxShownDates = 12; // Rincian per status hanya ditampilkan bila cakupan report berisi lebih dari // satu status. Bila hanya satu status, cukup tampilkan daftar tanggalnya // tanpa penjelasan per status. $selectedStatusCount = count($selectedStatusIds); $showPullDetail = $selectedStatusCount !== 1; // Tanggal yang masih bermasalah, digabung jadi satu daftar (tidak dipisah // antara "belum di-pull" dan "belum lengkap") - dipakai saat hanya satu // status dalam cakupan report. $pullProblemDates = array_values(array_unique(array_merge( (array) ($pullStatus['not_pulled_dates'] ?? []), (array) ($pullStatus['incomplete_dates'] ?? []) ))); sort($pullProblemDates); // Blok per status hanya disiapkan bila rincian ditampilkan (>1 status). $pullSections = []; if ($showPullDetail) { foreach ($pullByStatus as $row) { $pullSections[] = [ 'title' => $row['status'], 'not_pulled' => $row['not_pulled'], 'incomplete' => $row['incomplete'], ]; } } @endphp @if ($hasMissing || $hasPullIssue) {{-- Banner info berbentuk CARD (bukan .alert) yang TETAP tampil selama masih ada status pull yang belum lengkap ATAU data missing yang belum dikonfirmasi, dan baru hilang ketika keduanya sudah bersih. Sengaja tanpa kelas "alert" agar tidak ikut tertutup otomatis oleh auto-close alert global di layouts/app.blade.php, dan sengaja tanpa auto-dismiss. Tombol X hanya menutup banner bila diklik user. Dipakai bersama oleh report rptovr (rekap kehadiran) dan rptabs (report absensi). --}}
Perhatian : {{ implode(' & ', $alertTitles) }}
@if ($hasPullIssue)

Pemeriksaan status pull finger pada periode {{ date('d/m/Y', strtotime($unconfirmedMissing['tanggal_mulai'])) }} s/d {{ date('d/m/Y', strtotime($unconfirmedMissing['tanggal_akhir'])) }} @if ($showPullDetail) (dihitung per status karyawan sesuai filter @if ($selectedStatusNames->isNotEmpty()) : {{ $selectedStatusNames->implode(', ') }} @endif ) @endif : @if ($showPullDetail) {{ $pullNotPulledCount }} tanggal belum di-pull, {{ $pullIncompleteCount }} tanggal sudah di-pull namun belum lengkap. @else {{ count($pullProblemDates) }} tanggal belum lengkap (belum di-pull atau sudah di-pull namun belum lengkap). @endif

@endif @if (! $showPullDetail) {{-- Hanya satu status dalam cakupan: seluruh tanggal yang bermasalah digabung dalam satu baris badge. --}}
@foreach (array_slice($pullProblemDates, 0, $maxShownDates) as $tanggal) {{ date('d/m/Y', strtotime($tanggal)) }} @endforeach @if (count($pullProblemDates) > $maxShownDates) +{{ count($pullProblemDates) - $maxShownDates }} tanggal lainnya @endif
@endif @foreach ($pullSections as $section)
{{ $section['title'] }}
@if (!empty($section['not_pulled']))
Belum di-pull ({{ count($section['not_pulled']) }}) : @foreach (array_slice($section['not_pulled'], 0, $maxShownDates) as $tanggal) {{ date('d/m/Y', strtotime($tanggal)) }} @endforeach @if (count($section['not_pulled']) > $maxShownDates) +{{ count($section['not_pulled']) - $maxShownDates }} tanggal lainnya @endif
@endif @if (!empty($section['incomplete']))
Sudah di-pull, belum lengkap ({{ count($section['incomplete']) }}) : @foreach (array_slice($section['incomplete'], 0, $maxShownDates) as $tanggal) {{ date('d/m/Y', strtotime($tanggal)) }} @endforeach @if (count($section['incomplete']) > $maxShownDates) +{{ count($section['incomplete']) - $maxShownDates }} tanggal lainnya @endif
@endif
@endforeach @if ($hasMissing && $hasPullIssue)
@endif @if ($hasMissing)

Ditemukan {{ number_format($unconfirmedMissing['total_rows'], 0, ',', '.') }} data missing ({{ number_format($unconfirmedMissing['total_statuses'], 0, ',', '.') }} status) pada periode {{ date('d/m/Y', strtotime($unconfirmedMissing['tanggal_mulai'])) }} s/d {{ date('d/m/Y', strtotime($unconfirmedMissing['tanggal_akhir'])) }} untuk @if ($selectedStatusNames->isNotEmpty()) status karyawan {{ $selectedStatusNames->implode(', ') }} @else semua status karyawan @endif yang masih belum dikonfirmasi.

@if (!empty($unconfirmedMissing['by_status']))
@foreach ($unconfirmedMissing['by_status'] as $label => $jumlah) {{ $label }} : {{ number_format($jumlah, 0, ',', '.') }} @endforeach
@endif @endif

Banner ini tetap tampil sampai {{ implode(' dan ', $hideConditions) }}. @if ($hasMissing) Konfirmasi data missing melalui menu Data Missing. @endif @if ($hasPullIssue) Lakukan pull finger untuk status karyawan di atas (menu Pull Finger), pilih tanggal yang ditandai, lalu ulangi pull hingga Lengkap. @endif

@endif