$data[$i]->id, 'status' => $data[$i]->status, ]); if ($result) { $successCount++; } else { $failedEntries[] = [ 'siswa_id' => $data[$i]->id, 'reason' => 'Create method returned false' ]; } } catch (\Exception $e) { $failedEntries[] = [ 'siswa_id' => $data[$i]->id, 'reason' => $e->getMessage() ]; } } $totalRecords = count($data); $failedCount = count($failedEntries); if ($failedCount > 0) { // Log atau tampilkan error // Opsional: kembalikan informasi kegagalan jika diperlukan return [ 'status' => 'partial', 'message' => "{$successCount} data berhasil disimpan, {$failedCount} data gagal", 'success_count' => $successCount, 'failed_count' => $failedCount, 'failed_entries' => $failedEntries ]; } else { // Semua berhasil return [ 'status' => 'success', 'message' => "Semua {$totalRecords} data berhasil disimpan" ]; } } public function index() { $data = Siswa::with('Programs')->get(); $programs = Programs::all(); $programsCount = $programs->count(); $groupPrograms = DB::table('programs') ->leftJoin('siswa', 'programs.id', '=', 'siswa.program_id') ->selectRaw('programs.level, programs.kelas, COUNT(siswa.id) AS jumlah_peserta_program, (SELECT COUNT(*) FROM siswa) AS total_peserta') ->groupBy('programs.id', 'programs.level', 'programs.kelas') ->get(); $totalGuru = Guru::count(); $totalRuangan = Ruangan::count(); $totalKelas = Kelas::count(); $totalSesi = Sesi::count(); $totalJadwal = JadwalKelas::count(); $totalSiswaAktif = $data->whereIn('status', ['Aktif 24 Sesi', 'Aktif 12 Sesi', 'Aktif Ekstra'])->count(); $gaResult = session('ga_log_result'); return view('admin.pages.dashboard', compact( 'data', 'groupPrograms', 'programsCount', 'totalGuru', 'totalRuangan', 'totalKelas', 'totalSesi', 'totalJadwal', 'totalSiswaAktif', 'gaResult' )); } public function dashboardData(){ Carbon::setLocale('id'); $now = Carbon::now(); $tanggalMulai = $now->copy()->subMonths(5)->startOfMonth(); $tanggalAkhir = $now->copy()->endOfMonth(); // --- Data reguler per bulan --- $siswaPerBulanReguler = HistoriSiswa::whereBetween('created_at', [$tanggalMulai, $tanggalAkhir]) ->where(function($q) { $q->where('status', 'Aktif 24 Sesi') ->orWhere('status', 'Aktif 12 Sesi'); }) ->selectRaw("DATE_FORMAT(created_at, '%Y-%m') as bulan_id, COUNT(id) as jumlah_siswa") ->groupBy('bulan_id') ->pluck('jumlah_siswa', 'bulan_id'); // hasil key => value // --- Data ekstra per bulan --- $siswaPerBulanEkstra = HistoriSiswa::whereBetween('created_at', [$tanggalMulai, $tanggalAkhir]) ->where('status', 'Aktif Ekstra') ->selectRaw("DATE_FORMAT(created_at, '%Y-%m') as bulan_id, COUNT(id) as jumlah_siswa") ->groupBy('bulan_id') ->pluck('jumlah_siswa', 'bulan_id'); // --- Siapkan array per bulan (6 bulan terakhir) --- $dataLengkap = []; $dataLengkapReguler = []; $dataLengkapEkstra = []; for ($i = 0; $i < 6; $i++) { $bulan = $now->copy()->subMonths(5 - $i); $bulanId = $bulan->format('Y-m'); $bulanTampil = $bulan->translatedFormat('M Y'); $jumlahReguler = $siswaPerBulanReguler[$bulanId] ?? 0; $jumlahEkstra = $siswaPerBulanEkstra[$bulanId] ?? 0; $dataLengkap[] = [ 'bulan' => $bulanTampil, 'jumlah_siswa' => $jumlahReguler + $jumlahEkstra, ]; $dataLengkapReguler[] = [ 'bulan' => $bulanTampil, 'jumlah_siswa' => $jumlahReguler, ]; $dataLengkapEkstra[] = [ 'bulan' => $bulanTampil, 'jumlah_siswa' => $jumlahEkstra, ]; } // --- Total siswa (berdasarkan status terakhir di tabel Siswa) --- $data = Siswa::get(); $total_siswa_reguler = $data->where('status', 'Aktif 24 Sesi')->count() + $data->where('status', 'Aktif 12 Sesi')->count(); $total_siswa_ekstra = $data->where('status', 'Aktif Ekstra')->count(); $total_siswa_aktif = $total_siswa_reguler + $total_siswa_ekstra; // --- Event dan sesi --- $total_sesi = Logbooks::count(); $total_kelas = Kelas::count(); $total_guru = Guru::count(); $total_ruangan = Ruangan::count(); // --- Data Notifikasi GA Terakhir --- $gaResult = session('ga_log_result'); $gaDataFormatted = null; if ($gaResult) { $gaDataFormatted = [ 'semester' => $gaResult['semester'] ?? 'Genap', 'tahunAjaran' => $gaResult['tahunAjaran'] ?? '2025/2026', 'executionTime' => $gaResult['executionTime'] ?? '0.00', 'generations' => $gaResult['generations'] ?? 0, 'fitness' => isset($gaResult['bestChromosome']) ? number_format($gaResult['bestChromosome']->fitness, 4) : '1.0000', 'isOptimal' => $gaResult['isOptimal'] ?? true, ]; } // --- Kelas hari ini --- $jharini = Logbooks::whereDate('tanggal', Carbon::today())->count(); $jcompleted = Logbooks::whereDate('tanggal', Carbon::today()) ->whereIn('status', ['completed', 'libur']) ->count(); // --- Izin Pending --- $izinpending = []; return response()->json([ 'total_siswa' => $total_siswa_reguler, 'total_siswa_ekstra' => $total_siswa_ekstra, 'total_siswa_aktif' => $total_siswa_aktif, 'data_perbulan' => $dataLengkap, 'data_perbulanreguler' => $dataLengkapReguler, 'data_perbulanekstra' => $dataLengkapEkstra, 'total_sesi' => $total_sesi, 'total_kelas' => $total_kelas, 'total_guru' => $total_guru, 'total_ruangan' => $total_ruangan, 'ga_result' => $gaDataFormatted, 'jharini' => $jharini, 'jcompleted' => $jcompleted, 'izinpending' => $izinpending, ]); } public function dashboardChartData(Request $request) { Carbon::setLocale('id'); $monthCount = min((int) $request->get('months', 5), 24); if ($monthCount < 1) $monthCount = 1; $now = Carbon::now(); $tanggalMulai = $now->copy()->subMonths($monthCount - 1)->startOfMonth(); $tanggalAkhir = $now->copy()->endOfMonth(); // --- Data reguler per bulan --- $siswaPerBulanReguler = HistoriSiswa::whereBetween('created_at', [$tanggalMulai, $tanggalAkhir]) ->where(function($q) { $q->where('status', 'Aktif 24 Sesi') ->orWhere('status', 'Aktif 12 Sesi'); }) ->selectRaw("DATE_FORMAT(created_at, '%Y-%m') as bulan_id, COUNT(id) as jumlah_siswa") ->groupBy('bulan_id') ->pluck('jumlah_siswa', 'bulan_id'); // --- Data ekstra per bulan --- $siswaPerBulanEkstra = HistoriSiswa::whereBetween('created_at', [$tanggalMulai, $tanggalAkhir]) ->where('status', 'Aktif Ekstra') ->selectRaw("DATE_FORMAT(created_at, '%Y-%m') as bulan_id, COUNT(id) as jumlah_siswa") ->groupBy('bulan_id') ->pluck('jumlah_siswa', 'bulan_id'); $labels = []; $dataTotal = []; $dataReguler = []; $dataEkstra = []; for ($i = 0; $i < $monthCount; $i++) { $bulan = $now->copy()->subMonths(($monthCount - 1) - $i); $bulanId = $bulan->format('Y-m'); $jumlahReguler = $siswaPerBulanReguler[$bulanId] ?? 0; $jumlahEkstra = $siswaPerBulanEkstra[$bulanId] ?? 0; $labels[] = $bulan->translatedFormat('M Y'); $dataTotal[] = $jumlahReguler + $jumlahEkstra; $dataReguler[] = $jumlahReguler; $dataEkstra[] = $jumlahEkstra; } return response()->json([ 'labels' => $labels, 'data_total' => $dataTotal, 'data_reguler' => $dataReguler, 'data_ekstra' => $dataEkstra, ]); } }