MIF_E31221259/app/Http/Controllers/User/PerhitunganAPHController.php

87 lines
2.8 KiB
PHP

<?php
namespace App\Http\Controllers\User;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Diagnosa;
use App\Models\Kriteria;
use App\Models\Kecerdasan;
use Illuminate\Support\Facades\Auth;
class PerhitunganAPHController extends Controller
{
public function index()
{
$kriterias = Kriteria::orderBy('nama')->get();
$kecerdasans = Kecerdasan::orderBy('nama')->get();
return view('user.perhitunganaph', compact('kriterias', 'kecerdasans'));
}
public function analisa(Request $request)
{
$request->validate([
'kondisi' => 'required|array|min:2',
'kondisi.*' => 'regex:/^[A-Za-z0-9]+_[0-4]$/',
], [
'kondisi.min' => 'Pilih minimal 2 kriteria untuk analisa.',
'kondisi.required' => 'Anda harus memilih kriteria.',
]);
$kriterias = Kriteria::orderBy('nama')->get();
$kecerdasans = Kecerdasan::with(['basisPengetahuans' => function ($q) use ($request) {
$ids = array_map(fn($item) => explode('_', $item)[0], $request->input('kondisi', []));
$q->whereIn('kriteria_id', $ids);
}])->orderBy('nama')->get();
// Mapping level ke bobot
$arbobot = [0 => 0, 1 => 0.25, 2 => 0.5, 3 => 0.75, 4 => 1.0];
// Ambil tingkat kepastian per kriteria
$kepastian = [];
foreach ($request->kondisi as $item) {
[$kritId, $lvl] = explode('_', $item);
$kepastian[$kritId] = (int) $lvl;
}
$cfHasil = [];
foreach ($kecerdasans as $kec) {
$cfs = [];
foreach ($kec->basisPengetahuans as $bp) {
$level = $kepastian[$bp->kriteria_id] ?? 0;
$cfs[] = $bp->nilai * $arbobot[$level];
}
// Gabungan CF
$cfTotal = array_reduce($cfs, fn($acc, $cf) => $acc === null ? $cf : $acc + $cf * (1 - $acc), null);
$cfHasil[$kec->id] = round($cfTotal ?? 0, 4);
}
arsort($cfHasil);
$topId = array_key_first($cfHasil);
$presentase = ($cfHasil[$topId] ?? 0) * 100;
// Simpan diagnosa (jika masih ingin simpan ke Diagnosa)
Diagnosa::create([
'user_id' => Auth::id(),
'kecerdasan_id' => $topId,
'presentase' => $presentase,
'catatan' => null,
]);
// Kirim data ke view
return view('user.perhitunganaph', compact(
'kriterias',
'kecerdasans',
'kepastian',
'cfHasil'
))->with('success', 'Analisa berhasil dihitung.');
}
public function reset(Request $request)
{
$request->session()->forget('biodata');
return redirect()->route('user.perhitunganaph.index');
}
}