Files
HRM-System/database/seeders/EmployeeTransferSeeder.php
2026-04-13 08:16:56 +08:00

131 lines
6.4 KiB
PHP

<?php
namespace Database\Seeders;
use App\Models\EmployeeTransfer;
use App\Models\User;
use App\Models\Branch;
use App\Models\Department;
use App\Models\Designation;
use App\Models\Employee;
use Illuminate\Database\Seeder;
use Faker\Factory as Faker;
class EmployeeTransferSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
$faker = Faker::create();
// Get all companies
$companies = User::where('type', 'company')->get();
if ($companies->isEmpty()) {
$this->command->warn('No company users found. Please run DefaultCompanySeeder first.');
return;
}
// Transfer reasons
$transferReasons = [
'Business Expansion' => 'Employee transfer required to support business expansion and new market opportunities in different location.',
'Skill Utilization' => 'Transfer to better utilize employee skills and expertise in department that requires specialized knowledge.',
'Career Development' => 'Transfer provides employee with career growth opportunities and exposure to different business functions.',
'Operational Requirements' => 'Transfer necessary to meet operational requirements and maintain adequate staffing levels across locations.',
'Employee Request' => 'Transfer approved based on employee personal request for relocation due to family or personal circumstances.',
'Project Assignment' => 'Employee assigned to specific project that requires presence at different branch or department location.',
'Performance Improvement' => 'Transfer to environment better suited for employee development and performance improvement.',
'Restructuring' => 'Transfer part of organizational restructuring to optimize resources and improve operational efficiency.',
'Training Opportunity' => 'Transfer provides access to specialized training and development programs available at different location.',
'Succession Planning' => 'Transfer supports succession planning initiatives and leadership development across organization.'
];
foreach ($companies as $company) {
// Get employees for this company
$employees = User::where('type', 'employee')
->where('created_by', $company->id)
->get();
if ($employees->isEmpty()) {
$this->command->warn('No employees found for company: ' . $company->name . '. Please run EmployeeSeeder first.');
continue;
}
// Get company resources
$branches = Branch::where('created_by', $company->id)->get();
$departments = Department::where('created_by', $company->id)->get();
$designations = Designation::where('created_by', $company->id)->get();
if ($branches->isEmpty() || $departments->isEmpty() || $designations->isEmpty()) {
$this->command->warn('Missing branches, departments, or designations for company: ' . $company->name);
continue;
}
// Get managers/HR for approval
$approvers = User::whereIn('type', ['manager', 'hr'])
->where('created_by', $company->id)
->get();
// Create 3-7 transfers for this company
$transferCount = rand(3, 7);
for ($i = 0; $i < $transferCount; $i++) {
$employee = $employees->take(5)->random();
// Get employee's current details from employee table
$employeeRecord = Employee::where('user_id', $employee->id)->first();
if (!$employeeRecord) {
continue; // Skip if no employee record found
}
$fromBranch = $employeeRecord->branch_id ? Branch::find($employeeRecord->branch_id) : $branches->random();
$fromDepartment = $employeeRecord->department_id ? Department::find($employeeRecord->department_id) : $departments->random();
$fromDesignation = $employeeRecord->designation_id ? Designation::find($employeeRecord->designation_id) : $designations->random();
// Select different branch/department/designation for transfer
$toBranch = $branches->where('id', '!=', $fromBranch?->id)->random();
$toDepartment = $departments->where('id', '!=', $fromDepartment?->id)->random();
$toDesignation = $designations->where('id', '!=', $fromDesignation?->id)->random();
$transferDate = $faker->dateTimeBetween('-6 months', 'now');
$effectiveDate = $faker->dateTimeBetween($transferDate, '+30 days');
$reasonKey = $faker->randomElement(array_keys($transferReasons));
$reason = $transferReasons[$reasonKey];
$status = $faker->randomElement(['pending', 'approved', 'rejected']);
$approver = $approvers->isNotEmpty() ? $approvers->random() : null;
try {
EmployeeTransfer::create([
'employee_id' => $employee->id,
'from_branch_id' => $fromBranch?->id,
'to_branch_id' => $toBranch?->id,
'from_department_id' => $fromDepartment?->id,
'to_department_id' => $toDepartment?->id,
'from_designation_id' => $fromDesignation?->id,
'to_designation_id' => $toDesignation?->id,
'transfer_date' => $transferDate->format('Y-m-d'),
'effective_date' => $effectiveDate->format('Y-m-d'),
'reason' => $reason,
'status' => $status,
'documents' => randomImage(),
'approved_by' => $status === 'approved' ? $approver?->id : null,
'approved_at' => $status === 'approved' ? $faker->dateTimeBetween($transferDate, 'now') : null,
'notes' => $faker->optional(0.6)->sentence(10),
'created_by' => $company->id,
]);
} catch (\Exception $e) {
$this->command->error('Failed to create transfer for employee: ' . $employee->name . ' in company: ' . $company->name);
continue;
}
}
}
$this->command->info('EmployeeTransfer seeder completed successfully!');
}
}