Files
sam-docs/projects/mes/v1-analysis/quotation-analysis.md
hskwon 764a6470c6 MES 분석 문서 구조 정리: v1/v2 분리
- v1-analysis: 5130 레거시 기반 견적 분석 추가
- v2-analysis: 기존 MES 분석 문서들 이동
  - customer, master-data, order, price
  - production, production-userflow, quote, site
2025-12-19 15:37:59 +09:00

15 KiB
Raw Permalink Blame History

견적 시스템 통합 분석 문서

작성일: 2025-11-12 (v1 분석) 원본 문서: 00_baseline 폴더 내 14개 파일에서 견적 관련 내용 추출 분석 범위: 비즈니스 로직, 화면 설계, API 스펙, 구현 현황, Gap 분석


1. 시스템 개요

1.1 견적 시스템 핵심 기능

가변 크기 제품(셔터)의 견적을 자동 계산하는 ERP 시스템으로 4가지 핵심 자동화 기능 제공:

기능 설명 구현 상태
🔗 치수 자동 연결 상위 제품 치수 → 하위 제품 치수 자동 전달 미구현
💰 단가 자동 연동 하위 품목 판매단가 → 상위 품목 원가 자동 반영 ⚠️ 부분
📊 BOM 전개 계층 구조 기반 구성품 자동 계산 프론트 구현
💲 원가/판매가 자동 계산 치수 기반 실시간 견적 산출 프론트 구현

1.2 품목 코드 체계

RM-XXX   : 원자재 (Raw Material) - BOM 최하위, 가격만 정의
PT-XXX   : 부품 (Part) - 구매/제작 구분
FG-XXX   : 완제품 (Finished Goods) - 견적 대상

2. 비즈니스 프로세스 (6단계 Phase)

Phase 1: 기초 데이터 설정

  • 메뉴: 기준정보 관리 > 사원 관리, 영업관리 > 매출처 관리
  • 목적: 견적서 작성을 위한 마스터 데이터 등록
  • 항목: 사원 정보, 매출처 정보

Phase 2: 원자재 등록 (RM)

  • 메뉴: 생산관리 > 품목관리 (개선)
  • 등록 정보: 품목명, 단위, 구매단가
  • 예시: RM-001 (알루미늄 압출재, 8,000원/M)

Phase 3: 구매 부품 등록 (PT-구매)

  • 메뉴: 생산관리 > 품목관리 (개선)
  • 등록 정보: 품목명, 구매단가, 마진율
  • 자동 계산: 판매단가 = 구매단가 × (1 + 마진율/100)
  • 예시: PT-MOTOR-001 (구매 120,000원, 마진 50%, 판매 180,000원)

Phase 4: 제작 부품 등록 (PT-제작, 가변 크기)

  • 중요 설정: "가변 크기 제품" 체크
  • Step 1: 치수 정의 (L: 길이, 기본값 3000mm)
  • Step 2: BOM 등록 (계산식: L/1000 - 길이에 따른 자재 소요량)
  • Step 3: 원가 설정 (자재비 자동, 가공비 입력, 마진율 설정)

Phase 5: 완제품 등록 (FG, 가변 크기 + 옵션)

  • Step 1: 기본 정보 + 가변 크기 체크
  • Step 2: 치수 정의 (W, H) + 옵션 정의 (MOTOR, REMOTE)
  • Step 3: BOM 등록 (조건부 BOM: MOTOR='Y')
  • Step 4: 원가 설정 (공임비, 설치비, 마진율)
  • Step 5: 치수 연결 매핑 (세트.W → 레일.L, 세트.W → 커튼.W)

Phase 6: 견적서 작성 (실시간 계산)

  • 메뉴: 영업관리 > 견적관리 (개선)
  • 프로세스: 품목 선택 → 치수/옵션 입력 → 실시간 계산 → 저장/출력

3. 유저 스토리 (S1~S17)

Phase 1: 자재/부품 마스터 등록

Story 역할 내용
S1 기준정보 담당자 원자재(RM) 등록
S2 기준정보 담당자 구매 부품(PT) 등록
S3 기준정보 담당자 제작 부품 등록

