KCL(한국건설생활환경시험연구원) 시험분석신청서를 작성합니다. 01-fs-5-compliance-check.md의 §4 시험 의뢰 계획을 인풋으로 받아 docx 파일을 생성합니다.
KCL 시험분석신청서 (양식 TQP-06-01-01)를 생성합니다.
"KCL 신청서 만들어줘", "시험분석신청서 작성", "KCL 의뢰서" 등
스킬 시작 시 아래 두 가지를 사용자에게 확인합니다.
Q1. 접수 법인
"어느 법인으로 접수하시겠습니까?
- 신시어리웨일즈 주식회사 (사업자 202-81-67571)
- 크레비스파트너스 주식회사 (사업자 120-08-66237)
- 기타 (직접 입력)"
→ 선택된 법인 정보를 word_shared/company-info.md에서 불러와 신청인 섹션에 입력합니다.
Q2. 세금계산서 발행처
"세금계산서 발행처가 신청인과 동일한가요? (동일 / 다름)"
→ 동일: 신청인 정보를 세금계산서 섹션에 그대로 복사 입력 (이메일은 법인별 세금계산서 발행 이메일 사용) → : 발행처 업체명·사업자번호·주소·담당자·연락처·이메일 별도 입력 후 해당 셀 기재
Q3. 시료 수량
"시험항목별 제출 시료 수량을 알려주세요. (예: 각 1점, 또는 항목별로 다를 경우 각각 입력)"
→ 시험항목이 여러 개일 경우 항목별로 수량을 확인합니다.
| 소스 | 내용 |
|---|---|
word_shared/company-info.md | 선택 법인의 신청인 정보 |
projects/[코드]/01_feasibility/01-fs-5-compliance-check.md §4 | 시험항목 목록 (시험명·시험규격·수량) |
| 파라미터 | 설명 | 기본값 |
|---|---|---|
project_code | 프로젝트 코드 | 사용자 입력 |
applicant_entity | 접수 법인 | Step 0 Q1 선택값 |
tax_invoice_same | 세금계산서 발행처 = 신청인 여부 | 동일 |
contact_name | 담당자 성명 | 사용자 입력 |
contact_phone | 담당자 휴대폰 | 사용자 입력 |
contact_email | 담당자 이메일 | 사용자 입력 |
sample_name | 시료명 (성적서 표기용) | 사용자 입력 |
report_purpose | 성적서 용도 | 품질관리용 |
submission_target | 제출처 (거래처 제출용일 때만) | — |
processing_type | 처리 구분 | 일반 |
sample_disposal | 시험 후 시료처리 | 폐기 |
report_delivery | 성적서 발급 방법 | 전자문서 |
pickup_method | 수령방법 (출력물 발급 시) | 택배(착불) |
report_copies_kr | 국문 발급 매수 | 1 |
report_copies_en | 영문 발급 매수 | 0 |
split_submission | 시험항목별 분할접수 여부 | 아니오 |
notes | 기타사항 | — |
word_shared/company-info.md에서 선택 법인 정보 읽기projects/[코드]/01_feasibility/01-fs-5-compliance-check.md §4에서 시험항목 추출체크박스 항목은 ■(선택) / □(미선택)으로 표기합니다.
| 파라미터 | 선택지 |
|---|---|
report_purpose | 거래처 제출용 / 품질관리용 / 기타 / 불필요 |
processing_type | 일반 / 지급 / 입회 |
sample_disposal | 반환 / 폐기 |
report_delivery | 출력물 / 전자문서 |
pickup_method | 방문수령 / 등기 / 택배(착불) / 퀵서비스(착불) |
split_submission | 예 / 아니오 |
import shutil, os
from docx import Document
from docx.oxml.ns import qn
from docx.table import Table as DocxTable
from datetime import date
TEMPLATE = "references/시험분석신청서/시험분석신청서 KCL.docx"
today = date.today()
OUTPUT_DIR = f"projects/{project_code}/05_test_request"
OUTPUT = f"{OUTPUT_DIR}/{project_code}_시험분석신청서_KCL_{today.strftime('%Y%m%d')}.docx"
os.makedirs(OUTPUT_DIR, exist_ok=True)
shutil.copy(TEMPLATE, OUTPUT)
doc = Document(OUTPUT)
# ── 1페이지(예시) 삭제: Table 6(2페이지 시작) 이전 body 요소 전체 제거 ──
body = doc.element.body
page2_start = doc.tables[6]._element # Table 6 = 2페이지 헤더
children = list(body)
for child in children:
if child is page2_start:
break
body.remove(child)
# 템플릿 구조: Table 0~5 = 1페이지(예시 — 제거됨), Table 6~9 = 2페이지(실제 신청서)
# 1페이지 제거 후 인덱스 재정렬: 기존 Table 7 → Table 1, Table 8 → Table 2
t = doc.tables[1] # 2페이지 본문 테이블 (23행 × 15열, 기존 Table 7)
def set_cell(table, row, col, text):
cell = table.cell(row, col)
for para in cell.paragraphs:
for run in para.runs:
run.text = ""
if cell.paragraphs:
if cell.paragraphs[0].runs:
cell.paragraphs[0].runs[0].text = text
else:
cell.paragraphs[0].add_run(text)
def replace_in_cell(table, row, col, old, new):
cell = table.cell(row, col)
for para in cell.paragraphs:
for run in para.runs:
if old in run.text:
run.text = run.text.replace(old, new)
def check_split_run(table, row, col, keyword):
"""□와 텍스트가 별도 run으로 분리된 경우 □ → ■ 치환."""
cell = table.cell(row, col)
for para in cell.paragraphs:
runs = para.runs
for i, run in enumerate(runs):
if run.text.strip() == "□" and i + 1 < len(runs) and keyword in runs[i + 1].text:
run.text = run.text.replace("□", "■")
return
# ── 신청인 정보 (확인된 셀 좌표) ──────────────────────
# [2,2] 업체명
set_cell(t, 2, 2, company_name)
# [3,2] 사업자등록번호 [3,6] 대표자
set_cell(t, 3, 2, biz_number)
set_cell(t, 3, 6, ceo_name)
# [4,2] 주소
set_cell(t, 4, 2, address)
# [5,2] 담당자 [5,6] H.P
set_cell(t, 5, 2, contact_name)
set_cell(t, 5, 6, contact_phone)
# [6,2] E-mail
set_cell(t, 6, 2, contact_email)
# ── 세금계산서 ────────────────────────────────────────────────
# 동일: 신청인 정보 그대로 복사 / 다름: 별도 입력값 사용
TAX_EMAIL = {
"신시어리웨일즈 주식회사": "[email protected]",
"크레비스파트너스 주식회사": "[email protected]",
}
if tax_invoice_same == "동일":
tax_company = company_name
tax_biz = biz_number
tax_addr = address
tax_contact = contact_name
tax_phone = contact_phone
tax_email = TAX_EMAIL.get(company_name, "")