102 lines
3.9 KiB
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'
|
|
));
|
|
}
|
|
}
|