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 +{{ $user->email }}
+ + {{ ucfirst($user->role->name ?? 'user') }} + +Berikut adalah peringkat makanan berdasarkan hasil perhitungan AHP.
-