route('admin.dashboard'); } return view('admin.login'); } public function authenticate(Request $request) { $credentials = $request->validate([ 'email' => 'required|email', 'password' => 'required', ]); if (Auth::attempt($credentials, $request->boolean('remember'))) { $request->session()->regenerate(); return redirect()->intended(route('admin.dashboard')); } return back()->withErrors([ 'email' => 'Email atau password tidak valid.', ])->onlyInput('email'); } public function dashboard() { // total diagnosis $totalDiagnosis = Biodata::count(); // hari ini $todayDiagnosis = Biodata::whereDate('created_at', Carbon::today())->count(); // kemarin $yesterday = Biodata::whereDate('created_at', Carbon::yesterday())->count(); $diff = $todayDiagnosis - $yesterday; // user list + diagnosis list $sort = request('sort'); if ($sort == 'oldest') { $data = Biodata::orderBy('created_at', 'asc')->get(); } else { $data = Biodata::orderBy('created_at', 'desc')->get(); } // Data pengguna unik (hindari duplikasi input yang sama) $userData = $data->unique(function ($item) { $phone = trim((string)($item->no_telepon ?? '')); if ($phone !== '') { return 'phone:' . $phone; } return 'fallback:' . Str::lower(trim((string)($item->nama_pemilik ?? ''))) . '|' . Str::lower(trim((string)($item->nama_kucing ?? ''))) . '|' . Str::lower(trim((string)($item->alamat ?? ''))); })->values(); // total user = jumlah data unik $totalUsers = $userData->count(); // penyakit paling umum $mostCommon = Biodata::select('hasil_diagnosis') ->whereNotNull('hasil_diagnosis') ->groupBy('hasil_diagnosis') ->orderByRaw('COUNT(*) DESC') ->value('hasil_diagnosis'); // penyakit terbanyak hari ini $todayDisease = Biodata::whereDate('created_at', Carbon::today()) ->select('hasil_diagnosis') ->whereNotNull('hasil_diagnosis') ->groupBy('hasil_diagnosis') ->orderByRaw('COUNT(*) DESC') ->value('hasil_diagnosis'); // diagnosis terbaru $recent = Biodata::select('hasil_diagnosis', 'created_at') ->latest() ->take(5) ->get(); $recentFormatted = $recent->map(function ($item) { return [ 'date' => $item->created_at, 'disease' => $item->hasil_diagnosis, 'count' => 1 ]; }); // chart penyakit $diseaseStats = Biodata::select('hasil_diagnosis') ->whereNotNull('hasil_diagnosis') ->get() ->groupBy('hasil_diagnosis') ->map(function ($item) { return count($item); }); $chartLabels = $diseaseStats->keys()->values(); $chartData = $diseaseStats->values(); // 🔥 7 hari terakhir $period = CarbonPeriod::create(Carbon::now()->subDays(6), Carbon::now()); $dailyLabels = []; $dailyData = []; foreach ($period as $date) { $count = Biodata::whereDate('created_at', $date)->count(); $dailyLabels[] = $date->format('d M'); $dailyData[] = $count; } // kirim ke blade $stats = [ 'total_diagnosis' => $totalDiagnosis, 'today_diagnosis' => $todayDiagnosis, 'total_users' => $totalUsers, 'most_common_disease' => $mostCommon, 'recent_diagnosis' => $recentFormatted, 'chart_labels' => $chartLabels, 'chart_data' => $chartData, 'diagnosis_diff' => $diff, 'today_top_disease' => $todayDisease, 'daily_labels' => $dailyLabels, 'daily_data' => $dailyData ]; // 🔥 STAT $ratingChart = Ulasan::select('rating', DB::raw('count(*) as total')) ->groupBy('rating') ->orderBy('rating') ->get(); $stats['rating_labels'] = $ratingChart->pluck('rating'); $stats['rating_data'] = $ratingChart->pluck('total'); return view('admin.dashboard', compact('stats', 'data', 'userData')); } public function logout(Request $request) { Auth::logout(); $request->session()->invalidate(); $request->session()->regenerateToken(); return redirect()->route('admin.login'); } private function getStatistics() { // Simulated statistics - bisa diganti dengan data real dari database return [ 'total_diagnosis' => 156, 'today_diagnosis' => 12, 'total_users' => 89, 'most_common_disease' => 'Feline Panleukopenia', 'recent_diagnosis' => [ ['date' => '2026-01-15', 'disease' => 'Feline Panleukopenia', 'count' => 5], ['date' => '2026-01-14', 'disease' => 'Feline Calicivirus', 'count' => 3], ['date' => '2026-01-13', 'disease' => 'Scabies', 'count' => 4], ] ]; } public function statistik() { $diseaseStats = Biodata::select('hasil_diagnosis') ->whereNotNull('hasil_diagnosis') ->get() ->groupBy('hasil_diagnosis') ->map(function ($item) { return count($item); }); $chartLabels = $diseaseStats->keys()->values(); $chartData = $diseaseStats->values(); return view('admin.statistik', compact('chartLabels', 'chartData')); } public function sortDiagnosis(Request $request) { $sort = $request->sort; if ($sort == 'oldest') { $data = Biodata::orderBy('created_at', 'asc')->get(); } else { $data = Biodata::orderBy('created_at', 'desc')->get(); } return response()->json($data); } public function exportDiagnosisExcel(): StreamedResponse { $rows = Biodata::orderBy('created_at', 'desc')->get(); $filename = 'diagnosis-pawmedic-' . now()->format('Ymd-His') . '.xls'; $headers = [ 'Content-Type' => 'application/vnd.ms-excel; charset=UTF-8', 'Content-Disposition' => 'attachment; filename="' . $filename . '"', 'Cache-Control' => 'max-age=0', ]; return response()->streamDownload(function () use ($rows) { echo '
'; echo '| Tanggal | '; echo 'Nama Pemilik | '; echo 'Nama Kucing | '; echo 'Umur Kucing | '; echo 'Jenis Kelamin | '; echo 'Berat Badan | '; echo 'Ras Kucing | '; echo 'Alamat | '; echo 'No Telepon | '; echo 'Hasil Diagnosis | '; echo 'Jenis | '; echo '
|---|---|---|---|---|---|---|---|---|---|---|
| ' . e(optional($row->created_at)->format('d-m-Y H:i')) . ' | '; echo '' . e($row->nama_pemilik ?? '-') . ' | '; echo '' . e($row->nama_kucing ?? '-') . ' | '; echo '' . e($row->umur_kucing ?? '-') . ' | '; echo '' . e($row->jenis_kelamin ?? '-') . ' | '; echo '' . e($row->berat_badan ?? '-') . ' | '; echo '' . e($row->ras_kucing ?? '-') . ' | '; echo '' . e($row->alamat ?? '-') . ' | '; echo '' . e($row->no_telepon ?? '-') . ' | '; echo '' . e($row->hasil_diagnosis ?? '-') . ' | '; echo '' . e($row->jenis ?? '-') . ' | '; echo '