MIF_E31221259/app/Http/Controllers/Admin/AdminDashboardController.php

102 lines
3.9 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Diagnosa;
use App\Models\HasilAhp;
use App\Models\User;
use App\Models\Jurusan;
use App\Models\Kecerdasan;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
class AdminDashboardController extends Controller
{
public function index(Request $request)
{
$selectedUser = $request->user_id;
$selectedJurusan = $request->jurusan_id;
$selectedKecerdasan = $request->kecerdasan_id;
// Data filter dropdown
$users = User::orderBy('name')->get();
$jurusanList = Jurusan::orderBy('nama')->get();
$kecerdasanList = Kecerdasan::orderBy('nama')->get();
// Labels untuk 7 hari terakhir
$labels = collect(range(0, 6))->map(fn($i) => now()->subDays(6 - $i)->format('d-m'));
// Diagnosa per hari (filter: user + kecerdasan)
$diagPerDay = Diagnosa::select(
DB::raw('DATE(created_at) AS date'),
DB::raw('count(*) AS total')
)
->when($selectedUser, fn($q) => $q->where('user_id', $selectedUser))
->when($selectedKecerdasan, fn($q) => $q->where('kecerdasan_id', $selectedKecerdasan))
->where('created_at', '>=', now()->subDays(6)->startOfDay())
->groupBy('date')
->orderBy('date')
->get();
// AHP per hari (filter: user + jurusan)
$ahpPerDay = HasilAhp::select(
DB::raw('DATE(created_at) AS date'),
DB::raw('count(*) AS total')
)
->when($selectedUser, fn($q) => $q->where('user_id', $selectedUser))
->when($selectedJurusan, fn($q) => $q->where('jurusan_id', $selectedJurusan))
->where('created_at', '>=', now()->subDays(6)->startOfDay())
->groupBy('date')
->orderBy('date')
->get();
// Map data per tanggal (format d-m)
$diagMap = $diagPerDay->keyBy(fn($item) => Carbon::parse($item->date)->format('d-m'));
$ahpMap = $ahpPerDay->keyBy(fn($item) => Carbon::parse($item->date)->format('d-m'));
// Hitung counts per hari sesuai label
$diagCounts = $labels->map(fn($d) => (int) ($diagMap[$d]->total ?? 0));
$ahpCounts = $labels->map(fn($d) => (int) ($ahpMap[$d]->total ?? 0));
// Rata-rata
$avgDiag = $diagCounts->avg();
$avgAhp = $ahpCounts->avg();
// Top 3 Jurusan (berdasarkan AHP)
$topJurusan = HasilAhp::select('jurusan_id', DB::raw('count(*) as total'))
->when($selectedJurusan, fn($q) => $q->where('jurusan_id', $selectedJurusan))
->where('created_at', '>=', now()->subDays(7))
->groupBy('jurusan_id')
->orderByDesc('total')
->limit(3)
->get()
->map(fn($r) => [
'nama' => optional($jurusanList->firstWhere('id', $r->jurusan_id))->nama ?? '-',
'total' => $r->total,
]);
// Top 3 Kecerdasan (berdasarkan Diagnosa)
$topKecerdasan = Diagnosa::select('kecerdasan_id', DB::raw('count(*) as total'))
->when($selectedKecerdasan, fn($q) => $q->where('kecerdasan_id', $selectedKecerdasan))
->where('created_at', '>=', now()->subDays(7))
->groupBy('kecerdasan_id')
->orderByDesc('total')
->limit(3)
->get()
->map(fn($r) => [
'nama' => optional($kecerdasanList->firstWhere('id', $r->kecerdasan_id))->nama ?? '-',
'total' => $r->total,
]);
return view('admin.dashboard', compact(
'users','jurusanList','kecerdasanList',
'selectedUser','selectedJurusan','selectedKecerdasan',
'labels','diagCounts','ahpCounts',
'avgDiag','avgAhp',
'topJurusan','topKecerdasan'
));
}
}