MIF_E31231754/app/Http/Controllers/User/PublikController.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);
}
}