← 목록
기타 2026-07-30 4KB 읽기 4분

quote 서비스 — 거래처 스크리닝 + 엑셀 매칭 도구 추가

개요

crowny-services/public/quote (포트 9626, 견적 채팅 도우미 chat.js 위에) 순수 바닐라 JS 도구 2종을 추가:
  1. 거래처 스크리닝(screen.js) — 붙여넣은 텍스트(사업자등록증/명함/이메일서명)에서 거래처 필드 추출
  2. 엑셀 매칭(xlsx.js) — .xlsx 파일을 ZIP 수동파싱+DecompressionStream으로 읽어 품목/거래처 자동 매핑
기존 React dc 앱(index.html)과 analyze.js 기반 텍스트분석 플로우는 무회귀, chat.js에 최소 diff로 통합.

무엇을 했는지

  • screen.js: 정규식 기반(사업자번호/전화/이메일/주소/상호/담당자) 휴리스틱, window.크라우니거래처스크리닝.스크리닝() 노출
  • xlsx.js: ZIP EOCD/중앙디렉토리/로컬헤더 수동 파싱, DecompressionStream('deflate-raw')로 압축해제, DOMParser로 sharedStrings.xml/sheet1.xml 파싱, 셀참조(A1표기) 변환, 품목형/거래처형 헤더 키워드 매칭(품목 15키워드/거래처 13키워드), window.크라우니엑셀.파싱() 노출(Promise)
  • chat.js 통합: 1단계(받는곳)에 "정보 붙여넣어 스크리닝" 보조버튼 + 미리보기+이대로사용 플로우, 2단계 파일 input accept에 .xlsx 추가, xlsx items모드는 기존 renderAnalyzePreview 재사용, clients모드는 별도 등록 미리보기(renderXlsxClientsPreview)
  • index.html: chat.js 앞에 <script src="screen.js"> <script src="xlsx.js"> 2줄만 추가 (React dc 앱 코드 미수정)
  • 한선씨 동반 파일: screen.한선(사업자번호/전화/이메일 형태판정, 정규식 대신 문자순회), xlsx.한선(셀참조 26진법 변환, 헤더모드 판정) — 둘 다 hanseonc_high 컴파일+실행 성공, 고정 테스트케이스 3종 전부 기대값 일치
  • chat.한선에 거래처 upsert 판정 로직(거래처인덱스찾기) 소규모 추가(파리티 유지, 컴파일 재검증)

관련 파일 경로

  • /Users/ef/crowny-services/public/quote/screen.js
  • /Users/ef/crowny-services/public/quote/screen.한선
  • /Users/ef/crowny-services/public/quote/xlsx.js
  • /Users/ef/crowny-services/public/quote/xlsx.한선
  • /Users/ef/crowny-services/public/quote/chat.js (수정)
  • /Users/ef/crowny-services/public/quote/chat.한선 (수정)
  • /Users/ef/crowny-services/public/quote/index.html (script 태그 2줄만 추가)

검증 결과

  1. node --check chat.js/screen.js/xlsx.js — 전부 통과
  2. 단위테스트(node, /tmp 스크립트):
- screen.js: 사업자등록증형 텍스트 → 상호/사업자번호/주소 정상 추출, 이메일서명형 텍스트 → 담당자/전화/이메일 정상 추출 - xlsx.js: node에는 DOMParser가 없어 XML파싱 브라우저 전용경로는 스킵, 대신 핵심 함수(parseCellRef, matchHeaderMap, listZipEntries) 직접 단위호출 검증 — B3→(3,2), AA1→(1,27), 품목헤더 4/0, 거래처헤더 0/4, 합성 ZIP(stored) 로컬헤더 파싱 성공
  1. 한선씨 컴파일+실행(hanseonc_high → crownyc run): screen.한선/xlsx.한선 둘 다 exit 0, 테스트 출력 기대값과 일치(사업자번호참:참/전화참:참/이메일참:참, B3->행:3열:2, AA1->행:1열:27, 품목헤더모드:items, 거래처헤더모드:clients)
  2. 서비스(포트 9626) 라이브 확인: screen.js/xlsx.js curl 200 + 로컬-원격 바이트 크기 일치(4624/10961), index.html에 script 태그 2줄 반영 확인
  3. 크라우니AI검증.sh shot 스크린샷 생성 성공(/tmp/도구검증.png, 110439 bytes)

잔여 이슈

  • xlsx.js의 XML 파싱(sharedStrings/sheet1)은 브라우저 DOMParser 전제 — node 환경에서는 실제 브라우저 왕복 E2E(실제 .xlsx 업로드→미리보기)까지는 검증 못함. 브라우저 수동 업로드 테스트 권장.
  • 스크리닝 담당자(contact) 추출은 "이름+키워드 붙어쓰기"(예: "박담당")처럼 공백 없는 형태에서 오탐 가능(정규식 기반 한계) — 실사용 중 정확도 모니터링 필요.
  • 헤더 키워드 매칭이 애매한(품목/거래처 동점) xlsx 파일은 items로 폴백되므로, 실제 다양한 양식의 엑셀로 추가 검증 권장.