From e8d9f273e04fb2bc018c0cb6f778bb455d94aac7 Mon Sep 17 00:00:00 2001 From: hjjeong Date: Fri, 16 Jan 2026 16:04:26 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B5=AC=EB=A7=A4=EB=A6=AC=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EA=B0=80=EA=B3=B5=20=EC=B6=94=EA=B0=80,=20=ED=92=88?= =?UTF-8?q?=EC=9D=98=EC=84=9C=20=EC=83=9D=EC=84=B1=EB=8F=84=20=EC=86=8C?= =?UTF-8?q?=EC=9E=AC,=20=EA=B0=80=EA=B3=B5=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../view/salesMng/purchaseListFormPopUp.jsp | 230 +++++++++----- .../view/salesMng/salesRequestMngRegList.jsp | 153 +++++---- src/com/pms/mapper/salesMng.xml | 292 ++++++++++++++++-- .../controller/SalesMngController.java | 40 ++- .../salesmgmt/service/SalesMngService.java | 231 +++++++++----- 5 files changed, 712 insertions(+), 234 deletions(-) diff --git a/WebContent/WEB-INF/view/salesMng/purchaseListFormPopUp.jsp b/WebContent/WEB-INF/view/salesMng/purchaseListFormPopUp.jsp index 9ede541..9d954ce 100644 --- a/WebContent/WEB-INF/view/salesMng/purchaseListFormPopUp.jsp +++ b/WebContent/WEB-INF/view/salesMng/purchaseListFormPopUp.jsp @@ -461,32 +461,8 @@ function fn_initGrid() { title: '지급/사급', field: 'SUPPLY_TYPE' }, - // 17. 소재 - { - headerHozAlign: 'center', - hozAlign: 'left', - width: 100, - title: '소재', - field: 'RAW_MATERIAL' - }, - // 18. 사이즈 - { - headerHozAlign: 'center', - hozAlign: 'left', - width: 100, - title: '사이즈', - field: 'SIZE' - }, - // 19. 소재품번 - { - headerHozAlign: 'center', - hozAlign: 'center', - width: 120, - title: '소재품번', - field: 'RAW_MATERIAL_NO' - }, - // 20. 소재소요량 - { +// 20. 소재소요량 +{ headerHozAlign: 'center', hozAlign: 'right', width: 100, @@ -529,27 +505,46 @@ function fn_initGrid() { return value ? Number(value).toLocaleString() : '0'; } }, - // 24. 가공업체 (수정가능 - Select2 에디터) + + // 17. 소재 -> 소재재질 + { + headerHozAlign: 'center', + hozAlign: 'left', + width: 100, + title: '소재재질', + field: 'RAW_MATERIAL' + }, + // 18. 사이즈 -> 규격 + { + headerHozAlign: 'center', + hozAlign: 'left', + width: 100, + title: '규격', + field: 'SIZE' + }, + // 19. 소재품번 + { + headerHozAlign: 'center', + hozAlign: 'center', + width: 120, + title: '소재품번', + field: 'RAW_MATERIAL_NO' + }, + // 30. 공급업체 (수정가능 - Select2 에디터) { headerHozAlign: 'center', hozAlign: 'left', width: 150, - title: '가공업체', - field: 'PROCESSING_VENDOR', + title: '공급업체', + field: 'VENDOR_PM', editor: function(cell, onRendered, success, cancel, editorParams) { - // Select2 에디터 + // Select2 에디터 (가공업체와 동일한 목록 사용) return createSelect2Editor(processingVendorList)(cell, onRendered, success, cancel, editorParams); }, formatter: function(cell) { var value = cell.getValue(); - - // 저장된 값이 없으면 기본값 '5001'(RPS) 설정 - if(value === undefined || value === null || value === '') { - value = '5001'; - cell.getRow().update({PROCESSING_VENDOR: value}, false); - } - - // OBJID로 업체명 조회하여 표시 + if(!value) return ''; + // processingVendorList에서 해당 값의 이름 찾기 for(var i = 0; i < processingVendorList.length; i++) { if(processingVendorList[i].id == value) { return processingVendorList[i].text; @@ -558,27 +553,41 @@ function fn_initGrid() { return value; } }, - /* // 25. 가공납기 - 주석처리 + // 31. 단가 (수정가능) -> 소재단가 { headerHozAlign: 'center', - hozAlign: 'center', + hozAlign: 'right', width: 100, - title: '가공납기', - field: 'PROCESSING_DEADLINE' + title: '소재단가', + field: 'UNIT_PRICE', + editor: 'number', + editable: true, + formatter: function(cell) { + var value = cell.getValue(); + return value ? Number(value).toLocaleString() : '0'; + } }, - // 26. 연삭납기 + // 32. 총단가 -> 소재총단가 { headerHozAlign: 'center', - hozAlign: 'center', + hozAlign: 'right', width: 100, - title: '연삭납기', - field: 'GRINDING_DEADLINE' - }, */ + title: '소재총단가', + field: 'TOTAL_PRICE', + formatter: function(cell) { + var data = cell.getRow().getData(); + var qty = parseFloat(data.PO_QTY) || 0; + var unitPrice = parseFloat(data.UNIT_PRICE) || 0; + var totalPrice = qty * unitPrice; + return totalPrice > 0 ? totalPrice.toLocaleString() : '0'; + } + }, + // 27. 사용여부 (수정가능) { headerHozAlign: 'center', hozAlign: 'center', - width: 80, + width: 90, title: '사용여부', field: 'USE_YN', editor: 'list', @@ -638,21 +647,28 @@ function fn_initGrid() { return value ? Number(value).toLocaleString() : '0'; } }, - // 30. 공급업체 (수정가능 - Select2 에디터) + + // 24. 가공업체 (수정가능 - Select2 에디터) { headerHozAlign: 'center', hozAlign: 'left', width: 150, - title: '공급업체', - field: 'VENDOR_PM', + title: '가공업체', + field: 'PROCESSING_VENDOR', editor: function(cell, onRendered, success, cancel, editorParams) { - // Select2 에디터 (가공업체와 동일한 목록 사용) + // Select2 에디터 return createSelect2Editor(processingVendorList)(cell, onRendered, success, cancel, editorParams); }, formatter: function(cell) { var value = cell.getValue(); - if(!value) return ''; - // processingVendorList에서 해당 값의 이름 찾기 + + // 저장된 값이 없으면 기본값 '5001'(RPS) 설정 + if(value === undefined || value === null || value === '') { + value = '5001'; + cell.getRow().update({PROCESSING_VENDOR: value}, false); + } + + // OBJID로 업체명 조회하여 표시 for(var i = 0; i < processingVendorList.length; i++) { if(processingVendorList[i].id == value) { return processingVendorList[i].text; @@ -661,13 +677,13 @@ function fn_initGrid() { return value; } }, - // 31. 단가 (수정가능) + // 가공단가 (수정가능) { headerHozAlign: 'center', hozAlign: 'right', width: 100, - title: '단가', - field: 'UNIT_PRICE', + title: '가공단가', + field: 'PROCESSING_UNIT_PRICE', editor: 'number', editable: true, formatter: function(cell) { @@ -675,28 +691,94 @@ function fn_initGrid() { return value ? Number(value).toLocaleString() : '0'; } }, - // 32. 총단가 + // 가공총단가 (가공단가 × 제작수량) { headerHozAlign: 'center', hozAlign: 'right', width: 100, - title: '총단가', - field: 'TOTAL_PRICE', + title: '가공총단가', + field: 'PROCESSING_TOTAL_PRICE', formatter: function(cell) { var data = cell.getRow().getData(); - var qty = parseFloat(data.PO_QTY) || 0; - var unitPrice = parseFloat(data.UNIT_PRICE) || 0; - var totalPrice = qty * unitPrice; - return totalPrice > 0 ? totalPrice.toLocaleString() : '0'; + var productionQty = parseFloat(data.PRODUCTION_QTY) || 0; + var processingUnitPrice = parseFloat(data.PROCESSING_UNIT_PRICE) || 0; + var processingTotalPrice = productionQty * processingUnitPrice; + return processingTotalPrice > 0 ? processingTotalPrice.toLocaleString() : '0'; } }, - // 33. 품의서작성일 + // 총합계 (소재총단가 + 가공총단가) + { + headerHozAlign: 'center', + hozAlign: 'right', + width: 100, + title: '총합계', + field: 'GRAND_TOTAL_PRICE', + formatter: function(cell) { + var data = cell.getRow().getData(); + // 소재총단가: 발주수량 × 소재단가 + var poQty = parseFloat(data.PO_QTY) || 0; + var unitPrice = parseFloat(data.UNIT_PRICE) || 0; + var materialTotalPrice = poQty * unitPrice; + // 가공총단가: 제작수량 × 가공단가 + var productionQty = parseFloat(data.PRODUCTION_QTY) || 0; + var processingUnitPrice = parseFloat(data.PROCESSING_UNIT_PRICE) || 0; + var processingTotalPrice = productionQty * processingUnitPrice; + // 총합계 + var grandTotal = materialTotalPrice + processingTotalPrice; + return grandTotal > 0 ? grandTotal.toLocaleString() : '0'; + } + }, + /* // 25. 가공납기 - 주석처리 { headerHozAlign: 'center', hozAlign: 'center', width: 100, - title: '품의서작성일', - field: 'PROPOSAL_DATE' + title: '가공납기', + field: 'PROCESSING_DEADLINE' + }, + // 26. 연삭납기 + { + headerHozAlign: 'center', + hozAlign: 'center', + width: 100, + title: '연삭납기', + field: 'GRINDING_DEADLINE' + }, */ + + + // 33. 소재 품의서작성일 + { + headerHozAlign: 'center', + hozAlign: 'center', + width: 110, + title: '소재품의서일', + field: 'PROPOSAL_DATE', + formatter: function(cell) { + var value = cell.getValue(); + if(!value) return ''; + // YYYY-MM-DD 형식으로 표시 + if(value.length >= 10) { + return value.substring(0, 10); + } + return value; + } + }, + // 34. 가공 품의서작성일 + { + headerHozAlign: 'center', + hozAlign: 'center', + width: 110, + title: '가공품의서일', + field: 'PROCESSING_PROPOSAL_DATE', + formatter: function(cell) { + var value = cell.getValue(); + if(!value) return ''; + // YYYY-MM-DD 형식으로 표시 + if(value.length >= 10) { + return value.substring(0, 10); + } + return value; + } } ]; @@ -719,8 +801,8 @@ function fn_initGrid() { var row = cell.getRow(); var data = row.getData(); - // 발주수량 또는 단가 변경 시 총단가 자동 계산 - if(field === 'PO_QTY' || field === 'UNIT_PRICE') { + // 발주수량, 소재단가, 가공단가 변경 시 총단가 자동 계산 + if(field === 'PO_QTY' || field === 'UNIT_PRICE' || field === 'PROCESSING_UNIT_PRICE') { row.reformat(); } }); @@ -856,11 +938,19 @@ function fn_save() { // 저장 전 데이터 가공 gridData.forEach(function(item) { - // TOTAL_PRICE 계산 (PO_QTY * UNIT_PRICE) + // 소재총단가 계산 (PO_QTY * UNIT_PRICE) var poQty = parseFloat(item.PO_QTY) || 0; var unitPrice = parseFloat(item.UNIT_PRICE) || 0; item.TOTAL_PRICE = poQty * unitPrice; + // 가공총단가 계산 (PRODUCTION_QTY * PROCESSING_UNIT_PRICE) + var productionQty = parseFloat(item.PRODUCTION_QTY) || 0; + var processingUnitPrice = parseFloat(item.PROCESSING_UNIT_PRICE) || 0; + item.PROCESSING_TOTAL_PRICE = productionQty * processingUnitPrice; + + // 총합계 계산 (소재총단가 + 가공총단가) + item.GRAND_TOTAL_PRICE = item.TOTAL_PRICE + item.PROCESSING_TOTAL_PRICE; + // 사용여부 변환: 사용/미사용 → Y/N if(item.USE_YN === '사용') { item.USE_YN = 'Y'; diff --git a/WebContent/WEB-INF/view/salesMng/salesRequestMngRegList.jsp b/WebContent/WEB-INF/view/salesMng/salesRequestMngRegList.jsp index 38e8c66..1282524 100644 --- a/WebContent/WEB-INF/view/salesMng/salesRequestMngRegList.jsp +++ b/WebContent/WEB-INF/view/salesMng/salesRequestMngRegList.jsp @@ -196,7 +196,7 @@ var columns = [ ,{headerHozAlign : 'center', hozAlign : 'center', title : "유/무상", field :"PAID_TYPE_NAME" , widthGrow:0.9 } ,{headerHozAlign : 'center', hozAlign : 'left', title : "품번", field :"PART_NO" , widthGrow:1.4} ,{headerHozAlign : 'center', hozAlign : 'left' , title : "품명", field :"PART_NAME" , widthGrow:1.8 } - ,{headerHozAlign : 'center', hozAlign : 'center', title : "구매요청서", field :"HAS_PURCHASE_REQUEST" , widthGrow:1.1, + ,{headerHozAlign : 'center', hozAlign : 'center', title : "견적요청서", field :"HAS_PURCHASE_REQUEST" , widthGrow:1.1, formatter: function(cell, formatterParams, onRendered){ // 구매요청서 작성 여부: HAS_PURCHASE_REQUEST가 'Y'이면 구매요청서 작성됨 var data = cell.getData(); @@ -214,6 +214,24 @@ var columns = [ } } } + // ,{headerHozAlign : 'center', hozAlign : 'center', title : "구매요청서", field :"HAS_PURCHASE_REQUEST" , widthGrow:1.1, + // formatter: function(cell, formatterParams, onRendered){ + // // 구매요청서 작성 여부: HAS_PURCHASE_REQUEST가 'Y'이면 구매요청서 작성됨 + // var data = cell.getData(); + // var hasPurchaseRequest = fnc_checkNull(data.HAS_PURCHASE_REQUEST); + // var iconClass = (hasPurchaseRequest == 'Y') ? 'file_icon' : 'file_empty_icon'; + // return ''; + // }, + // cellClick : function(e, cell) { + // var data = cell.getData(); + // var hasPurchaseRequest = fnc_checkNull(data.HAS_PURCHASE_REQUEST); + + // // 구매요청서가 작성된 경우(파란색 아이콘)만 팝업 열기 + // if(hasPurchaseRequest == 'Y') { + // fn_openSalesRequestFormPopUp(data.OBJID); + // } + // } + // } ,{headerHozAlign : 'center', hozAlign : 'center', title : "요청인", field :"REQUEST_USER_NAME" , widthGrow:1.1, // 요청인: 구매요청서 작성 시에만 표시 formatter: function(cell, formatterParams, onRendered){ @@ -297,7 +315,7 @@ function fn_openSalesRequestPopUp(objId){ if(mbomHeaderObjid) { url += "&MBOM_HEADER_OBJID=" + mbomHeaderObjid; } - window.open(url,"purchaseListPopUp","width=1400,height=800,scrollbars=yes,resizable=yes"); + window.open(url,"purchaseListPopUp","width=1800,height=800,scrollbars=yes,resizable=yes"); } //구매요청서 작성 팝업 (구매요청서 파일 아이콘 클릭 시) @@ -489,9 +507,9 @@ function fn_formPopUp(objId,sales_request_objid){ /** * 품의서 생성 함수 - * - 선택된 구매요청서에서 단가가 입력된 품목만 필터링 + * - 선택된 구매요청서에서 소재단가/가공단가가 입력된 품목만 필터링 * - 이미 품의서가 생성된 품목은 제외 - * - 하나의 품의서로 생성 + * - 소재/가공 각각 별도 품의서 생성 */ function fn_createProposal() { // 1. 선택된 행 확인 @@ -528,79 +546,73 @@ function fn_createProposal() { dataType: "json", success: function(response) { if(response.resultFlag === "S") { - var targetParts = response.data; - var excludedParts = response.excludedParts || []; // 공급업체 미입력 품목 + var materialParts = response.materialTargetParts || []; + var processingParts = response.processingTargetParts || []; + var materialExcluded = response.materialExcludedParts || []; + var processingExcluded = response.processingExcludedParts || []; // 3. 대상 품목 확인 - if(!targetParts || targetParts.length == 0) { + if(materialParts.length == 0 && processingParts.length == 0) { + var excludedHtml = fn_buildExcludedHtml(materialExcluded, processingExcluded); Swal.fire({ title: '알림', - text: '품의서를 생성할 품목이 없습니다.\n(단가와 공급업체가 모두 입력되고 품의서가 생성되지 않은 품목만 대상)', + html: '품의서를 생성할 품목이 없습니다.
(소재단가+공급업체 또는 가공단가+가공업체가 입력되고 품의서가 생성되지 않은 품목만 대상)' + excludedHtml, icon: 'info' }); return; } - // 4. 품의서 생성 확인 - var partCount = targetParts.length; - var partListHtml = targetParts.map(function(part) { - return '- ' + fnc_checkNull(part.PART_NO) + ' / ' + fnc_checkNull(part.PART_NAME); - }).join('
'); + // 4. 품의서 생성 확인 - 소재/가공 구분 표시 + var confirmHtml = '
'; - // 공급업체 미입력으로 제외된 품목이 있는 경우 알림 추가 - var excludedHtml = ''; - if(excludedParts && excludedParts.length > 0) { - var excludedListHtml = excludedParts.map(function(part) { + // 소재 품의서 대상 + if(materialParts.length > 0) { + var materialListHtml = materialParts.map(function(part) { return '- ' + fnc_checkNull(part.PART_NO) + ' / ' + fnc_checkNull(part.PART_NAME); }).join('
'); - excludedHtml = '
' + - '

