From e8c1e4bbaddf00636b22df6f147da2baeded6cc3 Mon Sep 17 00:00:00 2001 From: Alfiansyahp2 Date: Thu, 22 May 2025 08:46:05 +0700 Subject: [PATCH] perubahan besar-besaran --- app/Http/Controllers/AdminController.php | 6 +- app/Http/Controllers/MakananController.php | 174 ++++++++++++++- .../Controllers/PengecualianController.php | 38 ++++ app/Http/Controllers/ProsesController.php | 19 -- .../Controllers/RekomendasiController.php | 184 ++++++++------- app/Http/Controllers/UserController.php | 38 ++-- app/Models/Komponen.php | 25 +++ app/Models/Makanan.php | 21 ++ app/Models/MakananKomponenWaktu.php | 30 +++ app/Models/PengecualianMakanan.php | 24 ++ app/Models/PreferensiWaktuKriteria.php | 35 +++ app/Models/Rekomendasi.php | 13 +- app/Models/RekomendasiAhli.php | 38 ++++ app/Models/WaktuMakan.php | 27 +++ ...25_05_19_144646_create_komponens_table.php | 29 +++ ...05_19_144814_create_waktu_makans_table.php | 28 +++ ...30_create_makanan_komponen_waktu_table.php | 30 +++ ...d_komponen_waktu_to_rekomendasis_table.php | 37 ++++ ..._022625_create_rekomendasi_ahlis_table.php | 36 +++ ...1_add_keterangan_to_waktu_makans_table.php | 25 +++ ...an_id_column_on_rekomendasi_ahli_table.php | 40 ++++ ...n_id_to_text_on_rekomendasi_ahli_table.php | 48 ++++ ...create_preferensi_waktu_kriteria_table.php | 30 +++ ...007_create_pengecualian_makanans_table.php | 31 +++ .../views/admin/alternatif/pilih.blade.php | 73 +++--- .../views/admin/komponen/komponen.blade.php | 57 +++++ .../views/admin/pengecualian/form.blade.php | 0 resources/views/admin/profile.blade.php | 24 +- .../views/admin/proses/normalisasi.blade.php | 23 +- resources/views/admin/rekomendasi.blade.php | 209 ++++++++---------- resources/views/admin/relasi/edit.blade.php | 52 +++++ resources/views/admin/relasi/relasi.blade.php | 143 ++++++++++++ .../admin/waktumakan/waktumakan.blade.php | 57 +++++ resources/views/layout/app.blade.php | 3 + resources/views/layout/footer.blade.php | 4 +- resources/views/layout/sidebar.blade.php | 35 ++- resources/views/user/userresult.blade.php | 184 ++++++++------- routes/web.php | 34 ++- 38 files changed, 1503 insertions(+), 401 deletions(-) create mode 100644 app/Http/Controllers/PengecualianController.php create mode 100644 app/Models/Komponen.php create mode 100644 app/Models/MakananKomponenWaktu.php create mode 100644 app/Models/PengecualianMakanan.php create mode 100644 app/Models/PreferensiWaktuKriteria.php create mode 100644 app/Models/RekomendasiAhli.php create mode 100644 app/Models/WaktuMakan.php create mode 100644 database/migrations/2025_05_19_144646_create_komponens_table.php create mode 100644 database/migrations/2025_05_19_144814_create_waktu_makans_table.php create mode 100644 database/migrations/2025_05_19_145030_create_makanan_komponen_waktu_table.php create mode 100644 database/migrations/2025_05_19_192655_add_komponen_waktu_to_rekomendasis_table.php create mode 100644 database/migrations/2025_05_21_022625_create_rekomendasi_ahlis_table.php create mode 100644 database/migrations/2025_05_21_024331_add_keterangan_to_waktu_makans_table.php create mode 100644 database/migrations/2025_05_21_031438_modify_makanan_id_column_on_rekomendasi_ahli_table.php create mode 100644 database/migrations/2025_05_21_031901_change_makanan_id_to_text_on_rekomendasi_ahli_table.php create mode 100644 database/migrations/2025_05_21_063336_create_preferensi_waktu_kriteria_table.php create mode 100644 database/migrations/2025_05_21_150007_create_pengecualian_makanans_table.php create mode 100644 resources/views/admin/komponen/komponen.blade.php create mode 100644 resources/views/admin/pengecualian/form.blade.php create mode 100644 resources/views/admin/relasi/edit.blade.php create mode 100644 resources/views/admin/relasi/relasi.blade.php create mode 100644 resources/views/admin/waktumakan/waktumakan.blade.php diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php index ddaf43f..30eb551 100644 --- a/app/Http/Controllers/AdminController.php +++ b/app/Http/Controllers/AdminController.php @@ -43,11 +43,15 @@ public function admindash() // USER public function datauser(){ - $users = User::with('role')->get(); // Eager load the role relationship + $users = User::whereHas('role', function ($query) { + $query->where('name', 'user'); + })->with('role')->get(); + return view('admin.datauser.datauser', compact('users')); } + public function edituser(User $user){ // Ambil semua role dari tabel roles $roles = Role::pluck('name', 'id'); // Mengambil nama dan id role diff --git a/app/Http/Controllers/MakananController.php b/app/Http/Controllers/MakananController.php index 8f079c0..e24ba77 100644 --- a/app/Http/Controllers/MakananController.php +++ b/app/Http/Controllers/MakananController.php @@ -12,6 +12,15 @@ use App\Models\JenisMakanan; use App\Http\Requests\JenisMakananRequest; use App\Http\Requests\UpdateJenisMakananRequest; +use App\Models\Komponen; +// use App\Http\Requests\JenisMakananRequest; +// use App\Http\Requests\UpdateJenisMakananRequest; +use App\Models\WaktuMakan; +// use App\Http\Requests\JenisMakananRequest; +// use App\Http\Requests\UpdateJenisMakananRequest; +use App\Models\MakananKomponenWaktu; +// use App\Http\Requests\JenisMakananRequest; +// use App\Http\Requests\UpdateJenisMakananRequest; class MakananController extends Controller { @@ -96,8 +105,6 @@ public function deletemakanan(Makanan $makanan) { - - public function kategori(){ $kategoris = Kategori::all(); return view('admin.kategori.kategori', compact('kategoris')); @@ -127,11 +134,6 @@ public function deletekategori(Kategori $kategori) { - - - - - public function jenismakanan() { $jenis_makanans = JenisMakanan::all(); @@ -167,4 +169,162 @@ public function deletejenismakanan(JenisMakanan $jenis) $jenis->delete(); return redirect()->route('jenismakanan')->with('success', 'Jenis makanan berhasil dihapus'); } + + + +public function komponen(){ + $komponens = Komponen::all(); + return view('admin.komponen.komponen', compact('komponens')); + } + public function editkomponen(Komponen $komponen){ + return view('admin.komponen.editkomponen', compact('komponen')); + } + public function tambahkomponen(){ + return view('admin.komponen.tambahkomponen'); + } +// public function storekomponen(KategoriRequest $request){ +// $validatedData = $request->validated(); +// Kategori::create($validatedData); +// return redirect()->route('kategori'); +// } +// public function updatekategori(UpdateKategoriRequest $request, Kategori $kategori) +// { +// $validatedData = $request->validated(); +// $kategori->update($validatedData); +// return redirect()->route('kategori'); +// } + + public function deletekomponen(Komponen $komponen) { + $komponen->delete(); + return redirect()->route('komponen')->with('success', 'user deleted successfully'); + } + + + + + + + + + public function waktumakan(){ + $waktu_makans = WaktuMakan::all(); + return view('admin.waktumakan.waktumakan', compact('waktu_makans')); + } + public function editwaktumakan(WaktuMakan $waktumakan){ + return view('admin.waktumakan.editwaktumakan', compact('waktumakan')); + } + public function tambahwaktumakan(){ + return view('admin.waktumakan.tambahwaktumakan'); + } +// public function storekomponen(KategoriRequest $request){ +// $validatedData = $request->validated(); +// Kategori::create($validatedData); +// return redirect()->route('kategori'); +// } +// public function updatekategori(UpdateKategoriRequest $request, Kategori $kategori) +// { +// $validatedData = $request->validated(); +// $kategori->update($validatedData); +// return redirect()->route('kategori'); +// } + + public function deletewaktumakan(WaktuMakan $waktumakan) { + $waktumakan->delete(); + return redirect()->route('waktumakan')->with('success', 'user deleted successfully'); + } + + + + public function index(Request $request) +{ + $query = MakananKomponenWaktu::with(['makanan', 'komponen', 'waktuMakan']); + + if ($request->komponen_id) { + $query->where('komponen_id', $request->komponen_id); + } + + if ($request->waktu_makan_id) { + $query->where('waktu_makan_id', $request->waktu_makan_id); + } + + $relasis = $query->get(); + $makanans = Makanan::all(); + $komponens = Komponen::all(); + $waktuMakans = WaktuMakan::all(); + + return view('admin.relasi.relasi', compact('relasis', 'makanans', 'komponens', 'waktuMakans')); +} + + + public function store(Request $request) + { + $request->validate([ + 'makanan_id' => 'required|exists:makanans,id', + 'komponen_id' => 'required|exists:komponens,id', + 'waktu_makan_id' => 'required|exists:waktu_makans,id', + ]); + + // Cegah duplikasi + $exists = MakananKomponenWaktu::where([ + 'makanan_id' => $request->makanan_id, + 'komponen_id' => $request->komponen_id, + 'waktu_makan_id' => $request->waktu_makan_id + ])->exists(); + + if (!$exists) { + MakananKomponenWaktu::create($request->only(['makanan_id', 'komponen_id', 'waktu_makan_id'])); + return redirect()->back()->with('success', 'Relasi berhasil ditambahkan.'); + } else { + return redirect()->back()->with('error', 'Relasi sudah ada.'); + } + } + + public function edit($id) +{ + $relasi = MakananKomponenWaktu::findOrFail($id); + $makanans = Makanan::all(); + $komponens = Komponen::all(); + $waktuMakans = WaktuMakan::all(); + + return view('admin.relasi.edit', compact('relasi', 'makanans', 'komponens', 'waktuMakans')); +} + +public function update(Request $request, $id) +{ + $request->validate([ + 'makanan_id' => 'required|exists:makanans,id', + 'komponen_id' => 'required|exists:komponens,id', + 'waktu_makan_id' => 'required|exists:waktu_makans,id', + ]); + + $relasi = MakananKomponenWaktu::findOrFail($id); + + // Cek apakah ada duplikasi selain record yang sedang diupdate + $exists = MakananKomponenWaktu::where('id', '!=', $id) + ->where('makanan_id', $request->makanan_id) + ->where('komponen_id', $request->komponen_id) + ->where('waktu_makan_id', $request->waktu_makan_id) + ->exists(); + + if ($exists) { + return redirect()->back()->with('error', 'Relasi sudah ada.'); + } + + $relasi->update([ + 'makanan_id' => $request->makanan_id, + 'komponen_id' => $request->komponen_id, + 'waktu_makan_id' => $request->waktu_makan_id, + ]); + + return redirect()->route('relasi')->with('success', 'Relasi berhasil diperbarui.'); +} + + + public function destroy($id) + { + $relasi = MakananKomponenWaktu::findOrFail($id); + $relasi->delete(); + + return redirect()->back()->with('success', 'Relasi berhasil dihapus.'); + } } diff --git a/app/Http/Controllers/PengecualianController.php b/app/Http/Controllers/PengecualianController.php new file mode 100644 index 0000000..266bec4 --- /dev/null +++ b/app/Http/Controllers/PengecualianController.php @@ -0,0 +1,38 @@ +pengecualian as $makananId) { + PengecualianMakanan::updateOrCreate([ + 'user_id' => Auth::id(), + 'makanan_id' => $makananId, + 'waktu_makan_id' => $request->waktu_makan_id, + 'komponen_id' => $request->komponen_id, + ]); + } + + return redirect()->route('pengecualian.form')->with('success', 'Pengecualian berhasil disimpan!'); +} + +} diff --git a/app/Http/Controllers/ProsesController.php b/app/Http/Controllers/ProsesController.php index b351707..40af00f 100644 --- a/app/Http/Controllers/ProsesController.php +++ b/app/Http/Controllers/ProsesController.php @@ -27,7 +27,6 @@ public function prosesSementara(Request $request) $kriterias = Kriteria::all(); $nilai = []; - // Hapus data lama (opsional, jika ingin reset) foreach ($kriterias as $baris) { foreach ($kriterias as $kolom) { if ($baris->id != $kolom->id) { @@ -39,7 +38,6 @@ public function prosesSementara(Request $request) } } - // Membuat matriks perbandingan dan menyimpannya ke session dan DB foreach ($kriterias as $baris) { foreach ($kriterias as $kolom) { if ($baris->id == $kolom->id) { @@ -87,7 +85,6 @@ public function hasilNormalisasi() return redirect()->route('perbandingan')->with('error', 'Data perbandingan belum tersedia.'); } - // Hitung jumlah per kolom $jumlahKolom = []; foreach ($kriterias as $kriteria) { $id = $kriteria->id; @@ -97,7 +94,6 @@ public function hasilNormalisasi() } } - // Normalisasi $normalisasi = []; foreach ($kriterias as $baris) { $row = []; @@ -107,13 +103,11 @@ public function hasilNormalisasi() $normalisasi[] = $row; } - // Hitung bobot $bobot = []; foreach ($normalisasi as $baris) { $bobot[] = array_sum($baris) / count($baris); } - // Simpan bobot ke database dan session foreach ($bobot as $index => $value) { BobotKriteria::updateOrCreate( ['kriteria_id' => $kriterias[$index]->id], @@ -129,17 +123,4 @@ public function hasilNormalisasi() 'bobot' => $bobot ]); } - - public function perbandinganAlternatif() - { - $kriterias = Kriteria::all(); - $alternatifs = Makanan::all(); - $bobot = Session::get('bobot_kriteria'); - - if (!$bobot) { - return redirect()->route('hasil.normalisasi')->with('error', 'Bobot kriteria belum tersedia.'); - } - - return view('admin.alternatif.perbandingan', compact('kriterias', 'alternatifs', 'bobot')); - } } diff --git a/app/Http/Controllers/RekomendasiController.php b/app/Http/Controllers/RekomendasiController.php index 226e7a5..52b31fb 100644 --- a/app/Http/Controllers/RekomendasiController.php +++ b/app/Http/Controllers/RekomendasiController.php @@ -8,105 +8,131 @@ use App\Models\BobotKriteria; use App\Models\SkorMakanan; use App\Models\Rekomendasi; -use Illuminate\Support\Facades\Auth; // pastikan ini ada di atas +use App\Models\WaktuMakan; +use App\Models\Komponen; +use Illuminate\Support\Facades\Auth; use Carbon\Carbon; class RekomendasiController extends Controller { - // - public function hitungDanSimpan() + public function hitungDanSimpanOtomatis() { - $idAlternatif = session('alternatifs_dipilih'); - - if (!$idAlternatif || count($idAlternatif) < 2) { - return redirect()->route('alternatif.pilih')->with('error', 'Alternatif belum dipilih atau kurang dari dua.'); - } - - $alternatifs = Makanan::whereIn('id', $idAlternatif)->get(); $kriterias = Kriteria::all(); - $bobotKriterias = BobotKriteria::pluck('bobot', 'kriteria_id'); + $defaultBobots = BobotKriteria::pluck('bobot', 'kriteria_id'); + $waktuMakans = WaktuMakan::all(); + $komponens = Komponen::all(); - foreach ($alternatifs as $alternatif) { - $nilaiAkhir = 0; + SkorMakanan::truncate(); + Rekomendasi::where('user_id', Auth::id())->delete(); - foreach ($kriterias as $kriteria) { - $bobotKriteria = $bobotKriterias[$kriteria->id] ?? 0; - $bobotAlternatif = SkorMakanan::where('kriteria_id', $kriteria->id) - ->where('makanan_id', $alternatif->id) - ->value('nilai') ?? 0; + 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'); - $nilaiAkhir += $bobotKriteria * $bobotAlternatif; + 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(), + ] + ); + } } - - Rekomendasi::updateOrCreate( - ['makanan_id' => $alternatif->id, 'user_id' => Auth::id()], - [ - 'nilai_akhir' => $nilaiAkhir, - 'tanggal_rekomendasi' => now()->toDateString() - ] - ); } - return redirect()->route('rekomendasi.hasil')->with('success', 'Rekomendasi berhasil dihitung dan disimpan.'); + return redirect()->route('rekomendasi.hasil')->with('success', 'Rekomendasi berhasil dihitung dengan bobot preferensi waktu.'); } - // 2. Tampilkan hasil rekomendasi - public function tampil() - { - // 1. Ambil & kelompokkan data - $rekomendasiByDate = Rekomendasi::with('makanan') - ->where('nilai_akhir', '>', 0) - ->orderByDesc('tanggal_rekomendasi') // terbaru di depan carousel - ->orderByDesc('nilai_akhir') // ranking per tanggal - ->get() - ->groupBy('tanggal_rekomendasi'); // hasil: Collection keyed by yyyy-mm-dd + public function tampilHasil() +{ + $rekomendasi = Rekomendasi::with('makanan', 'komponen', 'waktuMakan') + ->where('user_id', Auth::id()) + // ->whereDate('tanggal_rekomendasi', now()) + ->get(); - // 2. Daftar tanggal unik untuk dropdown hapus - $tanggalList = $rekomendasiByDate->keys(); // Collection of dates + // Urutan komponen manual + $urutanKomponen = ['karbohidrat', 'protein', 'sayur', 'buah', 'susu']; - // 3. Kirim ke view - return view('admin.rekomendasi', [ - 'rekomendasiByDate' => $rekomendasiByDate, - 'tanggalList' => $tanggalList, + // 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; } - - - public function kirimKeUser($userId) -{ - $adminId = Auth::id(); - - $dataAdmin = Rekomendasi::where('user_id', $adminId)->get(); - - foreach ($dataAdmin as $item) { - Rekomendasi::updateOrCreate( - ['user_id' => $userId, 'makanan_id' => $item->makanan_id], - [ - 'nilai_akhir' => $item->nilai_akhir, - 'tanggal_rekomendasi' => now(), - ] - ); - } - - return redirect()->back()->with('success', 'Hasil rekomendasi berhasil dikirim ke user.'); + return view('admin.rekomendasi', ['rekomendasi' => $rekomendasiGrouped]); } -public function hapusSemua(Request $request) -{ - $tanggal = $request->input('tanggal_rekomendasi'); - - if (!$tanggal) { - return redirect()->back()->with('error', 'Tanggal rekomendasi harus dipilih.'); - } - - // Hapus data berdasarkan tanggal_rekomendasi - Rekomendasi::where('tanggal_rekomendasi', $tanggal)->delete(); - - return redirect()->back()->with('success', 'Data rekomendasi untuk tanggal ' . $tanggal . ' berhasil dihapus.'); -} - - - } diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index 28a5a09..99f10f9 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -8,6 +8,8 @@ use App\Models\Makanan; // pastikan model di-import use App\Models\JenisMakanan; use App\Models\Kategori; +use App\Models\RekomendasiAhli; +use App\Models\WaktuMakan; use Illuminate\Support\Facades\Auth; // pastikan ini ada di atas class UserController extends Controller @@ -86,32 +88,34 @@ public function userdata(Request $request) -public function userresult(Request $request) +public function userresult() { - $tanggal = $request->input('tanggal'); + $rekomendasi = \App\Models\RekomendasiAhli::with('komponen', 'waktuMakan') + ->get() + ->groupBy([ + fn($item) => $item->waktu_makan_id, + fn($item) => strtolower($item->komponen->nama), + ]); - $rekomendasi = Rekomendasi::with('makanan') - ->when($tanggal, function ($query) use ($tanggal) { - $query->whereDate('tanggal_rekomendasi', $tanggal); - }) + $waktuMakans = \App\Models\WaktuMakan::all()->keyBy('id'); + + // Ambil alternatif dari tabel rekomendasis + $alternatifGrouped = \App\Models\Rekomendasi::with('makanan') ->where('nilai_akhir', '>', 0) - ->orderByDesc('nilai_akhir') - ->get(); + ->get() + ->groupBy(fn($item) => $item->waktu_makan_id . '-' . $item->komponen_id); - $totalNilaiAkhir = $rekomendasi->sum('nilai_akhir'); - - // Ambil daftar tanggal unik dari database - $listTanggal = Rekomendasi::select('tanggal_rekomendasi') - ->distinct() - ->orderBy('tanggal_rekomendasi', 'desc') - ->pluck('tanggal_rekomendasi'); - - return view('user.userresult', compact('rekomendasi', 'totalNilaiAkhir', 'tanggal', 'listTanggal')); + return view('user.userresult', compact('rekomendasi', 'waktuMakans', 'alternatifGrouped')); } + + + + + public function show($id) { // ambil data berdasarkan $id atau bisa juga switch/case diff --git a/app/Models/Komponen.php b/app/Models/Komponen.php new file mode 100644 index 0000000..ea5b6b8 --- /dev/null +++ b/app/Models/Komponen.php @@ -0,0 +1,25 @@ +hasMany(MakananKomponenWaktu::class); + } + + public function makanans() + { + return $this->belongsToMany(Makanan::class, 'makanan_komponen_waktu') + ->withPivot('waktu_makan_id') + ->withTimestamps(); + } +} diff --git a/app/Models/Makanan.php b/app/Models/Makanan.php index ae25a2b..342313f 100644 --- a/app/Models/Makanan.php +++ b/app/Models/Makanan.php @@ -43,4 +43,25 @@ public function rekomendasi() { return $this->hasMany(Rekomendasi::class); } + + public function komponenWaktu() +{ + return $this->hasMany(MakananKomponenWaktu::class); +} + +public function komponens() +{ + return $this->belongsToMany(Komponen::class, 'makanan_komponen_waktu') + ->withPivot('waktu_makan_id') + ->withTimestamps(); +} + +public function waktuMakans() +{ + return $this->belongsToMany(WaktuMakan::class, 'makanan_komponen_waktu') + ->withPivot('komponen_id') + ->withTimestamps(); +} + + } diff --git a/app/Models/MakananKomponenWaktu.php b/app/Models/MakananKomponenWaktu.php new file mode 100644 index 0000000..99ad70d --- /dev/null +++ b/app/Models/MakananKomponenWaktu.php @@ -0,0 +1,30 @@ +belongsTo(Makanan::class); + } + + public function komponen() + { + return $this->belongsTo(Komponen::class); + } + + public function waktuMakan() + { + return $this->belongsTo(WaktuMakan::class); + } +} diff --git a/app/Models/PengecualianMakanan.php b/app/Models/PengecualianMakanan.php new file mode 100644 index 0000000..464e13e --- /dev/null +++ b/app/Models/PengecualianMakanan.php @@ -0,0 +1,24 @@ +belongsTo(Makanan::class); + } + + public function waktuMakan() { + return $this->belongsTo(WaktuMakan::class); + } + + public function komponen() { + return $this->belongsTo(Komponen::class); + } +} diff --git a/app/Models/PreferensiWaktuKriteria.php b/app/Models/PreferensiWaktuKriteria.php new file mode 100644 index 0000000..0c92c8b --- /dev/null +++ b/app/Models/PreferensiWaktuKriteria.php @@ -0,0 +1,35 @@ +belongsTo(WaktuMakan::class); + } + + /** + * Relasi ke model Kriteria + */ + public function kriteria() + { + return $this->belongsTo(Kriteria::class); + } +} diff --git a/app/Models/Rekomendasi.php b/app/Models/Rekomendasi.php index aa1d55b..1e1c961 100644 --- a/app/Models/Rekomendasi.php +++ b/app/Models/Rekomendasi.php @@ -9,7 +9,7 @@ class Rekomendasi extends Model { use HasFactory; public $timestamps = false; - protected $fillable = ['user_id', 'makanan_id', 'nilai_akhir', 'tanggal_rekomendasi']; + protected $fillable = ['user_id', 'makanan_id', 'komponen_id', 'waktu_makan_id', 'nilai_akhir', 'tanggal_rekomendasi']; public function user() { @@ -20,4 +20,15 @@ public function makanan() { return $this->belongsTo(Makanan::class); } + + + public function komponen() + { + return $this->belongsTo(Komponen::class); + } + + public function waktuMakan() + { + return $this->belongsTo(WaktuMakan::class); + } } diff --git a/app/Models/RekomendasiAhli.php b/app/Models/RekomendasiAhli.php new file mode 100644 index 0000000..f766324 --- /dev/null +++ b/app/Models/RekomendasiAhli.php @@ -0,0 +1,38 @@ +belongsTo(Makanan::class); + } + + // Relasi ke waktu makan + public function waktuMakan() + { + return $this->belongsTo(WaktuMakan::class); + } + + // Relasi ke komponen + public function komponen() + { + return $this->belongsTo(Komponen::class); + } +} diff --git a/app/Models/WaktuMakan.php b/app/Models/WaktuMakan.php new file mode 100644 index 0000000..e4f9a21 --- /dev/null +++ b/app/Models/WaktuMakan.php @@ -0,0 +1,27 @@ +hasMany(MakananKomponenWaktu::class); + } + + public function makanans() + { + return $this->belongsToMany(Makanan::class, 'makanan_komponen_waktu') + ->withPivot('komponen_id') + ->withTimestamps(); + } +} diff --git a/database/migrations/2025_05_19_144646_create_komponens_table.php b/database/migrations/2025_05_19_144646_create_komponens_table.php new file mode 100644 index 0000000..5bddc65 --- /dev/null +++ b/database/migrations/2025_05_19_144646_create_komponens_table.php @@ -0,0 +1,29 @@ +id(); + $table->string('nama'); + $table->timestamps(); + }); + + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('komponens'); + } +}; diff --git a/database/migrations/2025_05_19_144814_create_waktu_makans_table.php b/database/migrations/2025_05_19_144814_create_waktu_makans_table.php new file mode 100644 index 0000000..64aef80 --- /dev/null +++ b/database/migrations/2025_05_19_144814_create_waktu_makans_table.php @@ -0,0 +1,28 @@ +id(); + $table->string('nama'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('waktu_makans'); + } +}; diff --git a/database/migrations/2025_05_19_145030_create_makanan_komponen_waktu_table.php b/database/migrations/2025_05_19_145030_create_makanan_komponen_waktu_table.php new file mode 100644 index 0000000..093aa77 --- /dev/null +++ b/database/migrations/2025_05_19_145030_create_makanan_komponen_waktu_table.php @@ -0,0 +1,30 @@ +id(); + $table->foreignId('makanan_id')->constrained('makanans')->onDelete('cascade'); + $table->foreignId('komponen_id')->constrained('komponens')->onDelete('cascade'); + $table->foreignId('waktu_makan_id')->constrained('waktu_makans')->onDelete('cascade'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('makanan_komponen_waktu'); + } +}; diff --git a/database/migrations/2025_05_19_192655_add_komponen_waktu_to_rekomendasis_table.php b/database/migrations/2025_05_19_192655_add_komponen_waktu_to_rekomendasis_table.php new file mode 100644 index 0000000..59ac01a --- /dev/null +++ b/database/migrations/2025_05_19_192655_add_komponen_waktu_to_rekomendasis_table.php @@ -0,0 +1,37 @@ +foreignId('komponen_id')->after('makanan_id')->constrained('komponens')->cascadeOnDelete(); + } + + if (!Schema::hasColumn('rekomendasis', 'waktu_makan_id')) { + $table->foreignId('waktu_makan_id')->after('komponen_id')->constrained('waktu_makans')->cascadeOnDelete(); + } + }); +} + + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('rekomendasis', function (Blueprint $table) { + $table->dropForeign(['komponen_id']); + $table->dropForeign(['waktu_makan_id']); + $table->dropColumn(['komponen_id', 'waktu_makan_id']); + }); + } +}; diff --git a/database/migrations/2025_05_21_022625_create_rekomendasi_ahlis_table.php b/database/migrations/2025_05_21_022625_create_rekomendasi_ahlis_table.php new file mode 100644 index 0000000..c880f35 --- /dev/null +++ b/database/migrations/2025_05_21_022625_create_rekomendasi_ahlis_table.php @@ -0,0 +1,36 @@ +id(); + $table->unsignedBigInteger('makanan_id'); + $table->unsignedBigInteger('waktu_makan_id'); + $table->unsignedBigInteger('komponen_id'); + $table->text('catatan')->nullable(); + $table->timestamps(); + + // Foreign Keys + $table->foreign('makanan_id')->references('id')->on('makanans')->onDelete('cascade'); + $table->foreign('waktu_makan_id')->references('id')->on('waktu_makans')->onDelete('cascade'); + $table->foreign('komponen_id')->references('id')->on('komponens')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('rekomendasi_ahli'); + } +}; diff --git a/database/migrations/2025_05_21_024331_add_keterangan_to_waktu_makans_table.php b/database/migrations/2025_05_21_024331_add_keterangan_to_waktu_makans_table.php new file mode 100644 index 0000000..f0ad471 --- /dev/null +++ b/database/migrations/2025_05_21_024331_add_keterangan_to_waktu_makans_table.php @@ -0,0 +1,25 @@ +string('keterangan')->nullable()->after('nama'); + }); + } + + public function down(): void + { + Schema::table('waktu_makans', function (Blueprint $table) { + $table->dropColumn('keterangan'); + }); + } +}; diff --git a/database/migrations/2025_05_21_031438_modify_makanan_id_column_on_rekomendasi_ahli_table.php b/database/migrations/2025_05_21_031438_modify_makanan_id_column_on_rekomendasi_ahli_table.php new file mode 100644 index 0000000..c9391ef --- /dev/null +++ b/database/migrations/2025_05_21_031438_modify_makanan_id_column_on_rekomendasi_ahli_table.php @@ -0,0 +1,40 @@ +dropForeign(['makanan_id']); + }); + + // Ubah kolom menjadi text (rename lalu tambahkan kembali) + Schema::table('rekomendasi_ahli', function (Blueprint $table) { + $table->dropColumn('makanan_id'); + }); + + Schema::table('rekomendasi_ahli', function (Blueprint $table) { + $table->text('makanan_id')->after('id'); + }); + } + + public function down(): void + { + // Revert: ubah kembali ke foreign key integer + Schema::table('rekomendasi_ahli', function (Blueprint $table) { + $table->dropColumn('makanan_id'); + }); + + Schema::table('rekomendasi_ahli', function (Blueprint $table) { + $table->foreignId('makanan_id')->constrained('makanans')->onDelete('cascade'); + }); + } +}; diff --git a/database/migrations/2025_05_21_031901_change_makanan_id_to_text_on_rekomendasi_ahli_table.php b/database/migrations/2025_05_21_031901_change_makanan_id_to_text_on_rekomendasi_ahli_table.php new file mode 100644 index 0000000..ce2b3be --- /dev/null +++ b/database/migrations/2025_05_21_031901_change_makanan_id_to_text_on_rekomendasi_ahli_table.php @@ -0,0 +1,48 @@ +dropColumn('makanan_id'); + }); + } + + // 3. Tambahkan nama_makanan hanya jika belum ada + if (!Schema::hasColumn('rekomendasi_ahli', 'nama_makanan')) { + Schema::table('rekomendasi_ahli', function (Blueprint $table) { + $table->text('nama_makanan')->after('id'); + }); + } + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // Revert ke kondisi sebelumnya + Schema::table('rekomendasi_ahli', function (Blueprint $table) { + $table->dropColumn('nama_makanan'); + $table->unsignedBigInteger('makanan_id')->nullable(); + $table->foreign('makanan_id')->references('id')->on('makanans')->onDelete('cascade'); + }); + } +}; diff --git a/database/migrations/2025_05_21_063336_create_preferensi_waktu_kriteria_table.php b/database/migrations/2025_05_21_063336_create_preferensi_waktu_kriteria_table.php new file mode 100644 index 0000000..67d8b02 --- /dev/null +++ b/database/migrations/2025_05_21_063336_create_preferensi_waktu_kriteria_table.php @@ -0,0 +1,30 @@ +id(); + $table->foreignId('waktu_makan_id')->constrained()->onDelete('cascade'); + $table->foreignId('kriteria_id')->constrained()->onDelete('cascade'); + $table->float('bobot'); // nilai 0–1 + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('preferensi_waktu_kriteria'); + } +}; diff --git a/database/migrations/2025_05_21_150007_create_pengecualian_makanans_table.php b/database/migrations/2025_05_21_150007_create_pengecualian_makanans_table.php new file mode 100644 index 0000000..9a25d4e --- /dev/null +++ b/database/migrations/2025_05_21_150007_create_pengecualian_makanans_table.php @@ -0,0 +1,31 @@ +id(); + $table->foreignId('user_id')->constrained()->onDelete('cascade'); + $table->foreignId('makanan_id')->constrained('makanans')->onDelete('cascade'); + $table->foreignId('waktu_makan_id')->constrained('waktu_makans')->onDelete('cascade'); + $table->foreignId('komponen_id')->constrained('komponens')->onDelete('cascade'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('pengecualian_makanans'); + } +}; diff --git a/resources/views/admin/alternatif/pilih.blade.php b/resources/views/admin/alternatif/pilih.blade.php index 8b2d7a8..8a16357 100644 --- a/resources/views/admin/alternatif/pilih.blade.php +++ b/resources/views/admin/alternatif/pilih.blade.php @@ -66,44 +66,41 @@ {{-- Form Pemilihan Alternatif --}}
- @csrf -
- @foreach ($makanans as $makanan) -
-
-
- - - -
-
-
- @endforeach -
- -
- -
-
- - + @csrf +
+ @foreach ($makanans as $makanan) +
+
+
+ + +
+
+
+ @endforeach +
+
+ +
+ +
diff --git a/resources/views/admin/komponen/komponen.blade.php b/resources/views/admin/komponen/komponen.blade.php new file mode 100644 index 0000000..ed6b8f9 --- /dev/null +++ b/resources/views/admin/komponen/komponen.blade.php @@ -0,0 +1,57 @@ +@extends('layout.app') +@section('content') +
+

