Commit Graph

4602 Commits

Author SHA1 Message Date
hjjeong e51f5f7b69 구매관리 입고관리 입고등록 + 입고일별 마감정보입력 + 매입마감
- backend purchaseInboundService 신설 — getInboundFormInit / saveInboundForm
  (arrival_plan UPSERT 트랜잭션) / saveDeadlineInfo (8필드 일괄 UPDATE) /
  closeArrival (이미 마감된 건 차단) + listWarehouseOptions / listAcctCodeOptions
- backend routes — GET /inbound-form/:pomObjid / POST /inbound-form/save /
  POST /arrival/deadline / POST /arrival/close + 옵션 2개
- InboundFormDialog 신설 — wace deliveryAcceptanceFormPopUp_new.jsp 1:1
  (좌 발주품목 read-only + 우 차수별 입고입력 + 미입고 일괄적용)
- DeadlineInfoDialog 신설 — wace swal 모달 1:1 (8필드 일괄, 단건 시 prefill)
- inbound 페이지 입고등록 / inbound-by-date 마감정보입력+매입마감 연결
- 입고등록 master SELECT 함정 수정 — RPS 에 POM.delivery_status 없어 reception_status fallback
- DataGrid 다중 frozen 누적 left 계산 인프라 추가 (frozenLeftPx props 보강)
  — shadcn Table 기반이라 진짜 column pinning 불가 (자연 위치 도달 후 sticky),
    입고 3페이지의 frozen 부여는 일단 제거. 진짜 pinning 은 별도 작업
2026-05-20 10:04:39 +09:00
hjjeong 17b08c7a09 구매관리 발주서 메일 발송 + PDF 다운로드 + 행추가/삭제 제거
- backend purchaseOrderMailService 신설 — getOrderMailInfo / getPartnerManagerList /
  sendOrderMail (SMTP PURCHASE, 발송 성공 시 mail_send_yn='Y'/mail_send_date 갱신)
- backend routes — GET /order-form/mail-info/:objid, POST /order-form/mail,
  GET /options/partner-managers/:partnerObjid
- frontend lib/utils/purchaseOrderPdf — html2canvas-pro + jsPDF (A4, scale=2,
  input/textarea → 텍스트 변환). download:true 면 파일 저장, 아니면 base64 반환
- PurchaseOrderMailDialog 신설 — EstimateMailDialog 패턴 단순화 (한글/영문 본문 분기,
  공급업체 단일 email 자동 채움)
- 3개 양식 다이얼로그 — 읽기전용 + 저장된 발주서일 때 "메일 발송" + "PDF 다운로드"
  버튼 노출. window.print 간이판 제거
- 3개 양식 다이얼로그 — "행 추가"/"선택 행 삭제" 버튼 + 그리드 체크박스 컬럼 제거
  (wace 운영판은 모두 주석 처리/부재. 발주서는 품의서에서 자동 채움된 품목 그대로 사용)
2026-05-19 14:57:47 +09:00
hjjeong 8258c2f0cf 구매관리 발주서 _outsourcing/_english 양식 + 양식 선택 모달
- 양식 선택 모달 신설 (운영판 wace 1:1: 일반/외주가공/영문/취소)
- 외주가공 발주서 다이얼로그 — 타이틀 변경, 좌 4필드, 그리드 WORK_ORDER_NO/업체명/제품명/부품명
- 영문 발주서 다이얼로그 — 영문 헤더, 2열 5행 필드(Shipment/Attn.to/Packing/Validity/Remarks),
  CURRENCY 컬럼, TOTAL, 서명영역(stamp_seal)
- proposal 발주서생성 → 양식 선택 모달, order 행클릭 → row.form_type 자동 분기
- listVendorOptions: client_mng.status 컬럼 부재로 빈배열 반환 → use_yn 사용 (RPS 함정)
- listUserOptions: name/position/phone/email alias 추가 (담당자 select 자동 채움)
- init API: USER_INFO 에서 안동윤/서동민 user_id lookup → sales_mng_user_id 자동 채움
2026-05-19 14:12:33 +09:00
hjjeong 806153174c 구매관리 발주서 폼 로고/직인 + 읽기전용 모드
- 로고 이미지: 다이얼로그 상단 좌측 RPS 로고 (rps-logo-on.png 재사용, wace `images/logo.png` 1:1)
- 직인 이미지: 담당자1 phone/email 행 절대위치 (rps-stamp-seal.png, wace `images/stamp_seal.png` 가져옴, onError hide)
- 읽기전용 모드: APPR_STATUS='결재중'/'결재완료' 또는 STATUS='cancel' 일 때
  - 마스터 폼 4필드(발주일자/수신업체/결제방식/담당자1·2) + 그리드 편집 셀 + 체크박스 disabled
  - 행 추가/삭제/저장 버튼 숨김 → '발주서다운'(window.print) 으로 교체
  - 상단 amber 배너로 사유(결재상태/취소) 안내
- MasterState.appr_status 필드 추가 (백엔드 응답 그대로 매핑)

