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!"); } }