hjjeong
b17d7b063d
PR-D G11 견적 결재상신 — Amaranth 직행 (wace estimateList_new.jsp btnApproval 1:1)
...
G11 수주 결재상신(905d5c09 )과 동일 패턴을 견적관리에 확장. target_type='CONTRACT_ESTIMATE',
target_objid=estimate_template.objid(최신 차수), formId='1162' (수주 1161과 별도 양식).
- 백엔드: salesEstimateService.startEstimateApproval + POST /sales/estimate/:id/amaranth-approval
- 견적 list SQL: LEFT JOIN amaranth_approval(CONTRACT_ESTIMATE) + APPR_STATUS 4단계 한글 라벨 + approval_required='N' fallback (wace contractMgmt.xml:513~522 1:1)
- 프론트: 견적관리 placeholder 토스트 → handleAmaranthApproval 핸들러 + sky-600 Send 버튼 (수주 페이지와 통일)
- docker-compose 3개: AMARANTH_OUT_PROCESS_CODE_CONTRACT_ESTIMATE + AMARANTH_FORM_ID_CONTRACT_ESTIMATE=1162 추가
- 가드: 행 미선택 / est_objid 없음(견적서 미작성) / inProcess+complete / notRequired+approval_required='N'
- 사전판정(checkApprovalRequired)은 G4 영역으로 분리 — 이번 PR은 단순 SSO 흐름만
검증: BEGIN/ROLLBACK으로 26C-0712(est_objid=-452406811) 4단계 상태(create→inProcess→complete→reject)
+ amaranth row 삭제 시 approval_required='N' fallback 모두 한글 라벨 정상. 문서 08-estimate-approval-verify.md.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-11 18:16:43 +09:00
hjjeong
902118d46e
PR-C G6 견적관리 SMTP 메일 발송 (wace sendEstimateMailCustom 1:1)
...
- nodemailer + pdf-lib로 실제 SMTP 발송. mail_log INSERT(is_send='N') → 발송 → 성공 시 UPDATE(is_send='Y'), 실패 시 UPDATE(error_log). SMTP_SEND_SWITCH='N'면 발송 스킵.
- SMTP 3계정(ERP/SALES/PURCHASE) host/user/pw 환경변수 분리. 견적서는 SALES. dev는 backend-node/.env, 운영은 deploy/onpremise + docker/prod + docker/deploy 3개 compose에 environment 매핑(호스트 .env에서 실값 주입).
- 다이얼로그(EstimateMailDialog): wace estimateMailFormPopup.jsp 1:1. 고객사 담당자 체크박스 + To/CC/제목/내용 자동채움(GET /sales/estimate/mail-info/:id + .../customer/:id/managers). hasBaseEst/hasAddEst 분기로 PDF 첨부 안내. 본문은 다이얼로그 plain text 입력 → <br> 변환.
- PDF 첨부: 메일 다이얼로그가 hidden iframe으로 최신 차수 template1/2 페이지를 렌더 → window.fn_generateAndUploadPdf(cb) 글로벌 → jsPDF.output('datauristring') base64 추출 → 한 요청에 전달. backend가 견적 PDF + estimate02 N건 pdf-lib로 합본 첨부.
- PDF 캡처 수신처 누락 픽스: CustomerSelect의 /sales/customers 옵션 fetch가 iframe에서 dataLoaded=true 뒤에 끝나 셀렉트 라벨이 빈 상태로 캡처되던 현상. fetchCustomers export + template1/2 setLoading(false) 직전 await + onclone에서 [role="combobox"] 라이브 DOM 텍스트 fallback.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-11 16:09:10 +09:00
hjjeong
844216c298
PR-C G5-A 견적작성 페이지(일반 template1 + 장비 template2) 1:1 이식
...
- 백엔드: saveEstimateTemplate1/2 + getTemplateById + listTemplatesByContract
- 라우트: POST /api/sales/estimate/template1·template2, GET /template/:id, /templates/:contractObjid
- 프론트 페이지 /estimate/template{1,2}/pop/[contractObjid]
· template1: wace estimateTemplate1.jsp 1:1 (헤더·라인·합계·비고·참조사항)
· template2: wace estimateTemplate2.jsp 1:1 (CNC + 7개 기본 카테고리 + group1 공유 subtotal + 비고 contenteditable + 카테고리 동적 추가/삭제)
· /pop/ 세그먼트로 (main)/layout.tsx isPop 분기에 걸려 새 창에서 사이드바·탭바 우회
· 다크모드에서 견적서 양식 검정 텍스트 강제
- 진입점: 견적관리 그리드 "견적작성" → 일반/장비 선택 다이얼로그 → window.open 새 창
- 견적현황(폴더) 컬럼 클릭 → 차수 리스트 다이얼로그 (wace fn_showEstimateList)
- 회사 도장 PNG (wace_plm/WebContent/images/company_stamp.png 1:1 복사, .gitignore *.png 우회 -f)
PDF 다운로드(html2canvas+jspdf) + 메일 PDF 합본은 G5-B 별도 PR.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-11 14:08:33 +09:00
hjjeong
0a97f2ec38
S/N 관리·연속번호생성 Dialog 모두 onInteractOutside 차단 (자식 Dialog 닫힘 시 부모 도미노 차단 완성)
...
이전 커밋에서 메인 등록 Dialog에만 onInteractOutside 추가 — 자식(S/N)·손자(연속번호) Dialog가 닫힐 때 이벤트가 메인까지 도미노로 전파되며 여전히 메인이 닫혔음.
해결: nested Dialog 4개(견적/주문 각각 S/N + 연속번호) 모두에 onInteractOutside={(e) => e.preventDefault()} 추가.
사용자는 X / 취소 / 확인 / 생성 버튼으로만 명시적으로 각 Dialog 닫음.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-11 10:39:49 +09:00
hjjeong
447090faca
견적/주문 등록 다이얼로그: 자식 S/N·연속번호 Dialog 닫힐 때 부모 Dialog까지 닫히는 현상 차단
...
Radix Dialog 알려진 이슈 — nested Dialog 닫힐 때 PointerDown 이벤트가 부모로 전파되어 outside click으로 인식, 부모 Dialog도 함께 닫힘.
수정:
<DialogContent onInteractOutside={(e) => e.preventDefault()}>
→ 외부 클릭으로 부모 닫힘 차단. 사용자는 X / 취소 / 저장 버튼으로만 닫음.
ESC는 그대로 — Radix focus stack이 자식만 먼저 닫음.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-11 10:35:41 +09:00
hjjeong
86e3aef6f7
영업 4개 메뉴 그리드: wace JSP 주석 처리된 비활성 컬럼들 정정 (V1 보강 잘못 활성화 되돌림)
...
원인: wace JSP의 var columns 끝에 있는 /* 주석처리된 컬럼 */ 블록은 비활성 보존 영역(메모리 feedback_wace_jsp_columns)인데, V1 보강 커밋에서 추측으로 활성화함. 운영 화면에 노출되지 않는 컬럼이므로 원본대로 주석으로 되돌림.
비활성으로 복귀한 컬럼:
- 견적관리(estimateList_new.jsp 494~502): 제품구분 / 국내해외 / 반납사유
- 주문관리(orderMgmtList.jsp 429~434): 제품구분 / 국내해외 / 접수일
- 판매관리(salesMgmtList.jsp 503~519): 제품구분 / 국내해외 / 접수일 / 고객사요청사항 / 주문서첨부 / 출하방법 / 담당자 / 인도조건
- 매출관리(revenueMgmtList.jsp 615~632): 접수일 / 유무상 / 요청납기 / 고객사요청사항 / 수주상태 / 주문서첨부 / 출하방법 / 담당자 / 인도조건
코드는 주석 블록으로 남겨두어 필요시 활성화 가능. 백엔드 SQL은 그대로 두어 다른 메뉴에서 재사용 가능.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-11 10:09:09 +09:00
hjjeong
293339724c
영업 4개 메뉴 그리드 컬럼 너비 보강 (날짜·발주번호·프로젝트번호 잘림 해소)
...
YYYY-MM-DD 날짜 10자가 잘리던 컬럼 + 발주번호(10~13자 PO) + 프로젝트번호(한글 포함) 너비 상향.
- 견적관리: 영업번호 110→125, 접수일 100→115, 요청납기 110→160
- 주문관리: 영업번호 120→125
- 판매관리: 프로젝트번호 140→170, 발주일 100→115, 발주번호 110→140, 요청납기/출하일/접수일 100/110→115
- 매출관리: 프로젝트번호 140→170, 발주일/출하일 100→115, 발주번호 110→140, 접수일/요청납기 100/110→115
(개별 사용자 환경에서는 컬럼 드래그 리사이저 + localStorage로 추가 미세조정 가능)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-11 10:04:23 +09:00
hjjeong
12ea68616d
견적관리 그리드 V1 컬럼 보강(제품구분·국내해외·반납사유) + wace 1:1 검증 문서·자동 검증 SQL
...
- getList SQL: 라인 집계에 product_summary(=PRODUCT_NAME, contract_item.product distinct join) / return_reason_summary 추가. wace는 헤더 product 폐지·라인으로 이동(운영 90건 contract_mgmt.product NULL) → 라인 집계로 그리드 표시
- GRID_COLUMNS 3개 추가: 제품구분 / 국내해외 / 반납사유
- searchForm.search_partName 필드 추가(초기화 포함). 검색 폼 UI는 PartSelect mode=partName 이미 존재
- docs/migration/sales/01-estimate-verify.md: wace ↔ RPS 항목 매핑 / 운영 데이터 코드 체계 / 갭 우선순위
- scripts/verify-estimate.sql: BEGIN/ROLLBACK 5개 시나리오 (등록·수정·G1·수주취소·그리드) 자동 검증
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-11 09:29:43 +09:00
hjjeong
66e2a63dfa
영업관리 G1 수주확정→프로젝트 자동생성 + 견적요청등록 wace 1:1 이식
...
- G1: salesOrderMgmtService.updateStatus 트랜잭션화 + project_mgmt 자동생성 (project_no 채번/Machine 분기/contract_item 라인별 INSERT)
- 수주확정 다이얼로그(상태 select 팝업) + 수주취소 다이얼로그(라인별 cancel_qty)·POST /sales/order-mgmt/:id/cancel-qty 신설
- 견적요청등록 폼: estimate_template 분리, 헤더 8(주문유형/국내해외/고객사/유무상/접수일/견적환종/견적환율/결재여부) + 라인 8(제품구분/품번/품명/S/N/견적수량/요청납기/반납사유/고객요청사항) wace 운영 화면과 1:1
- S/N 관리 다이얼로그(테이블+연속번호생성), PartSelect/CommCodeSelect/CustomerSelect 셀렉트박스 + ✕(선택해제), 수주확정된 행 라인 추가/삭제 차단
- DataGrid 체크박스 모드 (영업번호 No → 체크박스, 행 어디 클릭이나 단일 선택)
- 식별자 정합성: contract_mgmt.customer_objid를 customer_mng.customer_code 기반(C_xxxx)으로 통일, contract_no 채번 {YY}C-{NNNN} 운영 패턴 일치, contract_item.quantity ::integer 캐스트
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-09 16:48:25 +09:00
hjjeong
2d9f30ebab
영업관리 첨부파일 모달·주문서 뷰 + DataGrid frozen 컬럼
...
- 공통 AttachmentDialog 컴포넌트 신설 (목록/업로드/다운로드/삭제, doc_type 단일·배열 지원)
- 견적 add_est_cnt(클립) → AttachmentDialog (estimate02)
- 주문 cu01_cnt(클립) → AttachmentDialog (FTC_ORDER,ORDER), has_order_data(폴더) → OrderFormViewDialog
- OrderFormViewDialog 신설 — wace orderFormView 한국 표준 주문서 양식 + 인쇄
- 백엔드 fileController.getFileList docType 콤마 멀티값 지원, salesOrderMgmt.getOrderFormView API 추가
- DataGrid 확장: column.onClick / frozen prop / table-fixed / sticky-left + selected·hover 일관 처리
- 4개 메뉴 첫 컬럼 frozen 적용 (영업번호/프로젝트번호)
- 주문서관리 발주일·발주번호·요청납기 컬럼 너비 확장
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-08 14:48:13 +09:00
hjjeong
489fa50d11
영업관리 4개 메뉴 검색폼 wace 일치 + 공통 UX(초기화·date input) 정비
...
- 검색 폼 정합성: wace JSP `<!-- 주석처리된 검색필터 -->` 블록까지 잘못 이식했던 부분 정정
- 견적: 11→7개 (제품구분/국내해외/유무상/요청납기 제거)
- 주문: 13→9개 (제품구분/국내해외/유무상/견적환종 제거)
- 매출: 10→11개 (출하지시상태 제거 + 제품구분·국내/해외 추가, JSP 순서로 재배치)
- 판매: 변경 없음 (원본 그대로 일치)
- 매출 백엔드: SaleListFilter에 productType/nation 추가, getRevenueList에 partObjId/serialNo/orderDate/productType/nation 5개 필터 처리
- 공통 UX
- 초기화 버튼을 4개 메뉴 동일하게 통일 (variant=ghost, 버튼 영역 끝)
- <Input type="date">는 빈 값 placeholder 숨김 + 캘린더 아이콘 숨김 + 영역 클릭으로 picker 자동(showPicker)
- 신규 공통 컴포넌트: CommCodeSelect/CustomerSelect/CustomerSearchDialog/PartSelect/ItemSearchDialog + backend salesCommonRoutes
- 문서: 01/02/04 검색 폼 표를 활성/비활성 분리 형식으로 정정, README에 8. 공통 UX 규칙 섹션 신설
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-08 10:42:16 +09:00
hjjeong
93186efe6a
영업관리 견적 placeholder 3종 실구현 + 폴더/클립 아이콘
...
- 추가견적: attach_file_info doc_type='estimate02' COUNT 집계 (wace 패턴)
- 메일발송: mail_log INSERT API + 다이얼로그 (POST /sales/estimate/mail)
- 결재상태: contract_mgmt.approval_required='N' → '결재불필요' 표시
(vexplor_rps에 amaranth_approval 미도입 — 결재 모듈 통합은 차후)
- DataGrid renderType 'folder'/'clip' 신설 (lucide Folder/Paperclip)
- 견적현황·추가견적 컬럼이 wace 원본 그대로 파란/회색 아이콘 표시
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-07 17:53:48 +09:00
hjjeong
4175ae77c1
영업관리 wace 컬럼 정합성 강화 + project_mgmt 도입
...
- project_mgmt 테이블 신규(75컬럼/89건) — wace 운영 동일 schema 추출. 판매·매출관리 메인 테이블
- 판매·매출 SQL을 contract_item 기반 → project_mgmt 메인 + sales_registration LEFT JOIN으로 전면 재작성
* 요청납기 COALESCE(CI.due_date, T.due_date, CM.due_date) 패턴
* 환종/serial_no는 sales_registration 우선, contract_item_serial 집계 fallback
* 판매상태 wace 로직 한글 라벨(미판매/완판/분할판매) 동적 계산
* 매출관리는 shippingDateRequired EXISTS 필터로 출하 등록된 프로젝트만 표시
- 주문서: order_date 매핑 CONTRACT_DATE → ORDER_DATE 정정, 원화총액·고객사요청사항 SQL 추가
- 견적/주문/판매 page.tsx에서 wace 블록 주석 컬럼 제거(제품구분/국내·해외/접수일/반납사유 등 14개)
- 환종 raw 코드 → contract_currency_name 한글명 바인딩으로 정정
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-07 16:50:45 +09:00
hjjeong
1760045634
영업관리 4개 메뉴(견적/주문/판매/매출) 1차 이식 + 마스터 매핑
...
- wace_plm contract_mgmt/contract_item/contract_item_serial/contract_mgmt_option/estimate_template/estimate_template_item/mail_log/sales_registration/shipment_log 9개 테이블 DDL을 vexplor_rps에 적재, 운영 데이터 복사
- 거래처: Wehago/Amaranth ERP api16S11 INBOUND 동기화 결과(customer_code) 기준 LEFT JOIN으로 변경, 25/25 매칭
- 품목: wace part_mng 8,179건을 item_info(varchar id)에 wace objid 그대로 INSERT, contract_item 72/72 매칭
- 공통코드: wace comm_code 847건 복제 + backend SQL에 5종 LEFT JOIN
- DataGrid에 formatMoney(천단위콤마+소수점2자리) / formatNumber 자동 우측정렬 분리
- adminService.getUserMenuList company_code 분기 제거(RPS 단독), useMenu.buildMenuTree root 식별 보강
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-07 15:39:03 +09:00