from docx import Document
from docx.shared import Pt, Cm, RGBColor, Emu
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT, WD_ALIGN_VERTICAL
from docx.enum.section import WD_ORIENT
from docx.oxml.ns import qn, nsdecls
from docx.oxml import parse_xml
import os

doc = Document()

# ── A3 Landscape ──
for section in doc.sections:
    section.orientation = WD_ORIENT.LANDSCAPE
    section.page_width = Cm(42.0)
    section.page_height = Cm(29.7)
    section.top_margin = Cm(1.5)
    section.bottom_margin = Cm(1.5)
    section.left_margin = Cm(2.0)
    section.right_margin = Cm(2.0)

style = doc.styles['Normal']
font = style.font
font.name = '맑은 고딕'
font.size = Pt(9)
style.element.rPr.rFonts.set(qn('w:eastAsia'), '맑은 고딕')
style.paragraph_format.space_after = Pt(3)
style.paragraph_format.space_before = Pt(1)

NAVY = '1B3A5C'
ACCENT = '2E75B6'
LIGHT_ACCENT = 'D6E4F0'
GREEN_BG = 'E2EFDA'
YELLOW_BG = 'FFF2CC'
RED_BG = 'FCE4EC'
GRAY_BG = 'F2F2F2'
WHITE = 'FFFFFF'


def shade(cell, color):
    cell._tc.get_or_add_tcPr().append(
        parse_xml(f'<w:shd {nsdecls("w")} w:fill="{color}"/>'))


def set_cell_border(cell, **kwargs):
    tc = cell._tc
    tcPr = tc.get_or_add_tcPr()
    tcBorders = parse_xml(f'<w:tcBorders {nsdecls("w")}></w:tcBorders>')
    for edge, val in kwargs.items():
        element = parse_xml(
            f'<w:{edge} {nsdecls("w")} w:val="{val.get("val", "single")}" '
            f'w:sz="{val.get("sz", "4")}" w:space="0" '
            f'w:color="{val.get("color", "000000")}"/>')
        tcBorders.append(element)
    tcPr.append(tcBorders)


def styled_run(para, text, size=9, bold=False, color=None, font_name=None):
    r = para.add_run(text)
    r.font.size = Pt(size)
    r.bold = bold
    if color:
        r.font.color.rgb = RGBColor.from_string(color)
    if font_name:
        r.font.name = font_name
        r.element.rPr.rFonts.set(qn('w:eastAsia'), font_name)
    return r


def add_section_break(doc):
    from docx.oxml import OxmlElement
    p = doc.add_paragraph()
    run = p.add_run()
    br = OxmlElement('w:br')
    br.set(qn('w:type'), 'page')
    run._element.append(br)


def make_header_cell(cell, text, sz=9):
    cell.text = ''
    shade(cell, ACCENT)
    p = cell.paragraphs[0]
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER
    r = p.add_run(text)
    r.bold = True
    r.font.size = Pt(sz)
    r.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF)


def cell_text(cell, text, sz=9, bold=False, align=None, bg=None):
    cell.text = ''
    p = cell.paragraphs[0]
    if align:
        p.alignment = align
    cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER
    r = p.add_run(text)
    r.font.size = Pt(sz)
    r.bold = bold
    if bg:
        shade(cell, bg)


# ============================================================
#  COVER / TITLE
# ============================================================
for _ in range(4):
    doc.add_paragraph()

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
styled_run(p, 'AX 과제 신청 현황 및 선정 평가 보고', size=28, bold=True, color=NAVY)

doc.add_paragraph()

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
styled_run(p, '2026년 2월 23일', size=14, color='666666')

doc.add_paragraph()
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
styled_run(p, 'AX추진팀', size=14, color=ACCENT)

for _ in range(6):
    doc.add_paragraph()

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
styled_run(p, '본 보고서는 2026년 2월 19~20일 접수된 8건의 AX 과제 신청에 대해\n'
              '과제 선정 기준 체크리스트(7개 항목) 기반으로 평가한 결과를 정리한 것입니다.',
           size=11, color='888888')


# ============================================================
#  CHAPTER 1 — 신청 과제 요약
# ============================================================
add_section_break(doc)

p = doc.add_paragraph()
styled_run(p, '1', size=22, bold=True, color=ACCENT)
styled_run(p, '  신청 과제 요약', size=22, bold=True, color=NAVY)

doc.add_paragraph()

p = doc.add_paragraph()
styled_run(p, '2026년 2월 19~20일 접수 기간 동안 총 ', size=10)
styled_run(p, '4개 조직', size=10, bold=True, color=ACCENT)
styled_run(p, '에서 ', size=10)
styled_run(p, '8건', size=10, bold=True, color=ACCENT)
styled_run(p, '의 AX 전환 과제가 신청되었습니다. '
              '신청 과제는 대시보드 구축, 데이터 자동화, 증빙 검토, 기사 제작 등 다양한 영역에 걸쳐 있으며, '
              '대부분 반복적 수작업 업무의 자동화·효율화를 목표로 하고 있습니다.', size=10)

doc.add_paragraph()

# Summary table
sum_tbl = doc.add_table(rows=9, cols=8)
sum_tbl.style = 'Table Grid'
sum_tbl.alignment = WD_TABLE_ALIGNMENT.CENTER

h = ['No.', '과제명', '소속', '신청자', '접수일', '참여 가능 시간', '데이터 형태', '핵심 키워드']
for i, t in enumerate(h):
    make_header_cell(sum_tbl.rows[0].cells[i], t, 8)

