273 lines
9.5 KiB
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);
|
|
// }
|
|
}
|