# -*- coding: utf-8 -*- """ GUARDiA ITSM 프로그램 등록 신청서 3종 — DOCX 생성기 UTF-8 완전 지원 / 편집 가능한 Word 문서 실행: python generate_docx.py """ import sys, os sys.stdout.reconfigure(encoding="utf-8", errors="replace") from pathlib import Path from datetime import datetime from docx import Document from docx.shared import Pt, Cm, RGBColor, Inches from docx.enum.text import WD_ALIGN_PARAGRAPH from docx.enum.table import WD_ALIGN_VERTICAL, WD_TABLE_ALIGNMENT from docx.oxml.ns import qn from docx.oxml import OxmlElement import copy BASE = Path(__file__).parent # ── 공통 색상 (RGB) ──────────────────────────────────────────── class CLR: NAVY = RGBColor(0x1E, 0x3A, 0x5F) BLUE = RGBColor(0x00, 0x51, 0xA2) LBLUE = RGBColor(0xEB, 0xF3, 0xFB) RED = RGBColor(0xDC, 0x26, 0x26) LRED = RGBColor(0xFE, 0xE2, 0xE2) ORANGE = RGBColor(0xC2, 0x41, 0x0C) LORG = RGBColor(0xFE, 0xD7, 0xAA) GRAY = RGBColor(0x64, 0x74, 0x8B) LGRAY = RGBColor(0xF3, 0xF4, 0xF6) BORDER = RGBColor(0xCB, 0xD5, 0xE1) WHITE = RGBColor(0xFF, 0xFF, 0xFF) BLACK = RGBColor(0x00, 0x00, 0x00) def set_cell_bg(cell, rgb: RGBColor): """셀 배경색 설정.""" tc = cell._tc tcPr = tc.get_or_add_tcPr() shd = OxmlElement("w:shd") hex_color = f"{rgb[0]:02X}{rgb[1]:02X}{rgb[2]:02X}" shd.set(qn("w:val"), "clear") shd.set(qn("w:color"), "auto") shd.set(qn("w:fill"), hex_color) tcPr.append(shd) def set_cell_border(table): """테이블 전체 테두리 설정.""" for row in table.rows: for cell in row.cells: tc = cell._tc tcPr = tc.get_or_add_tcPr() tcBorders = OxmlElement("w:tcBorders") for side in ["top", "left", "bottom", "right", "insideH", "insideV"]: border = OxmlElement(f"w:{side}") border.set(qn("w:val"), "single") border.set(qn("w:sz"), "4") border.set(qn("w:space"), "0") border.set(qn("w:color"), "CBD5E1") tcBorders.append(border) tcPr.append(tcBorders) def new_doc(): """A4 Word 문서 기본 설정.""" doc = Document() sec = doc.sections[0] sec.page_width = Cm(21.0) sec.page_height = Cm(29.7) sec.left_margin = Cm(2.0) sec.right_margin = Cm(2.0) sec.top_margin = Cm(2.0) sec.bottom_margin= Cm(2.0) # 기본 스타일 style = doc.styles["Normal"] style.font.name = "맑은 고딕" style.font.size = Pt(10) style.element.rPr.rFonts.set(qn("w:eastAsia"), "맑은 고딕") return doc def banner_para(doc, text, sub, bg: RGBColor): """문서 최상단 컬러 배너 (단일 셀 테이블).""" t = doc.add_table(rows=2, cols=1) t.alignment = WD_TABLE_ALIGNMENT.CENTER t.style = "Table Grid" r0 = t.rows[0].cells[0] r1 = t.rows[1].cells[0] set_cell_bg(r0, bg) set_cell_bg(r1, bg) p0 = r0.paragraphs[0] p0.alignment = WD_ALIGN_PARAGRAPH.CENTER run = p0.add_run(text) run.bold = True run.font.size = Pt(18) run.font.color.rgb = CLR.WHITE run.font.name = "맑은 고딕" run.element.rPr.rFonts.set(qn("w:eastAsia"), "맑은 고딕") p1 = r1.paragraphs[0] p1.alignment = WD_ALIGN_PARAGRAPH.CENTER rs = p1.add_run(sub) rs.font.size = Pt(9) rs.font.color.rgb = RGBColor(0xBD, 0xE3, 0xFF) rs.font.name = "맑은 고딕" rs.element.rPr.rFonts.set(qn("w:eastAsia"), "맑은 고딕") set_cell_border(t) doc.add_paragraph() return t def sec_title(doc, text, bg: RGBColor): """섹션 제목 (색상 배경).""" t = doc.add_table(rows=1, cols=1) t.style = "Table Grid" cell = t.rows[0].cells[0] set_cell_bg(cell, bg) p = cell.paragraphs[0] r = p.add_run(f" {text}") r.bold = True r.font.size = Pt(10.5) r.font.color.rgb = CLR.WHITE r.font.name = "맑은 고딕" r.element.rPr.rFonts.set(qn("w:eastAsia"), "맑은 고딕") set_cell_border(t) return t def kv_table(doc, rows, lbg: RGBColor, widths=None): """키-값 테이블.""" if widths is None: widths = [Cm(4.0), Cm(13.0)] cols = len(widths) t = doc.add_table(rows=len(rows), cols=cols) t.style = "Table Grid" for i, row_data in enumerate(rows): row = t.rows[i] # 너비 설정 for j, w in enumerate(widths): row.cells[j].width = w # 키 셀 key_cell = row.cells[0] set_cell_bg(key_cell, lbg) key_cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER p = key_cell.paragraphs[0] p.alignment = WD_ALIGN_PARAGRAPH.CENTER r = p.add_run(row_data[0]) r.bold = True r.font.size = Pt(9.5) r.font.name = "맑은 고딕" r.element.rPr.rFonts.set(qn("w:eastAsia"), "맑은 고딕") # 값 셀 (cols에 따라) for j in range(1, cols): if j < len(row_data): val_cell = row.cells[j] val_cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER vp = val_cell.paragraphs[0] vr = vp.add_run(row_data[j]) vr.font.size = Pt(9.5) vr.font.name = "맑은 고딕" vr.element.rPr.rFonts.set(qn("w:eastAsia"), "맑은 고딕") set_cell_border(t) return t def header_table(doc, headers, data_rows, bg: RGBColor, lbg: RGBColor, widths=None): """헤더 포함 데이터 테이블.""" all_rows = [headers] + data_rows cols = len(headers) if widths is None: unit = Cm(17.0 / cols) widths = [unit] * cols t = doc.add_table(rows=len(all_rows), cols=cols) t.style = "Table Grid" for i, row_data in enumerate(all_rows): row = t.rows[i] is_header = (i == 0) fill = bg if is_header else (CLR.WHITE if i % 2 == 1 else lbg) for j, cell_text in enumerate(row_data): cell = row.cells[j] cell.width = widths[j] set_cell_bg(cell, fill) cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER p = cell.paragraphs[0] p.alignment = WD_ALIGN_PARAGRAPH.CENTER if (is_header or j == 0) else WD_ALIGN_PARAGRAPH.LEFT r = p.add_run(cell_text) r.bold = is_header r.font.size = Pt(9 if is_header else 9.5) r.font.color.rgb = CLR.WHITE if is_header else CLR.BLACK r.font.name = "맑은 고딕" r.element.rPr.rFonts.set(qn("w:eastAsia"), "맑은 고딕") set_cell_border(t) return t def sign_table(doc, date_label="신청일"): """서명란 테이블.""" rows = [ [date_label, "2026년 월 일"], ["회 사 명", "(주)지오정보기술"], ["대 표 자", " (인)"], ] t = doc.add_table(rows=3, cols=2) t.style = "Table Grid" for i, (k, v) in enumerate(rows): key_cell = t.rows[i].cells[0] set_cell_bg(key_cell, CLR.LGRAY) key_cell.width = Cm(3.5) key_cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER p = key_cell.paragraphs[0] p.alignment = WD_ALIGN_PARAGRAPH.CENTER r = p.add_run(k) r.bold = True; r.font.size = Pt(10) r.font.name = "맑은 고딕" r.element.rPr.rFonts.set(qn("w:eastAsia"), "맑은 고딕") val_cell = t.rows[i].cells[1] val_cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER vp = val_cell.paragraphs[0] vr = vp.add_run(v) vr.font.size = Pt(10.5) vr.font.name = "맑은 고딕" vr.element.rPr.rFonts.set(qn("w:eastAsia"), "맑은 고딕") set_cell_border(t) return t def add_note(doc, text): p = doc.add_paragraph() r = p.add_run(f"※ {text}") r.font.size = Pt(8.5) r.font.color.rgb = CLR.GRAY r.font.name = "맑은 고딕" r.element.rPr.rFonts.set(qn("w:eastAsia"), "맑은 고딕") p.paragraph_format.left_indent = Cm(0.5) return p def add_footer_line(doc, org): doc.add_paragraph() p = doc.add_paragraph() p.alignment = WD_ALIGN_PARAGRAPH.CENTER r = p.add_run(f"{org} | (주)지오정보기술 | GUARDiA ITSM v2.0 | Copyright © 2026 All Rights Reserved.") r.font.size = Pt(8) r.font.color.rgb = CLR.GRAY r.font.name = "맑은 고딕" r.element.rPr.rFonts.set(qn("w:eastAsia"), "맑은 고딕") def sp(doc, n=1): for _ in range(n): doc.add_paragraph() # ══════════════════════════════════════════════════════════════ # 01. 소프트웨어 저작권 등록 신청서 # ══════════════════════════════════════════════════════════════ def make_copyright_docx(): doc = new_doc() AC = CLR.BLUE LBG = CLR.LBLUE banner_para(doc, "소프트웨어 저작권 등록 신청서", "컴퓨터프로그램저작물 등록 | 한국저작권위원회 | www.copyright.or.kr", AC) h = doc.add_heading("컴퓨터프로그램저작물 등록신청서", level=2) h.alignment = WD_ALIGN_PARAGRAPH.CENTER for run in h.runs: run.font.color.rgb = AC run.font.name = "맑은 고딕" run.element.rPr.rFonts.set(qn("w:eastAsia"), "맑은 고딕") ref = doc.add_paragraph() ref.alignment = WD_ALIGN_PARAGRAPH.CENTER rr = ref.add_run("「저작권법」 제53조 및 「저작권법 시행규칙」 제24조에 따라 다음과 같이 등록을 신청합니다.") rr.font.size = Pt(9); rr.font.color.rgb = CLR.GRAY rr.font.name = "맑은 고딕" rr.element.rPr.rFonts.set(qn("w:eastAsia"), "맑은 고딕") sp(doc) # 1. 저작물 정보 sec_title(doc, "1. 저작물 정보", AC) kv_table(doc, [ ["저 작 물 명", "GUARDiA ITSM (가이더)"], ["영 문 명", "GUARDiA ITSM Platform (Good AI-based Unified Automated Resource & Device Intelligence Assistant)"], ["저작물 종류", "컴퓨터프로그램저작물"], ["프로그램 언어","Python 3.11, JavaScript (React 18)"], ["창 작 연 도", "2026년"], ["공 표 여 부", "공표 (2026년 / 인터넷 웹사이트: www.zioinfo.co.kr)"], ["등 록 목 적", "양도 및 이용허락"], ["버 전", "v2.0.0"], ], LBG) sp(doc) # 2. 저작자 / 저작권자 sec_title(doc, "2. 저작자 및 저작권자 정보", AC) kv_table(doc, [ ["구 분", "법인 저작권자"], ["저 작 자 명", "(주)지오정보기술"], ["저 작 권 자", "(주)지오정보기술 (저작자와 동일)"], ["법인등록번호", "000000-0000000"], ["사업자등록번호", "000-00-00000"], ["주 소", "서울특별시 (상세주소)"], ["대 표 자", "(대표이사명)"], ["전 화", "02-000-0000"], ["이 메 일", "copyright@zioinfo.co.kr"], ], LBG) sp(doc) # 3. 저작물 설명 sec_title(doc, "3. 저작물 설명 (200자 이내)", AC) desc_table = doc.add_table(rows=1, cols=1) desc_table.style = "Table Grid" cell = desc_table.rows[0].cells[0] set_cell_bg(cell, LBG) p = cell.paragraphs[0] r = p.add_run( "GUARDiA ITSM은 공공기관의 레거시 IT 인프라를 AI로 자율 운영하는 온프레미스 통합 관리 플랫폼입니다. " "메신저 한 줄 명령으로 에이전트 설치 없이 SSH/SFTP를 통해 WAS 배포·운영을 자동화하며, " "SR 관리, 인시던트 대응, 변경관리, CMDB, PMS 등 ITSM 전 기능과 " "AI 자동화(티켓분류·RCA·이상탐지·예측)를 단일 플랫폼에서 제공합니다." ) r.font.size = Pt(9.5); r.font.name = "맑은 고딕" r.element.rPr.rFonts.set(qn("w:eastAsia"), "맑은 고딕") set_cell_border(desc_table) sp(doc) # 4. 첨부 서류 sec_title(doc, "4. 첨부 서류", AC) header_table(doc, ["번호", "서류명", "비고"], [ ["1", "저작물 설명서", "본 신청서 3항 활용 가능"], ["2", "소스코드 일부 출력물", "핵심 기능 200줄 이상 (영업비밀 마스킹 후 제출)"], ["3", "법인등기부등본", "최근 3개월 이내 발급본"], ["4", "대리인 위임장", "대리신청 시에만 제출"], ], AC, LBG, widths=[Cm(1.5), Cm(7), Cm(8.5)] ) sp(doc) add_note(doc, "신청 방법: 한국저작권위원회 홈페이지(www.copyright.or.kr) → 저작권 등록 → 온라인 신청") add_note(doc, "처리 기간: 약 2주 / 수수료: 약 40,000원 (온라인 신청 시 카드·계좌이체)") sp(doc) pledge = doc.add_paragraph("위와 같이 컴퓨터프로그램저작물 등록을 신청합니다.") pledge.alignment = WD_ALIGN_PARAGRAPH.CENTER for run in pledge.runs: run.font.size = Pt(10); run.font.name = "맑은 고딕" run.element.rPr.rFonts.set(qn("w:eastAsia"), "맑은 고딕") sp(doc) sign_table(doc, "신 청 일") add_footer_line(doc, "한국저작권위원회 제출용") out = BASE / "01_소프트웨어_저작권_등록_신청서.docx" doc.save(str(out)) print(f"[OK] 01_소프트웨어_저작권_등록_신청서.docx ({out.stat().st_size//1024}KB)") # ══════════════════════════════════════════════════════════════ # 02. 소프트웨어사업자 신고서 # ══════════════════════════════════════════════════════════════ def make_bizreg_docx(): doc = new_doc() AC = CLR.RED LBG = CLR.LRED banner_para(doc, "소프트웨어사업자 신고서", "소프트웨어진흥법 제24조 | 과학기술정보통신부 / 한국SW산업협회(KOSA) | swit.or.kr", AC) h = doc.add_heading("소프트웨어사업자 신고서", level=2) h.alignment = WD_ALIGN_PARAGRAPH.CENTER for run in h.runs: run.font.color.rgb = AC run.font.name = "맑은 고딕" run.element.rPr.rFonts.set(qn("w:eastAsia"), "맑은 고딕") ref = doc.add_paragraph() ref.alignment = WD_ALIGN_PARAGRAPH.CENTER rr = ref.add_run("「소프트웨어진흥법」 제24조 및 같은 법 시행규칙 제14조에 따라 다음과 같이 신고합니다.") rr.font.size = Pt(9); rr.font.color.rgb = CLR.GRAY rr.font.name = "맑은 고딕" rr.element.rPr.rFonts.set(qn("w:eastAsia"), "맑은 고딕") sp(doc) # 1. 신고인 정보 sec_title(doc, "1. 신고인(사업자) 정보", AC) kv_table(doc, [ ["상 호", "(주)지오정보기술"], ["대 표 자", "(대표이사명)"], ["사업자등록번호", "000-00-00000"], ["법인등록번호", "000000-0000000"], ["소 재 지", "서울특별시 (상세주소)"], ["전 화", "02-000-0000"], ["팩 스", "02-000-0001"], ["이 메 일", "sw@zioinfo.co.kr"], ["설 립 일", "2000년 월 일"], ["자 본 금", " 원"], ["종업원 수", " 명 (정규직 기준)"], ], LBG) sp(doc) # 2. 사업 종류 sec_title(doc, "2. 소프트웨어사업의 종류 (해당 항목 선택)", AC) header_table(doc, ["선택", "사업 종류", "세부 내용"], [ ["[V]", "소프트웨어 개발업", "GUARDiA ITSM 등 소프트웨어 개발·판매"], ["[V]", "소프트웨어 공급업", "GUARDiA ITSM 라이선스 공급"], ["[V]", "소프트웨어 유지관리업", "GUARDiA ITSM 기술지원·유지보수"], ["[V]", "소프트웨어 자문·평가·진단업", "IT인프라 컨설팅·진단"], ["[ ]", "정보기술서비스업", "—"], ["[ ]", "기타 ( 업)", "—"], ], AC, LBG, widths=[Cm(1.5), Cm(6.5), Cm(9.0)] ) sp(doc) # 3. 기술인력 sec_title(doc, "3. 기술인력 현황", AC) kv_table(doc, [ ["총 직원 수", " 명"], ["SW 기술인력", " 명 (전체의 %)"], ["정보처리기사", " 명"], ["정보처리산업기사", " 명"], ["기타 SW 관련 자격", " 명"], ], LBG) add_note(doc, "소프트웨어사업자 신고 기준: 상시근로자 1명 이상 또는 SW기술인력 1명 이상") sp(doc) # 4. 주요 제품 sec_title(doc, "4. 주요 소프트웨어 제품 및 서비스", AC) header_table(doc, ["제품/서비스명", "분류", "출시연도", "연매출(백만원)"], [ ["GUARDiA ITSM", "IT서비스관리 플랫폼", "2026", ""], ["IT인프라 컨설팅", "컨설팅 서비스", "2000", ""], ["SI 구축 서비스", "정보화사업", "2000", ""], ], AC, LBG, widths=[Cm(5.0), Cm(4.0), Cm(2.5), Cm(5.5)] ) sp(doc) # 5. 실적 sec_title(doc, "5. 소프트웨어사업 실적 (최근 3년)", AC) header_table(doc, ["연도", "발주기관", "사업명", "계약금액(백만원)", "기간"], [ ["2024", "", "GUARDiA ITSM 구축사업", "", ""], ["2025", "", "인프라 자동화 컨설팅 사업", "", ""], ["2026", "", "GUARDiA ITSM 고도화 사업", "", ""], ], AC, LBG, widths=[Cm(1.5), Cm(4.0), Cm(5.5), Cm(2.5), Cm(3.5)] ) sp(doc) add_note(doc, "신고 방법: 한국SW산업협회(swit.or.kr) 온라인 신고 또는 과학기술정보통신부 제출") add_note(doc, "처리 기간: 약 2주 | 수수료: 없음") add_note(doc, "확인서 발급: 신고 완료 후 '소프트웨어사업자 신고확인서' 발급 (GS인증 신청 시 필요)") sp(doc) pledge = doc.add_paragraph("위와 같이 소프트웨어사업자 신고를 합니다.") pledge.alignment = WD_ALIGN_PARAGRAPH.CENTER for run in pledge.runs: run.font.size = Pt(10); run.font.name = "맑은 고딕" run.element.rPr.rFonts.set(qn("w:eastAsia"), "맑은 고딕") sp(doc) sign_table(doc, "신 고 일") add_footer_line(doc, "과학기술정보통신부 / 한국SW산업협회(KOSA) 제출용") out = BASE / "02_소프트웨어사업자_신고서.docx" doc.save(str(out)) print(f"[OK] 02_소프트웨어사업자_신고서.docx ({out.stat().st_size//1024}KB)") # ══════════════════════════════════════════════════════════════ # 03. 조달청 나라장터 물품 등록 신청서 # ══════════════════════════════════════════════════════════════ def make_g2b_docx(): doc = new_doc() AC = CLR.ORANGE LBG = CLR.LORG banner_para(doc, "조달청 나라장터 물품 등록 신청서", "국가종합전자조달시스템 | 조달청 | www.g2b.go.kr", AC) h = doc.add_heading("소프트웨어 물품 등록 신청서 (나라장터)", level=2) h.alignment = WD_ALIGN_PARAGRAPH.CENTER for run in h.runs: run.font.color.rgb = AC run.font.name = "맑은 고딕" run.element.rPr.rFonts.set(qn("w:eastAsia"), "맑은 고딕") ref = doc.add_paragraph() ref.alignment = WD_ALIGN_PARAGRAPH.CENTER rr = ref.add_run("공공기관 납품을 위한 소프트웨어 물품을 국가종합전자조달시스템(나라장터)에 등록합니다.") rr.font.size = Pt(9); rr.font.color.rgb = CLR.GRAY rr.font.name = "맑은 고딕" rr.element.rPr.rFonts.set(qn("w:eastAsia"), "맑은 고딕") sp(doc) # 1. 공급업체 정보 sec_title(doc, "1. 공급업체 정보", AC) kv_table(doc, [ ["업 체 명", "(주)지오정보기술"], ["대 표 자", "(대표이사명)"], ["사업자등록번호", "000-00-00000"], ["소 재 지", "서울특별시 (상세주소)"], ["대 표 전 화", "02-000-0000"], ["팩 스", "02-000-0001"], ["담 당 자", "(담당자명) / 02-000-0000 / g2b@zioinfo.co.kr"], ["계좌번호", "은행명 000-000-000000 (주)지오정보기술"], ], LBG) sp(doc) # 2. 물품 기본 정보 sec_title(doc, "2. 물품 기본 정보", AC) kv_table(doc, [ ["물 품 명", "GUARDiA ITSM (AI 기반 IT서비스관리 플랫폼)"], ["규격 / 모델명", "GUARDiA ITSM v2.0"], ["물품 분류코드", "소프트웨어 > 시스템관리 > IT서비스관리 (ITSM)"], ["원 산 지", "국내산 (대한민국)"], ["제 조 사", "(주)지오정보기술"], ["브 랜 드", "GUARDiA"], ["단 위", "식 (라이선스)"], ["품목번호", "(나라장터 등록 후 부여)"], ], LBG) sp(doc) # 3. 가격 정보 sec_title(doc, "3. 가격 정보 (에디션별 라이선스)", AC) header_table(doc, ["에디션", "대상 규모", "기준 단가(원)", "연간 유지보수율", "비고"], [ ["COMMUNITY", "소규모 / 검토용", "0 (무료)", "—", "기관 1개·사용자 10명"], ["STANDARD", "중형 기관 (50기관 이하)", "별도 협의", "15%", "사용자 200명·서버 200대"], ["ENTERPRISE", "대형 관공서 / 광역기관", "별도 협의", "15%", "무제한 (전용 지원 포함)"], ], AC, LBG, widths=[Cm(2.5), Cm(3.5), Cm(3.0), Cm(2.5), Cm(5.5)] ) add_note(doc, "나라장터 등록 단가는 실제 계약 시 협의를 통해 결정됩니다.") add_note(doc, "중소기업 직접생산확인증명서 제출 시 중소기업제품 우선구매 적용 가능합니다.") sp(doc) # 4. 제품 규격서 sec_title(doc, "4. 제품 규격서 (설치 환경 및 요구 사양)", AC) kv_table(doc, [ ["운영체제(서버)", "Ubuntu 20.04+ / CentOS 7+ / RHEL 8+ / Windows Server 2019+"], ["최소 CPU", "4코어 이상 (Intel / AMD x86_64)"], ["최소 RAM", "16GB 이상 (Ollama AI 엔진 포함 시)"], ["필요 디스크", "50GB 이상"], ["네트워크", "내부망 전용 지원 — 인터넷 연결 불필요 (완전 폐쇄망 운영 가능)"], ["클라이언트", "Chrome 90+ / Firefox 88+ / Edge 90+ (브라우저 기반, 설치 불필요)"], ["DB 지원", "SQLite (내장) / PostgreSQL 15+ (선택)"], ["AI 엔진", "Ollama 온프레미스 LLM (외부 클라우드 API 미사용 — 보안 정책)"], ], LBG) sp(doc) # 5. 주요 기능 sec_title(doc, "5. 주요 기능 요약", AC) header_table(doc, ["기능 영역", "주요 기능 내용", "공공기관 필수 여부"], [ ["SR / ITSM", "서비스요청 접수·처리, 인시던트, 변경관리, SLA, CMDB", "필수"], ["AI 자동화", "Ollama 온프레미스 AI — 티켓분류, RCA, 이상탐지, 예측", "선택"], ["ChatOps", "카카오워크·네이버웍스·슬랙 25개 봇 명령어 지원", "선택"], ["에이전트리스", "SSH/SFTP 기반 WAS 자동 배포·운영 (서버 소프트웨어 설치 불필요)", "필수"], ["PMS", "WBS, 산출물 관리, 일간/주간/월간 보고서 자동 생성", "필수"], ["보안", "JWT+MFA+AES-256+PAM+감사로그+취약점스캔+시큐어코딩 점검", "필수"], ["공공기관 준수", "행안부 체크리스트 19개, 웹접근성(KWCAG 2.1), 개인정보보호법", "필수"], ], AC, LBG, widths=[Cm(2.5), Cm(9.5), Cm(5.0)] ) sp(doc) # 6. 인증 현황 sec_title(doc, "6. 인증 현황 및 납품 실적", AC) kv_table(doc, [ ["GS인증(TTA)", "GS 1등급 취득 예정 — 2026년 12월 (TTA 한국정보통신기술협회)"], ["SW저작권 등록", "C-2026-XXXXXX (등록 후 기입)"], ["SW사업자 신고", "제XXX호 (신고 후 기입)"], ["주요 납품 실적", "(공공기관 납품 실적 기입 — 계약서 사본 첨부)"], ["중소기업 확인", "중소기업 직접생산확인증명서 첨부 예정"], ], LBG) sp(doc) add_note(doc, "등록 방법: 조달청 나라장터(g2b.go.kr) → 공급업체 로그인 → 물품 등록 신청") add_note(doc, "필요 서류: 사업자등록증, 법인등기부등본, SW저작권등록증, 제품 규격서, 가격확인서") add_note(doc, "처리 기간: 약 1~2주 | 수수료: 없음") sp(doc) pledge = doc.add_paragraph("위와 같이 물품 등록을 신청합니다.") pledge.alignment = WD_ALIGN_PARAGRAPH.CENTER for run in pledge.runs: run.font.size = Pt(10); run.font.name = "맑은 고딕" run.element.rPr.rFonts.set(qn("w:eastAsia"), "맑은 고딕") sp(doc) sign_table(doc, "신 청 일") add_footer_line(doc, "조달청 나라장터 제출용") out = BASE / "03_조달청_나라장터_물품_등록_신청서.docx" doc.save(str(out)) print(f"[OK] 03_조달청_나라장터_물품_등록_신청서.docx ({out.stat().st_size//1024}KB)") # ══════════════════════════════════════════════════════════════ # MAIN # ══════════════════════════════════════════════════════════════ if __name__ == "__main__": print("GUARDiA ITSM 프로그램 등록 신청서 3종 DOCX 생성 중 (UTF-8)...") print() make_copyright_docx() make_bizreg_docx() make_g2b_docx() print() print("생성된 파일 목록:") for f in sorted(BASE.glob("0*.docx")): print(f" {f.name} ({f.stat().st_size//1024}KB)") print() print("모든 DOCX 파일은 Microsoft Word / 한글(HWP) / LibreOffice에서 편집 가능합니다.")