make(Illuminate\Contracts\Console\Kernel::class); $kernel->bootstrap(); $periode = \App\Models\PeriodeSeleksi::where('status', 'aktif')->first(); if (!$periode) { echo "Tidak ada periode aktif."; exit; } $names = ['GIMO', 'SATUMI', 'NUR DIANA']; $kriteria = \App\Models\Kriteria::orderBy('kode')->get(); $statPerKriteria = \App\Models\PenilaianWarga::where('periode_id', $periode->id) ->groupBy('kriteria_id') ->selectRaw('kriteria_id, MAX(nilai) as max_val, MIN(nilai) as min_val') ->get() ->keyBy('kriteria_id'); foreach ($names as $name) { $wargaList = \App\Models\Warga::where('nama', 'LIKE', '%' . $name . '%')->get(); foreach ($wargaList as $warga) { $penilaian = \App\Models\PenilaianWarga::where('warga_id', $warga->id) ->where('periode_id', $periode->id) ->get() ->keyBy('kriteria_id'); if ($penilaian->count() < 5) continue; $normStr = []; $terbobotStr = []; $skorTotal = 0; foreach ($kriteria as $k) { $nilaiAsli = $penilaian[$k->id]->nilai; $stat = $statPerKriteria[$k->id]; $max = $stat->max_val; $min = $stat->min_val; if ($k->jenis === 'benefit') { $nilaiNormalisasi = $max > 0 ? $nilaiAsli / $max : 0; } else { $nilaiNormalisasi = $nilaiAsli > 0 ? $min / $nilaiAsli : 0; } $nilaiTerbobot = $nilaiNormalisasi * $k->bobot; $skorTotal += $nilaiTerbobot; $normFmt = number_format($nilaiNormalisasi, 3); $bobotFmt = number_format($k->bobot, 2); $terbobotFmt = number_format($nilaiTerbobot, 3); $normStr[] = "({$normFmt} × {$bobotFmt})"; $terbobotStr[] = $terbobotFmt; } $totalFmt = number_format($skorTotal, 3); echo "**{$warga->nama}**\n"; echo implode(" + ", $normStr) . " = " . implode(" + ", $terbobotStr) . " = **{$totalFmt}**\n\n"; } }