print('Hello world!')
import pandas as pd
import openpyxl
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
from openpyxl.utils import get_column_letter

# Create workbook
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "의견서"

# Ensure grid lines are visible
ws.views.sheetView[0].showGridLines = True

# Colors
HEADER_NAVY = "1B365D"
TITLE_BG = "2C3E50"
SUBHEADER_BG = "4A6572"
LIGHT_NAVY = "E8EEF5"
ZEBRA_FILL = "F9FAFC"
BORDER_GRAY = "D3D3D3"

# Fonts
font_title = Font(name="Calibri", size=16, bold=True, color="FFFFFF")
font_doc_info = Font(name="Calibri", size=10, bold=False, color="333333")
font_header = Font(name="Calibri", size=11, bold=True, color="FFFFFF")
font_bold = Font(name="Calibri", size=10, bold=True, color="1B365D")
font_regular = Font(name="Calibri", size=10, color="333333")

# Fills
fill_title = PatternFill(start_color=TITLE_BG, end_color=TITLE_BG, fill_type="solid")
fill_header = PatternFill(start_color=HEADER_NAVY, end_color=HEADER_NAVY, fill_type="solid")
fill_light = PatternFill(start_color=LIGHT_NAVY, end_color=LIGHT_NAVY, fill_type="solid")
fill_zebra = PatternFill(start_color=ZEBRA_FILL, end_color=ZEBRA_FILL, fill_type="solid")

# Alignments
align_center = Alignment(horizontal="center", vertical="center", wrap_text=True)
align_left = Alignment(horizontal="left", vertical="center", wrap_text=True)
align_top_left = Alignment(horizontal="left", vertical="top", wrap_text=True)

# Borders
thin_side = Side(border_style="thin", color=BORDER_GRAY)
border_all = Border(left=thin_side, right=thin_side, top=thin_side, bottom=thin_side)
thick_bottom = Border(bottom=Side(border_style="medium", color=HEADER_NAVY))

# 1. Document Title
ws.merge_cells("A1:G1")
ws["A1"] = "「구매단가관리 표준 매뉴얼(안)」 검토 의견서"
ws["A1"].font = font_title
ws["A1"].fill = fill_title
ws["A1"].alignment = align_center
ws.row_dimensions[1].height = 40

# 2. Document Meta Info
meta_info = [
    ("수신처", "산업본사 감사실 (고상우 Leader / 고상우 부장)", "문서번호", "DSP-구매자재-2026-1106"),
    ("발신처", "디에스파워(주) 경영지원본부 구매자재팀", "회신일자", "2026년 11월 06일"),
    ("사업장", "디에스파워 (오산 열병합발전소)", "작성자", "구매자재팀장 (직인 생략)")
]

for idx, (lbl1, val1, lbl2, val2) in enumerate(meta_info, start=3):
    ws.cell(row=idx, column=1, value=lbl1).font = font_bold
    ws.cell(row=idx, column=1).fill = fill_light
    ws.cell(row=idx, column=1).alignment = align_center
    ws.cell(row=idx, column=1).border = border_all
    
    ws.merge_cells(start_row=idx, start_column=2, end_row=idx, end_column=4)
    ws.cell(row=idx, column=2, value=val1).font = font_regular
    ws.cell(row=idx, column=2).alignment = align_left
    for col in range(2, 5):
        ws.cell(row=idx, column=col).border = border_all
        
    ws.cell(row=idx, column=5, value=lbl2).font = font_bold
    ws.cell(row=idx, column=5).fill = fill_light
    ws.cell(row=idx, column=5).alignment = align_center
    ws.cell(row=idx, column=5).border = border_all
    
    ws.merge_cells(start_row=idx, start_column=6, end_row=idx, end_column=7)
    ws.cell(row=idx, column=6, value=val2).font = font_regular
    ws.cell(row=idx, column=6).alignment = align_left
    for col in range(6, 8):
        ws.cell(row=idx, column=col).border = border_all
    ws.row_dimensions[idx].height = 22

# 3. Table Header
headers = ["NO", "매뉴얼 구분/조항", "현행 매뉴얼(안) 내용", "디에스파워 현장 실정 및 문제점", "본사 지침 개정 및 반영 요청사항 (개선안)", "관련 리스크 및 기대효과", "비고"]
for col_idx, text in enumerate(headers, start=1):
    cell = ws.cell(row=7, column=col_idx, value=text)
    cell.font = font_header
    cell.fill = fill_header
    cell.alignment = align_center
    cell.border = border_all
