update field sosial ekonomi

This commit is contained in:
2026-07-02 14:24:44 +07:00
parent 5c1fe22fa0
commit 5cee65f8df
2 changed files with 139 additions and 11 deletions
@@ -3,9 +3,12 @@
namespace App\Http\Controllers\Web\Produktivitas; namespace App\Http\Controllers\Web\Produktivitas;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\Pertanian\Komoditas;
use App\Models\Pertanian\Lahan;
use App\Models\Pertanian\Petani; use App\Models\Pertanian\Petani;
use App\Models\Pertanian\SosialEkonomi; use App\Models\Pertanian\SosialEkonomi;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str; use Illuminate\Support\Str;
@@ -27,13 +30,15 @@ class SosialEkonomiController extends Controller
$pendapatanKomoditasUtama = $pendapatanKomoditas->where('kategori', 'utama')->values(); $pendapatanKomoditasUtama = $pendapatanKomoditas->where('kategori', 'utama')->values();
$pendapatanKomoditasLainnya = $pendapatanKomoditas->where('kategori', 'lainnya')->values(); $pendapatanKomoditasLainnya = $pendapatanKomoditas->where('kategori', 'lainnya')->values();
$pendapatanLuarPertanian = $sosialEkonomi?->pendapatanLuarPertanian?->values() ?? collect(); $pendapatanLuarPertanian = $sosialEkonomi?->pendapatanLuarPertanian?->values() ?? collect();
$komoditasPetani = $this->komoditasPetani($petani);
return view('produktivitas.petani.sosial-ekonomi.index', compact( return view('produktivitas.petani.sosial-ekonomi.index', compact(
'petani', 'petani',
'sosialEkonomi', 'sosialEkonomi',
'pendapatanKomoditasUtama', 'pendapatanKomoditasUtama',
'pendapatanKomoditasLainnya', 'pendapatanKomoditasLainnya',
'pendapatanLuarPertanian' 'pendapatanLuarPertanian',
'komoditasPetani'
)); ));
} }
@@ -56,7 +61,7 @@ class SosialEkonomiController extends Controller
return response()->json($sosialEkonomi); return response()->json($sosialEkonomi);
} }
public function store(Request $request): JsonResponse public function store(Request $request): JsonResponse|RedirectResponse
{ {
$validated = $this->validateData($request); $validated = $this->validateData($request);
@@ -103,7 +108,7 @@ class SosialEkonomiController extends Controller
]); ]);
} }
public function update(Request $request, string $id): JsonResponse public function update(Request $request, string $id): JsonResponse|RedirectResponse
{ {
$sosialEkonomi = SosialEkonomi::findOrFail($id); $sosialEkonomi = SosialEkonomi::findOrFail($id);
$validated = $this->validateData($request, $sosialEkonomi->id); $validated = $this->validateData($request, $sosialEkonomi->id);
@@ -201,12 +206,19 @@ class SosialEkonomiController extends Controller
private function sosialEkonomiPayload(array $validated): array private function sosialEkonomiPayload(array $validated): array
{ {
return collect($validated) $payload = collect($validated)
->except(['pendapatan_komoditas', 'pendapatan_luar_pertanian']) ->except(['pendapatan_komoditas', 'pendapatan_luar_pertanian'])
->merge([ ->merge([
'uid' => $validated['uid'] ?? 'SEK-' . Str::uuid(), 'uid' => $validated['uid'] ?? 'SEK-' . Str::uuid(),
]) ])
->all(); ->all();
if (($payload['pihak_membantu_konflik'] ?? null) === 'Tidak ada-selesaikan sendiri') {
$payload['pihak_membantu_konflik_nama'] = null;
$payload['tahun_bantuan_konflik'] = null;
}
return $payload;
} }
private function syncPendapatanKomoditas(SosialEkonomi $sosialEkonomi, array $items): void private function syncPendapatanKomoditas(SosialEkonomi $sosialEkonomi, array $items): void
@@ -261,4 +273,23 @@ class SosialEkonomiController extends Controller
return filled($item['jenis_pekerjaan'] ?? null) return filled($item['jenis_pekerjaan'] ?? null)
|| filled($item['estimasi_per_bulan'] ?? null); || filled($item['estimasi_per_bulan'] ?? null);
} }
private function komoditasPetani(Petani $petani)
{
$komoditasIds = Lahan::query()
->whereNotNull('komoditas_id')
->where(function ($query) use ($petani) {
$query->where('petani_id', $petani->id);
if ($petani->profile_id) {
$query->orWhere('profile_id', $petani->profile_id);
}
})
->distinct()
->pluck('komoditas_id');
return Komoditas::whereIn('id', $komoditasIds)
->orderBy('nama')
->get();
}
} }
@@ -50,6 +50,11 @@
</div> </div>
<h5 class="pb-4 border-bottom mb-4 mt-4">Pendapatan dari Komoditas Utama</h5> <h5 class="pb-4 border-bottom mb-4 mt-4">Pendapatan dari Komoditas Utama</h5>
@if($komoditasPetani->isEmpty())
<div class="alert alert-warning">
Petani ini belum memiliki komoditas pada data lahan. Tambahkan data Lahan & Tanaman terlebih dahulu agar pilihan komoditas tersedia.
</div>
@endif
<div class="table-responsive mb-4"> <div class="table-responsive mb-4">
<table class="table table-bordered align-middle"> <table class="table table-bordered align-middle">
<thead> <thead>
@@ -62,10 +67,16 @@
<tbody> <tbody>
@for($i = 0; $i < 2; $i++) @for($i = 0; $i < 2; $i++)
@php($item = $pendapatanKomoditasUtama->get($i)) @php($item = $pendapatanKomoditasUtama->get($i))
<tr> <tr class="pendapatan-row" data-group="komoditas-utama" data-row-index="{{ $i }}">
<td> <td>
<input type="hidden" name="pendapatan_komoditas[{{ $i }}][kategori]" value="utama"> <input type="hidden" name="pendapatan_komoditas[{{ $i }}][kategori]" value="utama">
<input type="text" class="form-control" name="pendapatan_komoditas[{{ $i }}][komoditas]" value="{{ old("pendapatan_komoditas.$i.komoditas", $item?->komoditas) }}"> @php($selectedKomoditas = old("pendapatan_komoditas.$i.komoditas", $item?->komoditas))
<select class="form-control sosial-ekonomi-komoditas sosial-ekonomi-komoditas-utama pendapatan-trigger" data-kategori="utama" name="pendapatan_komoditas[{{ $i }}][komoditas]">
<option value="">Pilih Komoditas</option>
@foreach($komoditasPetani as $komoditas)
<option value="{{ $komoditas->nama }}" {{ $selectedKomoditas === $komoditas->nama ? 'selected' : '' }}>{{ $komoditas->nama }}</option>
@endforeach
</select>
</td> </td>
<td> <td>
<input type="number" min="0" class="form-control" name="pendapatan_komoditas[{{ $i }}][pendapatan]" value="{{ old("pendapatan_komoditas.$i.pendapatan", $item?->pendapatan) }}"> <input type="number" min="0" class="form-control" name="pendapatan_komoditas[{{ $i }}][pendapatan]" value="{{ old("pendapatan_komoditas.$i.pendapatan", $item?->pendapatan) }}">
@@ -97,10 +108,16 @@
@for($i = 0; $i < 2; $i++) @for($i = 0; $i < 2; $i++)
@php($item = $pendapatanKomoditasLainnya->get($i)) @php($item = $pendapatanKomoditasLainnya->get($i))
@php($index = $i + 2) @php($index = $i + 2)
<tr> <tr class="pendapatan-row" data-group="komoditas-lainnya" data-row-index="{{ $i }}">
<td> <td>
<input type="hidden" name="pendapatan_komoditas[{{ $index }}][kategori]" value="lainnya"> <input type="hidden" name="pendapatan_komoditas[{{ $index }}][kategori]" value="lainnya">
<input type="text" class="form-control" name="pendapatan_komoditas[{{ $index }}][komoditas]" value="{{ old("pendapatan_komoditas.$index.komoditas", $item?->komoditas) }}"> @php($selectedKomoditas = old("pendapatan_komoditas.$index.komoditas", $item?->komoditas))
<select class="form-control sosial-ekonomi-komoditas sosial-ekonomi-komoditas-lainnya pendapatan-trigger" data-kategori="lainnya" name="pendapatan_komoditas[{{ $index }}][komoditas]">
<option value="">Pilih Komoditas</option>
@foreach($komoditasPetani as $komoditas)
<option value="{{ $komoditas->nama }}" {{ $selectedKomoditas === $komoditas->nama ? 'selected' : '' }}>{{ $komoditas->nama }}</option>
@endforeach
</select>
</td> </td>
<td> <td>
<input type="number" min="0" class="form-control" name="pendapatan_komoditas[{{ $index }}][pendapatan]" value="{{ old("pendapatan_komoditas.$index.pendapatan", $item?->pendapatan) }}"> <input type="number" min="0" class="form-control" name="pendapatan_komoditas[{{ $index }}][pendapatan]" value="{{ old("pendapatan_komoditas.$index.pendapatan", $item?->pendapatan) }}">
@@ -130,9 +147,9 @@
<tbody> <tbody>
@for($i = 0; $i < 2; $i++) @for($i = 0; $i < 2; $i++)
@php($item = $pendapatanLuarPertanian->get($i)) @php($item = $pendapatanLuarPertanian->get($i))
<tr> <tr class="pendapatan-row" data-group="luar-pertanian" data-row-index="{{ $i }}">
<td> <td>
<input type="text" class="form-control" name="pendapatan_luar_pertanian[{{ $i }}][jenis_pekerjaan]" value="{{ old("pendapatan_luar_pertanian.$i.jenis_pekerjaan", $item?->jenis_pekerjaan) }}"> <input type="text" class="form-control pendapatan-trigger" name="pendapatan_luar_pertanian[{{ $i }}][jenis_pekerjaan]" value="{{ old("pendapatan_luar_pertanian.$i.jenis_pekerjaan", $item?->jenis_pekerjaan) }}">
</td> </td>
<td> <td>
<input type="number" min="0" class="form-control" name="pendapatan_luar_pertanian[{{ $i }}][estimasi_per_bulan]" value="{{ old("pendapatan_luar_pertanian.$i.estimasi_per_bulan", $item?->estimasi_per_bulan) }}"> <input type="number" min="0" class="form-control" name="pendapatan_luar_pertanian[{{ $i }}][estimasi_per_bulan]" value="{{ old("pendapatan_luar_pertanian.$i.estimasi_per_bulan", $item?->estimasi_per_bulan) }}">
@@ -312,7 +329,87 @@
<script> <script>
'use strict'; 'use strict';
$(document).ready(function () { $(document).ready(function () {
$('#skor-periode-paceklik, #skor-menabung, #skor-kecukupan, #status-kepemilikan-lahan, #skor-kejelasan-lahan, #ada-sertifikat, #ada-sengketa, #pihak-membantu, #status-konflik').select2(); $('#skor-periode-paceklik, #skor-menabung, #skor-kecukupan, #status-kepemilikan-lahan, #skor-kejelasan-lahan, #ada-sertifikat, #ada-sengketa, #pihak-membantu, #status-konflik, .sosial-ekonomi-komoditas').select2();
function syncKomoditasLainnyaOptions() {
const selectedUtama = $('.sosial-ekonomi-komoditas-utama')
.map(function () {
return $(this).val();
})
.get()
.filter(Boolean);
$('.sosial-ekonomi-komoditas-lainnya').each(function () {
const $select = $(this);
const currentValue = $select.val();
$select.find('option').each(function () {
const $option = $(this);
const value = $option.val();
if (!value) {
$option.prop('disabled', false);
return;
}
$option.prop('disabled', selectedUtama.includes(value));
});
if (currentValue && selectedUtama.includes(currentValue)) {
$select.val('').trigger('change.select2');
} else {
$select.trigger('change.select2');
}
});
}
function rowHasValue($row) {
const triggerValue = $row.find('.pendapatan-trigger').first().val();
return Boolean(triggerValue);
}
function syncPendapatanRows(group) {
const $rows = $('.pendapatan-row[data-group="' + group + '"]');
let previousHasValue = true;
$rows.each(function (index) {
const $row = $(this);
const currentHasValue = rowHasValue($row);
if (index === 0 || previousHasValue || currentHasValue) {
$row.removeClass('d-none');
} else {
$row.addClass('d-none');
}
previousHasValue = currentHasValue;
});
}
function syncAllPendapatanRows() {
syncPendapatanRows('komoditas-utama');
syncPendapatanRows('komoditas-lainnya');
syncPendapatanRows('luar-pertanian');
}
function syncPihakMembantuFields() {
const isTidakAda = $('#pihak-membantu').val() === 'Tidak ada-selesaikan sendiri';
const $fields = $('#pihak-membantu-nama, #tahun-bantuan');
$fields.prop('disabled', isTidakAda);
if (isTidakAda) {
$fields.val('');
}
}
$('.sosial-ekonomi-komoditas-utama').on('change', syncKomoditasLainnyaOptions);
$('.pendapatan-trigger').on('change keyup', syncAllPendapatanRows);
$('#pihak-membantu').on('change', syncPihakMembantuFields);
syncKomoditasLainnyaOptions();
syncAllPendapatanRows();
syncPihakMembantuFields();
}); });
</script> </script>
@endpush @endpush