From e02a34a527576404e1c13364fd1328149a0c26ba Mon Sep 17 00:00:00 2001 From: SyaharaniSalsabilla Date: Wed, 22 Jul 2026 11:58:51 +0700 Subject: [PATCH 01/12] solve lahan & tanaman --- .../Controllers/Web/Produktivitas/PetaniController.php | 4 ++-- .../Web/Produktivitas/PetaniLahanController.php | 10 +++++----- .../views/produktivitas/petani/lahan/add.blade.php | 4 ++-- .../views/produktivitas/petani/lahan/edit.blade.php | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/Http/Controllers/Web/Produktivitas/PetaniController.php b/app/Http/Controllers/Web/Produktivitas/PetaniController.php index 336c77a..30c5cd8 100644 --- a/app/Http/Controllers/Web/Produktivitas/PetaniController.php +++ b/app/Http/Controllers/Web/Produktivitas/PetaniController.php @@ -178,7 +178,7 @@ class PetaniController extends Controller 'created_by' => auth()->id(), 'updated_by' => auth()->id()]); - return redirect()->route('petani.index')->with('success', 'Data petani berhasil ditambahkan.'); + return redirect()->route('petani.edit', $petani->id)->with('success', 'Data petani berhasil ditambahkan.'); } public function show(string $id) @@ -253,7 +253,7 @@ class PetaniController extends Controller $petani->update([...$validatedData, 'updated_by' => auth()->id()]); - return redirect()->route('petani.index')->with('success', 'Data petani berhasil diupdate.'); + return redirect()->route('petani.edit', $petani->id)->with('success', 'Data petani berhasil diupdate.'); } /** diff --git a/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php b/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php index 47f08ee..6598357 100644 --- a/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php +++ b/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php @@ -224,15 +224,15 @@ class PetaniLahanController extends Controller if ($request->ajax()) { return response()->json([ 'success' => true, - 'redirect' => route('petani.lahan-tanaman.index', $petaniId), + 'redirect' => route('petani.lahan-tanaman.edit', [$petaniId, $lahan->id]), 'message' => 'Lahan berhasil ditambahkan.' ]); } - return redirect()->route('petani.lahan-tanaman.index', $petaniId)->with('success', 'Lahan berhasil ditambahkan.'); + return redirect()->route('petani.lahan-tanaman.edit', [$petaniId, $lahan->id])->with('success', 'Lahan berhasil ditambahkan.'); } - return redirect()->route('petani.lahan-tanaman.index', $petaniId)->with('success', 'Lahan berhasil ditambahkan.'); + return redirect()->route('petani.lahan-tanaman.edit', [$petaniId, $lahan->id])->with('success', 'Lahan berhasil ditambahkan.'); } public function show(string $petaniId, string $id) @@ -371,12 +371,12 @@ class PetaniLahanController extends Controller if ($request->ajax()) { return response()->json([ 'success' => true, - 'redirect' => route('petani.lahan-tanaman.index', $petaniId), + 'redirect' => route('petani.lahan-tanaman.edit', [$petaniId, $lahan->id]), 'message' => 'Lahan berhasil diupdate.' ]); } - return redirect()->route('petani.lahan-tanaman.index', $petaniId)->with('success', 'Lahan berhasil diperbarui.'); + return redirect()->route('petani.lahan-tanaman.edit', [$petaniId, $lahan->id])->with('success', 'Lahan berhasil diperbarui.'); } public function destroy(string $id) diff --git a/resources/views/produktivitas/petani/lahan/add.blade.php b/resources/views/produktivitas/petani/lahan/add.blade.php index 2f0e8a5..8f3fc2e 100644 --- a/resources/views/produktivitas/petani/lahan/add.blade.php +++ b/resources/views/produktivitas/petani/lahan/add.blade.php @@ -833,7 +833,7 @@ showConfirmButton: false, timer: 1500 }).then(() => { - window.location.href = "{{ route('petani.index') }}"; + window.location.href = res.redirect || window.location.href; }); }, error: function(xhr) { @@ -870,4 +870,4 @@ }); }); -@endpush \ No newline at end of file +@endpush diff --git a/resources/views/produktivitas/petani/lahan/edit.blade.php b/resources/views/produktivitas/petani/lahan/edit.blade.php index 391dd8e..c8c42d4 100644 --- a/resources/views/produktivitas/petani/lahan/edit.blade.php +++ b/resources/views/produktivitas/petani/lahan/edit.blade.php @@ -900,7 +900,7 @@ showConfirmButton: false, timer: 1500 }).then(() => { - window.location.href = "{{ route('petani.index') }}"; + window.location.href = res.redirect || window.location.href; }); }, error: function(xhr) { @@ -941,4 +941,4 @@ initKomoditas(); }); -@endpush \ No newline at end of file +@endpush From 4c66d72dc5e52c12963f3ce772f860f7a2ed4d61 Mon Sep 17 00:00:00 2001 From: SyaharaniSalsabilla Date: Wed, 22 Jul 2026 13:27:35 +0700 Subject: [PATCH 02/12] solve praktik budidaya --- .../PraktikBudidayaController.php | 49 ++++++-- .../SurveyProduktivitasController.php | 17 ++- .../petani/praktik-budidaya/add.blade.php | 82 ++++++++++++- .../petani/praktik-budidaya/edit.blade.php | 114 ++++++++++++++++-- 4 files changed, 238 insertions(+), 24 deletions(-) diff --git a/app/Http/Controllers/Web/Produktivitas/PraktikBudidayaController.php b/app/Http/Controllers/Web/Produktivitas/PraktikBudidayaController.php index a58d729..8e9aa16 100644 --- a/app/Http/Controllers/Web/Produktivitas/PraktikBudidayaController.php +++ b/app/Http/Controllers/Web/Produktivitas/PraktikBudidayaController.php @@ -178,8 +178,14 @@ class PraktikBudidayaController extends Controller $teknik_pemangkasan = array_values($teknik_pemangkasan); + if ((int) ($validatedData['frekuensi_pemangkasan_komoditas_utama'] ?? 0) === FrekuensiPemangkasanUtama::TIDAK_PERNAH->value) { + $teknik_pemangkasan = []; + } + $petani = Petani::findOrFail($petaniId); + $pemupukanTidakPernah = (int) ($validatedData['pemberian_pupuk'] ?? 0) === PemberianPupuk::TIDAK_PERNAH->value; + $praktikBudidaya = $petani->praktikBudidaya()->create([ 'petani_id' => $petani->id, 'uid' => 'PB-' . strtoupper(Str::random(10)), @@ -193,12 +199,12 @@ class PraktikBudidayaController extends Controller 'deskripsi_penyerbukan_manual' => $validatedData['alasan_tidak_penyerbukan'] ?? null, 'tingkat_keberhasilan_penyerbukan' => $validatedData['tingkat_keberhasilan_penyerbukan'] ?? null, 'pemberian_pupuk' => $validatedData['pemberian_pupuk'] ?? null, - 'jenis_pupuk' => $validatedData['jenis_pupuk'] ?? null, - 'frekuensi_pemberian_pupuk' => ($validatedData['frekuensi_pemupukan'] ?? null) === 'Lainnya' ? ($validatedData['frekuensi_pemupukan_lainnya'] ?? null) : ($validatedData['frekuensi_pemupukan'] ?? null), - 'estimasi_dosis_pupuk_organik' => $validatedData['estimasi_dosis_pupuk_organik'] ?? null, - 'estimasi_dosis_pupuk_anorganik' => $validatedData['estimasi_dosis_pupuk_anorganik'] ?? null, - 'waktu_pemberian_pupuk' => ($validatedData['waktu_pemberian_pupuk'] ?? null) === 'Lainnya' ? ($validatedData['waktu_pemberian_pupuk_lainnya'] ?? null) : ($validatedData['waktu_pemberian_pupuk'] ?? null), - 'cara_pemberian_pupuk' => ($validatedData['cara_pemberian_pupuk'] ?? null) === 'Lainnya' ? ($validatedData['cara_pemberian_pupuk_lainnya'] ?? null) : ($validatedData['cara_pemberian_pupuk'] ?? null), + 'jenis_pupuk' => $pemupukanTidakPernah ? null : ($validatedData['jenis_pupuk'] ?? null), + 'frekuensi_pemberian_pupuk' => $pemupukanTidakPernah ? null : (($validatedData['frekuensi_pemupukan'] ?? null) === 'Lainnya' ? ($validatedData['frekuensi_pemupukan_lainnya'] ?? null) : ($validatedData['frekuensi_pemupukan'] ?? null)), + 'estimasi_dosis_pupuk_organik' => $pemupukanTidakPernah ? null : ($validatedData['estimasi_dosis_pupuk_organik'] ?? null), + 'estimasi_dosis_pupuk_anorganik' => $pemupukanTidakPernah ? null : ($validatedData['estimasi_dosis_pupuk_anorganik'] ?? null), + 'waktu_pemberian_pupuk' => $pemupukanTidakPernah ? null : (($validatedData['waktu_pemberian_pupuk'] ?? null) === 'Lainnya' ? ($validatedData['waktu_pemberian_pupuk_lainnya'] ?? null) : ($validatedData['waktu_pemberian_pupuk'] ?? null)), + 'cara_pemberian_pupuk' => $pemupukanTidakPernah ? null : (($validatedData['cara_pemberian_pupuk'] ?? null) === 'Lainnya' ? ($validatedData['cara_pemberian_pupuk_lainnya'] ?? null) : ($validatedData['cara_pemberian_pupuk'] ?? null)), 'created_by' => auth()->id(), 'updated_by' => auth()->id(), ], [ @@ -554,6 +560,12 @@ class PraktikBudidayaController extends Controller } } $teknikPemangkasan = array_values($teknik_pemangkasan); + + if ((int) ($validatedData['frekuensi_pemangkasan_komoditas_utama'] ?? 0) === FrekuensiPemangkasanUtama::TIDAK_PERNAH->value) { + $teknikPemangkasan = []; + } + + $pemupukanTidakPernah = (int) ($validatedData['pemberian_pupuk'] ?? 0) === PemberianPupuk::TIDAK_PERNAH->value; $dataPraktikBudidaya = [ 'tenaga_kerja' => $validatedData['tenaga_kerja'], @@ -566,12 +578,12 @@ class PraktikBudidayaController extends Controller 'deskripsi_penyerbukan_manual' => $validatedData['alasan_tidak_penyerbukan'] ?? null, 'tingkat_keberhasilan_penyerbukan' => $validatedData['tingkat_keberhasilan_penyerbukan'] ?? null, 'pemberian_pupuk' => $validatedData['pemberian_pupuk'] ?? null, - 'jenis_pupuk' => $validatedData['jenis_pupuk'] ?? null, - 'frekuensi_pemberian_pupuk' => ($validatedData['frekuensi_pemupukan'] ?? null) === 'Lainnya' ? ($validatedData['frekuensi_pemupukan_lainnya'] ?? null) : ($validatedData['frekuensi_pemupukan'] ?? null), - 'estimasi_dosis_pupuk_organik' => $validatedData['estimasi_dosis_pupuk_organik'] ?? null, - 'estimasi_dosis_pupuk_anorganik' => $validatedData['estimasi_dosis_pupuk_anorganik'] ?? null, - 'waktu_pemberian_pupuk' => ($validatedData['waktu_pemberian_pupuk'] ?? null) === 'Lainnya' ? ($validatedData['waktu_pemberian_pupuk_lainnya'] ?? null) : ($validatedData['waktu_pemberian_pupuk'] ?? null), - 'cara_pemberian_pupuk' => ($validatedData['cara_pemberian_pupuk'] ?? null) === 'Lainnya' ? ($validatedData['cara_pemberian_pupuk_lainnya'] ?? null) : ($validatedData['cara_pemberian_pupuk'] ?? null), + 'jenis_pupuk' => $pemupukanTidakPernah ? null : ($validatedData['jenis_pupuk'] ?? null), + 'frekuensi_pemberian_pupuk' => $pemupukanTidakPernah ? null : (($validatedData['frekuensi_pemupukan'] ?? null) === 'Lainnya' ? ($validatedData['frekuensi_pemupukan_lainnya'] ?? null) : ($validatedData['frekuensi_pemupukan'] ?? null)), + 'estimasi_dosis_pupuk_organik' => $pemupukanTidakPernah ? null : ($validatedData['estimasi_dosis_pupuk_organik'] ?? null), + 'estimasi_dosis_pupuk_anorganik' => $pemupukanTidakPernah ? null : ($validatedData['estimasi_dosis_pupuk_anorganik'] ?? null), + 'waktu_pemberian_pupuk' => $pemupukanTidakPernah ? null : (($validatedData['waktu_pemberian_pupuk'] ?? null) === 'Lainnya' ? ($validatedData['waktu_pemberian_pupuk_lainnya'] ?? null) : ($validatedData['waktu_pemberian_pupuk'] ?? null)), + 'cara_pemberian_pupuk' => $pemupukanTidakPernah ? null : (($validatedData['cara_pemberian_pupuk'] ?? null) === 'Lainnya' ? ($validatedData['cara_pemberian_pupuk_lainnya'] ?? null) : ($validatedData['cara_pemberian_pupuk'] ?? null)), ]; } @@ -675,6 +687,17 @@ class PraktikBudidayaController extends Controller } } - return back()->with('success', 'Data berhasil diperbarui.'); + return $this->redirectBackToFragment($request)->with('success', 'Data berhasil diperbarui.'); + } + + private function redirectBackToFragment(Request $request) + { + $fragment = $request->input('redirect_fragment'); + + if (!is_string($fragment) || !preg_match('/^[A-Za-z0-9_-]+$/', $fragment)) { + return back(); + } + + return redirect()->to(Str::before(url()->previous(), '#') . '#' . $fragment); } } diff --git a/app/Http/Controllers/Web/Produktivitas/SurveyProduktivitasController.php b/app/Http/Controllers/Web/Produktivitas/SurveyProduktivitasController.php index 037a638..3c15d3a 100644 --- a/app/Http/Controllers/Web/Produktivitas/SurveyProduktivitasController.php +++ b/app/Http/Controllers/Web/Produktivitas/SurveyProduktivitasController.php @@ -32,10 +32,10 @@ class SurveyProduktivitasController extends Controller ]); } - return back()->with('success', 'Data produktivitas berhasil disimpan.'); + return $this->redirectBackToFragment($request)->with('success', 'Data produktivitas berhasil disimpan.'); } - public function destroy($petaniId, $surveyProduktivitasId) + public function destroy($petaniId, $surveyProduktivitasId, Request $request) { $surveyProduktivitas = SurveyProduktivitas::where('petani_id', $petaniId) ->where('id', $surveyProduktivitasId) @@ -44,6 +44,17 @@ class SurveyProduktivitasController extends Controller $surveyProduktivitas->save(); $surveyProduktivitas->delete(); - return back()->with('success', 'Data produktivitas berhasil dihapus.'); + return $this->redirectBackToFragment($request)->with('success', 'Data produktivitas berhasil dihapus.'); + } + + private function redirectBackToFragment(Request $request) + { + $fragment = $request->input('redirect_fragment'); + + if (!is_string($fragment) || !preg_match('/^[A-Za-z0-9_-]+$/', $fragment)) { + return back(); + } + + return redirect()->to(Str::before(url()->previous(), '#') . '#' . $fragment); } } diff --git a/resources/views/produktivitas/petani/praktik-budidaya/add.blade.php b/resources/views/produktivitas/petani/praktik-budidaya/add.blade.php index a942274..30d012f 100644 --- a/resources/views/produktivitas/petani/praktik-budidaya/add.blade.php +++ b/resources/views/produktivitas/petani/praktik-budidaya/add.blade.php @@ -517,6 +517,57 @@ $(document).ready(function () { $('#tenaga-kerja, #frekuensi-pemangkasan-komoditas-utama, #frekuensi-pemangkasan-pohon-penaung, #penyerbukan-manual, #pemberian-pupuk, #jenis-pupuk').select2(); + + function syncTeknikPemangkasanState() { + const tidakPernahMemangkas = $('#frekuensi-pemangkasan-komoditas-utama').val() === '{{ \App\Enums\PraktikBudidaya\FrekuensiPemangkasanUtama::TIDAK_PERNAH->value }}'; + const $teknikInputs = $('input[name="teknik_pemangkasan[]"]'); + const $lainnyaInput = $('#input-teknik-pemangkasan-lainnya'); + + $teknikInputs + .prop('disabled', tidakPernahMemangkas) + .closest('.form-check') + .toggleClass('opacity-50', tidakPernahMemangkas); + + if (tidakPernahMemangkas) { + $teknikInputs.prop('checked', false); + $lainnyaInput.val(''); + } + + $lainnyaInput.prop('disabled', tidakPernahMemangkas || !$('#teknik-pemangkasan-lainnya').is(':checked')); + } + + $('#frekuensi-pemangkasan-komoditas-utama, #teknik-pemangkasan-lainnya').on('change select2:select select2:clear', syncTeknikPemangkasanState); + syncTeknikPemangkasanState(); + + function syncPemupukanState() { + const tidakPernahMemberiPupuk = $('#pemberian-pupuk').val() === '{{ \App\Enums\PraktikBudidaya\PemberianPupuk::TIDAK_PERNAH->value }}'; + const $pemupukanFields = $( + '#jenis-pupuk, ' + + 'input[name="frekuensi_pemupukan"], #input-frekuensi-pemupukan-lainnya, ' + + '#estimasi-dosis-pupuk-organik, #estimasi-dosis-pupuk-anorganik, ' + + 'input[name="waktu_pemberian_pupuk"], #input-waktu-pemberian-pupuk-lainnya, ' + + 'input[name="cara_pemberian_pupuk"], #input-cara-pemberian-pupuk-lainnya' + ); + + $pemupukanFields + .prop('disabled', tidakPernahMemberiPupuk) + .closest('.form-check, .form-control-validation') + .toggleClass('opacity-50', tidakPernahMemberiPupuk); + + if (tidakPernahMemberiPupuk) { + $('#jenis-pupuk').val('').trigger('change.select2'); + $('input[name="frekuensi_pemupukan"], input[name="waktu_pemberian_pupuk"], input[name="cara_pemberian_pupuk"]').prop('checked', false); + $('#input-frekuensi-pemupukan-lainnya, #estimasi-dosis-pupuk-organik, #estimasi-dosis-pupuk-anorganik, #input-waktu-pemberian-pupuk-lainnya, #input-cara-pemberian-pupuk-lainnya').val(''); + } else { + $('#input-frekuensi-pemupukan-lainnya').prop('disabled', !$('input[data-target="#input-frekuensi-pemupukan-lainnya"]').is(':checked')); + $('#input-waktu-pemberian-pupuk-lainnya').prop('disabled', !$('input[data-target="#input-waktu-pemberian-pupuk-lainnya"]').is(':checked')); + $('#input-cara-pemberian-pupuk-lainnya').prop('disabled', !$('input[data-target="#input-cara-pemberian-pupuk-lainnya"]').is(':checked')); + } + } + + $('#pemberian-pupuk').on('change select2:select select2:clear', syncPemupukanState); + syncPemupukanState(); + setTimeout(syncPemupukanState, 0); const $switch = $('input[name="disimpan_untuk_diri_sendiri"]'); const $text = $('#switch-text'); @@ -636,6 +687,35 @@ trigger.addEventListener('change', toggleInput); toggleInput(); }); + + const frekuensiPemangkasan = document.getElementById('frekuensi-pemangkasan-komoditas-utama'); + const teknikPemangkasanInputs = document.querySelectorAll('input[name="teknik_pemangkasan[]"]'); + const teknikPemangkasanLainnya = document.getElementById('input-teknik-pemangkasan-lainnya'); + + function toggleTeknikPemangkasan() { + const tidakPernahMemangkas = frekuensiPemangkasan && frekuensiPemangkasan.value === '{{ \App\Enums\PraktikBudidaya\FrekuensiPemangkasanUtama::TIDAK_PERNAH->value }}'; + + teknikPemangkasanInputs.forEach(function (input) { + input.disabled = tidakPernahMemangkas; + input.closest('.form-check')?.classList.toggle('opacity-50', tidakPernahMemangkas); + + if (tidakPernahMemangkas) { + input.checked = false; + } + }); + + if (teknikPemangkasanLainnya) { + teknikPemangkasanLainnya.disabled = tidakPernahMemangkas || !document.getElementById('teknik-pemangkasan-lainnya')?.checked; + + if (tidakPernahMemangkas) { + teknikPemangkasanLainnya.value = ''; + } + } + } + + frekuensiPemangkasan?.addEventListener('change', toggleTeknikPemangkasan); + document.getElementById('teknik-pemangkasan-lainnya')?.addEventListener('change', toggleTeknikPemangkasan); + toggleTeknikPemangkasan(); }); -@endpush \ No newline at end of file +@endpush diff --git a/resources/views/produktivitas/petani/praktik-budidaya/edit.blade.php b/resources/views/produktivitas/petani/praktik-budidaya/edit.blade.php index 7e27e1b..d7dbc0f 100644 --- a/resources/views/produktivitas/petani/praktik-budidaya/edit.blade.php +++ b/resources/views/produktivitas/petani/praktik-budidaya/edit.blade.php @@ -39,7 +39,8 @@
@csrf @method('PUT') -
+ +
Persiapan Lahan & Tanaman
@@ -541,8 +542,9 @@ @csrf @method('PUT') + -
+
Pengendalian Organisme Pengganggu Tumbuhan (OPT)
@@ -1048,7 +1050,8 @@ @csrf @method('PUT') -
+ +
Struktur Biaya Produksi Permusim
@@ -1360,7 +1363,8 @@ @csrf @method('PUT') -
+ +
Penanganan Awal Setelah Panen
@@ -1546,7 +1550,7 @@
-
+
Produktivitas Rata-rata 3 Musim Panen Terakhir per Komoditas @@ -1579,6 +1583,7 @@
@csrf @method('DELETE') + @@ -1593,6 +1598,7 @@ action="{{ route('petani.survey-produktivitas.store', $petani->id) }}" class="form-repeater"> @csrf +
@@ -1657,7 +1663,8 @@ @csrf @method('PUT') -
+ +
Kehilangan Hasil Akibat Organisme Pengganggu Tumbuhan (OPT)
@@ -1706,12 +1713,76 @@
@endsection +@push('scripts-head') + +@endpush + @push('scripts') -@endpush \ No newline at end of file +@endpush From 5967e7d6f316f9389f4354a964918ffa0cf736fa Mon Sep 17 00:00:00 2001 From: SyaharaniSalsabilla Date: Wed, 22 Jul 2026 13:28:58 +0700 Subject: [PATCH 03/12] solve pendidikan & pelatihan --- .../PendidikanPelatihanController.php | 29 ++++++++++++++----- .../pendidikan-pelatihan/index.blade.php | 17 ++++++++--- 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/app/Http/Controllers/Web/Produktivitas/PendidikanPelatihanController.php b/app/Http/Controllers/Web/Produktivitas/PendidikanPelatihanController.php index 18daa53..61515d2 100644 --- a/app/Http/Controllers/Web/Produktivitas/PendidikanPelatihanController.php +++ b/app/Http/Controllers/Web/Produktivitas/PendidikanPelatihanController.php @@ -77,10 +77,11 @@ class PendidikanPelatihanController extends Controller ]); } - return back()->with('success', 'Riwayat pelatihan berhasil disimpan.'); + return $this->redirectBackToFragment($request, 'section-sertifikasi') + ->with('success', 'Riwayat pelatihan berhasil disimpan.'); } - public function destroyPelatihan(Petani $petani, SurveyPelatihan $surveyPelatihan) + public function destroyPelatihan(Request $request, Petani $petani, SurveyPelatihan $surveyPelatihan) { $this->authorizeAccess(); @@ -92,7 +93,8 @@ class PendidikanPelatihanController extends Controller $surveyPelatihan->delete(); - return back()->with('success', 'Riwayat pelatihan berhasil dihapus.'); + return $this->redirectBackToFragment($request, 'section-pelatihan') + ->with('success', 'Riwayat pelatihan berhasil dihapus.'); } public function storeSertifikasi(Request $request, Petani $petani) @@ -155,10 +157,11 @@ class PendidikanPelatihanController extends Controller ]); } - return back()->with('success', 'Sertifikasi berhasil disimpan.'); + return $this->redirectBackToFragment($request, 'section-sertifikasi') + ->with('success', 'Sertifikasi berhasil disimpan.'); } - public function destroySertifikasi(Petani $petani, SurveySertifikasi $surveySertifikasi) + public function destroySertifikasi(Request $request, Petani $petani, SurveySertifikasi $surveySertifikasi) { $this->authorizeAccess(); @@ -170,6 +173,18 @@ class PendidikanPelatihanController extends Controller $surveySertifikasi->delete(); - return back()->with('success', 'Sertifikasi berhasil dihapus.'); + return $this->redirectBackToFragment($request, 'section-sertifikasi') + ->with('success', 'Sertifikasi berhasil dihapus.'); } -} \ No newline at end of file + + private function redirectBackToFragment(Request $request, string $defaultFragment) + { + $fragment = $request->input('redirect_fragment', $defaultFragment); + + if (!is_string($fragment) || !preg_match('/^[A-Za-z0-9_-]+$/', $fragment)) { + $fragment = $defaultFragment; + } + + return redirect()->to(Str::before(url()->previous(), '#') . '#' . $fragment); + } +} diff --git a/resources/views/produktivitas/petani/pendidikan-pelatihan/index.blade.php b/resources/views/produktivitas/petani/pendidikan-pelatihan/index.blade.php index 6b2e4c5..a5e486d 100644 --- a/resources/views/produktivitas/petani/pendidikan-pelatihan/index.blade.php +++ b/resources/views/produktivitas/petani/pendidikan-pelatihan/index.blade.php @@ -29,6 +29,11 @@ white-space: nowrap !important; line-height: 1.5 !important; } + + #section-pelatihan, + #section-sertifikasi { + scroll-margin-top: 96px; + } @endpush @@ -51,7 +56,7 @@
@include('produktivitas.petani.header', ['petani' => $petani]) -
+
Riwayat Pelatihan @@ -83,6 +88,7 @@ class="delete-db-form"> @csrf @method('DELETE') +
@@ -1017,7 +1018,7 @@ showConfirmButton: false, timer: 1500 }).then(() => { - window.location.href = "{{ route('petani.index') }}"; + window.location.href = "{{ route('petani.lahan-tanaman.index', ['petani' => $petani->id]) }}"; }); }, error: function(xhr) { @@ -1054,6 +1055,29 @@ } }); + $('#delete-lahan').click(function(e) { + e.preventDefault(); + $.ajax({ + url: "{{ route('petani.lahan-tanaman.destroy', ['petani' => $petani->id, 'lahan_tanaman' => $lahanSelected->id]) }}", + type: "POST", + data: { + _method: 'DELETE', + _token: $('input[name="_token"]').val() + }, + success: function(res) { + Swal.fire({ + icon: 'success', + title: 'Berhasil!', + text: 'Data lahan berhasil dihapus.', + showConfirmButton: false, + timer: 1500 + }).then(() => { + window.location.href = "{{ route('petani.lahan-tanaman.index', ['petani' => $petani->id]) }}"; + }); + } + }); + }); + initWilayah(); initKomoditas(); }); From 9576c6295e0236584a26fc1e8e94056954e5e655 Mon Sep 17 00:00:00 2001 From: SyaharaniSalsabilla Date: Wed, 22 Jul 2026 14:41:05 +0700 Subject: [PATCH 06/12] solve sosial ekonomi --- .../Produktivitas/SosialEkonomiController.php | 26 ++++++- .../petani/sosial-ekonomi/edit.blade.php | 78 ++++++++++++++++++- .../petani/sosial-ekonomi/index.blade.php | 78 ++++++++++++++++++- 3 files changed, 176 insertions(+), 6 deletions(-) diff --git a/app/Http/Controllers/Web/Produktivitas/SosialEkonomiController.php b/app/Http/Controllers/Web/Produktivitas/SosialEkonomiController.php index 2db7af1..a54498f 100644 --- a/app/Http/Controllers/Web/Produktivitas/SosialEkonomiController.php +++ b/app/Http/Controllers/Web/Produktivitas/SosialEkonomiController.php @@ -154,8 +154,7 @@ class SosialEkonomiController extends Controller }); if (!$request->expectsJson()) { - return redirect() - ->route('petani.sosial-ekonomi.edit', [$sosialEkonomi->petani_id, $sosialEkonomi->id]) + return $this->redirectToEditSection($sosialEkonomi, $request) ->with('success', 'Data sosial ekonomi berhasil disimpan.'); } @@ -206,8 +205,7 @@ class SosialEkonomiController extends Controller }); if (!$request->expectsJson()) { - return redirect() - ->route('petani.sosial-ekonomi.edit', [$sosialEkonomi->petani_id, $sosialEkonomi->id]) + return $this->redirectToEditSection($sosialEkonomi, $request) ->with('success', 'Data sosial ekonomi berhasil diperbarui.'); } @@ -218,6 +216,18 @@ class SosialEkonomiController extends Controller ]); } + private function redirectToEditSection(SosialEkonomi $sosialEkonomi, Request $request): RedirectResponse + { + $url = route('petani.sosial-ekonomi.edit', [$sosialEkonomi->petani_id, $sosialEkonomi->id]); + $fragment = $request->input('redirect_fragment'); + + if (is_string($fragment) && preg_match('/^[A-Za-z0-9_-]+$/', $fragment)) { + $url .= '#' . $fragment; + } + + return redirect()->to($url); + } + public function destroy(string $id): JsonResponse { $sosialEkonomi = SosialEkonomi::findOrFail($id); @@ -589,6 +599,14 @@ class SosialEkonomiController extends Controller $payload = $this->normalizeSkorPayload($payload); + if (array_key_exists('ada_sengketa', $payload) && !filter_var($payload['ada_sengketa'], FILTER_VALIDATE_BOOLEAN)) { + $payload['keterangan_sengketa'] = null; + $payload['pihak_membantu_konflik'] = null; + $payload['pihak_membantu_konflik_nama'] = null; + $payload['tahun_bantuan_konflik'] = null; + $payload['status_konflik'] = null; + } + if (($payload['pihak_membantu_konflik'] ?? null) === PihakMembantuKonflik::TIDAK_ADA_SELESAIKAN_SENDIRI->value) { $payload['pihak_membantu_konflik_nama'] = null; $payload['tahun_bantuan_konflik'] = null; diff --git a/resources/views/produktivitas/petani/sosial-ekonomi/edit.blade.php b/resources/views/produktivitas/petani/sosial-ekonomi/edit.blade.php index 521563b..d5cb7ae 100644 --- a/resources/views/produktivitas/petani/sosial-ekonomi/edit.blade.php +++ b/resources/views/produktivitas/petani/sosial-ekonomi/edit.blade.php @@ -1,5 +1,17 @@ @extends('layout.main') +@push('scripts-head') + +@endpush + @section('content')
@if (session('success')) @@ -1062,6 +1074,20 @@ const pinjamanTokohAdatAda = @json($pinjamanTokohAdatAdaValue); const tekananJualSegeraAda = @json($tekananJualSegeraAdaValue); const kebebasanMemilihPembeliCukupBebas = Number(@json($kebebasanMemilihPembeliCukupBebasValue)); + const sectionAnchors = { + utama: 'section-utama', + sosial_budaya: 'section-sosial-budaya', + keanggotaan_kelompok: 'section-keanggotaan-kelompok', + akses_keuangan: 'section-akses-keuangan', + keterikatan_hutang: 'section-keterikatan-hutang' + }; + const nextSectionAnchors = { + utama: 'section-sosial-budaya', + sosial_budaya: 'section-keanggotaan-kelompok', + keanggotaan_kelompok: 'section-akses-keuangan', + akses_keuangan: 'section-keterikatan-hutang', + keterikatan_hutang: 'section-keterikatan-hutang' + }; const fieldExamples = { jumlah_tanggungan: 'Contoh: 4', anak_masih_sekolah: 'Contoh: 2', @@ -1399,7 +1425,8 @@ } function syncPihakMembantuFields() { - const isTidakAda = $('#pihak-membantu').val() === pihakMembantuTanpaBantuan; + const isAdaSengketa = $('input[name="ada_sengketa"]:checked').val() === '1'; + const isTidakAda = !isAdaSengketa || $('#pihak-membantu').val() === pihakMembantuTanpaBantuan; const $fields = $('#pihak-membantu-nama, #tahun-bantuan'); $fields.prop('disabled', isTidakAda); @@ -1409,6 +1436,21 @@ } } + function syncSengketaFields() { + const isAdaSengketa = $('input[name="ada_sengketa"]:checked').val() === '1'; + const $fields = $('#keterangan-sengketa, #pihak-membantu, #status-konflik'); + const $assistanceFields = $('#pihak-membantu-nama, #tahun-bantuan'); + + $fields.prop('disabled', !isAdaSengketa); + + if (!isAdaSengketa) { + $fields.add($assistanceFields).val(''); + $fields.filter('select').trigger('change.select2'); + } + + syncPihakMembantuFields(); + } + function syncPernahJualHargaLebihTinggiFields() { const isPernah = $('#pernah-jual-harga-lebih-tinggi').val() === pernahJualHargaLebihTinggiPernah; const $field = $('#penyebab-harga-lebih-tinggi'); @@ -1601,6 +1643,37 @@ clearPendapatanRowValidation($row); } + function setupSectionAnchors() { + $('input[name="form_section"]').each(function () { + const section = this.value; + const anchor = sectionAnchors[section]; + const nextAnchor = nextSectionAnchors[section] || anchor; + const $form = $(this).closest('form'); + + if (anchor) { + $form.find('> .card').first().attr('id', anchor); + } + + if (nextAnchor && !$form.find('input[name="redirect_fragment"]').length) { + $('', { + type: 'hidden', + name: 'redirect_fragment', + value: nextAnchor + }).appendTo($form); + } + }); + + if (window.location.hash) { + const target = document.getElementById(window.location.hash.substring(1)); + + if (target) { + setTimeout(function () { + target.scrollIntoView({ block: 'start' }); + }, 0); + } + } + } + $(document).on('change', '.sosial-ekonomi-komoditas-utama', syncKomoditasLainnyaOptions); $(document).on('input change', '.pendapatan-row input, .pendapatan-row select', function () { clearPendapatanRowValidation($(this).closest('.pendapatan-row')); @@ -1636,6 +1709,7 @@ }); }); $('#pihak-membantu').on('change', syncPihakMembantuFields); + $('input[name="ada_sengketa"]').on('change', syncSengketaFields); $('#pernah-jual-harga-lebih-tinggi').on('change', syncPernahJualHargaLebihTinggiFields); $('input[name="panutan_petani_sukses"]').on('change', syncPanutanFields); $('input[name="terdaftar_kelompok_tani"]').on('change', syncTerdaftarKelompokFields); @@ -1650,10 +1724,12 @@ $('#total-hutang-tidak-bersedia').on('change', syncTotalHutangFields); $('input[name="tekanan_jual_segera"]').on('change', syncTekananJualFields); $('input[name="kebebasan_memilih_pembeli"]').on('change', syncKebebasanPembeliFields); + setupSectionAnchors(); applySosialEkonomiExamples(); syncKomoditasLainnyaOptions(); setupAllPendapatanRows(); syncPihakMembantuFields(); + syncSengketaFields(); syncPernahJualHargaLebihTinggiFields(); syncPanutanFields(); syncTerdaftarKelompokFields(); diff --git a/resources/views/produktivitas/petani/sosial-ekonomi/index.blade.php b/resources/views/produktivitas/petani/sosial-ekonomi/index.blade.php index 22fc8e3..b136076 100644 --- a/resources/views/produktivitas/petani/sosial-ekonomi/index.blade.php +++ b/resources/views/produktivitas/petani/sosial-ekonomi/index.blade.php @@ -1,5 +1,17 @@ @extends('layout.main') +@push('scripts-head') + +@endpush + @section('content')
@if (session('success')) @@ -1058,6 +1070,20 @@ const pinjamanTokohAdatAda = @json($pinjamanTokohAdatAdaValue); const tekananJualSegeraAda = @json($tekananJualSegeraAdaValue); const kebebasanMemilihPembeliCukupBebas = Number(@json($kebebasanMemilihPembeliCukupBebasValue)); + const sectionAnchors = { + utama: 'section-utama', + sosial_budaya: 'section-sosial-budaya', + keanggotaan_kelompok: 'section-keanggotaan-kelompok', + akses_keuangan: 'section-akses-keuangan', + keterikatan_hutang: 'section-keterikatan-hutang' + }; + const nextSectionAnchors = { + utama: 'section-sosial-budaya', + sosial_budaya: 'section-keanggotaan-kelompok', + keanggotaan_kelompok: 'section-akses-keuangan', + akses_keuangan: 'section-keterikatan-hutang', + keterikatan_hutang: 'section-keterikatan-hutang' + }; const fieldExamples = { jumlah_tanggungan: 'Contoh: 4', anak_masih_sekolah: 'Contoh: 2', @@ -1395,7 +1421,8 @@ } function syncPihakMembantuFields() { - const isTidakAda = $('#pihak-membantu').val() === pihakMembantuTanpaBantuan; + const isAdaSengketa = $('input[name="ada_sengketa"]:checked').val() === '1'; + const isTidakAda = !isAdaSengketa || $('#pihak-membantu').val() === pihakMembantuTanpaBantuan; const $fields = $('#pihak-membantu-nama, #tahun-bantuan'); $fields.prop('disabled', isTidakAda); @@ -1405,6 +1432,21 @@ } } + function syncSengketaFields() { + const isAdaSengketa = $('input[name="ada_sengketa"]:checked').val() === '1'; + const $fields = $('#keterangan-sengketa, #pihak-membantu, #status-konflik'); + const $assistanceFields = $('#pihak-membantu-nama, #tahun-bantuan'); + + $fields.prop('disabled', !isAdaSengketa); + + if (!isAdaSengketa) { + $fields.add($assistanceFields).val(''); + $fields.filter('select').trigger('change.select2'); + } + + syncPihakMembantuFields(); + } + function syncPernahJualHargaLebihTinggiFields() { const isPernah = $('#pernah-jual-harga-lebih-tinggi').val() === pernahJualHargaLebihTinggiPernah; const $field = $('#penyebab-harga-lebih-tinggi'); @@ -1597,6 +1639,37 @@ clearPendapatanRowValidation($row); } + function setupSectionAnchors() { + $('input[name="form_section"]').each(function () { + const section = this.value; + const anchor = sectionAnchors[section]; + const nextAnchor = nextSectionAnchors[section] || anchor; + const $form = $(this).closest('form'); + + if (anchor) { + $form.find('> .card').first().attr('id', anchor); + } + + if (nextAnchor && !$form.find('input[name="redirect_fragment"]').length) { + $('', { + type: 'hidden', + name: 'redirect_fragment', + value: nextAnchor + }).appendTo($form); + } + }); + + if (window.location.hash) { + const target = document.getElementById(window.location.hash.substring(1)); + + if (target) { + setTimeout(function () { + target.scrollIntoView({ block: 'start' }); + }, 0); + } + } + } + $(document).on('change', '.sosial-ekonomi-komoditas-utama', syncKomoditasLainnyaOptions); $(document).on('input change', '.pendapatan-row input, .pendapatan-row select', function () { clearPendapatanRowValidation($(this).closest('.pendapatan-row')); @@ -1632,6 +1705,7 @@ }); }); $('#pihak-membantu').on('change', syncPihakMembantuFields); + $('input[name="ada_sengketa"]').on('change', syncSengketaFields); $('#pernah-jual-harga-lebih-tinggi').on('change', syncPernahJualHargaLebihTinggiFields); $('input[name="panutan_petani_sukses"]').on('change', syncPanutanFields); $('input[name="terdaftar_kelompok_tani"]').on('change', syncTerdaftarKelompokFields); @@ -1646,10 +1720,12 @@ $('#total-hutang-tidak-bersedia').on('change', syncTotalHutangFields); $('input[name="tekanan_jual_segera"]').on('change', syncTekananJualFields); $('input[name="kebebasan_memilih_pembeli"]').on('change', syncKebebasanPembeliFields); + setupSectionAnchors(); applySosialEkonomiExamples(); syncKomoditasLainnyaOptions(); setupAllPendapatanRows(); syncPihakMembantuFields(); + syncSengketaFields(); syncPernahJualHargaLebihTinggiFields(); syncPanutanFields(); syncTerdaftarKelompokFields(); From a5884d0f8c2b7112997e438b12859faf1ba1f67c Mon Sep 17 00:00:00 2001 From: SyaharaniSalsabilla Date: Wed, 22 Jul 2026 15:22:56 +0700 Subject: [PATCH 07/12] solve akses pasar --- .../Produktivitas/AksesPasarController.php | 27 ++++++++++++- .../petani/akses-pasar/index.blade.php | 39 +++++++++++++------ 2 files changed, 53 insertions(+), 13 deletions(-) diff --git a/app/Http/Controllers/Web/Produktivitas/AksesPasarController.php b/app/Http/Controllers/Web/Produktivitas/AksesPasarController.php index 6556cfd..6c14be4 100644 --- a/app/Http/Controllers/Web/Produktivitas/AksesPasarController.php +++ b/app/Http/Controllers/Web/Produktivitas/AksesPasarController.php @@ -25,9 +25,25 @@ class AksesPasarController extends Controller $aksesPasar = AksesPasar::where('petani_id', $petaniId)->first(); $hargaJualPanen = HargaJualPanen::where('petani_id', $petaniId)->get(); + $hargaJualRows = collect([ + 'Buah segar hasil petik', + 'Biji basah', + 'Biji kering/Biji Kupas', + 'Terfermentasi (Rp/kg)', + ])->map(function (string $bentuk, int $index) use ($hargaJualPanen) { + $existingData = $hargaJualPanen->firstWhere('bentuk_produk', $bentuk); + + return [ + 'index' => $index, + 'bentuk' => $bentuk, + 'harga_panen_terakhir' => $this->currencyForDisplay($existingData?->harga_panen_terakhir), + 'harga_tahun_lalu' => $this->currencyForDisplay($existingData?->harga_tahun_lalu), + 'harga_dua_tahun_lalu' => $this->currencyForDisplay($existingData?->harga_dua_tahun_lalu), + ]; + }); return view('produktivitas.petani.akses-pasar.index', array_merge( - compact('petani', 'aksesPasar', 'hargaJualPanen'), + compact('petani', 'aksesPasar', 'hargaJualPanen', 'hargaJualRows'), $this->aksesPasarOptions() )); } @@ -251,4 +267,11 @@ class AksesPasarController extends Controller $digits = preg_replace('/\D/', '', (string) $value); return $digits === '' ? null : $digits; } -} \ No newline at end of file + + private function currencyForDisplay(mixed $value): string + { + $digits = $this->currencyDigits($value); + + return is_null($digits) ? '' : number_format((int) $digits, 0, ',', '.'); + } +} diff --git a/resources/views/produktivitas/petani/akses-pasar/index.blade.php b/resources/views/produktivitas/petani/akses-pasar/index.blade.php index 12a97a8..9894264 100644 --- a/resources/views/produktivitas/petani/akses-pasar/index.blade.php +++ b/resources/views/produktivitas/petani/akses-pasar/index.blade.php @@ -93,34 +93,30 @@ - @php($listBentukProduk = ['Buah segar hasil petik', 'Biji basah', 'Biji kering/Biji Kupas', 'Terfermentasi (Rp/kg)']) - @php($hargaJualPanen = $hargaJualPanen ?? collect()) - - @foreach ($listBentukProduk as $index => $bentuk) - @php($existingData = $hargaJualPanen->firstWhere('bentuk_produk', $bentuk)) + @foreach ($hargaJualRows as $row) - - {{ $bentuk }}: + + {{ $row['bentuk'] }}:
Rp - + /kg
Rp - + /kg
Rp - + /kg
@@ -232,6 +228,16 @@ const praktikBelumPernahValue = String(@json($praktikBelumPernahValue)); const skorPengalamanBerhentiValues = @json($skorPengalamanBerhentiValues ?? [2,3]).map(Number); + function onlyDigits(value) { + return String(value || '').replace(/\D/g, ''); + } + + function formatRupiah(value) { + const digits = onlyDigits(value); + + return digits.replace(/\B(?=(\d{3})+(?!\d))/g, '.'); + } + function syncAlasanBerhenti() { const val = Number($('input[name="skor_pengalaman"]:checked').val()); const isBerhenti = skorPengalamanBerhentiValues.includes(val); @@ -256,10 +262,21 @@ $('input[name="skor_pengalaman"]').on('change', syncAlasanBerhenti); $('input[name="saluran_terdahulu[]"]').on('change', syncSaluranLainnya); $('input[name="praktik_fermentasi"]').on('change', syncPraktikFermentasi); + $(document).on('input', '.rupiah-input', function () { + const cursorAtEnd = this.selectionStart === this.value.length; + this.value = formatRupiah(this.value); + + if (cursorAtEnd) { + this.setSelectionRange(this.value.length, this.value.length); + } + }); + $('.rupiah-input').each(function () { + this.value = formatRupiah(this.value); + }); syncAlasanBerhenti(); syncSaluranLainnya(); syncPraktikFermentasi(); }); -@endpush \ No newline at end of file +@endpush From e7f48b6500d67fb4734dc9925d929752cacc3557 Mon Sep 17 00:00:00 2001 From: SyaharaniSalsabilla Date: Wed, 22 Jul 2026 15:49:25 +0700 Subject: [PATCH 08/12] solve lahan & tanaman --- .../Produktivitas/PetaniLahanController.php | 52 ++++++++++++++++++- app/Models/Pertanian/PraktikBudidaya.php | 34 +++++++----- .../produktivitas/petani/lahan/add.blade.php | 42 ++++++++++----- .../produktivitas/petani/lahan/edit.blade.php | 32 +++++++----- 4 files changed, 116 insertions(+), 44 deletions(-) diff --git a/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php b/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php index c8ce95f..acb24e6 100644 --- a/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php +++ b/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php @@ -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, diff --git a/app/Models/Pertanian/PraktikBudidaya.php b/app/Models/Pertanian/PraktikBudidaya.php index ba99cff..97454eb 100644 --- a/app/Models/Pertanian/PraktikBudidaya.php +++ b/app/Models/Pertanian/PraktikBudidaya.php @@ -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'); } -} \ No newline at end of file +} diff --git a/resources/views/produktivitas/petani/lahan/add.blade.php b/resources/views/produktivitas/petani/lahan/add.blade.php index b88061a..eac2d4a 100644 --- a/resources/views/produktivitas/petani/lahan/add.blade.php +++ b/resources/views/produktivitas/petani/lahan/add.blade.php @@ -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; + } @endpush @@ -259,7 +263,7 @@
-
+
@@ -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' : '' }}>
@@ -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' : '' }}>
@@ -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' : '' }}>
@@ -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' : '' }}>
@@ -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' : '' }}>
- * Tidak diisi, terisi otomatis + * Tidak diisi, terisi otomatis di Praktik Budidaya @error('jenis_hama')
{{ $message }}
@enderror
-
+
@@ -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' : '' }}>
@@ -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' : '' }}>
@@ -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' : '' }}>
@@ -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' : '' }}>
@@ -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' : '' }}>
- * Tidak diisi, terisi otomatis + * Tidak diisi, terisi otomatis di praktik budidaya @error('jenis_penyakit')
{{ $message }}
diff --git a/resources/views/produktivitas/petani/lahan/edit.blade.php b/resources/views/produktivitas/petani/lahan/edit.blade.php index a47770f..e4d4375 100644 --- a/resources/views/produktivitas/petani/lahan/edit.blade.php +++ b/resources/views/produktivitas/petani/lahan/edit.blade.php @@ -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; + } @endpush @@ -161,7 +165,7 @@
--> -
+
@@ -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' : '' }}>
@@ -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' : '' }}>
@@ -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' : '' }}>
@@ -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' : '' }}>
@@ -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' : '' }}>
- * Tidak diisi, terisi otomatis + * Tidak diisi, terisi otomatis di praktik budidaya @error('jenis_hama')
{{ $message }}
@enderror
-
+
@@ -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' : '' }}>
@@ -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' : '' }}>
@@ -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' : '' }}>
@@ -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' : '' }}>
@@ -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' : '' }}>
- * Tidak diisi, terisi otomatis + * Tidak diisi, terisi otomatis di Praktik Budidaya @error('jenis_penyakit')
{{ $message }}
From 17b5687db820e73e2bef71aaa19162b5a9f860f0 Mon Sep 17 00:00:00 2001 From: SyaharaniSalsabilla Date: Wed, 22 Jul 2026 15:55:07 +0700 Subject: [PATCH 09/12] update user profile --- resources/views/konfigurasi/profile/index.blade.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/views/konfigurasi/profile/index.blade.php b/resources/views/konfigurasi/profile/index.blade.php index 8fd820d..a099cde 100644 --- a/resources/views/konfigurasi/profile/index.blade.php +++ b/resources/views/konfigurasi/profile/index.blade.php @@ -88,12 +88,13 @@ @if($profile) @endif
From bd05fc7f0fda56fd02e8cadcd97dc350571187de Mon Sep 17 00:00:00 2001 From: SyaharaniSalsabilla Date: Wed, 22 Jul 2026 16:23:32 +0700 Subject: [PATCH 10/12] update hama dan penyakit --- .../Produktivitas/PetaniLahanController.php | 63 ++++++++++++++----- app/Models/Pertanian/PraktikBudidaya.php | 35 ++++++----- ...7_22_110145_update_lahan_tanaman_table.php | 36 ++++++++--- 3 files changed, 97 insertions(+), 37 deletions(-) diff --git a/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php b/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php index acb24e6..1a20417 100644 --- a/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php +++ b/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php @@ -7,6 +7,7 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Gate; use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Str; use Illuminate\Validation\Rules\Enum; @@ -101,6 +102,12 @@ class PetaniLahanController extends Controller return []; } + private function hasPestDiseaseColumns(string $table): bool + { + return Schema::hasColumn($table, 'jenis_hama') + && Schema::hasColumn($table, 'jenis_penyakit'); + } + private function validateLahan(Request $request) { return $request->validate([ @@ -200,7 +207,14 @@ class PetaniLahanController extends Controller ]); $validated = $this->validateLahan($request); - $validated = array_merge($validated, $this->autoPestDiseaseData($petaniId)); + $autoPestDiseaseData = $this->autoPestDiseaseData($petaniId); + $lahanHasPestDiseaseColumns = $this->hasPestDiseaseColumns((new Lahan)->getTable()); + $tanamanHasPestDiseaseColumns = $this->hasPestDiseaseColumns((new Tanaman)->getTable()); + + if ($lahanHasPestDiseaseColumns) { + $validated = array_merge($validated, $autoPestDiseaseData); + } + $komoditas = Komoditas::where('id', $request->komoditas_id)->first(); $lahanCount = Lahan::where('petani_id', $petaniId) ->count(); @@ -230,8 +244,8 @@ class PetaniLahanController extends Controller ); if ($lahan && $lahan->jumlah_tanaman > 0) { - $data = collect(range(1, $lahan->jumlah_tanaman))->map(function ($i) use ($lahan, $komoditas, $lahanUid) { - return [ + $data = collect(range(1, $lahan->jumlah_tanaman))->map(function ($i) use ($lahan, $komoditas, $lahanUid, $autoPestDiseaseData, $tanamanHasPestDiseaseColumns) { + $row = [ 'lahan_id' => $lahan->id, 'uid' => 'TNM-' . $lahanUid . '-' . strtoupper(Str::random(10)), 'komoditas_id' => $lahan->komoditas_id, @@ -244,13 +258,18 @@ 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(), 'updated_at' => now(), ]; + + if ($tanamanHasPestDiseaseColumns) { + $row['jenis_hama'] = json_encode($autoPestDiseaseData['jenis_hama'] ?? []); + $row['jenis_penyakit'] = json_encode($autoPestDiseaseData['jenis_penyakit'] ?? []); + } + + return $row; }); $data->chunk(500)->each(function ($chunk) { @@ -329,7 +348,14 @@ class PetaniLahanController extends Controller ->toArray() ]); $validated = $this->validateLahan($request); - $validated = array_merge($validated, $this->autoPestDiseaseData($petaniId)); + $autoPestDiseaseData = $this->autoPestDiseaseData($petaniId); + $lahanHasPestDiseaseColumns = $this->hasPestDiseaseColumns((new Lahan)->getTable()); + $tanamanHasPestDiseaseColumns = $this->hasPestDiseaseColumns((new Tanaman)->getTable()); + + if ($lahanHasPestDiseaseColumns) { + $validated = array_merge($validated, $autoPestDiseaseData); + } + $komoditas = Komoditas::where('id', $request->komoditas_id)->first(); $tanamanCount = Tanaman::where('lahan_id', $lahan->id)->count(); $lahanCount = Lahan::where('petani_id', $petaniId)->count(); @@ -382,8 +408,8 @@ class PetaniLahanController extends Controller $this->syncTanamanPenaung($request); if ($lahan && $lahan->jumlah_tanaman > $tanamanCount) { - $data = collect(range($tanamanCount + 1, $lahan->jumlah_tanaman))->map(function ($i) use ($lahan, $komoditas, $lahanUid) { - return [ + $data = collect(range($tanamanCount + 1, $lahan->jumlah_tanaman))->map(function ($i) use ($lahan, $komoditas, $lahanUid, $autoPestDiseaseData, $tanamanHasPestDiseaseColumns) { + $row = [ 'lahan_id' => $lahan->id, 'komoditas_id' => $lahan->komoditas_id, 'jenis_komoditas_id' => $lahan->jenis_komoditas_id, @@ -396,13 +422,18 @@ 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(), 'updated_at' => now(), ]; + + if ($tanamanHasPestDiseaseColumns) { + $row['jenis_hama'] = json_encode($autoPestDiseaseData['jenis_hama'] ?? []); + $row['jenis_penyakit'] = json_encode($autoPestDiseaseData['jenis_penyakit'] ?? []); + } + + return $row; }); $data->chunk(500)->each(function ($chunk) { @@ -410,11 +441,13 @@ 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 ($tanamanHasPestDiseaseColumns) { + $lahan->tanaman()->update([ + 'jenis_hama' => json_encode($autoPestDiseaseData['jenis_hama'] ?? []), + 'jenis_penyakit' => json_encode($autoPestDiseaseData['jenis_penyakit'] ?? []), + 'updated_by' => auth()->id(), + ]); + } if ($request->ajax()) { return response()->json([ diff --git a/app/Models/Pertanian/PraktikBudidaya.php b/app/Models/Pertanian/PraktikBudidaya.php index 97454eb..bc466c7 100644 --- a/app/Models/Pertanian/PraktikBudidaya.php +++ b/app/Models/Pertanian/PraktikBudidaya.php @@ -8,6 +8,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasOne; +use Illuminate\Support\Facades\Schema; use Illuminate\Support\Str; use App\Models\Pertanian\Petani; @@ -100,21 +101,27 @@ class PraktikBudidaya extends Model $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, - ]); - }); + if (Schema::hasColumn((new Lahan)->getTable(), 'jenis_hama') + && Schema::hasColumn((new Lahan)->getTable(), '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 (Schema::hasColumn((new Tanaman)->getTable(), 'jenis_hama') + && Schema::hasColumn((new Tanaman)->getTable(), 'jenis_penyakit')) { + 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; diff --git a/database/migrations/2026_07_22_110145_update_lahan_tanaman_table.php b/database/migrations/2026_07_22_110145_update_lahan_tanaman_table.php index c3f4a9e..6fde87c 100644 --- a/database/migrations/2026_07_22_110145_update_lahan_tanaman_table.php +++ b/database/migrations/2026_07_22_110145_update_lahan_tanaman_table.php @@ -12,26 +12,46 @@ return new class extends Migration public function up(): void { Schema::table('map_lahan', function (Blueprint $table) { - $table->jsonb('jenis_hama')->nullable(); - $table->jsonb('jenis_penyakit')->nullable(); + if (! Schema::hasColumn('map_lahan', 'jenis_hama')) { + $table->jsonb('jenis_hama')->nullable(); + } + + if (! Schema::hasColumn('map_lahan', 'jenis_penyakit')) { + $table->jsonb('jenis_penyakit')->nullable(); + } }); Schema::table('map_tanaman', function (Blueprint $table) { - $table->jsonb('jenis_hama')->nullable(); - $table->jsonb('jenis_penyakit')->nullable(); + if (! Schema::hasColumn('map_tanaman', 'jenis_hama')) { + $table->jsonb('jenis_hama')->nullable(); + } + + if (! Schema::hasColumn('map_tanaman', 'jenis_penyakit')) { + $table->jsonb('jenis_penyakit')->nullable(); + } }); } public function down(): void { Schema::table('map_lahan', function (Blueprint $table) { - $table->dropColumn('jenis_hama'); - $table->dropColumn('jenis_penyakit'); + if (Schema::hasColumn('map_lahan', 'jenis_hama')) { + $table->dropColumn('jenis_hama'); + } + + if (Schema::hasColumn('map_lahan', 'jenis_penyakit')) { + $table->dropColumn('jenis_penyakit'); + } }); Schema::table('map_tanaman', function (Blueprint $table) { - $table->dropColumn('jenis_hama'); - $table->dropColumn('jenis_penyakit'); + if (Schema::hasColumn('map_tanaman', 'jenis_hama')) { + $table->dropColumn('jenis_hama'); + } + + if (Schema::hasColumn('map_tanaman', 'jenis_penyakit')) { + $table->dropColumn('jenis_penyakit'); + } }); } }; From 7af7e1bdaf5897dd10df309c3e90d9a94b935b5b Mon Sep 17 00:00:00 2001 From: SyaharaniSalsabilla Date: Wed, 22 Jul 2026 16:40:24 +0700 Subject: [PATCH 11/12] update jumlah lahan --- app/Http/Controllers/Web/Dashboard/SurveyPetaniController.php | 4 ++-- resources/views/dashboard/petani.blade.php | 4 ++-- resources/views/produktivitas/petani/header.blade.php | 3 ++- resources/views/produktivitas/petani/index.blade.php | 2 +- resources/views/produktivitas/petani/lahan/edit.blade.php | 3 ++- 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/app/Http/Controllers/Web/Dashboard/SurveyPetaniController.php b/app/Http/Controllers/Web/Dashboard/SurveyPetaniController.php index 3c3042e..577fb8b 100644 --- a/app/Http/Controllers/Web/Dashboard/SurveyPetaniController.php +++ b/app/Http/Controllers/Web/Dashboard/SurveyPetaniController.php @@ -143,8 +143,8 @@ class SurveyPetaniController extends Controller // Ringkasan lahan - $totalLuasLahan = (float) Lahan::query() - ->sum('luas_lahan'); + $totalLuasLahan = ((float) Lahan::query() + ->sum('luas_lahan')) / 10000; $totalJumlahTanaman = (int) Lahan::query() ->sum('jumlah_tanaman'); diff --git a/resources/views/dashboard/petani.blade.php b/resources/views/dashboard/petani.blade.php index d214106..ec98bc2 100644 --- a/resources/views/dashboard/petani.blade.php +++ b/resources/views/dashboard/petani.blade.php @@ -31,7 +31,7 @@
-

{{ number_format($lahanSummary->sum('luas_lahan'), 0, ',', '.') }}m2

+

{{ number_format($lahanSummary->sum('luas_lahan') / 10000, 2, ',', '.') }} ha

Lahan

@@ -701,4 +701,4 @@ radarKomponen.render(); }); -@endpush \ No newline at end of file +@endpush diff --git a/resources/views/produktivitas/petani/header.blade.php b/resources/views/produktivitas/petani/header.blade.php index b530a0a..6914889 100644 --- a/resources/views/produktivitas/petani/header.blade.php +++ b/resources/views/produktivitas/petani/header.blade.php @@ -92,6 +92,7 @@ ? $petani->lahans()->get() : collect(); $totalLuasLahan = $petani ? $lahanPetani->where('komoditas_id', $petani->komoditas_id)->sum('luas_lahan') : 0; + $totalLuasLahanHa = $totalLuasLahan / 10000; $totalTanaman = $petani ? $lahanPetani->where('komoditas_id', $petani->komoditas_id)->sum('jumlah_tanaman') : 0; $pendidikanLabel = isset($petani) ? $petani->pendidikan_terakhir?->label() : null; @@ -126,7 +127,7 @@

Lahan & Tanaman

@if($lahanPetani->isNotEmpty()) - {{ number_format($totalLuasLahan, 0, ',', '.') }} ha + {{ number_format($totalLuasLahanHa, 2, ',', '.') }} ha @else - @endif diff --git a/resources/views/produktivitas/petani/index.blade.php b/resources/views/produktivitas/petani/index.blade.php index b6cb010..2c65a89 100644 --- a/resources/views/produktivitas/petani/index.blade.php +++ b/resources/views/produktivitas/petani/index.blade.php @@ -15,7 +15,7 @@
Date: Wed, 22 Jul 2026 16:54:57 +0700 Subject: [PATCH 12/12] update jumlah tanaman --- .../Web/Dashboard/SurveyPetaniController.php | 18 ++++++++++++------ .../Web/Produktivitas/PetaniController.php | 6 +++--- .../produktivitas/petani/header.blade.php | 7 ++++++- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/app/Http/Controllers/Web/Dashboard/SurveyPetaniController.php b/app/Http/Controllers/Web/Dashboard/SurveyPetaniController.php index 577fb8b..00886c5 100644 --- a/app/Http/Controllers/Web/Dashboard/SurveyPetaniController.php +++ b/app/Http/Controllers/Web/Dashboard/SurveyPetaniController.php @@ -11,6 +11,7 @@ use App\Models\User; use App\Models\Pertanian\Petani; use App\Models\Pertanian\Komoditas; use App\Models\Pertanian\Lahan; +use App\Models\Pertanian\Tanaman; use App\Models\Pertanian\SurveyPelatihan; use App\Models\Pertanian\SurveySertifikasi; @@ -146,21 +147,26 @@ class SurveyPetaniController extends Controller $totalLuasLahan = ((float) Lahan::query() ->sum('luas_lahan')) / 10000; - $totalJumlahTanaman = (int) Lahan::query() - ->sum('jumlah_tanaman'); - // Jumlah tanaman berdasarkan komoditas petani - $tanamanPerKomoditasCollection = DB::table("{$lahanTable} as l") + $tanamanTable = (new Tanaman())->getTable(); + + $tanamanPerKomoditasCollection = DB::table("{$tanamanTable} as t") + ->join("{$lahanTable} as l", 'l.id', '=', 't.lahan_id') ->join("{$petaniTable} as p", 'p.id', '=', 'l.petani_id') - ->leftJoin("{$komoditasTable} as k", 'k.id', '=', 'p.komoditas_id') + ->leftJoin("{$komoditasTable} as k", 'k.id', '=', 't.komoditas_id') ->selectRaw("COALESCE(k.nama, 'Belum ditentukan') as label") - ->selectRaw('COALESCE(SUM(l.jumlah_tanaman), 0) as total') + ->selectRaw('COUNT(t.id) as total') ->where('k.is_utama', true) + ->whereNull('t.deleted_at') + ->whereNull('l.deleted_at') + ->whereNull('p.deleted_at') ->groupBy('k.id', 'k.nama') ->orderByDesc('total') ->get(); + $totalJumlahTanaman = (int) $tanamanPerKomoditasCollection->sum('total'); + $tanamanPerKomoditas = $tanamanPerKomoditasCollection ->map(function ($item, $index) use ($colors, $totalJumlahTanaman) { $color = $colors[$index % count($colors)]; diff --git a/app/Http/Controllers/Web/Produktivitas/PetaniController.php b/app/Http/Controllers/Web/Produktivitas/PetaniController.php index 30c5cd8..04b08a7 100644 --- a/app/Http/Controllers/Web/Produktivitas/PetaniController.php +++ b/app/Http/Controllers/Web/Produktivitas/PetaniController.php @@ -50,14 +50,14 @@ class PetaniController extends Controller $query->where('created_by', auth()->user()->id); } + $summaryPetaniIds = (clone $query)->pluck('id'); $petani = $query->paginate($request->per_page ?? 10); $komoditas = Komoditas::where('is_utama', true)->get(); - $lahan = Lahan::whereIn('petani_id', $petani->pluck('id')) + $lahan = Lahan::whereIn('petani_id', $summaryPetaniIds) ->whereIn('komoditas_id', $komoditas->pluck('id')) ->get(); $tanaman = Tanaman::whereIn('lahan_id', $lahan->pluck('id')) - ->whereIn('lahan_id', $lahan->pluck('id')) ->get(); $case = " @@ -70,7 +70,7 @@ class PetaniController extends Controller END "; $skor = SkorPetani::selectRaw("$case AS segmen, COUNT(*) AS total") - ->whereIn('petani_id', $petani->pluck('id')) + ->whereIn('petani_id', $summaryPetaniIds) ->groupByRaw($case) ->get(); diff --git a/resources/views/produktivitas/petani/header.blade.php b/resources/views/produktivitas/petani/header.blade.php index 6914889..e3ed814 100644 --- a/resources/views/produktivitas/petani/header.blade.php +++ b/resources/views/produktivitas/petani/header.blade.php @@ -93,7 +93,12 @@ : collect(); $totalLuasLahan = $petani ? $lahanPetani->where('komoditas_id', $petani->komoditas_id)->sum('luas_lahan') : 0; $totalLuasLahanHa = $totalLuasLahan / 10000; - $totalTanaman = $petani ? $lahanPetani->where('komoditas_id', $petani->komoditas_id)->sum('jumlah_tanaman') : 0; + $lahanKomoditasUtamaIds = $petani + ? $lahanPetani->where('komoditas_id', $petani->komoditas_id)->pluck('id') + : collect(); + $totalTanaman = $petani && \Illuminate\Support\Facades\Schema::hasTable('map_tanaman') + ? \App\Models\Pertanian\Tanaman::whereIn('lahan_id', $lahanKomoditasUtamaIds)->count() + : 0; $pendidikanLabel = isset($petani) ? $petani->pendidikan_terakhir?->label() : null; @endphp