command->info('카테고리 그룹 시딩 시작...'); DB::transaction(function () { // 기존 데이터 삭제 CategoryGroup::withoutGlobalScopes() ->where('tenant_id', $this->tenantId) ->delete(); $this->seedCategoryGroups(); }); $count = CategoryGroup::withoutGlobalScopes() ->where('tenant_id', $this->tenantId) ->count(); $this->command->info("카테고리 그룹 시딩 완료! (총 {$count}개)"); } protected function seedCategoryGroups(): void { $groups = [ [ 'code' => CategoryGroup::CODE_AREA_BASED, 'name' => '면적기반', 'multiplier_variable' => CategoryGroup::MULTIPLIER_AREA, 'categories' => ['원단', '패널', '도장', '표면처리', '스크린원단'], 'description' => '면적(㎡)을 기준으로 단가를 계산합니다. 최종단가 = 기본단가 × M(면적)', 'sort_order' => 1, ], [ 'code' => CategoryGroup::CODE_WEIGHT_BASED, 'name' => '중량기반', 'multiplier_variable' => CategoryGroup::MULTIPLIER_WEIGHT, 'categories' => ['강판', '알루미늄', '스테인리스', '철재'], 'description' => '중량(kg)을 기준으로 단가를 계산합니다. 최종단가 = 기본단가 × K(중량)', 'sort_order' => 2, ], [ 'code' => CategoryGroup::CODE_QUANTITY_BASED, 'name' => '수량기반', 'multiplier_variable' => null, 'categories' => ['볼트', '너트', '와셔', '앵커', '모터', '제어반', '리모컨', '스위치', '전선', '가이드레일', '케이스', '커버', '브라켓', '실링재', '패킹'], 'description' => '수량을 기준으로 단가를 계산합니다. 최종단가 = 기본단가 (곱셈 없음)', 'sort_order' => 3, ], ]; foreach ($groups as $group) { CategoryGroup::create([ 'tenant_id' => $this->tenantId, 'code' => $group['code'], 'name' => $group['name'], 'multiplier_variable' => $group['multiplier_variable'], 'categories' => $group['categories'], 'description' => $group['description'], 'sort_order' => $group['sort_order'], 'is_active' => true, ]); } } }