get(); $penilaians = Penilaian::with('subkriteria')->get(); // Ambil alternatif sesuai role if ($user->role === 'super_admin') { $alternatifs = Alternatif::all(); } elseif ($user->role === 'admin') { $member = MemberKelompokTani::where('user_id', $user->id)->first(); if ($member) { $userIds = MemberKelompokTani::where('kelompok_tani_id', $member->kelompok_tani_id)->pluck('user_id'); $alternatifs = Alternatif::whereIn('user_id', $userIds)->get(); } else { $alternatifs = collect(); // kosong jika admin belum terdaftar di kelompok } } else { $alternatifs = Alternatif::where('user_id', $user->id)->get(); } // STEP 1: ANALISA (nilai asli) $analisa = []; foreach ($alternatifs as $alt) { $row = ['nama_lahan' => $alt->nama_lahan]; foreach ($kriterias as $krit) { $penilaian = $penilaians->where('alternatif_id', $alt->id) ->where('kriteria_id', $krit->id) ->first(); $nilai = $penilaian && $penilaian->subkriteria ? $penilaian->subkriteria->bobot : 0; $row[$krit->nama_kriteria] = $nilai; } $analisa[] = $row; } // STEP 2: MAX / MIN untuk normalisasi $maxValues = []; $minValues = []; foreach ($kriterias as $krit) { $nilaiList = []; foreach ($alternatifs as $alt) { $penilaian = $penilaians->where('alternatif_id', $alt->id) ->where('kriteria_id', $krit->id) ->first(); $nilai = $penilaian && $penilaian->subkriteria ? $penilaian->subkriteria->bobot : 0; $nilaiList[] = $nilai; } $maxValues[$krit->nama_kriteria] = !empty($nilaiList) ? max($nilaiList) : 0; $minValues[$krit->nama_kriteria] = !empty($nilaiList) ? min($nilaiList) : 0; } // STEP 3: Normalisasi $normalisasi = []; foreach ($alternatifs as $alt) { $row = ['nama_lahan' => $alt->nama_lahan]; foreach ($kriterias as $krit) { $penilaian = $penilaians->where('alternatif_id', $alt->id) ->where('kriteria_id', $krit->id) ->first(); $nilai = $penilaian && $penilaian->subkriteria ? $penilaian->subkriteria->bobot : 0; $max = $maxValues[$krit->nama_kriteria] ?? 0; $min = $minValues[$krit->nama_kriteria] ?? 0; if ($krit->jenis === 'Benefit') { $normal = $max != 0 ? $nilai / $max : 0; } else { $normal = $nilai != 0 ? $min / $nilai : 0; } $row[$krit->nama_kriteria] = round($normal, 4); } $normalisasi[] = $row; } // STEP 4: Konversi bobot $bobotDesimal = []; foreach ($kriterias as $krit) { $bobotDesimal[$krit->nama_kriteria] = $krit->bobot / 100; } // STEP 5: Hitung Ranking $ranking = []; foreach ($alternatifs as $alt) { $skor = 0; $saran = []; foreach ($kriterias as $krit) { $penilaian = $penilaians->where('alternatif_id', $alt->id) ->where('kriteria_id', $krit->id) ->first(); $nilai = $penilaian && $penilaian->subkriteria ? $penilaian->subkriteria->bobot : 0; $normal = 0; if ($krit->jenis === 'Benefit') { $max = $maxValues[$krit->nama_kriteria] ?? 0; $normal = $max != 0 ? $nilai / $max : 0; } else { $min = $minValues[$krit->nama_kriteria] ?? 0; $normal = $nilai != 0 ? $min / $nilai : 0; } $skor += $normal * ($krit->bobot / 100); $sub = $penilaian?->subkriteria; if ($sub) { switch (strtolower($krit->nama_kriteria)) { case 'curah hujan': if ($sub->nama_sub_kriteria === '51 – 100 mm') { $saran[] = "Curah hujan optimal untuk budidaya cabai. Tidak perlu intervensi tambahan terhadap sistem irigasi."; } elseif ($sub->nama_sub_kriteria === '101 – 200 mm') { $saran[] = "Curah hujan cukup tinggi. Pastikan drainase lahan baik agar akar tanaman tidak tergenang."; } elseif ($sub->nama_sub_kriteria === '201 – 300 mm') { $saran[] = "Curah hujan tinggi. Disarankan menggunakan bedengan tinggi dan sistem saluran air yang efisien untuk mencegah kebusukan akar."; } elseif ($sub->nama_sub_kriteria === '< 50 atau > 300 mm') { $saran[] = "Curah hujan ekstrem (terlalu rendah atau terlalu tinggi). Perlu sistem irigasi tambahan saat kering, dan peneduh serta drainase baik saat musim hujan."; } break; case 'ph tanah': if ($sub->nama_sub_kriteria === '6.0 – 6.8') { $saran[] = "pH tanah berada dalam rentang optimal untuk tanaman cabai. Tidak perlu tindakan korektif."; } elseif ($sub->nama_sub_kriteria === '5.5 – 5.9 atau 6.9 – 7.2') { $saran[] = "pH tanah mendekati optimal, namun tetap disarankan memantau kondisi dan menyesuaikan dengan jenis varietas cabai."; } elseif ($sub->nama_sub_kriteria === '5.0 – 5.4 atau 7.3 – 7.5') { $saran[] = "pH tanah cukup menyimpang dari kondisi ideal. Pertimbangkan untuk menambahkan dolomit (kapur pertanian) atau belerang sesuai kebutuhan."; } elseif ($sub->nama_sub_kriteria === '< 5.0 atau > 7.5') { $saran[] = "pH tanah terlalu ekstrem untuk budidaya cabai. Lakukan koreksi tanah secara bertahap dan intensif untuk menyesuaikan ke tingkat netral."; } break; case 'tekstur tanah': if ($sub->nama_sub_kriteria === 'Lempung Berpasir') { $saran[] = "Tekstur tanah sangat ideal untuk cabai. Sirkulasi udara dan drainase baik. Tidak perlu perbaikan."; } elseif ($sub->nama_sub_kriteria === 'Lempung') { $saran[] = "Tanah masih baik untuk cabai, meskipun perlu perhatian pada drainase terutama saat musim hujan."; } elseif ($sub->nama_sub_kriteria === 'Lempung Liat') { $saran[] = "Tanah agak berat, sebaiknya diberi bahan organik (kompos/pupuk kandang) untuk meningkatkan porositas."; } elseif ($sub->nama_sub_kriteria === 'Berpasir Kasar atau Liat Berat') { $saran[] = "Tekstur tanah kurang sesuai. Tambahkan bahan organik atau lakukan pencampuran tanah untuk meningkatkan struktur."; } break; case 'temperatur': if ($sub->nama_sub_kriteria === '24 - 28 °C') { $saran[] = "Temperatur sangat ideal untuk pertumbuhan cabai. Tidak diperlukan tindakan tambahan."; } elseif ($sub->nama_sub_kriteria === '29 – 32 °C atau 17 – 23 °C') { $saran[] = "Temperatur cukup mendukung, namun pemantauan kelembapan tanah dan penyiraman teratur disarankan."; } elseif ($sub->nama_sub_kriteria === '33 – 34 °C atau 14 – 16 °C') { $saran[] = "Temperatur cenderung ekstrem, pertimbangkan penggunaan naungan atau penghangat untuk menstabilkan suhu."; } elseif ($sub->nama_sub_kriteria === '> 34 °C atau < 14 °C') { $saran[] = "Temperatur tidak cocok untuk cabai. Disarankan memilih tanaman yang lebih tahan suhu ekstrem atau melakukan penyesuaian mikroklimat."; } break; case 'kelembapan': if ($sub->nama_sub_kriteria === '60 – 80%') { $saran[] = "Kelembapan sangat ideal untuk pertumbuhan cabai. Tidak diperlukan penyesuaian."; } elseif ($sub->nama_sub_kriteria === '50 – 59%') { $saran[] = "Kelembapan cukup baik, namun tetap jaga irigasi agar tetap stabil."; } elseif ($sub->nama_sub_kriteria === '40 – 49%') { $saran[] = "Kelembapan mulai rendah. Disarankan untuk meningkatkan frekuensi penyiraman atau memasang mulsa."; } elseif ($sub->nama_sub_kriteria === '< 40% atau > 80%') { $saran[] = "Kelembapan ekstrem. Perlu pengaturan irigasi atau drainase agar kondisi tanah sesuai kebutuhan cabai."; } break; case 'tanaman sebelumnya': if ($sub->nama_sub_kriteria === 'Padi, Jagung, Tebu, Bawang') { $saran[] = "Tanaman sebelumnya sangat ideal. Lahan dalam kondisi baik untuk ditanami cabai."; } elseif ($sub->nama_sub_kriteria === 'Bayam, Sawi, Kacang Tanah') { $saran[] = "Tanaman sebelumnya cukup baik. Disarankan untuk melakukan pemupukan awal sebelum tanam cabai."; } elseif ($sub->nama_sub_kriteria === 'Tomat, Terong, Tembakau') { $saran[] = "Tanaman sebelumnya masih satu keluarga dengan cabai. Waspadai penyakit yang mungkin tertinggal di tanah."; } elseif ($sub->nama_sub_kriteria === 'Semua Jenis Tanaman Cabai') { $saran[] = "Tidak disarankan menanam cabai secara berulang. Rotasi tanaman diperlukan untuk mencegah resistensi penyakit."; } break; } } } $ranking[] = [ 'nama_lahan' => $alt->nama_lahan, 'nilai_akhir' => round($skor, 4), 'rekomendasi' => $saran, ]; } $ranking = collect($ranking)->sortByDesc('nilai_akhir')->values()->map(function ($item, $index) { $item['ranking'] = $index + 1; return $item; })->toArray(); return view('admin.perhitungan', [ 'analisa' => $analisa, 'normalisasi' => $normalisasi, 'ranking' => $ranking, 'kriterias' => $kriterias, 'title' => 'Perhitungan SAW', ]); } public function simpanKeHistoris(Request $request) { $user = Auth::user(); $hasilPerhitungan = $request->input('hasil'); $periode = Carbon::now()->format('Y-m'); foreach ($hasilPerhitungan as $hasil) { HistorisPerhitungan::create([ 'nama_lahan' => $hasil['nama_lahan'], 'user_id' => $user->id, 'nilai_akhir' => $hasil['nilai_akhir'], 'periode' => $periode, ]); } return redirect()->back()->with('success', 'Hasil perhitungan berhasil disimpan ke historis!'); } public function historis() { $user = Auth::user(); if ($user->role === 'super_admin') { $hasil_perhitungan = HistorisPerhitungan::all(); } elseif ($user->role === 'admin') { $member = MemberKelompokTani::where('user_id', $user->id)->first(); if ($member) { $userIds = MemberKelompokTani::where('kelompok_tani_id', $member->kelompok_tani_id) ->pluck('user_id'); $hasil_perhitungan = HistorisPerhitungan::whereIn('user_id', $userIds)->get(); } else { $hasil_perhitungan = collect(); // kosong } } else { $hasil_perhitungan = HistorisPerhitungan::where('user_id', $user->id)->get(); } return view('admin.historis', [ 'hasil_perhitungan' => $hasil_perhitungan, 'title' => 'Riwayat Perhitungan SAW', ]); } }