Imported from 1970jjh/hrd-work-pack (
skills/quote-money/SKILL.md). Install upstream withnpx skills add 1970jjh/hrd-work-pack --skill quote-money. Copyright stays with the author.
회사·담당자 정보는 프로필에서 읽는다. 이 문서의
{{company.brand}}{{owner.email}}같은 표시는 자리표시자다. 값은%USERPROFILE%\.claude\hrd-work-pack\profile.json에 있다. 파일이 없거나 필요한 항목이 비어 있으면 먼저hrd-setup스킬을 실행하고 이어서 진행한다. 스크립트는hrdprofile.py의P("company.brand")로 같은 값을 읽는다.
<스킬팩>은 이 플러그인이 설치된 폴더다 — 이 SKILL.md 가 있는 폴더의 두 단계 위 (<스킬팩>/skills/<스킬이름>/SKILL.md). 문서의 명령·경로는 그 폴더 기준으로 바꿔 실행한다.
{{company.brand}} 견적서 · 거래내역서 작성
먼저 모드를 고른다
| 견적서 | 거래내역서 | |
|---|---|---|
| 시점 | 교육 전 (제안·수주) | 교육 후 (정산·계산서 발행 전) |
| 핵심 날짜 | 견적일 + 유효기한 | 거래일자(실제 진행일) |
| 품목 구조 | 단가 × 수량 × 차수 | 단가 × 수량·단위 × 수량·단위 |
| 품목 최대 | 7개 | 4개 |
| 스크립트 | scripts/make_quote.py |
scripts/make_statement.py |
둘은 양식 자체가 다르다. 거래내역서를 견적서 템플릿으로 만들지 말 것.
거래내역서를 요청받으면 먼저 그 건의 견적서를 찾아 금액을 그대로 옮긴다. 고객사 회계가
견적서와 대조하므로 항목 구성·산출식·금액이 어긋나면 안 된다. 견적서에 -(무상)로 표기된
항목도 그대로 한 줄 넣는다.
1. 정보 확정
제안서 이미지·기존 견적서·메일에서 항목과 금액을 그대로 옮긴다. 불명확하면 추측하지 말고 묻는다.
- 고객사명, 과정명(건명), 실시 일자/시간/반 수
- 품목별 단가 · 수량 · 차수(또는 단위)
- 견적일(기본: 오늘) 또는 거래일자(실제 진행일)
부가세는 공급가액의 10%로 템플릿이 자동 계산한다. 별도로 입력하지 않는다.
2. spec.json 작성
견적서
{
"output": "{{paths.work_root}}\\제안서\\견적서 _ 2026 고객사 과정명 _ {{company.brand}}_260806.xlsx",
"title": "2026 ○○연수원 금융공동신입 팀빌딩 견적서",
"client": "○○연수원",
"quote_date": "2026-08-06",
"items": [
{
"name": "강사료",
"detail": "[서바이벌레이싱] 팀빌딩\n - 통합 1개반 · 8/3(월) 2H\n - 메인강사 (2~4H 강사료 동일)",
"unit_price": 2000000,
"qty": 1,
"rounds": 1
}
]
}
doc_no생략 시YYMMDD + 01(예: 26080601). 같은 날 두 번째 견적이면26080602로 직접 지정.valid_until생략 시 견적일 + 1년.detail은 최대 3줄. 4줄부터 잘린다(스크립트가 경고).- 금액 =
unit_price × qty × rounds.
거래내역서
{
"output": "{{paths.work_root}}\\제안서\\거래내역서 _ ○○기업 신입사원 입문교육 팀빌딩 _ {{company.brand}}_260804.xlsx",
"subject": "신입사원 입문교육 팀빌딩 진행 건",
"client": "○○기업",
"trade_date": "2026-08-04",
"items": [
{"name": "프로그램 및\n강사료", "unit_price": 400000, "qty1": 4, "unit1": "hr", "qty2": 2, "unit2": "개반"},
{"name": "교재 및\n테블릿 PC", "unit_price": 0, "note": "교재제작시\nPDF파일 제공"},
{"name": "교통비", "unit_price": 150000, "qty2": 2, "unit2": "개반"}
]
}
subject는 한 줄에 들어갈 길이로 짧게 쓴다("… 진행 건"). 길면 2줄로 깨져 어색하게 잘린다.- 금액 =
unit_price × qty1 × qty2(없는 쪽은 1로 취급). 수량 쌍은 둘 다 생략 가능. unit_price: 0이면 회계 서식이 자동으로-로 표시한다. 무상 제공 항목은 0으로 넣는다.note(비고)는 최대 2줄. 열이 좁아 한 줄로 길게 쓰면 양옆이 잘린다.- 문서번호·유효기한 개념이 없다.
두 모드 공통 - 저장 위치는 {{paths.work_root}}\제안서\, 파일명은
견적서 _ …_YYMMDD.xlsx / 거래내역서 _ …_YYMMDD.xlsx 형식을 따른다.
3. 생성
python scripts/make_quote.py spec.json # 견적서
python scripts/make_statement.py spec.json # 거래내역서
공급가액·부가세·합계를 출력하고, 시트 합계가 품목 계산과 다르면 실패한다.
4. 육안 검수 (생략 금지)
python scripts/preview_doc.py "<생성된 문서.xlsx>"
출력된 PNG를 Read 도구로 반드시 확인한다. 셀 값 검증으로는 잡히지 않는 문제:
- 내역·비고·건명 텍스트가 셀을 넘어 잘림
- 2페이지로 분할됨(1페이지가 정상)
- 직인·로고 위치 이탈
문제가 있으면 spec을 고쳐 3번부터 다시 한다.
5. 전달
사용자가 요청하면 Start-Process로 파일을 열어준다.
메일 회신까지 요청받은 경우
전역 규칙(~/.claude/rules/gmail.md)대로 gws CLI를 쓴다. 원본 메일의 Message-ID/References/
threadId를 넣어 같은 스레드에 초안을 만든다. 사용자가 "발송"을 명시하지 않으면 초안까지만 만든다.
gws gmail users drafts create --params '{"userId":"me"}' --json "$(cat draft_payload.json)"
첨부는 불가: raw 메시지에 xlsx를 넣으면 base64가 수백 KB가 되어 Windows 명령행 인자 한도
(32,767자)를 넘어 Argument list too long으로 실패한다. --upload도
Media type 'application/octet-stream' is not supported로 거부되고, gws auth export는
client_secret과 refresh_token을 마스킹해서 내보내므로 Gmail API 직접 호출도 막혀 있다.
→ 본문만 초안으로 만들고, 파일 첨부는 사용자가 발송 전에 직접 한다.
템플릿 구조·회사 고정 정보·Excel COM 함정
references/template-reference.md 참조. 두 템플릿의 셀 맵, 문서번호 규칙, openpyxl 금지 이유,
품목행을 늘리는 방법이 들어 있다.