Explorar el Código

Merge remote-tracking branch 'origin/xodud1202' into order

card007 hace 5 años
padre
commit
bcff020834
Se han modificado 29 ficheros con 443 adiciones y 120 borrados
  1. 24 7
      src/main/java/com/style24/front/biz/dao/TsfCustomerDao.java
  2. 2 2
      src/main/java/com/style24/front/biz/service/TsfCartService.java
  3. 66 22
      src/main/java/com/style24/front/biz/service/TsfCustomerService.java
  4. 219 9
      src/main/java/com/style24/front/biz/service/TsfOrderService.java
  5. 39 26
      src/main/java/com/style24/front/biz/web/TsfCustomerController.java
  6. 2 13
      src/main/java/com/style24/front/biz/web/TsfPgController.java
  7. 1 1
      src/main/java/com/style24/persistence/mybatis/shop/TsfCart.xml
  8. 24 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfCustomer.xml
  9. 2 1
      src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml
  10. 2 2
      src/main/java/com/style24/persistence/mybatis/shop/TsfReview.xml
  11. 1 0
      src/main/resources/config/application-locd.yml
  12. 2 2
      src/main/webapp/WEB-INF/views/mob/callcenter/GoodsQnaFormMob.html
  13. 1 1
      src/main/webapp/WEB-INF/views/mob/callcenter/NoticeFormMob.html
  14. 1 1
      src/main/webapp/WEB-INF/views/mob/callcenter/OneToOneQnaFormMob.html
  15. 6 0
      src/main/webapp/WEB-INF/views/mob/cart/CartListAjaxFormMob.html
  16. 2 2
      src/main/webapp/WEB-INF/views/mob/cart/CartListFormMob.html
  17. 1 1
      src/main/webapp/WEB-INF/views/mob/goods/CardPrmtFormMob.html
  18. 2 2
      src/main/webapp/WEB-INF/views/mob/goods/GoodsDetailQnaFormMob.html
  19. 2 2
      src/main/webapp/WEB-INF/views/web/callcenter/GoodsQnaFormWeb.html
  20. 1 1
      src/main/webapp/WEB-INF/views/web/callcenter/NoticeFormWeb.html
  21. 1 1
      src/main/webapp/WEB-INF/views/web/callcenter/OneToOneQnaFormWeb.html
  22. 6 0
      src/main/webapp/WEB-INF/views/web/cart/CartListAjaxFormWeb.html
  23. 1 1
      src/main/webapp/WEB-INF/views/web/cart/CartListFormWeb.html
  24. 1 1
      src/main/webapp/WEB-INF/views/web/display/BrandMainFormWeb.html
  25. 1 1
      src/main/webapp/WEB-INF/views/web/goods/CardPrmtFormWeb.html
  26. 9 6
      src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html
  27. 2 2
      src/main/webapp/WEB-INF/views/web/goods/GoodsDetailQnaFormWeb.html
  28. 1 13
      src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html
  29. 21 0
      src/main/webapp/ux/plugins/gaga/gaga.common.js

+ 24 - 7
src/main/java/com/style24/front/biz/dao/TsfCustomerDao.java

@@ -1,15 +1,15 @@
 package com.style24.front.biz.dao;
 
+import java.util.Collection;
+
+import org.springframework.stereotype.Repository;
+
 import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.CustGrade;
 import com.style24.persistence.domain.CustSnsInfo;
 import com.style24.persistence.domain.Customer;
 import com.style24.persistence.domain.WishList;
 
-import java.util.Collection;
-
-import org.springframework.stereotype.Repository;
-
 /**
  * 고객(회원) Dao
  * 
@@ -82,7 +82,7 @@ public interface TsfCustomerDao {
 	 * @since 2021. 03. 02
 	 */
 	String getCustomerMaxCustId(Customer customer);
-	
+
 	/**
 	 * 위시리스트 등록
 	 *
@@ -101,7 +101,7 @@ public interface TsfCustomerDao {
 	 * @since 2021. 03. 08
 	 */
 	void deleteWishList(WishList wishList);
-	
+
 	/**
 	 * 위시리스트 삭제 상품 조회
 	 *
@@ -109,7 +109,7 @@ public interface TsfCustomerDao {
 	 * @author eskim
 	 * @since 2021. 03. 11
 	 */
-	String  getDeleteGoodsWish(int custNo);
+	String getDeleteGoodsWish(int custNo);
 
 	/**
 	 * 본인인증 처리
@@ -179,5 +179,22 @@ public interface TsfCustomerDao {
 	 */
 	int saveBatchBirth(Customer customer);
 
+	/**
+	 * SMS수신거부 처리
+	 * @param custNo - 고객번호
+	 * @return 처리건수
+	 * @author gagamel
+	 * @since 2021. 5. 11
+	 */
+	int updateSmsReceptionRefuse(Integer custNo);
+
+	/**
+	 * 메일수신거부 처리
+	 * @param custNo - 고객번호
+	 * @return 처리건수
+	 * @author gagamel
+	 * @since 2021. 5. 11
+	 */
+	int updateEmailReceptionRefuse(Integer custNo);
 
 }

+ 2 - 2
src/main/java/com/style24/front/biz/service/TsfCartService.java