Data komponen

+ +
+ +
+
+
+
+
+
+
Data komponen
+ {{--
+ Tambah +
--}} +
+ + + + + + + + + + + + @foreach ($komponens as $kmpn) + + + + + + @endforeach + +
NoNameAction
{{ $loop->iteration }}{{ $kmpn->nama }} + {{-- Edit +
+ @csrf + @method('DELETE') + +
--}} +
+ +
+
+
+
+
+@endsection diff --git a/resources/views/admin/pengecualian/form.blade.php b/resources/views/admin/pengecualian/form.blade.php new file mode 100644 index 0000000..e69de29 diff --git a/resources/views/admin/profile.blade.php b/resources/views/admin/profile.blade.php index e6a9c41..9831667 100644 --- a/resources/views/admin/profile.blade.php +++ b/resources/views/admin/profile.blade.php @@ -14,14 +14,22 @@
-
-
-
-

{{ $user->name }}

-
{{ $user->role->name ?? '-' }}
-
-
-
+
+
+
+
+
+ +
+
+
+
{{ $user->name }}
+

{{ $user->email }}

+ + {{ ucfirst($user->role->name ?? 'user') }} + +
+
diff --git a/resources/views/admin/proses/normalisasi.blade.php b/resources/views/admin/proses/normalisasi.blade.php index b2639fc..c1da197 100644 --- a/resources/views/admin/proses/normalisasi.blade.php +++ b/resources/views/admin/proses/normalisasi.blade.php @@ -8,16 +8,16 @@ -
+
- +
Normalisasi Matriks
@@ -36,9 +36,7 @@ {{ $baris->nama }} @foreach ($kriterias as $j => $kolom) - - {{ number_format($normalisasi[$i][$j], 4) }} - + {{ number_format($normalisasi[$i][$j], 4) }} @endforeach @endforeach @@ -48,7 +46,7 @@
- +
Bobot Kriteria
@@ -73,12 +71,11 @@
- -
-
- @csrf - -
+ +
diff --git a/resources/views/admin/rekomendasi.blade.php b/resources/views/admin/rekomendasi.blade.php index 967f83f..7bbbb88 100644 --- a/resources/views/admin/rekomendasi.blade.php +++ b/resources/views/admin/rekomendasi.blade.php @@ -1,135 +1,102 @@ @extends('layout.app') @section('content') -
+
+

🏆 Ranking Rekomendasi Makanan

+ +
- {{-- Judul halaman --}} -
-

📊 Hasil Rekomendasi Makanan

-

Berikut adalah peringkat makanan berdasarkan hasil perhitungan AHP.

-
+
+
+
- {{-- Flash success --}} - @if(session('success')) - - @endif + @if(session('success')) +
+ {{ session('success') }} +
+ @endif - {{-- ===================== CAROUSEL ===================== --}} -
+@endsection - {{-- Tombol kirim hasil --}} -
-
- @csrf - -
-
- - {{-- Form hapus per tanggal --}} -
-
- @csrf - - - -
-
- - {{-- Tombol kembali --}} - -
-@endsection \ No newline at end of file +@push('scripts') + +@endpush diff --git a/resources/views/admin/relasi/edit.blade.php b/resources/views/admin/relasi/edit.blade.php new file mode 100644 index 0000000..d29eea3 --- /dev/null +++ b/resources/views/admin/relasi/edit.blade.php @@ -0,0 +1,52 @@ +@extends('layout.app') + +@section('content') +
+

Edit Relasi

+ + @if(session('error')) +
{{ session('error') }}
+ @endif + +
+ @csrf + @method('PUT') + +
+ + +
+ +
+ + +
+ +
+ + +
+ + + Batal +
+
+@endsection diff --git a/resources/views/admin/relasi/relasi.blade.php b/resources/views/admin/relasi/relasi.blade.php new file mode 100644 index 0000000..81b3497 --- /dev/null +++ b/resources/views/admin/relasi/relasi.blade.php @@ -0,0 +1,143 @@ +@extends('layout.app') + +@section('content') +
+

