TIF_E41200115/app/Http/Controllers/ProsesPerhitunganController...

118 lines
4.1 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Balita;
use App\Models\dataBalita;
use App\Models\Kriteria;
use App\Models\Nilai;
use Illuminate\Http\Request;
class ProsesPerhitunganController extends Controller
{
public function index()
{
$balita = Balita::all();
$kriteria = Kriteria::all();
$nilai = Nilai::all();
$output = [];
// mendapatkan nilai maksimum dari setiap kdKriteria
$maxNilaiByKriteria = $nilai->groupBy('kdKriteria')->map(function ($grouped) {
return $grouped->max('nilai');
});
// Loop untuk mengumpulkan data untuk setiap balita
foreach ($balita as $b) {
$kdbalita = $b->kdbalita;
$namaBalita = $b->balita;
// Mengonversi nilai-nilai balita terpilih ke dalam bentuk array
$nilaiBalita = $nilai->where('kdbalita', $kdbalita)->toArray();
// Normalisasi nilai berdasarkan nilai maksimum untuk setiap kdKriteria
$normalizedNilai = array_map(function ($nilaiItem) use ($kriteria, $maxNilaiByKriteria) {
$matchingKriteria = $kriteria->where('kdKriteria', $nilaiItem['kdKriteria'])->first();
if ($matchingKriteria) {
$kdKriteria = $matchingKriteria->kdKriteria;
// Normalisasi nilai menggunakan nilai maksimum yang sesuai untuk setiap kdKriteria
$maxValueForKriteria = $maxNilaiByKriteria->get($kdKriteria);
if ($maxValueForKriteria) {
$normalizedValue = $nilaiItem['nilai'] / $maxValueForKriteria;
}
$nilaiItem['bobot'] = $matchingKriteria->bobot;
$nilaiItem['kriteria'] = $matchingKriteria->kriteria;
$nilaiItem['normalized'] = $normalizedValue;
$nilaiItem['nilaimaximum'] = $maxValueForKriteria;
$nilaiItem['nilai_preferensi'] = $normalizedValue * $nilaiItem['bobot'];
}
return $nilaiItem;
}, $nilaiBalita);
// Menghitung total preferensi untuk balita
$totalPreferensi = array_sum(array_column($normalizedNilai, 'nilai_preferensi'));
// Menentukan kategori gizi
if ($totalPreferensi > 90) {
$kategoriGizi = 'Gizi Baik';
} elseif ($totalPreferensi >= 81 && $totalPreferensi <= 90) {
$kategoriGizi = 'Gizi Sedang';
} elseif ($totalPreferensi >= 71 && $totalPreferensi <= 80) {
$kategoriGizi = 'Gizi Kurang';
} else {
$kategoriGizi = 'Gizi Buruk';
}
// Get additional data
$tanggal_timbang = dataBalita::where('nama_balita', $namaBalita)->value('tanggal_timbang');
$berat_badan = dataBalita::where('nama_balita', $namaBalita)->value('berat_badan');
$tinggi_badan = dataBalita::where('nama_balita', $namaBalita)->value('tinggi_badan');
// Menambahkan hasil kategori gizi tanpa melakukan perankingan
$output[] = [
'kdbalita' => $kdbalita,
'nama_balita' => $namaBalita,
'nilai' => $nilaiBalita,
'berat_badan' => $berat_badan,
'tinggi_badan' => $tinggi_badan,
'tanggal_timbang' => $tanggal_timbang,
'normalized_nilai' => $normalizedNilai,
'total_preferensi' => $totalPreferensi,
'kategori_gizi' => $kategoriGizi,
];
}
// Mengurutkan hasil berdasarkan total preferensi
usort($output, function ($a, $b) {
return $b['total_preferensi'] <=> $a['total_preferensi'];
});
// Menambahkan peringkat ke output
$currentRank = 1;
$previousTotalPreferensi = null;
foreach ($output as &$item) {
// Mengatur peringkat hanya ketika total preferensi berbeda dari entri sebelumnya
if ($item['total_preferensi'] !== $previousTotalPreferensi) {
$item['ranking'] = $currentRank;
}
// Increment the rank
$currentRank++;
}
// Mengurutkan hasil berdasarkan kdbalita
usort($output, function ($a, $b) {
return $a['kdbalita'] <=> $b['kdbalita'];
});
return view('pages.proses.index', [
'output' => $output,
]);
}
}