166 lines
6.2 KiB
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,
|
|
];
|
|
}
|
|
}
|