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

128 lines
5.1 KiB
PHP

<?php
namespace Database\Seeders;
use App\Models\CandidateOnboarding;
use App\Models\Candidate;
use App\Models\OnboardingChecklist;
use App\Models\User;
use Illuminate\Database\Seeder;
class CandidateOnboardingSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
// Get all companies
$companies = User::where('type', 'company')->get();
if ($companies->isEmpty()) {
$this->command->warn('No company users found. Please run DefaultCompanySeeder first.');
return;
}
// Fixed onboarding statuses for consistent data
$onboardingStatuses = ['Completed', 'In Progress', 'Completed', 'Pending', 'Completed', 'In Progress', 'Completed', 'Pending', 'Completed', 'In Progress'];
foreach ($companies as $company) {
// Get employees for this company
$employees = User::where('type', 'employee')
->where('created_by', $company->id)
->where('status', 'active')
->get();
if ($employees->isEmpty()) {
$this->command->warn('No employees found for company: ' . $company->name . '. Please run EmployeeSeeder first.');
continue;
}
// Get onboarding checklists for this company
$onboardingChecklists = OnboardingChecklist::where('created_by', $company->id)->get();
if ($onboardingChecklists->isEmpty()) {
$this->command->warn('No onboarding checklists found for company: ' . $company->name . '. Please run OnboardingChecklistSeeder first.');
continue;
}
// Get employees for buddy assignment (excluding current employee)
$buddyEmployees = User::where('type', 'employee')->where('created_by', $company->id)->get();
foreach ($employees as $index => $employee) {
// Check if onboarding already exists for this employee
if (CandidateOnboarding::where('employee_id', $employee->id)->where('created_by', $company->id)->exists()) {
continue;
}
// Select checklist based on job title or use default
$checklist = $this->selectChecklistForEmployee($employee, $onboardingChecklists);
$buddyEmployee = $buddyEmployees->where('id', '!=', $employee->id)->random();
$status = $onboardingStatuses[$index % 10];
$startDate = date('Y-m-d', strtotime('-' . ($index + 1) . ' days'));
try {
CandidateOnboarding::create([
'candidate_id' => null,
'employee_id' => $employee->id,
'checklist_id' => $checklist->id,
'start_date' => $startDate,
'buddy_employee_id' => $buddyEmployee?->id,
'status' => $status,
'created_by' => $company->id,
]);
} catch (\Exception $e) {
$this->command->error('Failed to create onboarding for employee: ' . $employee->name . ' in company: ' . $company->name);
continue;
}
}
}
$this->command->info('CandidateOnboarding seeder completed successfully!');
}
/**
* Select appropriate checklist based on employee's job title
*/
private function selectChecklistForEmployee($employee, $checklists)
{
$jobTitle = strtolower($employee->employee->designation->name ?? '');
// Match checklist based on job title keywords
if (str_contains($jobTitle, 'developer') || str_contains($jobTitle, 'engineer') || str_contains($jobTitle, 'devops')) {
$checklist = $checklists->where('name', 'Technical Team Onboarding')->first();
if ($checklist)
return $checklist;
}
if (str_contains($jobTitle, 'manager') || str_contains($jobTitle, 'director') || str_contains($jobTitle, 'lead')) {
$checklist = $checklists->where('name', 'Management Level Onboarding')->first();
if ($checklist)
return $checklist;
}
if (str_contains($jobTitle, 'sales') || str_contains($jobTitle, 'business development')) {
$checklist = $checklists->where('name', 'Sales Team Onboarding')->first();
if ($checklist)
return $checklist;
}
if (str_contains($jobTitle, 'customer') || str_contains($jobTitle, 'support')) {
$checklist = $checklists->where('name', 'Customer Service Onboarding')->first();
if ($checklist)
return $checklist;
}
if (str_contains($jobTitle, 'intern')) {
$checklist = $checklists->where('name', 'Intern Onboarding Program')->first();
if ($checklist)
return $checklist;
}
// Default to standard onboarding or first available checklist
$defaultChecklist = $checklists->where('is_default', true)->first();
return $defaultChecklist ?: $checklists->first();
}
}