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); } }