2026-08-01 PinPoint 작업일지입니다. 오늘은 7건의 작업을 진행했습니다.

`estimate_info`

현상/기능

  • 저장 로딩 아이콘, `+갤러리` 문구/아이콘 통일, 레이어 겹침 수정, 기본정보 내 매장관련 사진 제거 및 영역 비율 조정

작업

  • 파일
  • `showStorePhotos` prop 추가(기본 true, 견적관리 유지)
  • 저장 스피너, 매장사진 저장/로드 제거
  • 갤러리 버튼·겹침 해소
  • 매장사진 숨김, 기본정보는 콘텐츠 높이, 견적내용 잔여 공간
  • 견적상담·참고사항 : 견적사진 = 높이 2:1, 사진 미리보기 갤러리 연동
  • 다중 이미지 이전/다음·좌우키·인덱스 표시
  • 저장 후 `/estimate`와 동일하게 `PUT calcStatus="Y"`로 견적계산 요청(진행상황·관리자 알림 포함)

`estimate_info`, `site-management`

현상/기능

  • 현장관리 견적등록을 기존 `/estimate` 대신 별도 견적정보관리로 이동하고, 기존 견적 기본정보와 견적상담·참고사항·사진을 저장

작업

  • 파일
  • `estimates` — `estimate_consult_content`, `estimate_reference_content` TEXT 컬럼 추가
  • `estimate_info_photos` — 견적정보관리 전용 다중 사진 테이블 추가
  • `menu`, `user_menu_permissions` — 견적정보관리 메뉴 및 기존 현장소장 기본 권한 추가
  • `get_estimate_by_id`, `get_estimate_by_reception_id` — 견적상담·참고사항 반환
  • `update_estimate_info` — 견적상담·참고사항 저장
  • `save_estimate_info_photo`, `get_estimate_info_photos`, `delete_estimate_info_photos` — 전용 사진 동기화
  • `src/app/estimate_info/`, `components/*` — 견적관리와 동일한 좌우 레이아웃, 기본정보·상담·참고사항·다중 사진 UI
  • `src/app/api/estimates/`, `[id]/` — 견적정보 조회·신규/수정 저장
  • `src/lib/`, — 기존 URL 유지 및 신규 data URL CDN 업로드
  • `src/app/site-management/components/` — 견적등록 이동 경로를 `/estimate_info`로 변경
  • `prisma/migrations/20260801112000_add_estimate_info_management.sql`, `prisma/procedures/estimates.sql`
  • 현장관리 견적등록 → 현장 저장·관리자 알림 → `/estimate_info?siteId=...&receptionId=...`
  • 상담 조회 → 기존 `estimates` 견적 로드 또는 신규 생성 → 기본정보/상담/참고사항/매장사진/견적사진 저장
  • 기존 견적관리와 동일하게 배정된 현장소장만 수정 가능하며 견적계산 요청·완료 상태는 잠금
  • 견적상담·참고사항은 UI 글자 수 제한이 없고 견적사진은 장수 제한 없이 등록

`estimate_calc2`

현상/기능

  • `estimate_info` 저장 내용을 확인해 품명/금액을 저장하고 엑셀 출력, 견적 확정/공사전환, 사용자 PDF 업로드 견적발송까지 수행하는 관리자 페이지 추가

현상/기능

  • 견적정보관리에서 0017 계산요청 시 0016·0017이 같이 나오고, 해제 시 목록이 비며, 고객명이 없음으로 표시됨

현상/기능

  • 상호/성명이 "없음 / 이태훈"인데 목록에 "없음"만 표시됨

현상/기능

  • 견적사진 모달이 떠 있으면 품명/금액을 입력할 수 없음. 사진을 보면서 입력되게 팝업 유지

현상/기능

  • 키보드를 한글로 바꿔도 다른 행을 가면 영문으로 자동 전환됨

현상/기능

  • 행을 선택하면 해당 텍스트가 선택

현상/기능

  • 행추가를 누르면 추가된 행의 품명에 포커스가 가도록

현상/기능

  • 품명·금액 입력 후 Enter 누르면 Tab과 동일하게 다음 칸으로

현상/기능

  • Ctrl + N 하면 행추

현상/기능

  • 브라우저 새창이 열려서 Ctrl+M으로 변경

현상/기능

  • 행추가 단축키가 뭔지 표기

현상/기능

  • 엑셀 출력 시 순번 컬럼 없이 `1. 철거`처럼 품명에 순번 표기

현상/기능

  • PDF 버전 업로드/발송 팝업 넓이를 2배로, 늘어난 만큼 미리보기만 확장

현상/기능

  • 2048일 땐 화면을 꽉 채웠는데 1024로 바꾸니 절반보다 너무 작음

