Prechádzať zdrojové kódy

Merge branch 'develop' into bin2107

bin2107 5 rokov pred
rodič
commit
4f39039784

+ 16 - 1
src/main/java/com/style24/admin/biz/dao/TsaCardPromotionDao.java

@@ -107,7 +107,6 @@ public interface TsaCardPromotionDao {
 	 */
 	void updateCardPromotionDsipYn(CardPromotion cardPromotion);
 
-
 	/**
 	 * 카드프로모션 삭제
 	 * @param cardPrmtSq
@@ -117,6 +116,22 @@ public interface TsaCardPromotionDao {
 	 */
 	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);
 
 }

+ 147 - 35
src/main/java/com/style24/admin/biz/service/TsaCardPromotionService.java

@@ -29,7 +29,7 @@ public class TsaCardPromotionService {
 	private TsaCardPromotionDao cardPromotionDao;
 
 	/**
-	 * 카드무이자할부 목록 건
+	 * 카드무이자할부 목록 건수
 	 * @param cardPromotion
 	 * @return
 	 * @author eskim
@@ -72,47 +72,88 @@ public class TsaCardPromotionService {
 		cardPromotionDao.saveCardPromotion(cardPromotion);
 		log.info("[saveCardInterest] cardPromotion 2  = {}", cardPromotion);
 		// 카드 프로모션 행사조건 저장
-		if (cardPromotion.getMinNoItrt().length > 0) {
-			int cardPromotionSize = cardPromotion.getMinNoItrt().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.getMinNoItrt()[i].toString());
-				cardPromotionCondition.setMaxNoItrt(cardPromotion.getMaxNoItrt()[i].toString());
-				cardPromotionCondition.setMinPayAmt(Integer.parseInt(cardPromotion.getMinPayAmt()[i].toString()));
-				if (cardPromotion.getCardPrmtCdtSq() != null && cardPromotion.getCardPrmtCdtSq().length > 0) {
-					if (!StringUtils.isBlank(cardPromotion.getCardPrmtCdtSq()[i])) {
-						cardPromotionCondition.setCardPrmtCdtSq(Integer.parseInt(cardPromotion.getCardPrmtCdtSq()[i].toString()));
+		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());
+					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());
 
-				// 카드 프로모션 카드목록 저장
-				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);
+							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("/");
@@ -135,7 +176,7 @@ public class TsaCardPromotionService {
 	 * @author eskim
 	 * @since 2021. 02. 1
 	 */
-	public CardPromotion getCardPromotion(Integer cardPrmtSq) {
+	public CardPromotion getCardInterest(Integer cardPrmtSq) {
 		CardPromotion cardPrmt = new CardPromotion();
 		cardPrmt.setCardPrmtSq(cardPrmtSq);
 		cardPrmt.setPrmtGb("B");	// 무이자
@@ -208,4 +249,75 @@ public class TsaCardPromotionService {
 		}
 	}
 
+	/**
+	 * 카드프로모션 목록 건수
+	 * @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;
+	}
 }

+ 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);
 		}
 

+ 59 - 1
src/main/java/com/style24/admin/biz/web/TsaMarketingController.java

@@ -1094,7 +1094,7 @@ public class TsaMarketingController extends TsaBaseController {
 
 		ModelAndView mav = new ModelAndView();
 
-		mav.addObject("cardPrmt", cardPromotionService.getCardPromotion(cardPrmtSq));
+		mav.addObject("cardPrmt", cardPromotionService.getCardInterest(cardPrmtSq));
 
 		mav.addObject("cardPrmtSq", cardPrmtSq);
 		mav.setViewName("marketing/CardInterestPopupForm");
@@ -1165,6 +1165,64 @@ public class TsaMarketingController extends TsaBaseController {
 		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
 	 */

+ 14 - 5
src/main/java/com/style24/persistence/domain/CardPromotion.java

@@ -23,12 +23,11 @@ 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;	// 표시여부
 
-
 	// 검색조건
 	private String stDate;
 	private String edDate;
@@ -38,13 +37,13 @@ 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;
@@ -52,6 +51,15 @@ public class CardPromotion extends TscBaseDomain {
 	@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
 
@@ -62,6 +70,7 @@ public class CardPromotion extends TscBaseDomain {
 	// 화면 조회용
 	Collection<CardPromotionCondition> cardPrmtCdtList;
 
+
 	// Pagination
 	private TscPageRequest pageable;
 	private int pageNo = 1;

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

@@ -26,4 +26,13 @@ public class CardPromotionCondition extends TscBaseDomain {
 	// 화면조회용
 	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;	// 표시여부
 }

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

@@ -20,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"'>
@@ -64,7 +64,7 @@
 		         , 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 = #{prmtGb}
+		    WHERE PRMT_GB = 'B'
 		    <if test="condition != null and condition != ''">
 		        <choose>
 		            <when test='search != null and search == "1"'>
@@ -269,4 +269,85 @@
 		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>

BIN
src/main/webapp/WEB-INF/lib/gagaframework-web-util-1.7-RELEASE.jar


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

@@ -101,7 +101,7 @@
 			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>';
 			}
@@ -345,6 +345,7 @@
 		cfnCreateCalendar('#sellTerms', 'stDate', 'edDate', true, '기간', 'X');
 		var chkBeforSkipFlag = '&nbsp;&nbsp;<label class="chkBox"><input type="checkbox" name="beforSkipFlag" value="Y" >이전데이터 제외</label>';
 		$("#cardInterestSearchForm").find('#sellTerms').append(chkBeforSkipFlag);
+		gagajf.setDate('#sellTerms','stDate', 'edDate', '7d');
 		
 		// Create a agGrid
 		gagaAgGrid.createGrid('gridList', gridOptions);

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

@@ -67,9 +67,9 @@
 								
 								<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>
+									<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"/>
@@ -81,9 +81,9 @@
 									<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="minNoItrt" data-valid-type="numeric" required="required" data-valid-name="무이자개월" th:value="${cardPrmtCdt.minNoItrt}"/>개월 ~
-										<input type="text" class="w100"  name="maxNoItrt" data-valid-type="numeric" required="required" data-valid-name="무이자개월" th:value="${cardPrmtCdt.maxNoItrt}"/>개월</p>
-										<p class="dot">구매금액기준 <input type="text" class="w100"  name="minPayAmt" data-valid-type="numeric" required="required" data-valid-name="구매금액기준" th:value="${cardPrmtCdt.minPayAmt}"/>원 이상 구매시</p>
+										<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>
@@ -133,9 +133,9 @@
 		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" />';
@@ -208,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)){
@@ -218,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;
@@ -229,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;

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

@@ -0,0 +1,365 @@
+<!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);
+		gagajf.setDate('#sellTerms','stDate', 'edDate', '7d');
+		
+		// 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>