Users -> Sinkronisasi Jabatan -> Bank Soal -> History Test'; public function handle() { $this->info('Memulai pemindahan data dari CI3 Lama ke Laravel 13 V2...'); // 1. Eksekusi Master Data Terlebih Dahulu $this->migrateDepartments(); $this->migratePositions(); $this->migrateDepartmentPositions(); // 2. Eksekusi Data User $this->migrateStaffToUsers(); $this->migrateStudentsToUsers(); // 3. Sinkronisasi Departemen & Posisi ke User $this->syncUserDepartmentAndPosition(); // 4. Eksekusi Ujian & Hasil $this->migrateQuestions(); $this->migrateExamHistory(); $this->info('Sukses! Semua data Master, Karyawan, Sinkronisasi Jabatan, Bank Soal, dan Histori Test berhasil dipindahkan.'); } /** * TAHAP 1A: Memindahkan data `sections` (Lama) ke `departments` (Baru) */ /** * TAHAP 1A: Memindahkan data `sections` (Lama) ke `departments` (Baru) */ private function migrateDepartments() { $this->warn('1A. Menarik data Departemen (Sections)...'); $oldSections = DB::table('lmsv2-old.sections')->get(); $bar = $this->output->createProgressBar(count($oldSections)); $bar->start(); foreach ($oldSections as $section) { // Generate kode otomatis untuk Departments karena kolom 'code' WAJIB ada $code = 'DPT-' . str_pad($section->id, 3, '0', STR_PAD_LEFT); DB::table('lmsv2.departments')->updateOrInsert( ['id' => $section->id], [ 'code' => $code, // Tabel ini punya kolom 'code' 'name' => trim($section->section), 'created_at' => $section->created_at ?? now(), 'updated_at' => now(), ] ); $bar->advance(); } $bar->finish(); $this->newLine(); } /** * TAHAP 1B: Memindahkan data `classes` (Lama) ke `positions` (Baru) */ private function migratePositions() { $this->warn('1B. Menarik data Posisi/Jabatan (Classes)...'); $oldClasses = DB::table('lmsv2-old.classes')->get(); $bar = $this->output->createProgressBar(count($oldClasses)); $bar->start(); foreach ($oldClasses as $class) { DB::table('lmsv2.positions')->updateOrInsert( ['id' => $class->id], [ // Tabel ini HANYA punya id, name, created_at, updated_at // (Pastikan Anda sudah menjalankan Langkah 1 untuk menambah kolom 'name') 'name' => trim($class->class), 'created_at' => $class->created_at ?? now(), 'updated_at' => now(), ] ); $bar->advance(); } $bar->finish(); $this->newLine(); } /** * TAHAP 2A: Memindahkan data `staff` (Trainer/Admin) ke tabel `users` */ private function migrateStaffToUsers() { $this->warn('2A. Menarik data Staff (Trainer/Admin)...'); $oldStaffs = DB::connection('mysql_old')->table('staff')->get(); $bar = $this->output->createProgressBar(count($oldStaffs)); $bar->start(); foreach ($oldStaffs as $staff) { $email = !empty($staff->email) ? $staff->email : $staff->employee_id . '@tunggal-pharma.com'; $gender = null; if (strtolower($staff->gender) == 'male') $gender = 'L'; if (strtolower($staff->gender) == 'female') $gender = 'P'; User::updateOrCreate( ['email' => $email], [ 'nik' => $staff->employee_id, 'first_name' => trim($staff->name), 'last_name' => trim($staff->surname), 'gender' => $gender, 'phone' => $staff->contact_no, 'password' => Hash::make('Tunggal123!'), 'role' => 'trainer', 'old_id' => $staff->id, 'old_password_hash' => $staff->password, ] ); $bar->advance(); } $bar->finish(); $this->newLine(); } /** * TAHAP 2B: Memindahkan data `students` (Karyawan) ke tabel `users` */ private function migrateStudentsToUsers() { $this->warn('2B. Menarik data Karyawan (Students)...'); $oldStudents = DB::connection('mysql_old')->table('students')->get(); $bar = $this->output->createProgressBar(count($oldStudents)); $bar->start(); foreach ($oldStudents as $student) { $email = !empty($student->email) ? $student->email : $student->admission_no . '@tunggal-pharma.com'; $gender = null; if (strtolower($student->gender) == 'male') $gender = 'L'; if (strtolower($student->gender) == 'female') $gender = 'P'; User::updateOrCreate( ['email' => $email], [ 'nik' => $student->admission_no, 'first_name' => trim($student->firstname), 'last_name' => trim($student->lastname), 'gender' => $gender, 'phone' => $student->mobileno, 'date_of_birth' => $student->dob, 'password' => Hash::make('Karyawan123!'), 'role' => 'karyawan', 'old_id' => $student->id, ] ); $bar->advance(); } $bar->finish(); $this->newLine(); } /** * TAHAP 3: MENGHUBUNGKAN USER DENGAN DEPARTEMEN & POSISI */ private function syncUserDepartmentAndPosition() { $this->warn('3. Menyinkronkan Karyawan dengan Departemen & Posisi...'); // Membaca relasi dari tabel student_session di DB lama $oldSessions = DB::connection('mysql_old')->table('student_session')->get(); $bar = $this->output->createProgressBar(count($oldSessions)); $bar->start(); foreach ($oldSessions as $session) { // Cari user di database baru berdasarkan old_id $user = User::where('old_id', $session->student_id) ->where('role', 'karyawan') ->first(); if ($user) { // Update jabatan dan departemen // Asumsi: ID Departemen dan Posisi sama dengan ID Sections dan Classes dari DB Lama $user->update([ 'position_id' => $session->class_id, 'department_id' => $session->section_id, ]); } $bar->advance(); } $bar->finish(); $this->newLine(); } /** * TAHAP 4A: Memindahkan data Bank Soal */ private function migrateQuestions() { $this->warn('4A. Menarik data Bank Soal...'); $oldQuestions = DB::connection('mysql_old')->table('questions')->get(); $bar = $this->output->createProgressBar(count($oldQuestions)); $bar->start(); foreach ($oldQuestions as $q) { DB::table('question_banks')->updateOrInsert( ['old_id' => $q->id], [ 'question_text' => $q->question, 'option_a' => $q->opt_a, 'option_b' => $q->opt_b, 'option_c' => $q->opt_c, 'option_d' => $q->opt_d, 'option_e' => $q->opt_e, 'correct_answer' => $q->correct, ] ); $bar->advance(); } $bar->finish(); $this->newLine(); } /** * TAHAP 4B: Memindahkan data Ujian & Hasil Historis Karyawan */ private function migrateExamHistory() { $this->warn('4B. Menarik data Historis Nilai Ujian...'); // Tarik Master Ujian $oldExams = DB::connection('mysql_old')->table('onlineexam')->get(); foreach ($oldExams as $exam) { DB::table('exams')->updateOrInsert( ['old_id' => $exam->id], [ 'title' => $exam->exam, 'duration' => $exam->duration, 'passing_percentage' => $exam->passing_percentage, ] ); } // Tarik Hasil Test Karyawan $oldResults = DB::connection('mysql_old') ->table('onlineexam_students') ->join('student_session', 'onlineexam_students.student_session_id', '=', 'student_session.id') ->join('students', 'student_session.student_id', '=', 'students.id') ->select('onlineexam_students.*', 'students.id as old_student_id') ->get(); $bar = $this->output->createProgressBar(count($oldResults)); $bar->start(); foreach ($oldResults as $result) { $user = DB::table('users')->where('old_id', $result->old_student_id)->where('role', 'karyawan')->first(); $exam = DB::table('exams')->where('old_id', $result->onlineexam_id)->first(); if ($user && $exam) { DB::table('exam_results')->updateOrInsert( [ 'user_id' => $user->id, 'exam_id' => $exam->id ], [ 'is_attempted' => $result->is_attempted, 'created_at' => $result->created_at, ] ); } $bar->advance(); } $bar->finish(); $this->newLine(); } /** * TAHAP 1C: Memindahkan pemetaan class_sections (Lama) ke department_position (Baru) */ private function migrateDepartmentPositions() { $this->warn('1C. Menarik data Relasi Departemen & Posisi (Class Sections)...'); $oldRelations = \Illuminate\Support\Facades\DB::table('lmsv2-old.class_sections')->get(); $bar = $this->output->createProgressBar(count($oldRelations)); $bar->start(); foreach ($oldRelations as $relation) { // Asumsi kolom lama bernama section_id dan class_id \Illuminate\Support\Facades\DB::table('lmsv2.department_position')->updateOrInsert( [ 'department_id' => $relation->section_id, 'position_id' => $relation->class_id, ] ); $bar->advance(); } $bar->finish(); $this->newLine(); } }