현상/기능

  • 소장과 고객의 알림문구가 다르게 / 소장 템플릿 ID `KA01TP2606281658550604Jb61o02Brf`

작업

  • 파일
  • `estimates`: `calc2_pdf_path`, `calc2_pdf_name`
  • 신규 `estimate_calc2_items`: 견적별 품명, 금액, 정렬 순서
  • `menu`, `user_menu_permissions`: `견적계산2` 메뉴와 관리자(level 0) 기본 권한
  • 수정/추가 프로시저
  • `get_estimate_calc2_items`
  • `delete_estimate_calc2_items`
  • `save_estimate_calc2_item`
  • `save_estimate_calc2_total`
  • `update_estimate_calc2_pdf`
  • 기존 `get_estimate_calc_list`, `get_estimate_calc_detail`, `get_estimate_by_id`, `confirm_estimate`, `cancel_estimate_confirm` 재사용
  • `prisma/migrations/20260801122500_add_estimate_calc2.sql`
  • `prisma/procedures/estimate_calc2.sql`
  • `src/app/api/estimate-calc2/`
  • `src/app/api/estimate-calc/`
  • `src/app/estimate_calc2/`
  • `src/app/estimate_calc2/components/*`
  • 관리자 전용 계산대상 검색/선택 및 견적 기본정보 표시
  • 좌측 60% 상담·참고사항·전체 사진, 우측 40% 품명/금액 DataTable
  • 품목 전체 저장과 `estimates.total_amount` 합계 동기화
  • 품명/금액/합계 Excel 출력
  • 기존 견적 확정·취소 및 공사 등록·취소 흐름 연동
  • 사용자 PDF CDN 업로드, 미리보기, 업로드 URL을 사용한 알림톡/SMS 견적발송
  • 완료 여부: 코드 작성 및 정적 검사 완료 — 마이그레이션/프로시저 DB 반영 후 실제 발송 확인 필요
  • 원인
  • 기존 `get_estimate_calc_list`가 상담상태 `견적계산`만으로도 같은 상담의 다른 견적(calc_status=N)을 포함
  • API가 calc_status N을 Y로 강제 매핑
  • 고객명을 `estimates.customer_id`의 customers만 조회해 reception 고객명이 누락
  • 목록을 전용 SP로 전환: `calc_status Y/E + 공사미등록` 또는 `공사중`만
  • 고객명/상호를 customers → reception → 견적 상호 순 fallback
  • 배포 필요: `estimate_calc2.sql`의 `get_estimate_calc2_list` 적용
  • 완료 여부: 코드 반영 완료
  • 현장관리와 동일하게 `상호 / 성명` 형식으로 표시
  • 원인: `companyName || customerName`라 상호가 "없음"이어도 truthy로 성명을 가림
  • `src/app/estimate_calc2/components/` (`formatCalc2CustomerLabel`)
  • 좌측 플로팅 미리보기 + 우측 품명/금액 동시 입력, X로만 닫기
  • `src/components/image-preview/` — `nonBlocking` 옵션
  • `src/components/image-preview/` — modal=false, 오버레이 없음, 바깥클릭 닫힘 방지
  • `src/app/estimate_calc2/components/` — 사진 클릭 시 nonBlocking 오픈
  • 원인: 금액 `inputMode=numeric`이 IME를 영문으로 끄고, 비차단 미리보기 `onFocusOutside` preventDefault가 포커스/IME를 방
  • `src/app/estimate_calc2/components/` — 품명 composition-safe 입력, 금액 inputMode 제거
  • `src/components/image-preview/` — nonBlocking `onFocusOutside` 차단 제거
  • 파일: `src/app/estimate_calc2/components/`
  • 품명·금액 입력 포커스/클릭 시 `select`로 전체 텍스트 선택
  • 행 추가 후 신규 행 품명 Input에 focus/select
  • Enter 시 다음 input으로 focus/select(한글 조합 중 제외, 삭제 버튼 건너뜀)
  • Ctrl/⌘+N 단축키로 행 추가(브라우저 기본 동작 방지), 버튼 title 안내
  • 행 추가 단축키를 Ctrl/⌘+M으로 변경
  • 행 추가 버튼에 `Ctrl+M` kbd 표기
  • 엑셀 컬럼을 품명/금액만 사용, 품명=`{순번}. {품명}`
  • Dialog `max-w-5xl(1024)` → `2048px`, 버전목록 220px 고정, 미리보기 `1fr`만 확장
  • 완료 여부: 코드 반영 완료 → **1024로 원복**
  • `!max-w-[min(96vw,1024px)] sm:!max-w-[...]`로 1024px 강제 적용
  • 원인: Dialog 기본 `sm:max-w-lg`(512px)가 `max-w-5xl`을 덮음
  • 고객=`customerEstimate`, 소장=`siteManagerEstimate`(기본 KA01TP…)
  • `src/lib/` — `SOLAPI_TEMPLATE_SITE_MANAGER_ESTIMATE` + 기본 ID
  • `src/lib/` — `sendEstimateSiteManagerAlimtalk`
  • `src/lib/` — 소장용 템플릿/SMS 폴백
  • `src/app/api/estimate-calc2/send/` — 역할별 템플릿 발송
  • `ENV_SETUP.md`, `DEPLOYMENT_ENV.md`
  • 완료 여부: 코드 반영 완료 → **ID 정정**: 고객=`KA01TP2606281658550604Jb61o02Brf`, 소장=`KA01TP260801145635845NGiEc1aM1F5` ( 포함)
  • 모듈 분리: A — `estimate_calc2_pdfs` 전용 테이블 + `/api/estimate-calc2/send`
  • `estimates.calc2_pdf_sent_yn`
  • 신규 `estimate_calc2_pdfs` (version_no, file_path/name, is_latest, sent_yn/sent_at)
  • `get_estimate_calc2_pdfs`, `get_latest_estimate_calc2_pdf`
  • `save_estimate_calc2_pdf_version`, `mark_estimate_calc2_pdf_sent`
  • `prisma/migrations/20260801213000_add_estimate_calc2_pdf_versions.sql`
  • `src/app/api/estimate-calc2/send/`
  • 버튼 순서: 저장 → 엑셀 → 확정 → PDF·발송 → 공사등록
  • PDF 버전 목록/업로드/최종버전 미리보기
  • 발송 API가 고객·소장에게 각각 알림톡(실패 시 SMS) 전송 후 발송완료 마킹
  • 배포 필요: 마이그레이션 + `estimate_calc2.sql` 재적용

