Files
sam-docs/guides/generate-pricing-guide.cjs
김보곤 21e7559c91 docs: [sales] 이카운트 연동 모듈 제거 — 바로빌은 기본 포함
- 개별 모듈 가격표에서 '이카운트 연동' 행 제거 (별도 상품 아님)
- 영업 전략 '이카운트 연동 추천' → '바로빌 부가 서비스 안내'로 변경
- 데모 테넌트 정책 '바로빌/이카운트' → '바로빌 등 외부 연동'으로 통일
- 브로셔/슬라이드 HTML 반영
- PPTX 재생성
2026-03-16 18:07:36 +09:00

728 lines
48 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');
async function main() {
const pres = new PptxGenJS();
pres.defineLayout({ name: 'CUSTOM_16x9', width: 10, height: 5.625 });
pres.layout = 'CUSTOM_16x9';
// ─── 브랜드 컬러 ───
const C = {
dark: '0D1B2A',
navy: '1B2838',
green: '2E7D32',
greenLight: '4CAF50',
greenBg: 'E8F5E9',
greenBorder: 'C8E6C9',
blue: '1565C0',
blueBg: 'E3F2FD',
blueBorder: 'BBDEFB',
orange: 'E65100',
orangeBg: 'FFF3E0',
orangeBorder: 'FFE0B2',
red: 'C62828',
redBg: 'FFEBEE',
white: 'FFFFFF',
gray50: 'FAFAFA',
gray100: 'F5F5F5',
gray200: 'EEEEEE',
gray400: 'BDBDBD',
gray600: '757575',
gray800: '424242',
text: '212121',
textSub: '616161',
};
// ─── 공통 함수 ───
function addFooter(slide) {
slide.addShape(pres.ShapeType.rect, { x: 0, y: 5.25, w: 10, h: 0.375, fill: { color: C.dark } });
slide.addText('SAM 가격정책 안내서 | (주)코드브릿지엑스', {
x: 0.5, y: 5.25, w: 9, h: 0.375,
fontSize: 7, color: '8899AA', fontFace: 'Arial'
});
}
function addPageTitle(slide, title, subtitle) {
// 왼쪽 액센트 바
slide.addShape(pres.ShapeType.rect, { x: 0.5, y: 0.35, w: 0.06, h: 0.4, fill: { color: C.greenLight } });
slide.addText(title, {
x: 0.72, y: 0.3, w: 7, h: 0.5,
fontSize: 20, bold: true, color: C.text, fontFace: 'Arial'
});
if (subtitle) {
slide.addText(subtitle, {
x: 0.72, y: 0.75, w: 7, h: 0.3,
fontSize: 10, color: C.textSub, fontFace: 'Arial'
});
}
}
function addSlideNumber(slide, num, total) {
slide.addText(`${num} / ${total}`, {
x: 8.5, y: 5.25, w: 1, h: 0.375,
fontSize: 7, color: '8899AA', align: 'right', fontFace: 'Arial'
});
}
const TOTAL = 13;
// ═══════════════════════════════════════════════════════
// 슬라이드 1: 표지
// ═══════════════════════════════════════════════════════
const s1 = pres.addSlide();
s1.background = { fill: C.dark };
// 상단 그린 라인
s1.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.06, fill: { color: C.greenLight } });
// SAM 로고 영역
s1.addShape(pres.ShapeType.roundRect, { x: 0.7, y: 1.2, w: 1.4, h: 0.5, rectRadius: 0.08, fill: { color: C.greenLight } });
s1.addText('SAM', { x: 0.7, y: 1.2, w: 1.4, h: 0.5, fontSize: 22, bold: true, color: C.white, align: 'center', valign: 'middle', fontFace: 'Arial' });
// 메인 타이틀
s1.addText('가격정책 쉬운 안내서', {
x: 0.7, y: 2.0, w: 8.6, h: 0.8,
fontSize: 36, bold: true, color: C.white, fontFace: 'Arial'
});
s1.addText('영업파트너를 위한 SAM 서비스 요금 및 수당 가이드', {
x: 0.7, y: 2.8, w: 8.6, h: 0.5,
fontSize: 14, color: '8899AA', fontFace: 'Arial'
});
// 하단 정보
s1.addShape(pres.ShapeType.rect, { x: 0.7, y: 3.8, w: 8.6, h: 0.01, fill: { color: '2A3A4A' } });
s1.addText('(주)코드브릿지엑스 | Smart Automation Management | 2026', {
x: 0.7, y: 4.0, w: 8.6, h: 0.4,
fontSize: 10, color: '667788', fontFace: 'Arial'
});
// 하단 키워드 뱃지
const badges = ['개발비 + 구독료', '수당 체계', '할인 정책', '시뮬레이터'];
badges.forEach((b, i) => {
const bx = 0.7 + i * 2.2;
s1.addShape(pres.ShapeType.roundRect, { x: bx, y: 4.55, w: 2, h: 0.35, rectRadius: 0.06, fill: { color: '1B2838' }, line: { color: '2A3A4A', width: 0.5 } });
s1.addText(b, { x: bx, y: 4.55, w: 2, h: 0.35, fontSize: 9, color: C.greenLight, align: 'center', valign: 'middle', fontFace: 'Arial' });
});
// ═══════════════════════════════════════════════════════
// 슬라이드 2: 요금 구조 한눈에
// ═══════════════════════════════════════════════════════
const s2 = pres.addSlide();
s2.background = { fill: C.white };
addFooter(s2);
addPageTitle(s2, '요금 구조 한눈에 보기', '고객이 내는 돈은 딱 2가지뿐');
addSlideNumber(s2, 2, TOTAL);
// 개발비 카드
s2.addShape(pres.ShapeType.roundRect, { x: 0.8, y: 1.4, w: 4, h: 3.2, rectRadius: 0.15, fill: { color: C.greenBg }, line: { color: C.greenBorder, width: 1.5 } });
s2.addShape(pres.ShapeType.ellipse, { x: 2.3, y: 1.7, w: 1, h: 1, fill: { color: C.green } });
s2.addText('1', { x: 2.3, y: 1.7, w: 1, h: 1, fontSize: 36, bold: true, color: C.white, align: 'center', valign: 'middle', fontFace: 'Arial' });
s2.addText('개발비', { x: 0.8, y: 2.85, w: 4, h: 0.5, fontSize: 22, bold: true, color: C.green, align: 'center', fontFace: 'Arial' });
s2.addText('처음 한 번만 내는 돈', { x: 0.8, y: 3.3, w: 4, h: 0.35, fontSize: 13, color: C.text, align: 'center', fontFace: 'Arial' });
// 비유 박스
s2.addShape(pres.ShapeType.roundRect, { x: 1.4, y: 3.85, w: 2.8, h: 0.5, rectRadius: 0.08, fill: { color: C.white } });
s2.addText('비유: 집을 짓는 비용', { x: 1.4, y: 3.85, w: 2.8, h: 0.5, fontSize: 11, color: C.green, align: 'center', valign: 'middle', fontFace: 'Arial' });
// 구독료 카드
s2.addShape(pres.ShapeType.roundRect, { x: 5.2, y: 1.4, w: 4, h: 3.2, rectRadius: 0.15, fill: { color: C.blueBg }, line: { color: C.blueBorder, width: 1.5 } });
s2.addShape(pres.ShapeType.ellipse, { x: 6.7, y: 1.7, w: 1, h: 1, fill: { color: C.blue } });
s2.addText('2', { x: 6.7, y: 1.7, w: 1, h: 1, fontSize: 36, bold: true, color: C.white, align: 'center', valign: 'middle', fontFace: 'Arial' });
s2.addText('구독료', { x: 5.2, y: 2.85, w: 4, h: 0.5, fontSize: 22, bold: true, color: C.blue, align: 'center', fontFace: 'Arial' });
s2.addText('매달 내는 돈', { x: 5.2, y: 3.3, w: 4, h: 0.35, fontSize: 13, color: C.text, align: 'center', fontFace: 'Arial' });
s2.addShape(pres.ShapeType.roundRect, { x: 5.8, y: 3.85, w: 2.8, h: 0.5, rectRadius: 0.08, fill: { color: C.white } });
s2.addText('비유: 매달 내는 관리비', { x: 5.8, y: 3.85, w: 2.8, h: 0.5, fontSize: 11, color: C.blue, align: 'center', valign: 'middle', fontFace: 'Arial' });
// VAT 안내
s2.addText('※ 모든 금액은 부가세(VAT) 별도', { x: 0.8, y: 4.8, w: 8.4, h: 0.3, fontSize: 9, color: C.gray600, align: 'center', fontFace: 'Arial' });
// ═══════════════════════════════════════════════════════
// 슬라이드 3: 기본 상품 가격표
// ═══════════════════════════════════════════════════════
const s3 = pres.addSlide();
s3.background = { fill: C.white };
addFooter(s3);
addPageTitle(s3, '기본 상품 가격표');
addSlideNumber(s3, 3, TOTAL);
// 제조업 기본 패키지 - 메인 카드
s3.addShape(pres.ShapeType.roundRect, { x: 0.5, y: 1.2, w: 9, h: 1.5, rectRadius: 0.12, fill: { color: C.green } });
s3.addText([
{ text: '★ ', options: { fontSize: 14, color: 'FFD700' } },
{ text: '제조업 기본 패키지', options: { fontSize: 18, bold: true, color: C.white } },
{ text: ' (가장 많이 팔리는 상품)', options: { fontSize: 11, color: 'B9F6CA' } }
], { x: 0.8, y: 1.25, w: 5.5, h: 0.45, fontFace: 'Arial' });
s3.addText('품목관리 → 견적 → 수주 → 생산 → 출하 + ERP(인사/회계) 무료', {
x: 0.8, y: 1.7, w: 5.5, h: 0.35, fontSize: 10, color: 'C8E6C9', fontFace: 'Arial'
});
// 가격
s3.addShape(pres.ShapeType.roundRect, { x: 6.5, y: 1.35, w: 2.7, h: 1.1, rectRadius: 0.08, fill: { color: '1B5E20' } });
s3.addText([
{ text: '개발비 ', options: { fontSize: 9, color: 'A5D6A7' } },
{ text: '2,000만원', options: { fontSize: 18, bold: true, color: C.white } },
{ text: '\n구독료 ', options: { fontSize: 9, color: 'A5D6A7' } },
{ text: '50만원/월', options: { fontSize: 15, bold: true, color: 'B9F6CA' } }
], { x: 6.5, y: 1.35, w: 2.7, h: 1.1, align: 'center', valign: 'middle', fontFace: 'Arial' });
// 개별 모듈 테이블
s3.addText('개별 모듈 (필요한 것만 추가)', { x: 0.5, y: 2.9, w: 4, h: 0.35, fontSize: 12, bold: true, color: C.text, fontFace: 'Arial' });
const modules = [
['QR코드 관리', '1,020만원', '5만원'],
['사진/출하 관리', '1,920만원', '10만원'],
['검사/토큰 적용', '1,020만원', '5만원'],
];
// 테이블 헤더
s3.addShape(pres.ShapeType.roundRect, { x: 0.5, y: 3.3, w: 9, h: 0.35, rectRadius: 0.06, fill: { color: C.gray200 } });
s3.addText('모듈명', { x: 0.7, y: 3.3, w: 3, h: 0.35, fontSize: 9, bold: true, color: C.gray600, fontFace: 'Arial' });
s3.addText('개발비', { x: 4.5, y: 3.3, w: 2, h: 0.35, fontSize: 9, bold: true, color: C.gray600, align: 'center', fontFace: 'Arial' });
s3.addText('구독료/월', { x: 7, y: 3.3, w: 2, h: 0.35, fontSize: 9, bold: true, color: C.gray600, align: 'center', fontFace: 'Arial' });
modules.forEach((m, i) => {
const ry = 3.7 + i * 0.38;
if (i % 2 === 0) s3.addShape(pres.ShapeType.rect, { x: 0.5, y: ry, w: 9, h: 0.38, fill: { color: C.gray50 } });
s3.addText(m[0], { x: 0.7, y: ry, w: 3, h: 0.38, fontSize: 10, color: C.text, valign: 'middle', fontFace: 'Arial' });
s3.addText(m[1], { x: 4.5, y: ry, w: 2, h: 0.38, fontSize: 10, bold: true, color: C.green, align: 'center', valign: 'middle', fontFace: 'Arial' });
s3.addText(m[2], { x: 7, y: ry, w: 2, h: 0.38, fontSize: 10, color: C.blue, align: 'center', valign: 'middle', fontFace: 'Arial' });
});
// ═══════════════════════════════════════════════════════
// 슬라이드 4: 대형 패키지 + 추가 옵션
// ═══════════════════════════════════════════════════════
const s4 = pres.addSlide();
s4.background = { fill: C.white };
addFooter(s4);
addPageTitle(s4, '대형 패키지 & 추가 옵션');
addSlideNumber(s4, 4, TOTAL);
// 대형 패키지
s4.addText('대형 패키지', { x: 0.5, y: 1.15, w: 4, h: 0.35, fontSize: 12, bold: true, color: C.text, fontFace: 'Arial' });
const bigPkgs = [
['공사관리 패키지', '4,000만원', '20만원/월', '시공 현장 관리'],
['공정/정부지원사업', '8,000만원', '40만원/월', '정부지원 + 전체 공정'],
];
bigPkgs.forEach((p, i) => {
const bx = 0.5 + i * 4.6;
s4.addShape(pres.ShapeType.roundRect, { x: bx, y: 1.55, w: 4.3, h: 1.3, rectRadius: 0.1, fill: { color: C.navy } });
s4.addText(p[0], { x: bx + 0.2, y: 1.6, w: 3.9, h: 0.35, fontSize: 13, bold: true, color: C.white, fontFace: 'Arial' });
s4.addText(p[3], { x: bx + 0.2, y: 1.9, w: 3.9, h: 0.25, fontSize: 9, color: '8899AA', fontFace: 'Arial' });
s4.addText([
{ text: '개발비 ', options: { fontSize: 9, color: '8899AA' } },
{ text: p[1], options: { fontSize: 14, bold: true, color: C.greenLight } },
], { x: bx + 0.2, y: 2.25, w: 2, h: 0.35, fontFace: 'Arial' });
s4.addText([
{ text: '구독료 ', options: { fontSize: 9, color: '8899AA' } },
{ text: p[2], options: { fontSize: 12, bold: true, color: '64B5F6' } },
], { x: bx + 2.2, y: 2.25, w: 2, h: 0.35, fontFace: 'Arial' });
});
// 추가 옵션
s4.addText('추가 옵션 (선택 사항)', { x: 0.5, y: 3.1, w: 4, h: 0.35, fontSize: 12, bold: true, color: C.text, fontFace: 'Arial' });
const options = [
['생산공정 1개 추가', '+500만원', '+10만원'],
['품질관리 (인정검사)', '+2,000만원', '+50만원'],
['사진 등록', '-', '+10만원'],
['챗봇 / 녹음 / 업무일지', '-', '각 +20만원'],
['연구소 연구노트', '-', '+5만원'],
];
s4.addShape(pres.ShapeType.roundRect, { x: 0.5, y: 3.5, w: 9, h: 0.3, rectRadius: 0.05, fill: { color: C.gray200 } });
s4.addText('옵션명', { x: 0.7, y: 3.5, w: 3.5, h: 0.3, fontSize: 8, bold: true, color: C.gray600, fontFace: 'Arial' });
s4.addText('개발비 추가', { x: 4.5, y: 3.5, w: 2, h: 0.3, fontSize: 8, bold: true, color: C.gray600, align: 'center', fontFace: 'Arial' });
s4.addText('구독료 추가/월', { x: 7, y: 3.5, w: 2, h: 0.3, fontSize: 8, bold: true, color: C.gray600, align: 'center', fontFace: 'Arial' });
options.forEach((o, i) => {
const ry = 3.83 + i * 0.3;
if (i % 2 === 0) s4.addShape(pres.ShapeType.rect, { x: 0.5, y: ry, w: 9, h: 0.3, fill: { color: C.gray50 } });
s4.addText(o[0], { x: 0.7, y: ry, w: 3.5, h: 0.3, fontSize: 9, color: C.text, valign: 'middle', fontFace: 'Arial' });
s4.addText(o[1], { x: 4.5, y: ry, w: 2, h: 0.3, fontSize: 9, bold: true, color: o[1] === '-' ? C.gray400 : C.green, align: 'center', valign: 'middle', fontFace: 'Arial' });
s4.addText(o[2], { x: 7, y: ry, w: 2, h: 0.3, fontSize: 9, color: C.blue, align: 'center', valign: 'middle', fontFace: 'Arial' });
});
// ═══════════════════════════════════════════════════════
// 슬라이드 5: 수당 핵심 공식
// ═══════════════════════════════════════════════════════
const s5 = pres.addSlide();
s5.background = { fill: C.white };
addFooter(s5);
addPageTitle(s5, '내 수당은 얼마인가?', '핵심 공식 — 이것만 기억하면 된다');
addSlideNumber(s5, 5, TOTAL);
// 공식 박스
s5.addShape(pres.ShapeType.roundRect, { x: 1, y: 1.3, w: 8, h: 1.2, rectRadius: 0.15, fill: { color: C.dark } });
s5.addText([
{ text: '내 수당', options: { fontSize: 28, bold: true, color: C.greenLight } },
{ text: ' = ', options: { fontSize: 28, color: C.white } },
{ text: '최종 개발비', options: { fontSize: 28, bold: true, color: '64B5F6' } },
{ text: ' × ', options: { fontSize: 28, color: C.white } },
{ text: '수당률', options: { fontSize: 28, bold: true, color: 'FFB74D' } },
], { x: 1, y: 1.35, w: 8, h: 0.7, align: 'center', valign: 'middle', fontFace: 'Arial' });
s5.addText([
{ text: '※ 구독료는 수당 계산에 포함 안 됨! ', options: { fontSize: 10, color: 'FF8A80' } },
{ text: '※ 할인 적용 후 개발비가 기준!', options: { fontSize: 10, color: 'FF8A80' } },
], { x: 1, y: 2.05, w: 8, h: 0.35, align: 'center', fontFace: 'Arial' });
// 개인 vs 단체
// 개인
s5.addShape(pres.ShapeType.roundRect, { x: 0.5, y: 2.85, w: 4.3, h: 2.1, rectRadius: 0.12, fill: { color: C.greenBg }, line: { color: C.greenBorder, width: 1 } });
s5.addText('개인 가입', { x: 0.5, y: 2.85, w: 4.3, h: 0.45, fontSize: 14, bold: true, color: C.green, align: 'center', valign: 'middle', fontFace: 'Arial' });
const personalItems = [
['파트너 수당', '20%', C.green],
['유치 파트너 수당', '5%', C.blue],
];
personalItems.forEach((item, i) => {
const iy = 3.4 + i * 0.45;
s5.addShape(pres.ShapeType.roundRect, { x: 0.8, y: iy, w: 3.7, h: 0.38, rectRadius: 0.06, fill: { color: C.white } });
s5.addText(item[0], { x: 0.95, y: iy, w: 2, h: 0.38, fontSize: 11, color: C.text, valign: 'middle', fontFace: 'Arial' });
s5.addText(item[1], { x: 3, y: iy, w: 1.3, h: 0.38, fontSize: 14, bold: true, color: item[2], align: 'right', valign: 'middle', fontFace: 'Arial' });
});
// 매니저 수당 별도 안내
s5.addShape(pres.ShapeType.roundRect, { x: 0.8, y: 4.3, w: 3.7, h: 0.3, rectRadius: 0.06, fill: { color: 'FFF8E1' } });
s5.addText('+ 매니저: 첫달 구독료 (별도)', { x: 0.95, y: 4.3, w: 3.4, h: 0.3, fontSize: 9, color: 'F57F17', valign: 'middle', fontFace: 'Arial' });
// 단체
s5.addShape(pres.ShapeType.roundRect, { x: 5.2, y: 2.85, w: 4.3, h: 2.1, rectRadius: 0.12, fill: { color: C.orangeBg }, line: { color: C.orangeBorder, width: 1 } });
s5.addText('단체 가입', { x: 5.2, y: 2.85, w: 4.3, h: 0.45, fontSize: 14, bold: true, color: C.orange, align: 'center', valign: 'middle', fontFace: 'Arial' });
const groupItems = [
['단체 수당', '30%', C.orange],
['유치 파트너 수당', '3%', C.blue],
];
groupItems.forEach((item, i) => {
const iy = 3.4 + i * 0.45;
s5.addShape(pres.ShapeType.roundRect, { x: 5.5, y: iy, w: 3.7, h: 0.38, rectRadius: 0.06, fill: { color: C.white } });
s5.addText(item[0], { x: 5.65, y: iy, w: 2, h: 0.38, fontSize: 11, color: C.text, valign: 'middle', fontFace: 'Arial' });
s5.addText(item[1], { x: 7.7, y: iy, w: 1.3, h: 0.38, fontSize: 14, bold: true, color: item[2], align: 'right', valign: 'middle', fontFace: 'Arial' });
});
// 매니저 수당 별도 안내
s5.addShape(pres.ShapeType.roundRect, { x: 5.5, y: 4.3, w: 3.7, h: 0.3, rectRadius: 0.06, fill: { color: 'FFF8E1' } });
s5.addText('+ 매니저: 첫달 구독료 (별도)', { x: 5.65, y: 4.3, w: 3.4, h: 0.3, fontSize: 9, color: 'F57F17', valign: 'middle', fontFace: 'Arial' });
// 합계 뱃지
s5.addShape(pres.ShapeType.roundRect, { x: 1.5, y: 4.75, w: 2, h: 0.35, rectRadius: 0.06, fill: { color: C.green } });
s5.addText('합계 25%', { x: 1.5, y: 4.75, w: 2, h: 0.35, fontSize: 11, bold: true, color: C.white, align: 'center', valign: 'middle', fontFace: 'Arial' });
s5.addShape(pres.ShapeType.roundRect, { x: 6.2, y: 4.75, w: 2, h: 0.35, rectRadius: 0.06, fill: { color: C.orange } });
s5.addText('합계 33%', { x: 6.2, y: 4.75, w: 2, h: 0.35, fontSize: 11, bold: true, color: C.white, align: 'center', valign: 'middle', fontFace: 'Arial' });
// ═══════════════════════════════════════════════════════
// 슬라이드 6: 수당 계산 예시
// ═══════════════════════════════════════════════════════
const s6 = pres.addSlide();
s6.background = { fill: C.white };
addFooter(s6);
addPageTitle(s6, '수당 계산 예시', '제조업 기본 패키지 (개발비 2,000만원) 기준');
addSlideNumber(s6, 6, TOTAL);
// ── 슬라이드 6 레이아웃 계산 ──
// 콘텐츠 영역: y=1.1 ~ 5.15 (푸터 5.25 위 0.1 여백)
// 섹션: 비교표(1.1~2.85) → 팁(2.95~3.3) → 조견표(3.4~5.1)
const S6 = { tblY: 1.1, tblTitleH: 0.28, tblCardY: 1.4, tblCardH: 1.35, rowH: 0.32, tipY: 2.9, tipH: 0.38, refTitleY: 3.4, refHeaderY: 3.65, refDataY: 3.88, refRowH: 0.22 };
// 정가 판매
s6.addText('정가(2,000만원) 판매 시', { x: 0.5, y: S6.tblY, w: 4.3, h: S6.tblTitleH, fontSize: 12, bold: true, color: C.text, fontFace: 'Arial' });
s6.addShape(pres.ShapeType.roundRect, { x: 0.5, y: S6.tblCardY, w: 4.3, h: S6.tblCardH, rectRadius: 0.1, fill: { color: C.gray50 }, line: { color: C.gray200, width: 0.5 } });
const fullPriceData = [
['', '개인 가입', '단체 가입'],
['파트너/단체', '400만원', '600만원'],
['유치 파트너', '100만원', '60만원'],
['합계', '500만원', '660만원'],
];
fullPriceData.forEach((row, i) => {
const ry = S6.tblCardY + 0.05 + i * S6.rowH;
const isHeader = i === 0;
const isTotal = i === 3;
s6.addText(row[0], { x: 0.7, y: ry, w: 1.4, h: S6.rowH, fontSize: isHeader ? 8 : 10, bold: isHeader || isTotal, color: isHeader ? C.gray600 : C.text, valign: 'middle', fontFace: 'Arial' });
s6.addText(row[1], { x: 2.1, y: ry, w: 1.2, h: S6.rowH, fontSize: isHeader ? 8 : 12, bold: !isHeader, color: isHeader ? C.gray600 : C.green, align: 'center', valign: 'middle', fontFace: 'Arial' });
s6.addText(row[2], { x: 3.4, y: ry, w: 1.2, h: S6.rowH, fontSize: isHeader ? 8 : 12, bold: !isHeader, color: isHeader ? C.gray600 : C.orange, align: 'center', valign: 'middle', fontFace: 'Arial' });
});
// 매니저 수당 별도 안내 (정가)
s6.addText('+ 매니저: 첫달 구독료 50만원 (별도)', { x: 0.7, y: S6.tblCardY + 0.05 + 4 * S6.rowH, w: 3.8, h: 0.22, fontSize: 8, color: 'F57F17', fontFace: 'Arial' });
// 10% 할인 판매
s6.addText('10% 할인(1,800만원) 판매 시', { x: 5.2, y: S6.tblY, w: 4.3, h: S6.tblTitleH, fontSize: 12, bold: true, color: C.text, fontFace: 'Arial' });
s6.addShape(pres.ShapeType.roundRect, { x: 5.2, y: S6.tblCardY, w: 4.3, h: S6.tblCardH, rectRadius: 0.1, fill: { color: C.gray50 }, line: { color: C.gray200, width: 0.5 } });
const discountData = [
['', '개인 가입', '단체 가입'],
['파트너/단체', '360만원', '540만원'],
['유치 파트너', '90만원', '54만원'],
['합계', '450만원', '594만원'],
];
discountData.forEach((row, i) => {
const ry = S6.tblCardY + 0.05 + i * S6.rowH;
const isHeader = i === 0;
const isTotal = i === 3;
s6.addText(row[0], { x: 5.4, y: ry, w: 1.4, h: S6.rowH, fontSize: isHeader ? 8 : 10, bold: isHeader || isTotal, color: isHeader ? C.gray600 : C.text, valign: 'middle', fontFace: 'Arial' });
s6.addText(row[1], { x: 6.8, y: ry, w: 1.2, h: S6.rowH, fontSize: isHeader ? 8 : 12, bold: !isHeader, color: isHeader ? C.gray600 : C.green, align: 'center', valign: 'middle', fontFace: 'Arial' });
s6.addText(row[2], { x: 8.1, y: ry, w: 1.2, h: S6.rowH, fontSize: isHeader ? 8 : 12, bold: !isHeader, color: isHeader ? C.gray600 : C.orange, align: 'center', valign: 'middle', fontFace: 'Arial' });
});
// 매니저 수당 별도 안내 (할인)
s6.addText('+ 매니저: 첫달 구독료 50만원 (별도)', { x: 5.4, y: S6.tblCardY + 0.05 + 4 * S6.rowH, w: 3.8, h: 0.22, fontSize: 8, color: 'F57F17', fontFace: 'Arial' });
// 팁
s6.addShape(pres.ShapeType.roundRect, { x: 0.5, y: S6.tipY, w: 9, h: S6.tipH, rectRadius: 0.08, fill: { color: 'FFF8E1' }, line: { color: 'FFE082', width: 0.5 } });
s6.addText('💡 할인하면 내 수당도 줄어든다. 정가에 가깝게 팔수록 수당이 크다!', {
x: 0.7, y: S6.tipY, w: 8.6, h: S6.tipH, fontSize: 10, bold: true, color: 'F57F17', valign: 'middle', fontFace: 'Arial'
});
// 조견표
s6.addText('수당 빠른 조견표', { x: 0.5, y: S6.refTitleY, w: 4, h: 0.25, fontSize: 11, bold: true, color: C.text, fontFace: 'Arial' });
const quickRef = [
['2,000만원', '400만원', '600만원'],
['1,800만원', '360만원', '540만원'],
['1,500만원', '300만원', '450만원'],
['1,000만원', '200만원', '300만원'],
];
// 헤더
s6.addText('최종 개발비', { x: 0.5, y: S6.refHeaderY, w: 2.5, h: S6.refRowH, fontSize: 8, bold: true, color: C.gray600, fontFace: 'Arial' });
s6.addText('개인(20%)', { x: 3.2, y: S6.refHeaderY, w: 1.8, h: S6.refRowH, fontSize: 8, bold: true, color: C.green, align: 'center', fontFace: 'Arial' });
s6.addText('단체(30%)', { x: 5.2, y: S6.refHeaderY, w: 1.8, h: S6.refRowH, fontSize: 8, bold: true, color: C.orange, align: 'center', fontFace: 'Arial' });
quickRef.forEach((r, i) => {
const ry = S6.refDataY + i * S6.refRowH;
// 최하단 확인: 3.88 + 3*0.22 = 4.54 + 0.22 = 4.76 < 5.15 ✓
s6.addText(r[0], { x: 0.7, y: ry, w: 2.3, h: S6.refRowH, fontSize: 9, color: C.text, fontFace: 'Arial' });
s6.addText(r[1], { x: 3.2, y: ry, w: 1.8, h: S6.refRowH, fontSize: 9, bold: true, color: C.green, align: 'center', fontFace: 'Arial' });
s6.addText(r[2], { x: 5.2, y: ry, w: 1.8, h: S6.refRowH, fontSize: 9, bold: true, color: C.orange, align: 'center', fontFace: 'Arial' });
});
// ═══════════════════════════════════════════════════════
// 슬라이드 7: 수당 지급 시점
// ═══════════════════════════════════════════════════════
const s7 = pres.addSlide();
s7.background = { fill: C.white };
addFooter(s7);
addPageTitle(s7, '수당은 언제 받나?', '고객이 2번에 나눠 내면, 수당도 2번에 나눠 받는다');
addSlideNumber(s7, 7, TOTAL);
// 플로우
// 1차
s7.addShape(pres.ShapeType.roundRect, { x: 0.8, y: 1.5, w: 3.5, h: 1.6, rectRadius: 0.12, fill: { color: C.greenBg }, line: { color: C.greenBorder, width: 1 } });
s7.addShape(pres.ShapeType.ellipse, { x: 1.0, y: 1.6, w: 0.5, h: 0.5, fill: { color: C.green } });
s7.addText('1', { x: 1.0, y: 1.6, w: 0.5, h: 0.5, fontSize: 18, bold: true, color: C.white, align: 'center', valign: 'middle', fontFace: 'Arial' });
s7.addText('1차 납입 (계약금)', { x: 1.6, y: 1.6, w: 2.5, h: 0.5, fontSize: 13, bold: true, color: C.green, valign: 'middle', fontFace: 'Arial' });
s7.addShape(pres.ShapeType.rect, { x: 1.0, y: 2.2, w: 3.1, h: 0.01, fill: { color: C.greenBorder } });
s7.addText('익월 10일', { x: 1.0, y: 2.3, w: 1.5, h: 0.3, fontSize: 10, color: C.textSub, fontFace: 'Arial' });
s7.addText('수당 50% 지급', { x: 2.3, y: 2.3, w: 1.8, h: 0.3, fontSize: 12, bold: true, color: C.green, align: 'right', fontFace: 'Arial' });
s7.addText('예) 200만원', { x: 1.0, y: 2.65, w: 3.1, h: 0.3, fontSize: 10, color: C.gray600, fontFace: 'Arial' });
// 화살표
s7.addText('→', { x: 4.4, y: 2.0, w: 0.6, h: 0.5, fontSize: 24, color: C.gray400, align: 'center', valign: 'middle', fontFace: 'Arial' });
// 2차
s7.addShape(pres.ShapeType.roundRect, { x: 5.2, y: 1.5, w: 3.5, h: 1.6, rectRadius: 0.12, fill: { color: C.blueBg }, line: { color: C.blueBorder, width: 1 } });
s7.addShape(pres.ShapeType.ellipse, { x: 5.4, y: 1.6, w: 0.5, h: 0.5, fill: { color: C.blue } });
s7.addText('2', { x: 5.4, y: 1.6, w: 0.5, h: 0.5, fontSize: 18, bold: true, color: C.white, align: 'center', valign: 'middle', fontFace: 'Arial' });
s7.addText('2차 납입 (잔금)', { x: 6.0, y: 1.6, w: 2.5, h: 0.5, fontSize: 13, bold: true, color: C.blue, valign: 'middle', fontFace: 'Arial' });
s7.addShape(pres.ShapeType.rect, { x: 5.4, y: 2.2, w: 3.1, h: 0.01, fill: { color: C.blueBorder } });
s7.addText('익월 10일', { x: 5.4, y: 2.3, w: 1.5, h: 0.3, fontSize: 10, color: C.textSub, fontFace: 'Arial' });
s7.addText('수당 50% 지급', { x: 6.7, y: 2.3, w: 1.8, h: 0.3, fontSize: 12, bold: true, color: C.blue, align: 'right', fontFace: 'Arial' });
s7.addText('예) 200만원', { x: 5.4, y: 2.65, w: 3.1, h: 0.3, fontSize: 10, color: C.gray600, fontFace: 'Arial' });
// 합계 박스
s7.addShape(pres.ShapeType.roundRect, { x: 2, y: 3.5, w: 6, h: 0.8, rectRadius: 0.1, fill: { color: C.dark } });
s7.addText([
{ text: '예시: 파트너 수당 400만원 → ', options: { fontSize: 12, color: '8899AA' } },
{ text: '200만원', options: { fontSize: 14, bold: true, color: C.greenLight } },
{ text: ' + ', options: { fontSize: 12, color: '8899AA' } },
{ text: '200만원', options: { fontSize: 14, bold: true, color: '64B5F6' } },
{ text: ' = ', options: { fontSize: 12, color: '8899AA' } },
{ text: '400만원', options: { fontSize: 16, bold: true, color: 'FFB74D' } },
], { x: 2, y: 3.5, w: 6, h: 0.8, align: 'center', valign: 'middle', fontFace: 'Arial' });
// ═══════════════════════════════════════════════════════
// 슬라이드 8: 할인 4가지
// ═══════════════════════════════════════════════════════
const s8 = pres.addSlide();
s8.background = { fill: C.white };
addFooter(s8);
addPageTitle(s8, '고객에게 제안할 수 있는 할인 3가지');
addSlideNumber(s8, 8, TOTAL);
const discounts = [
{ title: '개발비 할인', desc: '%, 정액, 전액면제', impact: '수당 영향 있음', impactColor: C.red, bg: C.redBg, border: 'FFCDD2', color: C.red, icon: '1' },
{ title: '구독료 할인', desc: '최대 50%까지', impact: '수당 영향 없음', impactColor: C.green, bg: C.greenBg, border: C.greenBorder, color: C.green, icon: '2' },
{ title: '개발비-구독료 연동', desc: 'ON/OFF 선택', impact: '개발비 변동 시 영향', impactColor: 'F57F17', bg: C.orangeBg, border: C.orangeBorder, color: C.orange, icon: '3' },
];
discounts.forEach((d, i) => {
const cx = 0.5 + i * 2.32;
const cw = 2.12;
s8.addShape(pres.ShapeType.roundRect, { x: cx, y: 1.2, w: cw, h: 2.8, rectRadius: 0.1, fill: { color: d.bg }, line: { color: d.border, width: 1 } });
// 넘버
s8.addShape(pres.ShapeType.ellipse, { x: cx + 0.75, y: 1.35, w: 0.55, h: 0.55, fill: { color: d.color } });
s8.addText(d.icon, { x: cx + 0.75, y: 1.35, w: 0.55, h: 0.55, fontSize: 18, bold: true, color: C.white, align: 'center', valign: 'middle', fontFace: 'Arial' });
// 제목
s8.addText(d.title, { x: cx + 0.1, y: 2.0, w: cw - 0.2, h: 0.4, fontSize: 12, bold: true, color: d.color, align: 'center', fontFace: 'Arial' });
// 설명
s8.addText(d.desc, { x: cx + 0.1, y: 2.4, w: cw - 0.2, h: 0.3, fontSize: 10, color: C.textSub, align: 'center', fontFace: 'Arial' });
// 수당 영향
s8.addShape(pres.ShapeType.roundRect, { x: cx + 0.15, y: 3.1, w: cw - 0.3, h: 0.6, rectRadius: 0.06, fill: { color: C.white } });
s8.addText('수당 영향', { x: cx + 0.15, y: 3.1, w: cw - 0.3, h: 0.25, fontSize: 8, color: C.gray600, align: 'center', fontFace: 'Arial' });
s8.addText(d.impact, { x: cx + 0.15, y: 3.35, w: cw - 0.3, h: 0.3, fontSize: 10, bold: true, color: d.impactColor, align: 'center', fontFace: 'Arial' });
});
// 팁
s8.addShape(pres.ShapeType.roundRect, { x: 0.5, y: 4.3, w: 9, h: 0.6, rectRadius: 0.08, fill: { color: 'E8F5E9' }, line: { color: 'A5D6A7', width: 0.5 } });
s8.addText([
{ text: '💡 영업 팁: ', options: { fontSize: 11, bold: true, color: C.green } },
{ text: '구독료 할인은 고객에게 혜택을 주면서 내 수당은 안 줄어드는 좋은 전략!', options: { fontSize: 11, color: '1B5E20' } },
], { x: 0.7, y: 4.3, w: 8.6, h: 0.6, valign: 'middle', fontFace: 'Arial' });
// ═══════════════════════════════════════════════════════
// 슬라이드 9: 1년차 총 비용 계산
// ═══════════════════════════════════════════════════════
const s9 = pres.addSlide();
s9.background = { fill: C.white };
addFooter(s9);
addPageTitle(s9, '1년차 총 비용 계산법');
addSlideNumber(s9, 9, TOTAL);
// 공식
s9.addShape(pres.ShapeType.roundRect, { x: 0.5, y: 1.2, w: 9, h: 0.7, rectRadius: 0.1, fill: { color: C.dark } });
s9.addText([
{ text: '1년차', options: { fontSize: 16, bold: true, color: 'FFB74D' } },
{ text: ' = ', options: { fontSize: 16, color: C.white } },
{ text: '개발비', options: { fontSize: 16, bold: true, color: C.greenLight } },
{ text: ' + ( ', options: { fontSize: 16, color: C.white } },
{ text: '월 구독료', options: { fontSize: 16, bold: true, color: '64B5F6' } },
{ text: ' × ', options: { fontSize: 16, color: C.white } },
{ text: '유료 개월수', options: { fontSize: 16, bold: true, color: 'CE93D8' } },
{ text: ' )', options: { fontSize: 16, color: C.white } },
], { x: 0.5, y: 1.2, w: 9, h: 0.7, align: 'center', valign: 'middle', fontFace: 'Arial' });
// 실전 예시
s9.addText('실전 예시: 제조업 기본 패키지, 10% 할인', {
x: 0.5, y: 2.1, w: 9, h: 0.35, fontSize: 11, bold: true, color: C.text, fontFace: 'Arial'
});
const calcData = [
['개발비 (정가)', '', '2,000만원', C.text],
['개발비 할인 10%', '2,000 × 10%', '-200만원', C.red],
['최종 개발비', '', '1,800만원', C.green],
['월 구독료', '', '50만원', C.blue],
['유료 개월수', '12개월', '12개월', 'CE93D8'],
['연간 구독료', '50 × 12', '600만원', C.blue],
['1년차 총 비용', '1,800 + 600', '2,400만원', C.orange],
];
calcData.forEach((row, i) => {
const ry = 2.55 + i * 0.35;
const isTotal = i === 2 || i === 6;
if (isTotal) {
s9.addShape(pres.ShapeType.roundRect, { x: 0.5, y: ry, w: 9, h: 0.35, rectRadius: 0.04, fill: { color: isTotal && i === 6 ? C.dark : C.gray100 } });
} else if (i % 2 === 0) {
s9.addShape(pres.ShapeType.rect, { x: 0.5, y: ry, w: 9, h: 0.35, fill: { color: C.gray50 } });
}
const txtColor = isTotal && i === 6 ? C.white : C.text;
s9.addText(row[0], { x: 0.7, y: ry, w: 3, h: 0.35, fontSize: isTotal ? 10 : 9, bold: isTotal, color: txtColor, valign: 'middle', fontFace: 'Arial' });
s9.addText(row[1], { x: 3.7, y: ry, w: 2.5, h: 0.35, fontSize: 9, color: isTotal && i === 6 ? '8899AA' : C.gray600, align: 'center', valign: 'middle', fontFace: 'Arial' });
s9.addText(row[2], { x: 6.5, y: ry, w: 2.8, h: 0.35, fontSize: isTotal ? 13 : 10, bold: isTotal, color: isTotal && i === 6 ? 'FFB74D' : row[3], align: 'right', valign: 'middle', fontFace: 'Arial' });
});
// 2년차 안내
s9.addShape(pres.ShapeType.roundRect, { x: 0.5, y: 4.4, w: 9, h: 0.6, rectRadius: 0.08, fill: { color: C.blueBg }, line: { color: C.blueBorder, width: 0.5 } });
s9.addText([
{ text: '2년차부터: ', options: { fontSize: 11, bold: true, color: C.blue } },
{ text: '50만원 × 12 = ', options: { fontSize: 11, color: C.text } },
{ text: '연 600만원만', options: { fontSize: 13, bold: true, color: C.blue } },
{ text: ' 내면 된다 (개발비 없음!)', options: { fontSize: 11, color: C.text } },
], { x: 0.7, y: 4.4, w: 8.6, h: 0.6, valign: 'middle', fontFace: 'Arial' });
// ═══════════════════════════════════════════════════════
// 슬라이드 10: 사용량 과금 + 바로빌
// ═══════════════════════════════════════════════════════
const s10 = pres.addSlide();
s10.background = { fill: C.white };
addFooter(s10);
addPageTitle(s10, '사용량 과금 & 바로빌 부가 서비스', '대부분의 중소기업은 기본 제공량으로 충분하다');
addSlideNumber(s10, 10, TOTAL);
// 사용량
s10.addText('기본 제공량', { x: 0.5, y: 1.2, w: 4, h: 0.35, fontSize: 12, bold: true, color: C.text, fontFace: 'Arial' });
const usageItems = [
['파일 저장 공간', '100GB', '100GB당 5만원/월'],
['AI 토큰', '월 100만 개', '실비 과금'],
];
usageItems.forEach((u, i) => {
const uy = 1.65 + i * 0.75;
s10.addShape(pres.ShapeType.roundRect, { x: 0.5, y: uy, w: 4.3, h: 0.6, rectRadius: 0.08, fill: { color: C.gray50 }, line: { color: C.gray200, width: 0.5 } });
s10.addText(u[0], { x: 0.7, y: uy, w: 1.5, h: 0.6, fontSize: 10, bold: true, color: C.text, valign: 'middle', fontFace: 'Arial' });
s10.addText(u[1], { x: 2.2, y: uy, w: 1.2, h: 0.3, fontSize: 12, bold: true, color: C.green, valign: 'middle', fontFace: 'Arial' });
s10.addText('초과: ' + u[2], { x: 2.2, y: uy + 0.3, w: 2.4, h: 0.25, fontSize: 8, color: C.gray600, fontFace: 'Arial' });
});
// 바로빌
s10.addText('바로빌 부가 서비스', { x: 5.2, y: 1.2, w: 4.3, h: 0.35, fontSize: 12, bold: true, color: C.text, fontFace: 'Arial' });
const barobillItems = [
['계좌조회', '1만원/월', C.text],
['카드내역', '1만원/월', C.text],
['홈택스 매입/매출', '무료!', C.green],
['세금계산서', '100건 기본 무료', C.text],
];
barobillItems.forEach((b, i) => {
const by = 1.65 + i * 0.55;
s10.addShape(pres.ShapeType.roundRect, { x: 5.2, y: by, w: 4.3, h: 0.45, rectRadius: 0.06, fill: { color: i === 2 ? C.greenBg : C.gray50 }, line: { color: i === 2 ? C.greenBorder : C.gray200, width: 0.5 } });
s10.addText(b[0], { x: 5.4, y: by, w: 2, h: 0.45, fontSize: 10, color: C.text, valign: 'middle', fontFace: 'Arial' });
s10.addText(b[1], { x: 7.5, y: by, w: 1.8, h: 0.45, fontSize: 10, bold: true, color: b[2], align: 'right', valign: 'middle', fontFace: 'Arial' });
});
// AI 토큰 활용
s10.addText('AI 토큰 100만 개로 할 수 있는 일', { x: 0.5, y: 3.5, w: 9, h: 0.3, fontSize: 10, bold: true, color: C.text, fontFace: 'Arial' });
const aiUsage = [
['회의 녹음 요약', '약 8시간 30분'],
['문서 정리', 'A4 약 300~400장'],
['이메일/노트 분류', '약 1,500~2,000건'],
];
aiUsage.forEach((a, i) => {
const ax = 0.5 + i * 3.1;
s10.addShape(pres.ShapeType.roundRect, { x: ax, y: 3.9, w: 2.9, h: 0.55, rectRadius: 0.06, fill: { color: 'F3E5F5' }, line: { color: 'CE93D8', width: 0.5 } });
s10.addText(a[0], { x: ax + 0.1, y: 3.9, w: 2.7, h: 0.25, fontSize: 8, color: C.gray600, align: 'center', fontFace: 'Arial' });
s10.addText(a[1], { x: ax + 0.1, y: 4.15, w: 2.7, h: 0.25, fontSize: 10, bold: true, color: '7B1FA2', align: 'center', fontFace: 'Arial' });
});
// ═══════════════════════════════════════════════════════
// 슬라이드 11: 가격 시뮬레이터
// ═══════════════════════════════════════════════════════
const s11 = pres.addSlide();
s11.background = { fill: C.white };
addFooter(s11);
addPageTitle(s11, '가격 시뮬레이터', '고객에게 제안하기 전에 미리 비용과 수당을 확인하는 도구');
addSlideNumber(s11, 11, TOTAL);
// 4 Steps
const steps = [
{ num: '1', title: '상품 고르기', desc: '필수 상품 자동체크\n추가 상품 선택', color: C.green, bg: C.greenBg },
{ num: '2', title: '할인 설정', desc: '개발비/구독료 할인\n연동 ON/OFF', color: C.blue, bg: C.blueBg },
{ num: '3', title: '가입유형 선택', desc: '개인 가입\n단체 가입', color: C.orange, bg: C.orangeBg },
{ num: '4', title: '결과 확인!', desc: '최종 비용\n내 수당', color: '7B1FA2', bg: 'F3E5F5' },
];
steps.forEach((st, i) => {
const sx = 0.5 + i * 2.35;
const sw = 2.15;
s11.addShape(pres.ShapeType.roundRect, { x: sx, y: 1.2, w: sw, h: 1.8, rectRadius: 0.1, fill: { color: st.bg } });
// Step 번호
s11.addShape(pres.ShapeType.ellipse, { x: sx + 0.75, y: 1.3, w: 0.6, h: 0.6, fill: { color: st.color } });
s11.addText(st.num, { x: sx + 0.75, y: 1.3, w: 0.6, h: 0.6, fontSize: 20, bold: true, color: C.white, align: 'center', valign: 'middle', fontFace: 'Arial' });
s11.addText(st.title, { x: sx + 0.1, y: 2.0, w: sw - 0.2, h: 0.35, fontSize: 12, bold: true, color: st.color, align: 'center', fontFace: 'Arial' });
s11.addText(st.desc, { x: sx + 0.1, y: 2.35, w: sw - 0.2, h: 0.55, fontSize: 9, color: C.textSub, align: 'center', valign: 'top', fontFace: 'Arial' });
// 화살표
if (i < 3) {
s11.addText('→', { x: sx + sw - 0.05, y: 1.8, w: 0.3, h: 0.5, fontSize: 18, color: C.gray400, align: 'center', valign: 'middle', fontFace: 'Arial' });
}
});
// 상품 유형 표
s11.addText('상품 선택 화면에서 알아야 할 것', { x: 0.5, y: 3.3, w: 9, h: 0.35, fontSize: 11, bold: true, color: C.text, fontFace: 'Arial' });
const types = [
{ label: '필수', desc: '기본 포함, 해제 불가', color: C.red, bg: C.redBg },
{ label: '재량권', desc: '슬라이더로 개발비 조정 가능', color: C.orange, bg: C.orangeBg },
{ label: '선택', desc: '자유롭게 체크/해제', color: C.green, bg: C.greenBg },
];
types.forEach((t, i) => {
const tx = 0.5 + i * 3.1;
s11.addShape(pres.ShapeType.roundRect, { x: tx, y: 3.75, w: 2.9, h: 0.7, rectRadius: 0.08, fill: { color: t.bg } });
s11.addShape(pres.ShapeType.roundRect, { x: tx + 0.15, y: 3.85, w: 0.8, h: 0.25, rectRadius: 0.04, fill: { color: t.color } });
s11.addText(t.label, { x: tx + 0.15, y: 3.85, w: 0.8, h: 0.25, fontSize: 9, bold: true, color: C.white, align: 'center', valign: 'middle', fontFace: 'Arial' });
s11.addText(t.desc, { x: tx + 0.15, y: 4.15, w: 2.6, h: 0.25, fontSize: 9, color: C.textSub, fontFace: 'Arial' });
});
// 주의
s11.addText('※ 시뮬레이터 결과는 참고용이다. 실제 계약 금액은 고객과 별도 협의한다.', {
x: 0.5, y: 4.7, w: 9, h: 0.3, fontSize: 9, color: C.gray600, align: 'center', fontFace: 'Arial'
});
// ═══════════════════════════════════════════════════════
// 슬라이드 12: 영업 실전 팁
// ═══════════════════════════════════════════════════════
const s12 = pres.addSlide();
s12.background = { fill: C.white };
addFooter(s12);
addPageTitle(s12, '영업 실전 팁', '고객 유형별 추천 전략');
addSlideNumber(s12, 12, TOTAL);
const tips = [
{ situation: '초기 비용 부담이 클 때', strategy: '개발비 할인 + 구독료 할인 조합', color: C.green, bg: C.greenBg },
{ situation: '매달 비용이 부담될 때', strategy: '구독료 할인 (최대 50%)', color: C.blue, bg: C.blueBg },
{ situation: '세금계산서·카드 관리 필요', strategy: '바로빌 부가 서비스 안내 (기본 포함)', color: C.orange, bg: C.orangeBg },
{ situation: '대형 제조업체', strategy: '기본 패키지 + 공정관리 + 품질관리', color: '7B1FA2', bg: 'F3E5F5' },
{ situation: '여러 업체를 묶을 수 있을 때', strategy: '단체 가입 (수당률 30%로 UP!)', color: C.red, bg: C.redBg },
];
tips.forEach((t, i) => {
const ty = 1.2 + i * 0.6;
s12.addShape(pres.ShapeType.roundRect, { x: 0.5, y: ty, w: 9, h: 0.5, rectRadius: 0.08, fill: { color: t.bg } });
s12.addShape(pres.ShapeType.rect, { x: 0.5, y: ty, w: 0.08, h: 0.5, fill: { color: t.color } });
s12.addText(t.situation, { x: 0.8, y: ty, w: 3.5, h: 0.5, fontSize: 10, bold: true, color: t.color, valign: 'middle', fontFace: 'Arial' });
s12.addText('→ ' + t.strategy, { x: 4.5, y: ty, w: 4.8, h: 0.5, fontSize: 10, color: C.text, valign: 'middle', fontFace: 'Arial' });
});
// 고객 FAQ
s12.addText('고객이 자주 하는 질문', { x: 0.5, y: 4.15, w: 5, h: 0.3, fontSize: 11, bold: true, color: C.text, fontFace: 'Arial' });
const faqs = [
['"왜 비싸요?"', '기존 ERP 5천만~1억 vs SAM 2천만원 + AI 포함'],
['"구독료가 아까운데?"', '자체 서버 월 200만+ vs SAM 월 50만원'],
['"추가 할인 안 돼요?"', '구독료 최대 50%까지 할인 가능!'],
];
faqs.forEach((f, i) => {
const fy = 4.5 + i * 0.3;
s12.addText(f[0], { x: 0.7, y: fy, w: 2.5, h: 0.28, fontSize: 9, bold: true, color: C.blue, fontFace: 'Arial' });
s12.addText(f[1], { x: 3.2, y: fy, w: 6.3, h: 0.28, fontSize: 9, color: C.textSub, fontFace: 'Arial' });
});
// ═══════════════════════════════════════════════════════
// 슬라이드 13: 마무리
// ═══════════════════════════════════════════════════════
const s13 = pres.addSlide();
s13.background = { fill: C.dark };
s13.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.06, fill: { color: C.greenLight } });
s13.addShape(pres.ShapeType.roundRect, { x: 3.8, y: 1.2, w: 2.4, h: 0.65, rectRadius: 0.1, fill: { color: C.greenLight } });
s13.addText('SAM', { x: 3.8, y: 1.2, w: 2.4, h: 0.65, fontSize: 28, bold: true, color: C.white, align: 'center', valign: 'middle', fontFace: 'Arial' });
s13.addText('Smart Automation Management', {
x: 1, y: 2.1, w: 8, h: 0.5,
fontSize: 14, color: '667788', align: 'center', fontFace: 'Arial'
});
s13.addShape(pres.ShapeType.rect, { x: 3, y: 2.9, w: 4, h: 0.01, fill: { color: '2A3A4A' } });
s13.addText('(주)코드브릿지엑스', {
x: 1, y: 3.1, w: 8, h: 0.5,
fontSize: 16, bold: true, color: C.white, align: 'center', fontFace: 'Arial'
});
// 핵심 기억 포인트
const keyPoints = [
'개발비 = 한 번 | 구독료 = 매달',
'수당 = 최종 개발비 × 수당률',
'구독료 할인 → 수당 영향 없음',
];
keyPoints.forEach((kp, i) => {
s13.addShape(pres.ShapeType.roundRect, { x: 2, y: 3.85 + i * 0.42, w: 6, h: 0.35, rectRadius: 0.06, fill: { color: '1B2838' }, line: { color: '2A3A4A', width: 0.5 } });
s13.addText([
{ text: '✓ ', options: { fontSize: 10, color: C.greenLight } },
{ text: kp, options: { fontSize: 10, color: 'AABBCC' } },
], { x: 2.2, y: 3.85 + i * 0.42, w: 5.6, h: 0.35, valign: 'middle', fontFace: 'Arial' });
});
// ─── 저장 ───
const outputPath = path.join(__dirname, 'sam-pricing-simple-guide.pptx');
await pres.writeFile({ fileName: outputPath });
console.log('PPTX created:', outputPath);
}
main().catch(console.error);