⚠️ 공급업체 미입력으로 제외된 품목 (' + excludedParts.length + '건)

' + - '
' + - excludedListHtml + - '
' + + confirmHtml += '
' + + '

📦 소재 품의서 (' + materialParts.length + '건)

' + + '
' + materialListHtml + '
' + '
'; } + // 가공 품의서 대상 + if(processingParts.length > 0) { + var processingListHtml = processingParts.map(function(part) { + return '- ' + fnc_checkNull(part.PART_NO) + ' / ' + fnc_checkNull(part.PART_NAME); + }).join('
'); + + confirmHtml += '
' + + '

⚙️ 가공 품의서 (' + processingParts.length + '건)

' + + '
' + processingListHtml + '
' + + '
'; + } + + // 제외된 품목 표시 + confirmHtml += fn_buildExcludedHtml(materialExcluded, processingExcluded); + confirmHtml += '
'; + + // 생성될 품의서 개수 표시 + var proposalCount = (materialParts.length > 0 ? 1 : 0) + (processingParts.length > 0 ? 1 : 0); + Swal.fire({ title: '품의서 생성', - html: '
' + - '

' + partCount + '건의 품목으로 품의서를 생성합니다.

' + - '
' + - partListHtml + - '
' + - excludedHtml + - '
', + html: '

