Files
Aplikasi-Kehadiran-KTM/app/Http/Controllers/DashboardController.php
Saufi 322687c1d1 Flag saluran bermasalah + pautan Call/WhatsApp
- 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>
2026-07-11 03:55:20 +08:00

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;
}
}