Files
wace_plm/WebContent/WEB-INF/classes/com/pms/mapper/salesMng.xml

5483 lines
166 KiB
XML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="salesMng">
<!-- Part 관리 기본 조회 -->
<sql id="partMngBase">
(
SELECT
P.OBJID,
P.PRODUCT_MGMT_OBJID,
P.UPG_NO,
P.PART_NO,
P.PART_NAME,
P.UNIT,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE 1=1 AND CODE_ID = P.UNIT) AS UNIT_TITLE,
P.QTY,
P.SPEC,
P.MATERIAL,
P.WEIGHT,
P.PART_TYPE,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE 1=1 AND CODE_ID = P.PART_TYPE) AS PART_TYPE_TITLE,
P.REMARK,
P.ES_SPEC,
P.MS_SPEC,
P.CHANGE_OPTION,
P.DESIGN_APPLY_POINT,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE 1=1 AND CODE_ID = P.DESIGN_APPLY_POINT) AS DESIGN_APPLY_POINT_TITLE,
P.MANAGEMENT_FLAG,
P.REVISION,
P.STATUS,
P.REG_DATE,
P.EDIT_DATE,
P.WRITER,
P.IS_LAST,
(SELECT EO_NO FROM EO_MNG AS EO WHERE EO.OBJID::varchar = P.EO) AS EO_NO,
(SELECT TO_CHAR(REG_DATE,'YYYY-MM-DD') FROM EO_MNG AS EO WHERE EO.OBJID::varchar = P.EO) AS EO_DATE,
P.EO,
P.EO_TEMP,
AF.SAVED_FILE_NAME,
AF.REAL_FILE_NAME,
REPLACE(AF.FILE_PATH, '\', '\\') AS FILE_PATH,
case when CAD.SAVED_FILE_NAME is NOT NULL
then 1
else 0 end as CU01_CNT,
case when DRAWING.SAVED_FILE_NAME is NOT NULL
then 1
else 0 end as CU02_CNT,
case when PDF.SAVED_FILE_NAME is NOT NULL
then 1
else 0 end as CU03_CNT,
case when PDFDRA.SAVED_FILE_NAME is NOT NULL
then 1
else 0 end as CU_TOTAL_CNT,
AF_ECD.SAVED_FILE_NAME AS ECD_SAVED_FILE_NAME,
AF_ECD.REAL_FILE_NAME AS ECD_REAL_FILE_NAME,
REPLACE(AF_ECD.FILE_PATH, '\', '\\') AS ECD_FILE_PATH,
CASE
WHEN AF_ECD.SAVED_FILE_NAME IS NOT NULL THEN 'Y'
ELSE 'N'
END ECD_FLAG
FROM
PART_MNG P
LEFT OUTER JOIN
(
SELECT
TARGET_OBJID,
SAVED_FILE_NAME,
REAL_FILE_NAME,
FILE_PATH,
DOC_TYPE
FROM ATTACH_FILE_INFO
WHERE 1 = 1
AND DOC_TYPE IN ('PART_SHAPE_IMG')
AND STATUS = 'Active'
) AF
ON P.OBJID::NUMERIC = AF.TARGET_OBJID
LEFT OUTER JOIN
(
SELECT
TARGET_OBJID,
SAVED_FILE_NAME,
REAL_FILE_NAME,
FILE_PATH,
DOC_TYPE
FROM ATTACH_FILE_INFO
WHERE 1 = 1
AND DOC_TYPE IN ('ECD_DOC')
AND STATUS = 'Active'
) AF_ECD
ON P.OBJID::NUMERIC = AF_ECD.TARGET_OBJID
LEFT OUTER JOIN
(
SELECT
TARGET_OBJID,
SAVED_FILE_NAME,
REAL_FILE_NAME,
FILE_PATH,
DOC_TYPE
FROM ATTACH_FILE_INFO
WHERE 1 = 1
AND DOC_TYPE IN ('3D_CAD')
AND STATUS = 'Active'
) CAD
ON P.OBJID::NUMERIC = CAD.TARGET_OBJID
LEFT OUTER JOIN
(
SELECT
TARGET_OBJID,
SAVED_FILE_NAME,
REAL_FILE_NAME,
FILE_PATH,
DOC_TYPE
FROM ATTACH_FILE_INFO
WHERE 1 = 1
AND DOC_TYPE IN ('2D_DRAWING_CAD')
AND STATUS = 'Active'
) DRAWING
ON P.OBJID::NUMERIC = DRAWING.TARGET_OBJID
LEFT OUTER JOIN
(
SELECT
TARGET_OBJID,
SAVED_FILE_NAME,
REAL_FILE_NAME,
FILE_PATH,
DOC_TYPE
FROM ATTACH_FILE_INFO
WHERE 1 = 1
AND DOC_TYPE IN ('2D_PDF_CAD')
AND STATUS = 'Active'
) PDF
ON P.OBJID::NUMERIC = PDF.TARGET_OBJID
LEFT OUTER JOIN
(
SELECT
TARGET_OBJID,
SAVED_FILE_NAME,
REAL_FILE_NAME,
FILE_PATH,
DOC_TYPE
FROM ATTACH_FILE_INFO
WHERE 1 = 1
AND DOC_TYPE IN ('2D_PDF_CAD','2D_DRAWING_CAD')
AND STATUS = 'Active'
) PDFDRA
ON P.OBJID::NUMERIC = PDFDRA.TARGET_OBJID
)
</sql>
<update id="mergeSalesMngBOM" parameterType="map">
INSERT INTO SALES_BOM_PART_QTY
(
SALES_BOM_OBJID
,OBJID
,BOM_REPORT_OBJID
,PRODUCT_TYPE_CODE
,PARTNER_OBJID
,PARTNER_PRICE
,PARTNER_REMARK
,REGDATE
,PART_OBJID
,SALES_PART_CODE
,PALETTE_CODE
,SOURCING_CODE
,PROCESS1_CODE
,PROCESS2_CODE
,PROCESS3_CODE
,PROCESS4_CODE
)
VALUES
(
#{SALES_BOM_OBJID}
,#{OBJID}
,#{BOM_REPORT_OBJID}
,#{PRODUCT_TYPE_CODE}
,#{PARTNER_OBJID}
,#{PARTNER_PRICE}
,#{PARTNER_REMARK}
,NOW()
,#{PART_OBJID}
,#{SALES_PART_CODE}
,#{PALETTE_CODE}
,#{SOURCING_CODE}
,#{PROCESS1_CODE}
,#{PROCESS2_CODE}
,#{PROCESS3_CODE}
,#{PROCESS4_CODE}
) ON CONFLICT (OBJID) DO
UPDATE
SET
PRODUCT_TYPE_CODE = #{PRODUCT_TYPE_CODE}
,PARTNER_OBJID = #{PARTNER_OBJID}
,PARTNER_PRICE = #{PARTNER_PRICE}
,PARTNER_REMARK = #{PARTNER_REMARK}
,SALES_PART_CODE = #{SALES_PART_CODE}
,PALETTE_CODE = #{PALETTE_CODE}
,SOURCING_CODE = #{SOURCING_CODE}
,PROCESS1_CODE = #{PROCESS1_CODE}
,PROCESS2_CODE = #{PROCESS2_CODE}
,PROCESS3_CODE = #{PROCESS3_CODE}
,PROCESS4_CODE = #{PROCESS4_CODE}
</update>
<update id="mergeSalesBOMReport" parameterType="map">
INSERT INTO SALES_BOM_REPORT
(
BOM_REPORT_OBJID,
PRODUCT_MGMT_OBJID,
PRODUCT_MGMT_SPEC,
PRODUCT_MGMT_UPG,
PRODUCT_MGMT_VC,
WRITER,
REGDATE,
STATUS,
DEPLOY_DATE,
REV,
SPEC_NAME,
NOTE
)VALUES(
#{BOM_REPORT_OBJID},
#{PRODUCT_MGMT_OBJID},
#{PRODUCT_MGMT_SPEC},
#{PRODUCT_MGMT_UPG},
#{PRODUCT_MGMT_VC},
#{WRITER},
NOW(),
#{STATUS},
#{DEPLOY_DATE},
#{REV},
#{SPEC_NAME},
#{NOTE}
) ON CONFLICT (BOM_REPORT_OBJID) DO
UPDATE
SET
WRITER = #{WRITER}
</update>
<!-- <update id="mergeSalesMngBOM" parameterType="map">
INSERT INTO SALES_BOM_PART_QTY
(
SALES_BOM_OBJID
,OBJID
,BOM_REPORT_OBJID
,PARENT_OBJID
,CHILD_OBJID
,PARENT_PART_NO
,PART_NO
,QTY
,PRODUCT_TYPE_CODE
,FIRST_PARTNER_OBJID
,FIRST_PARTNER_PRICE
,FIRST_PARTNER_QTY
,SECOND_PARTNER_OBJID
,SECOND_PARTNER_PRICE
,SECOND_PARTNER_QTY
,THIRD_PARTNER_OBJID
,THIRD_PARTNER_PRICE
,THIRD_PARTNER_QTY
,REGDATE
)
VALUES
(
#{SALES_BOM_OBJID}
,#{OBJID}
,#{BOM_REPORT_OBJID}
,#{PARENT_OBJID}
,#{CHILD_OBJID}
,#{PARENT_PART_NO}
,#{PART_NO}
,#{QTY}
,#{PRODUCT_TYPE_CODE}
,#{FIRST_PARTNER_OBJID}
,#{FIRST_PARTNER_PRICE}
,#{FIRST_PARTNER_QTY}
,#{SECOND_PARTNER_OBJID}
,#{SECOND_PARTNER_PRICE}
,#{SECOND_PARTNER_QTY}
,#{THIRD_PARTNER_OBJID}
,#{THIRD_PARTNER_PRICE}
,#{THIRD_PARTNER_QTY}
,NOW()
) ON CONFLICT (OBJID) DO
UPDATE
SET
PRODUCT_TYPE_CODE = #{PRODUCT_TYPE_CODE}
,FIRST_PARTNER_OBJID = #{FIRST_PARTNER_OBJID}
,FIRST_PARTNER_PRICE = #{FIRST_PARTNER_PRICE}
,FIRST_PARTNER_QTY = #{FIRST_PARTNER_QTY}
,SECOND_PARTNER_OBJID = #{SECOND_PARTNER_OBJID}
,SECOND_PARTNER_PRICE = #{SECOND_PARTNER_PRICE}
,SECOND_PARTNER_QTY = #{SECOND_PARTNER_QTY}
,THIRD_PARTNER_OBJID = #{THIRD_PARTNER_OBJID}
,THIRD_PARTNER_PRICE = #{THIRD_PARTNER_PRICE}
,THIRD_PARTNER_QTY = #{THIRD_PARTNER_QTY}
</update> -->
<select id="structureAscendingListPopup" parameterType="map" resultType="map">
WITH RECURSIVE VIEW_BOM(
PRODUCT_MGMT_OBJID,
SPEC_NAME,
BOM_REPORT_OBJID,
OBJID,
PARENT_OBJID,
CHILD_OBJID,
PARENT_PART_NO,
PART_NO,
QTY,
REGDATE,
SEQ,
LEV,
PATH,
CYCLE
) AS (
SELECT
PBM.PRODUCT_MGMT_OBJID,
PBM.SPEC_NAME,
A.BOM_REPORT_OBJID,
A.OBJID,
A.PARENT_OBJID,
A.CHILD_OBJID,
A.PARENT_PART_NO,
A.PART_NO,
A.QTY,
A.REGDATE,
A.SEQ,
1,
ARRAY [A.CHILD_OBJID::TEXT],
FALSE
FROM
BOM_PART_QTY A
LEFT JOIN
PART_BOM_REPORT PBM
ON A.BOM_REPORT_OBJID = PBM.OBJID::TEXT
WHERE 1=1
AND (A.PARENT_OBJID IS NULL OR A.PARENT_OBJID = '')
AND A.BOM_REPORT_OBJID = #{bom_report_objid}
UNION ALL
SELECT
PBM.PRODUCT_MGMT_OBJID,
PBM.SPEC_NAME,
B.BOM_REPORT_OBJID,
B.OBJID,
B.PARENT_OBJID,
B.CHILD_OBJID,
B.PARENT_PART_NO,
B.PART_NO,
B.QTY,
B.REGDATE,
B.SEQ,
LEV + 1,
PATH||B.CHILD_OBJID::TEXT,
B.PARENT_OBJID = ANY(PATH)
FROM
BOM_PART_QTY B
LEFT JOIN
PART_BOM_REPORT PBM
ON B.BOM_REPORT_OBJID = PBM.OBJID::TEXT
INNER JOIN
VIEW_BOM
ON B.PARENT_OBJID = VIEW_BOM.CHILD_OBJID
AND VIEW_BOM.BOM_REPORT_OBJID = B.BOM_REPORT_OBJID
)
SELECT
V.BOM_REPORT_OBJID
,V.OBJID
,V.PARENT_OBJID
,V.CHILD_OBJID
,V.PARENT_PART_NO
,V.QTY
,V.LEV
,(SELECT COUNT(*) FROM BOM_PART_QTY WHERE PARENT_OBJID = V.CHILD_OBJID) AS SUB_PART_CNT
,V.SEQ
, (CASE WHEN V.CYCLE IS NULL THEN 1 ELSE 0 END) AS LEAF
,P.OBJID AS PART_OBJID
,P.PART_NO
,P.PART_NAME
,P.UNIT_TITLE
,P.QTY
,P.MATERIAL
,P.WEIGHT
,P.PART_TYPE_TITLE
,P.REVISION
,P.EO_NO
,P.EO_DATE
,P.SPEC
,P.PART_REGDATE_TITLE
,(SELECT PRODUCT_CODE FROM PRODUCT_MGMT AS O WHERE O.OBJID::VARCHAR = V.PRODUCT_MGMT_OBJID::VARCHAR) AS PRODUCT_CODE
,V.SPEC_NAME
,SBPQ.PRODUCT_TYPE_CODE
,SBPQ.PARTNER_OBJID
,SBPQ.PARTNER_PRICE
,SBPQ.PARTNER_REMARK
,SBPQ.SALES_PART_CODE
,SBPQ.PALETTE_CODE
,COALESCE(SBPQ.SOURCING_CODE, P.SOURCING_CODE) AS SOURCING_CODE
,SBPQ.PROCESS1_CODE
,SBPQ.PROCESS2_CODE
,SBPQ.PROCESS3_CODE
,SBPQ.PROCESS4_CODE
FROM
VIEW_BOM V
LEFT OUTER JOIN <include refid="partMng.partMngBase"/> P
ON V.PART_NO = P.OBJID::TEXT
LEFT OUTER JOIN SALES_BOM_PART_QTY SBPQ
ON V.BOM_REPORT_OBJID::VARCHAR = SBPQ.BOM_REPORT_OBJID
AND V.OBJID::VARCHAR = SBPQ.OBJID
ORDER BY V.SEQ
</select>
<!-- 구매 BOM을 통한 구매 의뢰 시 대상 Part 정보를 가져온다. -->
<select id="getSalesRequestTargetPartList" parameterType="map" resultType="map">
WITH RECURSIVE VIEW_BOM(
BOM_REPORT_OBJID,
OBJID,
PARENT_OBJID,
CHILD_OBJID,
PARENT_PART_NO,
PART_NO,
QTY,
REGDATE,
SEQ,
LEV,
PATH,
CYCLE
) AS (
SELECT
A.BOM_REPORT_OBJID,
A.OBJID,
A.PARENT_OBJID,
A.CHILD_OBJID,
A.PARENT_PART_NO,
A.PART_NO,
A.QTY,
A.REGDATE,
A.SEQ,
1,
ARRAY [A.CHILD_OBJID::TEXT],
FALSE
FROM
BOM_PART_QTY A
where 1=1
AND (A.PARENT_OBJID IS NULL OR A.PARENT_OBJID = '')
AND A.BOM_REPORT_OBJID = #{bom_report_objid}
UNION ALL
SELECT
B.BOM_REPORT_OBJID,
B.OBJID,
B.PARENT_OBJID,
B.CHILD_OBJID,
B.PARENT_PART_NO,
B.PART_NO,
B.QTY,
B.REGDATE,
B.SEQ,
LEV + 1,
PATH||B.CHILD_OBJID::TEXT,
B.PARENT_OBJID = ANY(PATH)
FROM
BOM_PART_QTY B
JOIN
VIEW_BOM
ON B.PARENT_OBJID = VIEW_BOM.CHILD_OBJID
AND VIEW_BOM.BOM_REPORT_OBJID = B.BOM_REPORT_OBJID
)
SELECT
V.BOM_REPORT_OBJID
,V.PARENT_OBJID
,V.CHILD_OBJID
,V.PARENT_PART_NO
,V.QTY
,V.LEV
,(SELECT COUNT(*) FROM BOM_PART_QTY WHERE PARENT_OBJID = V.CHILD_OBJID) AS SUB_PART_CNT
,V.SEQ
,(CASE WHEN V.CYCLE IS NULL THEN 1 ELSE 0 END) AS LEAF
,T2.OBJID AS PART_OBJID
,T2.PART_NO
,T2.PART_NAME
,T2.UNIT_TITLE
,T2.EO_NO
,T2.EO_DATE
,T2.REVISION
,T2.SPEC
,T2.MATERIAL
,T2.WEIGHT
,SBPQ.PRODUCT_TYPE_CODE
,SBPQ.FIRST_PARTNER_OBJID
,SBPQ.FIRST_PARTNER_PRICE
,SBPQ.FIRST_PARTNER_QTY
,SBPQ.SECOND_PARTNER_OBJID
,SBPQ.SECOND_PARTNER_PRICE
,SBPQ.SECOND_PARTNER_QTY
,SBPQ.THIRD_PARTNER_OBJID
,SBPQ.THIRD_PARTNER_PRICE
,SBPQ.THIRD_PARTNER_QTY
,(SELECT CC.CODE_NAME FROM COMM_CODE CC WHERE 1=1 AND CC.CODE_ID = SBPQ.PRODUCT_TYPE_CODE) AS PRODUCT_TYPE_CODE_NAME
,(SELECT SM.SUPPLY_NAME FROM SUPPLY_MNG SM WHERE 1=1 AND SM.SUPPLY_CODE = SBPQ.FIRST_PARTNER_OBJID) AS FIRST_PARTNER_NAME
,(SELECT SM.SUPPLY_NAME FROM SUPPLY_MNG SM WHERE 1=1 AND SM.SUPPLY_CODE = SBPQ.SECOND_PARTNER_OBJID) AS SECOND_PARTNER_NAME
,(SELECT SM.SUPPLY_NAME FROM SUPPLY_MNG SM WHERE 1=1 AND SM.SUPPLY_CODE = SBPQ.THIRD_PARTNER_OBJID) AS THIRD_PARTNER_NAME
,SBPQ.OBJID
,SBPQ.OBJID AS SALES_BOM_QTY_OBJID
FROM
VIEW_BOM V
LEFT OUTER JOIN <include refid="partMng.partMngBase"/> T2
ON V.PART_NO = T2.OBJID::TEXT
LEFT OUTER JOIN SALES_BOM_PART_QTY SBPQ
ON V.BOM_REPORT_OBJID::VARCHAR = SBPQ.BOM_REPORT_OBJID
AND V.OBJID::VARCHAR = SBPQ.OBJID
WHERE 1=1
AND(
(SBPQ.FIRST_PARTNER_OBJID IS NOT NULL AND SBPQ.FIRST_PARTNER_OBJID != '') OR
(SBPQ.SECOND_PARTNER_OBJID IS NOT NULL AND SBPQ.SECOND_PARTNER_OBJID != '') OR
(SBPQ.THIRD_PARTNER_OBJID IS NOT NULL AND SBPQ.THIRD_PARTNER_OBJID != '')
)
ORDER BY V.PATH,V.REGDATE
</select>
<!-- 구매 BOM을 통한 구매 의뢰 시 저장된 Part 정보를 가져온다. -->
<select id="getSalesRequestSavedPartList" parameterType="map" resultType="map">
SELECT
ROW_NUMBER() OVER(ORDER BY SRP.REGDATE DESC) AS RNUM,
SRP.OBJID,
SRP.SALES_BOM_QTY_OBJID,
SRP.PART_OBJID,
SRP.SALES_REQUEST_MASTER_OBJID,
SRP.QTY,
SRP.ORG_QTY,
SRP.PARTNER_OBJID,
SRP.PARTNER_PRICE,
SRP.DELIVERY_REQUEST_DATE,
SRP.WRITER,
SRP.REGDATE,
SRP.STATUS,
SRP.REMARK,
PM.PART_NAME,
PM.MATERIAL,
PM.SPEC,
PM.PART_NO,
PM.REVISION,
PM.PART_NAME||'('||PM.MATERIAL||','||PM.SPEC||')/'||PM.PART_NO AS TARGET_TITLE,
PM.UNIT_TITLE
FROM
SALES_REQUEST_MASTER SRM
INNER JOIN SALES_REQUEST_PART SRP
ON SRM.OBJID = SRP.SALES_REQUEST_MASTER_OBJID
LEFT OUTER JOIN <include refid="partMng.partMngBase"/> PM
ON SRP.PART_OBJID = PM.OBJID::TEXT
WHERE 1=1
AND SRM.OBJID = #{SALES_REQUEST_MASTER_OBJID}
<if test="PARTNER_OBJID != null and !''.equals(PARTNER_OBJID)">
AND SRP.PARTNER_OBJID = #{PARTNER_OBJID}
</if>
</select>
<update id="mergeSalesRequestMasterInfo" parameterType="map">
INSERT INTO SALES_REQUEST_MASTER
(
OBJID,
REQUEST_MNG_NO,
REQUEST_CD,
PROJECT_NO,
RELEASE_DATE,
REQUEST_REASONS,
REQUEST_USER_ID,
DELIVERY_REQUEST_DATE,
UNIT_NAME,
STATUS,
RECEIPT_USER_ID,
RECEIPT_DATE,
WRITER,
REMARK,
REGDATE,
PURCHASE_TYPE,
ORDER_TYPE,
PRODUCT_NAME,
AREA_CD,
CUSTOMER_OBJID,
PAID_TYPE,
DOC_TYPE
)
VALUES
(
#{SALES_REQUEST_MASTER_OBJID },
(SELECT 'R'||TO_CHAR(NOW(),'YYYYMMDD')||'-'||LPAD((COALESCE(MAX(SUBSTR(REQUEST_MNG_NO,11,13)),'0')::INTEGER+1)::TEXT,3,'0') FROM SALES_REQUEST_MASTER WHERE DOC_TYPE IN ('PURCHASE_REQUEST', 'PURCHASE_REG') OR DOC_TYPE IS NULL),
#{REQUEST_CD },
#{PROJECT_NO },
#{RELEASE },
#{REQUEST_REASONS },
#{REQUEST_USER_ID },
#{DELIVERY_REQUEST_DATE },
#{UNIT_NAME },
#{STATUS },
#{RECEIPT_USER_ID },
#{RECEIPT_DATE },
#{WRITER },
#{REMARK },
NOW(),
#{PURCHASE_TYPE },
#{ORDER_TYPE },
#{PRODUCT_NAME },
#{AREA_CD },
#{CUSTOMER_OBJID },
#{PAID_TYPE },
COALESCE(NULLIF(#{DOC_TYPE}, ''), 'PURCHASE_REQUEST')
) ON CONFLICT (OBJID) DO
UPDATE
SET
REQUEST_CD = #{REQUEST_CD },
PROJECT_NO = #{PROJECT_NO },
RELEASE_DATE = #{RELEASE },
REQUEST_REASONS = #{REQUEST_REASONS },
REQUEST_USER_ID = #{REQUEST_USER_ID },
DELIVERY_REQUEST_DATE = #{DELIVERY_REQUEST_DATE },
UNIT_NAME = #{UNIT_NAME },
STATUS = #{STATUS },
RECEIPT_USER_ID = #{RECEIPT_USER_ID },
RECEIPT_DATE = #{RECEIPT_DATE },
REMARK = #{REMARK },
PURCHASE_TYPE = #{PURCHASE_TYPE },
ORDER_TYPE = #{ORDER_TYPE },
PRODUCT_NAME = #{PRODUCT_NAME },
AREA_CD = #{AREA_CD },
CUSTOMER_OBJID = #{CUSTOMER_OBJID },
PAID_TYPE = #{PAID_TYPE }
</update>
<select id="getSalesRequestMasterInfo" parameterType="map" resultType="map">
SELECT
SRM.OBJID,
SRM.REQUEST_MNG_NO,
SRM.REQUEST_CD,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.REQUEST_CD) AS REQUEST_CD_NAME,
SRM.PROJECT_NO,
PM.PROJECT_NO AS PROJECT_NUMBER,
PM.PROJECT_NAME,
PM.PART_NO,
PM.PART_NAME,
PM.DUE_DATE,
COALESCE(
PM.OBJID,
(SELECT OBJID FROM PROJECT_MGMT WHERE PROJECT_NO = SRM.PROJECT_NO LIMIT 1)
) AS PROJECT_MGMT_OBJID,
-- M-BOM 조회용: SALES_REQUEST_MASTER에 저장된 MBOM_HEADER_OBJID 사용
SRM.MBOM_HEADER_OBJID,
COALESCE(
PM.BOM_REPORT_OBJID,
(SELECT BOM_REPORT_OBJID FROM PROJECT_MGMT WHERE PROJECT_NO = SRM.PROJECT_NO LIMIT 1)
) AS BOM_REPORT_OBJID,
PM.SETUP,
CASE
WHEN SM.OBJID IS NOT NULL THEN SM.SUPPLY_NAME
WHEN CM.CUSTOMER_OBJID LIKE 'C_%' THEN (SELECT CLIENT_NM FROM CLIENT_MNG WHERE 'C_' || OBJID::VARCHAR = CM.CUSTOMER_OBJID)
ELSE SM.SUPPLY_NAME
END AS CUSTOMER_NAME,
COALESCE(SM.OBJID::VARCHAR, CM.CUSTOMER_OBJID) AS CUSTOMER_OBJID, -- 고객사 OBJID (드롭다운 선택용)
PM.MECHANICAL_TYPE,
SRM.RELEASE_DATE,
SRM.REQUEST_REASONS,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.REQUEST_REASONS) AS REQUEST_REASONS_NAME,
SRM.REQUEST_USER_ID,
(SELECT DEPT_NAME||' '||USER_NAME FROM USER_INFO WHERE USER_ID = SRM.REQUEST_USER_ID) AS REQUEST_USER_NAME,
SRM.DELIVERY_REQUEST_DATE,
SRM.UNIT_NAME,
(SELECT TASK_NAME FROM PMS_WBS_TASK AS O WHERE O.OBJID = SRM.UNIT_NAME) AS UNIT_CODE_NAME,
SRM.STATUS,
CASE SRM.STATUS
WHEN 'create' THEN '미접수'
WHEN 'release' THEN '제출 완료'
WHEN 'reception' THEN '접수'
WHEN 'approvalRequest' THEN '결재중'
WHEN 'approvalComplete' THEN '결재완료'
WHEN 'reject' THEN '반려'
ELSE ''
END STATUS_TITLE,
SRM.RECEIPT_USER_ID,
(SELECT DEPT_NAME||' '||USER_NAME FROM USER_INFO WHERE USER_ID = SRM.RECEIPT_USER_ID) AS RECEIPT_USER_NAME,
SRM.RECEIPT_DATE,
SRM.WRITER,
(SELECT DEPT_NAME||' '||USER_NAME FROM USER_INFO WHERE USER_ID = SRM.WRITER) AS WRITER_NAME,
SRM.REGDATE,
TO_CHAR(SRM.REGDATE,'YYYY-MM-DD') AS REGDATE_TITLE,
SRM.REMARK,
-- 저장된 값 우선, 없으면 조인으로 가져오기
COALESCE(NULLIF(SRM.PURCHASE_TYPE, ''), POM.TYPE) AS PURCHASE_TYPE, -- 구매유형
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = COALESCE(NULLIF(SRM.PURCHASE_TYPE, ''), POM.TYPE)) AS PURCHASE_TYPE_NAME, -- 구매유형명
COALESCE(NULLIF(SRM.ORDER_TYPE, ''), POM.ORDER_TYPE_CD) AS ORDER_TYPE, -- 주문유형
COALESCE(NULLIF(SRM.PRODUCT_NAME, ''), PM.PRODUCT) AS PRODUCT_NAME, -- 제품구분
COALESCE(NULLIF(SRM.AREA_CD, ''), SM.AREA_CD) AS AREA_CD, -- 국내/해외
COALESCE(NULLIF(SRM.CUSTOMER_OBJID, ''), SM.OBJID::VARCHAR) AS CUSTOMER_OBJID, -- 고객사
COALESCE(NULLIF(SRM.PAID_TYPE, ''), CM.PAID_TYPE) AS PAID_TYPE, -- 유/무상
CM.CATEGORY_CD AS CATEGORY_CD, -- 제품유형 코드 ID (드롭다운 선택용)
SRM.DOC_TYPE -- 문서유형 (PURCHASE_REQUEST, PURCHASE_REG, PROPOSAL 등)
-- 품번/품명: 첫 번째 품목 + 외 N건 형태
<!-- (SELECT
CASE
WHEN (SELECT COUNT(*) FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID) > 1 THEN
COALESCE((SELECT PM2.PART_NO FROM PART_MNG PM2 WHERE PM2.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1)), '') || ' 외 ' || ((SELECT COUNT(*) FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID) - 1)::TEXT || '건'
ELSE
COALESCE((SELECT PM2.PART_NO FROM PART_MNG PM2 WHERE PM2.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1)), '')
END
) AS PART_NO,
(SELECT
CASE
WHEN (SELECT COUNT(*) FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID) > 1 THEN
COALESCE((SELECT PM2.PART_NAME FROM PART_MNG PM2 WHERE PM2.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1)), '') || ' 외 ' || ((SELECT COUNT(*) FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID) - 1)::TEXT || '건'
ELSE
COALESCE((SELECT PM2.PART_NAME FROM PART_MNG PM2 WHERE PM2.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1)), '')
END
) AS PART_NAME -->
FROM
SALES_REQUEST_MASTER SRM
LEFT JOIN PROJECT_MGMT PM ON (SRM.PROJECT_NO = PM.OBJID::VARCHAR OR SRM.PROJECT_NO = PM.PROJECT_NO)
LEFT JOIN CONTRACT_MGMT CM ON PM.CONTRACT_OBJID = CM.OBJID::VARCHAR
LEFT JOIN SUPPLY_MNG SM ON CM.CUSTOMER_OBJID::VARCHAR = SM.OBJID::VARCHAR
LEFT JOIN PURCHASE_ORDER_MASTER POM ON SRM.OBJID = POM.SALES_REQUEST_OBJID
WHERE 1=1
AND SRM.OBJID = #{SALES_REQUEST_MASTER_OBJID}
</select>
<!-- 구매의뢰 저장 시 저장된 파트 정보를 초기화 -->
<delete id="initSalesRequestPart" parameterType="map">
DELETE FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = #{SALES_REQUEST_MASTER_OBJID}
</delete>
<update id="mergeSalesRequestPartInfo" parameterType="map">
INSERT INTO SALES_REQUEST_PART
(
OBJID,
SALES_BOM_QTY_OBJID,
PART_OBJID,
SALES_REQUEST_MASTER_OBJID,
QTY,
ORG_QTY,
PARTNER_OBJID,
PARTNER_PRICE,
DELIVERY_REQUEST_DATE,
WRITER,
REGDATE,
STATUS
<!-- REMARK -->
)
VALUES
(
#{SALES_REQUEST_PART_OBJID },
#{SALES_BOM_QTY_OBJID },
#{PART_OBJID },
#{SALES_REQUEST_MASTER_OBJID},
COALESCE(NULLIF(TRIM(#{QTY}::TEXT), '')::NUMERIC, 0),
COALESCE(NULLIF(TRIM(#{ORG_QTY}::TEXT), '')::NUMERIC, 0),
#{PARTNER_OBJID },
#{PARTNER_PRICE },
#{DELIVERY_REQUEST_DATE },
#{WRITER},
NOW(),
#{STATUS}
<!-- #{REMARK} -->
) ON CONFLICT (OBJID) DO
UPDATE
SET
SALES_BOM_QTY_OBJID = #{SALES_BOM_QTY_OBJID },
PART_OBJID = #{PART_OBJID },
SALES_REQUEST_MASTER_OBJID = #{SALES_REQUEST_MASTER_OBJID},
QTY = COALESCE(NULLIF(TRIM(#{QTY}::TEXT), '')::NUMERIC, 0),
ORG_QTY = COALESCE(NULLIF(TRIM(#{ORG_QTY}::TEXT), '')::NUMERIC, 0),
PARTNER_OBJID = #{PARTNER_OBJID },
PARTNER_PRICE = #{PARTNER_PRICE },
DELIVERY_REQUEST_DATE = #{DELIVERY_REQUEST_DATE },
WRITER = #{WRITER},
STATUS = #{STATUS}
<!-- REMARK = #{REMARK} -->
</update>
<update id="mergeSalesRequestPartSupplyInfo" parameterType="map">
UPDATE SALES_REQUEST_PART SET
PARTNER_OBJID = #{PARTNER_OBJID }
WHERE OBJID = #{OBJID}
AND SALES_REQUEST_MASTER_OBJID = #{SALES_REQUEST_MASTER_OBJID}
</update>
<select id="getSalesRequestMasterList" parameterType="map" resultType="map">
SELECT
ROW_NUMBER() OVER(ORDER BY REGDATE DESC) AS RNUM,
AA.*
FROM (
SELECT
SRM.OBJID,
SRM.REQUEST_MNG_NO,
SRM.CATEGORY_CD,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.CATEGORY_CD) AS CATEGORY_CD_NAME,
SRM.PRODUCT_GROUP,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.PRODUCT_GROUP) AS PRODUCT_GROUP_NAME,
SRM.PRODUCT,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.PRODUCT) AS PRODUCT_NAME,
SRM.PRODUCT_CODE,
(SELECT PRODUCT_CODE FROM PRODUCT_MGMT AS O WHERE O.OBJID::VARCHAR = SRM.PRODUCT_CODE::VARCHAR) AS PRODUCT_CODE_NAME,
SRM.SALES_MNG_USER_ID,
(SELECT DEPT_NAME||' '||USER_NAME FROM USER_INFO WHERE USER_ID = SRM.SALES_MNG_USER_ID) AS SALES_MNG_USER_NAME,
SRM.REQUEST_STATUS,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.REQUEST_STATUS) AS REQUEST_STATUS_TITLE,
SRM.REQUEST_STATUS_REMARK,
SRM.TITLE,
SRM.WRITER,
(SELECT DEPT_NAME||' '||USER_NAME FROM USER_INFO WHERE USER_ID = SRM.WRITER) AS WRITER_NAME,
SRM.REGDATE,
TO_CHAR(SRM.REGDATE,'YYYY-MM-DD') AS REGDATE_TITLE,
SRM.STATUS,
CASE SRM.STATUS
WHEN 'create' THEN '등록'
WHEN 'release' THEN '제출 완료'
WHEN 'reception' THEN '의뢰 접수'
WHEN 'approvalRequest' THEN '결재중'
WHEN 'approvalComplete' THEN '결재완료'
WHEN 'reject' THEN '반려'
ELSE ''
END STATUS_TITLE,
SRP.TARGET_TITLE,
A.APPR_STATUS,
A.ROUTE_OBJID,
A.APPROVAL_OBJID,
A.ROUTE_OBJID
FROM
SALES_REQUEST_MASTER SRM
LEFT OUTER JOIN(
SELECT
B.OBJID AS ROUTE_OBJID,
CASE B.STATUS
WHEN 'inProcess' THEN '결재중'
WHEN 'complete' THEN '결재완료'
WHEN 'reject' THEN '반려'
ELSE ''
END APPR_STATUS,
A.OBJID AS APPROVAL_OBJID,
A.TARGET_OBJID,
B.ROUTE_SEQ
FROM
APPROVAL A,
(
select
T1.*
from
(
select
TARGET_OBJID,
max(T.ROUTE_SEQ) as ROUTE_SEQ
from
ROUTE T
group by
T.TARGET_OBJID
) T,
ROUTE T1
where
T.TARGET_OBJID = T1.TARGET_OBJID
and T.ROUTE_SEQ = T1.ROUTE_SEQ
) B
WHERE A.OBJID = B.APPROVAL_OBJID
AND TARGET_TYPE IN ('SALES_REQUEST')
) A ON SRM.OBJID::VARCHAR = A.TARGET_OBJID::VARCHAR
LEFT OUTER JOIN(
SELECT
ROW_NUMBER() OVER(PARTITION BY SRP.SALES_REQUEST_MASTER_OBJID ORDER BY SRP.REGDATE DESC) SUB_RNUM,
SRP.OBJID,
SRP.SALES_BOM_QTY_OBJID,
SRP.PART_OBJID,
SRP.SALES_REQUEST_MASTER_OBJID,
SRP.QTY,
SRP.PARTNER_OBJID,
SRP.PARTNER_PRICE,
SRP.DELIVERY_REQUEST_DATE,
SRP.WRITER,
SRP.REGDATE,
SRP.STATUS,
SRP.REMARK,
PM.PART_NAME||'('||PM.MATERIAL||','||PM.SPEC||')/'||PM.PART_NO AS TARGET_TITLE,
PM.UNIT_TITLE
FROM
SALES_REQUEST_MASTER SRM
INNER JOIN SALES_REQUEST_PART SRP
ON SRM.OBJID = SRP.SALES_REQUEST_MASTER_OBJID
LEFT OUTER JOIN <include refid="partMng.partMngBase"/> PM
ON SRP.PART_OBJID = PM.OBJID::TEXT
WHERE 1=1
) SRP ON SRP.SALES_REQUEST_MASTER_OBJID::VARCHAR = SRM.OBJID::VARCHAR
AND SRP.SUB_RNUM = 1
WHERE 1=1
) AA
WHERE 1=1
<if test="SEARCH_CATEGORY_CD != null and !''.equals(SEARCH_CATEGORY_CD)">
AND CATEGORY_CD = #{SEARCH_CATEGORY_CD}
</if>
<if test="SEARCH_PRODUCT_GROUP != null and !''.equals(SEARCH_PRODUCT_GROUP)">
AND PRODUCT_GROUP = #{SEARCH_PRODUCT_GROUP}
</if>
<if test="SEARCH_PRODUCT != null and !''.equals(SEARCH_PRODUCT)">
AND PRODUCT = #{SEARCH_PRODUCT}
</if>
<if test="SEARCH_PRODUCT_CODE != null and !''.equals(SEARCH_PRODUCT_CODE)">
AND PRODUCT_CODE = #{SEARCH_PRODUCT_CODE}
</if>
<if test="SEARCH_PART_NO != null and !''.equals(SEARCH_PART_NO)">
AND OBJID IN (
SELECT
SRP.SALES_REQUEST_MASTER_OBJID
FROM
SALES_REQUEST_PART SRP
LEFT OUTER JOIN PART_MNG PM
ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
WHERE PART_NO LIKE'%${SEARCH_PART_NO}%'
)
</if>
<if test="SEARCH_PART_NAME != null and !''.equals(SEARCH_PART_NAME)">
AND OBJID IN (
SELECT
SRP.SALES_REQUEST_MASTER_OBJID
FROM
SALES_REQUEST_PART SRP
LEFT OUTER JOIN PART_MNG PM
ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
WHERE PART_NAME LIKE'%${SEARCH_PART_NAME}%'
)
</if>
<if test="SEARCH_STATUS != null and !''.equals(SEARCH_STATUS)">
<![CDATA[ AND 0 < POSITION(STATUS || ',' IN #{SEARCH_STATUS}||',') ]]>
</if>
</select>
<select id="getSalesRequestMasterGridList" parameterType="map" resultType="map">
SELECT
SRM.OBJID,
SRM.REQUEST_MNG_NO,
SRM.REQUEST_CD,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.REQUEST_CD) AS REQUEST_CD_NAME,
-- 문서유형 (PURCHASE_REQUEST: 구매요청서, PROPOSAL: 품의서)
SRM.DOC_TYPE,
-- 구매요청서 작성 여부
-- M-BOM 기반이면 MBOM_HEADER_OBJID가 있으므로 'Y'
-- 수동 작성이면 SALES_REQUEST_PART에 데이터가 있으면 'Y'
CASE
WHEN SRM.MBOM_HEADER_OBJID IS NOT NULL AND SRM.MBOM_HEADER_OBJID::VARCHAR != '' THEN 'Y'
WHEN (SELECT COUNT(*) FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID AND (DOC_TYPE = 'PURCHASE_REQUEST' OR DOC_TYPE IS NULL)) > 0 THEN 'Y'
ELSE 'N'
END AS HAS_PURCHASE_REQUEST,
-- 견적요청서 존재 여부 (QUOTATION_REQUEST_MASTER에 데이터가 있으면 'Y')
COALESCE((SELECT CASE WHEN COUNT(*) > 0 THEN 'Y' ELSE 'N' END
FROM QUOTATION_REQUEST_MASTER
WHERE SALES_REQUEST_MASTER_OBJID::VARCHAR = SRM.OBJID::VARCHAR), 'N') AS HAS_QUOTATION_REQUEST,
-- 견적요청서 개수
COALESCE((SELECT COUNT(*)
FROM QUOTATION_REQUEST_MASTER
WHERE SALES_REQUEST_MASTER_OBJID::VARCHAR = SRM.OBJID::VARCHAR), 0) AS QUOTATION_REQUEST_COUNT,
-- M-BOM 관련 컬럼
SRM.MBOM_HEADER_OBJID,
-- 추가된 컬럼들
SRM.PURCHASE_TYPE,
CODE_NAME(SRM.PURCHASE_TYPE) AS PURCHASE_TYPE_NAME,
-- 주문유형: 프로젝트 정보(CATEGORY_CD) 우선, 없으면 SALES_REQUEST_MASTER 값
COALESCE(
(SELECT PM.CATEGORY_CD FROM PROJECT_MGMT PM WHERE PM.OBJID::VARCHAR = SRM.PROJECT_NO),
SRM.ORDER_TYPE
) AS ORDER_TYPE,
CODE_NAME(COALESCE(
(SELECT PM.CATEGORY_CD FROM PROJECT_MGMT PM WHERE PM.OBJID::VARCHAR = SRM.PROJECT_NO),
SRM.ORDER_TYPE
)) AS ORDER_TYPE_NAME,
-- 제품구분: 프로젝트 정보 우선, 없으면 SALES_REQUEST_MASTER 값
COALESCE(
(SELECT CC.CODE_NAME
FROM PROJECT_MGMT PM
LEFT JOIN CONTRACT_MGMT CM ON CM.OBJID = PM.CONTRACT_OBJID
LEFT JOIN COMM_CODE CC ON CC.CODE_ID = CM.PRODUCT
WHERE PM.OBJID::VARCHAR = SRM.PROJECT_NO),
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = SRM.PRODUCT_NAME)
) AS PRODUCT_NAME_FULL,
SRM.AREA_CD,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.AREA_CD) AS AREA_CD_NAME,
-- 고객사: 프로젝트 정보 우선, 없으면 SALES_REQUEST_MASTER 값 (일반거래처 지원)
COALESCE(
(SELECT
CASE
WHEN CM.CUSTOMER_OBJID LIKE 'C_%' THEN (SELECT CLIENT_NM FROM CLIENT_MNG WHERE 'C_' || OBJID::VARCHAR = CM.CUSTOMER_OBJID)
ELSE SM.SUPPLY_NAME
END
FROM PROJECT_MGMT PM
LEFT JOIN CONTRACT_MGMT CM ON CM.OBJID = PM.CONTRACT_OBJID
LEFT JOIN SUPPLY_MNG SM ON SM.OBJID::VARCHAR = CM.CUSTOMER_OBJID::VARCHAR
WHERE PM.OBJID::VARCHAR = SRM.PROJECT_NO),
(SELECT
CASE
WHEN SRM.CUSTOMER_OBJID LIKE 'C_%' THEN (SELECT CLIENT_NM FROM CLIENT_MNG WHERE 'C_' || OBJID::VARCHAR = SRM.CUSTOMER_OBJID)
ELSE (SELECT SUPPLY_NAME FROM SUPPLY_MNG WHERE OBJID::VARCHAR = SRM.CUSTOMER_OBJID)
END
)
) AS CUSTOMER_NAME,
-- 유/무상: 프로젝트 정보 우선, 없으면 SALES_REQUEST_MASTER 값
COALESCE(
(SELECT CASE
WHEN CM.PAID_TYPE = 'paid' THEN '유상'
WHEN CM.PAID_TYPE = 'free' THEN '무상'
ELSE CM.PAID_TYPE
END
FROM PROJECT_MGMT PM
LEFT JOIN CONTRACT_MGMT CM ON CM.OBJID = PM.CONTRACT_OBJID
WHERE PM.OBJID::VARCHAR = SRM.PROJECT_NO),
(CASE WHEN SRM.PAID_TYPE = 'paid' THEN '유상' WHEN SRM.PAID_TYPE = 'free' THEN '무상' ELSE SRM.PAID_TYPE END)
) AS PAID_TYPE_NAME,
-- 품번/품명 ("외 N건" 형태로 표시)
-- M-BOM이 있으면 MBOM_DETAIL에서, 없으면 SALES_REQUEST_PART에서 조회
CASE
WHEN SRM.MBOM_HEADER_OBJID IS NOT NULL AND SRM.MBOM_HEADER_OBJID != '' THEN
(SELECT
CASE
WHEN COUNT(*) > 1 THEN
(SELECT PM.PART_NO FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM MBOM_DETAIL WHERE MBOM_HEADER_OBJID = SRM.MBOM_HEADER_OBJID ORDER BY REGDATE LIMIT 1)) || ' 외 ' || (COUNT(*) - 1) || '건'
WHEN COUNT(*) = 1 THEN
(SELECT PM.PART_NO FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM MBOM_DETAIL WHERE MBOM_HEADER_OBJID = SRM.MBOM_HEADER_OBJID ORDER BY REGDATE LIMIT 1))
ELSE NULL
END
FROM MBOM_DETAIL WHERE MBOM_HEADER_OBJID = SRM.MBOM_HEADER_OBJID)
ELSE
(SELECT
CASE
WHEN COUNT(*) > 1 THEN
(SELECT PM.PART_NO FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1)) || ' 외 ' || (COUNT(*) - 1) || '건'
WHEN COUNT(*) = 1 THEN
(SELECT PM.PART_NO FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1))
ELSE NULL
END
FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID)
END AS PART_NO,
CASE
WHEN SRM.MBOM_HEADER_OBJID IS NOT NULL AND SRM.MBOM_HEADER_OBJID != '' THEN
(SELECT
CASE
WHEN COUNT(*) > 1 THEN
(SELECT PM.PART_NAME FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM MBOM_DETAIL WHERE MBOM_HEADER_OBJID = SRM.MBOM_HEADER_OBJID ORDER BY REGDATE LIMIT 1)) || ' 외 ' || (COUNT(*) - 1) || '건'
WHEN COUNT(*) = 1 THEN
(SELECT PM.PART_NAME FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM MBOM_DETAIL WHERE MBOM_HEADER_OBJID = SRM.MBOM_HEADER_OBJID ORDER BY REGDATE LIMIT 1))
ELSE NULL
END
FROM MBOM_DETAIL WHERE MBOM_HEADER_OBJID = SRM.MBOM_HEADER_OBJID)
ELSE
(SELECT
CASE
WHEN COUNT(*) > 1 THEN
(SELECT PM.PART_NAME FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1)) || ' 외 ' || (COUNT(*) - 1) || '건'
WHEN COUNT(*) = 1 THEN
(SELECT PM.PART_NAME FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1))
ELSE NULL
END
FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID)
END AS PART_NAME,
SRM.PROJECT_NO,
(SELECT PROJECT_NO FROM PROJECT_MGMT PM WHERE PM.OBJID = SRM.PROJECT_NO) AS PROJECT_NUMBER,
(SELECT PROJECT_NAME FROM PROJECT_MGMT PM WHERE PM.OBJID = SRM.PROJECT_NO) AS PROJECT_NAME,
SRM.RELEASE_DATE,
SRM.REQUEST_REASONS,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.REQUEST_REASONS) AS REQUEST_REASONS_NAME,
COALESCE(SRM.REQUEST_USER_ID, SRM.WRITER) AS REQUEST_USER_ID,
(SELECT DEPT_NAME||' '||USER_NAME FROM USER_INFO WHERE USER_ID = COALESCE(SRM.REQUEST_USER_ID, SRM.WRITER)) AS REQUEST_USER_NAME,
SRM.DELIVERY_REQUEST_DATE,
SRM.UNIT_NAME,
(SELECT O.UNIT_NO || '-' || O.TASK_NAME FROM PMS_WBS_TASK AS O WHERE O.OBJID = SRM.UNIT_NAME) AS UNIT_CODE_NAME,
SRM.STATUS,
CASE
-- PURCHASE_REG(구매요청서작성) 페이지용 상태
WHEN SRM.DOC_TYPE = 'PURCHASE_REG' THEN
CASE
-- 품의서 생성 여부 확인 (PROPOSAL 타입의 SALES_REQUEST_MASTER가 연결되어 있는지)
WHEN EXISTS (SELECT 1 FROM SALES_REQUEST_MASTER P WHERE P.DOC_TYPE = 'PROPOSAL' AND P.PROJECT_NO = SRM.OBJID::VARCHAR) THEN '품의서생성'
WHEN SRM.STATUS = 'confirmed' THEN '확정'
ELSE '작성중'
END
-- 기존 PURCHASE_REQUEST용 상태
WHEN ((SELECT COUNT(1) FROM PURCHASE_ORDER_MASTER AS O WHERE O.SALES_REQUEST_OBJID IN (SRM.OBJID)) >= (SELECT COUNT(1) FROM SALES_REQUEST_PART AS SRP WHERE srp.SALES_REQUEST_master_OBJID = SRM.OBJID )) and ((SELECT COUNT(1) FROM PURCHASE_ORDER_MASTER AS O WHERE O.SALES_REQUEST_OBJID IN (SRM.OBJID)) > 0) THEN '발주완료'
WHEN ((SELECT COUNT(1) FROM PURCHASE_ORDER_MASTER AS O WHERE O.SALES_REQUEST_OBJID IN (SRM.OBJID)) &lt; (SELECT COUNT(1) FROM SALES_REQUEST_PART AS SRP WHERE srp.SALES_REQUEST_master_OBJID = SRM.OBJID )) and ((SELECT COUNT(1) FROM PURCHASE_ORDER_MASTER AS O WHERE O.SALES_REQUEST_OBJID IN (SRM.OBJID)) > 0) THEN '발주부분완료'
WHEN SRM.STATUS = 'create' THEN '등록'
WHEN SRM.STATUS = 'release' THEN '제출 완료'
WHEN SRM.STATUS = 'reception' THEN '접수'
WHEN SRM.STATUS = 'approvalRequest' THEN '결재중'
WHEN SRM.STATUS = 'approvalComplete' THEN '결재완료'
WHEN SRM.STATUS = 'reject' THEN '반려'
WHEN SRM.STATUS = 'confirmed' THEN '확정'
ELSE ''
END STATUS_TITLE,
SRM.RECEIPT_USER_ID,
(SELECT DEPT_NAME||' '||USER_NAME FROM USER_INFO WHERE USER_ID = SRM.RECEIPT_USER_ID) AS RECEIPT_USER_NAME,
RECEIPT_DATE,
SRM.WRITER,
(SELECT DEPT_NAME||' '||USER_NAME FROM USER_INFO WHERE USER_ID = SRM.WRITER) AS WRITER_NAME,
SRM.REGDATE,
TO_CHAR(SRM.REGDATE,'YYYY-MM-DD') AS REGDATE_TITLE,
A.APPR_STATUS,
A.ROUTE_OBJID,
A.APPROVAL_OBJID,
A.ROUTE_OBJID,
SRP.TOTAL_QTY,
SRP.ITEMS_QTY,
(SELECT STRING_AGG(PURCHASE_ORDER_NO,',') FROM PURCHASE_ORDER_MASTER AS O WHERE O.SALES_REQUEST_OBJID IN (SRM.OBJID)) AS PURCHASE_ORDER_NO_ARR
FROM
SALES_REQUEST_MASTER SRM
LEFT OUTER JOIN(
SELECT
B.OBJID AS ROUTE_OBJID,
CASE B.STATUS
WHEN 'inProcess' THEN '결재중'
WHEN 'complete' THEN '결재완료'
WHEN 'reject' THEN '반려'
ELSE ''
END APPR_STATUS,
A.OBJID AS APPROVAL_OBJID,
A.TARGET_OBJID,
B.ROUTE_SEQ
FROM
APPROVAL A,
(
select
T1.*
from
(
select
TARGET_OBJID,
max(T.ROUTE_SEQ) as ROUTE_SEQ
from
ROUTE T
group by
T.TARGET_OBJID
) T,
ROUTE T1
where
T.TARGET_OBJID = T1.TARGET_OBJID
and T.ROUTE_SEQ = T1.ROUTE_SEQ
) B
WHERE A.OBJID = B.APPROVAL_OBJID
AND TARGET_TYPE IN ('SALES_REQUEST')
) A ON SRM.OBJID::VARCHAR = A.TARGET_OBJID::VARCHAR
LEFT OUTER JOIN(
SELECT
SALES_REQUEST_MASTER_OBJID ,
SUM(COALESCE(QTY,'0')::NUMERIC) AS TOTAL_QTY,
count(1) AS ITEMS_QTY
FROM
SALES_REQUEST_PART
GROUP BY SALES_REQUEST_MASTER_OBJID
) SRP ON SRP.SALES_REQUEST_MASTER_OBJID = SRM.OBJID
<!-- LEFT OUTER JOIN(
SELECT
ROW_NUMBER() OVER(PARTITION BY SRP.SALES_REQUEST_MASTER_OBJID ORDER BY SRP.REGDATE DESC) SUB_RNUM,
SRP.OBJID,
SRP.SALES_BOM_QTY_OBJID,
SRP.PART_OBJID,
SRP.SALES_REQUEST_MASTER_OBJID,
SRP.QTY,
SRP.PARTNER_OBJID,
SRP.PARTNER_PRICE,
SRP.DELIVERY_REQUEST_DATE,
SRP.WRITER,
SRP.REGDATE,
SRP.STATUS,
SRP.REMARK,
PM.PART_NAME||'('||PM.MATERIAL||','||PM.SPEC||')/'||PM.PART_NO AS TARGET_TITLE,
PM.UNIT_TITLE
FROM
SALES_REQUEST_MASTER SRM
INNER JOIN SALES_REQUEST_PART SRP
ON SRM.OBJID = SRP.SALES_REQUEST_MASTER_OBJID
LEFT OUTER JOIN <include refid="partMng.partMngBase"/> PM
ON SRP.PART_OBJID = PM.OBJID::TEXT
WHERE 1=1
) SRP ON SRP.SALES_REQUEST_MASTER_OBJID::VARCHAR = SRM.OBJID::VARCHAR
AND SRP.SUB_RNUM = 1 -->
WHERE 1=1
-- 구매요청서만 조회 (품의서 제외)
-- DOC_TYPE_FILTER가 있으면 해당 값으로 필터링, 없으면 기존 조건 적용
<choose>
<when test="DOC_TYPE_FILTER != null and !''.equals(DOC_TYPE_FILTER)">
AND SRM.DOC_TYPE = #{DOC_TYPE_FILTER}
</when>
<otherwise>
AND (SRM.DOC_TYPE = 'PURCHASE_REQUEST' OR SRM.DOC_TYPE IS NULL)
</otherwise>
</choose>
<if test="Year !=null and Year != '' ">
AND TO_CHAR(REGDATE,'YYYY') = #{Year}
</if>
<!-- <if test="contract_objid != null and !''.equals(contract_objid)">
AND SRM.PROJECT_NO = #{contract_objid}
</if> -->
<if test="project_nos != null and project_nos != ''">
AND SRM.PROJECT_NO IN
<foreach item="state" collection="project_nos.split(',')"
open="(" separator="," close=")">
#{state}
</foreach>
</if>
<if test="request_cd != null and !''.equals(request_cd)">
AND SRM.REQUEST_CD = #{request_cd}
</if>
<if test="request_reasons != null and !''.equals(request_reasons)">
AND SRM.REQUEST_REASONS = #{request_reasons}
</if>
<if test="receipt_writer != null and !''.equals(receipt_writer)">
AND SRM.RECEIPT_USER_ID = #{receipt_writer}
</if>
<if test="receipt_date_start != null and !''.equals(receipt_date_start)">
AND TO_DATE(RECEIPT_DATE,'YYYY-MM-DD') <![CDATA[ >= ]]> TO_DATE(#{receipt_date_start}, 'YYYY-MM-DD')
</if>
<if test="receipt_date_end != null and !''.equals(receipt_date_end)">
AND TO_DATE(RECEIPT_DATE,'YYYY-MM-DD') <![CDATA[ <= ]]> TO_DATE(#{receipt_date_end}, 'YYYY-MM-DD')
</if>
<if test="SEARCH_PART_NO != null and !''.equals(SEARCH_PART_NO)">
AND (
-- SALES_REQUEST_PART에서 검색
SRM.OBJID IN (
SELECT SRP.SALES_REQUEST_MASTER_OBJID
FROM SALES_REQUEST_PART SRP
LEFT OUTER JOIN PART_MNG PM ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
WHERE PM.PART_NO LIKE UPPER('%${SEARCH_PART_NO}%')
)
-- MBOM_DETAIL에서 검색 (M-BOM이 있는 경우)
OR SRM.MBOM_HEADER_OBJID IN (
SELECT MD.MBOM_HEADER_OBJID
FROM MBOM_DETAIL MD
LEFT OUTER JOIN PART_MNG PM ON MD.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
WHERE PM.PART_NO LIKE UPPER('%${SEARCH_PART_NO}%')
)
)
</if>
<if test="SEARCH_PART_NAME != null and !''.equals(SEARCH_PART_NAME)">
AND (
-- SALES_REQUEST_PART에서 검색
SRM.OBJID IN (
SELECT SRP.SALES_REQUEST_MASTER_OBJID
FROM SALES_REQUEST_PART SRP
LEFT OUTER JOIN PART_MNG PM ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
WHERE PM.PART_NAME LIKE UPPER('%${SEARCH_PART_NAME}%')
)
-- MBOM_DETAIL에서 검색 (M-BOM이 있는 경우)
OR SRM.MBOM_HEADER_OBJID IN (
SELECT MD.MBOM_HEADER_OBJID
FROM MBOM_DETAIL MD
LEFT OUTER JOIN PART_MNG PM ON MD.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
WHERE PM.PART_NAME LIKE UPPER('%${SEARCH_PART_NAME}%')
)
)
</if>
<if test="SEARCH_STATUS != null and !''.equals(SEARCH_STATUS)">
<![CDATA[ AND 0 < POSITION(STATUS || ',' IN #{SEARCH_STATUS}||',') ]]>
</if>
<if test="regdate_start != null and !''.equals(regdate_start)">
AND SRM.REGDATE::DATE <![CDATA[ >= ]]> #{regdate_start}::DATE
</if>
<if test="regdate_end != null and !''.equals(regdate_end)">
AND SRM.REGDATE::DATE <![CDATA[ <= ]]> #{regdate_end}::DATE
</if>
<!-- 공급업체 검색 -->
<if test="customer_cd != null and !''.equals(customer_cd)">
AND (
-- 프로젝트에서 고객사 조회
SRM.PROJECT_NO IN (
SELECT PM.OBJID::VARCHAR
FROM PROJECT_MGMT PM
LEFT JOIN CONTRACT_MGMT CM ON CM.OBJID = PM.CONTRACT_OBJID
WHERE CM.CUSTOMER_OBJID::VARCHAR = #{customer_cd}
)
-- 직접 저장된 고객사
OR SRM.CUSTOMER_OBJID = #{customer_cd}
)
</if>
<!-- 작성자 검색 -->
<if test="request_user != null and !''.equals(request_user)">
AND (SRM.REQUEST_USER_ID = #{request_user} OR SRM.WRITER = #{request_user})
</if>
<!-- 제품구분 검색 -->
<if test="part_type != null and !''.equals(part_type)">
AND (
-- 프로젝트에서 제품구분 조회
SRM.PROJECT_NO IN (
SELECT PM.OBJID::VARCHAR
FROM PROJECT_MGMT PM
LEFT JOIN CONTRACT_MGMT CM ON CM.OBJID = PM.CONTRACT_OBJID
WHERE CM.PRODUCT = #{part_type}
)
-- 직접 저장된 제품구분
OR SRM.PRODUCT_NAME = #{part_type}
)
</if>
<!-- 프로젝트번호 검색 (단일 선택) -->
<if test="project_no != null and !''.equals(project_no)">
AND SRM.PROJECT_NO = #{project_no}
</if>
<!-- 구매유형 검색 (멀티선택) -->
<if test="purchase_types != null and !''.equals(purchase_types)">
AND SRM.PURCHASE_TYPE IN
<foreach item="item" collection="purchase_types.split(',')" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<!-- 작성자 검색 (writer 파라미터) -->
<if test="writer != null and !''.equals(writer)">
AND (SRM.REQUEST_USER_ID = #{writer} OR SRM.WRITER = #{writer})
</if>
ORDER BY SRM.REGDATE desc
</select>
<select id="purchaseOrderAdminSupplyInfo" parameterType="map" resultType="map">
SELECT
PM.OBJID
,PM.CATEGORY_CD
,CODE_NAME(PM.CATEGORY_CD) AS CATEGORY_NAME
,PM.CUSTOMER_OBJID
,CASE WHEN PM.CUSTOMER_OBJID LIKE 'C_%' THEN (SELECT CLIENT_NM FROM CLIENT_MNG AS C WHERE 'C_' || C.OBJID::VARCHAR = PM.CUSTOMER_OBJID) ELSE (SELECT SUPPLY_NAME FROM SUPPLY_MNG AS O WHERE O.OBJID::VARCHAR = PM.CUSTOMER_OBJID::VARCHAR) END AS CUSTOMER_NAME
,PM.PRODUCT
,CODE_NAME(PM.PRODUCT) AS PRODUCT_NAME
,PM.STATUS_CD
,CODE_NAME(PM.STATUS_CD) AS STATUS_NAME
,PM.DUE_DATE
,PM.LOCATION
,PM.SETUP
,PM.FACILITY
,CODE_NAME(PM.FACILITY) AS FACILITY_NAME
,PM.FACILITY_QTY
,PM.FACILITY_TYPE
,PM.FACILITY_DEPTH
,PM.PRODUCTION_NO
,PM.BUS_CAL_CD
,CODE_NAME(PM.BUS_CAL_CD) AS BUS_CAL_NAME
,PM.CATEGORY1_CD
,CODE_NAME(PM.CATEGORY1_CD) AS CATEGORY1_NAME
,PM.CHG_USER_ID
,(SELECT USER_NAME FROM USER_INFO AS O WHERE O.USER_ID = PM.CHG_USER_ID ) AS CHG_USER_NAME
,PM.PLAN_DATE
,PM.COMPLETE_DATE
,PM.RESULT_CD
,CODE_NAME(PM.RESULT_CD) AS RESULT_NAME
,PM.PROJECT_NO
,PM.PM_USER_ID
,PM.CONTRACT_PRICE
,PM.CONTRACT_PRICE_CURRENCY
,PM.CONTRACT_CURRENCY
,CODE_NAME(PM.CONTRACT_CURRENCY) AS CONTRACT_CURRENCY_NAME
,TO_CHAR(PM.REGDATE,'YYYY-MM-DD') AS REG_DATE
,PM.WRITER
,(SELECT USER_NAME FROM USER_INFO AS O WHERE O.USER_ID = PM.WRITER ) AS WRITER_NAME
,PM.CONTRACT_NO
,PM.CUSTOMER_EQUIP_NAME
,PM.REQ_DEL_DATE
,PM.CONTRACT_DEL_DATE
,PM.CONTRACT_COMPANY
,CODE_NAME(PM.CONTRACT_COMPANY) AS CONTRACT_COMPANY_NAME
,PM.CONTRACT_DATE
,PM.PO_NO
,PM.MANUFACTURE_PLANT
,CODE_NAME(PM.MANUFACTURE_PLANT) AS MANUFACTURE_PLANT_NAME
,PM.CONTRACT_RESULT
,CODE_NAME(PM.CONTRACT_RESULT) AS CONTRACT_RESULT_NAME
,PM.AREA_CD
,CODE_NAME(PM.AREA_CD) AS AREA_NAME
,PM.PROJECT_NAME
,PM.MECHANICAL_TYPE
,PM.OVERHAUL_ORDER
,RM.RELEASE_DATE
,CM.PAID_TYPE
,CM.OBJID AS CONTRACT_OBJID
FROM
PROJECT_MGMT AS PM
LEFT OUTER JOIN
RELEASE_MGMT RM
ON PM.OBJID::VARCHAR = RM.PARENT_OBJID
AND PM.PRODUCT = RM.PRODUCT
LEFT OUTER JOIN
CONTRACT_MGMT CM
ON PM.CONTRACT_OBJID = CM.OBJID
WHERE 1=1
AND PM.OBJID = #{PROJECT_NO}
</select>
<!-- 전체 품목 조회 (M-BOM이 없을 때 사용) -->
<select id="getAllPartMngList" parameterType="map" resultType="map">
SELECT
PM.OBJID,
PM.PART_NO,
PM.PART_NAME,
PM.SPEC,
PM.MAKER,
PM.MATERIAL,
PM.UNIT,
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = PM.UNIT) AS UNIT_TITLE
FROM PART_MNG PM
WHERE 1=1
AND PM.IS_LAST = '1'
ORDER BY PM.PART_NO
LIMIT 500
</select>
<select id="SalesBomPartListByProjectUnit" parameterType="map" resultType="map">
<!-- M-BOM 데이터 조회: getMbomList와 동일한 조인 방식 사용 (BPQ.PART_NO = PM.PART_NO) -->
SELECT
BPQ.BOM_REPORT_OBJID
,BPQ.PART_NO AS PART_OBJID
,COALESCE(PM.PART_NO, BPQ.PART_NO, '') AS PART_NO
,COALESCE(PM.PART_NAME, '') AS PART_NAME
,COALESCE(PM.PART_NAME, '') AS PART_FULL_NAME
,COALESCE(PM.SPEC, '') AS SPEC
,BPQ.QTY AS ORDER_QTY
,COALESCE(PM.MAKER, '') AS MAKER
,'' AS REMARK
,'' AS UNIT
,NULL AS SUPPLY_OBJID
,NULL AS WRITER
FROM
PROJECT_MGMT AS PJT
INNER JOIN BOM_PART_QTY AS BPQ
ON PJT.BOM_REPORT_OBJID::VARCHAR = BPQ.BOM_REPORT_OBJID::VARCHAR
LEFT JOIN PART_MNG AS PM
ON BPQ.PART_NO = PM.PART_NO
WHERE 1=1
AND PJT.OBJID::VARCHAR = #{PROJECT_OBJID}
AND COALESCE(BPQ.STATUS, '') NOT IN ('deleting', 'deleted')
AND PJT.BOM_REPORT_OBJID IS NOT NULL
AND PJT.BOM_REPORT_OBJID != ''
ORDER BY BPQ.SEQ
</select>
<update id="mergeReceiptSalesRequestInfo" parameterType="map">
UPDATE
SALES_REQUEST_MASTER
SET
STATUS = #{STATUS}
,RECEIPT_DATE = #{RECEIPT_DATE}
,RECEIPT_USER_ID = #{RECEIPT_USER_ID}
WHERE OBJID = #{OBJID}
</update>
<update id="changeStatusSalesRequestMaster" parameterType="map">
UPDATE
SALES_REQUEST_MASTER
SET
STATUS = #{STATUS}
WHERE OBJID = #{OBJID}
</update>
<update id="releaseSalesRequestMaster" parameterType="map">
UPDATE
SALES_REQUEST_MASTER
SET
RELEASE_DATE = TO_CHAR(NOW(),'YYYY-MM-DD')
WHERE OBJID = #{OBJID}
</update>
<select id="getSalesPartnerInfoList" parameterType="map" resultType="map">
SELECT
A.*,
ROW_NUMBER() OVER(ORDER BY A.SEQ) AS RNUM
FROM(
SELECT
BPQ.PART_NO,
SBPQ.FIRST_PARTNER_OBJID AS PARTNER_OBJID,
SBPQ.FIRST_PARTNER_PRICE AS PARTNER_PRICE,
(SELECT SUPPLY_NAME FROM SUPPLY_MNG WHERE 1=1 AND OBJID::VARCHAR = SBPQ.FIRST_PARTNER_OBJID) AS PARTNER_NAME,
1 AS SEQ
FROM BOM_PART_QTY BPQ
LEFT OUTER JOIN SALES_BOM_PART_QTY SBPQ
ON BPQ.BOM_REPORT_OBJID::VARCHAR = SBPQ.BOM_REPORT_OBJID
AND BPQ.OBJID::VARCHAR = SBPQ.OBJID
AND SBPQ.FIRST_PARTNER_OBJID IS NOT NULL
AND SBPQ.FIRST_PARTNER_OBJID != ''
UNION ALL
SELECT
BPQ.PART_NO,
SBPQ.SECOND_PARTNER_OBJID AS PARTNER_OBJID,
SBPQ.SECOND_PARTNER_PRICE AS PARTNER_PRICE,
(SELECT SUPPLY_NAME FROM SUPPLY_MNG WHERE 1=1 AND OBJID::VARCHAR = SBPQ.SECOND_PARTNER_OBJID) AS PARTNER_NAME,
2 AS SEQ
FROM BOM_PART_QTY BPQ
LEFT OUTER JOIN SALES_BOM_PART_QTY SBPQ
ON BPQ.BOM_REPORT_OBJID::VARCHAR = SBPQ.BOM_REPORT_OBJID
AND BPQ.OBJID::VARCHAR = SBPQ.OBJID
AND SBPQ.SECOND_PARTNER_OBJID IS NOT NULL
AND SBPQ.SECOND_PARTNER_OBJID != ''
UNION ALL
SELECT
BPQ.PART_NO,
SBPQ.THIRD_PARTNER_OBJID AS PARTNER_OBJID,
SBPQ.THIRD_PARTNER_PRICE AS PARTNER_PRICE,
(SELECT SUPPLY_NAME FROM SUPPLY_MNG WHERE 1=1 AND OBJID::VARCHAR = SBPQ.THIRD_PARTNER_OBJID) AS PARTNER_NAME,
3 AS SEQ
FROM BOM_PART_QTY BPQ
LEFT OUTER JOIN SALES_BOM_PART_QTY SBPQ
ON BPQ.BOM_REPORT_OBJID::VARCHAR = SBPQ.BOM_REPORT_OBJID
AND BPQ.OBJID::VARCHAR = SBPQ.OBJID
AND SBPQ.THIRD_PARTNER_OBJID IS NOT NULL
AND SBPQ.THIRD_PARTNER_OBJID != ''
)A WHERE 1=1
AND PART_NO::VARCHAR = #{PART_OBJID}
</select>
<!-- 구매 BOM을 통한 구매 의뢰 시 저장된 Part 정보를 가져온다. -->
<select id="getSalesRequestPartPartnerList" parameterType="map" resultType="map">
SELECT
SRP.PARTNER_OBJID
FROM
SALES_REQUEST_MASTER SRM
INNER JOIN SALES_REQUEST_PART SRP
ON SRM.OBJID = SRP.SALES_REQUEST_MASTER_OBJID
LEFT OUTER JOIN <include refid="partMng.partMngBase"/> PM
ON SRP.PART_OBJID = PM.OBJID::TEXT
WHERE 1=1
AND SRM.OBJID = #{SALES_REQUEST_MASTER_OBJID}
GROUP BY SRP.PARTNER_OBJID
</select>
<!-- 파트에 연결된 발주관리 정보를 가져온다. -->
<select id="getOrderSpecMngList" parameterType="map" resultType="map">
SELECT
OBJID,
SEQ,
PART_OBJID,
(SELECT SUPPLY_NAME FROM ADMIN_SUPPLY_MNG WHERE OBJID::VARCHAR = PARTNER_OBJID::VARCHAR) AS PARTNER_NAME,
PARTNER_RANK,
PARTNER_OBJID,
PARTNER_PRICE,
PARTNER_QTY,
APPLY_DATE,
REMARK,
REGDATE,
TO_CHAR(REGDATE,'YYYY-MM-DD') AS REGDATE_TITLE,
IS_LAST,
WRITER,
(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = OSM.WRITER) AS WRITER_NAME
FROM
ORDER_SPEC_MNG OSM
WHERE 1=1
AND PART_OBJID = #{PART_OBJID}
ORDER BY
SEQ NULLS LAST,
APPLY_DATE DESC
</select>
<!-- 파트에 연결된 발주관리 정보를 가져온다. -->
<select id="getOrderSpecMngMap" parameterType="map" resultType="map">
SELECT
OBJID,
SEQ,
PART_OBJID,
PARTNER_RANK,
PARTNER_OBJID,
PARTNER_PRICE,
PARTNER_QTY,
APPLY_DATE,
REMARK,
REGDATE,
IS_LAST,
WRITER
FROM
ORDER_SPEC_MNG
WHERE 1=1
<if test="OBJID != null and !''.equals(OBJID)">
AND OBJID = #{OBJID}
</if>
<if test="PART_OBJID != null and !''.equals(PART_OBJID)">
AND PART_OBJID = #{PART_OBJID}
</if>
<if test="PARTNER_OBJID != null and !''.equals(PARTNER_OBJID)">
AND PARTNER_OBJID = #{PARTNER_OBJID}
</if>
</select>
<update id="mergeOrderSpecMng" parameterType="map">
INSERT INTO ORDER_SPEC_MNG
(
OBJID,
SEQ,
PART_OBJID,
PARTNER_RANK,
PARTNER_OBJID,
PARTNER_PRICE,
PARTNER_QTY,
APPLY_DATE,
REMARK,
REGDATE,
IS_LAST,
WRITER
)
VALUES
(
#{OBJID},
#{SEQ},
#{PART_OBJID},
#{PARTNER_RANK},
#{PARTNER_OBJID},
#{PARTNER_PRICE},
#{PARTNER_QTY},
#{APPLY_DATE},
#{REMARK},
NOW(),
#{IS_LAST},
#{WRITER}
) ON CONFLICT (OBJID) DO
UPDATE
SET
SEQ = #{SEQ},
PART_OBJID = #{PART_OBJID},
PARTNER_RANK = #{PARTNER_RANK},
PARTNER_OBJID = #{PARTNER_OBJID},
PARTNER_PRICE = #{PARTNER_PRICE},
PARTNER_QTY = #{PARTNER_QTY},
APPLY_DATE = #{APPLY_DATE},
REMARK = #{REMARK},
REGDATE = NOW(),
IS_LAST = #{IS_LAST},
WRITER = #{WRITER}
</update>
<delete id="deleteOrderSpecMng" parameterType="map">
DELETE FROM ORDER_SPEC_MNG WHERE 1=1 <![CDATA[ AND 0 < POSITION(OBJID::TEXT || ',' IN #{checkArr}||',') ]]>
</delete>
<update id="insertOrderSpecMngHistory" parameterType="map">
INSERT INTO ORDER_SPEC_MNG_HISTORY
SELECT
*
FROM ORDER_SPEC_MNG WHERE OBJID = #{OBJID}
</update>
<select id="getOrderSpecMngHistoryList" parameterType="map" resultType="map">
SELECT
OBJID,
SEQ,
PART_OBJID,
(SELECT SUPPLY_NAME FROM ADMIN_SUPPLY_MNG WHERE OBJID::VARCHAR = PARTNER_OBJID::VARCHAR) AS PARTNER_NAME,
PARTNER_RANK,
PARTNER_OBJID,
PARTNER_PRICE,
PARTNER_QTY,
APPLY_DATE,
REMARK,
REGDATE,
IS_LAST,
WRITER
FROM
ORDER_SPEC_MNG_HISTORY
WHERE 1=1
AND OBJID = #{OBJID}
ORDER BY REGDATE DESC
</select>
<select id="getSalesBOMList" parameterType="map" resultType="map">
WITH RECURSIVE VIEW_BOM(
PRODUCT_MGMT_OBJID,
SPEC_NAME,
BOM_REPORT_OBJID,
OBJID,
PARENT_OBJID,
CHILD_OBJID,
PARENT_PART_NO,
PART_NO,
QTY,
REGDATE,
SEQ,
LEV,
PATH,
CYCLE
) AS (
SELECT
PBM.PRODUCT_MGMT_OBJID,
PBM.SPEC_NAME,
A.BOM_REPORT_OBJID,
A.OBJID,
A.PARENT_OBJID,
A.CHILD_OBJID,
A.PARENT_PART_NO,
A.PART_NO,
A.QTY,
A.REGDATE,
A.SEQ,
1,
ARRAY [A.CHILD_OBJID::TEXT],
FALSE
FROM
BOM_PART_QTY A
LEFT JOIN
PART_BOM_REPORT PBM
ON A.BOM_REPORT_OBJID = PBM.OBJID::TEXT
WHERE 1=1
AND (A.PARENT_OBJID IS NULL OR A.PARENT_OBJID = '')
AND A.BOM_REPORT_OBJID = #{bom_report_objid}
UNION ALL
SELECT
PBM.PRODUCT_MGMT_OBJID,
PBM.SPEC_NAME,
B.BOM_REPORT_OBJID,
B.OBJID,
B.PARENT_OBJID,
B.CHILD_OBJID,
B.PARENT_PART_NO,
B.PART_NO,
B.QTY,
B.REGDATE,
B.SEQ,
LEV + 1,
PATH||B.CHILD_OBJID::TEXT,
B.PARENT_OBJID = ANY(PATH)
FROM
BOM_PART_QTY B
LEFT JOIN
PART_BOM_REPORT PBM
ON B.BOM_REPORT_OBJID = PBM.OBJID::TEXT
INNER JOIN
VIEW_BOM
ON B.PARENT_OBJID = VIEW_BOM.CHILD_OBJID
AND VIEW_BOM.BOM_REPORT_OBJID = B.BOM_REPORT_OBJID
)
SELECT
V.PARENT_PART_NO
,V.QTY
,V.QTY AS ORG_QTY
,V.LEV
,V.SEQ
,P.OBJID AS PART_OBJID
,P.PART_NO
,P.PART_NAME
,P.UNIT_TITLE
,P.QTY
,P.MATERIAL
,P.WEIGHT
,P.PART_TYPE_TITLE
,P.REVISION
,P.EO_NO
,P.EO_DATE
,P.SPEC
,P.PART_REGDATE_TITLE
,(SELECT PRODUCT_CODE FROM PRODUCT_MGMT AS O WHERE O.OBJID::VARCHAR = V.PRODUCT_MGMT_OBJID::VARCHAR) AS PRODUCT_CODE
,V.SPEC_NAME
,SBPQ.PRODUCT_TYPE_CODE
,SBPQ.PARTNER_OBJID
,SBPQ.PARTNER_PRICE
,SBPQ.PARTNER_REMARK AS REMARK
,P.PART_NAME||'('||P.MATERIAL||','||P.SPEC||')/'||P.PART_NO AS TARGET_TITLE
FROM
VIEW_BOM V
LEFT OUTER JOIN <include refid="partMng.partMngBase"/> P
ON V.PART_NO = P.OBJID::TEXT
LEFT OUTER JOIN SALES_BOM_PART_QTY SBPQ
ON V.BOM_REPORT_OBJID::VARCHAR = SBPQ.BOM_REPORT_OBJID
AND V.OBJID::VARCHAR = SBPQ.OBJID
ORDER BY V.PATH,V.REGDATE
</select>
<delete id="deleteSalesRequestMaster" parameterType="map">
DELETE FROM SALES_REQUEST_MASTER WHERE OBJID = #{SALES_REQUEST_MASTER_OBJID}
</delete>
<delete id="deleteSalesRequestPart" parameterType="map">
DELETE FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = #{SALES_REQUEST_MASTER_OBJID}
</delete>
<!-- 발주특성 중 검색조건에 해당하는 대상의 목록을 가져온다. -->
<select id="getOrderSpecMngTargetList" parameterType="map" resultType="map">
SELECT
OBJID,
SEQ,
PART_OBJID,
(SELECT SUPPLY_NAME FROM ADMIN_SUPPLY_MNG WHERE OBJID::VARCHAR = PARTNER_OBJID::VARCHAR) AS PARTNER_NAME,
PARTNER_RANK,
PARTNER_OBJID,
PARTNER_PRICE,
PARTNER_QTY,
APPLY_DATE,
REMARK,
REGDATE,
TO_CHAR(REGDATE,'YYYY-MM-DD') AS REGDATE_TITLE,
IS_LAST,
WRITER,
(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = OSM.WRITER) AS WRITER_NAME
FROM
ORDER_SPEC_MNG OSM
WHERE 1=1
<if test="OBJID != null and !''.equals(OBJID)">
AND OSM.OBJID = #{OBJID}
</if>
<if test="NOT_EXIST_OBJID != null and !''.equals(NOT_EXIST_OBJID)">
AND OSM.OBJID != #{NOT_EXIST_OBJID}
</if>
<if test="PART_OBJID != null and !''.equals(PART_OBJID)">
AND OSM.PART_OBJID = #{PART_OBJID}
</if>
<if test="PARTNER_OBJID != null and !''.equals(PARTNER_OBJID)">
AND OSM.PARTNER_OBJID = #{PARTNER_OBJID}
</if>
<!-- 파라미터 seq보다 숫자가 큰 -->
<if test="HIGHER_THEN_SEQ != null and !''.equals(HIGHER_THEN_SEQ)">
AND OSM.SEQ::NUMERIC >= #{HIGHER_THEN_SEQ}::NUMERIC
</if>
<!-- 파라미터 seq보다 숫자가 작은 -->
<if test="LOWER_THEN_SEQ != null and !''.equals(LOWER_THEN_SEQ)">
AND OSM.SEQ::NUMERIC <![CDATA[ <= ]]> #{LOWER_THEN_SEQ}::NUMERIC
</if>
<if test="SEQ != null and !''.equals(SEQ)">
AND OSM.SEQ = #{SEQ}
</if>
ORDER BY SEQ NULLS LAST
</select>
<!-- 저장 시 순위를 정렬한다. -->
<update id="updateOrderSpecMngSeq" parameterType="map">
UPDATE
ORDER_SPEC_MNG
SET SEQ = #{SEQ}
WHERE OBJID = #{OBJID}
</update>
<!-- 발주특성 저장 시 파트에 소싱정보를 업데이트 한다. -->
<update id="updateOrderSpecMng" parameterType="map">
UPDATE
PART_MNG
SET SOURCING_CODE = #{SOURCING_CODE}
WHERE OBJID::VARCHAR = #{OBJID}::VARCHAR
</update>
<!-- 파트에 연결된 발주관리 정보를 가져온다. -->
<select id="getOrderSpecMngPartnerList" parameterType="map" resultType="map">
SELECT
OBJID,
SEQ,
PART_OBJID,
(SELECT SUPPLY_NAME FROM ADMIN_SUPPLY_MNG WHERE OBJID::VARCHAR = PARTNER_OBJID::VARCHAR) AS PARTNER_NAME,
PARTNER_RANK,
PARTNER_OBJID,
PARTNER_PRICE,
PARTNER_QTY,
APPLY_DATE,
REMARK,
REGDATE,
TO_CHAR(REGDATE,'YYYY-MM-DD') AS REGDATE_TITLE,
IS_LAST,
WRITER,
(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = OSM.WRITER) AS WRITER_NAME
FROM
ORDER_SPEC_MNG OSM
WHERE 1=1
AND PART_OBJID = #{PART_OBJID}
ORDER BY
SEQ NULLS LAST,
APPLY_DATE DESC
</select>
<!-- BOM 정보를 가져온다. -->
<select id="getBOMReportData" parameterType="map" resultType="map">
SELECT
*
FROM
PART_BOM_REPORT
WHERE 1=1
AND OBJID::VARCHAR = #{bom_report_objid}::VARCHAR
</select>
<select id="getParsingData" parameterType="map" resultType="map">
SELECT
*
FROM SALES_BOM_PART_QTY_TEMP
</select>
<select id="salesBomReportList" parameterType="map" resultType="map">
SELECT PBR.OBJID
<!-- 수주정보 -->
,TO_CHAR(CM.REGDATE, 'YYYY') AS CM_YEAR
,(SELECT SUPPLY_NAME FROM SUPPLY_MNG AS O WHERE O.OBJID::VARCHAR = PBR.CUSTOMER_OBJID) AS CUSTOMER_NAME
,CM.CUSTOMER_PROJECT_NAME
,CM.STATUS_CD
,(SELECT CODE_NAME FROM COMM_CODE AS O WHERE O.CODE_ID = CM.STATUS_CD) AS STATUS_NAME
,CM.CATEGORY_CD
,(SELECT CODE_NAME FROM COMM_CODE AS O WHERE O.CODE_ID = CM.CATEGORY_CD) AS CATEGORY_NAME
,CM.DUE_DATE
,CM.LOCATION
,CM.SETUP
,CM.FACILITY
,(SELECT CODE_NAME FROM COMM_CODE AS O WHERE O.CODE_ID = CM.FACILITY) AS FACILITY_NAME
,CODE_NAME(CM.MANUFACTURE_PLANT) AS MANUFACTURE_PLANT_NAME
,CM.FACILITY_QTY
,CM.FACILITY_TYPE
,CM.FACILITY_DEPTH
,CM.PRODUCTION_NO
,CM.PROJECT_NAME
,CM.PROJECT_NO
,CODE_NAME(CM.CONTRACT_COMPANY) AS CONTRACT_COMPANY_NAME
,CM.CONTRACT_DEL_DATE
,CM.PO_NO
,CM.CONTRACT_DATE
,CM.REQ_DEL_DATE
<!-- 프로젝트정보 ※계약납기, 수주회사, 수주일, PO계약NO 없음.. -->
,CM.PROJECT_NO
<!-- 구매BOM -->
,PBR.UNIT_CODE
<!-- ,(SELECT CODE_NAME FROM COMM_CODE AS O WHERE O.CODE_ID = PBR.UNIT_CODE) AS UNIT_NAME -->
,(SELECT O.UNIT_NO || '-' || O.TASK_NAME FROM PMS_WBS_TASK AS O WHERE O.OBJID = PBR.UNIT_CODE) AS UNIT_NAME
,(SELECT COUNT(*) FROM BOM_PART_QTY AS A WHERE A.BOM_REPORT_OBJID = PBR.OBJID) AS BOM_CNT
,PBR.DEPLOY_DATE
,PBR.WRITER AS WRITER1
,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = PBR.WRITER) AS WRITER1_NAME
<!-- 구매BOM SBR -->
,SBR.OBJID AS SBR_OBJID
,TO_CHAR(SBR.REGDATE, 'YYYY-MM-DD') AS REGDATE2
,SBR.WRITER AS WRITER2
,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = SBR.WRITER) AS WRITER2_NAME
,(SELECT COUNT(1) FROM SALES_BOM_REPORT_PART SBRP WHERE SBRP.PARENT_OBJID = PBR.OBJID) SALES_PART_CNT
FROM PART_BOM_REPORT PBR
LEFT OUTER JOIN SALES_BOM_REPORT SBR
ON PBR.OBJID = SBR.PARENT_OBJID
,PROJECT_MGMT CM
WHERE 1=1
AND PBR.CONTRACT_OBJID = CM.OBJID
<if test="Year !=null and Year != '' ">
AND TO_CHAR(CM.REGDATE, 'YYYY') = #{Year}
</if>
<if test="customer_cd !=null and customer_cd != '' ">
AND PBR.CUSTOMER_OBJID = #{customer_cd}
</if>
<if test="project_name != null and project_name != '' ">
AND CM.OBJID = #{project_name}
</if>
<if test="unit_code !=null and unit_code != '' ">
AND PBR.UNIT_CODE = #{unit_code}
</if>
<if test="writer2_id !=null and writer2_id != '' ">
AND SBR.WRITER = #{writer2_id}
</if>
<if test="SEARCH_UNIT_NAME != null and !''.equals(SEARCH_UNIT_NAME)">
AND (SELECT O.UNIT_NO || '-' || O.TASK_NAME FROM PMS_WBS_TASK AS O WHERE O.OBJID = PBR.UNIT_CODE) LIKE '%' || #{SEARCH_UNIT_NAME} || '%'
</if>
order by SUBSTRING(CM.PROJECT_NO,POSITION('-' IN CM.PROJECT_NO)+1) DESC
</select>
<select id="salesBomReportInfo" parameterType="map" resultType="map">
SELECT OBJID
,PARENT_OBJID
,SUPPLY_OBJID
,PRICE
,SUPPLY_OBJID1
,PRICE1
,SUPPLY_OBJID2
,PRICE2
,SUPPLY_OBJID3
,PRICE3
,SUPPLY_OBJID4
,PRICE4
,WRITER
FROM SALES_BOM_REPORT
WHERE OBJID = #{objId}
</select>
<select id="salesBomReportInfo2" parameterType="map" resultType="map">
SELECT OBJID
,PARENT_OBJID
,SUPPLY_OBJID
,PRICE
,SUPPLY_OBJID1
,PRICE1
,SUPPLY_OBJID2
,PRICE2
,SUPPLY_OBJID3
,PRICE3
,SUPPLY_OBJID4
,PRICE4
,WRITER
FROM SALES_BOM_REPORT
WHERE 1=1
<if test=" (SEARCH_OBJID == null or SEARCH_OBJID == '') and (SEARCH_PARENT_OBJID == null or SEARCH_PARENT_OBJID == '') ">
AND OBJID = '!@#$'
</if>
<if test="SEARCH_OBJID != null and SEARCH_OBJID != ''">
AND OBJID = #{SEARCH_OBJID}
</if>
<if test="SEARCH_PARENT_OBJID != null and SEARCH_PARENT_OBJID != ''">
AND PARENT_OBJID = #{SEARCH_PARENT_OBJID}
</if>
</select>
<update id="mergeSalesBomReportInfo" parameterType="map">
INSERT INTO SALES_BOM_REPORT (
OBJID
,PARENT_OBJID
,SUPPLY_OBJID
,PRICE
,SUPPLY_OBJID1
,PRICE1
,SUPPLY_OBJID2
,PRICE2
,SUPPLY_OBJID3
,PRICE3
,SUPPLY_OBJID4
,PRICE4
,WRITER
,REGDATE
) VALUES (
#{OBJID }
,#{PARENT_OBJID }
,#{SUPPLY_OBJID }
,#{PRICE }
,#{SUPPLY_OBJID1}
,#{PRICE1 }
,#{SUPPLY_OBJID2}
,#{PRICE2 }
,#{SUPPLY_OBJID3}
,#{PRICE3 }
,#{SUPPLY_OBJID4}
,#{PRICE4 }
,#{writer }
,NOW()
) ON CONFLICT (OBJID) DO
UPDATE SET
SUPPLY_OBJID = #{SUPPLY_OBJID }
,PRICE = #{PRICE }
,SUPPLY_OBJID1 = #{SUPPLY_OBJID1}
,PRICE1 = #{PRICE1 }
,SUPPLY_OBJID2 = #{SUPPLY_OBJID2}
,PRICE2 = #{PRICE2 }
,SUPPLY_OBJID3 = #{SUPPLY_OBJID3}
,PRICE3 = #{PRICE3 }
,SUPPLY_OBJID4 = #{SUPPLY_OBJID4}
,PRICE4 = #{PRICE4 }
,WRITER = #{writer }
,REGDATE = NOW()
</update>
<update id="mergeSalesBomReportInfo2" parameterType="map">
INSERT INTO SALES_BOM_REPORT (
OBJID
,PARENT_OBJID
,SUPPLY_OBJID
,PRICE
,SUPPLY_OBJID1
,PRICE1
,SUPPLY_OBJID2
,PRICE2
,SUPPLY_OBJID3
,PRICE3
,SUPPLY_OBJID4
,PRICE4
,WRITER
,REGDATE
) VALUES (
#{OBJID }
,#{PARENT_OBJID }
,#{SUPPLY_OBJID }
,#{PRICE }
,#{SUPPLY_OBJID1}
,#{PRICE1 }
,#{SUPPLY_OBJID2}
,#{PRICE2 }
,#{SUPPLY_OBJID3}
,#{PRICE3 }
,#{SUPPLY_OBJID4}
,#{PRICE4 }
,#{writer }
,NOW()
) ON CONFLICT (PARENT_OBJID) DO
UPDATE SET
SUPPLY_OBJID = #{SUPPLY_OBJID }
,PRICE = #{PRICE }
,SUPPLY_OBJID1 = #{SUPPLY_OBJID1}
,PRICE1 = #{PRICE1 }
,SUPPLY_OBJID2 = #{SUPPLY_OBJID2}
,PRICE2 = #{PRICE2 }
,SUPPLY_OBJID3 = #{SUPPLY_OBJID3}
,PRICE3 = #{PRICE3 }
,SUPPLY_OBJID4 = #{SUPPLY_OBJID4}
,PRICE4 = #{PRICE4 }
,MODIFIER = #{writer }
,UPDATE_DATE = NOW()
</update>
<select id="salesBomReportPartList" parameterType="map" resultType="map">
WITH RECURSIVE VIEW_BOM(
BOM_REPORT_OBJID,
OBJID,
PARENT_OBJID,
CHILD_OBJID,
PARENT_PART_NO,
PART_NO,
LAST_PART_OBJID,
QTY,
REGDATE,
SEQ,
LEV,
PATH,
PATH2,
CYCLE
) AS (
SELECT
A.BOM_REPORT_OBJID,
A.OBJID,
A.PARENT_OBJID,
A.CHILD_OBJID,
A.PARENT_PART_NO,
A.PART_NO,
A.LAST_PART_OBJID,
A.QTY,
A.REGDATE,
A.SEQ,
1,
ARRAY [A.CHILD_OBJID::TEXT],
ARRAY [A.SEQ::TEXT],
FALSE
FROM
BOM_PART_QTY A
WHERE 1=1
AND (A.PARENT_OBJID IS NULL OR A.PARENT_OBJID = '')
AND A.BOM_REPORT_OBJID = #{parent_objId}
<choose>
<when test="search_type != null and !''.equals(search_type) and 'working'.equals(search_type)">
<!--
AND (BQP.STATUS IS NULL OR BQP.STATUS = '')
-->
</when>
<otherwise>
AND STATUS IN ('beforeEdit', 'editing','deleting', 'deploy')
</otherwise>
</choose>
UNION ALL
SELECT
B.BOM_REPORT_OBJID,
B.OBJID,
B.PARENT_OBJID,
B.CHILD_OBJID,
B.PARENT_PART_NO,
B.PART_NO,
B.LAST_PART_OBJID,
B.QTY,
B.REGDATE,
B.SEQ,
LEV + 1,
PATH||B.CHILD_OBJID::TEXT,
PATH2||B.SEQ::TEXT,
B.PARENT_OBJID = ANY(PATH)
FROM
BOM_PART_QTY B
JOIN
VIEW_BOM
ON B.PARENT_OBJID = VIEW_BOM.CHILD_OBJID
AND VIEW_BOM.BOM_REPORT_OBJID = B.BOM_REPORT_OBJID
<choose>
<when test="search_type != null and !''.equals(search_type) and 'working'.equals(search_type)">
<!--
AND (BQP.STATUS IS NULL OR BQP.STATUS = '')
-->
</when>
<otherwise>
AND B.STATUS IN ('beforeEdit', 'editing','deleting', 'deploy')
</otherwise>
</choose>
)
SELECT
V.BOM_REPORT_OBJID AS PARENT_OBJID
,V.PART_NO AS PART_OBJID
,V.CHILD_OBJID
,V.PARENT_PART_NO
,PM.OBJID OBJID_PART
,PM.PART_NO
,PM.PART_NAME
,V.LEV
,V.QTY
,(SELECT MAX(LEV) FROM VIEW_BOM) AS MAX_LEV
,SP.OBJID
,V.LAST_PART_OBJID
,NVL(V.LAST_PART_OBJID, V.PART_NO) LAST_PART_OBJID2
,SP.PRICE
,SP.SUPPLY_OBJID
,(SELECT ASM.SUPPLY_NAME FROM ADMIN_SUPPLY_MNG ASM WHERE 1=1 AND ASM.OBJID::VARCHAR = SP.SUPPLY_OBJID::VARCHAR) AS SUPPLY_NAME
,SP.PRICE1
,SP.SUPPLY_OBJID1
,(SELECT ASM.SUPPLY_NAME FROM ADMIN_SUPPLY_MNG ASM WHERE 1=1 AND ASM.OBJID::VARCHAR = SP.SUPPLY_OBJID1::VARCHAR) AS SUPPLY_NAME1
,SP.PRICE2
,SP.SUPPLY_OBJID2
,(SELECT ASM.SUPPLY_NAME FROM ADMIN_SUPPLY_MNG ASM WHERE 1=1 AND ASM.OBJID::VARCHAR = SP.SUPPLY_OBJID2::VARCHAR) AS SUPPLY_NAME2
,SP.PRICE3
,SP.SUPPLY_OBJID3
,(SELECT ASM.SUPPLY_NAME FROM ADMIN_SUPPLY_MNG ASM WHERE 1=1 AND ASM.OBJID::VARCHAR = SP.SUPPLY_OBJID3::VARCHAR) AS SUPPLY_NAME3
,SP.PRICE4
,SP.SUPPLY_OBJID4
,(SELECT ASM.SUPPLY_NAME FROM ADMIN_SUPPLY_MNG ASM WHERE 1=1 AND ASM.OBJID::VARCHAR = SP.SUPPLY_OBJID4::VARCHAR) AS SUPPLY_NAME4
,SP.PRICE_SUM
,SP.PRE_BOOKING_QTY
,PM.SPEC
,PM.POST_PROCESSING
,PM.MAKER
,PM.REMARK
,PM.REVISION
,PM.EO_NO
,(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = PM.PART_TYPE) AS PART_TYPE_NAME
,(COALESCE((SELECT SUM(CASE WHEN (RECEIPT_QTY IS NULL OR RECEIPT_QTY ='')
THEN 0
ELSE RECEIPT_QTY::NUMERIC END)
FROM INVENTORY_MGMT AS IM
INNER JOIN INVENTORY_MGMT_IN AS O
ON O.PARENT_OBJID = IM.OBJID
WHERE IM.PART_OBJID = PM.OBJID
),0) - COALESCE((SELECT SUM(CASE WHEN (REQUEST_QTY IS NULL OR REQUEST_QTY ='')
THEN 0
ELSE REQUEST_QTY::NUMERIC END)
FROM INVENTORY_MGMT AS IM
INNER JOIN INVENTORY_MGMT_OUT AS O
ON O.PARENT_OBJID = IM.OBJID
WHERE IM.PART_OBJID = PM.OBJID
),0)) AS STOCK_QTY
,(SELECT SUM(NVL(SBP.PRE_BOOKING_QTY, '0')::NUMERIC) FROM SALES_BOM_REPORT_PART SBP where SBP.PART_OBJID = PM.OBJID GROUP BY PART_OBJID) AS TOTAL_PRE_BOOKING_QTY
FROM VIEW_BOM V
<!--
(SELECT *
,( SELECT OBJID
FROM PART_MNG PM1
WHERE IS_LAST = '1'
AND PART_NO = (
( SELECT PM2.PART_NO
FROM PART_MNG PM2
WHERE PM2.OBJID = V.PART_NO)
)
) LAST_PART_OBJID
FROM VIEW_BOM V
) AS V
-->
LEFT OUTER JOIN SALES_BOM_REPORT_PART AS SP
ON SP.PARENT_OBJID = #{parent_objId}
AND BOM_PART_QTY_OBJID = V.CHILD_OBJID
<!-- 231208 같은 part가 여러개일경우 중복건 발생으로 위조건으로 대체
AND V.PART_NO = SP.PART_OBJID
AND SP.PARENT_PART_OBJID = V.PARENT_PART_NO
-->
LEFT OUTER JOIN PART_MNG PM
ON nvl(V.LAST_PART_OBJID, V.PART_NO) = PM.OBJID::VARCHAR
<!-- 231208 설변된 최종part로 연결되게 수정
ON V.PART_NO = PM.OBJID::VARCHAR
-->
WHERE 1=1
<if test="SEARCH_PART_NO != null and SEARCH_PART_NO != ''">
AND UPPER(PM.PART_NO) LIKE UPPER('%${SEARCH_PART_NO}%')
</if>
<if test="SEARCH_PART_NO_END != null and SEARCH_PART_NO_END != ''">
AND UPPER(PM.PART_NO) LIKE UPPER('%${SEARCH_PART_NO_END}')
</if>
<if test="SEARCH_PART_NO_EQ != null and SEARCH_PART_NO_EQ != ''">
AND UPPER(PM.PART_NO) = #{SEARCH_PART_NO_EQ}
</if>
<if test="SEARCH_PART_NAME != null and SEARCH_PART_NAME != ''">
AND UPPER(PM.PART_NAME) LIKE UPPER('%${SEARCH_PART_NAME}%')
</if>
<if test="SEARCH_PART_NAME_EQ != null and SEARCH_PART_NAME_EQ != ''">
AND TRIM(UPPER(PM.PART_NAME)) = TRIM(UPPER(#{SEARCH_PART_NAME_EQ}))
</if>
<if test='SEARCH_PO_Y != null and SEARCH_PO_Y != "" and "Y".equals(SEARCH_PO_Y) '>
AND (V.LEV &lt; 3
OR EXISTS (
SELECT (1)
FROM PURCHASE_ORDER_PART PO
,PURCHASE_ORDER_MASTER POM
WHERE 1=1
AND POM.BOM_REPORT_OBJID = v.BOM_REPORT_OBJID
AND POM.STATUS = 'approvalComplete'
AND POM.OBJID = PO.PURCHASE_ORDER_MASTER_OBJID
AND NVL(V.LAST_PART_OBJID, V.PART_NO) = PO.PART_OBJID
)
)
</if>
<if test='SEARCH_PO_N != null and SEARCH_PO_N != "" and "Y".equals(SEARCH_PO_N) '>
AND (V.LEV &lt; 3
OR NOT EXISTS (
SELECT (1)
FROM PURCHASE_ORDER_PART PO
,PURCHASE_ORDER_MASTER POM
WHERE 1=1
AND POM.BOM_REPORT_OBJID = v.BOM_REPORT_OBJID
AND POM.STATUS = 'approvalComplete'
AND POM.OBJID = PO.PURCHASE_ORDER_MASTER_OBJID
AND NVL(V.LAST_PART_OBJID, V.PART_NO) = PO.PART_OBJID
)
)
</if>
<!--
ORDER BY V.SEQ
-->
ORDER BY V.PATH2
</select>
<delete id="deleteSalesBomReportPart" parameterType="map">
DELETE FROM SALES_BOM_REPORT_PART WHERE PARENT_OBJID = #{PARENT_OBJID}
</delete>
<update id="mergeSalesBomReportPart" parameterType="map">
INSERT INTO SALES_BOM_REPORT_PART (
OBJID
,PARENT_OBJID
,PART_OBJID
,SUPPLY_OBJID
,PRICE
,SUPPLY_OBJID1
,PRICE1
,SUPPLY_OBJID2
,PRICE2
,SUPPLY_OBJID3
,PRICE3
,SUPPLY_OBJID4
,PRICE4
,PRICE_SUM
,WRITER
,REGDATE
,PARENT_PART_OBJID
,BOM_PART_QTY_OBJID
,PRE_BOOKING_QTY
) VALUES (
#{OBJID }
,#{PARENT_OBJID }
,#{PART_OBJID }
,#{SUPPLY_OBJID }
,#{PRICE }
,#{SUPPLY_OBJID1}
,#{PRICE1 }
,#{SUPPLY_OBJID2}
,#{PRICE2 }
,#{SUPPLY_OBJID3}
,#{PRICE3 }
,#{SUPPLY_OBJID4}
,#{PRICE4 }
,#{PRICE_SUM }
,#{writer }
,NOW()
,#{PARENT_PART_NO }
,#{CHILD_OBJID }
,#{PRE_BOOKING_QTY }
) ON CONFLICT (OBJID) DO
UPDATE SET
SUPPLY_OBJID = #{SUPPLY_OBJID }
,PRICE = #{PRICE }
,SUPPLY_OBJID1 = #{SUPPLY_OBJID1}
,PRICE1 = #{PRICE1 }
,SUPPLY_OBJID2 = #{SUPPLY_OBJID2}
,PRICE2 = #{PRICE2 }
,SUPPLY_OBJID3 = #{SUPPLY_OBJID3}
,PRICE3 = #{PRICE3 }
,SUPPLY_OBJID4 = #{SUPPLY_OBJID4}
,PRICE4 = #{PRICE4 }
,PRICE_SUM = #{PRICE_SUM }
,MODIFIER = #{writer }
,UPDATE_DATE = NOW()
,PRE_BOOKING_QTY = #{PRE_BOOKING_QTY}
</update>
<update id="mergeSalesBomReportPart2" parameterType="map">
INSERT INTO SALES_BOM_REPORT_PART (
OBJID
,PARENT_OBJID
,PART_OBJID
,SUPPLY_OBJID
,PRICE
,SUPPLY_OBJID1
,PRICE1
,SUPPLY_OBJID2
,PRICE2
,SUPPLY_OBJID3
,PRICE3
,SUPPLY_OBJID4
,PRICE4
,PRICE_SUM
,WRITER
,REGDATE
,PARENT_PART_OBJID
,BOM_PART_QTY_OBJID
) VALUES (
#{OBJID }
,#{PARENT_OBJID }
,#{PART_OBJID }
,#{SUPPLY_OBJID }
,#{PRICE }
,#{SUPPLY_OBJID1}
,#{PRICE1 }
,#{SUPPLY_OBJID2}
,#{PRICE2 }
,#{SUPPLY_OBJID3}
,#{PRICE3 }
,#{SUPPLY_OBJID4}
,#{PRICE4 }
,#{PRICE_SUM }
,#{writer }
,NOW()
,#{PARENT_PART_NO }
,#{CHILD_OBJID }
) ON CONFLICT (PARENT_OBJID, PART_OBJID) DO
UPDATE SET
SUPPLY_OBJID = #{SUPPLY_OBJID }
,PRICE = #{PRICE }
,SUPPLY_OBJID1 = #{SUPPLY_OBJID1}
,PRICE1 = #{PRICE1 }
,SUPPLY_OBJID2 = #{SUPPLY_OBJID2}
,PRICE2 = #{PRICE2 }
,SUPPLY_OBJID3 = #{SUPPLY_OBJID3}
,PRICE3 = #{PRICE3 }
,SUPPLY_OBJID4 = #{SUPPLY_OBJID4}
,PRICE4 = #{PRICE4 }
,PRICE_SUM = #{PRICE_SUM }
,MODIFIER = #{writer }
,UPDATE_DATE = NOW()
<!--
WHERE PARENT_OBJID = #{PARENT_OBJID}
AND PART_OBJID = #{PART_OBJID}
-->
</update>
<update id="updateSalesBomReportPartPrice" parameterType="map">
UPDATE SALES_BOM_REPORT_PART SET
PRICE = #{PRICE }
,PRICE1 = #{PRICE1 }
,PRICE2 = #{PRICE2 }
,PRICE3 = #{PRICE3 }
,PRICE4 = #{PRICE4 }
,PRICE_SUM = #{PRICE_SUM }
<!--
,WRITER = #{writer }
,REGDATE = NOW()
-->
WHERE OBJID = #{OBJID }
</update>
<select id="salesPartChgList" parameterType="map" resultType="map">
SELECT PM.OBJID
,PM.EO_NO
,TO_CHAR(CM.REGDATE, 'YYYY') AS CM_YEAR
,CM.CUSTOMER_PROJECT_NAME
,COALESCE(CM2.PROJECT_NO, CM.PROJECT_NO) PROJECT_NO
,(SELECT PART_NO||' '||PART_NAME FROM PART_MNG SP WHERE SP.OBJID = PM.PARENT_PART_NO) PARENT_PART_INFO
,PM.PART_NO
,PM.PART_NAME
,CASE WHEN PM.BOM_QTY_STATUS = 'adding' THEN PM.QTY_TEMP
ELSE PM.QTY END QTY
,CASE
WHEN PM.BOM_QTY_STATUS = 'adding' THEN ''
WHEN PM.BOM_QTY_STATUS = 'beforeEdit' and PM.QTY = PM.QTY_TEMP THEN ''
ELSE PM.QTY_TEMP END QTY_TEMP
,'' AS EO_STEP
,PM.CHANGE_TYPE
,(SELECT CODE_NAME FROM COMM_CODE AS O WHERE O.CODE_ID = PM.CHANGE_TYPE) AS CHANGE_TYPE_NAME
,PM.CHANGE_OPTION
,(SELECT CODE_NAME FROM COMM_CODE AS O WHERE O.CODE_ID = PM.CHANGE_OPTION) AS CHANGE_OPTION_NAME
,PM.REVISION
,PM.EO_DATE
,PM.PART_TYPE
,(SELECT CODE_NAME FROM COMM_CODE AS O WHERE O.CODE_ID = PM.PART_TYPE) AS PART_TYPE_NAME
,PM.WRITER
,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = PM.WRITER) AS WRITER_NAME
,'' AS STATUS
,SPC.OBJID AS SPC_OBJID
,SPC.CONFIRM_DATE
,SPC.WRITER AS WRTIER1
,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = SPC.WRITER) AS WRITER1_NAME
,SPC.ACT_CD
,(SELECT CODE_NAME FROM COMM_CODE AS O WHERE O.CODE_ID = SPC.ACT_CD) AS ACT_NAME
,SPC.PURCHASE_ORDER_MASTER_OBJID
,SPC.NOTE
,POM.PURCHASE_ORDER_NO
,SPC.ACT_STATUS
,(CASE WHEN SPC.ACT_STATUS IS NULL THEN '0001063' ELSE SPC.ACT_STATUS END) AS ACT_STATUS
,(SELECT CODE_NAME FROM COMM_CODE AS O
WHERE O.CODE_ID = (CASE WHEN SPC.ACT_STATUS IS NULL THEN '0001063' ELSE SPC.ACT_STATUS END)
) AS ACT_STATUS_NAME
,TO_CHAR(PM.HIS_REG_DATE,'YYYY-MM-DD') AS HIS_REG_DATE_TITLE
,PM.BOM_REPORT_OBJID
,PM.QTY_CHILD_OBJID
FROM PART_MNG_HISTORY PM
LEFT OUTER JOIN SALES_PART_CHG SPC
ON PM.OBJID::varchar = SPC.PART_OBJID
AND PM.QTY_CHILD_OBJID = SPC.QTY_CHILD_OBJID
LEFT OUTER JOIN PURCHASE_ORDER_MASTER POM
ON SPC.PURCHASE_ORDER_MASTER_OBJID = POM.OBJID
LEFT OUTER JOIN PART_BOM_REPORT B
ON PM.BOM_REPORT_OBJID = B.OBJID
LEFT OUTER JOIN PROJECT_MGMT CM
ON PM.CONTRACT_OBJID = CM.OBJID
LEFT OUTER JOIN PROJECT_MGMT CM2
ON B.CONTRACT_OBJID = CM2.OBJID
WHERE 1=1
<!-- 파트 신규등록건 조회 제외 -->
AND NOT ( PM.HIS_STATUS = 'DEPLOY'
AND PM.CHANGE_TYPE IS NULL
AND PM.REVISION = 'RE')
AND PM.REVISION IS NOT NULL
<!-- 240520 조건 추가-->
AND NVL(PM.BOM_STATUS, '') = 'deploy'
<if test="Year !=null and Year != '' ">
AND TO_CHAR(CM.REGDATE, 'YYYY') = #{Year}
</if>
<!-- <if test="contract_objid !=null and contract_objid != '' ">
AND CM.OBJID = #{contract_objid}
</if> -->
<if test="project_nos != null and project_nos != ''">
AND COALESCE(CM2.OBJID, CM.OBJID) IN
<foreach item="state" collection="project_nos.split(',')"
open="(" separator="," close=")">
#{state}
</foreach>
</if>
<if test="part_no !=null and part_no != '' ">
AND PM.PART_NO = #{part_no}
</if>
<if test="part_name !=null and part_name != '' ">
AND PM.PART_NAME = #{part_name}
</if>
<if test="change_option !=null and change_option != '' ">
AND PM.CHANGE_OPTION = #{change_option}
</if>
<if test="eo_date_start !=null and eo_date_start != '' ">
AND TO_DATE(PM.EO_DATE, 'YYYY-MM-DD') <![CDATA[ >= ]]> TO_DATE(#{eo_date_start}, 'YYYY-MM-DD')
</if>
<if test="eo_date_end !=null and eo_date_end != '' ">
AND TO_DATE(PM.EO_DATE, 'YYYY-MM-DD') <![CDATA[ <= ]]> TO_DATE(#{eo_date_end} , 'YYYY-MM-DD')
</if>
<if test="change_type !=null and change_type != '' ">
AND PM.CHANGE_TYPE = #{change_type}
</if>
<if test="part_type !=null and part_type != '' ">
AND PM.PART_TYPE = #{part_type}
</if>
<if test="part_writer !=null and part_writer != '' ">
AND PM.WRITER = #{part_writer}
</if>
<if test="sales_writer !=null and sales_writer != '' ">
AND SPC.WRITER = #{sales_writer}
</if>
<if test="revision !=null and revision != '' ">
AND PM.REVISION = #{revision}
</if>
<if test="confirm_date_start !=null and confirm_date_start != '' ">
AND TO_DATE(SPC.CONFIRM_DATE,'YYYY-MM-DD') <![CDATA[ >= ]]> TO_DATE(#{confirm_date_start}, 'YYYY-MM-DD')
</if>
<if test="confirm_date_end !=null and confirm_date_end != '' ">
AND TO_DATE(SPC.CONFIRM_DATE,'YYYY-MM-DD') <![CDATA[ <= ]]> TO_DATE(#{confirm_date_end} , 'YYYY-MM-DD')
</if>
<if test="act_cd !=null and act_cd != '' ">
AND SPC.ACT_CD = #{act_cd}
</if>
<if test="act_status !=null and act_status != '' ">
AND (CASE WHEN SPC.ACT_STATUS IS NULL THEN '0001063' ELSE SPC.ACT_STATUS END) = #{act_status}
</if>
ORDER BY COALESCE(PM.HIS_REG_DATE, PM.REG_DATE) DESC, PM.PART_NO
</select>
<select id="salesPartChgInfo" parameterType="map" resultType="map">
SELECT SPC.OBJID
,SPC.PART_OBJID
,SPC.CONFIRM_DATE
,SPC.ACT_CD
,SPC.PURCHASE_ORDER_MASTER_OBJID
,SPC.NOTE
,SPC.REGDATE
,SPC.WRITER
,SPC.ACT_STATUS
,PM.EO_NO
,PM.PART_NO
,CM.PROJECT_NO
FROM SALES_PART_CHG SPC
,PART_MNG_HISTORY PM
,PROJECT_MGMT CM
WHERE SPC.PART_OBJID = PM.OBJID::varchar
AND PM.CONTRACT_OBJID = CM.OBJID
AND SPC.OBJID = #{objId}
limit 1
</select>
<update id="mergeSalesPartChgInfo" parameterType="map">
INSERT INTO SALES_PART_CHG (
OBJID
,PART_OBJID
,CONFIRM_DATE
,ACT_CD
,PURCHASE_ORDER_MASTER_OBJID
,NOTE
,WRITER
,REGDATE
,ACT_STATUS
,BOM_REPORT_OBJID
,QTY_CHILD_OBJID
) VALUES (
#{OBJID }
,#{PART_OBJID }
,#{CONFIRM_DATE}
,#{ACT_CD }
,#{PURCHASE_ORDER_MASTER_OBJID}
,#{NOTE }
,#{writer }
,NOW()
,#{ACT_STATUS }
,#{BOM_REPORT_OBJID }
,#{QTY_CHILD_OBJID }
<!--
,(SELECT BOM_REPORT_OBJID FROM PART_MNG_HISTORY H WHERE H.OBJID = #{PART_OBJID}::NUMERIC)
,(SELECT QTY_CHILD_OBJID FROM PART_MNG_HISTORY H WHERE H.OBJID = #{PART_OBJID}::NUMERIC)
-->
) ON CONFLICT (OBJID) DO
UPDATE SET
PART_OBJID = #{PART_OBJID }
,CONFIRM_DATE = #{CONFIRM_DATE}
,ACT_CD = #{ACT_CD }
,PURCHASE_ORDER_MASTER_OBJID = #{PURCHASE_ORDER_MASTER_OBJID}
,NOTE = #{NOTE }
,WRITER = #{writer }
,REGDATE = NOW()
,ACT_STATUS = #{ACT_STATUS }
</update>
<select id="salesLongDeliveryList" parameterType="map" resultType="map">
SELECT T1.OBJID
,T1.LD_PART_NAME
,T1.SPEC
,T1.FORM_NO
,T1.MAKER
,T1.MATERIAL_CODE
,T1.SUPPLY_OBJID
,(SELECT SUPPLY_NAME FROM ADMIN_SUPPLY_MNG S WHERE S.OBJID = T1.SUPPLY_OBJID::NUMERIC) AS SUPPLY_NAME
,T1.REGDATE
,T1.WRITER
,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = T1.WRITER) AS WRITER_NAME
,T1.LOCATION
,(SELECT CODE_NAME FROM COMM_CODE AS O WHERE O.CODE_ID = T1.LOCATION) AS LOCATION_NAME
,T1.PRICE
,(T1.PRICE::NUMERIC * (SELECT SUM(COALESCE(INPUT_QTY, '0')::NUMERIC) FROM SALES_LONG_DELIVERY_INPUT T2 WHERE T1.OBJID = T2.PARENT_OBJID)) AS PRICE_SUM
,(SELECT SUM(COALESCE(INPUT_QTY, '0')::NUMERIC) FROM SALES_LONG_DELIVERY_INPUT T2 WHERE T1.OBJID = T2.PARENT_OBJID AND (CONTRACT_OBJID = '' or CONTRACT_OBJID IS NULL))
- COALESCE((SELECT SUM(COALESCE(INPUT_QTY, '0')::NUMERIC) FROM SALES_LONG_DELIVERY_INPUT T2 WHERE T1.OBJID = T2.PARENT_OBJID AND CONTRACT_OBJID != '' AND CONTRACT_OBJID IS NOT NULL), 0) AS INPUT_QTY
,(SELECT COALESCE(COUNT(1), 0) FROM SALES_LONG_DELIVERY_INPUT T2 WHERE T1.OBJID = T2.PARENT_OBJID) AS INPUT_CNT
,T3.*
FROM SALES_LONG_DELIVERY T1
LEFT OUTER JOIN (SELECT PARENT_OBJID
<!-- RIGHT JOIN (SELECT PARENT_OBJID -->
,SUM(QTY::NUMERIC) AS M_TOTAL
,SUM(CASE WHEN MONTH::NUMERIC = 1 THEN QTY::NUMERIC ELSE NULL END) AS M01
,SUM(CASE WHEN MONTH::NUMERIC = 2 THEN QTY::NUMERIC ELSE NULL END) AS M02
,SUM(CASE WHEN MONTH::NUMERIC = 3 THEN QTY::NUMERIC ELSE NULL END) AS M03
,SUM(CASE WHEN MONTH::NUMERIC = 4 THEN QTY::NUMERIC ELSE NULL END) AS M04
,SUM(CASE WHEN MONTH::NUMERIC = 5 THEN QTY::NUMERIC ELSE NULL END) AS M05
,SUM(CASE WHEN MONTH::NUMERIC = 6 THEN QTY::NUMERIC ELSE NULL END) AS M06
,SUM(CASE WHEN MONTH::NUMERIC = 7 THEN QTY::NUMERIC ELSE NULL END) AS M07
,SUM(CASE WHEN MONTH::NUMERIC = 8 THEN QTY::NUMERIC ELSE NULL END) AS M08
,SUM(CASE WHEN MONTH::NUMERIC = 9 THEN QTY::NUMERIC ELSE NULL END) AS M09
,SUM(CASE WHEN MONTH::NUMERIC =10 THEN QTY::NUMERIC ELSE NULL END) AS M10
,SUM(CASE WHEN MONTH::NUMERIC =11 THEN QTY::NUMERIC ELSE NULL END) AS M11
,SUM(CASE WHEN MONTH::NUMERIC =12 THEN QTY::NUMERIC ELSE NULL END) AS M12
FROM SALES_LONG_DELIVERY_PREDICT
GROUP BY PARENT_OBJID
) AS T3
ON T1.OBJID = T3.PARENT_OBJID
WHERE 1=1
<if test="ld_part_name !=null and ld_part_name != '' ">
AND T1.LD_PART_NAME LIKE '%'|| #{ld_part_name} ||'%'
</if>
<if test="Location !=null and Location != '' ">
AND T1.LOCATION = #{Location}
</if>
<if test="spec !=null and spec != '' ">
AND T1.SPEC LIKE '%'|| #{spec} ||'%'
</if>
<if test="maker !=null and maker != '' ">
AND T1.MAKER LIKE '%'|| #{maker} ||'%'
</if>
<if test="material_code !=null and material_code != '' ">
AND T1.MATERIAL_CODE LIKE '%'|| #{material_code} ||'%'
</if>
<if test="admin_supply !=null and admin_supply != '' ">
AND T1.SUPPLY_OBJID = #{admin_supply}
</if>
ORDER BY LD_PART_NAME, SUPPLY_NAME
</select>
<select id="salesLongDeliveryListSum" parameterType="map" resultType="map">
SELECT
SUM(T.PRICE_SUM) AS TOTAL_PRICE_SUM
FROM
(SELECT
T1.OBJID
,T1.LD_PART_NAME
,T1.SPEC
,T1.FORM_NO
,T1.MAKER
,T1.MATERIAL_CODE
,T1.SUPPLY_OBJID
,(SELECT SUPPLY_NAME FROM ADMIN_SUPPLY_MNG S WHERE S.OBJID = T1.SUPPLY_OBJID::NUMERIC) AS SUPPLY_NAME
,T1.REGDATE
,T1.WRITER
,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = T1.WRITER) AS WRITER_NAME
,T1.LOCATION
,(SELECT CODE_NAME FROM COMM_CODE AS O WHERE O.CODE_ID = T1.LOCATION) AS LOCATION_NAME
,T1.PRICE
,(T1.PRICE::NUMERIC * (SELECT SUM(COALESCE(INPUT_QTY, '0')::NUMERIC) FROM SALES_LONG_DELIVERY_INPUT T2 WHERE T1.OBJID = T2.PARENT_OBJID)) AS PRICE_SUM
,(SELECT SUM(COALESCE(INPUT_QTY, '0')::NUMERIC) FROM SALES_LONG_DELIVERY_INPUT T2 WHERE T1.OBJID = T2.PARENT_OBJID) AS INPUT_QTY
,(SELECT COALESCE(COUNT(1), 0) FROM SALES_LONG_DELIVERY_INPUT T2 WHERE T1.OBJID = T2.PARENT_OBJID) AS INPUT_CNT
,T3.*
FROM SALES_LONG_DELIVERY T1
LEFT OUTER JOIN (SELECT PARENT_OBJID
<!-- RIGHT JOIN (SELECT PARENT_OBJID -->
,SUM(QTY::NUMERIC) AS M_TOTAL
,SUM(CASE WHEN MONTH::NUMERIC = 1 THEN QTY::NUMERIC ELSE NULL END) AS M01
,SUM(CASE WHEN MONTH::NUMERIC = 2 THEN QTY::NUMERIC ELSE NULL END) AS M02
,SUM(CASE WHEN MONTH::NUMERIC = 3 THEN QTY::NUMERIC ELSE NULL END) AS M03
,SUM(CASE WHEN MONTH::NUMERIC = 4 THEN QTY::NUMERIC ELSE NULL END) AS M04
,SUM(CASE WHEN MONTH::NUMERIC = 5 THEN QTY::NUMERIC ELSE NULL END) AS M05
,SUM(CASE WHEN MONTH::NUMERIC = 6 THEN QTY::NUMERIC ELSE NULL END) AS M06
,SUM(CASE WHEN MONTH::NUMERIC = 7 THEN QTY::NUMERIC ELSE NULL END) AS M07
,SUM(CASE WHEN MONTH::NUMERIC = 8 THEN QTY::NUMERIC ELSE NULL END) AS M08
,SUM(CASE WHEN MONTH::NUMERIC = 9 THEN QTY::NUMERIC ELSE NULL END) AS M09
,SUM(CASE WHEN MONTH::NUMERIC =10 THEN QTY::NUMERIC ELSE NULL END) AS M10
,SUM(CASE WHEN MONTH::NUMERIC =11 THEN QTY::NUMERIC ELSE NULL END) AS M11
,SUM(CASE WHEN MONTH::NUMERIC =12 THEN QTY::NUMERIC ELSE NULL END) AS M12
FROM SALES_LONG_DELIVERY_PREDICT
GROUP BY PARENT_OBJID
) AS T3
ON T1.OBJID = T3.PARENT_OBJID
WHERE 1=1
<if test="ld_part_name !=null and ld_part_name != '' ">
AND T1.LD_PART_NAME LIKE '%'|| #{ld_part_name} ||'%'
</if>
<if test="Location !=null and Location != '' ">
AND T1.LOCATION = #{Location}
</if>
<if test="spec !=null and spec != '' ">
AND T1.SPEC LIKE '%'|| #{spec} ||'%'
</if>
<if test="maker !=null and maker != '' ">
AND T1.MAKER LIKE '%'|| #{maker} ||'%'
</if>
<if test="material_code !=null and material_code != '' ">
AND T1.MATERIAL_CODE LIKE '%'|| #{material_code} ||'%'
</if>
<if test="admin_supply !=null and admin_supply != '' ">
AND T1.SUPPLY_OBJID = #{admin_supply}
</if> ) T
</select>
<select id="salesLongDeliveryInfo" parameterType="map" resultType="map">
SELECT T1.OBJID
,T1.LD_PART_NAME
,T1.SPEC
,T1.FORM_NO
,T1.MAKER
,T1.MATERIAL_CODE
,T1.SUPPLY_OBJID
,(SELECT SUPPLY_NAME FROM admin_supply_mng s WHERE s.objid = T1.SUPPLY_OBJID::numeric) AS SUPPLY_NAME
,T1.REGDATE
,T1.WRITER
,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = T1.WRITER) AS WRITER_NAME
,T1.LOCATION
,(SELECT CODE_NAME FROM COMM_CODE AS O WHERE O.CODE_ID = T1.LOCATION) AS LOCATION_NAME
,PRICE
FROM SALES_LONG_DELIVERY T1
WHERE 1=1
AND T1.OBJID = #{objId}
</select>
<select id="salesLongDeliveryInputList" parameterType="map" resultType="map">
SELECT OBJID
,PARENT_OBJID
,CONTRACT_OBJID
,INPUT_QTY
,INPUT_DATE
FROM SALES_LONG_DELIVERY_INPUT
WHERE 1=1
AND PARENT_OBJID = #{objId}
</select>
<select id="salesLongDeliveryPredictList" parameterType="map" resultType="map">
SELECT OBJID
,PARENT_OBJID
,CONTRACT_OBJID
,MONTH
,USE_PLACE
,QTY
,NOTE
FROM SALES_LONG_DELIVERY_PREDICT
WHERE 1=1
AND PARENT_OBJID = #{objId}
<if test="month !=null and month != '' ">
AND MONTH = #{month}
</if>
</select>
<delete id="deleteSalesLongDelivery" parameterType="map">
DELETE FROM SALES_LONG_DELIVERY WHERE OBJID = #{OBJID}
</delete>
<update id="mergeSalesLongDelivery" parameterType="map">
INSERT INTO SALES_LONG_DELIVERY (
OBJID
,LD_PART_NAME
,SPEC
,FORM_NO
,MAKER
,MATERIAL_CODE
,SUPPLY_OBJID
,REGDATE
,WRITER
,LOCATION
,PRICE
) VALUES (
#{OBJID }
,#{LD_PART_NAME }
,#{SPEC }
,#{FORM_NO }
,#{MAKER }
,#{MATERIAL_CODE}
,#{SUPPLY_OBJID }
,NOW()
,#{writer }
,#{LOCATION }
,#{PRICE }
) ON CONFLICT (OBJID) DO
UPDATE SET
LD_PART_NAME = #{LD_PART_NAME }
,SPEC = #{SPEC }
,FORM_NO = #{FORM_NO }
,MAKER = #{MAKER }
,MATERIAL_CODE = #{MATERIAL_CODE}
,SUPPLY_OBJID = #{SUPPLY_OBJID }
,REGDATE = NOW()
,WRITER = #{writer }
,LOCATION = #{LOCATION }
,PRICE = #{PRICE }
</update>
<delete id="deleteSalesLongDeliveryInput" parameterType="map">
DELETE FROM SALES_LONG_DELIVERY_INPUT WHERE PARENT_OBJID = #{PARENT_OBJID}
</delete>
<delete id="deleteSalesLongDeliveryPredict" parameterType="map">
DELETE FROM SALES_LONG_DELIVERY_PREDICT WHERE PARENT_OBJID = #{PARENT_OBJID}
</delete>
<update id="mergeSalesLongDeliveryInput" parameterType="map">
INSERT INTO SALES_LONG_DELIVERY_INPUT (
OBJID
,PARENT_OBJID
,CONTRACT_OBJID
,INPUT_QTY
,INPUT_DATE
) VALUES (
#{OBJID }
,#{PARENT_OBJID }
,#{CONTRACT_OBJID}
,#{INPUT_QTY }
,#{INPUT_DATE }
) ON CONFLICT (OBJID) DO
UPDATE SET
PARENT_OBJID = #{PARENT_OBJID }
,CONTRACT_OBJID= #{CONTRACT_OBJID}
,INPUT_QTY = #{INPUT_QTY }
,INPUT_DATE = #{INPUT_DATE }
</update>
<update id="mergeSalesLongDeliveryPredict" parameterType="map">
INSERT INTO SALES_LONG_DELIVERY_PREDICT (
OBJID
,PARENT_OBJID
,CONTRACT_OBJID
,MONTH
,USE_PLACE
,QTY
,NOTE
) VALUES (
#{OBJID }
,#{PARENT_OBJID}
,#{CONTRACT_OBJID}
,#{MONTH }
,#{USE_PLACE }
,#{QTY }
,#{NOTE }
) ON CONFLICT (OBJID) DO
UPDATE SET
PARENT_OBJID= #{PARENT_OBJID}
,CONTRACT_OBJID= #{CONTRACT_OBJID}
,MONTH = #{MONTH }
,USE_PLACE = #{USE_PLACE }
,QTY = #{QTY }
,NOTE = #{NOTE }
</update>
<!-- 구매리스트 관련 쿼리 -->
<!-- M-BOM에서 가져온 PART_OBJID는 BPQ.PART_NO 값이므로 PART_MGMT.PART_NO와 조인 -->
<select id="getSalesRequestPartList" parameterType="string" resultType="map">
SELECT
SRP.OBJID,
SRP.PART_OBJID,
COALESCE(PM.PART_NO, '') AS PART_NO,
COALESCE(PM.PART_NAME, '') AS PART_NAME,
SRP.QTY,
SRP.PARTNER_OBJID,
SRP.PARTNER_PRICE
FROM
SALES_REQUEST_PART SRP
LEFT JOIN PART_MGMT PM ON SRP.PART_OBJID = PM.PART_NO
WHERE
SRP.SALES_REQUEST_MASTER_OBJID = #{SALES_REQUEST_MASTER_OBJID}
ORDER BY SRP.REGDATE
</select>
<update id="mergePurchaseListInfo" parameterType="map">
INSERT INTO SALES_REQUEST_PART (
OBJID,
SALES_REQUEST_MASTER_OBJID,
PART_NO,
PART_NAME,
QTY,
ITEM_QTY,
FILE_3D,
FILE_2D,
FILE_PDF,
MATERIAL,
HEAT_TREATMENT_HARDNESS,
HEAT_TREATMENT_METHOD,
SURFACE_TREATMENT,
SUPPLIER,
CATEGORY_NAME,
SUPPLY_TYPE,
RAW_MATERIAL,
SIZE,
RAW_MATERIAL_PART_NO,
RAW_MATERIAL_REQUIRED_QTY,
RAW_MATERIAL_ORDER_QTY,
ITEM_QTY2,
PRODUCTION_QTY,
PROCESSING_COMPANY,
PROCESSING_DELIVERY_DATE,
GRINDING_DELIVERY_DATE,
USE_YN,
NET_QTY,
ORDER_QTY,
SUPPLIER2,
UNIT_PRICE,
TOTAL_PRICE,
PROPOSAL_DATE,
WRITER,
REGDATE
) VALUES (
#{OBJID},
#{SALES_REQUEST_MASTER_OBJID},
#{PART_NO},
#{PART_NAME},
#{QTY},
#{ITEM_QTY},
#{FILE_3D},
#{FILE_2D},
#{FILE_PDF},
#{MATERIAL},
#{HEAT_TREATMENT_HARDNESS},
#{HEAT_TREATMENT_METHOD},
#{SURFACE_TREATMENT},
#{SUPPLIER},
#{CATEGORY_NAME},
#{SUPPLY_TYPE},
#{RAW_MATERIAL},
#{SIZE},
#{RAW_MATERIAL_PART_NO},
#{RAW_MATERIAL_REQUIRED_QTY},
#{RAW_MATERIAL_ORDER_QTY},
#{ITEM_QTY2},
#{PRODUCTION_QTY},
#{PROCESSING_COMPANY},
CASE WHEN #{PROCESSING_DELIVERY_DATE} = '' THEN NULL ELSE #{PROCESSING_DELIVERY_DATE}::date END,
CASE WHEN #{GRINDING_DELIVERY_DATE} = '' THEN NULL ELSE #{GRINDING_DELIVERY_DATE}::date END,
#{USE_YN},
#{NET_QTY},
#{ORDER_QTY},
#{SUPPLIER2},
#{UNIT_PRICE},
#{TOTAL_PRICE},
CASE WHEN #{PROPOSAL_DATE} = '' THEN NOW() ELSE #{PROPOSAL_DATE}::date END,
#{WRITER},
NOW()
) ON CONFLICT (OBJID) DO
UPDATE SET
ITEM_QTY = #{ITEM_QTY},
FILE_3D = #{FILE_3D},
FILE_2D = #{FILE_2D},
FILE_PDF = #{FILE_PDF},
MATERIAL = #{MATERIAL},
HEAT_TREATMENT_HARDNESS = #{HEAT_TREATMENT_HARDNESS},
HEAT_TREATMENT_METHOD = #{HEAT_TREATMENT_METHOD},
SURFACE_TREATMENT = #{SURFACE_TREATMENT},
SUPPLIER = #{SUPPLIER},
CATEGORY_NAME = #{CATEGORY_NAME},
SUPPLY_TYPE = #{SUPPLY_TYPE},
RAW_MATERIAL = #{RAW_MATERIAL},
SIZE = #{SIZE},
RAW_MATERIAL_PART_NO = #{RAW_MATERIAL_PART_NO},
RAW_MATERIAL_REQUIRED_QTY = #{RAW_MATERIAL_REQUIRED_QTY},
RAW_MATERIAL_ORDER_QTY = #{RAW_MATERIAL_ORDER_QTY},
ITEM_QTY2 = #{ITEM_QTY2},
PRODUCTION_QTY = #{PRODUCTION_QTY},
PROCESSING_COMPANY = #{PROCESSING_COMPANY},
PROCESSING_DELIVERY_DATE = CASE WHEN #{PROCESSING_DELIVERY_DATE} = '' THEN NULL ELSE #{PROCESSING_DELIVERY_DATE}::date END,
GRINDING_DELIVERY_DATE = CASE WHEN #{GRINDING_DELIVERY_DATE} = '' THEN NULL ELSE #{GRINDING_DELIVERY_DATE}::date END,
USE_YN = #{USE_YN},
NET_QTY = #{NET_QTY},
ORDER_QTY = #{ORDER_QTY},
SUPPLIER2 = #{SUPPLIER2},
UNIT_PRICE = #{UNIT_PRICE},
TOTAL_PRICE = #{TOTAL_PRICE}
</update>
<!-- 구매리스트 상세 조회 (기존 저장된 데이터) - 이 쿼리는 사용하지 않음, M-BOM 기반으로만 동작 -->
<select id="getPurchaseListDetail" parameterType="map" resultType="com.pms.common.UpperKeyMap">
<!-- SALES_REQUEST_PART에서 저장된 데이터 조회, PART_MNG에서 품목정보 가져옴 -->
SELECT
SRP.OBJID,
SRP.SALES_REQUEST_MASTER_OBJID,
SRP.PART_OBJID,
COALESCE(PM.PART_NO, '') AS PART_NO,
COALESCE(PM.PART_NAME, '') AS PART_NAME,
SRP.QTY,
0 AS ITEM_QTY,
-- 파일 개수
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE PM.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('3D_CAD')) AS CU01_CNT,
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE PM.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('2D_DRAWING_CAD')) AS CU02_CNT,
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE PM.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('2D_PDF_CAD')) AS CU03_CNT,
COALESCE(PM.MATERIAL, '') AS MATERIAL,
COALESCE(PM.HEAT_TREATMENT_HARDNESS, '') AS HEAT_TREATMENT_HARDNESS,
COALESCE(PM.HEAT_TREATMENT_METHOD, '') AS HEAT_TREATMENT_METHOD,
COALESCE(PM.SURFACE_TREATMENT, '') AS SURFACE_TREATMENT,
COALESCE(PM.MAKER, '') AS VENDOR,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = PM.PART_TYPE) AS PART_TYPE_TITLE,
'' AS SUPPLY_TYPE,
'' AS RAW_MATERIAL,
'' AS SIZE,
'' AS RAW_MATERIAL_NO,
0 AS REQUIRED_QTY,
0 AS ORDER_QTY,
0 AS ITEM_QTY2,
0 AS PRODUCTION_QTY,
COALESCE(SRP.PROCESSING_VENDOR, '') AS PROCESSING_VENDOR,
NULL AS PROCESSING_DEADLINE,
NULL AS GRINDING_DEADLINE,
-- 구매 관련 컬럼 (SALES_REQUEST_PART에서 조회)
COALESCE(SRP.USE_YN, 'Y') AS USE_YN,
COALESCE(SRP.NET_QTY, 0) AS NET_QTY,
COALESCE(SRP.PO_QTY, 0) AS PO_QTY,
COALESCE(SRP.VENDOR_PM, SRP.PARTNER_OBJID) AS VENDOR_PM,
COALESCE(SRP.UNIT_PRICE, NULLIF(SRP.PARTNER_PRICE, '')::numeric, 0) AS UNIT_PRICE,
COALESCE(SRP.TOTAL_PRICE, 0) AS TOTAL_PRICE,
0 AS PROCESSING_UNIT_PRICE,
0 AS PROCESSING_TOTAL_PRICE,
0 AS GRAND_TOTAL_PRICE,
SRP.PROPOSAL_DATE,
NULL AS PROCESSING_PROPOSAL_DATE,
'SRP' AS DATA_SOURCE -- 데이터 소스 구분용
FROM
SALES_REQUEST_PART SRP
LEFT JOIN PART_MNG PM ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
WHERE
SRP.SALES_REQUEST_MASTER_OBJID = #{SALES_REQUEST_MASTER_OBJID}
ORDER BY
SRP.REGDATE
</select>
<!-- M-BOM에서 구매리스트 데이터 가져오기 (품번별 그룹핑 버전) -->
<!-- 동일 품번은 수량 합산, 단가/업체는 대표값 사용 -->
<select id="getMBomForPurchaseList" parameterType="map" resultType="com.pms.common.UpperKeyMap">
WITH RECURSIVE VIEW_BOM(
MBOM_HEADER_OBJID,
OBJID,
PARENT_OBJID,
CHILD_OBJID,
PART_OBJID,
PART_NO,
PART_NAME,
QTY,
ITEM_QTY,
QTY_TEMP,
REGDATE,
SEQ,
STATUS,
LEV,
PATH,
PATH2,
CYCLE,
UNIT,
SUPPLY_TYPE,
MAKE_OR_BUY,
RAW_MATERIAL_PART_NO,
RAW_MATERIAL_SPEC,
RAW_MATERIAL,
RAW_MATERIAL_SIZE,
PROCESSING_VENDOR,
PROCESSING_DEADLINE,
GRINDING_DEADLINE,
REQUIRED_QTY,
ORDER_QTY,
PRODUCTION_QTY,
STOCK_QTY,
SHORTAGE_QTY,
VENDOR,
UNIT_PRICE,
TOTAL_PRICE,
CURRENCY,
LEAD_TIME,
MIN_ORDER_QTY,
WRITER,
EDITER,
EDIT_DATE,
REMARK,
USE_YN,
NET_QTY,
PO_QTY,
PROPOSAL_DATE,
PROCESSING_PROPOSAL_DATE,
PROCESSING_UNIT_PRICE,
PROCESSING_TOTAL_PRICE,
GRAND_TOTAL_PRICE
) AS (
SELECT
A.MBOM_HEADER_OBJID,
A.OBJID,
A.PARENT_OBJID,
A.CHILD_OBJID,
A.PART_OBJID,
A.PART_NO,
A.PART_NAME,
A.QTY,
A.QTY,
A.QTY,
A.REGDATE,
A.SEQ,
A.STATUS,
1,
ARRAY [A.CHILD_OBJID::TEXT],
ARRAY [A.SEQ::TEXT],
FALSE,
A.UNIT,
A.SUPPLY_TYPE,
A.MAKE_OR_BUY,
A.RAW_MATERIAL_PART_NO,
A.RAW_MATERIAL_SPEC,
A.RAW_MATERIAL,
A.RAW_MATERIAL_SIZE,
A.PROCESSING_VENDOR,
A.PROCESSING_DEADLINE,
A.GRINDING_DEADLINE,
A.REQUIRED_QTY,
A.ORDER_QTY,
A.PRODUCTION_QTY,
A.STOCK_QTY,
A.SHORTAGE_QTY,
A.VENDOR,
A.UNIT_PRICE,
A.TOTAL_PRICE,
A.CURRENCY,
A.LEAD_TIME,
A.MIN_ORDER_QTY,
A.WRITER,
A.EDITER,
A.EDIT_DATE,
A.REMARK,
COALESCE(A.USE_YN, 'Y'),
COALESCE(A.NET_QTY, 0),
COALESCE(A.PO_QTY, 0),
A.PROPOSAL_DATE,
A.PROCESSING_PROPOSAL_DATE,
COALESCE(A.PROCESSING_UNIT_PRICE, 0),
COALESCE(A.PROCESSING_TOTAL_PRICE, 0),
COALESCE(A.GRAND_TOTAL_PRICE, 0)
FROM
MBOM_DETAIL A
INNER JOIN MBOM_HEADER MH ON MH.OBJID = A.MBOM_HEADER_OBJID
WHERE 1=1
AND (A.PARENT_OBJID IS NULL OR A.PARENT_OBJID = '')
AND (
MH.PROJECT_OBJID::VARCHAR = #{PROJECT_MGMT_OBJID}
OR MH.OBJID::VARCHAR = #{PROJECT_MGMT_OBJID}
)
UNION ALL
SELECT
B.MBOM_HEADER_OBJID,
B.OBJID,
B.PARENT_OBJID,
B.CHILD_OBJID,
B.PART_OBJID,
B.PART_NO,
B.PART_NAME,
B.QTY,
B.QTY,
B.QTY,
B.REGDATE,
B.SEQ,
B.STATUS,
LEV + 1,
PATH||B.CHILD_OBJID::TEXT,
PATH2||B.SEQ::TEXT,
B.PARENT_OBJID = ANY(PATH),
B.UNIT,
B.SUPPLY_TYPE,
B.MAKE_OR_BUY,
B.RAW_MATERIAL_PART_NO,
B.RAW_MATERIAL_SPEC,
B.RAW_MATERIAL,
B.RAW_MATERIAL_SIZE,
B.PROCESSING_VENDOR,
B.PROCESSING_DEADLINE,
B.GRINDING_DEADLINE,
B.REQUIRED_QTY,
B.ORDER_QTY,
B.PRODUCTION_QTY,
B.STOCK_QTY,
B.SHORTAGE_QTY,
B.VENDOR,
B.UNIT_PRICE,
B.TOTAL_PRICE,
B.CURRENCY,
B.LEAD_TIME,
B.MIN_ORDER_QTY,
B.WRITER,
B.EDITER,
B.EDIT_DATE,
B.REMARK,
COALESCE(B.USE_YN, 'Y'),
COALESCE(B.NET_QTY, 0),
COALESCE(B.PO_QTY, 0),
B.PROPOSAL_DATE,
B.PROCESSING_PROPOSAL_DATE,
COALESCE(B.PROCESSING_UNIT_PRICE, 0),
COALESCE(B.PROCESSING_TOTAL_PRICE, 0),
COALESCE(B.GRAND_TOTAL_PRICE, 0)
FROM
MBOM_DETAIL B
JOIN
VIEW_BOM
ON B.PARENT_OBJID = VIEW_BOM.CHILD_OBJID
AND VIEW_BOM.MBOM_HEADER_OBJID = B.MBOM_HEADER_OBJID
),
/* 품번 + 자급/사급 + 소재재질 + 규격이 같은 경우만 그룹핑 */
/* MBOM_DETAIL 테이블의 RAW_MATERIAL, RAW_MATERIAL_SIZE 값만 사용 */
GROUPED_BOM AS (
SELECT
V.PART_NO,
V.PART_OBJID,
/* 그룹핑 조건 컬럼들 (MBOM_DETAIL 값만 사용) */
COALESCE(V.SUPPLY_TYPE, '') AS SUPPLY_TYPE,
COALESCE(V.RAW_MATERIAL, '') AS RAW_MATERIAL,
COALESCE(V.RAW_MATERIAL_SIZE, '') AS RAW_MATERIAL_SIZE,
/* 원본 OBJID들 (콤마로 연결) */
STRING_AGG(V.OBJID::VARCHAR, ',' ORDER BY V.OBJID) AS ORIGINAL_OBJIDS,
/* 대표 OBJID (가장 작은 값) */
MIN(V.OBJID) AS OBJID,
/* 수량 합산 (문자열을 NUMERIC으로 캐스팅) */
SUM(COALESCE(NULLIF(V.REQUIRED_QTY::TEXT, '')::NUMERIC, 0)) AS REQUIRED_QTY,
SUM(COALESCE(NULLIF(V.PRODUCTION_QTY::TEXT, '')::NUMERIC, 0)) AS PRODUCTION_QTY,
SUM(COALESCE(V.NET_QTY, 0)) AS NET_QTY,
SUM(COALESCE(V.PO_QTY, 0)) AS PO_QTY,
SUM(COALESCE(NULLIF(V.ORDER_QTY::TEXT, '')::NUMERIC, 0)) AS ORDER_QTY,
SUM(COALESCE(NULLIF(V.STOCK_QTY::TEXT, '')::NUMERIC, 0)) AS STOCK_QTY,
SUM(COALESCE(NULLIF(V.SHORTAGE_QTY::TEXT, '')::NUMERIC, 0)) AS SHORTAGE_QTY,
/* 첫번째 값 사용 (대표값) */
MIN(V.MBOM_HEADER_OBJID) AS MBOM_HEADER_OBJID,
MIN(V.PARENT_OBJID) AS PARENT_OBJID,
MIN(V.CHILD_OBJID) AS CHILD_OBJID,
MIN(V.PART_NAME) AS PART_NAME,
SUM(COALESCE(NULLIF(V.QTY::TEXT, '')::NUMERIC, 0)) AS QTY,
MIN(V.SEQ) AS SEQ,
MIN(V.STATUS) AS STATUS,
MIN(V.LEV) AS LEV,
MIN(V.UNIT) AS UNIT,
MIN(V.MAKE_OR_BUY) AS MAKE_OR_BUY,
MIN(V.RAW_MATERIAL_PART_NO) AS RAW_MATERIAL_PART_NO,
MIN(V.RAW_MATERIAL_SPEC) AS RAW_MATERIAL_SPEC,
MIN(V.PROCESSING_VENDOR) AS PROCESSING_VENDOR,
MIN(V.PROCESSING_DEADLINE) AS PROCESSING_DEADLINE,
MIN(V.GRINDING_DEADLINE) AS GRINDING_DEADLINE,
MIN(V.VENDOR) AS VENDOR,
MIN(V.UNIT_PRICE) AS UNIT_PRICE,
MIN(V.TOTAL_PRICE) AS TOTAL_PRICE,
MIN(V.CURRENCY) AS CURRENCY,
MIN(V.LEAD_TIME) AS LEAD_TIME,
MIN(V.MIN_ORDER_QTY) AS MIN_ORDER_QTY,
MIN(V.WRITER) AS WRITER,
MIN(V.REGDATE) AS REGDATE,
MIN(V.EDITER) AS EDITER,
MIN(V.EDIT_DATE) AS EDIT_DATE,
MIN(V.REMARK) AS REMARK,
MIN(V.USE_YN) AS USE_YN,
MIN(V.PROPOSAL_DATE) AS PROPOSAL_DATE,
MIN(V.PROCESSING_PROPOSAL_DATE) AS PROCESSING_PROPOSAL_DATE,
MIN(V.PROCESSING_UNIT_PRICE) AS PROCESSING_UNIT_PRICE,
MIN(V.PROCESSING_TOTAL_PRICE) AS PROCESSING_TOTAL_PRICE,
MIN(V.GRAND_TOTAL_PRICE) AS GRAND_TOTAL_PRICE,
/* 그룹에 포함된 행 수 */
COUNT(*) AS GROUPED_COUNT
FROM VIEW_BOM V
WHERE COALESCE(V.PRODUCTION_QTY, 0) > 0
GROUP BY V.PART_NO, V.PART_OBJID,
COALESCE(V.SUPPLY_TYPE, ''),
COALESCE(V.RAW_MATERIAL, ''),
COALESCE(V.RAW_MATERIAL_SIZE, '')
)
SELECT
G.MBOM_HEADER_OBJID AS BOM_REPORT_OBJID,
G.OBJID,
G.ORIGINAL_OBJIDS,
G.GROUPED_COUNT,
G.PARENT_OBJID,
G.CHILD_OBJID,
G.PART_OBJID,
G.PART_OBJID AS LAST_PART_OBJID,
G.PART_OBJID AS BOM_LAST_PART_OBJID,
G.PART_NO,
G.PART_NAME,
G.QTY,
G.QTY AS ITEM_QTY,
G.QTY AS QTY_TEMP,
G.LEV AS LEVEL,
0 AS SUB_PART_CNT,
G.SEQ,
G.STATUS,
G.UNIT,
G.SUPPLY_TYPE,
G.MAKE_OR_BUY,
G.RAW_MATERIAL_PART_NO AS RAW_MATERIAL_NO,
G.RAW_MATERIAL_SPEC,
G.RAW_MATERIAL,
G.RAW_MATERIAL_SIZE AS SIZE,
G.PROCESSING_VENDOR,
G.PROCESSING_DEADLINE,
G.GRINDING_DEADLINE,
G.REQUIRED_QTY,
G.ORDER_QTY,
G.PRODUCTION_QTY,
G.STOCK_QTY,
G.SHORTAGE_QTY,
G.VENDOR AS VENDOR_PM,
(SELECT SUPPLY_NAME FROM ADMIN_SUPPLY_MNG WHERE OBJID::VARCHAR = G.VENDOR) AS VENDOR_NAME,
G.UNIT_PRICE,
G.TOTAL_PRICE,
G.CURRENCY,
G.LEAD_TIME,
G.MIN_ORDER_QTY,
G.WRITER,
TO_CHAR(G.REGDATE, 'YYYY-MM-DD HH24:MI:SS') AS REGDATE,
G.EDITER,
CASE WHEN G.EDIT_DATE IS NOT NULL THEN TO_CHAR(G.EDIT_DATE, 'YYYY-MM-DD HH24:MI:SS') ELSE NULL END AS EDIT_DATE,
G.REMARK,
NULL AS PARENT_PART_NO,
NULL AS CONTRACT_OBJID,
G.OBJID AS ROOT_OBJID,
G.OBJID AS SUB_ROOT_OBJID,
1 AS LEAF,
P.SPEC,
COALESCE(P.MATERIAL, G.RAW_MATERIAL) AS MATERIAL,
P.WEIGHT,
P.PART_TYPE,
P.REVISION,
COALESCE(P.MAKER, G.VENDOR) AS VENDOR,
P.THICKNESS,
P.WIDTH,
P.HEIGHT,
P.OUT_DIAMETER,
P.IN_DIAMETER,
P.LENGTH,
P.SOURCING_CODE,
COALESCE(P.HEAT_TREATMENT_HARDNESS, '') AS HEAT_TREATMENT_HARDNESS,
COALESCE(P.HEAT_TREATMENT_METHOD, '') AS HEAT_TREATMENT_METHOD,
COALESCE(P.SURFACE_TREATMENT, '') AS SURFACE_TREATMENT,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = P.UNIT) AS UNIT_TITLE,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = P.PART_TYPE) AS PART_TYPE_TITLE,
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE P.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('3D_CAD')) AS CU01_CNT,
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE P.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('2D_DRAWING_CAD')) AS CU02_CNT,
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE P.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('2D_PDF_CAD')) AS CU03_CNT,
G.LEV,
G.USE_YN,
G.NET_QTY,
G.PO_QTY,
G.PROPOSAL_DATE,
G.PROCESSING_PROPOSAL_DATE,
G.PROCESSING_UNIT_PRICE,
G.PROCESSING_TOTAL_PRICE,
G.GRAND_TOTAL_PRICE,
'MBOM' AS DATA_SOURCE
FROM GROUPED_BOM G
LEFT JOIN PART_MNG P ON P.OBJID::VARCHAR = G.PART_OBJID::VARCHAR
ORDER BY G.PART_NO
</select>
<!-- M-BOM에서 구매리스트 데이터 가져오기 (백업용 - 개별 행 버전) -->
<select id="getMBomForPurchaseList_old" parameterType="map" resultType="com.pms.common.UpperKeyMap">
WITH RECURSIVE VIEW_BOM(
MBOM_HEADER_OBJID,
OBJID,
PARENT_OBJID,
CHILD_OBJID,
PART_OBJID,
PART_NO,
PART_NAME,
QTY,
ITEM_QTY,
QTY_TEMP,
REGDATE,
SEQ,
STATUS,
LEV,
PATH,
PATH2,
CYCLE,
UNIT,
SUPPLY_TYPE,
MAKE_OR_BUY,
RAW_MATERIAL_PART_NO,
RAW_MATERIAL_SPEC,
RAW_MATERIAL,
RAW_MATERIAL_SIZE,
PROCESSING_VENDOR,
PROCESSING_DEADLINE,
GRINDING_DEADLINE,
REQUIRED_QTY,
ORDER_QTY,
PRODUCTION_QTY,
STOCK_QTY,
SHORTAGE_QTY,
VENDOR,
UNIT_PRICE,
TOTAL_PRICE,
CURRENCY,
LEAD_TIME,
MIN_ORDER_QTY,
WRITER,
EDITER,
EDIT_DATE,
REMARK,
USE_YN,
NET_QTY,
PO_QTY,
PROPOSAL_DATE,
PROCESSING_PROPOSAL_DATE,
PROCESSING_UNIT_PRICE,
PROCESSING_TOTAL_PRICE,
GRAND_TOTAL_PRICE
) AS (
SELECT
A.MBOM_HEADER_OBJID,
A.OBJID,
A.PARENT_OBJID,
A.CHILD_OBJID,
A.PART_OBJID,
A.PART_NO,
A.PART_NAME,
A.QTY,
A.QTY,
A.QTY,
A.REGDATE,
A.SEQ,
A.STATUS,
1,
ARRAY [A.CHILD_OBJID::TEXT],
ARRAY [A.SEQ::TEXT],
FALSE,
A.UNIT,
A.SUPPLY_TYPE,
A.MAKE_OR_BUY,
A.RAW_MATERIAL_PART_NO,
A.RAW_MATERIAL_SPEC,
A.RAW_MATERIAL,
A.RAW_MATERIAL_SIZE,
A.PROCESSING_VENDOR,
A.PROCESSING_DEADLINE,
A.GRINDING_DEADLINE,
A.REQUIRED_QTY,
A.ORDER_QTY,
A.PRODUCTION_QTY,
A.STOCK_QTY,
A.SHORTAGE_QTY,
A.VENDOR,
A.UNIT_PRICE,
A.TOTAL_PRICE,
A.CURRENCY,
A.LEAD_TIME,
A.MIN_ORDER_QTY,
A.WRITER,
A.EDITER,
A.EDIT_DATE,
A.REMARK,
COALESCE(A.USE_YN, 'Y'),
COALESCE(A.NET_QTY, 0),
COALESCE(A.PO_QTY, 0),
A.PROPOSAL_DATE,
A.PROCESSING_PROPOSAL_DATE,
COALESCE(A.PROCESSING_UNIT_PRICE, 0),
COALESCE(A.PROCESSING_TOTAL_PRICE, 0),
COALESCE(A.GRAND_TOTAL_PRICE, 0)
FROM
MBOM_DETAIL A
INNER JOIN MBOM_HEADER MH ON MH.OBJID = A.MBOM_HEADER_OBJID
WHERE 1=1
AND (A.PARENT_OBJID IS NULL OR A.PARENT_OBJID = '')
AND (
MH.PROJECT_OBJID::VARCHAR = #{PROJECT_MGMT_OBJID}
OR MH.OBJID::VARCHAR = #{PROJECT_MGMT_OBJID}
)
<!-- STATUS 조건 제거하여 모든 데이터 조회 -->
UNION ALL
SELECT
B.MBOM_HEADER_OBJID,
B.OBJID,
B.PARENT_OBJID,
B.CHILD_OBJID,
B.PART_OBJID,
B.PART_NO,
B.PART_NAME,
B.QTY,
B.QTY,
B.QTY,
B.REGDATE,
B.SEQ,
B.STATUS,
LEV + 1,
PATH||B.CHILD_OBJID::TEXT,
PATH2||B.SEQ::TEXT,
B.PARENT_OBJID = ANY(PATH),
B.UNIT,
B.SUPPLY_TYPE,
B.MAKE_OR_BUY,
B.RAW_MATERIAL_PART_NO,
B.RAW_MATERIAL_SPEC,
B.RAW_MATERIAL,
B.RAW_MATERIAL_SIZE,
B.PROCESSING_VENDOR,
B.PROCESSING_DEADLINE,
B.GRINDING_DEADLINE,
B.REQUIRED_QTY,
B.ORDER_QTY,
B.PRODUCTION_QTY,
B.STOCK_QTY,
B.SHORTAGE_QTY,
B.VENDOR,
B.UNIT_PRICE,
B.TOTAL_PRICE,
B.CURRENCY,
B.LEAD_TIME,
B.MIN_ORDER_QTY,
B.WRITER,
B.EDITER,
B.EDIT_DATE,
B.REMARK,
COALESCE(B.USE_YN, 'Y'),
COALESCE(B.NET_QTY, 0),
COALESCE(B.PO_QTY, 0),
B.PROPOSAL_DATE,
B.PROCESSING_PROPOSAL_DATE,
COALESCE(B.PROCESSING_UNIT_PRICE, 0),
COALESCE(B.PROCESSING_TOTAL_PRICE, 0),
COALESCE(B.GRAND_TOTAL_PRICE, 0)
FROM
MBOM_DETAIL B
JOIN
VIEW_BOM
ON B.PARENT_OBJID = VIEW_BOM.CHILD_OBJID
AND VIEW_BOM.MBOM_HEADER_OBJID = B.MBOM_HEADER_OBJID
<!-- STATUS 조건 제거하여 모든 데이터 조회 -->
)
SELECT
V.MBOM_HEADER_OBJID AS BOM_REPORT_OBJID,
V.OBJID,
V.PARENT_OBJID,
V.CHILD_OBJID,
V.PART_OBJID,
V.PART_OBJID AS LAST_PART_OBJID,
V.PART_OBJID AS BOM_LAST_PART_OBJID,
V.PART_NO,
V.PART_NAME,
V.QTY,
V.ITEM_QTY,
V.QTY_TEMP,
V.LEV AS LEVEL,
(SELECT COUNT(*) FROM MBOM_DETAIL WHERE PARENT_OBJID = V.CHILD_OBJID) AS SUB_PART_CNT,
V.SEQ,
V.STATUS,
-- M-BOM 전용 필드
V.UNIT,
V.SUPPLY_TYPE,
V.MAKE_OR_BUY,
V.RAW_MATERIAL_PART_NO AS RAW_MATERIAL_NO,
V.RAW_MATERIAL_SPEC,
V.RAW_MATERIAL,
V.RAW_MATERIAL_SIZE AS SIZE,
V.PROCESSING_VENDOR,
V.PROCESSING_DEADLINE,
V.GRINDING_DEADLINE,
V.REQUIRED_QTY,
V.ORDER_QTY,
V.PRODUCTION_QTY,
V.STOCK_QTY,
V.SHORTAGE_QTY,
V.VENDOR AS VENDOR_PM,
(SELECT SUPPLY_NAME FROM ADMIN_SUPPLY_MNG WHERE OBJID::VARCHAR = V.VENDOR) AS VENDOR_NAME,
V.UNIT_PRICE,
V.TOTAL_PRICE,
V.CURRENCY,
V.LEAD_TIME,
V.MIN_ORDER_QTY,
V.WRITER,
TO_CHAR(V.REGDATE, 'YYYY-MM-DD HH24:MI:SS') AS REGDATE,
V.EDITER,
CASE WHEN V.EDIT_DATE IS NOT NULL THEN TO_CHAR(V.EDIT_DATE, 'YYYY-MM-DD HH24:MI:SS') ELSE NULL END AS EDIT_DATE,
V.REMARK,
-- E-BOM 호환 필드
NULL AS PARENT_PART_NO,
NULL AS CONTRACT_OBJID,
CASE WHEN V.LEV = 1 THEN V.OBJID ELSE NULL END AS ROOT_OBJID,
CASE WHEN V.LEV = 1 THEN V.OBJID ELSE NULL END AS SUB_ROOT_OBJID,
1 AS LEAF,
-- PART_MNG 테이블에서 추가 정보 (LEFT JOIN으로 PART_MNG에 없는 품번도 표시)
P.SPEC,
COALESCE(P.MATERIAL, V.RAW_MATERIAL) AS MATERIAL,
P.WEIGHT,
P.PART_TYPE,
P.REVISION,
COALESCE(P.MAKER, V.VENDOR) AS VENDOR,
P.THICKNESS,
P.WIDTH,
P.HEIGHT,
P.OUT_DIAMETER,
P.IN_DIAMETER,
P.LENGTH,
P.SOURCING_CODE,
COALESCE(P.HEAT_TREATMENT_HARDNESS, '') AS HEAT_TREATMENT_HARDNESS,
COALESCE(P.HEAT_TREATMENT_METHOD, '') AS HEAT_TREATMENT_METHOD,
COALESCE(P.SURFACE_TREATMENT, '') AS SURFACE_TREATMENT,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = P.UNIT) AS UNIT_TITLE,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = P.PART_TYPE) AS PART_TYPE_TITLE,
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE P.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('3D_CAD')) AS CU01_CNT,
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE P.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('2D_DRAWING_CAD')) AS CU02_CNT,
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE P.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('2D_PDF_CAD')) AS CU03_CNT,
V.LEV,
-- 구매 컬럼들 (VIEW_BOM에서 가져온 MBOM_DETAIL 값)
V.USE_YN,
V.NET_QTY,
V.PO_QTY,
V.PROPOSAL_DATE,
V.PROCESSING_PROPOSAL_DATE,
V.PROCESSING_UNIT_PRICE,
V.PROCESSING_TOTAL_PRICE,
V.GRAND_TOTAL_PRICE,
'MBOM' AS DATA_SOURCE -- 데이터 소스 구분용
FROM VIEW_BOM V
LEFT JOIN PART_MNG P ON P.OBJID::VARCHAR = V.PART_OBJID::VARCHAR
WHERE 1=1
AND COALESCE(V.PRODUCTION_QTY, 0) > 0 -- 제작수량이 0인 항목 제외
ORDER BY V.PATH2
</select>
<!-- PROJECT_OBJID로 MBOM_HEADER 조회 (PROJECT_MGMT.SOURCE_MBOM_OBJID 우선 사용) -->
<select id="getMbomHeaderByProjectId" parameterType="map" resultType="map">
SELECT
COALESCE(PM.SOURCE_MBOM_OBJID::VARCHAR, MH.OBJID::VARCHAR) AS OBJID,
PM.OBJID AS PROJECT_OBJID,
PM.PROJECT_NO
FROM PROJECT_MGMT PM
LEFT JOIN MBOM_HEADER MH ON MH.PROJECT_OBJID = PM.OBJID
WHERE PM.OBJID::VARCHAR = #{projectObjId}
ORDER BY MH.REGDATE DESC
LIMIT 1
</select>
<!-- 구매리스트 저장 - MBOM_DETAIL 업데이트 -->
<update id="updateMbomDetailForPurchase" parameterType="map">
UPDATE MBOM_DETAIL SET
USE_YN = #{USE_YN},
NET_QTY = COALESCE(NULLIF(TRIM(#{NET_QTY}::TEXT), '')::NUMERIC, 0),
PO_QTY = COALESCE(NULLIF(TRIM(#{PO_QTY}::TEXT), '')::NUMERIC, 0),
VENDOR = #{VENDOR_PM},
PROCESSING_VENDOR = #{PROCESSING_VENDOR},
UNIT_PRICE = COALESCE(NULLIF(TRIM(#{UNIT_PRICE}::TEXT), '')::NUMERIC, 0),
TOTAL_PRICE = COALESCE(NULLIF(TRIM(#{TOTAL_PRICE}::TEXT), '')::NUMERIC, 0),
PROCESSING_UNIT_PRICE = COALESCE(NULLIF(TRIM(#{PROCESSING_UNIT_PRICE}::TEXT), '')::NUMERIC, 0),
PROCESSING_TOTAL_PRICE = COALESCE(NULLIF(TRIM(#{PROCESSING_TOTAL_PRICE}::TEXT), '')::NUMERIC, 0),
GRAND_TOTAL_PRICE = COALESCE(NULLIF(TRIM(#{GRAND_TOTAL_PRICE}::TEXT), '')::NUMERIC, 0),
EDITER = #{EDITER},
EDIT_DATE = NOW()
WHERE OBJID::VARCHAR = #{OBJID}
</update>
<!-- 구매리스트 저장 - SALES_REQUEST_PART 업데이트 -->
<update id="updateSalesRequestPartForPurchase" parameterType="map">
UPDATE SALES_REQUEST_PART SET
USE_YN = #{USE_YN},
NET_QTY = COALESCE(NULLIF(TRIM(#{NET_QTY}::TEXT), '')::NUMERIC, 0),
PO_QTY = COALESCE(NULLIF(TRIM(#{PO_QTY}::TEXT), '')::NUMERIC, 0),
VENDOR_PM = #{VENDOR_PM},
PROCESSING_VENDOR = #{PROCESSING_VENDOR},
UNIT_PRICE = COALESCE(NULLIF(TRIM(#{UNIT_PRICE}::TEXT), '')::NUMERIC, 0),
TOTAL_PRICE = COALESCE(NULLIF(TRIM(#{TOTAL_PRICE}::TEXT), '')::NUMERIC, 0),
PROCESSING_UNIT_PRICE = COALESCE(NULLIF(TRIM(#{PROCESSING_UNIT_PRICE}::TEXT), '')::NUMERIC, 0),
PROCESSING_TOTAL_PRICE = COALESCE(NULLIF(TRIM(#{PROCESSING_TOTAL_PRICE}::TEXT), '')::NUMERIC, 0),
GRAND_TOTAL_PRICE = COALESCE(NULLIF(TRIM(#{GRAND_TOTAL_PRICE}::TEXT), '')::NUMERIC, 0),
WRITER = #{EDITER}
WHERE OBJID::VARCHAR = #{OBJID}
</update>
<!-- 프로젝트로 구매요청서 조회 (수동 작성 포함) -->
<select id="getSalesRequestMasterByProjectNo" parameterType="map" resultType="map">
SELECT
OBJID,
REQUEST_MNG_NO,
PROJECT_NO,
MBOM_HEADER_OBJID,
STATUS
FROM
SALES_REQUEST_MASTER
WHERE
PROJECT_NO = #{PROJECT_NO}
ORDER BY REGDATE DESC
</select>
<!-- 다음 요청번호 생성 (R + YYYYMMDD + - + 3자리 순번) - 구매요청서용 -->
<select id="getNextRequestMngNo" resultType="string">
SELECT 'R'||TO_CHAR(NOW(),'YYYYMMDD')||'-'||LPAD((COALESCE(MAX(SUBSTR(REQUEST_MNG_NO,11,13)),'0')::INTEGER+1)::TEXT,3,'0')
FROM SALES_REQUEST_MASTER
WHERE DOC_TYPE IN ('PURCHASE_REQUEST', 'PURCHASE_REG') OR DOC_TYPE IS NULL
</select>
<!-- 다음 품의서 번호 생성 (P + YYYYMMDD + - + 3자리 순번) - 품의서용 -->
<select id="getNextProposalNo" resultType="string">
SELECT 'P'||TO_CHAR(NOW(),'YYYYMMDD')||'-'||LPAD((COALESCE(MAX(SUBSTR(REQUEST_MNG_NO,11,3))::INTEGER, 0)+1)::TEXT,3,'0')
FROM SALES_REQUEST_MASTER
WHERE DOC_TYPE IN ('PROPOSAL', 'PURCHASE_REG_PROPOSAL')
AND REQUEST_MNG_NO LIKE 'P'||TO_CHAR(NOW(),'YYYYMMDD')||'%'
</select>
<!-- M-BOM에서 구매리스트 생성 - SALES_REQUEST_MASTER만 생성 (SALES_REQUEST_PART는 생성 안 함) -->
<insert id="insertSalesRequestMasterFromMBom" parameterType="map">
INSERT INTO SALES_REQUEST_MASTER (
OBJID,
REQUEST_MNG_NO,
PROJECT_NO,
MBOM_HEADER_OBJID,
REQUEST_USER_ID,
STATUS,
WRITER,
REGDATE,
DOC_TYPE
) VALUES (
#{OBJID},
#{REQUEST_MNG_NO},
#{PROJECT_NO},
#{MBOM_HEADER_OBJID},
#{REQUEST_USER_ID},
#{STATUS},
#{WRITER},
NOW(),
'PURCHASE_REQUEST'
)
</insert>
<!-- ==================== 품의서 관리 ==================== -->
<!-- 품의서 대상 품목 조회 - M-BOM 기반 (MBOM_DETAIL에서 조회) - 소재단가 기준 -->
<select id="getProposalTargetPartsFromMBom" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
MD.OBJID,
MD.PART_OBJID,
PM.PART_NO,
PM.PART_NAME,
MD.QTY,
MD.UNIT_PRICE,
MD.TOTAL_PRICE,
MD.VENDOR AS VENDOR_PM,
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = MD.VENDOR) AS VENDOR_NAME,
MD.NET_QTY,
MD.PO_QTY,
MD.PRODUCTION_QTY,
'MBOM' AS DATA_SOURCE,
'MATERIAL' AS PROPOSAL_TYPE
FROM
MBOM_DETAIL MD
LEFT JOIN PART_MNG PM ON MD.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
WHERE
MD.MBOM_HEADER_OBJID = #{MBOM_HEADER_OBJID}
-- 소재단가가 입력되어 있고
AND MD.UNIT_PRICE IS NOT NULL
AND MD.UNIT_PRICE > 0
-- 공급업체가 입력되어 있고
AND MD.VENDOR IS NOT NULL
AND MD.VENDOR != ''
-- 소재 품의서가 생성되지 않은 품목만
AND MD.PROPOSAL_DATE IS NULL
ORDER BY MD.REGDATE
</select>
<!-- 품의서 대상 품목 조회 - M-BOM 기반 (MBOM_DETAIL에서 조회) - 가공단가 기준 -->
<select id="getProposalTargetPartsFromMBomProcessing" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
MD.OBJID,
MD.PART_OBJID,
PM.PART_NO,
PM.PART_NAME,
MD.QTY,
MD.PROCESSING_UNIT_PRICE AS UNIT_PRICE,
MD.PROCESSING_TOTAL_PRICE AS TOTAL_PRICE,
MD.PROCESSING_VENDOR AS VENDOR_PM,
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = MD.PROCESSING_VENDOR) AS VENDOR_NAME,
MD.NET_QTY,
MD.PO_QTY,
MD.PRODUCTION_QTY,
'MBOM' AS DATA_SOURCE,
'PROCESSING' AS PROPOSAL_TYPE
FROM
MBOM_DETAIL MD
LEFT JOIN PART_MNG PM ON MD.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
WHERE
MD.MBOM_HEADER_OBJID = #{MBOM_HEADER_OBJID}
-- 가공단가가 입력되어 있고
AND MD.PROCESSING_UNIT_PRICE IS NOT NULL
AND MD.PROCESSING_UNIT_PRICE > 0
-- 가공업체가 입력되어 있고
AND MD.PROCESSING_VENDOR IS NOT NULL
AND MD.PROCESSING_VENDOR != ''
-- 가공 품의서가 생성되지 않은 품목만
AND MD.PROCESSING_PROPOSAL_DATE IS NULL
ORDER BY MD.REGDATE
</select>
<!-- 품의서 대상 제외 품목 조회 - M-BOM 기반 (소재단가O, 공급업체X) -->
<select id="getProposalExcludedPartsFromMBom" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
MD.OBJID,
MD.PART_OBJID,
PM.PART_NO,
PM.PART_NAME,
MD.QTY,
MD.UNIT_PRICE,
MD.TOTAL_PRICE,
'MBOM' AS DATA_SOURCE,
'MATERIAL' AS PROPOSAL_TYPE
FROM
MBOM_DETAIL MD
LEFT JOIN PART_MNG PM ON MD.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
WHERE
MD.MBOM_HEADER_OBJID = #{MBOM_HEADER_OBJID}
-- 소재단가가 입력되어 있고
AND MD.UNIT_PRICE IS NOT NULL
AND MD.UNIT_PRICE > 0
-- 공급업체가 미입력
AND (MD.VENDOR IS NULL OR MD.VENDOR = '')
-- 소재 품의서가 생성되지 않은 품목만
AND MD.PROPOSAL_DATE IS NULL
ORDER BY MD.REGDATE
</select>
<!-- 품의서 대상 제외 품목 조회 - M-BOM 기반 (가공단가O, 가공업체X) -->
<select id="getProposalExcludedPartsFromMBomProcessing" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
MD.OBJID,
MD.PART_OBJID,
PM.PART_NO,
PM.PART_NAME,
MD.QTY,
MD.PROCESSING_UNIT_PRICE AS UNIT_PRICE,
MD.PROCESSING_TOTAL_PRICE AS TOTAL_PRICE,
'MBOM' AS DATA_SOURCE,
'PROCESSING' AS PROPOSAL_TYPE
FROM
MBOM_DETAIL MD
LEFT JOIN PART_MNG PM ON MD.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
WHERE
MD.MBOM_HEADER_OBJID = #{MBOM_HEADER_OBJID}
-- 가공단가가 입력되어 있고
AND MD.PROCESSING_UNIT_PRICE IS NOT NULL
AND MD.PROCESSING_UNIT_PRICE > 0
-- 가공업체가 미입력
AND (MD.PROCESSING_VENDOR IS NULL OR MD.PROCESSING_VENDOR = '')
-- 가공 품의서가 생성되지 않은 품목만
AND MD.PROCESSING_PROPOSAL_DATE IS NULL
ORDER BY MD.REGDATE
</select>
<!-- 품의서 대상 품목 조회 - 수동 작성 (SALES_REQUEST_PART에서 조회) - 소재단가 기준 -->
<select id="getProposalTargetPartsFromManual" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
SRP.OBJID,
SRP.PART_OBJID,
PM.PART_NO,
PM.PART_NAME,
SRP.QTY,
SRP.UNIT_PRICE,
SRP.TOTAL_PRICE,
SRP.VENDOR_PM,
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = SRP.VENDOR_PM) AS VENDOR_NAME,
SRP.NET_QTY,
SRP.PO_QTY,
SRP.PRODUCTION_QTY,
'MANUAL' AS DATA_SOURCE,
'MATERIAL' AS PROPOSAL_TYPE
FROM
SALES_REQUEST_PART SRP
LEFT JOIN PART_MNG PM ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
WHERE
SRP.SALES_REQUEST_MASTER_OBJID = #{SALES_REQUEST_MASTER_OBJID}
-- 소재단가가 입력되어 있고
AND SRP.UNIT_PRICE IS NOT NULL
AND SRP.UNIT_PRICE > 0
-- 공급업체가 입력되어 있고
AND SRP.VENDOR_PM IS NOT NULL
AND SRP.VENDOR_PM != ''
-- 소재 품의서가 생성되지 않은 품목만
AND SRP.PROPOSAL_DATE IS NULL
ORDER BY SRP.REGDATE
</select>
<!-- 품의서 대상 품목 조회 - 수동 작성 (SALES_REQUEST_PART에서 조회) - 가공단가 기준 -->
<select id="getProposalTargetPartsFromManualProcessing" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
SRP.OBJID,
SRP.PART_OBJID,
PM.PART_NO,
PM.PART_NAME,
SRP.QTY,
SRP.PROCESSING_UNIT_PRICE AS UNIT_PRICE,
SRP.PROCESSING_TOTAL_PRICE AS TOTAL_PRICE,
SRP.PROCESSING_VENDOR AS VENDOR_PM,
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = SRP.PROCESSING_VENDOR) AS VENDOR_NAME,
SRP.NET_QTY,
SRP.PO_QTY,
SRP.PRODUCTION_QTY,
'MANUAL' AS DATA_SOURCE,
'PROCESSING' AS PROPOSAL_TYPE
FROM
SALES_REQUEST_PART SRP
LEFT JOIN PART_MNG PM ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
WHERE
SRP.SALES_REQUEST_MASTER_OBJID = #{SALES_REQUEST_MASTER_OBJID}
-- 가공단가가 입력되어 있고
AND SRP.PROCESSING_UNIT_PRICE IS NOT NULL
AND SRP.PROCESSING_UNIT_PRICE > 0
-- 가공업체가 입력되어 있고
AND SRP.PROCESSING_VENDOR IS NOT NULL
AND SRP.PROCESSING_VENDOR != ''
-- 가공 품의서가 생성되지 않은 품목만
AND SRP.PROCESSING_PROPOSAL_DATE IS NULL
ORDER BY SRP.REGDATE
</select>
<!-- 품의서 대상 제외 품목 조회 - 수동 작성 (소재단가O, 공급업체X) -->
<select id="getProposalExcludedPartsFromManual" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
SRP.OBJID,
SRP.PART_OBJID,
PM.PART_NO,
PM.PART_NAME,
SRP.QTY,
SRP.UNIT_PRICE,
SRP.TOTAL_PRICE,
'MANUAL' AS DATA_SOURCE,
'MATERIAL' AS PROPOSAL_TYPE
FROM
SALES_REQUEST_PART SRP
LEFT JOIN PART_MNG PM ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
WHERE
SRP.SALES_REQUEST_MASTER_OBJID = #{SALES_REQUEST_MASTER_OBJID}
-- 소재단가가 입력되어 있고
AND SRP.UNIT_PRICE IS NOT NULL
AND SRP.UNIT_PRICE > 0
-- 공급업체가 미입력
AND (SRP.VENDOR_PM IS NULL OR SRP.VENDOR_PM = '')
-- 소재 품의서가 생성되지 않은 품목만
AND SRP.PROPOSAL_DATE IS NULL
ORDER BY SRP.REGDATE
</select>
<!-- 품의서 대상 제외 품목 조회 - 수동 작성 (가공단가O, 가공업체X) -->
<select id="getProposalExcludedPartsFromManualProcessing" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
SRP.OBJID,
SRP.PART_OBJID,
PM.PART_NO,
PM.PART_NAME,
SRP.QTY,
SRP.PROCESSING_UNIT_PRICE AS UNIT_PRICE,
SRP.PROCESSING_TOTAL_PRICE AS TOTAL_PRICE,
'MANUAL' AS DATA_SOURCE,
'PROCESSING' AS PROPOSAL_TYPE
FROM
SALES_REQUEST_PART SRP
LEFT JOIN PART_MNG PM ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
WHERE
SRP.SALES_REQUEST_MASTER_OBJID = #{SALES_REQUEST_MASTER_OBJID}
-- 가공단가가 입력되어 있고
AND SRP.PROCESSING_UNIT_PRICE IS NOT NULL
AND SRP.PROCESSING_UNIT_PRICE > 0
-- 가공업체가 미입력
AND (SRP.PROCESSING_VENDOR IS NULL OR SRP.PROCESSING_VENDOR = '')
-- 가공 품의서가 생성되지 않은 품목만
AND SRP.PROCESSING_PROPOSAL_DATE IS NULL
ORDER BY SRP.REGDATE
</select>
<!-- 품의서 생성 (SALES_REQUEST_MASTER에 INSERT) -->
<insert id="insertProposal" parameterType="map">
INSERT INTO SALES_REQUEST_MASTER (
OBJID,
REQUEST_MNG_NO,
PROJECT_NO,
MBOM_HEADER_OBJID,
PURCHASE_TYPE,
ORDER_TYPE,
PRODUCT_NAME,
AREA_CD,
CUSTOMER_OBJID,
PAID_TYPE,
REQUEST_USER_ID,
STATUS,
WRITER,
REGDATE,
DOC_TYPE
) VALUES (
#{OBJID},
#{REQUEST_MNG_NO},
#{PROJECT_NO},
#{MBOM_HEADER_OBJID},
#{PURCHASE_TYPE},
#{ORDER_TYPE},
#{PRODUCT_NAME},
#{AREA_CD},
#{CUSTOMER_OBJID},
#{PAID_TYPE},
#{REQUEST_USER_ID},
'create',
#{WRITER},
NOW(),
#{DOC_TYPE}
)
</insert>
<!-- 품의서용 SALES_REQUEST_PART 생성 (M-BOM 기반 품목 복사) - 소재 -->
<insert id="insertProposalPartFromMBom" parameterType="map">
INSERT INTO SALES_REQUEST_PART (
OBJID,
SALES_REQUEST_MASTER_OBJID,
PART_OBJID,
QTY,
UNIT_PRICE,
TOTAL_PRICE,
VENDOR_PM,
NET_QTY,
PO_QTY,
USE_YN,
PROPOSAL_DATE,
WRITER,
REGDATE
)
SELECT
#{NEW_OBJID},
#{PROPOSAL_MASTER_OBJID},
PART_OBJID,
QTY,
UNIT_PRICE,
TOTAL_PRICE,
VENDOR AS VENDOR_PM,
NET_QTY,
PO_QTY,
USE_YN,
NOW() AS PROPOSAL_DATE,
#{WRITER},
NOW()
FROM MBOM_DETAIL
WHERE OBJID = #{SOURCE_OBJID}
</insert>
<!-- 품의서용 SALES_REQUEST_PART 생성 (M-BOM 기반 품목 복사) - 가공 -->
<insert id="insertProposalPartFromMBomProcessing" parameterType="map">
INSERT INTO SALES_REQUEST_PART (
OBJID,
SALES_REQUEST_MASTER_OBJID,
PART_OBJID,
QTY,
UNIT_PRICE,
TOTAL_PRICE,
VENDOR_PM,
NET_QTY,
PO_QTY,
USE_YN,
PROPOSAL_DATE,
WRITER,
REGDATE
)
SELECT
#{NEW_OBJID},
#{PROPOSAL_MASTER_OBJID},
PART_OBJID,
PRODUCTION_QTY AS QTY,
PROCESSING_UNIT_PRICE AS UNIT_PRICE,
PROCESSING_TOTAL_PRICE AS TOTAL_PRICE,
PROCESSING_VENDOR AS VENDOR_PM,
NET_QTY,
PO_QTY,
USE_YN,
NOW() AS PROPOSAL_DATE,
#{WRITER},
NOW()
FROM MBOM_DETAIL
WHERE OBJID = #{SOURCE_OBJID}
</insert>
<!-- 품의서용 SALES_REQUEST_PART 생성 (수동 작성 품목 복사) - 소재 -->
<insert id="insertProposalPartFromManual" parameterType="map">
INSERT INTO SALES_REQUEST_PART (
OBJID,
SALES_REQUEST_MASTER_OBJID,
PART_OBJID,
QTY,
UNIT_PRICE,
TOTAL_PRICE,
VENDOR_PM,
NET_QTY,
PO_QTY,
USE_YN,
PROPOSAL_DATE,
WRITER,
REGDATE
)
SELECT
#{NEW_OBJID},
#{PROPOSAL_MASTER_OBJID},
PART_OBJID,
QTY,
UNIT_PRICE,
TOTAL_PRICE,
VENDOR_PM,
NET_QTY,
PO_QTY,
USE_YN,
NOW() AS PROPOSAL_DATE,
#{WRITER},
NOW()
FROM SALES_REQUEST_PART
WHERE OBJID = #{SOURCE_OBJID}
</insert>
<!-- 품의서용 SALES_REQUEST_PART 생성 (수동 작성 품목 복사) - 가공 -->
<insert id="insertProposalPartFromManualProcessing" parameterType="map">
INSERT INTO SALES_REQUEST_PART (
OBJID,
SALES_REQUEST_MASTER_OBJID,
PART_OBJID,
QTY,
UNIT_PRICE,
TOTAL_PRICE,
VENDOR_PM,
NET_QTY,
PO_QTY,
USE_YN,
PROPOSAL_DATE,
WRITER,
REGDATE
)
SELECT
#{NEW_OBJID},
#{PROPOSAL_MASTER_OBJID},
PART_OBJID,
PRODUCTION_QTY AS QTY,
PROCESSING_UNIT_PRICE AS UNIT_PRICE,
PROCESSING_TOTAL_PRICE AS TOTAL_PRICE,
PROCESSING_VENDOR AS VENDOR_PM,
NET_QTY,
PO_QTY,
USE_YN,
NOW() AS PROPOSAL_DATE,
#{WRITER},
NOW()
FROM SALES_REQUEST_PART
WHERE OBJID = #{SOURCE_OBJID}
</insert>
<!-- 품의서 생성 후 PROPOSAL_DATE 업데이트 (수동 작성 - SALES_REQUEST_PART) - 소재 -->
<update id="updateProposalDateForManualParts" parameterType="map">
UPDATE SALES_REQUEST_PART
SET PROPOSAL_DATE = NOW()
WHERE OBJID IN
<foreach collection="PART_OBJIDS" item="objid" open="(" separator="," close=")">
#{objid}
</foreach>
</update>
<!-- 품의서 생성 후 PROCESSING_PROPOSAL_DATE 업데이트 (수동 작성 - SALES_REQUEST_PART) - 가공 -->
<update id="updateProcessingProposalDateForManualParts" parameterType="map">
UPDATE SALES_REQUEST_PART
SET PROCESSING_PROPOSAL_DATE = NOW()
WHERE OBJID IN
<foreach collection="PART_OBJIDS" item="objid" open="(" separator="," close=")">
#{objid}
</foreach>
</update>
<!-- 품의서 생성 후 PROPOSAL_DATE 업데이트 (M-BOM - MBOM_DETAIL) - 소재 -->
<!-- 동일 품번(PART_OBJID)의 모든 MBOM_DETAIL 행 업데이트 (품번 합쳐진 경우 대응) -->
<update id="updateProposalDateForMBomParts" parameterType="map">
UPDATE MBOM_DETAIL
SET PROPOSAL_DATE = NOW()
WHERE OBJID IN (
SELECT MD2.OBJID
FROM MBOM_DETAIL MD2
WHERE MD2.PART_OBJID IN (
SELECT MD3.PART_OBJID FROM MBOM_DETAIL MD3 WHERE MD3.OBJID IN
<foreach collection="PART_OBJIDS" item="objid" open="(" separator="," close=")">
#{objid}
</foreach>
)
AND MD2.MBOM_HEADER_OBJID IN (
SELECT MD3.MBOM_HEADER_OBJID FROM MBOM_DETAIL MD3 WHERE MD3.OBJID IN
<foreach collection="PART_OBJIDS" item="objid" open="(" separator="," close=")">
#{objid}
</foreach>
)
)
</update>
<!-- 품의서 생성 후 PROCESSING_PROPOSAL_DATE 업데이트 (M-BOM - MBOM_DETAIL) - 가공 -->
<!-- 동일 품번(PART_OBJID)의 모든 MBOM_DETAIL 행 업데이트 (품번 합쳐진 경우 대응) -->
<update id="updateProcessingProposalDateForMBomParts" parameterType="map">
UPDATE MBOM_DETAIL
SET PROCESSING_PROPOSAL_DATE = NOW()
WHERE OBJID IN (
SELECT MD2.OBJID
FROM MBOM_DETAIL MD2
WHERE MD2.PART_OBJID IN (
SELECT MD3.PART_OBJID FROM MBOM_DETAIL MD3 WHERE MD3.OBJID IN
<foreach collection="PART_OBJIDS" item="objid" open="(" separator="," close=")">
#{objid}
</foreach>
)
AND MD2.MBOM_HEADER_OBJID IN (
SELECT MD3.MBOM_HEADER_OBJID FROM MBOM_DETAIL MD3 WHERE MD3.OBJID IN
<foreach collection="PART_OBJIDS" item="objid" open="(" separator="," close=")">
#{objid}
</foreach>
)
)
</update>
<!-- 품의서 목록 조회 -->
<select id="getProposalMngGridList" parameterType="map" resultType="map">
SELECT
SRM.OBJID,
SRM.REQUEST_MNG_NO AS PROPOSAL_NO,
-- 발주서 No
(SELECT STRING_AGG(PURCHASE_ORDER_NO, ', ') FROM PURCHASE_ORDER_MASTER WHERE SALES_REQUEST_OBJID = SRM.OBJID) AS PURCHASE_ORDER_NO,
SRM.PROJECT_NO,
(SELECT PROJECT_NO FROM PROJECT_MGMT PM WHERE PM.OBJID = SRM.PROJECT_NO) AS PROJECT_NUMBER,
SRM.PURCHASE_TYPE,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.PURCHASE_TYPE) AS PURCHASE_TYPE_NAME,
-- 주문유형: 프로젝트 정보(CATEGORY_CD) 우선, 없으면 SALES_REQUEST_MASTER 값
COALESCE(
(SELECT PM.CATEGORY_CD FROM PROJECT_MGMT PM WHERE PM.OBJID::VARCHAR = SRM.PROJECT_NO),
SRM.ORDER_TYPE
) AS ORDER_TYPE,
CODE_NAME(COALESCE(
(SELECT PM.CATEGORY_CD FROM PROJECT_MGMT PM WHERE PM.OBJID::VARCHAR = SRM.PROJECT_NO),
SRM.ORDER_TYPE
)) AS ORDER_TYPE_NAME,
SRM.PRODUCT_NAME,
CODE_NAME(SRM.PRODUCT_NAME) AS PRODUCT_NAME_TITLE,
-- 품번/품명 ("외 N건" 형태로 표시) - 품의서는 항상 SALES_REQUEST_PART에 데이터가 있음
(
SELECT
CASE
WHEN COUNT(*) > 1 THEN
COALESCE((SELECT PM.PART_NO FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1)), '') || ' 외 ' || (COUNT(*) - 1)::TEXT || '건'
ELSE
COALESCE((SELECT PM.PART_NO FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1)), '')
END
FROM SALES_REQUEST_PART
WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID
) AS PART_NO,
(
SELECT
CASE
WHEN COUNT(*) > 1 THEN
COALESCE((SELECT PM.PART_NAME FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1)), '') || ' 외 ' || (COUNT(*) - 1)::TEXT || '건'
ELSE
COALESCE((SELECT PM.PART_NAME FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1)), '')
END
FROM SALES_REQUEST_PART
WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID
) AS PART_NAME,
-- 공급업체 (첫번째 공급업체 + 외 N건)
(
SELECT
CASE
WHEN COUNT(DISTINCT POM.PARTNER_OBJID) > 1 THEN
COALESCE(
CASE
WHEN (SELECT PARTNER_OBJID FROM PURCHASE_ORDER_MASTER WHERE SALES_REQUEST_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1) LIKE 'C_%'
THEN (SELECT CLIENT_NM FROM CLIENT_MNG WHERE 'C_' || OBJID::VARCHAR = (SELECT PARTNER_OBJID FROM PURCHASE_ORDER_MASTER WHERE SALES_REQUEST_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1))
ELSE (SELECT SUPPLY_NAME FROM ADMIN_SUPPLY_MNG WHERE OBJID::VARCHAR = (SELECT PARTNER_OBJID FROM PURCHASE_ORDER_MASTER WHERE SALES_REQUEST_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1))
END
, '') || ' 외 ' || (COUNT(DISTINCT POM.PARTNER_OBJID) - 1)::TEXT || '건'
ELSE
COALESCE(
CASE
WHEN (SELECT PARTNER_OBJID FROM PURCHASE_ORDER_MASTER WHERE SALES_REQUEST_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1) LIKE 'C_%'
THEN (SELECT CLIENT_NM FROM CLIENT_MNG WHERE 'C_' || OBJID::VARCHAR = (SELECT PARTNER_OBJID FROM PURCHASE_ORDER_MASTER WHERE SALES_REQUEST_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1))
ELSE (SELECT SUPPLY_NAME FROM ADMIN_SUPPLY_MNG WHERE OBJID::VARCHAR = (SELECT PARTNER_OBJID FROM PURCHASE_ORDER_MASTER WHERE SALES_REQUEST_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1))
END
, '')
END
FROM PURCHASE_ORDER_MASTER POM
WHERE POM.SALES_REQUEST_OBJID = SRM.OBJID
) AS SUPPLIER_NAME,
-- 총액
(SELECT SUM(COALESCE(TOTAL_PRICE::numeric, 0)) FROM PURCHASE_ORDER_MASTER WHERE SALES_REQUEST_OBJID = SRM.OBJID) AS TOTAL_AMOUNT,
-- 메일발송 여부
-- (SELECT CASE WHEN COUNT(*) > 0 THEN 'Y' ELSE 'N' END FROM PURCHASE_ORDER_MASTER WHERE SALES_REQUEST_OBJID = SRM.OBJID AND MAIL_SENT = 'Y') AS MAIL_SENT,
-- 발주일 (일단 주석처리)
-- (SELECT TO_CHAR(MAX(ORDER_DATE), 'YYYY-MM-DD') FROM PURCHASE_ORDER_MASTER WHERE SALES_REQUEST_OBJID = SRM.OBJID) AS ORDER_DATE,
-- 상태: 아마란스 결재 > 내부 결재 > SRM.STATUS 순서로 우선
CASE
WHEN AMR.STATUS = 'complete' THEN 'approvalComplete'
WHEN AMR.STATUS = 'inProcess' THEN 'inProcess'
WHEN AMR.STATUS = 'reject' THEN 'reject'
WHEN A.ROUTE_STATUS = 'complete' THEN 'approvalComplete'
WHEN A.ROUTE_STATUS = 'inProcess' THEN 'inProcess'
WHEN A.ROUTE_STATUS = 'reject' THEN 'reject'
ELSE SRM.STATUS
END AS STATUS,
CASE
WHEN AMR.STATUS = 'complete' THEN '결재완료'
WHEN AMR.STATUS = 'inProcess' THEN '결재 상신중'
WHEN AMR.STATUS = 'reject' THEN '반려'
WHEN A.APPR_STATUS IS NOT NULL THEN A.APPR_STATUS
WHEN SRM.STATUS = 'create' THEN '등록중'
ELSE ''
END AS STATUS_TITLE,
COALESCE(AMR.STATUS, '') AS AMARANTH_STATUS,
SRM.WRITER,
(SELECT DEPT_NAME||' '||USER_NAME FROM USER_INFO WHERE USER_ID = SRM.WRITER) AS WRITER_NAME,
SRM.REGDATE,
TO_CHAR(SRM.REGDATE,'YYYY-MM-DD') AS REGDATE_TITLE,
A.APPROVAL_OBJID,
A.ROUTE_OBJID
FROM
SALES_REQUEST_MASTER SRM
LEFT OUTER JOIN AMARANTH_APPROVAL AMR
ON SRM.OBJID::VARCHAR = AMR.TARGET_OBJID
AND AMR.TARGET_TYPE = 'PROPOSAL'
LEFT OUTER JOIN (
SELECT
B.OBJID AS ROUTE_OBJID,
B.STATUS AS ROUTE_STATUS,
CASE B.STATUS
WHEN 'inProcess' THEN '결재중'
WHEN 'complete' THEN '결재완료'
WHEN 'reject' THEN '반려'
ELSE ''
END APPR_STATUS,
A.OBJID AS APPROVAL_OBJID,
A.TARGET_OBJID,
B.ROUTE_SEQ
FROM
APPROVAL A,
(
SELECT
T1.*
FROM
(
SELECT
TARGET_OBJID,
MAX(T.ROUTE_SEQ) AS ROUTE_SEQ
FROM
ROUTE T
GROUP BY
T.TARGET_OBJID
) T,
ROUTE T1
WHERE
T.TARGET_OBJID = T1.TARGET_OBJID
AND T.ROUTE_SEQ = T1.ROUTE_SEQ
) B
WHERE A.OBJID = B.APPROVAL_OBJID
AND TARGET_TYPE IN ('PROPOSAL', 'SALES_REQUEST')
) A ON SRM.OBJID::VARCHAR = A.TARGET_OBJID::VARCHAR
WHERE 1=1
AND SRM.STATUS IN ('create', 'approvalRequest', 'approvalComplete', 'reject')
<!-- PROPOSAL은 모두 조회, PURCHASE_REG_PROPOSAL은 결재완료만 조회 -->
AND (
SRM.DOC_TYPE = 'PROPOSAL'
OR (SRM.DOC_TYPE = 'PURCHASE_REG_PROPOSAL' AND A.ROUTE_STATUS = 'complete')
)
<if test="SEARCH_PROPOSAL_NO != null and !''.equals(SEARCH_PROPOSAL_NO)">
AND SRM.REQUEST_MNG_NO LIKE '%${SEARCH_PROPOSAL_NO}%'
</if>
<if test="SEARCH_PROJECT_NO != null and !''.equals(SEARCH_PROJECT_NO)">
AND (SELECT PROJECT_NO FROM PROJECT_MGMT PM WHERE PM.OBJID = SRM.PROJECT_NO) LIKE '%${SEARCH_PROJECT_NO}%'
</if>
<if test="SEARCH_STATUS != null and !''.equals(SEARCH_STATUS)">
AND (
CASE
WHEN A.ROUTE_STATUS = 'complete' THEN 'approvalComplete'
WHEN A.ROUTE_STATUS = 'inProcess' THEN 'inProcess'
WHEN A.ROUTE_STATUS = 'reject' THEN 'reject'
ELSE SRM.STATUS
END
) = #{SEARCH_STATUS}
</if>
<if test="regdate_start != null and !''.equals(regdate_start)">
AND SRM.REGDATE::DATE <![CDATA[ >= ]]> #{regdate_start}::DATE
</if>
<if test="regdate_end != null and !''.equals(regdate_end)">
AND SRM.REGDATE::DATE <![CDATA[ <= ]]> #{regdate_end}::DATE
</if>
<!-- 구매유형 검색 (멀티선택) -->
<if test="purchase_types != null and !''.equals(purchase_types)">
AND SRM.PURCHASE_TYPE IN
<foreach item="item" collection="purchase_types.split(',')" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<!-- 작성자 검색 -->
<if test="writer != null and !''.equals(writer)">
AND SRM.WRITER = #{writer}
</if>
<!-- 제품구분 검색 -->
<if test="part_type != null and !''.equals(part_type)">
AND SRM.PRODUCT_NAME = #{part_type}
</if>
ORDER BY SRM.REGDATE DESC
</select>
<!-- 구매요청_품의서 목록 조회 (PURCHASE_REG_PROPOSAL) -->
<select id="getPurchaseRegProposalMngGridList" parameterType="map" resultType="map">
SELECT
SRM.OBJID,
SRM.REQUEST_MNG_NO AS PROPOSAL_NO,
SRM.PROJECT_NO,
(SELECT PROJECT_NO FROM PROJECT_MGMT PM WHERE PM.OBJID = SRM.PROJECT_NO) AS PROJECT_NUMBER,
SRM.PURCHASE_TYPE,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.PURCHASE_TYPE) AS PURCHASE_TYPE_NAME,
COALESCE(
(SELECT PM.CATEGORY_CD FROM PROJECT_MGMT PM WHERE PM.OBJID::VARCHAR = SRM.PROJECT_NO),
SRM.ORDER_TYPE
) AS ORDER_TYPE,
CODE_NAME(COALESCE(
(SELECT PM.CATEGORY_CD FROM PROJECT_MGMT PM WHERE PM.OBJID::VARCHAR = SRM.PROJECT_NO),
SRM.ORDER_TYPE
)) AS ORDER_TYPE_NAME,
SRM.PRODUCT_NAME,
CODE_NAME(SRM.PRODUCT_NAME) AS PRODUCT_NAME_TITLE,
(
SELECT
CASE
WHEN COUNT(*) > 1 THEN
COALESCE((SELECT PM.PART_NO FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1)), '') || ' 외 ' || (COUNT(*) - 1)::TEXT || '건'
ELSE
COALESCE((SELECT PM.PART_NO FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1)), '')
END
FROM SALES_REQUEST_PART
WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID
) AS PART_NO,
(
SELECT
CASE
WHEN COUNT(*) > 1 THEN
COALESCE((SELECT PM.PART_NAME FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1)), '') || ' 외 ' || (COUNT(*) - 1)::TEXT || '건'
ELSE
COALESCE((SELECT PM.PART_NAME FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1)), '')
END
FROM SALES_REQUEST_PART
WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID
) AS PART_NAME,
CASE
WHEN A.ROUTE_STATUS = 'complete' THEN 'approvalComplete'
WHEN A.ROUTE_STATUS = 'inProcess' THEN 'inProcess'
WHEN A.ROUTE_STATUS = 'reject' THEN 'reject'
ELSE SRM.STATUS
END AS STATUS,
CASE
WHEN A.APPR_STATUS IS NOT NULL THEN A.APPR_STATUS
WHEN SRM.STATUS = 'create' THEN '작성중'
ELSE ''
END AS STATUS_TITLE,
SRM.WRITER,
(SELECT DEPT_NAME||' '||USER_NAME FROM USER_INFO WHERE USER_ID = SRM.WRITER) AS WRITER_NAME,
SRM.REGDATE,
TO_CHAR(SRM.REGDATE,'YYYY-MM-DD') AS REGDATE_TITLE,
A.APPROVAL_OBJID,
A.ROUTE_OBJID
FROM
SALES_REQUEST_MASTER SRM
LEFT OUTER JOIN (
SELECT
B.OBJID AS ROUTE_OBJID,
B.STATUS AS ROUTE_STATUS,
CASE B.STATUS
WHEN 'inProcess' THEN '결재중'
WHEN 'complete' THEN '결재완료'
WHEN 'reject' THEN '반려'
ELSE ''
END APPR_STATUS,
A.OBJID AS APPROVAL_OBJID,
A.TARGET_OBJID,
B.ROUTE_SEQ
FROM
APPROVAL A,
(
SELECT
T1.*
FROM
(
SELECT
TARGET_OBJID,
MAX(T.ROUTE_SEQ) AS ROUTE_SEQ
FROM
ROUTE T
GROUP BY
T.TARGET_OBJID
) T,
ROUTE T1
WHERE
T.TARGET_OBJID = T1.TARGET_OBJID
AND T.ROUTE_SEQ = T1.ROUTE_SEQ
) B
WHERE A.OBJID = B.APPROVAL_OBJID
AND TARGET_TYPE IN ('PROPOSAL', 'SALES_REQUEST')
) A ON SRM.OBJID::VARCHAR = A.TARGET_OBJID::VARCHAR
WHERE 1=1
AND SRM.STATUS IN ('create', 'approvalRequest', 'approvalComplete', 'reject')
AND SRM.DOC_TYPE = 'PURCHASE_REG_PROPOSAL'
<if test="SEARCH_PROPOSAL_NO != null and !''.equals(SEARCH_PROPOSAL_NO)">
AND SRM.REQUEST_MNG_NO LIKE '%${SEARCH_PROPOSAL_NO}%'
</if>
<if test="SEARCH_PROJECT_NO != null and !''.equals(SEARCH_PROJECT_NO)">
AND (SELECT PROJECT_NO FROM PROJECT_MGMT PM WHERE PM.OBJID = SRM.PROJECT_NO) LIKE '%${SEARCH_PROJECT_NO}%'
</if>
<if test="SEARCH_STATUS != null and !''.equals(SEARCH_STATUS)">
AND (
CASE
WHEN A.ROUTE_STATUS = 'complete' THEN 'approvalComplete'
WHEN A.ROUTE_STATUS = 'inProcess' THEN 'inProcess'
WHEN A.ROUTE_STATUS = 'reject' THEN 'reject'
ELSE SRM.STATUS
END
) = #{SEARCH_STATUS}
</if>
<if test="regdate_start != null and !''.equals(regdate_start)">
AND SRM.REGDATE::DATE <![CDATA[ >= ]]> #{regdate_start}::DATE
</if>
<if test="regdate_end != null and !''.equals(regdate_end)">
AND SRM.REGDATE::DATE <![CDATA[ <= ]]> #{regdate_end}::DATE
</if>
<!-- 구매유형 검색 (멀티선택) -->
<if test="purchase_types != null and !''.equals(purchase_types)">
AND SRM.PURCHASE_TYPE IN
<foreach item="item" collection="purchase_types.split(',')" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<!-- 작성자 검색 -->
<if test="writer != null and !''.equals(writer)">
AND SRM.WRITER = #{writer}
</if>
<!-- 제품구분 검색 -->
<if test="part_type != null and !''.equals(part_type)">
AND SRM.PRODUCT_NAME = #{part_type}
</if>
ORDER BY SRM.REGDATE DESC
</select>
<!-- 품의서 상세 조회 -->
<select id="getProposalInfo" parameterType="map" resultType="map">
SELECT
SRM.OBJID,
SRM.REQUEST_MNG_NO AS PROPOSAL_NO,
SRM.PROJECT_NO,
(SELECT PROJECT_NO FROM PROJECT_MGMT PM WHERE PM.OBJID = SRM.PROJECT_NO) AS PROJECT_NUMBER,
(SELECT PROJECT_NAME FROM PROJECT_MGMT PM WHERE PM.OBJID = SRM.PROJECT_NO) AS PROJECT_NAME,
-- 프로젝트의 제품구분, 고객사, 유/무상 정보 (PROJECT_MGMT에서 조회)
COALESCE(
(SELECT CODE_NAME(PRODUCT) FROM PROJECT_MGMT WHERE OBJID = SRM.PROJECT_NO),
SRM.PRODUCT_NAME
) AS PROJECT_PRODUCT,
COALESCE(
(SELECT CM.CUSTOMER_OBJID
FROM PROJECT_MGMT PM
LEFT JOIN CONTRACT_MGMT CM ON CM.OBJID = PM.CONTRACT_OBJID
WHERE PM.OBJID::VARCHAR = SRM.PROJECT_NO),
SRM.CUSTOMER_OBJID
) AS PROJECT_CUSTOMER_OBJID,
COALESCE(
(SELECT CASE WHEN CM.CUSTOMER_OBJID LIKE 'C_%' THEN (SELECT CLIENT_NM FROM CLIENT_MNG CL WHERE 'C_' || CL.OBJID::VARCHAR = CM.CUSTOMER_OBJID) ELSE SM.SUPPLY_NAME END
FROM PROJECT_MGMT PM
LEFT JOIN CONTRACT_MGMT CM ON CM.OBJID = PM.CONTRACT_OBJID
LEFT JOIN SUPPLY_MNG SM ON CM.CUSTOMER_OBJID NOT LIKE 'C_%' AND SM.OBJID::VARCHAR = CM.CUSTOMER_OBJID::VARCHAR
WHERE PM.OBJID::VARCHAR = SRM.PROJECT_NO),
(SELECT CASE WHEN SRM.CUSTOMER_OBJID LIKE 'C_%' THEN (SELECT CLIENT_NM FROM CLIENT_MNG CL WHERE 'C_' || CL.OBJID::VARCHAR = SRM.CUSTOMER_OBJID) ELSE (SELECT SUPPLY_NAME FROM SUPPLY_MNG WHERE OBJID::VARCHAR = SRM.CUSTOMER_OBJID) END)
) AS PROJECT_CUSTOMER_NAME,
COALESCE(
(SELECT CM.PAID_TYPE
FROM PROJECT_MGMT PM
LEFT JOIN CONTRACT_MGMT CM ON CM.OBJID = PM.CONTRACT_OBJID
WHERE PM.OBJID::VARCHAR = SRM.PROJECT_NO),
SRM.PAID_TYPE
) AS PROJECT_PAID_TYPE,
COALESCE(
(SELECT CASE
WHEN PAID_TYPE = 'paid' THEN '유상'
WHEN PAID_TYPE = 'free' THEN '무상'
ELSE PAID_TYPE
END
FROM PROJECT_MGMT
WHERE OBJID = SRM.PROJECT_NO),
(CASE WHEN SRM.PAID_TYPE = 'paid' THEN '유상' WHEN SRM.PAID_TYPE = 'free' THEN '무상' ELSE SRM.PAID_TYPE END)
) AS PROJECT_PAID_TYPE_NAME,
SRM.PURCHASE_TYPE,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.PURCHASE_TYPE) AS PURCHASE_TYPE_NAME,
SRM.ORDER_TYPE,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.ORDER_TYPE) AS ORDER_TYPE_NAME,
SRM.PRODUCT_NAME,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.PRODUCT_NAME) AS PRODUCT_NAME_TITLE,
SRM.AREA_CD,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.AREA_CD) AS AREA_CD_NAME,
SRM.CUSTOMER_OBJID,
CASE
WHEN SRM.CUSTOMER_OBJID LIKE 'C_%' THEN (SELECT CLIENT_NM FROM CLIENT_MNG WHERE 'C_' || OBJID::VARCHAR = SRM.CUSTOMER_OBJID)
ELSE (SELECT SUPPLY_NAME FROM SUPPLY_MNG WHERE OBJID::VARCHAR = SRM.CUSTOMER_OBJID)
END AS CUSTOMER_NAME,
SRM.PAID_TYPE,
(CASE WHEN SRM.PAID_TYPE = 'paid' THEN '유상' WHEN SRM.PAID_TYPE = 'free' THEN '무상' ELSE SRM.PAID_TYPE END) AS PAID_TYPE_NAME,
SRM.STATUS,
CASE SRM.STATUS
WHEN 'create' THEN '미결재'
WHEN 'approvalRequest' THEN '결재중'
WHEN 'approvalComplete' THEN '결재완료'
WHEN 'reject' THEN '반려'
ELSE ''
END AS STATUS_TITLE,
SRM.WRITER,
(SELECT DEPT_NAME||' '||USER_NAME FROM USER_INFO WHERE USER_ID = SRM.WRITER) AS WRITER_NAME,
(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = SRM.WRITER) AS WRITER_DEPT,
SRM.REGDATE,
TO_CHAR(SRM.REGDATE,'YYYY-MM-DD') AS REGDATE_TITLE,
TO_CHAR(SRM.REGDATE,'YYYY-MM-DD HH24:MI') AS REGDATE_TIME,
SRM.REMARK,
SRM.DOC_TYPE,
-- 품의서 추가 컬럼
SRM.RECIPIENT_REF,
SRM.EXECUTOR,
SRM.EXECUTION_DATE,
TO_CHAR(SRM.EXECUTION_DATE, 'YYYY-MM-DD') AS EXECUTION_DATE_TITLE,
SRM.TITLE
FROM
SALES_REQUEST_MASTER SRM
WHERE
SRM.OBJID = #{PROPOSAL_OBJID}
</select>
<!-- 품의서 품목 리스트 조회 -->
<select id="getProposalPartList" parameterType="map" resultType="map">
SELECT
ROW_NUMBER() OVER(ORDER BY SRP.REGDATE) AS RNUM,
SRP.OBJID,
SRP.PART_OBJID,
PM.PART_NO,
PM.PART_NAME,
PM.SPEC,
PM.MATERIAL,
SRP.UNIT,
COALESCE(
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRP.UNIT),
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = PM.UNIT)
) AS UNIT_TITLE,
SRP.QTY,
SRP.UNIT_PRICE,
SRP.TOTAL_PRICE,
SRP.VENDOR_PM,
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = SRP.VENDOR_PM) AS VENDOR_NAME,
SRP.REMARK,
SRP.DELIVERY_REQUEST_DATE,
SRP.DELIVERY_REQUEST_DATE AS DELIVERY_REQUEST_DATE_TITLE
FROM
SALES_REQUEST_PART SRP
LEFT JOIN PART_MNG PM ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
WHERE
SRP.SALES_REQUEST_MASTER_OBJID = #{PROPOSAL_OBJID}
ORDER BY SRP.REGDATE
</select>
<!-- 품의서 마스터 정보 수정 (수신및참조, 시행자, 시행일자, 제목) -->
<update id="updateProposalMaster" parameterType="map">
UPDATE SALES_REQUEST_MASTER SET
RECIPIENT_REF = #{RECIPIENT_REF},
EXECUTOR = #{EXECUTOR},
EXECUTION_DATE = CASE WHEN #{EXECUTION_DATE} IS NOT NULL AND #{EXECUTION_DATE} != '' THEN #{EXECUTION_DATE}::DATE ELSE NULL END,
TITLE = #{TITLE}
WHERE OBJID = #{PROPOSAL_OBJID}
</update>
<!-- 품의서 품목 정보 수정 (납기일, 단위, 목적) -->
<update id="updateProposalPart" parameterType="map">
UPDATE SALES_REQUEST_PART SET
DELIVERY_REQUEST_DATE = CASE WHEN #{DELIVERY_REQUEST_DATE} IS NOT NULL AND #{DELIVERY_REQUEST_DATE} != '' THEN #{DELIVERY_REQUEST_DATE} ELSE NULL END,
UNIT = #{UNIT},
REMARK = #{REMARK}
WHERE OBJID = #{PART_OBJID}
</update>
<!-- 구매리스트 품목 단일 조회 (MBOM_DETAIL에서 조회) -->
<select id="getSalesRequestPartInfo" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
MD.OBJID,
MD.MBOM_HEADER_OBJID,
MD.PART_OBJID,
PM.PART_NO,
PM.PART_NAME,
MD.RAW_MATERIAL,
MD.RAW_MATERIAL_PART_NO AS RAW_MATERIAL_NO,
MD.RAW_MATERIAL_SIZE AS SIZE,
MD.PO_QTY,
MD.PRODUCTION_QTY,
MD.UNIT_PRICE,
MD.PROCESSING_UNIT_PRICE,
MD.VENDOR AS VENDOR_PM,
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = MD.VENDOR) AS VENDOR_NAME,
MD.PROCESSING_VENDOR,
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = MD.PROCESSING_VENDOR) AS PROCESSING_VENDOR_NAME
FROM MBOM_DETAIL MD
LEFT JOIN PART_MNG PM ON MD.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
WHERE MD.OBJID = #{OBJID}
</select>
<!-- =====================================================
견적요청서 관리 쿼리
===================================================== -->
<!-- 견적요청서 목록 조회 (페이징) -->
<select id="getQuotationRequestListCount" parameterType="map" resultType="int">
SELECT COUNT(*)
FROM QUOTATION_REQUEST_MASTER QRM
LEFT JOIN SALES_REQUEST_MASTER SRM ON QRM.SALES_REQUEST_MASTER_OBJID::VARCHAR = SRM.OBJID::VARCHAR
LEFT JOIN PROJECT_MGMT PM ON PM.OBJID = SRM.PROJECT_NO
LEFT JOIN CONTRACT_MGMT CTM ON CTM.OBJID = PM.CONTRACT_OBJID
WHERE 1=1
<if test="SALES_REQUEST_MASTER_OBJID != null and SALES_REQUEST_MASTER_OBJID != ''">
AND QRM.SALES_REQUEST_MASTER_OBJID::VARCHAR = #{SALES_REQUEST_MASTER_OBJID}
</if>
<if test="Year != null and Year != ''">
AND TO_CHAR(QRM.REG_DATE, 'YYYY') = #{Year}
</if>
<if test="QUOTATION_REQUEST_NO != null and QUOTATION_REQUEST_NO != ''">
AND QRM.QUOTATION_REQUEST_NO LIKE '%' || #{QUOTATION_REQUEST_NO} || '%'
</if>
<!-- 프로젝트번호 검색 (OBJID로 비교) -->
<if test="PROJECT_NO != null and PROJECT_NO != ''">
AND SRM.PROJECT_NO = #{PROJECT_NO}
</if>
<!-- 공급업체 검색 -->
<if test="VENDOR_OBJID != null and VENDOR_OBJID != ''">
AND QRM.VENDOR_OBJID::VARCHAR = #{VENDOR_OBJID}
</if>
<if test="STATUS != null and STATUS != ''">
AND QRM.STATUS = #{STATUS}
</if>
<!-- 작성자 검색 -->
<if test="writer != null and writer != ''">
AND QRM.WRITER = #{writer}
</if>
<!-- 제품구분 검색 -->
<if test="part_type != null and part_type != ''">
AND (SRM.PRODUCT_NAME = #{part_type} OR CTM.PRODUCT = #{part_type})
</if>
</select>
<select id="getQuotationRequestList" parameterType="map" resultType="map">
SELECT
QRM.OBJID,
QRM.QUOTATION_REQUEST_NO,
QRM.SALES_REQUEST_MASTER_OBJID,
QRM.PROJECT_MGMT_OBJID,
QRM.VENDOR_OBJID,
QRM.VENDOR_TYPE,
QRM.STATUS,
CASE
WHEN QRM.STATUS = 'create' THEN '작성중'
WHEN QRM.STATUS = 'sent' THEN '발송완료'
WHEN QRM.STATUS = 'received' THEN '견적수신'
WHEN QRM.STATUS = 'completed' THEN '완료'
ELSE QRM.STATUS
END AS STATUS_NAME,
QRM.MAIL_SEND_DATE,
TO_CHAR(QRM.MAIL_SEND_DATE, 'YYYY-MM-DD') AS MAIL_SEND_DATE_TITLE,
QRM.MAIL_SEND_YN,
QRM.DUE_DATE,
TO_CHAR(QRM.DUE_DATE, 'YYYY-MM-DD') AS DUE_DATE_TITLE,
QRM.REMARK,
QRM.WRITER,
(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = QRM.WRITER) AS WRITER_NAME,
QRM.REG_DATE,
TO_CHAR(QRM.REG_DATE, 'YYYY-MM-DD') AS REG_DATE_TITLE,
-- 구매요청서 정보
SRM.REQUEST_MNG_NO,
SRM.PURCHASE_TYPE,
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = SRM.PURCHASE_TYPE) AS PURCHASE_TYPE_NAME,
-- 주문유형
COALESCE(PM.CATEGORY_CD, SRM.ORDER_TYPE) AS ORDER_TYPE,
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = COALESCE(PM.CATEGORY_CD, SRM.ORDER_TYPE)) AS ORDER_TYPE_NAME,
-- 제품구분
COALESCE(
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = CTM.PRODUCT),
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = SRM.PRODUCT_NAME)
) AS PRODUCT_NAME_TITLE,
-- 프로젝트번호
PM.PROJECT_NO AS PROJECT_NUMBER,
-- 업체 정보
CM.CLIENT_NM AS VENDOR_NAME,
-- 품번/품명 (견적요청서 상세 - 첫 번째 품목)
(SELECT QRD.PART_NO FROM QUOTATION_REQUEST_DETAIL QRD
WHERE QRD.QUOTATION_REQUEST_MASTER_OBJID = QRM.OBJID
ORDER BY QRD.OBJID LIMIT 1) AS PART_NO,
(SELECT QRD.PART_NAME FROM QUOTATION_REQUEST_DETAIL QRD
WHERE QRD.QUOTATION_REQUEST_MASTER_OBJID = QRM.OBJID
ORDER BY QRD.OBJID LIMIT 1) AS PART_NAME,
-- 견적요청서 상세 품목 개수
(SELECT COUNT(*) FROM QUOTATION_REQUEST_DETAIL QRD
WHERE QRD.QUOTATION_REQUEST_MASTER_OBJID = QRM.OBJID) AS DETAIL_COUNT,
-- 수신견적서 첨부파일 개수
(SELECT COUNT(*) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = QRM.OBJID::VARCHAR AND DOC_TYPE = 'QUOTATION_RECEIVED' AND STATUS = 'Active') AS ATTACH_FILE_CNT
FROM QUOTATION_REQUEST_MASTER QRM
LEFT JOIN SALES_REQUEST_MASTER SRM ON QRM.SALES_REQUEST_MASTER_OBJID::VARCHAR = SRM.OBJID::VARCHAR
LEFT JOIN PROJECT_MGMT PM ON PM.OBJID = SRM.PROJECT_NO
LEFT JOIN CONTRACT_MGMT CTM ON CTM.OBJID = PM.CONTRACT_OBJID
LEFT JOIN CLIENT_MNG CM ON QRM.VENDOR_OBJID::VARCHAR = CM.OBJID::VARCHAR
WHERE 1=1
<if test="SALES_REQUEST_MASTER_OBJID != null and SALES_REQUEST_MASTER_OBJID != ''">
AND QRM.SALES_REQUEST_MASTER_OBJID::VARCHAR = #{SALES_REQUEST_MASTER_OBJID}
</if>
<if test="Year != null and Year != ''">
AND TO_CHAR(QRM.REG_DATE, 'YYYY') = #{Year}
</if>
<if test="QUOTATION_REQUEST_NO != null and QUOTATION_REQUEST_NO != ''">
AND QRM.QUOTATION_REQUEST_NO LIKE '%' || #{QUOTATION_REQUEST_NO} || '%'
</if>
<!-- 프로젝트번호 검색 (OBJID로 비교) -->
<if test="PROJECT_NO != null and PROJECT_NO != ''">
AND SRM.PROJECT_NO = #{PROJECT_NO}
</if>
<!-- 공급업체 검색 -->
<if test="VENDOR_OBJID != null and VENDOR_OBJID != ''">
AND QRM.VENDOR_OBJID::VARCHAR = #{VENDOR_OBJID}
</if>
<if test="STATUS != null and STATUS != ''">
AND QRM.STATUS = #{STATUS}
</if>
<!-- 작성자 검색 -->
<if test="writer != null and writer != ''">
AND QRM.WRITER = #{writer}
</if>
<!-- 제품구분 검색 -->
<if test="product_cd != null and product_cd != ''">
AND PM.PRODUCT = #{product_cd}
</if>
ORDER BY QRM.REG_DATE DESC
<if test="startRow != null and countPerPage != null">
OFFSET #{startRow} LIMIT #{countPerPage}
</if>
</select>
<!-- 견적요청서 마스터 정보 조회 -->
<select id="getQuotationRequestMasterInfo" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
QRM.OBJID,
QRM.QUOTATION_REQUEST_NO,
QRM.SALES_REQUEST_MASTER_OBJID,
QRM.PROJECT_MGMT_OBJID,
QRM.VENDOR_OBJID,
QRM.VENDOR_TYPE,
QRM.STATUS,
QRM.MAIL_SEND_DATE,
TO_CHAR(QRM.MAIL_SEND_DATE, 'YYYY-MM-DD') AS MAIL_SEND_DATE_TITLE,
QRM.MAIL_SEND_YN,
QRM.DUE_DATE,
TO_CHAR(QRM.DUE_DATE, 'YYYY-MM-DD') AS DUE_DATE_TITLE,
QRM.REMARK,
QRM.WRITER,
QRM.REG_DATE,
TO_CHAR(QRM.REG_DATE, 'YYYY-MM-DD') AS REG_DATE_TITLE,
-- 구매요청서 정보
SRM.REQUEST_MNG_NO,
SRM.PURCHASE_TYPE,
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = SRM.PURCHASE_TYPE) AS PURCHASE_TYPE_NAME,
-- 주문유형
COALESCE(PM.CATEGORY_CD, SRM.ORDER_TYPE) AS ORDER_TYPE,
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = COALESCE(PM.CATEGORY_CD, SRM.ORDER_TYPE)) AS ORDER_TYPE_NAME,
-- 제품구분
COALESCE(
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = CTM.PRODUCT),
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = SRM.PRODUCT_NAME)
) AS PRODUCT_NAME_TITLE,
-- 프로젝트번호
PM.PROJECT_NO,
-- 업체 정보
CM.CLIENT_NM AS VENDOR_NAME,
CM.EMAIL AS VENDOR_EMAIL
FROM QUOTATION_REQUEST_MASTER QRM
LEFT JOIN SALES_REQUEST_MASTER SRM ON QRM.SALES_REQUEST_MASTER_OBJID::VARCHAR = SRM.OBJID::VARCHAR
LEFT JOIN PROJECT_MGMT PM ON PM.OBJID = SRM.PROJECT_NO
LEFT JOIN CONTRACT_MGMT CTM ON CTM.OBJID = PM.CONTRACT_OBJID
LEFT JOIN CLIENT_MNG CM ON QRM.VENDOR_OBJID::VARCHAR = CM.OBJID::VARCHAR
WHERE QRM.OBJID = #{QUOTATION_REQUEST_MASTER_OBJID}::NUMERIC
</select>
<!-- 견적요청서 상세 목록 조회 -->
<select id="getQuotationRequestDetailList" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
QRD.OBJID,
QRD.QUOTATION_REQUEST_MASTER_OBJID,
QRD.SALES_REQUEST_PART_OBJID,
QRD.PART_OBJID,
QRD.PART_NO,
QRD.PART_NAME,
QRD.RAW_MATERIAL,
QRD.SIZE,
QRD.QTY,
QRD.UNIT_PRICE,
QRD.REMARK,
QRD.REG_DATE,
-- 마스터 정보
QRM.VENDOR_TYPE,
QRM.VENDOR_OBJID,
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = QRM.VENDOR_OBJID::VARCHAR) AS VENDOR_NAME
FROM QUOTATION_REQUEST_DETAIL QRD
LEFT JOIN QUOTATION_REQUEST_MASTER QRM ON QRD.QUOTATION_REQUEST_MASTER_OBJID = QRM.OBJID
WHERE QRD.QUOTATION_REQUEST_MASTER_OBJID = #{QUOTATION_REQUEST_MASTER_OBJID}::NUMERIC
ORDER BY QRD.OBJID
</select>
<!-- 견적요청서 번호 생성 -->
<select id="getNextQuotationRequestNo" parameterType="map" resultType="string">
SELECT 'Q' || TO_CHAR(NOW(), 'YYYYMMDD') || '-' || LPAD(NEXTVAL('SEQ_QUOTATION_REQUEST_NO')::VARCHAR, 3, '0')
</select>
<!-- 견적요청서 마스터 생성 -->
<insert id="insertQuotationRequestMaster" parameterType="map">
INSERT INTO QUOTATION_REQUEST_MASTER (
OBJID,
QUOTATION_REQUEST_NO,
SALES_REQUEST_MASTER_OBJID,
PROJECT_MGMT_OBJID,
VENDOR_OBJID,
VENDOR_TYPE,
STATUS,
DUE_DATE,
REMARK,
WRITER,
REG_DATE
) VALUES (
#{OBJID}::NUMERIC,
#{QUOTATION_REQUEST_NO},
#{SALES_REQUEST_MASTER_OBJID}::NUMERIC,
#{PROJECT_MGMT_OBJID}::NUMERIC,
#{VENDOR_OBJID}::NUMERIC,
#{VENDOR_TYPE},
'create',
<if test="DUE_DATE != null and DUE_DATE != ''">#{DUE_DATE}::DATE</if>
<if test="DUE_DATE == null or DUE_DATE == ''">NULL</if>,
#{REMARK},
#{WRITER},
NOW()
)
</insert>
<!-- 견적요청서 상세 생성 -->
<insert id="insertQuotationRequestDetail" parameterType="map">
INSERT INTO QUOTATION_REQUEST_DETAIL (
OBJID,
QUOTATION_REQUEST_MASTER_OBJID,
SALES_REQUEST_PART_OBJID,
PART_OBJID,
PART_NO,
PART_NAME,
RAW_MATERIAL,
SIZE,
QTY,
UNIT_PRICE,
REMARK,
REG_DATE
) VALUES (
#{OBJID}::NUMERIC,
#{QUOTATION_REQUEST_MASTER_OBJID}::NUMERIC,
#{SALES_REQUEST_PART_OBJID}::NUMERIC,
#{PART_OBJID}::NUMERIC,
#{PART_NO},
#{PART_NAME},
#{RAW_MATERIAL},
#{SIZE},
COALESCE(#{QTY}::NUMERIC, 0),
COALESCE(#{UNIT_PRICE}::NUMERIC, 0),
#{REMARK},
NOW()
)
</insert>
<!-- 견적요청서 상세 단가 업데이트 -->
<update id="updateQuotationRequestDetailPrice" parameterType="map">
UPDATE QUOTATION_REQUEST_DETAIL SET
UNIT_PRICE = #{UNIT_PRICE}::NUMERIC,
TOTAL_PRICE = #{QTY}::NUMERIC * #{UNIT_PRICE}::NUMERIC,
EDIT_DATE = NOW()
WHERE OBJID = #{OBJID}::NUMERIC
</update>
<!-- 견적요청서 마스터 상태 업데이트 -->
<update id="updateQuotationRequestMasterStatus" parameterType="map">
UPDATE QUOTATION_REQUEST_MASTER SET
STATUS = #{STATUS},
EDIT_DATE = NOW()
<if test="MAIL_SEND_YN != null and MAIL_SEND_YN != ''">
, MAIL_SEND_YN = #{MAIL_SEND_YN}
, MAIL_SEND_DATE = NOW()
</if>
WHERE OBJID = #{QUOTATION_REQUEST_MASTER_OBJID}::NUMERIC
</update>
<!-- MBOM_DETAIL 단가 업데이트 (견적 수신 후) -->
<!-- 동일 품번(PART_OBJID)의 모든 MBOM_DETAIL 행 업데이트 (품번 합쳐진 경우 대응) -->
<update id="updatePurchaseListPriceFromQuotation" parameterType="map">
UPDATE MBOM_DETAIL SET
<if test="VENDOR_TYPE == 'SUPPLY'">
UNIT_PRICE = #{UNIT_PRICE}::NUMERIC
</if>
<if test="VENDOR_TYPE == 'PROCESSING'">
PROCESSING_UNIT_PRICE = #{UNIT_PRICE}::NUMERIC
</if>
, EDIT_DATE = NOW()
WHERE OBJID IN (
SELECT MD2.OBJID
FROM MBOM_DETAIL MD2
WHERE MD2.PART_OBJID = (SELECT PART_OBJID FROM MBOM_DETAIL WHERE OBJID = #{SALES_REQUEST_PART_OBJID})
AND MD2.MBOM_HEADER_OBJID = (SELECT MBOM_HEADER_OBJID FROM MBOM_DETAIL WHERE OBJID = #{SALES_REQUEST_PART_OBJID})
)
</update>
<!-- MBOM_DETAIL 단가 초기화 (재수주 시 기존 단가 삭제) -->
<!-- 소재단가(UNIT_PRICE), 가공단가(PROCESSING_UNIT_PRICE)를 0으로 초기화 -->
<update id="resetMbomDetailPrice" parameterType="map">
UPDATE MBOM_DETAIL SET
UNIT_PRICE = 0,
PROCESSING_UNIT_PRICE = 0,
TOTAL_PRICE = 0,
PROCESSING_TOTAL_PRICE = 0,
GRAND_TOTAL_PRICE = 0,
EDIT_DATE = NOW()
WHERE MBOM_HEADER_OBJID = #{MBOM_HEADER_OBJID}
</update>
<!-- 구매리스트에서 견적요청서 생성 대상 조회 - M-BOM 기반 (MBOM_DETAIL에서 조회) -->
<!-- 공급업체/가공업체별로 견적요청서 생성 가능 여부 플래그 포함 -->
<select id="getPurchaseListForQuotationFromMBom" parameterType="map" resultType="map">
SELECT
MD.OBJID,
#{SALES_REQUEST_MASTER_OBJID} AS SALES_REQUEST_MASTER_OBJID,
MD.PART_OBJID,
PM.PART_NO,
PM.PART_NAME,
MD.RAW_MATERIAL,
MD.RAW_MATERIAL_SIZE AS SIZE,
MD.PO_QTY,
MD.PRODUCTION_QTY,
MD.UNIT_PRICE,
MD.PROCESSING_UNIT_PRICE,
MD.VENDOR AS VENDOR_PM,
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = MD.VENDOR) AS VENDOR_NAME,
MD.PROCESSING_VENDOR,
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = MD.PROCESSING_VENDOR) AS PROCESSING_VENDOR_NAME,
MD.RAW_MATERIAL_PART_NO AS RAW_MATERIAL_NO,
'MBOM' AS DATA_SOURCE,
-- 공급업체 견적요청서 생성 가능 여부
CASE WHEN MD.VENDOR IS NOT NULL AND MD.VENDOR != '' AND NOT EXISTS (
SELECT 1 FROM QUOTATION_REQUEST_DETAIL QRD
INNER JOIN QUOTATION_REQUEST_MASTER QRM ON QRD.QUOTATION_REQUEST_MASTER_OBJID = QRM.OBJID
WHERE QRD.SALES_REQUEST_PART_OBJID::VARCHAR = MD.OBJID::VARCHAR
AND QRM.VENDOR_TYPE = 'SUPPLY'
AND QRM.VENDOR_OBJID::VARCHAR = MD.VENDOR
) THEN 'Y' ELSE 'N' END AS CAN_CREATE_SUPPLY,
-- 가공업체 견적요청서 생성 가능 여부
CASE WHEN MD.PROCESSING_VENDOR IS NOT NULL AND MD.PROCESSING_VENDOR != '' AND NOT EXISTS (
SELECT 1 FROM QUOTATION_REQUEST_DETAIL QRD
INNER JOIN QUOTATION_REQUEST_MASTER QRM ON QRD.QUOTATION_REQUEST_MASTER_OBJID = QRM.OBJID
WHERE QRD.SALES_REQUEST_PART_OBJID::VARCHAR = MD.OBJID::VARCHAR
AND QRM.VENDOR_TYPE = 'PROCESSING'
AND QRM.VENDOR_OBJID::VARCHAR = MD.PROCESSING_VENDOR
) THEN 'Y' ELSE 'N' END AS CAN_CREATE_PROCESSING
FROM MBOM_DETAIL MD
LEFT JOIN PART_MNG PM ON MD.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
WHERE MD.MBOM_HEADER_OBJID = #{MBOM_HEADER_OBJID}
AND (
(MD.VENDOR IS NOT NULL AND MD.VENDOR != '')
OR (MD.PROCESSING_VENDOR IS NOT NULL AND MD.PROCESSING_VENDOR != '')
)
-- 공급업체 또는 가공업체 중 하나라도 견적요청서 생성 가능해야 함
AND (
-- 공급업체 견적요청서 생성 가능
(MD.VENDOR IS NOT NULL AND MD.VENDOR != '' AND NOT EXISTS (
SELECT 1 FROM QUOTATION_REQUEST_DETAIL QRD
INNER JOIN QUOTATION_REQUEST_MASTER QRM ON QRD.QUOTATION_REQUEST_MASTER_OBJID = QRM.OBJID
WHERE QRD.SALES_REQUEST_PART_OBJID::VARCHAR = MD.OBJID::VARCHAR
AND QRM.VENDOR_TYPE = 'SUPPLY'
AND QRM.VENDOR_OBJID::VARCHAR = MD.VENDOR
))
OR
-- 가공업체 견적요청서 생성 가능
(MD.PROCESSING_VENDOR IS NOT NULL AND MD.PROCESSING_VENDOR != '' AND NOT EXISTS (
SELECT 1 FROM QUOTATION_REQUEST_DETAIL QRD
INNER JOIN QUOTATION_REQUEST_MASTER QRM ON QRD.QUOTATION_REQUEST_MASTER_OBJID = QRM.OBJID
WHERE QRD.SALES_REQUEST_PART_OBJID::VARCHAR = MD.OBJID::VARCHAR
AND QRM.VENDOR_TYPE = 'PROCESSING'
AND QRM.VENDOR_OBJID::VARCHAR = MD.PROCESSING_VENDOR
))
)
ORDER BY MD.REGDATE
</select>
<!-- 구매리스트에서 견적요청서 생성 대상 조회 - 수동 작성 (SALES_REQUEST_PART에서 조회) -->
<select id="getPurchaseListForQuotationFromManual" parameterType="map" resultType="map">
SELECT
SRP.OBJID,
SRP.SALES_REQUEST_MASTER_OBJID,
SRP.PART_OBJID,
PM.PART_NO,
PM.PART_NAME,
SRP.RAW_MATERIAL,
SRP.SIZE,
SRP.PO_QTY,
SRP.PRODUCTION_QTY,
SRP.UNIT_PRICE,
SRP.PROCESSING_UNIT_PRICE,
SRP.VENDOR_PM,
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = SRP.VENDOR_PM) AS VENDOR_NAME,
SRP.PROCESSING_VENDOR,
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = SRP.PROCESSING_VENDOR) AS PROCESSING_VENDOR_NAME,
SRP.RAW_MATERIAL_NO,
'MANUAL' AS DATA_SOURCE
FROM SALES_REQUEST_PART SRP
LEFT JOIN PART_MNG PM ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
WHERE SRP.SALES_REQUEST_MASTER_OBJID = #{SALES_REQUEST_MASTER_OBJID}::NUMERIC
AND (
(SRP.VENDOR_PM IS NOT NULL AND SRP.VENDOR_PM != '')
OR (SRP.PROCESSING_VENDOR IS NOT NULL AND SRP.PROCESSING_VENDOR != '')
)
ORDER BY SRP.OBJID
</select>
<!-- 견적요청서 삭제 (마스터) -->
<delete id="deleteQuotationRequestMaster" parameterType="map">
DELETE FROM QUOTATION_REQUEST_MASTER WHERE OBJID = #{QUOTATION_REQUEST_MASTER_OBJID}::NUMERIC
</delete>
<!-- 견적요청서 삭제 (상세) -->
<delete id="deleteQuotationRequestDetail" parameterType="map">
DELETE FROM QUOTATION_REQUEST_DETAIL WHERE QUOTATION_REQUEST_MASTER_OBJID = #{QUOTATION_REQUEST_MASTER_OBJID}::NUMERIC
</delete>
<!-- 견적요청서 메일 발송 상태 업데이트 -->
<update id="updateQuotationRequestMailSent" parameterType="map">
UPDATE QUOTATION_REQUEST_MASTER
SET MAIL_SEND_YN = 'Y',
MAIL_SEND_DATE = NOW()
WHERE OBJID = #{QUOTATION_REQUEST_MASTER_OBJID}::NUMERIC
</update>
<!-- ==================== 구매요청서 품의서 생성 (PURCHASE_REG 전용) ==================== -->
<!-- 구매요청서 품의서 대상 품목 조회 (단가+공급업체 입력, 품의서 미생성) -->
<select id="getProposalTargetPartsFromPurchaseReg" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
SRP.OBJID,
SRP.PART_OBJID,
PM.PART_NO,
PM.PART_NAME,
SRP.QTY,
COALESCE(SRP.UNIT_PRICE, NULLIF(SRP.PARTNER_PRICE, '')::NUMERIC, 0) AS UNIT_PRICE,
SRP.TOTAL_PRICE,
COALESCE(SRP.VENDOR_PM, SRP.PARTNER_OBJID) AS VENDOR_PM,
CASE
WHEN COALESCE(SRP.VENDOR_PM, SRP.PARTNER_OBJID) LIKE 'C_%' THEN (SELECT CLIENT_NM FROM CLIENT_MNG WHERE 'C_' || OBJID::VARCHAR = COALESCE(SRP.VENDOR_PM, SRP.PARTNER_OBJID))
ELSE (SELECT SUPPLY_NAME FROM ADMIN_SUPPLY_MNG WHERE OBJID::VARCHAR = COALESCE(SRP.VENDOR_PM, SRP.PARTNER_OBJID))
END AS VENDOR_NAME,
SRP.NET_QTY,
SRP.PO_QTY
FROM
SALES_REQUEST_PART SRP
LEFT JOIN PART_MNG PM ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
WHERE
SRP.SALES_REQUEST_MASTER_OBJID = #{SALES_REQUEST_MASTER_OBJID}
-- 단가가 입력되어 있고 (UNIT_PRICE 또는 PARTNER_PRICE)
AND (
(SRP.UNIT_PRICE IS NOT NULL AND SRP.UNIT_PRICE > 0)
OR (SRP.PARTNER_PRICE IS NOT NULL AND SRP.PARTNER_PRICE != '' AND SRP.PARTNER_PRICE::NUMERIC > 0)
)
-- 공급업체가 입력되어 있고 (VENDOR_PM 또는 PARTNER_OBJID)
AND (
(SRP.VENDOR_PM IS NOT NULL AND SRP.VENDOR_PM != '')
OR (SRP.PARTNER_OBJID IS NOT NULL AND SRP.PARTNER_OBJID != '')
)
-- 품의서가 생성되지 않은 품목만
AND SRP.PROPOSAL_DATE IS NULL
ORDER BY SRP.REGDATE
</select>
<!-- 구매요청서 품의서 제외 품목 조회 (단가O, 공급업체X) -->
<select id="getProposalExcludedPartsFromPurchaseReg" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
SRP.OBJID,
SRP.PART_OBJID,
PM.PART_NO,
PM.PART_NAME,
SRP.QTY,
COALESCE(SRP.UNIT_PRICE, NULLIF(SRP.PARTNER_PRICE, '')::NUMERIC, 0) AS UNIT_PRICE
FROM
SALES_REQUEST_PART SRP
LEFT JOIN PART_MNG PM ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
WHERE
SRP.SALES_REQUEST_MASTER_OBJID = #{SALES_REQUEST_MASTER_OBJID}
-- 단가가 입력되어 있지만 (UNIT_PRICE 또는 PARTNER_PRICE)
AND (
(SRP.UNIT_PRICE IS NOT NULL AND SRP.UNIT_PRICE > 0)
OR (SRP.PARTNER_PRICE IS NOT NULL AND SRP.PARTNER_PRICE != '' AND SRP.PARTNER_PRICE::NUMERIC > 0)
)
-- 공급업체가 없는 품목 (VENDOR_PM, PARTNER_OBJID 둘 다 없음)
AND (SRP.VENDOR_PM IS NULL OR SRP.VENDOR_PM = '')
AND (SRP.PARTNER_OBJID IS NULL OR SRP.PARTNER_OBJID = '')
-- 품의서가 생성되지 않은 품목만
AND SRP.PROPOSAL_DATE IS NULL
ORDER BY SRP.REGDATE
</select>
<!-- 구매요청서 품의서 생성 (SALES_REQUEST_MASTER에 INSERT) -->
<insert id="insertProposalFromPurchaseReg" parameterType="map">
INSERT INTO SALES_REQUEST_MASTER (
OBJID,
REQUEST_MNG_NO,
PROJECT_NO,
PURCHASE_TYPE,
ORDER_TYPE,
PRODUCT_NAME,
AREA_CD,
CUSTOMER_OBJID,
PAID_TYPE,
REQUEST_USER_ID,
DELIVERY_REQUEST_DATE,
STATUS,
WRITER,
REGDATE,
DOC_TYPE
) VALUES (
#{OBJID},
#{REQUEST_MNG_NO},
#{PROJECT_NO},
#{PURCHASE_TYPE},
#{ORDER_TYPE},
#{PRODUCT_NAME},
#{AREA_CD},
#{CUSTOMER_OBJID},
#{PAID_TYPE},
#{REQUEST_USER_ID},
#{DELIVERY_REQUEST_DATE},
'create',
#{WRITER},
NOW(),
'PURCHASE_REG_PROPOSAL'
)
</insert>
<!-- 구매요청서 품의서용 SALES_REQUEST_PART 생성 (품목 복사) -->
<insert id="insertProposalPartFromPurchaseReg" parameterType="map">
INSERT INTO SALES_REQUEST_PART (
OBJID,
SALES_REQUEST_MASTER_OBJID,
PART_OBJID,
QTY,
UNIT_PRICE,
TOTAL_PRICE,
VENDOR_PM,
NET_QTY,
PO_QTY,
USE_YN,
PROPOSAL_DATE,
WRITER,
REGDATE
)
SELECT
#{NEW_OBJID},
#{PROPOSAL_MASTER_OBJID},
PART_OBJID,
QTY,
CASE
WHEN UNIT_PRICE IS NOT NULL AND UNIT_PRICE > 0 THEN UNIT_PRICE
WHEN PARTNER_PRICE IS NOT NULL AND PARTNER_PRICE != '' THEN PARTNER_PRICE::NUMERIC
ELSE 0
END AS UNIT_PRICE,
CASE
WHEN TOTAL_PRICE IS NOT NULL AND TOTAL_PRICE > 0 THEN TOTAL_PRICE
ELSE COALESCE(QTY::NUMERIC, 0) *
CASE
WHEN UNIT_PRICE IS NOT NULL AND UNIT_PRICE > 0 THEN UNIT_PRICE
WHEN PARTNER_PRICE IS NOT NULL AND PARTNER_PRICE != '' THEN PARTNER_PRICE::NUMERIC
ELSE 0
END
END AS TOTAL_PRICE,
COALESCE(NULLIF(VENDOR_PM, ''), PARTNER_OBJID) AS VENDOR_PM,
NET_QTY,
COALESCE(QTY::NUMERIC, 0) AS PO_QTY, -- 발주수량에 QTY 값 저장
USE_YN,
NOW() AS PROPOSAL_DATE,
#{WRITER},
NOW()
FROM SALES_REQUEST_PART
WHERE OBJID = #{SOURCE_OBJID}
</insert>
<!-- 구매요청서 품의서 생성 후 원본 PROPOSAL_DATE 업데이트 -->
<update id="updateProposalDateForPurchaseRegParts" parameterType="map">
UPDATE SALES_REQUEST_PART
SET PROPOSAL_DATE = NOW()
WHERE OBJID IN
<foreach collection="PART_OBJIDS" item="objid" open="(" separator="," close=")">
#{objid}
</foreach>
</update>
</mapper>