MIF_E31231754/app/Http/Controllers/Admin/GisController.php

112 lines
3.9 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\HasilSaw;
use App\Models\PeriodeSeleksi;
use App\Models\Wilayah;
use Illuminate\Http\Request;
class GisController extends Controller
{
public function index(Request $request)
{
$periodeList = PeriodeSeleksi::where('status', 'selesai')->latest()->get();
$periodeId = $request->get('periode_id');
$periodeAktif = $periodeId
? PeriodeSeleksi::find($periodeId)
: PeriodeSeleksi::where('status', 'selesai')->latest()->first();
$markers = $this->buildMarkers($periodeAktif ? $periodeAktif->id : null);
$totalPenerima = $markers->sum('jumlah_penerima');
$totalWilayah = $markers->filter(fn($m) => $m['jumlah_penerima'] > 0)->count();
// Statistik per dusun untuk periode ini
$statistikDusun = $markers->groupBy('dusun')->map(function ($items) {
return $items->sum('jumlah_penerima');
})->sortDesc();
return view('admin.gis.index', compact(
'markers', 'totalPenerima', 'totalWilayah',
'periodeList', 'periodeAktif', 'statistikDusun'
));
}
public function data(Request $request)
{
$periodeId = $request->get('periode_id');
$markers = $this->buildMarkers($periodeId ?: null);
$totalPenerima = $markers->sum('jumlah_penerima');
$totalWilayah = $markers->filter(fn($m) => $m['jumlah_penerima'] > 0)->count();
// Ambil nama warga penerima per wilayah (untuk popup detail)
$wargaPerWilayah = [];
if ($periodeId) {
$penerima = HasilSaw::where('periode_id', $periodeId)
->where('status', 'penerima')
->with('warga.wilayah')
->orderBy('ranking')
->get();
foreach ($penerima as $h) {
if ($h->warga && $h->warga->wilayah) {
$key = $h->warga->wilayah->dusun . '_' . $h->warga->wilayah->rw;
$wargaPerWilayah[$key][] = [
'nama' => $h->warga->nama,
'ranking' => $h->ranking,
'skor' => number_format($h->skor_akhir, 4),
];
}
}
}
return response()->json([
'markers' => $markers->values(),
'totalPenerima' => $totalPenerima,
'totalWilayah' => $totalWilayah,
'wargaPerWilayah'=> $wargaPerWilayah,
]);
}
private function buildMarkers(?int $periodeId)
{
$wilayah = Wilayah::with('warga')->get();
$query = HasilSaw::where('status', 'penerima');
if ($periodeId) {
$query->where('periode_id', $periodeId);
}
$hasilPenerima = $query->get()->groupBy('warga_id');
return $wilayah->map(function ($w) use ($hasilPenerima) {
$jumlahPenerima = 0;
$totalSkor = 0;
$count = 0;
foreach ($w->warga as $warga) {
if (isset($hasilPenerima[$warga->id])) {
foreach ($hasilPenerima[$warga->id] as $hasil) {
$jumlahPenerima++;
$totalSkor += $hasil->skor_akhir;
$count++;
}
}
}
return [
'dusun' => $w->dusun,
'rw' => $w->rw,
'latitude' => (float) $w->latitude,
'longitude' => (float) $w->longitude,
'jumlah_penerima' => $jumlahPenerima,
'avg_skor' => $count > 0 ? round($totalSkor / $count, 4) : 0,
'label' => "Dusun {$w->dusun} / RW {$w->rw}",
'key' => $w->dusun . '_' . $w->rw,
];
})->filter(fn($m) => $m['latitude'] !== 0.0 && $m['longitude'] !== 0.0);
}
}