@@ -321,7 +321,7 @@ public class TsfCartService {
 
 			if (cartSqList != null && cartSqList.size() > 0) {		// 장바구니 기존재
 				if (cartSqList.size() > 1) {						// 장바구니 조회 결과 이상시 insert or select 수정 필요
-					throw new IllegalArgumentException("장바구니 조회에 실패하였습니다. 관리자에게 문의해주세요.");
+					throw new IllegalStateException("장바구니 조회에 실패하였습니다. 관리자에게 문의해주세요.");
 				} else {
 					cart.setCartSq(cartSqList.iterator().next().getCartSq());
 					cartSqs.add(cart.getCartSq());
@@ -405,7 +405,7 @@ public class TsfCartService {
 
 			if (cartSqList != null && cartSqList.size() > 0) {			// 장바구니 기존재
 				if (cartSqList.size() > 1) {							// 장바구니 조회 결과 이상시 insert or select 수정 필요
-					throw new IllegalArgumentException("장바구니 조회에 실패하였습니다. 관리자에게 문의해주세요.");
+					throw new IllegalStateException("장바구니 조회에 실패하였습니다. 관리자에게 문의해주세요.");
 				} else {
 					item.setCartSq(cartSqList.iterator().next());
 					cartSqs.add(item.getCartSq());

+ 66 - 22
src/main/java/com/style24/front/biz/service/TsfCustomerService.java

@@ -7,8 +7,6 @@ import java.util.List;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
 
-
-import com.style24.persistence.domain.CustGrade;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
@@ -17,8 +15,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.gagaframework.web.parameter.GagaMap;
-import com.gagaframework.web.security.GagaPasswordEncoder;
 import com.style24.core.biz.service.TscCustomerService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.session.TscSession;
@@ -29,6 +25,7 @@ import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.CustAccount;
 import com.style24.persistence.domain.CustDeliveryAddr;
+import com.style24.persistence.domain.CustGrade;
 import com.style24.persistence.domain.CustSnsInfo;
 import com.style24.persistence.domain.Customer;
 import com.style24.persistence.domain.Login;
@@ -36,6 +33,9 @@ import com.style24.persistence.domain.WishList;
 
 import lombok.extern.slf4j.Slf4j;
 
+import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.security.GagaPasswordEncoder;
+
 /**
  * 고객(회원) Service
  *
@@ -76,7 +76,7 @@ public class TsfCustomerService {
 	 * @since 2021. 02. 08
 	 */
 	public Customer getCustomerFindId(Customer customer) {
-		TsfSession.setAttribute("maskingYn","Y");
+		TsfSession.setAttribute("maskingYn", "Y");
 		customer.setSiteCd(TscConstants.Site.STYLE24.value());
 		customer.encryptData(); // 데이터 암호하
 		return customerDao.getCusomterActiveAndDormant(customer);
@@ -116,7 +116,6 @@ public class TsfCustomerService {
 		return coreCustomerService.getCustomerInfo(customer);
 	}
 
-
 	/**
 	 * 임시비밀번호 조회
 	 * @param length - 비밀번호 자릿수
@@ -221,7 +220,7 @@ public class TsfCustomerService {
 	 * @since 2021. 02. 15
 	 */
 	public Customer getCustomerFindByCi(String ci) {
-		TscSession.setAttribute("maskingYn","Y");
+		TscSession.setAttribute("maskingYn", "Y");
 		Customer customer = new Customer();
 		customer.setCi(ci);
 		customer.setSiteCd(TscConstants.Site.STYLE24.value());
@@ -238,7 +237,7 @@ public class TsfCustomerService {
 	 * @since 2021. 02. 15
 	 */
 	public Customer getCustomerFindByCellPhnno(String cellPhnno) {
-		TscSession.setAttribute("maskingYn","Y");
+		TscSession.setAttribute("maskingYn", "Y");
 		Customer customer = new Customer();
 		customer.setCellPhnno(cellPhnno);
 		customer.setHypenCellPhone(); // 010-0000-0000
@@ -286,11 +285,11 @@ public class TsfCustomerService {
 	 * @since 2021. 02. 19
 	 */
 	@Transactional("shopTxnManager")
-	public boolean saveJoinCustomerSns (Customer customer) {
+	public boolean saveJoinCustomerSns(Customer customer) {
 		boolean isJoin = true;
 		String snsId = customer.getSnsType().equals(TscConstants.SnsType.YES24.value()) ? customer.getMemNo() : customer.getSnsId();
 		customer.setEncodedPasswd(" ");
-		customer.setCustId(customer.getSnsType()+"_"+snsId);
+		customer.setCustId(customer.getSnsType() + "_" + snsId);
 		customer.encryptData();
 
 		customer.setSiteCd(TscConstants.Site.STYLE24.value());
@@ -300,7 +299,6 @@ public class TsfCustomerService {
 		customer.setCustGb(TscConstants.CustGb.NORMAL.value());
 		customer.setCustGrade(TscConstants.CustGrade.WELCOME.value());
 
-
 		int custCnt = customerDao.createCustomer(customer);
 		customerDao.createCustomerSns(customer);
 		customerDao.saveBatchBirth(customer);
@@ -334,7 +332,6 @@ public class TsfCustomerService {
 		couponService.saveJoinCoupon(coupon);
 	}
 
-
 	/**
 	 * Sns 정보에대한 상태 처리
 	 *
@@ -343,7 +340,7 @@ public class TsfCustomerService {
 	 * @since 2021. 02. 19
 	 */
 	@Transactional("shopTxnManager")
-	public GagaMap customerSnsProcessing (CustSnsInfo custSnsInfo) {
+	public GagaMap customerSnsProcessing(CustSnsInfo custSnsInfo) {
 		GagaMap resultMap = new GagaMap();
 		Customer custInfo;
 
@@ -392,7 +389,7 @@ public class TsfCustomerService {
 				return resultMap;
 			}
 
-			boolean isFindByPhone = getCustomerFindByCellPhnnoCount(custSnsInfo.getCellPhnno().replace("-",""));
+			boolean isFindByPhone = getCustomerFindByCellPhnnoCount(custSnsInfo.getCellPhnno().replace("-", ""));
 			if (isFindByPhone) {
 				resultMap.setString("custStat", "DUP_PHONE_CUST"); // 휴대폰 중복
 				return resultMap;
@@ -447,7 +444,7 @@ public class TsfCustomerService {
 		loginService.createLoginHistory(loginInfo.getCustNo());
 
 		// 세션 생성
-		this.createSession(request,  loginDetails);
+		this.createSession(request, loginDetails);
 	}
 
 	/**
@@ -464,7 +461,6 @@ public class TsfCustomerService {
 		session.setAttribute("session", loginDetails);
 	}
 
-
 	/**
 	 * 일반고객 정보 유효성
 	 *
@@ -473,7 +469,7 @@ public class TsfCustomerService {
 	 * @author jsshin
 	 * @since 2021. 02. 18
 	 */
-	public GagaMap generalCustomerValidation (Customer customer) {
+	public GagaMap generalCustomerValidation(Customer customer) {
 		GagaMap resultMap = new GagaMap();
 		String maskingCustId;
 
@@ -529,7 +525,6 @@ public class TsfCustomerService {
 		return customerDao.getCusomterSnsFind(custSnsInfo);
 	}
 
-
 	/**
 	 * 가입된 아이디 가져오기
 	 * @param custId - 고객아이디
@@ -625,7 +620,7 @@ public class TsfCustomerService {
 			wishInfo.setRegNo(TsfSession.getInfo().getCustNo());
 			customerDao.createWishList(wishInfo);
 		}
-		
+
 		// 위시상품목록 50개만 남게 처리
 		String goodsCd = customerDao.getDeleteGoodsWish(TsfSession.getInfo().getCustNo());
 		WishList delWishInfo = new WishList();
@@ -634,7 +629,7 @@ public class TsfCustomerService {
 			delWishInfo.setArrGoodsCd(goodsCd.split("\\,"));
 			customerDao.deleteWishList(delWishInfo);
 		}
-		
+
 	}
 
 	/**
@@ -799,7 +794,6 @@ public class TsfCustomerService {
 		return result;
 	}
 
-
 	/**
 	 * 고객계좌 정보
 	 *
@@ -812,7 +806,6 @@ public class TsfCustomerService {
 		return coreCustomerService.getCustomerAccuontInfo(custNo);
 	}
 
-
 	/**
 	 * 고객정보 수정
 	 *
@@ -999,4 +992,55 @@ public class TsfCustomerService {
 	public Collection<CustGrade> getCustGradePolicy(CustGrade custGrade) {
 		return customerDao.getCustGradePolicy(custGrade);
 	}
+
+	/**
+	 * SMS수신거부 처리
+	 * @param custNo - 고객번호
+	 * @author gagamel
+	 * @since 2021. 5. 11
+	 */
+	@Transactional("shopTxnManager")
+	public void updateSmsReceptionRefuse(Integer custNo) {
+		// 수신거부 처리
+		int result = customerDao.updateSmsReceptionRefuse(custNo);
+
+		if (result > 0) {
+			Customer customer = new Customer();
+			customer.setCustNo(custNo);
+			customer.setSmsAgreeYn("N");
+			customer.setRegNo(custNo);
+
+			// 마케팅수신동의이력 생성
+			coreCustomerService.createCustomerMarketHst(customer);
+
+			// 고객이력 생성
+			coreCustomerService.createCustomerHistory(customer);
+		}
+	}
+
+	/**
+	 * 메일수신거부 처리
+	 * @param custNo - 고객번호
+	 * @author gagamel
+	 * @since 2021. 5. 11
+	 */
+	@Transactional("shopTxnManager")
+	public void updateEmailReceptionRefuse(Integer custNo) {
+		// 수신거부 처리
+		int result = customerDao.updateEmailReceptionRefuse(custNo);
+
+		if (result > 0) {
+			Customer customer = new Customer();
+			customer.setCustNo(custNo);
+			customer.setEmailAgreeYn("N");
+			customer.setRegNo(custNo);
+
+			// 마케팅수신동의이력 생성
+			coreCustomerService.createCustomerMarketHst(customer);
+
+			// 고객이력 생성
+			coreCustomerService.createCustomerHistory(customer);
+		}
+	}
+
 }

+ 219 - 9
src/main/java/com/style24/front/biz/service/TsfOrderService.java

@@ -1,9 +1,14 @@
 package com.style24.front.biz.service;
 
+import java.io.*;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
+import javax.net.ssl.HttpsURLConnection;
+import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
@@ -991,23 +996,158 @@ public class TsfOrderService {
 		return "SUCCESS";
 	}
 	
-	public GagaMap nPayReq50(Order param) {
+	public GagaMap nPayReq50(Order param, HttpServletRequest request, HttpServletResponse response) {
 		GagaMap result = new GagaMap();
 
+		// 로그인 정보 조회
+		if(TsfSession.isLogin()) {
+			param.setCustNo(TsfSession.getInfo().getCustNo());
+		} else {
+			param.setCustNo(0);
+			param.setJsessionId(TsfSession.getSessionId());
+		}
+
 		try {
-			param.setFrontGb(TsfSession.getFrontGb());
 			param.setSiteCd(TscConstants.Site.STYLE24.value());
-			if(TsfSession.isLogin()) {
-				param.setCustNo(TsfSession.getInfo().getCustNo());
-			} else {
-				param.setCustNo(0);
-				param.setJsessionId(TsfSession.getSessionId());
-			}
+			param.setFrontGb(TsfSession.getFrontGb());	// 디바이스 정보
+			param.setPrePntDcAmtYn("N");				// 네이버페이 : 선포인트 사용하지 않음으로 강제 지정
+			param.setShotDelvYn("N");					// 네이버페이 : 총알배송 여부 설정 N
+			param.setInsuranceYn("N");					// 네이버페이 : 보증보험 신청 여부 N
 
-			// 장바구니 정보 조회
+			// 장바구니 등록된 주문 정보 조회
 			Collection<Order> cartList = coreOrderService.getCartGoodsList(param);
 
+			// 배송비 정보 조회
+			GagaMap delvMap = coreOrderService.getCartDelvGoodsCntList(cartList, param);
+			param.setDelvFeeCdList((Collection<Order>) delvMap.get("delvFeeCdList"));
+
+			// 주문 상세 정보 세팅
+			for(Order item : cartList) {
+				item.setSavePntAmt(0);
+				item.setOrdAmt((item.getCurrPrice() + item.getOptAddPrice()) * item.getGoodsQty());			// ordAmt = (즉시할인가 + 옵션가) * 수량
+				item.setRealOrdAmt(item.getOrdAmt());														// 네이버페이는 할인 없으므로 ordAmt와 동일
+				item.setShotDelvYn("N");
+				item.setGiftPackYn("N");
+				item.setRegNo(param.getCustNo());
+			}
+			param.setOrderDetailList(cartList);
+
+			// 주문 정보 등록
+			coreOrderService.createPreOrder(param);
+
+			// 네이버페이 기본정보
+			String shopId			= env.getProperty("naverPay.shop.id");				// shopId
+			String certificationKey	= env.getProperty("naverPay.certification.key");	// 네이버페이 인증키
+			String cpaInflowCode	= getCookieValue(request, "CPAValidator");
+			String naverInflowCode	= getCookieValue(request, "NA_CO");
+			String saClickId		= getCookieValue(request, "NVADID");
+			String domain 			= env.getProperty("domain.front");					// 도메인 주소
+			String staticUrl		= "/resources";
+			String goodsImgUrl		= env.getProperty("upload.goods.view");				// 상품 이미지 경로
+			int totPrice			= 0;												// 전체 주문 금액
+
+			log.info("CHECK PARAM ::::: {} / {}", param.getBackUrl(), param.getGoodsUrl());
+
+			// 네이버페이 송부용 xml 작성
+			StringBuffer sb = new StringBuffer();
+			sb.append("<order>");
+			sb.append("<merchantId>").append(shopId).append("</merchantId>");								//<!-- 상점ID -->
+			sb.append("<certiKey>").append("<![CDATA[" + certificationKey + "]]>").append("</certiKey>");	//<!-- 인증키 -->
+			sb.append("<backUrl>").append("<![CDATA[" + param.getBackUrl() + "]]>").append("</backUrl>");	//<!-- 이전페이지 -->
+			sb.append("<interface>");
+			sb.append("<merchantCustomCode1>").append(param.getOrdNo()).append("</merchantCustomCode1>");
+			sb.append("<cpaInflowCode>").append(cpaInflowCode).append("</cpaInflowCode>");
+			sb.append("<naverInflowCode>").append(naverInflowCode).append("</naverInflowCode>");
+			sb.append("<saClickId>").append(saClickId).append("</saClickId>");
+			sb.append("</interface>");
+
+			for(Order item : param.getOrderDetailList()) {
+				//<!-- 상품정보 -->
+				sb.append("<product>");
+				sb.append("<id>").append(item.getGoodsCd()).append("</id>");							//<!-- 상품코드 -->
+				sb.append("<ecMallProductId>").append(item.getGoodsCd()).append("</ecMallProductId>");	//<!-- 상품코드 -->
+				sb.append("<name>").append("<![CDATA[" + item.getGoodsNm() + "]]>").append("</name>");	//<!-- 상품명 -->
+				sb.append("<basePrice>").append(item.getCurrPrice() + item.getOptAddPrice()).append("</basePrice>");						//<!-- 상품금액 -->
+				sb.append("<infoUrl>").append("<![CDATA[http:" + param.getGoodsUrl() + item.getGoodsCd() + "]]>").append("</infoUrl>");		//<!-- 상품상세페이지 URL -->
+				sb.append("<imageUrl>").append("<![CDATA[http:" + goodsImgUrl + "/" + item.getSysImgNm() + "]]>").append("</imageUrl>");	//<!-- 상품원본이미지 URL -->
+
+				// 옵션 정보
+				sb.append("<option>");
+				sb.append("<quantity>").append(item.getGoodsQty()).append("</quantity>");							//<!-- 옵션수량-->
+				sb.append("<price>").append(item.getOptAddPrice()).append("</price>");								//<!-- 옵션금액 -->
+				sb.append("<manageCode>").append("<![CDATA[" + item.getOptCd() + "]]>").append("</manageCode>");	//<!-- 옵션관리코드 -->
+
+				// 칼라코드
+				sb.append("<selectedItem>");
+				sb.append("<type>SELECT</type>");//<!-- 옵션유형 -->
+				sb.append("<name>칼라</name>");//<!-- 옵션명 -->
+				sb.append("<value>");
+				sb.append("<id>").append("<![CDATA[" + item.getOptCd1() + "]]>").append("</id>");//<!-- 칼라코드 -->
+				sb.append("<text>").append("<![CDATA[" + item.getColorNm() + "]]>").append("</text>");//<!-- 칼라명 -->
+				sb.append("</value>");
+				sb.append("</selectedItem>");
+
+				// 사이즈코드
+				sb.append("<selectedItem>");
+				sb.append("<type>SELECT</type>");//<!-- 옵션유형 -->
+				sb.append("<name>사이즈</name>");//<!-- 옵션명 -->
+				sb.append("<value>");
+				sb.append("<id>").append("<![CDATA[" + item.getOptCd2() + "]]>").append("</id>");//<!-- 사이즈코드 -->
+				sb.append("<text>").append("<![CDATA[" + item.getOptCd2() + "]]>").append("</text>");//<!-- 사이즈명 -->
+				sb.append("</value>");
+				sb.append("</selectedItem>");
+				sb.append("</option>");
+
+				// 배송비 판단 후 배송비유형 선택 (추가 기본배송비, 무료배송비 기준 조회후 등록)
+				//<!-- 배송정보 -->
+				String delvFeeCrite = "CHARGE";
+				int delvFee = item.getDelvFee();
+				String feePayType = "PREPAYED";
+				// 배송비 조건
+				if(TscConstants.DelvFeeCrite.NORMAL.value().equals(item.getDelvFeeCrite())) {
+					delvFeeCrite = "CONDITIONAL_FREE";		// 조건부 무료(배송비 조건이 무료이거나 배송 방법이 착불일때만 배송비는 0원으로 변경)
+				} else if(TscConstants.DelvFeeCrite.FREE.value().equals(item.getDelvFeeCrite())) {
+					delvFeeCrite = "FREE";
+					feePayType = "FREE";
+					delvFee = 0;
+				}
+
+				sb.append("<shippingPolicy>");
+				sb.append("<groupId>").append(item.getDelvFeeCd()).append("</groupId>");		//<!-- 배송비묶음그룹ID -->
+				sb.append("<method>DELIVERY</method>");											//<!-- 배송방법 : 택배,소포,등기 -->
+				sb.append("<feeType>").append("CONDITIONAL_FREE").append("</feeType>");			//<!-- 배송비유형 : 유료 -->
+				sb.append("<feePayType>").append("PREPAYED").append("</feePayType>");			//<!-- 배송비결제방법 : 선불 -->
+				sb.append("<feePrice>").append(item.getDelvFee()).append("</feePrice>");		//<!-- 기본배송비 -->
+
+				// 조건부 무료일경우에만 송부
+				if(TscConstants.DelvFeeCrite.NORMAL.value().equals(item.getDelvFeeCrite())) {
+					sb.append("<conditionalFree>");
+					sb.append("<basePrice>").append(item.getMinOrdAmt()).append("</basePrice>");	//<!-- 무료배송비기준 -->
+					sb.append("</conditionalFree>");
+				}
+
+				sb.append("</shippingPolicy>");
+				sb.append("</product>");
+
+				totPrice = totPrice + ((item.getCurrPrice() + item.getOptAddPrice()) * item.getGoodsQty());
+			}
 
+			sb.append("</order>");
+
+			log.info("CHECK NAVER PAY SB ::::: \n{}", sb.toString());
+
+			result = sendOrderInfoToNC(sb);
+
+			// 네이버 페이 주문번호 저장
+			param.setNpayOrdNo(Integer.parseInt(result.get("orderKey").toString()));
+
+			log.info("CHECK NAVER PAY ORD NO ::::: {}", param.getNpayOrdNo());
+
+			// 3.주문정보 저장
+			coreOrderDao.updateNaverPayOrderNo(param);
+			result.put("npayOrderUrl", env.getProperty("naverPay.order.url"));
+			result.put("orderkey", result.get("orderKey").toString());
+			result.put("resultNo", result.get("resultNo").toString());
 
 			result.put("state", "sucess");
 		} catch(Exception e) {
@@ -1019,6 +1159,76 @@ public class TsfOrderService {
 
 		return result;
 	}
+
+	private GagaMap sendOrderInfoToNC(StringBuffer sb) throws IOException {
+		GagaMap resultMap = new GagaMap();
+
+		// 1.0, 2.0  일때 구분값 처리
+		URL _url = new URL(env.getProperty("naverPay.order.api.url"));
+		String ENCODING = "UTF-8";
+
+		HttpsURLConnection conn = (HttpsURLConnection)_url.openConnection();
+
+		log.info("CHECK URL ::::: {}", env.getProperty("naverPay.order.api.url"));
+
+		conn.setDoInput(true);
+		conn.setDoOutput(true);
+		conn.setUseCaches(false);
+		conn.setRequestMethod("POST");
+		conn.addRequestProperty("Content-Type", "application/xml; charset=UTF-8");
+
+		// 주문 등록 API 호출
+		Writer writer = new OutputStreamWriter(conn.getOutputStream(), ENCODING);
+		writer.write(sb.toString());
+
+		writer.flush();
+		writer.close();
+
+		int respCode = conn.getResponseCode();
+		log.info("CHECK RESP CODE ::::: {}", respCode);
+
+		if (respCode != 200) {
+			throw new RuntimeException(String.format("NC Response fail : %d %s", respCode, conn.getResponseMessage()));
+		}
+
+		BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
+
+		String[] arr = reader.readLine().toString().split(":");
+
+		log.info("CHECK RESULT ARR ::::: {} / {} / {}", arr[0], arr[1], arr[2]);
+		if ("SUCCESS".equals(arr[0])) {
+			resultMap.put("state", 		arr[0]);
+			resultMap.put("orderKey", 	arr[1]);
+			resultMap.put("resultNo", 	arr[2]);
+		} else {
+			throw new IllegalStateException(String.format("NC Response fail : %d %s", reader.readLine().toString()));
+		}
+
+		conn.disconnect();
+
+		return resultMap;
+	}
+
+	/*
+	 * 쿠키값 가져오기
+	 */
+	private String getCookieValue(HttpServletRequest request, String name) {
+		if (name == null || request == null) {
+			return "";
+		}
+
+		Cookie[] cookies = request.getCookies();
+
+		if (cookies != null) {
+			for (int i = 0; i < cookies.length; i++) {
+				if (name.equals(cookies[i].getName())) {
+					return cookies[i].getValue();
+				}
+			}
+		}
+
+		return "";
+	}
 	
 	/**
 	 * 장바구니정보 주문번호 이력 등록

+ 39 - 26
src/main/java/com/style24/front/biz/web/TsfCustomerController.java

@@ -3,12 +3,11 @@ package com.style24.front.biz.web;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
 
-import com.style24.front.biz.thirdparty.Yes24Login;
-import com.style24.persistence.domain.CustSnsInfo;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -22,13 +21,16 @@ import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.front.biz.service.TsfCustomerService;
 import com.style24.front.biz.service.TsfKakaoService;
 import com.style24.front.biz.thirdparty.NiceCertify;
+import com.style24.front.biz.thirdparty.Yes24Login;
 import com.style24.front.support.controller.TsfBaseController;
 import com.style24.front.support.security.session.TsfSession;
+import com.style24.persistence.domain.CustSnsInfo;
 import com.style24.persistence.domain.Customer;
 
 import lombok.extern.slf4j.Slf4j;
 
 import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.rest.server.GagaResponse;
 
 /**
  * 고객(회원) Controller
@@ -67,8 +69,7 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 02. 05
 	 */
 	@RequestMapping("/id/find/form")
-	public ModelAndView idFindForm(@RequestParam(value = "sEncData", required = false) String sEncData
-			, @RequestParam(value = "authMethod", required = false) String authMethod) {
+	public ModelAndView idFindForm(@RequestParam(value = "sEncData", required = false) String sEncData, @RequestParam(value = "authMethod", required = false) String authMethod) {
 
 		ModelAndView mav = new ModelAndView();
 
@@ -137,8 +138,7 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 02. 05
 	 */
 	@RequestMapping("/password/find/form")
-	public ModelAndView pwdFindForm(@RequestParam(value = "sEncData", required = false) String sEncData
-			, @RequestParam(value = "authMethod", required = false) String authMethod) {
+	public ModelAndView pwdFindForm(@RequestParam(value = "sEncData", required = false) String sEncData, @RequestParam(value = "authMethod", required = false) String authMethod) {
 
 		ModelAndView mav = new ModelAndView();
 		mav.addObject("sEncData", sEncData);
@@ -338,9 +338,7 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 02. 05
 	 */
 	@RequestMapping("/join/form")
-	public ModelAndView getJoinForm(@RequestParam(value = "sEncData", required = false) String sEncData
-			, @RequestParam(value = "authMethod", required = false) String authMethod
-			, @RequestParam(value = "custParams", required = false) String custParams) {
+	public ModelAndView getJoinForm(@RequestParam(value = "sEncData", required = false) String sEncData, @RequestParam(value = "authMethod", required = false) String authMethod, @RequestParam(value = "custParams", required = false) String custParams) {
 
 		ModelAndView mav = new ModelAndView();
 
@@ -362,8 +360,7 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 02. 09
 	 */
 	@GetMapping("/nice/cellphone/form")
-	public ModelAndView niceCellphoneForm(@RequestParam(value = "redirectUrl", required = false) String redirectUrl
-										, @RequestParam(value = "custParams", required = false) String custParams) {
+	public ModelAndView niceCellphoneForm(@RequestParam(value = "redirectUrl", required = false) String redirectUrl, @RequestParam(value = "custParams", required = false) String custParams) {
 		ModelAndView mav = new ModelAndView();
 		GagaMap result = niceCertify.certifyCellPhone();
 
@@ -386,8 +383,7 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 02. 09
 	 */
 	@GetMapping("/nice/ipin/form")
-	public ModelAndView getCertifyNiceIpin(@RequestParam(value = "redirectUrl", required = false) String redirectUrl
-										 , @RequestParam(value = "custParams", required = false) String custParams) {
+	public ModelAndView getCertifyNiceIpin(@RequestParam(value = "redirectUrl", required = false) String redirectUrl, @RequestParam(value = "custParams", required = false) String custParams) {
 		ModelAndView mav = new ModelAndView();
 		GagaMap result = niceCertify.certifyIpin();
 
@@ -411,10 +407,7 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 02. 09
 	 */
 	@RequestMapping("/nice/certify/callback")
-	public ModelAndView niceCertifyCallback(@RequestParam(value = "EncodeData", required = false) String encodeData
-			, @RequestParam(value = "enc_data", required = false) String encData
-			, @RequestParam(value = "param_r1", required = false) String redirectUrl
-			, @RequestParam(value = "param_r2", required = false) String custParams) {
+	public ModelAndView niceCertifyCallback(@RequestParam(value = "EncodeData", required = false) String encodeData, @RequestParam(value = "enc_data", required = false) String encData, @RequestParam(value = "param_r1", required = false) String redirectUrl, @RequestParam(value = "param_r2", required = false) String custParams) {
 
 		ModelAndView mav = new ModelAndView();
 		String sEncData = "";
@@ -667,9 +660,7 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 03. 08
 	 */
 	@RequestMapping("/dormant/certify/form")
-	public ModelAndView getDormantCeirtyForm(@RequestParam(value = "sEncData", required = false) String sEncData
-										 	, @RequestParam(value = "authMethod", required = false) String authMethod
-											, @RequestParam(value = "custParams", required = false) String custParams) {
+	public ModelAndView getDormantCeirtyForm(@RequestParam(value = "sEncData", required = false) String sEncData, @RequestParam(value = "authMethod", required = false) String authMethod, @RequestParam(value = "custParams", required = false) String custParams) {
 
 		ModelAndView mav = new ModelAndView();
 
@@ -706,7 +697,7 @@ public class TsfCustomerController extends TsfBaseController {
 		}
 
 		GagaMap resultInfo;
-		if (TscConstants.AuthMethod.MOBILE.value().equals(customer.getAuthMethod())){
+		if (TscConstants.AuthMethod.MOBILE.value().equals(customer.getAuthMethod())) {
 			resultInfo = niceCertify.getCertifyCellPhoneResultInfo(customer);
 			customer.setCi(resultInfo.getString("sCi"));
 		} else {
@@ -743,9 +734,7 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 03. 10
 	 */
 	@RequestMapping("/certification/form")
-	public ModelAndView getCertificationForm(@RequestParam(value = "sEncData", required = false) String sEncData
-			, @RequestParam(value = "authMethod", required = false) String authMethod
-			, @RequestParam(value = "custParams", required = false) String custParams) {
+	public ModelAndView getCertificationForm(@RequestParam(value = "sEncData", required = false) String sEncData, @RequestParam(value = "authMethod", required = false) String authMethod, @RequestParam(value = "custParams", required = false) String custParams) {
 
 		ModelAndView mav = new ModelAndView();
 
@@ -761,7 +750,6 @@ public class TsfCustomerController extends TsfBaseController {
 		mav.addObject("sEncData", sEncData);
 		mav.addObject("authMethod", authMethod);
 
-
 		mav.setViewName(super.getDeviceViewName("customer/CertificationForm"));
 		return mav;
 	}
@@ -887,7 +875,7 @@ public class TsfCustomerController extends TsfBaseController {
 	@PostMapping("/peristalsis/yes24")
 	@ResponseBody
 	public GagaMap peristalsisYes24(HttpSession session, HttpServletRequest request) {
-		CustSnsInfo custSnsInfo = (CustSnsInfo) session.getAttribute("custSnsInfo");
+		CustSnsInfo custSnsInfo = (CustSnsInfo)session.getAttribute("custSnsInfo");
 		session.removeAttribute("custSnsInfo"); // YES24 세션 지움
 
 		// 1. SNS처리
@@ -964,5 +952,30 @@ public class TsfCustomerController extends TsfBaseController {
 		return mav;
 	}
 
+	/**
+	 * SMS수신거부 처리
+	 * @param custNo - 고객번호
+	 * @author gagamel
+	 * @since 2020. 5. 11
+	 */
+	@GetMapping("/sms/refuse/{custNo}")
+	@ResponseBody
+	public GagaResponse updateSmsReceptionRefuse(@PathVariable Integer custNo) {
+		customerService.updateSmsReceptionRefuse(custNo);
+		return super.ok(message.getMessage("SUCC_0004"));
+	}
+
+	/**
+	 * 이메일수신거부 처리
+	 * @param custNo - 고객번호
+	 * @author gagamel
+	 * @since 2020. 5. 11
+	 */
+	@GetMapping("/email/refuse/{custNo}")
+	@ResponseBody
+	public GagaResponse updateEmailReceptionRefuse(@PathVariable Integer custNo) {
+		customerService.updateSmsReceptionRefuse(custNo);
+		return super.ok(message.getMessage("SUCC_0004"));
+	}
 
 }

+ 2 - 13
src/main/java/com/style24/front/biz/web/TsfPgController.java

@@ -181,18 +181,7 @@ public class TsfPgController extends TsfBaseController {
 	 */
 	@ResponseBody
 	@PostMapping("/nPayReq")
-	public GagaMap nPayReq(@RequestBody Order param) {
-		GagaMap map = new GagaMap();
-		//for(Order param : params) {
-		//	log.info("CHECK NPAY INPUT >>>> {} / {} / {}", param.getGoodsCd(), param.getOptCd(), param.getGoodsQty());
-		//}
-
-		for(int cartSq : param.getCartSqArr()) {
-			log.info("CHECK NPAY INPUT >>>> {}", param.getCartSqArr());
-		}
-
-		map = orderService.nPayReq50(param);
-
-		return map;
+	public GagaMap nPayReq(@RequestBody Order param, HttpServletRequest request, HttpServletResponse response) {
+		return orderService.nPayReq50(param, request, response);
 	}
 }

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

@@ -548,7 +548,7 @@
 		             , CASE WHEN GQDS.GOODS_CD IS NULL AND G.SELF_GOODS_YN = 'Y' THEN 'SHOT'
 		                    WHEN G.SELF_GOODS_YN = 'Y' THEN 'WMS'
 		                    ELSE DFP.DELV_FEE_CD END AS CART_DELV_FEE_CD
-		             , CASE WHEN STOCK.ORD_CAN_YN = 'Y' AND (SELECT  CASE WHEN MAX(Z.CNT1) IS NULL THEN 'Y' ELSE CASE WHEN CNT2 > 0 THEN 'Y'
+		             , CASE WHEN STOCK.ORD_CAN_YN = 'Y' AND (SELECT  CASE WHEN MAX(Z.CNT1) IS NULL THEN 'Y' ELSE CASE WHEN MAX(Z.CNT2) > 0 THEN 'Y'
 		                                                                                                              ELSE 'N' END END
 		                                                     FROM    (SELECT COUNT(1) AS CNT1
 		                                                                   , CASE WHEN GOG.CUST_GRADE = CT.CUST_GRADE THEN 1

+ 24 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsfCustomer.xml

@@ -654,5 +654,29 @@
 		    ,  UPD_DT = NOW()
 		    ,  UPD_NO = #{updNo}
 	</insert>
+	
+	<!-- SMS수신거부 처리 -->
+	<update id="updateSmsReceptionRefuse" parameterType="Integer">
+		/* TsfCustomer.updateSmsReceptionRefuse */
+		UPDATE TB_CUSTOMER
+		SET    SMS_AGREE_YN = 'N'
+		     , SMS_AGREE_DT = NOW()
+		     , UPD_NO = #{custNo}
+		     , UPD_DT = NOW()
+		WHERE  CUST_NO = #{custNo}
+		AND    SMS_AGREE_YN = 'Y' /*현재수신동의인경우*/
+	</update>
+	
+	<!-- 메일수신거부 처리 -->
+	<update id="updateEmailReceptionRefuse" parameterType="Integer">
+		/* TsfCustomer.updateEmailReceptionRefuse */
+		UPDATE TB_CUSTOMER
+		SET    EMAIL_AGREE_YN = 'N'
+		     , EMAIL_AGREE_DT = NOW()
+		     , UPD_NO = #{custNo}
+		     , UPD_DT = NOW()
+		WHERE  CUST_NO = #{custNo}
+		AND    EMAIL_AGREE_YN = 'Y' /*현재수신동의인경우*/
+	</update>
 
 </mapper>

+ 2 - 1
src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml

@@ -548,7 +548,8 @@
 		           , A.LINK_URL 
 		           , A.NOTE 
 		           , B.CARD_PRMT_CDT_SQ 
-		           , (B.MIN_PAY_AMT / 10000) AS MIN_PAY_AMT  -- 만원단위 
+		           --  , (B.MIN_PAY_AMT / 10000) AS MIN_PAY_AMT  -- 만원단위
+		           , B.MIN_PAY_AMT 
 		           , B.MAX_DC_AMT
 		           , B.MAX_NO_ITRT 
 		           , B.MIN_NO_ITRT 

+ 2 - 2
src/main/java/com/style24/persistence/mybatis/shop/TsfReview.xml

@@ -171,7 +171,7 @@
 		                        )
 		                    )
 		        </if>
-		        ) AS PREV_REVIEW_SQ
+		        ) AS NEXT_REVIEW_SQ       -- DESC순 
 		     , (SELECT MIN(RN.REVIEW_SQ) 
 		        FROM TB_REVIEW RN
 		        WHERE RN.REVIEW_SQ > #{reviewSq}
@@ -191,7 +191,7 @@
 		                        )
 		                    )
 		        </if>
-		        ) AS NEXT_REVIEW_SQ
+		        ) AS PREV_REVIEW_SQ       -- DESC순
 		     , RANK() OVER(ORDER BY R.REVIEW_SQ DESC) AS RNUM
 		FROM TB_REVIEW R 
 		INNER JOIN TB_GOODS G ON R.GOODS_CD = G.GOODS_CD

+ 1 - 0
src/main/resources/config/application-locd.yml

@@ -88,6 +88,7 @@ naverPay:
     common.certification.key : s_3799db3bf4af-
     certification.key: 2BC5E173-2840-4B48-BC7D-FF770005DD76
     order.api.url: https://test-api.pay.naver.com/o/customer/api/order/v20/register
+    order.url: https://test-order.pay.naver.com/customer/buy
 
 # ERP (한세드림)
 erp:

+ 2 - 2
src/main/webapp/WEB-INF/views/mob/callcenter/GoodsQnaFormMob.html

@@ -101,7 +101,7 @@
 				tag += '						<span class="fold_state ' + (item.ansStat == "G060_10" ? "doing" : "done") + '"">' + item.ansStatNm + '</span>\n'; //답변완료 : done / 처리중 : doing
 				tag += '						<span class="prod">' + item.goodsNm + ' ' + item.relGoodsCd + '</span>\n';
 				tag += '					</div>\n';
-				tag += '					<div class="lap2"><span>' + item.questContent + '</span></div>\n';
+				tag += '					<div class="lap2"><span>' + item.questContent.escapeHtml() + '</span></div>\n';
 				tag += '				</div>\n';
 				tag += '				<span class="data">' + item.questDt + '</span>\n';
 				tag += '			</div>\n';
@@ -110,7 +110,7 @@
 				tag += '	<div class="fold_cont">\n';
 				tag += '		<div class="fold_detail">\n';
 				tag += '			<div>\n';
-				tag += '				<p>' + item.questContent + '</p>\n';
+				tag += '				<p>' + item.questContent.escapeHtml() + '</p>\n';
 				tag += '			</div>\n';
 				tag += '		</div>\n';
 				

+ 1 - 1
src/main/webapp/WEB-INF/views/mob/callcenter/NoticeFormMob.html

@@ -95,7 +95,7 @@
 				tag += '	</div>\n';
 				tag += '	<div class="fold_cont">\n';
 				tag += '		<div class="fold_answer">\n';
-				tag += '			<div class="answer_body">' + item.noticeContent + '</div>\n';
+				tag += '			<div class="answer_body">' + item.noticeContent.escapeHtml() + '</div>\n';
 				tag += '		</div>\n';
 				tag += '	</div>\n';
 				tag += '</li>\n';

+ 1 - 1
src/main/webapp/WEB-INF/views/mob/callcenter/OneToOneQnaFormMob.html

@@ -321,7 +321,7 @@
 				tag += '	</div>\n';
 				tag += '	<div class="fold_cont">\n';
 				tag += '		<div class="fold_detail">\n';
-				tag += '			<div><p>' + item.questContent + '</p></div>\n';
+				tag += '			<div><p>' + item.questContent.escapeHtml() + '</p></div>\n';
 				
 				if (!gagajf.isNull(item.sysFileNm1) || !gagajf.isNull(item.sysFileNm2)) {
 					tag += '		<p class="img_group">\n';

+ 6 - 0
src/main/webapp/WEB-INF/views/mob/cart/CartListAjaxFormMob.html

@@ -42,6 +42,12 @@
 											<em class="tag_stype2">총알배송</em>
 										</span>
 									</label>
+									<div class="tip_wrap tip1">
+										<div class="tip_tit">?</div>
+										<div class="tip_contents">
+											<p class="tip_txt"></p><ul><li>총알배송 가능 지역인 경우에만 적용됩니다.</li></ul><p></p>
+										</div>
+									</div>
 								</div>
 							</td>
 						</tr>

+ 2 - 2
src/main/webapp/WEB-INF/views/mob/cart/CartListFormMob.html

@@ -2,7 +2,7 @@
 <html lang="ko"
 	  xmlns:th="http://www.thymeleaf.org"
 	  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
-	  layout:decorator="mob/common/layout/SubLayoutMob">
+	  layout:decorator="mob/common/layout/GoodsLayoutMob">
 <!--
  *******************************************************************************
  * @source  : cartListFormMob
@@ -245,7 +245,7 @@
 
 		// 다다익선 정보
 		let qtyTmtbSq = $(obj).parent().parent().parent().parent().find("input[name=qtyTmtbSq]").val();
-		let amtTmtbSq = $(obj).parent().parent().parent().parent().find("input[name=qtyTmtbSq]").val();
+		let amtTmtbSq = $(obj).parent().parent().parent().parent().find("input[name=amtTmtbSq]").val();
 		let qtyTmtbYn = $(obj).parent().parent().parent().parent().find("input[name=applyQtySectionYn]").val();
 		let amtTmtbYn = $(obj).parent().parent().parent().parent().find("input[name=applyAmtSectionYn]").val();
 		let goodsCd = $(obj).parent().parent().parent().parent().find("input[name=goodsCd]").val();

+ 1 - 1
src/main/webapp/WEB-INF/views/mob/goods/CardPrmtFormMob.html

@@ -41,7 +41,7 @@
 											</th:block>
 											<th:block th:unless="${cardInfo.dcGb == '3'}">
 											<p th:text="${#numbers.formatInteger(cardInfo.dcVal, 0,'COMMA')+ cardInfo.dcWayNm + ' ' + cardInfo.prmtGbNm}">5% 즉시할인</p>
-											<p th:text="${cardInfo.minPayAmt + '원 이상 구매 시 최대 ' + #numbers.formatInteger(cardInfo.maxDcAmt, 0,'COMMA') + '원 할인 '}">7만원 이상 구매 시 최대 5만원 할인</p>
+											<p th:text="${#numbers.formatInteger(cardInfo.minPayAmt, 0,'COMMA')  + '원 이상 구매 시 최대 ' + #numbers.formatInteger(cardInfo.maxDcAmt, 0,'COMMA') + '원 할인 '}">7만원 이상 구매 시 최대 5만원 할인</p>
 											</th:block>
 											<th:block th:if="${not #strings.isEmpty(cardInfo.linkUrl)}"><a th:href="${cardInfo.linkUrl}" target="_blank" class="link" >자세히보기</a></th:block>
 										</div>

+ 2 - 2
src/main/webapp/WEB-INF/views/mob/goods/GoodsDetailQnaFormMob.html

@@ -102,7 +102,7 @@
 			}
 			tag += '						</span>\n';
 			tag += '					</div>\n';
-			tag += '					<div class="lap2"><span>' + item.questContent + '</span></div>\n';
+			tag += '					<div class="lap2"><span>' + item.questContent.escapeHtml() + '</span></div>\n';
 			tag += '					<span class="id">'+ item.maskingCustId+'</span><span class="data">' + item.questDt + '</span>\n';
 			tag += '				</div>\n';
 			tag += '			</div>\n';
@@ -111,7 +111,7 @@
 			tag += '	<div class="fold_cont">\n';
 			tag += '		<div class="fold_detail">\n'; //문의 내용
 			tag += '			<div>\n';
-			tag += '				<p>' + item.questContent.replaceAll("\n", "</br>") + '</p>\n';
+			tag += '				<p>' + item.questContent.replaceAll("\n", "</br>").escapeHtml() + '</p>\n';
 			tag += '			</div>\n';
 			tag += '		</div>\n';
 			

+ 2 - 2
src/main/webapp/WEB-INF/views/web/callcenter/GoodsQnaFormWeb.html

@@ -120,7 +120,7 @@
 				tag += '				<span class="fold_state ' + (item.ansStat == "G060_10" ? "doing" : "done") + '">' + item.ansStatNm + '</span>\n'; //답변완료 : done / 처리중 : doing
 				tag += '				<div class="fold_tit">\n';
 				tag += '					<span class="prod">' + item.goodsNm + ' ' + item.relGoodsCd + '</span>\n';
-				tag += '					<span>' + item.questContent + '</span>\n';
+				tag += '					<span>' + item.questContent.escapeHtml() + '</span>\n';
 				tag += '				</div>\n';
 				tag += '				<span class="data">' + item.questDt + '</span>\n';
 				tag += '			</div>\n';
@@ -129,7 +129,7 @@
 				tag += '	<div class="fold_cont" style="display: none;">\n';
 				tag += '		<div class="fold_detail">\n'; //문의 내용
 				tag += '			<div>\n';
-				tag += '				<p>' + item.questContent + '</p>\n';
+				tag += '				<p>' + item.questContent.escapeHtml() + '</p>\n';
 				tag += '			</div>\n';
 				
 				if (item.ansStat == 'G060_20') { // 답변완료일 때

+ 1 - 1
src/main/webapp/WEB-INF/views/web/callcenter/NoticeFormWeb.html

@@ -120,7 +120,7 @@
 				tag += '	</div>\n';
 				tag += '	<div class="fold_cont" style="display: none;">\n';
 				tag += '		<div class="fold_detail">\n';
-				tag += '			<div>' + item.noticeContent + '</div>\n';
+				tag += '			<div>' + item.noticeContent.escapeHtml() + '</div>\n';
 				tag += '		</div>\n';
 				tag += '	</div>\n';
 				tag += '</li>\n';

+ 1 - 1
src/main/webapp/WEB-INF/views/web/callcenter/OneToOneQnaFormWeb.html

@@ -192,7 +192,7 @@
 				tag += '	<div class="fold_cont" style="display: none;">\n';
 				tag += '		<div class="fold_detail">\n'; //문의 내용
 				tag += '			<div>\n';
-				tag += '				<p>' + item.questContent + '</p>\n';
+				tag += '				<p>' + item.questContent.escapeHtml() + '</p>\n';
 				
 				if (!gagajf.isNull(item.sysFileNm1) || !gagajf.isNull(item.sysFileNm2)) {
 					tag += '				<p class="img_group">\n';

+ 6 - 0
src/main/webapp/WEB-INF/views/web/cart/CartListAjaxFormWeb.html

@@ -36,6 +36,12 @@
 									<div>
 										<input type="radio" name="shotDelvUseYn" id="blt_ship1" value="Y" th:checked="${order.shotDelvUseYn != null and order.shotDelvUseYn.equals('Y') and order.shotCartList.size() > 0}">
 										<label for="blt_ship1"><span><em class="tag primary_line">총알배송</em><span th:text="|${order.shotDelvDt}일 24:00 까지 도착|"></span></span></label>
+										<div class="tip_wrap tip1">
+											<div class="tip_tit">?</div>
+											<div class="tip_contents">
+												<p class="tip_txt"></p><ul><li>총알배송 가능 지역인 경우에만 적용됩니다.</li></ul><p></p>
+											</div>
+										</div>
 									</div>
 									<div>
 										<input type="radio" name="shotDelvUseYn" id="blt_ship2" value="N" th:checked="${order.shotDelvUseYn == null or !order.shotDelvUseYn.equals('Y') or order.shotCartList.size() < 1}">

+ 1 - 1
src/main/webapp/WEB-INF/views/web/cart/CartListFormWeb.html

@@ -310,7 +310,7 @@
 
 		// 다다익선 정보
 		let qtyTmtbSq = $(obj).parent().parent().parent().parent().parent().parent().find("input[name=qtyTmtbSq]").val();
-		let amtTmtbSq = $(obj).parent().parent().parent().parent().parent().parent().find("input[name=qtyTmtbSq]").val();
+		let amtTmtbSq = $(obj).parent().parent().parent().parent().parent().parent().find("input[name=amtTmtbSq]").val();
 		let qtyTmtbYn = $(obj).parent().parent().parent().parent().parent().parent().find("input[name=applyQtySectionYn]").val();
 		let amtTmtbYn = $(obj).parent().parent().parent().parent().parent().parent().find("input[name=applyAmtSectionYn]").val();
 		let goodsCd = $(obj).parent().parent().parent().parent().parent().parent().find("input[name=goodsCd]").val();

+ 1 - 1
src/main/webapp/WEB-INF/views/web/display/BrandMainFormWeb.html

@@ -127,7 +127,7 @@
 
 				<!-- 가로 긴 배너 슬라이드 -->
 				<!-- 브랜드 배너 -->
-				<th:block th:if="${contentsLoc=='006' || contentsLoc=='014'||contentsLoc=='015'||contentsLoc=='016}">
+				<th:block th:if="${contentsLoc=='006' || contentsLoc=='014'||contentsLoc=='015'||contentsLoc=='016'}">
 					<div class="content wide main_1stage">
 						<div class="cont_head dpnone">
 							<p class="t_c">배너 슬라이드</p>

+ 1 - 1
src/main/webapp/WEB-INF/views/web/goods/CardPrmtFormWeb.html

@@ -43,7 +43,7 @@
 											</th:block>
 											<th:block th:unless="${cardInfo.dcGb == '3'}">
 											<p th:text="${#numbers.formatInteger(cardInfo.dcVal, 0,'COMMA')+ cardInfo.dcWayNm + ' ' + cardInfo.prmtGbNm}">5% 즉시할인</p>
-											<p th:text="${cardInfo.minPayAmt + '원 이상 구매 시 최대 ' + #numbers.formatInteger(cardInfo.maxDcAmt, 0,'COMMA') + '원 할인 '}">7만원 이상 구매 시 최대 5만원 할인</p>
+											<p th:text="${#numbers.formatInteger(cardInfo.minPayAmt, 0,'COMMA') + '원 이상 구매 시 최대 ' + #numbers.formatInteger(cardInfo.maxDcAmt, 0,'COMMA') + '원 할인 '}">7만원 이상 구매 시 최대 5만원 할인</p>
 											</th:block>
 											
 										</div>

+ 9 - 6
src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html

@@ -453,30 +453,33 @@
 										}
 
 										function buy_nc_req(cartSqArr) {
-											alert(cartSqArr.length);
-											// buyList[0].backUrl = location.href;
+											let data = {  cartSqArr : cartSqArr
+														, backUrl : location.href
+														, goodsUrl : _PAGE_GOODS_DETAIL
+											};
+											let jsonData = JSON.stringify(data);
 
 											$.ajax( {
 												type		: "POST",
 												url 		: "/pg/nPayReq",
 												dataType 	: 'json',
-												data		: {cartSqArr : JSON.stringify(cartSqArr)},
+												data		: jsonData,
 												beforeSend : function(xhr, settings) {
 													xhr.setRequestHeader("AJAX"			, "true");
 													xhr.setRequestHeader('Accept'		, 'application/json');
 													xhr.setRequestHeader('Content-Type'	, 'application/json');
 												},
 												error: function(xhr, status, error) {
-													alert(status + '; ' + error);
+													mcxDialog.alert(status + '; ' + error);
 												},
 												success : function(result) {
 													if (result.state == "sucess") {
 														window.open('about:blank', 'popupView');
 														document.nPayForm.target = 'popupView';
-														document.nPayForm.action = "$!{NPAY_ORDER_URL}" + result.orderKey + "/" + result.resultNo;
+														document.nPayForm.action = result.npayOrderUrl + "/" + result.orderKey + "/" + result.resultNo;
 														document.nPayForm.submit();
 													} else {
-														alert(result.message);
+														mcxDialog.alert(result.message);
 													}
 												}
 											});

+ 2 - 2
src/main/webapp/WEB-INF/views/web/goods/GoodsDetailQnaFormWeb.html

@@ -102,7 +102,7 @@
 				tag += '			<div>\n';
 				tag += '				<span class="fold_state ' + (item.ansStat == "G060_10" ? "doing" : "done") + '">' + item.ansStatNm + '</span>\n'; //답변완료 : done / 처리중 : doing
 				tag += '				<div class="fold_tit">\n';
-				tag += '					<span>' + item.questContent + '</span>\n';
+				tag += '					<span>' + item.questContent.escapeHtml() + '</span>\n';
 				if (item.selfGb == 1){
 				tag += '					<i class="ico ico_myqna"></i>\n';	//내가 쓴 글에 추가되는 아이콘
 				}
@@ -120,7 +120,7 @@
 				tag += '	<div class="fold_cont" style="display: none;">\n';
 				tag += '		<div class="fold_detail">\n'; //문의 내용
 				tag += '			<div>\n';
-				tag += '				<p>' + item.questContent.replaceAll("\n", "</br>") + '</p>\n';
+				tag += '				<p>' + item.questContent.replaceAll("\n", "</br>").escapeHtml() + '</p>\n';
 				tag += '			</div>\n';
 				tag += '		</div>\n';
 				

+ 1 - 13
src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html

@@ -826,7 +826,7 @@ var fnSearchCallback = function (result) {
 				 }
 				
 				 html += '			</div>';
-				 html += '			<p>'+escapeHtml(item.entryVal1)+'</p>';
+				 html += '			<p>'+item.entryVal1.escapeHtml()+'</p>';
 				 if (item.entryCustNo == result.custNo) {
 					 html += '			<button class="btn btn_default btn_del" value="'+item.planEntrySq+'" onclick="fnDelReply(this.value)"><span>삭제</span></button>';
 				 }
@@ -851,18 +851,6 @@ var fnSearchCallback = function (result) {
 	gagaPaging.createPagination(result.paging.pageable);
 }
 
-function escapeHtml(str) {
-	var map = {
-		'&': '&amp;',
-		'<': '&lt;',
-		'>': '&gt;',
-		'"': '&quot;',
-		"'": '&#039;'
-	};
-	return str.replace(/[&<>"']/g, function(m) { return map[m]; });
-}
-
-
 // 댓글 삭제
 var fnDelReply = function(obj) {
 	

+ 21 - 0
src/main/webapp/ux/plugins/gaga/gaga.common.js

@@ -377,3 +377,24 @@ String.prototype.addComma = function(decimalPosition) {
 String.prototype.removeComma = function() {
 	return this.replace(/,/gi,"");
 }
+
+/**
+ * @type   : prototype_function
+ * @access : public
+ * @desc   : 자바스크립트의 내장 객체인 String 객체에 &,<,>,",' 브라우져 출력용 변환한다.
+ * <pre>
+ *     "<문자열>".escapeHtml();
+ * </pre>
+ * @return : 콤마(,)가 제거된 스트링
+ * @author : gagamel
+ */
+String.prototype.escapeHtml = function() {
+	var map = {
+		'&': '&amp;',
+		'<': '&lt;',
+		'>': '&gt;',
+		'"': '&quot;',
+		"'": '&#039;'
+	};
+	return this.replace(/[&<>"']/g, function(m) { return map[m]; });
+}