delete(); foreach ($waktuMakans as $waktu) { // Ambil preferensi bobot kriteria untuk waktu makan ini $preferensiBobot = \App\Models\PreferensiWaktuKriteria::where('waktu_makan_id', $waktu->id) ->pluck('bobot', 'kriteria_id'); foreach ($komponens as $komponen) { $makanans = Makanan::whereHas('komponenWaktu', function ($query) use ($komponen, $waktu) { $query->where('komponen_id', $komponen->id) ->where('waktu_makan_id', $waktu->id); })->get(); if ($makanans->isEmpty()) continue; $total = [ 'lemak' => $makanans->sum('lemak') ?: 1, 'natrium' => $makanans->sum('natrium') ?: 1, 'energi' => $makanans->sum('energi') ?: 1, 'karbohidrat' => $makanans->sum('karbohidrat') ?: 1, ]; foreach ($makanans as $makanan) { $skor = 0; foreach ($kriterias as $kriteria) { $attr = strtolower($kriteria->nama); $nilai = $makanan->$attr ?? 0; // Normalisasi $normalized = in_array($attr, ['lemak', 'natrium']) ? 1 - ($nilai / $total[$attr]) : $nilai / $total[$attr]; // Gunakan preferensi waktu jika ada, jika tidak fallback $bobot = $preferensiBobot[$kriteria->id] ?? $defaultBobots[$kriteria->id] ?? 0; $skor += $normalized * $bobot; SkorMakanan::updateOrCreate([ 'kriteria_id' => $kriteria->id, 'makanan_id' => $makanan->id, ], [ 'nilai' => $normalized ]); } // Simpan nilai akhir ke rekomendasi Rekomendasi::updateOrCreate( [ 'user_id' => Auth::id(), 'makanan_id' => $makanan->id, 'komponen_id' => $komponen->id, 'waktu_makan_id' => $waktu->id, ], [ 'nilai_akhir' => $skor, 'tanggal_rekomendasi' => now(), ] ); } } } return redirect()->route('rekomendasi.hasil')->with('success', 'Rekomendasi berhasil dihitung dengan bobot preferensi waktu.'); } public function tampilHasil() { $rekomendasi = Rekomendasi::with('makanan', 'komponen', 'waktuMakan') ->where('user_id', Auth::id()) // ->whereDate('tanggal_rekomendasi', now()) ->get(); // Urutan komponen manual $urutanKomponen = ['karbohidrat', 'protein', 'sayur', 'buah', 'susu']; // Hitung total nilai_akhir per waktu & komponen $totalPerGroup = []; foreach ($rekomendasi as $r) { $waktu = strtolower($r->waktuMakan->nama); $komponen = strtolower($r->komponen->nama); $totalPerGroup[$waktu][$komponen] = ($totalPerGroup[$waktu][$komponen] ?? 0) + $r->nilai_akhir; } // Group dan sort data $rekomendasiGrouped = $rekomendasi ->groupBy([ fn($item) => strtolower($item->waktuMakan->nama), fn($item) => strtolower($item->komponen->nama), ]); foreach ($rekomendasiGrouped as $waktu => $komponens) { $sorted = collect(); foreach ($urutanKomponen as $target) { if ($komponens->has($target)) { // Tambahkan properti persentase ke setiap item $komponens[$target]->each(function ($item) use ($totalPerGroup, $waktu, $target) { $total = $totalPerGroup[$waktu][$target] ?: 1; $item->persentase = ($item->nilai_akhir / $total) * 100; }); $sorted[$target] = $komponens[$target]->sortByDesc('nilai_akhir'); } } $rekomendasiGrouped[$waktu] = $sorted; } return view('admin.rekomendasi', ['rekomendasi' => $rekomendasiGrouped]); } }