MIF_E31210701/app/Http/Controllers/PenghitunganController.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');
}
}