This commit is contained in:
2026-07-07 21:35:59 +07:00
43 changed files with 3743 additions and 513 deletions
+14
View File
@@ -0,0 +1,14 @@
<?php
namespace App\Enums;
enum KategoriPendapatanKomoditas: string
{
case UTAMA = 'utama';
case LAINNYA = 'lainnya';
public static function values(): array
{
return array_column(self::cases(), 'value');
}
}
+14
View File
@@ -0,0 +1,14 @@
<?php
namespace App\Enums;
enum PeriodePendapatan: string
{
case MUSIM = 'musim';
case TAHUN = 'tahun';
public static function values(): array
{
return array_column(self::cases(), 'value');
}
}
+27
View File
@@ -0,0 +1,27 @@
<?php
namespace App\Enums;
enum PihakMembantuKonflik: string
{
case TIDAK_ADA_SELESAIKAN_SENDIRI = 'Tidak ada-selesaikan sendiri';
case ADA = 'Ada';
public function label(): string
{
return $this->value;
}
public static function options(): array
{
return collect(self::cases())->map(fn ($case) => [
'value' => $case->value,
'label' => $case->label(),
])->toArray();
}
public static function values(): array
{
return array_column(self::cases(), 'value');
}
}
@@ -0,0 +1,31 @@
<?php
namespace App\Enums\PraktikBudidaya;
enum FrekuensiPemangkasanPendamping: string
{
case TIDAK_PERNAH = 'Tidak pernah memangkas sama sekali';
case TIDAK_RUTIN = 'Memangkas, tapi tidak rutin dan tidak tahu tekniknya';
case SATU_KALI_TAHUN = 'Memangkas 1 kali/tahun, tahu jenis tekniknya';
case DUA_KALI_TAHUN = 'Memangkas 2 kali/tahun, tahu jenis tekniknya';
case LEBIH_DUA_KALI_TAHUN = 'Memangkas lebih dari 2 kali/tahun dengan teknik yang tepat dan pohon penaung juga dipangkas rutin';
public function label(): string
{
return match($this) {
self::TIDAK_PERNAH => 'Tidak pernah memangkas sama sekali',
self::TIDAK_RUTIN => 'Memangkas, tapi tidak rutin dan tidak tahu tekniknya',
self::SATU_KALI_TAHUN => 'Memangkas 1 kali/tahun, tahu jenis tekniknya',
self::DUA_KALI_TAHUN => 'Memangkas 2 kali/tahun, tahu jenis tekniknya',
self::LEBIH_DUA_KALI_TAHUN => 'Memangkas lebih dari 2 kali/tahun dengan teknik yang tepat dan pohon penaung juga dipangkas rutin',
};
}
public static function options(): array
{
return collect(self::cases())->map(fn ($case) => [
'value' => $case->value,
'label' => $case->label(),
])->toArray();
}
}
@@ -0,0 +1,31 @@
<?php
namespace App\Enums\PraktikBudidaya;
enum FrekuensiPemangkasanUtama: int
{
case TIDAK_PERNAH = 1;
case TIDAK_RUTIN = 2;
case SATU_KALI_TAHUN = 3;
case DUA_KALI_TAHUN = 4;
case LEBIH_DUA_KALI_TAHUN = 5;
public function label(): string
{
return match($this) {
self::TIDAK_PERNAH => 'Tidak pernah memangkas sama sekali',
self::TIDAK_RUTIN => 'Memangkas, tapi tidak rutin dan tidak tahu tekniknya',
self::SATU_KALI_TAHUN => 'Memangkas 1 kali/tahun, tahu jenis tekniknya',
self::DUA_KALI_TAHUN => 'Memangkas 2 kali/tahun, tahu jenis tekniknya',
self::LEBIH_DUA_KALI_TAHUN => 'Memangkas lebih dari 2 kali/tahun dengan teknik yang tepat dan pohon penaung juga dipangkas rutin',
};
}
public static function options(): array
{
return collect(self::cases())->map(fn ($case) => [
'value' => $case->value,
'label' => $case->label(),
])->toArray();
}
}
@@ -0,0 +1,31 @@
<?php
namespace App\Enums\PraktikBudidaya;
enum FrekuensiSanitasiLahan: int
{
case TIDAK_PERNAH = 1;
case SESEKALI = 2;
case SETIAP_PANEN = 3;
case RUTIN_TIDAK_TERJADWAL = 4;
case RUTIN_TERJADWAL = 5;
public function label(): string
{
return match($this) {
self::TIDAK_PERNAH => 'Tidak pernah',
self::SESEKALI => 'Sesekali, tidak terjadwal',
self::SETIAP_PANEN => 'Setiap panen, tapi tidak menyeluruh',
self::RUTIN_TIDAK_TERJADWAL => 'Rutin, tapi tanpa jadwal yang jelas',
self::RUTIN_TERJADWAL => 'Rutin terjadwal dan menyeluruh',
};
}
public static function options(): array
{
return collect(self::cases())->map(fn ($case) => [
'value' => $case->value,
'label' => $case->label(),
])->toArray();
}
}
@@ -0,0 +1,34 @@
<?php
namespace App\Enums\PraktikBudidaya;
enum IntensitasSeranganHamaPenyakit: string
{
case RINGAN = 'Ringan - hanya beberapa tanaman terdampak';
case SEDANG = 'Sedang - sebagian tanaman terdampak';
case PARAH = 'Parah - sebagian besar tanaman terdampak';
case BERVARIASI = 'Bervariasi - tergantung musim';
public function label(): string
{
return match($this) {
self::RINGAN => 'Ringan - hanya beberapa tanaman terdampak',
self::SEDANG => 'Sedang - sebagian tanaman terdampak',
self::PARAH => 'Parah - sebagian besar tanaman terdampak',
self::BERVARIASI => 'Bervariasi - tergantung musim',
};
}
public static function values(): array
{
return collect(self::cases())->map(fn ($case) => $case->value)->toArray();
}
public static function options(): array
{
return collect(self::cases())->map(fn ($case) => [
'value' => $case->value,
'label' => $case->label(),
])->toArray();
}
}
+29
View File
@@ -0,0 +1,29 @@
<?php
namespace App\Enums\PraktikBudidaya;
enum JenisPupuk: string
{
case TIDAK_MEMBERI = 'Tidak memberi pupuk';
case ORGANIK = 'Pupuk organik (kompos/kandang)';
case KIMIA = 'Pupuk kimia';
case KEDUANYA = 'Keduanya';
public function label(): string
{
return match($this) {
self::TIDAK_MEMBERI => 'Tidak memberi pupuk',
self::ORGANIK => 'Pupuk organik (kompos/kandang)',
self::KIMIA => 'Pupuk kimia',
self::KEDUANYA => 'Keduanya',
};
}
public static function options(): array
{
return collect(self::cases())->map(fn ($case) => [
'value' => $case->value,
'label' => $case->label(),
])->toArray();
}
}
@@ -0,0 +1,27 @@
<?php
namespace App\Enums\PraktikBudidaya;
enum KebutuhanAirPerMusim: string
{
case TIDAK_BUTUH = 'Tidak butuh, hujan cukup';
case KURANG = 'Kurang, sering kekurangan air';
case CUKUP = 'Cukup terpenuhi';
public function label(): string
{
return match($this) {
self::TIDAK_BUTUH => 'Tidak butuh, hujan cukup',
self::KURANG => 'Kurang, sering kekurangan air',
self::CUKUP => 'Cukup terpenuhi',
};
}
public static function options(): array
{
return collect(self::cases())->map(fn ($case) => [
'value' => $case->value,
'label' => $case->label(),
])->toArray();
}
}
@@ -0,0 +1,31 @@
<?php
namespace App\Enums\PraktikBudidaya;
enum KondisiPengelolaanAir: int
{
case KURANG_TIDAK_ADA_UPAYA = 1;
case KURANG_TIDAK_SUDAH_BERUPAYA = 2;
case CUKUP_DARI_HUJAN = 3;
case CUKUP_IRIGASI_PINJAM = 4;
case CUKUP_IRIGASI_SENDIRI = 5;
public function label(): string
{
return match($this) {
self::KURANG_TIDAK_ADA_UPAYA => 'Kebutuhan air kurang terpenuhi, sering kekurangan air, tidak ada upaya mengatasinya',
self::KURANG_TIDAK_SUDAH_BERUPAYA => 'Kebutuhan air kurang terpenuhi, sering kekurangan air, tapi sudah mencoba mengandalkan sumber lain (sumur/sungai) walau belum cukup',
self::CUKUP_DARI_HUJAN => 'Kebutuhan air cukup terpenuhi hanya dari hujan, tanpa sistem irigasi tambahan',
self::CUKUP_IRIGASI_PINJAM => 'Kebutuhan air cukup terpenuhi, ada sistem irigasi tambahan (sungai/mata air/sumur) tapi pinjam',
self::CUKUP_IRIGASI_SENDIRI => 'Kebutuhan air cukup terpenuhi, punya akses irigasi sendiri (sungai/mata air/sumur) yang dikelola baik',
};
}
public static function options(): array
{
return collect(self::cases())->map(fn ($case) => [
'value' => $case->value,
'label' => $case->label(),
])->toArray();
}
}
@@ -0,0 +1,36 @@
<?php
namespace App\Enums\PraktikBudidaya;
enum MetodePenangananHamaPenyakit: int
{
case TIDAK_ADA = 1;
case CARA_TRADISIONAL = 2;
case PESTISIDA_SANITASI = 3;
case KOMBINASI = 4;
case PHT = 5;
public function label(): string
{
return match($this) {
self::TIDAK_ADA => 'Tidak ada penanganan',
self::CARA_TRADISIONAL => 'Cara tradisional (doa/ritual)',
self::PESTISIDA_SANITASI => 'Pestisida atau sanitasi',
self::KOMBINASI => 'Kombinasi pestisada dan sanitasi',
self::PHT => 'Pengendalian hama terpadu(PHT)',
};
}
public static function values(): array
{
return collect(self::cases())->map(fn ($case) => $case->value)->toArray();
}
public static function options(): array
{
return collect(self::cases())->map(fn ($case) => [
'value' => $case->value,
'label' => $case->label(),
])->toArray();
}
}
@@ -0,0 +1,25 @@
<?php
namespace App\Enums\PraktikBudidaya;
enum PemahamanManfaatKonservasi: string
{
case YA_PAHAM = 'Ya, tahu manfaatnya';
case TIDAK_PAHAM = 'Dilakukan tapi tidak tahu manfaatnya, kebiasaan turun-temurun';
public function label(): string
{
return match($this) {
self::YA_PAHAM => 'Ya, tahu manfaatnya',
self::TIDAK_PAHAM => 'Dilakukan tapi tidak tahu manfaatnya, kebiasaan turun-temurun',
};
}
public static function options(): array
{
return collect(self::cases())->map(fn ($case) => [
'value' => $case->value,
'label' => $case->label(),
])->toArray();
}
}
@@ -0,0 +1,31 @@
<?php
namespace App\Enums\PraktikBudidaya;
enum PemberianPupuk: int
{
case TIDAK_PERNAH = 1;
case JENIS_DOSIS_WAKTU_TIDAK_MENENTU = 2;
case JENIS_SESUAI_DOSIS_TIDAK_MENENTU = 3;
case JENIS_DOSIS_SESUAI_WAKTU_CUKUP_TEPAT = 4;
case JENIS_DOSIS_SESUAI_WAKTU_TEPAT = 5;
public function label(): string
{
return match($this) {
self::TIDAK_PERNAH => 'Tidak pernah memberi pupuk',
self::JENIS_DOSIS_WAKTU_TIDAK_MENENTU => 'Memberi pupuk, tapi jenis/dosis tidak menentu, waktu sembarangan',
self::JENIS_SESUAI_DOSIS_TIDAK_MENENTU => 'Memberi pupuk dengan jenis yang sesuai (organik/kimia/keduanya), tapi dosis atau waktu belum tepat',
self::JENIS_DOSIS_SESUAI_WAKTU_CUKUP_TEPAT => 'Memberi pupuk dengan jenis dan dosis yang sesuai, waktu cukup tepat',
self::JENIS_DOSIS_SESUAI_WAKTU_TEPAT => 'Memberi pupuk rutin dengan jenis tepat, dosis tepat, dan waktu tepat sesuai kebutuhan tanaman',
};
}
public static function options(): array
{
return collect(self::cases())->map(fn ($case) => [
'value' => $case->value,
'label' => $case->label(),
])->toArray();
}
}
@@ -0,0 +1,31 @@
<?php
namespace App\Enums\PraktikBudidaya;
enum PenangananGulma: int
{
case DIBIARKAN = 1;
case DICABUT = 2;
case DISEMPROT = 3;
case RUTIN_DICABUT_TANPA_JADWAL = 4;
case RUTIN_TERJADWAL = 5;
public function label(): string
{
return match($this) {
self::DIBIARKAN => 'Dibiarkan di kebun',
self::DICABUT => 'Dikumpulkan dan dibuang',
self::DISEMPROT => 'Dijadikan kompos',
self::RUTIN_DICABUT_TANPA_JADWAL => 'Dikumpulkan dan dibuang',
self::RUTIN_TERJADWAL => 'Dijadikan kompos',
};
}
public static function options(): array
{
return collect(self::cases())->map(fn ($case) => [
'value' => $case->value,
'label' => $case->label(),
])->toArray();
}
}
@@ -0,0 +1,27 @@
<?php
namespace App\Enums\PraktikBudidaya;
enum PenangananSisaBuahRanting: string
{
case DIBIARKAN = 'Dibiarkan di kebun';
case DIKUMPULKAN = 'Dikumpulkan dan dibuang';
case KOMPOS = 'Dijadikan kompos';
public function label(): string
{
return match($this) {
self::DIBIARKAN => 'Dibiarkan di kebun',
self::DIKUMPULKAN => 'Dikumpulkan dan dibuang',
self::KOMPOS => 'Dijadikan kompos',
};
}
public static function options(): array
{
return collect(self::cases())->map(fn ($case) => [
'value' => $case->value,
'label' => $case->label(),
])->toArray();
}
}
@@ -0,0 +1,27 @@
<?php
namespace App\Enums\PraktikBudidaya;
enum PenyerbukanManual: string
{
case SELALU = 'Selalu, setiap musim berbunga';
case KADANG_KADANG = 'Kadang-kadang, tergantung kondisi';
case TIDAK_PERNAH = 'Tidak pernah';
public function label(): string
{
return match($this) {
self::SELALU => 'Selalu, setiap musim berbunga',
self::KADANG_KADANG => 'Kadang-kadang, tergantung kondisi',
self::TIDAK_PERNAH => 'Tidak pernah',
};
}
public static function options(): array
{
return collect(self::cases())->map(fn ($case) => [
'value' => $case->value,
'label' => $case->label(),
])->toArray();
}
}
+34
View File
@@ -0,0 +1,34 @@
<?php
namespace App\Enums\PraktikBudidaya;
enum TenagaKerja: string
{
case DIKERJAKAN_SENDIRI = 'Dikerjakan Sendiri';
case DIBANTU_ANGGOTA_KELUARGA = 'Dibantu Anggota Keluarga';
case UPAH_TENAGA_KERJA = 'Upah Tenaga Kerja';
case GOTONG_ROYONG = 'Gotong Royong/Swadaya Komunitas';
public function label(): string
{
return match($this) {
self::DIKERJAKAN_SENDIRI => 'Dikerjakan Sendiri',
self::DIBANTU_ANGGOTA_KELUARGA => 'Dibantu Anggota Keluarga',
self::UPAH_TENAGA_KERJA => 'Upah Tenaga Kerja',
self::GOTONG_ROYONG => 'Gotong Royong/Swadaya Komunitas',
};
}
public static function values(): array
{
return collect(self::cases())->map(fn ($case) => $case->value)->toArray();
}
public static function options(): array
{
return collect(self::cases())->map(fn ($case) => [
'value' => $case->value,
'label' => $case->label(),
])->toArray();
}
}
@@ -0,0 +1,34 @@
<?php
namespace App\Enums\PraktikBudidaya;
enum WaktuKemunculanTerparahHamaPenyakit: string
{
case HUJAN = 'Musim hujan';
case KEMARAU = 'Musim kemarau';
case SEPANJANG_TAHUN = 'Sepanjang tahun';
case TIDAK_TENTU = 'Tidak tentu';
public function label(): string
{
return match($this) {
self::HUJAN => 'Musim hujan',
self::KEMARAU => 'Musim kemarau',
self::SEPANJANG_TAHUN => 'Sepanjang tahun',
self::TIDAK_TENTU => 'Tidak tentu',
};
}
public static function values(): array
{
return collect(self::cases())->map(fn ($case) => $case->value)->toArray();
}
public static function options(): array
{
return collect(self::cases())->map(fn ($case) => [
'value' => $case->value,
'label' => $case->label(),
])->toArray();
}
}
+36
View File
@@ -0,0 +1,36 @@
<?php
namespace App\Enums;
enum SkorKecukupanPenghasilan: int
{
case SANGAT_TIDAK_CUKUP = 1;
case KURANG_SERING_BERHUTANG = 2;
case CUKUP_PAS_PASAN = 3;
case CUKUP_ADA_SISA = 4;
case LEBIH_DARI_CUKUP = 5;
public function label(): string
{
return match ($this) {
self::SANGAT_TIDAK_CUKUP => 'Sangat tidak cukup',
self::KURANG_SERING_BERHUTANG => 'Kurang, sering berhutang',
self::CUKUP_PAS_PASAN => 'Cukup pas-pasan',
self::CUKUP_ADA_SISA => 'Cukup, kadang ada sisa',
self::LEBIH_DARI_CUKUP => 'Lebih dari cukup',
};
}
public static function options(): array
{
return collect(self::cases())->map(fn ($case) => [
'value' => $case->value,
'label' => $case->label(),
])->toArray();
}
public static function values(): array
{
return array_column(self::cases(), 'value');
}
}
+36
View File
@@ -0,0 +1,36 @@
<?php
namespace App\Enums;
enum SkorKejelasanStatusLahan: int
{
case TIDAK_ADA_DOKUMEN_ADA_SENGKETA = 1;
case ADA_DOKUMEN_MASIH_SENGKETA = 2;
case PERNAH_SENGKETA_SELESAI = 3;
case LAHAN_ADAT_TANPA_SENGKETA = 4;
case BERSERTIFIKAT_TANPA_SENGKETA = 5;
public function label(): string
{
return match ($this) {
self::TIDAK_ADA_DOKUMEN_ADA_SENGKETA => 'Tidak ada dokumen & ada sengketa',
self::ADA_DOKUMEN_MASIH_SENGKETA => 'Ada dokumen tapi masih sengketa',
self::PERNAH_SENGKETA_SELESAI => 'Pernah sengketa, sudah selesai',
self::LAHAN_ADAT_TANPA_SENGKETA => 'Lahan adat/keluarga/perhutanan sosial tanpa sengketa',
self::BERSERTIFIKAT_TANPA_SENGKETA => 'Bersertifikat & tidak ada sengketa',
};
}
public static function options(): array
{
return collect(self::cases())->map(fn ($case) => [
'value' => $case->value,
'label' => $case->label(),
])->toArray();
}
public static function values(): array
{
return array_column(self::cases(), 'value');
}
}
+36
View File
@@ -0,0 +1,36 @@
<?php
namespace App\Enums;
enum SkorKemampuanMenabung: int
{
case TIDAK_BISA = 1;
case PERNAH_TERPAKAI = 2;
case KADANG_KADANG = 3;
case BISA_TIDAK_TETAP = 4;
case RUTIN_TETAP = 5;
public function label(): string
{
return match ($this) {
self::TIDAK_BISA => 'Tidak bisa sama sekali',
self::PERNAH_TERPAKAI => 'Pernah tapi selalu terpakai',
self::KADANG_KADANG => 'Kadang-kadang',
self::BISA_TIDAK_TETAP => 'Bisa tapi tidak tetap',
self::RUTIN_TETAP => 'Rutin & jumlah tetap',
};
}
public static function options(): array
{
return collect(self::cases())->map(fn ($case) => [
'value' => $case->value,
'label' => $case->label(),
])->toArray();
}
public static function values(): array
{
return array_column(self::cases(), 'value');
}
}
+36
View File
@@ -0,0 +1,36 @@
<?php
namespace App\Enums;
enum SkorPeriodePaceklik: int
{
case LEBIH_DARI_EMPAT_BULAN = 1;
case TIGA_SAMPAI_EMPAT_BULAN = 2;
case SATU_SAMPAI_DUA_BULAN = 3;
case SEBENTAR_TIDAK_MENENTU = 4;
case TIDAK_ADA_STABIL = 5;
public function label(): string
{
return match ($this) {
self::LEBIH_DARI_EMPAT_BULAN => '>4 bulan',
self::TIGA_SAMPAI_EMPAT_BULAN => '3-4 bulan',
self::SATU_SAMPAI_DUA_BULAN => '1-2 bulan',
self::SEBENTAR_TIDAK_MENENTU => 'Sebentar & tidak menentu',
self::TIDAK_ADA_STABIL => 'Tidak ada, stabil',
};
}
public static function options(): array
{
return collect(self::cases())->map(fn ($case) => [
'value' => $case->value,
'label' => $case->label(),
])->toArray();
}
public static function values(): array
{
return array_column(self::cases(), 'value');
}
}
@@ -0,0 +1,30 @@
<?php
namespace App\Enums;
enum StatusKepemilikanLahanSosialEkonomi: string
{
case MILIK_PRIBADI = 'Milik pribadi';
case MILIK_ORANG_TUA_KELUARGA = 'Milik orang tua-keluarga';
case SEWA_BAGI_HASIL = 'Sewa-bagi hasil';
case LAHAN_ADAT = 'Lahan adat';
case PERHUTANAN_SOSIAL = 'Perhutanan sosial';
public function label(): string
{
return $this->value;
}
public static function options(): array
{
return collect(self::cases())->map(fn ($case) => [
'value' => $case->value,
'label' => $case->label(),
])->toArray();
}
public static function values(): array
{
return array_column(self::cases(), 'value');
}
}
+27
View File
@@ -0,0 +1,27 @@
<?php
namespace App\Enums;
enum StatusKonflik: string
{
case SUDAH_SELESAI = 'Sudah selesai';
case BELUM_MASIH_BERLANJUT = 'Belum, masih berlanjut';
public function label(): string
{
return $this->value;
}
public static function options(): array
{
return collect(self::cases())->map(fn ($case) => [
'value' => $case->value,
'label' => $case->label(),
])->toArray();
}
public static function values(): array
{
return array_column(self::cases(), 'value');
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\Web\Dashboard;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Gate;
class DistribusiController extends Controller
{
public function index()
{
if (!Gate::allows('super_admin') && !Gate::allows('admin')) {
abort(403);
}
$title = 'Distribusi Dashboard';
return view('dashboard.distribusi', compact('title'));
}
}
@@ -0,0 +1,24 @@
<?php
namespace App\Http\Controllers\Web\Produktivitas;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;
use App\Models\Pertanian\Petani;
class PendidikanPelatihanController extends Controller
{
public function index($petaniId, Request $request)
{
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
abort(403);
}
$title = 'Petani - Pendidikan dan Pelatihan';
$petani = Petani::findOrFail($petaniId);
return view('produktivitas.petani.pendidikan-pelatihan.add', compact('title', 'petani'));
}
}
@@ -80,7 +80,9 @@ class PetaniController extends Controller
'kk' => ['nullable', 'min:16', 'max:16'],
'file_kk' => ['nullable', 'image', 'mimes:jpeg,jpg,png', 'max:2048'],
'foto' => ['nullable', 'image', 'mimes:jpeg,jpg,png', 'max:2048'],
'nomor_telepon' => ['nullable', 'numeric', 'max:20'],
'nomor_telepon' => ['nullable', 'digits_between:11,13'],
], [
'nomor_telepon.digits_between' => 'Nomor telepon harus berupa angka 11 sampai 13 digit.',
]);
if ($request->hasFile('file_ktp')) {
@@ -162,7 +164,9 @@ class PetaniController extends Controller
'kk' => ['nullable', 'min:16', 'max:16'],
'file_kk' => ['nullable', 'file', 'mimes:jpeg,jpg,png,pdf', 'max:2048'],
'foto' => ['nullable', 'file', 'mimes:jpeg,jpg,png', 'max:2048'],
'nomor_telepon' => ['nullable', 'numeric', 'max:20'],
'nomor_telepon' => ['nullable', 'digits_between:11,13'],
], [
'nomor_telepon.digits_between' => 'Nomor telepon harus berupa angka 11 sampai 13 digit.',
]);
if ($request->hasFile('file_ktp')) {
@@ -5,8 +5,19 @@ namespace App\Http\Controllers\Web\Produktivitas;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Str;
use Illuminate\Validation\Rules\Enum;
use App\Models\Pertanian\Petani;
use App\Models\Pertanian\PraktikBudidaya;
use App\Enums\PraktikBudidaya\TenagaKerja;
use App\Enums\PraktikBudidaya\FrekuensiPemangkasanUtama;
use App\Enums\PraktikBudidaya\FrekuensiPemangkasanPendamping;
use App\Enums\PraktikBudidaya\PemberianPupuk;
use App\Enums\PraktikBudidaya\JenisPupuk;
use App\Enums\PraktikBudidaya\PenyerbukanManual;
class PraktikBudidayaController extends Controller
{
@@ -16,9 +27,245 @@ class PraktikBudidayaController extends Controller
abort(403);
}
$defaultTeknikPemangkasan = [
'Pemangkasan bentuk',
'Pemangkasan produksi',
'Pemangkasan peremajaan',
'Tidak tahu jenis pemangkasannya — dilakukan berdasarkan kebiasaan',
];
$defaultAlasanTidakPenyerbukan = [
'Tidak tahu caranya',
'Tidak ada tenaga/waktu',
'Mengandalkan penyerbuk alami',
];
$defaultFrekuensiPemupukan = [
'1 kali/tahun',
'2 kali/tahun',
'Lebih dari 2 kali/tahun',
];
$defaultWaktuPemberianPupuk = [
'Awal musim hujan',
'Akhir musim hujan',
'Sebelum berbunga',
'Sebelum Setelah Panen',
'Tidak Menentu',
];
$defaultCaraPemberianPupuk = [
'Ditabur di sekitar pohon',
'Dibenamkan dalam lubang/parit',
'Dicairkan/dikocor',
'Disemprotkan ke daun',
];
$defaultSumberAir = [
'Sungai/mata air',
'Sumur',
'Mengandalkan hujan saja',
];
$defaultSistemIrigasi = [
'Tidak ada irigasi',
'Milik sendiri',
'Milik komunitas/kelompok tani',
'Milik pemerintah',
];
$title = 'Petani - Praktik Budidaya';
$petani = Petani::findOrFail($petaniId);
$praktikBudidaya = PraktikBudidaya::where('petani_id', $petaniId)->latest()->first();
$teknikPemangkasan = $praktikBudidaya->teknik_pemangkasan ?? [];
$teknikPemangkasanLainnya = collect($teknikPemangkasan)
->first(fn ($item) => !in_array($item, $defaultTeknikPemangkasan));
$alasanTidakPenyerbukan = $praktikBudidaya->deskripsi_tidak_penyerbukan ?? '';
$alasanTidakPenyerbukanLainnya = collect(explode(', ', $alasanTidakPenyerbukan))
->first(fn ($item) => !in_array($item, $defaultAlasanTidakPenyerbukan));
$frekuensiPemupukan = $praktikBudidaya->frekuensi_pemupukan ?? '';
$frekuensiPemupukanLainnya = collect(explode(', ', $frekuensiPemupukan))
->first(fn ($item) => !in_array($item, $defaultFrekuensiPemupukan));
$waktuPemberianPupuk = $praktikBudidaya->waktu_pemberian_pupuk ?? '';
$waktuPemberianPupukLainnya = collect(explode(', ', $waktuPemberianPupuk))
->first(fn ($item) => !in_array($item, $defaultWaktuPemberianPupuk));
$caraPemberianPupuk = $praktikBudidaya->cara_pemberian_pupuk ?? '';
$caraPemberianPupukLainnya = collect(explode(', ', $caraPemberianPupuk))
->first(fn ($item) => !in_array($item, $defaultCaraPemberianPupuk));
$sumberAir = $praktikBudidaya->sumber_air ?? '';
$sumberAirLainnya = collect(explode(', ', $sumberAir))
->first(fn ($item) => !in_array($item, $defaultSumberAir));
$sistemIrigasi = $praktikBudidaya->sistem_irigasi ?? '';
$sistemIrigasiLainnya = collect(explode(', ', $sistemIrigasi))
->first(fn ($item) => !in_array($item, $defaultSistemIrigasi));
return view('produktivitas.petani.praktik-budidaya.add', compact('title', 'petani'));
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.add', compact('title', 'petani', 'teknikPemangkasanLainnya', 'alasanTidakPenyerbukanLainnya', 'frekuensiPemupukanLainnya', 'waktuPemberianPupukLainnya', 'caraPemberianPupukLainnya'));
}
public function store($petaniId, Request $request)
{
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
abort(403);
}
$validatedData = $request->validate([
'tenaga_kerja' => ['nullable', 'string', new Enum(TenagaKerja::class)],
'frekuensi_pemangkasan_komoditas_utama' => ['nullable', 'int', new Enum(FrekuensiPemangkasanUtama::class)],
'teknik_pemangkasan' => ['nullable', 'array'],
'teknik_pemangkasan_lainnya' => ['nullable', 'string'],
'frekuensi_pemangkasan_pohon_penaung' => ['nullable', 'string', new Enum(FrekuensiPemangkasanPendamping::class)],
'penyerbukan_manual' => ['nullable', 'string', new Enum(PenyerbukanManual::class)],
'alasan_tidak_penyerbukan' => ['nullable', 'string'],
'alasan_tidak_penyerbukan_lainnya' => ['nullable', 'string'],
'tingkat_keberhasilan_penyerbukan' => ['nullable', 'string'],
'pemberian_pupuk' => ['nullable', 'int', new Enum(PemberianPupuk::class)],
'jenis_pupuk' => ['nullable', 'string', new Enum(JenisPupuk::class)],
'frekuensi_pemupukan' => ['nullable', 'string'],
'frekuensi_pemupukan_lainnya' => ['nullable', 'string'],
'estimasi_dosis_pupuk_organik' => ['nullable', 'string'],
'estimasi_dosis_pupuk_anorganik' => ['nullable', 'string'],
'waktu_pemberian_pupuk' => ['nullable', 'string'],
'waktu_pemberian_pupuk_lainnya' => ['nullable', 'string'],
'cara_pemberian_pupuk' => ['nullable', 'string'],
'cara_pemberian_pupuk_lainnya' => ['nullable', 'string'],
]);
$teknik_pemangkasan = $request->teknik_pemangkasan ?? [];
if (($key = array_search('Lainnya', $teknik_pemangkasan)) !== false) {
unset($teknik_pemangkasan[$key]);
if (!empty($request->teknik_pemangkasan_lainnya)) {
$teknik_pemangkasan[] = $request->teknik_pemangkasan_lainnya;
}
}
$teknik_pemangkasan = array_values($teknik_pemangkasan);
$petani = Petani::findOrFail($petaniId);
$praktikBudidaya = $petani->praktik_budidaya()->create([
'petani_id' => $petani->id,
'uid' => 'PB-' . strtoupper(Str::random(10)),
'tenaga_kerja' => $validatedData['tenaga_kerja'],
'frekuensi_pemangkasan_utama' => $validatedData['frekuensi_pemangkasan_komoditas_utama'],
'teknik_pemangkasan' => $teknik_pemangkasan,
'frekuensi_pemangkasan_penaung' => $validatedData['frekuensi_pemangkasan_pohon_penaung'],
'penyerbukan_manual' => $validatedData['penyerbukan_manual'] ?? null,
'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),
]);
return redirect()->route('petani.praktik-budidaya.edit', [$petani->id , $praktikBudidaya->id])
->with('success', 'Data praktik budidaya berhasil disimpan.');
}
public function edit($petaniId, $praktikBudidayaId)
{
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
abort(403);
}
$defaultTeknikPemangkasan = [
'Pemangkasan bentuk',
'Pemangkasan produksi',
'Pemangkasan peremajaan',
'Tidak tahu jenis pemangkasannya — dilakukan berdasarkan kebiasaan',
];
$defaultAlasanTidakPenyerbukan = [
'Tidak tahu caranya',
'Tidak ada tenaga/waktu',
'Mengandalkan penyerbuk alami',
];
$defaultFrekuensiPemupukan = [
'1 kali/tahun',
'2 kali/tahun',
'Lebih dari 2 kali/tahun',
];
$defaultWaktuPemberianPupuk = [
'Awal musim hujan',
'Akhir musim hujan',
'Sebelum berbunga',
'Sebelum Setelah Panen',
'Tidak Menentu',
];
$defaultCaraPemberianPupuk = [
'Ditabur di sekitar pohon',
'Dibenamkan dalam lubang/parit',
'Dicairkan/dikocor',
'Disemprotkan ke daun',
];
$defaultSumberAir = [
'Sungai/mata air',
'Sumur',
'Mengandalkan hujan saja',
];
$defaultSistemIrigasi = [
'Tidak ada irigasi',
'Milik sendiri',
'Milik komunitas/kelompok tani',
'Milik pemerintah',
];
$title = 'Petani - Praktik Budidaya';
$petani = Petani::findOrFail($petaniId);
$praktikBudidaya = PraktikBudidaya::where('petani_id', $petaniId)->where('id', $praktikBudidayaId)->latest()->first();
$teknikPemangkasan = $praktikBudidaya->teknik_pemangkasan ?? [];
$teknikPemangkasanLainnya = collect($teknikPemangkasan)
->first(fn ($item) => !in_array($item, $defaultTeknikPemangkasan));
$alasanTidakPenyerbukan = $praktikBudidaya->deskripsi_tidak_penyerbukan ?? '';
$alasanTidakPenyerbukanLainnya = collect(explode(', ', $alasanTidakPenyerbukan))
->first(fn ($item) => !in_array($item, $defaultAlasanTidakPenyerbukan));
$frekuensiPemupukan = $praktikBudidaya->frekuensi_pemupukan ?? '';
$frekuensiPemupukanLainnya = collect(explode(', ', $frekuensiPemupukan))
->first(fn ($item) => !in_array($item, $defaultFrekuensiPemupukan));
$waktuPemberianPupuk = $praktikBudidaya->waktu_pemberian_pupuk ?? '';
$waktuPemberianPupukLainnya = collect(explode(', ', $waktuPemberianPupuk))
->first(fn ($item) => !in_array($item, $defaultWaktuPemberianPupuk));
$caraPemberianPupuk = $praktikBudidaya->cara_pemberian_pupuk ?? '';
$caraPemberianPupukLainnya = collect(explode(', ', $caraPemberianPupuk))
->first(fn ($item) => !in_array($item, $defaultCaraPemberianPupuk));
$sumberAir = $praktikBudidaya->sumber_air ?? '';
$sumberAirLainnya = collect(explode(', ', $sumberAir))
->first(fn ($item) => !in_array($item, $defaultSumberAir));
$sistemIrigasi = $praktikBudidaya->sistem_irigasi ?? '';
$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'));
}
}
@@ -3,6 +3,15 @@
namespace App\Http\Controllers\Web\Produktivitas;
use App\Http\Controllers\Controller;
use App\Enums\KategoriPendapatanKomoditas;
use App\Enums\PeriodePendapatan;
use App\Enums\PihakMembantuKonflik;
use App\Enums\SkorKecukupanPenghasilan;
use App\Enums\SkorKejelasanStatusLahan;
use App\Enums\SkorKemampuanMenabung;
use App\Enums\SkorPeriodePaceklik;
use App\Enums\StatusKepemilikanLahanSosialEkonomi;
use App\Enums\StatusKonflik;
use App\Models\Pertanian\Komoditas;
use App\Models\Pertanian\Lahan;
use App\Models\Pertanian\Petani;
@@ -32,14 +41,14 @@ class SosialEkonomiController extends Controller
$pendapatanLuarPertanian = $sosialEkonomi?->pendapatanLuarPertanian?->values() ?? collect();
$komoditasPetani = $this->komoditasPetani($petani);
return view('produktivitas.petani.sosial-ekonomi.index', compact(
return view('produktivitas.petani.sosial-ekonomi.index', array_merge(compact(
'petani',
'sosialEkonomi',
'pendapatanKomoditasUtama',
'pendapatanKomoditasLainnya',
'pendapatanLuarPertanian',
'komoditasPetani'
));
), $this->sosialEkonomiOptions()));
}
public function index(Request $request, Petani $petani)
@@ -87,14 +96,14 @@ class SosialEkonomiController extends Controller
return response()->json($sosialEkonomi);
}
return view($view, compact(
return view($view, array_merge(compact(
'petani',
'sosialEkonomi',
'komoditasPetani',
'pendapatanKomoditasUtama',
'pendapatanKomoditasLainnya',
'pendapatanLuarPertanian',
));
), $this->sosialEkonomiOptions()));
}
public function store(Request $request, ?Petani $petani = null): JsonResponse|RedirectResponse
@@ -214,29 +223,29 @@ class SosialEkonomiController extends Controller
'jumlah_tanggungan' => ['nullable', 'integer', 'min:0'],
'anak_masih_sekolah' => ['nullable', 'integer', 'min:0'],
'yang_ikut_bekerja' => ['nullable', 'integer', 'min:0'],
'skor_periode_paceklik' => ['nullable', 'integer', 'min:1', 'max:5'],
'skor_periode_paceklik' => ['nullable', 'integer', Rule::in(SkorPeriodePaceklik::values())],
'bulan_paceklik' => ['nullable', 'string', 'max:255'],
'sumber_penghasilan_paceklik' => ['nullable', 'string'],
'total_estimasi_biaya_kebun_per_musim' => ['nullable', 'integer', 'min:0'],
'skor_kemampuan_menabung' => ['nullable', 'integer', 'min:1', 'max:5'],
'skor_kemampuan_menabung' => ['nullable', 'integer', Rule::in(SkorKemampuanMenabung::values())],
'estimasi_tabungan_per_bulan' => ['nullable', 'integer', 'min:0'],
'skor_kecukupan_penghasilan' => ['nullable', 'integer', 'min:1', 'max:5'],
'skor_kecukupan_penghasilan' => ['nullable', 'integer', Rule::in(SkorKecukupanPenghasilan::values())],
'alasan_kecukupan_penghasilan' => ['nullable', 'string'],
'status_kepemilikan_lahan' => ['nullable', 'string', 'max:255'],
'skor_kejelasan_status_lahan' => ['nullable', 'integer', 'min:1', 'max:5'],
'status_kepemilikan_lahan' => ['nullable', 'string', Rule::in(StatusKepemilikanLahanSosialEkonomi::values())],
'skor_kejelasan_status_lahan' => ['nullable', 'integer', Rule::in(SkorKejelasanStatusLahan::values())],
'ada_sertifikat_dokumen' => ['nullable', 'boolean'],
'ada_sengketa' => ['nullable', 'boolean'],
'keterangan_sengketa' => ['nullable', 'string'],
'pihak_membantu_konflik' => ['nullable', 'string', 'max:255'],
'pihak_membantu_konflik' => ['nullable', 'string', Rule::in(PihakMembantuKonflik::values())],
'pihak_membantu_konflik_nama' => ['nullable', 'string', 'max:255'],
'tahun_bantuan_konflik' => ['nullable', 'integer', 'digits:4'],
'status_konflik' => ['nullable', 'string', 'max:255'],
'status_konflik' => ['nullable', 'string', Rule::in(StatusKonflik::values())],
'pendapatan_komoditas' => ['nullable', 'array'],
'pendapatan_komoditas.*.kategori' => ['required_with:pendapatan_komoditas', 'string', 'in:utama,lainnya'],
'pendapatan_komoditas.*.kategori' => ['required_with:pendapatan_komoditas', 'string', Rule::in(KategoriPendapatanKomoditas::values())],
'pendapatan_komoditas.*.komoditas' => ['nullable', 'string', 'max:255'],
'pendapatan_komoditas.*.pendapatan' => ['nullable', 'integer', 'min:0'],
'pendapatan_komoditas.*.periode' => ['nullable', 'string', 'in:musim,tahun'],
'pendapatan_komoditas.*.periode' => ['nullable', 'string', Rule::in(PeriodePendapatan::values())],
'pendapatan_luar_pertanian' => ['nullable', 'array'],
'pendapatan_luar_pertanian.*.jenis_pekerjaan' => ['nullable', 'string', 'max:255'],
@@ -253,7 +262,9 @@ class SosialEkonomiController extends Controller
])
->all();
if (($payload['pihak_membantu_konflik'] ?? null) === 'Tidak ada-selesaikan sendiri') {
$payload = $this->normalizeSkorPayload($payload);
if (($payload['pihak_membantu_konflik'] ?? null) === PihakMembantuKonflik::TIDAK_ADA_SELESAIKAN_SENDIRI->value) {
$payload['pihak_membantu_konflik_nama'] = null;
$payload['tahun_bantuan_konflik'] = null;
}
@@ -261,6 +272,22 @@ class SosialEkonomiController extends Controller
return $payload;
}
private function normalizeSkorPayload(array $payload): array
{
foreach ([
'skor_periode_paceklik',
'skor_kemampuan_menabung',
'skor_kecukupan_penghasilan',
'skor_kejelasan_status_lahan',
] as $field) {
if (array_key_exists($field, $payload) && !is_null($payload[$field]) && $payload[$field] !== '') {
$payload[$field] = (int) $payload[$field];
}
}
return $payload;
}
private function syncPendapatanKomoditas(SosialEkonomi $sosialEkonomi, array $items): void
{
$sosialEkonomi->pendapatanKomoditas()->delete();
@@ -333,4 +360,18 @@ class SosialEkonomiController extends Controller
->get();
}
private function sosialEkonomiOptions(): array
{
return [
'periodePaceklikOptions' => SkorPeriodePaceklik::options(),
'kemampuanMenabungOptions' => SkorKemampuanMenabung::options(),
'kecukupanPenghasilanOptions' => SkorKecukupanPenghasilan::options(),
'kejelasanStatusLahanOptions' => SkorKejelasanStatusLahan::options(),
'statusKepemilikanLahanOptions' => StatusKepemilikanLahanSosialEkonomi::options(),
'pihakMembantuKonflikOptions' => PihakMembantuKonflik::options(),
'pihakMembantuTanpaBantuanValue' => PihakMembantuKonflik::TIDAK_ADA_SELESAIKAN_SENDIRI->value,
'statusKonflikOptions' => StatusKonflik::options(),
];
}
}
+7 -1
View File
@@ -6,6 +6,7 @@ use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Carbon\Carbon;
use App\Models\Wilayah\DesaKelurahan;
@@ -22,7 +23,7 @@ class Petani extends Model
'uid',
'nama',
'telepon',
'nomor_telepon',
'alamat',
'kk',
@@ -74,4 +75,9 @@ class Petani extends Model
{
return $this->belongsTo(User::class, 'user_id');
}
public function praktik_budidaya(): HasOne
{
return $this->hasOne(PraktikBudidaya::class, 'petani_id');
}
}
+14 -4
View File
@@ -2,6 +2,13 @@
namespace App\Models\Pertanian;
use App\Enums\PihakMembantuKonflik;
use App\Enums\SkorKecukupanPenghasilan;
use App\Enums\SkorKejelasanStatusLahan;
use App\Enums\SkorKemampuanMenabung;
use App\Enums\SkorPeriodePaceklik;
use App\Enums\StatusKepemilikanLahanSosialEkonomi;
use App\Enums\StatusKonflik;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
@@ -45,15 +52,18 @@ class SosialEkonomi extends Model
'jumlah_tanggungan' => 'integer',
'anak_masih_sekolah' => 'integer',
'yang_ikut_bekerja' => 'integer',
'skor_periode_paceklik' => 'integer',
'skor_periode_paceklik' => SkorPeriodePaceklik::class,
'total_estimasi_biaya_kebun_per_musim' => 'integer',
'skor_kemampuan_menabung' => 'integer',
'skor_kemampuan_menabung' => SkorKemampuanMenabung::class,
'estimasi_tabungan_per_bulan' => 'integer',
'skor_kecukupan_penghasilan' => 'integer',
'skor_kejelasan_status_lahan' => 'integer',
'skor_kecukupan_penghasilan' => SkorKecukupanPenghasilan::class,
'status_kepemilikan_lahan' => StatusKepemilikanLahanSosialEkonomi::class,
'skor_kejelasan_status_lahan' => SkorKejelasanStatusLahan::class,
'ada_sertifikat_dokumen' => 'boolean',
'ada_sengketa' => 'boolean',
'pihak_membantu_konflik' => PihakMembantuKonflik::class,
'tahun_bantuan_konflik' => 'integer',
'status_konflik' => StatusKonflik::class,
];
public function petani(): BelongsTo