indeks petani dan ajax
This commit is contained in:
@@ -6,6 +6,9 @@ use App\Http\Controllers\Controller;
|
|||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Facades\Gate;
|
use Illuminate\Support\Facades\Gate;
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use Illuminate\Support\Facades\Auth;
|
||||||
|
use Illuminate\Http\RedirectResponse;
|
||||||
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
use App\Models\Pertanian\Petani;
|
use App\Models\Pertanian\Petani;
|
||||||
use App\Models\Pertanian\Komoditas;
|
use App\Models\Pertanian\Komoditas;
|
||||||
@@ -13,41 +16,156 @@ use App\Models\Pertanian\Lahan;
|
|||||||
use App\Models\Pertanian\Tanaman;
|
use App\Models\Pertanian\Tanaman;
|
||||||
use App\Models\Pertanian\SkorPetani;
|
use App\Models\Pertanian\SkorPetani;
|
||||||
|
|
||||||
|
use App\Models\Wilayah\Provinsi;
|
||||||
|
use App\Models\Wilayah\KabupatenKota;
|
||||||
|
use App\Models\Wilayah\Kecamatan;
|
||||||
|
use App\Models\Wilayah\DesaKelurahan;
|
||||||
|
|
||||||
class IndeksPetaniController extends Controller
|
class IndeksPetaniController extends Controller
|
||||||
{
|
{
|
||||||
public function index()
|
|
||||||
|
private function filters(Request $request): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'desaKelurahan_id' => $request->desaKelurahan_id,
|
||||||
|
'kecamatan_id' => $request->kecamatan_id,
|
||||||
|
'kabupatenKota_id' => $request->kabupatenKota_id,
|
||||||
|
'provinsi_id' => $request->provinsi_id,
|
||||||
|
'komoditas_id' => $request->komoditas_id,
|
||||||
|
'segmen' => $request->segmen,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function petaniQuery(array $filters): \Illuminate\Database\Eloquent\Builder
|
||||||
|
{
|
||||||
|
$petaniQuery = 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')
|
||||||
|
->whereNull('petani.deleted_at')
|
||||||
|
->when($filters['provinsi_id'], fn($q, $id) => $q->where('master_kabupaten_kota.provinsi_id', $id))
|
||||||
|
->when($filters['kabupatenKota_id'], fn($q, $id) => $q->where('master_kecamatan.kabupaten_kota_id', $id))
|
||||||
|
->when($filters['kecamatan_id'], fn($q, $id) => $q->where('master_desa_kelurahan.kecamatan_id', $id))
|
||||||
|
->when($filters['desaKelurahan_id'], fn($q, $id) => $q->where('petani.desa_kelurahan_id', $id))
|
||||||
|
->when($filters['komoditas_id'], fn($q, $id) => $q->where('petani.komoditas_id', $id));
|
||||||
|
|
||||||
|
return $petaniQuery;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function skorPetaniQuery(array $filters, array $komoditas): \Illuminate\Database\Eloquent\Builder
|
||||||
|
{
|
||||||
|
$skor = SkorPetani::query()
|
||||||
|
->join('petani', 'petani_skor.petani_id', '=', 'petani.id')
|
||||||
|
->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')
|
||||||
|
->whereNull('petani.deleted_at')
|
||||||
|
->when($filters['provinsi_id'], fn($q, $id) => $q->where('master_kabupaten_kota.provinsi_id', $id))
|
||||||
|
->when($filters['kabupatenKota_id'], fn($q, $id) => $q->where('master_kecamatan.kabupaten_kota_id', $id))
|
||||||
|
->when($filters['kecamatan_id'], fn($q, $id) => $q->where('master_desa_kelurahan.kecamatan_id', $id))
|
||||||
|
->when($filters['desaKelurahan_id'], fn($q, $id) => $q->where('petani.desa_kelurahan_id', $id))
|
||||||
|
->when($filters['komoditas_id'], fn($q, $id) => $q->where('petani.komoditas_id', $id))
|
||||||
|
->whereIn('petani.komoditas_id', $komoditas);
|
||||||
|
|
||||||
|
return $skor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index(Request $request)
|
||||||
{
|
{
|
||||||
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
||||||
abort(403);
|
abort(403);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$filters = $this->filters($request);
|
||||||
|
|
||||||
$title = 'Dashboard Profil Petani';
|
$title = 'Dashboard Profil Petani';
|
||||||
|
|
||||||
$komoditas = Komoditas::where('is_utama', true)->get();
|
$komoditas = Komoditas::where('is_utama', true)->get();
|
||||||
|
$petaniQuery = $this->petaniQuery($filters);
|
||||||
|
|
||||||
$petani = Petani::pluck('id');
|
$desaKelurahan = $petaniQuery->clone()
|
||||||
$lahan = Lahan::has('petani')->get();
|
->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
|
||||||
|
")
|
||||||
|
->distinct()
|
||||||
|
->get();
|
||||||
|
|
||||||
$case = "
|
$wilayah = $desaKelurahan
|
||||||
CASE
|
->groupBy('provinsi_id')
|
||||||
WHEN skor_kesiapan_adopsi >= 4.0 THEN 'Penggerak'
|
->map(function ($provinsi) {
|
||||||
WHEN skor_kesiapan_adopsi >= 3.0 THEN 'Perintis'
|
return [
|
||||||
WHEN skor_kesiapan_adopsi >= 2.0 THEN 'Pemerhati'
|
'id' => $provinsi->first()->provinsi_id,
|
||||||
WHEN skor_kesiapan_adopsi >= 1.0 THEN 'Pemula'
|
'nama' => $provinsi->first()->provinsi,
|
||||||
ELSE 'Belum Lengkap'
|
'kabupaten' => $provinsi
|
||||||
END
|
->groupBy('kabupaten_id')
|
||||||
";
|
->map(function ($kabupaten) {
|
||||||
|
return [
|
||||||
|
'id' => $kabupaten->first()->kabupaten_id,
|
||||||
|
'nama' => $kabupaten->first()->kabupaten,
|
||||||
|
'kecamatan' => $kabupaten
|
||||||
|
->groupBy('kecamatan_id')
|
||||||
|
->map(function ($kecamatan) {
|
||||||
|
return [
|
||||||
|
'id' => $kecamatan->first()->kecamatan_id,
|
||||||
|
'nama' => $kecamatan->first()->kecamatan,
|
||||||
|
'desa' => $kecamatan->map(function ($desa) {
|
||||||
|
return [
|
||||||
|
'id' => $desa->desa_kelurahan_id,
|
||||||
|
'nama' => $desa->desa_kelurahan,
|
||||||
|
'path' => $desa->path,
|
||||||
|
];
|
||||||
|
})->values(),
|
||||||
|
];
|
||||||
|
})->values(),
|
||||||
|
];
|
||||||
|
})->values(),
|
||||||
|
];
|
||||||
|
})->values();
|
||||||
|
|
||||||
$countPetani = Petani::count();
|
return view('dashboard.indeks-petani', array_merge($filters,
|
||||||
$countKomoditas = Petani::whereIn('komoditas_id', $komoditas->pluck('id'))->distinct()->count('komoditas_id');
|
compact(
|
||||||
$sumLahan = Lahan::has('petani')->whereIn('komoditas_id', $komoditas->pluck('id'))->sum('luas_lahan');
|
'komoditas',
|
||||||
$avgLahan = Lahan::has('petani')->whereIn('komoditas_id', $komoditas->pluck('id'))->avg('luas_lahan');
|
'desaKelurahan',
|
||||||
|
'wilayah',
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
|
||||||
$avgSkor = SkorPetani::query()
|
public function summary(Request $request): JsonResponse
|
||||||
->join('petani', 'petani_skor.petani_id', '=', 'petani.id')
|
{
|
||||||
->whereNull('petani.deleted_at')
|
$filters = $this->filters($request);
|
||||||
->whereIn('petani.komoditas_id', $komoditas->pluck('id'))
|
$petaniQuery = $this->petaniQuery($filters);
|
||||||
->avg('skor_kesiapan_adopsi');
|
|
||||||
|
$komoditas = Komoditas::where('is_utama', true)
|
||||||
|
->when($filters['komoditas_id'], fn($q, $id) => $q->where('id', $id))->get();
|
||||||
|
|
||||||
|
$countKomoditas = $petaniQuery->clone()
|
||||||
|
->whereHas('komoditas', fn ($query) => $query->where('is_utama', true))
|
||||||
|
->distinct()->count('komoditas_id');
|
||||||
|
|
||||||
|
$filteredPetaniIds = $petaniQuery
|
||||||
|
->clone()
|
||||||
|
->select('petani.id')
|
||||||
|
->distinct()
|
||||||
|
->pluck('petani.id');
|
||||||
|
|
||||||
|
$sumLahan = Lahan::has('petani')->whereIn('petani_id', $filteredPetaniIds)->whereIn('komoditas_id', $komoditas->pluck('id'))->sum('luas_lahan');
|
||||||
|
$avgLahan = Lahan::has('petani')->whereIn('petani_id', $filteredPetaniIds)->whereIn('komoditas_id', $komoditas->pluck('id'))->avg('luas_lahan');
|
||||||
|
|
||||||
|
$countDesa = $petaniQuery->clone()->whereIn('komoditas_id', $komoditas->pluck('id'))->distinct()->count('desa_kelurahan_id');
|
||||||
|
$countKecamatan = $petaniQuery->clone()->whereIn('komoditas_id', $komoditas->pluck('id'))->distinct()->count('master_kecamatan.id');
|
||||||
|
|
||||||
|
$skorQuery = $this->skorPetaniQuery($filters, $komoditas->pluck('id')->toArray());
|
||||||
|
$avgSkor = $skorQuery->clone()->avg('skor_kesiapan_adopsi');
|
||||||
|
|
||||||
if ($avgSkor >= 4.0) {
|
if ($avgSkor >= 4.0) {
|
||||||
$avgSegmen = 'Penggerak';
|
$avgSegmen = 'Penggerak';
|
||||||
@@ -61,19 +179,120 @@ class IndeksPetaniController extends Controller
|
|||||||
$avgSegmen = 'Belum Lengkap';
|
$avgSegmen = 'Belum Lengkap';
|
||||||
}
|
}
|
||||||
|
|
||||||
$countDesa = Petani::whereIn('komoditas_id', $komoditas->pluck('id'))->distinct()->count('desa_kelurahan_id');
|
return response()->json([
|
||||||
$countKecamatan = Petani::query()
|
'petani' => $petaniQuery->clone()->count(),
|
||||||
->join('master_desa_kelurahan', 'petani.desa_kelurahan_id', '=', 'master_desa_kelurahan.id')
|
'komoditas' => $countKomoditas,
|
||||||
->join('master_kecamatan', 'master_desa_kelurahan.kecamatan_id', '=', 'master_kecamatan.id')
|
'sum_lahan' => $sumLahan,
|
||||||
->whereIn('komoditas_id', $komoditas->pluck('id'))->distinct()->count('master_kecamatan.id');
|
'avg_lahan' => $avgLahan,
|
||||||
|
'desa' => $countDesa,
|
||||||
|
'kecamatan' => $countKecamatan,
|
||||||
|
'skor' => $avgSkor,
|
||||||
|
'segmen' => $avgSegmen
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
$countSegmentasi = SkorPetani::selectRaw("$case AS segmen, COUNT(*) AS total")
|
private function segments(): array
|
||||||
|
{
|
||||||
|
$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',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
||||||
|
return $segments;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function cases(): string
|
||||||
|
{
|
||||||
|
$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
|
||||||
|
";
|
||||||
|
|
||||||
|
return $case;
|
||||||
|
}
|
||||||
|
public function segmen(Request $request): JsonResponse
|
||||||
|
{
|
||||||
|
$filters = $this->filters($request);
|
||||||
|
$segments = $this->segments();
|
||||||
|
$case = $this->cases();
|
||||||
|
|
||||||
|
$komoditas = Komoditas::where('is_utama', true)
|
||||||
|
->when($filters['komoditas_id'], fn($q, $id) => $q->where('id', $id))->get();
|
||||||
|
|
||||||
|
$skorQuery = $this->skorPetaniQuery($filters, $komoditas->pluck('id')->toArray());
|
||||||
|
|
||||||
|
$countSegmentasi = $skorQuery->clone()
|
||||||
|
->selectRaw("$case AS segmen, COUNT(*) AS total")
|
||||||
->groupByRaw($case)
|
->groupByRaw($case)
|
||||||
->get();
|
->get();
|
||||||
|
|
||||||
$countSegmentasiByKomoditas = SkorPetani::query()
|
$series = collect($segments)
|
||||||
->join('petani', 'petani_skor.petani_id', '=', 'petani.id')
|
->map(function ($segment) use ($countSegmentasi) {
|
||||||
->whereNull('petani.deleted_at')
|
return $countSegmentasi
|
||||||
|
->where('segmen', $segment['name'])
|
||||||
|
->sum('total');
|
||||||
|
})
|
||||||
|
->values();
|
||||||
|
|
||||||
|
$countPetani = $series->sum();
|
||||||
|
|
||||||
|
$persentase = collect($segments)
|
||||||
|
->map(function ($segment) use ($countSegmentasi, $countPetani) {
|
||||||
|
$total = $countSegmentasi
|
||||||
|
->where('segmen', $segment['name'])
|
||||||
|
->sum('total');
|
||||||
|
|
||||||
|
return $countPetani > 0
|
||||||
|
? ($total / $countPetani) * 100
|
||||||
|
: 0;
|
||||||
|
})
|
||||||
|
->values();
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'series' => $series,
|
||||||
|
'persentase' => $persentase,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function segmenByKomoditas(Request $request): JsonResponse
|
||||||
|
{
|
||||||
|
$filters = $this->filters($request);
|
||||||
|
$segments = $this->segments();
|
||||||
|
$case = $this->cases();
|
||||||
|
|
||||||
|
$komoditas = Komoditas::where('is_utama', true)
|
||||||
|
->when($filters['komoditas_id'], fn($q, $id) => $q->where('id', $id))->get();
|
||||||
|
|
||||||
|
$skorQuery = $this->skorPetaniQuery($filters, $komoditas->pluck('id')->toArray());
|
||||||
|
|
||||||
|
$countSegmentasiByKomoditas = $skorQuery->clone()
|
||||||
->selectRaw("
|
->selectRaw("
|
||||||
petani.komoditas_id,
|
petani.komoditas_id,
|
||||||
$case AS segmen,
|
$case AS segmen,
|
||||||
@@ -83,20 +302,64 @@ class IndeksPetaniController extends Controller
|
|||||||
->groupByRaw($case)
|
->groupByRaw($case)
|
||||||
->get();
|
->get();
|
||||||
|
|
||||||
$avgDimensi = SkorPetani::query()
|
$seriesSegmentasiKomoditas = collect($segments)->map(function ($segment) use ($countSegmentasiByKomoditas, $komoditas) {
|
||||||
->join('petani', 'petani_skor.petani_id', '=', 'petani.id')
|
return [
|
||||||
->whereNull('petani.deleted_at')
|
'name' => $segment['name'],
|
||||||
->whereIn('petani.komoditas_id', $komoditas->pluck('id'))
|
'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();
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'categories' => $komoditas->pluck('nama')->values(),
|
||||||
|
'series' => $seriesSegmentasiKomoditas,
|
||||||
|
]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function dimensi(Request $request): JsonResponse
|
||||||
|
{
|
||||||
|
$filters = $this->filters($request);
|
||||||
|
|
||||||
|
$komoditas = Komoditas::where('is_utama', true)
|
||||||
|
->when($filters['komoditas_id'], fn($q, $id) => $q->where('id', $id))->get();
|
||||||
|
|
||||||
|
$skorQuery = $this->skorPetaniQuery($filters, $komoditas->pluck('id')->toArray());
|
||||||
|
|
||||||
|
$avgDimensi = $skorQuery->clone()
|
||||||
->selectRaw("
|
->selectRaw("
|
||||||
avg(skor_d2_sistem_praktik_budidaya) as skor_d2_sistem_praktik_budidaya,
|
avg(skor_d2_sistem_praktik_budidaya) as skor_d2_sistem_praktik_budidaya,
|
||||||
avg(skor_d4_sosial_ekonomi) as skor_d4_sosial_ekonomi,
|
avg(skor_d4_sosial_ekonomi) as skor_d4_sosial_ekonomi,
|
||||||
avg(skor_d6_rantai_nilai_akses_pasar) as skor_d6_rantai_nilai_akses_pasar")
|
avg(skor_d6_rantai_nilai_akses_pasar) as skor_d6_rantai_nilai_akses_pasar")
|
||||||
->first();
|
->first();
|
||||||
|
|
||||||
$avgKomponen = SkorPetani::query()
|
return response()->json([
|
||||||
->join('petani', 'petani_skor.petani_id', '=', 'petani.id')
|
'radarDimensi' => [
|
||||||
->whereNull('petani.deleted_at')
|
round($avgDimensi->skor_d2_sistem_praktik_budidaya, 2),
|
||||||
->whereIn('petani.komoditas_id', $komoditas->pluck('id'))
|
round($avgDimensi->skor_d4_sosial_ekonomi, 2),
|
||||||
|
round($avgDimensi->skor_d6_rantai_nilai_akses_pasar, 2),
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function komponen(Request $request): JsonResponse
|
||||||
|
{
|
||||||
|
$filters = $this->filters($request);
|
||||||
|
|
||||||
|
$komoditas = Komoditas::where('is_utama', true)
|
||||||
|
->when($filters['komoditas_id'], fn($q, $id) => $q->where('id', $id))->get();
|
||||||
|
|
||||||
|
$skorQuery = $this->skorPetaniQuery($filters, $komoditas->pluck('id')->toArray());
|
||||||
|
|
||||||
|
$avgKomponen = $skorQuery->clone()
|
||||||
->selectRaw("avg(skor_komp_1_d4_k3_motivasi_kapasitas_adopsi) as skor_komp_1_d4_k3_motivasi_kapasitas_adopsi,
|
->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_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,
|
||||||
@@ -105,11 +368,34 @@ class IndeksPetaniController extends Controller
|
|||||||
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();
|
||||||
|
|
||||||
$desaKelurahan = Petani::query()
|
return response()->json([
|
||||||
->join('master_desa_kelurahan', 'petani.desa_kelurahan_id', '=', 'master_desa_kelurahan.id')
|
'radarKomponen' => [
|
||||||
->join('master_kecamatan', 'master_desa_kelurahan.kecamatan_id', '=', 'master_kecamatan.id')
|
round($avgKomponen->skor_komp_1_d4_k3_motivasi_kapasitas_adopsi, 2),
|
||||||
->join('master_kabupaten_kota', 'master_kecamatan.kabupaten_kota_id', '=', 'master_kabupaten_kota.id')
|
round($avgKomponen->skor_komp_2_d4_k2_ekonomi_rumah_tangga, 2),
|
||||||
->join('master_provinsi', 'master_kabupaten_kota.provinsi_id', '=', 'master_provinsi.id')
|
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)
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function map(Request $request): JsonResponse
|
||||||
|
{
|
||||||
|
$filters = $this->filters($request);
|
||||||
|
$segments = $this->segments();
|
||||||
|
|
||||||
|
$colors = collect($segments)
|
||||||
|
->pluck('color')
|
||||||
|
->map(fn($c) => "var(--bs-{$c})")
|
||||||
|
->values();
|
||||||
|
$segmentStyles = collect($segments)->keyBy('name');
|
||||||
|
|
||||||
|
$case = $this->cases();
|
||||||
|
|
||||||
|
$petaniQuery = $this->petaniQuery($filters);
|
||||||
|
|
||||||
|
$desaKelurahan = $petaniQuery->clone()
|
||||||
->selectRaw("
|
->selectRaw("
|
||||||
master_desa_kelurahan.id as desa_kelurahan_id,
|
master_desa_kelurahan.id as desa_kelurahan_id,
|
||||||
master_desa_kelurahan.nama as desa_kelurahan,
|
master_desa_kelurahan.nama as desa_kelurahan,
|
||||||
@@ -121,13 +407,15 @@ class IndeksPetaniController extends Controller
|
|||||||
master_provinsi.id as provinsi_id,
|
master_provinsi.id as provinsi_id,
|
||||||
master_provinsi.nama as provinsi
|
master_provinsi.nama as provinsi
|
||||||
")
|
")
|
||||||
->whereIn('petani.id', $petani)
|
|
||||||
->distinct()
|
->distinct()
|
||||||
->get();
|
->get();
|
||||||
|
|
||||||
$mapSegmentasi = SkorPetani::query()
|
$komoditas = Komoditas::where('is_utama', true)
|
||||||
->join('petani', 'petani_skor.petani_id', '=', 'petani.id')
|
->when($filters['komoditas_id'], fn($q, $id) => $q->where('id', $id))->get();
|
||||||
->whereNull('petani.deleted_at')
|
|
||||||
|
$skorQuery = $this->skorPetaniQuery($filters, $komoditas->pluck('id')->toArray());
|
||||||
|
|
||||||
|
$mapSegmentasi = $skorQuery->clone()
|
||||||
->selectRaw("petani.desa_kelurahan_id,
|
->selectRaw("petani.desa_kelurahan_id,
|
||||||
$case AS segmen,
|
$case AS segmen,
|
||||||
COUNT(petani.id) AS total
|
COUNT(petani.id) AS total
|
||||||
@@ -136,9 +424,7 @@ class IndeksPetaniController extends Controller
|
|||||||
->groupByRaw($case)
|
->groupByRaw($case)
|
||||||
->get();
|
->get();
|
||||||
|
|
||||||
$mapAvgSkorSegmentasi = SkorPetani::query()
|
$mapAvgSkorSegmentasi = $skorQuery->clone()
|
||||||
->join('petani', 'petani_skor.petani_id', '=', 'petani.id')
|
|
||||||
->whereNull('petani.deleted_at')
|
|
||||||
->selectRaw("petani.desa_kelurahan_id,
|
->selectRaw("petani.desa_kelurahan_id,
|
||||||
COUNT(petani.id) AS jumlah_petani,
|
COUNT(petani.id) AS jumlah_petani,
|
||||||
avg(skor_kesiapan_adopsi) AS skor,
|
avg(skor_kesiapan_adopsi) AS skor,
|
||||||
@@ -153,28 +439,186 @@ class IndeksPetaniController extends Controller
|
|||||||
->groupBy('petani.desa_kelurahan_id')
|
->groupBy('petani.desa_kelurahan_id')
|
||||||
->get();
|
->get();
|
||||||
|
|
||||||
$daftarPetani = Petani::query()
|
$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();
|
||||||
|
|
||||||
|
return response()->json($mapDesaSegmentasi);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function desa(Request $request): JsonResponse
|
||||||
|
{
|
||||||
|
$filters = $this->filters($request);
|
||||||
|
$segments = $this->segments();
|
||||||
|
|
||||||
|
$colors = collect($segments)
|
||||||
|
->pluck('color')
|
||||||
|
->map(fn($c) => "var(--bs-{$c})")
|
||||||
|
->values();
|
||||||
|
$segmentStyles = collect($segments)->keyBy('name');
|
||||||
|
|
||||||
|
$case = $this->cases();
|
||||||
|
|
||||||
|
$petaniQuery = $this->petaniQuery($filters);
|
||||||
|
|
||||||
|
$desaKelurahan = $petaniQuery->clone()
|
||||||
|
->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
|
||||||
|
")
|
||||||
|
->distinct()
|
||||||
|
->get();
|
||||||
|
|
||||||
|
$komoditas = Komoditas::where('is_utama', true)
|
||||||
|
->when($filters['komoditas_id'], fn($q, $id) => $q->where('id', $id))->get();
|
||||||
|
|
||||||
|
$skorQuery = $this->skorPetaniQuery($filters, $komoditas->pluck('id')->toArray());
|
||||||
|
|
||||||
|
$mapSegmentasi = $skorQuery->clone()
|
||||||
|
->selectRaw("petani.desa_kelurahan_id,
|
||||||
|
$case AS segmen,
|
||||||
|
COUNT(petani.id) AS total
|
||||||
|
")
|
||||||
|
->groupBy('petani.desa_kelurahan_id')
|
||||||
|
->groupByRaw($case)
|
||||||
|
->get();
|
||||||
|
|
||||||
|
$mapAvgSkorSegmentasi = $skorQuery->clone()
|
||||||
|
->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();
|
||||||
|
|
||||||
|
$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();
|
||||||
|
|
||||||
|
$rows = $mapDesaSegmentasi->map(function ($desa) use ($segmentStyles) {
|
||||||
|
|
||||||
|
$style = $segmentStyles[$desa->segmentasi->segmen] ?? ['color' => 'secondary'];
|
||||||
|
$styleDominan = $segmentStyles[$desa->segmentasi->segmen_dominan] ?? ['color' => 'secondary'];
|
||||||
|
|
||||||
|
return [
|
||||||
|
'desa' => $desa->desa_kelurahan,
|
||||||
|
'jumlah_petani' => $desa->segmentasi->jumlah_petani,
|
||||||
|
'segmen' => $desa->segmentasi->segmen,
|
||||||
|
'skor' => $desa->segmentasi->skor,
|
||||||
|
'segmen_dominan' => $desa->segmentasi->segmen_dominan,
|
||||||
|
'jumlah_dominan' => $desa->segmentasi->jumlah_dominan,
|
||||||
|
'color' => $style['color'],
|
||||||
|
'color_dominan' => $styleDominan['color'],
|
||||||
|
];
|
||||||
|
});
|
||||||
|
|
||||||
|
return response()->json($rows);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function data(Request $request): JsonResponse
|
||||||
|
{
|
||||||
|
$filters = $this->filters($request);
|
||||||
|
$segments = $this->segments();
|
||||||
|
|
||||||
|
$colors = collect($segments)
|
||||||
|
->pluck('color')
|
||||||
|
->map(fn($c) => "var(--bs-{$c})")
|
||||||
|
->values();
|
||||||
|
$segmentStyles = collect($segments)->keyBy('name');
|
||||||
|
|
||||||
|
$petaniQuery = $this->petaniQuery($filters);
|
||||||
|
|
||||||
|
$komoditas = Komoditas::where('is_utama', true)
|
||||||
|
->when($filters['komoditas_id'], fn($q, $id) => $q->where('id', $id))->get();
|
||||||
|
|
||||||
|
$daftarPetani = $petaniQuery->clone()
|
||||||
|
->select('petani.*')
|
||||||
->whereIn('komoditas_id', $komoditas->pluck('id'))
|
->whereIn('komoditas_id', $komoditas->pluck('id'))
|
||||||
->get();
|
->get();
|
||||||
|
|
||||||
return view('dashboard.indeks-petani', compact(
|
$data = $daftarPetani->map(function ($item) use ($segmentStyles) {
|
||||||
'komoditas',
|
$segmen = $item->skor
|
||||||
'countPetani',
|
? $item->segmen()
|
||||||
'countKomoditas',
|
: null;
|
||||||
'sumLahan',
|
$style = $segmentStyles[$segmen]
|
||||||
'avgLahan',
|
?? ['color' => 'secondary'];
|
||||||
'avgSkor',
|
|
||||||
'avgSegmen',
|
return [
|
||||||
'countDesa',
|
'id' => $item->id,
|
||||||
'countKecamatan',
|
'nama' => $item->nama,
|
||||||
'countSegmentasi',
|
'desa' => $item->desaKelurahan?->nama,
|
||||||
'countSegmentasiByKomoditas',
|
'desa_kelurahan_id' => $item->desa_kelurahan_id,
|
||||||
'avgDimensi',
|
'komoditas' => $item->komoditas?->nama,
|
||||||
'avgKomponen',
|
'luas_lahan' => $item->lahans?->sum('luas_lahan') ?? 0,
|
||||||
'desaKelurahan',
|
'skor' => $item->skor
|
||||||
'mapSegmentasi',
|
? $item->skor->skor_kesiapan_adopsi
|
||||||
'mapAvgSkorSegmentasi',
|
: null,
|
||||||
'daftarPetani',
|
'segmen' => $segmen,
|
||||||
));
|
'color' => $style['color'],
|
||||||
|
'url' => route('dashboard.profil-petani', $item->id),
|
||||||
|
];
|
||||||
|
});
|
||||||
|
|
||||||
|
return response()->json($data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -52,6 +52,14 @@ Route::middleware('auth')
|
|||||||
Route::get('/dashboard/petani/indikator-pertanian', [App\Http\Controllers\Web\Dashboard\IndikatorPertanianController::class, 'index'])->name('dashboard.indikator-pertanian');
|
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('/dashboard/petani/indeks', [App\Http\Controllers\Web\Dashboard\IndeksPetaniController::class, 'index'])->name('dashboard.indeks-petani');
|
||||||
|
Route::get('/dashboard/petani/indeks/summary', [App\Http\Controllers\Web\Dashboard\IndeksPetaniController::class, 'summary'])->name('dashboard.indeks-petani.summary');
|
||||||
|
Route::get('/dashboard/petani/indeks/segmen', [App\Http\Controllers\Web\Dashboard\IndeksPetaniController::class, 'segmen'])->name('dashboard.indeks-petani.segmen');
|
||||||
|
Route::get('/dashboard/petani/indeks/segmen/komoditas', [App\Http\Controllers\Web\Dashboard\IndeksPetaniController::class, 'segmenByKomoditas'])->name('dashboard.indeks-petani.segmen.komoditas');
|
||||||
|
Route::get('/dashboard/petani/indeks/dimensi', [App\Http\Controllers\Web\Dashboard\IndeksPetaniController::class, 'dimensi'])->name('dashboard.indeks-petani.dimensi');
|
||||||
|
Route::get('/dashboard/petani/indeks/komponen', [App\Http\Controllers\Web\Dashboard\IndeksPetaniController::class, 'komponen'])->name('dashboard.indeks-petani.komponen');
|
||||||
|
Route::get('/dashboard/petani/indeks/map', [App\Http\Controllers\Web\Dashboard\IndeksPetaniController::class, 'map'])->name('dashboard.indeks-petani.map');
|
||||||
|
Route::get('/dashboard/petani/indeks/desa', [App\Http\Controllers\Web\Dashboard\IndeksPetaniController::class, 'desa'])->name('dashboard.indeks-petani.desa');
|
||||||
|
Route::get('/dashboard/petani/indeks/data', [App\Http\Controllers\Web\Dashboard\IndeksPetaniController::class, 'data'])->name('dashboard.indeks-petani.data');
|
||||||
|
|
||||||
Route::get('/dashboard/profil/petani/{id}',[App\Http\Controllers\Web\Produktivitas\ProfilPetaniController::class, 'index'])->name('dashboard.profil-petani');
|
Route::get('/dashboard/profil/petani/{id}',[App\Http\Controllers\Web\Produktivitas\ProfilPetaniController::class, 'index'])->name('dashboard.profil-petani');
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user