151 lines
6.2 KiB
PHP
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!");
|
|
}
|
|
}
|