search) { $query->where('nip', 'like', '%' . $request->search . '%') ->orWhereHas('user', function ($q) use ($request) { $q->where('name', 'like', '%' . $request->search . '%'); }); } if ($request->department_id) { $query->where('department_id', $request->department_id); } return Inertia::render('admin/employees/index', [ 'employees' => $query->latest()->get(), 'departments' => Department::all(), 'filters' => $request->only(['search', 'department_id']), ]); } public function create() { return Inertia::render('admin/employees/create', [ 'departments' => Department::all(), 'positions' => Position::all(), ]); } public function store(Request $request) { $validated = $request->validate([ 'name' => 'required|string|max:255', 'email' => 'required|email|unique:users,email', 'nip' => 'required|string|unique:employees,nip', 'gender' => 'required|in:L,P', 'place_of_birth' => 'nullable|string|max:255', 'birth_date' => 'required|date', 'address' => 'nullable|string', 'phone_number' => 'nullable|string|max:20', 'department_id' => 'required|exists:departments,id', 'position_id' => 'required|exists:positions,id', 'status' => 'required|in:PKWT,PKWTT,Magang', 'join_date' => 'required|date', ], [ 'name.required' => 'Nama lengkap wajib diisi.', 'name.max' => 'Nama lengkap maksimal 255 karakter.', 'email.required' => 'Email wajib diisi.', 'email.email' => 'Format email tidak valid.', 'email.unique' => 'Email sudah digunakan oleh karyawan lain.', 'nip.required' => 'NIP wajib diisi.', 'nip.unique' => 'NIP sudah terdaftar.', 'gender.required' => 'Jenis kelamin wajib dipilih.', 'gender.in' => 'Jenis kelamin hanya boleh Laki-laki atau Perempuan.', 'place_of_birth.max' => 'Tempat lahir maksimal 255 karakter.', 'birth_date.required' => 'Tanggal lahir wajib diisi.', 'birth_date.date' => 'Format tanggal lahir tidak valid.', 'phone_number.max' => 'Nomor telepon maksimal 20 karakter.', 'department_id.required' => 'Departemen wajib dipilih.', 'department_id.exists' => 'Departemen tidak ditemukan.', 'position_id.required' => 'Jabatan wajib dipilih.', 'position_id.exists' => 'Jabatan tidak ditemukan.', 'status.required' => 'Status kepegawaian wajib dipilih.', 'status.in' => 'Status hanya boleh PKWT, PKWTT, atau Magang.', 'join_date.required' => 'Tanggal masuk wajib diisi.', 'join_date.date' => 'Format tanggal masuk tidak valid.', ]); $user = User::create([ 'name' => $validated['name'], 'email' => $validated['email'], 'password' => Hash::make('password'), 'role' => 'employee', ]); $employee = Employee::create([ 'user_id' => $user->id, 'nip' => $validated['nip'], 'name' => $validated['name'], 'gender' => $validated['gender'], 'place_of_birth' => $validated['place_of_birth'], 'birth_date' => $validated['birth_date'], 'address' => $validated['address'], 'phone_number' => $validated['phone_number'], 'department_id' => $validated['department_id'], 'position_id' => $validated['position_id'], 'status' => $validated['status'], 'join_date' => $validated['join_date'], ]); $user->update(['employee_id' => $employee->id]); return redirect()->route('admin.employees.index') ->with('success', 'Data karyawan berhasil ditambahkan.'); } public function edit(Employee $employee) { $employee->load(['user', 'department', 'position']); return Inertia::render('admin/employees/edit', [ 'employee' => $employee, 'departments' => Department::all(), 'positions' => Position::all(), ]); } public function update(Request $request, Employee $employee) { $validated = $request->validate([ 'name' => 'required|string|max:255', 'email' => ['required', 'email', Rule::unique('users')->ignore($employee->user_id)], 'nip' => ['required', 'string', Rule::unique('employees')->ignore($employee->id)], 'gender' => 'required|in:L,P', 'place_of_birth' => 'nullable|string|max:255', 'birth_date' => 'required|date', 'address' => 'nullable|string', 'phone_number' => 'nullable|string|max:20', 'department_id' => 'required|exists:departments,id', 'position_id' => 'required|exists:positions,id', 'status' => 'required|in:PKWT,PKWTT,Magang', 'join_date' => 'required|date', ], [ 'name.required' => 'Nama lengkap wajib diisi.', 'name.max' => 'Nama lengkap maksimal 255 karakter.', 'email.required' => 'Email wajib diisi.', 'email.email' => 'Format email tidak valid.', 'email.unique' => 'Email sudah digunakan oleh karyawan lain.', 'nip.required' => 'NIP wajib diisi.', 'nip.unique' => 'NIP sudah terdaftar.', 'gender.required' => 'Jenis kelamin wajib dipilih.', 'gender.in' => 'Jenis kelamin hanya boleh Laki-laki atau Perempuan.', 'place_of_birth.max' => 'Tempat lahir maksimal 255 karakter.', 'birth_date.required' => 'Tanggal lahir wajib diisi.', 'birth_date.date' => 'Format tanggal lahir tidak valid.', 'phone_number.max' => 'Nomor telepon maksimal 20 karakter.', 'department_id.required' => 'Departemen wajib dipilih.', 'department_id.exists' => 'Departemen tidak ditemukan.', 'position_id.required' => 'Jabatan wajib dipilih.', 'position_id.exists' => 'Jabatan tidak ditemukan.', 'status.required' => 'Status kepegawaian wajib dipilih.', 'status.in' => 'Status hanya boleh PKWT, PKWTT, atau Magang.', 'join_date.required' => 'Tanggal masuk wajib diisi.', 'join_date.date' => 'Format tanggal masuk tidak valid.', ]); $employee->user->update([ 'name' => $validated['name'], 'email' => $validated['email'], ]); $employee->update($validated); return redirect()->route('admin.employees.index') ->with('success', 'Data karyawan diperbarui.'); } public function destroy(Employee $employee) { $employee->user->delete(); return back()->with('success', 'Karyawan dihapus.'); } }