Parcourir la source

상품상세 ep쿠폰 적용

eskim il y a 5 ans
Parent
commit
1b466681b3

+ 10 - 0
src/main/java/com/style24/front/biz/dao/TsfCouponDao.java

@@ -68,6 +68,16 @@ public interface TsfCouponDao {
 	 */
 	Collection<Coupon> getGoodsCouponList(Goods goods);
 	
+	/**
+	 * 상품 쿠폰 조회
+	 * 
+	 * @param goods
+	 * @return Collection<Coupon>
+	 * @author eskim
+	 * @since 2021.04.15
+	 */
+	Collection<Coupon> getGoodsEpCouponList(Goods goods);
+	
 	/**
 	 * 마이페이지 쿠폰 조회
 	 * 

+ 106 - 11
src/main/java/com/style24/front/biz/service/TsfCouponService.java

@@ -3,8 +3,6 @@ package com.style24.front.biz.service;
 import java.util.Collection;
 import java.util.List;
 
-import com.gagaframework.web.util.GagaDateUtil;
-import com.style24.persistence.domain.CustGrade;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -17,6 +15,7 @@ import com.style24.front.biz.dao.TsfCouponDao;
 import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.CustCoupon;
+import com.style24.persistence.domain.CustGrade;
 import com.style24.persistence.domain.Customer;
 import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.Login;
@@ -24,6 +23,8 @@ import com.style24.persistence.domain.Order;
 
 import lombok.extern.slf4j.Slf4j;
 
+import com.gagaframework.web.util.GagaDateUtil;
+
 /**
  * 쿠폰 Service
  *
@@ -327,6 +328,17 @@ public class TsfCouponService {
 	public Collection<Coupon> getGoodsCouponList(Goods goods) {
 		return couponDao.getGoodsCouponList(goods);
 	}
+	
+	/**
+	 * ep 쿠폰 조회
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2021.04.15
+	 */
+	public Collection<Coupon> getGoodsEpCouponList(Goods goods) {
+		return couponDao.getGoodsEpCouponList(goods);
+	}
 
 	/**
 	 * 상품 쿠폰 다운 처리
@@ -341,7 +353,7 @@ public class TsfCouponService {
 		String result = "SUCESS";
 		int downloadCnt = 1; 	// 쿠폰당 다운 받을수
 
-		log.info("상품쿠폰 발급전 정보 goods {}", goods);
+		//log.info("상품쿠폰 발급전 정보 goods {}", goods);
 
 		Collection<Coupon> goodsCouponList = couponDao.getGoodsCouponList(goods);
 		if (goodsCouponList == null || goodsCouponList.isEmpty()) {
@@ -350,12 +362,12 @@ public class TsfCouponService {
 		}
 
 		Coupon coupon = goodsCouponList.iterator().next();
-		log.info("상품쿠폰 쿠폰정보  coupon {}", coupon);
+		//log.info("상품쿠폰 쿠폰정보  coupon {}", coupon);
 
 		// 발급수 확인 -- 필요없나?
 		if (coupon.getTotPubLimitQty() > 0) {
 			if (coupon.getTotPubLimitQty() <= coupon.getCustCouponCnt()) {
-				log.info("상품쿠폰 다운  skip: 쿠폰발급수 : {}, 회원발급수 : {}", coupon.getTotPubLimitQty(), coupon.getCustCouponCnt());
+				//log.info("상품쿠폰 다운  skip: 쿠폰발급수 : {}, 회원발급수 : {}", coupon.getTotPubLimitQty(), coupon.getCustCouponCnt());
 				result = "ERROR_30";
 				return result;
 			}
@@ -365,7 +377,7 @@ public class TsfCouponService {
 
 		// 회원등급 USABLE_CUST_GRADE
 		if (coupon.getUsableCustGrade().indexOf(goods.getCustGrade()) < 0) {
-			log.info("상품쿠폰 다운  skip: 쿠폰등급 : {}, 회원등급 : {}", coupon.getUsableCustGrade(), goods.getCustGrade());
+			//log.info("상품쿠폰 다운  skip: 쿠폰등급 : {}, 회원등급 : {}", coupon.getUsableCustGrade(), goods.getCustGrade());
 			result = "ERROR_20";
 			return result;
 		}
@@ -374,7 +386,7 @@ public class TsfCouponService {
 		if ("Y".equals(coupon.getFirstOrdYn())) {
 			int firstOrdcnt = orderService.getCustFirstOrderCount(coupon);
 			if (firstOrdcnt > 0) {
-				log.info("상품쿠폰 다운  skip: 쿠폰첫구매정보 : {}, {} ~ {} ", coupon.getFirstOrdYn(), coupon.getBuyStdt(), coupon.getBuyEddt());
+				//log.info("상품쿠폰 다운  skip: 쿠폰첫구매정보 : {}, {} ~ {} ", coupon.getFirstOrdYn(), coupon.getBuyStdt(), coupon.getBuyEddt());
 				result = "ERROR_20";
 				return result;
 			}
@@ -384,14 +396,14 @@ public class TsfCouponService {
 		if ("Y".equals(coupon.getNewCustYn())) {
 			Customer customer = customerService.getCustomerFindByCustNo(goods.getCustNo());
 			if (customer == null || StringUtils.isEmpty(customer.getJoinDt())) {
-				log.info("상품쿠폰 다운  skip: 쿠폰 신규회원정보 : {} 회원정보 없음", coupon.getCustNo());
+				//log.info("상품쿠폰 다운  skip: 쿠폰 신규회원정보 : {} 회원정보 없음", coupon.getCustNo());
 				result = "ERROR_20";
 				return result;
 			}
-			log.info("고객정보 customer {}", customer);
+			//log.info("고객정보 customer {}", customer);
 			if (Integer.parseInt(customer.getJoinDt()) < Integer.parseInt(coupon.getCustJoinStdt()) ||
 				Integer.parseInt(customer.getJoinDt()) > Integer.parseInt(coupon.getCustJoinEddt())) {
-				log.info("상품쿠폰 다운  skip: 쿠폰 신규회원정보 : {}, {} ~ {} ", customer.getJoinDt(), coupon.getCustJoinStdt(), coupon.getCustJoinEddt());
+				//log.info("상품쿠폰 다운  skip: 쿠폰 신규회원정보 : {}, {} ~ {} ", customer.getJoinDt(), coupon.getCustJoinStdt(), coupon.getCustJoinEddt());
 				result = "ERROR_20";
 				return result;
 			}
@@ -413,7 +425,7 @@ public class TsfCouponService {
 				custCoupon.setRegNo(TsfSession.getInfo().getCustNo());
 				custCoupon.setUpdNo(TsfSession.getInfo().getCustNo());
 
-				log.info("상품쿠폰 고객 다운로드 custCoupon {}", custCoupon);
+				//log.info("상품쿠폰 고객 다운로드 custCoupon {}", custCoupon);
 				coreCouponDao.saveCouponCustPub(custCoupon);
 
 				count++;
@@ -606,5 +618,88 @@ public class TsfCouponService {
 		return couponDao.getPlanCouponDetailInfo(coupon);
 	}
 	
+	/**
+	 * EP 쿠폰 다운 처리
+	 *
+	 * @param coupon
+	 * @return int
+	 * @author eskim
+	 * @since 2021.03.12
+	 */
+	@Transactional("shopTxnManager")
+	public String createEpCoupon(Goods goods) {
+		String result = "SUCESS";
+		int downloadCnt = 1; 	// 쿠폰당 다운 받을수
+
+		Collection<Coupon> goodsCouponList = couponDao.getGoodsEpCouponList(goods);
+		if (goodsCouponList == null || goodsCouponList.isEmpty()) {
+			result = "ERROR_10";
+			return result;
+		}
+
+		Coupon coupon = goodsCouponList.iterator().next();
+
+		// 발급수 확인 -- 필요없나?
+		if (coupon.getTotPubLimitQty() > 0) {
+			if (coupon.getTotPubLimitQty() <= coupon.getCustCouponCnt()) {
+				result = "ERROR_30";
+				return result;
+			}
+		}
+
+		// 회원정보 확인 - 발급등급,첫구매, 신규회원, 제휴링크
+
+		// 회원등급 USABLE_CUST_GRADE
+		if (coupon.getUsableCustGrade().indexOf(goods.getCustGrade()) < 0) {
+			result = "ERROR_20";
+			return result;
+		}
+
+		// 첫구매여부 (Y:구매이력이없음 | N:구매이력있음) - 구매기간일자 해당기간에 구매이력이 없으면 다운로드 가능
+		if ("Y".equals(coupon.getFirstOrdYn())) {
+			int firstOrdcnt = orderService.getCustFirstOrderCount(coupon);
+			if (firstOrdcnt > 0) {
+				result = "ERROR_20";
+				return result;
+			}
+		}
+
+		// 신규회원 NEW_CUST_YN
+		if ("Y".equals(coupon.getNewCustYn())) {
+			Customer customer = customerService.getCustomerFindByCustNo(goods.getCustNo());
+			if (customer == null || StringUtils.isEmpty(customer.getJoinDt())) {
+				result = "ERROR_20";
+				return result;
+			}
+			if (Integer.parseInt(customer.getJoinDt()) < Integer.parseInt(coupon.getCustJoinStdt()) ||
+				Integer.parseInt(customer.getJoinDt()) > Integer.parseInt(coupon.getCustJoinEddt())) {
+				result = "ERROR_20";
+				return result;
+			}
+		}
+
+		int count = 0;
+		for (Coupon tmpCoupon : goodsCouponList) {
+
+			for (int i = 0; i < downloadCnt; i++) {
+				CustCoupon custCoupon = new CustCoupon();
+				custCoupon.setCustNo(TsfSession.getInfo().getCustNo());
+				custCoupon.setCpnId(tmpCoupon.getCpnId());
+				custCoupon.setAvailStdt(tmpCoupon.getAvailStdt());
+				custCoupon.setAvailEddt(tmpCoupon.getAvailEddt());
+				custCoupon.setPubReason(TscConstants.PubReason.DOWNLOAD.value());
+				custCoupon.setEndAlimSendYn("N");		// 알림 발송 여부(발송되면 Y)
+				custCoupon.setRegNo(TsfSession.getInfo().getCustNo());
+				custCoupon.setUpdNo(TsfSession.getInfo().getCustNo());
+
+				coreCouponDao.saveCouponCustPub(custCoupon);
+
+				count++;
+			}
+		}
+		result = Integer.toString(count);	// 다운받은 쿠폰수
+
+		return result;
+	}
 
 }

