diff --git a/app/Enums/PraktikBudidaya/Bulan.php b/app/Enums/PraktikBudidaya/Bulan.php new file mode 100644 index 0000000..b58fa9d --- /dev/null +++ b/app/Enums/PraktikBudidaya/Bulan.php @@ -0,0 +1,32 @@ +value; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } +} \ No newline at end of file diff --git a/app/Enums/PraktikBudidaya/CaraSortasi.php b/app/Enums/PraktikBudidaya/CaraSortasi.php new file mode 100644 index 0000000..41dd9bb --- /dev/null +++ b/app/Enums/PraktikBudidaya/CaraSortasi.php @@ -0,0 +1,31 @@ + 'Dipilah manual dengan tangan (memilih satu per satu buah/biji yang bagus dan membuang yang rusak)', + self::ALAT_BANTU => 'Menggunakan alat bantu sederhana (tampah, ayakan, atau bak untuk memisahkan kotoran ringan)', + self::PERENDAMAN => 'Metode perendaman/tenggelam (memisahkan buah mengapung dan tenggelam)', + self::GRADING_KRITERIA => 'Grading berdasarkan kriteria (ukuran, warna, atau tingkat kematangan)', + self::PEMBERSIHAN => 'Hanya pembersihan kotoran kasar (membuang dahan atau sampah besar)', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } +} diff --git a/app/Enums/PraktikBudidaya/DasarPenentuanPanen.php b/app/Enums/PraktikBudidaya/DasarPenentuanPanen.php new file mode 100644 index 0000000..eb40d1b --- /dev/null +++ b/app/Enums/PraktikBudidaya/DasarPenentuanPanen.php @@ -0,0 +1,31 @@ + 'Kebutuhan uang mendesak, tanpa mempertimbangkan kematangan', + self::UMUR_TANPA_KONDISI_BUAH => 'Umur/jadwal tetap, tanpa melihat kondisi buah langsung', + self::BUAH_JATUH => 'Buah jatuh/matang pohon (sudah terlalu matang saat dipetik)', + self::TINGKAT_KEPADATAN => 'Bersuara saat diketuk atau tingkat kepadatan buah', + self::WARNA_KULIT_BUAH => 'Warna kulit buah (indikator paling akurat dan konsisten untuk menentukan kematangan optimal)', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } +} diff --git a/app/Enums/PraktikBudidaya/EstimasiKehilanganHasil.php b/app/Enums/PraktikBudidaya/EstimasiKehilanganHasil.php new file mode 100644 index 0000000..a1ac9c5 --- /dev/null +++ b/app/Enums/PraktikBudidaya/EstimasiKehilanganHasil.php @@ -0,0 +1,33 @@ + 'Tidak ada kehilangan', + self::SEDIKIT => 'Sedikit, sekitar 25 % dari total panen', + self::LUMAYAN => 'Lumayan, sekitar 50% dari total panen', + self::BANYAK => 'Banyak, sekitar 75% dari total panen', + self::HAMPIR_SEMUA => 'Hampir semua rusak, lebih dari 75%', + self::TIDAK_TAHU => 'Tidak tahu/sulit memperkirakan', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } +} diff --git a/app/Enums/PraktikBudidaya/PraktikSortasi.php b/app/Enums/PraktikBudidaya/PraktikSortasi.php new file mode 100644 index 0000000..57bfb79 --- /dev/null +++ b/app/Enums/PraktikBudidaya/PraktikSortasi.php @@ -0,0 +1,31 @@ + 'Tidak pernah melakukan sortasi sama sekali', + self::SANGAT_SEDERHANA => 'Sortasi sangat sederhana, hanya membuang yang jelas-jelas rusak/busuk', + self::TIDAK_SETIAP_PANEN => 'Sortasi dilakukan tapi tidak setiap panen (kadang dilakukan, kadang tidak)', + self::SETIAP_PANEN => 'Sortasi dilakukan setiap panen, tapi standarnya belum konsisten', + self::KETAT => 'Sortasi ketat dengan standar yang jelas dan konsisten setiap panen', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } +} diff --git a/app/Enums/PraktikBudidaya/TindakanPanenReject.php b/app/Enums/PraktikBudidaya/TindakanPanenReject.php new file mode 100644 index 0000000..b8ce4f4 --- /dev/null +++ b/app/Enums/PraktikBudidaya/TindakanPanenReject.php @@ -0,0 +1,25 @@ + 'Dibuang', + self::JUAL => 'Dijual ke tempat lain', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } +} diff --git a/app/Enums/PraktikBudidaya/TingkatPanenReject.php b/app/Enums/PraktikBudidaya/TingkatPanenReject.php new file mode 100644 index 0000000..d01aba4 --- /dev/null +++ b/app/Enums/PraktikBudidaya/TingkatPanenReject.php @@ -0,0 +1,31 @@ + 'Sering ditolak, lebih dari 50% hasil panen biasanya ditolak/tidak laku karena mutu', + self::CUKUP_SERING => 'Cukup sering, sekitar 25–50% hasil panen ditolak/tidak laku', + self::KADANG => 'Kadang ditolak, sekitar 10–25% hasil panen', + self::JARANG => 'Jarang ditolak, kurang dari 10% hasil panen', + self::TIDAK_ADA => 'Tidak ada yang ditolak, semua hasil panen sesuai standar pasar utama', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } +} diff --git a/app/Http/Controllers/Web/Produktivitas/PraktikBudidayaController.php b/app/Http/Controllers/Web/Produktivitas/PraktikBudidayaController.php index bf4eb20..262fdce 100644 --- a/app/Http/Controllers/Web/Produktivitas/PraktikBudidayaController.php +++ b/app/Http/Controllers/Web/Produktivitas/PraktikBudidayaController.php @@ -11,6 +11,9 @@ use Illuminate\Validation\Rules\Enum; use App\Models\Pertanian\Petani; use App\Models\Pertanian\PraktikBudidaya; +use App\Models\Pertanian\SurveyPanen; +use App\Models\Pertanian\SurveyProduktivitas; +use App\Models\Pertanian\Komoditas; use App\Enums\PraktikBudidaya\TenagaKerja; use App\Enums\PraktikBudidaya\FrekuensiPemangkasanUtama; @@ -27,6 +30,13 @@ use App\Enums\PraktikBudidaya\PenangananGulma; use App\Enums\PraktikBudidaya\KondisiPengelolaanAir; use App\Enums\PraktikBudidaya\KebutuhanAirPermusim; use App\Enums\PraktikBudidaya\PemahamanManfaatKonservasi; +use App\Enums\PraktikBudidaya\DasarPenentuanPanen; +use App\Enums\PraktikBudidaya\Bulan; +use App\Enums\PraktikBudidaya\PraktikSortasi; +use App\Enums\PraktikBudidaya\CaraSortasi; +use App\Enums\PraktikBudidaya\TingkatPanenReject; +use App\Enums\PraktikBudidaya\TindakanPanenReject; +use App\Enums\PraktikBudidaya\EstimasiKehilanganHasil; class PraktikBudidayaController extends Controller { @@ -86,6 +96,11 @@ class PraktikBudidayaController extends Controller $title = 'Petani - Praktik Budidaya'; $petani = Petani::findOrFail($petaniId); $praktikBudidaya = PraktikBudidaya::where('petani_id', $petaniId)->latest()->first(); + $surveyPanen = SurveyPanen:: where('petani_id', $petaniId)->latest()->first(); + + $komoditas = Komoditas::all(); + + $surveyProduktivitas = SurveyProduktivitas::where('petani_id', $petaniId)->get(); $teknikPemangkasan = $praktikBudidaya->teknik_pemangkasan ?? []; $teknikPemangkasanLainnya = collect($teknikPemangkasan) @@ -116,7 +131,7 @@ class PraktikBudidayaController extends Controller ->first(fn ($item) => !in_array($item, $defaultSistemIrigasi)); if (!empty($praktikBudidaya)) { - return view('produktivitas.petani.praktik-budidaya.edit', compact('title', 'petani', 'praktikBudidaya', 'teknikPemangkasanLainnya', 'alasanTidakPenyerbukanLainnya', 'frekuensiPemupukanLainnya', 'waktuPemberianPupukLainnya', 'caraPemberianPupukLainnya', 'sumberAirLainnya', 'sistemIrigasiLainnya')); + return view('produktivitas.petani.praktik-budidaya.edit', compact('title', 'petani', 'praktikBudidaya', 'surveyPanen', 'komoditas', 'surveyProduktivitas', 'teknikPemangkasanLainnya', 'alasanTidakPenyerbukanLainnya', 'frekuensiPemupukanLainnya', 'waktuPemberianPupukLainnya', 'caraPemberianPupukLainnya', 'sumberAirLainnya', 'sistemIrigasiLainnya')); } return view('produktivitas.petani.praktik-budidaya.add', compact('title', 'petani', 'teknikPemangkasanLainnya', 'alasanTidakPenyerbukanLainnya', 'frekuensiPemupukanLainnya', 'waktuPemberianPupukLainnya', 'caraPemberianPupukLainnya')); @@ -184,6 +199,8 @@ class PraktikBudidayaController extends Controller '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), + 'created_by' => auth()->id(), + 'updated_by' => auth()->id(), ]); return redirect()->route('petani.praktik-budidaya.edit', [$petani->id , $praktikBudidaya->id]) @@ -246,6 +263,11 @@ class PraktikBudidayaController extends Controller $title = 'Petani - Praktik Budidaya'; $petani = Petani::findOrFail($petaniId); $praktikBudidaya = PraktikBudidaya::where('petani_id', $petaniId)->where('id', $praktikBudidayaId)->latest()->first(); + $surveyPanen = SurveyPanen:: where('petani_id', $petaniId)->latest()->first(); + + $komoditas = Komoditas::all(); + + $surveyProduktivitas = SurveyProduktivitas::where('petani_id', $petaniId)->get(); $teknikPemangkasan = $praktikBudidaya->teknik_pemangkasan ?? []; $teknikPemangkasanLainnya = collect($teknikPemangkasan) @@ -275,7 +297,7 @@ class PraktikBudidayaController extends Controller $sistemIrigasiLainnya = collect(explode(', ', $sistemIrigasi)) ->first(fn ($item) => !in_array($item, $defaultSistemIrigasi)); - return view('produktivitas.petani.praktik-budidaya.edit', compact('title', 'petani', 'praktikBudidaya', 'teknikPemangkasanLainnya', 'alasanTidakPenyerbukanLainnya', 'frekuensiPemupukanLainnya', 'waktuPemberianPupukLainnya', 'caraPemberianPupukLainnya', 'sumberAirLainnya', 'sistemIrigasiLainnya')); + return view('produktivitas.petani.praktik-budidaya.edit', compact('title', 'petani', 'praktikBudidaya', 'surveyPanen', 'komoditas', 'surveyProduktivitas', 'teknikPemangkasanLainnya', 'alasanTidakPenyerbukanLainnya', 'frekuensiPemupukanLainnya', 'waktuPemberianPupukLainnya', 'caraPemberianPupukLainnya', 'sumberAirLainnya', 'sistemIrigasiLainnya')); } public function update($petaniId, $praktikBudidayaId, Request $request) @@ -284,8 +306,6 @@ class PraktikBudidayaController extends Controller abort(403); } - // dd($request->all()); - $praktikBudidaya = PraktikBudidaya::where('petani_id', $petaniId) ->where('id', $praktikBudidayaId) ->firstOrFail(); @@ -358,9 +378,43 @@ class PraktikBudidayaController extends Controller 'kebiasaan_konservasi_tanah.*' => ['string'], 'pemahaman_manfaat_konservasi' => ['nullable', 'string', new Enum(PemahamanManfaatKonservasi::class)], + + 'upah_tenaga_kerja' => ['nullable', 'numeric'], + 'biaya_bibit' => ['nullable', 'numeric'], + 'biaya_pupuk' => ['nullable', 'numeric'], + 'biaya_pestisida' => ['nullable', 'numeric'], + 'biaya_sewa_alat' => ['nullable', 'numeric'], + 'biaya_penyediaan_air' => ['nullable', 'numeric'], + 'biaya_lainnya' => ['nullable', 'numeric'], + 'total_estimasi_biaya_produksi' => ['nullable', 'numeric'], + + 'dasar_penentuan_panen' => ['nullable', 'integer', new Enum(DasarPenentuanPanen::class)], + 'frekuensi_panen_pertahun' => ['nullable', 'integer'], + 'bulan_panen_utama' => ['nullable', 'string', new Enum(Bulan::class)], + 'hasil_komoditas_utama_permusim' => ['nullable', 'numeric'], + 'hasil_komoditas_lainnya_permusim' => ['nullable', 'numeric'], + 'disimpan_untuk_sendiri' => ['nullable', 'boolean'], + 'hasil_panen_disimpan' => ['nullable', 'numeric'], + 'tujuan_disimpan' => ['nullable', 'string'], + + 'praktik_sortasi' => ['nullable', 'integer', new Enum(PraktikSortasi::class)], + 'bentuk_sortasi' => ['nullable', 'string', new Enum(CaraSortasi::class)], + 'tingkat_reject' => ['nullable', 'integer', new Enum(TingkatPanenReject::class)], + 'hasil_panen_reject' => ['nullable', 'numeric'], + 'tindakan_hasil_reject' => ['nullable', 'string', new Enum(TindakanPanenReject::class)], + 'upah_tenaga_panen' => ['nullable', 'numeric'], + 'biaya_pengangkutan' => ['nullable', 'numeric'], + 'biaya_wadah_kemasan' => ['nullable', 'numeric'], + 'biaya_sewa_alat_panen' => ['nullable', 'numeric'], + 'biaya_panen_lainnya' => ['nullable', 'numeric'], + 'total_estimasi_biaya_panen' => ['nullable', 'numeric'], + + 'estimasi_kehilangan_akibat_opt' => ['nullable', 'string', new Enum(EstimasiKehilanganHasil::class)], + 'estimasi_kehilangan_akibat_hama' => ['nullable', 'string', new Enum(EstimasiKehilanganHasil::class)], ]); - $data = []; + $dataPraktikBudidaya = []; + $dataSurveyPanen = []; $petani = Petani::findOrFail($petaniId); @@ -372,7 +426,7 @@ class PraktikBudidayaController extends Controller $teknik_pemangkasan[] = $request->teknik_pemangkasan_lainnya; } } - $data = [ + $dataPraktikBudidaya = [ 'tenaga_kerja' => $validatedData['tenaga_kerja'], 'frekuensi_pemangkasan_utama' => $validatedData['frekuensi_pemangkasan_komoditas_utama'], @@ -393,7 +447,7 @@ class PraktikBudidayaController extends Controller } if ($request->has('metode_penanganan_hama_penyakit')) { - $data = [ + $dataPraktikBudidaya = [ 'metode_penanganan_opt' => $validatedData['metode_penanganan_hama_penyakit'] ?? null, 'jenis_hama' => $validatedData['jenis_hama'] ?? [], 'jenis_penyakit' => $validatedData['jenis_penyakit'] ?? [], @@ -413,7 +467,75 @@ class PraktikBudidayaController extends Controller ]; } - $praktikBudidaya->update($data); + if ($request->has('upah_tenaga_kerja')) { + $dataPraktikBudidaya = [ + 'upah_tenaga_kerja' => $validatedData['upah_tenaga_kerja'] ?? null, + 'biaya_bibit' => $validatedData['biaya_bibit'] ?? null, + 'biaya_pupuk' => $validatedData['biaya_pupuk'] ?? null, + 'biaya_pestisida' => $validatedData['biaya_pestisida'] ?? null, + 'biaya_sewa_alat_produksi' => $validatedData['biaya_sewa_alat'] ?? null, + 'biaya_penyediaan_air' => $validatedData['biaya_penyediaan_air'] ?? null, + 'biaya_produksi_lainnya' => $validatedData['biaya_lainnya'] ?? null, + 'total_estimasi_biaya_produksi' => $validatedData['total_estimasi_biaya_produksi'] ?? null, + ]; + } + + if ($request->has('dasar_penentuan_panen')) { + $dataSurveyPanen = [ + 'dasar_penentuan_panen' => $validatedData['dasar_penentuan_panen'] ?? null, + 'frekuensi_panen_pertahun' => $validatedData['frekuensi_panen_pertahun'] ?? null, + 'bulan_panen_utama' => $validatedData['bulan_panen_utama'] ?? null, + 'hasil_komoditas_utama_permusim' => $validatedData['hasil_komoditas_utama_permusim'] ?? null, + 'hasil_komoditas_lainnya_permusim' => $validatedData['hasil_komoditas_lainnya_permusim'] ?? null, + 'disimpan_untuk_sendiri' => $validatedData['disimpan_untuk_sendiri'] ?? false, + 'hasil_panen_disimpan' => $validatedData['hasil_panen_disimpan'] ?? null, + 'tujuan_disimpan' => $validatedData['tujuan_disimpan'] ?? null, + ]; + } + + if ($request->has('praktik_sortasi')) { + $dataSurveyPanen = [ + 'praktik_sortasi' => $validatedData['praktik_sortasi'] ?? null, + 'bentuk_sortasi' => $validatedData['bentuk_sortasi'] ?? null, + 'hasil_panen_reject' => $validatedData['tingkat_reject'] ?? null, + 'jumlah_panen_reject' => $validatedData['hasil_panen_reject'] ?? null, + 'tindakan_panen_reject' => $validatedData['tindakan_hasil_reject'] ?? null, + 'upah_tenaga_panen' => $validatedData['upah_tenaga_panen'] ?? null, + 'biaya_pengangkutan_panen' => $validatedData['biaya_pengangkutan'] ?? null, + 'biaya_wadah_panen' => $validatedData['biaya_wadah_kemasan'] ?? null, + 'biaya_sewa_alat_panen' => $validatedData['biaya_sewa_alat_panen'] ?? null, + 'biaya_panen_lainnya' => $validatedData['biaya_panen_lainnya'] ?? null, + 'total_estimasi_biaya_panen' => $validatedData['total_estimasi_biaya_panen'] ?? null, + ]; + } + + if ($request->has('estimasi_kehilangan_akibat_opt')) { + $dataSurveyPanen = [ + 'estimasi_kehilangan_akibat_opt' => $validatedData['estimasi_kehilangan_akibat_opt'] ?? null, + 'estimasi_kehilangan_akibat_hama_penyakit' => $validatedData['estimasi_kehilangan_akibat_hama'] ?? null, + ]; + } + + if (!empty($dataPraktikBudidaya)) { + $dataPraktikBudidaya['updated_by'] = auth()->id(); + $praktikBudidaya->update($dataPraktikBudidaya); + } + + if (!empty($dataSurveyPanen)) { + $surveyPanen = SurveyPanen::where('petani_id', $petani->id)->first(); + + if ($surveyPanen) { + $dataSurveyPanen['updated_by'] = auth()->id(); + $surveyPanen->update($dataSurveyPanen); + } else { + SurveyPanen::create(array_merge([ + 'uid' => 'SP-' . strtoupper(Str::random(10)), + 'petani_id' => $petani->id, + 'created_by' => auth()->id(), + 'updated_by_by' => auth()->id() + ], $dataSurveyPanen)); + } + } return back()->with('success', 'Data berhasil diperbarui.'); } diff --git a/app/Http/Controllers/Web/Produktivitas/SurveyProduktivitasController.php b/app/Http/Controllers/Web/Produktivitas/SurveyProduktivitasController.php new file mode 100644 index 0000000..9968982 --- /dev/null +++ b/app/Http/Controllers/Web/Produktivitas/SurveyProduktivitasController.php @@ -0,0 +1,50 @@ +all()); + $validated = $request->validate([ + 'produktivitas_komoditas' => ['required', 'array'], + 'produktivitas_komoditas.*.komoditas_id' => ['nullable', 'exists:master_komoditas,id'], + 'produktivitas_komoditas.*.hasil_panen_3_musim' => ['nullable', 'numeric'], + 'produktivitas_komoditas.*.satuan' => ['nullable', 'string'], + ]); + foreach ($validated['produktivitas_komoditas'] as $row) { + SurveyProduktivitas::create([ + 'uid' => 'SPV-' . strtoupper(Str::random(10)), + 'petani_id' => $petani->id, + 'komoditas_id' => $row['komoditas_id'], + 'kuantitas' => $row['hasil_panen_3_musim'], + 'satuan' => $row['satuan'], + 'created_by' => auth()->id(), + 'updated_by' => auth()->id(), + ]); + } + + return back()->with('success', 'Data produktivitas berhasil disimpan.'); + } + + public function destroy($petaniId, $surveyProduktivitasId) + { + $surveyProduktivitas = SurveyProduktivitas::where('petani_id', $petaniId) + ->where('id', $surveyProduktivitasId) + ->firstOrFail(); + $surveyProduktivitas->deleted_by = auth()->id(); + $surveyProduktivitas->save(); + $surveyProduktivitas->delete(); + + return back()->with('success', 'Data produktivitas berhasil dihapus.'); + } +} diff --git a/app/Models/Pertanian/Petani.php b/app/Models/Pertanian/Petani.php index 243cb89..b7a2184 100644 --- a/app/Models/Pertanian/Petani.php +++ b/app/Models/Pertanian/Petani.php @@ -78,16 +78,21 @@ class Petani extends Model return $this->belongsTo(User::class, 'user_id'); } - public function praktik_budidaya(): HasOne - { - return $this->hasOne(PraktikBudidaya::class, 'petani_id'); - } - public function praktikBudidaya(): HasOne { return $this->hasOne(PraktikBudidaya::class, 'petani_id')->latestOfMany(); } + public function surveyPanen(): HasOne + { + return $this->hasOne(surveyPanen::class, 'petani_id')->latestOfMany(); + } + + public function surveyProduktivitas(): HasOne + { + return $this->hasOne(surveyProduktivitas::class, 'petani_id')->latestOfMany(); + } + public function lahans(): HasMany { return $this->hasMany(Lahan::class, 'petani_id'); diff --git a/app/Models/Pertanian/PraktikBudidaya.php b/app/Models/Pertanian/PraktikBudidaya.php index d9ed8cf..d90099a 100644 --- a/app/Models/Pertanian/PraktikBudidaya.php +++ b/app/Models/Pertanian/PraktikBudidaya.php @@ -56,8 +56,17 @@ class PraktikBudidaya extends Model 'kebutuan_air_permusim', 'kebiasaan_konservasi_tanah', 'pemahaman_manfaat_konservasi_tanah', - // 'nilai_konservasi_tanah', - // 'upah_tenaga_kerja' + 'upah_tenaga_kerja', + 'biaya_bibit', + 'biaya_pupuk', + 'biaya_obat_obatan', + 'biaya_sewa_alat', + 'biaya_penyediaan_air', + 'biaya_lainnya', + 'total_estimasi_biaya_produksi', + 'created_by', + 'updated_by', + 'deleted_by', ]; public function petani(): BelongsTo diff --git a/app/Models/Pertanian/SurveyPanen.php b/app/Models/Pertanian/SurveyPanen.php new file mode 100644 index 0000000..04a4c18 --- /dev/null +++ b/app/Models/Pertanian/SurveyPanen.php @@ -0,0 +1,51 @@ +belongsTo(Petani::class, 'petani_id'); + } +} diff --git a/app/Models/Pertanian/SurveyProduktivitas.php b/app/Models/Pertanian/SurveyProduktivitas.php new file mode 100644 index 0000000..cbacdc5 --- /dev/null +++ b/app/Models/Pertanian/SurveyProduktivitas.php @@ -0,0 +1,31 @@ +belongsTo(Petani::class, 'petani_id'); + } +} diff --git a/database/migrations/2026_06_29_141634_create_praktik_budidaya_table.php b/database/migrations/2026_06_29_141634_create_praktik_budidaya_table.php index 4c1fa6b..0cac968 100644 --- a/database/migrations/2026_06_29_141634_create_praktik_budidaya_table.php +++ b/database/migrations/2026_06_29_141634_create_praktik_budidaya_table.php @@ -41,7 +41,6 @@ return new class extends Migration $table->string('waktu_kemunculan_terparah')->nullable(); $table->string('metode_paling_sering_dilakukan')->nullable(); $table->integer('volume_obat_obatan_permusim')->nullable(); - $table->string('satuan_volume_obat_obatan')->nullable(); // 2.6 Sanitasi Kebun $table->integer('frekuensi_sanitasi_lahan')->nullable(); $table->string('penanganan_sisa_buah_ranting')->nullable(); @@ -53,24 +52,19 @@ return new class extends Migration $table->string('kebutuhan_air_permusim')->nullable(); // 2.8 Praktik konservasi tanah - $table->string('praktik_konservasi_tanah')->nullable(); + $table->string('kebiasaan_konservasi_tanah')->nullable(); $table->string('pemahaman_manfaat_konservasi_tanah')->nullable(); $table->integer('nilai_konservasi_tanah')->nullable(); // 2.9 Struktur Biaya Produksi Per Musim - $table->decimal('upah_tenaga_kerja', 10, 2)->nullable(); - $table->decimal('biaya_bibit', 10, 2)->nullable(); - $table->decimal('biaya_pupuk', 10, 2)->nullable(); - $table->decimal('biaya_obat_obatan', 10, 2)->nullable(); - $table->decimal('biaya_sewa_alat', 10, 2)->nullable(); - $table->decimal('biaya_penyediaan_air', 10, 2)->nullable(); - $table->decimal('biaya_lainnya', 10, 2)->nullable(); - $table->decimal('total_estimasi_biaya', 10, 2)->nullable(); - - // K4 Produktivitas - // 4.3 Kehilangan Akibat OPT - $table->string('estimasi_kehilangan_akibat_opt')->nullable(); - $table->string('estimasi_kehilangan_akibat_hama_penyakit')->nullable(); + $table->decimal('upah_tenaga_kerja', 13, 2)->nullable(); + $table->decimal('biaya_bibit', 13, 2)->nullable(); + $table->decimal('biaya_pupuk', 13, 2)->nullable(); + $table->decimal('biaya_obat_obatan', 13, 2)->nullable(); + $table->decimal('biaya_sewa_alat_produksi', 13, 2)->nullable(); + $table->decimal('biaya_penyediaan_air', 13, 2)->nullable(); + $table->decimal('biaya_produksi_lainnya', 13, 2)->nullable(); + $table->decimal('total_estimasi_biaya_produksi', 13, 2)->nullable(); $table->foreignId('created_by')->nullable()->constrained('users')->onDelete('set null'); $table->foreignId('updated_by')->nullable()->constrained('users')->onDelete('set null'); @@ -79,35 +73,36 @@ return new class extends Migration $table->softDeletes(); }); - Schema::create('panen', function (Blueprint $table) { + Schema::create('survey_panen', function (Blueprint $table) { $table->id(); $table->string('uid')->unique(); $table->foreignId('petani_id')->nullable()->constrained('petani')->onDelete('set null'); // K3 PANEN & PENANGANAN AWAL // 3.1 Cara Menetukan Kematangan - $table->integer('cara_menetukan_kematangan')->nullable(); + $table->integer('dasar_penentuan_panen')->nullable(); // 3.2 Frekuensi Panen $table->integer('frekuensi_panen_pertahun')->nullable(); $table->string('bulan_panen_utama')->nullable(); // 3.4 Hasil Panen Aktual - $table->decimal('hasil_komoditas_utama_permusim_kg', 10, 2)->nullable(); - $table->decimal('hasil_komoditas_lainnya_permusim_kg', 10, 2)->nullable(); - $table->string('tujuan_panen')->nullable(); + $table->decimal('hasil_komoditas_utama_permusim', 10, 2)->nullable(); + $table->decimal('hasil_komoditas_lainnya_permusim', 10, 2)->nullable(); + $table->boolean('disimpan_untuk_sendiri')->nullable(); + $table->decimal('hasil_panen_disimpan', 10, 2)->nullable(); + $table->string('tujuan_disimpan')->nullable(); // 3.5 Penanganan Awal Setelah Panen $table->integer('praktik_sortasi')->nullable(); $table->string('bentuk_sortasi')->nullable(); // 3.8 Hasil Panen Reject & Estimasi Biaya Panen $table->integer('hasil_panen_reject')->nullable(); $table->string('jumlah_panen_reject')->nullable(); - $table->string('tindakan_terhadap_panen_reject')->nullable(); - $table->decimal('estimasi_biaya_panen', 10, 2)->nullable(); - $table->decimal('upah_tenaga_panen', 10, 2)->nullable(); - $table->decimal('biaya_pengangkutan', 10, 2)->nullable(); - $table->decimal('biaya_wadah', 10, 2)->nullable(); - $table->decimal('biaya_sewa_alat', 10, 2)->nullable(); - $table->decimal('biaya_lainnya', 10, 2)->nullable(); - $table->decimal('total_estimasi_biaya_panen', 10, 2)->nullable(); + $table->string('tindakan_panen_reject')->nullable(); + $table->decimal('upah_tenaga_panen', 13, 2)->nullable(); + $table->decimal('biaya_pengangkutan_panen', 13, 2)->nullable(); + $table->decimal('biaya_wadah-Panen', 13, 2)->nullable(); + $table->decimal('biaya_sewa_alat_panen', 13, 2)->nullable(); + $table->decimal('biaya_panen_lainnya', 13, 2)->nullable(); + $table->decimal('total_estimasi_biaya_panen', 13, 2)->nullable(); // K4 Produktivitas // 4.3 Kehilangan Akibat OPT $table->string('estimasi_kehilangan_akibat_opt')->nullable(); @@ -120,43 +115,13 @@ return new class extends Migration $table->softDeletes(); }); - Schema::create('produktivitas', function (Blueprint $table) { + Schema::create('survey_produktivitas', function (Blueprint $table) { $table->id(); $table->string('uid')->unique(); $table->foreignId('petani_id')->nullable()->constrained('petani')->onDelete('set null'); $table->foreignId('komoditas_id')->nullable()->constrained('master_komoditas')->onDelete('set null'); - $table->foreignId('jenis_komoditas_id')->nullable()->constrained('jenis_komoditas')->onDelete('set null'); - $table->foreignId('varietas_id')->nullable()->constrained('master_varietas')->onDelete('set null'); - $table->decimal('kuantitas_pertahun', 10, 2)->nullable(); - $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(); - }); - - Schema::create('pelatihan', function (Blueprint $table) { - $table->id(); - $table->string('uid')->unique(); - $table->foreignId('petani_id')->nullable()->constrained('petani')->onDelete('set null'); - $table->string('jenis_pelatihan'); - $table->string('penyelenggara'); - $table->date('tahun_pelaksanaan'); - $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(); - }); - - Schema::create('sertifikasi', function (Blueprint $table) { - $table->id(); - $table->string('uid')->unique(); - $table->foreignId('petani_id')->nullable()->constrained('petani')->onDelete('set null'); - $table->string('jenis_sertifikasi'); - $table->string('lembaga_penerbit'); - $table->date('tahun_pelaksanaan'); - $table->boolean('is_aktif')->default(false); + $table->decimal('kuantitas')->nullable(); + $table->string('satuan')->nullable(); $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'); @@ -171,8 +136,7 @@ return new class extends Migration public function down(): void { Schema::dropIfExists('praktik_budidaya'); - Schema::dropIfExists('pelatihan'); - Schema::dropIfExists('sertifikasi'); + Schema::dropIfExists('survey_panen'); Schema::dropIfExists('produktivitas'); } }; diff --git a/resources/views/produktivitas/petani/praktik-budidaya/edit.blade.php b/resources/views/produktivitas/petani/praktik-budidaya/edit.blade.php index 054d1e9..0d767d9 100644 --- a/resources/views/produktivitas/petani/praktik-budidaya/edit.blade.php +++ b/resources/views/produktivitas/petani/praktik-budidaya/edit.blade.php @@ -16,6 +16,13 @@ @use('App\Enums\PraktikBudidaya\KondisiPengelolaanAir') @use('App\Enums\PraktikBudidaya\KebutuhanAirPermusim') @use('App\Enums\PraktikBudidaya\PemahamanManfaatKonservasi') +@use('App\Enums\PraktikBudidaya\DasarPenentuanPanen') +@use('App\Enums\PraktikBudidaya\Bulan') +@use('App\Enums\PraktikBudidaya\PraktikSortasi') +@use('App\Enums\PraktikBudidaya\CaraSortasi') +@use('App\Enums\PraktikBudidaya\EstimasiKehilanganHasil') +@use('App\Enums\PraktikBudidaya\TingkatPanenReject') +@use('App\Enums\PraktikBudidaya\TindakanPanenReject')
@if ($errors->any())
@@ -704,7 +711,7 @@
-
-
@error('biaya_sewa_alat') @@ -1106,7 +1117,7 @@ class="form-control rupiah-input @error('biaya_lainnya') is-invalid @enderror" id="biaya-lainnya" name="biaya_lainnya" - value="{{ old('biaya_lainnya', filled($praktikBudidaya->biaya_lainnya) ? number_format($praktikBudidaya->biaya_lainnya, 0, ',', '.') : '') }}" + value="{{ old('biaya_lainnya', filled($praktikBudidaya->biaya_produksi_lainnya) ? number_format($praktikBudidaya->biaya_produksi_lainnya, 0, ',', '.') : '') }}" placeholder="Contoh: 150.000">
@error('biaya_lainnya') @@ -1135,11 +1146,14 @@
- - - - + @foreach (DasarPenentuanPanen::options() as $option) + + @endforeach @error('dasar_penentuan_panen')
{{ $message }}
@enderror
@@ -1150,15 +1164,15 @@ -
- + value="{{ old('frekuensi_panen_pertahun', $surveyPanen->frekuensi_panen_pertahun) }}" + step="0.01" + min="0"> Panen/Tahun
@@ -1168,49 +1182,61 @@
- - @error('bulan_panen_utama')
{{ $message }}
@enderror + + + + @error('bulan_panen_utama') +
{{ $message }}
+ @enderror
Hasil Panen Aktual
-
-
-
- - +
+
- - Kg/Tahun + value="{{ old('hasil_panen_disimpan', $surveyPanen->hasil_panen_disimpan) }}" + step="0.01" + min="0"> + Kg/Musim
@error('hasil_panen_disimpan') @@ -1260,8 +1289,8 @@ @enderror
- - + + @error('tujuan_disimpan')
{{ $message }}
@enderror
@@ -1283,19 +1312,27 @@
- - - + @foreach (PraktikSortasi::options() as $option) + + @endforeach @error('praktik_sortasi')
{{ $message }}
@enderror
- - - + @foreach (CaraSortasi::options() as $option) + + @endforeach @error('bentuk_sortasi')
{{ $message }}
@enderror
@@ -1303,34 +1340,146 @@
Hasil Panen Reject & Estimasi Biaya Panen
- - - @error('upah_tenaga_panen')
{{ $message }}
@enderror + + + @error('praktik_sortasi')
{{ $message }}
@enderror
- - - @error('biaya_pengangkutan')
{{ $message }}
@enderror + +
+ + Kg/Musim +
+ + @error('hasil_panen_reject') +
{{ $message }}
+ @enderror
- - - @error('biaya_wadah_kemasan')
{{ $message }}
@enderror + + + @error('bentuk_sortasi')
{{ $message }}
@enderror
- - - @error('biaya_sewa_alat_panen')
{{ $message }}
@enderror -
-
- - - @error('biaya_panen_lainnya')
{{ $message }}
@enderror + +
+ Rp + +
+ @error('upah_tenaga_panen') +
{{ $message }}
+ @enderror
- - - @error('total_estimasi_biaya_panen')
{{ $message }}
@enderror + +
+ Rp + +
+ @error('biaya_pengangkutan') +
{{ $message }}
+ @enderror +
+
+ +
+ Rp + +
+ @error('biaya_wadah_kemasan') +
{{ $message }}
+ @enderror +
+
+ +
+ Rp + +
+ @error('biaya_sewa_alat_panen') +
{{ $message }}
+ @enderror +
+
+ +
+ Rp + +
+ @error('biaya_panen_lainnya') +
{{ $message }}
+ @enderror +
+
+ +
+ Rp + +
+ @error('total_estimasi_biaya_panen') +
{{ $message }}
+ @enderror
@@ -1347,48 +1496,105 @@
Produktivitas Rata-rata 3 Musim Panen Terakhir per Komoditas
-
+ {{-- DATA LAMA --}} + @if ($surveyProduktivitas->count() > 0) + @foreach ($surveyProduktivitas as $row) +
+
+ + +
+ +
+ +
+ + Kg +
+
+ +
+ + +
+ +
+ + @csrf + @method('DELETE') + + +
+
+ @endforeach + @endif + + {{-- FORM TAMBAH DATA BARU --}} +
+ @csrf +
+
- + @foreach ($komoditas as $item) + + @endforeach
+
- + Kg
+
-
+ +
-
+ Ha/Tahun + + +
+ Pohon/Tahun +
+
- - +
+

-
- -
+ +
+ + +
@@ -1401,56 +1607,32 @@
Kehilangan Hasil Akibat Organisme Pengganggu Tumbuhan (OPT)
- - -
- estimasi_kehilangan_hasil) == 'Selalu, setiap musim berbunga' ? 'checked' : '' }}> - -
- -
- estimasi_kehilangan_hasil) == 'Kadang-kadang, tergantung kondisi' ? 'checked' : '' }}> - -
- -
- estimasi_kehilangan_hasil) == 'Tidak pernah' ? 'checked' : '' }}> - -
- -
- estimasi_kehilangan_hasil) == 'Lainnya' ? 'checked' : '' }}> - - - - -
- - @error('estimasi_kehilangan_hasil') + + + @error('estimasi_kehilangan_akibat_opt') +
{{ $message }}
+ @enderror +
+
+ + + @error('estimasi_kehilangan_akibat_hama')
{{ $message }}
@enderror
@@ -1474,7 +1656,7 @@ 'use strict'; $(document).ready(function () { - $('#tenaga-kerja, #frekuensi-pemangkasan-komoditas-utama, #frekuensi-pemangkasan-pohon-penaung, #penyerbukan-manual, #pemberian-pupuk, #jenis-pupuk, #metode-penanganan-hama-penyakit, #intensitas-serangan, #waktu-kemunculan-terparah, #frekuensi-sanitasi-lahan, #penanganan-sisa-buah-ranting, #penanganan-gulma, #kondisi-pengelolaan-air-irigasi, #kebutuhan-air-permusim, #pemahaman-manfaat-konservasi').select2(); + $('#tenaga-kerja, #frekuensi-pemangkasan-komoditas-utama, #frekuensi-pemangkasan-pohon-penaung, #penyerbukan-manual, #pemberian-pupuk, #jenis-pupuk, #metode-penanganan-hama-penyakit, #intensitas-serangan, #waktu-kemunculan-terparah, #frekuensi-sanitasi-lahan, #penanganan-sisa-buah-ranting, #penanganan-gulma, #kondisi-pengelolaan-air-irigasi, #kebutuhan-air-permusim, #pemahaman-manfaat-konservasi, #dasar-penentuan-panen, #praktik-sortasi, #bentuk-sortasi, #estimasi-kehilangan-akibat-opt, #tingkat-reject, #tindakan-hasil-reject, #estimasi-kehilangan-akibat-hama, #komoditas-id').select2(); const $switch = $('input[name="disimpan_untuk_diri_sendiri"]'); const $text = $('#switch-text'); @@ -1586,4 +1768,16 @@ }); }); + @endpush \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index ef59acf..63cbb36 100644 --- a/routes/web.php +++ b/routes/web.php @@ -195,6 +195,7 @@ Route::middleware('auth') Route::resource('petani.lahan-tanaman', App\Http\Controllers\Web\Produktivitas\PetaniLahanController::class)->whereNumber('petani'); Route::resource('petani.lahan-tanaman.tanaman', App\Http\Controllers\Web\Produktivitas\PetaniLahanTanamanController::class)->only(['show', 'update', 'destroy'])->whereNumber('petani'); Route::resource('petani.praktik-budidaya', App\Http\Controllers\Web\Produktivitas\PraktikBudidayaController::class)->whereNumber('petani'); + Route::resource('petani.survey-produktivitas', App\Http\Controllers\Web\Produktivitas\SurveyProduktivitasController::class)->only(['store', 'destroy']); Route::resource('petani.pendidikan-pelatihan', App\Http\Controllers\Web\Produktivitas\PendidikanPelatihanController::class); Route::resource('petani.sosial-ekonomi', App\Http\Controllers\Web\Produktivitas\SosialEkonomiController::class)->whereNumber('petani'); Route::resource('petani.akses-pasar', App\Http\Controllers\Web\Produktivitas\AksesPasarController::class)->whereNumber('petani');