Phase 2: 부품 BOM 및 원가 정의

Story 역할 내용
S4 생산기술 담당자 제작 부품 치수 정의
S5 생산기술 담당자 부품 BOM 생성
S6 생산기술 담당자 BOM 소요량 수식 입력 (G/1000*1.02)
S7 원가 관리팀 부품 매출 단가 설정

Phase 3: 제품 BOM 및 최종 정책 정의

Story 역할 내용
S8 기준정보 담당자 최종 판매 제품(FG) 등록
S9 생산기술 담당자 제품 치수/옵션 정의 (W, H, MOTOR)
S10 생산기술 담당자 제품 BOM 생성 (조건부: MOTOR='Y')
S11 생산기술 담당자 치수 연결 매핑 정의 (W→G)
S12 원가 관리팀 제품 최종 판매 정책 설정

Phase 4: 견적 산출

Story 역할 내용
S13 영업 담당자 새 견적서 생성
S14 영업 담당자 가변 제품 견적서에 추가
S15 영업 담당자 고객 요구 사이즈/옵션 입력
S16 영업 담당자 실시간 견적 단가 확인
S17 영업 담당자 확정 견적 저장 및 PDF 출력

4. 원가 계산 로직

4.1 제작 부품 원가 (PT-RAIL-VAR 예시, G=3500mm)

[자재비]
알루미늄: G/1000 × 1.02 × 8,000원 = 3.57M × 8,000 = 28,560원
브래킷: 8개 × 500원 = 4,000원
자재비 합계 = 32,560원

[총원가]
총원가 = 자재비 + 가공비 = 32,560 + 3,000 = 35,560원

[판매단가]
판매단가 = 총원가 × (1 + 마진율/100) = 35,560 × 1.2 = 42,672원

4.2 완제품 원가 (FG-SHUTTER-SET, W=3500, H=2500, MOTOR=Y)

[자재비 - 하위 구성품 판매단가 합계]
가이드레일 × 2: 42,672 × 2 = 85,344원
셔터 커튼 × 1: (면적 기반) = 291,664원
셔터 모터 × 1: 180,000원 (MOTOR=Y)
자재비 합계 = 557,008원

[총원가]
총원가 = 자재비 + 공임비 + 설치비 = 557,008 + 100,000 + 50,000 = 707,008원

[판매단가]
판매단가 = 총원가 × (1 + 마진율/100) = 707,008 × 1.25 = 883,760원

4.3 치수 자동 전달 흐름

견적 입력: 세트 W=3500, H=2500
    ↓ 자동 전달 (치수 매핑)
가이드레일 G = 3500 (W→G 매핑)
셔터 커튼 W = 3500, H = 2500
    ↓ 각 하위 품목 원가 자동 계산
상위 품목 자재비 = Σ(하위 판매단가)

5. 화면 설계

5.1 견적 관리 목록 (QuoteManagement3List.tsx)

  • 파일: 788 lines
  • StatCards: 총 견적서, 수주 전환, 최종 확정, 총 견적금액
  • 테이블 컬럼: 견적번호, 작성일, 거래처, 담당자, 견적금액, 상태, 유효기한
  • 기능: 검색/필터, 수정 이력 조회, 산출내역서 보기

5.2 견적 작성 (QuoteManagement3Write.tsx)

  • 파일: 1,644 lines
  • 섹션: 기본 정보, 견적 품목, 합계 정보, 특이사항 (Collapsible)
  • 핵심 기능:
    • BOM 기반 자동 견적 계산
    • 수식 편집 UI (W, H 변수 지원)
    • 견적 수정 이력 관리 (Revision)
    • 견적번호 자동 생성 (KD-PR-250717-02)
    • 거래처/현장 자동 등록

5.3 견적 계산 미리보기 UI

