Files
sam-sales/pptx-output/convert.cjs

625 lines
40 KiB
JavaScript
Raw Normal View History

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); });