Tambah Relasi Makanan - Komponen - Waktu Makan

+ + @if(session('success')) +
{{ session('success') }}
+ @elseif(session('error')) +
{{ session('error') }}
+ @endif + +
+ @csrf +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+ +
+
+
+
+ +
+
Filter Relasi
+ +
+
+ + +
+ +
+ + +
+ +
+ +
+
+ +
+ +
+
Data Relasi Tersimpan
+
+ + + + + + + + + + + + + + @foreach ($relasis as $relasi) + + + + + + + + {{-- --}} + + @endforeach + +
NoMakananKomponenWaktu MakananAction
{{ $loop->iteration }}{{ $relasi->makanan->nama }}{{ $relasi->komponen->nama }}{{ $relasi->waktuMakan->nama }} + + + +
+ @csrf + @method('DELETE') + +
+
+
+ @csrf + @method('DELETE') + +
+
+ +
+ +
+
+
+
+ + +
+@endsection diff --git a/resources/views/admin/waktumakan/waktumakan.blade.php b/resources/views/admin/waktumakan/waktumakan.blade.php new file mode 100644 index 0000000..4d8aa39 --- /dev/null +++ b/resources/views/admin/waktumakan/waktumakan.blade.php @@ -0,0 +1,57 @@ +@extends('layout.app') +@section('content') +
+

