# mng 견적 수식 관리 현재 상태 > **분석일:** 2025-12-19 > **대상:** mng 프로젝트 quote-formulas 기능 --- ## 1. 데이터베이스 구조 ### 테이블 목록 (5개) 마이그레이션: `api/database/migrations/2025_12_04_133410_create_quote_formula_tables.php` | 테이블 | 설명 | 주요 컬럼 | |--------|------|----------| | `quote_formula_categories` | 수식 카테고리 | code, name, sort_order | | `quote_formulas` | 수식 정의 | variable, type, formula, output_type | | `quote_formula_ranges` | 범위별 값 | min_value, max_value, condition_variable | | `quote_formula_mappings` | 매핑 값 | source_variable, source_value, result_value | | `quote_formula_items` | 품목 출력 | item_code, quantity_formula, unit_price_formula | ### ERD 관계 ``` quote_formula_categories (1) ──< (N) quote_formulas │ ├──< (N) quote_formula_ranges ├──< (N) quote_formula_mappings └──< (N) quote_formula_items ``` ### 수식 유형 (type) | 값 | 설명 | 사용 예시 | |---|------|----------| | `input` | 입력값 | W0 (가로), H0 (세로) | | `calculation` | 계산식 | `W1 = W0 + 50` | | `range` | 범위별 조건 | 면적별 검사비 | | `mapping` | 매핑 조건 | 설치유형별 값 | ### 출력 유형 (output_type) | 값 | 설명 | |---|------| | `variable` | 변수로 저장 (다음 수식에서 참조 가능) | | `item` | 품목으로 출력 (견적서에 표시) | --- ## 2. 모델 구조 ### 파일 위치 ``` mng/app/Models/Quote/ ├── QuoteFormulaCategory.php # 카테고리 ├── QuoteFormula.php # 수식 (메인) ├── QuoteFormulaRange.php # 범위 규칙 ├── QuoteFormulaMapping.php # 매핑 규칙 └── QuoteFormulaItem.php # 품목 출력 ``` ### QuoteFormula 모델 상세 ```php // 상수 정의 TYPE_INPUT = 'input' TYPE_CALCULATION = 'calculation' TYPE_RANGE = 'range' TYPE_MAPPING = 'mapping' OUTPUT_VARIABLE = 'variable' OUTPUT_ITEM = 'item' // Traits use BelongsToTenant, SoftDeletes; // 관계 category() → BelongsTo ranges() → HasMany mappings() → HasMany items() → HasMany creator() → BelongsTo (User) updater() → BelongsTo (User) // Scopes scopeCommon() → 공통 수식 (product_id IS NULL) scopeForProduct($productId) → 제품별 수식 scopeActive() → 활성 수식 scopeOrdered() → 정렬 scopeOfType($type) → 유형별 필터 ``` --- ## 3. 서비스 구조 ### QuoteFormulaService **파일:** `mng/app/Services/Quote/QuoteFormulaService.php` | 메서드 | 설명 | |--------|------| | `getFormulas()` | 수식 목록 (페이지네이션, 필터) | | `getFormulasByCategory()` | 카테고리별 수식 (실행 순서용) | | `getFormulaById()` | 수식 상세 조회 | | `createFormula()` | 수식 생성 (트랜잭션) | | `updateFormula()` | 수식 수정 (트랜잭션) | | `deleteFormula()` | 수식 삭제 (Soft Delete) | | `toggleActive()` | 활성/비활성 토글 | | `duplicateFormula()` | 수식 복제 | | `reorder()` | 순서 변경 | | `isVariableExists()` | 변수명 중복 체크 | | `getAvailableVariables()` | 사용 가능한 변수 목록 | | `getFormulaStats()` | 수식 통계 | ### FormulaEvaluatorService **파일:** `mng/app/Services/Quote/FormulaEvaluatorService.php` | 메서드 | 설명 | |--------|------| | `validateFormula()` | 수식 문법 검증 | | `evaluate()` | 단일 수식 평가 | | `evaluateRange()` | 범위별 수식 평가 | | `evaluateMapping()` | 매핑 수식 평가 | | `executeAll()` | 전체 수식 실행 (카테고리 순서) | | `getErrors()` | 에러 목록 반환 | | `getVariables()` | 현재 변수 상태 | | `resetVariables()` | 변수 초기화 | ### 지원 함수 ``` SUM, ROUND, CEIL, FLOOR, ABS, MIN, MAX, IF, AND, OR, NOT ``` --- ## 4. 컨트롤러 구조 ### Web 컨트롤러 **파일:** `mng/app/Http/Controllers/QuoteFormulaController.php` | 메서드 | URL | 설명 | |--------|-----|------| | `index()` | `/quote-formulas` | 수식 목록 화면 | | `create()` | `/quote-formulas/create` | 수식 생성 화면 | | `edit()` | `/quote-formulas/{id}/edit` | 수식 수정 화면 | | `categories()` | `/quote-formulas/categories` | 카테고리 목록 | | `simulator()` | `/quote-formulas/simulator` | 시뮬레이터 | ### API 컨트롤러 **파일:** `mng/app/Http/Controllers/Api/Admin/Quote/QuoteFormulaController.php` | 메서드 | HTTP | URL | 설명 | |--------|------|-----|------| | `index()` | GET | `/api/admin/quote-formulas/formulas` | 목록 (HTMX) | | `store()` | POST | `/api/admin/quote-formulas/formulas` | 생성 | | `show()` | GET | `/api/admin/quote-formulas/formulas/{id}` | 상세 | | `update()` | PUT | `/api/admin/quote-formulas/formulas/{id}` | 수정 | | `destroy()` | DELETE | `/api/admin/quote-formulas/formulas/{id}` | 삭제 | | `restore()` | POST | `/api/admin/quote-formulas/formulas/{id}/restore` | 복원 | | `forceDestroy()` | DELETE | `/api/admin/quote-formulas/formulas/{id}/force` | 영구삭제 | | `toggleActive()` | POST | `/api/admin/quote-formulas/formulas/{id}/toggle-active` | 토글 | | `duplicate()` | POST | `/api/admin/quote-formulas/formulas/{id}/duplicate` | 복제 | | `reorder()` | POST | `/api/admin/quote-formulas/formulas/reorder` | 순서변경 | | `variables()` | GET | `/api/admin/quote-formulas/formulas/variables` | 변수목록 | | `validate()` | POST | `/api/admin/quote-formulas/formulas/validate` | 수식검증 | | `test()` | POST | `/api/admin/quote-formulas/formulas/test` | 수식테스트 | | `simulate()` | POST | `/api/admin/quote-formulas/formulas/simulate` | 시뮬레이션 | | `stats()` | GET | `/api/admin/quote-formulas/formulas/stats` | 통계 | --- ## 5. View 구조 ``` mng/resources/views/quote-formulas/ ├── index.blade.php # 수식 목록 메인 ├── create.blade.php # 수식 생성 폼 ├── edit.blade.php # 수식 수정 폼 ├── simulator.blade.php # 시뮬레이터 ├── categories/ │ ├── index.blade.php # 카테고리 목록 │ ├── create.blade.php # 카테고리 생성 │ ├── edit.blade.php # 카테고리 수정 │ └── partials/ │ └── table.blade.php # 카테고리 테이블 (HTMX) └── partials/ └── table.blade.php # 수식 테이블 (HTMX) ``` ### UI 특징 - **HTMX 기반**: 페이지 새로고침 없이 데이터 갱신 - **필터링**: 카테고리, 유형, 활성상태, 검색 - **Soft Delete**: 삭제/복원/영구삭제 지원 - **드래그 정렬**: 순서 변경 기능 --- ## 6. FormRequest ``` mng/app/Http/Requests/Quote/ ├── StoreQuoteFormulaCategoryRequest.php ├── UpdateQuoteFormulaCategoryRequest.php ├── StoreQuoteFormulaRequest.php └── UpdateQuoteFormulaRequest.php ``` --- ## 7. 라우트 정의 ### Web Routes (`routes/web.php`) ```php Route::prefix('quote-formulas')->name('quote-formulas.')->group(function () { Route::get('/', [QuoteFormulaController::class, 'index'])->name('index'); Route::get('/create', [QuoteFormulaController::class, 'create'])->name('create'); Route::get('/{id}/edit', [QuoteFormulaController::class, 'edit'])->name('edit'); Route::get('/categories', [QuoteFormulaController::class, 'categories'])->name('categories.index'); Route::get('/categories/create', [QuoteFormulaController::class, 'createCategory'])->name('categories.create'); Route::get('/categories/{id}/edit', [QuoteFormulaController::class, 'editCategory'])->name('categories.edit'); Route::get('/simulator', [QuoteFormulaController::class, 'simulator'])->name('simulator'); }); ``` ### API Routes (`routes/api.php`) 30+ 개의 API 엔드포인트 정의 (카테고리 CRUD + 수식 CRUD + 추가 기능) --- ## 8. 수식 실행 흐름 ``` 1. 입력값 수집 (W0, H0, 설치유형 등) ↓ 2. 카테고리 순서대로 수식 조회 ↓ 3. 각 수식 실행 ├─ TYPE_INPUT: 입력값 또는 기본값 ├─ TYPE_CALCULATION: 수식 계산 ├─ TYPE_RANGE: 범위 조건 평가 └─ TYPE_MAPPING: 매핑 조건 평가 ↓ 4. 결과 저장 ├─ OUTPUT_VARIABLE: 변수로 저장 (다음 수식에서 참조) └─ OUTPUT_ITEM: 품목 목록에 추가 ↓ 5. 최종 결과 반환 ├─ variables: 계산된 변수 목록 ├─ items: 품목 목록 (품명, 수량, 단가, 금액) └─ errors: 오류 목록 ``` --- ## 9. 현재 데이터 상태 **⚠️ 주의: 테이블이 비어있음 (수식 데이터 미입력)** Phase 3에서 5130 분석 결과를 기반으로 수식 데이터를 입력해야 합니다. --- ## 참조 - [README.md](./README.md) - 분석 요약 - [issues.md](./issues.md) - 문제점 및 개선사항