user(); $sesi = SesiTaklimat::withCount('kehadiran') ->when(! $user->isAdmin(), fn ($q) => $q->where('dun_id', $user->dun_id)) ->orderByDesc('tarikh') ->get(); $sesi->load('dun'); return view('sesi.index', compact('sesi')); } public function create(Request $request) { $user = $request->user(); $senaraiDun = Dun::where('is_active', true) ->when($user->isPengurus(), fn ($q) => $q->where('id', $user->dun_id)) ->orderBy('code') ->get(); return view('sesi.create', compact('senaraiDun')); } public function store(Request $request) { $user = $request->user(); $data = $request->validate([ // Beberapa sesi dibenarkan dalam satu hari bagi setiap DUN 'dun_id' => ['required', 'integer'], 'tarikh' => ['required', 'date'], 'nama' => ['required', 'string', 'max:255'], 'lokasi' => ['required', 'string', 'max:255'], 'masa' => ['nullable', 'string', 'max:100'], ]); if ($user->isPengurus() && (int) $data['dun_id'] !== (int) $user->dun_id) { abort(403, 'Anda hanya boleh mencipta sesi untuk DUN anda sendiri.'); } if (! Dun::where('id', $data['dun_id'])->where('is_active', true)->exists()) { return back()->withErrors(['dun_id' => 'DUN tidak sah.'])->withInput(); } $data['created_by_user_id'] = $user->id; $sesi = SesiTaklimat::create($data); return redirect()->route('sesi.show', $sesi)->with('status', 'Sesi taklimat berjaya dicipta.'); } public function show(Request $request, SesiTaklimat $sesi) { $this->pastikanAkses($request, $sesi); $sesi->load('dun'); $sesi->loadCount([ 'kehadiran', 'kehadiran as borang_diambil_count' => fn ($q) => $q->where('borang_diambil', true), ]); $checkinUrl = route('checkin.show', $sesi->qr_token); return view('sesi.show', compact('sesi', 'checkinUrl')); } /** * Papar QR untuk dicetak / dipamerkan di lokasi taklimat. */ public function qr(Request $request, SesiTaklimat $sesi) { $this->pastikanAkses($request, $sesi); $sesi->load('dun'); $checkinUrl = route('checkin.show', $sesi->qr_token); return view('sesi.qr', compact('sesi', 'checkinUrl')); } public function toggle(Request $request, SesiTaklimat $sesi) { $this->pastikanAkses($request, $sesi); $sesi->update(['is_active' => ! $sesi->is_active]); return back()->with('status', $sesi->is_active ? 'Sesi diaktifkan.' : 'Sesi ditutup.'); } private function pastikanAkses(Request $request, SesiTaklimat $sesi): void { $user = $request->user(); if (! $user->isAdmin() && (int) $sesi->dun_id !== (int) $user->dun_id) { abort(403, 'Sesi ini bukan untuk DUN anda.'); } } }