Files
sam-manage/database/seeders/QuoteFormulaSeeder.php
2026-02-25 11:45:01 +09:00

283 lines
9.7 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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).'개');
}
}