Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web
This commit is contained in:
@@ -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');
|
||||
}
|
||||
}
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
@@ -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,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');
|
||||
}
|
||||
}
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
@@ -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'));
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
],
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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(),
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user