ws.row_dimensions[7].height = 28

# 4. Table Data Items
opinions = [
    (
        1,
        "제1장 총칙 / 제4장 CBD 검증체계\n(CBD 유형 및 대상)",
        "제조업 중심의 5종 CBD(원자재, 가공비, Ass'y, 전자부품, Maker표준품) 제출 및 당사 표준원가분석표 대조 검증 의무화",
        "• 당사는 가스터빈 열병합발전소로 조달의 80% 이상이 도급 공사, 설비 유지보수 용역, 법정 검사, 해외 메이커(OEM) 독점 정비 부품임.\n• 제조업용 공정 CT(Cycle Time)나 LME 시세 기반 CBD 적용이 구조적으로 불가능함.",
        "① [제6종: 공사/용역/유지보수형] 및 [제7종: 화학/연료/환경형] CBD/검증양식 신설\n② 양식 신설 전까지 기존 사규인 『계약규정』 및 『종합심사 업무지침』의 '원가계산서(품셈/노임단가)' 제출로 CBD 대체 허용 조항 명시",
        "• 발전소 수시/주기적 정비 및 도급계약의 객관적 원가 검증 기준 확보\n• 실무 적용 불가에 따른 규정 위반 리스크 제거",
        "서식 및 조항 신설 요청"
    ),
    (
        2,
        "제1.5절 구매조직 / 제4장\n(표준원가분석표 작성 주체)",
        "개발부서(연구소)가 표준원가분석표를 작성하고 세부 부품 단위 원가를 대조·확정",
        "• 당사는 별도의 R&D/연구소가 없으며, 기술·발전팀은 발전소 24시간 가동 및 현장 정비에 집중되어 부품별 표준원가표 작성이 불가능함.\n• 연구소 부재 사업장은 구매가 원가표 작성을 전담해야 하는 과중한 부담 발생.",
        "① 연구소 미설치 사업장의 경우 '계약요청부서(기술/발전팀) 또는 구매부서가 공동 작성/검토'하도록 작성 주체 현실화\n② 실행예산 및 예정가격 산정 자료로 표준원가분석표를 대체할 수 있도록 제1.8절(자체 매뉴얼 자율성)에 위임 조항 명시",
        "• 부서 간 책임 소재 명확화\n• 표준원가 작성 지연에 따른 정비 자재 조달 차질 방지",
        "작성 주체 예외 규정"
    ),
    (
        3,
        "제1.8절 자체 매뉴얼 / 조직\n(소규모 인력 여건)",
        "전 사업장에 동일한 수준의 CBD 검증, 손익분석, 공급처 관리대장, 구매평가 행정 절차 일률 적용",
        "• 당사 구매자재팀은 [팀장 1명(겸직) + 담당자 1명(구매/자재 겸직) + 보조 1명] 총 3명의 소규모 인력임.\n• 실무 1명이 연간 수십 건의 도급 공사와 수천 건의 자재/저장품을 전담하고 있어 매뉴얼의 방대한 행정 절차 준수가 물리적으로 불가능함.",
        "① 제1.8절에 '구매 담당 인원 3인 이하 소규모 사업장은 전결 절차 및 제출 서식을 대폭 간소화하여 자체 매뉴얼로 운용 가능' 예외 조항 신설\n② 소액 자재(예: 500만 원 미만) 및 긴급 정비 자재는 구매부서장 전결 및 사후 10영업일 이내 결과 보고로 완화",
        "• 과도한 행정 과부하 해소\n• 발전기 멈춤(Outage) 방지를 위한 긴급 정비 자재 적기 조달권 확보",
        "소규모 사업장 자율권"
    ),
    (
        4,
        "제5.4절 고통분담 가이드라인\n(협력업체 귀책 감점 ④호)",
        "최근 1년 내 납기지연 2회 또는 품질 부적합 3회 이상 발생 업체에 대해 회사 부담률을 30%로 하향 제한",
        "• 협력업체와의 계약 관계에서 합의 없는 일률적 감액 적용 시 하도급법(부당 하도급대금 결정/감액 금지) 및 공정거래법 위반 소지가 매우 높음.\n• 독점 OEM 메이커 수용 거부 시 자재 공급 중단 리스크 발생.",
        "① 본사 차원에서 하도급법 법률 전문가의 사전 종합 검토 후 지침화 추진 (부칙 제4조 이행)\n② 당사자 간 합의 형식을 갖출 수 있는 표준 합의서 서식 사전 제공 및 과도한 단가 삭감 강제 자제",
        "• 하도급법 위반 및 공정위 분쟁 법적 리스크 사전 차단\n• 독점 공급사 거래 중단에 따른 발전소 가동 중지 예방",
        "법률 검토 필수"
    ),
    (
        5,
        "제8장 듀얼소싱 / 제8.5절\n(공급처 상태 관리)",
        "주요 부품 듀얼소싱 원칙화, 단독소싱 품목은 D상태(구조적 단독) 판정 받아 연 1회 재승인 및 리스크 관리",
        "• 발전소 핵심 설비(가스터빈, 스팀터빈, 제어시스템 등)는 해외 원제작사(GE, Siemens 등)의 OEM 전용 부품으로 대체 불가능함.\n• 매년 수백 건의 OEM 부품에 대해 반복적으로 D상태 판정을 받는 것은 무의미한 행정력 낭비임.",
        "① 발전소 OEM 지정 품목 및 고객/법정 지정품은 최초 1회 승인으로 D상태(구조적 단독) 정기 인정\n② 매년 반복되는 재판정 절차를 관리대장 서면 갱신 및 차년도 종합 보고로 간소화",
        "• 불필요한 반복 승인 행정 절차 대폭 감축\n• 발전 핵심 설비의 안정적 정비 체계 유지",
        "D상태 인정 간소화"
    ),
    (
        6,
        "제9장 구매평가 체계\n(부서 및 담당자 평가)",
        "원가절감률, CBD검증률, 표준원가확보율, 타 부서 다면평가 등 5개 영역 100점 만점 평가 및 인사고과 반영(승진/보직 변경 등)",
        "① 발전 자재는 OEM 독점이 대부분이라 구매부서가 통제할 수 없음에도 평가에 반영 시 근로기준법상 '합리적 이유 없는 불이익 처우' 저촉 우려\n② 타 부서 다면평가는 정비/발주 간 불가피한 마찰이 보복성 평가로 이어져 공정성 훼손\n③ 소규모 인력에 과도한 서류 부담 강제 후 불이익 조치는 직장 내 괴롭힘 및 안전보건 리스크 유발",
        "① 구매부서 평가 모수(건수) 산정 시 OEM 독점품, 도급 공사/용역, 수의계약 법정 검사 건은 산정 모수에서 전면 제외\n② 소규모 사업장에 대한 평가 지표 보정계수 적용 또는 평가 면제\n③ 타 부서 다면평가는 인사고과 직결을 배지하고 참고자료로만 활용",
        "• 부당 인사고과 및 노동법적 불이익 처우 분쟁 리스크 차단\n• 평가 공정성 확보 및 구매 실무자의 과로/소진 예방",
        "노동법/인사 리스크 방어"
    )
]

