112 lines
3.9 KiB
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);
|
|
}
|
|
}
|