@extends('layouts.app') @section('title', 'Dashboard Mahasiswa') @section('content') @php use Carbon\Carbon; $userId = auth()->id(); $sekarang = Carbon::now('Asia/Jakarta'); $hariIni = $sekarang->toDateString(); // ✅ AMBIL SEMUA MATA KULIAH AKTIF $semuaMatkul = \App\Models\MataKuliah::with('dosen') ->where('is_aktif', true) ->orderBy('nama', 'asc') ->get(); $matkulIds = $semuaMatkul->pluck('id'); // ✅ AMBIL SEMUA PERTEMUAN YANG SUDAH LEWAT UNTUK SEMUA MATKUL $semuaPertemuan = \App\Models\Pertemuan::whereHas('jadwal', function($q) use ($matkulIds) { $q->whereIn('matkul_id', $matkulIds); })->where('tanggal', '<=', $hariIni)->get(); // ✅ AMBIL DATA ABSENSI MAHASISWA $allAbsensi = \App\Models\Absensi::where('user_id', $userId) ->get() ->keyBy('pertemuan_id'); $palette = ['#0ea5e9', '#f59e0b', '#10b981', '#8b5cf6', '#f43f5e', '#14b8a6', '#84cc16']; $matkulStats = []; $totalHadirSemua = 0; $totalPertemuanSemua = 0; foreach($semuaMatkul as $mk) { // ✅ Ambil pertemuan untuk matkul ini yang sudah lewat $pertemuans = $semuaPertemuan->filter(function($p) use ($mk) { return $p->jadwal && $p->jadwal->matkul_id === $mk->id; }); $totalPertemuan = $pertemuans->count(); $hadir = 0; foreach ($pertemuans as $p) { $absensi = $allAbsensi[$p->id] ?? null; if ($absensi && $absensi->status === 'hadir') { $hadir++; } } $persen = $totalPertemuan > 0 ? round(($hadir / $totalPertemuan) * 100) : 0; $matkulStats[$mk->id] = [ 'nama' => $mk->nama, 'kode' => $mk->kode ?? '-', 'total' => $totalPertemuan, 'hadir' => $hadir, 'alpha' => $totalPertemuan - $hadir, 'persen' => $persen, 'warna' => $persen >= 75 ? '#10b981' : ($persen >= 50 ? '#f59e0b' : '#ef4444') ]; $totalHadirSemua += $hadir; $totalPertemuanSemua += $totalPertemuan; } // Data untuk chart (hanya matkul yang sudah ada pertemuan) $chartLabels = []; $chartData = []; $chartColors = []; $colorIndex = 0; foreach($matkulStats as $key => $mk) { if ($mk['total'] > 0) { $chartLabels[] = $mk['nama']; $chartData[] = $mk['hadir']; $chartColors[] = $palette[$colorIndex % count($palette)]; $colorIndex++; } } // ✅ Ambil data dari Controller atau hitung ulang $recentAbsensi = $recentAbsensi ?? \App\Models\Absensi::with(['jadwal.mataKuliah']) ->where('user_id', $userId) ->latest('waktu_absen') ->take(5) ->get(); $pendingTugas = $pendingTugas ?? \App\Models\Tugas::whereHas('mataKuliah', function($q) use ($matkulIds) { $q->whereIn('id', $matkulIds); }) ->where('deadline', '>', now()) ->whereDoesntHave('pengumpulans', function($q) use ($userId) { $q->where('user_id', $userId); }) ->orderBy('deadline', 'asc') ->take(5) ->get(); @endphp
{{-- Header --}}

Halo, {{ auth()->user()->name }}!

Selamat datang di portal akademik Anda.

SCAN QR PRESENSI
{{-- STATISTIK CARD TOTAL --}}
{{ $totalPertemuanSemua }}
TOTAL PERTEMUAN
{{ $totalHadirSemua }}
TOTAL HADIR
{{ $pendingTugas->count() }}
TUGAS BELUM DIKUMPUL
{{-- Grafik & Detail Kehadiran --}}
📊 Statistik Kehadiran per Mata Kuliah
@if(count($matkulStats) > 0 && $totalPertemuanSemua > 0)
✅ Hadir: {{ $totalHadirSemua }}
❌ Alpha: {{ $totalPertemuanSemua - $totalHadirSemua }}
@foreach($matkulStats as $mk) @endforeach
Mata KuliahHadirTotalPersen
{{ $mk['nama'] }}
{{ $mk['kode'] }}
{{ $mk['hadir'] }} {{ $mk['total'] }} {{ $mk['persen'] }}%
@else
Belum Ada Data

Belum ada pertemuan yang lewat atau mata kuliah aktif.

@endif
{{-- Bagian Bawah: Presensi Terbaru & Tugas Mendesak --}}
{{-- KOLOM KIRI: PRESENSI TERBARU --}}
🕒 Log presensi terbaru
LIHAT SEMUA →
@forelse($recentAbsensi as $a) @php $status = strtolower($a->status); $statusBadge = [ 'hadir' => ['bg' => '#f0fdfa', 'color' => '#0d9488', 'text' => '✅ Hadir'], 'izin' => ['bg' => '#eff6ff', 'color' => '#3b82f6', 'text' => '📝 Izin'], 'alpha' => ['bg' => '#fef2f2', 'color' => '#ef4444', 'text' => '❌ Alpha'], 'sakit' => ['bg' => '#fefce8', 'color' => '#ca8a04', 'text' => '🤒 Sakit'] ][$status] ?? ['bg' => '#f3f4f6', 'color' => '#6b7280', 'text' => ucfirst($status)]; @endphp @empty @endforelse
Mata KuliahWaktuStatus
{{ $a->jadwal->mataKuliah->nama ?? '-' }}
{{ $a->jadwal->mataKuliah->kode ?? '-' }}
{{ $a->waktu_absen->format('d/m/Y') }}
{{ $a->waktu_absen->format('H:i') }} WIB
{{ $statusBadge['text'] }}
Belum ada riwayat presensi.
{{-- KOLOM KANAN: TUGAS --}}
📋 Tugas mendesak
LIHAT SEMUA →
@forelse($pendingTugas as $tugas) @php $deadline = Carbon::parse($tugas->deadline); $sisaJam = Carbon::now()->diffInHours($deadline, false); if ($sisaJam <= 24) { $bgStatus = '#fef2f2'; $colorStatus = '#ef4444'; $teksSisa = '🚨 Mendesak!'; } elseif ($sisaJam <= 72) { $bgStatus = '#fffbeb'; $colorStatus = '#d97706'; $teksSisa = '⚠️ Segera'; } else { $bgStatus = '#f0fdfa'; $colorStatus = '#0d9488'; $teksSisa = '✅ Masih aman'; } @endphp
{{ $tugas->mataKuliah->nama ?? '-' }}
{{ $tugas->judul }}
📅 {{ $deadline->format('d/m/Y, H:i') }}
{{ $teksSisa }}
@empty
Tidak ada tugas yang perlu dikerjakan.
@endforelse
@if(count($chartLabels) > 0) @endif @endsection