매출관리까지 한 작업 중간커밋
This commit is contained in:
@@ -1405,70 +1405,70 @@
|
||||
|
||||
<select id="getContractMgmtInfo" parameterType="map" resultType="map">
|
||||
SELECT
|
||||
OBJID
|
||||
,CATEGORY_CD
|
||||
,CUSTOMER_OBJID
|
||||
,PRODUCT
|
||||
,CUSTOMER_PROJECT_NAME
|
||||
,STATUS_CD
|
||||
,DUE_DATE
|
||||
,LOCATION
|
||||
,SETUP
|
||||
,FACILITY
|
||||
,FACILITY_QTY
|
||||
,FACILITY_TYPE
|
||||
,FACILITY_DEPTH
|
||||
,PRODUCTION_NO
|
||||
,BUS_CAL_CD
|
||||
,CATEGORY1_CD
|
||||
,CHG_USER_ID
|
||||
,PLAN_DATE
|
||||
,COMPLETE_DATE
|
||||
,RESULT_CD
|
||||
,PROJECT_NO
|
||||
,PM_USER_ID
|
||||
,CONTRACT_PRICE
|
||||
,CONTRACT_PRICE_CURRENCY
|
||||
,CONTRACT_CURRENCY
|
||||
,REGDATE
|
||||
,WRITER
|
||||
,CONTRACT_NO
|
||||
,CUSTOMER_EQUIP_NAME
|
||||
,REQ_DEL_DATE
|
||||
,CONTRACT_DEL_DATE
|
||||
,CONTRACT_COMPANY
|
||||
,CONTRACT_DATE
|
||||
,PO_NO
|
||||
,MANUFACTURE_PLANT
|
||||
,CONTRACT_RESULT
|
||||
,PROJECT_NAME
|
||||
,SPEC_USER_ID
|
||||
,SPEC_PLAN_DATE
|
||||
,SPEC_COMP_DATE
|
||||
,SPEC_RESULT_CD
|
||||
,EST_USER_ID
|
||||
,EST_PLAN_DATE
|
||||
,EST_COMP_DATE
|
||||
,EST_RESULT_CD
|
||||
,AREA_CD
|
||||
,TARGET_PROJECT_NO
|
||||
,TARGET_PROJECT_NO_DIRECT
|
||||
,CUSTOMER_PRODUCTION_NO
|
||||
,MECHANICAL_TYPE
|
||||
,OVERHAUL_ORDER
|
||||
,PAID_TYPE
|
||||
,RECEIPT_DATE
|
||||
,PART_NO
|
||||
,PART_NAME
|
||||
,SERIAL_NO
|
||||
,QUANTITY
|
||||
,CUSTOMER_REQUEST
|
||||
,EXCHANGE_RATE
|
||||
,ORDER_DATE
|
||||
,ORDER_UNIT_PRICE
|
||||
,ORDER_SUPPLY_PRICE
|
||||
,ORDER_VAT
|
||||
,ORDER_TOTAL_AMOUNT
|
||||
A.OBJID
|
||||
,A.CATEGORY_CD
|
||||
,A.CUSTOMER_OBJID
|
||||
,A.PRODUCT
|
||||
,A.CUSTOMER_PROJECT_NAME
|
||||
,A.STATUS_CD
|
||||
,A.DUE_DATE
|
||||
,A.LOCATION
|
||||
,A.SETUP
|
||||
,A.FACILITY
|
||||
,A.FACILITY_QTY
|
||||
,A.FACILITY_TYPE
|
||||
,A.FACILITY_DEPTH
|
||||
,A.PRODUCTION_NO
|
||||
,A.BUS_CAL_CD
|
||||
,A.CATEGORY1_CD
|
||||
,A.CHG_USER_ID
|
||||
,A.PLAN_DATE
|
||||
,A.COMPLETE_DATE
|
||||
,A.RESULT_CD
|
||||
,A.PROJECT_NO
|
||||
,A.PM_USER_ID
|
||||
,A.CONTRACT_PRICE
|
||||
,A.CONTRACT_PRICE_CURRENCY
|
||||
,A.CONTRACT_CURRENCY
|
||||
,A.REGDATE
|
||||
,A.WRITER
|
||||
,A.CONTRACT_NO
|
||||
,A.CUSTOMER_EQUIP_NAME
|
||||
,A.REQ_DEL_DATE
|
||||
,A.CONTRACT_DEL_DATE
|
||||
,A.CONTRACT_COMPANY
|
||||
,A.CONTRACT_DATE
|
||||
,A.PO_NO
|
||||
,A.MANUFACTURE_PLANT
|
||||
,A.CONTRACT_RESULT
|
||||
,A.PROJECT_NAME
|
||||
,A.SPEC_USER_ID
|
||||
,A.SPEC_PLAN_DATE
|
||||
,A.SPEC_COMP_DATE
|
||||
,A.SPEC_RESULT_CD
|
||||
,A.EST_USER_ID
|
||||
,A.EST_PLAN_DATE
|
||||
,A.EST_COMP_DATE
|
||||
,A.EST_RESULT_CD
|
||||
,A.AREA_CD
|
||||
,A.TARGET_PROJECT_NO
|
||||
,A.TARGET_PROJECT_NO_DIRECT
|
||||
,A.CUSTOMER_PRODUCTION_NO
|
||||
,A.MECHANICAL_TYPE
|
||||
,A.OVERHAUL_ORDER
|
||||
,A.PAID_TYPE
|
||||
,A.RECEIPT_DATE
|
||||
,A.PART_NO
|
||||
,A.PART_NAME
|
||||
,A.SERIAL_NO
|
||||
,A.QUANTITY
|
||||
,A.CUSTOMER_REQUEST
|
||||
,A.EXCHANGE_RATE
|
||||
,A.ORDER_DATE
|
||||
,A.ORDER_UNIT_PRICE
|
||||
,A.ORDER_SUPPLY_PRICE
|
||||
,A.ORDER_VAT
|
||||
,A.ORDER_TOTAL_AMOUNT
|
||||
,(SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID::VARCHAR = A.OBJID AND DOC_TYPE='contractMgmt01' AND UPPER(STATUS) = 'ACTIVE') AS FILE_CNT1
|
||||
,(SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID::VARCHAR = A.OBJID AND DOC_TYPE='contractMgmt02' AND UPPER(STATUS) = 'ACTIVE') AS FILE_CNT2
|
||||
,(SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID::VARCHAR = A.OBJID AND DOC_TYPE='contractMgmt03' AND UPPER(STATUS) = 'ACTIVE') AS FILE_CNT3
|
||||
@@ -1479,6 +1479,21 @@
|
||||
,(SELECT TO_CHAR(REGDATE, 'YYYY-MM-DD' ) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID::VARCHAR = A.OBJID AND DOC_TYPE='contractMgmt03' AND UPPER(STATUS) = 'ACTIVE' ORDER BY REGDATE desc LIMIT 1) AS FILE_DATE3
|
||||
,(SELECT TO_CHAR(REGDATE, 'YYYY-MM-DD' ) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID::VARCHAR = A.OBJID AND DOC_TYPE='contractMgmt04' AND UPPER(STATUS) = 'ACTIVE' ORDER BY REGDATE desc LIMIT 1) AS FILE_DATE4
|
||||
,(SELECT TO_CHAR(REGDATE, 'YYYY-MM-DD' ) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID::VARCHAR = A.OBJID AND DOC_TYPE='contractMgmt05' AND UPPER(STATUS) = 'ACTIVE' ORDER BY REGDATE desc LIMIT 1) AS FILE_DATE5
|
||||
-- 결재 상태 추가
|
||||
,COALESCE(
|
||||
(SELECT CASE
|
||||
WHEN UPPER(AP.STATUS) = 'INPROCESS' THEN '결재중'
|
||||
WHEN UPPER(AP.STATUS) = 'COMPLETE' THEN '결재완료'
|
||||
WHEN UPPER(AP.STATUS) = 'REJECT' THEN '반려'
|
||||
WHEN UPPER(AP.STATUS) = 'CANCEL' THEN '취소'
|
||||
ELSE '작성중'
|
||||
END
|
||||
FROM APPROVAL AP
|
||||
WHERE AP.TARGET_OBJID::VARCHAR = (SELECT objid::VARCHAR FROM ESTIMATE_TEMPLATE WHERE CONTRACT_OBJID = A.OBJID ORDER BY REGDATE DESC LIMIT 1)
|
||||
AND AP.TARGET_TYPE = 'CONTRACT_ESTIMATE'
|
||||
LIMIT 1),
|
||||
'작성중'
|
||||
) AS APPR_STATUS
|
||||
FROM CONTRACT_MGMT A
|
||||
WHERE A.OBJID = #{objId}
|
||||
</select>
|
||||
@@ -2227,8 +2242,11 @@ SELECT
|
||||
,SUPPLY_TEL_NO
|
||||
,REG_ID
|
||||
,TO_CHAR(REG_DATE,'YYYY-MM-DD') REGDATE
|
||||
,STATUS
|
||||
,CHARGE_USER_NAME
|
||||
,STATUS
|
||||
,CHARGE_USER_NAME
|
||||
,COALESCE(NULLIF(MANAGER1_NAME, ''), NULLIF(MANAGER2_NAME, ''), NULLIF(MANAGER3_NAME, ''), NULLIF(MANAGER4_NAME, ''), MANAGER5_NAME) AS MANAGER1_NAME
|
||||
,COALESCE(NULLIF(MANAGER1_EMAIL, ''), NULLIF(MANAGER2_EMAIL, ''), NULLIF(MANAGER3_EMAIL, ''), NULLIF(MANAGER4_EMAIL, ''), MANAGER5_EMAIL) AS MANAGER1_EMAIL
|
||||
,(SELECT COUNT(*) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = SUPPLY_MNG.OBJID::VARCHAR AND DOC_TYPE = 'BUS_REG_CERT' AND UPPER(STATUS) = 'ACTIVE') AS BUS_REG_FILE_CNT
|
||||
,case UPPER(STATUS)
|
||||
when 'ACTIVE' then '활성화'
|
||||
when 'INACTIVE' then '비활성화'
|
||||
@@ -2279,10 +2297,13 @@ SELECT
|
||||
,SUPPLY_BUSNAME
|
||||
,SUPPLY_STOCKNAME
|
||||
,SUPPLY_TEL_NO
|
||||
,REG_ID
|
||||
,TO_CHAR(REG_DATE,'YYYY-MM-DD') REGDATE
|
||||
,STATUS
|
||||
,CHARGE_USER_NAME
|
||||
,REG_ID
|
||||
,TO_CHAR(REG_DATE,'YYYY-MM-DD') REGDATE
|
||||
,STATUS
|
||||
,COALESCE(NULLIF(MANAGER1_NAME, ''), NULLIF(MANAGER2_NAME, ''), NULLIF(MANAGER3_NAME, ''), NULLIF(MANAGER4_NAME, ''), MANAGER5_NAME) AS MANAGER1_NAME
|
||||
,COALESCE(NULLIF(MANAGER1_EMAIL, ''), NULLIF(MANAGER2_EMAIL, ''), NULLIF(MANAGER3_EMAIL, ''), NULLIF(MANAGER4_EMAIL, ''), MANAGER5_EMAIL) AS MANAGER1_EMAIL
|
||||
,(SELECT COUNT(*) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = SUPPLY_MNG.OBJID::VARCHAR AND DOC_TYPE = 'BUS_REG_CERT' AND UPPER(STATUS) = 'ACTIVE') AS BUS_REG_FILE_CNT
|
||||
,CHARGE_USER_NAME
|
||||
,case UPPER(STATUS)
|
||||
when 'ACTIVE' then '활성화'
|
||||
when 'INACTIVE' then '비활성화'
|
||||
@@ -2357,6 +2378,16 @@ SELECT
|
||||
,OFFICE_NO
|
||||
,EMAIL
|
||||
,CUS_NO
|
||||
,MANAGER1_NAME
|
||||
,MANAGER1_EMAIL
|
||||
,MANAGER2_NAME
|
||||
,MANAGER2_EMAIL
|
||||
,MANAGER3_NAME
|
||||
,MANAGER3_EMAIL
|
||||
,MANAGER4_NAME
|
||||
,MANAGER4_EMAIL
|
||||
,MANAGER5_NAME
|
||||
,MANAGER5_EMAIL
|
||||
)
|
||||
VALUES
|
||||
(
|
||||
@@ -2379,25 +2410,45 @@ SELECT
|
||||
,#{office_no }
|
||||
,#{email }
|
||||
,(SELECT 'CUS-' || LPAD((SELECT MAX(SUBSTR(CUS_NO,5,8))::INTEGER+1 FROM SUPPLY_MNG)::VARCHAR,4,'0'))
|
||||
,#{manager1_name }
|
||||
,#{manager1_email }
|
||||
,#{manager2_name }
|
||||
,#{manager2_email }
|
||||
,#{manager3_name }
|
||||
,#{manager3_email }
|
||||
,#{manager4_name }
|
||||
,#{manager4_email }
|
||||
,#{manager5_name }
|
||||
,#{manager5_email }
|
||||
)
|
||||
ON CONFLICT (OBJID) DO
|
||||
UPDATE
|
||||
SET
|
||||
SUPPLY_CODE =#{supply_code }
|
||||
,SUPPLY_NAME =#{supply_name }
|
||||
,REG_NO =#{reg_no }
|
||||
,SUPPLY_ADDRESS =#{supply_address }
|
||||
,SUPPLY_BUSNAME =#{supply_busname }
|
||||
,SUPPLY_STOCKNAME =#{supply_stockname }
|
||||
,SUPPLY_TEL_NO =#{supply_tel_no }
|
||||
,SUPPLY_FAX_NO =#{supply_fax_no }
|
||||
,CHARGE_USER_NAME =#{charge_user_name }
|
||||
,PAYMENT_METHOD =#{payment_method }
|
||||
,REG_ID =#{reg_id }
|
||||
,AREA_CD =#{area_cd }
|
||||
,BUS_REG_NO =#{bus_reg_no }
|
||||
,OFFICE_NO =#{office_no }
|
||||
,EMAIL =#{email }
|
||||
SUPPLY_CODE =#{supply_code }
|
||||
,SUPPLY_NAME =#{supply_name }
|
||||
,REG_NO =#{reg_no }
|
||||
,SUPPLY_ADDRESS =#{supply_address }
|
||||
,SUPPLY_BUSNAME =#{supply_busname }
|
||||
,SUPPLY_STOCKNAME =#{supply_stockname }
|
||||
,SUPPLY_TEL_NO =#{supply_tel_no }
|
||||
,SUPPLY_FAX_NO =#{supply_fax_no }
|
||||
,CHARGE_USER_NAME =#{charge_user_name }
|
||||
,PAYMENT_METHOD =#{payment_method }
|
||||
,REG_ID =#{reg_id }
|
||||
,AREA_CD =#{area_cd }
|
||||
,BUS_REG_NO =#{bus_reg_no }
|
||||
,OFFICE_NO =#{office_no }
|
||||
,EMAIL =#{email }
|
||||
,MANAGER1_NAME =#{manager1_name }
|
||||
,MANAGER1_EMAIL =#{manager1_email }
|
||||
,MANAGER2_NAME =#{manager2_name }
|
||||
,MANAGER2_EMAIL =#{manager2_email }
|
||||
,MANAGER3_NAME =#{manager3_name }
|
||||
,MANAGER3_EMAIL =#{manager3_email }
|
||||
,MANAGER4_NAME =#{manager4_name }
|
||||
,MANAGER4_EMAIL =#{manager4_email }
|
||||
,MANAGER5_NAME =#{manager5_name }
|
||||
,MANAGER5_EMAIL =#{manager5_email }
|
||||
</update>
|
||||
|
||||
|
||||
|
||||
@@ -974,14 +974,24 @@
|
||||
<if test="shippingMethod != null and shippingMethod != ''">
|
||||
/* SHIPPING_METHOD 필드 없음 - 검색 조건 무시 */
|
||||
</if>
|
||||
<if test="manager != null and manager != ''">
|
||||
AND T.PM_USER_ID = #{manager}
|
||||
</if>
|
||||
<if test="incoterms != null and incoterms != ''">
|
||||
/* INCOTERMS 필드 없음 - 검색 조건 무시 */
|
||||
</if>
|
||||
-- 등록일 기준 최신순 정렬 (프로젝트 번호는 보조 정렬)
|
||||
ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC
|
||||
<if test="manager != null and manager != ''">
|
||||
AND T.PM_USER_ID = #{manager}
|
||||
</if>
|
||||
<if test="incoterms != null and incoterms != ''">
|
||||
/* INCOTERMS 필드 없음 - 검색 조건 무시 */
|
||||
</if>
|
||||
<if test="salesStatus != null and salesStatus != ''">
|
||||
<choose>
|
||||
<when test="salesStatus == 'NOT_CLOSED'">
|
||||
AND (T.SALES_STATUS IS NULL OR T.SALES_STATUS = '' OR T.SALES_STATUS != '완료')
|
||||
</when>
|
||||
<otherwise>
|
||||
AND T.SALES_STATUS = #{salesStatus}
|
||||
</otherwise>
|
||||
</choose>
|
||||
</if>
|
||||
-- 등록일 기준 최신순 정렬 (프로젝트 번호는 보조 정렬)
|
||||
ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC
|
||||
</select>
|
||||
|
||||
<!-- 매출관리 그리드 목록 개수 - project_mgmt 테이블 기반 -->
|
||||
@@ -1068,13 +1078,23 @@
|
||||
<if test="shippingMethod != null and shippingMethod != ''">
|
||||
/* SHIPPING_METHOD 필드 없음 - 검색 조건 무시 */
|
||||
</if>
|
||||
<if test="manager != null and manager != ''">
|
||||
AND T.PM_USER_ID = #{manager}
|
||||
</if>
|
||||
<if test="incoterms != null and incoterms != ''">
|
||||
/* INCOTERMS 필드 없음 - 검색 조건 무시 */
|
||||
</if>
|
||||
</select>
|
||||
<if test="manager != null and manager != ''">
|
||||
AND T.PM_USER_ID = #{manager}
|
||||
</if>
|
||||
<if test="incoterms != null and incoterms != ''">
|
||||
/* INCOTERMS 필드 없음 - 검색 조건 무시 */
|
||||
</if>
|
||||
<if test="salesStatus != null and salesStatus != ''">
|
||||
<choose>
|
||||
<when test="salesStatus == 'NOT_CLOSED'">
|
||||
AND (T.SALES_STATUS IS NULL OR T.SALES_STATUS = '' OR T.SALES_STATUS != '완료')
|
||||
</when>
|
||||
<otherwise>
|
||||
AND T.SALES_STATUS = #{salesStatus}
|
||||
</otherwise>
|
||||
</choose>
|
||||
</if>
|
||||
</select>
|
||||
|
||||
<!-- 매출관리 합계 조회 (Total 공급가액, 부가세, 총액) -->
|
||||
<select id="getSalesMgmtTotals" parameterType="map" resultType="map">
|
||||
@@ -1393,5 +1413,115 @@
|
||||
WHERE T.PROJECT_NO = #{orderNo}
|
||||
</select>
|
||||
|
||||
<!--
|
||||
/**
|
||||
* 주문서 관리에서 수주 데이터 조회 (판매등록용)
|
||||
* CONTRACT_ITEM 테이블에서 수주 정보를 가져와 판매등록 폼에 자동 채우기
|
||||
* @since 2025.11.10
|
||||
* @author assistant
|
||||
* @version 1.0
|
||||
**/
|
||||
-->
|
||||
<select id="getOrderDataForSale" parameterType="map" resultType="map">
|
||||
/* salesNcollectMgmt.getOrderDataForSale - 주문서 관리에서 판매등록용 수주 데이터 조회 */
|
||||
SELECT
|
||||
-- 기본 정보
|
||||
CM.CONTRACT_NO AS ORDER_NO,
|
||||
CM.OBJID AS CONTRACT_OBJID,
|
||||
|
||||
-- 수주 금액 정보 (CONTRACT_ITEM 테이블에서 합산) - VARCHAR 타입이므로 NUMERIC으로 캐스팅
|
||||
COALESCE(SUM(CI.ORDER_QUANTITY::NUMERIC), 0) AS SALES_QUANTITY,
|
||||
COALESCE(ROUND(AVG(CI.ORDER_UNIT_PRICE::NUMERIC), 2), 0) AS SALES_UNIT_PRICE,
|
||||
COALESCE(SUM(CI.ORDER_SUPPLY_PRICE::NUMERIC), 0) AS SALES_SUPPLY_PRICE,
|
||||
COALESCE(SUM(CI.ORDER_VAT::NUMERIC), 0) AS SALES_VAT,
|
||||
COALESCE(SUM(CI.ORDER_TOTAL_AMOUNT::NUMERIC), 0) AS SALES_TOTAL_AMOUNT,
|
||||
|
||||
-- 환종 정보
|
||||
CM.CONTRACT_CURRENCY AS SALES_CURRENCY,
|
||||
CODE_NAME(CM.CONTRACT_CURRENCY) AS SALES_CURRENCY_NAME,
|
||||
COALESCE(CM.EXCHANGE_RATE::NUMERIC, 0) AS SALES_EXCHANGE_RATE,
|
||||
|
||||
-- 수주 날짜 - VARCHAR 타입이므로 그대로 사용
|
||||
CM.ORDER_DATE AS SHIPPING_DATE,
|
||||
|
||||
-- 담당자
|
||||
CM.PM_USER_ID AS MANAGER
|
||||
|
||||
FROM CONTRACT_MGMT CM
|
||||
LEFT JOIN CONTRACT_ITEM CI ON CM.OBJID::VARCHAR = CI.CONTRACT_OBJID AND UPPER(CI.STATUS) = 'ACTIVE'
|
||||
WHERE CM.OBJID = #{contractObjId}::NUMERIC
|
||||
GROUP BY
|
||||
CM.CONTRACT_NO,
|
||||
CM.OBJID,
|
||||
CM.CONTRACT_CURRENCY,
|
||||
CM.EXCHANGE_RATE,
|
||||
CM.ORDER_DATE,
|
||||
CM.PM_USER_ID
|
||||
</select>
|
||||
|
||||
<!--
|
||||
/**
|
||||
* orderNo(PROJECT_NO)로 수주 데이터 조회 (판매등록용)
|
||||
* PROJECT_MGMT에서 CONTRACT_OBJID를 찾아서 수주 데이터 조회
|
||||
* @since 2025.11.10
|
||||
* @author assistant
|
||||
* @version 1.0
|
||||
**/
|
||||
-->
|
||||
<select id="getOrderDataByOrderNo" parameterType="map" resultType="map">
|
||||
/* salesNcollectMgmt.getOrderDataByOrderNo - orderNo로 판매등록용 수주 데이터 조회 */
|
||||
SELECT
|
||||
-- 기본 정보
|
||||
CM.CONTRACT_NO AS ORDER_NO,
|
||||
CM.OBJID AS CONTRACT_OBJID,
|
||||
|
||||
-- 수주 금액 정보 (CONTRACT_ITEM 테이블에서 합산) - VARCHAR 타입이므로 NUMERIC으로 캐스팅
|
||||
COALESCE(SUM(CI.ORDER_QUANTITY::NUMERIC), 0) AS SALES_QUANTITY,
|
||||
COALESCE(ROUND(AVG(CI.ORDER_UNIT_PRICE::NUMERIC), 2), 0) AS SALES_UNIT_PRICE,
|
||||
COALESCE(SUM(CI.ORDER_SUPPLY_PRICE::NUMERIC), 0) AS SALES_SUPPLY_PRICE,
|
||||
COALESCE(SUM(CI.ORDER_VAT::NUMERIC), 0) AS SALES_VAT,
|
||||
COALESCE(SUM(CI.ORDER_TOTAL_AMOUNT::NUMERIC), 0) AS SALES_TOTAL_AMOUNT,
|
||||
|
||||
-- 환종 정보
|
||||
CM.CONTRACT_CURRENCY AS SALES_CURRENCY,
|
||||
CODE_NAME(CM.CONTRACT_CURRENCY) AS SALES_CURRENCY_NAME,
|
||||
COALESCE(CM.EXCHANGE_RATE::NUMERIC, 0) AS SALES_EXCHANGE_RATE,
|
||||
|
||||
-- 수주 날짜 - VARCHAR 타입이므로 그대로 사용
|
||||
CM.ORDER_DATE AS SHIPPING_DATE,
|
||||
|
||||
-- 담당자
|
||||
CM.PM_USER_ID AS MANAGER
|
||||
|
||||
FROM PROJECT_MGMT PM
|
||||
INNER JOIN CONTRACT_MGMT CM ON PM.CONTRACT_OBJID = CM.OBJID
|
||||
LEFT JOIN CONTRACT_ITEM CI ON CM.OBJID::VARCHAR = CI.CONTRACT_OBJID AND UPPER(CI.STATUS) = 'ACTIVE'
|
||||
WHERE PM.PROJECT_NO = #{orderNo}
|
||||
GROUP BY
|
||||
CM.CONTRACT_NO,
|
||||
CM.OBJID,
|
||||
CM.CONTRACT_CURRENCY,
|
||||
CM.EXCHANGE_RATE,
|
||||
CM.ORDER_DATE,
|
||||
CM.PM_USER_ID
|
||||
</select>
|
||||
|
||||
<!--
|
||||
/**
|
||||
* 매출마감 처리
|
||||
* @since 2025.11.10
|
||||
* @author system
|
||||
* @version 1.0
|
||||
**/
|
||||
-->
|
||||
<update id="salesDeadlineConfirm" parameterType="map">
|
||||
/* salesNcollectMgmt.salesDeadlineConfirm - PROJECT_MGMT의 SALES_STATUS를 '완료'로 업데이트 및 매출마감일 저장 */
|
||||
UPDATE PROJECT_MGMT
|
||||
SET
|
||||
SALES_STATUS = '완료',
|
||||
SALES_DEADLINE_DATE = #{deadlineDate}
|
||||
WHERE OBJID::VARCHAR = #{OBJID}
|
||||
</update>
|
||||
|
||||
</mapper>
|
||||
|
||||
|
||||
@@ -96,6 +96,7 @@ $(document).ready(function(){
|
||||
});
|
||||
|
||||
var columns = [
|
||||
{formatter:"rowSelection", titleFormatter:"rowSelection", hozAlign:"center", headerSort:false, width:40, frozen:true},
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '90', title : '영업번호', field : 'CONTRACT_NO', frozen:true,
|
||||
formatter:fnc_createGridAnchorTag,
|
||||
cellClick:function(e, cell){
|
||||
@@ -187,7 +188,64 @@ var columns = [
|
||||
|
||||
//var grid;
|
||||
function fn_search(){
|
||||
_tabulGrid = fnc_tabul_search(_tabul_layout_fitColumns, _tabulGrid, "/contractMgmt/contractGridList.do", columns, true);
|
||||
// 그리드 조회 및 Total 합계 업데이트를 위한 커스텀 AJAX
|
||||
$.ajax({
|
||||
url: "/contractMgmt/contractGridList.do",
|
||||
type: "POST",
|
||||
data: $("#form1").serializeObject(),
|
||||
dataType: "json",
|
||||
beforeSend: function(){
|
||||
_startLoading("Loading...");
|
||||
},
|
||||
complete: function(){
|
||||
_endLoading();
|
||||
},
|
||||
success: function(response) {
|
||||
// 그리드 데이터 설정
|
||||
if(_tabulGrid){
|
||||
_tabulGrid.setData(response.RESULTLIST || []);
|
||||
} else {
|
||||
// 그리드 초기화
|
||||
_tabulGrid = new Tabulator("#mainGrid", {
|
||||
layout: _tabul_layout_fitColumns,
|
||||
columns: columns,
|
||||
data: response.RESULTLIST || [],
|
||||
selectable: true
|
||||
});
|
||||
}
|
||||
|
||||
// 조회된 전체 데이터의 합계 계산
|
||||
var totalSupplyPrice = 0;
|
||||
var totalVat = 0;
|
||||
var totalAmount = 0;
|
||||
|
||||
if(response.RESULTLIST && response.RESULTLIST.length > 0) {
|
||||
response.RESULTLIST.forEach(function(row) {
|
||||
var supplyPrice = parseFloat(row.ORDER_SUPPLY_PRICE_SUM || 0);
|
||||
var vat = parseFloat(row.ORDER_VAT_SUM || 0);
|
||||
var amount = parseFloat(row.ORDER_TOTAL_AMOUNT_SUM || 0);
|
||||
|
||||
totalSupplyPrice += supplyPrice;
|
||||
totalVat += vat;
|
||||
totalAmount += amount;
|
||||
});
|
||||
}
|
||||
|
||||
// 합계 표시
|
||||
$("#totalSupplyPrice").text(Number(totalSupplyPrice).toLocaleString());
|
||||
$("#totalVat").text(Number(totalVat).toLocaleString());
|
||||
$("#totalAmount").text(Number(totalAmount).toLocaleString());
|
||||
|
||||
// 페이징 HTML 업데이트
|
||||
if(response.PAGE_HTML){
|
||||
$(".table_paging_wrap").html(response.PAGE_HTML);
|
||||
}
|
||||
},
|
||||
error: function(jqxhr, status, error){
|
||||
alert("데이터 조회 중 오류가 발생했습니다.");
|
||||
console.error(error);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function _fnc_datepick(){
|
||||
@@ -665,6 +723,19 @@ function openProjectFormPopUp(objId){
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<!-- Total 합계 표시 영역 -->
|
||||
<div style="padding: 3px 10px; background: #f5f5f5; border-radius: 3px; margin: 10px 0;">
|
||||
<span style="font-weight: bold; font-size: 12px; margin-right: 20px;">
|
||||
Total 공급가액: <span id="totalSupplyPrice" style="color: #2196F3;">0</span> 원
|
||||
</span>
|
||||
<span style="font-weight: bold; font-size: 12px; margin-right: 20px;">
|
||||
Total 부가세: <span id="totalVat" style="color: #FF9800;">0</span> 원
|
||||
</span>
|
||||
<span style="font-weight: bold; font-size: 12px;">
|
||||
Total 총액: <span id="totalAmount" style="color: #4CAF50;">0</span> 원
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<%@include file= "/WEB-INF/view/common/common_gridArea.jsp" %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -53,61 +53,129 @@
|
||||
fn_search();
|
||||
});
|
||||
|
||||
$("#btnDeadline").click(function(){
|
||||
var targetObj = _tabulGrid.getSelectedData();
|
||||
|
||||
if(1 == targetObj.length){
|
||||
var OBJID = fnc_checkNull(targetObj[0].OBJID);
|
||||
var status = fnc_checkNull(targetObj[0].SALES_STATUS);
|
||||
//var settleAmount = fnc_checkNull(targetObj[0].SETTLE_AMOUNT);
|
||||
$("#btnDeadline").click(function(){
|
||||
var targetObj = _tabulGrid.getSelectedData();
|
||||
|
||||
if(0 == targetObj.length){
|
||||
Swal.fire("선택된 내용이 없습니다.");
|
||||
return false;
|
||||
}
|
||||
|
||||
if(status == '' || status == null || status == '매출마감'){
|
||||
Swal.fire({
|
||||
title: '선택된 데이터를 매출마감 처리하시겠습니까?',
|
||||
text: '',
|
||||
icon: 'warning',
|
||||
|
||||
showCancelButton: true, // cancel버튼 보이기. 기본은 원래 없음
|
||||
confirmButtonColor: '#3085d6', // confrim 버튼 색깔 지정
|
||||
cancelButtonColor: '#d33', // cancel 버튼 색깔 지정
|
||||
confirmButtonText: '확인', // confirm 버튼 텍스트 지정
|
||||
cancelButtonText: '취소', // cancel 버튼 텍스트 지정
|
||||
reverseButtons: false, // 버튼 순서 거꾸로
|
||||
|
||||
}).then(result => {
|
||||
// 만약 Promise리턴을 받으면,
|
||||
if (result.isConfirmed) { // 만약 모달창에서 confirm 버튼을 눌렀다면
|
||||
$.ajax({
|
||||
url:"/salesNcollectMgmt/salesDeadlineConfirm.do",
|
||||
type:"POST",
|
||||
data: {"OBJID" : OBJID},
|
||||
dataType:"json",
|
||||
success:function(data){
|
||||
Swal.fire(data.msg);
|
||||
fn_search();
|
||||
},
|
||||
error: function(jqxhr, status, error){
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}else{
|
||||
alert("매출마감 전 데이터만 매출마감 가능합니다.");
|
||||
return false;
|
||||
}
|
||||
//var productGroup = fnc_checkNull(targetObj[0].PRODUCT_GROUP);
|
||||
//var product = fnc_checkNull(targetObj[0].PRODUCT);
|
||||
//var releaseObjId = fnc_checkNull(targetObj[0].RELEASE_OBJID);
|
||||
}else if(0 == targetObj.length){
|
||||
Swal.fire("선택된 내용이 없습니다.");
|
||||
return false;
|
||||
}else if(1 < targetObj.length){
|
||||
Swal.fire("한번에 1개의 내용만 등록 가능합니다. ");
|
||||
// 선택된 항목 중 이미 매출마감된 항목이 있는지 체크
|
||||
var hasCompletedItem = false;
|
||||
for(var i = 0; i < targetObj.length; i++){
|
||||
var status = fnc_checkNull(targetObj[i].SALES_STATUS);
|
||||
if(status == '완료'){
|
||||
hasCompletedItem = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(hasCompletedItem){
|
||||
Swal.fire("매출마감 전 데이터만 매출마감 가능합니다.");
|
||||
return false;
|
||||
}
|
||||
|
||||
// 매출마감일 입력 팝업
|
||||
Swal.fire({
|
||||
title: '매출마감 처리',
|
||||
html:
|
||||
'<div style="text-align:left; padding:10px;">' +
|
||||
'<label style="display:block; margin-bottom:5px;">세금계산서 발행일 (매출마감일)</label>' +
|
||||
'<input type="text" id="deadlineDate" class="swal2-input" placeholder="YYYY-MM-DD" style="width:90%; margin:0;">' +
|
||||
'<div style="margin-top:10px; color:#666; font-size:12px;">선택된 ' + targetObj.length + '건의 데이터를 매출마감 처리합니다.</div>' +
|
||||
'</div>',
|
||||
icon: 'info',
|
||||
showCancelButton: true,
|
||||
confirmButtonColor: '#3085d6',
|
||||
cancelButtonColor: '#d33',
|
||||
confirmButtonText: '확인',
|
||||
cancelButtonText: '취소',
|
||||
onOpen: function() {
|
||||
// datepicker 초기화
|
||||
$('#deadlineDate').datepicker({
|
||||
dateFormat: 'yy-mm-dd',
|
||||
changeMonth: true,
|
||||
changeYear: true
|
||||
});
|
||||
// 오늘 날짜를 기본값으로 설정
|
||||
var today = new Date();
|
||||
var dateStr = today.getFullYear() + '-' +
|
||||
String(today.getMonth() + 1).padStart(2, '0') + '-' +
|
||||
String(today.getDate()).padStart(2, '0');
|
||||
$('#deadlineDate').val(dateStr);
|
||||
},
|
||||
preConfirm: function() {
|
||||
const deadlineDate = $('#deadlineDate').val();
|
||||
if (!deadlineDate) {
|
||||
Swal.showValidationMessage('매출마감일을 입력해주세요.');
|
||||
return false;
|
||||
}
|
||||
//fn_confirm();
|
||||
// 날짜 형식 검증 (YYYY-MM-DD)
|
||||
var datePattern = /^\d{4}-\d{2}-\d{2}$/;
|
||||
if (!datePattern.test(deadlineDate)) {
|
||||
Swal.showValidationMessage('날짜 형식이 올바르지 않습니다. (YYYY-MM-DD)');
|
||||
return false;
|
||||
}
|
||||
return deadlineDate;
|
||||
}
|
||||
}).then(function(result) {
|
||||
if (result.isConfirmed) {
|
||||
var deadlineDate = result.value;
|
||||
var objIdList = [];
|
||||
|
||||
// 선택된 항목들의 OBJID 수집
|
||||
for(var i = 0; i < targetObj.length; i++){
|
||||
objIdList.push(fnc_checkNull(targetObj[i].OBJID));
|
||||
}
|
||||
|
||||
// AJAX 요청
|
||||
console.log('매출마감 요청 - objIdList:', objIdList);
|
||||
console.log('매출마감 요청 - deadlineDate:', deadlineDate);
|
||||
console.log('매출마감 요청 - 전송 데이터:', {
|
||||
objIdList: objIdList.join(','),
|
||||
deadlineDate: deadlineDate
|
||||
});
|
||||
|
||||
$.ajax({
|
||||
url: "/salesNcollectMgmt/salesDeadlineConfirm.do",
|
||||
type: "POST",
|
||||
data: {
|
||||
"objIdList": objIdList.join(','),
|
||||
"deadlineDate": deadlineDate
|
||||
},
|
||||
dataType: "json",
|
||||
success: function(data){
|
||||
console.log('매출마감 응답 - result:', data.result);
|
||||
console.log('매출마감 응답 - msg:', data.msg);
|
||||
console.log('매출마감 응답 - 전체:', JSON.stringify(data));
|
||||
|
||||
Swal.fire({
|
||||
title: data.msg || '처리되었습니다.',
|
||||
icon: data.result ? 'success' : 'error'
|
||||
}).then(() => {
|
||||
if(data.result) {
|
||||
fn_search();
|
||||
}
|
||||
});
|
||||
},
|
||||
error: function(jqxhr, status, error){
|
||||
console.error('매출마감 AJAX 에러 - status:', status);
|
||||
console.error('매출마감 AJAX 에러 - error:', error);
|
||||
console.error('매출마감 AJAX 에러 - responseText:', jqxhr.responseText);
|
||||
console.error('매출마감 AJAX 에러 - statusText:', jqxhr.statusText);
|
||||
|
||||
Swal.fire({
|
||||
title: '매출마감 처리 중 오류가 발생했습니다.',
|
||||
text: error || jqxhr.statusText || '서버 오류',
|
||||
icon: 'error'
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
fn_search();
|
||||
});
|
||||
</script>
|
||||
@@ -115,6 +183,7 @@
|
||||
<script type="text/javascript">
|
||||
|
||||
var columns = [
|
||||
{formatter:"rowSelection", titleFormatter:"rowSelection", hozAlign:"center", headerSort:false, width:40, frozen:true},
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '120', title : '프로젝트번호', field : 'PROJECT_NO', frozen : true
|
||||
// formatter: fnc_createGridAnchorTag,
|
||||
// cellClick: function(e, cell){
|
||||
@@ -197,16 +266,37 @@ function fn_search(){
|
||||
// 그리드 데이터 설정
|
||||
if(_tabulGrid){
|
||||
_tabulGrid.setData(response.RESULTLIST || []);
|
||||
} else {
|
||||
// 그리드 초기화
|
||||
_tabulGrid = new Tabulator("#mainGrid", {
|
||||
layout: _tabul_layout_fitColumns,
|
||||
columns: columns,
|
||||
data: response.RESULTLIST || []
|
||||
});
|
||||
// 그리드 초기화 후 Excel 버튼 이벤트 등록
|
||||
fn_bindExcelButton();
|
||||
}
|
||||
} else {
|
||||
// 그리드 초기화
|
||||
_tabulGrid = new Tabulator("#mainGrid", {
|
||||
layout: _tabul_layout_fitColumns,
|
||||
columns: columns,
|
||||
data: response.RESULTLIST || [],
|
||||
selectable: "highlight" // 다중 선택 가능하도록 설정
|
||||
});
|
||||
|
||||
// 행 클릭으로 다중 선택
|
||||
_tabulGrid.on("rowClick", function(e, row){
|
||||
// 체크박스나 체크박스 셀을 클릭한 경우는 제외
|
||||
if($(e.target).hasClass('tabulator-row-handle') ||
|
||||
$(e.target).closest('.tabulator-row-handle').length > 0 ||
|
||||
e.target.type === 'checkbox') {
|
||||
return;
|
||||
}
|
||||
|
||||
// 이미 선택된 행인지 확인
|
||||
if(row.isSelected()){
|
||||
// 선택된 행 클릭 시 해제
|
||||
row.deselect();
|
||||
} else {
|
||||
// 선택되지 않은 행 클릭 시 선택 (기존 선택 유지)
|
||||
row.select();
|
||||
}
|
||||
});
|
||||
|
||||
// 그리드 초기화 후 Excel 버튼 이벤트 등록
|
||||
fn_bindExcelButton();
|
||||
}
|
||||
|
||||
// Total 합계 업데이트
|
||||
if(response && response.TOTALS){
|
||||
@@ -432,17 +522,25 @@ function fn_FileRegist(objId, docType, docTypeName){
|
||||
</select>
|
||||
</td>
|
||||
|
||||
<td class="label"><label for="">출하대기 상태</label></td>
|
||||
<td><select name="shippingStatus" class="select2" style="width:150px;"><option value="">전체</option>${codeMap.shippingStatusList}</select></td>
|
||||
<td class="label"><label for="">출고방법</label></td>
|
||||
<td>
|
||||
<select name="shippingMethod" class="select2" style="width:150px;">
|
||||
<option value="">전체</option>
|
||||
<option value="DIRECT">직납</option>
|
||||
<option value="PARCEL">택배</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<td class="label"><label for="">출하대기 상태</label></td>
|
||||
<td><select name="shippingStatus" class="select2" style="width:150px;"><option value="">전체</option>${codeMap.shippingStatusList}</select></td>
|
||||
<td class="label"><label for="">출고방법</label></td>
|
||||
<td>
|
||||
<select name="shippingMethod" class="select2" style="width:150px;">
|
||||
<option value="">전체</option>
|
||||
<option value="DIRECT">직납</option>
|
||||
<option value="PARCEL">택배</option>
|
||||
</select>
|
||||
</td>
|
||||
<td class="label"><label for="">매출마감</label></td>
|
||||
<td>
|
||||
<select name="salesStatus" class="select2" style="width:120px;">
|
||||
<option value="">전체</option>
|
||||
<option value="완료">매출마감</option>
|
||||
<option value="NOT_CLOSED">매출마감 전</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
|
||||
|
||||
9
database/add_sales_deadline_date_to_project_mgmt.sql
Normal file
9
database/add_sales_deadline_date_to_project_mgmt.sql
Normal file
@@ -0,0 +1,9 @@
|
||||
-- PROJECT_MGMT 테이블에 매출마감일 컬럼 추가
|
||||
-- 2025-11-10
|
||||
|
||||
-- SALES_DEADLINE_DATE 컬럼 추가 (매출마감일 - 세금계산서 발행일)
|
||||
ALTER TABLE PROJECT_MGMT ADD COLUMN IF NOT EXISTS SALES_DEADLINE_DATE VARCHAR(10);
|
||||
|
||||
-- 컬럼 코멘트 추가
|
||||
COMMENT ON COLUMN PROJECT_MGMT.SALES_DEADLINE_DATE IS '매출마감일 (세금계산서 발행일)';
|
||||
|
||||
@@ -258,9 +258,48 @@ public class SalesNcollectMgmtController {
|
||||
// 기존 판매 정보 조회 후 환종(통화) 공통코드 세팅
|
||||
Map<String, Object> saleInfo = null;
|
||||
String salesCurrency = "";
|
||||
if(paramMap.get("orderNo") != null && !paramMap.get("orderNo").equals("")) {
|
||||
|
||||
// contractObjId가 있으면 주문서 관리에서 넘어온 것 -> 수주 데이터 조회
|
||||
if(paramMap.get("contractObjId") != null && !paramMap.get("contractObjId").equals("")) {
|
||||
// 수주 데이터 조회 (CONTRACT_ITEM 테이블에서)
|
||||
saleInfo = salesNcollectMgmtService.getOrderDataForSale(paramMap);
|
||||
salesCurrency = CommonUtils.nullToEmpty((String)saleInfo.get("SALES_CURRENCY"));
|
||||
request.setAttribute("saleInfo", saleInfo);
|
||||
request.setAttribute("orderInfo", saleInfo);
|
||||
}
|
||||
// orderNo가 있으면 기존 판매 정보 조회
|
||||
else if(paramMap.get("orderNo") != null && !paramMap.get("orderNo").equals("")) {
|
||||
saleInfo = salesNcollectMgmtService.getSaleInfo(paramMap);
|
||||
salesCurrency = CommonUtils.nullToEmpty((String)saleInfo.get("SALES_CURRENCY"));
|
||||
|
||||
// 판매 정보가 비어있거나 금액이 0이면 수주 데이터로 채우기
|
||||
if(saleInfo == null ||
|
||||
(saleInfo.get("SALES_SUPPLY_PRICE") == null ||
|
||||
"0".equals(String.valueOf(saleInfo.get("SALES_SUPPLY_PRICE"))) ||
|
||||
Integer.parseInt(String.valueOf(saleInfo.get("SALES_SUPPLY_PRICE"))) == 0)) {
|
||||
// orderNo로 contractObjId 조회 후 수주 데이터 가져오기
|
||||
Map<String, Object> orderDataParam = new HashMap<String, Object>();
|
||||
orderDataParam.put("orderNo", paramMap.get("orderNo"));
|
||||
Map<String, Object> orderData = salesNcollectMgmtService.getOrderDataByOrderNo(orderDataParam);
|
||||
|
||||
if(orderData != null && orderData.get("SALES_SUPPLY_PRICE") != null) {
|
||||
// 수주 데이터를 saleInfo에 병합 (기존 S/N 등은 유지)
|
||||
if(saleInfo == null) saleInfo = new HashMap<String, Object>();
|
||||
saleInfo.put("SALES_QUANTITY", orderData.get("SALES_QUANTITY"));
|
||||
saleInfo.put("SALES_UNIT_PRICE", orderData.get("SALES_UNIT_PRICE"));
|
||||
saleInfo.put("SALES_SUPPLY_PRICE", orderData.get("SALES_SUPPLY_PRICE"));
|
||||
saleInfo.put("SALES_VAT", orderData.get("SALES_VAT"));
|
||||
saleInfo.put("SALES_TOTAL_AMOUNT", orderData.get("SALES_TOTAL_AMOUNT"));
|
||||
saleInfo.put("SALES_CURRENCY", orderData.get("SALES_CURRENCY"));
|
||||
saleInfo.put("SALES_CURRENCY_NAME", orderData.get("SALES_CURRENCY_NAME"));
|
||||
saleInfo.put("SALES_EXCHANGE_RATE", orderData.get("SALES_EXCHANGE_RATE"));
|
||||
if(saleInfo.get("SHIPPING_DATE") == null || "".equals(saleInfo.get("SHIPPING_DATE"))) {
|
||||
saleInfo.put("SHIPPING_DATE", orderData.get("SHIPPING_DATE"));
|
||||
}
|
||||
salesCurrency = CommonUtils.nullToEmpty((String)orderData.get("SALES_CURRENCY"));
|
||||
}
|
||||
}
|
||||
|
||||
request.setAttribute("saleInfo", saleInfo);
|
||||
|
||||
// orderInfo로 견적 정보 전달 (saleInfo가 이미 모든 필요한 정보를 포함)
|
||||
|
||||
@@ -974,14 +974,24 @@
|
||||
<if test="shippingMethod != null and shippingMethod != ''">
|
||||
/* SHIPPING_METHOD 필드 없음 - 검색 조건 무시 */
|
||||
</if>
|
||||
<if test="manager != null and manager != ''">
|
||||
AND T.PM_USER_ID = #{manager}
|
||||
</if>
|
||||
<if test="incoterms != null and incoterms != ''">
|
||||
/* INCOTERMS 필드 없음 - 검색 조건 무시 */
|
||||
</if>
|
||||
-- 등록일 기준 최신순 정렬 (프로젝트 번호는 보조 정렬)
|
||||
ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC
|
||||
<if test="manager != null and manager != ''">
|
||||
AND T.PM_USER_ID = #{manager}
|
||||
</if>
|
||||
<if test="incoterms != null and incoterms != ''">
|
||||
/* INCOTERMS 필드 없음 - 검색 조건 무시 */
|
||||
</if>
|
||||
<if test="salesStatus != null and salesStatus != ''">
|
||||
<choose>
|
||||
<when test="salesStatus == 'NOT_CLOSED'">
|
||||
AND (T.SALES_STATUS IS NULL OR T.SALES_STATUS = '' OR T.SALES_STATUS != '완료')
|
||||
</when>
|
||||
<otherwise>
|
||||
AND T.SALES_STATUS = #{salesStatus}
|
||||
</otherwise>
|
||||
</choose>
|
||||
</if>
|
||||
-- 등록일 기준 최신순 정렬 (프로젝트 번호는 보조 정렬)
|
||||
ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC
|
||||
</select>
|
||||
|
||||
<!-- 매출관리 그리드 목록 개수 - project_mgmt 테이블 기반 -->
|
||||
@@ -1068,13 +1078,23 @@
|
||||
<if test="shippingMethod != null and shippingMethod != ''">
|
||||
/* SHIPPING_METHOD 필드 없음 - 검색 조건 무시 */
|
||||
</if>
|
||||
<if test="manager != null and manager != ''">
|
||||
AND T.PM_USER_ID = #{manager}
|
||||
</if>
|
||||
<if test="incoterms != null and incoterms != ''">
|
||||
/* INCOTERMS 필드 없음 - 검색 조건 무시 */
|
||||
</if>
|
||||
</select>
|
||||
<if test="manager != null and manager != ''">
|
||||
AND T.PM_USER_ID = #{manager}
|
||||
</if>
|
||||
<if test="incoterms != null and incoterms != ''">
|
||||
/* INCOTERMS 필드 없음 - 검색 조건 무시 */
|
||||
</if>
|
||||
<if test="salesStatus != null and salesStatus != ''">
|
||||
<choose>
|
||||
<when test="salesStatus == 'NOT_CLOSED'">
|
||||
AND (T.SALES_STATUS IS NULL OR T.SALES_STATUS = '' OR T.SALES_STATUS != '완료')
|
||||
</when>
|
||||
<otherwise>
|
||||
AND T.SALES_STATUS = #{salesStatus}
|
||||
</otherwise>
|
||||
</choose>
|
||||
</if>
|
||||
</select>
|
||||
|
||||
<!-- 매출관리 합계 조회 (Total 공급가액, 부가세, 총액) -->
|
||||
<select id="getSalesMgmtTotals" parameterType="map" resultType="map">
|
||||
@@ -1393,5 +1413,115 @@
|
||||
WHERE T.PROJECT_NO = #{orderNo}
|
||||
</select>
|
||||
|
||||
<!--
|
||||
/**
|
||||
* 주문서 관리에서 수주 데이터 조회 (판매등록용)
|
||||
* CONTRACT_ITEM 테이블에서 수주 정보를 가져와 판매등록 폼에 자동 채우기
|
||||
* @since 2025.11.10
|
||||
* @author assistant
|
||||
* @version 1.0
|
||||
**/
|
||||
-->
|
||||
<select id="getOrderDataForSale" parameterType="map" resultType="map">
|
||||
/* salesNcollectMgmt.getOrderDataForSale - 주문서 관리에서 판매등록용 수주 데이터 조회 */
|
||||
SELECT
|
||||
-- 기본 정보
|
||||
CM.CONTRACT_NO AS ORDER_NO,
|
||||
CM.OBJID AS CONTRACT_OBJID,
|
||||
|
||||
-- 수주 금액 정보 (CONTRACT_ITEM 테이블에서 합산) - VARCHAR 타입이므로 NUMERIC으로 캐스팅
|
||||
COALESCE(SUM(CI.ORDER_QUANTITY::NUMERIC), 0) AS SALES_QUANTITY,
|
||||
COALESCE(ROUND(AVG(CI.ORDER_UNIT_PRICE::NUMERIC), 2), 0) AS SALES_UNIT_PRICE,
|
||||
COALESCE(SUM(CI.ORDER_SUPPLY_PRICE::NUMERIC), 0) AS SALES_SUPPLY_PRICE,
|
||||
COALESCE(SUM(CI.ORDER_VAT::NUMERIC), 0) AS SALES_VAT,
|
||||
COALESCE(SUM(CI.ORDER_TOTAL_AMOUNT::NUMERIC), 0) AS SALES_TOTAL_AMOUNT,
|
||||
|
||||
-- 환종 정보
|
||||
CM.CONTRACT_CURRENCY AS SALES_CURRENCY,
|
||||
CODE_NAME(CM.CONTRACT_CURRENCY) AS SALES_CURRENCY_NAME,
|
||||
COALESCE(CM.EXCHANGE_RATE::NUMERIC, 0) AS SALES_EXCHANGE_RATE,
|
||||
|
||||
-- 수주 날짜 - VARCHAR 타입이므로 그대로 사용
|
||||
CM.ORDER_DATE AS SHIPPING_DATE,
|
||||
|
||||
-- 담당자
|
||||
CM.PM_USER_ID AS MANAGER
|
||||
|
||||
FROM CONTRACT_MGMT CM
|
||||
LEFT JOIN CONTRACT_ITEM CI ON CM.OBJID::VARCHAR = CI.CONTRACT_OBJID AND UPPER(CI.STATUS) = 'ACTIVE'
|
||||
WHERE CM.OBJID = #{contractObjId}::NUMERIC
|
||||
GROUP BY
|
||||
CM.CONTRACT_NO,
|
||||
CM.OBJID,
|
||||
CM.CONTRACT_CURRENCY,
|
||||
CM.EXCHANGE_RATE,
|
||||
CM.ORDER_DATE,
|
||||
CM.PM_USER_ID
|
||||
</select>
|
||||
|
||||
<!--
|
||||
/**
|
||||
* orderNo(PROJECT_NO)로 수주 데이터 조회 (판매등록용)
|
||||
* PROJECT_MGMT에서 CONTRACT_OBJID를 찾아서 수주 데이터 조회
|
||||
* @since 2025.11.10
|
||||
* @author assistant
|
||||
* @version 1.0
|
||||
**/
|
||||
-->
|
||||
<select id="getOrderDataByOrderNo" parameterType="map" resultType="map">
|
||||
/* salesNcollectMgmt.getOrderDataByOrderNo - orderNo로 판매등록용 수주 데이터 조회 */
|
||||
SELECT
|
||||
-- 기본 정보
|
||||
CM.CONTRACT_NO AS ORDER_NO,
|
||||
CM.OBJID AS CONTRACT_OBJID,
|
||||
|
||||
-- 수주 금액 정보 (CONTRACT_ITEM 테이블에서 합산) - VARCHAR 타입이므로 NUMERIC으로 캐스팅
|
||||
COALESCE(SUM(CI.ORDER_QUANTITY::NUMERIC), 0) AS SALES_QUANTITY,
|
||||
COALESCE(ROUND(AVG(CI.ORDER_UNIT_PRICE::NUMERIC), 2), 0) AS SALES_UNIT_PRICE,
|
||||
COALESCE(SUM(CI.ORDER_SUPPLY_PRICE::NUMERIC), 0) AS SALES_SUPPLY_PRICE,
|
||||
COALESCE(SUM(CI.ORDER_VAT::NUMERIC), 0) AS SALES_VAT,
|
||||
COALESCE(SUM(CI.ORDER_TOTAL_AMOUNT::NUMERIC), 0) AS SALES_TOTAL_AMOUNT,
|
||||
|
||||
-- 환종 정보
|
||||
CM.CONTRACT_CURRENCY AS SALES_CURRENCY,
|
||||
CODE_NAME(CM.CONTRACT_CURRENCY) AS SALES_CURRENCY_NAME,
|
||||
COALESCE(CM.EXCHANGE_RATE::NUMERIC, 0) AS SALES_EXCHANGE_RATE,
|
||||
|
||||
-- 수주 날짜 - VARCHAR 타입이므로 그대로 사용
|
||||
CM.ORDER_DATE AS SHIPPING_DATE,
|
||||
|
||||
-- 담당자
|
||||
CM.PM_USER_ID AS MANAGER
|
||||
|
||||
FROM PROJECT_MGMT PM
|
||||
INNER JOIN CONTRACT_MGMT CM ON PM.CONTRACT_OBJID = CM.OBJID
|
||||
LEFT JOIN CONTRACT_ITEM CI ON CM.OBJID::VARCHAR = CI.CONTRACT_OBJID AND UPPER(CI.STATUS) = 'ACTIVE'
|
||||
WHERE PM.PROJECT_NO = #{orderNo}
|
||||
GROUP BY
|
||||
CM.CONTRACT_NO,
|
||||
CM.OBJID,
|
||||
CM.CONTRACT_CURRENCY,
|
||||
CM.EXCHANGE_RATE,
|
||||
CM.ORDER_DATE,
|
||||
CM.PM_USER_ID
|
||||
</select>
|
||||
|
||||
<!--
|
||||
/**
|
||||
* 매출마감 처리
|
||||
* @since 2025.11.10
|
||||
* @author system
|
||||
* @version 1.0
|
||||
**/
|
||||
-->
|
||||
<update id="salesDeadlineConfirm" parameterType="map">
|
||||
/* salesNcollectMgmt.salesDeadlineConfirm - PROJECT_MGMT의 SALES_STATUS를 '완료'로 업데이트 및 매출마감일 저장 */
|
||||
UPDATE PROJECT_MGMT
|
||||
SET
|
||||
SALES_STATUS = '완료',
|
||||
SALES_DEADLINE_DATE = #{deadlineDate}
|
||||
WHERE OBJID::VARCHAR = #{OBJID}
|
||||
</update>
|
||||
|
||||
</mapper>
|
||||
|
||||
|
||||
@@ -259,6 +259,58 @@ public class SalesNcollectMgmtService {
|
||||
return CommonUtils.toUpperCaseMapKey(resultMap);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 주문서 관리에서 수주 데이터 조회 (판매등록용)
|
||||
* CONTRACT_ITEM 테이블에서 수주 정보를 가져와 판매등록 폼에 자동 채우기
|
||||
* </pre>
|
||||
* @param paramMap - contractObjId
|
||||
* @return Map<String, Object>
|
||||
*/
|
||||
public Map<String, Object> getOrderDataForSale(Map<String, Object> paramMap) {
|
||||
Map<String, Object> resultMap = new HashMap<String, Object>();
|
||||
SqlSession sqlSession = null;
|
||||
|
||||
try {
|
||||
sqlSession = SqlMapConfig.getInstance().getSqlSession();
|
||||
resultMap = sqlSession.selectOne("salesNcollectMgmt.getOrderDataForSale", paramMap);
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if(sqlSession != null) {
|
||||
sqlSession.close();
|
||||
}
|
||||
}
|
||||
|
||||
return CommonUtils.toUpperCaseMapKey(resultMap);
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* orderNo(PROJECT_NO)로 수주 데이터 조회 (판매등록용)
|
||||
* PROJECT_MGMT에서 CONTRACT_OBJID를 찾아서 수주 데이터 조회
|
||||
* </pre>
|
||||
* @param paramMap - orderNo
|
||||
* @return Map<String, Object>
|
||||
*/
|
||||
public Map<String, Object> getOrderDataByOrderNo(Map<String, Object> paramMap) {
|
||||
Map<String, Object> resultMap = new HashMap<String, Object>();
|
||||
SqlSession sqlSession = null;
|
||||
|
||||
try {
|
||||
sqlSession = SqlMapConfig.getInstance().getSqlSession();
|
||||
resultMap = sqlSession.selectOne("salesNcollectMgmt.getOrderDataByOrderNo", paramMap);
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if(sqlSession != null) {
|
||||
sqlSession.close();
|
||||
}
|
||||
}
|
||||
|
||||
return CommonUtils.toUpperCaseMapKey(resultMap);
|
||||
}
|
||||
|
||||
public Map<String, Object> saveSaleRegistration(HttpServletRequest request, Map<String, Object> paramMap) {
|
||||
Map<String, Object> resultMap = new HashMap<String, Object>();
|
||||
SqlSession sqlSession = null;
|
||||
@@ -802,34 +854,65 @@ public class SalesNcollectMgmtService {
|
||||
Map resultMap = new HashMap();
|
||||
SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(false);
|
||||
try{
|
||||
System.out.println("===== 매출마감 처리 시작 =====");
|
||||
System.out.println("paramMap: " + paramMap);
|
||||
|
||||
/*String checkParam = CommonUtils.checkNull(paramMap.get("checkArr"));
|
||||
String[] targetObjIdList = checkParam.split(",");
|
||||
String objIdListStr = CommonUtils.checkNull(paramMap.get("objIdList"));
|
||||
String deadlineDate = CommonUtils.checkNull(paramMap.get("deadlineDate"));
|
||||
|
||||
if(null != targetObjIdList && 0 < targetObjIdList.length){*/
|
||||
|
||||
System.out.println("objIdListStr: " + objIdListStr);
|
||||
System.out.println("deadlineDate: " + deadlineDate);
|
||||
|
||||
if(objIdListStr == null || objIdListStr.isEmpty()){
|
||||
resultMap.put("result", false);
|
||||
resultMap.put("msg", "선택된 항목이 없습니다.");
|
||||
System.out.println("에러: 선택된 항목 없음");
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
if(deadlineDate == null || deadlineDate.isEmpty()){
|
||||
resultMap.put("result", false);
|
||||
resultMap.put("msg", "매출마감일을 입력해주세요.");
|
||||
System.out.println("에러: 매출마감일 없음");
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
String[] targetObjIdList = objIdListStr.split(",");
|
||||
System.out.println("targetObjIdList 길이: " + targetObjIdList.length);
|
||||
|
||||
if(null != targetObjIdList && 0 < targetObjIdList.length){
|
||||
HttpSession session = request.getSession();
|
||||
sqlSession = SqlMapConfig.getInstance().getSqlSession();
|
||||
PersonBean person = (PersonBean)session.getAttribute(Constants.PERSON_BEAN);
|
||||
|
||||
String userId = person.getUserId();
|
||||
System.out.println("userId: " + userId);
|
||||
|
||||
/*for(int i=0;i<targetObjIdList.length;i++){*/
|
||||
//String objId = CommonUtils.checkNull(targetObjIdList[i]);
|
||||
//HashMap sqlParamMap = new HashMap();
|
||||
//sqlParamMap.put("OBJID", objId);
|
||||
//paramMap.put("PAYMENT_DATE", CommonUtils.getDateTime(new Date(), "yyyy-MM-dd"));
|
||||
sqlSession.update("salesNcollectMgmt.salesDeadlineConfirm",paramMap);
|
||||
/*}*/
|
||||
for(int i=0; i<targetObjIdList.length; i++){
|
||||
String objId = CommonUtils.checkNull(targetObjIdList[i]);
|
||||
System.out.println("처리 중 OBJID[" + i + "]: " + objId);
|
||||
|
||||
HashMap sqlParamMap = new HashMap();
|
||||
sqlParamMap.put("OBJID", objId);
|
||||
sqlParamMap.put("userId", userId);
|
||||
sqlParamMap.put("deadlineDate", deadlineDate);
|
||||
|
||||
System.out.println("SQL 실행 전 - sqlParamMap: " + sqlParamMap);
|
||||
int updateCount = sqlSession.update("salesNcollectMgmt.salesDeadlineConfirm", sqlParamMap);
|
||||
System.out.println("SQL 실행 결과 - 업데이트된 행 수: " + updateCount);
|
||||
}
|
||||
sqlSession.commit();
|
||||
System.out.println("커밋 완료");
|
||||
resultMap.put("result", true);
|
||||
resultMap.put("msg", "확인되었습니다");
|
||||
/*}*/
|
||||
resultMap.put("msg", targetObjIdList.length + "건의 매출마감이 완료되었습니다.");
|
||||
}
|
||||
System.out.println("===== 매출마감 처리 완료 =====");
|
||||
}catch(Exception e){
|
||||
resultMap.put("result", false);
|
||||
resultMap.put("msg", "확인에 실패하였습니다");
|
||||
resultMap.put("msg", "매출마감 처리 중 오류가 발생했습니다.");
|
||||
sqlSession.rollback();
|
||||
throw e;
|
||||
System.out.println("===== 매출마감 처리 중 예외 발생 =====");
|
||||
e.printStackTrace();
|
||||
}finally{
|
||||
sqlSession.close();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user