Browse Source

Merge branch 'develop' of http://112.172.147.34:4936/style24/style24.admin.git into develop

gagamel 5 years ago
parent
commit
21082b82e8
35 changed files with 2002 additions and 317 deletions
  1. 94 2
      src/main/java/com/style24/admin/biz/dao/TsaCardPromotionDao.java
  2. 9 0
      src/main/java/com/style24/admin/biz/dao/TsaCouponDao.java
  3. 260 2
      src/main/java/com/style24/admin/biz/service/TsaCardPromotionService.java
  4. 11 0
      src/main/java/com/style24/admin/biz/service/TsaCouponService.java
  5. 2 3
      src/main/java/com/style24/admin/biz/service/TsaCustomerService.java
  6. 2 1
      src/main/java/com/style24/admin/biz/service/TsaMorebetterService.java
  7. 113 4
      src/main/java/com/style24/admin/biz/web/TsaMarketingController.java
  8. 11 19
      src/main/java/com/style24/admin/biz/web/TsaOrderChangeController.java
  9. 0 6
      src/main/java/com/style24/admin/biz/web/TsaOrderController.java
  10. 28 4
      src/main/java/com/style24/persistence/domain/CardPromotion.java
  11. 12 0
      src/main/java/com/style24/persistence/domain/CardPromotionCondition.java
  12. 1 0
      src/main/java/com/style24/persistence/domain/CardPromotionTarget.java
  13. 10 0
      src/main/java/com/style24/persistence/domain/Coupon.java
  14. 3 0
      src/main/java/com/style24/persistence/domain/CustomerSearch.java
  15. 2 0
      src/main/java/com/style24/persistence/domain/MoreBetterGoods.java
  16. 302 45
      src/main/java/com/style24/persistence/mybatis/shop/TsaCardPromotion.xml
  17. 27 0
      src/main/java/com/style24/persistence/mybatis/shop/TsaCoupon.xml
  18. 4 0
      src/main/java/com/style24/persistence/mybatis/shop/TsaCustomer.xml
  19. 19 19
      src/main/java/com/style24/persistence/mybatis/shop/TsaFreegiftPromotion.xml
  20. 1 1
      src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml
  21. 39 55
      src/main/java/com/style24/persistence/mybatis/shop/TsaMorebetter.xml
  22. 1 1
      src/main/webapp/WEB-INF/views/goods/GoodsListForm.html
  23. 61 38
      src/main/webapp/WEB-INF/views/marketing/CardInterestForm.html
  24. 86 28
      src/main/webapp/WEB-INF/views/marketing/CardInterestPopupForm.html
  25. 1 1
      src/main/webapp/WEB-INF/views/marketing/CardListPopupForm.html
  26. 364 0
      src/main/webapp/WEB-INF/views/marketing/CardPromotionForm.html
  27. 303 0
      src/main/webapp/WEB-INF/views/marketing/CardPromotionPopupForm.html
  28. 12 3
      src/main/webapp/WEB-INF/views/marketing/CouponPopupForm.html
  29. 72 0
      src/main/webapp/WEB-INF/views/marketing/CouponPubCustListPopupForm.html
  30. 16 2
      src/main/webapp/WEB-INF/views/marketing/CouponPubForCustPopupForm.html
  31. 15 14
      src/main/webapp/WEB-INF/views/marketing/MorebetterPopupForm.html
  32. 0 1
      src/main/webapp/WEB-INF/views/order/ExchangeRequestForm.html
  33. 7 8
      src/main/webapp/WEB-INF/views/order/OrderDetailForm.html
  34. 36 48
      src/main/webapp/WEB-INF/views/order/OrderListForm.html
  35. 78 12
      src/main/webapp/WEB-INF/views/order/RtnReqForm.html

+ 94 - 2
src/main/java/com/style24/admin/biz/dao/TsaCardPromotionDao.java

@@ -4,6 +4,8 @@ import java.util.Collection;
 
 import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.CardPromotion;
+import com.style24.persistence.domain.CardPromotionCondition;
+import com.style24.persistence.domain.CardPromotionTarget;
 
 /**
  * 카드프로모션 Dao
@@ -33,13 +35,103 @@ public interface TsaCardPromotionDao {
 	Collection<CardPromotion> getCardInterestList(CardPromotion cardPromotion);
 
 	/**
-	 * 카드무이자할부저장
+	 * 카드무이자할부 조건 목록
 	 * @param cardPromotion
 	 * @return
 	 * @author eskim
 	 * @since 2021. 2. 1
 	 */
-	void saveCardInterest(CardPromotion cardPromotion);
+	Collection<CardPromotionCondition> getCardPromotionConditionList(int cardPrmtSq);
 
+	/**
+	 * 카드무이자할부 대상 목록
+	 * @param cardPromotion
+	 * @return
+	 * @author eskim
+	 * @since 2021. 2. 1
+	 */
+	Collection<CardPromotionTarget> getCardPromotionTargetList(int cardPrmtCdtSq);
+
+	/**
+	 * 카드프로모션 저장
+	 * @param cardPromotion
+	 * @return
+	 * @author eskim
+	 * @since 2021. 2. 1
+	 */
+	void saveCardPromotion(CardPromotion cardPromotion);
+
+	/**
+	 * 카드프로모션 행사조건 삭제
+	 * @param cardPromotionCondition
+	 * @return
+	 * @author eskim
+	 * @since 2021. 2. 2
+	 */
+	void deleteCardPromotionCondition(int cardPrmtCdtSq);
+
+	/**
+	 * 카드프로모션 행사조건  저장
+	 * @param cardPromotionCondition
+	 * @return
+	 * @author eskim
+	 * @since 2021. 2. 2
+	 */
+	void saveCardPromotionCondition(CardPromotionCondition cardPromotionCondition);
+
+
+	/**
+	 * 카드프로모션 대상 삭제
+	 * @param cardPrmtCdtSq
+	 * @return
+	 * @author eskim
+	 * @since 2021. 2. 2
+	 */
+	void deleteCardPromotionTarget(int cardPrmtCdtSq);
+
+	/**
+	 * 카드프로모션 대상 저장
+	 * @param cardPromotionTarget
+	 * @return
+	 * @author eskim
+	 * @since 2021. 2. 2
+	 */
+	void createCardPromotionTarget(CardPromotionTarget cardPromotionTarget);
+
+	/**
+	 * 카드프로모션 비노출처리
+	 * @param cardPrmtSq
+	 * @return
+	 * @author eskim
+	 * @since 2021. 2. 2
+	 */
+	void updateCardPromotionDsipYn(CardPromotion cardPromotion);
+
+	/**
+	 * 카드프로모션 삭제
+	 * @param cardPrmtSq
+	 * @return
+	 * @author eskim
+	 * @since 2021. 2. 2
+	 */
+	void deleteCardPromotion(int cardPrmtSq);
+
+	/**
+	 * 카드프로모션 목록  건수
+	 * @param cardPromotion
+	 * @return
+	 * @author eskim
+	 * @since 2021. 02. 03
+	 */
+	int getCardPromotionListCount(CardPromotion cardPromotion);
+
+	/**
+	 * 카드프로모션 목록
+	 * @param cardPromotion
+	 * @return
+	 * @author eskim
+	 * @since 2021. 02. 03
+	 */
+	Collection<CardPromotion> getCardPromotionList(CardPromotion cardPromotion);
 
 }

+ 9 - 0
src/main/java/com/style24/admin/biz/dao/TsaCouponDao.java

@@ -264,4 +264,13 @@ public interface TsaCouponDao {
 	 * @since 2021. 02. 02
 	 */
 	ArrayList<Coupon> getCouponPayTypeList(int cpnId);
+
+	/**
+	 * 쿠폰발급받은 회원리스트 팝업
+	 * @param
+	 * @return
+	 * @author bin2107
+	 * @since 2021-02-03
+	 */
+	Collection<Coupon> getCpnPubCustList(int cpnId);
 }

+ 260 - 2
src/main/java/com/style24/admin/biz/service/TsaCardPromotionService.java

@@ -2,12 +2,16 @@ package com.style24.admin.biz.service;
 
 import java.util.Collection;
 
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import com.style24.admin.biz.dao.TsaCardPromotionDao;
 import com.style24.admin.support.security.session.TsaSession;
 import com.style24.persistence.domain.CardPromotion;
+import com.style24.persistence.domain.CardPromotionCondition;
+import com.style24.persistence.domain.CardPromotionTarget;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -25,7 +29,7 @@ public class TsaCardPromotionService {
 	private TsaCardPromotionDao cardPromotionDao;
 
 	/**
-	 * 카드무이자할부 목록 건
+	 * 카드무이자할부 목록 건수
 	 * @param cardPromotion
 	 * @return
 	 * @author eskim
@@ -53,13 +57,267 @@ public class TsaCardPromotionService {
 	 * @author eskim
 	 * @since 2021. 02. 1
 	 */
+	@Transactional("shopTxnManager")
 	public void saveCardInterest(CardPromotion cardPromotion) {
 
 		Integer userNo = TsaSession.getInfo().getUserNo();
+		log.info("[saveCardInterest] cardPromotion = {}", cardPromotion);
+		// 카드 프로모션 저장
+		cardPromotion.setRegNo(userNo);
+		cardPromotion.setUpdNo(userNo);
 
+		cardPromotion.setPrmtStd(cardPromotion.getPrmtStd().replace("-", ""));
+		cardPromotion.setPrmtEdd(cardPromotion.getPrmtEdd().replace("-", ""));
 
-		cardPromotionDao.saveCardInterest(cardPromotion);
+		cardPromotionDao.saveCardPromotion(cardPromotion);
+		log.info("[saveCardInterest] cardPromotion 2  = {}", cardPromotion);
+		// 카드 프로모션 행사조건 저장
+		if ("B".equals(cardPromotion.getPrmtGb())) {
+			if (cardPromotion.getArrMinNoItrt().length > 0) {
+				int cardPromotionSize = cardPromotion.getArrMinNoItrt().length;
+				for(int i=0; i < cardPromotionSize; i++ ) {
+
+					CardPromotionCondition cardPromotionCondition = new CardPromotionCondition();
+					cardPromotionCondition.setRegNo(userNo);
+					cardPromotionCondition.setUpdNo(userNo);
+					cardPromotionCondition.setCardPrmtSq(cardPromotion.getCardPrmtSq());
+
+					cardPromotionCondition.setMinNoItrt(cardPromotion.getArrMinNoItrt()[i].toString());
+					cardPromotionCondition.setMaxNoItrt(cardPromotion.getArrMaxNoItrt()[i].toString());
+					cardPromotionCondition.setMinPayAmt(Integer.parseInt(cardPromotion.getArrMinPayAmt()[i].toString()));
+					if (cardPromotion.getCardPrmtCdtSq() != null && cardPromotion.getCardPrmtCdtSq().length > 0) {
+						if (!StringUtils.isBlank(cardPromotion.getCardPrmtCdtSq()[i])) {
+							cardPromotionCondition.setCardPrmtCdtSq(Integer.parseInt(cardPromotion.getCardPrmtCdtSq()[i].toString()));
+						}
+					}
+
+					cardPromotionDao.saveCardPromotionCondition(cardPromotionCondition);
+					log.info("[saveCardInterest] cardPromotionCondition 2  = {}", cardPromotionCondition);
+					// 카드 프로모션 카드 삭제
+					cardPromotionDao.deleteCardPromotionTarget(cardPromotionCondition.getCardPrmtCdtSq());
+
+					// 카드 프로모션 카드목록 저장
+					if (cardPromotion.getArrCardCd().length > 0) {
+						String cardCd =  cardPromotion.getArrCardCd()[i].toString(); //  형식 G941_01/G941_06/G941_11
+						String [] arrCardCd = cardCd.split("/");
+						int cardSize = arrCardCd.length;
+						for(int j=0; j < cardSize; j++ ) {
+							CardPromotionTarget cardPromotionTarget = new CardPromotionTarget();
+							cardPromotionTarget.setRegNo(userNo);
+							cardPromotionTarget.setUpdNo(userNo);
+							cardPromotionTarget.setCardPrmtCdtSq(cardPromotionCondition.getCardPrmtCdtSq());
+							cardPromotionTarget.setPrmtTargetCd(arrCardCd[j].toString());
+
+							cardPromotionDao.createCardPromotionTarget(cardPromotionTarget);
+						}
+					}
+				}
+			}
+		}else {
+
+			CardPromotionCondition cardPromotionCondition = new CardPromotionCondition();
+			cardPromotionCondition.setRegNo(userNo);
+			cardPromotionCondition.setUpdNo(userNo);
+			cardPromotionCondition.setCardPrmtSq(cardPromotion.getCardPrmtSq());
+
+			cardPromotionCondition.setDcWay(cardPromotion.getDcWay());
+			cardPromotionCondition.setDcVal(cardPromotion.getDcVal());
+			cardPromotionCondition.setMaxDcAmt(cardPromotion.getMaxDcAmt());
+			cardPromotionCondition.setMinPayAmt(cardPromotion.getMinPayAmt());
+			if (cardPromotion.getCardPrmtCdtSq() != null && cardPromotion.getCardPrmtCdtSq().length > 0) {
+				if (!StringUtils.isBlank(cardPromotion.getCardPrmtCdtSq()[0])) {
+					cardPromotionCondition.setCardPrmtCdtSq(Integer.parseInt(cardPromotion.getCardPrmtCdtSq()[0].toString()));
+				}
+			}
+
+			cardPromotionDao.saveCardPromotionCondition(cardPromotionCondition);
+			log.info("[saveCardInterest] cardPromotionCondition 2  = {}", cardPromotionCondition);
+			// 카드 프로모션 카드 삭제
+			cardPromotionDao.deleteCardPromotionTarget(cardPromotionCondition.getCardPrmtCdtSq());
+
+			// 카드 프로모션 카드목록 저장
+			if (cardPromotion.getArrCardCd().length > 0) {
+				String cardCd =  cardPromotion.getArrCardCd()[0].toString(); //  형식 G941_01/G941_06/G941_11
+				String [] arrCardCd = cardCd.split("/");
+				int cardSize = arrCardCd.length;
+				for(int j=0; j < cardSize; j++ ) {
+					CardPromotionTarget cardPromotionTarget = new CardPromotionTarget();
+					cardPromotionTarget.setRegNo(userNo);
+					cardPromotionTarget.setUpdNo(userNo);
+					cardPromotionTarget.setCardPrmtCdtSq(cardPromotionCondition.getCardPrmtCdtSq());
+					cardPromotionTarget.setPrmtTargetCd(arrCardCd[j].toString());
+
+					cardPromotionDao.createCardPromotionTarget(cardPromotionTarget);
+				}
+			}
+
+		}
+
+
+		// 삭제할 프로모션 조건이 있는경우
+		if(!StringUtils.isEmpty(cardPromotion.getDelCardPrmtCdtSq())) {
+			String [] delCardPrmtCdtSq = cardPromotion.getDelCardPrmtCdtSq().split("/");
+			int cardPrmtCdtSq = 0;
+			for(int j=0; j < delCardPrmtCdtSq.length; j++ ) {
+				if (!StringUtils.isBlank(delCardPrmtCdtSq[j])) {
+					cardPrmtCdtSq = Integer.parseInt(delCardPrmtCdtSq[j]);
+					cardPromotionDao.deleteCardPromotionCondition(cardPrmtCdtSq);
+					cardPromotionDao.deleteCardPromotionTarget(cardPrmtCdtSq);
+				}
+			}
+
+		}
 	}
 
+	/**
+	 * 카드무이자할부 조회
+	 * @param cardPrmtSq
+	 * @return
+	 * @author eskim
+	 * @since 2021. 02. 1
+	 */
+	public CardPromotion getCardInterest(Integer cardPrmtSq) {
+		CardPromotion cardPrmt = new CardPromotion();
+		cardPrmt.setCardPrmtSq(cardPrmtSq);
+		cardPrmt.setPrmtGb("B");	// 무이자
+		cardPrmt.setSearch("1");	// 프로모션id
+		cardPrmt.setCondition(Integer.toString(cardPrmtSq));
+		Collection<CardPromotion> cardInterestList = cardPromotionDao.getCardInterestList(cardPrmt);
+
+		CardPromotion cardPromotion = new CardPromotion();
+		if (cardInterestList != null && !cardInterestList.isEmpty()) {
+			cardPromotion = cardInterestList.iterator().next();
+		}
+
+		Collection<CardPromotionCondition> cardPrmtCdtList = cardPromotionDao.getCardPromotionConditionList(cardPrmtSq);
+
+
+		for (CardPromotionCondition cardPromotionCondition: cardPrmtCdtList) {
+			String cardCd = "";
+			String cardNm = "";
+			Collection<CardPromotionTarget> cardPrmtTgtList = cardPromotionDao.getCardPromotionTargetList(cardPromotionCondition.getCardPrmtCdtSq());
+			for(CardPromotionTarget cardPromotionTarget : cardPrmtTgtList) {
+				cardCd += cardPromotionTarget.getPrmtTargetCd() +"/";
+				cardNm += cardPromotionTarget.getPrmtTargetNm() +"/";
+			}
+
+			cardPromotionCondition.setArrCardCd(cardCd.substring(0, cardCd.lastIndexOf("/")));
+			cardPromotionCondition.setArrCardNm(cardNm.substring(0, cardNm.lastIndexOf("/")));
+		}
+
+		cardPromotion.setCardPrmtCdtList(cardPrmtCdtList);
+
+		log.info("[getCardPromotion] cardPromotion = {}", cardPromotion);
+		return cardPromotion;
+	}
 
+	/**
+	 * 카드프로모션 비노출처리
+	 * @param cardPromotion
+	 * @return
+	 * @author eskim
+	 * @since 2021. 02. 2
+	 */
+	@Transactional("shopTxnManager")
+	public void updateCardPromotionDsipYn(CardPromotion cardPromotion) {
+		cardPromotion.setUpdNo(TsaSession.getInfo().getUserNo());
+		cardPromotionDao.updateCardPromotionDsipYn(cardPromotion);
+	}
+
+	/**
+	 * 카드프로모션 삭제
+	 * @param cardPromotion
+	 * @return
+	 * @author eskim
+	 * @since 2021. 02. 2
+	 */
+	@Transactional("shopTxnManager")
+	public void deleteCardPromotion(CardPromotion cardPromotion) {
+
+		for(String tmpCardPrmtSq: cardPromotion.getArrCardPrmtSq()) {
+			int cardPrmtSq = Integer.parseInt(tmpCardPrmtSq);
+			//카드프로모션 조건 조회
+			Collection<CardPromotionCondition> cardPrmtCdtList = cardPromotionDao.getCardPromotionConditionList(cardPrmtSq);
+			for (CardPromotionCondition cardPromotionCondition : cardPrmtCdtList){
+				//카드프로모션 대상 삭제
+				cardPromotionDao.deleteCardPromotionTarget(cardPromotionCondition.getCardPrmtCdtSq());
+				//카드프로모션 조건 삭제
+				cardPromotionDao.deleteCardPromotionCondition(cardPromotionCondition.getCardPrmtCdtSq());
+			}
+			//카드프로모션삭제
+			cardPromotionDao.deleteCardPromotion(cardPrmtSq);
+		}
+	}
+
+	/**
+	 * 카드프로모션 목록 건수
+	 * @param cardPromotion
+	 * @return
+	 * @author eskim
+	 * @since 2021. 02. 03
+	 */
+	public int getCardPromotionListCount(CardPromotion cardPromotion) {
+		return cardPromotionDao.getCardPromotionListCount(cardPromotion);
+	}
+
+	/**
+	 * 카드프로모션 목록
+	 * @param cardPromotion
+	 * @return
+	 * @author eskim
+	 * @since 2021. 02. 03
+	 */
+	public Collection<CardPromotion> getCardPromotionList(CardPromotion cardPromotion) {
+		return cardPromotionDao.getCardPromotionList(cardPromotion);
+	}
+
+	/**
+	 * 카드무이자할부 조회
+	 * @param cardPrmtSq
+	 * @return
+	 * @author eskim
+	 * @since 2021. 02. 1
+	 */
+	public CardPromotion getCardPromotion(Integer cardPrmtSq) {
+		CardPromotion cardPrmt = new CardPromotion();
+		cardPrmt.setCardPrmtSq(cardPrmtSq);
+		cardPrmt.setSearch("1");	// 프로모션id
+		cardPrmt.setCondition(Integer.toString(cardPrmtSq));
+		Collection<CardPromotion> cardInterestList = cardPromotionDao.getCardPromotionList(cardPrmt);
+
+		CardPromotion cardPromotion = new CardPromotion();
+		if (cardInterestList != null && !cardInterestList.isEmpty()) {
+			cardPromotion = cardInterestList.iterator().next();
+//			cardPromotion.setCardPrmtSq(tmpCardPromotionCondition.getCardPrmtSq());
+//			cardPromotion.setPrmtNm(tmpCardPromotionCondition.getPrmtNm());
+//			cardPromotion.setPrmtStd(tmpCardPromotionCondition.getPrmtStd());
+//			cardPromotion.setPrmtEdd(tmpCardPromotionCondition.getPrmtEdd());
+//			cardPromotion.setPrmtGb(tmpCardPromotionCondition.getPrmtGb());
+//			cardPromotion.setDcGb(tmpCardPromotionCondition.getDcGb());
+//			cardPromotion.setLinkUrl(tmpCardPromotionCondition.getLinkUrl());
+//			cardPromotion.setNote(tmpCardPromotionCondition.getNote());
+//			cardPromotion.setDispYn(tmpCardPromotionCondition.getDispYn());
+		}
+
+		Collection<CardPromotionCondition> cardPrmtCdtList = cardPromotionDao.getCardPromotionConditionList(cardPrmtSq);
+
+
+		for (CardPromotionCondition cardPromotionCondition: cardPrmtCdtList) {
+			String cardCd = "";
+			String cardNm = "";
+			Collection<CardPromotionTarget> cardPrmtTgtList = cardPromotionDao.getCardPromotionTargetList(cardPromotionCondition.getCardPrmtCdtSq());
+			for(CardPromotionTarget cardPromotionTarget : cardPrmtTgtList) {
+				cardCd += cardPromotionTarget.getPrmtTargetCd() +"/";
+				cardNm += cardPromotionTarget.getPrmtTargetNm() +"/";
+			}
+
+			cardPromotionCondition.setArrCardCd(cardCd.substring(0, cardCd.lastIndexOf("/")));
+			cardPromotionCondition.setArrCardNm(cardNm.substring(0, cardNm.lastIndexOf("/")));
+		}
+
+		cardPromotion.setCardPrmtCdtList(cardPrmtCdtList);
+
+		log.info("[getCardPromotion] cardPromotion = {}", cardPromotion);
+		return cardPromotion;
+	}
 }

+ 11 - 0
src/main/java/com/style24/admin/biz/service/TsaCouponService.java

@@ -432,4 +432,15 @@ public class TsaCouponService {
 	public ArrayList<Coupon> getCouponPayTypeList(int cpnId) {
 		return couponDao.getCouponPayTypeList(cpnId);
 	}
+
+	/**
+	 * 쿠폰발급받은 회원리스트 팝업
+	 * @param
+	 * @return
+	 * @author bin2107
+	 * @since 2021-02-03
+	 */
+	public Collection<Coupon> getCpnPubCustList(int cpnId) {
+		return couponDao.getCpnPubCustList(cpnId);
+	}
 }

+ 2 - 3
src/main/java/com/style24/admin/biz/service/TsaCustomerService.java

@@ -94,9 +94,8 @@ public class TsaCustomerService {
 
 		// 마케팅수신동의 이력 화면단에서 수신 변경이 없으면 ''처리
 		if (StringUtils.isNotBlank(customer.getSmsAgreeYn())
-				|| StringUtils.isNotBlank(customer.getSmsAgreeYn())
-				|| StringUtils.isNotBlank(customer.getAppAgreeYn()) ){
-
+				|| StringUtils.isNotBlank(customer.getEmailAgreeYn())
+				|| StringUtils.isNotBlank(customer.getAppAgreeYn())) {
 			coreCustomerService.createCustomerMarketHst(customer);
 		}
 

+ 2 - 1
src/main/java/com/style24/admin/biz/service/TsaMorebetterService.java

@@ -344,12 +344,13 @@ public class TsaMorebetterService {
 
         morebetterDao.deleteTmtbApplyGoodsTemp(moreBetterGoods);
 
+        // 적용상품 그리드 데이터
         List<MoreBetterGoods> applyGoodsList = moreBetterGoods.getApplyGoodsList();
 
         if(moreBetterGoods.getMultiSupplyCompCd().length > 0 || moreBetterGoods.getMultiBrand().length > 0){
+            // 공급업체, 브랜드에 해당하는 상품
             List<MoreBetterGoods> compBrandGoodsList = morebetterDao.getMorebetterCompBrandGoodsList(moreBetterGoods);
             if(compBrandGoodsList.size() > 0){
-
                 for(int i=0; i<compBrandGoodsList.size(); i++){
                     moreBetterGoods.setGoodsCd(compBrandGoodsList.get(i).getGoodsCd());
                     morebetterDao.createTmtbApplyGoodsTemp(moreBetterGoods);

+ 113 - 4
src/main/java/com/style24/admin/biz/web/TsaMarketingController.java

@@ -572,7 +572,8 @@ public class TsaMarketingController extends TsaBaseController {
 		// 사이트조회
 		mav.addObject("siteCdList", rendererService.getCommonCodeList("G000"));
 		// 사용가능 고객구분 조회
-		mav.addObject("usableCustGbList", rendererService.getCommonCodeList("G100"));
+		String[] exceptCds1 = {"G100_00"};
+		mav.addObject("usableCustGbList", rendererService.getCommonCodeList("G100", "Y", exceptCds1));
 		// 사용가능 고객등급 조회
 		mav.addObject("usableCustGradeList", rendererService.getCommonCodeList("G110"));
 		// 쿠폰발행사유 조회
@@ -727,6 +728,7 @@ public class TsaMarketingController extends TsaBaseController {
 
 			// TMTB_GOODS_TEMP TABLE TRUNCATE -> 다른 다다에서 사용중인 상품 조회 -> INSERT
 			moreBetterGoods.setApplyGoodsList(moreBetter.getApplyGoodsList());
+			moreBetterGoods.setSectionGb(moreBetter.getSectionGb());
 			morebetterService.createMorebetterGoodsTemp(moreBetterGoods);
 
 			morebetterService.saveMoreBetterDetail(moreBetter);
@@ -861,6 +863,25 @@ public class TsaMarketingController extends TsaBaseController {
 
 		return super.ok(message.getMessage("SUCC_0003"));
 	}
+
+	/**
+	 * 쿠폰발급받은 회원리스트 팝업
+	 * @param
+	 * @return
+	 * @author bin2107
+	 * @since 2021-02-03
+	 */
+	@GetMapping("/coupon/pubCust/popup/form")
+	@ResponseBody
+	public ModelAndView couponPubCustListPopup(@RequestParam(value = "cpnId", required = true)int cpnId) {
+		ModelAndView mav = new ModelAndView();
+
+		mav.addObject("cpnPubCustList", couponService.getCpnPubCustList(cpnId));
+
+		mav.setViewName("marketing/CouponPubCustListPopupForm");
+		return mav;
+	}
+
 	/* // CSB 진행 */
 
 	/**
@@ -1068,6 +1089,8 @@ public class TsaMarketingController extends TsaBaseController {
 
 		ModelAndView mav = new ModelAndView();
 
+		mav.addObject("cardPrmt", cardPromotionService.getCardInterest(cardPrmtSq));
+
 		mav.addObject("cardPrmtSq", cardPrmtSq);
 		mav.setViewName("marketing/CardInterestPopupForm");
 		return mav;
@@ -1097,10 +1120,10 @@ public class TsaMarketingController extends TsaBaseController {
 
 	/**
 	 * 카드무이자할부 저장
-	 * @param cardPromotion - 포인트 정보
-	 * @return ModelAndView
+	 * @param cardPromotion
+	 * @return
 	 * @author eskim
-	 * @since 2021. 2. 1
+	 * @since 2021. 2. 2
 	 */
 	@PostMapping("/card/interest/save")
 	@ResponseBody
@@ -1109,6 +1132,92 @@ public class TsaMarketingController extends TsaBaseController {
 		return super.ok(message.getMessage("SUCC_0001"));
 	}
 
+	/**
+	 * 카드프로모션 비노출 처리
+	 * @param cardPromotion
+	 * @return
+	 * @author eskim
+	 * @since 2021. 2. 3
+	 */
+	@PostMapping("/card/promotion/dispYn/update")
+	@ResponseBody
+	public GagaResponse updateCardPromotionDsipYn(@RequestBody CardPromotion cardPromotion) {
+		cardPromotionService.updateCardPromotionDsipYn(cardPromotion);
+		return super.ok(message.getMessage("SUCC_0009"));	//성공적 변경
+	}
+
+	/**
+	 * 카드프로모션 삭제 처리
+	 * @param cardPromotion
+	 * @return
+	 * @author eskim
+	 * @since 2021. 2. 3
+	 */
+	@PostMapping("/card/promotion/delete")
+	@ResponseBody
+	public GagaResponse deleteCardPromotion(@RequestBody CardPromotion cardPromotion) {
+		cardPromotionService.deleteCardPromotion(cardPromotion);
+		return super.ok(message.getMessage("SUCC_0003"));	//성공적 변경
+	}
+
+	/**
+	 * 카드프로모션 관리
+	 * @param
+	 * @return
+	 * @author eskim
+	 * @since 2021. 02. 03
+	 */
+	@GetMapping("/card/promotion/form")
+	@ResponseBody
+	public ModelAndView cardPromotionForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.setViewName("marketing/CardPromotionForm");
+		return mav;
+	}
+
+	/**
+	 * 카드프로모션 목록
+	 * @param cardPromotion
+	 * @return
+	 * @author eskim
+	 * @since 2021. 1. 29
+	 */
+	@PostMapping("/card/promotion/list")
+	@ResponseBody
+	public GagaMap getCardPromotionList(@RequestBody CardPromotion cardPromotion) {
+
+		GagaMap result = new GagaMap();
+
+		cardPromotion.setPageable(new TscPageRequest(cardPromotion.getPageNo() - 1, cardPromotion.getPageSize()));
+		cardPromotion.getPageable().setTotalCount(cardPromotionService.getCardPromotionListCount(cardPromotion));
+
+		result.set("pageing", cardPromotion);
+		result.set("cardPromotionList", cardPromotionService.getCardPromotionList(cardPromotion));
+
+		return result;
+	}
+
+	/**
+	 * 카드프로모션 팝업
+	 * @param
+	 * @return
+	 * @author eskim
+	 * @since 2021. 2. 1
+	 */
+	@GetMapping("/card/promotion/popup/form/{cardPrmtSq}")
+	@ResponseBody
+	public ModelAndView cardProMotionPopupForm(@PathVariable Integer cardPrmtSq) {
+
+		ModelAndView mav = new ModelAndView();
+
+		mav.addObject("cardPrmt", cardPromotionService.getCardPromotion(cardPrmtSq));
+
+		mav.addObject("cardPrmtSq", cardPrmtSq);
+		mav.setViewName("marketing/CardPromotionPopupForm");
+		return mav;
+	}
+
 	/**
 	 *   카드관련 작업 종료 - eskim
 	 */

+ 11 - 19
src/main/java/com/style24/admin/biz/web/TsaOrderChangeController.java

@@ -226,6 +226,11 @@ public class TsaOrderChangeController extends TsaBaseController {
 		List<Order> cancelRequestTargetList 		= orderChangeService.getCancelRequestTargetList(order);
 		List<Order> orderChangeDetailList 			= orderChangeService.getOrderChangeDetailList(order);
 		Collection<Order> orderInfoList 			= orderService.getOrderInfoList(order);
+
+		if (ordChgSq > 0) {
+			Collection<Order> exchangeInfoList = orderChangeService.getExchangeInfo(order);
+			mav.addObject("exchangeInfoList"		, exchangeInfoList);								// 교환정보
+		}
 		
 		// 3. 화면으로 데이타 전송
 		// 2021.01.26 취소요청 화면, 취소요청정보확인 화면 통합
@@ -286,6 +291,7 @@ public class TsaOrderChangeController extends TsaBaseController {
 		
 		mav.set("allCanYn"		, rtnReq.getAllCanYn());			// 무통장입금전 전체취소 여부 
 		mav.set("isCustomer"	, rtnReq.getIsCustomer());			// 변경사유 (고객, 회사)
+		mav.set("wdGb"			, rtnReq.getWdGb());				// 회수방법
 		
 		// 4. 주문변경 회수지정보 추가
 		mav.set("chgerNm"		, rtnReq.getChgerNm());				// 변경자명
@@ -295,6 +301,7 @@ public class TsaOrderChangeController extends TsaBaseController {
 		mav.set("chgerDtlAddr"	, rtnReq.getChgerDtlAddr());		// 회수지상세주소
 		mav.set("chgerPhnno"	, rtnReq.getChgerPhnno());			// 변경자핸드폰번호
 		mav.set("chgerTelno"	, rtnReq.getChgerTelno());			// 변경자전화번호
+		mav.set("chgerRtnMemo"	, rtnReq.getChgerRtnMemo());		// 반품메모
 		
 		// 5. 주문변경 DB 등록 (TB_ORDER_CHANGE, TB_ORDER_CHANGE_DETAIL, TB_REFUND)
 		orderChangeService.rtnReq(mav, userNo);
@@ -353,21 +360,6 @@ public class TsaOrderChangeController extends TsaBaseController {
 		return mav;
 	}
 	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
 	/**
 	 * 환불계좌목록
 	 *
@@ -496,7 +488,7 @@ public class TsaOrderChangeController extends TsaBaseController {
 	 *
 	 * @param Collection<OrderChange>
 	 * @return
-	 * @author card007rtn
+	 * @author card007
 	 * @since 2021. 01. 22
 	 */
 	@PostMapping("/exchangeRequest")
@@ -530,7 +522,7 @@ public class TsaOrderChangeController extends TsaBaseController {
 	}
 
 	/**
-	 * 교환신청 (관리자)
+	 * 교환철회 (관리자)
 	 *
 	 * @param Collection<OrderChange>
 	 * @return
@@ -543,7 +535,7 @@ public class TsaOrderChangeController extends TsaBaseController {
 		GagaMap result = new GagaMap();
 		result.set("status", GagaResponseStatus.FAIL.getCode());
 
-		// 교환요청 데이터 확인
+		// 교환철회 요청 데이터 확인
 		if (excReq == null) {
 			result.set("message", message.getMessage("FAIL_1001"));
 			return result;
@@ -554,7 +546,7 @@ public class TsaOrderChangeController extends TsaBaseController {
 		excReq.setUpdNo(userNo);
 		excReq.setRegNo(userNo);
 
-		// 교환처리
+		// 교환철회 처리
 		result = orderChangeService.exchangeCancel(excReq);
 
 		// 처리 결과 코드에 따른 메세지 설정

+ 0 - 6
src/main/java/com/style24/admin/biz/web/TsaOrderController.java

@@ -123,12 +123,6 @@ public class TsaOrderController extends TsaBaseController {
 			}
 		}
 
-		// 주문취소상태 CD_GB 변경
-		if (order.getChgGb() != null) {
-			String chgDtlStat = order.getChgGb().replace("G680", "G685");
-			order.setChgGb(chgDtlStat);
-		}
-
 		// 주문전체건수 조회
 		int totalCount = orderService.getOrderListCount(order);
 		order.getPageable().setTotalCount(totalCount);

+ 28 - 4
src/main/java/com/style24/persistence/domain/CardPromotion.java

@@ -1,5 +1,7 @@
 package com.style24.persistence.domain;
 
+import java.util.Collection;
+
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.style24.persistence.TscBaseDomain;
 import com.style24.persistence.TscPageRequest;
@@ -21,7 +23,7 @@ public class CardPromotion extends TscBaseDomain {
 	private String prmtStd;	// 프로모션시작일
 	private String prmtEdd;	// 프로모션종료일
 	private String prmtGb;	// 프로모션구분(A:할인, B:무이자)
-	private String dcGb;	// 행사구분(프로모션구분이 A:할인인 경우)
+	private String dcGb;	// 행사구분(프로모션구분이 A:할인인 경우 1:즉시할인,2:청구할인,3:제휴카드)
 	private String linkUrl;	// 연결URL
 	private String note;	// 안내
 	private String dispYn;	// 표시여부
@@ -35,17 +37,39 @@ public class CardPromotion extends TscBaseDomain {
 
 	//무이자 저장용
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] minPayAmt;	// 최소결제금액
+	private String[] arrMinPayAmt;	// 최소결제금액
 
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] minNoItrt;	// 최소무이자월수(프로모션구분이 B:무이자 인경우)
+	private String[] arrMinNoItrt;	// 최소무이자월수(프로모션구분이 B:무이자 인경우)
 
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] maxNoItrt;	// 최대무이자월수(프로모션구분이 B:무이자 인경우)
+	private String[] arrMaxNoItrt;	// 최대무이자월수(프로모션구분이 B:무이자 인경우)
 
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] arrCardCd;
 
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] cardPrmtCdtSq;
+
+	// 카드프로모션 목록 조회/저장용
+	private int minPayAmt;	// 최소결제금액
+	private String dcWay;	// 할인구분할인방식(공통코드G240, 프로모션구분이 A:할인인 경우)
+	private int dcVal;	// 할인값(프로모션구분이 A:할인인 경우, 할인방식이 금액이면 할인금액, 율이면 할인율)
+	private int maxDcAmt;	// 최대할인금액(프로모션구분이 A:할인인 경우)
+	private String minNoItrt;	// 최소무이자월수(프로모션구분이 B:무이자 인경우)
+	private String maxNoItrt;	// 최대무이자월수(프로모션구분이 B:무이자 인경우)
+
+
+	// 삭제할 프로모션조건
+	private String delCardPrmtCdtSq;	// 형식 /8/9
+
+	// 삭제(비노출)할 프로모션
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] arrCardPrmtSq;
+
+	// 화면 조회용
+	Collection<CardPromotionCondition> cardPrmtCdtList;
+
 
 	// Pagination
 	private TscPageRequest pageable;

+ 12 - 0
src/main/java/com/style24/persistence/domain/CardPromotionCondition.java

@@ -23,4 +23,16 @@ public class CardPromotionCondition extends TscBaseDomain {
 	private String minNoItrt;	// 최소무이자월수(프로모션구분이 B:무이자 인경우)
 	private String maxNoItrt;	// 최대무이자월수(프로모션구분이 B:무이자 인경우)
 
+	// 화면조회용
+	private String arrCardCd;
+	private String arrCardNm;
+
+//	private String prmtNm;	// 프로모션명
+//	private String prmtStd;	// 프로모션시작일
+//	private String prmtEdd;	// 프로모션종료일
+//	private String prmtGb;	// 프로모션구분(A:할인, B:무이자)
+//	private String dcGb;	// 행사구분(프로모션구분이 A:할인인 경우 1:즉시할인,2:청구할인,3:제휴카드)
+//	private String linkUrl;	// 연결URL
+//	private String note;	// 안내
+//	private String dispYn;	// 표시여부
 }

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

@@ -16,6 +16,7 @@ public class CardPromotionTarget extends TscBaseDomain {
 
 	private Integer cardPrmtCdtSq;	// 카드프로모션행사조건일련번호
 	private String prmtTargetCd;	// 포로모션대상카드(공통코드G941)
+	private String prmtTargetNm;	// 카드명
 
 	private String callBackFun;
 	private String arrCard;

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

@@ -60,6 +60,16 @@ public class Coupon extends TscBaseDomain {
     private String dcCdGb;                  // 할인코드유형 (공통코드G233)
     private String rdCpnNm;                 // 랜덤쿠폰 사용키 (시리얼명 or 난수)
 
+    private String custNo;
+    private String custNm;
+    private String custGbNm;
+    private String custGradeNm;
+    private String useYn;
+    private String usedDt;
+    private String pubReason;
+    private String pubReasonNm;
+    private String pubReasonDtl;
+
     // 그리드 파라미터
     /*private String supplyCompList;          // 공급업체 리스트
     private String brandList;               // 브랜드 리스트

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

@@ -33,6 +33,9 @@ public class CustomerSearch extends TscBaseDomain {
 	private String custNm;
 	private String email;
 	private String custId;
+	
+	// 쿠폰발행팝업
+	private String cpnPubPopYn;		// 쿠폰발행팝업
 
 	private TscPageRequest pageable;
 	private int pageNo = 1;

+ 2 - 0
src/main/java/com/style24/persistence/domain/MoreBetterGoods.java

@@ -32,6 +32,8 @@ public class MoreBetterGoods extends TscBaseDomain {
 	private String goodsCd;
 	private String goodsNm;
 
+	private String sectionGb;		// 구간설정 구분값(G810_10:수량,G810_11:금액)
+
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] arrCompanySq;
 

+ 302 - 45
src/main/java/com/style24/persistence/mybatis/shop/TsaCardPromotion.xml

@@ -7,12 +7,10 @@
 		<choose>
 		<when test="pageable != null">
 		    ) A
-		)Z
-		WHERE RNUM BETWEEN  #{pageable.startRow} AND #{pageable.endRow}
+		WHERE NUMB BETWEEN  #{pageable.startRow} AND #{pageable.endRow}
 		</when>
 		<otherwise>
 		    ) A
-		)Z
 		</otherwise>
 		</choose>
 	</sql>
@@ -22,7 +20,7 @@
 		/* TsaCardPromotionDao.getCardInterestListCount */
 		SELECT COUNT(1)
 		FROM TB_CARD_PROMOTION 
-		WHERE PRMT_GB = #{prmtGb}
+		WHERE PRMT_GB = 'B'
 		<if test="condition != null and condition != ''">
 		    <choose>
 		        <when test='search != null and search == "1"'>
@@ -34,11 +32,11 @@
 		    </choose>
 		</if>
 		<if test="stDate != null and stDate != ''">
-		AND PRMT_EDD >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
+		AND PRMT_EDD >= REPLACE(#{stDate},'-','')
 		</if>
 		<if test="edDate != null and edDate != ''">
 		<![CDATA[
-		AND PRMT_STD < DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+		AND PRMT_STD <= REPLACE(#{edDate},'-','')
 		]]>
 		</if>
 		<if test='beforSkipFlag != null and beforSkipFlag == "Y"'>
@@ -49,48 +47,307 @@
 	<!-- 카드무이자할부 목록 -->
 	<select id="getCardInterestList" parameterType="CardPromotion" resultType="CardPromotion">
 		/* TsaCardPromotionDao.getCardInterestList */
-		SELECT Z.*
+		SELECT A.*
 		FROM (
-		    SELECT A.*, @rownum := @rownum + 1 AS RNUM 
-		    FROM (
-		        SELECT CARD_PRMT_SQ
-		             , PRMT_NM
-		             , DATE_FORMAT(PRMT_STD, '%Y%m%d%H%i%S') AS PRMT_STD
-		             , DATE_FORMAT(PRMT_EDD, '%Y%m%d%H%i%S') AS PRMT_EDD
-		             , PRMT_GB
-		             , DC_GB
-		             , LINK_URL
-		             , NOTE
-		             , DISP_YN
-		             , FN_GET_USER_NM(REG_NO) AS REG_NM
-		             , DATE_FORMAT(REG_DT, '%Y%m%d%H%i%S') AS REG_DT
-		             , FN_GET_USER_NM(UPD_NO) AS UPD_NM
-		             , DATE_FORMAT(UPD_DT, '%Y%m%d%H%i%S') AS UPD_DT
-		        FROM TB_CARD_PROMOTION 
-		        WHERE PRMT_GB = #{prmtGb}
-		        <if test="condition != null and condition != ''">
-		            <choose>
-		                <when test='search != null and search == "1"'>
-		        AND CARD_PRMT_SQ = #{condition}
-		                </when>
-		                <otherwise >
-		        AND UPPER(PRMT_NM) LIKE CONCAT('%',UPPER(#{condition}),'%')
-		                </otherwise>
-		            </choose>
-		        </if>
-		        <if test="stDate != null and stDate != ''">
-		        AND PRMT_EDD >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
-		        </if>
-		        <if test="edDate != null and edDate != ''">
-		        <![CDATA[
-		        AND PRMT_STD < DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
-		        ]]>
-		        </if>
-		        <if test='beforSkipFlag != null and beforSkipFlag == "Y"'>
-		        AND PRMT_EDD >= NOW() 
-		        </if>
+		    SELECT CARD_PRMT_SQ
+		         , PRMT_NM
+		         , DATE_FORMAT(PRMT_STD, '%Y-%m-%d') AS PRMT_STD
+		         , DATE_FORMAT(PRMT_EDD, '%Y-%m-%d') AS PRMT_EDD
+		         , PRMT_GB
+		         , DC_GB
+		         , LINK_URL
+		         , NOTE
+		         , DISP_YN
+		         , FN_GET_USER_NM(REG_NO) AS REG_NM
+		         , DATE_FORMAT(REG_DT, '%Y%m%d%H%i%S') AS REG_DT
+		         , FN_GET_USER_NM(UPD_NO) AS UPD_NM
+		         , DATE_FORMAT(UPD_DT, '%Y%m%d%H%i%S') AS UPD_DT
+		         , RANK() OVER(ORDER BY CARD_PRMT_SQ DESC)        AS NUMB
+		    FROM TB_CARD_PROMOTION 
+		    WHERE PRMT_GB = 'B'
+		    <if test="condition != null and condition != ''">
+		        <choose>
+		            <when test='search != null and search == "1"'>
+		    AND CARD_PRMT_SQ = #{condition}
+		            </when>
+		            <otherwise >
+		    AND UPPER(PRMT_NM) LIKE CONCAT('%',UPPER(#{condition}),'%')
+		            </otherwise>
+		        </choose>
+		    </if>
+		    <if test="stDate != null and stDate != ''">
+		    AND PRMT_EDD >= REPLACE(#{stDate},'-','')
+		    </if>
+		    <if test="edDate != null and edDate != ''">
+		    <![CDATA[
+		    AND PRMT_STD <= REPLACE(#{edDate},'-','')
+		    ]]>
+		    </if>
+		    <if test='beforSkipFlag != null and beforSkipFlag == "Y"'>
+		    AND PRMT_EDD >= DATE_FORMAT(CURRENT_DATE(),'%Y%m%d')
+		    </if>
 		<include refid="getListPagingCondition_sql"/>
 	</select>
 	
+	<!-- 카드 프로모션 조건 목록 -->
+	<select id="getCardPromotionConditionList" parameterType="int" resultType="CardPromotionCondition">
+		/* TsaCardPromotionDao.getCardPromotionConditionList */
+		SELECT CARD_PRMT_CDT_SQ
+		     , CARD_PRMT_SQ
+		     , MIN_PAY_AMT
+		     , DC_WAY
+		     , DC_VAL
+		     , MAX_DC_AMT
+		     , MIN_NO_ITRT
+		     , MAX_NO_ITRT
+		     , FN_GET_USER_NM(REG_NO) AS REG_NM
+		     , DATE_FORMAT(REG_DT, '%Y%m%d%H%i%S') AS REG_DT
+		     , FN_GET_USER_NM(UPD_NO) AS UPD_NM
+		     , DATE_FORMAT(UPD_DT, '%Y%m%d%H%i%S') AS UPD_DT
+		FROM TB_CARD_PROMOTION_CONDITION 
+		WHERE CARD_PRMT_SQ = #{cardPrmtSq}
+		ORDER BY CARD_PRMT_CDT_SQ
+	</select>
+	
+	<!-- 카드 프로모션 대상 목록 -->
+	<select id="getCardPromotionTargetList" parameterType="int" resultType="CardPromotionTarget">
+		/* TsaCardPromotionDao.getCardPromotionTargetList */
+		SELECT A.CARD_PRMT_CDT_SQ
+		     , A.PRMT_TARGET_CD
+		     , B.CD_NM AS PRMT_TARGET_NM
+		     , FN_GET_USER_NM(A.REG_NO) AS REG_NM
+		     , DATE_FORMAT(A.REG_DT, '%Y%m%d%H%i%S') AS REG_DT
+		FROM TB_CARD_PROMOTION_TARGET A
+		INNER JOIN TB_COMMON_CODE B ON A.PRMT_TARGET_CD = B.CD
+		                            AND B.CD_GB = 'G941'
+		WHERE A.CARD_PRMT_CDT_SQ = #{cardPrmtCdtSq}
+		ORDER BY A.PRMT_TARGET_CD
+	</select>
+	
+	<!-- 카드프로모션 저장 -->
+	<insert id="saveCardPromotion" parameterType="CardPromotion"  keyProperty="cardPrmtSq">
+		/* TsaGoods.saveCardPromotion */
+		INSERT INTO TB_CARD_PROMOTION (
+		       CARD_PRMT_SQ
+		     , PRMT_NM
+		     , PRMT_STD
+		     , PRMT_EDD
+		     , PRMT_GB
+		     , DC_GB
+		     , LINK_URL
+		     , NOTE
+		     , DISP_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{cardPrmtSq}
+		     , #{prmtNm}
+		     , #{prmtStd}
+		     , #{prmtEdd}
+		     , #{prmtGb}
+		     , #{dcGb}
+		     , #{linkUrl}
+		     , #{note}
+		     , #{dispYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       PRMT_NM = #{prmtNm}
+		     , PRMT_STD = #{prmtStd}
+		     , PRMT_EDD = #{prmtEdd}
+		     , LINK_URL = #{linkUrl}
+		     , NOTE = #{note}
+		     , DISP_YN = #{dispYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!-- 카드프로모션 행사조건 삭제 -->
+	<delete id="deleteCardPromotionCondition"  parameterType="int" >
+		/* TsaGoods.deleteCardPromotionCondition */
+		DELETE FROM TB_CARD_PROMOTION_CONDITION 
+		WHERE CARD_PRMT_CDT_SQ = #{cardPrmtCdtSq}
+	</delete>
+	
+	<!-- 카드프로모션 행사조건 저장 -->
+	<insert id="saveCardPromotionCondition" parameterType="CardPromotionCondition"  keyProperty="cardPrmtCdtSq">
+		/* TsaGoods.saveCardPromotionCondition */
+		INSERT INTO TB_CARD_PROMOTION_CONDITION (
+		       CARD_PRMT_CDT_SQ
+		     , CARD_PRMT_SQ
+		     , MIN_PAY_AMT
+		     , DC_WAY
+		     , DC_VAL
+		     , MAX_DC_AMT
+		     , MIN_NO_ITRT
+		     , MAX_NO_ITRT
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{cardPrmtCdtSq}
+		     , #{cardPrmtSq}
+		     , #{minPayAmt}
+		     , #{dcWay}
+		     , #{dcVal}
+		     , #{maxDcAmt}
+		     , #{minNoItrt}
+		     , #{maxNoItrt}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       MIN_PAY_AMT = #{minPayAmt}
+		     , DC_WAY = #{dcWay}
+		     , DC_VAL = #{dcVal}
+		     , MAX_DC_AMT = #{maxDcAmt}
+		     , MIN_NO_ITRT = #{minNoItrt}
+		     , MAX_NO_ITRT = #{maxNoItrt}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!-- 카드프로모션 타겟 삭제 -->
+	<delete id="deleteCardPromotionTarget"  parameterType="int" >
+		/* TsaGoods.deleteCardPromotionTarget */
+		DELETE FROM TB_CARD_PROMOTION_TARGET 
+		WHERE CARD_PRMT_CDT_SQ = #{cardPrmtCdtSq}
+	</delete>
+	
+	<!-- 카드프로모션 타겟 등록 -->
+	<insert id="createCardPromotionTarget" parameterType="CardPromotionTarget">
+		/* TsaGoods.createCardPromotionTarget */
+		INSERT INTO TB_CARD_PROMOTION_TARGET (
+		       CARD_PRMT_CDT_SQ
+		     , PRMT_TARGET_CD
+		     , REG_NO
+		     , REG_DT
+		)
+		VALUES (
+		       #{cardPrmtCdtSq}
+		     , #{prmtTargetCd}
+		     , #{regNo}
+		     , NOW()
+		)
+	</insert>
+	
+	<!-- 카드프로모션 비노출처리 -->
+	<delete id="updateCardPromotionDsipYn"  parameterType="CardPromotion" >
+		/* TsaGoods.updateCardPromotionDsipYn */
+		UPDATE TB_CARD_PROMOTION 
+		SET DISP_YN = 'N'
+		  , UPD_NO = #{updNo} 
+		  , UPD_DT = NOW()
+		WHERE 1 = 1
+		<choose>
+		    <when test="arrCardPrmtSq != null and arrCardPrmtSq != ''">
+		AND CARD_PRMT_SQ IN
+		        <foreach collection="arrCardPrmtSq" item="item" index="index"  open="(" close=")" separator=",">
+		        #{item}
+		        </foreach>
+		    </when>
+		<otherwise>
+		AND CARD_PRMT_SQ = #{cardPrmtSq}
+		</otherwise>
+		</choose>
+	</delete>
+	
+	<!-- 카드프로모션 삭제 -->
+	<delete id="deleteCardPromotion"  parameterType="int" >
+		/* TsaGoods.deleteCardPromotion */
+		DELETE FROM TB_CARD_PROMOTION
+		WHERE CARD_PRMT_SQ = #{cardPrmtSq}
+	</delete>
+	
+	<!-- 카드프로모션 목록 건수-->
+	<select id="getCardPromotionListCount" parameterType="CardPromotion" resultType="int">
+		/* TsaCardPromotionDao.getCardPromotionListCount */
+		SELECT COUNT(1)
+		FROM TB_CARD_PROMOTION A
+		INNER JOIN TB_CARD_PROMOTION_CONDITION B ON A.CARD_PRMT_SQ = B.CARD_PRMT_SQ
+		WHERE A.PRMT_GB = 'A'
+		<if test="condition != null and condition != ''">
+		    <choose>
+		        <when test='search != null and search == "1"'>
+		AND A.CARD_PRMT_SQ = #{condition}
+		        </when>
+		        <otherwise >
+		AND UPPER(A.PRMT_NM) LIKE CONCAT('%',UPPER(#{condition}),'%')
+		        </otherwise>
+		    </choose>
+		</if>
+		<if test="stDate != null and stDate != ''">
+		AND A.PRMT_EDD >= REPLACE(#{stDate},'-','')
+		</if>
+		<if test="edDate != null and edDate != ''">
+		<![CDATA[
+		AND A.PRMT_STD <= REPLACE(#{edDate},'-','')
+		]]>
+		</if>
+		<if test='beforSkipFlag != null and beforSkipFlag == "Y"'>
+		AND A.PRMT_EDD >= NOW() 
+		</if>
+	</select>
 	
+	<!-- 카드프로모션 목록 -->
+	<select id="getCardPromotionList" parameterType="CardPromotion" resultType="CardPromotion">
+		/* TsaCardPromotionDao.getCardPromotionList */
+		SELECT A.*
+		FROM (
+		    SELECT A.CARD_PRMT_SQ
+		         , A.PRMT_NM
+		         , DATE_FORMAT(A.PRMT_STD, '%Y-%m-%d') AS PRMT_STD
+		         , DATE_FORMAT(A.PRMT_EDD, '%Y-%m-%d') AS PRMT_EDD
+		         , A.PRMT_GB
+		         , A.DC_GB
+		         , A.LINK_URL
+		         , A.NOTE
+		         , A.DISP_YN
+		         , B.MIN_PAY_AMT
+		         , B.DC_WAY
+		         , B.DC_VAL
+		         , B.MAX_DC_AMT
+		         , B.MIN_NO_ITRT
+		         , B.MAX_NO_ITRT
+		         , FN_GET_USER_NM(A.REG_NO) AS REG_NM
+		         , DATE_FORMAT(A.REG_DT, '%Y%m%d%H%i%S') AS REG_DT
+		         , FN_GET_USER_NM(A.UPD_NO) AS UPD_NM
+		         , DATE_FORMAT(A.UPD_DT, '%Y%m%d%H%i%S') AS UPD_DT
+		         , RANK() OVER(ORDER BY A.CARD_PRMT_SQ DESC)        AS NUMB
+		    FROM TB_CARD_PROMOTION A
+		    INNER JOIN TB_CARD_PROMOTION_CONDITION B ON A.CARD_PRMT_SQ = B.CARD_PRMT_SQ
+		    WHERE A.PRMT_GB = 'A'
+		    <if test="condition != null and condition != ''">
+		        <choose>
+		            <when test='search != null and search == "1"'>
+		    AND A.CARD_PRMT_SQ = #{condition}
+		            </when>
+		            <otherwise >
+		    AND UPPER(A.PRMT_NM) LIKE CONCAT('%',UPPER(#{condition}),'%')
+		            </otherwise>
+		        </choose>
+		    </if>
+		    <if test="stDate != null and stDate != ''">
+		    AND A.PRMT_EDD >= REPLACE(#{stDate},'-','')
+		    </if>
+		    <if test="edDate != null and edDate != ''">
+		    <![CDATA[
+		    AND A.PRMT_STD <= REPLACE(#{edDate},'-','')
+		    ]]>
+		    </if>
+		    <if test='beforSkipFlag != null and beforSkipFlag == "Y"'>
+		    AND A.PRMT_EDD >= DATE_FORMAT(CURRENT_DATE(),'%Y%m%d')
+		    </if>
+		<include refid="getListPagingCondition_sql"/>
+	</select>
 </mapper>

+ 27 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsaCoupon.xml

@@ -739,4 +739,31 @@
 		FROM TB_COUPON_PAYTYPE
 		WHERE CPN_ID = #{cpnId}
 	</select>
+
+	<!-- 쿠폰발급받은회원 조회-->
+	<select id="getCpnPubCustList" parameterType="int" resultType="Coupon">
+		/* TsaCoupon.getCpnPubCustList */
+		SELECT	A.CUST_NO
+			 ,B.CUST_NM
+			 ,B.CUST_GB
+			 ,FN_GET_CODE_NM('G100',B.CUST_GB) AS CUST_GB_NM
+			 ,B.CUST_GRADE
+			 ,FN_GET_CODE_NM('G110',B.CUST_GRADE) AS CUST_GRADE_NM
+			 ,A.AVAIL_STDT
+			 ,A.AVAIL_EDDT
+			 ,CASE WHEN A.USED_DT IS NOT NULL THEN 'Y'
+				   ELSE 'N' END USE_YN
+			 ,A.USED_DT
+			 ,A.PUB_REASON
+			 ,FN_GET_CODE_NM('G068',A.PUB_REASON) AS PUB_REASON_NM
+			 ,A.PUB_REASON_DTL
+			 ,A.REG_NO
+			 ,A.REG_DT
+		FROM 	TB_CUST_COUPON A
+		LEFT OUTER JOIN TB_CUSTOMER B
+		ON		A.CUST_NO = B.CUST_NO
+		WHERE 1=1
+		AND A.CPN_ID = #{cpnId}
+	</select>
+
 </mapper>

+ 4 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsaCustomer.xml

@@ -80,7 +80,9 @@
 	<!-- 활동회원목록 -->
 	<select id="getCustomerActiveList" parameterType="CustomerSearch" resultType="Customer">
 		/* TsaCustomer.getCustomerActiveList */
+		<if test='cpnPubPopYn != null and cpnPubPopYn != "Y"'>
 		<include refid="selectForPagingHeader"/>
+		</if>
 		SELECT CUST_NO
 		     , CUST_ID
 		     , CUST_NM
@@ -194,7 +196,9 @@
 		<if test="custId != null and custId != ''">
 		AND    CUST_ID = #{custId}
 		</if>
+		<if test='cpnPubPopYn != null and cpnPubPopYn != "Y"'>
 		<include refid="selectForPagingFooter"/>
+		</if>
 	</select>
 
 	<!--회원정보 수정-->

+ 19 - 19
src/main/java/com/style24/persistence/mybatis/shop/TsaFreegiftPromotion.xml

@@ -186,14 +186,14 @@
 			 , DATE_FORMAT(FG.REG_DT, '%Y.%m.%d %H:%i:%S') AS REG_DT
 			 , (SELECT USER_NM FROM TB_USER WHERE USER_NO = FG.UPD_NO) AS UPD_NM
 			 , DATE_FORMAT(FG.UPD_DT, '%Y.%m.%d %H:%i:%S') AS UPD_DT
-		FROM TB_FREEGIFT_GOODS FG
-		INNER JOIN TB_GOODS G
-		ON G.GOODS_CD = FG.TARGET_VAL
-		WHERE DEL_YN = 'N'
-		AND FG.TARGET_GB = 'G260_10'		/* G260_10|상품, G260_12|브랜드, G260_13|공급처 */
-		AND FG.GOODS_GB = #{goodsGb}		/* G800_10|기본상품, G800_20|적용상품, G800_30|제외상품, G800_40|ALL */
-		AND FG.FREEGIFT_SQ = #{freegiftSq}	/* 사은품 프로모션 번호 */
-		ORDER BY TARGET_VAL ASC
+		  FROM TB_FREEGIFT_GOODS FG
+		 INNER JOIN TB_GOODS G
+		    ON G.GOODS_CD = FG.TARGET_VAL
+		 WHERE DEL_YN = 'N'
+		   AND FG.TARGET_GB = 'G260_10'		/* G260_10|상품, G260_12|브랜드, G260_13|공급처 */
+		   AND FG.GOODS_GB = #{goodsGb}		/* G800_10|기본상품, G800_20|적용상품, G800_30|제외상품, G800_40|ALL */
+		   AND FG.FREEGIFT_SQ = #{freegiftSq}	/* 사은품 프로모션 번호 */
+		 ORDER BY TARGET_VAL ASC
 	</select>
 
 	<!-- 사은품 프로모션 섹션정보 리스트 조회 -->
@@ -202,10 +202,10 @@
 		SELECT FC.FREEGIFT_SECTION_SQ
 		     , FC.SECTION_GB
 		     , FC.SECTION_VAL
-		FROM   TB_FREEGIFT_SECTION FC
-		WHERE  FC.DEL_YN = 'N'
-		AND    FC.FREEGIFT_SQ = #{freegiftSq}	/* 사은품 프로모션 번호 */
-		ORDER BY FC.FREEGIFT_SECTION_SQ ASC
+		  FROM TB_FREEGIFT_SECTION FC
+		 WHERE FC.DEL_YN = 'N'
+		   AND FC.FREEGIFT_SQ = #{freegiftSq}	/* 사은품 프로모션 번호 */
+		 ORDER BY FC.FREEGIFT_SECTION_SQ ASC
 	</select>
 
 	<!-- 사은품 프로모션 섹션정보 리스트 조회 -->
@@ -219,13 +219,13 @@
 		     , FV.ITEM_CD
 			 , FG.PRODUCT_NO
 			 , FG.GOODS_NM
-		FROM TB_FREEGIFT_VAL FV
-		INNER JOIN TB_FREE_GOODS FG
-		ON FV.ITEM_CD = FG.PRODUCT_NO
-		WHERE FV.DEL_YN = 'N'
-		AND FV.FREEGIFT_SQ = #{freegiftSq}					/* 사은품 프로모션 번호 */
-		AND FV.FREEGIFT_SECTION_SQ = #{freegiftSectionSq}	/* 사은품 프로모션 섹션 번호 */
-		ORDER BY FV.FREEGIFT_SECTION_SQ, FV.ITEM_CD
+		  FROM TB_FREEGIFT_VAL FV
+		 INNER JOIN TB_FREE_GOODS FG
+		    ON FV.ITEM_CD = FG.PRODUCT_NO
+		 WHERE FV.DEL_YN = 'N'
+		   AND FV.FREEGIFT_SQ = #{freegiftSq}					/* 사은품 프로모션 번호 */
+		   AND FV.FREEGIFT_SECTION_SQ = #{freegiftSectionSq}	/* 사은품 프로모션 섹션 번호 */
+		 ORDER BY FV.FREEGIFT_SECTION_SQ, FV.ITEM_CD
 	</select>
 
 	<!-- 사은품 프로모션 마스터 정보 저장 -->

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

@@ -972,7 +972,7 @@
 		     , C.DISP_ORD
 		FROM TB_GOODS_NOTI_INFO C
 		INNER JOIN TB_GOODS B ON C.GOODS_CD = B.GOODS_CD
-        INNER JOIN TB_SUPPLY_COMPANY D ON B.SUPPLY_COMP_CD = D.SUPPLY_COMP_CD
+		INNER JOIN TB_SUPPLY_COMPANY D ON B.SUPPLY_COMP_CD = D.SUPPLY_COMP_CD
 		INNER JOIN TB_NOTI_INFO A ON C.NI_CLSF_CD = A.NI_CLSF_CD
 		                          AND C.NI_ITEM_CD = A.NI_ITEM_CD
 		                          AND A.SUPPLY_VENDOR_CD = CASE D.SUPPLY_VENDOR_CD

+ 39 - 55
src/main/java/com/style24/persistence/mybatis/shop/TsaMorebetter.xml

@@ -267,7 +267,7 @@
 			,DATE_FORMAT(#{tmtbStdt},'%Y-%m-%d %H:%i:%s')
 			,DATE_FORMAT(#{tmtbEddt},'%Y-%m-%d %H:%i:%s')
 			,#{applyGb}
-			,#{multiYn}
+			,'Y'
 			,'N'
 			,#{regNo}
 			,NOW()
@@ -279,7 +279,7 @@
 			,TMTB_STAT = #{tmtbStat}
 			,TMTB_ST_DT = #{tmtbStdt}
 			,TMTB_ED_DT = #{tmtbEddt}
-			,MULTI_YN = #{multiYn}
+			,APPLY_GB = #{applyGb}
 			,UPD_NO = #{updNo}
 			,UPD_DT = NOW()
 	</insert>
@@ -537,64 +537,48 @@
 	<insert id="createTmtbGoodsTemp" parameterType="MoreBetterGoods">
 		/* TsaMarketing.createTmtbGoodsTemp */
 		INSERT INTO TB_TMTB_USING_GOODS_TEMP
-			SELECT 	#{regNo} AS REG_NO
-			        ,B.GOODS_CD
-					,G.GOODS_NM
-			  FROM 	TB_TMTB A
-		INNER JOIN  TB_TMTB_APPLY_GOODS B
-				ON  A.TMTB_SQ = B.TMTB_SQ
-		INNER JOIN  TB_GOODS G
-				ON  B.GOODS_CD = G.GOODS_CD
+			SELECT Z.REG_NO
+				, Z.GOODS_CD
+				, Z.GOODS_NM
+			FROM (
+					SELECT 	#{regNo} AS REG_NO
+							, B.GOODS_CD
+							, G.GOODS_NM
+							, (SELECT SECTION_GB FROM TB_TMTB_SECTION WHERE A.TMTB_SQ = TMTB_SQ GROUP BY SECTION_GB) AS SECTION_GB
+					  FROM 	TB_TMTB A
+				INNER JOIN  TB_TMTB_APPLY_GOODS B
+						ON  A.TMTB_SQ = B.TMTB_SQ
+				INNER JOIN  TB_GOODS G
+						ON  B.GOODS_CD = G.GOODS_CD
+					WHERE 1=1
+					  AND NOW() BETWEEN DATE_FORMAT(A.TMTB_ST_DT, '%Y-%m-%d %H:%i:%S') AND DATE_FORMAT(A.TMTB_ED_DT, '%Y-%m-%d %H:%i:%S')
+					  AND A.TMTB_STAT = 'G232_11'
+					  AND B.GOODS_GB IN ('G800_10','G800_20')
+					  AND B.DEL_YN = 'N'
+					  AND B.GOODS_CD NOT IN (
+											SELECT	GOODS_CD
+											FROM	TB_TMTB_APPLY_GOODS C
+											WHERE	1=1
+											  AND		B.TMTB_SQ = C.TMTB_SQ
+											  AND		C.GOODS_GB = 'G800_30'
+										)
+			) Z
 			WHERE 1=1
-			  AND NOW() BETWEEN DATE_FORMAT(A.TMTB_ST_DT, '%Y-%m-%d %H:%i:%S') AND DATE_FORMAT(A.TMTB_ED_DT, '%Y-%m-%d %H:%i:%S')
-			  AND A.TMTB_STAT = 'G232_11'
-			  AND B.GOODS_GB IN ('G800_10','G800_20')
-			  AND B.DEL_YN = 'N'
-			  AND B.GOODS_CD NOT IN (
-									SELECT	GOODS_CD
-									FROM	TB_TMTB_APPLY_GOODS C
-									WHERE	1=1
-									  AND		B.TMTB_SQ = C.TMTB_SQ
-									  AND		C.GOODS_GB = 'G800_30'
-								)
+			AND Z.SECTION_GB = #{sectionGb}
 	</insert>
 
 	<select id="getMorebetterDuplicateList" parameterType="MoreBetterGoods" resultType="MoreBetterGoods">
 		/* TsaMarketing.getMorebetterDuplicateList */
-		SELECT TMP.GOODS_CD
-			  ,TMP.GOODS_NM
-		  FROM TB_TMTB_USING_GOODS_TEMP TMP
-		 WHERE 1=1
-		   AND TMP.REG_NO = #{regNo}
-		   AND TMP.GOODS_CD IN (
-				   SELECT  G.GOODS_CD
-					 FROM  TB_GOODS G
-					WHERE  1=1
-						<if test="multiSupplyCompCd != null and multiSupplyCompCd.length>0">
-							AND G.SUPPLY_COMP_CD IN
-							<foreach collection="multiSupplyCompCd" item="item" index="index"  open="(" close=")" separator=",">
-								#{item}
-							</foreach>
-						</if>
-						<if test="multiBrand != null and multiBrand.length>0">
-							AND G.BRAND_CD IN
-							<foreach collection="multiBrand" item="item" index="index"  open="(" close=")" separator=",">
-								#{item}
-							</foreach>
-						</if>
-						<if test="multiApplyGoods != null and multiApplyGoods.length>0">
-							OR G.GOODS_CD IN
-							<foreach collection="multiApplyGoods" item="item" index="index"  open="(" close=")" separator=",">
-								#{item}
-							</foreach>
-						</if>
-				)
-		   <if test="multiExceptGoods != null and multiExceptGoods.length>0">
-		   AND TMP.GOODS_CD NOT IN
-			   <foreach collection="multiExceptGoods" item="item" index="index"  open="(" close=")" separator=",">
-				   #{item}
-			   </foreach>
-		   </if>
+		SELECT 	B.REG_NO
+				, B.GOODS_CD
+				, B.GOODS_NM
+		FROM 	TB_TMTB_APPLY_GOODS_TEMP A
+		JOIN 	TB_TMTB_USING_GOODS_TEMP B
+			ON 	A.REG_NO = B.REG_NO
+			AND A.GOODS_CD = B.GOODS_CD
+		WHERE 1=1
+		  AND A.REG_NO = #{regNo}
+		;
 	</select>
 
 	<update id="updateMorebetterStat" parameterType="MoreBetter">

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

@@ -536,7 +536,7 @@
 
 	gridOptions.getRowStyle = function(params) {
 		if ("G008_00" == params.data.goodsStat  || "G008_10" == params.data.goodsStat || "G008_20" == params.data.goodsStat || "G008_30" == params.data.goodsStat) {
-			return { background: '#23c6c8' };
+			return { background: '#B5EAD7' };
 		}
 	}
 

+ 61 - 38
src/main/webapp/WEB-INF/views/marketing/CardInterestForm.html

@@ -101,29 +101,21 @@
 			valueGetter: function(params) { return cfnGridNumner('cardInterestSearchForm',params.node.rowIndex, 'A');}
 		},
 		{headerName: "프로모션ID", field: "cardPrmtSq", width: 130, cellClass: 'text-center'},
-		{headerName: "프로모션명", field: "prmtNm", width: 140, cellClass: 'text-center'
+		{headerName: "프로모션명", field: "prmtNm", width: 200, cellClass: 'text-center'
 			,cellRenderer: function(params) {
 				return '<a href="javascript:void(0);">' + params.value + '</a>';
 			}
 		},
-		{headerName: "노출여부", field: "dispYn", width: 180, cellClass: 'text-center'},
-		{headerName: "시작일", field: "prmtStd", width: 150, cellClass: 'text-center',
-			cellRenderer: function(params) {
-				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
-			}
-		},
-		{headerName: "종료일", field: "prmtEdd", width: 150, cellClass: 'text-center',
-			cellRenderer: function(params) {
-				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
-			}
-		},
-		{headerName: "수정자", field: "updNm" , width: 100, cellClass: 'text-center'},
+		{headerName: "노출여부", field: "dispYn", width: 100, cellClass: 'text-center'},
+		{headerName: "시작일", field: "prmtStd", width: 120, cellClass: 'text-center'},
+		{headerName: "종료일", field: "prmtEdd", width: 120, cellClass: 'text-center'},
+		{headerName: "수정자", field: "updNm" , width: 150, cellClass: 'text-center'},
 		{headerName: "수정일시", field: "updDt", width: 150, cellClass: 'text-center',
 			cellRenderer: function(params) {
 				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
 			}
 		},
-		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+		{headerName: "등록자", field: "regNm", width: 150, cellClass: 'text-center'},
 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center',
 			cellRenderer: function(params) {
 				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
@@ -140,9 +132,8 @@
 
 	// Row Click
 	gridOptions.onCellClicked = function(event) {
-		var goodsCd = event.data.goodsCd;
 		if (event.colDef.field == "prmtNm"){
-			
+			cardInterestPopup(event.data.cardPrmtSq);
 		}
 	}
 
@@ -255,10 +246,9 @@
 		
 		cfnOpenModalPopup(actionUrl, 'popupCardInterest'); 
 	}
-	
-	
-	//카드 프로모션 삭제
-	$('#btnCardPromotionDelete').click(function(e) {
+
+	//카드 프로모션 비노출
+	$('#btnCardPromotionDispUpdate').click(function(e) {
 		//상품선택여부 확인처리 추가
 		var selectedData = gridOptions.api.getSelectedRows();
 
@@ -267,32 +257,68 @@
 			return false;
 		}
 		
-		var arrGoodsCd = [];
-		var arrGoodsTnmResSq = [];
+		var arrCardPrmtSq = [];
 		var chkFlag = false;
-		//selectedData = gagaAgGrid.getAllRowData(gridOptions);
 		$.each(selectedData, function(idx, item) {
 			
-			if (gagajf.isNull(item.goodsTnmResSq) || item.goodsTnmResSq == "0"){
+			var toDateStr = new Date().format("YYYYMMDD");
+			if (toDateStr > item.prmtEdd.replace(/-/gi,'') ){
 				chkFlag = true;
-				mcxDialog.alert(item.goodsCd +"상품은 상품타이틀이 예약된 상품이 아닙니다.");
+				mcxDialog.alertC("종료된 무이자할부정보는 삭제할 수 없습니다.", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						gridOptions.api.setFocusedCell(idx, "prmtEdd", null);
+					}
+				});
 				return false;
 			}
+		
+			arrCardPrmtSq.push(item.cardPrmtSq);
+		});
+
+		if (chkFlag){
+			return;
+		}
+		
+		mcxDialog.confirm('비노출 처리 하시겠습니까? ',  {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var data = {arrCardPrmtSq : arrCardPrmtSq};
+				var jsonData = JSON.stringify(data);
+				gagajf.ajaxJsonSubmit('/marketing/card/promotion/dispYn/update', jsonData, fnCardPromotionDeleteCollBack);
+			}
+		});
+		
+	});
+	
+	//카드 프로모션 삭제
+	$('#btnCardPromotionDelete').click(function(e) {
+		//상품선택여부 확인처리 추가
+		var selectedData = gridOptions.api.getSelectedRows();
+
+		if (selectedData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return false;
+		}
+		
+		var arrCardPrmtSq = [];
+		var chkFlag = false;
+		$.each(selectedData, function(idx, item) {
 			
-			var toDateStr = new Date().format("YYYYMMDDHHmmss");
-			if (toDateStr > item.applyEddt){
+			var toDateStr = new Date().format("YYYYMMDD");
+			if (toDateStr > item.prmtEdd.replace(/-/gi,'') ){
 				chkFlag = true;
-				mcxDialog.alertC("종료된 예약 상품은 삭제할 수 없습니다.", {
+				mcxDialog.alertC("종료된 무이자할부정보는 삭제할 수 없습니다.", {
 					sureBtnText: "확인",
 					sureBtnClick: function() {
-						$('#goodsRsvtTnmForm input[name=applyEdYMD]').focus();
+						gridOptions.api.setFocusedCell(idx, "prmtEdd", null);
 					}
 				});
 				return false;
 			}
 		
-			arrGoodsCd.push(item.goodsCd);
-			arrGoodsTnmResSq.push(item.goodsTnmResSq);
+			arrCardPrmtSq.push(item.cardPrmtSq);
 		});
 
 		if (chkFlag){
@@ -303,18 +329,15 @@
 			cancelBtnText: "취소",
 			sureBtnText: "확인",
 			sureBtnClick: function(){
-				var data = {arrGoodsCd : arrGoodsCd
-						,arrGoodsTnmResSq : arrGoodsTnmResSq
-			};
-			
-			var jsonData = JSON.stringify(data);
-			gagajf.ajaxJsonSubmit('/goods/title/reserve/delete', jsonData, fnCardPromotionDeleteCollBack);
+				var data = {arrCardPrmtSq : arrCardPrmtSq};
+				var jsonData = JSON.stringify(data);
+				gagajf.ajaxJsonSubmit('/marketing/card/promotion/delete', jsonData, fnCardPromotionDeleteCollBack);
 			}
 		});
 	});
 	
 	var fnCardPromotionDeleteCollBack = function(){
-		//fnCardPromotionListSearch($();
+		fnCardPromotionListSearch();
 	}
 	
 	$(document).ready(function() {

+ 86 - 28
src/main/webapp/WEB-INF/views/marketing/CardInterestPopupForm.html

@@ -21,6 +21,9 @@
 				<button type="button" class="close" onclick="uifnPopupClose('popupCardInterest')"><i class="fa fa-times"></i></button>
 			</div>
 			<form id="cardInterestForm" name="cardInterestForm" >
+			<input type="hidden" name="prmtGb"  value="B"/> <!-- 무이자 -->
+			<input type="hidden" name="delCardPrmtCdtSq" /> <!-- 삭제할 프로모션조건 -->
+			
 			<div class="panelContent">
 				<table class="frmStyle">
 					<colgroup>
@@ -31,24 +34,22 @@
 					</colgroup>
 					<tr>
 						<th>프로모션명<em class="required" title="필수"></em></th>
-						<td><input type="text" class="w500" id="prmtNm" name="prmtNm"  maxlength="30" required="required" data-valid-name="프로모션명" /></td>
+						<td><input type="text" class="w500" id="prmtNm" name="prmtNm"  maxlength="30" required="required" data-valid-name="프로모션명"  th:value="${cardPrmt.prmtNm}"/></td>
 						<th>프로모션ID</th>
-						<td><input type="text" class="w100 formControl" id="cardPrmtSq" name="cardPrmtSq"  readonly/></td>
+						<td><input type="text" class="w100 formControl" id="cardPrmtSq" name="cardPrmtSq"  readonly th:value="${cardPrmt.cardPrmtSq}"/></td>
 					</tr>
 					<tr>
 						<th>행사기간<em class="required" title="필수"></em></th>
 						<td >
-							<input name="prmtStdYMD" id="prmtStdYMD" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="행사시작일" />
-							<input name="prmtStd" id="prmtStd" type="hidden" />
+							<input name="prmtStd" id="prmtStd" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="행사시작일" th:value="${cardPrmt.prmtStd}"/>
 							~
-							<input name="prmtEddYMD" id="prmtEddYMD" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="행사종료일" />
-							<input name="prmtEdd" id="prmtEdd" type="hidden" />
+							<input name="prmtEdd" id="prmtEdd" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="행사종료일" th:value="${cardPrmt.prmtEdd}"/>
 						</td>
 						<th>노출여부<em class="required" title="필수"></em></th>
 						<td >
-							<label class="rdoBtn"><input type="radio" name="dispYn" value="Y"  checked/>Y</label>
-							<label class="rdoBtn"><input type="radio" name="dispYn" value="N"/>N</label>
-							<input type="hidden" id="dispYnOrg" name="dispYnOrg"/>
+							<label class="rdoBtn"><input type="radio" name="dispYn" value="Y" th:checked="${cardPrmt.dispYn =='Y' or #strings.isEmpty(cardPrmt.dispYn)}"/>Y</label>
+							<label class="rdoBtn"><input type="radio" name="dispYn" value="N" th:checked="${cardPrmt.dispYn =='N'}"/>N</label>
+							<input type="hidden" id="dispYnOrg" name="dispYnOrg" th:value="${cardPrmt.dispYn}"/>
 						</td>
 					</tr>
 					<tr>
@@ -63,16 +64,34 @@
 									<col/>
 								</colgroup>
 								<tbody id="cardContionList">
-								<tr>
+								
+								<tr th:if="${#lists.isEmpty(cardPrmt.cardPrmtCdtList)}" >
 									<td style="height:100px;"></td>
-									<td><p class="dot">무이자개월 <input type="text" class="w100"  name="minNoItrt" data-valid-type="numeric" required="required" data-valid-name="무이자개월"/>개월 ~
-										<input type="text" class="w100"  name="maxNoItrt" data-valid-type="numeric" required="required" data-valid-name="무이자개월"/>개월</p>
-										<p class="dot">구매금액기준 <input type="text" class="w100"  name="minPayAmt" data-valid-type="numeric" required="required" data-valid-name="구매금액기준"/>원 이상 구매시</p>
-										<p class="dot">대상카드 <button type="button" class="btn btn-base btn-sm" onClick="fnCardAdd(1);">선택</button><br/><span id="arrCardNm1" class="cRed"></span></p>
+									<td><p class="dot">무이자개월 <input type="text" class="w100"  name="arrMinNoItrt" data-valid-type="numeric" required="required" data-valid-name="무이자개월" />개월 ~
+										<input type="text" class="w100"  name="arrMaxNoItrt" data-valid-type="numeric" required="required" data-valid-name="무이자개월" />개월</p>
+										<p class="dot">구매금액기준 <input type="text" class="w100"  name="arrMinPayAmt" data-valid-type="numeric" required="required" data-valid-name="구매금액기준" />원 이상 구매시</p>
+										<p class="dot">대상카드 <button type="button" class="btn btn-base btn-sm" onClick="fnCardAdd(1);">선택</button><br/>
+										<span id="arrCardNm1" class="cRed"></span></p>
 										<input type="hidden" name="arrCardCd"/>
+										<input type="hidden" name="cardPrmtCdtSq" />
 										<input type="hidden" name="cardIdx" id="cardIdx"/>
 									</td>
 								</tr>
+								<tr th:if="${cardPrmt.cardPrmtCdtList}" th:each="cardPrmtCdt, sizeStatus : ${cardPrmt.cardPrmtCdtList}">
+									<td style="height:100px;" th:if="${sizeStatus.first}"></td>
+									<td style="height:100px;" th:unless="${sizeStatus.first}"><button type="button" class="btn icn"><i class="fa fa-times" aria-hidden="true" th:onclick="fnDeleteCardPrmtCdt([[${cardPrmtCdt.cardPrmtCdtSq}]]);$(this).parent().parent().parent().remove();return false;"></i></button></td>
+									<td>
+										<p class="dot">무이자개월 <input type="text" class="w100"  name="arrMinNoItrt" data-valid-type="numeric" required="required" data-valid-name="무이자개월" th:value="${cardPrmtCdt.minNoItrt}"/>개월 ~
+										<input type="text" class="w100"  name="arrMaxNoItrt" data-valid-type="numeric" required="required" data-valid-name="무이자개월" th:value="${cardPrmtCdt.maxNoItrt}"/>개월</p>
+										<p class="dot">구매금액기준 <input type="text" class="w100"  name="arrMinPayAmt" data-valid-type="numeric" required="required" data-valid-name="구매금액기준" th:value="${cardPrmtCdt.minPayAmt}"/>원 이상 구매시</p>
+										<p class="dot">대상카드 <button type="button" class="btn btn-base btn-sm" th:onClick="fnCardAdd([[${sizeStatus.count}]]);">선택</button><br/>
+										<span th:id="${'arrCardNm'+ sizeStatus.count}" class="cRed"  th:text="${cardPrmtCdt.arrCardNm}"></span>
+										</p>
+										<input type="hidden" name="arrCardCd" th:value="${cardPrmtCdt.arrCardCd}"/>
+										<input type="hidden" name="cardPrmtCdtSq" th:value="${cardPrmtCdt.cardPrmtCdtSq}"/>
+										<input type="hidden" name="cardIdx" id="cardIdx" th:if="${sizeStatus.first}"/>
+									</td>
+								</tr>
 								</tbody>
 							</table>
 							</div>
@@ -81,17 +100,17 @@
 					<tr>
 						<th>부분무이자안내</th>
 						<td  colspan="3">
-						<textarea class="textareaR2" name="note" id="note"></textarea>
+						<textarea class="textareaR2" name="note" id="note" th:field="${cardPrmt.note}"></textarea>
 						</td>
 					</tr>
 				</table>
 			</div>
 			<ul class="panelBar">
 				<li class="left">
-					<button type="button" class="btn btn-danger btn-lg" id="btnDeleteGoodsRsvtTnm">상품삭제</button>
+					<button type="button" class="btn btn-danger btn-lg" id="btnCardInterestDelete" th:if="${cardPrmtSq}">삭제</button>
 				</li>	
 				<li class="right">
-					<button type="button" class="btnRight btn btn-success btn-lg" id="btnSaveCardInterest">적용</button>
+					<button type="button" class="btnRight btn btn-success btn-lg" id="btnCardInterestSave">적용</button>
 				</li>
 			</ul>
 			</form>	
@@ -114,11 +133,12 @@
 		var cardHtml = "";
 		cardHtml +='<tr>';
 		cardHtml +='	<td style="height:100px;"><button type="button" class="btn icn"><i class="fa fa-times" aria-hidden="true" onclick="$(this).parent().parent().parent().remove();return false;"></i></button></td>';
-		cardHtml +='	<td><p class="dot">무이자개월 <input type="text" class="w100"  name="minNoItrt" data-valid-type="numeric" required="required" data-valid-name="무이자개월"/>개월 ~';
-		cardHtml +='	<input type="text" class="w100"  name="maxNoItrt" data-valid-type="numeric" required="required" data-valid-name="무이자개월"/>개월</p>';
-		cardHtml +='	<p class="dot">구매금액기준 <input type="text" class="w100"  name="minPayAmt" data-valid-type="numeric" required="required" data-valid-name="구매금액기준"/>원 이상 구매시</p>';
+		cardHtml +='	<td><p class="dot">무이자개월 <input type="text" class="w100"  name="arrMinNoItrt" data-valid-type="numeric" required="required" data-valid-name="무이자개월"/>개월 ~';
+		cardHtml +='	<input type="text" class="w100"  name="arrMaxNoItrt" data-valid-type="numeric" required="required" data-valid-name="무이자개월"/>개월</p>';
+		cardHtml +='	<p class="dot">구매금액기준 <input type="text" class="w100"  name="arrMinPayAmt" data-valid-type="numeric" required="required" data-valid-name="구매금액기준"/>원 이상 구매시</p>';
 		cardHtml +='	<p class="dot">대상카드 <button type="button" class="btn btn-base btn-sm" onClick="fnCardAdd('+ (len+1) +');">선택</button><br/><span id="arrCardNm'+(len+1)+'" class="cRed"></span></p>';
 		cardHtml +='	<input type="hidden" name="arrCardCd"/>';
+		cardHtml +='	<input type="hidden" name="cardPrmtCdtSq" />';
 		cardHtml +='	</td>';
 		cardHtml +='</tr>';
 		
@@ -137,11 +157,49 @@
 	var fnCardAddCallBakup = function(arrCardCd, arrCardNm) {
 		var index = $('#cardInterestForm').find('#cardIdx').val();
 		$('#cardInterestForm').find("#arrCardNm" + (index)).html(arrCardNm);
-		$('#cardInterestForm').find("input[name=arrCardCd]").eq(index-1).val(arrCardCd);
-	};
+		$('#cardInterestForm input[name=arrCardCd]').eq(index-1).val(arrCardCd);
+	}
+	
+	// 카드프로모션 조건 삭제항목 설정
+	var fnDeleteCardPrmtCdt = function(cardPrmtCdtSq){
+		var delCardPrmtCdtSq = $('#cardInterestForm input[name=delCardPrmtCdtSq]').val();
+		delCardPrmtCdtSq += "/" + cardPrmtCdtSq; 
+		$('#cardInterestForm input[name=delCardPrmtCdtSq]').val(delCardPrmtCdtSq);
+	}
+	
+	//카드 프로모션 삭제
+	$('#btnCardInterestDelete').click(function(e) {
+		var arrCardPrmtSq = [];
+		
+		var toDateStr = new Date().format("YYYYMMDD");
+		var prmtEdd = $('#cardInterestForm input[name=prmtEdd]').val();
+		if (toDateStr > prmtEdd.replace(/-/gi,'') ){
+			chkFlag = true;
+			mcxDialog.alertC("종료된 무이자할부정보는 삭제할 수 없습니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$('#cardInterestForm input[name=prmtEdd]').focus();
+				}
+			});
+			return false;
+		}
+	
+		arrCardPrmtSq.push($('#cardInterestForm input[name=cardPrmtSq]').val());
+		
+		mcxDialog.confirm('삭제하시겠습니까? <br/> 삭제한 프로모션은 복구할수 없습니다.',  {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var data = {arrCardPrmtSq : arrCardPrmtSq};
+				var jsonData = JSON.stringify(data);
+				gagajf.ajaxJsonSubmit('/marketing/card/promotion/delete', jsonData, fnSaveCardInterestCallBack);
+			}
+		});
+	});
+	
 	
 	// 저장 클릭 시
-	$('#btnSaveCardInterest').on('click', function() {
+	$('#btnCardInterestSave').on('click', function() {
 		
 		var optCheck = false;
 		// 입력 값 체크
@@ -150,9 +208,9 @@
 		
 		var idx = 0;
 		$('#cardInterestForm').find('#cardContionList tr').each(function() {
-			var minNoItrt = $(this).find("input[name=minNoItrt]").val();
-			var maxNoItrt = $(this).find("input[name=maxNoItrt]").val();
-			var minPayAmt = $(this).find("input[name=minPayAmt]").val();
+			var minNoItrt = $(this).find("input[name=arrMinNoItrt]").val();
+			var maxNoItrt = $(this).find("input[name=arrMaxNoItrt]").val();
+			var minPayAmt = $(this).find("input[name=arrMinPayAmt]").val();
 			var arrCardCd = $(this).find("input[name=arrCardCd]").val();
 			
 			if (Number(minNoItrt) > Number(maxNoItrt)){
@@ -160,7 +218,7 @@
 				mcxDialog.alertC("무이자개월수를 확인해주세요", {
 					sureBtnText: "확인",
 					sureBtnClick: function() {
-						$('#cardInterestForm').find('#cardContionList tr').find("input[name=maxNoItrt]").eq(idx).focus();
+						$('#cardInterestForm').find('#cardContionList tr').find("input[name=arrMaxNoItrt]").eq(idx).focus();
 					}
 				});
 				return false;
@@ -171,7 +229,7 @@
 				mcxDialog.alertC("구매기준금액을 확인해주세요", {
 					sureBtnText: "확인",
 					sureBtnClick: function() {
-						$('#cardInterestForm').find('#cardContionList tr').find("input[name=minPayAmt]").eq(idx).focus();
+						$('#cardInterestForm').find('#cardContionList tr').find("input[name=arrMinPayAmt]").eq(idx).focus();
 					}
 				});
 				return false;

+ 1 - 1
src/main/webapp/WEB-INF/views/marketing/CardListPopupForm.html

@@ -26,7 +26,7 @@
 					<tr>
 						<td id="cardArea">
 							<th:block th:if="${cardList}" th:each="oneData, status : ${cardList}">
-							<label class="chkBox" th:classappend="${not #strings.isEmpty(params.arrCard) and  #strings.contains(params.arrCard,oneData.cd)?'checked':''}"><input type="checkbox" name="card" th:value="${oneData.cd}" th:text="${oneData.cdNm}" th:checked="${not #strings.isEmpty(params.arrCard) and  #strings.contains(params.arrCard,oneData.cd)}">국민</label>
+							<label class="chkBox" th:classappend="${not #strings.isEmpty(params.arrCard) and  #strings.contains(params.arrCard,oneData.cd)?'checked':''}"><input type="checkbox" name="card" th:value="${oneData.cd}" th:text="${oneData.cdNm}" th:checked="${not #strings.isEmpty(params.arrCard) and  #strings.contains(params.arrCard,oneData.cd)}"></label>
 							</th:block>
 						</td>
 					</tr>

+ 364 - 0
src/main/webapp/WEB-INF/views/marketing/CardPromotionForm.html

@@ -0,0 +1,364 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : CardPromotionForm.html
+ * @desc    : 카드프로모션관리
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.03   eskim       최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<form id="cardPromotionSearchForm" name="cardPromotionSearchForm" action="#" th:action="@{'/marketing/card/promotion/list'}">
+		<input type="hidden" id="prmtGb" name="prmtGb" value="B" /> <!-- 무이자 -->
+ 		<!-- 패널 영역1 -->
+		<div class="panelStyle" >
+			<div class="panelTitle">
+				<h3><i class="fa fa-info-circle"></i>아래 검색조건 중 하나를 꼭 입력해 주세요.</h3>
+			</div>
+			<div class="panelContent">
+				<table class="frmStyle">
+					<colgroup>
+						<col width="10%"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>구분</th>
+						<td>
+							<label class="rdoBtn"><input type="radio" name="search"  value="1"  checked/>프로모션ID</label>
+							<label class="rdoBtn"><input type="radio" name="search"  value="2"/>프로모션명</label>
+							<input type="text" class="w300" maxlength="30" name="condition"/>
+						</td>
+					</tr>
+					<tr>
+						<th>기간</th>
+						<td id="sellTerms"></td>
+					</tr>
+				</table>
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-gray btn-lg" id="btnInit" >초기화</button>
+						<button type="button" class="btn btn-info btn-lg" id="btnSearch" >조회</button>
+					</li>
+				</ul>	
+			</div>
+			<!-- //검색조건 영역 -->
+		</div>
+		<!-- 패널 영역1 -->
+		<div class="panelStyle">
+			<!-- 검색결과 영역 -->
+			<!-- 상단버튼 영역  -->
+			<ul class="panelBar">
+				<li>
+					<button type="button" class="btn btn-danger btn-lg" id="btnCardPromotionDispUpdate">선택비노출</button>
+					<button type="button" class="btn btn-danger btn-lg" id="btnCardPromotionDelete">선택삭제</button>
+				</li>
+				<li class="right">
+					<button type="button" class="btn btn-primary btn-lg" id="btnCardPromotionSave">등록</button>
+					검색결과 : <strong><span id="gridRowTotalCount">0</span> 건</strong>&nbsp;
+					
+					쪽번호 <span id="pgNo">0</span>/ <strong id="endPgNo">0</strong>&nbsp;&nbsp;
+					<select id="pageSize" name="pageSize">
+						<option value="50" selected="selected">50개씩 보기</option>
+						<option value="100">100개씩 보기</option>
+						<option value="500">500개씩 보기</option>
+						<option value="1000">1000개씩 보기</option>
+					</select>
+					<input type="hidden" name="pageNo" id="pageNo" value ="1"/>
+				</li>
+			</ul>
+			<!-- //상단버튼 영역  -->
+			<div id="gridList" style="width: 100%; height: 550px;" class="ag-theme-balham"></div>
+			<ul class="panelBar">
+				<li class="center">
+					<div class="tablePaging" id="cardListPagination"></div>
+				</li>
+			</ul>
+			<!-- 검색결과 영역 -->
+		</div>
+		</form>
+		<!-- //패널 영역2 -->
+	</div>
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.paging.js?v=2019072202"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	var dcGbList = { "1":"즉시할인", "2":"청구할인", "3":"제휴카드" };
+	var columnDefs = [
+		{width: 40, minWidth: 40, cellClass: 'text-right', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: 'No', width: 60, cellClass: 'text-center',
+			valueGetter: function(params) { return cfnGridNumner('cardPromotionSearchForm',params.node.rowIndex, 'A');}
+		},
+		{headerName: "프로모션ID", field: "cardPrmtSq", width: 130, cellClass: 'text-center'},
+		{headerName: "프로모션명", field: "prmtNm", width: 200, cellClass: 'text-center'
+			,cellRenderer: function(params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{headerName: "행사구분", field: "dcGb", width: 120, cellClass: 'text-center',
+			cellEditorParams: { values: gagaAgGrid.extractValues(dcGbList) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(dcGbList, params.value); }
+		},
+		{headerName: "할인조건", field: "minPayAmt", width: 150, cellClass: 'text-center'},
+		{headerName: "할인액", field: "dcVal", width: 150, cellClass: 'text-center'},
+		{headerName: "노출여부", field: "dispYn", width: 100, cellClass: 'text-center'},
+		{headerName: "시작일", field: "prmtStd", width: 120, cellClass: 'text-center'},
+		{headerName: "종료일", field: "prmtEdd", width: 120, cellClass: 'text-center'},
+		{headerName: "수정자", field: "updNm" , width: 150, cellClass: 'text-center'},
+		{headerName: "수정일시", field: "updDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
+			}
+		},
+		{headerName: "등록자", field: "regNm", width: 150, cellClass: 'text-center'},
+		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
+			}
+		}
+	];
+	
+	// Get GridOptions
+	var gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	// 중복 선택 가능
+	gridOptions.rowSelection = 'multiple';
+	gridOptions.suppressRowClickSelection = true;
+
+	// Row Click
+	gridOptions.onCellClicked = function(event) {
+		if (event.colDef.field == "prmtNm"){
+			cardPromotionPopup(event.data.cardPrmtSq);
+		}
+	}
+
+	// 초기화 클릭시
+	$('#btnInit').on('click', function() {
+		fnInit();
+	});
+	
+	var fnInit = function(){
+		$('#cardPromotionSearchForm')[0].reset();
+	}
+	
+	// 조회클릭시
+	$('#btnSearch').on('click', function() {
+		$("#cardPromotionSearchForm input[name=pageNo]").val('1');
+		fnCardPromotionListSearch();
+	});
+
+	// 조회
+	var fnCardPromotionListSearch = function() {
+		
+		if(!fnConditionCheck()) return;
+		
+		gagaPaging.init('cardPromotionSearchForm', fnSearchCallBack, 'cardListPagination', $('#cardPromotionSearchForm').find('#pageSize').val());
+		gagaPaging.load($("#cardPromotionSearchForm input[name=pageNo]").val());
+	}
+
+	//검색 조건 확인
+	var fnConditionCheck = function(){
+		var formId = '#cardPromotionSearchForm';
+		var form = document.cardPromotionSearchForm;
+
+		var searchFlag = false;
+		var cnt = 0;
+		
+		for (i = 0; i < form.elements.length; i++ ) {
+			var el = form.elements[i];
+			if ($(el).prop("type") == "text" || $(el).prop("type") == "textarea" || ($(el).prop("type") == "select-one" && 
+					el.name != "search" && el.name != "pageSize" && el.name != "beforSkipFlag")) {
+				if (!(el.value == null || el.value == "")) {
+					cnt++;
+				}
+			}
+		}
+		
+		if(cnt > 0) searchFlag = true;
+		
+		if(searchFlag == false){
+			mcxDialog.alert("검색조건을 입력하세요.");
+			return false;
+		}
+		
+		var fromDate = $('#cardPromotionSearchForm input[name=stDate]').val();
+		var toDate = $('#cardPromotionSearchForm input[name=edDate]').val();
+		
+		if (!gagajf.isNull(fromDate) || !gagajf.isNull(toDate)) {
+			
+			if (gagajf.isNull(fromDate) || gagajf.isNull(toDate)) {
+				mcxDialog.alertC("등록일 조회시 시작일자와 종료일자를 입력하세요.", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#cardPromotionSearchForm input[name=stDate]').focus();
+					}
+				});
+				return false;
+			}
+
+			if (fromDate > toDate) {
+				mcxDialog.alert("노출기간 시작일자는 종료일자 보다 클 수 없습니다.", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#cardPromotionSearchForm input[name=stDate]').focus();
+					}
+				});
+				return false;
+			} 
+		}
+
+		return true;
+	}
+	
+	var fnSearchCallBack = function(result){
+
+		$('#cardPromotionSearchForm').find('#gridRowTotalCount').html(result.pageing.pageable.totalCount.addComma());
+		$('#cardPromotionSearchForm').find('#pageNo').val(result.pageing.pageable.pageNo.addComma());
+		$('#cardPromotionSearchForm').find('#pgNo').html(result.pageing.pageable.pageNo.addComma());
+		$('#cardPromotionSearchForm').find('#endPgNo').html(result.pageing.pageable.totalPage.addComma());
+		gridOptions.api.setRowData(result.cardPromotionList);
+		gagaPaging.createPagination(result.pageing.pageable);
+	}
+	
+	//페이징 
+	$('#cardPromotionSearchForm select[name=pageSize]').on('change', function() {
+		$("#cardPromotionSearchForm input[name=pageNo]").val('1');
+		fnCardPromotionListSearch($("#cardPromotionSearchForm input[name=searchGb]").val());
+	});
+	
+	//카드 무이자 팝업
+	$('#btnCardPromotionSave').click(function(e) {
+		cardPromotionPopup();
+	});
+	
+	var cardPromotionPopup = function(cardPrmtSq){
+		var actionUrl = "/marketing/card/promotion/popup/form/";
+		if (typeof(cardPrmtSq) != 'undefined' && cardPrmtSq != null ){
+			actionUrl += cardPrmtSq;
+		}else{
+			actionUrl += 0;
+		}
+		
+		cfnOpenModalPopup(actionUrl, 'popupCardPromotion'); 
+	}
+
+	//카드 프로모션 비노출
+	$('#btnCardPromotionDispUpdate').click(function(e) {
+		//상품선택여부 확인처리 추가
+		var selectedData = gridOptions.api.getSelectedRows();
+
+		if (selectedData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return false;
+		}
+		
+		var arrCardPrmtSq = [];
+		var chkFlag = false;
+		$.each(selectedData, function(idx, item) {
+			
+			var toDateStr = new Date().format("YYYYMMDD");
+			if (toDateStr > item.prmtEdd.replace(/-/gi,'') ){
+				chkFlag = true;
+				mcxDialog.alertC("종료된 무이자할부정보는 삭제할 수 없습니다.", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						gridOptions.api.setFocusedCell(idx, "prmtEdd", null);
+					}
+				});
+				return false;
+			}
+		
+			arrCardPrmtSq.push(item.cardPrmtSq);
+		});
+
+		if (chkFlag){
+			return;
+		}
+		
+		mcxDialog.confirm('비노출 처리 하시겠습니까? ',  {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var data = {arrCardPrmtSq : arrCardPrmtSq};
+				var jsonData = JSON.stringify(data);
+				gagajf.ajaxJsonSubmit('/marketing/card/promotion/dispYn/update', jsonData, fnCardPromotionDeleteCollBack);
+			}
+		});
+		
+	});
+	
+	//카드 프로모션 삭제
+	$('#btnCardPromotionDelete').click(function(e) {
+		//상품선택여부 확인처리 추가
+		var selectedData = gridOptions.api.getSelectedRows();
+
+		if (selectedData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return false;
+		}
+		
+		var arrCardPrmtSq = [];
+		var chkFlag = false;
+		$.each(selectedData, function(idx, item) {
+			
+			var toDateStr = new Date().format("YYYYMMDD");
+			if (toDateStr > item.prmtEdd.replace(/-/gi,'') ){
+				chkFlag = true;
+				mcxDialog.alertC("종료된 무이자할부정보는 삭제할 수 없습니다.", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						gridOptions.api.setFocusedCell(idx, "prmtEdd", null);
+					}
+				});
+				return false;
+			}
+		
+			arrCardPrmtSq.push(item.cardPrmtSq);
+		});
+
+		if (chkFlag){
+			return;
+		}
+		
+		mcxDialog.confirm('삭제하시겠습니까? <br/> 삭제한 프로모션은 복구할수 없습니다.',  {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var data = {arrCardPrmtSq : arrCardPrmtSq};
+				var jsonData = JSON.stringify(data);
+				gagajf.ajaxJsonSubmit('/marketing/card/promotion/delete', jsonData, fnCardPromotionDeleteCollBack);
+			}
+		});
+	});
+	
+	var fnCardPromotionDeleteCollBack = function(){
+		fnCardPromotionListSearch();
+	}
+	
+	$(document).ready(function() {
+
+		cfnCreateCalendar('#sellTerms', 'stDate', 'edDate', true, '기간', 'X');
+		var chkBeforSkipFlag = '&nbsp;&nbsp;<label class="chkBox"><input type="checkbox" name="beforSkipFlag" value="Y" >이전데이터 제외</label>';
+		$("#cardPromotionSearchForm").find('#sellTerms').append(chkBeforSkipFlag);
+		
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+
+	});
+
+/*]]>*/
+</script>
+ 	
+</html>

+ 303 - 0
src/main/webapp/WEB-INF/views/marketing/CardPromotionPopupForm.html

@@ -0,0 +1,303 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : CardPromotionPopupForm.html
+ * @desc    : 카드프로모션 팝업 화면
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2019 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.03   eskim       최초 작성
+ *******************************************************************************
+ -->	
+	<div class="modalPopup" data-width="1000"> <!-- data-width="850"  -->
+		<div class="panelStyle">
+			<div class="panelTitle">
+				<h2>프로모션<th:block th:text="${cardPrmtSq > 0 }?'상세':'등록'"></th:block> </h2>
+				<button type="button" class="close" onclick="uifnPopupClose('popupCardPromotion')"><i class="fa fa-times"></i></button>
+			</div>
+			<form id="cardPromotionForm" name="cardPromotionForm" >
+			<input type="hidden" name="prmtGb"  value="A"/> <!-- 할인 -->
+			<input type="hidden" name="delCardPrmtCdtSq" /> <!-- 삭제할 프로모션조건 -->
+			
+			<div class="panelContent">
+				<table class="frmStyle">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:50%;"/>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>프로모션명<em class="required" title="필수"></em></th>
+						<td><input type="text" class="w500" id="prmtNm" name="prmtNm"  maxlength="30" required="required" data-valid-name="프로모션명"  th:value="${cardPrmt.prmtNm}"/></td>
+						<th>프로모션ID</th>
+						<td><input type="text" class="w100 formControl" id="cardPrmtSq" name="cardPrmtSq"  readonly th:value="${cardPrmt.cardPrmtSq}"/></td>
+					</tr>
+					<tr>
+						<th>행사기간<em class="required" title="필수"></em></th>
+						<td >
+							<input name="prmtStd" id="prmtStd" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="행사시작일" th:value="${cardPrmt.prmtStd}"/>
+							~
+							<input name="prmtEdd" id="prmtEdd" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="행사종료일" th:value="${cardPrmt.prmtEdd}"/>
+						</td>
+						<th>노출여부<em class="required" title="필수"></em></th>
+						<td >
+							<label class="rdoBtn"><input type="radio" name="dispYn" value="Y" th:checked="${cardPrmt.dispYn =='Y' or #strings.isEmpty(cardPrmt.dispYn)}"/>Y</label>
+							<label class="rdoBtn"><input type="radio" name="dispYn" value="N" th:checked="${cardPrmt.dispYn =='N'}"/>N</label>
+							<input type="hidden" id="dispYnOrg" name="dispYnOrg" th:value="${cardPrmt.dispYn}"/>
+						</td>
+					</tr>
+					<tr>
+						<th>행사구분<em class="required" title="필수"></em></th>
+						<td colspan="3" >
+							<label class="rdoBtn"><input type="radio" name="dcGb" value="1" th:checked="${cardPrmt.dcGb =='1' or #strings.isEmpty(cardPrmt.dcGb)}" th:disabled="${cardPrmtSq > 0}"/>즉시할인</label>
+							<label class="rdoBtn"><input type="radio" name="dcGb" value="2" th:checked="${cardPrmt.dcGb =='2'}" th:disabled="${cardPrmtSq > 0}"/>청구할인</label>
+							<label class="rdoBtn"><input type="radio" name="dcGb" value="3" th:checked="${cardPrmt.dcGb =='3'}" th:disabled="${cardPrmtSq > 0}"/>제휴카드</label>
+						</td>
+					</tr>
+					<tr>
+						<th>행사조건<em class="required" title="필수"></em></th>
+						<td colspan="3" >
+							<th:block th:if="${#lists.isEmpty(cardPrmt.cardPrmtCdtList)}"  >
+								<span id="contionArea">
+								<label class="rdoBtn"><input type="radio" name="dcWay" value="G240_10" checked/> 정액할인</label>
+								<label class="rdoBtn"><input type="radio" name="dcWay" value="G240_11" />정율할인</label>
+								<p>구매금액기준 <input type="text" class="w100"  name="minPayAmt" data-valid-type="numeric"  data-valid-name="구매금액기준" /> 원 이상 구매시
+								<input type="text" class="w100"  name="dcVal" data-valid-type="numeric"  data-valid-name="할인" /> 할인(율/액)</p>
+								<p>최대할인금액 <input type="text" class="w100"  name="maxDcAmt" data-valid-type="numeric"  data-valid-name="최대할인금액" /> 원</p>
+								</span>
+								<p>대상카드 <button type="button" class="btn btn-base btn-sm" onClick="fnCardAdd(1);">선택</button><br/>
+								<span id="arrCardNm1" class="cRed"></span></p>
+								<input type="hidden" name="arrCardCd"/>
+								<input type="hidden" name="cardPrmtCdtSq" />
+								<input type="hidden" name="cardIdx" id="cardIdx"/>
+							</th:block>
+							<th:block th:if="${cardPrmt.cardPrmtCdtList}" th:each="cardPrmtCdt, sizeStatus : ${cardPrmt.cardPrmtCdtList}">
+								<th:block  th:if="${sizeStatus.first}">
+									<span id="contionArea" th:if="${cardPrmt.dcGb !='3'}">
+									<label class="rdoBtn"><input type="radio" name="dcWay" value="G240_10" th:checked="${cardPrmtCdt.dcWay =='G240_10' or #strings.isEmpty(cardPrmtCdt.dcWay)}"/>정액할인</label>
+									<label class="rdoBtn"><input type="radio" name="dcWay" value="G240_11" th:checked="${cardPrmtCdt.dcWay =='G240_11'}"/>정율할인</label>
+									<p>구매금액기준 <input type="text" class="w100"  name="minPayAmt" data-valid-type="numeric"  data-valid-name="구매금액기준" th:value="${cardPrmtCdt.minPayAmt}"/> 원 이상 구매시
+									<input type="text" class="w100"  name="dcVal" data-valid-type="numeric"  data-valid-name="할인" th:value="${cardPrmtCdt.dcVal}"/> 할인(율/액)</p>
+									<p>최대할인금액 <input type="text" class="w100"  name="maxDcAmt" data-valid-type="numeric"  data-valid-name="최대할인금액" th:value="${cardPrmtCdt.maxDcAmt}"/> 원</p>
+									</span>
+									<p>대상카드 <button type="button" class="btn btn-base btn-sm" onClick="fnCardAdd([[${sizeStatus.count}]]);">선택</button><br/>
+									<span th:id="${'arrCardNm'+ sizeStatus.count}" class="cRed"  th:text="${cardPrmtCdt.arrCardNm}"></span>
+									<input type="hidden" name="arrCardCd" th:value="${cardPrmtCdt.arrCardCd}"/>
+									<input type="hidden" name="cardPrmtCdtSq" th:value="${cardPrmtCdt.cardPrmtCdtSq}"/>
+									<input type="hidden" name="cardIdx" id="cardIdx"/>
+								</th:block>
+							</th:block>
+
+						</td>
+					</tr>
+					<tr>
+						<th>연결 URL <div class="iconTooltip">
+									<i class="fa fa-info" aria-hidden="true"></i>
+									<span class="left" style="width:320px;">URL 입력 시 Front에서 바로가기 버튼이 노출됩니다.</span>
+								</div>
+						</th>
+						<td><input type="text" class="w500" id="linkUrl" name="linkUrl"  maxlength="150" data-valid-name="연결URL"  th:value="${cardPrmt.linkUrl}"/></td>
+					</tr>
+					<tr>
+						<th>유의사항</th>
+						<td  colspan="3">
+						<textarea class="textareaR2" name="note" id="note" th:field="${cardPrmt.note}"></textarea>
+						</td>
+					</tr>
+				</table>
+			</div>
+			<ul class="panelBar">
+				<li class="left">
+					<button type="button" class="btn btn-danger btn-lg" id="btnCardInterestDelete" th:if="${cardPrmtSq}">삭제</button>
+				</li>	
+				<li class="right">
+					<button type="button" class="btnRight btn btn-success btn-lg" id="btnCardPromotiontSave">적용</button>
+				</li>
+			</ul>
+			</form>	
+		</div>
+	</div>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	
+	//카드조회팝업
+	var fnCardAdd = function(idx){
+		$('#cardPromotionForm').find('#cardIdx').val(idx);
+		var arrCardCd = $('#cardPromotionForm').find("input[name=arrCardCd]").eq(idx-1).val();
+		cfnOpenCardListPopup('fnCardAddCallBakup', arrCardCd);	// /로 구분
+	}
+	
+	// 카드추가/삭제
+	var fnCardAddCallBakup = function(arrCardCd, arrCardNm) {
+		var index = $('#cardPromotionForm').find('#cardIdx').val();
+		$('#cardPromotionForm').find("#arrCardNm" + (index)).html(arrCardNm);
+		$('#cardPromotionForm input[name=arrCardCd]').eq(index-1).val(arrCardCd);
+	}
+	
+	// 카드프로모션 조건 삭제항목 설정
+	var fnDeleteCardPrmtCdt = function(cardPrmtCdtSq){
+		var delCardPrmtCdtSq = $('#cardPromotionForm input[name=delCardPrmtCdtSq]').val();
+		delCardPrmtCdtSq += "/" + cardPrmtCdtSq; 
+		$('#cardPromotionForm input[name=delCardPrmtCdtSq]').val(delCardPrmtCdtSq);
+	}
+	
+	//카드 프로모션 삭제
+	$('#btnCardInterestDelete').click(function(e) {
+		var arrCardPrmtSq = [];
+		
+		var toDateStr = new Date().format("YYYYMMDD");
+		var prmtEdd = $('#cardPromotionForm input[name=prmtEdd]').val();
+		if (toDateStr > prmtEdd.replace(/-/gi,'') ){
+			chkFlag = true;
+			mcxDialog.alertC("종료된 무이자할부정보는 삭제할 수 없습니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$('#cardPromotionForm input[name=prmtEdd]').focus();
+				}
+			});
+			return false;
+		}
+	
+		arrCardPrmtSq.push($('#cardPromotionForm input[name=cardPrmtSq]').val());
+		
+		mcxDialog.confirm('삭제하시겠습니까? <br/> 삭제한 프로모션은 복구할수 없습니다.',  {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var data = {arrCardPrmtSq : arrCardPrmtSq};
+				var jsonData = JSON.stringify(data);
+				gagajf.ajaxJsonSubmit('/marketing/card/promotion/delete', jsonData, fnSaveCardInterestCallBack);
+			}
+		});
+	});
+	
+	// 행사구분 변경시
+	$("#cardPromotionForm input[name=dcGb]").bind('click change', function () {debugger;
+		var cardPrmtSq = [[${cardPrmtSq}]];
+		// 수정시에는 미 적용
+		if (cardPrmtSq > 0){
+			return;
+		}
+		var radioValue = $(this).val();
+		// 제휴카드일 경우
+		if (radioValue == "3"){ 
+			$("#cardPromotionForm input[name=minPayAmt]").val('');
+			$("#cardPromotionForm input[name=dcVal]").val('');
+			$("#cardPromotionForm input[name=maxDcAmt]").val('');
+			$("#cardPromotionForm").find('#contionArea').removeClass('on').addClass('off');
+		}else{
+			$("#cardPromotionForm").find('#contionArea').removeClass('off').addClass('on');
+		}
+	});
+	
+	// 저장 클릭 시
+	$('#btnCardPromotiontSave').on('click', function() {
+		
+		var optCheck = false;
+		// 입력 값 체크
+		if (!gagajf.validation('#cardPromotionForm'))
+			return false;
+		
+		var idx = 0;
+		$('#cardPromotionForm').find('#cardContionList tr').each(function() {
+			var dcGb = $("#cardPromotionForm input[name=dcGb]").val();
+			var dcWay = $(this).find("input[name=dcWay]").val();
+			var minPayAmt = $(this).find("input[name=minPayAmt]").val();
+			var dcVal = $(this).find("input[name=dcVal]").val();
+			var maxDcAmt = $(this).find("input[name=maxDcAmt]").val();
+			var arrCardCd = $(this).find("input[name=arrCardCd]").val();
+			
+			if ("3" != dcGb){
+				
+				if (gagajf.isNull(minPayAmt) || Number(minPayAmt) < 10000){
+					optCheck = true;
+					mcxDialog.alertC("구매기준금액을 확인해주세요", {
+						sureBtnText: "확인",
+						sureBtnClick: function() {
+							$('#cardPromotionForm').find('#cardContionList tr').find("input[name=minPayAmt]").eq(idx).focus();
+						}
+					});
+					return false;
+				}
+				
+				if (gagajf.isNull(dcVal)){
+					optCheck = true;
+					mcxDialog.alertC("할인을 확인해주세요", {
+						sureBtnText: "확인",
+						sureBtnClick: function() {
+							$('#cardPromotionForm').find('#cardContionList tr').find("input[name=dcVal]").eq(idx).focus();
+						}
+					});
+					return false;
+				}
+				
+				
+				if (dcWay == 'G240_11' && (Number(dcVal) > 99)){
+					optCheck = true;
+					mcxDialog.alertC("할인율이 99보다 큽니다.확인해주세요", {
+						sureBtnText: "확인",
+						sureBtnClick: function() {
+							$('#cardPromotionForm').find('#cardContionList tr').find("input[name=dcVal]").eq(idx).focus();
+						}
+					});
+					return false;
+				}
+				
+				if (gagajf.isNull(maxDcAmt)){
+					optCheck = true;
+					mcxDialog.alertC("최대할인금액을 확인해주세요", {
+						sureBtnText: "확인",
+						sureBtnClick: function() {
+							$('#cardPromotionForm').find('#cardContionList tr').find("input[name=maxDcAmt]").eq(idx).focus();
+						}
+					});
+					return false;
+				}
+				
+			}
+			
+			if (gagajf.isNull(arrCardCd)){
+				optCheck = true;
+				mcxDialog.alert((idx+1)+"번째 행사조건의 대상카드를 선택해주세요")
+				return false;
+			}
+			
+			idx++;
+		});
+		
+		if (optCheck){
+			return false;
+		}
+		
+		mcxDialog.confirm('저장하시겠습니까?',  {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+
+				gagajf.ajaxFormSubmit("/marketing/card/interest/save", "#cardPromotionForm", fnSaveCardInterestCallBack); 
+
+			}
+		});
+	});
+
+	
+	//창종료
+	var fnSaveCardInterestCallBack = function(){
+		fnCardPromotionListSearch(); 	//본창 호출
+		uifnPopupClose('popupCardPromotion');
+		
+	}
+
+	$(document).ready(function() {
+
+	});
+
+/*]]>*/
+</script>
+</html>

+ 12 - 3
src/main/webapp/WEB-INF/views/marketing/CouponPopupForm.html

@@ -353,6 +353,7 @@
 									</tbody>
 								</table>
 								<div class="mdPopBtnB aR">
+									<button type="button" class="btn btn-info btn-lg" onclick="fnPubCustListPopUp();" th:if="${mode == 'U'}">발급받은회원</button>
 									<button type="button" class="btn btn-info btn-lg" onclick="fnCustomerIssuePopUp();" th:if="${mode == 'U' && cpnDetail.dcCdGb == 'G233_00'}">쿠폰발행</button>  <!-- 난수유형과 시리얼 유형에서는 쿠폰발행기능 X -->
 									<button type="button" class="btn btn-info btn-lg" onclick="fnCouponCreate();" th:if="${mode == 'N'}">등록</button>
 									<button type="button" class="btn btn-info btn-lg" onclick="fnCouponUpdate();" th:if="${mode == 'U'}">수정</button>
@@ -844,21 +845,21 @@
 		if(usableCustGbCnt<1){
 			mcxDialog.alert("사용가능고객구분을 체크해주세요.");
 			$('#CouponForm input:checkbox[name=usableCustGbArr]').focus();
-			return;
+			return false;
 		}
 		// 사용가능고객등급 체크박스 체크
 		var usableCustGradeCnt = $('#CouponForm input:checkbox[name=usableCustGradeArr]').length;
 		if(usableCustGradeCnt<1){
 			mcxDialog.alert("사용가능고객등급을 체크해주세요.");
 			$('#CouponForm input:checkbox[name=usableCustGradeArr]').focus();
-			return;
+			return false;
 		}
 		// 결제수단 체크박스 체크
 		var payTypeCnt = $('#CouponForm input:checkbox[name=payTypeArr]').length;
 		if(payTypeCnt<1){
 			mcxDialog.alert("사용가능고객등급을 체크해주세요.");
 			$('#CouponForm input:checkbox[name=payTypeArr]').focus();
-			return;
+			return false;
 		}
 
 		//신규가입 지급한다면 validation 체크
@@ -1457,6 +1458,14 @@
 
 		});
 	}
+
+	// 발급받은회원 팝업
+	var fnPubCustListPopUp = function (){
+		let cpnId = $("#CouponForm #cpnId").val();
+		var actionUrl = "/marketing/coupon/pubCust/popup/form?cpnId=" + cpnId;
+		cfnOpenModalPopup(actionUrl, 'CpnPubCustListPopup');
+	};
+
 	// 쿠폰발행팝업
 	function fnCustomerIssuePopUp(){
 		cfnCpnPubForCustPopup();

+ 72 - 0
src/main/webapp/WEB-INF/views/marketing/CouponPubCustListPopupForm.html

@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : CouponPubCustListPopupForm.html
+ * @desc    : 쿠폰 발급받은 회원리스트 팝업 화면
+ *============================================================================
+ * ISTYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.03   bin2107       최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="960" data-height="500" >
+	<div class="panelStyle" >
+		<div class="panelTitle">
+			<h2>쿠폰 발급받은 회원</h2>
+			<button type="button" class="close" onclick="uifnPopupClose('CpnPubCustListPopup')"><i class="fa fa-times"></i></button>
+		</div>
+		<div class="panelContent">
+			<div id="pubCustgridList" style="width:100%; height:420px;" class="ag-theme-balham"></div>
+		</div>
+	</div>
+</div>
+<script th:inline="javascript">
+	/*<![CDATA[*/
+	var cpnPubCustList = [[${cpnPubCustList}]]; //gagajf.convertToArray([[${cpnPubCustList}]]);
+
+	var columnDefs = [
+		{ headerName: "회원번호" , field:"custNo" , width:100, cellClass:"text-center"} ,
+		{ headerName: "회원명" , field:"custNm" , width:120, cellClass:"text-center" } ,
+		{ headerName: "회원구분" , field:"custGbNm" , width:120, cellClass:"text-center" } ,
+		{ headerName: "회원등급" , field:"custGradeNm" , width:120, cellClass:"text-center" } ,
+		{ headerName: "시작유효기간" , field:"availStdt" , width:150, cellClass:"text-center"
+			,valueGetter	: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.data.availStdt);
+			}
+		} ,
+		{ headerName: "종료유효기간" , field:"availEddt" , width:150, cellClass:"text-center"
+			,valueGetter	: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.data.availEddt);
+			}
+		} ,
+		{ headerName: "사용여부" , field:"useYn" , width:120, cellClass:"text-center" } ,
+		/*{ headerName: "사용일" , field:"usedDt" , width:150, cellClass:"text-center"
+			,valueGetter	: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.data.usedDt);
+			}
+		} ,*/
+		{ headerName: "발급사유" , field:"pubReasonNm" , width:200, cellClass:"text-center"} ,
+		{ headerName: "발급상세사유" , field:"pubReasonDtl" , width:200, cellClass:"text-center"} ,
+		{ headerName: "발급인ID" , field:"regNo" , width:100, cellClass:"text-center"} ,
+		{ headerName: "발급시간" , field:"regDt" , width:150, cellClass:"text-center"
+			,valueGetter	: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.data.regDt);
+			}
+		}
+	];
+
+	let pubCustGridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	$(document).ready(function(){
+		gagaAgGrid.createGrid('pubCustgridList', pubCustGridOptions);
+		pubCustGridOptions.api.setRowData(cpnPubCustList);
+	});
+
+	/*]]>*/
+</script>
+</html>

+ 16 - 2
src/main/webapp/WEB-INF/views/marketing/CouponPubForCustPopupForm.html

@@ -22,6 +22,7 @@
 		</div>
 		<div class="panelContent">
 			<form id="custSearchForm" name="custSearchForm" action="#" th:action="@{'/customer/active/list'}" >
+				<input type="hidden" name="cpnPubPopYn" value="Y"/>
 				<table class="frmStyle">
 					<colgroup>
 						<col width="10%">
@@ -46,6 +47,7 @@
 							<th>회원구분</th>
 							<td>
 								<select name="custGb" id="custGb">
+									<option value="">전체</option>
 									<option th:if="${usableCustGbList}" th:each="oneData , status : ${usableCustGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 								</select>
 							</td>
@@ -168,13 +170,25 @@
 		}
 	];
 
-	var pubCustGridOptions = gagaAgGrid.getGridOptions(columnDefs);
+	let pubCustGridOptions = gagaAgGrid.getGridOptions(columnDefs);
 
 	// 고객 조회
 	function fnSearchPubCustList(){
-		gagaAgGrid.fetch($("#custSearchForm").prop('action') , pubCustGridOptions , '#custSearchForm');
+		//gagaAgGrid.fetch($("#custSearchForm").prop('action') , pubCustGridOptions , '#custSearchForm');
+		gagaPaging.init('custSearchForm', fnSearchCallBack, 'custSearchForm', $('#custSearchForm select[name=pageSize]').val());
+		gagaPaging.load($('#custSearchForm input[name=pageNo]').val());
 	}
 
+	var fnSearchCallBack = function (result) {
+		//$('#gridRowTotalCount').html(result.pageing.pageable.totalCount.addComma());
+		//$('#custActiveForm input[name=pageNo]').val(result.pageing.pageable.pageNo.addComma());
+		//$('#pgNo').html(result.pageing.pageable.pageNo.addComma());
+		//$('#endPgNo').html(result.pageing.pageable.totalPage.addComma());
+
+		pubCustGridOptions.api.setRowData(result.custList);
+		//gagaPaging.createPagination(result.pageing.pageable);
+	};
+
 	function fnCpnPubCustomer(){
 		setReqValue();
 		checkValidation();

+ 15 - 14
src/main/webapp/WEB-INF/views/marketing/MorebetterPopupForm.html

@@ -103,11 +103,6 @@
 						</td>
 					</tr>
 					<tr>
-						<th>상품여부<em class="required" title="필수"></em></th>
-						<td>
-							<label class="rdoBtn"><input type="radio" name="multiYn" id="multiYnY" value="Y" checked="checked"/>복합상품</label>
-							<label class="rdoBtn"><input type="radio" name="multiYn" id="multiYnN" value="N"/>단일상품</label>
-						</td>
 						<th>상태<em class="required" title="필수"></em></th>
 						<td>
 							<!-- 상태 입력 : before
@@ -525,7 +520,6 @@
 			$("input:radio[name='disTmtbStat']:radio[value="+tmtbMstInfo.tmtbStat+"]").prop('checked', true); // 선택하기
 			$("input:radio[name='sectionGb']:radio[value="+tmtbMstInfo.sectionGb+"]").prop('checked', true); // 선택하기
 			$("input:radio[name='dcWay']:radio[value="+tmtbMstInfo.dcWay+"]").prop('checked', true); // 선택하기
-			$("input:radio[name='multiYn']:radio[value="+tmtbMstInfo.multiYn+"]").prop('checked', true); // 선택하기
 
 			let edDtArr = tmtbMstInfo.tmtbEddt.split(" ");
 			if(edDtArr[1] == "23:59:59") {
@@ -584,6 +578,8 @@
 			mcxDialog.alert("기본상품을 1개 이상 지정해주세요.");
 			return false;
 		}
+
+		return true;
 	};
 
 	var fnBurdenValueCheck = function (){
@@ -597,6 +593,8 @@
 			mcxDialog.alert("업체분담율의 합이 100을 넘을수 없습니다.");
 			return false;
 		}
+
+		return true;
 	};
 
 	// 저장
@@ -647,11 +645,15 @@
 		}
 
 		// 적용상품 그리드에 기본상품 1개이상 있는지 체크
-		fnGoodsGbCheck();
+		if(!fnGoodsGbCheck()) {
+			return false;
+		}
 
 		// 업체분담율 토탈 100% 넘는지 체크
-		fnBurdenValueCheck();
-
+		if(!fnBurdenValueCheck()) {
+			return false;
+		}
+		
 		// 공급업체+브랜드 상품조회
 		var multiSupplyCompCd = [];
 		$.each(allSupplyCompData, function(idx, item) {
@@ -683,7 +685,6 @@
 			, sectionGb : $('input:radio[name="sectionGb"]:checked').val()
 			, applyGb : $('input:radio[name="sectionGb"]:checked').val()
 			, dcWay : $('input:radio[name="dcWay"]:checked').val()
-			, multiYn : $('#moreBetterForm input[name=multiYn]').val()
 			, supplyCompList : allSupplyCompData
 			, brandList : allBrandData
 			, applyGoodsList : allApplyGoodsData
@@ -702,8 +703,7 @@
 	});
 
 	var fnMorebetterSaveCollback = function(result){
-		mcxDialog.alert(result.message);
-
+		//mcxDialog.alert(result.message);
 		if(result.duplicateYn == "Y"){
 			//console.log('duplicateGoodsList Size::'+ result.duplicateGoodsList.length);
 			for(let i=0; i<result.duplicateGoodsList.length; i++){
@@ -1191,7 +1191,8 @@
 
 	// 진행 버튼 클릭
 	$("#moreBetterForm #btnChangeStatIng").on("click", function() {
-		mcxDialog.confirmC("프로모션을 진행하시겠습니까?<br/>진행 후에는 수정이 제한될 수 있습니다.", {
+		console.log('1111111111111');
+		/*mcxDialog.confirmC("프로모션을 진행하시겠습니까?<br/>진행 후에는 수정이 제한될 수 있습니다.", {
 			btn: confirmBtnText,
 			btnClick: function(index) {
 				if(index == 1) {
@@ -1202,7 +1203,7 @@
 					gagajf.ajaxJsonSubmit('/marketing/morebetter/changeStat', jsonData, fnMorebetterFormClose);
 				}
 			}
-		});
+		});*/
 	});
 
 	// 진행 버튼 클릭

+ 0 - 1
src/main/webapp/WEB-INF/views/order/ExchangeRequestForm.html

@@ -780,7 +780,6 @@ var fnExchangeCancel = function() {
 var fnOpenDaumAddr = function(loc) {
 	let daumZip = new daum.Postcode({
 		oncomplete: function(data) {
-			console.log(data);
 			// 우편번호와 주소 정보를 해당 필드에 넣는다.
 			if (loc == 'withdraw') {
 				$('#exchangeRequestFrm input[name=chgerZipcode]').val(data.zonecode);

+ 7 - 8
src/main/webapp/WEB-INF/views/order/OrderDetailForm.html

@@ -167,7 +167,8 @@ var orderRefundInfo 		= [[${orderRefundInfo}]];				// 환불정보
 var orderCounselInfo 		= [[${orderCounselInfo}]];				// 상담내역
 var orderAdminMemoInfo 		= [[${orderAdminMemoInfo}]];			// 관리자메모
 
-var canChgDelvStat			= ['G013_10', 'G013_11', 'G013_17', 'G013_20', 'G013_30', 'G013_40'];
+var canChgDelvOrdStat		= ['G013_10', 'G013_11', 'G013_17', 'G013_20', 'G013_30', 'G013_40'];
+var canChgDelvChgStat		= ['G685_30', 'G685_33', 'G685_40'];
 </script>
 
 <!-- AgGrid 컬럼 세팅 -->
@@ -513,7 +514,7 @@ var columnDefsDeliveryInfo = [
 		, cellClass		: 'text-center'
 		, cellRenderer	: function (params) {
 			var rtnStr = ""
-			if (canChgDelvStat.includes(params.data.ordDtlStat)) {
+			if (canChgDelvOrdStat.includes(params.data.ordDtlStat)) {
 				// 배송지 수정 (주문배송, 교환배송)
 				rtnStr += params.value;
 				rtnStr += "<button type=\"button\" style=\"margin-left:10px\" class=\"btn btn-info\" onclick=\"fnOpenDaumAddr('" + params.node.rowIndex + "', 'ADDR');\">POST</button>";
@@ -647,7 +648,6 @@ var columnDefsOrderChangeInfo = [
 	{
 		headerName: "회수구분", field: "wdGb", width: 100, cellClass: 'text-center',
 		cellRenderer: function (params) {
-			console.log(params);
 			return params.value == 'W' ? '회수요청' : '직접배송'; 
 		}
 	},
@@ -662,10 +662,9 @@ var columnDefsOrderChangeInfo = [
 		, cellRenderer	: function (params) {
 			var rtnStr = ""
 			
+			rtnStr += params.value;
 			// 회수지수정가능(교환요청, 반품요청)
-			if (params.data.wdGb != 'D' && (params.data.chgStat == 'G685_30' || params.data.chgStat == 'G685_33' || params.data.chgStat == 'G685_40')) {
-				
-				rtnStr += params.value;			
+			if (params.data.wdGb != 'D' && canChgDelvChgStat.includes(params.data.chgStat)) {
 				rtnStr += "<button type=\"button\" style=\"margin-left:10px\" class=\"btn btn-info\" onclick=\"fnOpenDaumAddr('" + params.node.rowIndex + "', 'CLAIM');\">POST</button>";
 				rtnStr += "<button type=\"button\" class=\"btn btn-info\" onclick=\"fnSaveChgerAddr('" + params.node.rowIndex + "');\">저장</button>";
 			} else {
@@ -971,7 +970,7 @@ $(document).ready(function () {
 	});
 	// 교환요청
 	$('#btnExchange').on('click', function () {
-		fnExchangeRequest(ordNo, 'N');
+		fnExchangeRequest();
 	});
 	// 메모등록
 	$('#btnCreateOrderMemo').on('click', function () {
@@ -1043,7 +1042,7 @@ var fnReturnRequest = function (ordChgSq) {
 // 교환요청
 var fnExchangeRequest = function (ordChgSq) {
 	
-	// 취소요청 구분 (orChgSq null 이면 취소요청화면 있으면 취소요청정보화면)
+	// 교환요청 구분 (orChgSq null 이면 교환요청화면 있으면 교환요청정보화면)
 	if (ordChgSq == null) {
 		ordChgSq = 0;
 	}

+ 36 - 48
src/main/webapp/WEB-INF/views/order/OrderListForm.html

@@ -192,9 +192,6 @@
 							<select name="searchDateGb">
 								<option value="ordDt">주문일자</option>
 								<option value="delvStdt">출고일자</option>
-								<option value="cnclReqDt">@취소요청일자</option>
-								<option value="changReqDt">@교환요청일자</option>
-								<option value="rtnReqDt">@반품요청일자</option>
 								<option value="soldoutDt">품절일자</option>
 							</select>
 							<span id="terms"></span>
@@ -400,21 +397,7 @@ var columnDefsOrderList = [
 			{headerName: "상품코드"	, field: "goodsCd"		, width: 100	, cellClass: 'text-center'	, sortable: true},
 			{headerName: "브랜드"		, field: "brandEnm"		, width: 100	, cellClass: 'text-center'	, sortable: true},
 			{headerName: "구성유형"	, field: "goodsTypeNm"	, width: 100	, cellClass: 'text-center'	, sortable: true},
-			{
-				headerName		: "상품명"
-				, field			: 'goodsNm'
-				, width			: 200
-				, cellClass		: 'text-center'
-				, sortable		: true
-				, cellRenderer	: function (params) {
-					var roleCd = [[${sessionInfo.roleCd}]];
-					if (!roleCd.startsWith("C")) {
-						return "<a href=\"javascript:void(0);\" onclick=\"fnOpenOrderDetailPopup('" + params.value + "');\">" + params.value + "</a>";
-					} else {
-						return params.value;
-					}
-				}
-			}
+			{headerName: "상품명"		, field: "goodsNm"		, width: 200	, cellClass: 'text-center'	, sortable: true}
 		]
 	},
 	{
@@ -567,36 +550,36 @@ var columnDefsOrderList = [
 				}
 			},
 			{headerName: "품절처리자", field: "soldoutRegId", width: 120, cellClass: 'text-center'},
-			{
-				headerName		: "변경요청번호"
-				, field			: "ordChgSq"
-				, width			: 120
-				, cellClass		: 'text-center'
-				, valueGetter	: function (params) {
-					return params.data.ordChgSq === 0 ? '' : params.data.ordChgSq;
-				}
-			},
-			{
-				headerName		: "변경구분"
-				, field			: "chgGb"
-				, width			: 120
-				, cellClass		: 'text-center'
-				, valueGetter: function (params) { 
-					return gagaAgGrid.lookupValue(chgGbList, params.data.chgGb); 
-				}
-			},
-			{
-				headerName		: "변경상태"
-				, field			: "chgStat"
-				, width			: 120
-				, cellClass		: 'text-center'
-				, valueGetter	: function (params) { 
-					return gagaAgGrid.lookupValue(chgStatList, params.data.chgStat); 
-				}
-			},
-			{headerName: "회수지시여부"		, field: "wdInvoiceSendYn"		, width: 100, cellClass: 'text-center'},
-			{headerName: "회수택배사"		, field: "wdShipCompNm"			, width: 100, cellClass: 'text-center'},
-			{headerName: "회수송장"		, field: "wdInvoiceNo"			, width: 120, cellClass: 'text-center'},
+			//{
+			//	headerName		: "변경요청번호"
+			//	, field			: "ordChgSq"
+			//	, width			: 120
+			//	, cellClass		: 'text-center'
+			//	, valueGetter	: function (params) {
+			//		return params.data.ordChgSq === 0 ? '' : params.data.ordChgSq;
+			//	}
+			//},
+			//{
+			//	headerName		: "변경구분"
+			//	, field			: "chgGb"
+			//	, width			: 120
+			//	, cellClass		: 'text-center'
+			//	, valueGetter: function (params) { 
+			//		return gagaAgGrid.lookupValue(chgGbList, params.data.chgGb); 
+			//	}
+			//},
+			//{
+			//	headerName		: "변경상태"
+			//	, field			: "chgStat"
+			//	, width			: 120
+			//	, cellClass		: 'text-center'
+			//	, valueGetter	: function (params) { 
+			//		return gagaAgGrid.lookupValue(chgStatList, params.data.chgStat); 
+			//	}
+			//},
+			//{headerName: "회수지시여부"		, field: "wdInvoiceSendYn"		, width: 100, cellClass: 'text-center'},
+			//{headerName: "회수택배사"		, field: "wdShipCompNm"			, width: 100, cellClass: 'text-center'},
+			//{headerName: "회수송장"		, field: "wdInvoiceNo"			, width: 120, cellClass: 'text-center'},
 			{headerName: "수취인명"		, field: "recipNm"				, width: 100, cellClass: 'text-center'},
 			{headerName: "수취인연락처"		, field: "recipPhnno"			, width: 120, cellClass: 'text-center'},
 			{headerName: "수취인주소"		, field: "recipAddr"			, width: 500, cellClass: 'text-left'},
@@ -749,6 +732,11 @@ var fnCreateSampleOrder = function() {
 	var actionUrl = "/order/sample/create/form";
 	cfnOpenModalPopup(actionUrl, "popupOrderSample");
 }
+
+var fnRemoveEmojis = function (str) {
+	var regex = /(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|\ud83c[\ude32-\ude3a]|\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])/g;
+	return str.replace(regex, '');
+};
 </script>
 
 </html>

+ 78 - 12
src/main/webapp/WEB-INF/views/order/RtnReqForm.html

@@ -44,6 +44,8 @@
 				
 				<table class="frmStyle">
 					<colgroup>
+						<col style="width:160px;" />
+						<col style="width:320px;" />
 						<col style="width:160px;" />
 						<col style="width:320px;" />
 						<col style="width:160px;" />
@@ -58,12 +60,17 @@
 									<option th:if="${chgReasonList}" th:each="oneData, status : ${chgReasonList}" th:value="|${oneData.cd}|" th:text="|${oneData.cdNm}|"></option>
 								</select>
 							</td>
+							<th>회수방법</th>
+							<td>
+								<label class="rdoBtn"><input type="radio" name="wdGb" th:id="wdGb" value="W" onclick="fnChangeWdGb(this)"/>회수요청<span></span></label>
+								<label class="rdoBtn"><input type="radio" name="wdGb" th:id="wdGb" value="D" onclick="fnChangeWdGb(this)"/>직접발송<span></span></label>
+							</td>
 							<th>귀책사유</th>
 							<td><span id="imputeReason"></span></td>
 						</tr>
 						<tr>
 							<th>요청메모</th>
-							<td colspan="3">
+							<td colspan="5">
 								<textarea id="chgMemo" name="chgMemo" style="height:80px;" placeholder="취소사유를 300자내외로 작성해 주세요"></textarea>
 							</td>
 						</tr>
@@ -145,7 +152,7 @@
 							<th>회수지주소 <i class="star"></i></th>
 							<td colspan="3">
 								<input type="text" name ="chgerZipcode" class="w100" readonly="readonly"/>
-								<button type="button" class="btn btn-info" onclick="fnOpenDaumAddr('delvLoc');">우편번호찾기</button>
+								<button type="button" class="btn btn-info" th:unless="${ordChgSq > 0}" onclick="fnOpenDaumAddr('delvLoc');">우편번호찾기</button>
 								<input type="text" name ="chgerBaseAddr" class="w300"/>
 								<input type="text" name ="chgerDtlAddr" class="w300"/>
 							</td>
@@ -157,8 +164,8 @@
 									<option value="">[선택하세요]</option>
 									<option th:if="${TelExcNoList}" th:each="oneData, status : ${TelExcNoList}" th:value="${oneData.cd}" th:text="${oneData.cd}"></option>
 								</select>
-								- <input type="text" name ="chgerTelno2" class="w60" value="0000" />
-								- <input type="text" name ="chgerTelno3" class="w60" value="0000" />
+								- <input type="text" name ="chgerTelno2" class="w60"/>
+								- <input type="text" name ="chgerTelno3" class="w60"/>
 							</td>
 							<th>휴대전화 <i class="star"></i></th>
 							<td>
@@ -166,8 +173,14 @@
 									<option value="">[선택하세요]</option>
 									<option th:if="${PhnExcNoList}" th:each="oneData, status : ${PhnExcNoList}" th:value="${oneData.cd}" th:text="${oneData.cd}"></option>
 								</select>
-								- <input type="text" name ="chgerPhnno2" class="w60" value="0000" />
-								- <input type="text" name ="chgerPhnno3" class="w60" value="0000" />
+								- <input type="text" name ="chgerPhnno2" class="w60"/>
+								- <input type="text" name ="chgerPhnno3" class="w60"/>
+							</td>
+						</tr>
+						<tr>
+							<th>반품메모</th>
+							<td colspan="3">
+								<textarea id="chgerRtnMemo" name="chgerRtnMemo" style="height:80px;" placeholder="반품메모(수거시요청사항)를 300자내외로 작성해 주세요"></textarea>
 							</td>
 						</tr>
 					</tbody>
@@ -196,11 +209,13 @@ var orderChangeDetailList 	= [[${orderChangeDetailList}]];					// 취소/반품/
 var payMeans 				= orderInfoList[0].payMeans;					// 결제수단
 var chgReason				= "";											// 변경사유코드
 var chgMemo					= "";											// 변경사유메모
+var wdGb;																	// 회수방법
 
 // 변경요청정보 승인, 철회
 if (ordChgSq > 0) {
 	chgReason				= orderChangeDetailList[0].chgReason;			// 변경사유코드
 	chgMemo					= orderChangeDetailList[0].chgMemo;				// 변경사유메모
+	wdGb					= orderChangeDetailList[0].wdGb;				// 회수방법
 }
 
 var temp1 = true;
@@ -917,10 +932,16 @@ var fnCalculateRefundAmt = function (obj) {
 			$("#spanTotExcDelvFee").text(result.spanTotExcDelvFee.addComma());		//교환 환불 배송 금액
 
 			if (result.spanRealCnclRtnAmt > 0) {
-				// 고객사유 : 환불금액게산 = (취소금액 + 배송비) - 추가배송비 - 반품배송비
-				if (isCustomer) {
+				let wdGb = $('#wdGb:checked').val();
+
+				// 고객사유(회수요청) : 환불금액게산 = (취소금액 + 배송비) - 추가배송비 - 반품배송비
+				if (isCustomer && wdGb == 'W') {
 					result.spanRefundAmt = (result.spanRealCnclRtnAmt + result.sumDeliveryFee) - result.spanTotDeliveryFee - result.spanTotRtnDelvFee;
 				} 
+				// 고객사유(직접발송) : 환불금액계산 = (취소금액 + 배송비) - 추가배송비
+				else if (isCustomer && wdGb == 'D') {
+					result.spanRefundAmt = (result.spanRealCnclRtnAmt + result.sumDeliveryFee) - result.spanTotDeliveryFee;
+				}
 				// 회사사유 : 환불금액게산 = (취소금액 + 배송비)
 				else {
 					result.spanRefundAmt = (result.spanRealCnclRtnAmt + result.sumDeliveryFee);
@@ -984,6 +1005,7 @@ var fnCnclReq = function (reqGbn) {
 	var chgerPhnno 		= "";
 	var chgerTelno 		= "";
 	var chgerEmail 		= "";
+	var chgerRtnMemo	= "";
 	
 	if (reqGbn == "rtnReq") {
 		// 1. 취소수량 체크
@@ -1066,9 +1088,15 @@ var fnCnclReq = function (reqGbn) {
 			mcxDialog.alert("휴대전화를 입력하세요."); return;
 		}
 		
-		chgerPhnno 		= chgerPhnno1 + chgerPhnno2 + chgerPhnno3;
-		chgerTelno 		= chgerTelno1 + chgerTelno2 + chgerTelno3;
+		chgerPhnno 		= chgerPhnno1 + '-' + chgerPhnno2 + '-' + chgerPhnno3;
 		chgerEmail 		= orderInfoList[0].ordEmail;
+		chgerRtnMemo	= $("#cancelRequestFrm textarea[name=chgerRtnMemo]").val();
+		
+		if (gagajf.isNull(chgerTelno1) && gagajf.isNull(chgerTelno2) && gagajf.isNull(chgerTelno3)) {
+			chgerTelno 		= '';
+		} else {
+			chgerTelno = chgerTelno1 + '-' + chgerTelno2 + '-' + chgerTelno3;
+		}
 	} else {
 		
 	}
@@ -1107,7 +1135,9 @@ var fnCnclReq = function (reqGbn) {
 		,"chgerDtlAddr"		: chgerDtlAddr
 		,"chgerPhnno"		: chgerPhnno
 		,"chgerTelno"		: chgerTelno
+		,"chgerRtnMemo"		: chgerRtnMemo
 		,"ordChgSq"			: ordChgSq
+		,"wdGb"				: $('#wdGb:checked').val()
 	}
 
 	// 주문번호, 취소사유, 취소메모, (취소, 반품, 교환 신청 정보 목록), 환불계좌
@@ -1174,6 +1204,7 @@ var fnSetChger = function(){
 	$("#cancelRequestFrm input[name=chgerZipcode]").val(data.recipZipcode);
 	$("#cancelRequestFrm input[name=chgerBaseAddr]").val(data.recipBaseAddr);
 	$("#cancelRequestFrm input[name=chgerDtlAddr]").val(data.recipDtlAddr);
+	$("#cancelRequestFrm textarea[name=chgerRtnMemo]").val(data.chgerRtnmemo);
 	
 	if (spRecipPhnno) {
 		$("#cancelRequestFrm select[name=chgerPhnno1]").val(spRecipPhnno[0]);
@@ -1186,6 +1217,34 @@ var fnSetChger = function(){
 		$("#cancelRequestFrm input[name=chgerTelno2]").val(spRecipTelno[1]);
 		$("#cancelRequestFrm input[name=chgerTelno3]").val(spRecipTelno[2]);
 	}
+	
+	if (ordChgSq > 0) {
+		$('input[name=chgerNm]').attr('readOnly', true);				// 회수지정보 > 보내는사람 비활성화
+		$('input[name=chgerBaseAddr]').attr('readOnly', true);			// 회수지정보 > 기본주소 비활성화
+		$('input[name=chgerDtlAddr]').attr('readOnly', true);			// 회수지정보 > 상세주소 비활성화
+		$('select[name=chgerTelno1]').attr('disabled', true);			// 회수지정보 > 일반전화 비활성화
+		$('input[name=chgerTelno2]').attr('readOnly', true);			// 회수지정보 > 일반전화 비활성화
+		$('input[name=chgerTelno3]').attr('readOnly', true);			// 회수지정보 > 일반전화 비활성화
+		$('select[name=chgerPhnno1]').attr('disabled', true);			// 회수지정보 > 휴대전화 비활성화
+		$('input[name=chgerPhnno2]').attr('readOnly', true);			// 회수지정보 > 휴대전화 비활성화
+		$('input[name=chgerPhnno3]').attr('readOnly', true);			// 회수지정보 > 휴대전화 비활성화
+		$('#chgerRtnMemo').attr('readOnly', true);						// 회수지정보 > 반품메모 비활성화
+	}
+}
+
+// 회수방법 라디오 클릭 이벤트
+var fnChangeWdGb = function(param) {
+	let wdGb = $(param).val();
+	
+	// 회수지정보 히든 처리
+	if (wdGb == 'D') {
+		$('.chger').css('display', 'none');
+	} else {
+		$('.chger').css('display', '');
+	}
+	
+	//환불예정금액 계산
+	fnCalculateRefundAmt();
 }
 
 $(document).ready(function() {
@@ -1203,6 +1262,12 @@ $(document).ready(function() {
 	gagaAgGrid.hideStatusBar('gridDelvCdList');
 	gagaAgGrid.hideStatusBar('gridRefundAccountInfo');
 	
+	if (wdGb == 'D') {
+		$('input:radio[name="wdGb"]:radio[value="D"]').prop('checked', true);
+	} else {
+		$('input:radio[name="wdGb"]:radio[value="W"]').prop('checked', true);
+	}
+	
 	// 3. 환불정보계산
 	fnCalculateRefundAmt(null);
 	
@@ -1226,10 +1291,11 @@ $(document).ready(function() {
 	// 7. 취소사유 선택
 	if (ordChgSq > 0) {
 		$("select[name='selectChgReason']").val(chgReason);										// 변경사유코드
-		$("select[name='selectChgReason']").attr("disabled", "true");							// 변경사유 비활성화
+		$("select[name='selectChgReason']").attr('disabled', true);								// 변경사유 비활성화
 		$("#chgMemo").text(chgMemo);															// 변경사유메모
-		$("#chgMemo").attr("disabled", "true");													// 변경사유메모 비활성화
+		$("#chgMemo").attr('readOnly', true);													// 변경사유메모 비활성화
 		fnChangeChgReason(chgReason);															// 귀책사유
+		$('input:radio[name=wdGb]').attr('disabled', true);										// 회수방법 비활성화
 	}
 	
 	// debug mode 해제