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' } }, { 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' } }, ], { 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); });