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/` — 쿼리 기반 자동 선택·스크롤
- 완료 여부: 코드 반영 완료 (이미 저장된 옛 알림 링크는 쿼리 없음)