user(); $dunId = $user->isSuperadmin() ? ($request->filled('dun_id') ? $request->integer('dun_id') : null) : (int) $user->dun_id; $senaraiDun = $user->isSuperadmin() ? Dun::where('is_active', true)->orderBy('code')->get() : collect(); $senaraiSaluran = Saluran::whereHas('pusatMengundi', function ($q) use ($dunId) { if ($dunId) { $q->where('dun_id', $dunId); } }) ->when($request->filled('pusat_id'), fn ($q) => $q->where('pusat_mengundi_id', $request->integer('pusat_id'))) ->with('pusatMengundi') ->get() ->sortBy([ fn ($a, $b) => strcmp($a->pusatMengundi?->nama ?? '', $b->pusatMengundi?->nama ?? ''), fn ($a, $b) => ($a->nombor_saluran ?? 0) <=> ($b->nombor_saluran ?? 0), ]) ->values(); // KTM bagi setiap saluran (untuk paparan nama & telefon) $ktm = PetugasAssignment::ktm() ->whereIn('saluran_id', $senaraiSaluran->pluck('id')) ->with('permohonan') ->get() ->keyBy('saluran_id'); $bermasalah = SaluranBermasalah::whereIn('saluran_id', $senaraiSaluran->pluck('id')) ->with('dilaporOleh') ->get() ->keyBy('saluran_id'); $senaraiPusat = PusatMengundi::when($dunId, fn ($q) => $q->where('dun_id', $dunId)) ->orderBy('nama') ->get(['id', 'nama']); return view('saluran.index', [ 'senaraiSaluran' => $senaraiSaluran, 'ktm' => $ktm, 'bermasalah' => $bermasalah, 'senaraiPusat' => $senaraiPusat, 'senaraiDun' => $senaraiDun, 'dunId' => $dunId, ]); } /** * Tanda saluran sebagai bermasalah (dengan catatan pilihan). */ public function store(Request $request) { $data = $request->validate([ 'saluran_id' => ['required', 'integer'], 'catatan' => ['nullable', 'string', 'max:500'], ]); $saluran = Saluran::with('pusatMengundi')->findOrFail($data['saluran_id']); $this->pastikanDunDibenarkan($request, $saluran); SaluranBermasalah::updateOrCreate( ['saluran_id' => $saluran->id], [ 'pusat_mengundi_id' => $saluran->pusat_mengundi_id, 'dun_id' => $saluran->pusatMengundi->dun_id, 'catatan' => $data['catatan'] ?? null, 'dilapor_oleh_user_id' => $request->user()->id, ], ); return back()->with('status', 'Saluran '.$saluran->nombor_saluran.' ('.$saluran->pusatMengundi->nama.') ditanda BERMASALAH.'); } /** * Buang tanda bermasalah pada saluran. */ public function destroy(Request $request, int $saluranId) { $saluran = Saluran::with('pusatMengundi')->findOrFail($saluranId); $this->pastikanDunDibenarkan($request, $saluran); SaluranBermasalah::where('saluran_id', $saluran->id)->delete(); return back()->with('status', 'Tanda bermasalah pada Saluran '.$saluran->nombor_saluran.' ('.$saluran->pusatMengundi->nama.') telah dibuang.'); } /** * Admin DUN hanya boleh urus saluran dalam DUN sendiri. */ private function pastikanDunDibenarkan(Request $request, Saluran $saluran): void { $user = $request->user(); if ($user->isSuperadmin()) { return; } if ((int) $saluran->pusatMengundi?->dun_id !== (int) $user->dun_id) { abort(403, 'Saluran ini bukan dalam DUN anda.'); } } }