get(); if ($companies->isEmpty()) { $this->command->warn('No company users found. Please run DefaultCompanySeeder first.'); return; } foreach ($companies as $company) { // Get all employee users for this company $employeeUsers = User::where('type', 'employee') ->where('created_by', $company->id) ->get(); if ($employeeUsers->isEmpty()) { $this->command->warn('No employee users found for company: ' . $company->name . '. Please run DefaultCompanyUserSeeder first.'); continue; } // Get company branches, departments, and designations $branches = Branch::where('created_by', $company->id)->get(); $departments = Department::where('created_by', $company->id)->get(); $designations = Designation::where('created_by', $company->id)->get(); foreach ($employeeUsers as $employeeUser) { // Check if employee record already exists if (Employee::where('user_id', $employeeUser->id)->exists()) { continue; } // Generate unique employee ID do { $employeeId = 'EMP' . str_pad(rand(1, 9999), 4, '0', STR_PAD_LEFT); } while (Employee::where('employee_id', $employeeId)->exists()); // Select random branch, department, and designation $branch = $branches->isNotEmpty() ? $branches->random() : null; $department = $departments->isNotEmpty() ? $departments->random() : null; $designation = $designations->isNotEmpty() ? $designations->random() : null; try { Employee::create([ // Basic Information 'employee_id' => $employeeId, 'phone' => $faker->phoneNumber, 'date_of_birth' => $faker->dateTimeBetween('-60 years', '-22 years')->format('Y-m-d'), 'gender' => $faker->randomElement(['male', 'female']), // Employment Details 'branch_id' => $branch?->id, 'department_id' => $department?->id, 'designation_id' => $designation?->id, 'shift_id' => null, // Will be set when shift seeder runs 'attendance_policy_id' => null, // Will be set when attendance policy seeder runs 'date_of_joining' => $faker->dateTimeBetween('-2 years', 'now')->format('Y-m-d'), 'employment_type' => $faker->randomElement(['Full-time', 'Part-time', 'Contract', 'Temporary']), // Contact Information 'address_line_1' => $faker->streetAddress, 'address_line_2' => $faker->optional()->secondaryAddress, 'city' => $faker->city, 'state' => $faker->state, 'country' => $faker->country, 'postal_code' => $faker->postcode, 'emergency_contact_name' => $faker->name, 'emergency_contact_relationship' => $faker->randomElement(['Father', 'Mother', 'Spouse', 'Brother', 'Sister', 'Friend']), 'emergency_contact_number' => $faker->phoneNumber, // Banking Information 'bank_name' => $faker->randomElement(['State Bank', 'HDFC Bank', 'ICICI Bank', 'Axis Bank', 'Kotak Bank']), 'account_holder_name' => $employeeUser->name, 'account_number' => $faker->numerify('##########'), 'bank_identifier_code' => $faker->regexify('[A-Z]{4}[0-9]{7}'), 'bank_branch' => $faker->city . ' Branch', 'tax_payer_id' => $faker->regexify('[A-Z]{5}[0-9]{4}[A-Z]{1}'), // System fields 'user_id' => $employeeUser->id, 'created_by' => $company->id, ]); // Create employee documents $this->createEmployeeDocuments($employeeUser, $company, $faker); } catch (\Exception $e) { $this->command->error('Failed to create employee record for user: ' . $employeeUser->name . ' in company: ' . $company->name); continue; } } } $this->command->info('Employee seeder completed successfully!'); } /** * Create employee documents */ private function createEmployeeDocuments($employeeUser, $company, $faker) { // Get document types for this company $documentTypes = DocumentType::where('created_by', $company->id)->get(); if ($documentTypes->isEmpty()) { return; } // Create 3-5 random documents for each employee $documentCount = rand(3, min(5, $documentTypes->count())); $selectedDocumentTypes = $documentTypes->random($documentCount); foreach ($selectedDocumentTypes as $documentType) { try { EmployeeDocument::create([ 'employee_id' => $employeeUser->id, 'document_type_id' => $documentType->id, 'file_path' => randomImage(), 'expiry_date' => $documentType->name === 'Identity Proof' || $documentType->name === 'Medical Certificate' ? $faker->dateTimeBetween('now', '+5 years')->format('Y-m-d') : null, 'verification_status' => $faker->randomElement(['pending', 'verified', 'rejected']), 'notes' => $faker->optional(0.3)->sentence(), 'created_by' => $company->id, ]); } catch (\Exception $e) { continue; } } } }