' + proposalCount + '개의 품의서가 생성됩니다.

' + confirmHtml, icon: 'question', showCancelButton: true, confirmButtonText: '생성', - cancelButtonText: '취소' + cancelButtonText: '취소', + width: '600px' }).then((result) => { if (result.isConfirmed) { - fn_executeCreateProposal(salesRequestObjid, targetParts); + fn_executeCreateProposal(salesRequestObjid, null); } }); } else { - // 실패 시에도 공급업체 미입력 품목 정보 표시 - var excludedParts = response.excludedParts || []; - var excludedHtml = ''; - - if(excludedParts && excludedParts.length > 0) { - var excludedListHtml = excludedParts.map(function(part) { - return '- ' + fnc_checkNull(part.PART_NO) + ' / ' + fnc_checkNull(part.PART_NAME); - }).join('
'); - - excludedHtml = '

' + - '

⚠️ 공급업체 미입력 품목 (' + excludedParts.length + '건)

' + - '
' + - excludedListHtml + - '
' + - '
'; - } - Swal.fire({ title: '알림', - html: (response.message || '품목 조회 중 오류가 발생했습니다.') + excludedHtml, + html: response.message || '품목 조회 중 오류가 발생했습니다.', icon: 'info' }); } @@ -608,13 +620,44 @@ function fn_createProposal() { error: function(xhr, status, error) { Swal.fire({ title: '오류', - text: '서버 통신 중 오류가 발생했습니다.22', + text: '서버 통신 중 오류가 발생했습니다.', icon: 'error' }); } }); } +/** + * 제외된 품목 HTML 생성 + */ +function fn_buildExcludedHtml(materialExcluded, processingExcluded) { + var html = ''; + + if(materialExcluded && materialExcluded.length > 0) { + var listHtml = materialExcluded.map(function(part) { + return '- ' + fnc_checkNull(part.PART_NO) + ' / ' + fnc_checkNull(part.PART_NAME); + }).join('
'); + + html += '
' + + '

