From 419404e27350743ab8f27283db8b3254b2e4d956 Mon Sep 17 00:00:00 2001 From: Irwan Cahyono Date: Thu, 16 Jul 2026 13:46:43 +0700 Subject: [PATCH 1/4] null jumlah tanaman --- .../Web/Produktivitas/PetaniLahanController.php | 4 ++-- resources/views/produktivitas/petani/lahan/add.blade.php | 8 ++++---- resources/views/produktivitas/petani/lahan/edit.blade.php | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php b/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php index c4febdb..e1b227d 100644 --- a/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php +++ b/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php @@ -81,7 +81,7 @@ class PetaniLahanController extends Controller 'komoditas_id' => ['required', 'exists:master_komoditas,id'], 'jenis_komoditas_id' => ['required', 'exists:jenis_komoditas,id'], 'varietas_id' => ['nullable', 'exists:master_varietas,id'], - 'jumlah_tanaman' => ['required', 'numeric', 'min:0'], + 'jumlah_tanaman' => ['nullable', 'numeric', 'min:0'], 'umur_lahan' => ['nullable', 'numeric', 'min:1'], 'umur_tanaman' => ['required', 'numeric', 'min:1'], 'kondisi_tanaman' => ['required', 'string', new Enum(KondisiTanaman::class)], @@ -102,7 +102,7 @@ class PetaniLahanController extends Controller 'luas_lahan.required' => 'Luas lahan wajib diisi.', 'luas_lahan.numeric' => 'Luas lahan diisi dengan angka.', 'luas_lahan.min' => 'Luas lahan minimal 0.01.', - 'jumlah_tanaman.required' => 'Jumlah tanaman wajib diisi.', + //'jumlah_tanaman.required' => 'Jumlah tanaman wajib diisi.', 'jumlah_tanaman.numeric' => 'Jumlah tanaman diisi dengan angka.', 'jumlah_tanaman.min' => 'Jumlah tanaman minimal 0.', //'umur_lahan.required' => 'Umur lahan wajib diisi.', diff --git a/resources/views/produktivitas/petani/lahan/add.blade.php b/resources/views/produktivitas/petani/lahan/add.blade.php index ea3daf3..26297b5 100644 --- a/resources/views/produktivitas/petani/lahan/add.blade.php +++ b/resources/views/produktivitas/petani/lahan/add.blade.php @@ -206,8 +206,8 @@ @error('umur_lahan')
{{ $message }}
@enderror
- - + + @error('jumlah_tanaman')
{{ $message }}
@enderror
@@ -707,7 +707,7 @@ kabupatenkota_id: { required: true }, kecamatan_id: { required: true }, desa_kelurahan_id: { required: true }, - jumlah_tanaman: { required: true, number: true, min: 0 }, + jumlah_tanaman: { number: true, min: 0 }, umur_lahan: { number: true, min: 1 }, umur_tanaman: { required: true, number: true, min: 1 }, kondisi_tanaman: { required: true }, @@ -721,7 +721,7 @@ kabupatenkota_id: { required: "Kabupaten/Kota wajib diisi" }, kecamatan_id: { required: "Kecamatan wajib diisi" }, desa_kelurahan_id: { required: "Desa/Kelurahan wajib diisi" }, - jumlah_tanaman: { required: "Jumlah tanaman wajib diisi", number: "Jumlah tanaman harus berupa angka", min: "Jumlah tanaman minimal 0" }, + jumlah_tanaman: { number: "Jumlah tanaman harus berupa angka", min: "Jumlah tanaman minimal 0" }, umur_lahan: { number: "Umur lahan harus berupa angka", min: "Umur lahan minimal 1 tahun" }, umur_tanaman: { required: "Umur tanaman wajib diisi", number: "Umur tanaman harus berupa angka", min: "Umur tanaman minimal 1 tahun" }, kondisi_tanaman: { required: "Kondisi tanaman wajib diisi" }, diff --git a/resources/views/produktivitas/petani/lahan/edit.blade.php b/resources/views/produktivitas/petani/lahan/edit.blade.php index 2d4a280..677ccb6 100644 --- a/resources/views/produktivitas/petani/lahan/edit.blade.php +++ b/resources/views/produktivitas/petani/lahan/edit.blade.php @@ -62,8 +62,8 @@ @error('umur_lahan')
{{ $message }}
@enderror
- - Jumlah Tanaman + @error('jumlah_tanaman')
{{ $message }}
@enderror
@@ -677,7 +677,7 @@ jenis_komoditas_id: { required: true }, varietas_id: { required: true }, desa_kelurahan_id: { required: true }, - jumlah_tanaman: { required: true, min: @json($lahanSelected->jumlah_tanaman) }, + jumlah_tanaman: { min: @json($lahanSelected->jumlah_tanaman) }, }, messages: { luas_lahan: { required: "Luas lahan wajib diisi" }, @@ -685,7 +685,7 @@ jenis_komoditas_id: { required: "Jenis komoditas wajib diisi" }, varietas_id: { required: "Varietas wajib diisi" }, desa_kelurahan_id: { required: "Desa/Kelurahan wajib diisi" }, - jumlah_tanaman: { required: "Jumlah tanaman wajib diisi", min: "Jumlah tanaman tidak boleh kurang dari @json($lahanSelected->jumlah_tanaman), hapus pada tanaman yang dimaksud" }, + jumlah_tanaman: { min: "Jumlah tanaman tidak boleh kurang dari @json($lahanSelected->jumlah_tanaman), hapus pada tanaman yang dimaksud" }, }, errorElement: 'div', errorPlacement: function (error, element) { From 089f1b515d91c77d27eef5db8a006647726db5cd Mon Sep 17 00:00:00 2001 From: Irwan Cahyono Date: Thu, 16 Jul 2026 15:22:42 +0700 Subject: [PATCH 2/4] 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 @@
+
+ @if($profile->role === \App\Enums\Role::PETANI->value)
-
+
+ @endif
diff --git a/resources/views/layout/main.blade.php b/resources/views/layout/main.blade.php index 17e62d7..25c5a1e 100644 --- a/resources/views/layout/main.blade.php +++ b/resources/views/layout/main.blade.php @@ -80,6 +80,7 @@ + diff --git a/resources/views/master/profile/edit.blade.php b/resources/views/master/profile/edit.blade.php index 09eae9a..048249a 100644 --- a/resources/views/master/profile/edit.blade.php +++ b/resources/views/master/profile/edit.blade.php @@ -27,7 +27,7 @@
- +
diff --git a/routes/web.php b/routes/web.php index 5a23c34..c5683cb 100644 --- a/routes/web.php +++ b/routes/web.php @@ -47,11 +47,11 @@ Route::middleware('auth') Route::get('/dashboard/petani', [App\Http\Controllers\Web\Dashboard\ProfilPetaniController::class, 'index'])->name('dashboard.petani'); - Route::get('/UserProfile', [App\Http\Controllers\Web\Konfigurasi\ProfileController::class, 'index'])->name('userProfile.index'); - Route::get('/UserProfile/security', [App\Http\Controllers\Web\Konfigurasi\ProfileController::class, 'security'])->name('userProfile.security'); - Route::get('/UserProfile/activities', [App\Http\Controllers\Web\Konfigurasi\ProfileController::class, 'activities'])->name('userProfile.activities'); - Route::patch('/UserProfile/password', [App\Http\Controllers\Web\Konfigurasi\ProfileController::class, 'updatePassword'])->name('userProfile.password.update'); - Route::post('/UserProfile/logout-devices', [App\Http\Controllers\Web\Konfigurasi\ProfileController::class, 'logoutDevices'])->name('userProfile.logoutDevices'); + Route::get('/user-profile', [App\Http\Controllers\Web\Konfigurasi\ProfileController::class, 'index'])->name('userProfile.index'); + Route::get('/user-profile/security', [App\Http\Controllers\Web\Konfigurasi\ProfileController::class, 'security'])->name('userProfile.security'); + Route::get('/user-profile/activities', [App\Http\Controllers\Web\Konfigurasi\ProfileController::class, 'activities'])->name('userProfile.activities'); + Route::patch('/user-profile/password', [App\Http\Controllers\Web\Konfigurasi\ProfileController::class, 'updatePassword'])->name('userProfile.password.update'); + Route::post('/user-profile/logout-devices', [App\Http\Controllers\Web\Konfigurasi\ProfileController::class, 'logoutDevices'])->name('userProfile.logoutDevices'); Route::get('/dashboard/summary', [App\Http\Controllers\Web\Dashboard\SummaryController::class, 'index'])->name('dashboard.summary'); Route::get('/resiliensi', [App\Http\Controllers\Web\Dashboard\ResiliensiController::class, 'index'])->name('dashboard.resiliensi');