data = [
    ['1', 'ETC마케팅본부\n목표 달성 DashBoard',
     '대웅제약\nETC마케팅본부\n마케팅기획팀', '박미경', '2.19',
     '하루 4시간 이상\n(적극 참여)', 'Excel / CSV',
     'BI 대시보드\nLLM 결산 자동작성'],
    ['2', 'MR 거래처 채권현황\n실시간 조회 웹앱',
     '한올\n마케팅기획본부\n영업관리팀', '김희영', '2.19',
     '본부내 자체 진행\n(AX특공대 불필요)', '웹앱',
     'SAP 연동\n모바일 웹앱'],
    ['3', 'CPS 지출보고\n증빙 검토·승인 자동화',
     '대웅제약\n영업기획실\n영업지원팀', '김지숙', '2.19',
     '하루 4시간 이상\n(적극 참여)', 'Excel/CSV\n이미지/스캔',
     'OCR · LLM\n이상탐지 자동화'],
    ['4', 'ETC 로컬 스타\n산출 자동화',
     '대웅제약\n영업기획실\n영업지원팀', '박지현', '2.19',
     '하루 2~3시간\n(제한적 참여)', 'Excel / CSV',
     '엑셀 자동화\nVLOOKUP 대체'],
    ['5', 'Emma 메일링\n업그레이드',
     '엠서클\n하이닥사업부\n하이닥팀', '김진우\n(정신영)', '2.20',
     '팀장 논의 후\n시간 조정 예정', 'Excel/CSV\n텍스트/정형DB',
     'LLM 기사선별\n크롤링·메일링'],
    ['6', '최신연구 논문\n기사 제작 자동화',
     '엠서클\n하이닥사업부\n하이닥팀', '김진우\n(정신영)', '2.20',
     '팀장 논의 후\n시간 조정 예정', '텍스트\n정형 DB',
     'LLM 기사작성\n논문 크롤링'],
    ['7', '처방마감자료 생성\n및 메일 발송 자동화',
     '대웅제약\n영업기획실\n영업지원팀', '이승민', '2.20',
     '하루 2~3시간\n(제한적 참여)', 'Excel/CSV\n사내시스템',
     '대용량 매핑\n메일 자동발송'],
    ['8', '매출 대시보드 제작\n(통합 데이터 시각화)',
     '디엔컴퍼니\n재무기획실\n전략기획팀', '백송이', '2.20',
     '하루 4시간 이상\n(적극 참여)', 'Excel / CSV',
     'BI 대시보드\n데이터 통합'],
]

for ri, row in enumerate(data, 1):
    for ci, val in enumerate(row):
        c = sum_tbl.rows[ri].cells[ci]
        c.text = ''
        p = c.paragraphs[0]
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER if ci in (0, 3, 4) else WD_ALIGN_PARAGRAPH.LEFT
        c.vertical_alignment = WD_ALIGN_VERTICAL.CENTER
        r = p.add_run(val)
        r.font.size = Pt(8)
        if ci == 0:
            r.bold = True
        if ri % 2 == 0:
            shade(c, GRAY_BG)

doc.add_paragraph()

# 접수 현황 요약 박스
box_tbl = doc.add_table(rows=1, cols=4)
box_tbl.alignment = WD_TABLE_ALIGNMENT.CENTER
labels = ['총 신청 과제', '신청 조직', '접수 기간', '데이터 즉시 가능']
values = ['8건', '4개 조직', '2.19 ~ 2.20', '8건 (100%)']
colors = [ACCENT, '27AE60', 'E67E22', '8E44AD']
for i in range(4):
    c = box_tbl.rows[0].cells[i]
    c.text = ''
    shade(c, colors[i])
    p = c.paragraphs[0]
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    styled_run(p, labels[i] + '\n', size=9, bold=True, color=WHITE)
    styled_run(p, values[i], size=16, bold=True, color=WHITE)


# ============================================================
#  CHAPTER 2 — 신청 과제 상세 (8 projects × 2 sub-sections each)
# ============================================================

projects = [
    {
        'num': 1,
        'title': 'ETC마케팅본부 목표 달성 DashBoard',
        'dept': '대웅제약 ETC마케팅본부 마케팅기획팀',
        'applicant': '박미경',
        'empno': '2190270',
        'date': '2026.02.19',
        'avail': '하루 4시간 이상 (적극 참여)',
        'time_spent': '주 3~5시간 (데이터 검수시간 포함)',
        'collab': 'SF CRM팀 (데이터 자동화 연계 시)',
        'data_type': 'Excel / CSV',
        'data_ready': '예 (과제 선발 후 샘플 데이터 즉시 제공 가능)',
        'data_volume': '1개 파일, 10개 이상 시트 연동',
        'privacy': '미포함',
        'asis': (
            '마케팅 PM의 본질업무인 \'사업기 목표달성, MBO시스템, 성공모델 확산/파생사례, 검증4단계\' 4가지 항목을 '
            '주 1회(주차별/월 마감 시) 데이터를 수기로 업데이트하고, '
            '사업팀/품목/PM별 필터링이 가능한 엑셀 대시보드 형태로 공유하고 있음.'
        ),
        'pain': (
            '① 데이터 RAW 수기 업데이트·검수에 주 1회 2~3시간 소요, 수치 불일치 시 추가 검토 시간 발생\n'
            '② 사업부장/사업팀장/PM이 수기로 목표 달성 현황을 작성하여 보고 편의성 부족\n'
            '③ 수년간 누적 데이터로 용량 방대, 대시보드 로딩시간 3~5초 소요'
        ),
        'tobe': (
            '- 사업부/사업팀/품목/PM 선택 시 결산보고를 AI가 자동으로 작성\n'
            '- 집중품목 자동 선별, 핵심 성과 상단 자동 정리\n'
            '- 데이터 각 사이트별 자동 연동으로 수기 업데이트 자동화\n'
            '- 선택한 데이터 내 순위(사업팀/PM/품목) 자동 제공'
        ),
        'result_form': '대시보드, 챗봇',
        'eval': [
            ('① 업무 규칙·요구사항 명확성', '✓ 명확',
             '사업기 목표달성 등 4가지 항목의 데이터를 주 1회 업데이트하고 사업팀/품목/PM별 필터링하여 '
             '대시보드로 공유하는 명확한 프로세스가 존재함.'),
            ('② 현업 참여 의지', '✓ 적극 참여',
             '하루 4시간 이상 적극 참여 가능. 선정 기준(매일 6시간)에 다소 부족하나 적극적 의지 확인됨.'),
            ('③ 데이터 디지털화', '✓ 즉시 가능',
             'Excel/CSV 형태 보유. 즉시 제공 가능. 다만 SF CRM 데이터 연계 시 타부서 협업 필요.'),
            ('④ 예상 AI Tool·인프라', '해당',
             '☑ BI 대시보드  ☑ LLM (결산 자동 작성)  ☑ 노코드 워크플로우 n8n (데이터 자동 업데이트)'),
            ('⑤ 목표 달성 기준', '✓ 명확',
             '주 3~5시간 수기 작업 → 자동화 단축 / 대시보드 로딩 3~5초 → 개선 / AI 결산 자동 작성'),
            ('⑥ 예상 효과', '높음',
             '[정량] 주 3~5시간 수작업 절감, 데이터 검수 시간 단축\n'
             '[정성] 데이터 정확성 향상, 보고 편의성 대폭 개선, 의사결정 속도 향상'),
            ('⑦ 리스크·제약사항', '△ 일부',
             '☑ 외부 시스템 연동: SF CRM팀 협업·권한 조율 필요\n'
             '☐ 누적 데이터 용량으로 인한 성능 이슈 가능'),
        ]
    },
    {
        'num': 2,
        'title': 'MR 거래처 채권현황 실시간 조회 웹앱',
        'dept': '한올 마케팅기획본부 영업관리팀',
        'applicant': '김희영',
        'empno': '200056',
        'date': '2026.02.19',
        'avail': '본부내 자체적으로 진행 (AX특공대 불필요)',
        'time_spent': '건당 10분, 매일 평균 5건(50분), 주 250분',
        'collab': '없음',
        'data_type': '웹앱',
        'data_ready': '예 (과제 선발 후 샘플 데이터 즉시 제공 가능)',
        'data_volume': '건당 처리',
        'privacy': '미포함',
        'asis': (
            'MR의 거래처 채권현황(회전일 150일 이상)에 대한 실시간 문의가 발생하면, '
            '유관부서에서 SAP 확인을 통해 실시간 응대하는 구조.'
        ),
        'pain': (
            'MR이 영업현장에서 필요한 실시간 데이터를 유관부서를 통해야만 확인 가능\n'
            '(영업부 SAP 사용 불가, 현장 PC 사용 곤란)\n'
            '→ 내근/외근 모두 본질업무 집중 환경 부재, 업무효율성 저하'
        ),
        'tobe': (
            '개발된 웹앱을 통해 MR이 영업현장에서 직접 모바일로 '
            '간편하게 본인 거래처에 대한 채권 확인이 가능하도록 전환'
        ),
        'result_form': '웹앱',
        'eval': [
            ('① 업무 규칙·요구사항 명확성', '✓ 명확',
             'SAP 데이터 기반 채권현황(회전일 150일 이상) 조회 → 웹앱으로 MR에게 제공하는 명확한 요구사항.'),
            ('② 현업 참여 의지', '✗ 불확실',
             '"본부내 자체 진행(AX특공대 불필요)" 선택. AX팀과의 적극적 소통·검증 참여 의지 불확실.'),
            ('③ 데이터 디지털화', '✓ 즉시 가능',
             '웹앱 형태 요청. 즉시 제공 가능. 단, SAP 시스템 접근·연동이 핵심 전제조건.'),
            ('④ 예상 AI Tool·인프라', '해당',
             '☑ 웹앱 개발 (모바일)  ☑ 상용 API / 사내 서버 (SAP 연동)\n'
             '※ AI 요소보다 IT 시스템 개발·연동 성격이 강함'),
            ('⑤ 목표 달성 기준', '✓ 명확',
             '건당 10분 문의 → 모바일 즉시 조회 전환, 주 250분 절감'),
            ('⑥ 예상 효과', '중간',
             '[정량] 주 250분(약 4.2시간) 절감, 유관부서 문의 건수 제로화\n'
             '[정성] MR 현장 편의성 향상, 본질업무 집중도 개선'),
            ('⑦ 리스크·제약사항', '✗ 높음',
             '☑ 외부 시스템 연동: SAP 연동 필수이나 영업부 SAP 사용 불가 환경\n'
             '☑ AI 활용 요소 미약 → IT 개발 과제 성격\n'
             '☐ 참여 의지 불확실로 과제 진행 리스크'),
        ]
    },
    {
        'num': 3,
        'title': 'CPS 지출보고 증빙 검토·승인 자동화',
        'dept': '대웅제약 영업기획실 영업지원팀',
        'applicant': '김지숙',
        'empno': '2190153',
        'date': '2026.02.19',
        'avail': '하루 4시간 이상 (적극 참여)',
        'time_spent': '매일 7시간, 주 35시간 (비주기적)',
        'collab': '없음',
        'data_type': 'Excel / CSV, 이미지 / 스캔 파일',
        'data_ready': '예 (과제 선발 후 샘플 데이터 즉시 제공 가능)',
        'data_volume': '일 평균 1,500건, 월 30,000건 이상 (건당 이미지 1~3개)',
        'privacy': '포함 (주의 필요)',
        'asis': (
            '26년 2월 말부터 CPS 지출보고 시스템 내 영업부 법인카드(방문디테일) 사용내역 최종 검토·승인 역할 신규 수행 예정.\n'
            '영업부 상신 문서에 대해 증빙 적정성 및 CP 규정 준수 여부 확인 후 승인/반려 처리.\n'
            '(CPS 접속 → 결재요구함 → 상신문서 조회 → JPG 증빙파일 다운로드·확인 → 승인/반려)'
        ),
        'pain': (
            '① 수작업 기반 검수: 문서당 증빙 이미지(1~3개) 건별 다운로드 후 개별 확인, 미리보기·자동 판독 기능 부재\n'
            '② 업무 시간 과다: 단순 다운로드/확인에 검수 시간 대부분 소모, 승인 지연 시 영업 지급 일정 영향\n'
            '③ 오류 탐지 효율 저하: 촬영일자 불일치, 참석인원 대비 수량 과다/미달, 간이영수증 미확인 등'
        ),
        'tobe': (
            '- 수작업 중심 → 자동화 구조로 전환\n'
            '- 증빙 이미지 인식(OCR)으로 일괄 확인, 다운로드 작업 최소화\n'
            '- 이상 문서 자동 선별 → 검수 집중도 향상 및 승인 처리 속도 개선'
        ),
        'result_form': '파일 형태: Excel, CSV, Word 등',
        'eval': [
            ('① 업무 규칙·요구사항 명확성', '✓ 매우 명확',
             '증빙 적정성·CP 규정 준수 확인의 명확한 검토 프로세스. '
             '오류 판단 기준(촬영일자, 참석인원 대비 수량, 간이영수증 등)도 구체적.'),
            ('② 현업 참여 의지', '✓ 적극 참여',
             '하루 4시간 이상 적극 참여 가능. 매일 7시간 해당 업무 투입 중으로 높은 참여 동기.'),
            ('③ 데이터 디지털화', '✓ 즉시 가능',
             'Excel/CSV 및 이미지/스캔 파일 형태. 즉시 제공 가능.'),
            ('④ 예상 AI Tool·인프라', '해당',
             '☑ OCR (증빙 이미지 인식·판독)  ☑ LLM (이상 문서 자동 선별·규정 검증)\n'
             '☑ 노코드 워크플로우 n8n (일괄 처리 자동화)'),
            ('⑤ 목표 달성 기준', '✓ 명확',
             '일 1,500건 × 건당 3분 → 자동 인식·선별로 대폭 단축\n'
             '매일 7시간 → 이상 문서만 집중 검토로 80%+ 절감 기대'),
            ('⑥ 예상 효과', '매우 높음',
             '[정량] 일 7시간 → 1~2시간 (70~85% 절감), 월 30,000건 처리속도 대폭 향상\n'
             '[정성] 오류 탐지 정확도 향상, 승인 지연 리스크 감소, 지급 일정 안정화'),
            ('⑦ 리스크·제약사항', '△ 일부',
             '☑ 개인정보 규제: 민감 개인정보 포함\n'
             '☑ 외부 시스템 연동: CPS 시스템 연동 필요 가능\n'
             '☐ 증빙 이미지 품질에 따른 OCR 정확도 변동'),
        ]
    },
    {
        'num': 4,
        'title': 'ETC 로컬 스타 산출 자동화',
        'dept': '대웅제약 영업기획실 영업지원팀',
        'applicant': '박지현',
        'empno': '2230551',
        'date': '2026.02.19',
        'avail': '하루 2~3시간 (다른 업무 병행, 제한적 참여)',
        'time_spent': '1일 기준 8시간 소요',
        'collab': '인사팀 (영업부 담당자별 배치일자 확인)',
        'data_type': 'Excel / CSV',
        'data_ready': '예 (과제 선발 후 샘플 데이터 즉시 제공 가능)',
        'data_volume': '1파일 당 10,237여개 데이터 (로컬부 한정)',
        'privacy': '영업부 담당자별 배치일자 확인 필요',
        'asis': (
            '매월 약 10개 엑셀 파일을 활용하여 ETC 로컬 스타를 산출하는 반복 작업 수행.\n'
            '4단계 프로세스: ①실적 데이터 기초 작업(필터링·제외) → ②스타 파일 반영·검증(VLOOKUP/SUMIFS) → '
            '③예외·소급 금액 반영 → ④대상자 확정·최종 리스트업'
        ),
        'pain': (
            '당월 스타 산출 시 직전 3개월 \'최종실적\' 각 파일에 동일한 작업을 수행해야 하므로 불필요한 수작업 발생.\n'
            '1일 기준 8시간이 소요되는 반복 작업.'
        ),
        'tobe': (
            '원클릭 자동화를 통해 각 파일별 수작업 시간을 획기적으로 축소'
        ),
        'result_form': '파일 형태: Excel, CSV, Word 등',
        'eval': [
            ('① 업무 규칙·요구사항 명확성', '✓ 매우 명확',
             '4단계 프로세스가 매우 구체적. VLOOKUP/SUMIFS 등 엑셀 함수 기반 로직이 명확히 정의됨.'),
            ('② 현업 참여 의지', '△ 제한적',
             '하루 2~3시간, 제한적 참여. 선정 기준(매일 6시간)에 크게 미달. 참여 시간 확대 협의 필요.'),
            ('③ 데이터 디지털화', '✓ 즉시 가능',
             'Excel/CSV 형태. 즉시 제공 가능. 인사팀(배치일자) 협업 필요.'),
            ('④ 예상 AI Tool·인프라', '해당',
             '☑ 노코드 워크플로우 n8n (엑셀 자동 가공·매핑)\n'
             '※ AI보다 RPA/자동화 성격이 강함'),
            ('⑤ 목표 달성 기준', '✓ 명확',
             '1일 8시간 수작업 → 원클릭 자동화로 획기적 단축, 3개월 반복 작업 제거'),
            ('⑥ 예상 효과', '높음',
             '[정량] 월 8시간+ 수작업 절감, 파일 간 반복 작업 제거\n'
             '[정성] 수기 작업 오류 감소, 담당자 변경 시 업무 연속성 확보'),
            ('⑦ 리스크·제약사항', '△ 일부',
             '☑ 타부서 협업: 인사팀 데이터 필요\n'
             '☐ 참여 시간 제한(2~3시간)으로 일정 지연 리스크'),
        ]
    },
    {
        'num': 5,
        'title': 'Emma 메일링 업그레이드 (해외 매체 기사 솔팅·발송)',
        'dept': '엠서클 하이닥사업부 하이닥팀',
        'applicant': '김진우(정신영)',
        'empno': '01534',
        'date': '2026.02.20',
        'avail': '진행 상황에 따라 팀장님과 논의 후 시간 조정 예정',
        'time_spent': '각 기자당 약 30분 (메일링 발송 시 5분 이내 기대)',
        'collab': 'IT 추진팀 (기존 emma 개발팀)',
        'data_type': 'Excel/CSV, 텍스트, 정형 DB',
        'data_ready': '예 (과제 선발 후 샘플 데이터 즉시 제공 가능)',
        'data_volume': '기사 스크롤링 약 1,000여개 예상',
        'privacy': '미포함',
        'asis': (
            'Emma 메일링 시스템을 통해 해외 매체 약 20여개 기사를 솔팅 후 이메일 발송하는 업무.'
        ),
        'pain': (
            '① 주요 매체 추가 필요\n'
            '② 현재 단순 크롤링 방식 → 선정 기준에 따른 기사 선별·UI 개편·기사 요약 기능 부재'
        ),
        'tobe': (
            '선정 기준에 따른 기사 선별 후 발송 / UI 개편 / 기사 요약 기능 추가.\n'
            '닥터빌 홈페이지 내 페이지 제작도 고려 중.'
        ),
        'result_form': '파일 형태: Excel/CSV/Word, 메일링/닥터빌 내 페이지',
        'eval': [
            ('① 업무 규칙·요구사항 명확성', '△ 일부 애매',
             '기사 솔팅·발송이라는 큰 틀은 있으나, "선정 기준에 따른 기사 선별" 기준이 구체적이지 않음.'),
            ('② 현업 참여 의지', '△ 불확실',
             '"팀장님과 논의 후 시간 조정 예정" 기재. 선정 기준(매일 6시간) 충족 가능성 불확실.'),
            ('③ 데이터 디지털화', '✓ 즉시 가능',
             'Excel/CSV, 텍스트, 정형 DB 형태. 즉시 제공 가능.'),
            ('④ 예상 AI Tool·인프라', '해당',
             '☑ LLM (기사 선별·요약)  ☑ 노코드 워크플로우 n8n (크롤링·메일링)\n'
             '☑ 상용 API (크롤링, 이메일 발송)'),
            ('⑤ 목표 달성 기준', '✓ 명확',
             '기자당 30분 → 5분 이내 (약 83% 단축), 기사 1,000여개 자동 처리'),
            ('⑥ 예상 효과', '중간',
             '[정량] 기자당 25분 절감, 1,000여개 기사 자동 스크리닝\n'
             '[정성] 기사 선별 품질 향상, UI 개편으로 사용자 경험 개선'),
            ('⑦ 리스크·제약사항', '△ 일부',
             '☑ 외부 시스템 연동: 기존 emma 시스템(IT 추진팀) 연동·개편 필요\n'
             '☐ 기사 선별 기준 명확화 필요, 범위 확대 리스크'),
        ]
    },
    {
        'num': 6,
        'title': '최신연구 논문 기사 제작 자동화',
        'dept': '엠서클 하이닥사업부 하이닥팀',
        'applicant': '김진우(정신영)',
        'empno': '01534',
        'date': '2026.02.20',
        'avail': '진행사항 확인 후 팀장님과 논의하여 시간 조정 예정',
        'time_spent': '기사 1건당 약 4시간 → AI 툴 시 1시간 이내 예상',
        'collab': '없음',
        'data_type': '텍스트, 정형 DB',
        'data_ready': '예 (과제 선발 후 샘플 데이터 즉시 제공 가능)',
        'data_volume': '최신연구 논문 최근 1주일 내 100여개 이상 크롤링',
        'privacy': '미포함',
        'asis': (
            '최신연구 논문을 기반으로 기사를 제작하는 업무.\n'
            '과거 1차 제작 후 사용하다가 업그레이드 추진 중 관련 AI 추진팀 담당자 퇴사로 홀딩 상태.'
        ),
        'pain': (
            '기사 한 건 당 약 4시간 소요.\n'
            '기존 시스템 담당자 퇴사로 업그레이드가 중단된 상태.'
        ),
        'tobe': (
            '최신연구 논문 기사 발행 자동화.\n'
            '하이닥 CMS 내 기사 발행 연동.'
        ),
        'result_form': '대시보드, 하이닥 CMS 내 기사 발행',
        'eval': [
            ('① 업무 규칙·요구사항 명확성', '△ 일부 애매',
             '과거 1차 제작 경험이 있으나 담당자 퇴사로 홀딩. 업그레이드 요건이 구체적이지 않음.'),
            ('② 현업 참여 의지', '△ 불확실',
             '"팀장님과 논의하여 시간 조정 예정" 기재. 선정 기준(매일 6시간) 충족 가능성 불확실.'),
            ('③ 데이터 디지털화', '✓ 즉시 가능',
             '텍스트, 정형 DB 형태. 논문 크롤링 데이터 100여개 이상. 즉시 제공 가능.'),
            ('④ 예상 AI Tool·인프라', '해당',
             '☑ LLM (논문 요약·기사 작성)  ☑ 상용 API (논문 크롤링)'),
            ('⑤ 목표 달성 기준', '✓ 명확',
             '기사 1건당 4시간 → 1시간 이내 (75% 단축), 1주일 내 100여개 논문 자동 크롤링·선별'),
            ('⑥ 예상 효과', '중간',
             '[정량] 건당 3시간 절감, 기사 발행 속도·발행량 증가\n'
             '[정성] 최신 연구 트렌드 신속 반영, 기사 품질 일관성 확보'),
            ('⑦ 리스크·제약사항', '△ 일부',
             '☑ 기존 담당자 퇴사로 기술 인수인계 이슈\n'
             '☑ 하이닥 CMS 연동 필요\n'
             '☐ AI 생성 기사의 의료정보 정확성 검증 체계 필요'),
        ]
    },
    {
        'num': 7,
        'title': '처방마감자료 생성 및 메일 발송 자동화',
        'dept': '대웅제약 영업기획실 영업지원팀',
        'applicant': '이승민',
        'empno': '2240556',
        'date': '2026.02.20',
        'avail': '하루 2~3시간 (다른 업무 병행, 제한적 참여)',
        'time_spent': '월 1회, 약 4시간 이상',
        'collab': '없음',
        'data_type': 'Excel / CSV, 사내 시스템',
        'data_ready': '예 (과제 선발 후 샘플 데이터 즉시 제공 가능)',
        'data_volume': '처방마감자료 25만행+, 회전관리장 20만행 이하',
        'privacy': '개인정보 포함 (MR 사번)',
        'asis': (
            '[처방마감자료 생성] ①영업 DCM 데이터 다운로드·검증 → ②처방약호 기준 약가목록집 VLOOKUP(3단계) → '
            '③KEY 기준 회전관리장 조직 VLOOKUP → ④N/A 건 정리·신규처 요청 메일 → ⑤재매핑 → ⑥자동 메일 발송\n'
            '[BIO 중복제외리스트] 처방마감자료 완성 후 특정 품목 파일 생성 → BIO 담당자 메일 발송'
        ),
        'pain': (
            '① 대용량 VLOOKUP 매핑에 최소 1시간+, PC 자원 점유로 다른 업무 병행 불가\n'
            '② 신규 거래처 반영 후 재매핑 포함 시 2시간+ 소요\n'
            '③ 처방마감·DCM 마감 동시 시 병목 발생, 양쪽 일정 지연 가능'
        ),
        'tobe': (
            '처방마감자료에 영업부 조직·기준품명·단가를 자동 매핑하고, '
            '담당자들에게 자동 메일 발송'
        ),
        'result_form': '파일 형태: Excel, CSV, Word 등',
        'eval': [
            ('① 업무 규칙·요구사항 명확성', '✓ 매우 명확',
             '6단계 프로세스가 상세하게 기술됨. VLOOKUP 3단계, KEY 기준 매핑, 메일 발송까지 모두 명확.'),
            ('② 현업 참여 의지', '△ 제한적',
             '하루 2~3시간, 제한적 참여. 월 1회 업무이므로 집중 기간 조율 가능성은 있음.'),
            ('③ 데이터 디지털화', '✓ 즉시 가능',
             'Excel/CSV, 사내 시스템 데이터. 25만행+ 대용량. 즉시 제공 가능.'),
            ('④ 예상 AI Tool·인프라', '해당',
             '☑ 노코드 워크플로우 n8n (데이터 매핑·메일 발송)\n'
             '※ AI보다 RPA/자동화 성격이 강함, 대용량 처리 서버 필요 가능'),
            ('⑤ 목표 달성 기준', '✓ 명확',
             '월 4시간+ → 자동 매핑·메일 발송 단축, VLOOKUP 1시간+ → 수분 이내'),
            ('⑥ 예상 효과', '높음',
             '[정량] 월 4시간+ 절감, 매핑 시간 90%+ 단축, PC 자원 점유 해소\n'
             '[정성] 처방마감 정확성 확보, 마감 병목 해소, 재작업 최소화'),
            ('⑦ 리스크·제약사항', '△ 일부',
             '☑ 개인정보 규제: MR 사번 포함\n'
             '☑ 사내 시스템 연동: DCM, 약가목록집, 회전관리장 접근 필요\n'
             '☐ 참여 시간 제한(2~3시간) 일정 지연 가능'),
        ]
    },
    {
        'num': 8,
        'title': '매출 대시보드 제작 (통합 데이터 시각화)',
        'dept': '디엔컴퍼니 재무기획실 전략기획팀',
        'applicant': '백송이',
        'empno': '2500685',
        'date': '2026.02.20',
        'avail': '하루 4시간 이상 (적극 참여)',
        'time_spent': '주 약 12시간, 일 평균 2.5시간',
        'collab': '영업부, ME팀 등 다부서',
        'data_type': 'Excel / CSV',
        'data_ready': '예 (과제 선발 후 샘플 데이터 즉시 제공 가능)',
        'data_volume': '다부서 데이터 통합',
        'privacy': '미포함',
        'asis': (
            '매출·마케팅 관련 자료를 영업부, ME팀, 전략기획팀에서 개별 관리 중.\n'
            '조직별 관리 목적·포맷이 상이하여 통합 대시보드 구조가 없는 상태.\n'
            '각 팀 자료 개별 수령 후 매월 재정렬·재가공하여 차트·테이블 생성.'
        ),
        'pain': (
            '① 데이터 취합·정합성 검증에 과도한 시간: 조직별 포맷·기준 상이, 매월 수작업 재가공\n'
            '② 지표 정의 일관성 부족: 네트워크 진입률, 신규처 기준, D2D 성장률 등 매월 재정의 필요\n'
            '③ 반복 업무 구조적 고착화: 동일 취합·정리·차트 작성 반복, 담당자 의존적'
        ),
        'tobe': (
            'AI가 자동으로 취합·정합성 검증·지표 산출·시각화까지 수행하는 '
            '통합 매출 대시보드 체계 구축'
        ),
        'result_form': '파일 형태: Excel/CSV/Word, 대시보드',
        'eval': [
            ('① 업무 규칙·요구사항 명확성', '△ 일부 애매',
             '"아직 정형화된 틀이 없는 상태, 신규 구축 계획". 방향성은 있으나 지표 정의·구조 등 구체화 필요.'),
            ('② 현업 참여 의지', '✓ 적극 참여',
             '하루 4시간 이상 적극 참여 가능. 주 12시간 업무 투입 중으로 높은 참여 동기.'),
            ('③ 데이터 디지털화', '✓ 즉시 가능',
             'Excel/CSV 형태. 제공 가능. 다만 조직별 포맷 상이로 데이터 표준화 선행 필요.'),
            ('④ 예상 AI Tool·인프라', '해당',
             '☑ BI 대시보드 (매출 시각화)  ☑ LLM (정합성 검증·지표 산출)\n'
             '☑ 노코드 워크플로우 n8n (데이터 자동 취합·가공)'),
            ('⑤ 목표 달성 기준', '△ 구체화 필요',
             '주 12시간 → 자동화 단축 (구체적 목표 수치 미기재). 신규 구축으로 단계적 목표 설정 필요.'),
            ('⑥ 예상 효과', '높음',
             '[정량] 주 12시간 취합·가공 시간 절감, 보고 속도 단축\n'
             '[정성] 지표 일관성 확보, 담당자 의존도 감소, 통합 데이터 의사결정 체계'),
            ('⑦ 리스크·제약사항', '△ 일부',
             '☐ 다부서 데이터 통합 필요 (조직별 포맷 상이)\n'
             '☐ 요구사항 미확정 → 범위 확대(scope creep) 리스크\n'
             '☐ 신규 구축으로 기대 수준 조율 필요'),
        ]
    },
]


for proj in projects:
    add_section_break(doc)

    # Chapter 2 header
    p = doc.add_paragraph()
    styled_run(p, '2', size=20, bold=True, color=ACCENT)
    styled_run(p, f'.{proj["num"]}', size=20, bold=True, color=ACCENT)
    styled_run(p, f'  {proj["title"]}', size=20, bold=True, color=NAVY)

    # ── 2.x.1 기본정보, As-Is, To-Be ──
    p = doc.add_paragraph()
    styled_run(p, f'2.{proj["num"]}.1 ', size=12, bold=True, color=ACCENT)
    styled_run(p, '과제 기본정보 · 현재 업무 · 희망 결과', size=12, bold=True, color=NAVY)

    doc.add_paragraph()

    # -- 기본정보 테이블 (2 cols layout) --
    info_tbl = doc.add_table(rows=5, cols=4)
    info_tbl.style = 'Table Grid'
    info_tbl.alignment = WD_TABLE_ALIGNMENT.CENTER

    info_items = [
        ('소속', proj['dept'], '신청자 / 사번', f'{proj["applicant"]} / {proj["empno"]}'),
        ('접수일', proj['date'], '참여 가능 시간', proj['avail']),
        ('현재 업무 소요시간', proj['time_spent'], '협업 부서', proj['collab']),
        ('데이터 형태', proj['data_type'], '데이터 준비 상태', proj['data_ready']),
        ('데이터 처리 규모', proj['data_volume'], '개인정보 포함', proj['privacy']),
    ]

    for ri, (l1, v1, l2, v2) in enumerate(info_items):
        for ci, (label, val) in enumerate([(l1, v1), (l2, v2)]):
            lc = info_tbl.rows[ri].cells[ci * 2]
            vc = info_tbl.rows[ri].cells[ci * 2 + 1]
            lc.text = ''
            vc.text = ''
            shade(lc, LIGHT_ACCENT)
            lc.vertical_alignment = WD_ALIGN_VERTICAL.CENTER
            vc.vertical_alignment = WD_ALIGN_VERTICAL.CENTER
            rl = lc.paragraphs[0].add_run(label)
            rl.bold = True
            rl.font.size = Pt(8)
            rv = vc.paragraphs[0].add_run(val)
            rv.font.size = Pt(8)

    doc.add_paragraph()

    # -- As-Is / Pain / To-Be 3 column layout --
    apt_tbl = doc.add_table(rows=2, cols=3)
    apt_tbl.style = 'Table Grid'
    apt_tbl.alignment = WD_TABLE_ALIGNMENT.CENTER

    for ci, title in enumerate(['As-Is : 현재 업무', 'Pain Point : 문제점', 'To-Be : 희망 결과']):
        make_header_cell(apt_tbl.rows[0].cells[ci], title, 9)

    contents = [proj['asis'], proj['pain'], proj['tobe']]
    for ci, txt in enumerate(contents):
        c = apt_tbl.rows[1].cells[ci]
        c.text = ''
        c.vertical_alignment = WD_ALIGN_VERTICAL.TOP
        p = c.paragraphs[0]
        r = p.add_run(txt)
        r.font.size = Pt(8)

    doc.add_paragraph()
    p = doc.add_paragraph()
    styled_run(p, '결과 형태: ', size=8, bold=True, color=ACCENT)
    styled_run(p, proj['result_form'], size=8)

    doc.add_paragraph()

    # ── 2.x.2 과제 선정 기준 체크리스트 평가 ──
    p = doc.add_paragraph()
    styled_run(p, f'2.{proj["num"]}.2 ', size=12, bold=True, color=ACCENT)
    styled_run(p, '과제 선정 기준 체크리스트 평가', size=12, bold=True, color=NAVY)

    doc.add_paragraph()

    eval_tbl = doc.add_table(rows=len(proj['eval']) + 1, cols=3)
    eval_tbl.style = 'Table Grid'
    eval_tbl.alignment = WD_TABLE_ALIGNMENT.CENTER

    make_header_cell(eval_tbl.rows[0].cells[0], '선정 기준', 9)
    make_header_cell(eval_tbl.rows[0].cells[1], '판정', 9)
    make_header_cell(eval_tbl.rows[0].cells[2], '평가 내용', 9)

    for ri, (criteria, status, detail) in enumerate(proj['eval'], 1):
        c0 = eval_tbl.rows[ri].cells[0]
        c1 = eval_tbl.rows[ri].cells[1]
        c2 = eval_tbl.rows[ri].cells[2]

        c0.text = ''
        c0.vertical_alignment = WD_ALIGN_VERTICAL.CENTER
        r0 = c0.paragraphs[0].add_run(criteria)
        r0.font.size = Pt(8)
        r0.bold = True

        c1.text = ''
        c1.vertical_alignment = WD_ALIGN_VERTICAL.CENTER
        c1.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
        r1 = c1.paragraphs[0].add_run(status)
        r1.font.size = Pt(9)
        r1.bold = True

        if '✓' in status or '매우' in status:
            shade(c1, GREEN_BG)
        elif '△' in status or status == '해당' or '중간' in status:
            shade(c1, YELLOW_BG)
        elif '✗' in status:
            shade(c1, RED_BG)
        elif '높음' in status:
            shade(c1, GREEN_BG)

        c2.text = ''
        c2.vertical_alignment = WD_ALIGN_VERTICAL.TOP
        r2 = c2.paragraphs[0].add_run(detail)
        r2.font.size = Pt(8)


# ============================================================
#  CHAPTER 3 — 선정 적합도 순위
# ============================================================
add_section_break(doc)

p = doc.add_paragraph()
styled_run(p, '3', size=22, bold=True, color=ACCENT)
styled_run(p, '  선정 적합도 순위 및 최종 정리', size=22, bold=True, color=NAVY)

doc.add_paragraph()

# -- 종합 평가 매트릭스 --
p = doc.add_paragraph()
styled_run(p, '■ 종합 평가 매트릭스', size=12, bold=True, color=NAVY)

doc.add_paragraph()

mx = doc.add_table(rows=9, cols=9)
mx.style = 'Table Grid'
mx.alignment = WD_TABLE_ALIGNMENT.CENTER

mh = ['과제', '① 규칙\n명확성', '② 참여\n의지', '③ 데이터\n준비', '④ AI\nTool', '⑤ 목표\n기준', '⑥ 예상\n효과', '⑦ 리스크', '종합\n적합도']
for i, t in enumerate(mh):
    make_header_cell(mx.rows[0].cells[i], t, 8)

mx_data = [
    ['3. 김지숙\nCPS 증빙 검토 자동화', '✓', '✓', '✓', 'OCR/LLM\nn8n', '✓', '매우 높음', '△', '★★★★★'],
    ['1. 박미경\n목표 달성 DashBoard', '✓', '✓', '✓', 'BI/LLM\nn8n', '✓', '높음', '△', '★★★★☆'],
    ['4. 박지현\n로컬 스타 산출', '✓', '△', '✓', 'n8n\nRPA', '✓', '높음', '△', '★★★★☆'],
    ['7. 이승민\n처방마감자료 자동화', '✓', '△', '✓', 'n8n\nRPA', '✓', '높음', '△', '★★★★☆'],
    ['8. 백송이\n매출 대시보드', '△', '✓', '✓', 'BI/LLM\nn8n', '△', '높음', '△', '★★★☆☆'],
    ['5. 김진우\nEmma 메일링', '△', '△', '✓', 'LLM/n8n\nAPI', '✓', '중간', '△', '★★★☆☆'],
    ['6. 김진우\n논문 기사 자동화', '△', '△', '✓', 'LLM\nAPI', '✓', '중간', '△', '★★★☆☆'],
    ['2. 김희영\n채권현황 조회', '✓', '✗', '✓', '웹앱\nAPI', '✓', '중간', '✗', '★★☆☆☆'],
]

for ri, row in enumerate(mx_data, 1):
    for ci, val in enumerate(row):
        c = mx.rows[ri].cells[ci]
        c.text = ''
        c.vertical_alignment = WD_ALIGN_VERTICAL.CENTER
        p = c.paragraphs[0]
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        r = p.add_run(val)
        r.font.size = Pt(8)
        if ci == 0:
            r.bold = True
            p.alignment = WD_ALIGN_PARAGRAPH.LEFT
        elif ci == 8:
            r.bold = True
            r.font.color.rgb = RGBColor.from_string(ACCENT)
        else:
            if val in ('✓', '매우 높음'):
                shade(c, GREEN_BG)
            elif val in ('△', '중간', '해당'):
                shade(c, YELLOW_BG)
            elif val == '✗':
                shade(c, RED_BG)
            elif '높음' in val:
                shade(c, GREEN_BG)

    if ri <= 1:
        for ci in range(9):
            c = mx.rows[ri].cells[ci]
            existing = c._tc.get_or_add_tcPr()

doc.add_paragraph()
doc.add_paragraph()

# -- 선정 적합도 순위 상세 --
p = doc.add_paragraph()
styled_run(p, '■ 선정 적합도 순위 (상세 의견)', size=12, bold=True, color=NAVY)

doc.add_paragraph()

rankings = [
    ('1순위', '★★★★★', '과제 3', 'CPS 지출보고 증빙 검토·승인 자동화 (김지숙)',
     '선정 강력 권장',
     '가장 높은 선정 적합도. 업무 규칙이 매우 명확하고, 신청자의 적극적 참여 의지가 확인됨. '
     'OCR과 LLM을 결합한 AI 활용 가치가 매우 높으며, 일 1,500건/월 30,000건의 대량 처리로 '
     '자동화 효과가 극대화됨. 개인정보 포함 데이터에 대한 보안 대책 수립이 선행 필요.',
     GREEN_BG),
    ('2순위', '★★★★☆', '과제 1', 'ETC마케팅본부 목표 달성 DashBoard (박미경)',
     '선정 권장',
     '명확한 프로세스와 적극적 참여 의지. BI 대시보드 + LLM 결산 자동 작성의 조합으로 '
     'AI 활용 가치가 높음. SF CRM 연동 범위를 사전에 확정하여 착수 시 지연을 방지할 필요가 있음.',
     GREEN_BG),
    ('3순위', '★★★★☆', '과제 4 / 과제 7',
     '로컬 스타 산출 (박지현) / 처방마감자료 자동화 (이승민)',
     '조건부 선정 (참여 시간 확대 협의 필요)',
     '두 과제 모두 업무 로직이 매우 명확하여 자동화에 매우 적합함. '
     '다만 참여 시간(2~3시간)이 기준(6시간)에 크게 미달하므로, 참여 시간 확대를 협의한 후 선정을 권장. '
     '과제 7은 개인정보(MR 사번) 보안 대책 수립 필요.',
     YELLOW_BG),
    ('4순위', '★★★☆☆', '과제 8', '매출 대시보드 제작 (백송이)',
     '요건 정의 후 선정',
     '적극적 참여 의지와 높은 효과가 기대되나, 요구사항이 아직 미확정 상태. '
     '신규 구축 특성상 범위 관리가 매우 중요하므로, 요건 정의 워크숍을 선행한 후 착수할 것을 권장.',
     YELLOW_BG),
    ('5순위', '★★★☆☆', '과제 5 / 과제 6',
     'Emma 메일링 업그레이드 / 논문 기사 자동화 (김진우)',
     '재검토 필요',
     '두 과제 모두 LLM 활용 가치는 있으나, 참여 의지가 불확실하고 요구사항 구체화가 필요. '
     '과제 6은 기존 시스템 상태 파악이 선행되어야 함. 참여 시간·요건 확정 후 재검토를 권장.',
     YELLOW_BG),
    ('6순위', '★★☆☆☆', '과제 2', 'MR 거래처 채권현황 실시간 조회 (김희영)',
     'AX 과제 부적합 → IT 개발 과제로 검토',
     '참여 의지가 불확실(AX특공대 불필요 기재)하고, AI 활용 요소가 미약하며(IT 시스템 개발 성격), '
     'SAP 연동 제약 등으로 AX 과제 선정에 부적합. IT 개발 과제로 별도 검토할 것을 권장.',
     RED_BG),
]

rank_tbl = doc.add_table(rows=len(rankings) + 1, cols=6)
rank_tbl.style = 'Table Grid'
rank_tbl.alignment = WD_TABLE_ALIGNMENT.CENTER

rh = ['순위', '과제', '과제명', '판정', '종합 의견', '']
rh_actual = ['순위', '과제', '과제명', '판정', '종합 의견']
for i in range(5):
    make_header_cell(rank_tbl.rows[0].cells[i], rh_actual[i], 9)
make_header_cell(rank_tbl.rows[0].cells[5], '', 9)

# merge last two cols header
rank_tbl.rows[0].cells[4].merge(rank_tbl.rows[0].cells[5])

for ri, (rank, stars, pno, pname, verdict, opinion, bg) in enumerate(rankings, 1):
    c0 = rank_tbl.rows[ri].cells[0]
    c1 = rank_tbl.rows[ri].cells[1]
    c2 = rank_tbl.rows[ri].cells[2]
    c3 = rank_tbl.rows[ri].cells[3]
    c45 = rank_tbl.rows[ri].cells[4]
    c45.merge(rank_tbl.rows[ri].cells[5])

    for c in [c0, c1, c2, c3, c45]:
        c.text = ''
        c.vertical_alignment = WD_ALIGN_VERTICAL.CENTER

    c0.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
    r = c0.paragraphs[0].add_run(f'{rank}\n{stars}')
    r.font.size = Pt(8)
    r.bold = True
    shade(c0, bg)

    c1.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
    r = c1.paragraphs[0].add_run(pno)
    r.font.size = Pt(8)
    r.bold = True

    r = c2.paragraphs[0].add_run(pname)
    r.font.size = Pt(8)

    c3.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
    r = c3.paragraphs[0].add_run(verdict)
    r.font.size = Pt(8)
    r.bold = True
    if '강력' in verdict:
        r.font.color.rgb = RGBColor.from_string('27AE60')
    elif '권장' in verdict and '부적합' not in verdict:
        r.font.color.rgb = RGBColor.from_string(ACCENT)
    elif '부적합' in verdict:
        r.font.color.rgb = RGBColor.from_string('E74C3C')

    r = c45.paragraphs[0].add_run(opinion)
    r.font.size = Pt(8)


doc.add_paragraph()
doc.add_paragraph()

# -- 핵심 메시지 --
p = doc.add_paragraph()
styled_run(p, '■ 핵심 요약', size=12, bold=True, color=NAVY)

doc.add_paragraph()

key_tbl = doc.add_table(rows=1, cols=1)
key_tbl.style = 'Table Grid'
key_tbl.alignment = WD_TABLE_ALIGNMENT.CENTER
kc = key_tbl.rows[0].cells[0]
kc.text = ''
shade(kc, LIGHT_ACCENT)

lines = [
    ('총 접수 과제: ', '4개 조직, 8건 (2026.02.19~20 접수)'),
    ('즉시 착수 가능: ', '8건 모두 데이터 디지털화 완료 (100%)'),
    ('선정 강력 권장: ', '과제 3 (CPS 증빙 검토 자동화) — OCR·LLM 활용, 일 1,500건 대량 처리, 70~85% 시간 절감 기대'),
    ('선정 권장: ', '과제 1 (DashBoard) — BI+LLM 조합, 높은 AI 활용 가치'),
    ('조건부 선정: ', '과제 4, 7 (참여 시간 확대 협의 필요) / 과제 8 (요건 정의 선행 필요)'),
    ('재검토 필요: ', '과제 5, 6 (참여 의지·요건 구체화 필요)'),
    ('AX 부적합: ', '과제 2 (IT 개발 과제 성격, 별도 검토 권장)'),
]

for label, value in lines:
    p = kc.add_paragraph()
    p.paragraph_format.space_before = Pt(2)
    p.paragraph_format.space_after = Pt(2)
    styled_run(p, f'  ▸ {label}', size=10, bold=True, color=NAVY)
    styled_run(p, value, size=10)


# ── Save ──
base_dir = os.path.dirname(os.path.abspath(__file__))
output_path = os.path.join(base_dir, 'outputs', '20260223_report.doc')
os.makedirs(os.path.dirname(output_path), exist_ok=True)
doc.save(output_path)
print(f'Report saved: {output_path}')
