From d45261788cd0175219e109c00be5bb7e720bb616 Mon Sep 17 00:00:00 2001 From: Johngreen Date: Wed, 22 Oct 2025 21:00:17 +0900 Subject: [PATCH] =?UTF-8?q?=EC=88=98=EC=A3=BC/=EB=A7=A4=EC=B6=9C=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=20=EA=B8=B0=EB=8A=A5=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?-=20ORDER=5FDATE=20=ED=95=84=EB=93=9C=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EB=B0=8F=20=EC=88=98=EC=A3=BC=20=ED=95=A9=EA=B3=84=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/pms/salesmgmt/mapper/contractMgmt.xml | 57 +-- .../salesmgmt/mapper/salesNcollectMgmt.xml | 446 ++++++------------ .../salesmgmt/salesMgmt/revenueMgmtList.jsp | 2 +- .../salesmgmt/salesMgmt/salesMgmtList.jsp | 2 +- .../view/salesmgmt/salesMgmt/salesRegForm.jsp | 61 ++- .../SalesNcollectMgmtController.java | 29 +- .../salesmgmt/mapper/salesNcollectMgmt.xml | 153 +++--- 7 files changed, 306 insertions(+), 444 deletions(-) diff --git a/WebContent/WEB-INF/classes/com/pms/salesmgmt/mapper/contractMgmt.xml b/WebContent/WEB-INF/classes/com/pms/salesmgmt/mapper/contractMgmt.xml index 844c376..4717863 100644 --- a/WebContent/WEB-INF/classes/com/pms/salesmgmt/mapper/contractMgmt.xml +++ b/WebContent/WEB-INF/classes/com/pms/salesmgmt/mapper/contractMgmt.xml @@ -463,7 +463,7 @@ ,TO_CHAR(REGDATE,'YYYY-MM-DD') AS REG_DATE ,WRITER ,(SELECT USER_NAME FROM USER_INFO AS O WHERE O.USER_ID = T.WRITER ) AS WRITER_NAME - ,(SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = T.OBJID AND DOC_TYPE='ORDER_DOC' AND UPPER(STATUS) = 'ACTIVE') AS CU01_CNT + ,(SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = T.OBJID AND DOC_TYPE IN ('FTC_ORDER', 'ORDER') AND UPPER(STATUS) = 'ACTIVE') AS CU01_CNT ,(CASE WHEN (RESULT_CD is null or RESULT_CD ='') and (SPEC_RESULT_CD is null or RESULT_CD ='') and (EST_RESULT_CD is null or RESULT_CD ='') then '0' @@ -574,7 +574,7 @@ AND DUE_DATE != '' ) AS OTHER_DUE_DATE_COUNT ,( - SELECT RETURN_REASON + SELECT CODE_NAME(RETURN_REASON) FROM CONTRACT_ITEM WHERE CONTRACT_OBJID = T.OBJID AND STATUS = 'ACTIVE' @@ -942,9 +942,7 @@ ,CONTRACT_DEL_DATE ,CONTRACT_COMPANY ,CONTRACT_DATE - ,PO_NO ,MANUFACTURE_PLANT - ,CONTRACT_RESULT ,PROJECT_NAME ,SPEC_USER_ID ,SPEC_PLAN_DATE @@ -968,12 +966,7 @@ ,QUANTITY ,CUSTOMER_REQUEST ,EXCHANGE_RATE - ,ORDER_DATE - ,ORDER_UNIT_PRICE - ,ORDER_SUPPLY_PRICE - ,ORDER_VAT - ,ORDER_TOTAL_AMOUNT - ) + ) VALUES ( #{objId} @@ -1009,9 +1002,7 @@ ,#{contract_del_date} ,#{contract_company} ,#{contract_date} - ,#{po_no} ,#{manufacture_plant} - ,#{contract_result} ,#{project_name} ,#{spec_user_id} ,#{spec_plan_date} @@ -1035,12 +1026,7 @@ ,#{quantity} ,#{customer_request} ,#{exchange_rate} - ,#{order_date} - ,#{unit_price} - ,#{supply_price} - ,#{vat} - ,#{total_amount} - ) + ) ON CONFLICT (OBJID) DO UPDATE SET @@ -1073,11 +1059,9 @@ ,CONTRACT_DEL_DATE = #{contract_del_date} ,CONTRACT_COMPANY = #{contract_company} ,CONTRACT_DATE = #{contract_date} - ,PO_NO = #{po_no} ,MANUFACTURE_PLANT = #{manufacture_plant} - ,CONTRACT_RESULT = #{contract_result} ,PROJECT_NAME = #{project_name} - ,SPEC_USER_ID = #{spec_user_id} + ,SPEC_USER_ID = #{spec_user_id} ,SPEC_PLAN_DATE = #{spec_plan_date} ,SPEC_COMP_DATE = #{spec_comp_date} ,SPEC_RESULT_CD = #{spec_result_cd} @@ -1098,12 +1082,7 @@ ,SERIAL_NO = #{serial_no} ,QUANTITY = #{quantity} ,CUSTOMER_REQUEST = #{customer_request} - ,EXCHANGE_RATE = #{exchange_rate} - ,ORDER_DATE = #{order_date} - ,ORDER_UNIT_PRICE = #{unit_price} - ,ORDER_SUPPLY_PRICE = #{supply_price} - ,ORDER_VAT = #{vat} - ,ORDER_TOTAL_AMOUNT = #{total_amount} + ,EXCHANGE_RATE = #{exchange_rate} @@ -3979,6 +3958,7 @@ ORDER BY ASM.SUPPLY_NAME TEMPLATE_OBJID, SEQ, CATEGORY, + PART_OBJID, DESCRIPTION, SPECIFICATION, QUANTITY, @@ -4001,6 +3981,7 @@ ORDER BY ASM.SUPPLY_NAME TEMPLATE_OBJID, SEQ, CATEGORY, + PART_OBJID, DESCRIPTION, SPECIFICATION, QUANTITY, @@ -4115,6 +4096,7 @@ WHERE TEMPLATE_OBJID, SEQ, CATEGORY, + PART_OBJID, DESCRIPTION, SPECIFICATION, QUANTITY, @@ -4128,18 +4110,13 @@ WHERE #{template_objid}, (item->>'seq')::INTEGER, item->>'category', + item->>'part_objid', item->>'description', item->>'specification', item->>'quantity', item->>'unit', - CASE - WHEN item->>'unit_price' = '' THEN NULL - ELSE (item->>'unit_price')::NUMERIC - END, - CASE - WHEN item->>'amount' = '' THEN NULL - ELSE (item->>'amount')::NUMERIC - END, + item->>'unit_price', + item->>'amount', item->>'note', item->>'remark' FROM json_array_elements(#{items_json}::json) AS item @@ -4707,4 +4684,14 @@ WHERE WHERE ITEM_OBJID = #{itemObjId} + + + \ No newline at end of file diff --git a/WebContent/WEB-INF/classes/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml b/WebContent/WEB-INF/classes/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml index 3fd34e5..d3d579b 100644 --- a/WebContent/WEB-INF/classes/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml +++ b/WebContent/WEB-INF/classes/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml @@ -814,9 +814,10 @@ - /* salesNcollectMgmt.getSaleInfo - 판매등록 팝업용 프로젝트 정보 조회 (리스트와 동일한 구조) */ + /* salesNcollectMgmt.getSaleInfo - 판매등록 팝업용 프로젝트 정보 조회 (sales_registration 테이블 사용) */ SELECT T.PROJECT_NO, CODE_NAME(T.CATEGORY_CD) AS ORDER_TYPE, @@ -1381,163 +1315,59 @@ ELSE CM.PAID_TYPE END FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PAYMENT_TYPE, - T.PART_NO AS PRODUCT_NO, - T.PART_NAME AS PRODUCT_NAME, - -- S/N 정보 (리스트와 동일: "첫번째 S/N 외 N건") + T.PART_NO AS PRODUCT_NO, + T.PART_NAME AS PRODUCT_NAME, + -- S/N 정보 (CONTRACT_ITEM_SERIAL에서만 조회, 품목별로 정확하게 매칭) + (SELECT STRING_AGG(CIS.SERIAL_NO, ',' ORDER BY CIS.SEQ) + FROM CONTRACT_ITEM CI + LEFT JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID + WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID + AND CI.PART_OBJID = T.PART_OBJID + AND CI.STATUS = 'ACTIVE' + AND UPPER(CIS.STATUS) = 'ACTIVE' + AND CIS.SERIAL_NO IS NOT NULL + ) AS SERIAL_NO, + COALESCE(T.QUANTITY::numeric, 0) AS ORDER_QUANTITY, + -- 요청납기: CONTRACT_ITEM 우선, 없으면 PROJECT_MGMT, 없으면 CONTRACT_MGMT COALESCE( - (SELECT - CASE - WHEN COUNT(*) = 0 THEN '' - WHEN COUNT(*) = 1 THEN MIN(CIS.SERIAL_NO) - ELSE MIN(CIS.SERIAL_NO) || ' 외 ' || (COUNT(*) - 1)::TEXT || '건' - END - FROM CONTRACT_ITEM CI - LEFT JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID - WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID - AND UPPER(CIS.STATUS) = 'ACTIVE' - ), '' - ) AS SERIAL_NO, - -- S/N 전체 목록 JSON 형식으로 - COALESCE( - (SELECT - JSON_AGG( - JSON_BUILD_OBJECT( - 'id', sn_data.row_num, - 'value', sn_data.serial_no - ) - )::TEXT - FROM ( - SELECT - ROW_NUMBER() OVER (ORDER BY CIS.SERIAL_NO) AS row_num, - CIS.SERIAL_NO AS serial_no - FROM CONTRACT_ITEM CI - LEFT JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID - WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID - AND UPPER(CIS.STATUS) = 'ACTIVE' - AND CIS.SERIAL_NO IS NOT NULL - ) AS sn_data - ), '[]' - ) AS SERIAL_NO_LIST, - COALESCE(T.QUANTITY::numeric, 0) AS ORDER_QUANTITY, - T.DUE_DATE AS REQUEST_DATE, - T.CUSTOMER_PROJECT_NAME AS CUSTOMER_REQUEST, + (SELECT CI.DUE_DATE + FROM CONTRACT_ITEM CI + WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID + AND CI.PART_OBJID = T.PART_OBJID + AND CI.STATUS = 'ACTIVE'), + T.DUE_DATE, + (SELECT CM.due_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) + ) AS REQUEST_DATE, + COALESCE(T.CUSTOMER_PROJECT_NAME, (SELECT CM.customer_request FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS CUSTOMER_REQUEST, CODE_NAME(T.CONTRACT_RESULT) AS ORDER_STATUS, T.PO_NO, - T.CONTRACT_DATE AS ORDER_DATE, + COALESCE(T.CONTRACT_DATE, (SELECT CM.order_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS ORDER_DATE, CASE WHEN EXISTS( SELECT 1 FROM ATTACH_FILE_INFO - WHERE TARGET_OBJID = T.OBJID::VARCHAR + WHERE TARGET_OBJID = T.CONTRACT_OBJID AND DOC_TYPE='ORDER_DOC' AND UPPER(STATUS) = 'ACTIVE' - ) THEN 'Y' ELSE 'N' END AS ORDER_ATTACH, - (SELECT CM.PRODUCTION_STATUS FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PRODUCTION_STATUS, - -- 판매 관련 필드들 (shipment_log에서 가져오기) - COALESCE(( - SELECT SL.SHIPPING_STATUS - FROM SHIPMENT_LOG SL - WHERE SL.TARGET_OBJID = T.PROJECT_NO - AND SL.LOG_TYPE = 'SALES_REGISTRATION' - ORDER BY SL.REG_DATE DESC - LIMIT 1 - ), '') AS SHIPPING_ORDER_STATUS, - COALESCE(( - SELECT SL.SPLIT_QUANTITY - FROM SHIPMENT_LOG SL - WHERE SL.TARGET_OBJID = T.PROJECT_NO - AND SL.LOG_TYPE = 'SALES_REGISTRATION' - ORDER BY SL.REG_DATE DESC - LIMIT 1 - ), 0) AS SALES_QUANTITY, - COALESCE(( - SELECT SL.SALES_UNIT_PRICE - FROM SHIPMENT_LOG SL - WHERE SL.TARGET_OBJID = T.PROJECT_NO - AND SL.LOG_TYPE = 'SALES_REGISTRATION' - ORDER BY SL.REG_DATE DESC - LIMIT 1 - ), 0) AS SALES_UNIT_PRICE, - COALESCE(( - SELECT SL.SALES_SUPPLY_PRICE - FROM SHIPMENT_LOG SL - WHERE SL.TARGET_OBJID = T.PROJECT_NO - AND SL.LOG_TYPE = 'SALES_REGISTRATION' - ORDER BY SL.REG_DATE DESC - LIMIT 1 - ), 0) AS SALES_SUPPLY_PRICE, - COALESCE(( - SELECT SL.SALES_VAT - FROM SHIPMENT_LOG SL - WHERE SL.TARGET_OBJID = T.PROJECT_NO - AND SL.LOG_TYPE = 'SALES_REGISTRATION' - ORDER BY SL.REG_DATE DESC - LIMIT 1 - ), 0) AS SALES_VAT, - COALESCE(( - SELECT SL.SALES_TOTAL_AMOUNT - FROM SHIPMENT_LOG SL - WHERE SL.TARGET_OBJID = T.PROJECT_NO - AND SL.LOG_TYPE = 'SALES_REGISTRATION' - ORDER BY SL.REG_DATE DESC - LIMIT 1 - ), 0) AS SALES_TOTAL_AMOUNT, - COALESCE(( - SELECT SL.SALES_TOTAL_AMOUNT - FROM SHIPMENT_LOG SL - WHERE SL.TARGET_OBJID = T.PROJECT_NO - AND SL.LOG_TYPE = 'SALES_REGISTRATION' - ORDER BY SL.REG_DATE DESC - LIMIT 1 - ), 0) AS SALES_TOTAL_AMOUNT_KRW, - COALESCE(( - SELECT SL.SALES_CURRENCY - FROM SHIPMENT_LOG SL - WHERE SL.TARGET_OBJID = T.PROJECT_NO - AND SL.LOG_TYPE = 'SALES_REGISTRATION' - ORDER BY SL.REG_DATE DESC - LIMIT 1 - ), T.CONTRACT_CURRENCY) AS SALES_CURRENCY, - COALESCE(( - SELECT SL.SALES_EXCHANGE_RATE - FROM SHIPMENT_LOG SL - WHERE SL.TARGET_OBJID = T.PROJECT_NO - AND SL.LOG_TYPE = 'SALES_REGISTRATION' - ORDER BY SL.REG_DATE DESC - LIMIT 1 - ), T.CONTRACT_PRICE_CURRENCY::numeric, 0) AS SALES_EXCHANGE_RATE, - COALESCE(( - SELECT TO_CHAR(SL.SHIPPING_DATE, 'YYYY-MM-DD') - FROM SHIPMENT_LOG SL - WHERE SL.TARGET_OBJID = T.PROJECT_NO - AND SL.LOG_TYPE = 'SALES_REGISTRATION' - ORDER BY SL.REG_DATE DESC - LIMIT 1 - ), '') AS SHIPPING_DATE, - COALESCE(( - SELECT SL.SHIPPING_METHOD - FROM SHIPMENT_LOG SL - WHERE SL.TARGET_OBJID = T.PROJECT_NO - AND SL.LOG_TYPE = 'SALES_REGISTRATION' - ORDER BY SL.REG_DATE DESC - LIMIT 1 - ), '') AS SHIPPING_METHOD, - COALESCE(( - SELECT SL.MANAGER_USER_ID - FROM SHIPMENT_LOG SL - WHERE SL.TARGET_OBJID = T.PROJECT_NO - AND SL.LOG_TYPE = 'SALES_REGISTRATION' - ORDER BY SL.REG_DATE DESC - LIMIT 1 - ), T.PM_USER_ID) AS MANAGER, - COALESCE(( - SELECT SL.INCOTERMS - FROM SHIPMENT_LOG SL - WHERE SL.TARGET_OBJID = T.PROJECT_NO - AND SL.LOG_TYPE = 'SALES_REGISTRATION' - ORDER BY SL.REG_DATE DESC - LIMIT 1 - ), '') AS INCOTERMS - FROM PROJECT_MGMT AS T - WHERE T.PROJECT_NO = #{orderNo} + ) THEN 'Y' ELSE 'N' END AS ORDER_ATTACH, + (SELECT CM.PRODUCTION_STATUS FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PRODUCTION_STATUS, + -- 판매 관련 필드들 (sales_registration 테이블에서 가져오기) + COALESCE(SR.shipping_order_status, '') AS SHIPPING_ORDER_STATUS, + COALESCE(SR.sales_quantity, 0) AS SALES_QUANTITY, + COALESCE(SR.sales_unit_price, 0) AS SALES_UNIT_PRICE, + COALESCE(SR.sales_supply_price, 0) AS SALES_SUPPLY_PRICE, + COALESCE(SR.sales_vat, 0) AS SALES_VAT, + COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT, + COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT_KRW, + COALESCE(NULLIF(SR.sales_currency, ''), CM.CONTRACT_CURRENCY) AS SALES_CURRENCY, + CODE_NAME(COALESCE(NULLIF(SR.sales_currency, ''), CM.CONTRACT_CURRENCY)) AS SALES_CURRENCY_NAME, + COALESCE(NULLIF(SR.sales_exchange_rate, 0), CM.EXCHANGE_RATE::numeric, 0) AS SALES_EXCHANGE_RATE, + COALESCE(TO_CHAR(SR.shipping_date, 'YYYY-MM-DD'), '') AS SHIPPING_DATE, + COALESCE(SR.shipping_method, '') AS SHIPPING_METHOD, + COALESCE(SR.manager_user_id, T.PM_USER_ID) AS MANAGER, + COALESCE(SR.incoterms, '') AS INCOTERMS + FROM PROJECT_MGMT AS T + LEFT JOIN sales_registration SR ON T.PROJECT_NO = SR.project_no + LEFT JOIN CONTRACT_MGMT CM ON CM.OBJID::VARCHAR = T.CONTRACT_OBJID + WHERE T.PROJECT_NO = #{orderNo} diff --git a/WebContent/WEB-INF/view/salesmgmt/salesMgmt/revenueMgmtList.jsp b/WebContent/WEB-INF/view/salesmgmt/salesMgmt/revenueMgmtList.jsp index adbbec7..44898ac 100644 --- a/WebContent/WEB-INF/view/salesmgmt/salesMgmt/revenueMgmtList.jsp +++ b/WebContent/WEB-INF/view/salesmgmt/salesMgmt/revenueMgmtList.jsp @@ -171,7 +171,7 @@ var columns = [ {headerHozAlign : 'center', hozAlign : 'right', width : '120', title : '판매원화총액', field : 'SALES_TOTAL_AMOUNT_KRW', formatter: "money", formatterParams: {thousand: ",", symbolAfter: "", precision: false} }, - {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '판매환종', field : 'SALES_CURRENCY'}, + {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '판매환종', field : 'SALES_CURRENCY_NAME'}, {headerHozAlign : 'center', hozAlign : 'right', width : '100', title : '판매환율', field : 'SALES_EXCHANGE_RATE', formatter: "money", formatterParams: {thousand: ",", symbolAfter: "", precision: 2} }, diff --git a/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesMgmtList.jsp b/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesMgmtList.jsp index 4956074..aa748ad 100644 --- a/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesMgmtList.jsp +++ b/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesMgmtList.jsp @@ -109,7 +109,7 @@ var columns = [ {headerHozAlign : 'center', hozAlign : 'right', width : '120', title : '판매원화총액', field : 'SALES_TOTAL_AMOUNT_KRW', formatter: "money", formatterParams: {thousand: ",", symbolAfter: "", precision: false} }, - {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '판매환종', field : 'SALES_CURRENCY'}, + {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '판매환종', field : 'SALES_CURRENCY_NAME'}, {headerHozAlign : 'center', hozAlign : 'right', width : '100', title : '판매환율', field : 'SALES_EXCHANGE_RATE', formatter: "money", formatterParams: {thousand: ",", symbolAfter: "", precision: 2} }, diff --git a/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesRegForm.jsp b/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesRegForm.jsp index 497e0ac..f80db48 100644 --- a/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesRegForm.jsp +++ b/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesRegForm.jsp @@ -26,6 +26,9 @@ $("#manager").val(managerValue).trigger('change'); } + // 판매환종 초기값 설정 (견적환종과 동기화) + initializeSalesCurrency(); + // S/N 필드 클릭 이벤트 $("#serialNo").click(function() { fn_openSnManagePopup(); @@ -99,6 +102,37 @@ $("#salesTotalAmount").val(totalAmount); } + // 판매환종 초기값 설정 (견적환종과 동기화하되, 사용자가 변경 가능) + function initializeSalesCurrency() { + var existingSalesCurrency = "${saleInfo.SALES_CURRENCY}"; + var contractCurrency = "${orderInfo.SALES_CURRENCY}"; // 견적환종 (SALES_CURRENCY로 통일) + var contractExchangeRate = "${orderInfo.SALES_EXCHANGE_RATE}"; // 견적환율 + + console.log("=== 판매환종 초기화 디버그 ==="); + console.log("기존 판매환종:", existingSalesCurrency); + console.log("견적환종:", contractCurrency); + console.log("견적환율:", contractExchangeRate); + + // 이미 저장된 판매환종이 있으면 그대로 사용 + if(existingSalesCurrency && existingSalesCurrency.trim() !== '') { + $("#salesCurrency").val(existingSalesCurrency).trigger('change'); + console.log("기존 판매환종 사용:", existingSalesCurrency); + } + // 없으면 견적환종을 기본값으로 설정 + else if(contractCurrency && contractCurrency.trim() !== '') { + $("#salesCurrency").val(contractCurrency).trigger('change'); + + // 견적환율도 함께 설정 + if(contractExchangeRate && contractExchangeRate.trim() !== '') { + $("#salesExchangeRate").val(contractExchangeRate); + } + + console.log("판매환종 자동 설정: " + contractCurrency + " (견적환종과 동기화)"); + } else { + console.log("견적환종이 없습니다. orderInfo를 확인하세요."); + } + } + // 환율 변경 시 원화 금액 재계산 function fn_recalculateByExchangeRate() { var currency = $("#salesCurrency").val(); @@ -580,19 +614,20 @@ - - - - - - - - - - + + + + + * 최초 저장 시 견적환종이 자동 설정되며, 변경 가능합니다. + + + + + + diff --git a/src/com/pms/salesmgmt/controller/SalesNcollectMgmtController.java b/src/com/pms/salesmgmt/controller/SalesNcollectMgmtController.java index 2754673..c6572a9 100644 --- a/src/com/pms/salesmgmt/controller/SalesNcollectMgmtController.java +++ b/src/com/pms/salesmgmt/controller/SalesNcollectMgmtController.java @@ -267,20 +267,23 @@ public class SalesNcollectMgmtController { codeMap.put("managerList", salesMgmtCommonService.bizMakeOptionList("", "", "salesMgmtCommon.getSalesmanList")); - // 기존 판매 정보 조회 후 환종(통화) 공통코드 세팅 - Map saleInfo = null; - String salesCurrency = ""; - if(paramMap.get("orderNo") != null && !paramMap.get("orderNo").equals("")) { - saleInfo = salesNcollectMgmtService.getSaleInfo(paramMap); - salesCurrency = CommonUtils.nullToEmpty((String)saleInfo.get("SALES_CURRENCY")); - request.setAttribute("saleInfo", saleInfo); - } + // 기존 판매 정보 조회 후 환종(통화) 공통코드 세팅 + Map saleInfo = null; + String salesCurrency = ""; + if(paramMap.get("orderNo") != null && !paramMap.get("orderNo").equals("")) { + saleInfo = salesNcollectMgmtService.getSaleInfo(paramMap); + salesCurrency = CommonUtils.nullToEmpty((String)saleInfo.get("SALES_CURRENCY")); + request.setAttribute("saleInfo", saleInfo); - // 환종(통화) - 공통코드 0001533 - codeMap.put("salesCurrency", - commonService.bizMakeOptionList("0001533", salesCurrency, "common.getCodeselect")); - - request.setAttribute("codeMap", codeMap); + // orderInfo로 견적 정보 전달 (saleInfo가 이미 모든 필요한 정보를 포함) + request.setAttribute("orderInfo", saleInfo); + } + + // 환종(통화) - 공통코드 0001533 + codeMap.put("salesCurrency", + commonService.bizMakeOptionList("0001533", salesCurrency, "common.getCodeselect")); + + request.setAttribute("codeMap", codeMap); } catch (Exception e) { e.printStackTrace(); } diff --git a/src/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml b/src/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml index e539d51..d3d579b 100644 --- a/src/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml +++ b/src/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml @@ -830,36 +830,33 @@ ELSE CM.PAID_TYPE END FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PAYMENT_TYPE, - T.PART_NO AS PRODUCT_NO, - T.PART_NAME AS PRODUCT_NAME, - -- S/N: sales_registration 우선, 없으면 CONTRACT_ITEM_SERIAL (모두 "외 몇건" 형태로 표시) - COALESCE( - (SELECT - CASE - WHEN SR.serial_no IS NULL OR SR.serial_no = '' THEN '' - ELSE - (SELECT - CASE - WHEN array_length(string_to_array(SR.serial_no, ','), 1) = 1 THEN SR.serial_no - ELSE (string_to_array(SR.serial_no, ','))[1] || ' 외 ' || (array_length(string_to_array(SR.serial_no, ','), 1) - 1)::TEXT || '건' - END - ) - END - FROM sales_registration SR WHERE SR.project_no = T.PROJECT_NO - ), - (SELECT - CASE - WHEN COUNT(*) = 0 THEN '' - WHEN COUNT(*) = 1 THEN MIN(CIS.SERIAL_NO) - ELSE MIN(CIS.SERIAL_NO) || ' 외 ' || (COUNT(*) - 1)::TEXT || '건' - END - FROM CONTRACT_ITEM CI - LEFT JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID - WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID AND UPPER(CIS.STATUS) = 'ACTIVE' AND CIS.SERIAL_NO IS NOT NULL), - '' - ) AS SERIAL_NO, - COALESCE(T.QUANTITY::numeric, 0) AS ORDER_QUANTITY, - COALESCE(T.DUE_DATE, (SELECT CM.due_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS REQUEST_DATE, + T.PART_NO AS PRODUCT_NO, + T.PART_NAME AS PRODUCT_NAME, + -- S/N: CONTRACT_ITEM_SERIAL에서만 조회 (품목별로 정확하게 매칭) + (SELECT + CASE + WHEN COUNT(*) = 0 THEN '' + WHEN COUNT(*) = 1 THEN MIN(CIS.SERIAL_NO) + ELSE MIN(CIS.SERIAL_NO) || ' 외 ' || (COUNT(*) - 1)::TEXT || '건' + END + FROM CONTRACT_ITEM CI + LEFT JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID + WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID + AND CI.PART_OBJID = T.PART_OBJID + AND CI.STATUS = 'ACTIVE' + AND UPPER(CIS.STATUS) = 'ACTIVE' + AND CIS.SERIAL_NO IS NOT NULL) AS SERIAL_NO, + COALESCE(T.QUANTITY::numeric, 0) AS ORDER_QUANTITY, + -- 요청납기: CONTRACT_ITEM 우선, 없으면 PROJECT_MGMT, 없으면 CONTRACT_MGMT + COALESCE( + (SELECT CI.DUE_DATE + FROM CONTRACT_ITEM CI + WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID + AND CI.PART_OBJID = T.PART_OBJID + AND CI.STATUS = 'ACTIVE'), + T.DUE_DATE, + (SELECT CM.due_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) + ) AS REQUEST_DATE, COALESCE(T.CUSTOMER_PROJECT_NAME, (SELECT CM.customer_request FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS CUSTOMER_REQUEST, CODE_NAME(T.CONTRACT_RESULT) AS ORDER_STATUS, T.PO_NO, @@ -871,16 +868,17 @@ AND UPPER(STATUS) = 'ACTIVE' ) THEN 'Y' ELSE 'N' END AS ORDER_ATTACH, (SELECT CM.PRODUCTION_STATUS FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PRODUCTION_STATUS, - -- 판매 관련 필드들 (sales_registration 테이블에서 한 번에 가져오기) - COALESCE(SR.shipping_order_status, '') AS SHIPPING_ORDER_STATUS, - COALESCE(SR.sales_quantity, 0) AS SALES_QUANTITY, - COALESCE(SR.sales_unit_price, 0) AS SALES_UNIT_PRICE, - COALESCE(SR.sales_supply_price, 0) AS SALES_SUPPLY_PRICE, - COALESCE(SR.sales_vat, 0) AS SALES_VAT, - COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT, - COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT_KRW, - COALESCE(SR.sales_currency, T.CONTRACT_CURRENCY) AS SALES_CURRENCY, - COALESCE(SR.sales_exchange_rate, T.CONTRACT_PRICE_CURRENCY::numeric, 0) AS SALES_EXCHANGE_RATE, + -- 판매 관련 필드들 (sales_registration 테이블에서 한 번에 가져오기) + COALESCE(SR.shipping_order_status, '') AS SHIPPING_ORDER_STATUS, + COALESCE(SR.sales_quantity, 0) AS SALES_QUANTITY, + COALESCE(SR.sales_unit_price, 0) AS SALES_UNIT_PRICE, + COALESCE(SR.sales_supply_price, 0) AS SALES_SUPPLY_PRICE, + COALESCE(SR.sales_vat, 0) AS SALES_VAT, + COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT, + COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT_KRW, + COALESCE(SR.sales_currency, T.CONTRACT_CURRENCY) AS SALES_CURRENCY, + CODE_NAME(COALESCE(SR.sales_currency, T.CONTRACT_CURRENCY)) AS SALES_CURRENCY_NAME, + COALESCE(SR.sales_exchange_rate, T.CONTRACT_PRICE_CURRENCY::numeric, 0) AS SALES_EXCHANGE_RATE, COALESCE(TO_CHAR(SR.shipping_date, 'YYYY-MM-DD'), '') AS SHIPPING_DATE, COALESCE(SR.shipping_method, '') AS SHIPPING_METHOD, COALESCE( @@ -1317,22 +1315,29 @@ ELSE CM.PAID_TYPE END FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PAYMENT_TYPE, - T.PART_NO AS PRODUCT_NO, - T.PART_NAME AS PRODUCT_NAME, - -- S/N 정보 (sales_registration 우선, 없으면 CONTRACT_ITEM_SERIAL에서) - COALESCE( - SR.serial_no, - (SELECT STRING_AGG(CIS.SERIAL_NO, ',' ORDER BY CIS.SERIAL_NO) - FROM CONTRACT_ITEM CI - LEFT JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID - WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID - AND UPPER(CIS.STATUS) = 'ACTIVE' - AND CIS.SERIAL_NO IS NOT NULL - ), - '' - ) AS SERIAL_NO, - COALESCE(T.QUANTITY::numeric, 0) AS ORDER_QUANTITY, - COALESCE(T.DUE_DATE, (SELECT CM.due_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS REQUEST_DATE, + T.PART_NO AS PRODUCT_NO, + T.PART_NAME AS PRODUCT_NAME, + -- S/N 정보 (CONTRACT_ITEM_SERIAL에서만 조회, 품목별로 정확하게 매칭) + (SELECT STRING_AGG(CIS.SERIAL_NO, ',' ORDER BY CIS.SEQ) + FROM CONTRACT_ITEM CI + LEFT JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID + WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID + AND CI.PART_OBJID = T.PART_OBJID + AND CI.STATUS = 'ACTIVE' + AND UPPER(CIS.STATUS) = 'ACTIVE' + AND CIS.SERIAL_NO IS NOT NULL + ) AS SERIAL_NO, + COALESCE(T.QUANTITY::numeric, 0) AS ORDER_QUANTITY, + -- 요청납기: CONTRACT_ITEM 우선, 없으면 PROJECT_MGMT, 없으면 CONTRACT_MGMT + COALESCE( + (SELECT CI.DUE_DATE + FROM CONTRACT_ITEM CI + WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID + AND CI.PART_OBJID = T.PART_OBJID + AND CI.STATUS = 'ACTIVE'), + T.DUE_DATE, + (SELECT CM.due_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) + ) AS REQUEST_DATE, COALESCE(T.CUSTOMER_PROJECT_NAME, (SELECT CM.customer_request FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS CUSTOMER_REQUEST, CODE_NAME(T.CONTRACT_RESULT) AS ORDER_STATUS, T.PO_NO, @@ -1344,23 +1349,25 @@ AND UPPER(STATUS) = 'ACTIVE' ) THEN 'Y' ELSE 'N' END AS ORDER_ATTACH, (SELECT CM.PRODUCTION_STATUS FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PRODUCTION_STATUS, - -- 판매 관련 필드들 (sales_registration 테이블에서 가져오기) - COALESCE(SR.shipping_order_status, '') AS SHIPPING_ORDER_STATUS, - COALESCE(SR.sales_quantity, 0) AS SALES_QUANTITY, - COALESCE(SR.sales_unit_price, 0) AS SALES_UNIT_PRICE, - COALESCE(SR.sales_supply_price, 0) AS SALES_SUPPLY_PRICE, - COALESCE(SR.sales_vat, 0) AS SALES_VAT, - COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT, - COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT_KRW, - COALESCE(SR.sales_currency, T.CONTRACT_CURRENCY) AS SALES_CURRENCY, - COALESCE(SR.sales_exchange_rate, T.CONTRACT_PRICE_CURRENCY::numeric, 0) AS SALES_EXCHANGE_RATE, - COALESCE(TO_CHAR(SR.shipping_date, 'YYYY-MM-DD'), '') AS SHIPPING_DATE, - COALESCE(SR.shipping_method, '') AS SHIPPING_METHOD, - COALESCE(SR.manager_user_id, T.PM_USER_ID) AS MANAGER, - COALESCE(SR.incoterms, '') AS INCOTERMS - FROM PROJECT_MGMT AS T - LEFT JOIN sales_registration SR ON T.PROJECT_NO = SR.project_no - WHERE T.PROJECT_NO = #{orderNo} + -- 판매 관련 필드들 (sales_registration 테이블에서 가져오기) + COALESCE(SR.shipping_order_status, '') AS SHIPPING_ORDER_STATUS, + COALESCE(SR.sales_quantity, 0) AS SALES_QUANTITY, + COALESCE(SR.sales_unit_price, 0) AS SALES_UNIT_PRICE, + COALESCE(SR.sales_supply_price, 0) AS SALES_SUPPLY_PRICE, + COALESCE(SR.sales_vat, 0) AS SALES_VAT, + COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT, + COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT_KRW, + COALESCE(NULLIF(SR.sales_currency, ''), CM.CONTRACT_CURRENCY) AS SALES_CURRENCY, + CODE_NAME(COALESCE(NULLIF(SR.sales_currency, ''), CM.CONTRACT_CURRENCY)) AS SALES_CURRENCY_NAME, + COALESCE(NULLIF(SR.sales_exchange_rate, 0), CM.EXCHANGE_RATE::numeric, 0) AS SALES_EXCHANGE_RATE, + COALESCE(TO_CHAR(SR.shipping_date, 'YYYY-MM-DD'), '') AS SHIPPING_DATE, + COALESCE(SR.shipping_method, '') AS SHIPPING_METHOD, + COALESCE(SR.manager_user_id, T.PM_USER_ID) AS MANAGER, + COALESCE(SR.incoterms, '') AS INCOTERMS + FROM PROJECT_MGMT AS T + LEFT JOIN sales_registration SR ON T.PROJECT_NO = SR.project_no + LEFT JOIN CONTRACT_MGMT CM ON CM.OBJID::VARCHAR = T.CONTRACT_OBJID + WHERE T.PROJECT_NO = #{orderNo}