Compare commits

...

293 Commits

Author SHA1 Message Date
db63fcff85 refactor: [docs] 팀별 폴더 구조 재편 (공유/개발/프론트/기획)
- 개발팀 전용 폴더 dev/ 생성 (standards, guides, quickstart, changes, deploys, data, history, dev_plans 이동)
- 프론트엔드 전용 폴더 frontend/ 생성 (api/ → frontend/api-specs/)
- 기획팀 폴더 requests/ 생성
- plans/ → dev/dev_plans/ 이름 변경
- README.md 신규 (사람용 안내), INDEX.md 재작성 (Claude Code용)
- resources.md 신규 (노션 링크용, assets/brochure 이관 예정)
- CURRENT_WORKS.md 삭제, TODO.md → dev/ 이동
- 전체 참조 경로 업데이트

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 16:46:03 +09:00
7e1daca81b docs: [생산지시] 개발 계획 진행 상태 업데이트 (Phase 1~3 완료)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 16:42:08 +09:00
a320c85e94 docs: [quality] 품질관리 스토리보드 D1.9 분석 문서 작성
- 17장 슬라이드 기반 개발 참조용 MD 문서
- 화면별 상세 명세 (제품검사, 실적신고, 품질인정심사)
- 데이터 모델, 비즈니스 규칙, API 엔드포인트 설계 포함

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 16:37:31 +09:00
88726573bf docs: [plans] Phase 4.2 결재 연동 계획 문서 추가
- Document ↔ Approval 브릿지 설계 및 구현 계획
- 6단계 구현 완료 상태 기록

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 11:01:28 +09:00
김보곤
7a73e6c5a9 docs: [brochure] v1~v9 contact 이메일/무료 데모 삭제, 도메인 sam.it.kr 변경 및 PPTX 재생성
- contact@sam.co.kr 행 삭제
- 무료 데모 관련 행 삭제
- www.sam.co.kr → www.sam.it.kr 변경
- v1~v9 1page + 2page PPTX 전체 재생성
2026-03-03 19:11:01 +09:00
김보곤
8e70987e42 docs: [brochure] v1~v9 브로슈어 SAM BI 브랜딩 통일
- (주)코드브릿지엑스 → SAM
- www.codebridge-x.com → www.sam.co.kr
- contact@codebridge-x.comcontact@sam.co.kr
- 푸터 문구 SAM — Smart Automation Management 통일
2026-03-03 18:58:37 +09:00
be0eb83f4f docs: [ops] .env 권한 장애 대응 문서 업데이트
- 08-troubleshooting: .env 권한 오류 → 500 에러 진단/조치 사례 추가
- 09-security: .env 권한 600→640 수정, vimrc backupcopy 설정 안내
- 02-daily-operations: .env 편집 시 주의사항 섹션 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 09:51:12 +09:00
김보곤
c2784e1fe7 docs: [standards] JSON options 컬럼 표준 정책 문서 작성
- 컬럼 분류 기준 (전용 컬럼 vs options JSON)
- 마이그레이션/모델/서비스 표준 패턴
- 구현 수준 4단계 가이드 (L1~L4)
- MySQL JSON 경로 쿼리 패턴
- 체크리스트 포함
2026-02-27 22:10:26 +09:00
김보곤
1f8a336bb6 docs: merge 충돌 해결 (INDEX.md) 2026-02-27 21:01:59 +09:00
bbf8f406de docs: [ops] MySQL 리플리케이션 설정 추가
- 운영→CI/CD binlog 기반 리플리케이션 구성 가이드
- codebridge DB 백업 권한, REPLICATION SLAVE 권한 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 18:03:33 +09:00
81f3c4deef docs: [종합정비] 계획 문서 추가
- docs/plans/docs-comprehensive-update-plan.md
- 11개 설계 결정(D1~D11), 4개 Phase 실행 기록 포함
- 상태: 전체 완료

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 18:03:30 +09:00
ae7e139d12 docs: [종합정비] Phase 3 신규 도메인 기능 문서 16개 작성
- features/esign/README.md: 전자서명 (4모델, 16 API)
- features/documents/README.md: 문서관리 (12모델, EAV 기반, 15 API)
- features/ai/README.md: AI 리포트 (Gemini 2.0, 4 API)
- features/equipment/README.md: 설비관리 (MNG 전용)
- features/finance/ 9개 하위문서: 입출금, 급여, 가지급금, 세금계산서,
  악성채권, 어음, 카드, 미지급비용, 채권현황, CEO 대시보드
- features/finance/README.md 재구조화 (14개 하위문서 목록)
- features/barobill-kakaotalk/README.md 확장 (API 설정 + 세금계산서)
- rules/numbering-rules.md: 채번규칙 (6세그먼트, 원자적 UPSERT)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 18:03:25 +09:00
d4e5f62413 docs: [종합정비] Phase 1 시스템 현황 문서 14개 작성
- system/overview.md: 전체 아키텍처 개요
- system/api-structure.md: API 구조 (220 모델, 1027 엔드포인트, 18 라우트 도메인)
- system/react-structure.md: React 구조 (249 페이지, 612 컴포넌트)
- system/mng-structure.md: MNG 구조 (171 컨트롤러, 436 Blade 뷰)
- system/docker-setup.md: Docker 7 컨테이너 구성
- system/database/README.md + 9개 도메인 스키마 (270+ 테이블)
  - core, hr, sales, production, finance, boards, files, system, erp-analysis

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 18:03:13 +09:00
0ace50b006 docs: [종합정비] 구조 재편 — Phase 0+2+4 통합
- Phase 0: INDEX.md 전면 재작성, CLAUDE.md→INDEX.md 통합 삭제
- Phase 0: front/→guides/ 이관(5개 파일), changes/ D7 포맷 통일(3개)
- Phase 0: guides/ai-config-설정.md→ai-config-settings.md D3 통일
- Phase 2: architecture/+specs/→system/ 이관(6개 이동, 4개 폐기)
- Phase 2: 13개 파일 경로 참조 수정 (specs/→system/, architecture/→system/)
- Phase 4: 7개 파일 11개 교차참조 깨진 링크 수정

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 18:03:04 +09:00
252cc00cda docs: [Phase 3] T2/T4 테스트 결과 업데이트 — 14/14 PASS
- T2: KSS01(S1) 벽면형/혼합형 검증 완료
- T4: S1/S2/S3 마감유형별 gap_points 차이 검증 완료

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 17:36:52 +09:00
baf5d0cd86 docs: [plans] Phase 3 UI 검증 결과 반영 — 12/14 PASS
- WO#141(KQTS01), WO#74(KSS02) 절곡 검사 성적서 모달 직접 확인
- API 기반 동적 구성품 로딩 + 측정값 정상 렌더링 검증
- 콘솔 에러 없음, T2/T4 조건부(테스트 데이터 부재)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 17:10:06 +09:00
f44d78de5d docs: [plans] Phase 3 완료 — 절곡 검사 동적 구현 5개 항목 기록
- integrated-phase-3.md: 3.1~3.5 전체 , 변경이력 추가
- integrated-master-plan.md: 상태 5/7, Phase 3 → 

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 16:36:38 +09:00
eb3260d61a docs: [plans] Phase 2B 테스트 결과 반영 — SQL 4건 + 단위테스트 4건 PASS 2026-02-27 16:04:54 +09:00
849a149831 docs: [plans] Phase 2B 완료 — 견적/품질 정합성 구현 기록
- Phase 2B 전 항목(2B.1~7)  완료, 검증 결과 기록
- 마스터 플랜 진행률 4/7 (Phase 0~2 완료)
2026-02-27 15:59:07 +09:00
123e670faa docs: [plans] Phase 2A 절곡 검사 분석/설계 완료 기록
- dynamic_bom 발견, 5130 갭 대조, inspection-config API 재설계
- 마스터 플랜 Phase 2A  상태 반영, 진행률 3/7
2026-02-27 15:46:37 +09:00
a81d3ed0e5 docs: [plans] Phase 1 테스트 케이스 10/10건 검증 완료
- SQL 검증 8건: 데이터 보정, NULL/빈문자열 처리, API 회귀 확인
- UI 검증 2건: WorkerScreen product_code 표시 + fallback 확인
2026-02-27 13:14:11 +09:00
9d9d769086 docs: [plans] Phase 0+1 완료, DB 밀어넣기 정책 반영
- Phase 0 조사 결과 기록 (product_code 0% → 보정 66.7%)
- Phase 1 전체 작업 항목 완료 처리
- 마이그레이션 파일 삭제, DB 1회 밀어넣기 정책 문서화
2026-02-27 12:26:32 +09:00
a1ff455d72 Revert "docs: [기획] SAM ERP 스토리보드 D1.0 이미지"
This reverts commit 7167da8acc.
2026-02-27 11:13:46 +09:00
7167da8acc docs: [기획] SAM ERP 스토리보드 D1.0 이미지 2026-02-27 11:13:15 +09:00
569fe37a49 docs: [이력] 서버 안티바이러스 설치 기록 2026-02-27 11:13:14 +09:00
5cc49c241e docs: [통합계획] 기능 단위 테스트 시나리오 11개 FU 추가
- integrated-test-scenarios.md: 기능 단위(FU) 11개 테스트 시나리오
- 각 FU별 화면 조작 순서, 기대 화면, DB 확인 쿼리, 엣지 케이스 포함
- 회귀 테스트 체크리스트 (스크린/슬랫)
- integrated-master-plan.md, INDEX.md 링크 추가
2026-02-27 10:56:57 +09:00
666c80c350 docs: [통합계획] 제품코드 추적성 + 검사 단위 구조 통합 계획 수립
- integrated-master-plan.md: 7 Phase 통합 마스터 (의존성 맵, 진행 관리)
- integrated-phase-0-1.md: 사전 조사 + product_code 전파 수정 상세
- integrated-phase-2.md: 절곡 분석/설계 + 견적/품질 개선 상세
- integrated-phase-3.md: 절곡 검사 동적 구현 상세
- 원본 2개 문서 아카이브 전환 (통합 문서 링크 추가)
- INDEX.md 통합 문서 등록
2026-02-27 10:15:19 +09:00
ed635f4aac docs: [품목추적] 제품코드 추적성 개선 계획서
- 견적→수주→생산→출하→품질 전 단계 product_code 추적성 확보
- Phase 1(P0): options 복사 누락 버그 수정 + 데이터 보정 + 프론트 표시
2026-02-27 09:46:00 +09:00
0b8b8a2860 docs: [검사문서] 개선 계획서 v2 — 리뷰 16건 정책 결정 반영
- C3 TemplateInspectionContent 통합 방향, BendingInspectionContent 레거시 동결
- C1 row_index=개소 통일, 구성품은 field_key 인코딩
- I5 inspection-config 범용 API (공정 자동 판별)
- I3 3관점 검사(구성품/개소/수주) 구조 방향
- I7 수주별 읽기 전용 뷰
- M2 API 응답 < 200ms 성능 기준 추가
- I6 테스트 케이스 17건으로 보강
2026-02-27 09:45:20 +09:00
bcb8bb26b3 docs: [검사문서] 리뷰 정책 결정 16건 전체 완료
CRITICAL (5건):
- C1: row_index=개소 통일, 구성품은 field_key 인코딩
- C2: EAV 전환, options 경로 병행 유지
- C3: TemplateInspectionContent 통합 방향
- C4: 현행 유지 → BOM 동적화 시 스냅샷+식별자 병행
- C5: product_code 전파 누락 버그 수정

IMPORTANT (7건):
- I1: DEFAULT_GAP_PROFILES 기준 통일
- I2: lockForUpdate + transaction 추가
- I3: 3관점(구성품/개소/수주) 지원, 주 입력=구성품별
- I4: 기각 — 템플릿 유무로 롤백 이미 가능
- I5: inspection-config API (공정 자동 판별)
- I6: 누락 테스트 케이스 구현 시 반영
- I7: 입력=개소별, 출력=수주별 읽기전용 뷰

MINOR (4건): M1~M4 모두 결정

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 09:26:26 +09:00
28b69e5449 docs: archive 37개 + COMPLETED 3개 복원 - 향후 docs/ 정식 문서화 시 참조용
- 완료 문서의 상세 내용은 추후 docs/ 구조화 시 정식 문서에 반영 예정
- HISTORY.md는 요약 인덱스로 유지, 개별 파일은 상세 참조용 보관

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 22:32:20 +09:00
730266f069 docs: plans 폴더 정리 - 53개 문서 삭제/통합, 가이드 및 히스토리 신규
- 5단계 분류(ACTIVE/PLANNED/SUPERSEDED/COMPLETED/OBSOLETE) 기반 정리
- SUPERSEDED 4개: 최신 문서에 대체 확인 후 삭제
- COMPLETED 3개: HISTORY.md에 요약 후 삭제
- OBSOLETE 1개: 일회성 핫픽스 이력 삭제
- archive/ 37개 개별 파일 → HISTORY.md 1파일로 통합 (40건 요약)
- sub/ 7개 + clodeCheck/ 7개 폴더 삭제
- GUIDE.md 신규: 문서 관리 최소 원칙 6개 (명명규칙, 필수섹션, 상태표기, 생명주기, 폴더구조, 인덱스관리)
- index_plans.md 재작성: ACTIVE 18개 + PLANNED 19개만 도메인별 그룹핑
- 정리 계획 문서(docs-plans-cleanup-plan.md) 포함

Before: 95파일 → After: 42파일 (56% 감소)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 22:32:20 +09:00
김보곤
73f7811da3 docs: [leave] 휴가관리 모듈 개발 계획서 작성
- Phase 1: 기본 휴가관리 (신청/승인/잔여연차/사용현황)
- Phase 2: 연차 정책 및 자동 계산 (근로기준법 기반)
- Phase 3: 연차 촉진, 알림, 리포트
- 기존 API 테이블 4개 활용
- 근태현황 vacation 기능 분리 전략 포함
2026-02-26 22:07:36 +09:00
김보곤
6b2d990d6a docs: [hr] 근태관리 기획서 작성
- 화면 구성, 데이터 구조, 비즈니스 규칙, API 엔드포인트 정리
- 1차 구현 완료 12건, 2차 고도화 예정 8건 목록
- INDEX.md에 문서 등록
2026-02-26 20:36:00 +09:00
김보곤
34f9cf41e7 docs: [barobill-kakaotalk] 알림톡 연동 완료 문서화 (트러블슈팅, v2 템플릿 가이드) 2026-02-26 20:36:00 +09:00
김보곤
95bbc90f93 docs: [guides] .env 동기화 문서 업데이트
- API 키 관리 방식 변경 반영 (DB → .env 전환)
- 공유 API 키 동기화 항목 추가 (Gemini, Vertex AI 등)
- .env.example 참조 안내 추가
- 누락 항목 현황 최신화
2026-02-26 20:36:00 +09:00
김보곤
f4ae2ee53a docs: [plans] ERP 스토리보드 D1.4 마크다운 변환 2026-02-26 20:36:00 +09:00
김보곤
113bf826ee docs: [plans] SAM ERP 스토리보드 D1.4 마크다운 변환
- 167페이지 PDF에서 추출한 원본 텍스트를 구조화된 마크다운으로 변환
- 14개 섹션, 146개 화면, 4개 플로우차트 포함
- UI 목업 노이즈 제거 및 Description 내용 보존
- INDEX.md에 문서 등록
2026-02-26 20:36:00 +09:00
김보곤
920d83c27a docs: [plans] ERP 회계관리 스토리보드 D1.6 마크다운 변환 문서 추가
- 65페이지 PDF를 AI 참조용 마크다운으로 변환
- 대시보드, 회계관리(7개 화면), 기준정보(5개 화면) 전체 수록
- 이관 기초자료 CSV 스펙 4종(거래처/거래내역/계좌내역/세금계산서) 포함
- INDEX.md에 plans/ 섹션 추가
2026-02-26 20:36:00 +09:00
김보곤
52720952ea docs: [architecture] SAM 10,000 테넌트 스케일링 로드맵 추가
- 5단계 로드맵: 캐시→수평확장→마이크로서비스→샤딩→엔터프라이즈
- SAM 특수 고려사항: tenant_id 샤딩, 권한 캐싱, 219개 테이블 분류
- INDEX.md에 문서 항목 추가
2026-02-26 20:36:00 +09:00
김보곤
472f6a1b44 docs: [guides] 서버 인프라 학습 시리즈 통합 PPTX 추가 2026-02-26 20:36:00 +09:00
김보곤
d2b4264b13 docs: [guides] 서버 인프라 학습 시리즈 연결
- 3개 가이드에 시리즈 배너 추가 (Part 1/2/3)
- 관련 문서 섹션에 시리즈 네비게이션 추가
- INDEX.md에 시리즈 순서 반영
2026-02-26 20:36:00 +09:00
김보곤
bb28e68847 docs: [guides] Nginx & FastCGI 초보자 가이드 추가
- Nginx 개념 (웹서버, 리버스 프록시, SSL 종료)
- FastCGI 프로토콜 (CGI→FastCGI 발전, 바이너리 프로토콜)
- nginx.conf 설정 해부 (try_files, fastcgi_pass, SCRIPT_FILENAME)
- SAM 2계층 Nginx 구조 및 도메인별 라우팅
- FastCGI vs HTTP 프록시 비교
- PPTX 프레젠테이션 포함
2026-02-26 20:36:00 +09:00
김보곤
07fb6bb535 docs: [guides] PHP-FPM 초보자 가이드 PPTX 추가 2026-02-26 20:36:00 +09:00
김보곤
d406e54fcf docs: [guides] PHP-FPM 초보자 가이드 추가
- PHP-FPM 개념, 역사(CGI→mod_php→PHP-FPM), 구조 설명
- Nginx-PHP-FPM 관계 및 FastCGI 프로토콜
- SAM 컨테이너별 설정(www.conf) 상세
- 자주 묻는 질문 (502 에러, 워커 부족, 재시작 등)
2026-02-26 20:36:00 +09:00
김보곤
86ea901de0 docs: [guides] Jenkins 셋업 가이드 작성
- Jenkins 이해하기 (용어, CI/CD 개념)
- 사전 준비 (Swap, Java, 방화벽)
- 설치 및 초기 설정
- 필수 플러그인 설치
- Credential 설정 (SSH, Gitea, Slack)
- Gitea Webhook 연동
- Jenkinsfile 작성 가이드
- 트러블슈팅 & FAQ
2026-02-26 20:36:00 +09:00
김보곤
c726e0852e docs: [plans] 운영 환경 배포 계획서 작성
- 12개 섹션 구성: 환경 전략, 서버 아키텍처, CI/CD, DB, 보안 등
- Jenkins CI/CD 파이프라인 설계 (4개 저장소)
- 단계별 마이그레이션 체크리스트 (Phase 1~4)
- INDEX.md에 문서 등록
2026-02-26 20:36:00 +09:00
김보곤
3847483090 docs: CLAUDE.md 전역 설정 추가
- PPT 제작 규칙 (회사명, BI 로고, 금지 사항)
- Git 커밋/푸시 정책, 서버 접근 금지 등 전역 규칙
2026-02-26 20:36:00 +09:00
94d65b8211 docs:E-Sign TCPDF 폰트 정의 파일 오류 트러블슈팅 추가
- TCPDF font definition file 오류 원인/진단/해결 문서화
- 개발 vs 운영 환경 차이 (vendor 권한) 비교표 추가
- registerKoreanFont() 코드 수정 배경 설명
- 긴급 임시 조치 명령어 포함
2026-02-26 15:47:49 +09:00
dbcfe65692 docs:MNG storage/logs 심링크 변경 및 E-Sign PDF 트러블슈팅 추가
- 05-deployment: MNG Jenkinsfile/수동배포 storage/logs 심링크 방식 반영
- 08-troubleshooting: 전자계약 PDF 서명 합성 오류 진단/조치 가이드 추가
- 08-troubleshooting: MNG 500 에러 섹션 로그 경로 shared로 업데이트

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 14:39:50 +09:00
dc8b3ae0c9 docs: 운영서버 SMTP 메일 설정 가이드 추가
- api/mng 프로젝트별 SMTP 설정 정보
- Google 앱 비밀번호 관리 주의사항
- 트러블슈팅 가이드 (535 인증 실패 등)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 13:41:18 +09:00
87482be2b1 docs: 운영서버 LibreOffice 및 폰트 설치 가이드 추가
- LibreOffice 24.2.7 헤드리스 문서 변환 설정
- Pretendard (9 웨이트), Nanum, Noto CJK 폰트 설치 정보
- 폰트 관리 명령어 및 추가 절차

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 13:37:01 +09:00
8a00a9ec7d docs: 배포 가이드 Jenkinsfile 코드 블록에 커밋 메시지 알림 반영
- 3개 Jenkinsfile(react, api, mng) 코드 블록 업데이트
- Checkout 단계: checkout scm → GIT_COMMIT_MSG 캡처 → slackSend 순서
- 모든 slackSend 메시지에 ${env.GIT_COMMIT_MSG} 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 12:54:42 +09:00
46c5e23972 docs:배포 가이드 현행화 — 동시빌드방지, 승인알림, 환경파일 변경 반영
- 전체 Jenkinsfile에 disableConcurrentBuilds() 반영
- react/api Production Approval에 #product_deploy Slack 알림 추가
- react 환경파일 .env.local → .env.production 변경 반영
- Slack 알림 채널 테이블 추가 (#product_infra, #product_deploy)
- 환경변수 파일 테이블 DEV_TOOLBAR 컬럼 추가
- 수동 배포 섹션 .env.production 반영

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 11:37:03 +09:00
4d9a044243 docs:MNG 배포 문서 업데이트 — Jenkinsfile 권한 수정 반영
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 11:23:35 +09:00
a68a9ba098 docs:MNG 500 에러 진단 결과 반영 — php8.4-soap 설치, 로그 경로/권한 문서화
- 11-server-setup: PHP 확장 목록에 php8.4-soap 추가
- 02-daily-operations: MNG 로그 경로 수정 (shared → current, 심링크 아님)
- 03-service-prod: Redis 용도 정확하게 테이블로 정리 (캐시=redis, 세션=database)
- 05-deployment: MNG 배포 시 storage/logs 권한 경고 추가, 배포 후 확인에 MNG 로그 추가
- 08-troubleshooting: MNG 500 에러 트러블슈팅 사례 추가 (2026-02-25 실제 사례)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 10:48:23 +09:00
7922745bea docs:ops-manual 누락 항목 보강 — DB 동기화, PM2, MySQL 업그레이드
- 10-backup-recovery: 개발→운영 DB 동기화 절차 추가
- 05-deployment: Jenkins env-files에 APP_ENV 컬럼 및 접두사 설명 추가
- 11-server-setup: 개발서버 PM2 설정, MySQL 8.0→8.4 업그레이드 절차 추가
- 11-server-setup: 개발서버 MySQL 버전 8.0.45→8.4.8 반영

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 04:33:12 +09:00
cba43034ef docs:개발서버 MySQL 8.0→8.4 업그레이드 반영
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 00:55:58 +09:00
93803da56f docs:모니터링 문서에 개발서버(sam-dev) 추가 반영
- 아키텍처 다이어그램에 개발서버 라인 추가
- Prometheus 스크래핑 설정에 sam-dev job 반영
- 스크래핑 대상 추가 가이드에 node_exporter 설치, 방화벽 허용 절차 보강

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 00:51:29 +09:00
47586a2922 docs:CI/CD 서버 4vCPU 업그레이드 반영, 타이틀 접두사 설정 문서화
- CI/CD 서버 CPU 2 vCPU → 4 vCPU 업데이트
- 환경별 타이틀 접두사 ([L]/[D]) 설정 방법 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 00:37:24 +09:00
4610ae128b docs: ops-manual 배포 가이드 현행화
- 05-deployment.md: Jenkinsfile 코드블록 전체 현행화
  - React/API/MNG: slackSend + tokenCredentialId 추가
  - API/MNG: mkdir-p bootstrap/cache, storage/framework 추가
  - MNG: npm install --production=false → --prefer-offline
  - 수동배포 섹션: mkdir-p 추가, 단계 번호 재정렬
  - 빌드 실패 트러블슈팅: Laravel 디렉토리 누락 항목 추가
- 07-monitoring.md: Contact Point TODO → 실제 설정 완료 내용 반영

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 23:53:56 +09:00
48ef98e20a docs:도메인 스왑 반영 — admin.codebridge-x.com ↔ mng.codebridge-x.com
운영: admin.codebridge-x.com → mng.codebridge-x.com
개발: mng.codebridge-x.com → admin.codebridge-x.com

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 22:40:20 +09:00
50899c6a0e docs:백업 자동화 문서 보강 — 크론 설정, sam_stage 동기화 절차 추가
- 10-backup-recovery.md: CI/CD 자동 백업 상세화 (스크립트, 크론, 복원 절차), sam→sam_stage 동기화 절차 신규
- 11-server-setup.md: CI/CD ⑪ 백업 자동화 설치 가이드, ⑫ 최종 점검 추가, PM2 stage 메모리 실제값 반영

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 22:14:32 +09:00
47fdf147c3 docs:ops-manual 서버 점검 결과 반영 — Grafana 알림, 개발서버 보안, 백업 설정
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 20:45:48 +09:00
801c9ddfd5 docs(DOC): Jenkins 보안 강화 — Java 21 업그레이드, CSP 활성화, 분산 빌드 설정
- Java 17 → 21 업그레이드 (17은 2026-03-31 지원 종료)
- CSP(Content Security Policy) JVM 옵션 추가
- Built-in Node executor 0으로 변경, local-agent 분산 빌드 구성
- 운영 매뉴얼 3개 파일 업데이트 (01, 04, 11)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 17:15:25 +09:00
5a6859ce23 docs(DOC): ops-manual 2-Branch 전략 반영 — stage 브랜치 제거, Jenkins 승인 기반 배포
- 04-service-cicd: credential 타입 수정, Nginx 설정 추가, 동기화 브랜치 테이블 업데이트
- 05-deployment: 파이프라인 설정/흐름도/Jenkinsfile 전면 개편 (develop+main 2-Branch)
- React/API: main push → Stage 자동배포 → Jenkins 승인 → Production 배포
- MNG/Sales: main push → Production 직접 배포

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 15:56:50 +09:00
9610feafc0 docs(DOC): 운영 매뉴얼 구조화 — ops-manual/ 11개 주제별 파일로 재구성
- 운영/CI/CD 서버 셋업 가이드를 ops-manual/에 통합
- 11-server-setup.md: 운영+CI/CD 서버 설치 절차 통합
- 05-deployment.md: Jenkinsfile 코드, Git 동기화 전략, 배포 흐름도 추가
- 원본 파일 삭제: production-server-setup.md, cicd-server-setup.md

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 10:02:48 +09:00
a11fe745b6 docs(DOC): CI/CD 서버 셋팅 가이드 — 배포 파이프라인 검증 완료
- react develop 파이프라인 E2E 검증 완료 (Jenkins Build #3 SUCCESS)
- Jenkinsfile rsync trailing slash 버그 수정 반영 (.next/ → .next)
- 환경별 .env 파일 설정 및 도메인 매핑 정보 추가
- Prometheus localhost 바인딩 반영 (보안)
- 설치 순서 ⑩⑪⑫ 완료 표시, 상태 업데이트

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 10:02:48 +09:00
a3ef921a4f docs: 운영/CI/CD 서버 셋팅 가이드 추가
- 운영서버(211.117.60.189) 전체 설치 완료 문서화
  - OS, MySQL 8.4.8, Redis 7.0.15, Nginx 1.24.0, PHP 8.4.18
  - 7개 도메인 SSL (develop@codebridge-x.com), PM2 cluster
  - Supervisor queue worker, node_exporter, 보안 설정
- CI/CD 서버(110.10.147.46) 셋팅 가이드 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 10:02:48 +09:00
3fff99095e docs: 절곡/품목 관련 신규 계획 문서 추가
- 절곡 정보 자동 생성 계획 (bending-info-auto-generation)
- 절곡 자재투입 매핑 GAP 분석 (bending-material-input-mapping)
- FG 코드 통합 계획 (fg-code-consolidation)
- 품목 재고 관리 계획 (item-inventory-management)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 10:02:47 +09:00
da2839c4d0 docs: 문서관리 시스템 및 채번규칙 계획 문서 업데이트
- 문서관리 시스템 계획/변경이력/마스터 진행상황 반영
- 중간검사 서식 계획 신규 추가
- 채번규칙 관리 계획 상세화 (1767줄 확장)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 10:02:47 +09:00
25cdd12405 docs: 내화실 품목 업데이트 배포 SQL 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 10:02:47 +09:00
c2c5765e31 chore: 작업현황 정리
- 이전 작업 이력 정리, 최근 커밋 참고용으로 축약

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 10:02:47 +09:00
06a4c798ec chore: 완료 계획 문서 22개 archive 이동 및 인덱스 업데이트
- 완료된 계획 문서 22개를 plans/archive/로 이동
  - tracked 16개 (git mv): bending-lot-pipeline, docs-update, fcm-notification 등
  - untracked 6개 (mv): bending-worklog, formula-engine, mng-item 등
- index_plans.md 전면 업데이트
  - 진행중 44개 / 완료 37개 현황 반영
  - 각 문서별 실제 진행률 기재 (0%~94%)
  - 카테고리별 재정리 (견적/생산/품목/문서/마이그레이션/시스템/UI)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 10:02:47 +09:00
4da9e12dc0 docs: 절곡 자재투입 LOT 매핑 파이프라인 개발 계획 완료 (13/13)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 10:02:47 +09:00
ff71729342 docs: 절곡품 선생산→재고적재 계획 완료 (14/14, 100%)
- Phase 3.5 마이그레이션 커맨드 작성 완료 반영

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 10:02:47 +09:00
51179224e3 docs: 절곡품 선생산→재고적재 개발 계획 문서 추가
- Phase 1~3 구현 완료 상태 반영 (13/14, 93%)
- 레거시 5130 갭 분석, SAM 재고 시스템 통합 설계
- Phase 3.5 마이그레이션은 별도 진행 예정

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 10:02:47 +09:00
c9899eed81 docs:문서관리 마스터/작업일지 계획 문서 업데이트 (Phase 5.3 mng 상세보기 완료 반영)
- 결정사항 #13~#16 추가 (bf_ 분기, 개소별 LOT, 취소 상쇄, 자재 투입 방식 변경 요청)
- mng 작업일지 상세보기 작업 항목 α.1~α.7 추가
- mng 데이터 흐름도, 핵심 파일 경로, 변경 이력 갱신

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 10:02:47 +09:00
f1bc504db6 docs: 내화실 품목 업데이트 배포 SQL 추가
- tenant_id=287 대상 내화실(80019) 품목 데이터 업데이트
- code, name, unit, attributes, options 변경

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 10:02:47 +09:00
0e9559fcd8 docs: 개발 계획 문서 5건 추가
- db-trigger-audit-system-plan.md
- intermediate-inspection-report-plan.md
- mng-numbering-rule-management-plan.md
- quote-order-sync-improvement-plan.md
- tenant-numbering-system-plan.md

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 10:02:47 +09:00
6b8b70a74f docs: BOM 품목 매핑, 수주 개소관리, 배포 가이드 문서 추가
- BOM 품목 매핑 분석 및 계획 문서
- 수주 개소(노드) 관리 계획 문서
- 배포 가이드 문서
- 수입검사 양식 변경 이력 업데이트

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 10:02:47 +09:00
김보곤
02a892f8b8 docs: [과금정책] 3분할 문서 완성 및 브랜딩 정리
- billing-policy.md 3분할: customer-pricing.md, partner-commission.md, billing-policy.md
- 3개 프레젠테이션 HTML 슬라이드 및 PPTX 생성 (총 20장)
- customer-pricing: 고객용 요금 안내 (7장, 블루 테마)
- partner-commission: 영업파트너 수당 체계 (6장, 그린 테마)
- billing-policy: 내부 대외비 과금정책 (7장, 레드 테마)
- 전체 슬라이드 BI 로고 삽입 및 주일/경동 → (주)코드브릿지엑스 전환
- esign-storyboard.pptx 내 브랜딩 텍스트 수정
- INDEX.md 업데이트
2026-02-21 21:13:46 +09:00
김보곤
661ed0fdb3 docs: [브랜딩] 주일/경동 → (주)코드브릿지엑스 전환
- e-sign 프로젝트 문서 회사명 교체
- legacy-5130 문서 회사명 교체
- SAM BI 이미지 7종 assets/bi/에 추가
2026-02-21 20:47:11 +09:00
김보곤
725f3209cb docs: [과금정책] 고객용 요금 안내 프레젠테이션 슬라이드 7장 전면 재작성
- html2pptx 호환성 규칙 준수 (table 태그 제거, div+flexbox 대체)
- 표지에 키 벨류 카드 3개 추가 (업무 자동화, 인건비 절감, 실시간 현황)
- 기본 서비스 요금에 BEST SELLER 배지 및 감성 문구 추가
- 추가 옵션을 6개 카드 그리드로 시각적 재구성
- AI 토큰 활용 예시 설득 문구 강화
- 바로빌 부가서비스 테이블을 div+flexbox 행으로 변환
- 마무리 슬라이드에 핵심 가치 태그 3개 추가
2026-02-21 20:28:05 +09:00
김보곤
c14c19f908 docs: [guides] 운영 전환 시 .env 동기화 절차 문서 작성
- MNG/API 간 설정 관리 아키텍처 정리
- 바로빌 DB 우선, .env 폴백 구조 문서화
- 7단계 운영 전환 절차 및 롤백 방법
- MNG .env 누락 항목 목록 정리
2026-02-21 10:06:58 +09:00
김보곤
c52e502ac1 docs: [git] fix 타입 판단 기준 및 커밋 빈도 가이드 추가
- fix vs feat vs refactor 판단 기준표 추가
- 커밋 빈도 가이드: 논리적 단위로 커밋 원칙
- 의미 있는 변경 기준 및 실제 예시 포함
2026-02-20 21:36:39 +09:00
김보곤
9c1ec1a6eb docs:법인카드 대시보드 기술문서 작성
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 20:06:32 +09:00
김보곤
bbcb9406db docs:카카오톡 알림톡 채널 등록 완료 기록 및 템플릿 등록 가이드 작성
- 카카오톡 채널(@codebridge) 개설 및 바로빌 연동 완료 상태 반영
- 알림톡 템플릿 2종(서명요청, 리마인드) 심사 접수 내용 기록
- 코드-템플릿 변수 매핑, 서버 환경 설정, 심사 후 TODO 포함

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 14:44:15 +09:00
김보곤
6c3c16c66b docs:카카오톡 개발문서에 전자계약 계획서 링크 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 16:05:41 +09:00
김보곤
4b8b00e185 docs:전자계약 알림톡 연동 계획서 작성
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 16:04:30 +09:00
김보곤
9ea83b8b7d docs:카카오톡 개발문서에 전자계약 알림톡 연동 계획 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 15:41:05 +09:00
김보곤
579965ed5c docs:바로빌 카카오톡 연동 개발문서 초안 작성
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 15:09:45 +09:00
김보곤
aab9dc0799 docs:E-Sign 기술 스택 문서 업데이트 (실제 구현 반영)
- FPDI/FPDF → FPDI/TCPDF (PDF 서명 합성, MNG PdfSignatureService)
- DOCX→PDF 변환 추가 (LibreOffice headless, MNG DocxToPdfConverter)
- GD 확장, 나눔 폰트, Lucide 아이콘 등 실제 사용 기술 반영
- 4개 문서 일괄 업데이트 (technical-design, implementation-guide, operations-guide, changelog)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 13:02:16 +09:00
김보곤
d88ee4b67e docs:E-Sign 기술 설계 문서 v1.1 업데이트 - 필드 템플릿 & 복사 기능
- DB 스키마: esign_field_templates, esign_field_template_items 추가
- API 명세: 5.3 필드 템플릿 API 섹션 추가 (5개 엔드포인트)
- 화면 목록: ES_FIELDS 화면에 템플릿 기능 설명 추가
- 구현 파일: 신규 마이그레이션 2개, 모델 2개 추가
- 모델 관계도: EsignFieldTemplate, EsignFieldTemplateItem 추가
- 로드맵: Phase 3.5 필드 템플릿(구현 완료) 추가
- 사용자 가이드: 16장 필드 템플릿 사용법 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 18:19:16 +09:00
김보곤
40ce95fa55 docs:E-Sign 변경 이력(Changelog) 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 08:58:06 +09:00
김보곤
621bb911db docs:E-Sign API 명세서 추가 (16개 엔드포인트)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 08:56:29 +09:00
김보곤
b46909865f docs:E-Sign 운영/배포 가이드 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 08:49:35 +09:00
김보곤
02d1893bd0 docs:E-Sign 사용자 매뉴얼 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 08:38:23 +09:00
김보곤
7c1fb72161 docs:E-Sign 테스트 계획서 추가 (159개 TC)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 08:34:54 +09:00
김보곤
8dc8fe0d0b docs:E-Sign 기술 설계 문서 보완 (실제 구현 반영)
- 테이블명 수정 (contracts→esign_contracts 등 4개)
- 서비스 클래스명 실제 구현과 일치 (4개→4개)
- 계약코드 형식 수정 (ESIGN-→ES-YYYYMMDD-XXXXXX)
- OTP 시도횟수 수정 (3회→5회)
- 좌표 단위 수정 (pt→% 0~100)
- 구현 파일 구조 섹션 추가 (API 19개, MNG 12개)
- 모델 상세 섹션 추가 (Traits, 상수, 관계도)
- FormRequest 검증 규칙 섹션 추가 (4개)
- 에러 처리 패턴 및 i18n 메시지 키 섹션 추가
- Multi-tenant 아키텍처 섹션 추가
- 프론트엔드 아키텍처 섹션 추가 (React 하이브리드, HTMX)
- 미구현 기능 목록 섹션 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 08:27:09 +09:00
김보곤
23170df19b docs:E-Sign 요구사항 정의서 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 08:10:28 +09:00
김보곤
0c8c9f67c6 docs:E-Sign 기술설계 문서 + 스토리보드 PPTX 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 07:40:52 +09:00
김보곤
5f44e83aaf docs:E-Sign 전자계약 구현 가이드 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 07:26:40 +09:00
김보곤
c5b1eb050e docs:영업/매출관리 개발문서 추가 (7개 메뉴)
- 영업관리 대시보드: 수당 현황, 테넌트 진행률, 파트너 활동
- 파트너관리: 영업파트너 CRUD, 역할 관리, 서류 관리
- 영업파트너승인: 신규 파트너 신청 승인/반려 워크플로우
- 상품관리: 카테고리별 상품, 가격/수당률 설정
- 고객관리(관리자): 전사 고객 현황, 본사 진행상태 8단계
- 영업파트너 고객관리: 명함등록 기반 영업권, 테넌트 전환
- 인터뷰 시나리오: 질문 템플릿, 세션 기반 인터뷰 기록

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 17:04:06 +09:00
김보곤
157e8a95d5 docs:고객/거래처/채권관리 개발문서 추가 (5개 메뉴)
- 거래처관리: vendor/freelancer 타입, OCR 명함인식
- 고객사관리: VIP/Gold/Silver/Bronze 등급, 업종별 관리
- 미수금관리: 부분/전액 수금, 연체 추적, API 서비스
- 미지급금관리: 부분/전액 지급, 세금계산서 추적
- 환불/해지관리: 승인 워크플로우, refund/cancel 타입

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 16:54:06 +09:00
김보곤
8faf5afa8b docs:정산관리 개발문서 추가 (4개 메뉴)
- 영업수수료정산: 입금등록, 수당자동계산, 승인프로세스, 지급추적
- 컨설팅비용정산: 상담시간×시급 정산, 상태관리
- 고객사정산: 월별 매출/수수료/비용 순정산액 관리
- 구독료정산: 플랜별 과금, MRR/ARR 집계, 구독 라이프사이클

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 16:47:22 +09:00
김보곤
a23e2560ac docs:카드/차량관리 개발문서 추가 (5개 메뉴)
- 법인카드관리: 카드 CRUD, 결제일 휴일조정, 사용금액 집계, 선불결제
- 카드사용내역: 바로빌 SOAP 연동, 분개, 거래숨김, 금액수정
- 차량목록: 법인/렌트/리스 차량 등록, 주행거리 자동계산
- 차량일지: 운행기록, 용도별 통계, 출발↔도착 교환
- 정비이력: 카테고리별 비용 관리, 주행거리 자동갱신

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 16:31:25 +09:00
김보곤
2950038b72 docs:재무/자금관리 개발문서 작성 (5개 기능)
- 재무 대시보드 (finance-dashboard.md)
- 일일자금일보 (daily-fund-report.md)
- 자금계획일정 (fund-schedules.md)
- 보유계좌관리 (bank-accounts.md)
- 계좌입출금내역 (account-transactions.md)
- README.md (전체 개요)
2026-02-11 16:17:48 +09:00
김보곤
397b3ba711 docs:음성입력 STT 가이드 v1.1 - Alpine.js 구현 패턴 추가
- 영업 전략 시나리오 / 매니저 상담 프로세스 STT 개선 내용 반영
- Alpine.js vs React 구현 비교표
- Alpine.js startSpeechRecognition() 코드 + 프리뷰 패널 Blade 코드
- 영업 시나리오 추가 기능 (음성 녹음, 파형 시각화, GCS 백업, 재생)
- 데이터 흐름도 (MediaRecorder + STT + 서버 저장)
- onend 자동 재시작 패턴 (긴 녹음 대응)
- 참조 구현 파일 목록 확장

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 09:20:49 +09:00
김보곤
2ed9d07901 docs:음성입력(STT) 기술 가이드 문서 작성
- Web Speech API 기반 VoiceInputButton 컴포넌트 상세 설명
- interim/final 텍스트 렌더링 규칙, 프리뷰 패널 UI 스펙
- SpeechRecognition 설정 옵션, 이벤트 핸들러 상세
- 새 페이지 적용 체크리스트 (프론트/백엔드)
- 백엔드 STT 사용량 추적 (AiTokenHelper) 패턴
- 트러블슈팅 가이드 (HTTPS, 권한, 언마운트 등)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 09:09:41 +09:00
김보곤
0da6b4638e docs:영업파트너 가이드북에 승인 프로세스 추가
- 개발 승인 프로세스 섹션 추가 (8단계 개발 진행 상태)
- 영업파트너 승인 섹션 추가 (가입 승인, 지급 승인)
- 관련 FAQ 항목 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-10 09:09:41 +09:00
김보곤
7272a049b2 docs:영업파트너가이드북 시나리오 섹션 업데이트
- 영업 시나리오 6단계를 실제 시스템 설정에 맞게 수정
  (사전 준비 → 접근 및 탐색 → 현장 진단 → 솔루션 제안 → 협상 및 조율 → 계약 체결)
- 매니저 시나리오 6단계를 실제 시스템 설정에 맞게 수정
  (영업 이관 → 요구사항 파악 → 개발자 협의 → 제안 및 견적 → 조율 및 협상 → 착수 및 계약)
- 각 단계별 주요 활동 상세 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-10 09:09:41 +09:00
d89c52e3c7 Merge remote-tracking branch 'origin/main' 2026-02-06 15:47:08 +09:00
c65e36d05c docs: 수입검사 양식 Phase 1-5 완료 상태 업데이트
## 변경 사항
- Phase 1 완료 (7/8): EGI 품목 10건 연결, SUS 절곡코일/슬랫/절곡코일 통합
  - SS400 철판은 RM 품목 없어 대기 상태
- Phase 3 완료: 화이바글라스(25), 실리카(26), 와이어글라스(27), 방화유리(28)
- Phase 4 부분 완료: 전동개폐기(29), 내화실(30)
  - 베어링부, 내화충진재는 품목 미등록
- Phase 5 통합 완료: 와이어글라스(대한) → id:27 통합
  - 세라크울은 품목 미등록

## 진행률
- 19/23 (83% 완료)
- 남은 4종: SS400, 베어링부, 내화충진재, 세라크울 (품목 미등록)

## DB 변경
- EGI 양식(id:18) linked_item_ids 업데이트: 10건 연결

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 19:35:10 +09:00
b448b2a38e docs: 수입검사 양식 Phase 3-4 진행 상태 업데이트
## 변경 사항
- Phase 3 (직물류 4종) 완료 표시
  - 화이바글라스 (id:25)
  - 실리카 (id:26)
  - 와이어글라스 (id:27)
  - 방화유리 (id:28)
- Phase 4 (부자재) 부분 완료 표시
  - 전동개폐기 (id:29) - 13건 품목 연결
  - 내화실 (id:30) - 1건 품목 연결
  - 연동폐쇄기구, 베어링부, 내화충진재 → 품목 미등록 상태
- Phase 5 통합 완료 표시
  - 와이어글라스(대한) → 3.3과 통합

## 진행률
- 13/23 양식 (57% 완료)
- 생성된 template id: 18~30

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 19:32:35 +09:00
4d0dd4bf6e docs: Phase 2 구조재 양식 4종 생성 완료
- 2.1 앵글하부 (id:21) - 품목 4건
- 2.2 마환봉 (id:22) - 품목 6건
- 2.3 각파이프 (id:23) - 품목 1건
- 2.4 샤프트 (id:24) - 품목 9건
- 진행률: 7/23

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 19:28:41 +09:00
f387a6bb3f docs: 앵글 수입검사 양식 생성 진행 상태 업데이트
- Phase 1.8 앵글 양식 생성 완료 (id:20)
- 앵글 품목 2건 연결 (H0003, H0004)
- 진행률: 3/23 (EGI, SUS 절곡판, 앵글)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 19:24:50 +09:00
718992b3ca docs: SUS 절곡판 수입검사 양식 계획 및 변경 이력 추가
- 수입검사 양식 전환 계획 문서 추가 (plans/incoming-inspection-templates-plan.md)
- SUS 양식(id:19) 생성 변경 이력 문서 추가 (changes/20260205_sus_inspection_template.md)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 19:22:22 +09:00
ff237185f1 docs:문서 resolve/upsert API 연동 가이드 추가
- 시스템 플로우 다이어그램
- Resolve/Upsert API 스펙
- TypeScript 타입 정의
- React Hook/컴포넌트 예제
- Auto-highlight 로직
- 에러 처리 패턴
- 다양한 케이스 예제

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 14:46:15 +09:00
7fe8a832e6 Merge remote-tracking branch 'origin/main' 2026-02-01 20:42:44 +09:00
2bbf220dc8 docs:견적관리 분석 문서 및 INDEX 업데이트
- INDEX.md 업데이트
- 견적관리 URL 마이그레이션 계획 수정
- API 분석 리포트, tenant-id 준수 계획 추가
- 견적관리 기능 문서 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 20:37:04 +09:00
pro
3b68847bb6 docs:메뉴 뱃지 기능 가이드 추가
- 사이드바 메뉴 뱃지 구현 방법
- ViewServiceProvider에서 View::share 사용 필수
- 새로운 뱃지 추가 방법 안내

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 16:52:05 +09:00
pro
ec74d63120 docs:mng/claudedocs 가이드 문서들 guides 폴더로 이동
이동된 파일:
- 2025-12-02_file-attachment-feature.md
- ai-config-설정.md
- archive-restore-feature-analysis.md
- barobill-members-migration.md
- super-admin-protection.md
- 명함추출로직.md
- 모달창_생성시_유의사항.md
- 상품관리정보.md
- 수당지급.md
- 영업파트너구조.md
- 홈택스 매입매출 조회성공.md

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 16:29:16 +09:00
pro
538fda6abb docs:가이드북 폴더 구조 정리
- guides/ 폴더 생성
- 영업파트너 가이드북 → guides/영업파트너가이드북.md 이동

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 16:27:10 +09:00
pro
ba71efa615 docs:영업파트너 가이드북 추가
- 시스템 접속 및 로그인 안내
- 영업관리 대시보드 사용법 (내 활동/유치 파트너 현황 탭)
- 영업권(명함) 등록 가이드
- 계약 진행 관리 (영업/매니저 시나리오)
- 수당 확인 방법 및 지급 일정
- 파트너 유치 안내
- 자주 묻는 질문

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 16:27:10 +09:00
41a2c442c6 docs:Phase 4.3 완료 - 문서 데이터 입력/저장 연동 검증 (진행률 80%)
- Phase 2.2~2.3에서 이미 완전 구현 확인 (추가 코드 작업 없음)
- edit.blade.php JS→DocumentApiController→saveDocumentData() EAV 저장 정상
- 판정(적합/부적합) select + 종합판정 Footer 저장 확인
- 6.2 결정사항 #2(프론트 입력, 결과만 저장) 적용됨

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 09:58:52 +09:00
03eebc56e2 docs: [품목기준정비] 2B 프론트엔드 검증 완료 + RM display_condition 수정
- 품목관리 페이지에서 FG/PT/RM 폼 렌더링 검증 완료
- FG: 모델명/대분류/마감유형/설치유형 4개 신규 필드 정상 표시
- PT: Part_type=조립부품 → 측면규격/전개도 조건부 필드 정상 표시
- RM: display_condition 불일치 발견 및 수정
  - field 100에 SUS(스테인리스)→[101,102,103], EGI(아연도금강판)→[101,102,103], 원단류→[101] 추가
  - 수정 후 SUS 품목에서 규격 3개 필드 정상 표시 확인

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 09:51:08 +09:00
20fda68fb0 docs:Phase 4.2 완료 - mng JSON 기반 문서 화면 구현 (진행률 75%)
- Phase 4.2 완료 상태 업데이트
- 변경 이력 추가 (섹션 테이블 렌더링 + 버그 수정 3건)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 09:50:56 +09:00
a84b0e37b5 docs:Phase 4.1 완료 - API 엔드포인트 설계 (진행률 70%)
- Phase 4.1 완료 상태 업데이트 (DocumentTemplate API + 결재 워크플로우)
- 컨펌 대기 목록 #1 해결 처리
- 변경 이력 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 09:40:02 +09:00
6e10c66353 docs:Phase 3.4 완료 - 검사 기준 이미지 이관, Phase 3 전체 완료 (진행률 65%)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 08:44:54 +09:00
bf3baee642 docs:Phase 3.3 완료 - 중간검사 양식 시드 데이터 (진행률 60%)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 08:34:51 +09:00
f1fdc95256 docs: DB 백업 시스템 계획 문서 진행 상태 업데이트 (79%)
- Phase 1,2,4,5 로컬 코드 작업 완료 반영
- 변경 이력 14건 추가
- 잔여 작업: 서버 배포 3건 (1.3, 3.1, 3.2)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 08:33:42 +09:00
1d43bd1cdf docs:Phase 3.2 완료 - 5130 중간검사 JSON→EAV 이관 설계 (진행률 55%)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 08:28:41 +09:00
c1de7ebfc1 docs:Phase 3.1 완료 - 중간검사 4종 양식 구조 설계 (진행률 50%)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 05:36:37 +09:00
8509743b7e docs: Phase 2B 완료 - FG item_details 생성 및 attributes field_key 매핑
- 2B-4: FG item_details 18건 생성 (id:524-541)
  - product_category: 스크린/철재, specification: 마감유형-설치유형
- 2B-5: attributes field_key 매핑 780건 전체 완료
  - PT: Part_type 669건 (조립400/구매205/절곡64)
  - RM: 100~103 field_key 28건 (SUS/EGI name 파싱)
  - SM: 107 카테고리 61건 + spec→108 매핑
  - CS: item_name 4건

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 05:09:04 +09:00
71aa0d5fee docs:Phase 2.4 완료 - 문서 목록/검색/필터 (진행률 45%)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 05:07:38 +09:00
4a615e48f0 docs: 품목기준 데이터 정비 계획 - Phase 2A 롤백 및 Phase 2B 진행 반영
Phase 2A(설정 수정) 전체 롤백 기록 및 Phase 2B(데이터 우선 정비) 진행 상황 업데이트:
- Phase 2A: display_condition 깨짐으로 DB 복원 롤백 기록
- Phase 2B-1: FG 필드 4개 추가, SM/RM options ADD 완료
- Phase 2B-2: BOM 정상 확인
- Phase 2B-3: category_id 분류 780건 매핑 완료 (5개 신규 카테고리 추가)
- 접근 방식 변경: 설정 교체 금지, 추가만 허용, 데이터 우선 정비

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 05:03:06 +09:00
0a80b79679 docs:문서관리 계획 Phase 2.3 완료 반영 (진행률 40%)
- Phase 2.3 완료 (결재 워크플로우: 제출/승인/반려)
- changelog에 Phase 2.3 상세 이력 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 05:00:50 +09:00
1f2d5ff113 docs:문서관리 계획 Phase 2.2 완료 반영 (진행률 35%)
- Phase 2.2 완료 표시 (동적 검사 테이블 + EAV 저장)
- changelog에 Phase 2.2 상세 이력 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 04:43:15 +09:00
314fd4eb6f docs:문서관리 계획 Phase 2.1 완료 반영 (진행률 30%)
- Phase 2.1 완료 표시 (문서번호 prefix, 결재라인 초기화, 기본필드 뷰 수정)
- changelog 파일에 Phase 1.5, 2.1 이력 추가
- 진행률: 5/20 → 6/20 (30%)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 04:32:41 +09:00
e65854bcc9 docs: 품목 기준 데이터 정비 프론트엔드 검증 결과 추가
브라우저 검증 결과 (dev.sam.kr):
- 품목기준관리: FG/PT/SM/RM 모든 페이지 필드 정상 표시
- 품목 관리: FG 18건 목록, BOM 3건 정상 표시
- 섀도잉 정리: 비활성화 필드 미표시, 공통필드(163) 통합 확인
- 견적 영향: 수정 금지 영역 미접촉 확인
- 부분 달성: FG 상세 뷰 고정 레이아웃으로 동적 필드 미표시 (프론트 별도)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 03:02:50 +09:00
925e8f13ff docs: 품목 기준 데이터 정비 Phase 2 완료
Phase 1 분석 + Phase 2 실행 결과를 포함한 계획 문서.

DB 변경 사항 (tenant_id=287):
- item_fields 4건 생성 (id:177-180, FG attributes 매핑)
- item_fields 10건 비활성화 (섀도잉/null key/미연결 정리)
- item_fields 9건 options 갱신 (RM/SM/PT 실데이터)
- entity_relationships 7건 삭제, 8건 추가 (is_active 통합 + FG 필드 연결)
- item_details 18건 생성 (id:524-541, FG 제품 상세)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 02:41:29 +09:00
38411ad8b9 docs: sam_stat 프로젝트 완료 - DB 스키마 문서 + 계획 100% 완료
- database-schema.md: sam_stat 섹션 추가 (20테이블, 5커맨드, 4 API)
- 계획 문서: Phase 6 추가, 진행률 100%, 상태 '구현 완료'

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 09:23:57 +09:00
f5c5d908a0 docs: sam_stat Phase 5 완료 - 계획 문서 업데이트
- Phase 5 항목 5.1~5.5 전부  완료 처리
- 진행률 67% → 83% (5/6 Phase)
- 변경 이력에 Phase 5 상세 내역 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 22:17:17 +09:00
11b92a4ac7 docs: sam_stat Phase 4 완료 상태 업데이트
- Phase 4 전체 항목  (4.1~4.5)
- 진행률 50%→67%, 다음 작업: Phase 5 최적화
- 변경 이력 추가: P2 도메인 + API + 대시보드 전환 완료

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 21:56:59 +09:00
86d787d0bf docs: sam_stat Phase 3 완료 상태 업데이트
- Phase 3 (P1 도메인 확장) 전체 항목  완료
- 진행률 33% → 50% 업데이트
- 변경 이력 추가 (차원/재고/견적/인사/KPI 도메인)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 20:19:51 +09:00
aabf3107ed docs: sam_stat Phase 2 완료 상태 업데이트
- Phase 2 (P0 도메인 빌드) 전체 항목  완료
- 진행률 16% → 33% 업데이트
- 변경 이력 추가 (Sales, Finance, Production 도메인)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 19:28:32 +09:00
c526c59e42 docs: sam_stat 통계 DB 설계 계획서 추가 (Phase 1 완료)
- 8개 통계 도메인, 20개 테이블 설계
- Phase 1 인프라 구축 완료 상태 반영

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 17:13:42 +09:00
e25a87ed1d docs: 기획 문서 추가
- 문서관리 1단계 변경사항 (20260128_document_management_phase1_1.md)
- FCM 사용자 타겟 알림 계획
- 수입검사 문서 통합 계획
- 품목 마이그레이션 계획 (경동)
- 수주 마이그레이션 계획 (경동)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 01:12:40 +09:00
b685ade284 docs: 경동기업 견적 로직 계획서 Phase 4 완료 업데이트
- Phase 4.7 절곡품 계산 (10종) 구현 완료
- Phase 4.8 테스트 완료 (16개 항목, 751,200원)
- 진행률 100% (Phase 0~4 완료)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 01:11:28 +09:00
cc049ce5e0 docs: 품목 마이그레이션 완료 및 견적 로직 계획 추가
- kd-items-migration-plan.md: 정적 데이터 마이그레이션 완료 표시
  - Phase 4 검증 결과 추가 (items 651건, prices 651건)
  - 후속 작업으로 kd-quote-logic-plan.md 연결

- kd-quote-logic-plan.md: 신규 생성
  - 5130 견적 로직 분석 계획
  - 동적 BOM 계산 (모터/제어기/부자재)
  - Phase 0~5 작업 계획

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 23:01:40 +09:00
12da22ad80 docs: Phase 3 React 연동 보류 상태로 변경
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 22:01:39 +09:00
b98bc5d2ea docs: 문서 관리 시스템 계획 업데이트 - Phase 2 완료
- Phase 2 MNG 관리자 패널 구현 완료 (6개 항목)
- 진행률 67% (8/12)로 업데이트
- 변경 이력 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 21:51:29 +09:00
7bc3562ef8 docs: Phase 4 로컬 검증 완료
- 건수 검증: items 651건, prices 651건, BOM 18건 
- code 중복 검증: 0건 
- Phase 3 추가 품목 확인: PM-* 13건, RM-* 4건 
- 진행률: 100% (로컬 검증 완료)
- 다음 단계: 개발서버 배포 (사용자 승인 필요)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 21:39:18 +09:00
0c30f576c3 docs: Phase 3 완료 상태 업데이트
- kd-items-migration-plan.md: Phase 3 완료 체크리스트 업데이트
- 20260128_kd_items_migration_phase3.md: Phase 3 변경 내용 요약
- 진행률: 75% (Phase 1~3 완료)
- 최종 결과: items 651건, prices 651건, BOM 18건

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 21:29:19 +09:00
ca7cedd3d3 docs: 문서 관리 시스템 Phase 1.8 진행률 업데이트
- Route 및 Swagger 완료 (50%)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-28 21:29:11 +09:00
61e2ecb19d docs: 문서 관리 시스템 Phase 1.7 진행률 업데이트
- FormRequest 생성 완료 (42%)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-28 21:14:31 +09:00
330aba4c6a docs: 문서 관리 시스템 Phase 1.6 진행률 업데이트
- Controller 생성 완료 (33%)
- 결재 워크플로우 보류 사항 명시

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-28 21:11:41 +09:00
3fd176186e docs: Phase 2 완료 상태 업데이트
- Phase 2.1: BDmodels.seconditem → PT items 6건 
- Phase 2.2: items.bom JSON 연결 18건 
- 진행률: 2/4 (50%)
- 최종: items 634건, prices 634건, BOM 18건

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 21:06:59 +09:00
65e182dfbf docs: 문서 관리 시스템 Phase 1.5 문서 업데이트
- Phase 1.5 변경 내용 문서 추가
- 계획 문서 진행률 업데이트 (25%)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-28 20:41:37 +09:00
f7f4012424 docs: Phase 1 완료 상태 업데이트
- Phase 1.0: KDunitprice → items 601건 
- Phase 1.1: models → items (FG) 18건 
- Phase 1.2: item_list → items (PT) 9건 
- Phase 1.3: category_l4 → 스킵 (카테고리 데이터)
- 최종 결과: items 628건, prices 628건

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 20:38:35 +09:00
7beaa627f7 docs: Phase 1.0 실행 결과 업데이트
- Seeder 실행 완료 (items 601건, prices 601건)
- 진행 상태 및 체크리스트 업데이트

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-28 19:26:30 +09:00
3ec8206bab docs: 경동기업 마이그레이션 Phase 1.0 문서 업데이트
- kd-items-migration-plan.md 체크리스트 업데이트
- 변경 내용 요약 문서 추가

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-28 19:22:25 +09:00
3b6e97dadc docs: API 라우터 분리 및 버전 폴백 시스템 문서화
- api-rules.md: 라우팅 섹션 전면 개편
  - 도메인별 라우트 파일 구조 (13개)
  - ApiVersionMiddleware 설명
  - API 버전 폴백 시스템 상세 설명
- system-overview.md: 라우팅 구조 섹션 확장
  - 도메인별 분리 구조 다이어그램
  - 미들웨어 스택에 ApiVersionMiddleware 추가
- dev-commands.md: 라우트 관리 명령어 추가
- INDEX.md: 2026-01-28 변경 이력 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 18:52:24 +09:00
0cb8a3af22 docs: 견적 V2 변경 이력 및 계획 문서 추가
- 견적 V2 API 연동 변경 이력 (4개 파일)
- 입고관리 분석 계획
- 재고 통합 계획

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26 22:12:17 +09:00
2893874137 docs: 견적관리 URL 마이그레이션 Phase 3 완료 (테스트 제외)
- Step 3.3 완료: 목록 페이지 V2 URL 적용
- Step 3.4 완료: 문서 업데이트
- 진행률 92% (11/12) - 사용자 통합 테스트만 남음

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26 22:05:08 +09:00
68a373809a docs: 견적관리 URL 마이그레이션 계획 Phase 2 완료 업데이트
- Phase 2 (URL 경로 정식화) 완료 상태 반영
- Step 2.1, 2.2, 2.3 완료 처리
- Step 3.1 (파일 정리) 완료 처리
- 변경 이력 업데이트
- 성공 기준 달성 현황 업데이트

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26 21:34:31 +09:00
80e3813809 docs: 견적 V2 자동 견적 산출 오류 수정 계획 완료
- 테스트 검증 결과 추가 (4가지 문제 모두 해결 확인)
- 변경 이력에 추가 수정 사항 기록
- 상태: 완료

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26 16:12:45 +09:00
96755291a0 docs: 카드관리 및 월별비용 통합 계획 문서 업데이트
- card-management-section-plan 수정
- monthly-expense-integration-plan 신규 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 15:38:37 +09:00
710ddff899 docs: 복리후생비 현황 섹션 계획 문서 업데이트 - Phase 2 완료
- Phase 2 작업 상태 모두  완료
- 변경 이력에 Phase 2 작업 내용 추가
- 성공 기준 달성 현황 업데이트
- 진행률 100% (6/6)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 22:48:50 +09:00
904d9b8490 docs: Phase 1.3 세금 시뮬레이션 API 완료
- 계획 문서 상태 업데이트 (Phase 1 API 100% 완료)
- 변경 내용 문서 추가

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-22 22:47:52 +09:00
b7e3c187a8 docs: Phase 1.2 가지급금 대시보드 API 완료
- 계획 문서 상태 업데이트 (2/12, 17%)
- 변경 내용 문서 추가

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-22 22:39:53 +09:00
0c1a1a5785 docs: Phase 1.1 카드 거래 대시보드 API 개발 완료
- 카드/가지급금 관리 섹션 계획 문서 추가
- 변경 이력 문서 추가

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-22 22:28:41 +09:00
00023b2d69 chore: 계획 문서 정리 및 아카이브 이동
- 완료된 계획 문서 12개 → plans/archive/ 이동
- 완료된 하위 계획 2개 → plans/sub/archive/ 이동
- 새 계획 문서 추가:
  - 5130-bom-migration-plan.md (완료)
  - 5130-sam-data-migration-plan.md (완료)
  - bidding-api-implementation-plan.md (완료)
  - dashboard-api-integration-plan.md
  - order-workorder-shipment-integration-plan.md
  - dev-toolbar-plan.md
- AI 리포트 키워드 색상체계 가이드 v1.4 추가
- index_plans.md 업데이트
2026-01-20 19:05:43 +09:00
31e13b7150 fix(WEB): 수주 페이지 필드 매핑 및 제품-부품 트리 구조 개선
- ApiClient 인터페이스: representative → manager_name, contact_person 변경
- transformApiToFrontend: client.representative → client.manager_name 수정
- ApiOrderItem에 floor_code, symbol_code 필드 추가 (제품-부품 매핑)
- ApiOrder에 options 타입 정의 추가
- ApiQuote에 calculation_inputs 타입 정의 추가
- 수주 상세 페이지 제품-부품 트리 구조 UI 개선
2026-01-20 16:14:46 +09:00
8955944ed8 docs: Hotfix 액션 플랜 업데이트
- 매입 일괄 업데이트 API 완료 표시
- mng 백엔드 → api 백엔드 + React 프론트엔드 담당 변경
- 근태 설정 API 존재 확인 완료
2026-01-19 19:58:36 +09:00
20e7215639 docs: E2E 버그 수정 작업 기록 및 아카이브
- e2e-bugfix-consolidated-plan.md → history/2026-01/ 이동
- CURRENT_WORKS.md 작업 기록 추가
- index_plans.md 아카이브 참조 추가
- E2E 테스트 리포트 7개 추가 (clodeCheck/)

수정된 버그: 7건 (Critical 3, High 3, Medium 1)
커밋: fa6e96d, a1aa872, e998cfa
2026-01-15 20:47:47 +09:00
7b18ee1b10 docs: 개발 계획 및 변경 이력 문서 추가
- 작업지시 계획 문서 업데이트
- MES 통합 분석, 서버 컴포넌트 감사 계획 추가
- 수주관리, 인수인계서 API 연동 변경 이력 추가
- sub/ 하위 계획 문서들 추가 (카테고리, 계약, 품목, 단가 등)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-15 08:54:31 +09:00
37d8ce9cc2 docs: 시공사 API 연동 완료 (8/8, 100%)
- construction-api-integration-plan.md: 전체 완료 상태로 업데이트
- labor-plan.md: 노임관리 API 연동 완료 확인

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-12 09:09:22 +09:00
7fbcdfbd32 docs: Phase 3.3 단가관리 API 연동 완료 (87.5%)
- Phase 3.3 단가관리 상태  완료로 업데이트
- 다음 작업: Phase 3.4 노임관리 API 연동
- 변경 이력에 3.3 Backend API 보완 기록 추가

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-09 22:19:19 +09:00
a32c801db9 docs: [수주관리] 거래처 API 연동 이력 추가
- 2025-01-09 수주 등록 페이지 거래처 API 연동 내용 기록

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 22:14:44 +09:00
8de5abf88f docs(construction): Phase 3.2 품목관리 완료 반영
- 진행률 업데이트: 5/8 → 6/8 (75%)
- Phase 3.2 상태: 
- 변경 이력 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 22:07:37 +09:00
ca2bdca760 docs(construction): Phase 3.1 카테고리관리 완료 반영
- 진행률 업데이트: 5/8 (62.5%)
- Phase 3.1 상태  완료 표시
- 변경 이력 추가

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-09 22:01:47 +09:00
d1965c5f94 docs(construction): Phase 2.3 물량검토관리 제외
- Frontend/기획 미존재로 물량검토관리 작업 범위에서 제외
- 전체 페이지 수 9개 → 8개로 조정
- 진행률 업데이트: 4/8 (50%)
- 다음 작업: Phase 3.1 카테고리관리

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-09 21:48:44 +09:00
ced073e79b docs(construction): 건설관리 API 연동 계획 진행상황 업데이트
- Phase 2.1 현장관리:  완료
- Phase 2.2 구조검토관리:  완료
- Phase 2.3 물량검토관리:  다음 작업
- 진행률: 4/9 (44%)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 21:31:50 +09:00
e861b74830 docs: 기획 문서 인덱스 업데이트 및 작업지시 계획 추가
- index_plans.md: 21개 문서로 확대, 영업/생산/시공사 섹션 추가
- work-order-plan.md: 작업지시 검증 계획 추가, Order API 연동 완료 반영

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 15:03:02 +09:00
dcd07f4b7a docs: 수주관리 API 연동 계획 Phase 3 완료 상태 업데이트
- Phase 3 고급 기능 완료 (100%)
  - 3.1 견적서 → 수주 변환: QuotationSelectDialog + createOrderFromQuote()
  - 3.2 생산지시 생성 연동: createProductionOrder() + production-order 페이지
  - 3.3 상태 흐름 관리: 수주확정 다이얼로그 + updateOrderStatus()
- 진행률: 2/3 Phase (67%) → 3/3 Phase (100%)
- Frontend 생산지시 페이지 상태:  완료

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 10:25:30 +09:00
36e4f8c418 docs: 수주관리 API 연동 계획 Phase 2 완료 상태 업데이트
- Phase 2 Frontend API 연동 완료 표시 (67% 진행)
- actions.ts 생성 및 페이지별 연동 상태 업데이트
- 다음 단계: Phase 3 고급 기능

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 20:57:58 +09:00
38b98787ff docs: 알림음 시스템 테스트 완료 - 핵심 기능 완료 처리
- Phase 5 테스트 및 검증 완료
- 진행률 91% (10/11)
- 4.3 알림 설정 테이블은 후순위

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-07 20:17:49 +09:00
c00d74a04f docs: 알림음 시스템 구현 계획 문서 추가
- Phase 1~4 완료 (73%)
- Phase 5 테스트 및 검증 대기

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-07 20:10:19 +09:00
3bfe30ee1c docs: 견적 관리 이슈 계획 및 시더 목록 문서 추가
- plans/quote-management-8issues-plan.md: 견적 관리 8개 이슈 수정 계획
- plans/SEEDERS_LIST.md: SAM API 시더 목록 및 실행 방법

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-06 21:00:56 +09:00
e89e0f5ee3 docs: 견적시스템 분석문서 및 계획 업데이트
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 15:56:46 +09:00
b2ddb9bae1 docs: BOM 기반 견적 계산 API 변경 내용 문서 추가
- Phase 1.1 API 계산 로직 구현 변경사항 문서화
- POST /api/v1/quotes/calculate/bom 엔드포인트 사용법

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02 11:27:44 +09:00
3ba4f87566 docs: 견적 산출 API 개발 계획 문서 추가
- 견적 산출 API 개발 계획 문서 신규 작성 (quote-calculation-api-plan.md)
- MNG FormulaEvaluatorService 핵심 로직 상세 명세 포함
- 10단계 BOM 계산 프로세스, CategoryGroup 단가 계산 방식 등
- React 견적등록 화면 연동을 위한 API 명세 정의
- 페이지네이션 정책 문서 업데이트 (Laravel 기본 응답 구조 반영)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 22:55:09 +09:00
b1362ee9cb docs: 계획 문서 및 변경 기록 업데이트
- erp-api-development-plan.md: ERP API 개발 계획 업데이트
- react-fcm-push-notification-plan.md: FCM 푸시 알림 계획 완료
- react-mock-remaining-tasks.md: Mock 데이터 잔여 작업 정리
- l2-permission-management-plan.md: L2 권한 관리 계획 추가
- simulator-ui-enhancement-plan.md: 시뮬레이터 UI 개선 계획 추가
- 20251230 FCM 푸시 알림 변경 기록 추가

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 17:26:20 +09:00
7d639bb584 docs(simulator): Phase 7 제품 유형별 테스트 결과 문서화
- 철재 제품(FG-STL-001) 테스트 결과 추가
  - W1=2110, K=150.34 (M×25 공식) 검증 완료
  - 총액: 3,158,111원
- 절곡 제품(FG-BND-001) 테스트 결과 추가
  - CategoryGroup에 "절곡" 카테고리 추가
  - 총액: 727,893원
- 스크린 제품(FG-SCR-001) 재검증 완료
  - 총액: 1,711,225원
- 제품 유형별 검증 결과 요약 섹션 추가

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 14:46:26 +09:00
b206875a8c docs: React FCM 푸시 알림 연동 계획 문서 추가
- Capacitor 앱 웹뷰가 dev.sam.kr을 로드할 때 FCM 푸시 알림 지원
- mng/public/js/fcm.js를 react에 포팅하는 계획
- 4단계 Phase: 플러그인 설치 → 유틸리티 포팅 → UI → 테스트
- 백엔드 API 변경 없음 (기존 /push/* 재사용)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 13:59:04 +09:00
46369be515 docs: 시뮬레이터 동기화 계획 Phase 6 추가
- Phase 6: prices 테이블 데이터 추가 완료
- DesignPriceSeeder로 85개 품목 마이그레이션
- 가격 우선순위 검증 완료 (prices > items.attributes.salesPrice)
- 날짜 업데이트 (2025-12-24 → 2025-12-29)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-29 21:43:28 +09:00
60396356a1 docs: 프로필 이미지 업로드 API 연동 작업 기록 추가
- react-mock-remaining-tasks.md 변경 이력에 2025-12-29 작업 추가
- API, React, 심볼릭 링크, 환경변수 정리 내용 기록

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-29 21:04:47 +09:00
b1111ff286 docs: 게시판 메뉴 자동 연동 기능 문서화
- 테넌트 게시판 메뉴 연동 섹션 추가
- 변경 이력에 api 프로젝트 게시판 메뉴 연동 기록

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-29 13:50:33 +09:00
95fba81f08 docs: K-4 문의 댓글 API 연동 완료 업데이트
- K-4 문의 관리: 댓글 CRUD 연동 상태 추가
- 변경 이력에 댓글 API 연동 작업 기록

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-29 09:24:09 +09:00
8f8d56adc1 docs: 시스템 게시판 API 상태 업데이트
- 시스템 게시판 API 12개 엔드포인트 🔄 예정 →  완료
- 변경 이력 추가 (2025-12-28)

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-28 00:54:55 +09:00
d1334c033f docs: 종합분석 버그 수정 변경이력 추가
- 종합분석 승인/반려 버그 수정 기록
  - ComprehensiveAnalysisService::getTodayIssue() 쿼리 수정
  - 현재 사용자가 결재자인 문서만 표시
- 테스트 데이터 수정 기록
  - ComprehensiveAnalysisSeeder User 33 (홍킬동) 기준 변경
- 테스트 환경 정보 추가 기록

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-27 18:47:54 +09:00
3cc539dc26 docs: Phase J/K 작업을 react-mock-remaining-tasks.md로 분리
- 아키텍처 원칙 추가 (React → api.sam.kr 만 호출, mng 호출 금지)
- API 상태 확인: api 프로젝트에 boards/posts API 이미 완비
- Phase J (게시판), Phase K (고객센터) 상세 계획 분리
- Serena 메모리 관리 규칙 추가

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-27 17:24:37 +09:00
bb22cd36f6 docs: [migration] Phase M 완료 상태 업데이트 2025-12-26 19:04:50 +09:00
7db8741385 docs: L-3 종합분석 완료 확인 및 문서 업데이트
- L-3 ComprehensiveAnalysis approveIssue/rejectIssue API 연동 확인 (I-7에서 완료)
- Phase L 진행 현황: L-2/L-3 완료, L-1 대기 (공정관리 API 미존재)
- 변경 이력 추가

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 18:46:45 +09:00
bdf38dfa5a docs: Phase S 상세 페이지 완료 확인 및 문서 업데이트
- S-1~S-10 전체 상세 페이지 API 연동 완료 확인
- 2.14 섹션 상태 표기 변경 (Mock →  완료)
- PurchaseDetailModal MOCK은 Phase M-1에서 처리 예정

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 18:39:54 +09:00
65075ddc9f docs: Phase G 생산관리 API 연동 완료 상태 업데이트
- G-1~G-5 전체 완료 표시로 변경
- 변경 이력에 Phase G 완료 내역 추가
- 다음 작업: Phase J~M 진행 예정

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 18:34:19 +09:00
1524f238c9 docs: 전수 조사 결과 견적 관리 완료 표시 업데이트
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 18:25:48 +09:00
986cf40011 docs: L-2 견적 관리 API 연동 완료 표시 (상세/수정/등록)
- 상세/수정/등록 페이지 API 연동 내용 추가
- 14개 Server Action 사용 정보 보완
- QuoteFormData 변환 함수 추가

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 18:23:56 +09:00
f5982cd1c1 docs: Phase I Excel/PDF 다운로드 API 연동 상태 업데이트
- I-2 거래처원장: 엑셀/PDF 다운로드 API 연동 완료
- I-5 채권현황: 엑셀 다운로드 API 연동 완료
- I-6 일일보고서: 엑셀 다운로드 API 연동 완료
- 변경 이력 추가

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 18:23:25 +09:00
2684afc117 docs: Phase I 완료 상태 업데이트
- I-1 미지급비용관리 CRUD UI 구현 완료
- I-4 은행거래조회 상세페이지 이동방식 확인
- I-5 채권현황 API 연동 완료
- I-7 종합분석 API 연동 완료
- 변경 이력 추가

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 17:59:52 +09:00
ac13c1c80b docs: Phase L-2 견적 관리 API 연동 완료 표시
- L-2 견적 관리: 🔄 완료
- L-1 공정 관리: Backend API 미존재 메모 추가
- 생성된 파일 목록 추가 (types, actions, Client Component)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 17:52:01 +09:00
5b8eceef36 docs: 전수 조사 결과 섹션 통합 (12-24 → 12-26)
- 1.4 섹션 (2025-12-24 전수 조사 결과 요약) 삭제
- 1.6 섹션 (2025-12-26 전수 조사 결과)을 1.4로 이동
- 중복 내용 제거 및 최신 상태만 유지
- 섹션 번호 재조정 (1.7 → 1.6, 1.8 → 1.7)
- mockData.ts 삭제 대상에 H-1~H-3 연동 완료 표시 추가

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 17:28:29 +09:00
66eac6b39f docs: [문서정리] 전체 문서 업데이트 및 admin→mng 전환 반영
- Phase 1-3: 핵심/보조 문서 업데이트, 버전 최신화
- Phase 4: 오래된 파일 정리 및 아카이브
  - D0.8 Storyboard → history/2025-12/ 이동
  - admin 참조 4개 파일 수정 (docker-setup, git-conventions, project-launch-roadmap, remote-work-setup)
  - 빈 디렉토리 6개 삭제
- 버전 정보: React 19.2.1, Next.js 15.5.7
- remote-work-setup.md DEPRECATED 표시
2025-12-26 16:47:36 +09:00
aad94e5377 docs: H-3 출하 관리 Mock → API 연동 완료 기록
- Phase H 테이블: H-3 출하관리  완료 상태로 업데이트
- 변경 이력: actions.ts 생성, 목록/상세/등록/수정/삭제/통계/옵션 API 연동
- ShipmentList, ShipmentDetail, ShipmentCreate, ShipmentEdit 전체 연동

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 15:42:02 +09:00
3c34b01a46 docs: H-2 재고 현황 Mock → API 연동 완료 기록
- Phase H 테이블: H-2 재고현황  완료 상태로 업데이트
- 변경 이력: actions.ts 생성, 목록/상세/통계/옵션 API 연동
- 등록/수정/삭제는 해당없음 (조회 전용 페이지)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 15:41:16 +09:00
b434b77858 docs: H-1 입고 관리 Mock → API 연동 완료 기록
- Phase H 테이블: H-1 입고관리  완료 상태로 업데이트
- 변경 이력: actions.ts 생성, 목록/상세/등록/수정/삭제/통계/옵션 API 연동

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 15:40:32 +09:00
b9f72576b0 docs: 사원-회원 연결 기능 문서 추가
- changes/20251225_employee_user_linkage.md: 변경 이력 문서
- plans/employee-user-linkage-plan.md: 구현 계획 문서

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 01:32:34 +09:00
9d81ddd05b docs: Phase E 마이그레이션 완료 문서 업데이트
- E-1 법인카드 관리 완료 표시
- E-2 급여 관리 완료 표시
- 변경 이력 추가 (2025-12-25)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-25 03:48:57 +09:00
f9ecb6da5c docs: 휴가 관리 사용현황/부여현황 API 연동 내용 업데이트 2025-12-24 19:43:33 +09:00
3d6654259a docs: 어음 중복번호 검증 수정 이력 추가 2025-12-24 19:41:33 +09:00
0bd83e145b docs: C-4 부서 관리 API 연동 완료 반영
- Phase C 전체 완료 (C-1 ~ C-4)
- .env.local 환경변수 수정 내역 추가
- 변경 이력 업데이트
2025-12-24 18:58:10 +09:00
7b0de7ba6a 견적 시스템 개발 계획 문서 추가
- quote-system-development-plan.md: mng 견적 시스템 확장 + API 개발 계획
- index_plans.md: 계획 인덱스 업데이트
- react-mock-to-api-migration-plan.md: 마이그레이션 계획 업데이트
2025-12-24 18:00:36 +09:00
0811cb7772 docs: A-1 악성채권 관리 API 연동 완료 상태 업데이트
- Phase A 테이블 A-1 상태: 상세+CRUD+메모 API 연동 완료 표시
- 진행 순서 A-1 완료 표시
- 변경 이력 추가
2025-12-24 17:33:51 +09:00
c983d74148 Phase 5: 시뮬레이터 동기화 검증 결과 문서화
- 테스트 케이스: FG-SCR-001 (W0=2000, H0=2500)
- 변수 계산 검증: W1=2140, H1=2850, M=6.099
- 10단계 디버깅 검증 완료
- 공정별 그룹화 검증 완료 (screen, assembly)
- 단가 우선순위 검증 완료 (prices → items.salesPrice)
- 성공 기준 5가지 모두 달성
2025-12-24 16:11:44 +09:00
491ff6fe67 docs: React Mock→API 마이그레이션 계획 업데이트 - Phase E~H, S 신규 추가
- MCP Serena로 mock 데이터 사용 파일 전수 조사 (29개)
- B-1 매출관리, B-2 매입관리 상태 수정 (Mock 사용중)
- Phase E: 설정/시스템 관리 (2개)
- Phase F: 인사/급여 (3개, API 존재)
- Phase G: 결재 시스템 (4개, API 존재)
- Phase H: API 신규 개발 필요 (8개)
- Phase S: 상세 페이지 (4개, 부모 완료 후)
2025-12-24 14:19:45 +09:00
9b665c0d5a docs: 플로우 테스트 파일 이동 및 계획 문서 추가
- api에서 플로우 테스트 JSON 파일들 이동
- 더미 데이터 시딩 계획 추가
- 견적 자동 계산 개발 계획 추가
- 기존 계획 문서 업데이트
2025-12-24 08:54:52 +09:00
5e1e5b4fcf docs: 견적 시뮬레이터 계산 로직 분석 및 동기화 계획 문서 추가
- simulator-calculation-logic-mapping.md: design.sam.kr 계산 로직 상세 분석
  - 변수 계산 규칙 (W0,H0 → W1,H1,M)
  - 수식 평가 함수 및 지원 함수 목록
  - BOM 10단계 계산 과정
  - 단가 계산 방식 (pricing → itemMaster → 면적단가)
- simulator-planning-page-sync-plan.md: mng 시뮬레이터 동기화 계획
- index_plans.md: 새 문서 인덱스 추가
2025-12-23 23:41:47 +09:00
c473750453 docs: A-1 악성채권 관리 API 연동 진행 상태 업데이트
- Phase A-1 상태:  대기 →  완료
- 작업 일정 Day 1 완료 표시
- 변경 이력에 작업 내역 추가
2025-12-23 17:48:09 +09:00
64e4b94a8c docs: CURRENT_WORKS 작업 현황 추가 2025-12-22 19:51:36 +09:00
32d6854049 Phase 8 SaaS 확장 연동 분석 완료
- 8.1 구독관리: API 완전 구현됨, 필드명 매핑 필요
- 8.2 결제내역: API 완전 구현됨, 필드명 매핑 필요
- 8.3 회사 추가: API 완전 구현됨, React 연동만 필요
2025-12-22 18:53:21 +09:00
d60d292291 docs: Phase 7 게시판 후순위 연기 처리 2025-12-22 18:46:43 +09:00
a7bb9f754c docs: Phase 6 연동 분석 완료 (악성채권, 팝업관리)
- 6.1 악성채권: API 완전 구현됨 (CRUD + 서류첨부 + 메모)
- 6.2 팝업관리: API 완전 구현됨 (필드명 매핑 필요)
- Phase 6 상태 테이블 업데이트 (모두  완료)
2025-12-22 18:44:19 +09:00
a8960db8d1 docs: Phase 5 연동 분석 완료 (5.3 회원탈퇴/중지, 5.4 거래명세서)
- 5.3-1 회원 탈퇴: API 유지, React에서 비밀번호 UI 추가 필요
- 5.3-2 사용 중지: 호환됨, 수정 불필요
- 5.4-1 거래명세서: 이미 완전 구현됨, React 연동만 필요
- Phase 5 상태 테이블 업데이트 (모두  완료)
2025-12-22 18:40:30 +09:00
03d878e72f fix: ApiResponse 경로 수정
- app/Responses/ApiResponse.php → app/Helpers/ApiResponse.php
2025-12-22 17:50:29 +09:00
4d64beab78 docs: MNG 견적수식 관리 개발 계획 문서 추가
- Phase 1-4 개발 계획 (범위/매핑/품목 관리 UI, 5130 연동)
- MNG vs API 시스템 비교 분석
- 코딩 컨벤션 및 예시 코드 (Controller, Service, Blade View)
- DB 스키마 DDL 및 API 응답 포맷
- 새 세션용 체크리스트 포함 (v1.1)
2025-12-22 16:37:45 +09:00
5b6ce9b2b0 docs: D1.0 기획 확인 요청서 추가
- 7개 확인 필요 항목 정리
- 선택지 및 개발 영향도 포함
- 회신 양식 첨부
2025-12-22 16:06:43 +09:00
80bff661fc docs: Phase 6.1 악성채권 체크리스트 완료 상태 반영
- erp-api-development-plan-d1.0-changes.md: 악성채권 추심관리 구현 완료 체크
- quotation/PROGRESS.md: 견적 프로젝트 진행상황 업데이트
- phase-4-integration/README.md: API 통합 문서 수정
- react-api-integration-plan.md: React API 통합 계획 추가
2025-12-22 15:53:31 +09:00
2055524e19 docs: D1.0 Phase 5 완료 상태 반영
- Phase 5.1 사용자 초대 기존 구현 확인 (5개 API)
- Phase 5.2 알림설정 기존 구현 확인 (3개 API)
- Phase 5.3 계정정보 기존 구현 확인 (4개 API)
- Phase 5.4 매출 거래명세서 기존 구현 확인 (3개 API)
- Phase 5-8 전체 API 개발 완료
- 작업 일지 업데이트 (2025-12-22)
2025-12-22 15:46:59 +09:00
4373369133 docs: TODO-004 프론트엔드 client_type 코드값 전송 개선 항목 추가
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-21 16:05:54 +09:00
0c22bd8b1f docs: 품목 관리 TC 검증 완료 (2/2 통과)
- items-crud.json: 품목 조회 테스트 
- items-bom.json: BOM 조회/트리/요약/검증 
- 진행률 90%로 업데이트

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-21 16:05:32 +09:00
96d59b7d36 docs: 공통 작업 프레임워크 가이드 추가
- 세션 지속성, 작업 프로세스, TC 기반 검증 가이드

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-21 15:14:54 +09:00
e217266376 docs: 5130 → SAM 품목 마이그레이션 문서 추가
- MASTER_PLAN.md: 마이그레이션 전체 계획
- PROGRESS.md: 진행 상황 및 최종 결과
- phase-1: 5130 소스 스키마 분석
- phase-2: SAM 타겟 스키마 분석
- phase-3: 필드 매핑 설계

마이그레이션 결과:
- 총 425건 품목 이관 완료 (models 18, parts 36, parts_sub 117, BDmodels 59, BOM 195)
- tenant_id: 287 (경동기업)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-21 13:49:28 +09:00
741e6677ab docs: 인증/메뉴 TC 검증완료 + 품목관리 TC 추가
- auth-login.json: 로그인, 토큰 갱신, 로그아웃 검증 
- auth-menus.json: 메뉴 목록, 동기화, 권한 매트릭스 검증 
- items-crud.json: 품목 조회 테스트 (조회 전용)
- items-bom.json: BOM 조회/트리/요약/검증 테스트

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-21 04:08:37 +09:00
9c8809c43a docs: 인사/재무 API 검증 완료 (5/5 TC 통과)
- hr-employees-crud.json ✔️
- hr-attendances-crud.json ✔️
- hr-payrolls-crud.json ✔️
- finance-deposits-crud.json ✔️
- finance-withdrawals-crud.json ✔️
- 진행률 75%로 업데이트

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-21 03:29:41 +09:00
f77fff0d1e docs: 인사/재무 Flow Tester TC 5종 추가
- hr-employees-crud.json: 사원 CRUD, 통계
- hr-attendances-crud.json: 근태, 출퇴근 체크
- hr-payrolls-crud.json: 급여, 확정, 명세서
- finance-deposits-crud.json: 입금 CRUD, 요약
- finance-withdrawals-crud.json: 출금 CRUD, 요약
- MASTER_PLAN.md: JSON 저장 경로 규칙 추가
- PROGRESS.md: 진행률 65%, 세션 히스토리 업데이트

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-21 03:03:46 +09:00
2d9b02f74e docs: API 통합 프로젝트 계획 및 Flow Test 스펙 추가
- INDEX.md: TODO.md 링크 추가
- TODO.md: 프로젝트 할일 목록 신규 생성
- plans/flow-tests/: Flow Tester 테스트 시나리오 JSON 추가
  - auth-api-flow.json: 인증 API 플로우 테스트
  - pricing-validation-test.json: 가격 검증 테스트
- projects/api-integration/: 마이그레이션 계획 문서
  - MASTER_PLAN.md: 전체 마이그레이션 전략
  - PROGRESS.md: 진행 상황 추적
  - WORKFLOW.md: 작업 워크플로우
  - phase-1 ~ phase-4: 단계별 상세 계획

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-21 01:35:43 +09:00
1f963a5c60 docs: MNG → DEV 자동 로그인 개발 문서 추가
- front/AUTO_LOGIN_GUIDE.md: React 프론트엔드 구현 가이드
- projects/auto-login/PROGRESS.md: 개발 진행 상태 및 세션 재개 가이드

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-20 13:43:37 +09:00
159fdf86bb docs: Phase 4 완료 상태 업데이트 2025-12-19 16:46:38 +09:00
e973d0c3c9 docs: Phase 4 prices 테이블 연동 진행 상황 업데이트 2025-12-19 16:22:22 +09:00
1bac39f38c docs: MNG 모바일 반응형 Phase 3 완료 문서 업데이트
- PROGRESS.md Phase 3 완료 표시
- 02-implementation-plan.md Phase 3 상세 내용 업데이트
2025-12-19 16:20:20 +09:00
835b3ad785 docs: Phase 6.2 팝업관리 완료 표시 2025-12-19 16:16:12 +09:00
f0a38493d0 docs: MASTER_PLAN Phase 3 완료 상태 반영 2025-12-19 16:05:38 +09:00
fc92f7849c docs: D1.0 개발 계획 및 스토리보드 추가
- erp-api-development-plan-d1.0-changes.md: Phase 5-8 개발 계획
- SAM_ERP_Storyboard_D1.0_251218/: D1.0 스토리보드 이미지 38장
2025-12-19 16:04:31 +09:00
0eb96fcfc3 docs: 견적 기능 개발 Phase 3 완료
- Phase 3 구현 문서 작성 (README, implementation, table-mapping)
- PROGRESS.md 업데이트 (Phase 3 완료 상태)
- getItemPrice() 연동, Price 모델 생성 기록
2025-12-19 16:02:48 +09:00
3721cfdc4b docs: MNG 모바일 반응형 프로젝트 문서 추가
- 01-analysis.md: 현재 상태 분석
- 02-implementation-plan.md: 5단계 구현 계획
- 06-excluded-menus.md: 모바일 제외 메뉴 목록
- Phase 1, 2 완료 상태 반영
2025-12-19 16:02:17 +09:00
3b2f1cefa4 견적 기능 개발 Phase 2: mng 분석 완료
- mng 견적 수식 관리 현재 상태 분석
  - DB 테이블 5개, Models 5개, Services 2개
  - Controllers 3개, Views 9개 구현 완료
- 핵심 이슈 도출
  - 품목 단가 조회 미연동 (getItemPrice TODO)
  - 수식 데이터 미입력 (테이블 비어있음)
  - eval() 보안 취약점
- 5130 vs mng 비교 분석
- PROGRESS.md 업데이트
2025-12-19 15:44:56 +09:00
764a6470c6 MES 분석 문서 구조 정리: v1/v2 분리
- v1-analysis: 5130 레거시 기반 견적 분석 추가
- v2-analysis: 기존 MES 분석 문서들 이동
  - customer, master-data, order, price
  - production, production-userflow, quote, site
2025-12-19 15:37:59 +09:00
1066ea25b2 docs: Phase 5 API 문서 추가 (사용자 초대, 알림설정, 계정관리)
- erp-api-list.md: Phase 5 섹션 추가 (12개 API)
- erp-api-detail.md: Phase 5 상세 스펙 추가
  - 13. 사용자 초대 (5개): 목록, 발송, 수락, 취소, 재발송
  - 14. 알림 설정 (3개): 조회, 수정, 일괄수정
  - 15. 계정 관리 (4개): 탈퇴, 사용중지, 약관조회, 약관수정
2025-12-19 15:35:41 +09:00
441faa8922 견적 기능 개발 마스터 플랜 및 공통 정책 문서 추가
- 공통 정책 문서 신규 생성 (guides/PROJECT_DEVELOPMENT_POLICY.md)
  - DB 테이블 정책 (Hybrid EAV, options JSON)
  - 코드 컨벤션 (추측 금지 원칙)
  - Enum 지양 정책 (common_codes 테이블 활용)
  - Phase 진행 방식 및 세션/커밋 정책
- 견적 기능 개발 문서 생성 (projects/quotation/)
  - MASTER_PLAN.md: 4단계 개발 흐름 정의
  - PROGRESS.md: 진행 현황 추적용
2025-12-19 10:26:06 +09:00
a3a18b4b63 ERP 스토리보드 분석 문서 추가 (Gap Analysis 포함)
- 00-overview.md: 전체 개요
- 01-common.md: 공통 요소
- 02-auth.md: 인증/인가
- 03-gps-attendance.md: GPS 출퇴근
- 04-hr-management.md: 인사관리
- 05-approval.md: 전자결재
- 06-accounting.md: 회계/급여
- 07-master-data.md: 기준정보
- 08-reports.md: 리포트
- 99-gap-analysis.md: Gap 분석
2025-12-18 20:29:23 +09:00
bc5c8fc3f4 SAM ERP 스토리보드 D0.8 이미지 추가 (113장)
- 기획팀 제공 ERP 화면 설계 스토리보드
2025-12-18 20:29:16 +09:00
1770c2ed23 API Explorer 기능 스펙 및 개발 계획 문서 추가
- features/api-explorer-spec.md: API Explorer 기능 스펙
- plans/api-explorer-development-plan.md: API Explorer 개발 계획
2025-12-18 20:29:09 +09:00
ab740bc878 ERP API 개발 계획 Phase 3 진행상황 업데이트
- 가지급금(Loan) API Swagger 문서 완료
- 바로빌 연동 API 완료 표시 (테이블, 모델, 서비스, 12개 엔드포인트)
2025-12-18 20:29:01 +09:00
49e29d8149 docs: MES 기준정보 메뉴 분석 완료
- 12개 하위 메뉴 분석 및 스크린샷 캡처
  - EAV 메타관리: 품목/공정/검사/현장/수주 기준관리
  - 마스터 데이터: 생산/출고 기준관리, 공정관리, 채번관리, 공통코드, 문서양식
  - 수식 엔진: 견적수식관리 (44개 수식, 13개 카테고리)
- API 스펙 및 데이터 스키마 정의
- 구현 우선순위 정리
2025-12-18 16:41:33 +09:00
479d116a32 docs: 생산관리 분석 문서 추가
- UserFlow 분석 (12개 스크린샷)
- 생산관리 모듈 상세 분석
  - 품목관리, 생산현황판, 작업지시, 작업실적, 작업자화면
- 데이터 스키마 및 API 스펙 정의
- 상태 흐름 및 채번 규칙 문서화
2025-12-18 16:16:24 +09:00
4d61f22eb3 feat(mes): 판매관리 기능 분석 문서 추가
- 거래처관리: 목록/상세/등록 UI 분석, API 스펙 정의
- 견적관리: 견적 프로세스 분석, 자동계산 규칙 정의
- 현장관리: 현장 상태 흐름 분석, 진행률 계산 규칙
- 단가관리: 품목유형별 단가 구조 분석, 마진율 계산

포함된 스크린샷: 15개 (거래처 3, 견적 4, 현장 3, 단가 1)
2025-12-18 15:55:52 +09:00
cf82d98258 docs: 수주관리 기획 분석 문서 및 UI 스크린샷 추가
- 메뉴 구조, 데이터 스키마, UI 분석, API 스펙 문서화
- 수주 목록/상세/등록/수정 화면 캡처 (11개)
- 생산지시 생성 화면 포함 (우선순위, 자재소요량, BOM)
2025-12-18 15:37:18 +09:00
f32ec6a552 docs: 가지급금 관리 API 완료 체크 (3.5) 2025-12-18 14:28:23 +09:00
ae121b9be3 docs: Dashboard API 구현 완료 기록
- Phase 2 상태 업데이트 (3/3 완료)
- 3.3 대시보드 항목 완료 체크
- 작업 로그 추가 (2025-12-18)
2025-12-18 11:23:35 +09:00
aa696ff3c8 docs: 급여 관리 API 완료 내용 업데이트
- Phase 2 상태: 2/3 완료 (전자결재 + 급여관리)
- 3.2 급여 관리 섹션 완료 체크
- 2025-12-18 작업 일지 추가
2025-12-18 10:56:16 +09:00
eb279fc882 docs: 전자결재 모듈 API 개발 완료 기록
- Phase 2: 3.1 전자결재 모듈 완료 (커밋: b43796a)
- API 26개, Swagger 3개, 모델/서비스/컨트롤러 구현
2025-12-17 23:43:08 +09:00
3d1d24d76d docs: Phase 1 보고서 API 구현 완료 표시
- 2.6 보고서 섹션 완료 상태로 업데이트
- Phase 1 확장 개발 6/6 완료
2025-12-17 22:56:27 +09:00
9906749133 docs: 매출/매입 관리 API 완료 표시 (5/6) 2025-12-17 22:15:00 +09:00
8adb04a64a docs: 2.4 입금/출금 관리 완료 표시 2025-12-17 21:47:52 +09:00
28c71ee4ed docs: 2.3 카드/계좌 관리 완료 표시 2025-12-17 21:03:33 +09:00
f67c28a768 docs: 2.2 근무/출퇴근 설정 API 개발 완료 표시 2025-12-17 20:47:39 +09:00
e5b3e6c939 docs: 휴가 관리 API 구현 완료 상태 업데이트 2025-12-17 20:18:29 +09:00
54d2eb5835 docs: 마이그레이션 계획 및 메뉴 시스템 문서 업데이트
- 5130 마이그레이션 현황 업데이트
- mng 메뉴 시스템 Phase 1-3 완료 체크
2025-12-16 23:38:30 +09:00
8b87716d2e docs: work-memo-summary 완료 상태 업데이트 (6/🔧13/📋19) 2025-12-16 23:35:24 +09:00
daf469dc5c docs: meeting-summary 완료 상태 업데이트
-  완료: 3개 → 4개
- 📋 구현 필요: 22개 → 21개
- meeting-summary: 파일 업로드 + GCS + STT + Claude API
2025-12-16 22:55:53 +09:00
48174d6c25 docs: Phase 2 커밋 해시 추가 2025-12-16 13:44:07 +09:00
7dc095df97 docs: Phase 2 레이아웃 변환 추적 업데이트 2025-12-16 13:43:49 +09:00
e8d45b72f3 docs: MIGRATION_TRACKER 커밋 정보 추가 2025-12-16 10:59:56 +09:00
5e6508c3ea docs: 5130→MNG 마이그레이션 추적 문서 추가
- MIGRATION_TRACKER.md: Phase별 작업 추적 (Phase 1 완료)
- mng-menu-system-plan.md: MNG 메뉴 시스템 계획
2025-12-16 10:46:45 +09:00
72a322eb0f docs: 5130-to-mng 마이그레이션 현황 점검 및 상태 분류 (1/🔧13/📋24) 2025-12-16 10:24:16 +09:00
aee6d12fd9 Revert "docs: items 테이블 통합 완료 내용 반영"
This reverts commit e863d3762a.
2025-12-16 10:08:07 +09:00
e863d3762a docs: items 테이블 통합 완료 내용 반영
- rules/item-policy.md: source_table 개념 제거, API 완료 상태 업데이트
- front/item-master-guide.md: source_table: 'items' 반영
- specs/database-schema.md: items 통합 테이블 구조 추가
2025-12-16 10:01:30 +09:00
3d6d7b67ea docs: changes/plans 문서 현황 최신화
- changes/2025-12-15: 체크리스트 완료 표시
- plans/items-table-unification: 전체 Phase 완료 상태로 업데이트
2025-12-16 09:56:36 +09:00
1c4a1ebe09 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	plans/items-table-unification-plan.md
#	plans/mng-item-field-management-plan.md
2025-12-16 09:27:37 +09:00
33ef01b2b4 docs: API 문서 및 테스트 시나리오 추가
- front/item-master-items-api.md - Items API 프론트엔드 연동 문서
- guides/menu-delete-verification-queries.md - 메뉴 삭제 검증 쿼리 가이드
- plans/flow-tests/item-delete-force-delete.json - 품목 삭제 테스트 시나리오
2025-12-12 08:51:54 +09:00
011bcafcb1 docs: Items BOM 테스트 및 테이블 통합 계획 추가
- Items BOM API 플로우 테스트 JSON 추가 (items-bom-test.json)
  - GET /items/{id} BOM 확장 데이터 검증
  - GET /items/{id}/bom, /items/{id}/bom/tree 엔드포인트 테스트
- Items 테이블 통합 계획 문서 추가 (items-table-unification-plan.md)
  - Products/Materials → Items 통합 마이그레이션 설계
- MNG 필드 관리 계획 필수 참조 문서 섹션 보강
2025-12-11 23:15:43 +09:00
762 changed files with 139189 additions and 2001 deletions

1
.gitignore vendored
View File

@@ -1 +1,2 @@
.DS_Store
_to_notion/

337
INDEX.md
View File

@@ -1,225 +1,210 @@
# SAM 프로젝트 문서 인덱스
# SAM 문서 인덱스 (Claude Code용)
> **Claude Code 작업 전 필수 확인** - 작업 유형에 맞는 문서를 먼저 읽고 시작하세요.
> 작업 유형에 맞는 문서를 먼저 읽고 시작하세요.
> 최종 갱신: 2026-03-05
---
## 🎯 작업별 필수 문서 (반드시 먼저 확인)
## 작업별 필수 문서
| 작업 유형 | 필수 문서 | 용도 |
|----------|----------|------|
| **API 개발** | `standards/api-rules.md` | Service-First, FormRequest, i18n 규칙 |
| **DB 변경** | `specs/database-schema.md` | 테이블 구조, 관계, 컬럼 규칙 |
| **새 기능 구현** | `architecture/system-overview.md` | 전체 아키텍처 이해 |
| **보안 관련** | `architecture/security-policy.md` | 인증/인가, 보안 규칙 |
| **Git 커밋** | `standards/git-conventions.md` | 커밋 메시지, 브랜치 전략 |
| **품질 검증** | `standards/quality-checklist.md` | 코드 품질 체크리스트 |
| **Swagger 작성** | `guides/swagger-guide.md` | API 문서 작성법 |
| **품목관리** | `rules/item-policy.md` | 품목 정책 (유형, 예약어, API 규칙) |
| **게시판** | `specs/board-system-spec.md` | 게시판 시스템 설계 |
| **단가관리** | `rules/pricing-policy.md` | 원가/판매가 계산, 리비전 관리 |
| **MES 개발** | `projects/mes/README.md` | MES 프로젝트 개요 |
| API 개발 | `dev/standards/api-rules.md` | Service-First, FormRequest, i18n |
| DB 변경 | `system/database/README.md` | 테이블 구조, 관계, 컬럼 규칙 |
| 새 기능 | `system/overview.md` | 전체 아키텍처 |
| 보안 | `system/security-policy.md` | 인증/인가, 보안 규칙 |
| Git 커밋 | `dev/standards/git-conventions.md` | 커밋 메시지, 브랜치 전략 |
| 품질 검증 | `dev/standards/quality-checklist.md` | 코드 품질 체크리스트 |
| Swagger | `dev/guides/swagger-guide.md` | API 문서 작성법 |
| 품목관리 | `rules/item-policy.md` | 품목 정책 |
| 단가관리 | `rules/pricing-policy.md` | 원가/판매가, 리비전 |
| 견적관리 | `features/quotes/README.md` | 견적 시스템, BOM 계산 |
| 운영 배포 | `dev/dev_plans/production-deployment-plan.md` | 배포 계획 |
| 서버 운영 | `dev/deploys/ops-manual/README.md` | 서버 운영 매뉴얼 |
| MES | `projects/mes/README.md` | MES 프로젝트 |
---
## 📁 폴더 구조
## 폴더 구조
```
docs/
├── plans/ # 🆕 개발 계획 - 임시 (작업 완료 후 정리 → 삭제)
├── standards/ # 개발 표준 - "어떻게 코드를 작성할 것인가"
├── architecture/ # 아키텍처 - "왜 이렇게 설계하는가"
├── rules/ # 비즈니스 규칙 - "무엇이 유효한 데이터인가"
├── specs/ # 기술 스펙 - "무엇을 구현할 것인가"
├── guides/ # 구현 가이드 - "어떻게 구현할 것인가"
├── quickstart/ # 빠른 시작 - 핵심 요약
├── front/ # 프론트엔드 공유 문서
├── features/ # 기능별 상세 문서
├── projects/ # 프로젝트별 문서 (MES, Legacy)
├── history/ # 히스토리 및 로드맵
├── changes/ # 변경 이력
└── data/ # 데이터 분석
├── [공유]
│ ├── features/ # 기능별 상세 명세
│ ├── rules/ # 비즈니스 규칙·정책
│ ├── projects/ # 프로젝트별 자료
├── system/ # 시스템 현황 (아키텍처, DB, 인프라)
├── [개발팀]
│ ├── dev/standards/ # 개발 표준
│ ├── dev/guides/ # 구현 가이드
│ ├── dev/quickstart/ # 빠른 시작
│ ├── dev/changes/ # 변경 이력
│ ├── dev/deploys/ # 배포/운영
│ ├── dev/data/ # 데이터 분석
│ ├── dev/history/ # 과거 이력
│ ├── dev/dev_plans/ # 개발 계획 (임시)
├── [프론트엔드]
│ ├── frontend/api-specs/ # API 연동 명세
│ ├── frontend/integration/ # 연동 가이드
├── [기획팀]
│ ├── requests/ # 기획 요청
├── resources.md # 외부 자료 링크 (노션)
├── README.md # 사람용 안내
└── INDEX.md # 이 파일 (Claude Code용)
```
---
## 📚 폴더별 문서 목록
## 폴더별 문서 목록
### standards/ - 개발 표준
> 코딩 컨벤션, 스타일 가이드, 품질 기준
| 문서 | 설명 | 필수 확인 시점 |
|------|------|--------------|
| [api-rules.md](standards/api-rules.md) | API 개발 규칙 (Service-First, FormRequest, i18n) | API 개발 전 |
| [git-conventions.md](standards/git-conventions.md) | Git 커밋 메시지, 브랜치 전략 | 커밋 전 |
| [quality-checklist.md](standards/quality-checklist.md) | 코드 품질 체크리스트 | PR 전 |
### architecture/ - 아키텍처 & 설계 원칙
> 시스템 설계, 보안 정책, 아키텍처 결정
| 문서 | 설명 | 필수 확인 시점 |
|------|------|--------------|
| [system-overview.md](architecture/system-overview.md) | 전체 시스템 아키텍처 | 새 기능 설계 전 |
| [security-policy.md](architecture/security-policy.md) | 인증/인가, 보안 규칙 | 보안 관련 작업 전 |
### rules/ - 비즈니스 규칙
> 도메인 로직, 검증 규칙, 상태 전이
| 문서 | 설명 | 필수 확인 시점 |
|------|------|--------------|
| [README.md](rules/README.md) | 비즈니스 규칙 개요 | 도메인 로직 구현 전 |
| [item-policy.md](rules/item-policy.md) | 품목 정책 (유형 체계, 예약어, API 규칙) | 품목 관련 작업 전 |
| [pricing-policy.md](rules/pricing-policy.md) | 단가 정책 (원가/판매가 계산, 리비전 관리) | 단가 관련 작업 전 |
### specs/ - 기술 스펙
> 구현 명세, DB 스키마, 시스템 설정
| 문서 | 설명 | 필수 확인 시점 |
|------|------|--------------|
| [database-schema.md](specs/database-schema.md) | DB 구조 및 관계도 | DB 변경 전 |
| [board-system-spec.md](specs/board-system-spec.md) | 게시판 시스템 설계 | 게시판 작업 전 |
| [item-master-integration.md](specs/item-master-integration.md) | 품목관리 연동 설계 | 품목 연동 구현 시 |
| [docker-setup.md](specs/docker-setup.md) | Docker 환경 구성 | 환경 설정 시 |
| [remote-work-setup.md](specs/remote-work-setup.md) | 원격 개발 설정 | 원격 작업 시 |
### guides/ - 구현 가이드
> 특정 기능 구현을 위한 단계별 매뉴얼
| 문서 | 설명 | 필수 확인 시점 |
|------|------|--------------|
| [swagger-guide.md](guides/swagger-guide.md) | Swagger API 문서 작성법 | API 문서 작성 전 |
| [file-storage-guide.md](guides/file-storage-guide.md) | 파일 업로드/다운로드 구현 | 파일 기능 구현 전 |
| [item-management-migration.md](guides/item-management-migration.md) | Item 시스템 전환 가이드 | 마이그레이션 작업 전 |
| [project-launch-roadmap.md](guides/project-launch-roadmap.md) | 런칭 준비 현황 | 런칭 관련 작업 시 |
### quickstart/ - 빠른 시작
> 핵심 규칙 요약, 자주 쓰는 명령어
| 문서 | 설명 | 필수 확인 시점 |
|------|------|--------------|
| [quick-start.md](quickstart/quick-start.md) | 프로젝트 핵심 규칙 요약 | 세션 시작 시 |
| [dev-commands.md](quickstart/dev-commands.md) | 일상 개발 명령어 모음 | 명령어 확인 시 |
### front/ - 프론트엔드 공유 문서
> API 연동 가이드, 프론트엔드 스펙
### system/ — 시스템 현황
| 문서 | 설명 |
|------|------|
| [item-master-guide.md](front/item-master-guide.md) | 품목기준관리 페이지-섹션-필드 구조 |
| [overview.md](system/overview.md) | 전체 시스템 아키텍처 |
| [api-structure.md](system/api-structure.md) | API 서버 구조 (~1,027 엔드포인트) |
| [react-structure.md](system/react-structure.md) | React 프론트엔드 구조 |
| [mng-structure.md](system/mng-structure.md) | MNG 관리자 패널 구조 |
| [docker-setup.md](system/docker-setup.md) | Docker 환경 + CI/CD |
| [database/README.md](system/database/README.md) | DB 스키마 인덱스 |
| [security-policy.md](system/security-policy.md) | 보안 정책 |
| [scaling-roadmap.md](system/scaling-roadmap.md) | 스케일링 로드맵 |
| [board-system-spec.md](system/board-system-spec.md) | 게시판 시스템 설계 |
| [item-master-integration.md](system/item-master-integration.md) | 품목 마스터 통합 설계 |
| [erp-analysis/](system/erp-analysis/) | ERP 스토리보드 분석 |
> 날짜별 API 요청 문서는 `history/2025-11/front-requests/`로 이동됨
DB 도메인별:
### data/ - 데이터 분석
> 시스템 분석, 데이터 모델링
| 문서 | 도메인 |
|------|--------|
| [database/tenants.md](system/database/tenants.md) | 테넌트, 사용자, 권한 |
| [database/products.md](system/database/products.md) | 제품, 품목, 설계 |
| [database/sales.md](system/database/sales.md) | 영업, 수주, 견적 |
| [database/production.md](system/database/production.md) | 생산, 시공, 자재, 품질 |
| [database/finance.md](system/database/finance.md) | 재무, 회계 |
| [database/hr.md](system/database/hr.md) | 인사 |
| [database/documents.md](system/database/documents.md) | 문서, 전자서명 |
| [database/commons.md](system/database/commons.md) | 공통, 게시판, 감사 |
| [database/stats.md](system/database/stats.md) | 통계 |
---
### dev/standards/ — 개발 표준
| 문서 | 설명 |
|------|------|
| [analysis/item-db-analysis.md](data/analysis/item-db-analysis.md) | Item DB/API 분석 최종본 |
| [api-rules.md](dev/standards/api-rules.md) | API 개발 규칙 |
| [git-conventions.md](dev/standards/git-conventions.md) | Git 컨벤션 |
| [quality-checklist.md](dev/standards/quality-checklist.md) | 품질 체크리스트 |
| [pagination-policy.md](dev/standards/pagination-policy.md) | 페이지네이션 표준 |
| [options-column-policy.md](dev/standards/options-column-policy.md) | JSON options 컬럼 정책 |
### features/ - 기능별 문서
---
### rules/ — 비즈니스 규칙
| 문서 | 설명 |
|------|------|
| [boards/README.md](features/boards/README.md) | 게시판 시스템 구현 |
| [boards/mng-implementation.md](features/boards/mng-implementation.md) | MNG 게시판 구현 상세 |
| [hr/hr-api-analysis.md](features/hr/hr-api-analysis.md) | HR API 분석 (근태/직원/부서) |
| [item-policy.md](rules/item-policy.md) | 품목 정책 |
| [pricing-policy.md](rules/pricing-policy.md) | 단가 정책 |
| [numbering-rules.md](rules/numbering-rules.md) | 채번 규칙 |
| [client-policy.md](rules/client-policy.md) | 고객사 관리 정책 |
| [billing-policy.md](rules/billing-policy.md) | 과금 정책 (CONFIDENTIAL) |
| [customer-pricing.md](rules/customer-pricing.md) | 고객 요금표 |
| [partner-commission.md](rules/partner-commission.md) | 영업파트너 수당 체계 |
| [attendance-api.md](rules/attendance-api.md) | 근태 API 규칙 |
| [department-tree-api.md](rules/department-tree-api.md) | 부서 트리 API |
| [employee-api.md](rules/employee-api.md) | 직원 API |
### projects/ - 프로젝트별 문서
---
### features/ — 기능별 문서
| 문서 | 설명 |
|------|------|
| [quotes/README.md](features/quotes/README.md) | 견적 시스템 |
| [sales/README.md](features/sales/README.md) | 영업 관리 |
| [documents/README.md](features/documents/README.md) | 문서관리 |
| [finance/README.md](features/finance/README.md) | 재무 관리 |
| [hr/](features/hr/) | 인사관리 |
| [crm/README.md](features/crm/README.md) | CRM |
| [esign/README.md](features/esign/README.md) | 전자서명 |
| [equipment/README.md](features/equipment/README.md) | 설비관리 |
| [boards/README.md](features/boards/README.md) | 게시판 |
| [ai/README.md](features/ai/README.md) | AI 분석 |
| [card-vehicle/README.md](features/card-vehicle/README.md) | 법인카드·차량 |
| [settlement/README.md](features/settlement/README.md) | 정산 |
| [barobill-kakaotalk/README.md](features/barobill-kakaotalk/README.md) | 바로빌 카카오톡 |
---
### dev/guides/ — 구현 가이드
| 문서 | 설명 |
|------|------|
| [swagger-guide.md](dev/guides/swagger-guide.md) | Swagger 작성법 |
| [file-storage-guide.md](dev/guides/file-storage-guide.md) | 파일 업로드/다운로드 |
| [item-management-migration.md](dev/guides/item-management-migration.md) | Item 전환 가이드 |
| [server-how-it-works.md](dev/guides/server-how-it-works.md) | 서버 동작 원리 |
| [jenkins-setup-guide.md](dev/guides/jenkins-setup-guide.md) | Jenkins CI/CD |
| [erp-api-list.md](dev/guides/erp-api-list.md) | ERP API 목록 |
| [erp-api-detail.md](dev/guides/erp-api-detail.md) | ERP API 상세 |
| [item-master-guide.md](dev/guides/item-master-guide.md) | 품목기준관리 구조 |
---
### projects/ — 프로젝트 자료
| 프로젝트 | 문서 | 설명 |
|---------|------|------|
| **MES** | [README.md](projects/mes/README.md) | MES 프로젝트 개요 |
| **MES** | [MES_PROJECT_ROADMAP.md](projects/mes/MES_PROJECT_ROADMAP.md) | 개발 로드맵 |
| **Legacy** | [draw-module.md](projects/legacy-5130/draw-module.md) | 레거시 드로우 모듈 |
| MES | [projects/mes/README.md](projects/mes/README.md) | MES 개요 |
| 5130 이관 | [projects/5130-migration/](projects/5130-migration/) | 레거시 이관 |
| API 연동 | [projects/api-integration/](projects/api-integration/) | React↔API |
| 견적 | [projects/quotation/](projects/quotation/) | 견적 프로젝트 |
| 전자서명 | [projects/e-sign/](projects/e-sign/) | 전자서명 |
### history/ - 히스토리
---
| 기간 | 문서 |
### dev/deploys/ — 배포/운영
| 문서 | 설명 |
|------|------|
| **2025-11** | [item-master-gap-analysis.md](history/2025-11/item-master-gap-analysis.md), [item-master-spec.md](history/2025-11/item-master-spec.md), [front-requests/](history/2025-11/front-requests/), [item-master-archived/](history/2025-11/item-master-archived/) |
| **2025-09** | [checkpoint.md](history/2025-09/checkpoint.md), [database-schema.md](history/2025-09/database-schema.md) |
| **Roadmaps** | [december-2025.md](history/roadmaps/december-2025.md) |
| [ops-manual/README.md](dev/deploys/ops-manual/README.md) | 서버 운영 매뉴얼 |
---
## 🏗️ 서브프로젝트 문서
### dev/quickstart/ — 빠른 시작
각 서브프로젝트는 독립적인 `docs/` 디렉토리를 가집니다.
| 프로젝트 | 문서 경로 | 설명 |
|---------|----------|------|
| **API** | [api/docs/INDEX.md](../api/docs/INDEX.md) | REST API 프로젝트 |
| **MNG** | [mng/docs/INDEX.md](../mng/docs/INDEX.md) | Plain Laravel 관리자 (운영 주력) |
| **Admin** | [admin/docs/INDEX.md](../admin/docs/INDEX.md) | Filament 관리자 (deprecated) |
| **React** | [react/docs/](../react/docs/) | Next.js 프론트엔드 |
| 문서 | 설명 |
|------|------|
| [quick-start.md](dev/quickstart/quick-start.md) | 핵심 규칙 요약 |
| [dev-commands.md](dev/quickstart/dev-commands.md) | 개발 명령어 모음 |
---
## 📝 문서 작성 가이드
### 서브프로젝트 문서
### 새 문서 작성 시
1. **적절한 폴더 선택**: 위 폴더 구조 참고
2. **파일명**: 소문자 + 하이픈 (kebab-case)
3. **크기 목표**: 10KB 이하
4. **INDEX 업데이트**: 새 문서는 반드시 이 파일에 추가
### 폴더 선택 기준
- **"개발 계획/작업 예정"** → `plans/` (임시, 완료 후 삭제)
- **"어떻게 코드 작성?"** → `standards/`
- **"왜 이렇게 설계?"** → `architecture/`
- **"무엇이 유효한 데이터?"** → `rules/`
- **"무엇을 구현?"** → `specs/`
- **"어떻게 구현?"** → `guides/`
### plans/ 워크플로우
1. 개발 계획 문서를 `plans/`에 작성
2. 작업 진행
3. 완료 후 결과물을 해당 프로젝트 docs에 정리
4. plan 문서 삭제
### plans/flow-tests/
API Flow Tester에서 생성되는 JSON 파일 저장 경로
- 경로: `plans/flow-tests/*.json`
- 용도: MNG API Flow Tester 테스트 시나리오
- 예시: `item-master-page-api-flow.json`, `client-api-flow.json`
| 프로젝트 | 경로 |
|---------|------|
| API | [api/docs/](../api/docs/) |
| MNG | [mng/docs/](../mng/docs/) |
| React | [react/docs/](../react/docs/) |
---
## 🔄 문서 구조 변경 이력
## 폴더 선택 기준
- **2025-12-09**: 품목 정책 통합 문서 생성
- `rules/item-policy.md` 생성 (4개 문서 통합)
- 삭제: `specs/ITEM-MASTER-INDEX.md`, `specs/item-master-field-key-validation.md`, `specs/item-master-field-integration.md`, `plans/items-api-unified-plan.md`
- 품목 관련 정책을 rules/ 디렉토리로 이동
- **2025-12-09**: Item Master 문서 정리 및 인덱스 생성
- `specs/ITEM-MASTER-INDEX.md` 생성 (개발 현황/필요 항목 정리)
- `history/2025-11/item-master-archived/` 생성 (구버전 문서 아카이브)
- 중복 문서 정리 (front-requests → history 이동)
- **2025-12-09**: 문서 정리 및 통합
- 중복 분석 문서 삭제 (v2, DB_Modeling)
- `SAM_Item_DB_API_Analysis_v3_FINAL.md``item-db-analysis.md` 리네임
- `ITEM_MASTER_FIELD_INTEGRATION_PLAN.md``item-master-field-integration.md` 리네임
- `HR_API_ANALYSIS.md``features/hr/hr-api-analysis.md` 이동
- 날짜 접두사 front 문서 → `history/2025-11/front-requests/` 이동
- api/docs에서 프로젝트 문서 분리 (swagger, api-flows만 유지)
- **2025-12-09**: api/docs 문서 통합
- `api/docs/analysis/``docs/data/analysis/` 이동
- `api/docs/front/``docs/front/` 병합
- `api/docs/specs/``docs/specs/` 병합
- api/docs에는 API 구성/설정 문서만 유지 (swagger, api-flows)
- **2025-12-09**: `plans/` 폴더 추가
- 개발 계획 문서용 임시 폴더
- 작업 완료 후 정리 → 삭제 워크플로우
- **2025-12-05**: 폴더 구조 대폭 재정리
- `reference/``standards/`, `architecture/`, `quickstart/`로 분리
- `principles/``architecture/`로 통합
- 작업별 필수 문서 가이드 추가
- **2025-11-20**: 문서 구조 대규모 재정리
- claudedocs → docs/ 체계화
- 각 서브프로젝트별 docs/ 디렉토리 생성
| 질문 | 폴더 |
|------|------|
| 시스템 현재 상태? | `system/` |
| 코드 작성 규칙? | `dev/standards/` |
| 비즈니스 규칙? | `rules/` |
| 기능 동작 방식? | `features/` |
| 구현 방법? | `dev/guides/` |
| 개발 계획? | `dev/dev_plans/` |
| 프로젝트 자료? | `projects/` |
| 변경 이력? | `dev/changes/` |

128
README.md Normal file
View File

@@ -0,0 +1,128 @@
# SAM 프로젝트 문서
SAM ERP 시스템의 기술 문서, 비즈니스 규칙, 기능 명세를 관리하는 저장소입니다.
---
## 대상별 안내
### 전 팀 공유
누구나 참고할 수 있는 공통 문서입니다.
| 폴더 | 설명 | 예시 |
|------|------|------|
| **features/** | 기능별 상세 명세 | 견적, CRM, 문서관리, 인사, 재무 등 |
| **rules/** | 비즈니스 규칙·정책 | 품목 정책, 단가 정책, 채번 규칙, 청구 정책 |
| **projects/** | 프로젝트별 자료 | MES, 5130 마이그레이션, 전자서명 등 |
| **system/** | 시스템 현황 | 아키텍처, DB 스키마, Docker, 인프라 |
| **resources.md** | 외부 자료 링크 | BI, 제품 소개서 등 대용량 자료 (노션 링크) |
### 개발팀 전용 (`dev/`)
개발 표준, 가이드, 변경 이력 등 개발자 대상 문서입니다.
| 폴더 | 설명 | 예시 |
|------|------|------|
| **dev/standards/** | 개발 표준 | API 규칙, Git 컨벤션, 품질 체크리스트 |
| **dev/guides/** | 구현 가이드 | Swagger 작성법, 파일 저장, Jenkins 설정 |
| **dev/quickstart/** | 빠른 시작 | 개발 명령어, 퀵스타트 가이드 |
| **dev/changes/** | 변경 이력 | 날짜별 변경 내용 기록 |
| **dev/deploys/** | 배포·운영 | 운영 매뉴얼, 배포 SQL |
| **dev/data/** | 데이터 분석 | BOM 매핑 분석, 견적 데이터 |
| **dev/history/** | 과거 이력 | 월별 히스토리, 로드맵 |
| **dev/dev_plans/** | 개발 계획 | 작업별 계획 문서 (개인 작업용, 정리 후 폐기 가능) |
### 프론트엔드 전용 (`frontend/`)
프론트엔드 개발자 대상 문서입니다.
| 폴더 | 설명 | 예시 |
|------|------|------|
| **frontend/api-specs/** | API 연동 명세 | 문서 API 연동 가이드 |
| **frontend/integration/** | 프론트-백엔드 연동 | 연동 패턴, 주의사항 |
### 기획팀 (`requests/`)
기획 요청 및 확인 문서입니다.
| 폴더 | 설명 | 예시 |
|------|------|------|
| **requests/** | 기획 확인 요청 | 기획서 검토 요청, 워크플로우 공유 |
---
## 폴더 구조
```
docs/
├── features/ # [공유] 기능별 상세 명세
│ ├── quotes/ # 견적 시스템
│ ├── sales/ # 영업/수주
│ ├── documents/ # 문서관리
│ ├── finance/ # 재무/회계
│ ├── hr/ # 인사관리
│ ├── crm/ # 고객관리
│ ├── esign/ # 전자서명
│ ├── equipment/ # 설비관리
│ ├── boards/ # 게시판
│ ├── ai/ # AI 기능
│ └── ...
├── rules/ # [공유] 비즈니스 규칙
│ ├── item-policy.md
│ ├── pricing-policy.md
│ ├── numbering-rules.md
│ └── ...
├── projects/ # [공유] 프로젝트별 자료
│ ├── mes/
│ ├── 5130-migration/
│ ├── e-sign/
│ └── ...
├── system/ # [공유] 시스템 현황
│ ├── overview.md
│ ├── database/
│ ├── docker-setup.md
│ └── ...
├── resources.md # [공유] 외부 자료 링크 (노션)
├── dev/ # [개발팀] 개발 전용
│ ├── standards/ # 개발 표준
│ ├── guides/ # 구현 가이드
│ ├── quickstart/ # 빠른 시작
│ ├── changes/ # 변경 이력
│ ├── deploys/ # 배포/운영
│ ├── data/ # 데이터 분석
│ ├── history/ # 과거 이력
│ └── dev_plans/ # 개발 계획 (개인 작업용)
├── frontend/ # [프론트엔드] 프론트 전용
│ ├── api-specs/ # API 연동 명세
│ └── integration/ # 연동 가이드
├── requests/ # [기획팀] 기획 요청
├── README.md # 이 문서 (사람용 안내)
├── INDEX.md # Claude Code용 문서 인덱스
└── TODO.md
```
---
## 문서 작성 규칙
### 파일 이름
- 영문 소문자, 하이픈(`-`) 구분: `item-policy.md`
- 변경 이력: `YYYYMMDD_설명.md` (예: `20260305_login_fix.md`)
- 한글 파일명 허용 (가이드 등 내부 문서)
### 문서 구조
- 모든 MD 파일은 `# 제목`으로 시작
- 폴더에 파일이 3개 이상이면 `README.md`로 목차 제공
- 이미지/대용량 파일은 노션에 업로드하고 `resources.md`에 링크 추가
### 폴더 관리
- **공유 폴더**: 전 팀이 수정 가능, 변경 시 관련 팀에 공유
- **dev/**: 개발팀만 수정
- **frontend/**: 프론트엔드 팀만 수정 (API 명세는 개발팀이 제공)
- **requests/**: 기획팀이 작성, 개발팀이 확인
- **dev/dev_plans/**: 개인 작업용, 완료 후 archive/ 이동 또는 삭제

View File

@@ -1,20 +0,0 @@
# Architecture (아키텍처 & 설계 원칙)
> 시스템 설계와 아키텍처 결정의 근간 - **"왜 이렇게 설계하는가"**
## 목적
- 일관된 아키텍처 결정 기준 제공
- 기술 부채 방지
- 확장성과 유지보수성 확보
## 문서 목록
| 문서 | 설명 | 필수 확인 시점 |
|------|------|--------------|
| [system-overview.md](system-overview.md) | 전체 시스템 아키텍처 | 새 기능 설계 전 |
| [security-policy.md](security-policy.md) | 인증/인가, 보안 규칙 | 보안 관련 작업 전 |
## 관련 폴더
- [standards/](../standards/) - 개발 표준 (어떻게 코드를 작성할 것인가)
- [rules/](../rules/) - 비즈니스 규칙 (무엇이 유효한 데이터인가)
- [specs/](../specs/) - 기술 스펙 (무엇을 구현할 것인가)

View File

@@ -1,359 +0,0 @@
# SAM 시스템 아키텍처
**업데이트**: 2025-11-18
---
## 전체 아키텍처
SAM은 다중 애플리케이션 Laravel 기반 시스템으로 구성됩니다:
```
SAM/
├── admin/ # Laravel 12 + Filament v4 (관리자 패널, 점차 deprecated)
├── api/ # Laravel 12 REST API (백엔드)
├── mng/ # Laravel 12 + Plain Blade/Tailwind (운영 관리자 패널)
├── react/ # Next.js 15 프론트엔드
├── 5130/ # 레거시 PHP 애플리케이션
└── docker/ # Docker 설정
```
## 애플리케이션별 상세
### admin/ - 관리자 패널
**기술 스택:**
- Laravel 12
- Filament v4
- TailwindCSS + Vite
**주요 기능:**
- 테넌트 관리
- 사용자 관리
- 권한 관리 (RBAC)
- 메뉴 관리
- 역할 및 부서 관리
**개발 명령어:**
```bash
composer dev # 전체 서비스 실행
php artisan serve # Laravel 서버
npm run dev # Vite HMR
```
### mng/ - Plain Laravel 관리자 패널
**기술 스택:**
- Laravel 12
- PHP 8.4
- Pure Blade + Tailwind CSS 3.x
- Sanctum (인증)
**주요 특징:**
- AI 없이 수정 가능한 단순 구조
- Filament 의존성 제거
- admin/ 기능 점진적 이식
- 좌측 사이드바 + 상단 헤더 레이아웃
**개발 명령어:**
```bash
php artisan serve # Laravel 서버
npm run dev # Vite HMR (Tailwind)
```
**현재 진행 상황:**
- ✅ Phase 1: 인증 시스템 (로그인/로그아웃)
- ✅ Phase 2: 레이아웃 구조 (sidebar + header)
- ✅ Phase 3: 테넌트 선택 기능
- 🔄 Phase 4: 시스템 관리 메뉴 (admin/ 이식)
### api/ - REST API
**기술 스택:**
- Laravel 12
- PHP 8.4
- Sanctum (인증)
- l5-swagger 9.0 (API 문서화)
**주요 기능:**
- RESTful API 엔드포인트
- Swagger 문서화
- Multi-tenant 지원
- 권한 기반 접근 제어
**API 구조:**
- **인증**: `/v1/login`, `/v1/logout`, `/v1/signup`
- **사용자**: `/v1/users/*`
- **테넌트**: `/v1/tenants/*`
- **제품**: `/v1/products/*`
- **자재**: `/v1/materials/*`
- **카테고리**: `/v1/categories/*`
- **파일**: `/v1/file/*`
- **디자인**: `/v1/design/*`
**API 문서:**
- Swagger UI: `http://api.sam.kr/api-docs/index.html`
- JSON Spec: `http://api.sam.kr/docs/api-docs.json`
### react/ - Next.js 프론트엔드
**기술 스택:**
- Next.js 15
- React 19.2.0
- TypeScript 5.x
- Tailwind CSS v4
- Zustand (상태 관리)
- React Hook Form
- shadcn/ui
- next-intl (i18n)
**주요 기능:**
- 모던 UI/UX
- Server Components 및 App Router
- 실시간 데이터 동기화
- 역할 전환 기능
- 대시보드
- 다국어 지원 (i18n)
## Multi-tenant 아키텍처
### 데이터 격리
- **방식**: `tenant_id` 컬럼 기반 격리
- **스코프**: BelongsToTenant global scope 자동 적용
- **모델**: `shared/Models/` 디렉토리의 공통 모델 사용
### 테넌트 구조
```
Tenant (회사/조직)
├── Users (사용자)
├── Departments (부서)
├── Roles (역할)
├── Permissions (권한)
└── Data (비즈니스 데이터)
```
### 테넌트 전환
- 사용자는 여러 테넌트에 속할 수 있음 (`user_tenants` 테이블)
- 기본 테넌트 설정 가능
- API: `POST /v1/users/me/tenants/switch`
## 인증 및 권한
### 인증 흐름
1. **API Key 인증** (모든 요청)
- 헤더: `X-API-KEY`
- 미들웨어: `auth.apikey`
2. **사용자 인증** (보호된 라우트)
- 엔드포인트: `POST /v1/login`
- 토큰: Sanctum Bearer Token
- 미들웨어: `auth:sanctum`
### 권한 시스템
**3단계 권한 구조:**
1. **사용자 역할 권한**: User → Role → Permissions
2. **사용자 직접 권한**: User → Permissions
3. **부서 역할 권한**: User → Department → Role → Permissions
**권한 명명 규칙:**
```
menu:{menu_id}.{permission_type}
```
**권한 타입:**
- `view` - 조회
- `create` - 생성
- `update` - 수정
- `delete` - 삭제
- `approve` - 승인
- `export` - 내보내기
- `manage` - 관리
## 데이터베이스 구조
### 핵심 테이블
**인증 및 권한:**
- `api_keys` - API 키 관리
- `users` - 사용자 계정
- `user_tenants` - 사용자-테넌트 관계
- `permissions` - 권한 정의
- `roles` - 역할 정의
- `model_has_permissions/roles` - 권한 할당
**멀티테넌트:**
- `tenants` - 테넌트 마스터
- `tenant_user_profiles` - 테넌트별 사용자 프로필
- `departments` - 부서 구조
- `department_user` - 사용자-부서 관계
**제품 관리:**
- `categories` - 카테고리 계층
- `category_fields` - 동적 필드 정의
- `products` - 제품 카탈로그
- `product_components` - BOM 관계
- `materials` - 자재 마스터
**디자인 및 제조:**
- `models` - 디자인 모델
- `model_versions` - 모델 버전
- `bom_templates` - BOM 템플릿
- `bom_template_items` - BOM 항목
**주문 및 운영:**
- `orders` - 주문/견적 마스터
- `order_items` - 주문 항목
- `order_item_components` - 주문 항목 구성
- `clients` - 고객/벤더 마스터
**시스템:**
- `audit_logs` - 감사 로그 (13개월 보관)
- `files` - 다형성 파일 첨부
- `common_codes` - 공통 코드
### 공통 컬럼 패턴
모든 테이블에 공통으로 포함:
- `id` - 기본 키
- `tenant_id` - 테넌트 ID (필수)
- `created_by` - 생성자 ID
- `updated_by` - 수정자 ID
- `deleted_by` - 삭제자 ID
- `created_at`, `updated_at` - 타임스탬프
- `deleted_at` - Soft Delete
## 미들웨어 스택
**실행 순서:**
1. `ApiRateLimiter` - Rate Limiting
2. `ApiKeyMiddleware` - API Key 검증
3. `CheckSwaggerAuth` - Swagger 인증 체크
4. `CorsMiddleware` - CORS 처리
5. `CheckPermission` - 권한 검증
6. `PermMapper` - 권한 매핑
## 라우팅 구조
**기본 경로 그룹:**
```php
Route::prefix('v1')->middleware(['auth.apikey'])->group(function () {
// 공개 라우트
Route::post('/login', [AuthController::class, 'login']);
// 보호된 라우트
Route::middleware(['auth:sanctum'])->group(function () {
Route::get('/users', [UserController::class, 'index']);
// ...
});
});
```
## 공유 모델 구조
`shared/Models/` 디렉토리 구조:
- **Members/** - 사용자 및 테넌트 관리
- **Products/** - 제품 카탈로그 및 BOM
- **Materials/** - 자재 사양 및 재고
- **Orders/** - 주문 처리 워크플로우
- **Tenants/** - 멀티테넌트 설정
- **Commons/** - 공유 유틸리티 및 공통 데이터
## Docker 설정
**위치**: `docker/` 디렉토리
### 서비스 구성
**docker-compose.yml**에 정의된 5개 서비스:
1. **nginx** - 리버스 프록시 서버
- 포트: 80
- 도메인: `api.sam.kr`, `admin.sam.kr`, `dev.sam.kr`
- 보안 규칙 적용 (경로 탐색 공격 차단, User-Agent 필터링)
2. **api** - Laravel 12 API 서버
- 이미지: `php:8.4-fpm`
- PHP 확장: zip, mysqli, pdo, pdo_mysql, intl
- Supervisor로 nginx + php-fpm 동시 실행
3. **admin** - Laravel 12 Admin 패널
- 이미지: `php:8.4-fpm`
- Filament v4 지원
- Supervisor로 nginx + php-fpm 동시 실행
4. **react** - Next.js 15 프론트엔드
- 이미지: `node:20-alpine`
- 포트: 3000 (내부)
- HMR 지원 (WebSocket)
5. **mysql** - MySQL 8.0 데이터베이스
- 포트: 3306
- 데이터베이스: `samdb`
- 사용자: `samuser` / `sampass`
### 네트워크 구조
```
samnet (bridge network)
├── nginx (리버스 프록시)
├── api (Laravel API)
├── admin (Laravel Admin)
├── react (Next.js)
└── mysql (데이터베이스)
```
### 도메인 매핑
| 도메인 | 대상 서비스 | 포트 | 용도 |
|--------|-----------|------|------|
| `api.sam.kr` | api (Laravel) | 80 | REST API |
| `admin.sam.kr` | admin (Laravel) | 80 | 관리자 패널 |
| `dev.sam.kr` | react (Next.js) | 3000 | 프론트엔드 |
### 주요 설정 파일
**nginx/nginx.conf**
- 리버스 프록시 설정
- 보안 규칙 (경로 탐색, User-Agent 필터링)
- WebSocket 지원 (Next.js HMR)
**api/Dockerfile, admin/Dockerfile**
- PHP 8.4-fpm 기반
- Composer 2 포함
- Supervisor 설정
**react/Dockerfile**
- Node.js 20 Alpine
- Next.js 15 개발 서버
**mysql/init.sql**
- 초기 데이터베이스 설정
## 저장소 구조
이 프로젝트는 **3개의 독립적인 Git 저장소**로 구성됩니다:
1. **api/** - API 프로젝트 저장소
2. **admin/** - 관리자 패널 저장소
3. **react/** - Next.js 프론트엔드 저장소
각 저장소는 독립적으로 운영되며:
- 개별 Git 히스토리 및 브랜치
- 독립적인 환경 설정 (`.env` 파일)
- 독립적인 의존성 및 빌드 프로세스
## 관련 문서
- [API 개발 규칙](./api_rules.md)
- [데이터베이스 스키마](./database_schema.md)
- [보안 가이드](./security.md)
- [Git 컨벤션](./git_conventions.md)
---
**최종 업데이트**: 2025-11-18 (PHP 8.4, Filament v4, Next.js 15 반영)

BIN
assets/bi/sam_bi_black.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
assets/bi/sam_bi_blue.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
assets/bi/sam_bi_green.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
assets/bi/sam_bi_orange.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
assets/bi/sam_bi_purple.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
assets/bi/sam_bi_red.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
assets/bi/sam_bi_white.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

370
brochure/README.md Normal file
View File

@@ -0,0 +1,370 @@
# SAM 브로셔 버전 관리
> **작성일**: 2026-03-01
> **상태**: 운영 중
---
## 1. 개요
SAM CEO Dashboard 및 ERP/MES 영업 브로셔의 버전별 디자인 변천을 기록한다.
모든 브로셔는 세로형(9:16) HTML로 작성하며, `pptx-skill`(html2pptx.js)로 PPTX 변환한다.
---
## 2. 버전 요약
| 버전 | 대상 | 테마 | 배경색 | 주 액센트 | 비고 |
|------|------|------|--------|-----------|------|
| **v1** | 전체 고객 | 다크 | `#0F2439` | `#10B981` (에메랄드) | SAM ERP/MES 범용 |
| **v2** | 경영진 | 다크 | `#0B1929` | `#0EA5E9` (스카이블루) | CEO Dashboard 초판 |
| **v3** | 경영진 | 다크 | `#0B1929` | `#0EA5E9` (스카이블루) | v2 개선, Before/After 추가 |
| **v4** | 경영진 | 라이트 | `#F8FAFC` | `#0EA5E9` (스카이블루) | v3의 밝은 배경 변환 |
| **v5** | 경영진 | 프리미엄 그래디언트 | `#0F172A→#312E81` | `#FBBF24` (골드) | 글래스모피즘 + 골드 |
| **v6** | 경영진 | 코퍼레이트 블루 | `#FFFFFF` | `#2563EB` (블루) | 대기업/공공기관 스타일 |
| **v7** | 경영진 | 웜 그레이 + 틸 | `#FAFAF9` | `#0D9488` (틸) | IT/SaaS 스타일 |
| **v8** | 경영진 | 투톤 스플릿 | `#1E293B` / `#FFFFFF` | `#F97316` (오렌지) | 금융/컨설팅 스타일 |
| **v9** | 경영진 | 미니멀 화이트 | `#FFFFFF` | `#6366F1` (인디고) | Apple/디자인 에이전시 |
---
## 3. 버전별 상세
### 3.1 v1 — SAM ERP/MES 범용 브로셔
**컨셉**: 중소 제조업 대상 SAM 플랫폼 전체 기능 소개
| 항목 | 값 |
|------|------|
| 배경 | `#0F2439` (네이비) |
| 주 액센트 | `#10B981` (에메랄드 그린) |
| 보조 액센트 | `#2E86AB`, `#8B5CF6`, `#E86F2C` |
| 카드 스타일 | 반투명 배경 + 컬러 보더 |
| BI 로고 | `sam_bi_white.png` |
**앞면 구성**:
- 히어로: "중소 제조업을 위한 ERP/MES 통합 플랫폼"
- 고민 포인트: Excel 과의존, 실시간 가시성, 품질관리, 높은 ERP 비용
- 효과 지표: 시간 절감 80%, 납기 준수 95%, 추적성 100%, 인사/회계 무료
- 기술 태그: 클라우드, 모바일 대응, 멀티테넌트
**뒷면 구성**:
- 8대 핵심 모듈 (01~08 번호 뱃지): 품목/BOM, 견적/수주, 생산/MES, 출하, 품질, 자재, 인사/회계, 대시보드
- 확장 기능: 전자서명, 알림톡, AI Lab, QR
- 가격표: 기본 2,000만원 + 월 50만원
- 도입 프로세스: 인터뷰 → 개발 → 이관 → 교육
---
### 3.2 v2 — CEO Dashboard 초판
**컨셉**: 경영진 타겟, 대시보드 중심 소개. 문제→해결 스토리텔링
| 항목 | 값 |
|------|------|
| 배경 | `#0B1929` (짙은 네이비) |
| 주 액센트 | `#0EA5E9` (스카이블루) |
| 보조 액센트 | `#10B981`, `#8B5CF6`, `#F59E0B`, `#EF4444`, `#EC4899` |
| 카드 스타일 | 반투명 다크 카드 |
| BI 로고 | `sam_bi_white.png` |
**앞면 구성**:
- 히어로: "대표님, 지금 우리 회사 어떻게 돌아가고 있나요?"
- 시간대별 고민: 오전 9시(매출 보고 대기), 오후 2시(수주 취합), 오후 5시(결재 서류)
- 대시보드 Mock UI: KPI 카드 4개 + 매출 추이 차트 + 조직 성과 바 차트
- 약속 박스: "실시간 KPI 파악"
**뒷면 구성**:
- 대시보드 7대 기능 (01~07 뱃지)
- 역할별 맞춤 화면: CEO, 관리자, 운영자, 영업자
- SAM 플랫폼 연동: 견적/수주, 생산, 품질, 재고, 인사/회계
- 가격표 + 도입 프로세스
**v1 대비 차이**:
- 타겟이 전체→경영진으로 좁혀짐
- 타임라인 기반 문제 제시 (시간대별 고민)
- 대시보드 UI Mock 삽입
- 역할별 화면 분리 소개
---
### 3.3 v3 — CEO Dashboard 개선판 (다크)
**컨셉**: v2 기반 개선. Before/After 인포그래픽 추가, SVG 아이콘 강화
| 항목 | 값 |
|------|------|
| 배경 | `#0B1929` (짙은 네이비) |
| 주 액센트 | `#0EA5E9` (스카이블루) |
| 카드 스타일 | 반투명 다크 + 컬러 보더 |
| BI 로고 | `sam_bi_white.png` |
**v2 대비 개선사항**:
- 1page 통합본 추가
- Before/After 비교 인포그래픽 도입
- 핵심 가치 3카드: 즉시 현황 파악, 데이터로 판단, 모바일 승인
- SVG 인라인 아이콘 전면 적용 (외부 이미지 의존 제거)
- PPTX 텍스트 줄바꿈 방지 패턴 적용 (`white-space: nowrap`, 개별 `<p>` 분리)
---
### 3.4 v4 — CEO Dashboard 라이트 버전
**컨셉**: v3와 동일 콘텐츠, 밝은 배경으로 색상 전환
| 항목 | 값 |
|------|------|
| 배경 | `#F8FAFC` (밝은 슬레이트) |
| 주 액센트 | `#0EA5E9` (스카이블루) |
| 제목 텍스트 | `#0F172A` |
| 본문 텍스트 | `#475569` |
| 보조 텍스트 | `#94A3B8` |
| 카드 스타일 | 화이트 + `box-shadow` + `#E2E8F0` 보더 |
| BI 로고 | `sam_bi_black.png` |
**v3 → v4 색상 변환 규칙**:
| 요소 | v3 (다크) | v4 (라이트) |
|------|-----------|------------|
| 배경 | `#0B1929` | `#F8FAFC` |
| 카드 | `#111D2E` 반투명 | `#FFFFFF` + shadow |
| 제목 | `#FFFFFF` | `#0F172A` |
| 본문 | `rgba(255,255,255,0.55)` | `#475569` |
| 보조 | `rgba(255,255,255,0.3)` | `#94A3B8` |
| 구분선 | `rgba(14,165,233,0.15)` | `#E2E8F0` |
| 기술 태그 | `rgba(255,255,255,0.03)` | `#F1F5F9` |
| 액센트 | 동일 유지 | 동일 유지 |
---
### 3.5 v5 — Premium Executive Gradient
**컨셉**: 고급 프리미엄 감성. 네이비→인디고 그래디언트 + 골드 액센트 + 글래스모피즘
| 항목 | 값 |
|------|------|
| 배경 | `#0F172A → #1E1B4B → #312E81` (175deg 그래디언트) |
| 주 액센트 | `#FBBF24` (골드/앰버) |
| 보조 액센트 | `#10B981`, `#8B5CF6`, `#EF4444`, `#F59E0B`, `#EC4899` |
| 카드 스타일 | 글래스모피즘 (`rgba(255,255,255,0.05)` + `rgba(255,255,255,0.1)` border) |
| BI 로고 | `sam_bi_white.png` |
| 뱃지 | "EXECUTIVE EDITION" 골드 뱃지 |
**앞면 구성**:
- 히어로: "대표님의 시간은 보고를 기다리는 데 쓰여선 안 됩니다."
- 잃어버린 시간 카드: 1~2일(매출), 반나절(수주), 30분(결재) — 빨간 톤
- 골드 전환 구분선: "SAM 도입 후"
- 대시보드 Mock: 골드 차트 라인, 글래스모피즘 카드
- 약속 박스: 골드 테두리
**뒷면 구성**:
- 7대 기능 리스트 (글래스모피즘 카드)
- 역할별 맞춤 화면: CEO(골드), 관리자(그린), 운영자(앰버), 영업자(퍼플)
- 가격표: 골드 강조
- 도입 프로세스: 골드 화살표 연결
**기술 특이사항**:
- body CSS gradient → PPTX 미지원 → Sharp로 PNG 사전 렌더링
- HTML body는 `#1A1640`(단색 fallback), convert 스크립트에서 `slide.background`로 그래디언트 PNG 덮어쓰기
- 구분선 gradient도 solid rgba로 변환 (PPTX 호환)
---
### 3.6 v6 — Corporate Blue & White
**컨셉**: 대기업/공공기관 프레젠테이션 스타일. 정돈된 블루 헤더 바 + 순백색 본문
| 항목 | 값 |
|------|------|
| 배경 | `#FFFFFF` (순백) |
| 헤더 바 | `#1E40AF` (로열 블루) |
| 주 액센트 | `#2563EB` (블루) |
| 보조 배경 | `#EFF6FF` (블루-50), `#DBEAFE` (블루-100) |
| 카드 스타일 | 화이트 + `#DBEAFE` 보더 |
| BI 로고 | `sam_bi_white.png` (헤더), `sam_bi_black.png` (본문) |
**특징**:
- 풀 폭 블루 헤더 바에 흰색 BI 로고 + 뱃지 배치
- 섹션 라벨은 블루-50 배경 + 로열블루 텍스트 뱃지
- 대시보드 Mock UI: `#DBEAFE` 보더 카드
- CTA: 블루 배경 풀 폭 바
---
### 3.7 v7 — Warm Gray + Teal
**컨셉**: IT/SaaS 기업 스타일. 따뜻한 그레이 배경 + 틸(Teal) 액센트
| 항목 | 값 |
|------|------|
| 배경 | `#FAFAF9` (웜 그레이) |
| 주 액센트 | `#0D9488` (틸) |
| 보조 액센트 | `#10B981`, `#8B5CF6`, `#EF4444`, `#F59E0B`, `#EC4899` |
| 카드 스타일 | 화이트 + `#E7E5E4` 보더 + 미세 그림자 |
| 구분선 | `#D6D3D1` |
| BI 로고 | `sam_bi_black.png` |
**특징**:
- 부드러운 웜 톤 배경으로 눈의 피로 감소
- 틸 계열 SVG 아이콘 전면 적용
- 가벼운 카드 스타일로 정보 구분
- 타임라인 인포그래픽: 시간대별 고민 (9AM/2PM/5PM)
---
### 3.8 v8 — Two-Tone Navy/White Split
**컨셉**: 금융/컨설팅 프레젠테이션 스타일. 다크 상단 + 화이트 하단 투톤 분할
| 항목 | 값 |
|------|------|
| 상단 배경 | `#1E293B` (슬레이트-800) |
| 하단 배경 | `#FFFFFF` (순백) |
| 주 액센트 | `#F97316` (오렌지) |
| 보조 액센트 | `#FB923C` (오렌지-400) |
| 카드 (다크) | `rgba(255,255,255,0.08)` + `rgba(255,255,255,0.12)` 보더 |
| 카드 (라이트) | 화이트 + `#E2E8F0` 보더 + 컬러 좌측 보더 |
| BI 로고 | `sam_bi_white.png` (다크), `sam_bi_black.png` (라이트) |
**특징**:
- 앞면 상단: 다크 존에 KPI 카드 + 히어로 메시지
- 앞면 하단: 화이트 존에 가치 카드 + 기능 그리드
- 기능 카드에 컬러 좌측 보더 포인트 (오렌지/그린/퍼플/레드)
- 다크 CTA 박스: 하단 풀 폭 다크 배경 + 오렌지 액센트
---
### 3.9 v9 — Minimal White + Indigo
**컨셉**: Apple/디자인 에이전시 스타일. 극도의 미니멀리즘 + 인디고 수직 액센트 라인
| 항목 | 값 |
|------|------|
| 배경 | `#FFFFFF` (순백) |
| 주 액센트 | `#6366F1` (인디고) |
| 카드 배경 | `#F8FAFC` (거의 투명한 그레이) |
| 카드 보더 | `#F1F5F9` |
| 본문 텍스트 | `#334155` (슬레이트-700) |
| 보조 텍스트 | `#94A3B8` |
| BI 로고 | `sam_bi_black.png` |
**특징**:
- 좌측 3pt 인디고 수직 액센트 라인 (풀 하이트)
- 타이포그래피 중심 레이아웃 (아이콘 최소화)
- 거의 보이지 않는 카드 구분 (barely-there cards)
- 기능은 텍스트 로우 형태 (인디고 불릿 도트만)
- 가격/프로세스도 텍스트 기반 미니멀 표현
---
## 4. 폴더 구조
```
docs/brochure/
├── README.md ← 이 파일
├── v1/
│ ├── slides/
│ │ ├── brochure-2page-front.html
│ │ ├── brochure-2page-back.html
│ │ └── brochure-1page.html
│ ├── convert-1page.cjs
│ ├── convert-2page.cjs
│ ├── sam-brochure-1page.pptx
│ └── sam-brochure-2page.pptx
├── v2/
│ ├── slides/
│ │ ├── brochure-dashboard-front.html
│ │ ├── brochure-dashboard-back.html
│ │ └── brochure-dashboard-1page.html
│ ├── convert-1page.cjs
│ ├── convert-2page.cjs
│ ├── sam-brochure-v2-dashboard-1page.pptx
│ └── sam-brochure-v2-dashboard-2page.pptx
├── v3/
│ ├── slides/
│ │ ├── brochure-dashboard-front.html
│ │ ├── brochure-dashboard-back.html
│ │ └── brochure-dashboard-1page.html
│ ├── convert-1page.cjs
│ ├── convert-2page.cjs
│ ├── sam-brochure-v3-dashboard-1page.pptx
│ └── sam-brochure-v3-dashboard-2page.pptx
├── v4/
│ ├── slides/
│ │ ├── brochure-dashboard-front.html
│ │ ├── brochure-dashboard-back.html
│ │ └── brochure-dashboard-1page.html
│ ├── convert-1page.cjs
│ ├── convert-2page.cjs
│ ├── sam-brochure-v4-dashboard-1page.pptx
│ └── sam-brochure-v4-dashboard-2page.pptx
├── v5/
│ ├── slides/
│ │ ├── brochure-dashboard-front.html
│ │ ├── brochure-dashboard-back.html
│ │ └── brochure-dashboard-1page.html
│ ├── convert-1page.cjs ← Sharp 그래디언트 배경 생성 포함
│ ├── convert-2page.cjs ← Sharp 그래디언트 배경 생성 포함
│ ├── sam-brochure-v5-dashboard-1page.pptx
│ └── sam-brochure-v5-dashboard-2page.pptx
├── v6/ ← Corporate Blue & White
│ ├── slides/ (front, back, 1page)
│ ├── convert-1page.cjs
│ ├── convert-2page.cjs
│ ├── sam-brochure-v6-dashboard-1page.pptx
│ └── sam-brochure-v6-dashboard-2page.pptx
├── v7/ ← Warm Gray + Teal
│ ├── slides/ (front, back, 1page)
│ ├── convert-1page.cjs
│ ├── convert-2page.cjs
│ ├── sam-brochure-v7-dashboard-1page.pptx
│ └── sam-brochure-v7-dashboard-2page.pptx
├── v8/ ← Two-Tone Navy/White Split
│ ├── slides/ (front, back, 1page)
│ ├── convert-1page.cjs
│ ├── convert-2page.cjs
│ ├── sam-brochure-v8-dashboard-1page.pptx
│ └── sam-brochure-v8-dashboard-2page.pptx
└── v9/ ← Minimal White + Indigo
├── slides/ (front, back, 1page)
├── convert-1page.cjs
├── convert-2page.cjs
├── sam-brochure-v9-dashboard-1page.pptx
└── sam-brochure-v9-dashboard-2page.pptx
```
---
## 5. PPTX 변환 방법
```bash
# 각 버전 폴더에서 실행
cd docs/brochure/v5
node convert-1page.cjs # 1페이지 통합본
node convert-2page.cjs # 앞면+뒷면 2페이지
```
---
## 6. PPTX 변환 시 주의사항
### 6.1 텍스트 줄바꿈 방지
- 단일행 `<p>` 태그에 `white-space: nowrap` 필수
- `<br>` 멀티라인 `<p>`는 개별 `<p nowrap>` 태그로 분리
- `<span>` 포함 텍스트도 개별 `<p>` 처리 (PPTX 폰트 폭 차이 보정)
### 6.2 CSS gradient 미지원
- html2pptx.js는 CSS `linear-gradient`를 지원하지 않음
- body gradient → Sharp로 PNG 사전 렌더링 후 `slide.background`에 설정
- 구분선 gradient → solid `rgba()` 색상으로 변환
### 6.3 SVG 처리
- 인라인 SVG는 html2pptx가 자동으로 PNG 래스터화
- SVG 내부 fill 색상은 배경에 맞게 조정 필요
---
**최종 업데이트**: 2026-03-01 (v6~v9 추가)

View File

@@ -0,0 +1,28 @@
const path = require('path');
module.paths.unshift(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/node_modules'));
const PptxGenJS = require('pptxgenjs');
const html2pptx = require(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/html2pptx.js'));
async function main() {
const pres = new PptxGenJS();
// 9:16 세로형 (Portrait)
pres.defineLayout({ name: 'PORTRAIT_9x16', width: 5.625, height: 10 });
pres.layout = 'PORTRAIT_9x16';
const htmlFile = path.join(__dirname, 'slides', 'brochure-1page.html');
console.log('Converting 1-page brochure...');
try {
await html2pptx(htmlFile, pres);
} catch (err) {
console.error(`Error: ${err.message}`);
}
const outputPath = path.join(__dirname, 'sam-brochure-1page.pptx');
await pres.writeFile({ fileName: outputPath });
console.log(`\nPPTX created: ${outputPath}`);
}
main().catch(console.error);

View File

@@ -0,0 +1,32 @@
const path = require('path');
module.paths.unshift(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/node_modules'));
const PptxGenJS = require('pptxgenjs');
const html2pptx = require(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/html2pptx.js'));
async function main() {
const pres = new PptxGenJS();
// 9:16 세로형 (Portrait)
pres.defineLayout({ name: 'PORTRAIT_9x16', width: 5.625, height: 10 });
pres.layout = 'PORTRAIT_9x16';
const slidesDir = path.join(__dirname, 'slides');
const slides = ['brochure-2page-front.html', 'brochure-2page-back.html'];
for (const file of slides) {
const htmlFile = path.join(slidesDir, file);
console.log(`Converting ${file} ...`);
try {
await html2pptx(htmlFile, pres);
} catch (err) {
console.error(`Error on ${file}: ${err.message}`);
}
}
const outputPath = path.join(__dirname, 'sam-brochure-2page.pptx');
await pres.writeFile({ fileName: outputPath });
console.log(`\nPPTX created: ${outputPath}`);
}
main().catch(console.error);

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,208 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
width: 405pt; height: 720pt;
font-family: 'Pretendard', sans-serif;
background: #0F2439;
padding: 28pt 24pt 18pt 24pt;
display: flex; flex-direction: column;
}
</style>
</head>
<body>
<!-- 헤더 -->
<div style="display: flex; align-items: center; gap: 8pt; margin-bottom: 14pt;">
<img src="/home/aweso/sam/docs/assets/bi/sam_bi_white.png" style="height: 22pt;">
<div style="flex: 1;"></div>
<p style="white-space: nowrap; font-size: 7pt; color: rgba(255,255,255,0.3);">PRODUCT BROCHURE 2026</p>
</div>
<!-- 히어로 섹션 -->
<div style="margin-bottom: 14pt;">
<p style="white-space: nowrap; font-size: 8pt; font-weight: 600; color: #10B981; letter-spacing: 0.08em; margin-bottom: 4pt;">SMART AUTOMATION MANAGEMENT</p>
<h1 style="font-size: 19pt; font-weight: 800; color: #ffffff; line-height: 1.3; margin-bottom: 6pt;">중소 제조업을 위한<br>ERP/MES 통합 플랫폼</h1>
<p style="font-size: 8.5pt; color: rgba(255,255,255,0.5); line-height: 1.5;">품목관리, 견적, 수주, 생산, 출하, 품질, 인사/회계까지<br>제조업의 모든 업무를 하나의 시스템으로 통합합니다.</p>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(255,255,255,0.08); margin-bottom: 12pt;"></div>
<!-- 핵심 과제 -->
<div style="margin-bottom: 12pt;">
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: #E86F2C; margin-bottom: 6pt;">현재 업무 과제</p>
<div style="display: flex; gap: 5pt;">
<div style="flex: 1; background: rgba(232,111,44,0.06); border: 1pt solid rgba(232,111,44,0.12); border-radius: 5pt; padding: 6pt 8pt;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: #fff;">Excel 수작업</p>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.35);">오류 잦음, 시간 낭비</p>
</div>
<div style="flex: 1; background: rgba(232,111,44,0.06); border: 1pt solid rgba(232,111,44,0.12); border-radius: 5pt; padding: 6pt 8pt;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: #fff;">현황 파악 불가</p>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.35);">생산/재고 실시간 X</p>
</div>
<div style="flex: 1; background: rgba(232,111,44,0.06); border: 1pt solid rgba(232,111,44,0.12); border-radius: 5pt; padding: 6pt 8pt;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: #fff;">ERP 도입비 부담</p>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.35);">수천만~수억원</p>
</div>
</div>
</div>
<!-- 핵심 기능 6개 -->
<div style="margin-bottom: 12pt;">
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: #2E86AB; margin-bottom: 6pt;">SAM 핵심 기능</p>
<div style="display: flex; flex-direction: column; gap: 4pt;">
<!-- Row 1 -->
<div style="display: flex; gap: 4pt;">
<div style="flex: 1; background: rgba(46,134,171,0.08); border: 1pt solid rgba(46,134,171,0.15); border-radius: 6pt; padding: 7pt;">
<div style="display: flex; align-items: center; gap: 5pt; margin-bottom: 3pt;">
<div style="width: 18pt; height: 18pt; background: #2E86AB; border-radius: 4pt; display: flex; align-items: center; justify-content: center; flex-shrink: 0;">
<p style="font-size: 6.5pt; font-weight: 800; color: #fff; white-space: nowrap;">01</p>
</div>
<p style="font-size: 7pt; font-weight: 700; color: #fff; white-space: nowrap;">견적/수주 자동화</p>
</div>
<p style="font-size: 6pt; color: rgba(255,255,255,0.4); line-height: 1.4;">BOM 전개, 단가 적용, PDF 견적서 자동 생성</p>
</div>
<div style="flex: 1; background: rgba(139,92,246,0.08); border: 1pt solid rgba(139,92,246,0.15); border-radius: 6pt; padding: 7pt;">
<div style="display: flex; align-items: center; gap: 5pt; margin-bottom: 3pt;">
<div style="width: 18pt; height: 18pt; background: #8B5CF6; border-radius: 4pt; display: flex; align-items: center; justify-content: center; flex-shrink: 0;">
<p style="font-size: 6.5pt; font-weight: 800; color: #fff; white-space: nowrap;">02</p>
</div>
<p style="font-size: 7pt; font-weight: 700; color: #fff; white-space: nowrap;">생산관리 (MES)</p>
</div>
<p style="font-size: 6pt; color: rgba(255,255,255,0.4); line-height: 1.4;">바코드/QR 공정추적, 실시간 현황 대시보드</p>
</div>
</div>
<!-- Row 2 -->
<div style="display: flex; gap: 4pt;">
<div style="flex: 1; background: rgba(16,185,129,0.08); border: 1pt solid rgba(16,185,129,0.15); border-radius: 6pt; padding: 7pt;">
<div style="display: flex; align-items: center; gap: 5pt; margin-bottom: 3pt;">
<div style="width: 18pt; height: 18pt; background: #10B981; border-radius: 4pt; display: flex; align-items: center; justify-content: center; flex-shrink: 0;">
<p style="font-size: 6.5pt; font-weight: 800; color: #fff; white-space: nowrap;">03</p>
</div>
<p style="font-size: 7pt; font-weight: 700; color: #fff; white-space: nowrap;">품질/검사 관리</p>
</div>
<p style="font-size: 6pt; color: rgba(255,255,255,0.4); line-height: 1.4;">수입/공정/출하 3단계 검사, 인증 자동 알림</p>
</div>
<div style="flex: 1; background: rgba(232,111,44,0.08); border: 1pt solid rgba(232,111,44,0.15); border-radius: 6pt; padding: 7pt;">
<div style="display: flex; align-items: center; gap: 5pt; margin-bottom: 3pt;">
<div style="width: 18pt; height: 18pt; background: #E86F2C; border-radius: 4pt; display: flex; align-items: center; justify-content: center; flex-shrink: 0;">
<p style="font-size: 6.5pt; font-weight: 800; color: #fff; white-space: nowrap;">04</p>
</div>
<p style="font-size: 7pt; font-weight: 700; color: #fff; white-space: nowrap;">자재/재고 추적</p>
</div>
<p style="font-size: 6pt; color: rgba(255,255,255,0.4); line-height: 1.4;">안전재고, LOT 추적, 바코드 입출고 관리</p>
</div>
</div>
<!-- Row 3 -->
<div style="display: flex; gap: 4pt;">
<div style="flex: 1; background: rgba(46,134,171,0.08); border: 1pt solid rgba(46,134,171,0.15); border-radius: 6pt; padding: 7pt;">
<div style="display: flex; align-items: center; gap: 5pt; margin-bottom: 3pt;">
<div style="width: 18pt; height: 18pt; background: #2E86AB; border-radius: 4pt; display: flex; align-items: center; justify-content: center; flex-shrink: 0;">
<p style="font-size: 6.5pt; font-weight: 800; color: #fff; white-space: nowrap;">05</p>
</div>
<p style="font-size: 7pt; font-weight: 700; color: #fff; white-space: nowrap;">인사/회계 (무료)</p>
</div>
<p style="font-size: 6pt; color: rgba(255,255,255,0.4); line-height: 1.4;">근태, 급여, 매입매출, 세금계산서 자동 발행</p>
</div>
<div style="flex: 1; background: rgba(139,92,246,0.08); border: 1pt solid rgba(139,92,246,0.15); border-radius: 6pt; padding: 7pt;">
<div style="display: flex; align-items: center; gap: 5pt; margin-bottom: 3pt;">
<div style="width: 18pt; height: 18pt; background: #8B5CF6; border-radius: 4pt; display: flex; align-items: center; justify-content: center; flex-shrink: 0;">
<p style="font-size: 6.5pt; font-weight: 800; color: #fff; white-space: nowrap;">06</p>
</div>
<p style="font-size: 7pt; font-weight: 700; color: #fff; white-space: nowrap;">경영 대시보드</p>
</div>
<p style="font-size: 6pt; color: rgba(255,255,255,0.4); line-height: 1.4;">수주/생산/매출/품질 KPI 실시간 모니터링</p>
</div>
</div>
</div>
</div>
<!-- 추가 기능 바 -->
<div style="display: flex; gap: 4pt; margin-bottom: 12pt;">
<div style="flex: 1; background: rgba(255,255,255,0.03); border-radius: 4pt; padding: 4pt 6pt; text-align: center;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: rgba(255,255,255,0.5);">전자서명</p>
</div>
<div style="flex: 1; background: rgba(255,255,255,0.03); border-radius: 4pt; padding: 4pt 6pt; text-align: center;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: rgba(255,255,255,0.5);">카카오 알림톡</p>
</div>
<div style="flex: 1; background: rgba(255,255,255,0.03); border-radius: 4pt; padding: 4pt 6pt; text-align: center;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: rgba(255,255,255,0.5);">AI 실험실</p>
</div>
<div style="flex: 1; background: rgba(255,255,255,0.03); border-radius: 4pt; padding: 4pt 6pt; text-align: center;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: rgba(255,255,255,0.5);">바로빌 연동</p>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(255,255,255,0.08); margin-bottom: 12pt;"></div>
<!-- 기대 효과 + 가격 -->
<div style="display: flex; gap: 8pt; margin-bottom: 12pt;">
<!-- 기대 효과 -->
<div style="flex: 1;">
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: #10B981; margin-bottom: 6pt;">도입 기대 효과</p>
<div style="display: flex; flex-direction: column; gap: 3pt;">
<div style="display: flex; gap: 3pt;">
<div style="flex: 1; background: rgba(46,134,171,0.1); border: 1pt solid rgba(46,134,171,0.2); border-radius: 5pt; padding: 6pt 4pt; text-align: center;">
<p style="white-space: nowrap; font-size: 14pt; font-weight: 800; color: #ffffff;">80%</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: #2E86AB;">업무 시간 단축</p>
</div>
<div style="flex: 1; background: rgba(139,92,246,0.1); border: 1pt solid rgba(139,92,246,0.2); border-radius: 5pt; padding: 6pt 4pt; text-align: center;">
<p style="white-space: nowrap; font-size: 14pt; font-weight: 800; color: #ffffff;">95%</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: #8B5CF6;">납기 준수율</p>
</div>
</div>
<div style="display: flex; gap: 3pt;">
<div style="flex: 1; background: rgba(16,185,129,0.1); border: 1pt solid rgba(16,185,129,0.2); border-radius: 5pt; padding: 6pt 4pt; text-align: center;">
<p style="white-space: nowrap; font-size: 14pt; font-weight: 800; color: #ffffff;">100%</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: #10B981;">이력 추적성</p>
</div>
<div style="flex: 1; background: rgba(232,111,44,0.1); border: 1pt solid rgba(232,111,44,0.2); border-radius: 5pt; padding: 6pt 4pt; text-align: center;">
<p style="white-space: nowrap; font-size: 14pt; font-weight: 800; color: #ffffff;">Free</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: #E86F2C;">인사/회계 포함</p>
</div>
</div>
</div>
</div>
<!-- 가격 -->
<div style="flex: 1;">
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: #E86F2C; margin-bottom: 6pt;">투자 비용</p>
<div style="background: rgba(232,111,44,0.06); border: 1pt solid rgba(232,111,44,0.12); border-radius: 6pt; padding: 10pt;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: #E86F2C; margin-bottom: 4pt;">제조업 기본 패키지</p>
<p style="white-space: nowrap; font-size: 14pt; font-weight: 800; color: #ffffff;">2,000만원</p>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.4); margin-top: 2pt;">+ 월 50만원 (유지보수)</p>
<div style="height: 1pt; background: rgba(255,255,255,0.06); margin: 6pt 0;"></div>
<p style="font-size: 6pt; color: rgba(255,255,255,0.4); line-height: 1.4;">품목-견적-수주-생산-출하<br>인사/회계 무료 포함</p>
</div>
</div>
</div>
<!-- 기술 스택 -->
<div style="display: flex; gap: 5pt; margin-bottom: 12pt;">
<div style="background: rgba(255,255,255,0.04); border-radius: 4pt; padding: 3pt 8pt;">
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.4);">클라우드 기반 (설치 불필요)</p>
</div>
<div style="background: rgba(255,255,255,0.04); border-radius: 4pt; padding: 3pt 8pt;">
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.4);">모바일 대응</p>
</div>
<div style="background: rgba(255,255,255,0.04); border-radius: 4pt; padding: 3pt 8pt;">
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.4);">Multi-tenant</p>
</div>
</div>
<!-- 푸터 -->
<div style="margin-top: auto; border-top: 1pt solid rgba(255,255,255,0.08); padding-top: 10pt;">
<div style="display: flex; justify-content: space-between; align-items: flex-end;">
<div>
<p style="white-space: nowrap; font-size: 8pt; font-weight: 700; color: rgba(255,255,255,0.7);">SAM</p>
<p style="white-space: nowrap; font-size: 7pt; color: rgba(255,255,255,0.3); margin-top: 2pt;">www.sam.it.kr</p>
</div>
<div style="text-align: right;">
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,225 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
width: 405pt; height: 720pt;
font-family: 'Pretendard', sans-serif;
background: #0F2439;
padding: 20pt 24pt 10pt 24pt;
display: flex; flex-direction: column;
}
</style>
</head>
<body>
<!-- 헤더 -->
<div style="display: flex; align-items: center; gap: 8pt; margin-bottom: 8pt;">
<img src="/home/aweso/sam/docs/assets/bi/sam_bi_white.png" style="height: 18pt;">
<div style="flex: 1;"></div>
<p style="white-space: nowrap; font-size: 7pt; color: rgba(255,255,255,0.3);">FEATURES &amp; PRICING</p>
</div>
<!-- 핵심 모듈 -->
<div style="margin-bottom: 10pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #2E86AB; margin-bottom: 6pt;">SAM 핵심 모듈</p>
<div style="display: flex; flex-direction: column; gap: 2pt;">
<!-- 01 -->
<div style="display: flex; align-items: center; gap: 6pt; background: rgba(46,134,171,0.06); border-radius: 4pt; padding: 3pt 8pt;">
<div style="width: 18pt; height: 18pt; background: #2E86AB; border-radius: 3pt; display: flex; align-items: center; justify-content: center; flex-shrink: 0;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 800; color: #fff;">01</p>
</div>
<p style="font-size: 6.5pt; font-weight: 600; color: #fff; width: 78pt; flex-shrink: 0; white-space: nowrap;">품목/BOM 관리</p>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.4);">품목 마스터, 다단계 BOM 전개, 단가 관리</p>
</div>
<!-- 02 -->
<div style="display: flex; align-items: center; gap: 6pt; background: rgba(139,92,246,0.06); border-radius: 4pt; padding: 3pt 8pt;">
<div style="width: 18pt; height: 18pt; background: #8B5CF6; border-radius: 3pt; display: flex; align-items: center; justify-content: center; flex-shrink: 0;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 800; color: #fff;">02</p>
</div>
<p style="font-size: 6.5pt; font-weight: 600; color: #fff; width: 78pt; flex-shrink: 0; white-space: nowrap;">견적/수주 자동화</p>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.4);">견적서 자동 생성, 수주 전환, PDF 출력</p>
</div>
<!-- 03 -->
<div style="display: flex; align-items: center; gap: 6pt; background: rgba(16,185,129,0.06); border-radius: 4pt; padding: 3pt 8pt;">
<div style="width: 18pt; height: 18pt; background: #10B981; border-radius: 3pt; display: flex; align-items: center; justify-content: center; flex-shrink: 0;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 800; color: #fff;">03</p>
</div>
<p style="font-size: 6.5pt; font-weight: 600; color: #fff; width: 78pt; flex-shrink: 0; white-space: nowrap;">생산관리 (MES)</p>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.4);">작업지시, 바코드/QR 공정추적, 실시간 현황</p>
</div>
<!-- 04 -->
<div style="display: flex; align-items: center; gap: 6pt; background: rgba(232,111,44,0.06); border-radius: 4pt; padding: 3pt 8pt;">
<div style="width: 18pt; height: 18pt; background: #E86F2C; border-radius: 3pt; display: flex; align-items: center; justify-content: center; flex-shrink: 0;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 800; color: #fff;">04</p>
</div>
<p style="font-size: 6.5pt; font-weight: 600; color: #fff; width: 78pt; flex-shrink: 0; white-space: nowrap;">출하/물류 관리</p>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.4);">출하 지시, 거래명세서, 배송 추적</p>
</div>
<!-- 05 -->
<div style="display: flex; align-items: center; gap: 6pt; background: rgba(46,134,171,0.06); border-radius: 4pt; padding: 3pt 8pt;">
<div style="width: 18pt; height: 18pt; background: #2E86AB; border-radius: 3pt; display: flex; align-items: center; justify-content: center; flex-shrink: 0;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 800; color: #fff;">05</p>
</div>
<p style="font-size: 6.5pt; font-weight: 600; color: #fff; width: 78pt; flex-shrink: 0; white-space: nowrap;">품질/검사 관리</p>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.4);">수입/공정/출하 검사, 인증 만료 자동 알림</p>
</div>
<!-- 06 -->
<div style="display: flex; align-items: center; gap: 6pt; background: rgba(139,92,246,0.06); border-radius: 4pt; padding: 3pt 8pt;">
<div style="width: 18pt; height: 18pt; background: #8B5CF6; border-radius: 3pt; display: flex; align-items: center; justify-content: center; flex-shrink: 0;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 800; color: #fff;">06</p>
</div>
<p style="font-size: 6.5pt; font-weight: 600; color: #fff; width: 78pt; flex-shrink: 0; white-space: nowrap;">자재/재고 관리</p>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.4);">안전재고, 입출고, LOT 추적, 바코드 관리</p>
</div>
<!-- 07 -->
<div style="display: flex; align-items: center; gap: 6pt; background: rgba(16,185,129,0.06); border-radius: 4pt; padding: 3pt 8pt;">
<div style="width: 18pt; height: 18pt; background: #10B981; border-radius: 3pt; display: flex; align-items: center; justify-content: center; flex-shrink: 0;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 800; color: #fff;">07</p>
</div>
<p style="font-size: 6.5pt; font-weight: 600; color: #fff; width: 78pt; flex-shrink: 0; white-space: nowrap;">인사/회계 (무료)</p>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.4);">근태, 급여, 매입매출, 세금계산서 자동 발행</p>
</div>
<!-- 08 -->
<div style="display: flex; align-items: center; gap: 6pt; background: rgba(232,111,44,0.06); border-radius: 4pt; padding: 3pt 8pt;">
<div style="width: 18pt; height: 18pt; background: #E86F2C; border-radius: 3pt; display: flex; align-items: center; justify-content: center; flex-shrink: 0;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 800; color: #fff;">08</p>
</div>
<p style="font-size: 6.5pt; font-weight: 600; color: #fff; width: 78pt; flex-shrink: 0; white-space: nowrap;">경영 대시보드</p>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.4);">수주/생산/매출/품질 KPI 실시간 모니터링</p>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(255,255,255,0.08); margin-bottom: 8pt;"></div>
<!-- 추가 기능 -->
<div style="margin-bottom: 10pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #8B5CF6; margin-bottom: 6pt;">확장 기능</p>
<div style="display: flex; gap: 4pt;">
<div style="flex: 1; background: rgba(139,92,246,0.06); border: 1pt solid rgba(139,92,246,0.12); border-radius: 4pt; padding: 5pt 6pt; text-align: center;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: rgba(255,255,255,0.7);">전자서명</p>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.35);">계약/확인서</p>
</div>
<div style="flex: 1; background: rgba(139,92,246,0.06); border: 1pt solid rgba(139,92,246,0.12); border-radius: 4pt; padding: 5pt 6pt; text-align: center;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: rgba(255,255,255,0.7);">알림톡</p>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.35);">카카오 자동발송</p>
</div>
<div style="flex: 1; background: rgba(139,92,246,0.06); border: 1pt solid rgba(139,92,246,0.12); border-radius: 4pt; padding: 5pt 6pt; text-align: center;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: rgba(255,255,255,0.7);">AI 실험실</p>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.35);">음성요약/문서분류</p>
</div>
<div style="flex: 1; background: rgba(139,92,246,0.06); border: 1pt solid rgba(139,92,246,0.12); border-radius: 4pt; padding: 5pt 6pt; text-align: center;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: rgba(255,255,255,0.7);">QR 코드</p>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.35);">설비/장비 점검</p>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(255,255,255,0.08); margin-bottom: 8pt;"></div>
<!-- 투자비용 -->
<div style="margin-bottom: 10pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #E86F2C; margin-bottom: 6pt;">투자 비용</p>
<div style="display: flex; gap: 6pt;">
<!-- 기본 패키지 -->
<div style="flex: 1;">
<div style="background: rgba(46,134,171,0.08); border: 1pt solid rgba(46,134,171,0.15); border-radius: 6pt; padding: 8pt 10pt; margin-bottom: 4pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 600; color: #2E86AB; margin-bottom: 3pt;">제조업 기본 패키지</p>
<p style="white-space: nowrap; font-size: 12pt; font-weight: 800; color: #ffffff;">2,000만원</p>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.4);">+ 월 50만원 (유지보수)</p>
</div>
<div style="background: rgba(255,255,255,0.03); border-radius: 4pt; padding: 3pt 6pt;">
<p style="font-size: 6pt; color: rgba(255,255,255,0.4); line-height: 1.4;">품목 - 견적 - 수주 - 생산 - 출하<br>인사/회계 무료 포함</p>
</div>
</div>
<!-- 추가 옵션 -->
<div style="flex: 1;">
<div style="background: rgba(232,111,44,0.08); border: 1pt solid rgba(232,111,44,0.15); border-radius: 6pt; padding: 8pt 10pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 600; color: #E86F2C; margin-bottom: 4pt;">추가 옵션 (선택)</p>
<div style="display: flex; flex-direction: column; gap: 3pt;">
<div style="display: flex; justify-content: space-between;">
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.5);">생산공정 추가</p>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #E86F2C;">+500만원</p>
</div>
<div style="display: flex; justify-content: space-between;">
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.5);">품질관리(인정검사)</p>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #E86F2C;">+2,000만원</p>
</div>
<div style="display: flex; justify-content: space-between;">
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.5);">사진등록/챗봇/녹음</p>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #E86F2C;">월 10~20만원</p>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(255,255,255,0.08); margin-bottom: 8pt;"></div>
<!-- 도입 로드맵 -->
<div style="margin-bottom: 10pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #10B981; margin-bottom: 6pt;">도입 프로세스</p>
<div style="display: flex; gap: 4pt;">
<div style="flex: 1; border-radius: 6pt; padding: 6pt 4pt; text-align: center; background: rgba(46,134,171,0.1); border: 1pt solid rgba(46,134,171,0.2);">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #2E86AB;">Step 1</p>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.5); margin-top: 2pt;">1~2주</p>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: rgba(255,255,255,0.7); margin-top: 2pt;">현장 인터뷰</p>
</div>
<div style="flex: 1; border-radius: 6pt; padding: 6pt 4pt; text-align: center; background: rgba(139,92,246,0.1); border: 1pt solid rgba(139,92,246,0.2);">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #8B5CF6;">Step 2</p>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.5); margin-top: 2pt;">2~4주</p>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: rgba(255,255,255,0.7); margin-top: 2pt;">맞춤 개발</p>
</div>
<div style="flex: 1; border-radius: 6pt; padding: 6pt 4pt; text-align: center; background: rgba(16,185,129,0.1); border: 1pt solid rgba(16,185,129,0.2);">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #10B981;">Step 3</p>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.5); margin-top: 2pt;">1~2주</p>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: rgba(255,255,255,0.7); margin-top: 2pt;">데이터 이관</p>
</div>
<div style="flex: 1; border-radius: 6pt; padding: 6pt 4pt; text-align: center; background: rgba(232,111,44,0.1); border: 1pt solid rgba(232,111,44,0.2);">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #E86F2C;">Step 4</p>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.5); margin-top: 2pt;">1~2주</p>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: rgba(255,255,255,0.7); margin-top: 2pt;">교육/안정화</p>
</div>
</div>
</div>
<!-- 외부 연동 -->
<div style="display: flex; gap: 6pt; margin-bottom: 8pt;">
<div style="flex: 1; background: rgba(255,255,255,0.04); border-radius: 5pt; padding: 5pt 8pt; text-align: center;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: rgba(255,255,255,0.6);">바로빌 API</p>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.3);">세금계산서 자동</p>
</div>
<div style="flex: 1; background: rgba(255,255,255,0.04); border-radius: 5pt; padding: 5pt 8pt; text-align: center;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: rgba(255,255,255,0.6);">카카오 알림톡</p>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.3);">점검/납기 알림</p>
</div>
<div style="flex: 1; background: rgba(255,255,255,0.04); border-radius: 5pt; padding: 5pt 8pt; text-align: center;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: rgba(255,255,255,0.6);">이카운트 연동</p>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.3);">기존 ERP 동기화</p>
</div>
</div>
<!-- CTA 푸터 -->
<div style="margin-top: auto; background: rgba(16,185,129,0.08); border: 1pt solid rgba(16,185,129,0.2); border-radius: 8pt; padding: 12pt 14pt;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<div>
<p style="white-space: nowrap; font-size: 7.5pt; color: rgba(255,255,255,0.45); margin-top: 3pt;">귀사에 최적화된 맞춤 데모를 제공합니다</p>
</div>
<div style="text-align: right;">
<p style="white-space: nowrap; font-size: 7pt; color: rgba(255,255,255,0.4); margin-top: 2pt;">www.sam.it.kr</p>
</div>
</div>
</div>
<!-- 회사명 -->
<div style="margin-top: 6pt; text-align: center;">
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.2);">SAM — Smart Automation Management</p>
</div>
</body>
</html>

View File

@@ -0,0 +1,122 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
width: 405pt; height: 720pt;
font-family: 'Pretendard', sans-serif;
background: #0F2439;
padding: 32pt 24pt 24pt 24pt;
display: flex; flex-direction: column;
}
</style>
</head>
<body>
<!-- 헤더 -->
<div style="display: flex; align-items: center; gap: 8pt; margin-bottom: 20pt;">
<img src="/home/aweso/sam/docs/assets/bi/sam_bi_white.png" style="height: 24pt;">
<div style="flex: 1;"></div>
<p style="white-space: nowrap; font-size: 7pt; color: rgba(255,255,255,0.3);">PRODUCT BROCHURE 2026</p>
</div>
<!-- 히어로 섹션 -->
<div style="margin-bottom: 20pt;">
<p style="white-space: nowrap; font-size: 8pt; font-weight: 600; color: #10B981; letter-spacing: 0.08em; margin-bottom: 6pt;">SMART AUTOMATION MANAGEMENT</p>
<h1 style="font-size: 21pt; font-weight: 800; color: #ffffff; line-height: 1.35; margin-bottom: 8pt;">중소 제조업을 위한<br>ERP/MES 통합 플랫폼</h1>
<p style="font-size: 9pt; color: rgba(255,255,255,0.5); line-height: 1.6;">품목관리, 견적, 수주, 생산, 출하, 품질, 인사/회계까지<br>제조업의 모든 업무를 하나의 시스템으로 통합합니다.</p>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(255,255,255,0.08); margin-bottom: 18pt;"></div>
<!-- 현재 과제 -->
<div style="margin-bottom: 18pt;">
<p style="white-space: nowrap; font-size: 8pt; font-weight: 700; color: #E86F2C; margin-bottom: 8pt;">이런 고민이 있으신가요?</p>
<div style="display: flex; flex-direction: column; gap: 5pt;">
<div style="display: flex; align-items: center; gap: 8pt; background: rgba(232,111,44,0.06); border: 1pt solid rgba(232,111,44,0.1); border-radius: 6pt; padding: 8pt 10pt;">
<div style="width: 4pt; height: 4pt; background: #E86F2C; border-radius: 50%; flex-shrink: 0;"></div>
<p style="white-space: nowrap; font-size: 8pt; color: rgba(255,255,255,0.65);">Excel 견적서, 수기 전표로 <span style="color: #E86F2C; font-weight: 700;">업무 시간 낭비</span>가 심하다</p>
</div>
<div style="display: flex; align-items: center; gap: 8pt; background: rgba(232,111,44,0.06); border: 1pt solid rgba(232,111,44,0.1); border-radius: 6pt; padding: 8pt 10pt;">
<div style="width: 4pt; height: 4pt; background: #E86F2C; border-radius: 50%; flex-shrink: 0;"></div>
<p style="white-space: nowrap; font-size: 8pt; color: rgba(255,255,255,0.65);">생산 현황을 <span style="color: #E86F2C; font-weight: 700;">실시간으로 파악</span>할 수 없다</p>
</div>
<div style="display: flex; align-items: center; gap: 8pt; background: rgba(232,111,44,0.06); border: 1pt solid rgba(232,111,44,0.1); border-radius: 6pt; padding: 8pt 10pt;">
<div style="width: 4pt; height: 4pt; background: #E86F2C; border-radius: 50%; flex-shrink: 0;"></div>
<p style="white-space: nowrap; font-size: 8pt; color: rgba(255,255,255,0.65);">품질/검사 기록이 <span style="color: #E86F2C; font-weight: 700;">체계적으로 관리</span>되지 않는다</p>
</div>
<div style="display: flex; align-items: center; gap: 8pt; background: rgba(232,111,44,0.06); border: 1pt solid rgba(232,111,44,0.1); border-radius: 6pt; padding: 8pt 10pt;">
<div style="width: 4pt; height: 4pt; background: #E86F2C; border-radius: 50%; flex-shrink: 0;"></div>
<p style="white-space: nowrap; font-size: 8pt; color: rgba(255,255,255,0.65);">ERP 도입비가 <span style="color: #E86F2C; font-weight: 700;">수천만원~수억원</span>으로 부담된다</p>
</div>
</div>
</div>
<!-- SAM 해결 -->
<div style="background: rgba(16,185,129,0.06); border: 1pt solid rgba(16,185,129,0.15); border-radius: 8pt; padding: 12pt 14pt; margin-bottom: 18pt;">
<p style="white-space: nowrap; font-size: 8pt; font-weight: 700; color: #10B981; margin-bottom: 6pt;">SAM이 해결합니다</p>
<p style="font-size: 8pt; color: rgba(255,255,255,0.55); line-height: 1.6;">
SAM은 중소 제조업에 특화된 클라우드 ERP/MES 통합 플랫폼입니다.
품목/BOM 관리, 견적 자동화, 바코드 생산추적, 품질검사, 인사/회계까지
별도 설치 없이 웹 브라우저만으로 모든 업무를 통합 관리합니다.
</p>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(255,255,255,0.08); margin-bottom: 18pt;"></div>
<!-- 기대 효과 4개 -->
<div style="margin-bottom: 18pt;">
<p style="white-space: nowrap; font-size: 8pt; font-weight: 700; color: #2E86AB; margin-bottom: 10pt;">도입 기대 효과</p>
<div style="display: flex; gap: 6pt;">
<div style="flex: 1; background: rgba(46,134,171,0.1); border: 1pt solid rgba(46,134,171,0.2); border-radius: 8pt; padding: 10pt 4pt; text-align: center;">
<p style="white-space: nowrap; font-size: 20pt; font-weight: 800; color: #ffffff;">80%</p>
<p style="white-space: nowrap; font-size: 7pt; font-weight: 600; color: #2E86AB; margin-top: 2pt;">업무 시간 단축</p>
</div>
<div style="flex: 1; background: rgba(139,92,246,0.1); border: 1pt solid rgba(139,92,246,0.2); border-radius: 8pt; padding: 10pt 4pt; text-align: center;">
<p style="white-space: nowrap; font-size: 20pt; font-weight: 800; color: #ffffff;">95%</p>
<p style="white-space: nowrap; font-size: 7pt; font-weight: 600; color: #8B5CF6; margin-top: 2pt;">납기 준수율</p>
</div>
<div style="flex: 1; background: rgba(16,185,129,0.1); border: 1pt solid rgba(16,185,129,0.2); border-radius: 8pt; padding: 10pt 4pt; text-align: center;">
<p style="white-space: nowrap; font-size: 20pt; font-weight: 800; color: #ffffff;">100%</p>
<p style="white-space: nowrap; font-size: 7pt; font-weight: 600; color: #10B981; margin-top: 2pt;">이력 추적성</p>
</div>
<div style="flex: 1; background: rgba(232,111,44,0.1); border: 1pt solid rgba(232,111,44,0.2); border-radius: 8pt; padding: 10pt 4pt; text-align: center;">
<p style="white-space: nowrap; font-size: 20pt; font-weight: 800; color: #ffffff;">Free</p>
<p style="white-space: nowrap; font-size: 7pt; font-weight: 600; color: #E86F2C; margin-top: 2pt;">인사/회계 포함</p>
</div>
</div>
</div>
<!-- 기술 특징 -->
<div style="display: flex; gap: 6pt; margin-bottom: 14pt;">
<div style="flex: 1; background: rgba(255,255,255,0.04); border-radius: 5pt; padding: 6pt 8pt; text-align: center;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: rgba(255,255,255,0.6);">클라우드 기반</p>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.3);">설치 불필요</p>
</div>
<div style="flex: 1; background: rgba(255,255,255,0.04); border-radius: 5pt; padding: 6pt 8pt; text-align: center;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: rgba(255,255,255,0.6);">모바일 대응</p>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.3);">현장 태블릿/폰</p>
</div>
<div style="flex: 1; background: rgba(255,255,255,0.04); border-radius: 5pt; padding: 6pt 8pt; text-align: center;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: rgba(255,255,255,0.6);">Multi-tenant</p>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.3);">데이터 완전 격리</p>
</div>
</div>
<!-- 푸터 -->
<div style="margin-top: auto; border-top: 1pt solid rgba(255,255,255,0.08); padding-top: 12pt;">
<div style="display: flex; justify-content: space-between; align-items: flex-end;">
<div>
<p style="white-space: nowrap; font-size: 8pt; font-weight: 700; color: rgba(255,255,255,0.7);">SAM</p>
<p style="white-space: nowrap; font-size: 7pt; color: rgba(255,255,255,0.3); margin-top: 2pt;">www.sam.it.kr</p>
</div>
<div style="text-align: right;">
<p style="white-space: nowrap; font-size: 7pt; color: rgba(255,255,255,0.35);">뒷면에서 상세 기능과 가격을 확인하세요</p>
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,28 @@
const path = require('path');
module.paths.unshift(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/node_modules'));
const PptxGenJS = require('pptxgenjs');
const html2pptx = require(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/html2pptx.js'));
async function main() {
const pres = new PptxGenJS();
// 9:16 세로형 (Portrait)
pres.defineLayout({ name: 'PORTRAIT_9x16', width: 5.625, height: 10 });
pres.layout = 'PORTRAIT_9x16';
const htmlFile = path.join(__dirname, 'slides', 'brochure-dashboard-1page.html');
console.log('Converting CEO Dashboard 1-page brochure...');
try {
await html2pptx(htmlFile, pres);
} catch (err) {
console.error(`Error: ${err.message}`);
}
const outputPath = path.join(__dirname, 'sam-brochure-v2-dashboard-1page.pptx');
await pres.writeFile({ fileName: outputPath });
console.log(`\nPPTX created: ${outputPath}`);
}
main().catch(console.error);

View File

@@ -0,0 +1,32 @@
const path = require('path');
module.paths.unshift(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/node_modules'));
const PptxGenJS = require('pptxgenjs');
const html2pptx = require(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/html2pptx.js'));
async function main() {
const pres = new PptxGenJS();
// 9:16 세로형 (Portrait)
pres.defineLayout({ name: 'PORTRAIT_9x16', width: 5.625, height: 10 });
pres.layout = 'PORTRAIT_9x16';
const slidesDir = path.join(__dirname, 'slides');
const slides = ['brochure-dashboard-front.html', 'brochure-dashboard-back.html'];
for (const file of slides) {
const htmlFile = path.join(slidesDir, file);
console.log(`Converting ${file} ...`);
try {
await html2pptx(htmlFile, pres);
} catch (err) {
console.error(`Error on ${file}: ${err.message}`);
}
}
const outputPath = path.join(__dirname, 'sam-brochure-v2-dashboard-2page.pptx');
await pres.writeFile({ fileName: outputPath });
console.log(`\nPPTX created: ${outputPath}`);
}
main().catch(console.error);

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,259 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
width: 405pt; height: 720pt;
font-family: 'Pretendard', sans-serif;
background: #0B1929;
padding: 24pt 22pt 14pt 22pt;
display: flex; flex-direction: column;
}
</style>
</head>
<body>
<!-- 헤더 -->
<div style="display: flex; align-items: center; gap: 8pt; margin-bottom: 12pt;">
<img src="/home/aweso/sam/docs/assets/bi/sam_bi_white.png" style="height: 20pt;">
<div style="flex: 1;"></div>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.25);">CEO DASHBOARD EDITION 2026</p>
</div>
<!-- 히어로 섹션 -->
<div style="margin-bottom: 12pt;">
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 600; color: #0EA5E9; letter-spacing: 0.1em; margin-bottom: 4pt;">EXECUTIVE DASHBOARD</p>
<h1 style="font-size: 18pt; font-weight: 800; color: #ffffff; line-height: 1.35; margin-bottom: 5pt;">대표님, 지금 우리 회사<br>어떻게 돌아가고 있나요?</h1>
<p style="font-size: 8pt; color: rgba(255,255,255,0.45); line-height: 1.5;">보고를 기다리지 마세요. SAM 대시보드 하나면<br>매출, 수주, 조직 실적, 승인 대기까지 한눈에 파악합니다.</p>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(255,255,255,0.06); margin-bottom: 10pt;"></div>
<!-- 대시보드 미리보기 (Mock UI) -->
<div style="background: #111D2E; border: 1pt solid rgba(14,165,233,0.15); border-radius: 8pt; padding: 10pt; margin-bottom: 10pt;">
<!-- 대시보드 타이틀바 -->
<div style="display: flex; align-items: center; gap: 4pt; margin-bottom: 8pt;">
<div style="width: 5pt; height: 5pt; border-radius: 50%; background: #EF4444;"></div>
<div style="width: 5pt; height: 5pt; border-radius: 50%; background: #F59E0B;"></div>
<div style="width: 5pt; height: 5pt; border-radius: 50%; background: #10B981;"></div>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.3); margin-left: 6pt;">SAM CEO Dashboard</p>
</div>
<!-- KPI 카드 4개 -->
<div style="display: flex; gap: 4pt; margin-bottom: 6pt;">
<div style="flex: 1; background: rgba(14,165,233,0.12); border: 1pt solid rgba(14,165,233,0.2); border-radius: 5pt; padding: 6pt 5pt; text-align: center;">
<p style="white-space: nowrap; font-size: 5.5pt; color: #0EA5E9; font-weight: 600;">월 매출</p>
<p style="white-space: nowrap; font-size: 11pt; font-weight: 800; color: #fff;">5.2억</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #10B981; font-weight: 600;">+15.3%</p>
</div>
<div style="flex: 1; background: rgba(16,185,129,0.12); border: 1pt solid rgba(16,185,129,0.2); border-radius: 5pt; padding: 6pt 5pt; text-align: center;">
<p style="white-space: nowrap; font-size: 5.5pt; color: #10B981; font-weight: 600;">수주 잔량</p>
<p style="white-space: nowrap; font-size: 11pt; font-weight: 800; color: #fff;">127건</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #10B981; font-weight: 600;">+8건</p>
</div>
<div style="flex: 1; background: rgba(139,92,246,0.12); border: 1pt solid rgba(139,92,246,0.2); border-radius: 5pt; padding: 6pt 5pt; text-align: center;">
<p style="white-space: nowrap; font-size: 5.5pt; color: #8B5CF6; font-weight: 600;">납기 준수율</p>
<p style="white-space: nowrap; font-size: 11pt; font-weight: 800; color: #fff;">96%</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #10B981; font-weight: 600;">목표 초과</p>
</div>
<div style="flex: 1; background: rgba(239,68,68,0.12); border: 1pt solid rgba(239,68,68,0.2); border-radius: 5pt; padding: 6pt 5pt; text-align: center;">
<p style="white-space: nowrap; font-size: 5.5pt; color: #EF4444; font-weight: 600;">승인 대기</p>
<p style="white-space: nowrap; font-size: 11pt; font-weight: 800; color: #fff;">5건</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #EF4444; font-weight: 600;">즉시 처리</p>
</div>
</div>
<!-- 차트 영역 (간략 Mock) -->
<div style="display: flex; gap: 4pt;">
<!-- 매출 추이 차트 -->
<div style="flex: 3; background: rgba(255,255,255,0.03); border-radius: 4pt; padding: 5pt 6pt;">
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.4); margin-bottom: 4pt;">월별 매출 추이</p>
<div style="display: flex; align-items: flex-end; gap: 3pt; height: 32pt;">
<div style="flex: 1; background: rgba(14,165,233,0.25); border-radius: 1.5pt; height: 45%;"></div>
<div style="flex: 1; background: rgba(14,165,233,0.3); border-radius: 1.5pt; height: 52%;"></div>
<div style="flex: 1; background: rgba(14,165,233,0.35); border-radius: 1.5pt; height: 48%;"></div>
<div style="flex: 1; background: rgba(14,165,233,0.4); border-radius: 1.5pt; height: 60%;"></div>
<div style="flex: 1; background: rgba(14,165,233,0.5); border-radius: 1.5pt; height: 68%;"></div>
<div style="flex: 1; background: rgba(14,165,233,0.6); border-radius: 1.5pt; height: 75%;"></div>
<div style="flex: 1; background: rgba(14,165,233,0.7); border-radius: 1.5pt; height: 72%;"></div>
<div style="flex: 1; background: rgba(14,165,233,0.8); border-radius: 1.5pt; height: 85%;"></div>
<div style="flex: 1; background: rgba(14,165,233,0.9); border-radius: 1.5pt; height: 82%;"></div>
<div style="flex: 1; background: #0EA5E9; border-radius: 1.5pt; height: 95%;"></div>
<div style="flex: 1; background: rgba(14,165,233,0.5); border-radius: 1.5pt; height: 70%; border: 1pt dashed rgba(14,165,233,0.5);"></div>
<div style="flex: 1; background: rgba(14,165,233,0.3); border-radius: 1.5pt; height: 50%; border: 1pt dashed rgba(14,165,233,0.3);"></div>
</div>
</div>
<!-- 조직 실적 -->
<div style="flex: 2; background: rgba(255,255,255,0.03); border-radius: 4pt; padding: 5pt 6pt;">
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.4); margin-bottom: 3pt;">조직별 실적</p>
<div style="display: flex; flex-direction: column; gap: 2pt;">
<div style="display: flex; align-items: center; gap: 3pt;">
<div style="width: 4pt; height: 4pt; background: #0EA5E9; border-radius: 50%;"></div>
<p style="white-space: nowrap; font-size: 5pt; color: rgba(255,255,255,0.5); flex: 1;">영업1팀</p>
<div style="width: 50pt; height: 4pt; background: rgba(14,165,233,0.15); border-radius: 2pt; overflow: hidden;">
<div style="width: 85%; height: 100%; background: #0EA5E9; border-radius: 2pt;"></div>
</div>
</div>
<div style="display: flex; align-items: center; gap: 3pt;">
<div style="width: 4pt; height: 4pt; background: #10B981; border-radius: 50%;"></div>
<p style="white-space: nowrap; font-size: 5pt; color: rgba(255,255,255,0.5); flex: 1;">영업2팀</p>
<div style="width: 50pt; height: 4pt; background: rgba(16,185,129,0.15); border-radius: 2pt; overflow: hidden;">
<div style="width: 68%; height: 100%; background: #10B981; border-radius: 2pt;"></div>
</div>
</div>
<div style="display: flex; align-items: center; gap: 3pt;">
<div style="width: 4pt; height: 4pt; background: #8B5CF6; border-radius: 50%;"></div>
<p style="white-space: nowrap; font-size: 5pt; color: rgba(255,255,255,0.5); flex: 1;">생산팀</p>
<div style="width: 50pt; height: 4pt; background: rgba(139,92,246,0.15); border-radius: 2pt; overflow: hidden;">
<div style="width: 92%; height: 100%; background: #8B5CF6; border-radius: 2pt;"></div>
</div>
</div>
<div style="display: flex; align-items: center; gap: 3pt;">
<div style="width: 4pt; height: 4pt; background: #F59E0B; border-radius: 50%;"></div>
<p style="white-space: nowrap; font-size: 5pt; color: rgba(255,255,255,0.5); flex: 1;">품질팀</p>
<div style="width: 50pt; height: 4pt; background: rgba(245,158,11,0.15); border-radius: 2pt; overflow: hidden;">
<div style="width: 75%; height: 100%; background: #F59E0B; border-radius: 2pt;"></div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 핵심 가치 3개 -->
<div style="margin-bottom: 10pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #0EA5E9; margin-bottom: 6pt;">대표님이 얻는 것</p>
<div style="display: flex; gap: 4pt;">
<div style="flex: 1; background: rgba(14,165,233,0.06); border: 1pt solid rgba(14,165,233,0.12); border-radius: 6pt; padding: 7pt 6pt;">
<div style="display: flex; align-items: center; gap: 4pt; margin-bottom: 3pt;">
<div style="width: 16pt; height: 16pt; background: #0EA5E9; border-radius: 3pt; display: flex; align-items: center; justify-content: center; flex-shrink: 0;">
<p style="font-size: 8pt; font-weight: 800; color: #fff; white-space: nowrap;">1</p>
</div>
<p style="font-size: 7pt; font-weight: 700; color: #fff; white-space: nowrap;">즉시 현황 파악</p>
</div>
<p style="font-size: 6pt; color: rgba(255,255,255,0.4); line-height: 1.4;">보고를 기다릴 필요 없이<br>로그인만으로 전사 현황 확인</p>
</div>
<div style="flex: 1; background: rgba(16,185,129,0.06); border: 1pt solid rgba(16,185,129,0.12); border-radius: 6pt; padding: 7pt 6pt;">
<div style="display: flex; align-items: center; gap: 4pt; margin-bottom: 3pt;">
<div style="width: 16pt; height: 16pt; background: #10B981; border-radius: 3pt; display: flex; align-items: center; justify-content: center; flex-shrink: 0;">
<p style="font-size: 8pt; font-weight: 800; color: #fff; white-space: nowrap;">2</p>
</div>
<p style="font-size: 7pt; font-weight: 700; color: #fff; white-space: nowrap;">데이터 기반 의사결정</p>
</div>
<p style="font-size: 6pt; color: rgba(255,255,255,0.4); line-height: 1.4;">감이 아닌 숫자로 판단<br>매출 추이, KPI, 팀 성과 비교</p>
</div>
<div style="flex: 1; background: rgba(139,92,246,0.06); border: 1pt solid rgba(139,92,246,0.12); border-radius: 6pt; padding: 7pt 6pt;">
<div style="display: flex; align-items: center; gap: 4pt; margin-bottom: 3pt;">
<div style="width: 16pt; height: 16pt; background: #8B5CF6; border-radius: 3pt; display: flex; align-items: center; justify-content: center; flex-shrink: 0;">
<p style="font-size: 8pt; font-weight: 800; color: #fff; white-space: nowrap;">3</p>
</div>
<p style="font-size: 7pt; font-weight: 700; color: #fff; white-space: nowrap;">빠른 승인/결재</p>
</div>
<p style="font-size: 6pt; color: rgba(255,255,255,0.4); line-height: 1.4;">대기 건수를 실시간 알림<br>모바일에서도 즉시 승인 처리</p>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(255,255,255,0.06); margin-bottom: 10pt;"></div>
<!-- 대시보드 상세 기능 6개 -->
<div style="margin-bottom: 10pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #F59E0B; margin-bottom: 6pt;">대시보드 핵심 기능</p>
<div style="display: flex; flex-direction: column; gap: 3pt;">
<div style="display: flex; gap: 3pt;">
<div style="flex: 1; display: flex; align-items: center; gap: 5pt; background: rgba(14,165,233,0.05); border-radius: 4pt; padding: 5pt 7pt;">
<div style="width: 4pt; height: 4pt; background: #0EA5E9; border-radius: 50%; flex-shrink: 0;"></div>
<p style="font-size: 6.5pt; color: rgba(255,255,255,0.6); white-space: nowrap;">실시간 <span style="color: #0EA5E9; font-weight: 700;">매출/수주 KPI</span></p>
</div>
<div style="flex: 1; display: flex; align-items: center; gap: 5pt; background: rgba(16,185,129,0.05); border-radius: 4pt; padding: 5pt 7pt;">
<div style="width: 4pt; height: 4pt; background: #10B981; border-radius: 50%; flex-shrink: 0;"></div>
<p style="font-size: 6.5pt; color: rgba(255,255,255,0.6); white-space: nowrap;">조직 계층별 <span style="color: #10B981; font-weight: 700;">실적 트리</span></p>
</div>
</div>
<div style="display: flex; gap: 3pt;">
<div style="flex: 1; display: flex; align-items: center; gap: 5pt; background: rgba(139,92,246,0.05); border-radius: 4pt; padding: 5pt 7pt;">
<div style="width: 4pt; height: 4pt; background: #8B5CF6; border-radius: 50%; flex-shrink: 0;"></div>
<p style="font-size: 6.5pt; color: rgba(255,255,255,0.6); white-space: nowrap;">역할별 <span style="color: #8B5CF6; font-weight: 700;">수당 현황</span></p>
</div>
<div style="flex: 1; display: flex; align-items: center; gap: 5pt; background: rgba(239,68,68,0.05); border-radius: 4pt; padding: 5pt 7pt;">
<div style="width: 4pt; height: 4pt; background: #EF4444; border-radius: 50%; flex-shrink: 0;"></div>
<p style="font-size: 6.5pt; color: rgba(255,255,255,0.6); white-space: nowrap;">미승인 건수 <span style="color: #EF4444; font-weight: 700;">실시간 알림</span></p>
</div>
</div>
<div style="display: flex; gap: 3pt;">
<div style="flex: 1; display: flex; align-items: center; gap: 5pt; background: rgba(245,158,11,0.05); border-radius: 4pt; padding: 5pt 7pt;">
<div style="width: 4pt; height: 4pt; background: #F59E0B; border-radius: 50%; flex-shrink: 0;"></div>
<p style="font-size: 6.5pt; color: rgba(255,255,255,0.6); white-space: nowrap;">기간별 <span style="color: #F59E0B; font-weight: 700;">트렌드 분석</span></p>
</div>
<div style="flex: 1; display: flex; align-items: center; gap: 5pt; background: rgba(236,72,153,0.05); border-radius: 4pt; padding: 5pt 7pt;">
<div style="width: 4pt; height: 4pt; background: #EC4899; border-radius: 50%; flex-shrink: 0;"></div>
<p style="font-size: 6.5pt; color: rgba(255,255,255,0.6); white-space: nowrap;">수익 <span style="color: #EC4899; font-weight: 700;">시뮬레이터</span></p>
</div>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(255,255,255,0.06); margin-bottom: 10pt;"></div>
<!-- Before/After 비교 -->
<div style="display: flex; gap: 6pt; margin-bottom: 10pt;">
<!-- Before -->
<div style="flex: 1;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #EF4444; margin-bottom: 5pt;">BEFORE</p>
<div style="background: rgba(239,68,68,0.05); border: 1pt solid rgba(239,68,68,0.1); border-radius: 5pt; padding: 6pt 8pt;">
<div style="display: flex; flex-direction: column; gap: 3pt;">
<p style="font-size: 6pt; color: rgba(255,255,255,0.5); white-space: nowrap;">"매출 얼마야?" → 보고 대기 1~2일</p>
<p style="font-size: 6pt; color: rgba(255,255,255,0.5); white-space: nowrap;">"수주 현황?" → Excel 취합 반나절</p>
<p style="font-size: 6pt; color: rgba(255,255,255,0.5); white-space: nowrap;">"승인할 것 있어?" → 서류 뒤지기</p>
<p style="font-size: 6pt; color: rgba(255,255,255,0.5); white-space: nowrap;">"팀별 실적?" → 각 팀장 개별 보고</p>
</div>
</div>
</div>
<!-- After -->
<div style="flex: 1;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #10B981; margin-bottom: 5pt;">AFTER (SAM)</p>
<div style="background: rgba(16,185,129,0.05); border: 1pt solid rgba(16,185,129,0.1); border-radius: 5pt; padding: 6pt 8pt;">
<div style="display: flex; flex-direction: column; gap: 3pt;">
<p style="font-size: 6pt; color: rgba(255,255,255,0.5); white-space: nowrap;">로그인 → <span style="color: #10B981; font-weight: 700;">3초만에 전사 현황</span></p>
<p style="font-size: 6pt; color: rgba(255,255,255,0.5); white-space: nowrap;">클릭 한 번 → <span style="color: #10B981; font-weight: 700;">실시간 수주 데이터</span></p>
<p style="font-size: 6pt; color: rgba(255,255,255,0.5); white-space: nowrap;">빨간 뱃지 → <span style="color: #10B981; font-weight: 700;">즉시 승인 처리</span></p>
<p style="font-size: 6pt; color: rgba(255,255,255,0.5); white-space: nowrap;">트리 구조 → <span style="color: #10B981; font-weight: 700;">전 조직 실적 한눈에</span></p>
</div>
</div>
</div>
</div>
<!-- 기술 태그 -->
<div style="display: flex; gap: 4pt; margin-bottom: 8pt;">
<div style="background: rgba(255,255,255,0.04); border-radius: 3pt; padding: 3pt 7pt;">
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.35);">PC + 모바일</p>
</div>
<div style="background: rgba(255,255,255,0.04); border-radius: 3pt; padding: 3pt 7pt;">
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.35);">실시간 업데이트</p>
</div>
<div style="background: rgba(255,255,255,0.04); border-radius: 3pt; padding: 3pt 7pt;">
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.35);">역할별 권한</p>
</div>
<div style="background: rgba(255,255,255,0.04); border-radius: 3pt; padding: 3pt 7pt;">
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.35);">클라우드 기반</p>
</div>
<div style="background: rgba(255,255,255,0.04); border-radius: 3pt; padding: 3pt 7pt;">
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.35);">데이터 암호화</p>
</div>
</div>
<!-- 푸터 -->
<div style="margin-top: auto; border-top: 1pt solid rgba(255,255,255,0.06); padding-top: 8pt;">
<div style="display: flex; justify-content: space-between; align-items: flex-end;">
<div>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: rgba(255,255,255,0.65);">SAM</p>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.25); margin-top: 2pt;">www.sam.it.kr</p>
</div>
<div style="text-align: right;">
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,240 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
width: 405pt; height: 720pt;
font-family: 'Pretendard', sans-serif;
background: #0B1929;
padding: 20pt 22pt 12pt 22pt;
display: flex; flex-direction: column;
}
</style>
</head>
<body>
<!-- 헤더 -->
<div style="display: flex; align-items: center; gap: 8pt; margin-bottom: 10pt;">
<img src="/home/aweso/sam/docs/assets/bi/sam_bi_white.png" style="height: 18pt;">
<div style="flex: 1;"></div>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.25);">DASHBOARD FEATURES &amp; PRICING</p>
</div>
<!-- 대시보드 상세 기능 -->
<div style="margin-bottom: 10pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #0EA5E9; margin-bottom: 6pt;">대시보드 핵심 기능</p>
<div style="display: flex; flex-direction: column; gap: 2pt;">
<!-- 01 -->
<div style="display: flex; align-items: center; gap: 6pt; background: rgba(14,165,233,0.06); border-radius: 4pt; padding: 4pt 8pt;">
<div style="width: 18pt; height: 18pt; background: #0EA5E9; border-radius: 3pt; display: flex; align-items: center; justify-content: center; flex-shrink: 0;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 800; color: #fff;">01</p>
</div>
<p style="font-size: 6.5pt; font-weight: 600; color: #fff; width: 72pt; flex-shrink: 0; white-space: nowrap;">실시간 KPI 카드</p>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.4);">월 매출, 수주 잔량, 납기 준수율, 승인 대기 한눈에</p>
</div>
<!-- 02 -->
<div style="display: flex; align-items: center; gap: 6pt; background: rgba(16,185,129,0.06); border-radius: 4pt; padding: 4pt 8pt;">
<div style="width: 18pt; height: 18pt; background: #10B981; border-radius: 3pt; display: flex; align-items: center; justify-content: center; flex-shrink: 0;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 800; color: #fff;">02</p>
</div>
<p style="font-size: 6.5pt; font-weight: 600; color: #fff; width: 72pt; flex-shrink: 0; white-space: nowrap;">조직 실적 트리</p>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.4);">계층 구조로 각 팀/개인 실적 펼쳐보기</p>
</div>
<!-- 03 -->
<div style="display: flex; align-items: center; gap: 6pt; background: rgba(139,92,246,0.06); border-radius: 4pt; padding: 4pt 8pt;">
<div style="width: 18pt; height: 18pt; background: #8B5CF6; border-radius: 3pt; display: flex; align-items: center; justify-content: center; flex-shrink: 0;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 800; color: #fff;">03</p>
</div>
<p style="font-size: 6.5pt; font-weight: 600; color: #fff; width: 72pt; flex-shrink: 0; white-space: nowrap;">역할별 수당 현황</p>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.4);">판매자/관리자/협업자 수당 배분 실시간 확인</p>
</div>
<!-- 04 -->
<div style="display: flex; align-items: center; gap: 6pt; background: rgba(239,68,68,0.06); border-radius: 4pt; padding: 4pt 8pt;">
<div style="width: 18pt; height: 18pt; background: #EF4444; border-radius: 3pt; display: flex; align-items: center; justify-content: center; flex-shrink: 0;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 800; color: #fff;">04</p>
</div>
<p style="font-size: 6.5pt; font-weight: 600; color: #fff; width: 72pt; flex-shrink: 0; white-space: nowrap;">승인 대기 알림</p>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.4);">가입/지급 승인 미처리 건수 빨간 뱃지로 강조</p>
</div>
<!-- 05 -->
<div style="display: flex; align-items: center; gap: 6pt; background: rgba(245,158,11,0.06); border-radius: 4pt; padding: 4pt 8pt;">
<div style="width: 18pt; height: 18pt; background: #F59E0B; border-radius: 3pt; display: flex; align-items: center; justify-content: center; flex-shrink: 0;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 800; color: #fff;">05</p>
</div>
<p style="font-size: 6.5pt; font-weight: 600; color: #fff; width: 72pt; flex-shrink: 0; white-space: nowrap;">기간별 트렌드</p>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.4);">당월/분기/연간 매출 추이 차트, 성장률 비교</p>
</div>
<!-- 06 -->
<div style="display: flex; align-items: center; gap: 6pt; background: rgba(236,72,153,0.06); border-radius: 4pt; padding: 4pt 8pt;">
<div style="width: 18pt; height: 18pt; background: #EC4899; border-radius: 3pt; display: flex; align-items: center; justify-content: center; flex-shrink: 0;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 800; color: #fff;">06</p>
</div>
<p style="font-size: 6.5pt; font-weight: 600; color: #fff; width: 72pt; flex-shrink: 0; white-space: nowrap;">수익 시뮬레이터</p>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.4);">가상 시나리오로 수당/마진 사전 계산</p>
</div>
<!-- 07 -->
<div style="display: flex; align-items: center; gap: 6pt; background: rgba(14,165,233,0.06); border-radius: 4pt; padding: 4pt 8pt;">
<div style="width: 18pt; height: 18pt; background: #0EA5E9; border-radius: 3pt; display: flex; align-items: center; justify-content: center; flex-shrink: 0;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 800; color: #fff;">07</p>
</div>
<p style="font-size: 6.5pt; font-weight: 600; color: #fff; width: 72pt; flex-shrink: 0; white-space: nowrap;">모바일 대응</p>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.4);">이동중에도 스마트폰으로 KPI 확인 및 승인</p>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(255,255,255,0.06); margin-bottom: 8pt;"></div>
<!-- 역할별 화면 -->
<div style="margin-bottom: 10pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #10B981; margin-bottom: 6pt;">역할별 맞춤 화면</p>
<div style="display: flex; gap: 4pt;">
<div style="flex: 1; background: rgba(14,165,233,0.08); border: 1pt solid rgba(14,165,233,0.15); border-radius: 5pt; padding: 7pt 6pt; text-align: center;">
<p style="white-space: nowrap; font-size: 8pt; font-weight: 800; color: #0EA5E9; margin-bottom: 2pt;">CEO</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: rgba(255,255,255,0.6);">전사 KPI</p>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.35);">매출/수주/조직 총괄</p>
</div>
<div style="flex: 1; background: rgba(16,185,129,0.08); border: 1pt solid rgba(16,185,129,0.15); border-radius: 5pt; padding: 7pt 6pt; text-align: center;">
<p style="white-space: nowrap; font-size: 8pt; font-weight: 800; color: #10B981; margin-bottom: 2pt;">관리자</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: rgba(255,255,255,0.6);">팀 실적 관리</p>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.35);">하위 조직 성과 추적</p>
</div>
<div style="flex: 1; background: rgba(245,158,11,0.08); border: 1pt solid rgba(245,158,11,0.15); border-radius: 5pt; padding: 7pt 6pt; text-align: center;">
<p style="white-space: nowrap; font-size: 8pt; font-weight: 800; color: #F59E0B; margin-bottom: 2pt;">운영자</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: rgba(255,255,255,0.6);">인력/승인 관리</p>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.35);">가입/지급 승인 처리</p>
</div>
<div style="flex: 1; background: rgba(139,92,246,0.08); border: 1pt solid rgba(139,92,246,0.15); border-radius: 5pt; padding: 7pt 6pt; text-align: center;">
<p style="white-space: nowrap; font-size: 8pt; font-weight: 800; color: #8B5CF6; margin-bottom: 2pt;">영업자</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: rgba(255,255,255,0.6);">내 실적 조회</p>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.35);">계약/수당 현황 확인</p>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(255,255,255,0.06); margin-bottom: 8pt;"></div>
<!-- SAM 전체 플랫폼 -->
<div style="margin-bottom: 10pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #8B5CF6; margin-bottom: 6pt;">대시보드 + SAM 통합 플랫폼</p>
<div style="display: flex; gap: 4pt;">
<div style="flex: 1; background: rgba(255,255,255,0.03); border-radius: 4pt; padding: 4pt 5pt; text-align: center;">
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: rgba(255,255,255,0.5);">견적/수주</p>
</div>
<div style="flex: 1; background: rgba(255,255,255,0.03); border-radius: 4pt; padding: 4pt 5pt; text-align: center;">
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: rgba(255,255,255,0.5);">생산 (MES)</p>
</div>
<div style="flex: 1; background: rgba(255,255,255,0.03); border-radius: 4pt; padding: 4pt 5pt; text-align: center;">
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: rgba(255,255,255,0.5);">품질/검사</p>
</div>
<div style="flex: 1; background: rgba(255,255,255,0.03); border-radius: 4pt; padding: 4pt 5pt; text-align: center;">
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: rgba(255,255,255,0.5);">재고/자재</p>
</div>
<div style="flex: 1; background: rgba(255,255,255,0.03); border-radius: 4pt; padding: 4pt 5pt; text-align: center;">
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: rgba(255,255,255,0.5);">인사/회계</p>
</div>
</div>
<p style="font-size: 6pt; color: rgba(255,255,255,0.3); margin-top: 3pt; text-align: center;">대시보드에 표시되는 모든 데이터는 SAM ERP/MES 실시간 데이터 기반</p>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(255,255,255,0.06); margin-bottom: 8pt;"></div>
<!-- 투자 비용 -->
<div style="margin-bottom: 10pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #F59E0B; margin-bottom: 6pt;">투자 비용</p>
<div style="display: flex; gap: 6pt;">
<!-- 기본 패키지 -->
<div style="flex: 1;">
<div style="background: rgba(14,165,233,0.08); border: 1pt solid rgba(14,165,233,0.15); border-radius: 6pt; padding: 8pt 10pt; margin-bottom: 3pt;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: #0EA5E9; margin-bottom: 3pt;">대시보드 포함 기본 패키지</p>
<p style="white-space: nowrap; font-size: 13pt; font-weight: 800; color: #ffffff;">2,000만원</p>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.4);">+ 월 50만원 (유지보수)</p>
</div>
<div style="background: rgba(255,255,255,0.03); border-radius: 4pt; padding: 3pt 6pt;">
<p style="font-size: 6pt; color: rgba(255,255,255,0.35); line-height: 1.4;">CEO 대시보드 + 견적/수주 + 생산<br>인사/회계 무료 포함</p>
</div>
</div>
<!-- 추가 옵션 -->
<div style="flex: 1;">
<div style="background: rgba(245,158,11,0.08); border: 1pt solid rgba(245,158,11,0.15); border-radius: 6pt; padding: 8pt 10pt;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: #F59E0B; margin-bottom: 4pt;">추가 옵션 (선택)</p>
<div style="display: flex; flex-direction: column; gap: 3pt;">
<div style="display: flex; justify-content: space-between;">
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.5);">생산공정 관리</p>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #F59E0B;">+500만원</p>
</div>
<div style="display: flex; justify-content: space-between;">
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.5);">품질관리(인정검사)</p>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #F59E0B;">+2,000만원</p>
</div>
<div style="display: flex; justify-content: space-between;">
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.5);">AI 견적 자동 생성</p>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #F59E0B;">월 10~20만원</p>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(255,255,255,0.06); margin-bottom: 8pt;"></div>
<!-- 도입 프로세스 -->
<div style="margin-bottom: 8pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #10B981; margin-bottom: 5pt;">도입 프로세스</p>
<div style="display: flex; gap: 3pt;">
<div style="flex: 1; border-radius: 5pt; padding: 5pt 3pt; text-align: center; background: rgba(14,165,233,0.1); border: 1pt solid rgba(14,165,233,0.2);">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #0EA5E9;">1</p>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.45); margin-top: 1pt;">1~2주</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: rgba(255,255,255,0.65); margin-top: 1pt;">현장 인터뷰</p>
</div>
<div style="display: flex; align-items: center;">
<p style="font-size: 6pt; color: rgba(255,255,255,0.2);">&#9654;</p>
</div>
<div style="flex: 1; border-radius: 5pt; padding: 5pt 3pt; text-align: center; background: rgba(16,185,129,0.1); border: 1pt solid rgba(16,185,129,0.2);">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #10B981;">2</p>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.45); margin-top: 1pt;">2~4주</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: rgba(255,255,255,0.65); margin-top: 1pt;">맞춤 개발</p>
</div>
<div style="display: flex; align-items: center;">
<p style="font-size: 6pt; color: rgba(255,255,255,0.2);">&#9654;</p>
</div>
<div style="flex: 1; border-radius: 5pt; padding: 5pt 3pt; text-align: center; background: rgba(139,92,246,0.1); border: 1pt solid rgba(139,92,246,0.2);">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #8B5CF6;">3</p>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.45); margin-top: 1pt;">1~2주</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: rgba(255,255,255,0.65); margin-top: 1pt;">데이터 이관</p>
</div>
<div style="display: flex; align-items: center;">
<p style="font-size: 6pt; color: rgba(255,255,255,0.2);">&#9654;</p>
</div>
<div style="flex: 1; border-radius: 5pt; padding: 5pt 3pt; text-align: center; background: rgba(245,158,11,0.1); border: 1pt solid rgba(245,158,11,0.2);">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #F59E0B;">4</p>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.45); margin-top: 1pt;">1~2주</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: rgba(255,255,255,0.65); margin-top: 1pt;">교육/안정화</p>
</div>
</div>
</div>
<!-- CTA 푸터 -->
<div style="margin-top: auto; background: rgba(14,165,233,0.08); border: 1.5pt solid rgba(14,165,233,0.2); border-radius: 8pt; padding: 10pt 14pt;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<div>
<p style="white-space: nowrap; font-size: 7pt; color: rgba(255,255,255,0.4); margin-top: 2pt;">대표님 전용 대시보드를 직접 체험해 보세요</p>
</div>
<div style="text-align: right;">
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.35); margin-top: 2pt;">www.sam.it.kr</p>
</div>
</div>
</div>
<!-- 회사명 -->
<div style="margin-top: 5pt; text-align: center;">
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.18);">SAM — Smart Automation Management</p>
</div>
</body>
</html>

View File

@@ -0,0 +1,172 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
width: 405pt; height: 720pt;
font-family: 'Pretendard', sans-serif;
background: #0B1929;
padding: 28pt 24pt 20pt 24pt;
display: flex; flex-direction: column;
}
</style>
</head>
<body>
<!-- 헤더 -->
<div style="display: flex; align-items: center; gap: 8pt; margin-bottom: 18pt;">
<img src="/home/aweso/sam/docs/assets/bi/sam_bi_white.png" style="height: 22pt;">
<div style="flex: 1;"></div>
<p style="white-space: nowrap; font-size: 7pt; color: rgba(255,255,255,0.25);">CEO DASHBOARD EDITION</p>
</div>
<!-- 히어로 섹션 -->
<div style="margin-bottom: 22pt;">
<p style="white-space: nowrap; font-size: 8pt; font-weight: 600; color: #0EA5E9; letter-spacing: 0.1em; margin-bottom: 6pt;">EXECUTIVE DASHBOARD</p>
<h1 style="font-size: 20pt; font-weight: 800; color: #ffffff; line-height: 1.35; margin-bottom: 8pt;">대표님, 지금 우리 회사<br>어떻게 돌아가고 있나요?</h1>
<p style="font-size: 8.5pt; color: rgba(255,255,255,0.45); line-height: 1.6;">매출이 얼마인지, 수주가 밀려있는지, 승인할 건이 있는지<br>더 이상 보고를 기다리지 마세요.</p>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(255,255,255,0.06); margin-bottom: 18pt;"></div>
<!-- 고민 섹션 -->
<div style="margin-bottom: 18pt;">
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: #EF4444; margin-bottom: 8pt;">대표님의 하루</p>
<div style="display: flex; flex-direction: column; gap: 4pt;">
<div style="display: flex; align-items: center; gap: 8pt; background: rgba(239,68,68,0.05); border: 1pt solid rgba(239,68,68,0.08); border-radius: 5pt; padding: 7pt 10pt;">
<p style="white-space: nowrap; font-size: 9pt; color: rgba(255,255,255,0.3);">AM 9:00</p>
<p style="font-size: 7.5pt; color: rgba(255,255,255,0.55); white-space: nowrap;">"어제 매출 얼마야?" → <span style="color: #EF4444; font-weight: 600;">팀장 보고 대기중...</span></p>
</div>
<div style="display: flex; align-items: center; gap: 8pt; background: rgba(239,68,68,0.05); border: 1pt solid rgba(239,68,68,0.08); border-radius: 5pt; padding: 7pt 10pt;">
<p style="white-space: nowrap; font-size: 9pt; color: rgba(255,255,255,0.3);">PM 2:00</p>
<p style="font-size: 7.5pt; color: rgba(255,255,255,0.55); white-space: nowrap;">"수주 밀린 거 없어?" → <span style="color: #EF4444; font-weight: 600;">Excel 취합중...</span></p>
</div>
<div style="display: flex; align-items: center; gap: 8pt; background: rgba(239,68,68,0.05); border: 1pt solid rgba(239,68,68,0.08); border-radius: 5pt; padding: 7pt 10pt;">
<p style="white-space: nowrap; font-size: 9pt; color: rgba(255,255,255,0.3);">PM 5:00</p>
<p style="font-size: 7.5pt; color: rgba(255,255,255,0.55); white-space: nowrap;">"결재할 것 좀 정리해줘" → <span style="color: #EF4444; font-weight: 600;">서류 찾는중...</span></p>
</div>
</div>
</div>
<!-- 화살표 구분 -->
<div style="text-align: center; margin-bottom: 14pt;">
<p style="font-size: 10pt; color: rgba(14,165,233,0.6);">&#9660;</p>
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #0EA5E9;">SAM으로 바꾸면</p>
</div>
<!-- 대시보드 미리보기 (Mock UI) -->
<div style="background: #111D2E; border: 1.5pt solid rgba(14,165,233,0.2); border-radius: 8pt; padding: 10pt; margin-bottom: 18pt;">
<!-- 대시보드 타이틀바 -->
<div style="display: flex; align-items: center; gap: 4pt; margin-bottom: 7pt;">
<div style="width: 5pt; height: 5pt; border-radius: 50%; background: #EF4444;"></div>
<div style="width: 5pt; height: 5pt; border-radius: 50%; background: #F59E0B;"></div>
<div style="width: 5pt; height: 5pt; border-radius: 50%; background: #10B981;"></div>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.3); margin-left: 6pt;">SAM CEO Dashboard ― 로그인 후 3초</p>
</div>
<!-- KPI 카드 -->
<div style="display: flex; gap: 4pt; margin-bottom: 5pt;">
<div style="flex: 1; background: rgba(14,165,233,0.12); border: 1pt solid rgba(14,165,233,0.2); border-radius: 4pt; padding: 5pt 4pt; text-align: center;">
<p style="white-space: nowrap; font-size: 5pt; color: #0EA5E9; font-weight: 600;">월 매출</p>
<p style="white-space: nowrap; font-size: 12pt; font-weight: 800; color: #fff;">5.2억</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">&#9650; 15.3%</p>
</div>
<div style="flex: 1; background: rgba(16,185,129,0.12); border: 1pt solid rgba(16,185,129,0.2); border-radius: 4pt; padding: 5pt 4pt; text-align: center;">
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 600;">누적 수주</p>
<p style="white-space: nowrap; font-size: 12pt; font-weight: 800; color: #fff;">127건</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">&#9650; 8건</p>
</div>
<div style="flex: 1; background: rgba(139,92,246,0.12); border: 1pt solid rgba(139,92,246,0.2); border-radius: 4pt; padding: 5pt 4pt; text-align: center;">
<p style="white-space: nowrap; font-size: 5pt; color: #8B5CF6; font-weight: 600;">납기 준수율</p>
<p style="white-space: nowrap; font-size: 12pt; font-weight: 800; color: #fff;">96%</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">목표 달성</p>
</div>
<div style="flex: 1; background: rgba(239,68,68,0.15); border: 1pt solid rgba(239,68,68,0.25); border-radius: 4pt; padding: 5pt 4pt; text-align: center;">
<p style="white-space: nowrap; font-size: 5pt; color: #EF4444; font-weight: 600;">승인 대기</p>
<p style="white-space: nowrap; font-size: 12pt; font-weight: 800; color: #EF4444;">5건</p>
<p style="white-space: nowrap; font-size: 5pt; color: #EF4444; font-weight: 700;">즉시 처리</p>
</div>
</div>
<!-- 차트 (바 그래프) -->
<div style="display: flex; gap: 4pt;">
<div style="flex: 3; background: rgba(255,255,255,0.03); border-radius: 4pt; padding: 5pt 6pt;">
<p style="white-space: nowrap; font-size: 5pt; color: rgba(255,255,255,0.35); margin-bottom: 3pt;">월별 매출 추이</p>
<div style="display: flex; align-items: flex-end; gap: 2pt; height: 30pt;">
<div style="flex: 1; background: rgba(14,165,233,0.3); border-radius: 1pt; height: 45%;"></div>
<div style="flex: 1; background: rgba(14,165,233,0.35); border-radius: 1pt; height: 52%;"></div>
<div style="flex: 1; background: rgba(14,165,233,0.4); border-radius: 1pt; height: 48%;"></div>
<div style="flex: 1; background: rgba(14,165,233,0.5); border-radius: 1pt; height: 62%;"></div>
<div style="flex: 1; background: rgba(14,165,233,0.55); border-radius: 1pt; height: 68%;"></div>
<div style="flex: 1; background: rgba(14,165,233,0.65); border-radius: 1pt; height: 75%;"></div>
<div style="flex: 1; background: rgba(14,165,233,0.7); border-radius: 1pt; height: 72%;"></div>
<div style="flex: 1; background: rgba(14,165,233,0.8); border-radius: 1pt; height: 85%;"></div>
<div style="flex: 1; background: rgba(14,165,233,0.85); border-radius: 1pt; height: 80%;"></div>
<div style="flex: 1; background: #0EA5E9; border-radius: 1pt; height: 95%;"></div>
</div>
</div>
<div style="flex: 2; background: rgba(255,255,255,0.03); border-radius: 4pt; padding: 5pt 6pt;">
<p style="white-space: nowrap; font-size: 5pt; color: rgba(255,255,255,0.35); margin-bottom: 3pt;">조직별 실적</p>
<div style="display: flex; flex-direction: column; gap: 3pt;">
<div style="display: flex; align-items: center; gap: 3pt;">
<div style="width: 3pt; height: 3pt; background: #0EA5E9; border-radius: 50%;"></div>
<p style="white-space: nowrap; font-size: 5pt; color: rgba(255,255,255,0.45); width: 28pt;">영업1팀</p>
<div style="flex: 1; height: 4pt; background: rgba(14,165,233,0.15); border-radius: 2pt; overflow: hidden;">
<div style="width: 85%; height: 100%; background: #0EA5E9; border-radius: 2pt;"></div>
</div>
</div>
<div style="display: flex; align-items: center; gap: 3pt;">
<div style="width: 3pt; height: 3pt; background: #10B981; border-radius: 50%;"></div>
<p style="white-space: nowrap; font-size: 5pt; color: rgba(255,255,255,0.45); width: 28pt;">영업2팀</p>
<div style="flex: 1; height: 4pt; background: rgba(16,185,129,0.15); border-radius: 2pt; overflow: hidden;">
<div style="width: 68%; height: 100%; background: #10B981; border-radius: 2pt;"></div>
</div>
</div>
<div style="display: flex; align-items: center; gap: 3pt;">
<div style="width: 3pt; height: 3pt; background: #8B5CF6; border-radius: 50%;"></div>
<p style="white-space: nowrap; font-size: 5pt; color: rgba(255,255,255,0.45); width: 28pt;">생산팀</p>
<div style="flex: 1; height: 4pt; background: rgba(139,92,246,0.15); border-radius: 2pt; overflow: hidden;">
<div style="width: 92%; height: 100%; background: #8B5CF6; border-radius: 2pt;"></div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 핵심 가치 -->
<div style="background: rgba(14,165,233,0.06); border: 1pt solid rgba(14,165,233,0.12); border-radius: 8pt; padding: 12pt 14pt; margin-bottom: 14pt;">
<p style="white-space: nowrap; font-size: 8pt; font-weight: 700; color: #0EA5E9; margin-bottom: 5pt;">SAM 대시보드가 드리는 약속</p>
<p style="font-size: 8pt; color: rgba(255,255,255,0.5); line-height: 1.6;">
로그인 한 번이면 전사 매출, 수주, 조직 실적, 승인 대기 건수를
한눈에 파악합니다. 보고를 기다리는 시간을 제로로 만들어 드립니다.
</p>
</div>
<!-- 기술 태그 -->
<div style="display: flex; gap: 5pt; margin-bottom: 10pt;">
<div style="background: rgba(255,255,255,0.04); border-radius: 4pt; padding: 4pt 8pt;">
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.35);">클라우드 기반 (설치 불필요)</p>
</div>
<div style="background: rgba(255,255,255,0.04); border-radius: 4pt; padding: 4pt 8pt;">
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.35);">모바일 대응</p>
</div>
<div style="background: rgba(255,255,255,0.04); border-radius: 4pt; padding: 4pt 8pt;">
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.35);">역할별 권한 분리</p>
</div>
</div>
<!-- 푸터 -->
<div style="margin-top: auto; border-top: 1pt solid rgba(255,255,255,0.06); padding-top: 10pt;">
<div style="display: flex; justify-content: space-between; align-items: flex-end;">
<div>
<p style="white-space: nowrap; font-size: 8pt; font-weight: 700; color: rgba(255,255,255,0.65);">SAM</p>
<p style="white-space: nowrap; font-size: 7pt; color: rgba(255,255,255,0.25); margin-top: 2pt;">www.sam.it.kr</p>
</div>
<div style="text-align: right;">
<p style="white-space: nowrap; font-size: 7pt; color: rgba(255,255,255,0.3);">뒷면에서 상세 기능을 확인하세요</p>
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,27 @@
const path = require('path');
module.paths.unshift(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/node_modules'));
const PptxGenJS = require('pptxgenjs');
const html2pptx = require(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/html2pptx.js'));
async function main() {
const pres = new PptxGenJS();
pres.defineLayout({ name: 'PORTRAIT_9x16', width: 5.625, height: 10 });
pres.layout = 'PORTRAIT_9x16';
const htmlFile = path.join(__dirname, 'slides', 'brochure-dashboard-1page.html');
console.log('Converting CEO Dashboard v3 1-page brochure...');
try {
await html2pptx(htmlFile, pres);
} catch (err) {
console.error(`Error: ${err.message}`);
}
const outputPath = path.join(__dirname, 'sam-brochure-v3-dashboard-1page.pptx');
await pres.writeFile({ fileName: outputPath });
console.log(`\nPPTX created: ${outputPath}`);
}
main().catch(console.error);

View File

@@ -0,0 +1,31 @@
const path = require('path');
module.paths.unshift(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/node_modules'));
const PptxGenJS = require('pptxgenjs');
const html2pptx = require(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/html2pptx.js'));
async function main() {
const pres = new PptxGenJS();
pres.defineLayout({ name: 'PORTRAIT_9x16', width: 5.625, height: 10 });
pres.layout = 'PORTRAIT_9x16';
const slidesDir = path.join(__dirname, 'slides');
const slides = ['brochure-dashboard-front.html', 'brochure-dashboard-back.html'];
for (const file of slides) {
const htmlFile = path.join(slidesDir, file);
console.log(`Converting ${file} ...`);
try {
await html2pptx(htmlFile, pres);
} catch (err) {
console.error(`Error on ${file}: ${err.message}`);
}
}
const outputPath = path.join(__dirname, 'sam-brochure-v3-dashboard-2page.pptx');
await pres.writeFile({ fileName: outputPath });
console.log(`\nPPTX created: ${outputPath}`);
}
main().catch(console.error);

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,403 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
width: 405pt; height: 720pt;
font-family: 'Pretendard', sans-serif;
background: #0B1929;
padding: 22pt 20pt 12pt 20pt;
display: flex; flex-direction: column;
}
</style>
</head>
<body>
<!-- 헤더 -->
<div style="display: flex; align-items: center; gap: 8pt; margin-bottom: 10pt;">
<img src="/home/aweso/sam/docs/assets/bi/sam_bi_white.png" style="height: 20pt;">
<div style="flex: 1;"></div>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.2);">CEO DASHBOARD v3</p>
</div>
<!-- 히어로 -->
<div style="display: flex; align-items: center; gap: 12pt; margin-bottom: 12pt;">
<div style="flex: 1;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 600; color: #0EA5E9; letter-spacing: 0.1em; margin-bottom: 3pt;">EXECUTIVE DASHBOARD</p>
<h1 style="font-size: 16pt; font-weight: 800; color: #ffffff; line-height: 1.35; margin-bottom: 5pt;">대표님, 우리 회사<br>지금 어떤 상태인가요?</h1>
<p style="font-size: 7.5pt; color: rgba(255,255,255,0.4); line-height: 1.5;">보고 대기 없이, 로그인 한 번이면<br>전사 현황이 한눈에 들어옵니다.</p>
</div>
<!-- 히어로 SVG 아이콘: 대시보드 모니터 -->
<div style="flex-shrink: 0; width: 72pt; height: 72pt;">
<svg viewBox="0 0 80 80" width="72pt" height="72pt" xmlns="http://www.w3.org/2000/svg">
<rect x="8" y="10" width="64" height="44" rx="4" fill="none" stroke="#0EA5E9" stroke-width="1.5" opacity="0.6"/>
<rect x="12" y="14" width="56" height="36" rx="2" fill="#111D2E"/>
<!-- 미니 차트 바 -->
<rect x="16" y="38" width="6" height="8" rx="1" fill="#0EA5E9" opacity="0.5"/>
<rect x="24" y="34" width="6" height="12" rx="1" fill="#0EA5E9" opacity="0.65"/>
<rect x="32" y="30" width="6" height="16" rx="1" fill="#0EA5E9" opacity="0.8"/>
<rect x="40" y="26" width="6" height="20" rx="1" fill="#0EA5E9" opacity="0.9"/>
<rect x="48" y="22" width="6" height="24" rx="1" fill="#0EA5E9"/>
<rect x="56" y="28" width="6" height="18" rx="1" fill="#10B981" opacity="0.7"/>
<!-- 상단 KPI 표시 -->
<circle cx="18" cy="20" r="3" fill="#10B981" opacity="0.7"/>
<circle cx="28" cy="20" r="3" fill="#8B5CF6" opacity="0.7"/>
<circle cx="38" cy="20" r="3" fill="#F59E0B" opacity="0.7"/>
<circle cx="48" cy="20" r="3" fill="#EF4444" opacity="0.7"/>
<!-- 모니터 받침대 -->
<rect x="32" y="54" width="16" height="3" rx="1" fill="#0EA5E9" opacity="0.4"/>
<rect x="28" y="57" width="24" height="2" rx="1" fill="#0EA5E9" opacity="0.3"/>
<!-- 와이파이 시그널 -->
<path d="M58 62 Q62 58 66 62" fill="none" stroke="#10B981" stroke-width="1" opacity="0.5"/>
<path d="M56 66 Q62 60 68 66" fill="none" stroke="#10B981" stroke-width="1" opacity="0.3"/>
<circle cx="62" cy="66" r="1.5" fill="#10B981" opacity="0.6"/>
</svg>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(14,165,233,0.15); margin-bottom: 10pt;"></div>
<!-- 대시보드 Mock UI -->
<div style="background: #111D2E; border: 1pt solid rgba(14,165,233,0.12); border-radius: 7pt; padding: 8pt; margin-bottom: 9pt;">
<!-- 타이틀바 -->
<div style="display: flex; align-items: center; gap: 3pt; margin-bottom: 6pt;">
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #EF4444;"></div>
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #F59E0B;"></div>
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #10B981;"></div>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.25); margin-left: 5pt;">SAM CEO Dashboard</p>
</div>
<!-- KPI 카드 4개 (SVG 아이콘 포함) -->
<div style="display: flex; gap: 3pt; margin-bottom: 5pt;">
<!-- 월 매출 -->
<div style="flex: 1; background: rgba(14,165,233,0.1); border: 1pt solid rgba(14,165,233,0.18); border-radius: 4pt; padding: 5pt 4pt; text-align: center;">
<svg viewBox="0 0 20 20" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<path d="M3 16 L3 8 L7 8 L7 16 Z" fill="#0EA5E9" opacity="0.4"/>
<path d="M8 16 L8 5 L12 5 L12 16 Z" fill="#0EA5E9" opacity="0.65"/>
<path d="M13 16 L13 3 L17 3 L17 16 Z" fill="#0EA5E9"/>
<path d="M3 16 L17 16" stroke="#0EA5E9" stroke-width="0.5" opacity="0.4"/>
</svg>
<p style="white-space: nowrap; font-size: 10pt; font-weight: 800; color: #fff;">5.2억</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">&#9650; 15.3%</p>
<p style="white-space: nowrap; font-size: 5pt; color: #0EA5E9; font-weight: 600; margin-top: 1pt;">월 매출</p>
</div>
<!-- 수주 잔량 -->
<div style="flex: 1; background: rgba(16,185,129,0.1); border: 1pt solid rgba(16,185,129,0.18); border-radius: 4pt; padding: 5pt 4pt; text-align: center;">
<svg viewBox="0 0 20 20" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<rect x="3" y="3" width="14" height="14" rx="2" fill="none" stroke="#10B981" stroke-width="1.2" opacity="0.5"/>
<path d="M6 10 L9 13 L14 7" fill="none" stroke="#10B981" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 10pt; font-weight: 800; color: #fff;">127건</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">&#9650; 8건</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 600; margin-top: 1pt;">수주 잔량</p>
</div>
<!-- 납기 준수율 -->
<div style="flex: 1; background: rgba(139,92,246,0.1); border: 1pt solid rgba(139,92,246,0.18); border-radius: 4pt; padding: 5pt 4pt; text-align: center;">
<svg viewBox="0 0 20 20" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="10" cy="10" r="7" fill="none" stroke="#8B5CF6" stroke-width="1.2" opacity="0.3"/>
<circle cx="10" cy="10" r="7" fill="none" stroke="#8B5CF6" stroke-width="1.5" stroke-dasharray="40 44" stroke-dashoffset="-11" stroke-linecap="round"/>
<text x="10" y="12" text-anchor="middle" fill="#8B5CF6" font-size="5" font-weight="800">96</text>
</svg>
<p style="white-space: nowrap; font-size: 10pt; font-weight: 800; color: #fff;">96%</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">목표 달성</p>
<p style="white-space: nowrap; font-size: 5pt; color: #8B5CF6; font-weight: 600; margin-top: 1pt;">납기 준수율</p>
</div>
<!-- 승인 대기 -->
<div style="flex: 1; background: rgba(239,68,68,0.12); border: 1pt solid rgba(239,68,68,0.22); border-radius: 4pt; padding: 5pt 4pt; text-align: center;">
<svg viewBox="0 0 20 20" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<path d="M10 3 L17 15 L3 15 Z" fill="none" stroke="#EF4444" stroke-width="1.2" stroke-linejoin="round"/>
<line x1="10" y1="8" x2="10" y2="11" stroke="#EF4444" stroke-width="1.5" stroke-linecap="round"/>
<circle cx="10" cy="13" r="0.8" fill="#EF4444"/>
</svg>
<p style="white-space: nowrap; font-size: 10pt; font-weight: 800; color: #EF4444;">5건</p>
<p style="white-space: nowrap; font-size: 5pt; color: #EF4444; font-weight: 700;">즉시 처리</p>
<p style="white-space: nowrap; font-size: 5pt; color: #EF4444; font-weight: 600; margin-top: 1pt;">승인 대기</p>
</div>
</div>
<!-- 차트 영역 -->
<div style="display: flex; gap: 4pt;">
<!-- 매출 추이 (라인 차트 SVG) -->
<div style="flex: 3; background: rgba(255,255,255,0.02); border-radius: 4pt; padding: 4pt 5pt;">
<p style="white-space: nowrap; font-size: 5pt; color: rgba(255,255,255,0.3); margin-bottom: 2pt;">월별 매출 추이</p>
<svg viewBox="0 0 160 40" width="100%" height="30pt" xmlns="http://www.w3.org/2000/svg">
<!-- 그리드 라인 -->
<line x1="0" y1="10" x2="160" y2="10" stroke="rgba(255,255,255,0.04)" stroke-width="0.5"/>
<line x1="0" y1="20" x2="160" y2="20" stroke="rgba(255,255,255,0.04)" stroke-width="0.5"/>
<line x1="0" y1="30" x2="160" y2="30" stroke="rgba(255,255,255,0.04)" stroke-width="0.5"/>
<!-- 영역 채우기 -->
<path d="M5 35 L20 28 L35 30 L50 22 L65 18 L80 14 L95 16 L110 10 L125 12 L140 5 L155 8 L155 38 L5 38 Z" fill="url(#areaGrad)" opacity="0.4"/>
<!-- 라인 -->
<path d="M5 35 L20 28 L35 30 L50 22 L65 18 L80 14 L95 16 L110 10 L125 12 L140 5 L155 8" fill="none" stroke="#0EA5E9" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<!-- 데이터 포인트 -->
<circle cx="140" cy="5" r="2.5" fill="#0EA5E9"/>
<circle cx="155" cy="8" r="2" fill="#0EA5E9" opacity="0.5" stroke="#0EA5E9" stroke-width="0.5" stroke-dasharray="1 1"/>
<defs>
<linearGradient id="areaGrad" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#0EA5E9" stop-opacity="0.3"/>
<stop offset="100%" stop-color="#0EA5E9" stop-opacity="0"/>
</linearGradient>
</defs>
</svg>
</div>
<!-- 도넛 차트: 팀별 비중 -->
<div style="flex: 2; background: rgba(255,255,255,0.02); border-radius: 4pt; padding: 4pt 5pt; display: flex; align-items: center; gap: 5pt;">
<svg viewBox="0 0 44 44" width="36pt" height="36pt" xmlns="http://www.w3.org/2000/svg">
<!-- 배경 원 -->
<circle cx="22" cy="22" r="16" fill="none" stroke="rgba(255,255,255,0.06)" stroke-width="5"/>
<!-- 영업1팀 38% -->
<circle cx="22" cy="22" r="16" fill="none" stroke="#0EA5E9" stroke-width="5" stroke-dasharray="38 62" stroke-dashoffset="25" stroke-linecap="round"/>
<!-- 영업2팀 25% -->
<circle cx="22" cy="22" r="16" fill="none" stroke="#10B981" stroke-width="5" stroke-dasharray="25 75" stroke-dashoffset="-13" stroke-linecap="round"/>
<!-- 생산팀 22% -->
<circle cx="22" cy="22" r="16" fill="none" stroke="#8B5CF6" stroke-width="5" stroke-dasharray="22 78" stroke-dashoffset="-38" stroke-linecap="round"/>
<!-- 품질팀 15% -->
<circle cx="22" cy="22" r="16" fill="none" stroke="#F59E0B" stroke-width="5" stroke-dasharray="13 87" stroke-dashoffset="-60" stroke-linecap="round"/>
</svg>
<div style="display: flex; flex-direction: column; gap: 2pt;">
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 4pt; height: 4pt; background: #0EA5E9; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 5pt; color: rgba(255,255,255,0.45);">영업1팀 38%</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 4pt; height: 4pt; background: #10B981; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 5pt; color: rgba(255,255,255,0.45);">영업2팀 25%</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 4pt; height: 4pt; background: #8B5CF6; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 5pt; color: rgba(255,255,255,0.45);">생산팀 22%</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 4pt; height: 4pt; background: #F59E0B; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 5pt; color: rgba(255,255,255,0.45);">품질팀 15%</p>
</div>
</div>
</div>
</div>
</div>
<!-- 핵심 가치 3개 (SVG 아이콘) -->
<div style="margin-bottom: 9pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #0EA5E9; margin-bottom: 5pt;">대표님이 얻는 것</p>
<div style="display: flex; gap: 4pt;">
<!-- 즉시 현황 파악 -->
<div style="flex: 1; background: rgba(14,165,233,0.05); border: 1pt solid rgba(14,165,233,0.1); border-radius: 6pt; padding: 7pt 5pt; text-align: center;">
<svg viewBox="0 0 28 28" width="18pt" height="18pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 3pt;">
<circle cx="14" cy="14" r="10" fill="none" stroke="#0EA5E9" stroke-width="1.2" opacity="0.4"/>
<path d="M14 8 L14 14 L18 17" fill="none" stroke="#0EA5E9" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="14" cy="14" r="1.5" fill="#0EA5E9"/>
<!-- 번개 (빠름) -->
<path d="M22 5 L20 10 L23 10 L21 15" fill="none" stroke="#F59E0B" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="font-size: 7pt; font-weight: 700; color: #fff; white-space: nowrap;">즉시 현황 파악</p>
<p style="font-size: 5.5pt; color: rgba(255,255,255,0.35); margin-top: 2pt; line-height: 1.4;">로그인 3초면<br>전사 현황 확인</p>
</div>
<!-- 데이터 기반 의사결정 -->
<div style="flex: 1; background: rgba(16,185,129,0.05); border: 1pt solid rgba(16,185,129,0.1); border-radius: 6pt; padding: 7pt 5pt; text-align: center;">
<svg viewBox="0 0 28 28" width="18pt" height="18pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 3pt;">
<!-- 뇌 (의사결정) -->
<circle cx="14" cy="12" r="8" fill="none" stroke="#10B981" stroke-width="1.2" opacity="0.4"/>
<path d="M11 8 Q14 6 17 8" fill="none" stroke="#10B981" stroke-width="1" stroke-linecap="round"/>
<path d="M10 12 Q14 10 18 12" fill="none" stroke="#10B981" stroke-width="1" stroke-linecap="round"/>
<path d="M11 16 Q14 14 17 16" fill="none" stroke="#10B981" stroke-width="1" stroke-linecap="round"/>
<!-- 데이터 포인트 -->
<circle cx="8" cy="22" r="1.2" fill="#10B981" opacity="0.6"/>
<circle cx="14" cy="22" r="1.2" fill="#10B981" opacity="0.8"/>
<circle cx="20" cy="22" r="1.2" fill="#10B981"/>
<line x1="8" y1="22" x2="20" y2="22" stroke="#10B981" stroke-width="0.5" opacity="0.3"/>
</svg>
<p style="font-size: 7pt; font-weight: 700; color: #fff; white-space: nowrap;">데이터로 판단</p>
<p style="font-size: 5.5pt; color: rgba(255,255,255,0.35); margin-top: 2pt; line-height: 1.4;">감이 아닌 숫자로<br>KPI/팀 성과 비교</p>
</div>
<!-- 빠른 승인 -->
<div style="flex: 1; background: rgba(139,92,246,0.05); border: 1pt solid rgba(139,92,246,0.1); border-radius: 6pt; padding: 7pt 5pt; text-align: center;">
<svg viewBox="0 0 28 28" width="18pt" height="18pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 3pt;">
<!-- 체크마크 원 -->
<circle cx="14" cy="14" r="9" fill="none" stroke="#8B5CF6" stroke-width="1.2" opacity="0.4"/>
<path d="M9 14 L12.5 17.5 L19 10.5" fill="none" stroke="#8B5CF6" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<!-- 모바일 아이콘 -->
<rect x="20" y="19" width="5" height="8" rx="1" fill="none" stroke="#8B5CF6" stroke-width="0.8" opacity="0.5"/>
<circle cx="22.5" cy="25.5" r="0.5" fill="#8B5CF6" opacity="0.5"/>
</svg>
<p style="font-size: 7pt; font-weight: 700; color: #fff; white-space: nowrap;">모바일 승인</p>
<p style="font-size: 5.5pt; color: rgba(255,255,255,0.35); margin-top: 2pt; line-height: 1.4;">이동중에도 즉시<br>결재/승인 처리</p>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(139,92,246,0.15); margin-bottom: 9pt;"></div>
<!-- 대시보드 6대 기능 (SVG 아이콘 + 텍스트) -->
<div style="margin-bottom: 9pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #F59E0B; margin-bottom: 5pt;">대시보드 핵심 기능</p>
<div style="display: flex; flex-direction: column; gap: 2pt;">
<div style="display: flex; gap: 2pt;">
<!-- 01 실시간 KPI -->
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: rgba(14,165,233,0.04); border-radius: 4pt; padding: 4pt 6pt;">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<rect x="2" y="10" width="3" height="6" rx="0.5" fill="#0EA5E9" opacity="0.5"/>
<rect x="7" y="6" width="3" height="10" rx="0.5" fill="#0EA5E9" opacity="0.75"/>
<rect x="12" y="2" width="3" height="14" rx="0.5" fill="#0EA5E9"/>
</svg>
<p style="font-size: 6.5pt; color: rgba(255,255,255,0.55); white-space: nowrap;">실시간 <span style="color: #0EA5E9; font-weight: 700;">매출/수주 KPI</span></p>
</div>
<!-- 02 조직 트리 -->
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: rgba(16,185,129,0.04); border-radius: 4pt; padding: 4pt 6pt;">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="9" cy="4" r="2.5" fill="none" stroke="#10B981" stroke-width="1"/>
<line x1="9" y1="6.5" x2="9" y2="9" stroke="#10B981" stroke-width="0.8"/>
<line x1="4" y1="9" x2="14" y2="9" stroke="#10B981" stroke-width="0.8"/>
<circle cx="4" cy="12" r="2" fill="none" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<circle cx="9" cy="12" r="2" fill="none" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<circle cx="14" cy="12" r="2" fill="none" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<line x1="4" y1="9" x2="4" y2="10" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<line x1="9" y1="9" x2="9" y2="10" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<line x1="14" y1="9" x2="14" y2="10" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
</svg>
<p style="font-size: 6.5pt; color: rgba(255,255,255,0.55); white-space: nowrap;">조직 계층별 <span style="color: #10B981; font-weight: 700;">실적 트리</span></p>
</div>
</div>
<div style="display: flex; gap: 2pt;">
<!-- 03 수당 현황 -->
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: rgba(139,92,246,0.04); border-radius: 4pt; padding: 4pt 6pt;">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="9" cy="9" r="7" fill="none" stroke="#8B5CF6" stroke-width="1" opacity="0.3"/>
<text x="9" y="11.5" text-anchor="middle" fill="#8B5CF6" font-size="8" font-weight="800">&#8361;</text>
</svg>
<p style="font-size: 6.5pt; color: rgba(255,255,255,0.55); white-space: nowrap;">역할별 <span style="color: #8B5CF6; font-weight: 700;">수당 현황</span></p>
</div>
<!-- 04 승인 알림 -->
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: rgba(239,68,68,0.04); border-radius: 4pt; padding: 4pt 6pt;">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<path d="M9 3 C5 3 3 6 3 9 L3 12 L2 13 L16 13 L15 12 L15 9 C15 6 13 3 9 3 Z" fill="none" stroke="#EF4444" stroke-width="1" opacity="0.6"/>
<circle cx="13" cy="5" r="3" fill="#EF4444"/>
<text x="13" y="6.5" text-anchor="middle" fill="#fff" font-size="4" font-weight="700">5</text>
<path d="M7 14 Q9 16 11 14" fill="none" stroke="#EF4444" stroke-width="0.8" opacity="0.5"/>
</svg>
<p style="font-size: 6.5pt; color: rgba(255,255,255,0.55); white-space: nowrap;">미승인 <span style="color: #EF4444; font-weight: 700;">실시간 알림</span></p>
</div>
</div>
<div style="display: flex; gap: 2pt;">
<!-- 05 트렌드 -->
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: rgba(245,158,11,0.04); border-radius: 4pt; padding: 4pt 6pt;">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<path d="M3 14 L7 10 L10 12 L15 5" fill="none" stroke="#F59E0B" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M12 5 L15 5 L15 8" fill="none" stroke="#F59E0B" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="font-size: 6.5pt; color: rgba(255,255,255,0.55); white-space: nowrap;">기간별 <span style="color: #F59E0B; font-weight: 700;">트렌드 분석</span></p>
</div>
<!-- 06 시뮬레이터 -->
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: rgba(236,72,153,0.04); border-radius: 4pt; padding: 4pt 6pt;">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<rect x="2" y="3" width="14" height="12" rx="1.5" fill="none" stroke="#EC4899" stroke-width="1" opacity="0.5"/>
<line x1="5" y1="7" x2="13" y2="7" stroke="#EC4899" stroke-width="0.6" opacity="0.3"/>
<line x1="5" y1="9" x2="11" y2="9" stroke="#EC4899" stroke-width="0.6" opacity="0.3"/>
<line x1="5" y1="11" x2="9" y2="11" stroke="#EC4899" stroke-width="0.6" opacity="0.3"/>
<circle cx="14" cy="13" r="3.5" fill="#0B1929" stroke="#EC4899" stroke-width="0.8"/>
<path d="M13 13 L15 13 M14 12 L14 14" stroke="#EC4899" stroke-width="0.8" stroke-linecap="round"/>
</svg>
<p style="font-size: 6.5pt; color: rgba(255,255,255,0.55); white-space: nowrap;">수익 <span style="color: #EC4899; font-weight: 700;">시뮬레이터</span></p>
</div>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(255,255,255,0.06); margin-bottom: 9pt;"></div>
<!-- Before → After 인포그래픽 -->
<div style="display: flex; gap: 4pt; margin-bottom: 9pt;">
<!-- Before -->
<div style="flex: 5; background: rgba(239,68,68,0.04); border: 1pt solid rgba(239,68,68,0.08); border-radius: 5pt; padding: 5pt 6pt 12pt 6pt;">
<div style="display: flex; align-items: center; gap: 3pt; margin-bottom: 3pt;">
<svg viewBox="0 0 14 14" width="8pt" height="8pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="7" cy="7" r="5.5" fill="none" stroke="#EF4444" stroke-width="1"/>
<line x1="4.5" y1="4.5" x2="9.5" y2="9.5" stroke="#EF4444" stroke-width="1.2" stroke-linecap="round"/>
<line x1="9.5" y1="4.5" x2="4.5" y2="9.5" stroke="#EF4444" stroke-width="1.2" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #EF4444;">BEFORE</p>
</div>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.4);">매출? → 보고 대기 1~2일</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.4);">수주? → Excel 취합 반나절</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.4);">승인? → 서류 찾기 30분</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.4);">실적? → 각 팀장 개별 보고</p>
</div>
<!-- 화살표 -->
<div style="display: flex; align-items: center; flex-shrink: 0;">
<svg viewBox="0 0 20 20" width="14pt" height="14pt" xmlns="http://www.w3.org/2000/svg">
<path d="M4 10 L14 10" stroke="#0EA5E9" stroke-width="1.5" stroke-linecap="round"/>
<path d="M11 6 L15 10 L11 14" fill="none" stroke="#0EA5E9" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>
<!-- After -->
<div style="flex: 5; background: rgba(16,185,129,0.04); border: 1pt solid rgba(16,185,129,0.08); border-radius: 5pt; padding: 5pt 6pt 12pt 6pt;">
<div style="display: flex; align-items: center; gap: 3pt; margin-bottom: 3pt;">
<svg viewBox="0 0 14 14" width="8pt" height="8pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="7" cy="7" r="5.5" fill="none" stroke="#10B981" stroke-width="1"/>
<path d="M4.5 7 L6.5 9 L10 5" fill="none" stroke="#10B981" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #10B981;">AFTER (SAM)</p>
</div>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.4);">로그인 → <span style="color:#10B981;font-weight:600;">3초 전사 현황</span></p>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.4);">클릭 → <span style="color:#10B981;font-weight:600;">실시간 수주 데이터</span></p>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.4);">뱃지 → <span style="color:#10B981;font-weight:600;">즉시 승인 처리</span></p>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.4);">트리 → <span style="color:#10B981;font-weight:600;">전 조직 한눈에</span></p>
</div>
</div>
<!-- 기술 태그 -->
<div style="display: flex; gap: 3pt; margin-bottom: 6pt;">
<div style="display: flex; align-items: center; gap: 2pt; background: rgba(255,255,255,0.03); border-radius: 3pt; padding: 2pt 5pt;">
<svg viewBox="0 0 10 10" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="5" cy="5" r="3.5" fill="none" stroke="rgba(255,255,255,0.2)" stroke-width="0.8"/>
<path d="M5 2.5 L5 5 L7 6.5" fill="none" stroke="rgba(255,255,255,0.3)" stroke-width="0.6" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.3);">실시간 업데이트</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: rgba(255,255,255,0.03); border-radius: 3pt; padding: 2pt 5pt;">
<svg viewBox="0 0 10 10" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg">
<rect x="2.5" y="1" width="5" height="8" rx="1" fill="none" stroke="rgba(255,255,255,0.2)" stroke-width="0.8"/>
<circle cx="5" cy="7.5" r="0.5" fill="rgba(255,255,255,0.3)"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.3);">PC + 모바일</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: rgba(255,255,255,0.03); border-radius: 3pt; padding: 2pt 5pt;">
<svg viewBox="0 0 10 10" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg">
<rect x="1.5" y="2" width="7" height="6" rx="1" fill="none" stroke="rgba(255,255,255,0.2)" stroke-width="0.8"/>
<circle cx="5" cy="5" r="1.5" fill="none" stroke="rgba(255,255,255,0.3)" stroke-width="0.6"/>
<line x1="6" y1="3.5" x2="7.5" y2="2" stroke="rgba(255,255,255,0.2)" stroke-width="0.6"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.3);">역할별 권한</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: rgba(255,255,255,0.03); border-radius: 3pt; padding: 2pt 5pt;">
<svg viewBox="0 0 10 10" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg">
<path d="M5 1 Q8 1 8 4 L8 5 Q8 8 5 8 Q2 8 2 5 L2 4 Q2 1 5 1 Z" fill="none" stroke="rgba(255,255,255,0.2)" stroke-width="0.8"/>
<line x1="5" y1="4" x2="5" y2="6" stroke="rgba(255,255,255,0.3)" stroke-width="0.6" stroke-linecap="round"/>
<circle cx="5" cy="3.5" r="0.5" fill="rgba(255,255,255,0.3)"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.3);">데이터 암호화</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: rgba(255,255,255,0.03); border-radius: 3pt; padding: 2pt 5pt;">
<svg viewBox="0 0 10 10" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg">
<path d="M2 7 Q5 3 8 7" fill="none" stroke="rgba(255,255,255,0.2)" stroke-width="0.8"/>
<path d="M3.5 7 Q5 5 6.5 7" fill="none" stroke="rgba(255,255,255,0.25)" stroke-width="0.8"/>
<circle cx="5" cy="7.5" r="0.8" fill="rgba(255,255,255,0.3)"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.3);">클라우드</p>
</div>
</div>
<!-- 푸터 -->
<div style="margin-top: auto; border-top: 1pt solid rgba(255,255,255,0.06); padding-top: 7pt;">
<div style="display: flex; justify-content: space-between; align-items: flex-end;">
<div>
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: rgba(255,255,255,0.6);">SAM</p>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.2); margin-top: 2pt;">www.sam.it.kr</p>
</div>
<div style="text-align: right;">
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,371 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
width: 405pt; height: 720pt;
font-family: 'Pretendard', sans-serif;
background: #0B1929;
padding: 20pt 22pt 12pt 22pt;
display: flex; flex-direction: column;
}
</style>
</head>
<body>
<!-- 헤더 -->
<div style="display: flex; align-items: center; gap: 8pt; margin-bottom: 10pt;">
<img src="/home/aweso/sam/docs/assets/bi/sam_bi_white.png" style="height: 18pt;">
<div style="flex: 1;"></div>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.2);">FEATURES &amp; PRICING</p>
</div>
<!-- 대시보드 7대 기능 (SVG 아이콘) -->
<div style="margin-bottom: 9pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #0EA5E9; margin-bottom: 6pt;">대시보드 핵심 기능</p>
<div style="display: flex; flex-direction: column; gap: 2pt;">
<!-- 01 -->
<div style="display: flex; align-items: center; gap: 5pt; background: rgba(14,165,233,0.05); border-radius: 4pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<rect x="2" y="11" width="4" height="6" rx="0.5" fill="#0EA5E9" opacity="0.45"/>
<rect x="8" y="7" width="4" height="10" rx="0.5" fill="#0EA5E9" opacity="0.7"/>
<rect x="14" y="3" width="4" height="14" rx="0.5" fill="#0EA5E9"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #fff; white-space: nowrap;">실시간 KPI 카드</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.35);">매출, 수주, 납기율, 승인 대기</p>
</div>
<!-- 02 -->
<div style="display: flex; align-items: center; gap: 5pt; background: rgba(16,185,129,0.05); border-radius: 4pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="10" cy="4.5" r="2.5" fill="none" stroke="#10B981" stroke-width="1.1"/>
<line x1="10" y1="7" x2="10" y2="9.5" stroke="#10B981" stroke-width="0.8"/>
<line x1="5" y1="9.5" x2="15" y2="9.5" stroke="#10B981" stroke-width="0.8"/>
<circle cx="5" cy="13" r="2" fill="none" stroke="#10B981" stroke-width="0.9" opacity="0.6"/>
<circle cx="10" cy="13" r="2" fill="none" stroke="#10B981" stroke-width="0.9" opacity="0.6"/>
<circle cx="15" cy="13" r="2" fill="none" stroke="#10B981" stroke-width="0.9" opacity="0.6"/>
<line x1="5" y1="9.5" x2="5" y2="11" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<line x1="10" y1="9.5" x2="10" y2="11" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<line x1="15" y1="9.5" x2="15" y2="11" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<circle cx="3" cy="17" r="1.3" fill="none" stroke="#10B981" stroke-width="0.6" opacity="0.4"/>
<circle cx="7" cy="17" r="1.3" fill="none" stroke="#10B981" stroke-width="0.6" opacity="0.4"/>
<line x1="5" y1="15" x2="3" y2="15.7" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
<line x1="5" y1="15" x2="7" y2="15.7" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #fff; white-space: nowrap;">조직 실적 트리</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.35);">계층별 팀/개인 실적 펼쳐보기</p>
</div>
<!-- 03 -->
<div style="display: flex; align-items: center; gap: 5pt; background: rgba(139,92,246,0.05); border-radius: 4pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="10" cy="10" r="7.5" fill="none" stroke="#8B5CF6" stroke-width="1" opacity="0.3"/>
<text x="10" y="12.5" text-anchor="middle" fill="#8B5CF6" font-size="9" font-weight="800">&#8361;</text>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #fff; white-space: nowrap;">역할별 수당 현황</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.35);">판매자/관리자/협업자 배분 확인</p>
</div>
<!-- 04 -->
<div style="display: flex; align-items: center; gap: 5pt; background: rgba(239,68,68,0.05); border-radius: 4pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M10 3 C6 3 3 6 3 9.5 L3 13 L1.5 14.5 L18.5 14.5 L17 13 L17 9.5 C17 6 14 3 10 3 Z" fill="none" stroke="#EF4444" stroke-width="1" opacity="0.5"/>
<circle cx="15" cy="5" r="3.5" fill="#EF4444"/>
<text x="15" y="7" text-anchor="middle" fill="#fff" font-size="4.5" font-weight="800">!</text>
<path d="M7.5 15.5 Q10 18 12.5 15.5" fill="none" stroke="#EF4444" stroke-width="0.8" opacity="0.4"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #fff; white-space: nowrap;">승인 대기 알림</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.35);">가입/지급 미처리 빨간 뱃지</p>
</div>
<!-- 05 -->
<div style="display: flex; align-items: center; gap: 5pt; background: rgba(245,158,11,0.05); border-radius: 4pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M3 15 L7 11 L10 13 L16 5" fill="none" stroke="#F59E0B" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M13 5 L16 5 L16 8" fill="none" stroke="#F59E0B" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #fff; white-space: nowrap;">기간별 트렌드</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.35);">당월/분기/연간 추이 차트</p>
</div>
<!-- 06 -->
<div style="display: flex; align-items: center; gap: 5pt; background: rgba(236,72,153,0.05); border-radius: 4pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<rect x="2" y="3" width="16" height="14" rx="2" fill="none" stroke="#EC4899" stroke-width="1" opacity="0.4"/>
<line x1="5" y1="7.5" x2="15" y2="7.5" stroke="#EC4899" stroke-width="0.6" opacity="0.3"/>
<line x1="5" y1="10" x2="12" y2="10" stroke="#EC4899" stroke-width="0.6" opacity="0.3"/>
<line x1="5" y1="12.5" x2="9" y2="12.5" stroke="#EC4899" stroke-width="0.6" opacity="0.3"/>
<circle cx="15.5" cy="14.5" r="3.5" fill="#0B1929" stroke="#EC4899" stroke-width="0.9"/>
<path d="M14.5 14.5 L16.5 14.5 M15.5 13.5 L15.5 15.5" stroke="#EC4899" stroke-width="0.8" stroke-linecap="round"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #fff; white-space: nowrap;">수익 시뮬레이터</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.35);">가상 시나리오 수당/마진 계산</p>
</div>
<!-- 07 -->
<div style="display: flex; align-items: center; gap: 5pt; background: rgba(14,165,233,0.05); border-radius: 4pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<rect x="5" y="2" width="10" height="16" rx="2" fill="none" stroke="#0EA5E9" stroke-width="1" opacity="0.5"/>
<circle cx="10" cy="16" r="1" fill="#0EA5E9" opacity="0.5"/>
<rect x="7" y="5" width="6" height="8" rx="0.5" fill="rgba(14,165,233,0.15)"/>
<rect x="8" y="6" width="4" height="1.5" rx="0.3" fill="#0EA5E9" opacity="0.4"/>
<rect x="8" y="8.5" width="4" height="1.5" rx="0.3" fill="#10B981" opacity="0.4"/>
<rect x="8" y="11" width="4" height="1.5" rx="0.3" fill="#8B5CF6" opacity="0.4"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #fff; white-space: nowrap;">모바일 대응</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.35);">스마트폰으로 KPI 확인/승인</p>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(14,165,233,0.15); margin-bottom: 8pt;"></div>
<!-- 역할별 맞춤 화면 (SVG 아이콘) -->
<div style="margin-bottom: 9pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #10B981; margin-bottom: 5pt;">역할별 맞춤 화면</p>
<div style="display: flex; gap: 4pt;">
<!-- CEO -->
<div style="flex: 1; background: rgba(14,165,233,0.06); border: 1pt solid rgba(14,165,233,0.12); border-radius: 5pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="12" cy="8" r="4" fill="none" stroke="#0EA5E9" stroke-width="1.2"/>
<path d="M4 20 Q4 14 12 14 Q20 14 20 20" fill="none" stroke="#0EA5E9" stroke-width="1.2"/>
<path d="M8 4 L12 1 L16 4" fill="none" stroke="#F59E0B" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" opacity="0.7"/>
</svg>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 800; color: #0EA5E9;">CEO</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: rgba(255,255,255,0.55); margin-top: 1pt;">전사 KPI 총괄</p>
</div>
<!-- 관리자 -->
<div style="flex: 1; background: rgba(16,185,129,0.06); border: 1pt solid rgba(16,185,129,0.12); border-radius: 5pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="8" cy="8" r="3" fill="none" stroke="#10B981" stroke-width="1"/>
<circle cx="16" cy="8" r="3" fill="none" stroke="#10B981" stroke-width="1" opacity="0.6"/>
<path d="M2 18 Q2 13 8 13 Q14 13 14 18" fill="none" stroke="#10B981" stroke-width="1"/>
<path d="M12 18 Q12 13 16 13 Q22 13 22 18" fill="none" stroke="#10B981" stroke-width="1" opacity="0.5"/>
</svg>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 800; color: #10B981;">관리자</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: rgba(255,255,255,0.55); margin-top: 1pt;">팀 실적 관리</p>
</div>
<!-- 운영자 -->
<div style="flex: 1; background: rgba(245,158,11,0.06); border: 1pt solid rgba(245,158,11,0.12); border-radius: 5pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="12" cy="12" r="8" fill="none" stroke="#F59E0B" stroke-width="1" opacity="0.4"/>
<circle cx="12" cy="12" r="3" fill="none" stroke="#F59E0B" stroke-width="1.2"/>
<line x1="12" y1="4" x2="12" y2="6" stroke="#F59E0B" stroke-width="1" stroke-linecap="round"/>
<line x1="12" y1="18" x2="12" y2="20" stroke="#F59E0B" stroke-width="1" stroke-linecap="round"/>
<line x1="4" y1="12" x2="6" y2="12" stroke="#F59E0B" stroke-width="1" stroke-linecap="round"/>
<line x1="18" y1="12" x2="20" y2="12" stroke="#F59E0B" stroke-width="1" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 800; color: #F59E0B;">운영자</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: rgba(255,255,255,0.55); margin-top: 1pt;">인력/승인 관리</p>
</div>
<!-- 영업자 -->
<div style="flex: 1; background: rgba(139,92,246,0.06); border: 1pt solid rgba(139,92,246,0.12); border-radius: 5pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<rect x="4" y="3" width="16" height="18" rx="2" fill="none" stroke="#8B5CF6" stroke-width="1" opacity="0.5"/>
<line x1="7" y1="8" x2="17" y2="8" stroke="#8B5CF6" stroke-width="0.7" opacity="0.4"/>
<line x1="7" y1="11" x2="14" y2="11" stroke="#8B5CF6" stroke-width="0.7" opacity="0.4"/>
<line x1="7" y1="14" x2="12" y2="14" stroke="#8B5CF6" stroke-width="0.7" opacity="0.4"/>
<path d="M14 16 L16 18 L20 13" fill="none" stroke="#8B5CF6" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 800; color: #8B5CF6;">영업자</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: rgba(255,255,255,0.55); margin-top: 1pt;">내 실적 조회</p>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(139,92,246,0.15); margin-bottom: 8pt;"></div>
<!-- SAM 통합 플랫폼 연결 -->
<div style="margin-bottom: 9pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #8B5CF6; margin-bottom: 5pt;">대시보드 + SAM ERP/MES 통합</p>
<div style="display: flex; gap: 3pt;">
<div style="flex: 1; background: rgba(255,255,255,0.03); border-radius: 4pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<rect x="2" y="2" width="12" height="12" rx="1.5" fill="none" stroke="rgba(255,255,255,0.2)" stroke-width="0.8"/>
<line x1="5" y1="6" x2="11" y2="6" stroke="rgba(255,255,255,0.15)" stroke-width="0.5"/>
<line x1="5" y1="8" x2="9" y2="8" stroke="rgba(255,255,255,0.15)" stroke-width="0.5"/>
<line x1="5" y1="10" x2="11" y2="10" stroke="rgba(255,255,255,0.15)" stroke-width="0.5"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: rgba(255,255,255,0.45);">견적/수주</p>
</div>
<div style="flex: 1; background: rgba(255,255,255,0.03); border-radius: 4pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<circle cx="8" cy="8" r="5" fill="none" stroke="rgba(255,255,255,0.2)" stroke-width="0.8"/>
<circle cx="8" cy="8" r="2" fill="none" stroke="rgba(255,255,255,0.15)" stroke-width="0.5"/>
<line x1="8" y1="3" x2="8" y2="4.5" stroke="rgba(255,255,255,0.15)" stroke-width="0.5"/>
<line x1="13" y1="8" x2="11.5" y2="8" stroke="rgba(255,255,255,0.15)" stroke-width="0.5"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: rgba(255,255,255,0.45);">생산 MES</p>
</div>
<div style="flex: 1; background: rgba(255,255,255,0.03); border-radius: 4pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<path d="M5 3 L11 3 L13 6 L8 14 L3 6 Z" fill="none" stroke="rgba(255,255,255,0.2)" stroke-width="0.8"/>
<path d="M3 6 L13 6" stroke="rgba(255,255,255,0.12)" stroke-width="0.5"/>
<path d="M8 6 L8 14" stroke="rgba(255,255,255,0.12)" stroke-width="0.5"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: rgba(255,255,255,0.45);">품질/검사</p>
</div>
<div style="flex: 1; background: rgba(255,255,255,0.03); border-radius: 4pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<rect x="3" y="4" width="10" height="9" rx="1" fill="none" stroke="rgba(255,255,255,0.2)" stroke-width="0.8"/>
<line x1="3" y1="7" x2="13" y2="7" stroke="rgba(255,255,255,0.12)" stroke-width="0.5"/>
<line x1="8" y1="7" x2="8" y2="13" stroke="rgba(255,255,255,0.12)" stroke-width="0.5"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: rgba(255,255,255,0.45);">재고/자재</p>
</div>
<div style="flex: 1; background: rgba(255,255,255,0.03); border-radius: 4pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<circle cx="8" cy="6" r="3" fill="none" stroke="rgba(255,255,255,0.2)" stroke-width="0.8"/>
<path d="M3 14 Q3 10 8 10 Q13 10 13 14" fill="none" stroke="rgba(255,255,255,0.2)" stroke-width="0.8"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: rgba(255,255,255,0.45);">인사/회계</p>
</div>
</div>
<p style="font-size: 5.5pt; color: rgba(255,255,255,0.25); margin-top: 3pt; text-align: center;">대시보드의 모든 데이터는 SAM ERP/MES 실시간 데이터 기반</p>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(255,255,255,0.05); margin-bottom: 8pt;"></div>
<!-- 투자 비용 -->
<div style="margin-bottom: 9pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #F59E0B; margin-bottom: 5pt;">투자 비용</p>
<div style="display: flex; gap: 5pt;">
<!-- 기본 패키지 -->
<div style="flex: 1;">
<div style="background: rgba(14,165,233,0.07); border: 1pt solid rgba(14,165,233,0.14); border-radius: 6pt; padding: 7pt 8pt; margin-bottom: 3pt;">
<div style="display: flex; align-items: center; gap: 4pt; margin-bottom: 3pt;">
<svg viewBox="0 0 14 14" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg">
<rect x="1" y="1" width="12" height="12" rx="2" fill="none" stroke="#0EA5E9" stroke-width="1" opacity="0.5"/>
<path d="M4 7 L6 9 L10 5" fill="none" stroke="#0EA5E9" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: #0EA5E9;">대시보드 포함 기본 패키지</p>
</div>
<p style="white-space: nowrap; font-size: 13pt; font-weight: 800; color: #ffffff;">2,000만원</p>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.35);">+ 월 50만원 (유지보수)</p>
</div>
<div style="background: rgba(255,255,255,0.02); border-radius: 3pt; padding: 3pt 5pt;">
<p style="font-size: 5.5pt; color: rgba(255,255,255,0.3); line-height: 1.4;">CEO 대시보드 + 견적/수주 + 생산<br>인사/회계 무료 포함</p>
</div>
</div>
<!-- 추가 옵션 -->
<div style="flex: 1;">
<div style="background: rgba(245,158,11,0.07); border: 1pt solid rgba(245,158,11,0.14); border-radius: 6pt; padding: 7pt 8pt;">
<div style="display: flex; align-items: center; gap: 4pt; margin-bottom: 4pt;">
<svg viewBox="0 0 14 14" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="7" cy="7" r="5.5" fill="none" stroke="#F59E0B" stroke-width="1" opacity="0.5"/>
<line x1="7" y1="4.5" x2="7" y2="9.5" stroke="#F59E0B" stroke-width="1" stroke-linecap="round"/>
<line x1="4.5" y1="7" x2="9.5" y2="7" stroke="#F59E0B" stroke-width="1" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: #F59E0B;">추가 옵션 (선택)</p>
</div>
<div style="display: flex; flex-direction: column; gap: 3pt;">
<div style="display: flex; justify-content: space-between;">
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.45);">생산공정 관리</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #F59E0B;">+500만원</p>
</div>
<div style="display: flex; justify-content: space-between;">
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.45);">품질관리(인정검사)</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #F59E0B;">+2,000만원</p>
</div>
<div style="display: flex; justify-content: space-between;">
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.45);">AI 견적 자동 생성</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #F59E0B;">월 10~20만원</p>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(255,255,255,0.05); margin-bottom: 8pt;"></div>
<!-- 도입 프로세스 (SVG 화살표 연결) -->
<div style="margin-bottom: 6pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #10B981; margin-bottom: 5pt;">도입 프로세스</p>
<div style="display: flex; gap: 2pt; align-items: center;">
<div style="flex: 1; border-radius: 5pt; padding: 4pt 2pt; text-align: center; background: rgba(14,165,233,0.08); border: 1pt solid rgba(14,165,233,0.15);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<circle cx="8" cy="5" r="3" fill="none" stroke="#0EA5E9" stroke-width="0.8"/>
<path d="M4 14 Q4 10 8 10 Q12 10 12 14" fill="none" stroke="#0EA5E9" stroke-width="0.8"/>
<path d="M13 5 L15 5 M14 4 L14 6" stroke="#0EA5E9" stroke-width="0.6" stroke-linecap="round" opacity="0.6"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.4);">1~2주</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: rgba(255,255,255,0.6);">현장 인터뷰</p>
</div>
<svg viewBox="0 0 8 8" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M2 4 L6 4 M5 2.5 L6.5 4 L5 5.5" fill="none" stroke="rgba(255,255,255,0.15)" stroke-width="0.8" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div style="flex: 1; border-radius: 5pt; padding: 4pt 2pt; text-align: center; background: rgba(16,185,129,0.08); border: 1pt solid rgba(16,185,129,0.15);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<rect x="3" y="2" width="10" height="12" rx="1.5" fill="none" stroke="#10B981" stroke-width="0.8"/>
<line x1="6" y1="5" x2="10" y2="5" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
<line x1="6" y1="7" x2="10" y2="7" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
<line x1="6" y1="9" x2="10" y2="9" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
<line x1="6" y1="11" x2="9" y2="11" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.4);">2~4주</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: rgba(255,255,255,0.6);">맞춤 개발</p>
</div>
<svg viewBox="0 0 8 8" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M2 4 L6 4 M5 2.5 L6.5 4 L5 5.5" fill="none" stroke="rgba(255,255,255,0.15)" stroke-width="0.8" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div style="flex: 1; border-radius: 5pt; padding: 4pt 2pt; text-align: center; background: rgba(139,92,246,0.08); border: 1pt solid rgba(139,92,246,0.15);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<rect x="2" y="3" width="5" height="10" rx="1" fill="none" stroke="#8B5CF6" stroke-width="0.8" opacity="0.5"/>
<rect x="9" y="3" width="5" height="10" rx="1" fill="none" stroke="#8B5CF6" stroke-width="0.8"/>
<path d="M7 7 L9 8 M7 8 L9 7" stroke="#8B5CF6" stroke-width="0.5" opacity="0.4"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.4);">1~2주</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: rgba(255,255,255,0.6);">데이터 이관</p>
</div>
<svg viewBox="0 0 8 8" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M2 4 L6 4 M5 2.5 L6.5 4 L5 5.5" fill="none" stroke="rgba(255,255,255,0.15)" stroke-width="0.8" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div style="flex: 1; border-radius: 5pt; padding: 4pt 2pt; text-align: center; background: rgba(245,158,11,0.08); border: 1pt solid rgba(245,158,11,0.15);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<path d="M8 2 L14 8 L8 14 L2 8 Z" fill="none" stroke="#F59E0B" stroke-width="0.8"/>
<path d="M5.5 8 L7 9.5 L10.5 6" fill="none" stroke="#F59E0B" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.4);">1~2주</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: rgba(255,255,255,0.6);">교육/안정화</p>
</div>
</div>
</div>
<!-- CTA 푸터 -->
<div style="margin-top: auto; background: rgba(14,165,233,0.06); border: 1.5pt solid rgba(14,165,233,0.15); border-radius: 7pt; padding: 9pt 12pt;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<div style="display: flex; align-items: center; gap: 6pt;">
<svg viewBox="0 0 22 22" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="11" cy="11" r="9" fill="none" stroke="#0EA5E9" stroke-width="1.2" opacity="0.5"/>
<path d="M11 6 L11 11 L15 13" fill="none" stroke="#0EA5E9" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.35); margin-top: 1pt;">대표님 전용 대시보드를 직접 체험</p>
</div>
</div>
<div style="text-align: right;">
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.3); margin-top: 1pt;">www.sam.it.kr</p>
</div>
</div>
</div>
<!-- 회사명 -->
<div style="margin-top: 4pt; text-align: center;">
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.15);">SAM — Smart Automation Management</p>
</div>
</body>
</html>

View File

@@ -0,0 +1,262 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
width: 405pt; height: 720pt;
font-family: 'Pretendard', sans-serif;
background: #0B1929;
padding: 26pt 22pt 16pt 22pt;
display: flex; flex-direction: column;
}
</style>
</head>
<body>
<!-- 헤더 -->
<div style="display: flex; align-items: center; gap: 8pt; margin-bottom: 16pt;">
<img src="/home/aweso/sam/docs/assets/bi/sam_bi_white.png" style="height: 22pt;">
<div style="flex: 1;"></div>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.2);">CEO DASHBOARD v3</p>
</div>
<!-- 히어로 섹션 -->
<div style="display: flex; align-items: center; gap: 14pt; margin-bottom: 18pt;">
<div style="flex: 1;">
<p style="white-space: nowrap; font-size: 8pt; font-weight: 600; color: #0EA5E9; letter-spacing: 0.1em; margin-bottom: 5pt;">EXECUTIVE DASHBOARD</p>
<h1 style="font-size: 19pt; font-weight: 800; color: #ffffff; line-height: 1.35; margin-bottom: 6pt;">대표님, 우리 회사<br>지금 어떤 상태인가요?</h1>
<p style="font-size: 8pt; color: rgba(255,255,255,0.4); line-height: 1.55;">매출, 수주, 조직 실적, 승인 대기<br>더 이상 보고를 기다리지 마세요.</p>
</div>
<!-- 히어로 아이콘 -->
<div style="flex-shrink: 0; width: 80pt; height: 80pt;">
<svg viewBox="0 0 90 90" width="80pt" height="80pt" xmlns="http://www.w3.org/2000/svg">
<!-- 모니터 외곽 -->
<rect x="8" y="10" width="74" height="50" rx="5" fill="none" stroke="#0EA5E9" stroke-width="1.5" opacity="0.5"/>
<rect x="12" y="14" width="66" height="42" rx="3" fill="#111D2E"/>
<!-- KPI 미니 카드들 -->
<rect x="15" y="17" width="14" height="10" rx="1.5" fill="rgba(14,165,233,0.2)"/>
<rect x="31" y="17" width="14" height="10" rx="1.5" fill="rgba(16,185,129,0.2)"/>
<rect x="47" y="17" width="14" height="10" rx="1.5" fill="rgba(139,92,246,0.2)"/>
<rect x="63" y="17" width="12" height="10" rx="1.5" fill="rgba(239,68,68,0.2)"/>
<!-- 미니 차트 -->
<path d="M16 45 L22 40 L28 42 L34 36 L40 33 L46 30 L52 32 L58 26 L64 28 L70 22 L75 25" fill="none" stroke="#0EA5E9" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" opacity="0.8"/>
<path d="M16 45 L22 40 L28 42 L34 36 L40 33 L46 30 L52 32 L58 26 L64 28 L70 22 L75 25 L75 50 L16 50 Z" fill="url(#heroGrad)" opacity="0.3"/>
<!-- 도넛 -->
<circle cx="25" cy="50" r="0" fill="none"/>
<!-- 모니터 받침 -->
<rect x="36" y="60" width="18" height="3" rx="1" fill="#0EA5E9" opacity="0.3"/>
<rect x="32" y="63" width="26" height="2" rx="1" fill="#0EA5E9" opacity="0.2"/>
<!-- 알림 뱃지 -->
<circle cx="73" cy="14" r="5" fill="#EF4444" opacity="0.9"/>
<text x="73" y="16.5" text-anchor="middle" fill="#fff" font-size="6" font-weight="800">5</text>
<!-- 와이파이 -->
<path d="M66 72 Q72 66 78 72" fill="none" stroke="#10B981" stroke-width="1" opacity="0.4"/>
<path d="M63 76 Q72 68 81 76" fill="none" stroke="#10B981" stroke-width="1" opacity="0.25"/>
<circle cx="72" cy="76" r="1.5" fill="#10B981" opacity="0.5"/>
<defs>
<linearGradient id="heroGrad" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#0EA5E9" stop-opacity="0.4"/>
<stop offset="100%" stop-color="#0EA5E9" stop-opacity="0"/>
</linearGradient>
</defs>
</svg>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(14,165,233,0.15); margin-bottom: 16pt;"></div>
<!-- 고민 섹션 (타임라인 인포그래픽) -->
<div style="margin-bottom: 16pt;">
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: #EF4444; margin-bottom: 8pt;">대표님의 하루</p>
<div style="display: flex; flex-direction: column; gap: 4pt;">
<!-- AM 9:00 -->
<div style="display: flex; align-items: center; gap: 6pt;">
<svg viewBox="0 0 26 26" width="18pt" height="18pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="13" cy="13" r="11" fill="rgba(239,68,68,0.08)" stroke="rgba(239,68,68,0.2)" stroke-width="1"/>
<circle cx="13" cy="13" r="8" fill="none" stroke="#EF4444" stroke-width="0.8" opacity="0.4"/>
<path d="M13 7 L13 13 L17 15" fill="none" stroke="#EF4444" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
<text x="13" y="22" text-anchor="middle" fill="#EF4444" font-size="3.5" font-weight="600" opacity="0.7">9AM</text>
</svg>
<div style="flex: 1; background: rgba(239,68,68,0.04); border: 1pt solid rgba(239,68,68,0.08); border-radius: 4pt; padding: 6pt 8pt;">
<p style="font-size: 7.5pt; color: rgba(255,255,255,0.55); white-space: nowrap;">"어제 매출 얼마야?" → <span style="color: #EF4444; font-weight: 600;">팀장 보고 대기중...</span></p>
</div>
</div>
<!-- PM 2:00 -->
<div style="display: flex; align-items: center; gap: 6pt;">
<svg viewBox="0 0 26 26" width="18pt" height="18pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="13" cy="13" r="11" fill="rgba(239,68,68,0.08)" stroke="rgba(239,68,68,0.2)" stroke-width="1"/>
<circle cx="13" cy="13" r="8" fill="none" stroke="#EF4444" stroke-width="0.8" opacity="0.4"/>
<path d="M13 7 L13 13 L9 16" fill="none" stroke="#EF4444" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
<text x="13" y="22" text-anchor="middle" fill="#EF4444" font-size="3.5" font-weight="600" opacity="0.7">2PM</text>
</svg>
<div style="flex: 1; background: rgba(239,68,68,0.04); border: 1pt solid rgba(239,68,68,0.08); border-radius: 4pt; padding: 6pt 8pt;">
<p style="font-size: 7.5pt; color: rgba(255,255,255,0.55); white-space: nowrap;">"수주 밀린 거 없어?" → <span style="color: #EF4444; font-weight: 600;">Excel 취합중...</span></p>
</div>
</div>
<!-- PM 5:00 -->
<div style="display: flex; align-items: center; gap: 6pt;">
<svg viewBox="0 0 26 26" width="18pt" height="18pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="13" cy="13" r="11" fill="rgba(239,68,68,0.08)" stroke="rgba(239,68,68,0.2)" stroke-width="1"/>
<circle cx="13" cy="13" r="8" fill="none" stroke="#EF4444" stroke-width="0.8" opacity="0.4"/>
<path d="M13 7 L13 13 L8 12" fill="none" stroke="#EF4444" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
<text x="13" y="22" text-anchor="middle" fill="#EF4444" font-size="3.5" font-weight="600" opacity="0.7">5PM</text>
</svg>
<div style="flex: 1; background: rgba(239,68,68,0.04); border: 1pt solid rgba(239,68,68,0.08); border-radius: 4pt; padding: 6pt 8pt;">
<p style="font-size: 7.5pt; color: rgba(255,255,255,0.55); white-space: nowrap;">"결재할 것 정리해줘" → <span style="color: #EF4444; font-weight: 600;">서류 찾는중...</span></p>
</div>
</div>
</div>
</div>
<!-- 전환 화살표 -->
<div style="text-align: center; margin-bottom: 12pt;">
<svg viewBox="0 0 40 24" width="40pt" height="16pt" xmlns="http://www.w3.org/2000/svg">
<path d="M10 6 L20 18 L30 6" fill="none" stroke="#0EA5E9" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" opacity="0.6"/>
</svg>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: #0EA5E9;">SAM 도입 후</p>
</div>
<!-- 대시보드 Mock UI -->
<div style="background: #111D2E; border: 1.5pt solid rgba(14,165,233,0.15); border-radius: 7pt; padding: 9pt; margin-bottom: 16pt;">
<!-- 타이틀바 -->
<div style="display: flex; align-items: center; gap: 3pt; margin-bottom: 6pt;">
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #EF4444;"></div>
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #F59E0B;"></div>
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #10B981;"></div>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.25); margin-left: 5pt;">SAM CEO Dashboard ― 로그인 후 3초</p>
</div>
<!-- KPI 카드 (SVG 아이콘 포함) -->
<div style="display: flex; gap: 3pt; margin-bottom: 5pt;">
<div style="flex: 1; background: rgba(14,165,233,0.1); border: 1pt solid rgba(14,165,233,0.18); border-radius: 4pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<rect x="2" y="9" width="3" height="5" rx="0.5" fill="#0EA5E9" opacity="0.4"/>
<rect x="6" y="5" width="3" height="9" rx="0.5" fill="#0EA5E9" opacity="0.7"/>
<rect x="10" y="2" width="3" height="12" rx="0.5" fill="#0EA5E9"/>
</svg>
<p style="white-space: nowrap; font-size: 11pt; font-weight: 800; color: #fff;">5.2억</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">&#9650; 15.3%</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #0EA5E9; font-weight: 600; margin-top: 1pt;">월 매출</p>
</div>
<div style="flex: 1; background: rgba(16,185,129,0.1); border: 1pt solid rgba(16,185,129,0.18); border-radius: 4pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<rect x="2" y="2" width="12" height="12" rx="2" fill="none" stroke="#10B981" stroke-width="1" opacity="0.5"/>
<path d="M5 8 L7 10 L11 6" fill="none" stroke="#10B981" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 11pt; font-weight: 800; color: #fff;">127건</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">&#9650; 8건</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #10B981; font-weight: 600; margin-top: 1pt;">누적 수주</p>
</div>
<div style="flex: 1; background: rgba(139,92,246,0.1); border: 1pt solid rgba(139,92,246,0.18); border-radius: 4pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<circle cx="8" cy="8" r="5.5" fill="none" stroke="#8B5CF6" stroke-width="1" opacity="0.3"/>
<circle cx="8" cy="8" r="5.5" fill="none" stroke="#8B5CF6" stroke-width="1.5" stroke-dasharray="32 35" stroke-dashoffset="-9" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 11pt; font-weight: 800; color: #fff;">96%</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">목표 달성</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #8B5CF6; font-weight: 600; margin-top: 1pt;">납기 준수율</p>
</div>
<div style="flex: 1; background: rgba(239,68,68,0.12); border: 1pt solid rgba(239,68,68,0.22); border-radius: 4pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<path d="M8 2 L14 12 L2 12 Z" fill="none" stroke="#EF4444" stroke-width="1" stroke-linejoin="round"/>
<line x1="8" y1="6" x2="8" y2="9" stroke="#EF4444" stroke-width="1.2" stroke-linecap="round"/>
<circle cx="8" cy="10.5" r="0.6" fill="#EF4444"/>
</svg>
<p style="white-space: nowrap; font-size: 11pt; font-weight: 800; color: #EF4444;">5건</p>
<p style="white-space: nowrap; font-size: 5pt; color: #EF4444; font-weight: 700;">즉시 처리</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #EF4444; font-weight: 600; margin-top: 1pt;">승인 대기</p>
</div>
</div>
<!-- 라인 차트 + 도넛 -->
<div style="display: flex; gap: 4pt;">
<div style="flex: 3; background: rgba(255,255,255,0.02); border-radius: 3pt; padding: 4pt 5pt;">
<p style="white-space: nowrap; font-size: 5pt; color: rgba(255,255,255,0.3); margin-bottom: 2pt;">월별 매출 추이</p>
<svg viewBox="0 0 150 35" width="100%" height="26pt" xmlns="http://www.w3.org/2000/svg">
<line x1="0" y1="10" x2="150" y2="10" stroke="rgba(255,255,255,0.03)" stroke-width="0.5"/>
<line x1="0" y1="20" x2="150" y2="20" stroke="rgba(255,255,255,0.03)" stroke-width="0.5"/>
<path d="M5 30 L18 24 L31 26 L44 20 L57 16 L70 12 L83 14 L96 8 L109 10 L122 4 L135 7 L135 33 L5 33 Z" fill="url(#fGrad)" opacity="0.35"/>
<path d="M5 30 L18 24 L31 26 L44 20 L57 16 L70 12 L83 14 L96 8 L109 10 L122 4 L135 7" fill="none" stroke="#0EA5E9" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="122" cy="4" r="2" fill="#0EA5E9"/>
<defs>
<linearGradient id="fGrad" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#0EA5E9" stop-opacity="0.25"/>
<stop offset="100%" stop-color="#0EA5E9" stop-opacity="0"/>
</linearGradient>
</defs>
</svg>
</div>
<div style="flex: 2; background: rgba(255,255,255,0.02); border-radius: 3pt; padding: 4pt 5pt; display: flex; align-items: center; gap: 4pt;">
<svg viewBox="0 0 40 40" width="30pt" height="30pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="20" cy="20" r="14" fill="none" stroke="rgba(255,255,255,0.05)" stroke-width="4.5"/>
<circle cx="20" cy="20" r="14" fill="none" stroke="#0EA5E9" stroke-width="4.5" stroke-dasharray="33 55" stroke-dashoffset="22" stroke-linecap="round"/>
<circle cx="20" cy="20" r="14" fill="none" stroke="#10B981" stroke-width="4.5" stroke-dasharray="22 66" stroke-dashoffset="-11" stroke-linecap="round"/>
<circle cx="20" cy="20" r="14" fill="none" stroke="#8B5CF6" stroke-width="4.5" stroke-dasharray="19 69" stroke-dashoffset="-33" stroke-linecap="round"/>
<circle cx="20" cy="20" r="14" fill="none" stroke="#F59E0B" stroke-width="4.5" stroke-dasharray="12 76" stroke-dashoffset="-52" stroke-linecap="round"/>
</svg>
<div style="display: flex; flex-direction: column; gap: 2pt;">
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #0EA5E9; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4.5pt; color: rgba(255,255,255,0.4);">영업1팀</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #10B981; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4.5pt; color: rgba(255,255,255,0.4);">영업2팀</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #8B5CF6; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4.5pt; color: rgba(255,255,255,0.4);">생산팀</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #F59E0B; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4.5pt; color: rgba(255,255,255,0.4);">품질팀</p>
</div>
</div>
</div>
</div>
</div>
<!-- 약속 박스 -->
<div style="background: rgba(14,165,233,0.05); border: 1pt solid rgba(14,165,233,0.1); border-radius: 7pt; padding: 10pt 12pt; margin-bottom: 12pt;">
<div style="display: flex; align-items: center; gap: 6pt;">
<svg viewBox="0 0 22 22" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="11" cy="11" r="9" fill="none" stroke="#0EA5E9" stroke-width="1.2" opacity="0.4"/>
<path d="M7 11 L10 14 L15 8" fill="none" stroke="#0EA5E9" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: #0EA5E9;">SAM 대시보드가 드리는 약속</p>
<p style="font-size: 7pt; color: rgba(255,255,255,0.45); margin-top: 2pt; line-height: 1.5;">로그인 한 번이면 전사 매출, 수주, 승인 대기를 한눈에.<br>보고를 기다리는 시간을 제로로 만들어 드립니다.</p>
</div>
</div>
</div>
<!-- 기술 태그 -->
<div style="display: flex; gap: 4pt; margin-bottom: 8pt;">
<div style="display: flex; align-items: center; gap: 2pt; background: rgba(255,255,255,0.03); border-radius: 3pt; padding: 3pt 6pt;">
<svg viewBox="0 0 8 8" width="5pt" height="5pt" xmlns="http://www.w3.org/2000/svg"><path d="M2 6 Q4 2 6 6" fill="none" stroke="rgba(255,255,255,0.25)" stroke-width="0.7"/><path d="M3 6 Q4 4 5 6" fill="none" stroke="rgba(255,255,255,0.3)" stroke-width="0.7"/><circle cx="4" cy="6.5" r="0.6" fill="rgba(255,255,255,0.3)"/></svg>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.3);">클라우드 기반</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: rgba(255,255,255,0.03); border-radius: 3pt; padding: 3pt 6pt;">
<svg viewBox="0 0 8 8" width="5pt" height="5pt" xmlns="http://www.w3.org/2000/svg"><rect x="2" y="0.5" width="4" height="7" rx="0.8" fill="none" stroke="rgba(255,255,255,0.25)" stroke-width="0.7"/><circle cx="4" cy="6.5" r="0.4" fill="rgba(255,255,255,0.3)"/></svg>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.3);">PC + 모바일</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: rgba(255,255,255,0.03); border-radius: 3pt; padding: 3pt 6pt;">
<svg viewBox="0 0 8 8" width="5pt" height="5pt" xmlns="http://www.w3.org/2000/svg"><rect x="1" y="1.5" width="6" height="5" rx="0.8" fill="none" stroke="rgba(255,255,255,0.25)" stroke-width="0.7"/><circle cx="4" cy="4" r="1.2" fill="none" stroke="rgba(255,255,255,0.3)" stroke-width="0.5"/></svg>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.3);">역할별 권한</p>
</div>
</div>
<!-- 푸터 -->
<div style="margin-top: auto; border-top: 1pt solid rgba(255,255,255,0.06); padding-top: 8pt;">
<div style="display: flex; justify-content: space-between; align-items: flex-end;">
<div>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: rgba(255,255,255,0.6);">SAM</p>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.2); margin-top: 2pt;">www.sam.it.kr</p>
</div>
<div style="text-align: right;">
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.25);">뒷면에서 상세 기능을 확인하세요 &#9654;</p>
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,27 @@
const path = require('path');
module.paths.unshift(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/node_modules'));
const PptxGenJS = require('pptxgenjs');
const html2pptx = require(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/html2pptx.js'));
async function main() {
const pres = new PptxGenJS();
pres.defineLayout({ name: 'PORTRAIT_9x16', width: 5.625, height: 10 });
pres.layout = 'PORTRAIT_9x16';
const htmlFile = path.join(__dirname, 'slides', 'brochure-dashboard-1page.html');
console.log('Converting CEO Dashboard v4 (Light) 1-page brochure...');
try {
await html2pptx(htmlFile, pres);
} catch (err) {
console.error(`Error: ${err.message}`);
}
const outputPath = path.join(__dirname, 'sam-brochure-v4-dashboard-1page.pptx');
await pres.writeFile({ fileName: outputPath });
console.log(`\nPPTX created: ${outputPath}`);
}
main().catch(console.error);

View File

@@ -0,0 +1,31 @@
const path = require('path');
module.paths.unshift(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/node_modules'));
const PptxGenJS = require('pptxgenjs');
const html2pptx = require(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/html2pptx.js'));
async function main() {
const pres = new PptxGenJS();
pres.defineLayout({ name: 'PORTRAIT_9x16', width: 5.625, height: 10 });
pres.layout = 'PORTRAIT_9x16';
const slidesDir = path.join(__dirname, 'slides');
const slides = ['brochure-dashboard-front.html', 'brochure-dashboard-back.html'];
for (const file of slides) {
const htmlFile = path.join(slidesDir, file);
console.log(`Converting ${file} ...`);
try {
await html2pptx(htmlFile, pres);
} catch (err) {
console.error(`Error on ${file}: ${err.message}`);
}
}
const outputPath = path.join(__dirname, 'sam-brochure-v4-dashboard-2page.pptx');
await pres.writeFile({ fileName: outputPath });
console.log(`\nPPTX created: ${outputPath}`);
}
main().catch(console.error);

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,403 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
width: 405pt; height: 720pt;
font-family: 'Pretendard', sans-serif;
background: #F8FAFC;
padding: 22pt 20pt 12pt 20pt;
display: flex; flex-direction: column;
}
</style>
</head>
<body>
<!-- 헤더 -->
<div style="display: flex; align-items: center; gap: 8pt; margin-bottom: 10pt;">
<img src="/home/aweso/sam/docs/assets/bi/sam_bi_black.png" style="height: 20pt;">
<div style="flex: 1;"></div>
<p style="white-space: nowrap; font-size: 6.5pt; color: #CBD5E1;">CEO DASHBOARD v4</p>
</div>
<!-- 히어로 -->
<div style="display: flex; align-items: center; gap: 12pt; margin-bottom: 12pt;">
<div style="flex: 1;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 600; color: #0EA5E9; letter-spacing: 0.1em; margin-bottom: 3pt;">EXECUTIVE DASHBOARD</p>
<h1 style="font-size: 16pt; font-weight: 800; color: #0F172A; line-height: 1.35; margin-bottom: 5pt;">대표님, 우리 회사<br>지금 어떤 상태인가요?</h1>
<p style="font-size: 7.5pt; color: #64748B; line-height: 1.5;">보고 대기 없이, 로그인 한 번이면<br>전사 현황이 한눈에 들어옵니다.</p>
</div>
<!-- 히어로 SVG 아이콘: 대시보드 모니터 -->
<div style="flex-shrink: 0; width: 72pt; height: 72pt;">
<svg viewBox="0 0 80 80" width="72pt" height="72pt" xmlns="http://www.w3.org/2000/svg">
<rect x="8" y="10" width="64" height="44" rx="4" fill="none" stroke="#0EA5E9" stroke-width="1.5" opacity="0.6"/>
<rect x="12" y="14" width="56" height="36" rx="2" fill="#FFFFFF"/>
<!-- 미니 차트 바 -->
<rect x="16" y="38" width="6" height="8" rx="1" fill="#0EA5E9" opacity="0.5"/>
<rect x="24" y="34" width="6" height="12" rx="1" fill="#0EA5E9" opacity="0.65"/>
<rect x="32" y="30" width="6" height="16" rx="1" fill="#0EA5E9" opacity="0.8"/>
<rect x="40" y="26" width="6" height="20" rx="1" fill="#0EA5E9" opacity="0.9"/>
<rect x="48" y="22" width="6" height="24" rx="1" fill="#0EA5E9"/>
<rect x="56" y="28" width="6" height="18" rx="1" fill="#10B981" opacity="0.7"/>
<!-- 상단 KPI 표시 -->
<circle cx="18" cy="20" r="3" fill="#10B981" opacity="0.7"/>
<circle cx="28" cy="20" r="3" fill="#8B5CF6" opacity="0.7"/>
<circle cx="38" cy="20" r="3" fill="#F59E0B" opacity="0.7"/>
<circle cx="48" cy="20" r="3" fill="#EF4444" opacity="0.7"/>
<!-- 모니터 받침대 -->
<rect x="32" y="54" width="16" height="3" rx="1" fill="#0EA5E9" opacity="0.4"/>
<rect x="28" y="57" width="24" height="2" rx="1" fill="#0EA5E9" opacity="0.3"/>
<!-- 와이파이 시그널 -->
<path d="M58 62 Q62 58 66 62" fill="none" stroke="#10B981" stroke-width="1" opacity="0.5"/>
<path d="M56 66 Q62 60 68 66" fill="none" stroke="#10B981" stroke-width="1" opacity="0.3"/>
<circle cx="62" cy="66" r="1.5" fill="#10B981" opacity="0.6"/>
</svg>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(14,165,233,0.2); margin-bottom: 10pt;"></div>
<!-- 대시보드 Mock UI -->
<div style="background: #FFFFFF; border: 1pt solid #E2E8F0; border-radius: 7pt; padding: 8pt; margin-bottom: 9pt; box-shadow: 0 1pt 4pt rgba(0,0,0,0.06);">
<!-- 타이틀바 -->
<div style="display: flex; align-items: center; gap: 3pt; margin-bottom: 6pt;">
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #EF4444;"></div>
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #F59E0B;"></div>
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #10B981;"></div>
<p style="white-space: nowrap; font-size: 5.5pt; color: #94A3B8; margin-left: 5pt;">SAM CEO Dashboard</p>
</div>
<!-- KPI 카드 4개 (SVG 아이콘 포함) -->
<div style="display: flex; gap: 3pt; margin-bottom: 5pt;">
<!-- 월 매출 -->
<div style="flex: 1; background: rgba(14,165,233,0.05); border: 1pt solid rgba(14,165,233,0.15); border-radius: 4pt; padding: 5pt 4pt; text-align: center;">
<svg viewBox="0 0 20 20" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<path d="M3 16 L3 8 L7 8 L7 16 Z" fill="#0EA5E9" opacity="0.4"/>
<path d="M8 16 L8 5 L12 5 L12 16 Z" fill="#0EA5E9" opacity="0.65"/>
<path d="M13 16 L13 3 L17 3 L17 16 Z" fill="#0EA5E9"/>
<path d="M3 16 L17 16" stroke="#0EA5E9" stroke-width="0.5" opacity="0.4"/>
</svg>
<p style="white-space: nowrap; font-size: 10pt; font-weight: 800; color: #0F172A;">5.2억</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">&#9650; 15.3%</p>
<p style="white-space: nowrap; font-size: 5pt; color: #0EA5E9; font-weight: 600; margin-top: 1pt;">월 매출</p>
</div>
<!-- 수주 잔량 -->
<div style="flex: 1; background: rgba(16,185,129,0.05); border: 1pt solid rgba(16,185,129,0.15); border-radius: 4pt; padding: 5pt 4pt; text-align: center;">
<svg viewBox="0 0 20 20" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<rect x="3" y="3" width="14" height="14" rx="2" fill="none" stroke="#10B981" stroke-width="1.2" opacity="0.5"/>
<path d="M6 10 L9 13 L14 7" fill="none" stroke="#10B981" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 10pt; font-weight: 800; color: #0F172A;">127건</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">&#9650; 8건</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 600; margin-top: 1pt;">수주 잔량</p>
</div>
<!-- 납기 준수율 -->
<div style="flex: 1; background: rgba(139,92,246,0.05); border: 1pt solid rgba(139,92,246,0.15); border-radius: 4pt; padding: 5pt 4pt; text-align: center;">
<svg viewBox="0 0 20 20" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="10" cy="10" r="7" fill="none" stroke="#8B5CF6" stroke-width="1.2" opacity="0.3"/>
<circle cx="10" cy="10" r="7" fill="none" stroke="#8B5CF6" stroke-width="1.5" stroke-dasharray="40 44" stroke-dashoffset="-11" stroke-linecap="round"/>
<text x="10" y="12" text-anchor="middle" fill="#8B5CF6" font-size="5" font-weight="800">96</text>
</svg>
<p style="white-space: nowrap; font-size: 10pt; font-weight: 800; color: #0F172A;">96%</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">목표 달성</p>
<p style="white-space: nowrap; font-size: 5pt; color: #8B5CF6; font-weight: 600; margin-top: 1pt;">납기 준수율</p>
</div>
<!-- 승인 대기 -->
<div style="flex: 1; background: rgba(239,68,68,0.05); border: 1pt solid rgba(239,68,68,0.15); border-radius: 4pt; padding: 5pt 4pt; text-align: center;">
<svg viewBox="0 0 20 20" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<path d="M10 3 L17 15 L3 15 Z" fill="none" stroke="#EF4444" stroke-width="1.2" stroke-linejoin="round"/>
<line x1="10" y1="8" x2="10" y2="11" stroke="#EF4444" stroke-width="1.5" stroke-linecap="round"/>
<circle cx="10" cy="13" r="0.8" fill="#EF4444"/>
</svg>
<p style="white-space: nowrap; font-size: 10pt; font-weight: 800; color: #EF4444;">5건</p>
<p style="white-space: nowrap; font-size: 5pt; color: #EF4444; font-weight: 700;">즉시 처리</p>
<p style="white-space: nowrap; font-size: 5pt; color: #EF4444; font-weight: 600; margin-top: 1pt;">승인 대기</p>
</div>
</div>
<!-- 차트 영역 -->
<div style="display: flex; gap: 4pt;">
<!-- 매출 추이 (라인 차트 SVG) -->
<div style="flex: 3; background: #F8FAFC; border-radius: 4pt; padding: 4pt 5pt;">
<p style="white-space: nowrap; font-size: 5pt; color: #94A3B8; margin-bottom: 2pt;">월별 매출 추이</p>
<svg viewBox="0 0 160 40" width="100%" height="30pt" xmlns="http://www.w3.org/2000/svg">
<!-- 그리드 라인 -->
<line x1="0" y1="10" x2="160" y2="10" stroke="rgba(15,23,42,0.05)" stroke-width="0.5"/>
<line x1="0" y1="20" x2="160" y2="20" stroke="rgba(15,23,42,0.05)" stroke-width="0.5"/>
<line x1="0" y1="30" x2="160" y2="30" stroke="rgba(15,23,42,0.05)" stroke-width="0.5"/>
<!-- 영역 채우기 -->
<path d="M5 35 L20 28 L35 30 L50 22 L65 18 L80 14 L95 16 L110 10 L125 12 L140 5 L155 8 L155 38 L5 38 Z" fill="url(#areaGrad)" opacity="0.4"/>
<!-- 라인 -->
<path d="M5 35 L20 28 L35 30 L50 22 L65 18 L80 14 L95 16 L110 10 L125 12 L140 5 L155 8" fill="none" stroke="#0EA5E9" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<!-- 데이터 포인트 -->
<circle cx="140" cy="5" r="2.5" fill="#0EA5E9"/>
<circle cx="155" cy="8" r="2" fill="#0EA5E9" opacity="0.5" stroke="#0EA5E9" stroke-width="0.5" stroke-dasharray="1 1"/>
<defs>
<linearGradient id="areaGrad" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#0EA5E9" stop-opacity="0.3"/>
<stop offset="100%" stop-color="#0EA5E9" stop-opacity="0"/>
</linearGradient>
</defs>
</svg>
</div>
<!-- 도넛 차트: 팀별 비중 -->
<div style="flex: 2; background: #F8FAFC; border-radius: 4pt; padding: 4pt 5pt; display: flex; align-items: center; gap: 5pt;">
<svg viewBox="0 0 44 44" width="36pt" height="36pt" xmlns="http://www.w3.org/2000/svg">
<!-- 배경 원 -->
<circle cx="22" cy="22" r="16" fill="none" stroke="rgba(15,23,42,0.06)" stroke-width="5"/>
<!-- 영업1팀 38% -->
<circle cx="22" cy="22" r="16" fill="none" stroke="#0EA5E9" stroke-width="5" stroke-dasharray="38 62" stroke-dashoffset="25" stroke-linecap="round"/>
<!-- 영업2팀 25% -->
<circle cx="22" cy="22" r="16" fill="none" stroke="#10B981" stroke-width="5" stroke-dasharray="25 75" stroke-dashoffset="-13" stroke-linecap="round"/>
<!-- 생산팀 22% -->
<circle cx="22" cy="22" r="16" fill="none" stroke="#8B5CF6" stroke-width="5" stroke-dasharray="22 78" stroke-dashoffset="-38" stroke-linecap="round"/>
<!-- 품질팀 15% -->
<circle cx="22" cy="22" r="16" fill="none" stroke="#F59E0B" stroke-width="5" stroke-dasharray="13 87" stroke-dashoffset="-60" stroke-linecap="round"/>
</svg>
<div style="display: flex; flex-direction: column; gap: 2pt;">
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 4pt; height: 4pt; background: #0EA5E9; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 5pt; color: #64748B;">영업1팀 38%</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 4pt; height: 4pt; background: #10B981; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 5pt; color: #64748B;">영업2팀 25%</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 4pt; height: 4pt; background: #8B5CF6; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 5pt; color: #64748B;">생산팀 22%</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 4pt; height: 4pt; background: #F59E0B; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 5pt; color: #64748B;">품질팀 15%</p>
</div>
</div>
</div>
</div>
</div>
<!-- 핵심 가치 3개 (SVG 아이콘) -->
<div style="margin-bottom: 9pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #0EA5E9; margin-bottom: 5pt;">대표님이 얻는 것</p>
<div style="display: flex; gap: 4pt;">
<!-- 즉시 현황 파악 -->
<div style="flex: 1; background: rgba(14,165,233,0.04); border: 1pt solid rgba(14,165,233,0.12); border-radius: 6pt; padding: 7pt 5pt; text-align: center;">
<svg viewBox="0 0 28 28" width="18pt" height="18pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 3pt;">
<circle cx="14" cy="14" r="10" fill="none" stroke="#0EA5E9" stroke-width="1.2" opacity="0.4"/>
<path d="M14 8 L14 14 L18 17" fill="none" stroke="#0EA5E9" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="14" cy="14" r="1.5" fill="#0EA5E9"/>
<!-- 번개 (빠름) -->
<path d="M22 5 L20 10 L23 10 L21 15" fill="none" stroke="#F59E0B" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="font-size: 7pt; font-weight: 700; color: #0F172A; white-space: nowrap;">즉시 현황 파악</p>
<p style="font-size: 5.5pt; color: #94A3B8; margin-top: 2pt; line-height: 1.4;">로그인 3초면<br>전사 현황 확인</p>
</div>
<!-- 데이터 기반 의사결정 -->
<div style="flex: 1; background: rgba(16,185,129,0.04); border: 1pt solid rgba(16,185,129,0.12); border-radius: 6pt; padding: 7pt 5pt; text-align: center;">
<svg viewBox="0 0 28 28" width="18pt" height="18pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 3pt;">
<!-- 뇌 (의사결정) -->
<circle cx="14" cy="12" r="8" fill="none" stroke="#10B981" stroke-width="1.2" opacity="0.4"/>
<path d="M11 8 Q14 6 17 8" fill="none" stroke="#10B981" stroke-width="1" stroke-linecap="round"/>
<path d="M10 12 Q14 10 18 12" fill="none" stroke="#10B981" stroke-width="1" stroke-linecap="round"/>
<path d="M11 16 Q14 14 17 16" fill="none" stroke="#10B981" stroke-width="1" stroke-linecap="round"/>
<!-- 데이터 포인트 -->
<circle cx="8" cy="22" r="1.2" fill="#10B981" opacity="0.6"/>
<circle cx="14" cy="22" r="1.2" fill="#10B981" opacity="0.8"/>
<circle cx="20" cy="22" r="1.2" fill="#10B981"/>
<line x1="8" y1="22" x2="20" y2="22" stroke="#10B981" stroke-width="0.5" opacity="0.3"/>
</svg>
<p style="font-size: 7pt; font-weight: 700; color: #0F172A; white-space: nowrap;">데이터로 판단</p>
<p style="font-size: 5.5pt; color: #94A3B8; margin-top: 2pt; line-height: 1.4;">감이 아닌 숫자로<br>KPI/팀 성과 비교</p>
</div>
<!-- 빠른 승인 -->
<div style="flex: 1; background: rgba(139,92,246,0.04); border: 1pt solid rgba(139,92,246,0.12); border-radius: 6pt; padding: 7pt 5pt; text-align: center;">
<svg viewBox="0 0 28 28" width="18pt" height="18pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 3pt;">
<!-- 체크마크 원 -->
<circle cx="14" cy="14" r="9" fill="none" stroke="#8B5CF6" stroke-width="1.2" opacity="0.4"/>
<path d="M9 14 L12.5 17.5 L19 10.5" fill="none" stroke="#8B5CF6" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<!-- 모바일 아이콘 -->
<rect x="20" y="19" width="5" height="8" rx="1" fill="none" stroke="#8B5CF6" stroke-width="0.8" opacity="0.5"/>
<circle cx="22.5" cy="25.5" r="0.5" fill="#8B5CF6" opacity="0.5"/>
</svg>
<p style="font-size: 7pt; font-weight: 700; color: #0F172A; white-space: nowrap;">모바일 승인</p>
<p style="font-size: 5.5pt; color: #94A3B8; margin-top: 2pt; line-height: 1.4;">이동중에도 즉시<br>결재/승인 처리</p>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(139,92,246,0.2); margin-bottom: 9pt;"></div>
<!-- 대시보드 6대 기능 (SVG 아이콘 + 텍스트) -->
<div style="margin-bottom: 9pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #F59E0B; margin-bottom: 5pt;">대시보드 핵심 기능</p>
<div style="display: flex; flex-direction: column; gap: 2pt;">
<div style="display: flex; gap: 2pt;">
<!-- 01 실시간 KPI -->
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: rgba(14,165,233,0.04); border: 1pt solid rgba(14,165,233,0.1); border-radius: 4pt; padding: 4pt 6pt;">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<rect x="2" y="10" width="3" height="6" rx="0.5" fill="#0EA5E9" opacity="0.5"/>
<rect x="7" y="6" width="3" height="10" rx="0.5" fill="#0EA5E9" opacity="0.75"/>
<rect x="12" y="2" width="3" height="14" rx="0.5" fill="#0EA5E9"/>
</svg>
<p style="font-size: 6.5pt; color: #475569; white-space: nowrap;">실시간 <span style="color: #0EA5E9; font-weight: 700;">매출/수주 KPI</span></p>
</div>
<!-- 02 조직 트리 -->
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: rgba(16,185,129,0.04); border: 1pt solid rgba(16,185,129,0.1); border-radius: 4pt; padding: 4pt 6pt;">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="9" cy="4" r="2.5" fill="none" stroke="#10B981" stroke-width="1"/>
<line x1="9" y1="6.5" x2="9" y2="9" stroke="#10B981" stroke-width="0.8"/>
<line x1="4" y1="9" x2="14" y2="9" stroke="#10B981" stroke-width="0.8"/>
<circle cx="4" cy="12" r="2" fill="none" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<circle cx="9" cy="12" r="2" fill="none" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<circle cx="14" cy="12" r="2" fill="none" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<line x1="4" y1="9" x2="4" y2="10" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<line x1="9" y1="9" x2="9" y2="10" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<line x1="14" y1="9" x2="14" y2="10" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
</svg>
<p style="font-size: 6.5pt; color: #475569; white-space: nowrap;">조직 계층별 <span style="color: #10B981; font-weight: 700;">실적 트리</span></p>
</div>
</div>
<div style="display: flex; gap: 2pt;">
<!-- 03 수당 현황 -->
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: rgba(139,92,246,0.04); border: 1pt solid rgba(139,92,246,0.1); border-radius: 4pt; padding: 4pt 6pt;">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="9" cy="9" r="7" fill="none" stroke="#8B5CF6" stroke-width="1" opacity="0.3"/>
<text x="9" y="11.5" text-anchor="middle" fill="#8B5CF6" font-size="8" font-weight="800">&#8361;</text>
</svg>
<p style="font-size: 6.5pt; color: #475569; white-space: nowrap;">역할별 <span style="color: #8B5CF6; font-weight: 700;">수당 현황</span></p>
</div>
<!-- 04 승인 알림 -->
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: rgba(239,68,68,0.04); border: 1pt solid rgba(239,68,68,0.1); border-radius: 4pt; padding: 4pt 6pt;">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<path d="M9 3 C5 3 3 6 3 9 L3 12 L2 13 L16 13 L15 12 L15 9 C15 6 13 3 9 3 Z" fill="none" stroke="#EF4444" stroke-width="1" opacity="0.6"/>
<circle cx="13" cy="5" r="3" fill="#EF4444"/>
<text x="13" y="6.5" text-anchor="middle" fill="#fff" font-size="4" font-weight="700">5</text>
<path d="M7 14 Q9 16 11 14" fill="none" stroke="#EF4444" stroke-width="0.8" opacity="0.5"/>
</svg>
<p style="font-size: 6.5pt; color: #475569; white-space: nowrap;">미승인 <span style="color: #EF4444; font-weight: 700;">실시간 알림</span></p>
</div>
</div>
<div style="display: flex; gap: 2pt;">
<!-- 05 트렌드 -->
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: rgba(245,158,11,0.04); border: 1pt solid rgba(245,158,11,0.1); border-radius: 4pt; padding: 4pt 6pt;">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<path d="M3 14 L7 10 L10 12 L15 5" fill="none" stroke="#F59E0B" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M12 5 L15 5 L15 8" fill="none" stroke="#F59E0B" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="font-size: 6.5pt; color: #475569; white-space: nowrap;">기간별 <span style="color: #F59E0B; font-weight: 700;">트렌드 분석</span></p>
</div>
<!-- 06 시뮬레이터 -->
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: rgba(236,72,153,0.04); border: 1pt solid rgba(236,72,153,0.1); border-radius: 4pt; padding: 4pt 6pt;">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<rect x="2" y="3" width="14" height="12" rx="1.5" fill="none" stroke="#EC4899" stroke-width="1" opacity="0.5"/>
<line x1="5" y1="7" x2="13" y2="7" stroke="#EC4899" stroke-width="0.6" opacity="0.3"/>
<line x1="5" y1="9" x2="11" y2="9" stroke="#EC4899" stroke-width="0.6" opacity="0.3"/>
<line x1="5" y1="11" x2="9" y2="11" stroke="#EC4899" stroke-width="0.6" opacity="0.3"/>
<circle cx="14" cy="13" r="3.5" fill="#F8FAFC" stroke="#EC4899" stroke-width="0.8"/>
<path d="M13 13 L15 13 M14 12 L14 14" stroke="#EC4899" stroke-width="0.8" stroke-linecap="round"/>
</svg>
<p style="font-size: 6.5pt; color: #475569; white-space: nowrap;">수익 <span style="color: #EC4899; font-weight: 700;">시뮬레이터</span></p>
</div>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: #E2E8F0; margin-bottom: 9pt;"></div>
<!-- Before → After 인포그래픽 -->
<div style="display: flex; gap: 4pt; margin-bottom: 9pt;">
<!-- Before -->
<div style="flex: 5; background: rgba(239,68,68,0.04); border: 1pt solid rgba(239,68,68,0.1); border-radius: 5pt; padding: 5pt 6pt 12pt 6pt;">
<div style="display: flex; align-items: center; gap: 3pt; margin-bottom: 3pt;">
<svg viewBox="0 0 14 14" width="8pt" height="8pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="7" cy="7" r="5.5" fill="none" stroke="#EF4444" stroke-width="1"/>
<line x1="4.5" y1="4.5" x2="9.5" y2="9.5" stroke="#EF4444" stroke-width="1.2" stroke-linecap="round"/>
<line x1="9.5" y1="4.5" x2="4.5" y2="9.5" stroke="#EF4444" stroke-width="1.2" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #EF4444;">BEFORE</p>
</div>
<p style="white-space: nowrap; font-size: 5.5pt; color: #64748B;">매출? → 보고 대기 1~2일</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #64748B;">수주? → Excel 취합 반나절</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #64748B;">승인? → 서류 찾기 30분</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #64748B;">실적? → 각 팀장 개별 보고</p>
</div>
<!-- 화살표 -->
<div style="display: flex; align-items: center; flex-shrink: 0;">
<svg viewBox="0 0 20 20" width="14pt" height="14pt" xmlns="http://www.w3.org/2000/svg">
<path d="M4 10 L14 10" stroke="#0EA5E9" stroke-width="1.5" stroke-linecap="round"/>
<path d="M11 6 L15 10 L11 14" fill="none" stroke="#0EA5E9" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>
<!-- After -->
<div style="flex: 5; background: rgba(16,185,129,0.04); border: 1pt solid rgba(16,185,129,0.1); border-radius: 5pt; padding: 5pt 6pt 12pt 6pt;">
<div style="display: flex; align-items: center; gap: 3pt; margin-bottom: 3pt;">
<svg viewBox="0 0 14 14" width="8pt" height="8pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="7" cy="7" r="5.5" fill="none" stroke="#10B981" stroke-width="1"/>
<path d="M4.5 7 L6.5 9 L10 5" fill="none" stroke="#10B981" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #10B981;">AFTER (SAM)</p>
</div>
<p style="white-space: nowrap; font-size: 5.5pt; color: #64748B;">로그인 → <span style="color:#10B981;font-weight:600;">3초 전사 현황</span></p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #64748B;">클릭 → <span style="color:#10B981;font-weight:600;">실시간 수주 데이터</span></p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #64748B;">뱃지 → <span style="color:#10B981;font-weight:600;">즉시 승인 처리</span></p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #64748B;">트리 → <span style="color:#10B981;font-weight:600;">전 조직 한눈에</span></p>
</div>
</div>
<!-- 기술 태그 -->
<div style="display: flex; gap: 3pt; margin-bottom: 6pt;">
<div style="display: flex; align-items: center; gap: 2pt; background: #F1F5F9; border-radius: 3pt; padding: 2pt 5pt;">
<svg viewBox="0 0 10 10" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="5" cy="5" r="3.5" fill="none" stroke="#94A3B8" stroke-width="0.8"/>
<path d="M5 2.5 L5 5 L7 6.5" fill="none" stroke="#94A3B8" stroke-width="0.6" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: #94A3B8;">실시간 업데이트</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: #F1F5F9; border-radius: 3pt; padding: 2pt 5pt;">
<svg viewBox="0 0 10 10" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg">
<rect x="2.5" y="1" width="5" height="8" rx="1" fill="none" stroke="#94A3B8" stroke-width="0.8"/>
<circle cx="5" cy="7.5" r="0.5" fill="#94A3B8"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: #94A3B8;">PC + 모바일</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: #F1F5F9; border-radius: 3pt; padding: 2pt 5pt;">
<svg viewBox="0 0 10 10" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg">
<rect x="1.5" y="2" width="7" height="6" rx="1" fill="none" stroke="#94A3B8" stroke-width="0.8"/>
<circle cx="5" cy="5" r="1.5" fill="none" stroke="#94A3B8" stroke-width="0.6"/>
<line x1="6" y1="3.5" x2="7.5" y2="2" stroke="#94A3B8" stroke-width="0.6"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: #94A3B8;">역할별 권한</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: #F1F5F9; border-radius: 3pt; padding: 2pt 5pt;">
<svg viewBox="0 0 10 10" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg">
<path d="M5 1 Q8 1 8 4 L8 5 Q8 8 5 8 Q2 8 2 5 L2 4 Q2 1 5 1 Z" fill="none" stroke="#94A3B8" stroke-width="0.8"/>
<line x1="5" y1="4" x2="5" y2="6" stroke="#94A3B8" stroke-width="0.6" stroke-linecap="round"/>
<circle cx="5" cy="3.5" r="0.5" fill="#94A3B8"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: #94A3B8;">데이터 암호화</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: #F1F5F9; border-radius: 3pt; padding: 2pt 5pt;">
<svg viewBox="0 0 10 10" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg">
<path d="M2 7 Q5 3 8 7" fill="none" stroke="#94A3B8" stroke-width="0.8"/>
<path d="M3.5 7 Q5 5 6.5 7" fill="none" stroke="#94A3B8" stroke-width="0.8"/>
<circle cx="5" cy="7.5" r="0.8" fill="#94A3B8"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: #94A3B8;">클라우드</p>
</div>
</div>
<!-- 푸터 -->
<div style="margin-top: auto; border-top: 1pt solid #E2E8F0; padding-top: 7pt;">
<div style="display: flex; justify-content: space-between; align-items: flex-end;">
<div>
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #475569;">SAM</p>
<p style="white-space: nowrap; font-size: 6pt; color: #CBD5E1; margin-top: 2pt;">www.sam.it.kr</p>
</div>
<div style="text-align: right;">
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,371 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
width: 405pt; height: 720pt;
font-family: 'Pretendard', sans-serif;
background: #F8FAFC;
padding: 20pt 22pt 12pt 22pt;
display: flex; flex-direction: column;
}
</style>
</head>
<body>
<!-- 헤더 -->
<div style="display: flex; align-items: center; gap: 8pt; margin-bottom: 10pt;">
<img src="/home/aweso/sam/docs/assets/bi/sam_bi_black.png" style="height: 18pt;">
<div style="flex: 1;"></div>
<p style="white-space: nowrap; font-size: 6.5pt; color: #CBD5E1;">FEATURES &amp; PRICING</p>
</div>
<!-- 대시보드 7대 기능 (SVG 아이콘) -->
<div style="margin-bottom: 9pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #0EA5E9; margin-bottom: 6pt;">대시보드 핵심 기능</p>
<div style="display: flex; flex-direction: column; gap: 2pt;">
<!-- 01 -->
<div style="display: flex; align-items: center; gap: 5pt; background: rgba(14,165,233,0.04); border: 1pt solid rgba(14,165,233,0.1); border-radius: 4pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<rect x="2" y="11" width="4" height="6" rx="0.5" fill="#0EA5E9" opacity="0.45"/>
<rect x="8" y="7" width="4" height="10" rx="0.5" fill="#0EA5E9" opacity="0.7"/>
<rect x="14" y="3" width="4" height="14" rx="0.5" fill="#0EA5E9"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #0F172A; white-space: nowrap;">실시간 KPI 카드</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">매출, 수주, 납기율, 승인 대기</p>
</div>
<!-- 02 -->
<div style="display: flex; align-items: center; gap: 5pt; background: rgba(16,185,129,0.04); border: 1pt solid rgba(16,185,129,0.1); border-radius: 4pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="10" cy="4.5" r="2.5" fill="none" stroke="#10B981" stroke-width="1.1"/>
<line x1="10" y1="7" x2="10" y2="9.5" stroke="#10B981" stroke-width="0.8"/>
<line x1="5" y1="9.5" x2="15" y2="9.5" stroke="#10B981" stroke-width="0.8"/>
<circle cx="5" cy="13" r="2" fill="none" stroke="#10B981" stroke-width="0.9" opacity="0.6"/>
<circle cx="10" cy="13" r="2" fill="none" stroke="#10B981" stroke-width="0.9" opacity="0.6"/>
<circle cx="15" cy="13" r="2" fill="none" stroke="#10B981" stroke-width="0.9" opacity="0.6"/>
<line x1="5" y1="9.5" x2="5" y2="11" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<line x1="10" y1="9.5" x2="10" y2="11" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<line x1="15" y1="9.5" x2="15" y2="11" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<circle cx="3" cy="17" r="1.3" fill="none" stroke="#10B981" stroke-width="0.6" opacity="0.4"/>
<circle cx="7" cy="17" r="1.3" fill="none" stroke="#10B981" stroke-width="0.6" opacity="0.4"/>
<line x1="5" y1="15" x2="3" y2="15.7" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
<line x1="5" y1="15" x2="7" y2="15.7" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #0F172A; white-space: nowrap;">조직 실적 트리</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">계층별 팀/개인 실적 펼쳐보기</p>
</div>
<!-- 03 -->
<div style="display: flex; align-items: center; gap: 5pt; background: rgba(139,92,246,0.04); border: 1pt solid rgba(139,92,246,0.1); border-radius: 4pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="10" cy="10" r="7.5" fill="none" stroke="#8B5CF6" stroke-width="1" opacity="0.3"/>
<text x="10" y="12.5" text-anchor="middle" fill="#8B5CF6" font-size="9" font-weight="800">&#8361;</text>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #0F172A; white-space: nowrap;">역할별 수당 현황</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">판매자/관리자/협업자 배분 확인</p>
</div>
<!-- 04 -->
<div style="display: flex; align-items: center; gap: 5pt; background: rgba(239,68,68,0.04); border: 1pt solid rgba(239,68,68,0.1); border-radius: 4pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M10 3 C6 3 3 6 3 9.5 L3 13 L1.5 14.5 L18.5 14.5 L17 13 L17 9.5 C17 6 14 3 10 3 Z" fill="none" stroke="#EF4444" stroke-width="1" opacity="0.5"/>
<circle cx="15" cy="5" r="3.5" fill="#EF4444"/>
<text x="15" y="7" text-anchor="middle" fill="#fff" font-size="4.5" font-weight="800">!</text>
<path d="M7.5 15.5 Q10 18 12.5 15.5" fill="none" stroke="#EF4444" stroke-width="0.8" opacity="0.4"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #0F172A; white-space: nowrap;">승인 대기 알림</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">가입/지급 미처리 빨간 뱃지</p>
</div>
<!-- 05 -->
<div style="display: flex; align-items: center; gap: 5pt; background: rgba(245,158,11,0.04); border: 1pt solid rgba(245,158,11,0.1); border-radius: 4pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M3 15 L7 11 L10 13 L16 5" fill="none" stroke="#F59E0B" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M13 5 L16 5 L16 8" fill="none" stroke="#F59E0B" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #0F172A; white-space: nowrap;">기간별 트렌드</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">당월/분기/연간 추이 차트</p>
</div>
<!-- 06 -->
<div style="display: flex; align-items: center; gap: 5pt; background: rgba(236,72,153,0.04); border: 1pt solid rgba(236,72,153,0.1); border-radius: 4pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<rect x="2" y="3" width="16" height="14" rx="2" fill="none" stroke="#EC4899" stroke-width="1" opacity="0.4"/>
<line x1="5" y1="7.5" x2="15" y2="7.5" stroke="#EC4899" stroke-width="0.6" opacity="0.3"/>
<line x1="5" y1="10" x2="12" y2="10" stroke="#EC4899" stroke-width="0.6" opacity="0.3"/>
<line x1="5" y1="12.5" x2="9" y2="12.5" stroke="#EC4899" stroke-width="0.6" opacity="0.3"/>
<circle cx="15.5" cy="14.5" r="3.5" fill="#F8FAFC" stroke="#EC4899" stroke-width="0.9"/>
<path d="M14.5 14.5 L16.5 14.5 M15.5 13.5 L15.5 15.5" stroke="#EC4899" stroke-width="0.8" stroke-linecap="round"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #0F172A; white-space: nowrap;">수익 시뮬레이터</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">가상 시나리오 수당/마진 계산</p>
</div>
<!-- 07 -->
<div style="display: flex; align-items: center; gap: 5pt; background: rgba(14,165,233,0.04); border: 1pt solid rgba(14,165,233,0.1); border-radius: 4pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<rect x="5" y="2" width="10" height="16" rx="2" fill="none" stroke="#0EA5E9" stroke-width="1" opacity="0.5"/>
<circle cx="10" cy="16" r="1" fill="#0EA5E9" opacity="0.5"/>
<rect x="7" y="5" width="6" height="8" rx="0.5" fill="rgba(14,165,233,0.1)"/>
<rect x="8" y="6" width="4" height="1.5" rx="0.3" fill="#0EA5E9" opacity="0.4"/>
<rect x="8" y="8.5" width="4" height="1.5" rx="0.3" fill="#10B981" opacity="0.4"/>
<rect x="8" y="11" width="4" height="1.5" rx="0.3" fill="#8B5CF6" opacity="0.4"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #0F172A; white-space: nowrap;">모바일 대응</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">스마트폰으로 KPI 확인/승인</p>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(14,165,233,0.2); margin-bottom: 8pt;"></div>
<!-- 역할별 맞춤 화면 (SVG 아이콘) -->
<div style="margin-bottom: 9pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #10B981; margin-bottom: 5pt;">역할별 맞춤 화면</p>
<div style="display: flex; gap: 4pt;">
<!-- CEO -->
<div style="flex: 1; background: rgba(14,165,233,0.04); border: 1pt solid rgba(14,165,233,0.12); border-radius: 5pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="12" cy="8" r="4" fill="none" stroke="#0EA5E9" stroke-width="1.2"/>
<path d="M4 20 Q4 14 12 14 Q20 14 20 20" fill="none" stroke="#0EA5E9" stroke-width="1.2"/>
<path d="M8 4 L12 1 L16 4" fill="none" stroke="#F59E0B" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" opacity="0.7"/>
</svg>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 800; color: #0EA5E9;">CEO</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: #475569; margin-top: 1pt;">전사 KPI 총괄</p>
</div>
<!-- 관리자 -->
<div style="flex: 1; background: rgba(16,185,129,0.04); border: 1pt solid rgba(16,185,129,0.12); border-radius: 5pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="8" cy="8" r="3" fill="none" stroke="#10B981" stroke-width="1"/>
<circle cx="16" cy="8" r="3" fill="none" stroke="#10B981" stroke-width="1" opacity="0.6"/>
<path d="M2 18 Q2 13 8 13 Q14 13 14 18" fill="none" stroke="#10B981" stroke-width="1"/>
<path d="M12 18 Q12 13 16 13 Q22 13 22 18" fill="none" stroke="#10B981" stroke-width="1" opacity="0.5"/>
</svg>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 800; color: #10B981;">관리자</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: #475569; margin-top: 1pt;">팀 실적 관리</p>
</div>
<!-- 운영자 -->
<div style="flex: 1; background: rgba(245,158,11,0.04); border: 1pt solid rgba(245,158,11,0.12); border-radius: 5pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="12" cy="12" r="8" fill="none" stroke="#F59E0B" stroke-width="1" opacity="0.4"/>
<circle cx="12" cy="12" r="3" fill="none" stroke="#F59E0B" stroke-width="1.2"/>
<line x1="12" y1="4" x2="12" y2="6" stroke="#F59E0B" stroke-width="1" stroke-linecap="round"/>
<line x1="12" y1="18" x2="12" y2="20" stroke="#F59E0B" stroke-width="1" stroke-linecap="round"/>
<line x1="4" y1="12" x2="6" y2="12" stroke="#F59E0B" stroke-width="1" stroke-linecap="round"/>
<line x1="18" y1="12" x2="20" y2="12" stroke="#F59E0B" stroke-width="1" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 800; color: #F59E0B;">운영자</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: #475569; margin-top: 1pt;">인력/승인 관리</p>
</div>
<!-- 영업자 -->
<div style="flex: 1; background: rgba(139,92,246,0.04); border: 1pt solid rgba(139,92,246,0.12); border-radius: 5pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<rect x="4" y="3" width="16" height="18" rx="2" fill="none" stroke="#8B5CF6" stroke-width="1" opacity="0.5"/>
<line x1="7" y1="8" x2="17" y2="8" stroke="#8B5CF6" stroke-width="0.7" opacity="0.4"/>
<line x1="7" y1="11" x2="14" y2="11" stroke="#8B5CF6" stroke-width="0.7" opacity="0.4"/>
<line x1="7" y1="14" x2="12" y2="14" stroke="#8B5CF6" stroke-width="0.7" opacity="0.4"/>
<path d="M14 16 L16 18 L20 13" fill="none" stroke="#8B5CF6" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 800; color: #8B5CF6;">영업자</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: #475569; margin-top: 1pt;">내 실적 조회</p>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(139,92,246,0.2); margin-bottom: 8pt;"></div>
<!-- SAM 통합 플랫폼 연결 -->
<div style="margin-bottom: 9pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #8B5CF6; margin-bottom: 5pt;">대시보드 + SAM ERP/MES 통합</p>
<div style="display: flex; gap: 3pt;">
<div style="flex: 1; background: #F1F5F9; border-radius: 4pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<rect x="2" y="2" width="12" height="12" rx="1.5" fill="none" stroke="#94A3B8" stroke-width="0.8"/>
<line x1="5" y1="6" x2="11" y2="6" stroke="#CBD5E1" stroke-width="0.5"/>
<line x1="5" y1="8" x2="9" y2="8" stroke="#CBD5E1" stroke-width="0.5"/>
<line x1="5" y1="10" x2="11" y2="10" stroke="#CBD5E1" stroke-width="0.5"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: #64748B;">견적/수주</p>
</div>
<div style="flex: 1; background: #F1F5F9; border-radius: 4pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<circle cx="8" cy="8" r="5" fill="none" stroke="#94A3B8" stroke-width="0.8"/>
<circle cx="8" cy="8" r="2" fill="none" stroke="#CBD5E1" stroke-width="0.5"/>
<line x1="8" y1="3" x2="8" y2="4.5" stroke="#CBD5E1" stroke-width="0.5"/>
<line x1="13" y1="8" x2="11.5" y2="8" stroke="#CBD5E1" stroke-width="0.5"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: #64748B;">생산 MES</p>
</div>
<div style="flex: 1; background: #F1F5F9; border-radius: 4pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<path d="M5 3 L11 3 L13 6 L8 14 L3 6 Z" fill="none" stroke="#94A3B8" stroke-width="0.8"/>
<path d="M3 6 L13 6" stroke="#CBD5E1" stroke-width="0.5"/>
<path d="M8 6 L8 14" stroke="#CBD5E1" stroke-width="0.5"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: #64748B;">품질/검사</p>
</div>
<div style="flex: 1; background: #F1F5F9; border-radius: 4pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<rect x="3" y="4" width="10" height="9" rx="1" fill="none" stroke="#94A3B8" stroke-width="0.8"/>
<line x1="3" y1="7" x2="13" y2="7" stroke="#CBD5E1" stroke-width="0.5"/>
<line x1="8" y1="7" x2="8" y2="13" stroke="#CBD5E1" stroke-width="0.5"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: #64748B;">재고/자재</p>
</div>
<div style="flex: 1; background: #F1F5F9; border-radius: 4pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<circle cx="8" cy="6" r="3" fill="none" stroke="#94A3B8" stroke-width="0.8"/>
<path d="M3 14 Q3 10 8 10 Q13 10 13 14" fill="none" stroke="#94A3B8" stroke-width="0.8"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: #64748B;">인사/회계</p>
</div>
</div>
<p style="font-size: 5.5pt; color: #94A3B8; margin-top: 3pt; text-align: center;">대시보드의 모든 데이터는 SAM ERP/MES 실시간 데이터 기반</p>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: #E2E8F0; margin-bottom: 8pt;"></div>
<!-- 투자 비용 -->
<div style="margin-bottom: 9pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #F59E0B; margin-bottom: 5pt;">투자 비용</p>
<div style="display: flex; gap: 5pt;">
<!-- 기본 패키지 -->
<div style="flex: 1;">
<div style="background: rgba(14,165,233,0.04); border: 1pt solid rgba(14,165,233,0.14); border-radius: 6pt; padding: 7pt 8pt; margin-bottom: 3pt;">
<div style="display: flex; align-items: center; gap: 4pt; margin-bottom: 3pt;">
<svg viewBox="0 0 14 14" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg">
<rect x="1" y="1" width="12" height="12" rx="2" fill="none" stroke="#0EA5E9" stroke-width="1" opacity="0.5"/>
<path d="M4 7 L6 9 L10 5" fill="none" stroke="#0EA5E9" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: #0EA5E9;">대시보드 포함 기본 패키지</p>
</div>
<p style="white-space: nowrap; font-size: 13pt; font-weight: 800; color: #0F172A;">2,000만원</p>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">+ 월 50만원 (유지보수)</p>
</div>
<div style="background: #F1F5F9; border-radius: 3pt; padding: 3pt 5pt;">
<p style="font-size: 5.5pt; color: #94A3B8; line-height: 1.4;">CEO 대시보드 + 견적/수주 + 생산<br>인사/회계 무료 포함</p>
</div>
</div>
<!-- 추가 옵션 -->
<div style="flex: 1;">
<div style="background: rgba(245,158,11,0.04); border: 1pt solid rgba(245,158,11,0.14); border-radius: 6pt; padding: 7pt 8pt;">
<div style="display: flex; align-items: center; gap: 4pt; margin-bottom: 4pt;">
<svg viewBox="0 0 14 14" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="7" cy="7" r="5.5" fill="none" stroke="#F59E0B" stroke-width="1" opacity="0.5"/>
<line x1="7" y1="4.5" x2="7" y2="9.5" stroke="#F59E0B" stroke-width="1" stroke-linecap="round"/>
<line x1="4.5" y1="7" x2="9.5" y2="7" stroke="#F59E0B" stroke-width="1" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: #F59E0B;">추가 옵션 (선택)</p>
</div>
<div style="display: flex; flex-direction: column; gap: 3pt;">
<div style="display: flex; justify-content: space-between;">
<p style="white-space: nowrap; font-size: 6pt; color: #64748B;">생산공정 관리</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #F59E0B;">+500만원</p>
</div>
<div style="display: flex; justify-content: space-between;">
<p style="white-space: nowrap; font-size: 6pt; color: #64748B;">품질관리(인정검사)</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #F59E0B;">+2,000만원</p>
</div>
<div style="display: flex; justify-content: space-between;">
<p style="white-space: nowrap; font-size: 6pt; color: #64748B;">AI 견적 자동 생성</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #F59E0B;">월 10~20만원</p>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: #E2E8F0; margin-bottom: 8pt;"></div>
<!-- 도입 프로세스 (SVG 화살표 연결) -->
<div style="margin-bottom: 6pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #10B981; margin-bottom: 5pt;">도입 프로세스</p>
<div style="display: flex; gap: 2pt; align-items: center;">
<div style="flex: 1; border-radius: 5pt; padding: 4pt 2pt; text-align: center; background: rgba(14,165,233,0.05); border: 1pt solid rgba(14,165,233,0.15);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<circle cx="8" cy="5" r="3" fill="none" stroke="#0EA5E9" stroke-width="0.8"/>
<path d="M4 14 Q4 10 8 10 Q12 10 12 14" fill="none" stroke="#0EA5E9" stroke-width="0.8"/>
<path d="M13 5 L15 5 M14 4 L14 6" stroke="#0EA5E9" stroke-width="0.6" stroke-linecap="round" opacity="0.6"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: #94A3B8;">1~2주</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: #475569;">현장 인터뷰</p>
</div>
<svg viewBox="0 0 8 8" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M2 4 L6 4 M5 2.5 L6.5 4 L5 5.5" fill="none" stroke="#CBD5E1" stroke-width="0.8" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div style="flex: 1; border-radius: 5pt; padding: 4pt 2pt; text-align: center; background: rgba(16,185,129,0.05); border: 1pt solid rgba(16,185,129,0.15);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<rect x="3" y="2" width="10" height="12" rx="1.5" fill="none" stroke="#10B981" stroke-width="0.8"/>
<line x1="6" y1="5" x2="10" y2="5" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
<line x1="6" y1="7" x2="10" y2="7" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
<line x1="6" y1="9" x2="10" y2="9" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
<line x1="6" y1="11" x2="9" y2="11" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: #94A3B8;">2~4주</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: #475569;">맞춤 개발</p>
</div>
<svg viewBox="0 0 8 8" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M2 4 L6 4 M5 2.5 L6.5 4 L5 5.5" fill="none" stroke="#CBD5E1" stroke-width="0.8" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div style="flex: 1; border-radius: 5pt; padding: 4pt 2pt; text-align: center; background: rgba(139,92,246,0.05); border: 1pt solid rgba(139,92,246,0.15);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<rect x="2" y="3" width="5" height="10" rx="1" fill="none" stroke="#8B5CF6" stroke-width="0.8" opacity="0.5"/>
<rect x="9" y="3" width="5" height="10" rx="1" fill="none" stroke="#8B5CF6" stroke-width="0.8"/>
<path d="M7 7 L9 8 M7 8 L9 7" stroke="#8B5CF6" stroke-width="0.5" opacity="0.4"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: #94A3B8;">1~2주</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: #475569;">데이터 이관</p>
</div>
<svg viewBox="0 0 8 8" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M2 4 L6 4 M5 2.5 L6.5 4 L5 5.5" fill="none" stroke="#CBD5E1" stroke-width="0.8" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div style="flex: 1; border-radius: 5pt; padding: 4pt 2pt; text-align: center; background: rgba(245,158,11,0.05); border: 1pt solid rgba(245,158,11,0.15);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<path d="M8 2 L14 8 L8 14 L2 8 Z" fill="none" stroke="#F59E0B" stroke-width="0.8"/>
<path d="M5.5 8 L7 9.5 L10.5 6" fill="none" stroke="#F59E0B" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: #94A3B8;">1~2주</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: #475569;">교육/안정화</p>
</div>
</div>
</div>
<!-- CTA 푸터 -->
<div style="margin-top: auto; background: rgba(14,165,233,0.04); border: 1.5pt solid rgba(14,165,233,0.15); border-radius: 7pt; padding: 9pt 12pt;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<div style="display: flex; align-items: center; gap: 6pt;">
<svg viewBox="0 0 22 22" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="11" cy="11" r="9" fill="none" stroke="#0EA5E9" stroke-width="1.2" opacity="0.5"/>
<path d="M11 6 L11 11 L15 13" fill="none" stroke="#0EA5E9" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div>
<p style="white-space: nowrap; font-size: 6.5pt; color: #94A3B8; margin-top: 1pt;">대표님 전용 대시보드를 직접 체험</p>
</div>
</div>
<div style="text-align: right;">
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8; margin-top: 1pt;">www.sam.it.kr</p>
</div>
</div>
</div>
<!-- 회사명 -->
<div style="margin-top: 4pt; text-align: center;">
<p style="white-space: nowrap; font-size: 5.5pt; color: #CBD5E1;">SAM — Smart Automation Management</p>
</div>
</body>
</html>

View File

@@ -0,0 +1,260 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
width: 405pt; height: 720pt;
font-family: 'Pretendard', sans-serif;
background: #F8FAFC;
padding: 26pt 22pt 16pt 22pt;
display: flex; flex-direction: column;
}
</style>
</head>
<body>
<!-- 헤더 -->
<div style="display: flex; align-items: center; gap: 8pt; margin-bottom: 16pt;">
<img src="/home/aweso/sam/docs/assets/bi/sam_bi_black.png" style="height: 22pt;">
<div style="flex: 1;"></div>
<p style="white-space: nowrap; font-size: 6.5pt; color: #CBD5E1;">CEO DASHBOARD v4</p>
</div>
<!-- 히어로 섹션 -->
<div style="display: flex; align-items: center; gap: 14pt; margin-bottom: 18pt;">
<div style="flex: 1;">
<p style="white-space: nowrap; font-size: 8pt; font-weight: 600; color: #0EA5E9; letter-spacing: 0.1em; margin-bottom: 5pt;">EXECUTIVE DASHBOARD</p>
<h1 style="font-size: 19pt; font-weight: 800; color: #0F172A; line-height: 1.35; margin-bottom: 6pt;">대표님, 우리 회사<br>지금 어떤 상태인가요?</h1>
<p style="font-size: 8pt; color: #64748B; line-height: 1.55;">매출, 수주, 조직 실적, 승인 대기<br>더 이상 보고를 기다리지 마세요.</p>
</div>
<!-- 히어로 아이콘 -->
<div style="flex-shrink: 0; width: 80pt; height: 80pt;">
<svg viewBox="0 0 90 90" width="80pt" height="80pt" xmlns="http://www.w3.org/2000/svg">
<!-- 모니터 외곽 -->
<rect x="8" y="10" width="74" height="50" rx="5" fill="none" stroke="#0EA5E9" stroke-width="1.5" opacity="0.5"/>
<rect x="12" y="14" width="66" height="42" rx="3" fill="#FFFFFF"/>
<!-- KPI 미니 카드들 -->
<rect x="15" y="17" width="14" height="10" rx="1.5" fill="rgba(14,165,233,0.15)"/>
<rect x="31" y="17" width="14" height="10" rx="1.5" fill="rgba(16,185,129,0.15)"/>
<rect x="47" y="17" width="14" height="10" rx="1.5" fill="rgba(139,92,246,0.15)"/>
<rect x="63" y="17" width="12" height="10" rx="1.5" fill="rgba(239,68,68,0.15)"/>
<!-- 미니 차트 -->
<path d="M16 45 L22 40 L28 42 L34 36 L40 33 L46 30 L52 32 L58 26 L64 28 L70 22 L75 25" fill="none" stroke="#0EA5E9" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" opacity="0.8"/>
<path d="M16 45 L22 40 L28 42 L34 36 L40 33 L46 30 L52 32 L58 26 L64 28 L70 22 L75 25 L75 50 L16 50 Z" fill="url(#heroGrad)" opacity="0.3"/>
<!-- 모니터 받침 -->
<rect x="36" y="60" width="18" height="3" rx="1" fill="#0EA5E9" opacity="0.3"/>
<rect x="32" y="63" width="26" height="2" rx="1" fill="#0EA5E9" opacity="0.2"/>
<!-- 알림 뱃지 -->
<circle cx="73" cy="14" r="5" fill="#EF4444" opacity="0.9"/>
<text x="73" y="16.5" text-anchor="middle" fill="#fff" font-size="6" font-weight="800">5</text>
<!-- 와이파이 -->
<path d="M66 72 Q72 66 78 72" fill="none" stroke="#10B981" stroke-width="1" opacity="0.4"/>
<path d="M63 76 Q72 68 81 76" fill="none" stroke="#10B981" stroke-width="1" opacity="0.25"/>
<circle cx="72" cy="76" r="1.5" fill="#10B981" opacity="0.5"/>
<defs>
<linearGradient id="heroGrad" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#0EA5E9" stop-opacity="0.4"/>
<stop offset="100%" stop-color="#0EA5E9" stop-opacity="0"/>
</linearGradient>
</defs>
</svg>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(14,165,233,0.2); margin-bottom: 16pt;"></div>
<!-- 고민 섹션 (타임라인 인포그래픽) -->
<div style="margin-bottom: 16pt;">
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: #EF4444; margin-bottom: 8pt;">대표님의 하루</p>
<div style="display: flex; flex-direction: column; gap: 4pt;">
<!-- AM 9:00 -->
<div style="display: flex; align-items: center; gap: 6pt;">
<svg viewBox="0 0 26 26" width="18pt" height="18pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="13" cy="13" r="11" fill="rgba(239,68,68,0.06)" stroke="rgba(239,68,68,0.2)" stroke-width="1"/>
<circle cx="13" cy="13" r="8" fill="none" stroke="#EF4444" stroke-width="0.8" opacity="0.4"/>
<path d="M13 7 L13 13 L17 15" fill="none" stroke="#EF4444" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
<text x="13" y="22" text-anchor="middle" fill="#EF4444" font-size="3.5" font-weight="600" opacity="0.7">9AM</text>
</svg>
<div style="flex: 1; background: rgba(239,68,68,0.04); border: 1pt solid rgba(239,68,68,0.1); border-radius: 4pt; padding: 6pt 8pt;">
<p style="font-size: 7.5pt; color: #475569; white-space: nowrap;">"어제 매출 얼마야?" → <span style="color: #EF4444; font-weight: 600;">팀장 보고 대기중...</span></p>
</div>
</div>
<!-- PM 2:00 -->
<div style="display: flex; align-items: center; gap: 6pt;">
<svg viewBox="0 0 26 26" width="18pt" height="18pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="13" cy="13" r="11" fill="rgba(239,68,68,0.06)" stroke="rgba(239,68,68,0.2)" stroke-width="1"/>
<circle cx="13" cy="13" r="8" fill="none" stroke="#EF4444" stroke-width="0.8" opacity="0.4"/>
<path d="M13 7 L13 13 L9 16" fill="none" stroke="#EF4444" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
<text x="13" y="22" text-anchor="middle" fill="#EF4444" font-size="3.5" font-weight="600" opacity="0.7">2PM</text>
</svg>
<div style="flex: 1; background: rgba(239,68,68,0.04); border: 1pt solid rgba(239,68,68,0.1); border-radius: 4pt; padding: 6pt 8pt;">
<p style="font-size: 7.5pt; color: #475569; white-space: nowrap;">"수주 밀린 거 없어?" → <span style="color: #EF4444; font-weight: 600;">Excel 취합중...</span></p>
</div>
</div>
<!-- PM 5:00 -->
<div style="display: flex; align-items: center; gap: 6pt;">
<svg viewBox="0 0 26 26" width="18pt" height="18pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="13" cy="13" r="11" fill="rgba(239,68,68,0.06)" stroke="rgba(239,68,68,0.2)" stroke-width="1"/>
<circle cx="13" cy="13" r="8" fill="none" stroke="#EF4444" stroke-width="0.8" opacity="0.4"/>
<path d="M13 7 L13 13 L8 12" fill="none" stroke="#EF4444" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
<text x="13" y="22" text-anchor="middle" fill="#EF4444" font-size="3.5" font-weight="600" opacity="0.7">5PM</text>
</svg>
<div style="flex: 1; background: rgba(239,68,68,0.04); border: 1pt solid rgba(239,68,68,0.1); border-radius: 4pt; padding: 6pt 8pt;">
<p style="font-size: 7.5pt; color: #475569; white-space: nowrap;">"결재할 것 정리해줘" → <span style="color: #EF4444; font-weight: 600;">서류 찾는중...</span></p>
</div>
</div>
</div>
</div>
<!-- 전환 화살표 -->
<div style="text-align: center; margin-bottom: 12pt;">
<svg viewBox="0 0 40 24" width="40pt" height="16pt" xmlns="http://www.w3.org/2000/svg">
<path d="M10 6 L20 18 L30 6" fill="none" stroke="#0EA5E9" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" opacity="0.6"/>
</svg>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: #0EA5E9;">SAM 도입 후</p>
</div>
<!-- 대시보드 Mock UI -->
<div style="background: #FFFFFF; border: 1pt solid #E2E8F0; border-radius: 7pt; padding: 9pt; margin-bottom: 16pt; box-shadow: 0 1pt 4pt rgba(0,0,0,0.06);">
<!-- 타이틀바 -->
<div style="display: flex; align-items: center; gap: 3pt; margin-bottom: 6pt;">
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #EF4444;"></div>
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #F59E0B;"></div>
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #10B981;"></div>
<p style="white-space: nowrap; font-size: 5.5pt; color: #94A3B8; margin-left: 5pt;">SAM CEO Dashboard ― 로그인 후 3초</p>
</div>
<!-- KPI 카드 (SVG 아이콘 포함) -->
<div style="display: flex; gap: 3pt; margin-bottom: 5pt;">
<div style="flex: 1; background: rgba(14,165,233,0.06); border: 1pt solid rgba(14,165,233,0.15); border-radius: 4pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<rect x="2" y="9" width="3" height="5" rx="0.5" fill="#0EA5E9" opacity="0.4"/>
<rect x="6" y="5" width="3" height="9" rx="0.5" fill="#0EA5E9" opacity="0.7"/>
<rect x="10" y="2" width="3" height="12" rx="0.5" fill="#0EA5E9"/>
</svg>
<p style="white-space: nowrap; font-size: 11pt; font-weight: 800; color: #0F172A;">5.2억</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">&#9650; 15.3%</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #0EA5E9; font-weight: 600; margin-top: 1pt;">월 매출</p>
</div>
<div style="flex: 1; background: rgba(16,185,129,0.06); border: 1pt solid rgba(16,185,129,0.15); border-radius: 4pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<rect x="2" y="2" width="12" height="12" rx="2" fill="none" stroke="#10B981" stroke-width="1" opacity="0.5"/>
<path d="M5 8 L7 10 L11 6" fill="none" stroke="#10B981" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 11pt; font-weight: 800; color: #0F172A;">127건</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">&#9650; 8건</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #10B981; font-weight: 600; margin-top: 1pt;">누적 수주</p>
</div>
<div style="flex: 1; background: rgba(139,92,246,0.06); border: 1pt solid rgba(139,92,246,0.15); border-radius: 4pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<circle cx="8" cy="8" r="5.5" fill="none" stroke="#8B5CF6" stroke-width="1" opacity="0.3"/>
<circle cx="8" cy="8" r="5.5" fill="none" stroke="#8B5CF6" stroke-width="1.5" stroke-dasharray="32 35" stroke-dashoffset="-9" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 11pt; font-weight: 800; color: #0F172A;">96%</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">목표 달성</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #8B5CF6; font-weight: 600; margin-top: 1pt;">납기 준수율</p>
</div>
<div style="flex: 1; background: rgba(239,68,68,0.06); border: 1pt solid rgba(239,68,68,0.15); border-radius: 4pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<path d="M8 2 L14 12 L2 12 Z" fill="none" stroke="#EF4444" stroke-width="1" stroke-linejoin="round"/>
<line x1="8" y1="6" x2="8" y2="9" stroke="#EF4444" stroke-width="1.2" stroke-linecap="round"/>
<circle cx="8" cy="10.5" r="0.6" fill="#EF4444"/>
</svg>
<p style="white-space: nowrap; font-size: 11pt; font-weight: 800; color: #EF4444;">5건</p>
<p style="white-space: nowrap; font-size: 5pt; color: #EF4444; font-weight: 700;">즉시 처리</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #EF4444; font-weight: 600; margin-top: 1pt;">승인 대기</p>
</div>
</div>
<!-- 라인 차트 + 도넛 -->
<div style="display: flex; gap: 4pt;">
<div style="flex: 3; background: #F8FAFC; border-radius: 3pt; padding: 4pt 5pt;">
<p style="white-space: nowrap; font-size: 5pt; color: #94A3B8; margin-bottom: 2pt;">월별 매출 추이</p>
<svg viewBox="0 0 150 35" width="100%" height="26pt" xmlns="http://www.w3.org/2000/svg">
<line x1="0" y1="10" x2="150" y2="10" stroke="rgba(15,23,42,0.05)" stroke-width="0.5"/>
<line x1="0" y1="20" x2="150" y2="20" stroke="rgba(15,23,42,0.05)" stroke-width="0.5"/>
<path d="M5 30 L18 24 L31 26 L44 20 L57 16 L70 12 L83 14 L96 8 L109 10 L122 4 L135 7 L135 33 L5 33 Z" fill="url(#fGrad)" opacity="0.35"/>
<path d="M5 30 L18 24 L31 26 L44 20 L57 16 L70 12 L83 14 L96 8 L109 10 L122 4 L135 7" fill="none" stroke="#0EA5E9" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="122" cy="4" r="2" fill="#0EA5E9"/>
<defs>
<linearGradient id="fGrad" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#0EA5E9" stop-opacity="0.25"/>
<stop offset="100%" stop-color="#0EA5E9" stop-opacity="0"/>
</linearGradient>
</defs>
</svg>
</div>
<div style="flex: 2; background: #F8FAFC; border-radius: 3pt; padding: 4pt 5pt; display: flex; align-items: center; gap: 4pt;">
<svg viewBox="0 0 40 40" width="30pt" height="30pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="20" cy="20" r="14" fill="none" stroke="rgba(15,23,42,0.06)" stroke-width="4.5"/>
<circle cx="20" cy="20" r="14" fill="none" stroke="#0EA5E9" stroke-width="4.5" stroke-dasharray="33 55" stroke-dashoffset="22" stroke-linecap="round"/>
<circle cx="20" cy="20" r="14" fill="none" stroke="#10B981" stroke-width="4.5" stroke-dasharray="22 66" stroke-dashoffset="-11" stroke-linecap="round"/>
<circle cx="20" cy="20" r="14" fill="none" stroke="#8B5CF6" stroke-width="4.5" stroke-dasharray="19 69" stroke-dashoffset="-33" stroke-linecap="round"/>
<circle cx="20" cy="20" r="14" fill="none" stroke="#F59E0B" stroke-width="4.5" stroke-dasharray="12 76" stroke-dashoffset="-52" stroke-linecap="round"/>
</svg>
<div style="display: flex; flex-direction: column; gap: 2pt;">
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #0EA5E9; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4.5pt; color: #64748B;">영업1팀</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #10B981; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4.5pt; color: #64748B;">영업2팀</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #8B5CF6; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4.5pt; color: #64748B;">생산팀</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #F59E0B; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4.5pt; color: #64748B;">품질팀</p>
</div>
</div>
</div>
</div>
</div>
<!-- 약속 박스 -->
<div style="background: rgba(14,165,233,0.04); border: 1pt solid rgba(14,165,233,0.15); border-radius: 7pt; padding: 10pt 12pt; margin-bottom: 12pt;">
<div style="display: flex; align-items: center; gap: 6pt;">
<svg viewBox="0 0 22 22" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="11" cy="11" r="9" fill="none" stroke="#0EA5E9" stroke-width="1.2" opacity="0.4"/>
<path d="M7 11 L10 14 L15 8" fill="none" stroke="#0EA5E9" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: #0EA5E9;">SAM 대시보드가 드리는 약속</p>
<p style="font-size: 7pt; color: #64748B; margin-top: 2pt; line-height: 1.5;">로그인 한 번이면 전사 매출, 수주, 승인 대기를 한눈에.<br>보고를 기다리는 시간을 제로로 만들어 드립니다.</p>
</div>
</div>
</div>
<!-- 기술 태그 -->
<div style="display: flex; gap: 4pt; margin-bottom: 8pt;">
<div style="display: flex; align-items: center; gap: 2pt; background: #F1F5F9; border-radius: 3pt; padding: 3pt 6pt;">
<svg viewBox="0 0 8 8" width="5pt" height="5pt" xmlns="http://www.w3.org/2000/svg"><path d="M2 6 Q4 2 6 6" fill="none" stroke="#94A3B8" stroke-width="0.7"/><path d="M3 6 Q4 4 5 6" fill="none" stroke="#94A3B8" stroke-width="0.7"/><circle cx="4" cy="6.5" r="0.6" fill="#94A3B8"/></svg>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">클라우드 기반</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: #F1F5F9; border-radius: 3pt; padding: 3pt 6pt;">
<svg viewBox="0 0 8 8" width="5pt" height="5pt" xmlns="http://www.w3.org/2000/svg"><rect x="2" y="0.5" width="4" height="7" rx="0.8" fill="none" stroke="#94A3B8" stroke-width="0.7"/><circle cx="4" cy="6.5" r="0.4" fill="#94A3B8"/></svg>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">PC + 모바일</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: #F1F5F9; border-radius: 3pt; padding: 3pt 6pt;">
<svg viewBox="0 0 8 8" width="5pt" height="5pt" xmlns="http://www.w3.org/2000/svg"><rect x="1" y="1.5" width="6" height="5" rx="0.8" fill="none" stroke="#94A3B8" stroke-width="0.7"/><circle cx="4" cy="4" r="1.2" fill="none" stroke="#94A3B8" stroke-width="0.5"/></svg>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">역할별 권한</p>
</div>
</div>
<!-- 푸터 -->
<div style="margin-top: auto; border-top: 1pt solid #E2E8F0; padding-top: 8pt;">
<div style="display: flex; justify-content: space-between; align-items: flex-end;">
<div>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: #475569;">SAM</p>
<p style="white-space: nowrap; font-size: 6.5pt; color: #CBD5E1; margin-top: 2pt;">www.sam.it.kr</p>
</div>
<div style="text-align: right;">
<p style="white-space: nowrap; font-size: 6.5pt; color: #94A3B8;">뒷면에서 상세 기능을 확인하세요 &#9654;</p>
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,52 @@
const path = require('path');
module.paths.unshift(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/node_modules'));
const PptxGenJS = require('pptxgenjs');
const html2pptx = require(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/html2pptx.js'));
const sharp = require('sharp');
async function generateGradientBg() {
const svgGradient = `<svg width="810" height="1440" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient id="bg" x1="0.087" y1="0" x2="-0.087" y2="1">
<stop offset="0%" stop-color="#0F172A"/>
<stop offset="55%" stop-color="#1E1B4B"/>
<stop offset="100%" stop-color="#312E81"/>
</linearGradient>
</defs>
<rect width="810" height="1440" fill="url(#bg)"/>
</svg>`;
const buf = await sharp(Buffer.from(svgGradient)).png().toBuffer();
return buf.toString('base64');
}
async function main() {
const pres = new PptxGenJS();
pres.defineLayout({ name: 'PORTRAIT_9x16', width: 5.625, height: 10 });
pres.layout = 'PORTRAIT_9x16';
// Pre-generate gradient background PNG
console.log('Generating gradient background...');
const bgBase64 = await generateGradientBg();
const htmlFile = path.join(__dirname, 'slides', 'brochure-dashboard-1page.html');
console.log('Converting CEO Dashboard v5 (Premium Gradient) 1-page brochure...');
try {
await html2pptx(htmlFile, pres);
} catch (err) {
console.error(`Error: ${err.message}`);
}
// Set gradient background on each slide
for (const slide of pres.slides) {
slide.background = { data: `image/png;base64,${bgBase64}` };
}
const outputPath = path.join(__dirname, 'sam-brochure-v5-dashboard-1page.pptx');
await pres.writeFile({ fileName: outputPath });
console.log(`\nPPTX created: ${outputPath}`);
}
main().catch(console.error);

View File

@@ -0,0 +1,56 @@
const path = require('path');
module.paths.unshift(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/node_modules'));
const PptxGenJS = require('pptxgenjs');
const html2pptx = require(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/html2pptx.js'));
const sharp = require('sharp');
async function generateGradientBg() {
const svgGradient = `<svg width="810" height="1440" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient id="bg" x1="0.087" y1="0" x2="-0.087" y2="1">
<stop offset="0%" stop-color="#0F172A"/>
<stop offset="55%" stop-color="#1E1B4B"/>
<stop offset="100%" stop-color="#312E81"/>
</linearGradient>
</defs>
<rect width="810" height="1440" fill="url(#bg)"/>
</svg>`;
const buf = await sharp(Buffer.from(svgGradient)).png().toBuffer();
return buf.toString('base64');
}
async function main() {
const pres = new PptxGenJS();
pres.defineLayout({ name: 'PORTRAIT_9x16', width: 5.625, height: 10 });
pres.layout = 'PORTRAIT_9x16';
// Pre-generate gradient background PNG
console.log('Generating gradient background...');
const bgBase64 = await generateGradientBg();
const slidesDir = path.join(__dirname, 'slides');
const slides = ['brochure-dashboard-front.html', 'brochure-dashboard-back.html'];
for (const file of slides) {
const htmlFile = path.join(slidesDir, file);
console.log(`Converting ${file} ...`);
try {
await html2pptx(htmlFile, pres);
} catch (err) {
console.error(`Error on ${file}: ${err.message}`);
}
}
// Set gradient background on each slide
for (const slide of pres.slides) {
slide.background = { data: `image/png;base64,${bgBase64}` };
}
const outputPath = path.join(__dirname, 'sam-brochure-v5-dashboard-2page.pptx');
await pres.writeFile({ fileName: outputPath });
console.log(`\nPPTX created: ${outputPath}`);
}
main().catch(console.error);

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,317 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
width: 405pt; height: 720pt;
font-family: 'Pretendard', sans-serif;
background: #1A1640;
padding: 22pt 20pt 12pt 20pt;
display: flex; flex-direction: column;
}
</style>
</head>
<body>
<!-- 헤더 -->
<div style="display: flex; align-items: center; gap: 8pt; margin-bottom: 10pt;">
<img src="/home/aweso/sam/docs/assets/bi/sam_bi_white.png" style="height: 20pt;">
<div style="flex: 1;"></div>
<div style="background: rgba(251,191,36,0.12); border: 1pt solid rgba(251,191,36,0.25); border-radius: 3pt; padding: 2pt 7pt;">
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 700; color: #FBBF24; letter-spacing: 0.08em;">EXECUTIVE EDITION</p>
</div>
</div>
<!-- 히어로 -->
<div style="display: flex; align-items: center; gap: 12pt; margin-bottom: 12pt;">
<div style="flex: 1;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 600; color: #FBBF24; letter-spacing: 0.12em; margin-bottom: 3pt;">CEO DASHBOARD</p>
<h1 style="font-size: 16pt; font-weight: 800; color: #ffffff; line-height: 1.35; margin-bottom: 5pt;">대표님의 시간은<br>보고를 기다리는 데<br>쓰여선 안 됩니다.</h1>
<p style="font-size: 7.5pt; color: rgba(255,255,255,0.45); line-height: 1.5;">로그인 3초. 매출, 수주, 승인까지<br>모든 경영 현황이 한 화면에.</p>
</div>
<!-- 히어로 SVG 아이콘 -->
<div style="flex-shrink: 0; width: 68pt; height: 68pt;">
<svg viewBox="0 0 80 80" width="68pt" height="68pt" xmlns="http://www.w3.org/2000/svg">
<rect x="8" y="10" width="64" height="44" rx="4" fill="none" stroke="#FBBF24" stroke-width="1.5" opacity="0.5"/>
<rect x="12" y="14" width="56" height="36" rx="2" fill="rgba(255,255,255,0.04)"/>
<rect x="16" y="38" width="6" height="8" rx="1" fill="#FBBF24" opacity="0.35"/>
<rect x="24" y="34" width="6" height="12" rx="1" fill="#FBBF24" opacity="0.5"/>
<rect x="32" y="30" width="6" height="16" rx="1" fill="#FBBF24" opacity="0.65"/>
<rect x="40" y="26" width="6" height="20" rx="1" fill="#FBBF24" opacity="0.8"/>
<rect x="48" y="22" width="6" height="24" rx="1" fill="#FBBF24"/>
<rect x="56" y="28" width="6" height="18" rx="1" fill="#10B981" opacity="0.7"/>
<circle cx="18" cy="20" r="3" fill="#10B981" opacity="0.6"/>
<circle cx="28" cy="20" r="3" fill="#8B5CF6" opacity="0.6"/>
<circle cx="38" cy="20" r="3" fill="#F59E0B" opacity="0.6"/>
<circle cx="48" cy="20" r="3" fill="#EF4444" opacity="0.6"/>
<rect x="32" y="54" width="16" height="3" rx="1" fill="#FBBF24" opacity="0.3"/>
<rect x="28" y="57" width="24" height="2" rx="1" fill="#FBBF24" opacity="0.2"/>
</svg>
</div>
</div>
<!-- 구분선 -->
<div style="display: flex; align-items: center; gap: 6pt; margin-bottom: 10pt;">
<div style="flex: 1; height: 1pt; background: rgba(251,191,36,0.15);"></div>
<div style="background: rgba(251,191,36,0.1); border: 1pt solid rgba(251,191,36,0.2); border-radius: 4pt; padding: 2pt 8pt;">
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #FBBF24;">SAM 도입 후</p>
</div>
<div style="flex: 1; height: 1pt; background: rgba(251,191,36,0.15);"></div>
</div>
<!-- 대시보드 Mock UI (글래스모피즘) -->
<div style="background: rgba(255,255,255,0.05); border: 1pt solid rgba(255,255,255,0.1); border-radius: 7pt; padding: 7pt; margin-bottom: 9pt;">
<!-- 타이틀바 -->
<div style="display: flex; align-items: center; gap: 3pt; margin-bottom: 5pt;">
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #EF4444;"></div>
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #F59E0B;"></div>
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #10B981;"></div>
<p style="white-space: nowrap; font-size: 5pt; color: rgba(255,255,255,0.2); margin-left: 5pt;">SAM CEO Dashboard</p>
</div>
<!-- KPI 카드 -->
<div style="display: flex; gap: 3pt; margin-bottom: 5pt;">
<div style="flex: 1; background: rgba(251,191,36,0.08); border: 1pt solid rgba(251,191,36,0.15); border-radius: 4pt; padding: 5pt 3pt; text-align: center;">
<p style="white-space: nowrap; font-size: 10pt; font-weight: 800; color: #FBBF24;">5.2억</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #10B981; font-weight: 700;">&#9650; 15.3%</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: rgba(255,255,255,0.4); font-weight: 600; margin-top: 1pt;">월 매출</p>
</div>
<div style="flex: 1; background: rgba(16,185,129,0.08); border: 1pt solid rgba(16,185,129,0.15); border-radius: 4pt; padding: 5pt 3pt; text-align: center;">
<p style="white-space: nowrap; font-size: 10pt; font-weight: 800; color: #fff;">127건</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #10B981; font-weight: 700;">&#9650; 8건</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: rgba(255,255,255,0.4); font-weight: 600; margin-top: 1pt;">누적 수주</p>
</div>
<div style="flex: 1; background: rgba(139,92,246,0.08); border: 1pt solid rgba(139,92,246,0.15); border-radius: 4pt; padding: 5pt 3pt; text-align: center;">
<p style="white-space: nowrap; font-size: 10pt; font-weight: 800; color: #fff;">96%</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #10B981; font-weight: 700;">목표 달성</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: rgba(255,255,255,0.4); font-weight: 600; margin-top: 1pt;">납기 준수율</p>
</div>
<div style="flex: 1; background: rgba(239,68,68,0.1); border: 1pt solid rgba(239,68,68,0.2); border-radius: 4pt; padding: 5pt 3pt; text-align: center;">
<p style="white-space: nowrap; font-size: 10pt; font-weight: 800; color: #EF4444;">5건</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #EF4444; font-weight: 700;">즉시 처리</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: rgba(255,255,255,0.4); font-weight: 600; margin-top: 1pt;">승인 대기</p>
</div>
</div>
<!-- 차트 -->
<div style="display: flex; gap: 4pt;">
<div style="flex: 3; background: rgba(255,255,255,0.03); border-radius: 4pt; padding: 4pt 5pt;">
<p style="white-space: nowrap; font-size: 4.5pt; color: rgba(255,255,255,0.25); margin-bottom: 2pt;">월별 매출 추이</p>
<svg viewBox="0 0 150 30" width="100%" height="22pt" xmlns="http://www.w3.org/2000/svg">
<line x1="0" y1="10" x2="150" y2="10" stroke="rgba(255,255,255,0.04)" stroke-width="0.5"/>
<line x1="0" y1="20" x2="150" y2="20" stroke="rgba(255,255,255,0.04)" stroke-width="0.5"/>
<path d="M5 26 L18 20 L31 22 L44 17 L57 14 L70 10 L83 12 L96 7 L109 8 L122 3 L135 6 L135 28 L5 28 Z" fill="url(#fGrad5p)" opacity="0.4"/>
<path d="M5 26 L18 20 L31 22 L44 17 L57 14 L70 10 L83 12 L96 7 L109 8 L122 3 L135 6" fill="none" stroke="#FBBF24" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="122" cy="3" r="2" fill="#FBBF24"/>
<defs>
<linearGradient id="fGrad5p" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#FBBF24" stop-opacity="0.3"/>
<stop offset="100%" stop-color="#FBBF24" stop-opacity="0"/>
</linearGradient>
</defs>
</svg>
</div>
<div style="flex: 2; background: rgba(255,255,255,0.03); border-radius: 4pt; padding: 4pt 5pt; display: flex; align-items: center; gap: 5pt;">
<svg viewBox="0 0 40 40" width="28pt" height="28pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="20" cy="20" r="14" fill="none" stroke="rgba(255,255,255,0.06)" stroke-width="5"/>
<circle cx="20" cy="20" r="14" fill="none" stroke="#FBBF24" stroke-width="5" stroke-dasharray="33 55" stroke-dashoffset="22" stroke-linecap="round"/>
<circle cx="20" cy="20" r="14" fill="none" stroke="#10B981" stroke-width="5" stroke-dasharray="22 66" stroke-dashoffset="-11" stroke-linecap="round"/>
<circle cx="20" cy="20" r="14" fill="none" stroke="#8B5CF6" stroke-width="5" stroke-dasharray="19 69" stroke-dashoffset="-33" stroke-linecap="round"/>
</svg>
<div style="display: flex; flex-direction: column; gap: 2pt;">
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #FBBF24; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4.5pt; color: rgba(255,255,255,0.4);">영업1팀</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #10B981; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4.5pt; color: rgba(255,255,255,0.4);">영업2팀</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #8B5CF6; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4.5pt; color: rgba(255,255,255,0.4);">생산팀</p>
</div>
</div>
</div>
</div>
</div>
<!-- 핵심 가치 3개 -->
<div style="margin-bottom: 9pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #FBBF24; margin-bottom: 5pt;">대표님이 얻는 것</p>
<div style="display: flex; gap: 4pt;">
<div style="flex: 1; background: rgba(251,191,36,0.06); border: 1pt solid rgba(251,191,36,0.12); border-radius: 5pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 24 24" width="15pt" height="15pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="12" cy="12" r="8" fill="none" stroke="#FBBF24" stroke-width="1.2" opacity="0.4"/>
<path d="M12 7 L12 12 L15 14" fill="none" stroke="#FBBF24" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="12" cy="12" r="1.2" fill="#FBBF24"/>
</svg>
<p style="font-size: 7pt; font-weight: 700; color: #FBBF24; white-space: nowrap;">즉시 현황 파악</p>
<p style="white-space: nowrap; font-size: 5pt; color: rgba(255,255,255,0.35); margin-top: 2pt;">로그인 3초면 전사 확인</p>
</div>
<div style="flex: 1; background: rgba(16,185,129,0.06); border: 1pt solid rgba(16,185,129,0.12); border-radius: 5pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 24 24" width="15pt" height="15pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="12" cy="10" r="6" fill="none" stroke="#10B981" stroke-width="1.2" opacity="0.4"/>
<path d="M9 7 Q12 5 15 7" fill="none" stroke="#10B981" stroke-width="0.8" stroke-linecap="round"/>
<path d="M9 10 Q12 8 15 10" fill="none" stroke="#10B981" stroke-width="0.8" stroke-linecap="round"/>
<path d="M9 13 Q12 11 15 13" fill="none" stroke="#10B981" stroke-width="0.8" stroke-linecap="round"/>
<circle cx="8" cy="19" r="1" fill="#10B981" opacity="0.5"/>
<circle cx="12" cy="19" r="1" fill="#10B981" opacity="0.7"/>
<circle cx="16" cy="19" r="1" fill="#10B981"/>
</svg>
<p style="font-size: 7pt; font-weight: 700; color: #10B981; white-space: nowrap;">데이터로 판단</p>
<p style="white-space: nowrap; font-size: 5pt; color: rgba(255,255,255,0.35); margin-top: 2pt;">감이 아닌 KPI 비교</p>
</div>
<div style="flex: 1; background: rgba(139,92,246,0.06); border: 1pt solid rgba(139,92,246,0.12); border-radius: 5pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 24 24" width="15pt" height="15pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="12" cy="12" r="7" fill="none" stroke="#8B5CF6" stroke-width="1.2" opacity="0.4"/>
<path d="M8 12 L11 15 L16 9" fill="none" stroke="#8B5CF6" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="font-size: 7pt; font-weight: 700; color: #8B5CF6; white-space: nowrap;">모바일 승인</p>
<p style="white-space: nowrap; font-size: 5pt; color: rgba(255,255,255,0.35); margin-top: 2pt;">이동중 즉시 결재</p>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(251,191,36,0.1); margin-bottom: 9pt;"></div>
<!-- 대시보드 6대 기능 -->
<div style="margin-bottom: 9pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #FBBF24; margin-bottom: 5pt;">대시보드 핵심 기능</p>
<div style="display: flex; flex-direction: column; gap: 2pt;">
<div style="display: flex; gap: 2pt;">
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: rgba(255,255,255,0.04); border: 1pt solid rgba(255,255,255,0.07); border-radius: 4pt; padding: 4pt 6pt;">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<rect x="2" y="10" width="3" height="6" rx="0.5" fill="#FBBF24" opacity="0.5"/>
<rect x="7" y="6" width="3" height="10" rx="0.5" fill="#FBBF24" opacity="0.75"/>
<rect x="12" y="2" width="3" height="14" rx="0.5" fill="#FBBF24"/>
</svg>
<p style="font-size: 6.5pt; color: rgba(255,255,255,0.6); white-space: nowrap;">실시간 <span style="color: #FBBF24; font-weight: 700;">매출/수주 KPI</span></p>
</div>
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: rgba(255,255,255,0.04); border: 1pt solid rgba(255,255,255,0.07); border-radius: 4pt; padding: 4pt 6pt;">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="9" cy="4" r="2.5" fill="none" stroke="#10B981" stroke-width="1"/>
<line x1="9" y1="6.5" x2="9" y2="9" stroke="#10B981" stroke-width="0.8"/>
<line x1="4" y1="9" x2="14" y2="9" stroke="#10B981" stroke-width="0.8"/>
<circle cx="4" cy="12" r="2" fill="none" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<circle cx="9" cy="12" r="2" fill="none" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<circle cx="14" cy="12" r="2" fill="none" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
</svg>
<p style="font-size: 6.5pt; color: rgba(255,255,255,0.6); white-space: nowrap;">조직 계층별 <span style="color: #10B981; font-weight: 700;">실적 트리</span></p>
</div>
</div>
<div style="display: flex; gap: 2pt;">
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: rgba(255,255,255,0.04); border: 1pt solid rgba(255,255,255,0.07); border-radius: 4pt; padding: 4pt 6pt;">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="9" cy="9" r="7" fill="none" stroke="#8B5CF6" stroke-width="1" opacity="0.3"/>
<text x="9" y="11.5" text-anchor="middle" fill="#8B5CF6" font-size="8" font-weight="800">&#8361;</text>
</svg>
<p style="font-size: 6.5pt; color: rgba(255,255,255,0.6); white-space: nowrap;">역할별 <span style="color: #8B5CF6; font-weight: 700;">수당 현황</span></p>
</div>
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: rgba(255,255,255,0.04); border: 1pt solid rgba(255,255,255,0.07); border-radius: 4pt; padding: 4pt 6pt;">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<path d="M9 3 C5 3 3 6 3 9 L3 12 L2 13 L16 13 L15 12 L15 9 C15 6 13 3 9 3 Z" fill="none" stroke="#EF4444" stroke-width="1" opacity="0.6"/>
<circle cx="13" cy="5" r="3" fill="#EF4444"/>
<text x="13" y="6.5" text-anchor="middle" fill="#fff" font-size="4" font-weight="700">5</text>
</svg>
<p style="font-size: 6.5pt; color: rgba(255,255,255,0.6); white-space: nowrap;">미승인 <span style="color: #EF4444; font-weight: 700;">실시간 알림</span></p>
</div>
</div>
<div style="display: flex; gap: 2pt;">
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: rgba(255,255,255,0.04); border: 1pt solid rgba(255,255,255,0.07); border-radius: 4pt; padding: 4pt 6pt;">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<path d="M3 14 L7 10 L10 12 L15 5" fill="none" stroke="#F59E0B" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M12 5 L15 5 L15 8" fill="none" stroke="#F59E0B" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="font-size: 6.5pt; color: rgba(255,255,255,0.6); white-space: nowrap;">기간별 <span style="color: #F59E0B; font-weight: 700;">트렌드 분석</span></p>
</div>
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: rgba(255,255,255,0.04); border: 1pt solid rgba(255,255,255,0.07); border-radius: 4pt; padding: 4pt 6pt;">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<rect x="2" y="3" width="14" height="12" rx="1.5" fill="none" stroke="#EC4899" stroke-width="1" opacity="0.5"/>
<line x1="5" y1="7" x2="13" y2="7" stroke="#EC4899" stroke-width="0.6" opacity="0.3"/>
<line x1="5" y1="9" x2="11" y2="9" stroke="#EC4899" stroke-width="0.6" opacity="0.3"/>
<circle cx="14" cy="13" r="3.5" fill="#1E1B4B" stroke="#EC4899" stroke-width="0.8"/>
<path d="M13 13 L15 13 M14 12 L14 14" stroke="#EC4899" stroke-width="0.8" stroke-linecap="round"/>
</svg>
<p style="font-size: 6.5pt; color: rgba(255,255,255,0.6); white-space: nowrap;">수익 <span style="color: #EC4899; font-weight: 700;">시뮬레이터</span></p>
</div>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(255,255,255,0.05); margin-bottom: 9pt;"></div>
<!-- Before → After -->
<div style="display: flex; gap: 4pt; margin-bottom: 9pt;">
<!-- Before -->
<div style="flex: 5; background: rgba(239,68,68,0.06); border: 1pt solid rgba(239,68,68,0.12); border-radius: 5pt; padding: 5pt 6pt 12pt 6pt;">
<div style="display: flex; align-items: center; gap: 3pt; margin-bottom: 3pt;">
<svg viewBox="0 0 14 14" width="8pt" height="8pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="7" cy="7" r="5.5" fill="none" stroke="#EF4444" stroke-width="1"/>
<line x1="4.5" y1="4.5" x2="9.5" y2="9.5" stroke="#EF4444" stroke-width="1.2" stroke-linecap="round"/>
<line x1="9.5" y1="4.5" x2="4.5" y2="9.5" stroke="#EF4444" stroke-width="1.2" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #EF4444;">BEFORE</p>
</div>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.4);">매출? → 보고 대기 1~2일</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.4);">수주? → Excel 취합 반나절</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.4);">승인? → 서류 찾기 30분</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.4);">실적? → 각 팀장 개별 보고</p>
</div>
<!-- 화살표 -->
<div style="display: flex; align-items: center; flex-shrink: 0;">
<svg viewBox="0 0 20 20" width="14pt" height="14pt" xmlns="http://www.w3.org/2000/svg">
<path d="M4 10 L14 10" stroke="#FBBF24" stroke-width="1.5" stroke-linecap="round"/>
<path d="M11 6 L15 10 L11 14" fill="none" stroke="#FBBF24" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>
<!-- After -->
<div style="flex: 5; background: rgba(16,185,129,0.06); border: 1pt solid rgba(16,185,129,0.12); border-radius: 5pt; padding: 5pt 6pt 12pt 6pt;">
<div style="display: flex; align-items: center; gap: 3pt; margin-bottom: 3pt;">
<svg viewBox="0 0 14 14" width="8pt" height="8pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="7" cy="7" r="5.5" fill="none" stroke="#10B981" stroke-width="1"/>
<path d="M4.5 7 L6.5 9 L10 5" fill="none" stroke="#10B981" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #10B981;">AFTER (SAM)</p>
</div>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.4);">로그인 → <span style="color:#10B981;font-weight:600;">3초 전사 현황</span></p>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.4);">클릭 → <span style="color:#10B981;font-weight:600;">실시간 수주 데이터</span></p>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.4);">뱃지 → <span style="color:#10B981;font-weight:600;">즉시 승인 처리</span></p>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.4);">트리 → <span style="color:#10B981;font-weight:600;">전 조직 한눈에</span></p>
</div>
</div>
<!-- 기술 태그 -->
<div style="display: flex; gap: 3pt; margin-bottom: 6pt;">
<div style="display: flex; align-items: center; gap: 2pt; background: rgba(255,255,255,0.04); border: 1pt solid rgba(255,255,255,0.06); border-radius: 3pt; padding: 2pt 5pt;">
<svg viewBox="0 0 8 8" width="5pt" height="5pt" xmlns="http://www.w3.org/2000/svg"><path d="M2 6 Q4 2 6 6" fill="none" stroke="rgba(251,191,36,0.5)" stroke-width="0.7"/><path d="M3 6 Q4 4 5 6" fill="none" stroke="rgba(251,191,36,0.6)" stroke-width="0.7"/><circle cx="4" cy="6.5" r="0.6" fill="rgba(251,191,36,0.5)"/></svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.3);">클라우드</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: rgba(255,255,255,0.04); border: 1pt solid rgba(255,255,255,0.06); border-radius: 3pt; padding: 2pt 5pt;">
<svg viewBox="0 0 8 8" width="5pt" height="5pt" xmlns="http://www.w3.org/2000/svg"><rect x="2" y="0.5" width="4" height="7" rx="0.8" fill="none" stroke="rgba(251,191,36,0.5)" stroke-width="0.7"/><circle cx="4" cy="6.5" r="0.4" fill="rgba(251,191,36,0.5)"/></svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.3);">PC + 모바일</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: rgba(255,255,255,0.04); border: 1pt solid rgba(255,255,255,0.06); border-radius: 3pt; padding: 2pt 5pt;">
<svg viewBox="0 0 8 8" width="5pt" height="5pt" xmlns="http://www.w3.org/2000/svg"><rect x="1" y="1.5" width="6" height="5" rx="0.8" fill="none" stroke="rgba(251,191,36,0.5)" stroke-width="0.7"/><circle cx="4" cy="4" r="1.2" fill="none" stroke="rgba(251,191,36,0.6)" stroke-width="0.5"/></svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.3);">역할별 권한</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: rgba(255,255,255,0.04); border: 1pt solid rgba(255,255,255,0.06); border-radius: 3pt; padding: 2pt 5pt;">
<svg viewBox="0 0 8 8" width="5pt" height="5pt" xmlns="http://www.w3.org/2000/svg"><path d="M4 1 Q6.5 1 6.5 3.5 L6.5 4.5 Q6.5 7 4 7 Q1.5 7 1.5 4.5 L1.5 3.5 Q1.5 1 4 1 Z" fill="none" stroke="rgba(251,191,36,0.5)" stroke-width="0.7"/><line x1="4" y1="3.5" x2="4" y2="5" stroke="rgba(251,191,36,0.5)" stroke-width="0.5" stroke-linecap="round"/></svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.3);">데이터 암호화</p>
</div>
</div>
<!-- 푸터 -->
<div style="margin-top: auto; border-top: 1pt solid rgba(251,191,36,0.1); padding-top: 7pt;">
<div style="display: flex; justify-content: space-between; align-items: flex-end;">
<div>
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: rgba(255,255,255,0.6);">SAM</p>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.2); margin-top: 2pt;">www.sam.it.kr</p>
</div>
<div style="text-align: right;">
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,309 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
width: 405pt; height: 720pt;
font-family: 'Pretendard', sans-serif;
background: #1A1640;
padding: 20pt 22pt 12pt 22pt;
display: flex; flex-direction: column;
}
</style>
</head>
<body>
<!-- 헤더 -->
<div style="display: flex; align-items: center; gap: 8pt; margin-bottom: 10pt;">
<img src="/home/aweso/sam/docs/assets/bi/sam_bi_white.png" style="height: 18pt;">
<div style="flex: 1;"></div>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(251,191,36,0.4);">FEATURES &amp; PRICING</p>
</div>
<!-- 대시보드 7대 기능 -->
<div style="margin-bottom: 9pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #FBBF24; margin-bottom: 6pt;">대시보드 핵심 기능</p>
<div style="display: flex; flex-direction: column; gap: 2pt;">
<!-- 01 -->
<div style="display: flex; align-items: center; gap: 5pt; background: rgba(255,255,255,0.04); border: 1pt solid rgba(255,255,255,0.07); border-radius: 4pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<rect x="2" y="11" width="4" height="6" rx="0.5" fill="#FBBF24" opacity="0.45"/>
<rect x="8" y="7" width="4" height="10" rx="0.5" fill="#FBBF24" opacity="0.7"/>
<rect x="14" y="3" width="4" height="14" rx="0.5" fill="#FBBF24"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #fff; white-space: nowrap;">실시간 KPI 카드</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.3);">매출, 수주, 납기율, 승인 대기</p>
</div>
<!-- 02 -->
<div style="display: flex; align-items: center; gap: 5pt; background: rgba(255,255,255,0.04); border: 1pt solid rgba(255,255,255,0.07); border-radius: 4pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="10" cy="4.5" r="2.5" fill="none" stroke="#10B981" stroke-width="1.1"/>
<line x1="10" y1="7" x2="10" y2="9.5" stroke="#10B981" stroke-width="0.8"/>
<line x1="5" y1="9.5" x2="15" y2="9.5" stroke="#10B981" stroke-width="0.8"/>
<circle cx="5" cy="13" r="2" fill="none" stroke="#10B981" stroke-width="0.9" opacity="0.6"/>
<circle cx="10" cy="13" r="2" fill="none" stroke="#10B981" stroke-width="0.9" opacity="0.6"/>
<circle cx="15" cy="13" r="2" fill="none" stroke="#10B981" stroke-width="0.9" opacity="0.6"/>
<line x1="5" y1="9.5" x2="5" y2="11" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<line x1="10" y1="9.5" x2="10" y2="11" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<line x1="15" y1="9.5" x2="15" y2="11" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #fff; white-space: nowrap;">조직 실적 트리</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.3);">계층별 팀/개인 실적 펼쳐보기</p>
</div>
<!-- 03 -->
<div style="display: flex; align-items: center; gap: 5pt; background: rgba(255,255,255,0.04); border: 1pt solid rgba(255,255,255,0.07); border-radius: 4pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="10" cy="10" r="7.5" fill="none" stroke="#8B5CF6" stroke-width="1" opacity="0.3"/>
<text x="10" y="12.5" text-anchor="middle" fill="#8B5CF6" font-size="9" font-weight="800">&#8361;</text>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #fff; white-space: nowrap;">역할별 수당 현황</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.3);">판매자/관리자/협업자 배분 확인</p>
</div>
<!-- 04 -->
<div style="display: flex; align-items: center; gap: 5pt; background: rgba(255,255,255,0.04); border: 1pt solid rgba(255,255,255,0.07); border-radius: 4pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M10 3 C6 3 3 6 3 9.5 L3 13 L1.5 14.5 L18.5 14.5 L17 13 L17 9.5 C17 6 14 3 10 3 Z" fill="none" stroke="#EF4444" stroke-width="1" opacity="0.5"/>
<circle cx="15" cy="5" r="3.5" fill="#EF4444"/>
<text x="15" y="7" text-anchor="middle" fill="#fff" font-size="4.5" font-weight="800">!</text>
<path d="M7.5 15.5 Q10 18 12.5 15.5" fill="none" stroke="#EF4444" stroke-width="0.8" opacity="0.4"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #fff; white-space: nowrap;">승인 대기 알림</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.3);">가입/지급 미처리 빨간 뱃지</p>
</div>
<!-- 05 -->
<div style="display: flex; align-items: center; gap: 5pt; background: rgba(255,255,255,0.04); border: 1pt solid rgba(255,255,255,0.07); border-radius: 4pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M3 15 L7 11 L10 13 L16 5" fill="none" stroke="#F59E0B" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M13 5 L16 5 L16 8" fill="none" stroke="#F59E0B" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #fff; white-space: nowrap;">기간별 트렌드</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.3);">당월/분기/연간 추이 차트</p>
</div>
<!-- 06 -->
<div style="display: flex; align-items: center; gap: 5pt; background: rgba(255,255,255,0.04); border: 1pt solid rgba(255,255,255,0.07); border-radius: 4pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<rect x="2" y="3" width="16" height="14" rx="2" fill="none" stroke="#EC4899" stroke-width="1" opacity="0.4"/>
<line x1="5" y1="7.5" x2="15" y2="7.5" stroke="#EC4899" stroke-width="0.6" opacity="0.3"/>
<line x1="5" y1="10" x2="12" y2="10" stroke="#EC4899" stroke-width="0.6" opacity="0.3"/>
<line x1="5" y1="12.5" x2="9" y2="12.5" stroke="#EC4899" stroke-width="0.6" opacity="0.3"/>
<circle cx="15.5" cy="14.5" r="3.5" fill="#1E1B4B" stroke="#EC4899" stroke-width="0.9"/>
<path d="M14.5 14.5 L16.5 14.5 M15.5 13.5 L15.5 15.5" stroke="#EC4899" stroke-width="0.8" stroke-linecap="round"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #fff; white-space: nowrap;">수익 시뮬레이터</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.3);">가상 시나리오 수당/마진 계산</p>
</div>
<!-- 07 -->
<div style="display: flex; align-items: center; gap: 5pt; background: rgba(255,255,255,0.04); border: 1pt solid rgba(255,255,255,0.07); border-radius: 4pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<rect x="5" y="2" width="10" height="16" rx="2" fill="none" stroke="#0EA5E9" stroke-width="1" opacity="0.5"/>
<circle cx="10" cy="16" r="1" fill="#0EA5E9" opacity="0.5"/>
<rect x="7" y="5" width="6" height="8" rx="0.5" fill="rgba(14,165,233,0.15)"/>
<rect x="8" y="6" width="4" height="1.5" rx="0.3" fill="#FBBF24" opacity="0.4"/>
<rect x="8" y="8.5" width="4" height="1.5" rx="0.3" fill="#10B981" opacity="0.4"/>
<rect x="8" y="11" width="4" height="1.5" rx="0.3" fill="#8B5CF6" opacity="0.4"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #fff; white-space: nowrap;">모바일 대응</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.3);">스마트폰으로 KPI 확인/승인</p>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(251,191,36,0.1); margin-bottom: 8pt;"></div>
<!-- 역할별 맞춤 화면 -->
<div style="margin-bottom: 9pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #10B981; margin-bottom: 5pt;">역할별 맞춤 화면</p>
<div style="display: flex; gap: 4pt;">
<div style="flex: 1; background: rgba(251,191,36,0.06); border: 1pt solid rgba(251,191,36,0.12); border-radius: 5pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="12" cy="8" r="4" fill="none" stroke="#FBBF24" stroke-width="1.2"/>
<path d="M4 20 Q4 14 12 14 Q20 14 20 20" fill="none" stroke="#FBBF24" stroke-width="1.2"/>
<path d="M8 4 L12 1 L16 4" fill="none" stroke="#FBBF24" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" opacity="0.7"/>
</svg>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 800; color: #FBBF24;">CEO</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: rgba(255,255,255,0.5); margin-top: 1pt;">전사 KPI 총괄</p>
</div>
<div style="flex: 1; background: rgba(16,185,129,0.06); border: 1pt solid rgba(16,185,129,0.12); border-radius: 5pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="8" cy="8" r="3" fill="none" stroke="#10B981" stroke-width="1"/>
<circle cx="16" cy="8" r="3" fill="none" stroke="#10B981" stroke-width="1" opacity="0.6"/>
<path d="M2 18 Q2 13 8 13 Q14 13 14 18" fill="none" stroke="#10B981" stroke-width="1"/>
<path d="M12 18 Q12 13 16 13 Q22 13 22 18" fill="none" stroke="#10B981" stroke-width="1" opacity="0.5"/>
</svg>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 800; color: #10B981;">관리자</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: rgba(255,255,255,0.5); margin-top: 1pt;">팀 실적 관리</p>
</div>
<div style="flex: 1; background: rgba(245,158,11,0.06); border: 1pt solid rgba(245,158,11,0.12); border-radius: 5pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="12" cy="12" r="8" fill="none" stroke="#F59E0B" stroke-width="1" opacity="0.4"/>
<circle cx="12" cy="12" r="3" fill="none" stroke="#F59E0B" stroke-width="1.2"/>
<line x1="12" y1="4" x2="12" y2="6" stroke="#F59E0B" stroke-width="1" stroke-linecap="round"/>
<line x1="12" y1="18" x2="12" y2="20" stroke="#F59E0B" stroke-width="1" stroke-linecap="round"/>
<line x1="4" y1="12" x2="6" y2="12" stroke="#F59E0B" stroke-width="1" stroke-linecap="round"/>
<line x1="18" y1="12" x2="20" y2="12" stroke="#F59E0B" stroke-width="1" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 800; color: #F59E0B;">운영자</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: rgba(255,255,255,0.5); margin-top: 1pt;">인력/승인 관리</p>
</div>
<div style="flex: 1; background: rgba(139,92,246,0.06); border: 1pt solid rgba(139,92,246,0.12); border-radius: 5pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<rect x="4" y="3" width="16" height="18" rx="2" fill="none" stroke="#8B5CF6" stroke-width="1" opacity="0.5"/>
<line x1="7" y1="8" x2="17" y2="8" stroke="#8B5CF6" stroke-width="0.7" opacity="0.4"/>
<line x1="7" y1="11" x2="14" y2="11" stroke="#8B5CF6" stroke-width="0.7" opacity="0.4"/>
<line x1="7" y1="14" x2="12" y2="14" stroke="#8B5CF6" stroke-width="0.7" opacity="0.4"/>
<path d="M14 16 L16 18 L20 13" fill="none" stroke="#8B5CF6" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 800; color: #8B5CF6;">영업자</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: rgba(255,255,255,0.5); margin-top: 1pt;">내 실적 조회</p>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(139,92,246,0.1); margin-bottom: 8pt;"></div>
<!-- 투자 비용 -->
<div style="margin-bottom: 9pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #FBBF24; margin-bottom: 5pt;">투자 비용</p>
<div style="display: flex; gap: 5pt;">
<div style="flex: 1;">
<div style="background: rgba(251,191,36,0.06); border: 1pt solid rgba(251,191,36,0.15); border-radius: 6pt; padding: 7pt 8pt; margin-bottom: 3pt;">
<div style="display: flex; align-items: center; gap: 4pt; margin-bottom: 3pt;">
<svg viewBox="0 0 14 14" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg">
<rect x="1" y="1" width="12" height="12" rx="2" fill="none" stroke="#FBBF24" stroke-width="1" opacity="0.5"/>
<path d="M4 7 L6 9 L10 5" fill="none" stroke="#FBBF24" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: #FBBF24;">대시보드 포함 기본 패키지</p>
</div>
<p style="white-space: nowrap; font-size: 13pt; font-weight: 800; color: #ffffff;">2,000만원</p>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.3);">+ 월 50만원 (유지보수)</p>
</div>
<div style="background: rgba(255,255,255,0.03); border-radius: 3pt; padding: 3pt 5pt;">
<p style="font-size: 5.5pt; color: rgba(255,255,255,0.25); line-height: 1.4;">CEO 대시보드 + 견적/수주 + 생산<br>인사/회계 무료 포함</p>
</div>
</div>
<div style="flex: 1;">
<div style="background: rgba(255,255,255,0.04); border: 1pt solid rgba(255,255,255,0.08); border-radius: 6pt; padding: 7pt 8pt;">
<div style="display: flex; align-items: center; gap: 4pt; margin-bottom: 4pt;">
<svg viewBox="0 0 14 14" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="7" cy="7" r="5.5" fill="none" stroke="#F59E0B" stroke-width="1" opacity="0.5"/>
<line x1="7" y1="4.5" x2="7" y2="9.5" stroke="#F59E0B" stroke-width="1" stroke-linecap="round"/>
<line x1="4.5" y1="7" x2="9.5" y2="7" stroke="#F59E0B" stroke-width="1" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: #F59E0B;">추가 옵션 (선택)</p>
</div>
<div style="display: flex; flex-direction: column; gap: 3pt;">
<div style="display: flex; justify-content: space-between;">
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.4);">생산공정 관리</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #FBBF24;">+500만원</p>
</div>
<div style="display: flex; justify-content: space-between;">
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.4);">품질관리(인정검사)</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #FBBF24;">+2,000만원</p>
</div>
<div style="display: flex; justify-content: space-between;">
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.4);">AI 견적 자동 생성</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #FBBF24;">월 10~20만원</p>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: rgba(255,255,255,0.05); margin-bottom: 8pt;"></div>
<!-- 도입 프로세스 -->
<div style="margin-bottom: 6pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #10B981; margin-bottom: 5pt;">도입 프로세스</p>
<div style="display: flex; gap: 2pt; align-items: center;">
<div style="flex: 1; border-radius: 5pt; padding: 4pt 2pt; text-align: center; background: rgba(251,191,36,0.06); border: 1pt solid rgba(251,191,36,0.12);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<circle cx="8" cy="5" r="3" fill="none" stroke="#FBBF24" stroke-width="0.8"/>
<path d="M4 14 Q4 10 8 10 Q12 10 12 14" fill="none" stroke="#FBBF24" stroke-width="0.8"/>
<path d="M13 5 L15 5 M14 4 L14 6" stroke="#FBBF24" stroke-width="0.6" stroke-linecap="round" opacity="0.6"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.35);">1~2주</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: rgba(255,255,255,0.6);">현장 인터뷰</p>
</div>
<svg viewBox="0 0 8 8" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M2 4 L6 4 M5 2.5 L6.5 4 L5 5.5" fill="none" stroke="rgba(251,191,36,0.25)" stroke-width="0.8" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div style="flex: 1; border-radius: 5pt; padding: 4pt 2pt; text-align: center; background: rgba(16,185,129,0.06); border: 1pt solid rgba(16,185,129,0.12);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<rect x="3" y="2" width="10" height="12" rx="1.5" fill="none" stroke="#10B981" stroke-width="0.8"/>
<line x1="6" y1="5" x2="10" y2="5" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
<line x1="6" y1="7" x2="10" y2="7" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
<line x1="6" y1="9" x2="10" y2="9" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
<line x1="6" y1="11" x2="9" y2="11" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.35);">2~4주</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: rgba(255,255,255,0.6);">맞춤 개발</p>
</div>
<svg viewBox="0 0 8 8" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M2 4 L6 4 M5 2.5 L6.5 4 L5 5.5" fill="none" stroke="rgba(251,191,36,0.25)" stroke-width="0.8" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div style="flex: 1; border-radius: 5pt; padding: 4pt 2pt; text-align: center; background: rgba(139,92,246,0.06); border: 1pt solid rgba(139,92,246,0.12);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<rect x="2" y="3" width="5" height="10" rx="1" fill="none" stroke="#8B5CF6" stroke-width="0.8" opacity="0.5"/>
<rect x="9" y="3" width="5" height="10" rx="1" fill="none" stroke="#8B5CF6" stroke-width="0.8"/>
<path d="M7 7 L9 8 M7 8 L9 7" stroke="#8B5CF6" stroke-width="0.5" opacity="0.4"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.35);">1~2주</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: rgba(255,255,255,0.6);">데이터 이관</p>
</div>
<svg viewBox="0 0 8 8" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M2 4 L6 4 M5 2.5 L6.5 4 L5 5.5" fill="none" stroke="rgba(251,191,36,0.25)" stroke-width="0.8" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div style="flex: 1; border-radius: 5pt; padding: 4pt 2pt; text-align: center; background: rgba(245,158,11,0.06); border: 1pt solid rgba(245,158,11,0.12);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<path d="M8 2 L14 8 L8 14 L2 8 Z" fill="none" stroke="#F59E0B" stroke-width="0.8"/>
<path d="M5.5 8 L7 9.5 L10.5 6" fill="none" stroke="#F59E0B" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.35);">1~2주</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: rgba(255,255,255,0.6);">교육/안정화</p>
</div>
</div>
</div>
<!-- CTA 푸터 -->
<div style="margin-top: auto; background: rgba(251,191,36,0.06); border: 1.5pt solid rgba(251,191,36,0.15); border-radius: 7pt; padding: 9pt 12pt;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<div style="display: flex; align-items: center; gap: 6pt;">
<svg viewBox="0 0 22 22" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="11" cy="11" r="9" fill="none" stroke="#FBBF24" stroke-width="1.2" opacity="0.5"/>
<path d="M11 6 L11 11 L15 13" fill="none" stroke="#FBBF24" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.3); margin-top: 1pt;">대표님 전용 대시보드를 직접 체험</p>
</div>
</div>
<div style="text-align: right;">
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.25); margin-top: 1pt;">www.sam.it.kr</p>
</div>
</div>
</div>
<!-- 회사명 -->
<div style="margin-top: 4pt; text-align: center;">
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.15);">SAM — Smart Automation Management</p>
</div>
</body>
</html>

View File

@@ -0,0 +1,216 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
width: 405pt; height: 720pt;
font-family: 'Pretendard', sans-serif;
background: #1A1640;
padding: 26pt 22pt 16pt 22pt;
display: flex; flex-direction: column;
}
</style>
</head>
<body>
<!-- 헤더 -->
<div style="display: flex; align-items: center; gap: 8pt; margin-bottom: 18pt;">
<img src="/home/aweso/sam/docs/assets/bi/sam_bi_white.png" style="height: 22pt;">
<div style="flex: 1;"></div>
<div style="background: rgba(251,191,36,0.12); border: 1pt solid rgba(251,191,36,0.25); border-radius: 3pt; padding: 2pt 7pt;">
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 700; color: #FBBF24; letter-spacing: 0.08em;">EXECUTIVE EDITION</p>
</div>
</div>
<!-- 히어로 섹션 -->
<div style="margin-bottom: 20pt;">
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 600; color: #FBBF24; letter-spacing: 0.12em; margin-bottom: 6pt;">CEO DASHBOARD</p>
<h1 style="font-size: 20pt; font-weight: 800; color: #ffffff; line-height: 1.35; margin-bottom: 8pt;">대표님의 시간은<br>보고를 기다리는 데<br>쓰여선 안 됩니다.</h1>
<p style="font-size: 8.5pt; color: rgba(255,255,255,0.5); line-height: 1.55;">로그인 3초. 매출, 수주, 승인 대기까지<br>모든 경영 현황이 한 화면에.</p>
</div>
<!-- 잃어버린 시간 카드 -->
<div style="margin-bottom: 16pt;">
<div style="display: flex; gap: 4pt;">
<div style="flex: 1; background: rgba(239,68,68,0.08); border: 1pt solid rgba(239,68,68,0.15); border-radius: 6pt; padding: 8pt 7pt; text-align: center;">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 3pt;">
<circle cx="12" cy="12" r="9" fill="none" stroke="#EF4444" stroke-width="1.2" opacity="0.4"/>
<path d="M12 7 L12 12 L16 14" fill="none" stroke="#EF4444" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 12pt; font-weight: 800; color: #EF4444;">1~2일</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.4); margin-top: 2pt;">매출 보고 대기</p>
</div>
<div style="flex: 1; background: rgba(239,68,68,0.08); border: 1pt solid rgba(239,68,68,0.15); border-radius: 6pt; padding: 8pt 7pt; text-align: center;">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 3pt;">
<rect x="4" y="3" width="16" height="18" rx="2" fill="none" stroke="#EF4444" stroke-width="1.2" opacity="0.4"/>
<line x1="8" y1="8" x2="16" y2="8" stroke="#EF4444" stroke-width="0.8" opacity="0.3"/>
<line x1="8" y1="11" x2="14" y2="11" stroke="#EF4444" stroke-width="0.8" opacity="0.3"/>
<line x1="8" y1="14" x2="12" y2="14" stroke="#EF4444" stroke-width="0.8" opacity="0.3"/>
</svg>
<p style="white-space: nowrap; font-size: 12pt; font-weight: 800; color: #EF4444;">반나절</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.4); margin-top: 2pt;">Excel 수주 취합</p>
</div>
<div style="flex: 1; background: rgba(239,68,68,0.08); border: 1pt solid rgba(239,68,68,0.15); border-radius: 6pt; padding: 8pt 7pt; text-align: center;">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 3pt;">
<path d="M12 3 C7 3 3 7 3 11 L3 15 L1 17 L23 17 L21 15 L21 11 C21 7 17 3 12 3 Z" fill="none" stroke="#EF4444" stroke-width="1.2" opacity="0.4"/>
<path d="M9 18 Q12 21 15 18" fill="none" stroke="#EF4444" stroke-width="0.8" opacity="0.3"/>
</svg>
<p style="white-space: nowrap; font-size: 12pt; font-weight: 800; color: #EF4444;">30분</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.4); margin-top: 2pt;">결재 서류 찾기</p>
</div>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(239,68,68,0.5); text-align: center; margin-top: 4pt;">매일 반복되는 비효율, SAM이 제로로 만듭니다.</p>
</div>
<!-- 전환 -->
<div style="display: flex; align-items: center; gap: 6pt; margin-bottom: 14pt;">
<div style="flex: 1; height: 1pt; background: rgba(251,191,36,0.15);"></div>
<div style="background: rgba(251,191,36,0.1); border: 1pt solid rgba(251,191,36,0.2); border-radius: 4pt; padding: 3pt 10pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #FBBF24;">SAM 도입 후</p>
</div>
<div style="flex: 1; height: 1pt; background: rgba(251,191,36,0.15);"></div>
</div>
<!-- 대시보드 Mock UI (글래스모피즘) -->
<div style="background: rgba(255,255,255,0.05); border: 1pt solid rgba(255,255,255,0.1); border-radius: 8pt; padding: 10pt; margin-bottom: 16pt;">
<!-- 타이틀바 -->
<div style="display: flex; align-items: center; gap: 3pt; margin-bottom: 7pt;">
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #EF4444;"></div>
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #F59E0B;"></div>
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #10B981;"></div>
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.2); margin-left: 5pt;">SAM CEO Dashboard</p>
</div>
<!-- KPI 카드 -->
<div style="display: flex; gap: 3pt; margin-bottom: 6pt;">
<div style="flex: 1; background: rgba(251,191,36,0.08); border: 1pt solid rgba(251,191,36,0.15); border-radius: 5pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 16 16" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<rect x="2" y="9" width="3" height="5" rx="0.5" fill="#FBBF24" opacity="0.4"/>
<rect x="6" y="5" width="3" height="9" rx="0.5" fill="#FBBF24" opacity="0.65"/>
<rect x="10" y="2" width="3" height="12" rx="0.5" fill="#FBBF24"/>
</svg>
<p style="white-space: nowrap; font-size: 12pt; font-weight: 800; color: #FBBF24;">5.2억</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">&#9650; 15.3%</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: rgba(255,255,255,0.4); font-weight: 600; margin-top: 1pt;">월 매출</p>
</div>
<div style="flex: 1; background: rgba(16,185,129,0.08); border: 1pt solid rgba(16,185,129,0.15); border-radius: 5pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 16 16" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<rect x="2" y="2" width="12" height="12" rx="2" fill="none" stroke="#10B981" stroke-width="1" opacity="0.5"/>
<path d="M5 8 L7 10 L11 6" fill="none" stroke="#10B981" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 12pt; font-weight: 800; color: #fff;">127건</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">&#9650; 8건</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: rgba(255,255,255,0.4); font-weight: 600; margin-top: 1pt;">누적 수주</p>
</div>
<div style="flex: 1; background: rgba(139,92,246,0.08); border: 1pt solid rgba(139,92,246,0.15); border-radius: 5pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 16 16" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="8" cy="8" r="5.5" fill="none" stroke="#8B5CF6" stroke-width="1" opacity="0.3"/>
<circle cx="8" cy="8" r="5.5" fill="none" stroke="#8B5CF6" stroke-width="1.5" stroke-dasharray="32 35" stroke-dashoffset="-9" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 12pt; font-weight: 800; color: #fff;">96%</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">목표 달성</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: rgba(255,255,255,0.4); font-weight: 600; margin-top: 1pt;">납기 준수율</p>
</div>
<div style="flex: 1; background: rgba(239,68,68,0.1); border: 1pt solid rgba(239,68,68,0.2); border-radius: 5pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 16 16" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<path d="M8 2 L14 12 L2 12 Z" fill="none" stroke="#EF4444" stroke-width="1" stroke-linejoin="round"/>
<line x1="8" y1="6" x2="8" y2="9" stroke="#EF4444" stroke-width="1.2" stroke-linecap="round"/>
<circle cx="8" cy="10.5" r="0.6" fill="#EF4444"/>
</svg>
<p style="white-space: nowrap; font-size: 12pt; font-weight: 800; color: #EF4444;">5건</p>
<p style="white-space: nowrap; font-size: 5pt; color: #EF4444; font-weight: 700;">즉시 처리</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: rgba(255,255,255,0.4); font-weight: 600; margin-top: 1pt;">승인 대기</p>
</div>
</div>
<!-- 라인 차트 + 도넛 -->
<div style="display: flex; gap: 4pt;">
<div style="flex: 3; background: rgba(255,255,255,0.03); border-radius: 4pt; padding: 5pt 6pt;">
<p style="white-space: nowrap; font-size: 5pt; color: rgba(255,255,255,0.25); margin-bottom: 2pt;">월별 매출 추이</p>
<svg viewBox="0 0 150 35" width="100%" height="26pt" xmlns="http://www.w3.org/2000/svg">
<line x1="0" y1="10" x2="150" y2="10" stroke="rgba(255,255,255,0.04)" stroke-width="0.5"/>
<line x1="0" y1="20" x2="150" y2="20" stroke="rgba(255,255,255,0.04)" stroke-width="0.5"/>
<path d="M5 30 L18 24 L31 26 L44 20 L57 16 L70 12 L83 14 L96 8 L109 10 L122 4 L135 7 L135 33 L5 33 Z" fill="url(#fGrad5)" opacity="0.4"/>
<path d="M5 30 L18 24 L31 26 L44 20 L57 16 L70 12 L83 14 L96 8 L109 10 L122 4 L135 7" fill="none" stroke="#FBBF24" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="122" cy="4" r="2" fill="#FBBF24"/>
<defs>
<linearGradient id="fGrad5" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#FBBF24" stop-opacity="0.3"/>
<stop offset="100%" stop-color="#FBBF24" stop-opacity="0"/>
</linearGradient>
</defs>
</svg>
</div>
<div style="flex: 2; background: rgba(255,255,255,0.03); border-radius: 4pt; padding: 5pt; display: flex; align-items: center; gap: 5pt;">
<svg viewBox="0 0 40 40" width="30pt" height="30pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="20" cy="20" r="14" fill="none" stroke="rgba(255,255,255,0.06)" stroke-width="5"/>
<circle cx="20" cy="20" r="14" fill="none" stroke="#FBBF24" stroke-width="5" stroke-dasharray="33 55" stroke-dashoffset="22" stroke-linecap="round"/>
<circle cx="20" cy="20" r="14" fill="none" stroke="#10B981" stroke-width="5" stroke-dasharray="22 66" stroke-dashoffset="-11" stroke-linecap="round"/>
<circle cx="20" cy="20" r="14" fill="none" stroke="#8B5CF6" stroke-width="5" stroke-dasharray="19 69" stroke-dashoffset="-33" stroke-linecap="round"/>
<circle cx="20" cy="20" r="14" fill="none" stroke="#0EA5E9" stroke-width="5" stroke-dasharray="12 76" stroke-dashoffset="-52" stroke-linecap="round"/>
</svg>
<div style="display: flex; flex-direction: column; gap: 2pt;">
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #FBBF24; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4.5pt; color: rgba(255,255,255,0.4);">영업1팀</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #10B981; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4.5pt; color: rgba(255,255,255,0.4);">영업2팀</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #8B5CF6; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4.5pt; color: rgba(255,255,255,0.4);">생산팀</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #0EA5E9; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4.5pt; color: rgba(255,255,255,0.4);">품질팀</p>
</div>
</div>
</div>
</div>
</div>
<!-- 약속 박스 (골드 강조) -->
<div style="background: rgba(251,191,36,0.06); border: 1pt solid rgba(251,191,36,0.15); border-radius: 7pt; padding: 10pt 12pt; margin-bottom: 14pt;">
<div style="display: flex; align-items: center; gap: 6pt;">
<svg viewBox="0 0 22 22" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="11" cy="11" r="9" fill="none" stroke="#FBBF24" stroke-width="1.2" opacity="0.4"/>
<path d="M7 11 L10 14 L15 8" fill="none" stroke="#FBBF24" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: #FBBF24;">대표님께 드리는 약속</p>
<p style="font-size: 7pt; color: rgba(255,255,255,0.45); margin-top: 2pt; line-height: 1.5;">보고를 기다리는 시간을 제로로.<br>의사결정에만 집중하실 수 있도록.</p>
</div>
</div>
</div>
<!-- 기술 태그 -->
<div style="display: flex; gap: 4pt; margin-bottom: 8pt;">
<div style="display: flex; align-items: center; gap: 2pt; background: rgba(255,255,255,0.04); border: 1pt solid rgba(255,255,255,0.06); border-radius: 3pt; padding: 3pt 6pt;">
<svg viewBox="0 0 8 8" width="5pt" height="5pt" xmlns="http://www.w3.org/2000/svg"><path d="M2 6 Q4 2 6 6" fill="none" stroke="rgba(251,191,36,0.5)" stroke-width="0.7"/><path d="M3 6 Q4 4 5 6" fill="none" stroke="rgba(251,191,36,0.6)" stroke-width="0.7"/><circle cx="4" cy="6.5" r="0.6" fill="rgba(251,191,36,0.5)"/></svg>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.3);">클라우드 기반</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: rgba(255,255,255,0.04); border: 1pt solid rgba(255,255,255,0.06); border-radius: 3pt; padding: 3pt 6pt;">
<svg viewBox="0 0 8 8" width="5pt" height="5pt" xmlns="http://www.w3.org/2000/svg"><rect x="2" y="0.5" width="4" height="7" rx="0.8" fill="none" stroke="rgba(251,191,36,0.5)" stroke-width="0.7"/><circle cx="4" cy="6.5" r="0.4" fill="rgba(251,191,36,0.5)"/></svg>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.3);">PC + 모바일</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: rgba(255,255,255,0.04); border: 1pt solid rgba(255,255,255,0.06); border-radius: 3pt; padding: 3pt 6pt;">
<svg viewBox="0 0 8 8" width="5pt" height="5pt" xmlns="http://www.w3.org/2000/svg"><rect x="1" y="1.5" width="6" height="5" rx="0.8" fill="none" stroke="rgba(251,191,36,0.5)" stroke-width="0.7"/><circle cx="4" cy="4" r="1.2" fill="none" stroke="rgba(251,191,36,0.6)" stroke-width="0.5"/></svg>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.3);">역할별 권한</p>
</div>
</div>
<!-- 푸터 -->
<div style="margin-top: auto; border-top: 1pt solid rgba(251,191,36,0.1); padding-top: 8pt;">
<div style="display: flex; justify-content: space-between; align-items: flex-end;">
<div>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: rgba(255,255,255,0.6);">SAM</p>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.2); margin-top: 2pt;">www.sam.it.kr</p>
</div>
<div style="text-align: right;">
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.25);">뒷면에서 상세 기능을 확인하세요 &#9654;</p>
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,27 @@
const path = require('path');
module.paths.unshift(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/node_modules'));
const PptxGenJS = require('pptxgenjs');
const html2pptx = require(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/html2pptx.js'));
async function main() {
const pres = new PptxGenJS();
pres.defineLayout({ name: 'PORTRAIT_9x16', width: 5.625, height: 10 });
pres.layout = 'PORTRAIT_9x16';
const htmlFile = path.join(__dirname, 'slides', 'brochure-dashboard-1page.html');
console.log('Converting CEO Dashboard v6 (Corporate Blue & White) 1-page brochure...');
try {
await html2pptx(htmlFile, pres);
} catch (err) {
console.error(`Error: ${err.message}`);
}
const outputPath = path.join(__dirname, 'sam-brochure-v6-dashboard-1page.pptx');
await pres.writeFile({ fileName: outputPath });
console.log(`\nPPTX created: ${outputPath}`);
}
main().catch(console.error);

View File

@@ -0,0 +1,31 @@
const path = require('path');
module.paths.unshift(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/node_modules'));
const PptxGenJS = require('pptxgenjs');
const html2pptx = require(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/html2pptx.js'));
async function main() {
const pres = new PptxGenJS();
pres.defineLayout({ name: 'PORTRAIT_9x16', width: 5.625, height: 10 });
pres.layout = 'PORTRAIT_9x16';
const slidesDir = path.join(__dirname, 'slides');
const slides = ['brochure-dashboard-front.html', 'brochure-dashboard-back.html'];
for (const file of slides) {
const htmlFile = path.join(slidesDir, file);
console.log(`Converting ${file} ...`);
try {
await html2pptx(htmlFile, pres);
} catch (err) {
console.error(`Error on ${file}: ${err.message}`);
}
}
const outputPath = path.join(__dirname, 'sam-brochure-v6-dashboard-2page.pptx');
await pres.writeFile({ fileName: outputPath });
console.log(`\nPPTX created: ${outputPath}`);
}
main().catch(console.error);

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,372 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
width: 405pt; height: 720pt;
font-family: 'Pretendard', sans-serif;
background: #FFFFFF;
padding: 0;
display: flex; flex-direction: column;
}
</style>
</head>
<body>
<!-- 블루 헤더 바 -->
<div style="background: #1E40AF; padding: 8pt 20pt; display: flex; align-items: center; gap: 8pt;">
<img src="/home/aweso/sam/docs/assets/bi/sam_bi_white.png" style="height: 18pt;">
<div style="flex: 1;"></div>
<div style="background: rgba(255,255,255,0.15); border-radius: 3pt; padding: 2pt 8pt;">
<p style="white-space: nowrap; font-size: 6pt; color: #FFFFFF; font-weight: 600; letter-spacing: 0.05em;">CEO DASHBOARD</p>
</div>
</div>
<!-- 본문 영역 -->
<div style="flex: 1; padding: 12pt 20pt 8pt 20pt; display: flex; flex-direction: column;">
<!-- 히어로 -->
<div style="display: flex; align-items: center; gap: 12pt; margin-bottom: 10pt;">
<div style="flex: 1;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 600; color: #2563EB; letter-spacing: 0.1em; margin-bottom: 3pt;">EXECUTIVE DASHBOARD</p>
<h1 style="font-size: 16pt; font-weight: 800; color: #1E293B; line-height: 1.35; margin-bottom: 5pt;">대표님, 우리 회사<br>지금 어떤 상태인가요?</h1>
<p style="font-size: 7.5pt; color: #475569; line-height: 1.5;">보고 대기 없이, 로그인 한 번이면</p>
<p style="font-size: 7.5pt; color: #475569; line-height: 1.5;">전사 현황이 한눈에 들어옵니다.</p>
</div>
<div style="flex-shrink: 0; width: 72pt; height: 72pt;">
<svg viewBox="0 0 80 80" width="72pt" height="72pt" xmlns="http://www.w3.org/2000/svg">
<rect x="8" y="10" width="64" height="44" rx="4" fill="none" stroke="#2563EB" stroke-width="1.5" opacity="0.6"/>
<rect x="12" y="14" width="56" height="36" rx="2" fill="#FFFFFF"/>
<rect x="16" y="38" width="6" height="8" rx="1" fill="#2563EB" opacity="0.5"/>
<rect x="24" y="34" width="6" height="12" rx="1" fill="#2563EB" opacity="0.65"/>
<rect x="32" y="30" width="6" height="16" rx="1" fill="#2563EB" opacity="0.8"/>
<rect x="40" y="26" width="6" height="20" rx="1" fill="#2563EB" opacity="0.9"/>
<rect x="48" y="22" width="6" height="24" rx="1" fill="#2563EB"/>
<rect x="56" y="28" width="6" height="18" rx="1" fill="#10B981" opacity="0.7"/>
<circle cx="18" cy="20" r="3" fill="#10B981" opacity="0.7"/>
<circle cx="28" cy="20" r="3" fill="#8B5CF6" opacity="0.7"/>
<circle cx="38" cy="20" r="3" fill="#F59E0B" opacity="0.7"/>
<circle cx="48" cy="20" r="3" fill="#EF4444" opacity="0.7"/>
<rect x="32" y="54" width="16" height="3" rx="1" fill="#2563EB" opacity="0.4"/>
<rect x="28" y="57" width="24" height="2" rx="1" fill="#2563EB" opacity="0.3"/>
<path d="M58 62 Q62 58 66 62" fill="none" stroke="#10B981" stroke-width="1" opacity="0.5"/>
<path d="M56 66 Q62 60 68 66" fill="none" stroke="#10B981" stroke-width="1" opacity="0.3"/>
<circle cx="62" cy="66" r="1.5" fill="#10B981" opacity="0.6"/>
</svg>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1.5pt; background: #DBEAFE; margin-bottom: 8pt;"></div>
<!-- 대시보드 Mock UI -->
<div style="background: #FFFFFF; border: 1.5pt solid #DBEAFE; border-radius: 7pt; padding: 7pt; margin-bottom: 8pt; box-shadow: 0 1pt 4pt rgba(30,64,175,0.06);">
<!-- 타이틀바 -->
<div style="display: flex; align-items: center; gap: 3pt; margin-bottom: 5pt;">
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #EF4444;"></div>
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #F59E0B;"></div>
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #10B981;"></div>
<p style="white-space: nowrap; font-size: 5pt; color: #94A3B8; margin-left: 5pt;">SAM CEO Dashboard</p>
</div>
<!-- KPI 카드 4개 -->
<div style="display: flex; gap: 3pt; margin-bottom: 5pt;">
<div style="flex: 1; background: #EFF6FF; border: 1pt solid #DBEAFE; border-radius: 4pt; padding: 5pt 4pt; text-align: center;">
<svg viewBox="0 0 20 20" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<path d="M3 16 L3 8 L7 8 L7 16 Z" fill="#2563EB" opacity="0.4"/>
<path d="M8 16 L8 5 L12 5 L12 16 Z" fill="#2563EB" opacity="0.65"/>
<path d="M13 16 L13 3 L17 3 L17 16 Z" fill="#2563EB"/>
<path d="M3 16 L17 16" stroke="#2563EB" stroke-width="0.5" opacity="0.4"/>
</svg>
<p style="white-space: nowrap; font-size: 10pt; font-weight: 800; color: #1E293B;">5.2억</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">&#9650; 15.3%</p>
<p style="white-space: nowrap; font-size: 5pt; color: #2563EB; font-weight: 600; margin-top: 1pt;">월 매출</p>
</div>
<div style="flex: 1; background: rgba(16,185,129,0.05); border: 1pt solid rgba(16,185,129,0.15); border-radius: 4pt; padding: 5pt 4pt; text-align: center;">
<svg viewBox="0 0 20 20" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<rect x="3" y="3" width="14" height="14" rx="2" fill="none" stroke="#10B981" stroke-width="1.2" opacity="0.5"/>
<path d="M6 10 L9 13 L14 7" fill="none" stroke="#10B981" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 10pt; font-weight: 800; color: #1E293B;">127건</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">&#9650; 8건</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 600; margin-top: 1pt;">수주 잔량</p>
</div>
<div style="flex: 1; background: rgba(139,92,246,0.05); border: 1pt solid rgba(139,92,246,0.15); border-radius: 4pt; padding: 5pt 4pt; text-align: center;">
<svg viewBox="0 0 20 20" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="10" cy="10" r="7" fill="none" stroke="#8B5CF6" stroke-width="1.2" opacity="0.3"/>
<circle cx="10" cy="10" r="7" fill="none" stroke="#8B5CF6" stroke-width="1.5" stroke-dasharray="40 44" stroke-dashoffset="-11" stroke-linecap="round"/>
<text x="10" y="12" text-anchor="middle" fill="#8B5CF6" font-size="5" font-weight="800">96</text>
</svg>
<p style="white-space: nowrap; font-size: 10pt; font-weight: 800; color: #1E293B;">96%</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">목표 달성</p>
<p style="white-space: nowrap; font-size: 5pt; color: #8B5CF6; font-weight: 600; margin-top: 1pt;">납기 준수율</p>
</div>
<div style="flex: 1; background: rgba(239,68,68,0.05); border: 1pt solid rgba(239,68,68,0.15); border-radius: 4pt; padding: 5pt 4pt; text-align: center;">
<svg viewBox="0 0 20 20" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<path d="M10 3 L17 15 L3 15 Z" fill="none" stroke="#EF4444" stroke-width="1.2" stroke-linejoin="round"/>
<line x1="10" y1="8" x2="10" y2="11" stroke="#EF4444" stroke-width="1.5" stroke-linecap="round"/>
<circle cx="10" cy="13" r="0.8" fill="#EF4444"/>
</svg>
<p style="white-space: nowrap; font-size: 10pt; font-weight: 800; color: #EF4444;">5건</p>
<p style="white-space: nowrap; font-size: 5pt; color: #EF4444; font-weight: 700;">즉시 처리</p>
<p style="white-space: nowrap; font-size: 5pt; color: #EF4444; font-weight: 600; margin-top: 1pt;">승인 대기</p>
</div>
</div>
<!-- 차트 영역 -->
<div style="display: flex; gap: 4pt;">
<div style="flex: 3; background: #EFF6FF; border-radius: 4pt; padding: 4pt 5pt;">
<p style="white-space: nowrap; font-size: 5pt; color: #94A3B8; margin-bottom: 2pt;">월별 매출 추이</p>
<svg viewBox="0 0 160 40" width="100%" height="30pt" xmlns="http://www.w3.org/2000/svg">
<line x1="0" y1="10" x2="160" y2="10" stroke="rgba(30,64,175,0.05)" stroke-width="0.5"/>
<line x1="0" y1="20" x2="160" y2="20" stroke="rgba(30,64,175,0.05)" stroke-width="0.5"/>
<line x1="0" y1="30" x2="160" y2="30" stroke="rgba(30,64,175,0.05)" stroke-width="0.5"/>
<path d="M5 35 L20 28 L35 30 L50 22 L65 18 L80 14 L95 16 L110 10 L125 12 L140 5 L155 8 L155 38 L5 38 Z" fill="#2563EB" opacity="0.08"/>
<path d="M5 35 L20 28 L35 30 L50 22 L65 18 L80 14 L95 16 L110 10 L125 12 L140 5 L155 8" fill="none" stroke="#2563EB" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="140" cy="5" r="2.5" fill="#2563EB"/>
<circle cx="155" cy="8" r="2" fill="#2563EB" opacity="0.5" stroke="#2563EB" stroke-width="0.5" stroke-dasharray="1 1"/>
</svg>
</div>
<div style="flex: 2; background: #EFF6FF; border-radius: 4pt; padding: 4pt 5pt; display: flex; align-items: center; gap: 5pt;">
<svg viewBox="0 0 44 44" width="36pt" height="36pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="22" cy="22" r="16" fill="none" stroke="rgba(30,64,175,0.06)" stroke-width="5"/>
<circle cx="22" cy="22" r="16" fill="none" stroke="#2563EB" stroke-width="5" stroke-dasharray="38 62" stroke-dashoffset="25" stroke-linecap="round"/>
<circle cx="22" cy="22" r="16" fill="none" stroke="#10B981" stroke-width="5" stroke-dasharray="25 75" stroke-dashoffset="-13" stroke-linecap="round"/>
<circle cx="22" cy="22" r="16" fill="none" stroke="#8B5CF6" stroke-width="5" stroke-dasharray="22 78" stroke-dashoffset="-38" stroke-linecap="round"/>
<circle cx="22" cy="22" r="16" fill="none" stroke="#F59E0B" stroke-width="5" stroke-dasharray="13 87" stroke-dashoffset="-60" stroke-linecap="round"/>
</svg>
<div style="display: flex; flex-direction: column; gap: 2pt;">
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 4pt; height: 4pt; background: #2563EB; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 5pt; color: #475569;">영업1팀 38%</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 4pt; height: 4pt; background: #10B981; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 5pt; color: #475569;">영업2팀 25%</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 4pt; height: 4pt; background: #8B5CF6; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 5pt; color: #475569;">생산팀 22%</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 4pt; height: 4pt; background: #F59E0B; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 5pt; color: #475569;">품질팀 15%</p>
</div>
</div>
</div>
</div>
</div>
<!-- 핵심 가치 3개 -->
<div style="margin-bottom: 8pt;">
<div style="background: #EFF6FF; border-radius: 3pt; padding: 2pt 8pt; display: inline-block; margin-bottom: 5pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #1E40AF;">대표님이 얻는 것</p>
</div>
<div style="display: flex; gap: 4pt;">
<div style="flex: 1; background: #FFFFFF; border: 1.5pt solid #DBEAFE; border-radius: 6pt; padding: 6pt 5pt; text-align: center; box-shadow: 0 1pt 3pt rgba(30,64,175,0.04);">
<svg viewBox="0 0 28 28" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="14" cy="14" r="10" fill="none" stroke="#2563EB" stroke-width="1.2" opacity="0.4"/>
<path d="M14 8 L14 14 L18 17" fill="none" stroke="#2563EB" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="14" cy="14" r="1.5" fill="#2563EB"/>
<path d="M22 5 L20 10 L23 10 L21 15" fill="none" stroke="#F59E0B" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="font-size: 6.5pt; font-weight: 700; color: #1E293B; white-space: nowrap;">즉시 현황 파악</p>
<p style="font-size: 5pt; color: #94A3B8; margin-top: 1pt; line-height: 1.4;">로그인 3초면<br>전사 현황 확인</p>
</div>
<div style="flex: 1; background: #FFFFFF; border: 1.5pt solid #DBEAFE; border-radius: 6pt; padding: 6pt 5pt; text-align: center; box-shadow: 0 1pt 3pt rgba(30,64,175,0.04);">
<svg viewBox="0 0 28 28" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="14" cy="12" r="8" fill="none" stroke="#10B981" stroke-width="1.2" opacity="0.4"/>
<path d="M11 8 Q14 6 17 8" fill="none" stroke="#10B981" stroke-width="1" stroke-linecap="round"/>
<path d="M10 12 Q14 10 18 12" fill="none" stroke="#10B981" stroke-width="1" stroke-linecap="round"/>
<path d="M11 16 Q14 14 17 16" fill="none" stroke="#10B981" stroke-width="1" stroke-linecap="round"/>
<circle cx="8" cy="22" r="1.2" fill="#10B981" opacity="0.6"/>
<circle cx="14" cy="22" r="1.2" fill="#10B981" opacity="0.8"/>
<circle cx="20" cy="22" r="1.2" fill="#10B981"/>
<line x1="8" y1="22" x2="20" y2="22" stroke="#10B981" stroke-width="0.5" opacity="0.3"/>
</svg>
<p style="font-size: 6.5pt; font-weight: 700; color: #1E293B; white-space: nowrap;">데이터로 판단</p>
<p style="font-size: 5pt; color: #94A3B8; margin-top: 1pt; line-height: 1.4;">감이 아닌 숫자로<br>KPI/팀 성과 비교</p>
</div>
<div style="flex: 1; background: #FFFFFF; border: 1.5pt solid #DBEAFE; border-radius: 6pt; padding: 6pt 5pt; text-align: center; box-shadow: 0 1pt 3pt rgba(30,64,175,0.04);">
<svg viewBox="0 0 28 28" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="14" cy="14" r="9" fill="none" stroke="#8B5CF6" stroke-width="1.2" opacity="0.4"/>
<path d="M9 14 L12.5 17.5 L19 10.5" fill="none" stroke="#8B5CF6" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<rect x="20" y="19" width="5" height="8" rx="1" fill="none" stroke="#8B5CF6" stroke-width="0.8" opacity="0.5"/>
<circle cx="22.5" cy="25.5" r="0.5" fill="#8B5CF6" opacity="0.5"/>
</svg>
<p style="font-size: 6.5pt; font-weight: 700; color: #1E293B; white-space: nowrap;">모바일 승인</p>
<p style="font-size: 5pt; color: #94A3B8; margin-top: 1pt; line-height: 1.4;">이동중에도 즉시<br>결재/승인 처리</p>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1.5pt; background: #DBEAFE; margin-bottom: 8pt;"></div>
<!-- 대시보드 6대 기능 -->
<div style="margin-bottom: 8pt;">
<div style="background: #EFF6FF; border-radius: 3pt; padding: 2pt 8pt; display: inline-block; margin-bottom: 4pt;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #1E40AF;">대시보드 핵심 기능</p>
</div>
<div style="display: flex; flex-direction: column; gap: 2pt;">
<div style="display: flex; gap: 2pt;">
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: #FFFFFF; border: 1pt solid #DBEAFE; border-radius: 4pt; padding: 4pt 6pt;">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<rect x="2" y="10" width="3" height="6" rx="0.5" fill="#2563EB" opacity="0.5"/>
<rect x="7" y="6" width="3" height="10" rx="0.5" fill="#2563EB" opacity="0.75"/>
<rect x="12" y="2" width="3" height="14" rx="0.5" fill="#2563EB"/>
</svg>
<p style="font-size: 6pt; color: #475569; white-space: nowrap;">실시간 <span style="color: #2563EB; font-weight: 700;">매출/수주 KPI</span></p>
</div>
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: #FFFFFF; border: 1pt solid #DBEAFE; border-radius: 4pt; padding: 4pt 6pt;">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="9" cy="4" r="2.5" fill="none" stroke="#10B981" stroke-width="1"/>
<line x1="9" y1="6.5" x2="9" y2="9" stroke="#10B981" stroke-width="0.8"/>
<line x1="4" y1="9" x2="14" y2="9" stroke="#10B981" stroke-width="0.8"/>
<circle cx="4" cy="12" r="2" fill="none" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<circle cx="9" cy="12" r="2" fill="none" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<circle cx="14" cy="12" r="2" fill="none" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<line x1="4" y1="9" x2="4" y2="10" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<line x1="9" y1="9" x2="9" y2="10" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<line x1="14" y1="9" x2="14" y2="10" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
</svg>
<p style="font-size: 6pt; color: #475569; white-space: nowrap;">조직 계층별 <span style="color: #10B981; font-weight: 700;">실적 트리</span></p>
</div>
</div>
<div style="display: flex; gap: 2pt;">
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: #FFFFFF; border: 1pt solid #DBEAFE; border-radius: 4pt; padding: 4pt 6pt;">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="9" cy="9" r="7" fill="none" stroke="#8B5CF6" stroke-width="1" opacity="0.3"/>
<text x="9" y="11.5" text-anchor="middle" fill="#8B5CF6" font-size="8" font-weight="800">&#8361;</text>
</svg>
<p style="font-size: 6pt; color: #475569; white-space: nowrap;">역할별 <span style="color: #8B5CF6; font-weight: 700;">수당 현황</span></p>
</div>
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: #FFFFFF; border: 1pt solid #DBEAFE; border-radius: 4pt; padding: 4pt 6pt;">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<path d="M9 3 C5 3 3 6 3 9 L3 12 L2 13 L16 13 L15 12 L15 9 C15 6 13 3 9 3 Z" fill="none" stroke="#EF4444" stroke-width="1" opacity="0.6"/>
<circle cx="13" cy="5" r="3" fill="#EF4444"/>
<text x="13" y="6.5" text-anchor="middle" fill="#fff" font-size="4" font-weight="700">5</text>
<path d="M7 14 Q9 16 11 14" fill="none" stroke="#EF4444" stroke-width="0.8" opacity="0.5"/>
</svg>
<p style="font-size: 6pt; color: #475569; white-space: nowrap;">미승인 <span style="color: #EF4444; font-weight: 700;">실시간 알림</span></p>
</div>
</div>
<div style="display: flex; gap: 2pt;">
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: #FFFFFF; border: 1pt solid #DBEAFE; border-radius: 4pt; padding: 4pt 6pt;">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<path d="M3 14 L7 10 L10 12 L15 5" fill="none" stroke="#F59E0B" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M12 5 L15 5 L15 8" fill="none" stroke="#F59E0B" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="font-size: 6pt; color: #475569; white-space: nowrap;">기간별 <span style="color: #F59E0B; font-weight: 700;">트렌드 분석</span></p>
</div>
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: #FFFFFF; border: 1pt solid #DBEAFE; border-radius: 4pt; padding: 4pt 6pt;">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<rect x="2" y="3" width="14" height="12" rx="1.5" fill="none" stroke="#EC4899" stroke-width="1" opacity="0.5"/>
<line x1="5" y1="7" x2="13" y2="7" stroke="#EC4899" stroke-width="0.6" opacity="0.3"/>
<line x1="5" y1="9" x2="11" y2="9" stroke="#EC4899" stroke-width="0.6" opacity="0.3"/>
<line x1="5" y1="11" x2="9" y2="11" stroke="#EC4899" stroke-width="0.6" opacity="0.3"/>
<circle cx="14" cy="13" r="3.5" fill="#FFFFFF" stroke="#EC4899" stroke-width="0.8"/>
<path d="M13 13 L15 13 M14 12 L14 14" stroke="#EC4899" stroke-width="0.8" stroke-linecap="round"/>
</svg>
<p style="font-size: 6pt; color: #475569; white-space: nowrap;">수익 <span style="color: #EC4899; font-weight: 700;">시뮬레이터</span></p>
</div>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1.5pt; background: #DBEAFE; margin-bottom: 8pt;"></div>
<!-- Before → After -->
<div style="display: flex; gap: 4pt; margin-bottom: 8pt;">
<div style="flex: 5; background: rgba(239,68,68,0.04); border: 1pt solid rgba(239,68,68,0.1); border-radius: 5pt; padding: 5pt 6pt 10pt 6pt;">
<div style="display: flex; align-items: center; gap: 3pt; margin-bottom: 3pt;">
<svg viewBox="0 0 14 14" width="8pt" height="8pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="7" cy="7" r="5.5" fill="none" stroke="#EF4444" stroke-width="1"/>
<line x1="4.5" y1="4.5" x2="9.5" y2="9.5" stroke="#EF4444" stroke-width="1.2" stroke-linecap="round"/>
<line x1="9.5" y1="4.5" x2="4.5" y2="9.5" stroke="#EF4444" stroke-width="1.2" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #EF4444;">BEFORE</p>
</div>
<p style="white-space: nowrap; font-size: 5.5pt; color: #475569;">매출? → 보고 대기 1~2일</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #475569;">수주? → Excel 취합 반나절</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #475569;">승인? → 서류 찾기 30분</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #475569;">실적? → 각 팀장 개별 보고</p>
</div>
<div style="display: flex; align-items: center; flex-shrink: 0;">
<svg viewBox="0 0 20 20" width="14pt" height="14pt" xmlns="http://www.w3.org/2000/svg">
<path d="M4 10 L14 10" stroke="#2563EB" stroke-width="1.5" stroke-linecap="round"/>
<path d="M11 6 L15 10 L11 14" fill="none" stroke="#2563EB" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>
<div style="flex: 5; background: rgba(16,185,129,0.04); border: 1pt solid rgba(16,185,129,0.1); border-radius: 5pt; padding: 5pt 6pt 10pt 6pt;">
<div style="display: flex; align-items: center; gap: 3pt; margin-bottom: 3pt;">
<svg viewBox="0 0 14 14" width="8pt" height="8pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="7" cy="7" r="5.5" fill="none" stroke="#10B981" stroke-width="1"/>
<path d="M4.5 7 L6.5 9 L10 5" fill="none" stroke="#10B981" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #10B981;">AFTER (SAM)</p>
</div>
<p style="white-space: nowrap; font-size: 5.5pt; color: #475569;">로그인 → <span style="color:#10B981;font-weight:600;">3초 전사 현황</span></p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #475569;">클릭 → <span style="color:#10B981;font-weight:600;">실시간 수주 데이터</span></p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #475569;">뱃지 → <span style="color:#10B981;font-weight:600;">즉시 승인 처리</span></p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #475569;">트리 → <span style="color:#10B981;font-weight:600;">전 조직 한눈에</span></p>
</div>
</div>
<!-- 기술 태그 -->
<div style="display: flex; gap: 3pt; margin-bottom: 6pt;">
<div style="display: flex; align-items: center; gap: 2pt; background: #EFF6FF; border-radius: 3pt; padding: 2pt 5pt;">
<svg viewBox="0 0 10 10" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="5" cy="5" r="3.5" fill="none" stroke="#3B82F6" stroke-width="0.8"/>
<path d="M5 2.5 L5 5 L7 6.5" fill="none" stroke="#3B82F6" stroke-width="0.6" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 5pt; color: #3B82F6;">실시간 업데이트</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: #EFF6FF; border-radius: 3pt; padding: 2pt 5pt;">
<svg viewBox="0 0 10 10" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg">
<rect x="2.5" y="1" width="5" height="8" rx="1" fill="none" stroke="#3B82F6" stroke-width="0.8"/>
<circle cx="5" cy="7.5" r="0.5" fill="#3B82F6"/>
</svg>
<p style="white-space: nowrap; font-size: 5pt; color: #3B82F6;">PC + 모바일</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: #EFF6FF; border-radius: 3pt; padding: 2pt 5pt;">
<svg viewBox="0 0 10 10" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg">
<rect x="1.5" y="2" width="7" height="6" rx="1" fill="none" stroke="#3B82F6" stroke-width="0.8"/>
<circle cx="5" cy="5" r="1.5" fill="none" stroke="#3B82F6" stroke-width="0.6"/>
<line x1="6" y1="3.5" x2="7.5" y2="2" stroke="#3B82F6" stroke-width="0.6"/>
</svg>
<p style="white-space: nowrap; font-size: 5pt; color: #3B82F6;">역할별 권한</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: #EFF6FF; border-radius: 3pt; padding: 2pt 5pt;">
<svg viewBox="0 0 10 10" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg">
<path d="M5 1 Q8 1 8 4 L8 5 Q8 8 5 8 Q2 8 2 5 L2 4 Q2 1 5 1 Z" fill="none" stroke="#3B82F6" stroke-width="0.8"/>
<line x1="5" y1="4" x2="5" y2="6" stroke="#3B82F6" stroke-width="0.6" stroke-linecap="round"/>
<circle cx="5" cy="3.5" r="0.5" fill="#3B82F6"/>
</svg>
<p style="white-space: nowrap; font-size: 5pt; color: #3B82F6;">데이터 암호화</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: #EFF6FF; border-radius: 3pt; padding: 2pt 5pt;">
<svg viewBox="0 0 10 10" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg">
<path d="M2 7 Q5 3 8 7" fill="none" stroke="#3B82F6" stroke-width="0.8"/>
<path d="M3.5 7 Q5 5 6.5 7" fill="none" stroke="#3B82F6" stroke-width="0.8"/>
<circle cx="5" cy="7.5" r="0.8" fill="#3B82F6"/>
</svg>
<p style="white-space: nowrap; font-size: 5pt; color: #3B82F6;">클라우드</p>
</div>
</div>
<!-- 푸터 -->
<div style="margin-top: auto; background: #EFF6FF; border-radius: 5pt; padding: 7pt 10pt;">
<div style="display: flex; justify-content: space-between; align-items: flex-end;">
<div>
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #1E293B;">SAM</p>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8; margin-top: 2pt;">www.sam.it.kr</p>
</div>
<div style="text-align: right;">
</div>
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,335 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
width: 405pt; height: 720pt;
font-family: 'Pretendard', sans-serif;
background: #FFFFFF;
padding: 0;
display: flex; flex-direction: column;
}
</style>
</head>
<body>
<!-- 블루 헤더 바 -->
<div style="background: #1E40AF; padding: 10pt 22pt; display: flex; align-items: center; gap: 8pt;">
<img src="/home/aweso/sam/docs/assets/bi/sam_bi_white.png" style="height: 18pt;">
<div style="flex: 1;"></div>
<div style="background: rgba(255,255,255,0.15); border-radius: 3pt; padding: 2pt 8pt;">
<p style="white-space: nowrap; font-size: 6.5pt; color: #FFFFFF; font-weight: 600; letter-spacing: 0.05em;">FEATURES &amp; PRICING</p>
</div>
</div>
<!-- 본문 영역 -->
<div style="flex: 1; padding: 14pt 22pt 10pt 22pt; display: flex; flex-direction: column;">
<!-- 대시보드 핵심 기능 -->
<div style="margin-bottom: 9pt;">
<div style="background: #EFF6FF; border-radius: 3pt; padding: 3pt 8pt; display: inline-block; margin-bottom: 6pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #1E40AF;">대시보드 핵심 기능</p>
</div>
<div style="display: flex; flex-direction: column; gap: 2pt;">
<!-- 01 -->
<div style="display: flex; align-items: center; gap: 5pt; background: #FFFFFF; border: 1pt solid #DBEAFE; border-radius: 4pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<rect x="2" y="11" width="4" height="6" rx="0.5" fill="#2563EB" opacity="0.45"/>
<rect x="8" y="7" width="4" height="10" rx="0.5" fill="#2563EB" opacity="0.7"/>
<rect x="14" y="3" width="4" height="14" rx="0.5" fill="#2563EB"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #1E293B; white-space: nowrap;">실시간 KPI 카드</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">매출, 수주, 납기율, 승인 대기</p>
</div>
<!-- 02 -->
<div style="display: flex; align-items: center; gap: 5pt; background: #FFFFFF; border: 1pt solid #DBEAFE; border-radius: 4pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="10" cy="4.5" r="2.5" fill="none" stroke="#10B981" stroke-width="1.1"/>
<line x1="10" y1="7" x2="10" y2="9.5" stroke="#10B981" stroke-width="0.8"/>
<line x1="5" y1="9.5" x2="15" y2="9.5" stroke="#10B981" stroke-width="0.8"/>
<circle cx="5" cy="13" r="2" fill="none" stroke="#10B981" stroke-width="0.9" opacity="0.6"/>
<circle cx="10" cy="13" r="2" fill="none" stroke="#10B981" stroke-width="0.9" opacity="0.6"/>
<circle cx="15" cy="13" r="2" fill="none" stroke="#10B981" stroke-width="0.9" opacity="0.6"/>
<line x1="5" y1="9.5" x2="5" y2="11" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<line x1="10" y1="9.5" x2="10" y2="11" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<line x1="15" y1="9.5" x2="15" y2="11" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<circle cx="3" cy="17" r="1.3" fill="none" stroke="#10B981" stroke-width="0.6" opacity="0.4"/>
<circle cx="7" cy="17" r="1.3" fill="none" stroke="#10B981" stroke-width="0.6" opacity="0.4"/>
<line x1="5" y1="15" x2="3" y2="15.7" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
<line x1="5" y1="15" x2="7" y2="15.7" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #1E293B; white-space: nowrap;">조직 실적 트리</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">계층별 팀/개인 실적 펼쳐보기</p>
</div>
<!-- 03 -->
<div style="display: flex; align-items: center; gap: 5pt; background: #FFFFFF; border: 1pt solid #DBEAFE; border-radius: 4pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="10" cy="10" r="7.5" fill="none" stroke="#8B5CF6" stroke-width="1" opacity="0.3"/>
<text x="10" y="12.5" text-anchor="middle" fill="#8B5CF6" font-size="9" font-weight="800">&#8361;</text>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #1E293B; white-space: nowrap;">역할별 수당 현황</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">판매자/관리자/협업자 배분 확인</p>
</div>
<!-- 04 -->
<div style="display: flex; align-items: center; gap: 5pt; background: #FFFFFF; border: 1pt solid #DBEAFE; border-radius: 4pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M10 3 C6 3 3 6 3 9.5 L3 13 L1.5 14.5 L18.5 14.5 L17 13 L17 9.5 C17 6 14 3 10 3 Z" fill="none" stroke="#EF4444" stroke-width="1" opacity="0.5"/>
<circle cx="15" cy="5" r="3.5" fill="#EF4444"/>
<text x="15" y="7" text-anchor="middle" fill="#fff" font-size="4.5" font-weight="800">!</text>
<path d="M7.5 15.5 Q10 18 12.5 15.5" fill="none" stroke="#EF4444" stroke-width="0.8" opacity="0.4"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #1E293B; white-space: nowrap;">승인 대기 알림</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">가입/지급 미처리 빨간 뱃지</p>
</div>
<!-- 05 -->
<div style="display: flex; align-items: center; gap: 5pt; background: #FFFFFF; border: 1pt solid #DBEAFE; border-radius: 4pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M3 15 L7 11 L10 13 L16 5" fill="none" stroke="#F59E0B" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M13 5 L16 5 L16 8" fill="none" stroke="#F59E0B" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #1E293B; white-space: nowrap;">기간별 트렌드</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">당월/분기/연간 추이 차트</p>
</div>
<!-- 06 -->
<div style="display: flex; align-items: center; gap: 5pt; background: #FFFFFF; border: 1pt solid #DBEAFE; border-radius: 4pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<rect x="2" y="3" width="16" height="14" rx="2" fill="none" stroke="#EC4899" stroke-width="1" opacity="0.4"/>
<line x1="5" y1="7.5" x2="15" y2="7.5" stroke="#EC4899" stroke-width="0.6" opacity="0.3"/>
<line x1="5" y1="10" x2="12" y2="10" stroke="#EC4899" stroke-width="0.6" opacity="0.3"/>
<line x1="5" y1="12.5" x2="9" y2="12.5" stroke="#EC4899" stroke-width="0.6" opacity="0.3"/>
<circle cx="15.5" cy="14.5" r="3.5" fill="#FFFFFF" stroke="#EC4899" stroke-width="0.9"/>
<path d="M14.5 14.5 L16.5 14.5 M15.5 13.5 L15.5 15.5" stroke="#EC4899" stroke-width="0.8" stroke-linecap="round"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #1E293B; white-space: nowrap;">수익 시뮬레이터</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">가상 시나리오 수당/마진 계산</p>
</div>
<!-- 07 -->
<div style="display: flex; align-items: center; gap: 5pt; background: #FFFFFF; border: 1pt solid #DBEAFE; border-radius: 4pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<rect x="5" y="2" width="10" height="16" rx="2" fill="none" stroke="#2563EB" stroke-width="1" opacity="0.5"/>
<circle cx="10" cy="16" r="1" fill="#2563EB" opacity="0.5"/>
<rect x="7" y="5" width="6" height="8" rx="0.5" fill="rgba(37,99,235,0.1)"/>
<rect x="8" y="6" width="4" height="1.5" rx="0.3" fill="#2563EB" opacity="0.4"/>
<rect x="8" y="8.5" width="4" height="1.5" rx="0.3" fill="#10B981" opacity="0.4"/>
<rect x="8" y="11" width="4" height="1.5" rx="0.3" fill="#8B5CF6" opacity="0.4"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #1E293B; white-space: nowrap;">모바일 대응</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">스마트폰으로 KPI 확인/승인</p>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1.5pt; background: #DBEAFE; margin-bottom: 8pt;"></div>
<!-- 역할별 맞춤 화면 -->
<div style="margin-bottom: 9pt;">
<div style="background: #EFF6FF; border-radius: 3pt; padding: 3pt 8pt; display: inline-block; margin-bottom: 5pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #1E40AF;">역할별 맞춤 화면</p>
</div>
<div style="display: flex; gap: 4pt;">
<!-- CEO -->
<div style="flex: 1; background: #FFFFFF; border: 1.5pt solid #DBEAFE; border-radius: 5pt; padding: 6pt 4pt; text-align: center; box-shadow: 0 1pt 2pt rgba(30,64,175,0.04);">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="12" cy="8" r="4" fill="none" stroke="#2563EB" stroke-width="1.2"/>
<path d="M4 20 Q4 14 12 14 Q20 14 20 20" fill="none" stroke="#2563EB" stroke-width="1.2"/>
<path d="M8 4 L12 1 L16 4" fill="none" stroke="#F59E0B" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" opacity="0.7"/>
</svg>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 800; color: #2563EB;">CEO</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: #475569; margin-top: 1pt;">전사 KPI 총괄</p>
</div>
<!-- 관리자 -->
<div style="flex: 1; background: #FFFFFF; border: 1.5pt solid #DBEAFE; border-radius: 5pt; padding: 6pt 4pt; text-align: center; box-shadow: 0 1pt 2pt rgba(30,64,175,0.04);">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="8" cy="8" r="3" fill="none" stroke="#10B981" stroke-width="1"/>
<circle cx="16" cy="8" r="3" fill="none" stroke="#10B981" stroke-width="1" opacity="0.6"/>
<path d="M2 18 Q2 13 8 13 Q14 13 14 18" fill="none" stroke="#10B981" stroke-width="1"/>
<path d="M12 18 Q12 13 16 13 Q22 13 22 18" fill="none" stroke="#10B981" stroke-width="1" opacity="0.5"/>
</svg>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 800; color: #10B981;">관리자</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: #475569; margin-top: 1pt;">팀 실적 관리</p>
</div>
<!-- 운영자 -->
<div style="flex: 1; background: #FFFFFF; border: 1.5pt solid #DBEAFE; border-radius: 5pt; padding: 6pt 4pt; text-align: center; box-shadow: 0 1pt 2pt rgba(30,64,175,0.04);">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="12" cy="12" r="8" fill="none" stroke="#F59E0B" stroke-width="1" opacity="0.4"/>
<circle cx="12" cy="12" r="3" fill="none" stroke="#F59E0B" stroke-width="1.2"/>
<line x1="12" y1="4" x2="12" y2="6" stroke="#F59E0B" stroke-width="1" stroke-linecap="round"/>
<line x1="12" y1="18" x2="12" y2="20" stroke="#F59E0B" stroke-width="1" stroke-linecap="round"/>
<line x1="4" y1="12" x2="6" y2="12" stroke="#F59E0B" stroke-width="1" stroke-linecap="round"/>
<line x1="18" y1="12" x2="20" y2="12" stroke="#F59E0B" stroke-width="1" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 800; color: #F59E0B;">운영자</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: #475569; margin-top: 1pt;">인력/승인 관리</p>
</div>
<!-- 영업자 -->
<div style="flex: 1; background: #FFFFFF; border: 1.5pt solid #DBEAFE; border-radius: 5pt; padding: 6pt 4pt; text-align: center; box-shadow: 0 1pt 2pt rgba(30,64,175,0.04);">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<rect x="4" y="3" width="16" height="18" rx="2" fill="none" stroke="#8B5CF6" stroke-width="1" opacity="0.5"/>
<line x1="7" y1="8" x2="17" y2="8" stroke="#8B5CF6" stroke-width="0.7" opacity="0.4"/>
<line x1="7" y1="11" x2="14" y2="11" stroke="#8B5CF6" stroke-width="0.7" opacity="0.4"/>
<line x1="7" y1="14" x2="12" y2="14" stroke="#8B5CF6" stroke-width="0.7" opacity="0.4"/>
<path d="M14 16 L16 18 L20 13" fill="none" stroke="#8B5CF6" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 800; color: #8B5CF6;">영업자</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: #475569; margin-top: 1pt;">내 실적 조회</p>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1.5pt; background: #DBEAFE; margin-bottom: 8pt;"></div>
<!-- 투자 비용 -->
<div style="margin-bottom: 9pt;">
<div style="background: #EFF6FF; border-radius: 3pt; padding: 3pt 8pt; display: inline-block; margin-bottom: 5pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #1E40AF;">투자 비용</p>
</div>
<div style="display: flex; gap: 5pt;">
<!-- 기본 패키지 -->
<div style="flex: 1;">
<div style="background: #FFFFFF; border: 1.5pt solid #DBEAFE; border-radius: 6pt; padding: 7pt 8pt; margin-bottom: 3pt; box-shadow: 0 1pt 2pt rgba(30,64,175,0.04);">
<div style="display: flex; align-items: center; gap: 4pt; margin-bottom: 3pt;">
<svg viewBox="0 0 14 14" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg">
<rect x="1" y="1" width="12" height="12" rx="2" fill="none" stroke="#2563EB" stroke-width="1" opacity="0.5"/>
<path d="M4 7 L6 9 L10 5" fill="none" stroke="#2563EB" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: #2563EB;">대시보드 포함 기본 패키지</p>
</div>
<p style="white-space: nowrap; font-size: 13pt; font-weight: 800; color: #1E293B;">2,000만원</p>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">+ 월 50만원 (유지보수)</p>
</div>
<div style="background: #EFF6FF; border-radius: 3pt; padding: 3pt 5pt;">
<p style="font-size: 5.5pt; color: #94A3B8; line-height: 1.4;">CEO 대시보드 + 견적/수주 + 생산</p>
<p style="font-size: 5.5pt; color: #94A3B8; line-height: 1.4;">인사/회계 무료 포함</p>
</div>
</div>
<!-- 추가 옵션 -->
<div style="flex: 1;">
<div style="background: #FFFFFF; border: 1.5pt solid #DBEAFE; border-radius: 6pt; padding: 7pt 8pt; box-shadow: 0 1pt 2pt rgba(30,64,175,0.04);">
<div style="display: flex; align-items: center; gap: 4pt; margin-bottom: 4pt;">
<svg viewBox="0 0 14 14" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="7" cy="7" r="5.5" fill="none" stroke="#F59E0B" stroke-width="1" opacity="0.5"/>
<line x1="7" y1="4.5" x2="7" y2="9.5" stroke="#F59E0B" stroke-width="1" stroke-linecap="round"/>
<line x1="4.5" y1="7" x2="9.5" y2="7" stroke="#F59E0B" stroke-width="1" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: #F59E0B;">추가 옵션 (선택)</p>
</div>
<div style="display: flex; flex-direction: column; gap: 3pt;">
<div style="display: flex; justify-content: space-between;">
<p style="white-space: nowrap; font-size: 6pt; color: #475569;">생산공정 관리</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #F59E0B;">+500만원</p>
</div>
<div style="display: flex; justify-content: space-between;">
<p style="white-space: nowrap; font-size: 6pt; color: #475569;">품질관리(인정검사)</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #F59E0B;">+2,000만원</p>
</div>
<div style="display: flex; justify-content: space-between;">
<p style="white-space: nowrap; font-size: 6pt; color: #475569;">AI 견적 자동 생성</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #F59E0B;">월 10~20만원</p>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1.5pt; background: #DBEAFE; margin-bottom: 8pt;"></div>
<!-- 도입 프로세스 -->
<div style="margin-bottom: 6pt;">
<div style="background: #EFF6FF; border-radius: 3pt; padding: 3pt 8pt; display: inline-block; margin-bottom: 5pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #1E40AF;">도입 프로세스</p>
</div>
<div style="display: flex; gap: 2pt; align-items: center;">
<div style="flex: 1; border-radius: 5pt; padding: 4pt 2pt; text-align: center; background: #FFFFFF; border: 1.5pt solid #DBEAFE; box-shadow: 0 1pt 2pt rgba(30,64,175,0.04);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<circle cx="8" cy="5" r="3" fill="none" stroke="#2563EB" stroke-width="0.8"/>
<path d="M4 14 Q4 10 8 10 Q12 10 12 14" fill="none" stroke="#2563EB" stroke-width="0.8"/>
<path d="M13 5 L15 5 M14 4 L14 6" stroke="#2563EB" stroke-width="0.6" stroke-linecap="round" opacity="0.6"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: #94A3B8;">1~2주</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: #1E293B;">현장 인터뷰</p>
</div>
<svg viewBox="0 0 8 8" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M2 4 L6 4 M5 2.5 L6.5 4 L5 5.5" fill="none" stroke="#DBEAFE" stroke-width="0.8" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div style="flex: 1; border-radius: 5pt; padding: 4pt 2pt; text-align: center; background: #FFFFFF; border: 1.5pt solid #DBEAFE; box-shadow: 0 1pt 2pt rgba(30,64,175,0.04);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<rect x="3" y="2" width="10" height="12" rx="1.5" fill="none" stroke="#10B981" stroke-width="0.8"/>
<line x1="6" y1="5" x2="10" y2="5" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
<line x1="6" y1="7" x2="10" y2="7" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
<line x1="6" y1="9" x2="10" y2="9" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
<line x1="6" y1="11" x2="9" y2="11" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: #94A3B8;">2~4주</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: #1E293B;">맞춤 개발</p>
</div>
<svg viewBox="0 0 8 8" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M2 4 L6 4 M5 2.5 L6.5 4 L5 5.5" fill="none" stroke="#DBEAFE" stroke-width="0.8" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div style="flex: 1; border-radius: 5pt; padding: 4pt 2pt; text-align: center; background: #FFFFFF; border: 1.5pt solid #DBEAFE; box-shadow: 0 1pt 2pt rgba(30,64,175,0.04);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<rect x="2" y="3" width="5" height="10" rx="1" fill="none" stroke="#8B5CF6" stroke-width="0.8" opacity="0.5"/>
<rect x="9" y="3" width="5" height="10" rx="1" fill="none" stroke="#8B5CF6" stroke-width="0.8"/>
<path d="M7 7 L9 8 M7 8 L9 7" stroke="#8B5CF6" stroke-width="0.5" opacity="0.4"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: #94A3B8;">1~2주</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: #1E293B;">데이터 이관</p>
</div>
<svg viewBox="0 0 8 8" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M2 4 L6 4 M5 2.5 L6.5 4 L5 5.5" fill="none" stroke="#DBEAFE" stroke-width="0.8" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div style="flex: 1; border-radius: 5pt; padding: 4pt 2pt; text-align: center; background: #FFFFFF; border: 1.5pt solid #DBEAFE; box-shadow: 0 1pt 2pt rgba(30,64,175,0.04);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<path d="M8 2 L14 8 L8 14 L2 8 Z" fill="none" stroke="#F59E0B" stroke-width="0.8"/>
<path d="M5.5 8 L7 9.5 L10.5 6" fill="none" stroke="#F59E0B" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: #94A3B8;">1~2주</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: #1E293B;">교육/안정화</p>
</div>
</div>
</div>
<!-- CTA 푸터 -->
<div style="margin-top: auto; background: #1E40AF; border-radius: 7pt; padding: 9pt 12pt;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<div style="display: flex; align-items: center; gap: 6pt;">
<svg viewBox="0 0 22 22" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="11" cy="11" r="9" fill="none" stroke="rgba(255,255,255,0.5)" stroke-width="1.2"/>
<path d="M11 6 L11 11 L15 13" fill="none" stroke="#FFFFFF" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.6); margin-top: 1pt;">대표님 전용 대시보드를 직접 체험</p>
</div>
</div>
<div style="text-align: right;">
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.5); margin-top: 1pt;">www.sam.it.kr</p>
</div>
</div>
</div>
<!-- 회사명 -->
<div style="margin-top: 4pt; text-align: center;">
<p style="white-space: nowrap; font-size: 5.5pt; color: #94A3B8;">SAM — Smart Automation Management</p>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,231 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
width: 405pt; height: 720pt;
font-family: 'Pretendard', sans-serif;
background: #FFFFFF;
padding: 0;
display: flex; flex-direction: column;
}
</style>
</head>
<body>
<!-- 블루 헤더 바 -->
<div style="background: #1E40AF; padding: 10pt 22pt; display: flex; align-items: center; gap: 8pt;">
<img src="/home/aweso/sam/docs/assets/bi/sam_bi_white.png" style="height: 20pt;">
<div style="flex: 1;"></div>
<div style="background: rgba(255,255,255,0.15); border-radius: 3pt; padding: 2pt 8pt;">
<p style="white-space: nowrap; font-size: 6.5pt; color: #FFFFFF; font-weight: 600; letter-spacing: 0.05em;">CEO DASHBOARD</p>
</div>
</div>
<!-- 본문 영역 -->
<div style="flex: 1; padding: 18pt 22pt 12pt 22pt; display: flex; flex-direction: column;">
<!-- 히어로 섹션 -->
<div style="display: flex; align-items: center; gap: 14pt; margin-bottom: 16pt;">
<div style="flex: 1;">
<p style="white-space: nowrap; font-size: 8pt; font-weight: 600; color: #2563EB; letter-spacing: 0.1em; margin-bottom: 5pt;">EXECUTIVE DASHBOARD</p>
<h1 style="font-size: 19pt; font-weight: 800; color: #1E293B; line-height: 1.35; margin-bottom: 6pt;">대표님, 우리 회사<br>지금 어떤 상태인가요?</h1>
<p style="font-size: 8pt; color: #475569; line-height: 1.55;">매출, 수주, 조직 실적, 승인 대기</p>
<p style="font-size: 8pt; color: #475569; line-height: 1.55;">더 이상 보고를 기다리지 마세요.</p>
</div>
<!-- 히어로 아이콘 -->
<div style="flex-shrink: 0; width: 80pt; height: 80pt;">
<svg viewBox="0 0 90 90" width="80pt" height="80pt" xmlns="http://www.w3.org/2000/svg">
<rect x="8" y="10" width="74" height="50" rx="5" fill="none" stroke="#2563EB" stroke-width="1.5" opacity="0.5"/>
<rect x="12" y="14" width="66" height="42" rx="3" fill="#FFFFFF"/>
<rect x="15" y="17" width="14" height="10" rx="1.5" fill="rgba(37,99,235,0.15)"/>
<rect x="31" y="17" width="14" height="10" rx="1.5" fill="rgba(16,185,129,0.15)"/>
<rect x="47" y="17" width="14" height="10" rx="1.5" fill="rgba(139,92,246,0.15)"/>
<rect x="63" y="17" width="12" height="10" rx="1.5" fill="rgba(239,68,68,0.15)"/>
<path d="M16 45 L22 40 L28 42 L34 36 L40 33 L46 30 L52 32 L58 26 L64 28 L70 22 L75 25" fill="none" stroke="#2563EB" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" opacity="0.8"/>
<path d="M16 45 L22 40 L28 42 L34 36 L40 33 L46 30 L52 32 L58 26 L64 28 L70 22 L75 25 L75 50 L16 50 Z" fill="#2563EB" opacity="0.08"/>
<rect x="36" y="60" width="18" height="3" rx="1" fill="#2563EB" opacity="0.3"/>
<rect x="32" y="63" width="26" height="2" rx="1" fill="#2563EB" opacity="0.2"/>
<circle cx="73" cy="14" r="5" fill="#EF4444" opacity="0.9"/>
<text x="73" y="16.5" text-anchor="middle" fill="#fff" font-size="6" font-weight="800">5</text>
<path d="M66 72 Q72 66 78 72" fill="none" stroke="#10B981" stroke-width="1" opacity="0.4"/>
<path d="M63 76 Q72 68 81 76" fill="none" stroke="#10B981" stroke-width="1" opacity="0.25"/>
<circle cx="72" cy="76" r="1.5" fill="#10B981" opacity="0.5"/>
</svg>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1.5pt; background: #DBEAFE; margin-bottom: 16pt;"></div>
<!-- 대시보드 Mock UI -->
<div style="background: #FFFFFF; border: 1.5pt solid #DBEAFE; border-radius: 7pt; padding: 9pt; margin-bottom: 16pt; box-shadow: 0 1pt 4pt rgba(30,64,175,0.06);">
<!-- 타이틀바 -->
<div style="display: flex; align-items: center; gap: 3pt; margin-bottom: 6pt;">
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #EF4444;"></div>
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #F59E0B;"></div>
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #10B981;"></div>
<p style="white-space: nowrap; font-size: 5.5pt; color: #94A3B8; margin-left: 5pt;">SAM CEO Dashboard ― 로그인 후 3초</p>
</div>
<!-- KPI 카드 -->
<div style="display: flex; gap: 3pt; margin-bottom: 5pt;">
<div style="flex: 1; background: #EFF6FF; border: 1pt solid #DBEAFE; border-radius: 4pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<rect x="2" y="9" width="3" height="5" rx="0.5" fill="#2563EB" opacity="0.4"/>
<rect x="6" y="5" width="3" height="9" rx="0.5" fill="#2563EB" opacity="0.7"/>
<rect x="10" y="2" width="3" height="12" rx="0.5" fill="#2563EB"/>
</svg>
<p style="white-space: nowrap; font-size: 11pt; font-weight: 800; color: #1E293B;">5.2억</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">&#9650; 15.3%</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #2563EB; font-weight: 600; margin-top: 1pt;">월 매출</p>
</div>
<div style="flex: 1; background: rgba(16,185,129,0.06); border: 1pt solid rgba(16,185,129,0.15); border-radius: 4pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<rect x="2" y="2" width="12" height="12" rx="2" fill="none" stroke="#10B981" stroke-width="1" opacity="0.5"/>
<path d="M5 8 L7 10 L11 6" fill="none" stroke="#10B981" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 11pt; font-weight: 800; color: #1E293B;">127건</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">&#9650; 8건</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #10B981; font-weight: 600; margin-top: 1pt;">누적 수주</p>
</div>
<div style="flex: 1; background: rgba(139,92,246,0.06); border: 1pt solid rgba(139,92,246,0.15); border-radius: 4pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<circle cx="8" cy="8" r="5.5" fill="none" stroke="#8B5CF6" stroke-width="1" opacity="0.3"/>
<circle cx="8" cy="8" r="5.5" fill="none" stroke="#8B5CF6" stroke-width="1.5" stroke-dasharray="32 35" stroke-dashoffset="-9" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 11pt; font-weight: 800; color: #1E293B;">96%</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">목표 달성</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #8B5CF6; font-weight: 600; margin-top: 1pt;">납기 준수율</p>
</div>
<div style="flex: 1; background: rgba(239,68,68,0.06); border: 1pt solid rgba(239,68,68,0.15); border-radius: 4pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<path d="M8 2 L14 12 L2 12 Z" fill="none" stroke="#EF4444" stroke-width="1" stroke-linejoin="round"/>
<line x1="8" y1="6" x2="8" y2="9" stroke="#EF4444" stroke-width="1.2" stroke-linecap="round"/>
<circle cx="8" cy="10.5" r="0.6" fill="#EF4444"/>
</svg>
<p style="white-space: nowrap; font-size: 11pt; font-weight: 800; color: #EF4444;">5건</p>
<p style="white-space: nowrap; font-size: 5pt; color: #EF4444; font-weight: 700;">즉시 처리</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #EF4444; font-weight: 600; margin-top: 1pt;">승인 대기</p>
</div>
</div>
<!-- 라인 차트 + 도넛 -->
<div style="display: flex; gap: 4pt;">
<div style="flex: 3; background: #EFF6FF; border-radius: 3pt; padding: 4pt 5pt;">
<p style="white-space: nowrap; font-size: 5pt; color: #94A3B8; margin-bottom: 2pt;">월별 매출 추이</p>
<svg viewBox="0 0 150 35" width="100%" height="26pt" xmlns="http://www.w3.org/2000/svg">
<line x1="0" y1="10" x2="150" y2="10" stroke="rgba(30,64,175,0.05)" stroke-width="0.5"/>
<line x1="0" y1="20" x2="150" y2="20" stroke="rgba(30,64,175,0.05)" stroke-width="0.5"/>
<path d="M5 30 L18 24 L31 26 L44 20 L57 16 L70 12 L83 14 L96 8 L109 10 L122 4 L135 7 L135 33 L5 33 Z" fill="#2563EB" opacity="0.08"/>
<path d="M5 30 L18 24 L31 26 L44 20 L57 16 L70 12 L83 14 L96 8 L109 10 L122 4 L135 7" fill="none" stroke="#2563EB" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="122" cy="4" r="2" fill="#2563EB"/>
</svg>
</div>
<div style="flex: 2; background: #EFF6FF; border-radius: 3pt; padding: 4pt 5pt; display: flex; align-items: center; gap: 4pt;">
<svg viewBox="0 0 40 40" width="30pt" height="30pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="20" cy="20" r="14" fill="none" stroke="rgba(30,64,175,0.06)" stroke-width="4.5"/>
<circle cx="20" cy="20" r="14" fill="none" stroke="#2563EB" stroke-width="4.5" stroke-dasharray="33 55" stroke-dashoffset="22" stroke-linecap="round"/>
<circle cx="20" cy="20" r="14" fill="none" stroke="#10B981" stroke-width="4.5" stroke-dasharray="22 66" stroke-dashoffset="-11" stroke-linecap="round"/>
<circle cx="20" cy="20" r="14" fill="none" stroke="#8B5CF6" stroke-width="4.5" stroke-dasharray="19 69" stroke-dashoffset="-33" stroke-linecap="round"/>
<circle cx="20" cy="20" r="14" fill="none" stroke="#F59E0B" stroke-width="4.5" stroke-dasharray="12 76" stroke-dashoffset="-52" stroke-linecap="round"/>
</svg>
<div style="display: flex; flex-direction: column; gap: 2pt;">
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #2563EB; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4.5pt; color: #475569;">영업1팀</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #10B981; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4.5pt; color: #475569;">영업2팀</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #8B5CF6; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4.5pt; color: #475569;">생산팀</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #F59E0B; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4.5pt; color: #475569;">품질팀</p>
</div>
</div>
</div>
</div>
</div>
<!-- 대표님이 얻는 것 -->
<div style="margin-bottom: 16pt;">
<div style="background: #EFF6FF; border-radius: 3pt; padding: 3pt 8pt; display: inline-block; margin-bottom: 7pt;">
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: #1E40AF;">대표님이 얻는 것</p>
</div>
<div style="display: flex; gap: 4pt;">
<!-- 즉시 현황 파악 -->
<div style="flex: 1; background: #FFFFFF; border: 1.5pt solid #DBEAFE; border-radius: 6pt; padding: 7pt 5pt; text-align: center; box-shadow: 0 1pt 3pt rgba(30,64,175,0.04);">
<svg viewBox="0 0 28 28" width="18pt" height="18pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 3pt;">
<circle cx="14" cy="14" r="10" fill="none" stroke="#2563EB" stroke-width="1.2" opacity="0.4"/>
<path d="M14 8 L14 14 L18 17" fill="none" stroke="#2563EB" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="14" cy="14" r="1.5" fill="#2563EB"/>
<path d="M22 5 L20 10 L23 10 L21 15" fill="none" stroke="#F59E0B" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="font-size: 7pt; font-weight: 700; color: #1E293B; white-space: nowrap;">즉시 현황 파악</p>
<p style="font-size: 5.5pt; color: #94A3B8; margin-top: 2pt; line-height: 1.4;">로그인 3초면<br>전사 현황 확인</p>
</div>
<!-- 데이터 기반 의사결정 -->
<div style="flex: 1; background: #FFFFFF; border: 1.5pt solid #DBEAFE; border-radius: 6pt; padding: 7pt 5pt; text-align: center; box-shadow: 0 1pt 3pt rgba(30,64,175,0.04);">
<svg viewBox="0 0 28 28" width="18pt" height="18pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 3pt;">
<circle cx="14" cy="12" r="8" fill="none" stroke="#10B981" stroke-width="1.2" opacity="0.4"/>
<path d="M11 8 Q14 6 17 8" fill="none" stroke="#10B981" stroke-width="1" stroke-linecap="round"/>
<path d="M10 12 Q14 10 18 12" fill="none" stroke="#10B981" stroke-width="1" stroke-linecap="round"/>
<path d="M11 16 Q14 14 17 16" fill="none" stroke="#10B981" stroke-width="1" stroke-linecap="round"/>
<circle cx="8" cy="22" r="1.2" fill="#10B981" opacity="0.6"/>
<circle cx="14" cy="22" r="1.2" fill="#10B981" opacity="0.8"/>
<circle cx="20" cy="22" r="1.2" fill="#10B981"/>
<line x1="8" y1="22" x2="20" y2="22" stroke="#10B981" stroke-width="0.5" opacity="0.3"/>
</svg>
<p style="font-size: 7pt; font-weight: 700; color: #1E293B; white-space: nowrap;">데이터로 판단</p>
<p style="font-size: 5.5pt; color: #94A3B8; margin-top: 2pt; line-height: 1.4;">감이 아닌 숫자로<br>KPI/팀 성과 비교</p>
</div>
<!-- 빠른 승인 -->
<div style="flex: 1; background: #FFFFFF; border: 1.5pt solid #DBEAFE; border-radius: 6pt; padding: 7pt 5pt; text-align: center; box-shadow: 0 1pt 3pt rgba(30,64,175,0.04);">
<svg viewBox="0 0 28 28" width="18pt" height="18pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 3pt;">
<circle cx="14" cy="14" r="9" fill="none" stroke="#8B5CF6" stroke-width="1.2" opacity="0.4"/>
<path d="M9 14 L12.5 17.5 L19 10.5" fill="none" stroke="#8B5CF6" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<rect x="20" y="19" width="5" height="8" rx="1" fill="none" stroke="#8B5CF6" stroke-width="0.8" opacity="0.5"/>
<circle cx="22.5" cy="25.5" r="0.5" fill="#8B5CF6" opacity="0.5"/>
</svg>
<p style="font-size: 7pt; font-weight: 700; color: #1E293B; white-space: nowrap;">모바일 승인</p>
<p style="font-size: 5.5pt; color: #94A3B8; margin-top: 2pt; line-height: 1.4;">이동중에도 즉시<br>결재/승인 처리</p>
</div>
</div>
</div>
<!-- 기술 태그 -->
<div style="display: flex; gap: 4pt; margin-bottom: 8pt;">
<div style="display: flex; align-items: center; gap: 2pt; background: #EFF6FF; border-radius: 3pt; padding: 3pt 6pt;">
<svg viewBox="0 0 8 8" width="5pt" height="5pt" xmlns="http://www.w3.org/2000/svg"><path d="M2 6 Q4 2 6 6" fill="none" stroke="#3B82F6" stroke-width="0.7"/><path d="M3 6 Q4 4 5 6" fill="none" stroke="#3B82F6" stroke-width="0.7"/><circle cx="4" cy="6.5" r="0.6" fill="#3B82F6"/></svg>
<p style="white-space: nowrap; font-size: 6pt; color: #3B82F6;">클라우드 기반</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: #EFF6FF; border-radius: 3pt; padding: 3pt 6pt;">
<svg viewBox="0 0 8 8" width="5pt" height="5pt" xmlns="http://www.w3.org/2000/svg"><rect x="2" y="0.5" width="4" height="7" rx="0.8" fill="none" stroke="#3B82F6" stroke-width="0.7"/><circle cx="4" cy="6.5" r="0.4" fill="#3B82F6"/></svg>
<p style="white-space: nowrap; font-size: 6pt; color: #3B82F6;">PC + 모바일</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: #EFF6FF; border-radius: 3pt; padding: 3pt 6pt;">
<svg viewBox="0 0 8 8" width="5pt" height="5pt" xmlns="http://www.w3.org/2000/svg"><rect x="1" y="1.5" width="6" height="5" rx="0.8" fill="none" stroke="#3B82F6" stroke-width="0.7"/><circle cx="4" cy="4" r="1.2" fill="none" stroke="#3B82F6" stroke-width="0.5"/></svg>
<p style="white-space: nowrap; font-size: 6pt; color: #3B82F6;">역할별 권한</p>
</div>
</div>
<!-- 푸터 -->
<div style="margin-top: auto; background: #EFF6FF; border-radius: 5pt; padding: 8pt 12pt;">
<div style="display: flex; justify-content: space-between; align-items: flex-end;">
<div>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: #1E293B;">SAM</p>
<p style="white-space: nowrap; font-size: 6.5pt; color: #94A3B8; margin-top: 2pt;">www.sam.it.kr</p>
</div>
<div style="text-align: right;">
<p style="white-space: nowrap; font-size: 6.5pt; color: #94A3B8;">뒷면에서 상세 기능을 확인하세요 &#9654;</p>
</div>
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,27 @@
const path = require('path');
module.paths.unshift(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/node_modules'));
const PptxGenJS = require('pptxgenjs');
const html2pptx = require(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/html2pptx.js'));
async function main() {
const pres = new PptxGenJS();
pres.defineLayout({ name: 'PORTRAIT_9x16', width: 5.625, height: 10 });
pres.layout = 'PORTRAIT_9x16';
const htmlFile = path.join(__dirname, 'slides', 'brochure-dashboard-1page.html');
console.log('Converting CEO Dashboard v7 (Warm Gray + Teal) 1-page brochure...');
try {
await html2pptx(htmlFile, pres);
} catch (err) {
console.error(`Error: ${err.message}`);
}
const outputPath = path.join(__dirname, 'sam-brochure-v7-dashboard-1page.pptx');
await pres.writeFile({ fileName: outputPath });
console.log(`\nPPTX created: ${outputPath}`);
}
main().catch(console.error);

View File

@@ -0,0 +1,31 @@
const path = require('path');
module.paths.unshift(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/node_modules'));
const PptxGenJS = require('pptxgenjs');
const html2pptx = require(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/html2pptx.js'));
async function main() {
const pres = new PptxGenJS();
pres.defineLayout({ name: 'PORTRAIT_9x16', width: 5.625, height: 10 });
pres.layout = 'PORTRAIT_9x16';
const slidesDir = path.join(__dirname, 'slides');
const slides = ['brochure-dashboard-front.html', 'brochure-dashboard-back.html'];
for (const file of slides) {
const htmlFile = path.join(slidesDir, file);
console.log(`Converting ${file} ...`);
try {
await html2pptx(htmlFile, pres);
} catch (err) {
console.error(`Error on ${file}: ${err.message}`);
}
}
const outputPath = path.join(__dirname, 'sam-brochure-v7-dashboard-2page.pptx');
await pres.writeFile({ fileName: outputPath });
console.log(`\nPPTX created: ${outputPath}`);
}
main().catch(console.error);

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,374 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
width: 405pt; height: 720pt;
font-family: 'Pretendard', sans-serif;
background: #FAFAF9;
padding: 22pt 20pt 12pt 20pt;
display: flex; flex-direction: column;
}
</style>
</head>
<body>
<!-- 헤더 -->
<div style="display: flex; align-items: center; gap: 8pt; margin-bottom: 10pt;">
<img src="/home/aweso/sam/docs/assets/bi/sam_bi_black.png" style="height: 20pt;">
<div style="flex: 1;"></div>
<p style="white-space: nowrap; font-size: 6.5pt; color: #A8A29E;">CEO DASHBOARD v7</p>
</div>
<!-- 히어로 -->
<div style="display: flex; align-items: center; gap: 12pt; margin-bottom: 12pt;">
<div style="flex: 1;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 600; color: #0D9488; letter-spacing: 0.1em; margin-bottom: 3pt;">EXECUTIVE DASHBOARD</p>
<h1 style="font-size: 16pt; font-weight: 800; color: #292524; line-height: 1.35; margin-bottom: 5pt;">대표님, 우리 회사<br>지금 어떤 상태인가요?</h1>
<p style="font-size: 7.5pt; color: #57534E; line-height: 1.5;">보고 대기 없이, 로그인 한 번이면<br>전사 현황이 한눈에 들어옵니다.</p>
</div>
<!-- 히어로 SVG 아이콘: 대시보드 모니터 -->
<div style="flex-shrink: 0; width: 72pt; height: 72pt;">
<svg viewBox="0 0 80 80" width="72pt" height="72pt" xmlns="http://www.w3.org/2000/svg">
<rect x="8" y="10" width="64" height="44" rx="4" fill="none" stroke="#0D9488" stroke-width="1.5" opacity="0.6"/>
<rect x="12" y="14" width="56" height="36" rx="2" fill="#FFFFFF"/>
<!-- 미니 차트 바 -->
<rect x="16" y="38" width="6" height="8" rx="1" fill="#0D9488" opacity="0.5"/>
<rect x="24" y="34" width="6" height="12" rx="1" fill="#0D9488" opacity="0.65"/>
<rect x="32" y="30" width="6" height="16" rx="1" fill="#0D9488" opacity="0.8"/>
<rect x="40" y="26" width="6" height="20" rx="1" fill="#0D9488" opacity="0.9"/>
<rect x="48" y="22" width="6" height="24" rx="1" fill="#0D9488"/>
<rect x="56" y="28" width="6" height="18" rx="1" fill="#10B981" opacity="0.7"/>
<!-- 상단 KPI 표시 -->
<circle cx="18" cy="20" r="3" fill="#0D9488" opacity="0.7"/>
<circle cx="28" cy="20" r="3" fill="#10B981" opacity="0.7"/>
<circle cx="38" cy="20" r="3" fill="#8B5CF6" opacity="0.7"/>
<circle cx="48" cy="20" r="3" fill="#EF4444" opacity="0.7"/>
<!-- 모니터 받침대 -->
<rect x="32" y="54" width="16" height="3" rx="1" fill="#0D9488" opacity="0.4"/>
<rect x="28" y="57" width="24" height="2" rx="1" fill="#0D9488" opacity="0.3"/>
<!-- 와이파이 시그널 -->
<path d="M58 62 Q62 58 66 62" fill="none" stroke="#10B981" stroke-width="1" opacity="0.5"/>
<path d="M56 66 Q62 60 68 66" fill="none" stroke="#10B981" stroke-width="1" opacity="0.3"/>
<circle cx="62" cy="66" r="1.5" fill="#10B981" opacity="0.6"/>
</svg>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: #D6D3D1; margin-bottom: 10pt;"></div>
<!-- 대시보드 Mock UI -->
<div style="background: #FFFFFF; border: 1pt solid #E7E5E4; border-radius: 7pt; padding: 8pt; margin-bottom: 9pt; box-shadow: 0 1pt 4pt rgba(0,0,0,0.05);">
<!-- 타이틀바 -->
<div style="display: flex; align-items: center; gap: 3pt; margin-bottom: 6pt;">
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #EF4444;"></div>
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #F59E0B;"></div>
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #10B981;"></div>
<p style="white-space: nowrap; font-size: 5.5pt; color: #A8A29E; margin-left: 5pt;">SAM CEO Dashboard</p>
</div>
<!-- KPI 카드 4개 (SVG 아이콘 포함) -->
<div style="display: flex; gap: 3pt; margin-bottom: 5pt;">
<!-- 월 매출 -->
<div style="flex: 1; background: rgba(13,148,136,0.05); border: 1pt solid rgba(13,148,136,0.15); border-radius: 6pt; padding: 5pt 4pt; text-align: center;">
<svg viewBox="0 0 20 20" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<path d="M3 16 L3 8 L7 8 L7 16 Z" fill="#0D9488" opacity="0.4"/>
<path d="M8 16 L8 5 L12 5 L12 16 Z" fill="#0D9488" opacity="0.65"/>
<path d="M13 16 L13 3 L17 3 L17 16 Z" fill="#0D9488"/>
<path d="M3 16 L17 16" stroke="#0D9488" stroke-width="0.5" opacity="0.4"/>
</svg>
<p style="white-space: nowrap; font-size: 10pt; font-weight: 800; color: #292524;">5.2억</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">&#9650; 15.3%</p>
<p style="white-space: nowrap; font-size: 5pt; color: #0D9488; font-weight: 600; margin-top: 1pt;">월 매출</p>
</div>
<!-- 수주 잔량 -->
<div style="flex: 1; background: rgba(16,185,129,0.05); border: 1pt solid rgba(16,185,129,0.15); border-radius: 6pt; padding: 5pt 4pt; text-align: center;">
<svg viewBox="0 0 20 20" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<rect x="3" y="3" width="14" height="14" rx="2" fill="none" stroke="#10B981" stroke-width="1.2" opacity="0.5"/>
<path d="M6 10 L9 13 L14 7" fill="none" stroke="#10B981" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 10pt; font-weight: 800; color: #292524;">127건</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">&#9650; 8건</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 600; margin-top: 1pt;">수주 잔량</p>
</div>
<!-- 납기 준수율 -->
<div style="flex: 1; background: rgba(139,92,246,0.05); border: 1pt solid rgba(139,92,246,0.15); border-radius: 6pt; padding: 5pt 4pt; text-align: center;">
<svg viewBox="0 0 20 20" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="10" cy="10" r="7" fill="none" stroke="#8B5CF6" stroke-width="1.2" opacity="0.3"/>
<circle cx="10" cy="10" r="7" fill="none" stroke="#8B5CF6" stroke-width="1.5" stroke-dasharray="40 44" stroke-dashoffset="-11" stroke-linecap="round"/>
<text x="10" y="12" text-anchor="middle" fill="#8B5CF6" font-size="5" font-weight="800">96</text>
</svg>
<p style="white-space: nowrap; font-size: 10pt; font-weight: 800; color: #292524;">96%</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">목표 달성</p>
<p style="white-space: nowrap; font-size: 5pt; color: #8B5CF6; font-weight: 600; margin-top: 1pt;">납기 준수율</p>
</div>
<!-- 승인 대기 -->
<div style="flex: 1; background: rgba(239,68,68,0.05); border: 1pt solid rgba(239,68,68,0.15); border-radius: 6pt; padding: 5pt 4pt; text-align: center;">
<svg viewBox="0 0 20 20" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<path d="M10 3 L17 15 L3 15 Z" fill="none" stroke="#EF4444" stroke-width="1.2" stroke-linejoin="round"/>
<line x1="10" y1="8" x2="10" y2="11" stroke="#EF4444" stroke-width="1.5" stroke-linecap="round"/>
<circle cx="10" cy="13" r="0.8" fill="#EF4444"/>
</svg>
<p style="white-space: nowrap; font-size: 10pt; font-weight: 800; color: #EF4444;">5건</p>
<p style="white-space: nowrap; font-size: 5pt; color: #EF4444; font-weight: 700;">즉시 처리</p>
<p style="white-space: nowrap; font-size: 5pt; color: #EF4444; font-weight: 600; margin-top: 1pt;">승인 대기</p>
</div>
</div>
<!-- 차트 영역 -->
<div style="display: flex; gap: 4pt;">
<!-- 매출 추이 (라인 차트 SVG) -->
<div style="flex: 3; background: #F5F5F4; border-radius: 5pt; padding: 4pt 5pt;">
<p style="white-space: nowrap; font-size: 5pt; color: #A8A29E; margin-bottom: 2pt;">월별 매출 추이</p>
<svg viewBox="0 0 160 40" width="100%" height="30pt" xmlns="http://www.w3.org/2000/svg">
<line x1="0" y1="10" x2="160" y2="10" stroke="rgba(41,37,36,0.05)" stroke-width="0.5"/>
<line x1="0" y1="20" x2="160" y2="20" stroke="rgba(41,37,36,0.05)" stroke-width="0.5"/>
<line x1="0" y1="30" x2="160" y2="30" stroke="rgba(41,37,36,0.05)" stroke-width="0.5"/>
<path d="M5 35 L20 28 L35 30 L50 22 L65 18 L80 14 L95 16 L110 10 L125 12 L140 5 L155 8 L155 38 L5 38 Z" fill="#0D9488" opacity="0.08"/>
<path d="M5 35 L20 28 L35 30 L50 22 L65 18 L80 14 L95 16 L110 10 L125 12 L140 5 L155 8" fill="none" stroke="#0D9488" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="140" cy="5" r="2.5" fill="#0D9488"/>
<circle cx="155" cy="8" r="2" fill="#0D9488" opacity="0.5" stroke="#0D9488" stroke-width="0.5" stroke-dasharray="1 1"/>
</svg>
</div>
<!-- 도넛 차트: 팀별 비중 -->
<div style="flex: 2; background: #F5F5F4; border-radius: 5pt; padding: 4pt 5pt; display: flex; align-items: center; gap: 5pt;">
<svg viewBox="0 0 44 44" width="36pt" height="36pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="22" cy="22" r="16" fill="none" stroke="rgba(41,37,36,0.06)" stroke-width="5"/>
<circle cx="22" cy="22" r="16" fill="none" stroke="#0D9488" stroke-width="5" stroke-dasharray="38 62" stroke-dashoffset="25" stroke-linecap="round"/>
<circle cx="22" cy="22" r="16" fill="none" stroke="#10B981" stroke-width="5" stroke-dasharray="25 75" stroke-dashoffset="-13" stroke-linecap="round"/>
<circle cx="22" cy="22" r="16" fill="none" stroke="#8B5CF6" stroke-width="5" stroke-dasharray="22 78" stroke-dashoffset="-38" stroke-linecap="round"/>
<circle cx="22" cy="22" r="16" fill="none" stroke="#F59E0B" stroke-width="5" stroke-dasharray="13 87" stroke-dashoffset="-60" stroke-linecap="round"/>
</svg>
<div style="display: flex; flex-direction: column; gap: 2pt;">
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 4pt; height: 4pt; background: #0D9488; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 5pt; color: #57534E;">영업1팀 38%</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 4pt; height: 4pt; background: #10B981; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 5pt; color: #57534E;">영업2팀 25%</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 4pt; height: 4pt; background: #8B5CF6; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 5pt; color: #57534E;">생산팀 22%</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 4pt; height: 4pt; background: #F59E0B; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 5pt; color: #57534E;">품질팀 15%</p>
</div>
</div>
</div>
</div>
</div>
<!-- 핵심 가치 3개 (SVG 아이콘) -->
<div style="margin-bottom: 9pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #0D9488; margin-bottom: 5pt;">대표님이 얻는 것</p>
<div style="display: flex; gap: 4pt;">
<div style="flex: 1; background: rgba(13,148,136,0.04); border: 1pt solid rgba(13,148,136,0.12); border-radius: 7pt; padding: 7pt 5pt; text-align: center;">
<svg viewBox="0 0 28 28" width="18pt" height="18pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 3pt;">
<circle cx="14" cy="14" r="10" fill="none" stroke="#0D9488" stroke-width="1.2" opacity="0.4"/>
<path d="M14 8 L14 14 L18 17" fill="none" stroke="#0D9488" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="14" cy="14" r="1.5" fill="#0D9488"/>
<path d="M22 5 L20 10 L23 10 L21 15" fill="none" stroke="#F59E0B" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="font-size: 7pt; font-weight: 700; color: #292524; white-space: nowrap;">즉시 현황 파악</p>
<p style="font-size: 5.5pt; color: #A8A29E; margin-top: 2pt; line-height: 1.4;">로그인 3초면<br>전사 현황 확인</p>
</div>
<div style="flex: 1; background: rgba(16,185,129,0.04); border: 1pt solid rgba(16,185,129,0.12); border-radius: 7pt; padding: 7pt 5pt; text-align: center;">
<svg viewBox="0 0 28 28" width="18pt" height="18pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 3pt;">
<circle cx="14" cy="12" r="8" fill="none" stroke="#10B981" stroke-width="1.2" opacity="0.4"/>
<path d="M11 8 Q14 6 17 8" fill="none" stroke="#10B981" stroke-width="1" stroke-linecap="round"/>
<path d="M10 12 Q14 10 18 12" fill="none" stroke="#10B981" stroke-width="1" stroke-linecap="round"/>
<path d="M11 16 Q14 14 17 16" fill="none" stroke="#10B981" stroke-width="1" stroke-linecap="round"/>
<circle cx="8" cy="22" r="1.2" fill="#10B981" opacity="0.6"/>
<circle cx="14" cy="22" r="1.2" fill="#10B981" opacity="0.8"/>
<circle cx="20" cy="22" r="1.2" fill="#10B981"/>
<line x1="8" y1="22" x2="20" y2="22" stroke="#10B981" stroke-width="0.5" opacity="0.3"/>
</svg>
<p style="font-size: 7pt; font-weight: 700; color: #292524; white-space: nowrap;">데이터로 판단</p>
<p style="font-size: 5.5pt; color: #A8A29E; margin-top: 2pt; line-height: 1.4;">감이 아닌 숫자로<br>KPI/팀 성과 비교</p>
</div>
<div style="flex: 1; background: rgba(139,92,246,0.04); border: 1pt solid rgba(139,92,246,0.12); border-radius: 7pt; padding: 7pt 5pt; text-align: center;">
<svg viewBox="0 0 28 28" width="18pt" height="18pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 3pt;">
<circle cx="14" cy="14" r="9" fill="none" stroke="#8B5CF6" stroke-width="1.2" opacity="0.4"/>
<path d="M9 14 L12.5 17.5 L19 10.5" fill="none" stroke="#8B5CF6" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<rect x="20" y="19" width="5" height="8" rx="1" fill="none" stroke="#8B5CF6" stroke-width="0.8" opacity="0.5"/>
<circle cx="22.5" cy="25.5" r="0.5" fill="#8B5CF6" opacity="0.5"/>
</svg>
<p style="font-size: 7pt; font-weight: 700; color: #292524; white-space: nowrap;">모바일 승인</p>
<p style="font-size: 5.5pt; color: #A8A29E; margin-top: 2pt; line-height: 1.4;">이동중에도 즉시<br>결재/승인 처리</p>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: #D6D3D1; margin-bottom: 9pt;"></div>
<!-- 대시보드 6대 기능 (SVG 아이콘 + 텍스트) -->
<div style="margin-bottom: 9pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #F59E0B; margin-bottom: 5pt;">대시보드 핵심 기능</p>
<div style="display: flex; flex-direction: column; gap: 2pt;">
<div style="display: flex; gap: 2pt;">
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: rgba(13,148,136,0.04); border: 1pt solid rgba(13,148,136,0.1); border-radius: 5pt; padding: 4pt 6pt;">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<rect x="2" y="10" width="3" height="6" rx="0.5" fill="#0D9488" opacity="0.5"/>
<rect x="7" y="6" width="3" height="10" rx="0.5" fill="#0D9488" opacity="0.75"/>
<rect x="12" y="2" width="3" height="14" rx="0.5" fill="#0D9488"/>
</svg>
<p style="font-size: 6.5pt; color: #57534E; white-space: nowrap;">실시간 <span style="color: #0D9488; font-weight: 700;">매출/수주 KPI</span></p>
</div>
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: rgba(16,185,129,0.04); border: 1pt solid rgba(16,185,129,0.1); border-radius: 5pt; padding: 4pt 6pt;">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="9" cy="4" r="2.5" fill="none" stroke="#10B981" stroke-width="1"/>
<line x1="9" y1="6.5" x2="9" y2="9" stroke="#10B981" stroke-width="0.8"/>
<line x1="4" y1="9" x2="14" y2="9" stroke="#10B981" stroke-width="0.8"/>
<circle cx="4" cy="12" r="2" fill="none" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<circle cx="9" cy="12" r="2" fill="none" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<circle cx="14" cy="12" r="2" fill="none" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<line x1="4" y1="9" x2="4" y2="10" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<line x1="9" y1="9" x2="9" y2="10" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<line x1="14" y1="9" x2="14" y2="10" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
</svg>
<p style="font-size: 6.5pt; color: #57534E; white-space: nowrap;">조직 계층별 <span style="color: #10B981; font-weight: 700;">실적 트리</span></p>
</div>
</div>
<div style="display: flex; gap: 2pt;">
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: rgba(139,92,246,0.04); border: 1pt solid rgba(139,92,246,0.1); border-radius: 5pt; padding: 4pt 6pt;">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="9" cy="9" r="7" fill="none" stroke="#8B5CF6" stroke-width="1" opacity="0.3"/>
<text x="9" y="11.5" text-anchor="middle" fill="#8B5CF6" font-size="8" font-weight="800">&#8361;</text>
</svg>
<p style="font-size: 6.5pt; color: #57534E; white-space: nowrap;">역할별 <span style="color: #8B5CF6; font-weight: 700;">수당 현황</span></p>
</div>
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: rgba(239,68,68,0.04); border: 1pt solid rgba(239,68,68,0.1); border-radius: 5pt; padding: 4pt 6pt;">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<path d="M9 3 C5 3 3 6 3 9 L3 12 L2 13 L16 13 L15 12 L15 9 C15 6 13 3 9 3 Z" fill="none" stroke="#EF4444" stroke-width="1" opacity="0.6"/>
<circle cx="13" cy="5" r="3" fill="#EF4444"/>
<text x="13" y="6.5" text-anchor="middle" fill="#fff" font-size="4" font-weight="700">5</text>
<path d="M7 14 Q9 16 11 14" fill="none" stroke="#EF4444" stroke-width="0.8" opacity="0.5"/>
</svg>
<p style="font-size: 6.5pt; color: #57534E; white-space: nowrap;">미승인 <span style="color: #EF4444; font-weight: 700;">실시간 알림</span></p>
</div>
</div>
<div style="display: flex; gap: 2pt;">
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: rgba(245,158,11,0.04); border: 1pt solid rgba(245,158,11,0.1); border-radius: 5pt; padding: 4pt 6pt;">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<path d="M3 14 L7 10 L10 12 L15 5" fill="none" stroke="#F59E0B" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M12 5 L15 5 L15 8" fill="none" stroke="#F59E0B" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="font-size: 6.5pt; color: #57534E; white-space: nowrap;">기간별 <span style="color: #F59E0B; font-weight: 700;">트렌드 분석</span></p>
</div>
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: rgba(236,72,153,0.04); border: 1pt solid rgba(236,72,153,0.1); border-radius: 5pt; padding: 4pt 6pt;">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<rect x="2" y="3" width="14" height="12" rx="1.5" fill="none" stroke="#EC4899" stroke-width="1" opacity="0.5"/>
<line x1="5" y1="7" x2="13" y2="7" stroke="#EC4899" stroke-width="0.6" opacity="0.3"/>
<line x1="5" y1="9" x2="11" y2="9" stroke="#EC4899" stroke-width="0.6" opacity="0.3"/>
<line x1="5" y1="11" x2="9" y2="11" stroke="#EC4899" stroke-width="0.6" opacity="0.3"/>
<circle cx="14" cy="13" r="3.5" fill="#FAFAF9" stroke="#EC4899" stroke-width="0.8"/>
<path d="M13 13 L15 13 M14 12 L14 14" stroke="#EC4899" stroke-width="0.8" stroke-linecap="round"/>
</svg>
<p style="font-size: 6.5pt; color: #57534E; white-space: nowrap;">수익 <span style="color: #EC4899; font-weight: 700;">시뮬레이터</span></p>
</div>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: #D6D3D1; margin-bottom: 9pt;"></div>
<!-- Before / After 인포그래픽 -->
<div style="display: flex; gap: 4pt; margin-bottom: 9pt;">
<!-- Before -->
<div style="flex: 5; background: rgba(239,68,68,0.04); border: 1pt solid rgba(239,68,68,0.1); border-radius: 7pt; padding: 5pt 6pt 12pt 6pt;">
<div style="display: flex; align-items: center; gap: 3pt; margin-bottom: 3pt;">
<svg viewBox="0 0 14 14" width="8pt" height="8pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="7" cy="7" r="5.5" fill="none" stroke="#EF4444" stroke-width="1"/>
<line x1="4.5" y1="4.5" x2="9.5" y2="9.5" stroke="#EF4444" stroke-width="1.2" stroke-linecap="round"/>
<line x1="9.5" y1="4.5" x2="4.5" y2="9.5" stroke="#EF4444" stroke-width="1.2" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #EF4444;">BEFORE</p>
</div>
<p style="white-space: nowrap; font-size: 5.5pt; color: #57534E;">매출? 보고 대기 1~2일</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #57534E;">수주? Excel 취합 반나절</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #57534E;">승인? 서류 찾기 30분</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #57534E;">실적? 각 팀장 개별 보고</p>
</div>
<!-- 화살표 -->
<div style="display: flex; align-items: center; flex-shrink: 0;">
<svg viewBox="0 0 20 20" width="14pt" height="14pt" xmlns="http://www.w3.org/2000/svg">
<path d="M4 10 L14 10" stroke="#0D9488" stroke-width="1.5" stroke-linecap="round"/>
<path d="M11 6 L15 10 L11 14" fill="none" stroke="#0D9488" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>
<!-- After -->
<div style="flex: 5; background: rgba(13,148,136,0.04); border: 1pt solid rgba(13,148,136,0.1); border-radius: 7pt; padding: 5pt 6pt 12pt 6pt;">
<div style="display: flex; align-items: center; gap: 3pt; margin-bottom: 3pt;">
<svg viewBox="0 0 14 14" width="8pt" height="8pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="7" cy="7" r="5.5" fill="none" stroke="#0D9488" stroke-width="1"/>
<path d="M4.5 7 L6.5 9 L10 5" fill="none" stroke="#0D9488" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #0D9488;">AFTER (SAM)</p>
</div>
<p style="white-space: nowrap; font-size: 5.5pt; color: #57534E;">로그인 <span style="color:#0D9488;font-weight:600;">3초 전사 현황</span></p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #57534E;">클릭 <span style="color:#0D9488;font-weight:600;">실시간 수주 데이터</span></p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #57534E;">뱃지 <span style="color:#0D9488;font-weight:600;">즉시 승인 처리</span></p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #57534E;">트리 <span style="color:#0D9488;font-weight:600;">전 조직 한눈에</span></p>
</div>
</div>
<!-- 기술 태그 -->
<div style="display: flex; gap: 3pt; margin-bottom: 6pt;">
<div style="display: flex; align-items: center; gap: 2pt; background: #F5F5F4; border-radius: 4pt; padding: 2pt 5pt;">
<svg viewBox="0 0 10 10" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="5" cy="5" r="3.5" fill="none" stroke="#A8A29E" stroke-width="0.8"/>
<path d="M5 2.5 L5 5 L7 6.5" fill="none" stroke="#A8A29E" stroke-width="0.6" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: #A8A29E;">실시간 업데이트</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: #F5F5F4; border-radius: 4pt; padding: 2pt 5pt;">
<svg viewBox="0 0 10 10" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg">
<rect x="2.5" y="1" width="5" height="8" rx="1" fill="none" stroke="#A8A29E" stroke-width="0.8"/>
<circle cx="5" cy="7.5" r="0.5" fill="#A8A29E"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: #A8A29E;">PC + 모바일</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: #F5F5F4; border-radius: 4pt; padding: 2pt 5pt;">
<svg viewBox="0 0 10 10" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg">
<rect x="1.5" y="2" width="7" height="6" rx="1" fill="none" stroke="#A8A29E" stroke-width="0.8"/>
<circle cx="5" cy="5" r="1.5" fill="none" stroke="#A8A29E" stroke-width="0.6"/>
<line x1="6" y1="3.5" x2="7.5" y2="2" stroke="#A8A29E" stroke-width="0.6"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: #A8A29E;">역할별 권한</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: #F5F5F4; border-radius: 4pt; padding: 2pt 5pt;">
<svg viewBox="0 0 10 10" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg">
<path d="M5 1 Q8 1 8 4 L8 5 Q8 8 5 8 Q2 8 2 5 L2 4 Q2 1 5 1 Z" fill="none" stroke="#A8A29E" stroke-width="0.8"/>
<line x1="5" y1="4" x2="5" y2="6" stroke="#A8A29E" stroke-width="0.6" stroke-linecap="round"/>
<circle cx="5" cy="3.5" r="0.5" fill="#A8A29E"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: #A8A29E;">데이터 암호화</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: #F5F5F4; border-radius: 4pt; padding: 2pt 5pt;">
<svg viewBox="0 0 10 10" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg">
<path d="M2 7 Q5 3 8 7" fill="none" stroke="#A8A29E" stroke-width="0.8"/>
<path d="M3.5 7 Q5 5 6.5 7" fill="none" stroke="#A8A29E" stroke-width="0.8"/>
<circle cx="5" cy="7.5" r="0.8" fill="#A8A29E"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: #A8A29E;">클라우드</p>
</div>
</div>
<!-- 푸터 -->
<div style="margin-top: auto; border-top: 1pt solid #D6D3D1; padding-top: 7pt;">
<div style="display: flex; justify-content: space-between; align-items: flex-end;">
<div>
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #57534E;">SAM</p>
<p style="white-space: nowrap; font-size: 6pt; color: #A8A29E; margin-top: 2pt;">www.sam.it.kr</p>
</div>
<div style="text-align: right;">
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,371 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
width: 405pt; height: 720pt;
font-family: 'Pretendard', sans-serif;
background: #FAFAF9;
padding: 20pt 22pt 12pt 22pt;
display: flex; flex-direction: column;
}
</style>
</head>
<body>
<!-- 헤더 -->
<div style="display: flex; align-items: center; gap: 8pt; margin-bottom: 10pt;">
<img src="/home/aweso/sam/docs/assets/bi/sam_bi_black.png" style="height: 18pt;">
<div style="flex: 1;"></div>
<p style="white-space: nowrap; font-size: 6.5pt; color: #A8A29E;">FEATURES &amp; PRICING</p>
</div>
<!-- 대시보드 7대 기능 (SVG 아이콘) -->
<div style="margin-bottom: 9pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #0D9488; margin-bottom: 6pt;">대시보드 핵심 기능</p>
<div style="display: flex; flex-direction: column; gap: 2pt;">
<!-- 01 -->
<div style="display: flex; align-items: center; gap: 5pt; background: rgba(13,148,136,0.04); border: 1pt solid rgba(13,148,136,0.1); border-radius: 6pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<rect x="2" y="11" width="4" height="6" rx="0.5" fill="#0D9488" opacity="0.45"/>
<rect x="8" y="7" width="4" height="10" rx="0.5" fill="#0D9488" opacity="0.7"/>
<rect x="14" y="3" width="4" height="14" rx="0.5" fill="#0D9488"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #292524; white-space: nowrap;">실시간 KPI 카드</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: #A8A29E;">매출, 수주, 납기율, 승인 대기</p>
</div>
<!-- 02 -->
<div style="display: flex; align-items: center; gap: 5pt; background: rgba(16,185,129,0.04); border: 1pt solid rgba(16,185,129,0.1); border-radius: 6pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="10" cy="4.5" r="2.5" fill="none" stroke="#10B981" stroke-width="1.1"/>
<line x1="10" y1="7" x2="10" y2="9.5" stroke="#10B981" stroke-width="0.8"/>
<line x1="5" y1="9.5" x2="15" y2="9.5" stroke="#10B981" stroke-width="0.8"/>
<circle cx="5" cy="13" r="2" fill="none" stroke="#10B981" stroke-width="0.9" opacity="0.6"/>
<circle cx="10" cy="13" r="2" fill="none" stroke="#10B981" stroke-width="0.9" opacity="0.6"/>
<circle cx="15" cy="13" r="2" fill="none" stroke="#10B981" stroke-width="0.9" opacity="0.6"/>
<line x1="5" y1="9.5" x2="5" y2="11" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<line x1="10" y1="9.5" x2="10" y2="11" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<line x1="15" y1="9.5" x2="15" y2="11" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<circle cx="3" cy="17" r="1.3" fill="none" stroke="#10B981" stroke-width="0.6" opacity="0.4"/>
<circle cx="7" cy="17" r="1.3" fill="none" stroke="#10B981" stroke-width="0.6" opacity="0.4"/>
<line x1="5" y1="15" x2="3" y2="15.7" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
<line x1="5" y1="15" x2="7" y2="15.7" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #292524; white-space: nowrap;">조직 실적 트리</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: #A8A29E;">계층별 팀/개인 실적 펼쳐보기</p>
</div>
<!-- 03 -->
<div style="display: flex; align-items: center; gap: 5pt; background: rgba(139,92,246,0.04); border: 1pt solid rgba(139,92,246,0.1); border-radius: 6pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="10" cy="10" r="7.5" fill="none" stroke="#8B5CF6" stroke-width="1" opacity="0.3"/>
<text x="10" y="12.5" text-anchor="middle" fill="#8B5CF6" font-size="9" font-weight="800">&#8361;</text>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #292524; white-space: nowrap;">역할별 수당 현황</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: #A8A29E;">판매자/관리자/협업자 배분 확인</p>
</div>
<!-- 04 -->
<div style="display: flex; align-items: center; gap: 5pt; background: rgba(239,68,68,0.04); border: 1pt solid rgba(239,68,68,0.1); border-radius: 6pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M10 3 C6 3 3 6 3 9.5 L3 13 L1.5 14.5 L18.5 14.5 L17 13 L17 9.5 C17 6 14 3 10 3 Z" fill="none" stroke="#EF4444" stroke-width="1" opacity="0.5"/>
<circle cx="15" cy="5" r="3.5" fill="#EF4444"/>
<text x="15" y="7" text-anchor="middle" fill="#fff" font-size="4.5" font-weight="800">!</text>
<path d="M7.5 15.5 Q10 18 12.5 15.5" fill="none" stroke="#EF4444" stroke-width="0.8" opacity="0.4"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #292524; white-space: nowrap;">승인 대기 알림</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: #A8A29E;">가입/지급 미처리 빨간 뱃지</p>
</div>
<!-- 05 -->
<div style="display: flex; align-items: center; gap: 5pt; background: rgba(245,158,11,0.04); border: 1pt solid rgba(245,158,11,0.1); border-radius: 6pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M3 15 L7 11 L10 13 L16 5" fill="none" stroke="#F59E0B" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M13 5 L16 5 L16 8" fill="none" stroke="#F59E0B" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #292524; white-space: nowrap;">기간별 트렌드</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: #A8A29E;">당월/분기/연간 추이 차트</p>
</div>
<!-- 06 -->
<div style="display: flex; align-items: center; gap: 5pt; background: rgba(236,72,153,0.04); border: 1pt solid rgba(236,72,153,0.1); border-radius: 6pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<rect x="2" y="3" width="16" height="14" rx="2" fill="none" stroke="#EC4899" stroke-width="1" opacity="0.4"/>
<line x1="5" y1="7.5" x2="15" y2="7.5" stroke="#EC4899" stroke-width="0.6" opacity="0.3"/>
<line x1="5" y1="10" x2="12" y2="10" stroke="#EC4899" stroke-width="0.6" opacity="0.3"/>
<line x1="5" y1="12.5" x2="9" y2="12.5" stroke="#EC4899" stroke-width="0.6" opacity="0.3"/>
<circle cx="15.5" cy="14.5" r="3.5" fill="#FAFAF9" stroke="#EC4899" stroke-width="0.9"/>
<path d="M14.5 14.5 L16.5 14.5 M15.5 13.5 L15.5 15.5" stroke="#EC4899" stroke-width="0.8" stroke-linecap="round"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #292524; white-space: nowrap;">수익 시뮬레이터</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: #A8A29E;">가상 시나리오 수당/마진 계산</p>
</div>
<!-- 07 -->
<div style="display: flex; align-items: center; gap: 5pt; background: rgba(13,148,136,0.04); border: 1pt solid rgba(13,148,136,0.1); border-radius: 6pt; padding: 4pt 7pt;">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<rect x="5" y="2" width="10" height="16" rx="2" fill="none" stroke="#0D9488" stroke-width="1" opacity="0.5"/>
<circle cx="10" cy="16" r="1" fill="#0D9488" opacity="0.5"/>
<rect x="7" y="5" width="6" height="8" rx="0.5" fill="rgba(13,148,136,0.1)"/>
<rect x="8" y="6" width="4" height="1.5" rx="0.3" fill="#0D9488" opacity="0.4"/>
<rect x="8" y="8.5" width="4" height="1.5" rx="0.3" fill="#10B981" opacity="0.4"/>
<rect x="8" y="11" width="4" height="1.5" rx="0.3" fill="#8B5CF6" opacity="0.4"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #292524; white-space: nowrap;">모바일 대응</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: #A8A29E;">스마트폰으로 KPI 확인/승인</p>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: #D6D3D1; margin-bottom: 8pt;"></div>
<!-- 역할별 맞춤 화면 (SVG 아이콘) -->
<div style="margin-bottom: 9pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #14B8A6; margin-bottom: 5pt;">역할별 맞춤 화면</p>
<div style="display: flex; gap: 4pt;">
<!-- CEO -->
<div style="flex: 1; background: rgba(13,148,136,0.04); border: 1pt solid rgba(13,148,136,0.12); border-radius: 7pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="12" cy="8" r="4" fill="none" stroke="#0D9488" stroke-width="1.2"/>
<path d="M4 20 Q4 14 12 14 Q20 14 20 20" fill="none" stroke="#0D9488" stroke-width="1.2"/>
<path d="M8 4 L12 1 L16 4" fill="none" stroke="#F59E0B" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" opacity="0.7"/>
</svg>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 800; color: #0D9488;">CEO</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: #57534E; margin-top: 1pt;">전사 KPI 총괄</p>
</div>
<!-- 관리자 -->
<div style="flex: 1; background: rgba(16,185,129,0.04); border: 1pt solid rgba(16,185,129,0.12); border-radius: 7pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="8" cy="8" r="3" fill="none" stroke="#10B981" stroke-width="1"/>
<circle cx="16" cy="8" r="3" fill="none" stroke="#10B981" stroke-width="1" opacity="0.6"/>
<path d="M2 18 Q2 13 8 13 Q14 13 14 18" fill="none" stroke="#10B981" stroke-width="1"/>
<path d="M12 18 Q12 13 16 13 Q22 13 22 18" fill="none" stroke="#10B981" stroke-width="1" opacity="0.5"/>
</svg>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 800; color: #10B981;">관리자</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: #57534E; margin-top: 1pt;">팀 실적 관리</p>
</div>
<!-- 운영자 -->
<div style="flex: 1; background: rgba(245,158,11,0.04); border: 1pt solid rgba(245,158,11,0.12); border-radius: 7pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="12" cy="12" r="8" fill="none" stroke="#F59E0B" stroke-width="1" opacity="0.4"/>
<circle cx="12" cy="12" r="3" fill="none" stroke="#F59E0B" stroke-width="1.2"/>
<line x1="12" y1="4" x2="12" y2="6" stroke="#F59E0B" stroke-width="1" stroke-linecap="round"/>
<line x1="12" y1="18" x2="12" y2="20" stroke="#F59E0B" stroke-width="1" stroke-linecap="round"/>
<line x1="4" y1="12" x2="6" y2="12" stroke="#F59E0B" stroke-width="1" stroke-linecap="round"/>
<line x1="18" y1="12" x2="20" y2="12" stroke="#F59E0B" stroke-width="1" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 800; color: #F59E0B;">운영자</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: #57534E; margin-top: 1pt;">인력/승인 관리</p>
</div>
<!-- 영업자 -->
<div style="flex: 1; background: rgba(139,92,246,0.04); border: 1pt solid rgba(139,92,246,0.12); border-radius: 7pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<rect x="4" y="3" width="16" height="18" rx="2" fill="none" stroke="#8B5CF6" stroke-width="1" opacity="0.5"/>
<line x1="7" y1="8" x2="17" y2="8" stroke="#8B5CF6" stroke-width="0.7" opacity="0.4"/>
<line x1="7" y1="11" x2="14" y2="11" stroke="#8B5CF6" stroke-width="0.7" opacity="0.4"/>
<line x1="7" y1="14" x2="12" y2="14" stroke="#8B5CF6" stroke-width="0.7" opacity="0.4"/>
<path d="M14 16 L16 18 L20 13" fill="none" stroke="#8B5CF6" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 800; color: #8B5CF6;">영업자</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: #57534E; margin-top: 1pt;">내 실적 조회</p>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: #D6D3D1; margin-bottom: 8pt;"></div>
<!-- SAM 통합 플랫폼 연결 -->
<div style="margin-bottom: 9pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #8B5CF6; margin-bottom: 5pt;">대시보드 + SAM ERP/MES 통합</p>
<div style="display: flex; gap: 3pt;">
<div style="flex: 1; background: #F5F5F4; border-radius: 5pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<rect x="2" y="2" width="12" height="12" rx="1.5" fill="none" stroke="#A8A29E" stroke-width="0.8"/>
<line x1="5" y1="6" x2="11" y2="6" stroke="#D6D3D1" stroke-width="0.5"/>
<line x1="5" y1="8" x2="9" y2="8" stroke="#D6D3D1" stroke-width="0.5"/>
<line x1="5" y1="10" x2="11" y2="10" stroke="#D6D3D1" stroke-width="0.5"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: #57534E;">견적/수주</p>
</div>
<div style="flex: 1; background: #F5F5F4; border-radius: 5pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<circle cx="8" cy="8" r="5" fill="none" stroke="#A8A29E" stroke-width="0.8"/>
<circle cx="8" cy="8" r="2" fill="none" stroke="#D6D3D1" stroke-width="0.5"/>
<line x1="8" y1="3" x2="8" y2="4.5" stroke="#D6D3D1" stroke-width="0.5"/>
<line x1="13" y1="8" x2="11.5" y2="8" stroke="#D6D3D1" stroke-width="0.5"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: #57534E;">생산 MES</p>
</div>
<div style="flex: 1; background: #F5F5F4; border-radius: 5pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<path d="M5 3 L11 3 L13 6 L8 14 L3 6 Z" fill="none" stroke="#A8A29E" stroke-width="0.8"/>
<path d="M3 6 L13 6" stroke="#D6D3D1" stroke-width="0.5"/>
<path d="M8 6 L8 14" stroke="#D6D3D1" stroke-width="0.5"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: #57534E;">품질/검사</p>
</div>
<div style="flex: 1; background: #F5F5F4; border-radius: 5pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<rect x="3" y="4" width="10" height="9" rx="1" fill="none" stroke="#A8A29E" stroke-width="0.8"/>
<line x1="3" y1="7" x2="13" y2="7" stroke="#D6D3D1" stroke-width="0.5"/>
<line x1="8" y1="7" x2="8" y2="13" stroke="#D6D3D1" stroke-width="0.5"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: #57534E;">재고/자재</p>
</div>
<div style="flex: 1; background: #F5F5F4; border-radius: 5pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<circle cx="8" cy="6" r="3" fill="none" stroke="#A8A29E" stroke-width="0.8"/>
<path d="M3 14 Q3 10 8 10 Q13 10 13 14" fill="none" stroke="#A8A29E" stroke-width="0.8"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: #57534E;">인사/회계</p>
</div>
</div>
<p style="font-size: 5.5pt; color: #A8A29E; margin-top: 3pt; text-align: center;">대시보드의 모든 데이터는 SAM ERP/MES 실시간 데이터 기반</p>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: #D6D3D1; margin-bottom: 8pt;"></div>
<!-- 투자 비용 -->
<div style="margin-bottom: 9pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #F59E0B; margin-bottom: 5pt;">투자 비용</p>
<div style="display: flex; gap: 5pt;">
<!-- 기본 패키지 -->
<div style="flex: 1;">
<div style="background: rgba(13,148,136,0.04); border: 1pt solid rgba(13,148,136,0.14); border-radius: 7pt; padding: 7pt 8pt; margin-bottom: 3pt;">
<div style="display: flex; align-items: center; gap: 4pt; margin-bottom: 3pt;">
<svg viewBox="0 0 14 14" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg">
<rect x="1" y="1" width="12" height="12" rx="2" fill="none" stroke="#0D9488" stroke-width="1" opacity="0.5"/>
<path d="M4 7 L6 9 L10 5" fill="none" stroke="#0D9488" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: #0D9488;">대시보드 포함 기본 패키지</p>
</div>
<p style="white-space: nowrap; font-size: 13pt; font-weight: 800; color: #292524;">2,000만원</p>
<p style="white-space: nowrap; font-size: 6pt; color: #A8A29E;">+ 월 50만원 (유지보수)</p>
</div>
<div style="background: #F5F5F4; border-radius: 5pt; padding: 3pt 5pt;">
<p style="font-size: 5.5pt; color: #A8A29E; line-height: 1.4;">CEO 대시보드 + 견적/수주 + 생산<br>인사/회계 무료 포함</p>
</div>
</div>
<!-- 추가 옵션 -->
<div style="flex: 1;">
<div style="background: rgba(245,158,11,0.04); border: 1pt solid rgba(245,158,11,0.14); border-radius: 7pt; padding: 7pt 8pt;">
<div style="display: flex; align-items: center; gap: 4pt; margin-bottom: 4pt;">
<svg viewBox="0 0 14 14" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="7" cy="7" r="5.5" fill="none" stroke="#F59E0B" stroke-width="1" opacity="0.5"/>
<line x1="7" y1="4.5" x2="7" y2="9.5" stroke="#F59E0B" stroke-width="1" stroke-linecap="round"/>
<line x1="4.5" y1="7" x2="9.5" y2="7" stroke="#F59E0B" stroke-width="1" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: #F59E0B;">추가 옵션 (선택)</p>
</div>
<div style="display: flex; flex-direction: column; gap: 3pt;">
<div style="display: flex; justify-content: space-between;">
<p style="white-space: nowrap; font-size: 6pt; color: #57534E;">생산공정 관리</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #F59E0B;">+500만원</p>
</div>
<div style="display: flex; justify-content: space-between;">
<p style="white-space: nowrap; font-size: 6pt; color: #57534E;">품질관리(인정검사)</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #F59E0B;">+2,000만원</p>
</div>
<div style="display: flex; justify-content: space-between;">
<p style="white-space: nowrap; font-size: 6pt; color: #57534E;">AI 견적 자동 생성</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #F59E0B;">월 10~20만원</p>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: #D6D3D1; margin-bottom: 8pt;"></div>
<!-- 도입 프로세스 (SVG 화살표 연결) -->
<div style="margin-bottom: 6pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #14B8A6; margin-bottom: 5pt;">도입 프로세스</p>
<div style="display: flex; gap: 2pt; align-items: center;">
<div style="flex: 1; border-radius: 7pt; padding: 4pt 2pt; text-align: center; background: rgba(13,148,136,0.05); border: 1pt solid rgba(13,148,136,0.15);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<circle cx="8" cy="5" r="3" fill="none" stroke="#0D9488" stroke-width="0.8"/>
<path d="M4 14 Q4 10 8 10 Q12 10 12 14" fill="none" stroke="#0D9488" stroke-width="0.8"/>
<path d="M13 5 L15 5 M14 4 L14 6" stroke="#0D9488" stroke-width="0.6" stroke-linecap="round" opacity="0.6"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: #A8A29E;">1~2주</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: #57534E;">현장 인터뷰</p>
</div>
<svg viewBox="0 0 8 8" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M2 4 L6 4 M5 2.5 L6.5 4 L5 5.5" fill="none" stroke="#D6D3D1" stroke-width="0.8" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div style="flex: 1; border-radius: 7pt; padding: 4pt 2pt; text-align: center; background: rgba(16,185,129,0.05); border: 1pt solid rgba(16,185,129,0.15);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<rect x="3" y="2" width="10" height="12" rx="1.5" fill="none" stroke="#10B981" stroke-width="0.8"/>
<line x1="6" y1="5" x2="10" y2="5" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
<line x1="6" y1="7" x2="10" y2="7" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
<line x1="6" y1="9" x2="10" y2="9" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
<line x1="6" y1="11" x2="9" y2="11" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: #A8A29E;">2~4주</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: #57534E;">맞춤 개발</p>
</div>
<svg viewBox="0 0 8 8" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M2 4 L6 4 M5 2.5 L6.5 4 L5 5.5" fill="none" stroke="#D6D3D1" stroke-width="0.8" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div style="flex: 1; border-radius: 7pt; padding: 4pt 2pt; text-align: center; background: rgba(139,92,246,0.05); border: 1pt solid rgba(139,92,246,0.15);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<rect x="2" y="3" width="5" height="10" rx="1" fill="none" stroke="#8B5CF6" stroke-width="0.8" opacity="0.5"/>
<rect x="9" y="3" width="5" height="10" rx="1" fill="none" stroke="#8B5CF6" stroke-width="0.8"/>
<path d="M7 7 L9 8 M7 8 L9 7" stroke="#8B5CF6" stroke-width="0.5" opacity="0.4"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: #A8A29E;">1~2주</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: #57534E;">데이터 이관</p>
</div>
<svg viewBox="0 0 8 8" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M2 4 L6 4 M5 2.5 L6.5 4 L5 5.5" fill="none" stroke="#D6D3D1" stroke-width="0.8" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div style="flex: 1; border-radius: 7pt; padding: 4pt 2pt; text-align: center; background: rgba(245,158,11,0.05); border: 1pt solid rgba(245,158,11,0.15);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<path d="M8 2 L14 8 L8 14 L2 8 Z" fill="none" stroke="#F59E0B" stroke-width="0.8"/>
<path d="M5.5 8 L7 9.5 L10.5 6" fill="none" stroke="#F59E0B" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: #A8A29E;">1~2주</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: #57534E;">교육/안정화</p>
</div>
</div>
</div>
<!-- CTA 푸터 -->
<div style="margin-top: auto; background: rgba(13,148,136,0.04); border: 1.5pt solid rgba(13,148,136,0.15); border-radius: 7pt; padding: 9pt 12pt;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<div style="display: flex; align-items: center; gap: 6pt;">
<svg viewBox="0 0 22 22" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="11" cy="11" r="9" fill="none" stroke="#0D9488" stroke-width="1.2" opacity="0.5"/>
<path d="M11 6 L11 11 L15 13" fill="none" stroke="#0D9488" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div>
<p style="white-space: nowrap; font-size: 6.5pt; color: #A8A29E; margin-top: 1pt;">대표님 전용 대시보드를 직접 체험</p>
</div>
</div>
<div style="text-align: right;">
<p style="white-space: nowrap; font-size: 6pt; color: #A8A29E; margin-top: 1pt;">www.sam.it.kr</p>
</div>
</div>
</div>
<!-- 회사명 -->
<div style="margin-top: 4pt; text-align: center;">
<p style="white-space: nowrap; font-size: 5.5pt; color: #A8A29E;">SAM — Smart Automation Management</p>
</div>
</body>
</html>

View File

@@ -0,0 +1,278 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
width: 405pt; height: 720pt;
font-family: 'Pretendard', sans-serif;
background: #FAFAF9;
padding: 26pt 22pt 16pt 22pt;
display: flex; flex-direction: column;
}
</style>
</head>
<body>
<!-- 헤더 -->
<div style="display: flex; align-items: center; gap: 8pt; margin-bottom: 16pt;">
<img src="/home/aweso/sam/docs/assets/bi/sam_bi_black.png" style="height: 22pt;">
<div style="flex: 1;"></div>
<p style="white-space: nowrap; font-size: 6.5pt; color: #A8A29E;">CEO DASHBOARD v7</p>
</div>
<!-- 히어로 섹션 -->
<div style="display: flex; align-items: center; gap: 14pt; margin-bottom: 18pt;">
<div style="flex: 1;">
<p style="white-space: nowrap; font-size: 8pt; font-weight: 600; color: #0D9488; letter-spacing: 0.1em; margin-bottom: 5pt;">EXECUTIVE DASHBOARD</p>
<h1 style="font-size: 19pt; font-weight: 800; color: #292524; line-height: 1.35; margin-bottom: 6pt;">대표님, 우리 회사<br>지금 어떤 상태인가요?</h1>
<p style="font-size: 8pt; color: #57534E; line-height: 1.55;">매출, 수주, 조직 실적, 승인 대기<br>더 이상 보고를 기다리지 마세요.</p>
</div>
<!-- 히어로 아이콘 -->
<div style="flex-shrink: 0; width: 80pt; height: 80pt;">
<svg viewBox="0 0 90 90" width="80pt" height="80pt" xmlns="http://www.w3.org/2000/svg">
<!-- 모니터 외곽 -->
<rect x="8" y="10" width="74" height="50" rx="5" fill="none" stroke="#0D9488" stroke-width="1.5" opacity="0.5"/>
<rect x="12" y="14" width="66" height="42" rx="3" fill="#FFFFFF"/>
<!-- KPI 미니 카드들 -->
<rect x="15" y="17" width="14" height="10" rx="1.5" fill="rgba(13,148,136,0.15)"/>
<rect x="31" y="17" width="14" height="10" rx="1.5" fill="rgba(16,185,129,0.15)"/>
<rect x="47" y="17" width="14" height="10" rx="1.5" fill="rgba(139,92,246,0.15)"/>
<rect x="63" y="17" width="12" height="10" rx="1.5" fill="rgba(239,68,68,0.15)"/>
<!-- 미니 차트 -->
<path d="M16 45 L22 40 L28 42 L34 36 L40 33 L46 30 L52 32 L58 26 L64 28 L70 22 L75 25" fill="none" stroke="#0D9488" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" opacity="0.8"/>
<path d="M16 45 L22 40 L28 42 L34 36 L40 33 L46 30 L52 32 L58 26 L64 28 L70 22 L75 25 L75 50 L16 50 Z" fill="#0D9488" opacity="0.08"/>
<!-- 모니터 받침 -->
<rect x="36" y="60" width="18" height="3" rx="1" fill="#0D9488" opacity="0.3"/>
<rect x="32" y="63" width="26" height="2" rx="1" fill="#0D9488" opacity="0.2"/>
<!-- 알림 뱃지 -->
<circle cx="73" cy="14" r="5" fill="#EF4444" opacity="0.9"/>
<text x="73" y="16.5" text-anchor="middle" fill="#fff" font-size="6" font-weight="800">5</text>
<!-- 와이파이 -->
<path d="M66 72 Q72 66 78 72" fill="none" stroke="#10B981" stroke-width="1" opacity="0.4"/>
<path d="M63 76 Q72 68 81 76" fill="none" stroke="#10B981" stroke-width="1" opacity="0.25"/>
<circle cx="72" cy="76" r="1.5" fill="#10B981" opacity="0.5"/>
</svg>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: #D6D3D1; margin-bottom: 16pt;"></div>
<!-- 고민 섹션 (타임라인 인포그래픽) -->
<div style="margin-bottom: 16pt;">
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: #EF4444; margin-bottom: 8pt;">대표님의 하루</p>
<div style="display: flex; flex-direction: column; gap: 4pt;">
<!-- AM 9:00 -->
<div style="display: flex; align-items: center; gap: 6pt;">
<svg viewBox="0 0 26 26" width="18pt" height="18pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="13" cy="13" r="11" fill="rgba(239,68,68,0.06)" stroke="rgba(239,68,68,0.2)" stroke-width="1"/>
<circle cx="13" cy="13" r="8" fill="none" stroke="#EF4444" stroke-width="0.8" opacity="0.4"/>
<path d="M13 7 L13 13 L17 15" fill="none" stroke="#EF4444" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
<text x="13" y="22" text-anchor="middle" fill="#EF4444" font-size="3.5" font-weight="600" opacity="0.7">9AM</text>
</svg>
<div style="flex: 1; background: rgba(239,68,68,0.04); border: 1pt solid rgba(239,68,68,0.1); border-radius: 6pt; padding: 6pt 8pt;">
<p style="font-size: 7.5pt; color: #57534E; white-space: nowrap;">"어제 매출 얼마야?" <span style="color: #EF4444; font-weight: 600;">팀장 보고 대기중...</span></p>
</div>
</div>
<!-- PM 2:00 -->
<div style="display: flex; align-items: center; gap: 6pt;">
<svg viewBox="0 0 26 26" width="18pt" height="18pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="13" cy="13" r="11" fill="rgba(239,68,68,0.06)" stroke="rgba(239,68,68,0.2)" stroke-width="1"/>
<circle cx="13" cy="13" r="8" fill="none" stroke="#EF4444" stroke-width="0.8" opacity="0.4"/>
<path d="M13 7 L13 13 L9 16" fill="none" stroke="#EF4444" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
<text x="13" y="22" text-anchor="middle" fill="#EF4444" font-size="3.5" font-weight="600" opacity="0.7">2PM</text>
</svg>
<div style="flex: 1; background: rgba(239,68,68,0.04); border: 1pt solid rgba(239,68,68,0.1); border-radius: 6pt; padding: 6pt 8pt;">
<p style="font-size: 7.5pt; color: #57534E; white-space: nowrap;">"수주 밀린 거 없어?" <span style="color: #EF4444; font-weight: 600;">Excel 취합중...</span></p>
</div>
</div>
<!-- PM 5:00 -->
<div style="display: flex; align-items: center; gap: 6pt;">
<svg viewBox="0 0 26 26" width="18pt" height="18pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="13" cy="13" r="11" fill="rgba(239,68,68,0.06)" stroke="rgba(239,68,68,0.2)" stroke-width="1"/>
<circle cx="13" cy="13" r="8" fill="none" stroke="#EF4444" stroke-width="0.8" opacity="0.4"/>
<path d="M13 7 L13 13 L8 12" fill="none" stroke="#EF4444" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
<text x="13" y="22" text-anchor="middle" fill="#EF4444" font-size="3.5" font-weight="600" opacity="0.7">5PM</text>
</svg>
<div style="flex: 1; background: rgba(239,68,68,0.04); border: 1pt solid rgba(239,68,68,0.1); border-radius: 6pt; padding: 6pt 8pt;">
<p style="font-size: 7.5pt; color: #57534E; white-space: nowrap;">"결재할 것 정리해줘" <span style="color: #EF4444; font-weight: 600;">서류 찾는중...</span></p>
</div>
</div>
</div>
</div>
<!-- 전환 화살표 -->
<div style="text-align: center; margin-bottom: 12pt;">
<svg viewBox="0 0 40 24" width="40pt" height="16pt" xmlns="http://www.w3.org/2000/svg">
<path d="M10 6 L20 18 L30 6" fill="none" stroke="#0D9488" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" opacity="0.6"/>
</svg>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: #0D9488;">SAM 도입 후</p>
</div>
<!-- 대시보드 Mock UI -->
<div style="background: #FFFFFF; border: 1pt solid #E7E5E4; border-radius: 7pt; padding: 9pt; margin-bottom: 16pt; box-shadow: 0 1pt 4pt rgba(0,0,0,0.05);">
<!-- 타이틀바 -->
<div style="display: flex; align-items: center; gap: 3pt; margin-bottom: 6pt;">
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #EF4444;"></div>
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #F59E0B;"></div>
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #10B981;"></div>
<p style="white-space: nowrap; font-size: 5.5pt; color: #A8A29E; margin-left: 5pt;">SAM CEO Dashboard --- 로그인 후 3초</p>
</div>
<!-- KPI 카드 (SVG 아이콘 포함) -->
<div style="display: flex; gap: 3pt; margin-bottom: 5pt;">
<div style="flex: 1; background: rgba(13,148,136,0.06); border: 1pt solid rgba(13,148,136,0.15); border-radius: 6pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<rect x="2" y="9" width="3" height="5" rx="0.5" fill="#0D9488" opacity="0.4"/>
<rect x="6" y="5" width="3" height="9" rx="0.5" fill="#0D9488" opacity="0.7"/>
<rect x="10" y="2" width="3" height="12" rx="0.5" fill="#0D9488"/>
</svg>
<p style="white-space: nowrap; font-size: 11pt; font-weight: 800; color: #292524;">5.2억</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">&#9650; 15.3%</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #0D9488; font-weight: 600; margin-top: 1pt;">월 매출</p>
</div>
<div style="flex: 1; background: rgba(16,185,129,0.06); border: 1pt solid rgba(16,185,129,0.15); border-radius: 6pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<rect x="2" y="2" width="12" height="12" rx="2" fill="none" stroke="#10B981" stroke-width="1" opacity="0.5"/>
<path d="M5 8 L7 10 L11 6" fill="none" stroke="#10B981" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 11pt; font-weight: 800; color: #292524;">127건</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">&#9650; 8건</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #10B981; font-weight: 600; margin-top: 1pt;">누적 수주</p>
</div>
<div style="flex: 1; background: rgba(139,92,246,0.06); border: 1pt solid rgba(139,92,246,0.15); border-radius: 6pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<circle cx="8" cy="8" r="5.5" fill="none" stroke="#8B5CF6" stroke-width="1" opacity="0.3"/>
<circle cx="8" cy="8" r="5.5" fill="none" stroke="#8B5CF6" stroke-width="1.5" stroke-dasharray="32 35" stroke-dashoffset="-9" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 11pt; font-weight: 800; color: #292524;">96%</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">목표 달성</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #8B5CF6; font-weight: 600; margin-top: 1pt;">납기 준수율</p>
</div>
<div style="flex: 1; background: rgba(239,68,68,0.06); border: 1pt solid rgba(239,68,68,0.15); border-radius: 6pt; padding: 4pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<path d="M8 2 L14 12 L2 12 Z" fill="none" stroke="#EF4444" stroke-width="1" stroke-linejoin="round"/>
<line x1="8" y1="6" x2="8" y2="9" stroke="#EF4444" stroke-width="1.2" stroke-linecap="round"/>
<circle cx="8" cy="10.5" r="0.6" fill="#EF4444"/>
</svg>
<p style="white-space: nowrap; font-size: 11pt; font-weight: 800; color: #EF4444;">5건</p>
<p style="white-space: nowrap; font-size: 5pt; color: #EF4444; font-weight: 700;">즉시 처리</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #EF4444; font-weight: 600; margin-top: 1pt;">승인 대기</p>
</div>
</div>
<!-- 라인 차트 + 도넛 -->
<div style="display: flex; gap: 4pt;">
<div style="flex: 3; background: #F5F5F4; border-radius: 5pt; padding: 4pt 5pt;">
<p style="white-space: nowrap; font-size: 5pt; color: #A8A29E; margin-bottom: 2pt;">월별 매출 추이</p>
<svg viewBox="0 0 150 35" width="100%" height="26pt" xmlns="http://www.w3.org/2000/svg">
<line x1="0" y1="10" x2="150" y2="10" stroke="rgba(41,37,36,0.05)" stroke-width="0.5"/>
<line x1="0" y1="20" x2="150" y2="20" stroke="rgba(41,37,36,0.05)" stroke-width="0.5"/>
<path d="M5 30 L18 24 L31 26 L44 20 L57 16 L70 12 L83 14 L96 8 L109 10 L122 4 L135 7 L135 33 L5 33 Z" fill="#0D9488" opacity="0.08"/>
<path d="M5 30 L18 24 L31 26 L44 20 L57 16 L70 12 L83 14 L96 8 L109 10 L122 4 L135 7" fill="none" stroke="#0D9488" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="122" cy="4" r="2" fill="#0D9488"/>
</svg>
</div>
<div style="flex: 2; background: #F5F5F4; border-radius: 5pt; padding: 4pt 5pt; display: flex; align-items: center; gap: 4pt;">
<svg viewBox="0 0 40 40" width="30pt" height="30pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="20" cy="20" r="14" fill="none" stroke="rgba(41,37,36,0.06)" stroke-width="4.5"/>
<circle cx="20" cy="20" r="14" fill="none" stroke="#0D9488" stroke-width="4.5" stroke-dasharray="33 55" stroke-dashoffset="22" stroke-linecap="round"/>
<circle cx="20" cy="20" r="14" fill="none" stroke="#10B981" stroke-width="4.5" stroke-dasharray="22 66" stroke-dashoffset="-11" stroke-linecap="round"/>
<circle cx="20" cy="20" r="14" fill="none" stroke="#8B5CF6" stroke-width="4.5" stroke-dasharray="19 69" stroke-dashoffset="-33" stroke-linecap="round"/>
<circle cx="20" cy="20" r="14" fill="none" stroke="#F59E0B" stroke-width="4.5" stroke-dasharray="12 76" stroke-dashoffset="-52" stroke-linecap="round"/>
</svg>
<div style="display: flex; flex-direction: column; gap: 2pt;">
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #0D9488; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4.5pt; color: #57534E;">영업1팀</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #10B981; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4.5pt; color: #57534E;">영업2팀</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #8B5CF6; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4.5pt; color: #57534E;">생산팀</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #F59E0B; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4.5pt; color: #57534E;">품질팀</p>
</div>
</div>
</div>
</div>
</div>
<!-- 대표님이 얻는 것 -->
<div style="margin-bottom: 12pt;">
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: #0D9488; margin-bottom: 6pt;">대표님이 얻는 것</p>
<div style="display: flex; gap: 4pt;">
<!-- 즉시 현황 파악 -->
<div style="flex: 1; background: rgba(13,148,136,0.04); border: 1pt solid rgba(13,148,136,0.12); border-radius: 7pt; padding: 8pt 5pt; text-align: center;">
<svg viewBox="0 0 28 28" width="18pt" height="18pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 3pt;">
<circle cx="14" cy="14" r="10" fill="none" stroke="#0D9488" stroke-width="1.2" opacity="0.4"/>
<path d="M14 8 L14 14 L18 17" fill="none" stroke="#0D9488" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="14" cy="14" r="1.5" fill="#0D9488"/>
<path d="M22 5 L20 10 L23 10 L21 15" fill="none" stroke="#F59E0B" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="font-size: 7pt; font-weight: 700; color: #292524; white-space: nowrap;">즉시 현황 파악</p>
<p style="font-size: 5.5pt; color: #A8A29E; margin-top: 2pt; line-height: 1.4;">로그인 3초면<br>전사 현황 확인</p>
</div>
<!-- 데이터로 판단 -->
<div style="flex: 1; background: rgba(16,185,129,0.04); border: 1pt solid rgba(16,185,129,0.12); border-radius: 7pt; padding: 8pt 5pt; text-align: center;">
<svg viewBox="0 0 28 28" width="18pt" height="18pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 3pt;">
<circle cx="14" cy="12" r="8" fill="none" stroke="#10B981" stroke-width="1.2" opacity="0.4"/>
<path d="M11 8 Q14 6 17 8" fill="none" stroke="#10B981" stroke-width="1" stroke-linecap="round"/>
<path d="M10 12 Q14 10 18 12" fill="none" stroke="#10B981" stroke-width="1" stroke-linecap="round"/>
<path d="M11 16 Q14 14 17 16" fill="none" stroke="#10B981" stroke-width="1" stroke-linecap="round"/>
<circle cx="8" cy="22" r="1.2" fill="#10B981" opacity="0.6"/>
<circle cx="14" cy="22" r="1.2" fill="#10B981" opacity="0.8"/>
<circle cx="20" cy="22" r="1.2" fill="#10B981"/>
<line x1="8" y1="22" x2="20" y2="22" stroke="#10B981" stroke-width="0.5" opacity="0.3"/>
</svg>
<p style="font-size: 7pt; font-weight: 700; color: #292524; white-space: nowrap;">데이터로 판단</p>
<p style="font-size: 5.5pt; color: #A8A29E; margin-top: 2pt; line-height: 1.4;">감이 아닌 숫자로<br>KPI/팀 성과 비교</p>
</div>
<!-- 모바일 승인 -->
<div style="flex: 1; background: rgba(139,92,246,0.04); border: 1pt solid rgba(139,92,246,0.12); border-radius: 7pt; padding: 8pt 5pt; text-align: center;">
<svg viewBox="0 0 28 28" width="18pt" height="18pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 3pt;">
<circle cx="14" cy="14" r="9" fill="none" stroke="#8B5CF6" stroke-width="1.2" opacity="0.4"/>
<path d="M9 14 L12.5 17.5 L19 10.5" fill="none" stroke="#8B5CF6" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<rect x="20" y="19" width="5" height="8" rx="1" fill="none" stroke="#8B5CF6" stroke-width="0.8" opacity="0.5"/>
<circle cx="22.5" cy="25.5" r="0.5" fill="#8B5CF6" opacity="0.5"/>
</svg>
<p style="font-size: 7pt; font-weight: 700; color: #292524; white-space: nowrap;">모바일 승인</p>
<p style="font-size: 5.5pt; color: #A8A29E; margin-top: 2pt; line-height: 1.4;">이동중에도 즉시<br>결재/승인 처리</p>
</div>
</div>
</div>
<!-- 기술 태그 -->
<div style="display: flex; gap: 4pt; margin-bottom: 8pt;">
<div style="display: flex; align-items: center; gap: 2pt; background: #F5F5F4; border-radius: 4pt; padding: 3pt 6pt;">
<svg viewBox="0 0 8 8" width="5pt" height="5pt" xmlns="http://www.w3.org/2000/svg"><path d="M2 6 Q4 2 6 6" fill="none" stroke="#A8A29E" stroke-width="0.7"/><path d="M3 6 Q4 4 5 6" fill="none" stroke="#A8A29E" stroke-width="0.7"/><circle cx="4" cy="6.5" r="0.6" fill="#A8A29E"/></svg>
<p style="white-space: nowrap; font-size: 6pt; color: #A8A29E;">클라우드 기반</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: #F5F5F4; border-radius: 4pt; padding: 3pt 6pt;">
<svg viewBox="0 0 8 8" width="5pt" height="5pt" xmlns="http://www.w3.org/2000/svg"><rect x="2" y="0.5" width="4" height="7" rx="0.8" fill="none" stroke="#A8A29E" stroke-width="0.7"/><circle cx="4" cy="6.5" r="0.4" fill="#A8A29E"/></svg>
<p style="white-space: nowrap; font-size: 6pt; color: #A8A29E;">PC + 모바일</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: #F5F5F4; border-radius: 4pt; padding: 3pt 6pt;">
<svg viewBox="0 0 8 8" width="5pt" height="5pt" xmlns="http://www.w3.org/2000/svg"><rect x="1" y="1.5" width="6" height="5" rx="0.8" fill="none" stroke="#A8A29E" stroke-width="0.7"/><circle cx="4" cy="4" r="1.2" fill="none" stroke="#A8A29E" stroke-width="0.5"/></svg>
<p style="white-space: nowrap; font-size: 6pt; color: #A8A29E;">역할별 권한</p>
</div>
</div>
<!-- 푸터 -->
<div style="margin-top: auto; border-top: 1pt solid #D6D3D1; padding-top: 8pt;">
<div style="display: flex; justify-content: space-between; align-items: flex-end;">
<div>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: #57534E;">SAM</p>
<p style="white-space: nowrap; font-size: 6.5pt; color: #A8A29E; margin-top: 2pt;">www.sam.it.kr</p>
</div>
<div style="text-align: right;">
<p style="white-space: nowrap; font-size: 6.5pt; color: #A8A29E;">뒷면에서 상세 기능을 확인하세요 &#9654;</p>
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,27 @@
const path = require('path');
module.paths.unshift(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/node_modules'));
const PptxGenJS = require('pptxgenjs');
const html2pptx = require(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/html2pptx.js'));
async function main() {
const pres = new PptxGenJS();
pres.defineLayout({ name: 'PORTRAIT_9x16', width: 5.625, height: 10 });
pres.layout = 'PORTRAIT_9x16';
const htmlFile = path.join(__dirname, 'slides', 'brochure-dashboard-1page.html');
console.log('Converting CEO Dashboard v8 (Two-Tone Split) 1-page brochure...');
try {
await html2pptx(htmlFile, pres);
} catch (err) {
console.error(`Error: ${err.message}`);
}
const outputPath = path.join(__dirname, 'sam-brochure-v8-dashboard-1page.pptx');
await pres.writeFile({ fileName: outputPath });
console.log(`\nPPTX created: ${outputPath}`);
}
main().catch(console.error);

View File

@@ -0,0 +1,31 @@
const path = require('path');
module.paths.unshift(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/node_modules'));
const PptxGenJS = require('pptxgenjs');
const html2pptx = require(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/html2pptx.js'));
async function main() {
const pres = new PptxGenJS();
pres.defineLayout({ name: 'PORTRAIT_9x16', width: 5.625, height: 10 });
pres.layout = 'PORTRAIT_9x16';
const slidesDir = path.join(__dirname, 'slides');
const slides = ['brochure-dashboard-front.html', 'brochure-dashboard-back.html'];
for (const file of slides) {
const htmlFile = path.join(slidesDir, file);
console.log(`Converting ${file} ...`);
try {
await html2pptx(htmlFile, pres);
} catch (err) {
console.error(`Error on ${file}: ${err.message}`);
}
}
const outputPath = path.join(__dirname, 'sam-brochure-v8-dashboard-2page.pptx');
await pres.writeFile({ fileName: outputPath });
console.log(`\nPPTX created: ${outputPath}`);
}
main().catch(console.error);

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,236 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
width: 405pt; height: 720pt;
font-family: 'Pretendard', sans-serif;
background: #FFFFFF;
padding: 0;
display: flex; flex-direction: column;
}
</style>
</head>
<body>
<!-- ===== DARK ZONE (top ~240pt) ===== -->
<div style="background: #1E293B; padding: 20pt 20pt 16pt 20pt;">
<!-- 헤더 -->
<div style="display: flex; align-items: center; gap: 8pt; margin-bottom: 12pt;">
<img src="/home/aweso/sam/docs/assets/bi/sam_bi_white.png" style="height: 20pt;">
<div style="flex: 1;"></div>
<div style="background: rgba(249,115,22,0.15); border: 1pt solid rgba(249,115,22,0.3); border-radius: 3pt; padding: 2pt 7pt;">
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 700; color: #F97316; letter-spacing: 0.08em;">EXECUTIVE DASHBOARD</p>
</div>
</div>
<!-- 히어로 -->
<div style="margin-bottom: 14pt;">
<h1 style="font-size: 16pt; font-weight: 800; color: #FFFFFF; line-height: 1.4; margin-bottom: 4pt;">대표님, 우리 회사</h1>
<h1 style="font-size: 16pt; font-weight: 800; color: #FFFFFF; line-height: 1.4; margin-bottom: 6pt;">지금 어떤 상태인가요?</h1>
<p style="font-size: 7.5pt; color: rgba(255,255,255,0.6); line-height: 1.5;">보고 대기 없이, 로그인 한 번이면 전사 현황이 한눈에.</p>
</div>
<!-- KPI 카드 4개 -->
<div style="display: flex; gap: 4pt;">
<div style="flex: 1; background: rgba(255,255,255,0.08); border: 1pt solid rgba(255,255,255,0.12); border-radius: 5pt; padding: 5pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="8pt" height="8pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<rect x="2" y="9" width="3" height="5" rx="0.5" fill="#F97316" opacity="0.4"/>
<rect x="6" y="5" width="3" height="9" rx="0.5" fill="#F97316" opacity="0.7"/>
<rect x="10" y="2" width="3" height="12" rx="0.5" fill="#F97316"/>
</svg>
<p style="white-space: nowrap; font-size: 10pt; font-weight: 800; color: #FFFFFF;">5.2억</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #10B981; font-weight: 700;">&#9650; 15.3%</p>
<p style="white-space: nowrap; font-size: 4pt; color: #F97316; font-weight: 600; margin-top: 1pt;">월 매출</p>
</div>
<div style="flex: 1; background: rgba(255,255,255,0.08); border: 1pt solid rgba(255,255,255,0.12); border-radius: 5pt; padding: 5pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="8pt" height="8pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<rect x="2" y="2" width="12" height="12" rx="2" fill="none" stroke="#10B981" stroke-width="1" opacity="0.5"/>
<path d="M5 8 L7 10 L11 6" fill="none" stroke="#10B981" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 10pt; font-weight: 800; color: #FFFFFF;">127건</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #10B981; font-weight: 700;">&#9650; 8건</p>
<p style="white-space: nowrap; font-size: 4pt; color: #10B981; font-weight: 600; margin-top: 1pt;">누적 수주</p>
</div>
<div style="flex: 1; background: rgba(255,255,255,0.08); border: 1pt solid rgba(255,255,255,0.12); border-radius: 5pt; padding: 5pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="8pt" height="8pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<circle cx="8" cy="8" r="5.5" fill="none" stroke="#8B5CF6" stroke-width="1" opacity="0.3"/>
<circle cx="8" cy="8" r="5.5" fill="none" stroke="#8B5CF6" stroke-width="1.5" stroke-dasharray="32 35" stroke-dashoffset="-9" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 10pt; font-weight: 800; color: #FFFFFF;">96%</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #10B981; font-weight: 700;">목표 달성</p>
<p style="white-space: nowrap; font-size: 4pt; color: #8B5CF6; font-weight: 600; margin-top: 1pt;">납기 준수율</p>
</div>
<div style="flex: 1; background: rgba(255,255,255,0.08); border: 1pt solid rgba(255,255,255,0.12); border-radius: 5pt; padding: 5pt 3pt; text-align: center;">
<svg viewBox="0 0 16 16" width="8pt" height="8pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<path d="M8 2 L14 12 L2 12 Z" fill="none" stroke="#EF4444" stroke-width="1" stroke-linejoin="round"/>
<line x1="8" y1="6" x2="8" y2="9" stroke="#EF4444" stroke-width="1.2" stroke-linecap="round"/>
<circle cx="8" cy="10.5" r="0.6" fill="#EF4444"/>
</svg>
<p style="white-space: nowrap; font-size: 10pt; font-weight: 800; color: #EF4444;">5건</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #EF4444; font-weight: 700;">즉시 처리</p>
<p style="white-space: nowrap; font-size: 4pt; color: #EF4444; font-weight: 600; margin-top: 1pt;">승인 대기</p>
</div>
</div>
</div>
<!-- ===== WHITE ZONE ===== -->
<div style="flex: 1; padding: 14pt 20pt 10pt 20pt; display: flex; flex-direction: column;">
<!-- 대표님이 얻는 것 -->
<div style="margin-bottom: 10pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #0F172A; margin-bottom: 5pt;">대표님이 얻는 것</p>
<div style="display: flex; gap: 3pt;">
<div style="flex: 1; background: #FFFFFF; border: 1pt solid #E2E8F0; border-left: 2pt solid #F97316; border-radius: 4pt; padding: 5pt 5pt; box-shadow: 0 1pt 2pt rgba(0,0,0,0.04);">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #0F172A;">즉시 현황 파악</p>
<p style="font-size: 5pt; color: #475569; margin-top: 1pt; line-height: 1.4;">로그인 3초면</p>
<p style="font-size: 5pt; color: #475569; line-height: 1.4;">전사 현황 확인</p>
</div>
<div style="flex: 1; background: #FFFFFF; border: 1pt solid #E2E8F0; border-left: 2pt solid #10B981; border-radius: 4pt; padding: 5pt 5pt; box-shadow: 0 1pt 2pt rgba(0,0,0,0.04);">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #0F172A;">데이터로 판단</p>
<p style="font-size: 5pt; color: #475569; margin-top: 1pt; line-height: 1.4;">감이 아닌 숫자로</p>
<p style="font-size: 5pt; color: #475569; line-height: 1.4;">KPI/팀 성과 비교</p>
</div>
<div style="flex: 1; background: #FFFFFF; border: 1pt solid #E2E8F0; border-left: 2pt solid #8B5CF6; border-radius: 4pt; padding: 5pt 5pt; box-shadow: 0 1pt 2pt rgba(0,0,0,0.04);">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #0F172A;">모바일 승인</p>
<p style="font-size: 5pt; color: #475569; margin-top: 1pt; line-height: 1.4;">이동중에도 즉시</p>
<p style="font-size: 5pt; color: #475569; line-height: 1.4;">결재/승인 처리</p>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: #E2E8F0; margin-bottom: 10pt;"></div>
<!-- 핵심 기능 7개 -->
<div style="margin-bottom: 10pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #0F172A; margin-bottom: 5pt;">대시보드 핵심 기능</p>
<div style="display: flex; flex-direction: column; gap: 2pt;">
<div style="display: flex; align-items: center; gap: 5pt; background: #FFFFFF; border: 1pt solid #E2E8F0; border-left: 2pt solid #F97316; border-radius: 3pt; padding: 3pt 6pt; box-shadow: 0 1pt 2pt rgba(0,0,0,0.03);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<rect x="2" y="9" width="3" height="5" rx="0.5" fill="#F97316" opacity="0.45"/>
<rect x="6" y="5" width="3" height="9" rx="0.5" fill="#F97316" opacity="0.7"/>
<rect x="10" y="2" width="3" height="12" rx="0.5" fill="#F97316"/>
</svg>
<p style="font-size: 6pt; font-weight: 700; color: #0F172A; white-space: nowrap;">실시간 KPI 카드</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #94A3B8;">매출, 수주, 납기율, 승인</p>
</div>
<div style="display: flex; align-items: center; gap: 5pt; background: #FFFFFF; border: 1pt solid #E2E8F0; border-left: 2pt solid #10B981; border-radius: 3pt; padding: 3pt 6pt; box-shadow: 0 1pt 2pt rgba(0,0,0,0.03);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="8" cy="3.5" r="2" fill="none" stroke="#10B981" stroke-width="0.9"/>
<line x1="8" y1="5.5" x2="8" y2="7.5" stroke="#10B981" stroke-width="0.7"/>
<line x1="4" y1="7.5" x2="12" y2="7.5" stroke="#10B981" stroke-width="0.7"/>
<circle cx="4" cy="10" r="1.5" fill="none" stroke="#10B981" stroke-width="0.7" opacity="0.6"/>
<circle cx="8" cy="10" r="1.5" fill="none" stroke="#10B981" stroke-width="0.7" opacity="0.6"/>
<circle cx="12" cy="10" r="1.5" fill="none" stroke="#10B981" stroke-width="0.7" opacity="0.6"/>
</svg>
<p style="font-size: 6pt; font-weight: 700; color: #0F172A; white-space: nowrap;">조직 실적 트리</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #94A3B8;">계층별 팀/개인 실적</p>
</div>
<div style="display: flex; align-items: center; gap: 5pt; background: #FFFFFF; border: 1pt solid #E2E8F0; border-left: 2pt solid #8B5CF6; border-radius: 3pt; padding: 3pt 6pt; box-shadow: 0 1pt 2pt rgba(0,0,0,0.03);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="8" cy="8" r="6" fill="none" stroke="#8B5CF6" stroke-width="0.8" opacity="0.3"/>
<text x="8" y="10" text-anchor="middle" fill="#8B5CF6" font-size="7" font-weight="800">&#8361;</text>
</svg>
<p style="font-size: 6pt; font-weight: 700; color: #0F172A; white-space: nowrap;">역할별 수당 현황</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #94A3B8;">판매자/관리자/협업자</p>
</div>
<div style="display: flex; align-items: center; gap: 5pt; background: #FFFFFF; border: 1pt solid #E2E8F0; border-left: 2pt solid #EF4444; border-radius: 3pt; padding: 3pt 6pt; box-shadow: 0 1pt 2pt rgba(0,0,0,0.03);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M8 2.5 C5 2.5 3 5 3 7.5 L3 10.5 L2 11.5 L14 11.5 L13 10.5 L13 7.5 C13 5 11 2.5 8 2.5 Z" fill="none" stroke="#EF4444" stroke-width="0.8" opacity="0.5"/>
<circle cx="12" cy="4" r="2.5" fill="#EF4444"/>
<text x="12" y="5.5" text-anchor="middle" fill="#fff" font-size="3.5" font-weight="700">!</text>
</svg>
<p style="font-size: 6pt; font-weight: 700; color: #0F172A; white-space: nowrap;">승인 대기 알림</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #94A3B8;">미처리 빨간 뱃지</p>
</div>
<div style="display: flex; align-items: center; gap: 5pt; background: #FFFFFF; border: 1pt solid #E2E8F0; border-left: 2pt solid #FB923C; border-radius: 3pt; padding: 3pt 6pt; box-shadow: 0 1pt 2pt rgba(0,0,0,0.03);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M3 12 L6 9 L8 10.5 L13 4" fill="none" stroke="#FB923C" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M11 4 L13 4 L13 6" fill="none" stroke="#FB923C" stroke-width="0.8" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="font-size: 6pt; font-weight: 700; color: #0F172A; white-space: nowrap;">기간별 트렌드</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #94A3B8;">당월/분기/연간 추이</p>
</div>
<div style="display: flex; align-items: center; gap: 5pt; background: #FFFFFF; border: 1pt solid #E2E8F0; border-left: 2pt solid #F97316; border-radius: 3pt; padding: 3pt 6pt; box-shadow: 0 1pt 2pt rgba(0,0,0,0.03);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<rect x="2" y="3" width="12" height="10" rx="1.5" fill="none" stroke="#F97316" stroke-width="0.8" opacity="0.4"/>
<line x1="4" y1="6" x2="11" y2="6" stroke="#F97316" stroke-width="0.5" opacity="0.3"/>
<line x1="4" y1="8" x2="9" y2="8" stroke="#F97316" stroke-width="0.5" opacity="0.3"/>
<circle cx="12" cy="11.5" r="2.5" fill="#FFFFFF" stroke="#F97316" stroke-width="0.7"/>
<path d="M11.2 11.5 L12.8 11.5 M12 10.7 L12 12.3" stroke="#F97316" stroke-width="0.7" stroke-linecap="round"/>
</svg>
<p style="font-size: 6pt; font-weight: 700; color: #0F172A; white-space: nowrap;">수익 시뮬레이터</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #94A3B8;">가상 시나리오 계산</p>
</div>
<div style="display: flex; align-items: center; gap: 5pt; background: #FFFFFF; border: 1pt solid #E2E8F0; border-left: 2pt solid #F97316; border-radius: 3pt; padding: 3pt 6pt; box-shadow: 0 1pt 2pt rgba(0,0,0,0.03);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<rect x="4.5" y="2" width="7" height="12" rx="1.5" fill="none" stroke="#F97316" stroke-width="0.8" opacity="0.5"/>
<circle cx="8" cy="12.5" r="0.7" fill="#F97316" opacity="0.5"/>
<rect x="6" y="4.5" width="4" height="5.5" rx="0.5" fill="rgba(249,115,22,0.1)"/>
<rect x="6.5" y="5.2" width="3" height="1" rx="0.3" fill="#F97316" opacity="0.4"/>
<rect x="6.5" y="7" width="3" height="1" rx="0.3" fill="#10B981" opacity="0.4"/>
<rect x="6.5" y="8.8" width="3" height="1" rx="0.3" fill="#8B5CF6" opacity="0.4"/>
</svg>
<p style="font-size: 6pt; font-weight: 700; color: #0F172A; white-space: nowrap;">모바일 대응</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #94A3B8;">스마트폰 KPI/승인</p>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: #E2E8F0; margin-bottom: 10pt;"></div>
<!-- 투자 비용 -->
<div style="margin-bottom: 10pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #0F172A; margin-bottom: 5pt;">투자 비용</p>
<div style="display: flex; gap: 4pt;">
<div style="flex: 1; background: #FFFFFF; border: 1pt solid #E2E8F0; border-top: 2pt solid #F97316; border-radius: 5pt; padding: 6pt 7pt; box-shadow: 0 1pt 2pt rgba(0,0,0,0.04);">
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: #F97316; margin-bottom: 2pt;">기본 패키지</p>
<p style="white-space: nowrap; font-size: 11pt; font-weight: 800; color: #0F172A;">2,000만원</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #94A3B8;">+ 월 50만원 (유지보수)</p>
</div>
<div style="flex: 1; background: #FFFFFF; border: 1pt solid #E2E8F0; border-top: 2pt solid #FB923C; border-radius: 5pt; padding: 6pt 7pt; box-shadow: 0 1pt 2pt rgba(0,0,0,0.04);">
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: #FB923C; margin-bottom: 2pt;">추가 옵션 (선택)</p>
<div style="display: flex; justify-content: space-between; margin-top: 2pt;">
<p style="white-space: nowrap; font-size: 5.5pt; color: #475569;">생산공정 관리</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 700; color: #FB923C;">+500만원</p>
</div>
<div style="display: flex; justify-content: space-between;">
<p style="white-space: nowrap; font-size: 5.5pt; color: #475569;">품질관리(인정검사)</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 700; color: #FB923C;">+2,000만원</p>
</div>
<div style="display: flex; justify-content: space-between;">
<p style="white-space: nowrap; font-size: 5.5pt; color: #475569;">AI 견적 자동 생성</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 700; color: #FB923C;">월 10~20만원</p>
</div>
</div>
</div>
</div>
<!-- ===== DARK CTA ZONE ===== -->
<div style="margin-top: auto; background: #1E293B; border-radius: 7pt; padding: 10pt 12pt;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<div style="display: flex; align-items: center; gap: 6pt;">
<svg viewBox="0 0 22 22" width="14pt" height="14pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="11" cy="11" r="9" fill="none" stroke="#F97316" stroke-width="1.2" opacity="0.5"/>
<path d="M11 6 L11 11 L15 13" fill="none" stroke="#F97316" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div>
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.5); margin-top: 1pt;">대표님 전용 대시보드를 직접 체험</p>
</div>
</div>
<div style="text-align: right;">
<p style="white-space: nowrap; font-size: 5.5pt; color: rgba(255,255,255,0.3); margin-top: 1pt;">www.sam.it.kr</p>
</div>
</div>
</div>
<!-- 회사명 -->
<div style="margin-top: 5pt; text-align: center;">
<p style="white-space: nowrap; font-size: 5pt; color: #94A3B8;">SAM — Smart Automation Management</p>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,318 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
width: 405pt; height: 720pt;
font-family: 'Pretendard', sans-serif;
background: #FFFFFF;
padding: 20pt 22pt 0 22pt;
display: flex; flex-direction: column;
}
</style>
</head>
<body>
<!-- 헤더: BI 로고 (on white) + badge -->
<div style="display: flex; align-items: center; gap: 8pt; margin-bottom: 12pt;">
<img src="/home/aweso/sam/docs/assets/bi/sam_bi_black.png" style="height: 18pt;">
<div style="flex: 1;"></div>
<div style="background: rgba(249,115,22,0.1); border: 1pt solid rgba(249,115,22,0.2); border-radius: 3pt; padding: 2pt 7pt;">
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #F97316; letter-spacing: 0.08em;">FEATURES &amp; PRICING</p>
</div>
</div>
<!-- 대시보드 7대 기능 -->
<div style="margin-bottom: 10pt;">
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: #0F172A; margin-bottom: 6pt;">대시보드 핵심 기능</p>
<div style="display: flex; flex-direction: column; gap: 2pt;">
<!-- 01 실시간 KPI -->
<div style="display: flex; align-items: center; gap: 5pt; background: #FFFFFF; border: 1pt solid #E2E8F0; border-left: 3pt solid #F97316; border-radius: 4pt; padding: 4pt 7pt; box-shadow: 0 1pt 2pt rgba(0,0,0,0.04);">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<rect x="2" y="11" width="4" height="6" rx="0.5" fill="#F97316" opacity="0.45"/>
<rect x="8" y="7" width="4" height="10" rx="0.5" fill="#F97316" opacity="0.7"/>
<rect x="14" y="3" width="4" height="14" rx="0.5" fill="#F97316"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #0F172A; white-space: nowrap;">실시간 KPI 카드</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">매출, 수주, 납기율, 승인 대기</p>
</div>
<!-- 02 조직 실적 트리 -->
<div style="display: flex; align-items: center; gap: 5pt; background: #FFFFFF; border: 1pt solid #E2E8F0; border-left: 3pt solid #10B981; border-radius: 4pt; padding: 4pt 7pt; box-shadow: 0 1pt 2pt rgba(0,0,0,0.04);">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="10" cy="4.5" r="2.5" fill="none" stroke="#10B981" stroke-width="1.1"/>
<line x1="10" y1="7" x2="10" y2="9.5" stroke="#10B981" stroke-width="0.8"/>
<line x1="5" y1="9.5" x2="15" y2="9.5" stroke="#10B981" stroke-width="0.8"/>
<circle cx="5" cy="13" r="2" fill="none" stroke="#10B981" stroke-width="0.9" opacity="0.6"/>
<circle cx="10" cy="13" r="2" fill="none" stroke="#10B981" stroke-width="0.9" opacity="0.6"/>
<circle cx="15" cy="13" r="2" fill="none" stroke="#10B981" stroke-width="0.9" opacity="0.6"/>
<line x1="5" y1="9.5" x2="5" y2="11" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<line x1="10" y1="9.5" x2="10" y2="11" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<line x1="15" y1="9.5" x2="15" y2="11" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #0F172A; white-space: nowrap;">조직 실적 트리</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">계층별 팀/개인 실적 펼쳐보기</p>
</div>
<!-- 03 수당 현황 -->
<div style="display: flex; align-items: center; gap: 5pt; background: #FFFFFF; border: 1pt solid #E2E8F0; border-left: 3pt solid #8B5CF6; border-radius: 4pt; padding: 4pt 7pt; box-shadow: 0 1pt 2pt rgba(0,0,0,0.04);">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="10" cy="10" r="7.5" fill="none" stroke="#8B5CF6" stroke-width="1" opacity="0.3"/>
<text x="10" y="12.5" text-anchor="middle" fill="#8B5CF6" font-size="9" font-weight="800">&#8361;</text>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #0F172A; white-space: nowrap;">역할별 수당 현황</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">판매자/관리자/협업자 배분 확인</p>
</div>
<!-- 04 승인 대기 알림 -->
<div style="display: flex; align-items: center; gap: 5pt; background: #FFFFFF; border: 1pt solid #E2E8F0; border-left: 3pt solid #EF4444; border-radius: 4pt; padding: 4pt 7pt; box-shadow: 0 1pt 2pt rgba(0,0,0,0.04);">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M10 3 C6 3 3 6 3 9.5 L3 13 L1.5 14.5 L18.5 14.5 L17 13 L17 9.5 C17 6 14 3 10 3 Z" fill="none" stroke="#EF4444" stroke-width="1" opacity="0.5"/>
<circle cx="15" cy="5" r="3.5" fill="#EF4444"/>
<text x="15" y="7" text-anchor="middle" fill="#fff" font-size="4.5" font-weight="800">!</text>
<path d="M7.5 15.5 Q10 18 12.5 15.5" fill="none" stroke="#EF4444" stroke-width="0.8" opacity="0.4"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #0F172A; white-space: nowrap;">승인 대기 알림</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">가입/지급 미처리 빨간 뱃지</p>
</div>
<!-- 05 기간별 트렌드 -->
<div style="display: flex; align-items: center; gap: 5pt; background: #FFFFFF; border: 1pt solid #E2E8F0; border-left: 3pt solid #FB923C; border-radius: 4pt; padding: 4pt 7pt; box-shadow: 0 1pt 2pt rgba(0,0,0,0.04);">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M3 15 L7 11 L10 13 L16 5" fill="none" stroke="#FB923C" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M13 5 L16 5 L16 8" fill="none" stroke="#FB923C" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #0F172A; white-space: nowrap;">기간별 트렌드</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">당월/분기/연간 추이 차트</p>
</div>
<!-- 06 수익 시뮬레이터 -->
<div style="display: flex; align-items: center; gap: 5pt; background: #FFFFFF; border: 1pt solid #E2E8F0; border-left: 3pt solid #F97316; border-radius: 4pt; padding: 4pt 7pt; box-shadow: 0 1pt 2pt rgba(0,0,0,0.04);">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<rect x="2" y="3" width="16" height="14" rx="2" fill="none" stroke="#F97316" stroke-width="1" opacity="0.4"/>
<line x1="5" y1="7.5" x2="15" y2="7.5" stroke="#F97316" stroke-width="0.6" opacity="0.3"/>
<line x1="5" y1="10" x2="12" y2="10" stroke="#F97316" stroke-width="0.6" opacity="0.3"/>
<line x1="5" y1="12.5" x2="9" y2="12.5" stroke="#F97316" stroke-width="0.6" opacity="0.3"/>
<circle cx="15.5" cy="14.5" r="3.5" fill="#FFFFFF" stroke="#F97316" stroke-width="0.9"/>
<path d="M14.5 14.5 L16.5 14.5 M15.5 13.5 L15.5 15.5" stroke="#F97316" stroke-width="0.8" stroke-linecap="round"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #0F172A; white-space: nowrap;">수익 시뮬레이터</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">가상 시나리오 수당/마진 계산</p>
</div>
<!-- 07 모바일 대응 -->
<div style="display: flex; align-items: center; gap: 5pt; background: #FFFFFF; border: 1pt solid #E2E8F0; border-left: 3pt solid #F97316; border-radius: 4pt; padding: 4pt 7pt; box-shadow: 0 1pt 2pt rgba(0,0,0,0.04);">
<svg viewBox="0 0 20 20" width="13pt" height="13pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<rect x="5" y="2" width="10" height="16" rx="2" fill="none" stroke="#F97316" stroke-width="1" opacity="0.5"/>
<circle cx="10" cy="16" r="1" fill="#F97316" opacity="0.5"/>
<rect x="7" y="5" width="6" height="8" rx="0.5" fill="rgba(249,115,22,0.1)"/>
<rect x="8" y="6" width="4" height="1.5" rx="0.3" fill="#F97316" opacity="0.4"/>
<rect x="8" y="8.5" width="4" height="1.5" rx="0.3" fill="#10B981" opacity="0.4"/>
<rect x="8" y="11" width="4" height="1.5" rx="0.3" fill="#8B5CF6" opacity="0.4"/>
</svg>
<div style="flex: 1;">
<p style="font-size: 6.5pt; font-weight: 700; color: #0F172A; white-space: nowrap;">모바일 대응</p>
</div>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">스마트폰으로 KPI 확인/승인</p>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: #E2E8F0; margin-bottom: 10pt;"></div>
<!-- 역할별 맞춤 화면 -->
<div style="margin-bottom: 10pt;">
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: #0F172A; margin-bottom: 6pt;">역할별 맞춤 화면</p>
<div style="display: flex; gap: 4pt;">
<!-- CEO -->
<div style="flex: 1; background: #FFFFFF; border: 1pt solid #E2E8F0; border-top: 3pt solid #F97316; border-radius: 5pt; padding: 7pt 4pt; text-align: center; box-shadow: 0 1pt 3pt rgba(0,0,0,0.06);">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="12" cy="8" r="4" fill="none" stroke="#F97316" stroke-width="1.2"/>
<path d="M4 20 Q4 14 12 14 Q20 14 20 20" fill="none" stroke="#F97316" stroke-width="1.2"/>
<path d="M8 4 L12 1 L16 4" fill="none" stroke="#FB923C" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" opacity="0.7"/>
</svg>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 800; color: #F97316;">CEO</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: #475569; margin-top: 1pt;">전사 KPI 총괄</p>
</div>
<!-- 관리자 -->
<div style="flex: 1; background: #FFFFFF; border: 1pt solid #E2E8F0; border-top: 3pt solid #10B981; border-radius: 5pt; padding: 7pt 4pt; text-align: center; box-shadow: 0 1pt 3pt rgba(0,0,0,0.06);">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="8" cy="8" r="3" fill="none" stroke="#10B981" stroke-width="1"/>
<circle cx="16" cy="8" r="3" fill="none" stroke="#10B981" stroke-width="1" opacity="0.6"/>
<path d="M2 18 Q2 13 8 13 Q14 13 14 18" fill="none" stroke="#10B981" stroke-width="1"/>
<path d="M12 18 Q12 13 16 13 Q22 13 22 18" fill="none" stroke="#10B981" stroke-width="1" opacity="0.5"/>
</svg>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 800; color: #10B981;">관리자</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: #475569; margin-top: 1pt;">팀 실적 관리</p>
</div>
<!-- 운영자 -->
<div style="flex: 1; background: #FFFFFF; border: 1pt solid #E2E8F0; border-top: 3pt solid #FB923C; border-radius: 5pt; padding: 7pt 4pt; text-align: center; box-shadow: 0 1pt 3pt rgba(0,0,0,0.06);">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="12" cy="12" r="8" fill="none" stroke="#FB923C" stroke-width="1" opacity="0.4"/>
<circle cx="12" cy="12" r="3" fill="none" stroke="#FB923C" stroke-width="1.2"/>
<line x1="12" y1="4" x2="12" y2="6" stroke="#FB923C" stroke-width="1" stroke-linecap="round"/>
<line x1="12" y1="18" x2="12" y2="20" stroke="#FB923C" stroke-width="1" stroke-linecap="round"/>
<line x1="4" y1="12" x2="6" y2="12" stroke="#FB923C" stroke-width="1" stroke-linecap="round"/>
<line x1="18" y1="12" x2="20" y2="12" stroke="#FB923C" stroke-width="1" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 800; color: #FB923C;">운영자</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: #475569; margin-top: 1pt;">인력/승인 관리</p>
</div>
<!-- 영업자 -->
<div style="flex: 1; background: #FFFFFF; border: 1pt solid #E2E8F0; border-top: 3pt solid #8B5CF6; border-radius: 5pt; padding: 7pt 4pt; text-align: center; box-shadow: 0 1pt 3pt rgba(0,0,0,0.06);">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<rect x="4" y="3" width="16" height="18" rx="2" fill="none" stroke="#8B5CF6" stroke-width="1" opacity="0.5"/>
<line x1="7" y1="8" x2="17" y2="8" stroke="#8B5CF6" stroke-width="0.7" opacity="0.4"/>
<line x1="7" y1="11" x2="14" y2="11" stroke="#8B5CF6" stroke-width="0.7" opacity="0.4"/>
<line x1="7" y1="14" x2="12" y2="14" stroke="#8B5CF6" stroke-width="0.7" opacity="0.4"/>
<path d="M14 16 L16 18 L20 13" fill="none" stroke="#8B5CF6" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 800; color: #8B5CF6;">영업자</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: #475569; margin-top: 1pt;">내 실적 조회</p>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: #E2E8F0; margin-bottom: 10pt;"></div>
<!-- 투자 비용 -->
<div style="margin-bottom: 10pt;">
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: #0F172A; margin-bottom: 6pt;">투자 비용</p>
<div style="display: flex; gap: 5pt;">
<!-- 기본 패키지 -->
<div style="flex: 1;">
<div style="background: #FFFFFF; border: 1pt solid #E2E8F0; border-top: 3pt solid #F97316; border-radius: 6pt; padding: 7pt 8pt; margin-bottom: 3pt; box-shadow: 0 1pt 3pt rgba(0,0,0,0.06);">
<div style="display: flex; align-items: center; gap: 4pt; margin-bottom: 3pt;">
<svg viewBox="0 0 14 14" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg">
<rect x="1" y="1" width="12" height="12" rx="2" fill="none" stroke="#F97316" stroke-width="1" opacity="0.5"/>
<path d="M4 7 L6 9 L10 5" fill="none" stroke="#F97316" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: #F97316;">대시보드 포함 기본 패키지</p>
</div>
<p style="white-space: nowrap; font-size: 13pt; font-weight: 800; color: #0F172A;">2,000만원</p>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">+ 월 50만원 (유지보수)</p>
</div>
<div style="background: #F8FAFC; border-radius: 3pt; padding: 3pt 5pt;">
<p style="font-size: 5.5pt; color: #94A3B8; line-height: 1.4;">CEO 대시보드 + 견적/수주 + 생산</p>
<p style="font-size: 5.5pt; color: #94A3B8; line-height: 1.4;">인사/회계 무료 포함</p>
</div>
</div>
<!-- 추가 옵션 -->
<div style="flex: 1;">
<div style="background: #FFFFFF; border: 1pt solid #E2E8F0; border-top: 3pt solid #FB923C; border-radius: 6pt; padding: 7pt 8pt; box-shadow: 0 1pt 3pt rgba(0,0,0,0.06);">
<div style="display: flex; align-items: center; gap: 4pt; margin-bottom: 4pt;">
<svg viewBox="0 0 14 14" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="7" cy="7" r="5.5" fill="none" stroke="#FB923C" stroke-width="1" opacity="0.5"/>
<line x1="7" y1="4.5" x2="7" y2="9.5" stroke="#FB923C" stroke-width="1" stroke-linecap="round"/>
<line x1="4.5" y1="7" x2="9.5" y2="7" stroke="#FB923C" stroke-width="1" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: #FB923C;">추가 옵션 (선택)</p>
</div>
<div style="display: flex; flex-direction: column; gap: 3pt;">
<div style="display: flex; justify-content: space-between;">
<p style="white-space: nowrap; font-size: 6pt; color: #475569;">생산공정 관리</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #FB923C;">+500만원</p>
</div>
<div style="display: flex; justify-content: space-between;">
<p style="white-space: nowrap; font-size: 6pt; color: #475569;">품질관리(인정검사)</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #FB923C;">+2,000만원</p>
</div>
<div style="display: flex; justify-content: space-between;">
<p style="white-space: nowrap; font-size: 6pt; color: #475569;">AI 견적 자동 생성</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #FB923C;">월 10~20만원</p>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: #E2E8F0; margin-bottom: 10pt;"></div>
<!-- 도입 프로세스 -->
<div style="margin-bottom: 10pt;">
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: #0F172A; margin-bottom: 6pt;">도입 프로세스</p>
<div style="display: flex; gap: 2pt; align-items: center;">
<div style="flex: 1; border-radius: 5pt; padding: 5pt 2pt; text-align: center; background: #FFFFFF; border: 1pt solid #E2E8F0; border-top: 2pt solid #F97316; box-shadow: 0 1pt 2pt rgba(0,0,0,0.04);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<circle cx="8" cy="5" r="3" fill="none" stroke="#F97316" stroke-width="0.8"/>
<path d="M4 14 Q4 10 8 10 Q12 10 12 14" fill="none" stroke="#F97316" stroke-width="0.8"/>
<path d="M13 5 L15 5 M14 4 L14 6" stroke="#F97316" stroke-width="0.6" stroke-linecap="round" opacity="0.6"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: #94A3B8;">1~2주</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: #475569;">현장 인터뷰</p>
</div>
<svg viewBox="0 0 8 8" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M2 4 L6 4 M5 2.5 L6.5 4 L5 5.5" fill="none" stroke="#F97316" stroke-width="0.8" stroke-linecap="round" stroke-linejoin="round" opacity="0.5"/>
</svg>
<div style="flex: 1; border-radius: 5pt; padding: 5pt 2pt; text-align: center; background: #FFFFFF; border: 1pt solid #E2E8F0; border-top: 2pt solid #10B981; box-shadow: 0 1pt 2pt rgba(0,0,0,0.04);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<rect x="3" y="2" width="10" height="12" rx="1.5" fill="none" stroke="#10B981" stroke-width="0.8"/>
<line x1="6" y1="5" x2="10" y2="5" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
<line x1="6" y1="7" x2="10" y2="7" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
<line x1="6" y1="9" x2="10" y2="9" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
<line x1="6" y1="11" x2="9" y2="11" stroke="#10B981" stroke-width="0.5" opacity="0.4"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: #94A3B8;">2~4주</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: #475569;">맞춤 개발</p>
</div>
<svg viewBox="0 0 8 8" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M2 4 L6 4 M5 2.5 L6.5 4 L5 5.5" fill="none" stroke="#F97316" stroke-width="0.8" stroke-linecap="round" stroke-linejoin="round" opacity="0.5"/>
</svg>
<div style="flex: 1; border-radius: 5pt; padding: 5pt 2pt; text-align: center; background: #FFFFFF; border: 1pt solid #E2E8F0; border-top: 2pt solid #8B5CF6; box-shadow: 0 1pt 2pt rgba(0,0,0,0.04);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<rect x="2" y="3" width="5" height="10" rx="1" fill="none" stroke="#8B5CF6" stroke-width="0.8" opacity="0.5"/>
<rect x="9" y="3" width="5" height="10" rx="1" fill="none" stroke="#8B5CF6" stroke-width="0.8"/>
<path d="M7 7 L9 8 M7 8 L9 7" stroke="#8B5CF6" stroke-width="0.5" opacity="0.4"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: #94A3B8;">1~2주</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: #475569;">데이터 이관</p>
</div>
<svg viewBox="0 0 8 8" width="6pt" height="6pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M2 4 L6 4 M5 2.5 L6.5 4 L5 5.5" fill="none" stroke="#F97316" stroke-width="0.8" stroke-linecap="round" stroke-linejoin="round" opacity="0.5"/>
</svg>
<div style="flex: 1; border-radius: 5pt; padding: 5pt 2pt; text-align: center; background: #FFFFFF; border: 1pt solid #E2E8F0; border-top: 2pt solid #FB923C; box-shadow: 0 1pt 2pt rgba(0,0,0,0.04);">
<svg viewBox="0 0 16 16" width="10pt" height="10pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 1pt;">
<path d="M8 2 L14 8 L8 14 L2 8 Z" fill="none" stroke="#FB923C" stroke-width="0.8"/>
<path d="M5.5 8 L7 9.5 L10.5 6" fill="none" stroke="#FB923C" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 5.5pt; color: #94A3B8;">1~2주</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: #475569;">교육/안정화</p>
</div>
</div>
</div>
<!-- ===== DARK CTA ZONE (bottom) ===== -->
<div style="margin-top: auto; background: #1E293B; border-radius: 8pt; padding: 12pt 14pt; margin-bottom: 0;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<div style="display: flex; align-items: center; gap: 7pt;">
<svg viewBox="0 0 22 22" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<circle cx="11" cy="11" r="9" fill="none" stroke="#F97316" stroke-width="1.2" opacity="0.5"/>
<path d="M11 6 L11 11 L15 13" fill="none" stroke="#F97316" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div>
<p style="white-space: nowrap; font-size: 6.5pt; color: rgba(255,255,255,0.5); margin-top: 1pt;">대표님 전용 대시보드를 직접 체험</p>
</div>
</div>
<div style="text-align: right;">
<p style="white-space: nowrap; font-size: 6pt; color: rgba(255,255,255,0.3); margin-top: 1pt;">www.sam.it.kr</p>
</div>
</div>
</div>
<!-- 회사명 -->
<div style="padding: 5pt 0; text-align: center;">
<p style="white-space: nowrap; font-size: 5.5pt; color: #94A3B8;">SAM — Smart Automation Management</p>
</div>
</body>
</html>

View File

@@ -0,0 +1,281 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
width: 405pt; height: 720pt;
font-family: 'Pretendard', sans-serif;
background: #FFFFFF;
padding: 0;
display: flex; flex-direction: column;
}
</style>
</head>
<body>
<!-- ===== DARK ZONE (top ~280pt) ===== -->
<div style="background: #1E293B; padding: 24pt 22pt 20pt 22pt;">
<!-- 헤더: BI 로고 + 배지 -->
<div style="display: flex; align-items: center; gap: 8pt; margin-bottom: 16pt;">
<img src="/home/aweso/sam/docs/assets/bi/sam_bi_white.png" style="height: 22pt;">
<div style="flex: 1;"></div>
<div style="background: rgba(249,115,22,0.15); border: 1pt solid rgba(249,115,22,0.3); border-radius: 3pt; padding: 2pt 7pt;">
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #F97316; letter-spacing: 0.08em;">EXECUTIVE DASHBOARD</p>
</div>
</div>
<!-- 히어로 텍스트 -->
<div style="margin-bottom: 18pt;">
<h1 style="font-size: 19pt; font-weight: 800; color: #FFFFFF; line-height: 1.4; margin-bottom: 6pt;">대표님, 우리 회사</h1>
<h1 style="font-size: 19pt; font-weight: 800; color: #FFFFFF; line-height: 1.4; margin-bottom: 8pt;">지금 어떤 상태인가요?</h1>
<p style="font-size: 8pt; color: rgba(255,255,255,0.6); line-height: 1.55;">매출, 수주, 조직 실적, 승인 대기</p>
<p style="font-size: 8pt; color: rgba(255,255,255,0.6); line-height: 1.55;">더 이상 보고를 기다리지 마세요.</p>
</div>
<!-- KPI 카드 4개 (on dark) -->
<div style="display: flex; gap: 4pt;">
<!-- 월 매출 -->
<div style="flex: 1; background: rgba(255,255,255,0.08); border: 1pt solid rgba(255,255,255,0.12); border-radius: 5pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 16 16" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<rect x="2" y="9" width="3" height="5" rx="0.5" fill="#F97316" opacity="0.4"/>
<rect x="6" y="5" width="3" height="9" rx="0.5" fill="#F97316" opacity="0.7"/>
<rect x="10" y="2" width="3" height="12" rx="0.5" fill="#F97316"/>
</svg>
<p style="white-space: nowrap; font-size: 12pt; font-weight: 800; color: #FFFFFF;">5.2억</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">&#9650; 15.3%</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #F97316; font-weight: 600; margin-top: 1pt;">월 매출</p>
</div>
<!-- 누적 수주 -->
<div style="flex: 1; background: rgba(255,255,255,0.08); border: 1pt solid rgba(255,255,255,0.12); border-radius: 5pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 16 16" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<rect x="2" y="2" width="12" height="12" rx="2" fill="none" stroke="#10B981" stroke-width="1" opacity="0.5"/>
<path d="M5 8 L7 10 L11 6" fill="none" stroke="#10B981" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 12pt; font-weight: 800; color: #FFFFFF;">127건</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">&#9650; 8건</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #10B981; font-weight: 600; margin-top: 1pt;">누적 수주</p>
</div>
<!-- 납기 준수율 -->
<div style="flex: 1; background: rgba(255,255,255,0.08); border: 1pt solid rgba(255,255,255,0.12); border-radius: 5pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 16 16" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="8" cy="8" r="5.5" fill="none" stroke="#8B5CF6" stroke-width="1" opacity="0.3"/>
<circle cx="8" cy="8" r="5.5" fill="none" stroke="#8B5CF6" stroke-width="1.5" stroke-dasharray="32 35" stroke-dashoffset="-9" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 12pt; font-weight: 800; color: #FFFFFF;">96%</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 700;">목표 달성</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #8B5CF6; font-weight: 600; margin-top: 1pt;">납기 준수율</p>
</div>
<!-- 승인 대기 -->
<div style="flex: 1; background: rgba(255,255,255,0.08); border: 1pt solid rgba(255,255,255,0.12); border-radius: 5pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 16 16" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<path d="M8 2 L14 12 L2 12 Z" fill="none" stroke="#EF4444" stroke-width="1" stroke-linejoin="round"/>
<line x1="8" y1="6" x2="8" y2="9" stroke="#EF4444" stroke-width="1.2" stroke-linecap="round"/>
<circle cx="8" cy="10.5" r="0.6" fill="#EF4444"/>
</svg>
<p style="white-space: nowrap; font-size: 12pt; font-weight: 800; color: #EF4444;">5건</p>
<p style="white-space: nowrap; font-size: 5pt; color: #EF4444; font-weight: 700;">즉시 처리</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #EF4444; font-weight: 600; margin-top: 1pt;">승인 대기</p>
</div>
</div>
</div>
<!-- ===== WHITE ZONE (bottom ~440pt) ===== -->
<div style="flex: 1; padding: 18pt 22pt 14pt 22pt; display: flex; flex-direction: column;">
<!-- 대표님이 얻는 것 - 3 value cards -->
<div style="margin-bottom: 14pt;">
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: #0F172A; margin-bottom: 7pt;">대표님이 얻는 것</p>
<div style="display: flex; gap: 4pt;">
<!-- 즉시 현황 파악 -->
<div style="flex: 1; background: #FFFFFF; border: 1pt solid #E2E8F0; border-left: 3pt solid #F97316; border-radius: 5pt; padding: 8pt 6pt; box-shadow: 0 1pt 3pt rgba(0,0,0,0.06);">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 4pt;">
<circle cx="12" cy="12" r="9" fill="none" stroke="#F97316" stroke-width="1.2" opacity="0.4"/>
<path d="M12 6 L12 12 L16 15" fill="none" stroke="#F97316" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="12" cy="12" r="1.2" fill="#F97316"/>
<path d="M19 4 L17 8 L20 8 L18 12" fill="none" stroke="#FB923C" stroke-width="0.9" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #0F172A;">즉시 현황 파악</p>
<p style="font-size: 5.5pt; color: #475569; margin-top: 2pt; line-height: 1.4;">로그인 3초면</p>
<p style="font-size: 5.5pt; color: #475569; line-height: 1.4;">전사 현황 확인</p>
</div>
<!-- 데이터로 판단 -->
<div style="flex: 1; background: #FFFFFF; border: 1pt solid #E2E8F0; border-left: 3pt solid #10B981; border-radius: 5pt; padding: 8pt 6pt; box-shadow: 0 1pt 3pt rgba(0,0,0,0.06);">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 4pt;">
<circle cx="12" cy="10" r="7" fill="none" stroke="#10B981" stroke-width="1.2" opacity="0.4"/>
<path d="M9 7 Q12 5 15 7" fill="none" stroke="#10B981" stroke-width="1" stroke-linecap="round"/>
<path d="M8 10 Q12 8 16 10" fill="none" stroke="#10B981" stroke-width="1" stroke-linecap="round"/>
<path d="M9 13 Q12 11 15 13" fill="none" stroke="#10B981" stroke-width="1" stroke-linecap="round"/>
<circle cx="7" cy="20" r="1" fill="#10B981" opacity="0.6"/>
<circle cx="12" cy="20" r="1" fill="#10B981" opacity="0.8"/>
<circle cx="17" cy="20" r="1" fill="#10B981"/>
</svg>
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #0F172A;">데이터로 판단</p>
<p style="font-size: 5.5pt; color: #475569; margin-top: 2pt; line-height: 1.4;">감이 아닌 숫자로</p>
<p style="font-size: 5.5pt; color: #475569; line-height: 1.4;">KPI/팀 성과 비교</p>
</div>
<!-- 모바일 승인 -->
<div style="flex: 1; background: #FFFFFF; border: 1pt solid #E2E8F0; border-left: 3pt solid #8B5CF6; border-radius: 5pt; padding: 8pt 6pt; box-shadow: 0 1pt 3pt rgba(0,0,0,0.06);">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 4pt;">
<circle cx="12" cy="12" r="8" fill="none" stroke="#8B5CF6" stroke-width="1.2" opacity="0.4"/>
<path d="M8 12 L11 15 L17 9" fill="none" stroke="#8B5CF6" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>
<rect x="18" y="16" width="4.5" height="7" rx="1" fill="none" stroke="#8B5CF6" stroke-width="0.7" opacity="0.5"/>
<circle cx="20.25" cy="21.5" r="0.4" fill="#8B5CF6" opacity="0.5"/>
</svg>
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #0F172A;">모바일 승인</p>
<p style="font-size: 5.5pt; color: #475569; margin-top: 2pt; line-height: 1.4;">이동중에도 즉시</p>
<p style="font-size: 5.5pt; color: #475569; line-height: 1.4;">결재/승인 처리</p>
</div>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: #E2E8F0; margin-bottom: 14pt;"></div>
<!-- Before / After -->
<div style="display: flex; gap: 4pt; margin-bottom: 14pt;">
<!-- Before -->
<div style="flex: 5; background: #FFFFFF; border: 1pt solid rgba(239,68,68,0.2); border-left: 3pt solid #EF4444; border-radius: 5pt; padding: 7pt 8pt; box-shadow: 0 1pt 3pt rgba(0,0,0,0.06);">
<div style="display: flex; align-items: center; gap: 3pt; margin-bottom: 5pt;">
<svg viewBox="0 0 14 14" width="8pt" height="8pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="7" cy="7" r="5.5" fill="none" stroke="#EF4444" stroke-width="1"/>
<line x1="4.5" y1="4.5" x2="9.5" y2="9.5" stroke="#EF4444" stroke-width="1.2" stroke-linecap="round"/>
<line x1="9.5" y1="4.5" x2="4.5" y2="9.5" stroke="#EF4444" stroke-width="1.2" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #EF4444;">BEFORE</p>
</div>
<p style="white-space: nowrap; font-size: 5.5pt; color: #475569;">매출? → 보고 대기 1~2일</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #475569;">수주? → Excel 취합 반나절</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #475569;">승인? → 서류 찾기 30분</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #475569;">실적? → 각 팀장 개별 보고</p>
</div>
<!-- 화살표 -->
<div style="display: flex; align-items: center; flex-shrink: 0;">
<svg viewBox="0 0 20 20" width="14pt" height="14pt" xmlns="http://www.w3.org/2000/svg">
<path d="M4 10 L14 10" stroke="#F97316" stroke-width="1.5" stroke-linecap="round"/>
<path d="M11 6 L15 10 L11 14" fill="none" stroke="#F97316" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>
<!-- After -->
<div style="flex: 5; background: #FFFFFF; border: 1pt solid rgba(16,185,129,0.2); border-left: 3pt solid #10B981; border-radius: 5pt; padding: 7pt 8pt; box-shadow: 0 1pt 3pt rgba(0,0,0,0.06);">
<div style="display: flex; align-items: center; gap: 3pt; margin-bottom: 5pt;">
<svg viewBox="0 0 14 14" width="8pt" height="8pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="7" cy="7" r="5.5" fill="none" stroke="#10B981" stroke-width="1"/>
<path d="M4.5 7 L6.5 9 L10 5" fill="none" stroke="#10B981" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #10B981;">AFTER (SAM)</p>
</div>
<p style="white-space: nowrap; font-size: 5.5pt; color: #475569;">로그인 3초 → <span style="color:#10B981;font-weight:600;">전사 현황</span></p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #475569;">클릭 한 번 → <span style="color:#10B981;font-weight:600;">실시간 수주</span></p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #475569;">뱃지 터치 → <span style="color:#10B981;font-weight:600;">즉시 승인</span></p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #475569;">트리 펼침 → <span style="color:#10B981;font-weight:600;">전 조직 한눈에</span></p>
</div>
</div>
<!-- 구분선 -->
<div style="height: 1pt; background: #E2E8F0; margin-bottom: 14pt;"></div>
<!-- 대시보드 핵심 기능 6개 (2x3 grid) -->
<div style="margin-bottom: 14pt;">
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: #0F172A; margin-bottom: 6pt;">대시보드 핵심 기능</p>
<div style="display: flex; flex-direction: column; gap: 2pt;">
<div style="display: flex; gap: 2pt;">
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: #FFFFFF; border: 1pt solid #E2E8F0; border-radius: 4pt; padding: 4pt 6pt; box-shadow: 0 1pt 2pt rgba(0,0,0,0.04);">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<rect x="2" y="10" width="3" height="6" rx="0.5" fill="#F97316" opacity="0.5"/>
<rect x="7" y="6" width="3" height="10" rx="0.5" fill="#F97316" opacity="0.75"/>
<rect x="12" y="2" width="3" height="14" rx="0.5" fill="#F97316"/>
</svg>
<p style="font-size: 6.5pt; color: #475569; white-space: nowrap;">실시간 <span style="color: #F97316; font-weight: 700;">매출/수주 KPI</span></p>
</div>
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: #FFFFFF; border: 1pt solid #E2E8F0; border-radius: 4pt; padding: 4pt 6pt; box-shadow: 0 1pt 2pt rgba(0,0,0,0.04);">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="9" cy="4" r="2.5" fill="none" stroke="#10B981" stroke-width="1"/>
<line x1="9" y1="6.5" x2="9" y2="9" stroke="#10B981" stroke-width="0.8"/>
<line x1="4" y1="9" x2="14" y2="9" stroke="#10B981" stroke-width="0.8"/>
<circle cx="4" cy="12" r="2" fill="none" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<circle cx="9" cy="12" r="2" fill="none" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<circle cx="14" cy="12" r="2" fill="none" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<line x1="4" y1="9" x2="4" y2="10" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<line x1="9" y1="9" x2="9" y2="10" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
<line x1="14" y1="9" x2="14" y2="10" stroke="#10B981" stroke-width="0.8" opacity="0.6"/>
</svg>
<p style="font-size: 6.5pt; color: #475569; white-space: nowrap;">조직 계층별 <span style="color: #10B981; font-weight: 700;">실적 트리</span></p>
</div>
</div>
<div style="display: flex; gap: 2pt;">
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: #FFFFFF; border: 1pt solid #E2E8F0; border-radius: 4pt; padding: 4pt 6pt; box-shadow: 0 1pt 2pt rgba(0,0,0,0.04);">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="9" cy="9" r="7" fill="none" stroke="#8B5CF6" stroke-width="1" opacity="0.3"/>
<text x="9" y="11.5" text-anchor="middle" fill="#8B5CF6" font-size="8" font-weight="800">&#8361;</text>
</svg>
<p style="font-size: 6.5pt; color: #475569; white-space: nowrap;">역할별 <span style="color: #8B5CF6; font-weight: 700;">수당 현황</span></p>
</div>
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: #FFFFFF; border: 1pt solid #E2E8F0; border-radius: 4pt; padding: 4pt 6pt; box-shadow: 0 1pt 2pt rgba(0,0,0,0.04);">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<path d="M9 3 C5 3 3 6 3 9 L3 12 L2 13 L16 13 L15 12 L15 9 C15 6 13 3 9 3 Z" fill="none" stroke="#EF4444" stroke-width="1" opacity="0.6"/>
<circle cx="13" cy="5" r="3" fill="#EF4444"/>
<text x="13" y="6.5" text-anchor="middle" fill="#fff" font-size="4" font-weight="700">5</text>
<path d="M7 14 Q9 16 11 14" fill="none" stroke="#EF4444" stroke-width="0.8" opacity="0.5"/>
</svg>
<p style="font-size: 6.5pt; color: #475569; white-space: nowrap;">미승인 <span style="color: #EF4444; font-weight: 700;">실시간 알림</span></p>
</div>
</div>
<div style="display: flex; gap: 2pt;">
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: #FFFFFF; border: 1pt solid #E2E8F0; border-radius: 4pt; padding: 4pt 6pt; box-shadow: 0 1pt 2pt rgba(0,0,0,0.04);">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<path d="M3 14 L7 10 L10 12 L15 5" fill="none" stroke="#FB923C" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M12 5 L15 5 L15 8" fill="none" stroke="#FB923C" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="font-size: 6.5pt; color: #475569; white-space: nowrap;">기간별 <span style="color: #FB923C; font-weight: 700;">트렌드 분석</span></p>
</div>
<div style="flex: 1; display: flex; align-items: center; gap: 4pt; background: #FFFFFF; border: 1pt solid #E2E8F0; border-radius: 4pt; padding: 4pt 6pt; box-shadow: 0 1pt 2pt rgba(0,0,0,0.04);">
<svg viewBox="0 0 18 18" width="11pt" height="11pt" xmlns="http://www.w3.org/2000/svg">
<rect x="2" y="3" width="14" height="12" rx="1.5" fill="none" stroke="#F97316" stroke-width="1" opacity="0.5"/>
<line x1="5" y1="7" x2="13" y2="7" stroke="#F97316" stroke-width="0.6" opacity="0.3"/>
<line x1="5" y1="9" x2="11" y2="9" stroke="#F97316" stroke-width="0.6" opacity="0.3"/>
<line x1="5" y1="11" x2="9" y2="11" stroke="#F97316" stroke-width="0.6" opacity="0.3"/>
<circle cx="14" cy="13" r="3.5" fill="#FFFFFF" stroke="#F97316" stroke-width="0.8"/>
<path d="M13 13 L15 13 M14 12 L14 14" stroke="#F97316" stroke-width="0.8" stroke-linecap="round"/>
</svg>
<p style="font-size: 6.5pt; color: #475569; white-space: nowrap;">수익 <span style="color: #F97316; font-weight: 700;">시뮬레이터</span></p>
</div>
</div>
</div>
</div>
<!-- 기술 태그 -->
<div style="display: flex; gap: 4pt; margin-bottom: 8pt;">
<div style="display: flex; align-items: center; gap: 2pt; background: #F1F5F9; border-radius: 3pt; padding: 3pt 6pt;">
<svg viewBox="0 0 8 8" width="5pt" height="5pt" xmlns="http://www.w3.org/2000/svg"><path d="M2 6 Q4 2 6 6" fill="none" stroke="#94A3B8" stroke-width="0.7"/><path d="M3 6 Q4 4 5 6" fill="none" stroke="#94A3B8" stroke-width="0.7"/><circle cx="4" cy="6.5" r="0.6" fill="#94A3B8"/></svg>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">클라우드 기반</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: #F1F5F9; border-radius: 3pt; padding: 3pt 6pt;">
<svg viewBox="0 0 8 8" width="5pt" height="5pt" xmlns="http://www.w3.org/2000/svg"><rect x="2" y="0.5" width="4" height="7" rx="0.8" fill="none" stroke="#94A3B8" stroke-width="0.7"/><circle cx="4" cy="6.5" r="0.4" fill="#94A3B8"/></svg>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">PC + 모바일</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: #F1F5F9; border-radius: 3pt; padding: 3pt 6pt;">
<svg viewBox="0 0 8 8" width="5pt" height="5pt" xmlns="http://www.w3.org/2000/svg"><rect x="1" y="1.5" width="6" height="5" rx="0.8" fill="none" stroke="#94A3B8" stroke-width="0.7"/><circle cx="4" cy="4" r="1.2" fill="none" stroke="#94A3B8" stroke-width="0.5"/></svg>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">역할별 권한</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt; background: #F1F5F9; border-radius: 3pt; padding: 3pt 6pt;">
<svg viewBox="0 0 8 8" width="5pt" height="5pt" xmlns="http://www.w3.org/2000/svg"><path d="M4 1 Q6.5 1 6.5 3.5 L6.5 4.5 Q6.5 7 4 7 Q1.5 7 1.5 4.5 L1.5 3.5 Q1.5 1 4 1 Z" fill="none" stroke="#94A3B8" stroke-width="0.7"/><line x1="4" y1="3.5" x2="4" y2="5" stroke="#94A3B8" stroke-width="0.5" stroke-linecap="round"/><circle cx="4" cy="3" r="0.4" fill="#94A3B8"/></svg>
<p style="white-space: nowrap; font-size: 6pt; color: #94A3B8;">데이터 암호화</p>
</div>
</div>
<!-- 푸터 -->
<div style="margin-top: auto; border-top: 1pt solid #E2E8F0; padding-top: 8pt;">
<div style="display: flex; justify-content: space-between; align-items: flex-end;">
<div>
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: #475569;">SAM</p>
<p style="white-space: nowrap; font-size: 6.5pt; color: #94A3B8; margin-top: 2pt;">www.sam.it.kr</p>
</div>
<div style="text-align: right;">
<p style="white-space: nowrap; font-size: 6.5pt; color: #94A3B8;">뒷면에서 상세 기능을 확인하세요 &#9654;</p>
</div>
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,27 @@
const path = require('path');
module.paths.unshift(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/node_modules'));
const PptxGenJS = require('pptxgenjs');
const html2pptx = require(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/html2pptx.js'));
async function main() {
const pres = new PptxGenJS();
pres.defineLayout({ name: 'PORTRAIT_9x16', width: 5.625, height: 10 });
pres.layout = 'PORTRAIT_9x16';
const htmlFile = path.join(__dirname, 'slides', 'brochure-dashboard-1page.html');
console.log('Converting CEO Dashboard v9 (Minimal White + Indigo) 1-page brochure...');
try {
await html2pptx(htmlFile, pres);
} catch (err) {
console.error(`Error: ${err.message}`);
}
const outputPath = path.join(__dirname, 'sam-brochure-v9-dashboard-1page.pptx');
await pres.writeFile({ fileName: outputPath });
console.log(`\nPPTX created: ${outputPath}`);
}
main().catch(console.error);

View File

@@ -0,0 +1,31 @@
const path = require('path');
module.paths.unshift(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/node_modules'));
const PptxGenJS = require('pptxgenjs');
const html2pptx = require(path.join(require('os').homedir(), '.claude/skills/pptx-skill/scripts/html2pptx.js'));
async function main() {
const pres = new PptxGenJS();
pres.defineLayout({ name: 'PORTRAIT_9x16', width: 5.625, height: 10 });
pres.layout = 'PORTRAIT_9x16';
const slidesDir = path.join(__dirname, 'slides');
const slides = ['brochure-dashboard-front.html', 'brochure-dashboard-back.html'];
for (const file of slides) {
const htmlFile = path.join(slidesDir, file);
console.log(`Converting ${file} ...`);
try {
await html2pptx(htmlFile, pres);
} catch (err) {
console.error(`Error on ${file}: ${err.message}`);
}
}
const outputPath = path.join(__dirname, 'sam-brochure-v9-dashboard-2page.pptx');
await pres.writeFile({ fileName: outputPath });
console.log(`\nPPTX created: ${outputPath}`);
}
main().catch(console.error);

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,264 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
width: 405pt; height: 720pt;
font-family: 'Pretendard', sans-serif;
background: #FFFFFF;
padding: 22pt 24pt 12pt 28pt;
display: flex; flex-direction: column;
position: relative;
}
</style>
</head>
<body>
<!-- Left accent line -->
<div style="position: absolute; left: 0; top: 0; width: 3pt; height: 100%; background: #6366F1;"></div>
<!-- Header -->
<div style="display: flex; align-items: center; gap: 8pt; margin-bottom: 16pt;">
<img src="/home/aweso/sam/docs/assets/bi/sam_bi_black.png" style="height: 18pt;">
<div style="flex: 1;"></div>
<p style="white-space: nowrap; font-size: 5.5pt; color: #CBD5E1; letter-spacing: 0.15em;">v9</p>
</div>
<!-- Hero -->
<div style="margin-bottom: 14pt;">
<p style="white-space: nowrap; font-size: 6pt; font-weight: 600; color: #6366F1; letter-spacing: 0.15em; margin-bottom: 5pt;">EXECUTIVE DASHBOARD</p>
<p style="white-space: nowrap; font-size: 15pt; font-weight: 300; color: #0F172A; margin-bottom: 2pt;">대표님, 우리 회사</p>
<p style="white-space: nowrap; font-size: 15pt; font-weight: 800; color: #0F172A; margin-bottom: 6pt;">지금 어떤 상태인가요?</p>
<p style="white-space: nowrap; font-size: 6.5pt; color: #64748B;">보고 대기 없이, 로그인 한 번이면 전사 현황이 한눈에.</p>
</div>
<!-- Thin divider -->
<div style="height: 1pt; background: #F1F5F9; margin-bottom: 12pt;"></div>
<!-- Dashboard Mock UI - compact -->
<div style="background: #F8FAFC; border: 1pt solid #F1F5F9; border-radius: 5pt; padding: 7pt; margin-bottom: 12pt;">
<!-- Title bar -->
<div style="display: flex; align-items: center; gap: 2pt; margin-bottom: 5pt;">
<div style="width: 3pt; height: 3pt; border-radius: 50%; background: #EF4444;"></div>
<div style="width: 3pt; height: 3pt; border-radius: 50%; background: #F59E0B;"></div>
<div style="width: 3pt; height: 3pt; border-radius: 50%; background: #10B981;"></div>
<p style="white-space: nowrap; font-size: 4.5pt; color: #CBD5E1; margin-left: 4pt;">SAM CEO Dashboard</p>
</div>
<!-- KPI cards -->
<div style="display: flex; gap: 3pt; margin-bottom: 5pt;">
<div style="flex: 1; background: #FFFFFF; border: 1pt solid #F1F5F9; border-radius: 3pt; padding: 4pt 3pt; text-align: center;">
<p style="white-space: nowrap; font-size: 9pt; font-weight: 800; color: #6366F1;">5.2억</p>
<p style="white-space: nowrap; font-size: 4pt; color: #10B981; font-weight: 600;">+15.3%</p>
<p style="white-space: nowrap; font-size: 4pt; color: #64748B; margin-top: 1pt;">월 매출</p>
</div>
<div style="flex: 1; background: #FFFFFF; border: 1pt solid #F1F5F9; border-radius: 3pt; padding: 4pt 3pt; text-align: center;">
<p style="white-space: nowrap; font-size: 9pt; font-weight: 800; color: #10B981;">127건</p>
<p style="white-space: nowrap; font-size: 4pt; color: #10B981; font-weight: 600;">+8건</p>
<p style="white-space: nowrap; font-size: 4pt; color: #64748B; margin-top: 1pt;">누적 수주</p>
</div>
<div style="flex: 1; background: #FFFFFF; border: 1pt solid #F1F5F9; border-radius: 3pt; padding: 4pt 3pt; text-align: center;">
<p style="white-space: nowrap; font-size: 9pt; font-weight: 800; color: #818CF8;">96%</p>
<p style="white-space: nowrap; font-size: 4pt; color: #10B981; font-weight: 600;">목표 달성</p>
<p style="white-space: nowrap; font-size: 4pt; color: #64748B; margin-top: 1pt;">납기 준수율</p>
</div>
<div style="flex: 1; background: #FFFFFF; border: 1pt solid #F1F5F9; border-radius: 3pt; padding: 4pt 3pt; text-align: center;">
<p style="white-space: nowrap; font-size: 9pt; font-weight: 800; color: #EF4444;">5건</p>
<p style="white-space: nowrap; font-size: 4pt; color: #EF4444; font-weight: 600;">즉시 처리</p>
<p style="white-space: nowrap; font-size: 4pt; color: #64748B; margin-top: 1pt;">승인 대기</p>
</div>
</div>
<!-- Chart area -->
<div style="display: flex; gap: 3pt;">
<div style="flex: 3; background: #FFFFFF; border: 1pt solid #F1F5F9; border-radius: 3pt; padding: 4pt;">
<p style="white-space: nowrap; font-size: 4pt; color: #CBD5E1; margin-bottom: 2pt;">월별 매출 추이</p>
<svg viewBox="0 0 150 28" width="100%" height="20pt" xmlns="http://www.w3.org/2000/svg">
<line x1="0" y1="14" x2="150" y2="14" stroke="#F1F5F9" stroke-width="0.5"/>
<path d="M5 24 L20 18 L35 20 L50 14 L65 10 L80 7 L95 9 L110 4 L125 6 L140 2" fill="none" stroke="#6366F1" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="140" cy="2" r="1.5" fill="#6366F1"/>
</svg>
</div>
<div style="flex: 2; background: #FFFFFF; border: 1pt solid #F1F5F9; border-radius: 3pt; padding: 4pt; display: flex; align-items: center; gap: 3pt;">
<svg viewBox="0 0 36 36" width="24pt" height="24pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="18" cy="18" r="12" fill="none" stroke="#F1F5F9" stroke-width="3.5"/>
<circle cx="18" cy="18" r="12" fill="none" stroke="#6366F1" stroke-width="3.5" stroke-dasharray="29 47" stroke-dashoffset="19" stroke-linecap="round"/>
<circle cx="18" cy="18" r="12" fill="none" stroke="#10B981" stroke-width="3.5" stroke-dasharray="19 57" stroke-dashoffset="-10" stroke-linecap="round"/>
<circle cx="18" cy="18" r="12" fill="none" stroke="#818CF8" stroke-width="3.5" stroke-dasharray="16 60" stroke-dashoffset="-29" stroke-linecap="round"/>
<circle cx="18" cy="18" r="12" fill="none" stroke="#F59E0B" stroke-width="3.5" stroke-dasharray="10 66" stroke-dashoffset="-45" stroke-linecap="round"/>
</svg>
<div style="display: flex; flex-direction: column; gap: 1.5pt;">
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #6366F1; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4pt; color: #64748B;">영업1팀</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #10B981; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4pt; color: #64748B;">영업2팀</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #818CF8; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4pt; color: #64748B;">생산팀</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #F59E0B; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4pt; color: #64748B;">품질팀</p>
</div>
</div>
</div>
</div>
</div>
<!-- 3 value props - compact -->
<div style="display: flex; gap: 4pt; margin-bottom: 12pt;">
<div style="flex: 1; background: #F8FAFC; border: 1pt solid #F1F5F9; border-radius: 4pt; padding: 6pt 5pt; text-align: center;">
<svg viewBox="0 0 20 20" width="12pt" height="12pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="10" cy="10" r="7" fill="none" stroke="#6366F1" stroke-width="0.7" opacity="0.3"/>
<path d="M10 5 L10 10 L13 12.5" fill="none" stroke="#6366F1" stroke-width="0.8" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #0F172A;">즉시 현황 파악</p>
<p style="font-size: 5pt; color: #64748B; margin-top: 1pt;">3초면 전사 현황</p>
</div>
<div style="flex: 1; background: #F8FAFC; border: 1pt solid #F1F5F9; border-radius: 4pt; padding: 6pt 5pt; text-align: center;">
<svg viewBox="0 0 20 20" width="12pt" height="12pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<rect x="3" y="11" width="3" height="6" rx="0.5" fill="none" stroke="#6366F1" stroke-width="0.7" opacity="0.4"/>
<rect x="8" y="7" width="3" height="10" rx="0.5" fill="none" stroke="#6366F1" stroke-width="0.7" opacity="0.6"/>
<rect x="13" y="3" width="3" height="14" rx="0.5" fill="none" stroke="#6366F1" stroke-width="0.7"/>
</svg>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #0F172A;">데이터로 판단</p>
<p style="font-size: 5pt; color: #64748B; margin-top: 1pt;">KPI/팀 성과 비교</p>
</div>
<div style="flex: 1; background: #F8FAFC; border: 1pt solid #F1F5F9; border-radius: 4pt; padding: 6pt 5pt; text-align: center;">
<svg viewBox="0 0 20 20" width="12pt" height="12pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="10" cy="10" r="6.5" fill="none" stroke="#6366F1" stroke-width="0.7" opacity="0.3"/>
<path d="M7 10 L9 12 L13 8" fill="none" stroke="#6366F1" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #0F172A;">모바일 승인</p>
<p style="font-size: 5pt; color: #64748B; margin-top: 1pt;">즉시 결재 처리</p>
</div>
</div>
<!-- Thin divider -->
<div style="height: 1pt; background: #F1F5F9; margin-bottom: 10pt;"></div>
<!-- Features list - compact -->
<div style="margin-bottom: 10pt;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #6366F1; margin-bottom: 5pt;">핵심 기능</p>
<div style="display: flex; flex-wrap: wrap; gap: 2pt;">
<div style="display: flex; align-items: center; gap: 3pt; width: 48%; padding: 3pt 0;">
<div style="width: 3pt; height: 3pt; border-radius: 50%; background: #6366F1; flex-shrink: 0;"></div>
<p style="white-space: nowrap; font-size: 5.5pt; color: #0F172A;">실시간 KPI 카드</p>
</div>
<div style="display: flex; align-items: center; gap: 3pt; width: 48%; padding: 3pt 0;">
<div style="width: 3pt; height: 3pt; border-radius: 50%; background: #6366F1; flex-shrink: 0;"></div>
<p style="white-space: nowrap; font-size: 5.5pt; color: #0F172A;">조직 실적 트리</p>
</div>
<div style="display: flex; align-items: center; gap: 3pt; width: 48%; padding: 3pt 0;">
<div style="width: 3pt; height: 3pt; border-radius: 50%; background: #6366F1; flex-shrink: 0;"></div>
<p style="white-space: nowrap; font-size: 5.5pt; color: #0F172A;">역할별 수당 현황</p>
</div>
<div style="display: flex; align-items: center; gap: 3pt; width: 48%; padding: 3pt 0;">
<div style="width: 3pt; height: 3pt; border-radius: 50%; background: #6366F1; flex-shrink: 0;"></div>
<p style="white-space: nowrap; font-size: 5.5pt; color: #0F172A;">승인 대기 알림</p>
</div>
<div style="display: flex; align-items: center; gap: 3pt; width: 48%; padding: 3pt 0;">
<div style="width: 3pt; height: 3pt; border-radius: 50%; background: #6366F1; flex-shrink: 0;"></div>
<p style="white-space: nowrap; font-size: 5.5pt; color: #0F172A;">기간별 트렌드</p>
</div>
<div style="display: flex; align-items: center; gap: 3pt; width: 48%; padding: 3pt 0;">
<div style="width: 3pt; height: 3pt; border-radius: 50%; background: #6366F1; flex-shrink: 0;"></div>
<p style="white-space: nowrap; font-size: 5.5pt; color: #0F172A;">수익 시뮬레이터</p>
</div>
<div style="display: flex; align-items: center; gap: 3pt; width: 48%; padding: 3pt 0;">
<div style="width: 3pt; height: 3pt; border-radius: 50%; background: #6366F1; flex-shrink: 0;"></div>
<p style="white-space: nowrap; font-size: 5.5pt; color: #0F172A;">모바일 대응</p>
</div>
</div>
</div>
<!-- Thin divider -->
<div style="height: 1pt; background: #F1F5F9; margin-bottom: 10pt;"></div>
<!-- 4 role cards - compact -->
<div style="margin-bottom: 10pt;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #6366F1; margin-bottom: 5pt;">역할별 맞춤 화면</p>
<div style="display: flex; gap: 3pt;">
<div style="flex: 1; background: #F8FAFC; border: 1pt solid #F1F5F9; border-radius: 4pt; padding: 5pt 3pt; text-align: center;">
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #6366F1;">CEO</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #64748B; margin-top: 1pt;">전사 KPI</p>
</div>
<div style="flex: 1; background: #F8FAFC; border: 1pt solid #F1F5F9; border-radius: 4pt; padding: 5pt 3pt; text-align: center;">
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #818CF8;">관리자</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #64748B; margin-top: 1pt;">팀 실적</p>
</div>
<div style="flex: 1; background: #F8FAFC; border: 1pt solid #F1F5F9; border-radius: 4pt; padding: 5pt 3pt; text-align: center;">
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #6366F1;">운영자</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #64748B; margin-top: 1pt;">인력/승인</p>
</div>
<div style="flex: 1; background: #F8FAFC; border: 1pt solid #F1F5F9; border-radius: 4pt; padding: 5pt 3pt; text-align: center;">
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #818CF8;">영업자</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #64748B; margin-top: 1pt;">내 실적</p>
</div>
</div>
</div>
<!-- Thin divider -->
<div style="height: 1pt; background: #F1F5F9; margin-bottom: 10pt;"></div>
<!-- Pricing - compact -->
<div style="margin-bottom: 10pt;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #6366F1; margin-bottom: 5pt;">투자 비용</p>
<div style="display: flex; align-items: baseline; gap: 6pt;">
<p style="white-space: nowrap; font-size: 13pt; font-weight: 800; color: #0F172A;">2,000만원</p>
<p style="white-space: nowrap; font-size: 6pt; color: #64748B;">+ 월 50만원 (유지보수)</p>
</div>
<p style="white-space: nowrap; font-size: 5pt; color: #CBD5E1; margin-top: 2pt;">CEO 대시보드 + 견적/수주 + 생산 + 인사/회계 포함</p>
</div>
<!-- Process - compact -->
<div style="margin-bottom: 10pt;">
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #6366F1; margin-bottom: 4pt;">도입 프로세스</p>
<div style="display: flex; gap: 2pt; align-items: center;">
<div style="flex: 1; text-align: center;">
<p style="white-space: nowrap; font-size: 10pt; font-weight: 300; color: #6366F1; opacity: 0.35;">01</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: #0F172A;">현장 인터뷰</p>
</div>
<svg viewBox="0 0 6 6" width="4pt" height="4pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M1 3 L5 3 M4 1.5 L5.5 3 L4 4.5" fill="none" stroke="#CBD5E1" stroke-width="0.6" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div style="flex: 1; text-align: center;">
<p style="white-space: nowrap; font-size: 10pt; font-weight: 300; color: #6366F1; opacity: 0.35;">02</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: #0F172A;">맞춤 개발</p>
</div>
<svg viewBox="0 0 6 6" width="4pt" height="4pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M1 3 L5 3 M4 1.5 L5.5 3 L4 4.5" fill="none" stroke="#CBD5E1" stroke-width="0.6" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div style="flex: 1; text-align: center;">
<p style="white-space: nowrap; font-size: 10pt; font-weight: 300; color: #6366F1; opacity: 0.35;">03</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: #0F172A;">데이터 이관</p>
</div>
<svg viewBox="0 0 6 6" width="4pt" height="4pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M1 3 L5 3 M4 1.5 L5.5 3 L4 4.5" fill="none" stroke="#CBD5E1" stroke-width="0.6" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div style="flex: 1; text-align: center;">
<p style="white-space: nowrap; font-size: 10pt; font-weight: 300; color: #6366F1; opacity: 0.35;">04</p>
<p style="white-space: nowrap; font-size: 5.5pt; font-weight: 600; color: #0F172A;">교육/안정화</p>
</div>
</div>
</div>
<!-- CTA + Footer -->
<div style="margin-top: auto; background: #F8FAFC; border: 1pt solid #F1F5F9; border-radius: 5pt; padding: 8pt 10pt;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<div>
<p style="white-space: nowrap; font-size: 5.5pt; color: #64748B; margin-top: 1pt;">대표님 전용 대시보드를 직접 체험</p>
</div>
<div style="text-align: right; border-left: 2pt solid #6366F1; padding-left: 8pt;">
<p style="white-space: nowrap; font-size: 5pt; color: #CBD5E1; margin-top: 1pt;">www.sam.it.kr</p>
</div>
</div>
</div>
<div style="margin-top: 4pt; text-align: center;">
<p style="white-space: nowrap; font-size: 4.5pt; color: #CBD5E1;">SAM</p>
</div>
</body>
</html>

View File

@@ -0,0 +1,227 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
width: 405pt; height: 720pt;
font-family: 'Pretendard', sans-serif;
background: #FFFFFF;
padding: 24pt 28pt 14pt 32pt;
display: flex; flex-direction: column;
position: relative;
}
</style>
</head>
<body>
<!-- Left accent line -->
<div style="position: absolute; left: 0; top: 0; width: 3pt; height: 100%; background: #6366F1;"></div>
<!-- Header -->
<div style="display: flex; align-items: center; gap: 8pt; margin-bottom: 18pt;">
<img src="/home/aweso/sam/docs/assets/bi/sam_bi_black.png" style="height: 18pt;">
<div style="flex: 1;"></div>
<p style="white-space: nowrap; font-size: 6pt; color: #CBD5E1; letter-spacing: 0.15em;">FEATURES & PRICING</p>
</div>
<!-- Section: 7 features as text rows -->
<div style="margin-bottom: 14pt;">
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: #6366F1; margin-bottom: 8pt;">대시보드 핵심 기능</p>
<div style="display: flex; flex-direction: column; gap: 3pt;">
<!-- 01 -->
<div style="display: flex; align-items: center; gap: 6pt; padding: 4pt 0;">
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #6366F1; flex-shrink: 0;"></div>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #0F172A; width: 60pt;">실시간 KPI 카드</p>
<p style="white-space: nowrap; font-size: 6pt; color: #64748B;">매출, 수주, 납기율, 승인 대기</p>
</div>
<!-- 02 -->
<div style="display: flex; align-items: center; gap: 6pt; padding: 4pt 0;">
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #6366F1; flex-shrink: 0;"></div>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #0F172A; width: 60pt;">조직 실적 트리</p>
<p style="white-space: nowrap; font-size: 6pt; color: #64748B;">계층별 팀/개인 실적 펼쳐보기</p>
</div>
<!-- 03 -->
<div style="display: flex; align-items: center; gap: 6pt; padding: 4pt 0;">
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #6366F1; flex-shrink: 0;"></div>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #0F172A; width: 60pt;">역할별 수당 현황</p>
<p style="white-space: nowrap; font-size: 6pt; color: #64748B;">판매자/관리자/협업자 배분 확인</p>
</div>
<!-- 04 -->
<div style="display: flex; align-items: center; gap: 6pt; padding: 4pt 0;">
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #6366F1; flex-shrink: 0;"></div>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #0F172A; width: 60pt;">승인 대기 알림</p>
<p style="white-space: nowrap; font-size: 6pt; color: #64748B;">가입/지급 미처리 빨간 뱃지</p>
</div>
<!-- 05 -->
<div style="display: flex; align-items: center; gap: 6pt; padding: 4pt 0;">
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #6366F1; flex-shrink: 0;"></div>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #0F172A; width: 60pt;">기간별 트렌드</p>
<p style="white-space: nowrap; font-size: 6pt; color: #64748B;">당월/분기/연간 추이 차트</p>
</div>
<!-- 06 -->
<div style="display: flex; align-items: center; gap: 6pt; padding: 4pt 0;">
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #6366F1; flex-shrink: 0;"></div>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #0F172A; width: 60pt;">수익 시뮬레이터</p>
<p style="white-space: nowrap; font-size: 6pt; color: #64748B;">가상 시나리오 수당/마진 계산</p>
</div>
<!-- 07 -->
<div style="display: flex; align-items: center; gap: 6pt; padding: 4pt 0;">
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #6366F1; flex-shrink: 0;"></div>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 700; color: #0F172A; width: 60pt;">모바일 대응</p>
<p style="white-space: nowrap; font-size: 6pt; color: #64748B;">스마트폰으로 KPI 확인/승인</p>
</div>
</div>
</div>
<!-- Thin divider -->
<div style="height: 1pt; background: #F1F5F9; margin-bottom: 14pt;"></div>
<!-- 4 role cards - ultra minimal -->
<div style="margin-bottom: 14pt;">
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: #6366F1; margin-bottom: 8pt;">역할별 맞춤 화면</p>
<div style="display: flex; gap: 5pt;">
<!-- CEO -->
<div style="flex: 1; background: #F8FAFC; border: 1pt solid #F1F5F9; border-radius: 5pt; padding: 8pt 5pt; text-align: center;">
<svg viewBox="0 0 24 24" width="14pt" height="14pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 3pt;">
<circle cx="12" cy="8" r="4" fill="none" stroke="#6366F1" stroke-width="0.8"/>
<path d="M4 20 Q4 14 12 14 Q20 14 20 20" fill="none" stroke="#6366F1" stroke-width="0.8"/>
<path d="M8 4 L12 1 L16 4" fill="none" stroke="#6366F1" stroke-width="0.7" stroke-linecap="round" stroke-linejoin="round" opacity="0.5"/>
</svg>
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #6366F1;">CEO</p>
<p style="white-space: nowrap; font-size: 5pt; color: #64748B; margin-top: 2pt;">전사 KPI 총괄</p>
</div>
<!-- Manager -->
<div style="flex: 1; background: #F8FAFC; border: 1pt solid #F1F5F9; border-radius: 5pt; padding: 8pt 5pt; text-align: center;">
<svg viewBox="0 0 24 24" width="14pt" height="14pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 3pt;">
<circle cx="8" cy="8" r="3" fill="none" stroke="#818CF8" stroke-width="0.8"/>
<circle cx="16" cy="8" r="3" fill="none" stroke="#818CF8" stroke-width="0.8" opacity="0.5"/>
<path d="M2 18 Q2 13 8 13 Q14 13 14 18" fill="none" stroke="#818CF8" stroke-width="0.8"/>
<path d="M12 18 Q12 13 16 13 Q22 13 22 18" fill="none" stroke="#818CF8" stroke-width="0.8" opacity="0.5"/>
</svg>
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #818CF8;">관리자</p>
<p style="white-space: nowrap; font-size: 5pt; color: #64748B; margin-top: 2pt;">팀 실적 관리</p>
</div>
<!-- Operator -->
<div style="flex: 1; background: #F8FAFC; border: 1pt solid #F1F5F9; border-radius: 5pt; padding: 8pt 5pt; text-align: center;">
<svg viewBox="0 0 24 24" width="14pt" height="14pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 3pt;">
<circle cx="12" cy="12" r="8" fill="none" stroke="#6366F1" stroke-width="0.8" opacity="0.3"/>
<circle cx="12" cy="12" r="3" fill="none" stroke="#6366F1" stroke-width="0.8"/>
<line x1="12" y1="4" x2="12" y2="6" stroke="#6366F1" stroke-width="0.7" stroke-linecap="round"/>
<line x1="12" y1="18" x2="12" y2="20" stroke="#6366F1" stroke-width="0.7" stroke-linecap="round"/>
<line x1="4" y1="12" x2="6" y2="12" stroke="#6366F1" stroke-width="0.7" stroke-linecap="round"/>
<line x1="18" y1="12" x2="20" y2="12" stroke="#6366F1" stroke-width="0.7" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #6366F1;">운영자</p>
<p style="white-space: nowrap; font-size: 5pt; color: #64748B; margin-top: 2pt;">인력/승인 관리</p>
</div>
<!-- Sales -->
<div style="flex: 1; background: #F8FAFC; border: 1pt solid #F1F5F9; border-radius: 5pt; padding: 8pt 5pt; text-align: center;">
<svg viewBox="0 0 24 24" width="14pt" height="14pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 3pt;">
<rect x="4" y="3" width="16" height="18" rx="2" fill="none" stroke="#818CF8" stroke-width="0.8" opacity="0.4"/>
<line x1="7" y1="8" x2="17" y2="8" stroke="#818CF8" stroke-width="0.5" opacity="0.3"/>
<line x1="7" y1="11" x2="14" y2="11" stroke="#818CF8" stroke-width="0.5" opacity="0.3"/>
<line x1="7" y1="14" x2="12" y2="14" stroke="#818CF8" stroke-width="0.5" opacity="0.3"/>
<path d="M14 16 L16 18 L20 13" fill="none" stroke="#818CF8" stroke-width="0.8" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #818CF8;">영업자</p>
<p style="white-space: nowrap; font-size: 5pt; color: #64748B; margin-top: 2pt;">내 실적 조회</p>
</div>
</div>
</div>
<!-- Thin divider -->
<div style="height: 1pt; background: #F1F5F9; margin-bottom: 14pt;"></div>
<!-- Pricing - clean typography -->
<div style="margin-bottom: 14pt;">
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: #6366F1; margin-bottom: 8pt;">투자 비용</p>
<div style="display: flex; gap: 6pt;">
<!-- Base package -->
<div style="flex: 1;">
<p style="white-space: nowrap; font-size: 5.5pt; color: #64748B; margin-bottom: 3pt;">대시보드 포함 기본 패키지</p>
<p style="white-space: nowrap; font-size: 15pt; font-weight: 800; color: #0F172A;">2,000만원</p>
<p style="white-space: nowrap; font-size: 6pt; color: #64748B; margin-top: 2pt;">+ 월 50만원 (유지보수)</p>
<div style="margin-top: 5pt; padding-top: 5pt; border-top: 1pt solid #F1F5F9;">
<p style="white-space: nowrap; font-size: 5.5pt; color: #CBD5E1;">CEO 대시보드 + 견적/수주 + 생산</p>
<p style="white-space: nowrap; font-size: 5.5pt; color: #CBD5E1;">인사/회계 무료 포함</p>
</div>
</div>
<!-- Add-ons -->
<div style="flex: 1;">
<p style="white-space: nowrap; font-size: 5.5pt; color: #64748B; margin-bottom: 5pt;">추가 옵션 (선택)</p>
<div style="display: flex; flex-direction: column; gap: 4pt;">
<div style="display: flex; justify-content: space-between;">
<p style="white-space: nowrap; font-size: 6pt; color: #64748B;">생산공정 관리</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #6366F1;">+500만원</p>
</div>
<div style="display: flex; justify-content: space-between;">
<p style="white-space: nowrap; font-size: 6pt; color: #64748B;">품질관리(인정검사)</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #6366F1;">+2,000만원</p>
</div>
<div style="display: flex; justify-content: space-between;">
<p style="white-space: nowrap; font-size: 6pt; color: #64748B;">AI 견적 자동 생성</p>
<p style="white-space: nowrap; font-size: 6pt; font-weight: 700; color: #6366F1;">월 10~20만원</p>
</div>
</div>
</div>
</div>
</div>
<!-- Thin divider -->
<div style="height: 1pt; background: #F1F5F9; margin-bottom: 14pt;"></div>
<!-- Process steps - simple numbered list -->
<div style="margin-bottom: 14pt;">
<p style="white-space: nowrap; font-size: 7.5pt; font-weight: 700; color: #6366F1; margin-bottom: 8pt;">도입 프로세스</p>
<div style="display: flex; gap: 3pt; align-items: center;">
<div style="flex: 1; text-align: center;">
<p style="white-space: nowrap; font-size: 14pt; font-weight: 300; color: #6366F1; opacity: 0.4;">01</p>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: #0F172A; margin-top: 2pt;">현장 인터뷰</p>
<p style="white-space: nowrap; font-size: 5pt; color: #CBD5E1; margin-top: 1pt;">1~2주</p>
</div>
<svg viewBox="0 0 8 8" width="5pt" height="5pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M2 4 L6 4 M5 2.5 L6.5 4 L5 5.5" fill="none" stroke="#CBD5E1" stroke-width="0.8" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div style="flex: 1; text-align: center;">
<p style="white-space: nowrap; font-size: 14pt; font-weight: 300; color: #6366F1; opacity: 0.4;">02</p>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: #0F172A; margin-top: 2pt;">맞춤 개발</p>
<p style="white-space: nowrap; font-size: 5pt; color: #CBD5E1; margin-top: 1pt;">2~4주</p>
</div>
<svg viewBox="0 0 8 8" width="5pt" height="5pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M2 4 L6 4 M5 2.5 L6.5 4 L5 5.5" fill="none" stroke="#CBD5E1" stroke-width="0.8" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div style="flex: 1; text-align: center;">
<p style="white-space: nowrap; font-size: 14pt; font-weight: 300; color: #6366F1; opacity: 0.4;">03</p>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: #0F172A; margin-top: 2pt;">데이터 이관</p>
<p style="white-space: nowrap; font-size: 5pt; color: #CBD5E1; margin-top: 1pt;">1~2주</p>
</div>
<svg viewBox="0 0 8 8" width="5pt" height="5pt" xmlns="http://www.w3.org/2000/svg" style="flex-shrink: 0;">
<path d="M2 4 L6 4 M5 2.5 L6.5 4 L5 5.5" fill="none" stroke="#CBD5E1" stroke-width="0.8" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<div style="flex: 1; text-align: center;">
<p style="white-space: nowrap; font-size: 14pt; font-weight: 300; color: #6366F1; opacity: 0.4;">04</p>
<p style="white-space: nowrap; font-size: 6.5pt; font-weight: 600; color: #0F172A; margin-top: 2pt;">교육/안정화</p>
<p style="white-space: nowrap; font-size: 5pt; color: #CBD5E1; margin-top: 1pt;">1~2주</p>
</div>
</div>
</div>
<!-- CTA -->
<div style="margin-top: auto; background: #F8FAFC; border: 1pt solid #F1F5F9; border-radius: 6pt; padding: 12pt 14pt;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<div>
<p style="white-space: nowrap; font-size: 6pt; color: #64748B; margin-top: 2pt;">대표님 전용 대시보드를 직접 체험</p>
</div>
<div style="text-align: right; border-left: 2pt solid #6366F1; padding-left: 10pt;">
<p style="white-space: nowrap; font-size: 5.5pt; color: #CBD5E1; margin-top: 2pt;">www.sam.it.kr</p>
</div>
</div>
</div>
<!-- Footer -->
<div style="margin-top: 6pt; text-align: center;">
<p style="white-space: nowrap; font-size: 5pt; color: #CBD5E1;">SAM</p>
</div>
</body>
</html>

View File

@@ -0,0 +1,181 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
width: 405pt; height: 720pt;
font-family: 'Pretendard', sans-serif;
background: #FFFFFF;
padding: 32pt 28pt 18pt 32pt;
display: flex; flex-direction: column;
position: relative;
}
</style>
</head>
<body>
<!-- Left accent line -->
<div style="position: absolute; left: 0; top: 0; width: 3pt; height: 100%; background: #6366F1;"></div>
<!-- Header -->
<div style="display: flex; align-items: center; gap: 8pt; margin-bottom: 28pt;">
<img src="/home/aweso/sam/docs/assets/bi/sam_bi_black.png" style="height: 20pt;">
<div style="flex: 1;"></div>
<p style="white-space: nowrap; font-size: 6pt; color: #CBD5E1; letter-spacing: 0.15em;">v9</p>
</div>
<!-- Hero section -->
<div style="margin-bottom: 28pt;">
<p style="white-space: nowrap; font-size: 7pt; font-weight: 600; color: #6366F1; letter-spacing: 0.15em; margin-bottom: 8pt;">EXECUTIVE DASHBOARD</p>
<p style="white-space: nowrap; font-size: 18pt; font-weight: 300; color: #0F172A; margin-bottom: 3pt;">대표님, 우리 회사</p>
<p style="white-space: nowrap; font-size: 18pt; font-weight: 800; color: #0F172A; margin-bottom: 10pt;">지금 어떤 상태인가요?</p>
<p style="white-space: nowrap; font-size: 7.5pt; color: #64748B; line-height: 1.6;">매출, 수주, 조직 실적, 승인 대기</p>
<p style="white-space: nowrap; font-size: 7.5pt; color: #64748B; line-height: 1.6;">더 이상 보고를 기다리지 마세요.</p>
</div>
<!-- Thin divider -->
<div style="height: 1pt; background: #F1F5F9; margin-bottom: 24pt;"></div>
<!-- Dashboard Mock UI -->
<div style="background: #F8FAFC; border: 1pt solid #F1F5F9; border-radius: 6pt; padding: 10pt; margin-bottom: 24pt;">
<!-- Title bar -->
<div style="display: flex; align-items: center; gap: 3pt; margin-bottom: 7pt;">
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #EF4444;"></div>
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #F59E0B;"></div>
<div style="width: 4pt; height: 4pt; border-radius: 50%; background: #10B981;"></div>
<p style="white-space: nowrap; font-size: 5pt; color: #CBD5E1; margin-left: 5pt;">SAM CEO Dashboard</p>
</div>
<!-- KPI cards -->
<div style="display: flex; gap: 4pt; margin-bottom: 6pt;">
<!-- Revenue -->
<div style="flex: 1; background: #FFFFFF; border: 1pt solid #F1F5F9; border-radius: 4pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 16 16" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<rect x="2" y="9" width="3" height="5" rx="0.5" fill="none" stroke="#6366F1" stroke-width="0.8" opacity="0.4"/>
<rect x="6" y="5" width="3" height="9" rx="0.5" fill="none" stroke="#6366F1" stroke-width="0.8" opacity="0.6"/>
<rect x="10" y="2" width="3" height="12" rx="0.5" fill="none" stroke="#6366F1" stroke-width="0.8"/>
</svg>
<p style="white-space: nowrap; font-size: 11pt; font-weight: 800; color: #6366F1;">5.2억</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 600;">+15.3%</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #64748B; margin-top: 1pt;">월 매출</p>
</div>
<!-- Orders -->
<div style="flex: 1; background: #FFFFFF; border: 1pt solid #F1F5F9; border-radius: 4pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 16 16" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<rect x="2" y="2" width="12" height="12" rx="2" fill="none" stroke="#10B981" stroke-width="0.8" opacity="0.5"/>
<path d="M5 8 L7 10 L11 6" fill="none" stroke="#10B981" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 11pt; font-weight: 800; color: #10B981;">127건</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 600;">+8건</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #64748B; margin-top: 1pt;">누적 수주</p>
</div>
<!-- Delivery -->
<div style="flex: 1; background: #FFFFFF; border: 1pt solid #F1F5F9; border-radius: 4pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 16 16" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<circle cx="8" cy="8" r="5.5" fill="none" stroke="#818CF8" stroke-width="0.8" opacity="0.3"/>
<circle cx="8" cy="8" r="5.5" fill="none" stroke="#818CF8" stroke-width="1" stroke-dasharray="32 35" stroke-dashoffset="-9" stroke-linecap="round"/>
</svg>
<p style="white-space: nowrap; font-size: 11pt; font-weight: 800; color: #818CF8;">96%</p>
<p style="white-space: nowrap; font-size: 5pt; color: #10B981; font-weight: 600;">목표 달성</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #64748B; margin-top: 1pt;">납기 준수율</p>
</div>
<!-- Pending -->
<div style="flex: 1; background: #FFFFFF; border: 1pt solid #F1F5F9; border-radius: 4pt; padding: 6pt 4pt; text-align: center;">
<svg viewBox="0 0 16 16" width="9pt" height="9pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 2pt;">
<path d="M8 2 L14 12 L2 12 Z" fill="none" stroke="#EF4444" stroke-width="0.8" stroke-linejoin="round"/>
<line x1="8" y1="6" x2="8" y2="9" stroke="#EF4444" stroke-width="1" stroke-linecap="round"/>
<circle cx="8" cy="10.5" r="0.5" fill="#EF4444"/>
</svg>
<p style="white-space: nowrap; font-size: 11pt; font-weight: 800; color: #EF4444;">5건</p>
<p style="white-space: nowrap; font-size: 5pt; color: #EF4444; font-weight: 600;">즉시 처리</p>
<p style="white-space: nowrap; font-size: 4.5pt; color: #64748B; margin-top: 1pt;">승인 대기</p>
</div>
</div>
<!-- Chart area -->
<div style="display: flex; gap: 4pt;">
<!-- Line chart -->
<div style="flex: 3; background: #FFFFFF; border: 1pt solid #F1F5F9; border-radius: 3pt; padding: 5pt;">
<p style="white-space: nowrap; font-size: 4.5pt; color: #CBD5E1; margin-bottom: 3pt;">월별 매출 추이</p>
<svg viewBox="0 0 150 32" width="100%" height="24pt" xmlns="http://www.w3.org/2000/svg">
<line x1="0" y1="10" x2="150" y2="10" stroke="#F1F5F9" stroke-width="0.5"/>
<line x1="0" y1="20" x2="150" y2="20" stroke="#F1F5F9" stroke-width="0.5"/>
<path d="M5 28 L18 22 L31 24 L44 18 L57 14 L70 10 L83 12 L96 6 L109 8 L122 2 L135 5" fill="none" stroke="#6366F1" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="122" cy="2" r="1.8" fill="#6366F1"/>
</svg>
</div>
<!-- Donut -->
<div style="flex: 2; background: #FFFFFF; border: 1pt solid #F1F5F9; border-radius: 3pt; padding: 5pt; display: flex; align-items: center; gap: 4pt;">
<svg viewBox="0 0 40 40" width="28pt" height="28pt" xmlns="http://www.w3.org/2000/svg">
<circle cx="20" cy="20" r="14" fill="none" stroke="#F1F5F9" stroke-width="4"/>
<circle cx="20" cy="20" r="14" fill="none" stroke="#6366F1" stroke-width="4" stroke-dasharray="33 55" stroke-dashoffset="22" stroke-linecap="round"/>
<circle cx="20" cy="20" r="14" fill="none" stroke="#10B981" stroke-width="4" stroke-dasharray="22 66" stroke-dashoffset="-11" stroke-linecap="round"/>
<circle cx="20" cy="20" r="14" fill="none" stroke="#818CF8" stroke-width="4" stroke-dasharray="19 69" stroke-dashoffset="-33" stroke-linecap="round"/>
<circle cx="20" cy="20" r="14" fill="none" stroke="#F59E0B" stroke-width="4" stroke-dasharray="12 76" stroke-dashoffset="-52" stroke-linecap="round"/>
</svg>
<div style="display: flex; flex-direction: column; gap: 2pt;">
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #6366F1; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4.5pt; color: #64748B;">영업1팀</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #10B981; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4.5pt; color: #64748B;">영업2팀</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #818CF8; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4.5pt; color: #64748B;">생산팀</p>
</div>
<div style="display: flex; align-items: center; gap: 2pt;">
<div style="width: 3pt; height: 3pt; background: #F59E0B; border-radius: 1pt;"></div>
<p style="white-space: nowrap; font-size: 4.5pt; color: #64748B;">품질팀</p>
</div>
</div>
</div>
</div>
</div>
<!-- 3 value proposition cards -->
<div style="display: flex; gap: 6pt; margin-bottom: 24pt;">
<!-- Instant insight -->
<div style="flex: 1; background: #F8FAFC; border: 1pt solid #F1F5F9; border-radius: 5pt; padding: 10pt 7pt; text-align: center;">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 4pt;">
<circle cx="12" cy="12" r="9" fill="none" stroke="#6366F1" stroke-width="0.8" opacity="0.3"/>
<path d="M12 6 L12 12 L16 15" fill="none" stroke="#6366F1" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #0F172A;">즉시 현황 파악</p>
<p style="font-size: 5.5pt; color: #64748B; margin-top: 3pt; line-height: 1.5;">로그인 3초면</p>
<p style="font-size: 5.5pt; color: #64748B; line-height: 1.5;">전사 현황 확인</p>
</div>
<!-- Data-driven -->
<div style="flex: 1; background: #F8FAFC; border: 1pt solid #F1F5F9; border-radius: 5pt; padding: 10pt 7pt; text-align: center;">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 4pt;">
<rect x="3" y="14" width="4" height="7" rx="0.5" fill="none" stroke="#6366F1" stroke-width="0.8" opacity="0.4"/>
<rect x="10" y="8" width="4" height="13" rx="0.5" fill="none" stroke="#6366F1" stroke-width="0.8" opacity="0.6"/>
<rect x="17" y="3" width="4" height="18" rx="0.5" fill="none" stroke="#6366F1" stroke-width="0.8"/>
</svg>
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #0F172A;">데이터로 판단</p>
<p style="font-size: 5.5pt; color: #64748B; margin-top: 3pt; line-height: 1.5;">감이 아닌 숫자로</p>
<p style="font-size: 5.5pt; color: #64748B; line-height: 1.5;">KPI/팀 성과 비교</p>
</div>
<!-- Mobile approval -->
<div style="flex: 1; background: #F8FAFC; border: 1pt solid #F1F5F9; border-radius: 5pt; padding: 10pt 7pt; text-align: center;">
<svg viewBox="0 0 24 24" width="16pt" height="16pt" xmlns="http://www.w3.org/2000/svg" style="margin-bottom: 4pt;">
<circle cx="12" cy="12" r="8" fill="none" stroke="#6366F1" stroke-width="0.8" opacity="0.3"/>
<path d="M8 12 L11 15 L16 9" fill="none" stroke="#6366F1" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<p style="white-space: nowrap; font-size: 7pt; font-weight: 700; color: #0F172A;">모바일 승인</p>
<p style="font-size: 5.5pt; color: #64748B; margin-top: 3pt; line-height: 1.5;">이동중에도 즉시</p>
<p style="font-size: 5.5pt; color: #64748B; line-height: 1.5;">결재/승인 처리</p>
</div>
</div>
<!-- Footer -->
<div style="margin-top: auto; display: flex; justify-content: space-between; align-items: flex-end;">
<div>
<p style="white-space: nowrap; font-size: 7pt; font-weight: 600; color: #0F172A;">SAM</p>
<p style="white-space: nowrap; font-size: 6pt; color: #CBD5E1; margin-top: 2pt;">www.sam.it.kr</p>
</div>
<p style="white-space: nowrap; font-size: 5.5pt; color: #CBD5E1;">뒷면에서 상세 기능을 확인하세요</p>
</div>
</body>
</html>

150
dev/TODO.md Normal file
View File

@@ -0,0 +1,150 @@
# SAM Project TODO
> **마지막 업데이트**: 2025-12-21
---
## 🔴 긴급 (보안/필수)
### [TODO-001] Settings 권한 관리 localStorage → API 전환
**발견일**: 2025-12-20
**우선순위**: 🔴 긴급
**카테고리**: 보안
**현재 상태**:
- 권한 관리가 `localStorage`에 저장됨
- 파일: `react/src/components/settings/PermissionManagement/index.tsx`
- 키: `buddy_permissions`
**문제점**:
| 문제 | 설명 |
|------|------|
| 클라이언트 저장 | 권한이 브라우저에만 저장됨 |
| 조작 가능 | DevTools에서 누구나 수정 가능 |
| 서버 미검증 | 서버에서 권한 검증 안 함 |
| 세션 비공유 | 다른 브라우저/기기에서 권한 없음 |
**해결 방안**:
```
현재: localStorage → 브라우저에 저장
개선: API 호출 → DB에 저장 → 서버에서 검증
필요 API:
- GET /api/v1/roles
- POST /api/v1/roles
- PUT /api/v1/roles/{id}/permissions
- GET /api/v1/permissions
```
**관련 문서**:
- `docs/projects/api-integration/phase-3-api-mapping/gap-analysis.md`
---
## 🟡 중요 (기능 완성)
### [TODO-002] Mock 데이터 → API 연동 전환
**발견일**: 2025-12-20
**우선순위**: 🟡 중요
**카테고리**: 기능 개발
**현재 상태**:
- 109개 React 페이지 중 95개 (87.2%)가 Mock 데이터 사용
- `generateMockData()` 함수 패턴
**영향 모듈**:
| 모듈 | 페이지 수 | 상태 |
|------|----------|------|
| Accounting | 17 | 🆕 Mock |
| HR | 9 | 🆕 Mock |
| Board | 6 | 🆕 Mock |
| Approval | 4 | 🆕 Mock |
| Settings | 10 | 🆕 Mock |
| Dashboard | 1 | ⏳ 미구현 |
| Reports | 2 | 🆕 Mock |
| Customer Center | 6 | 🆕 Mock |
| Production | 4 | 🆕 Mock |
| Sales (일부) | 4 | 🆕 Mock |
**관련 문서**:
- `docs/projects/api-integration/phase-3-api-mapping/mapping-matrix.md`
- `docs/projects/api-integration/phase-3-api-mapping/gap-analysis.md`
### [TODO-004] 프론트엔드 client_type 코드값 전송 개선
**발견일**: 2025-12-21
**우선순위**: 🟡 중요
**카테고리**: 데이터 정합성
**현재 상태**:
- 프론트엔드에서 `client_type`에 한글 이름(`매입`, `매출`) 전송
- API는 `common_codes.code` 값(`PURCHASE`, `SALES`) 기대
- 422 Validation Error 발생
**임시 해결**:
- API `ClientStoreRequest`, `ClientUpdateRequest`에서 `prepareForValidation()` 추가
- 한글 name → code 자동 변환 처리
**영구 해결 필요**:
| 파일 | 수정 내용 |
|------|----------|
| `react/src/hooks/useClientList.ts` | client_type 전송 시 code 값 사용 |
| `react/src/components/clients/*` | 폼에서 code/name 구분 처리 |
**유효한 코드값**:
| code | name |
|------|------|
| `PURCHASE` | 매입 |
| `SALES` | 매출 |
| `BOTH` | 매입매출 |
**관련 에러**:
```json
{
"error": {
"details": {
"client_type": ["선택된 client type은(는) 유효하지 않습니다."]
}
}
}
```
---
## 🟢 개선 (최적화)
### [TODO-003] API 클라이언트 패턴 통일
**발견일**: 2025-12-20
**우선순위**: 🟢 개선
**카테고리**: 코드 품질
**현재 상태**:
| 패턴 | 사용처 | 비고 |
|------|--------|------|
| `/api/proxy/*` | Items, Clients | ✅ 표준 |
| `/api/v1/*` (Server Actions) | Pricing | 다른 패턴 |
| `generateMockData()` | 대부분 | Mock |
**권장사항**: `/api/proxy/*` 패턴으로 통일
---
## ✅ 완료
| ID | 제목 | 완료일 | 비고 |
|----|------|--------|------|
| - | - | - | - |
---
## 참고
- **Phase 3 분석 결과**: `docs/projects/api-integration/phase-3-api-mapping/`
- **전체 진행 상황**: `docs/projects/api-integration/PROGRESS.md`
---
*이 문서는 발견된 이슈와 개선사항을 추적합니다.*

View File

@@ -0,0 +1,94 @@
# 변경 내용 요약
**날짜:** 2025-01-08
**작업자:** Claude Code
**이슈:** Order Management API Phase 1.1
## 📋 변경 개요
수주관리(Order Management) API의 기본 CRUD 및 상태 관리 기능을 구현했습니다.
WorkOrderService/Controller 패턴을 참고하여 SAM API 규칙을 준수하는 OrderService와 OrderController를 생성했습니다.
## 📁 수정/추가된 파일
### 신규 생성 (7개)
- `app/Services/OrderService.php` - 수주 비즈니스 로직 서비스
- `app/Http/Controllers/Api/V1/OrderController.php` - 수주 API 컨트롤러
- `app/Http/Requests/Order/StoreOrderRequest.php` - 생성 요청 검증
- `app/Http/Requests/Order/UpdateOrderRequest.php` - 수정 요청 검증
- `app/Http/Requests/Order/UpdateOrderStatusRequest.php` - 상태 변경 요청 검증
- `app/Swagger/v1/OrderApi.php` - Swagger API 문서
### 수정 (5개)
- `routes/api.php` - OrderController import 및 라우트 추가
- `lang/ko/message.php` - 수주 관련 메시지 키 추가
- `lang/en/message.php` - 수주 관련 메시지 키 추가
- `lang/ko/error.php` - 수주 에러 메시지 키 추가
- `lang/en/error.php` - 수주 에러 메시지 키 추가
## 🔧 상세 변경 사항
### 1. OrderService
**기능:**
- `index()` - 목록 조회 (검색/필터링/페이징)
- `stats()` - 통계 조회 (상태별 건수/금액)
- `show()` - 단건 조회
- `store()` - 생성 (수주번호 자동생성)
- `update()` - 수정 (완료/취소 상태 수정 불가)
- `destroy()` - 삭제 (진행중/완료 상태 삭제 불가)
- `updateStatus()` - 상태 변경 (전환 규칙 검증)
**내부 메서드:**
- `validateStatusTransition()` - 상태 전환 규칙 검증
- `calculateItemAmounts()` - 품목 금액 계산 (공급가, 세액, 합계)
- `generateOrderNo()` - 수주번호 자동 생성 (ORD{YYYYMMDD}{0001})
### 2. OrderController
**엔드포인트:**
- `GET /api/v1/orders` - 목록 조회
- `GET /api/v1/orders/stats` - 통계 조회
- `POST /api/v1/orders` - 생성
- `GET /api/v1/orders/{id}` - 단건 조회
- `PUT /api/v1/orders/{id}` - 수정
- `DELETE /api/v1/orders/{id}` - 삭제
- `PATCH /api/v1/orders/{id}/status` - 상태 변경
### 3. FormRequest 클래스
**StoreOrderRequest:**
- 주문유형, 카테고리, 거래처 정보, 금액, 배송, 품목 배열 검증
**UpdateOrderRequest:**
- Store와 유사하나 order_no 제외 (수정 불가)
**UpdateOrderStatusRequest:**
- status 필드만 검증 (Rule::in 사용)
### 4. 상태 전환 규칙
```
DRAFT → CONFIRMED, CANCELLED
CONFIRMED → IN_PROGRESS, CANCELLED
IN_PROGRESS → COMPLETED, CANCELLED
COMPLETED → (변경 불가)
CANCELLED → DRAFT (복구 가능)
```
### 5. Swagger 문서
**스키마:**
- Order, OrderItem, OrderPagination, OrderStats
- OrderCreateRequest, OrderUpdateRequest, OrderItemRequest, OrderStatusRequest
## ✅ 검증 완료 항목
- [x] Pint 코드 스타일 검사 (6개 파일 자동 수정)
- [x] Swagger 문서 생성 (`php artisan l5-swagger:generate`)
- [x] Service-First 아키텍처 준수
- [x] FormRequest 검증 패턴 사용
- [x] i18n 메시지 키 사용
- [x] Multi-tenancy (BelongsToTenant) 지원
- [x] 감사 로그 컬럼 (created_by, updated_by, deleted_by)
## ⚠️ 배포 시 주의사항
- Order 모델은 기존에 이미 존재함 (마이그레이션 불필요)
- Swagger UI에서 API 테스트 가능: http://api.sam.kr/api-docs/index.html
## 🔗 관련 문서
- 계획 문서: `docs/dev_plans/order-management-plan.md`
- 참고 패턴: `app/Services/WorkOrderService.php`, `app/Http/Controllers/Api/V1/WorkOrderController.php`

View File

@@ -211,7 +211,7 @@ class ProductResource extends Resource
## 🔗 관련 문서
- 이전 작업: `/Users/hskwon/Works/@KD_SAM/SAM/docs/changes/20251111_1354_admin_users_improvement.md`
- 이전 작업: `docs/changes/20251111_admin_users_improvement.md`
- CLAUDE.md: `/Users/hskwon/Works/@KD_SAM/SAM/CLAUDE.md`
---

View File

@@ -0,0 +1,300 @@
# Items API files 배열 에러 수정
## 날짜
2025-12-15
## 문제
`PUT /api/v1/items/{id}` 요청 시 500 에러 발생
```
"Array to string conversion"
```
## 원인 분석
1. API 요청에서 `files` 배열이 전송됨:
```json
{
"files": {
"drawing": [{
"id": 5,
"file_name": "IMG_2163.png",
"file_path": "287/items/2025/12/ec3483f4152d1eb1.png"
}]
}
}
```
2. `ItemsService::getKnownFields()``$apiFields``files`가 없어서 동적 필드로 인식됨
3. `extractDynamicOptions()`에서 `files`가 "알려지지 않은 필드"로 추출됨
4. `$product->update($data)` 호출 시 `files` 배열이 그대로 전달되어 DB 저장 시 에러 발생
## 수정 파일
`api/app/Services/ItemsService.php`
## 수정 내용
### 1. getKnownFields() 메서드 (라인 36-37)
```php
// 수정 전
$apiFields = ['item_type', 'type_code', 'bom', 'product_type'];
// 수정 후
$apiFields = ['item_type', 'type_code', 'bom', 'product_type', 'files'];
```
### 2. updateProduct() 메서드 (라인 729-730)
```php
// 수정 전
unset($data['item_type']);
// 수정 후
unset($data['item_type'], $data['files']);
```
### 3. updateMaterial() 메서드 (라인 771-772)
```php
// 수정 전
unset($data['item_type'], $data['code']);
// 수정 후
unset($data['item_type'], $data['code'], $data['files']);
```
## 적용 체크리스트
- [x] `getKnownFields()` - `$apiFields``'files'` 추가
- [x] `updateProduct()` - `unset()``$data['files']` 추가
- [x] `updateMaterial()` - `unset()``$data['files']` 추가
## 커밋 정보
```
c68c280 fix: Items API 수정 시 files 배열로 인한 500 에러 수정
```
## 관련 파일
- `api/app/Http/Controllers/Api/V1/ItemsController.php`
- `api/app/Http/Controllers/Api/V1/ItemsFileController.php`
---
# ItemsFileController delete 메서드 타입 에러 수정
## 날짜
2025-12-15
## 문제
`DELETE /api/v1/items/{id}/files/{fileId}` 요청 시 타입 에러 발생
```
Argument #2 ($fileId) must be of type int, string given
```
## 원인 분석
Laravel 라우트 파라미터는 기본적으로 string으로 전달되는데, 컨트롤러 메서드에서 `int` 타입힌트를 사용하여 에러 발생
## 수정 파일
`api/app/Http/Controllers/Api/V1/ItemsFileController.php`
## 수정 내용
### delete() 메서드 (라인 157-159)
```php
// 수정 전
public function delete(int $id, int $fileId, Request $request)
{
return ApiResponse::handle(function () use ($id, $fileId, $request) {
// 수정 후
public function delete(int $id, mixed $fileId, Request $request)
{
$fileId = (int) $fileId;
return ApiResponse::handle(function () use ($id, $fileId, $request) {
```
## 적용 체크리스트
- [x] `delete()` 메서드 - `$fileId` 파라미터 타입을 `mixed`로 변경
- [x] `delete()` 메서드 - 내부에서 `$fileId = (int) $fileId;` 캐스팅 추가
## 커밋 정보
```
1040ce0 fix: ItemsFileController delete 메서드 타입 에러 수정
```
---
# ItemsFileController userId null 처리
## 날짜
2025-12-15
## 문제
`DELETE /api/v1/items/{id}/files/{fileId}` 요청 시 500 에러 발생
```
softDeleteFile(): Argument #1 ($userId) must be of type int, null given
```
## 원인 분석
- `auth()->id()``null`을 반환
- API 키 인증만 사용하고 Sanctum 토큰 인증이 없는 경우 발생
- `softDeleteFile(int $userId)` 메서드에 null 전달 시 타입 에러
## 수정 파일
`api/app/Http/Controllers/Api/V1/ItemsFileController.php`
## 수정 내용
### 1. upload() 메서드 (라인 77)
```php
// 수정 전
$userId = auth()->id();
// 수정 후
$userId = auth()->id() ?? app('api_user');
```
### 2. delete() 메서드 (라인 163)
```php
// 수정 전
$userId = auth()->id();
// 수정 후
$userId = auth()->id() ?? app('api_user');
```
## 적용 체크리스트
- [x] `upload()` 메서드 - `auth()->id() ?? app('api_user')` 변경
- [x] `delete()` 메서드 - `auth()->id() ?? app('api_user')` 변경
## 커밋 정보
```
22abb99 fix: ItemsFileController userId null 처리 추가
```
---
# ItemsFileController 파일 삭제 로직 일원화
## 날짜
2025-12-15
## 문제
- `upload()` 메서드의 파일 교체 삭제와 `delete()` 메서드의 파일 삭제 로직이 분리되어 있음
- userId 캐스팅이 일관되지 않음 (upload에만 int 캐스팅 적용)
- 관리 포인트가 2곳으로 분산
## 수정 파일
`api/app/Http/Controllers/Api/V1/ItemsFileController.php`
## 수정 내용
### 1. deleteFile() private 메서드 추가 (라인 195-199)
```php
// 추가
private function deleteFile(File $file): void
{
$userId = (int) (auth()->id() ?? app('api_user'));
$file->softDeleteFile($userId);
}
```
### 2. upload() 메서드 - 기존 파일 교체 시 (라인 98-100)
```php
// 수정 전
if ($existingFile) {
$existingFile->softDeleteFile($userId);
$replaced = true;
}
// 수정 후
if ($existingFile) {
$this->deleteFile($existingFile);
$replaced = true;
}
```
### 3. delete() 메서드 (라인 180-181)
```php
// 수정 전
$userId = auth()->id() ?? app('api_user');
...
$file->softDeleteFile($userId);
// 수정 후
// $userId 변수 제거
$this->deleteFile($file);
```
## 적용 체크리스트
- [x] `deleteFile()` private 메서드 추가
- [x] `upload()` 메서드 - `$this->deleteFile($existingFile)` 사용
- [x] `delete()` 메서드 - `$userId` 변수 제거, `$this->deleteFile($file)` 사용
## 커밋 정보
```
dea414b refactor: ItemsFileController 파일 삭제 로직 일원화
```
---
# ItemsFileController 파일 다운로드 URL 수정
## 날짜
2025-12-15
## 문제
파일 다운로드 시 인증 오류 발생
- 생성되는 URL: `/api/v1/files/download/{base64_path}` (라우트 없음)
- 실제 라우트: `/api/v1/files/{id}/download`
## 수정 파일
`api/app/Http/Controllers/Api/V1/ItemsFileController.php`
## 수정 내용
### 1. getFileUrl() 메서드 (라인 244-247)
```php
// 수정 전
private function getFileUrl(string $filePath): string
{
return url('/api/v1/files/download/'.base64_encode($filePath));
}
// 수정 후
private function getFileUrl(int $fileId): string
{
return url("/api/v1/files/{$fileId}/download");
}
```
### 2. formatFileResponse() 메서드 (라인 232)
```php
// 수정 전
'file_url' => $this->getFileUrl($file->file_path),
// 수정 후
'file_url' => $this->getFileUrl($file->id),
```
### 3. upload() 응답 (라인 142)
```php
// 수정 전
'file_url' => $this->getFileUrl($filePath),
// 수정 후
'file_url' => $this->getFileUrl($file->id),
```
## 적용 체크리스트
- [x] `getFileUrl()` 메서드 - 파라미터를 `string $filePath``int $fileId`로 변경
- [x] `getFileUrl()` 메서드 - URL 형식을 `/api/v1/files/{id}/download`로 변경
- [x] `formatFileResponse()` - `$this->getFileUrl($file->id)` 사용
- [x] `upload()` 응답 - `$this->getFileUrl($file->id)` 사용
## 프론트엔드 참고
- 다운로드 요청 시 **API 키 헤더 필수** (`X-API-Key` 또는 설정된 헤더)
- 기존 FileStorageController의 download 라우트 활용
## 커밋 정보
```
98262ed fix: ItemsFileController 파일 다운로드 URL을 file_id 기반으로 변경
```

View File

@@ -0,0 +1,78 @@
# 변경 내용 요약
**날짜:** 2025-12-25
**작업자:** Claude Code
**이슈:** employee-user-linkage-plan.md 구현
## 📋 변경 개요
사원-회원 연결 기능의 핵심 API 구현:
- 사원 전용 등록 (시스템 계정 없이)
- 계정 해제 기능 (revokeAccount)
## 📁 수정된 파일
### 1. api/app/Services/EmployeeService.php
- **store()**: password 생성 로직 수정 - `create_account=false`면 password=NULL 허용
- **revokeAccount()**: 신규 메서드 추가 - 시스템 계정 해제 (password=NULL, 토큰 무효화)
### 2. api/app/Http/Controllers/Api/V1/EmployeeController.php
- **revokeAccount()**: 신규 액션 추가
- **createAccount()**: 응답 메시지 i18n 키로 변경
### 3. api/routes/api.php
- `POST /employees/{id}/revoke-account` 라우트 추가
### 4. api/lang/ko/employee.php (신규)
- 사원 관련 메시지 키 정의
### 5. api/lang/en/employee.php (신규)
- 영문 메시지 키 정의
## 🔧 상세 변경 사항
### 1. EmployeeService::store() 수정
**변경 전:**
```php
'password' => Hash::make($data['password'] ?? Str::random(16)),
```
**변경 후:**
```php
$password = null;
$createAccount = $data['create_account'] ?? false;
if ($createAccount && ! empty($data['password'])) {
$password = Hash::make($data['password']);
}
// ...
'password' => $password,
```
**이유:** 사원 전용 등록 지원 (로그인 불가)
### 2. EmployeeService::revokeAccount() 추가
```php
public function revokeAccount(int $id): TenantUserProfile
{
// tenant_id 격리 적용
// password=NULL로 설정 (로그인 불가)
// 기존 토큰 무효화
}
```
**이유:** 시스템 계정 해제 기능
## ✅ 테스트 체크리스트
- [x] PHP 문법 검사 통과
- [x] Pint 코드 포맷 통과
- [x] 라우트 등록 확인
- [ ] Swagger 문서 작성 (추후)
- [ ] API 통합 테스트 (추후)
## ⚠️ 배포 시 주의사항
- users.password 컬럼이 nullable인지 확인 필요
- 기존 사원 데이터에 영향 없음
## 🔗 관련 문서
- docs/dev_plans/employee-user-linkage-plan.md

View File

@@ -0,0 +1,95 @@
# 변경 내용 요약
**날짜:** 2025-12-30 14:30
**작업자:** Claude Code
**관련 문서:** docs/dev_plans/react-fcm-push-notification-plan.md
## 📋 변경 개요
React 프로젝트에 FCM 푸시 알림 기능 추가. Capacitor 네이티브 앱(iOS/Android)에서 dev.sam.kr 웹뷰 로드 시 푸시 알림을 지원합니다.
- 포팅 원본: `mng/public/js/fcm.js`
- 백엔드 API 변경 없음 (기존 `/push/*` 엔드포인트 재사용)
## 📁 수정된 파일
### 신규 생성 (4개)
| 파일 | 용량 | 용도 |
|------|------|------|
| `react/src/lib/capacitor/fcm.ts` | 9.1KB | FCM 핵심 로직 (토큰 관리, 알림 처리) |
| `react/src/hooks/useFCM.ts` | 3.3KB | React 훅 (sonner 토스트 연동) |
| `react/src/contexts/FCMProvider.tsx` | 1.8KB | 앱 전역 FCM 초기화 Provider |
| `react/public/sounds/*.wav` | 1.6MB | 알림 사운드 (mng에서 복사) |
### 수정 (2개)
| 파일 | 변경 내용 |
|------|----------|
| `react/src/app/[locale]/(protected)/layout.tsx` | FCMProvider 추가 |
| `react/src/lib/auth/logout.ts` | 로그아웃 시 FCM 토큰 해제 연동 |
### 의존성 추가 (3개)
| 패키지 | 버전 | 용도 |
|--------|------|------|
| @capacitor/core | ^8.0.0 | Capacitor 코어 |
| @capacitor/push-notifications | ^8.0.0 | 푸시 알림 플러그인 |
| @capacitor/app | ^8.0.0 | 앱 상태 감지 |
## 🔧 상세 변경 사항
### 1. FCM 유틸리티 (fcm.ts)
**주요 함수:**
- `initializeFCM()`: FCM 초기화 (권한 요청, 토큰 발급, 리스너 등록)
- `unregisterFCMToken()`: 토큰 해제 (로그아웃 시)
- `isCapacitorNative()`: 네이티브 환경 체크
**특징:**
- Next.js 프록시 패턴 사용 (`/api/proxy/v1/push/*`)
- HttpOnly 쿠키 자동 포함 (credentials: 'include')
- 포그라운드 알림 콜백 지원
### 2. useFCM 훅
**기능:**
- 로그인 상태에서 자동 FCM 초기화
- 포그라운드 알림 → sonner 토스트
- 알림 타입별 스타일 (error, warning, success, info)
### 3. FCMProvider
**위치:** `(protected)/layout.tsx`
- RootProvider 안에서 FCM 초기화
- 인증된 페이지에서만 동작
### 4. 로그아웃 연동
**logout.ts 변경:**
```typescript
// 4. FCM 토큰 해제 (Capacitor 네이티브 앱에서만 실행)
if (isCapacitorNative()) {
await unregisterFCMToken();
console.log('[Logout] FCM token unregistered');
}
```
## ✅ 테스트 체크리스트
- [ ] Capacitor 앱에서 dev.sam.kr 로드 확인
- [ ] 로그인 후 FCM 토큰 등록 확인 (콘솔 로그)
- [ ] 포그라운드 알림 수신 → sonner 토스트 표시
- [ ] 알림 사운드 재생 확인
- [ ] 알림 클릭 → URL 이동 확인
- [ ] 로그아웃 → FCM 토큰 해제 확인
- [ ] 웹 브라우저에서는 FCM 로직 스킵 확인
## ⚠️ 배포 시 주의사항
1. **iOS**: Xcode에서 Push Notification Capability 활성화 필요
2. **Android**: google-services.json 설정 확인
3. **프록시**: `/api/proxy/v1/push/*` 라우트 존재 확인
## 🔗 관련 문서
- [FCM 연동 계획](../plans/react-fcm-push-notification-plan.md)
- [Capacitor Push Notifications](https://capacitorjs.com/docs/apis/push-notifications)
- [mng/public/js/fcm.js](../../mng/public/js/fcm.js) (포팅 원본)

View File

@@ -0,0 +1,136 @@
# 변경 내용 요약
**날짜:** 2026-01-02
**작업자:** Claude Code
**작업명:** 견적 산출 API 개발 - Phase 1.1 API 계산 로직 구현
## 📋 변경 개요
MNG FormulaEvaluatorService의 BOM 기반 견적 계산 로직을 API에서 호출할 수 있는 엔드포인트를 구현했습니다. 완제품 코드와 입력 변수를 받아 품목/단가/금액을 자동 계산하며, 10단계 디버깅 정보를 제공합니다.
## 📁 수정된 파일
### 신규 파일
- `api/app/Http/Requests/Quote/QuoteBomCalculateRequest.php` - BOM 계산용 FormRequest
### 수정된 파일
- `api/app/Services/Quote/QuoteCalculationService.php` - calculateBom 메서드 추가
- `api/app/Http/Controllers/Api/V1/QuoteController.php` - calculateBom 액션 추가
- `api/routes/api.php` - /calculate/bom 라우트 추가
- `api/app/Swagger/v1/QuoteApi.php` - 스키마 및 엔드포인트 문서 추가
## 🔧 상세 변경 사항
### 1. QuoteBomCalculateRequest.php (신규)
**목적:** BOM 기반 견적 계산 요청 검증
**주요 기능:**
- 필수 입력: `finished_goods_code`, `W0`, `H0`
- 선택 입력: `QTY`, `PC`, `GT`, `MP`, `CT`, `WS`, `INSP`, `debug`
- `getInputVariables()`: 서비스용 입력 변수 배열 반환
### 2. QuoteCalculationService.php
**변경 전:** BOM 계산 메서드 없음
**변경 후:**
```php
public function calculateBom(string $finishedGoodsCode, array $inputs, bool $debug = false): array
{
$tenantId = $this->tenantId();
$result = $this->formulaEvaluator->calculateBomWithDebug(
$finishedGoodsCode,
$inputs,
$tenantId
);
if (! $debug && isset($result['debug_steps'])) {
unset($result['debug_steps']);
}
return $result;
}
```
**이유:** API에서 MNG FormulaEvaluatorService의 calculateBomWithDebug를 호출할 수 있도록 브릿지 메서드 추가
### 3. QuoteController.php
**변경 후:**
```php
public function calculateBom(QuoteBomCalculateRequest $request)
{
return ApiResponse::handle(function () use ($request) {
return $this->calculationService->calculateBom(
$request->finished_goods_code,
$request->getInputVariables(),
$request->boolean('debug', false)
);
}, __('message.quote.calculated'));
}
```
**이유:** REST API 엔드포인트 제공
### 4. routes/api.php
**추가된 라우트:**
```php
Route::post('/calculate/bom', [QuoteController::class, 'calculateBom'])->name('v1.quotes.calculate-bom');
```
### 5. QuoteApi.php (Swagger)
**추가된 스키마:**
- `QuoteBomCalculateRequest` - 요청 스키마
- `QuoteBomCalculationResult` - 응답 스키마
**추가된 엔드포인트:**
- `POST /api/v1/quotes/calculate/bom` - BOM 기반 자동산출 (10단계 디버깅)
## ✅ 테스트 체크리스트
- [x] PHP 문법 검사 통과
- [x] Pint 코드 스타일 검사 통과
- [x] 라우트 등록 확인
- [x] 서비스 로직 검증 (tinker)
- [x] Swagger 문서 생성 확인
- [ ] 실제 API 호출 테스트 (Docker 환경 필요)
## ⚠️ 배포 시 주의사항
- 특이사항 없음
- 기존 API에 영향 없음 (신규 엔드포인트 추가)
## 🔗 관련 문서
- 계획 문서: `docs/dev_plans/quote-calculation-api-plan.md`
- FormulaEvaluatorService: `api/app/Services/Quote/FormulaEvaluatorService.php`
## 📊 API 사용 예시
### 요청
```bash
curl -X POST "http://api.sam.kr/api/v1/quotes/calculate/bom" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"finished_goods_code": "SC-1000",
"W0": 3000,
"H0": 2500,
"QTY": 1,
"PC": "SCREEN",
"GT": "wall",
"MP": "single",
"CT": "basic",
"debug": true
}'
```
### 응답
```json
{
"success": true,
"message": "견적이 산출되었습니다.",
"data": {
"success": true,
"finished_goods": {"code": "SC-1000", "name": "전동스크린 1000형"},
"variables": {"W0": 3000, "H0": 2500, "W1": 3100, "H1": 2650, "M": 8.215, "K": 12.5},
"items": [...],
"grouped_items": {...},
"subtotals": {"material": 500000, "labor": 100000, "install": 50000},
"grand_total": 650000,
"debug_steps": [...]
}
}
```

View File

@@ -0,0 +1,81 @@
# 변경 내용 요약
**날짜:** 2026-01-09
**작업자:** Claude Code
**이슈:** Phase 1.2 인수인계보고서관리 Frontend API 연동
## 📋 변경 개요
인수인계보고서관리(Handover Report) Frontend의 actions.ts를 Mock 데이터에서 실제 API 연동으로 변환했습니다.
## 📁 수정된 파일
| 파일 | 변경 내용 |
|------|----------|
| `react/src/components/business/construction/handover-report/actions.ts` | Mock → API 완전 변환 |
| `docs/dev_plans/sub/handover-report-plan.md` | 진행 상태 업데이트 |
## 🔧 상세 변경 사항
### 1. actions.ts 완전 재작성 (499줄)
**제거된 코드:**
- `MOCK_REPORTS` 배열 (7개 목업 데이터)
- `MOCK_REPORT_DETAILS` 객체 (상세 목업 데이터)
- 모든 목업 기반 로직
**추가된 코드:**
#### 헬퍼 함수
```typescript
// API 요청 헬퍼 (쿠키 기반 인증)
async function apiRequest<T>(endpoint, options): Promise<ApiResult<T>>
// 타입 변환 함수들
function transformHandoverReport(apiData): HandoverReport
function transformHandoverReportDetail(apiData): HandoverReportDetail
function transformToApiRequest(data): Record<string, unknown>
```
#### API 연동 함수
| 함수명 | HTTP Method | Endpoint | 용도 |
|--------|-------------|----------|------|
| `getHandoverReportList` | GET | `/construction/handover-reports` | 목록 조회 |
| `getHandoverReportStats` | GET | `/construction/handover-reports/stats` | 통계 조회 |
| `getHandoverReportDetail` | GET | `/construction/handover-reports/{id}` | 상세 조회 |
| `createHandoverReport` | POST | `/construction/handover-reports` | 등록 (신규) |
| `updateHandoverReport` | PUT | `/construction/handover-reports/{id}` | 수정 |
| `deleteHandoverReport` | DELETE | `/construction/handover-reports/{id}` | 삭제 |
| `deleteHandoverReports` | DELETE | `/construction/handover-reports/bulk` | 일괄 삭제 |
#### 타입 변환 매핑
- `snake_case` (API) ↔ `camelCase` (Frontend)
- 중첩 객체 처리: `managers`, `items`, `external_equipment_cost`
- null 안전 처리 및 기본값 설정
### 2. handover-report-plan.md 업데이트
- 상태: ⏳ 대기 → 🔄 진행중
- Frontend 작업 상태 갱신
- 마지막 업데이트 날짜 변경
## ✅ 검증 결과
- [x] TypeScript 타입 검사: 오류 없음
- [x] ESLint 검사: 오류 없음
- [x] 타입 정합성: types.ts와 완전 일치
## ⚠️ 알려진 이슈 (별도 작업 필요)
`HandoverReportListClient.tsx`에 기존 타입 불일치 존재:
- `partnerId` - HandoverReport 타입에 없음
- `contractManagerId` - HandoverReport 타입에 없음
- `constructionPMId` - HandoverReport 타입에 없음
→ 이번 작업 범위 외, 별도 수정 필요
## 🔗 관련 문서
- [상위 계획](../plans/construction-api-integration-plan.md)
- [세부 계획](../plans/sub/handover-report-plan.md)
- [API 백엔드](../../api/app/Services/Construction/HandoverReportService.php)

View File

@@ -0,0 +1,75 @@
# 변경 내용 요약
**날짜:** 2026-01-22
**작업자:** Claude Code
**계획 문서:** docs/dev_plans/card-management-section-plan.md
**Phase:** 1.1 카드 거래 대시보드 API 개발
## 📋 변경 개요
CEO 대시보드 카드/가지급금 관리 섹션(cm1)의 모달 팝업용 카드 거래 대시보드 API 엔드포인트 신규 추가.
기존 summary API를 확장하여 월별 추이, 사용자별 비율, 최근 거래 목록을 포함한 상세 데이터 제공.
## 📁 수정된 파일
- `api/app/Services/CardTransactionService.php` - dashboard() 메서드 및 헬퍼 메서드 추가
- `api/app/Http/Controllers/Api/V1/CardTransactionController.php` - dashboard() 액션 추가
- `api/routes/api.php` - /dashboard 라우트 등록
- `api/app/Swagger/v1/CardTransactionApi.php` - 대시보드 스키마 및 엔드포인트 문서화
## 🔧 상세 변경 사항
### 1. CardTransactionService.php
**신규 메서드:**
- `dashboard()` - 대시보드 전체 데이터 반환
- `getMonthTotal()` - 특정 기간 카드 사용액 합계 (private)
- `getMonthlyTrend()` - 최근 N개월 월별 추이 (private)
- `getUserRatio()` - 사용자별 카드 사용 비율 (private)
- `getRecentTransactions()` - 최근 거래 목록 (private)
**응답 구조:**
```php
[
'summary' => [
'current_month_total' => float,
'previous_month_total' => float,
'change_rate' => float,
'unprocessed_count' => int,
],
'monthly_trend' => [...],
'user_ratio' => [...],
'recent_transactions' => [...],
]
```
### 2. CardTransactionController.php
**신규 액션:**
```php
public function dashboard(): JsonResponse
```
### 3. api/routes/api.php
**신규 라우트:**
```php
Route::get('/dashboard', [CardTransactionController::class, 'dashboard'])
->name('v1.card-transactions.dashboard');
```
### 4. CardTransactionApi.php (Swagger)
**신규 스키마:**
- `CardTransactionDashboard` - 대시보드 응답 전체 구조
**신규 엔드포인트:**
- `GET /api/v1/card-transactions/dashboard`
## ✅ 테스트 체크리스트
- [x] Pint 코드 스타일 검증 통과
- [x] 라우트 등록 확인 (php artisan route:list)
- [x] Swagger 문서 생성 완료
- [ ] API 호출 테스트 (Swagger UI)
- [ ] 프론트엔드 연동 테스트
## ⚠️ 배포 시 주의사항
특이사항 없음 (DB 스키마 변경 없음)
## 🔗 관련 문서
- 계획 문서: `docs/dev_plans/card-management-section-plan.md`
- 기존 API 문서: `api/app/Swagger/v1/CardTransactionApi.php`

View File

@@ -0,0 +1,83 @@
# 변경 내용 요약
**날짜:** 2026-01-22
**작업자:** Claude Code
**계획 문서:** docs/dev_plans/card-management-section-plan.md
**Phase:** 1.2 가지급금 대시보드 API 개발
## 📋 변경 개요
CEO 대시보드 카드/가지급금 관리 섹션(cm2)의 모달 팝업용 가지급금 대시보드 API 엔드포인트 신규 추가.
기존 summary 및 calculateInterest 로직을 활용하여 요약 데이터(미정산 총액, 인정이자, 미정산 건수)와 최근 가지급금 목록을 제공.
## 📁 수정된 파일
- `api/app/Services/LoanService.php` - dashboard() 메서드 추가
- `api/app/Http/Controllers/Api/V1/LoanController.php` - dashboard() 액션 추가
- `api/routes/api.php` - /dashboard 라우트 등록
- `api/app/Swagger/v1/LoanApi.php` - 대시보드 스키마 및 엔드포인트 문서화
## 🔧 상세 변경 사항
### 1. LoanService.php
**신규 메서드:**
- `dashboard()` - 대시보드 전체 데이터 반환
- 기존 `summary()` 호출하여 미정산 총액, 건수 획득
- 기존 `calculateInterest()` 호출하여 인정이자 계산
- 가지급금 목록 (최근 10건, 미정산 우선 정렬)
**응답 구조:**
```php
[
'summary' => [
'total_outstanding' => float, // 미정산 가지급금 총액
'recognized_interest' => float, // 인정이자 (연 4.6%)
'outstanding_count' => int, // 미정산 건수
],
'loans' => [
[
'id' => int,
'loan_date' => string, // Y-m-d
'user_name' => string,
'category' => string, // 카드/계좌
'amount' => float,
'status' => string, // outstanding/settled/partial
'content' => string, // 목적
],
// ... 최대 10건
],
]
```
### 2. LoanController.php
**신규 액션:**
```php
public function dashboard(): JsonResponse
```
### 3. api/routes/api.php
**신규 라우트:**
```php
Route::get('/dashboard', [LoanController::class, 'dashboard'])
->name('v1.loans.dashboard');
```
### 4. LoanApi.php (Swagger)
**신규 스키마:**
- `LoanDashboard` - 대시보드 응답 전체 구조
**신규 엔드포인트:**
- `GET /api/v1/loans/dashboard`
## ✅ 테스트 체크리스트
- [x] Pint 코드 스타일 검증 통과
- [x] 라우트 등록 확인 (php artisan route:list)
- [x] Swagger 문서 생성 완료
- [ ] API 호출 테스트 (Swagger UI)
- [ ] 프론트엔드 연동 테스트
## ⚠️ 배포 시 주의사항
특이사항 없음 (DB 스키마 변경 없음)
## 🔗 관련 문서
- 계획 문서: `docs/dev_plans/card-management-section-plan.md`
- Phase 1.1 변경: `docs/changes/20260122_card_transaction_dashboard_api.md`
- 기존 API 문서: `api/app/Swagger/v1/LoanApi.php`

View File

@@ -0,0 +1,104 @@
# 변경 내용 요약
**날짜:** 2026-01-22
**작업자:** Claude Code
**계획 문서:** docs/dev_plans/card-management-section-plan.md
**Phase:** 1.3 세금 시뮬레이션 API 개발
## 📋 변경 개요
CEO 대시보드 카드/가지급금 관리 섹션(cm2)의 세금 시뮬레이션 API 엔드포인트 신규 추가.
가지급금으로 인한 법인세 및 소득세 추가 부담을 시뮬레이션하여 세금 비교 분석 데이터 제공.
## 📁 수정된 파일
- `api/app/Services/LoanService.php` - taxSimulation() 메서드 추가
- `api/app/Http/Controllers/Api/V1/LoanController.php` - taxSimulation() 액션 추가
- `api/routes/api.php` - /tax-simulation 라우트 등록
- `api/app/Swagger/v1/LoanApi.php` - LoanTaxSimulation 스키마 및 엔드포인트 문서화
## 🔧 상세 변경 사항
### 1. LoanService.php
**신규 메서드:**
- `taxSimulation(int $year)` - 세금 시뮬레이션 데이터 반환
- 기존 `summary()` 호출하여 미정산 가지급금 총액 획득
- 기존 `calculateInterest()` 호출하여 인정이자 계산
- 법인세 비교 (가지급금 유무에 따른 세금 차이)
- 소득세 비교 (대표이사 상여처분 시나리오)
**응답 구조:**
```php
[
'year' => int, // 시뮬레이션 연도
'loan_summary' => [
'total_outstanding' => float, // 가지급금 잔액
'recognized_interest' => float, // 인정이자
'interest_rate' => float, // 이자율 (4.6%)
],
'corporate_tax' => [ // 법인세 비교
'without_loan' => [
'taxable_income' => float,
'tax_amount' => float,
],
'with_loan' => [
'taxable_income' => float, // 인정이자
'tax_amount' => float, // 인정이자 × 19%
],
'difference' => float, // 추가 법인세
'rate_info' => string, // "법인세 19% 적용"
],
'income_tax' => [ // 소득세 비교
'without_loan' => [
'taxable_income' => float,
'tax_rate' => string,
'tax_amount' => float,
],
'with_loan' => [
'taxable_income' => float,
'tax_rate' => string, // "35%"
'tax_amount' => float,
],
'difference' => float,
'breakdown' => [
'income_tax' => float, // 소득세 (35%)
'local_tax' => float, // 지방소득세 (소득세의 10%)
'insurance' => float, // 4대보험 추정 (9%)
],
],
]
```
### 2. LoanController.php
**신규 액션:**
```php
public function taxSimulation(LoanCalculateInterestRequest $request): JsonResponse
```
### 3. api/routes/api.php
**신규 라우트:**
```php
Route::get('/tax-simulation', [LoanController::class, 'taxSimulation'])
->name('v1.loans.tax-simulation');
```
### 4. LoanApi.php (Swagger)
**신규 스키마:**
- `LoanTaxSimulation` - 세금 시뮬레이션 응답 전체 구조
**신규 엔드포인트:**
- `GET /api/v1/loans/tax-simulation?year={year}`
## ✅ 테스트 체크리스트
- [x] Pint 코드 스타일 검증 통과
- [x] 라우트 등록 확인 (php artisan route:list)
- [x] Swagger 문서 생성 완료
- [ ] API 호출 테스트 (Swagger UI)
- [ ] 프론트엔드 연동 테스트
## ⚠️ 배포 시 주의사항
특이사항 없음 (DB 스키마 변경 없음)
## 🔗 관련 문서
- 계획 문서: `docs/dev_plans/card-management-section-plan.md`
- Phase 1.1 변경: `docs/changes/20260122_card_transaction_dashboard_api.md`
- Phase 1.2 변경: `docs/changes/20260122_loan_dashboard_api.md`
- 기존 API 문서: `api/app/Swagger/v1/LoanApi.php`

View File

@@ -0,0 +1,141 @@
# 변경 내용 요약
**날짜:** 2026-01-26
**작업자:** Claude Code
**관련 계획:** docs/dev_plans/quote-management-url-migration-plan.md (Step 1.3, 1.4)
## 📋 변경 개요
V2 견적 상세/수정 테스트 페이지(test/[id])에서 Mock 데이터를 실제 API 연동으로 변경
## 📁 수정된 파일
- `react/src/app/[locale]/(protected)/sales/quote-management/test/[id]/page.tsx` - API 연동 구현
## 🔧 상세 변경 사항
### 1. Import 추가
```typescript
import { getQuoteById, updateQuote } from "@/components/quotes/actions";
import { transformApiToV2, transformV2ToApi } from "@/components/quotes/types";
```
### 2. MOCK_DATA 제거
- 65줄의 하드코딩된 테스트 데이터 제거
### 3. useEffect 수정 (데이터 로드)
**변경 전:**
```typescript
useEffect(() => {
const loadQuote = async () => {
setIsLoading(true);
try {
await new Promise((resolve) => setTimeout(resolve, 500)); // Mock delay
setQuote({ ...MOCK_DATA, id: quoteId });
} catch (error) {
toast.error("견적 정보를 불러오는데 실패했습니다.");
router.push("/sales/quote-management");
} finally {
setIsLoading(false);
}
};
loadQuote();
}, [quoteId, router]);
```
**변경 후:**
```typescript
useEffect(() => {
const loadQuote = async () => {
setIsLoading(true);
try {
const result = await getQuoteById(quoteId);
if (!result.success || !result.data) {
toast.error(result.error || "견적 정보를 불러오는데 실패했습니다.");
router.push("/sales/quote-management");
return;
}
// API 응답을 V2 폼 데이터로 변환
const v2Data = transformApiToV2(result.data);
setQuote(v2Data);
} catch (error) {
toast.error("견적 정보를 불러오는데 실패했습니다.");
router.push("/sales/quote-management");
} finally {
setIsLoading(false);
}
};
if (quoteId) {
loadQuote();
}
}, [quoteId, router]);
```
### 4. handleSave 수정 (수정 저장)
**변경 전:**
```typescript
const handleSave = useCallback(async (data: QuoteFormDataV2, saveType: "temporary" | "final") => {
setIsSaving(true);
try {
console.log("[테스트] 수정 데이터:", data);
await new Promise((resolve) => setTimeout(resolve, 1000)); // Mock delay
toast.success(`[테스트] ${saveType === "temporary" ? "임시" : "최종"} 저장 완료`);
if (saveType === "final") {
router.push(`/sales/quote-management/test/${quoteId}`);
}
} catch (error) {
toast.error("저장 중 오류가 발생했습니다.");
} finally {
setIsSaving(false);
}
}, [router, quoteId]);
```
**변경 후:**
```typescript
const handleSave = useCallback(async (data: QuoteFormDataV2, saveType: "temporary" | "final") => {
setIsSaving(true);
try {
// V2 폼 데이터를 API 형식으로 변환
const updatedData = { ...data, status: saveType };
const apiData = transformV2ToApi(updatedData);
// API 호출
const result = await updateQuote(quoteId, apiData);
if (!result.success) {
toast.error(result.error || "저장 중 오류가 발생했습니다.");
return;
}
toast.success(`${saveType === "temporary" ? "임시" : "최종"} 저장 완료`);
// 저장 후 view 모드로 전환
router.push(`/sales/quote-management/test/${quoteId}`);
} catch (error) {
toast.error("저장 중 오류가 발생했습니다.");
} finally {
setIsSaving(false);
}
}, [router, quoteId]);
```
## ✅ Phase 1 완료
- [x] Step 1.1: V2 데이터 변환 함수 구현
- [x] Step 1.2: test-new 페이지 API 연동 (createQuote)
- [x] Step 1.3: test/[id] 상세 페이지 API 연동 (getQuoteById)
- [x] Step 1.4: test/[id] 수정 API 연동 (updateQuote)
## 🔜 다음 작업 (Phase 2)
- [ ] Step 2.1: test-new → new 경로 변경
- [ ] Step 2.2: test/[id] → [id] 경로 통합
- [ ] Step 2.3: 기존 V1 페이지 처리 결정
## 🔗 관련 문서
- 계획 문서: `docs/dev_plans/quote-management-url-migration-plan.md`
- Step 1.1 변경 내역: `docs/changes/20260126_quote_v2_transform_functions.md`
- Step 1.2 변경 내역: `docs/changes/20260126_quote_v2_test_new_api.md`
- V2 컴포넌트: `react/src/components/quotes/QuoteRegistrationV2.tsx`

View File

@@ -0,0 +1,81 @@
# 변경 내용 요약
**날짜:** 2026-01-26
**작업자:** Claude Code
**관련 계획:** docs/dev_plans/quote-management-url-migration-plan.md (Step 1.2)
## 📋 변경 개요
V2 견적 등록 테스트 페이지(test-new)에서 Mock 저장을 실제 API 연동으로 변경
## 📁 수정된 파일
- `react/src/app/[locale]/(protected)/sales/quote-management/test-new/page.tsx` - API 연동 구현
## 🔧 상세 변경 사항
### 1. Import 추가
```typescript
import { createQuote } from '@/components/quotes/actions';
import { transformV2ToApi } from '@/components/quotes/types';
```
### 2. handleSave 함수 수정
**변경 전:**
```typescript
const handleSave = useCallback(async (data: QuoteFormDataV2, saveType: 'temporary' | 'final') => {
setIsSaving(true);
try {
// TODO: API 연동 시 실제 저장 로직 구현
console.log('[테스트] 저장 데이터:', data);
await new Promise((resolve) => setTimeout(resolve, 1000)); // Mock delay
toast.success(`[테스트] ${saveType === 'temporary' ? '임시' : '최종'} 저장 완료`);
if (saveType === 'final') {
router.push('/sales/quote-management/test/1'); // 하드코딩된 ID
}
} catch (error) {
toast.error('저장 중 오류가 발생했습니다.');
} finally {
setIsSaving(false);
}
}, [router]);
```
**변경 후:**
```typescript
const handleSave = useCallback(async (data: QuoteFormDataV2, saveType: 'temporary' | 'final') => {
setIsSaving(true);
try {
// V2 폼 데이터를 API 형식으로 변환
const updatedData = { ...data, status: saveType };
const apiData = transformV2ToApi(updatedData);
// API 호출
const result = await createQuote(apiData);
if (!result.success) {
toast.error(result.error || '저장 중 오류가 발생했습니다.');
return;
}
toast.success(`${saveType === 'temporary' ? '임시' : '최종'} 저장 완료`);
// 저장 후 상세 페이지로 이동 (실제 생성된 ID 사용)
if (result.data?.id) {
router.push(`/sales/quote-management/test/${result.data.id}`);
}
} catch (error) {
toast.error('저장 중 오류가 발생했습니다.');
} finally {
setIsSaving(false);
}
}, [router]);
```
## ✅ 다음 작업 (Phase 1.3~1.4)
- [ ] test/[id] 상세 페이지 API 연동 (getQuoteById)
- [ ] test/[id] 수정 API 연동 (updateQuote)
## 🔗 관련 문서
- 계획 문서: `docs/dev_plans/quote-management-url-migration-plan.md`
- Step 1.1 변경 내역: `docs/changes/20260126_quote_v2_transform_functions.md`
- V2 컴포넌트: `react/src/components/quotes/QuoteRegistrationV2.tsx`

View File

@@ -0,0 +1,86 @@
# 변경 내용 요약
**날짜:** 2026-01-26
**작업자:** Claude Code
**관련 계획:** docs/dev_plans/quote-management-url-migration-plan.md (Step 1.1)
## 📋 변경 개요
V2 견적 컴포넌트(QuoteRegistrationV2)에서 사용할 데이터 변환 함수 구현
- `transformV2ToApi`: V2 폼 데이터 → API 요청 형식
- `transformApiToV2`: API 응답 → V2 폼 데이터
## 📁 수정된 파일
- `react/src/components/quotes/types.ts` - V2 타입 정의 및 변환 함수 추가
## 🔧 상세 변경 사항
### 1. LocationItem 인터페이스 추가
발주 개소 항목의 데이터 구조 정의
```typescript
export interface LocationItem {
id: string;
floor: string; // 층
code: string; // 부호
openWidth: number; // 가로 (오픈사이즈 W)
openHeight: number; // 세로 (오픈사이즈 H)
productCode: string; // 제품코드
productName: string; // 제품명
quantity: number; // 수량
guideRailType: string; // 가이드레일 설치 유형
motorPower: string; // 모터 전원
controller: string; // 연동제어기
wingSize: number; // 마구리 날개치수
inspectionFee: number; // 검사비
// 계산 결과 (선택)
unitPrice?: number;
totalPrice?: number;
bomResult?: BomCalculationResult;
}
```
### 2. QuoteFormDataV2 인터페이스 추가
V2 컴포넌트용 폼 데이터 구조
```typescript
export interface QuoteFormDataV2 {
id?: string;
registrationDate: string;
writer: string;
clientId: string;
clientName: string;
siteName: string;
manager: string;
contact: string;
dueDate: string;
remarks: string;
status: 'draft' | 'temporary' | 'final';
locations: LocationItem[]; // V1의 items[] 대신 locations[] 사용
}
```
### 3. transformV2ToApi 함수 구현
V2 폼 데이터를 API 요청 형식으로 변환
**핵심 로직:**
1. `locations[]``calculation_inputs.items[]` (폼 복원용)
2. BOM 결과가 있으면 자재 상세를 `items[]`에 포함
3. 없으면 완제품 기준으로 `items[]` 생성
4. status 매핑: `final``finalized`, 나머지 → `draft`
### 4. transformApiToV2 함수 구현
API 응답을 V2 폼 데이터로 변환
**핵심 로직:**
1. `calculation_inputs.items[]``locations[]` 복원
2. 관련 BOM 자재에서 금액 계산
3. status 매핑: `finalized/converted``final`, 나머지 → `draft`
## ✅ 다음 작업 (Phase 1.2~1.4)
- [ ] test-new 페이지 API 연동 (createQuote)
- [ ] test/[id] 상세 페이지 API 연동 (getQuoteById)
- [ ] test/[id] 수정 API 연동 (updateQuote)
## 🔗 관련 문서
- 계획 문서: `docs/dev_plans/quote-management-url-migration-plan.md`
- V2 컴포넌트: `react/src/components/quotes/QuoteRegistrationV2.tsx`

View File

@@ -0,0 +1,76 @@
# 변경 내용 요약
**날짜:** 2026-01-26
**작업자:** Claude Code
**관련 계획:** docs/dev_plans/quote-management-url-migration-plan.md (Phase 1 버그 수정)
## 📋 변경 개요
V2 견적 등록 컴포넌트에서 작성자 필드가 "드미트리"로 하드코딩된 버그 수정
## 📁 수정된 파일
- `react/src/components/quotes/QuoteRegistrationV2.tsx` - 로그인 사용자 정보 연동
## 🔧 상세 변경 사항
### 1. Import 추가
```typescript
import { useAuth } from "@/contexts/AuthContext";
```
### 2. INITIAL_FORM_DATA 수정
**변경 전:**
```typescript
const INITIAL_FORM_DATA: QuoteFormDataV2 = {
registrationDate: new Date().toISOString().split("T")[0],
writer: "드미트리", // TODO: 로그인 사용자 정보
// ...
};
```
**변경 후:**
```typescript
const INITIAL_FORM_DATA: QuoteFormDataV2 = {
registrationDate: new Date().toISOString().split("T")[0],
writer: "", // useAuth()에서 currentUser.name으로 설정됨
// ...
};
```
### 3. useAuth 훅 사용
```typescript
export function QuoteRegistrationV2({ ... }) {
// 인증 정보
const { currentUser } = useAuth();
// 상태 초기화 시 currentUser.name 사용
const [formData, setFormData] = useState<QuoteFormDataV2>(() => {
const data = initialData || INITIAL_FORM_DATA;
// create 모드에서 writer가 비어있으면 현재 사용자명으로 설정
if (mode === "create" && !data.writer && currentUser?.name) {
return { ...data, writer: currentUser.name };
}
return data;
});
// ...
}
```
### 4. useEffect로 지연 로딩 처리
```typescript
// 작성자 자동 설정 (create 모드에서 currentUser 로드 시)
useEffect(() => {
if (mode === "create" && !formData.writer && currentUser?.name) {
setFormData((prev) => ({ ...prev, writer: currentUser.name }));
}
}, [mode, currentUser?.name, formData.writer]);
```
## ✅ 동작 방식
1. **초기 렌더링**: useState 초기화 시 currentUser.name 사용
2. **지연 로딩**: currentUser가 나중에 로드되면 useEffect로 writer 업데이트
3. **edit/view 모드**: initialData의 writer 값 유지 (덮어쓰지 않음)
## 🔗 관련 문서
- 계획 문서: `docs/dev_plans/quote-management-url-migration-plan.md`
- AuthContext: `react/src/contexts/AuthContext.tsx`

View File

@@ -0,0 +1,106 @@
# 변경 내용 요약
**날짜:** 2026-01-28
**작업자:** Claude Code
**작업명:** 문서 관리 시스템 Phase 1.1 - 마이그레이션 파일 생성
## 📋 변경 개요
문서 관리 시스템의 데이터베이스 스키마를 구현했습니다.
- 4개 테이블 신규 생성 (documents, document_approvals, document_data, document_attachments)
- SAM API 개발 규칙 준수 (tenant_id, 감사 컬럼, softDeletes, comment)
## 📁 추가된 파일
| 파일 | 설명 |
|------|------|
| `api/database/migrations/2026_01_28_200000_create_documents_table.php` | 문서 관리 테이블 마이그레이션 |
## 🔧 상세 변경 사항
### 1. documents 테이블 (16 컬럼)
실제 문서 정보를 저장하는 메인 테이블
| 컬럼 | 타입 | 설명 |
|------|------|------|
| id | bigint | PK |
| tenant_id | bigint | 테넌트 ID (FK) |
| template_id | bigint | 템플릿 ID (FK → document_templates) |
| document_no | varchar(50) | 문서번호 |
| title | varchar(255) | 문서 제목 |
| status | enum | DRAFT/PENDING/APPROVED/REJECTED/CANCELLED |
| linkable_type | varchar(100) | 연결 모델 타입 (다형성) |
| linkable_id | bigint | 연결 모델 ID |
| submitted_at | timestamp | 결재 요청일 |
| completed_at | timestamp | 결재 완료일 |
| created_by | bigint | 생성자 ID |
| updated_by | bigint | 수정자 ID |
| deleted_by | bigint | 삭제자 ID |
| created_at | timestamp | 생성일 |
| updated_at | timestamp | 수정일 |
| deleted_at | timestamp | 삭제일 (Soft Delete) |
### 2. document_approvals 테이블 (12 컬럼)
문서 결재 정보 저장
| 컬럼 | 타입 | 설명 |
|------|------|------|
| id | bigint | PK |
| document_id | bigint | 문서 ID (FK) |
| user_id | bigint | 결재자 ID (FK) |
| step | tinyint | 결재 순서 |
| role | varchar(50) | 역할 (작성/검토/승인) |
| status | enum | PENDING/APPROVED/REJECTED |
| comment | text | 결재 의견 |
| acted_at | timestamp | 결재 처리일 |
| created_by | bigint | 생성자 ID |
| updated_by | bigint | 수정자 ID |
| created_at | timestamp | 생성일 |
| updated_at | timestamp | 수정일 |
### 3. document_data 테이블 (9 컬럼)
문서 데이터 저장 (EAV 패턴)
| 컬럼 | 타입 | 설명 |
|------|------|------|
| id | bigint | PK |
| document_id | bigint | 문서 ID (FK) |
| section_id | bigint | 섹션 ID |
| column_id | bigint | 컬럼 ID |
| row_index | smallint | 행 인덱스 |
| field_key | varchar(100) | 필드 키 |
| field_value | text | 필드 값 |
| created_at | timestamp | 생성일 |
| updated_at | timestamp | 수정일 |
### 4. document_attachments 테이블 (8 컬럼)
문서 첨부파일 연결
| 컬럼 | 타입 | 설명 |
|------|------|------|
| id | bigint | PK |
| document_id | bigint | 문서 ID (FK) |
| file_id | bigint | 파일 ID (FK → files) |
| attachment_type | varchar(50) | 첨부 유형 |
| description | varchar(255) | 설명 |
| created_by | bigint | 생성자 ID |
| created_at | timestamp | 생성일 |
| updated_at | timestamp | 수정일 |
## ✅ 검증 결과
| 시나리오 | 예상 결과 | 실제 결과 | 상태 |
|----------|----------|----------|:----:|
| 마이그레이션 실행 | 4개 테이블 생성 | 4개 테이블 생성 | ✅ |
| PHP 문법 검사 | 오류 없음 | 오류 없음 | ✅ |
| Pint 포맷팅 | 통과 | 1개 스타일 수정 후 통과 | ✅ |
| SAM 규칙 준수 | 모든 규칙 적용 | 모든 규칙 적용 | ✅ |
## 🔗 관련 문서
- 계획 문서: `docs/dev_plans/document-management-system-plan.md`
- 다음 작업: Phase 1.2 - 모델 생성 (Document, DocumentApproval, DocumentData, DocumentAttachment)
## ⚠️ 배포 시 주의사항
특이사항 없음 (마이그레이션은 이미 실행됨)

View File

@@ -0,0 +1,59 @@
# 변경 내용 요약
**날짜:** 2026-01-28
**작업자:** Claude
**Phase:** 1.5 - Service 생성
## 📋 변경 개요
문서 관리 시스템의 DocumentService 클래스를 생성하여 문서 CRUD 및 결재 워크플로우 비즈니스 로직을 구현했습니다.
## 📁 수정된 파일
- `app/Services/DocumentService.php` (신규) - 문서 관리 서비스
## 🔧 상세 변경 사항
### 1. DocumentService 구현
**주요 기능:**
#### 문서 목록/상세
- `list(array $params)` - 페이징, 필터링, 검색 지원
- `show(int $id)` - 상세 조회 (템플릿, 결재선, 데이터, 첨부파일 포함)
#### 문서 생성/수정/삭제
- `create(array $data)` - 문서 생성 (결재선, 데이터, 첨부파일 포함)
- `update(int $id, array $data)` - 문서 수정 (반려 상태 → DRAFT 전환)
- `destroy(int $id)` - 문서 삭제 (DRAFT 상태만 가능)
#### 결재 처리
- `submit(int $id)` - 결재 요청 (DRAFT → PENDING)
- `approve(int $id, ?string $comment)` - 결재 승인
- `reject(int $id, string $comment)` - 결재 반려
- `cancel(int $id)` - 결재 취소/회수 (작성자만)
#### 헬퍼 메서드
- `generateDocumentNo()` - 문서번호 생성 (DOC-YYYYMMDD-NNNN)
- `createApprovals()` - 결재선 생성
- `saveDocumentData()` - 문서 데이터 저장 (EAV)
- `attachFiles()` - 첨부파일 연결
**구현 특징:**
- Service-First 아키텍처 준수
- Multi-tenancy 지원 (tenantId() 필터링)
- DB 트랜잭션 처리
- 순차 결재 로직 (이전 단계 완료 확인)
- i18n 에러 메시지 키 사용
## ✅ 테스트 체크리스트
- [x] PHP 문법 검사 통과
- [x] Service 클래스 로드 성공
- [x] Pint 포맷팅 완료
- [ ] API 통합 테스트 (Phase 1.6 이후)
## ⚠️ 배포 시 주의사항
특이사항 없음
## 🔗 관련 문서
- Phase 1.1: 마이그레이션 (`20260128_document_management_phase1_1.md`)
- Phase 1.2: 모델 생성 (별도 문서 없음, 커밋 참조)
- 계획 문서: `docs/dev_plans/document-management-system-plan.md`

View File

@@ -0,0 +1,69 @@
# 변경 내용 요약 - 경동기업 품목/단가 마이그레이션 Phase 1.0
**날짜:** 2026-01-28
**작업자:** Claude Code
**관련 문서:** docs/dev_plans/kd-items-migration-plan.md
## 📋 변경 개요
경동기업(tenant_id=287) 레거시 DB(chandj)에서 SAM DB(samdb)로 품목/단가 데이터 마이그레이션을 위한 Seeder 생성
## 📁 추가된 파일
| 파일 | 설명 |
|------|------|
| `api/database/seeders/Kyungdong/KyungdongItemSeeder.php` | 경동기업 품목/단가 마이그레이션 Seeder |
## 🔧 상세 변경 사항
### 1. KyungdongItemSeeder.php 생성
**기능:**
- chandj.KDunitprice (601건) → samdb.items 마이그레이션
- items 기반 → samdb.prices 마이그레이션
- 기존 tenant_id=287 데이터 삭제 후 재생성
**주요 로직:**
```php
// item_div → item_type 매핑
'[제품]' => 'FG' // 완제품
'[상품]' => 'FG' // 완제품
'[반제품]' => 'PT' // 부품
'[부재료]' => 'SM' // 부자재
'[원재료]' => 'RM' // 원자재
'[무형상품]' => 'CS' // 소모품
```
**발견된 이슈 및 해결:**
- 레거시 DB의 `is_deleted` 컬럼이 `0`이 아닌 `NULL`로 활성 상태 표시
- `where('is_deleted', 0)``whereNull('is_deleted')` 수정
## ✅ 실행 방법
```bash
# Docker 컨테이너 내부에서 실행
docker exec sam-api-1 php artisan db:seed --class="Database\\Seeders\\Kyungdong\\KyungdongItemSeeder"
# 또는 Docker 환경에서 직접 실행
cd /var/www/html && php artisan db:seed --class="Database\\Seeders\\Kyungdong\\KyungdongItemSeeder"
```
## 📊 예상 결과
| 테이블 | 작업 | 예상 건수 |
|--------|------|----------|
| items | DELETE (기존) | ~10,472건 |
| items | INSERT (신규) | ~601건 |
| prices | DELETE (기존) | ~86건 |
| prices | INSERT (신규) | ~601건 |
## ⚠️ 주의사항
1. **기존 데이터 삭제됨**: tenant_id=287의 모든 items, prices 삭제
2. **실행 전 백업 권장**: 중요 데이터는 백업 후 실행
3. **Docker 환경 필수**: chandj DB 연결은 Docker 내부에서만 가능 (sam-mysql-1 호스트명)
## 🔗 관련 문서
- [kd-items-migration-plan.md](../plans/kd-items-migration-plan.md) - 전체 마이그레이션 계획
- [kd-orders-migration-plan.md](../plans/kd-orders-migration-plan.md) - 입고/재고/주문 마이그레이션 (연관)

View File

@@ -0,0 +1,105 @@
# 변경 내용 요약 - 경동기업 품목/단가 마이그레이션 Phase 3
**날짜:** 2026-01-28
**작업자:** Claude Code
**관련 문서:** docs/dev_plans/kd-items-migration-plan.md
## 📋 변경 개요
경동기업(tenant_id=287) 레거시 DB(chandj)의 price_* 테이블에서 누락된 품목을 SAM DB(samdb)로 추가 마이그레이션
## 📁 수정된 파일
| 파일 | 설명 |
|------|------|
| `api/database/seeders/Kyungdong/KyungdongItemSeeder.php` | Phase 3.1, 3.2 메서드 추가 |
| `docs/dev_plans/kd-items-migration-plan.md` | Phase 3 완료 상태 업데이트 |
## 🔧 상세 변경 사항
### 1. KyungdongItemSeeder.php 확장
**Phase 3.1: migratePriceMotor()**
- price_motor JSON에서 KDunitprice에 없는 품목 추가
- 220V/380V 모터는 스킵 (KDunitprice에 "KD모터*Kg단상/삼상"으로 존재)
- 추가 항목 (13건):
- PM-020~PM-032: 제어기 (6P~18P, 20회선~100회선)
- PM-033~PM-035: 방화/방범 콘트롤박스, 스위치
**Phase 3.2: migratePriceRawMaterials()**
- price_raw_materials JSON에서 KDunitprice에 없는 품목 추가
- 추가 항목 (4건):
- RM-007: 신설비상문 (3x2 300*200)
- RM-008~RM-009: 제연커튼 (연기차단원단, 불투명)
- RM-010~RM-011: 화이바원단, 와이어원단
**중복 확인 로직:**
```php
// 기존 품목명과 비교하여 중복 제외
$existingItemNames = DB::table('items')
->where('tenant_id', $tenantId)
->pluck('name')
->map(fn($n) => mb_strtolower($n))
->toArray();
// 품목명이 이미 존재하면 스킵
if (in_array(mb_strtolower($itemName), $existingItemNames)) {
continue;
}
```
### 2. Phase 3 분석 결과
**price_* 테이블 분석 (10개):**
| 테이블 | 역할 | 처리 |
|--------|------|------|
| price_motor | 모터/제어기 단가 | ✅ 누락 품목 추가 (13건) |
| price_raw_materials | 원자재 단가 | ✅ 누락 품목 추가 (4건) |
| price_shaft | 감기샤프트 계산 참조 | ⏭️ 스킵 (품목 마스터 아님) |
| price_pipe | 파이프 계산 참조 | ⏭️ 스킵 (품목 마스터 아님) |
| price_angle | 앵글 계산 참조 | ⏭️ 스킵 (품목 마스터 아님) |
| price_bend | 절곡 계산 참조 | ⏭️ 스킵 (품목 마스터 아님) |
| price_pole | 폴 계산 참조 | ⏭️ 스킵 (품목 마스터 아님) |
| price_screenplate | 스크린플레이트 계산 참조 | ⏭️ 스킵 (품목 마스터 아님) |
| price_smokeban | 연기차단 계산 참조 | ⏭️ 스킵 (품목 마스터 아님) |
| price_etc | 기타 | ⏭️ 스킵 (비활성) |
## ✅ 실행 방법
```bash
# Docker 컨테이너 내부에서 실행
docker exec sam-api-1 php artisan db:seed --class="Database\\Seeders\\Kyungdong\\KyungdongItemSeeder"
# 또는 Docker 환경에서 직접 실행
cd /var/www/html && php artisan db:seed --class="Database\\Seeders\\Kyungdong\\KyungdongItemSeeder"
```
## 📊 최종 결과
| 테이블 | Phase 1~2 | Phase 3 추가 | 최종 |
|--------|-----------|-------------|------|
| items | 634건 | +17건 | **651건** |
| prices | 634건 | +17건 | **651건** |
| BOM (items.bom) | 18건 | 0건 | **18건** |
**item_type별 분포:**
| item_type | 건수 |
|-----------|------|
| FG (완제품) | 100건 |
| PT (부품) | 110건 |
| SM (부자재) | 256건 |
| RM (원자재) | 108건 |
| CS (소모품) | 77건 |
## ⚠️ 주의사항
1. **기존 데이터 유지**: Phase 3는 기존 데이터를 삭제하지 않고 누락 품목만 추가
2. **Seeder 재실행 시**: 전체 Seeder는 idempotent (삭제 후 재생성) 방식
3. **코드 형식**: PM-XXX (price_motor), RM-XXX (price_raw_materials)
## 🔗 관련 문서
- [kd-items-migration-plan.md](../plans/kd-items-migration-plan.md) - 전체 마이그레이션 계획
- [20260128_kd_items_migration_phase1.md](./20260128_kd_items_migration_phase1.md) - Phase 1 변경 내용
- [kd-orders-migration-plan.md](../plans/kd-orders-migration-plan.md) - 입고/재고/주문 마이그레이션 (연관)

View File

@@ -0,0 +1,106 @@
# 변경 내용 요약
**날짜:** 2026-02-05
**작업자:** Claude Code
**관련 계획:** docs/dev_plans/incoming-inspection-templates-plan.md
## 📋 변경 개요
5130 레거시 수입검사 양식 전환 작업 - Phase 1 완료
- 13개 수입검사 양식 생성 (id:18-30)
- 테이블 컬럼 구조 추가 (미리보기 기능 정상화)
- MNG UI 테스트 완료
## 📁 수정된 파일/데이터
### 데이터베이스 변경
- `document_templates` - 13건 INSERT (id:18-30)
- `document_template_section_fields` - 8건씩 INSERT (template_id:18-30)
- `document_template_columns` - 84건 INSERT (7개 컬럼 × 12개 템플릿 19-30)
### 문서 변경
- `docs/dev_plans/incoming-inspection-templates-plan.md` - 진행 상태 업데이트
## 🔧 상세 변경 사항
### 1. SUS 절곡판 수입검사 양식 생성 (id:19)
**생성된 데이터:**
```json
{
"id": 19,
"tenant_id": 287,
"name": "SUS 절곡판 수입검사",
"category": "수입검사",
"title": "수입검사 성적서",
"company_name": "경동산업",
"footer_remark_label": "비고 / 부적합 내용",
"footer_judgement_label": "종합판정",
"footer_judgement_options": ["적합", "부적합"],
"is_active": 1,
"linked_item_ids": [14172, 14173, 14174, 14175, 14176, 14177, 14178, 14179, 14180, 14181, 14182]
}
```
### 2. 필드 구조 (EGI 양식에서 복사)
| sort_order | field_key | label | field_type |
|------------|-----------|-------|------------|
| 0 | category | 구분 | text |
| 1 | item | 검사항목 | text |
| 2 | standard | 검사 기준/범위 | text_with_criteria |
| 3 | tolerance | 공차/범위 | json_tolerance |
| 4 | method | 검사방식 | select_api |
| 5 | measurement_type | 측정유형 | select |
| 6 | frequency | 검사주기 | composite_frequency |
| 7 | regulation | 관련규정 | text |
### 3. 연결된 품목 (11건)
| ID | 품목명 |
|----|--------|
| 14172 | sus1.2*1219*2438 |
| 14173 | sus1.2*1219*3000 |
| 14174 | sus1.2t*1219*4000 |
| 14175 | sus1.5*1219*2438 |
| 14176 | sus1.5*1219*3000 |
| 14177 | sus1.5*1219*4000 |
| 14178 | sus1.2*1219*c |
| 14179 | sus1.5*1219*2500 |
| 14180 | sus1.2*1219*4230 |
| 14181 | sus1.2*1219*3000 P/L |
| 14182 | sus1.2*1219*2500 |
### 4. 테이블 컬럼 구조 추가 (템플릿 19-30)
미리보기 기능이 동작하려면 `document_template_columns` 테이블에 컬럼 정의가 필요합니다.
템플릿 18(EGI)의 컬럼 구조를 복사하여 12개 템플릿(19-30)에 적용했습니다.
| sort_order | label | column_type | width |
|------------|-------|-------------|-------|
| 0 | NO | text | 50px |
| 1 | 검사항목 | text | 120px |
| 2 | 검사기준 | text | 150px |
| 3 | 검사방식 | text | 100px |
| 4 | 검사주기 | text | 100px |
| 5 | 측정치 | complex | 240px |
| 6 | 판정 (적/부) | select | 80px |
**측정치 컬럼 sub_labels:** `["n1", "n2", "n3"]`
## ✅ 테스트 체크리스트
- [x] 양식 생성 확인 (id:18-30, 총 13개)
- [x] 필드 8개 복사 확인 (각 템플릿별)
- [x] 품목 연결 확인 (EGI, SUS 등)
- [x] MNG UI 양식 편집 테스트 ✅
- [x] **MNG UI 미리보기 테스트 ✅** (컬럼 추가 후 정상 동작)
- [ ] React resolve API 테스트
## ⚠️ 후속 작업
1. ~~EGI 양식(id:18)에 품목 연결 필요~~ → 완료
2. ~~Phase 1 나머지 양식 생성~~ → 완료 (13개 양식)
3. MNG UI에서 검사항목 데이터 입력 필요
4. React resolve API 테스트
## 🔗 관련 문서
- 계획 문서: `docs/dev_plans/incoming-inspection-templates-plan.md`
- 레거시 참조: `5130/instock/i_SUSplate.php`

View File

@@ -0,0 +1,212 @@
# BOM 산출 아이템 ↔ Items Master 매핑 분석
> **분석일**: 2026-02-05
> **대상**: 경동기업 (tenant_id: 287)
> **범위**: BOM 산출 로직(KyungdongFormulaHandler) 전체 아이템 → SAM Items Master + 5130(chandj) DB
---
## 1. 요약
| 항목 | 수치 |
|------|------|
| 5130(KDunitprice) 총 아이템 | 601개 |
| SAM Items Master 총 아이템 | 780개 |
| 5130 → SAM 코드 매칭률 | **100% (601/601)** |
| SAM 견적 전용 아이템 (EST/BD/PT/PM) | 157개 |
| BOM 산출 생성 아이템 종류 | 22종 |
| BOM → SAM 매핑 완료 | 17종 |
| BOM → SAM 미매핑 | **5종** |
### 핵심 결론
- 5130 → SAM 마이그레이션은 **100% 완료** (코드 기준 전수 매칭)
- BOM 산출 로직에서 생성하는 22종 아이템 중 **5종이 SAM items master에 미등록**
- 미등록 5종: 케이스 마구리, L바, 무게평철12T, 검사비, 주자재(스크린/슬랫)
- SAM에는 이미 견적 전용 코드 체계(EST-*, BD-*, PT-*, PM-*)가 구축되어 있음
---
## 2. 5130(chandj) DB 구조
### 2.1 주요 테이블
| 테이블 | 건수 | 용도 |
|--------|------|------|
| **KDunitprice** | 601건 | 품목 단가 마스터 (SAM의 items 테이블에 해당) |
| **item_list** | 9건 | 견적 품목 분류 (스크린, 셔터박스, 연기장벽 등) |
| **parts** | 37건 | 부품 (가이드레일, 하단마감재 등 - 모델별) |
| **BDparts** | - | 절곡품 부품 |
| **price_angle** | 2건 | 앵글 단가표 (JSON 배열) |
| **price_bend** | - | 절곡 단가표 |
| **price_motor** | - | 모터 단가표 |
| **price_pipe** | - | 파이프 단가표 |
| **price_pole** | - | 환봉 단가표 |
| **price_raw_materials** | - | 원자재 단가표 |
| **price_screenplate** | - | 스크린판 단가표 |
| **price_shaft** | - | 샤프트 단가표 |
| **price_smokeban** | - | 연기차단재 단가표 |
| **price_etc** | - | 기타 단가표 |
### 2.2 KDunitprice 코드 체계
| 코드 접두사 | 범위 | 분류 | 비고 |
|------------|------|------|------|
| 00xxx | 00002~00046 | 부품/부재료 | 하장바, 가이드레일, 평철 등 |
| 20xxx | 20000~20011 | SUS 원재료 | SUS 1.2T, 1.5T 판재 |
| 30xxx | 30000~30006 | EGI 원재료 + 운송 | EGI 판재, 운송료 |
| 50xxx | 50000~50004 | 서비스 | 수리비, 제품개발, LED, 사용료 |
| 70xxx | 70001~70102 | KD 모터/브라켓/제어기 | 경동 자체 생산품 |
| 80xxx | 80006~80202 | 기타 부품/자재 | 절곡가공, 가스켓, 점검구 등 |
| 81xxx | 81000 | 기타 | 텐텐지롤 |
| 90xxx | 90100~90727 | 반제품/부자재 | 커넥터, 환봉, 링, 복주머니 등 |
| Hxxxx | H0001~H0020 | 철골자재 | 각파이프, 앵글 |
| K1xxx~K2xxx | K1011~K2029 | 작업복/안전화 | (비생산 품목) |
| Mxxxx | M0001~M0059 | 외주 모터/브라켓 | IS, HY, KST 등 |
| MCCD | MCCD0001 | 방범연동기 | |
| Nxxxx | N71100~N76101 | 신형 모터/브라켓/제어기 | N시리즈 |
| Rxxxx | R0001~R0008 | 샤우드 | BS/KS 샤우드 |
| Sxxxx | S0000~S0039 | 스크린/슬랫/셔터 | 주자재류 |
| Wxxxx | W0001 | 와이어 | |
---
## 3. SAM 견적 전용 코드 체계
SAM에는 5130에 없는 **견적 전용 아이템** 157개가 추가 등록되어 있음.
### 3.1 코드 체계별 분류
| 접두사 | 건수 | 용도 | 예시 |
|--------|------|------|------|
| **BD-** | 58개 | 절곡품 (모델/규격별) | BD-케이스-500*350, BD-가이드레일-KWE01-SUS-120*70 |
| **EST-** | 71개 | 견적 산출 전용 아이템 | EST-MOTOR-220V-300K, EST-SHAFT-4-6, EST-CTRL-매립형 |
| **PT-** | 15개 | 품목 템플릿 (규격 미포함) | PT-케이스, PT-가이드레일, PT-L-BAR |
| **PM-** | 13개 | 제어기 부품 매핑 | PM-020(제어기 노출형), PM-023(콘트롤박스) |
### 3.2 BD- (절곡품) 상세
모델별 규격이 정해진 절곡품:
- **케이스**: 10종 (500*350 ~ 780*650)
- **마구리**: 10종 (505*355 ~ 785*685)
- **가이드레일**: 20종 (모델별 SUS/EGI, 2가지 규격)
- **하단마감재**: 10종 (모델별 SUS/EGI)
- **L-BAR**: 5종 (모델별)
- **연기차단재**: 2종 (케이스용, 가이드레일용)
- **보강평철**: 1종
### 3.3 EST- (견적 전용) 상세
- **EST-MOTOR-**: 19종 (220V/380V, 용량별)
- **EST-CTRL-**: 17종 (제어기/방범/방화 부품)
- **EST-SHAFT-**: 18종 (3~12인치, 길이별)
- **EST-PIPE-**: 3종 (각파이프 두께/길이별)
- **EST-ANGLE-**: 8종 (메인앵글, 모터받침 앵글)
- **EST-RAW-**: 4종 (스크린원단, 슬랫)
- **EST-SMOKE-**: 2종 (연기차단재)
---
## 4. BOM 산출 아이템 매핑 상태
### 4.1 calculateSteelItems (절곡품) - 10종
| BOM 아이템명 | SAM 등록 | SAM 코드 | 5130 등록 | 매핑 상태 |
|-------------|----------|----------|-----------|----------|
| 케이스 | O | BD-케이스-{규격}, PT-케이스 | X (5130 미등록) | **SAM만 등록** |
| 케이스용 연기차단재 | O | BD-케이스용 연기차단재, EST-SMOKE-케이스용 | X | **SAM만 등록** |
| 케이스 마구리 | **X** | - | X | **미등록** |
| 가이드레일 | O | BD-가이드레일-{모델}-{재질}-{규격}, PT-가이드레일 | O (00015) | 매핑 완료 |
| 레일용 연기차단재 | O | BD-가이드레일용 연기차단재, EST-SMOKE-레일용 | X | **SAM만 등록** |
| 하장바 | O | 00035, 00036 (5130 동일코드) | O (00035, 00036) | 매핑 완료 |
| L바 | **X** | - | X | **미등록** |
| 보강평철 | O | BD-보강평철-50, PT-보강평철 | X | **SAM만 등록** |
| 무게평철12T | **X** | - | O (00021 평철12T) | **SAM 미등록, 5130에는 유사품 존재** |
| 환봉 | O | 90201~90205 (5130 동일코드) | O (90201~90205) | 매핑 완료 |
### 4.2 calculatePartItems (부자재) - 5종
| BOM 아이템명 | SAM 등록 | SAM 코드 | 5130 등록 | 매핑 상태 |
|-------------|----------|----------|-----------|----------|
| 감기샤프트 {인치}인치 | O | EST-SHAFT-{인치}-{길이} (18종) | X (5130 미등록) | **SAM만 등록** |
| 각파이프 | O | EST-PIPE-{두께}-{길이} (3종) | O (H0001~H0020) | 매핑 완료 |
| 모터 받침용 앵글 | △ | EST-ANGLE-BRACKET-{타입} (4종) | X | **EST코드로 등록됨** |
| 앵글 {타입} | O | EST-ANGLE-MAIN-{타입} (4종) | O (H0003, H0004) | 매핑 완료 |
| 조인트바 | O | 800361, EST-RAW-슬랫-조인트바 | O (800361) | 매핑 완료 |
> **참고**: "모터 받침용 앵글"은 BOM에서 정확히 이 이름으로 검색하면 미등록이지만, EST-ANGLE-BRACKET-{타입} 4종이 이미 등록되어 있어 매핑 가능.
### 4.3 calculateDynamicItems (동적항목) - 7종
| BOM 아이템명 | BOM item_code | SAM 등록 | SAM 코드 | 5130 등록 | 매핑 상태 |
|-------------|------------|----------|----------|-----------|----------|
| 검사비 | KD-INSPECTION | **X** | - | X | **미등록** |
| 주자재(스크린) | KD-SCREEN | △ | EST-RAW-스크린-{타입} 3종 | O (S0001 등) | **EST코드로 등록됨** |
| 주자재(슬랫) | KD-SLAT | △ | EST-RAW-슬랫-{타입} 2종 | O (S0004, S0005) | **EST코드로 등록됨** |
| 모터 {용량} | KD-MOTOR-{용량} | O | EST-MOTOR-{전압}-{용량} (19종) | O (70001~70017 등) | 매핑 완료 |
| 제어기 {타입} | KD-CTRL-{타입} | O | EST-CTRL-{타입} (17종) | O (70026, 70027 등) | 매핑 완료 |
| 뒷박스 | KD-CTRL-BACKBOX | O | EST-CTRL-뒷박스, 80140 | O (80140) | 매핑 완료 |
---
## 5. 미매핑 아이템 상세
### 5.1 완전 미등록 (SAM + 5130 모두 없음)
| 아이템 | 생성 메서드 | SAM 유사 코드 | 해결 방안 |
|--------|----------|-------------|----------|
| **케이스 마구리** | calculateSteelItems | BD-마구리-{규격} 10종 | BOM에서 BD-마구리-{규격} 매핑 필요 |
| **L바** | calculateSteelItems | BD-L-BAR-{모델}-{규격} 5종 | BOM에서 BD-L-BAR-{모델}-{규격} 매핑 필요 |
| **검사비** | calculateDynamicItems | (없음) | items master에 EST-INSPECTION 코드로 신규 등록 필요 |
### 5.2 SAM 미등록이나 유사품 존재
| 아이템 | 5130 유사품 | SAM 유사품 | 해결 방안 |
|--------|-----------|-----------|----------|
| **무게평철12T** | 00021 (평철12T, 2000mm, 13,500원) | SAM ID:14147 (00021, 평철12T) | 5130 코드 00021로 이미 SAM에 존재. BOM에서 매핑만 추가 |
### 5.3 KD-* → EST-* 코드 변환 필요
BOM에서 사용하는 KD-* 코드는 SAM items master에 미등록. EST-* 코드로 변환 매핑 필요.
| BOM item_code | SAM 대응 코드 | 변환 규칙 |
|--------------|-------------|----------|
| KD-INSPECTION | (미등록) | 신규 등록 필요 |
| KD-SCREEN | EST-RAW-스크린-{타입} | 타입(실리카/화이바/와이어)에 따라 분기 |
| KD-SLAT | EST-RAW-슬랫-{타입} | 타입(방범/방화)에 따라 분기 |
| KD-MOTOR-{용량} | EST-MOTOR-{전압}-{용량} | 전압(220V/380V) + 용량으로 분기 |
| KD-CTRL-{타입} | EST-CTRL-{타입} | 타입명 일치 |
| KD-CTRL-BACKBOX | EST-CTRL-뒷박스 | 직접 매핑 |
---
## 6. 5130 price_* 단가 참조 테이블
BOM 산출 로직에서 단가를 가져오는 5130 테이블:
| 테이블 | 구조 | 용도 |
|--------|------|------|
| price_angle | JSON 배열 (itemList 컬럼) | 앵글 규격별 단가 |
| price_bend | JSON 배열 | 절곡 가공 단가 |
| price_motor | JSON 배열 | 모터 용량/전압별 단가 |
| price_pipe | JSON 배열 | 파이프 규격별 단가 |
| price_pole | JSON 배열 | 환봉 규격별 단가 |
| price_raw_materials | JSON 배열 | 원자재(스크린, 슬랫) 단가 |
| price_screenplate | JSON 배열 | 스크린 판재 단가 |
| price_shaft | JSON 배열 | 샤프트 인치/길이별 단가 |
| price_smokeban | JSON 배열 | 연기차단재 단가 |
| price_etc | JSON 배열 | 기타 항목 단가 |
> 이 테이블들은 SAM의 `chandj` DB 연결을 통해 직접 참조하며, BOM 산출 시 실시간으로 단가를 조회함.
---
## 7. 관련 파일
| 파일 | 용도 |
|------|------|
| `api/app/Services/Quote/FormulaHandlers/KyungdongFormulaHandler.php` | BOM 산출 메인 로직 |
| `api/app/Services/Quote/FormulaEvaluatorService.php` | 수식 평가 서비스 |
| `api/app/Services/Quote/QuoteCalculationService.php` | 자동산출 실행 |
| `api/app/Models/Items/Item.php` | Items 모델 |
| `docs/features/quotes/README.md` | 견적 시스템 문서 |
| `docs/dev_plans/bom-item-mapping-plan.md` | 후속 작업 계획 |

View File

Before

Width:  |  Height:  |  Size: 134 KiB

After

Width:  |  Height:  |  Size: 134 KiB

Some files were not shown because too many files have changed in this diff Show More