Jaga-Jalan/app/Http/Controllers/DashboardController.php

201 lines
7.5 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Support\Facades\DB;
use App\Models\LaporanJalan;
use App\Models\LaporanBencana;
use Carbon\Carbon;
use Illuminate\Support\Collection;
class DashboardController extends BaseController
{
public function index(Request $request)
{
try {
// Data untuk KPI Cards
$totalLaporanJalan = LaporanJalan::count();
$totalLaporanBencana = LaporanBencana::count();
$totalLaporan = $totalLaporanJalan + $totalLaporanBencana;
$menungguJalan = LaporanJalan::where('status', 'menunggu')->count();
$menungguBencana = LaporanBencana::where('status', 'menunggu')->count();
$menunggu = $menungguJalan + $menungguBencana;
$dalamProsesJalan = LaporanJalan::where('status', 'dalam_proses')->count();
$dalamProsesBencana = LaporanBencana::where('status', 'dalam_proses')->count();
$dalamProses = $dalamProsesJalan + $dalamProsesBencana;
$selesaiJalan = LaporanJalan::where('status', 'selesai')->count();
$selesaiBencana = LaporanBencana::where('status', 'selesai')->count();
$selesai = $selesaiJalan + $selesaiBencana;
// Persentase perubahan dari bulan lalu
$laporanJalanBulanLalu = LaporanJalan::whereMonth('created_at', Carbon::now()->subMonth()->month)->count();
$laporanBencanaBulanLalu = LaporanBencana::whereMonth('created_at', Carbon::now()->subMonth()->month)->count();
$persentaseKenaikanJalan = $laporanJalanBulanLalu > 0
? round((($totalLaporanJalan - $laporanJalanBulanLalu) / $laporanJalanBulanLalu) * 100, 1)
: 100;
$persentasePenurunanBencana = $laporanBencanaBulanLalu > 0
? round((($totalLaporanBencana - $laporanBencanaBulanLalu) / $laporanBencanaBulanLalu) * 100, 1)
: 0;
// Data untuk grafik statistik bulanan
$monthlyData = [];
for ($i = 5; $i >= 0; $i--) {
$date = now()->subMonths($i);
$month = $date->format('M Y');
$jalanCount = LaporanJalan::whereYear('created_at', $date->year)
->whereMonth('created_at', $date->month)
->count();
$bencanaCount = LaporanBencana::whereYear('created_at', $date->year)
->whereMonth('created_at', $date->month)
->count();
$monthlyData[] = [
'bulan' => $month,
'jalan' => $jalanCount,
'bencana' => $bencanaCount
];
}
// Data untuk grafik distribusi jenis kerusakan
$distribusiJalan = DB::table('laporan_jalan')
->select('jenis_rusak', DB::raw('count(*) as total'))
->groupBy('jenis_rusak')
->get();
$distribusiBencana = DB::table('laporan_bencana')
->select('jenis_bencana', DB::raw('count(*) as total'))
->groupBy('jenis_bencana')
->get();
return view('dashboard', compact(
'totalLaporan',
'totalLaporanJalan',
'totalLaporanBencana',
'menunggu',
'menungguJalan',
'menungguBencana',
'dalamProses',
'dalamProsesJalan',
'dalamProsesBencana',
'selesai',
'selesaiJalan',
'selesaiBencana',
'persentaseKenaikanJalan',
'persentasePenurunanBencana',
'monthlyData',
'distribusiJalan',
'distribusiBencana'
));
} catch (\Exception $e) {
return back()->with('error', 'Terjadi kesalahan saat memuat dashboard: ' . $e->getMessage());
}
}
public function getLaporanJalan()
{
try {
$laporanJalan = DB::table('laporan_jalan')
->select('id', 'lokasi', 'latitude', 'longitude', 'jenis_rusak', 'deskripsi', 'foto', 'status')
->where('status', 'dalam_proses')
->get();
// Transform foto path menjadi URL lengkap
$laporanJalan = $laporanJalan->map(function($item) {
$item->foto_url = $item->foto ? asset('storage/' . $item->foto) : null;
return $item;
});
return response()->json([
'success' => true,
'data' => $laporanJalan
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Gagal mengambil data laporan jalan',
'error' => $e->getMessage()
], 500);
}
}
public function getLaporanBencana()
{
try {
$laporanBencana = DB::table('laporan_bencana')
->select('id', 'lokasi', 'latitude', 'longitude', 'jenis_bencana', 'deskripsi', 'foto', 'status')
->where('status', 'dalam_proses')
->get();
// Transform foto path menjadi URL lengkap
$laporanBencana = $laporanBencana->map(function($item) {
$item->foto_url = $item->foto ? asset('storage/' . $item->foto) : null;
return $item;
});
return response()->json([
'success' => true,
'data' => $laporanBencana
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Gagal mengambil data laporan bencana',
'error' => $e->getMessage()
], 500);
}
}
public function getRiwayatLaporan()
{
try {
$user_id = Auth::id();
// Get laporan bencana yang dilaporkan oleh pengguna
$bencana = DB::table('laporan_bencana')
->where('user_id', $user_id)
->select('id', 'lokasi', 'latitude', 'longitude', 'jenis_bencana', 'deskripsi', 'foto', 'status', 'created_at')
->orderBy('created_at', 'desc')
->get()
->map(function($item) {
$item->foto_url = $item->foto ? asset('storage/' . $item->foto) : null;
return $item;
});
// Get laporan jalan yang dilaporkan oleh pengguna
$jalan = DB::table('laporan_jalan')
->where('user_id', $user_id)
->select('id', 'lokasi', 'latitude', 'longitude', 'jenis_rusak', 'deskripsi', 'foto', 'status', 'created_at')
->orderBy('created_at', 'desc')
->get()
->map(function($item) {
$item->foto_url = $item->foto ? asset('storage/' . $item->foto) : null;
return $item;
});
return response()->json([
'success' => true,
'data' => [
'bencana' => $bencana,
'jalan' => $jalan
]
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Gagal mengambil riwayat laporan',
'error' => $e->getMessage()
], 500);
}
}
}