feat: dukung status PKL/Magang (pkl) dari e-jurnal — validasi sync + pkl; rekap mingguan/bulanan kolom P; export Excel kolom P; warna selaras e-jurnal (S=amber, P=violet)

This commit is contained in:
Novy San87
2026-08-22 20:10:34 +07:00
parent f7adecc22c
commit 25da284ca2
53 changed files with 201478 additions and 251 deletions
+35 -20
View File
@@ -144,8 +144,9 @@
$color = match($status) {
'hadir' => 'text-emerald-600 bg-emerald-50',
'alpha' => 'text-red-600 bg-red-50',
'sakit' => 'text-purple-600 bg-purple-50',
'sakit' => 'text-amber-600 bg-amber-50',
'izin' => 'text-blue-600 bg-blue-50',
'pkl' => 'text-violet-600 bg-violet-50',
'terlambat' => 'text-yellow-600 bg-yellow-50',
default => 'text-gray-300',
};
@@ -154,6 +155,7 @@
'alpha' => 'A',
'sakit' => 'S',
'izin' => 'I',
'pkl' => 'P',
'terlambat' => 'T',
default => '-',
};
@@ -172,7 +174,8 @@
<div class="px-5 py-3 border-t border-gray-100 bg-gray-50/50 text-xs text-gray-400 text-center flex items-center justify-center gap-4">
<span><span class="inline-block w-7 h-7 rounded-lg bg-emerald-50 text-emerald-600 text-center text-xs font-bold">H</span> Hadir</span>
<span><span class="inline-block w-7 h-7 rounded-lg bg-red-50 text-red-600 text-center text-xs font-bold">A</span> Alpha</span>
<span><span class="inline-block w-7 h-7 rounded-lg bg-purple-50 text-purple-600 text-center text-xs font-bold">S</span> Sakit</span>
<span><span class="inline-block w-7 h-7 rounded-lg bg-amber-50 text-amber-600 text-center text-xs font-bold">S</span> Sakit</span>
<span><span class="inline-block w-7 h-7 rounded-lg bg-violet-50 text-violet-600 text-center text-xs font-bold">P</span> PKL</span>
<span><span class="inline-block w-7 h-7 rounded-lg bg-blue-50 text-blue-600 text-center text-xs font-bold">I</span> Izin</span>
<span><span class="inline-block w-7 h-7 rounded-lg bg-yellow-50 text-yellow-600 text-center text-xs font-bold">T</span> Terlambat</span>
</div>
@@ -226,7 +229,7 @@
<span class="text-[10px] text-gray-400 font-normal">{{ \Carbon\Carbon::parse($row['date'])->format('d/m') }}</span>
</th>
@endforeach
<th colspan="4" class="px-3 py-2 text-center text-xs font-semibold text-gray-800 uppercase tracking-wider border-b border-slate-200 border-l-2 border-gray-400 bg-gray-100/80">
<th colspan="5" class="px-3 py-2 text-center text-xs font-semibold text-gray-800 uppercase tracking-wider border-b border-slate-200 border-l-2 border-gray-400 bg-gray-100/80">
TOTAL<br>
<span class="text-[10px] text-gray-500 font-normal">Hari</span>
</th>
@@ -237,14 +240,16 @@
$sep = !$loop->last ? 'border-r-2 border-gray-300' : '';
@endphp
<th class="px-2 py-1.5 text-center text-[10px] font-bold text-emerald-600 uppercase tracking-wider">H</th>
<th class="px-2 py-1.5 text-center text-[10px] font-bold text-purple-600 uppercase tracking-wider">S</th>
<th class="px-2 py-1.5 text-center text-[10px] font-bold text-amber-600 uppercase tracking-wider">S</th>
<th class="px-2 py-1.5 text-center text-[10px] font-bold text-blue-600 uppercase tracking-wider">I</th>
<th class="px-2 py-1.5 text-center text-[10px] font-bold text-red-600 uppercase tracking-wider {{ $sep }}">A</th>
<th class="px-2 py-1.5 text-center text-[10px] font-bold text-red-600 uppercase tracking-wider">A</th>
<th class="px-2 py-1.5 text-center text-[10px] font-bold text-violet-600 uppercase tracking-wider {{ $sep }}">P</th>
@endforeach
<th class="px-2 py-1.5 text-center text-[10px] font-bold text-emerald-700 uppercase tracking-wider bg-gray-100/80 border-l-2 border-gray-400">H</th>
<th class="px-2 py-1.5 text-center text-[10px] font-bold text-purple-700 uppercase tracking-wider bg-gray-100/80">S</th>
<th class="px-2 py-1.5 text-center text-[10px] font-bold text-amber-700 uppercase tracking-wider bg-gray-100/80">S</th>
<th class="px-2 py-1.5 text-center text-[10px] font-bold text-blue-700 uppercase tracking-wider bg-gray-100/80">I</th>
<th class="px-2 py-1.5 text-center text-[10px] font-bold text-red-700 uppercase tracking-wider bg-gray-100/80">A</th>
<th class="px-2 py-1.5 text-center text-[10px] font-bold text-violet-700 uppercase tracking-wider bg-gray-100/80">P</th>
</tr>
</thead>
<tbody class="divide-y divide-gray-50">
@@ -260,24 +265,27 @@
@endphp
@if($s)
<td class="px-2 py-2.5 text-center text-xs font-bold text-emerald-600">{{ $s['hadir'] }}</td>
<td class="px-2 py-2.5 text-center text-xs font-bold text-purple-600">{{ $s['sakit'] }}</td>
<td class="px-2 py-2.5 text-center text-xs font-bold text-amber-600">{{ $s['sakit'] }}</td>
<td class="px-2 py-2.5 text-center text-xs font-bold text-blue-600">{{ $s['izin'] }}</td>
<td class="px-2 py-2.5 text-center text-xs font-bold {{ $s['alpha'] > 0 ? 'text-red-600' : 'text-gray-400' }} {{ $sep }}">{{ $s['alpha'] }}</td>
<td class="px-2 py-2.5 text-center text-xs font-bold {{ $s['alpha'] > 0 ? 'text-red-600' : 'text-gray-400' }}">{{ $s['alpha'] }}</td>
<td class="px-2 py-2.5 text-center text-xs font-bold {{ $s['pkl'] > 0 ? 'text-violet-600' : 'text-gray-400' }} {{ $sep }}">{{ $s['pkl'] }}</td>
@else
<td class="px-2 py-2.5 text-center text-xs text-gray-300">—</td>
<td class="px-2 py-2.5 text-center text-xs text-gray-300">—</td>
<td class="px-2 py-2.5 text-center text-xs text-gray-300">—</td>
<td class="px-2 py-2.5 text-center text-xs text-gray-300">—</td>
<td class="px-2 py-2.5 text-center text-xs text-gray-300 {{ $sep }}">—</td>
@endif
@endforeach
{{-- TOTAL --}}
@php
$t = $totals[$student->id] ?? ['hadir' => 0, 'sakit' => 0, 'izin' => 0, 'alpha' => 0];
$t = $totals[$student->id] ?? ['hadir' => 0, 'sakit' => 0, 'izin' => 0, 'alpha' => 0, 'pkl' => 0];
@endphp
<td class="px-2 py-2.5 text-center text-xs font-bold text-emerald-700 bg-gray-50 border-l-2 border-gray-300">{{ $t['hadir'] }}</td>
<td class="px-2 py-2.5 text-center text-xs font-bold text-purple-700 bg-gray-50">{{ $t['sakit'] }}</td>
<td class="px-2 py-2.5 text-center text-xs font-bold text-amber-700 bg-gray-50">{{ $t['sakit'] }}</td>
<td class="px-2 py-2.5 text-center text-xs font-bold text-blue-700 bg-gray-50">{{ $t['izin'] }}</td>
<td class="px-2 py-2.5 text-center text-xs font-bold {{ $t['alpha'] > 0 ? 'text-red-700' : 'text-gray-400' }} bg-gray-50">{{ $t['alpha'] }}</td>
<td class="px-2 py-2.5 text-center text-xs font-bold {{ $t['pkl'] > 0 ? 'text-violet-700' : 'text-gray-400' }} bg-gray-50">{{ $t['pkl'] }}</td>
</tr>
@endforeach
</tbody>
@@ -285,7 +293,8 @@
</div>
<div class="px-5 py-3 border-t border-gray-100 bg-gray-50/50 text-xs text-gray-400 text-center flex items-center justify-center gap-4">
<span class="text-emerald-600 font-bold">H</span> Hadir
<span class="text-purple-600 font-bold">S</span> Sakit
<span class="text-amber-600 font-bold">S</span> Sakit
<span class="text-violet-600 font-bold">P</span> PKL
<span class="text-blue-600 font-bold">I</span> Izin
<span class="text-red-600 font-bold">A</span> Alpha
</div>
@@ -339,7 +348,7 @@
<span class="text-[10px] text-gray-400 font-normal">{{ \Carbon\Carbon::parse($row['start'])->format('d/m') }}-{{ \Carbon\Carbon::parse($row['end'])->format('d/m') }}</span>
</th>
@endforeach
<th colspan="4" class="px-3 py-2 text-center text-xs font-semibold text-gray-800 uppercase tracking-wider border-b border-slate-200 border-l-2 border-gray-400 bg-gray-100/80">
<th colspan="5" class="px-3 py-2 text-center text-xs font-semibold text-gray-800 uppercase tracking-wider border-b border-slate-200 border-l-2 border-gray-400 bg-gray-100/80">
TOTAL<br>
<span class="text-[10px] text-gray-500 font-normal">Hari</span>
</th>
@@ -350,14 +359,16 @@
$sep = !$loop->last ? 'border-r-2 border-gray-300' : '';
@endphp
<th class="px-2 py-1.5 text-center text-[10px] font-bold text-emerald-600 uppercase tracking-wider">H</th>
<th class="px-2 py-1.5 text-center text-[10px] font-bold text-purple-600 uppercase tracking-wider">S</th>
<th class="px-2 py-1.5 text-center text-[10px] font-bold text-amber-600 uppercase tracking-wider">S</th>
<th class="px-2 py-1.5 text-center text-[10px] font-bold text-blue-600 uppercase tracking-wider">I</th>
<th class="px-2 py-1.5 text-center text-[10px] font-bold text-red-600 uppercase tracking-wider {{ $sep }}">A</th>
<th class="px-2 py-1.5 text-center text-[10px] font-bold text-red-600 uppercase tracking-wider">A</th>
<th class="px-2 py-1.5 text-center text-[10px] font-bold text-violet-600 uppercase tracking-wider {{ $sep }}">P</th>
@endforeach
<th class="px-2 py-1.5 text-center text-[10px] font-bold text-emerald-700 uppercase tracking-wider bg-gray-100/80 border-l-2 border-gray-400">H</th>
<th class="px-2 py-1.5 text-center text-[10px] font-bold text-purple-700 uppercase tracking-wider bg-gray-100/80">S</th>
<th class="px-2 py-1.5 text-center text-[10px] font-bold text-amber-700 uppercase tracking-wider bg-gray-100/80">S</th>
<th class="px-2 py-1.5 text-center text-[10px] font-bold text-blue-700 uppercase tracking-wider bg-gray-100/80">I</th>
<th class="px-2 py-1.5 text-center text-[10px] font-bold text-red-700 uppercase tracking-wider bg-gray-100/80">A</th>
<th class="px-2 py-1.5 text-center text-[10px] font-bold text-violet-700 uppercase tracking-wider bg-gray-100/80">P</th>
</tr>
</thead>
<tbody class="divide-y divide-gray-50">
@@ -373,24 +384,27 @@
@endphp
@if($s)
<td class="px-2 py-2.5 text-center text-xs font-bold text-emerald-600">{{ $s['hadir'] }}</td>
<td class="px-2 py-2.5 text-center text-xs font-bold text-purple-600">{{ $s['sakit'] }}</td>
<td class="px-2 py-2.5 text-center text-xs font-bold text-amber-600">{{ $s['sakit'] }}</td>
<td class="px-2 py-2.5 text-center text-xs font-bold text-blue-600">{{ $s['izin'] }}</td>
<td class="px-2 py-2.5 text-center text-xs font-bold {{ $s['alpha'] > 0 ? 'text-red-600' : 'text-gray-400' }} {{ $sep }}">{{ $s['alpha'] }}</td>
<td class="px-2 py-2.5 text-center text-xs font-bold {{ $s['alpha'] > 0 ? 'text-red-600' : 'text-gray-400' }}">{{ $s['alpha'] }}</td>
<td class="px-2 py-2.5 text-center text-xs font-bold {{ $s['pkl'] > 0 ? 'text-violet-600' : 'text-gray-400' }} {{ $sep }}">{{ $s['pkl'] }}</td>
@else
<td class="px-2 py-2.5 text-center text-xs text-gray-300">—</td>
<td class="px-2 py-2.5 text-center text-xs text-gray-300">—</td>
<td class="px-2 py-2.5 text-center text-xs text-gray-300">—</td>
<td class="px-2 py-2.5 text-center text-xs text-gray-300">—</td>
<td class="px-2 py-2.5 text-center text-xs text-gray-300 {{ $sep }}">—</td>
@endif
@endforeach
{{-- TOTAL --}}
@php
$t = $totals[$student->id] ?? ['hadir' => 0, 'sakit' => 0, 'izin' => 0, 'alpha' => 0];
$t = $totals[$student->id] ?? ['hadir' => 0, 'sakit' => 0, 'izin' => 0, 'alpha' => 0, 'pkl' => 0];
@endphp
<td class="px-2 py-2.5 text-center text-xs font-bold text-emerald-700 bg-gray-50 border-l-2 border-gray-300">{{ $t['hadir'] }}</td>
<td class="px-2 py-2.5 text-center text-xs font-bold text-purple-700 bg-gray-50">{{ $t['sakit'] }}</td>
<td class="px-2 py-2.5 text-center text-xs font-bold text-amber-700 bg-gray-50">{{ $t['sakit'] }}</td>
<td class="px-2 py-2.5 text-center text-xs font-bold text-blue-700 bg-gray-50">{{ $t['izin'] }}</td>
<td class="px-2 py-2.5 text-center text-xs font-bold {{ $t['alpha'] > 0 ? 'text-red-700' : 'text-gray-400' }} bg-gray-50">{{ $t['alpha'] }}</td>
<td class="px-2 py-2.5 text-center text-xs font-bold {{ $t['pkl'] > 0 ? 'text-violet-700' : 'text-gray-400' }} bg-gray-50">{{ $t['pkl'] }}</td>
</tr>
@endforeach
</tbody>
@@ -398,7 +412,8 @@
</div>
<div class="px-5 py-3 border-t border-gray-100 bg-gray-50/50 text-xs text-gray-400 text-center flex items-center justify-center gap-4">
<span class="text-emerald-600 font-bold">H</span> Hadir
<span class="text-purple-600 font-bold">S</span> Sakit
<span class="text-amber-600 font-bold">S</span> Sakit
<span class="text-violet-600 font-bold">P</span> PKL
<span class="text-blue-600 font-bold">I</span> Izin
<span class="text-red-600 font-bold">A</span> Alpha
</div>