2026-08-02 PinPoint 작업일지입니다. 오늘은 6건의 작업을 진행했습니다.
`login`, `site-management`(진입), 인증 `proxy`/`auth.config`
현상/기능
- 배정 알림톡에서 화면 진입 후 로그인하면 대시보드에 멈추고 현장관리 해당 상담으로 가지 않음
작업
- 파일
- `src/lib/` — 안전한 callbackUrl 파싱
- `src/components/` — 로그인 성공 시 callbackUrl로 이동
- `src/`, `src/` — 로그인 페이지·미인증 리다이렉트 시 callbackUrl 보존
- 미로그인 시 callbackUrl 포함
- `src/lib/` — `sendReceptionAlimtalk`에 `siteManagementUrl` 변수·`receptionId` 전달
- `send-site-manager-assign`, `site-managers/.../send-reception` — receptionId 전달
- `/site-management?receptionId=N` 미로그인 → `/login?callbackUrl=...` → 로그인 → 현장관리 해당 상담
- 솔라피 버튼 웹링크: `https://#{siteManagementUrl}` (`siteManagementUrl`은 scheme 제외 값)
전역 (`Providers`, `SessionTimeoutHandler`, `auth`)
현상/기능
- 사용자 액션이 30분간 없으면 자동 로그아웃 (로그인 후 절대 30분 만료가 아닌 유휴 기준)
작업
- 파일
- `src/` — `session.updateAge: 60` 추가 (활동 시 세션 만료 시각 슬라이딩 갱신), `maxAge` 30분 유지
- `src/components/` — 액션 감지·유휴 30분 `signOut`, 액션 시(1분 스로틀) `update` 갱신
- `src/components/` — `refetchInterval`/`refetchOnWindowFocus` 비활성 (폴링이 유휴를 막는 문제 제거)
- 사용 중: 마우스/키보드 등 액션 → 타이머 리셋 + (최대 1분마다) `update`로 세션 쿠키 만료 연장
- 30분 무액션: `signOut({ callbackUrl: "/" })` → 메인
- 세션 만료로 status가 unauthenticated가 되어도 메인으로 이동
`site-management`
현상/기능
- 견적전 상태에서 고객요청·기타를 지우고 소장상담전으로 돌리는 기능 (모듈 A: 기존 SP/API/UI 분기). 삭제(되돌리기) 버튼은 관리자도 사용 가능
작업
- 파일
- `prisma/procedures/sites.sql`
- `prisma/migrations/20260802140000_update_site_visit_reset_to_pre_consult.sql`
- `src/app/api/sites/[id]/` — `resetToPreConsult` 처리(관리자 허용)
- 「소장상담전으로」 버튼·확인·도움말(관리자·소장)
- `.cursor/rules/status-flow.mdc` — 전이 규칙 추가
- 조건: 진행상황=견적전 + 견적 미등록 + 현장 존재 + (관리자 또는 현장소장)
- PUT `{ resetToPreConsult: true }` → 고객요청·기타·상담결과 NULL, status=소장상담전, sites.del_yn='Y'
- 기존 「상담결과 변경으로 견적요청 취소」는 소장상담중 복귀·문구 유지 (변경 없음)
`payment-management`
현상/기능
- 수금통계 타이틀 우측 「수금문자」 버튼·연체 뱃지, 클릭 시 연체 리스트 팝업, 선택 문자발송(알림톡). 다건 연체는 「첫항목 외 N」·합계금액. 템플릿 ID는 env 슬롯만 추가. 팝업 크기 고정(화면 너비 1/2, 높이 80%). 문자·전화·날짜 중앙 / 금액 우측 정렬
작업
- 파일
- 수금문자 버튼 + 연체 건수 뱃지
- 연체 목록·체크·선택 문자발송 팝업(크기: 너비 1/2·높이 80% 고정, 정렬 적용)
- 팝업 연동·연체 건수 조회
- `api/payment-management/overdue-sms/` — GET 목록 / POST 선택 발송
- `lib/`, `lib/` — `SOLAPI_TEMPLATE_PAYMENT_NOTICE` / `sendPaymentAlimtalk` 연동
- `SOLAPI_TEMPLATE_PAYMENT_NOTICE=` 슬롯 추가
- 연체 기준: `is_paid='N' AND due_date < CURDATE` (기존 마스터 overdue와 동일)
- 계약 단위 1행, 복수 연체 시 예정일 빠른 항목명 + `외 N`, 금액은 연체 합계
- 발송: `sendPaymentAlimtalk` → 실패 시 SMS 폴백 → `alimtalk_notifications` 기록
- 최종문자발송일: `customer_info.notificationKind=payment_overdue` 인 연체 수금문자 성공 발송일만 집계(paymentMasterId·수신번호)
`contract-management`
현상/기능
- 공사완료 건은 계약일·수금계획·파일 등 모든 항목 수정 불가
현상/기능
- 공사목록·패널 교차 하단 여백(배경 노출) 제거
현상/기능
- 계약일 저장 등 개별 저장 제거, 파일 영역 저장 버튼으로 일괄 저장. 업로드·「계약서 파일」 라벨은 패널 안으로
현상/기능
- 계약서 등록 시 수금은 계획만 입력(실제 입금은 수금관리). 계약일·수금계획을 같은 영역, 계약서 파일은 별도 영역
현상/기능
- 공사목록 기준으로 계약일자·계약서 파일(이미지/PDF 다중) 등록. 상단 목록은 공사관리와 동일(견적보기 포함, 완료알림 제외). 관리자 수정/현장소장 조회만. 메뉴 「계약서관리」 `/contract-management`, 관리자·현장소장 기본권한
작업
- 파일
- `status===completed` 시 canEdit=false
- 잠금 안내 문구
- `api/contract-management/[orderId]/` — PUT 시 공사완료 거부
- 파일: — `h-[calc(100vh-140px)]`→`h-full`, — 테이블 영역 `flex-1`로 높이 채움
- 헤더에 저장만 유지, 본문에 라벨+업로드, 저장 시 계약일자·파일 함께 PUT
- 계약일자 + 수금계획(추가/수정/삭제, 입금 기능 제외)
- 계약서 파일 전용
- 계획 전용 폼
- 좌(계약일·계획) / 우(파일) 분할
- 제거
- 수금계획: 구분·금액·예정일·메모만 (`paidDate` null로 추가)
- 입금완료 항목은 조회·계획수정만 가능, 입금/입금취소 버튼 없음
- 저장 버튼 1개로 계약일·파일 일괄 저장
- `order_contract_files` — 계약서 파일(이미지/PDF) 다중 저장
- `menu`, `user_menu_permissions` — 계약서관리 메뉴 및 level 0·1 기본 권한
- `orders.contract_date` — 기존 컬럼 사용
- `update_order_contract_date`, `get_order_contract_detail`
- `get_order_contract_files`, `save_order_contract_file`, `delete_order_contract_files`
- `src/app/contract-management/` — AccessGuard(requiredLevel=1)
- `components/` — 목록+상세 조합, 관리자만 저장
- `components/` — 공사목록·견적보기
- `components/` — 계약일·다중 파일 업로드/보기
- `components/`
- `src/app/api/contract-management/`, `[orderId]/`
- `src/lib/` — CDN 업로드 동기화
- `prisma/migrations/20260802120000_add_contract_management.sql`
- 목록: `get_construction_list` 재사용(현장소장은 본인 현장만)
- 선택 → 계약일/파일 조회 → 관리자 저장 시 계약일 갱신 + 파일 전체 교체 동기화
- 이미지는 미리보기·다이얼로그, PDF는 iframe 다이얼로그로 조회
`contract-management`, `payment-management`(API)
현상/기능
- 계약서 정보 입력 시 수금관리와 동일한 수금정보 등록/수정/삭제 가능하도록 연동
작업
- 파일
- `get_payment_master_by_order_id` — 수주 ID로 수금 마스터 단건 조회 (`payments.sql`)
- `src/app/api/payment-management/` — `?orderId=` 단건 조회, POST 관리자만 허용
- 공사 선택 → `GET /api/payment-management?orderId=` 로 수금 로드
- 계획 CRUD는 동일 API → 수금관리와 동기화
- 현장소장은 조회만