견적서 패키지 격상 — 테마·문서함·QnA·.crq·허브 (5트랙 병렬)
개요
견적서/제안서 패키지를 단순 페이지에서 MS Office급 문서 시스템으로 격상. 5개 트랙(테마/문서함/QnA/격상/허브) 병렬 진행. Sonnet/Haiku 에이전트 적극 활용.
산출물
트랙 1 — 테마/브랜드 ✓
uploads/테마/crowny.json— 회사명·로고URL·색상·폰트·푸터문구 정본- 세로/가로/제안서 뷰어 3종 모두
테마ID필드로 테마 로드 - HTML 출력 시
:root { --주색: ...; }CSS 변수 동적 생성 - 브랜드 바 (로고+회사명) + 발행 푸터 자동 삽입
트랙 2 — 내 문서함 ✓
/문서함라우트 +문서함.htmlUI- 견적+제안 통합 목록 (클라이언트가 두 API 합성)
- 검색·필터(종류/즐겨찾기)·일괄삭제·즐겨찾기(localStorage)
- 한선씨 정통화 시도 → VM 함수 후반부 출력값 silently 누락 함정 발견. HTML+JS 채택. (RPN 재시도는 후속)
트랙 3 — Q&A 빌더 △
/qna라우트 +qna.html위저드 (Sonnet)data/견적_질문트리.json— 24개 질문 노드한선씨/답변_to_견적JSON.한선— 답변→견적 JSON 변환- 발주처_↔공급받는자_ 키 폴백 추가
- 버그:
JSON생성(맵)이 빈[]출력. UI는 라이브, 변환만 후속 디버그
트랙 4 — 문서 격상 (.crq) ✓
docs/crq-format.md—.crq포맷 사양 (JSON 단일파일 + 메타 3필드)- 라우트:
/견적서/다운로드,/제안서/다운로드,/문서함/업로드,/문서함/공유,/문서함/공유/<토큰> - 다운로드:
application/x-crowny-doc+jsonMIME + Content-Disposition - 업로드: .crq 파일 → 종류 자동 감지(공종→견적, 섹션→제안) → 저장 후 새 id 발급
- 공유: 만료 토큰 →
문서함/data/공유.json저장 → 만료 시 410 Gone - 한선씨 동반
crq메타.한선(체크섬 + 메타 생성, 컴파일·실행 검증) - 문서함.html에 ⬇/🔗/⬆ 버튼 추가
트랙 5 — 허브 재편 ✓
홈.html상단 nav에 Q&A 빌더 + 문서함 추가- 카드 그리드 재배치: 문서함(NEW) + Q&A(NEW) 카드 신규
- 견적서 카드에 세로/가로 한선씨 링크 추가
- 통계 "13 활성 모듈 · v1.0 문서함·QnA·.crq NEW"
라이브 URL
http://localhost:4100/ ← 허브
http://localhost:4100/문서함 ← 통합 문서함
http://localhost:4100/qna ← Q&A 위저드
http://localhost:4100/견적서/세로 ← 한선씨 세로뷰어
http://localhost:4100/견적서/가로 ← 한선씨 가로뷰어
http://localhost:4100/제안서/뷰 ← 한선씨 제안뷰어
http://localhost:4100/uploads/테마/crowny.json ← 테마 정본
정통 헌법 정통성
| 항목 | 정통 비율 |
|---|---|
| 견적서 RPN 계산 엔진 | 100% (견적엔진.rpn.한선) |
| 뷰어 렌더링 (HTML 생성) | 100% (한선씨 정본, JS 어댑터 옵션) |
| 데이터 (JSON) | 이행보조 |
| 서버 (Node.js) | 외부의존성 (한선씨 PoC 4199 검증됨) |
| Q&A 변환기 | 한선씨 (버그) |
| 격상 메타 생성기 | 한선씨 (crq메타.한선) |
잔여 이슈
- Q&A 변환기
JSON생성(맵)빈 출력 버그 디버그 - 문서함뷰어 한선씨 정통화 — VM 함수 후반부 누락 함정 우회
- PDF 어댑터 (현재 인쇄→PDF 저장 → 한선씨가 PDF 직접 출력)
- 한선씨 4199 서버 PoC를 4100 본진 통합 (현재 Node 서버)
- 도면 모듈도 같은 패턴으로 한선씨 정통화
학습DB 등록 대기
- 견적엔진 정통RPN 3종 (이전 등록 완료)
- crq메타.한선 — 체크섬·종류감지 패턴
/loop #1 — PDF 직접 생성 (2026-05-28)
구현
- 라우트:
GET /견적서/PDF?id=<id>&form=가로|세로,GET /제안서/PDF?id=<id> - 엔진: Chrome.app
--headless=new --print-to-pdf - 응답:
application/pdf(~600KB, 멀티페이지) ·Content-Disposition: inline; filename="..." - 한선씨 동반:
문서함/한선씨/PDF메타.한선— 체크섬·종류·양식 자동 감지 - 문서함 UI: 📄 PDF 버튼 신규 추가
검증
- 가로 견적서 PDF: 605KB, 3페이지
- 세로 견적서 PDF: 동일 라우트,
form=sero또는양식=세로두 키 모두 지원 - 제안서 PDF: 164KB, 1페이지
주요 결정
- Chrome timeout 60초 (첫 부팅 ~20초)
- PDF 라우트는 견적서/제안서 모듈 이전 배치 (fallback 충돌 방지)
- IIFE 안 비동기 응답이 outer 함수 fallback 과 경쟁하던 버그 회피
/loop #2 — 다국어 (한·영·중·일) (2026-05-28)
구현
- 라벨 사전:
uploads/i18n/labels.json— ko/en/zh/ja 4언어 × 54 키 (견적서·제안서 모든 고정 라벨) - 뷰어 3종에 i18n: 세로/가로/제안서 — 전역
_사전+L(키)헬퍼 (1매개변수, 폴백 키→키) - 라벨 교체: 세로 32건, 가로 48건, 제안서 22건 (합계 102건)
- 라우트:
?lang=ko|en|zh|ja매개변수 →LANG_CODEenv 전달 - HTML
<html lang="...">자동 매핑
검증 (4언어 × 3뷰어 = 12 케이스)
- 견적서 (세로/가로): 견 적 서 / QUOTATION / 报 价 书 / 御 見 積 書
- 제안서: 제 안 서 / PROPOSAL / 提 案 书 / 御 提 案 書
- PDF 4언어 라이브: en 562KB / zh 728KB / ja 732KB (모두 3페이지)
- 회귀: ko 미설정 시 한국어 기본, 기존 출력과 동일
학습DB
i18n_라벨사전_4언어— 사전 구조i18n_뷰어_L헬퍼— 전역 사전 + L(키) 패턴
라이브 URL
/견적서/세로?lang=en
/견적서/가로?lang=zh
/제안서/뷰?lang=ja
/견적서/PDF?id=<id>&lang=ja
주요 결정
- 라벨만 번역, 데이터(공사명·품명·단가 등 사용자 입력)는 원본 유지
- 환경변수
LANG_CODE(한국어 키 미지원 회피) - 전역 변수 + 1매개변수 헬퍼 (한선씨에서 가능한 패턴)