[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>
643 lines
27 KiB
Python
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에서 편집 가능합니다.")
|