فهرست منبع

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

jsh77b 5 سال پیش
والد
کامیت
578666233a
37فایلهای تغییر یافته به همراه1090 افزوده شده و 638 حذف شده
  1. 12 1
      src/main/java/com/style24/front/biz/dao/TsfCouponDao.java
  2. 8 0
      src/main/java/com/style24/front/biz/dao/TsfDisplayDao.java
  3. 11 1
      src/main/java/com/style24/front/biz/dao/TsfPlanningDao.java
  4. 11 7
      src/main/java/com/style24/front/biz/service/TsfCartService.java
  5. 23 2
      src/main/java/com/style24/front/biz/service/TsfCouponService.java
  6. 13 0
      src/main/java/com/style24/front/biz/service/TsfDisplayService.java
  7. 44 9
      src/main/java/com/style24/front/biz/service/TsfOrderChangeService.java
  8. 2 2
      src/main/java/com/style24/front/biz/service/TsfOrderService.java
  9. 12 0
      src/main/java/com/style24/front/biz/service/TsfPlanningService.java
  10. 14 0
      src/main/java/com/style24/front/biz/web/TsfDisplayController.java
  11. 37 33
      src/main/java/com/style24/front/biz/web/TsfMypageController.java
  12. 57 15
      src/main/java/com/style24/front/biz/web/TsfPlanningController.java
  13. 3 0
      src/main/java/com/style24/persistence/domain/Cart.java
  14. 4 0
      src/main/java/com/style24/persistence/domain/Contents.java
  15. 3 0
      src/main/java/com/style24/persistence/domain/GnbTab.java
  16. 5 0
      src/main/java/com/style24/persistence/domain/Plan.java
  17. 48 39
      src/main/java/com/style24/persistence/mybatis/shop/TsfCart.xml
  18. 276 182
      src/main/java/com/style24/persistence/mybatis/shop/TsfCoupon.xml
  19. 42 4
      src/main/java/com/style24/persistence/mybatis/shop/TsfDisplay.xml
  20. 9 7
      src/main/java/com/style24/persistence/mybatis/shop/TsfOrderChange.xml
  21. 14 1
      src/main/java/com/style24/persistence/mybatis/shop/TsfPlanning.xml
  22. 34 62
      src/main/webapp/WEB-INF/views/mob/cart/CartChangeOptionPopupMob.html
  23. 51 0
      src/main/webapp/WEB-INF/views/mob/cart/CartListFormMob.html
  24. 40 124
      src/main/webapp/WEB-INF/views/mob/goods/GoodsDetailFormMob.html
  25. 13 12
      src/main/webapp/WEB-INF/views/web/cart/CartChangeOptionPopupWeb.html
  26. 0 15
      src/main/webapp/WEB-INF/views/web/cart/CartListFormWeb.html
  27. 104 14
      src/main/webapp/WEB-INF/views/web/common/fragments/FooterWeb.html
  28. 41 28
      src/main/webapp/WEB-INF/views/web/common/fragments/GnbWeb.html
  29. 1 5
      src/main/webapp/WEB-INF/views/web/common/layout/PlanningLayoutWeb.html
  30. 65 7
      src/main/webapp/WEB-INF/views/web/display/MallMainFormWeb.html
  31. 2 0
      src/main/webapp/WEB-INF/views/web/mypage/MypageCancelFormWeb.html
  32. 27 43
      src/main/webapp/WEB-INF/views/web/mypage/MypageCouponDetailFormWeb.html
  33. 29 15
      src/main/webapp/WEB-INF/views/web/mypage/MypageCouponFormWeb.html
  34. 3 1
      src/main/webapp/WEB-INF/views/web/mypage/MypageCreCancelDetailFormWeb.html
  35. 1 1
      src/main/webapp/WEB-INF/views/web/mypage/MypageCreReturnDetailFormWeb.html
  36. 14 3
      src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html
  37. 17 5
      src/main/webapp/biz/mypage.js

+ 12 - 1
src/main/java/com/style24/front/biz/dao/TsfCouponDao.java

@@ -94,7 +94,7 @@ public interface TsfCouponDao {
 	 * @author sowon
 	 * @since 2021. 03. 17
 	 */
-	Coupon getCouponDetailInfo(int cpnId);
+	Coupon getCouponDetailInfo(Coupon coupon);
 	
 	/**
 	 * 마이페이지 등급쿠폰 다운가능 쿠폰 정보 조회
@@ -127,4 +127,15 @@ public interface TsfCouponDao {
 	Coupon getCustGradePolicyCoupon(Coupon coupon);
 	
 	
+	/**
+	 * 기획전 쿠폰 디테일 정보
+	 * @param coupon - 쿠폰정보
+	 * @return Coupon
+	 * @author sowon
+	 * @since 2021. 03. 17
+	 */
+	Coupon getPlanCouponDetailInfo(Coupon coupon);
+	
+	
+	
 }

+ 8 - 0
src/main/java/com/style24/front/biz/dao/TsfDisplayDao.java

@@ -208,4 +208,12 @@ public interface TsfDisplayDao {
 	 */
 	String getBrandGroupDefaultCategoryYn(Integer brandGroupNo);
 
+	/**
+	 * GNB TAB 기획전배너 목록
+	 * @param contents - 컨텐츠 정보
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 4. 14
+	 */
+	Collection<Contents> getGnbTabBannerList(Contents contents);
 }

+ 11 - 1
src/main/java/com/style24/front/biz/dao/TsfPlanningDao.java

