MIF_E31210701/app/Http/Controllers/SiswaController.php

273 lines
9.5 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Mitra;
use App\Models\Siswa;
use App\Models\Kriteria;
use App\Models\DetailMitra;
use App\Models\DetailSiswa;
use App\Models\NilaiKepentingan;
use App\Imports\SiswaImport;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Maatwebsite\Excel\Facades\Excel;
class SiswaController extends Controller
{
public function hitungRekomendasiSemuaSiswa()
{
$siswa_list = Siswa::with('detailSiswa')
->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);
// }
}