59 lines
2.0 KiB
PHP
59 lines
2.0 KiB
PHP
<?php
|
|
|
|
namespace App\Console\Commands;
|
|
|
|
use Illuminate\Console\Command;
|
|
use Illuminate\Support\Facades\DB;
|
|
use App\Models\User;
|
|
use Spatie\Permission\Models\Role; // Pastikan library Role dari Spatie dipanggil
|
|
|
|
class MigrateStaffToTrainer extends Command
|
|
{
|
|
protected $signature = 'lms:migrate-trainers';
|
|
protected $description = 'Mencocokkan data staff lama dan menetapkannya sebagai Trainer & Trainee';
|
|
|
|
public function handle()
|
|
{
|
|
$this->info('Memastikan Role (Hak Akses) tersedia di database...');
|
|
|
|
// Membuat role otomatis jika belum ada di tabel 'roles'
|
|
Role::firstOrCreate(['name' => 'admin', 'guard_name' => 'web']);
|
|
Role::firstOrCreate(['name' => 'trainer', 'guard_name' => 'web']);
|
|
Role::firstOrCreate(['name' => 'trainee', 'guard_name' => 'web']);
|
|
|
|
$this->info('Memulai pencocokan data Staff (Trainer)...');
|
|
|
|
$oldStaffs = DB::table('lmsv2-old.staff')->get();
|
|
$bar = $this->output->createProgressBar(count($oldStaffs));
|
|
$bar->start();
|
|
|
|
$successCount = 0;
|
|
|
|
foreach ($oldStaffs as $staff) {
|
|
$matchedUser = null;
|
|
|
|
// Prioritas 1: Pencocokan Email
|
|
if (!empty($staff->email)) {
|
|
$matchedUser = User::where('email', $staff->email)->first();
|
|
}
|
|
|
|
// Prioritas 2: Pencocokan Nama
|
|
if (!$matchedUser && !empty($staff->name)) {
|
|
$matchedUser = User::where(DB::raw("CONCAT(first_name, ' ', COALESCE(last_name, ''))"), 'LIKE', "%{$staff->name}%")->first();
|
|
}
|
|
|
|
// Jika ketemu, tetapkan role-nya
|
|
if ($matchedUser) {
|
|
// assignRole() kini dijamin aman karena role sudah dibuat di awal script
|
|
$matchedUser->assignRole(['trainer', 'trainee']);
|
|
$successCount++;
|
|
}
|
|
|
|
$bar->advance();
|
|
}
|
|
|
|
$bar->finish();
|
|
$this->newLine();
|
|
$this->info("Selesai! {$successCount} karyawan berhasil diperbarui sebagai Trainer.");
|
|
}
|
|
} |