select('tb_siswa.*', DB::raw('SUM(tb_detail_siswa.nilai) as total_nilai')) ->leftJoin('tb_detail_siswa', 'tb_siswa.id', '=', 'tb_detail_siswa.id_siswa') ->groupBy('tb_siswa.id', 'tb_siswa.nisn', 'tb_siswa.name', 'tb_siswa.rekomendasi', 'tb_siswa.rekomendasi_by', 'tb_siswa.created_at', 'tb_siswa.updated_at') ->orderByDesc('total_nilai') ->get(); $kriteria_list = Kriteria::all(); $mitra_list = Mitra::all(); // foreach ($siswa_list as $gatauya) { // if ($gatauya->rekomendasi_by == 'Sistem') { // $gatauya->rekomendasi = null; // $gatauya->save(); // } // } foreach ($siswa_list as $siswa) { // cek apakah ada detail siswa kurang dari 6 if ($siswa->detailSiswa->count() < 6) { continue; } // Inisialisasi nilai maksimum dan minimum untuk setiap kriteria $nilai_maks = []; $nilai_min = []; $data_alternatif = []; $data_normalisasi = []; // menentukan data alternatif berdasarkan id kriteria dan id nilai kepentingan dari detail siswa, kemudian di cocokkan dengan detail mitra, jika cocok maka ambil bobot dari detail mitra foreach ($siswa->detailSiswa as $detail_siswa) { foreach ($mitra_list as $mitra) { foreach ($mitra->detailMitra as $detail_mitra) { if ( $detail_mitra->id_kriteria == $detail_siswa->id_kriteria && $detail_mitra->id_nilai_kepentingan == $detail_siswa->id_nilai_kepentingan ) { $data_alternatif[$mitra->id][$detail_siswa->id_kriteria] = $detail_mitra->bobot; } } } } // Menentukan nilai maksimum dan minimum dari setiap kriteria pada data alternatif foreach ($kriteria_list as $kriteria) { $nilai_maks[$kriteria->id] = max(array_column($data_alternatif, $kriteria->id)); $nilai_min[$kriteria->id] = min(array_column($data_alternatif, $kriteria->id)); } // normalisasi data alternatif jika benefit (bobot alternatif / maximum * bobot_kriteria) jika cost (minimum * bobot_alternatif / bobot_kriteria) foreach ($data_alternatif as $id_mitra => $alternatif) { $data_normalisasi[$id_mitra] = []; foreach ($alternatif as $id_kriteria => $bobot) { $kriteria = Kriteria::find($id_kriteria); if ($kriteria->jenis == 'Benefit') { $data_normalisasi[$id_mitra][$id_kriteria] = $bobot / $nilai_maks[$id_kriteria] * $kriteria->bobot; } else { $data_normalisasi[$id_mitra][$id_kriteria] = $nilai_min[$id_kriteria] / $bobot * $kriteria->bobot; } } } // Menentukan nilai akhir dari data normalisasi $nilai_akhir = []; foreach ($data_normalisasi as $id_mitra => $normalisasi) { $nilai_akhir[$id_mitra] = array_sum($normalisasi); } // Mengurutkan nilai akhir dari yang terbesar arsort($nilai_akhir); // buat array perangkingan dari 1 hingga seterusnya berdasarkan nilai akhir $perangkingan = []; $ranking = 1; foreach ($nilai_akhir as $id_mitra => $nilai) { $perangkingan[] = [ 'mitra' => Mitra::find($id_mitra)->name, 'nilai' => $nilai, 'ranking' => $ranking, ]; $ranking++; } // Periksa rekomendasi dan tetapkan jika belum ada dan jika belum mencapai batas maksimal foreach ($perangkingan as $ranking) { $nama_mitra = $ranking['mitra']; // Skip if the student already has this recommendation if ($siswa->rekomendasi_by == 'Admin') { break; } elseif ($siswa->rekomendasi == $nama_mitra && $siswa->rekomendasi_by == 'Sistem') { break; } elseif ($siswa->rekomendasi == $nama_mitra && $siswa->rekomendasi_by == 'Admin') { break; } $rekomendasi_count = Siswa::where('rekomendasi', $nama_mitra)->count(); $batas_siswa = Mitra::where('name', $nama_mitra)->first()->batas_siswa; if ($rekomendasi_count < $batas_siswa) { $siswa->rekomendasi = $nama_mitra; $siswa->save(); break; } } } } public function index2() { $mitra = Mitra::all(); $siswa = Siswa::all(); $this->hitungRekomendasiSemuaSiswa(); return view('admin.pages.data-siswa', [ 'siswa' => $siswa, 'mitra' => $mitra, ]); } public function store(Request $request) { $this->validate($request, [ 'nisn' => 'required|unique:tb_siswa,nisn', 'name' => 'required', ], [ 'nisn.required' => 'NISN tidak boleh kosong', 'nisn.unique' => 'NISN sudah terdaftar', 'name.required' => 'Nama tidak boleh kosong', ]); Siswa::create([ 'nisn' => $request->nisn, 'name' => $request->name, ]); return redirect('/data-siswa')->with('store', 'Data berhasil ditambahkan'); } public function update(Request $request, $id) { $this->validate($request, [ 'nisn' => 'required|unique:tb_siswa,nisn,' . $id, 'name' => 'required', ], [ 'nisn.required' => 'NISN tidak boleh kosong', 'nisn.unique' => 'NISN sudah terdaftar', 'name.required' => 'Nama tidak boleh kosong', ]); Siswa::where('id', $id)->update([ 'nisn' => $request->nisn, 'name' => $request->name, ]); return redirect('/data-siswa')->with('update', 'Data berhasil diubah'); } public function destroy($id) { $detail_siswa = DetailSiswa::where('id_siswa', $id)->get(); foreach ($detail_siswa as $ds) { $ds->delete(); } Siswa::destroy($id); return redirect('/data-siswa')->with('destroy', 'Data berhasil dihapus'); } public function import(Request $request) { set_time_limit(500); $request->validate([ 'file' => 'required' ], [ 'file.required' => 'File tidak boleh kosong', ]); $file = $request->file('file'); $namafile = rand() . time() . '.' . $file->getClientOriginalExtension(); $file->move('excel/siswa', $namafile); Excel::import(new SiswaImport, public_path('/excel/siswa/' . $namafile)); return redirect()->back()->with('store', 'Data berhasil diimport'); } // public function rekomendasiSiswa(Request $request) // { // $id_siswa = $request->id_siswa; // // menangkap array data mitra // $array_data_mitra = $request->data; // // Ambil siswa berdasarkan ID // $siswa = Siswa::find($id_siswa); // if (!$siswa) { // return response()->json(['success' => false, 'message' => 'Siswa tidak ditemukan.'], 404); // } // // Ambil semua siswa untuk menghitung rekomendasi // $semua_siswa = Siswa::all(); // $mitra_count = []; // // Hitung jumlah rekomendasi per mitra // foreach ($semua_siswa as $s) { // if ($s->rekomendasi) { // if (!isset($mitra_count[$s->rekomendasi])) { // $mitra_count[$s->rekomendasi] = 0; // } // $mitra_count[$s->rekomendasi]++; // } // } // // Urutkan array data mitra berdasarkan ranking // usort($array_data_mitra, function ($a, $b) { // return $a['ranking'] - $b['ranking']; // }); // // Cari mitra dengan peringkat tertinggi yang jumlah rekomendasinya kurang dari 5 // foreach ($array_data_mitra as $mitra) { // $nama_mitra = $mitra['mitra']; // if (!isset($mitra_count[$nama_mitra])) { // $mitra_count[$nama_mitra] = 0; // } // // Check if the mitra has less than 5 recommendations // if ($mitra_count[$nama_mitra] < 5) { // $siswa->rekomendasi = $nama_mitra; // $siswa->save(); // return response()->json(['success' => true, 'message' => 'Rekomendasi berhasil disimpan.']); // } // } // // Jika tidak ada mitra yang valid, kirimkan respon gagal // return response()->json(['success' => false, 'message' => 'Tidak ada mitra yang valid untuk direkomendasikan.'], 400); // } }