매출관리까지 한 작업 중간커밋

This commit is contained in:
leeheejin
2025-11-10 14:40:34 +09:00
parent 8b3c8b182c
commit 1530d643f2
8 changed files with 814 additions and 203 deletions

View File

@@ -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>

View File

@@ -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>