- 개별 모듈 가격표에서 '이카운트 연동' 행 제거 (별도 상품 아님) - 영업 전략 '이카운트 연동 추천' → '바로빌 부가 서비스 안내'로 변경 - 데모 테넌트 정책 '바로빌/이카운트' → '바로빌 등 외부 연동'으로 통일 - 브로셔/슬라이드 HTML 반영 - PPTX 재생성
728 lines
48 KiB
JavaScript
728 lines
48 KiB
JavaScript
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);
|