Compare commits
28
Commits
program
...
605506bba8
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
605506bba8 | ||
|
|
c960ba14b1 | ||
|
|
a4f38998d5 | ||
|
|
0d9f6c0b64 | ||
|
|
81775b0c13 | ||
|
|
ba1a318d09 | ||
|
|
0761d64254 | ||
|
|
67c3c6c809 | ||
|
|
04387268cd | ||
|
|
946fabb9a5 | ||
|
|
0a0c86d648 | ||
|
|
8b21fab8b8 | ||
|
|
16a0a3c56c | ||
|
|
d4c6b64ba6 | ||
|
|
b4089d72b3 | ||
|
|
01990ccec1 | ||
|
|
8aed88a31f | ||
|
|
4aa0780802 | ||
|
|
4e41246382 | ||
|
|
43fe9e5f7f | ||
|
|
c8d1994d3b | ||
|
|
cf0f4b47b4 | ||
|
|
24a8016710 | ||
|
|
20e1eee6ff | ||
|
|
c0432cd5f8 | ||
|
|
0ce0936a80 | ||
|
|
502c932f21 | ||
|
|
e60a66eeb7 |
@@ -0,0 +1,26 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Enums\AksesPasar;
|
||||||
|
|
||||||
|
enum TingkatKepercayaanPembeli: int
|
||||||
|
{
|
||||||
|
case SANGAT_PERCAYA = 1;
|
||||||
|
case CUKUP_PERCAYA = 2;
|
||||||
|
case RAGU_RAGU = 3;
|
||||||
|
case TIDAK_PERCAYA = 4;
|
||||||
|
|
||||||
|
public static function options(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
['value' => self::SANGAT_PERCAYA->value, 'label' => 'Sangat percaya, berani langsung coba'],
|
||||||
|
['value' => self::CUKUP_PERCAYA->value, 'label' => 'Cukup percaya, tapi hati hati'],
|
||||||
|
['value' => self::RAGU_RAGU->value, 'label' => 'Ragu ragu'],
|
||||||
|
['value' => self::TIDAK_PERCAYA->value, 'label' => 'Tidak percaya, enggan mencoba'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function values(): array
|
||||||
|
{
|
||||||
|
return array_column(self::cases(), 'value');
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Enums\Bumdes;
|
||||||
|
|
||||||
|
enum JabatanBumdes: string
|
||||||
|
{
|
||||||
|
case DIREKTUR = 'direktur';
|
||||||
|
case DIREKTUR_KETUA = 'direktur_ketua';
|
||||||
|
case SEKRETARIS = 'sekretaris';
|
||||||
|
case BENDAHARA = 'bendahara';
|
||||||
|
case KEPALA_UNIT_USAHA = 'kepala_unit_usaha';
|
||||||
|
case PENGAWAS = 'pengawas';
|
||||||
|
case PENASIHAT = 'penasihat';
|
||||||
|
case ANGGOTA = 'anggota';
|
||||||
|
case STAF_OPERASIONAL = 'staf_operasional';
|
||||||
|
case LAINNYA = 'lainnya';
|
||||||
|
|
||||||
|
public function label(): string
|
||||||
|
{
|
||||||
|
return match ($this) {
|
||||||
|
self::DIREKTUR => 'Direktur/Ketua',
|
||||||
|
self::DIREKTUR_KETUA => 'Direktur/Ketua',
|
||||||
|
self::SEKRETARIS => 'Sekretaris',
|
||||||
|
self::BENDAHARA => 'Bendahara',
|
||||||
|
self::KEPALA_UNIT_USAHA => 'Kepala Unit Usaha',
|
||||||
|
self::PENGAWAS => 'Pengawas',
|
||||||
|
self::PENASIHAT => 'Penasihat',
|
||||||
|
self::ANGGOTA => 'Anggota',
|
||||||
|
self::STAF_OPERASIONAL => 'Staf Operasional',
|
||||||
|
self::LAINNYA => 'Lainnya',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function options(): array
|
||||||
|
{
|
||||||
|
return collect([
|
||||||
|
self::DIREKTUR_KETUA,
|
||||||
|
self::SEKRETARIS,
|
||||||
|
self::BENDAHARA,
|
||||||
|
self::LAINNYA,
|
||||||
|
])->map(fn ($case) => [
|
||||||
|
'value' => $case->value,
|
||||||
|
'label' => $case->label(),
|
||||||
|
])->toArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,218 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Web\Bumdes;
|
||||||
|
|
||||||
|
use App\Enums\Bumdes\JabatanBumdes;
|
||||||
|
use App\Enums\Pendidikan;
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Models\Bumdes\PengurusBumdes;
|
||||||
|
use App\Models\Wilayah\Provinsi;
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\Gate;
|
||||||
|
use Illuminate\Support\Str;
|
||||||
|
use Illuminate\Validation\Rule;
|
||||||
|
|
||||||
|
class PengurusBumdesController extends Controller
|
||||||
|
{
|
||||||
|
public function index(Request $request)
|
||||||
|
{
|
||||||
|
if (! Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
||||||
|
abort(403);
|
||||||
|
}
|
||||||
|
|
||||||
|
$query = PengurusBumdes::with([
|
||||||
|
'desaKelurahan:id,nama,kecamatan_id',
|
||||||
|
'desaKelurahan.kecamatan:id,nama,kabupaten_kota_id',
|
||||||
|
'desaKelurahan.kecamatan.kabupatenKota:id,nama,provinsi_id',
|
||||||
|
'desaKelurahan.kecamatan.kabupatenKota.provinsi:id,nama',
|
||||||
|
'creator:id,name',
|
||||||
|
])
|
||||||
|
->orderBy('created_at', 'desc');
|
||||||
|
|
||||||
|
if ($request->search) {
|
||||||
|
$query->where(function ($query) use ($request) {
|
||||||
|
$query->where('nama', 'like', '%' . $request->search . '%')
|
||||||
|
->orWhere('jabatan', 'like', '%' . $request->search . '%')
|
||||||
|
->orWhere('jabatan_lainnya', 'like', '%' . $request->search . '%');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (auth()->user()->role->value === 'fasilitator') {
|
||||||
|
$query->where('created_by', auth()->id());
|
||||||
|
}
|
||||||
|
|
||||||
|
$summaryQuery = clone $query;
|
||||||
|
$totalPengurus = (clone $summaryQuery)->count();
|
||||||
|
$totalLakiLaki = (clone $summaryQuery)->where('jenis_kelamin', true)->count();
|
||||||
|
$totalPerempuan = (clone $summaryQuery)->where('jenis_kelamin', false)->count();
|
||||||
|
$totalDesaKelurahan = (clone $summaryQuery)->distinct('desa_kelurahan_id')->count('desa_kelurahan_id');
|
||||||
|
$totalJabatan = (clone $summaryQuery)->distinct('jabatan')->count('jabatan');
|
||||||
|
|
||||||
|
$pengurus = $query->paginate($request->per_page ?? 10);
|
||||||
|
$userRole = auth()->user()->role->value;
|
||||||
|
$showEnumerator = in_array($userRole, ['super_admin', 'admin']);
|
||||||
|
|
||||||
|
return view('bumdes.profil.index', compact(
|
||||||
|
'pengurus',
|
||||||
|
'totalPengurus',
|
||||||
|
'totalLakiLaki',
|
||||||
|
'totalPerempuan',
|
||||||
|
'totalDesaKelurahan',
|
||||||
|
'totalJabatan',
|
||||||
|
'showEnumerator'
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function create()
|
||||||
|
{
|
||||||
|
if (! Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
||||||
|
abort(403);
|
||||||
|
}
|
||||||
|
|
||||||
|
$provinsi = Provinsi::select('id', 'kode', 'nama')->orderBy('kode', 'asc')->get();
|
||||||
|
$jabatan = JabatanBumdes::options();
|
||||||
|
$pendidikan = Pendidikan::options();
|
||||||
|
|
||||||
|
return view('bumdes.profil.add', compact('provinsi', 'jabatan', 'pendidikan'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function store(Request $request)
|
||||||
|
{
|
||||||
|
if (! Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
||||||
|
abort(403);
|
||||||
|
}
|
||||||
|
|
||||||
|
$validatedData = $this->validatedData($request);
|
||||||
|
|
||||||
|
$pengurus = PengurusBumdes::create([
|
||||||
|
...$this->formatData($validatedData),
|
||||||
|
'uid' => 'BMD-' . strtoupper(Str::random(10)),
|
||||||
|
'created_by' => auth()->id(),
|
||||||
|
'updated_by' => auth()->id(),
|
||||||
|
]);
|
||||||
|
|
||||||
|
return redirect()->route('bumdes.edit', $pengurus->id)->with('success', 'Data pengurus BUMDes berhasil ditambahkan.');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function show(string $id)
|
||||||
|
{
|
||||||
|
return redirect()->route('bumdes.edit', $id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function edit(string $id)
|
||||||
|
{
|
||||||
|
if (! Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
||||||
|
abort(403);
|
||||||
|
}
|
||||||
|
|
||||||
|
$pengurus = $this->pengurusQuery()->with([
|
||||||
|
'desaKelurahan.kecamatan.kabupatenKota.provinsi',
|
||||||
|
])->findOrFail($id);
|
||||||
|
$provinsi = Provinsi::select('id', 'kode', 'nama')->orderBy('kode', 'asc')->get();
|
||||||
|
$jabatan = JabatanBumdes::options();
|
||||||
|
$pendidikan = Pendidikan::options();
|
||||||
|
|
||||||
|
return view('bumdes.profil.edit', compact('pengurus', 'provinsi', 'jabatan', 'pendidikan'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function update(Request $request, string $id)
|
||||||
|
{
|
||||||
|
if (! Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
||||||
|
abort(403);
|
||||||
|
}
|
||||||
|
|
||||||
|
$pengurus = $this->pengurusQuery()->findOrFail($id);
|
||||||
|
$validatedData = $this->validatedData($request);
|
||||||
|
|
||||||
|
$pengurus->update([
|
||||||
|
...$this->formatData($validatedData),
|
||||||
|
'updated_by' => auth()->id(),
|
||||||
|
]);
|
||||||
|
|
||||||
|
return redirect()->route('bumdes.edit', $pengurus->id)->with('success', 'Data pengurus BUMDes berhasil diupdate.');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function destroy(string $id)
|
||||||
|
{
|
||||||
|
if (! Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
||||||
|
abort(403);
|
||||||
|
}
|
||||||
|
|
||||||
|
$pengurus = $this->pengurusQuery()->findOrFail($id);
|
||||||
|
$pengurus->update(['deleted_by' => auth()->id()]);
|
||||||
|
$pengurus->delete();
|
||||||
|
|
||||||
|
return response()->json(['message' => 'Data pengurus BUMDes berhasil dihapus.']);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function kelembagaanAktor(string $id)
|
||||||
|
{
|
||||||
|
if (! Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
||||||
|
abort(403);
|
||||||
|
}
|
||||||
|
|
||||||
|
$pengurus = $this->pengurusQuery()->with([
|
||||||
|
'desaKelurahan.kecamatan.kabupatenKota.provinsi',
|
||||||
|
])->findOrFail($id);
|
||||||
|
|
||||||
|
return view('bumdes.kelembagaan-aktor.index', compact('pengurus'));
|
||||||
|
}
|
||||||
|
|
||||||
|
private function pengurusQuery()
|
||||||
|
{
|
||||||
|
$query = PengurusBumdes::query();
|
||||||
|
|
||||||
|
if (auth()->user()->role->value === 'fasilitator') {
|
||||||
|
$query->where('created_by', auth()->id());
|
||||||
|
}
|
||||||
|
|
||||||
|
return $query;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function validatedData(Request $request): array
|
||||||
|
{
|
||||||
|
return $request->validate([
|
||||||
|
'nama' => ['required', 'string', 'max:255'],
|
||||||
|
'jenis_kelamin' => ['required', 'boolean'],
|
||||||
|
'tempat_lahir' => ['required', 'string', 'max:255'],
|
||||||
|
'tanggal_lahir' => ['required', 'date_format:d-m-Y'],
|
||||||
|
'pendidikan_terakhir' => ['required', Rule::enum(Pendidikan::class)],
|
||||||
|
'alamat' => ['required', 'string', 'max:500'],
|
||||||
|
'desa_kelurahan_id' => ['required', 'exists:master_desa_kelurahan,id'],
|
||||||
|
'nomor_telepon' => ['nullable', 'digits_between:11,13'],
|
||||||
|
'jabatan' => ['required', Rule::enum(JabatanBumdes::class)],
|
||||||
|
'jabatan_lainnya' => ['nullable', 'required_if:jabatan,' . JabatanBumdes::LAINNYA->value, 'string', 'max:255'],
|
||||||
|
'lama_menjabat_tahun' => ['required', 'integer', 'min:0', 'max:80'],
|
||||||
|
], [
|
||||||
|
'nama.required' => 'Nama harus diisi.',
|
||||||
|
'jenis_kelamin.required' => 'Jenis kelamin harus dipilih.',
|
||||||
|
'tempat_lahir.required' => 'Tempat lahir harus diisi.',
|
||||||
|
'tanggal_lahir.required' => 'Tanggal lahir harus diisi.',
|
||||||
|
'tanggal_lahir.date_format' => 'Tanggal lahir harus menggunakan format tanggal yang valid.',
|
||||||
|
'pendidikan_terakhir.required' => 'Pendidikan terakhir harus dipilih.',
|
||||||
|
'alamat.required' => 'Alamat harus diisi.',
|
||||||
|
'desa_kelurahan_id.required' => 'Desa kelurahan harus dipilih.',
|
||||||
|
'desa_kelurahan_id.exists' => 'Desa kelurahan tidak ditemukan.',
|
||||||
|
'nomor_telepon.digits_between' => 'Nomor telepon harus berupa angka 11 sampai 13 digit.',
|
||||||
|
'jabatan.required' => 'Jabatan/peran harus dipilih.',
|
||||||
|
'jabatan_lainnya.required_if' => 'Jabatan lainnya harus diisi.',
|
||||||
|
'lama_menjabat_tahun.required' => 'Lama menjabat harus diisi.',
|
||||||
|
'lama_menjabat_tahun.integer' => 'Lama menjabat harus berupa angka tahun.',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function formatData(array $data): array
|
||||||
|
{
|
||||||
|
$data['tanggal_lahir'] = Carbon::createFromFormat('d-m-Y', $data['tanggal_lahir'])->format('Y-m-d');
|
||||||
|
$data['tanggal_mulai_menjabat'] = Carbon::now()
|
||||||
|
->subYears((int) $data['lama_menjabat_tahun'])
|
||||||
|
->format('Y-m-d');
|
||||||
|
|
||||||
|
if (($data['jabatan'] ?? null) !== JabatanBumdes::LAINNYA->value) {
|
||||||
|
$data['jabatan_lainnya'] = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,260 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Web\Dashboard;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use Illuminate\Support\Str;
|
||||||
|
|
||||||
|
use App\Models\Pertanian\Petani;
|
||||||
|
use App\Models\Pertanian\Komoditas;
|
||||||
|
use App\Models\Pertanian\Lahan;
|
||||||
|
use App\Models\Pertanian\PendapatanKomoditas;
|
||||||
|
|
||||||
|
class DemografiPetaniController extends Controller
|
||||||
|
{
|
||||||
|
public function index(Request $request)
|
||||||
|
{
|
||||||
|
$totalPetani = Petani::count();
|
||||||
|
$petaniLakilaki = Petani::where('jenis_kelamin', 1)->count();
|
||||||
|
$petaniPerempuan = Petani::where('jenis_kelamin', 0)->count();
|
||||||
|
$totalKomoditas = Petani::whereNotNull('komoditas_id')
|
||||||
|
->distinct()
|
||||||
|
->count('komoditas_id');
|
||||||
|
$totalLuasLahan = Lahan::has('petani')
|
||||||
|
->sum('luas_lahan');
|
||||||
|
$ratarataLuasLahan = $totalLuasLahan && $totalPetani ? $totalLuasLahan / $totalPetani : 0;
|
||||||
|
|
||||||
|
$umurKurang30 = Petani::whereNotNull('tanggal_lahir')->whereRaw("EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) < 30")->count();
|
||||||
|
$umur30sampai39 = Petani::whereNotNull('tanggal_lahir')->whereRaw("EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) BETWEEN 30 AND 39")->count();
|
||||||
|
$umur40sampai49 = Petani::whereNotNull('tanggal_lahir')->whereRaw("EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) BETWEEN 40 AND 49")->count();
|
||||||
|
$umur50sampai59 = Petani::whereNotNull('tanggal_lahir')->whereRaw("EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) BETWEEN 50 AND 59")->count();
|
||||||
|
$umur60keatas = Petani::whereNotNull('tanggal_lahir')->whereRaw("EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) >= 60")->count();
|
||||||
|
|
||||||
|
$pendidikanCounts = Petani::whereNotNull('pendidikan_terakhir')
|
||||||
|
->select('pendidikan_terakhir', DB::raw('COUNT(*) as total'))
|
||||||
|
->groupBy('pendidikan_terakhir')
|
||||||
|
->pluck('total', 'pendidikan_terakhir');
|
||||||
|
|
||||||
|
$pendidikan = [
|
||||||
|
'tidak_sekolah' => (int) ($pendidikanCounts['01_tidak_sekolah'] ?? 0),
|
||||||
|
'sd' => (int) ($pendidikanCounts['02_sd'] ?? 0),
|
||||||
|
'smp' => (int) ($pendidikanCounts['03_smp'] ?? 0),
|
||||||
|
'sma' => (int) ($pendidikanCounts['04_sma'] ?? 0),
|
||||||
|
'diploma' => (int) ($pendidikanCounts['05_diploma'] ?? 0),
|
||||||
|
|
||||||
|
's1_keatas' =>
|
||||||
|
(int) ($pendidikanCounts['06_sarjana'] ?? 0) +
|
||||||
|
(int) ($pendidikanCounts['07_magister'] ?? 0),
|
||||||
|
];
|
||||||
|
|
||||||
|
$komoditasUtama = Komoditas::query()
|
||||||
|
->whereHas('petani')
|
||||||
|
->withCount('petani')
|
||||||
|
->orderByDesc('petani_count')
|
||||||
|
->get(['id', 'nama']);
|
||||||
|
|
||||||
|
$luasLahanPerPetani = Lahan::has('petani')
|
||||||
|
->select('petani_id')
|
||||||
|
->selectRaw('SUM(luas_lahan) as total_luas')
|
||||||
|
->groupBy('petani_id')
|
||||||
|
->get();
|
||||||
|
|
||||||
|
$luasLahan = [
|
||||||
|
'kurang_05' => $luasLahanPerPetani->filter(fn ($item) => $item->total_luas < 5000)->count(),
|
||||||
|
'05_1' => $luasLahanPerPetani->filter(fn ($item) => $item->total_luas >= 5000 && $item->total_luas <= 10000)->count(),
|
||||||
|
'1_2' => $luasLahanPerPetani->filter(fn ($item) => $item->total_luas > 10000 && $item->total_luas <= 20000)->count(),
|
||||||
|
'lebih_2' => $luasLahanPerPetani->filter(fn ($item) => $item->total_luas > 20000)->count(),
|
||||||
|
];
|
||||||
|
|
||||||
|
$pendapatanPerPetani = PendapatanKomoditas::with('sosialEkonomi.petani')->get()
|
||||||
|
->filter(fn ($item) => $item->sosialEkonomi?->petani)
|
||||||
|
->groupBy(fn ($item) => $item->sosialEkonomi->petani_id)
|
||||||
|
->map(fn ($items) => $items->sum('pendapatan'));
|
||||||
|
|
||||||
|
$penghasilan = [
|
||||||
|
'kurang_1' => $pendapatanPerPetani->filter(fn ($value) => $value < 1000000)->count(),
|
||||||
|
'1_3' => $pendapatanPerPetani->filter(fn ($value) => $value >= 1000000 && $value <= 3000000)->count(),
|
||||||
|
'3_5' => $pendapatanPerPetani->filter(fn ($value) => $value > 3000000 && $value <= 5000000)->count(),
|
||||||
|
'5_10' => $pendapatanPerPetani->filter(fn ($value) => $value > 5000000 && $value <= 10000000)->count(),
|
||||||
|
'lebih_10' => $pendapatanPerPetani->filter(fn ($value) => $value > 10000000)->count(),
|
||||||
|
];
|
||||||
|
|
||||||
|
$data = [
|
||||||
|
'total_petani' => $totalPetani,
|
||||||
|
'petani_lakilaki' => $petaniLakilaki,
|
||||||
|
'petani_perempuan' => $petaniPerempuan,
|
||||||
|
'total_komoditas' => $totalKomoditas,
|
||||||
|
'total_luas_lahan' => $totalLuasLahan,
|
||||||
|
'ratarata_luas_lahan' => $ratarataLuasLahan,
|
||||||
|
'kelompok_umur' => [
|
||||||
|
'kurang_30' => $umurKurang30,
|
||||||
|
'30_39' => $umur30sampai39,
|
||||||
|
'40_49' => $umur40sampai49,
|
||||||
|
'50_59' => $umur50sampai59,
|
||||||
|
'60_keatas' => $umur60keatas,
|
||||||
|
],
|
||||||
|
'pendidikan' => $pendidikan,
|
||||||
|
'komoditas_utama' => [
|
||||||
|
'ids' => $komoditasUtama
|
||||||
|
->pluck('id')
|
||||||
|
->values(),
|
||||||
|
|
||||||
|
'labels' => $komoditasUtama
|
||||||
|
->pluck('nama')
|
||||||
|
->values(),
|
||||||
|
|
||||||
|
'series' => $komoditasUtama
|
||||||
|
->pluck('petani_count')
|
||||||
|
->map(fn ($value) => (int) $value)
|
||||||
|
->values(),
|
||||||
|
],
|
||||||
|
'luas_lahan' => $luasLahan,
|
||||||
|
'penghasilan' => $penghasilan,
|
||||||
|
];
|
||||||
|
|
||||||
|
$daftarPetani = Petani::with([
|
||||||
|
'komoditas'
|
||||||
|
])
|
||||||
|
->withSum('lahans as total_luas_lahan', 'luas_lahan')
|
||||||
|
->orderBy('id')
|
||||||
|
->paginate(10);
|
||||||
|
// dd($daftarPetani);
|
||||||
|
return view('dashboard.demografi-petani', compact('data', 'daftarPetani'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function data(Request $request)
|
||||||
|
{
|
||||||
|
$query = Petani::with('komoditas')->withSum( 'lahans as total_luas_lahan', 'luas_lahan');
|
||||||
|
|
||||||
|
if ($request->filled('search')) {
|
||||||
|
$search = $request->search;
|
||||||
|
$query->where('nama', 'ILIKE', "%{$search}%" );
|
||||||
|
}
|
||||||
|
|
||||||
|
$pendapatanPerPetani = PendapatanKomoditas::with('sosialEkonomi.petani')->get()
|
||||||
|
->filter(fn ($item) => $item->sosialEkonomi?->petani)
|
||||||
|
->groupBy(fn ($item) => $item->sosialEkonomi->petani_id)
|
||||||
|
->map(fn ($items) => $items->sum('pendapatan'));
|
||||||
|
|
||||||
|
if ($request->has('gender') && $request->gender !== '') {
|
||||||
|
$query->where('jenis_kelamin', $request->gender );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($request->filled('umur')) {
|
||||||
|
match ($request->umur) {
|
||||||
|
'kurang_30' => $query->whereNotNull('tanggal_lahir')
|
||||||
|
->whereRaw("EXTRACT( YEAR FROM AGE( CURRENT_DATE, tanggal_lahir)) < 30"),
|
||||||
|
'30_39' => $query->whereNotNull('tanggal_lahir')
|
||||||
|
->whereRaw("EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) BETWEEN 30 AND 39"),
|
||||||
|
'40_49' => $query->whereNotNull('tanggal_lahir')
|
||||||
|
->whereRaw("EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) BETWEEN 40 AND 49"),
|
||||||
|
'50_59' => $query->whereNotNull('tanggal_lahir')
|
||||||
|
->whereRaw("EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) BETWEEN 50 AND 59"),
|
||||||
|
'60_keatas' => $query ->whereNotNull('tanggal_lahir')
|
||||||
|
->whereRaw("EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) >= 60"),
|
||||||
|
default => null
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($request->filled('pendidikan')) {
|
||||||
|
$pendidikanMap = [
|
||||||
|
'tidak_sekolah' => ['01_tidak_sekolah'],
|
||||||
|
'sd' => ['02_sd'],
|
||||||
|
'smp' => ['03_smp'],
|
||||||
|
'sma' => ['04_sma'],
|
||||||
|
'diploma' => ['05_diploma'],
|
||||||
|
's1_keatas' => ['06_sarjana', '07_magister'],
|
||||||
|
];
|
||||||
|
|
||||||
|
if (isset($pendidikanMap[$request->pendidikan])) {
|
||||||
|
$query->whereIn('pendidikan_terakhir', $pendidikanMap[$request->pendidikan]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($request->filled('komoditas')) {
|
||||||
|
$query->where('komoditas_id', $request->komoditas);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($request->filled('penghasilan')) {
|
||||||
|
$filteredPendapatan =
|
||||||
|
match ($request->penghasilan) {
|
||||||
|
'kurang_1' => $pendapatanPerPetani ->filter(fn ($value) => $value < 1000000 ),
|
||||||
|
'1_3' => $pendapatanPerPetani->filter( fn ($value) => $value >= 1000000 && $value <= 3000000 ),
|
||||||
|
'3_5' => $pendapatanPerPetani->filter(fn ($value) => $value > 3000000 && $value <= 5000000 ),
|
||||||
|
'5_10' => $pendapatanPerPetani->filter(fn ($value) => $value > 5000000 && $value <= 10000000 ),
|
||||||
|
'lebih_10' => $pendapatanPerPetani->filter(fn ($value) => $value > 10000000 ),
|
||||||
|
default => collect()
|
||||||
|
};
|
||||||
|
|
||||||
|
$query->whereIn('id', $filteredPendapatan->keys()->values()->all());
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($request->filled('luas_lahan')) {
|
||||||
|
$lahanQuery = Lahan::query()->select('petani_id')->groupBy('petani_id');
|
||||||
|
match ($request->luas_lahan) {
|
||||||
|
'kurang_05' => $lahanQuery->havingRaw('SUM(luas_lahan) < 5000' ),
|
||||||
|
'05_1' => $lahanQuery->havingRaw('SUM(luas_lahan) >= 5000 AND SUM(luas_lahan) <= 10000' ),
|
||||||
|
'1_2' => $lahanQuery->havingRaw('SUM(luas_lahan) > 10000 AND SUM(luas_lahan) <= 20000'),
|
||||||
|
'lebih_2' => $lahanQuery->havingRaw('SUM(luas_lahan) > 20000'),
|
||||||
|
default => null
|
||||||
|
};
|
||||||
|
$query->whereIn('id', $lahanQuery->pluck('petani_id'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$daftarPetani = $query->orderBy('id')->paginate(10);
|
||||||
|
|
||||||
|
$pendidikanLabels = [
|
||||||
|
'01_tidak_sekolah' => 'Tidak Sekolah',
|
||||||
|
'02_sd' => 'SD',
|
||||||
|
'03_smp' => 'SMP',
|
||||||
|
'04_sma' => 'SMA',
|
||||||
|
'05_diploma' => 'Diploma',
|
||||||
|
'06_sarjana' => 'Sarjana',
|
||||||
|
'07_magister' => 'Magister',
|
||||||
|
];
|
||||||
|
|
||||||
|
$rows = collect($daftarPetani->items())->map(function ($petani) use (
|
||||||
|
$pendidikanLabels,
|
||||||
|
$pendapatanPerPetani
|
||||||
|
) {
|
||||||
|
$umur = $petani->tanggal_lahir ? \Carbon\Carbon::parse($petani->tanggal_lahir)->age : null;
|
||||||
|
$pendidikanRaw = $petani->getRawOriginal('pendidikan_terakhir');
|
||||||
|
$pendapatan = $pendapatanPerPetani->get($petani->id);
|
||||||
|
|
||||||
|
$rentangPenghasilan = match (true) {
|
||||||
|
$pendapatan === null => '-',
|
||||||
|
$pendapatan < 1000000 => '< Rp1 juta',
|
||||||
|
$pendapatan <= 3000000 => 'Rp1 - 3 juta',
|
||||||
|
$pendapatan <= 5000000 => 'Rp3 - 5 juta',
|
||||||
|
$pendapatan <= 10000000 => 'Rp5 - 10 juta',
|
||||||
|
default => '> Rp10 juta',
|
||||||
|
};
|
||||||
|
|
||||||
|
return [
|
||||||
|
'id' => $petani->kode ?? $petani->id,
|
||||||
|
'nama' => $petani->nama ?? '-',
|
||||||
|
'jenis_kelamin' => $petani->jenis_kelamin,
|
||||||
|
'gender' => $petani->jenis_kelamin == 1 ? 'Laki-laki' : 'Perempuan',
|
||||||
|
'umur' => $umur,
|
||||||
|
'komoditas' => $petani->komoditas?->nama ?? '-',
|
||||||
|
'luas_lahan' => (float) ($petani->total_luas_lahan ?? 0 ),
|
||||||
|
'pendidikan' => $pendidikanLabels[$pendidikanRaw ] ?? '-',
|
||||||
|
'rentang_penghasilan' => $rentangPenghasilan,
|
||||||
|
];
|
||||||
|
});
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'data' => $rows,
|
||||||
|
'pagination' => [
|
||||||
|
'current_page' => $daftarPetani->currentPage(),
|
||||||
|
'last_page' => $daftarPetani->lastPage(),
|
||||||
|
'per_page' => $daftarPetani->perPage(),
|
||||||
|
'total' => $daftarPetani->total(),
|
||||||
|
'from' => $daftarPetani->firstItem(),
|
||||||
|
'to' => $daftarPetani->lastItem(),
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,180 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Web\Dashboard;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\Gate;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
|
||||||
|
use App\Models\Pertanian\Petani;
|
||||||
|
use App\Models\Pertanian\Komoditas;
|
||||||
|
use App\Models\Pertanian\Lahan;
|
||||||
|
use App\Models\Pertanian\Tanaman;
|
||||||
|
use App\Models\Pertanian\SkorPetani;
|
||||||
|
|
||||||
|
class IndeksPetaniController extends Controller
|
||||||
|
{
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
||||||
|
abort(403);
|
||||||
|
}
|
||||||
|
|
||||||
|
$title = 'Dashboard Profil Petani';
|
||||||
|
|
||||||
|
$komoditas = Komoditas::where('is_utama', true)->get();
|
||||||
|
|
||||||
|
$petani = Petani::pluck('id');
|
||||||
|
$lahan = Lahan::has('petani')->get();
|
||||||
|
|
||||||
|
$case = "
|
||||||
|
CASE
|
||||||
|
WHEN skor_kesiapan_adopsi >= 4.0 THEN 'Penggerak'
|
||||||
|
WHEN skor_kesiapan_adopsi >= 3.0 THEN 'Perintis'
|
||||||
|
WHEN skor_kesiapan_adopsi >= 2.0 THEN 'Pemerhati'
|
||||||
|
WHEN skor_kesiapan_adopsi >= 1.0 THEN 'Pemula'
|
||||||
|
ELSE 'Belum Lengkap'
|
||||||
|
END
|
||||||
|
";
|
||||||
|
|
||||||
|
$countPetani = Petani::count();
|
||||||
|
$countKomoditas = Petani::whereIn('komoditas_id', $komoditas->pluck('id'))->distinct()->count('komoditas_id');
|
||||||
|
$sumLahan = Lahan::has('petani')->whereIn('komoditas_id', $komoditas->pluck('id'))->sum('luas_lahan');
|
||||||
|
$avgLahan = Lahan::has('petani')->whereIn('komoditas_id', $komoditas->pluck('id'))->avg('luas_lahan');
|
||||||
|
|
||||||
|
$avgSkor = SkorPetani::query()
|
||||||
|
->join('petani', 'petani_skor.petani_id', '=', 'petani.id')
|
||||||
|
->whereNull('petani.deleted_at')
|
||||||
|
->whereIn('petani.komoditas_id', $komoditas->pluck('id'))
|
||||||
|
->avg('skor_kesiapan_adopsi');
|
||||||
|
|
||||||
|
if ($avgSkor >= 4.0) {
|
||||||
|
$avgSegmen = 'Penggerak';
|
||||||
|
} elseif ($avgSkor >= 3.0) {
|
||||||
|
$avgSegmen = 'Perintis';
|
||||||
|
} elseif ($avgSkor >= 2.0) {
|
||||||
|
$avgSegmen = 'Pemerhati';
|
||||||
|
} elseif ($avgSkor >= 1.0) {
|
||||||
|
$avgSegmen = 'Pemula';
|
||||||
|
} else {
|
||||||
|
$avgSegmen = 'Belum Lengkap';
|
||||||
|
}
|
||||||
|
|
||||||
|
$countDesa = Petani::whereIn('komoditas_id', $komoditas->pluck('id'))->distinct()->count('desa_kelurahan_id');
|
||||||
|
$countKecamatan = Petani::query()
|
||||||
|
->join('master_desa_kelurahan', 'petani.desa_kelurahan_id', '=', 'master_desa_kelurahan.id')
|
||||||
|
->join('master_kecamatan', 'master_desa_kelurahan.kecamatan_id', '=', 'master_kecamatan.id')
|
||||||
|
->whereIn('komoditas_id', $komoditas->pluck('id'))->distinct()->count('master_kecamatan.id');
|
||||||
|
|
||||||
|
$countSegmentasi = SkorPetani::selectRaw("$case AS segmen, COUNT(*) AS total")
|
||||||
|
->groupByRaw($case)
|
||||||
|
->get();
|
||||||
|
|
||||||
|
$countSegmentasiByKomoditas = SkorPetani::query()
|
||||||
|
->join('petani', 'petani_skor.petani_id', '=', 'petani.id')
|
||||||
|
->whereNull('petani.deleted_at')
|
||||||
|
->selectRaw("
|
||||||
|
petani.komoditas_id,
|
||||||
|
$case AS segmen,
|
||||||
|
COUNT(petani.id) AS total
|
||||||
|
")
|
||||||
|
->groupBy('petani.komoditas_id')
|
||||||
|
->groupByRaw($case)
|
||||||
|
->get();
|
||||||
|
|
||||||
|
$avgDimensi = SkorPetani::query()
|
||||||
|
->join('petani', 'petani_skor.petani_id', '=', 'petani.id')
|
||||||
|
->whereNull('petani.deleted_at')
|
||||||
|
->whereIn('petani.komoditas_id', $komoditas->pluck('id'))
|
||||||
|
->selectRaw("
|
||||||
|
avg(skor_d2_sistem_praktik_budidaya) as skor_d2_sistem_praktik_budidaya,
|
||||||
|
avg(skor_d4_sosial_ekonomi) as skor_d4_sosial_ekonomi,
|
||||||
|
avg(skor_d6_rantai_nilai_akses_pasar) as skor_d6_rantai_nilai_akses_pasar")
|
||||||
|
->first();
|
||||||
|
|
||||||
|
$avgKomponen = SkorPetani::query()
|
||||||
|
->join('petani', 'petani_skor.petani_id', '=', 'petani.id')
|
||||||
|
->whereNull('petani.deleted_at')
|
||||||
|
->whereIn('petani.komoditas_id', $komoditas->pluck('id'))
|
||||||
|
->selectRaw("avg(skor_komp_1_d4_k3_motivasi_kapasitas_adopsi) as skor_komp_1_d4_k3_motivasi_kapasitas_adopsi,
|
||||||
|
avg(skor_komp_2_d4_k2_ekonomi_rumah_tangga) as skor_komp_2_d4_k2_ekonomi_rumah_tangga,
|
||||||
|
avg(skor_komp_3_d2_praktik_budidaya_gap) as skor_komp_3_d2_praktik_budidaya_gap,
|
||||||
|
avg(skor_komp_4_d4_k4_keterlibatan_kelembagaan) as skor_komp_4_d4_k4_keterlibatan_kelembagaan,
|
||||||
|
avg(skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan) as skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan,
|
||||||
|
avg(skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar) as skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar")
|
||||||
|
->first();
|
||||||
|
|
||||||
|
$desaKelurahan = Petani::query()
|
||||||
|
->join('master_desa_kelurahan', 'petani.desa_kelurahan_id', '=', 'master_desa_kelurahan.id')
|
||||||
|
->join('master_kecamatan', 'master_desa_kelurahan.kecamatan_id', '=', 'master_kecamatan.id')
|
||||||
|
->join('master_kabupaten_kota', 'master_kecamatan.kabupaten_kota_id', '=', 'master_kabupaten_kota.id')
|
||||||
|
->join('master_provinsi', 'master_kabupaten_kota.provinsi_id', '=', 'master_provinsi.id')
|
||||||
|
->selectRaw("
|
||||||
|
master_desa_kelurahan.id as desa_kelurahan_id,
|
||||||
|
master_desa_kelurahan.nama as desa_kelurahan,
|
||||||
|
master_desa_kelurahan.path as path,
|
||||||
|
master_kecamatan.id as kecamatan_id,
|
||||||
|
master_kecamatan.nama as kecamatan,
|
||||||
|
master_kabupaten_kota.id as kabupaten_id,
|
||||||
|
master_kabupaten_kota.nama as kabupaten,
|
||||||
|
master_provinsi.id as provinsi_id,
|
||||||
|
master_provinsi.nama as provinsi
|
||||||
|
")
|
||||||
|
->whereIn('petani.id', $petani)
|
||||||
|
->distinct()
|
||||||
|
->get();
|
||||||
|
|
||||||
|
$mapSegmentasi = SkorPetani::query()
|
||||||
|
->join('petani', 'petani_skor.petani_id', '=', 'petani.id')
|
||||||
|
->whereNull('petani.deleted_at')
|
||||||
|
->selectRaw("petani.desa_kelurahan_id,
|
||||||
|
$case AS segmen,
|
||||||
|
COUNT(petani.id) AS total
|
||||||
|
")
|
||||||
|
->groupBy('petani.desa_kelurahan_id')
|
||||||
|
->groupByRaw($case)
|
||||||
|
->get();
|
||||||
|
|
||||||
|
$mapAvgSkorSegmentasi = SkorPetani::query()
|
||||||
|
->join('petani', 'petani_skor.petani_id', '=', 'petani.id')
|
||||||
|
->whereNull('petani.deleted_at')
|
||||||
|
->selectRaw("petani.desa_kelurahan_id,
|
||||||
|
COUNT(petani.id) AS jumlah_petani,
|
||||||
|
avg(skor_kesiapan_adopsi) AS skor,
|
||||||
|
CASE
|
||||||
|
WHEN AVG(skor_kesiapan_adopsi) >= 4 THEN 'Penggerak'
|
||||||
|
WHEN AVG(skor_kesiapan_adopsi) >= 3 THEN 'Perintis'
|
||||||
|
WHEN AVG(skor_kesiapan_adopsi) >= 2 THEN 'Pemerhati'
|
||||||
|
WHEN AVG(skor_kesiapan_adopsi) >= 1 THEN 'Pemula'
|
||||||
|
ELSE 'Belum Lengkap'
|
||||||
|
END AS segmen
|
||||||
|
")
|
||||||
|
->groupBy('petani.desa_kelurahan_id')
|
||||||
|
->get();
|
||||||
|
|
||||||
|
$daftarPetani = Petani::query()
|
||||||
|
->whereIn('komoditas_id', $komoditas->pluck('id'))
|
||||||
|
->get();
|
||||||
|
|
||||||
|
return view('dashboard.indeks-petani', compact(
|
||||||
|
'komoditas',
|
||||||
|
'countPetani',
|
||||||
|
'countKomoditas',
|
||||||
|
'sumLahan',
|
||||||
|
'avgLahan',
|
||||||
|
'avgSkor',
|
||||||
|
'avgSegmen',
|
||||||
|
'countDesa',
|
||||||
|
'countKecamatan',
|
||||||
|
'countSegmentasi',
|
||||||
|
'countSegmentasiByKomoditas',
|
||||||
|
'avgDimensi',
|
||||||
|
'avgKomponen',
|
||||||
|
'desaKelurahan',
|
||||||
|
'mapSegmentasi',
|
||||||
|
'mapAvgSkorSegmentasi',
|
||||||
|
'daftarPetani',
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,760 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Web\Dashboard;
|
||||||
|
|
||||||
|
use App\Enums\KeparahanSerangan;
|
||||||
|
use App\Enums\PenyakitTanaman;
|
||||||
|
use App\Enums\PraktikBudidaya\PemberianPupuk;
|
||||||
|
use App\Enums\SeranganHama;
|
||||||
|
use App\Enums\SosialEkonomi\StatusKepemilikanLahanSosialEkonomi;
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Models\Pertanian\Komoditas;
|
||||||
|
use App\Models\Pertanian\Lahan;
|
||||||
|
use App\Models\Pertanian\Petani;
|
||||||
|
use App\Models\Pertanian\PraktikBudidaya;
|
||||||
|
use App\Models\Pertanian\Produksi;
|
||||||
|
use App\Models\Pertanian\SkorPetani;
|
||||||
|
use App\Models\Pertanian\SosialEkonomi;
|
||||||
|
use App\Models\Pertanian\SurveyProduktivitas;
|
||||||
|
use App\Models\Wilayah\DesaKelurahan;
|
||||||
|
use App\Models\Wilayah\KabupatenKota;
|
||||||
|
use App\Models\Wilayah\Kecamatan;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
|
||||||
|
class IndikatorPertanianController extends Controller
|
||||||
|
{
|
||||||
|
public function index(Request $request)
|
||||||
|
{
|
||||||
|
$kabupatenOptions = $this->kabupatenOptions();
|
||||||
|
$ngadaOption = collect($kabupatenOptions)->first(
|
||||||
|
fn ($option) => str_contains(strtolower($option['label']), 'ngada')
|
||||||
|
);
|
||||||
|
$initialFilters = $this->selectedFilters($request, $ngadaOption['value'] ?? 'all');
|
||||||
|
|
||||||
|
$totalPetani = $this->applyPetaniFilters(Petani::query(), $initialFilters)->count();
|
||||||
|
$totalLuasLahan = ((float) $this->applyLahanFilters(Lahan::query(), $initialFilters)->sum('luas_lahan')) / 10000;
|
||||||
|
$rataRataLuasLahan = $totalPetani > 0
|
||||||
|
? $totalLuasLahan / $totalPetani
|
||||||
|
: 0;
|
||||||
|
$totalProduksiKg = $this->totalProduksiKg($initialFilters);
|
||||||
|
$rataRataProduksiKg = $totalPetani > 0
|
||||||
|
? $totalProduksiKg / $totalPetani
|
||||||
|
: 0;
|
||||||
|
$rataRataProduktivitas = $totalLuasLahan > 0
|
||||||
|
? $totalProduksiKg / $totalLuasLahan
|
||||||
|
: 0;
|
||||||
|
|
||||||
|
$filterOptions = [
|
||||||
|
[
|
||||||
|
'key' => 'kabupaten',
|
||||||
|
'label' => 'Kabupaten',
|
||||||
|
'options' => $kabupatenOptions,
|
||||||
|
'icon' => 'tabler-map-pin',
|
||||||
|
'readonly' => true,
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'key' => 'kecamatan',
|
||||||
|
'label' => 'Kecamatan',
|
||||||
|
'options' => $this->kecamatanOptions(),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'key' => 'desa',
|
||||||
|
'label' => 'Desa',
|
||||||
|
'options' => $this->desaOptions(),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'key' => 'komoditas',
|
||||||
|
'label' => 'Komoditas',
|
||||||
|
'options' => $this->komoditasOptions(),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'key' => 'segmentasi',
|
||||||
|
'label' => 'Segmentasi',
|
||||||
|
'options' => $this->segmentasiOptions(),
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
||||||
|
$summaryData = [
|
||||||
|
[
|
||||||
|
'value' => number_format($totalPetani, 0, ',', '.'),
|
||||||
|
'label' => 'Petani Terdata',
|
||||||
|
'description' => 'Total petani yang masuk sistem',
|
||||||
|
'icon' => 'tabler-users',
|
||||||
|
'variant' => 'primary',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'value' => number_format($totalLuasLahan, 2, ',', '.').' ha',
|
||||||
|
'label' => 'Total Luas Lahan',
|
||||||
|
'description' => 'Rata-rata '.number_format($rataRataLuasLahan, 2, ',', '.').' ha/petani',
|
||||||
|
'icon' => 'tabler-mountain',
|
||||||
|
'variant' => 'success',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'value' => number_format($totalProduksiKg, 0, ',', '.').' kg',
|
||||||
|
'label' => 'Total Produksi (Semua Komoditas)',
|
||||||
|
'description' => 'Rata-rata '.number_format($rataRataProduksiKg, 0, ',', '.').' kg/petani',
|
||||||
|
'icon' => 'tabler-wheat',
|
||||||
|
'variant' => 'warning',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'value' => number_format($rataRataProduktivitas, 0, ',', '.').' kg/ha',
|
||||||
|
'label' => 'Rata-rata Produktivitas',
|
||||||
|
'description' => 'Semua komoditas berdasarkan total produksi dan luas lahan',
|
||||||
|
'icon' => 'tabler-chart-bar',
|
||||||
|
'variant' => 'info',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
||||||
|
return view('dashboard.indikator-pertanian', [
|
||||||
|
'title' => 'Indikator Pertanian',
|
||||||
|
'initialFilters' => $initialFilters,
|
||||||
|
'filterOptions' => $filterOptions,
|
||||||
|
'summaryData' => $summaryData,
|
||||||
|
'chartData' => [
|
||||||
|
'petaniPerKomoditas' => $this->petaniPerKomoditasChart($initialFilters),
|
||||||
|
'luasLahanPerKecamatan' => $this->luasLahanPerKecamatanChart($initialFilters),
|
||||||
|
'kondisiTanaman' => $this->kondisiTanamanChart($initialFilters),
|
||||||
|
'statusKepemilikanLahan' => $this->statusKepemilikanLahanChart($initialFilters),
|
||||||
|
'seranganHama' => $this->seranganHamaChart($initialFilters),
|
||||||
|
'penyakitTanaman' => $this->penyakitTanamanChart($initialFilters),
|
||||||
|
'keparahanSerangan' => $this->keparahanSeranganChart($initialFilters),
|
||||||
|
'statusHakKelolaLahan' => $this->statusHakKelolaLahanChart($initialFilters),
|
||||||
|
'praktikPemupukan' => $this->praktikPemupukanChart($initialFilters),
|
||||||
|
'produksiPerKomoditas' => $this->produksiPerKomoditasChart($initialFilters),
|
||||||
|
'produktivitasPerKomoditas' => $this->produktivitasPerKomoditasChart($initialFilters),
|
||||||
|
'luasPanenPerKomoditas' => $this->luasPanenPerKomoditasChart($initialFilters),
|
||||||
|
'statusPanen' => $this->statusPanenChart($initialFilters),
|
||||||
|
'surveyProduktivitasHa' => $this->surveyProduktivitasByUnitChart($initialFilters, 'ha_tahun'),
|
||||||
|
'surveyProduktivitasPohon' => $this->surveyProduktivitasByUnitChart($initialFilters, 'pohon_tahun'),
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function selectedFilters(Request $request, string $defaultKabupaten): array
|
||||||
|
{
|
||||||
|
$filters = [
|
||||||
|
'kabupaten' => $defaultKabupaten,
|
||||||
|
'kecamatan' => $this->validFilterValue($request->query('kecamatan'), Kecamatan::class),
|
||||||
|
'desa' => $this->validFilterValue($request->query('desa'), DesaKelurahan::class),
|
||||||
|
'komoditas' => $this->validFilterValue($request->query('komoditas'), Komoditas::class),
|
||||||
|
'segmentasi' => $this->validSegmentasi((string) $request->query('segmentasi', 'all')),
|
||||||
|
];
|
||||||
|
|
||||||
|
if ($filters['desa'] !== 'all') {
|
||||||
|
$desa = DesaKelurahan::query()->find($filters['desa']);
|
||||||
|
|
||||||
|
if (! $desa || ($filters['kecamatan'] !== 'all' && (string) $desa->kecamatan_id !== $filters['kecamatan'])) {
|
||||||
|
$filters['desa'] = 'all';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($filters['kecamatan'] === 'all') {
|
||||||
|
$filters['desa'] = 'all';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $filters;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function validFilterValue(mixed $value, string $modelClass): string
|
||||||
|
{
|
||||||
|
if (! $value || $value === 'all') {
|
||||||
|
return 'all';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $modelClass::query()->whereKey($value)->exists()
|
||||||
|
? (string) $value
|
||||||
|
: 'all';
|
||||||
|
}
|
||||||
|
|
||||||
|
private function validSegmentasi(string $value): string
|
||||||
|
{
|
||||||
|
return in_array($value, [
|
||||||
|
'Penggerak',
|
||||||
|
'Perintis',
|
||||||
|
'Pemerhati',
|
||||||
|
'Pemula',
|
||||||
|
'Belum tersegmentasi',
|
||||||
|
'all',
|
||||||
|
], true) ? $value : 'all';
|
||||||
|
}
|
||||||
|
|
||||||
|
private function kabupatenOptions(): array
|
||||||
|
{
|
||||||
|
return $this->withAllOption(
|
||||||
|
'Semua Kabupaten',
|
||||||
|
KabupatenKota::query()
|
||||||
|
->orderBy('nama')
|
||||||
|
->get(['id', 'kode', 'nama'])
|
||||||
|
->map(fn (KabupatenKota $kabupaten) => [
|
||||||
|
'value' => (string) $kabupaten->id,
|
||||||
|
'label' => $this->kabupatenLabel($kabupaten),
|
||||||
|
])
|
||||||
|
->values()
|
||||||
|
->all()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function kecamatanOptions(): array
|
||||||
|
{
|
||||||
|
return $this->withAllOption(
|
||||||
|
'Semua Kecamatan',
|
||||||
|
Kecamatan::query()
|
||||||
|
->orderBy('nama')
|
||||||
|
->get(['id', 'nama'])
|
||||||
|
->map(fn (Kecamatan $kecamatan) => [
|
||||||
|
'value' => (string) $kecamatan->id,
|
||||||
|
'label' => $kecamatan->nama,
|
||||||
|
])
|
||||||
|
->values()
|
||||||
|
->all()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function desaOptions(): array
|
||||||
|
{
|
||||||
|
return $this->withAllOption(
|
||||||
|
'Semua Desa',
|
||||||
|
DesaKelurahan::query()
|
||||||
|
->orderBy('nama')
|
||||||
|
->get(['id', 'nama', 'kecamatan_id'])
|
||||||
|
->map(fn (DesaKelurahan $desa) => [
|
||||||
|
'value' => (string) $desa->id,
|
||||||
|
'label' => $desa->nama,
|
||||||
|
'parent' => (string) $desa->kecamatan_id,
|
||||||
|
])
|
||||||
|
->values()
|
||||||
|
->all()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function komoditasOptions(): array
|
||||||
|
{
|
||||||
|
return $this->withAllOption(
|
||||||
|
'Semua Komoditas',
|
||||||
|
Komoditas::query()
|
||||||
|
->orderBy('nama')
|
||||||
|
->get(['id', 'nama'])
|
||||||
|
->map(fn (Komoditas $komoditas) => [
|
||||||
|
'value' => (string) $komoditas->id,
|
||||||
|
'label' => $komoditas->nama,
|
||||||
|
])
|
||||||
|
->values()
|
||||||
|
->all()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function segmentasiOptions(): array
|
||||||
|
{
|
||||||
|
$segments = SkorPetani::query()
|
||||||
|
->whereNotNull('skor_kesiapan_adopsi')
|
||||||
|
->pluck('skor_kesiapan_adopsi')
|
||||||
|
->map(fn ($score) => $this->segmentLabel((float) $score))
|
||||||
|
->filter()
|
||||||
|
->unique()
|
||||||
|
->sortBy(fn ($segment) => array_search($segment, [
|
||||||
|
'Penggerak',
|
||||||
|
'Perintis',
|
||||||
|
'Pemerhati',
|
||||||
|
'Pemula',
|
||||||
|
'Belum tersegmentasi',
|
||||||
|
], true))
|
||||||
|
->map(fn ($segment) => [
|
||||||
|
'value' => $segment,
|
||||||
|
'label' => $segment,
|
||||||
|
])
|
||||||
|
->values()
|
||||||
|
->all();
|
||||||
|
|
||||||
|
return $this->withAllOption('Semua Segmentasi', $segments);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function totalProduksiKg(array $filters): float
|
||||||
|
{
|
||||||
|
return $this->applyProduksiFilters(Produksi::query(), $filters)
|
||||||
|
->whereNotNull('jumlah_panen')
|
||||||
|
->get(['jumlah_panen', 'satuan'])
|
||||||
|
->sum(fn (Produksi $produksi) => $this->toKilograms(
|
||||||
|
(float) $produksi->jumlah_panen,
|
||||||
|
(string) $produksi->satuan
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
private function petaniPerKomoditasChart(array $filters): array
|
||||||
|
{
|
||||||
|
$rows = $this->applyPetaniFilters(Petani::query(), $filters)
|
||||||
|
->leftJoin('master_komoditas as k', 'k.id', '=', 'petani.komoditas_id')
|
||||||
|
->selectRaw("COALESCE(k.nama, 'Belum ditentukan') as label")
|
||||||
|
->selectRaw('COUNT(petani.id) as total')
|
||||||
|
->groupBy('k.id', 'k.nama')
|
||||||
|
->orderByDesc('total')
|
||||||
|
->get();
|
||||||
|
|
||||||
|
return [
|
||||||
|
'labels' => $rows->pluck('label')->values()->all(),
|
||||||
|
'series' => $rows->pluck('total')->map(fn ($value) => (int) $value)->values()->all(),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function luasLahanPerKecamatanChart(array $filters): array
|
||||||
|
{
|
||||||
|
$rows = $this->applyLahanFilters(Lahan::query(), $filters)
|
||||||
|
->leftJoin('master_desa_kelurahan as d', 'd.id', '=', 'map_lahan.desa_kelurahan_id')
|
||||||
|
->leftJoin('master_kecamatan as k', 'k.id', '=', 'd.kecamatan_id')
|
||||||
|
->selectRaw("COALESCE(k.nama, 'Belum ditentukan') as label")
|
||||||
|
->selectRaw('SUM(map_lahan.luas_lahan) / 10000 as total')
|
||||||
|
->groupBy('k.id', 'k.nama')
|
||||||
|
->havingRaw('SUM(map_lahan.luas_lahan) > 0')
|
||||||
|
->orderByDesc('total')
|
||||||
|
->limit(8)
|
||||||
|
->get()
|
||||||
|
->filter(fn ($row) => round((float) $row->total, 2) > 0)
|
||||||
|
->values();
|
||||||
|
|
||||||
|
return [
|
||||||
|
'labels' => $rows->pluck('label')->values()->all(),
|
||||||
|
'series' => $rows->pluck('total')->map(fn ($value) => round((float) $value, 2))->values()->all(),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function kondisiTanamanChart(array $filters): array
|
||||||
|
{
|
||||||
|
$rows = $this->applyTanamanTableFilters(DB::table('map_tanaman'), $filters)
|
||||||
|
->whereNull('map_tanaman.deleted_at')
|
||||||
|
->whereNotNull('map_tanaman.kondisi_tanaman')
|
||||||
|
->selectRaw('map_tanaman.kondisi_tanaman as label')
|
||||||
|
->selectRaw('COUNT(map_tanaman.id) as total')
|
||||||
|
->groupBy('map_tanaman.kondisi_tanaman')
|
||||||
|
->orderByDesc('total')
|
||||||
|
->get();
|
||||||
|
|
||||||
|
if ($rows->isEmpty()) {
|
||||||
|
$rows = $this->applyLahanFilters(Lahan::query(), $filters)
|
||||||
|
->whereNull('deleted_at')
|
||||||
|
->whereNotNull('kondisi_tanaman')
|
||||||
|
->selectRaw('kondisi_tanaman as label')
|
||||||
|
->selectRaw('COUNT(map_lahan.id) as total')
|
||||||
|
->groupBy('kondisi_tanaman')
|
||||||
|
->orderByDesc('total')
|
||||||
|
->get();
|
||||||
|
}
|
||||||
|
|
||||||
|
return [
|
||||||
|
'labels' => $rows->pluck('label')->map(fn ($label) => $this->shortEnumLabel((string) $label))->values()->all(),
|
||||||
|
'series' => $rows->pluck('total')->map(fn ($value) => (int) $value)->values()->all(),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function seranganHamaChart(array $filters): array
|
||||||
|
{
|
||||||
|
return $this->tanamanAttributeChart(
|
||||||
|
$filters,
|
||||||
|
'serangan_hama',
|
||||||
|
fn ($label) => $this->enumLabel(SeranganHama::class, (string) $label)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function penyakitTanamanChart(array $filters): array
|
||||||
|
{
|
||||||
|
return $this->tanamanAttributeChart(
|
||||||
|
$filters,
|
||||||
|
'penyakit_tanaman',
|
||||||
|
fn ($label) => $this->enumLabel(PenyakitTanaman::class, (string) $label)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function keparahanSeranganChart(array $filters): array
|
||||||
|
{
|
||||||
|
return $this->tanamanAttributeChart(
|
||||||
|
$filters,
|
||||||
|
'keparahan_serangan',
|
||||||
|
fn ($label) => $this->keparahanSeranganLabel((string) $label)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function statusKepemilikanLahanChart(array $filters): array
|
||||||
|
{
|
||||||
|
$rows = $this->applyLahanFilters(Lahan::query(), $filters)
|
||||||
|
->whereNotNull('status_kepemilikan')
|
||||||
|
->selectRaw('status_kepemilikan as label')
|
||||||
|
->selectRaw('COUNT(map_lahan.id) as total')
|
||||||
|
->groupBy('status_kepemilikan')
|
||||||
|
->orderByDesc('total')
|
||||||
|
->get();
|
||||||
|
|
||||||
|
return $this->chartFromRows($rows, fn ($label) => $this->shortEnumLabel((string) $label));
|
||||||
|
}
|
||||||
|
|
||||||
|
private function statusHakKelolaLahanChart(array $filters): array
|
||||||
|
{
|
||||||
|
$rows = $this->applySosialEkonomiFilters(SosialEkonomi::query(), $filters)
|
||||||
|
->whereNotNull('status_kepemilikan_lahan')
|
||||||
|
->selectRaw('status_kepemilikan_lahan as label')
|
||||||
|
->selectRaw('COUNT(sosial_ekonomi.id) as total')
|
||||||
|
->groupBy('status_kepemilikan_lahan')
|
||||||
|
->orderByDesc('total')
|
||||||
|
->get();
|
||||||
|
|
||||||
|
return $this->chartFromRows(
|
||||||
|
$rows,
|
||||||
|
fn ($label) => $this->enumLabel(StatusKepemilikanLahanSosialEkonomi::class, (string) $label)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function praktikPemupukanChart(array $filters): array
|
||||||
|
{
|
||||||
|
$rows = $this->applyPraktikBudidayaFilters(PraktikBudidaya::query(), $filters)
|
||||||
|
->whereNotNull('pemberian_pupuk')
|
||||||
|
->selectRaw('pemberian_pupuk as label')
|
||||||
|
->selectRaw('COUNT(praktik_budidaya.id) as total')
|
||||||
|
->groupBy('pemberian_pupuk')
|
||||||
|
->orderBy('pemberian_pupuk')
|
||||||
|
->get();
|
||||||
|
|
||||||
|
return $this->chartFromRows(
|
||||||
|
$rows,
|
||||||
|
fn ($label) => $this->pemberianPupukLabel((int) $label)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function produksiPerKomoditasChart(array $filters): array
|
||||||
|
{
|
||||||
|
$rows = $this->applyProduksiFilters(Produksi::query(), $filters)
|
||||||
|
->leftJoin('master_komoditas as k', 'k.id', '=', 'produksi.komoditas_id')
|
||||||
|
->whereNotNull('jumlah_panen')
|
||||||
|
->selectRaw("COALESCE(k.nama, 'Belum ditentukan') as label")
|
||||||
|
->selectRaw('produksi.jumlah_panen')
|
||||||
|
->selectRaw('produksi.satuan')
|
||||||
|
->get()
|
||||||
|
->groupBy('label')
|
||||||
|
->map(fn ($items) => round($items->sum(
|
||||||
|
fn (Produksi $produksi) => $this->toKilograms(
|
||||||
|
(float) $produksi->jumlah_panen,
|
||||||
|
(string) $produksi->satuan
|
||||||
|
)
|
||||||
|
), 2))
|
||||||
|
->filter(fn ($total) => $total > 0)
|
||||||
|
->sortDesc();
|
||||||
|
|
||||||
|
return [
|
||||||
|
'labels' => $rows->keys()->values()->all(),
|
||||||
|
'series' => $rows->values()->map(fn ($value) => round((float) $value, 2))->values()->all(),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function produktivitasPerKomoditasChart(array $filters): array
|
||||||
|
{
|
||||||
|
$rows = $this->applyProduksiFilters(Produksi::query(), $filters)
|
||||||
|
->leftJoin('master_komoditas as k', 'k.id', '=', 'produksi.komoditas_id')
|
||||||
|
->selectRaw("COALESCE(k.nama, 'Belum ditentukan') as label")
|
||||||
|
->selectRaw('produksi.jumlah_panen')
|
||||||
|
->selectRaw('produksi.satuan')
|
||||||
|
->selectRaw('produksi.luas_panen')
|
||||||
|
->selectRaw('produksi.produktivitas')
|
||||||
|
->get()
|
||||||
|
->groupBy('label')
|
||||||
|
->map(function ($items) {
|
||||||
|
$storedAverage = $items
|
||||||
|
->pluck('produktivitas')
|
||||||
|
->filter(fn ($value) => (float) $value > 0)
|
||||||
|
->avg();
|
||||||
|
|
||||||
|
if ($storedAverage > 0) {
|
||||||
|
return round((float) $storedAverage, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
$totalProduksiKg = $items->sum(
|
||||||
|
fn (Produksi $produksi) => $this->toKilograms(
|
||||||
|
(float) $produksi->jumlah_panen,
|
||||||
|
(string) $produksi->satuan
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$totalLuasPanen = $items->sum(fn (Produksi $produksi) => (float) $produksi->luas_panen);
|
||||||
|
|
||||||
|
return $totalLuasPanen > 0
|
||||||
|
? round($totalProduksiKg / $totalLuasPanen, 2)
|
||||||
|
: 0;
|
||||||
|
})
|
||||||
|
->filter(fn ($total) => $total > 0)
|
||||||
|
->sortDesc();
|
||||||
|
|
||||||
|
return [
|
||||||
|
'labels' => $rows->keys()->values()->all(),
|
||||||
|
'series' => $rows->values()->map(fn ($value) => round((float) $value, 2))->values()->all(),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function luasPanenPerKomoditasChart(array $filters): array
|
||||||
|
{
|
||||||
|
$rows = $this->applyProduksiFilters(Produksi::query(), $filters)
|
||||||
|
->leftJoin('master_komoditas as k', 'k.id', '=', 'produksi.komoditas_id')
|
||||||
|
->whereNotNull('luas_panen')
|
||||||
|
->selectRaw("COALESCE(k.nama, 'Belum ditentukan') as label")
|
||||||
|
->selectRaw('SUM(produksi.luas_panen) as total')
|
||||||
|
->groupBy('k.id', 'k.nama')
|
||||||
|
->havingRaw('SUM(produksi.luas_panen) > 0')
|
||||||
|
->orderByDesc('total')
|
||||||
|
->get();
|
||||||
|
|
||||||
|
return [
|
||||||
|
'labels' => $rows->pluck('label')->values()->all(),
|
||||||
|
'series' => $rows->pluck('total')->map(fn ($value) => round((float) $value, 2))->values()->all(),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function statusPanenChart(array $filters): array
|
||||||
|
{
|
||||||
|
$rows = $this->applyProduksiFilters(Produksi::query(), $filters)
|
||||||
|
->whereNotNull('status_panen')
|
||||||
|
->selectRaw("COALESCE(status_panen, 'Belum ditentukan') as label")
|
||||||
|
->selectRaw('COUNT(produksi.id) as total')
|
||||||
|
->groupBy('status_panen')
|
||||||
|
->orderByDesc('total')
|
||||||
|
->get();
|
||||||
|
|
||||||
|
return $this->chartFromRows($rows, fn ($label) => $this->shortEnumLabel((string) $label));
|
||||||
|
}
|
||||||
|
|
||||||
|
private function surveyProduktivitasByUnitChart(array $filters, string $unit): array
|
||||||
|
{
|
||||||
|
$rows = $this->applySurveyProduktivitasFilters(SurveyProduktivitas::query(), $filters)
|
||||||
|
->leftJoin('master_komoditas as k', 'k.id', '=', 'survey_produktivitas.komoditas_id')
|
||||||
|
->where('satuan', $unit)
|
||||||
|
->whereNotNull('kuantitas')
|
||||||
|
->selectRaw("COALESCE(k.nama, 'Belum ditentukan') as label")
|
||||||
|
->selectRaw('AVG(survey_produktivitas.kuantitas) as total')
|
||||||
|
->groupBy('k.id', 'k.nama')
|
||||||
|
->havingRaw('AVG(survey_produktivitas.kuantitas) > 0')
|
||||||
|
->orderByDesc('total')
|
||||||
|
->get();
|
||||||
|
|
||||||
|
return [
|
||||||
|
'labels' => $rows->pluck('label')->values()->all(),
|
||||||
|
'series' => $rows->pluck('total')->map(fn ($value) => round((float) $value, 2))->values()->all(),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function chartFromRows($rows, callable $labelResolver): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'labels' => $rows
|
||||||
|
->pluck('label')
|
||||||
|
->map(fn ($label) => $labelResolver($label))
|
||||||
|
->values()
|
||||||
|
->all(),
|
||||||
|
'series' => $rows
|
||||||
|
->pluck('total')
|
||||||
|
->map(fn ($value) => (int) $value)
|
||||||
|
->values()
|
||||||
|
->all(),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function tanamanAttributeChart(array $filters, string $field, callable $labelResolver): array
|
||||||
|
{
|
||||||
|
$qualifiedField = 'map_tanaman.'.$field;
|
||||||
|
|
||||||
|
$rows = $this->applyTanamanTableFilters(DB::table('map_tanaman'), $filters)
|
||||||
|
->whereNull('map_tanaman.deleted_at')
|
||||||
|
->whereNotNull($qualifiedField)
|
||||||
|
->selectRaw($qualifiedField.' as label')
|
||||||
|
->selectRaw('COUNT(map_tanaman.id) as total')
|
||||||
|
->groupBy($qualifiedField)
|
||||||
|
->orderByDesc('total')
|
||||||
|
->get();
|
||||||
|
|
||||||
|
if ($rows->isEmpty()) {
|
||||||
|
$rows = $this->applyLahanFilters(Lahan::query(), $filters)
|
||||||
|
->whereNotNull($field)
|
||||||
|
->selectRaw($field.' as label')
|
||||||
|
->selectRaw('COUNT(map_lahan.id) as total')
|
||||||
|
->groupBy($field)
|
||||||
|
->orderByDesc('total')
|
||||||
|
->get();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->chartFromRows($rows, $labelResolver);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function applyPetaniFilters($query, array $filters)
|
||||||
|
{
|
||||||
|
return $query
|
||||||
|
->when($filters['kecamatan'] !== 'all', function ($query) use ($filters) {
|
||||||
|
$query->whereHas('desaKelurahan', fn ($desa) => $desa->where('kecamatan_id', $filters['kecamatan']));
|
||||||
|
})
|
||||||
|
->when($filters['desa'] !== 'all', fn ($query) => $query->where('desa_kelurahan_id', $filters['desa']))
|
||||||
|
->when($filters['komoditas'] !== 'all', fn ($query) => $query->where('komoditas_id', $filters['komoditas']))
|
||||||
|
->when($filters['segmentasi'] !== 'all', function ($query) use ($filters) {
|
||||||
|
$query->whereHas('skor', function ($skor) use ($filters) {
|
||||||
|
$this->applySegmentasiRange($skor, $filters['segmentasi']);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private function applyLahanFilters($query, array $filters)
|
||||||
|
{
|
||||||
|
return $query
|
||||||
|
->when($filters['kecamatan'] !== 'all', function ($query) use ($filters) {
|
||||||
|
$query->whereHas('desaKelurahan', fn ($desa) => $desa->where('kecamatan_id', $filters['kecamatan']));
|
||||||
|
})
|
||||||
|
->when($filters['desa'] !== 'all', fn ($query) => $query->where('desa_kelurahan_id', $filters['desa']))
|
||||||
|
->when($filters['komoditas'] !== 'all', fn ($query) => $query->where('komoditas_id', $filters['komoditas']))
|
||||||
|
->when($filters['segmentasi'] !== 'all', function ($query) use ($filters) {
|
||||||
|
$query->whereIn('petani_id', $this->segmentasiPetaniIdsQuery($filters['segmentasi']));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private function applyProduksiFilters($query, array $filters)
|
||||||
|
{
|
||||||
|
return $query
|
||||||
|
->when($filters['kecamatan'] !== 'all' || $filters['desa'] !== 'all' || $filters['segmentasi'] !== 'all', function ($query) use ($filters) {
|
||||||
|
$query->whereHas('lahan', function ($lahan) use ($filters) {
|
||||||
|
$this->applyLahanFilters($lahan, $filters);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
->when($filters['komoditas'] !== 'all', fn ($query) => $query->where('komoditas_id', $filters['komoditas']));
|
||||||
|
}
|
||||||
|
|
||||||
|
private function applySosialEkonomiFilters($query, array $filters)
|
||||||
|
{
|
||||||
|
return $query->whereHas('petani', function ($petani) use ($filters) {
|
||||||
|
$this->applyPetaniFilters($petani, $filters);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private function applyPraktikBudidayaFilters($query, array $filters)
|
||||||
|
{
|
||||||
|
return $query->whereHas('petani', function ($petani) use ($filters) {
|
||||||
|
$this->applyPetaniFilters($petani, $filters);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private function applySurveyProduktivitasFilters($query, array $filters)
|
||||||
|
{
|
||||||
|
return $query
|
||||||
|
->whereHas('petani', function ($petani) use ($filters) {
|
||||||
|
$this->applyPetaniFilters($petani, $filters);
|
||||||
|
})
|
||||||
|
->when($filters['komoditas'] !== 'all', fn ($query) => $query->where('komoditas_id', $filters['komoditas']));
|
||||||
|
}
|
||||||
|
|
||||||
|
private function applyTanamanTableFilters($query, array $filters)
|
||||||
|
{
|
||||||
|
return $query
|
||||||
|
->leftJoin('map_lahan as l', 'l.id', '=', 'map_tanaman.lahan_id')
|
||||||
|
->when($filters['kecamatan'] !== 'all', function ($query) use ($filters) {
|
||||||
|
$query
|
||||||
|
->leftJoin('master_desa_kelurahan as d', 'd.id', '=', 'l.desa_kelurahan_id')
|
||||||
|
->where('d.kecamatan_id', $filters['kecamatan']);
|
||||||
|
})
|
||||||
|
->when($filters['desa'] !== 'all', fn ($query) => $query->where('l.desa_kelurahan_id', $filters['desa']))
|
||||||
|
->when($filters['komoditas'] !== 'all', fn ($query) => $query->where('map_tanaman.komoditas_id', $filters['komoditas']))
|
||||||
|
->when($filters['segmentasi'] !== 'all', function ($query) use ($filters) {
|
||||||
|
$query->where(function ($query) use ($filters) {
|
||||||
|
$query
|
||||||
|
->whereIn('map_tanaman.petani_id', $this->segmentasiPetaniIdsQuery($filters['segmentasi']))
|
||||||
|
->orWhereIn('l.petani_id', $this->segmentasiPetaniIdsQuery($filters['segmentasi']));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private function segmentasiPetaniIdsQuery(string $segmentasi)
|
||||||
|
{
|
||||||
|
return Petani::query()
|
||||||
|
->select('id')
|
||||||
|
->whereHas('skor', function ($skor) use ($segmentasi) {
|
||||||
|
$this->applySegmentasiRange($skor, $segmentasi);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private function applySegmentasiRange($query, string $segmentasi)
|
||||||
|
{
|
||||||
|
return match ($segmentasi) {
|
||||||
|
'Penggerak' => $query->where('skor_kesiapan_adopsi', '>=', 4),
|
||||||
|
'Perintis' => $query->where('skor_kesiapan_adopsi', '>=', 3)->where('skor_kesiapan_adopsi', '<', 4),
|
||||||
|
'Pemerhati' => $query->where('skor_kesiapan_adopsi', '>=', 2)->where('skor_kesiapan_adopsi', '<', 3),
|
||||||
|
'Pemula' => $query->where('skor_kesiapan_adopsi', '>=', 1)->where('skor_kesiapan_adopsi', '<', 2),
|
||||||
|
default => $query->where(function ($query) {
|
||||||
|
$query->whereNull('skor_kesiapan_adopsi')->orWhere('skor_kesiapan_adopsi', '<', 1);
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private function shortEnumLabel(string $value): string
|
||||||
|
{
|
||||||
|
return str($value)
|
||||||
|
->replace('_', ' ')
|
||||||
|
->headline()
|
||||||
|
->toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private function enumLabel(string $enumClass, int|string $value): string
|
||||||
|
{
|
||||||
|
$case = $enumClass::tryFrom($value);
|
||||||
|
|
||||||
|
if (! $case) {
|
||||||
|
return $this->shortEnumLabel((string) $value);
|
||||||
|
}
|
||||||
|
|
||||||
|
return method_exists($case, 'label')
|
||||||
|
? $case->label()
|
||||||
|
: $this->shortEnumLabel((string) $case->value);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function keparahanSeranganLabel(string $value): string
|
||||||
|
{
|
||||||
|
return match (KeparahanSerangan::tryFrom($value)) {
|
||||||
|
KeparahanSerangan::RINGAN => 'Ringan',
|
||||||
|
KeparahanSerangan::SEDANG => 'Sedang',
|
||||||
|
KeparahanSerangan::BERAT => 'Parah',
|
||||||
|
default => $this->shortEnumLabel($value),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private function pemberianPupukLabel(int $value): string
|
||||||
|
{
|
||||||
|
return match (PemberianPupuk::tryFrom($value)) {
|
||||||
|
PemberianPupuk::TIDAK_PERNAH => 'Tidak pernah',
|
||||||
|
PemberianPupuk::JENIS_DOSIS_WAKTU_TIDAK_MENENTU => 'Tidak menentu',
|
||||||
|
PemberianPupuk::JENIS_SESUAI_DOSIS_TIDAK_MENENTU => 'Jenis sesuai',
|
||||||
|
PemberianPupuk::JENIS_DOSIS_SESUAI_WAKTU_CUKUP_TEPAT => 'Cukup tepat',
|
||||||
|
PemberianPupuk::JENIS_DOSIS_SESUAI_WAKTU_TEPAT => 'Tepat & rutin',
|
||||||
|
default => $this->shortEnumLabel((string) $value),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private function toKilograms(float $value, string $unit): float
|
||||||
|
{
|
||||||
|
return match (strtolower($unit)) {
|
||||||
|
'ton' => $value * 1000,
|
||||||
|
'kuintal', 'kwintal' => $value * 100,
|
||||||
|
default => $value,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private function withAllOption(string $label, array $options): array
|
||||||
|
{
|
||||||
|
return array_merge([
|
||||||
|
[
|
||||||
|
'value' => 'all',
|
||||||
|
'label' => $label,
|
||||||
|
],
|
||||||
|
], $options);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function kabupatenLabel(KabupatenKota $kabupaten): string
|
||||||
|
{
|
||||||
|
return preg_replace('/^(kabupaten|kota)\s+/i', '', $kabupaten->nama);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function segmentLabel(float $score): string
|
||||||
|
{
|
||||||
|
return match (true) {
|
||||||
|
$score >= 4.0 => 'Penggerak',
|
||||||
|
$score >= 3.0 => 'Perintis',
|
||||||
|
$score >= 2.0 => 'Pemerhati',
|
||||||
|
$score >= 1.0 => 'Pemula',
|
||||||
|
default => 'Belum tersegmentasi',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -75,7 +75,6 @@ class ProfilPetaniController extends Controller
|
|||||||
->groupByRaw($case)
|
->groupByRaw($case)
|
||||||
->get();
|
->get();
|
||||||
|
|
||||||
|
|
||||||
$skorAverage = SkorPetani::query()
|
$skorAverage = SkorPetani::query()
|
||||||
->join('petani', 'petani_skor.petani_id', '=', 'petani.id')
|
->join('petani', 'petani_skor.petani_id', '=', 'petani.id')
|
||||||
->whereIn('petani_id', $petani)
|
->whereIn('petani_id', $petani)
|
||||||
@@ -111,7 +110,7 @@ class ProfilPetaniController extends Controller
|
|||||||
avg(skor_komp_2_d4_k2_ekonomi_rumah_tangga) as skor_komp_2_d4_k2_ekonomi_rumah_tangga,
|
avg(skor_komp_2_d4_k2_ekonomi_rumah_tangga) as skor_komp_2_d4_k2_ekonomi_rumah_tangga,
|
||||||
avg(skor_komp_3_d2_praktik_budidaya_gap) as skor_komp_3_d2_praktik_budidaya_gap,
|
avg(skor_komp_3_d2_praktik_budidaya_gap) as skor_komp_3_d2_praktik_budidaya_gap,
|
||||||
avg(skor_komp_4_d4_k4_keterlibatan_kelembagaan) as skor_komp_4_d4_k4_keterlibatan_kelembagaan,
|
avg(skor_komp_4_d4_k4_keterlibatan_kelembagaan) as skor_komp_4_d4_k4_keterlibatan_kelembagaan,
|
||||||
avg(skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan) as skor_komp_5_d4_k5_k6_akses_kebebasan_keuanga,
|
avg(skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan) as skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan,
|
||||||
avg(skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar) as skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar")
|
avg(skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar) as skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar")
|
||||||
->first();
|
->first();
|
||||||
|
|
||||||
@@ -127,6 +126,21 @@ class ProfilPetaniController extends Controller
|
|||||||
->groupByRaw($case)
|
->groupByRaw($case)
|
||||||
->get();
|
->get();
|
||||||
|
|
||||||
|
$skorMultiKomponen = SkorPetani::query()
|
||||||
|
->join('petani', 'petani_skor.petani_id', '=', 'petani.id')
|
||||||
|
->whereIn('petani_id', $petani)
|
||||||
|
->whereIn('petani.komoditas_id', $komoditas->pluck('id'))
|
||||||
|
->selectRaw("$case AS segmen,
|
||||||
|
avg(skor_kesiapan_adopsi) as skor_kesiapan_adopsi,
|
||||||
|
avg(skor_komp_1_d4_k3_motivasi_kapasitas_adopsi) as skor_komp_1_d4_k3_motivasi_kapasitas_adopsi,
|
||||||
|
avg(skor_komp_2_d4_k2_ekonomi_rumah_tangga) as skor_komp_2_d4_k2_ekonomi_rumah_tangga,
|
||||||
|
avg(skor_komp_3_d2_praktik_budidaya_gap) as skor_komp_3_d2_praktik_budidaya_gap,
|
||||||
|
avg(skor_komp_4_d4_k4_keterlibatan_kelembagaan) as skor_komp_4_d4_k4_keterlibatan_kelembagaan,
|
||||||
|
avg(skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan) as skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan,
|
||||||
|
avg(skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar) as skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar")
|
||||||
|
->groupByRaw($case)
|
||||||
|
->get();
|
||||||
|
|
||||||
$petani = Petani::with(['skor'])
|
$petani = Petani::with(['skor'])
|
||||||
->whereIn('id', $petani)
|
->whereIn('id', $petani)
|
||||||
->whereIn('komoditas_id', $komoditas->pluck('id'))
|
->whereIn('komoditas_id', $komoditas->pluck('id'))
|
||||||
@@ -144,6 +158,7 @@ class ProfilPetaniController extends Controller
|
|||||||
'skorDimensi',
|
'skorDimensi',
|
||||||
'skorKomponen',
|
'skorKomponen',
|
||||||
'skorMultiDimensi',
|
'skorMultiDimensi',
|
||||||
|
'skorMultiKomponen',
|
||||||
'petani',
|
'petani',
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ use App\Enums\AksesPasar\SkorPengalaman;
|
|||||||
use App\Enums\AksesPasar\SaluranTerdahulu;
|
use App\Enums\AksesPasar\SaluranTerdahulu;
|
||||||
use App\Enums\AksesPasar\PraktikFermentasi;
|
use App\Enums\AksesPasar\PraktikFermentasi;
|
||||||
use App\Enums\AksesPasar\SkorKesadaranPremium;
|
use App\Enums\AksesPasar\SkorKesadaranPremium;
|
||||||
|
use App\Enums\AksesPasar\TingkatKepercayaanPembeli;
|
||||||
|
|
||||||
class AksesPasarController extends Controller
|
class AksesPasarController extends Controller
|
||||||
{
|
{
|
||||||
@@ -113,6 +114,7 @@ class AksesPasarController extends Controller
|
|||||||
'praktikFermentasiOptions' => PraktikFermentasi::options(),
|
'praktikFermentasiOptions' => PraktikFermentasi::options(),
|
||||||
'praktikBelumPernahValue' => PraktikFermentasi::BELUM_PERNAH->value,
|
'praktikBelumPernahValue' => PraktikFermentasi::BELUM_PERNAH->value,
|
||||||
'skorKesadaranPremiumOptions' => SkorKesadaranPremium::options(),
|
'skorKesadaranPremiumOptions' => SkorKesadaranPremium::options(),
|
||||||
|
'tingkatKepercayaanOptions' => TingkatKepercayaanPembeli::options(),
|
||||||
'skorPengalamanBerhentiValues' => [
|
'skorPengalamanBerhentiValues' => [
|
||||||
SkorPengalaman::PERNAH_BERHENTI_TIDAK_ADA_AKSES->value,
|
SkorPengalaman::PERNAH_BERHENTI_TIDAK_ADA_AKSES->value,
|
||||||
SkorPengalaman::PERNAH_BERHENTI_MUNGKIN_KEMBALI->value
|
SkorPengalaman::PERNAH_BERHENTI_MUNGKIN_KEMBALI->value
|
||||||
@@ -155,6 +157,9 @@ class AksesPasarController extends Controller
|
|||||||
'skor_kesadaran_premium' => ['nullable', 'integer', Rule::in(SkorKesadaranPremium::values())],
|
'skor_kesadaran_premium' => ['nullable', 'integer', Rule::in(SkorKesadaranPremium::values())],
|
||||||
'sumber_info_premium' => ['nullable', 'string', 'max:255'],
|
'sumber_info_premium' => ['nullable', 'string', 'max:255'],
|
||||||
|
|
||||||
|
'tingkat_kepercayaan_pembeli_baru' => ['nullable', 'integer', Rule::in(TingkatKepercayaanPembeli::values())],
|
||||||
|
'alasan_kepercayaan_pembeli_baru' => ['nullable', 'string'],
|
||||||
|
|
||||||
'harga_jual' => ['nullable', 'array'],
|
'harga_jual' => ['nullable', 'array'],
|
||||||
'harga_jual.*.bentuk_produk' => ['nullable', 'string'],
|
'harga_jual.*.bentuk_produk' => ['nullable', 'string'],
|
||||||
'harga_jual.*.harga_panen_terakhir' => ['nullable', 'numeric', 'min:0'],
|
'harga_jual.*.harga_panen_terakhir' => ['nullable', 'numeric', 'min:0'],
|
||||||
|
|||||||
@@ -0,0 +1,108 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models\Bumdes;
|
||||||
|
|
||||||
|
use App\Enums\Bumdes\JabatanBumdes;
|
||||||
|
use App\Enums\Pendidikan;
|
||||||
|
use App\Models\User;
|
||||||
|
use App\Models\Wilayah\DesaKelurahan;
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||||
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||||
|
|
||||||
|
class PengurusBumdes extends Model
|
||||||
|
{
|
||||||
|
use SoftDeletes;
|
||||||
|
|
||||||
|
protected $table = 'bumdes_pengurus';
|
||||||
|
|
||||||
|
protected $fillable = [
|
||||||
|
'uid',
|
||||||
|
'nama',
|
||||||
|
'jenis_kelamin',
|
||||||
|
'tempat_lahir',
|
||||||
|
'tanggal_lahir',
|
||||||
|
'pendidikan_terakhir',
|
||||||
|
'alamat',
|
||||||
|
'desa_kelurahan_id',
|
||||||
|
'nomor_telepon',
|
||||||
|
'jabatan',
|
||||||
|
'jabatan_lainnya',
|
||||||
|
'lama_menjabat_tahun',
|
||||||
|
'tanggal_mulai_menjabat',
|
||||||
|
'created_by',
|
||||||
|
'updated_by',
|
||||||
|
'deleted_by',
|
||||||
|
];
|
||||||
|
|
||||||
|
protected $casts = [
|
||||||
|
'jenis_kelamin' => 'boolean',
|
||||||
|
'tanggal_lahir' => 'date',
|
||||||
|
'pendidikan_terakhir' => Pendidikan::class,
|
||||||
|
'tanggal_mulai_menjabat' => 'date',
|
||||||
|
'jabatan' => JabatanBumdes::class,
|
||||||
|
];
|
||||||
|
|
||||||
|
public function getUsiaAttribute(): ?int
|
||||||
|
{
|
||||||
|
if (! $this->tanggal_lahir) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Carbon::parse($this->tanggal_lahir)->age;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getLamaMenjabatAttribute(): string
|
||||||
|
{
|
||||||
|
if (! is_null($this->lama_menjabat_tahun)) {
|
||||||
|
return $this->lama_menjabat_tahun . ' tahun';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! $this->tanggal_mulai_menjabat) {
|
||||||
|
return '-';
|
||||||
|
}
|
||||||
|
|
||||||
|
$tanggalMulai = Carbon::parse($this->tanggal_mulai_menjabat)->startOfDay();
|
||||||
|
|
||||||
|
if ($tanggalMulai->isFuture()) {
|
||||||
|
return 'Belum mulai';
|
||||||
|
}
|
||||||
|
|
||||||
|
$selisih = $tanggalMulai->diff(Carbon::now());
|
||||||
|
$bagian = [];
|
||||||
|
|
||||||
|
if ($selisih->y > 0) {
|
||||||
|
$bagian[] = $selisih->y . ' tahun';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($selisih->m > 0) {
|
||||||
|
$bagian[] = $selisih->m . ' bulan';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($bagian)) {
|
||||||
|
return $selisih->d . ' hari';
|
||||||
|
}
|
||||||
|
|
||||||
|
return implode(' ', $bagian);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getNamaJabatanAttribute(): string
|
||||||
|
{
|
||||||
|
if ($this->jabatan === JabatanBumdes::LAINNYA && $this->jabatan_lainnya) {
|
||||||
|
return $this->jabatan_lainnya;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->jabatan?->label() ?? '-';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function desaKelurahan(): BelongsTo
|
||||||
|
{
|
||||||
|
return $this->belongsTo(DesaKelurahan::class, 'desa_kelurahan_id');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function creator(): BelongsTo
|
||||||
|
{
|
||||||
|
return $this->belongsTo(User::class, 'created_by');
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -18,6 +18,7 @@ use App\Enums\KondisiTanaman;
|
|||||||
use App\Enums\SeranganHama;
|
use App\Enums\SeranganHama;
|
||||||
use App\Enums\PenyakitTanaman;
|
use App\Enums\PenyakitTanaman;
|
||||||
use App\Enums\KeparahanSerangan;
|
use App\Enums\KeparahanSerangan;
|
||||||
|
use App\Models\Pertanian\Petani;
|
||||||
|
|
||||||
class Lahan extends Model
|
class Lahan extends Model
|
||||||
{
|
{
|
||||||
@@ -98,7 +99,7 @@ class Lahan extends Model
|
|||||||
|
|
||||||
public function petani(): BelongsTo
|
public function petani(): BelongsTo
|
||||||
{
|
{
|
||||||
return $this->belongsTo(Profile::class, 'petani_id');
|
return $this->belongsTo(Petani::class, 'petani_id');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function komoditas(): BelongsTo
|
public function komoditas(): BelongsTo
|
||||||
|
|||||||
@@ -94,15 +94,15 @@ class Petani extends Model
|
|||||||
protected static function booted(): void
|
protected static function booted(): void
|
||||||
{
|
{
|
||||||
static::saved(function (Petani $petani) {
|
static::saved(function (Petani $petani) {
|
||||||
|
$skor = SkorPetani::where('petani_id', $petani->id)->orderBy('id')->first();
|
||||||
$skor = SkorPetani::where('petani_id')->orderBy('id')->first();
|
|
||||||
if (!$skor) {
|
if (!$skor) {
|
||||||
$petaniUid = $petani->uid;
|
$petaniUid = $petani->uid;
|
||||||
$part = explode('-', $petaniUid);
|
$part = explode('-', $petaniUid);
|
||||||
$skor = SkorPetani::create([
|
$skor = SkorPetani::create([
|
||||||
|
'petani_id' => $petani->id,
|
||||||
'uid' => 'SKR-' . $part[1] . '-' . strtoupper(Str::random(10)),
|
'uid' => 'SKR-' . $part[1] . '-' . strtoupper(Str::random(10)),
|
||||||
'created_by' => $petani->created_by,
|
'created_by' => $petani->created_by,
|
||||||
'updated_by' => $petani->updated_by,
|
'updated_by' => $petani->updated_by
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -339,7 +339,7 @@ class Petani extends Model
|
|||||||
$skor >= 3.0 => 'Perintis',
|
$skor >= 3.0 => 'Perintis',
|
||||||
$skor >= 2.0 => 'Pemerhati',
|
$skor >= 2.0 => 'Pemerhati',
|
||||||
$skor >= 1.0 => 'Pemula',
|
$skor >= 1.0 => 'Pemula',
|
||||||
default => 'Belum tersegmentasi',
|
default => 'Belum lengkap',
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -365,10 +365,10 @@ class Petani extends Model
|
|||||||
} elseif ($skor->skor_kesiapan_adopsi >= 1.0) {
|
} elseif ($skor->skor_kesiapan_adopsi >= 1.0) {
|
||||||
return 'Pemula';
|
return 'Pemula';
|
||||||
} else {
|
} else {
|
||||||
return 'Belum tersegmentasi';
|
return 'Belum lengkap';
|
||||||
}
|
}
|
||||||
|
|
||||||
return 'Belum tersegmentasi';
|
return 'Belum lengkap';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function keteranganSegmen(): ?string
|
public function keteranganSegmen(): ?string
|
||||||
|
|||||||
@@ -4,6 +4,9 @@ namespace App\Models\Pertanian;
|
|||||||
|
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||||
|
|
||||||
|
use App\Models\Pertanian\Petani;
|
||||||
|
|
||||||
class SkorPetani extends Model
|
class SkorPetani extends Model
|
||||||
{
|
{
|
||||||
@@ -102,7 +105,7 @@ class SkorPetani extends Model
|
|||||||
$skorPetani->skor_d4_k5_1_kepemilikan_rekening +
|
$skorPetani->skor_d4_k5_1_kepemilikan_rekening +
|
||||||
$skorPetani->skor_d4_k5_2_pengalaman_kredit_formal +
|
$skorPetani->skor_d4_k5_2_pengalaman_kredit_formal +
|
||||||
$skorPetani->skor_d4_k5_3_kepemilikan_aset_produktif +
|
$skorPetani->skor_d4_k5_3_kepemilikan_aset_produktif +
|
||||||
$skorPetani->skor_d4_k5_4_5_akses_program_bantuan
|
$skorPetani->skor_d4_k5_4_akses_program_bantuan
|
||||||
) / 4 +
|
) / 4 +
|
||||||
(
|
(
|
||||||
$skorPetani->skor_d4_k6_3_keberadaan_hutang_terkait_panen +
|
$skorPetani->skor_d4_k6_3_keberadaan_hutang_terkait_panen +
|
||||||
@@ -119,24 +122,29 @@ class SkorPetani extends Model
|
|||||||
$skorPetani->skor_d2_sistem_praktik_budidaya = (
|
$skorPetani->skor_d2_sistem_praktik_budidaya = (
|
||||||
$skorPetani->skor_komp_3_d2_praktik_budidaya_gap
|
$skorPetani->skor_komp_3_d2_praktik_budidaya_gap
|
||||||
);
|
);
|
||||||
$skorPetani->skor_d4_sosial_ekonomi = (
|
|
||||||
$skorPetani->skor_komp_1_d4_k3_motivasi_kapasitas_adopsi
|
|
||||||
);
|
|
||||||
$skorPetani->skor_d6_rantai_nilai_akses_pasar = (
|
$skorPetani->skor_d6_rantai_nilai_akses_pasar = (
|
||||||
$skorPetani->skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar * 0.25 +
|
$skorPetani->skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar
|
||||||
|
);
|
||||||
|
$skorPetani->skor_d4_sosial_ekonomi = (
|
||||||
|
$skorPetani->skor_komp_1_d4_k3_motivasi_kapasitas_adopsi * 0.25 +
|
||||||
$skorPetani->skor_komp_2_d4_k2_ekonomi_rumah_tangga * 0.20 +
|
$skorPetani->skor_komp_2_d4_k2_ekonomi_rumah_tangga * 0.20 +
|
||||||
$skorPetani->skor_komp_4_d4_k4_keterlibatan_kelembagaan * 0.15 +
|
$skorPetani->skor_komp_4_d4_k4_keterlibatan_kelembagaan * 0.15 +
|
||||||
$skorPetani->skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan * 0.10
|
$skorPetani->skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan * 0.10
|
||||||
) / 0.70;
|
) / 0.70;
|
||||||
|
|
||||||
$skorPetani->skor_kesiapan_adopsi = (
|
$skorPetani->skor_kesiapan_adopsi = (
|
||||||
$skorPetani->skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar * 0.25 +
|
$skorPetani->skor_komp_1_d4_k3_motivasi_kapasitas_adopsi * 0.25 + // D4
|
||||||
$skorPetani->skor_komp_2_d4_k2_ekonomi_rumah_tangga * 0.20 +
|
$skorPetani->skor_komp_2_d4_k2_ekonomi_rumah_tangga * 0.20 + // D4
|
||||||
$skorPetani->skor_komp_3_d2_praktik_budidaya_gap * 0.20 +
|
$skorPetani->skor_komp_3_d2_praktik_budidaya_gap * 0.20 + // D2
|
||||||
$skorPetani->skor_komp_4_d4_k4_keterlibatan_kelembagaan * 0.15 +
|
$skorPetani->skor_komp_4_d4_k4_keterlibatan_kelembagaan * 0.15 + // D4
|
||||||
$skorPetani->skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan * 0.10 +
|
$skorPetani->skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan * 0.10 + // D4
|
||||||
$skorPetani->skor_komp_1_d4_k3_motivasi_kapasitas_adopsi * 0.10
|
$skorPetani->skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar * 0.10 // D6
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function petani(): BelongsTo
|
||||||
|
{
|
||||||
|
return $this->belongsTo(Petani::class, 'petani_id');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::create('bumdes_pengurus', function (Blueprint $table) {
|
||||||
|
$table->id();
|
||||||
|
$table->string('uid')->unique();
|
||||||
|
$table->string('nama');
|
||||||
|
$table->boolean('jenis_kelamin');
|
||||||
|
$table->string('tempat_lahir')->nullable();
|
||||||
|
$table->date('tanggal_lahir');
|
||||||
|
$table->string('pendidikan_terakhir')->nullable();
|
||||||
|
$table->text('alamat')->nullable();
|
||||||
|
$table->foreignId('desa_kelurahan_id')->nullable()->constrained('master_desa_kelurahan')->onDelete('set null');
|
||||||
|
$table->string('nomor_telepon')->nullable();
|
||||||
|
$table->string('jabatan');
|
||||||
|
$table->string('jabatan_lainnya')->nullable();
|
||||||
|
$table->unsignedSmallInteger('lama_menjabat_tahun')->nullable();
|
||||||
|
$table->date('tanggal_mulai_menjabat');
|
||||||
|
$table->foreignId('created_by')->nullable()->constrained('users')->onDelete('set null');
|
||||||
|
$table->foreignId('updated_by')->nullable()->constrained('users')->onDelete('set null');
|
||||||
|
$table->foreignId('deleted_by')->nullable()->constrained('users')->onDelete('set null');
|
||||||
|
$table->timestamps();
|
||||||
|
$table->softDeletes();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::dropIfExists('bumdes_pengurus');
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::table('bumdes_pengurus', function (Blueprint $table) {
|
||||||
|
if (! Schema::hasColumn('bumdes_pengurus', 'pendidikan_terakhir')) {
|
||||||
|
$table->string('pendidikan_terakhir')->nullable()->after('tanggal_lahir');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! Schema::hasColumn('bumdes_pengurus', 'jabatan_lainnya')) {
|
||||||
|
$table->string('jabatan_lainnya')->nullable()->after('jabatan');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! Schema::hasColumn('bumdes_pengurus', 'lama_menjabat_tahun')) {
|
||||||
|
$table->unsignedSmallInteger('lama_menjabat_tahun')->nullable()->after('jabatan_lainnya');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::table('bumdes_pengurus', function (Blueprint $table) {
|
||||||
|
if (Schema::hasColumn('bumdes_pengurus', 'lama_menjabat_tahun')) {
|
||||||
|
$table->dropColumn('lama_menjabat_tahun');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Schema::hasColumn('bumdes_pengurus', 'jabatan_lainnya')) {
|
||||||
|
$table->dropColumn('jabatan_lainnya');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Schema::hasColumn('bumdes_pengurus', 'pendidikan_terakhir')) {
|
||||||
|
$table->dropColumn('pendidikan_terakhir');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*/
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::table('akses_pasar', function (Blueprint $table) {
|
||||||
|
$table->tinyInteger('tingkat_kepercayaan_pembeli_baru')->nullable()->after('sumber_info_premium');
|
||||||
|
$table->text('alasan_kepercayaan_pembeli_baru')->nullable()->after('tingkat_kepercayaan_pembeli_baru');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::table('akses_pasar', function (Blueprint $table) {
|
||||||
|
$table->dropColumn(['tingkat_kepercayaan_pembeli_baru', 'alasan_kepercayaan_pembeli_baru']);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
@extends('layout.main')
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="container-xxl flex-grow-1 container-p-y">
|
||||||
|
@include('bumdes.profil.header', ['pengurus' => $pengurus])
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
@@ -0,0 +1,280 @@
|
|||||||
|
@php
|
||||||
|
$prefix = $mode . '-bumdes';
|
||||||
|
$currentProvinsiId = old('provinsi_id', $pengurus?->desaKelurahan?->kecamatan?->kabupatenKota?->provinsi_id);
|
||||||
|
$currentKabupaten = $pengurus?->desaKelurahan?->kecamatan?->kabupatenKota;
|
||||||
|
$currentKecamatan = $pengurus?->desaKelurahan?->kecamatan;
|
||||||
|
$currentDesa = $pengurus?->desaKelurahan;
|
||||||
|
$currentJabatan = $pengurus?->jabatan instanceof \App\Enums\Bumdes\JabatanBumdes ? $pengurus->jabatan->value : $pengurus?->jabatan;
|
||||||
|
$currentPendidikan = $pengurus?->pendidikan_terakhir instanceof \App\Enums\Pendidikan ? $pengurus->pendidikan_terakhir->value : $pengurus?->pendidikan_terakhir;
|
||||||
|
@endphp
|
||||||
|
|
||||||
|
<h5 class="pb-4 border-bottom mb-4">Data Pribadi</h5>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-3 mb-4 form-control-validation">
|
||||||
|
<label class="form-label" for="{{ $prefix }}-nama">Nama Pengurus BUMDes<span class="text-danger">*</span></label>
|
||||||
|
<input type="text" class="form-control @error('nama') is-invalid @enderror" id="{{ $prefix }}-nama" name="nama" placeholder="Contoh: John Doe" value="{{ old('nama', $pengurus?->nama) }}" />
|
||||||
|
@error('nama')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||||
|
</div>
|
||||||
|
<div class="col-md-3 mb-4 form-control-validation">
|
||||||
|
<label class="form-label" for="{{ $prefix }}-jenis-kelamin">Jenis Kelamin<span class="text-danger">*</span></label>
|
||||||
|
<select class="form-control @error('jenis_kelamin') is-invalid @enderror" id="{{ $prefix }}-jenis-kelamin" name="jenis_kelamin">
|
||||||
|
<option value="">Pilih Jenis Kelamin</option>
|
||||||
|
<option value="1" {{ old('jenis_kelamin', $pengurus?->jenis_kelamin) == '1' ? 'selected' : '' }}>Laki-laki</option>
|
||||||
|
<option value="0" {{ old('jenis_kelamin', $pengurus?->jenis_kelamin) == '0' ? 'selected' : '' }}>Perempuan</option>
|
||||||
|
</select>
|
||||||
|
@error('jenis_kelamin')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||||
|
</div>
|
||||||
|
<div class="col-md-3 mb-4 form-control-validation">
|
||||||
|
<label class="form-label" for="{{ $prefix }}-tempat-lahir">Tempat Lahir<span class="text-danger">*</span></label>
|
||||||
|
<input type="text" class="form-control @error('tempat_lahir') is-invalid @enderror" id="{{ $prefix }}-tempat-lahir" name="tempat_lahir" placeholder="Contoh: Ngada" value="{{ old('tempat_lahir', $pengurus?->tempat_lahir) }}" />
|
||||||
|
@error('tempat_lahir')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||||
|
</div>
|
||||||
|
<div class="col-md-3 mb-4 form-control-validation">
|
||||||
|
<label class="form-label" for="{{ $prefix }}-tanggal-lahir">Tanggal Lahir<span class="text-danger">*</span></label>
|
||||||
|
<input type="text" class="form-control @error('tanggal_lahir') is-invalid @enderror" id="{{ $prefix }}-tanggal-lahir" name="tanggal_lahir" value="{{ old('tanggal_lahir', $pengurus?->tanggal_lahir?->format('d-m-Y')) }}" />
|
||||||
|
@error('tanggal_lahir')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-3 mb-4 form-control-validation">
|
||||||
|
<label class="form-label" for="{{ $prefix }}-pendidikan-terakhir">Pendidikan Terakhir<span class="text-danger">*</span></label>
|
||||||
|
<select class="form-control @error('pendidikan_terakhir') is-invalid @enderror" id="{{ $prefix }}-pendidikan-terakhir" name="pendidikan_terakhir">
|
||||||
|
<option value="">Pilih Pendidikan Terakhir</option>
|
||||||
|
@foreach($pendidikan as $value)
|
||||||
|
<option value="{{ $value['value'] }}" {{ old('pendidikan_terakhir', $currentPendidikan) == $value['value'] ? 'selected' : '' }}>{{ $value['label'] }}</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
@error('pendidikan_terakhir')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h5 class="pb-4 border-bottom mb-4 mt-4">Peran Kepengurusan BUMDes</h5>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-3 mb-4 form-control-validation">
|
||||||
|
<label class="form-label" for="{{ $prefix }}-jabatan">Jabatan/Peran<span class="text-danger">*</span></label>
|
||||||
|
<select class="form-control @error('jabatan') is-invalid @enderror" id="{{ $prefix }}-jabatan" name="jabatan">
|
||||||
|
<option value="">Pilih Jabatan/Peran</option>
|
||||||
|
@foreach($jabatan as $value)
|
||||||
|
<option value="{{ $value['value'] }}" {{ old('jabatan', $currentJabatan) == $value['value'] ? 'selected' : '' }}>{{ $value['label'] }}</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
@error('jabatan')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||||
|
</div>
|
||||||
|
<div class="col-md-3 mb-4 form-control-validation {{ old('jabatan', $currentJabatan) === \App\Enums\Bumdes\JabatanBumdes::LAINNYA->value ? '' : 'd-none' }}" id="{{ $prefix }}-jabatan-lainnya-wrapper">
|
||||||
|
<label class="form-label" for="{{ $prefix }}-jabatan-lainnya">Jabatan Lainnya<span class="text-danger">*</span></label>
|
||||||
|
<input type="text" class="form-control @error('jabatan_lainnya') is-invalid @enderror" id="{{ $prefix }}-jabatan-lainnya" name="jabatan_lainnya" placeholder="Contoh: Kepala Unit Usaha" value="{{ old('jabatan_lainnya', $pengurus?->jabatan_lainnya) }}" />
|
||||||
|
@error('jabatan_lainnya')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||||
|
</div>
|
||||||
|
<div class="col-md-3 mb-4 form-control-validation">
|
||||||
|
<label class="form-label" for="{{ $prefix }}-lama-menjabat">Lama Menjabat (Tahun)<span class="text-danger">*</span></label>
|
||||||
|
<input type="number" min="0" max="80" class="form-control @error('lama_menjabat_tahun') is-invalid @enderror" id="{{ $prefix }}-lama-menjabat" name="lama_menjabat_tahun" placeholder="Contoh: 2" value="{{ old('lama_menjabat_tahun', $pengurus?->lama_menjabat_tahun) }}" />
|
||||||
|
@error('lama_menjabat_tahun')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h5 class="pb-4 border-bottom mb-4 mt-4">Domisili dan Kontak</h5>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12 mb-4 form-control-validation">
|
||||||
|
<label class="form-label" for="{{ $prefix }}-alamat">Alamat<span class="text-danger">*</span></label>
|
||||||
|
<textarea class="form-control @error('alamat') is-invalid @enderror" id="{{ $prefix }}-alamat" name="alamat" rows="2" placeholder="Contoh: Jl. Nama Jalan, Nama Dusun">{{ old('alamat', $pengurus?->alamat) }}</textarea>
|
||||||
|
@error('alamat')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-3 mb-4 form-control-validation">
|
||||||
|
<label class="form-label" for="{{ $prefix }}-provinsi">Provinsi<span class="text-danger">*</span></label>
|
||||||
|
<select class="form-control @error('provinsi_id') is-invalid @enderror" id="{{ $prefix }}-provinsi" name="provinsi_id">
|
||||||
|
<option value="">Pilih Provinsi</option>
|
||||||
|
@foreach($provinsi as $p)
|
||||||
|
<option value="{{ $p->id }}" {{ $currentProvinsiId == $p->id ? 'selected' : '' }}>{{ $p->nama }}</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
@error('provinsi_id')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||||
|
</div>
|
||||||
|
<div class="col-md-3 mb-4 form-control-validation">
|
||||||
|
<label class="form-label" for="{{ $prefix }}-kabupaten">Kabupaten/Kota<span class="text-danger">*</span></label>
|
||||||
|
<select class="form-control @error('kabupaten_id') is-invalid @enderror" id="{{ $prefix }}-kabupaten" name="kabupaten_id">
|
||||||
|
<option value="">Pilih Kabupaten/Kota</option>
|
||||||
|
@if($currentKabupaten)
|
||||||
|
<option value="{{ $currentKabupaten->id }}" selected>{{ $currentKabupaten->nama }}</option>
|
||||||
|
@endif
|
||||||
|
</select>
|
||||||
|
@error('kabupaten_id')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||||
|
</div>
|
||||||
|
<div class="col-md-3 mb-4 form-control-validation">
|
||||||
|
<label class="form-label" for="{{ $prefix }}-kecamatan">Kecamatan<span class="text-danger">*</span></label>
|
||||||
|
<select class="form-control @error('kecamatan_id') is-invalid @enderror" id="{{ $prefix }}-kecamatan" name="kecamatan_id">
|
||||||
|
<option value="">Pilih Kecamatan</option>
|
||||||
|
@if($currentKecamatan)
|
||||||
|
<option value="{{ $currentKecamatan->id }}" selected>{{ $currentKecamatan->nama }}</option>
|
||||||
|
@endif
|
||||||
|
</select>
|
||||||
|
@error('kecamatan_id')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||||
|
</div>
|
||||||
|
<div class="col-md-3 mb-4 form-control-validation">
|
||||||
|
<label class="form-label" for="{{ $prefix }}-desa">Desa/Kelurahan<span class="text-danger">*</span></label>
|
||||||
|
<select class="form-control @error('desa_kelurahan_id') is-invalid @enderror" id="{{ $prefix }}-desa" name="desa_kelurahan_id">
|
||||||
|
<option value="">Pilih Desa/Kelurahan</option>
|
||||||
|
@if($currentDesa)
|
||||||
|
<option value="{{ $currentDesa->id }}" selected>{{ $currentDesa->nama }}</option>
|
||||||
|
@endif
|
||||||
|
</select>
|
||||||
|
@error('desa_kelurahan_id')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-3 mb-4 form-control-validation">
|
||||||
|
<label class="form-label" for="{{ $prefix }}-nomor-telepon">No HP</label>
|
||||||
|
<input type="text" class="form-control @error('nomor_telepon') is-invalid @enderror" id="{{ $prefix }}-nomor-telepon" name="nomor_telepon" placeholder="Contoh: 081234567890" value="{{ old('nomor_telepon', $pengurus?->nomor_telepon) }}" minlength="11" maxlength="13" />
|
||||||
|
@error('nomor_telepon')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@push('scripts')
|
||||||
|
<script>
|
||||||
|
'use strict';
|
||||||
|
$(document).ready(function () {
|
||||||
|
const prefix = '#{{ $prefix }}';
|
||||||
|
const lainnyaValue = '{{ \App\Enums\Bumdes\JabatanBumdes::LAINNYA->value }}';
|
||||||
|
|
||||||
|
$(`${prefix}-jenis-kelamin, ${prefix}-pendidikan-terakhir, ${prefix}-jabatan`).select2();
|
||||||
|
$(`${prefix}-tanggal-lahir`).flatpickr({
|
||||||
|
dateFormat: 'd-m-Y'
|
||||||
|
});
|
||||||
|
|
||||||
|
function toggleJabatanLainnya() {
|
||||||
|
const isLainnya = $(`${prefix}-jabatan`).val() === lainnyaValue;
|
||||||
|
$(`${prefix}-jabatan-lainnya-wrapper`).toggleClass('d-none', !isLainnya);
|
||||||
|
|
||||||
|
if (!isLainnya) {
|
||||||
|
$(`${prefix}-jabatan-lainnya`).val('');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$(`${prefix}-jabatan`).on('change', toggleJabatanLainnya);
|
||||||
|
toggleJabatanLainnya();
|
||||||
|
|
||||||
|
$(`${prefix}-provinsi`).select2().change(function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
const provinsiId = $(this).val();
|
||||||
|
$(`${prefix}-kabupaten`).prop('disabled', !provinsiId).val('').trigger('change');
|
||||||
|
$(`${prefix}-kecamatan`).prop('disabled', true).val('').trigger('change');
|
||||||
|
$(`${prefix}-desa`).prop('disabled', true).val('').trigger('change');
|
||||||
|
|
||||||
|
if (provinsiId) {
|
||||||
|
$.ajax({
|
||||||
|
url: '{{ route("kabupatenkota.byprovinsi", ":id") }}'.replace(':id', provinsiId),
|
||||||
|
method: 'GET',
|
||||||
|
success: function(data) {
|
||||||
|
$(`${prefix}-kabupaten`).empty().append('<option value="">Pilih Kabupaten/Kota</option>');
|
||||||
|
data.forEach(function(kabupaten) {
|
||||||
|
$(`${prefix}-kabupaten`).append('<option value="' + kabupaten.id + '">' + kabupaten.nama + '</option>');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$(`${prefix}-kabupaten`).select2().change(function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
const kabupatenId = $(this).val();
|
||||||
|
$(`${prefix}-kecamatan`).prop('disabled', !kabupatenId).val('').trigger('change');
|
||||||
|
$(`${prefix}-desa`).prop('disabled', true).val('').trigger('change');
|
||||||
|
|
||||||
|
if (kabupatenId) {
|
||||||
|
$.ajax({
|
||||||
|
url: '{{ route("kecamatan.bykabupatenkota", ":id") }}'.replace(':id', kabupatenId),
|
||||||
|
method: 'GET',
|
||||||
|
success: function(data) {
|
||||||
|
$(`${prefix}-kecamatan`).empty().append('<option value="">Pilih Kecamatan</option>');
|
||||||
|
data.forEach(function(kecamatan) {
|
||||||
|
$(`${prefix}-kecamatan`).append('<option value="' + kecamatan.id + '">' + kecamatan.nama + '</option>');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$(`${prefix}-kecamatan`).select2().change(function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
const kecamatanId = $(this).val();
|
||||||
|
$(`${prefix}-desa`).prop('disabled', !kecamatanId).val('').trigger('change');
|
||||||
|
|
||||||
|
if (kecamatanId) {
|
||||||
|
$.ajax({
|
||||||
|
url: '{{ route("desakelurahan.bykecamatan", ":id") }}'.replace(':id', kecamatanId),
|
||||||
|
method: 'GET',
|
||||||
|
success: function(data) {
|
||||||
|
$(`${prefix}-desa`).empty().append('<option value="">Pilih Desa/Kelurahan</option>');
|
||||||
|
data.forEach(function(desa) {
|
||||||
|
$(`${prefix}-desa`).append('<option value="' + desa.id + '">' + desa.nama + '</option>');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$(`${prefix}-desa`).select2();
|
||||||
|
|
||||||
|
$('#{{ $mode }}BumdesForm').validate({
|
||||||
|
rules: {
|
||||||
|
nama: { required: true },
|
||||||
|
jenis_kelamin: { required: true },
|
||||||
|
tempat_lahir: { required: true },
|
||||||
|
tanggal_lahir: { required: true },
|
||||||
|
pendidikan_terakhir: { required: true },
|
||||||
|
jabatan: { required: true },
|
||||||
|
jabatan_lainnya: {
|
||||||
|
required: function() {
|
||||||
|
return $(`${prefix}-jabatan`).val() === lainnyaValue;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
lama_menjabat_tahun: { required: true, digits: true, min: 0, max: 80 },
|
||||||
|
alamat: { required: true },
|
||||||
|
provinsi_id: { required: true },
|
||||||
|
kabupaten_id: { required: true },
|
||||||
|
kecamatan_id: { required: true },
|
||||||
|
desa_kelurahan_id: { required: true },
|
||||||
|
nomor_telepon: { required: false, digits: true, minlength: 11, maxlength: 13 }
|
||||||
|
},
|
||||||
|
messages: {
|
||||||
|
nama: { required: 'Nama pengurus BUMDes wajib diisi' },
|
||||||
|
jenis_kelamin: { required: 'Jenis kelamin wajib dipilih' },
|
||||||
|
tempat_lahir: { required: 'Tempat lahir wajib diisi' },
|
||||||
|
tanggal_lahir: { required: 'Tanggal lahir wajib diisi' },
|
||||||
|
pendidikan_terakhir: { required: 'Pendidikan terakhir wajib dipilih' },
|
||||||
|
jabatan: { required: 'Jabatan/peran wajib dipilih' },
|
||||||
|
jabatan_lainnya: { required: 'Jabatan lainnya wajib diisi' },
|
||||||
|
lama_menjabat_tahun: {
|
||||||
|
required: 'Lama menjabat wajib diisi',
|
||||||
|
digits: 'Lama menjabat harus berupa angka tahun',
|
||||||
|
min: 'Lama menjabat tidak boleh kurang dari 0 tahun',
|
||||||
|
max: 'Lama menjabat tidak boleh lebih dari 80 tahun'
|
||||||
|
},
|
||||||
|
alamat: { required: 'Alamat wajib diisi' },
|
||||||
|
provinsi_id: { required: 'Provinsi wajib dipilih' },
|
||||||
|
kabupaten_id: { required: 'Kabupaten/Kota wajib dipilih' },
|
||||||
|
kecamatan_id: { required: 'Kecamatan wajib dipilih' },
|
||||||
|
desa_kelurahan_id: { required: 'Desa/Kelurahan wajib dipilih' },
|
||||||
|
nomor_telepon: {
|
||||||
|
digits: 'Nomor telepon harus berupa angka',
|
||||||
|
minlength: 'Nomor telepon minimal 11 digit',
|
||||||
|
maxlength: 'Nomor telepon maksimal 13 digit'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
errorElement: 'div',
|
||||||
|
errorPlacement: function (error, element) {
|
||||||
|
error.addClass('invalid-feedback');
|
||||||
|
element.closest('.form-control-validation').append(error);
|
||||||
|
},
|
||||||
|
highlight: function (element) {
|
||||||
|
$(element).addClass('is-invalid');
|
||||||
|
},
|
||||||
|
unhighlight: function (element) {
|
||||||
|
$(element).removeClass('is-invalid');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
@endpush
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
@extends('layout.main')
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="container-xxl flex-grow-1 container-p-y">
|
||||||
|
@if ($errors->any())
|
||||||
|
<div class="alert alert-danger">
|
||||||
|
<ul class="mb-0">
|
||||||
|
@foreach ($errors->all() as $error)
|
||||||
|
<li>{{ $error }}</li>
|
||||||
|
@endforeach
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
@include('bumdes.profil.header', ['pengurus' => null])
|
||||||
|
|
||||||
|
<div class="card mb-6">
|
||||||
|
<div class="card-header border-bottom">
|
||||||
|
<h5 class="card-title mb-0">Tambah Profil Pengurus BUMDes</h5>
|
||||||
|
</div>
|
||||||
|
<div class="card-body pt-6">
|
||||||
|
<form id="addBumdesForm" action="{{ route('bumdes.store') }}" method="POST">
|
||||||
|
@csrf
|
||||||
|
@include('bumdes.profil._form', ['pengurus' => null, 'mode' => 'add'])
|
||||||
|
|
||||||
|
<div class="mt-4 text-end">
|
||||||
|
<a href="{{ route('bumdes.index') }}" class="btn btn-secondary me-2 wave-effect wave-light">Kembali</a>
|
||||||
|
<button type="submit" class="btn btn-success data-submit wave-effect wave-light"><i class="ti tabler-device-floppy me-2"></i> Simpan Profil</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
@extends('layout.main')
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="container-xxl flex-grow-1 container-p-y">
|
||||||
|
@if (session('success'))
|
||||||
|
<div class="alert alert-success">{{ session('success') }}</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
@if ($errors->any())
|
||||||
|
<div class="alert alert-danger">
|
||||||
|
<ul class="mb-0">
|
||||||
|
@foreach ($errors->all() as $error)
|
||||||
|
<li>{{ $error }}</li>
|
||||||
|
@endforeach
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
@include('bumdes.profil.header', ['pengurus' => $pengurus])
|
||||||
|
|
||||||
|
<div class="card mb-6">
|
||||||
|
<div class="card-header border-bottom">
|
||||||
|
<h5 class="card-title mb-0">Edit Profil Pengurus BUMDes</h5>
|
||||||
|
</div>
|
||||||
|
<div class="card-body pt-6">
|
||||||
|
<form id="editBumdesForm" action="{{ route('bumdes.update', $pengurus->id) }}" method="POST">
|
||||||
|
@csrf
|
||||||
|
@method('PUT')
|
||||||
|
@include('bumdes.profil._form', ['pengurus' => $pengurus, 'mode' => 'edit'])
|
||||||
|
|
||||||
|
<div class="mt-4 text-end">
|
||||||
|
<a href="{{ route('bumdes.index') }}" class="btn btn-secondary me-2 wave-effect wave-light">Kembali</a>
|
||||||
|
<button type="submit" class="btn btn-success data-submit wave-effect wave-light"><i class="ti tabler-device-floppy me-2"></i> Simpan Profil</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
@@ -0,0 +1,162 @@
|
|||||||
|
<style>
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
.nav-pills-custom-spacing {
|
||||||
|
display: flex;
|
||||||
|
width: 100%;
|
||||||
|
gap: 0.5rem;
|
||||||
|
flex-wrap: nowrap !important;
|
||||||
|
overflow-x: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-pills-custom-spacing::-webkit-scrollbar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-pills-custom-spacing .nav-item {
|
||||||
|
margin-right: 0 !important;
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-pills-custom-spacing .nav-link {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
padding-left: 0.5rem !important;
|
||||||
|
padding-right: 0.5rem !important;
|
||||||
|
width: 100%;
|
||||||
|
white-space: nowrap;
|
||||||
|
font-size: 0.9375rem !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-pills-custom-spacing .nav-link i {
|
||||||
|
margin-right: 0.4rem !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
@php
|
||||||
|
$jenisKelamin = isset($pengurus)
|
||||||
|
? ($pengurus->jenis_kelamin ? 'Laki-laki' : 'Perempuan')
|
||||||
|
: 'Jenis Kelamin';
|
||||||
|
$jabatanLabel = isset($pengurus) ? $pengurus->nama_jabatan : 'Jabatan/Peran';
|
||||||
|
$domisili = isset($pengurus) && $pengurus->desaKelurahan
|
||||||
|
? $pengurus->desaKelurahan->nama . ', ' . $pengurus->desaKelurahan->kecamatan?->nama . ', ' . $pengurus->desaKelurahan->kecamatan?->kabupatenKota?->nama . ', ' . $pengurus->desaKelurahan->kecamatan?->kabupatenKota?->provinsi?->nama
|
||||||
|
: 'Desa/Kelurahan, Kecamatan, Kabupaten/Kota, Provinsi';
|
||||||
|
@endphp
|
||||||
|
|
||||||
|
<div class="row mb-4">
|
||||||
|
<div class="col-md-4 mb-2 mb-md-0">
|
||||||
|
<div class="card h-100">
|
||||||
|
<div class="card-body p-3">
|
||||||
|
<h6 class="card-title mb-2">Profil Pengurus BUMDes</h6>
|
||||||
|
<div class="d-flex justify-content-start align-items-center mb-3">
|
||||||
|
<div class="avatar me-2">
|
||||||
|
<span class="avatar-initial rounded bg-label-primary">
|
||||||
|
<i class="icon-base ti tabler-user-check icon-22px"></i>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="d-flex flex-column">
|
||||||
|
<h6 class="mb-0" style="font-size: 0.9rem;">{{ isset($pengurus) ? $pengurus->nama : 'Tambah Pengurus BUMDes Baru' }}</h6>
|
||||||
|
<span class="text-muted" style="font-size: 0.75rem;">{{ $jenisKelamin }}</span>
|
||||||
|
<span class="text-muted" style="font-size: 0.75rem;">Jabatan: {{ $jabatanLabel }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<hr class="my-2">
|
||||||
|
<h6 class="mb-1" style="font-size: 0.85rem;">Domisili</h6>
|
||||||
|
<p class="mb-0 text-muted" style="font-size: 0.75rem;">Alamat: {{ isset($pengurus) ? $pengurus->alamat : 'Alamat' }}</p>
|
||||||
|
<p class="mb-0 text-muted" style="font-size: 0.75rem; line-height: 1.3;">{{ $domisili }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-8 d-flex flex-column">
|
||||||
|
<div class="card mb-2 flex-grow-1">
|
||||||
|
<div class="card-widget-separator-wrapper h-100">
|
||||||
|
<div class="card-body card-widget-separator py-2 h-100 d-flex flex-column justify-content-center">
|
||||||
|
<div class="row gy-2">
|
||||||
|
<div class="col-sm-6 col-lg-4">
|
||||||
|
<div class="d-flex justify-content-between align-items-center card-widget-1 border-end h-100 pe-3">
|
||||||
|
<div>
|
||||||
|
<p class="mb-0 text-muted" style="font-size: 0.75rem;">Jenis Kelamin</p>
|
||||||
|
<h5 class="mb-0">{{ $jenisKelamin }}</h5>
|
||||||
|
<p class="mb-0" style="font-size: 0.75rem;">
|
||||||
|
<span class="me-1">{{ isset($pengurus) ? ($pengurus->usia . ' tahun') : 'Belum terisi' }}</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<span class="avatar">
|
||||||
|
<span class="avatar-initial rounded">
|
||||||
|
<i class="icon-base ti tabler-users icon-22px text-heading"></i>
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-6 col-lg-4">
|
||||||
|
<div class="d-flex justify-content-between align-items-center card-widget-1 border-end h-100 px-3">
|
||||||
|
<div>
|
||||||
|
<p class="mb-0 text-muted" style="font-size: 0.75rem;">Jabatan</p>
|
||||||
|
<h5 class="mb-0">{{ $jabatanLabel }}</h5>
|
||||||
|
<p class="mb-0" style="font-size: 0.75rem;">
|
||||||
|
<span class="me-1">{{ isset($pengurus) ? $pengurus->lama_menjabat : 'Belum terisi' }}</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<span class="avatar">
|
||||||
|
<span class="avatar-initial rounded">
|
||||||
|
<i class="icon-base ti tabler-briefcase icon-22px text-heading"></i>
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-6 col-lg-4">
|
||||||
|
<div class="d-flex justify-content-between align-items-center card-widget-1 h-100 ps-3">
|
||||||
|
<div>
|
||||||
|
<p class="mb-0 text-muted" style="font-size: 0.75rem;">Domisili</p>
|
||||||
|
<h5 class="mb-0">{{ isset($pengurus) ? ($pengurus->desaKelurahan?->nama ?? '-') : '-' }}</h5>
|
||||||
|
<p class="mb-0" style="font-size: 0.75rem;">
|
||||||
|
<span class="me-1">{{ isset($pengurus) ? ($pengurus->desaKelurahan?->kecamatan?->nama ?? '-') : 'Belum terisi' }}</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<span class="avatar">
|
||||||
|
<span class="avatar-initial rounded">
|
||||||
|
<i class="icon-base ti tabler-map-pin icon-22px text-heading"></i>
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card flex-grow-1">
|
||||||
|
<div class="card-body py-3 d-flex align-items-center">
|
||||||
|
<div class="w-100">
|
||||||
|
<p class="mb-1 text-muted" style="font-size: 0.75rem;">Alamat Domisili</p>
|
||||||
|
<h6 class="mb-0">{{ isset($pengurus) ? ($pengurus->alamat ?: '-') : '-' }}</h6>
|
||||||
|
<p class="mb-0 text-muted" style="font-size: 0.75rem;">{{ $domisili }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="nav-align-top">
|
||||||
|
<ul class="nav nav-pills flex-column flex-md-row mb-6 row-gap-2 nav-pills-custom-spacing">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link {{ request()->routeIs('bumdes.create') || request()->routeIs('bumdes.edit') ? 'active' : '' }}" href="{{ isset($pengurus) ? route('bumdes.edit', $pengurus->id) : route('bumdes.create') }}">
|
||||||
|
<i class="icon-base ti tabler-user-check icon-sm"></i>Profil
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
@if(isset($pengurus))
|
||||||
|
<a class="nav-link {{ request()->routeIs('bumdes.kelembagaan-aktor.*') ? 'active' : '' }}" href="{{ route('bumdes.kelembagaan-aktor.index', $pengurus->id) }}">
|
||||||
|
<i class="icon-base ti tabler-building-community icon-sm"></i>Kelembagaan dan Aktor
|
||||||
|
</a>
|
||||||
|
@else
|
||||||
|
<a class="nav-link" href="#" disabled data-bs-original-title="Kelembagaan dan Aktor, isi profil terlebih dahulu" data-bs-toggle="tooltip" data-bs-placement="top">
|
||||||
|
<i class="icon-base ti tabler-building-community icon-sm"></i>Kelembagaan dan Aktor
|
||||||
|
</a>
|
||||||
|
@endif
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,158 @@
|
|||||||
|
@extends('layout.main')
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="container-xxl flex-grow-1 container-p-y">
|
||||||
|
<div class="d-flex flex-row gap-3 mb-4">
|
||||||
|
<div class="w-25">
|
||||||
|
<x-summary-card
|
||||||
|
title="Pengurus BUMDes"
|
||||||
|
count="{{ $totalPengurus }}"
|
||||||
|
subtitle="{{ $totalLakiLaki }} Laki-laki, {{ $totalPerempuan }} Perempuan"
|
||||||
|
icon="user-check"
|
||||||
|
color="primary"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="w-25">
|
||||||
|
<x-summary-card
|
||||||
|
title="Desa/Kelurahan"
|
||||||
|
count="{{ $totalDesaKelurahan }}"
|
||||||
|
subtitle="desa/kelurahan memiliki data pengurus"
|
||||||
|
icon="map-pin"
|
||||||
|
color="success"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="w-25">
|
||||||
|
<x-summary-card
|
||||||
|
title="Jabatan/Peran"
|
||||||
|
count="{{ $totalJabatan }}"
|
||||||
|
subtitle="jenis jabatan/peran terdata"
|
||||||
|
icon="briefcase"
|
||||||
|
color="info"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header border-bottom">
|
||||||
|
<h5 class="card-title mb-0">Data Pengurus BUMDes</h5>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-body border-bottom pt-4">
|
||||||
|
<form method="GET" action="{{ route('bumdes.index') }}" class="d-flex justify-content-between align-items-center row gap-3 gap-md-0">
|
||||||
|
<div class="col-md-auto">
|
||||||
|
<div class="d-flex align-items-center">
|
||||||
|
<label class="me-2 text-nowrap">Show</label>
|
||||||
|
<select name="per_page" class="form-select form-select-sm w-auto" onchange="this.form.submit()">
|
||||||
|
<option value="10" {{ request('per_page') == 10 ? 'selected' : '' }}>10</option>
|
||||||
|
<option value="25" {{ request('per_page') == 25 ? 'selected' : '' }}>25</option>
|
||||||
|
</select>
|
||||||
|
<label class="ms-2 text-nowrap">entries</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-auto d-flex gap-2">
|
||||||
|
<div class="input-group input-group-sm w-auto">
|
||||||
|
<input type="text" name="search" class="form-control" placeholder="Cari Nama..." value="{{ request('search') }}">
|
||||||
|
<button type="submit" class="btn btn-outline-primary"><i class="ti tabler-search"></i></button>
|
||||||
|
</div>
|
||||||
|
<a href="{{ route('bumdes.create') }}" class="btn btn-sm btn-primary">
|
||||||
|
<i class="ti tabler-plus me-1"></i> Tambah
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="table-responsive text-nowrap">
|
||||||
|
<table class="table table-hover">
|
||||||
|
<thead class="border-top">
|
||||||
|
<tr>
|
||||||
|
<th>No</th>
|
||||||
|
<th>Nama</th>
|
||||||
|
<th>Jenis Kelamin</th>
|
||||||
|
<th>Usia</th>
|
||||||
|
<th>Desa/Kelurahan</th>
|
||||||
|
<th>Jabatan/Peran</th>
|
||||||
|
<th>Lama Menjabat</th>
|
||||||
|
@if($showEnumerator)
|
||||||
|
<th>Nama Enumerator</th>
|
||||||
|
@endif
|
||||||
|
<th>Aksi</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@forelse($pengurus as $item)
|
||||||
|
<tr>
|
||||||
|
<td>{{ ($pengurus->firstItem() ?? 0) + $loop->index }}</td>
|
||||||
|
<td><span class="text-heading">{{ $item->nama }}</span></td>
|
||||||
|
<td><span class="text-muted">{{ $item->jenis_kelamin ? 'Laki-laki' : 'Perempuan' }}</span></td>
|
||||||
|
<td><span class="text-muted">{{ $item->usia }} tahun</span></td>
|
||||||
|
<td>
|
||||||
|
<span class="text-muted">
|
||||||
|
{{ $item->desaKelurahan?->nama }},
|
||||||
|
{{ $item->desaKelurahan?->kecamatan?->nama }},
|
||||||
|
{{ $item->desaKelurahan?->kecamatan?->kabupatenKota?->nama }},
|
||||||
|
{{ $item->desaKelurahan?->kecamatan?->kabupatenKota?->provinsi?->nama }}
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
<td>{{ $item->nama_jabatan }}</td>
|
||||||
|
<td><span class="text-muted">{{ $item->lama_menjabat }}</span></td>
|
||||||
|
@if($showEnumerator)
|
||||||
|
<td><span class="text-muted">{{ $item->creator?->name ?? '-' }}</span></td>
|
||||||
|
@endif
|
||||||
|
<td>
|
||||||
|
<div class="d-flex align-items-center">
|
||||||
|
<a href="{{ route('bumdes.edit', $item->id) }}" class="btn btn-icon btn-text-secondary rounded-pill edit-record"><i class="ti tabler-edit ti-md"></i></a>
|
||||||
|
<a href="javascript:;" class="btn btn-icon btn-text-secondary rounded-pill delete-record" data-id="{{ $item->id }}" data-nama="{{ $item->nama }}"><i class="ti tabler-trash ti-md"></i></a>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@empty
|
||||||
|
<tr>
|
||||||
|
<td colspan="{{ $showEnumerator ? 9 : 8 }}" class="text-center py-4">Tidak ada data ditemukan.</td>
|
||||||
|
</tr>
|
||||||
|
@endforelse
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div class="card-footer d-flex justify-content-center justify-content-md-end border-top">
|
||||||
|
{{ $pengurus->appends(request()->query())->links('pagination::bootstrap-5') }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@push('scripts')
|
||||||
|
<script>
|
||||||
|
'use strict';
|
||||||
|
const csrfToken = "{{ csrf_token() }}";
|
||||||
|
|
||||||
|
$(document).ready(function () {
|
||||||
|
$(document).on('click', '.delete-record', function () {
|
||||||
|
const id = $(this).data('id');
|
||||||
|
const name = $(this).data('nama');
|
||||||
|
|
||||||
|
Swal.fire({
|
||||||
|
title: 'Apakah Anda yakin?',
|
||||||
|
text: `Profile "${name}" akan dihapus secara permanen!`,
|
||||||
|
icon: 'warning',
|
||||||
|
showCancelButton: true,
|
||||||
|
confirmButtonText: 'Ya, Hapus!',
|
||||||
|
customClass: { confirmButton: 'btn btn-primary me-3', cancelButton: 'btn btn-label-secondary' },
|
||||||
|
buttonsStyling: false
|
||||||
|
}).then(function (result) {
|
||||||
|
if (result.value) {
|
||||||
|
$.ajax({
|
||||||
|
url: '{{ route('bumdes.destroy', ':id') }}'.replace(':id', id),
|
||||||
|
type: 'DELETE',
|
||||||
|
headers: { 'X-CSRF-TOKEN': csrfToken },
|
||||||
|
success: function (res) {
|
||||||
|
Swal.fire({ icon: 'success', title: 'Terhapus!', text: res.message, showConfirmButton: false, timer: 1500 })
|
||||||
|
.then(() => window.location.reload());
|
||||||
|
},
|
||||||
|
error: () => Swal.fire({ icon: 'error', title: 'Gagal!', text: 'Terjadi kesalahan sistem.' })
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
@endpush
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,816 @@
|
|||||||
|
@extends('layout.main')
|
||||||
|
|
||||||
|
@push('style')
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"
|
||||||
|
integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY="
|
||||||
|
crossorigin=""/>
|
||||||
|
@endpush
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
@php
|
||||||
|
$segments = [
|
||||||
|
[
|
||||||
|
'name' => 'Penggerak',
|
||||||
|
'range' => '4.0 - 5.0',
|
||||||
|
'icon' => 'tabler-crown',
|
||||||
|
'color' => 'success',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'Perintis',
|
||||||
|
'range' => '3.0 - 3.9',
|
||||||
|
'icon' => 'tabler-flag',
|
||||||
|
'color' => 'info',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'Pemerhati',
|
||||||
|
'range' => '2.0 - 2.9',
|
||||||
|
'icon' => 'tabler-eye',
|
||||||
|
'color' => 'warning',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'Pemula',
|
||||||
|
'range' => '1.0 - 1.9',
|
||||||
|
'icon' => 'tabler-seedling',
|
||||||
|
'color' => 'danger',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
||||||
|
$colors = collect($segments)
|
||||||
|
->pluck('color')
|
||||||
|
->map(fn($c) => "var(--bs-{$c})")
|
||||||
|
->values();
|
||||||
|
$segmentStyles = collect($segments)->keyBy('name');
|
||||||
|
|
||||||
|
$countSegmentasi = $countSegmentasi->keyBy('segmen');
|
||||||
|
$seriesSegmentasi = collect($segments)->map(function ($segment) use ($countSegmentasi) {
|
||||||
|
return $countSegmentasi[$segment['name']]->total ?? 0;
|
||||||
|
});
|
||||||
|
$seriesSegmentasiKomoditas = collect($segments)->map(function ($segment) use ($countSegmentasiByKomoditas, $komoditas) {
|
||||||
|
|
||||||
|
return [
|
||||||
|
'name' => $segment['name'],
|
||||||
|
'data' => $komoditas->map(function ($item) use ($countSegmentasiByKomoditas, $segment) {
|
||||||
|
|
||||||
|
return optional(
|
||||||
|
$countSegmentasiByKomoditas->first(function ($row) use ($item, $segment) {
|
||||||
|
return $row->komoditas_id == $item->id
|
||||||
|
&& $row->segmen == $segment['name'];
|
||||||
|
})
|
||||||
|
)->total ?? 0;
|
||||||
|
|
||||||
|
})->values(),
|
||||||
|
];
|
||||||
|
|
||||||
|
})->values();
|
||||||
|
|
||||||
|
$segmenDominan = $mapSegmentasi
|
||||||
|
->groupBy('desa_kelurahan_id')
|
||||||
|
->map(function ($items) {
|
||||||
|
return $items->sortByDesc('total')->first();
|
||||||
|
});
|
||||||
|
|
||||||
|
$mapAvgSkorSegmentasi->each(function ($item) use ($segmenDominan) {
|
||||||
|
$dominan = $segmenDominan->get($item->desa_kelurahan_id);
|
||||||
|
|
||||||
|
$item->segmen_dominan = $dominan?->segmen;
|
||||||
|
$item->jumlah_dominan = $dominan?->total;
|
||||||
|
});
|
||||||
|
|
||||||
|
$segmentasiByDesa = $mapAvgSkorSegmentasi->keyBy('desa_kelurahan_id');
|
||||||
|
$desaLookup = $desaKelurahan->keyBy('desa_kelurahan_id');
|
||||||
|
|
||||||
|
$mapDesaSegmentasi = $segmentasiByDesa->map(function ($segmentasi, $desaId) use ($desaLookup) {
|
||||||
|
$desa = $desaLookup->get($desaId);
|
||||||
|
|
||||||
|
if (!$desa) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$desa->segmentasi = $segmentasi;
|
||||||
|
|
||||||
|
return $desa;
|
||||||
|
})->filter()->values();
|
||||||
|
@endphp
|
||||||
|
<div class="container-xxl flex-grow-1 container-p-y">
|
||||||
|
<div class="row g-6">
|
||||||
|
<div class="col-lg-3 col-sm-6">
|
||||||
|
<div class="card card-border-shadow-primary h-100">
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="d-flex align-items-center mb-2">
|
||||||
|
<div class="avatar me-4">
|
||||||
|
<span class="avatar-initial rounded bg-label-primary">
|
||||||
|
<i class="icon-base ti tabler-user-check icon-28px"></i>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<h4 class="mb-0">{{ $countPetani }}</h4>
|
||||||
|
</div>
|
||||||
|
<p class="mb-1">Total Petani</p>
|
||||||
|
<p class="mb-0">
|
||||||
|
<span class="text-heading fw-medium me-2">{{ $countKomoditas }}</span>
|
||||||
|
<small class="text-body-secondary">komoditas utama</small>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-3 col-sm-6">
|
||||||
|
<div class="card card-border-shadow-warning h-100">
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="d-flex align-items-center mb-2">
|
||||||
|
<div class="avatar me-4">
|
||||||
|
<span class="avatar-initial rounded bg-label-warning">
|
||||||
|
<i class="icon-base ti tabler-trees icon-28px"></i>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<h4 class="mb-0">{{ number_format($sumLahan, 2, ',', '.') }} ha</h4>
|
||||||
|
</div>
|
||||||
|
<p class="mb-1">Total Luas Lahan</p>
|
||||||
|
<p class="mb-0">
|
||||||
|
<small class="text-body-warning">rata-rata</small>
|
||||||
|
<span class="text-heading fw-medium">{{ number_format($avgLahan, 2, ',', '.') }}</span>
|
||||||
|
<small class="text-body-warning">ha/petani</small>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-3 col-sm-6">
|
||||||
|
<div class="card card-border-shadow-info h-100">
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="d-flex align-items-center mb-2">
|
||||||
|
<div class="avatar me-4">
|
||||||
|
<span class="avatar-initial rounded bg-label-info">
|
||||||
|
<i class="icon-base ti tabler-star icon-28px"></i>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<h4 class="mb-0">{{ number_format($avgSkor, 2, ',', '.') }}</h4>
|
||||||
|
</div>
|
||||||
|
<p class="mb-1">Rata-rata Indeks Kesiapan Adopsi</p>
|
||||||
|
<p class="mb-0">
|
||||||
|
<small class="text-body-secondary">Segmentasi:</small>
|
||||||
|
<span class="text-heading fw-medium me-2">{{ $avgSegmen }}</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-3 col-sm-6">
|
||||||
|
<div class="card card-border-shadow-success h-100">
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="d-flex align-items-center mb-2">
|
||||||
|
<div class="avatar me-4">
|
||||||
|
<span class="avatar-initial rounded bg-label-success">
|
||||||
|
<i class="icon-base ti tabler-map-2 icon-28px"></i>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<h4 class="mb-0">{{ $countDesa }}</h4>
|
||||||
|
</div>
|
||||||
|
<p class="mb-1">Jumlah Desa Sasaran</p>
|
||||||
|
<p class="mb-0">
|
||||||
|
<span class="text-heading fw-medium me-2">{{ $countKecamatan }}</span>
|
||||||
|
<small class="text-body-secondary">kecamatan sasaran</small>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row g-6 py-4">
|
||||||
|
<div class="col-lg-6 col-sm-12">
|
||||||
|
<div class="card card-border-shadow-primary h-100">
|
||||||
|
<div class="card-header d-flex justify-content-between align-items-center">
|
||||||
|
<div class="card-title mb-0">
|
||||||
|
<h5 class="m-0 me-2">Distribusi Segmentasi Petani</h5>
|
||||||
|
<p class="card-subtitle">untuk semua komoditas</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="d-flex justify-content-start align-items-start mb-3">
|
||||||
|
<div id="chart-segmentasi-petani"></div>
|
||||||
|
<table class="table card-table table-border-top-0 table-border-bottom-0 data-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th></th>
|
||||||
|
<th class="text-end pe-0">Petani</th>
|
||||||
|
<th class="text-end pe-0">%</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
|
||||||
|
@foreach ($segments as $segment)
|
||||||
|
@php
|
||||||
|
$total = $countSegmentasi->where('segmen', $segment['name'])->sum('total');
|
||||||
|
$persen = $countPetani ? ($total / $countPetani) * 100 : 0;
|
||||||
|
@endphp
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<div class="d-flex justify-content-start align-items-center">
|
||||||
|
<div class="me-2">
|
||||||
|
<i class="icon-base ti {{ $segment['icon'] }} icon-lg text-{{ $segment['color'] }}"></i>
|
||||||
|
</div>
|
||||||
|
<span class="text-{{ $segment['color'] }}">
|
||||||
|
{{ $segment['name'] }}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td class="text-end pe-0">{{ number_format($total) }}</td>
|
||||||
|
<td class="text-end pe-0">{{ number_format($persen, 2) }}%</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-6 col-sm-12">
|
||||||
|
<div class="card card-border-shadow-secondary h-100">
|
||||||
|
<div class="card-header d-flex justify-content-between align-items-center">
|
||||||
|
<div class="card-title mb-0">
|
||||||
|
<h5 class="m-0 me-2">Distribusi Segmentasi Petani</h5>
|
||||||
|
<p class="card-subtitle">per komoditas</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div id="chart-segmentasi-petani-komoditas"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row g-6 py-4">
|
||||||
|
<div class="col-lg-6 col-sm-12">
|
||||||
|
<div class="card card-border-shadow-info h-100">
|
||||||
|
<div class="card-header d-flex justify-content-between align-items-center">
|
||||||
|
<div class="card-title mb-0">
|
||||||
|
<h5 class="m-0 me-2">Rata-rata Dimensi Kesiapan Adopsi</h5>
|
||||||
|
<p class="card-subtitle">untuk semua komoditas</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div id="chart-dimensi"></div>
|
||||||
|
<div class="d-flex flex-wrap gap-3 mt-3 small justify-content-center">
|
||||||
|
<div>
|
||||||
|
<span class="badge bg-label-primary">D1</span> Sistem & Praktik Budidaya
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="badge bg-label-primary">D2</span> Sosial Ekonomi Rumah Tangga
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="badge bg-label-primary">D3</span> Rantai Nilai & Akses Pasar
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-6 col-sm-12">
|
||||||
|
<div class="card card-border-shadow-warning h-100">
|
||||||
|
<div class="card-header d-flex justify-content-between align-items-center">
|
||||||
|
<div class="card-title mb-0">
|
||||||
|
<h5 class="m-0 me-2">Rata-rata Komponen Kesiapan Adopsi</h5>
|
||||||
|
<p class="card-subtitle">untuk semua komoditas</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div id="chart-komponen"></div>
|
||||||
|
<div class="d-flex flex-wrap gap-3 mt-3 small justify-content-center">
|
||||||
|
<div>
|
||||||
|
<span class="badge bg-label-primary">K1</span> Motivasi & Kapasitas Adopsi
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="badge bg-label-primary">K2</span> Kondisi Ekonomi Rumah Tangga
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="badge bg-label-primary">K3</span> Praktik Budidaya & GAP
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="badge bg-label-primary">K4</span> Keterlibatan Kelembagaan
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="badge bg-label-primary">K5</span> Akses & Kebebasan Keuangan
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="badge bg-label-primary">K6</span> Rantai Nilai & Akses Pasar
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row g-6 py-4">
|
||||||
|
<div class="col-lg-6 col-sm-12">
|
||||||
|
<div class="card card-border-shadow-danger h-100">
|
||||||
|
<div class="card-header d-flex justify-content-between align-items-center">
|
||||||
|
<div class="card-title mb-0">
|
||||||
|
<h5 class="m-0 me-2">Sebaran Segmentasi Petani</h5>
|
||||||
|
<p class="card-subtitle">berdasarkan sebaran wilayah untuk semua komoditas</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div id="map-sebaran-petani" style="height: 380px;"></div>
|
||||||
|
<span class="small text-muted">*klik pada desa untuk menampilkan detail informasi dan menyaring daftar petani</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-6 col-sm-12">
|
||||||
|
<div class="card card-border-shadow-success h-100">
|
||||||
|
<div class="card-header d-flex justify-content-between align-items-center">
|
||||||
|
<div class="card-title mb-0">
|
||||||
|
<h5 class="m-0 me-2">Distribusi Segmentasi Petani</h5>
|
||||||
|
<p class="card-subtitle">berdasarkan sebaran wilayah untuk semua komoditas</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<table id="table-desa" class="table card-table table-border-top-0 table-border-bottom-0">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="pe-0">Desa/Kelurahan</th>
|
||||||
|
<th class="text-end pe-0">Petani</th>
|
||||||
|
<th class="pe-0">Segmen Rata-rata</th>
|
||||||
|
<th class="pe-0">Segmen Dominan</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach ($mapDesaSegmentasi as $desa)
|
||||||
|
@php
|
||||||
|
$style = $segmentStyles[$desa->segmentasi->segmen] ?? null;
|
||||||
|
$styleDominan = $segmentStyles[$desa->segmentasi->segmen_dominan] ?? null;
|
||||||
|
@endphp
|
||||||
|
<tr>
|
||||||
|
<td class="pe-0">{{ $desa->desa_kelurahan }}</td>
|
||||||
|
<td class="text-end pe-0">{{ number_format($desa->segmentasi->jumlah_petani) }}</td>
|
||||||
|
<td class="pe-0">
|
||||||
|
<span class="badge bg-{{ $style['color'] ?? 'secondary' }}">
|
||||||
|
{{ $desa->segmentasi->segmen }}
|
||||||
|
</span>
|
||||||
|
({{ number_format($desa->segmentasi->skor, 2, ',', '.') }})
|
||||||
|
</td>
|
||||||
|
<td class="pe-0">
|
||||||
|
<span class="badge bg-{{ $styleDominan['color'] ?? 'secondary' }}">
|
||||||
|
{{ $desa->segmentasi->segmen_dominan }}
|
||||||
|
</span>
|
||||||
|
({{ number_format($desa->segmentasi->jumlah_dominan) }} petani)
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row g-6 py-4">
|
||||||
|
<div class="col-lg-12 col-sm-12">
|
||||||
|
<div class="card card-border-shadow-primary h-100">
|
||||||
|
<div class="card-header d-flex justify-content-between align-items-center">
|
||||||
|
<div class="card-title mb-0">
|
||||||
|
<h5 class="m-0 me-2">Daftar Petani</h5>
|
||||||
|
<p class="card-subtitle">untuk semua komoditas</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<table id="table-petani" class="table card-table table-border-top-0 table-border-bottom-0">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="pe-0">Nama Petani</th>
|
||||||
|
<th class="pe-0">Desa/Kelurahan</th>
|
||||||
|
<th class="pe-0">Komoditas</th>
|
||||||
|
<th class="text-end pe-0">Luas Lahan (ha)</th>
|
||||||
|
<th class="text-end pe-0">Indeks Kesiapan Adopsi</th>
|
||||||
|
<th class="pe-0">Segmen</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach ($daftarPetani as $item)
|
||||||
|
@php
|
||||||
|
$style = $segmentStyles[$item->segmen()] ?? null;
|
||||||
|
@endphp
|
||||||
|
<tr data-desa="{{ $item->desa_kelurahan_id }}">
|
||||||
|
<td class="pe-0">{{ $item->nama }}</td>
|
||||||
|
<td class="pe-0">{{ $item->desaKelurahan?->nama }}</td>
|
||||||
|
<td class="pe-0">{{ $item->komoditas?->nama }}</td>
|
||||||
|
<td class="text-end pe-0">{{ number_format($item->lahans?->sum('luas_lahan'), 2, ',', '.') }}</td>
|
||||||
|
<td class="text-end pe-0">{{ $item->skor ? number_format($item->skor?->skor_kesiapan_adopsi, 2, ',', '.') : '' }}</td>
|
||||||
|
<td class="pe-0">
|
||||||
|
@if ($item->skor)
|
||||||
|
<span class="badge bg-{{ $style['color'] ?? 'secondary' }}">
|
||||||
|
{{ $item->segmen() }}
|
||||||
|
</span>
|
||||||
|
@endif
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
|
||||||
|
@push('scripts')
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/apexcharts"></script>
|
||||||
|
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"
|
||||||
|
integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo="
|
||||||
|
crossorigin=""></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
$('.data-table').DataTable({
|
||||||
|
"paging": false,
|
||||||
|
"lengthChange": true,
|
||||||
|
"searching": false,
|
||||||
|
"ordering": false,
|
||||||
|
"info": false,
|
||||||
|
"autoWidth": false,
|
||||||
|
"responsive": false,
|
||||||
|
"scrollX": true
|
||||||
|
});
|
||||||
|
|
||||||
|
var tableDesa = $('#table-desa').DataTable({
|
||||||
|
"paging": true,
|
||||||
|
"lengthChange": false,
|
||||||
|
"searching": false,
|
||||||
|
"ordering": true,
|
||||||
|
"info": false,
|
||||||
|
"autoWidth": false,
|
||||||
|
"responsive": false,
|
||||||
|
"scrollX": true,
|
||||||
|
"pageLength": 5,
|
||||||
|
});
|
||||||
|
|
||||||
|
var tablePetani = $('#table-petani').DataTable({
|
||||||
|
"paging": true,
|
||||||
|
"lengthChange": true,
|
||||||
|
"searching": true,
|
||||||
|
"ordering": true,
|
||||||
|
"info": true,
|
||||||
|
"autoWidth": false,
|
||||||
|
"responsive": false,
|
||||||
|
"scrollX": true
|
||||||
|
});
|
||||||
|
|
||||||
|
let selectedDesa = null;
|
||||||
|
|
||||||
|
$.fn.dataTable.ext.search.push(function(settings, data, dataIndex) {
|
||||||
|
if (!selectedDesa) return true;
|
||||||
|
|
||||||
|
if (settings.nTable.id === 'table-petani') {
|
||||||
|
const row = tablePetani.row(dataIndex).node();
|
||||||
|
return $(row).data('desa') == selectedDesa;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Chart Segmentasi Petani
|
||||||
|
var optionsSegmentasiPetani = {
|
||||||
|
series: @json($seriesSegmentasi),
|
||||||
|
chart: {
|
||||||
|
type: 'donut',
|
||||||
|
width: 320,
|
||||||
|
},
|
||||||
|
labels: @json(array_column($segments, 'name')),
|
||||||
|
colors: @json($colors),
|
||||||
|
plotOptions: {
|
||||||
|
pie: {
|
||||||
|
borderRadius: 12,
|
||||||
|
spacing: 5,
|
||||||
|
donut: {
|
||||||
|
size: '68%',
|
||||||
|
labels: {
|
||||||
|
show: true,
|
||||||
|
total: {
|
||||||
|
show: true,
|
||||||
|
label: 'Petani Tersegmentasi',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
stroke: {
|
||||||
|
width: 0,
|
||||||
|
},
|
||||||
|
dataLabels: {
|
||||||
|
enabled: false,
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
responsive: [
|
||||||
|
{
|
||||||
|
breakpoint: 360,
|
||||||
|
options: {
|
||||||
|
chart: {
|
||||||
|
width: 240,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
var chartSegmentasiPetani = new ApexCharts(document.querySelector('#chart-segmentasi-petani'), optionsSegmentasiPetani)
|
||||||
|
chartSegmentasiPetani.render()
|
||||||
|
|
||||||
|
// Chart Segmentasi Petani By Komoditas
|
||||||
|
var optionsSegmentasiPetaniByKomoditas = {
|
||||||
|
series: @json($seriesSegmentasiKomoditas),
|
||||||
|
colors: @json($colors),
|
||||||
|
chart: {
|
||||||
|
type: 'bar',
|
||||||
|
height: 240,
|
||||||
|
stacked: true,
|
||||||
|
},
|
||||||
|
plotOptions: {
|
||||||
|
bar: {
|
||||||
|
horizontal: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
stroke: {
|
||||||
|
width: 1,
|
||||||
|
colors: ['#fff'],
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
xaxis: {
|
||||||
|
categories: @json($komoditas->pluck('nama')),
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
y: {
|
||||||
|
formatter: function (val) {
|
||||||
|
return val + ' petani'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
fill: {
|
||||||
|
opacity: 1,
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
position: 'top',
|
||||||
|
horizontalAlign: 'left',
|
||||||
|
offsetX: 40,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
// Chart Segmentasi Petani By Komoditas
|
||||||
|
var chartSegmentasiPetaniByKomoditas = new ApexCharts(document.querySelector('#chart-segmentasi-petani-komoditas'), optionsSegmentasiPetaniByKomoditas)
|
||||||
|
chartSegmentasiPetaniByKomoditas.render()
|
||||||
|
|
||||||
|
// Chart Dimensi dan Komponen Kesiapan Adopsi
|
||||||
|
let cardColor, labelColor, fontFamily, headingColor, shadeColor, legendColor, borderColor, barBgColor;
|
||||||
|
if (isDarkStyle) {
|
||||||
|
barBgColor = '#3d4157';
|
||||||
|
shadeColor = 'dark';
|
||||||
|
} else {
|
||||||
|
barBgColor = '#efeef0';
|
||||||
|
shadeColor = '';
|
||||||
|
}
|
||||||
|
cardColor = config.colors.cardColor;
|
||||||
|
labelColor = config.colors.textMuted;
|
||||||
|
legendColor = config.colors.bodyColor;
|
||||||
|
borderColor = config.colors.borderColor;
|
||||||
|
headingColor = config.colors.headingColor;
|
||||||
|
|
||||||
|
var radarDimensi = new ApexCharts($("#chart-dimensi")[0],
|
||||||
|
options = {
|
||||||
|
chart: {
|
||||||
|
height: 240,
|
||||||
|
type: 'radar',
|
||||||
|
toolbar: {
|
||||||
|
show: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: "Rata-rata Dimensi Kesiapan Adopsi",
|
||||||
|
data: [{{ round($avgDimensi->skor_d2_sistem_praktik_budidaya, 2) }},
|
||||||
|
{{ round($avgDimensi->skor_d4_sosial_ekonomi, 2) }},
|
||||||
|
{{ round($avgDimensi->skor_d6_rantai_nilai_akses_pasar, 2) }}]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
labels: ['Sistem & Praktik Budidaya', 'Sosial Ekonomi Rumah Tangga', 'Rantai Nilai & Akses Pasar'],
|
||||||
|
plotOptions: {
|
||||||
|
radar: {
|
||||||
|
polygons: {
|
||||||
|
strokeColors: borderColor,
|
||||||
|
connectorColors: borderColor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
stroke: {
|
||||||
|
width: 2
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
show: true,
|
||||||
|
fontSize: '13px',
|
||||||
|
position: 'bottom',
|
||||||
|
labels: {
|
||||||
|
colors: legendColor,
|
||||||
|
useSeriesColors: false
|
||||||
|
},
|
||||||
|
markers: {
|
||||||
|
height: 12,
|
||||||
|
width: 12
|
||||||
|
},
|
||||||
|
itemMargin: {
|
||||||
|
horizontal: 10
|
||||||
|
},
|
||||||
|
onItemHover: {
|
||||||
|
highlightDataSeries: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
colors: [config.colors.primary, config.colors.info],
|
||||||
|
fill: {
|
||||||
|
opacity: 0.85
|
||||||
|
},
|
||||||
|
markers: {
|
||||||
|
show: true,
|
||||||
|
width: 1,
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
show: false,
|
||||||
|
padding: {
|
||||||
|
top: -25,
|
||||||
|
bottom: -5
|
||||||
|
}
|
||||||
|
},
|
||||||
|
xaxis: {
|
||||||
|
categories: ['D1', 'D2', 'D3'],
|
||||||
|
labels: {
|
||||||
|
show: true,
|
||||||
|
style: {
|
||||||
|
colors: [labelColor, labelColor, labelColor, labelColor, labelColor, labelColor],
|
||||||
|
fontSize: '13px',
|
||||||
|
fontFamily: fontFamily
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
yaxis: {
|
||||||
|
show: true,
|
||||||
|
min: 0,
|
||||||
|
max: 5,
|
||||||
|
tickAmount: 5
|
||||||
|
},
|
||||||
|
responsive: [
|
||||||
|
{
|
||||||
|
breakpoint: 769,
|
||||||
|
options: {
|
||||||
|
chart: {
|
||||||
|
height: 400
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
radarDimensi.render();
|
||||||
|
|
||||||
|
var radarKomponen = new ApexCharts($("#chart-komponen")[0],
|
||||||
|
options = {
|
||||||
|
chart: {
|
||||||
|
height: 240,
|
||||||
|
type: 'radar',
|
||||||
|
toolbar: {
|
||||||
|
show: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: "Rata-rata Komponen Kesiapan Adopsi",
|
||||||
|
data: [
|
||||||
|
{{ round($avgKomponen->skor_komp_1_d4_k3_motivasi_kapasitas_adopsi, 2) }},
|
||||||
|
{{ round($avgKomponen->skor_komp_2_d4_k2_ekonomi_rumah_tangga, 2) }},
|
||||||
|
{{ round($avgKomponen->skor_komp_3_d2_praktik_budidaya_gap, 2) }},
|
||||||
|
{{ round($avgKomponen->skor_komp_4_d4_k4_keterlibatan_kelembagaan, 2) }},
|
||||||
|
{{ round($avgKomponen->skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan, 2) }},
|
||||||
|
{{ round($avgKomponen->skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar, 2) }}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
lotOptions: {
|
||||||
|
radar: {
|
||||||
|
polygons: {
|
||||||
|
strokeColors: borderColor,
|
||||||
|
connectorColors: borderColor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
stroke: {
|
||||||
|
width: 2
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
show: true,
|
||||||
|
fontSize: '13px',
|
||||||
|
position: 'bottom',
|
||||||
|
labels: {
|
||||||
|
colors: legendColor,
|
||||||
|
useSeriesColors: false
|
||||||
|
},
|
||||||
|
markers: {
|
||||||
|
height: 12,
|
||||||
|
width: 12
|
||||||
|
},
|
||||||
|
itemMargin: {
|
||||||
|
horizontal: 10
|
||||||
|
},
|
||||||
|
onItemHover: {
|
||||||
|
highlightDataSeries: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
colors: [config.colors.primary, config.colors.info],
|
||||||
|
fill: {
|
||||||
|
opacity: 0.85
|
||||||
|
},
|
||||||
|
markers: {
|
||||||
|
show: true,
|
||||||
|
width: 1,
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
show: false,
|
||||||
|
padding: {
|
||||||
|
top: -25,
|
||||||
|
bottom: -5
|
||||||
|
}
|
||||||
|
},
|
||||||
|
xaxis: {
|
||||||
|
categories: ['K1', 'K2', 'K3', 'K4', 'K5', 'K6'],
|
||||||
|
labels: {
|
||||||
|
show: true,
|
||||||
|
style: {
|
||||||
|
colors: [labelColor, labelColor, labelColor, labelColor, labelColor, labelColor],
|
||||||
|
fontSize: '13px',
|
||||||
|
fontFamily: fontFamily
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
yaxis: {
|
||||||
|
show: true,
|
||||||
|
min: 0,
|
||||||
|
max: 5,
|
||||||
|
tickAmount: 5
|
||||||
|
},
|
||||||
|
responsive: [
|
||||||
|
{
|
||||||
|
breakpoint: 769,
|
||||||
|
options: {
|
||||||
|
chart: {
|
||||||
|
height: 400
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
radarKomponen.render();
|
||||||
|
|
||||||
|
// Map Sebaran Petani
|
||||||
|
var map = L.map('map-sebaran-petani').setView([-0.789, 113.921], 5);
|
||||||
|
L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
|
||||||
|
maxZoom: 19,
|
||||||
|
attribution: '© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
|
||||||
|
}).addTo(map);
|
||||||
|
|
||||||
|
const desaData = @json($mapDesaSegmentasi);
|
||||||
|
const warnaSegmen = {
|
||||||
|
@foreach($segments as $segment)
|
||||||
|
"{{ $segment['name'] }}": "var(--bs-{{ $segment['color'] }})",
|
||||||
|
@endforeach
|
||||||
|
};
|
||||||
|
const group = L.featureGroup().addTo(map);
|
||||||
|
desaData.forEach(desa => {
|
||||||
|
if (!desa.path) return;
|
||||||
|
|
||||||
|
const coordinates = JSON.parse(desa.path);
|
||||||
|
|
||||||
|
const polygon = L.polygon(coordinates, {
|
||||||
|
color: '#666',
|
||||||
|
weight: 1,
|
||||||
|
fillColor: warnaSegmen[desa.segmentasi.segmen] || '#ccc',
|
||||||
|
fillOpacity: 0.7
|
||||||
|
});
|
||||||
|
|
||||||
|
polygon.desaId = desa.desa_kelurahan_id;
|
||||||
|
polygon.bindPopup(`
|
||||||
|
<b>Desa/Kel.: ${desa.desa_kelurahan}</b><br>
|
||||||
|
Kec.: ${desa.kecamatan}<br>
|
||||||
|
Kab.: ${desa.kabupaten}<br>
|
||||||
|
<hr>
|
||||||
|
Petani: ${desa.segmentasi.jumlah_petani}<br>
|
||||||
|
Indeks: ${Number(desa.segmentasi.skor).toFixed(2)}<br>
|
||||||
|
Segmen: <b>${desa.segmentasi.segmen}</b><br>
|
||||||
|
Segmen Dominan: <b>${desa.segmentasi.segmen_dominan}</b> (${desa.segmentasi.jumlah_dominan} petani)
|
||||||
|
`);
|
||||||
|
polygon.on('click', function () {
|
||||||
|
selectedDesa = desa.desa_kelurahan_id;
|
||||||
|
tablePetani.draw();
|
||||||
|
});
|
||||||
|
|
||||||
|
polygon.addTo(group);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (group.getLayers().length > 0) {
|
||||||
|
map.fitBounds(group.getBounds(), {
|
||||||
|
padding: [20, 20]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
@endpush
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,35 @@
|
|||||||
@extends('layout.main')
|
@extends('layout.main')
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
|
@php
|
||||||
|
$totalPetani = $petaniSummary->sum('total');
|
||||||
|
$segments = [
|
||||||
|
[
|
||||||
|
'name' => 'Penggerak',
|
||||||
|
'range' => '4.0 - 5.0',
|
||||||
|
'icon' => 'tabler-crown',
|
||||||
|
'color' => 'success',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'Perintis',
|
||||||
|
'range' => '3.0 - 3.9',
|
||||||
|
'icon' => 'tabler-flag',
|
||||||
|
'color' => 'info',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'Pemerhati',
|
||||||
|
'range' => '2.0 - 2.9',
|
||||||
|
'icon' => 'tabler-eye',
|
||||||
|
'color' => 'warning',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'Pemula',
|
||||||
|
'range' => '1.0 - 1.9',
|
||||||
|
'icon' => 'tabler-seedling',
|
||||||
|
'color' => 'danger',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
@endphp
|
||||||
<div class="container-xxl flex-grow-1 container-p-y">
|
<div class="container-xxl flex-grow-1 container-p-y">
|
||||||
<div class="row g-6">
|
<div class="row g-6">
|
||||||
<div class="col-lg-3 col-sm-6">
|
<div class="col-lg-3 col-sm-6">
|
||||||
@@ -12,9 +41,9 @@
|
|||||||
<i class="icon-base ti tabler-user-check icon-28px"></i>
|
<i class="icon-base ti tabler-user-check icon-28px"></i>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<h4 class="mb-0">{{ $petaniSummary->sum('total') }}</h4>
|
<h4 class="mb-0">{{ $totalPetani }}</h4>
|
||||||
</div>
|
</div>
|
||||||
<p class="mb-1">Petani</p>
|
<p class="mb-1">Total Petani</p>
|
||||||
<p class="mb-0">
|
<p class="mb-0">
|
||||||
<span class="text-heading fw-medium me-2">{{ $petaniSummary->count('total') }}</span>
|
<span class="text-heading fw-medium me-2">{{ $petaniSummary->count('total') }}</span>
|
||||||
<small class="text-body-secondary">komoditas utama</small>
|
<small class="text-body-secondary">komoditas utama</small>
|
||||||
@@ -41,29 +70,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- <div class="col-lg-6 col-sm-12">
|
|
||||||
<div class="card card-border-shadow-danger h-100">
|
|
||||||
<div class="card-body">
|
|
||||||
<div class="d-flex align-items-center mb-2">
|
|
||||||
<div class="avatar me-4">
|
|
||||||
<span class="avatar-initial rounded bg-label-danger">
|
|
||||||
<i class="icon-base ti tabler-seedling icon-28px"></i>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<h4 class="mb-0">{{ $tanamanSummary->sum('total') }}</h4>
|
|
||||||
</div>
|
|
||||||
<p class="mb-1">Tanaman Komoditas Utama</p>
|
|
||||||
<div class="d-flex justify-content-between mb-2">
|
|
||||||
@foreach($komoditas as $k)
|
|
||||||
<p class="mb-0">
|
|
||||||
<span class="text-heading fw-medium me-2">{{ $tanamanSummary->where('komoditas_id', $k->id)->sum('total') }}</span>
|
|
||||||
<small class="text-body-danger">tanaman {{ $k->nama }}</small>
|
|
||||||
</p>
|
|
||||||
@endforeach
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div> -->
|
|
||||||
<div class="col-lg-3 col-sm-6">
|
<div class="col-lg-3 col-sm-6">
|
||||||
<div class="card card-border-shadow-info h-100">
|
<div class="card card-border-shadow-info h-100">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
@@ -78,7 +84,6 @@
|
|||||||
<p class="mb-1">Rata-rata Indeks Kesiapan Adopsi</p>
|
<p class="mb-1">Rata-rata Indeks Kesiapan Adopsi</p>
|
||||||
<p class="mb-0">
|
<p class="mb-0">
|
||||||
<span class="text-heading fw-medium me-2">{{ $segmenAverage }}</span>
|
<span class="text-heading fw-medium me-2">{{ $segmenAverage }}</span>
|
||||||
<small class="text-body-info">komoditas utama</small>
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -95,146 +100,92 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<table class="table card-table table-border-top-0 table-border-bottom-0">
|
<table class="table card-table table-border-top-0 table-border-bottom-0 data-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th></th>
|
||||||
|
<th class="text-end pe-0">Petani</th>
|
||||||
|
<th class="text-end pe-0">%</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
|
|
||||||
|
@foreach ($segments as $segment)
|
||||||
|
@php
|
||||||
|
$total = $skorSummary->where('segmen', $segment['name'])->sum('total');
|
||||||
|
$persen = $totalPetani ? ($total / $totalPetani) * 100 : 0;
|
||||||
|
@endphp
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<td class="w-60 ps-0"></td>
|
<td>
|
||||||
<td class="text-end pe-0">Petani</td>
|
|
||||||
<td class="text-end pe-0">%</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td class="w-60 ps-0">
|
|
||||||
<div class="d-flex justify-content-start align-items-center">
|
<div class="d-flex justify-content-start align-items-center">
|
||||||
<div class="me-2">
|
<div class="me-2">
|
||||||
<i class="icon-base ti tabler-crown icon-lg text-heading"></i>
|
<i class="icon-base ti {{ $segment['icon'] }} icon-lg text-{{ $segment['color'] }}"></i>
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h6 class="mb-0 fw-normal text-success">Penggerak (4.0 - 5.0)</h6>
|
|
||||||
<!-- <small class="text-body-secondary text-wrap">Siap menjadi peserta agrolab utama dan panutan bagi petani lain</small> -->
|
|
||||||
</div>
|
</div>
|
||||||
|
<span class="text-{{ $segment['color'] }}">
|
||||||
|
{{ $segment['name'] }}
|
||||||
|
<small class="text-body-secondary">({{ $segment['range'] }})</small>
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td class="text-end pe-0">
|
<td class="text-end pe-0">{{ number_format($total) }}</td>
|
||||||
<span>{{ $skorSummary->where('segmen', 'Penggerak')->sum('total') }} petani</span>
|
<td class="text-end pe-0">{{ number_format($persen, 2) }}%</td>
|
||||||
</td>
|
|
||||||
<td class="text-end pe-0">
|
|
||||||
<span>{{ number_format(($skorSummary->where('segmen', 'Penggerak')->sum('total') / $petaniSummary->sum('total')) * 100, 2) }}%</span>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td class="w-60 ps-0">
|
|
||||||
<div class="d-flex justify-content-start align-items-center">
|
|
||||||
<div class="me-2">
|
|
||||||
<i class="icon-base ti tabler-flag icon-lg text-heading"></i>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h6 class="mb-0 fw-normal text-info">Perintis (3.0 - 3.9)</h6>
|
|
||||||
<!-- <small class="text-body-secondary text-wrap">Berpotensi berkembang menjadi Penggerak dengan dukungan yang tepat</small> -->
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
<td class="text-end pe-0">
|
|
||||||
<span>{{ $skorSummary->where('segmen', 'Perintis')->sum('total') }} petani</span>
|
|
||||||
</td>
|
|
||||||
<td class="text-end pe-0">
|
|
||||||
<span>{{ number_format(($skorSummary->where('segmen', 'Perintis')->sum('total') / $petaniSummary->sum('total')) * 100, 2) }}%</span>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td class="w-60 ps-0">
|
|
||||||
<div class="d-flex justify-content-start align-items-center">
|
|
||||||
<div class="me-2">
|
|
||||||
<i class="icon-base ti tabler-eye icon-lg text-heading text-success"></i>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h6 class="mb-0 fw-normal text-warning">Pemerhati (2.0 - 2.9)</h6>
|
|
||||||
<!-- <small class="text-body-secondary text-wrap">Perlu melihat bukti hasil nyata dari Penggerak sebelum mau bergerak</small> -->
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
<td class="text-end pe-0">
|
|
||||||
<span>{{ $skorSummary->where('segmen', 'Pemerhati')->sum('total') }} petani</span>
|
|
||||||
</td>
|
|
||||||
<td class="text-end pe-0">
|
|
||||||
<span>{{ number_format(($skorSummary->where('segmen', 'Pemerhati')->sum('total') / $petaniSummary->sum('total')) * 100, 2) }}%</span>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td class="w-60 ps-0">
|
|
||||||
<div class="d-flex justify-content-start align-items-center">
|
|
||||||
<div class="me-2">
|
|
||||||
<i class="icon-base ti tabler-seedling icon-lg text-heading"></i>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h6 class="mb-0 fw-normal text-danger">Pemula (1.0 - 1.9)</h6>
|
|
||||||
<!-- <small class="text-body-secondary text-wrap">Butuh penanganan hambatan dasar terlebih dahulu sebelum intervensi langsung</small> -->
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
<td class="text-end pe-0">
|
|
||||||
<span>{{ $skorSummary->where('segmen', 'Pemula')->sum('total') }} petani</span>
|
|
||||||
</td>
|
|
||||||
<td class="text-end pe-0">
|
|
||||||
<span>{{ number_format(($skorSummary->where('segmen', 'Pemula')->sum('total') / $petaniSummary->sum('total')) * 100, 2) }}%</span>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- <div class="col-lg-6 col-sm-12">
|
|
||||||
<div class="card h-100">
|
|
||||||
<div class="card-header d-flex justify-content-between align-items-center">
|
|
||||||
<div class="card-title mb-0">
|
|
||||||
<h5 class="m-0 me-2">Segmentasi Petani Komoditas</h5>
|
|
||||||
<p class="card-subtitle">berdasarkan mayoritas segmentasi</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="card-body">
|
|
||||||
<table class="table card-table table-border-top-0 table-border-bottom-0">
|
|
||||||
<tbody>
|
|
||||||
@foreach ($komoditas as $k)
|
|
||||||
<?php
|
|
||||||
$max = $skorKomoditasSummary->where('komoditas_id', $k->id)
|
|
||||||
->whereIn('segmen', ['Penggerak', 'Perintis', 'Pemerhati', 'Pemula'])
|
|
||||||
->sortByDesc('total')
|
|
||||||
->first();
|
|
||||||
?>
|
|
||||||
<tr>
|
|
||||||
<td class="w-40 ps-0">
|
|
||||||
<h6 class="mb-0 fw-normal text-heading">{{ $k->nama }}</h6>
|
|
||||||
</td>
|
|
||||||
<td class="pe-0">
|
|
||||||
@if(isset($max))
|
|
||||||
@if($max->segmen == 'Penggerak')
|
|
||||||
<span class="text-success">Petani Penggerak</span>
|
|
||||||
@elseif($max->segmen == 'Perintis')
|
|
||||||
<span class="text-info">Petani Perintis</span>
|
|
||||||
@elseif($max->segmen == 'Pemerhati')
|
|
||||||
<span class="text-warning">Petani Pemerhati</span>
|
|
||||||
@elseif($max->segmen == 'Pemula')
|
|
||||||
<span class="text-danger">Petani Pemula</span>
|
|
||||||
@else
|
|
||||||
<span>Belum Lengkap</span>
|
|
||||||
@endif
|
|
||||||
@else
|
|
||||||
<span>Belum Tersegmentasi</span>
|
|
||||||
@endif
|
|
||||||
</td>
|
|
||||||
<td class="text-end pe-0">
|
|
||||||
<span>{{ isset($max) ? $max->total : 0 }} Petani</span>
|
|
||||||
</td>
|
|
||||||
<td class="text-end pe-0">
|
|
||||||
<span>{{ isset($max) ? number_format(($max->total / $petaniSummary->sum('total')) * 100, 2) : 0 }}%</span>
|
|
||||||
</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
@endforeach
|
@endforeach
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div> -->
|
</div>
|
||||||
|
<div class="col-lg-6 col-sm-12">
|
||||||
|
<div class="card h-100">
|
||||||
|
<div class="card-header d-flex justify-content-between align-items-center">
|
||||||
|
<div class="card-title mb-0">
|
||||||
|
<h5 class="m-0 me-2">Segmentasi Petani</h5>
|
||||||
|
<p class="card-subtitle">per komoditas</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<table class="table card-table table-border-top-0 table-border-bottom-0 data-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th></th>
|
||||||
|
@foreach ($komoditas as $k)
|
||||||
|
<th class="text-end pe-0">{{ $k->nama }}</th>
|
||||||
|
@endforeach
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
|
||||||
|
@foreach ($segments as $segment)
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<div class="d-flex justify-content-start align-items-center">
|
||||||
|
<div class="me-2">
|
||||||
|
<i class="icon-base ti {{ $segment['icon'] }} icon-lg text-{{ $segment['color'] }}"></i>
|
||||||
|
</div>
|
||||||
|
<span class="text-{{ $segment['color'] }}">
|
||||||
|
{{ $segment['name'] }}
|
||||||
|
<small class="text-body-secondary">({{ $segment['range'] }})</small>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
@foreach ($komoditas as $k)
|
||||||
|
@php
|
||||||
|
$jumlah = $skorKomoditasSummary->where('segmen', $segment['name'])->where('komoditas_id', $k->id)->sum('total');
|
||||||
|
@endphp
|
||||||
|
<td class="text-end pe-0">{{ number_format($jumlah) }}</td>
|
||||||
|
@endforeach
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row g-6 py-4">
|
||||||
<div class="col-lg-6 col-sm-12">
|
<div class="col-lg-6 col-sm-12">
|
||||||
<div class="card h-100">
|
<div class="card h-100">
|
||||||
<div class="card-header d-flex justify-content-between align-items-center">
|
<div class="card-header d-flex justify-content-between align-items-center">
|
||||||
@@ -244,115 +195,124 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<table class="table card-table table-border-top-0 table-border-bottom-0">
|
<table class="table card-table table-border-top-0 table-border-bottom-0 data-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th></th>
|
||||||
|
<th class="text-end pe-0">Indeks</th>
|
||||||
|
<th class="text-end pe-0">D1</th>
|
||||||
|
<th class="text-end pe-0">D2</th>
|
||||||
|
<th class="text-end pe-0">D3</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
|
|
||||||
|
|
||||||
|
@foreach ($segments as $segment)
|
||||||
|
@php
|
||||||
|
$skor = $skorMultiDimensi->firstWhere('segmen', $segment['name']);
|
||||||
|
@endphp
|
||||||
<tr>
|
<tr>
|
||||||
<td class="w-60 ps-0"></td>
|
<td>
|
||||||
<td class="text-end pe-0">Indeks</td>
|
|
||||||
<td class="text-end pe-0">D1</td>
|
|
||||||
<td class="text-end pe-0">D2</td>
|
|
||||||
<td class="text-end pe-0">D3</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td class="w-60 ps-0">
|
|
||||||
<div class="d-flex justify-content-start align-items-center">
|
<div class="d-flex justify-content-start align-items-center">
|
||||||
<div class="me-2">
|
<div class="me-2">
|
||||||
<i class="icon-base ti tabler-crown icon-lg text-heading"></i>
|
<i class="icon-base ti {{ $segment['icon'] }} icon-lg text-{{ $segment['color'] }}"></i>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h6 class="mb-0 fw-normal text-success">Penggerak (4.0 - 5.0)</h6>
|
<h6 class="mb-0 fw-normal text-{{ $segment['color'] }}">
|
||||||
<!-- <small class="text-body-secondary text-wrap">Siap menjadi peserta agrolab utama dan panutan bagi petani lain</small> -->
|
{{ $segment['name'] }}
|
||||||
|
<small class="text-body-secondary">({{ $segment['range'] }})</small>
|
||||||
|
</h6>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td class="text-end pe-0">
|
<td class="text-end pe-0">
|
||||||
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Penggerak')->value('skor_kesiapan_adopsi'), 2, '.', ',') }}</span>
|
{{ number_format($skor?->skor_kesiapan_adopsi ?? 0, 2, '.', ',') }}
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
<td class="text-end pe-0">
|
<td class="text-end pe-0">
|
||||||
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Penggerak')->value('skor_d2_sistem_praktik_budidaya'), 2, '.', ',') }}</span>
|
{{ number_format($skor?->skor_d2_sistem_praktik_budidaya ?? 0, 2, '.', ',') }}
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
<td class="text-end pe-0">
|
<td class="text-end pe-0">
|
||||||
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Penggerak')->value('skor_d4_sosial_ekonomi'), 2, '.', ',') }}</span>
|
{{ number_format($skor?->skor_d4_sosial_ekonomi ?? 0, 2, '.', ',') }}
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
<td class="text-end pe-0">
|
<td class="text-end pe-0">
|
||||||
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Penggerak')->value('skor_d6_rantai_nilai_akses_pasar'), 2, '.', ',') }}</span>
|
{{ number_format($skor?->skor_d6_rantai_nilai_akses_pasar ?? 0, 2, '.', ',') }}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-6 col-sm-12">
|
||||||
|
<div class="card h-100">
|
||||||
|
<div class="card-header d-flex justify-content-between align-items-center">
|
||||||
|
<div class="card-title mb-0">
|
||||||
|
<h5 class="m-0 me-2">Segmentasi Multi Komponen Petani</h5>
|
||||||
|
<p class="card-subtitle">untuk semua komoditas</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<table class="table card-table table-border-top-0 table-border-bottom-0 data-table">
|
||||||
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="w-60 ps-0">
|
<th></th>
|
||||||
|
<th class="text-end pe-0">Indeks</th>
|
||||||
|
<th class="text-end pe-0">K1</th>
|
||||||
|
<th class="text-end pe-0">K2</th>
|
||||||
|
<th class="text-end pe-0">K3</th>
|
||||||
|
<th class="text-end pe-0">K4</th>
|
||||||
|
<th class="text-end pe-0">K5</th>
|
||||||
|
<th class="text-end pe-0">K6</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
|
||||||
|
@foreach ($segments as $segment)
|
||||||
|
@php
|
||||||
|
$skor = $skorMultiKomponen->firstWhere('segmen', $segment['name']);
|
||||||
|
@endphp
|
||||||
|
<tr>
|
||||||
|
<td class="">
|
||||||
<div class="d-flex justify-content-start align-items-center">
|
<div class="d-flex justify-content-start align-items-center">
|
||||||
<div class="me-2">
|
<div class="me-2">
|
||||||
<i class="icon-base ti tabler-flag icon-lg text-heading"></i>
|
<i class="icon-base ti {{ $segment['icon'] }} icon-lg text-{{ $segment['color'] }}"></i>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h6 class="mb-0 fw-normal text-info">Perintis (3.0 - 3.9)</h6>
|
<h6 class="mb-0 fw-normal text-{{ $segment['color'] }}">
|
||||||
<!-- <small class="text-body-secondary text-wrap">Berpotensi berkembang menjadi Penggerak dengan dukungan yang tepat</small> -->
|
{{ $segment['name'] }}
|
||||||
|
<small class="text-body-secondary">({{ $segment['range'] }})</small>
|
||||||
|
</h6>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td class="text-end pe-0">
|
<td class="text-end pe-0">
|
||||||
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Perintis')->value('skor_kesiapan_adopsi'), 2, '.', ',') }}</span>
|
<span>{{ number_format($skor?->skor_kesiapan_adopsi, 2, '.', ',') }}</span>
|
||||||
</td>
|
</td>
|
||||||
<td class="text-end pe-0">
|
<td class="text-end pe-0">
|
||||||
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Perintis')->value('skor_d2_sistem_praktik_budidaya'), 2, '.', ',') }}</span>
|
<span>{{ number_format($skor?->skor_komp_1_d4_k3_motivasi_kapasitas_adopsi, 2, '.', ',') }}</span>
|
||||||
</td>
|
</td>
|
||||||
<td class="text-end pe-0">
|
<td class="text-end pe-0">
|
||||||
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Perintis')->value('skor_d4_sosial_ekonomi'), 2, '.', ',') }}</span>
|
<span>{{ number_format($skor?->skor_komp_2_d4_k2_ekonomi_rumah_tangga, 2, '.', ',') }}</span>
|
||||||
</td>
|
</td>
|
||||||
<td class="text-end pe-0">
|
<td class="text-end pe-0">
|
||||||
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Perintis')->value('skor_d6_rantai_nilai_akses_pasar'), 2, '.', ',') }}</span>
|
<span>{{ number_format($skor?->skor_komp_3_d2_praktik_budidaya_gap, 2, '.', ',') }}</span>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td class="w-60 ps-0">
|
|
||||||
<div class="d-flex justify-content-start align-items-center">
|
|
||||||
<div class="me-2">
|
|
||||||
<i class="icon-base ti tabler-eye icon-lg text-heading text-success"></i>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h6 class="mb-0 fw-normal text-warning">Pemerhati (2.0 - 2.9)</h6>
|
|
||||||
<!-- <small class="text-body-secondary text-wrap">Perlu melihat bukti hasil nyata dari Penggerak sebelum mau bergerak</small> -->
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
<td class="text-end pe-0">
|
|
||||||
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Pemerhati')->value('skor_kesiapan_adopsi'), 2, '.', ',') }}</span>
|
|
||||||
</td>
|
|
||||||
<td class="text-end pe-0">
|
|
||||||
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Pemerhati')->value('skor_d2_sistem_praktik_budidaya'), 2, '.', ',') }}</span>
|
|
||||||
</td>
|
|
||||||
<td class="text-end pe-0">
|
|
||||||
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Pemerhati')->value('skor_d4_sosial_ekonomi'), 2, '.', ',') }}</span>
|
|
||||||
</td>
|
|
||||||
<td class="text-end pe-0">
|
|
||||||
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Pemerhati')->value('skor_d6_rantai_nilai_akses_pasar'), 2, '.', ',') }}</span>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td class="w-60 ps-0">
|
|
||||||
<div class="d-flex justify-content-start align-items-center">
|
|
||||||
<div class="me-2">
|
|
||||||
<i class="icon-base ti tabler-seedling icon-lg text-heading"></i>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h6 class="mb-0 fw-normal text-danger">Pemula (1.0 - 1.9)</h6>
|
|
||||||
<!-- <small class="text-body-secondary text-wrap">Butuh penanganan hambatan dasar terlebih dahulu sebelum intervensi langsung</small> -->
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
<td class="text-end pe-0">
|
|
||||||
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Pemula')->value('skor_kesiapan_adopsi'), 2, '.', ',') }}</span>
|
|
||||||
</td>
|
|
||||||
<td class="text-end pe-0">
|
<td class="text-end pe-0">
|
||||||
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Pemula')->value('skor_d2_sistem_praktik_budidaya'), 2, '.', ',') }}</span>
|
<span>{{ number_format($skor?->skor_komp_4_d4_k4_keterlibatan_kelembagaan, 2, '.', ',') }}</span>
|
||||||
</td>
|
</td>
|
||||||
<td class="text-end pe-0">
|
<td class="text-end pe-0">
|
||||||
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Pemula')->value('skor_d4_sosial_ekonomi'), 2, '.', ',') }}</span>
|
<span>{{ number_format($skor?->skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan, 2, '.', ',') }}</span>
|
||||||
</td>
|
</td>
|
||||||
<td class="text-end pe-0">
|
<td class="text-end pe-0">
|
||||||
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Pemula')->value('skor_d6_rantai_nilai_akses_pasar'), 2, '.', ',') }}</span>
|
<span>{{ number_format($skor?->skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar, 2, '.', ',') }}</span>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
@endforeach
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
@@ -443,6 +403,13 @@
|
|||||||
<th>D2</th>
|
<th>D2</th>
|
||||||
<th>D4</th>
|
<th>D4</th>
|
||||||
<th>D6</th>
|
<th>D6</th>
|
||||||
|
<th>K1</th>
|
||||||
|
<th>K2</th>
|
||||||
|
<th>K3</th>
|
||||||
|
<th>K4</th>
|
||||||
|
<th>K5</th>
|
||||||
|
<th>K6</th>
|
||||||
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@foreach ($petani as $item)
|
@foreach ($petani as $item)
|
||||||
@@ -466,6 +433,12 @@
|
|||||||
<td>{{ number_format($item->skor?->skor_d2_sistem_praktik_budidaya, 2, '.', ',') }}</td>
|
<td>{{ number_format($item->skor?->skor_d2_sistem_praktik_budidaya, 2, '.', ',') }}</td>
|
||||||
<td>{{ number_format($item->skor?->skor_d4_sosial_ekonomi, 2, '.', ',') }}</td>
|
<td>{{ number_format($item->skor?->skor_d4_sosial_ekonomi, 2, '.', ',') }}</td>
|
||||||
<td>{{ number_format($item->skor?->skor_d6_rantai_nilai_akses_pasar, 2, '.', ',') }}</td>
|
<td>{{ number_format($item->skor?->skor_d6_rantai_nilai_akses_pasar, 2, '.', ',') }}</td>
|
||||||
|
<td>{{ number_format($item->skor?->skor_komp_1_d4_k3_motivasi_kapasitas_adopsi, 2, '.', ',') }}</td>
|
||||||
|
<td>{{ number_format($item->skor?->skor_komp_2_d4_k2_ekonomi_rumah_tangga, 2, '.', ',') }}</td>
|
||||||
|
<td>{{ number_format($item->skor?->skor_komp_3_d2_praktik_budidaya_gap, 2, '.', ',') }}</td>
|
||||||
|
<td>{{ number_format($item->skor?->skor_komp_4_d4_k4_keterlibatan_kelembagaan, 2, '.', ',') }}</td>
|
||||||
|
<td>{{ number_format($item->skor?->skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan, 2, '.', ',') }}</td>
|
||||||
|
<td>{{ number_format($item->skor?->skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar, 2, '.', ',') }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
@endforeach
|
@endforeach
|
||||||
</tbody>
|
</tbody>
|
||||||
@@ -484,6 +457,17 @@
|
|||||||
<script>
|
<script>
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
|
|
||||||
|
$('.data-table').DataTable({
|
||||||
|
"paging": false,
|
||||||
|
"lengthChange": true,
|
||||||
|
"searching": false,
|
||||||
|
"ordering": false,
|
||||||
|
"info": false,
|
||||||
|
"autoWidth": false,
|
||||||
|
"responsive": false,
|
||||||
|
"scrollX": true
|
||||||
|
});
|
||||||
|
|
||||||
$("#tabel-petani").DataTable({
|
$("#tabel-petani").DataTable({
|
||||||
"paging": true,
|
"paging": true,
|
||||||
"lengthChange": true,
|
"lengthChange": true,
|
||||||
@@ -491,7 +475,8 @@
|
|||||||
"ordering": false,
|
"ordering": false,
|
||||||
"info": true,
|
"info": true,
|
||||||
"autoWidth": false,
|
"autoWidth": false,
|
||||||
"responsive": true,
|
"responsive": false,
|
||||||
|
"scrollX": true
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -68,6 +68,23 @@
|
|||||||
</ul>
|
</ul>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
|
@if(in_array($userRole, ['super_admin', 'admin']) && env('APP_NAME') == 'AgroMonev')
|
||||||
|
<ul class="menu-sub">
|
||||||
|
<li class="menu-item {{ request()->routeIs('dashboard.demografi-petani') ? 'active' : '' }}">
|
||||||
|
<a href="{{ route('dashboard.demografi-petani') }}" class="menu-link">
|
||||||
|
<div data-i18n="Demografi Petani">Demografi Petani</div>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<ul class="menu-sub">
|
||||||
|
<li class="menu-item {{ request()->routeIs('dashboard.indikator-pertanian') ? 'active' : '' }}">
|
||||||
|
<a href="{{ route('dashboard.indikator-pertanian') }}" class="menu-link">
|
||||||
|
<div data-i18n="Indikator Pertanian">Indikator Pertanian</div>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
@endif
|
||||||
|
|
||||||
@if(in_array($userRole, ['super_admin', 'admin', 'fasilitator']) && env('APP_NAME') == 'AgroMonev')
|
@if(in_array($userRole, ['super_admin', 'admin', 'fasilitator']) && env('APP_NAME') == 'AgroMonev')
|
||||||
<ul class="menu-sub">
|
<ul class="menu-sub">
|
||||||
<li class="menu-item {{ request()->routeIs('dashboard.survey-petani') ? 'active' : '' }}">
|
<li class="menu-item {{ request()->routeIs('dashboard.survey-petani') ? 'active' : '' }}">
|
||||||
@@ -84,6 +101,15 @@
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
@endif
|
@endif
|
||||||
|
@if(in_array($userRole, ['super_admin', 'admin']) && env('APP_NAME') == 'AgroMonev')
|
||||||
|
<ul class="menu-sub">
|
||||||
|
<li class="menu-item {{ request()->routeIs('dashboard.bumdes') ? 'active' : '' }}">
|
||||||
|
<a href="{{ route('dashboard.bumdes') }}" class="menu-link">
|
||||||
|
<div data-i18n="Profil Pengurus BUMDes">Profil Pengurus BUMDes</div>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
@endif
|
||||||
</li>
|
</li>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
@@ -98,6 +124,17 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
@endif
|
@endif
|
||||||
|
@if(in_array($userRole, ['super_admin', 'admin']) && env('APP_NAME') == 'AgroMonev')
|
||||||
|
<li class="menu-header small">
|
||||||
|
<span class="menu-header-text" data-i18n="Data BUMDes">Data BUMDes</span>
|
||||||
|
</li>
|
||||||
|
<li class="menu-item {{ request()->routeIs('bumdes.*') ? 'active' : '' }}">
|
||||||
|
<a href="{{ route('bumdes.index') }}" class="menu-link">
|
||||||
|
<i class="menu-icon icon-base ti tabler-file-description"></i>
|
||||||
|
<div data-i18n="Profil Pengurus BUMDes">Profil Pengurus BUMDes</div>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
@endif
|
||||||
|
|
||||||
@if(in_array($userRole, ['super_admin', 'admin']) && env('APP_NAME') == 'AgroPro')
|
@if(in_array($userRole, ['super_admin', 'admin']) && env('APP_NAME') == 'AgroPro')
|
||||||
<!-- Ekosistem -->
|
<!-- Ekosistem -->
|
||||||
|
|||||||
@@ -207,6 +207,37 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<h5 class="pb-3 border-bottom mb-4 mt-4">KEPERCAYAAN & PERSEPSI RISIKO</h5>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6 mb-4 form-control-validation">
|
||||||
|
<label class="form-label d-block mb-2" for="tingkat-kepercayaan">Seberapa percaya Bapak/Ibu untuk menjual ke pembeli atau pasar baru, di luar pembeli yang biasa?</label>
|
||||||
|
@foreach($tingkatKepercayaanOptions as $option)
|
||||||
|
<div class="form-check mb-2">
|
||||||
|
<input class="form-check-input @error('tingkat_kepercayaan_pembeli_baru') is-invalid @enderror"
|
||||||
|
type="radio"
|
||||||
|
id="tingkat-kepercayaan-{{ $option['value'] }}"
|
||||||
|
name="tingkat_kepercayaan_pembeli_baru"
|
||||||
|
value="{{ $option['value'] }}"
|
||||||
|
{{ (string) old('tingkat_kepercayaan_pembeli_baru', $aksesPasar?->tingkat_kepercayaan_pembeli_baru) === (string) $option['value'] ? 'checked' : '' }}>
|
||||||
|
<label class="form-check-label" for="tingkat-kepercayaan-{{ $option['value'] }}">
|
||||||
|
{{ $option['label'] }}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
@endforeach
|
||||||
|
@error('tingkat_kepercayaan_pembeli_baru')<div class="invalid-feedback d-block">{{ $message }}</div>@enderror
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-6 mb-4 form-control-validation">
|
||||||
|
<label class="form-label mb-2" for="alasan-kepercayaan">Apa yang membuat Bapak/Ibu ragu atau yakin untuk mencoba pembeli baru?</label>
|
||||||
|
<textarea class="form-control @error('alasan_kepercayaan_pembeli_baru') is-invalid @enderror"
|
||||||
|
id="alasan-kepercayaan"
|
||||||
|
name="alasan_kepercayaan_pembeli_baru"
|
||||||
|
rows="4"
|
||||||
|
placeholder="Tuliskan alasannya di sini...">{{ old('alasan_kepercayaan_pembeli_baru', $aksesPasar?->alasan_kepercayaan_pembeli_baru) }}</textarea>
|
||||||
|
@error('alasan_kepercayaan_pembeli_baru')<div class="invalid-feedback">{{ $message }}</div>@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="mt-4 text-end">
|
<div class="mt-4 text-end">
|
||||||
<button type="submit" class="btn btn-success">
|
<button type="submit" class="btn btn-success">
|
||||||
<i class="icon-base ti tabler-device-floppy me-1_5 icon-sm"></i>Simpan Akses Pasar
|
<i class="icon-base ti tabler-device-floppy me-1_5 icon-sm"></i>Simpan Akses Pasar
|
||||||
|
|||||||
@@ -45,7 +45,12 @@ Route::middleware('auth')
|
|||||||
|
|
||||||
// Dashboard
|
// Dashboard
|
||||||
Route::get('/dashboard/petani', [App\Http\Controllers\Web\Dashboard\ProfilPetaniController::class, 'index'])->name('dashboard.petani');
|
Route::get('/dashboard/petani', [App\Http\Controllers\Web\Dashboard\ProfilPetaniController::class, 'index'])->name('dashboard.petani');
|
||||||
|
Route::get('/dashboard/bumdes', [App\Http\Controllers\Web\Bumdes\PengurusBumdesController::class, 'index'])->name('dashboard.bumdes');
|
||||||
|
Route::get('/dashboard/petani/demografi', [App\Http\Controllers\Web\Dashboard\DemografiPetaniController::class, 'index'])->name('dashboard.demografi-petani');
|
||||||
|
Route::get('/dashboard/petani/demografi/table',[App\Http\Controllers\Web\Dashboard\DemografiPetaniController::class, 'data'])->name('dashboard.demografi-petani.data');
|
||||||
|
Route::get('/dashboard/petani/indikator-pertanian', [App\Http\Controllers\Web\Dashboard\IndikatorPertanianController::class, 'index'])->name('dashboard.indikator-pertanian');
|
||||||
|
|
||||||
|
Route::get('/dashboard/petani/indeks', [App\Http\Controllers\Web\Dashboard\IndeksPetaniController::class, 'index'])->name('dashboard.indeks-petani');
|
||||||
|
|
||||||
Route::get('/user-profile', [App\Http\Controllers\Web\Konfigurasi\ProfileController::class, 'index'])->name('userProfile.index');
|
Route::get('/user-profile', [App\Http\Controllers\Web\Konfigurasi\ProfileController::class, 'index'])->name('userProfile.index');
|
||||||
Route::get('/user-profile/security', [App\Http\Controllers\Web\Konfigurasi\ProfileController::class, 'security'])->name('userProfile.security');
|
Route::get('/user-profile/security', [App\Http\Controllers\Web\Konfigurasi\ProfileController::class, 'security'])->name('userProfile.security');
|
||||||
@@ -223,4 +228,8 @@ Route::middleware('auth')
|
|||||||
Route::resource('petani.akses-pasar', App\Http\Controllers\Web\Produktivitas\AksesPasarController::class)->whereNumber('petani');
|
Route::resource('petani.akses-pasar', App\Http\Controllers\Web\Produktivitas\AksesPasarController::class)->whereNumber('petani');
|
||||||
|
|
||||||
Route::resource('petani.skor', App\Http\Controllers\Web\Produktivitas\SkorPetaniController::class)->only(['index']);
|
Route::resource('petani.skor', App\Http\Controllers\Web\Produktivitas\SkorPetaniController::class)->only(['index']);
|
||||||
|
|
||||||
|
// BUMDes
|
||||||
|
Route::get('bumdes/{bumdes}/kelembagaan-aktor', [App\Http\Controllers\Web\Bumdes\PengurusBumdesController::class, 'kelembagaanAktor'])->name('bumdes.kelembagaan-aktor.index');
|
||||||
|
Route::resource('bumdes', App\Http\Controllers\Web\Bumdes\PengurusBumdesController::class);
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user