188 lines
6.2 KiB
PHP
188 lines
6.2 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class DashboardController extends Controller
|
|
{
|
|
// Fungsi default, menampilkan data untuk tahun 2023
|
|
public function index(Request $request)
|
|
{
|
|
// Ambil tahun-tahun yang tersedia dari data_latih
|
|
$tahunTersedia = DB::table('data_latih')
|
|
->select('data_tahun')
|
|
->distinct()
|
|
->orderByDesc('data_tahun')
|
|
->pluck('data_tahun');
|
|
|
|
// Ambil tahun dari request (GET), kalau tidak ada pakai yang paling atas (terbaru)
|
|
$selectedYear = $request->input('tahun', $tahunTersedia->first());
|
|
|
|
// Hitung total kasus berdasarkan tahun yang dipilih
|
|
$jumlahKasusDataLatih = DB::table('data_latih')
|
|
->where('data_tahun', $selectedYear)
|
|
->sum('kasus_2023');
|
|
|
|
$data_latih = DB::table('data_latih')->get();
|
|
$stats = DB::table('data_latih')
|
|
->selectRaw('
|
|
ROUND(AVG(phbs), 2) AS persen_phbs_baik,
|
|
ROUND(100 - AVG(phbs), 2) AS persen_phbs_tidak_baik,
|
|
ROUND(AVG(imunisasi), 2) AS persen_imunisasi,
|
|
ROUND(100 - AVG(imunisasi), 2) AS persen_tidak_imunisasi,
|
|
ROUND(AVG(merokok), 2) AS persen_merokok,
|
|
ROUND(100 - AVG(merokok), 2) AS persen_tidak_merokok
|
|
')
|
|
->first();
|
|
|
|
// Ambil semua kolom dari tabel data_latih
|
|
$columns = DB::getSchemaBuilder()->getColumnListing('data_latih');
|
|
|
|
$selectedYear = $request->input('tahun') ?? $tahunTersedia->first();
|
|
|
|
$kabupatens = DB::table('kabupatens')
|
|
->join('data_latih', 'kabupatens.nama', '=', 'data_latih.kecamatan')
|
|
->select('kabupatens.nama', 'kabupatens.latitude', 'kabupatens.longitude', 'data_latih.hipotesis')
|
|
->get();
|
|
|
|
$topKasus = DB::table('data_latih')
|
|
->join('kabupatens', 'data_latih.kecamatan', '=', 'kabupatens.nama')
|
|
->select('kabupatens.nama', 'data_latih.kasus_2023')
|
|
->orderByDesc('data_latih.kasus_2023')
|
|
->take(5)
|
|
->get();
|
|
|
|
// Ambil tahun-tahun yang tersedia dari tabel 'kasus'
|
|
$availableYears = DB::table('kasus')
|
|
->select('tahun')
|
|
->distinct()
|
|
->orderByDesc('tahun')
|
|
->pluck('tahun');
|
|
|
|
if (!$selectedYear) {
|
|
$selectedYear = DB::table('data_latih')
|
|
->orderByDesc('data_tahun')
|
|
->value('data_tahun'); // Ambil 1 nilai tahun terbaru
|
|
}
|
|
|
|
|
|
// Data kasus per bulan untuk tahun yang dipilih
|
|
$kasusPerBulan = DB::table('kasus')
|
|
->select('bulan', DB::raw('SUM(jumlah_kasus) as total'))
|
|
->where('tahun', $selectedYear)
|
|
->groupBy('bulan')
|
|
->orderByRaw("FIELD(bulan, 'Januari','Februari','Maret','April','Mei','Juni','Juli','Agustus','September','Oktober','November','Desember')")
|
|
->get();
|
|
|
|
$bulanLabels = [];
|
|
$totalKasus = [];
|
|
|
|
foreach ($kasusPerBulan as $item) {
|
|
$bulanLabels[] = $item->bulan;
|
|
$totalKasus[] = $item->total;
|
|
}
|
|
|
|
// Data kasus per bulan untuk semua tahun (opsional, untuk perbandingan multiyear)
|
|
$kasusPerBulanByYear = [];
|
|
|
|
foreach ($availableYears as $year) {
|
|
$kasusPerBulanByYear[$year] = DB::table('kasus')
|
|
->where('tahun', $year)
|
|
->orderByRaw("FIELD(bulan, 'Januari','Februari','Maret','April','Mei','Juni','Juli','Agustus','September','Oktober','November','Desember')")
|
|
->get(['bulan', 'jumlah_kasus']);
|
|
}
|
|
|
|
return view('admin.dashboard', compact(
|
|
'stats',
|
|
'kabupatens',
|
|
'jumlahKasusDataLatih',
|
|
'topKasus',
|
|
'bulanLabels',
|
|
'totalKasus',
|
|
'data_latih',
|
|
'kasusPerBulanByYear',
|
|
'availableYears',
|
|
'selectedYear',
|
|
'tahunTersedia',
|
|
'selectedYear'
|
|
));
|
|
}
|
|
|
|
|
|
|
|
// Fungsi dashboard dengan filter tahun dinamis
|
|
public function dashboard(Request $request)
|
|
{
|
|
$tahunTerpilih = $request->input('tahun', 2023);
|
|
|
|
$data_latih = DB::table('data_latih')->get();
|
|
|
|
$stats = DB::table('data_latih')
|
|
->selectRaw('
|
|
ROUND(AVG(phbs), 2) AS persen_phbs_baik,
|
|
ROUND(100 - AVG(phbs), 2) AS persen_phbs_tidak_baik,
|
|
ROUND(AVG(imunisasi), 2) AS persen_imunisasi,
|
|
ROUND(100 - AVG(imunisasi), 2) AS persen_tidak_imunisasi,
|
|
ROUND(AVG(merokok), 2) AS persen_merokok,
|
|
ROUND(100 - AVG(merokok), 2) AS persen_tidak_merokok
|
|
')
|
|
->first();
|
|
|
|
$jumlahKasusDataLatih = DB::table('data_latih')
|
|
->where('data_tahun', $tahunTerpilih)
|
|
->sum('kasus_2023');
|
|
|
|
|
|
$kabupatens = DB::table('kabupatens')
|
|
->join('data_latih', 'kabupatens.nama', '=', 'data_latih.kecamatan')
|
|
->select('kabupatens.nama', 'kabupatens.latitude', 'kabupatens.longitude', 'data_latih.hipotesis')
|
|
->get();
|
|
|
|
$topKasus = DB::table('data_latih')
|
|
->join('kabupatens', 'data_latih.kecamatan', '=', 'kabupatens.nama')
|
|
->select('kabupatens.nama', 'data_latih.kasus_2023')
|
|
->orderByDesc('data_latih.kasus_2023')
|
|
->take(5)
|
|
->get();
|
|
|
|
$kasusPerBulan = DB::table('kasus')
|
|
->select('bulan', DB::raw('SUM(jumlah_kasus) as total'))
|
|
->where('tahun', $tahunTerpilih)
|
|
->groupBy('bulan')
|
|
->orderByRaw("FIELD(bulan, 'Januari','Februari','Maret','April','Mei','Juni','Juli','Agustus','September','Oktober','November','Desember')")
|
|
->get();
|
|
|
|
$bulanLabels = [];
|
|
$totalKasus = [];
|
|
|
|
foreach ($kasusPerBulan as $item) {
|
|
$bulanLabels[] = $item->bulan;
|
|
$totalKasus[] = $item->total;
|
|
}
|
|
|
|
$availableYears = DB::table('kasus')
|
|
->selectRaw('YEAR(tanggal) as year')
|
|
->distinct()
|
|
->orderBy('year', 'desc')
|
|
->pluck('year');
|
|
|
|
$selectedYear = 2023; // Sesuaikan defaultnya
|
|
|
|
// Lalu tambahkan ke compact
|
|
return view('admin.dashboard', compact(
|
|
'stats',
|
|
'kabupatens',
|
|
'jumlahKasusDataLatih',
|
|
'topKasus',
|
|
'bulanLabels',
|
|
'totalKasus',
|
|
'data_latih',
|
|
'tahunTersedia',
|
|
'tahunTerpilih',
|
|
'availableYears',
|
|
'selectedYear'
|
|
));
|
|
}
|
|
} |