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 da8e146..25cba6c 100644
--- a/WebContent/WEB-INF/classes/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml
+++ b/WebContent/WEB-INF/classes/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}
diff --git a/WebContent/WEB-INF/view/salesmgmt/salesMgmt/revenueMgmtList.jsp b/WebContent/WEB-INF/view/salesmgmt/salesMgmt/revenueMgmtList.jsp
index a2f2ac8..aba1a22 100644
--- a/WebContent/WEB-INF/view/salesmgmt/salesMgmt/revenueMgmtList.jsp
+++ b/WebContent/WEB-INF/view/salesmgmt/salesMgmt/revenueMgmtList.jsp
@@ -101,7 +101,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 bfc255d..c6e6a12 100644
--- a/src/com/pms/salesmgmt/controller/SalesNcollectMgmtController.java
+++ b/src/com/pms/salesmgmt/controller/SalesNcollectMgmtController.java
@@ -264,20 +264,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 da8e146..25cba6c 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}