┌─────────────────────────────────────┐
│ 구성품 목록 (BOM 전개)              │
├─────────────────────────────────────┤
│ • 가이드레일 (3.5m) × 2   85,344원 │
│ • 셔터 커튼 (8.75㎡) × 1 291,664원  │
│ • 셔터 모터 × 1          180,000원  │
├─────────────────────────────────────┤
│ 원가 내역                           │
├─────────────────────────────────────┤
│ 자재비:     557,008원               │
│ 공임비:     100,000원               │
│ 설치비:      50,000원               │
│ 총 원가:    707,008원               │
├─────────────────────────────────────┤
│ 견적 금액                           │
├─────────────────────────────────────┤
│ 판매단가:   883,760원 (마진 25%)    │
│ 부가세:      88,376원 (10%)         │
│ 총액:       972,136원               │
└─────────────────────────────────────┘

6. API 스펙 (필요/현황)

6.1 필요한 API 엔드포인트

엔드포인트 용도 구현 상태
POST /api/v1/quotes 견적서 생성 확인 필요
POST /api/v1/quotes/{id}/items 품목 추가 확인 필요
POST /api/v1/quotes/calculate 실시간 견적 계산 미구현
GET /api/v1/quotes/{id}/pdf PDF 출력 확인 필요
POST /api/v1/boms/{id}/dimension-mappings 치수 연결 매핑 미구현

6.2 견적 계산 API 스펙 (제안)

// POST /api/v1/quotes/calculate
// Request
{
  "product_id": 123,
  "dimensions": { "W": 3500, "H": 2500 },
  "options": { "MOTOR": "Y", "REMOTE": "Y" },
  "quantity": 1
}

// Response
{
  "bom_breakdown": [
    { "item_code": "PT-RAIL-VAR", "quantity": 2, "unit_price": 42672, "amount": 85344 },
    { "item_code": "PT-CURTAIN-VAR", "quantity": 1, "unit_price": 291664, "amount": 291664 },
    { "item_code": "PT-MOTOR-001", "quantity": 1, "unit_price": 180000, "amount": 180000 }
  ],
  "cost_breakdown": {
    "material_cost": 557008,
    "labor_cost": 100000,
    "installation_cost": 50000,
    "total_cost": 707008
  },
  "pricing": {
    "unit_price": 883760,
    "margin_rate": 25,
    "vat": 88376,
    "total": 972136
  }
}

7. 데이터 모델

7.1 필요한 테이블/필드

테이블 필드 용도 상태
products dimensions (JSON) 치수 정의 없음
products options (JSON) 옵션 정의 ⚠️ Material만
product_components formula BOM 소요량 계산식 없음
product_components condition 조건부 BOM 없음
dimension_mappings - 치수 연결 매핑 테이블 없음
quotes - 견적서 존재 추정
quote_items - 견적 품목 존재 추정

7.2 치수 연결 매핑 테이블 (제안)

CREATE TABLE dimension_mappings (
    id BIGINT PRIMARY KEY,
    bom_id BIGINT NOT NULL,
    parent_product_id BIGINT NOT NULL,
    child_product_id BIGINT NOT NULL,
    parent_dimension VARCHAR(50) NOT NULL,  -- 'W', 'H'
    child_dimension VARCHAR(50) NOT NULL,   -- 'G', 'L'
    created_at TIMESTAMP,
    updated_at TIMESTAMP,
    FOREIGN KEY (bom_id) REFERENCES boms(id),
    FOREIGN KEY (parent_product_id) REFERENCES products(id),
    FOREIGN KEY (child_product_id) REFERENCES products(id)
);

8. Gap 분석 (견적 관련)

8.1 Critical Gaps (P0)

Gap # 항목 상태 예상 작업량
#2 치수 연결 매핑 시스템 백엔드+프론트 미구현 1-2주
#3 주문 기반 견적 계산 API ⚠️ 설계 BOM만 존재 1-2주
#4 BOM formula 필드 프론트 로컬만 1주
#5 BOM condition 필드 미구현 1-2주

8.2 현재 구현 상태

프론트엔드 구현 완료:

  • BOM 기반 자동 견적 계산 (QuoteManagement3Write.tsx)
  • 수식 편집 UI (W, H 변수 지원)
  • 견적 수정 이력 관리 (Revision)
  • 견적번호 자동 생성

백엔드 미구현:

  • 치수 연결 매핑 (dimension_mappings)
  • BOM formula/condition 필드
  • 주문 기반 견적 계산 API
  • 프론트엔드에서 중복 구현 중 (백엔드 연동 필요)

