diff --git a/app/Http/Controllers/Admin/AlternatifController.php b/app/Http/Controllers/Admin/AlternatifController.php deleted file mode 100644 index be0432f..0000000 --- a/app/Http/Controllers/Admin/AlternatifController.php +++ /dev/null @@ -1,154 +0,0 @@ -get(); - - // Ambil semua kriteria - $kriteria = Kriteria::all(); - - // Ambil semua alternatif dengan relasi ke subkriteria - $query = DataAlternatif::with('subkriteria', 'penilaian'); - - // Jika ada filter jenis pakaian, gunakan filter berdasarkan subkriteria_id - if ($request->filled('jenis_pakaian')) { - $query->where('subkriteria_id', $request->jenis_pakaian); - } - - // Search - if ($request->filled('search')) { - $query->where('nama_alternatif', 'like', '%' . $request->search . '%'); - } - - // Ambil data alternatif dengan pagination (10 per halaman) - $perPage = $request->input('entries', 10); // Ambil dari URL ?entries=xx, default 10 - $alternatif = $query->paginate($perPage)->appends($request->query()); - - // Kirim data ke view - return view('admin.pages.alternatif.index', compact('subkriteria', 'alternatif', 'kriteria')); - } - - - public function store(Request $request) - { - // Validasi input - $request->validate([ - 'nama_alternatif' => 'required|string|max:255|unique:dataalternatif,nama_alternatif', - 'subkriteria_id' => 'required|exists:subkriteria,id', - 'gambar' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2048', - ]); - - $gambarPath = null; - - // Jika ada gambar yang diunggah, simpan ke folder public/assets/img - if ($request->hasFile('gambar')) { - $gambar = $request->file('gambar'); - $namaFile = time() . '_' . $gambar->getClientOriginalName(); - // simpan ke public/assets/img - $gambar->move(public_path('assets/img'), $namaFile); - $gambarPath = 'assets/img/' . $namaFile; - } - - // Simpan data alternatif ke database - $alternatif = DataAlternatif::create([ - 'nama_alternatif' => $request->nama_alternatif, - 'subkriteria_id' => $request->subkriteria_id, - 'gambar' => $gambarPath, - ]); - - // Ambil semua kriteria yang ada - $kriteria = Kriteria::all(); - - // Simpan nilai awal 0 untuk semua kriteria pada alternatif baru - foreach ($kriteria as $k) { - \App\Models\Penilaian::create([ - 'alternatif_id' => $alternatif->id, - 'kriteria_id' => $k->id, - 'nilai' => 0, // Atur nilai default - ]); - } - - // Redirect kembali ke halaman index dengan pesan sukses - return redirect()->route('admin.alternatif.index')->with('success', 'Data Alternatif berhasil ditambahkan.'); - } - - // Menampilkan form edit untuk alternatif - public function edit($id) - { - // Ambil data alternatif berdasarkan ID - $alternatif = DataAlternatif::findOrFail($id); - - // Ambil semua subkriteria (untuk pilihan dropdown misalnya) - $subkriteria = \App\Models\Subkriteria::all(); - - // Tampilkan view edit - return view('admin.pages.alternatif.edit', compact('alternatif', 'subkriteria')); - } - - public function update(Request $request, $id) - { - // Tampilkan view edit - $request->validate([ - 'nama_alternatif' => 'required|string|max:255|unique:dataalternatif,nama_alternatif,' . $id, - 'subkriteria_id' => 'required|exists:subkriteria,id', - 'gambar' => 'nullable|image|mimes:jpg,jpeg,png|max:2048', - ]); - - // Ambil data alternatif berdasarkan ID - $alternatif = DataAlternatif::findOrFail($id); - - // Update data dari input - $alternatif->nama_alternatif = $request->nama_alternatif; - $alternatif->subkriteria_id = $request->subkriteria_id; - - // Jika user mengunggah gambar baru, simpan dan update path-nya - if ($request->hasFile('gambar')) { - $file = $request->file('gambar'); - $namaFile = time() . '_' . $file->getClientOriginalName(); - - // Simpan di public/assets/img - $file->move(public_path('assets/img'), $namaFile); - - // Update path di DB - $alternatif->gambar = 'assets/img/' . $namaFile; - } - - // Simpan perubahan ke database - $alternatif->save(); - - // Jika permintaan AJAX, kirim response JSON - if ($request->ajax()) { - return response()->json(['success' => true, 'message' => 'Data Alternatif berhasil diperbarui!']); - } - - // Redirect ke halaman index dengan pesan sukses - return redirect()->route('admin.alternatif.index')->with('success', 'Data Alternatif berhasil diperbarui.'); - } - - public function destroy(Request $request, $id) - { - // Cari data berdasarkan ID dan hapus - $alternatif = DataAlternatif::findOrFail($id); - $alternatif->delete(); - - // Jika permintaan AJAX, kirim response JSON - if ($request->ajax()) { - return response()->json(['success' => true, 'message' => 'Data berhasil dihapus.']); - } - - // Redirect ke halaman index dengan pesan sukses - return redirect()->route('admin.alternatif.index')->with('success', 'Data Alternatif berhasil dihapus.'); - } -} diff --git a/app/Http/Controllers/Admin/DashboardController.php b/app/Http/Controllers/Admin/DashboardController.php index 60db684..2188941 100644 --- a/app/Http/Controllers/Admin/DashboardController.php +++ b/app/Http/Controllers/Admin/DashboardController.php @@ -5,32 +5,21 @@ namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Models\DataAlternatif; use App\Models\Kriteria; +use App\Models\Pakaian; use App\Models\Penilaian; use App\Models\Subkriteria; +use App\Models\SubKriteria as ModelsSubKriteria; use Illuminate\Http\Request; class DashboardController extends Controller { - public function indexPage() + + public function index() { - // Ambil jumlah data dari masing-masing model + $totalPakaian = Pakaian::count(); $totalKriteria = Kriteria::count(); $totalSubKriteria = Subkriteria::count(); - $totalAlternatif = DataAlternatif::count(); - $totalPenilaian = Penilaian::count(); - // Ambil salah satu kriteria, misal yang pertama - $kriteriaPertama = Kriteria::first(); - - // Kirim data ke view - return view('admin.pages.dashboard.index', [ - 'totalKriteria' => $totalKriteria, - 'totalSubKriteria' => $totalSubKriteria, - 'totalAlternatif' => $totalAlternatif, - 'totalPenilaian' => $totalPenilaian, - 'totalPerhitungan' => $totalPenilaian, - 'totalHasilAkhir' => $totalPenilaian, - 'kriteriaId' => $kriteriaPertama ? $kriteriaPertama->id : null, - ]); + return view("admin.pages.dashboard.index", compact("totalPakaian", "totalKriteria", "totalSubKriteria")); } } diff --git a/app/Http/Controllers/Admin/DataKriteriaController.php b/app/Http/Controllers/Admin/DataKriteriaController.php deleted file mode 100644 index 23c689f..0000000 --- a/app/Http/Controllers/Admin/DataKriteriaController.php +++ /dev/null @@ -1,84 +0,0 @@ -get(); - return view('admin.pages.kriteria.index', compact('kriteria')); - } - - // Menampilkan form tambah data - public function create() - { - return view('admin.pages.kriteria.create'); - } - - // Menyimpan data baru - public function store(Request $request) - { - // Validasi inputan dari form - $request->validate([ - 'kode_kriteria' => 'required|unique:datakriteria,kode_kriteria|max:10', - 'nama_kriteria' => 'required|max:255', - 'bobot' => 'required|numeric|min:0.01|max:1', // nilai > 0 - 'jenis' => 'required|in:Benefit,Cost', - ], [ - 'bobot.min' => 'Bobot tidak boleh 0.', - ]); - - // Simpan data kriteria baru ke database - Kriteria::create($request->only(['kode_kriteria', 'nama_kriteria', 'bobot', 'jenis'])); - - return redirect()->route('admin.kriteria.index')->with('success', 'Data Kriteria berhasil ditambahkan!'); - } - - // Menampilkan form edit data - public function edit($id) - { - // Cari data kriteria berdasarkan ID - $kriteria = Kriteria::findOrFail($id); - return view('admin.pages.kriteria.edit', compact('kriteria')); - } - - // Menyimpan perubahan data - public function update(Request $request, $id) - { - // Validasi inputan dari form edit - $request->validate([ - 'kode_kriteria' => "required|max:10|unique:datakriteria,kode_kriteria,$id,id", - 'nama_kriteria' => 'required|max:255', - 'bobot' => 'required|numeric|min:0.01|max:1', // nilai > 0 - 'jenis' => 'required|in:Benefit,Cost', - ], [ - 'bobot.min' => 'Bobot tidak boleh 0.', - ]); - - // Cari data kriteria yang akan diupdate - $kriteria = Kriteria::findOrFail($id); - // Update data dengan input yang diberikan - $kriteria->update($request->only(['kode_kriteria', 'nama_kriteria', 'bobot', 'jenis'])); - - return redirect()->route('admin.kriteria.index')->with('success', 'Data Kriteria berhasil diperbarui!'); - } - - // Menghapus data kriteria - public function destroy($id) - { - // Cari data kriteria berdasarkan ID - $kriteria = Kriteria::findOrFail($id); - // Hapus data dari database - $kriteria->delete(); - - return redirect()->route('admin.kriteria.index')->with('success', 'Data Kriteria berhasil dihapus!'); - } -} diff --git a/app/Http/Controllers/Admin/PenilaianController.php b/app/Http/Controllers/Admin/PenilaianController.php deleted file mode 100644 index 503df8b..0000000 --- a/app/Http/Controllers/Admin/PenilaianController.php +++ /dev/null @@ -1,93 +0,0 @@ -input('perPage', 10); // Jumlah data per halaman - $search = $request->input('search'); // Keyword pencaria - - $query = DataAlternatif::with(['penilaian.subkriteria']); // Relasi eager loading - - if ($search) { - // Jika terdapat pencarian, filter berdasarkan nama alternatif atau nama subkriteria - $query->where(function ($q) use ($search) { - $q->where('nama_alternatif', 'like', "%{$search}%") - ->orWhereHas('penilaian.subkriteria', function ($sub) use ($search) { - $sub->where('nama_subkriteria', 'like', "%{$search}%"); - }); - }); - } - - // Ambil data dengan pagination dan simpan parameter query kecuali halaman - $data = $query->paginate($perPage)->appends($request->except('page')); - - // Ambil semua data kriteria untuk ditampilkan - $kriteria = Kriteria::all(); - - return view('admin.pages.penilaian.index', compact('data', 'perPage', 'kriteria', 'search')); - } - - // Menampilkan form edit penilaian - public function edit($id) - { - $alternatif = DataAlternatif::findOrFail($id); // Ambil data alternatif berdasarkan ID - $penilaians = Penilaian::where('alternatif_id', $id)->get(); // Ambil data penilaian yang terkait - $kriteria = Kriteria::all(); // Ambil seluruh kriteria - - $nilai = []; // Menyimpan ID subkriteria per kriteria untuk ditampilkan di form - foreach ($penilaians as $penilaian) { - $nilai[$penilaian->kriteria_id] = $penilaian->subkriteria_id; - } - - return view('admin.pages.penilaian.edit', compact('alternatif', 'kriteria', 'nilai')); - } - - // Memperbarui data penilaian - public function update(Request $request, $id) - { - $alternatif = DataAlternatif::findOrFail($id); // Pastikan data alternatif ada - - // Validasi input - $request->validate([ - 'subkriteria_1' => 'required|numeric', - 'subkriteria_2' => 'required|numeric', - 'subkriteria_3' => 'required|numeric', - 'subkriteria_4' => 'required|numeric', - 'subkriteria_5' => 'required|numeric', - 'subkriteria_6' => 'required|numeric', - ]); - - // Lakukan update atau insert data penilaian untuk masing-masing kriteria - foreach (range(1, 6) as $i) { - $subkriteriaId = $request->input("subkriteria_$i"); // Ambil input subkriteria - $subkriteria = Subkriteria::find($subkriteriaId); // Cari data subkriteria - - if ($subkriteria) { - Penilaian::updateOrCreate( - [ - 'alternatif_id' => $alternatif->id, // Berdasarkan alternatif dan kriteria - 'kriteria_id' => $i, - ], - [ - 'subkriteria_id' => $subkriteria->id, // Simpan subkriteria yang dipilih - 'nilai' => $subkriteria->nilai, // Ambil nilai dari subkriteria - ] - ); - } - } - - return redirect()->route('admin.penilaian.index')->with('success', 'Penilaian berhasil diperbarui!'); - } -} diff --git a/app/Http/Controllers/Admin/PerhitunganController.php b/app/Http/Controllers/Admin/PerhitunganController.php deleted file mode 100644 index d077fda..0000000 --- a/app/Http/Controllers/Admin/PerhitunganController.php +++ /dev/null @@ -1,103 +0,0 @@ -showJenisPakaian('Dress'); } - public function blouse() { return $this->showJenisPakaian('Blouse'); } - public function cardigan() { return $this->showJenisPakaian('Cardigan'); } - public function rok() { return $this->showJenisPakaian('Rok'); } - public function celana() { return $this->showJenisPakaian('Celana'); } - - // Method umum untuk menampilkan data berdasarkan jenis pakaian - public function showJenisPakaian($jenis) - { - // Ambil data alternatif yang memiliki penilaian pada kriteria ke-3 (jenis pakaian), - // dan nilai subkriteria-nya sesuai dengan jenis yang dipilih (misalnya 'Dress') - $alternatif = DataAlternatif::with(['penilaian.subkriteria']) - ->whereHas('penilaian', function($query) use ($jenis) { - $query->where('kriteria_id', 3) - ->whereHas('subkriteria', function($subquery) use ($jenis) { - $subquery->where('nama_subkriteria', $jenis); - }); - }) - ->get(); - - // Ambil semua data kriteria - $kriteria = Kriteria::all(); - - // Hitung nilai maksimum dan minimum untuk tiap kriteria - $maxNilai = []; - $minNilai = []; - - foreach ($kriteria as $index => $k) { - $nilaiKriteria = []; - - foreach ($alternatif as $alt) { - $penilaian = $alt->penilaian->firstWhere('kriteria_id', $k->id); - if ($penilaian && $penilaian->subkriteria) { - $nilaiKriteria[] = $penilaian->subkriteria->nilai; - } - } - - $kode = 'C' . ($index + 1); - $maxNilai[$kode] = count($nilaiKriteria) > 0 ? max($nilaiKriteria) : 1; - $minNilai[$kode] = count($nilaiKriteria) > 0 ? min($nilaiKriteria) : 1; - } - - $normalisasi = []; - $pembobotan = []; - - foreach ($alternatif as $alt) { - $barisNormal = []; - $barisBobot = []; - - foreach ($kriteria as $index => $k) { - $penilaian = $alt->penilaian->firstWhere('kriteria_id', $k->id); - $nilai = $penilaian && $penilaian->subkriteria ? $penilaian->subkriteria->nilai : 0; - - $kode = 'C' . ($index + 1); - - if ($k->jenis == 'Cost') { - $normal = $nilai > 0 ? $minNilai[$kode] / $nilai : 0; - } else { - $normal = $maxNilai[$kode] > 0 ? $nilai / $maxNilai[$kode] : 0; - } - - $normalRounded = round($normal, 3); - $bobot = round($normalRounded * $k->bobot, 3); - - $barisNormal[$kode] = $normalRounded; - $barisBobot[$kode] = $bobot; - } - - $normalisasi[] = [ - 'nama' => $alt->nama_alternatif, - 'nilai' => $barisNormal - ]; - - $pembobotan[] = [ - 'nama' => $alt->nama_alternatif, - 'nilai' => $barisBobot - ]; - } - - $viewName = strtolower($jenis); - return view("admin.pages.perhitungan.$viewName", compact( - 'alternatif', - 'kriteria', - 'jenis', - 'normalisasi', - 'pembobotan' - )); - } -} diff --git a/app/Http/Controllers/Admin/SubKriteriaController.php b/app/Http/Controllers/Admin/SubKriteriaController.php deleted file mode 100644 index abc323d..0000000 --- a/app/Http/Controllers/Admin/SubKriteriaController.php +++ /dev/null @@ -1,118 +0,0 @@ -get(); // Periksa kolom yang digunakan - - // Kirim data ke view - return view('admin.pages.subkriteria.dynamic', compact('kriteria', 'subkriterias')); - } - - // Menampilkan form untuk membuat subkriteria - public function create($id) - { - // Ambil data kriteria berdasarkan ID - $kriteria = Kriteria::findOrFail($id); - - // Kirim data ke view - return view('admin.pages.subkriteria.create', compact('kriteria')); - } - - // Menyimpan data subkriteria baru - public function store(Request $request) - { - // Validasi input - $validated = $request->validate([ - 'kriteria_id' => 'required|exists:datakriteria,id', - 'name' => 'required|string|max:255', - 'nilai' => 'required|numeric|min:0.01', - ], [ - 'nilai.min' => 'Nilai tidak boleh 0.', - ]); - - // Simpan data subkriteria - SubKriteria::create([ - 'kriteria_id' => $validated['kriteria_id'], - 'nama_subkriteria' => $validated['name'], - 'nilai' => $validated['nilai'], - ]); - - // Redirect kembali ke halaman subkriteria berdasarkan kriteria_id - return redirect()->route('admin.pages.subkriteria.kriteria', ['id' => $validated['kriteria_id']]) - ->with('success', 'Subkriteria berhasil ditambahkan.'); - } - - public function edit($id) - { - // Ambil data subkriteria berdasarkan subkriteria_id - $subkriteria = SubKriteria::find($id); - - if (!$subkriteria) { - return redirect()->back()->with('error', 'Subkriteria tidak ditemukan.'); - } - - // Ambil data kriteria terkait - $kriteria = Kriteria::findOrFail($subkriteria->kriteria_id); - - // Kirim data ke view - return view('admin.pages.subkriteria.edit', compact('subkriteria', 'kriteria')); - } - - public function update(Request $request, $id) - { - // Validasi input - $validated = $request->validate([ - 'kriteria_id' => 'required|exists:datakriteria,id', - 'name' => 'required|string|max:255', - 'nilai' => 'required|numeric|min:0.01', - ], [ - 'nilai.min' => 'Nilai tidak boleh 0.', - ]); - - // Ambil data subkriteria berdasarkan ID - $subkriteria = SubKriteria::findOrFail($id); // Pastikan menggunakan subkriteria_id jika diperlukan - - // Update data subkriteria - $subkriteria->update([ - 'kriteria_id' => $validated['kriteria_id'], - 'nama_subkriteria' => $validated['name'], - 'nilai' => $validated['nilai'], - ]); - - // Redirect kembali ke halaman subkriteria berdasarkan kriteria_id - return redirect()->route('admin.pages.subkriteria.kriteria', ['id' => $validated['kriteria_id']]) - ->with('success', 'Subkriteria berhasil diperbarui.'); - } - - public function destroy($id) - { - // Cari subkriteria berdasarkan ID - $subkriteria = SubKriteria::find($id); - - // Jika tidak ditemukan, redirect balik dengan pesan error - if (!$subkriteria) { - return redirect()->back()->with('error', 'Subkriteria tidak ditemukan.'); - } - - // Hapus subkriteria - $subkriteria->delete(); - - // Redirect kembali dengan pesan sukses - return redirect()->back()->with('success', 'Subkriteria berhasil dihapus.'); - } - -} diff --git a/app/Http/Controllers/KriteriaController.php b/app/Http/Controllers/KriteriaController.php new file mode 100644 index 0000000..a272228 --- /dev/null +++ b/app/Http/Controllers/KriteriaController.php @@ -0,0 +1,117 @@ +all()); // 👈 akan menampilkan semua input form dan menghentikan proses + + $request->validate([ + 'kode_kriteria' => 'required', + 'nama_kriteria' => 'required', + 'bobot' => 'required', + 'jenis' => 'required', + ]); + + try { + Kriteria::create([ + 'kode_kriteria' => $request->kode_kriteria, + 'nama_kriteria' => $request->nama_kriteria, + 'bobot' => $request->bobot, + 'jenis' => $request->jenis, + ]); + return redirect()->route('admin.kriteria.index')->with('success', 'Data berhasil ditambahkan!'); + } catch (\Exception $e) { + return redirect()->back()->with('error', 'Gagal menyimpan data: ' . $e->getMessage()); + } + } + + + /** + * Display the specified resource. + */ + public function show(string $id) + { + // $kriteria = Kriteria::findOrFail($id); + // return view('admin.kriteria.show', compact('kriteria')); + } + + + /** + * Show the form for editing the specified resource. + */ + public function edit(string $id) + { + $kriteria = Kriteria::findOrFail($id); + return view('admin.pages.kriteria.edit', compact('kriteria')); + } + + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, string $id) + { + $request->validate([ + 'kode_kriteria' => 'required', + 'nama_kriteria' => 'required', + 'bobot' => 'required', + 'jenis' => 'required', + ]); + + try { + $kriteria = Kriteria::findOrFail($id); + $kriteria->update([ + 'kode_kriteria' => $request->kode_kriteria, + 'nama_kriteria' => $request->nama_kriteria, + 'bobot' => $request->bobot, + 'jenis' => $request->jenis, + ]); + return redirect()->route('admin.kriteria.index')->with('success', 'Data berhasil diperbarui!'); + } catch (\Exception $e) { + return redirect()->back()->with('error', 'Gagal memperbarui data: ' . $e->getMessage()); + } + } + + + /** + * Remove the specified resource from storage. + */ + public function destroy(string $id) + { + try { + $kriteria = Kriteria::findOrFail($id); + $kriteria->delete(); + return redirect()->route('admin.kriteria.index')->with('success', 'Data berhasil dihapus!'); + } catch (\Exception $e) { + return redirect()->back()->with('error', 'Gagal menghapus data: ' . $e->getMessage()); + } + } +} diff --git a/app/Http/Controllers/PakaianController.php b/app/Http/Controllers/PakaianController.php new file mode 100644 index 0000000..bec4035 --- /dev/null +++ b/app/Http/Controllers/PakaianController.php @@ -0,0 +1,129 @@ +filled('search')) { + $query->where('nama_pakaian', 'like', '%' . $request->search . '%'); + } + + $perPage = $request->input('entries', 10); + $alternatif = $query->paginate($perPage)->appends($request->query()); + + return view('admin.pages.pakaian.index', compact('kriteria', 'alternatif')); + } + + + + + /** + * Show the form for creating a new resource. + */ + public function create() + { + // + } + + /** + * Store a newly created resource in storage. + */ + public function store(Request $request) + { + $request->validate([ + 'nama_pakaian' => 'required|string|max:255', + 'harga' => 'required|numeric', + 'img' => 'nullable|image|max:2048', + ]); + + $imgPath = null; + if ($request->hasFile('img')) { + $imgPath = $request->file('img')->store('uploads/pakaian', 'public'); + } + + $pakaian = Pakaian::create([ + 'nama_pakaian' => $request->nama_pakaian, + 'harga' => $request->harga, + 'img' => $imgPath ? 'storage/' . $imgPath : null, + ]); + + // Simpan relasi subkriteria (many-to-many) + $pakaian->subKriterias()->sync($request->subkriterias); + + return redirect()->route('admin.pakaian.index')->with('success', 'Data pakaian berhasil ditambahkan.'); + } + + + /** + * Display the specified resource. + */ + public function show(string $id) + { + // + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(string $id) + { + // + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, $id) + { + $request->validate([ + 'nama_pakaian' => 'required|string|max:255', + 'harga' => 'required|numeric|min:0', + 'gambar' => 'nullable|image|mimes:jpeg,png,jpg|max:2048', + ]); + + $pakaian = Pakaian::findOrFail($id); + $pakaian->nama_pakaian = $request->nama_pakaian; + $pakaian->harga = $request->harga; + + // Jika upload gambar baru + if ($request->hasFile('gambar')) { + if ($pakaian->img && file_exists(public_path($pakaian->img))) { + unlink(public_path($pakaian->img)); + } + + $file = $request->file('gambar'); + $path = 'uploads/pakaian/'; + $filename = time() . '_' . $file->getClientOriginalName(); + $file->move(public_path($path), $filename); + $pakaian->img = $path . $filename; + } + + $pakaian->save(); + + return redirect()->back()->with('success', 'Data pakaian berhasil diperbarui!'); + } + + + /** + * Remove the specified resource from storage. + */ + public function destroy(string $id) + { + // + } +} diff --git a/app/Http/Controllers/SubKriteriaController.php b/app/Http/Controllers/SubKriteriaController.php new file mode 100644 index 0000000..6eb758f --- /dev/null +++ b/app/Http/Controllers/SubKriteriaController.php @@ -0,0 +1,114 @@ +query('kriteria_id'); + + if (!$kriteria_id) { + return redirect()->back()->with('error', 'ID Kriteria tidak ditemukan.'); + } + + $kriteria = Kriteria::findOrFail($kriteria_id); + $subkriterias = SubKriteria::where('kriteria_id', $kriteria_id)->get(); + + return view('admin.subkriteria.index', compact('kriteria', 'subkriterias')); + } + + + /** + * Show the form for creating a new resource. + */ + public function create() + { + // + } + + /** + * Store a newly created resource in storage. + */ + public function store(Request $request) + { + // Validasi input + $validated = $request->validate([ + 'kriteria_id' => 'required', + 'nama_sub' => 'required|string|max:255', + 'nilai' => 'required|numeric', + 'min_harga' => 'nullable|numeric|min:0', + 'max_harga' => 'nullable|numeric|min:0|gte:min_harga', + ]); + + // Simpan data + SubKriteria::create([ + 'kriteria_id' => $validated['kriteria_id'], + 'nama_sub' => $validated['nama_sub'], + 'nilai' => $validated['nilai'], + 'min_harga' => $validated['min_harga'] ?? null, + 'max_harga' => $validated['max_harga'] ?? null, + ]); + + return redirect()->back()->with('success', 'Subkriteria berhasil ditambahkan.'); + } + + + /** + * Display the specified resource. + */ + public function show(string $id) + { + // + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(string $id) + { + // + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, string $id) + { + $request->validate([ + 'kriteria_id' => 'required', + 'nama_sub' => 'required|string|max:255', + 'nilai' => 'required|numeric', + 'min_harga' => 'nullable|numeric', + 'max_harga' => 'nullable|numeric', + ]); + + $subkriteria = SubKriteria::findOrFail($id); + $subkriteria->update([ + 'kriteria_id' => $request->kriteria_id, + 'nama_sub' => $request->nama_sub, + 'nilai' => $request->nilai, + 'min_harga' => $request->min_harga, + 'max_harga' => $request->max_harga, + ]); + + return redirect()->back()->with('success', 'Subkriteria berhasil diperbarui.'); + } + + + public function destroy(string $id) + { + $subkriteria = SubKriteria::findOrFail($id); + $subkriteria->delete(); + + return redirect()->back()->with('success', 'Subkriteria berhasil dihapus.'); + } +} diff --git a/app/Http/Controllers/SubKriteriaShowController.php b/app/Http/Controllers/SubKriteriaShowController.php new file mode 100644 index 0000000..f4b508c --- /dev/null +++ b/app/Http/Controllers/SubKriteriaShowController.php @@ -0,0 +1,18 @@ +firstOrFail(); + $subkriterias = SubKriteria::where('kriteria_id', $kriteria->id)->get(); + $kriterias = Kriteria::all(); + return view('admin.pages.subkriteria.index', compact('kriteria', 'subkriterias', 'kriterias')); + } +} diff --git a/app/Models/DataAlternatif.php b/app/Models/DataAlternatif.php deleted file mode 100644 index 2c6908c..0000000 --- a/app/Models/DataAlternatif.php +++ /dev/null @@ -1,29 +0,0 @@ -hasMany(Penilaian::class, 'alternatif_id'); - } - - public function subkriteria() - { - return $this->belongsTo(Subkriteria::class, 'subkriteria_id'); - } - - public function nilai() - { - return $this->hasMany(Penilaian::class, 'alternatif_id', 'id'); - } - -} diff --git a/app/Models/Kriteria.php b/app/Models/Kriteria.php index b561caf..97f2773 100644 --- a/app/Models/Kriteria.php +++ b/app/Models/Kriteria.php @@ -8,18 +8,13 @@ use Illuminate\Database\Eloquent\Model; class Kriteria extends Model { use HasFactory; - protected $table = 'datakriteria'; // Sesuaikan dengan nama tabel di database - protected $fillable = ['kode_kriteria', 'nama_kriteria', 'bobot', 'jenis']; // Sesuaikan dengan kolom yang ada di tabel + protected $table = 'kriterias'; - public function subkriteria() + protected $fillable = ['nama_kriteria', 'bobot', 'jenis', 'kode_kriteria']; + + public function subKriteria() { - return $this->hasMany(Subkriteria::class, 'kriteria_id'); // Pastikan foreign key sesuai dengan tabel subkriteria + return $this->hasMany(SubKriteria::class); } - - public function penilaian() - { - return $this->hasMany(Penilaian::class, 'kriteria_id'); - } - } diff --git a/app/Models/NilaiAlternatif.php b/app/Models/NilaiAlternatif.php deleted file mode 100644 index 1d56261..0000000 --- a/app/Models/NilaiAlternatif.php +++ /dev/null @@ -1,30 +0,0 @@ -belongsTo(DataAlternatif::class, 'alternatif_id'); - } - - public function kriteria() - { - return $this->belongsTo(Kriteria::class, 'kriteria_id'); - } - - public function nilai() - { - return $this->hasMany(Penilaian::class, 'alternatif_id'); // Hubungkan ke Penilaian - } -} diff --git a/app/Models/Pakaian.php b/app/Models/Pakaian.php index 0101229..a7e43c3 100644 --- a/app/Models/Pakaian.php +++ b/app/Models/Pakaian.php @@ -2,23 +2,20 @@ namespace App\Models; -use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; class Pakaian extends Model { use HasFactory; - protected $table = 'pakaian'; // Nama tabel di database + protected $table = 'pakaians'; - protected $fillable = [ - 'nama', - 'jenis_acara', - 'jenis_pakaian', - 'harga', - 'warna', - 'lokasi', - 'cuaca', - 'rating' - ]; + protected $fillable = ['nama_pakaian', 'img', 'harga']; + + public function subKriterias(): BelongsToMany + { + return $this->belongsToMany(SubKriteria::class, 'pakaian_sub_kriterias'); + } } diff --git a/app/Models/PakaianSubKriteria.php b/app/Models/PakaianSubKriteria.php new file mode 100644 index 0000000..bbe6833 --- /dev/null +++ b/app/Models/PakaianSubKriteria.php @@ -0,0 +1,13 @@ + 'array', // Pastikan nilai disimpan sebagai array dalam database - ]; - - public function alternatif() - { - return $this->belongsTo(DataAlternatif::class, 'alternatif_id'); - } - - public function kriteria() - { - return $this->belongsTo(Kriteria::class, 'kriteria_id'); - } - - public function subkriteria() - { - return $this->belongsTo(Subkriteria::class, 'subkriteria_id'); - } -} diff --git a/app/Models/QuizHistory.php b/app/Models/QuizHistory.php deleted file mode 100644 index ee1839d..0000000 --- a/app/Models/QuizHistory.php +++ /dev/null @@ -1,23 +0,0 @@ - 'array', - 'hasil_rekomendasi' => 'array', - ]; -} diff --git a/app/Models/Subkriteria.php b/app/Models/Subkriteria.php index 76db3e0..4e727ce 100644 --- a/app/Models/Subkriteria.php +++ b/app/Models/Subkriteria.php @@ -2,29 +2,26 @@ namespace App\Models; -use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; -class Subkriteria extends Model +class SubKriteria extends Model { use HasFactory; - protected $table = 'subkriteria'; // Pastikan Laravel menggunakan nama tabel yang benar - protected $primaryKey = 'id'; // Jika primary key bukan 'id' - protected $fillable = ['nama_subkriteria', 'nilai', 'kriteria_id']; // Sesuaikan dengan kolom tabel + protected $table = 'sub_kriterias'; - public function kriteria() + protected $fillable = ['kriteria_id', 'nama_sub', 'nilai', 'min_harga', 'max_harga']; + + public function kriteria(): BelongsTo { - return $this->belongsTo(Kriteria::class, 'kriteria_id'); + return $this->belongsTo(Kriteria::class); } - public function penilaian() + public function pakaian(): BelongsToMany { - return $this->hasMany(Penilaian::class, 'subkriteria_id'); - } - - public function dataAlternatif() - { - return $this->hasMany(DataAlternatif::class, 'subkriteria_id'); + return $this->belongsToMany(Pakaian::class, 'pakaian_sub_kriteria'); } } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index b62b8d0..e81e6d0 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -21,8 +21,8 @@ class AppServiceProvider extends ServiceProvider */ public function boot(): void { - view()->composer('*', function ($view) { - $view->with('semua_kriteria', Kriteria::all()); - }); + // view()->composer('*', function ($view) { + // $view->with('semua_kriteria', Kriteria::all()); + // }); } } diff --git a/database/migrations/2025_02_14_103354_create_datakriteria_table.php b/database/migrations/2025_02_14_103354_create_datakriteria_table.php deleted file mode 100644 index 0168155..0000000 --- a/database/migrations/2025_02_14_103354_create_datakriteria_table.php +++ /dev/null @@ -1,24 +0,0 @@ -id(); // ID auto-increment - $table->string('kode_kriteria', 10)->unique(); // Kode kriteria (VARCHAR 10) - $table->string('nama_kriteria', 255); // Nama kriteria (VARCHAR 255) - $table->decimal('bobot', 5, 2); // Bobot (DECIMAL 5,2) - $table->enum('jenis', ['Benefit', 'Cost']); // Jenis (Benefit atau Cost) - $table->timestamps(); // Kolom created_at & updated_at - }); - } - - public function down() - { - Schema::dropIfExists('datakriteria'); - } -}; diff --git a/database/migrations/2025_02_21_035239_create_subkriteria_table.php b/database/migrations/2025_02_21_035239_create_subkriteria_table.php deleted file mode 100644 index b5f7b35..0000000 --- a/database/migrations/2025_02_21_035239_create_subkriteria_table.php +++ /dev/null @@ -1,28 +0,0 @@ -id(); - $table->string('nama_subkriteria'); - $table->integer('nilai'); - $table->foreignId('kriteria_id')->nullable()->constrained('datakriteria')->onDelete('set null'); - $table->timestamps(); - }); - } - - public function down(): void - { - Schema::table('subkriteria', function (Blueprint $table) { - $table->dropForeign(['kriteria_id']); - }); - - Schema::dropIfExists('subkriteria'); - } -}; \ No newline at end of file diff --git a/database/migrations/2025_03_05_040748_create_penilaian_table.php b/database/migrations/2025_03_05_040748_create_penilaian_table.php deleted file mode 100644 index 17c166f..0000000 --- a/database/migrations/2025_03_05_040748_create_penilaian_table.php +++ /dev/null @@ -1,36 +0,0 @@ -id(); - $table->foreignId('alternatif_id')->constrained('dataalternatif')->onDelete('cascade'); - $table->foreignId('kriteria_id')->constrained('datakriteria')->onDelete('cascade'); - $table->foreignId('subkriteria_id')->nullable()->constrained('subkriteria')->onDelete('cascade'); // ✅ Tambahkan ini - $table->float('nilai_c1')->nullable(); // Menyimpan nilai C1 - $table->float('nilai_c2')->nullable(); // Menyimpan nilai C2 - $table->float('nilai_c3')->nullable(); // Menyimpan nilai C3 - $table->float('nilai_c4')->nullable(); // Menyimpan nilai C4 - $table->float('nilai_c5')->nullable(); // Menyimpan nilai C5 - $table->float('nilai_c6')->nullable(); // Menyimpan nilai C6 - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('penilaian'); - } -}; diff --git a/database/migrations/2025_03_20_115444_create_pakaian_table.php b/database/migrations/2025_03_20_115444_create_pakaian_table.php deleted file mode 100644 index 27db7cd..0000000 --- a/database/migrations/2025_03_20_115444_create_pakaian_table.php +++ /dev/null @@ -1,28 +0,0 @@ -id(); // ID otomatis - $table->string('nama'); // Nama pakaian - $table->string('jenis_acara'); // Kasual, Formal, Pesta, Santai - $table->string('jenis_pakaian'); // Kemeja, Blouse, Celana, Rok, Dress, Cardigan - $table->integer('harga'); // Harga pakaian - $table->string('warna'); // Warna pakaian - $table->string('lokasi'); // Indoor / Outdoor - $table->string('cuaca'); // Cerah / Berawan - $table->decimal('rating', 3, 2)->default(0); // Contoh: 4.5 - $table->timestamps(); // Tanggal dibuat & diperbarui - }); - } - - public function down() - { - Schema::dropIfExists('pakaian'); - } -}; diff --git a/database/migrations/2025_05_17_033206_add_gambar_to_dataalternatif_table.php b/database/migrations/2025_05_17_033206_add_gambar_to_dataalternatif_table.php deleted file mode 100644 index 46b4741..0000000 --- a/database/migrations/2025_05_17_033206_add_gambar_to_dataalternatif_table.php +++ /dev/null @@ -1,28 +0,0 @@ -string('gambar')->nullable()->after('nama_alternatif'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('dataalternatif', function (Blueprint $table) { - $table->dropColumn('gambar'); - }); - } -}; diff --git a/database/migrations/2025_05_22_111608_create_quiz_history_table.php b/database/migrations/2025_05_22_111608_create_quiz_history_table.php deleted file mode 100644 index 144c42b..0000000 --- a/database/migrations/2025_05_22_111608_create_quiz_history_table.php +++ /dev/null @@ -1,29 +0,0 @@ -id(); - $table->json('data_kuisioner'); - $table->json('hasil_rekomendasi'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('quiz_history'); - } -}; diff --git a/database/migrations/2025_05_24_131029_create_pakaian_table.php b/database/migrations/2025_05_24_131029_create_pakaian_table.php deleted file mode 100644 index 4365f35..0000000 --- a/database/migrations/2025_05_24_131029_create_pakaian_table.php +++ /dev/null @@ -1,38 +0,0 @@ -id(); - $table->string('nama'); - - $table->foreignId('jenis_id')->constrained('jenispakaian')->onDelete('cascade'); - $table->foreignId('warna_id')->constrained('warna')->onDelete('cascade'); - $table->foreignId('lokasi_id')->constrained('lokasi')->onDelete('cascade'); - $table->foreignId('cuaca_id')->constrained('cuaca')->onDelete('cascade'); - $table->foreignId('acara_id')->constrained('jenisacara')->onDelete('cascade'); - $table->foreignId('harga_id')->constrained('hargakategori')->onDelete('cascade'); - - $table->integer('harga_asli'); // harga sebenarnya, misal: 134000 - - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('pakaian'); - } -}; diff --git a/database/migrations/2025_05_24_131238_create_cuaca_table.php b/database/migrations/2025_05_24_131238_create_cuaca_table.php deleted file mode 100644 index 6a2e7ec..0000000 --- a/database/migrations/2025_05_24_131238_create_cuaca_table.php +++ /dev/null @@ -1,29 +0,0 @@ -id(); - $table->string('nama'); - $table->integer('nilai'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('cuaca'); - } -}; diff --git a/database/migrations/2025_05_24_131317_create_warna_table.php b/database/migrations/2025_05_24_131317_create_warna_table.php deleted file mode 100644 index 8517b16..0000000 --- a/database/migrations/2025_05_24_131317_create_warna_table.php +++ /dev/null @@ -1,29 +0,0 @@ -id(); - $table->string('nama'); - $table->integer('nilai'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('warna'); - } -}; diff --git a/database/migrations/2025_05_24_131341_create_jenispakaian_table.php b/database/migrations/2025_05_24_131341_create_jenispakaian_table.php deleted file mode 100644 index a7b991a..0000000 --- a/database/migrations/2025_05_24_131341_create_jenispakaian_table.php +++ /dev/null @@ -1,29 +0,0 @@ -id(); - $table->string('nama'); - $table->integer('nilai'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('jenispakaian'); - } -}; diff --git a/database/migrations/2025_05_24_131417_create_jenisacara_table.php b/database/migrations/2025_05_24_131417_create_jenisacara_table.php deleted file mode 100644 index 52cf901..0000000 --- a/database/migrations/2025_05_24_131417_create_jenisacara_table.php +++ /dev/null @@ -1,29 +0,0 @@ -id(); - $table->string('nama'); - $table->integer('nilai'); // bobot untuk SAW - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('jenisacara'); - } -}; diff --git a/database/migrations/2025_03_05_040712_create_dataalternatif_table.php b/database/migrations/2025_05_24_133346_create_kriterias_table.php similarity index 57% rename from database/migrations/2025_03_05_040712_create_dataalternatif_table.php rename to database/migrations/2025_05_24_133346_create_kriterias_table.php index b711588..ce296a7 100644 --- a/database/migrations/2025_03_05_040712_create_dataalternatif_table.php +++ b/database/migrations/2025_05_24_133346_create_kriterias_table.php @@ -11,10 +11,12 @@ return new class extends Migration */ public function up(): void { - Schema::create('dataalternatif', function (Blueprint $table) { + Schema::create('kriterias', function (Blueprint $table) { $table->id(); - $table->string('nama_alternatif'); - $table->foreignId('subkriteria_id')->nullable()->constrained('subkriteria')->onDelete('set null'); + $table->string('nama_kriteria'); + $table->string('kode_kriteria'); + $table->enum('jenis', ['COST', 'BENEFIT']); + $table->float('bobot'); // bobot untuk SAW $table->timestamps(); }); } @@ -24,6 +26,6 @@ return new class extends Migration */ public function down(): void { - Schema::dropIfExists('dataalternatif'); + Schema::dropIfExists('kriterias'); } }; diff --git a/database/migrations/2025_05_24_133401_create_sub_kriterias_table.php b/database/migrations/2025_05_24_133401_create_sub_kriterias_table.php new file mode 100644 index 0000000..b48aac9 --- /dev/null +++ b/database/migrations/2025_05_24_133401_create_sub_kriterias_table.php @@ -0,0 +1,32 @@ +id(); + $table->foreignId('kriteria_id')->constrained()->onDelete('cascade'); + $table->string('nama_sub'); + $table->float('nilai'); // nilai untuk metode SAW + $table->unsignedBigInteger('min_harga')->nullable(); // khusus kriteria harga + $table->unsignedBigInteger('max_harga')->nullable(); // khusus kriteria harga + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('sub_kriterias'); + } +}; diff --git a/database/migrations/2025_05_24_131254_create_lokasi_table.php b/database/migrations/2025_05_24_133412_create_pakaians_table.php similarity index 62% rename from database/migrations/2025_05_24_131254_create_lokasi_table.php rename to database/migrations/2025_05_24_133412_create_pakaians_table.php index f80ddce..78f120f 100644 --- a/database/migrations/2025_05_24_131254_create_lokasi_table.php +++ b/database/migrations/2025_05_24_133412_create_pakaians_table.php @@ -11,13 +11,13 @@ return new class extends Migration */ public function up(): void { - Schema::create('lokasi', function (Blueprint $table) { + Schema::create('pakaians', function (Blueprint $table) { $table->id(); - $table->string('nama'); - $table->integer('nilai'); + $table->string('nama_pakaian'); + $table->longText('img'); + $table->unsignedBigInteger('harga'); // harga asli pakaian $table->timestamps(); }); - } /** @@ -25,6 +25,6 @@ return new class extends Migration */ public function down(): void { - Schema::dropIfExists('lokasi'); + Schema::dropIfExists('pakaians'); } }; diff --git a/database/migrations/2025_05_24_131155_create_hargakategori_table.php b/database/migrations/2025_05_24_133426_create_pakaian_sub_kriterias_table.php similarity index 54% rename from database/migrations/2025_05_24_131155_create_hargakategori_table.php rename to database/migrations/2025_05_24_133426_create_pakaian_sub_kriterias_table.php index 9f6f0e0..1bb02cd 100644 --- a/database/migrations/2025_05_24_131155_create_hargakategori_table.php +++ b/database/migrations/2025_05_24_133426_create_pakaian_sub_kriterias_table.php @@ -11,12 +11,13 @@ return new class extends Migration */ public function up(): void { - Schema::create('hargakategori', function (Blueprint $table) { + Schema::create('pakaian_sub_kriterias', function (Blueprint $table) { $table->id(); - $table->integer('min'); // contoh: 80000 - $table->integer('max'); // contoh: 100000 - $table->integer('nilai'); // nilai bobot untuk SAW + $table->foreignId('pakaian_id')->constrained()->onDelete('cascade'); + $table->foreignId('sub_kriteria_id')->constrained()->onDelete('cascade'); $table->timestamps(); + + $table->unique(['pakaian_id', 'sub_kriteria_id']); }); } @@ -25,6 +26,6 @@ return new class extends Migration */ public function down(): void { - Schema::dropIfExists('hargakategori'); + Schema::dropIfExists('pakaian_sub_kriterias'); } }; diff --git a/public/uploads/pakaian/1748104172_Screenshot 2025-04-23 195651.png b/public/uploads/pakaian/1748104172_Screenshot 2025-04-23 195651.png new file mode 100644 index 0000000..f05bb4e Binary files /dev/null and b/public/uploads/pakaian/1748104172_Screenshot 2025-04-23 195651.png differ diff --git a/public/uploads/pakaian/1748104366_Screenshot 2025-04-25 133404.png b/public/uploads/pakaian/1748104366_Screenshot 2025-04-25 133404.png new file mode 100644 index 0000000..3839553 Binary files /dev/null and b/public/uploads/pakaian/1748104366_Screenshot 2025-04-25 133404.png differ diff --git a/resources/views/admin/layouts/base.blade.php b/resources/views/admin/layouts/base.blade.php index e0f4b09..c9016f5 100644 --- a/resources/views/admin/layouts/base.blade.php +++ b/resources/views/admin/layouts/base.blade.php @@ -13,24 +13,24 @@