Prechádzať zdrojové kódy

Merge remote-tracking branch 'origin/card007' into jsh77b

tsit14 5 rokov pred
rodič
commit
ff80767820

+ 34 - 0
src/main/java/com/style24/core/biz/dao/NetpathyMailDao.java

@@ -0,0 +1,34 @@
+package com.style24.core.biz.dao;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.MailTemplate;
+import com.style24.persistence.domain.Netpathy;
+
+/**
+ * 넷퍼시메일 Dao
+ * 
+ * @author gagamel
+ * @since 2021. 5. 10
+ */
+@ShopDs
+public interface NetpathyMailDao {
+
+	/**
+	 * 메일템플릿 조회
+	 * @param mailtSq - 메일템플릿번호
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 5. 10
+	 */
+	MailTemplate getMailTemplate(Integer mailtSq);
+
+	/**
+	 * 메일 생성
+	 * @param netpathy - 넷퍼시메일 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 5. 10
+	 */
+	void createMail(Netpathy netpathy);
+
+}

+ 10 - 3
src/main/java/com/style24/core/biz/dao/TscOrderDao.java

@@ -2,8 +2,6 @@ package com.style24.core.biz.dao;
 
 import java.util.Collection;
 
-import org.apache.ibatis.session.ResultHandler;
-
 import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.GiftCard;
 import com.style24.persistence.domain.Order;
