128 lines
4.4 KiB
PHP
128 lines
4.4 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\User;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\HasilSaw;
|
|
use App\Models\PeriodeSeleksi;
|
|
use App\Models\Warga;
|
|
use App\Models\Wilayah;
|
|
use Illuminate\Http\Request;
|
|
|
|
class PublikController extends Controller
|
|
{
|
|
public function index()
|
|
{
|
|
$periodeAktif = PeriodeSeleksi::where('status', 'aktif')->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);
|
|
}
|
|
}
|