solve lahan & tanaman

This commit is contained in:
2026-07-22 15:49:25 +07:00
parent a5884d0f8c
commit e7f48b6500
4 changed files with 116 additions and 44 deletions
@@ -17,6 +17,7 @@ use App\Models\Pertanian\Lahan;
use App\Models\Wilayah\DesaKelurahan;
use App\Models\Wilayah\Provinsi;
use App\Models\Pertanian\Komoditas;
use App\Models\Pertanian\PraktikBudidaya;
use App\Models\Pertanian\Tanaman;
use App\Models\Master\JenisTanaman;
@@ -64,8 +65,40 @@ class PetaniLahanController extends Controller
$komoditas = Komoditas::all();
$tanamanPenaung = JenisTanaman::all();
$autoPestDiseaseData = $this->autoPestDiseaseData($petaniId);
$jenisHamaOtomatis = $autoPestDiseaseData['jenis_hama'];
$jenisPenyakitOtomatis = $autoPestDiseaseData['jenis_penyakit'];
return view('produktivitas.petani.lahan.add', compact('petani', 'lahan', 'provinsi', 'komoditas', 'tanamanPenaung'));
return view('produktivitas.petani.lahan.add', compact('petani', 'lahan', 'provinsi', 'komoditas', 'tanamanPenaung', 'jenisHamaOtomatis', 'jenisPenyakitOtomatis'));
}
private function autoPestDiseaseData(string|int $petaniId): array
{
$praktikBudidaya = PraktikBudidaya::where('petani_id', $petaniId)->latest()->first();
return [
'jenis_hama' => $this->normalizeArrayValue($praktikBudidaya?->jenis_hama),
'jenis_penyakit' => $this->normalizeArrayValue($praktikBudidaya?->jenis_penyakit),
];
}
private function normalizeArrayValue(mixed $value): array
{
if (is_array($value)) {
return array_values(array_filter($value, fn ($item) => filled($item)));
}
if (is_string($value) && $value !== '') {
$decoded = json_decode($value, true);
if (is_array($decoded)) {
return array_values(array_filter($decoded, fn ($item) => filled($item)));
}
return [$value];
}
return [];
}
private function validateLahan(Request $request)
@@ -167,6 +200,7 @@ class PetaniLahanController extends Controller
]);
$validated = $this->validateLahan($request);
$validated = array_merge($validated, $this->autoPestDiseaseData($petaniId));
$komoditas = Komoditas::where('id', $request->komoditas_id)->first();
$lahanCount = Lahan::where('petani_id', $petaniId)
->count();
@@ -210,6 +244,8 @@ class PetaniLahanController extends Controller
'serangan_hama' => $lahan->serangan_hama,
'penyakit_tanaman' => $lahan->penyakit_tanaman,
'keparahan_serangan' => $lahan->keparahan_serangan,
'jenis_hama' => json_encode($lahan->jenis_hama ?? []),
'jenis_penyakit' => json_encode($lahan->jenis_penyakit ?? []),
'created_by' => auth()->id(),
'updated_by' => auth()->id(),
'created_at' => now(),
@@ -269,10 +305,13 @@ class PetaniLahanController extends Controller
$komoditas = Komoditas::all();
$tanamanPenaung = JenisTanaman::all();
$autoPestDiseaseData = $this->autoPestDiseaseData($petaniId);
$jenisHamaOtomatis = $autoPestDiseaseData['jenis_hama'];
$jenisPenyakitOtomatis = $autoPestDiseaseData['jenis_penyakit'];
$provinsi = Provinsi::orderBy('kode', 'asc')->get();
return view('produktivitas.petani.lahan.edit', compact('lahan', 'lahanSelected', 'petani', 'komoditas', 'provinsi', 'tanamanPenaung'));
return view('produktivitas.petani.lahan.edit', compact('lahan', 'lahanSelected', 'petani', 'komoditas', 'provinsi', 'tanamanPenaung', 'jenisHamaOtomatis', 'jenisPenyakitOtomatis'));
}
public function update(Request $request, string $petaniId, string $id)
@@ -290,6 +329,7 @@ class PetaniLahanController extends Controller
->toArray()
]);
$validated = $this->validateLahan($request);
$validated = array_merge($validated, $this->autoPestDiseaseData($petaniId));
$komoditas = Komoditas::where('id', $request->komoditas_id)->first();
$tanamanCount = Tanaman::where('lahan_id', $lahan->id)->count();
$lahanCount = Lahan::where('petani_id', $petaniId)->count();
@@ -356,6 +396,8 @@ class PetaniLahanController extends Controller
'serangan_hama' => $lahan->serangan_hama,
'penyakit_tanaman' => $lahan->penyakit_tanaman,
'keparahan_serangan' => $lahan->keparahan_serangan,
'jenis_hama' => json_encode($lahan->jenis_hama ?? []),
'jenis_penyakit' => json_encode($lahan->jenis_penyakit ?? []),
'created_by' => auth()->id(),
'updated_by' => auth()->id(),
'created_at' => now(),
@@ -368,6 +410,12 @@ class PetaniLahanController extends Controller
});
}
$lahan->tanaman()->update([
'jenis_hama' => json_encode($lahan->jenis_hama ?? []),
'jenis_penyakit' => json_encode($lahan->jenis_penyakit ?? []),
'updated_by' => auth()->id(),
]);
if ($request->ajax()) {
return response()->json([
'success' => true,
+20 -14
View File
@@ -97,6 +97,25 @@ class PraktikBudidaya extends Model
$kebiasaan = $praktikBudidaya->kebiasaan_konservasi_tanah ? count($praktikBudidaya->kebiasaan_konservasi_tanah) : 0;
$pemahaman = $praktikBudidaya->pemahaman_manfaat_konservasi_tanah == 'Ya, tahu manfaatnya' ? 1 : 0;
$skor_konservasi_tanah = 0;
$jenisHama = $praktikBudidaya->jenis_hama ?? [];
$jenisPenyakit = $praktikBudidaya->jenis_penyakit ?? [];
Lahan::where('petani_id', $praktikBudidaya->petani_id)->get()->each(function (Lahan $lahan) use ($jenisHama, $jenisPenyakit, $praktikBudidaya) {
$lahan->update([
'jenis_hama' => $jenisHama,
'jenis_penyakit' => $jenisPenyakit,
'updated_by' => $praktikBudidaya->updated_by,
]);
});
Tanaman::where('petani_id', $praktikBudidaya->petani_id)->get()->each(function (Tanaman $tanaman) use ($jenisHama, $jenisPenyakit, $praktikBudidaya) {
$tanaman->update([
'jenis_hama' => $jenisHama,
'jenis_penyakit' => $jenisPenyakit,
'updated_by' => $praktikBudidaya->updated_by,
]);
});
if ($kebiasaan == 0) {
$skor_konservasi_tanah = 1;
} elseif ($kebiasaan == 1 && $pemahaman == 0) {
@@ -117,19 +136,6 @@ class PraktikBudidaya extends Model
'skor_d2_k2_7_penglolaan_air_irigasi' => $praktikBudidaya->kondisi_pengelolaan_air,
'skor_d2_k2_8_praktik_konservasi_tanah' => $skor_konservasi_tanah,
]);
Lahan::where('petani_id', $petani->id)->update([
'jenis_hama' => $praktikBudidaya->jenis_hama,
'jenis_penyakit' => $praktikBudidaya->jenis_penyakit,
]);
Tanaman::whereIn(
'lahan_id',
Lahan::where('petani_id', $petani->id)->select('id')
)->update([
'jenis_hama' => $praktikBudidaya->jenis_hama,
'jenis_penyakit' => $praktikBudidaya->jenis_penyakit,
]);
});
}
@@ -137,4 +143,4 @@ class PraktikBudidaya extends Model
{
return $this->belongsTo(Petani::class, 'petani_id');
}
}
}
@@ -163,6 +163,10 @@
z-index: 100000 !important;
}
.foto-lightbox-close:hover { color: #dc3545 !important; }
.auto-pest-disease-field .form-check-label,
.auto-pest-disease-field .text-muted {
font-size: 0.875rem;
}
</style>
@endpush
@@ -259,7 +263,7 @@
</div>
</div>
<div class="row">
<div class="col-md-3 mb-4 form-control-validation">
<div class="col-md-3 mb-4 form-control-validation auto-pest-disease-field">
<label class="form-label">Jenis Hama</label>
<div class="form-check mt-2">
@@ -267,7 +271,8 @@
type="checkbox"
name="jenis_hama[]"
value="Penggerek buah"
id="jenis-hama-penggerek-buah">
id="jenis-hama-penggerek-buah"
{{ in_array('Penggerek buah', $jenisHamaOtomatis ?? [], true) ? 'checked' : '' }}>
<label class="form-check-label" for="jenis-hama-bentuk">Penggerek buah</label>
</div>
@@ -276,7 +281,8 @@
type="checkbox"
name="jenis_hama[]"
value="Penggerek batang"
id="jenis-hama-penggerek-batang">
id="jenis-hama-penggerek-batang"
{{ in_array('Penggerek batang', $jenisHamaOtomatis ?? [], true) ? 'checked' : '' }}>
<label class="form-check-label" for="jenis-hama-bentuk">Penggerek batang</label>
</div>
@@ -285,7 +291,8 @@
type="checkbox"
name="jenis_hama[]"
value="Kutu putih/kutu sisik"
id="jenis-hama-kutu">
id="jenis-hama-kutu"
{{ in_array('Kutu putih/kutu sisik', $jenisHamaOtomatis ?? [], true) ? 'checked' : '' }}>
<label class="form-check-label" for="jenis-hama-bentuk">Kutu putih/kutu sisik</label>
</div>
@@ -294,7 +301,8 @@
type="checkbox"
name="jenis_hama[]"
value="Ulat pemakan daun"
id="jenis-hama-ulat">
id="jenis-hama-ulat"
{{ in_array('Ulat pemakan daun', $jenisHamaOtomatis ?? [], true) ? 'checked' : '' }}>
<label class="form-check-label" for="jenis-hama-bentuk">Ulat pemakan daun</label>
</div>
@@ -303,15 +311,16 @@
type="checkbox"
name="jenis_hama[]"
value="Tikus"
id="jenis-hama-tikus">
id="jenis-hama-tikus"
{{ in_array('Tikus', $jenisHamaOtomatis ?? [], true) ? 'checked' : '' }}>
<label class="form-check-label" for="jenis-hama-bentuk">Tikus</label>
</div>
<small class="text-muted text-secondary">* Tidak diisi, terisi otomatis</small>
<small class="text-muted text-secondary">* Tidak diisi, terisi otomatis di Praktik Budidaya</small>
@error('jenis_hama')
<div class="error invalid-feedback d-block">{{ $message }}</div>
@enderror
</div>
<div class="col-md-3 mb-4 form-control-validation">
<div class="col-md-3 mb-4 form-control-validation auto-pest-disease-field">
<label class="form-label">Jenis Penyakit</label>
<div class="form-check mt-2">
@@ -319,7 +328,8 @@
type="checkbox"
name="jenis_penyakit[]"
value="Karat daun"
id="jenis-penyakit-karat-daun">
id="jenis-penyakit-karat-daun"
{{ in_array('Karat daun', $jenisPenyakitOtomatis ?? [], true) ? 'checked' : '' }}>
<label class="form-check-label" for="jenis-penyakit-bentuk">Karat daun</label>
</div>
@@ -328,7 +338,8 @@
type="checkbox"
name="jenis_penyakit[]"
value="Busuk buah/antraknosa"
id="jenis-penyakit-busuk-buah">
id="jenis-penyakit-busuk-buah"
{{ in_array('Busuk buah/antraknosa', $jenisPenyakitOtomatis ?? [], true) ? 'checked' : '' }}>
<label class="form-check-label" for="jenis-penyakit-bentuk">Busuk buah/antraknosa</label>
</div>
@@ -337,7 +348,8 @@
type="checkbox"
name="jenis_penyakit[]"
value="Busuk akar"
id="jenis-penyakit-busuk-akar">
id="jenis-penyakit-busuk-akar"
{{ in_array('Busuk akar', $jenisPenyakitOtomatis ?? [], true) ? 'checked' : '' }}>
<label class="form-check-label" for="jenis-penyakit-bentuk">Busuk akar</label>
</div>
@@ -346,7 +358,8 @@
type="checkbox"
name="jenis_penyakit[]"
value="Bercak daun"
id="jenis-penyakit-bercak-daun">
id="jenis-penyakit-bercak-daun"
{{ in_array('Bercak daun', $jenisPenyakitOtomatis ?? [], true) ? 'checked' : '' }}>
<label class="form-check-label" for="jenis-penyakit-bentuk">Bercak daun</label>
</div>
@@ -355,10 +368,11 @@
type="checkbox"
name="jenis_penyakit[]"
value="Layu fusarium"
id="jenis-penyakit-layu-fusarium">
id="jenis-penyakit-layu-fusarium"
{{ in_array('Layu fusarium', $jenisPenyakitOtomatis ?? [], true) ? 'checked' : '' }}>
<label class="form-check-label" for="jenis-penyakit-bentuk">Layu fusarium</label>
</div>
<small class="text-muted text-secondary">* Tidak diisi, terisi otomatis</small>
<small class="text-muted text-secondary">* Tidak diisi, terisi otomatis di praktik budidaya</small>
@error('jenis_penyakit')
<div class="error invalid-feedback d-block">{{ $message }}</div>
@@ -34,6 +34,10 @@
.foto-lightbox img { max-width: 90vw !important; max-height: 85vh !important; object-fit: contain !important; border-radius: 8px !important; box-shadow: 0 10px 40px rgba(0,0,0,0.5) !important; }
.foto-lightbox-close { position: absolute !important; top: 20px !important; right: 30px !important; color: #fff !important; font-size: 40px !important; font-weight: bold !important; cursor: pointer !important; z-index: 100000 !important; }
.foto-lightbox-close:hover { color: #dc3545 !important; }
.auto-pest-disease-field .form-check-label,
.auto-pest-disease-field .text-muted {
font-size: 0.875rem;
}
</style>
@endpush
@@ -161,7 +165,7 @@
<option value="{{ \App\Enums\PenyakitTanaman::TANAMAN_LAYU }}" {{ old('penyakit_tanaman', $lahanSelected->penyakit_tanaman) == \App\Enums\PenyakitTanaman::TANAMAN_LAYU ? 'selected' : '' }}>Tanaman Layu</option>
</select>
</div> -->
<div class="col-md-3 mb-4 form-control-validation">
<div class="col-md-3 mb-4 form-control-validation auto-pest-disease-field">
<label class="form-label">Jenis Hama</label>
<div class="form-check mt-2">
@@ -170,7 +174,7 @@
name="jenis_hama[]"
value="Penggerek buah"
id="jenis-hama-penggerek-buah"
{{ in_array('Penggerek buah', old('jenis_hama', $lahanSelected->jenis_hama ?? [])) ? 'checked' : '' }}>
{{ in_array('Penggerek buah', $jenisHamaOtomatis ?? [], true) ? 'checked' : '' }}>
<label class="form-check-label" for="jenis-hama-bentuk">Penggerek buah</label>
</div>
@@ -180,7 +184,7 @@
name="jenis_hama[]"
value="Penggerek batang"
id="jenis-hama-penggerek-batang"
{{ in_array('Penggerek batang', old('jenis_hama', $lahanSelected->jenis_hama ?? [])) ? 'checked' : '' }}>
{{ in_array('Penggerek batang', $jenisHamaOtomatis ?? [], true) ? 'checked' : '' }}>
<label class="form-check-label" for="jenis-hama-bentuk">Penggerek batang</label>
</div>
@@ -190,7 +194,7 @@
name="jenis_hama[]"
value="Kutu putih/kutu sisik"
id="jenis-hama-kutu"
{{ in_array('Kutu putih/kutu sisik', old('jenis_hama', $lahanSelected->jenis_hama ?? [])) ? 'checked' : '' }}>
{{ in_array('Kutu putih/kutu sisik', $jenisHamaOtomatis ?? [], true) ? 'checked' : '' }}>
<label class="form-check-label" for="jenis-hama-bentuk">Kutu putih/kutu sisik</label>
</div>
@@ -200,7 +204,7 @@
name="jenis_hama[]"
value="Ulat pemakan daun"
id="jenis-hama-ulat"
{{ in_array('Ulat pemakan daun', old('jenis_hama', $lahanSelected->jenis_hama ?? [])) ? 'checked' : '' }}>
{{ in_array('Ulat pemakan daun', $jenisHamaOtomatis ?? [], true) ? 'checked' : '' }}>
<label class="form-check-label" for="jenis-hama-bentuk">Ulat pemakan daun</label>
</div>
@@ -210,15 +214,15 @@
name="jenis_hama[]"
value="Tikus"
id="jenis-hama-tikus"
{{ in_array('Tikus', old('jenis_hama', $lahanSelected->jenis_hama ?? [])) ? 'checked' : '' }}>
{{ in_array('Tikus', $jenisHamaOtomatis ?? [], true) ? 'checked' : '' }}>
<label class="form-check-label" for="jenis-hama-bentuk">Tikus</label>
</div>
<small class="text-muted text-secondary">* Tidak diisi, terisi otomatis</small>
<small class="text-muted text-secondary">* Tidak diisi, terisi otomatis di praktik budidaya</small>
@error('jenis_hama')
<div class="error invalid-feedback d-block">{{ $message }}</div>
@enderror
</div>
<div class="col-md-3 mb-4 form-control-validation">
<div class="col-md-3 mb-4 form-control-validation auto-pest-disease-field">
<label class="form-label">Jenis Penyakit</label>
<div class="form-check mt-2">
@@ -227,7 +231,7 @@
name="jenis_penyakit[]"
value="Karat daun"
id="jenis-penyakit-karat-daun"
{{ in_array('Karat daun', old('jenis_penyakit', $lahanSelected->jenis_penyakit ?? [])) ? 'checked' : '' }}
{{ in_array('Karat daun', $jenisPenyakitOtomatis ?? [], true) ? 'checked' : '' }}>
<label class="form-check-label" for="jenis-penyakit-bentuk">Karat daun</label>
</div>
@@ -237,7 +241,7 @@
name="jenis_penyakit[]"
value="Busuk buah/antraknosa"
id="jenis-penyakit-busuk-buah"
{{ in_array('Busuk buah/antraknosa', old('jenis_penyakit', $lahanSelected->jenis_penyakit ?? [])) ? 'checked' : '' }}
{{ in_array('Busuk buah/antraknosa', $jenisPenyakitOtomatis ?? [], true) ? 'checked' : '' }}>
<label class="form-check-label" for="jenis-penyakit-bentuk">Busuk buah/antraknosa</label>
</div>
@@ -247,7 +251,7 @@
name="jenis_penyakit[]"
value="Busuk akar"
id="jenis-penyakit-busuk-akar"
{{ in_array('Busuk akar', old('jenis_penyakit', $lahanSelected->jenis_penyakit ?? [])) ? 'checked' : '' }}
{{ in_array('Busuk akar', $jenisPenyakitOtomatis ?? [], true) ? 'checked' : '' }}>
<label class="form-check-label" for="jenis-penyakit-bentuk">Busuk akar</label>
</div>
@@ -257,7 +261,7 @@
name="jenis_penyakit[]"
value="Bercak daun"
id="jenis-penyakit-bercak-daun"
{{ in_array('Bercak daun', old('jenis_penyakit', $lahanSelected->jenis_penyakit ?? [])) ? 'checked' : '' }}
{{ in_array('Bercak daun', $jenisPenyakitOtomatis ?? [], true) ? 'checked' : '' }}>
<label class="form-check-label" for="jenis-penyakit-bentuk">Bercak daun</label>
</div>
@@ -267,10 +271,10 @@
name="jenis_penyakit[]"
value="Layu fusarium"
id="jenis-penyakit-layu-fusarium"
{{ in_array('Layu fusarium', old('jenis_penyakit', $lahanSelected->jenis_penyakit ?? [])) ? 'checked' : '' }}
{{ in_array('Layu fusarium', $jenisPenyakitOtomatis ?? [], true) ? 'checked' : '' }}>
<label class="form-check-label" for="jenis-penyakit-bentuk">Layu fusarium</label>
</div>
<small class="text-muted text-secondary">* Tidak diisi, terisi otomatis</small>
<small class="text-muted text-secondary">* Tidak diisi, terisi otomatis di Praktik Budidaya</small>
@error('jenis_penyakit')
<div class="error invalid-feedback d-block">{{ $message }}</div>