Jelajahi Sumber

네이버페이 주문형 검수 대응 임시 커밋

card007 4 tahun lalu
induk
melakukan
3b11c6ad0f

+ 9 - 0
src/main/java/com/style24/core/biz/dao/TscNaverPayDao.java

@@ -164,4 +164,13 @@ public interface TscNaverPayDao {
 	 * @since 2021. 10. 05
 	 */
 	int updateNaverPayChangeHold(Order order);
+
+	/**
+	 * 네이버페이 주문형 발송지연 대상 조회
+	 * 
+	 * @return Collection<Order>
+	 * @author card007
+	 * @since 2021. 10. 12
+	 */
+	Collection<Order> getNaverPayDelayTargetList();
 }

+ 178 - 12
src/main/java/com/style24/core/biz/service/TscNaverPayService.java

@@ -33,6 +33,7 @@ import com.style24.core.biz.checkout.MallServiceSOAP11BindingStub;
 import com.style24.core.biz.checkout.base.AccessCredentialsType;
 import com.style24.core.biz.checkout.base.ChangedProductOrderInfo;
 import com.style24.core.biz.checkout.base.ClaimRequestReasonType;
+import com.style24.core.biz.checkout.base.DelayedDispatchReasonType;
 import com.style24.core.biz.checkout.base.DeliveryMethodType;
 import com.style24.core.biz.checkout.base.HoldbackClassType;
 import com.style24.core.biz.checkout.base.HoldbackStatusType;
@@ -47,6 +48,8 @@ import com.style24.core.biz.checkout.mall.ApproveReturnApplicationRequest;
 import com.style24.core.biz.checkout.mall.ApproveReturnApplicationResponse;
 import com.style24.core.biz.checkout.mall.CancelSaleRequest;
 import com.style24.core.biz.checkout.mall.CancelSaleResponse;
+import com.style24.core.biz.checkout.mall.DelayProductOrderRequest;
+import com.style24.core.biz.checkout.mall.DelayProductOrderResponse;
 import com.style24.core.biz.checkout.mall.GetChangedProductOrderListRequest;
 import com.style24.core.biz.checkout.mall.GetChangedProductOrderListResponse;
 import com.style24.core.biz.checkout.mall.GetProductOrderInfoListRequest;
@@ -437,8 +440,8 @@ public class TscNaverPayService {
 
 		// 로컬의 경우 별도 기간을 설정해서 사용
 		if("locd".equals(env.getProperty("spring.profiles.active"))) {
-			stdt				= "20211008000000";			// 조회기간 시작
-			eddt				= "20211008235959";			// 조회기간 끝
+			stdt				= "20211012000000";			// 조회기간 시작
+			eddt				= "20211012235959";			// 조회기간 끝
 
 			log.info("stdt : eddt ---> " + stdt + " : " + eddt);
 		}
@@ -1228,7 +1231,6 @@ public class TscNaverPayService {
 				change.setRecipZipcode(orderInfo.getProductOrder().getShippingAddress().getZipCode().replaceAll("-", ""));
 				change.setRecipNm(new String(SimpleCryptLib.decrypt(encryptKey, orderInfo.getProductOrder().getShippingAddress().getName()), StandardCharsets.UTF_8));
 				change.setRecipPhnno(new String(SimpleCryptLib.decrypt(encryptKey, orderInfo.getProductOrder().getShippingAddress().getTel1()), StandardCharsets.UTF_8));
-				change.setHypenRecipPhone();
 				change.setRecipBaseAddr(new String(SimpleCryptLib.decrypt(encryptKey, orderInfo.getProductOrder().getShippingAddress().getBaseAddress()), StandardCharsets.UTF_8));
 				if(StringUtils.isNotBlank(orderInfo.getProductOrder().getShippingAddress().getZipCode())) {
 					change.setRecipZipcode(orderInfo.getProductOrder().getShippingAddress().getZipCode().replaceAll("-", ""));
@@ -1264,6 +1266,9 @@ public class TscNaverPayService {
 				}
 			}
 
+			// 핸드폰번호 하이픈 처리
+			change.setHypenRecipPhone();
+
 			// 배송지 정보 (네이버페이 주문형 배송지는 회수지와 동일 적용 (배송지 주소 작성란 없음))
 			change.setChgerNm(change.getRecipNm());
 			change.setChgerPhnno(change.getRecipPhnno());
@@ -1355,6 +1360,13 @@ public class TscNaverPayService {
 				}
 			}
 
+			// 교환 보류 처리
+			order.setHoldCode(TscConstants.nPayExchangeHoldCode.ETC.value());
+			order.setHoldReason("교환 옵션 변경 대기중");
+			order.setRegNo(userNo);
+			order.setUpdNo(userNo);
+			this.nPayExchangeHold(order);
+
 			log.info("NAPAY_ORD_NO 교환 접수 성공 :::: {}", order.getNpayOrdDtlNo());
 		}
 
@@ -2518,10 +2530,12 @@ public class TscNaverPayService {
 	@Transactional("shopTxnManager")
 	public int nPayExchangeHold(Order order) {
 		Order info 				= naverPayDao.getOrderDetailInfoFromOrdDtlNo(order);
+		String holdCode			= order.getHoldCode();
+		String holdReason		= order.getHoldReason();
+		Integer regNo			= order.getRegNo();
 		String npayOrdDtlNo 	= info.getNpayOrdDtlNo();
 		String pgGb 			= info.getPgGb();
 		Integer ordNo 			= info.getOrdNo();
-		Integer regNo			= order.getRegNo();
 
 		try {
 			Security.addProvider(new BouncyCastleProvider());
@@ -2546,10 +2560,25 @@ public class TscNaverPayService {
 				withholdExchangeRequest.setDetailLevel("Full");
 				withholdExchangeRequest.setVersion(env.getProperty("naverPay.version"));
 				withholdExchangeRequest.setRequestID("");
-				withholdExchangeRequest.setProductOrderID(npayOrdDtlNo);					// 상품 주문 번호
-				withholdExchangeRequest.setExchangeHoldCode(HoldbackClassType.ETC);			// 교환 보류 타입 코드
-				withholdExchangeRequest.setExchangeHoldDetailContent("기타사유");				// 교환 보류 상세 사유
-				// withholdExchangeRequest.setEtcFeeDemandAmount(0);							// 기타 교환 비용
+				withholdExchangeRequest.setProductOrderID(npayOrdDtlNo);											// 상품 주문 번호
+
+				// 교환 보류 타입 코드
+				if (TscConstants.nPayExchangeHoldCode.EXCHANGE_DELIVERYFEE.value().equals(holdCode)) {
+					withholdExchangeRequest.setExchangeHoldCode(HoldbackClassType.EXCHANGE_DELIVERYFEE);			// 교환 배송비 청구
+				} else if (TscConstants.nPayExchangeHoldCode.EXCHANGE_EXTRAFEE.value().equals(holdCode)) {
+					withholdExchangeRequest.setExchangeHoldCode(HoldbackClassType.EXCHANGE_EXTRAFEE);				// 기타 교환 비용 청구
+				} else if (TscConstants.nPayExchangeHoldCode.EXCHANGE_PRODUCT_READY.value().equals(holdCode)) {
+					withholdExchangeRequest.setExchangeHoldCode(HoldbackClassType.EXCHANGE_PRODUCT_READY);			// 교환 상품 준비 중
+				} else if (TscConstants.nPayExchangeHoldCode.EXCHANGE_PRODUCT_NOT_DELIVERED.value().equals(holdCode)) {
+					withholdExchangeRequest.setExchangeHoldCode(HoldbackClassType.EXCHANGE_PRODUCT_NOT_DELIVERED);	// 교환 상품 미입고
+				} else if (TscConstants.nPayExchangeHoldCode.EXCHANGE_HOLDBACK.value().equals(holdCode)) {
+					withholdExchangeRequest.setExchangeHoldCode(HoldbackClassType.EXCHANGE_HOLDBACK);				// 교환 구매 확정 보류
+				} else {
+					withholdExchangeRequest.setExchangeHoldCode(HoldbackClassType.ETC);								// 기타 사유
+				}
+
+				withholdExchangeRequest.setExchangeHoldDetailContent(holdReason);									// 교환 보류 상세 사유
+				// withholdExchangeRequest.setEtcFeeDemandAmount(0);													// 기타 교환 비용
 
 
 				withholdExchangeResponse = stub.withholdExchange(withholdExchangeRequest);
@@ -2692,6 +2721,7 @@ public class TscNaverPayService {
 		Order info 				= naverPayDao.getOrderDetailInfoFromOrdDtlNo(order);
 		String npayOrdDtlNo 	= info.getNpayOrdDtlNo();
 		String pgGb 			= info.getPgGb();
+		String holdCode			= order.getHoldCode();
 		Integer ordNo 			= info.getOrdNo();
 		Integer regNo			= order.getRegNo();
 
@@ -2718,10 +2748,23 @@ public class TscNaverPayService {
 				withholdReturnRequest.setDetailLevel("Full");
 				withholdReturnRequest.setVersion(env.getProperty("naverPay.version"));
 				withholdReturnRequest.setRequestID("");
-				withholdReturnRequest.setProductOrderID(npayOrdDtlNo);						// 상품 주문 번호
-				withholdReturnRequest.setReturnHoldCode(HoldbackClassType.ETC);				// 반품 보류 타입 코드
-				withholdReturnRequest.setReturnHoldDetailContent("기타사유");					// 반품 보류 상세 사유
-				// withholdReturnRequest.setEtcFeeDemandAmount(0);							// 기타 교환 비용
+				withholdReturnRequest.setProductOrderID(npayOrdDtlNo);												// 상품 주문 번호
+
+				// 교환 보류 타입 코드
+				if (TscConstants.nPayReturnHoldCode.RETURN_DELIVERYFEE.value().equals(holdCode)) {
+					withholdReturnRequest.setReturnHoldCode(HoldbackClassType.RETURN_DELIVERYFEE);					// 반품 배송비 청구
+				} else if (TscConstants.nPayReturnHoldCode.EXTRAFEEE.value().equals(holdCode)) {
+					withholdReturnRequest.setReturnHoldCode(HoldbackClassType.EXTRAFEEE);							// 기타 반품 비용 청구
+				} else if (TscConstants.nPayReturnHoldCode.RETURN_DELIVERYFEE_AND_EXTRAFEEE.value().equals(holdCode)) {
+					withholdReturnRequest.setReturnHoldCode(HoldbackClassType.RETURN_DELIVERYFEE_AND_EXTRAFEEE);	// 반품 배송비 및 기타 반품 비용 청구
+				} else if (TscConstants.nPayReturnHoldCode.RETURN_PRODUCT_NOT_DELIVERED.value().equals(holdCode)) {
+					withholdReturnRequest.setReturnHoldCode(HoldbackClassType.RETURN_PRODUCT_NOT_DELIVERED);		// 반품 상품 미입고
+				} else {
+					withholdReturnRequest.setReturnHoldCode(HoldbackClassType.ETC);									// 기타 사유
+				}
+
+				withholdReturnRequest.setReturnHoldDetailContent(order.getHoldReason());							// 반품 보류 상세 사유
+				// withholdReturnRequest.setEtcFeeDemandAmount(0);														// 기타 반품 비용
 
 
 				withholdReturnResponse = stub.withholdReturn(withholdReturnRequest);
@@ -2862,4 +2905,127 @@ public class TscNaverPayService {
 	public int updateNaverPayChangeHold(Order order) {
 		return naverPayDao.updateNaverPayChangeHold(order);
 	}
+
+	/**
+	 * 네이버페이 주문형 발송지연 대상 조회
+	 *
+	 * @return Collection<Order>
+	 * @author card007
+	 * @since 2021. 10. 12
+	 */
+	public Collection<Order> getNaverPayDelayTargetList() {
+		return naverPayDao.getNaverPayDelayTargetList();
+	}
+
+	/**
+	 * 네이버페이 주문형 발송 지연 처리
+	 *
+	 * @param Order
+	 * @return int
+	 * @author card007
+	 * @since 2021. 10. 12
+	 */
+	@Transactional("shopTxnManager")
+	public int nPayDelayProductOrder(Order order) {
+		Integer ordNo 			= order.getOrdNo();
+		String npayOrdDtlNo 	= order.getNpayOrdDtlNo();
+		String pgGb 			= order.getPgGb();
+		String reasonCd			= order.getReasonCd();
+		Integer regNo			= order.getRegNo();
+
+		try {
+			Security.addProvider(new BouncyCastleProvider());
+			AccessCredentialsType accessCredentialsType = new AccessCredentialsType();
+			MallServiceLocator MSL = new MallServiceLocator(env.getProperty("naverPay.port.address"));
+			MallServiceSOAP11BindingStub stub = (MallServiceSOAP11BindingStub)MSL.getMallServiceSOAP11Port();
+
+			DelayProductOrderRequest delayProductOrderRequest = new DelayProductOrderRequest();
+			DelayProductOrderResponse delayProductOrderResponse = new DelayProductOrderResponse();
+
+			if (order != null && TscConstants.PgGb.NAVER_ORDER.value().equals(pgGb)) {
+				// 서명생성
+				generateSignature("DelayProductOrder", env.getProperty("naverPay.secret.key"));
+				log.info("DelayProductOrder(발송 지연 네이버로 송신) :: timeStamp === " + timeStamp);
+
+				//인증정보
+				accessCredentialsType.setAccessLicense(env.getProperty("naverPay.access.license"));
+				accessCredentialsType.setSignature(signature);
+				accessCredentialsType.setTimestamp(timeStamp);
+
+				delayProductOrderRequest.setAccessCredentials(accessCredentialsType);
+				delayProductOrderRequest.setDetailLevel("Full");
+				delayProductOrderRequest.setVersion(env.getProperty("naverPay.version"));
+				delayProductOrderRequest.setRequestID("");
+				delayProductOrderRequest.setProductOrderID(npayOrdDtlNo);												// 상품 주문 번호
+
+				// 발송 기한 설정
+				Calendar dispatchDate = Calendar.getInstance();
+				Date tmp;
+				if(StringUtils.isNotBlank(order.getDelvResDt())) {
+					tmp = new SimpleDateFormat("yyyyMMddHHmmss").parse(order.getDelvResDt(), new ParsePosition(0));
+				} else {
+					tmp = new Date();
+				}
+
+				dispatchDate.setTime(tmp);
+				delayProductOrderRequest.setDispatchDueDate(dispatchDate);												// 발송 기한
+
+				// 발송 지연 사유 코드 설정
+				if (TscConstants.nPayDelayReasonCode.PRODUCT_PREPARE.value().equals(reasonCd)) {
+					delayProductOrderRequest.setDispatchDelayReasonCode(DelayedDispatchReasonType.PRODUCT_PREPARE);		// 상품 준비 중
+				} else if (TscConstants.nPayDelayReasonCode.CUSTOMER_REQUEST.value().equals(reasonCd)) {
+					delayProductOrderRequest.setDispatchDelayReasonCode(DelayedDispatchReasonType.CUSTOMER_REQUEST);	// 고객 요청
+				} else if (TscConstants.nPayDelayReasonCode.CUSTOM_BUILD.value().equals(reasonCd)) {
+					delayProductOrderRequest.setDispatchDelayReasonCode(DelayedDispatchReasonType.CUSTOM_BUILD);		// 주문 제작
+				} else if (TscConstants.nPayDelayReasonCode.RESERVED_DISPATCH.value().equals(reasonCd)) {
+					delayProductOrderRequest.setDispatchDelayReasonCode(DelayedDispatchReasonType.RESERVED_DISPATCH);	// 예약 발송
+				} else {
+					delayProductOrderRequest.setDispatchDelayReasonCode(DelayedDispatchReasonType.ETC);					// 기타
+				}
+
+				// delayProductOrderRequest.setDispatchDelayDetailReason();												// 발송 지연 상세 사유
+
+				delayProductOrderResponse = stub.delayProductOrder(delayProductOrderRequest);
+
+				String resultStr = "";
+				if (delayProductOrderResponse.getResponseType() != null) {
+					resultStr = delayProductOrderResponse.getResponseType().toUpperCase();
+				}
+
+				if ("SUCCESS".equals(resultStr)) {
+					log.info("발송 지연 처리 성공 주문번호===>" + ordNo);
+					log.info("발송 지연 처리 성공 네이버상품주문번호===>" + npayOrdDtlNo);
+				} else {
+					log.info("발송 지연 처리 에러");
+					log.info("주문번호 ===>" + ordNo);
+					log.info("네이버상품주문번호 ===> " + npayOrdDtlNo);
+					log.info("Code : " + delayProductOrderResponse.getError().getCode());
+					log.info("Message : " + delayProductOrderResponse.getError().getMessage());
+					log.info("Detail : " + delayProductOrderResponse.getError().getDetail());
+
+					Order fail = new Order();
+					fail.setErrorReason("발송 지연 처리 데이터 송부 에러");
+					fail.setOrdNo(ordNo);
+					fail.setNpayOrdDtlNo(npayOrdDtlNo);
+					fail.setOptCd("DelayProductOrder");
+					fail.setResultCd(delayProductOrderResponse.getError().getCode());
+					fail.setResultMsg(delayProductOrderResponse.getError().getMessage());
+					fail.setMallCd(env.getProperty("naverPay.shop.id"));
+					fail.setAccessLicense(env.getProperty("naverPay.access.license"));
+					fail.setSecretKey(env.getProperty("naverPay.secret.key"));
+					fail.setRegNo(regNo);
+
+					orderDao.createNaverPayErrorLog(fail);
+
+					return 0;
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			return 0;
+		}
+
+		return 1;
+	}
+
 }

+ 11 - 1
src/main/java/com/style24/core/biz/service/TscOrderChangeService.java

@@ -1142,7 +1142,10 @@ public class TscOrderChangeService {
 		if(StringUtils.isNotBlank(excReq.getPgGb()) && TscConstants.PgGb.NAVER_ORDER.value().equals(excReq.getPgGb())) {
 			// 2021.08.18 card007 네이버페이 주문형 교환신청의 경우 교환접수승인대기로 변경
 			orderChangeStat = TscConstants.OrderChangeStat.EXCHANGE_APPROVE_WAIT.value();
-			npayChangeHoldYn = "N";
+			npayChangeHoldYn = "Y";
+
+			// 핸드폰번호 하이픈 처리
+			excReq.setHypenRecipPhone();
 		}
 		
 		// 제휴몰 주문은 추가 결제 금액이 있어도 반품접수로 처리
@@ -1758,6 +1761,13 @@ public class TscOrderChangeService {
 				orderChangeDao.createOrderChangeDetailHst(orderChangeDetailHst);
 
 				preOrdDtlNo = ordDtlNo;
+
+				// 네이버페이 주문형 교환승인 시 교환보류해제 처리
+				Order nPayReleaseExchangeHold = new Order();
+				nPayReleaseExchangeHold.setOrdDtlNo(ordDtlNo);
+				nPayReleaseExchangeHold.setRegNo(regNo);
+				nPayReleaseExchangeHold.setUpdNo(updNo);
+				naverPayService.nPayReleaseExchangeHold(nPayReleaseExchangeHold);
 			}
 
 			// 4. TB_ORDER_DETAIL_ITEM 변경옵션 UPDATE

+ 57 - 0
src/main/java/com/style24/core/support/env/TscConstants.java

@@ -1168,4 +1168,61 @@ public class TscConstants {
 		}
 	}
 
+	// 네이버페이 주문형 교환보류 코드
+	public enum nPayExchangeHoldCode {
+		EXCHANGE_DELIVERYFEE("EXCHANGE_DELIVERYFEE"),						// 교환 배송비 청구
+		EXCHANGE_EXTRAFEE("EXCHANGE_EXTRAFEE"),								// 기타 교환 비용 청구
+		EXCHANGE_PRODUCT_READY("EXCHANGE_PRODUCT_READY"),					// 교환 상품 준비 중
+		EXCHANGE_PRODUCT_NOT_DELIVERED("EXCHANGE_PRODUCT_NOT_DELIVERED"),	// 교환 상품 미입고
+		EXCHANGE_HOLDBACK("EXCHANGE_HOLDBACK"),								// 교환 구매 확정 보류
+		ETC("ETC");															// 기타 사유
+
+		private String value;
+
+		private nPayExchangeHoldCode(String value) {
+			this.value = value;
+		}
+
+		public String value() {
+			return value;
+		}
+	}
+
+	// 네이버페이 주문형 반품보류 코드
+	public enum nPayReturnHoldCode {
+		RETURN_DELIVERYFEE("RETURN_DELIVERYFEE"),								// 반품 배송비 청구
+		EXTRAFEEE("EXTRAFEEE"),													// 기타 반품 비용 청구
+		RETURN_DELIVERYFEE_AND_EXTRAFEEE("RETURN_DELIVERYFEE_AND_EXTRAFEEE"),	// 반품 배송비 및 기타 반품 비용 청구
+		RETURN_PRODUCT_NOT_DELIVERED("RETURN_PRODUCT_NOT_DELIVERED"),			// 반품 상품 미입고
+		ETC("ETC");																// 기타 사유
+
+		private String value;
+
+		private nPayReturnHoldCode(String value) {
+			this.value = value;
+		}
+
+		public String value() {
+			return value;
+		}
+	}
+
+	// 네이버페이 주문형 발송지연 사유 코드
+	public enum nPayDelayReasonCode {
+		PRODUCT_PREPARE("PRODUCT_PREPARE"),		// 상품 준비 중
+		CUSTOMER_REQUEST("CUSTOMER_REQUEST"),	// 고객 요청
+		CUSTOM_BUILD("CUSTOM_BUILD"),			// 주문 제작
+		RESERVED_DISPATCH("RESERVED_DISPATCH"),	// 예약 발송
+		ETC("ETC");								// 기타
+
+		private String value;
+
+		private nPayDelayReasonCode(String value) {
+			this.value = value;
+		}
+
+		public String value() {
+			return value;
+		}
+	}
 }

+ 2 - 0
src/main/java/com/style24/persistence/domain/Order.java

@@ -782,6 +782,8 @@ public class Order extends TscBaseDomain {
 	private int addDeliveryFee;	
 	private String wdBfSendYn;
 	private String canRequestCancelYn;
+	private String holdCode;
+	private String holdReason;
 	
 	// 2021.06.17 스윗트래커 정보 조회
 	private String timeTrans;

+ 10 - 0
src/main/java/com/style24/persistence/domain/OrderChange.java

@@ -291,4 +291,14 @@ public class OrderChange extends TscBaseDomain {
 			}
 		}
 	}
+
+	public void setHypenChgerPhone() {
+		if (StringUtils.isNotBlank(this.chgerPhnno) && !this.chgerPhnno.contains("-")) {
+			if (this.chgerPhnno.length() > 10) {
+				this.chgerPhnno = this.chgerPhnno.substring(0, 3) + "-" + this.chgerPhnno.substring(3, 7) + "-" + this.chgerPhnno.substring(7, 11);
+			} else {
+				this.chgerPhnno = this.chgerPhnno.substring(0, 3) + "-" + this.chgerPhnno.substring(3, 6) + "-" + this.chgerPhnno.substring(6, 10);
+			}
+		}
+	}
 }

+ 49 - 11
src/main/java/com/style24/persistence/mybatis/shop/TscNaverPay.xml

@@ -338,17 +338,17 @@
 	<select id="getOrderDetailInfoFromOrdDtlNo" parameterType="Order" resultType="Order">
 		/* TsbNaverPay.getOrderDetailInfoFromOrdDtlNo : 주문 상세 번호를 통해 주문 정보 조회 */
 		SELECT O.CUST_NO
-			 , P.PG_GB
-			 , OD.ORD_NO
-			 , OD.ORD_DTL_NO
-			 , OD.NPAY_ORD_DTL_NO
-			 , OD.ORD_EXCH_GB
-			 , OD.INVOICE_NO
-			 , OD.SHIP_COMP_CD
-			 , OD.INVOICE_SEND_YN
-			 , SC.NAVER_PAY_SHIP_COMP_CD
-			 , DATE_FORMAT(OD.DELV_STDT,'%Y%m%d%H%i%S') AS DELV_STDT
-			 , DATE_FORMAT(OD.DELV_EDDT,'%Y%m%d%H%i%S') AS DELV_EDDT
+		     , P.PG_GB
+		     , OD.ORD_NO
+		     , OD.ORD_DTL_NO
+		     , OD.NPAY_ORD_DTL_NO
+		     , OD.ORD_EXCH_GB
+		     , OD.INVOICE_NO
+		     , OD.SHIP_COMP_CD
+		     , OD.INVOICE_SEND_YN
+		     , SC.NAVER_PAY_SHIP_COMP_CD
+		     , DATE_FORMAT(OD.DELV_STDT,'%Y%m%d%H%i%S') AS DELV_STDT
+		     , DATE_FORMAT(OD.DELV_EDDT,'%Y%m%d%H%i%S') AS DELV_EDDT
 		FROM   TB_ORDER O
 		INNER  JOIN TB_ORDER_DETAIL OD
 		ON     O.ORD_NO = OD.ORD_NO
@@ -359,7 +359,15 @@
 		LEFT   OUTER JOIN TB_SHIP_COMPANY SC
 		ON     OD.SHIP_COMP_CD = SC.SHIP_COMP_CD
 		WHERE  1=1
+		<choose>
+			<when test="npayOrdDtlNo != null and npayOrdDtlNo != ''">
+		AND    OD.NPAY_ORD_DTL_NO = #{npayOrdDtlNo}
+			</when>
+			<otherwise>
 		AND    OD.ORD_DTL_NO = #{ordDtlNo}
+			</otherwise>
+		</choose>
+		LIMIT 1
 	</select>
 
 	<!-- 네이버페이 주문형 반품/교환 보류 여부 수정 -->
@@ -371,4 +379,34 @@
 		     , UPD_DT = NOW()
 		 WHERE ORD_CHG_SQ = #{ordChgSq}
 	</update>
+	
+	<!-- 네이버페이 주문형 발송지연 대상 조회 -->
+	<select id="getNaverPayDelayTargetList" resultType="Order">
+		/* TscNaverPay.getNaverPayDelayTargetList */
+		SELECT O.ORD_NO
+		     , OD.NPAY_ORD_DTL_NO
+		     , P.PG_GB
+		     , CASE WHEN OD.MAKE_GOODS_YN = 'Y' THEN CONCAT(FN_GET_BIZDATE(DATE_FORMAT(NOW(),'%Y%m%d'), 10), '235959')
+		            WHEN GRS.GOODS_CD IS NOT NULL THEN DATE_FORMAT(GRS.DELV_RES_DT ,'%Y%m%d%H%i%S')
+		            ELSE CONCAT(FN_GET_BIZDATE(DATE_FORMAT(NOW(),'%Y%m%d'), 3), '235959')
+		       END AS DELV_RES_DT
+		     , CASE WHEN OD.MAKE_GOODS_YN = 'Y' THEN 'CUSTOM_BUILD'
+		            WHEN GRS.GOODS_CD IS NOT NULL THEN 'RESERVED_DISPATCH'
+		            ELSE 'PRODUCT_PREPARE'
+			   END AS REASON_CD
+		  FROM TB_ORDER O
+		 INNER JOIN TB_ORDER_DETAIL OD
+		    ON O.ORD_NO = OD.ORD_NO
+		 INNER JOIN TB_PAYMENT P
+		    ON O.ORD_NO = P.ORD_NO
+		   AND P.PAY_STAT = 'G016_30'
+		   AND P.PAY_GB = 'O'
+		   AND P.PG_GB = 'NAVER_ORDER'
+		  LEFT OUTER JOIN TB_GOODS_RES_SELL GRS
+		    ON OD.GOODS_CD = GRS.GOODS_CD
+		   AND GRS.USE_YN = 'Y'
+		   AND GRS.DELV_RES_DT > NOW()
+		 WHERE OD.ORD_DTL_STAT IN ('G013_20', 'G013_30', 'G013_35', 'G013_40')
+		   AND FN_GET_BIZDAYS(DATE_FORMAT(O.ORD_DT,'%Y%m%d'), DATE_FORMAT(NOW(),'%Y%m%d')) > 3
+	</select>
 </mapper>