76 lines
2.8 KiB
PHP
76 lines
2.8 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
namespace App\Console\Commands;
|
||
|
|
|
||
|
|
use Illuminate\Console\Command;
|
||
|
|
use Illuminate\Support\Facades\DB;
|
||
|
|
|
||
|
|
class MigrateUserInitials extends Command
|
||
|
|
{
|
||
|
|
protected $signature = 'lms:migrate-initials';
|
||
|
|
protected $description = 'Migrasi kolom roll_no dari tabel student lama dengan pencocokan Email / Nama karyawan';
|
||
|
|
|
||
|
|
public function handle()
|
||
|
|
{
|
||
|
|
$this->info('Memulai tarik data inisial (roll_no) dengan pencocokan pintar...');
|
||
|
|
|
||
|
|
// Ambil data student dari database lama yang memiliki roll_no
|
||
|
|
$oldStudents = DB::table('lmsv2-old.students')->whereNotNull('roll_no')->get();
|
||
|
|
|
||
|
|
$bar = $this->output->createProgressBar(count($oldStudents));
|
||
|
|
$bar->start();
|
||
|
|
|
||
|
|
$successCount = 0;
|
||
|
|
$failCount = 0;
|
||
|
|
|
||
|
|
foreach ($oldStudents as $oldStudent) {
|
||
|
|
// Ubah object ke array agar lebih aman saat mengecek keberadaan kolom (mencegah error jika kolom tidak ada)
|
||
|
|
$old = (array) $oldStudent;
|
||
|
|
|
||
|
|
$matchedUser = null;
|
||
|
|
|
||
|
|
// PRIORITAS 1: Cocokkan berdasarkan Email (Paling Akurat)
|
||
|
|
if (!empty($old['email'])) {
|
||
|
|
$matchedUser = DB::table('lmsv2.users')->where('email', $old['email'])->first();
|
||
|
|
}
|
||
|
|
|
||
|
|
// PRIORITAS 2: Jika email tidak cocok/kosong, cocokkan berdasarkan Nama
|
||
|
|
if (!$matchedUser) {
|
||
|
|
$query = DB::table('lmsv2.users');
|
||
|
|
|
||
|
|
// Cek apakah database lama menggunakan 'first_name' atau 'name' tunggal
|
||
|
|
if (!empty($old['first_name'])) {
|
||
|
|
$query->where('first_name', $old['first_name']);
|
||
|
|
if (!empty($old['last_name'])) {
|
||
|
|
$query->where('last_name', $old['last_name']);
|
||
|
|
}
|
||
|
|
} elseif (!empty($old['name'])) {
|
||
|
|
// Jika DB lama hanya punya 1 kolom 'name'
|
||
|
|
$query->where(DB::raw("CONCAT(first_name, ' ', COALESCE(last_name, ''))"), 'LIKE', "%{$old['name']}%");
|
||
|
|
} else {
|
||
|
|
// Tidak ada indikator nama yang bisa dicari
|
||
|
|
$query->where('id', '<', 0); // Force empty result
|
||
|
|
}
|
||
|
|
|
||
|
|
$matchedUser = $query->first();
|
||
|
|
}
|
||
|
|
|
||
|
|
// JIKA KETEMU: Update tabel users yang baru
|
||
|
|
if ($matchedUser) {
|
||
|
|
DB::table('lmsv2.users')
|
||
|
|
->where('id', $matchedUser->id) // Update berdasarkan ID baru yang ditemukan
|
||
|
|
->update(['initial' => $old['roll_no']]);
|
||
|
|
|
||
|
|
$successCount++;
|
||
|
|
} else {
|
||
|
|
$failCount++;
|
||
|
|
}
|
||
|
|
|
||
|
|
$bar->advance();
|
||
|
|
}
|
||
|
|
|
||
|
|
$bar->finish();
|
||
|
|
$this->newLine();
|
||
|
|
$this->info("Selesai! Berhasil memetakan: {$successCount} data. Tidak ditemukan: {$failCount} data.");
|
||
|
|
}
|
||
|
|
}
|