diff --git a/app/Enums/KategoriPendapatanKomoditas.php b/app/Enums/KategoriPendapatanKomoditas.php new file mode 100644 index 0000000..98b3cdc --- /dev/null +++ b/app/Enums/KategoriPendapatanKomoditas.php @@ -0,0 +1,14 @@ +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'); + } +} diff --git a/app/Enums/SkorKecukupanPenghasilan.php b/app/Enums/SkorKecukupanPenghasilan.php new file mode 100644 index 0000000..d359b3a --- /dev/null +++ b/app/Enums/SkorKecukupanPenghasilan.php @@ -0,0 +1,36 @@ + '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'); + } +} diff --git a/app/Enums/SkorKejelasanStatusLahan.php b/app/Enums/SkorKejelasanStatusLahan.php new file mode 100644 index 0000000..ad7662a --- /dev/null +++ b/app/Enums/SkorKejelasanStatusLahan.php @@ -0,0 +1,36 @@ + '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'); + } +} diff --git a/app/Enums/SkorKemampuanMenabung.php b/app/Enums/SkorKemampuanMenabung.php new file mode 100644 index 0000000..6297708 --- /dev/null +++ b/app/Enums/SkorKemampuanMenabung.php @@ -0,0 +1,36 @@ + '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'); + } +} diff --git a/app/Enums/SkorPeriodePaceklik.php b/app/Enums/SkorPeriodePaceklik.php new file mode 100644 index 0000000..3524bb4 --- /dev/null +++ b/app/Enums/SkorPeriodePaceklik.php @@ -0,0 +1,36 @@ + '>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'); + } +} diff --git a/app/Enums/StatusKepemilikanLahanSosialEkonomi.php b/app/Enums/StatusKepemilikanLahanSosialEkonomi.php new file mode 100644 index 0000000..935ef44 --- /dev/null +++ b/app/Enums/StatusKepemilikanLahanSosialEkonomi.php @@ -0,0 +1,30 @@ +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'); + } +} diff --git a/app/Enums/StatusKonflik.php b/app/Enums/StatusKonflik.php new file mode 100644 index 0000000..eb6b62e --- /dev/null +++ b/app/Enums/StatusKonflik.php @@ -0,0 +1,27 @@ +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'); + } +} diff --git a/app/Http/Controllers/Web/Dashboard/DistribusiController.php b/app/Http/Controllers/Web/Dashboard/DistribusiController.php new file mode 100644 index 0000000..6d15a5a --- /dev/null +++ b/app/Http/Controllers/Web/Dashboard/DistribusiController.php @@ -0,0 +1,20 @@ +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(), + ]; + } + } diff --git a/app/Models/Pertanian/SosialEkonomi.php b/app/Models/Pertanian/SosialEkonomi.php index b87be0e..f3e2a1a 100644 --- a/app/Models/Pertanian/SosialEkonomi.php +++ b/app/Models/Pertanian/SosialEkonomi.php @@ -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 diff --git a/resources/views/dashboard/distribusi.blade.php b/resources/views/dashboard/distribusi.blade.php new file mode 100644 index 0000000..1b88102 --- /dev/null +++ b/resources/views/dashboard/distribusi.blade.php @@ -0,0 +1,16 @@ +@extends('layout.main') + +@section('content') +
+ Dashboard distribusi sedang disiapkan. +
+