Jelajahi Sumber

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

Conflicts:
	src/main/java/com/style24/persistence/mybatis/shop/TscOrder.xml
tsit14 5 tahun lalu
induk
melakukan
6bae0007e6

+ 32 - 0
src/main/java/com/style24/core/biz/dao/TscPointDao.java

@@ -5,6 +5,8 @@ import org.springframework.stereotype.Repository;
 import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.Point;
 
+import java.util.Collection;
+
 
 /**
  * 포인트 Dao
@@ -74,4 +76,34 @@ public interface TscPointDao {
 	 */
 	int getOrderDecisionPointHstCount(Point point);
 
+	/**
+	 * 가용포인트 목록
+	 *
+	 * @param custNo - 고객번호
+	 * @return Collection<Point> - 가용 포인트 목록
+	 * @author jsshin
+	 * @since 2021. 06. 14
+	 */
+	Collection<Point> getCustomerRmPntAmtList(Integer custNo);
+
+	/**
+	 * 포인트 차감
+	 *
+	 * @param point - 차감포인트, 포인트 일련번호
+	 * @return int - 결과
+	 * @author jsshin
+	 * @since 2021. 06. 14
+	 */
+	int updatePointDeduction(Point point);
+
+	/**
+	 * 가용포인트 합산
+	 *
+	 * @param custNo - 고객번호
+	 * @return int - 가용 포인트
+	 * @author jsshin
+	 * @since 2021. 06. 14
+	 */
+	int getCustomerSumRmPntAmt(Integer custNo);
+
 }

+ 80 - 2
src/main/java/com/style24/core/biz/service/TscKakaotalkService.java