+ 14 - 0
src/main/java/com/style24/front/biz/service/TsfGoodsService.java

@@ -779,5 +779,19 @@ public class TsfGoodsService {
 
 		return goodsList;
 	}
+	
+	/**
+	 * ep쿠폰 다운 처리
+	 *
+	 * @param coupon
+	 * @return int
+	 * @author eskim
+	 * @since 2021.04.15
+	 */
+	@Transactional("shopTxnManager")
+	public String createEpCoupon(Goods goods) {
+		return couponService.createEpCoupon(goods);
+	}
+
 
 }

+ 64 - 6
src/main/java/com/style24/front/biz/web/TsfGoodsController.java

@@ -276,17 +276,12 @@ public class TsfGoodsController extends TsfBaseController {
 		cardPromotion.setRownum(1); // 혜택유형별로 1건씩
 		mav.addObject("cardInfoList", goodsService.getCardPromotionList(cardPromotion));
 
-		// 쇼핑 혜택
-		// 다다익선
-
-		// 사은품
-
 		// 오늘본 상품 쿠키 담기
 		// SSL Server
 		boolean isSslServer = Boolean.parseBoolean(hasSsl);
 		//log.info("isSslServer: [{}]", isSslServer);
 		setTodayGoodsCd(paramsGoods);
-
+		
 		mav.addObject("params", paramsGoods);
 
 		if (TscConstants.GoodsType.DEAL.value().equals(goods.getGoodsType())) {
@@ -1279,4 +1274,67 @@ public class TsfGoodsController extends TsfBaseController {
 		wishList = wishListService.getWishListGoodsList(wish);
 		return wishList;
 	}
+	
+	/**
+	 * ep 쿠폰 목록
+	 *
+	 * @return
+	 * @throws Exception
+	 * @author eskim
+	 * @since 2021. 4. 15
+	 */
+	@GetMapping("/epCoupon/list")
+	@ResponseBody
+	public Collection<Coupon> getEpGouponList(Goods paramsGoods) {
+		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
+		setGoods(paramsGoods);
+		return couponService.getGoodsEpCouponList(paramsGoods);
+	}
+
+	/**
+	 * ep쿠폰다운로드
+	 *
+	 * @param params
+	 * @return
+	 * @throws Exception
+	 * @author eskim
+	 * @since 2021. 4. 15.
+	 */
+	@PostMapping(value = "/ep/coupon/download")
+	@ResponseBody
+	public GagaMap createEpGoodsCoupon(@RequestBody Goods goods) throws Exception {
+
+		GagaMap result = new GagaMap();
+
+		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
+		setGoods(goods);
+		log.info("createGoodsCoupon  goods {}", goods);
+
+		// 쿠폰발급
+		// ERROR_10: 발급가능 쿠폰없음, 20: 발급완료 쿠폰, 30: 발급받은 쿠폰
+		//죄송합니다. 쿠폰이 모두 소진되었습니다
+		//죄송합니다. 해당 쿠폰은 다운로드가 불가합니다.
+		String couponResult = goodsService.createEpCoupon(goods);
+
+		result.set("status", GagaResponseStatus.SUCCESS.getCode());
+
+		if ("ERROR_10".equals(couponResult)) {
+			result.set("message", "발급가능 쿠폰이 없습니다.");
+		} else if ("ERROR_20".equals(couponResult)) {
+			result.set("message", "죄송합니다. 해당 쿠폰은 다운로드가 불가합니다.");
+		} else if ("ERROR_30".equals(couponResult)) {
+			result.set("message", "죄송합니다. 쿠폰이 모두 소진되었습니다.");
+		} else {
+			if (goods.getArrCpnId() != null && goods.getArrCpnId().length > 0) {
+				result.set("message", couponResult + "개 쿠폰이 발급되었습니다.");
+			} else {
+				result.set("message", "쿠폰이 발급되었습니다.");
+			}
+
+		}
+		result.set("status", "200");
+		result.set("params", goods);
+		return result;
+	}
+
 }

+ 251 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsfCoupon.xml

@@ -429,6 +429,257 @@
 		</if> 
 	</select>
 	
+	<!--EP 폰 조회-->
+	<select id="getGoodsEpCouponList" parameterType="Goods" resultType="Coupon">
+		/* TsfCoupon.getGoodsEpCouponList */
+		SELECT A.DC_AMT
+		     , A.DC_VAL
+		     , A.DC_WAY
+		     , A.CPN_ID
+		     , A.CPN_NM
+		     , A.CUST_PUB_LIMIT_QTY
+		     , A.TOT_PUB_LIMIT_QTY
+		     , A.BUY_LIMIT_AMT
+		     , A.MAX_DC_AMT
+		     , A.CPN_TYPE
+		     , A.AVAIL_STDT
+		     , A.AVAIL_EDDT
+		     , A.USABLE_CUST_GRADE
+		     , A.NEW_CUST_YN
+		     , A.CUST_JOIN_STDT 
+		     , A.CUST_JOIN_EDDT
+		     , A.FIRST_ORD_YN
+		     , A.BUY_STDT
+		     , A.BUY_EDDT
+		     , A.CURR_PRICE
+		     , DATE_FORMAT(A.AVAIL_EDDT, '%Y-%m-%d') AS AVAIL_EDDT
+		     , IFNULL((SELECT COUNT(1) FROM TB_CUST_COUPON WHERE CPN_ID = A.CPN_ID AND CUST_NO = #{custNo}),0) AS CUST_COUPON_CNT
+		     , (SELECT COUNT(1) FROM TB_CUST_COUPON WHERE CPN_ID = A.CPN_ID) AS TOT_COUPON_CNT
+		     , RNUM
+		FROM (
+		SELECT   CPN_ID
+		       , CPN_NM
+		       , DC_AMT
+		       , DC_VAL
+		       , DC_WAY
+		       , CUST_PUB_LIMIT_QTY
+		       , TOT_PUB_LIMIT_QTY
+		       , BUY_LIMIT_AMT
+		       , MAX_DC_AMT
+		       , CPN_TYPE
+		       , AVAIL_STDT
+		       , AVAIL_EDDT
+		       , USABLE_CUST_GRADE
+		       , NEW_CUST_YN
+		       , CUST_JOIN_STDT 
+		       , CUST_JOIN_EDDT
+		       , FIRST_ORD_YN
+		       , BUY_STDT
+		       , BUY_EDDT
+		       , CURR_PRICE
+		       , RANK() OVER(ORDER BY DC_AMT DESC)  AS RNUM   -- 할인금액순
+		FROM   (
+		        SELECT CP.CPN_ID                                              -- 쿠폰ID
+		             , CP.CPN_NM                                              -- 쿠폰명
+		             , CP.DC_WAY                                              -- 할인방식
+		             , CP.DC_VAL                                              -- 할인값
+		             , CP.MAX_DC_AMT                                          -- 최대할인금액
+		             , CP.CURR_PRICE                                          -- 즉시쿠폰적용판매가
+		             , CP.CUST_PUB_LIMIT_QTY                                  -- 1인당 발급제한수량
+		             , CP.TOT_PUB_LIMIT_QTY                                   -- 총발행제한수량(0은 무제한)
+		             , CP.BUY_LIMIT_AMT                                       -- 구매제한금액
+		             , CP.CPN_TYPE                                            -- 쿠폰타입
+		             , CP.AVAIL_STDT                                          -- 유효시작일시
+		             , CP.AVAIL_EDDT                                          -- 유효종료일시
+		             , CP.USABLE_CUST_GRADE                                   -- 고객등급(,구분)
+		             , CP.NEW_CUST_YN                                         -- 신규회원여부
+		             , CP.CUST_JOIN_STDT                                      -- 회원가입시작일시(신규회원여부) 
+		             , CP.CUST_JOIN_EDDT                                      -- 회원가입종료일시(신규회원여부)
+		             , CP.FIRST_ORD_YN                                        -- 첫구매여부
+		             , CP.BUY_STDT                                            -- 첫구매시작일시
+		             , CP.BUY_EDDT                                            -- 첫구매종료일시
+		             <![CDATA[
+		             , (CASE WHEN CP.DC_WAY = 'G240_10' THEN
+		                    (CASE WHEN IFNULL(CP.MAX_DC_AMT, 0) >0 AND CP.MAX_DC_AMT < CP.DC_VAL THEN CP.MAX_DC_AMT ELSE CP.DC_VAL END)
+		                ELSE
+		                     (CASE WHEN IFNULL(CP.MAX_DC_AMT, 0) >0 AND CP.MAX_DC_AMT < FLOOR((CP.CURR_PRICE * DC_VAL / 100) / #{pointUnit}) * #{pointUnit} THEN CP.MAX_DC_AMT ELSE FLOOR((CP.CURR_PRICE * CP.DC_VAL / 100) / #{pointUnit}) * #{pointUnit} END)
+		                END) AS DC_AMT
+		              ]]>
+		        FROM   (
+		                SELECT CP.CPN_ID
+		                     , CP.CPN_NM
+		                     , CP.DC_WAY
+		                     , (CASE WHEN 'P' = #{frontGb} THEN CP.DC_PVAL
+		                             WHEN 'M' = #{frontGb} THEN CP.DC_MVAL
+		                             ELSE CP.DC_AVAL END) AS DC_VAL
+		                     , CP.MAX_DC_AMT
+		                     , CP.BUY_LIMIT_AMT
+		                     , CP.CUST_PUB_LIMIT_QTY
+		                     , CP.TOT_PUB_LIMIT_QTY
+		                     , CP.CPN_TYPE
+		                     , CP.NEW_CUST_YN
+		                     , DATE_FORMAT(CP.CUST_JOIN_STDT, '%Y%m%d%H%i%S') AS CUST_JOIN_STDT
+		                     , DATE_FORMAT(CP.CUST_JOIN_EDDT, '%Y%m%d%H%i%S') AS CUST_JOIN_EDDT
+		                     , CP.FIRST_ORD_YN
+		                     , DATE_FORMAT(CP.BUY_STDT, '%Y%m%d%H%i%S') AS BUY_STDT
+		                     , DATE_FORMAT(CP.BUY_EDDT, '%Y%m%d%H%i%S') AS BUY_EDDT
+		                     , IF (CP.PD_GB = 'D', NOW(), CP.AVAIL_STDT) AS AVAIL_STDT
+		                     , IF (CP.PD_GB = 'D', CONCAT(CURRENT_DATE + INTERVAL Cp.AVAIL_DAYS DAY, ' 23:59:59'), CP.AVAIL_EDDT) AS AVAIL_EDDT
+		                     , (SELECT GROUP_CONCAT(USABLE_CUST_GRADE) FROM TB_COUPON_CUST_GRADE WHERE CPN_ID = CP.CPN_ID) AS USABLE_CUST_GRADE
+		                     , G.GOODS_CD
+		                     , FN_GET_BENEFIT_PRICE(#{frontGb},G.GOODS_CD, G.CURR_PRICE,#{custGb}) AS CURR_PRICE
+		                FROM   TB_GOODS G
+		                     , TB_COUPON CP
+		                WHERE 1 = 1
+		                AND CP.AF_LINK_CD = #{afLinkCd}	-- 제휴코드 
+		                <choose>
+		                    <when test="arrGoodsCd != null and arrGoodsCd != ''">
+		                AND G.GOODS_CD IN
+		                    <foreach collection="arrGoodsCd" item="item" index="index"  open="(" close=")" separator=",">
+		                    UPPER(#{item})
+		                    </foreach>
+		                    </when>
+		                    <otherwise>
+		                AND G.GOODS_CD = #{goodsCd}
+		                    </otherwise>
+		                </choose> 
+		                <if test="cpnId != null and cpnId != ''">
+		                AND    CP.CPN_ID = #{cpnId}
+		                </if>
+		                <if test="arrCpnId != null and arrCpnId != ''">
+		                AND    CP.CPN_ID IN
+		                <foreach collection="arrCpnId" item="item" index="index"  open="(" close=")" separator=",">
+		                UPPER(#{item})
+		                </foreach>
+		                </if>
+		                AND    CP.SITE_CD = #{siteCd}
+		                AND    CP.CPN_STAT = 'G232_11'   -- 쿠폰인 진행중인 쿠폰만
+		                <![CDATA[
+		                AND    NOW() <= IF (CP.PD_GB = 'D', CONCAT(CURRENT_DATE + INTERVAL CP.AVAIL_DAYS DAY, ' 23:59:59'), CP.AVAIL_EDDT)
+		                ]]>
+		                AND    NOW() BETWEEN CP.DOWN_STDT AND CP.DOWN_EDDT
+		                AND    CP.CPN_TYPE IN ('G230_11','G230_20','G230_30')  --  상품쿠폰, 주문서쿠폰, 배송비쿠폰
+		                AND    CP.DC_CD_GB = 'G233_00'                         -- 일반유형(할인쿠폰구분)
+		                AND    (CASE WHEN 'P' = #{frontGb} THEN CP.DC_PVAL
+		                             WHEN 'M' = #{frontGb} THEN CP.DC_MVAL
+		                             ELSE CP.DC_AVAL END) > 0                  -- PC, MOBILE,APP 별로 0 보다 큰 쿠폰
+		                AND    (SELECT COUNT(1)
+		                        FROM TB_COUPON_CUST_GBN
+		                        WHERE CPN_ID = CP.CPN_ID
+		                        AND USABLE_CUST_GB IN (#{custGb})              -- 사용가능고객구분
+		                       ) >= 1
+		                AND    IF (CP.TOT_PUB_LIMIT_QTY = 0, 9999999999,CP.TOT_PUB_LIMIT_QTY) > (SELECT COUNT(1) FROM TB_CUST_COUPON WHERE CPN_ID = CP.CPN_ID) -- 총발행제한수
+		                AND   (
+		                        (CP.APPLY_SCOPE = 'A' ) 
+		                        OR  /* 적용대상:상품*/
+		                        (CP.APPLY_SCOPE = 'I' AND (SELECT COUNT(1) FROM TB_COUPON_REFVAL
+		                                                   WHERE CPN_ID = CP.CPN_ID
+		                                                   AND CPN_TARGET = 'G260_10'
+		                                                   AND DEL_YN = 'N'
+		                                                   AND REF_VAL = G.GOODS_CD
+		                                                   ) > 0
+		                        ) 
+		                        OR /* 적용대상:카테고리*/
+		                        (CP.APPLY_SCOPE = 'I' AND (SELECT COUNT(1) FROM TB_COUPON_REFVAL
+		                                                   WHERE CPN_ID = CP.CPN_ID
+		                                                   AND CPN_TARGET = 'G260_11' 
+		                                                   AND DEL_YN = 'N'
+		                                                   AND IFNULL(REF_FORMAL_GB,G.FORMAL_GB) = G.FORMAL_GB
+		                                                   AND IFNULL(REF_BRAND_CD,G.BRAND_CD) = G.BRAND_CD
+		                                                   AND REF_VAL IN (SELECT DISTINCT X.CATE_NO 
+		                                                                   FROM 
+		                                                                        (SELECT LEAF_CATE_NO 
+		                                                                              , CATE_LVL 
+		                                                                              , CATE_NO
+		                                                                         FROM (
+		                                                                               SELECT LEAF_CATE_NO ,
+		                                                                                      CASE WHEN X = 1 THEN 'CATE1_NO'  -- 컬럼과 매핑(컬럼명)
+		                                                                                           WHEN X = 2 THEN 'CATE2_NO'
+		                                                                                           WHEN X = 3 THEN 'CATE3_NO'
+		                                                                                           WHEN X = 4 THEN 'CATE4_NO'
+		                                                                                           ELSE  'CATE5_NO' 
+		                                                                                      END CATE_LVL,
+		                                                                                      CASE WHEN X = 1 THEN CATE1_NO  -- 컬럼과 매핑(컬럼 데이터)
+		                                                                                           WHEN X = 2 THEN CATE2_NO
+		                                                                                           WHEN X = 3 THEN CATE3_NO
+		                                                                                           WHEN X = 4 THEN CATE4_NO
+		                                                                                           ELSE  CATE5_NO 
+		                                                                                      END CATE_NO
+		                                                                               FROM (
+		                                                                                      ( SELECT LEAF_CATE_NO
+		                                                                                             , CATE1_NO
+		                                                                                             , CATE2_NO
+		                                                                                             , CATE3_NO
+		                                                                                             , CATE4_NO
+		                                                                                             , CATE5_NO
+		                                                                                        FROM  TB_CATE_4SRCH
+		                                                                                        WHERE SITE_CD = 'G000_10'
+		                                                                                        AND CATE_TYPE = 'G031_10') A, -- 상품타입
+		                                                                                      (SELECT 1 AS X                  -- UNPIVOT 컬럼 수 만큼 선언
+		                                                                                       UNION ALL SELECT 2 AS X
+		                                                                                       UNION ALL SELECT 3 AS X
+		                                                                                       UNION ALL SELECT 4 AS X
+		                                                                                       UNION ALL SELECT 5 AS X
+		                                                                                     ) B
+		                                                                                    )  
+		                                                                               ORDER BY LEAF_CATE_NO, CATE_LVL
+		                                                                              ) K
+		                                                                              WHERE CATE_NO IS NOT NULL
+		                                                                        ) X, 
+		                                                                        (
+		                                                                         SELECT A.CATE_NO, A.GOODS_CD
+		                                                                         FROM TB_CATE_GOODS A
+		                                                                         WHERE GOODS_CD = G.GOODS_CD
+		                                                                        ) Y 
+		                                                                        WHERE X.LEAF_CATE_NO = Y.CATE_NO
+		                                                                  )
+		                                                  ) >0
+		                        ) 
+		                        OR /* 적용대상:브랜드*/
+		                        (CP.APPLY_SCOPE = 'I' AND (SELECT COUNT(1) FROM TB_COUPON_REFVAL
+		                                                   WHERE CPN_ID = CP.CPN_ID
+		                                                   AND CPN_TARGET = 'G260_12' 
+		                                                   AND DEL_YN = 'N'
+		                                                   AND REF_VAL = G.BRAND_CD
+		                                                   AND IFNULL(REF_FORMAL_GB,G.FORMAL_GB) = G.FORMAL_GB
+		                                                  ) >0
+		                        ) 
+		                        OR /* 적용대상:공급업체*/
+		                        (CP.APPLY_SCOPE = 'I' AND (SELECT COUNT(1) FROM TB_COUPON_REFVAL
+		                                                   WHERE CPN_ID = CP.CPN_ID
+		                                                   AND CPN_TARGET = 'G260_13' 
+		                                                   AND DEL_YN = 'N'
+		                                                   AND REF_VAL = G.SUPPLY_COMP_CD
+		                                                  ) >0
+		                        )
+		                      )
+		                AND NOT EXISTS (
+		                                SELECT 1
+		                                FROM   TB_COUPON_REFVAL SCPR
+		                                WHERE  SCPR.CPN_ID = CP.CPN_ID
+		                                AND    SCPR.REF_VAL = G.GOODS_CD
+		                                AND    SCPR.DEL_YN = 'N'      -- 삭제안된넘
+		                                AND    SCPR.CPN_TARGET = '40' -- 제외상품
+		                               )
+		                AND NOT EXISTS (
+		                                 SELECT 1
+		                                FROM TB_COUPON_BAN_GOODS
+		                                WHERE GOODS_CD = G.GOODS_CD
+		                                AND DEL_YN = 'N'
+		                               )
+		               ) CP
+		               WHERE 1 = 1
+		               <![CDATA[
+		               AND CP.BUY_LIMIT_AMT <= CP.CURR_PRICE  -- 최소주문금액
+		               ]]>
+		       ) Y
+		) A
+		WHERE 1 = 1
+		<if test="maxRownum != null and maxRownum > 0">
+		LIMIT #{maxRownum}
+		</if> 
+	</select>
+	
 	<select id="getMypageCouponList" resultType="Coupon" parameterType="Coupon">
 		/* TsfCoupon.getMypageCouponList */
 		SELECT CC.CPN_ID                    /*쿠폰ID*/

+ 3 - 82
src/main/webapp/WEB-INF/views/mob/goods/GoodsDetailFormMob.html

@@ -860,6 +860,7 @@
 		
 </main>
 
+<script th:src="@{'/biz/goods.js?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" src="/biz/goods.js"></script>
 <script th:inline="javascript">
 /*<![CDATA[*/
 	
@@ -868,22 +869,6 @@
 	//var fnGoodsTmtbSearch = function(params) {
 	//	gagajf.ajaxSubmit("/goods/detail/tmtb/frame", "html", "goodsTmtbArea", params);
 	//}
-	
-	// 함께본 상품
-	var fnGoodsTogetherSearch = function(params) {
-		gagajf.ajaxSubmit("/goods/detail/together/frame", "html", "goodsTogetherbArea", params);
-	}
-	
-	// 추천 상품
-	var fnGoodsRecommendSearch = function(params) {
-		gagajf.ajaxSubmit("/goods/detail/recommend/frame", "html", "goodsRecommendbArea", params);
-	}
-	
-	// 비슷한 상품
-	var fnGoodsLikeSearch = function(params) {
-		gagajf.ajaxSubmit("/goods/detail/like/frame", "html", "goodsLikebArea", params);
-	}
-	
 
 	// 품절처리
 	var fnOptionSoldout = function(){
@@ -902,67 +887,6 @@
 		}
 	}
 	
-	//사이즈 클릭시 - 자사 단품
-	var fnViewStock = function(obj, goodsCd, optCd, optCd1, optCd2,  minOrdQty, maxOrdQty) {
-		let $obj = $(obj);
-		let selfGoodsYn = $("#cartForm  input[name=selfGoodsYn]").val();
-		let $target = null;
-		if (selfGoodsYn == "Y"){
-			$target = $obj;
-			$target.prop("checked",true);
-			$(".selectOptCd1").html(optCd2);
-		}else{
-			$target = $obj.find('input[name="opt2"]');
-		}
-		let addPrice  = $target.attr("addPrice");
-		$(".selectOptCd1addPrice").html('');
-		if (Number(addPrice) > 0) $(".selectOptCd1addPrice").html("(+" + addPrice.addComma() + ")");
-		
-		$("#cartForm  input[name=optCd]").val(optCd);
-		$("#cartForm  input[name=optCd1]").val(optCd1);
-		$("#cartForm  input[name=optCd2]").val(optCd2);
-		$("#cartForm  input[name=addPrice]").val(addPrice);
-		$("#cartForm  input[name=ordQty]").val("");
-		
-		let maxCnt = maxOrdQty;
-		let params = new Object();
-		params.goodsCd = goodsCd;
-		params.optCd = optCd;
-		params.optCd1 = optCd1;
-		params.optCd2 = optCd2;
-		params.selfGoodsYn = selfGoodsYn;
-
-		$.get("/goods/detail/ajaxGoodsStockQty", $.param(params), function(result) {
-			let itemCnt = eval(result); //해당 아이템에 선택되어진 사이즈의 수량
-
-			if (maxCnt > itemCnt) {
-				maxCnt = itemCnt;
-			}
-
-			if (minOrdQty > itemCnt) {
-				$target.prop("disabled", true);
-			}else{
-				$("#cartForm  input[name=ordQty]").val(minOrdQty);
-				$("#cartForm  input[name=maxOrdQty]").val(maxCnt);
-				$("#cartForm  input[name=minOrdQty]").val(minOrdQty);
-				$("#cartForm  input[name=cea]").val(minOrdQty);
-				$("#cartForm  input[name=cea]").attr("readonly",false);
-				$("#cartForm  input[name=stock]").val(itemCnt);
-
-				fnSetTotalPrice();
-				
-				
-				$("#cartForm  input[name=opt]").each(function(){
-					if ($(this).attr('id') == optCd){
-				//		$(this).prop('checked', true);
-					}
-				});
-			}
-
-		}, "text");
-		
-	}
-	
 	//사이즈 클릭시 - 입점단품
 	var fnViewStockSelfNo = function(obj) {
 		
@@ -1941,11 +1865,8 @@
 		$("meta[property='eg:isNew']").attr('content',([[${goodsInfo.formalGb}]] == 'G009_10')? 'True' :'False');
 		$("meta[property='eg:etc1']").attr('content', [[${goodsInfo.selfGoodsYn}]]);
 		
-		
-		$('.btn_copy').bind('click', function() {
-			copyToClipboard();
-		});
-		
+		// ep 쿠폰확인
+		fnEpCouponDown([[${params.afLinkCd}]], [[${params.goodsCd}]], 1);
 	});
 	
 /*]]>*/

+ 19 - 133
src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html

@@ -726,55 +726,10 @@
 	<!-- //상품썸네일 크게보기 팝업 -->
 </div>
 
-<!-- EP 제휴쿠폰 팝업 -->
-	<div class="modal fade pd_pop epcoupon_pop" id="epCouponPop" tabindex="-1" role="dialog" aria-labelledby="epCouponLabel" aria-hidden="true">
-		<div class="modal-dialog" role="document">
-		  <div class="modal-content">
-			<div class="modal-header">
-				<h5 class="modal-title" id="epCouponLabel">네이버 전용 할인쿠폰</h5>
-			</div>
-			<div class="modal-body">
-				<div class="pop_cont">
-					<div class="ep_coupon">
-						<div>
-							<p class="cp_title">
-								COUPON
-							</p>
-							<p class="cp_cont">
-								<!-- 할인금액 일때 -->
-								<span class="unit_won">
-									<em class="number">3,000</em><em class="unit">원</em>
-								</span>
-								<!-- //할인금액 일때 -->
-								<!-- 할인율 일때 -->
-								<span class="unit_percent">
-									최대<em class="number">30</em><em class="unit">%</em>
-								</span>
-								<!-- //할인율 일때 -->
-							</p>
-						</div>
-					</div>
-					<div class="info_txt">
-						<ul>
-							<li>일부 상품은 쿠폰 사용이 제한될 수 있습니다.</li>
-							<li>할인대상 및 금액은 상시 변경됩니다.</li>
-							<li>제휴 사이트와 정보연동 시간차이로 판매정보가 불일치할 수 있습니다.</li>
-							<li>본 쿠폰은 제휴 사이트를 통해 들어온 고객님만 발급 및 사용이 가능합니다.</li>
-						</ul>						
-					</div>
-				</div>
-			</div>
-			<div class="modal-footer">
-				<button type="button" id="" class="btn btn_primary btn_all_cpdown"><span>쿠폰 받기</span></button>
-			</div>
-		  </div>
-		</div>
-	</div>	
-	<!-- //EP 제휴쿠폰 팝업 -->
-
 
 	<!-- 바로구매 장바구니 등록 정보 저장을 위한 form -->
 	<form id="directOrderForm" method="POST" action="/order/noMember"></form>
+<script th:src="@{'/biz/goods.js?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" src="/biz/goods.js"></script>
 <script th:inline="javascript">
 /*<![CDATA[*/
 	
@@ -784,76 +739,6 @@
 		gagajf.ajaxSubmit("/goods/detail/tmtb/frame", "html", "goodsTmtbArea", params);
 	}
 	
-	// 함께본 상품
-	var fnGoodsTogetherSearch = function(params) {
-		gagajf.ajaxSubmit("/goods/detail/together/frame", "html", "goodsTogetherbArea", params);
-	}
-	
-	// 추천 상품
-	var fnGoodsRecommendSearch = function(params) {
-		gagajf.ajaxSubmit("/goods/detail/recommend/frame", "html", "goodsRecommendbArea", params);
-	}
-	
-	// 비슷한 상품
-	var fnGoodsLikeSearch = function(params) {
-		gagajf.ajaxSubmit("/goods/detail/like/frame", "html", "goodsLikebArea", params);
-	}
-	
-	//사이즈 클릭시 - 단품
-	var fnViewStock = function(obj, goodsCd, optCd, optCd1, optCd2,  minOrdQty, maxOrdQty) {
-		let $obj = $(obj);
-		let selfGoodsYn = $("#cartForm  input[name=selfGoodsYn]").val();
-		let $target = null;
-		if (selfGoodsYn == "Y"){
-			//$target = $obj.parent().parent().children('input[name="opt"]');
-			$target = $obj;
-			$target.prop("checked",true);
-			$("#selectOptCd1").html(optCd2);
-		}else{
-			$target = $obj.find('input[name="opt2"]');
-		}
-		let addPrice  = $target.attr("addPrice");
-		// let optCd  = $target.attr("optCd");
-		$("#selectOptCd1addPrice").html('');
-		if (Number(addPrice) > 0) $("#selectOptCd1addPrice").html("(+" + addPrice.addComma() + ")");
-		
-		$("#cartForm  input[name=optCd]").val(optCd);
-		$("#cartForm  input[name=optCd1]").val(optCd1);
-		$("#cartForm  input[name=optCd2]").val(optCd2);
-		$("#cartForm  input[name=addPrice]").val(addPrice);
-		$("#cartForm  input[name=ordQty]").val("");
-		
-		let maxCnt = maxOrdQty;
-		let params = new Object();
-		params.goodsCd = goodsCd;
-		params.optCd = optCd;
-		params.optCd1 = optCd1;
-		params.optCd2 = optCd2;
-		params.selfGoodsYn = selfGoodsYn;
-
-		$.get("/goods/detail/ajaxGoodsStockQty", $.param(params), function(result) {
-			let itemCnt = eval(result); //해당 아이템에 선택되어진 사이즈의 수량
-
-			if (maxCnt > itemCnt) {
-				maxCnt = itemCnt;
-			}
-
-			if (minOrdQty > itemCnt) {
-				$target.prop("disabled", true);
-			}else{
-				$("#cartForm  input[name=ordQty]").val(minOrdQty);
-				$("#cartForm  input[name=maxOrdQty]").val(maxCnt);
-				$("#cartForm  input[name=minOrdQty]").val(minOrdQty);
-				$("#cartForm  input[name=cea]").val(minOrdQty);
-				$("#cartForm  input[name=cea]").attr("readonly",false);
-				$("#cartForm  input[name=stock]").val(itemCnt);
-
-				fnSetTotalPrice();
-			}
-
-		}, "text");
-	}
-	
 	//세트 사이즈 클릭시
 	function fnViewStockSet(obj, goodsCd, optCd1, optCd2, minOrdQty, maxOrdQty) {
 		
@@ -864,7 +749,7 @@
 		let itemSize = 0;
 		target.each(function(){
 			if (typeof ($(this).find('.select').find('input[name=opt2]').val()) != 'undefined' &&  !gagajf.isNull($(this).find('.select').find('input[name=opt2]').val())){
-				if (goodsCd != $(this).find('.select').find('input[name=opt2]').val()){
+				if (goodsCd != $(this).find('.select').find('input[name=opt2]').attr('goodscd')){
 					itemSize ++;
 				}
 			}
@@ -880,11 +765,17 @@
 		let goodsOption = [];
 		if (targetSize == itemSize){
 			target.each(function() {
-				if (typeof ($(obj).find('input[name=opt2]').val()) != 'undefined' && !gagajf.isNull($(obj).find('input[name=opt2]').val())){
-					goodsOption.push($(this).find('input[name=opt2]').val());	
+				if (typeof ($(this).find('.select').find('input[name=opt2]').val()) != 'undefined' &&  !gagajf.isNull($(this).find('.select').find('input[name=opt2]').val())){
+					if (goodsCd != $(this).find('.select').find('input[name=opt2]').val()){
+						goodsOption.push($(this).find('input[name=opt2]').val());	
+					}
 				}
+				
 			});
 			
+			//내가 선택하 옵션
+			goodsOption.push($(obj).find('input[name=opt2]').val());   //goodsCd|optCd|qty	
+			
 			var maxCnt = maxOrdQty;
 			var data = {arrGoodsOption : goodsOption
 						,minOrdQty : minOrdQty
@@ -1227,11 +1118,11 @@
 					}else{
 						tag += '<li aria-disabled="'+soldoutYn+'" data-soldout="'+soldoutYn +'" onclick="fnViewStock(this, \''+ item.goodsCd+'\' , \''+ item.optCd+'\' , \''+ item.optCd1+'\' , \''+ item.optCd2+'\', \''+ minOrdQty+'\', \''+ maxOrdQty+'\')">\n';
 					}
-					tag += '<div>'+ item.optCd2+'</div>\n';
+					tag += '<div class="opt_name">'+ item.optCd2+'</div>\n';
 					if (item.addPrice > 0){
-						tag += '<div>'+ item.addPrice.addComma() +'원</div>\n';	
+						tag += '<div class="opt_price">'+ item.addPrice.addComma() +'원</div>\n';	
 					}
-					tag += '<input type="hidden" name="opt2" value="'+ item.goodsCd+'|'+item.optCd +'|'+qty +'" id="'+item.optCd+'" addPrice="'+item.addPrice+'"  optCd="'+item.optCd+'"  optCd1="'+item.optCd1+'"  optCd2="'+item.optCd2+'"  />\n';
+					tag += '<input type="hidden" name="opt2" value="'+ item.goodsCd+'|'+item.optCd +'|'+qty +'" goodsCd="'+item.goodsCd+'" id="'+item.optCd+'" addPrice="'+item.addPrice+'"  optCd="'+item.optCd+'"  optCd1="'+item.optCd1+'"  optCd2="'+item.optCd2+'"  />\n';
 					tag += '</li>\n';
 				});
 				
@@ -1341,9 +1232,7 @@
 		}
 	}
 	
-	var fnGotoGoodsDetail = function(goodsCd){
-		
-	}
+	
 	$(document).ready( function() {
 		
 		$('.timer_box').css('display', 'none');
@@ -1381,19 +1270,19 @@
 		params.goodsOtherGb = "together";
 		params.ithrCd = "tmtb";
 		params.contentsLoc = "tmtb";
-		//fnGoodsTogetherSearch(params);
+		fnGoodsTogetherSearch(params);
 		
 		// 추천 상품(ajax html)
 		params.goodsOtherGb = "recommend";
 		params.ithrCd = "tmtb";
 		params.contentsLoc = "tmtb";
-		//fnGoodsRecommendSearch(params);
+		fnGoodsRecommendSearch(params);
 		
 		// 비슷한 상품(ajax html)
 		params.goodsOtherGb = "like";
 		params.ithrCd = "tmtb";
 		params.contentsLoc = "tmtb";
-		//fnGoodsLikeSearch(params);
+		fnGoodsLikeSearch(params);
 	
 		
 		// 상품 대표설명 > 좌측 상품썸네일 navi, 우측 상품정보 고정 
@@ -1624,11 +1513,8 @@
 		$("meta[property='eg:isNew']").attr('content',([[${goodsInfo.formalGb}]] == 'G009_10')? 'True' :'False');
 		$("meta[property='eg:etc1']").attr('content', [[${goodsInfo.selfGoodsYn}]]);
 		
-		
-		$('.btn_copy').bind('click', function() {
-			copyToClipboard();
-		});
-		
+		// ep 쿠폰확인
+		fnEpCouponDown([[${params.afLinkCd}]], [[${params.goodsCd}]], 1);
 	});
 	
 	// 상품평 레이어 호출후 콜백에서 호출하므로 여기에 있어야함

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

@@ -69,7 +69,7 @@
 			<button type="button" class="kk" th:attr="onclick=|cfnSendToKakao('${stylelUrl+'/goods/detail/form?goodsCd='+goodsInfo.goodsCd}', '${goodsInfo.goodsFullNm}', '${imgGoodsUrl+ '/'+goodsInfo.sysImgNm+'?RS=80'}');|"><span>카카오톡</span></button>
 			<button type="button" class="fb" th:attr="onclick=|sendSns('facebook', '${stylelUrl+'/goods/detail/form?goodsCd='+goodsInfo.goodsCd}', '${goodsInfo.goodsFullNm}', '', '');|"><span>페이스북</span></button>
 			<button type="button" class="tw" th:attr="onclick=|sendSns('twitter', '${stylelUrl+'/goods/detail/form?goodsCd='+goodsInfo.goodsCd}', '${goodsInfo.goodsFullNm+ '#style24몰'}', '', '');|"><span>트위터</span></button>
-			<button type="button" class="url btn_copy"><span>URL</span></button>
+			<button type="button" class="url btn_copy" onclick="copyToClipboard();"><span>URL</span></button>
 		</span>
 	</div>
 </div>

+ 150 - 0
src/main/webapp/biz/goods.js

@@ -0,0 +1,150 @@
+//****************상품상세  start **********************************
+// 함께본 상품
+var fnGoodsTogetherSearch = function(params) {
+	gagajf.ajaxSubmit("/goods/detail/together/frame", "html", "goodsTogetherbArea", params);
+}
+
+// 추천 상품
+var fnGoodsRecommendSearch = function(params) {
+	gagajf.ajaxSubmit("/goods/detail/recommend/frame", "html", "goodsRecommendbArea", params);
+}
+
+// 비슷한 상품
+var fnGoodsLikeSearch = function(params) {
+	gagajf.ajaxSubmit("/goods/detail/like/frame", "html", "goodsLikebArea", params);
+}
+
+//사이즈 클릭시 - 단품
+var fnViewStock = function(obj, goodsCd, optCd, optCd1, optCd2,  minOrdQty, maxOrdQty) {
+	let $obj = $(obj);
+	let selfGoodsYn = $("#cartForm  input[name=selfGoodsYn]").val();
+	let $target = null;
+	if (selfGoodsYn == "Y"){
+		$target = $obj;
+		$target.prop("checked",true);
+		$("#selectOptCd1").html(optCd2);
+	}else{
+		$target = $obj.find('input[name="opt2"]');
+	}
+	let addPrice  = $target.attr("addPrice");
+	$("#selectOptCd1addPrice").html('');
+	if (Number(addPrice) > 0) $("#selectOptCd1addPrice").html("(+" + addPrice.addComma() + ")");
+	
+	$("#cartForm  input[name=optCd]").val(optCd);
+	$("#cartForm  input[name=optCd1]").val(optCd1);
+	$("#cartForm  input[name=optCd2]").val(optCd2);
+	$("#cartForm  input[name=addPrice]").val(addPrice);
+	$("#cartForm  input[name=ordQty]").val("");
+	
+	let maxCnt = maxOrdQty;
+	let params = new Object();
+	params.goodsCd = goodsCd;
+	params.optCd = optCd;
+	params.optCd1 = optCd1;
+	params.optCd2 = optCd2;
+	params.selfGoodsYn = selfGoodsYn;
+
+	$.get("/goods/detail/ajaxGoodsStockQty", $.param(params), function(result) {
+		let itemCnt = eval(result); //해당 아이템에 선택되어진 사이즈의 수량
+
+		if (maxCnt > itemCnt) {
+			maxCnt = itemCnt;
+		}
+
+		if (minOrdQty > itemCnt) {
+			$target.prop("disabled", true);
+		}else{
+			$("#cartForm  input[name=ordQty]").val(minOrdQty);
+			$("#cartForm  input[name=maxOrdQty]").val(maxCnt);
+			$("#cartForm  input[name=minOrdQty]").val(minOrdQty);
+			$("#cartForm  input[name=cea]").val(minOrdQty);
+			$("#cartForm  input[name=cea]").attr("readonly",false);
+			$("#cartForm  input[name=stock]").val(itemCnt);
+
+			fnSetTotalPrice();
+			
+			// 모바일에서 작업해야함
+			$("#cartForm  input[name=opt]").each(function(){
+				if ($(this).attr('id') == optCd){
+			//		$(this).prop('checked', true);
+				}
+			});
+		}
+
+	}, "text");
+}
+
+
+// EP 쿠폰조회
+var fnEpCouponDown = function(afLinkCd, goodsCd, maxRownum){
+	let data = {afLinkCd : afLinkCd
+				, goodsCd : goodsCd
+				, maxRownum : maxRownum
+				};
+	$.getJSON('/goods/epCoupon/list', data, function(result, status) {
+		if (status === 'success') {
+			if(result.length>0){
+				let coupon = result[0];
+				let tag = '';
+				tag += '<div class="modal fade pd_pop epcoupon_pop" id="epCouponPop" tabindex="-1" role="dialog" aria-labelledby="epCouponLabel" aria-hidden="true" style="display:block;">\n';
+				tag += '	<div class="modal-dialog" role="document">\n';
+				tag += '	  <div class="modal-content">\n';
+				tag += '		<div class="modal-header">\n';
+				tag += '			<h5 class="modal-title" id="epCouponLabel">'+coupon.cpnNm+'</h5>\n';
+				tag += '		</div>\n';
+				tag += '		<div class="modal-body">\n';
+				tag += '			<div class="pop_cont">\n';
+				tag += '				<div class="ep_coupon">\n';
+				tag += '					<div>\n';
+				tag += '						<p class="cp_title">\n';
+				tag += '							COUPON\n';
+				tag += '						</p>\n';
+				tag += '						<p class="cp_cont">\n';
+				if (coupon.dcWay == 'G240_11'){		//할인율 
+					tag += '							<span class="unit_percent">\n';
+					tag += '								최대<em class="number">'+coupon.dcVal+'</em><em class="unit">%</em>\n';
+					tag += '							</span>\n';
+					
+				}else{	
+					tag += '							<span class="unit_won">\n';
+					tag += '								<em class="number">'+coupon.dcVal.addComma()+'</em><em class="unit">원</em>\n';
+					tag += '							</span>\n';	
+				}
+				tag += '						</p>\n';
+				tag += '					</div>\n';
+				tag += '				</div>\n';
+				tag += '				<div class="info_txt">\n';
+				tag += '					<ul>\n';
+				tag += '						<li>일부 상품은 쿠폰 사용이 제한될 수 있습니다.</li>\n';
+				tag += '						<li>할인대상 및 금액은 상시 변경됩니다.</li>\n';
+				tag += '						<li>제휴 사이트와 정보연동 시간차이로 판매정보가 불일치할 수 있습니다.</li>\n';
+				tag += '						<li>본 쿠폰은 제휴 사이트를 통해 들어온 고객님만 발급 및 사용이 가능합니다.</li>\n';
+				tag += '					</ul>\n';						
+				tag += '				</div>\n';
+				tag += '			</div>\n';
+				tag += '		</div>\n';
+				tag += '		<div class="modal-footer">\n';
+				tag += '			<button type="button" id="" class="btn btn_primary btn_all_cpdown" onclick="fnEpCoupondown(\''+afLinkCd+'\',\''+goodsCd+'\');" ><span>쿠폰 받기</span></button>\n';
+				tag += '		</div>\n';
+				tag += '	  </div>\n';
+				tag += '	</div>\n';
+				tag += '	<a href="javascript:void(0);" rel="modal:close" onclick="cfCloseLayer(\'epCouponPop\')" class="close-modal">Close</a>\n';
+				tag += '</div>	\n';
+
+				$('body').append(tag);
+				$('#epCouponPop').modal("show");
+			}
+		}
+	});
+}
+
+// ep 쿠폰다운로드
+var fnEpCoupondown = function(afLinkCd, goodsCd){
+	gagajf.ajaxJsonSubmit(_PAGE_GOODS_EP_CPN_DOWNLOAD, JSON.stringify({goodsCd: goodsCd, afLinkCd: afLinkCd}), fnEpCouponDownCallBack);
+}
+
+var fnEpCouponDownCallBack = function(){
+	//cfCloseLayer('epCouponPop');  //dim 이 안없어져요
+}
+
+//****************상품상세  end **********************************

+ 0 - 367
src/main/webapp/biz/goodsSession.js

@@ -1,367 +0,0 @@
-//****************상품목록  start **********************************
-var categoryGoodsList = [];
-var cnt = 1;
-var email = '';
-var fnCreateGoodsList = function(result, ithrCd, contentLoc, goodsUrl, lastPage, endRow) {
-	var tag = '';
-	var rank = 0;
-	if(lastPage!='1'){
-		rank = endRow;
-	}
-	$.each(result.dataList, function(idx, item) {
-		if (idx < 4) {
-			categoryGoodsList.push(item.goodsCd);
-		}
-
-		tag += '<div class="item_prod">';
-		tag += '	<div class="item_state">';
-		tag += '		<button type="button" class="itemLike">관심상품 추가</button>';
-		tag += '		<a href="#none" class="itemLink">';
-		// tag += '			<div class="rank ranker"><span>'+(rank+(idx+1))+'</span></div>';
-		tag += '			<div class="itemPic">';
-		tag += '				<img alt="BLUE-a" class=" vLHTC pd_img" src="'+goodsUrl+'/'+item.sysImgNm+'">';
-		tag += '			</div>';
-		tag += '			<p class="itemBrand">'+item.brandGroupNm+'</p>';
-		tag += '			<div class="itemName">'+item.goodsFullNm+'</div>';
-		tag += '			<p class="itemPrice">'+item.currPrice.addComma();
-		tag += '				<span class="itemPrice_original">'+item.listPrice.addComma()+'</span>';
-		if(item.currPrice != item.listPrice){
-			if(item.listPrice != 0){
-		tag += '				<span class="itemPercent">'+ Math.round((item.listPrice - item.currPrice) / (item.listPrice * 1.0) * 100) +'%</span>';
-			}
-		}
-		tag += '			</p>';
-		tag += '			<div class="itemcolorchip">';
-		tag += '				<span class="chip_color35" value="ABM">BEIGE</span>';
-		tag += '				<span class="chip_color54" value="BDS">BLACK</span>';
-		tag += '				<span class="chip_color40" value="YBR">WHITE</span>';
-		tag += '			</div>';
-		tag += '			<p class="itemBadge">';
-		tag += '				<span class="badge13">베스트 </span>';
-		tag += '			</p>';
-		if(item.goodsTnm != null){
-			tag += '			<div class="itemComment">'+item.goodsTnm+'</div>';
-		}
-		tag += '		</a>';
-		tag += '	</div>';
-		tag += '</div>';
-	});
-
-	if (cnt == 1) {
-		// <!-- Criteo 카테고리/리스팅 태그 -->
-		window.criteo_q = window.criteo_q || [];
-		var deviceType = /iPad/.test(navigator.userAgent) ? "t" : /Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Silk/.test(navigator.userAgent) ? "m" : "d";
-		window.criteo_q.push(
-			{event: "setAccount", account: 26073}, // 이 라인은 업데이트하면 안됩니다
-			{event: "setEmail", email: email}, // 유저가 로그인이 안되 있는 경우 빈 문자열을 전달
-			{event: "setSiteType", type: deviceType},
-			{event: "viewList", item: categoryGoodsList} // 가장 위에있는 3개의 상품 ID를 전달
-		);
-		// <!-- END 카테고리/리스팅 태그 -->
-		cnt++;
-	}
-
-	return tag;
-}
-
-
-// 인피니트 스크롤 초기화
-var fnCategoryGoodsInfiniteScrollInit = function(){
-	sessionStorage.removeItem(document.location.href);
-	//History 초기화
-	$("#listBox").html("");
-}
-
-//****************상품목록  end **********************************
-
-//****************상품상세  start **********************************
-// 브랜드 인기상품 (모바일)
-var jfGoodsCustRecommendSearch = function(params) {
-	gagajf.ajaxSubmit("/goods/detail/goodsOther/frame", "html", "goodsCustRecommendArea", params);
-}
-
-//상품베너, 다른컬러, 함께본(카테고리 ) 상품
-var jfGoodsOtherSearch = function(params) {
-	gagajf.ajaxSubmit("/goods/detail/goodsOther/frame", "html", "goodsOtherArea", params);
-}
-
-//상품평
-var jfGoodsReviewSearch = function(params) {
-	gagajf.ajaxSubmit("/goods/detail/goodsReview/frame", "html", "goodsReviewArea", params);
-}
-
-//상품문의
-var jfGoodsQnaSearch = function(params) {
-	gagajf.ajaxSubmit("/goods/detail/goodsQna/frame", "html", "goodsQnaArea", params);
-}
-
-//재고수정시
-var jfStockChange = function(gb){
-
-	var obj = $("#goodsQty");
-	var objQty = parseInt($("#goodsQty").val());
-	if(gb == 'minus'){
-		if(gagajf.isNull($("#cartForm  input[name=sizeCd]").val())){
-			mcxDialog.alert("사이즈를 선택하세요.");
-		} else if(objQty <= parseInt($("#cartForm  input[name=minOrdQty]").val()) && !gagajf.isNull($("#cartForm  input[name=sizeCd]").val())){
-			mcxDialog.alert("구매하실 수 있는 최소 수량입니다.");
-		} else {
-			obj.val(objQty-1);
-		}
-	} else {
-		if(gagajf.isNull($("#cartForm  input[name=sizeCd]").val())){
-			mcxDialog.alert("사이즈를 선택하세요.");
-		}else if(objQty < parseInt($("#cartForm  input[name=maxOrdQty]").val())){
-			obj.val(objQty+1);
-		}else{
-			mcxDialog.alert("구매하실 수 있는 최대 수량입니다.");
-		}
-	}
-
-	$("#cartForm  input[name=ordQty]").val(obj.val());
-}
-
-//장바구니담기(단품)
-/**
- * @type   : function
- * @access : public
- * @desc   : 바로구매, 장바구니 담기
- * <pre>
- *		addCart(btnType,goodsType);
- * </pre>
- * @param  : btnType - 장바구니. '' , 바로구매 : 'DIRECT'. 필수
- * @param  : layer - 레이어 여부. 딜상품일 경우 . '' : 본창, 'layer':레이어창
- * @since  : 2020/07/23
- * @author : eskim
- */
-var addCart = function(btnType, layer){
-	var params = [];
-	var goodsType = $("#cartForm  input[name=goodsType]").val();
-
-	if (goodsType == 'N'){
-		if (gagajf.isNull($("#cartForm  input[name=sizeCd]").val())) {
-			mcxDialog.alertC('사이즈를 선택해 주십시오.');
-			return;
-		}
-		var obj = new Object();
-
-		obj.btnType = btnType;
-		obj.goodsType = $("#cartForm  input[name=goodsType]").val();
-		obj.goodsCd = $("#cartForm  input[name=goodsCd]").val();
-		obj.itemCd = $("#cartForm  input[name=goodsCd]").val();
-		obj.sizeCd = $("#cartForm  input[name=sizeCd]").val();
-		obj.goodsQty = $("#cartForm  input[name=ordQty]").val();
-		obj.itemQty = 1;
-		obj.planDtlSq =$("#cartForm  input[name=planDtlSq]").val();
-		params.push(obj);
-
-	}else if (goodsType == 'S'){
-		var target=$('.sizelistCart');
-		var targetSize=target.length;
-		var itemSize = target.find('.item').find('input[type=radio]:checked').length;
-		if (targetSize != itemSize){
-			mcxDialog.alert("구성상품들의 사이즈를 선택하세요.");
-			return false;
-		}
-
-		target.find('.item').find('input[type=radio]:checked').each(function() {
-
-			var arrInfo = $(this).val().split('|');	// 상품코드|사이즈|구성수량
-
-			var obj = new Object();
-			obj.btnType = btnType;
-			obj.goodsType = $("#cartForm  input[name=goodsType]").val();
-			obj.goodsCd = $("#cartForm  input[name=goodsCd]").val();
-			obj.itemCd = arrInfo[0];
-			obj.sizeCd = arrInfo[1];
-			obj.goodsQty = $("#cartForm  input[name=ordQty]").val();
-			obj.itemQty = Number(arrInfo[2]);
-			obj.planDtlSq =$("#cartForm  input[name=planDtlSq]").val();
-			params.push(obj);
-
-		});
-
-	}else{
-		if (layer == 'layer'){
-
-			var goodsSize = $("#optionListLayer").children('ul').length
-			if (goodsSize <= 0){
-				mcxDialog.alert("구성상품들의 사이즈를 선택하세요.");
-				return false;
-			}
-			$('#optionListLayer > ul').each(function() {
-
-				var arrInfo = $(this).find('input[name="coption"]').val().split(':');
-
-				var obj = new Object();
-				obj.btnType = btnType;
-				obj.goodsType = $("#cartForm  input[name=goodsType]").val();
-				obj.goodsCd =  $("#cartForm  input[name=goodsCd]").val();
-				obj.itemCd = arrInfo[0];
-				obj.sizeCd = arrInfo[1];
-				obj.goodsQty = $(this).find('input[name="cea"]').val();
-				obj.itemQty = 1;
-				obj.planDtlSq = $("#cartForm  input[name=planDtlSq]").val();
-				params.push(obj);
-
-			});
-		}else{
-			if (_frontGb == "P"){
-				var goodsSize = $("#optionListDiv").children('ul').length
-				if (goodsSize <= 0){
-					mcxDialog.alert("구성상품들의 사이즈를 선택하세요.");
-					return false;
-				}
-				$('#optionListDiv > ul').each(function() {
-
-					var arrInfo = $(this).find('input[name="coption"]').val().split(':');
-					$(this).find('input[name="coption"]').attr('goodsCd')
-
-					var obj = new Object();
-					obj.btnType = btnType;
-					obj.goodsType = $("#cartForm  input[name=goodsType]").val();
-					obj.goodsCd =  $("#cartForm  input[name=goodsCd]").val();
-					obj.itemCd = arrInfo[0];
-					obj.sizeCd = arrInfo[1];
-					obj.goodsQty = $(this).find('input[name="cea"]').val();
-					obj.itemQty = 1;
-					obj.planDtlSq = $("#cartForm  input[name=planDtlSq]").val();
-					params.push(obj);
-				});
-			}else{
-				var goodsSize = $("#optionListDiv").children('dl').length
-				if (goodsSize <= 0){
-					mcxDialog.alert("구성상품들의 사이즈를 선택하세요.");
-					return false;
-				}
-				$('#optionListDiv > dl').each(function() {
-
-					var arrInfo = $(this).find('input[name="coption"]').val().split(':');
-					$(this).find('input[name="coption"]').attr('goodsCd')
-
-					var obj = new Object();
-					obj.btnType = btnType;
-					obj.goodsType = $("#cartForm  input[name=goodsType]").val();
-					obj.goodsCd =  $("#cartForm  input[name=goodsCd]").val();
-					obj.itemCd = arrInfo[0];
-					obj.sizeCd = arrInfo[1];
-					obj.goodsQty = $(this).find('input[name="cea"]').val();
-					obj.itemQty = 1;
-					obj.planDtlSq = $("#cartForm  input[name=planDtlSq]").val();
-					params.push(obj);
-				});
-			}
-		}
-	}
-
-	//DIRECT : 바로 구매. '' : 장바구니
-	cfnPutCartList(params);
-
-}
-
-
-//url 복사
-var jfCopyLinkUrl = function(goodsCd){
-	cfnCopyLinkUrl(location.protocol + _PAGE_GOODS_DETAIL + goodsCd);
-}
-
-//SNS 연동
-var jfSendToSns = function(goodsCd, goodsNm, goodsImg, snsGb) {
-	var linkUrl = location.protocol + _PAGE_GOODS_DETAIL + goodsCd;
-
-	if (goodsImg.indexOf("http") <= -1 || goodsImg.indexOf("https") <= -1){
-		var _goodsImgUrl = _uploadGoodsUrl;
-		goodsImg = "https:"+goodsImg;
-	}
-
-	if (snsGb == "FB"){
-		cfnSendToFaceBook(linkUrl,goodsNm ,goodsImg);
-	}else if (snsGb == "KK"){
-		if (_frontGb == "P"){
-			cfnSendToKakao(linkUrl,goodsNm ,goodsImg);
-		}else{
-			cfnSendToKakaoMob(linkUrl,goodsNm ,goodsImg);
-		}
-	}
-}
-
-//****************상품상세  end **********************************
-
-//****************상품검색  start **********************************
-// 상품 정렬
-var fnSortChange = function(sortGb) {
-	if($("#searchForm input:hidden[name=sortGb]").val()==sortGb){
-		return;
-	}
-	if (_frontGb == "P"){
-		$('.productsection .filterbutton').html('필터 열기<span>현재 상태 : 닫힘</span>').removeClass('active');
-		$('.filterlist').css({'height':'0'});
-	}else{
-		areaClose();
-	}
-	$("#searchForm input[name=sortGb]").val(sortGb);
-	fnCategoryGoodsInfiniteScrollInit();
-	fnGoodsListSearch();
-}
-
-
-var filterHtml = '';
-var filterStatHtml = '';
-// 필터 적용
-var fnFilterSearch = function() {
-	$(".filterstate .filter_div").empty();
-	fnCategoryGoodsInfiniteScrollInit();
-	filterHtml = '';
-	filterStatHtml = '';
-	gagaInfiniteScroll.pageStatus.filterHtml = filterHtml;
-	gagaInfiniteScroll.pageStatus.filterStatHtml = filterStatHtml;
-	fnFilterSet('brand');
-	fnFilterSet('size');
-	fnFilterSet('color');
-	fnFilterSet('price');
-	if (_frontGb == "P"){
-		$('.productsection .filterbutton').html('필터 열기<span>현재 상태 : 닫힘</span>').removeClass('active');
-		$('.filterlist').css({'height':'0'});
-	}else{
-		areaClose();
-	}
-	fnGoodsListSearch();
-}
-
-var fnFilterSet = function(searchId) {
-
-	$("#searchForm input:hidden[name="+searchId+"Search]").remove();
-	$(".filterstate li[name="+searchId+"Stat]").remove();
-	var tag = '';
-	$('#filterForm input[name='+searchId+']:checked').each(function(){
-		tag = '<input type="hidden" name="'+searchId+'Search" value="'+$(this).val()+'"/>\n';
-		$("#searchForm").append(tag);
-		filterHtml += tag;
-		if(_frontGb != "P"){
-			tag = '<button type="button" class="removefilter" onclick="fnFilterStatRemove(\''+searchId+'\', \''+$(this).val()+'\');">'+$(this).closest('li').children('label').text()+'</button>';
-			$(".filterstate .filter_div").append(tag);
-		}else{
-			tag = '<li name="'+searchId+'Stat">'+$(this).closest('li').children('label').text()+'<button type="button" onclick="fnFilterStatRemove(\''+searchId+'\', \''+$(this).val()+'\');">DELETE</button></li>';
-			$(".filterstate").append(tag);
-		}
-		filterStatHtml += tag;
-	});
-	gagaInfiniteScroll.pageStatus.filterHtml = filterHtml;
-	gagaInfiniteScroll.pageStatus.filterStatHtml = filterStatHtml;
-}
-
-var fnFilterStatRemove = function(searchId, val){
-	$('#filterForm input[name='+searchId+']:checked').each(function(){
-		if($(this).val()==val){
-			$(this).attr("checked", false);
-			$(this).parent().removeClass("active");
-		}
-	});
-	fnFilterSearch();
-}
-
-// 필터 초기화
-var fnFilterReset = function() {
-	filterReset();
-}
-//****************상품검색  end **********************************

+ 1 - 0
src/main/webapp/ux/style24_link.js

@@ -47,6 +47,7 @@ const _PAGE_GOODS_REVIEW_LAYER = _frontUrl + "/goods/review/layer/";								// 
 const _PAGE_GOODS_REVIEW_DETAIL_LAYER = _frontUrl + "/goods/review/detail/layer";					// 상품평- 상세(베스트, 포토)
 const _PAGE_GOODS_REVIEW_PHTO_LIST_LAYER = _frontUrl + "/goods/review/photo/layer/";				// 상품평- 포토/영상 리뷰 (list)
 const _PAGE_GOODS_CPN_DOWNLOAD = "/goods/coupon/download";											// 상품쿠폰다운로드
+const _PAGE_GOODS_EP_CPN_DOWNLOAD = "/goods/ep/coupon/download";									// EP쿠폰다운로드
 const _PAGE_DEAL_GOODS_DETAIL_LAYER = _frontUrl + "/goods/deal/detail/layer/";						// 딜상품 상세레이어
 
 //== 장바구니 ==/