diff --git a/app/Http/Controllers/Admin/EmployeeController.php b/app/Http/Controllers/Admin/EmployeeController.php new file mode 100644 index 0000000..17bde17 --- /dev/null +++ b/app/Http/Controllers/Admin/EmployeeController.php @@ -0,0 +1,95 @@ +latest() + ->paginate(10); + + return Inertia::render('admin/employees/index', [ + 'employees' => $employees + ]); + } + + public function create() + { + return Inertia::render('admin/employees/create'); + } + + public function store(StoreEmployeeRequest $request) + { + DB::transaction(function () use ($request) { + $user = User::create([ + 'name' => $request->name, + 'email' => $request->email, + 'password' => Hash::make($request->password), + 'role' => 'employee', + ]); + + $user->employee()->create([ + 'nip' => $request->nip, + 'position' => $request->position, + 'status' => $request->status, + 'join_date' => $request->join_date, + ]); + }); + + return redirect()->route('admin.employees.index') + ->with('success', 'Karyawan berhasil ditambahkan.'); + } + + public function edit(Employee $employee) + { + $employee->load('user'); + return Inertia::render('admin/employees/edit', [ + 'employee' => $employee + ]); + } + + public function update(UpdateEmployeeRequest $request, Employee $employee) + { + DB::transaction(function () use ($request, $employee) { + // Update User Data + $userData = [ + 'name' => $request->name, + 'email' => $request->email, + ]; + + if ($request->filled('password')) { + $userData['password'] = Hash::make($request->password); + } + + $employee->user->update($userData); + + // Update Employee Data + $employee->update([ + 'nip' => $request->nip, + 'position' => $request->position, + 'status' => $request->status, + 'join_date' => $request->join_date, + ]); + }); + + 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.'); + } +} diff --git a/app/Http/Requests/StoreEmployeeRequest.php b/app/Http/Requests/StoreEmployeeRequest.php new file mode 100644 index 0000000..cce0c82 --- /dev/null +++ b/app/Http/Requests/StoreEmployeeRequest.php @@ -0,0 +1,34 @@ +|string> + */ + public function rules(): array + { + return [ + 'name' => 'required|string|max:255', + 'email' => 'required|email|unique:users,email', + 'password' => 'required|string|min:8', + 'nip' => 'required|string|unique:employees,nip', + 'position' => 'required|string', + 'status' => 'required|in:PKWT,PKWTT', + 'join_date' => 'required|date', + ]; + } +} diff --git a/app/Http/Requests/UpdateEmployeeRequest.php b/app/Http/Requests/UpdateEmployeeRequest.php new file mode 100644 index 0000000..40bcee6 --- /dev/null +++ b/app/Http/Requests/UpdateEmployeeRequest.php @@ -0,0 +1,38 @@ +|string> + */ + public function rules(): array + { + $employeeId = $this->route('employee')->id; + $userId = $this->route('employee')->user_id; + + return [ + 'name' => 'required|string|max:255', + 'email' => 'required|email|unique:users,email,' . $userId, + 'nip' => 'required|string|unique:employees,nip,' . $employeeId, + 'position' => 'required|string', + 'status' => 'required|in:PKWT,PKWTT', + 'join_date' => 'required|date', + // Password opsional saat update + 'password' => 'nullable|string|min:8', + ]; + } +} diff --git a/app/Models/Employee.php b/app/Models/Employee.php new file mode 100644 index 0000000..cef1518 --- /dev/null +++ b/app/Models/Employee.php @@ -0,0 +1,24 @@ +belongsTo(User::class); + } +} diff --git a/app/Models/User.php b/app/Models/User.php index 05faee4..25c227f 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -22,6 +22,7 @@ class User extends Authenticatable 'name', 'email', 'password', + 'role', ]; /** @@ -36,6 +37,16 @@ class User extends Authenticatable 'remember_token', ]; + public function employee() + { + return $this->hasOne(Employee::class); + } + + public function hasRole($role) + { + return $this->role === $role; + } + /** * Get the attributes that should be cast. * diff --git a/database/migrations/0001_01_01_000000_create_users_table.php b/database/migrations/0001_01_01_000000_create_users_table.php index 05fb5d9..23fe012 100644 --- a/database/migrations/0001_01_01_000000_create_users_table.php +++ b/database/migrations/0001_01_01_000000_create_users_table.php @@ -17,6 +17,7 @@ public function up(): void $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); + $table->enum('role', ['admin', 'employee'])->default('employee'); $table->rememberToken(); $table->timestamps(); }); diff --git a/database/migrations/2026_02_14_124823_create_employees_table.php b/database/migrations/2026_02_14_124823_create_employees_table.php new file mode 100644 index 0000000..d46523c --- /dev/null +++ b/database/migrations/2026_02_14_124823_create_employees_table.php @@ -0,0 +1,34 @@ +id(); + $table->foreignId('user_id')->constrained()->onDelete('cascade'); + $table->string('nip')->unique(); + $table->string('position'); + $table->enum('status', ['PKWT', 'PKWTT']); + $table->string('phone')->nullable(); + $table->text('address')->nullable(); + $table->date('join_date'); + $table->timestamps(); + }); +} + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('employees'); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index d01a0ef..c5f605e 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -3,8 +3,8 @@ namespace Database\Seeders; use App\Models\User; -// use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; +use Illuminate\Support\Facades\Hash; class DatabaseSeeder extends Seeder { @@ -13,11 +13,12 @@ class DatabaseSeeder extends Seeder */ public function run(): void { - // User::factory(10)->create(); - - User::factory()->create([ - 'name' => 'Test User', - 'email' => 'test@example.com', + User::create([ + 'name' => 'Super Admin', + 'email' => 'admin@zhanhui.com', + 'password' => Hash::make('password123'), + 'role' => 'admin', ]); + } -} +} \ No newline at end of file diff --git a/resources/js/components/app-logo.tsx b/resources/js/components/app-logo.tsx index 42d998f..7665bc5 100644 --- a/resources/js/components/app-logo.tsx +++ b/resources/js/components/app-logo.tsx @@ -8,7 +8,7 @@ export default function AppLogo() {
| Karyawan | +NIP & Jabatan | +Status | +Aksi | +
|---|---|---|---|
|
+ {employee.user?.name}
+ {employee.user?.email}
+ |
+
+ {employee.nip}
+ |
+
+ |
+ + + + | +