From afb81d2b569f768d9d3d242601ff71d5e4f68a82 Mon Sep 17 00:00:00 2001 From: hjjeong Date: Wed, 18 Mar 2026 09:58:11 +0900 Subject: [PATCH] =?UTF-8?q?=ED=99=98=EC=A2=85=20=EC=BB=AC=EB=9F=BC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20:=20=EA=B5=AC=EB=A7=A4=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8,=20M-BOM,=20=EA=B2=AC=EC=A0=81=EC=9A=94=EC=B2=AD?= =?UTF-8?q?=EC=84=9C,=20=ED=92=88=EC=9D=98=EC=84=9C,=20=EC=98=81=EB=AC=B8?= =?UTF-8?q?=EB=B0=9C=EC=A3=BC=EC=84=9C,=20=EB=B0=9C=EC=A3=BC=EC=84=9C?= =?UTF-8?q?=EA=B4=80=EB=A6=AC,=20=EC=9E=85=EA=B3=A0=EA=B4=80=EB=A6=AC,=20?= =?UTF-8?q?=ED=92=88=EB=AA=A9=EB=B3=84=20=EC=9E=85=EA=B3=A0=EA=B4=80?= =?UTF-8?q?=EB=A6=AC,=20=EC=9E=85=EA=B3=A0=EC=9D=BC=EB=B3=84=EC=9E=85?= =?UTF-8?q?=EA=B3=A0=EA=B4=80=EB=A6=AC.=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=B4=9D=EC=95=A1=20=EC=BB=AC=EB=9F=BC=EC=97=90=20=EC=B4=9D?= =?UTF-8?q?=EC=95=A1=EC=95=9E=20=ED=99=98=EC=A2=85=EA=B8=B0=ED=98=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../deliveryMngAcceptanceList.jsp | 48 +++++++++++++-- .../deliveryMngAcceptancePartList.jsp | 45 +++++++++++++- .../view/purchaseOrder/purchaseCloseList.jsp | 19 +++++- .../purchaseOrderFormPopup_english.jsp | 24 ++++++-- .../purchaseOrder/purchaseOrderList_new.jsp | 14 ++++- .../view/salesMng/proposalFormPopUp.jsp | 19 +++++- .../salesMng/quotationRequestFormPopup.jsp | 9 +++ .../controller/PurchaseOrderController.java | 14 ++++- src/com/pms/mapper/purchaseOrder.xml | 29 ++++++++- src/com/pms/mapper/salesMng.xml | 60 ++++++++++++++++++- .../controller/SalesMngController.java | 4 +- .../salesmgmt/service/SalesMngService.java | 1 + 12 files changed, 260 insertions(+), 26 deletions(-) diff --git a/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptanceList.jsp b/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptanceList.jsp index 8e6254f..5521539 100644 --- a/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptanceList.jsp +++ b/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptanceList.jsp @@ -111,6 +111,7 @@ var columns = [ {headerHozAlign : 'center', hozAlign : 'left', minWidth : 140, widthGrow : 2, title : '품번', field : 'PART_NO' }, {headerHozAlign : 'center', hozAlign : 'left', minWidth : 180, widthGrow : 3, title : '품명', field : 'PART_NAME' }, {headerHozAlign : 'center', hozAlign : 'left', minWidth : 150, widthGrow : 2, title : '공급업체', field : 'PARTNER_NAME' }, + {headerHozAlign : 'center', hozAlign : 'center', minWidth : 60, widthGrow : 0.6, title : '환종', field : 'CURRENCY_NAME' }, {headerHozAlign : 'center', hozAlign : 'center', minWidth : 90, widthGrow : 1, title : '구매담당자', field : 'WRITER_NAME' }, {headerHozAlign : 'center', hozAlign : 'right', minWidth : 90, widthGrow : 1, title : '발주수량', field : 'TOTAL_PO_QTY', formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false } @@ -122,13 +123,46 @@ var columns = [ formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false } }, {headerHozAlign : 'center', hozAlign : 'right', minWidth : 90, widthGrow : 1, title : '발주금액', field : 'TOTAL_SUPPLY_PRICE', - formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false } + formatter: function(cell) { + var value = cell.getValue(); + if(!value || value === '' || value === '0') return ''; + var cn = cell.getRow().getData().CURRENCY_NAME || ''; + var s = ''; + if(cn.includes('원') || cn === 'KRW') s = '₩'; + else if(cn.includes('달러') || cn === 'USD') s = '$'; + else if(cn.includes('유로') || cn === 'EUR') s = '€'; + else if(cn.includes('엔') || cn === 'JPY') s = '¥'; + else if(cn.includes('위안') || cn === 'CNY') s = '¥'; + return s + Number(value).toLocaleString(); + } }, {headerHozAlign : 'center', hozAlign : 'right', minWidth : 90, widthGrow : 1, title : '입고금액', field : 'TOTAL_DELIVERY_PRICE', - formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false } + formatter: function(cell) { + var value = cell.getValue(); + if(!value || value === '' || value === '0') return ''; + var cn = cell.getRow().getData().CURRENCY_NAME || ''; + var s = ''; + if(cn.includes('원') || cn === 'KRW') s = '₩'; + else if(cn.includes('달러') || cn === 'USD') s = '$'; + else if(cn.includes('유로') || cn === 'EUR') s = '€'; + else if(cn.includes('엔') || cn === 'JPY') s = '¥'; + else if(cn.includes('위안') || cn === 'CNY') s = '¥'; + return s + Number(value).toLocaleString(); + } }, {headerHozAlign : 'center', hozAlign : 'right', minWidth : 90, widthGrow : 1, title : '미입고금액', field : 'TOTAL_NOT_DELIVERY_PRICE', - formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false } + formatter: function(cell) { + var value = cell.getValue(); + if(!value || value === '' || value === '0') return ''; + var cn = cell.getRow().getData().CURRENCY_NAME || ''; + var s = ''; + if(cn.includes('원') || cn === 'KRW') s = '₩'; + else if(cn.includes('달러') || cn === 'USD') s = '$'; + else if(cn.includes('유로') || cn === 'EUR') s = '€'; + else if(cn.includes('엔') || cn === 'JPY') s = '¥'; + else if(cn.includes('위안') || cn === 'CNY') s = '¥'; + return s + Number(value).toLocaleString(); + } }, {headerHozAlign : 'center', hozAlign : 'center', minWidth : 100, widthGrow : 1, title : '업체성적서', field : 'INSPECTION_FILE_CNT', formatter:fnc_subInfoValueFormatter, @@ -382,19 +416,21 @@ function fn_formPopUp(objId, formType){ var url = ""; if(formType == 'outsourcing'){ - // 외주가공 발주서 양식 target = "purchaseOrderFormPopup_outsourcing"; url = "/purchaseOrder/purchaseOrderFormPopup_outsourcing.do"; popup_width = 1200; popup_height = 900; + } else if(formType == 'english'){ + target = "purchaseOrderFormPopup_english"; + url = "/purchaseOrder/purchaseOrderFormPopup_english.do"; + popup_width = 1100; + popup_height = 900; } else if(formType == 'general'){ - // 일반 발주서 양식 target = "purchaseOrderFormPopup_general"; url = "/purchaseOrder/purchaseOrderFormPopup_general.do"; popup_width = 1000; popup_height = 900; } else { - // 기존 발주서 양식 (FORM_TYPE이 없거나 기존 데이터) target = "purchaseOrderFormPopup_new"; url = "/purchaseOrder/purchaseOrderFormPopup_new.do"; } diff --git a/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptancePartList.jsp b/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptancePartList.jsp index 1234f82..f76b09d 100644 --- a/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptancePartList.jsp +++ b/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptancePartList.jsp @@ -128,6 +128,7 @@ var columns = [ {headerHozAlign:'center', hozAlign:'left', minWidth:120, widthGrow:1.5, title:'품번', field:'PART_NO'}, {headerHozAlign:'center', hozAlign:'left', minWidth:150, widthGrow:2, title:'품명', field:'PART_NAME'}, {headerHozAlign:'center', hozAlign:'left', minWidth:120, widthGrow:1.2, title:'공급업체', field:'PARTNER_NAME'}, + {headerHozAlign:'center', hozAlign:'center', minWidth:60, widthGrow:0.6, title:'환종', field:'CURRENCY_NAME'}, {headerHozAlign:'center', hozAlign:'center', minWidth:100, widthGrow:0.8, title:'입고요청일', field:'DELIVERY_REQUEST_DATE'}, {headerHozAlign : 'center', hozAlign : 'center', minWidth : 90, widthGrow : 1, title : '구매담당자', field : 'WRITER_NAME' }, {headerHozAlign:'center', hozAlign:'right', minWidth:80, widthGrow:0.8, title:'발주수량', field:'ORDER_QTY', @@ -140,13 +141,46 @@ var columns = [ formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false} }, {headerHozAlign : 'center', hozAlign : 'right', minWidth : 90, widthGrow : 1, title : '발주금액', field : 'TOTAL_SUPPLY_PRICE', - formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false } + formatter: function(cell) { + var value = cell.getValue(); + if(!value || value === '' || value === '0') return ''; + var cn = cell.getRow().getData().CURRENCY_NAME || ''; + var s = ''; + if(cn.includes('원') || cn === 'KRW') s = '₩'; + else if(cn.includes('달러') || cn === 'USD') s = '$'; + else if(cn.includes('유로') || cn === 'EUR') s = '€'; + else if(cn.includes('엔') || cn === 'JPY') s = '¥'; + else if(cn.includes('위안') || cn === 'CNY') s = '¥'; + return s + Number(value).toLocaleString(); + } }, {headerHozAlign : 'center', hozAlign : 'right', minWidth : 90, widthGrow : 1, title : '입고금액', field : 'TOTAL_DELIVERY_PRICE', - formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false } + formatter: function(cell) { + var value = cell.getValue(); + if(!value || value === '' || value === '0') return ''; + var cn = cell.getRow().getData().CURRENCY_NAME || ''; + var s = ''; + if(cn.includes('원') || cn === 'KRW') s = '₩'; + else if(cn.includes('달러') || cn === 'USD') s = '$'; + else if(cn.includes('유로') || cn === 'EUR') s = '€'; + else if(cn.includes('엔') || cn === 'JPY') s = '¥'; + else if(cn.includes('위안') || cn === 'CNY') s = '¥'; + return s + Number(value).toLocaleString(); + } }, {headerHozAlign : 'center', hozAlign : 'right', minWidth : 90, widthGrow : 1, title : '미입고금액', field : 'TOTAL_NOT_DELIVERY_PRICE', - formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false } + formatter: function(cell) { + var value = cell.getValue(); + if(!value || value === '' || value === '0') return ''; + var cn = cell.getRow().getData().CURRENCY_NAME || ''; + var s = ''; + if(cn.includes('원') || cn === 'KRW') s = '₩'; + else if(cn.includes('달러') || cn === 'USD') s = '$'; + else if(cn.includes('유로') || cn === 'EUR') s = '€'; + else if(cn.includes('엔') || cn === 'JPY') s = '¥'; + else if(cn.includes('위안') || cn === 'CNY') s = '¥'; + return s + Number(value).toLocaleString(); + } }, {headerHozAlign:'center', hozAlign:'center', minWidth:90, widthGrow:1.1, title:'수입검사 검사현황', field:'INSPECTION_STATUS'}, {headerHozAlign:'center', hozAlign:'right', minWidth:80, widthGrow:1.1, title:'처리결과 폐기수량', field:'DEFECT_QTY', @@ -253,6 +287,11 @@ function fn_formPopUp(objId, formType){ url = "/purchaseOrder/purchaseOrderFormPopup_outsourcing.do"; popup_width = 1200; popup_height = 900; + } else if(formType == 'english'){ + target = "purchaseOrderFormPopup_english"; + url = "/purchaseOrder/purchaseOrderFormPopup_english.do"; + popup_width = 1100; + popup_height = 900; } else if(formType == 'general'){ target = "purchaseOrderFormPopup_general"; url = "/purchaseOrder/purchaseOrderFormPopup_general.do"; diff --git a/WebContent/WEB-INF/view/purchaseOrder/purchaseCloseList.jsp b/WebContent/WEB-INF/view/purchaseOrder/purchaseCloseList.jsp index 24603c5..5f03c2a 100644 --- a/WebContent/WEB-INF/view/purchaseOrder/purchaseCloseList.jsp +++ b/WebContent/WEB-INF/view/purchaseOrder/purchaseCloseList.jsp @@ -99,6 +99,7 @@ var columns = [ {headerHozAlign:'center', hozAlign:'left', minWidth:120, widthGrow:1.5, title:'품번', field:'PART_NO', frozen:true}, {headerHozAlign:'center', hozAlign:'left', minWidth:150, widthGrow:2, title:'품명', field:'PART_NAME', frozen:true}, {headerHozAlign:'center', hozAlign:'left', minWidth:120, widthGrow:1.2, title:'공급업체', field:'PARTNER_NAME'}, + {headerHozAlign:'center', hozAlign:'center', minWidth:60, widthGrow:0.6, title:'환종', field:'CURRENCY_NAME'}, {headerHozAlign:'center', hozAlign:'center', minWidth:90, widthGrow:0.7, title:'입고일', field:'RECEIPT_DATE'}, //{headerHozAlign:'center', hozAlign:'center', minWidth:100, widthGrow:0.8, title:'입고요청일', field:'DELIVERY_REQUEST_DATE'}, {headerHozAlign:'center', hozAlign:'center', minWidth:90, widthGrow:1, title:'구매담당자', field:'WRITER_NAME'}, @@ -115,7 +116,18 @@ var columns = [ // formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false} // }, {headerHozAlign:'center', hozAlign:'right', minWidth:90, widthGrow:1, title:'입고금액', field:'TOTAL_DELIVERY_PRICE', - formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false} + formatter: function(cell) { + var value = cell.getValue(); + if(!value || value === '' || value === '0') return ''; + var cn = cell.getRow().getData().CURRENCY_NAME || ''; + var s = ''; + if(cn.includes('원') || cn === 'KRW') s = '₩'; + else if(cn.includes('달러') || cn === 'USD') s = '$'; + else if(cn.includes('유로') || cn === 'EUR') s = '€'; + else if(cn.includes('엔') || cn === 'JPY') s = '¥'; + else if(cn.includes('위안') || cn === 'CNY') s = '¥'; + return s + Number(value).toLocaleString(); + } }, // {headerHozAlign:'center', hozAlign:'right', minWidth:90, widthGrow:1, title:'미입고금액', field:'TOTAL_NOT_DELIVERY_PRICE', // formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false} @@ -183,6 +195,11 @@ function fn_formPopUp(objId, formType){ url = "/purchaseOrder/purchaseOrderFormPopup_outsourcing.do"; popup_width = 1200; popup_height = 900; + } else if(formType == 'english'){ + target = "purchaseOrderFormPopup_english"; + url = "/purchaseOrder/purchaseOrderFormPopup_english.do"; + popup_width = 1100; + popup_height = 900; } else if(formType == 'general'){ target = "purchaseOrderFormPopup_general"; url = "/purchaseOrder/purchaseOrderFormPopup_general.do"; diff --git a/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_english.jsp b/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_english.jsp index 41a3f73..432d1f1 100644 --- a/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_english.jsp +++ b/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_english.jsp @@ -191,11 +191,14 @@ $(document).ready(function(){ var unit_cd = $.parseJSON($("#unit_cd").val()); var currency_cd = $.parseJSON($("#currency_cd").val()); + var _gridData = $.parseJSON($("#gridDetailList").val()); + console.log("=== gridDetailList ===", JSON.stringify(_gridData)); + console.log("=== currency_cd ===", JSON.stringify(currency_cd)); grid = $("#grid1").jqGrid({ url: "" ,datatype: "local" - ,data: $.parseJSON($("#gridDetailList").val()) + ,data: _gridData ,colNames: ["OBJID","PART_OBJID","Item No.","Commodity & Description","Spec","Unit","Q'ty","Currency","Unit Price","Amount","Delivery"] ,colModel: [ {name:"OBJID" , hidden: true, sortable:false, editable:false} @@ -216,7 +219,7 @@ $(document).ready(function(){ } ,{name:"CURRENCY" , width:65, align:"center", sortable:false, editable:<%= isModify %> ,edittype:"select", formatter:"select" - ,editoptions:{ value: currency_cd, defaultValue: "USD" } + ,editoptions:{ value: currency_cd, defaultValue: "0001534" } } ,{name:"PARTNER_PRICE" , width:80, align:"right", sortable:false, editable:<%= isModify %> ,formatter:"number", formatoptions:{thousandsSeparator:",", decimalPlaces:2} @@ -343,7 +346,7 @@ function fn_addRow(rowData){ ,"SPEC" : rowData.map.SPEC ,"ORDER_QTY" : v1 ,"UNIT" : fnc_checkNullDefaultValue(rowData.map.UNIT, '0001400') - ,"CURRENCY" : "USD" + ,"CURRENCY" : "0001534" ,"PARTNER_PRICE" : v2 ,"SUPPLY_UNIT_PRICE": _rowSum ,"DELIVERY_REQUEST_DATE" : "" @@ -464,11 +467,19 @@ var gridFn = { var vat = Math.floor(totalAmount * 0.1); var totalWithVat = totalAmount + vat; + var ids = grid.jqGrid('getDataIDs'); + var currencyCode = '0001534'; + if(ids.length > 0) { + var $sel = $("#grid1").find("#" + ids[0] + "_CURRENCY"); + currencyCode = $sel.length > 0 ? $sel.val() : (grid.jqGrid('getCell', ids[0], 'CURRENCY') || '0001534'); + } + var currencySymbol = getCurrencySymbol(currencyCode); + $("#TOTAL_AMOUNT").val(numberWithCommasDecimal(totalAmount)); $("#TOTAL_SUPPLY_PRICE").val(numberWithCommasDecimal(totalAmount)); $("#TOTAL_VAT").val(numberWithCommasDecimal(vat)); $("#TOTAL_PRICE_ALL").val(numberWithCommasDecimal(totalWithVat)); - $("#TOTAL_AMOUNT_DISPLAY").text("US$" + numberWithCommasDecimal(totalAmount)); + $("#TOTAL_AMOUNT_DISPLAY").text(currencySymbol + numberWithCommasDecimal(totalAmount)); } } @@ -477,6 +488,11 @@ function numberWithCommasDecimal(num) { return n.toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ","); } +function getCurrencySymbol(currencyCode) { + var symbolMap = { '0001534': 'US$', '0001535': '€', '0001536': '¥', '0001537': '¥', '0001566': '₩' }; + return symbolMap[currencyCode] || 'US$'; +} + $(window).on('load', function() { setTimeout(function() { if(typeof html2canvas !== 'undefined' && typeof jspdf !== 'undefined') { diff --git a/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderList_new.jsp b/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderList_new.jsp index 93e4b89..c0ac38f 100644 --- a/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderList_new.jsp +++ b/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderList_new.jsp @@ -348,8 +348,20 @@ var columns = [ {headerHozAlign:'center', hozAlign:'left', widthGrow:1.5, title:'품번', field:'PART_NO'}, {headerHozAlign:'center', hozAlign:'left', widthGrow:2, title:'품명', field:'PART_NAME'}, {headerHozAlign:'center', hozAlign:'left', widthGrow:1.5, title:'공급업체', field:'PARTNER_NAME'}, + {headerHozAlign:'center', hozAlign:'center', widthGrow:0.6, title:'환종', field:'CURRENCY_NAME'}, {headerHozAlign:'center', hozAlign:'right', widthGrow:1.2, title:'총액', field:'TOTAL_SUPPLY_PRICE', - formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false} + formatter: function(cell) { + var value = cell.getValue(); + if(!value || value === '' || value === '0') return ''; + var currencyName = cell.getRow().getData().CURRENCY_NAME || ''; + var s = ''; + if(currencyName.includes('원') || currencyName === 'KRW') s = '₩'; + else if(currencyName.includes('달러') || currencyName === 'USD') s = '$'; + else if(currencyName.includes('유로') || currencyName === 'EUR') s = '€'; + else if(currencyName.includes('엔') || currencyName === 'JPY') s = '¥'; + else if(currencyName.includes('위안') || currencyName === 'CNY') s = '¥'; + return s + Number(value).toLocaleString(); + } }, // {headerHozAlign:'center', hozAlign:'right', widthGrow:1.2, title:'총액', field:'TOTAL_PRICE_ALL', // formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false} diff --git a/WebContent/WEB-INF/view/salesMng/proposalFormPopUp.jsp b/WebContent/WEB-INF/view/salesMng/proposalFormPopUp.jsp index a6c0aa2..821a5e6 100644 --- a/WebContent/WEB-INF/view/salesMng/proposalFormPopUp.jsp +++ b/WebContent/WEB-INF/view/salesMng/proposalFormPopUp.jsp @@ -396,7 +396,6 @@ var proposalStatus = "${resultMap.STATUS}"; var amaranthStatus = "${resultMap.AMARANTH_STATUS}"; var isReadOnly = (proposalStatus == "approvalComplete" || proposalStatus == "approvalRequest" || amaranthStatus == "complete" || amaranthStatus == "inProcess"); - $(document).ready(function(){ // 결재완료/결재중이면 수정 불가 처리 if(isReadOnly){ @@ -430,6 +429,7 @@ $(document).ready(function(){ changeYear: true }); } + }); // 숫자 포맷팅 @@ -452,12 +452,14 @@ function fn_save(){ var remark = $(this).find(".part-remark").val(); var deliveryDate = $(this).find(".part-delivery-date").val(); var unit = $(this).find(".part-unit").val(); + var currency = $(this).find(".part-currency").val(); partList.push({ PART_OBJID: String(partObjId), REMARK: remark, DELIVERY_REQUEST_DATE: deliveryDate, - UNIT: unit + UNIT: unit, + CURRENCY: currency }); }); @@ -827,6 +829,7 @@ function fn_save(){ 품 명 규 격 업 체 명 + 환 종 입고요청일 수량 단위 @@ -848,6 +851,15 @@ function fn_save(){ ${item.DISPLAY_PART_NAME} ${item.DISPLAY_SPEC} ${item.VENDOR_NAME} + + + + @@ -868,7 +880,7 @@ function fn_save(){ - 등록된 품목이 없습니다. + 등록된 품목이 없습니다. @@ -888,6 +900,7 @@ function fn_save(){       +   diff --git a/WebContent/WEB-INF/view/salesMng/quotationRequestFormPopup.jsp b/WebContent/WEB-INF/view/salesMng/quotationRequestFormPopup.jsp index 3db9ac7..9ccef93 100644 --- a/WebContent/WEB-INF/view/salesMng/quotationRequestFormPopup.jsp +++ b/WebContent/WEB-INF/view/salesMng/quotationRequestFormPopup.jsp @@ -291,6 +291,15 @@ function fn_initGrid() { field: 'VENDOR_NAME' }); + // 환종 + columns.push({ + headerHozAlign: 'center', + hozAlign: 'center', + width: 70, + title: '환종', + field: 'CURRENCY_NAME' + }); + // 단가 (수정가능 - 클릭 시 전체 선택) columns.push({ headerHozAlign: 'center', diff --git a/src/com/pms/controller/PurchaseOrderController.java b/src/com/pms/controller/PurchaseOrderController.java index 656b763..06bc842 100644 --- a/src/com/pms/controller/PurchaseOrderController.java +++ b/src/com/pms/controller/PurchaseOrderController.java @@ -949,8 +949,10 @@ public class PurchaseOrderController { if("".equals(unit)) unit = CommonUtils.checkNull(partRow.get("unit")); detailRow.put("UNIT", "".equals(unit) ? "0001400" : unit); - // 환종: 기본 USD - detailRow.put("CURRENCY", "USD"); + // 환종: MBOM에서 넘어온 값 사용, 없으면 달러(0001534) + String currency = CommonUtils.checkNull(partRow.get("CURRENCY")); + if("".equals(currency)) currency = CommonUtils.checkNull(partRow.get("currency")); + detailRow.put("CURRENCY", "".equals(currency) ? "0001534" : currency); Object priceObj = partRow.get("UNIT_PRICE"); if(priceObj == null) priceObj = partRow.get("unit_price"); @@ -973,6 +975,14 @@ public class PurchaseOrderController { info = purchaseOrderService.getPurchaseOrderMasterInfo(request, paramMap); paramMap.put("MULTI_MASTER_OBJID", objId); detailList = commonService.selectList("purchaseOrder.getPURCHASE_ORDER_PART", request, paramMap); + for(int i = 0; i < detailList.size(); i++){ + Map row = (Map) detailList.get(i); + String currency = CommonUtils.checkNull(row.get("CURRENCY")); + String fallbackCurrency = CommonUtils.checkNull(row.get("FALLBACK_CURRENCY")); + if("".equals(currency) && !"".equals(fallbackCurrency)){ + row.put("CURRENCY", fallbackCurrency); + } + } } code_map.put("partner_cd", commonService.bizMakeOptionList("", (String)info.get("PARTNER_OBJID"),"common.getClientMngSupplySelect")); diff --git a/src/com/pms/mapper/purchaseOrder.xml b/src/com/pms/mapper/purchaseOrder.xml index 439b079..4c1738c 100644 --- a/src/com/pms/mapper/purchaseOrder.xml +++ b/src/com/pms/mapper/purchaseOrder.xml @@ -2359,7 +2359,14 @@ @@ -3361,6 +3368,11 @@ SELECT POM.OBJID FROM PURCHASE_ORDER_PART POP WHERE POP.PURCHASE_ORDER_MASTER_OBJID = POM.OBJID ) AS PART_NAME + ,(SELECT CC.CODE_NAME FROM COMM_CODE CC + WHERE CC.CODE_ID = (SELECT POP.CURRENCY FROM PURCHASE_ORDER_PART POP + WHERE POP.PURCHASE_ORDER_MASTER_OBJID = POM.OBJID::VARCHAR + AND POP.CURRENCY IS NOT NULL AND POP.CURRENCY != '' LIMIT 1) + ) AS CURRENCY_NAME FROM PURCHASE_ORDER_MASTER AS POM LEFT OUTER JOIN( SELECT B.OBJID AS ROUTE_OBJID @@ -4435,6 +4447,11 @@ SELECT POM.OBJID ,(SELECT user_name(RECEIVER_ID) FROM ARRIVAL_PLAN AP WHERE AP.parent_objid = POM.OBJID ORDER BY AP.RECEIPT_DATE desc LIMIT 1) AS CUR_RECEIVER_NAME ,(SELECT COUNT(1) FROM ATTACH_FILE_INFO AF WHERE AF.TARGET_OBJID = POM.OBJID AND AF.DOC_TYPE = 'INSPECTION_FILE' AND UPPER(AF.STATUS) = 'ACTIVE') AS INSPECTION_FILE_CNT ,POM.PURCHASE_CLOSE_DATE + ,(SELECT CC.CODE_NAME FROM COMM_CODE CC + WHERE CC.CODE_ID = (SELECT POP2.CURRENCY FROM PURCHASE_ORDER_PART POP2 + WHERE POP2.PURCHASE_ORDER_MASTER_OBJID = POM.OBJID::VARCHAR + AND POP2.CURRENCY IS NOT NULL AND POP2.CURRENCY != '' LIMIT 1) + ) AS CURRENCY_NAME FROM PURCHASE_ORDER_MASTER AS POM ,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = POM.WRITER) AS WRITER_NAME + + ,(SELECT CC.CODE_NAME FROM COMM_CODE CC + WHERE CC.CODE_ID = POP.CURRENCY) AS CURRENCY_NAME + ,COALESCE(POP.ORDER_QTY::NUMERIC, 0) AS ORDER_QTY @@ -6539,6 +6560,10 @@ FROM( ,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = POM.WRITER) AS WRITER_NAME + + ,(SELECT CC.CODE_NAME FROM COMM_CODE CC + WHERE CC.CODE_ID = POP.CURRENCY) AS CURRENCY_NAME + ,AP.RECEIPT_DATE diff --git a/src/com/pms/mapper/salesMng.xml b/src/com/pms/mapper/salesMng.xml index 39616cb..62a854f 100644 --- a/src/com/pms/mapper/salesMng.xml +++ b/src/com/pms/mapper/salesMng.xml @@ -4036,6 +4036,7 @@ ORDER BY V.PATH2 COALESCE(MIN(MD.RAW_MATERIAL_SIZE), '') AS SIZE, MIN(MD.UNIT) AS UNIT, COALESCE(MIN(MD.USE_YN), 'Y') AS USE_YN, + MIN(MD.CURRENCY) AS CURRENCY, 'MBOM' AS DATA_SOURCE, 'MATERIAL' AS PROPOSAL_TYPE FROM @@ -4078,6 +4079,7 @@ ORDER BY V.PATH2 SUM(COALESCE(MD.PRODUCTION_QTY, 0)) AS PRODUCTION_QTY, MIN(MD.UNIT) AS UNIT, COALESCE(MIN(MD.USE_YN), 'Y') AS USE_YN, + MIN(MD.CURRENCY) AS CURRENCY, 'MBOM' AS DATA_SOURCE, 'PROCESSING' AS PROPOSAL_TYPE FROM @@ -4349,6 +4351,7 @@ ORDER BY V.PATH2 PRODUCTION_QTY, USE_YN, MATERIAL_YN, + CURRENCY, PROPOSAL_DATE, WRITER, REGDATE @@ -4366,6 +4369,7 @@ ORDER BY V.PATH2 #{PRODUCTION_QTY}, #{USE_YN}, #{MATERIAL_YN}, + #{CURRENCY}, NOW(), #{WRITER}, NOW() @@ -4389,6 +4393,7 @@ ORDER BY V.PATH2 PRODUCTION_QTY, USE_YN, MATERIAL_YN, + CURRENCY, PROPOSAL_DATE, WRITER, REGDATE @@ -4406,6 +4411,7 @@ ORDER BY V.PATH2 #{PRODUCTION_QTY}, #{USE_YN}, #{MATERIAL_YN}, + #{CURRENCY}, NOW(), #{WRITER}, NOW() @@ -5072,7 +5078,43 @@ ORDER BY V.PATH2 /* 품명: 소재있으면 소재품명(현재 PM), 없으면 부품명(현재 PM) */ PM.PART_NAME AS DISPLAY_PART_NAME, /* 규격: 품명의 규격 */ - PM.SPEC AS DISPLAY_SPEC + PM.SPEC AS DISPLAY_SPEC, + /* 환종 코드값: SRP에 저장된 값 우선, 없으면 MBOM에서 조회 */ + COALESCE( + NULLIF(SRP.CURRENCY, ''), + CASE WHEN COALESCE(SRP.MATERIAL_YN, 'N') = 'Y' AND SRM.MBOM_HEADER_OBJID IS NOT NULL THEN + (SELECT MD.CURRENCY FROM MBOM_DETAIL MD + WHERE MD.RAW_MATERIAL_PART_NO = PM.PART_NO + AND MD.MBOM_HEADER_OBJID::VARCHAR = SRM.MBOM_HEADER_OBJID::VARCHAR + LIMIT 1) + WHEN SRM.MBOM_HEADER_OBJID IS NOT NULL THEN + (SELECT MD.CURRENCY FROM MBOM_DETAIL MD + WHERE MD.PART_OBJID::VARCHAR = SRP.PART_OBJID::VARCHAR + AND MD.MBOM_HEADER_OBJID::VARCHAR = SRM.MBOM_HEADER_OBJID::VARCHAR + LIMIT 1) + ELSE NULL + END + ) AS CURRENCY, + /* 환종명 */ + COALESCE( + (SELECT CC.CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = + COALESCE( + NULLIF(SRP.CURRENCY, ''), + CASE WHEN COALESCE(SRP.MATERIAL_YN, 'N') = 'Y' AND SRM.MBOM_HEADER_OBJID IS NOT NULL THEN + (SELECT MD.CURRENCY FROM MBOM_DETAIL MD + WHERE MD.RAW_MATERIAL_PART_NO = PM.PART_NO + AND MD.MBOM_HEADER_OBJID::VARCHAR = SRM.MBOM_HEADER_OBJID::VARCHAR + LIMIT 1) + WHEN SRM.MBOM_HEADER_OBJID IS NOT NULL THEN + (SELECT MD.CURRENCY FROM MBOM_DETAIL MD + WHERE MD.PART_OBJID::VARCHAR = SRP.PART_OBJID::VARCHAR + AND MD.MBOM_HEADER_OBJID::VARCHAR = SRM.MBOM_HEADER_OBJID::VARCHAR + LIMIT 1) + ELSE NULL + END + ) + ), '' + ) AS CURRENCY_NAME FROM SALES_REQUEST_PART SRP LEFT JOIN PART_MNG PM ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR @@ -5102,7 +5144,8 @@ ORDER BY V.PATH2 UPDATE SALES_REQUEST_PART SET DELIVERY_REQUEST_DATE = CASE WHEN #{DELIVERY_REQUEST_DATE} IS NOT NULL AND #{DELIVERY_REQUEST_DATE} != '' THEN #{DELIVERY_REQUEST_DATE} ELSE NULL END, UNIT = #{UNIT}, - REMARK = #{REMARK} + REMARK = #{REMARK}, + CURRENCY = #{CURRENCY} WHERE OBJID = #{PART_OBJID} @@ -5366,9 +5409,20 @@ ORDER BY V.PATH2 -- 마스터 정보 QRM.VENDOR_TYPE, QRM.VENDOR_OBJID, - (SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = QRM.VENDOR_OBJID) AS VENDOR_NAME + (SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = QRM.VENDOR_OBJID) AS VENDOR_NAME, + /* 환종: MBOM에서 환종 코드명 조회 */ + COALESCE( + (SELECT CC.CODE_NAME FROM MBOM_DETAIL MD + JOIN COMM_CODE CC ON CC.CODE_ID = MD.CURRENCY + WHERE MD.MBOM_HEADER_OBJID::VARCHAR = SRM.MBOM_HEADER_OBJID::VARCHAR + AND (MD.PART_OBJID::VARCHAR = QRD.PART_OBJID::VARCHAR + OR MD.RAW_MATERIAL_PART_NO = QRD.PART_NO) + AND MD.CURRENCY IS NOT NULL AND MD.CURRENCY != '' + LIMIT 1), '' + ) AS CURRENCY_NAME FROM QUOTATION_REQUEST_DETAIL QRD LEFT JOIN QUOTATION_REQUEST_MASTER QRM ON QRD.QUOTATION_REQUEST_MASTER_OBJID = QRM.OBJID + LEFT JOIN SALES_REQUEST_MASTER SRM ON QRM.SALES_REQUEST_MASTER_OBJID::VARCHAR = SRM.OBJID::VARCHAR WHERE QRD.QUOTATION_REQUEST_MASTER_OBJID = #{QUOTATION_REQUEST_MASTER_OBJID}::NUMERIC ORDER BY QRD.OBJID diff --git a/src/com/pms/salesmgmt/controller/SalesMngController.java b/src/com/pms/salesmgmt/controller/SalesMngController.java index aad912e..3b817f3 100644 --- a/src/com/pms/salesmgmt/controller/SalesMngController.java +++ b/src/com/pms/salesmgmt/controller/SalesMngController.java @@ -1430,7 +1430,9 @@ public class SalesMngController { code_map.put("product_name", commonService.bizMakeOptionList("0000016", (String)resultMap.get("PRODUCT_NAME"), "common.getCodeselect")); // 단위 코드 목록 (UNIT_CD: 단위) code_map.put("unit_list", commonService.bizMakeOptionList("0001399", "", "common.getCodeselect")); - + // 환종 코드 목록 + code_map.put("currency_list", commonService.bizMakeOptionList("0001533", "", "common.getCodeselect")); + } catch (Exception e) { e.printStackTrace(); } diff --git a/src/com/pms/salesmgmt/service/SalesMngService.java b/src/com/pms/salesmgmt/service/SalesMngService.java index b46a322..1b642c1 100644 --- a/src/com/pms/salesmgmt/service/SalesMngService.java +++ b/src/com/pms/salesmgmt/service/SalesMngService.java @@ -2226,6 +2226,7 @@ public class SalesMngService { partParam.put("PRODUCTION_QTY", part.get("PRODUCTION_QTY")); partParam.put("USE_YN", CommonUtils.checkNull(part.get("USE_YN"))); partParam.put("MATERIAL_YN", isMaterial ? "Y" : "N"); + partParam.put("CURRENCY", CommonUtils.checkNull(part.get("CURRENCY"))); if("PROCESSING".equals(proposalType)) { sqlSession.insert("salesMng.insertProposalPartFromMBomProcessing", partParam);