⚠️ 소재 - 공급업체 미입력 (' + materialExcluded.length + '건)

' + + '
' + listHtml + '
' + + '
'; + } + + if(processingExcluded && processingExcluded.length > 0) { + var listHtml = processingExcluded.map(function(part) { + return '- ' + fnc_checkNull(part.PART_NO) + ' / ' + fnc_checkNull(part.PART_NAME); + }).join('
'); + + html += '
' + + '

⚠️ 가공 - 가공업체 미입력 (' + processingExcluded.length + '건)

' + + '
' + listHtml + '
' + + '
'; + } + + return html; +} + /** * 품의서 생성 실행 */ @@ -623,15 +666,16 @@ function fn_executeCreateProposal(salesRequestObjid, targetParts) { url: "/salesMng/createProposalFromPurchaseList.do", type: "POST", data: { - SALES_REQUEST_MASTER_OBJID: salesRequestObjid, - TARGET_PARTS: JSON.stringify(targetParts) + SALES_REQUEST_MASTER_OBJID: salesRequestObjid }, dataType: "json", success: function(response) { if(response.resultFlag === "S") { + // 서버에서 반환한 메시지 사용 (소재/가공 품의서 번호 포함) + var message = response.message || '품의서가 생성되었습니다.'; Swal.fire({ title: '생성 완료', - text: '품의서가 생성되었습니다.\n품의서 관리에서 확인하세요.', + html: message.replace(/\n/g, '
'), icon: 'success' }).then(() => { fn_search(); // 목록 새로고침 @@ -639,12 +683,13 @@ function fn_executeCreateProposal(salesRequestObjid, targetParts) { } else { Swal.fire({ title: '오류', - text: response.message || '품의서 생성 중 오류가 발생했습니다.', + html: (response.message || '품의서 생성 중 오류가 발생했습니다.').replace(/\n/g, '
'), icon: 'error' }); } }, error: function(xhr, status, error) { + console.error("품의서 생성 오류:", status, error); Swal.fire({ title: '오류', text: '서버 통신 중 오류가 발생했습니다.', diff --git a/src/com/pms/mapper/salesMng.xml b/src/com/pms/mapper/salesMng.xml index 6cd0665..9143a35 100644 --- a/src/com/pms/mapper/salesMng.xml +++ b/src/com/pms/mapper/salesMng.xml @@ -3114,7 +3114,11 @@ UPDATE SET COALESCE(SRP.VENDOR_PM, SRP.PARTNER_OBJID) AS VENDOR_PM, COALESCE(SRP.UNIT_PRICE, NULLIF(SRP.PARTNER_PRICE, '')::numeric, 0) AS UNIT_PRICE, COALESCE(SRP.TOTAL_PRICE, 0) AS TOTAL_PRICE, + COALESCE(SRP.PROCESSING_UNIT_PRICE, 0) AS PROCESSING_UNIT_PRICE, + COALESCE(SRP.PROCESSING_TOTAL_PRICE, 0) AS PROCESSING_TOTAL_PRICE, + COALESCE(SRP.GRAND_TOTAL_PRICE, 0) AS GRAND_TOTAL_PRICE, SRP.PROPOSAL_DATE, + SRP.PROCESSING_PROPOSAL_DATE, 'SRP' AS DATA_SOURCE -- 데이터 소스 구분용 FROM SALES_REQUEST_PART SRP @@ -3173,7 +3177,11 @@ WITH RECURSIVE VIEW_BOM( USE_YN, NET_QTY, PO_QTY, - PROPOSAL_DATE + PROPOSAL_DATE, + PROCESSING_PROPOSAL_DATE, + PROCESSING_UNIT_PRICE, + PROCESSING_TOTAL_PRICE, + GRAND_TOTAL_PRICE ) AS ( SELECT A.MBOM_HEADER_OBJID, @@ -3221,7 +3229,11 @@ WITH RECURSIVE VIEW_BOM( COALESCE(A.USE_YN, 'Y'), COALESCE(A.NET_QTY, 0), COALESCE(A.PO_QTY, 0), - A.PROPOSAL_DATE + A.PROPOSAL_DATE, + A.PROCESSING_PROPOSAL_DATE, + COALESCE(A.PROCESSING_UNIT_PRICE, 0), + COALESCE(A.PROCESSING_TOTAL_PRICE, 0), + COALESCE(A.GRAND_TOTAL_PRICE, 0) FROM MBOM_DETAIL A INNER JOIN MBOM_HEADER MH ON MH.OBJID = A.MBOM_HEADER_OBJID @@ -3281,7 +3293,11 @@ WITH RECURSIVE VIEW_BOM( COALESCE(B.USE_YN, 'Y'), COALESCE(B.NET_QTY, 0), COALESCE(B.PO_QTY, 0), - B.PROPOSAL_DATE + B.PROPOSAL_DATE, + B.PROCESSING_PROPOSAL_DATE, + COALESCE(B.PROCESSING_UNIT_PRICE, 0), + COALESCE(B.PROCESSING_TOTAL_PRICE, 0), + COALESCE(B.GRAND_TOTAL_PRICE, 0) FROM MBOM_DETAIL B JOIN @@ -3369,6 +3385,10 @@ SELECT V.NET_QTY, V.PO_QTY, V.PROPOSAL_DATE, + V.PROCESSING_PROPOSAL_DATE, + V.PROCESSING_UNIT_PRICE, + V.PROCESSING_TOTAL_PRICE, + V.GRAND_TOTAL_PRICE, 'MBOM' AS DATA_SOURCE -- 데이터 소스 구분용 FROM VIEW_BOM V LEFT JOIN PART_MNG P ON P.OBJID::VARCHAR = V.PART_OBJID::VARCHAR @@ -3400,6 +3420,9 @@ ORDER BY V.PATH2 PROCESSING_VENDOR = #{PROCESSING_VENDOR}, UNIT_PRICE = COALESCE(NULLIF(TRIM(#{UNIT_PRICE}::TEXT), '')::NUMERIC, 0), TOTAL_PRICE = COALESCE(NULLIF(TRIM(#{TOTAL_PRICE}::TEXT), '')::NUMERIC, 0), + PROCESSING_UNIT_PRICE = COALESCE(NULLIF(TRIM(#{PROCESSING_UNIT_PRICE}::TEXT), '')::NUMERIC, 0), + PROCESSING_TOTAL_PRICE = COALESCE(NULLIF(TRIM(#{PROCESSING_TOTAL_PRICE}::TEXT), '')::NUMERIC, 0), + GRAND_TOTAL_PRICE = COALESCE(NULLIF(TRIM(#{GRAND_TOTAL_PRICE}::TEXT), '')::NUMERIC, 0), EDITER = #{EDITER}, EDIT_DATE = NOW() WHERE OBJID::VARCHAR = #{OBJID} @@ -3415,6 +3438,9 @@ ORDER BY V.PATH2 PROCESSING_VENDOR = #{PROCESSING_VENDOR}, UNIT_PRICE = COALESCE(NULLIF(TRIM(#{UNIT_PRICE}::TEXT), '')::NUMERIC, 0), TOTAL_PRICE = COALESCE(NULLIF(TRIM(#{TOTAL_PRICE}::TEXT), '')::NUMERIC, 0), + PROCESSING_UNIT_PRICE = COALESCE(NULLIF(TRIM(#{PROCESSING_UNIT_PRICE}::TEXT), '')::NUMERIC, 0), + PROCESSING_TOTAL_PRICE = COALESCE(NULLIF(TRIM(#{PROCESSING_TOTAL_PRICE}::TEXT), '')::NUMERIC, 0), + GRAND_TOTAL_PRICE = COALESCE(NULLIF(TRIM(#{GRAND_TOTAL_PRICE}::TEXT), '')::NUMERIC, 0), WRITER = #{EDITER} WHERE OBJID::VARCHAR = #{OBJID} @@ -3477,7 +3503,7 @@ ORDER BY V.PATH2 - + - + + + + - + + + + - + + + + + + + INSERT INTO SALES_REQUEST_MASTER ( @@ -3628,7 +3780,7 @@ ORDER BY V.PATH2 ) - + INSERT INTO SALES_REQUEST_PART ( OBJID, @@ -3663,7 +3815,42 @@ ORDER BY V.PATH2 WHERE OBJID = #{SOURCE_OBJID} - + + + INSERT INTO SALES_REQUEST_PART ( + OBJID, + SALES_REQUEST_MASTER_OBJID, + PART_OBJID, + QTY, + UNIT_PRICE, + TOTAL_PRICE, + VENDOR_PM, + NET_QTY, + PO_QTY, + USE_YN, + PROPOSAL_DATE, + WRITER, + REGDATE + ) + SELECT + #{NEW_OBJID}, + #{PROPOSAL_MASTER_OBJID}, + PART_OBJID, + PRODUCTION_QTY AS QTY, + PROCESSING_UNIT_PRICE AS UNIT_PRICE, + PROCESSING_TOTAL_PRICE AS TOTAL_PRICE, + PROCESSING_VENDOR AS VENDOR_PM, + NET_QTY, + PO_QTY, + USE_YN, + NOW() AS PROPOSAL_DATE, + #{WRITER}, + NOW() + FROM MBOM_DETAIL + WHERE OBJID = #{SOURCE_OBJID} + + + INSERT INTO SALES_REQUEST_PART ( OBJID, @@ -3698,7 +3885,42 @@ ORDER BY V.PATH2 WHERE OBJID = #{SOURCE_OBJID} - + + + INSERT INTO SALES_REQUEST_PART ( + OBJID, + SALES_REQUEST_MASTER_OBJID, + PART_OBJID, + QTY, + UNIT_PRICE, + TOTAL_PRICE, + VENDOR_PM, + NET_QTY, + PO_QTY, + USE_YN, + PROPOSAL_DATE, + WRITER, + REGDATE + ) + SELECT + #{NEW_OBJID}, + #{PROPOSAL_MASTER_OBJID}, + PART_OBJID, + PRODUCTION_QTY AS QTY, + PROCESSING_UNIT_PRICE AS UNIT_PRICE, + PROCESSING_TOTAL_PRICE AS TOTAL_PRICE, + PROCESSING_VENDOR AS VENDOR_PM, + NET_QTY, + PO_QTY, + USE_YN, + NOW() AS PROPOSAL_DATE, + #{WRITER}, + NOW() + FROM SALES_REQUEST_PART + WHERE OBJID = #{SOURCE_OBJID} + + + UPDATE SALES_REQUEST_PART SET PROPOSAL_DATE = NOW() @@ -3708,7 +3930,17 @@ ORDER BY V.PATH2 - + + + UPDATE SALES_REQUEST_PART + SET PROCESSING_PROPOSAL_DATE = NOW() + WHERE OBJID IN + + #{objid} + + + + UPDATE MBOM_DETAIL SET PROPOSAL_DATE = NOW() @@ -3718,6 +3950,16 @@ ORDER BY V.PATH2 + + + UPDATE MBOM_DETAIL + SET PROCESSING_PROPOSAL_DATE = NOW() + WHERE OBJID IN + + #{objid} + + +