---
name: storyboard-generator
description: 텍스트 기반 인터뷰/기획 문서를 분석하여 IA(메뉴 구조)와 화면 설계 스토리보드 PPTX를 자동 생성합니다. '기획서 생성', '스토리보드 생성', 'IA 생성' 요청 시 활성화됩니다.
allowed-tools: Read, Write, Edit, Glob, Grep, Bash, Task
---

# Storyboard Generator Skill - 기획서/스토리보드 자동 생성

텍스트 기반 인터뷰 문서나 기획 문서를 분석하여 웹 시스템 기획서(IA + 스토리보드)를 PPTX로 자동 생성하는 스킬입니다.

## 활성화 트리거

다음 키워드가 포함된 요청 시 이 스킬이 활성화됩니다:
- "기획서 생성"
- "스토리보드 생성"
- "IA 생성"
- "화면 설계"
- "웹 기획"

## Instructions

### 1단계: 입력 파일 분석

사용자가 제공한 파일 경로에서 텍스트 문서를 읽고 분석합니다.

```bash
# 파일 읽기
cat [파일경로]
```

분석 대상:
- 인터뷰 스크립트 (script.md, interview.txt 등)
- 기획 문서 (planning.md, requirements.txt 등)
- 요구사항 문서

### 2단계: 데이터 추출

텍스트에서 다음 정보를 자동 추출합니다:

| 추출 항목 | 예시 |
|-----------|------|
| 프로젝트명 | 방화셔터 견적 시스템 |
| 주요 기능 | 셔터 타입 선택, 견적 계산 |
| 메뉴 구조 | 견적 입력 > 셔터 선택, 규격 입력 |
| 화면 요소 | 입력 폼, 테이블, 버튼 |
| 비즈니스 규칙 | 할인율, 계산 공식 |

### 3단계: 설정 파일 생성

추출된 데이터를 기반으로 storyboard-config.json 파일을 생성합니다.

```json
{
  "projectName": "방화셔터 견적 시스템",
  "company": "SAM",
  "author": "IT 혁신팀",
  "date": "2025.01.09",
  "purpose": "프로젝트 목적 설명",
  "features": ["기능 1", "기능 2"],
  "effects": [
    { "icon": "⏱️", "title": "시간 단축", "desc": "설명" }
  ],
  "tocItems": [
    { "num": "01", "title": "프로젝트 개요", "desc": "설명" }
  ],
  "mainMenus": [
    { "title": "메뉴1", "children": ["서브1", "서브2"] }
  ],
  "screens": [
    {
      "taskName": "화면명",
      "route": "/path",
      "screenName": "화면 이름",
      "screenId": "SCREEN_001",
      "descriptions": [
        { "title": "항목1", "content": "설명" }
      ]
    }
  ]
}
```

### 4단계: HTML 슬라이드 생성 (권장)

**HTML 기반 방식**을 사용하면 더 정교한 디자인이 가능합니다.

```bash
# 1단계: HTML 슬라이드 생성
node ~/.claude/skills/storyboard-generator/scripts/generate-html-storyboard.js \
  --config [설정파일.json] \
  --output [html_slides 폴더]

# 2단계: HTML → PPTX 변환
node ~/.claude/skills/storyboard-generator/scripts/convert-html-to-pptx.js \
  --input [html_slides 폴더] \
  --output [출력파일.pptx]
```

### 5단계 (대안): 직접 PPTX 생성

간단한 경우 직접 PPTX를 생성할 수도 있습니다.

```bash
node ~/.claude/skills/storyboard-generator/scripts/generate-storyboard.js \
  --config [설정파일.json] \
  --output [출력파일.pptx]
```

### 6단계: 결과 확인

생성된 PPTX 파일 정보를 사용자에게 안내합니다.

## 생성되는 슬라이드 구조

| 슬라이드 | 내용 | 템플릿 |
|----------|------|--------|
| 1 | 표지 | 프로젝트명, 버전, 날짜 |
| 2 | Document History | 문서 이력 테이블 |
| 3 | 목차 | 섹션 번호 + 제목 |
| 4 | 프로젝트 개요 | 목적, 주요 기능, 기대 효과 |
| 5 | 메뉴 구조 (IA) | 계층형 다이어그램 |
| 6+ | 화면 스토리보드 | 와이어프레임 + Description |

## 스토리보드 슬라이드 레이아웃

```
┌─────────────────────────────────────────────────────────┐
│ Task Name │ [값] │ Ver. │ D1.0 │ Page │ [N] │          │
│ Route     │ [경로] │ Screen Name │ [화면명] │ ID │ [ID] │
├───────────────────────────────────┬─────────────────────┤
│                                   │   Description       │
│     와이어프레임 영역 (6.8")      │─────────────────────│
│                                   │ ① 제목              │
│  ┌─────────────────────────────┐  │    설명 텍스트      │
│  │  사이드바  │  메인 콘텐츠   │  │─────────────────────│
│  │           │                │  │ ② 제목              │
│  │           │                │  │    설명 텍스트      │
│  └─────────────────────────────┘  │─────────────────────│
│                                   │ ③ 제목              │
│                                   │    설명 텍스트      │
└───────────────────────────────────┴─────────────────────┘
```

## wireframeElements 가이드라인 (매우 중요)

### 사이드바 자동 렌더링
**사이드바는 `mainMenus` 배열을 기반으로 자동 생성됩니다.**
- 현재 화면의 `taskName`과 일치하는 메뉴가 **활성(highlight)** 상태로 표시됩니다
- wireframeElements에 사이드바 요소를 포함해도 **자동으로 필터링**되어 중복 표시되지 않습니다
- x좌표 < 1.5인 요소는 사이드바 영역으로 간주되어 제외됩니다

### 좌표 체계 (인치 단위)
```
┌────────────────────────────────────────────────────────┐
│                  슬라이드 (10" x 5.625")                │
├─────────┬──────────────────────────────────────────────┤
│ 사이드바 │              콘텐츠 영역                      │
│ x < 1.5 │              x >= 1.5                        │
│         │                                              │
│ (자동   │  wireframeElements 배치 영역                  │
│  생성)  │                                              │
│         │                                              │
├─────────┴──────────────────────────────────────────────┤
```

### wireframeElements 작성 예시
```json
{
  "screens": [
    {
      "taskName": "견적서 생성",    // mainMenus의 title과 일치해야 함
      "wireframeElements": [
        // ❌ 사이드바 요소 - 작성해도 자동 필터링됨
        {"type": "rect", "x": 0.3, "y": 1.3, "w": 1.2, "h": 4, "fill": "f1f5f9"},
        {"type": "rect", "x": 0.35, "y": 1.4, "w": 1.1, "h": 0.3, "text": "규격 입력"},

        // ✅ 콘텐츠 영역 요소 - 이것만 실제로 렌더링됨
        {"type": "rect", "x": 1.6, "y": 1.3, "w": 5.3, "h": 0.35, "text": "제목"},
        {"type": "rect", "x": 1.6, "y": 1.75, "w": 2.5, "h": 1, "fill": "0d9488"}
      ]
    }
  ]
}
```

