From f448257980e778b9a85dedefc7b47d706f4b9dc8 Mon Sep 17 00:00:00 2001 From: Irwan Cahyono Date: Mon, 6 Jul 2026 16:07:20 +0700 Subject: [PATCH 1/4] header summary --- .../Produktivitas/PetaniLahanController.php | 42 +++++++- .../produktivitas/petani/header.blade.php | 97 ++++++++++++------- routes/web.php | 1 + 3 files changed, 102 insertions(+), 38 deletions(-) diff --git a/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php b/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php index 6a2000f..1cfa8b5 100644 --- a/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php +++ b/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php @@ -253,11 +253,47 @@ class PetaniLahanController extends Controller } } - /** - * Remove the specified resource from storage. - */ public function destroy(string $id) { // } + + public function summary(string $petaniId) + { + if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) { + abort(403); + } + + $petani = Petani::findOrFail($petaniId); + + $lahan = Lahan::where('petani_id', $petaniId) + ->sum('luas_lahan'); + + $tanaman = Tanaman::whereHas('lahan', function ($query) use ($petaniId) { + $query->where('petani_id', $petaniId); + })->count(); + + $komoditas = Lahan::where('petani_id', $petaniId) + ->join('master_komoditas', 'map_lahan.komoditas_id', '=', 'master_komoditas.id') + ->select('master_komoditas.nama', DB::raw('count(*) as total')) + ->groupBy('master_komoditas.nama') + ->orderBy('total', 'desc') + ->first(); + + $kondisiLahan = Lahan::where('petani_id', $petaniId) + ->select('kondisi_tanaman', DB::raw('count(*) as total')) + ->groupBy('kondisi_tanaman') + ->orderBy('total', 'desc') + ->first(); + + return response()->json([ + 'status' => 'success', + 'data' => [ + 'lahan' => $lahan, + 'tanaman' => $tanaman, + 'komoditas' => $komoditas ? $komoditas->nama : null, + 'kondisi_lahan' => $kondisiLahan ? $kondisiLahan->kondisi_tanaman : null, + ], + ]); + } } diff --git a/resources/views/produktivitas/petani/header.blade.php b/resources/views/produktivitas/petani/header.blade.php index d8761d2..05a0152 100644 --- a/resources/views/produktivitas/petani/header.blade.php +++ b/resources/views/produktivitas/petani/header.blade.php @@ -29,15 +29,15 @@
-

In-store Sales

-

$5,345.43

+

Segmentasi

+

Penggerak

- 5k orders+5.7% + Pemerhati Teknis

- +
@@ -46,32 +46,33 @@
-

In-store Sales

-

$5,345.43

-

- 5k orders+5.7% +

Lahan

+

15600 m2

+

+ 100 tanaman kopiSehat

- +

+
-

In-store Sales

-

$5,345.43

+

Praktik Budidaya

+

2 kali

- 5k orders+5.7% + 2 sertifikasi+5.7%

- +
@@ -89,15 +90,32 @@
-

In-store Sales

-

$5,345.43

+

Pendidikan

+

3 kali

- 5k orders+5.7% + 2 sertifikasi+5.7%

- + + + +
+
+
+
+
+
+

Pendidikan

+

3 kali

+

+ 2 sertifikasi+5.7% +

+
+ + +
@@ -114,24 +132,7 @@
- - - -
-
-
-
-
-
-

In-store Sales

-

$5,345.43

-

- 5k orders+5.7% -

-
- - - +
@@ -213,3 +214,29 @@ @endif
+ + @push('scripts') + +@endpush \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 551bbe1..96380c8 100644 --- a/routes/web.php +++ b/routes/web.php @@ -190,6 +190,7 @@ Route::middleware('auth') Route::resource('petani', App\Http\Controllers\Web\Produktivitas\PetaniController::class); Route::get('petani/show-image/{id}/{field}', [App\Http\Controllers\Web\Produktivitas\PetaniController::class, 'showImage'])->name('petani.show-image'); Route::get('petani/{petani}/akses-pasar', [App\Http\Controllers\Web\Produktivitas\AksesPasarController::class, 'editByPetani'])->name('petani.akses-pasar.edit'); + Route::get('petani/{petani}/lahan-tanaman/summary', [App\Http\Controllers\Web\Produktivitas\PetaniLahanController::class, 'summary'])->name('petani.lahan-tanaman.summary'); Route::resource('petani.lahan-tanaman', App\Http\Controllers\Web\Produktivitas\PetaniLahanController::class); Route::resource('petani.lahan-tanaman.tanaman', App\Http\Controllers\Web\Produktivitas\PetaniLahanTanamanController::class)->only(['show', 'update', 'destroy']); Route::resource('petani.praktik-budidaya', App\Http\Controllers\Web\Produktivitas\PraktikBudidayaController::class); From 2eb40f8a1a64ec890f9ff97938e40d26695a6d4c Mon Sep 17 00:00:00 2001 From: SyaharaniSalsabilla Date: Tue, 7 Jul 2026 15:41:02 +0700 Subject: [PATCH 2/4] enums sosial ekonomi --- app/Enums/KategoriPendapatanKomoditas.php | 14 +++ app/Enums/PeriodePendapatan.php | 14 +++ app/Enums/PihakMembantuKonflik.php | 27 ++++++ app/Enums/SkorKecukupanPenghasilan.php | 36 ++++++++ app/Enums/SkorKejelasanStatusLahan.php | 36 ++++++++ app/Enums/SkorKemampuanMenabung.php | 36 ++++++++ app/Enums/SkorPeriodePaceklik.php | 36 ++++++++ .../StatusKepemilikanLahanSosialEkonomi.php | 30 +++++++ app/Enums/StatusKonflik.php | 27 ++++++ .../Web/Dashboard/DistribusiController.php | 20 +++++ .../Produktivitas/SosialEkonomiController.php | 69 +++++++++++--- app/Models/Pertanian/SosialEkonomi.php | 18 +++- .../views/dashboard/distribusi.blade.php | 16 ++++ .../petani/sosial-ekonomi/edit.blade.php | 90 +++++++++---------- .../petani/sosial-ekonomi/index.blade.php | 90 +++++++++---------- 15 files changed, 451 insertions(+), 108 deletions(-) create mode 100644 app/Enums/KategoriPendapatanKomoditas.php create mode 100644 app/Enums/PeriodePendapatan.php create mode 100644 app/Enums/PihakMembantuKonflik.php create mode 100644 app/Enums/SkorKecukupanPenghasilan.php create mode 100644 app/Enums/SkorKejelasanStatusLahan.php create mode 100644 app/Enums/SkorKemampuanMenabung.php create mode 100644 app/Enums/SkorPeriodePaceklik.php create mode 100644 app/Enums/StatusKepemilikanLahanSosialEkonomi.php create mode 100644 app/Enums/StatusKonflik.php create mode 100644 app/Http/Controllers/Web/Dashboard/DistribusiController.php create mode 100644 resources/views/dashboard/distribusi.blade.php 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') +
+
+
+
{{ $title }}
+
+
+

+ Dashboard distribusi sedang disiapkan. +

+
+
+
+@endsection diff --git a/resources/views/produktivitas/petani/sosial-ekonomi/edit.blade.php b/resources/views/produktivitas/petani/sosial-ekonomi/edit.blade.php index 33e3f20..df75a1f 100644 --- a/resources/views/produktivitas/petani/sosial-ekonomi/edit.blade.php +++ b/resources/views/produktivitas/petani/sosial-ekonomi/edit.blade.php @@ -202,15 +202,14 @@
Stabilitas Penghasilan
- - + @php $skorPeriodePaceklikValue = old('skor_periode_paceklik', $sosialEkonomi?->skor_periode_paceklik?->value); @endphp + + @foreach($periodePaceklikOptions as $option) +
+ + +
+ @endforeach @error('skor_periode_paceklik')
{{ $message }}
@enderror
@@ -237,15 +236,14 @@ @error('total_estimasi_biaya_kebun_per_musim')
{{ $message }}
@enderror
- - + @php $skorKemampuanMenabungValue = old('skor_kemampuan_menabung', $sosialEkonomi?->skor_kemampuan_menabung?->value); @endphp + + @foreach($kemampuanMenabungOptions as $option) +
+ + +
+ @endforeach @error('skor_kemampuan_menabung')
{{ $message }}
@enderror
@@ -262,15 +260,14 @@
Persepsi Kecukupan Penghasilan
- - + @php $skorKecukupanPenghasilanValue = old('skor_kecukupan_penghasilan', $sosialEkonomi?->skor_kecukupan_penghasilan?->value); @endphp + + @foreach($kecukupanPenghasilanOptions as $option) +
+ + +
+ @endforeach @error('skor_kecukupan_penghasilan')
{{ $message }}
@enderror
@@ -286,22 +283,21 @@ @error('status_kepemilikan_lahan')
{{ $message }}
@enderror
- - + @php $skorKejelasanStatusLahanValue = old('skor_kejelasan_status_lahan', $sosialEkonomi?->skor_kejelasan_status_lahan?->value); @endphp + + @foreach($kejelasanStatusLahanOptions as $option) +
+ + +
+ @endforeach @error('skor_kejelasan_status_lahan')
{{ $message }}
@enderror
@@ -345,8 +341,9 @@ @error('pihak_membantu_konflik')
{{ $message }}
@enderror
@@ -364,8 +361,9 @@ @error('status_konflik')
{{ $message }}
@enderror
@@ -373,7 +371,7 @@
@@ -388,7 +386,9 @@