@@ -813,7 +811,16 @@ public interface TscOrderDao {
 	 * @author xodud1202
 	 * @since 2021.04.23
 	 */
-	GiftCard getGiftCardReceiptInfo(GiftCard param);
+	GiftCard getGiftCardReceiptInfo(Integer ordNo);
+
+	/**
+	 * 주문 현금영수증 정보 조회
+	 * 
+	 * @param GiftCard
+	 * @author card007
+	 * @since 2021. 05. 10
+	 */
+	GiftCard getOrderCashReceiptsInfo(Integer ordNo);
 
 	/**
 	 * 보증보험 정보 조회

+ 10 - 9
src/main/java/com/style24/core/biz/service/TscKcpService.java

@@ -426,9 +426,7 @@ public class TscKcpService {
 	 * KCP 현금영수증 취소 신청 API
 	 * param.setModType("STSQ");	// 요청 구분 (STSQ : 조회, STSC : 전체취소, STPC : 부분취소) >> 조회는 사용 안함 > result 안받음. 사용시 result 추가활것.
 	 * param.setOrdNo(100);			// 주문번호
-	 *
-	 * * 부분취소시 추가 금액
-	 * param.setUsGfcdAmt(3000);	// 부분취소 요청 금액
+	 * param.setUsGfcdAmt(3000);	// 취소 요청 금액
 	 *
 	 * @param GiftCard
 	 * @author xodud1202
@@ -443,7 +441,7 @@ public class TscKcpService {
 		String txCd = "07030000";	// 현금영수증 조회 요청
 
 		// 현금영수증 정보 조회
-		GiftCard receiptInfo = orderDao.getGiftCardReceiptInfo(param);
+		// GiftCard receiptInfo = orderDao.getGiftCardReceiptInfo(param);
 
 		J_PP_CLI_N c_PayPlus = new J_PP_CLI_N();
 		c_PayPlus.mf_init( "", env.getProperty("pg.kcp.gw.url"), env.getProperty("pg.kcp.gw.port"), Integer.parseInt(env.getProperty("pg.kcp.tx.mode")), env.getProperty("pg.kcp.log.dir"));
@@ -463,13 +461,13 @@ public class TscKcpService {
 		// 부분 취소
 		if("STPC".equals(param.getModType())) {
 			c_PayPlus.mf_set_us( mod_data_set_no, "mod_mny"  , String.valueOf(param.getUsGfcdAmt()));	// 부분취소 요청 금액
-			c_PayPlus.mf_set_us( mod_data_set_no, "rem_mny"  , String.valueOf(receiptInfo.getAmt()));	// 잔여금액 (부분취소 이전에 남은 금액)
+			c_PayPlus.mf_set_us( mod_data_set_no, "rem_mny"  , String.valueOf(param.getAmt()));			// 잔여금액 (부분취소 이전에 남은 금액)
 		}
 
 		c_PayPlus.mf_set_us( mod_data_set_no, "mod_type"  , param.getModType()) ;
-		c_PayPlus.mf_set_us( mod_data_set_no, "mod_value" , receiptInfo.getTradeNo()) ;
+		c_PayPlus.mf_set_us( mod_data_set_no, "mod_value" , param.getTradeNo()) ;
 		c_PayPlus.mf_set_us( mod_data_set_no, "mod_gubn"  , "MG01"  ) ;
-		c_PayPlus.mf_set_us( mod_data_set_no, "trad_time" , receiptInfo.getTradeTime()) ;
+		c_PayPlus.mf_set_us( mod_data_set_no, "trad_time" , param.getTradeTime()) ;
 
 		// 실행
 		c_PayPlus.mf_do_tx(env.getProperty("pg.kcp.site.cd"), "", txCd, cust_ip, String.valueOf(param.getOrdNo()), env.getProperty("pg.kcp.log.level"), "0");
@@ -486,8 +484,11 @@ public class TscKcpService {
 				result.setTradeNo(c_PayPlus.mf_get_res("cash_no"));
 				result.setAuthNo(c_PayPlus.mf_get_res("receipt_no"));
 
-				// 성공시 TB_GIFTCARD_RECEIPT AMT UPDATE
-				orderDao.updateGiftCardReceipt(result);
+				// 상품권 현금영수증 취소 시 금액 업데이트 처리
+				if ("giftCard".equals(param.getCashReceiptsGb())) {
+					// 성공시 TB_GIFTCARD_RECEIPT AMT UPDATE
+					orderDao.updateGiftCardReceipt(result);
+				}
 			}
 
 			// 성공이든 실패이든 로그성 데이터 TB_GIFTCARD_RECEIPT_API INSERT

+ 106 - 37
src/main/java/com/style24/core/biz/service/TscOrderChangeService.java

@@ -18,6 +18,7 @@ import com.style24.core.biz.dao.TscOrderDao;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.persistence.domain.DeliveryFee;
+import com.style24.persistence.domain.GiftCard;
 import com.style24.persistence.domain.Order;
 import com.style24.persistence.domain.OrderChange;
 import com.style24.persistence.domain.Payment;
@@ -201,6 +202,7 @@ public class TscOrderChangeService {
 		String pgTid						= map.getString("pgTid");										// PG거래ID
 		String payMeans						= map.getString("payMeans");									// 결제수단
 		String pgGb							= map.getString("pgGb");										// PG구분
+		String cashAuthNo					= map.getString("cashAuthNo");									// 현금영수증 승인번호
 		String accountNo					= map.getString("accountNo");									// 환불계좌번호
 		String accountNm					= map.getString("accountNm");									// 환불계좌주명
 		String bankCd						= map.getString("bankCd");										// 환불계좌은행코드
@@ -250,6 +252,7 @@ public class TscOrderChangeService {
 
 		// 3. 주문변경정보, 주문정보, 환불정보 (배송정책코드 별)
 		List<Payment> pgList = new ArrayList<>();
+		List<GiftCard> cashReceiptsList = new ArrayList<>();
 		for (Order obj : cancelDelvRefundList) {
 			// 취소금액 있을 시 처리
 			if (obj.getCnclRtnAmt() > 0) {
@@ -363,7 +366,18 @@ public class TscOrderChangeService {
 							}
 						}
 
-						// 3-2-7. 주문변경상세정보 및 이력 등록
+						// 3-2-7. 상품권 현금영수증 PG 취소 정보 설정
+						GiftCard giftCardCashReceipts = orderDao.getGiftCardReceiptInfo(ordNo);
+
+						if (StringUtils.isNotBlank(giftCardCashReceipts.getTradeNo())) {
+							giftCardCashReceipts.setModType("STPC");
+							giftCardCashReceipts.setCashReceiptsGb("giftCard");
+							giftCardCashReceipts.setUsGfcdAmt(gfcdUseAmt);
+							
+							cashReceiptsList.add(giftCardCashReceipts);
+						}
+
+						// 3-2-8. 주문변경상세정보 및 이력 등록
 						OrderChange changeDetailPo = new OrderChange();
 						changeDetailPo.setOrdChgSq(orderChange.getOrdChgSq());
 						changeDetailPo.setOrdDtlNo(vo.getOrdDtlNo());
@@ -491,6 +505,16 @@ public class TscOrderChangeService {
 
 					orderChangeDao.createDeliveryFee(delvFeeOrder);
 				}
+
+				// 3-7. 주문 현금영수증 취소 정보 설정 (무통장입금 결제완료, 실시간계좌이체)
+				GiftCard orderCashReceipts = orderDao.getOrderCashReceiptsInfo(ordNo);
+				if (StringUtils.isNotBlank(orderCashReceipts.getTradeNo())) {
+					orderCashReceipts.setModType("STPC");
+					orderCashReceipts.setCashReceiptsGb("payment");
+					orderCashReceipts.setUsGfcdAmt(pg.getPartCancelAmt());
+
+					cashReceiptsList.add(orderCashReceipts);
+				}
 			}
 		}
 
@@ -551,6 +575,7 @@ public class TscOrderChangeService {
 				kakaoPayService.cancelKakaoPayment(pg);
 			}
 
+			// 7. 환불정보 수정
 			Order refundOrder = new Order();
 			refundOrder.setOrdNo(ordNo);
 			refundOrder.setPaySq(pg.getPaySq());
@@ -559,6 +584,11 @@ public class TscOrderChangeService {
 
 			orderChangeDao.updateRefundInfo(refundOrder);
 		}
+		
+		// 7. 현금영수증 취소 처리
+		for (GiftCard cashReceipts : cashReceiptsList) {
+			kcpService.kcpCashReceiptCancel(cashReceipts);
+		}
 
 		return map;
 	}
@@ -1874,20 +1904,21 @@ public class TscOrderChangeService {
 			result = orderRefundService.cnclRtnRefundAmt(cnclReqList);
 
 			// 4. 부분취소 처리 정보 설정
-			result.setInt("ordNo", orderChange.getOrdNo());						// 주문번호
-			result.setString("chgReason", orderChange.getChgReason());			// 변경사유
-			result.setString("chgReasonNm", orderChange.getChgReasonNm());		// 변경사유명
-			result.setString("chgMemo", orderChange.getChgMemo());				// 변경메모
-			result.setString("accountNo", orderChange.getAccountNo());			// 환불계좌번호
-			result.setString("accountNm", orderChange.getAccountNm());			// 환불계좌예금주명
-			result.setString("bankCd", orderChange.getBankCd());				// 환불계좌은행코드
-			result.setString("allLastCanYn", allLastCanYn);						// 전체 마지막 취소 여부
-			result.setString("reqGbn", orderChange.getReqGbn());				// 신청구분
-			result.setString("ipAddress", orderChange.getIpAddress());			// IP주소
-			result.setInt("custNo", orderChange.getCustNo());					// 고객번호
-			result.setString("pgTid", refundPreInfo.getString("pgTid"));		// PG거래ID
-			result.setString("payMeans", refundPreInfo.getString("payMeans"));	// 결제수단
-			result.setString("pgGb", refundPreInfo.getString("pgGb"));			// PG구분
+			result.setInt("ordNo", orderChange.getOrdNo());							// 주문번호
+			result.setString("chgReason", orderChange.getChgReason());				// 변경사유
+			result.setString("chgReasonNm", orderChange.getChgReasonNm());			// 변경사유명
+			result.setString("chgMemo", orderChange.getChgMemo());					// 변경메모
+			result.setString("accountNo", orderChange.getAccountNo());				// 환불계좌번호
+			result.setString("accountNm", orderChange.getAccountNm());				// 환불계좌예금주명
+			result.setString("bankCd", orderChange.getBankCd());					// 환불계좌은행코드
+			result.setString("allLastCanYn", allLastCanYn);							// 전체 마지막 취소 여부
+			result.setString("reqGbn", orderChange.getReqGbn());					// 신청구분
+			result.setString("ipAddress", orderChange.getIpAddress());				// IP주소
+			result.setInt("custNo", orderChange.getCustNo());						// 고객번호
+			result.setString("pgTid", refundPreInfo.getString("pgTid"));			// PG거래ID
+			result.setString("payMeans", refundPreInfo.getString("payMeans"));		// 결제수단
+			result.setString("pgGb", refundPreInfo.getString("pgGb"));				// PG구분
+			result.setString("cashAuthNo", refundPreInfo.getString("cashAuthNo"));	// 현금영수증 승인번호
 
 			// 부분취소 처리
 			partialCancel(result, userNo);
@@ -2148,7 +2179,7 @@ public class TscOrderChangeService {
 	@SuppressWarnings("unchecked")
 	@Transactional("shopTxnManager")
 	public void allCnclComplete(OrderChange orderChange) {
-		int ordNo = orderChange.getOrdNo();
+		Integer ordNo = orderChange.getOrdNo();											// 주문번호
 		String chgReason = orderChange.getChgReason();									// G686_10:고객변심, G686_20:관리자취소, G686_30:품절취소
 		String chgReasonNm = orderChange.getChgReasonNm();								// 고객변심, 관리자취소, 품절취소
 		String chgGb = TscConstants.OrderChangeGb.CANCEL.value();						// 변경구분
@@ -2189,6 +2220,7 @@ public class TscOrderChangeService {
 		}
 
 		// 1. 주문변경 및 변경상세 정보 설정
+		List<GiftCard> cashReceiptsList = new ArrayList<>();
 		OrderChange orderChangeDetail = new OrderChange();
 		orderChangeDetail.setOrdNo(ordNo);
 		orderChangeDetail.setChgGb(chgGb);
@@ -2272,7 +2304,18 @@ public class TscOrderChangeService {
 			orderChangeDao.updateCustGiftCardRollback(giftCard);
 		}
 
-		// 5. 상품재고원복 (품절취소가 아닐 경우)
+		// 5. 상품권 현금영수증 PG 취소 정보 설정
+		GiftCard giftCardCashReceipts = orderDao.getGiftCardReceiptInfo(ordNo);
+
+		if (StringUtils.isNotBlank(giftCardCashReceipts.getTradeNo())) {
+			giftCardCashReceipts.setModType("STSC");
+			giftCardCashReceipts.setCashReceiptsGb("giftCard");
+			giftCardCashReceipts.setUsGfcdAmt(giftCardCashReceipts.getAmt());
+
+			cashReceiptsList.add(giftCardCashReceipts);
+		}
+
+		// 6. 상품재고원복 (품절취소가 아닐 경우)
 		if(!TscConstants.OrderCancelReason.SOLDOUT_CANCEL.value().equals(chgReason)) {
 			OrderChange sellQty = new OrderChange();
 			sellQty.setOrdChgSq(orderChangeDetail.getOrdChgSq());
@@ -2281,7 +2324,7 @@ public class TscOrderChangeService {
 			orderChangeDao.createSellQty(sellQty);
 		}
 
-		// 6. 쿠폰 원복처리
+		// 7. 쿠폰 원복처리
 		Order coupon = new Order();
 		coupon.setOrdNo(ordNo);
 		coupon.setUpdNo(updNo);
@@ -2289,13 +2332,13 @@ public class TscOrderChangeService {
 		orderChangeDao.updateCartCpnRollback(coupon);
 		orderChangeDao.updateDeliveryCpnRollback(coupon);
 
-		// 7. 사은품 전체 취소 (전체취소시 적용) 추후 사은품 관련 취소 로직 개발 예정
+		// 8. 사은품 전체 취소 (전체취소시 적용) 추후 사은품 관련 취소 로직 개발 예정
 		Order freegiftOrder = new Order();
 		freegiftOrder.setOrdNo(ordNo);
 		freegiftOrder.setUpdNo(updNo);
 		orderChangeDao.updateOrdFreegiftDel(freegiftOrder);
 
-		// 8. 주문상세 및 주문상세단품 정보 설정
+		// 9. 주문상세 및 주문상세단품 정보 설정
 		OrderChange orderDetail = new OrderChange();
 		orderDetail.setOrdNo(ordNo);
 		orderDetail.setOrdDtlStat(ordDtlStat);
@@ -2310,7 +2353,7 @@ public class TscOrderChangeService {
 		orderChangeDao.updateOrderDetailItemForAllCancel(orderDetail);
 		orderChangeDao.createOrderDetailItemHstForAllCancel(orderDetail);
 		
-		// 9. WMS 취소 처리
+		// 10. WMS 취소 처리
 		List<Order> wmsList = new ArrayList<>();
 		if(orderChange.getOrdDtlNoArr() != null && orderChange.getOrdDtlNoArr().length > 0) {
 			for (int i = 0; i < orderChange.getOrdDtlNoArr().length; i++) {
@@ -2327,7 +2370,7 @@ public class TscOrderChangeService {
 			}
 		}
 
-		// 10. 환불금액 등록
+		// 11. 환불금액 등록
 		Order refundOrder = orderChangeDao.getRefundInfoForAllCancel(vo);
 		refundOrder.setOrdNo(ordNo);
 		refundOrder.setPaySq(0);
@@ -2341,7 +2384,18 @@ public class TscOrderChangeService {
 
 		orderChangeDao.createRefund(refundOrder);
 
-		// 11. PG 연동
+		// 12. 주문 현금영수증 취소 정보 설정 (무통장입금 결제완료, 실시간계좌이체)
+		GiftCard orderCashReceipts = orderDao.getOrderCashReceiptsInfo(ordNo);
+
+		if (StringUtils.isNotBlank(orderCashReceipts.getTradeNo())) {
+			orderCashReceipts.setModType("STSC");
+			orderCashReceipts.setCashReceiptsGb("payment");
+			orderCashReceipts.setUsGfcdAmt(orderCashReceipts.getAmt());
+
+			cashReceiptsList.add(orderCashReceipts);
+		}
+
+		// 13. PG 연동
 		Payment pg = new Payment();
 		pg.setOrdNo(ordNo);
 		pg.setPayGb("O");
@@ -2383,6 +2437,19 @@ public class TscOrderChangeService {
 
 			orderChangeDao.updateRefundInfo(refundOrder);
 		}
+
+		// 14. 보증보험 취소 처리 (무통장입금 전 전체취소 시 처리)
+		if (TscConstants.OrderChangeStat.PAYMENT_BEFORE_CANCEL.value().equals(chgStat)) {
+			Order guarantee = new Order();
+			guarantee.setOrdNo(ordNo);
+
+			orderService.uSafeGuaranteePayedBeforeCancel(guarantee);
+		}
+
+		// 15. 현금영수증 취소 처리
+		for (GiftCard cashReceipts : cashReceiptsList) {
+			kcpService.kcpCashReceiptCancel(cashReceipts);
+		}
 	}
 
 	/**
@@ -2420,20 +2487,21 @@ public class TscOrderChangeService {
 			result = orderRefundService.cnclRtnRefundAmt(cnclReqList);
 
 			// 4. 부분취소 처리 정보 설정
-			result.setInt("ordNo", orderChange.getOrdNo());						// 주문번호
-			result.setString("chgReason", orderChange.getChgReason());			// 변경사유
-			result.setString("chgReasonNm", orderChange.getChgReasonNm());		// 변경사유명
-			result.setString("chgMemo", orderChange.getChgMemo());				// 변경메모
-			result.setString("accountNo", orderChange.getAccountNo());			// 환불계좌번호
-			result.setString("accountNm", orderChange.getAccountNm());			// 환불계좌예금주명
-			result.setString("bankCd", orderChange.getBankCd());				// 환불계좌은행코드
-			result.setString("allLastCanYn", allLastCanYn);						// 전체 마지막 취소 여부
-			result.setString("reqGbn", orderChange.getReqGbn());				// 신청구분
-			result.setString("ipAddress", orderChange.getIpAddress());			// IP주소
-			result.setInt("custNo", orderChange.getCustNo());					// 고객번호
-			result.setString("pgTid", refundPreInfo.getString("pgTid"));		// PG거래ID
-			result.setString("payMeans", refundPreInfo.getString("payMeans"));	// 결제수단
-			result.setString("pgGb", refundPreInfo.getString("pgGb"));			// PG구분
+			result.setInt("ordNo", orderChange.getOrdNo());							// 주문번호
+			result.setString("chgReason", orderChange.getChgReason());				// 변경사유
+			result.setString("chgReasonNm", orderChange.getChgReasonNm());			// 변경사유명
+			result.setString("chgMemo", orderChange.getChgMemo());					// 변경메모
+			result.setString("accountNo", orderChange.getAccountNo());				// 환불계좌번호
+			result.setString("accountNm", orderChange.getAccountNm());				// 환불계좌예금주명
+			result.setString("bankCd", orderChange.getBankCd());					// 환불계좌은행코드
+			result.setString("allLastCanYn", allLastCanYn);							// 전체 마지막 취소 여부
+			result.setString("reqGbn", orderChange.getReqGbn());					// 신청구분
+			result.setString("ipAddress", orderChange.getIpAddress());				// IP주소
+			result.setInt("custNo", orderChange.getCustNo());						// 고객번호
+			result.setString("pgTid", refundPreInfo.getString("pgTid"));			// PG거래ID
+			result.setString("payMeans", refundPreInfo.getString("payMeans"));		// 결제수단
+			result.setString("pgGb", refundPreInfo.getString("pgGb"));				// PG구분
+			result.setString("cashAuthNo", refundPreInfo.getString("cashAuthNo"));	// 현금영수증 승인번호
 
 			// 부분취소 처리
 			partialCancel(result, userNo);
@@ -2535,6 +2603,7 @@ public class TscOrderChangeService {
 		result.setString("pgTid", cnclRtn.getPgTid());							// PG거래ID
 		result.setString("payMeans", cnclRtn.getPayMeans());					// 결제수단
 		result.setString("pgGb", cnclRtn.getPgGb());							// PG구분
+		result.setString("cashAuthNo", cnclRtn.getCashAuthNo());				// 현금영수증 승인번호
 		result.set("cnclReqList", cnclReqList);									// 취소신청목록
 
 		return result;

+ 147 - 0
src/main/java/com/style24/core/biz/thirdparty/NetpathyMailSender.java

@@ -0,0 +1,147 @@
+package com.style24.core.biz.thirdparty;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.PostConstruct;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.style24.core.biz.dao.NetpathyMailDao;
+import com.style24.persistence.domain.MailTemplate;
+import com.style24.persistence.domain.Netpathy;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.util.GagaStringUtil;
+
+/**
+ * 넷퍼시를 이용한 메일 발송
+ * 
+ * @author gagamel
+ * @since 2021. 5. 10
+ */
+@Component
+@Slf4j
+public class NetpathyMailSender {
+
+//	// 발신자전화번호
+//	private String callbackTelNo;
+//
+//	private String domainUrl;
+
+	@Autowired
+	private Environment env;
+
+	@Autowired
+	private NetpathyMailDao netpathyDao;
+
+	@PostConstruct
+	public void init() {
+//		domainUrl = env.getProperty("domain.front");
+//		callbackTelNo = TscConstants.CALLCENTER_TEL_NO;
+
+//		log.debug("\n\n---- NetpathyMailSender initialization started ----");
+//		log.debug("domainUrl: [{}]", domainUrl);
+//		log.debug("callbackTelNo: [{}]", callbackTelNo);
+//		log.debug("\n--- NetpathyMailSender initialization completed ----\n");
+	}
+
+	/**
+	 * 메일 발송
+	 * @param mailtSq - 메일템플릿번호
+	 * @param toAddress - 보낼 메일 주소
+	 * @param replaceInfo - 메시지내용 중 대체할 정보
+	 * @author gagamel
+	 * @since 2021. 5. 10
+	 */
+	@Transactional("shopTxnManager")
+	public void send(Integer mailtSq, String toAddress, GagaMap replaceInfo) {
+		// 메일템플릿 조회
+		MailTemplate mailTemplate = this.getMailTemplate(mailtSq, replaceInfo);
+
+		Netpathy netpathy = new Netpathy();
+//		netpathy.setLegacyid(legacyid);
+		netpathy.setAutotype("TST");
+		netpathy.setEmail(toAddress);
+//		netpathy.setName(name);
+		netpathy.setTitle(mailTemplate.getMailtNm());
+		netpathy.setContent(mailTemplate.getMailContent());
+
+		// 메일 생성
+		netpathyDao.createMail(netpathy);
+	}
+
+	/**
+	 * 메일템플릿 조회
+	 * 		어드민의 "회원/마케팅 > 마케팅 > 메일템플릿관리" 화면에서 등록/수정 시 mailTemplate 캐시를 삭제
+	 * @param mailtSq - 메일템플릿번호
+	 * @param replaceInfo - 메시지내용 중 대체할 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 5. 10
+	 */
+	@Cacheable(value = "mailTemplate", key = "#mailtSq")
+	public MailTemplate getMailTemplate(Integer mailtSq, GagaMap replaceInfo) {
+		MailTemplate mailTemplate = netpathyDao.getMailTemplate(mailtSq);
+		mailTemplate.setMailtNm(GagaStringUtil.replace(this.mergeData(mailTemplate.getMailtNm(), replaceInfo), "&gt;", ">"));
+		mailTemplate.setMailContent(GagaStringUtil.replace(this.mergeData(mailTemplate.getMailContent(), replaceInfo), "&gt;", ">"));
+		return mailTemplate;
+	}
+
+	/**
+	 * 메시지 문자열 중에 '#{'로 시작하고 '}'로 끝나는 부분을 대체할 정보(replaceInfo)로 대체해 반환한다.
+	 * @param message - 메시지 문자열
+	 * @param replaceInfo - 알림톡 메시지 중 대체할 정보
+	 * @return
+	 * @author gagamel
+	 * @date 2018. 1. 21.
+	 */
+	private String mergeData(String message, GagaMap replaceInfo) {
+		List<String> keyList = getKeyList(message, "#{", "}");
+
+		String key = "";
+		String value = "";
+
+		if (!keyList.isEmpty()) {
+			for (int i = 0; i < keyList.size(); i++) {
+				key = keyList.get(i);
+				value = replaceInfo.getString(key);
+				message = message.replace("#{" + key + "}", value);
+			}
+		}
+
+		return message;
+	}
+
+	/**
+	 * 입력 문자열로부터 시작 태그와 종료 태그 안의 key 목록을 반환한다.
+	 * @param inputStr - 입력 문자열
+	 * @param startTag - 시작 태그
+	 * @param endTag - 종료 태그
+	 * @return
+	 * @author gagamel
+	 * @date 2018. 1. 21.
+	 */
+	private List<String> getKeyList(String inputStr, String startTag, String endTag) {
+		List<String> keyList = new ArrayList<>();
+
+		String targetStr = inputStr;
+
+		while (targetStr.indexOf(startTag) > -1) {
+			int startPos = targetStr.indexOf(startTag) + startTag.length();
+			int endPos = targetStr.indexOf(endTag, startPos);
+
+			keyList.add(targetStr.substring(startPos, endPos));
+			targetStr = targetStr.substring(endPos + endTag.length());
+		}
+
+		return keyList;
+	}
+
+}

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

@@ -1,6 +1,7 @@
 package com.style24.persistence.domain;
 
 import com.style24.persistence.TscBaseDomain;
+
 import lombok.Data;
 
 /**
@@ -62,4 +63,5 @@ public class GiftCard extends TscBaseDomain {
 	private String ordNm;			// 주문자명
 	private String ordEmail;		// 주문자 E-Mail
 	private String modType;			// 요청 구분 (STSQ : 조회, STSC : 전체취소, STPC : 부분취소)
+	private String cashReceiptsGb;	// 현금영수증 구분 (상품권 : giftCard, 결제 : payment)
 }

+ 33 - 0
src/main/java/com/style24/persistence/domain/MailTemplate.java

@@ -0,0 +1,33 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 메일템플릿 Domain
+ *
+ * @author csh9191
+ * @since 2021. 01. 29.
+ */
+
+@SuppressWarnings("serial")
+@Data
+public class MailTemplate extends TscBaseDomain {
+
+	private Integer mailhfSq;		// 메일헤더푸터 일련번호
+	private String mailhfNm;		// 메일헤더푸터 타이틀명
+	private String mailhfGb;		// 메일헤더푸터 구분 H:헤더 F:푸터
+	private String mailhfContent;	// 메일헤더푸터 내용
+	private String useYn;			// 사용여부
+
+	private String searchTxt;		// 검색어
+
+	private Integer mailtSq;		// 메일템플릿일련번호
+	private String mailtNm;			// 메일템플릿명
+	private String mailtGb;			// 메일템플릿구분(A:자동메일, M:마케팅메일)
+	private Integer mailhSq;		// 메일헤더일련번호
+	private Integer mailfSq;		// 메일푸터일련번호
+	private String mailContent;		// 메일내용
+
+}

+ 25 - 0
src/main/java/com/style24/persistence/domain/Netpathy.java

@@ -0,0 +1,25 @@
+package com.style24.persistence.domain;
+
+import java.io.Serializable;
+
+import lombok.Data;
+
+/**
+ * 넷퍼시메일 Domain
+ *
+ * @author gagamel
+ * @since 2021. 5. 10
+ */
+
+@SuppressWarnings("serial")
+@Data
+public class Netpathy implements Serializable {
+
+	private String legacyid;	// 회원ID
+	private String autotype;	// 자동메일타입
+	private String email;		// 이메일
+	private String name;		// 이름
+	private String title;		// 메일제목
+	private String content;		// 메일내용
+
+}

+ 60 - 0
src/main/java/com/style24/persistence/mybatis/shop/NetpathyMail.xml

@@ -0,0 +1,60 @@
+<?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="com.style24.core.biz.dao.NetpathyMailDao">
+
+	<!-- 메일템플릿 조회 -->
+	<select id="getMailTemplate" parameterType="Integer" resultType="MailTemplate">
+		/* NetpathyMail.getMailTemplate */
+		SELECT MAILT_SQ     /*메일템플릿일련번호*/
+		     , MAILT_GB     /*메일템플릿구분*/
+		     , MAILH_SQ     /*메일템플릿헤더일련번호*/
+		     , MAILF_SQ     /*메일템플릿푸터일련번호*/
+		     , MAILT_NM     /*메일템플릿명*/
+		     , MAIL_CONTENT /*메일내용*/
+		FROM   TB_MAILT
+		WHERE  MAILT_SQ = #{mailtSq}
+	</select>
+	
+	<!-- 메일 생성 -->
+	<insert id="createMail" parameterType="Netpathy">
+		/* NetpathyMail.createMail */
+		INSERT INTO AUTOMAIL_INTERFACE (
+		       LEGACYID     /*회원ID*/
+		     , AUTOTYPE     /*자동메일타입*/
+		     , EMAIL        /*이메일*/
+		     , NAME         /*이름*/
+		     , INSERTDATE   /*입력일*/
+		     , SENDTIME     /*전송일*/
+		     -- , OPENTIME
+		     -- , SENTTIME
+		     , SENDYN       /*전송여부*/
+		     -- , CMPNCODE
+		     -- , FROMADDRESS
+		     -- , FROMNAME
+		     , TITLE        /*메일제목*/
+		     , CONTENT      /*메일내용*/
+		     -- , TAG1
+		     -- , TAG2
+		     -- , TAG3
+		     -- , TAG4
+		     -- , TAG5
+		     -- , TAG6
+		     -- , TAG7
+		     -- , TAG8
+		     -- , TAG9
+		     -- , TAG10
+		)
+		VALUES (
+		       #{legacyid}
+		     , #{autotype}
+		     , #{email}
+		     , #{name}
+		     , NOW()
+		     , NOW()
+		     , 'N'
+		     , #{title}
+		     , #{content}
+		)
+	</insert>
+
+</mapper>

+ 22 - 1
src/main/java/com/style24/persistence/mybatis/shop/TscOrder.xml

@@ -203,6 +203,7 @@
 								WHERE  Z.BRAND_CD = G2.BRAND_CD) AS BRAND_ENM
 							 , G2.GOODS_CD AS ITEM_CD
 							 , G2.GOODS_NM AS ITEM_NM
