| name | quote-light |
| description | 채팅으로 받은 고객 정보와 제품명·수량·단가로 공유용 견적서 .xlsx 파일을 만드는 스킬. "견적서 만들어줘", "자동 견적 생성!", "○○ 회사 견적서 뽑아줘", "제품 100대 견적", "공유용 견적서", "견적서 양식" 같은 요청이 오면 발동한다. 정보가 부족해도 빈칸 견적서를 생성하며, 회사명·제품명만 줘도 동작한다. 다음은 다루지 않는다(발동하지 않음). 세금계산서 발행, 거래명세서 발행, 인보이스(invoice) 발행, ERP·거래처 시스템 연동, 내부 가격 룰 자동계산. 단가는 직접 입력하는 단순 양식이다. |
공유용 견적서 자동 생성 (quote-light)
무엇을, 왜
외부 고객·파트너에게 보낼 표준 견적서 .xlsx를 만든다. 사용자가 채팅으로 던진 정보를
파싱해 입력 JSON으로 바꾸고, 번들 스크립트(fill_quote.py)가 번들 템플릿
(assets/quote_template.xlsx)을 채워 산출한다. 엑셀 생성 로직을 매번 새로 짜지 말 것 —
스크립트와 템플릿이 디자인·수식·VAT 표기를 이미 갖고 있다.
번들 구성:
scripts/fill_quote.py — 입력 JSON으로 템플릿을 채우는 핵심 스크립트(이것만 실행하면 됨)
assets/quote_template.xlsx — 빈 견적서 템플릿(이미 생성됨)
scripts/create_template.py — 템플릿 재생성(디자인/행 수 변경 시에만)
references/details.md — JSON 전체 스키마, 양식 구조, 공급자 고정, 트러블슈팅
최소 필수 입력
- 고객사 법인명
- 제품 1개 이상(제품명 + 수량 + 단가)
이것만 있으면 생성한다. 나머지는 비어 있어도 된다. 정보가 더 필요해 보여도 다단계로 캐묻지
말고, 빠진 게 "있으면 좋은 것"이면 한 번만 짧게 모아 묻거나 그냥 빈칸으로 만든다.
워크플로우
A) "자동 견적 생성!"처럼 빈손으로 시작한 경우
정보를 하나씩 묻지 말고 아래 양식을 한 번에 보여줘 사용자가 아는 만큼 채워 보내게 한다.
견적서 생성에 필요한 정보입니다. 아는 항목만 채워 한 번에 보내주세요. 빈칸은 그대로 둬도 됩니다.
[고객사 (공급받는자)] 법인명(필수) / 담당자 / 연락처 / 이메일 / 주소 / 견적번호 /
발행일(없으면 오늘) / 유효기간(없으면 발행일+30일)
[공급자 (자사)] 법인명(없으면 "(주)샘플") / 등록번호 / 대표자 / 주소 / 담당부서 / 연락처
[제품 (1~5개)] 제품명 | 수량 | 단가 | 비고
[저장 위치] (없으면 기본 위치)
답이 오면 B)로 진행한다.
B) 정보가 주어진 경우 — 4단계로 실행
-
파싱: 자연어를 입력 JSON으로 변환한다. 전체 스키마는 references/details.md 참고.
예) "예시고객에 노트북 받침대 50개, 단가 35,000원 견적서" →
{"customer":{"company":"(주)예시고객"},
"items":[{"product":"노트북 받침대","quantity":50,"unit_price":35000}]}
-
JSON 파일 저장 후 스크립트 실행: <SKILL_DIR>는 이 SKILL.md가 있는 폴더의 절대 경로다
(예: .../quote-generator/quote-light). <출력경로>·<회사명>·<YYMMDD>도 실제 값으로 치환한다.
cat > /tmp/quote_input.json << 'EOF'
{...파싱된 JSON...}
EOF
python3 <SKILL_DIR>/scripts/fill_quote.py \
/tmp/quote_input.json \
<출력경로>/견적서_<회사명>_<YYMMDD>.xlsx
출력 경로: Claude.ai는 /mnt/user-data/outputs/, Claude Code는 사용자 지정 경로
또는 현재 디렉토리(없으면 ~/Downloads/).
템플릿 자동 복구: fill_quote.py는 assets/quote_template.xlsx가 없거나 열리지
않으면 create_template.py를 자동 실행해 템플릿을 재생성한 뒤 이어서 채운다. 따로
조치할 필요 없다. 만약 ❌ 템플릿 재생성 실패가 뜨면 수동으로 한 번 생성한 뒤 재실행한다.
python3 <SKILL_DIR>/scripts/create_template.py <SKILL_DIR>/assets/quote_template.xlsx
부분 항목 허용: 항목에 수량·단가가 빠져 있어도 그대로 생성된다(제품명만 있어도 됨).
빈 셀은 비운 채 저장되고, 나중에 0.입력 시트 F·G열에 숫자를 넣으면 공급가액·합계가
자동 계산된다. 수량·단가가 숫자가 아니거나 발행일이 YYYY-MM-DD가 아니면 스크립트가
경고(⚠️)를 stderr로 출력하니, 그 항목은 사용자에게 알리고 직접 채우라고 안내한다.
-
자기 검증: 명령이 ✅ 견적서 생성 완료를 출력했고, 파일이 존재하며, 깨지지 않은
xlsx인지(시트 0.입력·1.견적서가 열리는지)까지 확인한다.
ls -la <출력경로>/견적서_*.xlsx
python3 -c "import openpyxl,sys; wb=openpyxl.load_workbook(sys.argv[1]); print('OK', wb.sheetnames)" \
<출력경로>/견적서_<회사명>_<YYMMDD>.xlsx
OK ['0.입력', '1.견적서']가 떠야 정상이다. 파일이 없거나 오류가 났으면 사용자에게
만들었다고 말하지 말고 원인을 확인한다(아래 중단 조건).
-
전달: Claude.ai는 present_files로 제시, Claude Code는 생성 파일의 절대 경로를 알려준다.
함께 알려주면 좋은 것: 공급가액 = 수량 × 단가, 합계 = 항목 공급가액 합(VAT 별도),
비워둔 필드는 0.입력 시트에서 직접 채우면 1.견적서 시트에 자동 반영된다는 안내.
출력 파일명
견적서_<회사명>_<YYMMDD>.xlsx (예: 견적서_예시고객_260512.xlsx).
회사명에 공백·특수문자가 있어도 그대로 사용 가능(Mac/Windows 호환).
엣지 케이스
- 회사명만 있음: 빈 견적서를 만들고, 나머지는
0.입력 시트에서 직접 채우라고 안내.
- 단가/수량 모름(부분 항목): 정상이다. 비운 채 생성하고,
0.입력 시트 F·G열에 숫자를
입력하면 공급가액·합계가 자동 계산된다고 안내한다. 숫자가 아닌 값(예: "협의")을 넣으면
스크립트가 경고하고 그 셀을 비우므로, 사용자가 시트에서 직접 정리하면 된다.
- 항목 5개 초과: 스크립트가 앞 5개만 입력하고 경고(
⚠️)를 stderr로 출력한다. 사용자에게
알리고, 더 필요하면 견적서를 나누거나 references/details.md의 행 수 변경 절차를 안내.
- 할인 요청: 템플릿엔 별도 할인 행이 없다. 할인 후 단가를 직접 계산해
unit_price에 넣고
note(비고)에 "10% 할인 적용" 식으로 표기한다. 또는 할인액을 음수 단가의 별도 항목으로 한 줄
추가한다(예: 제품명 "할인", quantity 1, unit_price 음수). 정가까지 보이려면 후자를 쓴다.
- 부가세(VAT) 포함 요청: 이 양식은 합계가
VAT 별도로 고정돼 있다. "부가세 포함 총액"을
원하면, 합계(공급가액)에 1.1을 곱한 값을 안내 문구로 함께 알려주거나, VAT(공급가액×0.1)를
음/양수 항목으로 한 줄 추가해 표에 드러낸다. 양식의 "VAT 별도" 표기 자체는 바꾸지 않는다.
- 공급자 정보 고정: 매 견적서면 입력 JSON에
supplier 추가, 영구 고정이면 템플릿 재생성.
방법은 references/details.md 참고.
- 디자인 변경 요청:
scripts/create_template.py 편집 후 재생성 → fill_quote.py 재실행.
중단 조건 (이럴 땐 만들지 말고 멈춘다)
- 요청이 세금계산서·거래명세서·인보이스 발행이거나, 내부 가격 룰 자동계산/ERP 연동이면 이 스킬의
범위가 아니다. 그 사실을 알리고, 단순 견적서 양식이면 진행할지 확인한다.
- 고객사 법인명도 제품도 하나 없이 "그냥 만들어줘"만 있으면 A)의 입력 양식부터 보여준다.
assets/quote_template.xlsx가 없거나 손상돼도 fill_quote.py가 create_template.py로
자동 재생성하므로 보통은 멈추지 않는다. 자동 재생성까지 실패할 때만 멈추고 원인을 확인한다.
의존성
Python 3.8+, openpyxl. 상세 스키마·양식 구조·트러블슈팅은 references/details.md.