8.3 해결 우선순위

Week 1-2: 백엔드 핵심 기능
├── dimension_mappings 테이블 생성
├── product_components.formula 필드 추가
├── product_components.condition 필드 추가
└── POST /api/v1/quotes/calculate API 개발

Week 3-4: 프론트엔드 연동
├── 백엔드 API 연동 (중복 로직 제거)
├── 치수 매핑 UI 개발
└── BOM 에디터 리팩토링

9. 프론트엔드 컴포넌트

9.1 견적 관련 컴포넌트

컴포넌트 파일 크기 상태
QuoteManagement3List QuoteManagement3List.tsx 788 lines 완료
QuoteManagement3Write QuoteManagement3Write.tsx 1,644 lines ⚠️ 리팩토링 필요
QuoteCalculationReport QuoteCalculationReport.tsx - 존재
QuoteSimulation QuoteSimulation.tsx - 기존 버전

9.2 리팩토링 제안 (QuoteManagement3Write.tsx)

QuoteManagement3Write.tsx (1,644 lines)
    ↓ 리팩토링
├── pages/QuoteWritePage.tsx (100-150 lines)
├── organisms/QuoteFormSection.tsx (200-300 lines)
├── organisms/ProductSelectionSection.tsx (200-300 lines)
├── organisms/BOMCalculationTable.tsx (300-400 lines) ⭐
├── hooks/useQuoteForm.ts (200-300 lines)
├── hooks/useBOMCalculation.ts (200-300 lines) ⭐
├── hooks/useFormulaCalculator.ts (100-150 lines) ⭐
├── hooks/useQuoteRevision.ts (150-200 lines)
└── utils/quoteNumberGenerator.ts (50-100 lines)

10. 견적 수정 이력 (Revision) 시스템

10.1 데이터 구조

interface QuoteRevision {
  revisionNumber: number;      // 수정 차수
  revisionDate: string;        // 수정 일자
  revisionReason: string;      // 수정 사유
  data: Partial<QuoteData>;    // 해당 시점 데이터 스냅샷
}

interface QuoteData {
  currentRevision?: number;    // 현재 수정 차수
  isFinal?: boolean;           // 최종 확정 여부
  revisions?: QuoteRevision[]; // 수정 이력 배열
  finalizedDate?: string;
  finalizedBy?: string;
}

10.2 견적번호 생성 규칙

KD-{제품타입}-{날짜}-{순번}
예: KD-PR-250717-02

- KD: 회사 코드
- PR: 제품 타입 (SC: 스크린, PR: 철재)
- 250717: 날짜 (YYMMDD)
- 02: 당일 순번

11. 메뉴 구조

영업관리
├── 리드 관리
├── 매출처 관리
├── 거래처 관리
├── 견적 관리 (개선) ⭐
│   ├── 견적 목록 (QuoteManagement3List.tsx)
│   └── 견적 작성 (QuoteManagement3Write.tsx)
├── 견적 관리 (기존 - 시뮬레이션)
├── 수주 관리
└── 영업 실적

생산관리
├── 품목 관리 (개선) ⭐
├── BOM 관리 (개선) ⭐
│   └── 치수 연결 탭 (신규 필요)
└── ...

12. 결론

12.1 현재 상태 요약

영역 상태 설명
비즈니스 로직 정의 완료 6단계 Phase, 17개 유저 스토리
화면 설계 구현 완료 견적 목록/작성 화면
프론트엔드 ⚠️ 부분 완료 BOM 계산 구현, 리팩토링 필요
백엔드 API 미흡 치수 매핑, 계산 API 부재
DB 스키마 미흡 dimension_mappings 등 부재

12.2 우선 작업 항목

  1. 백엔드 (3-4주)

    • dimension_mappings 테이블 생성
    • BOM formula/condition 필드 추가
    • 견적 계산 API 개발
  2. 프론트엔드 (2-3주)

    • 백엔드 API 연동
    • 치수 매핑 UI 개발
    • 컴포넌트 리팩토링

문서 버전: v1.0 (통합 분석본) 원본: 00_baseline 폴더 14개 파일 다음 단계: v2 분석 (2025-12-18) 진행 중