259 lines
12 KiB
PHP
259 lines
12 KiB
PHP
<?php
|
||
|
||
namespace App\Http\Controllers;
|
||
|
||
use Carbon\Carbon;
|
||
use App\Models\Kriteria;
|
||
use App\Models\Penilaian;
|
||
use App\Models\Alternatif;
|
||
use App\Models\SubKriteria;
|
||
use App\Models\MemberKelompokTani;
|
||
use App\Models\HistorisPerhitungan;
|
||
use Illuminate\Http\Request;
|
||
use Illuminate\Support\Facades\Auth;
|
||
|
||
class PerhitunganController extends Controller
|
||
{
|
||
public function index()
|
||
{
|
||
$user = Auth::user();
|
||
$kriterias = Kriteria::with('subkriterias')->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',
|
||
]);
|
||
}
|
||
}
|