diff --git a/patent-attorney-briefing-compact.md b/patent-attorney-briefing-compact.md new file mode 100644 index 0000000..826beb8 --- /dev/null +++ b/patent-attorney-briefing-compact.md @@ -0,0 +1,149 @@ +# SAM 특허 출원 브리핑 — 변리사 제출용 (축약본) + +> **출원인**: (주)코드브릿지엑스 +> **대상**: SAM (Smart Automation Management) — 중소 제조업 맞춤형 ERP/MES 자동 구성 플랫폼 +> **작성일**: 2026-03-20 +> **미팅일**: 2026-03-19 + +--- + +## Slide 1: 표지 + +**SAM 특허 출원 브리핑** + +- 출원인: (주)코드브릿지엑스 +- 대상: SAM — 고객사별 맞춤형 ERP/MES 자동 구성 방법 +- 2026-03-20 + +--- + +## Slide 2: 특허 전략 — 2축 구조 + +### 축1: 플랫폼 방법특허 (최우선) + +"고객사 업무 데이터를 AI로 분석하여 맞춤형 ERP/MES를 자동 구성하는 방법" + +| 핵심 구성 요소 | 설명 | +|-------------|------| +| 비대면 3채널 수집 | 견적서 파일 + 체크리스트 설문 + 음성 인터뷰 | +| AI 패턴 분석 | 업종·규모·공정 자동 도출 (LLM + 20만줄 도메인 지식) | +| 레시피 기반 자동 초기화 | TenantBootstrapper 4단계 멱등적 파이프라인 | +| 동적 필드 3계층 | page→section→field 구조, 코드 배포 없이 커스터마이징 | +| Zero-Config 수식 라우팅 | 파일 존재만으로 테넌트별 계산 엔진 자동 발견 | + +### 축2: 개별 알고리즘 특허 (후순위) + +| 후보 | 핵심 | +|------|------| +| BOM 수식 엔진 (1,948줄) | 10단계 견적 자동화 파이프라인 | +| 절곡 공정 최적 배분 (1,171줄) | 원자재 절재 낭비 15%→5% | +| 건기원 실적신고 자동화 | 품질검사→엑셀 자동 생성 | +| 신용도 이중 평가 | 외부(쿠콘) + 내부(거래 이력) 종합 등급 | + +### 선행기술 리스크 + +- 젠소프트 "AI 기반 하이퍼 오토메이션" 특허가 유사 선행기술 +- **대응**: 컨셉이 아닌 구체적 알고리즘·처리 흐름 + 산업 특화로 차별화 + +--- + +## Slide 3: 5단계 자동화 파이프라인 (청구항 핵심) + +``` +[단계 1] [단계 2] [단계 3] [단계 4] [단계 5] +비대면 3채널 수집 → 전처리·정규화 → AI 패턴 분석 → 테넌트 자동 생성 → 동적 커스터마이징 + + 시스템 초기화 +━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━ ━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━ +• 견적서 파일 • 파일 파싱 • 업종 분류 • 한글 초성→코드 • 동적 필드 3계층 +• 체크리스트 설문 • 응답 정규화 • 규모 판별 • 메뉴 계층 복제 • 전역/테넌트 오버레이 +• 음성 인터뷰 • STT+키워드 추출 • 필요 모듈 매칭 • 역할/권한 자동 • Zero-Config 수식 + (1~2일) (자동) • BOM 패턴 추론 • 레시피 4Step • 행 수준 데이터 격리 + (수분) (수초) (267모델 자동) +``` + +### 청구항 독립항 1 (요약) + +> (a) 복수 채널 비대면 데이터 수집 → (b) 정규화·통합 → (c) AI 업종·공정 패턴 도출 → (d) 테넌트 코드 생성 + 레시피 기반 자동 초기화 → (e) 필드·메뉴·권한 동적 조정 + 행 수준 격리 + +--- + +## Slide 4: As-Is / To-Be 핵심 비교 + +| 항목 | 기존 방식 | SAM | 개선률 | +|------|:--------:|:---:|:------:| +| ERP 초기 구축 | 6개월~1년 | **1주일** | 31배 | +| 견적 1건 작성 | 3~5시간 | **10초** | 1,300배 | +| 신규 업체 온보딩 | 2주 (현장 방문) | **1일 (비대면)** | 14배 | +| 업종 커스터마이징 | 코드 포크 (수개월) | **설정 변경** | ∞ | +| 도입 비용 | 5,800만~1.5억원 | **월 과금** | 10배+ | +| 도입 실패율 | 40~60% | **0%** (2사 실증) | ∞ | + +### 연간 비용 절감 (1개사 기준) + +| 항목 | 기존 | SAM 적용 후 | 절감 | +|------|:----:|:----------:|:----:| +| 견적 인건비 | 3,750만 | 0 | 3,750만 | +| 절곡 오류 재작업 | 600만 | 0 | 600만 | +| 원자재 낭비 | 2,400만 | 600만 | 1,800만 | +| 단가·품질 관리 | 1,680만 | 0 | 1,680만 | +| **합계** | **8,430만/년** | **600만/년** | **7,830만/년** | + +### 실증 사례: 경동기업(2025-12~), 주일기업(2025-09~) 운영 중 + +--- + +## Slide 5: 선행기술 대비 독창성 + +| 기술 요소 | 젠소프트 | 이카운트 | **SAM** | +|----------|:-------:|:-------:|:------:| +| 비대면 3채널 수집 | ❌ | ❌ | ✅ | +| 한글 초성 코드 생성 | ❌ | ❌ | ✅ | +| 레시피 기반 멱등적 초기화 | ❌ | ❌ | ✅ | +| 동적 필드 3계층 (page→section→field) | △ 고정 | △ 고정 | ✅ | +| DB 수준 조건부 렌더링 | ❌ | ❌ | ✅ | +| Zero-Config 테넌트 수식 라우팅 | ❌ | ❌ | ✅ | +| 행 수준 자동 격리 (267모델) | △ DB분리 | ❌ 단일 | ✅ | +| 4계층 AI 프롬프트 엔진 | ❌ | ❌ | ✅ | +| 자연어 트리거 배포 자동화 | ❌ | ❌ | ✅ | + +### 프롬프트 엔지니어링 — 핵심 차별점 + +- **4계층 규칙 상속**: 전역→SAM→서비스별→문서 (합산 3,000줄+) +- **20만줄 도메인 지식 베이스**: AI가 산업 특화 규칙을 자동 참조 +- **45개 도메인 스킬 + 12개 전문 에이전트**: 코드 품질·보안·배포를 AI가 자율 관리 +- **L1/L2/L3 3단계 서버 안전 제어**: 실제 사고(502) 경험에서 도출된 AI 권한 체계 + +--- + +## Slide 6: 실행 로드맵 + +| Phase | 기간 | 핵심 액션 | +|:-----:|------|---------| +| **1** | 3~4월 | 변리사 제출 자료 완성 (흐름도·비교표·청구항 초안·선행기술 분석) | +| **2** | 4월 | 보완 개발 (신용도 내부 평가, AI 동적 설문, 업종 확장 3건+) | +| **3** | 5월~ | 축1 플랫폼 방법특허 출원 → 축2 알고리즘 특허 필요성 재검토 | + +### 업종 확장 가능성 (범용 설계 합의) + +| 확장 업종 | 추가 개발 범위 | +|----------|:------------:| +| 가구 제조 | 핸들러 1개 | +| 철강 가공 | 규격 테이블 교체 | +| 시공업 | 공정 유형 추가 | +| 유통업 | 유통 워크플로우 | + +> 기술적 근거: Zero-Config Factory + 동적 필드 + 레시피 패턴으로 파일/설정 추가만으로 업종 확장 + +### 시스템 규모 (실증 데이터, 2026-03-20 기준) + +| 지표 | 수치 | +|------|:----:| +| Eloquent 모델 | 267개 | +| API 라우트 | 1,327개 | +| 서비스 클래스 | 332개 | +| DB 마이그레이션 | 551개 | +| 운영 테넌트 | 2개 | + +--- + +**최종 업데이트**: 2026-03-20 diff --git a/patent-attorney-briefing-compact.pdf b/patent-attorney-briefing-compact.pdf new file mode 100644 index 0000000..5eb17c6 Binary files /dev/null and b/patent-attorney-briefing-compact.pdf differ diff --git a/patent-attorney-briefing-compact.pptx b/patent-attorney-briefing-compact.pptx new file mode 100644 index 0000000..91acaeb Binary files /dev/null and b/patent-attorney-briefing-compact.pptx differ diff --git a/patent-compact-convert.cjs b/patent-compact-convert.cjs new file mode 100644 index 0000000..f53244e --- /dev/null +++ b/patent-compact-convert.cjs @@ -0,0 +1,454 @@ +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 = { + bgDark: '0D1B2A', + bgCard: '1B2838', + bgCardAlt: '152232', + primary: '00BFA5', + primaryLight: '1A3D4A', + accent: 'FF6F61', + accentYellow: 'FFB74D', + white: 'FFFFFF', + gray: '8899AA', + grayLight: 'B0BEC5', + line: '2A3E52', + blue: '42A5F5', + green: '66BB6A', + red: 'EF5350', + }; + const F = 'Arial'; + + // ═══════════════════════════════════════════════════ + // SLIDE 1: 표지 + // ═══════════════════════════════════════════════════ + const s1 = pres.addSlide(); + s1.background = { fill: C.bgDark }; + + // 상단 얇은 악센트 라인 + s1.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.04, fill: { color: C.primary } }); + + // 좌측 포인트 바 + s1.addShape(pres.ShapeType.rect, { x: 0.8, y: 1.5, w: 0.06, h: 1.8, fill: { color: C.primary } }); + + // SAM BI 로고 + s1.addImage({ path: '/home/aweso/sam/docs/assets/bi/sam_bi_white.png', x: 0.8, y: 0.5, w: 1.2, h: 0.6 }); + + // 메인 타이틀 + s1.addText('특허 출원 브리핑', { + x: 1.1, y: 1.55, w: 7, h: 0.7, + fontSize: 34, bold: true, color: C.white, fontFace: F + }); + s1.addText('고객사별 맞춤형 ERP/MES 자동 구성 방법', { + x: 1.1, y: 2.2, w: 7, h: 0.5, + fontSize: 16, color: C.primary, fontFace: F + }); + s1.addText('변리사 제출용 기술 자료 (축약본)', { + x: 1.1, y: 2.75, w: 7, h: 0.4, + fontSize: 12, color: C.gray, fontFace: F + }); + + // 하단 정보 + s1.addShape(pres.ShapeType.rect, { x: 0, y: 4.7, w: 10, h: 0.02, fill: { color: C.line } }); + s1.addText('(주)코드브릿지엑스', { + x: 0.8, y: 4.85, w: 3, h: 0.35, + fontSize: 12, bold: true, color: C.grayLight, fontFace: F + }); + s1.addText('2026-03-20', { + x: 6, y: 4.85, w: 3.2, h: 0.35, + fontSize: 11, color: C.gray, align: 'right', fontFace: F + }); + + // 대외비 + addConfidential(s1, pres); + + // ═══════════════════════════════════════════════════ + // SLIDE 2: 특허 전략 — 2축 구조 + // ═══════════════════════════════════════════════════ + const s2 = pres.addSlide(); + s2.background = { fill: C.bgDark }; + addHeader(s2, pres, '특허 전략 — 2축 구조', C); + addConfidential(s2, pres); + addFooter(s2, pres, C, '2 / 6'); + + // 축1 카드 + const ax1x = 0.4, ax1y = 1.05, ax1w = 4.5, ax1h = 3.65; + s2.addShape(pres.ShapeType.roundRect, { x: ax1x, y: ax1y, w: ax1w, h: ax1h, rectRadius: 0.12, fill: { color: '0D2818' }, line: { color: '1B5E20', width: 1.2 } }); + // 축1 헤더 + s2.addShape(pres.ShapeType.roundRect, { x: ax1x, y: ax1y, w: ax1w, h: 0.45, rectRadius: 0.12, fill: { color: '1B5E20' } }); + s2.addShape(pres.ShapeType.rect, { x: ax1x, y: ax1y + 0.3, w: ax1w, h: 0.15, fill: { color: '1B5E20' } }); + s2.addText([ + { text: ' AXIS 1 ', options: { fontSize: 9, bold: true, color: 'A5D6A7' } }, + { text: ' 플랫폼 방법특허 (BM 발명)', options: { fontSize: 11, bold: true, color: C.white } }, + ], { x: ax1x + 0.1, y: ax1y + 0.02, w: ax1w - 0.2, h: 0.4, fontFace: F }); + + // 축1 설명 + s2.addText('"고객사 업무 데이터를 AI로 분석하여\n맞춤형 ERP/MES를 자동 구성하는 방법"', { + x: ax1x + 0.2, y: ax1y + 0.55, w: ax1w - 0.4, h: 0.55, + fontSize: 9.5, italic: true, color: C.primary, fontFace: F, lineSpacingMultiple: 1.3 + }); + + const axis1Items = [ + ['비대면 3채널 수집', '파일 + 설문 + 음성 인터뷰'], + ['AI 패턴 분석', 'LLM + 20만줄 도메인 지식'], + ['레시피 기반 자동 초기화', 'TenantBootstrapper 4단계'], + ['동적 필드 3계층', 'page → section → field'], + ['Zero-Config 수식 라우팅', '파일 존재만으로 자동 발견'], + ]; + axis1Items.forEach((item, i) => { + const iy = ax1y + 1.2 + i * 0.48; + s2.addShape(pres.ShapeType.roundRect, { x: ax1x + 0.15, y: iy, w: ax1w - 0.3, h: 0.4, rectRadius: 0.06, fill: { color: '0F2D1A' } }); + s2.addShape(pres.ShapeType.ellipse, { x: ax1x + 0.25, y: iy + 0.08, w: 0.24, h: 0.24, fill: { color: '2E7D32' } }); + s2.addText(String(i + 1), { x: ax1x + 0.25, y: iy + 0.08, w: 0.24, h: 0.24, fontSize: 8, bold: true, color: C.white, align: 'center', valign: 'middle', fontFace: F }); + s2.addText(item[0], { x: ax1x + 0.6, y: iy + 0.02, w: 2, h: 0.18, fontSize: 9, bold: true, color: C.white, fontFace: F }); + s2.addText(item[1], { x: ax1x + 0.6, y: iy + 0.2, w: 3.6, h: 0.16, fontSize: 7.5, color: C.gray, fontFace: F }); + }); + + // 최우선 배지 + s2.addShape(pres.ShapeType.roundRect, { x: ax1x + ax1w - 1.2, y: ax1y + 0.55, w: 1, h: 0.28, rectRadius: 0.04, fill: { color: C.accent } }); + s2.addText('최우선', { x: ax1x + ax1w - 1.2, y: ax1y + 0.55, w: 1, h: 0.28, fontSize: 9, bold: true, color: C.white, align: 'center', valign: 'middle', fontFace: F }); + + // 축2 카드 + const ax2x = 5.1, ax2y = 1.05, ax2w = 4.5, ax2h = 2.5; + s2.addShape(pres.ShapeType.roundRect, { x: ax2x, y: ax2y, w: ax2w, h: ax2h, rectRadius: 0.12, fill: { color: '1A1A2E' }, line: { color: '37474F', width: 1 } }); + s2.addShape(pres.ShapeType.roundRect, { x: ax2x, y: ax2y, w: ax2w, h: 0.45, rectRadius: 0.12, fill: { color: '37474F' } }); + s2.addShape(pres.ShapeType.rect, { x: ax2x, y: ax2y + 0.3, w: ax2w, h: 0.15, fill: { color: '37474F' } }); + s2.addText([ + { text: ' AXIS 2 ', options: { fontSize: 9, bold: true, color: C.grayLight } }, + { text: ' 개별 알고리즘 특허', options: { fontSize: 11, bold: true, color: C.white } }, + ], { x: ax2x + 0.1, y: ax2y + 0.02, w: ax2w - 0.2, h: 0.4, fontFace: F }); + + const axis2Items = [ + ['BOM 수식 엔진', '1,948줄 · 10단계 견적 자동화'], + ['절곡 공정 최적 배분', '1,171줄 · 낭비 15%→5%'], + ['건기원 실적신고', '품질검사→엑셀 자동 생성'], + ['신용도 이중 평가', '외부(쿠콘)+내부(거래이력)'], + ]; + axis2Items.forEach((item, i) => { + const iy = ax2y + 0.55 + i * 0.45; + s2.addText('•', { x: ax2x + 0.25, y: iy, w: 0.2, h: 0.35, fontSize: 10, color: C.blue, fontFace: F }); + s2.addText(item[0], { x: ax2x + 0.45, y: iy + 0.02, w: 2, h: 0.16, fontSize: 9, bold: true, color: C.grayLight, fontFace: F }); + s2.addText(item[1], { x: ax2x + 0.45, y: iy + 0.18, w: 3.8, h: 0.14, fontSize: 7.5, color: C.gray, fontFace: F }); + }); + + // 선행기술 리스크 박스 + const riskY = 3.7; + s2.addShape(pres.ShapeType.roundRect, { x: ax2x, y: riskY, w: ax2w, h: 1, rectRadius: 0.1, fill: { color: '2D1515' }, line: { color: '5D3030', width: 0.8 } }); + s2.addText('선행기술 리스크', { x: ax2x + 0.2, y: riskY + 0.06, w: 2.5, h: 0.28, fontSize: 9, bold: true, color: C.accent, fontFace: F }); + s2.addText('젠소프트 "AI 기반 하이퍼 오토메이션" 특허가 유사', { + x: ax2x + 0.2, y: riskY + 0.35, w: ax2w - 0.4, h: 0.2, fontSize: 8, color: C.grayLight, fontFace: F + }); + s2.addText('대응: 컨셉이 아닌 구체적 처리 흐름 + 산업 특화로 차별화', { + x: ax2x + 0.2, y: riskY + 0.6, w: ax2w - 0.4, h: 0.2, fontSize: 8, bold: true, color: C.accentYellow, fontFace: F + }); + + // ═══════════════════════════════════════════════════ + // SLIDE 3: 5단계 자동화 파이프라인 + // ═══════════════════════════════════════════════════ + const s3 = pres.addSlide(); + s3.background = { fill: C.bgDark }; + addHeader(s3, pres, '5단계 자동화 파이프라인 — 청구항 핵심', C); + addConfidential(s3, pres); + addFooter(s3, pres, C, '3 / 6'); + + const steps = [ + { num: '1', title: '로우데이터\n수집', sub: '비대면 3채널', detail: '견적서 파일\n설문 응답\n음성 인터뷰', time: '1~2일', color: '1565C0' }, + { num: '2', title: '전처리\n정규화', sub: '데이터 변환', detail: '파일 파싱\n응답 정규화\nSTT 키워드', time: '자동', color: '00838F' }, + { num: '3', title: 'AI 분석\n패턴 도출', sub: 'LLM 엔진', detail: '업종 분류\n규모 판별\nBOM 추론', time: '수분', color: '2E7D32' }, + { num: '4', title: '테넌트 생성\n자동 초기화', sub: 'Bootstrapper', detail: '코드 생성\n메뉴 복제\n레시피 4Step', time: '수초', color: 'E65100' }, + { num: '5', title: '동적\n커스터마이징', sub: '맞춤 적용', detail: '필드 3계층\n수식 라우팅\n데이터 격리', time: '즉시', color: '6A1B9A' }, + ]; + + const stepW = 1.65, stepGap = 0.18, startX = 0.42; + steps.forEach((st, i) => { + const sx = startX + i * (stepW + stepGap); + const sy = 1.1; + + // 카드 배경 + s3.addShape(pres.ShapeType.roundRect, { x: sx, y: sy, w: stepW, h: 3.35, rectRadius: 0.1, fill: { color: C.bgCard }, line: { color: C.line, width: 0.5 } }); + + // 넘버 서클 + s3.addShape(pres.ShapeType.ellipse, { x: sx + stepW / 2 - 0.22, y: sy + 0.12, w: 0.44, h: 0.44, fill: { color: st.color } }); + s3.addText(st.num, { x: sx + stepW / 2 - 0.22, y: sy + 0.12, w: 0.44, h: 0.44, fontSize: 16, bold: true, color: C.white, align: 'center', valign: 'middle', fontFace: F }); + + // 제목 + s3.addText(st.title, { x: sx + 0.05, y: sy + 0.65, w: stepW - 0.1, h: 0.55, fontSize: 10, bold: true, color: C.white, align: 'center', valign: 'middle', lineSpacingMultiple: 1.1, fontFace: F }); + + // 서브 태그 + s3.addShape(pres.ShapeType.roundRect, { x: sx + 0.2, y: sy + 1.28, w: stepW - 0.4, h: 0.25, rectRadius: 0.04, fill: { color: C.bgCardAlt } }); + s3.addText(st.sub, { x: sx + 0.2, y: sy + 1.28, w: stepW - 0.4, h: 0.25, fontSize: 7.5, color: C.grayLight, align: 'center', valign: 'middle', fontFace: F }); + + // 구분선 + s3.addShape(pres.ShapeType.rect, { x: sx + 0.15, y: sy + 1.65, w: stepW - 0.3, h: 0.01, fill: { color: C.line } }); + + // 상세 항목 + s3.addText(st.detail, { x: sx + 0.15, y: sy + 1.75, w: stepW - 0.3, h: 1.0, fontSize: 8, color: C.grayLight, lineSpacingMultiple: 1.5, fontFace: F }); + + // 소요 시간 배지 + s3.addShape(pres.ShapeType.roundRect, { x: sx + 0.25, y: sy + 2.9, w: stepW - 0.5, h: 0.3, rectRadius: 0.04, fill: { color: st.color } }); + s3.addText(st.time, { x: sx + 0.25, y: sy + 2.9, w: stepW - 0.5, h: 0.3, fontSize: 9, bold: true, color: C.white, align: 'center', valign: 'middle', fontFace: F }); + + // 화살표 (마지막 제외) + if (i < 4) { + s3.addText('>', { x: sx + stepW, y: sy + 0.85, w: stepGap, h: 0.5, fontSize: 16, bold: true, color: C.primary, align: 'center', valign: 'middle', fontFace: F }); + } + }); + + // 하단 청구항 요약 + s3.addShape(pres.ShapeType.roundRect, { x: 0.42, y: 4.55, w: 9.16, h: 0.45, rectRadius: 0.06, fill: { color: C.primaryLight }, line: { color: C.primary, width: 0.5 } }); + s3.addText([ + { text: '청구항 핵심: ', options: { fontSize: 8, bold: true, color: C.primary } }, + { text: '(a) 3채널 수집 → (b) 정규화 → (c) AI 패턴 도출 → (d) 레시피 기반 초기화 → (e) 동적 조정 + 행 수준 격리', options: { fontSize: 8, color: C.grayLight } }, + ], { x: 0.6, y: 4.55, w: 8.8, h: 0.45, valign: 'middle', fontFace: F }); + + // ═══════════════════════════════════════════════════ + // SLIDE 4: As-Is / To-Be 핵심 비교 + // ═══════════════════════════════════════════════════ + const s4 = pres.addSlide(); + s4.background = { fill: C.bgDark }; + addHeader(s4, pres, 'As-Is / To-Be 핵심 비교', C); + addConfidential(s4, pres); + addFooter(s4, pres, C, '4 / 6'); + + // 왼쪽: 지표 대조표 + const tblX = 0.35, tblY = 1.05, tblW = 5.9; + + // 테이블 헤더 + s4.addShape(pres.ShapeType.roundRect, { x: tblX, y: tblY, w: tblW, h: 0.38, rectRadius: 0.08, fill: { color: '1B3A5C' } }); + s4.addText('항목', { x: tblX + 0.1, y: tblY, w: 1.6, h: 0.38, fontSize: 8, bold: true, color: C.grayLight, valign: 'middle', fontFace: F }); + s4.addText('기존 방식', { x: tblX + 1.7, y: tblY, w: 1.6, h: 0.38, fontSize: 8, bold: true, color: C.accent, align: 'center', valign: 'middle', fontFace: F }); + s4.addText('SAM', { x: tblX + 3.3, y: tblY, w: 1.4, h: 0.38, fontSize: 8, bold: true, color: C.primary, align: 'center', valign: 'middle', fontFace: F }); + s4.addText('개선률', { x: tblX + 4.7, y: tblY, w: 1.1, h: 0.38, fontSize: 8, bold: true, color: C.accentYellow, align: 'center', valign: 'middle', fontFace: F }); + + const rows = [ + ['ERP 초기 구축', '6개월~1년', '1주일', '31배'], + ['견적 1건 작성', '3~5시간', '10초', '1,300배'], + ['신규 업체 온보딩', '2주 (현장방문)', '1일 (비대면)', '14배'], + ['업종 커스터마이징', '코드포크 (수개월)', '설정 변경', '∞'], + ['도입 비용', '5,800만~1.5억', '월 과금', '10배+'], + ['도입 실패율', '40~60%', '0% (2사 실증)', '∞'], + ]; + + rows.forEach((row, i) => { + const ry = tblY + 0.42 + i * 0.42; + const bgColor = i % 2 === 0 ? C.bgCard : C.bgCardAlt; + s4.addShape(pres.ShapeType.rect, { x: tblX, y: ry, w: tblW, h: 0.4, fill: { color: bgColor } }); + s4.addText(row[0], { x: tblX + 0.1, y: ry, w: 1.6, h: 0.4, fontSize: 8.5, color: C.white, valign: 'middle', fontFace: F }); + s4.addText(row[1], { x: tblX + 1.7, y: ry, w: 1.6, h: 0.4, fontSize: 8.5, color: C.grayLight, align: 'center', valign: 'middle', fontFace: F }); + s4.addText(row[2], { x: tblX + 3.3, y: ry, w: 1.4, h: 0.4, fontSize: 8.5, bold: true, color: C.primary, align: 'center', valign: 'middle', fontFace: F }); + s4.addText(row[3], { x: tblX + 4.7, y: ry, w: 1.1, h: 0.4, fontSize: 9, bold: true, color: C.accentYellow, align: 'center', valign: 'middle', fontFace: F }); + }); + + // 오른쪽: 비용 절감 카드 + const costX = 6.5, costY = 1.05, costW = 3.2, costH = 3.7; + s4.addShape(pres.ShapeType.roundRect, { x: costX, y: costY, w: costW, h: costH, rectRadius: 0.12, fill: { color: C.bgCard }, line: { color: C.primary, width: 1 } }); + + // 비용 카드 헤더 + s4.addText('연간 비용 절감 (1개사)', { x: costX + 0.15, y: costY + 0.1, w: costW - 0.3, h: 0.3, fontSize: 9, bold: true, color: C.primary, fontFace: F }); + s4.addShape(pres.ShapeType.rect, { x: costX + 0.15, y: costY + 0.42, w: costW - 0.3, h: 0.01, fill: { color: C.line } }); + + const costItems = [ + ['견적 인건비', '3,750만'], + ['절곡 오류 재작업', '600만'], + ['원자재 낭비', '1,800만'], + ['단가/품질 관리', '1,680만'], + ]; + costItems.forEach((ci, i) => { + const cy = costY + 0.5 + i * 0.45; + s4.addShape(pres.ShapeType.roundRect, { x: costX + 0.15, y: cy, w: costW - 0.3, h: 0.38, rectRadius: 0.05, fill: { color: C.bgCardAlt } }); + s4.addText(ci[0], { x: costX + 0.25, y: cy, w: 1.5, h: 0.38, fontSize: 8, color: C.grayLight, valign: 'middle', fontFace: F }); + s4.addText(ci[1], { x: costX + 1.8, y: cy, w: 1.2, h: 0.38, fontSize: 9, bold: true, color: C.green, align: 'right', valign: 'middle', fontFace: F }); + }); + + // 합계 + s4.addShape(pres.ShapeType.rect, { x: costX + 0.15, y: costY + 2.35, w: costW - 0.3, h: 0.01, fill: { color: C.primary } }); + s4.addShape(pres.ShapeType.roundRect, { x: costX + 0.15, y: costY + 2.45, w: costW - 0.3, h: 0.55, rectRadius: 0.08, fill: { color: C.primaryLight } }); + s4.addText('연간 절감 합계', { x: costX + 0.25, y: costY + 2.48, w: 1.5, h: 0.22, fontSize: 8, color: C.grayLight, fontFace: F }); + s4.addText('7,830만원/년', { x: costX + 0.25, y: costY + 2.68, w: costW - 0.5, h: 0.28, fontSize: 16, bold: true, color: C.primary, fontFace: F }); + + // 실증 사례 배지 + s4.addShape(pres.ShapeType.roundRect, { x: costX + 0.15, y: costY + 3.15, w: costW - 0.3, h: 0.4, rectRadius: 0.06, fill: { color: '1A2E1A' }, line: { color: '2E7D32', width: 0.5 } }); + s4.addText([ + { text: '실증: ', options: { fontSize: 8, bold: true, color: C.green } }, + { text: '경동기업(2025-12~)\n주일기업(2025-09~) 운영 중', options: { fontSize: 7.5, color: C.grayLight } }, + ], { x: costX + 0.25, y: costY + 3.15, w: costW - 0.5, h: 0.4, valign: 'middle', fontFace: F }); + + // ═══════════════════════════════════════════════════ + // SLIDE 5: 선행기술 대비 독창성 + // ═══════════════════════════════════════════════════ + const s5 = pres.addSlide(); + s5.background = { fill: C.bgDark }; + addHeader(s5, pres, '선행기술 대비 독창성', C); + addConfidential(s5, pres); + addFooter(s5, pres, C, '5 / 6'); + + // 좌측: 비교표 + const cmpX = 0.35, cmpY = 1.05, cmpW = 5.3; + + // 비교표 헤더 + s5.addShape(pres.ShapeType.roundRect, { x: cmpX, y: cmpY, w: cmpW, h: 0.38, rectRadius: 0.08, fill: { color: '1B3A5C' } }); + s5.addText('기술 요소', { x: cmpX + 0.1, y: cmpY, w: 2, h: 0.38, fontSize: 8, bold: true, color: C.grayLight, valign: 'middle', fontFace: F }); + s5.addText('젠소프트', { x: cmpX + 2.2, y: cmpY, w: 0.9, h: 0.38, fontSize: 7.5, bold: true, color: C.grayLight, align: 'center', valign: 'middle', fontFace: F }); + s5.addText('이카운트', { x: cmpX + 3.1, y: cmpY, w: 0.9, h: 0.38, fontSize: 7.5, bold: true, color: C.grayLight, align: 'center', valign: 'middle', fontFace: F }); + s5.addText('SAM', { x: cmpX + 4.05, y: cmpY, w: 1.1, h: 0.38, fontSize: 8, bold: true, color: C.primary, align: 'center', valign: 'middle', fontFace: F }); + + const compRows = [ + ['비대면 3채널 수집', 'X', 'X', 'O'], + ['한글 초성 코드 생성', 'X', 'X', 'O'], + ['레시피 멱등적 초기화', 'X', 'X', 'O'], + ['동적 필드 3계층', '△', '△', 'O'], + ['DB 수준 조건부 렌더링', 'X', 'X', 'O'], + ['Zero-Config 수식 라우팅', 'X', 'X', 'O'], + ['행 수준 자동 격리 (267모델)', '△', 'X', 'O'], + ['4계층 AI 프롬프트 엔진', 'X', 'X', 'O'], + ['자연어 트리거 배포 자동화', 'X', 'X', 'O'], + ]; + + compRows.forEach((row, i) => { + const ry = cmpY + 0.42 + i * 0.36; + const bgColor = i % 2 === 0 ? C.bgCard : C.bgCardAlt; + s5.addShape(pres.ShapeType.rect, { x: cmpX, y: ry, w: cmpW, h: 0.34, fill: { color: bgColor } }); + s5.addText(row[0], { x: cmpX + 0.1, y: ry, w: 2.1, h: 0.34, fontSize: 7.5, color: C.white, valign: 'middle', fontFace: F }); + + [1, 2, 3].forEach((col) => { + const cx = cmpX + 2.2 + (col - 1) * 0.9 + (col === 3 ? 0.15 : 0); + const cw = col === 3 ? 1.1 : 0.9; + const val = row[col]; + let tc, tf; + if (val === 'O') { tc = C.primary; tf = true; } + else if (val === '△') { tc = C.accentYellow; tf = false; } + else { tc = C.gray; tf = false; } + s5.addText(val === 'O' ? '✓' : val === 'X' ? '—' : '△', { x: cx, y: ry, w: cw, h: 0.34, fontSize: 9, bold: tf, color: tc, align: 'center', valign: 'middle', fontFace: F }); + }); + }); + + // 우측: 프롬프트 엔진 차별점 + const peX = 5.85, peY = 1.05, peW = 3.85; + s5.addShape(pres.ShapeType.roundRect, { x: peX, y: peY, w: peW, h: 3.9, rectRadius: 0.12, fill: { color: C.bgCard }, line: { color: C.blue, width: 1 } }); + s5.addText('프롬프트 엔지니어링 핵심', { x: peX + 0.15, y: peY + 0.1, w: peW - 0.3, h: 0.3, fontSize: 9.5, bold: true, color: C.blue, fontFace: F }); + s5.addShape(pres.ShapeType.rect, { x: peX + 0.15, y: peY + 0.42, w: peW - 0.3, h: 0.01, fill: { color: C.line } }); + + const peItems = [ + { icon: '4', label: '계층 규칙 상속', desc: '전역→SAM→서비스→문서\n합산 3,000줄+ 규칙', color: '1565C0' }, + { icon: '20만', label: '도메인 지식 베이스', desc: '산업 특화 규칙을\nAI가 자동 참조', color: '00838F' }, + { icon: '57', label: '스킬+에이전트', desc: '45 스킬 + 12 에이전트\n코드 품질·보안·배포 자율 관리', color: '6A1B9A' }, + { icon: 'L3', label: '서버 안전 제어', desc: 'L1(읽기)·L2(승인)·L3(금지)\n실제 502 사고에서 도출', color: 'C62828' }, + ]; + + peItems.forEach((pe, i) => { + const py = peY + 0.5 + i * 0.85; + // 아이콘 서클 + s5.addShape(pres.ShapeType.ellipse, { x: peX + 0.2, y: py + 0.1, w: 0.5, h: 0.5, fill: { color: pe.color } }); + s5.addText(pe.icon, { x: peX + 0.2, y: py + 0.1, w: 0.5, h: 0.5, fontSize: pe.icon.length > 2 ? 7 : 12, bold: true, color: C.white, align: 'center', valign: 'middle', fontFace: F }); + // 라벨 + s5.addText(pe.label, { x: peX + 0.8, y: py + 0.05, w: 2.8, h: 0.22, fontSize: 9, bold: true, color: C.white, fontFace: F }); + // 설명 + s5.addText(pe.desc, { x: peX + 0.8, y: py + 0.3, w: 2.8, h: 0.4, fontSize: 7.5, color: C.gray, lineSpacingMultiple: 1.3, fontFace: F }); + }); + + // ═══════════════════════════════════════════════════ + // SLIDE 6: 실행 로드맵 + // ═══════════════════════════════════════════════════ + const s6 = pres.addSlide(); + s6.background = { fill: C.bgDark }; + addHeader(s6, pres, '실행 로드맵', C); + addConfidential(s6, pres); + addFooter(s6, pres, C, '6 / 6'); + + // 타임라인 바 + s6.addShape(pres.ShapeType.rect, { x: 0.7, y: 1.45, w: 8.6, h: 0.04, fill: { color: C.line } }); + + const phases = [ + { x: 0.7, w: 3.0, num: '1', period: '3~4월', title: '변리사 제출 자료 완성', color: '1565C0', + items: ['온보딩 자동화 흐름도', 'As-Is/To-Be 비교표', '청구항 초안 공동 작성', '선행기술 벤치마킹'] }, + { x: 3.9, w: 2.6, num: '2', period: '4월', title: '보완 개발', color: '00838F', + items: ['신용도 내부 평가 구현', 'AI 동적 설문 프로토타입', '업종 확장 사례 3건+'] }, + { x: 6.7, w: 2.6, num: '3', period: '5월~', title: '특허 출원', color: '2E7D32', + items: ['축1 플랫폼 방법특허 출원', '축2 알고리즘 특허 재검토', '명세서 보강 (실사용 데이터)'] }, + ]; + + phases.forEach((ph) => { + // 타임라인 위 노드 + s6.addShape(pres.ShapeType.ellipse, { x: ph.x + ph.w / 2 - 0.15, y: 1.32, w: 0.3, h: 0.3, fill: { color: ph.color } }); + s6.addText(ph.num, { x: ph.x + ph.w / 2 - 0.15, y: 1.32, w: 0.3, h: 0.3, fontSize: 11, bold: true, color: C.white, align: 'center', valign: 'middle', fontFace: F }); + + // 카드 + const cardY = 1.75; + s6.addShape(pres.ShapeType.roundRect, { x: ph.x, y: cardY, w: ph.w, h: 2.6, rectRadius: 0.1, fill: { color: C.bgCard }, line: { color: ph.color, width: 1 } }); + + // 기간 배지 + s6.addShape(pres.ShapeType.roundRect, { x: ph.x + 0.12, y: cardY + 0.1, w: 0.9, h: 0.28, rectRadius: 0.04, fill: { color: ph.color } }); + s6.addText(ph.period, { x: ph.x + 0.12, y: cardY + 0.1, w: 0.9, h: 0.28, fontSize: 8, bold: true, color: C.white, align: 'center', valign: 'middle', fontFace: F }); + + // 제목 + s6.addText(ph.title, { x: ph.x + 1.1, y: cardY + 0.08, w: ph.w - 1.3, h: 0.3, fontSize: 10, bold: true, color: C.white, fontFace: F }); + + // 구분선 + s6.addShape(pres.ShapeType.rect, { x: ph.x + 0.12, y: cardY + 0.48, w: ph.w - 0.24, h: 0.01, fill: { color: C.line } }); + + // 액션 아이템 + ph.items.forEach((item, j) => { + const iy = cardY + 0.58 + j * 0.45; + s6.addShape(pres.ShapeType.roundRect, { x: ph.x + 0.12, y: iy, w: ph.w - 0.24, h: 0.38, rectRadius: 0.05, fill: { color: C.bgCardAlt } }); + s6.addShape(pres.ShapeType.rect, { x: ph.x + 0.12, y: iy, w: 0.04, h: 0.38, fill: { color: ph.color } }); + s6.addText(item, { x: ph.x + 0.28, y: iy, w: ph.w - 0.52, h: 0.38, fontSize: 8, color: C.grayLight, valign: 'middle', fontFace: F }); + }); + }); + + // 하단: 시스템 규모 + 업종 확장 + const btmY = 4.55; + s6.addShape(pres.ShapeType.roundRect, { x: 0.4, y: btmY, w: 9.2, h: 0.6, rectRadius: 0.08, fill: { color: C.primaryLight }, line: { color: C.primary, width: 0.5 } }); + + const stats = [ + ['모델 267개', '라우트 1,327개', '서비스 332개', '마이그레이션 551개', '운영 2사'], + ]; + s6.addText([ + { text: '시스템 규모 ', options: { fontSize: 8, bold: true, color: C.primary } }, + { text: '모델 267개 | 라우트 1,327개 | 서비스 332개 | 마이그레이션 551개 | 운영 테넌트 2사', options: { fontSize: 8, color: C.grayLight } }, + ], { x: 0.55, y: btmY, w: 5.5, h: 0.6, valign: 'middle', fontFace: F }); + + s6.addText([ + { text: '확장 가능: ', options: { fontSize: 8, bold: true, color: C.accentYellow } }, + { text: '가구·철강·시공·유통·식품 (파일/설정 추가만으로)', options: { fontSize: 8, color: C.grayLight } }, + ], { x: 6.1, y: btmY, w: 3.4, h: 0.6, valign: 'middle', align: 'right', fontFace: F }); + + // ═══════════════════════════════════════════════════ + // 저장 + // ═══════════════════════════════════════════════════ + const outPath = '/home/aweso/sam/docs/patent-attorney-briefing-compact.pptx'; + await pres.writeFile({ fileName: outPath }); + console.log('PPTX created: ' + outPath); +} + +// ─── Helper Functions ────────────────────────────────── +function addHeader(slide, pres, title, C) { + slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.04, fill: { color: C.primary } }); + slide.addShape(pres.ShapeType.rect, { x: 0.35, y: 0.35, w: 0.06, h: 0.38, fill: { color: C.primary } }); + slide.addText(title, { x: 0.55, y: 0.28, w: 6, h: 0.5, fontSize: 18, bold: true, color: C.white, fontFace: 'Arial' }); +} + +function addFooter(slide, pres, C, pageNum) { + slide.addShape(pres.ShapeType.rect, { x: 0, y: 5.33, w: 10, h: 0.01, fill: { color: C.line } }); + slide.addText('(주)코드브릿지엑스 | SAM 특허 출원 브리핑', { + x: 0.35, y: 5.35, w: 5, h: 0.25, + fontSize: 7, color: C.gray, fontFace: 'Arial' + }); + slide.addText(pageNum, { + x: 7, y: 5.35, w: 2.7, h: 0.25, + fontSize: 7, color: C.gray, align: 'right', fontFace: 'Arial' + }); +} + +function addConfidential(slide, pres) { + slide.addShape(pres.ShapeType.roundRect, { x: 8.3, y: 0.15, w: 1.4, h: 0.35, rectRadius: 0.04, fill: { color: 'D32F2F' } }); + slide.addText('CONFIDENTIAL', { x: 8.3, y: 0.12, w: 1.4, h: 0.22, fontSize: 7, bold: true, color: 'FFFFFF', align: 'center', fontFace: 'Arial' }); + slide.addText('대 외 비', { x: 8.3, y: 0.28, w: 1.4, h: 0.22, fontSize: 8, bold: true, color: 'FFCDD2', align: 'center', fontFace: 'Arial' }); +} + +main().catch(console.error);