MIF_E31230680/app/Http/Controllers/DashboardController.php

166 lines
6.2 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\HasilSeleksi;
use App\Models\Kriteria;
use App\Models\Periode;
use App\Models\User;
use App\Models\Warga;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class DashboardController extends Controller
{
// Tambahkan Request di parameter fungsi
public function adminDashboard(Request $request)
{
return view('admin.dashboard', $this->getDashboardData($request));
}
public function verifikatorDashboard(Request $request)
{
return view('verifikator.dashboard', $this->getDashboardData($request));
}
private function getDashboardData(Request $request)
{
// 1. Ambil SEMUA periode untuk pilihan di dropdown
$semuaPeriode = Periode::orderBy('id', 'desc')->get();
// 2. Tentukan periode mana yang sedang ingin dilihat
$periodeId = $request->query('periode_id');
if ($periodeId) {
$periodeDitampilkan = Periode::find($periodeId);
} else {
// Default: Cari yang aktif, jika tidak ada, ambil yang paling baru
$periodeDitampilkan = Periode::where('is_aktif', true)->first() ?? Periode::latest()->first();
}
// Default value untuk statistik periode terpilih
$utama = 0;
$cadangan = 0;
$tidakLayak = 0;
$dialihkan = 0;
$kuota = 0;
$topWarga = collect();
if ($periodeDitampilkan) {
$kuota = $periodeDitampilkan->kuota;
// Hitung status keputusan untuk grafik batang/pie periode terpilih
$hasilStats = HasilSeleksi::where('periode_id', $periodeDitampilkan->id)
->selectRaw('status_keputusan, count(*) as total')
->groupBy('status_keputusan')
->pluck('total', 'status_keputusan');
$utama = $hasilStats['Layak Prioritas Utama'] ?? 0;
$cadangan = $hasilStats['Layak Cadangan'] ?? 0;
$tidakLayak = $hasilStats['Tidak Layak'] ?? 0;
$dialihkan = $hasilStats['Dialihkan (Pemerataan)'] ?? 0;
// Ambil 5 peringkat teratas untuk tabel ranking
$topWarga = HasilSeleksi::with('warga')
->where('periode_id', $periodeDitampilkan->id)
->orderBy('ranking', 'asc')
->take(5)
->get();
}
// 3. Rekap semua status verifikasi warga (Global - Seluruh Warga di Sistem)
$wargaStats = Warga::selectRaw('status_verifikasi, count(*) as total')
->groupBy('status_verifikasi')
->pluck('total', 'status_verifikasi');
$totalWarga = array_sum($wargaStats->toArray());
$wargaPendingList = Warga::where('status_verifikasi', 'pending')
->orderBy('created_at', 'asc')
->take(5)
->get();
// 4. LOGIKA TAMBAHAN: Data Tren Histori (Line Chart)
// Mengambil 6 periode terakhir secara urutan ID (kronologis)
$periodeTren = Periode::orderBy('id', 'asc')->take(6)->get();
$labelTren = [];
$dataUtamaTren = [];
foreach ($periodeTren as $pt) {
$labelTren[] = $pt->nama_periode; // Contoh: "April 2026"
// Hitung jumlah warga yang masuk Prioritas Utama di periode ini
$jumlahUtama = HasilSeleksi::where('periode_id', $pt->id)
->where('status_keputusan', 'Layak Prioritas Utama')
->count();
$dataUtamaTren[] = $jumlahUtama;
}
// demografi
$semuaKriteria = Kriteria::all();
// Tangkap ID kriteria dari request dropdown (misal: ?kriteria_chart=2)
$selectedKriteriaId = $request->query('kriteria_chart');
// Jika tidak ada yang dipilih (pertama kali load), otomatis pilih kriteria urutan pertama
if (!$selectedKriteriaId && $semuaKriteria->count() > 0) {
$selectedKriteriaId = $semuaKriteria->first()->id;
}
$kriteriaDitampilkan = null;
$statistikKriteria = collect(); // Set nilai default kosong agar tidak error
// Jika ada kriteria yang aktif/terpilih, baru jalankan query ke database
if ($selectedKriteriaId) {
$kriteriaDitampilkan = \App\Models\Kriteria::find($selectedKriteriaId);
// PERUBAHAN DI SINI: Tambahkan "warga_details." di dalam where()
$statistikKriteria = \App\Models\WargaDetail::where('warga_details.kriteria_id', $selectedKriteriaId)
->join('sub_kriterias', 'warga_details.sub_kriteria_id', '=', 'sub_kriterias.id')
->selectRaw('sub_kriterias.nama_sub as label, count(*) as total')
->groupBy('sub_kriterias.nama_sub')
->pluck('total', 'label');
}
return [
'user' => Auth::user(),
'countUser' => User::count(),
'countWarga' => $totalWarga,
'countVerif' => $wargaStats['setuju'] ?? 0,
'countPending' => $wargaStats['pending'] ?? 0,
'countTolak' => $wargaStats['tolak'] ?? 0,
'countKriteria' => Kriteria::count(),
// Variabel Chart Batang & Ranking Periode Terpilih
'chartUtama' => $utama,
'chartCadangan' => $cadangan,
'chartTidakLayak' => $tidakLayak,
'chartDialihkan' => $dialihkan,
'countRanking' => $utama + $cadangan + $tidakLayak + $dialihkan,
// Variabel Kuota & Tabel Top 5
'kuota' => $kuota,
'persentaseKuota' => $kuota > 0 ? round(($utama / $kuota) * 100) : 0,
'topWarga' => $topWarga,
// Variabel Untuk Grafik Tren Histori (Line Chart)
'labelTren' => $labelTren,
'dataUtamaTren' => $dataUtamaTren,
'wargaPendingList' => $wargaPendingList,
// Variabel Untuk Filter Dropdown
'semuaPeriode' => $semuaPeriode,
'periodeDitampilkan' => $periodeDitampilkan,
'namaPeriode' => $periodeDitampilkan ? $periodeDitampilkan->nama_periode : 'Belum Ada Periode',
// demografi
'semuaKriteria' => $semuaKriteria,
'kriteriaDitampilkan' => $kriteriaDitampilkan,
'statistikKriteria' => $statistikKriteria,
];
}
}