Sync SOP ke e-doc Plant & Add Subject dan penyempurnaan bagian matrix training karyawan

This commit is contained in:
Iwit
2026-06-04 19:01:17 +07:00
parent 91c0a8147f
commit 1089f60a3d
26 changed files with 1241 additions and 155 deletions
@@ -87,9 +87,12 @@ class EmployeeController extends Controller
->pluck('initial')
->map(fn($i) => strtolower($i))
->toArray();
// [TAMBAHAN] Menarik daftar Materi/SOP untuk ditampilkan di form
$subjects = \App\Models\Subject::orderBy('name', 'asc')->get();
return view('pages.admin.employee.create', compact(
'departments', 'positions', 'trainingMatrices', 'deptPosMapping', 'existingInitials'
'departments', 'positions', 'trainingMatrices', 'deptPosMapping', 'existingInitials', 'subjects'
));
}
@@ -112,6 +115,7 @@ class EmployeeController extends Controller
'position_id' => 'required|exists:positions,id',
'training_matrix_id' => 'nullable|integer',
'documents.*' => 'nullable|file|max:5120',
'trainings' => 'nullable|array', // Validasi input matrix
]);
DB::beginTransaction();
@@ -121,10 +125,11 @@ class EmployeeController extends Controller
$validated['role'] = $request->role ?? 'karyawan';
$validated['must_change_password'] = true;
$userData = Arr::except($validated, ['documents', 'is_trainer']);
$userData = Arr::except($validated, ['documents', 'is_trainer', 'trainings']);
$user = User::create($userData);
// Pengaturan Hak Akses (Role)
$rolesToAssign = [];
if ($validated['role'] == 'admin') {
$rolesToAssign[] = 'admin';
@@ -142,6 +147,18 @@ class EmployeeController extends Controller
$user->assignRole(array_unique($rolesToAssign));
// [TAMBAHAN] Menyimpan Training Matrix ke tabel Pivot (employee_subject)
if ($request->has('trainings')) {
$matrixData = [];
foreach ($request->trainings as $subjectId => $training) {
if (isset($training['selected']) && $training['selected'] == 1) {
$matrixData[$subjectId] = ['status' => $training['status']];
}
}
$user->trainings()->sync($matrixData);
}
// Menyimpan Dokumen
if ($request->hasFile('documents')) {
foreach ($request->file('documents') as $file) {
$fileName = time() . '_' . str_replace(' ', '_', $file->getClientOriginalName());
@@ -167,7 +184,6 @@ class EmployeeController extends Controller
DB::commit();
// FIX: Menggunakan rute jamak (employees)
return redirect()->route('admin.employees.index')
->with('success', "Data Karyawan {$user->first_name} berhasil ditambahkan! Password default: Karyawan123!");
@@ -179,12 +195,16 @@ class EmployeeController extends Controller
public function show(User $employee)
{
$employee->load(['department', 'position', 'roles']);
// [TAMBAHAN] Memuat relasi 'trainings' agar matrix terlihat di halaman Detail
$employee->load(['department', 'position', 'roles', 'trainings']);
return view('pages.admin.employee.show', compact('employee'));
}
public function edit(User $employee)
{
// [TAMBAHAN] Memuat relasi trainings yang sudah dimiliki karyawan
$employee->load('trainings');
$departments = Department::with('positions')->orderBy('name', 'asc')->get();
$positions = Position::all();
@@ -197,7 +217,10 @@ class EmployeeController extends Controller
$marketingDeptIds = Department::where('name', 'LIKE', '%MKT%')->orWhere('name', 'LIKE', '%MARKETING%')->pluck('id');
$trainingMatrices = TrainingMatrix::whereIn('department_id', $marketingDeptIds)->get();
return view('pages.admin.employee.edit', compact('employee', 'departments', 'positions', 'trainingMatrices', 'deptPosMapping'));
// [TAMBAHAN] Menarik daftar semua Materi/SOP
$subjects = \App\Models\Subject::orderBy('name', 'asc')->get();
return view('pages.admin.employee.edit', compact('employee', 'departments', 'positions', 'trainingMatrices', 'deptPosMapping', 'subjects'));
}
public function update(Request $request, User $employee)
@@ -219,6 +242,7 @@ class EmployeeController extends Controller
'position_id' => 'required|exists:positions,id',
'training_matrix_id' => 'nullable|integer',
'is_active' => 'nullable|boolean',
'trainings' => 'nullable|array', // Validasi input matrix
]);
DB::beginTransaction();
@@ -228,10 +252,11 @@ class EmployeeController extends Controller
$validated['password'] = Hash::make($request->password);
}
$userData = Arr::except($validated, ['is_trainer', 'is_active']);
$userData = Arr::except($validated, ['is_trainer', 'is_active', 'trainings']);
$userData['is_active'] = $request->has('is_active');
$employee->update($userData);
// Perbarui Hak Akses (Role)
$rolesToAssign = [];
$inputRole = $validated['role'] ?? 'karyawan';
@@ -246,6 +271,22 @@ class EmployeeController extends Controller
$employee->syncRoles(array_unique($rolesToAssign));
// [TAMBAHAN] Memperbarui Training Matrix
if ($request->has('trainings')) {
$matrixData = [];
foreach ($request->trainings as $subjectId => $training) {
// Cek jika dicentang
if (isset($training['selected']) && $training['selected'] == 1) {
$matrixData[$subjectId] = ['status' => $training['status']];
}
}
// sync() akan secara otomatis menghapus yang tidak dicentang dan menambah/memperbarui yang dicentang
$employee->trainings()->sync($matrixData);
} else {
// Jika tidak ada materi yang dicentang sama sekali, kosongkan riwayat trainingnya
$employee->trainings()->detach();
}
DB::table('audit_trails')->insert([
'user_id' => auth()->id(),
'action' => 'Update Employee',
@@ -256,7 +297,6 @@ class EmployeeController extends Controller
DB::commit();
// FIX: Menggunakan rute jamak (employees)
return redirect()->route('admin.employees.index')->with('success', "Data Karyawan {$employee->first_name} berhasil diperbarui.");
} catch (\Exception $e) {
@@ -264,7 +304,7 @@ class EmployeeController extends Controller
return back()->with('error', 'Gagal memperbarui data! ' . $e->getMessage())->withInput();
}
}
public function destroy(User $employee)
{
if ($employee->hasRole('admin')) {