zioinfo-mail/certification/generate_docx.py
DESKTOP-TKLFCPR\ython 6ad7a158c8 feat(cert): 프로그램 등록 신청서 3종 DOCX + 저작권 등록용 소스코드
[DOCX 3종 생성 (UTF-8, 편집 가능)]
- 01_소프트웨어_저작권_등록_신청서.docx  (37KB)
  한국저작권위원회 제출용 / 맑은 고딕 / 색상 섹션
- 02_소프트웨어사업자_신고서.docx         (37KB)
  과학기술정보통신부/KOSA 제출용
- 03_조달청_나라장터_물품_등록_신청서.docx (38KB)
  공공기관 납품용 나라장터 등록

[generate_docx.py 특징]
- python-docx 기반 (한글 UTF-8 완전 지원)
- 검정 박스 없음 (맑은 고딕 직접 적용)
- 편집 가능: Word / 한글(HWP) / LibreOffice
- 섹션별 색상 배너 (파란/빨간/주황 테마)
- 서명란, 첨부서류, 수수료 안내 포함

[certification/source/ 저작권 등록용 소스코드]
- 01_core_ssh_agentless.py  (450줄) - 에이전트리스 SSH 핵심
- 02_core_license_engine.py (455줄) - AES-256-GCM 라이선스
- 03_router_sr_management.py(501줄) - SR 관리 API
- 04_core_ai_classifier.py  (90줄)  - AI 티켓 분류
- 05_frontend_dashboard.js  (200줄) - 대시보드 프론트
- README.md - 제출 안내 및 독창성 설명
- 모든 파일: 영업비밀(암호화키) 마스킹 처리

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-30 12:33:29 +09:00

643 lines
27 KiB
Python

# -*- 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에서 편집 가능합니다.")