### wireframeElements 속성
| 속성 | 타입 | 설명 | 예시 |
|------|------|------|------|
| type | string | 요소 타입 | "rect" |
| x | number | X 좌표 (인치) | 1.6 |
| y | number | Y 좌표 (인치) | 1.3 |
| w | number | 너비 (인치) | 2.5 |
| h | number | 높이 (인치) | 0.8 |
| fill | string | 배경색 (# 없이) | "0d9488" |
| text | string | 텍스트 내용 | "제목" |
| fontSize | number | 폰트 크기 | 11 |
| color | string | 텍스트 색상 | "FFFFFF" |
| bold | boolean | 굵게 | true |
| align | string | 정렬 | "left", "center", "right" |

### 사이드바 메뉴 설정
```json
{
  "mainMenus": [
    { "title": "규격 입력", "children": ["개구부 크기", "제작 규격"] },
    { "title": "단가 계산", "children": ["재질 선택", "면적 단가"] },
    { "title": "부대비용", "children": ["모터 선정", "철거비"] },
    { "title": "견적서 생성", "children": ["마진율", "출력"] }
  ],
  "screens": [
    {
      "taskName": "견적서 생성"  // ← 이 화면에서 "견적서 생성" 메뉴가 활성화됨
    }
  ]
}
```

## Description 마커 시스템 (매우 중요)

### 빨간 번호 마커
Description 패널의 각 항목 번호(①②③④)가 **빨간색 원형 마커**로 표시됩니다.
- 와이어프레임 영역에 동일한 빨간 번호 마커가 해당 요소 위치에 표시됩니다
- Description의 설명이 화면의 어떤 요소를 가리키는지 명확하게 매핑됩니다

### markerX, markerY 속성
descriptions 배열의 각 항목에 `markerX`, `markerY`를 추가하여 마커 위치를 지정합니다.

```json
{
  "descriptions": [
    {
      "title": "개구부 입력",
      "content": "고객사 제공 문 크기 입력",
      "markerX": 1.6,   // 마커 X 좌표 (인치)
      "markerY": 1.75   // 마커 Y 좌표 (인치)
    },
    {
      "title": "제작 규격 변환",
      "content": "W+100mm, H+600mm 자동 계산",
      "markerX": 5.1,
      "markerY": 1.75
    }
  ]
}
```

### descriptions 속성
| 속성 | 타입 | 필수 | 설명 | 예시 |
|------|------|------|------|------|
| title | string | ✅ | 항목 제목 | "개구부 입력" |
| content | string | ✅ | 설명 내용 | "mm 단위로 입력" |
| markerX | number | ❌ | 마커 X 좌표 (인치) | 1.6 |
| markerY | number | ❌ | 마커 Y 좌표 (인치) | 1.75 |

### 마커 위치 가이드
```
┌──────────────────────────────────────────────┐
│ 사이드바 │      콘텐츠 영역                    │
│          │  ①────────────  ②────────────    │
│          │  │ 개구부 입력  │  │ 제작 규격  │    │
│          │  └────────────  └────────────    │
│          │                                    │
│          │  ③────────────  ④────────────    │
│          │  │ 면적 계산   │  │ 할증 적용  │    │
│          │  └────────────  └────────────    │
└──────────────────────────────────────────────┘
```

- markerX, markerY가 없으면 기본 위치(좌측 세로 배치)에 마커 표시
- 좌표는 wireframeElements와 동일한 인치 단위 사용
- 마커는 z-index가 높아 다른 요소 위에 표시됨

## 색상 팔레트

```javascript
const colors = {
    primary: '0d9488',      // Teal (주요 강조)
    secondary: '1e293b',    // Slate 800 (헤더, 배경)
    accent: '95C11F',       // 라임 그린 (Description 헤더)
    warning: 'f59e0b',      // 경고 (유효기간 등)
    danger: 'dc2626',       // 위험 (필수 항목)
    white: 'FFFFFF',
    lightGray: 'f1f5f9',    // 배경
    darkGray: '64748b',     // 보조 텍스트
    black: '1a1a1a',        // Description 영역 배경
    wireframeBg: 'f8fafc',  // 와이어프레임 배경
    wireframeBorder: 'e2e8f0'  // 와이어프레임 테두리
};
```

## Description 패널 스타일 가이드 (매우 중요)

### 배경 없는 투명 스타일
Description 영역의 각 항목은 **배경색 없이** 투명하게 표현해야 합니다.

```javascript
// ✅ 올바른 Description 항목 스타일
descriptions.forEach((desc, idx) => {
    const y = 1.25 + idx * 0.85;

    // 번호 원 (라임 그린 배경)
    slide.addShape('ellipse', {
        x: 7.25, y: y, w: 0.25, h: 0.25,
        fill: { color: '95C11F' }  // 라임 그린
    });
    slide.addText(String(idx + 1), {
        x: 7.25, y: y, w: 0.25, h: 0.25,
        fontSize: 7, bold: true, color: 'FFFFFF',
        align: 'center', valign: 'middle'
    });

    // 제목 - 배경 없음, 흰색 텍스트
    slide.addText(desc.title, {
        x: 7.55, y: y, w: 2.1, h: 0.25,
        fontSize: 8, bold: true, color: 'FFFFFF'
        // fill 속성 없음 = 투명 배경
    });

    // 설명 - 배경 없음, 회색 텍스트
    slide.addText(desc.content, {
        x: 7.25, y: y + 0.28, w: 2.4, h: 0.5,
        fontSize: 7, color: '64748b'
        // fill 속성 없음 = 투명 배경
    });
});

// ❌ 잘못된 스타일 - 각 항목에 배경색 적용
slide.addText(desc.title, {
    x: 7.55, y: y, w: 2.1, h: 0.25,
    fill: { color: '333333' }  // 배경색 금지
});
```

### Description 영역 구조
```
┌─────────────────────────┐
│  Description (헤더)     │ ← 라임 그린 배경 (#95C11F)
├─────────────────────────┤
│                         │
│  ① 제목                 │ ← 번호만 원형 배경, 텍스트는 투명
│     설명 텍스트         │ ← 배경 없음
│                         │
│  ② 제목                 │
│     설명 텍스트         │
│                         │
│  ③ 제목                 │
│     설명 텍스트         │
│                         │
│  ④ 제목                 │
│     설명 텍스트         │
│                         │
└─────────────────────────┘
   전체 배경: #1a1a1a (검정)
   각 항목: 배경 없음 (투명)
```

## 테이블 스타일 가이드 (매우 중요)

### 일관된 테두리 적용
모든 테이블은 **동일한 테두리 스타일**을 사용해야 합니다.

```javascript
// ✅ 올바른 테이블 테두리 스타일
slide.addTable(data, {
    x: 0.5, y: 1, w: 9, h: 2,
    fontSize: 10,
    color: '1e293b',
    border: { pt: 0.5, color: '64748b' },  // 일관된 0.5pt, darkGray
    colW: [1.2, 0.8, 1.5, 4, 1.5],
    align: 'center',
    valign: 'middle'
});

// ❌ 잘못된 스타일 - 테두리 불일치
slide.addTable(data, {
    border: { pt: 1, color: '000000' }  // 다른 두께/색상 사용 금지
});
```

### 헤더 정보 테이블 (스토리보드 상단)
```javascript
const headerData = [
    ['Task Name', screenInfo.taskName, 'Ver.', 'D1.0', 'Page', screenInfo.page],
    ['Route', screenInfo.route, 'Screen Name', screenInfo.screenName, 'Screen ID', screenInfo.screenId]
];

slide.addTable(headerData, {
    x: 0.2, y: 0.1, w: 9.6, h: 0.5,
    fontSize: 8,
    color: '1e293b',
    border: { pt: 0.5, color: '64748b' },  // 표준 테두리
    fill: { color: 'f1f5f9' },              // 연한 회색 배경
    colW: [0.8, 2.5, 0.8, 2.5, 0.8, 2.2]   // 균일한 열 너비
});
```

### 와이어프레임 내 테이블 형태 요소
```javascript
// 와이어프레임 내 테이블 스타일 박스
slide.addShape('rect', {
    x: 1.6, y: 2.2, w: 5.3, h: 0.35,
    fill: { color: '1e293b' },
    line: { color: 'e2e8f0', width: 0.5 }  // 일관된 테두리
});

// 행 구분
slide.addShape('rect', {
    x: 1.6, y: 2.6, w: 5.3, h: 0.35,
    fill: { color: 'FFFFFF' },
    line: { color: 'e2e8f0', width: 0.5 }  // 동일한 테두리
});
```

### 테이블 스타일 요약
| 요소 | 테두리 두께 | 테두리 색상 | 배경색 |
|------|------------|------------|--------|
| 헤더 정보 테이블 | 0.5pt | 64748b | f1f5f9 |
| Document History | 0.5pt | 64748b | FFFFFF |
| 와이어프레임 테이블 | 0.5pt | e2e8f0 | FFFFFF/1e293b |
| IA 메뉴 박스 | 0.5pt | e2e8f0 | f1f5f9 |

## PptxGenJS 핵심 규칙

### 색상 코드 (매우 중요)
```javascript
// ✅ 올바른 사용 - # 없이
{ color: 'FF0000' }
{ fill: { color: '1e3a5f' } }

// ❌ 잘못된 사용 - 파일 손상
{ color: '#FF0000' }
```

### 슬라이드 크기 (16:9)
```javascript
pptx.defineLayout({ name: 'CUSTOM_16x9', width: 10, height: 5.625 });
pptx.layout = 'CUSTOM_16x9';
```

### 요소 추가 예시
```javascript
// 텍스트
slide.addText('제목', {
    x: 0.5, y: 0.5, w: 9, h: 0.5,
    fontSize: 20, bold: true, color: '1e293b'
});

// 도형
slide.addShape('rect', {
    x: 0, y: 0, w: 10, h: 0.7,
    fill: { color: '1e293b' }
});

// 테이블
slide.addTable(data, {
    x: 0.5, y: 1, w: 9, h: 2,
    fontSize: 10,
    border: { pt: 0.5, color: '64748b' }
});
```

## 입력 파일 형식 지원

### Markdown (.md)
```markdown
## 프로젝트명: 방화셔터 견적 시스템

### 주요 기능
1. 셔터 타입 선택
2. 규격 입력 및 계산
3. 견적서 생성
```

### 텍스트 (.txt)
```
=== 프로젝트 개요 ===
방화셔터 견적서 자동화 시스템

=== 메뉴 구조 ===
- 견적 입력
  - 셔터 타입 선택
  - 규격 입력
```

### 인터뷰 스크립트
```
**김철수:** 어떤 기능이 필요한가요?
**박지민:** 셔터 종류 선택과 자동 계산이요.
```

## 실행 예시

### 기본 사용
```bash
# 사용자 요청
"C:\project\script.md 기획서 생성해줘"

# 실행되는 명령
node ~/.claude/skills/storyboard-generator/scripts/generate-storyboard.js \
  --input "C:\project\script.md" \
  --output "C:\project\pptx\storyboard.pptx"
```

### 출력 폴더 지정
```bash
# 사용자 요청
"interview.txt를 분석해서 스토리보드 생성, output 폴더에 저장"

# 실행되는 명령
node ~/.claude/skills/storyboard-generator/scripts/generate-storyboard.js \
  --input "interview.txt" \
  --output "output/storyboard.pptx"
```

## 워크플로우 (HTML 기반 - 권장)

```
┌─────────────────┐
│  입력 파일      │  script.md, interview.txt
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  텍스트 분석    │  섹션 인식, 키워드 추출
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  데이터 구조화  │  storyboard-config.json 생성
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  HTML 슬라이드  │  generate-html-storyboard.js
│  생성           │  → 각 슬라이드를 HTML로 생성
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  HTML → PPTX    │  convert-html-to-pptx.js
│  변환           │  → Playwright로 렌더링 후 변환
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  PPTX 출력      │  완성된 기획서
└─────────────────┘
```

### HTML 기반 방식의 장점

1. **정교한 디자인**: CSS로 정밀한 레이아웃 제어 가능
2. **일관된 스타일**: 테두리, 간격, 색상이 CSS로 정확하게 적용
3. **미리보기**: HTML 파일을 브라우저에서 바로 확인 가능
4. **디버깅 용이**: 문제 발생 시 HTML 소스 확인으로 빠른 수정

## 필수 의존성

```bash
# Node.js 패키지 (scripts 폴더에 설치)
cd ~/.claude/skills/storyboard-generator/scripts
npm install pptxgenjs playwright sharp
```

## 관련 스킬

- **text-analyzer-skill**: 텍스트 구조 분석
- **proposal-skill**: PDF 기획서 분석
- **pptx-skill**: HTML → PPTX 변환
- **design-skill**: 슬라이드 디자인

## 대량 견적서 생성 워크플로우

### 배치 생성 프로세스
```
┌─────────────────┐
│  마스터 설정     │  estimate-template.json (공통 설정)
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  개별 견적 데이터 │  estimates/*.json (프로젝트별 변수)
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  설정 파일 병합  │  마스터 + 개별 = 완성된 config
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  HTML 슬라이드   │  각 견적별 html_slides 폴더
│  생성 (배치)     │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  PPTX 변환      │  각 견적별 .pptx 파일
│  (배치)         │
└─────────────────┘
```

### 마스터 템플릿 구조
```json
{
  "_template": true,
  "company": "SAM",
  "author": "DX 추진팀",
  "mainMenus": [
    { "title": "규격 입력", "children": ["개구부 크기", "제작 규격 계산"] },
    { "title": "단가 계산", "children": ["재질 선택", "두께 선택"] },
    { "title": "부대비용", "children": ["모터 선정", "철거/폐기물"] },
    { "title": "견적서 생성", "children": ["마진율 적용", "PPT 출력"] }
  ],
  "pricingRules": {
    "materials": {
      "아연도강판_0.8t": 85000,
      "아연도강판_1.0t": 90000,
      "스크린_일반": "변동",
      "스크린_차열": "일반 × 1.8"
    },
    "motors": {
      "400형": { "maxWeight": 300, "price": 450000 },
      "600형": { "maxWeight": 500, "price": 600000 },
      "1000형": { "maxWeight": 999, "price": 850000 }
    },
    "additionalCosts": {
      "철거비": 150000,
      "폐기물처리": 50000,
      "고소장비": 250000
    },
    "margins": {
      "관공서": 0.15,
      "일반건설사": 0.20,
      "특수": 0.25
    }
  }
}
```

### 개별 견적 데이터 예시
```json
{
  "_extends": "estimate-template.json",
  "projectName": "○○빌딩 방화셔터 교체공사",
  "date": "2025.01.15",
  "items": [
    {
      "location": "B1F 주차장 입구",
      "openingW": 3000,
      "openingH": 4000,
      "material": "아연도강판_0.8t",
      "workflow": "교체"
    },
    {
      "location": "1F 로비",
      "openingW": 2500,
      "openingH": 3500,
      "material": "스크린_일반",
      "workflow": "신축"
    }
  ]
}
```

### 배치 실행 명령
```bash
# 여러 견적서 일괄 생성
for config in estimates/*.json; do
  name=$(basename "$config" .json)

  # HTML 생성
  node ~/.claude/skills/storyboard-generator/scripts/generate-html-storyboard.js \
    --config "$config" \
    --output "output/${name}_html"

  # PPTX 변환
  node ~/.claude/skills/storyboard-generator/scripts/convert-html-to-pptx.js \
    --input "output/${name}_html" \
    --output "output/${name}.pptx"
done
```

## 방화셔터 견적 계산 로직

### 규격 변환 공식
```
제작 규격 = 개구부 + 여유치

┌─────────────────────────────────────────────────┐
│  제작 폭(W)  = 개구부 폭 + 100mm (레일 설치용)    │
│  제작 높이(H) = 개구부 높이 + 600mm (권상높이)    │
└─────────────────────────────────────────────────┘

예시:
  개구부: 3,000mm × 4,000mm
  제작:   3,100mm × 4,600mm
```

### 면적 계산 및 할증
```
실제면적 = 제작W × 제작H ÷ 1,000,000 (㎡)

┌─────────────────────────────────────────────────┐
│  최소면적 규칙: 5㎡ 미만 → 5㎡ 강제 적용           │
│  (제작 공정상 최소 규격 필요)                      │
└─────────────────────────────────────────────────┘

예시:
  3,100 × 4,600 = 14,260,000 ㎟ = 14.26㎡
  적용면적 = 14.26㎡ (5㎡ 이상이므로 그대로)
```

### 단가표 (기준가)
| 재질 | 두께 | 단가(원/㎡) | 비고 |
|------|------|------------|------|
| 아연도 강판 | 0.8t | 85,000 | 기본 |
| 아연도 강판 | 1.0t | 90,000 | 소방 기준 |
| 스크린 (일반) | - | 변동 | 시세 적용 |
| 스크린 (차열) | - | 일반×1.8 | 차열 등급 |

### 하중 계산 및 모터 선정
```
총 하중 = 적용면적 × 12kg (0.8t 기준)
          적용면적 × 15kg (1.0t 기준)

┌────────────────────────────────────────────────┐
│  모터 선정 기준                                   │
│  ~300kg   → 400형 (450,000원)                   │
│  300~500kg → 600형 (600,000원)                  │
│  500kg~   → 1000형 (850,000원)                  │
└────────────────────────────────────────────────┘
```

### 부대비용 항목
| 항목 | 금액 | 적용 조건 |
|------|------|----------|
| 철거비 | 150,000원/개소 | 교체공사 시 |
| 폐기물처리 | 50,000원/개소 | 교체공사 시 |
| 고소장비 | 250,000원/일 | 지하/고층 현장 |
| 지방운반비 | 별도 협의 | 수도권 외 |

### 최종 금액 계산
```
원가 합계 = 자재비 + 모터비 + 부대비용

┌────────────────────────────────────────────────┐
│  마진율 적용                                     │
│  관공서: 15%                                    │
│  일반 건설사: 20~25%                            │
│  특수 (원거리/고층): 25~30%                      │
└────────────────────────────────────────────────┘

최종금액 = 원가 × (1 + 마진율)
절삭금액 = 만원 단위 이하 절삭 (네고 대비)
```

## 워크플로우 변형 (신축 vs 교체)

### 신축공사 워크플로우
```
┌──────────┐   ┌──────────┐   ┌──────────┐   ┌──────────┐
│ 규격 입력 │ → │ 단가 계산 │ → │ 모터 선정 │ → │ 견적 생성 │
└──────────┘   └──────────┘   └──────────┘   └──────────┘

특징:
- 철거비/폐기물 비용 없음
- 기존 구조물 확인 불필요
- 전기 배선 신규 설치
```

### 교체공사 워크플로우
```
┌──────────┐   ┌──────────┐   ┌──────────┐   ┌──────────┐   ┌──────────┐
│ 규격 입력 │ → │ 단가 계산 │ → │ 모터 선정 │ → │ 부대비용  │ → │ 견적 생성 │
└──────────┘   └──────────┘   └──────────┘   └──────────┘   └──────────┘
                                              ↑
                                        철거비, 폐기물,
                                        양중비 추가

특징:
- 철거비 150,000원/개소 추가
- 폐기물처리 50,000원/개소 추가
- 기존 전기 배선 활용 가능
- 양중비(고소장비) 현장 상황에 따라 추가
```

### 설정 파일에서 워크플로우 구분
```json
{
  "screens": [
    {
      "taskName": "부대비용",
      "conditionalDisplay": {
        "show": "workflow === '교체'",
        "description": "교체공사 시에만 이 화면 표시"
      }
    }
  ],
  "calculations": {
    "additionalCosts": {
      "철거비": { "condition": "workflow === '교체'", "amount": 150000 },
      "폐기물": { "condition": "workflow === '교체'", "amount": 50000 }
    }
  }
}
```

## 주의사항

1. **입력 파일 인코딩**: UTF-8 권장
2. **출력 폴더**: 존재하지 않으면 자동 생성
3. **파일명 충돌**: 기존 파일 덮어쓰기
4. **한글 지원**: 맑은 고딕, Pretendard 폰트 사용
5. **단가 변동**: 스크린 방화셔터 단가는 시세에 따라 변동 - 외부 단가표 참조 필요
6. **면책 조항**: 전기 배선 및 상시 전원 공사 별도 문구 필수 삽입