`estimate_info`, `estimate_calc2`

현상/기능

  • `estimate_info`, `estimate_calc2` 페이지 하단 여백이 많음

작업

  • 파일
  • `estimate_info`에 `estimate`와 동일한 견적계산요청/해제 기능 추가
  • `estimate_calc2` 목록은 견적계산요청 데이터와 공사중 데이터만 표시
  • 공사중 데이터는 수정 불가
  • `src/app/estimate_info/components/`
  • `src/app/estimate_info/`
  • `src/app/api/estimate-calc2/`
  • `src/app/estimate_calc2/components/`
  • `src/app/estimate_calc2/`
  • 견적정보관리: 저장과 견적계산요청 분리, 요청/해제 버튼, 요청 시 자동 저장 후 calcStatus=Y
  • 견적계산2 목록: 공사 미등록 + calcStatus Y/E, 또는 orderStatus=in_progress만 노출
  • 공사중이면 품목 편집·저장·확정·PDF 업로드 잠금(엑셀 조회만 가능)
  • 완료 여부: 코드 반영 완료
  • `estimate-calc`와 동일하게 `h-full min-h-0` + Card `flex-1`로 맞춤
  • 원인: 대시보드 main이 이미 남은 높이를 쓰는데 `h-[calc(100vh-140px)]`를 중복 적용해 푸터 위 빈 공간 발생

`estimate`

현상/기능

  • `estimate_info` 상담조회 팝업에서도 상호/성명이 "없음"만 표시됨

작업

  • 파일: `src/app/estimate/components/`
  • 현장관리와 동일하게 `상호 / 성명` 형식으로 셀·툴팁 표시
  • 원인: `estimate-search-dialog` 셀이 상호만 표시 (`companyName`만 출력)
  • 완료 여부: 코드 반영 완료

전역 (`ImagePreview`)

현상/기능

  • 위치를 움직이게

현상/기능

  • 팝업띄울때 위치를 중앙으로 하고 크기를 화면의 1/2로

작업

  • 파일: `src/components/image-preview/`
  • nonBlocking 미리보기 상단 바 드래그로 창 좌표 이동(화면 밖으로 벗어나지 않도록 클램프). 이미지 영역 팬/줌과 분리. 열 때 기본 위치 초기화
  • 완료 여부: 코드 반영 완료
  • nonBlocking 오픈 시 `50vw×50vh` 크기, 화면 중앙 좌표로 초기화. 드래그 클램프도 동일 크기 기준

`site-management`

현상/기능

  • 현장소장 배정 알림 확인 후 현장관리에 해당 상담내용이 선택

작업

  • 파일
  • `/site-management?receptionId={id}` 진입 시 목록에서 해당 상담 선택
  • `src/lib/` — 배정/전달 알림 link에 `?receptionId=`
  • `src/app/site-management/` — Suspense
  • `src/app/site-management/components/` — 쿼리 기반 자동 선택·스크롤
  • 완료 여부: 코드 반영 완료 (이미 저장된 옛 알림 링크는 쿼리 없음)