92 lines
3.3 KiB
PHP
92 lines
3.3 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Admin;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\AuditLog;
|
|
use App\Models\ImportLog;
|
|
use App\Models\Member;
|
|
use App\Services\MemberImportService;
|
|
use App\Support\Spreadsheet;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\View\View;
|
|
|
|
class MemberController extends Controller
|
|
{
|
|
public function index(Request $request): View
|
|
{
|
|
$q = $request->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);
|
|
}
|
|
}
|