+							 , IFNULL((SELECT COLOR_KNM FROM TB_COLOR WHERE COLOR_CD = IFNULL(NULLIF(ODI.OPT_CD1,'') , G1.MAIN_COLOR_CD ) AND USE_YN  = 'Y'), ODI.OPT_CD1) AS COLOR_NM
 							 , ODI.OPT_CD1
 							 , ODI.OPT_CD2
 							 , OD.EXTMALL_ORDER_ID
@@ -494,6 +495,7 @@
 				 WHERE Z.BRAND_CD = G2.BRAND_CD)       AS BRAND_ENM
 			 , G2.GOODS_CD                             AS ITEM_CD
 			 , G2.GOODS_NM                             AS ITEM_NM
+			 , IFNULL((SELECT COLOR_KNM FROM TB_COLOR WHERE COLOR_CD = IFNULL(NULLIF(ODI.OPT_CD1,'') , G1.MAIN_COLOR_CD ) AND USE_YN  = 'Y'), ODI.OPT_CD1) AS COLOR_NM
 			 , ODI.OPT_CD1
 			 , ODI.OPT_CD2
 			 , ODI.ITEM_QTY
@@ -737,6 +739,7 @@
 		     , OC.CHG_GB
 		     , FN_GET_CODE_NM('G680', OC.CHG_GB)       AS CHG_GB_NM
 		     , OD.GOODS_CD
+		     , IFNULL((SELECT COLOR_KNM FROM TB_COLOR WHERE COLOR_CD = IFNULL(NULLIF(ODI.OPT_CD1,'') , G.MAIN_COLOR_CD ) AND USE_YN  = 'Y'), ODI.OPT_CD1) AS COLOR_NM
 		     , ODI.OPT_CD1
 		     , ODI.OPT_CD2
 		     , OCD.CHG_STAT
@@ -766,6 +769,8 @@
 		    ON OC.ORD_CHG_SQ = OCD.ORD_CHG_SQ
 		 INNER JOIN TB_ORDER_DETAIL OD
 		    ON OCD.ORD_DTL_NO = OD.ORD_DTL_NO
+		 INNER JOIN TB_GOODS G
+		    ON G.GOODS_CD = OD.GOODS_CD
 		 INNER JOIN (
 		      SELECT X.ORD_DTL_ITEM_SQ
 		           , X.ORD_DTL_NO
@@ -3693,7 +3698,7 @@
 	</update>
 
 	<!-- 상품권 현금영수증 정보 조회 -->
-	<select id="getGiftCardReceiptInfo" parameterType="GiftCard" resultType="GiftCard">
+	<select id="getGiftCardReceiptInfo" parameterType="Integer" resultType="GiftCard">
 		/* TscOrder.getGiftCardReceiptInfo : 상품권 현금영수증 정보 조회 */
 		SELECT GR.ORD_NO
 		     , GR.TRADE_NO
@@ -3705,6 +3710,22 @@
 		ON     GR.ORD_NO = O.ORD_NO
 		WHERE  GR.ORD_NO = #{ordNo}
 	</select>
+
+	<!-- 주문 현금영수증 정보 조회 -->
+	<select id="getOrderCashReceiptsInfo" parameterType="Integer" resultType="GiftCard">
+		/* TscOrder.getOrderCashReceiptsInfo */
+		SELECT P.ORD_NO
+		     , P.CASH_TRADE_NO                      AS TRADE_NO
+		     , P.CASH_AUTH_NO                       AS AUTH_NO
+		     , SUM(P.PAY_AMT)                       AS AMT
+		     , DATE_FORMAT(O.ORD_DT,'%Y%m%d%H%i%S') AS TRADE_TIME
+		  FROM TB_PAYMENT P
+		 INNER JOIN TB_ORDER O
+		    ON P.ORD_NO = O.ORD_NO
+		 WHERE P.ORD_NO = #{ordNo}
+		   AND P.CASH_TRADE_NO IS NOT NULL
+		 GROUP BY P.ORD_NO, P.CASH_TRADE_NO, P.CASH_AUTH_NO, O.ORD_DT
+	</select>
 	
 	<!-- 포인트사용 기준정보 조회 -->
 	<select id="getPointUseEnvset" resultType="Order">

+ 14 - 0
src/main/java/com/style24/persistence/mybatis/shop/TscOrderChange.xml

@@ -2552,6 +2552,7 @@
 		     , P.PG_TID
 		     , P.PAY_MEANS
 		     , P.PAY_STAT
+		     , P.CASH_AUTH_NO
 		     , CASE WHEN NULLIF(OD.INVOICE_NO, '') IS NULL THEN 'N'
 		            ELSE 'Y'
 		        END AS DELV_YN
@@ -2655,6 +2656,19 @@
 		  FROM TB_PAYMENT
 		 WHERE ORD_NO = #{ordNo}
 	</select>
+	
+	<!-- 상품권 현금영수증 신청 정보 조회 -->
+	<select id="getGiftCardReceiptsInfo" parameterType="Integer" resultType="GiftCard">
+		/* TscOrderChange.getGiftCardReceiptsInfo */
+		SELECT ORD_NO
+		     , TRADE_NO
+		     , AUTH_NO
+		     , AMT
+		     , REG_DT
+		     , UPD_DT
+		  FROM TB_GIFTCARD_RECEIPT
+		 WHERE ORD_NO = #{ordNo}
+	</select>
 </mapper>