MIF_E31210400/app/Http/Controllers/AnalisaController.php

321 lines
12 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
use DataTables;
use GuzzleHttp\Client;
use Carbon\Carbon;
use App\Models\Kriteria;
use App\Models\Alternatif;
use App\Models\AnalisaAlternatif;
use App\Models\AnalisaKriteria;
use App\Models\Nilai;
use App\Models\{BobotKriteria,BobotAlternatif,NilaiRandom};
class AnalisaController extends Controller
{
public function alternatif(Request $request)
{
$validator = Validator::make($request->all(), [
'kriteria' => 'required'
]);
if($validator->fails())
{
return redirect()->back()->with('error', 'Kriteria tidak boleh kosong');
}
$data = [
'subtitle' => 'Analisa Alternatif',
];
$id_kriteria = $request->input('kriteria');
if($request->input('delete'))
{
return $this->deleteAnalisaAlternatif($id_kriteria);
} else {
return view('admin.app.content.analisa.alternatif', compact('data', 'id_kriteria'));
}
}
public function kriteria()
{
$data = [
'subtitle' => 'Analisa Kriteria',
];
return view('admin.app.content.analisa.kriteria', compact('data'));
}
public function kriteriaTabel(Request $request)
{
if($request->isMethod('post')) {
// Jumlah Kriteria
$n = Kriteria::count();
$matrik = array();
$urut = 0;
// Memetakan nilai dalam bentuk matrik
// x = baris
// y = kolom
for ($x = 0; $x <= ($n - 2); $x++) {
for ($y = ($x + 1); $y <= ($n - 1); $y++) {
$urut++;
$pilih = "pilih" . $urut;
$bobot = "bobot" . $urut;
// memilih input radio button yang dipilih apakah yang kiri atau kanan
// jika kiri maka otomatis nilai matrix 1 dibagi bobot nilai tersebut dengan format x dan y
if ($request->input($pilih) == 1) {
$matrik[$x][$y] = $request->input($bobot);
$matrik[$y][$x] = 1 / $request->input($bobot);
} else {
$matrik[$x][$y] = 1 / $request->input($bobot);
$matrik[$y][$x] = $request->input($bobot);
}
$id_kriteria1 = getKriteriaId($x);
$id_kriteria2 = getKriteriaId($y);
$jumlahPerbandingan = AnalisaKriteria::where('kriteria_pertama', $id_kriteria1)->where('kriteria_kedua', $id_kriteria2)->count();
if ($jumlahPerbandingan == 0) {
$insert = new AnalisaKriteria([
'kriteria_pertama' => $id_kriteria1,
'kriteria_kedua' => $id_kriteria2,
'nilai_analisa_kriteria' => $matrik[$x][$y]
]);
$insert->save();
} else {
$nilaiMatrixKriteria = $matrik[$x][$y];
$update = DB::statement("UPDATE tbl_analisa_kriteria SET nilai_analisa_kriteria = '$nilaiMatrixKriteria' WHERE kriteria_pertama = '$id_kriteria1' AND kriteria_kedua = '$id_kriteria2'");
}
}
}
// Diagonal -> bernilai 1
for ($i = 0; $i <= ($n - 1); $i++) {
$matrik[$i][$i] = 1;
}
// Inisialisasi jumlah tiap kolom dan baris kriteria
$jmlmpb = array();
$jmlmnk = array();
for ($i = 0; $i <= ($n - 1); $i++) {
$jmlmpb[$i] = 0;
$jmlmnk[$i] = 0;
}
// Menghitung jumlah pada kolom kriteria tabel perbandingan berpasangan
for ($x = 0; $x <= ($n - 1); $x++) {
for ($y = 0; $y <= ($n - 1); $y++) {
$value = $matrik[$x][$y];
$jmlmpb[$y] += $value;
}
}
// Menghitung jumlah pada baris kriteria tabel nilai kriteria
// Matrikb merupakan matrik yang telah dinormalisasi
for ($x = 0; $x <= ($n - 1); $x++) {
for ($y = 0; $y <= ($n - 1); $y++) {
$matrikb[$x][$y] = $matrik[$x][$y] / $jmlmpb[$y];
$value = $matrikb[$x][$y];
$jmlmnk[$x] += $value;
}
// Nilai Priority Vektor
$pv[$x] = $jmlmnk[$x] / $n;
// Memasukan nilai priority vektor ke dalam tabel tb_pv_kriteria
$id_kriteria = getKriteriaId($x);
$jumlahPV = BobotKriteria::where('id_kriteria', $id_kriteria)->count();
if ($jumlahPV == 0) {
$insert = new BobotKriteria([
'id_kriteria' => $id_kriteria,
'nilai' => $pv[$x]
]);
$insert->save();
} else {
$nilaiPV = $pv[$x];
$update = DB::statement("UPDATE tb_bobot_alternatif SET nilai = '$nilaiPV' WHERE id_kriteria = '$id_kriteria'");
}
}
$eigenVektor = getEigenVector($jmlmpb, $jmlmnk, $n);
$consIndex = getConsIndex($jmlmpb, $jmlmnk, $n);
$consRatio = getConsRatio($jmlmpb, $jmlmnk, $n);
$data['n'] = $n;
$data['matrik'] = $matrik;
$data['jmlmpb'] = $jmlmpb;
$data['jmlmnk'] = $jmlmnk;
$data['matrikb'] = $matrikb;
$data['pv'] = $pv;
$data['eigenVektor'] = $eigenVektor;
$data['consIndex'] = $consIndex;
$data['consRatio'] = $consRatio;
}
$data['subtitle'] = 'Analisa Kriteria Tabel';
return view('admin.app.content.analisa.kriteria-tabel', compact('data'));
}
public function deleteKriteria($id_kriteria)
{
if(AnalisaKriteria::delete() && BobotKriteria::delete()) {
return redirect()->to(app_url('analisa-kriteria'))->with('success', 'Data kriteria berhasil di hapus');
} else {
return redirect()->back()->with('error', 'Data alternatif tidak ditemukan');
}
}
public function alternatifForm()
{
$data = [
'subtitle' => 'Alternatif Form'
];
return view('admin.app.content.analisa.alternatif-form', compact('data'));
}
public function alternatifTabel(Request $request, $id_kriteria)
{
if($request->isMethod('post')) {
// Jumlah Alternatif
$n = Alternatif::count();
$matrik = array();
$urut = 0;
// Memetakan nilai dalam bentuk matrik
// x = baris
// y = kolom
for ($x = 0; $x <= ($n - 2); $x++) {
for ($y = ($x + 1); $y <= ($n - 1); $y++) {
$urut++;
$pilih = "pilih" . $urut;
$bobot = "bobot" . $urut;
// Ambil nilai bobot dari request, jika tidak ada, set nilai default 0
$nilaiBobot = $request->input($bobot) ?? 0;
// memilih input radio button yang dipilih apakah yang kiri atau kanan
// jika kiri maka otomatis nilai matrix 1 dibagi bobot nilai tersebut dengan format x dan y
if ($request->input($pilih) == 1) {
$matrik[$x][$y] = $nilaiBobot;
$matrik[$y][$x] = $nilaiBobot != 0 ? 1 / $nilaiBobot : 0;
} else {
$matrik[$x][$y] = $nilaiBobot != 0 ? 1 / $nilaiBobot : 0;
$matrik[$y][$x] = $nilaiBobot;
}
$id_alternatif1 = getAlternatifId($x);
$id_alternatif2 = getAlternatifId($y);
$jumlahPerbandingan = AnalisaAlternatif::where('alternatif_pertama', $id_alternatif1)->where('alternatif_kedua', $id_alternatif2)->where('id_kriteria', $id_kriteria)->count();
if ($jumlahPerbandingan == 0) {
$insert = new AnalisaAlternatif([
'alternatif_pertama' => $id_alternatif1,
'alternatif_kedua' => $id_alternatif2,
'id_kriteria' => $id_kriteria,
'nilai_analisa_alternatif' => $matrik[$x][$y]
]);
$insert->save();
} else {
$nilaiMatrixAlternatif = $matrik[$x][$y];
$update = DB::statement("UPDATE tbl_analisa_alternatif SET nilai_analisa_alternatif = '$nilaiMatrixAlternatif' WHERE id_kriteria = '$id_kriteria' AND alternatif_pertama = '$id_alternatif1' AND alternatif_kedua = '$id_alternatif2'");
}
}
}
// Diagonal -> bernilai 1
for ($i = 0; $i <= ($n - 1); $i++) {
$matrik[$i][$i] = 1;
}
// Inisialisasi jumlah tiap kolom dan baris kriteria
$jmlmpb = array();
$jmlmnk = array();
for ($i = 0; $i <= ($n - 1); $i++) {
$jmlmpb[$i] = 0;
$jmlmnk[$i] = 0;
}
// Menghitung jumlah pada kolom kriteria tabel perbandingan berpasangan
for ($x = 0; $x <= ($n - 1); $x++) {
for ($y = 0; $y <= ($n - 1); $y++) {
$value = $matrik[$x][$y];
$jmlmpb[$y] += $value;
}
}
// Menghitung jumlah pada baris kriteria tabel nilai kriteria
// Matrikb merupakan matrik yang telah dinormalisasi
for ($x = 0; $x <= ($n - 1); $x++) {
for ($y = 0; $y <= ($n - 1); $y++) {
$matrikb[$x][$y] = $matrik[$x][$y] / $jmlmpb[$y];
$value = $matrikb[$x][$y];
$jmlmnk[$x] += $value;
}
// Nilai Priority Vektor
$pv[$x] = $jmlmnk[$x] / $n;
// Memasukan nilai priority vektor ke dalam tabel tb_pv_kriteria
$id_alternatif = getAlternatifId($x);
$jumlahPV = BobotAlternatif::where('id_kriteria', $id_kriteria)->where('id_alternatif', $id_alternatif)->count();
if ($jumlahPV == 0) {
$insert = new BobotAlternatif([
'id_alternatif' => $id_alternatif,
'id_kriteria' => $id_kriteria,
'nilai' => $pv[$x]
]);
$insert->save();
} else {
$nilaiPV = $pv[$x];
$update = DB::statement("UPDATE tb_bobot_alternatif SET nilai = '$nilaiPV' WHERE id_kriteria = '$id_kriteria' AND id_alternatif = '$id_alternatif'");
}
}
$eigenVektor = getEigenVector($jmlmpb, $jmlmnk, $n);
$consIndex = getConsIndex($jmlmpb, $jmlmnk, $n);
$consRatio = getConsRatio($jmlmpb, $jmlmnk, $n);
$data['n'] = $n;
$data['matrik'] = $matrik;
$data['jmlmpb'] = $jmlmpb;
$data['jmlmnk'] = $jmlmnk;
$data['matrikb'] = $matrikb;
$data['pv'] = $pv;
$data['eigenVektor'] = $eigenVektor;
$data['consIndex'] = $consIndex;
$data['consRatio'] = $consRatio;
}
$data['subtitle'] = 'Analisa Alternatif Tabel';
return view('admin.app.content.analisa.alternatif-tabel', compact('data'));
}
public function deleteAnalisaAlternatif($id_kriteria)
{
$data_alternatif = AnalisaAlternatif::where('id_kriteria', $id_kriteria);
$bobot_alternatif = BobotAlternatif::where('id_kriteria', $id_kriteria);
if($data_alternatif->delete() && $bobot_alternatif->delete()) {
return redirect()->to(app_url('analisa-alternatif-form'))->with('success', 'Data alternatif berhasil di hapus');
} else {
return redirect()->back()->with('error', 'Data alternatif tidak ditemukan');
}
}
}