parseDataTableQuery($request); $search = $tableQuery['search']; $sort = $tableQuery['sort']; $direction = $tableQuery['direction']; $employmentStatus = $request->string('employment_status')->toString(); $employeeStatus = $request->string('employee_status')->toString(); $query = User::query() ->with(['profile', 'employee']) ->whereHas('employee') ->when($search !== '', function ($query) use ($search): void { $query->where(function ($query) use ($search): void { $query->where('email', 'like', "%{$search}%") ->orWhere('username', 'like', "%{$search}%") ->orWhereHas('profile', function ($query) use ($search): void { $query->where('full_name', 'like', "%{$search}%") ->orWhere('phone_number', 'like', "%{$search}%"); }) ->orWhereHas('employee', function ($query) use ($search): void { $query->where('employee_code', 'like', "%{$search}%"); }); }); }) ->when( $employmentStatus !== '', fn ($query) => $query->whereHas('employee', fn ($query) => $query->where('employment_status', $employmentStatus)) ) ->when( $employeeStatus !== '', fn ($query) => $query->whereHas('employee', fn ($query) => $query->where('employee_status', $employeeStatus)) ); $this->applySorting($query, $sort, $direction); $employees = $query ->paginate(10) ->withQueryString() ->through(fn (User $user) => $this->transformEmployee($user)); return Inertia::render('admin/hr/employees/Index', [ 'employees' => $employees, 'filters' => $this->dataTableFilters($tableQuery, [ 'employment_status' => $employmentStatus, 'employee_status' => $employeeStatus, ]), 'employmentStatuses' => EmploymentStatus::selectOptions(), 'employeeStatuses' => EmployeeStatus::selectOptions(), ]); } public function create(): Response { return Inertia::render('admin/hr/employees/Create', [ 'genders' => Gender::selectOptions(), 'employmentStatuses' => EmploymentStatus::selectOptions(), ]); } public function store(EmployeeRequest $request): RedirectResponse { $validated = $request->validated(); DB::transaction(function () use ($validated): void { $user = User::create([ 'email' => $validated['email'], 'username' => $validated['username'], 'password' => Hash::make(config('auth.password_default')), ]); UserProfile::create([ 'user_id' => $user->id, 'full_name' => $validated['full_name'], 'phone_number' => $validated['phone_number'], 'gender' => $validated['gender'], 'birth_date' => $validated['birth_date'], 'address' => $validated['address'], ]); Employee::create([ 'user_id' => $user->id, 'join_date' => $validated['join_date'], 'employment_status' => $validated['employment_status'], 'base_salary' => $validated['base_salary'], ]); }); Inertia::flash('success', 'Pegawai berhasil ditambahkan.'); return redirect()->route('admin.hr.employees.index'); } public function edit(User $user): Response { $user->load(['profile', 'employee']); return Inertia::render('admin/hr/employees/Edit', [ 'genders' => Gender::selectOptions(), 'employmentStatuses' => EmploymentStatus::selectOptions(), 'employee' => $this->transformEmployee($user), ]); } public function update(EmployeeRequest $request, User $user): RedirectResponse { $validated = $request->validated(); $employee = $user->employee; DB::transaction(function () use ($validated, $user, $employee): void { $user->email = $validated['email']; $user->username = $validated['username']; $user->save(); $profile = $user->profile; $profile->full_name = $validated['full_name']; $profile->phone_number = $validated['phone_number']; $profile->gender = $validated['gender']; $profile->birth_date = $validated['birth_date']; $profile->address = $validated['address']; $profile->save(); $employee->join_date = $validated['join_date']; $employee->employment_status = $validated['employment_status']; $employee->base_salary = $validated['base_salary']; $employee->save(); }); Inertia::flash('success', 'Data pegawai berhasil diperbarui.'); return redirect()->route('admin.hr.employees.index'); } public function toggleStatus(Request $request, User $user): RedirectResponse { $validated = $request->validate([ 'is_active' => ['required', 'boolean'], ]); $user->is_active = $validated['is_active']; $user->save(); if (! $validated['is_active']) { DB::table('sessions')->where('user_id', $user->id)->delete(); } Inertia::flash('success', 'Status pegawai berhasil diperbarui.'); return back(); } public function resetPassword(User $user): RedirectResponse { $user->password = config('auth.password_default'); $user->save(); DB::table('sessions')->where('user_id', $user->id)->delete(); Inertia::flash('success', 'Kata sandi berhasil direset. Pengguna telah logout dari semua sesi.'); return back(); } public function destroy(User $user): RedirectResponse { DB::transaction(function () use ($user): void { $user->employee?->delete(); $user->profile?->delete(); $user->delete(); }); Inertia::flash('success', 'Pegawai berhasil dihapus.'); return redirect()->route('admin.hr.employees.index'); } private function applySorting(Builder $query, string $sort, string $direction): void { $employeeSorts = [ 'employee_code', 'join_date', 'base_salary', 'employment_status', 'employee_status', ]; if (in_array($sort, $employeeSorts, true)) { $query->orderBy( Employee::select($sort) ->whereColumn('employees.user_id', 'users.id') ->limit(1), $direction ); return; } if ($sort === 'full_name') { $query->orderBy( UserProfile::select('full_name') ->whereColumn('user_profiles.user_id', 'users.id') ->limit(1), $direction ); return; } if ($sort === 'email') { $query->orderBy('email', $direction); return; } $query->latest(); } /** * @return array */ private function transformEmployee(User $user): array { $employee = $user->employee; $profile = $user->profile; return [ 'id' => $user->id, 'employee_code' => $employee->employee_code, 'join_date' => $employee->join_date_formatted, 'resign_date' => $employee->resign_date_formatted, 'employment_status' => $employee->employment_status?->value, 'employment_status_label' => $employee->employment_status?->label(), 'employee_status' => $employee->employee_status?->value, 'employee_status_label' => $employee->employee_status?->label(), 'base_salary' => $employee->base_salary, 'base_salary_formatted' => $employee->base_salary_formatted, 'email' => $user->email, 'username' => $user->username, 'is_active' => $user->is_active, 'full_name' => $profile->full_name, 'phone_number' => $profile->phone_number, 'gender' => $profile->gender?->value, 'gender_label' => $profile->gender?->label(), 'birth_date' => $profile->birth_date_formatted, 'address' => $profile->address, ]; } }