브라우저 alert/confirm을 SweetAlert2로 전환
- layouts/app.blade.php에 SweetAlert2 CDN 및 전역 헬퍼 함수 추가 - showToast(): 토스트 알림 (success, error, warning, info) - showConfirm(): 확인 대화상자 - showDeleteConfirm(): 삭제 확인 (경고 아이콘) - showPermanentDeleteConfirm(): 영구 삭제 확인 (빨간색 경고) - showSuccess(), showError(): 성공/에러 알림 - 변환된 파일 목록 (48개 Blade 파일): - menus/* (6개), boards/* (2개), posts/* (3개) - daily-logs/* (3개), project-management/* (6개) - dev-tools/flow-tester/* (6개) - quote-formulas/* (4개), permission-analyze/* (1개) - archived-records/* (1개), profile/* (1개) - roles/* (3개), permissions/* (3개) - departments/* (3개), tenants/* (3개), users/* (3개) - 주요 개선사항: - Tailwind CSS 테마와 일관된 디자인 - 비동기 콜백 패턴으로 리팩토링 - 삭제/복원/영구삭제 각각 다른 스타일 적용
This commit is contained in:
253
docs/QUOTE_FORMULA_SEED_PLAN.md
Normal file
253
docs/QUOTE_FORMULA_SEED_PLAN.md
Normal file
@@ -0,0 +1,253 @@
|
||||
# 견적수식 시드 데이터 구현 계획
|
||||
|
||||
## 📋 개요
|
||||
|
||||
`design/src/components/utils/formulaSampleData.ts`에 정의된 샘플 데이터를
|
||||
MNG의 `quote_formulas` 테이블에 시드(Seed)하여 관리할 수 있도록 구현합니다.
|
||||
|
||||
---
|
||||
|
||||
## 🔍 분석 결과
|
||||
|
||||
### 소스 데이터 구조 (formulaSampleData.ts)
|
||||
|
||||
| 데이터 종류 | 개수 | 설명 |
|
||||
|------------|------|------|
|
||||
| **itemMasters** | 21개 | 품목 마스터 (제품, 가이드레일, 케이스, 모터, 제어기 등) |
|
||||
| **pricings** | 20개 | 품목별 판매/구매 단가 |
|
||||
| **formulaRules** | 26개 | 수식 규칙 (계산식, 범위, 매핑) |
|
||||
| **categoryGroups** | 11개 | 수식 카테고리 |
|
||||
|
||||
### 수식 규칙 상세 (26개)
|
||||
|
||||
| 카테고리 | 규칙 수 | 유형 | 설명 |
|
||||
|----------|---------|------|------|
|
||||
| 오픈사이즈 | 2 | formula | W0, H0 입력값 |
|
||||
| 제작사이즈 | 4 | formula | W1, H1 (스크린/철재별) |
|
||||
| 면적 | 1 | formula | W1 * H1 / 1000000 |
|
||||
| 중량 | 2 | formula | 스크린/철재별 중량 계산 |
|
||||
| 가이드레일 | 5 | formula/range | 길이, 자재선택, 설치유형별 수량 |
|
||||
| 케이스 | 3 | formula/range | 사이즈, 자재 자동선택 |
|
||||
| 모터 | 1 | range | 중량 기반 자동선택 |
|
||||
| 제어기 | 1 | mapping | 유형별 자동선택 |
|
||||
| 마구리 | 1 | formula | 날개 수량 계산 |
|
||||
| 검사 | 1 | formula | 검사비 고정 |
|
||||
| 단가수식 | 5 | formula | 품목별 단가 계산 |
|
||||
|
||||
### 카테고리 그룹 (11개)
|
||||
|
||||
```
|
||||
1. 오픈사이즈 6. 케이스
|
||||
2. 제작사이즈 7. 모터
|
||||
3. 면적 8. 제어기
|
||||
4. 중량 9. 마구리
|
||||
5. 가이드레일 10. 검사
|
||||
11. 단가수식
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 데이터 매핑
|
||||
|
||||
### formulaSampleData → quote_formula_categories
|
||||
|
||||
```
|
||||
categoryGroups → quote_formula_categories
|
||||
├── id → id
|
||||
├── name → name
|
||||
├── name (uppercase) → code
|
||||
├── description → description
|
||||
├── order → sort_order
|
||||
└── is_active: true
|
||||
```
|
||||
|
||||
### formulaSampleData → quote_formulas
|
||||
|
||||
```
|
||||
formulaRules → quote_formulas
|
||||
├── ruleCode → variable
|
||||
├── ruleName → name
|
||||
├── category → category_id (FK)
|
||||
├── ruleType → type (input/calculation/range/mapping)
|
||||
├── inputVariable → (참조용 description에 포함)
|
||||
├── formula/outputFormula → formula
|
||||
├── unit → (metadata JSON)
|
||||
├── description → description
|
||||
├── status → is_active
|
||||
└── ranges[] → quote_formula_ranges
|
||||
```
|
||||
|
||||
### formulaSampleData → quote_formula_ranges
|
||||
|
||||
```
|
||||
ranges[] → quote_formula_ranges
|
||||
├── minValue → min_value
|
||||
├── maxValue → max_value
|
||||
├── result → result_value
|
||||
├── itemCode → item_code
|
||||
├── quantity → quantity
|
||||
└── description → description
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ 구현 계획
|
||||
|
||||
### Phase 1: Seeder 생성 (api/)
|
||||
|
||||
**⚠️ 중요: MNG_CRITICAL_RULES에 따라 api/에서 Seeder 생성**
|
||||
|
||||
| 순서 | 작업 | 예상 시간 |
|
||||
|------|------|----------|
|
||||
| 1.1 | QuoteFormulaCategorySeeder 생성 | 10분 |
|
||||
| 1.2 | QuoteFormulaSeeder 생성 | 30분 |
|
||||
| 1.3 | QuoteFormulaRangeSeeder 생성 | 15분 |
|
||||
| 1.4 | DatabaseSeeder에 등록 | 5분 |
|
||||
|
||||
### Phase 2: MNG에서 Seeder 참조 및 실행
|
||||
|
||||
| 순서 | 작업 | 예상 시간 |
|
||||
|------|------|----------|
|
||||
| 2.1 | mng에서 api Seeder 실행 방법 구현 | 15분 |
|
||||
| 2.2 | 데이터 검증 및 테스트 | 10분 |
|
||||
|
||||
### Phase 3: MNG 관리 UI 개선 (선택)
|
||||
|
||||
| 순서 | 작업 | 예상 시간 |
|
||||
|------|------|----------|
|
||||
| 3.1 | 범위(Range) 관리 UI 추가 | 40분 |
|
||||
| 3.2 | 매핑(Mapping) 관리 UI 추가 | 40분 |
|
||||
| 3.3 | 시뮬레이터 연동 테스트 | 20분 |
|
||||
|
||||
---
|
||||
|
||||
## 📝 상세 구현
|
||||
|
||||
### 1.1 QuoteFormulaCategorySeeder
|
||||
|
||||
```php
|
||||
// api/database/seeders/QuoteFormulaCategorySeeder.php
|
||||
|
||||
$categories = [
|
||||
['code' => 'OPEN_SIZE', 'name' => '오픈사이즈', 'description' => '제품의 설치 오픈 사이즈 (W0, H0)', 'sort_order' => 1],
|
||||
['code' => 'MAKE_SIZE', 'name' => '제작사이즈', 'description' => '실제 제작 사이즈 (W1, H1)', 'sort_order' => 2],
|
||||
['code' => 'AREA', 'name' => '면적', 'description' => '제품 면적 계산 (㎡)', 'sort_order' => 3],
|
||||
['code' => 'WEIGHT', 'name' => '중량', 'description' => '제품 중량 계산 (kg)', 'sort_order' => 4],
|
||||
['code' => 'GUIDE_RAIL', 'name' => '가이드레일', 'description' => '가이드레일 자동 선택 및 수량 계산', 'sort_order' => 5],
|
||||
['code' => 'CASE', 'name' => '케이스', 'description' => '케이스(셔터박스) 자동 선택', 'sort_order' => 6],
|
||||
['code' => 'MOTOR', 'name' => '모터', 'description' => '개폐전동기 자동 선택', 'sort_order' => 7],
|
||||
['code' => 'CONTROLLER', 'name' => '제어기', 'description' => '연동제어기 자동 선택', 'sort_order' => 8],
|
||||
['code' => 'EDGE_WING', 'name' => '마구리', 'description' => '마구리 날개 수량 계산', 'sort_order' => 9],
|
||||
['code' => 'INSPECTION', 'name' => '검사', 'description' => '제품 검사비', 'sort_order' => 10],
|
||||
['code' => 'PRICE_FORMULA', 'name' => '단가수식', 'description' => '품목별 단가 계산 수식', 'sort_order' => 11],
|
||||
];
|
||||
```
|
||||
|
||||
### 1.2 QuoteFormulaSeeder (일부 예시)
|
||||
|
||||
```php
|
||||
// api/database/seeders/QuoteFormulaSeeder.php
|
||||
|
||||
$formulas = [
|
||||
// 오픈사이즈
|
||||
[
|
||||
'category_code' => 'OPEN_SIZE',
|
||||
'variable' => 'W0',
|
||||
'name' => '오픈사이즈 W0 (가로)',
|
||||
'type' => 'input',
|
||||
'formula' => null,
|
||||
'description' => '자동 견적 산출 섹션의 오픈사이즈 W0 입력값',
|
||||
'metadata' => ['unit' => 'mm'],
|
||||
],
|
||||
[
|
||||
'category_code' => 'OPEN_SIZE',
|
||||
'variable' => 'H0',
|
||||
'name' => '오픈사이즈 H0 (세로)',
|
||||
'type' => 'input',
|
||||
'formula' => null,
|
||||
'description' => '자동 견적 산출 섹션의 오픈사이즈 H0 입력값',
|
||||
'metadata' => ['unit' => 'mm'],
|
||||
],
|
||||
|
||||
// 제작사이즈
|
||||
[
|
||||
'category_code' => 'MAKE_SIZE',
|
||||
'variable' => 'W1_SCREEN',
|
||||
'name' => '제작사이즈 W1 (스크린)',
|
||||
'type' => 'calculation',
|
||||
'formula' => 'W0 + 140',
|
||||
'description' => '스크린 제작 가로 = 오픈 가로 + 140',
|
||||
'metadata' => ['unit' => 'mm', 'product_type' => 'screen'],
|
||||
],
|
||||
|
||||
// 범위 타입 예시
|
||||
[
|
||||
'category_code' => 'GUIDE_RAIL',
|
||||
'variable' => 'GR_AUTO_SELECT',
|
||||
'name' => '가이드레일 자재 자동 선택',
|
||||
'type' => 'range',
|
||||
'formula' => null,
|
||||
'description' => '가이드레일 길이 및 수량 자동 산출 (기본 2개)',
|
||||
'metadata' => ['unit' => 'EA'],
|
||||
'ranges' => [
|
||||
['min' => 1219, 'max' => 2438, 'result' => '2438 2개', 'quantity' => 2],
|
||||
['min' => 2438, 'max' => 3000, 'result' => '3000 2개', 'quantity' => 2],
|
||||
],
|
||||
],
|
||||
];
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📋 실행 순서
|
||||
|
||||
```bash
|
||||
# 1. api/ 디렉토리에서 Seeder 생성
|
||||
cd ../api
|
||||
php artisan make:seeder QuoteFormulaCategorySeeder
|
||||
php artisan make:seeder QuoteFormulaSeeder
|
||||
|
||||
# 2. Seeder 코드 작성 후 실행
|
||||
php artisan db:seed --class=QuoteFormulaCategorySeeder
|
||||
php artisan db:seed --class=QuoteFormulaSeeder
|
||||
|
||||
# 3. mng/에서 데이터 확인
|
||||
cd ../mng
|
||||
php artisan tinker
|
||||
>>> \App\Models\Quote\QuoteFormulaCategory::count()
|
||||
>>> \App\Models\Quote\QuoteFormula::count()
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ 주의사항
|
||||
|
||||
1. **tenant_id**: Seeder 실행 시 기본 tenant_id 설정 필요
|
||||
2. **중복 방지**: 이미 데이터가 있으면 건너뛰도록 처리
|
||||
3. **외래키**: category_id는 카테고리 먼저 생성 후 참조
|
||||
4. **트랜잭션**: 전체 Seeder를 트랜잭션으로 감싸기
|
||||
|
||||
---
|
||||
|
||||
## 📊 예상 결과
|
||||
|
||||
| 테이블 | 레코드 수 |
|
||||
|--------|----------|
|
||||
| quote_formula_categories | 11 |
|
||||
| quote_formulas | 26 |
|
||||
| quote_formula_ranges | ~10 |
|
||||
| quote_formula_mappings | ~5 |
|
||||
|
||||
---
|
||||
|
||||
## 🔄 향후 확장
|
||||
|
||||
1. **Excel Import**: 사용자가 Excel로 수식 일괄 등록
|
||||
2. **버전 관리**: 수식 변경 이력 추적
|
||||
3. **테스트 케이스**: 시뮬레이터에서 자동 테스트
|
||||
4. **API 연동**: React 프론트엔드에서 수식 사용
|
||||
|
||||
---
|
||||
|
||||
**작성일**: 2025-12-04
|
||||
**예상 소요 시간**: 2-3시간 (Phase 1-2)
|
||||
Reference in New Issue
Block a user