query('q'); $members = Member::query() ->when($q, fn ($query) => $query->search($q)) ->withCount(['drawResults as confirmed_wins' => fn ($query) => $query->where('status', \App\Models\DrawResult::STATUS_CONFIRMED)]) ->with('attendance') ->orderBy('nama') ->paginate(25) ->withQueryString(); $importLogs = ImportLog::where('type', 'members')->with('importedBy')->latest()->take(5)->get(); return view('admin.members.index', compact('members', 'q', 'importLogs')); } public function edit(Member $member): View { return view('admin.members.edit', compact('member')); } public function update(Request $request, Member $member): RedirectResponse { $data = $request->validate([ 'no_anggota' => ['nullable', 'string', 'max:255'], 'no_pekerja' => ['nullable', 'string', 'max:255', "unique:members,no_pekerja,{$member->id}"], 'no_kp' => ['nullable', 'string', 'max:255', "unique:members,no_kp,{$member->id}"], 'nama' => ['required', 'string', 'max:255'], 'jabatan' => ['nullable', 'string', 'max:255'], 'bahagian' => ['nullable', 'string', 'max:255'], 'telefon' => ['nullable', 'string', 'max:255'], 'status_aktif' => ['required', 'boolean'], ]); $member->update($data); AuditLog::record('member.update', "Kemaskini anggota: {$member->nama}", $member); return redirect()->route('admin.members.index')->with('success', 'Maklumat anggota dikemaskini.'); } public function destroy(Member $member): RedirectResponse { $nama = $member->nama; $member->delete(); AuditLog::record('member.delete', "Padam anggota: {$nama}"); return redirect()->route('admin.members.index')->with('success', "Anggota '{$nama}' dipadam."); } public function showImport(): View { $logs = ImportLog::where('type', 'members')->with('importedBy')->latest()->take(15)->get(); return view('admin.members.import', compact('logs')); } public function import(Request $request, MemberImportService $service): RedirectResponse { $request->validate([ 'file' => ['required', 'file', 'mimes:csv,txt,xlsx,xls', 'max:10240'], ]); $file = $request->file('file'); $rows = Spreadsheet::read($file->getRealPath(), $file->getClientOriginalExtension()); $log = $service->import($rows, $file->getClientOriginalName(), $request->user()->id); AuditLog::record('member.import', "Import anggota: {$log->filename}", $log, [ 'success' => $log->success_count, 'duplicate' => $log->duplicate_count, 'failed' => $log->failed_count, ]); return redirect()->route('admin.members.import')->with('import_result', $log->id); } }