Files
sam-manage/database/seeders/CategoryGroupSeeder.php

84 lines
3.1 KiB
PHP
Raw Normal View History

<?php
namespace Database\Seeders;
use App\Models\CategoryGroup;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
/**
* 카테고리 그룹 시더
*
* 면적/중량/수량 기반 단가 계산 그룹을 생성합니다.
* Design 시뮬레이터와 동일한 계산 방식을 위한 기초 데이터입니다.
*
* 사용법:
* php artisan db:seed --class=CategoryGroupSeeder
*/
class CategoryGroupSeeder extends Seeder
{
protected int $tenantId = 1;
public function run(): void
{
$this->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,
]);
}
}
}