start_row = 8
for item in opinions:
    no, sec, curr, problem, proposal, risk, note = item
    row_idx = start_row + no - 1
    
    ws.cell(row=row_idx, column=1, value=no).alignment = align_center
    ws.cell(row=row_idx, column=2, value=sec).alignment = align_center
    ws.cell(row=row_idx, column=3, value=curr).alignment = align_top_left
    ws.cell(row=row_idx, column=4, value=problem).alignment = align_top_left
    ws.cell(row=row_idx, column=5, value=proposal).alignment = align_top_left
    ws.cell(row=row_idx, column=6, value=risk).alignment = align_top_left
    ws.cell(row=row_idx, column=7, value=note).alignment = align_center
    
    # Apply borders and formatting
    fill_row = fill_zebra if no % 2 == 0 else PatternFill(fill_type=None)
    for col in range(1, 8):
        cell = ws.cell(row=row_idx, column=col)
        cell.font = font_regular
        cell.border = border_all
        if fill_row.fill_type:
            cell.fill = fill_row
            
    ws.row_dimensions[row_idx].height = 110

# Column Widths
col_widths = {
    1: 6,   # NO
    2: 22,  # 매뉴얼 구분
    3: 30,  # 현행 매뉴얼 내용
    4: 42,  # 현장 실정 및 문제점
    5: 45,  # 본사 개정 요청사항
    6: 35,  # 리스크 및 기대효과
    7: 18   # 비고
}

for col_idx, width in col_widths.items():
    col_letter = get_column_letter(col_idx)
    ws.column_dimensions[col_letter].width = width

# Save File
output_filepath = "구매단가관리_표준_매뉴얼_의견서_디에스파워.xlsx"
wb.save(output_filepath)
print(f"File successfully created: {output_filepath}")

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: