Sistem untuk admin DUN merekod waktu KTM (Ketua Tempat Mengundi) hadir mengambil peti undi. Data KTM dibaca daripada DB sppm (spr2026) melalui connection kedua — hanya penempatan berjawatan KTM yang dipaparkan. - Dashboard: senarai KTM ikut pusat mengundi (asc) & saluran (asc), status BELUM HADIR (merah) / HADIR (hijau) + tarikh & masa - Carian nama/no. KP, tapisan pusat mengundi & status - Tanda hadir / batal dengan kawalan DUN (admin terhad ke DUN sendiri) - Eksport Excel (worksheet Hadir & Belum Hadir) guna SimpleXlsx - Peranan: superadmin (urus pengguna, semua DUN) & admin DUN - Docker: nginx + php-fpm + queue + scheduler + webhook deploy, port 127.0.0.1:8009, TZ Asia/Kuala_Lumpur di semua container - Zon waktu aplikasi: Asia/Kuala_Lumpur (APP_TIMEZONE) Berasaskan scaffold spr2026_taklimat. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
91 lines
3.2 KiB
PHP
91 lines
3.2 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\KehadiranKtm;
|
|
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');
|
|
|
|
// 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,
|
|
'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;
|
|
}
|
|
}
|