- QuoteFormulaCategorySeeder: 카테고리 4개 (입력변수, 계산변수, 범위선택, 품목매핑) - QuoteFormulaSeeder: 변수/계산식 19개 (W0, H0, W1, H1, M, K 등) - QuoteFormulaRangeSeeder: 범위 조건 12개 (모터/가이드레일/케이스 선택) - QuoteFormulaItemSeeder: 품목 매핑 24개 (FG-SCR-001, FG-STL-001 BOM) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
282 lines
9.7 KiB
PHP
282 lines
9.7 KiB
PHP
<?php
|
||
|
||
namespace Database\Seeders;
|
||
|
||
use Illuminate\Database\Seeder;
|
||
use Illuminate\Support\Facades\DB;
|
||
|
||
/**
|
||
* 견적 수식 시더
|
||
*
|
||
* 변수 및 계산식 데이터 생성
|
||
*
|
||
* 입력변수:
|
||
* W0 - 오픈사이즈 폭 (mm)
|
||
* H0 - 오픈사이즈 높이 (mm)
|
||
* PC - 제품 카테고리 (스크린/철재)
|
||
* GT - 가이드레일 설치유형 (벽면형/측면형)
|
||
* MP - 모터 전원 (220V/380V)
|
||
* CT - 연동제어기 (단독/연동)
|
||
* QTY - 수량
|
||
*
|
||
* 계산변수:
|
||
* W1 - 제작폭: PC=="스크린" ? W0+140 : W0+110
|
||
* H1 - 제작높이: H0+350
|
||
* W - 제작폭 별칭: W1
|
||
* H - 제작높이 별칭: H1
|
||
* M - 면적(㎡): W1 * H1 / 1000000
|
||
* K - 중량(kg): 스크린=M*2+W0/1000*14.17, 철재=M*25
|
||
*
|
||
* 범위선택:
|
||
* MOTOR - 모터 선택 (중량 K 기준)
|
||
* GUIDE - 가이드레일 선택 (높이 H 기준)
|
||
* CASE - 케이스 선택 (폭 W 기준)
|
||
*/
|
||
class QuoteFormulaSeeder extends Seeder
|
||
{
|
||
public function run(): void
|
||
{
|
||
$tenantId = 1;
|
||
|
||
// 카테고리 ID 조회
|
||
$categories = DB::table('quote_formula_categories')
|
||
->where('tenant_id', $tenantId)
|
||
->whereIn('code', ['input_variables', 'calculation_variables', 'range_selection'])
|
||
->pluck('id', 'code')
|
||
->toArray();
|
||
|
||
if (empty($categories)) {
|
||
$this->command->error('QuoteFormulaSeeder: 카테고리가 없습니다. QuoteFormulaCategorySeeder를 먼저 실행하세요.');
|
||
|
||
return;
|
||
}
|
||
|
||
$formulas = [];
|
||
|
||
// === 1. 입력변수 (input) ===
|
||
$inputVars = [
|
||
[
|
||
'variable' => 'PC',
|
||
'name' => '제품 카테고리',
|
||
'description' => '스크린 또는 철재 선택',
|
||
'formula' => null,
|
||
'sort_order' => 1,
|
||
],
|
||
[
|
||
'variable' => 'W0',
|
||
'name' => '오픈사이즈 폭 (W0)',
|
||
'description' => '개구부 실측 폭 (mm)',
|
||
'formula' => null,
|
||
'sort_order' => 2,
|
||
],
|
||
[
|
||
'variable' => 'H0',
|
||
'name' => '오픈사이즈 높이 (H0)',
|
||
'description' => '개구부 실측 높이 (mm)',
|
||
'formula' => null,
|
||
'sort_order' => 3,
|
||
],
|
||
[
|
||
'variable' => 'GT',
|
||
'name' => '가이드레일 설치유형',
|
||
'description' => '벽면형 또는 측면형',
|
||
'formula' => null,
|
||
'sort_order' => 4,
|
||
],
|
||
[
|
||
'variable' => 'MP',
|
||
'name' => '모터 전원',
|
||
'description' => '220V 또는 380V',
|
||
'formula' => null,
|
||
'sort_order' => 5,
|
||
],
|
||
[
|
||
'variable' => 'CT',
|
||
'name' => '연동제어기',
|
||
'description' => '단독 또는 연동',
|
||
'formula' => null,
|
||
'sort_order' => 6,
|
||
],
|
||
[
|
||
'variable' => 'QTY',
|
||
'name' => '수량',
|
||
'description' => '견적 수량',
|
||
'formula' => null,
|
||
'sort_order' => 7,
|
||
],
|
||
];
|
||
|
||
foreach ($inputVars as $var) {
|
||
$formulas[] = [
|
||
'tenant_id' => $tenantId,
|
||
'category_id' => $categories['input_variables'],
|
||
'product_id' => null,
|
||
'name' => $var['name'],
|
||
'variable' => $var['variable'],
|
||
'type' => 'input',
|
||
'formula' => $var['formula'],
|
||
'output_type' => 'variable',
|
||
'description' => $var['description'],
|
||
'sort_order' => $var['sort_order'],
|
||
'is_active' => true,
|
||
'created_by' => 1,
|
||
'updated_by' => 1,
|
||
];
|
||
}
|
||
|
||
// === 2. 계산변수 (calculation) ===
|
||
$calcVars = [
|
||
[
|
||
'variable' => 'W1_SCREEN',
|
||
'name' => '제작폭 W1 (스크린)',
|
||
'description' => '스크린 제작 폭: W0 + 140mm',
|
||
'formula' => 'W0 + 140',
|
||
'sort_order' => 10,
|
||
],
|
||
[
|
||
'variable' => 'W1_STEEL',
|
||
'name' => '제작폭 W1 (철재)',
|
||
'description' => '철재 제작 폭: W0 + 110mm',
|
||
'formula' => 'W0 + 110',
|
||
'sort_order' => 11,
|
||
],
|
||
[
|
||
'variable' => 'H1',
|
||
'name' => '제작높이 H1',
|
||
'description' => '제작 높이: H0 + 350mm',
|
||
'formula' => 'H0 + 350',
|
||
'sort_order' => 12,
|
||
],
|
||
[
|
||
'variable' => 'W',
|
||
'name' => '제작폭 (W)',
|
||
'description' => 'W1의 별칭 (수식에서 사용)',
|
||
'formula' => 'IF(PC=="스크린", W0+140, W0+110)',
|
||
'sort_order' => 13,
|
||
],
|
||
[
|
||
'variable' => 'H',
|
||
'name' => '제작높이 (H)',
|
||
'description' => 'H1의 별칭 (수식에서 사용)',
|
||
'formula' => 'H0 + 350',
|
||
'sort_order' => 14,
|
||
],
|
||
[
|
||
'variable' => 'M',
|
||
'name' => '면적 (M)',
|
||
'description' => '제작 면적 (㎡): W × H / 1,000,000',
|
||
'formula' => 'W * H / 1000000',
|
||
'sort_order' => 15,
|
||
],
|
||
[
|
||
'variable' => 'K_SCREEN',
|
||
'name' => '중량 K (스크린)',
|
||
'description' => '스크린 중량 (kg): M×2 + W0/1000×14.17',
|
||
'formula' => 'M * 2 + W0 / 1000 * 14.17',
|
||
'sort_order' => 16,
|
||
],
|
||
[
|
||
'variable' => 'K_STEEL',
|
||
'name' => '중량 K (철재)',
|
||
'description' => '철재 중량 (kg): M × 25',
|
||
'formula' => 'M * 25',
|
||
'sort_order' => 17,
|
||
],
|
||
[
|
||
'variable' => 'K',
|
||
'name' => '중량 (K)',
|
||
'description' => '제품별 중량 선택',
|
||
'formula' => 'IF(PC=="스크린", M*2+W0/1000*14.17, M*25)',
|
||
'sort_order' => 18,
|
||
],
|
||
];
|
||
|
||
foreach ($calcVars as $var) {
|
||
$formulas[] = [
|
||
'tenant_id' => $tenantId,
|
||
'category_id' => $categories['calculation_variables'],
|
||
'product_id' => null,
|
||
'name' => $var['name'],
|
||
'variable' => $var['variable'],
|
||
'type' => 'calculation',
|
||
'formula' => $var['formula'],
|
||
'output_type' => 'variable',
|
||
'description' => $var['description'],
|
||
'sort_order' => $var['sort_order'],
|
||
'is_active' => true,
|
||
'created_by' => 1,
|
||
'updated_by' => 1,
|
||
];
|
||
}
|
||
|
||
// === 3. 범위선택 (range) ===
|
||
$rangeVars = [
|
||
[
|
||
'variable' => 'MOTOR',
|
||
'name' => '모터 자동선택',
|
||
'description' => '중량(K) 기준 모터 자동 선택',
|
||
'formula' => 'K', // 조건 변수
|
||
'sort_order' => 20,
|
||
],
|
||
[
|
||
'variable' => 'GUIDE',
|
||
'name' => '가이드레일 자동선택',
|
||
'description' => '높이(H) 기준 가이드레일 규격 선택',
|
||
'formula' => 'H',
|
||
'sort_order' => 21,
|
||
],
|
||
[
|
||
'variable' => 'CASE',
|
||
'name' => '케이스 자동선택',
|
||
'description' => '폭(W) 기준 케이스 규격 선택',
|
||
'formula' => 'W',
|
||
'sort_order' => 22,
|
||
],
|
||
];
|
||
|
||
foreach ($rangeVars as $var) {
|
||
$formulas[] = [
|
||
'tenant_id' => $tenantId,
|
||
'category_id' => $categories['range_selection'],
|
||
'product_id' => null,
|
||
'name' => $var['name'],
|
||
'variable' => $var['variable'],
|
||
'type' => 'range',
|
||
'formula' => $var['formula'],
|
||
'output_type' => 'item',
|
||
'description' => $var['description'],
|
||
'sort_order' => $var['sort_order'],
|
||
'is_active' => true,
|
||
'created_by' => 1,
|
||
'updated_by' => 1,
|
||
];
|
||
}
|
||
|
||
// 기존 데이터 삭제 후 삽입
|
||
$existingIds = DB::table('quote_formulas')
|
||
->where('tenant_id', $tenantId)
|
||
->whereIn('category_id', array_values($categories))
|
||
->pluck('id')
|
||
->toArray();
|
||
|
||
if (! empty($existingIds)) {
|
||
// 연결된 범위/아이템 데이터도 삭제
|
||
DB::table('quote_formula_ranges')->whereIn('formula_id', $existingIds)->delete();
|
||
DB::table('quote_formula_items')->whereIn('formula_id', $existingIds)->delete();
|
||
DB::table('quote_formulas')->whereIn('id', $existingIds)->delete();
|
||
}
|
||
|
||
// 새 데이터 삽입
|
||
foreach ($formulas as $formula) {
|
||
DB::table('quote_formulas')->insert(array_merge($formula, [
|
||
'created_at' => now(),
|
||
'updated_at' => now(),
|
||
]));
|
||
}
|
||
|
||
$this->command->info('QuoteFormulaSeeder: ' . count($formulas) . '개 수식 생성 완료');
|
||
$this->command->info(' - 입력변수: ' . count($inputVars) . '개');
|
||
$this->command->info(' - 계산변수: ' . count($calcVars) . '개');
|
||
$this->command->info(' - 범위선택: ' . count($rangeVars) . '개');
|
||
}
|
||
} |