Data waktu makan

+ +
+ +
+
+
+
+
+
+
Data komponen
+ {{--
+ Tambah +
--}} +
+ + + + + + + + + + + + @foreach ($waktu_makans as $wm) + + + + + + @endforeach + +
NoNameAction
{{ $loop->iteration }}{{ $wm ->nama }} + {{-- Edit +
+ @csrf + @method('DELETE') + +
--}} +
+ +
+
+
+
+
+@endsection diff --git a/resources/views/layout/app.blade.php b/resources/views/layout/app.blade.php index 1295a22..54a230b 100644 --- a/resources/views/layout/app.blade.php +++ b/resources/views/layout/app.blade.php @@ -12,6 +12,8 @@ + + @@ -28,6 +30,7 @@ + diff --git a/resources/views/layout/footer.blade.php b/resources/views/layout/footer.blade.php index c49bd65..e40b470 100644 --- a/resources/views/layout/footer.blade.php +++ b/resources/views/layout/footer.blade.php @@ -1,10 +1,10 @@
- {{-- Designed by BootstrapMade --}} + Designed by BootstrapMade
diff --git a/resources/views/layout/sidebar.blade.php b/resources/views/layout/sidebar.blade.php index 8e37470..6ceea67 100644 --- a/resources/views/layout/sidebar.blade.php +++ b/resources/views/layout/sidebar.blade.php @@ -10,6 +10,14 @@ + + + {{-- -
  • - - - User - -
  • + - + --}} +
  • + + + Data komponen + +
  • +
  • + + + waktu makan + +
  • +
  • + + + relasi + +
  • diff --git a/resources/views/user/userresult.blade.php b/resources/views/user/userresult.blade.php index aa3f97c..185c396 100644 --- a/resources/views/user/userresult.blade.php +++ b/resources/views/user/userresult.blade.php @@ -3,99 +3,115 @@ @section('content')
    -
    -

    Hasil Rekomendasi AHP

    -

    Rekomendasi Menu Makanan Terbaik untuk Anda

    -

    Berikut adalah hasil akhir dari perhitungan berdasarkan metode AHP. Nilai akhir menunjukkan tingkat kesesuaian berdasarkan kriteria yang telah di pilih.

    - -
    -
    - -
    -
    - Reset -
    -
    - +
    +

    Hasil Rekomendasi Ahli

    +

    Menu Makanan Terbaik dari Ahli Gizi

    +

    Ditampilkan berdasarkan panduan ahli gizi untuk penderita penyakit jantung.

    -
    - - - - - - - - - - - - @foreach ($rekomendasi->sortByDesc('nilai_akhir')->values() as $index => $rekom) - - - - - - - - @endforeach - -
    PeringkatNama MakananNilai AkhirPersentaseAksi
    - {{ $index + 1 }} - {{ $rekom->makanan->nama }}{{ number_format($rekom->nilai_akhir, 4) }} + @forelse ($rekomendasi as $waktu => $komponens) +
    +
    +

    + 🍽️ Menu {{ $waktuMakans[$waktu]->nama ?? ucfirst($waktu) }} +

    + @if($waktuMakans[$waktu]?->keterangan) +

    + 🕒 {{ $waktuMakans[$waktu]->keterangan }} +

    + @endif + +
    + @foreach ($komponens as $komponen => $items) @php - $persentase = ($totalNilaiAkhir > 0) ? ($rekom->nilai_akhir / $totalNilaiAkhir) * 100 : 0; + $utama = $items->first(); + $utamaNama = $utama->nama_makanan ?? '-'; + $utamaPersen = 100; + $modalId = 'modal-' . Str::slug($waktu . '-' . $komponen); + + // Ambil alternatif dari tabel rekomendasis + $alternatifKey = $waktu . '-' . $utama->komponen_id; + $alternatifList = $alternatifGrouped[$alternatifKey] ?? collect(); @endphp -
    -
    + +
    +
    {{ ucfirst($komponen) }}
    + +
    + 🌟 {{ $utamaNama }} + {{ number_format($utamaPersen, 2) }}% +
    + +
    + style="width: {{ $utamaPersen }}%;" + aria-valuenow="{{ $utamaPersen }}" aria-valuemin="0" aria-valuemax="100">
    - {{ number_format($persentase, 2) }}% + + @if ($alternatifList->count() > 0) + + @endif
    -
    - - Detail - -
    -
    + + + + + @endforeach +
    +
    +
    + @empty +
    + Tidak ada hasil rekomendasi ahli tersedia saat ini. +
    + @endforelse
    - -@foreach ($rekomendasi as $index => $rekom) - - -@endforeach - @endsection + +@push('styles') + +@endpush diff --git a/routes/web.php b/routes/web.php index 1294a9a..5e6f2d9 100644 --- a/routes/web.php +++ b/routes/web.php @@ -12,6 +12,7 @@ use App\Http\Controllers\RegisterController; use App\Http\Controllers\RekomendasiController; use App\Http\Controllers\ProfileController; +use App\Http\Controllers\MenuAHPController; /* |-------------------------------------------------------------------------- @@ -85,6 +86,32 @@ Route::delete('/makanan/{makanan}', [MakananController::class, 'deletemakanan'])->name('deletemakanan'); Route::get('/tambahmakanan', [MakananController::class, 'tambahmakanan'])->name('tambahmakanan'); Route::post('/makanan/storemakanan', [MakananController::class, 'storemakanan'])->name('makanan.storemakanan'); + + + + // Routes untuk komponen + Route::get('/komponen', [MakananController::class, 'komponen'])->name('komponen'); + Route::get('/editkomponen/{komponen}/editkomponen', [MakananController::class, 'editkomponen'])->name('editkomponen'); + Route::put('/komponen/{komponen}', [MakananController::class, 'updatekomponen'])->name('updatekomponen'); + Route::delete('/komponen/{komponen}', [MakananController::class, 'deletekomponen'])->name('deletekomponen'); + Route::get('/tambahkomponen', [MakananController::class, 'tambahkomponen'])->name('tambahkomponen'); + Route::post('/komponen/storekomponen', [MakananController::class, 'storekomponen'])->name('makanan.storekomponen'); + + + // Routes untuk waktu makan + Route::get('/waktumakan', [MakananController::class, 'waktumakan'])->name('waktumakan'); + Route::get('/editwaktumakan/{waktumakan}/editwaktumakan', [MakananController::class, 'editwaktumakan'])->name('editwaktumakan'); + Route::put('/waktumakan/{waktumakan}', [MakananController::class, 'updatewaktumakan'])->name('updatewaktumakan'); + Route::delete('/waktumakan/{waktumakan}', [MakananController::class, 'deletewaktumakan'])->name('deletewaktumakan'); + Route::get('/tambahwaktumakan', [MakananController::class, 'tambahwaktumakan'])->name('tambahwaktumakan'); + Route::post('/waktumakan/storewaktumakan', [MakananController::class, 'storewaktumakan'])->name('makanan.storewaktumakan'); + + Route::get('/relasi', [MakananController::class, 'index'])->name('relasi'); + Route::post('/relasi/storerelasi', [MakananController::class, 'store'])->name('relasi.store'); + Route::delete('/relasi/{relasi}', [MakananController::class, 'destroy'])->name('relasi.destroy'); + Route::get('/relasi/{id}/edit', [MakananController::class, 'edit'])->name('relasi.edit'); +Route::put('/relasi/{id}', [MakananController::class, 'update'])->name('relasi.update'); + }); // Routes untuk kriteria @@ -117,10 +144,8 @@ Route::post('/alternatif/simpan-normalisasi', [AlternatifController::class, 'simpanNormalisasi'])->name('alternatif.simpanNormalisasi'); // Routes untuk rekomendasi - Route::get('/rekomendasi/proses', [RekomendasiController::class, 'hitungDanSimpan'])->name('rekomendasi.proses'); - Route::get('/rekomendasi/hasil', [RekomendasiController::class, 'tampil'])->name('rekomendasi.hasil'); - Route::post('/rekomendasi/kirim/{user}', [RekomendasiController::class, 'kirimKeUser'])->name('rekomendasi.kirim'); - Route::delete('/rekomendasi/hapus', [RekomendasiController::class, 'hapusSemua'])->name('rekomendasi.hapusSemua'); + Route::get('/rekomendasi/hitung-otomatis', [RekomendasiController::class, 'hitungDanSimpanOtomatis'])->name('rekomendasi.hitung.otomatis'); + Route::get('/rekomendasi/hasil', [RekomendasiController::class, 'tampilHasil'])->name('rekomendasi.hasil'); }); @@ -129,6 +154,7 @@ + // User Routes (Hanya bisa diakses oleh User) Route::middleware(['cekrole:user'])->group(function () { Route::get('/userdash', [UserController::class, 'userdash'])->name('userdash');