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

178 lines
11 KiB
PHP

<?php
namespace Database\Seeders;
use App\Models\JobRequisition;
use App\Models\JobCategory;
use App\Models\Department;
use App\Models\User;
use Illuminate\Database\Seeder;
class JobRequisitionSeeder 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;
}
$currentYear = date('Y');
// Fixed job requisitions by category for consistent data
$requisitionsByCategory = [
'Information Technology' => [
['title' => 'Senior Software Developer', 'positions' => 2, 'budget_min' => 80000, 'budget_max' => 120000, 'priority' => 'High', 'status' => 'Approved'],
['title' => 'DevOps Engineer', 'positions' => 1, 'budget_min' => 70000, 'budget_max' => 100000, 'priority' => 'Medium', 'status' => 'Pending Approval'],
['title' => 'UI/UX Designer', 'positions' => 1, 'budget_min' => 60000, 'budget_max' => 85000, 'priority' => 'Medium', 'status' => 'Approved']
],
'Sales and Marketing' => [
['title' => 'Sales Manager', 'positions' => 1, 'budget_min' => 65000, 'budget_max' => 90000, 'priority' => 'High', 'status' => 'Approved'],
['title' => 'Digital Marketing Specialist', 'positions' => 2, 'budget_min' => 45000, 'budget_max' => 65000, 'priority' => 'Medium', 'status' => 'Draft'],
['title' => 'Business Development Executive', 'positions' => 3, 'budget_min' => 50000, 'budget_max' => 70000, 'priority' => 'High', 'status' => 'Approved']
],
'Human Resources' => [
['title' => 'HR Business Partner', 'positions' => 1, 'budget_min' => 70000, 'budget_max' => 95000, 'priority' => 'Medium', 'status' => 'Approved'],
['title' => 'Talent Acquisition Specialist', 'positions' => 2, 'budget_min' => 55000, 'budget_max' => 75000, 'priority' => 'High', 'status' => 'Pending Approval']
],
'Finance and Accounting' => [
['title' => 'Financial Analyst', 'positions' => 1, 'budget_min' => 60000, 'budget_max' => 80000, 'priority' => 'Medium', 'status' => 'Approved'],
['title' => 'Senior Accountant', 'positions' => 1, 'budget_min' => 55000, 'budget_max' => 75000, 'priority' => 'Low', 'status' => 'On Hold']
],
'Operations and Management' => [
['title' => 'Operations Manager', 'positions' => 1, 'budget_min' => 85000, 'budget_max' => 110000, 'priority' => 'High', 'status' => 'Approved'],
['title' => 'Project Manager', 'positions' => 2, 'budget_min' => 75000, 'budget_max' => 95000, 'priority' => 'Medium', 'status' => 'Approved']
],
'Customer Service' => [
['title' => 'Customer Success Manager', 'positions' => 1, 'budget_min' => 50000, 'budget_max' => 70000, 'priority' => 'Medium', 'status' => 'Approved'],
['title' => 'Customer Support Representative', 'positions' => 4, 'budget_min' => 35000, 'budget_max' => 45000, 'priority' => 'High', 'status' => 'Approved']
]
];
// Fixed job details
$jobDetails = [
'Senior Software Developer' => [
'skills' => 'JavaScript, React, Node.js, Python, SQL, Git, Agile methodologies',
'education' => 'Bachelor\'s degree in Computer Science or related field',
'experience' => '5+ years of software development experience',
'description' => 'We are seeking an experienced Senior Software Developer to join our dynamic development team',
'responsibilities' => 'Design and develop scalable web applications, mentor junior developers, participate in code reviews, collaborate with cross-functional teams'
],
'DevOps Engineer' => [
'skills' => 'AWS, Docker, Kubernetes, Jenkins, Terraform, Linux, CI/CD pipelines',
'education' => 'Bachelor\'s degree in Computer Science or Engineering',
'experience' => '3+ years of DevOps or system administration experience',
'description' => 'Looking for a skilled DevOps Engineer to manage our cloud infrastructure and deployment processes',
'responsibilities' => 'Manage cloud infrastructure, implement CI/CD pipelines, monitor system performance, ensure security compliance'
],
'Sales Manager' => [
'skills' => 'Sales leadership, CRM software, negotiation, team management, market analysis',
'education' => 'Bachelor\'s degree in Business, Marketing, or related field',
'experience' => '5+ years of sales experience with 2+ years in management',
'description' => 'Seeking an experienced Sales Manager to lead our sales team and drive revenue growth',
'responsibilities' => 'Lead sales team, develop sales strategies, manage key accounts, analyze market trends, achieve sales targets'
],
'HR Business Partner' => [
'skills' => 'HR strategy, employee relations, performance management, organizational development',
'education' => 'Bachelor\'s degree in Human Resources, Business, or Psychology',
'experience' => '4+ years of HR experience with business partnering focus',
'description' => 'We need an HR Business Partner to support our business units and drive HR initiatives',
'responsibilities' => 'Partner with business leaders, manage employee relations, develop HR policies, support organizational change'
],
'Financial Analyst' => [
'skills' => 'Financial modeling, Excel, SQL, data analysis, budgeting, forecasting',
'education' => 'Bachelor\'s degree in Finance, Accounting, or Economics',
'experience' => '2-4 years of financial analysis experience',
'description' => 'Looking for a detail-oriented Financial Analyst to support our finance team',
'responsibilities' => 'Prepare financial reports, conduct variance analysis, support budgeting process, provide financial insights'
],
'Operations Manager' => [
'skills' => 'Operations management, process improvement, team leadership, project management',
'education' => 'Bachelor\'s degree in Business, Operations, or Engineering',
'experience' => '5+ years of operations management experience',
'description' => 'Seeking an Operations Manager to optimize our business processes and operations',
'responsibilities' => 'Manage daily operations, improve processes, lead operational teams, ensure quality standards'
]
];
foreach ($companies as $company) {
// Get job categories for this company
$jobCategories = JobCategory::where('created_by', $company->id)->get();
if ($jobCategories->isEmpty()) {
$this->command->warn('No job categories found for company: ' . $company->name . '. Please run JobCategorySeeder first.');
continue;
}
// Get departments for this company
$departments = Department::where('created_by', $company->id)->get();
// Get managers/HR for approval
$approvers = User::whereIn('type', ['manager', 'hr'])->where('created_by', $company->id)->get();
$approver = $approvers->isNotEmpty() ? $approvers->first() : null;
$requisitionCounter = ($company->id - 1) * 100 + 1;
foreach ($jobCategories as $category) {
$categoryRequisitions = $requisitionsByCategory[$category->name] ?? [];
foreach ($categoryRequisitions as $reqData) {
$requisitionCode = 'REQ-' . $currentYear . '-' . str_pad($requisitionCounter, 4, '0', STR_PAD_LEFT);
// Check if requisition already exists
if (JobRequisition::where('requisition_code', $requisitionCode)->exists()) {
$requisitionCounter++;
continue;
}
$selectedDepartments = $departments->take(5);
$department = $selectedDepartments->isNotEmpty() ? $selectedDepartments->random() : null;
$details = $jobDetails[$reqData['title']] ?? [
'skills' => 'Relevant skills for the position',
'education' => 'Bachelor\'s degree or equivalent',
'experience' => '2+ years of relevant experience',
'description' => 'We are looking for a qualified candidate for this position',
'responsibilities' => 'Perform duties as assigned and contribute to team success'
];
try {
JobRequisition::create([
'requisition_code' => $requisitionCode,
'title' => $reqData['title'],
'job_category_id' => $category->id,
'department_id' => $department?->id,
'positions_count' => $reqData['positions'],
'budget_min' => $reqData['budget_min'],
'budget_max' => $reqData['budget_max'],
'skills_required' => $details['skills'],
'education_required' => $details['education'],
'experience_required' => $details['experience'],
'description' => $details['description'],
'responsibilities' => $details['responsibilities'],
'status' => $reqData['status'],
'approved_by' => $reqData['status'] === 'Approved' ? $approver?->id : null,
'approval_date' => $reqData['status'] === 'Approved' ? now() : null,
'priority' => $reqData['priority'],
'created_by' => $company->id,
]);
$requisitionCounter++;
} catch (\Exception $e) {
$this->command->error('Failed to create job requisition: ' . $reqData['title'] . ' for company: ' . $company->name);
$requisitionCounter++;
continue;
}
}
}
}
$this->command->info('JobRequisition seeder completed successfully!');
}
}