diff --git a/app/Enums/KeparahanSerangan.php b/app/Enums/KeparahanSerangan.php new file mode 100644 index 0000000..f6ad0b2 --- /dev/null +++ b/app/Enums/KeparahanSerangan.php @@ -0,0 +1,10 @@ + ['required', 'exists:jenis_komoditas,id'], 'varietas_id' => ['nullable', 'exists:master_varietas,id'], 'jumlah_tanaman' => ['required', 'numeric'], + 'umur_lahan' => ['required', 'numeric'], + 'umur_tanaman' => ['required', 'numeric'], + 'kondisi_tanaman' => ['required', 'string', new Enum(KondisiTanaman::class)], + 'serangan_hama' => ['nullable', 'string', new Enum(SeranganHama::class)], + 'penyakit_tanaman' => ['nullable', 'string', new Enum(PenyakitTanaman::class)], + 'keparahan_serangan' => ['nullable', 'string', new Enum(KeparahanSerangan::class)], ]); $komoditas = Komoditas::where('id', $request->komoditas_id)->first(); @@ -103,6 +117,11 @@ class PetaniLahanController extends Controller 'varietas_id' => $lahan->varietas_id, 'petani_id' => $lahan->petani_id, 'nama' => 'Tanaman ' . $komoditas->nama . ' #' . $i, + 'umur_tanaman' => $lahan->umur_tanaman, + 'kondisi_tanaman' => $lahan->kondisi_tanaman, + 'serangan_hama' => $lahan->serangan_hama, + 'penyakit_tanaman' => $lahan->penyakit_tanaman, + 'keparahan_serangan' => $lahan->keparahan_serangan ]; }); @@ -122,7 +141,7 @@ class PetaniLahanController extends Controller $petani = Petani::findOrFail($petaniId); $lahan = Lahan::where('petani_id', $petaniId) - ->orderBy('created_at', 'desc') + ->orderBy('id', 'asc') ->get(); $lahanSelected = Lahan::where('petani_id', $petaniId)->findOrFail($id); @@ -140,7 +159,7 @@ class PetaniLahanController extends Controller $petani = Petani::findOrFail($petaniId); $lahan = Lahan::where('petani_id', $petaniId) - ->orderBy('created_at', 'desc') + ->orderBy('id', 'asc') ->get(); $lahanSelected = Lahan::where('petani_id', $petaniId)->findOrFail($id); @@ -155,9 +174,67 @@ class PetaniLahanController extends Controller /** * Update the specified resource in storage. */ - public function update(Request $request, string $id) + public function update(Request $request, string $petaniId, string $id) { - // + if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) { + abort(403); + } + + $petani = Petani::findOrFail($petaniId); + $lahan = Lahan::where('petani_id', $petaniId)->findOrFail($id); + + $validated = $request->validate([ + 'nama' => ['nullable', 'string', 'max:255'], + 'status_kepemilikan' => ['nullable', 'string', 'max:255'], + 'profile_id' => ['nullable'], + 'petani_id' => ['nullable'], + 'keluarga_pengelola_id' => ['nullable'], + 'adat_pemilik_id' => ['nullable'], + 'desa_kelurahan_id' => ['nullable'], + 'luas_lahan' => ['required', 'numeric'], + 'path' => ['nullable', 'string'], + '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'], + 'umur_lahan' => ['required', 'numeric'], + 'umur_tanaman' => ['required', 'numeric'], + 'kondisi_tanaman' => ['required', 'string', new Enum(KondisiTanaman::class)], + 'serangan_hama' => ['nullable', 'string', new Enum(SeranganHama::class)], + 'penyakit_tanaman' => ['nullable', 'string', new Enum(PenyakitTanaman::class)], + 'keparahan_serangan' => ['nullable', 'string', new Enum(KeparahanSerangan::class)], + ]); + + $komoditas = Komoditas::where('id', $request->komoditas_id)->first(); + + $lahanCount = Lahan::where('petani_id', $petaniId) + ->count(); + + $lahan->update([...$validated, + 'nama' => 'Lahan ' . $komoditas->nama . ' #' . ($lahanCount + 1), + 'uid' => 'LHN-' . $petani->uid . '-' . strtoupper(Str::random(10)), + 'petani_id' => $petaniId, + 'updated_by' => auth()->id()] + ); + + if ($lahan) { + $data = collect(range($lahanCount, $lahan->jumlah_tanaman))->map(function ($i) use ($lahan, $komoditas) { + return [ + 'lahan_id' => $lahan->id, + 'komoditas_id' => $lahan->komoditas_id, + 'jenis_komoditas_id' => $lahan->jenis_komoditas_id, + 'varietas_id' => $lahan->varietas_id, + 'petani_id' => $lahan->petani_id, + 'nama' => 'Tanaman ' . $komoditas->nama . ' #' . $i, + ]; + }); + + $data->chunk(500)->each(function ($chunk) { + Tanaman::insert($chunk->toArray()); + }); + + return redirect()->route('petani.lahan-tanaman.index', $petaniId)->with('success', 'Lahan berhasil ditambahkan.'); + } } /** diff --git a/app/Http/Controllers/Web/Produktivitas/PetaniLahanTanamanController.php b/app/Http/Controllers/Web/Produktivitas/PetaniLahanTanamanController.php new file mode 100644 index 0000000..54f2191 --- /dev/null +++ b/app/Http/Controllers/Web/Produktivitas/PetaniLahanTanamanController.php @@ -0,0 +1,108 @@ +findOrFail($lahanId); + $lahanTanaman = Tanaman::with(['komoditas', 'jenisKomoditas', 'varietas', 'profile'])->where('lahan_id', $lahanId)->findOrFail($id); + + return response()->json([ + 'status' => 'success', + 'data' => $lahanTanaman, + ]); + } + + public function edit(string $id) + { + // + } + + public function update(Request $request, string $petaniId, string $lahanId, string $id) + { + if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) { + abort(403); + } + + $petani = Petani::findOrFail($petaniId); + $lahan = Lahan::where('petani_id', $petaniId)->findOrFail($lahanId); + $lahanTanaman = Tanaman::where('lahan_id', $lahanId)->findOrFail($id); + + $validated = $request->validate([ + 'latitude' => ['nullable', 'numeric', 'between:-90,90', 'required_with:longitude'], + 'longitude' => ['nullable', 'numeric', 'between:-180,180', 'required_with:latitude'], + 'kondisi_tanaman' => ['nullable', 'string', new Enum(KondisiTanaman::class)], + ]); + + $lahanTanaman->update([...$validated, 'updated_by' => auth()->id()]); + + return response()->json([ + 'status' => 'success', + 'message' => 'Data tanaman berhasil diperbarui', + 'data' => $lahanTanaman, + ]); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(string $petaniId, string $lahanId, string $id) + { + if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) { + abort(403); + } + + $petani = Petani::findOrFail($petaniId); + $lahan = Lahan::where('petani_id', $petaniId)->findOrFail($lahanId); + $lahanTanaman = LahanTanaman::where('lahan_id', $lahanId)->findOrFail($id); + + $lahanTanaman->updated_by = auth()->id(); + $lahanTanaman->save(); + $lahanTanaman->delete(); + + return response()->json([ + 'status' => 'success', + 'message' => 'Data tanaman berhasil dihapus', + ]); + } +} diff --git a/app/Models/Pertanian/Lahan.php b/app/Models/Pertanian/Lahan.php index 512257b..131f457 100644 --- a/app/Models/Pertanian/Lahan.php +++ b/app/Models/Pertanian/Lahan.php @@ -36,6 +36,12 @@ class Lahan extends Model 'varietas_id', 'jumlah_tanaman', 'petani_id', + + 'kondisi_tanaman', + 'serangan_hama', + 'penyakit_tanaman', + 'keparahan_serangan', + 'created_by', 'updated_by', 'deleted_by', diff --git a/app/Models/Pertanian/Tanaman.php b/app/Models/Pertanian/Tanaman.php index 5b89bb2..e31a616 100644 --- a/app/Models/Pertanian/Tanaman.php +++ b/app/Models/Pertanian/Tanaman.php @@ -10,6 +10,11 @@ use App\Models\Pertanian\Komoditas; use App\Models\Master\JenisKomoditas; use App\Models\Master\Varietas; +use App\Enums\KondisiTanaman; +use App\Enums\SeranganHama; +use App\Enums\PenyakitTanaman; +use App\Enums\KeparahanSerangan; + class Tanaman extends Model { use SoftDeletes; @@ -32,6 +37,18 @@ class Tanaman extends Model 'created_by', 'updated_by', 'deleted_by', + + 'umur_tanaman', + 'serangan_hama', + 'penyakit_tanaman', + 'keparahan_serangan', + ]; + + protected $casts = [ + 'kondisi_tanaman' => KondisiTanaman::class, + 'serangan_hama' => SeranganHama::class, + 'penyakit_tanaman' => PenyakitTanaman::class, + 'keparahan_serangan' => KeparahanSerangan::class, ]; public function komoditas() diff --git a/database/migrations/2026_06_28_095941_update_lahan_table.php b/database/migrations/2026_06_28_095941_update_lahan_table.php index cb72450..10653e0 100644 --- a/database/migrations/2026_06_28_095941_update_lahan_table.php +++ b/database/migrations/2026_06_28_095941_update_lahan_table.php @@ -24,7 +24,7 @@ return new class extends Migration $table->integer('jumlah_tanaman')->nullable(); $table->string('kondisi_tanaman')->nullable(); - $table->string('hama_tanaman')->nullable(); + $table->string('serangan_hama')->nullable(); $table->string('penyakit_tanaman')->nullable(); $table->string('keparahan_serangan')->nullable(); @@ -35,10 +35,6 @@ return new class extends Migration Schema::table('petani', function (Blueprint $table) { $table->foreignId('profile_id')->nullable()->constrained('profiles')->onDelete('set null'); }); - - Schema::table('map_petani', function (Blueprint $table) { - $table->foreignId('petani_id')->nullable()->constrained('petani')->onDelete('set null'); - }); } /** diff --git a/database/migrations/2026_07_01_150041_update_tanaman_table.php b/database/migrations/2026_07_01_150041_update_tanaman_table.php new file mode 100644 index 0000000..b51bed8 --- /dev/null +++ b/database/migrations/2026_07_01_150041_update_tanaman_table.php @@ -0,0 +1,32 @@ +foreignId('petani_id')->nullable()->constrained('petani')->onDelete('set null'); + + $table->float('umur_tanaman', 8)->nullable(); + + $table->string('serangan_hama')->nullable(); + $table->string('penyakit_tanaman')->nullable(); + $table->string('keparahan_serangan')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + + } +}; diff --git a/resources/views/produktivitas/petani/lahan/add.blade.php b/resources/views/produktivitas/petani/lahan/add.blade.php index 4a7cc7a..7365af1 100644 --- a/resources/views/produktivitas/petani/lahan/add.blade.php +++ b/resources/views/produktivitas/petani/lahan/add.blade.php @@ -67,7 +67,7 @@