From 089f1b515d91c77d27eef5db8a006647726db5cd Mon Sep 17 00:00:00 2001 From: Irwan Cahyono Date: Thu, 16 Jul 2026 15:22:42 +0700 Subject: [PATCH] tanaman penaung di lahan --- .../Produktivitas/PetaniLahanController.php | 48 +++++++++++++++++-- app/Models/Master/JenisTanaman.php | 21 ++++++++ ...7_16_144346_create_jenis_tanaman_table.php | 34 +++++++++++++ .../produktivitas/petani/lahan/add.blade.php | 10 ++-- .../produktivitas/petani/lahan/edit.blade.php | 12 +++-- 5 files changed, 112 insertions(+), 13 deletions(-) create mode 100644 app/Models/Master/JenisTanaman.php create mode 100644 database/migrations/2026_07_16_144346_create_jenis_tanaman_table.php diff --git a/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php b/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php index e1b227d..0191bc1 100644 --- a/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php +++ b/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php @@ -18,6 +18,7 @@ use App\Models\Wilayah\DesaKelurahan; use App\Models\Wilayah\Provinsi; use App\Models\Pertanian\Komoditas; use App\Models\Pertanian\Tanaman; +use App\Models\Master\JenisTanaman; use App\Enums\StatusLahan; use App\Enums\KondisiTanaman; @@ -62,8 +63,9 @@ class PetaniLahanController extends Controller $provinsi = Provinsi::orderBy('kode', 'asc')->get(); $komoditas = Komoditas::all(); + $tanamanPenaung = JenisTanaman::all(); - return view('produktivitas.petani.lahan.add', compact('petani', 'lahan', 'provinsi', 'komoditas')); + return view('produktivitas.petani.lahan.add', compact('petani', 'lahan', 'provinsi', 'komoditas', 'tanamanPenaung')); } private function validateLahan(Request $request) @@ -91,7 +93,7 @@ class PetaniLahanController extends Controller 'komoditas_lain' => ['nullable', 'array'], 'komoditas_lain.*' => ['integer', 'exists:master_komoditas,id'], 'tanaman_penaung' => ['nullable', 'array'], - 'tanaman_penaung.*' => ['integer', 'exists:master_komoditas,id'], + 'tanaman_penaung.*' => ['string'], 'foto' => ['nullable', 'array'], 'foto.*' => ['image', 'mimes:jpeg,jpg,png', 'max:2048'], ], [ @@ -119,7 +121,7 @@ class PetaniLahanController extends Controller 'komoditas_lain.array' => 'Komoditas lain diisi dengan array.', 'komoditas_lain.*.exists' => 'Komoditas lain yang dipilih tidak valid.', 'tanaman_penaung.array' => 'Tanaman penaung diisi dengan array.', - 'tanaman_penaung.*.exists' => 'Tanaman penaung yang dipilih tidak valid.', + //'tanaman_penaung.*.exists' => 'Tanaman penaung yang dipilih tidak valid.', 'foto.array' => 'Foto diisi dengan array.', 'foto.*.image' => 'Foto harus berupa gambar.', 'foto.*.mimes' => 'Foto harus berupa gambar dengan ekstensi jpeg, jpg, atau png.', @@ -128,6 +130,28 @@ class PetaniLahanController extends Controller } + private function syncTanamanPenaung(Request $request) + { + $existing = JenisTanaman::pluck('nama')->toArray(); + + $tanamanPenaung = collect($request->tanaman_penaung) + ->unique() + ->reject(fn ($nama) => in_array($nama, $existing)) + ->map(fn ($nama) => [ + 'nama' => Str::title($nama), + 'created_by' => auth()->id(), + 'updated_by' => auth()->id(), + 'created_at' => now(), + 'updated_at' => now(), + ]) + ->values() + ->toArray(); + + if (!empty($tanamanPenaung)) { + JenisTanaman::insert($tanamanPenaung); + } + } + public function store($petaniId, Request $request) { if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) { @@ -136,6 +160,12 @@ class PetaniLahanController extends Controller $petani = Petani::findOrFail($petaniId); + $request->merge([ + 'tanaman_penaung' => collect($request->tanaman_penaung) + ->map(fn ($nama) => Str::title($nama)) + ->toArray() + ]); + $validated = $this->validateLahan($request); $komoditas = Komoditas::where('id', $request->komoditas_id)->first(); $lahanCount = Lahan::where('petani_id', $petaniId) @@ -154,6 +184,8 @@ class PetaniLahanController extends Controller } } + $this->syncTanamanPenaung($request); + $lahan = Lahan::create([...$validated, 'foto' => $foto && count($foto) > 0 ? json_encode($foto) : null, 'nama' => 'Lahan ' . $komoditas->nama . ' #' . ($lahanCount + 1), @@ -236,10 +268,11 @@ class PetaniLahanController extends Controller $lahanSelected = Lahan::where('petani_id', $petaniId)->findOrFail($id); $komoditas = Komoditas::all(); + $tanamanPenaung = JenisTanaman::all(); $provinsi = Provinsi::orderBy('kode', 'asc')->get(); - return view('produktivitas.petani.lahan.edit', compact('lahan', 'lahanSelected', 'petani', 'komoditas', 'provinsi')); + return view('produktivitas.petani.lahan.edit', compact('lahan', 'lahanSelected', 'petani', 'komoditas', 'provinsi', 'tanamanPenaung')); } public function update(Request $request, string $petaniId, string $id) @@ -251,6 +284,11 @@ class PetaniLahanController extends Controller $petani = Petani::findOrFail($petaniId); $lahan = Lahan::where('petani_id', $petaniId)->findOrFail($id); + $request->merge([ + 'tanaman_penaung' => collect($request->tanaman_penaung) + ->map(fn ($nama) => Str::title($nama)) + ->toArray() + ]); $validated = $this->validateLahan($request); $komoditas = Komoditas::where('id', $request->komoditas_id)->first(); $tanamanCount = Tanaman::where('lahan_id', $lahan->id)->count(); @@ -266,6 +304,8 @@ class PetaniLahanController extends Controller $lahanUidParts = explode('LHN-', $lahanUid); $lahanUid = end($lahanUidParts); + $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 [ diff --git a/app/Models/Master/JenisTanaman.php b/app/Models/Master/JenisTanaman.php new file mode 100644 index 0000000..3902231 --- /dev/null +++ b/app/Models/Master/JenisTanaman.php @@ -0,0 +1,21 @@ +id(); + $table->string('nama'); + + $table->foreignId('created_by')->nullable()->constrained('users')->onDelete('set null'); + $table->foreignId('updated_by')->nullable()->constrained('users')->onDelete('set null'); + $table->foreignId('deleted_by')->nullable()->constrained('users')->onDelete('set null'); + + $table->timestamps(); + $table->softDeletes(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('jenis_tanamen'); + } +}; diff --git a/resources/views/produktivitas/petani/lahan/add.blade.php b/resources/views/produktivitas/petani/lahan/add.blade.php index d646038..24243e4 100644 --- a/resources/views/produktivitas/petani/lahan/add.blade.php +++ b/resources/views/produktivitas/petani/lahan/add.blade.php @@ -302,9 +302,9 @@
@error('tanaman_penaung[]')
{{ $message }}
@enderror @@ -429,7 +429,9 @@ $('#penyakit_tanaman').select2(); $('#keparahan_serangan').select2(); $('#komoditas_lain').select2(); - $('#tanaman_penaung').select2(); + $('#tanaman_penaung').select2({ + tags: true + }); $('#provinsi_id').select2().change(function(e) { e.preventDefault(); diff --git a/resources/views/produktivitas/petani/lahan/edit.blade.php b/resources/views/produktivitas/petani/lahan/edit.blade.php index 677ccb6..9101f6d 100644 --- a/resources/views/produktivitas/petani/lahan/edit.blade.php +++ b/resources/views/produktivitas/petani/lahan/edit.blade.php @@ -164,10 +164,10 @@