filled('date')) { $query->whereDate('date', $request->date); } if ($request->filled('status')) { $query->where('status', $request->status); } if ($request->filled('department_id')) { $query->whereHas('employee', function ($q) use ($request) { $q->where('department_id', $request->department_id); }); } if ($request->filled('search')) { $query->whereHas('employee', function ($q) use ($request) { $q->where('name', 'like', '%' . $request->search . '%') ->orWhere('nip', 'like', '%' . $request->search . '%'); }); } return Inertia::render('admin/attendance/index', [ 'attendances' => $query->latest('date')->paginate(15)->withQueryString(), 'departments' => Department::select('id', 'name')->orderBy('name')->get(), 'filters' => $request->only(['search', 'date', 'status', 'department_id']), ]); } public function create() { $employees = Employee::with('department') ->orderBy('name') ->get() ->map(fn($employee) => [ 'id' => $employee->id, 'name' => $employee->name, 'nip' => $employee->nip, 'department' => $employee->department?->name, ]); return Inertia::render('admin/attendance/create', [ 'employees' => $employees, ]); } public function store(Request $request) { $validated = $request->validate([ 'employee_id' => [ 'required', 'exists:employees,id', Rule::unique('attendances')->where(fn($query) => $query->where('date', $request->date)), ], 'date' => 'required|date', 'shift' => 'required|in:Pagi,Siang,Malam', 'status' => 'required|in:hadir,izin,sakit,alpha', 'check_in' => 'nullable|date', 'check_out' => 'nullable|date|after_or_equal:check_in', 'notes' => 'nullable|string|max:255', ], [ 'employee_id.unique' => 'Absensi karyawan pada tanggal ini sudah tercatat.', 'check_out.after_or_equal' => 'Jam pulang harus setelah jam masuk.', ]); Attendance::create($validated); return redirect()->route('admin.attendance.index') ->with('success', 'Absensi berhasil disimpan.'); } }