Files
sam-api/database/seeders/Dummy/DummyDepartmentSeeder.php
kent be90c351fa chore(API): Seeder 파일 정리
- Dummy Seeder 파일들 정리 및 개선
- ApprovalTestDataSeeder 수정
- PositionSeeder, StockReceivingSeeder 수정

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-13 19:49:28 +09:00

135 lines
4.9 KiB
PHP

<?php
namespace Database\Seeders\Dummy;
use App\Models\Tenants\Department;
use Database\Seeders\DummyDataSeeder;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class DummyDepartmentSeeder extends Seeder
{
public function run(): void
{
$tenantId = DummyDataSeeder::TENANT_ID;
$userId = DummyDataSeeder::USER_ID;
// 기존 부서가 있으면 스킵
$existing = Department::where('tenant_id', $tenantId)->count();
if ($existing > 0) {
$this->command->info(' ⚠ departments: 이미 '.$existing.'개 존재 (스킵)');
return;
}
// 1레벨: 본부 (3개)
$divisions = [
['code' => 'DIV01', 'name' => '경영본부', 'description' => '경영 및 기획 업무'],
['code' => 'DIV02', 'name' => '기술본부', 'description' => '기술 개발 및 연구'],
['code' => 'DIV03', 'name' => '영업본부', 'description' => '영업 및 마케팅'],
];
// 2레벨: 부서 (본부별 2~3개씩)
$departments = [
'DIV01' => [
['code' => 'HR', 'name' => '인사팀', 'description' => '인사 및 채용 관리'],
['code' => 'FIN', 'name' => '재무팀', 'description' => '재무 및 회계 관리'],
['code' => 'ADM', 'name' => '총무팀', 'description' => '총무 및 시설 관리'],
],
'DIV02' => [
['code' => 'DEV', 'name' => '개발팀', 'description' => '소프트웨어 개발'],
['code' => 'QA', 'name' => 'QA팀', 'description' => '품질 보증 및 테스트'],
['code' => 'INFRA', 'name' => '인프라팀', 'description' => '서버 및 인프라 관리'],
],
'DIV03' => [
['code' => 'SALES', 'name' => '영업팀', 'description' => '영업 및 고객 관리'],
['code' => 'MKT', 'name' => '마케팅팀', 'description' => '마케팅 및 홍보'],
],
];
$count = 0;
$divisionIds = [];
// 본부 생성
foreach ($divisions as $index => $division) {
$dept = Department::create([
'tenant_id' => $tenantId,
'parent_id' => null,
'code' => $division['code'],
'name' => $division['name'],
'description' => $division['description'],
'is_active' => true,
'sort_order' => $index + 1,
'created_by' => $userId,
]);
$divisionIds[$division['code']] = $dept->id;
$count++;
}
// 부서 생성
foreach ($departments as $divCode => $depts) {
$parentId = $divisionIds[$divCode] ?? null;
foreach ($depts as $index => $dept) {
Department::create([
'tenant_id' => $tenantId,
'parent_id' => $parentId,
'code' => $dept['code'],
'name' => $dept['name'],
'description' => $dept['description'],
'is_active' => true,
'sort_order' => $index + 1,
'created_by' => $userId,
]);
$count++;
}
}
// 사용자-부서 연결
$this->assignUsersToDepartments($tenantId);
$this->command->info(' ✓ departments: '.$count.'개 생성 (본부 3개, 부서 8개)');
}
private function assignUsersToDepartments(int $tenantId): void
{
// 테넌트 소속 사용자 조회
$userIds = DB::table('user_tenants')
->where('tenant_id', $tenantId)
->pluck('user_id')
->toArray();
// 부서 조회 (2레벨만)
$departments = Department::where('tenant_id', $tenantId)
->whereNotNull('parent_id')
->get();
if ($departments->isEmpty() || empty($userIds)) {
return;
}
// 사용자를 부서에 분배
foreach ($userIds as $index => $userId) {
$dept = $departments[$index % $departments->count()];
$isPrimary = ($index % $departments->count() === 0); // 첫 번째만 primary
// 이미 연결되어 있는지 확인
$exists = DB::table('department_user')
->where('user_id', $userId)
->where('department_id', $dept->id)
->exists();
if (! $exists) {
DB::table('department_user')->insert([
'tenant_id' => $tenantId,
'user_id' => $userId,
'department_id' => $dept->id,
'is_primary' => $isPrimary,
'joined_at' => now(),
'created_at' => now(),
'updated_at' => now(),
]);
}
}
}
}