Explorar o código

Merge branch 'develop' into csh9191

ChoiSooHwan %!s(int64=5) %!d(string=hai) anos
pai
achega
79d38c5457
Modificáronse 63 ficheiros con 6507 adicións e 2285 borrados
  1. 9 0
      src/main/java/com/style24/front/biz/dao/TsfCounselDao.java
  2. 33 13
      src/main/java/com/style24/front/biz/dao/TsfGoodsDao.java
  3. 35 0
      src/main/java/com/style24/front/biz/dao/TsfPlanningDao.java
  4. 10 6
      src/main/java/com/style24/front/biz/service/TsfCartService.java
  5. 41 2
      src/main/java/com/style24/front/biz/service/TsfCounselService.java
  6. 2 2
      src/main/java/com/style24/front/biz/service/TsfCustomerService.java
  7. 59 22
      src/main/java/com/style24/front/biz/service/TsfGoodsService.java
  8. 26 2
      src/main/java/com/style24/front/biz/service/TsfOrderService.java
  9. 41 0
      src/main/java/com/style24/front/biz/service/TsfPlanningService.java
  10. 2 1
      src/main/java/com/style24/front/biz/thirdparty/Yes24Login.java
  11. 1 0
      src/main/java/com/style24/front/biz/web/TsfCallcenterController.java
  12. 6 2
      src/main/java/com/style24/front/biz/web/TsfCartController.java
  13. 19 8
      src/main/java/com/style24/front/biz/web/TsfCustomerController.java
  14. 158 16
      src/main/java/com/style24/front/biz/web/TsfGoodsController.java
  15. 664 80
      src/main/java/com/style24/front/biz/web/TsfOrderController.java
  16. 59 0
      src/main/java/com/style24/front/biz/web/TsfPgController.java
  17. 46 0
      src/main/java/com/style24/front/biz/web/TsfPlanningController.java
  18. 2 2
      src/main/java/com/style24/front/support/security/TsfAuthenticationProvider.java
  19. 10 0
      src/main/java/com/style24/persistence/domain/Counsel.java
  20. 28 0
      src/main/java/com/style24/persistence/domain/Delivery.java
  21. 5 1
      src/main/java/com/style24/persistence/domain/Goods.java
  22. 33 0
      src/main/java/com/style24/persistence/domain/GoodsSafeNo.java
  23. 2 1
      src/main/java/com/style24/persistence/domain/GoodsStock.java
  24. 19 0
      src/main/java/com/style24/persistence/domain/Login.java
  25. 0 37
      src/main/java/com/style24/persistence/domain/Lookbook.java
  26. 0 22
      src/main/java/com/style24/persistence/domain/LookbookGoods.java
  27. 295 0
      src/main/java/com/style24/persistence/domain/Plan.java
  28. 59 2
      src/main/java/com/style24/persistence/mybatis/shop/TsfCounsel.xml
  29. 0 2
      src/main/java/com/style24/persistence/mybatis/shop/TsfCustomer.xml
  30. 150 115
      src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml
  31. 1 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfLogin.xml
  32. 98 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfPlanning.xml
  33. 10 4
      src/main/resources/config/application-locd.yml
  34. 1 1
      src/main/resources/config/application-tsit.yml
  35. 3 0
      src/main/resources/config/application.yml
  36. 1 1
      src/main/webapp/WEB-INF/views/web/callcenter/FaqFormWeb.html
  37. 2 2
      src/main/webapp/WEB-INF/views/web/callcenter/GoodsQnaFormWeb.html
  38. 1 1
      src/main/webapp/WEB-INF/views/web/callcenter/NoticeFormWeb.html
  39. 61 1
      src/main/webapp/WEB-INF/views/web/callcenter/OneToOneQnaFormWeb.html
  40. 28 38
      src/main/webapp/WEB-INF/views/web/callcenter/OneToOneQnaRegisterFormWeb.html
  41. 1 1
      src/main/webapp/WEB-INF/views/web/common/fragments/GnbWeb.html
  42. 5 2
      src/main/webapp/WEB-INF/views/web/common/fragments/HeadWeb.html
  43. 22 24
      src/main/webapp/WEB-INF/views/web/customer/JoinFormWeb.html
  44. 2 1
      src/main/webapp/WEB-INF/views/web/goods/CardPrmtFormWeb.html
  45. 193 0
      src/main/webapp/WEB-INF/views/web/goods/GoodsDeliveryFormWeb.html
  46. 113 690
      src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html
  47. 122 0
      src/main/webapp/WEB-INF/views/web/goods/GoodsQnaDetailFormWeb.html
  48. 166 0
      src/main/webapp/WEB-INF/views/web/goods/GoodsQnaFormWeb.html
  49. 80 0
      src/main/webapp/WEB-INF/views/web/order/OrderCustemerInfoWeb.html
  50. 276 0
      src/main/webapp/WEB-INF/views/web/order/OrderDcAmtInfoWeb.html
  51. 162 0
      src/main/webapp/WEB-INF/views/web/order/OrderDeliveryAddrInfoWeb.html
  52. 324 761
      src/main/webapp/WEB-INF/views/web/order/OrderFormWeb.html
  53. 1695 0
      src/main/webapp/WEB-INF/views/web/order/OrderFormWeb20210306.html
  54. 105 0
      src/main/webapp/WEB-INF/views/web/order/OrderFreegiftInfoWeb.html
  55. 281 0
      src/main/webapp/WEB-INF/views/web/order/OrderPaymentInfoWeb.html
  56. 32 0
      src/main/webapp/WEB-INF/views/web/pg/KakaoPaymentRequestWeb.html
  57. 32 0
      src/main/webapp/WEB-INF/views/web/pg/NaverPaymentRequestWeb.html
  58. 41 29
      src/main/webapp/WEB-INF/views/web/pg/kcpOrderWeb.html
  59. 154 0
      src/main/webapp/WEB-INF/views/web/planning/PlanningMainFormWeb.html
  60. BIN=BIN
      src/main/webapp/images/pc/ico_point_sm.png
  61. 502 345
      src/main/webapp/ux/pc/css/layout.css
  62. 1 1
      src/main/webapp/ux/plugins/gaga/gaga.validation.js
  63. 178 47
      src/main/webapp/ux/style24_link.js

+ 9 - 0
src/main/java/com/style24/front/biz/dao/TsfCounselDao.java

@@ -119,6 +119,15 @@ public interface TsfCounselDao {
 	 * @since 2020. 12. 28
 	 */
 	Collection<Counsel> getGoodsQnaList(Counsel counsel);
+	
+	/**
+	 * 상품문의 목록 - 상품상세용
+	 * @param counsel -상담정보
+	 * @return
+	 * @author eskim
+	 * @since 2021. 03. 05
+	 */
+	Collection<Counsel> getGoodsQnaListForGoods(Counsel counsel);
 
 	/**
 	 * 상품문의 삭제

+ 33 - 13
src/main/java/com/style24/front/biz/dao/TsfGoodsDao.java

@@ -5,15 +5,16 @@ import java.util.Collection;
 import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.CardPromotion;
 import com.style24.persistence.domain.Cate4Srch;
+import com.style24.persistence.domain.Delivery;
 import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.GoodsCompose;
 import com.style24.persistence.domain.GoodsDesc;
 import com.style24.persistence.domain.GoodsImg;
 import com.style24.persistence.domain.GoodsNotiInfo;
+import com.style24.persistence.domain.GoodsSafeNo;
 import com.style24.persistence.domain.GoodsStock;
 import com.style24.persistence.domain.GoodsViewHst;
-import com.style24.persistence.domain.Lookbook;
-import com.style24.persistence.domain.LookbookGoods;
+import com.style24.persistence.domain.Notice;
 import com.style24.persistence.domain.VideoDisploc;
 
 /**
@@ -53,7 +54,7 @@ public interface TsfGoodsDao {
 	 * @author eskim
 	 * @date 2021. 2. 9
 	 */
-	Collection<GoodsImg> getGoodsImgList(String goodsCd);
+	Collection<GoodsImg> getGoodsImgList(Goods goods);
 
 	/**
 	 * 상품 동영상정보
@@ -112,7 +113,6 @@ public interface TsfGoodsDao {
 	 */
 	Collection<GoodsStock> getGoodsOption1List(Goods goods);
 
-
 	/**
 	 * 상품 옵션2 목록
 	 *
@@ -172,25 +172,45 @@ public interface TsfGoodsDao {
 	 * @date 2021. 2. 17
 	 */
 	Goods getGoodsResSell(Goods goods);
-	
+
+	/**
+	 * 상품 사이즈 선택 시 재고수량 가져오기
+	 *
+	 * @param goodsStock
+	 * @return
+	 * @author eskim
+	 * @since 2021. 3. 3
+	 */
+	int getGoodsStockQty(GoodsStock goodsStock);
+
 	/**
-	 * 룩북 베너 목록
+	 * 상품  공지 목록
 	 *
-	 * @param lookbook
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @date 2021. 3. 7
+	 */
+	Collection<Notice> getGoodsNoticeList(Goods goods);
+
+	/**
+	 * 상품  안전인증 정보
+	 *
+	 * @param goodsStock
 	 * @return
 	 * @author eskim
-	 * @date 2021. 2. 18
+	 * @since 2021. 3. 7
 	 */
-	Collection<Lookbook> getLookbookBannerList(Lookbook lookbook);
+	GoodsSafeNo getGoodsSafeNo(Goods goods);
 	
 	/**
-	 * 룩북 베너별 상품 목록
+	 * 상품  배송안내정보
 	 *
-	 * @param lookbook
+	 * @param goodsCd
 	 * @return
 	 * @author eskim
-	 * @date 2021. 2. 18
+	 * @since 2021. 03. 08
 	 */
-	Collection<LookbookGoods> getLookbookBannerGoodsList(Lookbook lookbook);
+	Delivery getGoodsDeliveryInfo(String goodsCd);
 
 }

+ 35 - 0
src/main/java/com/style24/front/biz/dao/TsfPlanningDao.java

@@ -1,6 +1,10 @@
 package com.style24.front.biz.dao;
 
+import java.util.Collection;
+
 import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Cate4Srch;
+import com.style24.persistence.domain.Plan;
 
 /**
  * 기획전 Dao
@@ -10,5 +14,36 @@ import com.style24.core.support.annotation.ShopDs;
  */
 @ShopDs
 public interface TsfPlanningDao {
+	
+	/**
+	 * 기획전 카테고리 1deth 조회
+	 * 
+	 * @param Cate4Srch
+	 * @return Collection<Cate4Srch>
+	 * @author sowon
+	 * @since 2021.03.05
+	 */
+	Collection<Cate4Srch> getPlanCate1(Cate4Srch Cate);
+	
+	/**
+	 * 기획전 갯수 조회
+	 * 
+	 * @param Plan
+	 * @return int
+	 * @author sowon
+	 * @since 2021.03.05
+	 */
+	int getPlanAllCount(Plan plan);
+	
+	/**
+	 * 기획전 목록
+	 *
+	 * @param
+	 * @return
+	 * @author sowon
+	 * @date 2021. 3. 8
+	 */
+	Collection<Plan> getPlanList(Plan plan);
+
 
 }

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

@@ -11,6 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.thymeleaf.util.StringUtils;
 
 import com.style24.core.biz.service.TscOrderService;
 import com.style24.core.support.env.TscConstants;
@@ -168,9 +169,9 @@ public class TsfCartService {
 		cart.setGoodsType(params.iterator().next().getGoodsType());
 		cart.setItemCdSql(sb.toString());
 
-		if ("C".equals(params.iterator().next().getCartGb())) {
+		if (!StringUtils.isEmpty(params.iterator().next().getCartGb()) && "C".equals(params.iterator().next().getCartGb())) {
 			cart.setCartGb(TscConstants.CartGb.CART.value());
-		} else if ("O".equals(params.iterator().next().getCartGb())) {
+		} else if (!StringUtils.isEmpty(params.iterator().next().getCartGb()) && "O".equals(params.iterator().next().getCartGb())) {
 			if ("P".equals(TsfSession.getFrontGb())) {
 				cart.setCartGb(TscConstants.CartGb.PC_ORDER.value());
 			} else {
@@ -840,8 +841,8 @@ public class TsfCartService {
 					cart.setCustNo(param.getCustNo());
 					cart.setRegNo(param.getRegNo());
 
-					cartDao.updateCartInfo(cart);               // 장바구니 정보 수정
-					cartDao.insertCartHst(cart);                // 장바구니 수정 이력 저장
+					cartDao.updateCartInfo(cart);				// 장바구니 정보 수정
+					cartDao.insertCartHst(cart);				// 장바구니 수정 이력 저장
 
 					// 장바구니 삭제
 					int[] cartSqArr = {param.getCartSq()};
@@ -851,16 +852,19 @@ public class TsfCartService {
 				}
 			} else {		// 동일 상품 없을 시 UPDATE
 				cartDao.updateCart(param);						// 장바구니 마스터 정보 저장
-				cartDao.insertCartHst(param);                   // 장바구니 이력 정보 저장
+				cartDao.insertCartHst(param);					// 장바구니 이력 정보 저장
 				for(int i = 0 ; i < param.getCartDtlSqArr().length ; i++) {
 					param.setItemCd(param.getItemCds()[i]);
 					param.setCartDtlSq(param.getCartDtlSqArr()[i]);
 					param.setOptCd(param.getOptCds()[i]);
 
 					cartDao.updateCartDetail(param);		// 장바구니 상세 저장
-					cartDao.insertCartDetailHst(param);         // 장바구니 상세 이력 저장
+					cartDao.insertCartDetailHst(param);		// 장바구니 상세 이력 저장
 				}
 			}
+		} else {
+			// TODO 세트가 아닐 경우 처리
+			int a = 0;
 		}
 	}
 }

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

@@ -2,6 +2,7 @@ package com.style24.front.biz.service;
 
 import java.util.Collection;
 
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -13,6 +14,8 @@ import com.style24.persistence.domain.Counsel;
 
 import lombok.extern.slf4j.Slf4j;
 
+import com.gagaframework.web.util.GagaStringUtil;
+
 /**
  * 상담(1:1문의) Service
  *
@@ -37,7 +40,19 @@ public class TsfCounselService {
 	public void createOneToOneQna(Counsel counsel) {
 		counsel.setSiteCd(TscConstants.Site.STYLE24.value());
 		counsel.setCustNo(TsfSession.getInfo().getCustNo());
+		counsel.setCellPhnno(TsfSession.getInfo().getCellPhnno());
 		counsel.setEmail(TsfSession.getInfo().getEmail());
+
+		if (StringUtils.isNotBlank(counsel.getFile1SysFileNm())) {
+			counsel.setOrgFileNm1(counsel.getFile1OrgFileNm());
+			counsel.setSysFileNm1(counsel.getFile1SysFileNm());
+		}
+
+		if (StringUtils.isNotBlank(counsel.getFile2SysFileNm())) {
+			counsel.setOrgFileNm2(counsel.getFile2OrgFileNm());
+			counsel.setSysFileNm2(counsel.getFile2SysFileNm());
+		}
+
 		counsel.setRegNo(TsfSession.getInfo().getCustNo());
 		counsel.setUpdNo(TsfSession.getInfo().getCustNo());
 		counselDao.createOneToOneQna(counsel);
@@ -75,7 +90,13 @@ public class TsfCounselService {
 	 * @since 2020. 12. 28
 	 */
 	public Collection<Counsel> getOneToOneQnaList(Counsel counsel) {
-		return counselDao.getOneToOneQnaList(counsel);
+		Collection<Counsel> counselList = counselDao.getOneToOneQnaList(counsel);
+		for (Counsel item : counselList) {
+			item.setQuestContent(GagaStringUtil.replace(item.getQuestContent(), "\r\n", "<br/>"));
+			item.setAnsContent(GagaStringUtil.replace(item.getAnsContent(), "\r\n", "<br/>"));
+		}
+
+		return counselList;
 	}
 
 	/**
@@ -152,6 +173,7 @@ public class TsfCounselService {
 	public void createGoodsQna(Counsel counsel) {
 		counsel.setSiteCd(TscConstants.Site.STYLE24.value());
 		counsel.setCustNo(TsfSession.getInfo().getCustNo());
+		counsel.setCellPhnno(TsfSession.getInfo().getCellPhnno());
 		counsel.setEmail(TsfSession.getInfo().getEmail());
 		counsel.setRegNo(TsfSession.getInfo().getCustNo());
 		counsel.setUpdNo(TsfSession.getInfo().getCustNo());
@@ -190,7 +212,24 @@ public class TsfCounselService {
 	 * @since 2020. 12. 24
 	 */
 	public Collection<Counsel> getGoodsQnaList(Counsel counsel) {
-		return counselDao.getGoodsQnaList(counsel);
+		Collection<Counsel> counselList = counselDao.getGoodsQnaList(counsel);
+		for (Counsel item : counselList) {
+			item.setQuestContent(GagaStringUtil.replace(item.getQuestContent(), "\r\n", "<br/>"));
+			item.setAnsContent(GagaStringUtil.replace(item.getAnsContent(), "\r\n", "<br/>"));
+		}
+
+		return counselList;
+	}
+
+	/**
+	 * 상품문의 목록 - 상품상세용
+	 * @param counsel -상담정보
+	 * @return
+	 * @author eskim
+	 * @since 2021. 03. 05
+	 */
+	public Collection<Counsel> getGoodsQnaListForGoods(Counsel counsel) {
+		return counselDao.getGoodsQnaListForGoods(counsel);
 	}
 
 	/**

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

@@ -109,7 +109,7 @@ public class TsfCustomerService {
 	 */
 	@Transactional("shopTxnManager")
 	public void saveCustomerPassword(Customer customer) {
-		customer.setEncodedPasswd(passwordEncoder.encode(customer.getPasswd()));
+		customer.setEncodedPasswd(passwordEncoder.encodeSha256(customer.getPasswd()));
 		coreCustomerService.saveCustomerPassword(customer);
 	}
 
@@ -278,7 +278,7 @@ public class TsfCustomerService {
 		// 1. validation
 		customer.setHypenCellPhone();
 		customer.encryptData();
-		customer.setEncodedPasswd(passwordEncoder.encode(customer.getPasswd()));
+		customer.setEncodedPasswd(passwordEncoder.encodeSha256(customer.getPasswd()));
 
 		customer.setCustStat(TscConstants.CustStat.ACTIVE.value());
 		customer.setCustGb(TscConstants.CustGb.NORMAL.value());

+ 59 - 22
src/main/java/com/style24/front/biz/service/TsfGoodsService.java

@@ -12,14 +12,16 @@ import com.style24.front.biz.dao.TsfGoodsDao;
 import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.domain.CardPromotion;
 import com.style24.persistence.domain.Cate4Srch;
+import com.style24.persistence.domain.Delivery;
 import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.GoodsCompose;
 import com.style24.persistence.domain.GoodsDesc;
 import com.style24.persistence.domain.GoodsImg;
 import com.style24.persistence.domain.GoodsNotiInfo;
+import com.style24.persistence.domain.GoodsSafeNo;
 import com.style24.persistence.domain.GoodsStock;
 import com.style24.persistence.domain.GoodsViewHst;
-import com.style24.persistence.domain.Lookbook;
+import com.style24.persistence.domain.Notice;
 import com.style24.persistence.domain.VideoDisploc;
 
 import lombok.extern.slf4j.Slf4j;
@@ -60,7 +62,7 @@ public class TsfGoodsService {
 			byte[] referBytes = referer.getBytes();
 			if (referBytes.length > 1000) {
 				goodsViewHst.setReferer(new String(referBytes, 0, 1000));
-			}else {
+			} else {
 				goodsViewHst.setReferer(referer);
 			}
 		}
@@ -87,7 +89,7 @@ public class TsfGoodsService {
 	 * 상품 정보 조회
 	 * @param goods
 	 * @return
-	 * @author xodud1202
+	 * @author eskim
 	 * @since 2021. 01. 28
 	 */
 	public Goods getGoodsInfo(Goods goods) {
@@ -172,7 +174,6 @@ public class TsfGoodsService {
 		return goodsDesc.toString();
 	}
 
-
 	/**
 	 * 상품 이미지 정보
 	 *
@@ -181,9 +182,8 @@ public class TsfGoodsService {
 	 * @author eskim
 	 * @since 2021. 2. 9
 	 */
-	public Collection<GoodsImg> getGoodsImgList(String goodsCd) {
-		log.info("aa\\ {}  ", goodsDao.getGoodsImgList(goodsCd));
-		return goodsDao.getGoodsImgList(goodsCd);
+	public Collection<GoodsImg> getGoodsImgList(Goods goods) {
+		return goodsDao.getGoodsImgList(goods);
 	}
 
 	/**
@@ -238,11 +238,11 @@ public class TsfGoodsService {
 		goodsInfo.setGoodsCd(param.getGoodsCd());
 		goodsInfo = getGoodsInfo(goodsInfo);
 
-		if(TscConstants.GoodsStat.SOLDOUT.value().equals(goodsInfo.getGoodsStat())) {
+		if (TscConstants.GoodsStat.SOLDOUT.value().equals(goodsInfo.getGoodsStat())) {
 			return param.getGoodsCd() + "는 품절 상품입니다.";
 		}
 
-		if(param.getGoodsType().equals(TscConstants.GoodsType.SET.value())) {		// 세트상품이면 구성 상품코드로 조회
+		if (param.getGoodsType().equals(TscConstants.GoodsType.SET.value())) {		// 세트상품이면 구성 상품코드로 조회
 			GoodsStock stockCheck = new GoodsStock();								// 재고 조회 결과
 			stockCheck.setGoodsCd(param.getItemCd());
 			stockCheck.setOptCd(param.getOptCd());
@@ -257,7 +257,7 @@ public class TsfGoodsService {
 			compsInfo = goodsDao.getGoodsCompsInfo(compsInfo);						// 구성상품 정보 조회
 
 			// 재고 체크
-			if(param.getGoodsQty() * compsInfo.getQty() > stockCheck.getCurrStockQty()) {
+			if (param.getGoodsQty() * compsInfo.getQty() > stockCheck.getCurrStockQty()) {
 				return param.getItemCd() + "의 재고가 충분하지 않습니다.";
 			}
 		} else {
@@ -267,7 +267,7 @@ public class TsfGoodsService {
 
 			stockCheck = goodsDao.getGoodsStockInfo(stockCheck);					// 구성 상품 재고 조회
 
-			if(param.getGoodsQty() > stockCheck.getCurrStockQty()) {
+			if (param.getGoodsQty() > stockCheck.getCurrStockQty()) {
 				return param.getGoodsCd() + "의 재고가 충분하지 않습니다.";
 			}
 		}
@@ -366,22 +366,59 @@ public class TsfGoodsService {
 	}
 
 	/**
-	 * 룩북
+	 * 상품 사이즈 선택 시 재고수량 가져오기
 	 *
-	 * @param lookbook
+	 * @param goods
 	 * @return
 	 * @author eskim
-	 * @since 2021. 2. 18
+	 * @since 2020. 7. 9
 	 */
-	public Collection<Lookbook> getLookbookList(Lookbook lookbook) {
-		Collection<Lookbook> lookbookBannerList = goodsDao.getLookbookBannerList(lookbook);
-		
-		for (Lookbook tempLookbook : lookbookBannerList) {
-			tempLookbook.setLookbookGoodsList(goodsDao.getLookbookBannerGoodsList(tempLookbook));
-		}
-		
-		return lookbookBannerList;
+	public int getGoodsStockQty(GoodsStock goodsStock) {
+		int result = 0;
+		// 예약상품 여부 확인
+		//int goodsResSellCount = goodsDao.getGoodsResSellCount(stock.getGoodsCd());
+
+		//if ("N".equals(stock.getSelfGoodsYn()) || goodsResSellCount > 0) {
+		result = goodsDao.getGoodsStockQty(goodsStock);
+		//} else {
+		//	result = goodsDao.getGoodsStoreStockQty(stock);
+		//}
+
+		return result;
 	}
 
+	/**
+	 * 상품  공지 목록
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2021. 03. 07
+	 */
+	public Collection<Notice> getGoodsNoticeList(Goods goods) {
+		return goodsDao.getGoodsNoticeList(goods);
+	}
 
+	/**
+	 * 상품  안전인증 정보
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2021. 03. 07
+	 */
+	public GoodsSafeNo getGoodsSafeNo(Goods goods) {
+		return goodsDao.getGoodsSafeNo(goods);
+	}
+	
+	/**
+	 * 상품  배송안내정보
+	 * @param goodsCd
+	 * @return
+	 * @author eskim
+	 * @since 2021. 03. 08
+	 */
+	public Delivery getGoodsDeliveryInfo(String goodsCd) {
+		return goodsDao.getGoodsDeliveryInfo(goodsCd);
+	}
+	
+	
 }

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

@@ -13,6 +13,7 @@ import javax.servlet.http.HttpServletResponse;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.thymeleaf.util.StringUtils;
 
 import com.gagaframework.web.parameter.GagaMap;
 import com.style24.core.biz.service.TscKcpService;
@@ -214,12 +215,35 @@ public class TsfOrderService {
 		return mapList;
 	}
 
-	public void kcpTest(Payment param, HttpServletRequest request, HttpServletResponse response) {
+	/**
+	 * PG 결제승인
+	 * @param param - 필수 : payGb(결제수단 : KCP, KAKAO 등), payMeans(결제수단 : G014_30(신용카드) 등), cashReceiptYn(현금영수증여부)
+	 * @param request
+	 * @param response
+	 * @return
+	 */
+	public Payment orderPgPayResult(Payment param, HttpServletRequest request, HttpServletResponse response) {
+		Payment result = new Payment();
 		try {
-			coreKcpService.kcpPayRequest(param, request, response);
+			if(StringUtils.isEmpty(param.getPayGb())) {
+				throw new IllegalArgumentException("결제수단을 선택해주세요.");
+			}
+
+			if("KCP".equals(param.getPayGb())) {
+				result = coreKcpService.kcpPayRequest(param, request, response);
+			} else if ("PAYCO".equals(param.getPayGb())) {
+				result = null;
+			} else if ("KAKAO".equals(param.getPayGb())) {
+				result = null;
+			} else if ("NAVER".equals(param.getPayGb())) {
+				result = null;
+			}
 		} catch(Exception e) {
 			e.printStackTrace();
+			throw new IllegalArgumentException(e.getMessage());
 		}
+
+		return result;
 	}
 
 	/**

+ 41 - 0
src/main/java/com/style24/front/biz/service/TsfPlanningService.java

@@ -1,9 +1,15 @@
 package com.style24.front.biz.service;
 
+import java.util.Collection;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import com.style24.front.biz.dao.TsfPlanningDao;
+import com.style24.front.support.env.TsfConstants;
+import com.style24.persistence.domain.Cate4Srch;
+import com.style24.persistence.domain.Plan;
+import com.style24.persistence.domain.Point;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -19,5 +25,40 @@ public class TsfPlanningService {
 
 	@Autowired
 	private TsfPlanningDao planningDao;
+	
+	/**
+	 * 기획전 카테고리 1deth 조회
+	 *
+	 * @param Cate4Srch
+	 * @author sowon
+	 * @since 2021. 03. 05
+	 */	
+	public Collection<Cate4Srch> getPlanCate1(Cate4Srch cate) {
+		return planningDao.getPlanCate1(cate);
+	}
+	
+	/**
+	 * 기획전 갯수 조회
+	 * 
+	 * @param Plan
+	 * @author sowon
+	 * @since 2021.03.05
+	 */
+	public int getPlanAllCount(Plan plan) {
+		return planningDao.getPlanAllCount(plan);
+	}
+	
+	/**
+	 * 기획전 목록
+	 *
+	 * @param
+	 * @return
+	 * @author sowon
+	 * @since 2021. 3. 8
+	 */
+	public Collection<Plan> getPlanList(Plan plan) {
+		//plan.setSiteCd(TsfConstants.SITE_CD);
+		return planningDao.getPlanList(plan);
+	}
 
 }

+ 2 - 1
src/main/java/com/style24/front/biz/thirdparty/Yes24Login.java

@@ -36,10 +36,11 @@ public class Yes24Login {
 	 */
 	public String getAuthorizeUrl(String state) {
 		String authorizeUrl = "https://www.yes24.com/Templates/FTLogin.aspx";
+		String authorizeUrl2 = "https://www.yes24.com/Templates/FTLoginPartner.aspx";
 		String callBackUrl = "/signin/snsLoginCallback?snsType=YS";
 		StringBuilder apiUrlBuilder = new StringBuilder();
 		String redirectUri = GagaFileUtil.getConcatenationPath(PROTOCOL + TsfSession.getHttpServletRequest().getServerName(), callBackUrl);
-		apiUrlBuilder.append(authorizeUrl)
+		apiUrlBuilder.append(authorizeUrl2)
 				.append("?PID=101582")
 				.append("&ReturnURL=")
 				.append(redirectUri);

+ 1 - 0
src/main/java/com/style24/front/biz/web/TsfCallcenterController.java

@@ -316,6 +316,7 @@ public class TsfCallcenterController extends TsfBaseController {
 	@PostMapping("/goods/qna/create")
 	@ResponseBody
 	public GagaResponse createGoodsQna(@RequestBody Counsel counsel) {
+		log.info("createGoodsQna counsel = {}", counsel);
 		counselService.createGoodsQna(counsel);
 		return super.ok(message.getMessage("SUCC_0001"));
 	}

+ 6 - 2
src/main/java/com/style24/front/biz/web/TsfCartController.java

@@ -4,6 +4,9 @@ import java.text.SimpleDateFormat;
 import java.util.Collection;
 import java.util.Date;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
 import com.gagaframework.web.rest.server.GagaResponse;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
@@ -15,6 +18,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
+import org.thymeleaf.util.StringUtils;
 
 import com.gagaframework.web.parameter.GagaMap;
 import com.style24.core.biz.service.TscOrderService;
@@ -27,12 +31,13 @@ import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.domain.Cart;
 import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.Order;
+import com.style24.persistence.domain.Payment;
 
 import lombok.extern.slf4j.Slf4j;
 
 /**
  * 장바구니 Controller
- * 
+ *
  * @author gagamel
  * @since 2020. 12. 29
  */
@@ -201,7 +206,6 @@ public class TsfCartController extends TsfBaseController {
 	@ResponseBody
 	@PostMapping("/change/option")
 	public GagaResponse updateCartOption(@RequestBody Cart param) {
-		log.info("CHECK INFO >> {} / {} / {} / {}", param.getCartSq(), param.getCartDtlSqArr().toString(), param.getOptCds().toString(), param.getGoodsQty());
 		cartService.updateCartOption(param);
 		return super.ok(message.getMessage("SUCC_0001"));
 	}

+ 19 - 8
src/main/java/com/style24/front/biz/web/TsfCustomerController.java

@@ -382,7 +382,7 @@ public class TsfCustomerController extends TsfBaseController {
 		ModelAndView mav = new ModelAndView();
 		GagaMap result = niceCertify.certifyCellPhone();
 
-		if (TscConstants.FrontGb.MOBIEL.value().equals(TsfSession.getFrontGb())) {
+		if (TscConstants.FrontGb.MOB.value().equals(TsfSession.getFrontGb())) {
 			mav.addObject("redirectUrl", redirectUrl); // 모바일만 사용
 		}
 
@@ -404,7 +404,7 @@ public class TsfCustomerController extends TsfBaseController {
 		ModelAndView mav = new ModelAndView();
 		GagaMap result = niceCertify.certifyIpin();
 
-		if (TscConstants.FrontGb.MOBIEL.value().equals(TsfSession.getFrontGb())) {
+		if (TscConstants.FrontGb.MOB.value().equals(TsfSession.getFrontGb())) {
 			mav.addObject("redirectUrl", redirectUrl); // 모바일만 사용
 		}
 
@@ -439,7 +439,7 @@ public class TsfCustomerController extends TsfBaseController {
 			authMethod = TscConstants.AuthMethod.IPIN.value();
 		}
 
-		if (TscConstants.FrontGb.MOBIEL.value().equals(TsfSession.getFrontGb())) {
+		if (TscConstants.FrontGb.MOB.value().equals(TsfSession.getFrontGb())) {
 			mav.addObject("redirectUrl", redirectUrl);
 		}
 
@@ -542,21 +542,32 @@ public class TsfCustomerController extends TsfBaseController {
 		GagaMap authInfo = niceCertify.getCertifyCellPhoneResultInfo(customer);
 		customer.setCi(authInfo.getString("sCi"));
 		customer.setCellPhnno(authInfo.getString("sMobileNo"));
-		//customer.setCellPhnno("01025906246");
+
 
 		if ("N".equals(authInfo.getString("adult"))) {
 			throw new IllegalStateException("만14세 이상만 회원가입이 가능합니다.");
 		}
 
-		Customer custInfo = customerService.getCustomerFindByCi(customer.getCi());
+		Customer custInfo;
+		custInfo = customerService.getCustomerFindByCi(customer.getCi());	// CI 중복체크
 		if (custInfo != null) {
 			result.setString("maskingCustId", custInfo.getMaskingCustId());
 			result.setBoolean("isFind", true);
-		} else {
-			result.setBoolean("isFind", false);
-			TscSession.setAttribute("encData",customer.getEncData());
+			return result;
+		}
+
+		custInfo = customerService.getCustomerFindByCellPhnno(customer.getCellPhnno());	// 휴대전화 중복체크
+		if (custInfo != null) {
+			result.setString("maskingCustId", custInfo.getMaskingCustId());
+			result.setBoolean("isFind", true);
+			return result;
 		}
 
+		result.setBoolean("isFind", false);
+		result.setString("cellPhnno", customer.getCellPhnno());
+
+		TscSession.setAttribute("encData",customer.getEncData());
+
 		return result;
 	}
 

+ 158 - 16
src/main/java/com/style24/front/biz/web/TsfGoodsController.java

@@ -5,23 +5,32 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 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;
+import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
 import com.style24.core.biz.service.TscEnvsetService;
+import com.style24.core.biz.service.TscLookbookService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.front.biz.service.TsfCounselService;
 import com.style24.front.biz.service.TsfGoodsService;
 import com.style24.front.support.controller.TsfBaseController;
 import com.style24.front.support.env.TsfConstants;
 import com.style24.front.support.security.session.TsfSession;
+import com.style24.persistence.TscPageRequest;
 import com.style24.persistence.domain.CardPromotion;
+import com.style24.persistence.domain.Counsel;
 import com.style24.persistence.domain.Goods;
+import com.style24.persistence.domain.GoodsStock;
 import com.style24.persistence.domain.Lookbook;
 
 import lombok.extern.slf4j.Slf4j;
 
+import com.gagaframework.web.parameter.GagaMap;
 import com.gagaframework.web.util.GagaCookieUtil;
 
 /**
@@ -44,10 +53,15 @@ public class TsfGoodsController extends TsfBaseController {
 	@Autowired
 	private TscEnvsetService envsetService;
 
+	@Autowired
+	private TsfCounselService counselService;
+
+	@Autowired
+	private TscLookbookService coreLookbookService;
+
 	@Value("${has-ssl}")
 	private String hasSsl;
 
-
 	/**
 	 * 상품상세
 	 *
@@ -79,6 +93,10 @@ public class TsfGoodsController extends TsfBaseController {
 		}
 
 		Goods goods = goodsService.getGoodsInfo(paramsGoods);
+		// 조회색상이 없으면 메인컬러 설정
+		if (StringUtils.isEmpty(paramsGoods.getColorCd())) {
+			paramsGoods.setColorCd(goods.getMainColorCd());
+		}
 
 		if (goods == null || goods.getGoodsCd().isEmpty()) {
 			if (StringUtils.isBlank(afLinkCd)) {
@@ -91,6 +109,7 @@ public class TsfGoodsController extends TsfBaseController {
 
 		// 상품 상세
 		goods = goodsService.getGoodsDesc(goods);
+
 		// 핫딜정보
 		Goods socialGoods = goodsService.getSocialGoods(paramsGoods);
 		if (socialGoods != null && !StringUtils.isBlank(socialGoods.getGoodsCd())) {
@@ -108,30 +127,51 @@ public class TsfGoodsController extends TsfBaseController {
 		paramsGoods.setCateGb("G032_101"); 		//by item
 		mav.addObject("goodsNavigation", goodsService.getGoodsNavigation(paramsGoods));
 		// 상품 이미지정보
-		mav.addObject("goodsImgList", goodsService.getGoodsImgList(paramsGoods.getGoodsCd()));
+		mav.addObject("goodsImgList", goodsService.getGoodsImgList(paramsGoods));
 		// 상품 동영상정보
 		mav.addObject("goodsVideoList", goodsService.getVideoList(paramsGoods.getGoodsCd()));
+		// 상품 공지
+		mav.addObject("goodsNoticeList", goodsService.getGoodsNoticeList(paramsGoods));
 
-		if ("D".equals(goods.getGoodsType())) {	// 딜상품
+		if ("G056_D".equals(goods.getGoodsType())) {	// 딜상품
 			// 딜 구성상품 정보
 			paramsGoods.setGoodsComposeSearchYn("Y");
 			mav.addObject("goodsExtendList", goodsService.getGoodsDealComposeList(paramsGoods));
 		} else {
-			if ("N".equals(goods.getGoodsType())) {	// 일반상품
-				// 상품 옵션1(색상) 정보
-				mav.addObject("goodsOption1List", goodsService.getGoodsOption1List(paramsGoods));
-				// 상품 옵션2(사이즈) 정보
-				mav.addObject("goodsOption2List", goodsService.getGoodsOption2List(paramsGoods));
+			if ("G056_N".equals(goods.getGoodsType())) {	// 일반상품
+				if ("Y".equals(goods.getSelfGoodsYn())) {  // 자사상품
+					// 상품 옵션1(색상) 정보
+					mav.addObject("goodsOption1List", goodsService.getGoodsOption1List(paramsGoods));
+					// 상품 옵션2(사이즈) 정보
+					mav.addObject("goodsOption2List", goodsService.getGoodsOption2List(paramsGoods));
+				} else {
+					//mav.addObject("goodsOptionList", goodsService.getGoodsOptionList(paramsGoods));
+				}
 
 //				// 상품 고시정보
 				mav.addObject("goodsNotiList", goodsService.getGoodsNotiList(goods));
 
-			} else if ("S".equals(goods.getGoodsType())) {		// 셋트상품
+				// 상품 안전인증 정보
+				mav.addObject("goodsSafeNo", goodsService.getGoodsSafeNo(goods));
+
+				// 룩북
+				Lookbook lookbook = new Lookbook();
+				lookbook.setGoodsCd(paramsGoods.getGoodsCd());
+				mav.addObject("lookbookList", coreLookbookService.getLookbookListForGoods(lookbook));
+
+			} else if ("G056_S".equals(goods.getGoodsType())) {		// 셋트상품
 //				mav.addObject("goodsExtendList", goodsService.getGoodsSetExtendList(paramsGoods));
 			}
 			// 상품쿠폰
 //			mav.addObject("goodsCouponList", goodsService.getGoodsCouponList(paramsGoods));
 		}
+
+		// 상품 문의건수
+		Counsel counsel = new Counsel();
+		counsel.setRelGoodsCd(goods.getGoodsCd());
+		counsel.setSiteCd(TscConstants.Site.STYLE24.value());
+		int goodsQnaCnt = counselService.getGoodsQnaTotalCount(counsel);
+		mav.addObject("goodsQnaCnt", goodsQnaCnt);
 //
 //		// 상품포인트사용방법
 //		mav.addObject("goodsPointMothod", envsetService.getPointMothod(TscConstants.Site.STYLE24.value())); // A:정액, R:정율
@@ -152,10 +192,6 @@ public class TsfGoodsController extends TsfBaseController {
 
 		// 사은품
 
-		// 룩북
-		Lookbook lookbook = new Lookbook();
-		lookbook.setGoodsCd(paramsGoods.getGoodsCd());
-		mav.addObject("lookbookList", goodsService.getLookbookList(lookbook));
 		// 오늘본 상품 쿠키 담기
 		// SSL Server
 		boolean isSslServer = Boolean.parseBoolean(hasSsl);
@@ -194,6 +230,7 @@ public class TsfGoodsController extends TsfBaseController {
 		goods.setFrontGb(TsfSession.getFrontGb());
 		goods.setIsApp(TsfSession.getAttribute("isApp"));	//앱여부 true
 		goods.setSiteCd(TscConstants.Site.STYLE24.value());
+		goods.setAfLinkCd(TsfSession.getAttribute("afLinkCd"));
 //		goods.setSoldoutGoodsDisplayYn(envsetService.getSoldoutGoodsDisplayYn(TscConstants.Site.STYLE24.value())); // 품절상품노출여부
 //		goods.setPointUnit(envsetService.getPointUnit(TscConstants.Site.STYLE24.value())); // 10:원단위절사(int)
 //		goods.setFloorUnit(envsetService.getPointUnit(TscConstants.Site.STYLE24.value()));
@@ -203,9 +240,9 @@ public class TsfGoodsController extends TsfBaseController {
 			goods.setCustNo(TsfSession.getInfo().getCustNo());
 			goods.setCustGrade(TsfSession.getInfo().getCustGrade());
 		} else {
-			goods.setCustGb("00");
+			goods.setCustGb("G100_00");
 			goods.setCustNo(0);
-			goods.setCustGrade("00");
+			goods.setCustGrade("00"); //?  확인해보자
 		}
 	}
 
@@ -255,7 +292,7 @@ public class TsfGoodsController extends TsfBaseController {
 		GagaCookieUtil.setCookie(TsfSession.getHttpServletResponse(), TsfConstants.CK_PREFIX + "_today_goodsCd", setCkGoodsCd, 24 * 60 * 60);
 		//		}
 	}
-	
+
 	/**
 	 * 상품상세 -  카드혜택안내 레이어
 	 * @return
@@ -270,4 +307,109 @@ public class TsfGoodsController extends TsfBaseController {
 		mav.setViewName(super.getDeviceViewName("goods/CardPrmtForm"));
 		return mav;
 	}
+
+	/**
+	 * 상품 사이즈 선택 시 재고수량 가져오기
+	 * 
+	 * @return
+	 * @author eskim
+	 * @since 2021. 3. 4
+	 */
+	@GetMapping("/detail/ajaxGoodsStockQty")
+	@ResponseBody
+	public int getAjaxGoodsStockQty(GoodsStock goodsStock) {
+		int stockQty = 0;
+		stockQty = goodsService.getGoodsStockQty(goodsStock);
+		return stockQty;
+	}
+
+	/**
+	 * 상품상세 -  상품 QNA LIST 레이어
+	 * @return
+	 * @author eskim
+	 * @since 2021. 3. 5
+	 */
+	@PostMapping("/qna/layer/{goodsCd}")
+	public ModelAndView goodsQnaForm(@PathVariable String goodsCd) {
+		ModelAndView mav = new ModelAndView();
+		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
+		Goods paramsGoods = new Goods();
+		paramsGoods.setGoodsCd(goodsCd);
+		setGoods(paramsGoods);
+		Goods goods = goodsService.getGoodsInfo(paramsGoods);
+		// 상품 기본정보
+		mav.addObject("goodsInfo", goods);
+
+		mav.setViewName(super.getDeviceViewName("goods/GoodsQnaForm"));
+		return mav;
+	}
+
+	/**
+	 * 상품문의 목록
+	 * @param counsel - 상담정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 28
+	 */
+	@PostMapping("/qna/list")
+	@ResponseBody
+	public GagaMap getGoodsQnaList(@RequestBody Counsel counsel) {
+
+		log.info(" getGoodsQnaList =>{}", counsel);
+		counsel.setSiteCd(TscConstants.Site.STYLE24.value());
+
+		GagaMap result = new GagaMap();
+
+		TscPageRequest pageable = new TscPageRequest((counsel.getPageNo() > 0 ? counsel.getPageNo() - 1 : 0), counsel.getPageSize(), counsel.getPageUnit());
+		pageable.setTotalCount(counselService.getGoodsQnaTotalCount(counsel));
+		counsel.setPageable(pageable);
+
+		if (TsfSession.isLogin()) {
+			counsel.setCustNo(TsfSession.getInfo().getCustNo());
+		}
+
+		result.set("paging", counsel);
+		result.set("dataList", counselService.getGoodsQnaListForGoods(counsel));
+
+		return result;
+	}
+
+	/**
+	 * 상품상세 -  상품 QNA 등록
+	 * @return
+	 * @author eskim
+	 * @since 2021. 3. 5
+	 */
+	@PostMapping("/qna/create/layer/{goodsCd}")
+	public ModelAndView qnaCreateForm(@PathVariable String goodsCd) {
+		ModelAndView mav = new ModelAndView();
+		mav.addObject("goodsCd", goodsCd);
+		mav.setViewName(super.getDeviceViewName("goods/GoodsQnaDetailForm"));
+		return mav;
+	}
+
+	/**
+	 * 상품상세 -  배송안내 레이어
+	 * @return
+	 * @author eskim
+	 * @since 2021. 3. 8
+	 */
+	@PostMapping("/delivery/layer/{goodsCd}")
+	public ModelAndView goodsDeliveryForm(@PathVariable String goodsCd) {
+		ModelAndView mav = new ModelAndView();
+		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
+		Goods paramsGoods = new Goods();
+		paramsGoods.setGoodsCd(goodsCd);
+		setGoods(paramsGoods);
+		Goods goods = goodsService.getGoodsInfo(paramsGoods);
+		
+		// 배송업체명, 반품비, 교환비, 주소
+		mav.addObject("deliveryInfo", goodsService.getGoodsDeliveryInfo(goodsCd));
+		
+		// 상품 기본정보
+		mav.addObject("goodsInfo", goods);
+
+		mav.setViewName(super.getDeviceViewName("goods/GoodsDeliveryForm"));
+		return mav;
+	}
 }

+ 664 - 80
src/main/java/com/style24/front/biz/web/TsfOrderController.java

@@ -1,27 +1,36 @@
 package com.style24.front.biz.web;
 
+import java.util.ArrayList;
 import java.util.Collection;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+import org.thymeleaf.util.StringUtils;
 
 import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.rest.server.GagaResponseStatus;
 import com.style24.core.biz.service.TscFreegiftService;
 import com.style24.core.biz.service.TscKakaoPayService;
+import com.style24.core.biz.service.TscNaverPayService;
 import com.style24.core.biz.service.TscOrderService;
+import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.front.biz.service.TsfCartService;
 import com.style24.front.biz.service.TsfOrderService;
 import com.style24.front.support.controller.TsfBaseController;
 import com.style24.front.support.security.session.TsfSession;
+import com.style24.persistence.domain.KakaoPay;
 import com.style24.persistence.domain.Order;
 import com.style24.persistence.domain.Payment;
 
@@ -46,15 +55,21 @@ public class TsfOrderController extends TsfBaseController {
 
 	@Autowired
 	private TsfOrderService orderService;
-	
+
 	@Autowired
 	private TscFreegiftService coreFreegiftService;
-	
+
 	@Autowired
 	private TsfCartService cartService;
-	
+
 	@Autowired
 	private TscKakaoPayService kakaoPayService;
+
+	@Autowired
+	private TscNaverPayService naverPayService;
+
+	@Autowired
+	private Environment env;
 	
 	/**
 	 * 회원, 비회원 주문페이지
@@ -89,6 +104,8 @@ public class TsfOrderController extends TsfBaseController {
 		return mav;
 	}
 	
+	
+	
 	/**
 	 * 주문페이지
 	 *
@@ -105,58 +122,31 @@ public class TsfOrderController extends TsfBaseController {
 		// TODO
 		// 1.비회주문, 회원 주문 판단 로직,  고객정보 세션 판단
 		// 세션고객정보가 존재하면 회원주문 없으면 비회원 주문
-		
-		// 임시 jsessionId
-		String jsessionId 	= "aaec62cc-5f91-47bb-ba65-ebc9a61385cf";
-		Boolean noMember 	= true;
 
-		// TODO 로그인체크 로직 추가
-		// 1.0 회원, 비회원 여부 판단
-		if (TsfSession.getInfo().getCustNo() == null) {
-			order.setJsessionId(jsessionId);
-		} else {
-			noMember = false;
+		// 1. 로그인체크 후 custNo 설정
+		if (TsfSession.isLogin()) {
 			order.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
+		} else {
+			order.setJsessionId(TsfSession.getSessionId());
 		}
 		
 		// TODO
-		// 1.1 카트시퀀스가 없을때 처리 장바구니로 이동 
+		// 1.1 카트시퀀스가 정보가 없을때 처리 장바구니로 이동 
 		if (order.getCartSqArr() == null) {
 			mav.setViewName("redirect:/order/noMember");		// 비회원주문서화면
 			return mav;
 		}
 		
-		Order custemerInfo = new Order();
-		Order deliveryAddrInfo = new Order();
-
-		// TODO 로그인체크 로직 추가
-		if (noMember) {
-			// 1.1 주문고객 정보조회
-			custemerInfo.setCustNm(order.getCustNm());
-			custemerInfo.setCellPhnno(order.getCellPhnno());
-			custemerInfo.setEmail(order.getEmail());
-			
-			// 1.2 배송지 정보조회 (기본배송지)
-			deliveryAddrInfo.setDelvAddrNm(order.getCustNm());
-			deliveryAddrInfo.setRecipZipcode(order.getRecipZipcode());
-			deliveryAddrInfo.setRecipBaseAddr(order.getRecipBaseAddr());
-			deliveryAddrInfo.setRecipDtlAddr(order.getRecipDtlAddr());
-			deliveryAddrInfo.setDelvMemo("직접받고 부재시 문 앞");
-		} else {
-			// 1.1 주문고객 정보조회
-			custemerInfo = coreOrderService.getCustemerInfo(order);
-			
-			// 1.2 배송지 정보조회 (기본배송지)
-			deliveryAddrInfo = coreOrderService.getDeliveryAddrInfo(order);
+		// 2. 로그인정보 체크 후 비회원 고객정보 설정
+		if (TsfSession.isLogin()) {
+			order.setCustNm("");
+			order.setCellPhnno("");
+			order.setEmail("");
 			
-			if (deliveryAddrInfo == null) {
-				deliveryAddrInfo = new Order();
-				deliveryAddrInfo.setDelvAddrNm(custemerInfo.getCustNm());
-				deliveryAddrInfo.setRecipZipcode("");
-				deliveryAddrInfo.setRecipBaseAddr("");
-				deliveryAddrInfo.setRecipDtlAddr("");
-				deliveryAddrInfo.setDelvMemo("직접받고 부재시 문 앞");
-			}
+			order.setDelvAddrNm("");
+			order.setRecipZipcode("");
+			order.setRecipBaseAddr("");
+			order.setRecipDtlAddr("");
 		}
 
 		// TODO 임시 장바구니
@@ -185,21 +175,17 @@ public class TsfOrderController extends TsfBaseController {
 		
 		// 3.3 배송비쿠폰목록 조회
 		Collection<Order> delvCpnList = coreOrderService.getDelvCpnList(order);
-		
+
 		Collection<Order> delvFeeCdList = (Collection<Order>) delvOrderMap.get("delvFeeCdList");
 		
 		// 3.3.1 배소업체기준 ---> 배송비쿠폰
 		delvCpnList = coreOrderService.getDelvCpnApplyList(delvFeeCdList, delvCpnList);
 		
 		// 3.4 고객 보유 포인트 정보 조회
-		int rmPntAmt = coreOrderService.getCustPointInfo(order);
-		
-		// 3.5 고객 보유 상품권 정보 조회
-		int rmGfcdAmt = coreOrderService.getGiftcardInfo(order);
+		//int rmPntAmt = coreOrderService.getCustPointInfo(order);
 		
-		// 4. 사은품 정보
-		// 4.1 장바구니상품 사음품 적용 정보 조회
-		GagaMap  resultMap = coreFreegiftService.getOrderFreegift(order);
+		// 2.5 고객 보유 상품권 정보 조회
+		//int rmGfcdAmt = coreOrderService.getGiftcardInfo(order);
 
 		// 101. 상품정보
 		mav.addObject("cartGoodsList"					, tmtbGoodsApplyList);						// 장바구니상품목록 (즉시할인쿠폰적용)
@@ -216,17 +202,228 @@ public class TsfOrderController extends TsfBaseController {
 		mav.addObject("delvAllCartList" 				, delvOrderMap.get("delvAllCartList"));		// 전체배송목록
 		mav.addObject("sumDelvFee" 						, delvOrderMap.get("sumDelvFee"));			// 배송비합계
 		
-		// 102. 고객정보
-		mav.addObject("custemerInfo"					, custemerInfo);							// 고객정보
-		mav.addObject("deliveryAddrInfo"				, deliveryAddrInfo);						// 배송지정보
-		mav.addObject("shotDelvYn" 						, order.getShotDelvYn());					// 장바구니 총알배송여부
-		
+		// 102. 주문정보
+		mav.addObject("order" 							, order);									// 주문정보
+
 		// 103. 할인정보
 		mav.addObject("tmtbGoodsApplyList"				, tmtbGoodsApplyList);						// 다다익선상품 적용목록
+		mav.addObject("orgGoodsSumAmt"					, goodsDcAmtMap.get("orgGoodsSumAmt"));		// 상품금액합계
+		mav.addObject("cpn1DcSumAmt"					, goodsDcAmtMap.get("cpn1DcSumAmt"));		// 즉시할인금액합계
+		mav.addObject("tmtbDcSumAmt"					, goodsDcAmtMap.get("tmtbDcSumAmt"));		// 다다익선할인금액합계
+		mav.addObject("prePntDcAmt"						, goodsDcAmtMap.get("prePntDcAmt"));		// 선포인트사용가능금액
+
+		//mav.addObject("rmPntAmt"						, rmPntAmt);								// 고객포인트정보
+		//mav.addObject("rmGfcdAmt"						, rmGfcdAmt);								// 고객상품권정보
+		mav.addObject("savePntSumAmt"					, goodsDcAmtMap.get("savePntSumAmt"));		// 적립예정포인트합계
+		
+		mav.setViewName(super.getDeviceViewName("order/OrderForm"));
+		
+		return mav;
+	}
+	
+	/**
+	 * 고객정보조회
+	 *
+	 * @param
+	 * @return
+	 * @author jsh77b
+	 * @since 2021. 02. 17
+	 */
+	@ResponseBody
+	@PostMapping("/custemerInfo")
+	public ModelAndView custemerInfo(@RequestBody Order order) {
+		
+		Order custemerInfo = new Order();
+		
+		// 1. 로그인체크 후 custNo 설정
+		if (TsfSession.isLogin()) {
+			order.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
+		} else {
+			order.setJsessionId(TsfSession.getSessionId());
+		}
+		
+		// 2. 로그인체크 후 고객정보 설정
+		if (TsfSession.isLogin()) {
+			// 2.1 주문고객 정보조회
+			custemerInfo = coreOrderService.getCustemerInfo(order);
+		} else {
+			// 2.1 주문고객 정보조회
+			custemerInfo.setCustNm(order.getCustNm());
+			custemerInfo.setCellPhnno(order.getCellPhnno());
+			custemerInfo.setEmail(order.getEmail());
+		}
+		
+		ModelAndView mav = new ModelAndView();
+		mav.addObject("custemerInfo"	, custemerInfo); 	// 고객정보
+		mav.addObject("order"			, order);			// 파라미터
+		mav.setViewName(super.getDeviceViewName("order/OrderCustemerInfo"));
+		
+		return mav;
+	}
+	
+	/**
+	 * 배송정보조회
+	 *
+	 * @param
+	 * @return
+	 * @author jsh77b
+	 * @since 2021. 02. 17
+	 */
+	@ResponseBody
+	@PostMapping("/deliveryAddrInfo")
+	public ModelAndView deliveryAddrInfo(@RequestBody Order order) {
+
+		Order deliveryAddrInfo = new Order();
+		
+		// 1. 로그인체크 후 custNo 설정
+		if (TsfSession.isLogin()) {
+			order.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
+		} else {
+			order.setJsessionId(TsfSession.getSessionId());
+		}
+		
+		// 2. 로그인체크 후 고객정보 설정
+		if (TsfSession.isLogin()) {
+			// 2.1 주문고객 정보조회
+			deliveryAddrInfo = coreOrderService.getDeliveryAddrInfo(order);
+			
+			if (deliveryAddrInfo == null) {
+				deliveryAddrInfo = new Order();
+				deliveryAddrInfo.setDelvAddrNm(deliveryAddrInfo.getCustNm());
+				deliveryAddrInfo.setRecipZipcode("");
+				deliveryAddrInfo.setRecipBaseAddr("");
+				deliveryAddrInfo.setRecipDtlAddr("");
+				deliveryAddrInfo.setDelvMemo("직접받고 부재시 문 앞");
+			}
+		} else {
+			// 2.1 주문고객 정보조회			
+			deliveryAddrInfo.setDelvAddrNm(order.getCustNm());
+			deliveryAddrInfo.setRecipZipcode(order.getRecipZipcode());
+			deliveryAddrInfo.setRecipBaseAddr(order.getRecipBaseAddr());
+			deliveryAddrInfo.setRecipDtlAddr(order.getRecipDtlAddr());
+			deliveryAddrInfo.setDelvMemo("직접받고 부재시 문 앞");
+		}
+		
+		ModelAndView mav = new ModelAndView();
+		mav.addObject("deliveryAddrInfo", deliveryAddrInfo);						// 배송지정보
+		mav.addObject("order"			, order);									// 파라미터
+		mav.setViewName(super.getDeviceViewName("order/OrderDeliveryAddrInfo"));
+		
+		return mav;
+	}
+	
+	/**
+	 * 사은품정보조회
+	 *
+	 * @param
+	 * @return
+	 * @author jsh77b
+	 * @since 2021. 02. 17
+	 */
+	@ResponseBody
+	@PostMapping("/freegiftInfo")
+	public ModelAndView freegiftInfo(@RequestBody Order order) {
+
+		GagaMap resultMap = new GagaMap();
+		
+		// 1. 로그인체크 후 custNo 설정
+		if (TsfSession.isLogin()) {
+			order.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
+		} else {
+			order.setJsessionId(TsfSession.getSessionId());
+		}
+		
+		// 2. 로그인체크 후 정보 설정
+		if (TsfSession.isLogin()) {
+			// 4. 사은품 정보 (장바구니상품 사음품 적용 정보 조회)
+			resultMap = coreFreegiftService.getOrderFreegift(order);
+		} 
+		
+		ModelAndView mav = new ModelAndView();
+		mav.addObject("freegiftGoodsList"	, resultMap.get("freegiftGoodsList"));		// 사은품상품정보 목록
+		mav.addObject("freegiftList"		, resultMap.get("freegiftList"));			// 사은품정보 목록
+		mav.addObject("order"				, order);									// 파라미터
+		
+		mav.setViewName(super.getDeviceViewName("order/OrderFreegiftInfo"));
+		
+		return mav;
+	}
+	
+	/**
+	 * 할인정보조회
+	 *
+	 * @param
+	 * @return
+	 * @author jsh77b
+	 * @since 2021. 02. 17
+	 */
+	@SuppressWarnings("unchecked")
+	@ResponseBody
+	@PostMapping("/dcAmtInfo")
+	public ModelAndView dcAmtInfo(@RequestBody Order order) {
+
+		GagaMap goodsDcAmtMap = new GagaMap();
+		
+		Collection<Order> goodsApplyCpnList 	= new ArrayList<Order>();
+		Collection<Order> goodsCpnList			= new ArrayList<Order>();
+		Collection<Order> cartCpnList 			= new ArrayList<Order>();
+		Collection<Order> delvCpnList 			= new ArrayList<Order>();
+		Collection<Order> delvFeeCdList 		= new ArrayList<Order>();
+		
+		int rmPntAmt 	= 0;
+		int rmGfcdAmt 	= 0;
+		
+		// 1. 로그인체크 후 custNo 설정
+		if (TsfSession.isLogin()) {
+			order.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
+		} else {
+			order.setJsessionId(TsfSession.getSessionId());
+		}
+		
+		// 2. 로그인체크 후 정보 설정 (할인구간정보조회)
+		if (TsfSession.isLogin()) {
+			
+			// 2.1 배송단위별 상품 목록 조회 (장바구니)
+			Collection<Order> tmtbGoodsApplyList = cartService.getMoreBetterAmtList(order);
+			
+			// 2.2 상품금액, 선포인트, 다다익선할인금액
+			goodsDcAmtMap = coreOrderService.getGoodsDcAmt(tmtbGoodsApplyList);
+			
+			// 2.3 배송단위별 장바구니 상품 건수 조회 (장바구니상품)
+			GagaMap delvOrderMap = coreOrderService.getCartDelvGoodsCntList(tmtbGoodsApplyList);
+			
+			// 2.4 상품쿠폰, 장바구니쿠폰 목록 조회
+			GagaMap goodsCartCpnMap = coreOrderService.getGoodsCartCpnApplyGoodsList(order);
+			
+			goodsCpnList 	= (Collection<Order>) goodsCartCpnMap.get("goodsCpnList");
+			cartCpnList 	= (Collection<Order>) goodsCartCpnMap.get("cartCpnList");
+			
+			// 2.5 상품쿠폰 적용된 상품 목록(상품기준)
+			goodsApplyCpnList = coreOrderService.getGoodsCpnApplyList(tmtbGoodsApplyList, goodsCpnList);
+			
+			// 2.6 장바구니쿠폰(장바구니기준 상품목록)
+			cartCpnList = coreOrderService.getCartCpnApplyList(tmtbGoodsApplyList, cartCpnList);
+			
+			// 2.7 배송비쿠폰목록 조회
+			delvCpnList = coreOrderService.getDelvCpnList(order);
+			
+			delvFeeCdList = (Collection<Order>) delvOrderMap.get("delvFeeCdList");
+			
+			// 2.8 배송비쿠폰(배송업체기준)
+			delvCpnList = coreOrderService.getDelvCpnApplyList(delvFeeCdList, delvCpnList);
+			
+			// 2.9 고객 보유 포인트 정보 조회
+			rmPntAmt = coreOrderService.getCustPointInfo(order);
+			
+			// 2.10 고객 보유 상품권 정보 조회
+			rmGfcdAmt = coreOrderService.getGiftcardInfo(order);
+		} 
+
+		ModelAndView mav = new ModelAndView();
 		mav.addObject("goodsApplyCpnList"				, goodsApplyCpnList);						// 상품적용쿠폰
 		mav.addObject("cartCpnList"						, cartCpnList);								// 장바구니쿠폰목록
 		mav.addObject("delvCpnList"						, delvCpnList);								// 배송비쿠폰목록
-		
+
 		mav.addObject("orgGoodsSumAmt"					, goodsDcAmtMap.get("orgGoodsSumAmt"));		// 상품금액합계
 		mav.addObject("cpn1DcSumAmt"					, goodsDcAmtMap.get("cpn1DcSumAmt"));		// 즉시할인금액합계
 		mav.addObject("tmtbDcSumAmt"					, goodsDcAmtMap.get("tmtbDcSumAmt"));		// 다다익선할인금액합계
@@ -235,30 +432,41 @@ public class TsfOrderController extends TsfBaseController {
 		mav.addObject("rmPntAmt"						, rmPntAmt);								// 고객포인트정보
 		mav.addObject("rmGfcdAmt"						, rmGfcdAmt);								// 고객상품권정보
 		mav.addObject("savePntSumAmt"					, goodsDcAmtMap.get("savePntSumAmt"));		// 적립예정포인트합계
+		mav.addObject("order"							, order);									// 파라미터
 		
-		// 104. 사은품정보
-		mav.addObject("freegiftGoodsList"				, resultMap.get("freegiftGoodsList"));		// 사은품상품정보 목록
-		mav.addObject("freegiftList"					, resultMap.get("freegiftList"));			// 사은품정보 목록
-		
-		mav.setViewName(super.getDeviceViewName("order/OrderForm"));
+		mav.setViewName(super.getDeviceViewName("order/OrderDcAmtInfo"));
 		
 		return mav;
 	}
-
+	
 	/**
-	 * 총알배송 가능 지역 체크
+	 * 할인정보조회
 	 *
 	 * @param
 	 * @return
 	 * @author jsh77b
-	 * @since 2021. 02. 08
+	 * @since 2021. 02. 17
 	 */
 	@ResponseBody
-	@RequestMapping(value = "/create/order")
-	public ModelAndView createOrder(Order order) {
-		ModelAndView mav = new ModelAndView();
+	@PostMapping("/paymentInfo")
+	public ModelAndView paymentInfo(@RequestBody Order order) {
+		
+		// 1. 로그인체크 후 custNo 설정
+		if (TsfSession.isLogin()) {
+			order.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
+		} else {
+			order.setJsessionId(TsfSession.getSessionId());
+		}
+		
+		// 2. 로그인체크 후 정보 설정
+		if (TsfSession.isLogin()) {
+			
+		} 
 
-		mav.setViewName(super.getDeviceViewName("pg/kcpOrder"));
+		ModelAndView mav = new ModelAndView();
+		mav.addObject("order" , order);	// 파라미터
+		mav.setViewName(super.getDeviceViewName("order/OrderPaymentInfo"));
+		
 		return mav;
 	}
 
@@ -267,16 +475,20 @@ public class TsfOrderController extends TsfBaseController {
 	 *
 	 * @param
 	 * @return
-	 * @author jsh77b
-	 * @since 2021. 02. 02
+	 * @author xodud1202
+	 * @since 2021. 03. 05
 	 */
-	@SuppressWarnings({ "unchecked", "null" })
+	@ResponseBody
 	@RequestMapping(value = "/pay/result/response")
 	public ModelAndView payResultResponse(Payment param, HttpServletRequest request, HttpServletResponse response) {
 		ModelAndView mav = new ModelAndView();
 
-		orderService.kcpTest(param, request, response);
-		
+		param.setPayGb("KCP");
+
+		param = orderService.orderPgPayResult(param, request, response);
+
+		mav.addObject("payment", param);
+
 		mav.setViewName(super.getDeviceViewName("pg/kcpOrder"));
 		return mav;
 	}
@@ -290,7 +502,7 @@ public class TsfOrderController extends TsfBaseController {
 	 * @since 2021. 02. 08
 	 */
 	@ResponseBody
-	@RequestMapping(value = "/getDailyDeliveryCheck")
+	@PostMapping(value = "/getDailyDeliveryCheck")
 	public int getDailyDeliveryCheck(Order order) {
 		
 		// 1. 총알배송가능 지역, 총알배송 가능 시간 체크
@@ -308,7 +520,7 @@ public class TsfOrderController extends TsfBaseController {
 	 * @since 2021. 02. 17
 	 */
 	@ResponseBody
-	@RequestMapping(value = "/delvAddrChangePop")
+	@PostMapping(value = "/delvAddrChangePop")
 	public ModelAndView delvAddrChangePop(Order order) {
 		
 		ModelAndView mav = new ModelAndView();
@@ -392,19 +604,391 @@ public class TsfOrderController extends TsfBaseController {
 		
 		return mav;
 	}
+	
+	/**
+	 * 주문페이지 (백업)
+	 *
+	 * @param
+	 * @return
+	 * @author jsh77b
+	 * @since 2021. 02. 02
+	 */
+	@SuppressWarnings({ "unchecked", "null" })
+	@RequestMapping(value = "/form20210304")
+	public ModelAndView orderForm20210304(Order order) {
+		ModelAndView mav = new ModelAndView();
+		
+		// TODO
+		// 1.비회주문, 회원 주문 판단 로직,  고객정보 세션 판단
+		// 세션고객정보가 존재하면 회원주문 없으면 비회원 주문
+		
+		// 임시 jsessionId
+		String jsessionId 	= "aaec62cc-5f91-47bb-ba65-ebc9a61385cf";
+		Boolean noMember 	= true;
+
+		// TODO 로그인체크 로직 추가
+		// 1.0 회원, 비회원 여부 판단
+		if (TsfSession.getInfo().getCustNo() == null) {
+			order.setJsessionId(jsessionId);
+		} else {
+			noMember = false;
+			order.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
+		}
+		
+		// TODO
+		// 1.1 카트시퀀스가 없을때 처리 장바구니로 이동 
+		if (order.getCartSqArr() == null) {
+			mav.setViewName("redirect:/order/noMember");		// 비회원주문서화면
+			return mav;
+		}
+		
+		Order custemerInfo = new Order();
+		Order deliveryAddrInfo = new Order();
+
+		// TODO 로그인체크 로직 추가
+		if (noMember) {
+			// 1.1 주문고객 정보조회
+			custemerInfo.setCustNm(order.getCustNm());
+			custemerInfo.setCellPhnno(order.getCellPhnno());
+			custemerInfo.setEmail(order.getEmail());
+			
+			// 1.2 배송지 정보조회 (기본배송지)
+			deliveryAddrInfo.setDelvAddrNm(order.getCustNm());
+			deliveryAddrInfo.setRecipZipcode(order.getRecipZipcode());
+			deliveryAddrInfo.setRecipBaseAddr(order.getRecipBaseAddr());
+			deliveryAddrInfo.setRecipDtlAddr(order.getRecipDtlAddr());
+			deliveryAddrInfo.setDelvMemo("직접받고 부재시 문 앞");
+		} else {
+			// 1.1 주문고객 정보조회
+			custemerInfo = coreOrderService.getCustemerInfo(order);
+			
+			// 1.2 배송지 정보조회 (기본배송지)
+			deliveryAddrInfo = coreOrderService.getDeliveryAddrInfo(order);
+			
+			if (deliveryAddrInfo == null) {
+				deliveryAddrInfo = new Order();
+				deliveryAddrInfo.setDelvAddrNm(custemerInfo.getCustNm());
+				deliveryAddrInfo.setRecipZipcode("");
+				deliveryAddrInfo.setRecipBaseAddr("");
+				deliveryAddrInfo.setRecipDtlAddr("");
+				deliveryAddrInfo.setDelvMemo("직접받고 부재시 문 앞");
+			}
+		}
+
+		// TODO 임시 장바구니
+		// 2. 장바구니시퀀스 배열 등록 (장바구니 상품 정보 조회)		
+		// 2.1 배송단위별 상품 목록 조회 (장바구니)
+		Collection<Order> tmtbGoodsApplyList = cartService.getMoreBetterAmtList(order);
+		
+		// 2.1.0 상품금액, 선포인트, 다다익선할인금액
+		GagaMap goodsDcAmtMap = coreOrderService.getGoodsDcAmt(tmtbGoodsApplyList);
+		
+		// 2.2 배송단위별 장바구니 상품 건수 조회 (장바구니상품)
+		GagaMap delvOrderMap = coreOrderService.getCartDelvGoodsCntList(tmtbGoodsApplyList);
+
+		// 3. 할인구간정보조회
+		// 3.2 상품쿠폰, 장바구니쿠폰 목록 조회
+		GagaMap goodsCartCpnMap = coreOrderService.getGoodsCartCpnApplyGoodsList(order);
+		
+		Collection<Order> goodsCpnList 	= (Collection<Order>) goodsCartCpnMap.get("goodsCpnList");
+		Collection<Order> cartCpnList 	= (Collection<Order>) goodsCartCpnMap.get("cartCpnList");
+		
+		// 3.2.1 상품기준 ---> 상품쿠폰 적용된 상품 목록
+		Collection<Order> goodsApplyCpnList = coreOrderService.getGoodsCpnApplyList(tmtbGoodsApplyList, goodsCpnList);
+		
+		// 3.2.2 장바구니쿠폰기준 ---> 상품목록
+		cartCpnList = coreOrderService.getCartCpnApplyList(tmtbGoodsApplyList, cartCpnList);
+		
+		// 3.3 배송비쿠폰목록 조회
+		Collection<Order> delvCpnList = coreOrderService.getDelvCpnList(order);
+		
+		Collection<Order> delvFeeCdList = (Collection<Order>) delvOrderMap.get("delvFeeCdList");
+		
+		// 3.3.1 배소업체기준 ---> 배송비쿠폰
+		delvCpnList = coreOrderService.getDelvCpnApplyList(delvFeeCdList, delvCpnList);
+		
+		// 3.4 고객 보유 포인트 정보 조회
+		int rmPntAmt = coreOrderService.getCustPointInfo(order);
+		
+		// 3.5 고객 보유 상품권 정보 조회
+		int rmGfcdAmt = coreOrderService.getGiftcardInfo(order);
+		
+		// 4. 사은품 정보
+		// 4.1 장바구니상품 사음품 적용 정보 조회
+		GagaMap  resultMap = coreFreegiftService.getOrderFreegift(order);
+
+		// 101. 상품정보
+		mav.addObject("cartGoodsList"					, tmtbGoodsApplyList);						// 장바구니상품목록 (즉시할인쿠폰적용)
+		mav.addObject("delvTotCnt" 						, delvOrderMap.get("delvTotCnt"));			// 총상품건수
+		mav.addObject("delvFeeTotCnt"					, delvOrderMap.get("delvFeeTotCnt"));		// 총배송타입건수
+		mav.addObject("wmsCnt" 							, delvOrderMap.get("wmsCnt"));				// 자사상품건수
+		mav.addObject("resCnt" 							, delvOrderMap.get("resCnt"));				// 자사예약상품건수
+		mav.addObject("delvCnt" 						, delvOrderMap.get("delvCnt"));				// 입점업체상품건수
+		
+		mav.addObject("shotCartList" 					, delvOrderMap.get("shotCartList"));		// 자사총알배송상품목록
+		mav.addObject("wmsCartList" 					, delvOrderMap.get("wmsCartList"));			// 자사일반배송상품목록
+		mav.addObject("delvCartList" 					, delvOrderMap.get("delvCartList"));		// 입점업체상품목록
+		mav.addObject("resCartList" 					, delvOrderMap.get("resCartList"));			// 자사예약배송상품목록
+		mav.addObject("delvAllCartList" 				, delvOrderMap.get("delvAllCartList"));		// 전체배송목록
+		mav.addObject("sumDelvFee" 						, delvOrderMap.get("sumDelvFee"));			// 배송비합계
+		
+		// 102. 고객정보
+		mav.addObject("custemerInfo"					, custemerInfo);							// 고객정보
+		mav.addObject("deliveryAddrInfo"				, deliveryAddrInfo);						// 배송지정보
+		mav.addObject("shotDelvYn" 						, order.getShotDelvYn());					// 장바구니 총알배송여부
+		
+		// 103. 할인정보
+		mav.addObject("tmtbGoodsApplyList"				, tmtbGoodsApplyList);						// 다다익선상품 적용목록
+		mav.addObject("goodsApplyCpnList"				, goodsApplyCpnList);						// 상품적용쿠폰
+		mav.addObject("cartCpnList"						, cartCpnList);								// 장바구니쿠폰목록
+		mav.addObject("delvCpnList"						, delvCpnList);								// 배송비쿠폰목록
+		
+		mav.addObject("orgGoodsSumAmt"					, goodsDcAmtMap.get("orgGoodsSumAmt"));		// 상품금액합계
+		mav.addObject("cpn1DcSumAmt"					, goodsDcAmtMap.get("cpn1DcSumAmt"));		// 즉시할인금액합계
+		mav.addObject("tmtbDcSumAmt"					, goodsDcAmtMap.get("tmtbDcSumAmt"));		// 다다익선할인금액합계
+		mav.addObject("prePntDcAmt"						, goodsDcAmtMap.get("prePntDcAmt"));		// 선포인트사용가능금액
+
+		mav.addObject("rmPntAmt"						, rmPntAmt);								// 고객포인트정보
+		mav.addObject("rmGfcdAmt"						, rmGfcdAmt);								// 고객상품권정보
+		mav.addObject("savePntSumAmt"					, goodsDcAmtMap.get("savePntSumAmt"));		// 적립예정포인트합계
+		
+		// 104. 사은품정보
+		mav.addObject("freegiftGoodsList"				, resultMap.get("freegiftGoodsList"));		// 사은품상품정보 목록
+		mav.addObject("freegiftList"					, resultMap.get("freegiftList"));			// 사은품정보 목록
+		
+		mav.setViewName(super.getDeviceViewName("order/OrderForm"));
+		
+		return mav;
+	}
+	
+	
+
+	/**
+	 * 주문 데이터 생성
+	 *
+	 * @param
+	 * @return
+	 * @author xodud1202
+	 * @since 2021. 03. 04
+	 */
+	@PostMapping("/create/order")
+	public ModelAndView createOrder(Order order) {
+		ModelAndView mav = new ModelAndView();
+		// TODO 주문 시작 데이터 처리
+
+
+
+
+
+
+		// TODO PG 데이터 세팅 처리
+		// order.ordNo, order.goodsName
+		// order.payType > 2 Menas, gb  > 이니시스, 카드
+
+		// KCP CARD 전송 데이터
+		Payment payment = new Payment();
+		// KCP 주문요청 공통 데이터
+		payment.setReqTx("pay");						// 필수 (주문시 only "pay")
+		payment.setOrdrIdxx(order.getOrdNo());			// 필수
+		payment.setPayMethod("010000000000");			// 필수 결제수단코드(신용카드 : 100000000000, 계좌이체 : 010000000000, 가상계좌 : 001000000000, 포인트 : 000100000000, 휴대폰 : 000010000000, 상품권 : 000000001000, ARS : 000000000010)
+		payment.setGoodName("LTY_TEST_GOODS_NAME");		// 필수
+		payment.setGoodMny(1779);						// 필수
+		payment.setBuyrName("LTY");						// 필수
+		payment.setBuyrMail("xodud1202@naver.com");		// 선택
+		payment.setBuyrTel1("");						// 선택, 일반 전화번호
+		payment.setBuyrTel2("010-7111-4489");			// 필수, 휴대폰번호
+		payment.setCurrency("WON");						// 필수, 원화 : WON, 달러 : USD
+		payment.setShopUserId(1000006);					// 필수, 쇼핑몰회원ID (CUST_NO)
+		// KCP 공통 변경되지 않는 값
+		payment.setSiteCd(env.getProperty("pg.kcp.site.cd"));		// 상점코드
+		payment.setSiteName(env.getProperty("pg.kcp.site.name"));	// 상점 이름 (영문 작성 권장)
+		payment.setModuleType(env.getProperty("pg.kcp.module.type"));
+		payment.setGoodExpr("0");									// 제공 기간 설정 0:일회성 1:기간설정(ex 1:2012010120120131)
+
+		// KCP 신용카드 옵션
+		payment.setQuotaopt(12);						// 최대 할부 개월 수
+
+		// KCP 무통장입금 옵션
+		/*payment.setVcntExpireTerm(3); */					// 무통장입금 유효기간
+
+		// KCP PAYCO 호출
+		if(!StringUtils.isEmpty(payment.getPgGb()) && TscConstants.PgGb.PAYCO.value().equals(payment.getPgGb())) {		// PAYCO일경우
+			payment.setPaycoDirect("Y");
+			payment.setPayMthod("100000000000");		// PAYCO일때 payMethod 뿐 아니라 payMthod도 송부해야함. cart와 동일하게 송부하면됨.
+			payment.setPayMethod("100000000000");		// CARD로 변경
+		}
+
+		mav.addObject("payment", payment);
+		//model.addAttribute("payment", payment);
+
+		mav.setViewName(super.getDeviceViewName("pg/kcpOrder"));
+		return mav;
+		//return super.getDeviceViewName("pg/kcpOrder");
+	}
 
 	/**
 	 * 카카오페이 결제준비 처리
 	 *
 	 * @param Order
-	 * @return GagaMap
+	 * @return KakaoPay
 	 * @author card007
 	 * @since 2021. 03. 03
 	 */
 	@RequestMapping(value = "/kakao/payment/ready")
 	@ResponseBody
-	public GagaMap kakaoPaymentReady(Order order) {
-		return kakaoPayService.kakaoPaymentReady(order);
+	public GagaMap kakaoPaymentReady(@RequestBody Order order) {
+		GagaMap result = new GagaMap();
+
+		if (TsfSession.getInfo().getCustNo() == null) {
+			order.setCustNo(0);
+		} else {
+			order.setCustNo(TsfSession.getInfo().getCustNo());
+		}
+
+		result.set("kakaoPay", kakaoPayService.kakaoPaymentReady(order));
+		result.set("status", GagaResponseStatus.SUCCESS.getCode());
+
+		return result;
+	}
+
+	/**
+	 * 카카오페이 결제 요청 처리
+	 *
+	 * @param Order
+	 * @return GagaMap
+	 * @author card007
+	 * @since 2021. 03. 04
+	 */
+	@RequestMapping(value = "/kakao/payment/request")
+	@ResponseBody
+	public ModelAndView kakaoPaymentRequest(@RequestParam(value = "pg_token", required = false) String pgToken) {
+		ModelAndView mav = new ModelAndView();
+
+		mav.addObject("pgToken", pgToken);
+
+		mav.setViewName(super.getDeviceViewName("/pg/KakaoPaymentRequest"));
+
+		return mav;
+	}
+
+	/**
+	 * 카카오페이 결제 승인 처리
+	 *
+	 * @param Order
+	 * @return GagaMap
+	 * @author card007
+	 * @since 2021. 03. 04
+	 */
+	@RequestMapping(value = "/kakao/payment/approve")
+	@ResponseBody
+	public GagaMap approveKakaoPayment(@RequestBody Order order) {
+		GagaMap result = new GagaMap();
+
+		if (TsfSession.getInfo().getCustNo() == null) {
+			order.setCustNo(0);
+		} else {
+			order.setCustNo(TsfSession.getInfo().getCustNo());
+		}
+
+		result.set("payment", kakaoPayService.approveKakaoPayment(order));
+		result.set("status", GagaResponseStatus.SUCCESS.getCode());
+
+		return result;
+	}
+
+	/**
+	 * 카카오페이 결제 조회
+	 *
+	 * @param Order
+	 * @return GagaMap
+	 * @author card007
+	 * @since 2021. 03. 04
+	 */
+	@RequestMapping(value = "/kakao/payment/order")
+	@ResponseBody
+	public GagaMap kakaoPaymentOrder(@RequestBody Order order) {
+		GagaMap result = new GagaMap();
+
+		if (TsfSession.getInfo().getCustNo() == null) {
+			order.setCustNo(0);
+		} else {
+			order.setCustNo(TsfSession.getInfo().getCustNo());
+		}
+
+		result.set("kakaoPay", kakaoPayService.getKakaoPaymentOrder(order));
+		result.set("status", GagaResponseStatus.SUCCESS.getCode());
+
+		return result;
+	}
+
+	/**
+	 * 카카오페이 결제 취소
+	 *
+	 * @param Order
+	 * @return GagaMap
+	 * @author card007
+	 * @since 2021. 03. 04
+	 */
+	@RequestMapping(value = "/kakao/payment/cancel")
+	@ResponseBody
+	public GagaMap cancelKakaoPayment(@RequestBody Order order) {
+		GagaMap result = new GagaMap();
+
+		if (TsfSession.getInfo().getCustNo() == null) {
+			order.setCustNo(0);
+		} else {
+			order.setCustNo(TsfSession.getInfo().getCustNo());
+		}
+
+		result.set("kakaoPay", kakaoPayService.cancelKakaoPayment(order));
+		result.set("status", GagaResponseStatus.SUCCESS.getCode());
+
+		return result;
+	}
+
+	/**
+	 * 네이버페이 결제 요청 처리
+	 *
+	 * @param Order
+	 * @return GagaMap
+	 * @author card007
+	 * @since 2021. 03. 04
+	 */
+	@RequestMapping(value = "/naver/payment/request")
+	@ResponseBody
+	public ModelAndView naverPaymentRequest(@RequestParam(value = "reserveId", required = false) String reserveId) {
+		ModelAndView mav = new ModelAndView();
+
+		mav.addObject("reserveId", reserveId);
+
+		mav.setViewName(super.getDeviceViewName("/pg/NaverPaymentRequest"));
+
+		return mav;
+	}
+
+	/**
+	 * 네이버페이 결제준비 처리
+	 *
+	 * @param Order
+	 * @return NaverPay
+	 * @author card007
+	 * @since 2021. 03. 07
+	 */
+	@RequestMapping(value = "/naver/payment/ready")
+	@ResponseBody
+	public GagaMap naverPaymentReady(@RequestBody Order order) {
+		GagaMap result = new GagaMap();
+
+		if (TsfSession.getInfo().getCustNo() == null) {
+			order.setCustNo(0);
+		} else {
+			order.setCustNo(TsfSession.getInfo().getCustNo());
+		}
+
+		result.set("naverPay", naverPayService.naverPaymentReady(order));
+		result.set("status", GagaResponseStatus.SUCCESS.getCode());
+
+		return result;
 	}
 
 }

+ 59 - 0
src/main/java/com/style24/front/biz/web/TsfPgController.java

@@ -0,0 +1,59 @@
+package com.style24.front.biz.web;
+
+import java.io.PrintWriter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.style24.persistence.domain.Payment;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Controller
+@RequestMapping("/pg")
+@Slf4j
+public class TsfPgController {
+
+	/**
+	 * 주문페이지
+	 *
+	 * @param
+	 * @return
+	 * @author xodud1202
+	 * @since 2021. 03. 05
+	 */
+	@RequestMapping(value = "/kcp/vBankEnd")
+	public ModelAndView vBankEnd(Payment param, HttpServletRequest request, HttpServletResponse response, Model model) throws Exception{
+		PrintWriter out = response.getWriter();
+		String result = "0000";
+
+		// TODO 결제완료 데이터 처리 실패시 result를 0000이 아닌 다른 값으로 설정(4자리)
+		try {
+			log.info("CHECK site_cd		::::: {}", request.getParameter("site_cd")	);	// 가맹점 코드
+			log.info("CHECK tno			::::: {}", request.getParameter("tno")		);	// KCP 거래번호
+			log.info("CHECK order_no	::::: {}", request.getParameter("order_no")	);	// 가맹점 주문번호
+			log.info("CHECK tx_cd		::::: {}", request.getParameter("tx_cd")		);	// 무통장 입금 통보는 TX00(PC), TX08(MOB). 아닐경우 처리 X
+			log.info("CHECK result		::::: {}", request.getParameter("result")	);	// KCP에서 전송한 결과를 가맹점에서 받았는지 확인하는 데이터. "0000"으로 설정해야함...? model로 보내주면 되는건지 ?
+			log.info("CHECK noti_id		::::: {}", request.getParameter("noti_id")	);	// 가상계좌의 입금 통보건에 대한 고유한 값..?
+			log.info("CHECK ipgm_name	::::: {}", request.getParameter("ipgm_name")	);	// 거래에 대한 주문자명
+			log.info("CHECK ipgm_mnyx	::::: {}", request.getParameter("ipgm_mnyx")	);	// 입금자가 실제 입금한 입금 금액
+			log.info("CHECK bank_code	::::: {}", request.getParameter("bank_code")	);	// 가상계좌 은행코드
+			log.info("CHECK remitter	::::: {}", request.getParameter("remitter")	);	// 가상계좌 입금자 명(주문자명과 다를 수 있음)
+			log.info("CHECK op_cd		::::: {}", request.getParameter("op_cd")		);	// 13이 오면 입금이 잘못된 경우로 취소 노티가 온다고함. 13이 아닌 경우에만 진행해야할듯함.
+			log.info("CHECK cash_a_no	::::: {}", request.getParameter("cash_a_no")	);	// 현금영수증 승인번호
+			log.info("CHECK cash_no		::::: {}", request.getParameter("cash_no")	);	// 현금영수증 거래번호
+		} catch(Exception e) {
+			result = "9999";		// 실패. return 하지 말것.
+		}
+
+		// 결과 데이터 세팅 ("0000"은 성공, 그 외에는 실패. 실패시에 입금 결과 재통보)
+		out.print("<html><body><form><input type='hidden' name='result' value='" + result + "'></form></body></html>");
+		return null;
+	}
+}

+ 46 - 0
src/main/java/com/style24/front/biz/web/TsfPlanningController.java

@@ -1,12 +1,23 @@
 package com.style24.front.biz.web;
 
+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.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.servlet.ModelAndView;
 
+import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.front.biz.service.TsfPlanningService;
 import com.style24.front.support.controller.TsfBaseController;
+import com.style24.front.support.security.session.TsfSession;
+import com.style24.persistence.domain.Cate4Srch;
+import com.style24.persistence.domain.Customer;
+import com.style24.persistence.domain.Order;
+import com.style24.persistence.domain.Plan;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -26,5 +37,40 @@ public class TsfPlanningController extends TsfBaseController {
 
 	@Autowired
 	private TsfPlanningService planningService;
+	
+	/**
+	 * 기획전 메인 화면
+	 * 
+	 * @return
+	 * @author sowon
+	 * @since 2021. 3. 5
+	 */
+	@GetMapping("/main/form")
+	public ModelAndView PlanningMainForm(Plan plan) throws Exception {
+		ModelAndView mav = new ModelAndView();
+		Cate4Srch cate = new Cate4Srch();
+		
+		// 디바이스 set
+		plan.setFrontGb(TsfSession.getFrontGb());
+		
+		// 카테고리 
+		mav.addObject("categoryList", planningService.getPlanCate1(cate));
+		mav.addObject("cateNo", plan.getCateNo());
+		
+		
+		
+		// 각 가테고리 기획전 갯수
+		mav.addObject("planCount",planningService.getPlanAllCount(plan));
+		
+		cate.setCate1No(plan.getCateNo());
+		mav.addObject("cateNm", planningService.getPlanCate1(cate).iterator().next().getCate1Nm());
+			
+		
+		
+		mav.addObject("planList", planningService.getPlanList(plan));
+		mav.setViewName(super.getDeviceViewName("planning/PlanningMainForm"));
+		return mav;
+	}
+
 
 }

+ 2 - 2
src/main/java/com/style24/front/support/security/TsfAuthenticationProvider.java

@@ -82,8 +82,8 @@ public class TsfAuthenticationProvider implements AuthenticationProvider {
 
 		/// SNS로그인이 아닌 일반로그인 이면
 		if (!loginId.startsWith(TsfConstants.SNSLOGIN_PREFIX)) {
-			log.info("encoded password: {}", passwordEncoder.encode(passwd));
-			boolean isMatch = passwordEncoder.matches(passwd, loginInfo.getPasswd());
+			log.info("encoded password: {}", passwordEncoder.encodeSha256(passwd));
+			boolean isMatch = passwordEncoder.matchesSha256(passwd, loginInfo.getPasswd());
 			log.info("Password is match?: {}", isMatch);
 
 			if (!isMatch) {

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

@@ -40,6 +40,10 @@ public class Counsel extends TscBaseDomain {
 	private String sysFileNm1;		// 시스템파일명1
 	private String orgFileNm2;		// 원본파일명2
 	private String sysFileNm2;		// 시스템파일명2
+	private String file1OrgFileNm;	// 원본파일명1(등록시 사용)
+	private String file1SysFileNm;	// 시스템파일명1(등록시 사용)
+	private String file2OrgFileNm;	// 원본파일명2(등록시 사용)
+	private String file2SysFileNm;	// 시스템파일명2(등록시 사용)
 	private String ansStat;			// 답변상태(공통코드G060)
 	private String ansStatNm;		// 답변상태명
 	private String ansTitle;		// 답변제목
@@ -47,12 +51,18 @@ public class Counsel extends TscBaseDomain {
 	private String ansDt;			// 답변일자
 	private String secretYn;		// 비밀글여부(상품문의에서만 사용)
 	private String delYn;			// 삭제여부
+	private int selfGb;				// 내문의 1: , 그외 0
 
 	// 1:1문의(총, 답변완료, 처리중) 건수
 	private int totCnt;		// 총건수
 	private int ansCnt;		// 답변완료건수
 	private int ingCnt;		// 처리중건수
 
+	// Masking
+	//public String getMaskingCustId() {
+	//return MaskingUtils.id(this.custId);
+	//}
+
 	// Pagination
 	@JsonInclude(JsonInclude.Include.NON_EMPTY)
 	private TscPageRequest pageable;

+ 28 - 0
src/main/java/com/style24/persistence/domain/Delivery.java

@@ -0,0 +1,28 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 배송 Domain
+ *
+ * @author eskim
+ * @since 2023. 3. 08
+ */
+@SuppressWarnings("serial")
+@Data
+public class Delivery extends TscBaseDomain {
+
+	private String delvFeeCd; 		// 배송비코드
+	private String supplyCompCd; 	// 공급업체
+	private int delvFee; 			// 배송비
+	private int minOrdAmt; 			// 무료배송비최소주문금액
+	private int rtnDelvFee; 		// 반품배송비
+	private String rtnLocZipcode;	// 반품처우편번호
+	private String rtnLocBaseAddr;	// 반품처기본주소
+	private String rtnLocDtlAddr;	// 반품처상세주소
+	private String rtnLocTelno;		// 반품처전화번호
+	private String note;			// 배송안내정보
+
+}

+ 5 - 1
src/main/java/com/style24/persistence/domain/Goods.java

@@ -72,10 +72,12 @@ public class Goods extends TscBaseDomain {
 	private String adultYn;		//성인용품여부
 
 	private String colorCd;		//색상코드
-	private String colorNM;		//색상코드명
+	private String colorNm;		//색상코드명
 	private String brandnm;		//브랜드명
 	private Integer brandGroupNo;	//브랜드그룹번호
 	private String brandGroupNm;	//브랜드그룹명
+	private String goodsGbNm;		//상품구분명
+	private String originNm;		//제조국 명
 	private String frontGb;		//프론트구분
 	private String isApp;		//앱구분
 	private String siteCd;		//사이트코드
@@ -110,6 +112,8 @@ public class Goods extends TscBaseDomain {
 	private String socialStdt;	//소셜시작일
 	private String socialEddt;	//소셜종료일
 	private String planDtlSq;	//기획전상세번호
+	private String quikDelvYn;	//총알배송여부
+	private String delvFeeCrite;	//배송비부과기준(공통코드G078)
 
 	private int floorUnit; // 절사단위(1:일원단위절사, 10:십원단위절사, 100:백원단위절사)
 

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

@@ -0,0 +1,33 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상품 안전인증 Domain
+ *
+ * @author eskim
+ * @since 2021. 03. 07
+ */
+@SuppressWarnings("serial")
+@Data
+public class GoodsSafeNo extends TscBaseDomain {
+
+	private String goodsCd;
+	private String goodsNum;
+	private String certNum;
+	private String certState;
+	private String certDiv;
+	private String certDt;
+
+	public boolean getIsCertNum() {
+		if (this.certNum.matches(".*[0-9].*")) {
+			return true;
+		} else {
+			return false;
+		}
+
+	}
+
+}

+ 2 - 1
src/main/java/com/style24/persistence/domain/GoodsStock.java

@@ -31,5 +31,6 @@ public class GoodsStock extends TscBaseDomain {
 	private String sysImgNm;		// 상품이미지 명
 	private int goodsQty;			// 안전재고
 	private int stockQty;			// 상품 재고
-
+	private String selfGoodsYn;		// 자사상품구분
+	
 }

+ 19 - 0
src/main/java/com/style24/persistence/domain/Login.java

@@ -2,6 +2,7 @@ package com.style24.persistence.domain;
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.style24.core.support.util.CryptoUtils;
 import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
@@ -30,6 +31,7 @@ public class Login extends TscBaseDomain {
 	private String custGb;			// 고객구분
 	private String custGbNm;		// 고객구분명
 	private String custStat;		// 고객상태
+	private String cellPhnno;		// 휴대전화번호
 	private String email;			// 이메일
 	private String snsType;			// SNS유형
 	private String snsId;			// SNS가입ID
@@ -42,4 +44,21 @@ public class Login extends TscBaseDomain {
 	private String loginFailYn;		// 로그인실패여부
 	private String custGrade;		// 고객등급
 
+	// 암호화 대상 복호화 처리 =================================================
+	public String getCustNm() {
+		this.custNm = CryptoUtils.decryptAES(this.custNm);
+		return this.custNm;
+	}
+
+	public String getCellPhnno() {
+		this.cellPhnno = CryptoUtils.decryptAES(this.cellPhnno);
+		return this.cellPhnno;
+	}
+
+	public String getEmail() {
+		this.email = CryptoUtils.decryptAES(this.email);
+		return this.email;
+	}
+	// 암호화 대상 복호화 처리 =================================================
+
 }

+ 0 - 37
src/main/java/com/style24/persistence/domain/Lookbook.java

@@ -1,37 +0,0 @@
-package com.style24.persistence.domain;
-
-import java.util.Collection;
-
-import com.style24.persistence.TscBaseDomain;
-
-import lombok.Data;
-
-/**
- * 룩북 Domain
- *
- * @author eskim
- * @since 2021. 02. 18
- */
-@SuppressWarnings("serial")
-@Data
-public class Lookbook extends TscBaseDomain {
-
-	private Integer lookbookSq;		// 룩북일련번호
-	private String brandCd;			// 브랜드코드(브랜드)
-	private String title;			// 제목
-	private String dispStdt;		// 노출시작일시
-	private String dispEddt;		// 노출종료일시
-	private String dispYn;			// 표시여부
-	private int dispOrd;			// 표시순서
-
-	private Integer lookbookbSq;	// 룩북배너일련번호
-	private String orgFileNm;		// 원본파일명
-	private String sysFileNm;		// 시스템파일명
-
-	Collection<LookbookGoods> lookbookGoodsList;	//베너별 상품목록
-	
-	private String goodsCd; 		// 상품상세검색용
-	private String frontGb; 		// 상품상세검색용
-	private String custGb; 			// 상품상세검색용
-
-}

+ 0 - 22
src/main/java/com/style24/persistence/domain/LookbookGoods.java

@@ -1,22 +0,0 @@
-package com.style24.persistence.domain;
-
-import com.style24.persistence.TscBaseDomain;
-
-import lombok.Data;
-
-/**
- * 룩북 베너별 상품 Domain
- *
- * @author eskim
- * @since 2021. 02. 18
- */
-@SuppressWarnings("serial")
-@Data
-public class LookbookGoods extends TscBaseDomain {
-
-	private Integer lookbookbSq;	// 룩북배너일련번호
-	private String goodsCd;			// 상품코드
-	private String delYn;			// 삭제여부
-	private int dispOrd;			// 표시순서
-
-}

+ 295 - 0
src/main/java/com/style24/persistence/domain/Plan.java

@@ -0,0 +1,295 @@
+package com.style24.persistence.domain;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.style24.persistence.TscBaseDomain;
+import com.style24.persistence.TscPageRequest;
+
+import lombok.Data;
+
+/**
+ * 기획전 Domain
+ *
+ * @author sowon
+ * @since 2021. 02. 04
+ */
+
+@SuppressWarnings("serial")
+@Data
+public class Plan extends TscBaseDomain{
+	// 기획전
+		private Integer planSq;				//기획전일련번호(SeqPlan sequence)
+		private String planNm;				//기획전명
+		private String planGb;				//기획전구분(P:기획전private String  E:이벤트)
+		private String custGb;				//고객구분
+		private String custGrade;			//회원등급
+		private String planSnm;				//검색어
+		private String templateType;		//템플릿유형(H:Htmlprivate String  T:텍스트)
+		private String siteCd;				//사이트코드(공통코드g000)
+		private String frontGb;				//프론트구분(A:All, P:웹, M:모바일)
+		private String dispStdt;			//기획전 시작일시
+		private String dispEddt;			//기획전 종료일시
+		private String mainPimg;			//메인이미지(Pc)
+		private String mainMimg;			//메인이미지(모바일)
+		private String dtlPimg;				//상세이미지(Pc)
+		private String dtlMimg;				//상세이미지(모바일)
+		private String orgMainPimg;			//원본메인이미지(Pc)
+		private String orgMainMimg;			//원본메인이미지(모바일)
+		private String orgDtlPimg;			//원본상세이미지(Pc)
+		private String orgDtlMimg;			//원본상세이미지(모바일)
+		private String orgMainPimgDelYn;	//원본메인이미지(Pc) 삭제여부
+		private String orgMainMimgDelYn;	//원본메인이미지(모바일) 삭제여부
+		private String orgDtlPimgDelYn;		//원본상세이미지(Pc) 삭제여부
+		private String orgDtlMimgDelYn;		//원본상세이미지(모바일) 삭제여부
+		private String dtlTitle1;			//상세제목1
+		private String dtlTitle2;			//상세제목2
+		private String cateCd;				//카테고리코드(대/중/소/세카테고리)
+		private String cateDispYn;			//카테고리전시여부(Y:전시)
+		private String replyYn;				//댓글여부(Y:댓글)
+		private String replyLoc;			//댓글위치(U:상품리스트상단 D:상품리스트하단)
+		private String replyImg;			//댓글이미지
+		private String orgReplyImg;			//원본댓글이미지
+		private String replyTitle1;			//댓글제목1
+		private String replyTitle2;			//댓글제목2
+		private String devUrl;				//호출 URL
+		private String orgReplyImgDelYn;	//원본댓글이미지 삭제여부
+		private String cornerNmDispYn;		//코너명노출여부(Y:노출)
+		private String goodsLimitYn;		//상품등록제한여부(Y:상품등록제한)
+		private String goodsLimitQty;		//상품등록제한수(상품등록제한여부가 "Y"일 떄)
+		private String delYn;				//삭제여부(Y:삭제)
+		private String openYn;				//오픈여부(Y:오픈)
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private long[] dispOrdArr;			// 표시순서 배열
+		private long dispOrd;				//표시순서
+		private long readCnt;				//조회수
+		private Integer pollSq;				//투표일련번호
+		private String badgeNm;				//뱃지이름
+		private String badgeFcolor;			//뱃지글자컬러
+		private String badgeBcolor;			//뱃지배경컬러
+		private String privacyPolicy;		//개인정보수집동의정책
+
+		// 기획전 소스
+		private Integer seq;					//일련번호
+		private String fsrcPc;				//프론트소스(pc)	/ 화면용
+		private String fsrcMob;			//프론트소스(모바일)	/ 화면용
+		private String locGb;			//위치구분(T:상단 / B:하단)
+
+		// 기획전 상세
+		private Integer planDtlSq;				//기획전상세일련번호(SEQ_PLAN_DTL sequence)
+		private Integer copyPlanDtlSq;			//복사할 상세 일련번호
+		private Integer copyPlanSq;			//복사할 일련번호
+		private String copyMode;			//복사 선택(CORNER:코너복사, PLAN:기획전복사)
+		private String cornerDispType;		//코너노출유형(공통코드G045) (2:2컷 , 3:3컷, 4:4컷)
+		private String cornerNm;			//코너 명
+		private String planDtlStat;			//기획전상세상태(공통코드G044)
+		private String copyBrandCd;	        //복사할 브랜드코드
+		private String adminPreview;	// 어드민미리보기 여부 (Y:미리보기)
+		// 기획전 브랜드
+		private String brandGroupNo;	//기획전브랜드그룹번호
+		private String DispYn;      	//표시여부           
+		private String brandGroupKnm; 	// 브랜드 그룹명(한글)
+		private String brandGroupEnm; 	// 브랜드 그룹명(영어)
+		/* Multi CheckBox 항목*/
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] multiBrand;
+		private String[] multiCate;
+		
+		// 코너
+		private String cateGb;		// 카테고리구분
+		private String cateNm;		// 카테고리명
+		private Integer cateNo;		// 카테고리번호
+		
+		// 기획전 응모
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] planQtitle;
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] attachYn;
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] planAnswerSq;
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] answer;
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] sysFileNm;
+
+		//private Collection<TsaPlanQuestAnswer> planQuestAnswerList; // 고시항목
+
+		// 검색
+		private String startSearchDate;		// 진행기간 시작일
+		private String startSearchTime;		// 진행기간 시작시간
+		private String endSearchDate;		// 진행기간 종료일
+		private String endSearchTime;		// 진행기간 종료시간
+		private String excelFileNm;			// 엑셀 파일 명
+		//private int startRow;				// 페이징 시작
+		//private int endRow;					// 피이징 종료
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] siteCds;			// 사이트
+
+		// 코너 상품
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] goodsCdArr;		// 상품 코드 배열
+		private String goodsCd;				// 상품 코드
+		private String goodsNm;				// 상품 명
+		private String goodsStat;			// 제품상태
+		private String imgType;				// 이미지 타입
+		private String imgPath1;			// 이미지 경로1
+		private String imgPath2;			// 이미지 경로2
+		private String imgPath4;			// 이미지 경로4
+		private String imgPath5;			// 이미지 경로5
+		private String imgPath6;			// 이미지 경로6
+		private String dcRate;				// 할인율
+		private String listPrice;			// 최소 소비자가
+		private String tagPrice;			// tag 가
+		private String currPrice;			// 판매가
+		private String supplyCompCd;		// 업체코드
+		private String supplyCompNm;		// 업체명
+		private String formalGb;			// 정상/이월 여부
+		private String currStockQty;		// 재고
+		private String pageYn;				// 페이징 사용 여부
+		private String changeGb;			// 순서변경 updown 구분
+		private int stockQtySum;			// 재고
+		private String afLinkCd;			// 제휴채널
+		private String afChannel;			// 제휴채널 공통코드
+		private String afLinkNm;			// 제휴채널 명
+
+		// 기획전 팝업
+		private String callBackFun;			// 콜백함수명
+		private String popupDispStdt;		//기획전 시작일시
+		private String popupDispEddt;		//기획전 종료일시
+		
+		//기획전 템플릿
+		private Integer planContSq;			// 기획전 컨텐츠 일련번호
+		private String tmplType;			//템플릿 유형(공통코드 G082)
+		private String title;				//타이틀
+		private String linkUrl;				//링크url
+		private String dispYn;				//표시여부
+		private Integer planContItemSq;		//기획전 컨텐프 아이템 일련번호
+		private String itemVal;				//아이템값(상품코드, 이미지파일명 등)
+		private String reviewDispStdt;		//리뷰노출시작일시
+		private String reviewDispEddt;		//리뷰노툴종료일시
+		
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] multiPlanReview;		//리뷰상품목록
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] multiPlanReviewStartD;		//리뷰시작날짜
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] multiPlanReviewStartT;		//리뷰시작시간
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] multiPlanReviewEndD;		//리뷰종료날짜
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] multiPlanReviewEndT;		//리뷰종료시간
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] multiPlanCoupon;		//쿠폰목록
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] multiPlanFile;			//이미지목록
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] multiChannel;			//제휴채널목록
+		
+
+		
+		// 템플릿 저장하기 위한 임시 변수
+		private String reTitle;				//리뷰타이틀
+		private String mode;				//모드
+		private long reDispOrd;				//리뷰전시순서
+		private String reItemVal;			//리뷰아이템
+		private String reDispYn;			//리뷰전시여부
+		private String reItemNm;			//리뷰상품이름
+		private Integer rePlanContSq;		//리뷰 컨텐츠일련번호
+		
+		private String cuTitle;				//쿠폰타이틀
+		private long cuDispOrd;				//쿠폰전시순서
+		private String cuDispYn;			//쿠폰전시여부
+		private String cuItemVal;			//쿠폰 아이템
+		private String cuItemNm;			//쿠폰 아이템 이름
+		private Integer cuPlanContSq;		//쿠폰 컨텐츠일련번호
+		
+		private String fileItemVal;			//파일아이템
+		private String fileDispYn;			//파일전시여부
+		private long fileDispOrd;			//파일전시순서
+		private Integer filePlanContSq;		//파일 컨텐츠일련번호
+		
+		private String topFsrcDispYn;		//html상단 전시여부
+		private String BtmFsrcDispYn;		//html하단 전시여부
+		private long   topFsrcDispOrd;		//html상단 전시순서
+		private long   btmFsrcDispOrd;		//html하단 전시순서
+		private String fsrcPcTop;			//html상단 내용(pc)
+		private String fsrcMobileTop;	    //html상단 내용(mobile)
+		private String fsrcPcBtm;			//html하단 내용(pc)
+		private String fsrcMobileBtm;		//html하단 내용(pc)
+		
+		private String goodsTitle;			//상품타이틀
+		private String goodsUrl;			//상품 url
+		private String goodsDispYn;			//상품전시여부
+		private long goodsDispOrd;			//상품 전시순서
+		private String goodsType;			//상품노출순서
+		private String goodsItemVal;		//상품아이템
+		private String brandEnm;			//브랜드명
+		private Integer goodsPlanContSq;	//상품 컨텐츠일련번호
+		
+		private String brand;				// 기획전 리스트 (브랜드 명 외)
+		private String newPlan;				// 기획전 new 확인
+		private int cnt;					// 기획전 브랜드 카운트;
+		// Pagination
+		private TscPageRequest pageable;
+		private int pageNo = 1;
+		private int pageSize = 50;
+		private int pageUnit = 10;
+		
+		private String condition; // 키워드 종류
+		private String search; // 검색어
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] conditionList;
+		
+		 // 사용가능고객등급
+	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	    private String[] usableCustGradeArr;
+		
+	    // 사용가능고객구분
+	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	    private String[] usableCustGbArr;
+	    
+	    
+	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContent1; 
+	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContent2; 
+	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContent3; 
+	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContent4; 
+	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContent5; 
+	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContent6; 
+	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContent7; 
+	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContent8; 
+	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContent9; 
+	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContent10; 
+	    
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContentVal1; 
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContentVal2; 
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContentVal3; 
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContentVal4; 
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContentVal5; 
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContentVal6; 
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContentVal7; 
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContentVal8; 
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContentVal9; 
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContentVal10; 
+}

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

@@ -242,7 +242,7 @@
 		     , CONCAT('[',#{relGoodsCd},'] 상품문의')
 		     , #{questContent}
 		     , NOW()
-		     , #{secretYn}
+		     , IFNULL(#{secretYn},'N')
 		     , 'G060_10' /*답변상태:처리중*/
 		     , 'N'
 		     , #{regNo}
@@ -272,13 +272,21 @@
 		FROM   TB_COUNSEL A
 		     , TB_GOODS G
 		WHERE  A.REL_GOODS_CD = G.GOODS_CD
+		<if test="custNo != null and custNo != '' ">
 		AND    A.CUST_NO = #{custNo}
+		</if>
+		<if test="relGoodsCd != null and relGoodsCd != '' ">
+		AND    A.REL_GOODS_CD = #{relGoodsCd}
+		</if>
+		<if test="secretYn != null and secretYn != '' ">
+		AND    A.SECRET_YN = #{secretYn}
+		</if>
 		AND    A.SITE_CD = #{siteCd}
 		AND    A.COUNSEL_TYPE = 'G' /*상담유형(상품문의)*/
 		AND    A.DEL_YN = 'N' /*삭제안된넘*/
 	</select>
 	
-	<!-- 상품문의 목록 -->
+	<!-- 상품문의 목록 - 고객센터용-->
 	<select id="getGoodsQnaList" parameterType="Counsel" resultType="Counsel">
 		/* TsfCounsel.getGoodsQnaList */
 		<include refid="selectForPagingHeader"/>
@@ -301,13 +309,62 @@
 		FROM   TB_COUNSEL A
 		     , TB_GOODS G
 		WHERE  A.REL_GOODS_CD = G.GOODS_CD
+		<if test="custNo != null and custNo != '' ">
 		AND    A.CUST_NO = #{custNo}
+		</if>
+		<if test="relGoodsCd != null and relGoodsCd != '' ">
+		AND    A.REL_GOODS_CD = #{relGoodsCd}
+		</if>
+		<if test='secretYn != null and secretYn == "Y" '>
+		AND    A.SECRET_YN = #{secretYn}
+		</if>
 		AND    A.SITE_CD = #{siteCd}
 		AND    A.COUNSEL_TYPE = 'G' /*상담유형(상품문의)*/
 		AND    A.DEL_YN = 'N' /*삭제안된넘*/
 		<include refid="selectForPagingFooter"/>
 	</select>
 	
+	<!-- 상품문의 목록 - 상품목록용 -->
+	<select id="getGoodsQnaListForGoods" parameterType="Counsel" resultType="Counsel">
+		/* TsfCounsel.getGoodsQnaListForGoods */
+		<include refid="selectForPagingHeader"/>
+		SELECT Z.*
+		     , RANK() OVER(ORDER BY SELF_GB DESC, QUEST_DT_ORD DESC) AS NUMB
+		FROM (
+		SELECT A.COUNSEL_SQ                                       /*상담일련번호*/
+		     , A.SITE_CD                                          /*사이트코드*/
+		     , DATE_FORMAT(A.QUEST_DT,'%Y.%m.%d')  AS QUEST_DT    /*문의일자*/
+		     , A.SECRET_YN                                        /*비밀글여부*/
+		     , A.CELL_PHNNO                                       /*휴대전화번호*/
+		     , A.SMS_REQ_YN                                       /*SMS(알림톡)답변수신여부*/
+		     , A.REL_GOODS_CD                                     /*관련상품코드*/
+		     , G.GOODS_NM                                         /*상품명*/
+		     , A.QUEST_TITLE                                      /*문의제목*/
+		     , A.QUEST_CONTENT                                    /*질문내용*/
+		     , A.ANS_TITLE                                        /*답변제목*/
+		     , A.ANS_CONTENT                                      /*답변내용*/
+		     , A.ANS_STAT                                         /*답변상태*/
+		     , FN_GET_CODE_NM('G060',ANS_STAT)     AS ANS_STAT_NM /*답변상태명*/
+		     , DATE_FORMAT(A.ANS_DT,'%Y.%m.%d')    AS ANS_DT      /*답변일자*/
+		     , C.CUST_ID                                          /*등록자ID*/
+		     , (CASE WHEN A.CUST_NO  = #{custNo} THEN 1 ELSE 0 END) AS SELF_GB
+		     , A.QUEST_DT AS QUEST_DT_ORD
+		FROM   TB_COUNSEL A
+		     , TB_GOODS G
+		     , TB_CUSTOMER C
+		WHERE  A.REL_GOODS_CD = G.GOODS_CD
+		AND    A.CUST_NO = C.CUST_NO
+		AND    A.REL_GOODS_CD = #{relGoodsCd}
+		<if test='secretYn != null and secretYn == "Y" '>
+		AND    A.SECRET_YN = #{secretYn}
+		</if>
+		AND    A.SITE_CD = #{siteCd}
+		AND    A.COUNSEL_TYPE = 'G' /*상담유형(상품문의)*/
+		AND    A.DEL_YN = 'N' /*삭제안된넘*/
+		) Z
+		<include refid="selectForPagingFooter"/>
+	</select>
+	
 	<!-- 상품문의 삭제 -->
 	<update id="deleteGoodsQna" parameterType="Counsel">
 		/* TsfCounsel.deleteGoodsQna */

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

@@ -163,7 +163,6 @@
 		     , CUST_NM
 		     , PASSWD
 		     , BIRTH_YMD
-		     , BIRTH_SM
 		     , SEX_GB
 		     , CELL_PHNNO
 		     , APP_AGREE_YN
@@ -204,7 +203,6 @@
 		     , #{encodedCustNm}                    AS CUST_NM
 		     , #{encodedPasswd}                    AS PASSWD
 		     , #{encodedBirthYmd}                  AS BIRTH_YMD
-		     , #{birthSm}                          AS BIRTH_SM
 		     , #{encodedSexGb}                     AS SEX_GB
 		     , #{encodedCellPhnno}                 AS CELL_PHNNO
 		     , IFNULL(#{appAgreeYn}, 'N')          AS APP_AGREE_YN

+ 150 - 115
src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml

@@ -79,11 +79,15 @@
 	<!-- 상품 정보 -->
 	<select id="getGoodsInfo" parameterType="Goods" resultType="Goods">
 		/* TsfGoods.getGoods */
+		SELECT Z.*
+		     , 100 - ROUND((CURR_PRICE / LIST_PRICE) * 100 ,0) AS DC_RATE 
+		     , ((PNT_RATE * CURR_PRICE) / 100) AS PNT_AMT
+		FROM (
 		SELECT G.GOODS_CD
 		     , G.GOODS_NM
 		     , G.GOODS_TNM
 		     , CONCAT(IF(IFNULL(G.GOODS_GB,'') IN ('G073_11','G073_15', ''), '',IFNULL(CONCAT('[',FN_GET_CODE_NM('G073',G.GOODS_GB),']'),'') )
-		             ,IF(G.FOREIGN_BUY_YN='N','[해외구매대행]','' )
+		             ,IF(G.FOREIGN_BUY_YN='Y','[해외구매대행]','' )
 		             ,IF(G.PARALLEL_IMPORT_YN = 'Y','[병행수입]','')
 		             ,IF(G.ORDER_MADE_YN='Y','[주문제작]','')
 		             ,G.GOODS_NM ) AS GOODS_FULL_NM
@@ -94,13 +98,14 @@
 		     , G.ITEMKIND_CD
 		     , G.FORMAL_GB
 		     , G.LIST_PRICE
-		     , BP.CURR_PRICE
-		     , 100 - ROUND((BP.CURR_PRICE / G.LIST_PRICE) * 100 ,0) AS DC_RATE
+		     -- , BP.CURR_PRICE
+		     , FN_GET_BENEFIT_PRICE(#{frontGb},G.GOODS_CD, G.CURR_PRICE,#{custGb}) AS CURR_PRICE
+		     -- , 100 - ROUND((BP.CURR_PRICE / G.LIST_PRICE) * 100 ,0) AS DC_RATE
 		     , G.SELF_GOODS_YN
 		     , G.GOODS_STAT
 		     , (CASE WHEN #{frontGb} = 'P' THEN G.PNT_PRATE ELSE G.PNT_MRATE END) AS PNT_RATE
 		     , (CASE WHEN #{frontGb} = 'P' THEN G.PRE_PPNT_USABLE_YN ELSE G.PRE_MPNT_USABLE_YN END) AS PRE_PNT_USABLE_YN
-		     , (CASE WHEN #{frontGb} = 'P' THEN (G.PNT_PRATE * BP.CURR_PRICE)/100 ELSE (G.PNT_MRATE * BP.CURR_PRICE) / 100 END) AS PNT_AMT
+		    -- 
 		     , G.MIN_ORD_QTY
 		     , G.MAX_ORD_QTY
 		     , G.DAY_MAX_ORD_QTY
@@ -108,7 +113,9 @@
 		     , FN_GET_CODE_NM('G007',G.SEX_GB) AS SEX_NM
 		     , E.DELV_FEE
 		     , E.MIN_ORD_AMT
+		     , E.DELV_FEE_CRITE
 		     , G.GOODS_GB
+		     , FN_GET_CODE_NM('G073',G.GOODS_GB) AS GOODS_GB_NM
 		     , (SELECT NI_CLSF_CD
 		        FROM TB_ITEMKIND
 		        WHERE ITEMKIND_CD = G.ITEMKIND_CD) AS NI_CLSF_CD
@@ -122,10 +129,11 @@
 		     , G.GOODS_TYPE
 		     , G.CHANGEABLE_YN
 		     , G.RETURNABLE_YN
-		     , (SELECT CATE1_NO FROM TB_SITE_BRAND WHERE  BRAND_CD = G.BRAND_CD AND SITE_CD = #{siteCd} AND USE_YN = 'Y') AS BRAND_CATE1_NO
+		     , G.ORIGIN_CD
+		     , FN_GET_CODE_NM('G076',G.ORIGIN_CD) AS ORIGIN_NM
 		     , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IFNULL(#{colorCd}, IFNULL(G.MAIN_COLOR_CD,'XX')) AND DEFAULT_IMG_YN = 'Y') AS SYS_IMG_NM
-		     /*, (SELECT ) AS COLOR_NM*/
-		     , BP.CURR_PRICE AS BENEFIT_PRICE
+		     , (SELECT COLOR_KNM FROM tb_color C WHERE COLOR_CD = IFNULL(NULLIF(#{colorCd},'') , G.MAIN_COLOR_CD ) AND USE_YN  = 'Y') AS COLOR_NM
+		     -- , BP.CURR_PRICE AS BENEFIT_PRICE
 		     , (CASE WHEN W.GOODS_CD IS NULL THEN 'N' ELSE 'Y' END) AS WISH_YN
 		     , (CASE WHEN G.GOODS_TYPE = 'G056_N' THEN (SELECT IFNULL(MAX(CASE WHEN SOLDOUT_YN = 'Y' THEN 0
 		                                                               ELSE CURR_STOCK_QTY
@@ -142,24 +150,23 @@
 		                  WHERE GOODS_CD= G.GOODS_CD
 		                  GROUP BY GOODS_CD )
 		            END) AS STOCK_QTY
+		     , (CASE WHEN G.SELF_GOODS_YN ='Y' AND IFNULL(DS.GOODS_CD, 'Y') THEN 'Y' ELSE 'N' END ) AS QUIK_DELV_YN
 		FROM TB_GOODS G
 		INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
 		                      AND B.USE_YN = 'Y'
 		INNER JOIN TB_BRAND_GROUP D ON B.BRAND_GROUP_NO = D.BRAND_GROUP_NO
 		                            AND D.USE_YN = 'Y'
-		INNER JOIN (SELECT GOODS_CD, 
-		            FN_GET_BENEFIT_PRICE(#{frontGb},GOODS_CD, CURR_PRICE,#{custGb}) AS CURR_PRICE 
-		            FROM TB_GOODS
-		            WHERE GOODS_CD = #{goodsCd}) BP ON G.GOODS_CD = BP.GOODS_CD
 		INNER JOIN TB_DELV_FEE_POLICY E ON G.SUPPLY_COMP_CD = E.SUPPLY_COMP_CD
 		                                     AND G.DELV_FEE_CD =  E.DELV_FEE_CD
 		LEFT OUTER JOIN TB_WISHLIST W ON G.GOODS_CD = W.GOODS_CD
 		                              AND IFNULL(#{custNo}, 0) = W.CUST_NO
+		LEFT OUTER JOIN TB_GOODS_QUICK_DELEVERY_SKIP DS ON G.GOODS_CD =DS.GOODS_CD
 		WHERE G.GOODS_CD = #{goodsCd}
 		-- AND G.SELF_MALL_YN = 'Y' --자사몰 노출(기획전과 상품상세는 노출)
 		<if test='adminYn == null or adminYn != "Y"'>
 		AND G.GOODS_STAT = 'G008_90'
 		</if>
+		) Z
 	</select>
 
 	<!-- 상품 상세 정보 조회 -->
@@ -205,8 +212,8 @@
 		LIMIT 1
 	</select>
 	
-	<!-- 상품 옵션1 목록 -->
-	<select id="getGoodsOption1List" parameterType="Goods" resultType="GoodsStock">
+	<!-- 상품 옵션1 목록  - 자사용 -->
+	<select id="getGoodsOption1List_ORG" parameterType="Goods" resultType="GoodsStock">
 		/* TsfGoods.getGoodsOption1List */
 		SELECT GOODS_CD
 		     , OPT_CD1
@@ -239,7 +246,7 @@
 		                      WHERE DISP_YN = 'Y'
 		                      GROUP BY GOODS_CD, OPT_CD1) S ON G.GOODS_CD = S.GOODS_CD 
 		                                                    AND O.OPT_CD1 = S.OPT_CD1
-		     WHERE G.GOODS_CD = #{goodsCd})
+		     WHERE G.GOODS_CD = #{goodsCd}
 		     AND G.GOODS_TYPE = 'G056_N' -- 일반상품
 		     ORDER BY O.DISP_ORD
 		) Z
@@ -257,8 +264,61 @@
 		ORDER BY DISP_ORD
 	</select>
 	
-	<!-- 상품 옵션2 목록-->
+	<!-- 상품 옵션1 목록 - 자사용 -->
+	<select id="getGoodsOption1List" parameterType="Goods" resultType="GoodsStock">
+		/* TsfGoods.getGoodsOption1List */
+		SELECT *
+		FROM (
+		      SELECT G.GOODS_CD
+		           , G.SELF_GOODS_YN
+		           , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IF(G.SELF_GOODS_YN ='Y', O.OPT_CD1, 'XX') AND DEFAULT_IMG_YN = 'Y') AS SYS_IMG_NM
+		           , O.OPT_CD1
+		           , O.DISP_ORD
+		           , RANK() OVER(PARTITION BY O.GOODS_CD , O.OPT_CD1 ORDER BY O.DISP_ORD) ROWNUM
+		      FROM TB_GOODS G
+		      INNER JOIN TB_OPTION O ON G.GOODS_CD = O.GOODS_CD
+		                             AND O.DISP_YN = 'Y' 
+		      WHERE G.GOODS_CD =  #{goodsCd}
+		      AND G.GOODS_TYPE = 'G056_N' -- 일반상품
+		) A
+		WHERE ROWNUM = 1
+	</select>
+		
+	<!-- 상품 옵션2 목록  - 자사용-->
 	<select id="getGoodsOption2List" parameterType="Goods" resultType="GoodsStock">
+		/* TsfGoods.getGoodsOption2List */
+		SELECT GOODS_CD
+		     , OPT_CD
+		     , OPT_CD1
+		     , OPT_CD2
+		     , ADD_PRICE 
+		     , (CASE WHEN STOCK_QTY - MIN_ORD_QTY >= 0 THEN STOCK_QTY
+		             ELSE 0
+		        END ) AS STOCK_QTY
+		     , SOLDOUT_YN
+		     , DISP_ORD
+		FROM (
+		      SELECT O.GOODS_CD
+		           , O.OPT_CD
+		           , O.OPT_CD1
+		           , O.OPT_CD2
+		           , O.ADD_PRICE 
+		           , VS.CURR_STOCK_QTY AS STOCK_QTY
+		           , O.SOLDOUT_YN
+		           , O.DISP_ORD
+		           , (SELECT MIN_ORD_QTY FROM TB_GOODS WHERE GOODS_CD = O.GOODS_CD ) AS MIN_ORD_QTY
+		      FROM TB_OPTION O 
+		      INNER JOIN VW_STOCK VS ON O.GOODS_CD = VS.GOODS_CD
+		                          AND O.OPT_CD = VS.OPT_CD
+		      WHERE O.GOODS_CD = #{goodsCd}
+		      AND O.OPT_CD1 = #{colorCd}
+		      AND O.DISP_YN = 'Y'
+		     ) B
+		ORDER BY DISP_ORD
+	</select>
+	
+	<!-- 상품 옵션2 목록  - 자사용-->
+	<select id="getGoodsOption2List_ORG" parameterType="Goods" resultType="GoodsStock">
 		/* TsfGoods.getGoodsOption2List */
 		SELECT GOODS_CD
 		     , OPT_CD
@@ -282,23 +342,14 @@
 		               , OPT_CD
 		               , OPT_CD1
 		               , OPT_CD2
-		               , STOCK_QTY
+		               , CURR_STOCK_QTY AS STOCK_QTY
 		               , SOLDOUT_YN
 		               , DISP_ORD
 		               , (SELECT MIN_ORD_QTY FROM TB_GOODS WHERE GOODS_CD = A.GOODS_CD ) AS MIN_ORD_QTY
-		          FROM (
-		                SELECT GOODS_CD
-		                     , OPT_CD
-		                     , OPT_CD1
-		                     , OPT_CD2
-		                     , CURR_STOCK_QTY AS STOCK_QTY
-		                     , SOLDOUT_YN
-		                     , DISP_ORD
-		                FROM VW_STOCK
-		                WHERE GOODS_CD = #{goodsCd}
-		                AND DISP_YN ='Y'
-		                AND OPT_CD2 IS NOT NULL
-		               ) A
+		          FROM VW_STOCK A
+		          WHERE GOODS_CD = #{goodsCd}
+		          AND COLOR = #{colorCd}
+		          AND DISP_YN = 'Y'
 		        ) B
 		     ) Z
 		WHERE 1 = 1
@@ -346,7 +397,7 @@
 	</select>
 		
 	<!-- 상품 이미지 정보 -->
-	<select id="getGoodsImgList" parameterType="String" resultType="GoodsImg">
+	<select id="getGoodsImgList" parameterType="Goods" resultType="GoodsImg">
 		/* TsfGoods.getGoodsImgList */
 		SELECT GOODS_CD
 		     , COLOR_CD
@@ -356,6 +407,7 @@
 		     , MOUSEOVER_IMG_YN
 		FROM TB_GOODS_IMG
 		WHERE GOODS_CD = #{goodsCd}
+		AND COLOR_CD = #{colorCd}
 		ORDER BY DISP_ORD
 	</select>
 	
@@ -514,93 +566,76 @@
 		LIMIT 1
 	</select>
 	
-	<!-- 룩북 베너 목록 조회 -->
-	<select id="getLookbookBannerList" parameterType="Lookbook" resultType="Lookbook">
-		/* TsfGoods.getLookbookBannerList */
-		SELECT A.LOOKBOOK_SQ
-		     , A.BRAND_CD
-		     , A.TITLE
-		     , B.LOOKBOOKB_SQ
-		     , B.SYS_FILE_NM
-		FROM TB_LOOKBOOK A
-		INNER JOIN TB_LOOKBOOK_BANNER B ON A.LOOKBOOK_SQ = B.LOOKBOOK_SQ 
-			                            AND B.DISP_YN = 'Y'
-			                            AND B.LOOKBOOKB_SQ IN (SELECT LOOKBOOKB_SQ FROM TB_LOOKBOOK_GOODS WHERE  GOODS_CD = #{goodsCd} AND DEL_YN  ='N')
-		WHERE NOW() BETWEEN A.DISP_STDT AND A.DISP_EDDT
-		AND A.DISP_YN  = 'Y'
-		ORDER BY A.DISP_ORD, B.DISP_ORD
+	<!-- 상품 사이즈 선택 시 재고수량 가져오기 -->
+	<select id="getGoodsStockQty"  parameterType="GoodsStock" resultType="int">
+		/* TsfGoods.getGoodsStockQty */
+		SELECT (CASE WHEN STOCK_QTY - MIN_ORD_QTY >= 0 THEN STOCK_QTY
+		        END ) AS STOCK_QTY
+		FROM ( 
+		    SELECT CASE WHEN A.SOLDOUT_YN = 'Y' THEN 0
+		                ELSE A.CURR_STOCK_QTY
+		           END AS STOCK_QTY
+		           , B.MIN_ORD_QTY
+		    FROM  VW_STOCK A
+		    INNER JOIN TB_GOODS B ON A.GOODS_CD = B.GOODS_CD
+		    WHERE A.GOODS_CD = #{goodsCd}
+		    AND A.OPT_CD = #{optCd}
+		) Z
 	</select>
 	
-	<!-- 룩북 베너 상품 목록 조회 -->
-	<select id="getLookbookBannerGoodsList" parameterType="Lookbook" resultType="Lookbook">
-		/* TsfGoods.getLookbookBannerGoodsList */
-		SELECT Z.*
-		     , 100 - ROUND((CURR_PRICE / LIST_PRICE) * 100 ,0) AS DC_RATE
-		FROM (
-		      SELECT A.LOOKBOOK_SQ
-		           , B.LOOKBOOKB_SQ 
-		           , C.GOODS_CD 
-		           , RANK() OVER(PARTITION BY A.LOOKBOOK_SQ, B.LOOKBOOKB_SQ  ORDER BY C.DISP_ORD ) RNUM 
-		           , C.DISP_ORD 
-		           , G.GOODS_NM
-		           , CONCAT(IF(IFNULL(G.GOODS_GB,'') IN ('G073_11','G073_15', ''), '',IFNULL(CONCAT('[',FN_GET_CODE_NM('G073',G.GOODS_GB),']'),'') )
-		                   ,IF(G.FOREIGN_BUY_YN='N','[해외구매대행]','' )
-		                   ,IF(G.PARALLEL_IMPORT_YN = 'Y','[병행수입]','')
-		                   ,IF(G.ORDER_MADE_YN='Y','[주문제작]','')
-		                   ,G.GOODS_NM ) AS GOODS_FULL_NM
-		          , G.GOODS_STAT
-		          , G.MIN_ORD_QTY 
-		          , (CASE WHEN D.DISP_NM_LANG = 'EN' THEN D.BRAND_ENM ELSE D.BRAND_KNM END) AS BRAND_NM
-		          , G.LIST_PRICE
-		          , FN_GET_BENEFIT_PRICE(#{frontGb},G.GOODS_CD, G.CURR_PRICE,#{custGb}) AS CURR_PRICE
-		          , G.MAIN_COLOR_CD
-		          , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IFNULL(G.MAIN_COLOR_CD,'00') AND DEFAULT_IMG_YN = 'Y') AS SYS_IMG_NM
-		          , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IFNULL(G.MAIN_COLOR_CD,'00') AND MOUSEOVER_IMG_YN = 'Y') AS SYS_IMG_NM2
-		          , S.STOCK_QTY
-		          , S.SOLDOUT_YN
-		          , V.VIDEO_GB_M
-		          , V.VIDEO_VAL_M
-		          , V.VIDEO_GB_S
-		          , V.VIDEO_VAL_S
-		      FROM TB_LOOKBOOK A
-		      INNER JOIN TB_LOOKBOOK_BANNER B ON A.LOOKBOOK_SQ = B.LOOKBOOK_SQ 
-		                                      AND B.DISP_YN = 'Y'
-		                                      AND B.LOOKBOOKB_SQ = #{lookbookbSq}
-		      INNER JOIN TB_LOOKBOOK_GOODS C ON B.LOOKBOOKB_SQ  = C.LOOKBOOKB_SQ 
-		      INNER JOIN TB_GOODS G ON C.GOODS_CD = G.GOODS_CD
-		                            AND G.GOODS_STAT = 'G008_90'
-		      INNER JOIN TB_BRAND D ON G.BRAND_CD = D.BRAND_CD
-		                    AND D.USE_YN = 'Y'
-		      LEFT OUTER JOIN (SELECT GOODS_CD
-		                            , SUM(CASE WHEN SOLDOUT_YN = 'Y' THEN 0
-		                                       ELSE CURR_STOCK_QTY
-		                                       END) AS STOCK_QTY
-		                            , MIN(SOLDOUT_YN) AS SOLDOUT_YN
-		                       FROM VW_STOCK
-		                       WHERE DISP_YN = 'Y'
-		                       GROUP BY GOODS_CD) S ON G.GOODS_CD = S.GOODS_CD
-		      LEFT OUTER JOIN (SELECT MAX(GOODS_CD) AS GOODS_CD 
-		                             , MAX(CASE WHEN  RNUM = 1 THEN  VIDEO_GB END) AS  VIDEO_GB_M
-		                             , MAX(CASE WHEN  RNUM = 1 THEN  VIDEO_VAL END) AS  VIDEO_VAL_M
-		                             , MAX(CASE WHEN  RNUM = 2 THEN  VIDEO_GB END) AS  VIDEO_GB_S
-		                             , MAX(CASE WHEN  RNUM = 2 THEN  VIDEO_VAL END) AS  VIDEO_VAL_S
-		                       FROM (
-		                             SELECT A.DISPLOC_VAL AS GOODS_CD
-		                                  , B.VIDEO_GB 
-		                                  , B.VIDEO_VAL 
-		                                  , A.REG_DT 
-		                                  , RANK() OVER(PARTITION BY A.DISPLOC_VAL ORDER BY A.REG_DT ) RNUM 
-		                             FROM TB_VIDEO_DISPLOC  A
-		                             INNER JOIN  TB_VIDEO B ON A.VIDEO_SQ = B.VIDEO_SQ 
-		                                                    AND B.DISP_YN ='Y'
-		                             WHERE A.DISPLOC_GB ='G'
-		                             AND A.DISP_YN = 'Y'
-		                            ) V
-		                       ) V ON G.GOODS_CD = V.GOODS_CD
-		      WHERE NOW() BETWEEN A.DISP_STDT AND A.DISP_EDDT
-		      AND A.DISP_YN  = 'Y'
-		      AND A.LOOKBOOK_SQ = #{lookbookSq}
-		) Z
+	<!-- 상품  공지 목록  -->
+	<select id="getGoodsNoticeList"  parameterType="Goods" resultType="Notice">
+		/* TsfGoods.getGoodsNoticeList */
+		SELECT A.NOTICE_SQ
+		     , A.NOTICE_TYPE
+		     , A.NOTICE_TITLE
+		     , A.NOTICE_CONTENT
+		     , DATE_FORMAT(A.NOTICE_STDT,'%Y-%m-%d')  AS NOTICE_STDT 
+		     , DATE_FORMAT(A.NOTICE_EDDT,'%Y-%m-%d')  AS NOTICE_EDDT 
+		     , A.USE_YN
+		FROM   TB_NOTICE A
+		INNER JOIN TB_NOTICE_GOODS B ON A.NOTICE_SQ = B.NOTICE_SQ
+		                             AND B.GOODS_CD = 'CNW1XAPT32'
+		WHERE  A.NOTICE_TYPE = 'G047_30'
+		AND NOW() BETWEEN A.NOTICE_STDT AND A.NOTICE_EDDT
+		AND A.USE_YN  = 'Y'
+		ORDER  BY A.NOTICE_SQ DESC
+	</select>
+	
+	<!-- 상품  안전인증 정보  -->
+	<select id="getGoodsSafeNo"  parameterType="Goods" resultType="GoodsSafeNo">
+		/* TsfGoods.getGoodsSafeNo */
+		SELECT GOODS_CD
+		     , CERT_NUM
+		     , CERT_STATE
+		     , CERT_DIV
+		     , CERT_DT
+		FROM   TB_GOODS_SAFE_NO A
+		WHERE GOODS_CD = #{goodsCd}
+	</select>
+	
+	<!-- 상품  배송안내정보  -->
+	<select id="getGoodsDeliveryInfo"  parameterType="String" resultType="Delivery">
+		/* TsfGoods.getGoodsDeliveryInfo */
+		SELECT G.GOODS_CD 
+		     , A.DELV_FEE_CD 
+		     , A.SUPPLY_COMP_CD 
+		     , A.DELV_FEE 
+		     , A.MIN_ORD_AMT 
+		     , A.RTN_DELV_FEE 
+		     , B.RTN_LOC_ZIPCODE
+		     , B.RTN_LOC_BASE_ADDR
+		     , B.RTN_LOC_DTL_ADDR
+		     , B.RTN_LOC_TELNO
+		     , S.NOTE
+		FROM TB_GOODS G
+		INNER JOIN TB_SUPPLY_COMPANY S ON G.SUPPLY_COMP_CD = S.SUPPLY_COMP_CD
+		INNER JOIN TB_DELV_FEE_POLICY A ON G.DELV_FEE_CD = A.DELV_FEE_CD
+		LEFT OUTER JOIN TB_DELIVERY_LOC B ON A.SUPPLY_COMP_CD = B.SUPPLY_COMP_CD 
+		                                  AND B.USE_YN = 'Y'
+		WHERE G.GOODS_CD = #{goodsCd}
+		ORDER BY A.DELV_FEE_CD 
+		LIMIT 1
 	</select>
 	
 </mapper>

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

@@ -12,6 +12,7 @@
 		     , CUST_GB                                          /*고객구분*/
 		     , FN_GET_CODE_NM('G100',CUST_GB) AS CUST_GB_NM     /*고객구분명*/
 		     , CUST_STAT                                        /*회원상태*/
+		     , CELL_PHNNO                                       /*휴대전화번호*/
 		     , EMAIL                                            /*이메일*/
 		     , #{snsType}                     AS SNS_TYPE       /*SNS유형*/
 		     , #{snsId}                       AS SNS_ID         /*SNS가입ID*/

+ 98 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsfPlanning.xml

@@ -14,6 +14,104 @@
 		WHERE  NUMB BETWEEN #{pageable.startRow} AND #{pageable.endRow}
 	</sql>
 	
+	<select id="getPlanCate1" resultType="Cate4Srch" parameterType="Cate4Srch">
+		/* TsfPlanning.getPlanCate1 */
+		SELECT CATE1_NO 
+      		  ,CATE1_NM 
+		      ,CATE_GB 
+		      ,CATE_TYPE 
+		      ,CONTENTS_LOC 
+		      ,FORMAL_GB 
+		      ,DISP_ORD 
+		      ,DISP_YN 
+	   FROM TB_CATE1
+	   WHERE 1=1
+	   	<if test="cate1No != null and cate1No != ''">
+	   	AND CATE1_NO = #{cate1No}
+	   	</if>
+	</select>
+	
+	<select id="getPlanAllCount" resultType="int" parameterType="Plan">
+		/* TsfPlanning.getPlanAllCount */
+		SELECT COUNT(*) AS CNT
+		FROM TB_PLAN P  
+		WHERE 1=1
+		   AND P.DEL_YN = 'N'
+		   <if test="cateNo != null and cateNo != ''">
+		   AND P.PLAN_SQ IN (
+		   						SELECT PLAN_SQ 
+		   						FROM TB_PLAN_CATE 
+		   						WHERE CATE_NO = #{cateNo}
+		   					)
+		   </if>
+		    AND NOW() BETWEEN P.DISP_STDT AND P.DISP_EDDT
+		    AND P.FRONT_GB IN (#{frontGb}, 'A')
+	</select>
+	
+	<!-- 기획전 목록 -->
+	<select id="getPlanList" parameterType="Plan" resultType="Plan">
+		/* TsfPlanning.getPlanList */
+		SELECT P1.PLAN_SQ 
+		      ,P1.PLAN_NM 
+		      ,P1.DTL_TITLE1 
+		      ,P1.PLAN_GB 
+		      ,P1.FRONT_GB 
+		      ,P1.MAIN_PIMG 
+		      ,P1.MAIN_MIMG 
+		      ,P1.DISP_ORD
+		      ,P1.NEW_PLAN
+		      ,P1.DISP_STDT
+		      ,P1.DISP_EDDT
+		      ,P1.REG_NO 
+		      ,P2.BRAND
+		      ,P2.CNT
+		FROM 
+		(
+			SELECT P.PLAN_SQ 
+			      ,P.PLAN_NM 
+			      ,P.DTL_TITLE1 
+			      ,P.PLAN_GB 
+			      ,P.FRONT_GB 
+			      ,P.MAIN_PIMG 
+			      ,P.MAIN_MIMG 
+			      ,P.DISP_ORD 
+			      ,P.REG_NO 
+			      ,CASE WHEN DATE(P.REG_DT) BETWEEN DATE_ADD(NOW(),INTERVAL -3 DAY ) AND NOW() THEN 'NEW' END AS 'NEW_PLAN'   /*등록일 기준 3일 */
+			      ,P.DISP_EDDT 
+			      ,P.DISP_STDT 
+			      ,P.DEL_YN 
+			FROM TB_PLAN P
+			GROUP BY  P.PLAN_SQ 
+			      ,P.PLAN_NM 
+			      ,P.DTL_TITLE1 
+			      ,P.PLAN_GB 
+			      ,P.FRONT_GB 
+			      ,P.MAIN_PIMG 
+			      ,P.MAIN_MIMG 
+			      ,P.DISP_ORD 
+			      ,P.REG_NO
+		)P1 INNER JOIN (
+						SELECT  PB.PLAN_SQ 
+						      , COUNT(PLAN_SQ) AS CNT
+						      ,CASE WHEN COUNT(PLAN_SQ) = 1 THEN MAX(TBG.BRAND_GROUP_KNM) ELSE MAX(TBG.BRAND_GROUP_KNM)END AS BRAND
+						FROM TB_PLAN_BRAND PB INNER JOIN TB_BRAND_GROUP TBG  ON PB.BRAND_GROUP_NO = TBG.BRAND_GROUP_NO
+						GROUP BY PB.PLAN_SQ
+						)P2 ON P1.PLAN_SQ = P2.PLAN_SQ
+		WHERE 1=1
+		  AND P1.DEL_YN = 'N'
+		  AND P1.PLAN_GB = 'P'
+		  AND NOW() BETWEEN P1.DISP_STDT AND P1.DISP_EDDT
+		  AND P1.FRONT_GB IN (#{frontGb}, 'A')
+		  AND P1.PLAN_SQ IN (
+				   						SELECT PLAN_SQ 
+				   						FROM TB_PLAN_CATE 
+				   						 <if test="cateNo != null and cateNo != ''">
+				   						WHERE CATE_NO = #{cateNo}
+				   						</if>
+				   					)
+		ORDER BY P1.NEW_PLAN DESC, ABS(DATEDIFF(P1.DISP_EDDT,NOW())) 
+	</select>
+	
 	
 
 </mapper>

+ 10 - 4
src/main/resources/config/application-locd.yml

@@ -57,16 +57,22 @@ download.path: /WIDE/workspace/files/data
 # PG
 pg:
     kcp:
-        log.dir: D:\\WIDE\\workspace\\webapps\\style24\\STYLE24\\style24.front\\src\\main\\webapp\\logs
+        log.dir: D:\\WIDE\\workspace\\files\\data\\style24\\logs\\front
+        user.type: PGNW
         gw:
             url: testpaygw.kcp.co.kr
             port: 8090
+        pa:
+            url: testpaygw.kcp.co.kr
+            port: 8090
         js.url: https://testpay.kcp.co.kr/plugin/payplus_web.jsp
         server: false
         site:
-            cd: T0007
-            key: 4Ho4YsuOZlLXUZUdOxM1Q7X__
+            id: T0000
+            cd: T0000
+            key: 3grptw1.zW0GSo4PQdaGvsF__
             name: KCP TEST SHOP
         log.level: 3
         module.type: 01
-        tx.mode: 0
+        tx.mode: 0
+

+ 1 - 1
src/main/resources/config/application-tsit.yml

@@ -20,7 +20,7 @@ logging:
 
 domain:
     admin: //tdadmin.style24.com
-    front: //tdfront.style24.com
+    front: //http://ts5000.ipdisk.co.kr/
     style24: //tdfront.style24.com
     image: //tdimage.style24.com
     cdnimage: //tdimage.style24.com

+ 3 - 0
src/main/resources/config/application.yml

@@ -70,6 +70,9 @@ kakao:
     authorizeUrl: https://kauth.kakao.com/oauth/authorize
     unlinkUrl : https://kapi.kakao.com/v1/user/unlink
     paymentReadyUrl : https://kapi.kakao.com/v1/payment/ready
+    approvePaymentUrl : https://kapi.kakao.com/v1/payment/approve
+    paymentOrderUrl : https://kapi.kakao.com/v1/payment/order
+    cancelPaymentUrl : https://kapi.kakao.com/v1/payment/cancel
 
 # SPEEDY Image Upload
 speedy:

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

@@ -81,7 +81,7 @@
 								</div>
 								<div class="ui_foot">
 									<div class="ui_row">
-										<ul class="pageNav">
+										<ul class="pageNav" id="pageNav">
 										</ul>
 									</div>
 								</div>

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

@@ -70,7 +70,7 @@
 								</div>
 								<div class="ui_foot">
 									<div class="ui_row">
-										<ul class="pageNav">
+										<ul class="pageNav" id="pageNav">
 										</ul>
 									</div>
 								</div>
@@ -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.questTitle + '</span>\n';
+				tag += '					<span>' + item.questContent + '</span>\n';
 				tag += '				</div>\n';
 				tag += '				<span class="data">' + item.questDt + '</span>\n';
 				tag += '			</div>\n';

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

@@ -49,7 +49,7 @@
 								</div>
 								<div class="ui_foot">
 									<div class="ui_row">
-										<ul class="pageNav">
+										<ul class="pageNav" id="pageNav">
 										</ul>
 									</div>
 								</div>

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

@@ -73,7 +73,7 @@
 								</div>
 								<div class="ui_foot">
 									<div class="ui_row">
-										<ul class="pageNav">
+										<ul class="pageNav" id="pageNav">
 										</ul>
 									</div>
 								</div>
@@ -87,6 +87,30 @@
 	</div>
 	<!-- // container -->
 	
+	<!-- 문의 이미지 팝업 -->
+	<div class="modal fade cs_pop contact_img_pop" id="contactImgPop" tabindex="-1" role="dialog" aria-labelledby="contactImgLabel" aria-hidden="true">
+		<div class="modal-dialog" role="document">
+			<div class="modal-content">
+				<div class="modal-header sr-only">
+					<h5 class="modal-title" id="contactImgLabel">이미지 상세보기</h5>
+				</div>
+				<div class="modal-body">
+					<div class="pop_cont">
+ 						<div class="swiper-container">
+							<div class="swiper-wrapper">
+								<!-- 이미지 슬라이드 영역 -->
+							</div>
+						</div>
+						<div class="swiper-button-next"></div>
+						<div class="swiper-button-prev"></div>
+						<div class="swiper-pagination"></div>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+	<!-- //문의 이미지 팝업 -->
+	
 	<form id="qnaForm" name="qnaForm" action="#" th:action="@{'/callcenter/onetoone/qna/list'}">
 		<input type="hidden" name="pageNo" value ="1"/>
 		<input type="hidden" name="pageSize" value ="10"/>
@@ -95,6 +119,42 @@
 <script src="/ux/plugins/gaga/gaga.paging.js"></script>
 <script th:inline="javascript">
 /*<![CDATA[*/
+	//슬라이드 - 문의 이미지 팝업
+	var contactPopSwiper = new Swiper('.cs_pop.contact_img_pop .swiper-container', {
+		navigation: {
+			nextEl: '.cs_pop.contact_img_pop .swiper-button-next',
+			prevEl: '.cs_pop.contact_img_pop .swiper-button-prev',
+		},
+		pagination: {
+			el: '.cs_pop.contact_img_pop .swiper-pagination',
+			clickable: true,
+		},
+		observer:true,
+		observeParents: true,
+	});
+	
+	// 팝업 - 문의 이미지 슬라이드
+	$(document).on('click','.contactUs .img_group .thumb_pic',function(e){
+		$("#contactImgPop .swiper-wrapper").empty();
+
+		var popSlideIndex = $(this).index();
+		contactPopSwiper.slideTo(popSlideIndex);
+		contactPopSwiper.update();
+
+		var contactImglength = $('.contactUs .img_group .thumb_pic').length;
+		var popImgHtml = "";
+		for (i = 1; i <= contactImglength; i++) {
+			var contactImg = $(this).find('img');
+			var contactImgSrc = $('.img_group .thumb_pic:nth-child('+i+') img').attr('src');
+			popImgHtml += "<div class='swiper-slide'><div class='pop_img' style='background-image:url("+ contactImgSrc +")'></div></div>";
+		}
+
+		$("#contactImgPop .swiper-wrapper").append(popImgHtml);
+		$('#contactImgPop').modal("show");
+		
+		return false;
+	});
+	
 	$(document).ready(function() {
 		// 고객센터 LNB 설정
 		fnSetCallcenterLnb(2);

+ 28 - 38
src/main/webapp/WEB-INF/views/web/callcenter/OneToOneQnaRegisterFormWeb.html

@@ -41,7 +41,7 @@
 							<div class="sec_body">
 								<div class="t_info blt_dot mb15 light">문의를 남겨 주시면 24시간 이내(토/일/공휴일 제외)에 답변 드릴 수 있도록 최선을 다 하겠습니다.</div>
 								
-								<form class="form_wrap" role="form" name="qnaForm" id="qnaForm" th:action="@{'/onetoone/qna/create'}" method="post">
+								<form class="form_wrap" role="form" name="qnaForm" id="qnaForm" th:action="@{'/callcenter/onetoone/qna/create'}" method="post">
 									<div class="form_field">
 										<label class="ui_col_2 input_label">문의 유형</label>
 										<div class="ui_col_10 form_full">
@@ -82,14 +82,14 @@
 												<!-- 이미지첨부 -->
 												<div class="form_field">
 													<div class="imgUpload">
-														<label for="fileAdd" class="fileAdd">업로드</label>
+														<label for="fileAdd" class="fileAdd">첫번째업로드</label>
 														<input type="file" id="fileAdd" name="file1"/>
-														<input type="hidden" name="fileAddOrgFileNm"/>
-														<input type="hidden" name="fileAddSysFileNm"/>
+														<input type="hidden" name="file1OrgFileNm"/>
+														<input type="hidden" name="file1SysFileNm"/>
 													</div>
 													<div class="imgUpload">
-														<label for="fileAdd" class="fileAdd">업로드</label>
-														<input type="file" id="file2" name="file2"/>
+														<label for="fileAdds" class="fileAdd">두번째업로드</label>
+														<input type="file" id="fileAdds" name="file2"/>
 														<input type="hidden" name="file2OrgFileNm"/>
 														<input type="hidden" name="file2SysFileNm"/>
 													</div>
@@ -106,20 +106,16 @@
 										</div>
 									</div>
 									<div class="form_field">
-										<label class="ui_col_2 input_label">휴대폰</label>
-										<div class="ui_col_10 cellphone">
+										<label class="ui_col_2 input_label">알림톡 수신 여부</label>
+										<div class="ui_col_10 push_agree">
 											<div class="input_wrap">
-												<input type="text" class="form_control" name="cellPhnno" maxlength="13" placeholder="휴대폰 번호를 입력해 주세요." required="required" data-valid-type="cellPhone" data-valid-name="휴대폰번호"/> <!-- 잘못 입력시 클래스명 : err 추가  -->
-												<!-- 알림 신청 체크박스(선택 _ 기본값) -->
-												<div class="ck_box">
-													<input type="hidden" name="smsReqYn"/>
-													<input type="checkbox" name="chkSmsReqYn" value="Y" checked="checked"/>
-													<label for="chkSmsReqYn"><span>알림 신청</span></label>
+												<div>
+													<input type="radio" name="smsReqYn" id="smsReqYn1" value="Y" checked="checked"><label for="smsReqYn1"><span>수신</span></label>
+												</div>
+												<div>
+													<input type="radio" name="smsReqYn" id="smsReqYn2" value="N"><label for="smsReqYn2"><span>미수신</span></label>
 												</div>
 											</div> 
-											<div class="help_block" style="display: none;" id="divCellPhnno">
-												<p class="t_err">휴대폰 번호를 형식에 맞게 정확히 입력해주세요.</p>
-											</div>
 										</div>
 									</div>
 								</form>
@@ -157,7 +153,7 @@
 	
 	// 파일첨부 선택 시
 	$('#fileAdd').on('change', function() { fnChooseFile(this); });
-	$('#file2').on('change', function() { fnChooseFile(this); });
+	$('#fileAdds').on('change', function() { fnChooseFile(this); });
 	
 	var fnChooseFile = function(obj) {
 		// multiple 속성이 있으면 files에는 다수의 객체가 할당됨
@@ -166,16 +162,26 @@
 		if (!gagajf.isNull(file.name)) {
 			var extension = "\.(jpg|jpeg|png)$";
 			if (!(new RegExp(extension, "i")).test(file.name)) {
-				mcxDialog.alert('이미지는 [jpg, jpeg, png] 파일만 가능합니다.');
+				mcxDialog.alertC('이미지는 [jpg, jpeg, png] 파일만 가능합니다.', {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$(obj).parent('.imgUpload').find('.removes').trigger('click');
+					}
+				});
 				return false;
 			}
 		}
 		
 		if (!gagajf.isNull(file.size) && Number(file.size) > 20 * 1000000) {
-			mcxDialog.alert('이미지는 최대 20MB 이하 파일만 가능합니다.');
+			mcxDialog.alertC('이미지는 최대 20MB 이하 파일만 가능합니다.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$(obj).parent('.imgUpload').find('.removes').trigger('click');
+				}
+			});
 			return false;
 		}
-
+		
 		// 파일 업로드
 		gagajf.ajaxFileUpload('/common/file/upload?subDir=/counsel'
 				, file
@@ -193,28 +199,12 @@
 		if (!gagajf.validation('#qnaForm'))
 			return false;
 
-		if (!gagajf.isNull($('#qnaForm input[name=cellPhnno]').val())) {
-			let regexp = /^(01(?:0|1|[6-9])-(?:\d{3}|\d{4})-\d{4})$/;
-			if (!regexp.test($('#qnaForm input[name=cellPhnno]').val())) {
-				$('#qnaForm input[name=cellPhnno]').addClass('err');
-				$('#divCellPhnno').show();
-				$('#qnaForm input[name=cellPhnno]').select();
-				$('#qnaForm input[name=cellPhnno]').focus();
-				return false;
-			}
-		}
-		
-		$('#qnaForm input[name=cellPhnno]').removeClass('err');
-		$('#divCellPhnno').hide();
-		
-		$('#qnaForm input[name=smsReqYn]').val($('#qnaForm input:checkbox[name=chkSmsReqYn]').is(":checked") ? 'Y' : 'N');
-
 		mcxDialog.confirm("저장하시겠습니까?", {
 			cancelBtnText: "취소",
 			sureBtnText: "확인",
 			sureBtnClick: function() {
 				gagajf.ajaxFormSubmit($('#qnaForm').prop('action')
-						, $('#qnaForm')
+						, '#qnaForm'
 						, function() {
 							cfnGoToPage(_PAGE_ONETOONE_QNA);
 						}

+ 1 - 1
src/main/webapp/WEB-INF/views/web/common/fragments/GnbWeb.html

@@ -97,7 +97,7 @@
 				<ul class="bundle" id="nav3">
 					<li class="active" ><a href="#">베스트</a></li>
 					<li><a href="#">핫딜</a></li>
-					<li><a href="#">기획전</a></li>
+					<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_PLANNING_MAIN);" title="기획전 바로가기">기획전</a></li>
 					<li><a href="#">총알배송</a></li>
 					<li><a href="#">아울렛</a></li>
 					<li><a href="#">룩북</a></li>

+ 5 - 2
src/main/webapp/WEB-INF/views/web/common/fragments/HeadWeb.html

@@ -28,11 +28,14 @@
 	<link rel="stylesheet" type="text/css" th:href="@{'/ux/pc/css/common.css?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" href="/ux/pc/css/common.css"/>
 	<link rel="stylesheet" type="text/css" href="/ux/pc/css/jquery-ui.css">
 	<link rel="stylesheet" type="text/css" href="/ux/pc/css/slick.css" />
+	<link rel="stylesheet" type="text/css" href="/ux/pc/css/swiper.min.css" />
 	
-	<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
+	<script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
+	<script src="https://code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
+	<script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.5.0/js/swiper.min.js"></script>
+	<script src="/ux/pc/js/jquery.modal.min.js"></script>
 	<script src="/ux/pc/js/slick.min.js"></script>
 	<script src="/ux/pc/js/jquery-ui.js"></script>
-	<script src="/ux/pc/js/jquery.modal.min.js"></script>
 	<script src="/ux/pc/js/jquery.ui.datepicker.monthyearpicker.js"></script>
 	<script src="/ux/plugins/jquery.serializeObject.min.js"></script>
 	<script src="/ux/plugins/mcxdialog/mcxdialog_ui.js"></script>

+ 22 - 24
src/main/webapp/WEB-INF/views/web/customer/JoinFormWeb.html

@@ -126,14 +126,22 @@
 					<div class="form_field">
 						<label class="input_label sr-only">휴대폰번호</label>
 						<div class="input_wrap form_full">
-							<input type="text" id="cellPhnno" name="cellPhnno" placeholder="휴대폰 인증 해주세요." class="form_control" minlength="10" maxlength="11" required="required" data-valid-type="numeric" data-valid-name="휴대폰"/>
+							<input type="text" id="cellPhnno" name="cellPhnno" placeholder="휴대폰 인증 해주세요." class="form_control" minlength="10" maxlength="11" required="required" data-valid-type="numeric" data-valid-name="휴대폰" readonly="readonly"/>
 							<!-- case (휴대폰번호 형식이 맞지 않을경우,이미 가입되어있는 핸드폰번호일경우) -->
 							<div class="help_block">
 								<!-- 휴대폰번호 형식이 맞지 않을경우 -->
 								<p id="failPhnno" class="t_err hide">휴대폰번호를 형식에 맞게 정확히 입력해주세요</p>
 								<!-- //휴대폰번호 형식이 맞지 않을경우 -->
 								<!-- 이미 가입되어있는 핸드폰번호일경우 -->
-								<p id="dupPhnno" class="t_err hide">I***D로 가입된 핸드폰 번호 입니다.</p>
+								<p id="dupPhnno" class="t_err hide">I***D로 가입한 이력이 있습니다.</p>
+								<div id="dupPhnnoDiv" class="mt20 hide">
+									<button type="button" class="btn btn_default btn_sm" onclick="cfnGoToPage(_PAGE_LOGIN);">
+										<span>로그인</span>
+									</button>
+									<button type="button" class="btn btn_default btn_sm" onclick="cfnGoToPage(_PAGE_CUSTOMER_ID_FIND);">
+										<span>아이디 찾기</span>
+									</button>
+								</div>
 								<div class="mt20">
 									<button type="button" id="btnCellPhoneCertify" class="btn btn_default btn_sm">
 										<span>휴대폰 인증</span>
@@ -168,7 +176,6 @@
 	let custIdCheck = false;
 	let passwdCheck = false;
 	let emailCheck = false;
-	let phoneCheck = false;
 	let authCheck = false;
 
 	// 아이디 확인
@@ -364,23 +371,6 @@
 		}
 	});
 
-	// 휴대폰 번호 입력에대한 결과
-	var fnPhoneConfirmCallBack = function (result) {
-		// const $cellPhnno = $('#cellPhnno');
-		const $dupPhnno = $('#dupPhnno');
-		if (result.isFind) { // 가입된 고객 정보가 있으면
-			$dupPhnno.text(result.maskingCustId+'로 가입된 핸드폰 번호 입니다.');
-			$dupPhnno.show();
-			// $cellPhnno.text(result.cellPhnno);
-			// $cellPhnno.show();
-			phoneCheck = false;
-		} else {
-			$dupPhnno.hide();
-			phoneCheck = true;
-		}
-		fnPossibleJoin();
-	};
-	
 
 	//휴대폰 인증
 	$('#btnCellPhoneCertify').on('click', function () {
@@ -399,16 +389,24 @@
 
 	// 본인인증 후 결과
 	var fnInfoConfirmCallBack = function (result) {
-		// const $cellPhnno = $('#cellPhnno');
+		const $cellPhnno = $('#cellPhnno');
 		const $dupPhnno = $('#dupPhnno');
+		const $dupPhnnoDiv = $('#dupPhnnoDiv');
+		const $btnCellPhoneCertify = $('#btnCellPhoneCertify');
+		$cellPhnno.val(result.cellPhnno);
+
 		if (result.isFind) { // 가입된 고객 정보가 있으면
 			$dupPhnno.text(result.maskingCustId+'로 가입된 이력이 있습니다.');
 			$dupPhnno.show();
-			// $cellPhnno.text(result.cellPhnno);
-			// $cellPhnno.show();
+			$dupPhnnoDiv.show();
+			$btnCellPhoneCertify.text('휴대폰 인증');
+			$btnCellPhoneCertify.attr('disabled', false);
 			authCheck = false;
 		} else {
 			$dupPhnno.hide();
+			$dupPhnnoDiv.hide();
+			$btnCellPhoneCertify.text('인증완료');
+			$btnCellPhoneCertify.attr('disabled', true);
 			authCheck = true;
 		}
 		fnPossibleJoin();
@@ -435,7 +433,7 @@
 	// 가입 가능한지 확인
 	var fnPossibleJoin = function () {
 		const $btnJoin = $('#btnJoin');
-		if (custIdCheck && passwdCheck && emailCheck && phoneCheck && authCheck ) {
+		if (custIdCheck && passwdCheck && emailCheck && authCheck ) {
 			$btnJoin.attr('disabled', false);
 		} else {
 			$btnJoin.attr('disabled', true);

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

@@ -17,7 +17,7 @@
 <div class="modal-dialog" role="document">
 	<div class="modal-content">
 		<div class="modal-header">
-			<h5 class="modal-title" id="bnfCardLabel">카드혜택111111</h5>
+			<h5 class="modal-title" id="bnfCardLabel">카드혜택</h5>
 		</div>
 		<div class="modal-body" th:if="${cardInfoList != null and !cardInfoList.empty}">
 			<div class="pop_cont">
@@ -94,4 +94,5 @@
 		</div>
 	</div>
 </div>	
+<a href="javascript:void(0);" rel="modal:close" onclick="cfCloseLayer('layer_card_benefit')" class="close-modal">Close</a>
 </html>

+ 193 - 0
src/main/webapp/WEB-INF/views/web/goods/GoodsDeliveryFormWeb.html

@@ -0,0 +1,193 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  :GoodsDeliveryFormWeb.html
+ * @desc	: 상품 배송안내 팝업
+ *============================================================================
+ * Wivismall
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE		 AUTHOR	  DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.08   eskim		최초 작성
+ *******************************************************************************
+ -->
+ <div class="full_popup_wrap">
+	<h5 class="sr-only">배송교환반품 안내</h5>
+	<div class="btn_close">
+		<a href="javascript:void(0)" onclick="cfCloseFullLayer('layer_goods_delivery');">닫기버튼</a>
+	</div>
+	<div class="full_pop_header">
+		<!-- 해당 상품 -->
+		<div class="item_prod" th:with="imgGoodsUrl=${@environment.getProperty('upload.goods.view')}, uxImgUrl=${@environment.getProperty('domain.uximage')}">
+			<div class="item_state">
+				<a href="javascript:void(0);" class="itemLink">
+					<div class="itemPic">
+						<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm}">
+					</div>
+					<p class="itemBrand" th:text="${goodsInfo.brandGroupNm}">NBA 키즈</p>
+					<div class="itemName" th:text="${goodsInfo.goodsFullNm}">유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업</div>
+					<p class="itemPrice"><th:block th:text="${#numbers.formatInteger(goodsInfo.currPrice, 0,'COMMA')}"> 134,100</th:block>
+						<span class="itemPrice_original" th:if="${goodsInfo.listPrice > goodsInfo.currPrice}" th:text="${#numbers.formatInteger(goodsInfo.listPrice, 0,'COMMA')}">149,000</span>
+						<span class="itemPercent" th:if="${goodsInfo.dcRate > 0}" th:text="|${#numbers.formatDecimal(goodsInfo.dcRate,0,0)}%|">30%</span>
+					</p>
+				</a>
+			</div>
+		</div>
+		<!-- //해당 상품 -->
+	</div>
+	<div class="full_pop_container">
+		<div class="pd_delivery">
+			<div class="table_box">
+				<h6>배송안내</h6>
+				<div class="tbl type1">
+					<table>
+						<colgroup>
+							<col width="220">
+							<col width="*">
+						</colgroup>
+						<tbody>
+							<tr>
+								<th>
+									구분
+								</th>
+								<td>
+									<th:block th:if="${goodsInfo.quikDelvYn = 'Y'}" >총알배송(오전 10시까지 주문 시)</th:block>
+									<th:block th:unless="${goodsInfo.quikDelvYn = 'Y'}" >일반배송</th:block>
+									
+									 
+								</td>
+							</tr>
+							<tr>
+								<th>
+									배송비
+								</th>
+								<td>
+									<th:block th:text="${#numbers.formatInteger(goodsInfo.delvFee, 0,'COMMA')}" ></th:block>원
+									<th:block th:if="${goodsInfo.minOrdAmt > 0}">(<th:block th:text="${#numbers.formatInteger(goodsInfo.minOrdAmt, 0,'COMMA')}" ></th:block>원 이상 무료배송)</th:block>
+									<th:block  th:if="${goodsInfo.delvFee <= 0}">무료배송</th:block>
+								</td>
+							</tr>
+							<tr>
+								<th>
+									배송업체
+								</th>
+								<td>
+									CJ 대한통운  -- 수정
+								</td>
+							</tr>
+							<tr>
+								<th>
+									기간
+								</th>
+								<td>
+									총알배송  :  오늘 밤 12시까지 도착 (토/일/공휴일 제외)<br>
+									일반배송  :  결제 완료 후 2~3일 이내 (일/공휴일 제외)<br>
+									단, 제주도나 도서 지방은 별도요금이 부과될 수 있습니다. 날씨나 택배사 사정에 따라 배송이 지연될 수 있습니다.
+								</td>
+							</tr>
+						</tbody>
+					</table>
+				</div>
+			</div>
+			<div class="table_box">
+				<h6>반품/교환안내</h6>
+				<div class="tbl type1">
+					<table>
+						<colgroup>
+							<col width="220">
+							<col width="*">
+						</colgroup>
+						<tbody>
+							<tr>
+								<th>
+									반품/교환 배송업체
+								</th>
+								<td>
+									CJ 대한통운  -- 수정
+								</td>
+							</tr>
+							<tr>
+								<th>
+									반품배송비
+								</th>
+								<td>
+									<th:block th:text="${#numbers.formatInteger(deliveryInfo.rtnDelvFee, 0,'COMMA')}" ></th:block>원(최소 배송비가 무료인 경우 왕복 배송비 <th:block th:text="${#numbers.formatInteger((deliveryInfo.rtnDelvFee+deliveryInfo.delvFee), 0,'COMMA')}" ></th:block>원 부과)
+								</td>
+							</tr>
+							<tr>
+								<th>
+									교환배송비
+								</th>
+								<td>
+									<th:block th:text="${#numbers.formatInteger((deliveryInfo.rtnDelvFee+deliveryInfo.delvFee), 0,'COMMA')}" ></th:block>원
+								</td>
+							</tr>
+							<tr>
+								<th>
+									반품/교환 주소
+								</th>
+								<td>
+									<th:block th:text="${deliveryInfo.rtnLocZipcode +' '+ deliveryInfo.rtnLocBaseAddr +' '+ deliveryInfo.rtnLocDtlAddr }"></th:block>
+								</td>
+							</tr>
+							<tr>
+								<th>
+									반품/교환 신청
+								</th>
+								<td>
+									반품/교환시 먼저 고객센터(1544-5336)나 일대일 문의로 반품/교환 신청 후 상품을 발송 해 주시기 바랍니다.<br>
+									마이페이지 > 나의쇼핑 > 정상주문내역에서 하실 수 있습니다.<br>
+									반품/교환 신청시 상품의 반송입고 확인 후 환불/교환 처리해 드립니다.
+								</td>
+							</tr>
+							<tr>
+								<th>
+									반품시기
+								</th>
+								<td>
+									상품의 반품/교환은 상품 수령 후 7일 이내 가능합니다.<br>
+									단 상품을 수령하셨을 때의 상태를 그대로 보존해주셔야 합니다.
+								</td>
+							</tr>
+							<tr>
+								<th>
+									반품/교환 불가사유
+								</th>
+								<td>
+									반품/교환 가능기간을 초과하였을 경우.<br>
+									상품 및 구성품을 분실하였거나 취급 부주의로 인한 파손/고장/오염된 경우.<br>
+									고객님의 요청에 따른 주문제작 상품의 경우.<br>
+									상품을 착용 또는 설치하였거나, 상품의 일부를 소비하였을 경우.<br>
+									상품의 포장을 개봉하여 사용 및 설치가 완료 되거나 상품의 가치가 훼손되었을 경우.<br>
+									구매한 상품의 구성품(세트, 기프트상품, 부속품, 의류부착 악세사리 등) 이 누락 된 경우.<br>
+									신발, 그릇류의 박스포장을 포함, 상품이 판매할 수 없게 훼손 된 경우(신발박스 등의 파손, 박스포장 위 송장 부착, 박스 훼손/파손/찢어짐, 택 분실 등)
+								</td>
+							</tr>
+							<tr th:if="${not #strings.isEmpty(deliveryInfo.note)}">
+								<th>
+									기타사항
+								</th>
+								<td th:utext="${#strings.unescapeJava(#strings.escapeJava(deliveryInfo.note))}">
+									상품에 따라 반송주소/방법이 각각 다를 수 있습니다.<br>
+								</td>
+							</tr>
+						</tbody>
+					</table>
+				</div>
+			</div> 
+		</div>	
+	</div>
+</div>
+<script src="/ux/plugins/gaga/gaga.paging.js"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	
+	
+	
+/*]]>*/
+</script>
+
+ </html>

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 113 - 690
src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html


+ 122 - 0
src/main/webapp/WEB-INF/views/web/goods/GoodsQnaDetailFormWeb.html

@@ -0,0 +1,122 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : GoodsQnaFormDetailWeb.html
+ * @desc    : 상품 문의 등록 팝업
+ *============================================================================
+ * Wivismall
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.05   eskim        최초 작성
+ *******************************************************************************
+ -->
+ <div class="modal-dialog" role="document">
+	<div class="modal-content">
+		<div class="modal-header">
+			<h5 class="modal-title" id="pdQnaWriteLabel">상품 문의하기</h5>
+		</div>
+		<div class="modal-body">
+		<form id="goodsQnaDetailForm" name="goodsQnaDetailForm" action="#" th:action="@{'/callcenter/goods/qna/create'}">
+		<input type="hidden" name="relGoodsCd" th:value ="${goodsCd}"/>
+			<div class="pop_cont">
+				<div class="info_txt">
+					<ul>
+						<li>배송, 주문/결제, 취소/반품/교환/환불, 회원, 쿠폰/포인트, 이벤트 등의 자세한 문의사항은 고객센터 > 1:1문의를 이용하여 주시기 바랍니다.</li>
+						<li>상품문의에 부합하지 않는 광고, 이유없는 비방, 욕설 및 오해의 소지가 있는 문의건에 대해서는 사전 통보 없이 삭제 될 수 있습니다.</li>
+						<li>답변은 마이페이지 > 상품 문의에서 확인 하실 수 있습니다.</li>
+					</ul>
+				</div>
+				<div class="form_field">
+					<div class="input_box">
+						<textarea class="doc_itemqna" name="questContent" id="" cols="30" rows="10" placeholder="문의내용 입력(500자 이내)" style="resize: none;"></textarea>
+						<p class="txt_cnt">
+							<span id="itemqna_cnt" class="itemqna_cnt">(<em class="c_primary">0</em>/500자)</span>
+						</p>			  
+						<div class="secret_box">
+							<input id="wr_secret" type="checkbox" name="secretYn" value="Y"><label for="wr_secret"><span>비밀글설정</span></label>
+						</div>
+					</div> 
+				</div>
+				<div class="push_box">
+					<dl>
+						<div>
+							<dt>알림톡 수신 여부</dt>
+							<dd>
+								<div class="form_field">
+									<div>
+										<input type="radio" name="smsReqYn" id="rdi-push1" value="Y" checked="checked">
+										<label for="rdi-push1"><span>수신</span></label>
+									</div>
+									<div>
+										<input type="radio" name="smsReqYn" id="rdi-push2" value="N">
+										<label for="rdi-push2"><span>미수신</span></label>
+									</div>
+								</div>
+							</dd>
+						</div>
+					</dl>
+				</div>
+			</div>
+		</form>	
+		</div>
+		<div class="modal-footer">
+			<button type="button" class="btn btn_dark" id="btnGoodsQnaSave"><span>등록</span></button>
+		</div>
+	</div>
+</div>
+<a href="javascript:void(0);" rel="modal:close" onclick="cfCloseLayer('layer_goods_qna_reg')" class="close-modal">Close</a> 	
+<script th:inline="javascript">
+/*<![CDATA[*/
+
+	// 상품문의 작성 > 글자수 체크
+	$('.pd_qnawrite_pop .doc_itemqna').keyup(function (e){
+		var contentQna = $(this).val();
+		$('#itemqna_cnt').html("(<em class='c_primary'>"+contentQna.length+"</em>/500자)");  
+		if (contentQna.length > 500){
+			alert("최대 500자까지 입력 가능합니다.");
+			$(this).val(contentQna.substring(0, 500));
+			$('#itemqna_cnt').html("(<em class='c_primary'>500</em>/500자)");
+		}
+	});
+	
+	// 저장
+	$('#btnGoodsQnaSave').on('click', function() {
+		
+		// 테스트용
+/* 		gagajf.ajaxFormSubmit($('#goodsQnaDetailForm').prop('action')
+				, $('#goodsQnaDetailForm')
+				, function() {
+					mcxDialog.alert("상품 문의가 등록되었습니다. 빠른 시일 내에 답변드리겠습니다.");
+				}
+		); */
+		
+		// 입력 값 체크
+		if (gagajf.isNull($("#goodsQnaDetailForm  textarea[name=questContent]").val())){
+			mcxDialog.alert("문의내용을 입력해주세요.");
+			return false;
+		}
+		
+		mcxDialog.confirm("저장하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				gagajf.ajaxFormSubmit($('#goodsQnaDetailForm').prop('action')
+						, $('#goodsQnaDetailForm')
+						, function() {
+							mcxDialog.alert("상품 문의가 등록되었습니다. 빠른 시일 내에 답변드리겠습니다.");
+						}
+				);
+			}
+		});
+	
+	});
+	
+
+
+/*]]>*/
+</script>
+ </html>

+ 166 - 0
src/main/webapp/WEB-INF/views/web/goods/GoodsQnaFormWeb.html

@@ -0,0 +1,166 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : GoodsQnaFormWeb.html
+ * @desc	: 상품 문의 팝업
+ *============================================================================
+ * Wivismall
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE		 AUTHOR	  DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.05   eskim		최초 작성
+ *******************************************************************************
+ -->
+ <div class="full_popup_wrap">
+	<h5 class="sr-only">상품문의</h5>
+	<div class="btn_close">
+		<a href="javascript:void(0)" onclick="cfCloseFullLayer('layer_goods_qna');">닫기버튼</a>
+	</div>
+	<div class="full_pop_header">
+		<!-- 해당 상품 -->
+		<div class="item_prod" th:with="imgGoodsUrl=${@environment.getProperty('upload.goods.view')}, uxImgUrl=${@environment.getProperty('domain.uximage')}">
+			<div class="item_state">
+				<a href="javascript:void(0);" class="itemLink">
+					<div class="itemPic">
+						<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm}">
+					</div>
+					<p class="itemBrand" th:text="${goodsInfo.brandGroupNm}">NBA 키즈</p>
+					<div class="itemName" th:text="${goodsInfo.goodsFullNm}">유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업</div>
+					<p class="itemPrice"><th:block th:text="${#numbers.formatInteger(goodsInfo.currPrice, 0,'COMMA')}"> 134,100</th:block>
+						<span class="itemPrice_original" th:if="${goodsInfo.listPrice > goodsInfo.currPrice}" th:text="${#numbers.formatInteger(goodsInfo.listPrice, 0,'COMMA')}">149,000</span>
+						<span class="itemPercent" th:if="${goodsInfo.dcRate > 0}" th:text="|${#numbers.formatDecimal(goodsInfo.dcRate,0,0)}%|">30%</span>
+					</p>
+				</a>
+			</div>
+		</div>
+		<!-- //해당 상품 -->
+	</div>
+	<div class="full_pop_container">
+		<!-- 상품문의 리스트 내용 -->
+		<div class="pd_qnalist">
+		<form id="goodsQnaForm" name="goodsQnaForm" action="#" th:action="@{'/goods/qna/list'}">
+		<input type="hidden" name="pageNo" value ="1"/>
+		<input type="hidden" name="pageSize" value ="10"/>
+		<input type="hidden" name="relGoodsCd" th:value ="${goodsInfo.goodsCd}"/>
+			<div class="info_txt">
+				<ul>
+					<li>상품에 대해 궁금한 점이 있으시다면 문의해주세요.</li>
+					<li>배송, 주문/결제, 취소/반품/교환/환불, 회원, 쿠폰/포인트, 이벤트 등의 자세한 문의사항은 고객센터 > 1:1문의를 이용하여 주시기 바랍니다.</li>
+				</ul>			  
+				<div class="btn_box">
+					<button type="button" class="btn btn_default" onclick="cfnGoToPage(_PAGE_GOODS_QNA);"><span>고객센터 1:1문의</span></button>
+					<button type="button" class="btn btn_dark" th:onclick="cfGoodsQngCreate([[${goodsInfo.goodsCd}]] )"><span>상품 문의하기</span></button>
+				</div>	 
+			</div>
+			<div class="qna_list">
+				<!-- 나열조건결과 있을 때 노출 내용 -->
+				<div class="form_field">
+					<input id="except_secret" type="checkbox" value="Y" name="secretYn" onclick=""><label for="except_secret"><span>비밀글제외</span></label>
+				</div>
+				<div class="ui_row">
+					<div class="foldGroup case1">
+						<ul id="ulGoodsQna">
+						</ul>
+					</div>
+				</div>
+				<div class="ui_foot">
+					<div class="ui_row">
+						<ul class="pageNav" id="pageNav">
+						</ul>
+					</div>			
+				</div>
+				<!-- //나열조건결과 있을 때 노출 내용 -->
+				<!-- 나열조건결과 없을 때 노출 내용 -->
+				<div class="nodata" style="display:none;">
+					<div class="txt_box">
+						<p>
+							등록된 상품문의가 없습니다.
+						</p>
+					</div>
+				</div>
+				<!-- //나열조건결과 없을 때 노출 내용 -->
+			</div>
+		</form>	
+		</div>
+	</div>
+</div>
+<script src="/ux/plugins/gaga/gaga.paging.js"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	
+	let fnGetList = function() {
+		// Initialize a pagination
+		gagaPaging.init('goodsQnaForm', fnGetListCallback, 'pageNav', 10);
+
+		// Load data
+		gagaPaging.load(1);
+	}
+	
+	var fnGetListCallback = function(result) {
+		$('#ulGoodsQna').html('');
+		$('.nodata').hide();
+		// 목록
+		if (result.dataList != null && result.dataList.length > 0) {
+			
+			$.each(result.dataList, function(idx, item) {
+				let tag = '<li class="'+ (item.selfGb == 1 ? "my_qna" : "") +'">\n';  // <!-- 내가 쓴 글에 클래스 my_qna 추가 -->
+				tag += '	<div class="fold_head">\n';
+				tag += '		<a href="javascript:void(0)">\n';
+				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';
+				if (item.selfGb == 1){
+				tag += '					<i class="ico ico_myqna"></i>\n';	//내가 쓴 글에 추가되는 아이콘
+				}
+				if (item.secretYn == "Y"){
+				tag += '					<i class="ico ico_secret"></i>\n';	//비밀글에 추가되는 아이콘
+				}
+				tag += '				</div>\n';
+				tag += '				<div class="data">\n';
+				tag += '					<span class="wr_id">'+ item.custId+'</span>\n';
+				tag += '					<span class="wr_data">' + item.questDt + '</span>\n';
+				tag += '				</div>\n';
+				tag += '			</div>\n';
+				tag += '		</a>\n';
+				tag += '	</div>\n';
+				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 += '			</div>\n';
+				tag += '		</div>\n';
+				
+				if (item.ansStat == 'G060_20') { // 답변완료 상태일 때
+					tag += '	<div class="fold_answer">\n'; //문의 답변
+					tag += '		<div class="answer_head">답변이 등록되었습니다.</div>\n';
+					tag += '		<div class="answer_body">' + item.ansContent + '</div>\n';
+					tag += '		<span class="data">' + item.ansDt + '</span>\n';
+					tag += '	</div>\n';
+				}
+				
+				tag += '	</div>\n';
+				tag += '</li>\n';
+				
+				$('#ulGoodsQna').append(tag);
+			});
+		} else {
+			$('.nodata').show();
+			$('.ui_foot').hide();
+		}
+
+		// Create pagination
+		gagaPaging.createPagination(result.paging.pageable);
+	}
+	
+	$(document).ready(function() {
+		fnGetList();
+	});
+	
+/*]]>*/
+</script>
+
+ </html>

+ 80 - 0
src/main/webapp/WEB-INF/views/web/order/OrderCustemerInfoWeb.html

@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : OrderCustemerInfoWeb.html
+ * @desc    : 고객정보 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.01   jsh77b     최초 작성
+ *******************************************************************************
+ -->
+<div class="fold_head">
+	<a href="javascript:void(0)">
+		<div>
+			<div class="fold_tit">
+				<span>주문고객</span>
+			</div>
+			<div class="data">
+				<span th:text="${custemerInfo.custNm}"></span>
+				<span th:text="${custemerInfo.email}"></span>
+				<span th:text="${custemerInfo.cellPhnno}"></span>
+			</div>
+		</div>
+	</a>
+</div>
+
+<div class="fold_cont" style="display: none;">
+	<input type="hidden" name="custNm" 		th:value="${custNm}"/>
+	<input type="hidden" name="email" 		th:value="${email}"/>
+	<input type="hidden" name="cellPhnno" 	th:value="${cellPhnno}"/>
+	
+	<div class="area_mbinfo">
+		<dl>
+			<div>
+				<dt>
+					<span class="sr-only">주문자명</span>
+				</dt>
+				<dd th:text="${custemerInfo.custNm}"></dd>
+			</div>
+			<div>
+				<dt>
+					<span class="sr-only">이메일</span>
+				</dt>
+				<dd th:text="${custemerInfo.email}">/dd>
+			</div>
+			<div>
+				<dt>
+					<span class="sr-only">휴대폰 번호</span>
+				</dt>
+				<dd>
+					<span th:text="${custemerInfo.cellPhnno}"></span>
+					<th:block th:if="${custemerInfo.ci} == null or ${custemerInfo.ci} == ''">
+						<button type="button" class="btn_popup" id="">
+							<span>본인인증하기</span>
+						</button>
+					</th:block>
+				</dd>
+			</div>
+		</dl>
+	</div>
+</div>
+
+<script th:inline="javascript">
+var dispYn = [[${order.dispYn}]]; // 노출여부
+
+//컨텐츠 호출
+$(document).ready( function() {
+	// 화면펼침
+	if (dispYn == "Y") {
+		$("#custemerInfo .fold_head").addClass("on");
+		$("#custemerInfo .fold_cont").css("display", "block");
+	}
+});
+</script>
+
+</html>

+ 276 - 0
src/main/webapp/WEB-INF/views/web/order/OrderDcAmtInfoWeb.html

@@ -0,0 +1,276 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : OrderDcAmtInfoWeb.html
+ * @desc    : 할인혜택 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.01   jsh77b     최초 작성
+ *******************************************************************************
+ -->
+<!-- 할인/혜택 사용 -->
+<div class="fold_head">
+	<a href="javascript:void(0)">
+		<div>
+			<div class="fold_tit">
+				<span>할인/혜택 사용</span>
+			</div>
+			<div class="data maxdisc">
+				<div class="form_field">
+					<input id="chk-maxdisc" type="checkbox" checked="">
+					<label for="chk-maxdisc">
+						<span>최대 할인혜택을 바로 적용하세요 <em class="maxdisc_amount"></em></span>
+					</label>
+				</div>
+			</div>
+		</div>
+	</a>
+</div>
+<div class="fold_cont" style="display: none;">
+	<div class="area_seldiscount">
+		<dl>
+			<div>
+				<dt><span class="mid">할인코드</span></dt>
+				<dd>
+					<div class="form_field">
+						<div class="input_wrap">
+							<input type="text" id="serialCpnNm" class="form_control" maxlength="13" placeholder="할인코드를 입력해주세요.">
+							<button type="button" class="btn btn_dark" onclick="serialCpnApply()">적용</button>
+						</div>
+					</div>
+				</dd>
+			</div>
+			<div>
+				<dt>할인쿠폰</dt>
+				<dd>
+					<a href="javascript:void(0);" class="btn_coupon_toggle">할인쿠폰 <span id="cpnApplyCnt"></span>적용</a>
+					<div class="coupon_list">
+						<ul>
+							<!--  상품쿠폰 -->
+							<th:block th:each="goods, i : ${goodsApplyCpnList}">
+								<th:block th:if="${goods.goodsCpnList.size() > 0}">
+									<li>
+										<div class="coupon">
+											<div class="item_gd">
+												<figure>
+													<span class="thumb"><img src="/images/pc/thumb/tmp_odSide1.jpg" alt=""></span>
+													<figcaption>
+														<div class="brand" th:text="${goods.brandEnm}+' '+${goods.brandKnm}"></div>
+														<div class="name" th:text="${goods.goodsNm}"></div>
+														<div class="price">
+															<th:block th:if="${goods.tmtbDcAmt} > 0">
+																<span class="selling_price"  th:text="${#numbers.formatInteger(goods.tmtbDcAmt, 1, 'COMMA')}"></span>
+															</th:block>
+															<th:block th:if="${goods.tmtbDcAmt} < 1">
+																<span class="selling_price"  th:text="${#numbers.formatInteger(goods.currPrice, 1, 'COMMA')}"></span>
+															</th:block>
+														</div>
+													</figcaption>
+												</figure>
+											</div>
+											 
+											<div class="form_field">
+												<div class="select_custom type1">
+													<div class="combo">
+														<input type="hidden" name="cpnType" value="goodsCpn"/>
+														<input type="hidden" name="cpnCartSq" th:value="${goods.cartSq}"/>
+														<input type="hidden" name="custCpnSq" value="0"/>
+														<input type="hidden" name="cpnDcAmt" value="0"/>
+														
+														<div class="select">선택없음</div>
+														<ul class="list">
+															<li value="0">선택없음</li>
+															<th:block th:each="goodsCpn, k : ${goods.goodsCpnList}">
+																<li th:value="${goodsCpn.custCpnSq}" th:data="${goodsCpn.cpnDcAmt}" th:text="${goodsCpn.cpnNm}"></li>
+															</th:block>
+														</ul>
+													</div>
+												</div>
+											</div>
+											<div class="cp_discount" style="display:none;">
+												<span class="cp_amount"></span>
+												<button type="button" class="btn_del_coupon"><span>쿠폰적용해제</span></button>
+											</div>
+										</div>
+									</li>
+								</th:block>
+							</th:block>
+							<!--  상품쿠폰 -->
+
+							<!--  장바구니쿠폰 -->
+							<th:block th:if="${cartCpnList.size() > 0}">
+								<li>
+									<div class="coupon">
+										<div class="form_field">
+											<div class="select_custom type1">
+												<div class="combo">
+													<input type="hidden" name="cpnType" value="cartCpn"/>
+													<input type="hidden" name="custCpnSq" value="0"/>
+													<input type="hidden" name="cpnDcAmt" value="0"/>
+													
+													<div class="select">선택없음</div>
+													<ul class="list">
+														<li value="0">선택없음</li>
+														<th:block th:each="cartCpn, k : ${cartCpnList}">
+															<li th:value="${cartCpn.custCpnSq}" th:data="${cartCpn.cpnDcAmt}">
+																<th:block th:text="${cartCpn.cpnNm}"></th:block>
+																<input type="hidden" name="dcWay" th:value="${cartCpn.dcWay}"/>
+																<input type="hidden" name="dcVal" th:value="${cartCpn.dcVal}"/>
+																<th:block th:each="cartCpnCartSq, kokok : ${cartCpn.cartCpnCartSqArr}"> 
+																	<input type="hidden" name="cartCpnCartSq" th:value="${cartCpnCartSq}" />
+																</th:block>
+															</li>
+														</th:block>
+													</ul>
+												</div>
+											</div>
+										</div>
+										<div class="cp_discount">
+											<span class="cp_amount"></span>
+											<button type="button" class="btn_del_coupon"><span>쿠폰적용해제</span></button>
+										</div>
+									</div>
+								</li>
+							</th:block>
+							<!--  장바구니쿠폰 -->
+							
+							<!--  배송비쿠폰 -->
+							<th:block th:if="${delvCpnList.size() > 0}">
+								<li>
+									<div class="coupon">
+										<div class="form_field">
+											<div class="select_custom type1">
+												<div class="combo">
+													<input type="hidden" name="cpnType" value="delvCpn"/>
+													<input type="hidden" name="custCpnSq" value="0"/>
+													<input type="hidden" name="cpnDcAmt" value="0"/>
+													<input type="hidden" name="delvFeeCd" value="0"/>
+													
+													<div class="select" value="0">선택없음</div>
+													<ul class="list">
+														<li value="0">선택없음</li>
+														<th:block th:each="delvCpn, k : ${delvCpnList}">
+															<li th:value="${delvCpn.custCpnSq}" th:data="${delvCpn.cpnDcAmt}" th:delvfeecd="${delvCpn.delvFeeCd}" th:text="${delvCpn.cpnNm}"></li>
+														</th:block>
+													</ul>
+												</div>
+											</div>
+										</div>
+										<div class="cp_discount">
+											<span class="cp_amount"></span>
+											<button type="button" class="btn_del_coupon"><span>쿠폰적용해제</span></button>
+										</div>
+									</div>
+								</li>
+							</th:block>
+							<!--  배송비쿠폰 -->
+						</ul>
+					</div>
+				</dd>
+			</div>
+		</dl>
+	</div>
+	
+	<!-- 선포인트금액, 포인트금액, 상품권금액 0보다 클때 적용 -->
+	<th:block th:if="${prePntDcAmt} > 0 or ${rmPntAmt} > 0 or ${rmGfcdAmt} > 0">
+		<div class="area_selpoint">
+			<dl>
+				<th:block th:if="${prePntDcAmt} > 0">
+					<div>
+						<dt>선 포인트 사용</dt>
+						<dd>
+							<div class="form_field">
+								<input type="hidden" name="rmPrePntAmt" th:value="${prePntDcAmt}"/>
+								<div>
+									<input type="radio" name="rdi-beforpoint" id="rdi-beforpoint1" value="N"> 
+									<label for="rdi-beforpoint1"><span>사용 안함</span></label>
+								</div>
+								<div>
+									<input type="radio" name="rdi-beforpoint" id="rdi-beforpoint2" value="Y"> 
+									<label for="rdi-beforpoint2"><span>사용함</span></label> 
+									<span class="remain_point" th:text="|사용가능 포인트 : ${#numbers.formatInteger(prePntDcAmt, 1, 'COMMA')} P|"></span>
+								</div>
+							</div>
+						</dd>
+					</div>
+				</th:block>
+				<th:block th:if="${rmPntAmt} > 0">
+					<div>
+						<dt>
+							<span class="mid">스타일 포인트</span>
+						</dt>
+						<dd>
+							<div class="form_field">
+								<input type="hidden" name="rmPntAmt" th:value="${rmPntAmt}"/>
+								<!-- 스타일 포인트 3만원 이상 결제시 노출 -->
+								<th:block th:if="${orgGoodsSumAmt} >= 30000">
+									<div class="input_wrap">
+										<input type="text" name="pntDcAmtStr" class="form_control" maxlength="" placeholder="사용할 포인트를 입력해주세요.">
+										<button type="button" class="btn btn_dark" id="btn_point_apply">적용</button>
+									</div>
+									<p><span class="remain_point rmPntAmt" th:text="|보유 : ${#numbers.formatInteger(rmPntAmt, 1, 'COMMA')} P|"></span>(결제금액의 최대 40%까지 사용가능)</p>
+								</th:block>
+								<!-- 스타일 포인트 3만원 이상 결제시 노출 -->
+								
+								<!-- 스타일 포인트 3만원 미만 결제시 노출 -->
+								<th:block th:if="${orgGoodsSumAmt} < 30000">
+									<div class="input_wrap">
+										<input type="text" class="form_control" maxlength="" placeholder="3만원 이상 결제시에만 포인트 사용이 가능합니다." disabled>
+									</div>
+								</th:block>
+							</div>
+						</dd>
+					</div>
+				</th:block>
+				<th:block th:if="${rmGfcdAmt} > 0">
+					<div>
+						<dt>
+							<span class="mid">상품권</span>
+						</dt>
+						<dd>
+							<div class="form_field">
+								<input type="hidden" name="rmGfcdAmt" th:value="${rmGfcdAmt}"/>
+								<div class="input_wrap">
+									<input type="text" name="gfcdUseAmtStr" class="form_control" maxlength="" placeholder="사용할 금액을 입력해주세요.">
+									<button type="button" class="btn btn_dark" id="btn_gfcd_apply">적용</button>
+								</div>
+								<p><span class="remain_point" th:text="|보유 : ${#numbers.formatInteger(rmGfcdAmt, 1, 'COMMA')} 원|"></span></p>
+								<div class="agree_receipt">
+									<input id="chk-receipt" type="checkbox"> 
+									<label for="chk-receipt"><span>상품권 현금영수증 신청</span></label>
+									<div class="info_box">
+										<div class="input_wrap">
+											<input type="text" class="form_control" maxlength="11" placeholder="">
+										</div>
+									</div>
+								</div>
+							</div>
+						</dd>
+					</div>
+				</th:block>
+			</dl>
+		</div>
+	</th:block>
+</div> <!-- //할인/혜택 사용 -->
+
+<script th:inline="javascript">
+var dispYn = [[${order.dispYn}]]; // 노출여부
+
+//컨텐츠 호출
+$(document).ready( function() {
+	// 화면펼침
+	if (dispYn == "Y") {
+		$("#dcAmtInfo .fold_head").addClass("on");
+		$("#dcAmtInfo .fold_cont").css("display", "block");
+
+		$("#dcAmtInfo .fold_cont .btn_coupon_toggle").addClass("on");
+		$("#dcAmtInfo .fold_cont .coupon_list").css("display", "block");
+	}
+});
+</script>
+</html>

+ 162 - 0
src/main/webapp/WEB-INF/views/web/order/OrderDeliveryAddrInfoWeb.html

@@ -0,0 +1,162 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : OrderDeliveryAddrInfoWeb.html
+ * @desc    : 배송정보 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.01   jsh77b     최초 작성
+ *******************************************************************************
+ -->
+<!-- 배송지정보 -->
+<input type="hidden" name="delvMemo" th:value="${deliveryAddrInfo.delvMemo}">
+<div class="fold_head">
+	<a href="javascript:void(0)">
+		<div>
+			<div class="fold_tit">
+				<span>배송지 정보</span>
+			</div>
+			<div class="data" th:text="${deliveryAddrInfo.recipBaseAddr} + ${deliveryAddrInfo.recipDtlAddr}"></div>
+		</div>
+	</a>
+</div>
+
+<div class="fold_cont" style="display: none;">
+	<div class="area_mbinfo">
+		<input type="hidden" name="recipZipcode" 	th:value="${deliveryAddrInfo.recipZipcode}"/>
+		<input type="hidden" name="recipBaseAddr" 	th:value="${deliveryAddrInfo.recipBaseAddr}"/>
+		<input type="hidden" name="recipDtlAddr" 	th:value="${deliveryAddrInfo.recipDtlAddr}"/>
+		<input type="hidden" name="delvMemo" 		th:value="${deliveryAddrInfo.delvMemo}"/>
+		
+		<dl>
+			<div>
+				<dt><span class="sr-only">배송지명</span></dt>
+				<dd>
+					<span th:text="${deliveryAddrInfo.delvAddrNm}"></span>
+					<span class="icon_tag">
+						<em class="tag_stype1">기본 배송지</em> 
+						<em class="tag_stype2">총알배송</em>
+					</span>
+				</dd>
+			</div>
+			<div>
+				<dt>
+					<span class="sr-only">배송주소</span>
+				</dt>
+				<dd>
+					<span th:text="${deliveryAddrInfo.recipBaseAddr} + ${deliveryAddrInfo.recipDtlAddr}"></span>
+					<button type="button" class="btn_popup" id="btn_adrsChange_pop">
+						<span>배송지 선택</span>
+					</button>
+				</dd>
+			</div>
+			<div>
+				<dt>
+					<span class="sr-only">휴대폰 번호</span>
+				</dt>
+				<dd th:text="${deliveryAddrInfo.cellPhnno}"></dd>
+			</div>
+			<div>
+				<dt>배송요청 사항</dt>
+				<dd>
+					<span th:text="${deliveryAddrInfo.delvMemo}" id="delvMemo"></span>
+					<button type="button" class="btn_popup" id="btn_rqstModify_pop">
+						<span>변경하기</span>
+					</button>
+				</dd>
+			</div>
+		</dl>
+	</div>
+	<!-- /배송지정보 -->
+	
+	<!-- 해외배송상품일 경우 노출 -->
+	<div class="area_overseas">
+		<dl>
+			<div>
+				<input type="hidden" name="entryNo" value=""/>
+				
+				<dt>개인통관고유부호</dt>
+				<dd>
+					<div class="form_field">
+						<div>
+							<input type="radio" name="rdi-overseas" id="rdi-overs1" checked> 
+							<label for="rdi-overs1"><span>받는사람 개인통관고유부호</span></label>
+						</div>
+						<div>
+							<input type="radio" name="rdi-overseas" id="rdi-overs2">
+							<label for="rdi-overs2"><span>입력 안 함</span></label>
+						</div>
+						<div class="info_box overs1">
+							<div class="input_wrap">
+								<input type="text" class="form_control err" maxlength="13" placeholder="P로 시작하는 13자리">
+								<!-- 유효하지 않은 개인통관고유부호 일때 class명 'err' 추가 -->
+							</div>
+							<div class="t_err">개인통관고유부호가 유효하지 않습니다.</div>
+							<!-- 유효하지 않은 개인통관고유부호 일때 노출 -->
+							<div class="agree_overs">
+								<input id="chk-overs-agr" type="checkbox" checked="">
+								<label for="chk-overs-agr">
+									<span>
+										위 정보는 원활한 통관을 위해 수집 및 판매자에게 제공하며,계속 사용하도록 안전하게 STYLE24에서 저장 &#47; 관리 합니다.&nbsp;&nbsp;
+										<em class="tmark_required">(필수)</em>
+									</span>
+								</label>
+							</div>
+						</div>
+						<div class="info_box overs2" style="display: none;">
+							<p>개인통관고유부호를 입력하지 않아도 관세사무소에서 개인정보 확인을 위해 별도 연락을 드릴 예정입니다.</p>
+						</div>
+					</div>
+					<div class="info_txt">
+						<ul>
+							<li>물품가액이 $150초과할 경우 관/부과세가 발생 할 수 있습니다.</li>
+							<li>물품 종류와 해외공급자 관계없이 같은 날 입항하게 되면 합산과세 대상이 됩니다.</li>
+						</ul>
+					</div>
+				</dd>
+			</div>
+		</dl>
+	</div>
+	<!-- //해외배송상품일 경우 노출 -->
+	
+	<!-- 주문제작상품일 경우 노출 -->
+	<div class="area_customitem">
+		<div class="form_field">
+			<div class="agree_custom">
+				<input id="chk-custom-agr1" type="checkbox" checked="">
+				<label for="chk-custom-agr1">
+					<span>고객님께서 주문하신 상품에는 주문제작상품이 포함되어 있습니다.<br>주문제작상품에 대한 안내를 확인하였으며 배송에 동의합니다.&nbsp;&nbsp;
+						<em class="tmark_required">(필수)</em>
+					</span>
+				</label>
+			</div>
+		</div>
+		<div class="info_txt">
+			<ul>
+				<li>주문 제작 상품은 주문 후 제작이 진행되며, 제작 완료 후 배송이 시작됩니다.</li>
+				<li>주문 제작 상품의 특성상 주문 완료 후 취소/교환이 불가능합니다. (상품 하자에 한해 가능)</li>
+			</ul>
+		</div>
+	</div>
+	<!-- //주문제작상품일 경우 노출 -->
+</div>
+
+<script th:inline="javascript">
+var dispYn = [[${order.dispYn}]]; // 노출여부
+
+//컨텐츠 호출
+$(document).ready( function() {
+	// 화면펼침
+	if (dispYn == "Y") {
+		$("#deliveryAddrInfo .fold_head").addClass("on");
+		$("#deliveryAddrInfo .fold_cont").css("display", "block");
+	}
+});
+</script>
+
+</html>

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 324 - 761
src/main/webapp/WEB-INF/views/web/order/OrderFormWeb.html


+ 1695 - 0
src/main/webapp/WEB-INF/views/web/order/OrderFormWeb20210306.html

@@ -0,0 +1,1695 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="web/common/layout/DefaultLayoutWeb">
+<!--
+ *******************************************************************************
+ * @source  : OrderFormWeb.html
+ * @desc    : 주문/결제 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.01   jsh77b     최초 작성
+ *******************************************************************************
+ -->
+<body>
+<th:block layout:fragment="content">
+
+<link rel="stylesheet" type="text/css" href="/ux/pc/css/swiper.min.css">
+<script type="text/javascript" src="/ux/pc/js/swiper.min.js"></script>
+<script type="text/javascript" src="/ux/pc/js/slick.min.js"></script>
+<script type="text/javascript" src="/ux/pc/js/jquery-ui.js"></script>
+
+<!-- xodud1202 -->
+	<script type="text/javascript">
+		/****************************************************************/
+		/* m_Completepayment  설명                                      */
+		/****************************************************************/
+		/* 인증완료시 재귀 함수                                         */
+		/* 해당 함수명은 절대 변경하면 안됩니다.                        */
+		/* 해당 함수의 위치는 payplus.js 보다먼저 선언되어여 합니다.    */
+		/* Web 방식의 경우 리턴 값이 form 으로 넘어옴                   */
+		/****************************************************************/
+		function m_Completepayment( FormOrJson, closeEvent )
+		{
+			var frm = document.order_info;
+
+			/********************************************************************/
+			/* FormOrJson은 가맹점 임의 활용 금지                               */
+			/* frm 값에 FormOrJson 값이 설정 됨 frm 값으로 활용 하셔야 됩니다.  */
+			/* FormOrJson 값을 활용 하시려면 기술지원팀으로 문의바랍니다.       */
+			/********************************************************************/
+			GetField( frm, FormOrJson );
+
+
+			if( frm.res_cd.value == "0000" )
+			{
+				alert("결제 승인 요청 전,\n\n반드시 결제창에서 고객님이 결제 인증 완료 후\n\n리턴 받은 ordr_chk 와 업체 측 주문정보를\n\n다시 한번 검증 후 결제 승인 요청하시기 바랍니다."); //업체 연동 시 필수 확인 사항.
+				/*
+					가맹점 리턴값 처리 영역
+				*/
+
+				frm.submit();
+			} else {
+				alert( "[" + frm.res_cd.value + "] " + frm.res_msg.value );
+				closeEvent();
+			}
+		}
+	</script>
+
+	<script type="text/javascript" th:src="${@environment.getProperty('pg.kcp.js.url')}" src=""></script>
+
+	<script type="text/javascript">
+		/* 표준웹 실행 */
+		function jsf__pay( form ) {
+			try {
+				KCP_Pay_Execute( form );
+			} catch (e) {
+				/* IE 에서 결제 정상종료시 throw로 스크립트 종료 */
+			}
+		}
+
+		$(document).on("click", "#buyBtn", function() {
+			$.ajax( {
+				type: "POST",
+				url : '/order/create/order',
+				dataType : 'html',
+				data : {cartSq : 8},
+				success : function(result) {
+					$("#order_info").html(result);
+					jsf__pay(document.order_info);
+				}
+			});
+		});
+	</script>
+
+	<form id="order_info" name="order_info" method="post" action="/order/pay/result/response" >
+		<input type="button" id="buyBtn" value="테스트버튼" style="width:200px; height:200px;"/>
+	</form>
+
+<!-- // xodud1202 -->
+
+
+<!-- card007 -->
+
+<!-- // card007 -->
+
+
+<!--  container -->
+<form id="payForm" name="payForm">
+	<th:block th:each="delvAllCart, i : ${delvAllCartList}">
+		<th:block th:if="${delvAllCart != null and #lists.size(delvAllCart) > 0}">
+			<th:block th:each="goods, i : ${delvAllCart}">
+				<div>
+					<input type="hidden" name="cartSq" 			th:value="${goods.cartSq}"/>
+					<input type="hidden" name="orgCurrPrice"	th:value="${goods.orgCurrPrice}"/>
+					<input type="hidden" name="cpn1CpnSq" 		th:value="${goods.cpn1CpnSq}"/>
+					<input type="hidden" name="cpn1DcAmt" 		th:value="${goods.orgCurrPrice} - ${goods.currPrice}"/>
+					
+					<th:block th:if="${goods.applyQtySectionYn} == 'Y' and ${goods.qtyTmtbSq} > 0">
+						<input type="hidden" name="tmtb1Sq" 	th:value="${goods.qtyTmtbSq}"/>
+						<input type="hidden" name="tmtb1DcAmt" 	th:value="${goods.tmtb1DcAmt}"/>
+					</th:block>
+					<th:block th:if="${goods.applyQtySectionYn} != 'Y'">
+						<input type="hidden" name="tmtb1Sq" 	value="0"/>
+						<input type="hidden" name="tmtb1DcAmt" 	value="0"/>
+					</th:block>
+					
+					<th:block th:if="${goods.applyAmtSectionYn} == 'Y' and ${goods.amtTmtbSq} > 0">
+						<input type="hidden" name="tmtb2Sq" 	th:value="${goods.amtTmtbSq}"/>
+						<input type="hidden" name="tmtb2DcAmt" 	th:value="${goods.tmtb2DcAmt}"/>
+					</th:block>
+					<th:block th:if="${goods.applyAmtSectionYn} != 'Y'">
+						<input type="hidden" name="tmtb2Sq" 	value="0"/>
+						<input type="hidden" name="tmtb2DcAmt" 	value="0"/>
+					</th:block>
+					
+					<input type="hidden" name="goodsCpnSq" 		value=""/>
+					<input type="hidden" name="goodsCpnDcAmt" 	value=""/>
+					<input type="hidden" name="cartCpnSq" 		value=""/>
+					<input type="hidden" name="cartCpnDcAmt"	value=""/>
+					
+					<input type="hidden" name="prePntDcAmt1" 	th:value="${goods.prePntDcAmt}"/>
+					<input type="hidden" name="pntDcAmt1" 		value="0"/>
+					<input type="hidden" name="gfcdUseAmt1" 	value="0"/>
+				</div>
+				<br>
+			</th:block>
+		</th:block>
+	</th:block>
+	
+	<input type="hidden" name="goodsSumAmt" 		th:value="${orgGoodsSumAmt}"/>
+	<input type="hidden" name="delvSumAmt" 			th:value="${sumDelvFee}"/>
+	<input type="hidden" name="freegiftUsePoint" 	value="0"/>
+	<input type="hidden" name="cpn1DcSumAmt" 		th:value="${cpn1DcSumAmt}"/>
+	<input type="hidden" name="tmtbDcSumAmt" 		th:value="${tmtbDcSumAmt}"/>
+	<input type="hidden" name="couponDcSumAmt" 		value="0"/>
+	<input type="hidden" name="prePntDcAmt" 		th:value="${prePntDcAmt}"/>
+	<input type="hidden" name="pntDcAmt" 			value="0"/>
+	<input type="hidden" name="gfcdUseAmt" 			value="0"/>
+	<input type="hidden" name="realOrdAmt" 			value="0"/>
+	<input type="hidden" name="savePntSumAmt" 		th:value="${savePntSumAmt}"/>
+	
+	<table border="1" style="font-size:10px; text-align:center;">
+		<tr style="height:30px;">
+			<th>cartSq</th>
+			<th>orgCurrPrice</th>
+			<th>cpn1DcSq</th>
+			<th>cpn1DcAmt</th>
+			<th>optAddPrice</th>
+			<th>goodsQty</th>
+			<th>ordAmt</th>
+			<th>tmtb1Sq</th>
+			<th>tmtb1DcAmt</th>
+			<th>tmtb2Sq</th>
+			<th>tmtb2DcAmt</th>
+			<th>goodsCpnSq</th>
+			<th>goodsCpnDcAmt</th>
+			<th>cartCpnSq</th>
+			<th>cartCpnDcAmt</th>
+			<th>prePntDcAmt1</th>
+			<th>dcSumAmt</th>
+			<th>pntDcAmt1</th>
+			<th>gfcdUseAmt1</th>
+			<th>realOrdAmt1</th>
+			<th>savePntAmt1</th>
+		</tr>
+		<th:block th:each="delvAllCart, i : ${delvAllCartList}">
+			<th:block th:if="${delvAllCart != null and #lists.size(delvAllCart) > 0}">
+				<th:block th:each="goods, i : ${delvAllCart}">
+					<tr style="height:30px;">
+						<td class="cartSq" 			th:text="${goods.cartSq}"></td>
+						<td class="orgCurrPrice" 	th:text="${goods.orgCurrPrice}"></td>
+						<td class="cpn1CpnSq" 		th:text="${goods.cpn1CpnSq}"></td>
+						<td class="cpn1DcAmt" 		th:text="${goods.orgCurrPrice} - ${goods.currPrice}"></td>
+						<td class="optAddPrice" 	th:text="${goods.optAddPrice}"></td>
+						<td class="goodsQty" 		th:text="${goods.goodsQty}"></td>
+						<td class="ordAmt">0</td>
+						<th:block th:if="${goods.applyQtySectionYn} == 'Y' and ${goods.qtyTmtbSq} > 0">
+							<td class="tmtb1Sq" 	th:text="${goods.qtyTmtbSq}"></td>
+							<td class="tmtb1DcAmt" 	th:text="${goods.tmtb1DcAmt}"></td>
+						</th:block>
+						<th:block th:if="${goods.applyQtySectionYn} != 'Y'">
+							<td class="tmtb1Sq">0</td>
+							<td class="tmtb1DcAmt">0</td>
+						</th:block>
+						<th:block th:if="${goods.applyAmtSectionYn} == 'Y' and ${goods.amtTmtbSq} > 0">
+							<td class="tmtb2Sq" 	th:text="${goods.amtTmtbSq}"></td>
+							<td class="tmtb2DcAmt" 	th:text="${goods.tmtb2DcAmt}"></td>
+						</th:block>
+						<th:block th:if="${goods.applyAmtSectionYn} != 'Y'">
+							<td class="tmtb2Sq" >0</td>
+							<td class="tmtb2DcAmt" >0</td>
+						</th:block>
+						<td class="goodsCpnSq">0</td>
+						<td class="goodsCpnDcAmt">0</td>
+						<td class="cartCpnSq">0</td>
+						<td class="cartCpnDcAmt">0</td>
+						<td class="prePntDcAmt1" 	th:text="${goods.prePntDcAmt}"></td>
+						<td class="dcSumAmt">0</td>
+						<td class="pntDcAmt1">0</td>
+						<td class="gfcdUseAmt1">0</td>
+						<td class="realOrdAmt1">0</td>
+						<td class="savePntAmt1" 	th:text="${goods.savePntAmt}"></td>
+					</tr>
+				</th:block>
+			</th:block>
+		</th:block>
+	</table>
+	
+	<br>
+	
+	<table border="1" style="font-size:10px; text-align:center;">
+		<tr style="height:30px;">
+			<th>orgGoodsSumAmt</th>
+			<th>delvSumAmt</th>
+			<th>freegiftUsePoint</th>
+			<th>cpn1DcSumAmt</th>
+			<th>ordSumAmt</th>
+			<th>tmtb1DcSumAmt</th>
+			<th>tmtb2DcSumAmt</th>
+			<th>tmtbDcSumAmt</th>
+			<th>goodsCpnDcSumAmt</th>
+			<th>cartCpnDcSumAmt</th>
+			<th>delvCpnDcSumAmt</th>
+			<th>cpnDcSumAmt</th>
+			<th>prePntDcAmt</th>
+			<th>pntDcSumAmt</th>
+			<th>gfcdUseSumAmt</th>
+			<th>realOrdSumAmt</th>
+			<th>savePntSumAmt</th>
+		</tr>
+		<tr style="height:30px;">
+			<td class="orgGoodsSumAmt">0</td>
+			<td class="delvSumAmt" th:text="${sumDelvFee}"></td>
+			<td class="freegiftUsePoint">0</td>
+			<td class="cpn1DcSumAmt">0</td>
+			<td class="ordSumAmt">0</td>
+			<td class="tmtb1DcSumAmt">0</td>
+			<td class="tmtb2DcSumAmt">0</td>
+			<td class="tmtbDcSumAmt">0</td>
+			<td class="goodsCpnDcSumAmt">0</td>
+			<td class="cartCpnDcSumAmt">0</td>
+			<td class="delvCpnDcSumAmt">0</td>
+			<td class="cpnDcSumAmt">0</td>
+			<td class="prePntDcSumAmt">0</td>
+			<td class="pntDcSumAmt">0</td>
+			<td class="gfcdUseSumAmt">0</td>
+			<td class="realOrdSumAmt">0</td>
+			<td class="savePntSumAmt">0</td>
+		</tr>
+	</table>
+
+	<div id="container" class="container od">
+		<div class="wrap">
+			<div class="content odPayment">
+				<!-- 페이지특정 클래스 = odPayment -->
+				<div class="cont_head">
+					<h2>주문&#47;결제</h2>
+					<div class="oder_steps">
+						<ul>
+							<li>01 쇼핑백</li>
+							<li class="on">02 주문/결제</li>
+							<li>03 주문완료</li>
+						</ul>
+					</div>
+				</div>
+				
+				<div class="cont_body">
+					<!-- CONT-BODY -->
+					<form class="form_wrap">
+						<div class="od_cont">
+							<div class="sec_head">
+								<div class="tbl type4">
+									<table>
+										<colgroup>
+											<col width="240">
+											<col width="*">
+										</colgroup>
+										<tbody>
+											<tr>
+												<th>총 <span class="c_primary bold" th:text="${delvFeeTotCnt}"></span> 건으로 나뉘어 배송 예정</th>
+												<td class="t_l">
+													<span>총알배송<em class="c_primary bold" th:text="${wmsCnt}" id="shotDelv"></em>건</span>
+													<span>STYLE24<em class="c_primary bold" th:text="${wmsCnt}" id="wmsDelv"></em>건</span>
+													<span>업체직배송<em class="c_primary bold" th:text="${delvCnt}"></em>건</span>
+													<span>예약배송<em class="c_primary bold" th:text="${resCnt}"></em>건</span>
+												</td>
+											</tr>
+										</tbody>
+									</table>
+								</div>
+							</div>
+							
+							<div class="sec_body">
+								<div class="foldGroup">
+									<ul>
+										<!-- 주문고객정보 -->
+										<li class="fold_mbinfo" id="custemerInfo" style="display:none"></li>
+										<!-- //주문고객정보 -->
+										
+										<!-- 배송지정보 -->
+										<li class="fold_mbinfo" id="deliveryAddrInfo" style="display:none"></li>
+										<!-- //배송지정보 -->
+										
+										<!-- 사은품선택 -->
+										<li id="freegiftInfo" style="display:none"></li>
+										<!-- //사은품선택 -->
+										
+										<!-- 할인/혜택 사용 -->
+										<li id="dcAmtInfo" style="display:none"></li>
+										<!-- //할인/혜택 사용 -->
+										
+										<!-- 결제수단 선택 -->
+										<li class="fold_paymethod" id="paymentInfo" style="display:none"></li>
+										<!-- //결제수단 선택 -->
+									</ul>
+								</div>
+							</div>
+						</div>
+						
+						
+						<div class="od_side">
+							<div class="area_order">
+								<div class="tit_box">
+									<h3 class="subH2">주문내역</h3>
+									<span> <em class="number" th:text="${delvTotCnt}"></em>개의 상품</span>
+								</div>
+								<div class="od_item_box">
+								
+									<!-- 전체배송목록 sort --> 
+									<th:block th:each="delvAllCart, i : ${delvAllCartList}">
+										<th:block th:if="${delvAllCart != null and #lists.size(delvAllCart) > 0}">
+											<div class="part_dlvr">
+												<th:block th:if="${i.index} == 0">
+													<th:block th:if="${delvAllCart != null and #lists.size(delvAllCart) > 0}">
+														<h4 class="subH3 mb20">STYLE24 총알배송<span>오늘 자정까지 도착</span></h4>
+													</th:block>
+												</th:block>
+												<th:block th:if="${i.index} == 1">
+													<th:block th:if="${delvAllCart != null and #lists.size(delvAllCart) > 0}">
+														<h4 class="subH3 mb20" id="wmsDelvTitle">STYLE24 일반배송</h4>
+													</th:block>
+												</th:block>
+												<th:block th:if="${i.index} == 2">
+													<th:block th:if="${delvAllCart != null and #lists.size(delvAllCart) > 0}">
+														<h4 class="subH3 mb20">업체직배송</h4>
+													</th:block>
+												</th:block>
+												<th:block th:if="${i.index} == 3">
+													<th:block th:if="${delvAllCart != null and #lists.size(delvAllCart) > 0}">
+														<h4 class="subH3 mb20">예약배송</h4>
+													</th:block>
+												</th:block>
+												
+												<div class="gd_list">
+													<th:block th:each="goods, i : ${delvAllCart}">
+														<div class="item_gd">
+															<figure>
+																<span class="thumb"><img src="/images/pc/thumb/tmp_odSide1.jpg" alt=""></span>
+																<figcaption>
+																	<div class="brand" th:text="${goods.brandEnm} + ' ' + ${goods.brandKnm}"></div>
+																	<div class="name" th:text="${goods.goodsNm}"></div>
+																	<div class="option" th:each="opt, index : ${goods.itemNmArr}">
+																		<span th:text="${goods.optCdArr[index.index]}"></span> 
+																		<span>수량:<em th:text="${goods.goodsQty}"></em>개</span>
+																	</div>
+																	<div class="price">
+																		<th:block th:if="${goods.tmtbDcAmt} > 0">
+																			<span class="selling_price"  th:text="${#numbers.formatInteger(goods.tmtbDcAmt, 1, 'COMMA')}"></span>
+																		</th:block>
+																		<th:block th:if="${goods.tmtbDcAmt} < 1">
+																			<span class="selling_price"  th:text="${#numbers.formatInteger(goods.currPrice, 1, 'COMMA')}"></span>
+																		</th:block>
+																	</div>
+																</figcaption>
+															</figure>
+														</div>
+													</th:block>
+												</div>
+											</div>
+										</th:block>
+									</th:block>
+									<!-- //전체배송목록 sort -->
+								</div>
+								
+								<div class="od_amount_box">
+									<dl>
+										<div>
+											<dt>상품금액</dt>
+											<dd id="goodsSumAmt" th:text="|${#numbers.formatInteger(orgGoodsSumAmt, 1, 'COMMA')}원|"></dd>
+										</div>
+										<div>
+											<dt>배송비</dt>
+											<dd id="delvSumAmt" th:text="|${#numbers.formatInteger(sumDelvFee, 1, 'COMMA')}원|"></dd>
+										</div>
+										<div>
+											<dt>할인금액</dt>
+											<th:block th:if="${cpn1DcSumAmt} > 0">
+												<dd><span class="disc_amount" id="cpn1DcSumAmt" th:text="|-${#numbers.formatInteger(cpn1DcSumAmt, 1, 'COMMA')}원|"></span></dd>
+											</th:block>
+											<th:block th:if="${cpn1DcSumAmt} < 1">
+												<dd><span class="disc_amount" id="cpn1DcSumAmt" th:text="|${#numbers.formatInteger(cpn1DcSumAmt, 1, 'COMMA')}원|"></span></dd>
+											</th:block>
+										</div>
+										<div>
+											<dt>다다익선할인금액</dt>
+											<th:block th:if="${tmtbDcSumAmt} > 0">
+												<dd><span class="disc_amount" id="tmtbDcSumAmt" th:text="|-${#numbers.formatInteger(tmtbDcSumAmt, 1, 'COMMA')}원|"></span></dd>
+											</th:block>
+											<th:block th:if="${tmtbDcSumAmt} < 1">
+												<dd><span class="disc_amount" id="tmtbDcSumAmt" th:text="|${#numbers.formatInteger(tmtbDcSumAmt, 1, 'COMMA')}원|"></span></dd>
+											</th:block>
+										</div>
+										<div>
+											<dt>쿠폰할인금액</dt>
+											<dd><span class="disc_amount" id="couponDcSumAmt"></span></dd>
+										</div>
+										<div>
+											<dt>선포인트 사용</dt>
+											<th:block th:if="${prePntDcAmt} > 0">
+												<dd><span class="disc_amount" id="prePntDcAmt" th:text="|-${#numbers.formatInteger(prePntDcAmt, 1, 'COMMA')}원|"></span></dd>
+											</th:block>
+											<th:block th:if="${prePntDcAmt} < 1">
+												<dd><span class="disc_amount" id="prePntDcAmt" th:text="|${#numbers.formatInteger(prePntDcAmt, 1, 'COMMA')}원|"></span></dd>
+											</th:block>
+										</div>
+										<div>
+											
+											<dt>포인트 사용</dt>
+											<dd><span class="disc_amount" id="pntDcAmt">0원</span></dd>
+										</div>
+										<div>
+											
+											<dt>상품권 사용</dt>
+											<dd><span class="disc_amount" id="gfcdUseAmt">0원</span></dd>
+										</div>
+									</dl>
+								</div>
+								
+								<div class="totalprice_box">
+									<dl>
+										<dt>총 결제 예정 금액</dt>
+										<dd data-weight="price" data-font="lato">
+											<span id="realOrdAmt"></span>원
+										</dd>
+									</dl>
+									<p class="info_point">스타일 포인트 
+										<span class="save_point" id="savePntSumAmt" th:text="|${#numbers.formatInteger(savePntSumAmt, 1, 'COMMA')}P|"></span> 적립예정
+									</p>
+								</div>
+								
+							</div>
+						</div>
+					</form>
+					<!-- // CONT-BODY -->
+				</div>
+			</div>
+		</div>
+	</div>
+</form>
+
+<!-- // container -->
+<footer id="footer"></footer>
+
+<!-- 배송지변경팝업 -->
+<div class="modal fade od_pop adrsChange_pop" id="adrsChangePop" tabindex="-1" role="dialog" aria-labelledby="adrsChangeLabel" aria-hidden="true"></div>
+
+<!-- 배송지수정팝업 -->
+<div class="modal fade od_pop adrsModify_pop" id="adrsModifyPop" tabindex="-1" role="dialog" aria-labelledby="adrsModifyLabel" aria-hidden="true"></div>
+
+<!-- 배송지추가팝업 -->
+<div class="modal fade od_pop adrsAdd_pop" id="adrsAddPop" tabindex="-1" role="dialog" aria-labelledby="adrsAddLabel" aria-hidden="true"></div>
+
+<!-- 배송요청사항수정 팝업 -->
+<div class="modal fade od_pop rqstModify_pop" id="rqstModifyPop" tabindex="-1" role="dialog" aria-labelledby="rqstModifyLabel" aria-hidden="true"></div>
+
+<!-- 사은품지급안내 팝업 -->
+<div class="modal fade od_pop infoGift_pop" id="infoGiftPop" tabindex="-1" role="dialog" aria-labelledby="infoGiftLabel" aria-hidden="true"></div>
+
+<script th:inline="javascript">
+// 배송관련정보 변수선언
+var cartGoodsList		= [[${cartGoodsList}]]			// 배송목록
+var wmsCnt 				= [[${wmsCnt}]];				// 자사 일반,촐알 배송건수
+var resCnt 				= [[${resCnt}]];				// 자사 예약 배송건수
+var delvCnt 			= [[${delvCnt}]];				// 입전 일반 배송건수
+var shotDelvYn			= [[${shotDelvYn}]];			// 총알배송여부
+var orgSumDelvFee		= [[${sumDelvFee}]];			// 최초배송비합계
+var prePntDcAmt			= [[${prePntDcAmt}]];			// 선포인트사용가능금액
+
+var custNm				= [[${order.custNm}]];			// 주문자명
+var cellPhnno			= [[${order.cellPhnno}]];		// 핸드폰번호
+var email				= [[${order.email}]];			// 이메일
+var recipZipcode		= [[${order.recipZipcode}]];	// 우편번호
+var recipBaseAddr		= [[${order.recipBaseAddr}]];	// 기본주소
+var recipDtlAddr		= [[${order.recipDtlAddr}]];	// 상세주소
+var cartSqArr			= [[${order.cartSqArr}]];		// 장바구니시퀀스 목록
+
+var custCpnSq 			= 0;
+var cpnIndex			= 0;
+var cpnApplyTemp		= false;
+var jsonData			= null;
+
+// 컨텐츠 호출
+$(document).ready( function() {
+	
+	// 장바구니시퀀스 배열 변환
+	cartSqArr = String(cartSqArr).split(",");
+	
+	// 1. 각각의 컨텐츠 AJAX 로드
+	var jsonObj = {
+		"custNm" 			: custNm
+		, "cellPhnno" 		: cellPhnno
+		, "email" 			: email
+		, "recipZipcode" 	: recipZipcode
+		, "recipBaseAddr" 	: recipBaseAddr
+		, "recipDtlAddr" 	: recipDtlAddr
+		, "cartSqArr"		: cartSqArr
+		, "dispYn"			: "N"
+	}
+	
+	
+	var jsonData = JSON.stringify(jsonObj);
+	
+	// 1.1 고객정보로드
+	custemerInfoSet(jsonData);
+	
+	// 2. 각각의 기능 구현
+	// 2.1 총알배송가능 지역, 총알배송 가능 시간 체크
+	fnGetDailyDeliveryCheck();
+});
+
+// 3. 함수기능 정의
+// 3.1 프로모션 쿠폰 적용 함수
+function serialCpnApply() {
+	let data = {
+		cartSq	: $().val(),
+		rdCpnNm : $("#payForm #serialCpnNm").val()
+	}
+
+	let jsonData = JSON.stringify(data);
+
+	$.ajax( {
+		type			: "POST",
+		url 			: '/cart/list/serialCpnApply',
+		contentType		: 'application/json',
+		dataType 		: 'json',
+		data 			: jsonData,
+		success 		: function(result) {
+			var jsonObj 	= {"cartSqArr" : cartSqArr,"dispYn" : "Y"};
+			var jsonData 	= JSON.stringify(jsonObj);
+			
+			// SUCCESS
+			// 성공일때는 쿠폰정보 및 포인트 정보 reset
+			if (result.serialCpnInfo.result == "SUCCESS") {
+				dcAmtInfoSet(jsonData);
+			} else {
+				alert(result.serialCpnInfo.result);
+			}
+		}
+	});
+}
+
+// 1.1 고객정보로드
+var custemerInfoSet = function(jsonData) {
+	$.ajax( {
+		type		: "POST",
+		url 		: '/order/custemerInfo',
+		data		: jsonData,
+		dataType 	: 'html',
+		beforeSend : function(xhr, settings) {
+			xhr.setRequestHeader("AJAX"			, "true");
+			xhr.setRequestHeader('Accept'		, 'application/json');
+			xhr.setRequestHeader('Content-Type'	, 'application/json');
+			gagajf.showProgressbar(true);
+		},
+		success 	: function(result) {
+			if (result != null) {
+				$("#custemerInfo").css("display", "block");
+				$("#custemerInfo").html(result);
+			}
+			// 1.2 배송정보로드
+			deliveryAddrInfoSet(jsonData);
+		}
+	});
+}
+
+// 1.2 배송정보로드
+var deliveryAddrInfoSet = function(jsonData) {
+	$.ajax( {
+		type		: "POST",
+		url 		: '/order/deliveryAddrInfo',
+		data		: jsonData,
+		dataType 	: 'html',
+		beforeSend : function(xhr, settings) {
+			xhr.setRequestHeader("AJAX"			, "true");
+			xhr.setRequestHeader('Accept'		, 'application/json');
+			xhr.setRequestHeader('Content-Type'	, 'application/json');
+			gagajf.showProgressbar(true);
+		},
+		success 	: function(result) {
+			if (result != null) {
+				$("#deliveryAddrInfo").css("display", "block");
+				$("#deliveryAddrInfo").html(result);
+			}
+			// 1.2 배송정보로드
+			freegiftInfoSet(jsonData);
+		}
+	});
+}
+
+// 1.3 사은품정보로드
+var freegiftInfoSet = function(jsonData) {
+	
+	$.ajax( {
+		type		: "POST",
+		url 		: '/order/freegiftInfo',
+		data		: jsonData,
+		dataType 	: 'html',
+		beforeSend : function(xhr, settings) {
+			xhr.setRequestHeader("AJAX"			, "true");
+			xhr.setRequestHeader('Accept'		, 'application/json');
+			xhr.setRequestHeader('Content-Type'	, 'application/json');
+			gagajf.showProgressbar(true);
+		},
+		success 	: function(result) {
+			if (result != null) {
+				$("#freegiftInfo").html(result);
+				
+				// 2.2 사은품선택 라디오 버튼 기능
+				$(".freegiftRdo").on("click", function() {
+					var total_gift 		= 0;
+					var total_deduct 	= 0;
+					
+					$(".freegiftRdo").each(function(){
+						// 라디오버튼 사은품 체크
+						if ($(this).is(":checked")) {
+							// 수령거부가 아닐때 체크
+							if ($(this).val() != "noSel") {
+								total_gift 		+= 1;
+								total_deduct 	+= parseInt($(this).attr("usepoint"));
+							}
+						}
+					});
+					
+					$(".total_gift").text(total_gift);							// 사은품총선택개수
+					$(".total_deduct").text(total_deduct.addComma());			// 사은품총사용포인트
+					$("input[name='freegiftUsePoint']").val(total_deduct);		// 사은품총사용포인트
+					
+					var rmPntAmt 			= parseInt($("input[name='rmPntAmt']").val());
+					var freegiftUsePoint 	= parseInt($("input[name='freegiftUsePoint']").val());
+					rmPntAmt 				= rmPntAmt - freegiftUsePoint; 
+					$(".remain_point").text("보유 : " + rmPntAmt.addComma() + "P");
+					
+					// 쿠폰초기화기능
+					custCpnInit();
+				});
+			}
+			
+			// 1.5 결제타입로드
+			paymentInfoSet(jsonData);
+		}
+	});
+}
+
+// 1.5 결제타입로드
+var paymentInfoSet = function(jsonData) {
+	$.ajax( {
+		type		: "POST",
+		url 		: '/order/paymentInfo',
+		data		: jsonData,
+		dataType 	: 'html',
+		beforeSend : function(xhr, settings) {
+			xhr.setRequestHeader("AJAX"			, "true");
+			xhr.setRequestHeader('Accept'		, 'application/json');
+			xhr.setRequestHeader('Content-Type'	, 'application/json');
+			gagajf.showProgressbar(true);
+		},
+		success 	: function(result) {
+			if (result != null) {
+				$("#paymentInfo").css("display", "block");
+				$("#paymentInfo").html(result);
+				
+				// 3.2 할인영역 설정
+				dcAmtInfoSet(jsonData);
+			}
+		}
+	});
+}
+
+// 3.2 할인영역 설정
+var dcAmtInfoSet = function(jsonData) {
+	// 3.2.1 할인정보로드
+	$.ajax( {
+		type		: "POST",
+		url 		: '/order/dcAmtInfo',
+		data		: jsonData,
+		dataType 	: 'html',
+		beforeSend : function(xhr, settings) {
+			xhr.setRequestHeader("AJAX"			, "true");
+			xhr.setRequestHeader('Accept'		, 'application/json');
+			xhr.setRequestHeader('Content-Type'	, 'application/json');
+			gagajf.showProgressbar(true);
+		},
+		success 	: function(result) {
+			if (result != null) {
+				$("#dcAmtInfo").css("display", "block");
+				$("#dcAmtInfo").html(result);
+				
+				// 3.2.2 쿠폰적용초기화(할인율최고)
+				custCpnInit();
+				
+				// 3.2.3 쿠폰 SELECT BOX 기능 설정(js적용)
+				$('.select_custom.type1').each(function(index){
+					var selecter01 	= new sCombo($(this));
+					
+					// 선택박스 버튼기능 구현
+					$(this).find("ul li").each(function(i){
+						
+						// SELECT BOX 버튼 기능 설정
+						$(this).on("click", function(){
+							// 쿠폰 선택없음
+							if ($(this).prop("value") == 0) {
+								// 쿠폰 선택없음
+								cpnApplyDel($(this));
+							}
+							// 쿠폰선택
+							else {
+								// 쿠폰중복체크 후 적용
+								if (custCpnDuplicationCheck($(this).prop("value"), index)) {
+									// 쿠폰적용
+									custCpnApply($(this));
+								} else {
+									alert("이미 적용된 쿠폰 입니다.");
+									
+									// 쿠폰적용불가
+									custCpnNotApply($(this));
+								}
+								
+								// 쿠폰할인금액 SUM
+								custCpnSumAmtCal();
+								
+								// 최대할인혜택적용 체크해제
+								if ($("#chk-maxdisc").is(":checked")) {
+									$("#chk-maxdisc").attr("checked", false);
+								}
+							}
+						});
+					});
+				});
+				
+				// 3.2.4 쿠폰 최대할인금액 초기화 버튼 설정
+				$("#chk-maxdisc").on("click", function(){
+					if ($(this).is(":checked")) {
+						custCpnInit();
+					}
+				});
+
+				// 3.2.5 쿠폰할인적용 삭제 버튼
+				$(".btn_del_coupon").on("click", function(){
+					//선택없음선택
+					$(this).parent().parent().find("ul li").each(function(i){
+						if (i == 0) {
+							cpnApplyDel($(this)); // 쿠폰 선택없음
+						}
+					});
+				});
+				
+				// 3.2.6 선포인트 적용 버튼 기능
+				$("input[name='rdi-beforpoint']").each(function(){
+					// 선포인트 초기 설정 사용함
+					if ($(this).val() == "Y") {
+						$(this).attr("checked", true);
+					}
+					
+					// 버튼기능 구현
+					$(this).on("click", function(){
+						var rmPrePntAmt 		= parseInt($("input[name='rmPrePntAmt']").val());
+						
+						// 선포인트적용
+						if ($(this).val() == "Y") {
+							$("input[name='prePntDcAmt']").val(rmPrePntAmt);
+							$("#prePntDcAmt").text("-"+rmPrePntAmt.addComma()+"원");
+						} else {
+							$("input[name='prePntDcAmt']").val(0);
+							$("#prePntDcAmt").text("0원");
+						}
+						
+						// 포인트기능 리렛
+						pntDcAmtReset();
+					});
+				});
+				
+				// 3.2.6 포인트 적용버튼 기능
+				$("#btn_point_apply").on("click", function(){
+					var rmPntAmt 			= parseInt($("input[name='rmPntAmt']").val());
+					var freegiftUsePoint 	= parseInt($("input[name='freegiftUsePoint']").val());
+					var pntDcAmt 			= parseInt($("input[name='pntDcAmtStr']").val());
+					var realOrdAmt 			= parseInt($("input[name='realOrdAmt']").val());
+					var applyPntDcAmt 		= (realOrdAmt * 40) / 100;
+					
+					rmPntAmt				= rmPntAmt - freegiftUsePoint;
+					
+					// 입력여부체크
+					if (pntDcAmt < 1) {
+						alert("사용할 포인트를 입력해주세요");
+						// 포인트리셋기능
+						pntDcAmtReset();
+						return false;
+					}
+					
+					// 보유포인트보다 초과 사용 불가
+					if (pntDcAmt > rmPntAmt) {
+						alert("보유포인트 보다 초과 사용 할 수 없습니다.");
+						// 포인트리셋기능
+						pntDcAmtReset();
+						return false;
+					}
+
+					// TODO 포인트 사용금액 1000P 이상 사용
+					if (pntDcAmt < 1000) {
+						alert("포인트는 최소 1,000P이상 사용해야 합니다.");
+						// 포인트리셋기능
+						pntDcAmtReset();
+						return false;
+					}
+					
+					// 실결제금액보다 크게 적용 되었을때 적용 불가능
+					if (pntDcAmt > applyPntDcAmt) {
+						alert("결제금액의 최대 40%를 초과 사용 할 수 없습니다.");
+						// 포인트리셋기능
+						pntDcAmtReset();
+						return false;
+					}
+					
+					// 포인트 적용
+					$("input[name='pntDcAmt']").val(pntDcAmt);
+					$("#pntDcAmt").text("-"+pntDcAmt.addComma()+"원");
+					
+					// 상품권리렛기능
+					gfcdUseAmtReset();
+				});
+				
+				// 3.2.7 상품권 적용버튼 기능
+				$("#btn_gfcd_apply").on("click", function(){
+					var rmGfcdAmt 		= parseInt($("input[name='rmGfcdAmt']").val());
+					var gfcdUseAmt 		= parseInt($("input[name='gfcdUseAmtStr']").val());
+					
+					// 입력여부체크
+					if (gfcdUseAmt < 1 || $("input[name='gfcdUseAmtStr']").val() == "") {
+						alert("사용할 금액을 입력해주세요");
+						// 상품권리셋기능
+						gfcdUseAmtReset();
+						return false;
+					}
+					
+					// 보유금액보다 초과 사용 불가
+					if (gfcdUseAmt > rmGfcdAmt) {
+						alert("보유금액 보다 초과 사용 할 수 없습니다.");
+						// 상품권리셋기능
+						gfcdUseAmtReset();
+						return false;
+					}
+
+					// TODO 포인트 사용금액 1000원 이상 사용
+					if (gfcdUseAmt < 1000) {
+						alert("상품권 사용금액은 최소 1,000원 이상 사용해야 합니다.");
+						// 상품권리셋기능
+						gfcdUseAmtReset();
+						return false;
+					}
+					
+					// 상품권 적용
+					$("input[name='gfcdUseAmt']").val(gfcdUseAmt);
+					$("#gfcdUseAmt").text("-"+gfcdUseAmt.addComma()+"원");
+					
+					// 금액전체계산
+					custCpnSumAmtCal();
+				});
+			}
+		}
+	});
+}
+
+// 3.3 쿠폰 최대할인율 쿠폰적용
+var custCpnInit = function() {
+	
+	// 쿠폰적용없음적용
+	$(".select_custom.type1").each(function(index){
+		// select box 쿠폰 적용
+		var cpnCartSq = $(this).find("input[name='cpnCartSq']").val();
+		
+		// 장바구니시퀀스 체크
+		$("input[name='cartSq']").each(function(){
+			if (cpnCartSq == $(this).val()) {
+				$(this).parent().find("input[name='goodsCpnSq']").val("0");			// 상품쿠폰시퀀스
+				$(this).parent().find("input[name='goodsCpnDcAmt']").val("0");		// 상품쿠폰할인금액
+			}
+		});
+		
+		// 장바구니시퀀스 체크
+		$(".cartSq").each(function(){
+			if (cpnCartSq == $(this).text()) {
+				$(this).parent().find(".goodsCpnSq").text("0");			// 상품쿠폰시퀀스
+				$(this).parent().find(".goodsCpnDcAmt").text("0");		// 상품쿠폰할인금액
+			}
+		});
+		
+		$(this).find("input[name='custCpnSq']").val("0");
+		$(this).find("input[name='cpnDcAmt']").val("0");
+		
+		$(this).find(".select").text("선택없음");
+		$(this).find(".cp_discount").css("display", "none");
+	});
+	
+	// 최대할인율 쿠폰적용
+	$('.select_custom.type1').each(function(index){
+		cpnIndex 		= 0;
+		cpnApplyTemp 	= false;
+		
+		// select 박스 반복문 실행
+		$(this).find("ul li").each(function(i){
+			cpnIndex++;
+			
+			// 1이상부터 중복 체크
+			if (cpnApplyTemp == false) {
+				if (cpnIndex > 1) {
+					if (custCpnDuplicationCheck($(this).prop("value"), index)) {
+						// 쿠폰적용
+						custCpnApply($(this));
+						// 쿠폰할인적용
+						cpnApplyTemp = true;
+					}
+				}
+			}
+		});
+	});
+	
+	// 선포인트기능리셋
+	prePntDcAmtReset();
+}
+
+// 3.4 쿠폰중복사용체크
+var custCpnDuplicationCheck = function(custCpnSq, index) {
+	var selCustSq 	= 0;
+	var cnt 		= 0;
+
+	// 쿠폰중본사용체크
+	$("input[name='custCpnSq']").each(function(i){
+		if (index != i) {
+			selCustSq = $(this).val();
+			if (selCustSq == custCpnSq) {
+				cnt++;
+			}
+		}
+	});
+	
+	// 쿠폰적용불가
+	if (cnt > 0) {
+		return false;
+	}
+	// 쿠폰적용가능
+	else {
+		return true;
+	}
+}
+
+// 3.5 쿠폰중복체크 후 적용가능
+var custCpnApply = function(obj) {
+	// select box 쿠폰 적용
+	var cpnType 	= obj.parent().parent().find("input[name='cpnType']").val();
+	
+	// 상품쿠폰적용
+	if (cpnType == "goodsCpn") {
+		// 적용된 할인금액 text 설정 
+		var dcAmtStr = "- " + parseInt(obj.attr("data")).addComma() + " 원 할인적용";
+		obj.parent().parent().parent().parent().parent().find(".cp_amount").text(dcAmtStr);
+		
+		var cpnCartSq 	= obj.parent().parent().find("input[name='cpnCartSq']").val();
+		
+		// 장바구니상품시퀀스 체크
+		$("input[name='cartSq']").each(function(){
+			if (cpnCartSq == $(this).val()) {
+				$(this).parent().find("input[name='goodsCpnSq']").val(obj.prop("value"));		// 상품쿠폰시퀀스
+				$(this).parent().find("input[name='goodsCpnDcAmt']").val(obj.attr("data"));		// 상품쿠폰할인금액
+			}
+		});
+		
+		// 장바구니시퀀스 체크
+		$(".cartSq").each(function(){
+			if (cpnCartSq == $(this).text()) {
+				$(this).parent().find(".goodsCpnSq").text(obj.prop("value"));			// 상품쿠폰시퀀스
+				$(this).parent().find(".goodsCpnDcAmt").text(obj.attr("data"));			// 상품쿠폰할인금액
+			}
+		});
+		
+		obj.parent().parent().find("input[name='cpnDcAmt']").val(obj.attr("data"));
+	} 
+	// 장바구니쿠폰적용
+	else if (cpnType == "cartCpn") {
+		var dcWay 				= obj.parent().find("input[name='dcWay']").val();
+		var dcVal 				= obj.parent().find("input[name='dcVal']").val();
+		var cartCpnDcSumAmt		= 0;
+		var tempSumAmt			= 0;
+		var applyGoodsCnt		= 0;
+		var leftAmt				= 0;
+		var index				= 0;
+		
+		// 장바구니쿠폰 해당 장바구니상품들 할인가 적용
+		obj.find("input[name='cartCpnCartSq']").each(function(){
+			var cartCpnCartSq 		= $(this).val();
+			var cartCpnDcAmt		= 0;
+			
+			// 장바구니시퀀스 체크
+			$("input[name='cartSq']").each(function(){
+				if (cartCpnCartSq == $(this).val()) {
+					var orgCurrPrice 	= parseInt($(this).parent().find("input[name='orgCurrPrice']").val());
+					var tmtb1DcAmt 		= parseInt($(this).parent().find("input[name='tmtb1DcAmt']").val());
+					var tmtb2DcAmt 		= parseInt($(this).parent().find("input[name='tmtb2DcAmt']").val());
+					var goodsCpnDcAmt 	= parseInt($(this).parent().find("input[name='goodsCpnDcAmt']").val());
+					
+					var tempAmt 		= orgCurrPrice - tmtb1DcAmt - tmtb2DcAmt - goodsCpnDcAmt;
+					tempSumAmt			= tempSumAmt + tempAmt; 
+					
+					// 할인율일때 할인금액 
+					if (dcWay == "G240_20") {
+						cartCpnDcAmt = (tempAmt * dcVal) / 100;
+						cartCpnDcSumAmt = cartCpnDcSumAmt + cartCpnDcAmt;
+						
+						$(this).parent().find("input[name='cartCpnSq']").val(obj.prop("value"));
+						$(this).parent().find("input[name='cartCpnDcAmt']").val(cartCpnDcAmt);
+					}
+					
+					applyGoodsCnt++;
+				}
+			});
+			
+			
+			// 장바구니시퀀스 체크
+			$(".cartSq").each(function(){
+				if (cartCpnCartSq == $(this).text()) {
+					var orgCurrPrice 	= parseInt($(this).parent().find(".orgCurrPrice").text());
+					var tmtb1DcAmt 		= parseInt($(this).parent().find(".tmtb1DcAmt").text());
+					var tmtb2DcAmt 		= parseInt($(this).parent().find(".tmtb2DcAmt").text());
+					var goodsCpnDcAmt 	= parseInt($(this).parent().find(".goodsCpnDcAmt").text());
+					
+					var tempAmt 		= orgCurrPrice - tmtb1DcAmt - tmtb2DcAmt - goodsCpnDcAmt;
+					tempSumAmt			= tempSumAmt + tempAmt; 
+					
+					// 할인율일때 할인금액 
+					if (dcWay == "G240_20") {
+						cartCpnDcAmt = (tempAmt * dcVal) / 100;
+						cartCpnDcSumAmt = cartCpnDcSumAmt + cartCpnDcAmt;
+						
+						$(this).parent().find(".cartCpnSq").val(obj.prop("value"));
+						$(this).parent().find(".cartCpnDcAmt").val(cartCpnDcAmt);
+					}
+				}
+			});
+		});
+		
+		// 금액일때 할인금액 적용
+		if (dcWay == "G240_10") {
+			cartCpnDcSumAmt = dcVal;
+			leftAmt			= dcVal;
+			index			= 0;
+			
+			// 장바구니쿠폰 해당 장바구니상품들 할인가 적용
+			obj.find("input[name='cartCpnCartSq']").each(function(){
+				var cartCpnCartSq 		= $(this).val();
+				var cartCpnDcAmt		= 0;
+									
+				// 장바구니시퀀스 체크
+				$("input[name='cartSq']").each(function(){
+					if (cartCpnCartSq == $(this).val()) {
+						index++;
+						
+						var orgCurrPrice 	= parseInt($(this).parent().find("input[name='orgCurrPrice']").val());
+						var tmtb1DcAmt 		= parseInt($(this).parent().find("input[name='tmtb1DcAmt']").val());
+						var tmtb2DcAmt 		= parseInt($(this).parent().find("input[name='tmtb2DcAmt']").val());
+						var goodsCpnDcAmt 	= parseInt($(this).parent().find("input[name='goodsCpnDcAmt']").val());
+						
+						var tempAmt 		= orgCurrPrice - tmtb1DcAmt - tmtb2DcAmt - goodsCpnDcAmt;
+						var tempDiv 		= parseInt((tempAmt / tempSumAmt) * 100);
+						var cartCpnDcAmt	= 0;
+				
+						if (index == applyGoodsCnt) {
+							cartCpnDcAmt 	= leftAmt;
+						} else {
+							cartCpnDcAmt	= parseInt((cartCpnDcSumAmt * tempDiv) / 100);
+							leftAmt 		= leftAmt - cartCpnDcAmt;
+						}
+						
+						$(this).parent().find("input[name='cartCpnSq']").val(obj.prop("value"));
+						$(this).parent().find("input[name='cartCpnDcAmt']").val(cartCpnDcAmt);
+					}
+				});
+			});
+			
+			cartCpnDcSumAmt = dcVal;
+			leftAmt			= dcVal;
+			index = 0;
+			
+			// 장바구니쿠폰 해당 장바구니상품들 할인가 적용
+			obj.find("input[name='cartCpnCartSq']").each(function(){
+				var cartCpnCartSq 		= $(this).val();
+				var cartCpnDcAmt		= 0;
+									
+				// 장바구니시퀀스 체크
+				$(".cartSq").each(function(){
+					if (cartCpnCartSq == $(this).text()) {
+						index++;
+						
+						var orgCurrPrice 	= parseInt($(this).parent().find(".orgCurrPrice").text());
+						var tmtb1DcAmt 		= parseInt($(this).parent().find(".tmtb1DcAmt").text());
+						var tmtb2DcAmt 		= parseInt($(this).parent().find(".tmtb2DcAmt").text());
+						var goodsCpnDcAmt 	= parseInt($(this).parent().find(".goodsCpnDcAmt").text());
+						
+						var tempAmt 		= orgCurrPrice - tmtb1DcAmt - tmtb2DcAmt - goodsCpnDcAmt;
+						var tempDiv 		= parseInt((tempAmt / tempSumAmt) * 100);
+						var cartCpnDcAmt	= 0;
+				
+						if (index == applyGoodsCnt) {
+							cartCpnDcAmt 	= leftAmt;
+						} else {
+							cartCpnDcAmt	= parseInt((cartCpnDcSumAmt * tempDiv) / 100);
+							leftAmt 		= leftAmt - cartCpnDcAmt;
+						}
+						
+						$(this).parent().find(".cartCpnSq").text(obj.prop("value"));
+						$(this).parent().find(".cartCpnDcAmt").text(cartCpnDcAmt);
+					}
+				});
+			});
+		} 
+		
+		obj.parent().parent().find("input[name='cpnDcAmt']").val(cartCpnDcSumAmt);
+		
+		var dcAmtStr = "- " + cartCpnDcSumAmt.addComma() + " 원 할인적용";
+		obj.parent().parent().parent().parent().parent().find(".cp_amount").text(dcAmtStr);
+	}
+	// 배송비쿠폰적용
+	else if (cpnType == "delvCpn") {
+		// 적용된 할인금액 text 설정 
+		var dcAmtStr = "- " + parseInt(obj.attr("data")).addComma() + " 원 할인적용";
+		obj.parent().parent().parent().parent().parent().find(".cp_amount").text(dcAmtStr);
+		
+		var cpnCartSq 	= obj.parent().parent().find("input[name='cpnCartSq']").val();
+		
+		obj.parent().parent().find("input[name='cpnDcAmt']").val(obj.attr("data"));
+		obj.parent().parent().find("input[name='delvFeeCd']").val(obj.attr("delvfeecd"));
+	}
+	
+	// select box 쿠폰 적용 (공통적용)
+	obj.parent().parent().find("input[name='custCpnSq']").val(obj.prop("value"));
+	obj.parent().parent().find(".select").text(obj.text());
+	
+	// 선택된 할인금액 노출
+	obj.parent().parent().parent().parent().parent().find(".cp_discount").css("display", "block");
+	
+	// 선포인트기능리셋
+	prePntDcAmtReset();
+}
+
+// 3.6 쿠폰중복체크 후 적용불가
+var custCpnNotApply = function(obj) {
+	// 이전에 등록된 쿠폰시퀀스  
+	var custCpnSq = obj.parent().parent().find("input[name='custCpnSq']").val();
+
+	// 이전에 등록된 쿠폰시퀀스 비교후 데이타 원복
+	obj.parent().find("li").each(function(){
+		if ($(this).prop("value") == custCpnSq) {
+			$(this).parent().parent().find(".select").text($(this).text());
+			
+			if (custCpnSq == 0) {
+				$(this).parent().parent().parent().parent().parent().find(".cp_discount").css("display", "none");
+			} else {
+				$(this).parent().parent().parent().parent().parent().find(".cp_discount").css("display", "block");
+			}
+		}
+	});
+	
+	// 선포인트기능리셋
+	prePntDcAmtReset();
+}
+
+// 3.7 쿠폰 선택없음 기능 구현
+var cpnApplyDel = function(obj) {
+	// 쿠폰타입(상품쿠폰, 장바구니쿠폰, 배송비쿠폰)
+	var cpnType = obj.parent().parent().find("input[name='cpnType']").val();
+	
+	// 상품쿠폰적용
+	if (cpnType == "goodsCpn") {
+		// select box 쿠폰 적용
+		var cpnCartSq = obj.parent().parent().find("input[name='cpnCartSq']").val();
+		
+		// 장바구니시퀀스 체크
+		$("input[name='cartSq']").each(function(){
+			if (cpnCartSq == $(this).val()) {
+				$(this).parent().find("input[name='goodsCpnSq']").val("0");			// 상품쿠폰시퀀스
+				$(this).parent().find("input[name='goodsCpnDcAmt']").val("0");		// 상품쿠폰할인금액
+			}
+		});
+	}
+	// 장바구니쿠폰적용
+	else if (cpnType == "cartCpn") {
+		// 장바구니쿠폰 시퀀스 0, 장바구니할인금액 0
+		$("input[name='cartSq']").each(function(){
+			$(this).parent().find("input[name='cartCpnSq']").val("0");
+			$(this).parent().find("input[name='cartCpnDcAmt']").val("0");
+		});
+	}
+	// 배송비쿠폰적용
+	else if (cpnType == "delvCpn") {
+		// 장바구니쿠폰 시퀀스 0, 장바구니할인금액 0
+		$("input[name='cartSq']").each(function(){
+			$(this).parent().find("input[name='delvFeeCd']").val("0");
+		});
+	}
+	
+	obj.parent().parent().find("input[name='custCpnSq']").val("0");
+	obj.parent().parent().find("input[name='cpnDcAmt']").val("0");
+
+	obj.parent().parent().find(".select").text("선택없음");
+	obj.parent().parent().parent().parent().parent().find(".cp_discount").css("display", "none");
+	
+	// 선포인트기능리셋
+	prePntDcAmtReset();
+	
+	// 최대할인혜택적용 체크해제
+	if ($("#chk-maxdisc").is(":checked")) {
+		$("#chk-maxdisc").attr("checked", false);
+	}
+}
+
+// 3.9 선포인트리셋기능
+var prePntDcAmtReset = function() {
+	var rmPrePntAmt = parseInt($("input[name='rmPrePntAmt']").val());
+	$("input[name='prePntDcAmt']").val(rmPrePntAmt);
+	
+	$("input[name='rdi-beforpoint']").each(function(){
+		// 선포인트 초기 설정 사용함
+		if ($(this).val() == "Y") {
+			$(this).attr("checked", true);
+		}
+	});
+	
+	$("#prePntDcAmt").text("-"+rmPrePntAmt.addComma()+"원");
+	
+	// 포인트기능 리렛
+	pntDcAmtReset();
+}
+
+// 3.10 포인트리셋기능
+var pntDcAmtReset = function() {
+	$("input[name='pntDcAmt']").val("0");
+	$("input[name='pntDcAmtStr']").val("");
+	$("#pntDcAmt").text("0원");
+	
+	// 상품권리셋기능
+	gfcdUseAmtReset();
+}
+
+// 3.11 상품권리셋기능
+var gfcdUseAmtReset = function() {
+	$("input[name='gfcdUseAmt']").val("0");
+	$("input[name='gfcdUseAmtStr']").val("");
+	$("#gfcdUseAmt").text("0원");
+	
+	// 금액전체계산
+	custCpnSumAmtCal();
+}
+
+// 3.12 쿠폰할인금액합계설정(금액전체계산)
+var custCpnSumAmtCal = function() {
+	var cpnDcSumAmt = 0;
+	var cpnApplyCnt = 0;
+	
+	$("input[name='cpnDcAmt']").each(function(){
+		cpnDcSumAmt = cpnDcSumAmt + parseInt($(this).val());
+		
+		// 적용된 쿠폰 수량
+		if (parseInt($(this).val()) > 0) {
+			cpnApplyCnt++;
+		}
+	});
+	
+	// 쿠폰영역
+	$(".maxdisc_amount").text("(-" + cpnDcSumAmt.addComma() + "원)"); // 쿠폰할인금액합계
+	$("#cpnApplyCnt").text(cpnApplyCnt + "장");
+	
+	// 상품목록영역
+	$("#couponDcSumAmt").text("-" + cpnDcSumAmt.addComma() + "원"); // 쿠폰할인금액합계
+	$("input[name='couponDcSumAmt']").val(cpnDcSumAmt);
+	
+	// 배송비할인적용
+	$("input[name='cpnType']").each(function(){
+		if ($(this).val() == "delvCpn") {
+			sumDelvFee = parseInt(orgSumDelvFee) - parseInt($(this).parent().find("input[name='cpnDcAmt']").val());
+			
+			// 최종배송비
+			$("#delvSumAmt").text(sumDelvFee.addComma() + "원");
+			$("input[name='delvSumAmt']").val(sumDelvFee);
+		}
+	});
+	
+	var goodsSumAmt 		= parseInt($("input[name='goodsSumAmt']").val());
+	var delvSumAmt 			= parseInt($("input[name='delvSumAmt']").val());
+	var cpn1DcSumAmt 		= parseInt($("input[name='cpn1DcSumAmt']").val());
+	var tmtbDcSumAmt 		= parseInt($("input[name='tmtbDcSumAmt']").val());
+	var couponDcSumAmt 		= parseInt($("input[name='couponDcSumAmt']").val());
+	var prePntDcAmt 		= parseInt($("input[name='prePntDcAmt']").val());
+	var pntDcAmt 			= parseInt($("input[name='pntDcAmt']").val());
+	var gfcdUseAmt 			= parseInt($("input[name='gfcdUseAmt']").val());
+	
+	// 실결제금액(PG)
+	var realOrdAmt			= (goodsSumAmt + delvSumAmt) - (cpn1DcSumAmt + tmtbDcSumAmt + couponDcSumAmt + prePntDcAmt) - (pntDcAmt + gfcdUseAmt);
+	$("#realOrdAmt").text(realOrdAmt.addComma());
+	$("input[name='realOrdAmt']").val(realOrdAmt);
+	
+	$("#btn_payment").text("동의 후 "+realOrdAmt.addComma()+"원 결제하기");
+	
+	// 적립예정포인트
+	var savePntSumAmt		= parseInt($("input[name='savePntSumAmt']").val());
+	var tempSavePnt			= savePntSumAmt - prePntDcAmt;
+	
+	
+	
+	
+	
+	
+	
+	// 2021.03.06 주문상세 테이블 적용
+	// 포인트금액 상품상세에 포인트금액 분배 작업
+	var prePntDcAmtYn 		= $("input[name='rdi-beforpoint']:checked").val();
+	var leftPntAmt			= pntDcAmt;
+	var leftGfcdAmt			= gfcdUseAmt;
+	var cartSqLenght		= $(".cartSq").length; 
+	var index				= 1;
+	
+	var orgGoodsSumAmt		= 0;
+	var cpn1DcSumAmt		= 0;
+	var ordSumAmt			= 0;
+	var tmtb1DcSumAmt		= 0;
+	var tmtb2DcSumAmt		= 0;
+	var tmtbDcSumAmt		= 0;
+	var goodsCpnDcSumAmt	= 0;
+	var cartCpnDcSumAmt		= 0;
+	var delvCpnDcSumAmt		= 0;
+	var cpnDcSumAmt			= 0;
+	var prePntDcSumAmt		= 0;
+	var realOrdSumAmt		= 0;
+	
+	$(".cartSq").each(function(){
+		var orgCurrPrice 	= parseInt($(this).parent().find(".orgCurrPrice").text());
+		var cpn1DcAmt		= parseInt($(this).parent().find(".cpn1DcAmt").text());
+		var optAddPrice 	= parseInt($(this).parent().find(".optAddPrice").text());
+		var goodsQty 		= parseInt($(this).parent().find(".goodsQty").text());
+		var tmtb1DcAmt		= parseInt($(this).parent().find(".tmtb1DcAmt").text());
+		var tmtb2DcAmt		= parseInt($(this).parent().find(".tmtb2DcAmt").text());
+		var goodsCpnDcAmt	= parseInt($(this).parent().find(".goodsCpnDcAmt").text());
+		var cartCpnDcAmt	= parseInt($(this).parent().find(".cartCpnDcAmt").text());
+		var prePntDcAmt1	= parseInt($(this).parent().find(".prePntDcAmt1").text());
+		var dcSumAmt		= 0;
+		
+		// 주문금액 = ((판매가 - 즉시할인가) + 옵션추가금액) * 장바구니수량
+		orgGoodsSumAmt		= orgGoodsSumAmt + (orgCurrPrice + optAddPrice) * goodsQty;
+		cpn1DcSumAmt		= cpn1DcSumAmt + cpn1DcAmt;
+		tmtb1DcSumAmt		= tmtb1DcSumAmt + tmtb1DcAmt;
+		tmtb2DcSumAmt		= tmtb2DcSumAmt + tmtb2DcAmt;
+		tmtbDcSumAmt		= tmtbDcSumAmt + (tmtb1DcAmt + tmtb2DcAmt);
+		goodsCpnDcSumAmt	= goodsCpnDcSumAmt + goodsCpnDcAmt;
+		cartCpnDcSumAmt		= cartCpnDcSumAmt + cartCpnDcAmt;
+		cpnDcSumAmt			= cpnDcSumAmt + (goodsCpnDcAmt + cartCpnDcAmt);
+		prePntDcSumAmt		= prePntDcSumAmt + prePntDcAmt1;
+		
+		var ordAmt			= ((orgCurrPrice - cpn1DcAmt) + optAddPrice) * goodsQty;
+		ordSumAmt			= ordSumAmt + ordAmt;
+		
+		// 선포인트사용여부
+		// 할인금액합계 = 다다익선수량금액 + 다다익선금액금액 + 상품쿠폰금액 + 장바구니금액 + 선포인트금액
+		if (prePntDcAmtYn == "Y") {
+			dcSumAmt		= tmtb1DcAmt + tmtb2DcAmt + goodsCpnDcAmt + cartCpnDcAmt + prePntDcAmt1;
+		} else {
+			dcSumAmt		= tmtb1DcAmt + tmtb2DcAmt + goodsCpnDcAmt + cartCpnDcAmt;
+		}
+		
+		// 주문금액설정
+		$(this).parent().find(".ordAmt").text(ordAmt);
+		$(this).parent().find(".dcSumAmt").text(dcSumAmt);
+	});
+	
+	// 포인트, 상품권 금액 분배
+	$(".cartSq").each(function(){
+		var ordAmt 			= parseInt($(this).parent().find(".ordAmt").text());
+		var dcSumAmt		= parseInt($(this).parent().find(".dcSumAmt").text()); 
+		var tempDiv 		= parseInt((ordAmt / ordSumAmt) * 100);
+		var pntDcAmt1 		= 0;
+		var gfcdUseAmt1		= 0;
+		
+		if (index == cartSqLenght) {
+			pntDcAmt1 		= leftPntAmt;
+			gfcdUseAmt1		= leftGfcdAmt;
+		} else {
+			pntDcAmt1 		= parseInt((pntDcAmt * tempDiv) / 100);
+			gfcdUseAmt1		= parseInt((gfcdUseAmt * tempDiv) / 100);
+			leftPntAmt		= leftPntAmt - pntDcAmt1;
+			leftGfcdAmt		= leftGfcdAmt - gfcdUseAmt1;
+		}
+		
+		var realOrdAmt1		= ordAmt - dcSumAmt - (pntDcAmt1 - gfcdUseAmt1);
+		realOrdSumAmt		= realOrdSumAmt + realOrdAmt1;
+		
+		$(this).parent().find(".pntDcAmt1").text(pntDcAmt1);
+		$(this).parent().find(".gfcdUseAmt1").text(gfcdUseAmt1);
+		$(this).parent().find(".realOrdAmt1").text(realOrdAmt1);
+		
+		index++;
+	});
+	
+	$(".orgGoodsSumAmt").text(orgGoodsSumAmt);
+	$(".cpn1DcSumAmt").text(cpn1DcSumAmt);
+	$(".ordSumAmt").text(ordSumAmt);
+	$(".tmtb1DcSumAmt").text(tmtb1DcSumAmt);
+	$(".tmtb2DcSumAmt").text(tmtb2DcSumAmt);
+	$(".tmtbDcSumAmt").text(tmtbDcSumAmt);
+	$(".goodsCpnDcSumAmt").text(goodsCpnDcSumAmt);
+	$(".cartCpnDcSumAmt").text(cartCpnDcSumAmt);
+	$(".cpnDcSumAmt").text(cpnDcSumAmt);
+	$(".prePntDcSumAmt").text(prePntDcSumAmt);
+	$(".pntDcSumAmt").text(pntDcAmt);
+	$(".gfcdUseSumAmt").text(gfcdUseAmt);
+	$(".realOrdSumAmt").text(realOrdSumAmt);
+	
+	$("#savePntSumAmt").text(tempSavePnt.addComma()+"P");
+};
+
+// 3.20 총알배송가능 지역, 총알배송 가능 시간 체크
+var fnGetDailyDeliveryCheck = function () {
+	// TODO
+	var jsonObj 	= {"zipNo" : 12345};
+	var jsonData 	= JSON.stringify(jsonObj);
+
+	gagajf.ajaxJsonSubmit(
+		"/order/getDailyDeliveryCheck"
+		, jsonData
+		, function (result) {
+			// 자사몰 일반배송
+			$("#shotDelv").text(0);
+			$("#wmsDelv").text(wmsCnt);
+			$("#wmsDelvTitle").css("display", "block");
+			$("#shotDelvTitle").css("display", "none");
+			$(".tag_stype2").css("display", "none");
+
+			// 자사몰 총알배송
+			if (shotDelvYn == "Y") {
+				if (parseInt(result) > 0) {
+					$("#shotDelv").text(wmsCnt);
+					$("#wmsDelv").text(0);
+					
+					$("#wmsDelvTitle").css("display", "none");
+					$("#shotDelvTitle").css("display", "block");
+					$(".tag_stype2").css("display", "block");
+				}
+			}
+		}
+	)
+}
+</script>
+
+
+
+
+
+
+
+
+
+
+<script th:inline="javascript">
+// 화면준비상태
+$(document).ready( function() {
+	// 배송지변경 팝업열기
+	$(document).on('click','#btn_adrsChange_pop',function(e){
+		$.ajax( {
+			type		: "POST",
+			url 		: '/order/delvAddrChangePop',
+			dataType 	: 'html',
+			success 	: function(result) {
+				if (result != null) {
+					$("#adrsChangePop").html(result);
+					$("#adrsChangePop").modal("show");
+				}
+			}
+		});
+		
+		return false;
+	});
+
+	// 배송지추가 팝업열기
+	$(document).on('click','#btn_addrAdd_pop',function(e){
+		$.ajax( {
+			type		: "POST",
+			url 		: '/order/delvAddrAddPop',
+			dataType 	: 'html',
+			success 	: function(result) {
+				if (result != null) {
+					$("#adrsAddPop").html(result);
+					$("#adrsAddPop").modal("show");
+				}
+			}
+		});
+		
+		return false;
+	});
+
+	// 배송지수정 팝업열기
+	$("#btn_addrModify_pop").on("click", function(e){
+		$.ajax( {
+			type		: "POST",
+			url 		: '/order/delvAddrModifyPop',
+			dataType 	: 'html',
+			success 	: function(result) {
+				if (result != null) {
+					$("#adrsModifyPop").html(result);
+					$("#adrsModifyPop").modal("show");
+				}
+			}
+		});
+		
+		return false;
+	});
+
+	// 배송요청사항 팝업열기
+	$("#btn_rqstModify_pop").on("click", function(e){
+		var jsonObj = new Object();
+		jsonObj.delvMemo = $("input[name='delvMemo']").val();
+		
+		$.ajax({
+			type		: "POST",
+			url 		: "/order/delvMemoChangePop",
+			data		: jsonObj,
+			dataType 	: "html",
+			success 	: function(result) {
+				if (result != null) {
+					$("#rqstModifyPop").html(result);
+					$("#rqstModifyPop").modal("show");
+				}
+			}
+		});
+		
+		return false;
+	});
+	
+	// 해외배송 입력
+	$(document).on('change','.odPayment .area_overseas #rdi-overs1', function(e){
+		$('.info_box.overs2').hide();
+		$('.info_box.overs1').show();
+		return false;
+	}).on('change','.odPayment .area_overseas #rdi-overs2', function(e){
+		$('.info_box.overs1').hide();
+		$('.info_box.overs2').show();
+		return false;
+	});
+
+	// 사은품지급안내 팝업열기
+	$("#btn_infoGift_pop").on("click",function(e){
+		$.ajax({
+			type		: "POST",
+			url 		: "/order/freegiftInfoPop",
+			dataType 	: "html",
+			success 	: function(result) {
+				if (result != null) {
+					$("#infoGiftPop").html(result);
+					$("#infoGiftPop").modal("show");
+				}
+			}
+		});
+		
+		return false;
+	});
+
+	// 할인쿠폰 확인
+	$(document).on('click','.odPayment .area_seldiscount .btn_coupon_toggle',function(e){
+		$('.coupon_list').toggle();
+		$(this).toggleClass('on');
+		return false;
+	});
+
+	// 결제수단 선택
+	$(document).on('change','.odPayment .area_paymethod .paymethod_radio input',function(e){
+		$('.radio_blk').removeClass('on');
+		$(this).parents('.radio_blk').addClass('on');
+		$(this).parents('.radio_blk').find('.paymethod_box').show();
+		$(this).parents('.radio_blk').siblings('div').find('.paymethod_box').hide();
+	
+		var paymethodlabel =  $(this).prop('labels');
+		$(this).parents('li').find('.fold_head .data span').text($(paymethodlabel).text());
+	
+		// 간편결제 카드추가 슬라이드
+		var swiper = new Swiper('.paymethod_box .card_quickpay .list_card', {
+			slidesPerView: 'auto',
+			spaceBetween: 160,
+			centeredSlides: true,
+			navigation: {
+				nextEl: '.list_card .swiper-button-next',
+				prevEl: '.list_card .swiper-button-prev',
+			},
+		});
+		return false;
+	});
+
+	// STYLE24 간편결제 배너닫기
+	$(document).on('click','.odPayment .area_paymethod .quickpay_bnr .btn_close_bnr',function(e){
+		$('.quickpay_bnr').hide();
+	});
+
+	// 결제수단 선택 > 즐겨찾기 추가시 
+	$(document).on('click','.odPayment .area_paymethod .paymethod_box .card .etc .btn_favorcard',function(e){
+		$(this).toggleClass('active');
+		return false;
+	});
+
+	// 결제수단 > 일반결제> 실시간계좌이체 선택시            
+	$(document).on('change','.odPayment input:radio[name=rdi-paynormal]',function(e){
+		var paynormalValue = $(this).attr('id');
+		
+		if (paynormalValue == 'rdi-paynormal2') {
+			$('.area_paymethod .agree_insurance').show();
+		} else {
+			$('.area_paymethod .agree_insurance').hide();
+		}
+		return false;
+	});
+
+	// 개인정보동의 열고닫기
+	$(document).on('click','.area_paymentinfo .payinfo_blk a',function(e){		
+		e.preventDefault();
+		$(this).parents('.payinfo_blk').toggleClass('on');
+		var privacyToggle = $(this).find('span');
+		$(privacyToggle).text($(privacyToggle).text() == '보기' ? '닫기' : '보기');
+		return false;
+	});
+
+	// 간편결제등록 > STEP1.이용약관 팝업열기
+	$(document).on('click','.btn_addcard',function(e){
+		$("#qPayAgree_pop").modal("show");
+		return false;
+	});
+
+	// 간편결제등록 > STEP1.이용약관 체크
+	$(document).on('click','.area_QpayCk .agr_select button',function(e){
+		$(this).parents('.area_QpayCk').find('.info_agrQpay').toggle();
+		var payagrToggle = $(this).find('span');
+		$(payagrToggle).text($(payagrToggle).text() == '약관열기' ? '약관닫기' : '약관열기');
+		return false;
+	});
+
+	// 간편결제등록 > STEP1.이용약관 체크박스 전체선택
+	$(document).on('click','#chk-Qpay-agrAll',function(e){
+		$(this).parents(".qPayAgree_pop").find('.agree_Qpay input').prop("checked", $(this).is(":checked"));
+	});
+
+	// 간편결제등록 > STEP1.이용약관 체크박스 개별선택
+	$(document).on("click", ".agree_Qpay input",function(e){
+		var is_checked = true;
+		$(".agree_Qpay input").each(function(){
+			is_checked = is_checked && $(this).is(":checked");
+		});
+		$("#chk-Qpay-agrAll").prop("checked", is_checked);
+	});
+
+	// 간편결제등록 > 본인인증 팝업열기
+	$(document).on('click','#btn_qPayidConfirm_pop',function(e){
+		$("#qPayidConfirm_pop").modal("show");
+		return false;
+	});
+});
+</script>
+
+</th:block>
+</body>
+</html>

+ 105 - 0
src/main/webapp/WEB-INF/views/web/order/OrderFreegiftInfoWeb.html

@@ -0,0 +1,105 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : OrderFormWeb.html
+ * @desc    : 주문/결제 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.01   jsh77b     최초 작성
+ *******************************************************************************
+ -->
+
+<th:block th:if="${freegiftList != null && #lists.size(freegiftList) > 0}">
+<div class="fold_head">
+	<a href="javascript:void(0)">
+		<div>
+			<div class="fold_tit">
+				<span>사은품 선택</span>
+			</div>
+			<div class="data">
+				<span>사은품 총 <em class="total_gift">0</em>&nbsp;개 선택</span> 
+				<span><em class="total_deduct">0</em>&nbsp;P 차감</span>
+			</div>
+		</div>
+	</a>
+</div>
+<div class="fold_cont" style="display: none;">
+	<div class="area_selgift">
+		<th:block th:each="freegift, i : ${freegiftList}">
+			<div class="gift_box">
+				<p class="txt">
+					<span th:text="'사은품선택' + ${i.count} + '' + ${freegift.freegiftNm}"></span>
+				</p>
+				<div class="form_field">
+					<th:block th:each="freegiftGoods, k : ${freegiftGoodsList}">
+						<th:block th:if="${freegift.freegiftSq} == ${freegiftGoods.freegiftSq}">
+							<div class="gift">
+								<input type="radio" th:name="'rdi-gift'+${i.count}" th:id="'rdi-gift'+${i.count}+${k.count}" class="chk_img freegiftRdo" th:value="${freegiftGoods.freegiftValSq}" th:usepoint="${freegiftGoods.usePoint}"> 
+								<label th:for="'rdi-gift'+${i.count}+${k.count}"> 
+									<span class="thumb"><img src="http://ts5000.ipdisk.co.kr:89/images/pc/thumb/tmp_gift1.jpg" width="" alt=""></span>
+									<span class="name" th:text="${freegiftGoods.goodsNm}"></span> 
+									<span th:if="${freegiftGoods.usePoint} < 1" class="deduct" th:text="무료"></span>
+									<span th:if="${freegiftGoods.usePoint} > 0" class="deduct" th:text="|- ${freegiftGoods.usePoint} P|"></span>
+								</label>
+							</div>
+						</th:block>
+					</th:block>
+					<div class="gift">
+						<input type="radio" th:name="'rdi-gift'+${i.count}" th:id="${i.count}+'0'" class="chk_img freegiftRdo" value="noSel" usepoint="0"> 
+						<label th:for="${i.count}+'0'">
+							<span class="thumb"><img src="/images/pc/thumb/tmp_gift_empty.jpg" width=""alt=""></span> 
+							<span class="name">사은품 수령안함</span>
+							<span class="deduct">수령거부</span>
+						</label>
+					</div>
+				</div>
+			</div>
+		</th:block>
+		<div class="form_field">
+			<div class="agree_gift">
+				<p>
+					<input id="chk-agree_gift" type="checkbox">
+					<label for="chk-agree_gift"><span>동의합니다</span></label>
+				</p>
+				<p class="txt">
+					사은품 지금에 대한 내용을 확인하였으며, 이에 동의합니다.
+					<button type="button" class="btn_link_popup" id="btn_infoGift_pop">
+						<span>보기</span>
+					</button>
+				</p>
+			</div>
+		</div>
+	</div>
+</div> 
+
+<script th:inline="javascript">
+//할인관련정보 변수선언
+var freegiftList		= [[${freegiftList}]];			// 사은품 프로모션 목록
+var freegiftGoodsList	= [[${freegiftGoodsList}]];		// 사은품 프로모션 상품 목록
+
+//컨텐츠 호출
+$(document).ready( function() {
+	// 사은품 화면 노출여부 체크
+	if (freegiftList.length == null || freegiftList.length < 1) {
+		$("#freegiftInfo").css("display", "none");
+	} else {
+		$("#freegiftInfo").css("display", "block");
+	}
+});
+</script>
+</th:block>
+
+
+
+
+
+
+
+
+
+

+ 281 - 0
src/main/webapp/WEB-INF/views/web/order/OrderPaymentInfoWeb.html

@@ -0,0 +1,281 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : OrderPaymentInfoWeb.html
+ * @desc    : 결제정보 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.01   jsh77b     최초 작성
+ *******************************************************************************
+ -->
+<div class="fold_head">
+	<a href="javascript:void(0)">
+		<div>
+			<div class="fold_tit"><span>결제수단 선택</span></div>
+			<div class="data"><span>STYLE24 간편결제</span></div>
+		</div>
+	</a>
+</div>
+<div class="fold_cont" style="display: none;">
+	<div class="area_paymethod">
+		<div class="form_field">
+			<div class="radio_blk">
+				<div class="paymethod_radio">
+					<input type="radio" name="rdi-paymethod" id="rdi-paymethod-quick" value=""> 
+					<label for="rdi-paymethod-quick"><span>STYLE24 간편결제</span></label>
+					<div class="quickpay_bnr">
+						<span>3초면 결제 끝! 추가 혜택 할인과 함께 만나는 STYLE24 간편결제! 지금 바로 등록하세요!</span>
+						<button type="button" class="btn_close_bnr">
+							<span class="sr-only">닫기</span>
+						</button>
+					</div>
+				</div>
+				<div class="paymethod_box" style="display: none;">
+					<div class="card_quickpay">
+						<!-- 등록카드 없을때 -->
+						<div class="empty">
+							<button type="button" class="btn_addcard">
+								<span>결제수단 등록</span>
+							</button>
+						</div>
+						<!-- //등록카드 없을때 -->
+						
+						<!-- 등록카드 있을때 -->
+						<div class="list_card swiper-container">
+							<div class="swiper-wrapper">
+								<div class="swiper-slide">
+									<!-- 등록된 카드 -->
+									<div class="card">
+										<span class="logo_samsung">삼성카드</span>
+										<p class="number">
+											<span>9410</span> <span>09**</span> <span>****</span>
+											<span>1287</span>
+										</p>
+										<p class="name">삼성개인특별카드</p>
+										<select name="" id="" class="select_month">
+											<option value="">일시불</option>
+											<option value="">2개월 무이자</option>
+											<option value="">3개월 무이자</option>
+											<option value="">4개월 무이자</option>
+											<option value="">5개월 무이자</option>
+											<option value="">6개월 무이자</option>
+											<option value="">7개월</option>
+											<option value="">8개월</option>
+											<option value="">9개월</option>
+											<option value="">10개월</option>
+											<option value="">11개월</option>
+											<option value="">12개월</option>
+										</select>
+										<div class="etc">
+											<button type="button" class="btn_favorcard">
+												<span><i class="ico ico_star"></i><em class="sr-only">즐겨찾기</em></span>
+											</button>
+											<button type="button" class="btn_delcard">
+												<span><i class="ico ico_trash_wh"></i><em class="sr-only">카드삭제</em></span>
+											</button>
+										</div>
+									</div>
+									<!-- //등록된 카드 -->
+								</div>
+								<div class="swiper-slide">
+									<!-- 등록된 카드 -->
+									<div class="card">
+										<span class="logo_hyundai">현대카드</span>
+										<p class="number">
+											<span>9410</span> <span>09**</span> <span>****</span>
+											<span>1287</span>
+										</p>
+										<p class="name">현대 M3 카드</p>
+										<select name="" id="" class="select_month">
+											<option value="">일시불</option>
+											<option value="">2개월 무이자</option>
+											<option value="">3개월 무이자</option>
+											<option value="">4개월 무이자</option>
+											<option value="">5개월 무이자</option>
+											<option value="">6개월 무이자</option>
+											<option value="">7개월</option>
+											<option value="">8개월</option>
+											<option value="">9개월</option>
+											<option value="">10개월</option>
+											<option value="">11개월</option>
+											<option value="">12개월</option>
+										</select>
+										<div class="etc">
+											<button type="button" class="btn_favorcard active">
+												<span><i class="ico ico_star"></i><em class="sr-only">즐겨찾기</em></span>
+											</button>
+											<button type="button" class="btn_delcard">
+												<span><i class="ico ico_trash_wh"></i><em class="sr-only">카드삭제</em></span>
+											</button>
+										</div>
+									</div>
+									<!-- //등록된 카드 -->
+								</div>
+								<div class="swiper-slide">
+									<!-- 카드추가버튼 -->
+									<button type="button" class="btn_addcard">
+										<span>결제수단 등록</span>
+									</button>
+									<!-- //카드추가버튼 -->
+								</div>
+							</div>
+							<div class="swiper-button-next"></div>
+							<div class="swiper-button-prev"></div>
+						</div>
+						<!-- //등록카드 있을때 -->
+					</div>
+					<ul class="info_quick">
+						<li>결제수단 등록 한번으로 간편하게 결제하실 수 있습니다.</li>
+						<li>국내 8개 카드에 대해 이용 가능합니다. (법인카드,기프트카드,해외카드 제외)</li>
+						<li>일반 신용카드의 할인혜택은 적용되지 않습니다.</li>
+					</ul>
+				</div>
+			</div>
+			<div class="radio_blk">
+				<div class="paymethod_radio">
+					<input type="radio" name="rdi-paymethod" id="rdi-paymethod-normal" value=""> 
+					<label for="rdi-paymethod-normal"><span>일반 결제</span></label>
+				</div>
+				<div class="paymethod_box" style="display: none;">
+					<ul class="sel_method">
+						<li>
+							<input type="radio" name="rdi-paynormal" id="rdi-paynormal1" value=""> 
+							<label for="rdi-paynormal1"><span>신용카드</span></label>
+						</li>
+						<li>
+							<input type="radio" name="rdi-paynormal" id="rdi-paynormal2" value=""> 
+							<label for="rdi-paynormal2"><span>실시간계좌이체</span></label>
+						</li>
+						<li>
+							<input type="radio" name="rdi-paynormal" id="rdi-paynormal3" value=""> 
+							<label for="rdi-paynormal3"><span>무통장입금</span></label>
+						</li>
+						<li>
+							<input type="radio" name="rdi-paynormal" id="rdi-paynormal4" value=""> 
+							<label for="rdi-paynormal4"><span>휴대폰 결제</span></label>
+						</li>
+						<li>
+							<input type="radio" name="rdi-paynormal" id="rdi-paynormal5" value=""> 
+							<label for="rdi-paynormal5">
+								<span>
+									<em class="sr-only">카카오페이 결제</em>
+									<em class="payimg kakao"></em>
+								</span>
+							</label>
+						</li>
+						<li>
+							<input type="radio" name="rdi-paynormal" id="rdi-paynormal6" value=""> 
+							<label for="rdi-paynormal6">
+								<span>
+									<em class="sr-only">네이버페이 결제</em>
+									<em class="payimg naver"></em>
+								</span>
+							</label>
+						</li>
+						<li>
+							<input type="radio" name="rdi-paynormal" id="rdi-paynormal7" value=""> 
+							<label for="rdi-paynormal7">
+								<span>
+									<em class="sr-only">페이코 결제</em>
+									<em class="payimg payco"></em>
+								</span>
+							</label>
+						</li>
+					</ul>
+					<div class="agree_insurance">
+						<input id="chk-insurance" type="checkbox"> 
+						<label for="chk-insurance"> 
+							<span>소비자 피해 보상보험 신청&nbsp;&nbsp;<em class="tmark_optional">(선택)</em></span>
+							<button type="button" class="btn_link_popup" id="">
+								<span>FAQ확인</span>
+							</button>
+						</label>
+						<p>
+							‘전자상거래 등에서의 소비자보호에 관한 법률‘에 따라 현금 결제 시 서울보증보험㈜가 제공하는
+							소비자 피해보상보험을<br>신청할 수 있도록 해드리고 있습니다.
+							(2013.11.28부터 시행)
+						</p>
+					</div>
+				</div>
+			</div>
+		</div>
+		<div class="form_field">
+			<div class="agree_paymethod">
+				<input id="chk-agree_paymethod" type="checkbox">
+				<label for="chk-agree_paymethod"> 
+					<span>선택한 결제수단으로 향후 결제 이용에 동의합니다.&nbsp;&nbsp;<em class="tmark_optional">(선택)</em>
+				</span>
+				</label>
+			</div>
+		</div>
+	</div>
+	<div class="area_paymentinfo">
+		<div class="paymentinfo">
+			<div class="payinfo_blk on">
+				<a href=""> 개인정보 제공에 대한 동의 <span>닫기</span>
+				</a>
+				<div class="infotxt">개인정보제공에 대한 동의 내용입니다.개인정보제공에
+					대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의
+					내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에
+					대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의
+					내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에
+					대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의
+					내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에
+					대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의
+					내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에
+					대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의
+					내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에
+					대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의
+					내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에
+					대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의
+					내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.</div>
+			</div>
+			<div class="payinfo_blk">
+				<a href=""> 결제대행 서비스 약관 동의 <span>보기</span>
+				</a>
+				<div class="infotxt">결제대행서비스 약관 동의 내용입니다.결제대행서비스
+					약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의
+					내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스
+					약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의
+					내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스
+					약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의
+					내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스
+					약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의
+					내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스
+					약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의
+					내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스
+					약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의
+					내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스
+					약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의
+					내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.</div>
+			</div>
+		</div>
+
+		<div class="agree_payment">위 주문내역을 확인 하였으며, 회원 본인은 결제에 동의합니다.</div>
+	</div>
+	<div class="area_paybtn">
+		<div class="form_field">
+			<button type="button" class="btn btn_primary btn_block" id="btn_payment">동의 후 123,456,789원 결제하기</button>
+		</div>
+	</div>
+</div> 
+
+<script th:inline="javascript">
+var dispYn = [[${order.dispYn}]]; // 노출여부
+
+//컨텐츠 호출
+$(document).ready( function() {
+	// 화면펼침
+	if (dispYn == "Y") {
+		$("#paymentInfo .fold_head").addClass("on");
+		$("#paymentInfo .fold_cont").css("display", "block");
+	}
+});
+</script>
+
+</html>

+ 32 - 0
src/main/webapp/WEB-INF/views/web/pg/KakaoPaymentRequestWeb.html

@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : KakaoPaymentRequestWeb.html
+ * @desc    : 카카오페이 결제 요청 결과 화면
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.04   card007     최초 작성
+ *******************************************************************************
+ -->
+<head th:replace="~{web/common/fragments/HeadWeb :: head}"></head>
+<th:block th:replace="~{web/common/fragments/VariablesWeb :: variables}"></th:block>
+<th:block th:replace="~{web/common/fragments/ScriptsWeb :: scripts}"></th:block>
+<body>
+
+<script th:inline="javascript">
+	let pgToken = [[${pgToken}]];
+
+	$(document).ready(function() {
+		let result = opener.fnKakaoPaymentRequest(pgToken);
+		if (result) {
+			self.close();
+		}
+	});
+</script>
+</body>
+</html>

+ 32 - 0
src/main/webapp/WEB-INF/views/web/pg/NaverPaymentRequestWeb.html

@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : KakaoPaymentRequestWeb.html
+ * @desc    : 카카오페이 결제 요청 결과 화면
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.04   card007     최초 작성
+ *******************************************************************************
+ -->
+<head th:replace="~{web/common/fragments/HeadWeb :: head}"></head>
+<th:block th:replace="~{web/common/fragments/VariablesWeb :: variables}"></th:block>
+<th:block th:replace="~{web/common/fragments/ScriptsWeb :: scripts}"></th:block>
+<body>
+
+<script th:inline="javascript">
+	let paymentId = [[${paymentId}]];
+
+	$(document).ready(function() {
+		let result = opener.fnNaverPaymentRequest(paymentId);
+		if (result) {
+			self.close();
+		}
+	});
+</script>
+</body>
+</html>

+ 41 - 29
src/main/webapp/WEB-INF/views/web/pg/kcpOrderWeb.html

@@ -1,29 +1,49 @@
 <html lang="ko" xmlns:th="http://www.thymeleaf.org">
+<meta http-equiv="Content-Type" content="text/html; charset=euc-kr" />
+<meta http-equiv="X-UA-Compatible" content="IE=edge" />
+<meta http-equiv="Pragma" content="no-cache">
+<meta http-equiv="Expires" content="-1">
+
 	<!-- 선택, 상점이름(영문으로 작성권장) -->
-	<input type="hidden" name="site_name" th:value="${@environment.getProperty('pg.kcp.site.name')}" />
+	<input type="hidden" name="site_name"	th:value="${payment.siteName}" />
 	<!-- 필수, 상점코드 -->
-	<input type="hidden" name="site_cd" th:value="${@environment.getProperty('pg.kcp.site.cd')}" />
-
-	<input type="hidden" name="payco_redirect"	value="Y" />				<!-- 페이코 진행시 -->
-	<input type="hidden" name="pay_mthod"		value="100000000000" />		<!-- 페이코 진행시 -->
-	<input type="hidden" name="req_tx"			value="pay" />				<!-- 필수, 요청의 종류를 구분하는 변수 결제요청페이지의 경우 ‘pay’로 설정 -->
-	<input type="hidden" name="ordr_idxx"		value="100" />				<!-- 필수, 상점 관리 주문번호 (유니크한 값 설정 권장) -->
-	<input type="hidden" name="pay_method"		value="100000000000" />		<!-- 필수, 결제수단코드(신용카드 : 100000000000, 계좌이체 : 010000000000, 가상계좌 : 001000000000, 포인트 : 000100000000, 휴대폰 : 000010000000, 상품권 : 000000001000, ARS : 000000000010) -->
-	<input type="hidden" name="good_name"		value="TEST NAME" />		<!-- 필수, 상품명 -->
-	<input type="hidden" name="good_mny"		value="2000" />				<!-- 필수, 주문요청금액 (※ 화폐단위가 ‘USD’ 일 경우, Cent까지 설정 ex ) $10.55 일 경우 콤마를 뺀 1055, $100 일 경우 10000로 설정 -->
-	<input type="hidden" name="buyr_name"		value="LTY" />				<!-- 필수, 주문자 이름 -->
-	<input type="hidden" name="buyr_mail"		value="test@test.com" />	<!-- 선택, 주문자 이메일 -->
-	<input type="hidden" name="buyr_tel1"		value="" />					<!-- 선택, 주문자 전화번호 -->
-	<input type="hidden" name="buyr_tel2"		value="010-7111-4489" />	<!-- 필수, 주문자 휴대폰번호 -->
-	<input type="hidden" name="currency"		value="WON" />				<!-- 필수, 원화 : WON / 달러 : USD -->
-	<input type="hidden" name="shop_user_id"	value="xodud1202" />		<!-- 필수, 쇼핑몰회원ID 기관에 따라 RM 조치를 위해 쇼핑몰 관리 ID를 필수로 요청 -->
-
-	<input type="hidden" name="quotaopt"        value="12"/>				<!-- 최대 할부 개월 수(0 ~ 18까지 설정 가능) -->
+	<input type="hidden" name="site_cd"		th:value="${payment.siteCd}" />
+
+	<!-- 페이코 송부 정보 -->
+	<th:block th:if="${!#strings.isEmpty(payment.paycoDirect)}">
+		<input type="hidden" name="payco_direct"	th:value="${payment.paycoDirect}" />
+		<input type="hidden" name="pay_mthod"		th:value="${payment.payMthod}" />
+	</th:block>
+
+	<input type="hidden" name="req_tx"			th:value="${payment.reqTx}" />		<!-- 필수, 요청의 종류를 구분하는 변수 결제요청페이지의 경우 ‘pay’로 설정 -->
+	<input type="hidden" name="ordr_idxx"		th:value="${payment.ordrIdxx}" />	<!-- 필수, 상점 관리 주문번호 (유니크한 값 설정 권장) -->
+	<input type="hidden" name="pay_method"		th:value="${payment.payMethod}" />	<!-- 필수, 결제수단코드(신용카드 : 100000000000, 계좌이체 : 010000000000, 가상계좌 : 001000000000, 포인트 : 000100000000, 휴대폰 : 000010000000, 상품권 : 000000001000, ARS : 000000000010) -->
+	<input type="hidden" name="good_name"		th:value="${payment.goodName}" />	<!-- 필수, 상품명 -->
+	<input type="hidden" name="good_mny"		th:value="${payment.goodMny}" />	<!-- 필수, 주문요청금액 (※ 화폐단위가 ‘USD’ 일 경우, Cent까지 설정 ex ) $10.55 일 경우 콤마를 뺀 1055, $100 일 경우 10000로 설정 -->
+	<input type="hidden" name="buyr_name"		th:value="${payment.buyrName}" />	<!-- 필수, 주문자 이름 -->
+	<input type="hidden" name="buyr_mail"		th:value="${payment.buyrMail}" />	<!-- 선택, 주문자 이메일 -->
+	<input type="hidden" name="buyr_tel1"		th:value="${payment.buyrTel1}" />	<!-- 선택, 주문자 전화번호 -->
+	<input type="hidden" name="buyr_tel2"		th:value="${payment.buyrTel2}" />	<!-- 필수, 주문자 휴대폰번호 -->
+	<input type="hidden" name="currency"		th:value="${payment.currency}" />	<!-- 필수, 원화 : WON / 달러 : USD -->
+	<input type="hidden" name="shop_user_id"	th:value="${payment.shopUserId}" />	<!-- 필수, 쇼핑몰회원ID 기관에 따라 RM 조치를 위해 쇼핑몰 관리 ID를 필수로 요청 -->
+
+	<!-- 신용카드 정보 -->
+	<input type="hidden" name="quotaopt"		th:value="${payment.quotaopt}"/>	<!-- 최대 할부 개월 수(0 ~ 18까지 설정 가능) -->
+
+	<!-- 무통장입금 정보 -->
+	<!-- <input type="hidden" name="vcnt_expire_term"	th:value="${payment.vcntExpireTerm}"/> -->	<!-- 무통장입금 유효기간 설정 (3 = 3일) -->
+
+	<!-- 2012년 8월 18일 전자상거래법 개정 관련 설정 부분 -->
+	<!-- 제공 기간 설정 0:일회성 1:기간설정(ex 1:2012010120120131)  -->
+	<input type="hidden" name="good_expr"		th:value="${payment.goodExpr}" />
+
+	<!-- 표준웹 설정 정보입니다(변경 불가) -->
+	<input type="hidden" name="module_type"		th:value="${payment.moduleType}" />
 
 	<!--
-		  ※ 필 수
-			  필수 항목 : 표준웹에서 값을 설정하는 부분으로 반드시 포함되어야 합니다
-			  값을 설정하지 마십시오
+			※ 필 수
+			필수 항목 : 표준웹에서 값을 설정하는 부분으로 반드시 포함되어야 합니다
+			값을 설정하지 마십시오
 	-->
 	<input type="hidden" name="res_cd"          value=""/>
 	<input type="hidden" name="res_msg"         value=""/>
@@ -40,12 +60,4 @@
 	<input type="hidden" name="cash_yn"         value=""/>
 	<input type="hidden" name="cash_tr_code"    value=""/>
 	<input type="hidden" name="cash_id_info"    value=""/>
-
-	<!-- 2012년 8월 18일 전자상거래법 개정 관련 설정 부분 -->
-	<!-- 제공 기간 설정 0:일회성 1:기간설정(ex 1:2012010120120131)  -->
-	<input type="hidden" name="good_expr" value="0">
-
-	<!-- 표준웹 설정 정보입니다(변경 불가) -->
-	<input type="hidden" name="module_type" th:value="${@environment.getProperty('pg.kcp.module.type')}" />
-
 </html>

+ 154 - 0
src/main/webapp/WEB-INF/views/web/planning/PlanningMainFormWeb.html

@@ -0,0 +1,154 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="web/common/layout/DefaultLayoutWeb">
+<!--
+ *******************************************************************************
+ * @source  : PlanningMainFormWeb.html
+ * @desc    : 기획전메인 Page
+ *============================================================================
+ * Pastelmall
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.5   sowon     최초 작성
+ *******************************************************************************
+ -->
+<body>
+<th:block layout:fragment="content">
+	<!--  container -->
+	<div id="container" class="container dp">
+		<div class="breadcrumb"> 
+			<ul>
+				<li class="bread_home"><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MAIN);">홈</a></li>
+				<li class="bread_2depth"><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_PLANNING_MAIN);">기획전</a></li>
+				<th:block th:if="${cateNo != null}">
+				<li class="bread_3depth"><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_PLANNING_MAIN+'?cateNo='+[[${cateNo}]]);">[[${cateNm}]]</a></li>
+				</th:block>
+			</ul> 
+		</div>
+		<div class="wrap">
+			<div class="content dp_Exhibition"> <!-- 페이지특정 클래스 = dp_Exhibition -->
+				<div class="cont_head">
+					<div>
+                        <h3>기획전</h3>
+                    </div>
+				</div>
+				<div class="cont_body">
+                    <div class="best_nav">
+                        <ul>
+                            <li><button th:class="${cateNo == null ? 'active' : ''}" onclick="cfnGoToPage(_PAGE_PLANNING_MAIN);">전체</button></li>
+                             <th:block th:each="CategoryData, CategoryStat : ${categoryList}">
+                             <li><button th:class="${CategoryData.cate1No == cateNo ? 'active' : '' }" th:onclick="|cfnGoToPage(_PAGE_PLANNING_MAIN+'?cateNo=*{CategoryData.cate1No}');|">[[${CategoryData.cate1Nm}]]</button></li>
+						    </th:block>
+						    	
+                        </ul>
+                    </div>
+                    <div class="ui_row">
+                        <div class="ui_col_12">
+                            <div class="form_count">
+                                <p><span>[[${planCount}]]</span>개의 기획전</p>
+                            </div>
+                        </div>
+                    </div>
+                    <!-- 기획전 0개 -->
+                  	<th:block th:if="${planCount == 0}">
+                   	 <div class="list_content nodata"> <!-- 데이터 없을시 클래스 nodata 추가 -->
+                    </th:block>
+                     <!-- 기획전 1개 이상 -->
+                  	<th:block th:if="${planCount != 0}">
+                   	 <div class="list_content"> <!-- 데이터 없을시 클래스 nodata 추가 -->
+                    </th:block>
+                        <div class="list_defult">
+                            <div>
+                                <img src="/images/pc/ico_content_find.png" alt="">
+                                <p>등록된 기획전이 없습니다.</p>
+                            </div>
+                            <div class="ui_row">
+                                <button type="button" class="btn btn_default" onclick="cfnGoToPage(_PAGE_MAIN);"><span>홈으로 가기</span></button>
+                            </div>
+                        </div>
+                        
+                        
+                        <div class="itemsGrp">
+                        <th:block th:each="PlanData, PlanStat : ${planList}">
+                            <div class="exhi_item">
+                             
+                                <div class="exhi_item_img">
+                                    <a href="javascript:void(0);" th:onclick="fnEventGoToPage('[[${PlanData.planSq}]]');">
+                                    	<th:block th:if="${PlanData.newPlan != null}">
+                                        <div class="shape ranker"><span>NEW</span></div>
+                                        </th:block>
+                                        <img src="${@environment.getProperty('domain.image')+'/plan/'+PlanData.mainPimg}" alt=""> <!-- 430x430 사이즈 최적 -->
+                                        <div class="exhi_detail">
+                                        	<th:block th:if="${PlanData.cnt > 1}">
+                                            <p class="brand">[[${PlanData.brand}]] 외</p>
+                                            </th:block>
+                                            <th:block th:if="${PlanData.cnt <= 1}">
+                                            <p class="brand">[[${PlanData.brand}]]</p>
+                                            </th:block>
+                                            <h3 class="tit">[[${PlanData.planNm}]]</h3>
+                                            <p class="sale">신상 15%쿠폰할인</p>
+                                        </div>
+                                    </a>
+                                </div>
+                             	
+                                <div class="exhi_item_pr">
+                                    <ul class="prod_list clear">
+                                        <li>
+                                            <a href="">
+                                                <div class="img">
+                                                    <img src="/images/pc/thumb/dp_exhibition_pr01.jpg" alt="볼패딩 푸퍼점퍼">
+                                                </div>
+                                                <div class="txt">
+                                                    <p class="pr_tit">볼패딩 푸퍼점퍼 T204JP060P 볼패딩 푸퍼점퍼 T204JP060P</p>
+                                                    <p class="price"><span>25,410</span>원</p>
+                                                </div>
+                                            </a>
+                                        </li>
+                                        <li>
+                                            <a href="">
+                                                <div class="img">
+                                                    <img src="/images/pc/thumb/dp_exhibition_pr02.jpg" alt="테이퍼드 M톤 기모 데님 팬츠">
+                                                </div>
+                                                <div class="txt">
+                                                    <p class="pr_tit">테이퍼드 M톤 기모 데님 팬츠</p>
+                                                    <p class="price"><span>25,410</span>원</p>
+                                                </div>
+                                            </a>
+                                        </li>
+                                      <!--   <li>
+                                            <a href="">
+                                                <div class="img">
+                                                    <img src="/images/pc/thumb/dp_exhibition_pr03.jpg" alt="패딩 리버서블 FLEECE  점퍼">
+                                                </div>
+                                                <div class="txt">
+                                                    <p class="pr_tit">패딩 리버서블 FLEECE  점퍼</p>
+                                                    <p class="price"><span>25,410</span>원</p>
+                                                </div>
+                                            </a>
+                                        </li> -->
+                                    </ul>
+                                </div>
+                            </div>
+                            </th:block>
+             		
+             				
+                        </div>
+                    </div>
+                </div>
+		    </div>
+        </div>
+    </div>
+	<!-- // container -->	
+
+<script th:inline="javascript">
+
+</script>
+
+</th:block>
+
+</body>
+</html>

BIN=BIN
src/main/webapp/images/pc/ico_point_sm.png


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 502 - 345
src/main/webapp/ux/pc/css/layout.css


+ 1 - 1
src/main/webapp/ux/plugins/gaga/gaga.validation.js

@@ -501,7 +501,7 @@ var gagajf = {
 	 * 사용) gagajf.replaceOneQuestionMark('#registerForm');
 	 */
 	replaceOneQuestionMark : function(formId) {
-		$(formId).find('input').each(function(idx, el) {
+		$(formId).find('input[type=text]').each(function(idx, el) {
 			$(el).val($(el).val().replace(/\?+/gi, "?"));
 		});
 		

+ 178 - 47
src/main/webapp/ux/style24_link.js

@@ -19,14 +19,15 @@ const _PAGE_CUSTOMER_PWD_CHANGE_TEMP = _frontUrl + "/customer/password/change/fo
 const _PAGE_CUSTOMER_DORMANT = _frontUrl + "/customer/dormant/certify/form";						// 고객 > 휴면회원
 
 //== 상품상세 ==/
-const _PAGE_GOODS_DETAIL = _frontUrl + "/goods/detail/form?goodsCd=";		// 상품 상세
-//const _PAGE_GOODS_DETAIL = _frontUrl + "/goods/detail/coupon/layer?goodsCd=";		// 쿠폰레이어
-const _PAGE_SHOPPING_BENEFIT = _frontUrl + "/goods/shopping/benefit/layer";		// 쇼핑혜택레이어
-const _PAGE_CARD_PRMT_LAYER = _frontUrl + "/goods/card/prmt/layer";		// 카드혜택레이어
-const _PAGE_GOODS_SIZEINFO_LAYER = _frontUrl + "/goods/sizeInfo/layer?goodsCd=";		// 사이즈정보레이어
-const _PAGE_GOODS_COUNSEL_LAYER = _frontUrl + "/goods/counsel/layer?goodsCd=";		// 상품문의레이어
-const _PAGE_GOODS_DELIVERY_LAYER = _frontUrl + "/goods/delivery/layer?goodsCd=";		// 배송/교환/반품 레이어
-const _PAGE_GOODS_REVIEW_LAYER = _frontUrl + "/goods/review/layer?goodsCd=";		// 상품평 레이어
+const _PAGE_GOODS_DETAIL = _frontUrl + "/goods/detail/form?goodsCd=";						// 상품 상세
+//const _PAGE_GOODS_DETAIL = _frontUrl + "/goods/detail/coupon/layer?goodsCd=";				// 쿠폰레이어
+const _PAGE_SHOPPING_BENEFIT = _frontUrl + "/goods/shopping/benefit/layer";					// 쇼핑혜택레이어
+const _PAGE_CARD_PRMT_LAYER = _frontUrl + "/goods/card/prmt/layer";							// 카드혜택레이어
+const _PAGE_GOODS_SIZEINFO_LAYER = _frontUrl + "/goods/sizeInfo/layer?goodsCd=";			// 사이즈정보레이어
+const _PAGE_GOODS_QNA_LAYER = _frontUrl + "/goods/qna/layer/";								// 상품문의레이어
+const _PAGE_GOODS_QNA_CREATE_LAYER = _frontUrl + "/goods/qna/create/layer/";				// 상품문의레이어
+const _PAGE_GOODS_DELIVERY_LAYER = _frontUrl + "/goods/delivery/layer/";			// 배송/교환/반품 레이어
+const _PAGE_GOODS_REVIEW_LAYER = _frontUrl + "/goods/review/layer?goodsCd=";				// 상품평 레이어
 
 //== 장바구니 ==/
 
@@ -50,6 +51,7 @@ const _PAGE_MYPAGE_SECEDE = _frontUrl + "/mypage/customer/secede/form";			// 마
 //== 검색 ==/
 
 //== 기획전 ==/
+const _PAGE_PLANNING_MAIN = _frontUrl + "/planning/main/form"; 					// 기획전 메인
 
 //== 고객센터 ==/
 const _PAGE_FAQ = _frontUrl + "/callcenter/faq/form";									// 고객센터 > FAQ
@@ -67,7 +69,7 @@ const _PAGE_NOTICE = _frontUrl + "/callcenter/notice/form";								// 고객센
  * @access : public
  * @desc   : page 이동
  * <pre>
- *     cfnGoToPage(PAGE_LOGIN);
+ *	 cfnGoToPage(PAGE_LOGIN);
  * </pre>
  * @param  : page - page
  * @return : None
@@ -145,9 +147,9 @@ var cfnOpenIpinCertify = function (redirectUrl) {
 /**
  * @type   : function
  * @access : public
- * @desc   : 장바구니 등록
+ * @desc   : 장바구니 등록  temp.cartGb :C 장바구니, O:바로구매
  * <pre>
- *		cfnOpenIpinCertify(cartList);
+ *		cfnAddCart(cartList);
  *		cartList는 Array로 등록해주셔야합니다.
  *		ex) 일반 & deal 상품 장바구니 등록 (일반&딜 상품도 배열에 담아서 전송해주세요.)
  *			let compsList = [];
@@ -207,10 +209,10 @@ function cfnAddCart(cartList) {
  * @access : public
  * @desc   :  네이버 로그인
  * <pre>
- *     cfnLoginNaver();
- *     호출된 페이지에서
- *     PC: fnSnsSigninCallback(userInfo) 콜백 함수 생성 후 가지고 호출 처리
- *     MO :
+ *	 cfnLoginNaver();
+ *	 호출된 페이지에서
+ *	 PC: fnSnsSigninCallback(userInfo) 콜백 함수 생성 후 가지고 호출 처리
+ *	 MO :
  * </pre>
  * @since  : 2021/02/23
  * @author : jsshin
@@ -233,10 +235,10 @@ var cfnLoginNaver = function (requestGb, chkRememberMe) {
  * @access : public
  * @desc   : 카카오 로그인
  * <pre>
- *     cfnLoginKakao();
- *     호출된 페이지에서
- *     PC: fnSnsSigninCallback(userInfo) 콜백 함수 생성 후 가지고 호출 처리
- *     MO :
+ *	 cfnLoginKakao();
+ *	 호출된 페이지에서
+ *	 PC: fnSnsSigninCallback(userInfo) 콜백 함수 생성 후 가지고 호출 처리
+ *	 MO :
  * </pre>
  * @since  : 2021/02/23
  * @author : jsshin
@@ -259,10 +261,10 @@ var cfnLoginKakao = function (requestGb, chkRememberMe) {
  * @access : public
  * @desc   : Yes24 로그인
  * <pre>
- *     cfnLoginYes24();
- *     호출된 페이지에서
- *     PC: fnSnsSigninCallback(userInfo) 콜백 함수 생성 후 가지고 호출 처리
- *     MO :
+ *	 cfnLoginYes24();
+ *	 호출된 페이지에서
+ *	 PC: fnSnsSigninCallback(userInfo) 콜백 함수 생성 후 가지고 호출 처리
+ *	 MO :
  * </pre>
  * @since  : 2021/02/23
  * @author : jsshin
@@ -274,9 +276,9 @@ var cfnLoginYes24 = function (requestGb, chkRememberMe) {
 	let popupX = (window.screen.width / 2) - (popupWidth / 2);
 	let popupY = (window.screen.height / 3) - (popupHeight / 3);
 	if ('P' === _frontGb) {
-		//window.open(actionUrl, 'yes24Login', 'top=' + popupY + ',left=' + popupX + ',height=' + popupHeight + ',width=' + popupWidth + ', fullscreen=no,menubar=no,status=no,toolbar=no,titlebar=yes,location=no,scrollbars=yes', '');
+		window.open(actionUrl, 'yes24Login', 'top=' + popupY + ',left=' + popupX + ',height=' + popupHeight + ',width=' + popupWidth + ', fullscreen=no,menubar=no,status=no,toolbar=no,titlebar=yes,location=no,scrollbars=yes', '');
 	} else {
-		//document.location.href = actionUrl + '&requestGb=' + requestGb;
+		document.location.href = actionUrl + '&requestGb=' + requestGb;
 	}
 };
 
@@ -285,7 +287,7 @@ var cfnLoginYes24 = function (requestGb, chkRememberMe) {
  * @access : public
  * @desc   : 상품상세로 이동
  * <pre>
- *        cfnGoToGoodsDetail('A83U-TS058S');
+ *		cfnGoToGoodsDetail('A83U-TS058S');
  * </pre>
  * @param  : goodsCd - 상품코드코드. 필수
  * @param  : ithrCd - 유입경로. 필수
@@ -293,8 +295,9 @@ var cfnLoginYes24 = function (requestGb, chkRememberMe) {
  * @since  : 2021/03/02
  * @author : eskim
  */
-var cfnGoToGoodsDetail = function (goodsCd, ithrCd, contentsLoc, planDtlSq) {
+var cfnGoToGoodsDetail = function (goodsCd, colorCd, ithrCd, contentsLoc, planDtlSq) {
 	var params = goodsCd;
+	params += "&colorCd=" + colorCd;
 	if (typeof (ithrCd) != 'undefined') params += "&ithrCd=" + ithrCd;
 	if (typeof (contentsLoc) != 'undefined' && contentsLoc != "") params += "&contentsLoc=" + contentsLoc;
 	if (typeof (planDtlSq) != 'undefined') params += "&planDtlSq=" + planDtlSq;
@@ -307,7 +310,7 @@ var cfnGoToGoodsDetail = function (goodsCd, ithrCd, contentsLoc, planDtlSq) {
  * @access : public
  * @desc   : 공통 레이어 띄우기
  * <pre>
- *     cfOpenLayer(_PAGE_CARD_LAYER, 'layer_card_benefit');
+ *	 cfOpenLayer(_PAGE_CARD_LAYER, 'layer_card_benefit');
  * </pre>
  * @param  : page - page. 필수
  * @param  : tgt - 레이어가 표시될 위치(예, div 태크의 ID). 필수
@@ -315,20 +318,20 @@ var cfnGoToGoodsDetail = function (goodsCd, ithrCd, contentsLoc, planDtlSq) {
  * @param  : callbackFnc - 콜백함수. 옵션
  */
 function cfOpenLayer(page, tgt, oParam, callbackFnc) {
-    if (!oParam) oParam = new Object();
-
-    $.post(page
-        , oParam
-        , function (result) {
-            $('#' + tgt).html(result);
-            $('#' + tgt).modal("show");
-            //$('#' + tgt).show();
-            layerPop_resize(tgt);
-            if (callbackFnc && $.isFunction(callbackFnc))
-                callbackFnc();
-        }
-        , "html");
-    return false;
+	if (!oParam) oParam = new Object();
+
+	$.post(page
+		, oParam
+		, function (result) {
+			$('#' + tgt).html(result);
+			$('#' + tgt).modal("show");
+			//$('#' + tgt).show();
+			//layerPop_resize(tgt);
+			if (callbackFnc && $.isFunction(callbackFnc))
+				callbackFnc();
+		}
+		, "html");
+	return false;
 }
 
 /**
@@ -336,14 +339,33 @@ function cfOpenLayer(page, tgt, oParam, callbackFnc) {
  * @access : public
  * @desc   : 공통 레이어 위치 조정
  * <pre>
- *     layerPop_resize('layer_card_benefit');
+ *	 layerPop_resize('layer_card_benefit');
  * </pre>
  * @param  : tgt - 레이어가 표시될 위치(예, div 태크의 ID). 필수
  */
 function layerPop_resize(tgt) {
-    var thisH = $("#" + tgt).find(".modal").outerHeight();
-    var thisT = ($(window).height() / 2) - (thisH / 2);
-    $("#" + tgt).find(".modal").css('top', thisT + 'px');
+	var thisH = $("#" + tgt).find(".modal").outerHeight();
+	var thisT = ($(window).height() / 2) - (thisH / 2);
+	$("#" + tgt).find(".modal").css('top', thisT + 'px');
+}
+
+/**
+ * @type   : function
+ * @access : public
+ * @desc   : 공통 레이어 닫기(레이어 숨기기)
+ * <pre>
+ *	 cfCloseLayer("layer_card_benefit");
+ * </pre>
+ * @param  : tgt - 숨길 레이어 ID(예, div 태크의 ID). 필수
+ */
+function cfCloseLayer(tgt) {
+	if (_frontGb == "M"){
+		btnClose(tgt);
+	}else{
+		$('#' + tgt).hide();
+		$('#' + tgt).remove();
+	}
+	return false;
 }
 
 /**
@@ -362,4 +384,113 @@ function cfCardInfo() {
 	}
 
 	cfOpenLayer(_PAGE_CARD_PRMT_LAYER, 'layer_card_benefit');
-}
+}
+
+
+/**
+ * @type   : function
+ * @access : public
+ * @desc   : 공통 full 레이어 띄우기
+ * <pre>
+ *	 cfOpenFullLayer(_PAGE_CARD_LAYER, 'layer_card_benefit');
+ * </pre>
+ * @param  : page - page. 필수
+ * @param  : tgt - 레이어가 표시될 위치(예, div 태크의 ID). 필수
+ * @param  : oParam - Parameter Object. 옵션
+ * @param  : callbackFnc - 콜백함수. 옵션
+ */
+function cfOpenFullLayer(page, tgt, oParam, callbackFnc) {
+	if (!oParam) oParam = new Object();
+
+	$.post(page
+		, oParam
+		, function (result) {
+			$('body').addClass('lock');
+			$('#' + tgt).html(result);
+			$('#' + tgt).show();
+			if (callbackFnc && $.isFunction(callbackFnc))
+				callbackFnc();
+		}
+		, "html");
+	return false;
+}
+
+/**
+ * @type   : function
+ * @access : public
+ * @desc   : 공통 full 레이어 닫기(레이어 숨기기)
+ * <pre>
+ *	 cfCloseFullLayer("layer_card_benefit");
+ * </pre>
+ * @param  : tgt - 숨길 레이어 ID(예, div 태크의 ID). 필수
+ */
+function cfCloseFullLayer(tgt) {
+	//if (_frontGb == "M"){
+	//	btnClose(tgt);
+	//}else{
+		$('#' + tgt).hide();
+		$('#' + tgt).remove();
+		$('body').removeClass('lock');
+	//}
+	return false;
+}
+
+/**
+* @type   : function
+* @access : public
+* @desc   : 상품문의 full 팝업
+* <pre>
+*		cfGoodsQngReg();
+* </pre>
+*/
+function cfGoodsQng(goodsCd) {
+	var Param = new Object();
+	var str = '<div class="pd_pop full_pop pd_qnalist_pop" id="layer_goods_qna">';
+
+	if ($('#layer_goods_qna').length == 0) {
+		$('body').append(str);
+	}
+
+	cfOpenFullLayer(_PAGE_GOODS_QNA_LAYER + goodsCd, 'layer_goods_qna');
+}
+
+/**
+* @type   : function
+* @access : public
+* @desc   : 상품문의 등록 팝업
+* <pre>
+*		cfGoodsQngReg();
+* </pre>
+*/
+function cfGoodsQngCreate(goodsCd) {
+	var Param = new Object();
+	var str = '<div class="modal fade pd_pop pd_qnawrite_pop" id="layer_goods_qna_reg" tabindex="-1" role="dialog" aria-labelledby="pdQnaWriteLabel" aria-hidden="true">';
+
+	if ($('#layer_goods_qna_reg').length == 0) {
+		$('body').append(str);
+	}
+
+	cfOpenLayer(_PAGE_GOODS_QNA_CREATE_LAYER + goodsCd, 'layer_goods_qna_reg');
+}
+
+
+/**
+* @type   : function
+* @access : public
+* @desc   : 상품문의 full 팝업
+* <pre>
+*		cfGoodsQngReg();
+* </pre>
+*/
+function cfGoodsDelivery(goodsCd) {
+	var Param = new Object();
+	var str = '<div class="pd_pop full_pop pd_delivery_pop" id="layer_goods_delivery">';
+
+	if ($('#layer_goods_delivery').length == 0) {
+		$('body').append(str);
+	}
+
+	cfOpenFullLayer(_PAGE_GOODS_DELIVERY_LAYER + goodsCd, 'layer_goods_delivery');
+}
+
+

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio