sosial ekonomi

This commit is contained in:
2026-07-02 13:08:54 +07:00
parent 8886629e02
commit 5c1fe22fa0
7 changed files with 722 additions and 4 deletions
@@ -0,0 +1,264 @@
<?php
namespace App\Http\Controllers\Web\Produktivitas;
use App\Http\Controllers\Controller;
use App\Models\Pertanian\Petani;
use App\Models\Pertanian\SosialEkonomi;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
use Illuminate\Validation\Rule;
class SosialEkonomiController extends Controller
{
public function editByPetani(string $petaniId)
{
$petani = Petani::findOrFail($petaniId);
$sosialEkonomi = SosialEkonomi::with([
'pendapatanKomoditas',
'pendapatanLuarPertanian',
])
->where('petani_id', $petaniId)
->first();
$pendapatanKomoditas = $sosialEkonomi?->pendapatanKomoditas ?? collect();
$pendapatanKomoditasUtama = $pendapatanKomoditas->where('kategori', 'utama')->values();
$pendapatanKomoditasLainnya = $pendapatanKomoditas->where('kategori', 'lainnya')->values();
$pendapatanLuarPertanian = $sosialEkonomi?->pendapatanLuarPertanian?->values() ?? collect();
return view('produktivitas.petani.sosial-ekonomi.index', compact(
'petani',
'sosialEkonomi',
'pendapatanKomoditasUtama',
'pendapatanKomoditasLainnya',
'pendapatanLuarPertanian'
));
}
public function index(Request $request): JsonResponse
{
$sosialEkonomi = SosialEkonomi::with([
'petani',
'pendapatanKomoditas',
'pendapatanLuarPertanian',
])
->when($request->search, function ($query, $search) {
$query->whereHas('petani', function ($petani) use ($search) {
$petani->where('nama', 'like', "%{$search}%");
});
})
->when($request->petani_id, fn ($query, $petaniId) => $query->where('petani_id', $petaniId))
->orderBy('created_at', 'desc')
->paginate($request->per_page ?? 10);
return response()->json($sosialEkonomi);
}
public function store(Request $request): JsonResponse
{
$validated = $this->validateData($request);
$sosialEkonomi = DB::transaction(function () use ($validated) {
$sosialEkonomi = SosialEkonomi::create($this->sosialEkonomiPayload($validated) + [
'created_by' => auth()->id(),
'updated_by' => auth()->id(),
]);
$this->syncPendapatanKomoditas($sosialEkonomi, $validated['pendapatan_komoditas'] ?? []);
$this->syncPendapatanLuarPertanian($sosialEkonomi, $validated['pendapatan_luar_pertanian'] ?? []);
return $sosialEkonomi->load([
'petani',
'pendapatanKomoditas',
'pendapatanLuarPertanian',
]);
});
if (!$request->expectsJson()) {
return redirect()
->route('petani.sosial-ekonomi.edit', $sosialEkonomi->petani_id)
->with('success', 'Data sosial ekonomi berhasil disimpan.');
}
return response()->json([
'status' => 'success',
'message' => 'Data sosial ekonomi berhasil disimpan.',
'data' => $sosialEkonomi,
], 201);
}
public function show(string $id): JsonResponse
{
$sosialEkonomi = SosialEkonomi::with([
'petani',
'pendapatanKomoditas',
'pendapatanLuarPertanian',
])->findOrFail($id);
return response()->json([
'status' => 'success',
'data' => $sosialEkonomi,
]);
}
public function update(Request $request, string $id): JsonResponse
{
$sosialEkonomi = SosialEkonomi::findOrFail($id);
$validated = $this->validateData($request, $sosialEkonomi->id);
$sosialEkonomi = DB::transaction(function () use ($request, $validated, $sosialEkonomi) {
$sosialEkonomi->update($this->sosialEkonomiPayload($validated) + [
'updated_by' => auth()->id(),
]);
if ($request->has('pendapatan_komoditas')) {
$this->syncPendapatanKomoditas($sosialEkonomi, $validated['pendapatan_komoditas'] ?? []);
}
if ($request->has('pendapatan_luar_pertanian')) {
$this->syncPendapatanLuarPertanian($sosialEkonomi, $validated['pendapatan_luar_pertanian'] ?? []);
}
return $sosialEkonomi->load([
'petani',
'pendapatanKomoditas',
'pendapatanLuarPertanian',
]);
});
if (!$request->expectsJson()) {
return redirect()
->route('petani.sosial-ekonomi.edit', $sosialEkonomi->petani_id)
->with('success', 'Data sosial ekonomi berhasil diperbarui.');
}
return response()->json([
'status' => 'success',
'message' => 'Data sosial ekonomi berhasil diperbarui.',
'data' => $sosialEkonomi,
]);
}
public function destroy(string $id): JsonResponse
{
$sosialEkonomi = SosialEkonomi::findOrFail($id);
DB::transaction(function () use ($sosialEkonomi) {
$sosialEkonomi->update(['deleted_by' => auth()->id()]);
$sosialEkonomi->delete();
});
return response()->json([
'status' => 'success',
'message' => 'Data sosial ekonomi berhasil dihapus.',
]);
}
private function validateData(Request $request, ?int $id = null): array
{
return $request->validate([
'uid' => [
'nullable',
'string',
'max:255',
Rule::unique('sosial_ekonomi', 'uid')->ignore($id),
],
'petani_id' => ['nullable', 'exists:petani,id'],
'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'],
'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'],
'estimasi_tabungan_per_bulan' => ['nullable', 'integer', 'min:0'],
'skor_kecukupan_penghasilan' => ['nullable', 'integer', 'min:1', 'max:5'],
'alasan_kecukupan_penghasilan' => ['nullable', 'string'],
'status_kepemilikan_lahan' => ['nullable', 'string', 'max:255'],
'skor_kejelasan_status_lahan' => ['nullable', 'integer', 'min:1', 'max:5'],
'ada_sertifikat_dokumen' => ['nullable', 'boolean'],
'ada_sengketa' => ['nullable', 'boolean'],
'keterangan_sengketa' => ['nullable', 'string'],
'pihak_membantu_konflik' => ['nullable', 'string', 'max:255'],
'pihak_membantu_konflik_nama' => ['nullable', 'string', 'max:255'],
'tahun_bantuan_konflik' => ['nullable', 'integer', 'digits:4'],
'status_konflik' => ['nullable', 'string', 'max:255'],
'pendapatan_komoditas' => ['nullable', 'array'],
'pendapatan_komoditas.*.kategori' => ['required_with:pendapatan_komoditas', 'string', 'in:utama,lainnya'],
'pendapatan_komoditas.*.komoditas' => ['nullable', 'string', 'max:255'],
'pendapatan_komoditas.*.pendapatan' => ['nullable', 'integer', 'min:0'],
'pendapatan_komoditas.*.periode' => ['nullable', 'string', 'in:musim,tahun'],
'pendapatan_luar_pertanian' => ['nullable', 'array'],
'pendapatan_luar_pertanian.*.jenis_pekerjaan' => ['nullable', 'string', 'max:255'],
'pendapatan_luar_pertanian.*.estimasi_per_bulan' => ['nullable', 'integer', 'min:0'],
]);
}
private function sosialEkonomiPayload(array $validated): array
{
return collect($validated)
->except(['pendapatan_komoditas', 'pendapatan_luar_pertanian'])
->merge([
'uid' => $validated['uid'] ?? 'SEK-' . Str::uuid(),
])
->all();
}
private function syncPendapatanKomoditas(SosialEkonomi $sosialEkonomi, array $items): void
{
$sosialEkonomi->pendapatanKomoditas()->delete();
foreach ($items as $item) {
if (!$this->hasPendapatanKomoditasValue($item)) {
continue;
}
$sosialEkonomi->pendapatanKomoditas()->create([
'uid' => $item['uid'] ?? 'PKM-' . Str::uuid(),
'kategori' => $item['kategori'],
'komoditas' => $item['komoditas'] ?? null,
'pendapatan' => $item['pendapatan'] ?? null,
'periode' => $item['periode'] ?? null,
'created_by' => auth()->id(),
'updated_by' => auth()->id(),
]);
}
}
private function syncPendapatanLuarPertanian(SosialEkonomi $sosialEkonomi, array $items): void
{
$sosialEkonomi->pendapatanLuarPertanian()->delete();
foreach ($items as $item) {
if (!$this->hasPendapatanLuarPertanianValue($item)) {
continue;
}
$sosialEkonomi->pendapatanLuarPertanian()->create([
'uid' => $item['uid'] ?? 'PLP-' . Str::uuid(),
'jenis_pekerjaan' => $item['jenis_pekerjaan'] ?? null,
'estimasi_per_bulan' => $item['estimasi_per_bulan'] ?? null,
'created_by' => auth()->id(),
'updated_by' => auth()->id(),
]);
}
}
private function hasPendapatanKomoditasValue(array $item): bool
{
return filled($item['komoditas'] ?? null)
|| filled($item['pendapatan'] ?? null)
|| filled($item['periode'] ?? null);
}
private function hasPendapatanLuarPertanianValue(array $item): bool
{
return filled($item['jenis_pekerjaan'] ?? null)
|| filled($item['estimasi_per_bulan'] ?? null);
}
}