184 lines
6.3 KiB
PHP
184 lines
6.3 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use App\Models\User;
|
|
use App\Models\Barang;
|
|
use App\Models\Sewa;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class DashboardController extends Controller
|
|
{
|
|
/**
|
|
* Menampilkan halaman dashboard
|
|
*
|
|
* @return \Illuminate\View\View
|
|
*/
|
|
public function index()
|
|
{
|
|
// Cek tipe pengguna yang sedang login
|
|
$userType = Auth::user()->tipe_pengguna;
|
|
|
|
// Jika user adalah customer, redirect langsung ke halaman sewa
|
|
if ($userType === 'user') {
|
|
return redirect()->route('sewa.index');
|
|
}
|
|
|
|
// Data untuk dashboard (hanya untuk admin)
|
|
$stats = [
|
|
'pengguna' => User::where('tipe_pengguna', 'user')->count(),
|
|
'admin' => User::where('tipe_pengguna', 'admin')->count(),
|
|
'total_pengguna' => User::count(),
|
|
'barang' => Barang::count(),
|
|
'sewa' => DB::table('sewas')->whereIn('status', ['disetujui', 'selesai'])->count()
|
|
];
|
|
|
|
// Data grafik per tahun
|
|
$yearlyStats = DB::table('sewas')
|
|
->select(
|
|
DB::raw('YEAR(created_at) as tahun'),
|
|
DB::raw('COUNT(CASE WHEN status IN ("disetujui", "selesai") THEN 1 END) as total_sewa'),
|
|
DB::raw('SUM(CASE WHEN status IN ("disetujui", "selesai") THEN total_harga ELSE 0 END) as total_pemasukan'),
|
|
DB::raw('0 as total_pengeluaran') // Sementara set 0 karena belum ada kolom biaya_operasional
|
|
)
|
|
->groupBy('tahun')
|
|
->orderBy('tahun', 'ASC')
|
|
->get();
|
|
|
|
// Jika tidak ada data, tambahkan data dummy untuk tahun ini
|
|
if ($yearlyStats->isEmpty()) {
|
|
$yearlyStats = collect([
|
|
(object)[
|
|
'tahun' => date('Y'),
|
|
'total_sewa' => 0,
|
|
'total_pemasukan' => 0,
|
|
'total_pengeluaran' => 0
|
|
]
|
|
]);
|
|
}
|
|
|
|
// Data pertumbuhan pengguna per tahun
|
|
$userGrowth = DB::table('users')
|
|
->select(
|
|
DB::raw('YEAR(created_at) as tahun'),
|
|
DB::raw('COUNT(*) as total_pengguna')
|
|
)
|
|
->groupBy('tahun')
|
|
->orderBy('tahun', 'ASC')
|
|
->get();
|
|
|
|
// Jika tidak ada data pengguna, tambahkan data dummy
|
|
if ($userGrowth->isEmpty()) {
|
|
$userGrowth = collect([
|
|
(object)[
|
|
'tahun' => date('Y'),
|
|
'total_pengguna' => User::count()
|
|
]
|
|
]);
|
|
}
|
|
|
|
// Format data untuk grafik
|
|
$chartData = [
|
|
'labels' => $yearlyStats->pluck('tahun')->toArray(),
|
|
'datasets' => [
|
|
[
|
|
'label' => 'Pemasukan',
|
|
'data' => $yearlyStats->pluck('total_pemasukan')->toArray(),
|
|
'backgroundColor' => 'rgba(34, 197, 94, 0.2)',
|
|
'borderColor' => 'rgb(34, 197, 94)',
|
|
'borderWidth' => 2,
|
|
'tension' => 0.4
|
|
],
|
|
[
|
|
'label' => 'Pengeluaran',
|
|
'data' => $yearlyStats->pluck('total_pengeluaran')->toArray(),
|
|
'backgroundColor' => 'rgba(239, 68, 68, 0.2)',
|
|
'borderColor' => 'rgb(239, 68, 68)',
|
|
'borderWidth' => 2,
|
|
'tension' => 0.4
|
|
],
|
|
[
|
|
'label' => 'Total Sewa',
|
|
'data' => $yearlyStats->pluck('total_sewa')->toArray(),
|
|
'backgroundColor' => 'rgba(59, 130, 246, 0.2)',
|
|
'borderColor' => 'rgb(59, 130, 246)',
|
|
'borderWidth' => 2,
|
|
'tension' => 0.4
|
|
]
|
|
]
|
|
];
|
|
|
|
$userChartData = [
|
|
'labels' => $userGrowth->pluck('tahun')->toArray(),
|
|
'datasets' => [
|
|
[
|
|
'label' => 'Total Pengguna',
|
|
'data' => $userGrowth->pluck('total_pengguna')->toArray(),
|
|
'backgroundColor' => 'rgba(139, 92, 246, 0.2)',
|
|
'borderColor' => 'rgb(139, 92, 246)',
|
|
'borderWidth' => 2,
|
|
'tension' => 0.4,
|
|
'fill' => true
|
|
]
|
|
]
|
|
];
|
|
|
|
// Data aktivitas (hanya untuk admin)
|
|
$aktivitas = [];
|
|
|
|
// Ambil user terbaru yang mendaftar (baik admin maupun user)
|
|
$latestUsers = User::latest()->take(5)->get();
|
|
|
|
foreach ($latestUsers as $user) {
|
|
$aktivitas[] = [
|
|
'type' => 'pengguna',
|
|
'title' => 'Pengguna ' . ucfirst($user->tipe_pengguna),
|
|
'description' => $user->nama . ' (' . $user->tipe_pengguna . ')',
|
|
'time' => Carbon::parse($user->created_at)->diffForHumans(),
|
|
'icon_color' => $user->tipe_pengguna === 'admin' ? 'indigo' : 'blue'
|
|
];
|
|
}
|
|
|
|
// Tambahkan aktivitas sewa terbaru
|
|
$latestSewa = Sewa::with(['user', 'paket'])
|
|
->whereIn('status', ['disetujui', 'selesai'])
|
|
->latest()
|
|
->first();
|
|
if ($latestSewa) {
|
|
$aktivitas[] = [
|
|
'type' => 'sewa',
|
|
'title' => 'Pemesanan Baru',
|
|
'description' => $latestSewa->user->nama . ' memesan paket ' . $latestSewa->paket->nama_paket,
|
|
'time' => Carbon::parse($latestSewa->created_at)->diffForHumans(),
|
|
'icon_color' => 'green'
|
|
];
|
|
}
|
|
|
|
return view('dashboard', compact('stats', 'chartData', 'userChartData', 'aktivitas', 'userType'));
|
|
}
|
|
|
|
/**
|
|
* Menampilkan halaman profile
|
|
*
|
|
* @return \Illuminate\View\View
|
|
*/
|
|
public function showProfile()
|
|
{
|
|
return view('profile');
|
|
}
|
|
|
|
/**
|
|
* Update profile (dummy)
|
|
*
|
|
* @param \Illuminate\Http\Request $request
|
|
* @return \Illuminate\Http\RedirectResponse
|
|
*/
|
|
public function updateProfile(Request $request)
|
|
{
|
|
// Proses update profile akan ditambahkan nanti
|
|
return redirect()->back()->with('success', 'Profile berhasil diperbarui');
|
|
}
|
|
}
|