Files
lms-v2/app/Console/Commands/MigrateLmsData.php
T

311 lines
11 KiB
PHP
Raw Normal View History

2026-05-30 22:15:16 +07:00
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use App\Models\User;
class MigrateLmsData extends Command
{
protected $signature = 'lms:migrate-data';
protected $description = 'Migrasi komprehensif: Master Data -> 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();
}
}