@php $date = $payload['date'] ?? now()->format('Y-m-d'); $groupBy = $payload['group_by'] ?? 'employee'; $groups = collect($payload['groups'] ?? []); $itemsByGroup = collect($payload['items'] ?? [])->groupBy('group'); $markersByGroup = collect($payload['attendance_markers'] ?? [])->groupBy('group'); $splByGroup = collect($payload['spl_backgrounds'] ?? [])->groupBy('group'); $badges = $payload['group_badges'] ?? []; $blocked = $payload['blocked_groups'] ?? []; $missing = $payload['missing_segment_groups'] ?? []; $stats = $payload['stats'] ?? []; $onlySpl = !empty($payload['only_spl']); $onlyMissing = !empty($payload['only_missing']); $toPct = function (?string $dateTime): float { if (!$dateTime) { return 0.0; } $ts = strtotime($dateTime); if ($ts === false) { return 0.0; } $minutes = ((int) date('G', $ts) * 60) + (int) date('i', $ts); return round(($minutes / 1440) * 100, 4); }; $widthPct = function (?string $start, ?string $end) use ($toPct): float { return max(0.35, round($toPct($end) - $toPct($start), 4)); }; $styleValue = function (string $style, string $key, string $default = ''): string { if (preg_match('/' . preg_quote($key, '/') . '\s*:\s*([^;]+)/i', $style, $matches)) { return trim($matches[1]); } return $default; }; $hourLabels = [0, 4, 8, 12, 16, 20, 24]; @endphp

Project Job Timeline

Tanggal: {{ $date }} | Mode: {{ $groupBy === 'job' ? 'Per No Job' : 'Per Karyawan' }}
Filter: SPL {{ $onlySpl ? 'ON' : 'OFF' }} | Missing {{ $onlyMissing ? 'ON' : 'OFF' }}
Total Segmen
{{ $stats['segments'] ?? 0 }}
Total Karyawan
{{ $stats['employees'] ?? 0 }}
Total No Job
{{ $stats['jobs'] ?? 0 }}
Missing Segment
{{ $stats['missing_segments'] ?? 0 }}
Check In Check Out SPL Approved Hadir tanpa segmen
@forelse($groups as $group) @php $groupId = $group['id']; $rowItems = $itemsByGroup->get($groupId, collect()); $rowMarkers = $markersByGroup->get($groupId, collect()); $rowSpl = $splByGroup->get($groupId, collect()); $rowBadges = $badges[$groupId] ?? ['segments' => 0, 'spl' => 0, 'missing' => false]; $isBlocked = isset($blocked[$groupId]); $isMissing = isset($missing[$groupId]); @endphp @empty @endforelse
{{ $groupBy === 'job' ? 'No Job' : 'Karyawan' }} Timeline Harian
{{ $group['content'] ?? '-' }}
Seg: {{ $rowBadges['segments'] ?? 0 }} @if(($rowBadges['spl'] ?? 0) > 0) SPL: {{ $rowBadges['spl'] }} @endif @if($isBlocked) CUTI @endif @if($isMissing) BELUM ADA SEGMEN @endif
@foreach($hourLabels as $hour) @php $left = round(($hour / 24) * 100, 4); @endphp
@if($hour < 24)
{{ sprintf('%02d:00', $hour) }}
@endif @endforeach @foreach($rowSpl as $spl)
@endforeach @foreach($rowItems as $item) @php $bg = $item['palette']['bg'] ?? $styleValue($item['style'] ?? '', 'background', 'rgba(59,130,246,0.18)'); $border = $item['palette']['border'] ?? $styleValue($item['style'] ?? '', 'border-color', '#2563eb'); $text = $item['palette']['text'] ?? $styleValue($item['style'] ?? '', 'color', '#1e3a8a'); @endphp
{{ $item['content'] ?? '-' }}
@endforeach @foreach($rowMarkers as $marker) @php $left = $toPct($marker['start'] ?? null); $markerClass = str_contains((string) ($marker['className'] ?? ''), 'out-marker') ? 'out' : 'in'; @endphp
@endforeach @if($rowItems->isEmpty() && $isMissing)
Hadir, tetapi belum ada segmen No Job
@endif
Tidak ada data timeline pada filter ini.