@@ -273,7 +273,7 @@ public interface TsfPlanningDao {
 	int getCustAnswerCount(Plan plan);
 	
 	/**
-	 * 설문조사 선착순 운트
+	 * 설문조사 선착순 운트
 	 *
 	 * @param poll
 	 * @return int
@@ -332,6 +332,16 @@ public interface TsfPlanningDao {
 	 */
 	int getAttendEntryCount(Plan plan);
 	
+	/**
+	 * 출석체크 혜택 리스트
+	 *
+	 * @param Plan
+	 * @return Collection<Plan>
+	 * @author sowon
+	 * @date 2021. 4. 14
+	 */
+	Collection<Plan> getAttendBenefitList(Plan plan);
+	
 	/**
 	 * 고객이 출석한 일 리스트
 	 *

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

@@ -1029,13 +1029,6 @@ public class TsfCartService {
 			result.put("message", "품절입니다.");
 			return result;
 		}
-		
-		// 현재 장바구니 수량
-		/*int goodsCartCnt = cartDao.getHasGoodsCartCnt(param);
-
-		if (param.getGoodsQty() + goodsCartCnt > goods.getDayMaxOrdQty()) {
-			throw new IllegalArgumentException("1일 구매한도 수량이 초과되었습니다.");
-		}*/
 
 		// 구성 상품 재고 확인
 		for(int i = 0 ; i < param.getCartDtlSqArr().length ; i++) {
@@ -1055,6 +1048,17 @@ public class TsfCartService {
 			}
 		}
 
+		// 각 구성상품의 품절 여부 체크 후 최소, 최대 상품 수량 체크
+		if (goods.getMinOrdQty() > param.getGoodsQty()) {
+			result.put("status", "FAIL");
+			result.put("message", "해당 상품의 최소 주문 수량은 " + goods.getMinOrdQty() + "개 입니다.");
+			return result;
+		} else if (goods.getMaxOrdQty() < param.getGoodsQty()) {
+			result.put("status", "FAIL");
+			result.put("message", "해당 상품의 최대 주문 수량은 " + goods.getMaxOrdQty() + "개 입니다.");
+			return result;
+		}
+
 		StringBuilder sb = new StringBuilder();
 		if(TscConstants.GoodsType.SET.value().equals(param.getGoodsType())) {
 			// 장바구니 보유 CART_SQ 쿼리

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

@@ -433,6 +433,8 @@ public class TsfCouponService {
 	 */
 	public Collection<Coupon> getMypageCouponList(Coupon coupon) {
 		coupon.setCustNo(TsfSession.getInfo().getCustNo());
+		coupon.setFrontGb(TsfSession.getFrontGb());
+		coupon.setSiteCd(TscConstants.Site.STYLE24.value());
 		return couponDao.getMypageCouponList(coupon);
 	}
 	
@@ -445,6 +447,8 @@ public class TsfCouponService {
 	 */
 	public Coupon getMypageCouponInfo(Coupon param) {
 		param.setCustNo(TsfSession.getInfo().getCustNo());
+		param.setFrontGb(TsfSession.getFrontGb());
+		param.setSiteCd(TscConstants.Site.STYLE24.value());
 		return couponDao.getMypageCouponInfo(param);
 	}
 	
@@ -455,8 +459,11 @@ public class TsfCouponService {
 	 * @author sowon
 	 * @since 2021. 03. 16
 	 */
-	public Coupon getCouponDetailInfo(int cpnId) {
-		return couponDao.getCouponDetailInfo(cpnId);
+	public Coupon getCouponDetailInfo(Coupon coupon) {
+		coupon.setCustNo(TsfSession.getInfo().getCustNo());
+		coupon.setFrontGb(TsfSession.getFrontGb());
+		coupon.setSiteCd(TscConstants.Site.STYLE24.value());
+		return couponDao.getCouponDetailInfo(coupon);
 	}
 	
 	
@@ -585,5 +592,19 @@ public class TsfCouponService {
 		}
 		return resultCnt;
 	}
+	
+	/**
+	 * 기획전 쿠폰 디테일 정보
+	 * @param cpnId
+	 * @return
+	 * @author sowon
+	 * @since 2021. 04. 14
+	 */
+	public Coupon getPlanCouponDetailInfo(Coupon coupon) {
+		coupon.setFrontGb(TsfSession.getFrontGb());
+		coupon.setSiteCd(TscConstants.Site.STYLE24.value());
+		return couponDao.getPlanCouponDetailInfo(coupon);
+	}
+	
 
 }

+ 13 - 0
src/main/java/com/style24/front/biz/service/TsfDisplayService.java

@@ -1,6 +1,7 @@
 package com.style24.front.biz.service;
 
 import java.util.Collection;
+import java.util.ArrayList;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.Cacheable;
@@ -476,4 +477,16 @@ public class TsfDisplayService {
 		return displayDao.getAllBrandList(brandGroup);
 	}
 
+	/**
+	 * GNB TAB 기획전배너 리스트
+	 * @param Contents
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 4. 14
+	 */
+	public Collection<Contents> getGnbTabBannerlist(Contents contenst){
+		Collection<Contents> contentsList = displayDao.getGnbTabBannerList(contenst);
+		return contentsList;
+	}
+
 }

+ 44 - 9
src/main/java/com/style24/front/biz/service/TsfOrderChangeService.java

@@ -163,35 +163,54 @@ public class TsfOrderChangeService {
 		Collection<Order> cnclRtnList = orderChangeDao.getRefundPreInfo(orderChange);
 		Order cnclRtn = cnclRtnList.iterator().next();
 
-		// 전체 취소여부 설정
+		// 전체 및 마지막 취소여부 설정
+		String delvFeeCd = "";
 		String allCanYn = "Y";
+		List<String> delvFeeCdList = new ArrayList<>();
 		for (Order order : cnclRtnList) {
 			int index = ordDtlNoList.indexOf(order.getOrdDtlNo());
-			if ("Y".equals(allCanYn) && (index < 0 || cnclRtnReqQtyArr[index] != order.getOrdQty())) {
+			int ordQty = order.getOrdQty();
+			int cnclRtnQty = order.getCnclRtnQty();
+
+			// 전체 취소 여부 설정
+			if ("Y".equals(allCanYn) && (index < 0 || cnclRtnReqQtyArr[index] != ordQty)) {
 				allCanYn = "N";
 			}
+
+			// 마지막 취소 여부 설정
+			if ((index < 0 || cnclRtnReqQtyArr[index] != (ordQty - cnclRtnQty)) && !delvFeeCd.equals(order.getDelvFeeCd())) {
+				delvFeeCdList.add(order.getDelvFeeCd());
+				delvFeeCd = order.getDelvFeeCd();
+			}
 		}
 
 		// 무통장입금 전 전체 취소여부 설정
 		String allCanYnBeforePayment = "N";
-		if ("Y".equals(allCanYn) && TscConstants.PayMeans.BANK_DEPOSIT.value().equals(cnclRtn.getPayMeans()) && TscConstants.PaymentStat.PAYMENT_WAIT.value().equals(cnclRtn.getPayStat())) {
+		if ("Y".equals(allCanYnBeforePayment) && TscConstants.PayMeans.BANK_DEPOSIT.value().equals(cnclRtn.getPayMeans()) && TscConstants.PaymentStat.PAYMENT_WAIT.value().equals(cnclRtn.getPayStat())) {
 			allCanYnBeforePayment = "Y";
 		}
-		
+
 		// 전체 취소여부 및 취소/반품 수량 설정
 		for (Order order : cnclRtnList) {
-			// 변경 수량 설정
 			int index = ordDtlNoList.indexOf(order.getOrdDtlNo());
 			if (index >= 0) {
+				// 마지막 취소 여부 설정
+				if (delvFeeCdList.contains(order.getDelvFeeCd())) {
+					order.setLastCanYn("N");
+				} else {
+					order.setLastCanYn("Y");
+				}
+
+				// 변경 수량 설정
 				order.setOrdCanChgQty(cnclRtnReqQtyArr[index]);
-				order.setAllCanYn(allCanYn);
+
 				cnclReqList.add(order);
 			}
 		}
 		
-		
-		result.setString("allCanYn", allCanYnBeforePayment);
-		result.set("cnclReqList", cnclReqList);
+		result.setString("allCanYn", allCanYn);									// 전체 취소 여부
+		result.setString("allCanYnBeforePayment", allCanYnBeforePayment);		// 무통장입금전 전체 취소 여부
+		result.set("cnclReqList", cnclReqList);									// 취소신청목록
 
 		return result;
 	}
@@ -329,6 +348,7 @@ public class TsfOrderChangeService {
 	public GagaMap getCreCancelDetailInfo(OrderChange orderChange) {
 		GagaMap map = new GagaMap();
 		Collection<OrderChange> result = new ArrayList<>();
+		String refundYn = "N";
 
 		for (OrderChange tmpOrderChange : orderChangeDao.getCreCancelDetailInfo(orderChange)) {
 			// 세트상품 옵션별 배열로 담기
@@ -345,6 +365,12 @@ public class TsfOrderChangeService {
 				tmpOrderChange.setOptCd2Arr(arr4);
 			}
 
+			// 취소 전표 확인 용 환불 여부 설정
+			String chgStat = tmpOrderChange.getChgStat();
+			if ("N".equals(refundYn) && (TscConstants.OrderChangeStat.PAYMENT_BEFORE_CANCEL.value().equals(chgStat) || TscConstants.OrderChangeStat.PAYMENT_AFTER_CANCEL.value().equals(chgStat))) {
+				refundYn = "Y";
+			}
+
 			result.add(tmpOrderChange);
 		}
 
@@ -353,6 +379,7 @@ public class TsfOrderChangeService {
 			oneData = result.iterator().next();
 		}
 
+		map.set("refundYn", refundYn);
 		map.set("oneData", oneData);
 		map.set("cancelDetailList", result);
 
@@ -370,6 +397,7 @@ public class TsfOrderChangeService {
 	public GagaMap getCreReturnDetailInfo(OrderChange orderChange) {
 		GagaMap map = new GagaMap();
 		Collection<OrderChange> result = new ArrayList<>();
+		String refundYn = "N";
 
 		for (OrderChange tmpOrderChange : orderChangeDao.getCreReturnDetailInfo(orderChange)) {
 			// 세트상품 옵션별 배열로 담기
@@ -386,6 +414,12 @@ public class TsfOrderChangeService {
 				tmpOrderChange.setOptCd2Arr(arr4);
 			}
 
+			// 취소 전표 확인 용 환불 여부 설정
+			String chgStat = tmpOrderChange.getChgStat();
+			if ("N".equals(refundYn) && TscConstants.OrderChangeStat.RETURN_COMPLETE.value().equals(chgStat)) {
+				refundYn = "Y";
+			}
+
 			result.add(tmpOrderChange);
 		}
 
@@ -394,6 +428,7 @@ public class TsfOrderChangeService {
 			oneData = result.iterator().next();
 		}
 
+		map.set("refundYn", refundYn);
 		map.set("oneData", oneData);
 		map.set("returnDetailList", result);
 

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

@@ -22,7 +22,6 @@ import com.style24.front.biz.dao.TsfOrderDao;
 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.GoodsStock;
 import com.style24.persistence.domain.KakaoPay;
 import com.style24.persistence.domain.NaverPay;
 import com.style24.persistence.domain.Order;
@@ -333,7 +332,8 @@ public class TsfOrderService {
 			// TB_PAYMENT 등록. 실패시 PG 환불.
 			if(coreOrderDao.insertPayment(result) < 1) {
 				if(TscConstants.PgGb.KCP.value().equals(param.getPgGb()) || TscConstants.PgGb.PAYCO.value().equals(param.getPgGb())) {
-					coreKcpService.kcpPayRollBack(result, request);
+					result.setIpAddress(request.getRemoteAddr());
+					coreKcpService.kcpPayRollBack(result);
 				} else if (TscConstants.PgGb.KAKAO.value().equals(param.getPgGb())) {
 					coreKakaoPayService.kakaoPayRollBack(param);
 				} else if (TscConstants.PgGb.NAVER.value().equals(param.getPgGb())) {

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

@@ -516,6 +516,18 @@ public class TsfPlanningService {
 		plan.setCustNo(TsfSession.getInfo().getCustNo());
 		return planningDao.getCustAttendEntryList(plan);
 	}
+	
+	/**
+	 * 출석체크 혜택 리스트
+	 *
+	 * @param Plan
+	 * @return Collection<Plan>
+	 * @author sowon
+	 * @date 2021. 4. 14
+	 */
+	public Collection<Plan> getAttendBenefitList(Plan plan){
+		return planningDao.getAttendBenefitList(plan);
+	}
 
 	/**
 	 * 기획전/이벤트 댓글

+ 14 - 0
src/main/java/com/style24/front/biz/web/TsfDisplayController.java

@@ -664,4 +664,18 @@ public class TsfDisplayController extends TsfBaseController {
 		return result;
 	}
 
+	/**
+	 * GNB TAB 기획전배너 리스트
+	 * @param Contents
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 4. 14
+	 */
+	@GetMapping("/gnb/tab/banner/list")
+	@ResponseBody
+	public Collection<Contents> getGnbTabBannerlist(Contents contents) {
+		contents.setContentsLoc("STAB003");
+		return displayService.getGnbTabBannerlist(contents);
+	}
+
 }

+ 37 - 33
src/main/java/com/style24/front/biz/web/TsfMypageController.java

@@ -17,6 +17,9 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
+import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.rest.server.GagaResponse;
+import com.gagaframework.web.rest.server.GagaResponseStatus;
 import com.style24.core.biz.service.TscCouponService;
 import com.style24.core.biz.service.TscCustomerService;
 import com.style24.core.biz.service.TscKakaoPayService;
@@ -58,10 +61,6 @@ import com.style24.persistence.domain.WishList;
 
 import lombok.extern.slf4j.Slf4j;
 
-import com.gagaframework.web.parameter.GagaMap;
-import com.gagaframework.web.rest.server.GagaResponse;
-import com.gagaframework.web.rest.server.GagaResponseStatus;
-
 /**
  * 마이페이지 Controller
  * 
@@ -735,40 +734,38 @@ public class TsfMypageController extends TsfBaseController {
 		GagaMap refundPreInfo = orderChangeService.getRefundPreInfo(orderChange);
 		List<Order> cnclReqList = (List<Order>)refundPreInfo.get("cnclReqList");
 		String allCanYn = refundPreInfo.getString("allCanYn");
+		String allCanYnBeforePayment = refundPreInfo.getString("allCanYnBeforePayment");
 
-		// 2. 환불금액계산
+		// 3. 환불금액계산
 		// 2021.01.19 취소신청정보를 목록 (주문상세번호, 취소/반품수량) 으로 표현
 		GagaMap result = coreOrderRefundService.cnclRtnRefundAmt(cnclReqList);
 
-		// 무통장입금전 전체취소 여부
-
-		// 3. 주문변경 기본정보 설정
+		// 4. 주문변경 기본정보 설정
 		result.set("ordNo", orderChange.getOrdNo());				// 주문번호
 		result.set("ordChgSq", orderChange.getOrdChgSq());			// 주문변경번호
-		result.set("chgReason", orderChange.getChgReason());			// 변경사유
+		result.set("chgReason", orderChange.getChgReason());		// 변경사유
 		result.set("chgMemo", orderChange.getChgMemo());			// 변경메모
 
-		result.set("accountNo", orderChange.getAccountNo());			// 환불계좌번호
-		result.set("accountNm", orderChange.getAccountNm());			// 환불계좌예금주명
+		result.set("accountNo", orderChange.getAccountNo());		// 환불계좌번호
+		result.set("accountNm", orderChange.getAccountNm());		// 환불계좌예금주명
 		result.set("bankCd", orderChange.getBankCd());				// 환불계좌은행코드
 
-		result.set("allCanYn", allCanYn);							// 무통장입금전 전체취소 여부
-		result.set("isCustomer", orderChange.getIsCustomer());			// 변경사유 (고객, 회사)
+		result.set("allCanYnBeforePayment", allCanYnBeforePayment);	// 무통장입금전 전체취소 여부
+		result.set("isCustomer", orderChange.getIsCustomer());		// 변경사유 (고객, 회사)
 
-		// 4. 주문변경 회수지정보 추가
-		result.set("chgerNm", orderChange.getChgerNm());			// 변경자명
-		result.set("chgerEmail", orderChange.getChgerEmail());			// 변경자이메일주소
-		result.set("chgerPhnno", orderChange.getChgerPhnno());			// 변경자핸드폰번호
-		result.set("chgerTelno", orderChange.getChgerTelno());			// 변경자전화번호
+		// 5. 주문변경 회수지정보 추가
+		// result.set("chgerNm", orderChange.getChgerNm());			// 변경자명
+		// result.set("chgerEmail", orderChange.getChgerEmail());		// 변경자이메일주소
+		// result.set("chgerPhnno", orderChange.getChgerPhnno());		// 변경자핸드폰번호
+		// result.set("chgerTelno", orderChange.getChgerTelno());		// 변경자전화번호
 
 		result.set("reqGbn", orderChange.getReqGbn());				// 신청구분
 
-		// 5. 주문변경 DB 등록 (TB_ORDER_CHANGE, TB_ORDER_CHANGE_DETAIL)
+		// 6. 주문변경 DB 등록 (TB_ORDER_CHANGE, TB_ORDER_CHANGE_DETAIL)
 		coreOrderChangeService.cnclComplete(result, custNo);
 
 		result.set("status", GagaResponseStatus.SUCCESS.getCode());
 		result.set("message", message.getMessage("CANCEL_0001"));
-		// result.set("message", message.getMessage("SUCC_0004"));
 
 		return result;
 	}
@@ -1303,6 +1300,22 @@ public class TsfMypageController extends TsfBaseController {
 
 		return mav;
 	}
+	
+	/**
+	 * 퀵메뉴 보유한 쿠폰리스트
+	 * @return
+	 * @author sowon
+	 * @since 2021. 4. 14
+	 */
+	@GetMapping("/quick/own/coupon/list")
+	@ResponseBody
+	public Collection<Coupon> getQuickOwnCouponList() {
+		Coupon coupon = new Coupon();
+		Collection<Coupon> ownCouponList = new ArrayList<>();
+		coupon.setQuickYn("Y");
+		ownCouponList  = couponService.getMypageCouponList(coupon);
+		return ownCouponList;
+	}
 
 	/**
 	 * 마이페이지 쿠폰 상세보기 팝업
@@ -1311,22 +1324,13 @@ public class TsfMypageController extends TsfBaseController {
 	 * @author sowon	
 	 * @since 2021. 03. 17
 	 */
-	@GetMapping(value = "/coupon/detailPop")
-	public ModelAndView mypageCouponDetailPop(@RequestParam(value = "cpnId") int cpnId) {
+	@PostMapping(value = "/coupon/detailPop")
+	public ModelAndView mypageCouponDetailPop(@RequestBody Coupon coupon) {
 		ModelAndView mav = new ModelAndView();
 
 		// 쿠폰 - 기본정보
-		mav.addObject("couponDetailInfo", couponService.getCouponDetailInfo(cpnId));
-		// 쿠폰적용대상 - 공급업체 조회
-		mav.addObject("cpnDtlRefvalSupplyCompList", coreCouponService.getCouponRefvalSupplyCompList(cpnId));
-		// 쿠폰적용대상 - 적용상품 조회
-		mav.addObject("cpnDtlRefvalApplyGoodsList", coreCouponService.getCouponRefvalGoodsList(cpnId, "G260_10"));
-		// 쿠폰적용대상 - 카테고리 조회
-		mav.addObject("cpnDtlRefvalCateList", coreCouponService.getCouponRefvalCategoryList(cpnId));
-		// 쿠폰적용대상 - 브랜드 조회
-		mav.addObject("cpnDtlRefvalBrandList", coreCouponService.getCouponRefvalBrandList(cpnId));
-		// 쿠폰적용대상 - 제외상품 조회
-		mav.addObject("cpnDtlRefvalExceptGoodsList", coreCouponService.getCouponRefvalGoodsList(cpnId, "G260_14"));
+		mav.addObject("couponDetailInfo", couponService.getCouponDetailInfo(coupon));
+		
 		mav.setViewName(super.getDeviceViewName("mypage/MypageCouponDetailForm"));
 		return mav;
 	}

+ 57 - 15
src/main/java/com/style24/front/biz/web/TsfPlanningController.java

@@ -20,6 +20,7 @@ import org.springframework.web.servlet.ModelAndView;
 
 import com.style24.core.biz.service.TscCouponService;
 import com.style24.core.biz.service.TscCustomerService;
+import com.style24.core.biz.service.TscPointService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.front.biz.service.TsfCouponService;
@@ -32,6 +33,7 @@ import com.style24.persistence.domain.CustDeliveryAddr;
 import com.style24.persistence.domain.Customer;
 import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.Plan;
+import com.style24.persistence.domain.Point;
 import com.style24.persistence.domain.Poll;
 import com.style24.persistence.domain.Review;
 import com.style24.persistence.domain.WishList;
@@ -72,6 +74,9 @@ public class TsfPlanningController extends TsfBaseController {
 
 	@Autowired
 	private TsfDisplayService displayService;
+	
+	@Autowired
+	private TscPointService corePointService;
 
 	/**
 	 * 기획전 메인 화면
@@ -238,6 +243,24 @@ public class TsfPlanningController extends TsfBaseController {
 		return mav;
 	}
 	
+	/**
+	 * 기획전 쿠폰 상세보기 팝업
+	 *
+	 * @return
+	 * @author sowon	
+	 * @since 2021. 04. 14
+	 */
+	@PostMapping(value = "/coupon/detailPop")
+	public ModelAndView planningCouponDetailPop(@RequestBody Coupon coupon) {
+		ModelAndView mav = new ModelAndView();
+
+		// 쿠폰 - 기본정보
+		mav.addObject("couponDetailInfo", couponService.getPlanCouponDetailInfo(coupon));
+		
+		mav.setViewName(super.getDeviceViewName("mypage/MypageCouponDetailForm"));
+		return mav;
+	}
+	
 	/**
 	 * 기획전/이벤트 댓글 리스트
 	 *
@@ -303,21 +326,11 @@ public class TsfPlanningController extends TsfBaseController {
 	 * @since 2021. 04. 01
 	 */
 	@GetMapping(value = "/coupon/detail")
-	public ModelAndView mypageCouponDetailPop(@RequestParam(value = "cpnId") int cpnId) {
+	public ModelAndView mypageCouponDetailPop(@RequestBody Coupon coupon) {
 		ModelAndView mav = new ModelAndView();
 
 		// 쿠폰 - 기본정보
-		mav.addObject("couponDetailInfo", couponService.getCouponDetailInfo(cpnId));
-		// 쿠폰적용대상 - 공급업체 조회
-		mav.addObject("cpnDtlRefvalSupplyCompList", coreCouponService.getCouponRefvalSupplyCompList(cpnId));
-		// 쿠폰적용대상 - 적용상품 조회
-		mav.addObject("cpnDtlRefvalApplyGoodsList", coreCouponService.getCouponRefvalGoodsList(cpnId, "G260_10"));
-		// 쿠폰적용대상 - 카테고리 조회
-		mav.addObject("cpnDtlRefvalCateList", coreCouponService.getCouponRefvalCategoryList(cpnId));
-		// 쿠폰적용대상 - 브랜드 조회
-		mav.addObject("cpnDtlRefvalBrandList", coreCouponService.getCouponRefvalBrandList(cpnId));
-		// 쿠폰적용대상 - 제외상품 조회
-		mav.addObject("cpnDtlRefvalExceptGoodsList", coreCouponService.getCouponRefvalGoodsList(cpnId, "G260_14"));
+		mav.addObject("couponDetailInfo", couponService.getCouponDetailInfo(coupon));
 		mav.setViewName(super.getDeviceViewName("planning/PlanningCouponDetailForm"));
 		return mav;
 	}
@@ -577,17 +590,46 @@ public class TsfPlanningController extends TsfBaseController {
 	@ResponseBody
 	public GagaMap planningAttendEntry(@RequestBody Plan plan) throws Exception {
 		GagaMap result = new GagaMap();
+		plan.setEntryAllYn("N");
 		int count = planningService.getAttendEntryCount(plan);
 		if (count > 0) {
 			result.set("msg", "이미 출석체크 되었습니다.");
 		}else {
 			planningService.saveAttendEntry(plan);
-			result.set("msg", "출석체크 되었습니다.");
-			result.set("custAttendList",planningService.getCustAttendEntryList(plan));
 			
+			// 총 출석일 수 구해보장.. 
+			Collection<Plan> benefitList = planningService.getAttendBenefitList(plan);
+			plan.setEntryAllYn("Y");
+			count = planningService.getAttendEntryCount(plan);
+			for (Plan tPlan : benefitList) {
+				if (tPlan.getBasDays() == count) {
+					System.out.println("여기들어오니?1");
+					// 지급 방식이 포인트일 경우
+					if (tPlan.getBenefitGb().equals("P")) {
+						Point point = new Point();
+						int pointAmt = tPlan.getPntAmt();
+						point.setRegNo(TsfSession.getInfo().getCustNo());
+						point.setUpdNo(TsfSession.getInfo().getCustNo());
+						point.setCustNo(TsfSession.getInfo().getCustNo());
+						point.setPntUploadStat(TscConstants.PntUploadStat.APPLY_COMPLETE.value());
+						point.setGvPntAmt(pointAmt);
+						point.setRmPntAmt(pointAmt);
+						point.setOccurGb("G069_37"); //출석체크 이벤트
+						corePointService.saveCustomerPoint(point);
+						System.out.println("여기들어오니?2");
+						String msg =  "축하합니다." + pointAmt + "포인트가 지급 되었습니다!";
+						result.set("msg", msg);
+						break;
+					}
+
+				}else {
+					result.set("msg", "출석체크 되었습니다.");
+					break;
+				}
+			}
 		}
 		
+		result.set("custAttendList",planningService.getCustAttendEntryList(plan));
 		return result;
-
 	}
 }

+ 3 - 0
src/main/java/com/style24/persistence/domain/Cart.java

@@ -59,6 +59,8 @@ public class Cart extends TscBaseDomain {
 	private int currStockQty;		// 기준 재고
 	private int qty;				// 구성 상품 기준 재고 수량
 	private int currPrice;			// 상품판매가
+	private int minOrdQty;			// 최소주문가능수량
+	private int addPrice;			// 상품 옵션가
 	private String goodsType;		// 상품 타입
 	private String compsGoodsCd;	// 세트 구성상품 코드
 	private String itemCdSql;		// 상품 조회 쿼리문
@@ -88,6 +90,7 @@ public class Cart extends TscBaseDomain {
 	private String itemOpts;	// 단품옵션
 	private Integer updCartSq;	// 업데이트할 장바구니번호
 	private Integer delCartSq;	// 삭제할 장바구니번호(0이면 삭제할 장바구니번호 없음)
+	private int colorNo;		// 컬러 번호
 
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private Cart[] cartGoodsList;		// 장바구니 단품코드

+ 4 - 0
src/main/java/com/style24/persistence/domain/Contents.java

@@ -66,6 +66,10 @@ public class Contents extends TscBaseDomain {
 	private String cateGb;
 	private String cateNm;
 
+	// 몰메인 STAB003에서 사용
+	private String gnbTabTitle;		// gnbTab 기획전배너영역 타이틀
+	private String bannerGb;		// admin:수동설정, plan:기획전
+
 	private String pageGb;	// 호출페이지 구분(MALL:몰메인, BEST:베스트메인)
 
 	//private String contentsTitle;		// 메인 타이틀(md가 설정한)

+ 3 - 0
src/main/java/com/style24/persistence/domain/GnbTab.java

@@ -4,6 +4,8 @@ import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
+import java.util.Collection;
+
 /**
  * 컨텐츠 Domain
  * 
@@ -29,4 +31,5 @@ public class GnbTab extends TscBaseDomain {
 	private String viewDt;			// 미리보기일시
 	private String preview;			// 미리보기여부
 
+	private String gtabBannerTitle;
 }

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

@@ -270,6 +270,11 @@ public class Plan extends TscBaseDomain {
 	private Integer planEntrySq;		//참여일련번호
 	private String orgFileNm;
 	private String sysFileNm;
+	private String entryAllYn;
+	private int basDays;
+	private String benefitGb;
+	private int pntAmt;
+	private Integer cpnId;
 	
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] multiReplyOrgFile;			//댓글 이미지

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

@@ -495,17 +495,17 @@
 			 , Z.DELV_FEE_CD
 		     , Z.MIN_ORD_AMT
 		     , Z.DELV_FEE
-			 , Z.CART_DELV_FEE_CD
+		     , Z.CART_DELV_FEE_CD
 		     , CASE WHEN Z.ORD_CAN_YN = 'Y' AND Z.CUST_TODAY_ORD = 0 AND Z.NOCUST_TODAY_ORD = 0 THEN 'Y' ELSE 'N' END AS ORD_CAN_YN
 		     , Z.ORD_CAN_QTY
 		     , Z.MIN_ORD_QTY
 		     , Z.MAX_ORD_QTY
-			 , (Z.CURR_PRICE + SUM(Z.OPT_ADD_PRICE)) * Z.GOODS_QTY AS CURR_PRICE
-			 , (Z.LIST_PRICE + SUM(Z.OPT_ADD_PRICE)) * Z.GOODS_QTY AS LIST_PRICE
-			 , Z.SOLDOUT_YN
-			 , CASE WHEN #{frontGb} = 'P' THEN (Z.CURR_PRICE * Z.GOODS_QTY) * (Z.PNT_PRATE/100)
-					ELSE (Z.CURR_PRICE * Z.GOODS_QTY) * (Z.PNT_MRATE/100) END AS SAVE_PNT_AMT
-			 , SYS_IMG_NM
+		     , (Z.CURR_PRICE + SUM(Z.OPT_ADD_PRICE)) * Z.GOODS_QTY AS CURR_PRICE
+		     , (Z.LIST_PRICE + SUM(Z.OPT_ADD_PRICE)) * Z.GOODS_QTY AS LIST_PRICE
+		     , Z.SOLDOUT_YN
+		     , CASE WHEN #{frontGb} = 'P' THEN (Z.CURR_PRICE * Z.GOODS_QTY) * (Z.PNT_PRATE/100)
+		            ELSE (Z.CURR_PRICE * Z.GOODS_QTY) * (Z.PNT_MRATE/100) END AS SAVE_PNT_AMT
+		     , SYS_IMG_NM
 		FROM   (SELECT C.CART_SQ
 		             , C.GOODS_CD
 		             , C.GOODS_QTY
@@ -584,7 +584,7 @@
 		                             , MAX(A.ORD_CAN_YN) AS ORD_CAN_YN
 		                             , MIN(A.ORD_CAN_QTY) AS ORD_CAN_QTY
 		                        FROM   (SELECT C.CART_SQ
-		                                     , CASE WHEN VS.SOLDOUT_YN = 'N' AND VS.CURR_STOCK_QTY >= C.GOODS_QTY * GC.QTY AND COMP_GOODS.GOODS_STAT != 'G008_70' AND G.GOODS_STAT != 'G008_70' THEN 'N'
+		                                     , CASE WHEN VS.SOLDOUT_YN = 'N' AND VS.CURR_STOCK_QTY >= GC.QTY AND COMP_GOODS.GOODS_STAT != 'G008_70' AND G.GOODS_STAT != 'G008_70' THEN 'N'
 		                                            ELSE 'Y' END AS SOLDOUT_YN
 		                                     , CASE WHEN G.GOODS_STAT != 'G008_90' AND G.GOODS_STAT != 'G008_70' AND COMP_GOODS.GOODS_STAT != 'G008_70' AND COMP_GOODS.GOODS_STAT != 'G008_90' THEN 'N'
 		                                            ELSE 'Y' END AS ORD_CAN_YN
@@ -617,7 +617,7 @@
 		                                </if>
 		                                UNION ALL
 		                                SELECT C.CART_SQ
-		                                     , CASE WHEN VS.SOLDOUT_YN = 'N' AND VS.CURR_STOCK_QTY >= C.GOODS_QTY AND G.GOODS_STAT != 'G008_70' THEN 'N'
+		                                     , CASE WHEN VS.SOLDOUT_YN = 'N' AND VS.CURR_STOCK_QTY > 0 AND G.GOODS_STAT != 'G008_70' THEN 'N'
 		                                            ELSE 'Y' END AS SOLDOUT_YN
 		                                     , CASE WHEN G.GOODS_STAT != 'G008_90' AND G.GOODS_STAT != 'G008_70' THEN 'N'
 		                                            ELSE 'Y' END AS ORD_CAN_YN
@@ -920,35 +920,39 @@
 	<!-- 장바구니 상품 컬러 정보 조회 -->
 	<select id="selectCartGoodsColorList" parameterType="Cart" resultType="Cart">
 		/* TsfCart.selectCartGoodsColorList : 장바구니 상품 컬러 정보 조회 */
-		SELECT ST.GOODS_CD
-			 , CASE WHEN SELF_GOODS_YN = 'Y' THEN (SELECT COLOR_KNM FROM TB_COLOR WHERE COLOR_CD = ST.OPT_CD1)
-					ELSE ST.OPT_CD1 END AS COLOR_NM
-			 , CASE WHEN SELF_GOODS_YN = 'Y' AND GOODS_TYPE != 'G056_S' THEN (SELECT SYS_IMG_NM FROM TB_GOODS_IMG WHERE GOODS_CD = ST.GOODS_CD AND COLOR_CD = ST.OPT_CD1 AND DEFAULT_IMG_YN = 'Y' LIMIT 1)
-					ELSE (SELECT SYS_IMG_NM FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = G.MAIN_COLOR_CD AND DEFAULT_IMG_YN = 'Y' LIMIT 1) END AS SYS_IMG_NM
-			 , ST.OPT_CD1
-			 , G.MAIN_COLOR_CD
-			 , MAX(CD.CART_DTL_SQ) AS CART_DTL_SQ
-			 , MAX(ST.DISP_ORD) AS DISP_ORD
-			 , MAX(CD.OPT_CD1) AS CART_OPT_CD1
-			 , MAX(CD.OPT_CD2) AS CART_OPT_CD2
-			 , MAX(CD.OPT_CD) AS CART_OPT_CD
-		     , MAX(ST.SOLDOUT_YN) AS SOLDOUT_YN
-			 , IFNULL(MAX( CASE WHEN SELF_GOODS_YN = 'Y' THEN (SELECT COLOR_KNM FROM TB_COLOR WHERE COLOR_CD = CD.OPT_CD1)
-								ELSE CD.OPT_CD1 END), MAX(CD.OPT_CD1)) AS CART_COLOR_NM
-		FROM   TB_GOODS G
-		INNER  JOIN VW_STOCK ST
-		ON     G.GOODS_CD = ST.GOODS_CD
-		LEFT   OUTER JOIN TB_CART_DETAIL CD
-		ON     G.GOODS_CD = CD.ITEM_CD
-		AND    ST.OPT_CD = CD.OPT_CD
-		AND    CD.CART_SQ = #{cartSq}
-		WHERE  ST.DISP_YN = 'Y'
-		AND    G.SELF_MALL_YN = 'Y'
-		AND    G.GOODS_STAT IN ('G008_90', 'G008_70')
-		AND    G.GOODS_CD = #{goodsCd}
-		GROUP  BY ST.GOODS_CD
-			 , ST.OPT_CD1
-			 , G.MAIN_COLOR_CD
+		SELECT A.*
+		     , IFNULL((CASE WHEN SELF_GOODS_YN = 'Y' THEN (SELECT COLOR_KNM FROM TB_COLOR WHERE COLOR_CD = A.CART_OPT_CD1)
+		                    ELSE A.CART_OPT_CD1 END), A.CART_OPT_CD1) AS CART_COLOR_NM
+		FROM   (SELECT ST.GOODS_CD
+		             , MAX(CASE WHEN SELF_GOODS_YN = 'Y' THEN (SELECT COLOR_KNM FROM TB_COLOR WHERE COLOR_CD = ST.OPT_CD1)
+		                        ELSE ST.OPT_CD1 END) AS COLOR_NM
+		             , MAX(CASE WHEN SELF_GOODS_YN = 'Y' AND GOODS_TYPE != 'G056_S' THEN (SELECT SYS_IMG_NM FROM TB_GOODS_IMG WHERE GOODS_CD = ST.GOODS_CD AND COLOR_CD = ST.OPT_CD1 AND DEFAULT_IMG_YN = 'Y' LIMIT 1)
+		                        ELSE (SELECT SYS_IMG_NM FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = G.MAIN_COLOR_CD AND DEFAULT_IMG_YN = 'Y' LIMIT 1) END) AS SYS_IMG_NM
+		             , ST.OPT_CD1
+		             , G.MAIN_COLOR_CD
+		             , G.SELF_GOODS_YN
+		             , MAX(CD.CART_DTL_SQ) AS CART_DTL_SQ
+		             , MAX(ST.DISP_ORD) AS DISP_ORD
+		             , MAX(CD.OPT_CD1) AS CART_OPT_CD1
+		             , MAX(CD.OPT_CD2) AS CART_OPT_CD2
+		             , MAX(CD.OPT_CD) AS CART_OPT_CD
+		             , MAX(ST.SOLDOUT_YN) AS SOLDOUT_YN
+		             , ROW_NUMBER() OVER() AS COLOR_NO
+		        FROM   TB_GOODS G
+		        INNER  JOIN VW_STOCK ST
+		        ON     G.GOODS_CD = ST.GOODS_CD
+		        LEFT   OUTER JOIN TB_CART_DETAIL CD
+		        ON     G.GOODS_CD = CD.ITEM_CD
+		        AND    ST.OPT_CD = CD.OPT_CD
+		        AND    CD.CART_SQ = #{cartSq}
+		        WHERE  ST.DISP_YN = 'Y'
+		        AND    G.SELF_MALL_YN = 'Y'
+		        AND    G.GOODS_STAT IN ('G008_90', 'G008_70')
+		        AND    G.GOODS_CD = #{goodsCd}
+		        GROUP  BY ST.GOODS_CD
+		                , ST.OPT_CD1
+		                , G.SELF_GOODS_YN
+		                , G.MAIN_COLOR_CD ) A
 		ORDER  BY DISP_ORD
 	</select>
 
@@ -960,7 +964,11 @@
 		     , ST.OPT_CD1
 		     , ST.OPT_CD2
 		     , ST.CURR_STOCK_QTY
-		     , ST.SOLDOUT_YN
+		     , ST.ADD_PRICE
+		     , CASE WHEN ST.SOLDOUT_YN = 'N' AND G.GOODS_STAT = 'G008_90' THEN 'N' ELSE 'Y' END AS SOLDOUT_YN
+		     , G.MIN_ORD_QTY
+		     , G.MAX_ORD_QTY
+		     , G.DAY_MAX_ORD_QTY
 		     , CD.CART_DTL_SQ
 		     , CD.OPT_CD AS CART_OPT_CD
 		     , CD.OPT_CD2 AS CART_OPT_CD2
@@ -988,6 +996,7 @@
 		SELECT GI.GOODS_CD
 			 , GI.COLOR_CD
 			 , GI.SYS_IMG_NM
+			 , GI.DEFAULT_IMG_YN
 		FROM   TB_GOODS G
 		INNER  JOIN TB_GOODS_IMG GI
 		ON     G.GOODS_CD = GI.GOODS_CD

+ 276 - 182
src/main/java/com/style24/persistence/mybatis/shop/TsfCoupon.xml

@@ -54,10 +54,10 @@
 		FROM   (SELECT CR.CPN_ID
 		             , CR.CPN_TARGET
 		             , CASE WHEN CR.CPN_TARGET = 'G260_10' THEN (SELECT GOODS_NM FROM TB_GOODS WHERE GOODS_CD = CR.REF_VAL AND GOODS_STAT = 'G008_90')
-		                    WHEN CR.CPN_TARGET = 'G260_11' THEN CASE WHEN (SELECT COUNT(1) FROM VW_CATE_4SRCH WHERE CATE1_NO = CR.REF_VAL) > 0 THEN (SELECT CATE1_NM FROM VW_CATE_4SRCH WHERE CATE1_NO = CR.REF_VAL LIMIT 1)
-		                                                             WHEN (SELECT COUNT(1) FROM VW_CATE_4SRCH WHERE CATE2_NO = CR.REF_VAL) > 0 THEN (SELECT CONCAT(CATE1_NM, ' > ', CATE2_NM) FROM VW_CATE_4SRCH WHERE CATE2_NO = CR.REF_VAL LIMIT 1)
-		                                                             WHEN (SELECT COUNT(1) FROM VW_CATE_4SRCH WHERE CATE3_NO = CR.REF_VAL) > 0 THEN (SELECT CONCAT(CATE1_NM, ' > ', CATE2_NM) FROM VW_CATE_4SRCH WHERE CATE3_NO = CR.REF_VAL LIMIT 1)
-		                                                             WHEN (SELECT COUNT(1) FROM VW_CATE_4SRCH WHERE CATE4_NO = CR.REF_VAL) > 0 THEN (SELECT CONCAT(CATE1_NM, ' > ', CATE2_NM) FROM VW_CATE_4SRCH WHERE CATE4_NO = CR.REF_VAL LIMIT 1)
+		                    WHEN CR.CPN_TARGET = 'G260_11' THEN CASE WHEN (SELECT COUNT(1) FROM TB_CATE_4SRCH WHERE CATE1_NO = CR.REF_VAL) > 0 THEN (SELECT CATE1_NM FROM TB_CATE_4SRCH WHERE CATE1_NO = CR.REF_VAL LIMIT 1)
+		                                                             WHEN (SELECT COUNT(1) FROM TB_CATE_4SRCH WHERE CATE2_NO = CR.REF_VAL) > 0 THEN (SELECT CONCAT(CATE1_NM, ' > ', CATE2_NM) FROM TB_CATE_4SRCH WHERE CATE2_NO = CR.REF_VAL LIMIT 1)
+		                                                             WHEN (SELECT COUNT(1) FROM TB_CATE_4SRCH WHERE CATE3_NO = CR.REF_VAL) > 0 THEN (SELECT CONCAT(CATE1_NM, ' > ', CATE2_NM) FROM TB_CATE_4SRCH WHERE CATE3_NO = CR.REF_VAL LIMIT 1)
+		                                                             WHEN (SELECT COUNT(1) FROM TB_CATE_4SRCH WHERE CATE4_NO = CR.REF_VAL) > 0 THEN (SELECT CONCAT(CATE1_NM, ' > ', CATE2_NM) FROM TB_CATE_4SRCH WHERE CATE4_NO = CR.REF_VAL LIMIT 1)
 		                                                             END    <!-- 카테고리명은 대 > 중 카테고리까지만 노출 20210330 정지혜과장님 확인 -->
 		                    WHEN CR.CPN_TARGET = 'G260_12' THEN (SELECT BRAND_KNM FROM TB_BRAND WHERE BRAND_CD = CR.REF_VAL AND USE_YN = 'Y')
 		                    WHEN CR.CPN_TARGET = 'G260_13' THEN (SELECT SUPPLY_COMP_NM FROM TB_SUPPLY_COMPANY WHERE SUPPLY_COMP_CD = CR.REF_VAL AND USE_YN = 'Y' AND SUPPLY_STAT = 'G010_30')
@@ -431,146 +431,56 @@
 	
 	<select id="getMypageCouponList" resultType="Coupon" parameterType="Coupon">
 		/* TsfCoupon.getMypageCouponList */
-		SELECT T.*
-		FROM 
-		(
-			SELECT z.*
-			FROM 
-			(
-				SELECT TC.CPN_ID
-				     ,TC.CPN_NM
-				     ,TC.CPN_DESC
-				     ,TC.SITE_CD
-				     ,TC.CPN_TYPE
-				     ,(CASE TC.APPLY_SCOPE WHEN 'A' THEN '전체' 
-				     				 	   WHEN 'I' THEN '개별' END) AS APPLY_SCOPE 
-				     ,(CASE TC.DC_WAY WHEN 'G240_10' THEN '할인금액' 
-				 				 	  WHEN 'G240_11' THEN '할인율' END) AS DC_WAY 
-				     ,TC.DC_PVAL
-				     ,TC.DC_MVAL
-				     ,TC.DC_AVAL
-				     ,TC.MAX_DC_AMT
-				     ,(CASE TC.PD_GB WHEN 'P' THEN '기간' 
-				     				 WHEN 'D' THEN '일수' END) AS PD_GB
-				     ,DATE_FORMAT(A.AVAIL_STDT, '%Y-%m-%d') AS AVAIL_STDT
-				     ,DATE_FORMAT(A.AVAIL_EDDT, '%Y-%m-%d') AS AVAIL_EDDT
-				     ,TC.AVAIL_DAYS
-				     ,TC.CUST_PUB_LIMIT_QTY
-				     ,TC.TOT_PUB_LIMIT_QTY
-				     ,TC.ONE_PUB_QTY
-				     ,TC.DN_GB
-				     ,TC.DOWN_STDT
-				     ,TC.DOWN_EDDT
-				     ,TC.BUY_LIMIT_AMT
-				     ,TC.PLAN_SQ
-				     ,TC.REISSUANCE
-				     ,TC.CPN_STAT
-				     ,TC.END_ALIM_YN
-				     ,TC.FIRST_ORD_YN
-				     ,TC.DOWN_ABL_YN
-				     ,TC.DC_CD_GB
-				     ,TC.CUST_JOIN_STDT
-				     ,TC.CUST_JOIN_EDDT
-				     ,TC.BUY_STDT
-				     ,TC.BUY_EDDT
-				     ,TC.NEW_CUST_YN
-				     ,IF(NOW() BETWEEN TC.AVAIL_STDT AND TC.AVAIL_EDDT , 'Y','N') AS USER_YN
-				     , A.CUST_NO
-				     , A.USED_DT
-				     , A.CNT
-				FROM TB_COUPON TC INNER JOIN 
-											(
-												SELECT 
-												       CUST_NO
-												     , CPN_ID
-												     , USED_DT
-												     , COUNT(*) AS CNT
-												     , AVAIL_STDT 
-												     , AVAIL_EDDT 
-												     FROM TB_CUST_COUPON
-												     WHERE CUST_NO = #{custNo}
-					                                     AND USED_DT IS NULL
-					                                     AND NOW() BETWEEN AVAIL_STDT AND AVAIL_EDDT
-												GROUP BY 
-												       CUST_NO
-												     , CPN_ID
-												     , USED_DT
-												     , AVAIL_STDT 
-												     , AVAIL_EDDT 
-											)A ON TC.CPN_ID = A.CPN_ID 
-				WHERE 1=1
-					AND TC.CPN_STAT = 'G232_11'  /*쿠폰 상태 - 진행*/
-			)Z
-			UNION 
-			SELECT F.*
-			FROM 
-			(
-				SELECT TC.CPN_ID
-				     ,TC.CPN_NM
-				     ,TC.CPN_DESC
-				     ,TC.SITE_CD
-				     ,TC.CPN_TYPE
-				     ,(CASE TC.APPLY_SCOPE WHEN 'A' THEN '전체' 
-				     				 	   WHEN 'I' THEN '개별' END) AS APPLY_SCOPE 
-				     ,(CASE TC.DC_WAY WHEN 'G240_10' THEN '할인금액' 
-				 				 	  WHEN 'G240_11' THEN '할인율' END) AS DC_WAY 
-				     ,TC.DC_PVAL
-				     ,TC.DC_MVAL
-				     ,TC.DC_AVAL
-				     ,TC.MAX_DC_AMT
-				     ,(CASE TC.PD_GB WHEN 'P' THEN '기간' 
-				     				 WHEN 'D' THEN '일수' END) AS PD_GB
-				     ,DATE_FORMAT(A.AVAIL_STDT, '%Y-%m-%d') AS AVAIL_STDT
-				     ,DATE_FORMAT(A.AVAIL_EDDT, '%Y-%m-%d') AS AVAIL_EDDT
-				     ,TC.AVAIL_DAYS
-				     ,TC.CUST_PUB_LIMIT_QTY
-				     ,TC.TOT_PUB_LIMIT_QTY
-				     ,TC.ONE_PUB_QTY
-				     ,TC.DN_GB
-				     ,TC.DOWN_STDT
-				     ,TC.DOWN_EDDT
-				     ,TC.BUY_LIMIT_AMT
-				     ,TC.PLAN_SQ
-				     ,TC.REISSUANCE
-				     ,TC.CPN_STAT
-				     ,TC.END_ALIM_YN
-				     ,TC.FIRST_ORD_YN
-				     ,TC.DOWN_ABL_YN
-				     ,TC.DC_CD_GB
-				     ,TC.CUST_JOIN_STDT
-				     ,TC.CUST_JOIN_EDDT
-				     ,TC.BUY_STDT
-				     ,TC.BUY_EDDT
-				     ,TC.NEW_CUST_YN
-			         ,IF(NOW() BETWEEN TC.AVAIL_STDT AND TC.AVAIL_EDDT , 'Y','N') AS USER_YN
-				     , A.CUST_NO
-				     , A.USED_DT
-				     , A.CNT
-				FROM TB_COUPON TC INNER JOIN 
-											(
-												SELECT 
-												       CUST_NO
-												     , CPN_ID
-												     , USED_DT
-												     , COUNT(*) AS CNT
-												     , AVAIL_STDT 
-												     , AVAIL_EDDT 
-												     FROM TB_CUST_COUPON
-												     WHERE CUST_NO = #{custNo}
-					                                   AND USED_DT IS NULL
-					                                   AND AVAIL_EDDT BETWEEN DATE_ADD(NOW(), INTERVAL -3 MONTH) AND AVAIL_EDDT
-												GROUP BY 
-												       CUST_NO
-												     , CPN_ID
-												     , USED_DT
-												     , AVAIL_STDT 
-												     , AVAIL_EDDT 
-											)A ON TC.CPN_ID = A.CPN_ID 
-				WHERE 1=1
-					AND TC.CPN_STAT = 'G232_11'  /*쿠폰 상태 - 진행*/
-			)F
-		)T
-		ORDER BY T.USER_YN DESC, T.AVAIL_EDDT
+		SELECT CC.CPN_ID                    /*쿠폰ID*/
+		     , C.CPN_NM                     /*쿠폰명*/
+		     , C.BUY_LIMIT_AMT              /*구매제한금액*/
+		     , C.MAX_DC_AMT                 /*최대할인금액*/
+		     , CASE WHEN #{frontGb} = 'P' THEN C.DC_PVAL
+		            WHEN #{frontGb} = 'M' THEN C.DC_MVAL
+		            WHEN #{frontGb} = 'A' THEN C.DC_AVAL
+		       END             AS DC_VAL    /*할인값*/
+		     , CASE WHEN C.DC_WAY = 'G240_10' THEN '원'                                                                                             
+		            ELSE '%'
+		       END             AS DC_WAY    /*할인방법*/
+		     , CONCAT(CASE WHEN C.BUY_LIMIT_AMT = 0 THEN ''
+		                   ELSE CONCAT(FORMAT(C.BUY_LIMIT_AMT , 0),'원 이상 구매 시 ')
+		              END
+		             ,CASE WHEN C.MAX_DC_AMT = 0 THEN ''
+		                   ELSE CONCAT('최대 ',FORMAT(C.MAX_DC_AMT , 0),'원 할인')
+		              END)     AS USE_CONDITION  /*사용조건*/
+		     , CASE WHEN C.CUST_PUB_LIMIT_QTY = 0 THEN ''
+		            ELSE CONCAT('1인당 최대',C.CUST_PUB_LIMIT_QTY,'매')
+		       END             AS ISSUE_CONDITION /*발급수량*/
+		     , CC.AVAIL_STDT                /*유효시작일자*/
+		     , CC.AVAIL_EDDT                /*유효종료일자*/
+		     , CC.CPN_CNT                   /*보유쿠폰수*/
+		     , CC.EXPIRE_YN                 /*만료여부*/
+		FROM   (
+		        SELECT CC.CPN_ID
+		             , DATE_FORMAT(CC.AVAIL_STDT,'%Y.%m.%d') AS AVAIL_STDT  /*유효시작일자*/
+		             , DATE_FORMAT(CC.AVAIL_EDDT,'%Y.%m.%d') AS AVAIL_EDDT  /*유효종료일자*/
+		             , COUNT(*)                              AS CPN_CNT /*보유쿠폰수*/
+		             , MAX(CASE WHEN NOW() > CC.AVAIL_EDDT THEN 'Y'
+		                        ELSE 'N'
+		                   END)                              AS EXPIRE_YN /*만료여부*/
+		        FROM   TB_CUST_COUPON CC
+		        WHERE  1 = 1
+		        AND    CC.CUST_NO = #{custNo} /**P*/
+		        AND    CC.USED_DT IS NULL /*사용하지않은쿠폰만*/
+		        AND    CC.AVAIL_EDDT >= DATE_ADD(NOW(), INTERVAL -3 MONTH) /*최근3개월쿠폰만*/
+		        GROUP  BY CC.CPN_ID, DATE_FORMAT(CC.AVAIL_STDT,'%Y.%m.%d %H:%i'), DATE_FORMAT(CC.AVAIL_EDDT,'%Y.%m.%d %H:%i')
+		       ) CC
+		     , TB_COUPON C
+		WHERE  CC.CPN_ID = C.CPN_ID
+		AND    C.CPN_STAT = 'G232_11' /*진행중인쿠폰*/
+		AND    C.SITE_CD = #{siteCd}
+		<if test="quickYn != null and quickYn != ''">
+		AND    CC.CC.EXPIRE_YN = 'N'
+		</if>
+		ORDER  BY CC.EXPIRE_YN, CC.AVAIL_EDDT, DC_VAL DESC, MAX_DC_AMT DESC
+		<if test="quickYn != null and quickYn != ''">
+		LIMIT 30
+		</if>
 	</select>
 	
 	<select id="getMypageCouponInfo" resultType="Coupon" parameterType="Coupon">
@@ -601,44 +511,228 @@
 	
 	<select id="getCouponDetailInfo" resultType="Coupon" parameterType="Coupon">
 		/* TsfCoupon.getCouponDetailInfo -- custNo 변경 예정*/
-		SELECT A.CPN_ID
-		     ,A.CPN_NM
-		     ,A.CPN_DESC
-		     ,A.SITE_CD
-		     ,A.AF_LINK_CD
-		     ,A.CPN_TYPE
-		     ,A.APPLY_SCOPE
-		     ,A.DC_WAY
-		     ,A.DC_PVAL
-		     ,A.DC_MVAL
-		     ,A.DC_AVAL
-		     ,A.MAX_DC_AMT
-		     ,A.PD_GB
-		     ,DATE_FORMAT(A.AVAIL_STDT,'%Y-%m-%d') AS AVAIL_STDT
-		     ,DATE_FORMAT(A.AVAIL_EDDT,'%Y-%m-%d') AS AVAIL_EDDT
-		     ,A.AVAIL_DAYS
-		     ,A.CUST_PUB_LIMIT_QTY
-		     ,A.TOT_PUB_LIMIT_QTY
-		     ,A.ONE_PUB_QTY
-		     ,A.DN_GB
-		     ,A.DOWN_STDT
-		     ,A.DOWN_EDDT
-		     ,A.BUY_LIMIT_AMT
-		     ,A.PLAN_SQ
-		     ,A.REISSUANCE
-		     ,A.CPN_STAT
-		     ,A.END_ALIM_YN
-		     ,A.FIRST_ORD_YN
-		     ,A.DOWN_ABL_YN
-		     ,A.DC_CD_GB
-		     ,A.CUST_JOIN_STDT
-		     ,A.CUST_JOIN_EDDT
-		     ,A .BUY_STDT
-		     ,A.BUY_EDDT
-		     ,A.NEW_CUST_YN
-		FROM TB_COUPON A
-		WHERE 1=1
-		 AND A.CPN_ID = #{cpnId}
+		SELECT Z.CPN_ID                                /*쿠폰ID*/
+		     , Z.CPN_NM                                /*쿠폰명*/
+		     , Z.BUY_LIMIT_AMT                         /*구매제한금액*/
+		     , Z.MAX_DC_AMT                            /*최대할인금액*/
+		     , Z.DC_VAL                                /*할인값*/
+		     , Z.DC_WAY                                /*할인방법*/
+		     , Z.USE_CONDITION                         /*사용조건*/
+		     , Z.ISSUE_CONDITION                       /*발급조건*/
+		     , Z.AVAIL_STDT                            /*유효시작일자*/
+		     , Z.AVAIL_EDDT                            /*유효종료일자*/
+		     , Z.CPN_CNT                               /*보유쿠폰수*/
+		     , Z.EXPIRE_YN                             /*만료여부*/
+		     , GROUP_CONCAT(Z.TGT_CONDITION) AS TGT_CONDITION
+		FROM
+		(
+		WITH TAB_COUPON AS (
+		    SELECT CC.CPN_ID                          /*쿠폰ID*/
+		         , C.CPN_NM                           /*쿠폰명*/
+		         , C.BUY_LIMIT_AMT                    /*구매제한금액*/
+		         , C.MAX_DC_AMT                       /*최대할인금액*/
+		         , CASE WHEN #{frontGb} = 'P' THEN C.DC_PVAL
+		                WHEN #{frontGb} = 'M' THEN C.DC_MVAL
+		                WHEN #{frontGb} = 'A' THEN C.DC_AVAL
+		           END             AS DC_VAL          /*할인값*/
+		         , CASE WHEN C.DC_WAY = 'G240_10' THEN '원'
+		                ELSE '%'
+		           END             AS DC_WAY          /*할인방법*/
+		         , CONCAT(CASE WHEN C.BUY_LIMIT_AMT = 0 THEN ''
+		                       ELSE CONCAT(FORMAT(C.BUY_LIMIT_AMT , 0),'원 이상 구매 시 ')
+		                  END
+		                 ,CASE WHEN C.MAX_DC_AMT = 0 THEN ''
+		                       ELSE CONCAT('최대 ',FORMAT(C.MAX_DC_AMT , 0),'원 할인')
+		                  END)     AS USE_CONDITION   /*사용조건*/
+		         , CASE WHEN C.CUST_PUB_LIMIT_QTY = 0 THEN ''
+		                ELSE CONCAT('1인당 최대',C.CUST_PUB_LIMIT_QTY,'매')
+		           END             AS ISSUE_CONDITION /*발급조건*/
+		         , CC.AVAIL_STDT                      /*유효시작일자*/
+		         , CC.AVAIL_EDDT                      /*유효종료일자*/
+		         , CC.CPN_CNT                         /*보유쿠폰수*/
+		         , CC.EXPIRE_YN                       /*만료여부*/
+		    FROM   (
+		            SELECT CC.CPN_ID
+		                 , DATE_FORMAT(CC.AVAIL_STDT,'%Y.%m.%d %H:%i') AS AVAIL_STDT  /*유효시작일자*/
+		                 , DATE_FORMAT(CC.AVAIL_EDDT,'%Y.%m.%d %H:%i') AS AVAIL_EDDT  /*유효종료일자*/
+		                 , COUNT(*)                              AS CPN_CNT /*보유쿠폰수*/
+		                 , MAX(CASE WHEN NOW() > CC.AVAIL_EDDT THEN 'Y'
+		                            ELSE 'N'
+		                       END)                              AS EXPIRE_YN /*만료여부*/
+		            FROM   TB_CUST_COUPON CC
+		            WHERE  1 = 1
+		            AND    CC.CUST_NO = #{custNo}
+		            AND    CC.USED_DT IS NULL /*사용하지않은쿠폰만*/
+		            AND    CC.AVAIL_EDDT >= DATE_ADD(NOW(), INTERVAL -3 MONTH) /*최근3개월쿠폰만*/
+		            GROUP  BY CC.CPN_ID, DATE_FORMAT(CC.AVAIL_STDT,'%Y.%m.%d %H:%i'), DATE_FORMAT(CC.AVAIL_EDDT,'%Y.%m.%d %H:%i')
+		           ) CC
+		         , TB_COUPON C
+		    WHERE  CC.CPN_ID = C.CPN_ID
+		    AND    C.CPN_STAT = 'G232_11' /*진행중인쿠폰*/
+		    AND    C.SITE_CD = #{siteCd}
+		)
+		, TAB_COUPON_REFVAL1 AS (
+		    SELECT CR.CPN_ID
+		         , CR.CPN_TARGET
+		         , CASE WHEN CR.CPN_TARGET = 'G260_10' /*상품*/ THEN (SELECT GOODS_NM FROM TB_GOODS WHERE GOODS_CD = CR.REF_VAL AND GOODS_STAT = 'G008_90')
+		                WHEN CR.CPN_TARGET = 'G260_11' /*카테고리*/ THEN
+		                    CASE WHEN IFNULL((SELECT COUNT(1) FROM TB_CATE_4SRCH WHERE CATE1_NO = CR.REF_VAL),0) > 0 THEN (SELECT CATE1_NM FROM TB_CATE_4SRCH WHERE CATE1_NO = CR.REF_VAL LIMIT 1)
+		                         WHEN IFNULL((SELECT COUNT(1) FROM TB_CATE_4SRCH WHERE CATE2_NO = CR.REF_VAL),0) > 0 THEN (SELECT CONCAT(CATE1_NM,' > ',CATE2_NM) FROM TB_CATE_4SRCH WHERE CATE2_NO = CR.REF_VAL LIMIT 1)
+		                         WHEN IFNULL((SELECT COUNT(1) FROM TB_CATE_4SRCH WHERE CATE3_NO = CR.REF_VAL),0) > 0 THEN (SELECT CONCAT(CATE1_NM,' > ',CATE2_NM) FROM TB_CATE_4SRCH WHERE CATE3_NO = CR.REF_VAL LIMIT 1)
+		                         WHEN IFNULL((SELECT COUNT(1) FROM TB_CATE_4SRCH WHERE CATE4_NO = CR.REF_VAL),0) > 0 THEN (SELECT CONCAT(CATE1_NM,' > ',CATE2_NM) FROM TB_CATE_4SRCH WHERE CATE4_NO = CR.REF_VAL LIMIT 1)
+		                    END
+		                WHEN CR.CPN_TARGET = 'G260_12' /*브랜드*/ THEN (SELECT BRAND_KNM FROM TB_BRAND WHERE BRAND_CD = CR.REF_VAL AND USE_YN = 'Y')
+		                WHEN CR.CPN_TARGET = 'G260_13' /*업체*/ THEN (SELECT SUPPLY_COMP_NM FROM TB_SUPPLY_COMPANY WHERE SUPPLY_COMP_CD = CR.REF_VAL AND USE_YN = 'Y' AND SUPPLY_STAT = 'G010_30')
+		           END AS REF_VAL
+		         , RANK() OVER(PARTITION BY CR.CPN_ID, CR.CPN_TARGET ORDER BY REF_VAL) AS RK
+		    FROM   TAB_COUPON C
+		         , TB_COUPON_REFVAL CR
+		    WHERE  C.CPN_ID = CR.CPN_ID
+		    AND    CR.CPN_TARGET != 'G260_14' /*제외상품아닌넘*/
+		)
+		, TAB_COUPON_REFVAL2 AS (
+		    SELECT CPN_ID
+		         , CPN_TARGET
+		         , GROUP_CONCAT(REF_VAL ORDER BY RK ASC SEPARATOR '/' ) AS REF_VAL
+		         , (SELECT COUNT(*)
+		            FROM   TAB_COUPON_REFVAL1
+		            WHERE  CPN_ID = CR.CPN_ID
+		            AND    CPN_TARGET = CR.CPN_TARGET)                  AS CNT
+		    FROM   TAB_COUPON_REFVAL1 CR
+		    WHERE  1 = 1
+		    AND    (
+		            (CPN_TARGET != 'G260_12' AND RK = 1) /*브랜드 외는 1개만 노출*/
+		            OR
+		            (CPN_TARGET = 'G260_12' AND RK <![CDATA[<=]]> 2) /*브랜드만 2개 노출*/
+		           )
+		    GROUP  BY CPN_ID, CPN_TARGET
+		)
+		SELECT C.CPN_ID                                /*쿠폰ID*/
+		     , C.CPN_NM                                /*쿠폰명*/
+		     , C.BUY_LIMIT_AMT                         /*구매제한금액*/
+		     , C.MAX_DC_AMT                            /*최대할인금액*/
+		     , C.DC_VAL                                /*할인값*/
+		     , C.DC_WAY                                /*할인방법*/
+		     , C.USE_CONDITION                         /*사용조건*/
+		     , C.ISSUE_CONDITION                       /*발급조건*/
+		     , C.AVAIL_STDT                            /*유효시작일자*/
+		     , C.AVAIL_EDDT                            /*유효종료일자*/
+		     , C.CPN_CNT                               /*보유쿠폰수*/
+		     , C.EXPIRE_YN                             /*만료여부*/
+		     , CONCAT(CR.REF_VAL,CASE WHEN CR.CPN_TARGET = 'G260_10' AND CR.CNT > 1 THEN ' 외'
+		                              WHEN CR.CPN_TARGET = 'G260_11' AND CR.CNT > 1 THEN ' 외'
+		                              WHEN CR.CPN_TARGET = 'G260_12' AND CR.CNT > 2 THEN ' 외'
+		                              WHEN CR.CPN_TARGET = 'G260_13' AND CR.CNT > 1 THEN ' 외'
+		                              ELSE ''
+		                         END) AS TGT_CONDITION /*대상조건*/
+		FROM   TAB_COUPON C
+		     , TAB_COUPON_REFVAL2 CR
+		WHERE  C.CPN_ID = CR.CPN_ID
+		AND C.CPN_ID = #{cpnId}
+		ORDER  BY C.EXPIRE_YN, C.AVAIL_EDDT
+		)Z
+	</select>
+	
+	<select id="getPlanCouponDetailInfo" resultType="Coupon" parameterType="Coupon">
+		/* TsfCoupon.getPlanCouponDetailInfo */
+		SELECT Z.CPN_ID                                /*쿠폰ID*/
+		     , Z.CPN_NM                                /*쿠폰명*/
+		     , Z.BUY_LIMIT_AMT                         /*구매제한금액*/
+		     , Z.MAX_DC_AMT                            /*최대할인금액*/
+		     , Z.DC_VAL                                /*할인값*/
+		     , Z.DC_WAY                                /*할인방법*/
+		     , Z.USE_CONDITION                         /*사용조건*/
+		     , Z.ISSUE_CONDITION                       /*발급조건*/
+		     , Z.AVAIL_STDT
+		     , Z.AVAIL_EDDT
+		     , GROUP_CONCAT(Z.TGT_CONDITION) AS TGT_CONDITION
+		FROM
+		(
+		WITH TAB_COUPON AS (
+		    SELECT C.CPN_ID                          /*쿠폰ID*/
+		         , C.CPN_NM                           /*쿠폰명*/
+		         , C.BUY_LIMIT_AMT                    /*구매제한금액*/
+		         , C.MAX_DC_AMT                       /*최대할인금액*/
+		         , DATE_FORMAT(C.AVAIL_STDT,'%Y.%m.%d %H:%i') AS AVAIL_STDT
+		         , DATE_FORMAT(C.AVAIL_EDDT,'%Y.%m.%d %H:%i') AS AVAIL_EDDT
+		         , CASE WHEN #{frontGb} = 'P' THEN C.DC_PVAL
+		                WHEN #{frontGb} = 'M' THEN C.DC_MVAL
+		                WHEN #{frontGb} = 'A' THEN C.DC_AVAL
+		           END             AS DC_VAL          /*할인값*/
+		         , CASE WHEN C.DC_WAY = 'G240_10' THEN '원'
+		                ELSE '%'
+		           END             AS DC_WAY          /*할인방법*/
+		         , CONCAT(CASE WHEN C.BUY_LIMIT_AMT = 0 THEN ''
+		                       ELSE CONCAT(FORMAT(C.BUY_LIMIT_AMT , 0),'원 이상 구매 시 ')
+		                  END
+		                 ,CASE WHEN C.MAX_DC_AMT = 0 THEN ''
+		                       ELSE CONCAT('최대 ',FORMAT(C.MAX_DC_AMT , 0),'원 할인')
+		                  END)     AS USE_CONDITION   /*사용조건*/
+		         , CASE WHEN C.CUST_PUB_LIMIT_QTY = 0 THEN ''
+		                ELSE CONCAT('1인당 최대',C.CUST_PUB_LIMIT_QTY,'매')
+		           END             AS ISSUE_CONDITION /*발급조건*/
+		    FROM  TB_COUPON C
+		    WHERE C.CPN_STAT = 'G232_11' /*진행중인쿠폰*/
+		     AND    C.SITE_CD = #{siteCd}
+		)
+		, TAB_COUPON_REFVAL1 AS (
+		    SELECT CR.CPN_ID
+		         , CR.CPN_TARGET
+		         , CASE WHEN CR.CPN_TARGET = 'G260_10' /*상품*/ THEN (SELECT GOODS_NM FROM TB_GOODS WHERE GOODS_CD = CR.REF_VAL AND GOODS_STAT = 'G008_90')
+		                WHEN CR.CPN_TARGET = 'G260_11' /*카테고리*/ THEN
+		                    CASE WHEN IFNULL((SELECT COUNT(1) FROM TB_CATE_4SRCH WHERE CATE1_NO = CR.REF_VAL),0) > 0 THEN (SELECT CATE1_NM FROM TB_CATE_4SRCH WHERE CATE1_NO = CR.REF_VAL LIMIT 1)
+		                         WHEN IFNULL((SELECT COUNT(1) FROM TB_CATE_4SRCH WHERE CATE2_NO = CR.REF_VAL),0) > 0 THEN (SELECT CONCAT(CATE1_NM,' > ',CATE2_NM) FROM TB_CATE_4SRCH WHERE CATE2_NO = CR.REF_VAL LIMIT 1)
+		                         WHEN IFNULL((SELECT COUNT(1) FROM TB_CATE_4SRCH WHERE CATE3_NO = CR.REF_VAL),0) > 0 THEN (SELECT CONCAT(CATE1_NM,' > ',CATE2_NM) FROM TB_CATE_4SRCH WHERE CATE3_NO = CR.REF_VAL LIMIT 1)
+		                         WHEN IFNULL((SELECT COUNT(1) FROM TB_CATE_4SRCH WHERE CATE4_NO = CR.REF_VAL),0) > 0 THEN (SELECT CONCAT(CATE1_NM,' > ',CATE2_NM) FROM TB_CATE_4SRCH WHERE CATE4_NO = CR.REF_VAL LIMIT 1)
+		                    END
+		                WHEN CR.CPN_TARGET = 'G260_12' /*브랜드*/ THEN (SELECT BRAND_KNM FROM TB_BRAND WHERE BRAND_CD = CR.REF_VAL AND USE_YN = 'Y')
+		                WHEN CR.CPN_TARGET = 'G260_13' /*업체*/ THEN (SELECT SUPPLY_COMP_NM FROM TB_SUPPLY_COMPANY WHERE SUPPLY_COMP_CD = CR.REF_VAL AND USE_YN = 'Y' AND SUPPLY_STAT = 'G010_30')
+		           END AS REF_VAL
+		         , RANK() OVER(PARTITION BY CR.CPN_ID, CR.CPN_TARGET ORDER BY REF_VAL) AS RK
+		    FROM   TAB_COUPON C
+		         , TB_COUPON_REFVAL CR
+		    WHERE  C.CPN_ID = CR.CPN_ID
+		    AND    CR.CPN_TARGET != 'G260_14' /*제외상품아닌넘*/
+		)
+		, TAB_COUPON_REFVAL2 AS (
+		    SELECT CPN_ID
+		         , CPN_TARGET
+		         , GROUP_CONCAT(REF_VAL ORDER BY RK ASC SEPARATOR '/' ) AS REF_VAL
+		         , (SELECT COUNT(*)
+		            FROM   TAB_COUPON_REFVAL1
+		            WHERE  CPN_ID = CR.CPN_ID
+		            AND    CPN_TARGET = CR.CPN_TARGET)                  AS CNT
+		    FROM   TAB_COUPON_REFVAL1 CR
+		    WHERE  1 = 1
+		    AND    (
+		            (CPN_TARGET != 'G260_12' AND RK = 1) /*브랜드 외는 1개만 노출*/
+		            OR
+		            (CPN_TARGET = 'G260_12' AND RK <![CDATA[<=]]> 2) /*브랜드만 2개 노출*/
+		           )
+		    GROUP  BY CPN_ID, CPN_TARGET
+		)
+		SELECT C.CPN_ID                                /*쿠폰ID*/
+		     , C.CPN_NM                                /*쿠폰명*/
+		     , C.BUY_LIMIT_AMT                         /*구매제한금액*/
+		     , C.MAX_DC_AMT                            /*최대할인금액*/
+		     , C.DC_VAL                                /*할인값*/
+		     , C.DC_WAY                                /*할인방법*/
+		     , C.USE_CONDITION                         /*사용조건*/
+		     , C.ISSUE_CONDITION                       /*발급조건*/
+		     , C.AVAIL_STDT
+		     , C.AVAIL_EDDT
+		     , CONCAT(CR.REF_VAL,CASE WHEN CR.CPN_TARGET = 'G260_10' AND CR.CNT > 1 THEN ' 외'
+		                              WHEN CR.CPN_TARGET = 'G260_11' AND CR.CNT > 1 THEN ' 외'
+		                              WHEN CR.CPN_TARGET = 'G260_12' AND CR.CNT > 2 THEN ' 외'
+		                              WHEN CR.CPN_TARGET = 'G260_13' AND CR.CNT > 1 THEN ' 외'
+		                              ELSE ''
+		                         END) AS TGT_CONDITION /*대상조건*/
+		FROM   TAB_COUPON C
+		     , TAB_COUPON_REFVAL2 CR
+		WHERE  C.CPN_ID = CR.CPN_ID
+		AND C.CPN_ID = #{cpnId}
+		)Z
+				
 	</select>
 	
 	<!-- 기획전 다운가능 쿠폰 정보 조회 -->

+ 42 - 4
src/main/java/com/style24/persistence/mybatis/shop/TsfDisplay.xml

@@ -83,6 +83,7 @@
 		    </when>
 		    <otherwise>
 		     , GTAB_SQ                                            /*GNB탭일련번호*/
+		     , CASE WHEN CONTENTS_TYPE = 'C' THEN (SELECT CONTENTS_TITLE FROM	TB_MAIN_LAYOUT WHERE CONTENTS_LOC = 'STAB003') ELSE '' END AS GTAB_BANNER_TITLE
 		FROM   TB_GNB_TAB A
 		    </otherwise>
 		</choose>
@@ -225,9 +226,12 @@
 		        <if test="cateNo != null and cateNo != ''">
 		        AND    A.CATE_NO = #{cateNo}
 		        </if>
-				<if test="brandGroupNo != null and brandGroupNo !=''">
-				AND    A.BRAND_GROUP_NO  = #{brandGroupNo}
-				</if>
+		        <if test="brandGroupNo != null and brandGroupNo !=''">
+		        AND    A.BRAND_GROUP_NO  = #{brandGroupNo}
+		        </if>
+		        <if test="contentsType != null and contentsType != ''">
+		        AND    A.CONTENTS_TYPE = #{contentsType}
+		        </if>
 		        <choose>
 		            <when test='preview != null and preview == "Y"'>
 		        AND    IFNULL((SELECT DISP_EDDT
@@ -923,5 +927,39 @@
 		FROM   TB_BRAND_GROUP
 		WHERE  BRAND_GROUP_NO = #{brandGroupNo}
 	</select>
-	
+
+	<!-- GNB TAB 기획전배너 조회 -->
+	<select id="getGnbTabBannerList" parameterType="Contents" resultType="Contents">
+		/* TsfDisplay.getGnbTabBannerList */
+		SELECT (SELECT CONTENTS_TITLE FROM TB_MAIN_LAYOUT WHERE 1=1 AND CONTENTS_LOC = 'STAB003') AS GNB_TAB_TITLE
+		      , Z.BANNER_GB
+		      , Z.IMG_PATH1
+		      , Z.STR_VAR1
+		      , Z.STR_TITLE1
+		      , Z.STR_TITLE2
+		FROM    (
+		            SELECT  'ADMIN' AS BANNER_GB
+		                  , IMG_PATH1
+		                  , STR_VAR1
+		                  , STR_TITLE1
+		                  , STR_TITLE2
+		            FROM    TB_CONTENTS
+		            WHERE   CONTENTS_LOC = #{contentsLoc}
+		            AND     CONTENTS_TYPE = #{cateNo}
+		            AND     USE_YN = 'Y'
+		            UNION ALL
+		            SELECT  'PLAN' AS BANNER_GB
+		                  , A.MAIN_PIMG AS IMG_PATH1
+		                  , CONCAT('/planning/detail/form?planSq=',A.PLAN_SQ) AS STR_VAR1
+		                  , A.PLAN_NM AS STR_TITLE1
+		                  , A.DTL_TITLE1 AS STR_TITLE2
+		            FROM  TB_PLAN A
+		            INNER JOIN TB_PLAN_CATE B ON A.PLAN_SQ = B.PLAN_SQ
+		            WHERE  1=1
+		              AND  B.CATE_NO = #{cateNo}
+		              AND  A.OPEN_YN = 'Y'
+		              AND  B.DISP_YN = 'Y'
+		        ) Z
+		LIMIT 2
+	</select>
 </mapper>

+ 9 - 7
src/main/java/com/style24/persistence/mybatis/shop/TsfOrderChange.xml

@@ -799,7 +799,6 @@
 		     , Z.RF_DELIVERY_FEE
 		     , Z.RF_REAL_CNCL_AMT
 		     , Z.PG_GB
-		     , Z.PAY_STAT
 		     , Z.PAY_MEANS
 		     , Z.PAY_MEANS_NM
 		  FROM (SELECT OC.ORD_CHG_SQ
@@ -852,7 +851,6 @@
 		             , R.RF_DELIVERY_FEE
 		             , R.RF_REAL_CNCL_AMT
 		             , P.PG_GB
-		             , P.PAY_STAT
 		             , P.PAY_MEANS
 		             , FN_GET_CODE_NM('G014', P.PAY_MEANS)                              AS PAY_MEANS_NM
 		          FROM TB_ORDER_CHANGE OC
@@ -905,7 +903,7 @@
 				, Z.GFCD_USE_AMT, Z.ORD_DTL_NO, Z.GOODS_CD, Z.BRAND_NM, Z.SHOT_DELV_YN, Z.SELF_GOODS_YN, Z.GOODS_NM
 				, Z.GOODS_TYPE, Z.PRICE_ORG, Z.PRICE_SALE, Z.ADD_PAY_COST, Z.SYS_IMG_NM, Z.GIFT_PACK_YN, Z.REFUND_AMT, Z.RF_CPN1_AMT, Z.RF_TMTB1_AMT
 				, Z.RF_TMTB2_AMT, Z.RF_GOODS_CPN_AMT, Z.RF_CART_CPN_AMT, Z.RF_PNT_AMT, Z.RF_PRE_PNT_AMT, Z.RF_GFCD_USE_AMT, Z.RF_CNCL_AMT
-				, Z.RF_DELIVERY_FEE, Z.RF_REAL_CNCL_AMT, Z.PG_GB, Z.PAY_STAT, Z.PAY_MEANS, Z.PAY_MEANS_NM
+				, Z.RF_DELIVERY_FEE, Z.RF_REAL_CNCL_AMT, Z.PG_GB, Z.PAY_MEANS, Z.PAY_MEANS_NM
 		 ORDER BY Z.ORD_CHG_SQ DESC
 	</select>
 
@@ -960,7 +958,6 @@
 		     , Z.RF_DELIVERY_FEE
 		     , Z.RF_REAL_CNCL_AMT
 		     , Z.PG_GB
-		     , Z.PAY_STAT
 		     , Z.PAY_MEANS
 		     , Z.PAY_MEANS_NM
 		     , Z.WD_GB
@@ -1022,7 +1019,6 @@
 		             , R.RF_DELIVERY_FEE
 		             , R.RF_REAL_CNCL_AMT
 		             , P.PG_GB
-		             , P.PAY_STAT
 		             , P.PAY_MEANS
 		             , FN_GET_CODE_NM('G014', P.PAY_MEANS)                              AS PAY_MEANS_NM
 		             , OC.WD_GB
@@ -1086,7 +1082,7 @@
 		        , Z.GFCD_USE_AMT, Z.ORD_DTL_NO, Z.GOODS_CD, Z.BRAND_NM, Z.SHOT_DELV_YN, Z.SELF_GOODS_YN, Z.GOODS_NM
 		        , Z.GOODS_TYPE, Z.PRICE_ORG, Z.PRICE_SALE, Z.ADD_PAY_COST, Z.SYS_IMG_NM, Z.GIFT_PACK_YN, Z.REFUND_AMT, Z.RF_CPN1_AMT, Z.RF_TMTB1_AMT
 		        , Z.RF_TMTB2_AMT, Z.RF_GOODS_CPN_AMT, Z.RF_CART_CPN_AMT, Z.RF_PNT_AMT, Z.RF_PRE_PNT_AMT, Z.RF_GFCD_USE_AMT, Z.RF_CNCL_AMT
-		        , Z.RF_DELIVERY_FEE, Z.RF_REAL_CNCL_AMT, Z.PG_GB, Z.PAY_STAT, Z.PAY_MEANS, Z.PAY_MEANS_NM, Z.WD_GB, Z.CHGER_NM, Z.CHGER_PHNNO, Z.CHGER_BASE_ADDR
+		        , Z.RF_DELIVERY_FEE, Z.RF_REAL_CNCL_AMT, Z.PG_GB, Z.PAY_MEANS, Z.PAY_MEANS_NM, Z.WD_GB, Z.CHGER_NM, Z.CHGER_PHNNO, Z.CHGER_BASE_ADDR
 		        , Z.CHGER_DTL_ADDR, Z.CHGER_RTN_MEMO, Z.WD_INVOICE_NO, Z.SHIP_COMP_CD, Z.SHIP_COMP_NM
 		 ORDER BY Z.ORD_CHG_SQ DESC
 	</select>
@@ -1144,6 +1140,7 @@
 		     , Z.RECIP_BASE_ADDR
 		     , Z.RECIP_DTL_ADDR
 		     , Z.DELV_MEMO
+		     , Z.PG_TID
 		  FROM (SELECT OC.ORD_CHG_SQ
 		             , OC.CHG_GB
 		             , OCD.CHG_QTY
@@ -1198,6 +1195,7 @@
 		             , DA.RECIP_BASE_ADDR
 		             , DA.RECIP_DTL_ADDR
 		             , DA.DELV_MEMO
+		             , P.PG_TID
 		          FROM TB_ORDER_CHANGE OC
 		         INNER JOIN TB_ORDER_CHANGE_DETAIL OCD
 		            ON OC.ORD_CHG_SQ = OCD.ORD_CHG_SQ
@@ -1228,6 +1226,10 @@
 		          LEFT OUTER JOIN TB_COLOR C
 		            ON C.COLOR_CD = IFNULL(NULLIF(ODI.OPT_CD1,'') , G1.MAIN_COLOR_CD)
 		           AND C.USE_YN = 'Y'
+		          LEFT OUTER JOIN TB_PAYMENT P
+		            ON P.ORD_CHG_SQ = OC.ORD_CHG_SQ
+		           AND P.PAY_GB = 'D'
+		           AND P.PAY_STAT = 'G016_30'
 		         WHERE OCD.DEL_YN = 'N'
 		           AND O.DISP_YN = 'Y'
 		<choose>
@@ -1248,7 +1250,7 @@
 		        , Z.GFCD_USE_AMT, Z.ORD_DTL_NO, Z.GOODS_CD, Z.BRAND_NM, Z.SHOT_DELV_YN, Z.SELF_GOODS_YN, Z.GOODS_NM
 		        , Z.GOODS_TYPE, Z.PRICE_ORG, Z.PRICE_SALE, Z.ADD_PAY_COST, Z.SYS_IMG_NM, Z.GIFT_PACK_YN, Z.WD_GB, Z.CHGER_NM, Z.CHGER_PHNNO, Z.CHGER_BASE_ADDR
 		        , Z.CHGER_DTL_ADDR, Z.CHG_MEMO, Z.WD_INVOICE_NO, Z.SHIP_COMP_CD, Z.SHIP_COMP_NM, Z.DELV_ADDR_SQ, Z.RECIP_NM, Z.RECIP_PHNNO
-		        , Z.RECIP_BASE_ADDR, Z.RECIP_DTL_ADDR, Z.DELV_MEMO
+		        , Z.RECIP_BASE_ADDR, Z.RECIP_DTL_ADDR, Z.DELV_MEMO, Z.PG_TID
 		 ORDER BY Z.ORD_CHG_SQ DESC
 	</select>
 	

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

@@ -1143,7 +1143,7 @@
 		/* TsfPlanning.saveAttendEntry */	
 		INSERT INTO TB_PLAN_ENTRY
 		        ( 
-		        , PLAN_SQ
+		         PLAN_SQ
 		        , ENTRY_CUST_NO
 		        , ENTRY_DT
 		        , ENTRY_VAL1
@@ -1185,7 +1185,9 @@
 		FROM TB_PLAN_ENTRY
 		WHERE 1=1 
 		 AND PLAN_SQ = #{planSq}
+		 <if test='entryAllYn == "N"'>
 		 AND DATE_FORMAT(ENTRY_DT, '%Y-%m-%d') = DATE_FORMAT(NOW(),'%Y-%m-%d')
+		 </if>
 		 AND ENTRY_CUST_NO = #{custNo}
 	</select>
 	
@@ -1202,6 +1204,17 @@
 		AND ENTRY_CUST_NO = #{custNo}
 	</select>
 	
+	<select id="getAttendBenefitList" resultType="Plan" parameterType="Plan">
+		/* TsfPlanning.getAttendBenefitList */	
+		SELECT PLAN_SQ 
+		      ,BAS_DAYS 
+		      ,BENEFIT_GB 
+		      ,PNT_AMT 
+		      ,CPN_ID 
+		FROM TB_PLAN_ATTEND 
+		WHERE PLAN_SQ = #{planSq}	
+	</select>
+	
 	<!-- 댓글 리스트  (수정필)-->
 	<select id="getReplyList" resultType="Plan" parameterType="Plan">
 		/* TsfPlanning.getReplyList */	

+ 34 - 62
src/main/webapp/WEB-INF/views/mob/cart/CartChangeOptionPopupMob.html

@@ -66,23 +66,29 @@
 								</a>
 							</li>
 						</ul>
-
-						<div class="opt_size">
-							<div class="opt_header">
-								<span class="title">사이즈</span>
-							</div>
-							<div class="form_field selfGoodsSize">
-								<th:block th:each="color, index : ${comp.cartColorList}" th:if="${color.cartColorNm != null}">
-									<th:block  th:if="${color.cartColorNm != null}">
-										<th:block th:each="size, index : ${color.cartSizeList}">
-											<div>
-												<input type="radio" name="rdi-optsize" th:id="|${'rdi-optsize' + size.goodsCd + '-' + size.optCd}|" th:value="${size.optCd}" th:checked="${size.cartOptCd != null}" th:disabled="${size.soldoutYn == 'Y' or cart.goodsQty > size.currStockQty}">
-												<label th:for="|${'rdi-optsize' + size.goodsCd + '-' + size.optCd}|"><span th:text="${size.optCd2}"></span></label>
-											</div>
+					</div>
+					<div class="opt_size">
+						<div class="opt_header">
+							<span class="title">사이즈</span>
+							<span class="info">
+									<th:block th:each="color, index : ${comp.cartColorList}" th:if="${color.cartColorNm != null}">
+										<th:block th:each="size, index : ${color.cartSizeList}" th:if="${size.cartOptCd != null}">
+											<span th:text="${size.optCd2}"></span>
+											<span th:if="${size.addPrice > 0}">(+<em th:text="${#numbers.formatInteger(size.addPrice, 1, 'COMMA')}"></em>)원</span>
 										</th:block>
 									</th:block>
+								</span>
+						</div>
+						<div class="form_field selfGoodsSize">
+							<th:block th:each="color, index : ${comp.cartColorList}" th:if="${color.cartColorNm != null}">
+								<th:block th:each="size, index : ${color.cartSizeList}">
+									<div>
+										<input type="hidden" name="addPrice" th:value="${size.addPrice}" />
+										<input type="radio" name="rdi-optsize" th:soldoutYn="${size.soldoutYn}" th:id="|${'rdi-optsize' + size.goodsCd + '-' + size.optCd}|" th:value="${size.optCd}" th:checked="${size.cartOptCd != null}" th:disabled="${size.soldoutYn == 'Y' or size.minOrdQty > size.currStockQty}">
+										<label th:for="|${'rdi-optsize' + size.goodsCd + '-' + size.optCd}|"><span class="sizeNameTxt" th:text="${size.optCd2}"></span></label>
+									</div>
 								</th:block>
-							</div>
+							</th:block>
 						</div>
 					</div>
 				</th:block>
@@ -115,7 +121,7 @@
 										<div class="select" th:text="${comp.colorNm}"></div>
 										<ul class="list" th:data="${comp.goodsCd}">
 											<th:block th:each="color, index : ${comp.cartColorList}">
-												<li th:classappend="${color.cartColorNm != null} ? 'selected'" th:data="${color.optCd1}" th:text="${color.colorNm}" th:aria-disabled="${color.soldoutYn.equals('Y') ? true : false}"></li>
+												<li th:classappend="${color.cartColorNm != null} ? 'selected'" th:colorNo="${color.colorNo}" th:data="${color.optCd1}" th:text="${color.colorNm}" th:aria-disabled="${color.soldoutYn.equals('Y') ? true : false}"></li>
 											</th:block>
 										</ul>
 									</div>
@@ -131,12 +137,12 @@
 						<form class="form_wrap">
 							<div class="form_field">
 								<th:block th:each="color, index : ${comp.cartColorList}">
-									<div class="select_custom item_opt2 sizeList" th:classappend="|${comp.goodsCd}_${color.optCd1} sizeList${comp.goodsCd}|" th:style="${color.cartColorNm != null ? 'display:inline-block' : 'display:none'}">
+									<div class="select_custom item_opt2 sizeList" th:classappend="|color_${comp.goodsCd}_${color.colorNo} sizeList${comp.goodsCd}|" th:style="${color.cartColorNm != null ? 'display:inline-block' : 'display:none'}">
 										<div class="combo">
 											<div class="select" th:classappend="|size_${comp.goodsCd}_size_nm|" th:text="${comp.optCd2}" th:data="${color.goodsCd}"></div>
 											<ul class="list setSizeSelect" th:classappend="|size_${comp.goodsCd}|" th:data="${comp.goodsCd}">
 												<th:block th:each="size, i : ${color.cartSizeList}" th:if="${color.optCd1.equals(size.optCd1)}">
-													<li th:classappend="${size.cartOptCd != null} ? selected" th:optCd="${size.optCd}" th:value="${size.optCd}" th:text="${size.optCd2}" th:aria-disabled="${color.soldoutYn.equals('Y') or size.soldoutYn.equals('Y') ? true : false}"></li>
+													<li th:classappend="${size.cartOptCd != null} ? selected" th:optCd="${size.optCd}" th:value="${size.optCd}" th:text="${size.optCd2}" th:aria-disabled="${color.soldoutYn.equals('Y') or size.soldoutYn.equals('Y') or size.minOrdQty > size.currStockQty ? true : false}"></li>
 												</th:block>
 											</ul>
 										</div>
@@ -172,7 +178,7 @@
 										<div class="select" th:text="${comp.colorNm}"></div>
 										<ul class="list" th:data="${comp.goodsCd}">
 											<th:block th:each="color, index : ${comp.cartColorList}">
-												<li th:classappend="${color.cartColorNm != null} ? 'selected'" th:data="${color.optCd1}" th:text="${color.colorNm}" th:aria-disabled="${color.soldoutYn.equals('Y') ? true : false}"></li>
+												<li th:classappend="${color.cartColorNm != null} ? 'selected'" th:colorNo="${color.colorNo}" th:data="${color.optCd1}" th:text="${color.colorNm}" th:aria-disabled="${color.soldoutYn.equals('Y') ? true : false}"></li>
 											</th:block>
 										</ul>
 									</div>
@@ -188,12 +194,12 @@
 						<form class="form_wrap">
 							<div class="form_field">
 								<th:block th:each="color, index : ${comp.cartColorList}">
-									<div class="select_custom item_opt2 sizeList" th:classappend="|${comp.goodsCd}_${color.optCd1} sizeList${comp.goodsCd}|" th:style="${color.cartColorNm != null ? 'display:inline-block' : 'display:none'}">
+									<div class="select_custom item_opt2 sizeList" th:classappend="|color_${comp.goodsCd}_${color.colorNo} sizeList${comp.goodsCd}|" th:style="${color.cartColorNm != null ? 'display:inline-block' : 'display:none'}">
 										<div class="combo">
 											<div class="select" th:classappend="|size_${comp.goodsCd}_size_nm|" th:text="${comp.optCd2}" th:data="${color.goodsCd}"></div>
 											<ul class="list setSizeSelect" th:classappend="|size_${comp.goodsCd}|" th:data="${comp.goodsCd}">
 												<th:block th:each="size, i : ${color.cartSizeList}" th:if="${color.optCd1.equals(size.optCd1)}">
-													<li th:classappend="${size.cartOptCd != null} ? selected" th:optCd="${size.optCd}" th:value="${size.optCd}" th:text="${size.optCd2}" th:aria-disabled="${color.soldoutYn.equals('Y') or size.soldoutYn.equals('Y') ? true : false}"></li>
+													<li th:classappend="${size.cartOptCd != null} ? selected" th:optCd="${size.optCd}" th:value="${size.optCd}" th:text="${size.optCd2}" th:aria-disabled="${color.soldoutYn.equals('Y') or size.soldoutYn.equals('Y') or size.minOrdQty > size.currStockQty ? true : false}"></li>
 												</th:block>
 											</ul>
 										</div>
@@ -233,10 +239,11 @@
 	$("#cartOptionModal .colorList > .combo > .list li").on("click", function(e) {
 		let goodsCd = $(this).parent().attr("data");
 		let optCd1 = $(this).attr("data");
+		let colorNo = $(this).attr("colorNo");
 		let firstSize = "";
 		if(optCd1 != $(".option1_" + goodsCd).val()) {
-			let firstOptCd = $("#cartOptionModal ." + goodsCd + "_" + optCd1 + " li:first").attr("optcd");
-			let firstOptCd2 = $("#cartOptionModal ." + goodsCd + "_" + optCd1 + " li:first").text();
+			let firstOptCd = $("#cartOptionModal .color_" + goodsCd + "_" + colorNo + " li:first").attr("optcd");
+			let firstOptCd2 = $("#cartOptionModal .color_" + goodsCd + "_" + colorNo + " li:first").text();
 
 			$("#cartOptionModal .chooseColorNm_" + goodsCd).text($(this).text());
 			$("#cartOptionModal .option_" + goodsCd).val(firstOptCd);
@@ -244,8 +251,8 @@
 			$("#cartOptionModal .option2_" + goodsCd).val(firstOptCd2);
 
 			$("#cartOptionModal .sizeList" + goodsCd).hide();
-			$("#cartOptionModal ." + goodsCd + "_" + optCd1).show();
-			$("#cartOptionModal ." + goodsCd + "_" + optCd1 + " .select").text(firstOptCd2);
+			$("#cartOptionModal .color_" + goodsCd + "_" + colorNo).show();
+			$("#cartOptionModal .color_" + goodsCd + "_" + colorNo + " .select").text(firstOptCd2);
 			$("#cartOptionModal .chooseSizeNm_" + goodsCd).text(firstOptCd2);
 		}
 	});
@@ -264,44 +271,9 @@
 		$('.optModify_pop .number_count .minus').addClass('min_val');
 	}
 
-	// 자사 일반 상품 컬러 선택시
-	$(".selfGoodsColorSelect").on("click", function(e) {
-		let sizeHtml = "";
-		let imgHtml = "";
-		let cart = [[${cart}]];
-		let color =  [[${cart.cartCompsList[0].cartColorList}]];
-		let optCd1 = $(this).attr("data");
-
-		for(let i = 0 ; i < color.length ; i++) {
-			let size = color[i].cartSizeList;
-			for(let j = 0 ; j < size.length ; j++) {
-				if(optCd1 == size[j].optCd1) {
-					sizeHtml += "<div>";
-					sizeHtml += "<input type='radio' name='rdi-optsize' id='" + size[j].goodsCd + "-" + size[j].optCd + "' value='" + size[j].optCd + "' ";
-					if(size[j].soldoutYn == "Y" || cart.goodsQty > size[j].currStockQty) {
-						sizeHtml += "disabled = 'disabled'";
-					}
-					sizeHtml += " />\n";
-					sizeHtml += "<label for='" + size[j].goodsCd + "-" + size[j].optCd + "'><span>" + size[j].optCd2 + "</span></label>\n"
-					sizeHtml += "</div>\n";
-				}
-			}
-
-			if(optCd1 == color[i].optCd1) {
-				for (let j = 0; j < color[i].cartImgList.length; j++) {
-					let img = color[i].cartImgList[j];
-					if(optCd1 == img.colorCd) {
-						imgHtml += "<li>\n<span class='thumb'>\n";
-						imgHtml += "<img src='" + _uploadGoodsUrl + "/" + img.sysImgNm + "' onerror='this.src='" + [[${@environment.getProperty('domain.uximage')}]] + "/images/pc/thumb/bg_item_none.png' alt='" + img.sysImgNm + "' />\n";
-						imgHtml += "</span>\n</li>\n";
-					}
-				}
-			}
-		}
-
-		$(".cartOptionModal .pic_list").html(imgHtml);
-		$(".cartOptionModal .selfGoodsSize").html(sizeHtml);
-	});
+	function getSelfColorList() {
+		return [[${cart.cartCompsList[0].cartColorList}]];
+	}
 
 	function fnChangeCartOption(cartSq) {
 		let cart = [[${cart}]];

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

@@ -187,6 +187,57 @@
 		$("#couponInfoPop_close").click(function() {
 			$("#couponInfoPop").modal("hide");
 		});
+
+		// 자사 일반 상품 사이즈 선택시
+		$(document).on("change", ".selfGoodsSize input[type=radio]", function() {
+			let addPrice = $(this).parent().find("input[name=addPrice]").val();
+			let sizeTextHtml = "<span>" + $(this).parent().find(".sizeNameTxt").text() + "</span>";
+			if(addPrice > 0) {
+				sizeTextHtml += "<span>(+<em>" + Number(addPrice).toLocaleString() + "</em>)원</span>";
+			}
+			$(this).parent().parent().parent().find(".opt_header>.info").html(sizeTextHtml);
+		});
+
+		// 자사 일반 상품 컬러 선택시
+		$(document).on("click", ".selfGoodsColorSelect", function(e) {
+			let sizeHtml = "";
+			let imgHtml = "";
+			let color =  getSelfColorList();
+			let optCd1 = $(this).attr("data");
+
+			for(let i = 0 ; i < color.length ; i++) {
+				let size = color[i].cartSizeList;
+				for(let j = 0 ; j < size.length ; j++) {
+					if(optCd1 == size[j].optCd1) {
+						sizeHtml += "<div>";
+						sizeHtml += "<input type='hidden' name='addPrice' value='" + size[j].addPrice + "' />";
+						sizeHtml += "<input type='radio' name='rdi-optsize' id='rdi-optsize" + size[j].goodsCd + "-" + size[j].optCd + "' value='" + size[j].optCd + "' ";
+						if(size[j].soldoutYn == "Y" || size[j].minOrdQty > size[j].currStockQty) {
+							sizeHtml += "disabled = 'disabled'";
+						}
+						sizeHtml += " />\n";
+						sizeHtml += "<label for='rdi-optsize" + size[j].goodsCd + "-" + size[j].optCd + "'><span class='sizeNameTxt'>" + size[j].optCd2 + "</span></label>\n"
+						sizeHtml += "</div>\n";
+					}
+				}
+
+				if(optCd1 == color[i].optCd1) {
+					for (let j = 0; j < color[i].cartImgList.length; j++) {
+						let img = color[i].cartImgList[j];
+						if(optCd1 == img.colorCd && img.defaultImgYn == "Y") {
+							imgHtml += '<img src="' + _uploadGoodsUrl + "/" + img.sysImgNm + '?RS=100" onerror="' + _uximgUrl + '/images/pc/thumb/bg_item_none.png" alt="' + img.sysImgNm + '" />\n';
+							/*imgHtml += "<li>\n<span class='thumb'>\n";
+							imgHtml += "<img src='" + _uploadGoodsUrl + "/" + img.sysImgNm + "' onerror='this.src='" + [[${@environment.getProperty('domain.uximage')}]] + "/images/pc/thumb/bg_item_none.png' alt='" + img.sysImgNm + "' />\n";
+							imgHtml += "</span>\n</li>\n";*/
+						}
+					}
+				}
+			}
+
+			$(".cartOptionModal .area_order .goods_section .goods_detail .thumb_box").html(imgHtml);
+			$(".cartOptionModal .selfGoodsSize").html(sizeHtml);
+			$(".cartOptionModal .opt_size .opt_header .info").html("");
+		});
 	});
 
 	function getCartList(parameter) {

+ 40 - 124
src/main/webapp/WEB-INF/views/mob/goods/GoodsDetailFormMob.html

@@ -99,10 +99,8 @@
 				<div class="desc_status">예약판매 상품 - <em th:text="${goodsInfo.delvResDt}">2020.12.30</em> 출고예정</div>
 			</div>
 
-			<div class="inner">
+			<div class="inner" th:if="${goodsInfo.selfGoodsYn =='Y' and goodsInfo.goodsType =='G056_N'}"> <!-- 자사상품,일반상품 -->
 				<div class="option_box">
-					<th:block th:if="${goodsInfo.selfGoodsYn =='Y' }"> <!-- 자사상품 -->
-					<th:block th:if="${goodsInfo.goodsType =='G056_N' }">	<!-- 일반상품 -->
 					<div class="opt_color"  th:if="${goodsOption1List != null and !goodsOption1List.empty}">
 						<div class="opt_header">
 							<span class="title">컬러</span>
@@ -134,8 +132,6 @@
 						</div>
 					</div>
 					<div class="info_restock" style="display:none;"><a href="javascript:void(0);" id="btn_pushRestock_pop" class="btn_popup" th:onclick="cfGoodsInstockAlarmInfo([[${goodsInfo.goodsCd}]], [[${goodsInfo.colorCd}]])">재입고 알림 신청</a></div>
-					</th:block>
-					</th:block>
 				</div>
 			</div>
 
@@ -626,22 +622,7 @@
 						</div>
 						</th:block>
 						</th:block>
-						<th:block th:if="${goodsInfo.selfGoodsYn =='N' }"> <!--  입점상품 -->
-						<div class="opt_select">
-							<div class="form_wrap">
-								<div class="form_field">
-									<div class="select_custom option_open">
-										<div class="combo">
-											<div class="select">옵션을 선택해주세요</div>
-										</div>
-									</div>
-								</div>
-							</div>
-						</div>
-						<div class="opt_result">
-						</div>
-						</th:block>
-						<th:block th:if="${goodsInfo.goodsType =='G056_S' }">	<!-- 세트상품 -->
+						<th:block th:if="${goodsInfo.selfGoodsYn =='N' or goodsInfo.goodsType =='G056_S'}"> <!--  입점상품 -->
 						<div class="opt_select">
 							<div class="form_wrap">
 								<div class="form_field">
@@ -732,76 +713,32 @@
 								<!-- //일반상품일때 -->
 								<!-- 셋트상품일때 -->
 								<th:block th:if="${goodsInfo.goodsType =='G056_S' }">	<!-- 세트상품 -->
-								<div class="setOption">
-									<div class="form_wrap">
-										<div class="form_field">
-											<p class="title">슬림핏 마이크로 체크 네이비컬러 셋업수트 자켓</p>
-											<div class="select_custom item_opt1">
-												<div class="combo">
-													<div class="select">상품옵션01</div>
-													<ul class="list" style="display: none;">
-														<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" / 품절표기 data-soldout="true" 추가  -->
-														<li class="">선택</li> 
-														<li class="selected">상품옵션01</li>
-														<li>상품옵션02</li>
-														<li>상품옵션03</li>
-														<li aria-disabled="true">상품옵션05</li>
-														<li>상품옵션06</li>
-														<li aria-disabled="true" data-soldout="true">상품옵션07</li>
-													</ul>
-												</div>
-											</div>
-										</div>
-										<div class="form_field">
-											<div class="select_custom item_opt2" disabled>
-												<div class="combo">
-													<div class="select">상품옵션12</div>
-													<ul class="list" style="display: none;">
-														<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" / 품절표기 data-soldout="true" 추가  -->
-														<li class="">선택</li> 
-														<li class="">상품옵션11</li>
-														<li class="selected">상품옵션12</li>
-														<li>상품옵션13</li>
-														<li aria-disabled="true">상품옵션15</li>
-														<li>상품옵션16</li>
-														<li aria-disabled="true" data-soldout="true">상품옵션17</li>
-													</ul>
-												</div>
-											</div>
-										</div>
-									</div>
-									<div class="form_wrap">
+								<div class="setOption" th:if="${goodsComposeList != null and !goodsComposeList.empty}" >
+									<div class="form_wrap"  th:each="goodsCompose, status : ${goodsComposeList}">
 										<div class="form_field">
-											<p class="title">슬림핏 마이크로 체크 네이비컬러 셋업수트 바지</p>
-											<div class="select_custom item_opt1">
+											<p class="title" th:text="${goodsCompose.compsGoodsFullNm}">슬림핏</p>
+											<div class="select_custom item_opt1" th:classappend="${'item_opt1_'+status.count +' '+goodsCompose.compsGoodsCd}" 
+																				th:if="${goodsCompose.goodsOption1List != null and !goodsCompose.goodsOption1List.empty}" >
 												<div class="combo">
-													<div class="select">상품옵션01</div>
+													<div class="select">선택</div>
 													<ul class="list" style="display: none;">
-														<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" / 품절표기 data-soldout="true" 추가  -->
-														<li class="">선택</li> 
-														<li class="selected">상품옵션01</li>
-														<li>상품옵션02</li>
-														<li>상품옵션03</li>
-														<li aria-disabled="true">상품옵션05</li>
-														<li>상품옵션06</li>
-														<li aria-disabled="true" data-soldout="true">상품옵션07</li>
+														<th:block th:each="goodsOption, optionStatus : ${goodsCompose.goodsOption1List}" >
+														<li class="selected" th:id="|selfGoodsOpt1${goodsCompose.compsGoodsCd}|" th:if=${optionStatus.first}>선택</li> 
+														<li th:onclick="fnOption2([[${status.count}]], [[${goodsOption.goodsCd}]],[[${goodsOption.optCd1}]],[[${goodsCompose.qty}]],[[${goodsInfo.minOrdQty}]], [[${goodsInfo.maxOrdQty}]], [[${goodsOption.currPrice}]])"
+															th:attr="aria-disabled=${(goodsCompose.goodsStat != 'G008_90')? 'true':''}, data-soldout=${(goodsCompose.goodsStat != 'G008_90')? 'true':''}"
+															th:text="${goodsOption.optCd1}">상품옵션
+															<input type="hidden" name="opt" th:attr="addPrice=${goodsOption.addPrice}, optCd1=${goodsOption.optCd1},optCd2=${goodsOption.optCd2}, optCd=${goodsOption.optCd}"/>
+														</li>
+														</th:block>
 													</ul>
 												</div>
 											</div>
 										</div>
 										<div class="form_field">
-											<div class="select_custom item_opt2" disabled>
+											<div class="select_custom item_opt2" th:classappend="${'item_opt2_'+status.count +' '+goodsCompose.compsGoodsCd}" disabled>
 												<div class="combo">
-													<div class="select">상품옵션12</div>
-													<ul class="list" style="display: none;">
-														<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" / 품절표기 data-soldout="true" 추가  -->
-														<li class="">선택</li> 
-														<li class="">상품옵션11</li>
-														<li class="selected">상품옵션12</li>
-														<li>상품옵션13</li>
-														<li aria-disabled="true">상품옵션15</li>
-														<li>상품옵션16</li>
-														<li aria-disabled="true" data-soldout="true">상품옵션17</li>
+													<div class="select">선택</div>
+													<ul class="list" th:id="|goodsOpt2${goodsCompose.compsGoodsCd}|">
 													</ul>
 												</div>
 											</div>
@@ -1077,7 +1014,8 @@
 			
 			fnSetTotalPrice();
 			
-			$('.pop_option_select').css("display", "none");
+			// 해야하나 말아야하나
+			//$('.pop_option_select').css("display", "none");
 			
 		}, "text");
 	}
@@ -1153,7 +1091,7 @@
 		let jsonData = JSON.stringify(data);
 		gagajf.ajaxJsonSubmit('/goods/detail/option1/list', jsonData, function(result) {
 			
-			if (result.dataList != null && result.dataList.length > 0) {
+			if (result.dataList != null && result.dataList.length > 0) {debugger;
 				let tag = "";
 				let $obj = null;
 				
@@ -1183,7 +1121,7 @@
 					tag += '</div>\n';
 					//------	
 				}
-
+debugger;
 				if (selfGoodsYn == "Y"){
 					if (ridx == 1){
 						$obj = $('.pop_option_select .select_custom.item_opt1.item_opt1_1');	
@@ -1250,15 +1188,15 @@
 				
 				if (selfGoodsYn == "Y"){
 					if (ridx == 1){
-						$obj = $('.opt_set_select .select_custom.item_opt2.item_opt2_1');	
+						$obj = $('.pop_option_select .select_custom.item_opt2.item_opt2_1');	
 					}else if (ridx == 2){
-						$obj = $('.opt_set_select .select_custom.item_opt2.item_opt2_2');	
+						$obj = $('.pop_option_select .select_custom.item_opt2.item_opt2_2');	
 					}else if (ridx == 3){
-						$obj = $('.opt_set_select .select_custom.item_opt2.item_opt2_3');
+						$obj = $('.pop_option_select .select_custom.item_opt2.item_opt2_3');
 					}else if (ridx == 4){
-						$obj = $('.opt_set_select .select_custom.item_opt2.item_opt2_4');
+						$obj = $('.pop_option_select .select_custom.item_opt2.item_opt2_4');
 					}else{
-						$obj = $('.opt_set_select .select_custom.item_opt2.item_opt2_5');
+						$obj = $('.pop_option_select .select_custom.item_opt2.item_opt2_5');
 					}
 					
 				}else{
@@ -1307,19 +1245,19 @@
 				$obj.append(tag);
 				if (selfGoodsYn == "Y"){
 					if (ridx == 1){
-						var opt_selecter02_1 = new sCombo('.opt_set_select .select_custom.item_opt2.item_opt2_1');	
+						var opt_selecter02_1 = new sCombo('.pop_option_select .select_custom.item_opt2.item_opt2_1');	
 					}else if (ridx == 2){
-						var opt_selecter02_2 = new sCombo('.opt_set_select .select_custom.item_opt2.item_opt2_2');	
+						var opt_selecter02_2 = new sCombo('.pop_option_select .select_custom.item_opt2.item_opt2_2');	
 					}else if (ridx == 3){
-						var opt_selecter02_3 = new sCombo('.opt_set_select .select_custom.item_opt2.item_opt2_3');
+						var opt_selecter02_3 = new sCombo('.pop_option_select .select_custom.item_opt2.item_opt2_3');
 					}else if (ridx == 4){
-						var opt_selecter02_4 = new sCombo('.opt_set_select .select_custom.item_opt2.item_opt2_4');
+						var opt_selecter02_4 = new sCombo('.pop_option_select .select_custom.item_opt2.item_opt2_4');
 					}else{
-						var opt_selecter02_5 = new sCombo('.opt_set_select .select_custom.item_opt2.item_opt2_5');
+						var opt_selecter02_5 = new sCombo('.pop_option_select .select_custom.item_opt2.item_opt2_5');
 					}
 					
 				}else{
-					var opt_selecter02 = new sCombo('.opt_select .select_custom.item_opt2.item_opt2_1');
+					var opt_selecter02 = new sCombo('.pop_option_select .select_custom.item_opt2.item_opt2_1');
 				}	
 			}
 			
@@ -1645,34 +1583,12 @@
 		params.contentsLoc = "tmtb";
 		fnGoodsLikeSearch(params);
 	
-		// selecter
-		$(function(){
-			//var item_opt01 = new sCombo('.pd .pop_option_select .item_opt1');
-			//var item_opt02 = new sCombo('.pd .pop_option_select .item_opt2');
-			var opt_select = new sCombo('.pd .op1 .opt_select .select_custom');
-		});
-
-		//옵션변경 셀렉트
-		var opt_selecter01 = new sCombo('.pd .pop_option_select .item_opt1');
-		$('.pd .pop_option_select .select_custom .combo .list > li').click(function(e) {
-			$(this).parents('.form_field').next('.form_field').find('.select_custom').attr('disabled', false);
-			return false;
-		});
-		var opt_selecter02 = new sCombo('.pd .pop_option_select .item_opt2');
-
-		var opt_selecter03 = new sCombo('.pd .pop_option_select .item_opt3');
-		$('.pd .pop_option_select .select_custom .combo .list > li').click(function(e) {
-			$(this).parents('.form_field').next('.form_field').find('.select_custom').attr('disabled', false);
-			return false;
-		});
-		var opt_selecter04 = new sCombo('.pd .pop_option_select .item_opt4');
-
-		var opt_selecter05 = new sCombo('.pd .pop_option_select .item_opt5');
-		$('.pd .pop_option_select .select_custom .combo .list > li').click(function(e) {
-			$(this).parents('.form_field').next('.form_field').find('.select_custom').attr('disabled', false);
-			return false;
-		});
-		var opt_selecter06 = new sCombo('.pd .pop_option_select .item_opt6');
+	
+		var opt_selecter01_1 = new sCombo('.pop_option_select .select_custom.item_opt1.item_opt1_1');
+		var opt_selecter01_2 = new sCombo('.pop_option_select .select_custom.item_opt1.item_opt1_2');
+		var opt_selecter01_3 = new sCombo('.pop_option_select .select_custom.item_opt1.item_opt1_3');
+		var opt_selecter01_4 = new sCombo('.pop_option_select .select_custom.item_opt1.item_opt1_4');
+		var opt_selecter01_5 = new sCombo('.pop_option_select .select_custom.item_opt1.item_opt1_5');
 
 		if (!gagajf.isNull([[${goodsInfo.socialSq}]])){
 			$('.timer_box').css('display', 'block');

+ 13 - 12
src/main/webapp/WEB-INF/views/web/cart/CartChangeOptionPopupWeb.html

@@ -62,7 +62,7 @@
 												<div class="select" th:text="${comp.colorNm}"></div>
 												<ul class="list" th:data="${comp.goodsCd}">
 													<th:block th:each="color, index : ${comp.cartColorList}">
-														<li th:classappend="${color.cartColorNm != null} ? 'selected'" th:data="${color.optCd1}" th:text="${color.colorNm}" th:aria-disabled="${color.soldoutYn.equals('Y') ? true : false}"></li>
+														<li th:classappend="${color.cartColorNm != null} ? 'selected'" th:colorNo="${color.colorNo}" th:data="${color.optCd1}" th:text="${color.colorNm}" th:aria-disabled="${color.soldoutYn.equals('Y') ? true : false}"></li>
 													</th:block>
 												</ul>
 											</div>
@@ -78,12 +78,12 @@
 								<form class="form_wrap">
 									<div class="form_field">
 										<th:block th:each="color, index : ${comp.cartColorList}">
-											<div class="select_custom item_opt2 sizeList" th:classappend="|${comp.goodsCd}_${color.optCd1} sizeList${comp.goodsCd}|" th:style="${color.cartColorNm != null ? 'display:block' : 'display:none'}">
+											<div class="select_custom item_opt2 sizeList" th:classappend="|color_${comp.goodsCd}_${color.colorNo} sizeList${comp.goodsCd}|" th:style="${color.cartColorNm != null ? 'display:block' : 'display:none'}">
 												<div class="combo">
 													<div class="select" th:classappend="|size_${comp.goodsCd}_size_nm|" th:text="${comp.optCd2}" th:data="${color.goodsCd}"></div>
 													<ul class="list setSizeSelect" th:classappend="|size_${comp.goodsCd}|" th:data="${comp.goodsCd}">
 														<th:block th:each="size, i : ${color.cartSizeList}" th:if="${color.optCd1.equals(size.optCd1)}">
-															<li th:classappend="${size.cartOptCd != null} ? selected" th:optCd="${size.optCd}" th:value="${size.optCd}" th:text="${size.optCd2}" th:aria-disabled="${color.soldoutYn.equals('Y') or size.soldoutYn.equals('Y') ? true : false}"></li>
+															<li th:classappend="${size.cartOptCd != null} ? selected" th:optCd="${size.optCd}" th:value="${size.optCd}" th:text="${size.optCd2}" th:aria-disabled="${color.soldoutYn.equals('Y') or size.soldoutYn.equals('Y') or size.minOrdQty > size.currStockQty ? true : false}"></li>
 														</th:block>
 													</ul>
 												</div>
@@ -122,7 +122,7 @@
 										<th:block th:if="${color.cartColorNm != null}">
 											<th:block th:each="size, index : ${color.cartSizeList}">
 												<div>
-													<input type="radio" name="rdi-optsize" th:id="|${'rdi-optsize' + size.goodsCd + '-' + size.optCd}|" th:value="${size.optCd}" th:checked="${size.cartOptCd != null}" th:disabled="${size.soldoutYn == 'Y' or cart.goodsQty > size.currStockQty}">
+													<input type="radio" name="rdi-optsize" th:soldoutYn="${size.soldoutYn}" th:id="|${'rdi-optsize' + size.goodsCd + '-' + size.optCd}|" th:value="${size.optCd}" th:checked="${size.cartOptCd != null}" th:disabled="${size.soldoutYn == 'Y' or size.minOrdQty > size.currStockQty}">
 													<label th:for="|${'rdi-optsize' + size.goodsCd + '-' + size.optCd}|"><span th:text="${size.optCd2}"></span></label>
 												</div>
 											</th:block>
@@ -154,7 +154,7 @@
 												<div class="select" th:text="${comp.colorNm}"></div>
 												<ul class="list" th:data="${comp.goodsCd}">
 													<th:block th:each="color, index : ${comp.cartColorList}">
-														<li th:classappend="${color.cartColorNm != null} ? 'selected'" th:data="${color.optCd1}" th:text="${color.colorNm}" th:aria-disabled="${color.soldoutYn.equals('Y') ? true : false}"></li>
+														<li th:classappend="${color.cartColorNm != null} ? 'selected'" th:colorNo="${color.colorNo}" th:data="${color.optCd1}" th:text="${color.colorNm}" th:aria-disabled="${color.soldoutYn.equals('Y') ? true : false}"></li>
 													</th:block>
 												</ul>
 											</div>
@@ -170,12 +170,12 @@
 								<form class="form_wrap">
 									<div class="form_field">
 										<th:block th:each="color, index : ${comp.cartColorList}">
-											<div class="select_custom item_opt2 sizeList" th:classappend="|${comp.goodsCd}_${color.optCd1} sizeList${comp.goodsCd}|" th:style="${color.cartColorNm != null ? 'display:block' : 'display:none'}">
+											<div class="select_custom item_opt2 sizeList" th:classappend="|color_${comp.goodsCd}_${color.colorNo} sizeList${comp.goodsCd}|" th:style="${color.cartColorNm != null ? 'display:block' : 'display:none'}">
 												<div class="combo">
 													<div class="select" th:classappend="|size_${comp.goodsCd}_size_nm|" th:text="${comp.optCd2}" th:data="${color.goodsCd}"></div>
 													<ul class="list setSizeSelect" th:classappend="|size_${comp.goodsCd}|" th:data="${comp.goodsCd}">
 														<th:block th:each="size, i : ${color.cartSizeList}" th:if="${color.optCd1.equals(size.optCd1)}">
-															<li th:classappend="${size.cartOptCd != null} ? selected" th:optCd="${size.optCd}" th:value="${size.optCd}" th:text="${size.optCd2}" th:aria-disabled="${color.soldoutYn.equals('Y') or size.soldoutYn.equals('Y') ? true : false}"></li>
+															<li th:classappend="${size.cartOptCd != null} ? selected" th:optCd="${size.optCd}" th:value="${size.optCd}" th:text="${size.optCd2}" th:aria-disabled="${color.soldoutYn.equals('Y') or size.soldoutYn.equals('Y') or size.minOrdQty > size.currStockQty ? true : false}"></li>
 														</th:block>
 													</ul>
 												</div>
@@ -215,10 +215,11 @@
 		$("#cartOptionModal .colorList > .combo > .list li").on("click", function(e) {
 			let goodsCd = $(this).parent().attr("data");
 			let optCd1 = $(this).attr("data");
+			let colorNo = $(this).attr("colorNo");
 			let firstSize = "";
 			if(optCd1 != $(".option1_" + goodsCd).val()) {
-				let firstOptCd = $("#cartOptionModal ." + goodsCd + "_" + optCd1 + " li:first").attr("optcd");
-				let firstOptCd2 = $("#cartOptionModal ." + goodsCd + "_" + optCd1 + " li:first").text();
+				let firstOptCd = $("#cartOptionModal .color_" + goodsCd + "_" + colorNo + " li:first").attr("optcd");
+				let firstOptCd2 = $("#cartOptionModal .color_" + goodsCd + "_" + colorNo + " li:first").text();
 
 				$("#cartOptionModal .chooseColorNm_" + goodsCd).text($(this).text());
 				$("#cartOptionModal .option_" + goodsCd).val(firstOptCd);
@@ -226,8 +227,8 @@
 				$("#cartOptionModal .option2_" + goodsCd).val(firstOptCd2);
 
 				$("#cartOptionModal .sizeList" + goodsCd).hide();
-				$("#cartOptionModal ." + goodsCd + "_" + optCd1).show();
-				$("#cartOptionModal ." + goodsCd + "_" + optCd1 + " .select").text(firstOptCd2);
+				$("#cartOptionModal .color_" + goodsCd + "_" + colorNo).show();
+				$("#cartOptionModal .color_" + goodsCd + "_" + colorNo + " .select").text(firstOptCd2);
 				$("#cartOptionModal .chooseSizeNm_" + goodsCd).text(firstOptCd2);
 			}
 		});
@@ -260,7 +261,7 @@
 					if(optCd1 == size[j].optCd1) {
 						sizeHtml += "<div>";
 						sizeHtml += "<input type='radio' name='rdi-optsize' id='" + size[j].goodsCd + "-" + size[j].optCd + "' value='" + size[j].optCd + "' ";
-						if(size[j].soldoutYn == "Y" || cart.goodsQty > size[j].currStockQty) {
+						if(size[j].soldoutYn == "Y" || size[j].minOrdQty > size[j].currStockQty) {
 							sizeHtml += "disabled = 'disabled'";
 						}
 						sizeHtml += " />\n";

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

@@ -288,21 +288,6 @@
 		getCartList(data);
 	});
 
-    //상품옵션변경 팝업 > 수량조절
-    $(document).on('click','.opt_modify_pop .number_count .minus',function(e){
-        var $input = $(this).parent().find('input');
-        var count = parseInt($input.val()) - 1;
-        count = count < 1 ? 1 : count;
-        $input.val(count);
-        $input.change();
-        return false;
-    }).on('click','.opt_modify_pop .number_count .plus',function(e){
-        var $input = $(this).parent().find('input');
-        $input.val(parseInt($input.val()) + 1);
-        $input.change();
-        return false;
-    });
-
 	//팝업 - 쿠폰사용안내
 	$(document).on('click','#btn_cartCouponInfo_pop',function(e){
 		$(".cartCpnInfoModal").modal("show");

+ 104 - 14
src/main/webapp/WEB-INF/views/web/common/fragments/FooterWeb.html

@@ -174,7 +174,7 @@
 			<li>
 				<button type="button" id="quick04" class="quick_btn04" data-tab="quick04">
 					<img src="/images/pc/ico_qk_coupon.png" alt="쿠폰"/>
-					<span class="count">100</span>
+					<span class="count">0</span>
 				</button>
 			</li>
 			<li>
@@ -489,16 +489,16 @@
 			</div>
 			<div class="coupon quick_con quick04"> <!-- 퀵메뉴_나의 쿠폰 -->
 				<div class="quick_head">
-					<h3><a href="">나의 쿠폰</a></h3>
+					<h3><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MYPAGE_COUPON);">나의 쿠폰</a></h3>
 				</div>
-				<div class="quick_body"> <!-- 비로그인 시 need_login 클래스 추가 -->
+				<div class="quick_body" id="couponList"> <!-- 비로그인 시 need_login 클래스 추가 -->
 					<div class="coupon_tab">
-						<a href="#coupon_type01" id="" class="">발급 가능 쿠폰</a>
-						<a href="#coupon_type02" id="" class="">보유 쿠폰</a>
+						<a href="#coupon_type01" onclick="issueCouponBtn()">발급 가능 쿠폰</a>
+						<a href="#coupon_type02" onclick="ownCouponBtn()">보유 쿠폰</a>
 					</div>
 					<div id="coupon_type01" class="coupon_area">
-						<div class="pop_cont">
-							<ul class="coupon_list">
+						<div class="pop_cont" id="issueCoupon">
+							<!-- <ul class="coupon_list">
 								<li>
 									<div class="coupon">
 										<div>
@@ -601,12 +601,14 @@
 										<button type="button" class="btn btn_dark btn_block btn_coupon_done" disabled=""><span>받기완료</span></button>
 									</div>
 								</li>
-							</ul>
+							</ul> -->
 						</div>
+						<a href="javascript:void(0);" class="more_btn" onclick="cfnGoToPage(_PAGE_EVENT_MAIN);">더 보기</a>_
 					</div>
+					
 					<div id="coupon_type02" class="coupon_area">
-						<div class="coupon_list">
-							<ul class="clear">
+						<div class="coupon_list" id="ownCoupon">
+							<!-- <ul class="clear">
 								<li>
 									<div class="cp_top">
 										<div class="cp_detail">
@@ -641,16 +643,17 @@
 										<button type="button" class="coupon_pop_btn"><span>사용안내</span></button>
 									</div>
 								</li>
-							</ul>
+							</ul> -->
 						</div>
+						<a href="javascript:void(0);" class="more_btn" onclick="cfnGoToPage(_PAGE_MYPAGE_COUPON);">더 보기</a>_
 					</div>
-					<a href="" class="more_btn">더 보기</a>
+					
 					<div class="login_con">
 						<div>
 							<p>로그인 후 이용 가능한 서비스입니다.</p>
-							<button type="button" class="btn btn_sm"><span>로그인</span></button>
+							<button type="button" class="btn btn_sm" onclick="cfnGoToPage(_PAGE_LOGIN);"><span>로그인</span></button>
 						</div>
-					</div>
+					</div> 
 				</div>
 			</div>
 			<div class="category quick_con quick05"> <!-- 퀵메뉴_카테고리 -->
@@ -861,6 +864,16 @@
 	<!-- //배송요청사항수정 팝업 -->
 	<!-- //2021.04.02 배송지변경팝업 공통화 작업 -->
 	
+	<!-- 쿠폰 사용 내역 팝업 -->
+	<div class="modal fade couponInfo_pop" id="couponInfoPop" tabindex="-1" role="dialog" aria-labelledby="couponInfoLabel" aria-hidden="true">
+	<div class="modal-dialog" role="document">
+		<div class="modal-content">
+               <!-- 쿠폰사용안내 팝업 내용 -->      
+		</div>
+	</div>
+	<a href="#close-modal" rel="modal:close" id="couponInfoPop_close" class="close-modal">Close</a>
+	</div>
+	
 <script th:inline="javascript">
 /*<![CDATA[*/
 	// 패밀리 사이트
@@ -1229,6 +1242,80 @@
 		}
 	}
 	
+	// 쿠폰리스트
+	let issueCouponBtn = function() {
+		if (!cfCheckLogin()) {
+			$('#couponList').addClass('need_login');
+			return false;
+		}else{
+			
+		}
+	}
+	
+	// 보유 쿠폰 클릭 시 
+	let ownCouponBtn = function() {
+		$.getJSON('/mypage/quick/own/coupon/list'
+				, function(result, status) {
+					if (status == 'success') {
+						if (result.length > 0) {
+							let tag = '';
+							tag += '<ul class="clear">';
+							$.each(result, function (idx, item) {
+								tag += '	<li>';
+								tag += '		<div class="cp_top">';
+								tag += '			<div class="cp_detail">';
+								tag += '				<p class="tit">'+item.cpnNm+'</p>';
+								if (item.dcWay == '%') {
+									tag += '				<strong class="sale_t won_t"><span>'+item.dcVal+'</span>%</strong>';
+								}else{
+									tag += '				<strong class="sale_t won_t"><span>'+item.dcVal+'</span>원</strong>';
+								}
+								
+								tag += '				<p class="cp_cont">'+item.useCondition+'</p>';
+								tag += '				<span class="cp_cnt"><span>'+item.cpnCnt+'</span>장 보유</span>';
+								tag += '			</div>';
+								tag += '			<span class="cp_shape"></span>';
+								tag += '		</div>';
+								tag += '		<div class="cp_date">';
+								tag += '			<span>'+item.availStdt+'</span> ~ <span>'+item.availEddt+'</span>';
+								tag += '		</div>';
+								tag += '		<div class="cp_info">';
+								tag += '			<button type="button" class="coupon_pop_btn" onclick="useInfoCoupon('+item.cpnId+')"><span>사용안내</span></button>';
+								tag += '		</div>';
+								tag += '	</li>';
+							});
+							tag += '<ul>';
+							
+							$('#ownCoupon').html(tag);
+						} else {
+							$('#ownCoupon').addClass('nodata');
+						}
+					}
+			});
+	}
+	
+	// 소유한 쿠폰 사용안내 모달
+	var useInfoCoupon = function (id) {
+		var data = {cpnId : id};
+		var jsonData = JSON.stringify(data);
+		
+		 $.ajax( {
+			type		: "POST",
+			url 		: '/mypage/coupon/detailPop',
+			data		: jsonData,
+			contentType: 'application/json',
+			dataType 	: 'html',
+			success 	: function(result) {
+				if (result != null) {
+					$("#couponInfoPop").html(result);
+					$("#couponInfoPop").modal("show");
+				}
+			}
+		});
+		
+		return false; 
+	}
+	
 	// 팝업
 	let fnGetPopup = function(){
 		let data = {viewPage : [[${viewPage}]]
@@ -1350,6 +1437,9 @@
 		// 팝업조회
 		fnGetPopup();
 		
+		// 쿠폰조회
+		$("#issueCouponBtn").trigger("click");	
+		
 		// Family Site
 		$('.family_link').on('click','.btn',function(e){
 			e.preventDefault();

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

@@ -608,41 +608,53 @@
 				tag += '				</ul>\n';
 				tag += '			</div>\n';
 				tag += '		</div>\n';
+				tag += '	<div class="head_banner" id="id'+cate1.cate1No+'">\n';
+				tag += '	</div>';
 				tag += '	</div>\n';
 			}
-
-			// if (cate1.bannerList.length > 0) {
-			// 	tag += '	<div class="head_banner">\n';
-			// 	tag += '		<div class="tit">\n';
-			// 	tag += '			<p>가을의 신상 만나기</p>\n';
-			// 	tag += '		</div>\n';
-			// 	tag += '		<div class="list">\n';
-			// 	tag += '			<ul class="clear event_con">\n';
-			// 	tag += '				<li>\n';
-			// 	tag += '					<a href="">\n';
-			// 	tag += '						<div class="ev_img"><img src="/images/pc/thumb/ev_list_img01.jpg" alt="ATTENTION! 20FW HOLIDAY TBJ 주목할 홀리데이 TBJ 컬렉션"></div>\n';
-			// 	tag += '						<div class="txt">\n';
-			// 	tag += '							<p class="tit">2020 FALL COLLECTION 가을에는 이 컬러 2020 FALL COLLECTION 가을에는 이 컬러</p>\n';
-			// 	tag += '						</div>\n';
-			// 	tag += '					</a>\n';
-			// 	tag += '				</li>\n';
-			// 	tag += '				<li>\n';
-			// 	tag += '					<a href="">\n';
-			// 	tag += '						<div class="ev_img"><img src="/images/pc/thumb/ev_list_img02.jpg" alt="단 48시간, 퓨어캐시미어 최대 80%세일 PURE CASHMERE 48H POP-UP"></div>\n';
-			// 	tag += '						<div class="txt">\n';
-			// 	tag += '							<p class="tit">FALL NEW ARRIVAL</p>\n';
-			// 	tag += '						</div>\n';
-			// 	tag += '					</a>\n';
-			// 	tag += '				</li>\n';
-			// 	tag += '			</ul>\n';
-			// 	tag += '		</div>\n';
-			// 	tag += '	</div>\n';
-			// }
 			tag += '</li>\n';
 		}
 		return tag;
 	}
 
+	let fnGetGnbBanner = function (cateNo, title){
+		let actionUrl = '/display/gnb/tab/banner/list?cateNo='+cateNo;
+		let tag2 = '';
+		$.getJSON(actionUrl
+		, function(result, status){
+			var bannerImgUrl = [[${@environment.getProperty('domain.image')}]];
+			var planninImgUrl = [[${@environment.getProperty('upload.image.view')}]];
+			if(result.length>0){
+				tag2 += '		<div class="tit">\n';
+				tag2 += '			<p>'+title+'</p>\n';
+				tag2 += '		</div>\n';
+				tag2 += '		<div class="list">\n';
+				tag2 += '			<ul class="clear event_con">\n';
+				$.each(result, function (idx, item){
+					tag2 += '				<li>\n';
+					tag2 += '					<a href="javascript:void(0);" onclick="cfnGoToPage(\''+item.strVar1+'\')">\n';
+					if(item.bannerGb=='ADMIN'){
+						tag2 += '						<div class="ev_img"><img src="'+bannerImgUrl+''+item.imgPath1+'" alt=""></div>\n';
+					}else{
+						tag2 += '						<div class="ev_img"><img src="'+planninImgUrl+''+item.imgPath1+'" alt=""></div>\n';
+					}
+
+					tag2 += '						<div class="txt">\n';
+					tag2 += '							<p class="tit">'+item.strTitle1+'</p>\n';
+					// tag2 += '							<p class="tit">'+item.strTitle2+'</p>\n';
+					tag2 += '						</div>\n';
+					tag2 += '					</a>\n';
+					tag2 += '				</li>\n';
+				});
+				tag2 += '			</ul>\n';
+				tag2 += '		</div>\n';
+			}
+			$('#id'+cateNo).append(tag2);
+			return tag2;
+		});
+
+	}
+
 	// GNB탭 생성
 	let fnCreateGnbTab = function() {
 		$.getJSON('/display/gnb/tab/list'
@@ -658,6 +670,7 @@
 								$.each(allCate, function(allCateIdx, allCateItem) {
 									if (item.cate1No == allCateItem.cate1No) {
 										let gnbCate = fnGetGnbCategory(allCateItem);
+										fnGetGnbBanner(item.cate1No ,item.gtabBannerTitle);
 										$('#divGnbTab').append(gnbCate);
 										$('#ulGnbTab').append(gnbCate);
 									}

+ 1 - 5
src/main/webapp/WEB-INF/views/web/common/layout/PlanningLayoutWeb.html

@@ -14,7 +14,7 @@
 </div>
 	
 <th:block th:replace="~{web/common/fragments/VariablesWeb :: variables}"></th:block>
-
+<th:block th:replace="~{web/common/fragments/ScriptsWeb :: scripts}"></th:block>
 
 <!-- GNB -->
 <th:block th:if="${brandGroupInfo == null }">
@@ -23,8 +23,6 @@
 <th:block th:if="${brandGroupInfo != null }">
 	<header id="header" th:replace="~{web/common/fragments/BrandGnbWeb :: gnb}"></header>
 </th:block>
-
-
 <!--// GNB -->
 
 <!-- CONTENT AREA -->
@@ -34,8 +32,6 @@
 <!-- Footer -->
 <footer id="footer" th:replace="~{web/common/fragments/FooterWeb :: footer}"></footer>
 
-<th:block th:replace="~{web/common/fragments/ScriptsWeb :: scripts}"></th:block>
-
 <script th:inline="javascript">
 /*<![CDATA[*/
 	$(document).ready(function() {

+ 65 - 7
src/main/webapp/WEB-INF/views/web/display/MallMainFormWeb.html

@@ -37,18 +37,21 @@
 										<div class="swiper-slide">
 											<th:block th:if="${ContentsData.imgPath1!=null && ContentsData.imgPath1!=''}">
 												<div class="txtWrap">
+
 													<th:block th:if="${ContentsData.strVar5!=null && ContentsData.strVar5!=''}">
 														<p class="vrt_txt" th:if="${ContentsData.strVar5=='P'}" th:text="${ContentsData.planBrandGroupNm}"></p>
-														<p class="vrt_txt" th:if="${ContentsData.strVar5!='P'}">EVENT</p>
+														<p class="vrt_txt" th:if="${ContentsData.strVar5!='P'}" >EVENT</p>
 													</th:block>
 													<dl th:class="${ContentsData.strVar7=='BLACK'?'':'w'}">
 														<dt th:if="${ContentsData.strVar5=='P'}" th:text="${ContentsData.planBrandGroupNm}"></dt>
 														<dt th:if="${ContentsData.strVar5!='P'}" >EVENT</dt>
-														<dd th:text="${ContentsData.strTitle1}"></dd>
-														<!--<dd>NEW ARRIVAL</dd>-->
+														<dd class="mainTitle">
+															<input type="hidden" name="mainTitlee" th:value="${ContentsData.strTitle1}"/>
+														</dd>
+<!--														<dd>NEW ARRIVAL</dd>-->
 														<dd class="txt_xs" th:text="${ContentsData.subText1}"></dd>
 													</dl>
-													<button type="button" class="btn"><span>자세히 보기</span></button>
+													<button type="button" class="btn" th:onclick="cfnGoToPage([[${ContentsData.strVar1}]]);"><span>자세히 보기</span></button>
 												</div>
 												<!--<img src="/images/pc/thumb/main_visual01.jpg" alt="">-->
 												<img th:src="${@environment.getProperty('domain.image')+ContentsData.imgPath1}">
@@ -140,8 +143,12 @@
 				<th:block th:if="${contentsLoc=='004'}">
 					<div class="content main_it">
 						<div class="cont_head">
-							<p class="displayH" th:text="${mainLayoutData.contentsTitle}"></p>
-							<a href="#none"><span>전체보기</span></a>
+							<p class="displayH" id="id004">
+								<input type="hidden" name="title" th:value="${mainLayoutData.contentsTitle}">
+							</p>
+							<th:block th:each="ContentsData, ContentsStat : ${mainLayoutData.ContentsList}">
+								<a href="javascript:void(0);" th:onclick="cfnGoToPage([[${ContentsData.strVar1}]]);"><span>전체보기</span></a>
+							</th:block>
 						</div>
 						<div class="cont_body">
 							<div class="it_nav">
@@ -177,6 +184,9 @@
 											</div>
 										</th:block>
 									</div>
+									<div class="swiper-controls">
+										<div class="swiper-scrollbar"></div>
+									</div>
 								</div>
 							</th:block>
 						</div>
@@ -218,7 +228,9 @@
 				<th:block th:if="${contentsLoc=='006'}">
 					<div class="content wide main_deal" th:if="${mainLayoutData.socialInfo != null}">
 						<div class="cont_head">
-							<p class="displayH" id="id006" th:text="${mainLayoutData.contentsTitle}">오늘만<br>이 가격에 만나요</p>
+							<p class="displayH" id="id006">
+								<input type="hidden" name="title" th:value="${mainLayoutData.contentsTitle}">
+							</p>
 							<a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_SOCIAL_MAIN);"><span>전체보기</span></a>
 							<div class="deal_progress">
 								<div class="bar_current" style="width:33.333%"><span>HERE</span></div>
@@ -1108,6 +1120,52 @@ var main_tv_slide = new Swiper ('.main_tv .post-tv', {
 		// var brCheck = "오늘만 <br> 이 가격@".split("<br>");
 		// console.log(brCheck[0]);
 		// console.log(brCheck[1]);
+
+		// 몰메인 <br> 태그
+		$('.mainTitle').each(function (){
+			let tag = '';
+			var brText = $(this).find("input[name=mainTitlee]").val();
+
+			if(brText.indexOf('<br>') > -1){
+				var reText = brText.split("<br>");
+				tag += reText[0];
+				tag += '<br>';
+				tag += reText[1];
+			}else{
+				tag += brText;
+			}
+			$(this).append(tag);
+		});
+
+		// 잇아이템 <br> 태그
+		var id004Text = $("#id004").find("input[name=title]").val();
+		if(id004Text.indexOf('<br>') > -1){
+			let tag = '';
+			var reText = id004Text.split("<br>");
+			tag += reText[0];
+			tag += '<br>';
+			tag += reText[1];
+			$("#id004").append(tag);
+		}else{
+			let tag = '';
+			tag += id004Text;
+			$("#id004").append(tag);
+		}
+
+		// 핫딜 <br> 태그
+		var id006Text = $("#id006").find("input[name=title]").val();
+		if(id006Text.indexOf('<br>') > -1){
+			let tag = '';
+			var reText = id006Text.split("<br>");
+			tag += reText[0];
+			tag += '<br>';
+			tag += reText[1];
+			$("#id006").append(tag);
+		}else{
+			let tag = '';
+			tag += id006Text;
+			$("#id006").append(tag);
+		}
 	});
 /*]]>*/
 </script>

+ 2 - 0
src/main/webapp/WEB-INF/views/web/mypage/MypageCancelFormWeb.html

@@ -305,6 +305,8 @@
 		data.bankCd = bankCd;
 		data.isCustomer = 'Y';
 		data.reqGbn = 'cnclComplete';
+		data.pgTid = paymentInfo.pgTid;
+		data.payAmt = paymentInfo.payAmt;
 		data.ordDtlNoArr = ordDtlNoArr;
 		data.cnclRtnReqQtyArr = cnclRtnReqQtyArr;
 

+ 27 - 43
src/main/webapp/WEB-INF/views/web/mypage/MypageCouponDetailFormWeb.html

@@ -17,48 +17,32 @@
  *******************************************************************************
  -->
 <!-- 쿠폰 상세보기 팝업 -->
-<div class="modal-dialog" role="document">
-    <div class="modal-content">
-        <div class="modal-header">
-            <h5 class="modal-title" th:text="${couponDetailInfo.cpnNm}"></h5>
-        </div>
-        <div class="modal-body">
-            <div class="pop_cont">
-                <p th:if="${couponDetailInfo.buyLimitAmt < 1}"><strong>사용조건</strong>제한없음</p>
-                <p th:unless="${couponDetailInfo.buyLimitAmt < 1}"><strong>사용조건</strong>[[${#numbers.formatInteger(couponDetailInfo.buyLimitAmt,0,'COMMA')}]]원 이상 구매 시 최대 [[${#numbers.formatInteger(couponDetailInfo.maxDcAmt,0,'COMMA')}]]원 할인 </p>
-                <p th:if="${couponDetailInfo.custPubLimitQty < 1}"><strong>발급수량</strong>제한없음</p>
-                <p th:unless="${couponDetailInfo.custPubLimitQty < 1}"><strong>발급수량</strong>1인 최대 [[${#numbers.formatInteger(couponDetailInfo.custPubLimitQty,0,'COMMA')}]] 매</p>
-                <p><strong>유효기간</strong>[[${couponDetailInfo.availStdt}]] ~ [[${couponDetailInfo.availEddt}]]</p>
-             
-                <p><strong>브랜드</strong>
-                   <th:block th:each="BrandData, BrandStat : ${cpnDtlRefvalBrandList}">
-                		[[${BrandData.brandEnm}]],
-               		</th:block>
-                </p>
-                
-                <p><strong>카테고리</strong>
-                	<th:block th:each="CateData, CateStat : ${cpnDtlRefvalCateList}">
-                		[[${CateData.cateNm}]],
-                	</th:block>
-                </p>
-                
-                <p><strong>상품</strong>
-                	<th:block th:each="GoodsData, GoodsStat : ${cpnDtlRefvalApplyGoodsList}">
-                		[[${GoodsData.goodsNm}]],
-                	</th:block>
-                </p>
-                
-                <p><strong>제외상품</strong>
-                	<th:block th:each="ExceptData, ExceptStat : ${cpnDtlRefvalExceptGoodsList}">
-                		[[${ExceptData.goodsNm}]],
-               		</th:block>
-                </p>
-                
+<div class="modal-header">
+    <h5 class="modal-title" id="couponInfoLabel" th:text="${couponDetailInfo.cpnNm}"></h5>
+</div>
+<div class="modal-body">
+    <div class="pop_cont">
+        <dl>
+            <div>
+                <dt>사용조건</dt>
+                <dd  th:text="${couponDetailInfo.useCondition}"></dd>
+            </div>
+            <div>
+                <dt>발급수량</dt>
+                <dd th:if="${couponDetailInfo.issueCondition!=null && couponDetailInfo.issueCondition!=''}"th:text="${couponDetailInfo.issueCondition}"></dd>
+                <dd th:unless="${couponDetailInfo.issueCondition!=null && couponDetailInfo.issueCondition!=''}">제한없음</dd>
+            </div>
+            <div>
+                <dt>유효기간</dt>
+                <dd>
+                    <span th:text="${couponDetailInfo.availStdt}"></span>&nbsp;~&nbsp;<span th:text="${couponDetailInfo.availEddt}"></span>
+                </dd>
             </div>
-        </div>
-        <div class="modal-footer">
-            <p>본 쿠폰은 특정 상품&#47;행사에 적용되는 쿠폰이며,적용가능여부는 상품별 상이할 수 있습니다.</p>
-            <p>본 이벤트는 당사 사정에 따라 사전고지 없이 변경 또는 조기종료 될 수 있습니다.</p>
-        </div>
+            <div th:if="${couponDetailInfo.tgtCondition!=null}">
+                <dt>대상조건</dt>
+                <dd th:text="${couponDetailInfo.tgtCondition}"> 
+                </dd>
+            </div>
+        </dl>
     </div>
-</div>
+</div>

+ 29 - 15
src/main/webapp/WEB-INF/views/web/mypage/MypageCouponFormWeb.html

@@ -64,34 +64,36 @@
 											<li>
 												<!-- 쿠폰사용 기한 -->
 												<div
-													th:class="${CouponData.userYn == 'Y' ? 'coupon' : 'coupon disable'}">
+													th:class="${CouponData.expireYn == 'N' ? 'coupon' : 'coupon disable'}">
 													<div>
 														<p class="cp_name" th:text="${CouponData.cpnNm}"></p>
 														<p class="cp_cont">
-															<th:block th:if="${CouponData.dcWay == '할인율'}">
-																<span><em th:text="${CouponData.dcPval}"></em>%</span>
+															<th:block th:if="${CouponData.dcWay == '%'}">
+																<span><em th:text="${CouponData.dcVal}"></em>%</span>
 															</th:block>
-															<th:block th:unless="${CouponData.dcWay == '할인율'}">
+															<th:block th:unless="${CouponData.dcWay == '%'}">
 																<span><em
-																	th:text="${#numbers.formatInteger(CouponData.dcPval,0,'COMMA')}"></em>원</span>
+																	th:text="${#numbers.formatInteger(CouponData.dcVal,0,'COMMA')}"></em>원</span>
 															</th:block>
 
 														</p>
 														<p class="cp_condition">
-															[[${#numbers.formatInteger(CouponData.buyLimitAmt,0,'COMMA')}]]원
+															<!-- [[${#numbers.formatInteger(CouponData.buyLimitAmt,0,'COMMA')}]]원
 															이상 구매 시 최대
 															[[${#numbers.formatInteger(CouponData.maxDcAmt,0,'COMMA')}]]원
-															할인 <span><em class="tag primary_line"
-																th:text="${CouponData.cnt}+' 장 보유'"></em></span>
+															할인  -->
+															[[${CouponData.useCondition}]]
+															<span><em class="tag primary_line"
+																th:text="${CouponData.cpnCnt}+' 장 보유'"></em></span>
 														</p>
 													</div>
-													<th:block th:if="${CouponData.userYn == 'Y'}">
+													<th:block th:if="${CouponData.expireYn == 'Y'}">
 														<p class="cp_date">
 															<span th:text="${CouponData.availStdt}"></span>&nbsp;~&nbsp;<span
 																th:text="${CouponData.availEddt}"></span>
 														</p>
 													</th:block>
-													<th:block th:unless="${CouponData.userYn == 'Y'}">
+													<th:block th:unless="${CouponData.expireYn == 'Y'}">
 														<p class="cp_date">사용완료</p>
 													</th:block>
 
@@ -125,7 +127,14 @@
 		</div>
 		<!-- // CONT-BODY -->
 		<!-- 쿠폰 사용 내역 팝업 -->
-		<div class="modal fade dp_coupon_pop"  id="coupon_modal_02" tabindex="-1" role="dialog"	aria-labelledby="PopupBasicLabel" aria-hidden="true"></div>
+		<div class="modal fade couponInfo_pop" id="couponInfoPop" tabindex="-1" role="dialog" aria-labelledby="couponInfoLabel" aria-hidden="true">
+		<div class="modal-dialog" role="document">
+			<div class="modal-content">
+                <!-- 쿠폰사용안내 팝업 내용 -->      
+			</div>
+		</div>
+		<a href="#close-modal" rel="modal:close" id="couponInfoPop_close" class="close-modal">Close</a>
+		</div>
 
 		<!-- // container -->
 		<script th:inline="javascript">
@@ -134,14 +143,19 @@ let couponList = ([[${couponList}]]);
 
 // 사용안내 모달
 var useInfoCoupon = function (id) {
+	var data = {cpnId : id};
+	var jsonData = JSON.stringify(data);
+	
 	 $.ajax( {
-		type		: "GET",
-		url 		: '/mypage/coupon/detailPop?cpnId='+ id,
+		type		: "POST",
+		url 		: '/mypage/coupon/detailPop',
+		data		: jsonData,
+		contentType: 'application/json',
 		dataType 	: 'html',
 		success 	: function(result) {
 			if (result != null) {
-				$("#coupon_modal_02").html(result);
-				$("#coupon_modal_02").modal("show");
+				$("#couponInfoPop").html(result);
+				$("#couponInfoPop").modal("show");
 			}
 		}
 	});

+ 3 - 1
src/main/webapp/WEB-INF/views/web/mypage/MypageCreCancelDetailFormWeb.html

@@ -179,7 +179,7 @@
 											</div>
 											<div th:if="${oneData.pgGb == 'KCP' and oneData.payMeans == 'G014_30'}">
 												<dt class="sr-only">영수증 확인</dt>
-												<dd><button type="button" class="btn btn_default btn_sm" onclick="fnReceipt('cancel')"><span>취소 전표 보기</span></button></dd>
+												<dd><button type="button" class="btn btn_default btn_sm" th:attr="ordChgSq=${oneData.ordChgSq}, refundYn=${refundYn}" onclick="fnReceipt('cancel')"><span>취소 전표 보기</span></button></dd>
 											</div>
 										</dl>
 									</td>
@@ -205,6 +205,8 @@
 <script src="/ux/plugins/gaga/gaga.paging.js"></script>
 <script th:inline="javascript">
 	/*<![CDATA[*/
+	let oneData = [[${oneData}]];
+
 	$(document).ready(function() {
 		// 마이페이지 LNB 설정
 		fnSetMypageLnbList(2);

+ 1 - 1
src/main/webapp/WEB-INF/views/web/mypage/MypageCreReturnDetailFormWeb.html

@@ -239,7 +239,7 @@
 												<dd th:if="${oneData.pgGb == 'KAKAO'}">카카오페이</dd>
 												<dd th:if="${oneData.pgGb == 'PAYCO'}">PAYCO</dd>
 											</div>
-											<div th:if="${oneData.pgGb == 'KCP' and oneData.payStat == 'G685_60' and oneData.payMeans == 'G014_30'}">
+											<div th:if="${refundYn == 'Y' and oneData.pgGb == 'KCP' and oneData.payMeans == 'G014_30'}">
 												<dt class="sr-only">영수증 확인</dt>
 												<dd><button type="button" class="btn btn_default btn_sm" onclick="fnReceipt('cancel')"><span>취소 전표 보기</span></button></dd>
 											</div>

+ 14 - 3
src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html

@@ -238,7 +238,13 @@
   </div>       
   
 
-<div class="modal fade couponInfo_pop" id="couponInfoPop" tabindex="-1" role="dialog" aria-labelledby="couponInfoLabel" aria-hidden="true"></div>
+<div class="modal fade couponInfo_pop" id="couponInfoPop" tabindex="-1" role="dialog" aria-labelledby="couponInfoLabel" aria-hidden="true">
+		<div class="modal-dialog" role="document">
+			<div class="modal-content">
+                <!-- 쿠폰사용안내 팝업 내용 -->      
+			</div>
+		</div>
+</div>
 <form id="pollListForm" name="pollListForm" th:action="@{'/planning/event/poll/form'}" th:method="post">
 	<input type="hidden" name="planSq" th:value="${planInfo.planSq}"/>
 </form>
@@ -668,9 +674,14 @@ if(coupon.length>0){
 
 //사용안내 모달
 var useInfoCoupon = function (id) {
+	var data = {cpnId : id};
+	var jsonData = JSON.stringify(data);
+	
 	 $.ajax( {
-		type		: "GET",
-		url 		: '/planning/coupon/detail?cpnId='+ id,
+		type		: "POST",
+		url 		: '/planning/coupon/detailPop',
+		data		: jsonData,
+		contentType: 'application/json',
 		dataType 	: 'html',
 		success 	: function(result) {
 			if (result != null) {

+ 17 - 5
src/main/webapp/biz/mypage.js

@@ -269,11 +269,6 @@ var fnChangeDeliveryMemo = function(param) {
 
 // 신용카드 전표 및 현금영수증 버튼 클릭 이벤트
 var fnReceipt = function(param) {
-	// TODO
-	// 전표 링크 팝업 처리
-	// param == 'card'  신용카드 전표
-	// param == 'cash'  현금영수증 전표
-	// param == 'cancel' 취소전표
 	let receiptWin = kcpReceiptUrl;
 	let option = '';
 	if (param == 'card') {
@@ -294,6 +289,23 @@ var fnReceipt = function(param) {
 		
 		// 팝업 크기 설정
 		option = 'width=370, height=625';
+	} else if (param == 'cancel') {
+		if (param.refunYn == 'Y') {
+			// TODO
+			// 취소전표 확인 처리
+		} else {
+			mcxDialog.alert('아직 전표생성이 되지 않았습니다.');
+			return false;
+		}
+	} else if (param == 'delivery') {
+		// URL 설정
+		receiptWin += '?cmd=card_bill';
+		receiptWin += '&tno=' + oneData.pgTid;
+		receiptWin += '&order_no=' + oneData.ordNo;
+		receiptWin += '&trade_mony=' + oneData.addPayCost;
+		
+		// 팝업 크기 설정
+		option = 'width=455, height=815';
 	}
 
 	// 팝업 생성