@@ -1025,7 +1025,7 @@ public class TscKakaotalkService {
 
 		if (ansSq > 0) {
 			// 테스트중
-			if ("전석훈".equals(orderChange.getOrdNm()) || "이태영".equals(orderChange.getOrdNm()) || "김지철".equals(orderChange.getOrdNm()) || "신주승".equals(orderChange.getOrdNm())) {
+			if ("전석훈".equals(orderChange.getOrdNm()) || "이태영".equals(orderChange.getOrdNm()) || "김지철".equals(orderChange.getOrdNm()) || "신주승".equals(orderChange.getOrdNm()) || "송대근".equals(orderChange.getOrdNm())) {
 				kakaoSender.send(ansSq, dm, replaceInfo);
 			}
 
@@ -1097,7 +1097,7 @@ public class TscKakaotalkService {
 
 		if (ansSq > 0) {
 			// 테스트중
-			if ("전석훈".equals(orderChange.getOrdNm()) || "이태영".equals(orderChange.getOrdNm()) || "김지철".equals(orderChange.getOrdNm()) || "신주승".equals(orderChange.getOrdNm())) {
+			if ("전석훈".equals(orderChange.getOrdNm()) || "이태영".equals(orderChange.getOrdNm()) || "김지철".equals(orderChange.getOrdNm()) || "신주승".equals(orderChange.getOrdNm()) || "송대근".equals(orderChange.getOrdNm())) {
 				SsgDirectMessage dm = new SsgDirectMessage();
 				dm.setFuserid(String.valueOf(senderNo));
 				dm.setFdestine(orderChange.getOrdPhnno());
@@ -1125,4 +1125,82 @@ public class TscKakaotalkService {
 			}
 		}
 	}
+
+	/**
+	 * 교환접수 알림톡
+	 *
+	 * @param OrderChange
+	 * @param senderNo
+	 * @author card007
+	 * @since 2021. 06. 07
+	 */
+	@Transactional("shopTxnManager")
+	public void sendOrderExchangeRequest(OrderChange orderChange, Integer senderNo) throws Exception {
+		Integer ansSq;
+		String contactType;
+		String contactContents;
+		int addPayCost = orderChange.getAddPayCost();
+		String wdGb = orderChange.getWdGb();
+		String chgerBaseAddr = orderChange.getChgerBaseAddr() + " " + orderChange.getChgerDtlAddr();
+
+		if ("D".equals(wdGb)) {
+			chgerBaseAddr = "직접배송";
+		}
+
+		if (addPayCost > 0) {
+			ansSq = SsgKakaoSender.KakaoAnswerSq.EXCHANGE_ADD_COST.value();
+			contactType = TscConstants.ContactType.EXCHANGE_ADD_PAYMENT.value();
+			contactContents = "교환-추가배송비결제안내";
+		} else {
+			ansSq = SsgKakaoSender.KakaoAnswerSq.EXCHANGE_REQUEST.value();
+			contactType = TscConstants.ContactType.EXCHANGE_RECEIPT.value();
+			contactContents = "교환-교환접수완료";
+		}
+
+		// 상품명 처리
+		String goodsNm = orderChange.getGoodsNm();
+		int goodsCnt = orderChange.getGoodsCnt();
+		if (goodsCnt > 0) {
+			goodsNm += " 외 " + goodsCnt + "건";
+		}
+
+		GagaMap replaceInfo = new GagaMap();
+		replaceInfo.setString("siteNm"				, siteNm);
+		replaceInfo.setString("ordNm"				, orderChange.getOrdNm());
+		replaceInfo.setInt("ordNo"					, orderChange.getOrdNo());
+		replaceInfo.setString("goodsNm"				, goodsNm);
+		replaceInfo.setInt("goodsCnt"				, orderChange.getGoodsCnt());
+		replaceInfo.setString("chgerBaseAddr"		, chgerBaseAddr);
+		replaceInfo.setInt("addPayCost"				, addPayCost);
+
+		if (ansSq > 0) {
+			// 테스트중
+			if ("전석훈".equals(orderChange.getOrdNm()) || "이태영".equals(orderChange.getOrdNm()) || "김지철".equals(orderChange.getOrdNm()) || "신주승".equals(orderChange.getOrdNm()) || "송대근".equals(orderChange.getOrdNm())) {
+				SsgDirectMessage dm = new SsgDirectMessage();
+				dm.setFuserid(String.valueOf(senderNo));
+				dm.setFdestine(orderChange.getOrdPhnno());
+				dm.setFkkoresendtype("LMS");
+				dm.setButtonNm("교환 접수 확인");
+
+				kakaoSender.send(ansSq, dm, replaceInfo);
+			}
+
+			try {
+				if (orderChange.getCustNo() > 0) {
+					// 고객접촉이력 정보
+					CustContactHst custContactHst = new CustContactHst();
+					custContactHst.setContactType(contactType);												// 접촉유형:교환-교환접수완료, 교환-추가배송비결제안내(공통코드G054)
+					custContactHst.setContactMethod(TscConstants.ContactMethod.KAKAOTALK.value());			// 접촉방법:알림톡+문자(공통코드G055)
+					custContactHst.setContactContents(contactContents);
+					custContactHst.setReceiverNo(orderChange.getCustNo());
+					custContactHst.setSenderNo(senderNo);
+					custContactHst.setRegNo(senderNo);
+					coreCustomerService.createCustomerContactHistory(custContactHst);
+				}
+			} catch (Exception e) {
+				log.error("error", e);
+				// Do nothing
+			}
+		}
+	}
 }

+ 34 - 2
src/main/java/com/style24/core/biz/service/TscMailService.java

@@ -485,8 +485,8 @@ public class TscMailService {
 			if (replaceInfo.getInt("custNo") > 0) {
 				// 고객접촉이력 정보
 				CustContactHst custContactHst = new CustContactHst();
-				custContactHst.setContactType(TscConstants.ContactType.CANCEL_INFO.value());            // 접촉유형:주문-취소안내(공통코드G054)
-				custContactHst.setContactMethod(TscConstants.ContactMethod.EMAIL.value());                // 접촉방법:알림톡+문자(공통코드G055)
+				custContactHst.setContactType(TscConstants.ContactType.CANCEL_INFO.value());				// 접촉유형:주문-취소안내(공통코드G054)
+				custContactHst.setContactMethod(TscConstants.ContactMethod.EMAIL.value());					// 접촉방법:알림톡+문자(공통코드G055)
 				custContactHst.setContactContents("주문-취소안내");
 				custContactHst.setReceiverNo(replaceInfo.getInt("custNo"));
 				custContactHst.setSenderNo(senderNo);
@@ -499,4 +499,36 @@ public class TscMailService {
 		}
 	}
 
+	/**
+	 * 주문 반품 안내
+	 *
+	 * @param GagaMap
+	 * @param Integer
+	 * @author card007
+	 * @since 2021. 06. 14
+	 */
+	@Transactional("shopTxnManager")
+	public void sendOrderReturn(GagaMap replaceInfo, Integer senderNo) {
+
+		// 주문 취소 메일 발송
+		netpathyMailSender.send(NetpathyMailSender.MailAnswerSq.RETURN_REQUEST.value(), replaceInfo.getString("ordEmail"), replaceInfo);
+
+		try {
+			if (replaceInfo.getInt("custNo") > 0) {
+				// 고객접촉이력 정보
+				CustContactHst custContactHst = new CustContactHst();
+				custContactHst.setContactType(TscConstants.ContactType.RETURN_RECEIPT.value());				// 접촉유형:반품-반품접수완료(공통코드G054)
+				custContactHst.setContactMethod(TscConstants.ContactMethod.EMAIL.value());					// 접촉방법:이메일(공통코드G055)
+				custContactHst.setContactContents("반품-반품접수완료");
+				custContactHst.setReceiverNo(replaceInfo.getInt("custNo"));
+				custContactHst.setSenderNo(senderNo);
+				custContactHst.setRegNo(senderNo);
+				coreCustomerService.createCustomerContactHistory(custContactHst);
+			}
+		} catch (Exception e) {
+			log.error("error", e);
+			// Do nothing
+		}
+	}
+
 }

+ 425 - 123
src/main/java/com/style24/core/biz/service/TscOrderChangeService.java

@@ -1072,6 +1072,8 @@ public class TscOrderChangeService {
 				pg.setPayAmt(pg.getPartCancelAmt());
 				
 				kakaoPayService.cancelKakaoPayment(pg);
+			} else if (TscConstants.PgGb.NAVER_ORDER.value().equals(pgGb)) {
+				orderDao.insertPaymentCancel(pg);
 			}
 
 			// 7. 환불정보 수정
@@ -2743,6 +2745,8 @@ public class TscOrderChangeService {
 			} else if (TscConstants.PgGb.KAKAO.value().equals(pgGb)) {
 				pg.setPayMeans(payment.getPayMeans());
 				kakaoPayService.cancelKakaoPayment(pg);
+			} else if (TscConstants.PgGb.NAVER_ORDER.value().equals(pgGb)) {
+				orderDao.insertPaymentCancel(pg);
 			}
 
 			// 11. 환불금액 정보 수정
@@ -4301,19 +4305,6 @@ public class TscOrderChangeService {
 		cancelMap.setString("supplyCompNm", supplyCompNm);
 		cancelMap.setString("selfGoodsYn", selfGoodsYn);
 		cancelDelvList.add(cancelMap);
-		
-		// 이미지 URL 설정
-		String hasSsl = env.getProperty("has-ssl");
-		String protocol;
-
-		if ("true".equals(hasSsl)) {
-			protocol = "https:";
-		} else {
-			protocol = "http:";
-		}
-
-		String imgUrl = protocol + env.getProperty("upload.goods.view") + "/";
-		
 
 		StringBuilder sb = new StringBuilder();
 
@@ -4355,116 +4346,7 @@ public class TscOrderChangeService {
 			sb.append("																	<tr>\n");
 			sb.append("																		<td colspan=\"5\" height=\"20px;\" style=\"height: 20px;border:0; border-bottom: 1px; border-color: #dddddd; border-style: solid; box-sizing: border-box;\"></td>\n");
 			sb.append("																	</tr>\n");
-			int idx = 0;
-			for (OrderChange orderChange : (List<OrderChange>) map.get("cancelDetailList")) {
-				if (idx > 0) {
-					sb.append("																	<!-- 점선 -->\n");
-					sb.append("																	<tr>\n");
-					sb.append("																		<td width=\"30px;\"></td>\n");
-					sb.append("																		<td colspan=\"3\" height=\"1\" style=\"border: 1px; border-top-color: #ddd; border-top-style: dashed;\"></td>\n");
-					sb.append("																		<td width=\"30px;\"></td>\n");
-					sb.append("																	</tr>\n");
-					sb.append("																	<!-- 점선 끝 -->\n");
-					sb.append("																	\n");
-				}
-				sb.append("																	<!-- 아이템 테이블 시작 -->\n");
-				sb.append("																	<tr>\n");
-				sb.append("																		<td colspan=\"5\" style=\"text-align: left;font-size: 18px;font-family:'Apple SD Gothic Neo','나눔고딕',NanumGothic,'맑은고딕',Malgun Gothic, Helvetica, sans-serif;color: #222222;\">\n");
-				sb.append("																			<!-- 아이템 컨텐츠 시작 -->\n");
-				sb.append("																			<table style=\"width:100%;height:100%;margin:0;padding:0;font-size: 14px;\" cellspacing=\"0\" cellpadding=\"0\">\n");
-				sb.append("																				<tbody>\n");
-				sb.append("																					<tr>\n");
-				sb.append("																						<td height=\"30px;\" style=\"height: 30px;\"></td>\n");
-				sb.append("																					</tr>\n");
-				sb.append("																					<tr>\n");
-				sb.append("																						<td width=\"40px;\" rowspan=\"10\"></td>\n");
-				sb.append("																						<td width=\"100px;\" height=\"150px;\" rowspan=\"10\" valign=\"top\" style=\"margin:0;padding:0\">\n");
-				sb.append("																							<a href=\"#none\" target=\"_blank\" style=\"margin:0;padding:0\">\n");
-				sb.append("																								<span style=\"background: #f5f5f5;width: 100px;height: 150px;margin:0;padding:0\">\n");
-				sb.append("																									<img src=\"");
-				sb.append(imgUrl);
-				sb.append(orderChange.getSysImgNm());
-				sb.append("?RS=100\" alt=\"이미지\" style=\"width: 100px;height: 150px;margin:0;padding:0\">\n");
-				sb.append("																								</span>\n");
-				sb.append("																							</a>\n");
-				sb.append("																						</td>\n");
-				sb.append("																						<td width=\"30px;\" rowspan=\"10\"></td>\n");
-				sb.append("																						<td width=\"370px;\" height=\"10px;\"></td>\n");
-				sb.append("																						<td width=\"40px;\" rowspan=\"10\"></td>\n");
-				sb.append("																					</tr>\n");
-				sb.append("																					<tr>\n");
-				sb.append("																						<td style=\"font-family:'Apple SD Gothic Neo',verdana,Arial,'나눔고딕',NanumGothic,'맑은고딕',Malgun Gothic, Helvetica, sans-serif;\">\n");
-				sb.append("																							");
-				sb.append(orderChange.getBrandNm());
-				sb.append("\n");
-				sb.append("																						</td>\n");
-				sb.append("																					</tr>\n");
-				sb.append("																					<tr>\n");
-				sb.append("																						<td height=\"10px;\" style=\"height: 10px;\"></td>\n");
-				sb.append("																					</tr>\n");
-				sb.append("																					<tr>\n");
-				sb.append("																						<td style=\"color: #222222;font-size: 16px;font-weight: bold;letter-spacing: -0.05em;\">\n");
-				sb.append("																							<a href=\"#none\" target=\"_blank\" style=\"display: block; color: #222222; font-size: 16px; font-weight: bold; letter-spacing: -0.025em; text-decoration: none;\">\n");
-				sb.append("																								");
-				sb.append(orderChange.getGoodsNm());
-				sb.append("\n");
-				sb.append("																							</a>\n");
-				sb.append("																						</td>\n");
-				sb.append("																					</tr>\n");
-				sb.append("																					<tr>\n");
-				sb.append("																						<td height=\"10px;\" style=\"height: 10px;\"></td>\n");
-				sb.append("																					</tr>\n");
-				sb.append("																					<tr>\n");
-				sb.append("																						<td>\n");
-				if ("G056_S".equals(orderChange.getGoodsType())) {
-					for (int i=0; i < orderChange.getColorNmArr().length; i++) {
-						sb.append("																							<p style=\"margin: 0; padding: 0; font-family:'Apple SD Gothic Neo','나눔고딕',NanumGothic,'맑은고딕',Malgun Gothic, Helvetica, sans-serif;font-weight:200;color: #666666; line-height: 2;\">");
-						sb.append(orderChange.getItemNmArr()[i]);
-						sb.append(" / ");
-						sb.append(orderChange.getColorNmArr()[i]);
-						sb.append(" / ");
-						sb.append(orderChange.getOptCd2Arr()[i]);
-						sb.append("</p>\n");
-					}
-				} else {
-					sb.append("																							<p style=\"margin: 0; padding: 0; font-family:'Apple SD Gothic Neo','나눔고딕',NanumGothic,'맑은고딕',Malgun Gothic, Helvetica, sans-serif;font-weight:200;color: #666666; line-height: 2;\">");
-					sb.append(orderChange.getColorNm());
-					sb.append(" / ");
-					sb.append(orderChange.getOptCd2());
-					sb.append("</p>\n");
-				}
-				sb.append("																						</td>\n");
-				sb.append("																					</tr>\n");
-				sb.append("																					<tr>\n");
-				sb.append("																						<td height=\"5px;\" style=\"height: 5px;\"></td>\n");
-				sb.append("																					</tr>\n");
-				sb.append("																					<tr>\n");
-				sb.append("																						<td height=\"10px;\" style=\"height: 10px;\"></td>\n");
-				sb.append("																					</tr>\n");
-				sb.append("																					<tr>\n");
-				sb.append("																						<td>\n");
-				sb.append("																							<span>");
-				sb.append(orderChange.getChgQty());
-				sb.append("개</span>\n");
-				// sb.append("																							<span style=\"width: 12px;padding-left:12px;\"></span>\n");
-				// sb.append("																							<span style=\"display: inline-block; vertical-align: middle; width: 1px; height: 14px; background: #ddd;\"></span>\n");
-				// sb.append("																							<span style=\"width: 12px;padding-right:12px;\"></span>\n");
-				sb.append("																						</td>\n");
-				sb.append("																					</tr>\n");
-				sb.append("																					<tr>\n");
-				sb.append("																						<td height=\"10px;\" style=\"height: 10px;\"></td>\n");
-				sb.append("																					</tr>\n");
-				sb.append("																					<tr>\n");
-				sb.append("																						<td height=\"20px;\" style=\"height: 20px;\"></td>\n");
-				sb.append("																					</tr>\n");
-				sb.append("																				</tbody>\n");
-				sb.append("																				<!-- // 아이템 컨텐츠 종료 -->\n");
-				sb.append("																			</table>\n");
-				sb.append("																		</td>\n");
-				sb.append("																	</tr>\n");
-				sb.append("																	<!-- // 아이템 테이블 종료 -->\n");
-				idx++;
-			}
+			sb.append(this.getMailCreListInfo((List<OrderChange>) map.get("cancelDetailList")));
 			sb.append("																	<!-- 배송비 시작 -->\n");
 			sb.append("																	<tr>\n");
 			sb.append("																		<td width=\"40px;\"></td>\n");
@@ -4496,6 +4378,143 @@ public class TscOrderChangeService {
 		return sb.toString();
 	}
 
+	/**
+	 * 취반교 자동메일 취반교 정보 설정
+	 *
+	 * @param OrderChange
+	 * @return String
+	 * @author card007
+	 * @since 2021.06.10
+	 */
+	public String getMailCreListInfo(List<OrderChange> creListInfo) {
+		StringBuilder sb = new StringBuilder();
+
+		// 이미지 URL 설정
+		String hasSsl = env.getProperty("has-ssl");
+		String protocol;
+
+		if ("true".equals(hasSsl)) {
+			protocol = "https:";
+		} else {
+			protocol = "http:";
+		}
+
+		String imgUrl = protocol + env.getProperty("upload.goods.view") + "/";
+
+		int idx = 0;
+		for (OrderChange orderChange : creListInfo) {
+			if (idx > 0) {
+				sb.append("																	<!-- 점선 -->\n");
+				sb.append("																	<tr>\n");
+				sb.append("																		<td width=\"30px;\"></td>\n");
+				sb.append("																		<td colspan=\"3\" height=\"1\" style=\"border: 1px; border-top-color: #ddd; border-top-style: dashed;\"></td>\n");
+				sb.append("																		<td width=\"30px;\"></td>\n");
+				sb.append("																	</tr>\n");
+				sb.append("																	<!-- 점선 끝 -->\n");
+				sb.append("																	\n");
+			}
+			sb.append("																	<!-- 아이템 테이블 시작 -->\n");
+			sb.append("																	<tr>\n");
+			sb.append("																		<td colspan=\"5\" style=\"text-align: left;font-size: 18px;font-family:'Apple SD Gothic Neo','나눔고딕',NanumGothic,'맑은고딕',Malgun Gothic, Helvetica, sans-serif;color: #222222;\">\n");
+			sb.append("																			<!-- 아이템 컨텐츠 시작 -->\n");
+			sb.append("																			<table style=\"width:100%;height:100%;margin:0;padding:0;font-size: 14px;\" cellspacing=\"0\" cellpadding=\"0\">\n");
+			sb.append("																				<tbody>\n");
+			sb.append("																					<tr>\n");
+			sb.append("																						<td height=\"30px;\" style=\"height: 30px;\"></td>\n");
+			sb.append("																					</tr>\n");
+			sb.append("																					<tr>\n");
+			sb.append("																						<td width=\"40px;\" rowspan=\"10\"></td>\n");
+			sb.append("																						<td width=\"100px;\" height=\"150px;\" rowspan=\"10\" valign=\"top\" style=\"margin:0;padding:0\">\n");
+			sb.append("																							<a href=\"#none\" target=\"_blank\" style=\"margin:0;padding:0\">\n");
+			sb.append("																								<span style=\"background: #f5f5f5;width: 100px;height: 150px;margin:0;padding:0\">\n");
+			sb.append("																									<img src=\"");
+			sb.append(imgUrl);
+			sb.append(orderChange.getSysImgNm());
+			sb.append("?RS=100\" alt=\"이미지\" style=\"width: 100px;height: 150px;margin:0;padding:0\">\n");
+			sb.append("																								</span>\n");
+			sb.append("																							</a>\n");
+			sb.append("																						</td>\n");
+			sb.append("																						<td width=\"30px;\" rowspan=\"10\"></td>\n");
+			sb.append("																						<td width=\"370px;\" height=\"10px;\"></td>\n");
+			sb.append("																						<td width=\"40px;\" rowspan=\"10\"></td>\n");
+			sb.append("																					</tr>\n");
+			sb.append("																					<tr>\n");
+			sb.append("																						<td style=\"font-family:'Apple SD Gothic Neo',verdana,Arial,'나눔고딕',NanumGothic,'맑은고딕',Malgun Gothic, Helvetica, sans-serif;\">\n");
+			sb.append("																							");
+			sb.append(orderChange.getBrandNm());
+			sb.append("\n");
+			sb.append("																						</td>\n");
+			sb.append("																					</tr>\n");
+			sb.append("																					<tr>\n");
+			sb.append("																						<td height=\"10px;\" style=\"height: 10px;\"></td>\n");
+			sb.append("																					</tr>\n");
+			sb.append("																					<tr>\n");
+			sb.append("																						<td style=\"color: #222222;font-size: 16px;font-weight: bold;letter-spacing: -0.05em;\">\n");
+			sb.append("																							<a href=\"#none\" target=\"_blank\" style=\"display: block; color: #222222; font-size: 16px; font-weight: bold; letter-spacing: -0.025em; text-decoration: none;\">\n");
+			sb.append("																								");
+			sb.append(orderChange.getGoodsNm());
+			sb.append("\n");
+			sb.append("																							</a>\n");
+			sb.append("																						</td>\n");
+			sb.append("																					</tr>\n");
+			sb.append("																					<tr>\n");
+			sb.append("																						<td height=\"10px;\" style=\"height: 10px;\"></td>\n");
+			sb.append("																					</tr>\n");
+			sb.append("																					<tr>\n");
+			sb.append("																						<td>\n");
+			if ("G056_S".equals(orderChange.getGoodsType())) {
+				for (int i=0; i < orderChange.getColorNmArr().length; i++) {
+					sb.append("																							<p style=\"margin: 0; padding: 0; font-family:'Apple SD Gothic Neo','나눔고딕',NanumGothic,'맑은고딕',Malgun Gothic, Helvetica, sans-serif;font-weight:200;color: #666666; line-height: 2;\">");
+					sb.append(orderChange.getItemNmArr()[i]);
+					sb.append(" / ");
+					sb.append(orderChange.getColorNmArr()[i]);
+					sb.append(" / ");
+					sb.append(orderChange.getOptCd2Arr()[i]);
+					sb.append("</p>\n");
+				}
+			} else {
+				sb.append("																							<p style=\"margin: 0; padding: 0; font-family:'Apple SD Gothic Neo','나눔고딕',NanumGothic,'맑은고딕',Malgun Gothic, Helvetica, sans-serif;font-weight:200;color: #666666; line-height: 2;\">");
+				sb.append(orderChange.getColorNm());
+				sb.append(" / ");
+				sb.append(orderChange.getOptCd2());
+				sb.append("</p>\n");
+			}
+			sb.append("																						</td>\n");
+			sb.append("																					</tr>\n");
+			sb.append("																					<tr>\n");
+			sb.append("																						<td height=\"5px;\" style=\"height: 5px;\"></td>\n");
+			sb.append("																					</tr>\n");
+			sb.append("																					<tr>\n");
+			sb.append("																						<td height=\"10px;\" style=\"height: 10px;\"></td>\n");
+			sb.append("																					</tr>\n");
+			sb.append("																					<tr>\n");
+			sb.append("																						<td>\n");
+			sb.append("																							<span>");
+			sb.append(orderChange.getChgQty());
+			sb.append("개</span>\n");
+			// sb.append("																							<span style=\"width: 12px;padding-left:12px;\"></span>\n");
+			// sb.append("																							<span style=\"display: inline-block; vertical-align: middle; width: 1px; height: 14px; background: #ddd;\"></span>\n");
+			// sb.append("																							<span style=\"width: 12px;padding-right:12px;\"></span>\n");
+			sb.append("																						</td>\n");
+			sb.append("																					</tr>\n");
+			sb.append("																					<tr>\n");
+			sb.append("																						<td height=\"10px;\" style=\"height: 10px;\"></td>\n");
+			sb.append("																					</tr>\n");
+			sb.append("																					<tr>\n");
+			sb.append("																						<td height=\"20px;\" style=\"height: 20px;\"></td>\n");
+			sb.append("																					</tr>\n");
+			sb.append("																				</tbody>\n");
+			sb.append("																				<!-- // 아이템 컨텐츠 종료 -->\n");
+			sb.append("																			</table>\n");
+			sb.append("																		</td>\n");
+			sb.append("																	</tr>\n");
+			sb.append("																	<!-- // 아이템 테이블 종료 -->\n");
+			idx++;
+		}
+
+		return sb.toString();
+	}
+
 	/**
 	 * 주문 취소 자동메일 취소 사은품 정보 설정
 	 *
@@ -4562,4 +4581,287 @@ public class TscOrderChangeService {
 
 		return sb.toString();
 	}
+
+	/**
+	 * 반품 안내 메일 정보 조회
+	 *
+	 * @param OrderChange
+	 * @return Gagamap
+	 * @author card007
+	 * @since 2021. 06. 10
+	 */
+	public GagaMap getMailOrderReturnReplaceInfo(OrderChange orderChange) {
+		GagaMap result = new GagaMap();
+		DecimalFormat df = new DecimalFormat("###,###");
+
+		// 반품 상세 정보 조회
+		Collection<OrderChange> returnList = orderChangeDao.getCreReturnDetailInfo(orderChange);
+
+		if (returnList.size() == 0) {
+			throw new IllegalStateException(message.getMessage("FAIL_0005"));
+		}
+
+		OrderChange oneData = returnList.iterator().next();
+
+		// 주문 정보 설정
+		result.setString("ordNm", oneData.getOrdNm());
+		result.setInt("ordNo", oneData.getOrdNo());
+		result.setString("ordDate", oneData.getOrdDate());
+		result.setString("ordDt", oneData.getOrdDt());
+		result.setString("ordEmail", oneData.getOrdEmail());
+		result.setInt("custNo", oneData.getCustNo());
+		result.setString("wdGbNm", "W".equals(oneData.getWdGb()) ? "회수요청" : "직접배송");
+
+		if (StringUtils.isBlank(oneData.getOrdEmail())) {
+			return result;
+		}
+
+		// 회수지 정보 설정
+		if ("W".equals(oneData.getWdGb())) {
+			result.setString("chgerInfo", this.getMailReturnChgerInfo(oneData));
+		}
+
+		// 반품 정보 설정
+		String returnInfo = this.getMailOrderReturnInfo(returnList);
+		result.setString("returnInfo", returnInfo);
+
+		// 결제 정보 조회
+		int dcAmt = oneData.getRfCpn1Amt() + oneData.getRfTmtb1Amt() + oneData.getRfTmtb2Amt() + oneData.getRfGoodsCpnAmt() + oneData.getRfCartCpnAmt() + oneData.getRfDelvCpnAmt() + oneData.getRfPrePntAmt();
+		int totalRefundAmt = oneData.getRefundAmt() + oneData.getRfPntAmt() + oneData.getRfGfcdUseAmt();
+
+		String pgGb = oneData.getPgGb();
+		String payMeansNm;
+		if (TscConstants.PgGb.KCP.value().equals(pgGb)) {
+			payMeansNm = oneData.getPayMeansNm();
+		} else if (TscConstants.PgGb.NAVER.value().equals(pgGb)) {
+			payMeansNm = "네이버페이";
+		} else if (TscConstants.PgGb.KAKAO.value().equals(pgGb)) {
+			payMeansNm = "카카오페이";
+		} else if (TscConstants.PgGb.ISTYLE.value().equals(pgGb)) {
+			payMeansNm = "상품권";
+		} else if (TscConstants.PgGb.PAYCO.value().equals(pgGb)) {
+			payMeansNm = "PAYCO";
+		} else {
+			payMeansNm = "";
+		}
+
+		result.setString("cnclRtnAmt", df.format(oneData.getRfCnclAmt()));
+		result.setString("addPayCost", df.format(oneData.getAddPayCost()));
+		result.setString("dcAmt", dcAmt == 0 ? "0" : "-" + df.format(dcAmt));
+		result.setString("payMeansNm", payMeansNm);
+		result.setString("refundAmt", df.format(oneData.getRefundAmt()));
+		result.setString("rfPntAmt", df.format(oneData.getRfPntAmt()));
+		result.setString("rfGfcdUseAmt", df.format(oneData.getRfGfcdUseAmt()));
+		result.setString("totalRefundAmt", df.format(totalRefundAmt));
+
+		// 버튼 URL 설정
+		String hasSsl = env.getProperty("has-ssl");
+		String protocol;
+
+		if ("true".equals(hasSsl)) {
+			protocol = "https:";
+		} else {
+			protocol = "http:";
+		}
+
+		String url = protocol + env.getProperty("domain.front");
+		if (orderChange.getCustNo() > 0) {
+			url += "/mypage/cre/list/form";
+		} else {
+			url += "/customer/noncust/order/confirm/form";
+		}
+
+		result.setString("creButtonUrl", url);
+		return result;
+	}
+
+	/**
+	 * 반품 안내 메일 상품 정보 설정
+	 *
+	 * @param Collection<OrderChange>
+	 * @return String
+	 * @author card007
+	 * @since 2021.06.10
+	 */
+	@SuppressWarnings("unchecked")
+	public String getMailOrderReturnInfo(Collection<OrderChange> ReturnList) {
+		List<GagaMap> returnDelvList = new ArrayList<>();
+		List<OrderChange> returnDetailList = new ArrayList<>();
+		GagaMap returnMap = new GagaMap();
+		DecimalFormat df = new DecimalFormat("###,###");
+
+		OrderChange oneData = ReturnList.iterator().next();
+		Integer ordNo = oneData.getOrdNo();
+		Integer ordChgSq = oneData.getOrdChgSq();
+
+		String selfGoodsYn = oneData.getSelfGoodsYn();
+		String delvFeeCd = "Y".equals(selfGoodsYn) ? "WMS" : oneData.getDelvFeeCd();
+		String supplyCompNm = oneData.getSupplyCompNm();
+		for (OrderChange returnInfo : ReturnList) {
+			String delvFeeCdTemp = "Y".equals(returnInfo.getSelfGoodsYn()) ? "WMS" : returnInfo.getDelvFeeCd();
+			if (!delvFeeCd.equals(delvFeeCdTemp)) {
+				returnMap.set("returnDetailList", returnDetailList);
+				returnMap.setString("delvFeeCd", delvFeeCd);
+				returnMap.setString("supplyCompNm", supplyCompNm);
+				returnMap.setString("selfGoodsYn", selfGoodsYn);
+				returnDelvList.add(returnMap);
+
+				returnDetailList = new ArrayList<>();
+				returnMap = new GagaMap();
+				delvFeeCd = delvFeeCdTemp;
+				supplyCompNm = returnInfo.getSupplyCompNm();
+				selfGoodsYn = returnInfo.getSelfGoodsYn();
+			}
+
+			// 세트상품 옵션별 배열로 담기
+			if (returnInfo.getItemNm().contains("!@!")) {
+				returnInfo.setItemNmArr(returnInfo.getItemNm().split("!@!"));
+				returnInfo.setColorNmArr(returnInfo.getColorNm().split(","));
+				returnInfo.setOptCd1Arr(returnInfo.getOptCd1().split(","));
+				returnInfo.setOptCd2Arr(returnInfo.getOptCd2().split(","));
+			} else {
+				String[] arr = {returnInfo.getItemNm()}, arr2 = {returnInfo.getColorNm()}, arr3 = {returnInfo.getOptCd1()}, arr4 = {returnInfo.getOptCd2()};
+				returnInfo.setItemNmArr(arr);
+				returnInfo.setColorNmArr(arr2);
+				returnInfo.setOptCd1Arr(arr3);
+				returnInfo.setOptCd2Arr(arr4);
+			}
+
+			returnDetailList.add(returnInfo);
+		}
+
+		returnMap.set("returnDetailList", returnDetailList);
+		returnMap.setString("delvFeeCd", delvFeeCd);
+		returnMap.setString("supplyCompNm", supplyCompNm);
+		returnMap.setString("selfGoodsYn", selfGoodsYn);
+		returnDelvList.add(returnMap);
+
+		StringBuilder sb = new StringBuilder();
+
+		sb.append("<table style=\"width:100%;margin:0;padding:0;font-size: 14px;\" cellspacing=\"0\" cellpadding=\"0\">\n");
+        sb.append("											<tbody>\n");
+        sb.append("												<tr>\n");
+        sb.append("													<td height=\"50px;\" style=\"height: 50px;\"></td>\n");
+        sb.append("												</tr>\n");
+        sb.append("												<tr>\n");
+        sb.append("													<th colspan=\"2\" style=\"text-align: left;font-size: 18px;color: #222222;\" align=\"left\">\n");
+		sb.append("														반품신청 상품 정보\n");
+        sb.append("													</th>\n");
+        sb.append("												</tr>\n");
+        sb.append("												<tr>\n");
+        sb.append("													<td height=\"30px;\" style=\"height: 30px;\"></td>\n");
+        sb.append("												</tr>\n");
+		sb.append(this.getMailCreListInfo(returnDetailList));
+        sb.append("											</tbody>\n");
+        sb.append("										</table>\n");
+
+		return sb.toString();
+	}
+
+	/**
+	 * 반품 안내 메일 상품 정보 설정
+	 *
+	 * @param Collection<OrderChange>
+	 * @return String
+	 * @author card007
+	 * @since 2021.06.10
+	 */
+	@SuppressWarnings("unchecked")
+	public String getMailReturnChgerInfo(OrderChange orderChange) {
+		StringBuilder sb = new StringBuilder();
+
+		sb.append("<table style=\"width:100%;margin:0;padding:0;font-size: 14px;\" cellspacing=\"0\" cellpadding=\"0\">\n");
+		sb.append("											<tbody>\n");
+		sb.append("												<tr>\n");
+		sb.append("													<td height=\"50px;\" style=\"height: 50px;\"></td>\n");
+		sb.append("												</tr>\n");
+		sb.append("												<tr>\n");
+		sb.append("													<th colspan=\"6\" style=\"text-align: left;font-size: 18px;color: #222222;\" align=\"left\">\n");
+		sb.append("														회수지 정보\n");
+		sb.append("													</th>\n");
+		sb.append("												</tr>\n");
+		sb.append("												<tr>\n");
+		sb.append("													<td height=\"20px;\" style=\"height: 20px;\"></td>\n");
+		sb.append("												</tr>\n");
+		sb.append("												<tr>\n");
+		sb.append("													<td colspan=\"6\" height=\"1\" bgcolor=\"#000000\" style=\"height: 1px; background: #000000;\"></td>\n");
+		sb.append("												</tr>\n");
+		sb.append("												<tr>\n");
+		sb.append("												    <td height=\"20px;\" style=\"height: 20px;\"></td>\n");
+		sb.append("												</tr>\n");
+		sb.append("												<tr>\n");
+		sb.append("													<td width=\"40px;\"></td>\n");
+		sb.append("													<td width=\"160px;\" align=\"left\" style=\"text-align: left;\">\n");
+		sb.append("														보내는 분\n");
+		sb.append("													</td>\n");
+		sb.append("													<td width=\"340px;\" align=\"left\" style=\"text-align: left;\" colspan=\"3\">\n");
+		sb.append("														");
+		sb.append(orderChange.getChgerNm());
+		sb.append("\n");
+		sb.append("													</td>\n");
+		sb.append("													<td width=\"40px;\"></td>\n");
+		sb.append("												</tr>\n");
+		sb.append("												<tr>\n");
+		sb.append("													<td height=\"20px;\" style=\"height: 20px;\"></td>\n");
+		sb.append("												</tr>\n");
+		sb.append("												<tr>\n");
+		sb.append("													<td width=\"40px;\"></td>\n");
+		sb.append("													<td width=\"160px;\" rowspan=\"2\" align=\"left\" style=\"text-align: left;\" valign=\"top\">\n");
+		sb.append("														연락처\n");
+		sb.append("													</td>\n");
+		sb.append("													<td width=\"340px;\" align=\"left\" style=\"text-align: left; line-height: 20px;\" colspan=\"3\">\n");
+		sb.append("														");
+		sb.append(orderChange.getChgerPhnno());
+		sb.append("\n");
+		sb.append("													</td>\n");
+		sb.append("													<td width=\"40px;\"></td>\n");
+		sb.append("												</tr>\n");
+		sb.append("												\n");
+		sb.append("												<tr>\n");
+		sb.append("													<td height=\"20px;\" style=\"height: 20px;\"></td>\n");
+		sb.append("												</tr>\n");
+		sb.append("												<tr> <!-- 210611_ 주소테이블 수정 -->\n");
+		sb.append("													<td width=\"40px;\"></td>\n");
+		sb.append("													<td width=\"160px;\" align=\"left\" style=\"text-align: left;\" valign=\"middle\">\n");
+		sb.append("														주소\n");
+		sb.append("													</td>\n");
+		sb.append("													<td width=\"280px;\" align=\"left\" style=\"text-align: left; line-height: 20px;\" colspan=\"3\">\n");
+		sb.append("														<span>\n");
+		sb.append("															(");
+		sb.append(orderChange.getChgerZipcode());
+		sb.append(") ");
+		sb.append(orderChange.getChgerBaseAddr());
+		sb.append(" ");
+		sb.append(orderChange.getChgerDtlAddr());
+		sb.append("\n");
+		sb.append("														</span>\n");
+		sb.append("													</td>\n");
+		sb.append("													<td width=\"40px;\"></td>\n");
+		sb.append("												</tr>\n");
+		sb.append("												<tr>\n");
+		sb.append("													<td height=\"20px;\" style=\"height: 20px;\"></td>\n");
+		sb.append("												</tr>\n");
+		sb.append("												<tr>\n");
+		sb.append("													<td width=\"40px;\"></td>\n");
+		sb.append("													<td width=\"160px;\" align=\"left\" style=\"text-align: left;\">\n");
+		sb.append("														배송요청 사항\n");
+		sb.append("													</td>\n");
+		sb.append("													<td width=\"340px;\" align=\"left\" style=\"text-align: left;\" colspan=\"3\">\n");
+		sb.append("														");
+		sb.append(orderChange.getChgerRtnMemo());
+		sb.append("\n");
+		sb.append("													</td>\n");
+		sb.append("													<td width=\"40px;\"></td>\n");
+		sb.append("												</tr>\n");
+		sb.append("												<tr>\n");
+		sb.append("													<td height=\"20px;\" style=\"height: 20px;\"></td>\n");
+		sb.append("												</tr>\n");
+		sb.append("												<tr>\n");
+		sb.append("													<td colspan=\"6\" height=\"1\" bgcolor=\"#dddddd\" style=\"height: 1px; background: #dddddd;\"></td>\n");
+		sb.append("												</tr>\n");
+		sb.append("											</tbody>\n");
+		sb.append("										</table>\n");
+		
+		return sb.toString();
+	}
 }

+ 46 - 3
src/main/java/com/style24/core/biz/service/TscPointService.java

@@ -11,6 +11,8 @@ import com.style24.persistence.domain.Point;
 
 import lombok.extern.slf4j.Slf4j;
 
+import java.util.Collection;
+
 
 /**
  * 포인트 Service
@@ -32,15 +34,45 @@ public class TscPointService {
 	private TscOrderService orderService;
 
 	/**
-	 * 포인트 적립
+	 * 포인트 적립 / 차감
 	 * @param point - 포인트 정보
 	 * @author jsshin
 	 * @since 2021. 01. 27
 	 */
 	@Transactional("shopTxnManager")
 	public void saveCustomerPoint(Point point) {
-		pointDao.createCustomerPoint(point);
-		pointDao.createCustomerPointHst(point);
+		if ("+".equals(point.getSignGb())) {
+			pointDao.createCustomerPoint(point);
+			pointDao.createCustomerPointHst(point);
+		} else {
+			int sumRmPntAmt = pointDao.getCustomerSumRmPntAmt(point.getCustNo());
+				sumRmPntAmt += point.getRmPntAmt();
+			if (sumRmPntAmt < 0 ) {
+				throw new IllegalStateException("보유 포인트 금액이 차감 포인트 금액 보다 작습니다.");
+			}
+			Collection<Point> rmPntAmtList = pointDao.getCustomerRmPntAmtList(point.getCustNo());
+			int rmPntAmt = point.getRmPntAmt() * -1; // 차감금액 :  -1000 * -1
+			for (Point rmPntAmtInfo: rmPntAmtList) {
+				if (rmPntAmt > 0 ) {
+					if (rmPntAmt < rmPntAmtInfo.getRmPntAmt()) {
+						rmPntAmtInfo.setPntAmt(rmPntAmt * -1);
+						rmPntAmt -= rmPntAmt;
+					} else {
+						rmPntAmtInfo.setPntAmt(rmPntAmtInfo.getRmPntAmt() * -1);
+						rmPntAmt -= rmPntAmtInfo.getRmPntAmt();
+					}
+					rmPntAmtInfo.setCustNo(point.getCustNo());
+					rmPntAmtInfo.setOccurGb(point.getOccurGb());
+					rmPntAmtInfo.setPntUploadStat(point.getPntUploadStat());
+					rmPntAmtInfo.setOccurDtlDesc(point.getOccurDtlDesc());
+					rmPntAmtInfo.setRegNo(point.getRegNo());
+					rmPntAmtInfo.setUpdNo(point.getUpdNo());
+					pointDao.createCustomerPointHst(rmPntAmtInfo);
+					pointDao.updatePointDeduction(rmPntAmtInfo);
+				}
+			}
+		}
+
 	}
 
 	/**
@@ -106,4 +138,15 @@ public class TscPointService {
 		return pointDao.getOrderDecisionPointHstCount(point);
 	}
 
+	/**
+	 * 가용 포인트
+	 * @param custNo - 고객번호
+	 * @return int - 가용포인트 합
+	 * @author jsshin
+	 * @since 2021. 06. 14
+	 */
+	public int getCustomerSumRmPntAmt(Integer custNo) {
+		return pointDao.getCustomerSumRmPntAmt(custNo);
+	}
+
 }

+ 51 - 0
src/main/java/com/style24/core/support/filter/TscServletRequestWrapper.java

@@ -0,0 +1,51 @@
+package com.style24.core.support.filter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+
+import org.apache.commons.lang3.StringUtils;
+
+public class TscServletRequestWrapper extends HttpServletRequestWrapper {
+
+	public TscServletRequestWrapper(HttpServletRequest request) {
+		super(request);
+	}
+
+	public String[] getParameterValues(String name) {
+		String[] values = super.getParameterValues(name);
+		if (values == null) {
+			return null;
+		} else {
+			List<String> removedValues = new ArrayList();
+			String[] var4 = values;
+			int var5 = values.length;
+
+			for (int var6 = 0; var6 < var5; ++var6) {
+				String value = var4[var6];
+				if (StringUtils.isBlank(value)) {
+					removedValues.add(value);
+				} else {
+					removedValues.add(this.convertParameter(value));
+				}
+			}
+
+			return (String[])removedValues.toArray(new String[removedValues.size()]);
+		}
+	}
+
+	public String getParameter(String name) {
+		String value = super.getParameter(name);
+		return StringUtils.isBlank(value) ? value : this.convertParameter(value);
+	}
+
+	private String convertParameter(String value) {
+		value = value.replaceAll("<", "&lt;");
+		value = value.replaceAll(">", "&gt;");
+		value = value.replaceAll("script", "");
+		return value;
+	}
+
+}

+ 21 - 0
src/main/java/com/style24/core/support/filter/TscXssServletFilter.java

@@ -0,0 +1,21 @@
+package com.style24.core.support.filter;
+
+import java.io.IOException;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.annotation.WebFilter;
+import javax.servlet.http.HttpServletRequest;
+
+@WebFilter({"/xssServletFilter"})
+public class TscXssServletFilter implements Filter {
+
+	@Override
+	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
+		chain.doFilter(new TscServletRequestWrapper((HttpServletRequest)request), response);
+	}
+
+}

+ 5 - 5
src/main/java/com/style24/core/support/util/CryptoUtils.java

@@ -23,7 +23,7 @@ public class CryptoUtils {
 	/**
 	 * AES 암호화 처리
 	 * @param rawValue - 원시문자열
-	 * @return
+	 * @return String - 암호화문자열
 	 */
 	public static String encryptAES(String rawValue) {
 		String encryptedValue = "";
@@ -37,7 +37,7 @@ public class CryptoUtils {
 				encryptedValue = Base64.encodeBase64String(cipher.doFinal(rawValue.getBytes("UTF-8")));
 			}
 		} catch (Exception e) {
-			log.error(e.getMessage());
+			//log.error(e.getMessage());
 			encryptedValue = rawValue;
 		}
 
@@ -46,8 +46,8 @@ public class CryptoUtils {
 
 	/**
 	 * AES 복호화 처리
-	 * @param encodedValue - 암호화된 문자열
-	 * @return
+	 * @param encryptedValue - 암호화된 문자열
+	 * @return String - 복호화문자열
 	 */
 	public static String decryptAES(String encryptedValue) {
 		String decryptedValue = "";
@@ -64,7 +64,7 @@ public class CryptoUtils {
 				}
 			}
 		} catch (Exception e) {
-			log.error(e.getMessage());
+			//log.error(e.getMessage());
 			decryptedValue = encryptedValue;
 		}
 

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

@@ -115,6 +115,7 @@ public class Order extends TscBaseDomain {
 	private String invoiceNo;						// 송장번호
 	private String invoiceSendYn;					// 배송지시전송여부
 	private String sellStoreCd;						// 판매매장코드
+	private String naverPayShipCompCd;				// 네이버페이 택배사코드
 	private double sellFeeRate;						// 판매매장수수료
 
 	private String afLinkCd;						// AFLINKCD

File diff ditekan karena terlalu besar
+ 385 - 388
src/main/java/com/style24/persistence/mybatis/shop/TscOrder.xml


File diff ditekan karena terlalu besar
+ 537 - 545
src/main/java/com/style24/persistence/mybatis/shop/TscOrderChange.xml


+ 36 - 0
src/main/java/com/style24/persistence/mybatis/shop/TscPoint.xml

@@ -159,4 +159,40 @@
 		   AND OCCUR_GB IN ('G069_12', 'G069_13')
 		   AND PNT_UPLOAD_STAT = 'G070_10'
 	</select>
+
+	<!-- 가용포인트 리스트 -->
+	<select id="getCustomerRmPntAmtList" parameterType="Integer" resultType="Point">
+		/* TscPoint.getCustomerRmPntAmtList */
+		SELECT CP.CUST_PNT_SQ
+		     , CP.RM_PNT_AMT
+		     , CP.EXP_BE_DT
+		FROM   TB_CUST_POINT CP
+		WHERE  CP.CUST_NO = #{custNo}
+		AND    CP.EXP_BE_DT > NOW()
+		AND    CP.EXP_CMP_DT IS NULL
+		AND    CP.RM_PNT_AMT > 0
+		ORDER BY CP.EXP_BE_DT, CP.CUST_PNT_SQ
+	</select>
+
+	<!--포인트 차감 -->
+	<update id="updatePointDeduction" parameterType="Point">
+		/* TscPoint.updatePointDeduction */
+		UPDATE TB_CUST_POINT
+		SET    RM_PNT_AMT = RM_PNT_AMT + #{pntAmt}
+		     , US_PNT_AMT = US_PNT_AMT - #{pntAmt}
+		     , UPD_DT = NOW()
+		     , UPD_NO = #{updNo}
+		WHERE  CUST_PNT_SQ = #{custPntSq}
+	</update>
+
+	<!-- 가용포인트 합산 -->
+	<select id="getCustomerSumRmPntAmt" parameterType="Integer" resultType="int">
+		/* TscPoint.getCustomerSumRmPntAmt */
+		SELECT IFNULL(SUM(CP.RM_PNT_AMT), 0) AS RM_PNT_AMT
+		FROM   TB_CUST_POINT CP
+		WHERE  CP.CUST_NO = #{custNo}
+		AND    CP.EXP_BE_DT > NOW()
+		AND    CP.EXP_CMP_DT IS NULL
+	</select>
+
 </mapper>

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini