2026-02-14 21:06:19 +09:00
const path = require ( 'path' ) ;
module . paths . unshift ( path . join ( require ( 'os' ) . homedir ( ) , '.claude/skills/pptx-skill/scripts/node_modules' ) ) ;
const PptxGenJS = require ( 'pptxgenjs' ) ;
// ═══════════════════════════════════════════════════════
// 색상 팔레트 (# 없이!)
// ═══════════════════════════════════════════════════════
const C = {
dark : '0F1923' ,
darkBlue : '1A2940' ,
navy : '162447' ,
accent : '00D4AA' , // 민트 그린 (핵심 강조)
accentDark : '00B894' ,
gold : 'FFD700' ,
goldDark : 'F0C800' ,
orange : 'FF6B35' ,
red : 'FF4757' ,
blue : '3742FA' ,
lightBlue : '70A1FF' ,
purple : '7C5CFC' ,
white : 'FFFFFF' ,
gray : '8B95A5' ,
lightGray : 'C8D1DC' ,
softWhite : 'F0F4F8' ,
cardBg : '1E3350' ,
cardBg2 : '243B55' ,
green : '26DE81' ,
greenDark : '20BF6B' ,
} ;
async function main ( ) {
const pres = new PptxGenJS ( ) ;
pres . defineLayout ( { name : 'CUSTOM_16x9' , width : 10 , height : 5.625 } ) ;
pres . layout = 'CUSTOM_16x9' ;
// ═══════════════════════════════════════════════════════
// SLIDE 1: 표지 — "당신의 회사, 아직도 감(感)으로 경영하십니까?"
// ═══════════════════════════════════════════════════════
let slide = pres . addSlide ( ) ;
// 배경: 다크 그라데이션 느낌 (단색으로 대체)
slide . addShape ( pres . ShapeType . rect , { x : 0 , y : 0 , w : 10 , h : 5.625 , fill : { color : C . dark } } ) ;
// 좌측 상단 악센트 라인
slide . addShape ( pres . ShapeType . rect , { x : 0 , y : 0 , w : 0.08 , h : 5.625 , fill : { color : C . accent } } ) ;
// 좌측 상단 태그
slide . addShape ( pres . ShapeType . roundRect , { x : 0.6 , y : 0.5 , w : 2.0 , h : 0.35 , rectRadius : 0.05 , fill : { color : C . accent } } ) ;
slide . addText ( '중소기업 CEO를 위한 제안' , { x : 0.6 , y : 0.5 , w : 2.0 , h : 0.35 , fontSize : 9 , fontFace : 'Malgun Gothic' , color : C . dark , bold : true , align : 'center' } ) ;
// 메인 카피
slide . addText ( '당신의 회사,\n아직도 감(感)으로\n경영하십니까?' , {
x : 0.6 , y : 1.3 , w : 5.5 , h : 2.2 ,
fontSize : 32 , fontFace : 'Malgun Gothic' , color : C . white , bold : true ,
lineSpacingMultiple : 1.2 ,
} ) ;
// 서브 카피
slide . addText ( '직원이 20명인데, 실시간으로 현금 흐름을 파악하고 계십니까?\n매달 세금 마감일에 허둥대지 않으십니까?' , {
x : 0.6 , y : 3.5 , w : 5.5 , h : 0.7 ,
fontSize : 11 , fontFace : 'Malgun Gothic' , color : C . gray , lineSpacingMultiple : 1.5 ,
} ) ;
// 우측 대형 SAM 로고 텍스트
slide . addText ( 'SAM' , {
x : 5.5 , y : 0.8 , w : 4.2 , h : 2.5 ,
fontSize : 80 , fontFace : 'Arial' , color : C . accent , bold : true , align : 'center' ,
} ) ;
slide . addText ( 'Smart Automation Management' , {
x : 5.5 , y : 2.8 , w : 4.2 , h : 0.4 ,
fontSize : 11 , fontFace : 'Arial' , color : C . lightBlue , align : 'center' ,
} ) ;
// 우측 하단 포인트
slide . addShape ( pres . ShapeType . roundRect , { x : 6.0 , y : 3.6 , w : 3.2 , h : 1.2 , rectRadius : 0.1 , fill : { color : C . cardBg } } ) ;
slide . addText ( [
{ text : '제조업 특화 ' , options : { fontSize : 10 , color : C . gray , fontFace : 'Malgun Gothic' } } ,
{ text : 'ERP/MES 통합 솔루션\n' , options : { fontSize : 10 , color : C . accent , bold : true , fontFace : 'Malgun Gothic' } } ,
{ text : 'AI 경영 비서 | 모바일 대시보드 | SaaS' , options : { fontSize : 9 , color : C . lightGray , fontFace : 'Malgun Gothic' } } ,
] , { x : 6.2 , y : 3.7 , w : 2.8 , h : 1.0 , lineSpacingMultiple : 1.6 } ) ;
// 하단 구분선
slide . addShape ( pres . ShapeType . rect , { x : 0.6 , y : 5.2 , w : 8.8 , h : 0.01 , fill : { color : '2A3F5F' } } ) ;
slide . addText ( 'SAM | 대표님의 경영 무기' , { x : 0.6 , y : 5.25 , w : 4 , h : 0.3 , fontSize : 7 , color : C . gray , fontFace : 'Malgun Gothic' } ) ;
slide . addText ( 'Confidential' , { x : 8.0 , y : 5.25 , w : 1.5 , h : 0.3 , fontSize : 7 , color : C . red , fontFace : 'Arial' , align : 'right' } ) ;
// ═══════════════════════════════════════════════════════
// SLIDE 2: 중소기업 CEO의 20가지 고민
// ═══════════════════════════════════════════════════════
slide = pres . addSlide ( ) ;
slide . addShape ( pres . ShapeType . rect , { x : 0 , y : 0 , w : 10 , h : 5.625 , fill : { color : C . dark } } ) ;
slide . addShape ( pres . ShapeType . rect , { x : 0 , y : 0 , w : 0.08 , h : 5.625 , fill : { color : C . orange } } ) ;
// 헤더
slide . addText ( '02' , { x : 0.5 , y : 0.3 , w : 0.7 , h : 0.5 , fontSize : 24 , fontFace : 'Arial' , color : C . orange , bold : true } ) ;
slide . addText ( '대표님, 이런 고민 하고 계시죠?' , { x : 1.1 , y : 0.3 , w : 5 , h : 0.5 , fontSize : 20 , fontFace : 'Malgun Gothic' , color : C . white , bold : true } ) ;
slide . addShape ( pres . ShapeType . roundRect , { x : 7.0 , y : 0.35 , w : 2.5 , h : 0.35 , rectRadius : 0.05 , fill : { color : '3D1F00' } } ) ;
slide . addText ( 'CEO 20대 고민 리스트' , { x : 7.0 , y : 0.35 , w : 2.5 , h : 0.35 , fontSize : 9 , fontFace : 'Malgun Gothic' , color : C . orange , align : 'center' } ) ;
// 고민 카드 4열 5행
const worries = [
{ icon : '⏰' , text : '직원이 몇 시에\n출근하는지 모른다' } ,
{ icon : '💰' , text : '현금 흐름이\n실시간 파악 안 된다' } ,
{ icon : '📋' , text : '세금 마감일마다\n허둥댄다' } ,
{ icon : '📦' , text : '재고가 얼마나\n쌓여있는지 모른다' } ,
{ icon : '📊' , text : '매출은 나는데\n이익이 안 남는다' } ,
{ icon : '🏗️' , text : '현장에서 뭐하는지\n알 수 없다' } ,
{ icon : '📱' , text : '외근 중에도\n회사 상황 확인 불가' } ,
{ icon : '🔄' , text : '직원 퇴사하면\n인수인계가 안 된다' } ,
{ icon : '📑' , text : '견적서 하나 만드는데\n30분 걸린다' } ,
{ icon : '🔍' , text : '미수금이 얼마인지\n파악이 안 된다' } ,
{ icon : '⚠️' , text : '불량이 발생해도\n원인 추적 불가' } ,
{ icon : '💳' , text : '법인카드 사용 내역\n엑셀로 관리한다' } ,
{ icon : '🏭' , text : '생산 진행률을\n실시간 못 본다' } ,
{ icon : '📈' , text : '거래처별 수익성을\n분석 못 한다' } ,
{ icon : '🗂️' , text : '결재 서류가\n산더미처럼 쌓인다' } ,
{ icon : '🔐' , text : '직원이 어떤 데이터를\n봤는지 모른다' } ,
{ icon : '📞' , text : '고객 문의에\n즉답이 안 된다' } ,
{ icon : '🧮' , text : '급여 계산을\n수작업으로 한다' } ,
{ icon : '🚛' , text : '출하 일정 관리가\n엉망이다' } ,
{ icon : '😰' , text : '이 모든 걸\n엑셀로 관리한다' } ,
] ;
const cols = 4 , rows = 5 ;
const cardW = 2.1 , cardH = 0.58 ;
const startX = 0.5 , startY = 1.0 ;
const gapX = 0.15 , gapY = 0.08 ;
worries . forEach ( ( w , i ) => {
const col = i % cols ;
const row = Math . floor ( i / cols ) ;
const x = startX + col * ( cardW + gapX ) ;
const y = startY + row * ( cardH + gapY ) ;
// 마지막 카드는 빨간색 강조
const isLast = i === worries . length - 1 ;
const bg = isLast ? '3D1520' : C . cardBg ;
const borderColor = isLast ? C . red : '2A3F5F' ;
slide . addShape ( pres . ShapeType . roundRect , {
x , y , w : cardW , h : cardH , rectRadius : 0.06 ,
fill : { color : bg } , line : { color : borderColor , width : 0.5 } ,
} ) ;
slide . addText ( w . icon , { x : x + 0.08 , y : y + 0.05 , w : 0.35 , h : 0.45 , fontSize : 16 , align : 'center' , valign : 'middle' } ) ;
slide . addText ( w . text , {
x : x + 0.4 , y : y + 0.05 , w : cardW - 0.5 , h : 0.48 ,
fontSize : 7.5 , fontFace : 'Malgun Gothic' , color : isLast ? C . red : C . lightGray ,
lineSpacingMultiple : 1.3 , valign : 'middle' , bold : isLast ,
} ) ;
} ) ;
// 하단 한줄 카피
slide . addText ( '"이 중 5개 이상 해당된다면, 지금 당장 SAM이 필요합니다."' , {
x : 0.5 , y : 4.85 , w : 9 , h : 0.4 ,
fontSize : 12 , fontFace : 'Malgun Gothic' , color : C . gold , bold : true , align : 'center' ,
} ) ;
addFooter ( slide , pres , '2 / 10' ) ;
// ═══════════════════════════════════════════════════════
// SLIDE 3: SAM은 직원 관리 도구가 아닙니다
// ═══════════════════════════════════════════════════════
slide = pres . addSlide ( ) ;
slide . addShape ( pres . ShapeType . rect , { x : 0 , y : 0 , w : 10 , h : 5.625 , fill : { color : C . dark } } ) ;
slide . addShape ( pres . ShapeType . rect , { x : 0 , y : 0 , w : 0.08 , h : 5.625 , fill : { color : C . accent } } ) ;
// 헤더
slide . addText ( '03' , { x : 0.5 , y : 0.3 , w : 0.7 , h : 0.5 , fontSize : 24 , fontFace : 'Arial' , color : C . accent , bold : true } ) ;
slide . addText ( 'SAM은 "직원 관리 도구"가 아닙니다.' , { x : 1.1 , y : 0.3 , w : 7 , h : 0.5 , fontSize : 20 , fontFace : 'Malgun Gothic' , color : C . white , bold : true } ) ;
// 큰 텍스트 강조
slide . addText ( [
{ text : '대표님의 ' , options : { fontSize : 28 , color : C . lightGray , fontFace : 'Malgun Gothic' } } ,
{ text : '경영 무기' , options : { fontSize : 36 , color : C . accent , bold : true , fontFace : 'Malgun Gothic' } } ,
{ text : '입니다.' , options : { fontSize : 28 , color : C . lightGray , fontFace : 'Malgun Gothic' } } ,
] , { x : 0.6 , y : 1.0 , w : 9 , h : 0.8 , align : 'center' } ) ;
// 전투기 콕핏 메타포
slide . addShape ( pres . ShapeType . roundRect , { x : 0.6 , y : 2.0 , w : 4.2 , h : 2.8 , rectRadius : 0.12 , fill : { color : C . cardBg } , line : { color : C . accent , width : 1 } } ) ;
slide . addText ( 'SAM 대시보드' , {
x : 0.6 , y : 2.05 , w : 4.2 , h : 0.4 ,
fontSize : 12 , fontFace : 'Malgun Gothic' , color : C . accent , bold : true , align : 'center' ,
} ) ;
slide . addText ( '"전투기 조종석의 HUD처럼\n핵심 지표만 한눈에"' , {
x : 0.9 , y : 2.45 , w : 3.6 , h : 0.55 ,
fontSize : 10 , fontFace : 'Malgun Gothic' , color : C . gray , align : 'center' , lineSpacingMultiple : 1.4 , italic : true ,
} ) ;
// HUD 시뮬레이션: 5대 KPI
const kpis = [
{ label : '오늘 매출' , value : '₩12.5M' , color : C . green , icon : '📈' } ,
{ label : '미수금 현황' , value : '₩4.2M' , color : C . red , icon : '⚠️' } ,
{ label : '생산 진행률' , value : '87%' , color : C . lightBlue , icon : '🏭' } ,
{ label : '출근율' , value : '95%' , color : C . accent , icon : '👥' } ,
{ label : '이번달 이익률' , value : '18.5%' , color : C . gold , icon : '💰' } ,
] ;
kpis . forEach ( ( kpi , i ) => {
const y = 3.1 + i * 0.38 ;
slide . addShape ( pres . ShapeType . roundRect , { x : 0.9 , y , w : 3.6 , h : 0.32 , rectRadius : 0.04 , fill : { color : '15293D' } } ) ;
slide . addText ( kpi . icon + ' ' + kpi . label , { x : 1.0 , y , w : 2.0 , h : 0.32 , fontSize : 8.5 , fontFace : 'Malgun Gothic' , color : C . lightGray , valign : 'middle' } ) ;
slide . addText ( kpi . value , { x : 3.4 , y , w : 1.0 , h : 0.32 , fontSize : 10 , fontFace : 'Arial' , color : kpi . color , bold : true , align : 'right' , valign : 'middle' } ) ;
} ) ;
// 우측: 기존 ERP vs SAM 비교
slide . addShape ( pres . ShapeType . roundRect , { x : 5.2 , y : 2.0 , w : 4.3 , h : 2.8 , rectRadius : 0.12 , fill : { color : C . cardBg } } ) ;
slide . addText ( '기존 ERP vs SAM' , {
x : 5.2 , y : 2.05 , w : 4.3 , h : 0.4 ,
fontSize : 12 , fontFace : 'Malgun Gothic' , color : C . white , bold : true , align : 'center' ,
} ) ;
const comparisons = [
{ old : '직원 관리 초점' , sam : 'CEO 의사결정 초점' , highlight : true } ,
{ old : '복잡한 테이블/리포트' , sam : '신호등 시스템 (직관적)' } ,
{ old : '데스크톱 전용' , sam : '모바일 퍼스트' } ,
{ old : '수동 데이터 입력' , sam : 'AI 자동 입력' } ,
{ old : '일괄 리포트 (월/주)' , sam : '실시간 푸시 알림' } ,
{ old : '3,000만원+ 초기 비용' , sam : '월 50만원 구독' } ,
] ;
// 헤더 행
slide . addShape ( pres . ShapeType . rect , { x : 5.4 , y : 2.45 , w : 3.9 , h : 0.28 , fill : { color : '15293D' } } ) ;
slide . addText ( '기존 ERP' , { x : 5.4 , y : 2.45 , w : 1.95 , h : 0.28 , fontSize : 8 , fontFace : 'Malgun Gothic' , color : C . red , bold : true , align : 'center' , valign : 'middle' } ) ;
slide . addText ( 'SAM' , { x : 7.35 , y : 2.45 , w : 1.95 , h : 0.28 , fontSize : 8 , fontFace : 'Malgun Gothic' , color : C . accent , bold : true , align : 'center' , valign : 'middle' } ) ;
comparisons . forEach ( ( c , i ) => {
const y = 2.78 + i * 0.32 ;
const bg = i % 2 === 0 ? '1B3048' : C . cardBg ;
slide . addShape ( pres . ShapeType . rect , { x : 5.4 , y , w : 3.9 , h : 0.3 , fill : { color : bg } } ) ;
slide . addText ( c . old , { x : 5.4 , y , w : 1.95 , h : 0.3 , fontSize : 7.5 , fontFace : 'Malgun Gothic' , color : C . lightGray , align : 'center' , valign : 'middle' } ) ;
slide . addText ( c . sam , { x : 7.35 , y , w : 1.95 , h : 0.3 , fontSize : 7.5 , fontFace : 'Malgun Gothic' , color : c . highlight ? C . accent : C . white , align : 'center' , valign : 'middle' , bold : ! ! c . highlight } ) ;
} ) ;
addFooter ( slide , pres , '3 / 10' ) ;
// ═══════════════════════════════════════════════════════
// SLIDE 4: 10초 만에 회사 전체가 보입니다
// ═══════════════════════════════════════════════════════
slide = pres . addSlide ( ) ;
slide . addShape ( pres . ShapeType . rect , { x : 0 , y : 0 , w : 10 , h : 5.625 , fill : { color : C . dark } } ) ;
slide . addShape ( pres . ShapeType . rect , { x : 0 , y : 0 , w : 0.08 , h : 5.625 , fill : { color : C . gold } } ) ;
slide . addText ( '04' , { x : 0.5 , y : 0.3 , w : 0.7 , h : 0.5 , fontSize : 24 , fontFace : 'Arial' , color : C . gold , bold : true } ) ;
slide . addText ( '10초 만에, 회사 전체가 보입니다' , { x : 1.1 , y : 0.3 , w : 7 , h : 0.5 , fontSize : 20 , fontFace : 'Malgun Gothic' , color : C . white , bold : true } ) ;
// 6대 핵심 모듈 카드
const modules = [
{ icon : '📊' , name : '영업/CRM' , desc : '현장설명회 → 견적 → 수주\n자동 파이프라인 관리' , color : C . accent } ,
{ icon : '🏭' , name : '생산/MES' , desc : '작업지시 → 생산실적 → 품질검사\n실시간 진행률 추적' , color : C . lightBlue } ,
{ icon : '💰' , name : '재무/회계' , desc : '카드/통장 자동 연동\n매출채권/매입채무 실시간' , color : C . gold } ,
{ icon : '👥' , name : '인사/근태' , desc : '출퇴근 자동 기록\n급여/복리후생 통합 관리' , color : C . green } ,
{ icon : '📦' , name : '재고/자재' , desc : '실시간 재고 조회\nBOM 자동 전개' , color : C . purple } ,
{ icon : '📋' , name : '전자결재' , desc : '모바일 결재 승인\n문서 양식 커스터마이징' , color : C . orange } ,
] ;
modules . forEach ( ( m , i ) => {
const col = i % 3 ;
const row = Math . floor ( i / 3 ) ;
const x = 0.5 + col * 3.1 ;
const y = 1.0 + row * 2.0 ;
slide . addShape ( pres . ShapeType . roundRect , { x , y , w : 2.8 , h : 1.7 , rectRadius : 0.1 , fill : { color : C . cardBg } , line : { color : m . color , width : 0.8 } } ) ;
// 상단 컬러 바
slide . addShape ( pres . ShapeType . rect , { x : x + 0.01 , y : y + 0.01 , w : 2.78 , h : 0.06 , fill : { color : m . color } } ) ;
slide . addText ( m . icon , { x , y : y + 0.15 , w : 2.8 , h : 0.4 , fontSize : 22 , align : 'center' } ) ;
slide . addText ( m . name , { x , y : y + 0.55 , w : 2.8 , h : 0.3 , fontSize : 13 , fontFace : 'Malgun Gothic' , color : m . color , bold : true , align : 'center' } ) ;
slide . addText ( m . desc , { x : x + 0.15 , y : y + 0.9 , w : 2.5 , h : 0.65 , fontSize : 8 , fontFace : 'Malgun Gothic' , color : C . lightGray , align : 'center' , lineSpacingMultiple : 1.4 } ) ;
} ) ;
// 하단 강조
slide . addShape ( pres . ShapeType . roundRect , { x : 1.5 , y : 5.0 , w : 7 , h : 0.35 , rectRadius : 0.05 , fill : { color : '142030' } , line : { color : C . gold , width : 0.5 } } ) ;
slide . addText ( '하나의 시스템에서 영업 → 생산 → 재무 → 인사까지 자동 연계' , {
x : 1.5 , y : 5.0 , w : 7 , h : 0.35 , fontSize : 10 , fontFace : 'Malgun Gothic' , color : C . gold , align : 'center' , valign : 'middle' , bold : true ,
} ) ;
addFooter ( slide , pres , '4 / 10' ) ;
// ═══════════════════════════════════════════════════════
// SLIDE 5: 제조업에 특화된 자동 견적 엔진
// ═══════════════════════════════════════════════════════
slide = pres . addSlide ( ) ;
slide . addShape ( pres . ShapeType . rect , { x : 0 , y : 0 , w : 10 , h : 5.625 , fill : { color : C . dark } } ) ;
slide . addShape ( pres . ShapeType . rect , { x : 0 , y : 0 , w : 0.08 , h : 5.625 , fill : { color : C . purple } } ) ;
slide . addText ( '05' , { x : 0.5 , y : 0.3 , w : 0.7 , h : 0.5 , fontSize : 24 , fontFace : 'Arial' , color : C . purple , bold : true } ) ;
slide . addText ( '견적서 30분? SAM은 2분이면 끝납니다' , { x : 1.1 , y : 0.3 , w : 7 , h : 0.5 , fontSize : 20 , fontFace : 'Malgun Gothic' , color : C . white , bold : true } ) ;
// 프로세스 플로우
const flowSteps = [
{ label : '개구부 크기\n입력' , sub : 'W × H 입력' } ,
{ label : 'BOM\n자동 전개' , sub : '완제품→부품→원자재' } ,
{ label : '고객별\n단가 적용' , sub : '시계열 단가 자동' } ,
{ label : '견적서\n자동 생성' , sub : 'PDF/PPT 출력' } ,
] ;
flowSteps . forEach ( ( s , i ) => {
const x = 0.6 + i * 2.35 ;
slide . addShape ( pres . ShapeType . roundRect , { x , y : 1.0 , w : 1.9 , h : 1.1 , rectRadius : 0.1 , fill : { color : C . cardBg } , line : { color : C . purple , width : 0.8 } } ) ;
// 번호 원
slide . addShape ( pres . ShapeType . ellipse , { x : x + 0.7 , y : 1.05 , w : 0.45 , h : 0.45 , fill : { color : C . purple } } ) ;
slide . addText ( ` ${ i + 1 } ` , { x : x + 0.7 , y : 1.05 , w : 0.45 , h : 0.45 , fontSize : 16 , fontFace : 'Arial' , color : C . white , bold : true , align : 'center' , valign : 'middle' } ) ;
slide . addText ( s . label , { x , y : 1.55 , w : 1.9 , h : 0.35 , fontSize : 9 , fontFace : 'Malgun Gothic' , color : C . white , bold : true , align : 'center' , lineSpacingMultiple : 1.2 } ) ;
slide . addText ( s . sub , { x , y : 1.85 , w : 1.9 , h : 0.2 , fontSize : 7 , fontFace : 'Malgun Gothic' , color : C . gray , align : 'center' } ) ;
// 화살표 (마지막 제외)
if ( i < flowSteps . length - 1 ) {
slide . addText ( '→' , { x : x + 1.95 , y : 1.3 , w : 0.35 , h : 0.4 , fontSize : 20 , fontFace : 'Arial' , color : C . purple , align : 'center' , valign : 'middle' } ) ;
}
} ) ;
// Before/After 비교
slide . addShape ( pres . ShapeType . roundRect , { x : 0.6 , y : 2.4 , w : 4.2 , h : 2.5 , rectRadius : 0.1 , fill : { color : '2D1520' } , line : { color : C . red , width : 0.8 } } ) ;
slide . addText ( 'BEFORE (기존 방식)' , { x : 0.6 , y : 2.45 , w : 4.2 , h : 0.35 , fontSize : 11 , fontFace : 'Malgun Gothic' , color : C . red , bold : true , align : 'center' } ) ;
const befores = [
'엑셀 열고 → 품목 찾고 → 수량 계산하고' ,
'단가표 뒤지고 → 수식 확인하고' ,
'양식 맞추고 → PDF 출력하고' ,
'메일 보내고... → 30분+ 소요' ,
] ;
befores . forEach ( ( b , i ) => {
slide . addText ( '✗ ' + b , { x : 0.8 , y : 2.85 + i * 0.38 , w : 3.8 , h : 0.35 , fontSize : 8.5 , fontFace : 'Malgun Gothic' , color : C . lightGray , lineSpacingMultiple : 1.3 } ) ;
} ) ;
slide . addShape ( pres . ShapeType . roundRect , { x : 5.2 , y : 2.4 , w : 4.3 , h : 2.5 , rectRadius : 0.1 , fill : { color : '0D2920' } , line : { color : C . green , width : 0.8 } } ) ;
slide . addText ( 'AFTER (SAM)' , { x : 5.2 , y : 2.45 , w : 4.3 , h : 0.35 , fontSize : 11 , fontFace : 'Malgun Gothic' , color : C . green , bold : true , align : 'center' } ) ;
const afters = [
{ text : '개구부 크기만 입력' , bold : true } ,
{ text : 'BOM 자동 전개 + 단가 자동 적용' , bold : false } ,
{ text : '견적서 PDF/PPT 자동 생성' , bold : false } ,
{ text : '2분 완료 → 93% 시간 절약' , bold : true } ,
] ;
afters . forEach ( ( a , i ) => {
slide . addText ( '✓ ' + a . text , {
x : 5.4 , y : 2.85 + i * 0.38 , w : 3.9 , h : 0.35 ,
fontSize : 8.5 , fontFace : 'Malgun Gothic' , color : a . bold ? C . green : C . lightGray , bold : a . bold ,
} ) ;
} ) ;
// 시간 절약 강조
slide . addShape ( pres . ShapeType . roundRect , { x : 5.5 , y : 4.35 , w : 3.7 , h : 0.4 , rectRadius : 0.05 , fill : { color : C . green } } ) ;
slide . addText ( '견적 시간 93% 단축 | 30분 → 2분' , { x : 5.5 , y : 4.35 , w : 3.7 , h : 0.4 , fontSize : 10 , fontFace : 'Malgun Gothic' , color : C . dark , bold : true , align : 'center' , valign : 'middle' } ) ;
addFooter ( slide , pres , '5 / 10' ) ;
// ═══════════════════════════════════════════════════════
// SLIDE 6: AI가 24시간 일합니다
// ═══════════════════════════════════════════════════════
slide = pres . addSlide ( ) ;
slide . addShape ( pres . ShapeType . rect , { x : 0 , y : 0 , w : 10 , h : 5.625 , fill : { color : C . dark } } ) ;
slide . addShape ( pres . ShapeType . rect , { x : 0 , y : 0 , w : 0.08 , h : 5.625 , fill : { color : C . lightBlue } } ) ;
slide . addText ( '06' , { x : 0.5 , y : 0.3 , w : 0.7 , h : 0.5 , fontSize : 24 , fontFace : 'Arial' , color : C . lightBlue , bold : true } ) ;
slide . addText ( 'AI가 24시간 대표님 곁에서 일합니다' , { x : 1.1 , y : 0.3 , w : 7 , h : 0.5 , fontSize : 20 , fontFace : 'Malgun Gothic' , color : C . white , bold : true } ) ;
// 비용 비교 대형 배너
slide . addShape ( pres . ShapeType . roundRect , { x : 0.5 , y : 1.0 , w : 9 , h : 1.0 , rectRadius : 0.1 , fill : { color : C . cardBg } } ) ;
slide . addText ( [
{ text : '경리 1명 채용 ' , options : { fontSize : 13 , color : C . lightGray , fontFace : 'Malgun Gothic' } } ,
{ text : '연 3,600만원' , options : { fontSize : 15 , color : C . red , bold : true , fontFace : 'Malgun Gothic' } } ,
{ text : ' vs ' , options : { fontSize : 13 , color : C . gray , fontFace : 'Malgun Gothic' } } ,
{ text : 'SAM AI 비서 ' , options : { fontSize : 13 , color : C . lightGray , fontFace : 'Malgun Gothic' } } ,
2026-02-14 21:21:27 +09:00
{ text : '월 50만원' , options : { fontSize : 15 , color : C . accent , bold : true , fontFace : 'Malgun Gothic' } } ,
{ text : ' (1/6 비용)' , options : { fontSize : 11 , color : C . gold , fontFace : 'Malgun Gothic' } } ,
2026-02-14 21:06:19 +09:00
] , { x : 0.5 , y : 1.0 , w : 9 , h : 1.0 , align : 'center' , valign : 'middle' } ) ;
// AI 기능 카드 3개
const aiFeatures = [
{
icon : '🎙️' , title : '음성 → 텍스트' , color : C . lightBlue ,
items : [ '회의 내용 자동 요약' , '현장 음성 메모 → 업무일지' , '월 520분(8.6시간) 처리' ] ,
} ,
{
icon : '📄' , title : '문서 자동 분석' , color : C . purple ,
items : [ '계약서/견적서 자동 분류' , '핵심 내용 추출 & 요약' , '월 300~400페이지 처리' ] ,
} ,
{
icon : '🔔' , title : '실시간 알림' , color : C . orange ,
items : [ '미수금 경고 자동 발송' , '세금 마감 D-Day 알림' , '이상 징후 즉시 Push' ] ,
} ,
] ;
aiFeatures . forEach ( ( f , i ) => {
const x = 0.5 + i * 3.15 ;
slide . addShape ( pres . ShapeType . roundRect , { x , y : 2.3 , w : 2.85 , h : 2.6 , rectRadius : 0.1 , fill : { color : C . cardBg } , line : { color : f . color , width : 0.8 } } ) ;
slide . addShape ( pres . ShapeType . rect , { x : x + 0.01 , y : 2.31 , w : 2.83 , h : 0.06 , fill : { color : f . color } } ) ;
slide . addText ( f . icon , { x , y : 2.45 , w : 2.85 , h : 0.45 , fontSize : 24 , align : 'center' } ) ;
slide . addText ( f . title , { x , y : 2.9 , w : 2.85 , h : 0.35 , fontSize : 12 , fontFace : 'Malgun Gothic' , color : f . color , bold : true , align : 'center' } ) ;
f . items . forEach ( ( item , j ) => {
slide . addText ( '✓ ' + item , { x : x + 0.2 , y : 3.35 + j * 0.35 , w : 2.5 , h : 0.3 , fontSize : 8.5 , fontFace : 'Malgun Gothic' , color : C . lightGray } ) ;
} ) ;
} ) ;
addFooter ( slide , pres , '6 / 10' ) ;
// ═══════════════════════════════════════════════════════
// SLIDE 7: 직원이 퇴사해도 데이터는 남습니다
// ═══════════════════════════════════════════════════════
slide = pres . addSlide ( ) ;
slide . addShape ( pres . ShapeType . rect , { x : 0 , y : 0 , w : 10 , h : 5.625 , fill : { color : C . dark } } ) ;
slide . addShape ( pres . ShapeType . rect , { x : 0 , y : 0 , w : 0.08 , h : 5.625 , fill : { color : C . greenDark } } ) ;
slide . addText ( '07' , { x : 0.5 , y : 0.3 , w : 0.7 , h : 0.5 , fontSize : 24 , fontFace : 'Arial' , color : C . green , bold : true } ) ;
slide . addText ( '직원이 퇴사해도, 데이터는 남습니다' , { x : 1.1 , y : 0.3 , w : 7 , h : 0.5 , fontSize : 20 , fontFace : 'Malgun Gothic' , color : C . white , bold : true } ) ;
// 좌측: 기존 문제
slide . addShape ( pres . ShapeType . roundRect , { x : 0.5 , y : 1.0 , w : 4.3 , h : 3.8 , rectRadius : 0.1 , fill : { color : '2D1520' } } ) ;
slide . addText ( '😰 기존: 퇴사 = 업무 공백' , { x : 0.5 , y : 1.05 , w : 4.3 , h : 0.4 , fontSize : 12 , fontFace : 'Malgun Gothic' , color : C . red , bold : true , align : 'center' } ) ;
const oldProblems = [
'핵심 담당자가 갑자기 퇴사' ,
'인수인계 없이 업무 공백 발생' ,
'거래처 연락처, 단가 정보 소실' ,
'진행 중인 프로젝트 히스토리 유실' ,
'USB/개인 폴더에 있던 자료 삭제' ,
'신입 교육 기간 3~6개월 소요' ,
] ;
oldProblems . forEach ( ( p , i ) => {
slide . addText ( '✗ ' + p , {
x : 0.7 , y : 1.55 + i * 0.45 , w : 3.9 , h : 0.4 ,
fontSize : 9.5 , fontFace : 'Malgun Gothic' , color : C . lightGray ,
} ) ;
} ) ;
// 아래 금액
slide . addShape ( pres . ShapeType . roundRect , { x : 0.8 , y : 4.25 , w : 3.7 , h : 0.4 , rectRadius : 0.05 , fill : { color : C . red } } ) ;
slide . addText ( '평균 손실 비용: 연 2,000만원+' , { x : 0.8 , y : 4.25 , w : 3.7 , h : 0.4 , fontSize : 10 , fontFace : 'Malgun Gothic' , color : C . white , bold : true , align : 'center' , valign : 'middle' } ) ;
// 우측: SAM 해결
slide . addShape ( pres . ShapeType . roundRect , { x : 5.2 , y : 1.0 , w : 4.3 , h : 3.8 , rectRadius : 0.1 , fill : { color : '0D2920' } } ) ;
slide . addText ( '✅ SAM: 자동 인수인계 시스템' , { x : 5.2 , y : 1.05 , w : 4.3 , h : 0.4 , fontSize : 12 , fontFace : 'Malgun Gothic' , color : C . green , bold : true , align : 'center' } ) ;
const samSolutions = [
{ text : '모든 업무 기록 중앙 저장' , bold : false } ,
{ text : '감사 로그로 누가/언제/무엇 추적' , bold : false } ,
{ text : '거래처/단가/히스토리 시스템 보관' , bold : true } ,
{ text : '권한 체계로 데이터 유출 방지' , bold : false } ,
{ text : 'Before/After 스냅샷 완전 보관' , bold : false } ,
{ text : '신입 교육 1주일이면 충분' , bold : true } ,
] ;
samSolutions . forEach ( ( s , i ) => {
slide . addText ( '✓ ' + s . text , {
x : 5.4 , y : 1.55 + i * 0.45 , w : 3.9 , h : 0.4 ,
fontSize : 9.5 , fontFace : 'Malgun Gothic' , color : s . bold ? C . green : C . lightGray , bold : s . bold ,
} ) ;
} ) ;
slide . addShape ( pres . ShapeType . roundRect , { x : 5.5 , y : 4.25 , w : 3.7 , h : 0.4 , rectRadius : 0.05 , fill : { color : C . green } } ) ;
slide . addText ( '업무 연속성 100% 보장' , { x : 5.5 , y : 4.25 , w : 3.7 , h : 0.4 , fontSize : 10 , fontFace : 'Malgun Gothic' , color : C . dark , bold : true , align : 'center' , valign : 'middle' } ) ;
addFooter ( slide , pres , '7 / 10' ) ;
// ═══════════════════════════════════════════════════════
// SLIDE 8: 비용 비교 — 투자 대비 효과
// ═══════════════════════════════════════════════════════
slide = pres . addSlide ( ) ;
slide . addShape ( pres . ShapeType . rect , { x : 0 , y : 0 , w : 10 , h : 5.625 , fill : { color : C . dark } } ) ;
slide . addShape ( pres . ShapeType . rect , { x : 0 , y : 0 , w : 0.08 , h : 5.625 , fill : { color : C . gold } } ) ;
slide . addText ( '08' , { x : 0.5 , y : 0.3 , w : 0.7 , h : 0.5 , fontSize : 24 , fontFace : 'Arial' , color : C . gold , bold : true } ) ;
slide . addText ( '투자 대비 효과: 숫자로 증명합니다' , { x : 1.1 , y : 0.3 , w : 7 , h : 0.5 , fontSize : 20 , fontFace : 'Malgun Gothic' , color : C . white , bold : true } ) ;
// 비용 비교 테이블
slide . addShape ( pres . ShapeType . roundRect , { x : 0.5 , y : 1.0 , w : 5.5 , h : 3.8 , rectRadius : 0.1 , fill : { color : C . cardBg } } ) ;
// 테이블 헤더
slide . addShape ( pres . ShapeType . rect , { x : 0.55 , y : 1.05 , w : 5.4 , h : 0.4 , fill : { color : '15293D' } } ) ;
slide . addText ( '항목' , { x : 0.55 , y : 1.05 , w : 2.0 , h : 0.4 , fontSize : 9 , fontFace : 'Malgun Gothic' , color : C . gray , align : 'center' , valign : 'middle' , bold : true } ) ;
slide . addText ( '기존 방식' , { x : 2.55 , y : 1.05 , w : 1.7 , h : 0.4 , fontSize : 9 , fontFace : 'Malgun Gothic' , color : C . red , align : 'center' , valign : 'middle' , bold : true } ) ;
slide . addText ( 'SAM' , { x : 4.25 , y : 1.05 , w : 1.7 , h : 0.4 , fontSize : 9 , fontFace : 'Malgun Gothic' , color : C . accent , align : 'center' , valign : 'middle' , bold : true } ) ;
const costItems = [
{ item : 'ERP 도입 초기 비용' , old : '3,000만원+' , sam : '2,000만원' , highlight : false } ,
{ item : '월 유지보수 비용' , old : '100~200만원' , sam : '50만원' , highlight : false } ,
{ item : '커스터마이징 비용' , old : '500~1,000만원' , sam : '0원 (자체 설정)' , highlight : true } ,
{ item : '직원 교육 기간' , old : '3~6개월' , sam : '1주일' , highlight : true } ,
{ item : '보고서 작성 시간' , old : '주 5시간+' , sam : '0분 (자동)' , highlight : true } ,
{ item : '견적서 작성 시간' , old : '건당 30분' , sam : '건당 2분' , highlight : false } ,
{ item : '데이터 추적성' , old : '없음' , sam : '완전 감사 로그' , highlight : false } ,
{ item : '모바일 지원' , old : '불가' , sam : '완전 지원' , highlight : false } ,
] ;
costItems . forEach ( ( c , i ) => {
const y = 1.5 + i * 0.38 ;
const bg = i % 2 === 0 ? '1B3048' : C . cardBg ;
slide . addShape ( pres . ShapeType . rect , { x : 0.55 , y , w : 5.4 , h : 0.35 , fill : { color : bg } } ) ;
slide . addText ( c . item , { x : 0.55 , y , w : 2.0 , h : 0.35 , fontSize : 8.5 , fontFace : 'Malgun Gothic' , color : C . lightGray , align : 'center' , valign : 'middle' } ) ;
slide . addText ( c . old , { x : 2.55 , y , w : 1.7 , h : 0.35 , fontSize : 8.5 , fontFace : 'Malgun Gothic' , color : C . red , align : 'center' , valign : 'middle' } ) ;
slide . addText ( c . sam , { x : 4.25 , y , w : 1.7 , h : 0.35 , fontSize : 8.5 , fontFace : 'Malgun Gothic' , color : c . highlight ? C . accent : C . green , align : 'center' , valign : 'middle' , bold : c . highlight } ) ;
} ) ;
// 우측: ROI 카드
slide . addShape ( pres . ShapeType . roundRect , { x : 6.3 , y : 1.0 , w : 3.3 , h : 3.8 , rectRadius : 0.1 , fill : { color : C . cardBg } , line : { color : C . gold , width : 1 } } ) ;
slide . addText ( '💰' , { x : 6.3 , y : 1.15 , w : 3.3 , h : 0.5 , fontSize : 28 , align : 'center' } ) ;
slide . addText ( '연간 절감 효과' , { x : 6.3 , y : 1.65 , w : 3.3 , h : 0.35 , fontSize : 13 , fontFace : 'Malgun Gothic' , color : C . gold , bold : true , align : 'center' } ) ;
const savings = [
{ label : '보고서 자동화' , amount : '1,200만원/년' } ,
{ label : '견적 시간 절약' , amount : '480만원/년' } ,
{ label : '인수인계 비용 절감' , amount : '500만원/년' } ,
{ label : '데이터 오류 방지' , amount : '300만원/년' } ,
] ;
savings . forEach ( ( s , i ) => {
slide . addText ( s . label , { x : 6.5 , y : 2.2 + i * 0.45 , w : 1.8 , h : 0.35 , fontSize : 9 , fontFace : 'Malgun Gothic' , color : C . lightGray } ) ;
slide . addText ( s . amount , { x : 8.0 , y : 2.2 + i * 0.45 , w : 1.4 , h : 0.35 , fontSize : 9 , fontFace : 'Arial' , color : C . green , bold : true , align : 'right' } ) ;
} ) ;
// 합계
slide . addShape ( pres . ShapeType . rect , { x : 6.5 , y : 4.05 , w : 2.9 , h : 0.01 , fill : { color : C . gold } } ) ;
slide . addText ( '합계' , { x : 6.5 , y : 4.1 , w : 1.2 , h : 0.4 , fontSize : 11 , fontFace : 'Malgun Gothic' , color : C . white , bold : true } ) ;
slide . addText ( '2,480만원/년' , { x : 7.5 , y : 4.1 , w : 1.9 , h : 0.4 , fontSize : 16 , fontFace : 'Arial' , color : C . gold , bold : true , align : 'right' } ) ;
// ROI 배지
slide . addShape ( pres . ShapeType . roundRect , { x : 6.6 , y : 4.5 , w : 2.7 , h : 0.3 , rectRadius : 0.05 , fill : { color : C . gold } } ) ;
slide . addText ( '투자 회수 기간: 약 10개월' , { x : 6.6 , y : 4.5 , w : 2.7 , h : 0.3 , fontSize : 9 , fontFace : 'Malgun Gothic' , color : C . dark , bold : true , align : 'center' , valign : 'middle' } ) ;
addFooter ( slide , pres , '8 / 10' ) ;
// ═══════════════════════════════════════════════════════
// SLIDE 9: 고객 신뢰 — 이미 검증된 시스템
// ═══════════════════════════════════════════════════════
slide = pres . addSlide ( ) ;
slide . addShape ( pres . ShapeType . rect , { x : 0 , y : 0 , w : 10 , h : 5.625 , fill : { color : C . dark } } ) ;
slide . addShape ( pres . ShapeType . rect , { x : 0 , y : 0 , w : 0.08 , h : 5.625 , fill : { color : C . accent } } ) ;
slide . addText ( '09' , { x : 0.5 , y : 0.3 , w : 0.7 , h : 0.5 , fontSize : 24 , fontFace : 'Arial' , color : C . accent , bold : true } ) ;
slide . addText ( '왜 SAM이어야 하는가?' , { x : 1.1 , y : 0.3 , w : 5 , h : 0.5 , fontSize : 20 , fontFace : 'Malgun Gothic' , color : C . white , bold : true } ) ;
// 5대 차별점
const reasons = [
{ num : '01' , title : '제조업 전문가가 만든 시스템' , desc : '20년 제조현장 경험이 녹아든 업무 프로세스.\n타사 범용 ERP와는 차원이 다릅니다.' , color : C . accent } ,
{ num : '02' , title : 'Multi-tenant SaaS 아키텍처' , desc : '하나의 시스템으로 여러 사업장 통합 관리.\n사업 확장 시 추가 비용 최소화.' , color : C . lightBlue } ,
{ num : '03' , title : '바로빌/카카오톡 자동 연동' , desc : '전자세금계산서 자동 발행, 카카오톡 알림.\n수작업 제로, 실수 제로.' , color : C . gold } ,
{ num : '04' , title : '3단계 보안 & 감사 시스템' , desc : '역할별 권한 제어 + 전체 작업 감사 로그.\n13개월간 모든 변경 이력 완전 보관.' , color : C . purple } ,
{ num : '05' , title : '지속적 업데이트 & 지원' , desc : '클라우드 SaaS이므로 항상 최신 버전.\n업데이트 비용 0원, 중단 시간 0분.' , color : C . green } ,
] ;
reasons . forEach ( ( r , i ) => {
const y = 1.0 + i * 0.85 ;
slide . addShape ( pres . ShapeType . roundRect , { x : 0.5 , y , w : 9 , h : 0.72 , rectRadius : 0.08 , fill : { color : C . cardBg } } ) ;
// 좌측 번호
slide . addShape ( pres . ShapeType . roundRect , { x : 0.6 , y : y + 0.12 , w : 0.65 , h : 0.48 , rectRadius : 0.06 , fill : { color : r . color } } ) ;
slide . addText ( r . num , { x : 0.6 , y : y + 0.12 , w : 0.65 , h : 0.48 , fontSize : 14 , fontFace : 'Arial' , color : C . dark , bold : true , align : 'center' , valign : 'middle' } ) ;
// 제목 + 설명
slide . addText ( r . title , { x : 1.45 , y : y + 0.06 , w : 3.5 , h : 0.3 , fontSize : 12 , fontFace : 'Malgun Gothic' , color : r . color , bold : true } ) ;
slide . addText ( r . desc , { x : 1.45 , y : y + 0.32 , w : 7.8 , h : 0.35 , fontSize : 8 , fontFace : 'Malgun Gothic' , color : C . lightGray , lineSpacingMultiple : 1.3 } ) ;
} ) ;
addFooter ( slide , pres , '9 / 10' ) ;
// ═══════════════════════════════════════════════════════
// SLIDE 10: CTA — 지금 바로 시작하세요
// ═══════════════════════════════════════════════════════
slide = pres . addSlide ( ) ;
slide . addShape ( pres . ShapeType . rect , { x : 0 , y : 0 , w : 10 , h : 5.625 , fill : { color : C . dark } } ) ;
// 중앙 대형 텍스트
slide . addText ( 'SAM' , {
x : 0 , y : 0.6 , w : 10 , h : 1.0 ,
fontSize : 60 , fontFace : 'Arial' , color : C . accent , bold : true , align : 'center' ,
} ) ;
slide . addText ( '대표님의 경영을 바꿀 시간입니다.' , {
x : 0 , y : 1.5 , w : 10 , h : 0.5 ,
fontSize : 20 , fontFace : 'Malgun Gothic' , color : C . white , bold : true , align : 'center' ,
} ) ;
// 3단계 CTA
const ctaSteps = [
{ step : 'STEP 1' , title : '무료 경영 진단' , desc : '귀사 맞춤 대시보드\n미리보기 제공' , icon : '🔍' , color : C . accent } ,
{ step : 'STEP 2' , title : '맞춤 데모 시연' , desc : '실제 업무 데이터로\n시연해 드립니다' , icon : '💻' , color : C . lightBlue } ,
{ step : 'STEP 3' , title : '3일 무료 체험' , desc : '결제 없이 먼저\n사용해 보세요' , icon : '🚀' , color : C . gold } ,
] ;
ctaSteps . forEach ( ( c , i ) => {
const x = 0.8 + i * 3.1 ;
slide . addShape ( pres . ShapeType . roundRect , { x , y : 2.3 , w : 2.7 , h : 2.0 , rectRadius : 0.12 , fill : { color : C . cardBg } , line : { color : c . color , width : 1 } } ) ;
slide . addShape ( pres . ShapeType . roundRect , { x : x + 0.8 , y : 2.15 , w : 1.1 , h : 0.35 , rectRadius : 0.05 , fill : { color : c . color } } ) ;
slide . addText ( c . step , { x : x + 0.8 , y : 2.15 , w : 1.1 , h : 0.35 , fontSize : 9 , fontFace : 'Arial' , color : C . dark , bold : true , align : 'center' , valign : 'middle' } ) ;
slide . addText ( c . icon , { x , y : 2.55 , w : 2.7 , h : 0.45 , fontSize : 26 , align : 'center' } ) ;
slide . addText ( c . title , { x , y : 3.0 , w : 2.7 , h : 0.35 , fontSize : 13 , fontFace : 'Malgun Gothic' , color : c . color , bold : true , align : 'center' } ) ;
slide . addText ( c . desc , { x , y : 3.4 , w : 2.7 , h : 0.6 , fontSize : 9 , fontFace : 'Malgun Gothic' , color : C . lightGray , align : 'center' , lineSpacingMultiple : 1.4 } ) ;
// 화살표 (마지막 제외)
if ( i < ctaSteps . length - 1 ) {
slide . addText ( '→' , { x : x + 2.75 , y : 2.9 , w : 0.3 , h : 0.5 , fontSize : 20 , fontFace : 'Arial' , color : C . gray , align : 'center' , valign : 'middle' } ) ;
}
} ) ;
// 하단 CTA 버튼 스타일
slide . addShape ( pres . ShapeType . roundRect , { x : 2.5 , y : 4.55 , w : 5 , h : 0.55 , rectRadius : 0.08 , fill : { color : C . accent } } ) ;
slide . addText ( '지금 무료 경영 진단 신청하기' , {
x : 2.5 , y : 4.55 , w : 5 , h : 0.55 ,
fontSize : 15 , fontFace : 'Malgun Gothic' , color : C . dark , bold : true , align : 'center' , valign : 'middle' ,
} ) ;
// 하단 연락처
slide . addText ( 'SAM | Smart Automation Management | Confidential' , {
x : 0 , y : 5.2 , w : 10 , h : 0.3 ,
fontSize : 8 , fontFace : 'Arial' , color : C . gray , align : 'center' ,
} ) ;
// ═══════════════════════════════════════════════════════
// 저장
// ═══════════════════════════════════════════════════════
const outputPath = path . join ( _ _dirname , 'sam-marketing-deck.pptx' ) ;
await pres . writeFile ( { fileName : outputPath } ) ;
console . log ( ` ✅ PPTX 생성 완료: ${ outputPath } ` ) ;
}
// ═══════════════════════════════════════════════════════
// 공통 함수: 하단 푸터
// ═══════════════════════════════════════════════════════
function addFooter ( slide , pres , pageNum ) {
slide . addShape ( pres . ShapeType . rect , { x : 0.5 , y : 5.25 , w : 9 , h : 0.005 , fill : { color : '2A3F5F' } } ) ;
slide . addText ( 'SAM | 중소기업을 위한 경영 무기' , { x : 0.5 , y : 5.28 , w : 4 , h : 0.25 , fontSize : 7 , fontFace : 'Malgun Gothic' , color : '5A6A7A' } ) ;
slide . addText ( pageNum , { x : 8.5 , y : 5.28 , w : 1 , h : 0.25 , fontSize : 7 , fontFace : 'Arial' , color : '5A6A7A' , align : 'right' } ) ;
}
main ( ) . catch ( err => { console . error ( '오류:' , err ) ; process . exit ( 1 ) ; } ) ;