Files
sam-sales/pptx-output/convert.cjs
2026-02-14 21:21:27 +09:00

625 lines
40 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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