231 lines
8.4 KiB
PHP
231 lines
8.4 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\DetailSiswa;
|
|
use App\Models\DetailMitra;
|
|
use App\Models\Mitra;
|
|
use App\Models\Siswa;
|
|
use App\Models\Kriteria;
|
|
use Illuminate\Http\Request;
|
|
|
|
|
|
class PenghitunganController extends Controller
|
|
{
|
|
public function index($id)
|
|
{
|
|
$detail_siswa = DetailSiswa::where('id_siswa', $id)->get();
|
|
$detail_mitra = DetailMitra::all();
|
|
$mitra = Mitra::all();
|
|
$kriteria = Kriteria::all();
|
|
$siswa = Siswa::find($id);
|
|
|
|
return view('admin.pages.data-penghitungan', [
|
|
'detail_siswa' => $detail_siswa,
|
|
'detail_mitra' => $detail_mitra,
|
|
'mitra' => $mitra,
|
|
'kriteria' => $kriteria,
|
|
'siswa' => $siswa,
|
|
]);
|
|
}
|
|
|
|
public function index2($id)
|
|
{
|
|
$data_detail_siswa = DetailSiswa::where('id_siswa', $id)->get();
|
|
$data_detail_mitra = DetailMitra::all();
|
|
$datamitra = Mitra::all();
|
|
$datakriteria = Kriteria::all();
|
|
|
|
// Temukan siswa dengan ID tertentu
|
|
$siswa = Siswa::find($id);
|
|
if (!$siswa) {
|
|
return; // Jika siswa tidak ditemukan, keluar dari fungsi
|
|
}
|
|
|
|
$kriteria_list = Kriteria::all();
|
|
$mitra_list = Mitra::all();
|
|
|
|
// 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 / maksimum * 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;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Initialize an array to store the normalized data in a matrix form
|
|
$tampil_normalisasi = [];
|
|
|
|
// Initialize the headers for kriteria
|
|
$kriteria_headers = Kriteria::all()->pluck('name', 'id')->toArray();
|
|
|
|
// Initialize the rows for each mitra
|
|
foreach ($mitra_list as $mitra) {
|
|
$tampil_normalisasi[$mitra->id] = [
|
|
'mitra' => $mitra->name,
|
|
'data' => array_fill_keys(array_keys($kriteria_headers), null)
|
|
];
|
|
}
|
|
|
|
// Fill in the bobot values
|
|
foreach ($data_normalisasi as $id_mitra => $normalisasi) {
|
|
foreach ($normalisasi as $id_kriteria => $bobot) {
|
|
$tampil_normalisasi[$id_mitra]['data'][$id_kriteria] = $bobot;
|
|
}
|
|
}
|
|
// dd($tampil_normalisasi);
|
|
|
|
// 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 ke terkecil
|
|
arsort($nilai_akhir);
|
|
|
|
// // Menentukan perangkingan
|
|
// $perangkingan = [];
|
|
// $ranking = 1;
|
|
// foreach ($nilai_akhir as $id_mitra => $nilai) {
|
|
// $perangkingan[] = [
|
|
// 'mitra' => Mitra::find($id_mitra)->name,
|
|
// 'nilai' => $nilai,
|
|
// 'ranking' => $ranking,
|
|
// ];
|
|
// $ranking++;
|
|
// }
|
|
|
|
// // buat perankingan, namun nilai yang sama memiliki ranking yang sama
|
|
// $perangkingan_nilai_sama = [];
|
|
// $ranking = 1;
|
|
// $nilai_sebelumnya = null;
|
|
// foreach ($perangkingan as $key => $value) {
|
|
// if ($nilai_sebelumnya == $value['nilai']) {
|
|
// $perangkingan_nilai_sama[] = [
|
|
// 'mitra' => $value['mitra'],
|
|
// 'nilai' => $value['nilai'],
|
|
// 'ranking' => $ranking,
|
|
// ];
|
|
// } else {
|
|
// $perangkingan_nilai_sama[] = [
|
|
// 'mitra' => $value['mitra'],
|
|
// 'nilai' => $value['nilai'],
|
|
// 'ranking' => $ranking,
|
|
// ];
|
|
// }
|
|
// $nilai_sebelumnya = $value['nilai'];
|
|
// $ranking++;
|
|
// }
|
|
|
|
|
|
// $urut_by_ranking = collect($perangkingan)->sortByDesc('nilai')->values()->all();
|
|
|
|
// Menentukan perangkingan
|
|
$perangkingan = [];
|
|
foreach ($nilai_akhir as $id_mitra => $nilai) {
|
|
$perangkingan[] = [
|
|
'mitra' => Mitra::find($id_mitra)->name,
|
|
'nilai' => $nilai,
|
|
];
|
|
}
|
|
|
|
// Urutkan perangkingan berdasarkan nilai dari yang terbesar ke yang terkecil
|
|
usort($perangkingan, function ($a, $b) {
|
|
return $b['nilai'] <=> $a['nilai'];
|
|
});
|
|
|
|
// Buat perankingan, namun nilai yang sama memiliki ranking yang sama
|
|
$perangkingan_nilai_sama = [];
|
|
$ranking = 1;
|
|
$nilai_sebelumnya = null;
|
|
foreach ($perangkingan as $key => $value) {
|
|
if ($nilai_sebelumnya !== $value['nilai']) {
|
|
$ranking = $key + 1; // Peringkat sesuai dengan posisi dalam array setelah diurutkan
|
|
}
|
|
$perangkingan_nilai_sama[] = [
|
|
'mitra' => $value['mitra'],
|
|
'nilai' => $value['nilai'],
|
|
'ranking' => $ranking,
|
|
];
|
|
$nilai_sebelumnya = $value['nilai'];
|
|
}
|
|
|
|
// perangkingan_nilai_sama hanya 5 data
|
|
$perangkingan_nilai_sama = array_slice($perangkingan_nilai_sama, 0, 5);
|
|
|
|
|
|
|
|
return view('admin.pages.hitung', [
|
|
'detail_siswa' => $data_detail_siswa,
|
|
'detail_mitra' => $data_detail_mitra,
|
|
'mitra' => $datamitra,
|
|
'kriteria' => $datakriteria,
|
|
'siswa' => $siswa,
|
|
// 'perangkingan' => $urut_by_ranking,
|
|
'perangkingan_nilai_sama' => $perangkingan_nilai_sama,
|
|
'tampil_normalisasi' => $tampil_normalisasi,
|
|
'kriteria_headers' => $kriteria_headers,
|
|
]);
|
|
}
|
|
|
|
public function rekomendasimitrabyadmin(Request $request)
|
|
{
|
|
$mitra = Mitra::where('name', $request->mitra)->first();
|
|
$batas_jumlah_siswa_mitra = $mitra->batas_siswa;
|
|
|
|
$cek = Siswa::where('rekomendasi', $request->mitra)->count();
|
|
if ($cek >= $batas_jumlah_siswa_mitra) {
|
|
return redirect()->back()->with('addmitrabyadmingagal', 'Rekomendasi gagal diubah, batas jumlah siswa mitra sudah tercapai');
|
|
}
|
|
|
|
$siswa = Siswa::find($request->id_siswa);
|
|
$siswa->rekomendasi = $request->mitra;
|
|
$siswa->rekomendasi_by = 'Admin';
|
|
$siswa->save();
|
|
|
|
return redirect()->back()->with('addmitrabyadmin', 'Rekomendasi berhasil diubah');
|
|
}
|
|
|
|
public function batalkanmitra(Request $request)
|
|
{
|
|
$siswa = Siswa::find($request->id_siswa);
|
|
$siswa->rekomendasi = null;
|
|
$siswa->rekomendasi_by = 'Sistem';
|
|
$siswa->save();
|
|
|
|
return redirect()->back()->with('batalkanmitra', 'Rekomendasi berhasil dibatalkan');
|
|
}
|
|
}
|