wace _general.jsp isModify 분기(10~17줄) + 직인 절대위치(878줄) + 버튼 영역(941~948줄) 1:1.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 13:16:37 +09:00
hjjeong e48bd83667 구매관리 발주서 폼 저장/삭제 + general 양식 다이얼로그
- 백엔드: POST /api/purchase/order-form/save (마스터 55 + 파트 40 컬럼 UPSERT + 삭제파트 cascade, 트랜잭션, wace mergePurchaseOrderMaster/PartInfo 1:1)
- 백엔드: DELETE /api/purchase/order-form/:objid (마스터+파트 cascade)
- 프론트 lib/api: initOrderForm/getOrderForm/saveOrderForm/deleteOrderForm
- 프론트 컴포넌트: PurchaseOrderGeneralFormDialog — wace purchaseOrderFormPopup_general.jsp 1:1 (좌 5필드/우 담당자 + 회사정보 2줄/그리드 10컬럼/총공급가액/보안문구)
- /purchase/proposal "발주서생성" 버튼 활성화 → 품의서 자동 채움 다이얼로그
- /purchase/order 행 클릭/체크 → 수정/삭제 액션 + 다이얼로그
- Radix UI 접근성: DialogTitle/Description sr-only 처리

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 13:06:18 +09:00
hjjeong 6a0705c5b7 Merge pull request 'hjjeong' (#16) from hjjeong into main
Reviewed-on: https://g.wace.me/chpark/vexplor_rps/pulls/16
2026-05-19 02:53:51 +00:00
hjjeong 6f73631c7c 구매관리 발주서관리 통합 + 폼 GET API + PageHeader 컨벤션
발주서관리 리스트:
- /purchase/order-wace 임시 라우트 → /purchase/order 통합 (기존 vexplor
  변형판 대체). order-wace 폴더 삭제.
- 백엔드 라우트 /order-wace → /order-list, 함수 listPurchaseOrderWace →
  listPurchaseOrderList, API 클라이언트 listOrderWace → listOrder.

발주서 폼 (general 양식) GET API:
- services/purchaseOrderFormService.ts 신규 (getPurchaseOrderFormInit,
  getPurchaseOrderForm). 품의서 자동채움 = salesMng.getProposalPartList
  매퍼 1:1 → 발주 그리드 형식 변환. 발주번호 채번 RPS{YY}-{MMDD}-{NN}.
- 컨트롤러/라우트: GET /api/purchase/order-form/init?proposal_objid=...
  + /api/purchase/order-form/:objid.
- RPS는 OBJID가 varchar라 wace numeric 캐스트 모두 제거.

PageHeader 컨벤션 일괄 변경:
- 자동매칭이 매칭된 menu의 parent_obj_id로 부모를 찾아
  "{부모}_{자식}" 형식 표기 (wace 컨벤션). 부모가 루트 그룹이면 자식만.
- description prop과 렌더링 완전 제거 (사용처 없음 확인).
- 모든 메뉴 페이지에 일괄 적용.

DB(별도): menu_info 9857401373575 + rel_menu_auth 3건 제거.
저장/삭제 API + 프론트 다이얼로그는 다음 세션.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 11:47:38 +09:00
hjjeong aacbb62ad8 자재관리 2메뉴 풀-CRUD + 액션 (자재리스트 + 불출의뢰서)
- 신규 테이블 5종 (운영 11133 → RPS 11134 DDL 1:1):
  inventory_mgmt / inventory_mgmt_in / inventory_mgmt_out /
  inventory_mgmt_out_master / inventory_mgmt_history
- 백엔드 /api/inventory-mng — 리스트·재고등록·자재이동·삭제·이력 +
  불출의뢰 생성·접수·자재불출(재고 차감)·삭제. 채번 Rfw-YYYY-seq.
- 프론트 /COMPANY_16/material/{list, issue-request} +
  StockRegister / MaterialMove / IssueRequestCreate /
  InventoryHistory / IssueDispatch 다이얼로그 5종.
- AdminPageRenderer 등록 + /material/ prefix.
2026-05-19 11:25:15 +09:00
chpark cf6e592618 docs(manual): 외부 커넥션·결재상신·화면 디자이너 상세 가이드 추가
새 섹션 + 화면 목업(ASCII) 으로 핵심 기능 사용법 보강:

§4 Amaranth(ERP) 연계 확장
 - 4.1 외부 커넥션 관리 — 페이지 레이아웃 ASCII 목업 + 등록 7종 표
 - 4.2 REST API 신규 등록 가이드 — 4 STEP (모달 화면 / 필드 설명 /
   [테스트] 검증 / 백엔드 활용). accessToken·hashKey 자동 암호화 동작.
 - 4.3 결재상신 워크플로 (사용자 시점) — 견적관리 그리드 → SweetAlert →
   Amaranth 결재창 → webhook 까지 ASCII 흐름도 + 가드 6조건 표 +
   백엔드 내부 11단계.

§6 화면 관리 — 사용자 정의 화면 만들기 (신규)
 - 6.1 화면 디자이너 개요 — 카드 레이아웃 목업 (테이블/버튼/플로우/미리보기)
 - 6.2 신규 화면 4 STEP (기본정보→테이블 매핑→버튼 추가→저장)
 - 6.3 조인/다중 테이블 매핑
 - 6.4 버튼 타입 6종 (MODAL/EDIT/DELETE/OPENMODALWITHDATA/FLOW/EXTERNAL)
   + 플로우 편집기(DataFlowDesigner) 노드 흐름
 - 6.5 데이터 흐름 — 견적→수주, 수주→출하 등 화면간 자동 연계

§9 FAQ — REST API 테스트 실패 / 새 화면 메뉴 누락 / 사용자 정의 저장 실패
3건 추가.

기존 §6 품질관리 → §7, §7 공통UI → §8, §8 FAQ → §9 로 재번호.
2026-05-15 17:05:28 +09:00
chpark 0fc2d699a4 docs(manual): RPS PLM 시스템 사용자 메뉴얼 (HTML) — 8장 구성
- 시스템 개요 / 전체 메뉴 구조 (10개 모듈 매트릭스)
- 업무 프로세스 흐름 — 영업→개발→구매→생산→품질→매출
- Amaranth(ERP) 연계 — 외부 커넥션 7종, 결재상신 11단계 워크플로,
  auth_config 암호화/복호화, 결재 상태 코드, 문제 해결 FAQ
- 대시보드 관리 — 사용자 대시보드 / 3종 모니터링 보드 / 관리자 위젯
- 품질관리 4메뉴 상세 (필터·컬럼·자동 산정 로직)
- 공통 UI (DataGrid / CompactFilterBar / PageHeader) 사용법
- 자주 묻는 질문 5건

self-contained HTML, 좌측 sticky 목차 + 인쇄 친화 CSS.
2026-05-15 16:47:00 +09:00
hjjeong 1b1231d9a9 구매관리 발주서관리 wace 1:1 리스트 페이지 진입
기존 /purchase/order(vexplor 변형판)는 보존하고 wace_plm purchaseOrderList_new
1:1 재이식을 /purchase/order-wace 로 분리 진입. 백엔드 listPurchaseOrderWace
(purchaseOrderMasterList_new 매퍼) + 15개 검색필터/그리드 컬럼 매핑.

- services/purchaseService.ts listPurchaseOrderWace 추가 (POM + APPROVAL/ROUTE
  + PROJECT_MGMT + SALES_REQUEST_MASTER 조인, mail_send_yn 3분기, MULTI 마스터
  필터 등 wace 매퍼 본문 1:1)
- controllers/purchaseController.ts + routes/purchaseRoutes.ts wire-up
  (GET /api/purchase/order-wace)
- lib/api/purchase.ts listOrderWace + category_cd 필드
- app/(main)/COMPANY_16/purchase/order-wace/page.tsx 신규 — wace JSP 검색폼
  2행(14필드) + 그리드 15컬럼, comm_code 그룹 0000167/0000001/0001814 옵션 로딩

DB 마이그레이션(별도): menu_info objid=9857401373575 + rel_menu_auth 3건은
별 세션의 메뉴 동기화 흐름 사용.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 16:28:11 +09:00
chpark 45cd7db199 견적관리 결재상신 — 외부 커넥션 'Amaranth - 결재' auth_config 자동 복호화
Build and Push Images / build-and-push (push) Has been cancelled
증상:
 - 견적관리에서 결재상신 클릭 시 SSO URL 발급 실패. external_rest_api_connections
   테이블의 accessToken/hashKey 가 AES-256-GCM 으로 암호화되어 저장되는데
   amaranthApprovalClient.loadApprovalConnection() 가 평문 그대로 사용함.

수정:
 - ExternalRestApiConnectionService.encryptSensitiveData/decryptSensitiveData 와
   동일한 알고리즘(aes-256-gcm, scrypt(DB_PASSWORD_SECRET,'salt',32)) 으로 복호화
   하는 tryDecrypt 헬퍼를 amaranthApprovalClient 내부에 추가.
 - loadApprovalConnection 에서 accessToken/hashKey 만 자동 복호화
   (callerName/groupSeq 는 평문 저장이므로 그대로).
 - 'iv:authTag:cipher' 3-part 형식이 아니면 평문으로 간주(마이그레이션 호환).

검증:
 - 복호화 후 accessToken='MN5KzKBWRAa92BPxDlRLl3GcsxeZXc' / hashKey='2251910...'
   로 wace_plm AmaranthApprovalApiClient.java 의 하드코딩 값과 일치 확인.
2026-05-15 16:12:22 +09:00
hjjeong 8acfcdf430 구매관리 7메뉴 품명 컬럼 너비 180~200 → 280px 통일
CARBON BRUSH ASSY (US Spindle V2) 같은 긴 영문 품명이 잘려 보이는 문제 해소.
구매리스트 / 견적요청서 / 품의서 / 입고관리 / 품목별·입고일별 / 프로젝트별 발주입고 현황.
2026-05-15 16:02:41 +09:00
hjjeong 95e0a66290 listProjectStatus mbom_detail.qty 캐스트 오류 수정
NULLIF(MD.QTY, '')::numeric 패턴은 numeric 컬럼을 빈 문자열과 비교하여
"invalid input syntax for type numeric" 에러 발생 → 전체 SELECT 실패 → 빈 그리드.
MD.QTY 만 사용 (이미 numeric, SUM은 NULL safe).
2026-05-15 15:55:19 +09:00
hjjeong c2e364207e 구매관리 입고 3메뉴 + 프로젝트 발주/입고 통계 빈 그리드 채움
- DDL: purchase_order_part(43 cols) + arrival_plan(37 cols) + POM 보충 컬럼 10개
  (mail_send_yn/date, form_type, purchase_close_date 등)
- 데이터: 운영 sample purchase_order_master 1건 + part 1건 + arrival_plan 1건
- listInbound — wace deliveryMngList_new 매퍼 1:1 (POM + S1 집계, AP × POP)
- listInboundByItem — wace deliveryMngPartList 매퍼 1:1 (품목별)
- listInboundByDate — wace purchaseCloseList 매퍼 1:1 (입고일별 + 매입마감)
- listProjectStatus — PO/DLV 통계 0 → 실데이터 (purchase_order_part + arrival_plan)
- INVENTORY_MGMT / INCOMING_INSPECTION 미존재 → 검사/폐기 0 처리 (확정수량=입고수량)
2026-05-15 15:51:22 +09:00
hjjeong 6b029e20f9 구매관리 견적요청서 빈 그리드 채움 (quotation_request_master/detail 신설)
- DDL: quotation_request_master(14 cols) + quotation_request_detail(15 cols)
  운영 → RPS 타입 차이: numeric objid → varchar(64), detail.part_objid bigint(part_mng FK)
- 데이터: 운영 sample master 4건 / detail 4건 (sales_request_part 미존재 → NULL fallback)
- 백엔드 listQuotationRequest — wace salesMng.xml:5248-5349 매퍼 1:1
  (vendor → client_mng JOIN, attach_file_info QUOTATION_RECEIVED 카운트)
- listVendorOptions(client_mng) 신규 — 발주서 vendor 옵션이 supply_mng 와 분리됨
- listPurchaseRequest.has_quotation_request 분기 활성화
- quote-request page.tsx UI 문자열 내부 참조 제거, vendor 옵션 client_mng 로 교체
2026-05-15 15:32:05 +09:00
hjjeong 30a891f4b8 Merge pull request 'hjjeong' (#15) from hjjeong into main
Build and Push Images / build-and-push (push) Has been cancelled
Reviewed-on: https://g.wace.me/chpark/vexplor_rps/pulls/15
2026-05-15 06:08:31 +00:00
hjjeong 0658630c68 Merge remote-tracking branch 'origin/main' into hjjeong
# Conflicts:
#	frontend/components/common/CompactFilterBar.tsx
2026-05-15 14:55:52 +09:00
hjjeong 0fe71298d2 공용 NumberInput + 숫자 포맷 정책 적용 (수량 1,234 / 금액 1,234.00)
- NumberInput 공용 컴포넌트: blur 시 콤마+소수점 자릿수 강제,
  focus 시 raw 숫자로 전환되어 자유 편집, 잘못된 입력은 이전 값 유지.
- 다이얼로그 수량/단가 input → NumberInput 으로 교체.
- 백엔드 정규화 — M-BOM/detail/proposal-targets:
  qty=FLOOR()::INTEGER, unit_price/partner_price/total_price=NUMERIC(18,2)
  (운영 sales_request_part 는 정수 String 이지만 M-BOM production_qty
   NUMERIC(15,4) 가 흘러들어와 '4.0000' 노출되던 문제 차단).
- ProposalCreateDialog fmt: Math.floor 후 ko-KR toLocaleString.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 14:52:50 +09:00
hjjeong 1fb438bdcb 공용 DateInput + DataGrid 헤더 가독성 + 구매요청서 수정모드/공급업체 옵션
- 공용 DateInput (YYYY-MM-DD 통일): text input + Popover Calendar,
  숫자 8자리 자동 - 삽입. CompactDateRange / 다이얼로그 입고요청일 적용.
- DataGrid 헤더 라벨 truncate + TableHead 패딩 축소(!px-1.5):
  좁은 컬럼에서 라벨 겹침/잘림 해소.
- 구매요청서관리 그리드 컬럼 너비 합리화 (총 ~300px 절감)로 품명까지
  화면 안에 표시.
- 구매요청서 수정모드: 선택 1건 시 [구매요청서수정] 분기 →
  getDetail 로 헤더/라인 채워 다이얼로그 오픈. 확정·품의서생성 가드.
- 공급업체 옵션을 client_mng 기반 listVendorOptions 로 신설
  (운영 supply_mng=0 / client_mng=8946, M-BOM vendor 매칭).
- 주문유형 CommCodeSelect groupId 0000005 → 0000167 (계약구분).
- 고객사 셀렉트 → CustomerSelect 공용 컴포넌트로 교체.
- 그리드 delivery_request_date 점 형식 → YYYY-MM-DD 정규화.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 14:40:28 +09:00
hjjeong 75f4ca8127 영업관리 구매요청 2메뉴 액션 완성 + SmartSelect 키보드 네비
- sales_request_part DDL 추출(운영 11133)→RPS(11134) 마이그레이션
- 백엔드 6 엔드포인트: 프로젝트 자동채움/M-BOM 품목/저장/품의서생성/SSO
  · 품의서 결재상신 Amaranth SSO (target_type=PROPOSAL, formId=1163)
- 프론트 다이얼로그 2개 (구매요청서작성 / 품의서생성 확인)
  · 프로젝트 선택→주문유형·제품구분·국내외·고객사·유무상 자동 채움
  · 행추가 시 M-BOM 품번 셀렉트→품명/공급업체/단가 자동 셋팅
- 공용 SmartSelect: ↑↓·Enter·Esc·Home·End·PageUp·Down 키보드 네비
- 그리드 delivery_request_date . → - 형식 정규화

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 14:01:26 +09:00
chpark c61cf8af99 CompactDateRange — onClick/onFocus 에 showPicker() 강제 호출로 입력칸 클릭 시 달력 표시
Build and Push Images / build-and-push (push) Has been cancelled
2026-05-15 13:52:21 +09:00
chpark a6f3b7b4b7 품질관리 — vexplor_rps DB 컬럼명 정합 + 날짜/조인 타입 수정
Build and Push Images / build-and-push (push) Has been cancelled
vexplor_rps 의 purchase_order_master / sales_request_master / client_mng /
code_info 가 wace_plm 의 컬럼명과 다른 부분을 정합.

수정:
 - pom.contract_objid       → pom.contract_mgmt_objid
 - pom.product_cd           → pom.product_code
 - pom.part_objid           → 부재 (part_mng 조인 FALSE 처리, part_no/name 빈값)
 - srm.proposal_no          → srm.request_mng_no
 - code_info: ci.objid 조인 → ci.code_value = pom.product_code
 - client_mng.partner_name  → client.client_nm

날짜 컬럼 타입 차이 처리:
 - process_inspection_master.inspection_date (varchar) + inspector_id 빈값 → reg_date / writer fallback
 - pms_quality_semi_product_inspection.inspection_date (date) → COALESCE + TO_CHAR
 - incoming_inspection_detail.inspection_date (varchar) + reg_date fallback

데이터:
 - purchase_order_master 1행 waceplm → vexplor_rps 복사 (수입검사 요청 활성화)

수입검사 진행 필터에서 inspection_yn='검사' 하드코딩 제거(이전 커밋)로
'스킵' 행도 노출됨.
2026-05-15 12:25:38 +09:00
hjjeong 3db55d9fd9 구매요청 2메뉴 경로 정렬 + UI 문자열 정리 + 이식 문서 추가
페이지 경로 이동 (menu_info 등록 경로와 일치)
- sales/purchase-request → purchase-request/request (구매요청서관리)
- sales/purchase-proposal → purchase-request/proposal (품의서관리)
- 사이드바 '구매요청' top-level 그룹(objid=100025) 하위 2개 메뉴와 1:1 매칭

UI 문자열 정리
- PageHeader description 2곳에서 wace 매퍼명 노출 제거
- 미구현 액션 toast 3개를 일반 안내문으로 교체 ("XXX 기능은 준비 중입니다.")

문서
- docs/migration/sales/09-purchase-request.md 신규 — 두 메뉴 매핑/컬럼/SQL 정합성/구매관리>품의서관리와의 차이/백로그
- docs/migration/sales/README.md — 이식 대상 4개 → 6개, 매핑표/다음작업 갱신

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 12:24:00 +09:00
chpark 83a774f0f5 품질관리 — waceplm 운영 DB 스키마/데이터 1:1 동기화 + incoming-mgmt 필터 완화
Build and Push Images / build-and-push (push) Has been cancelled
스키마 재정합 (docs/migration/quality/03_waceplm_quality_sync.sql):
 - waceplm.esgrin.com 운영(211.115.91.141:11133/waceplm) 스키마 그대로 이식
 - 기존 bigserial PK 5개 테이블 DROP 후 varchar(50) PK 로 재생성
 - customer_cs, pms_quality_ecr 신규 추가

데이터 복사 (waceplm → vexplor_rps, 126행):
 - customer_cs                              24
 - process_inspection_master                3
 - process_inspection_detail                13
 - incoming_inspection_detail               1
 - pms_quality_semi_product_inspection      84
 - pms_quality_ecr                          1

backend qualityRoutes.ts:
 - incoming-mgmt 의 inspection_yn='검사' 하드코딩 필터를 1=1 로 완화.
   '스킵' 행도 검사 진행 화면에 노출. 완료 건만 보려면 search_inspection_status='완료'.
2026-05-15 12:02:51 +09:00
hjjeong 748fde3d3d docs(migration): 27개 메뉴 통합 진행 상태 README — 6도메인 매트릭스
영업4 + 구매요청2 + 프로젝트2 + 개발5 + 구매9 + 생산5 = 27개 메뉴 한눈에:
 - 매트릭스: 완료17 / 🟡베이스7 / 🟠빈그리드3
 - 도메인별 진행 상태 + 대표 커밋 + 상세문서 링크
 - 공통 인프라(공용 컴포넌트/마이그레이션 패턴/결재/채번)
 - 핵심 정책 8종 + 도메인 함정 8종
 - 다음 작업 우선순위 6종 + 인덱스

품질관리(chpark 베이스, d7c645d2)는 부록으로만 언급.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 11:57:33 +09:00
chpark c74e742b6f 품질관리 4메뉴 — wace_plm JSP + quality.xml MyBatis 1:1 재정합
Build and Push Images / build-and-push (push) Has been cancelled
수입검사 요청 (incoming-request):
 - 필터 12종 (품의서/발주서/프로젝트/품번/품명/공급업체/입고결과/제품구분/
   검사여부/요청현황/요청자/요청일범위)
 - 그리드 12컬럼 (proposal_no, purchase_order_no, project_no, product_name,
   part_no, part_name, partner_name, delivery_status, request_date,
   request_user_name, inspection_yn, request_status)
 - 백엔드: purchase_order_master + incoming_inspection_detail LEFT JOIN
   + sales_request_master + contract_mgmt + part_mng + user_info

수입검사 진행 (incoming-mgmt):
 - 필터 11종 (수입요청과 유사 + 검사일범위 + 검사현황)
 - 그리드 19컬럼 (검사일/검사자/품의서/발주서/프로젝트/제품구분/품명모델/
   부품품번/부품명/공급업체/입고일/입고수량/입고결과/검사수량/불량수량/
   불량률/검사현황/검사성적서)
 - SUM(defect_qty) 서브쿼리로 불량률 자동 계산
 - 하단 요약: 총 입고수량/검사수량/불량수량

공정검사 관리 (process-inspection):
 - 필터 10종 (프로젝트/제품구분/품번/품명/작업환경/측정기/검사일범위/
   검사자/검사결과/진행공정)
 - 그리드 9컬럼 (검사일/검사자/프로젝트/제품구분/품번/품명/검사수량합계/
   검사결과/첨부파일)
 - master/detail 집계 + EXISTS 필터로 wace 1:1

반제품검사 관리 (semi-product-inspection):
 - 필터 8종 (모델명/작업지시번호/부품품번/부품명/검사일범위/검사자/
   불량유형/귀책부서)
 - 그리드 14컬럼 (검사일/검사자/제품구분/모델명/작업지시번호/부품품번/
   부품명/입고수량/양품수량/불량수량/불량률/재생수량/최종양품수량)
 - data_type='GOOD' 마스터 + 동일 inspection_group_id 의 'DEFECT' SUM
 - 재생수량(disposition_type='수정완료') + 최종양품수량 자동 산정
 - 하단 요약: 5개 합계 카드

frontend/lib/api/quality.ts 타입 1:1 정합, 모든 필터 파라미터 직렬화.
2026-05-15 11:23:46 +09:00
hjjeong 21cd81bd79 docs(production): 생산관리 README 신규 — 5메뉴 + PR-B5+ BOM 복사 + 매퍼 매핑
sales/README.md 패턴 따라 생산관리 도메인 전체 문서화:
 - 정책: 5개 메뉴(M-BOM/계획실적×2/소요량×2)가 전부, vexplor 잔재(bom/plan-management/process-info/result/work-instruction) 제외
 - 메뉴 매핑표 + 도메인 테이블 + data-sync/ddl-extracted 인덱스
 - productionplanning.xml 23개 매퍼 → mbomService/prodPlanResultService/mbomRequirementService 1:1 표
 - PR-A0~B5+ 진행 흐름 + 대표 커밋
 - 5메뉴 1:1 검증 결과(Agent 5병렬, 2026-05-15)
 - PR-B5+ BOM 복사 다이얼로그 상세 (BomCopyDialog, 도면업로드 차이 명시)
 - 다음 작업 후보 6종

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 11:14:20 +09:00
hjjeong 6368258797 생산관리 M-BOM PR-B5+ — BOM 복사 다이얼로그 (운영 structureBomCopyFormPopup 1:1)
5개 메뉴 1:1 검증(Agent 5병렬) 후 발견된 mbom 메인 그리드 [BOM 복사] 누락 보완.
저장 매퍼는 PR-B5 saveBomAssignment 재사용 — 백엔드는 EBOM/MBOM 분기 이미 지원,
이번에 MBOM UI 진입점도 첫 노출.

신규 컴포넌트:
 - BomCopyDialog.tsx — 품번/품명 readonly + E-BOM/M-BOM 셀렉트 상호배타 +
   트리 미리보기 + AttachFileDropZone (docType=MBOM_DRAWING, accept=.stp,.step,.dwg,.dxf,.pdf)
 - 메인 page.tsx [BOM 복사] 버튼 추가 + 체크 단건 검증 +
   Machine(0000928) 외 동일 partNo 최신 M-BOM 자동 추천

신규 백엔드 (mbomService/Controller/Routes):
 - searchAssignableMboms — 매퍼 productionplanning.getMbomListForSelect2 (4007~4014) 1:1
 - previewMbomTree     — getStructureOnly + finalize("ASSIGNED_MBOM")
 - getLatestMbomByPartNo — 매퍼 getLatestMbomByPartNo (3426~3445) 1:1, Machine 외 자동 검색
 - 라우트: GET /assignable-mboms, GET /mbom-preview/:objid, GET /latest-mbom-by-partno/:partNo

도면 업로드 차이: 운영 fn_uploadDrawingFiles 는 placeholder("구현 예정"). RPS 는
공용 AttachFileDropZone 재사용해 실구현 (target_objid=projectObjid).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 10:53:35 +09:00
hjjeong 7e7c6a0ac0 영업관리 구매요청서관리·품의서관리 신규 2메뉴 (wace_plm 1:1)
backend
- services/salesPurchaseRequestService.ts: listPurchaseRequestReg(DOC_TYPE='PURCHASE_REG') + listPurchaseRegProposal(DOC_TYPE='PURCHASE_REG_PROPOSAL')
  · 구매요청서 상태 CASE: PURCHASE_REG_PROPOSAL 자식 존재 시 '품의서생성' → '확정'/'작성중' (wace 매퍼 1:1)
  · 품의서 결재상태: amaranth_approval(target_type='PROPOSAL') LEFT JOIN 우선순위
  · sales_request_part 누락 → MBOM_DETAIL+PART_MNG fallback (구매관리 패턴 동일)
- routes/salesPurchaseRequestRoutes.ts + app.ts: /api/sales/purchase-request, /api/sales/purchase-proposal

frontend
- lib/api/salesPurchaseRequest.ts
- sales/purchase-request/page.tsx — 14컬럼, 구매요청서작성/품의서생성 액션 (placeholder 토스트)
- sales/purchase-proposal/page.tsx — 10컬럼, 결재상신 액션 (placeholder 토스트)
- PageHeader+CompactFilterBar+SmartSelect+DataGrid logicstudio 6종 패턴 일관 적용

구매관리>품의서관리 vs 영업관리>품의서관리 차이
- 구매관리: DOC_TYPE in ('PROPOSAL', 'PURCHASE_REG_PROPOSAL'(결재완료만)) → 발주서 생성 풀
- 영업관리: DOC_TYPE='PURCHASE_REG_PROPOSAL' 전용 → 결재상신 화면 (결재완료 시 구매관리로 자동 노출)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 10:04:37 +09:00
hjjeong e785cd8a98 Merge pull request 'hjjeong' (#14) from hjjeong into main
Reviewed-on: https://g.wace.me/chpark/vexplor_rps/pulls/14
2026-05-15 00:25:12 +00:00
chpark d7c645d24c 품질관리/고객CS/ECR — wace_plm 1:1 이식 + 견적관리 그리드 패턴 통일
Build and Push Images / build-and-push (push) Has been cancelled
신규 4개 메뉴 (PageHeader + CompactFilterBar + DataGrid 통일):
 - 품질관리/수입검사 요청 (/quality/incoming-request)
 - 품질관리/수입검사 관리 (/quality/incoming-mgmt)
 - 품질관리/공정검사 관리 (/quality/process-inspection)
 - 품질관리/반제품검사 관리 (/quality/semi-product-inspection)

DB 마이그레이션 (docs/migration/quality/):
 - 01_quality_tables_from_ilshin.sql — ilshin 운영 5개 테이블 vexplor_rps 정합
   (customer_service_mgmt/part/workingtime, inspection_mgmt, delivery_history_defect)
   + ecr_mng 7개 컬럼 동기화 (project_no, customer_cd, equip_name,
     design_dept, unit_cd, memo, check_result)
 - 02_wace_plm_quality_tables.sql — wace_plm quality.xml 매퍼 호환 신규 5개 테이블
   (incoming_inspection_detail/defect, process_inspection_master/detail,
    pms_quality_semi_product_inspection) + 인덱스 정의

백엔드:
 - qualityRoutes.ts — 4개 메뉴 list 엔드포인트 (실 테이블 조회)
 - ecrMngService SELECT_BASE 에 ilshin 신규 7컬럼 노출
 - app.ts 라우팅 등록 (/api/quality/*)

프론트:
 - DataGrid 4개 신규 페이지 + 그리드 툴바 (차트/엑셀/새로고침/컬럼설정/페이지사이즈)
 - customer-cs/cs, ecr/ecr — 견적관리와 동일한 PageHeader + CompactFilterBar
   + DataGrid 패턴으로 리팩토링 (다이얼로그/기존 API 유지)
 - ECR 그리드에 신규 6개 컬럼 추가 (설비명/프로젝트번호/고객사/설계부서/조치결과 등)
 - AdminPageRenderer 4개 라우트 등록

데이터 복사: ilshin → vexplor_rps (workingtime 5건, inspection_mgmt 1건,
ecr_mng 1건). 나머지 ilshin 운영 테이블은 0건이므로 스키마만 정합.
2026-05-14 19:08:15 +09:00
hjjeong c83a73a111 생산관리 4개 메뉴 보정 — 디렉토리/그리드 헤더/소요량 SQL
디렉토리 rename (menu_info 등록 URL 일치)
- prod-plan-result → plan-result
- prod-plan-result-equip → plan-result-equip
- semi-product-requirement → semi-product-req
- raw-material-requirement → raw-material-req
- menu_info objid 100033~100036 이 가리키는 URL 과 1:1 매칭 + gridId 동기화

DataGrid 헤더 잘림/한 글자 깨짐 수정
- 헤더 라벨 span: whitespace-nowrap + title (이전 break-words 가 한글 단어를 글자 단위로 wrap 시키던 문제 제거)
- 부모 컨테이너 overflow-hidden 도 제거 — 좁은 컬럼에서도 글자가 한 줄로 자연스럽게 표시
- plan-result / plan-result-equip 좁은 컬럼 너비 보정 (수주/추가생산/총생산/완조립/등록자/진척율)

반제품/원자재 소요량 numeric 캐스팅 에러 수정
- RPS DB mbom_detail.qty/required_qty 는 numeric(15,4) — wace_plm 의 varchar 패턴(NULLIF 후 ::INTEGER) 적용 시 invalid input syntax 발생
- COALESCE(MD.QTY, 1)::INTEGER / COALESCE(MD.REQUIRED_QTY, 0)::NUMERIC 으로 교체
2026-05-14 18:13:26 +09:00
hjjeong bd47ca80df 생산관리 M-BOM PR-B5+ — BOM 할당 다이얼로그 운영판 1:1 재구성 + 미리보기 트리
운영판 mBomEbomSelectPopup.jsp (324 lines) 1:1 레이아웃:
  · 헤더 — "E-BOM 선택" / "E-BOM 상세 및 변경" 토글 제목 + 우측 [E-BOM 변경] 버튼
  · 현재 할당된 E-BOM 정보 카드 — 2×3 table (제품구분/품번/품명/Ver/등록일/작성자)
  · 리스트 토글 — 할당된 경우 변경 모드 ON 시에만 노출
  · 검색폼 운영판 매칭 — 제품구분(SmartSelect) + 품번 + 품명 + 등록일(범위)
  · 리스트 헤더 우측 [조회][E-BOM 할당] 버튼 (footer 제거)
  · 선택 시 하단 미리보기 트리 자동 로드 (read-only, 동적 LEVEL + 폴더아이콘)

신규 백엔드:
  · mbomService.previewEbomTree(bomReportObjid) — EBOM_WORKING_TREE_SQL 재사용
  · GET /api/production/mbom/ebom-preview/:bomReportObjid
  · searchAssignableEboms 필터: material/supplier → product_cd/from_date/to_date 운영판 매칭
  · objid 단건 필터 추가 — 현재 할당 E-BOM 카드 정보 자체 로드용

프론트:
  · MbomAssignDialog 완전 재작성 (full layout, SmartSelect, 미리보기 PreviewTree 컴포넌트)
  · MbomDetailDialog: currentEbomObjid prop 으로 단순화 (다이얼로그 내부에서 상세 fetch)
  · mbomApi.previewEbomTree + AssignableEbomFilter 타입 매칭

이전 b38f5957 의 PR-B5 베이스(검색/할당) 위에 운영판 UX 정합 강화.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 18:13:10 +09:00
hjjeong b38f5957f2 구매관리 7메뉴 신규 + M-BOM PR-B3·B5 + 발주관리 DataGrid 통일 + 생산계획&실적 라우트
구매관리 (wace 1:1)
- backend: services/purchaseService.ts (7 list + 옵션 3종) + controllers/purchaseController.ts + routes/purchaseRoutes.ts (/api/purchase 마운트)
- frontend: lib/api/purchase.ts + 7 page.tsx (list/quote-request/proposal/inbound/inbound-by-item/inbound-by-date/project-status)
- 영업관리 4메뉴 DataGrid 패턴 통일 — pageSizeOptions=[10,15,20,50,100], emptyMessage, showColumnSettings/summaryStats/onRefresh/onDownload/showChart
- 마스터단독 데이터(sales_request_master, project_mgmt+mbom_detail) 노출, detail/part 누락 테이블 의존은 빈 그리드 + UI

발주관리 (purchase/order/page.tsx)
- EDataTable → DataGrid 교체 + logicstudio 6종 props + 날짜/숫자 pre-format

M-BOM PR-B3 — 구매리스트 생성 (wace createPurchaseListFromMBom.do 1:1)
- mbomService.createSalesRequest + controller + route POST /api/production/mbom/sales-request
- 단건 체크 + 1:1 강제 + R-YYYYMMDD-NNN 채번 + sales_request_master 단건 INSERT
- production/mbom/page.tsx 에 [구매리스트 생성] 버튼

M-BOM PR-B5 — BOM 할당 (mBomEbomSelectPopup.do)
- mbomService.searchAssignableEboms/assignBom + controller + routes
- MbomAssignDialog 신규, MbomDetailDialog 통합

생산관리 4메뉴 라우트 (생산계획&실적, 소요량)
- prodPlanResultService/Controller + productionPlanResultRoutes (planResult/mbomReq)
- mbomRequirementService + 4 page.tsx (prod-plan-result, prod-plan-result-equip, raw-material-requirement, semi-product-requirement)
- lib/api/prodPlanResult.ts

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 17:31:12 +09:00
hjjeong dee03f6024 생산관리 M-BOM PR-B2 — 본 편집 다이얼로그 행 추가/삭제 (팝업 방식)
행 추가: MbomAddPartDialog 신설 (devPartApi.list 재사용)
  · 품번/품명 검색 + 체크박스 multi-select + 페이지네이션
  · 선택 행 1개면 그 자식으로 추가, 없으면 root (level=1)

편집 모드 확장 (MbomDetailDialog):
  · 체크박스 컬럼(맨 왼쪽) + 전체 선택 토글
  · 선택 행 파란 배경, 새 행 초록 배경 (temp- prefix 식별)
  · toolbar [+ 행 추가] / [선택 삭제] 버튼 추가
  · 선택 삭제 — cascade(선택 + 하위) + 확인창

backend save() UPDATE 분기:
  · client temp- child_objid → 서버 발급 createObjId 매핑
    (객체 ID 안정성 + DB 에 임시 ID 잔존 방지 + 충돌 회피)
  · parent_objid 가 temp- 참조면 신규 ID 로 remap

운영판은 좌(M-BOM)+중앙(<<,>>,변경)+우(소스 트리) 3분할이지만
좌측 19컬럼이 좁아져 가로스크롤 강제되는 약점. 팝업 방식이
트리 풀너비 확보 + 모바일 친화 → 사용자 결정으로 팝업 채택.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 16:59:29 +09:00
hjjeong 8dd5f184ae 생산관리 M-BOM 변경이력 다이얼로그(PR-B4) + 그리드 컬럼 폭 다듬기
운영 productionplanning.getMbomHistory (3448~3470) 1:1 이식:
  · backend mbomService.getHistory(projectObjid) — project 단위 mbom_header 변경이력
    시간순 최신 우선, USER_INFO join 으로 변경자명 함께
  · GET /api/production/mbom/history/:projectObjid
  · frontend MbomHistoryDialog — 5컬럼 그리드(변경일시/유형/내용/변경자/M-BOM품번)
    CREATE=파란 뱃지, UPDATE=황색 뱃지, max-w-900px
  · MbomDetailDialog toolbar 에 "변경이력" 버튼 (편집 모드 아닐 때만 노출)

PR-B1 의 history 저장 결과를 사용자가 직접 확인할 수 있도록 보는 화면 마무리.

부수: production/mbom/page 그리드 컬럼 폭 정돈 + summaryStats(전체/페이지/수주합/M-BOM 비율).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 16:39:48 +09:00
hjjeong a6692c4e21 생산관리 — M-BOM 관리에 logicstudio 스타일 DataGrid 적용
PR-B1(7a7f4f03)에 이미 들어간 서버 페이지네이션 + folder 컬럼은 유지하고,
영업관리/개발관리 패턴의 toolbar + 통계만 얹는다.
구매관리 mbom 메뉴는 production/mbom 페이지 re-export 이므로 자동 적용.

추가 DataGrid props:
- showColumnSettings · summaryStats · showChart
- onRefresh = fetchList · onDownload = exportToExcel(현재 페이지 행만, 라벨 매핑)
- systemColumnKeys=["writer_name","mbom_regdate"]

summaryStats (페이지 기준 + 서버 total):
- 전체 건수(서버 total) / 페이지 건수 / 수주수량 합계 / M-BOM 저장 비율(N/M + %)

부수 정리:
- 부모 wrapper 영업관리 통일: flex h-full flex-col overflow-hidden p-2 gap-2
  + DataGrid 직접 자식으로 (min-h-0 flex-1 wrapper 제거)
- 컬럼 폭: ⋮⋮ 핸들 추가로 좁아진 4글자 한국어 라벨을 100~125px 로 보정

서버 페이지네이션 모드라 onDownload 는 현재 페이지만 export.
전체 export 가 필요하면 별 endpoint(서버에서 페이징 없는 전체 응답)와 함께 추가 가능.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 16:30:51 +09:00
chpark a5ddf852fc 로그인 — 자격증명 오류시 메시지 유지 및 LOGIN_FAILED 코드 처리
- /auth/login 401 응답은 인터셉터에서 리다이렉트하지 않고 그대로 반환해 호출부에서 에러 메시지를 표시하도록 수정
- apiCall에서 errorCode 추출 시 error.code 경로도 지원
- useLogin: errorCode === "LOGIN_FAILED"면 INVALID_CREDENTIALS 메시지 노출
2026-05-14 16:30:11 +09:00
hjjeong 430a511605 Merge pull request 'hjjeong' (#12) from hjjeong into main
Reviewed-on: https://g.wace.me/chpark/vexplor_rps/pulls/12
2026-05-14 07:26:59 +00:00
hjjeong 7a7f4f03b5 생산관리 M-BOM 본 편집(PR-B1) + 폴더 컬럼 + DataGrid 서버 페이지네이션 + bigint=varchar fix
PR-B1 본 편집/저장 (운영 saveMbom.do 1:1)
  · 매퍼 7종 1:1 (insert/updateMbomHeader, insert/updateMbomDetail,
    deleteMbomDetailByObjid, insertMbomHistory, updateProjectMbomStatus)
  · 신규 CREATE: createObjId + generateMbomNo(M-{partNo}-YYMMDD-NN) +
    child_objid 재매핑 + detail 일괄 insert + history(CREATE) + project_mgmt.mbom_status='Y'
  · 수정 UPDATE: 기존 mbom_header.objid UPSERT(insert/update/delete) + history(UPDATE)
  · POST /api/production/mbom/save (BEGIN/COMMIT/ROLLBACK 트랜잭션)
  · MbomDetailDialog: '본 편집' 토글 + 13개 셀 인라인 편집 + 저장/취소 가드

M-BOM 컬럼 폴더 아이콘
  · production/mbom/page.tsx: mbom_status 컬럼 → mbom_has(0/1) renderType=folder
  · onClick → MbomDetailDialog 오픈 (행 더블클릭도 그대로 유지)
  · 운영판 wace 견적/partMng 폴더 아이콘 패턴 1:1

DataGrid 서버 페이지네이션
  · props 신설: serverPaging/serverPage/serverPageSize/serverTotalItems
    + onPageChange/onPageSizeChange
  · 5메뉴 적용: production/mbom, development/change-list/ebom-regist/part-search/part-regist
  · pageSizeOptions=[10,15,20,50,100,200,500] 통일
  · 클라이언트 모드 하위호환 유지

bigint=varchar fix (mbom 트리 SQL 4종)
  · ATTACH_FILE_INFO 서브쿼리: P.OBJID(bigint) = F.TARGET_OBJID(varchar) → P.OBJID::varchar 캐스트
  · EBOM_WORKING_TREE_SQL INNER JOIN: P.OBJID = COALESCE(V.LAST_PART_OBJID,V.PART_NO) → ::varchar 캐스트
  · 사용자 보고: 폴더 클릭 시 'operator does not exist: bigint = character varying' 토스트

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 16:26:20 +09:00
hjjeong 3a5bcb5e3a 공용 — getDirectFileUrl 로컬 origin 을 NEXT_PUBLIC_API_URL fallback 으로
localhost/127.0.0.1 일 때 하드코딩된 http://localhost:8080 대신
NEXT_PUBLIC_API_URL 의 origin(/api suffix 제거) 을 우선 사용.
환경변수 없을 때만 기존 http://localhost:8080 으로 떨어짐.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 16:09:05 +09:00
hjjeong c955fe0dac 개발관리 — 5메뉴(PART/E-BOM/EO이력)에 logicstudio 스타일 DataGrid 적용
영업관리/프로젝트관리 패턴(fc959d88·6a181371)을 개발관리 5메뉴 전체로 확장.

공통 변경:
- 부모 wrapper 영업관리 통일: flex h-full flex-col overflow-hidden p-2 gap-2
  + DataGrid 를 직접 자식으로 (불필요한 min-h-0 flex-1 wrapper 제거)
- DataGrid props 확장:
  - showColumnSettings · paginationStyle="range" · pageSizeOptions=[10,15,20,50,100]
  - onRefresh = fetchList(또는 runQuery) · onDownload = exportToExcel(GRID_COLUMNS 라벨 매핑)
  - showChart
- 컬럼 폭: ⋮⋮ 드래그 핸들 추가로 좁아진 4글자 한국어/영문 라벨을 95~125px 로 보정

메뉴별 summaryStats:
- PART 등록(M1): 전체·페이지 건수 / 환산수량·개당수량·BOM 수량 합계
- PART 조회(M2): 전체·페이지 건수 / BOM 수량·환산수량·개당수량 합계
- E-BOM 등록(M3): 전체·페이지 건수 + 상태별(status_title) 분포 4종
- E-BOM 조회(M4): 모드(정/역전개) + 표시·원본 행 + MAX_LEVEL + 수량·항목수량 합계
- 설계변경 리스트(M5): 전체·페이지 건수 / 수량·변경수량 합계

systemColumnKeys 분리 (컬럼 설정의 데이터/시스템 그룹 구분):
- PART 등록: revision, status
- PART 조회: revision, eo_no
- E-BOM 등록: dept_user_name, reg_date, deploy_date, revision, status_title
- 설계변경: writer_name, his_reg_date_title

id 매핑 누락 보강 (350ddcd3 함정 재발 방지):
- ebom-search: gridData 에 child_objid 또는 인덱스 fallback id 부여
- change-list: rows 에 objid 또는 인덱스 fallback id 부여
- (PART/E-BOM 등록은 이미 gridRows 매핑 있음)

E-BOM 조회 특수:
- defaultPageSize=100, pageSizeOptions=[20,50,100,200,500] — BOM 트리 가독성
- onDownload 는 PageHeader 의 정/역전개 엑셀 버튼과 동일 동작(현재 direction)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 15:23:33 +09:00
hjjeong 350ddcd3b8 프로젝트관리 — DataGrid 행 id 매핑 누락 + selectedId 가드
증상:
프로젝트관리 진행관리/WBS 그리드의 모든 행이 회색(bg-accent) 으로 표시.
원인 추적 결과 DataGrid 의 isSelected 평가식 `selectedId === row.id` 가
selectedId 도 row.id 도 둘 다 undefined 일 때 `undefined === undefined` = true
가 되어 모든 행이 selected 상태로 잡힘 (memory: feedback_datagrid_id_mapping
함정의 또 다른 발현 — 영업관리는 항상 id 매핑이 있어 우연히 회피).

수정:
- project/progress/page.tsx, project/wbs-template/page.tsx
  - setRows 에서 `id: r.objid ?? "...-${i}"` 매핑 추가
  - 부모 wrapper 도 영업관리 패턴 `overflow-hidden` + DataGrid 직접 자식으로 통일
- components/common/DataGrid.tsx
  - isSelected 가드 — selectedId/row.id 가 nullish 면 무조건 false 처리.
    향후 다른 페이지에서 id 매핑 누락 시에도 그리드 색 폭주는 차단.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 15:12:34 +09:00
hjjeong 6a1813719a 프로젝트관리 — 진행관리/WBS템플릿에 logicstudio 스타일 DataGrid 적용
영업관리(fc959d88)와 동일 패턴을 프로젝트관리 2개 메뉴로 확장:

공통 DataGrid props:
- gridId 는 기존(project-progress-wbslist3 / project-wbs-template) 그대로 유지
- showColumnSettings, paginationStyle="range", pageSizeOptions=[10,15,20,50,100]
- onRefresh = fetchList(혹은 fetchList(filterProduct)), onDownload = exportToExcel(라벨 매핑)
- showChart

도메인별 summaryStats:
- 진행관리: 프로젝트 건수 / 수주수량 합계 / 입고율 평균(% 문자열 파싱)
- WBS 템플릿: 템플릿 건수 / WBS 작업 합계 / 평균 WBS 작업수

WBS 템플릿 systemColumnKeys: writer_title, reg_date_title (등록자/등록일 시스템 영역)

컬럼 폭 보정:
- ⋮⋮ 드래그 핸들 추가로 좁아진 4글자 한국어/영문 라벨 95~120px 로 확대
- 진행관리: 주문유형·제품구분·국내/해외·요청납기·E-BOM·M-BOM·제조1,2팀·제조3팀 등
- WBS: WBS 컬럼 100→115, 등록일 130→140

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 14:56:54 +09:00
hjjeong fc959d8872 영업관리 — 주문/판매/매출에 logicstudio 스타일 DataGrid 적용
견적관리(36c1f357)와 동일한 패턴을 나머지 3개 메뉴로 확장:

공통 DataGrid props:
- gridId (sales-order / sales-sale / sales-revenue) 로 컬럼 visibility·순서·너비·차트 영속
- showColumnSettings, paginationStyle="range", pageSizeOptions=[10,15,20,50,100]
- onRefresh = fetchList, onDownload = exportToExcel(GRID_COLUMNS 라벨 매핑)
- showChart

도메인별 summaryStats (하단 통계 행):
- 주문: 수주 건수 / 수주수량·수주취소 합계 / 공급가액·부가세·총액·원화총액 합계
- 판매: 판매 라인 / 수주·판매·잔량 수량 합계 / 판매공급가액·판매원화·잔량원화 합계
- 매출: 매출 이력 / 수량 합계 / 공급가액·부가세·총액·원화총액 합계

컬럼 폭 보정:
- ⋮⋮ 드래그 핸들 추가로 좁아진 4글자 한국어 라벨이 잘리지 않도록 95~135px로 확대
- 시스템 컬럼: 주문관리 writer_name (systemColumnKeys 분리)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 14:53:07 +09:00
hjjeong 36c1f3579e 공용 DataGrid — logicstudio 스타일 toolbar + footer 통계 + 차트 분석 패널 흡수, 견적관리 적용
DataGrid:
- ⟳ Refresh · ⬇ Download · ⚙️ 컬럼 표시 설정 · 📊 차트 분석 toolbar
- 컬럼 visibility 토글 (데이터/시스템 그룹 분리 + 표시·순서·너비 reset)
- summaryStats 하단 통계 행 (라벨/값/접미사)
- paginationStyle 'range' — "1-N / 총 X건" + 페이지 크기 Select
- 행 높이 컴팩트화 (h-7 + py-0 + leading-none, 아이콘 h-3.5)
- sticky 헤더 불투명 배경(bg-muted)으로 스크롤 시 본문 비침 차단
- ⋮⋮ 드래그 핸들 항상 표시

DataGridChartPanel (신규):
- 여러 차트 추가/삭제, 제목 인라인 편집, 드래그 순서 변경
- Bar/Line/Pie + X/Y축 선택 + count/sum/avg/min/max 집계
- localStorage 영속, 360px 고정 높이 + 내부 스크롤

견적관리:
- 컬럼 폭 조정 (⋮⋮ 추가로 좁아진 한국어 4글자 라벨 보장)
- summaryStats, onRefresh, onDownload(exportToExcel) 연결
- gridId="sales-estimate"로 영속화

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 14:42:52 +09:00
hjjeong 2b4282fbeb Merge pull request 'hjjeong' (#11) from hjjeong into main
Reviewed-on: https://g.wace.me/chpark/vexplor_rps/pulls/11
2026-05-14 00:28:57 +00:00
hjjeong 49956f7afa 개발관리·생산관리 — 3D/2D/PDF 카운트 컬럼을 폴더 아이콘으로 통일
사용자 보고: "품명/3D 컬럼이 좁아서 겹쳐 보임 + 폴더 모양(파랑/투명)으로 표시해줘"

운영판 wace 견적현황·partMng 폴더 아이콘 패턴 1:1 적용:
  - 값 > 0  → 파란 폴더 (fill-[#1a73e8])
  - 값 = 0  → 흰색 폴더 (투명 효과, fill-white + muted text)

수정:
  - app/(main)/COMPANY_16/development/part-regist/page.tsx — 3D/2D/PDF (60→70px, center, folder)
  - app/(main)/COMPANY_16/development/part-search/page.tsx — 3D/2D/PDF (60→70px, center, folder)
  - app/(main)/COMPANY_16/development/ebom-search/page.tsx — 3D/2D/PDF (60→70px width 통일)
  - components/development/BomReportTreeDialog.tsx — "Y/공백" → FolderCell
  - components/production/MbomDetailDialog.tsx       — "Y/공백" → FolderCell

sales/{order,sale,revenue}.tsx 의 cu01_cnt 는 "주문서첨부" clip 아이콘이라 별 의미라 미수정.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 17:40:25 +09:00
hjjeong a136867f52 공용 — 검색·초기화 버튼을 PageHeader 우측 액션 영역으로 이전
사용자 보고: "초기화, 검색 버튼은 상단의 메뉴이름 쪽에 다른 버튼들이랑 같이 있으면 될거같아"

CompactFilterBar 안에 있던 [초기화][검색] 버튼이 자리 차지 + 시선 분산.
PageHeader 의 actions 슬롯 옆으로 통합하면서 11개 페이지 일괄 적용.

PageHeader 확장:
  - onSearch / onReset / loading / searchLabel / resetLabel prop 추가
  - actions 뒤에 [초기화][검색] 버튼 자동 렌더 (h-8 / text-xs)

CompactFilterBar 단순화:
  - onSearch / onReset / loading / searchLabel / resetLabel prop 제거
  - children + totalText 만 유지 (필드 컨테이너 + 합계 텍스트)

11개 페이지: <CompactFilterBar onSearch onReset loading> 3 prop 을
              <PageHeader onSearch onReset loading> 로 이동

메모리: feedback_compact_search_pattern.md 에 "검색·초기화 위치 = PageHeader" 박제

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 17:17:24 +09:00