- Halaman baharu "Saluran Bermasalah": senarai semua saluran dalam DUN (dengan KTM & telefonnya), tanda/buang tanda bermasalah berserta catatan; admin DUN terhad ke DUN sendiri, superadmin semua DUN - Dashboard: baris saluran bermasalah diserlahkan kuning berserta lencana BERMASALAH dan catatan - No. telefon KTM kini ada butang "📞 Call" (tel:) dan "WhatsApp" (wa.me, dinormalkan ke format 60xxxxxxxxx) di dashboard dan halaman saluran bermasalah Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
98 lines
3.5 KiB
PHP
98 lines
3.5 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\KehadiranKtm;
|
|
use App\Models\SaluranBermasalah;
|
|
use App\Models\Sppm\Dun;
|
|
use App\Models\Sppm\PetugasAssignment;
|
|
use App\Models\Sppm\PusatMengundi;
|
|
use Illuminate\Http\Request;
|
|
|
|
class DashboardController extends Controller
|
|
{
|
|
/**
|
|
* Papar semua KTM yang telah diassign dalam DUN, disusun ikut
|
|
* pusat mengundi (asc) dan saluran (asc). Boleh ditapis dengan
|
|
* carian nama/no. KP dan pusat mengundi.
|
|
*/
|
|
public function index(Request $request)
|
|
{
|
|
$user = $request->user();
|
|
$dunId = $this->dunTerpilih($request);
|
|
|
|
$senaraiDun = $user->isSuperadmin()
|
|
? Dun::where('is_active', true)->orderBy('code')->get()
|
|
: collect();
|
|
|
|
$assignments = PetugasAssignment::ktm()
|
|
->when($dunId, fn ($q) => $q->untukDun($dunId))
|
|
->when($request->filled('q'), function ($q) use ($request) {
|
|
$cari = trim($request->input('q'));
|
|
$q->whereHas('permohonan', function ($qq) use ($cari) {
|
|
$qq->where('nama_ic', 'like', "%{$cari}%")
|
|
->orWhere('no_kp', 'like', "%{$cari}%");
|
|
});
|
|
})
|
|
->when($request->filled('pusat_id'), fn ($q) => $q->where('pusat_mengundi_id', $request->integer('pusat_id')))
|
|
->with(['permohonan', 'pusatMengundi.dun', 'saluran', 'jawatan'])
|
|
->get()
|
|
->sortBy([
|
|
fn ($a, $b) => strcmp($a->pusatMengundi?->nama ?? '', $b->pusatMengundi?->nama ?? ''),
|
|
fn ($a, $b) => ($a->saluran?->nombor_saluran ?? 0) <=> ($b->saluran?->nombor_saluran ?? 0),
|
|
])
|
|
->values();
|
|
|
|
$kehadiran = KehadiranKtm::whereIn('assignment_id', $assignments->pluck('id'))
|
|
->get()
|
|
->keyBy('assignment_id');
|
|
|
|
// Saluran yang ditanda bermasalah (untuk highlight kuning)
|
|
$bermasalah = SaluranBermasalah::whereIn('saluran_id', $assignments->pluck('saluran_id')->filter())
|
|
->get()
|
|
->keyBy('saluran_id');
|
|
|
|
// Tapis ikut status selepas kehadiran diketahui
|
|
if (in_array($request->input('status'), ['hadir', 'belum'], true)) {
|
|
$mahuHadir = $request->input('status') === 'hadir';
|
|
$assignments = $assignments
|
|
->filter(fn ($a) => $kehadiran->has($a->id) === $mahuHadir)
|
|
->values();
|
|
}
|
|
|
|
$senaraiPusat = PusatMengundi::when($dunId, fn ($q) => $q->where('dun_id', $dunId))
|
|
->orderBy('nama')
|
|
->get(['id', 'nama']);
|
|
|
|
$jumlahSemua = $assignments->count();
|
|
$jumlahHadir = $assignments->filter(fn ($a) => $kehadiran->has($a->id))->count();
|
|
|
|
return view('dashboard', [
|
|
'assignments' => $assignments,
|
|
'kehadiran' => $kehadiran,
|
|
'bermasalah' => $bermasalah,
|
|
'senaraiPusat' => $senaraiPusat,
|
|
'senaraiDun' => $senaraiDun,
|
|
'dunId' => $dunId,
|
|
'jumlahSemua' => $jumlahSemua,
|
|
'jumlahHadir' => $jumlahHadir,
|
|
'jumlahBelum' => $jumlahSemua - $jumlahHadir,
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* DUN yang dipaparkan: admin DUN terikat pada DUN sendiri; superadmin
|
|
* boleh pilih (null = semua DUN).
|
|
*/
|
|
private function dunTerpilih(Request $request): ?int
|
|
{
|
|
$user = $request->user();
|
|
|
|
if (! $user->isSuperadmin()) {
|
|
return (int) $user->dun_id;
|
|
}
|
|
|
|
return $request->filled('dun_id') ? $request->integer('dun_id') : null;
|
|
}
|
|
}
|