latest()->first(); $periodeSelesai = PeriodeSeleksi::where('status', 'selesai')->count(); $totalPenerima = HasilSaw::where('status', 'penerima')->distinct('warga_id')->count('warga_id'); $totalWarga = \App\Models\Warga::count(); $periodeList = PeriodeSeleksi::latest()->take(3)->get(); return view('publik.index', compact( 'periodeAktif', 'periodeSelesai', 'totalPenerima', 'totalWarga', 'periodeList' )); } public function penerima(Request $request) { $periodeId = $request->get('periode_id'); $periodeList = PeriodeSeleksi::where('status', 'selesai')->latest()->get(); $periode = $periodeId ? PeriodeSeleksi::find($periodeId) : PeriodeSeleksi::where('status', 'selesai')->latest()->first(); $hasil = collect(); if ($periode) { $hasil = HasilSaw::where('periode_id', $periode->id) ->where('status', 'penerima') ->with('warga.wilayah') ->orderBy('ranking') ->get(); } return view('publik.penerima', compact('periode', 'periodeList', 'hasil')); } public function peta(Request $request) { $periodeList = PeriodeSeleksi::where('status', 'selesai')->latest()->get(); $periodeId = $request->get('periode_id'); // Default: periode selesai terbaru $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(); return view('publik.peta', compact( 'markers', 'totalPenerima', 'totalWilayah', 'periodeList', 'periodeAktif' )); } // ── AJAX endpoint: return JSON markers per periode ── public function petaData(Request $request) { $periodeId = $request->get('periode_id'); $markers = $this->buildMarkers($periodeId); $totalPenerima = $markers->sum('jumlah_penerima'); $totalWilayah = $markers->filter(fn($m) => $m['jumlah_penerima'] > 0)->count(); return response()->json([ 'markers' => $markers->values(), 'totalPenerima' => $totalPenerima, 'totalWilayah' => $totalWilayah, ]); } // ── Helper: bangun data markers per periode ── private function buildMarkers(?int $periodeId) { $wilayah = Wilayah::with('warga')->get(); // Query penerima — filter per periode jika ada $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++; } } } $avgSkor = $count > 0 ? round($totalSkor / $count, 4) : 0; return [ 'dusun' => $w->dusun, 'rw' => $w->rw, 'latitude' => (float) $w->latitude, 'longitude' => (float) $w->longitude, 'jumlah_penerima' => $jumlahPenerima, 'avg_skor' => $avgSkor, 'label' => "Dusun {$w->dusun} / RW {$w->rw}", ]; })->filter(fn($m) => $m['latitude'] !== 0.0 && $m['longitude'] !== 0.0); } }