Files
HRM-System/app/Console/Commands/SyncLegacyLeaves.php
2026-04-20 12:39:39 +08:00

151 lines
6.2 KiB
PHP

<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use App\Models\User;
use App\Models\LeaveType;
use App\Models\LeavePolicy;
use App\Models\LeaveBalance;
use App\Models\LeaveApplication;
use Carbon\Carbon;
class SyncLegacyLeaves extends Command
{
protected $signature = 'import:legacy-leaves';
protected $description = 'Migrate legacy leave data (types, balances, applications) from rame_seb.sql';
public function handle()
{
$this->info("Starting Legacy Leave Migration...");
$legacyDb = DB::connection('legacy');
// 1. Map Users by Email
$this->info("Building User Map...");
$legacyUsers = $legacyDb->table('users')->get();
$userMap = []; // legacy_user_id => current_user_id
foreach ($legacyUsers as $legacyUser) {
$localUser = User::where('email', $legacyUser->email)->first();
if ($localUser) {
$userMap[$legacyUser->id] = $localUser->id;
}
}
$this->info("Mapped " . count($userMap) . " users.");
// 2. Migrate Leave Types & Create Default Policies
$this->info("Migrating Leave Types and creating Policies...");
$legacyTypes = $legacyDb->table('leave_types')->get();
$typeMap = []; // legacy_type_id => current_type_id
$policyMap = []; // legacy_type_id => current_policy_id
foreach ($legacyTypes as $legacyType) {
$newType = LeaveType::updateOrCreate(
['name' => $legacyType->name],
[
'description' => $legacyType->notes ?? "Legacy " . $legacyType->name,
'max_days_per_year' => $legacyType->max_accrual_limit ?? 15,
'is_paid' => $legacyType->is_paid,
'color' => '#3B82F6', // Default blue
'status' => 'active',
'created_by' => 1,
]
);
$typeMap[$legacyType->id] = $newType->id;
// Create a default policy for this type if not exists
$newPolicy = LeavePolicy::updateOrCreate(
['leave_type_id' => $newType->id],
[
'name' => "Default " . $newType->name . " Policy",
'description' => "Auto-generated policy for legacy " . $newType->name,
'accrual_type' => 'yearly',
'accrual_rate' => 0,
'carry_forward_limit' => 0,
'min_days_per_application' => 1,
'max_days_per_application' => 30,
'requires_approval' => true,
'status' => 'active',
'created_by' => 1,
]
);
$policyMap[$legacyType->id] = $newPolicy->id;
}
// 3. Migrate Leave Balances
$this->info("Migrating Leave Balances...");
$legacyBalances = $legacyDb->table('users_available_leaves')->get();
$balanceCount = 0;
foreach ($legacyBalances as $legacyBalance) {
if (!isset($userMap[$legacyBalance->user_id]) || !isset($typeMap[$legacyBalance->leave_type_id])) {
continue;
}
LeaveBalance::updateOrCreate(
[
'employee_id' => $userMap[$legacyBalance->user_id],
'leave_type_id' => $typeMap[$legacyBalance->leave_type_id],
'year' => $legacyBalance->year,
],
[
'leave_policy_id' => $policyMap[$legacyBalance->leave_type_id],
'allocated_days' => $legacyBalance->entitled_leaves,
'used_days' => $legacyBalance->used_leaves,
'remaining_days' => $legacyBalance->available_leaves,
'carried_forward' => $legacyBalance->carried_forward_leaves,
'manual_adjustment' => $legacyBalance->additional_leaves,
'created_by' => 1,
]
);
$balanceCount++;
}
$this->info("Migrated $balanceCount leave balances.");
// 4. Migrate Leave Applications
$this->info("Migrating Leave Applications...");
$legacyApplications = $legacyDb->table('leave_requests')->get();
$appCount = 0;
foreach ($legacyApplications as $legacyApp) {
if (!isset($userMap[$legacyApp->user_id]) || !isset($typeMap[$legacyApp->leave_type_id])) {
continue;
}
// Map Statuses
$status = 'pending';
if ($legacyApp->status === 'approved') $status = 'approved';
if ($legacyApp->status === 'rejected') $status = 'rejected';
if ($legacyApp->status === 'cancelled') $status = 'rejected'; // Mapping cancelled to rejected for simplicity in new schema
LeaveApplication::updateOrCreate(
[
'id' => $legacyApp->id + 1000, // Offset IDs to avoid conflicts with manual entries
],
[
'employee_id' => $userMap[$legacyApp->user_id],
'leave_type_id' => $typeMap[$legacyApp->leave_type_id],
'leave_policy_id' => $policyMap[$legacyApp->leave_type_id],
'start_date' => $legacyApp->from_date,
'end_date' => $legacyApp->to_date,
'total_days' => $legacyApp->total_days,
'reason' => $legacyApp->user_notes ?? "Legacy Leave Request",
'status' => $status,
'manager_comments' => $legacyApp->approval_notes,
'approved_by' => isset($userMap[$legacyApp->approved_by_id]) ? $userMap[$legacyApp->approved_by_id] : null,
'approved_at' => $legacyApp->approved_at,
'created_by' => 1,
'created_at' => $legacyApp->created_at,
'updated_at' => $legacyApp->updated_at,
]
);
$appCount++;
}
$this->info("Migrated $appCount leave applications.");
$this->info("Leave Migration Completed Successfully!");
}
}