Parcourir la source

Merge remote-tracking branch 'origin/xodud1202' into develop

card007 il y a 5 ans
Parent
commit
0afdc33db4

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

@@ -184,4 +184,20 @@ public interface TsaCouponDao {
 	 * @since 2021-01-21
 	 */
 	void updateCustCouponAvailEddt(CustCoupon issueCust);
+
+	/**
+	 * 난수, 시리얼 쿠폰 등록
+	 * @param param
+	 * @author xodud1202
+	 * @since 2021. 01. 26
+	 */
+	void createRandomCouponInfo(Coupon param);
+
+	/**
+	 * 동일 쿠폰명이 존재하는지 확인
+	 * @param param
+	 * @author xodud1202
+	 * @since 2021. 01. 26
+	 */
+	int getSerialOverlapCheck(Coupon param);
 }

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

@@ -44,20 +44,11 @@ public class TsaCouponService {
 	 * @since  2021-01-11
 	 */
 	@Transactional("shopTxnManager")
-	public void saveCoupon(Coupon params) {
+	public String saveCoupon(Coupon params){
 		String cpnId = "";		// 쿠폰ID
 		params.setRegNo(TsaSession.getInfo().getUserNo());
 		params.setUpdNo(TsaSession.getInfo().getUserNo());
 
-		// 자동생성이면 시퀀스 가져오기
-		if(StringUtils.isBlank(params.getCpnId())) {
-			Integer sequence = commonService.getNextSequence("SEQ_COUPON");
-			cpnId = "CPN"+sequence;
-		} else {
-			cpnId = params.getCpnId();
-		}
-		params.setCpnId(cpnId);
-
 		couponDao.couponInsert(params);
 
 		Gson gson = new Gson();
@@ -162,7 +153,7 @@ public class TsaCouponService {
 		}
 
 		// 수정모드이고 변경된 쿠폰상태가 대기 , 중지 인경우 고객이 발급받은 내용도 변경
-		if(!StringUtils.isBlank(params.getCpnId()) &&
+		if(params.getCpnId() != 0 &&
 				(params.getCpnStat().equals("G232_10") || params.getCpnStat().equals("G232_12")) ) {
 
 			CustCoupon custCoupon = new CustCoupon();
@@ -179,6 +170,23 @@ public class TsaCouponService {
 				}
 			}
 		}
+
+		log.info("CHECK GUBUN >> " + params.getCpnType() + " / " + params.getDcCdGb() + " / " + params.getTotPubLimitQty());
+
+		// 시리얼 쿠폰 생성
+		if("G230_20".equals(params.getCpnType()) && "G233_10".equals(params.getDcCdGb())) {
+			// 시리얼 쿠폰명이 동일한 쿠폰이 일정 겹치는 부분이 있는지 확인
+			int overlapCheck = couponDao.getSerialOverlapCheck(params);
+			if(overlapCheck < 1) {
+				for(int i = 0 ; i < params.getTotPubLimitQty() ; i++) {
+					couponDao.createRandomCouponInfo(params);
+				}
+			} else {
+				throw new IllegalStateException("같은 시리얼명이 사용되는 쿠폰이 중복됩니다. 기간을 확인해주세요.");
+			}
+		}
+
+		return "SUCCESS";
 	}
 
 	/**

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

@@ -368,6 +368,8 @@ public class TsaMarketingController extends TsaBaseController {
 		mav.addObject("hhList", hhList);
 		// 입점업체 조회
 		mav.addObject("ibSupplyCompList", rendererService.getSupplyCompanyList("", "N"));
+		// 할인 쿠폰 코드 조회
+		mav.addObject("dcCdList", rendererService.getCommonCodeList("G233", "Y"));
 		// 정상/이월 조회
 		mav.addObject("formalGbList", rendererService.getCommonCodeList("G009"));
 		// 카테고리 구분 조회
@@ -436,7 +438,10 @@ public class TsaMarketingController extends TsaBaseController {
 	public GagaResponse saveCoupon(@RequestBody Coupon coupon) {
 		log.info("couponSave : {}", coupon);
 
-		couponService.saveCoupon(coupon);
+		String result = couponService.saveCoupon(coupon);
+		if(!"SUCCESS".equals(result)) {
+			return super.error(message.getMessage(result));
+		}
 
 		return super.ok(message.getMessage("SUCC_0001"));
 	}

+ 3 - 1
src/main/java/com/style24/persistence/domain/Coupon.java

@@ -17,7 +17,7 @@ import java.util.Collection;
 @Data
 public class Coupon extends TscBaseDomain {
     // TB_COUPON
-    private String  cpnId;					// 쿠폰ID
+    private int     cpnId;					// 쿠폰ID
     private String  cpnNm;					// 쿠폰명
     private String  siteCd;					// 사이트코드(공통코드G000)
     private String  afLinkCd;				// 제휴링크코드
@@ -56,6 +56,8 @@ public class Coupon extends TscBaseDomain {
     private String  payType;                // 결제수단
     private String  custJoinYn;             // 신규회원여부
     private String  afChannel;              // 제휴링크
+    private String  dcCdGb;                 // 할인코드유형 (공통코드G233)
+    private String  rdCpnNm;                // 랜덤쿠폰 사용키 (시리얼명 or 난수)
 
     // 그리드 파라미터
     private String  supplyCompList;         // 공급업체 리스트

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

@@ -15,7 +15,7 @@ import org.codehaus.groovy.runtime.dgmimpl.arrays.IntegerArrayGetAtMetaMethod;
 public class CustCoupon extends TscBaseDomain {
     private Integer custCpnSq;              // 고객쿠폰일련번호
     private Integer custNo;                 // 고객번호
-    private String  cpnId;                  // 쿠폰아이디
+    private int     cpnId;                  // 쿠폰아이디
     private String  availStdt;              // 유효시작일시
     private String  availEddt;              // 유효종료일시
     private String  pubReason;              // 발행사유(공통코드G250)

+ 127 - 43
src/main/java/com/style24/persistence/mybatis/shop/TsaCoupon.xml

@@ -106,9 +106,11 @@
 	<!-- 쿠폰 등록 -->
 	<insert id="couponInsert" parameterType="Coupon">
 		/* TsaCoupon.couponInsert*/
+		<selectKey keyProperty="cpnId" resultType="int" order="AFTER">
+			SELECT LAST_INSERT_ID()
+		</selectKey>
 		INSERT INTO TB_COUPON (
-			CPN_ID
-		  , CPN_NM
+		    CPN_NM
 		  , SITE_CD
 		  , AF_LINK_CD
 		  , USABLE_CUST_GB
@@ -128,6 +130,7 @@
 		  , TOT_PUB_LIMIT_QTY
 		  , ONE_PUB_QTY
 		  , DN_GB
+		  , DC_CD_GB
 		  , DOWN_STDT
 		  , DOWN_EDDT
 		  , BUY_LIMIT_AMT
@@ -150,8 +153,7 @@
 		  </if>
 		  , CUST_JOIN_YN
 		) VALUES (
-		    #{cpnId}
-		  , #{cpnNm}
+		    #{cpnNm}
 		  , #{siteCd}
 		  , #{afLinkCd}
 		  , #{usableCustGb}
@@ -180,6 +182,7 @@
 		  , #{totPubLimitQty}
 		  , #{onePubQty}
 		  , #{dnGb}
+		  , #{dcCdGb}
 		  , DATE_FORMAT(#{downStdt} , '%Y-%m-%d %H:%i:%s')
 		  , DATE_FORMAT(#{downEddt} , '%Y-%m-%d %H:%i:%s')
 		  , #{buyLimitAmt}
@@ -218,8 +221,7 @@
 		  </if>
 		  , #{custJoinYn}
 		) ON DUPLICATE KEY UPDATE
-		    CPN_ID = #{cpnId}
-		  ,	CPN_NM = #{cpnNm}
+		    CPN_NM = #{cpnNm}
 		  , SITE_CD = #{siteCd}
 		  , AF_LINK_CD = #{afLinkCd}
 		  , USABLE_CUST_GB = #{usableCustGb}
@@ -409,47 +411,54 @@
 	<!-- 쿠폰 상세 조회-->
 	<select id="getCouponDetail" parameterType="String" resultType="Coupon">
 		/* TsaCoupon.getCouponDetail */
-		SELECT CPN_ID
-			 , CPN_NM
-			 , SITE_CD
-			 , AF_LINK_CD
-			 , USABLE_CUST_GB
-			 , USABLE_CUST_GRADE
-			 , CPN_TYPE
-			 , APPLY_SCOPE
-			 , DC_WAY
-			 , DC_PVAL
-			 , DC_MVAL
-			 , DC_AVAL
-			 , MAX_DC_AMT
-			 , PD_GB
-			 , AVAIL_STDT
-			 , AVAIL_EDDT
-			 , AVAIL_DAYS
-			 , CUST_PUB_LIMIT_QTY
-			 , TOT_PUB_LIMIT_QTY
-			 , ONE_PUB_QTY
-			 , DN_GB
-			 , DOWN_STDT
-			 , DOWN_EDDT
-			 , BUY_LIMIT_AMT
-			 , PLAN_SQ
-			 , REISSUANCE
-			 , CPN_STAT
-			 , END_ALIM_YN
-			 , FIRST_YN
-			 , DOWN_YN
-			 , CUST_JOIN_STDT
-			 , CUST_JOIN_EDDT
-			 , BUY_STDT
-			 , BUY_EDDT
-			 , PAY_TYPE
-			 , CUST_JOIN_YN
+		SELECT B.CPN_ID
+			 , B.CPN_NM
+			 , B.SITE_CD
+			 , B.AF_LINK_CD
+			 , B.USABLE_CUST_GB
+			 , B.USABLE_CUST_GRADE
+			 , B.CPN_TYPE
+			 , B.APPLY_SCOPE
+			 , B.DC_WAY
+			 , B.DC_PVAL
+			 , B.DC_MVAL
+			 , B.DC_AVAL
+			 , B.MAX_DC_AMT
+			 , B.PD_GB
+			 , B.AVAIL_STDT
+			 , B.AVAIL_EDDT
+			 , B.AVAIL_DAYS
+			 , B.CUST_PUB_LIMIT_QTY
+			 , B.TOT_PUB_LIMIT_QTY
+			 , B.ONE_PUB_QTY
+			 , B.DN_GB
+			 , B.DOWN_STDT
+			 , B.DOWN_EDDT
+			 , B.BUY_LIMIT_AMT
+			 , B.PLAN_SQ
+			 , B.REISSUANCE
+			 , B.CPN_STAT
+			 , B.END_ALIM_YN
+			 , B.FIRST_YN
+			 , B.DOWN_YN
+			 , B.CUST_JOIN_STDT
+			 , B.CUST_JOIN_EDDT
+			 , B.BUY_STDT
+			 , B.BUY_EDDT
+			 , B.PAY_TYPE
+			 , B.CUST_JOIN_YN
 			 , (SELECT AF_CHANNEL
 			      FROM TB_AF_LINK A
 			     WHERE A.AF_LINK_CD = B.AF_LINK_CD) AS AF_CHANNEL
+			 , RC.RD_CPN_NM AS RD_CPN_NM
   		  FROM TB_COUPON B
-    	 WHERE CPN_ID = #{value}
+		  LEFT OUTER JOIN (SELECT CPN_ID
+		  						, RD_CPN_NM
+							 FROM TB_RANDOM_COUPON
+		    				GROUP BY CPN_ID, RD_CPN_NM) RC
+		    ON B.CPN_ID = RC.CPN_ID
+		   AND B.DC_CD_GB = 'G233_10'		<!-- 시리얼 유형일 경우에만 랜덤쿠폰 검색 검색 -->
+    	 WHERE B.CPN_ID = #{value}
 	</select>
 
 	<!-- 쿠폰 발급 개수 조회 -->
@@ -606,4 +615,79 @@
 		   AND CUST_CPN_SQ = #{custCpnSq}
 	</update>
 
+	<!-- 특정 쿠폰 발급받은 회원 조회-->
+	<select id="getSerialOverlapCheck" parameterType="Coupon" resultType="int">
+		/* TsaCoupon.getSerialOverlapCheck : 중복 시리얼넘버 체크 */
+		WITH CHECK_DATA AS (
+		    SELECT C.CPN_ID
+				 , C.DOWN_STDT
+		    	 , C.DOWN_EDDT
+		    	 , C.AVAIL_STDT
+		    	 , C.AVAIL_EDDT
+		    	 , C.AVAIL_DAYS
+		    FROM TB_COUPON C
+			INNER JOIN (SELECT CPN_ID
+							 , RD_CPN_NM
+						FROM TB_RANDOM_COUPON
+						WHERE RD_CPN_NM = #{rdCpnNm}
+						GROUP BY CPN_ID, RD_CPN_NM ) RC
+		    ON C.CPN_ID = RC.CPN_ID
+		)
+		SELECT SUM(A.CNT) AS CNT
+		FROM ( SELECT COUNT(1) AS CNT		<!-- 다운 시작일이 겹치는 쿠폰번호 찾기 -->
+				FROM CHECK_DATA C
+				WHERE 1=1
+				AND C.DOWN_STDT >= STR_TO_DATE(#{downStdt}, '%Y-%m-%d %H:%i:%s')
+				AND C.DOWN_STDT <![CDATA[ <= ]]> STR_TO_DATE(#{downEddt}, '%Y-%m-%d %H:%i:%s')
+				UNION
+				SELECT COUNT(1) AS CNT		<!-- 다운 종료일이 겹치는 쿠폰번호 찾기 -->
+				FROM CHECK_DATA C
+				WHERE 1=1
+				AND C.DOWN_EDDT >= STR_TO_DATE(#{downStdt}, '%Y-%m-%d %H:%i:%s')
+				AND C.DOWN_EDDT <![CDATA[ <= ]]> STR_TO_DATE(#{downEddt}, '%Y-%m-%d %H:%i:%s')
+				UNION
+				SELECT COUNT(1) AS CNT		<!-- 유효 시작일이 겹치는 쿠폰번호 찾기 -->
+				FROM CHECK_DATA C
+				WHERE 1=1
+				AND C.AVAIL_STDT >= STR_TO_DATE(#{downStdt}, '%Y-%m-%d %H:%i:%s')
+				AND C.AVAIL_STDT <![CDATA[ <= ]]> STR_TO_DATE(#{downEddt}, '%Y-%m-%d %H:%i:%s')
+				UNION
+				SELECT COUNT(1) AS CNT		<!-- 유효 종료일이 겹치는 쿠폰번호 찾기 -->
+				FROM CHECK_DATA C
+				WHERE 1=1
+				AND C.AVAIL_EDDT >= STR_TO_DATE(#{downStdt}, '%Y-%m-%d %H:%i:%s')
+				AND C.AVAIL_EDDT <![CDATA[ <= ]]> STR_TO_DATE(#{downEddt}, '%Y-%m-%d %H:%i:%s')
+				UNION
+				SELECT COUNT(1) AS CNT		<!-- 쿠폰 사용 기한이 일수일경우 다운시작일 + 일수가 사용가능일. 해당 기준으로 겹치는 쿠폰번호 찾기 -->
+				FROM CHECK_DATA C
+				WHERE 1=1
+				AND DATE_ADD(C.DOWN_STDT, INTERVAL C.AVAIL_DAYS DAY) >= STR_TO_DATE(#{downStdt}, '%Y-%m-%d %H:%i:%s')
+				AND DATE_ADD(C.DOWN_STDT, INTERVAL C.AVAIL_DAYS DAY) <![CDATA[ <= ]]> STR_TO_DATE(#{downEddt}, '%Y-%m-%d %H:%i:%s')
+				UNION
+				SELECT COUNT(1) AS CNT		<!-- 쿠폰 사용 기한이 일수일경우 다운종료일 + 일수가 사용종료일. 해당 기준으로 겹치는 쿠폰번호 찾기 -->
+				FROM CHECK_DATA C
+				WHERE 1=1
+				AND DATE_ADD(C.DOWN_EDDT, INTERVAL C.AVAIL_DAYS DAY) >= STR_TO_DATE(#{downStdt}, '%Y-%m-%d %H:%i:%s')
+				AND DATE_ADD(C.DOWN_EDDT, INTERVAL C.AVAIL_DAYS DAY) <![CDATA[ <= ]]> STR_TO_DATE(#{downEddt}, '%Y-%m-%d %H:%i:%s') ) A
+	</select>
+
+	<!-- 고객 쿠폰 발행 -->
+	<insert id="createRandomCouponInfo" parameterType="Coupon">
+		/* TsaCoupon.createRandomCouponInfo */
+		INSERT INTO TB_RANDOM_COUPON (
+			  RD_CPN_NM
+			, CPN_ID
+			, REG_NO
+			, REG_DT
+			, UPD_NO
+			, UPD_DT
+		) VALUES (
+			  #{rdCpnNm}
+			, #{cpnId}
+			, #{regNo}
+			, CURRENT_TIMESTAMP()
+			, #{updNo}
+			, CURRENT_TIMESTAMP()
+		)
+	</insert>
 </mapper>

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

@@ -162,6 +162,7 @@
 		     , FV.USE_POINT
 		     , FV.ITEM_QTY
 		     , FV.LIMIT_QTY
+			 , FV.LEFT_QTY
 		     , FV.ITEM_CD
 			 , FG.PRODUCT_NO
 			 , FG.GOODS_NM

+ 111 - 41
src/main/webapp/WEB-INF/views/marketing/CouponPopupForm.html

@@ -28,7 +28,8 @@
 				<input type="hidden" name="exceptGoodsList" id="excepGoodsList">
 				<input type="hidden" name="burdenList" id="burdenList">
 				<input type="hidden" name="cateList" id="cateList">
-				<input type="hidden" name="cpnId2" id="cpnId2" th:if="${cpnDetail}" th:value="${cpnDetail.cpnId}">
+				<input type="hidden" name="rdCpnNm" id="rdCpnNm">
+				<input type="hidden" name="cpnId" id="cpnId" th:if="${cpnDetail}" th:value="${cpnDetail.cpnId}">
 
 				<div class="tabs">
 					<div class="tabsNav">
@@ -36,6 +37,7 @@
 							<li class="on"><a href="#coupontab1">기본정보</a></li>
 							<li><a href="#coupontab2">적용대상</a></li>
 							<li><a href="#coupontab3">입점업체분담율</a></li>
+							<li class="randomCpnTab" style="display:none;"><a href="#coupontab4">시리얼및난수</a></li>
 						</ul>
 					</div>
 					<ul class="tabsCont">
@@ -49,14 +51,10 @@
 										<col style="width:40%;">
 									</colgroup>
 									<tbody>
-										<tr>
-											<th>쿠폰번호<em class="required" title="필수"></em></th>
+										<tr th:if="${cpnDetail}">
+											<th>쿠폰번호</th>
 											<td colspan="5">
-												<input type="hidden" name="copyCpnId" maxlength="50" value="">
-												<input type="text" name="cpnId" id="cpnId" maxlength="50"  style="width:70%;" disabled="true" readonly="readonly" placeholder="자동생성" data-valid-name="쿠폰번호">
-												<label class="chkBox checked" onclick="clickCreateChk(this);">
-													<input type="checkbox" name="cpnCreateType" value="true" class="type-check" checked />쿠폰번호 자동생성
-												</label>
+												<span th:if="${cpnDetail}" th:text="${cpnDetail.cpnId}"></span>
 											</td>
 										</tr>
 										<tr>
@@ -72,6 +70,27 @@
 												<label class="rdoBtn" th:if="${cpnTypeList}" th:each="oneData, status : ${cpnTypeList}"> <input type="radio" name="rdoCpnType"  th:text="${oneData.cdNm}" th:value="${oneData.cd}"/></label>
 											</td>
 										</tr>
+										<tr class="dcCdGb" style="display:none;">
+											<th>할인쿠폰유형<em class="required" title="필수"></em></th>
+											<td class="normalCol">
+												<input type="hidden" id="dcCd" required="required"  data-valid-name="할인쿠폰유형">
+												<label class="rdoBtn" th:if="${dcCdList}" th:each="oneData, status : ${dcCdList}"> <input type="radio" name="dcCdGb"  th:text="${oneData.cdNm}" th:value="${oneData.cd}"/></label>
+											</td>
+											<th class="randomCpnArea">난수생성수량<em class="required" title="필수"></em></th>
+											<td class="randomCpnArea">
+												<input type="text" name="randomCpnQty" class="w300" required="required" data-valid-name="랜덤쿠폰발급수량" data-valid-type="numeric">
+											</td>
+										</tr>
+										<tr class="serialCpnArea" style="display:none;">
+											<th>시리얼명<em class="required" title="필수"></em></th>
+											<td>
+												<input type="text" name="serialCpnNm" class="w300" required="required" data-valid-name="시리얼쿠폰키워드">
+											</td>
+											<th>쿠폰발급수량<em class="required" title="필수"></em></th>
+											<td>
+												<input type="text" name="serialCpnQty" class="w300" required="required" data-valid-name="시리얼쿠폰발급수량" data-valid-type="numeric">
+											</td>
+										</tr>
 										<tr>
 											<th>사용가능고객구분<em class="required" title="필수"></em></th>
 											<td>
@@ -247,8 +266,8 @@
 													<option value="N" selected="selected">N</option>
 												</select>
 											</td>
-											<th>총발행제한수량<em class="required" title="필수"></em></th>
-											<td>
+											<th class="dcCdCheck">총발행제한수량<em class="required" title="필수"></em></th>
+											<td class="dcCdCheck">
 												<input type="text" class="w200" name="totPubLimitQty" id="totPubLimitQty" value="0" required="required" data-valid-name="총발행제한수량" data-valid-type="numeric" style="text-align: right;">개<span class="cRed" id="totPubLimitQtySpan"> *제한없음</span>
 											</td>
 										</tr>
@@ -275,7 +294,7 @@
 												</select>
 											</td>
 										</tr>
-										<tr>
+										<tr class="dcCdCheck">
 											<th>1인당발행제한수량<em class="required" title="필수"></em></th>
 											<td>
 												<input type="text" class="w200" name="custPubLimitQty" id="custPubLimitQty" value="0" required="required" data-valid-name="1인당발행제한수량" data-valid-type="numeric" style="text-align: right;">개<span class="cRed" id="custPubLimitQtySpan"> *제한없음</span>
@@ -431,12 +450,19 @@
 										<button type="button" class="btn btn-danger btn-lg" id="btnDelRow">행삭제</button>
 									</li>
 								</ul>
-
 								<div id="inComGridList" style="width: 100%; height: 570px" class="ag-theme-balham"></div>
-
 							</div>
 						</li>
 						<!-- 입점업체분담끝-->
+						<!-- 난수 및 네임쿠폰 설정 -->
+						<li class="tab" id="coupontab4">
+							<div class="panelStyle">
+								<span>
+									<div id="randomCpnList" style="width: 100%; height: 500px" class="ag-theme-balham"></div>
+								</span>
+							</div>
+						</li>
+						<!-- 난수 및 네임쿠폰 설정-->
 					</ul>
 				</div>
 			</form>
@@ -551,12 +577,20 @@
 		{ headerName: "쿠폰대상일련번호"  , field: "cpnRefvalSq" , width: 120 , cellClass: 'text-center' , hide:true}
 	];
 
+	// ag-grid 공급처 컬럼
+	var randomCouponDefs = [
+		{ headerName : "생성쿠폰명" , field: "supplyCompCd" , width:150, cellClass: 'text-center'} ,
+		{ headerName: "고객아이디" , field: "supplyCompNm" , width:150, cellClass: 'text-center'},
+		{ headerName: "고객명" , field: "supplyCompNm" , width:150, cellClass: 'text-center'}
+	];
+
 	var inComGridOptions = gagaAgGrid.getGridOptions(columnDefs);
 	var cateGridOptions = gagaAgGrid.getGridOptions(cateSelColumnDefs);
 	var goodsGridOptions = gagaAgGrid.getGridOptions(goodsSelColumnDefs);
 	var brandGridOptions = gagaAgGrid.getGridOptions(brandSelColumnDefs);
 	var supplyGridOptions = gagaAgGrid.getGridOptions(supplyColumnDefs);
 	var excepGoodsGridOptions = gagaAgGrid.getGridOptions(excepGoodsColumnDefs);
+	var randomCouponGridOptions = gagaAgGrid.getGridOptions(randomCouponDefs);
 
 	inComGridOptions.defaultColDef.editable = true;
 	inComGridOptions.rowSelection = "multiple";
@@ -727,16 +761,42 @@
 
 		// 주문서 쿠폰 선택시 결제수단 노출
 		if(radioValue == 'G230_20') {
-			$('.payTypeTr').css('display' , '');
+			$('#CouponForm .payTypeTr').show();
 			$('#CouponForm #payType').attr('required' , true);
+			$("#CouponForm .dcCdGb").show();		// 할인쿠폰유형 노출
 		} else {
-			$('.payTypeTr').css('display' , 'none');
+			$('#CouponForm .payTypeTr').hide();
 			$('#CouponForm #payType').attr('required' , false );
+			$("#CouponForm .dcCdGb").hide();		// 할인쿠폰유형 숨김
+			$("#CouponForm input:radio[name='dcCdGb']:radio[value='G233_00']").prop('checked', true);		// 주문서 쿠폰이 아닐 경우 일반 쿠폰으로 설정
 		}
 
 		$('#CouponForm #cpnType').val(radioValue);
 	});
 
+	// 할인 쿠폰 유형 변경
+	$("#CouponForm input[name=dcCdGb]").bind('click change', function () {
+		if(this.value == "G233_00") {			// 일반 유형
+			$("#CouponForm .dcCdCheck").show();
+			$("#CouponForm .serialCpnArea").hide();
+			$("#CouponForm .randomCpnArea").hide();
+			$("#CouponForm #custJoinYn").parent().attr("colspan", "");
+			$("#CouponForm .normalCol").attr("colspan", "5");
+		} else {
+			if(this.value == "G233_10") {		// 시리얼 유형
+				$("#CouponForm .serialCpnArea").show();
+				$("#CouponForm .randomCpnArea").hide();
+				$("#CouponForm .normalCol").attr("colspan", "5");
+			} else {							// 난수 유형
+				$("#CouponForm .serialCpnArea").hide();
+				$("#CouponForm .randomCpnArea").show();
+				$("#CouponForm .normalCol").attr("colspan", "");
+			}
+			$("#CouponForm .dcCdCheck").hide();								// 총발행제한수량, 1회발행수량, 1인당발행제한수량 숨김
+			$("#CouponForm #custJoinYn").parent().attr("colspan", "5");		// 총발행제한 수량을 없애면서 신규회원여부 colspan 수정
+		}
+	});
+
 	// 적용대상 - 브랜드 추가 버튼시
 	$('#btnBrandAdd').on('click' , function(){
 		cfnOpenBrandListPopup("fnSetPopupBrandInfo", "M");
@@ -1105,31 +1165,6 @@
 		inComGridOptions.api.updateRowData({remove:gagaAgGrid.selectedRowData(inComGridOptions)});
 	});
 
-
-
-	// 쿠폰번호 자동생성 클릭시
-	function clickCreateChk(){
-		var flag = $('#CouponForm input[name=cpnCreateType]').prop("checked");
-		// 발급받은 이력이 있으면 수정 안됨
-		if(issueCnt > 0 ) {
-			return false;
-		}
-
-		if(!flag) {
-			$("#CouponForm input[name=cpnId]").prop("disabled", true);
-			$("#CouponForm input[name=cpnId]").attr("required", false);
-			$("#CouponForm input[name=cpnId]").attr("readonly", true);
-			$("#CouponForm input[name=cpnId]").attr("placeholder", "자동생성");
-			$('#CouponForm input[name=cpnCreateType]').prop("checked" , false);
-		} else{
-			$("#CouponForm input[name=cpnId]").prop("disabled", false);
-			$("#CouponForm input[name=cpnId]").attr("required", true);
-			$("#CouponForm input[name=cpnId]").attr("placeholder", "");
-			$("#CouponForm input[name=cpnId]").attr("readonly", false);
-			$('#CouponForm input[name=cpnCreateType]').prop("checked" , true);
-		}
-	}
-
 	// 제휴링크채널 수정 (제휴링크가 꼭필요한지 확인필요)
 	function fnChangeAfLinkCdList(){
 		var actionUrl = "/business/aflink/list" + '?' + $('#afChannel').serialize();
@@ -1180,6 +1215,15 @@
 		// 신규회원기간 세팅
 		$('#CouponForm #custJoinStdt').val($('#CouponForm #custJoinStDay').val() + " " + $('#CouponForm #custJoinStHH').val() + ":" + $('#CouponForm #custJoinStMM').val() + ":00");
 		$('#CouponForm #custJoinEddt').val($('#CouponForm #custJoinEdDay').val() + " " + $('#CouponForm #custJoinEdHH').val() + ":" + $('#CouponForm #custJoinEdMM').val() + ":59");
+
+		// 할인쿠폰 유형에 따른 총 발행수량 수정 (주문서 쿠폰이고 난수쿠폰일 경우)
+		if($('#CouponForm #cpnType').val() == "G230_20" && $('#CouponForm input:radio[name="dcCdGb"]:checked').val() == "G233_20") {
+			$('#CouponForm input[name="totPubLimitQty"]').val($('#CouponForm input[name="randomCpnQty"]').val());	// 총 발행수량 난수 생성수량으로 변경
+		} else if ($('#CouponForm #cpnType').val() == "G230_20" && $('#CouponForm input:radio[name="dcCdGb"]:checked').val() == "G233_10") {		// 주문서 쿠폰이고 시리얼 유형일 경우
+			$('#CouponForm input[name="rdCpnNm"]').val($('#CouponForm input[name="serialCpnNm"]').val());			// 시리얼유형쿠폰명 저장
+			$('#CouponForm input[name="totPubLimitQty"]').val($('#CouponForm input[name="serialCpnQty"]').val());	// 총 발행수량 랜덤쿠폰발급수량으로 변경
+		}
+
 		// 적용대상 - 공급처 그리드 전체값 세팅
 		var supplyAllData = gagaAgGrid.getAllRowData(supplyGridOptions);
 		var jsonSupplyCompData = JSON.stringify(supplyAllData);
@@ -1214,10 +1258,12 @@
 		gagaAgGrid.createGrid('supplyGridList', supplyGridOptions);
 		gagaAgGrid.createGrid('goodsGridList', goodsGridOptions);
 		gagaAgGrid.createGrid('excepGoodsGridList', excepGoodsGridOptions);
+		gagaAgGrid.createGrid('randomCpnList', randomCouponGridOptions);
 
 		// 초기화시 데이터 세팅
 		if (mode == "N") {
 			$('input[name=rdoCpnType]').eq(0).attr("checked", true);
+			$('input[name=dcCdGb]').eq(0).attr("checked", true);
 			$('input[name=rdoDcWay]').eq(0).attr("checked", true);
 			$('input[name=rdoApplyScope]').eq(0).attr("checked", true)
 			$('#CouponForm #availEdHH option:last').attr("selected", "selected");
@@ -1229,6 +1275,8 @@
 			$('#buyEdHH option:last').attr("selected", "selected");
 			$('#buyEdMM option:last').attr("selected", "selected");
 			$("#CouponForm #afChannel option:first").attr("selected" , "selected");
+			$("#CouponForm .normalCol").attr("colspan", "5");
+			$("#CouponForm .randomCpnArea").hide();
 		} else {
 			// 수정모드시 그리드 세팅
 			inComGridOptions.api.setRowData(cpnDtlBurdenList);
@@ -1264,6 +1312,29 @@
 			$("#CouponForm #buyLimitAmt").val(cpnDetail.buyLimitAmt);
 			$("#CouponForm #cpnId").val(cpnDetail.cpnId);
 
+			// 한번 저장되면 쿠폰유형, 할인쿠폰유형, 난수 생성수량, 시리얼명, 시리얼쿠폰발급수량 수정 불가 처리
+			$("#CouponForm input:radio[name='rdoCpnType']").attr('readonly', true);
+			$("#CouponForm input:radio[name='rdoCpnType']").parent().prop('disabled', true);
+			$("#CouponForm input:radio[name='dcCdGb']").attr('readonly', true);
+			$("#CouponForm input:radio[name='dcCdGb']").parent().prop('disabled', true);
+			$("#CouponForm input[name='serialCpnNm']").prop("disabled", true);
+			$("#CouponForm input[name='serialCpnQty']").prop("disabled", true);
+			$("#CouponForm input[name='randomCpnQty']").prop("disabled", true);
+
+			// 할인코드유형이 일반유형이 아니면 시리얼 및 난수 생성 및 지급 내역 탭 노출
+			if(cpnDetail.dcCdGb != "G233_00" ) {
+				$("#CouponForm .randomCpnTab").show();
+				if(cpnDetail.dcCdGb == "G233_10") {		// 시리얼 유형
+					$("#CouponForm input[name='serialCpnQty']").val(cpnDetail.totPubLimitQty);
+					$("#CouponForm input[name='serialCpnNm']").val(cpnDetail.rdCpnNm);
+					$("#CouponForm .serialCpnArea").show();
+				} else if (cpnDetail.dcCdGb == "G233_20") {
+					$("#CouponForm input[name='randomCpnQty']").val(cpnDetail.totPubLimitQty);
+					$("#CouponForm .randomCpnArea").show();
+					$("#CouponForm .normalCol").attr("colspan", "");
+				}
+			}
+
 			/*
 			$("#CouponForm input:checkbox[name='cpnCreateType']").parent("label").addClass("formControl");
 			$("#CouponForm input:checkbox[name='cpnCreateType']").parent("label").prop('disabled', true);
@@ -1318,7 +1389,6 @@
 				$("#CouponForm #downStMM").attr('disabled', true);
 				$("#CouponForm #buyLimitAmt").attr('readonly', true);
 				$("#CouponForm input:radio[name='rdoDcWay']").attr('readonly', true);
-				$("#CouponForm input:radio[name='rdoCpnType']").attr('readonly', true);
 				$("#CouponForm input:radio[name='rdoApplyScope']").attr('readonly', true);
 				$("#CouponForm .rdoBtn").css('cursor', 'auto');
 				$("#CouponForm #cpnId").attr('readonly', true);

+ 524 - 0
src/main/webapp/WEB-INF/views/marketing/RandomCouponList.html

@@ -0,0 +1,524 @@
+<!DOCTYPE html>
+<html lang="ko"
+      xmlns:th="http://www.thymeleaf.org">
+<!--
+ *************************************************************************
+ * @source  : RandomCouponList.html
+ * @desc    : 쿠폰난수관리 Page
+ *------------------------------------------------------------------------
+ * TSIT
+ * Copyright(c) 2020 TSIT, All rights reserved.
+ *------------------------------------------------------------------------
+ * VER  DATE        AUTHOR      DESCRIPTION
+ * ---  ----------- ----------  -----------------------------------------
+ * 1.0  2021.01.22  xodud1202   쿠폰난수관리
+ *************************************************************************
+-->
+<div id="main">
+    <!-- 메인타이틀 영역 -->
+    <div class="main-title"></div>
+
+    <!-- 메뉴 설명 -->
+    <div class="infoBox menu-desc"></div>
+    
+    <form id="searchForm" name="searchForm" th:action="@{'/marketing/coupon/random/list/paging'}" th:onsubmit="fnSearch(); return false;" >
+
+        <!-- 패널 영역1 -->
+        <div class="boxStyle">
+			<span class="boxControl">
+				<i class="fa fa-chevron-up" data-view="show"></i>
+                <!-- <i class="fa fa-times" data-view="show"></i> -->
+			</span>
+            <!-- 검색조건 영역 -->
+            <div class="boxTitle">검색조건</div>
+            <ul class="boxContent">
+                <li class="boxContentTop">
+                    <table class="frmStyle">
+                        <col width="8%">
+                        <col width="12%">
+                        <col width="8%">
+                        <col width="12%">
+                        <col width="8%">
+                        <col width="12%">
+                        <col width="8%">
+                        <col width="12%">
+                        <col width="8%">
+                        <col width="12%">
+                        <tr>
+                            <th>쿠폰명</th>
+                            <td>
+                                <input type="text" name="cpnNm" maxlength="40" class="type-text" style="width: 100%;"/>
+                            </td>
+                            <th>등록가능기간</th>
+                            <td colspan="10" id="terms" class="availTerm">
+                            </td>
+                        </tr>
+                    </table>
+                    <div class="panelBtnB">
+                        <input type="button" value="조회" class="btn btn-base btn-lg btn-info" id="btnSearch" onclick="fnSearch();"/>
+                        <input type="button" value="초기화" class="btn btn-dark btn-lg " onclick="$('#searchForm')[0].reset(); fnInitCalendar();" />
+                    </div>
+                </li>
+            </ul>
+            <!-- //검색조건 영역 -->
+        </div>
+        <!-- 패널 영역1 -->
+        <div class="panelStyle2">
+            <!-- 검색결과 영역 -->
+            <!-- 상단버튼 영역  -->
+            <ul class="lrStyle">
+                <li class="aR">
+                    검색결과 : <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 class="panelContent">
+                <div id="gridList" style="width: 100%;height: 400px;" class="ag-theme-balham"></div>
+            </div>
+            <div class="panelBtnB">
+                <!-- Paging -->
+                <div class="tablePaging" id="couponPagination"></div>
+                <!-- //Paging -->
+            </div>
+            <!-- 검색결과 영역 -->
+        </div>
+    </form>
+    <!-- //패널 영역2 -->
+    <!-- 등록/수정 -->
+    <div class="panelStyle2">
+        <ul class="lrStyle">
+            <li>
+                <span class="infoTxt cBlue"><i class="fa fa-info-circle" aria-hidden="true"></i>쿠폰시작문자(단일)의 경우에는 중복된 코드를 삽입할 수 없습니다.</span>
+            </li>
+        </ul>
+        <form id="detailForm" name="detailForm" action="#" th:action="@{'/marketing/coupon/random/save'}">
+            <input type="hidden" name="rdCpnSq"/>
+            <table class="frmStyle">
+                <colgroup>
+                    <col style="width:10%;"/>
+                    <col style="width:23.3%;"/>
+                    <col style="width:10%;"/>
+                    <col style="width:23.3%;"/>
+                    <col style="width:10%;"/>
+                    <col/>
+                </colgroup>
+                <tr>
+                    <th>쿠폰명<i class="star"></i></th>
+                    <td>
+                        <input type="text" class="w200" name="rdCpnNm" maxlength="50" data-valid-name="랜덤쿠폰명"/>
+                    </td>
+                    <th>쿠폰생성수량<i class="star"></i></th>
+                    <td>
+                        <input type="text" class="w200" name="rdCpnIdQty" maxlength="8" data-valid-name="랜덤쿠폰생성수량" data-valid-type="numeric"/>
+                    </td>
+                    <th>쿠폰시작문자<i class="star"></i></th>
+                    <td>
+                        <select name="rdCpnPrefixGb" data-valid-name="쿠폰시작문자구분" onchange="onChangePrefixGb(this.value);">
+                            <option value="R">랜덤</option>
+                            <option value="S">단일</option>
+                        </select>
+                        <input type="text" class="w200" name="rdCpnPrefix" maxlength="4" required="required" data-valid-name="쿠폰시작문자" data-valid-type="alphaNumeric" style="text-transform: uppercase;"/>
+                    </td>
+                </tr>
+                <tr>
+                    <th>지급구분(<font color="RED">*</font>)
+                    </th>
+                    <td>
+                        <label class="rdoBox" th:if="${rdcpnGbList}" th:each="oneData, status : ${rdcpnGbList}" >
+                            <input type="radio" name="rdcpnGb" class="type-radio" th:value="${oneData.cd}" th:text="${oneData.cdNm}" onchange="onChangePdGb(this.value);"/>
+                        </label>
+                    </td>
+                    <th class="rdcpnGbCpn">적용쿠폰ID<i class="star"></i></th>
+                    <td class="rdcpnGbCpn">
+                        <input name="cpnName" type="text" class="w150" onkeypress="if (window.event.keyCode == 13) { fnOpenCouponRetrievePopup('input[name=cpnId]', 'input[name=cpnName]'); }"/>
+                        <button type="button" class="btn icn" th:onclick="fnOpenCouponRetrievePopup('input[name=cpnId]', 'input[name=cpnName]')"><i class="fa fa-search cpn" aria-hidden="true"></i></button>
+                        <input name="cpnId" type="text" class="w100" maxlength="20" readonly/>
+                    </td>
+                    <th class="rdcpnGbCpn">쿠폰발급수량<i class="star"></i></th>
+                    <td class="rdcpnGbCpn">
+                        <input type="text" class="w200" name="cpnCnt" maxlength="20" data-valid-name="쿠폰발급수량" data-valid-type="numeric"/>
+                    </td>
+                    <th class="rdcpnGbPnt">적용포인트<i class="star"></i></th>
+                    <td class="rdcpnGbPnt">
+                        <input type="text" class="w200" name="pointAmt" maxlength="20" data-valid-name="적용포인트금액" data-valid-type="numeric"/>
+                    </td>
+                    <th class="rdcpnGbPnt">포인트만료일시<i class="star"></i></th>
+                    <td  class="rdcpnGbPnt">
+                        <input name="pointExpireDt" type="text" class="w80 schDate" maxlength="10" data-valid-name="포인트만료일시" />
+                    </td>
+                </tr>
+                <tr>
+                    <th>등록기간<i class="star"></i></th>
+                    <td class="dashR">
+                        <input name="regPossibleStdt" type="text" class="w80 schDate" maxlength="10" required data-valid-name="등록가능시작일자" />
+                        ~
+                        <input name="regPossibleEddt" type="text" class="w80 schDate" maxlength="10" required data-valid-name="등록가능종료일자" />
+                    </td>
+                    <th>중복사용가능여부<i class="star"></i></th>
+                    <td>
+                        <select name="dupUsableYn" required data-valid-name="중복사용가능여부">
+                            <option th:if="${useYnList}" th:each="oneData, status : ${useYnList}" th:value="${oneData.cd}" th:text="|${oneData.cdNm}|"></option>
+                        </select>
+                    </td>
+                    <th>사용여부<i class="star"></i></th>
+                    <td>
+                        <select name="useYn" required data-valid-name="사이트">
+                            <option th:if="${useYnList}" th:each="oneData, status : ${useYnList}" th:value="${oneData.cd}" th:text="|${oneData.cdNm}|"></option>
+                        </select>
+                    </td>
+                </tr>
+            </table>
+
+            <div class="panelBtnB">
+                <button type="button" class="btn btn-info btn-lg" id="btnNew">신규</button>
+                <button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
+            </div>
+        </form>
+    </div>
+</div>
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.paging.js?v=2019072202"></script>
+<script th:inline="javascript">
+    /*<![CDATA[*/
+
+    var columnDefs = [
+        {width: 40, minWidth: 40, cellClass: 'text-right', headerCheckboxSelection: true, checkboxSelection: true, filter: false, editable: false,pinned: 'left'}
+        ,{field: "rdCpnSq"       ,headerName:"랜덤쿠폰일련번호"     		,width:150   ,cellClass:"text-center",hide:true}
+        ,{field: "rdCpnNm"		,headerName:"쿠폰명"					,width:200	,cellClass:"text-center"
+            ,cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }
+        }
+        ,{field: "rdCpnIdQty"         ,headerName:"생성수량"     		,width:90   ,cellClass:"text-center"
+            ,cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }
+        }
+        ,{field: "rdCpnPrefix"        ,headerName:"랜덤쿠폰시작문자"          		,width:120   ,cellClass:"text-center",hide:true}
+        ,{field: "rdCpnPrefixGb"        ,headerName:"랜덤쿠폰시작문자구분"          		,width:120   ,cellClass:"text-center",hide:true}
+        ,{field: "regPossibleStdt"    ,headerName:"등록가능시작일시"    		,width:150   ,cellClass:"text-center"
+            ,cellRenderer: function(params) {T
+                return !gagajf.isNull(params.value) ? gagaAgGrid.toDateTimeFormat(params.value) : '';
+            }
+        }
+        ,{field: "regPossibleEddt"    ,headerName:"등록가능종료일시"           	,width:150   ,cellClass:"text-center"
+            ,cellRenderer: function(params) {
+                return !gagajf.isNull(params.value) ? gagaAgGrid.toDateTimeFormat(params.value) : '';
+            }
+        }
+        ,{field: "dupUsableYn"        ,headerName:"중복사용가능여부"          		,width:120   ,cellClass:"text-center"}
+        ,{field: "rdcpnGb"            ,headerName:"구분"            	,width:80   ,cellClass:"text-center",hide:true}
+        ,{field: "rdcpnGbNm"            ,headerName:"구분"            	,width:100   ,cellClass:"text-center"}
+        ,{field: "cpnId"              ,headerName:"적용쿠폰ID"          		,width:100   ,cellClass:"text-center"}
+        ,{field: "cpnCnt"             ,headerName:"쿠폰발급수량"            ,width:100   ,cellClass:"text-center"
+            , cellRenderer: function(params) {
+                return params.value.addComma();
+            }
+        }
+        ,{field: "pointAmt"             ,headerName:"적용포인트금액"        ,width:120   ,cellClass:"text-center"
+            , cellRenderer: function(params) {
+                return params.value.addComma();
+            }
+        }
+        ,{field: "pointExpireDt"           ,headerName:"포인트만료일시"          	,width:150   ,cellClass:"text-center"
+            ,cellRenderer: function(params) {
+                return !gagajf.isNull(params.value) ? gagaAgGrid.toDateTimeFormat(params.value) : '';
+            }
+        }
+        ,{field: "useYn"             ,headerName:"사용여부"        	,width:80   ,cellClass:"text-center"}
+        ,{field: "regId"              ,headerName:"등록자"           		,width:100   ,cellClass:"text-center"}
+        ,{field: "regDt"              ,headerName:"등록일시"            	,width:150   ,cellClass:"text-center"
+            ,cellRenderer: function(params) {
+                return !gagajf.isNull(params.value) ? gagaAgGrid.toDateTimeFormat(params.value) : '';
+            }
+        }
+        ,{field: "updId"              ,headerName:"수정자ID"           		,width:100   ,cellClass:"text-center",hide:true}
+        ,{field: "updDt"              ,headerName:"수정일시"            	,width:150   ,cellClass:"text-center",hide:true
+            ,cellRenderer: function(params) {
+                return !gagajf.isNull(params.value) ? gagaAgGrid.toDateTimeFormat(params.value) : '';
+            }
+        }
+    ];
+
+    var cpnListOpt = gagaAgGrid.getGridOptions(columnDefs);
+    cpnListOpt.rowSelection = 'multiple';
+    cpnListOpt.suppressRowClickSelection = true;
+
+    // 셀 클릭 이벤트
+    cpnListOpt.onCellClicked = function(event) {
+        var field = event.colDef.field;
+        if (event.colDef.field == "rdCpnIdQty"){
+            var rdCpnSq = event.data.rdCpnSq;
+            var actionUrl = "/marketing/coupon/random/cpnUseDetail/popup/form?rdCpnSq="+rdCpnSq;
+            cfnOpenModalPopup(actionUrl,'RandomCpnDetailPopup');
+        }
+
+        if (event.colDef.field == "rdCpnNm"){
+            var formId = '#detailForm';
+
+            // 기본정보 입력
+            $(formId + ' input[name=rdCpnSq]').val(event.data.rdCpnSq);
+            $(formId + ' input[name=rdCpnNm]').val(event.data.rdCpnNm);
+            $(formId + ' input[name=rdCpnIdQty]').val(event.data.rdCpnIdQty.addComma());
+            $(formId + ' select[name=dupUsableYn]').val(event.data.dupUsableYn);
+            $(formId + ' input[name=cpnId]').val(event.data.cpnId);
+            $(formId + ' input[name=cpnCnt]').val(event.data.cpnCnt.addComma());
+            $(formId + ' input[name=pointAmt]').val(event.data.pointAmt.addComma());
+            $(formId + ' select[name=useYn]').val(event.data.useYn);
+            $(formId + ' input[name=rdCpnPrefix]').val(event.data.rdCpnPrefix);
+            $(formId + ' select[name=rdCpnPrefixGb]').val(event.data.rdCpnPrefixGb);
+
+            $("input[name=rdcpnGb][value="+event.data.rdcpnGb+"]").prop('checked', true);
+            onChangePdGb(event.data.rdcpnGb);
+
+            // 등록 기간 설정
+            var stDate = event.data.regPossibleStdt.split(" ")[0];
+            var edDate = event.data.regPossibleEddt.split(" ")[0];
+            var exDate = '';
+            if(!gagajf.isNull(event.data.pointExpireDt)) {
+                exDate = event.data.pointExpireDt.split(" ")[0];
+            }
+
+            $(formId + ' input[name=regPossibleStdt]').val(stDate);
+            $(formId + ' input[name=regPossibleEddt]').val(edDate);
+            $(formId + ' input[name=pointExpireDt]').val(exDate);
+
+            //setComma("detailForm", true);
+
+        }
+    }
+
+    $(document).ready(function() {
+        var hideList = [];
+        cfnCreateCalendar('#terms', 'availStdt', 'availEddt', true, '지급일', '');
+        //$('.btnToday').trigger('click');
+
+        //대상구분 초기화
+        $("input[name=rdcpnGb][value=C]").prop('checked', true);
+        onChangePdGb("C");
+
+        $("select[name=dupUsableYn]").val("N");
+        $("select[name=rdCpnPrefixGb]").val("R");
+
+        setComma("detailForm", true);
+
+        // Create a agGrid
+        gagaAgGrid.createGrid('gridList', cpnListOpt);
+
+        uifnFitGrid('auto');
+
+        // fnSearch();
+    });
+
+    var fnInitCalendar = function() {
+        //$(".btnToday").trigger('click');
+    }
+
+    /**
+     * 목록 조회
+     */
+
+    function fnSearch() {
+        gagaPaging.init('searchForm', fnSearchCallBack, 'couponPagination', $('#searchForm').find('#pageSize').val());
+        gagaPaging.load(1);
+    }
+
+    var fnSearchCallBack = function(result) {
+        $('#searchForm').find('#gridRowTotalCount').html(result.paging.totalCount.addComma());
+        $('#searchForm').find('#pageNo').val(result.paging.pageNo.addComma());
+        $('#searchForm').find('#pgNo').html(result.paging.pageNo.addComma());
+        $('#searchForm').find('#endPgNo').html(result.paging.totalPage.addComma());
+        cpnListOpt.api.setRowData(result.CouponList);
+        gagaPaging.createPagination(result.paging);
+    }
+
+    //페이징
+    $('#searchForm select[name=pageSize]').on('change', function() {
+        $("#searchForm input[name=pageNo]").val('1');
+        $('#btnSearch').click();
+    });
+
+    $("#btnNew").on("click", function(){
+        $("#detailForm")[0].reset();
+        setComma("detailForm", false);
+        $("input[name=rdcpnGb][value=C]").prop('checked', true);
+        onChangePdGb("C");
+        $("select[name=dupUsableYn]").val("N");
+        $("select[name=rdCpnPrefixGb]").val("R");
+        setComma("detailForm", true);
+    });
+
+    $("#btnSave").on("click", function(){
+        var formId = '#detailForm';
+        var formJson = $(formId).serializeObject();
+
+        if(gagajf.isNull(formJson.rdCpnNm)){
+            mcxDialog.alert("쿠폰명을 입력해주세요");
+            return;
+        }
+
+        if(gagajf.isNull(formJson.rdCpnIdQty) || formJson.rdCpnIdQty < 1){
+            mcxDialog.alert("쿠폰생성수량을 입력해주세요");
+            return;
+        }
+
+        if(formJson.rdcpnGb == "C"){
+            if(gagajf.isNull(formJson.cpnId)){
+                mcxDialog.alert("적용할 쿠폰ID를 입력해주세요");
+                return;
+            }
+            if(gagajf.isNull(formJson.cpnCnt) || formJson.cpnCnt < 1){
+                mcxDialog.alert("쿠폰발급수량을 입력해주세요");
+                return;
+            }
+        }else if(formJson.rdcpnGb == "P"){
+            if(gagajf.isNull(formJson.pointAmt)){
+                mcxDialog.alert("적용할 포인트를 입력해주세요");
+                return;
+            }
+            if(gagajf.isNull(formJson.pointExpireDt)){
+                mcxDialog.alert("포인트만료일자를 입력해주세요");
+                return;
+            }
+        }
+
+        /*
+                if(formJson.rdCpnPrefixGb == "S" && formJson.rdCpnIdQty > 1){
+                    mcxDialog.alert("단일문자일 경우 쿠폰생성수량은 1개만 가능합니다.");
+                    return;
+                }
+        */
+
+        // 날짜 유효성 체크
+        var st = formJson.regPossibleStdt.replaceAll("-", "");
+        var ed = formJson.regPossibleEddt.replaceAll("-", "");
+
+        if (Number(st) > Number(ed)) {
+            mcxDialog.alert('등록시작일은 등록종료일보다 클 수 없습니다.');
+            return;
+        }
+
+        setComma("detailForm", false); // 숫자타입 콤마 제거
+
+        if(!gagajf.isNull(formJson.cpnId)){
+            $("input[name=cpnId]").val($("input[name=cpnId]").val().toUpperCase());
+        }
+        if(!gagajf.isNull(formJson.rdCpnPrefix)){
+            $("input[name=rdCpnPrefix]").val($("input[name=rdCpnPrefix]").val().toUpperCase());
+        }
+
+        mcxDialog.confirm('저장하시겠습니까?', {
+            cancelBtnText: "취소",
+            sureBtnText: "확인",
+            sureBtnClick: function(){
+                gagajf.ajaxFormSubmit($(formId).prop('action'), formId, fnSaveCallback);
+            }
+        });
+    });
+
+    function setComma(formId, pBoolean){
+        //숫자타입 콤마 찍어주기
+        $("#"+formId+" [data-valid-type=numeric]").each(function(){
+            $(this).change(function(){
+                if(pBoolean){
+                    $(this).val($(this).val().addComma());
+                }else{
+                    $(this).val($(this).val().removeComma());
+                }
+            });
+            if(pBoolean){
+                $(this).val($(this).val().addComma());
+            }else{
+                $(this).val($(this).val().removeComma());
+            }
+        });
+    }
+
+    function fnSaveCallback(){
+        $("#btnNew").trigger('click');
+        //setComma("detailForm", true);
+        fnSearch();
+    }
+
+    function fnCouponCreate(){
+        cfnCouponCreatePopup();
+    }
+
+    function fnCouponCopy(){
+        var selectedData = cpnListOpt.api.getSelectedRows();
+
+        if (selectedData.length == 0) {
+            mcxDialog.alert('선택된 행이 없습니다.');
+            return;
+        }
+        if (selectedData.length > 1) {
+            mcxDialog.alert('하나의 쿠폰만 선택하세요.');
+            return;
+        }
+        var cpnId = selectedData[0].cpnId;
+        var mode = "copy"
+        var actionUrl = "/marketing/coupon/popup/form?cpnId="+cpnId;
+        actionUrl += "&mode="+mode;
+        cfnOpenModalPopup(actionUrl,'CouponCreatePopup');
+    }
+
+    function fnCouponDetail(cpnId){
+        var actionUrl = "/marketing/coupon/popup/form?cpnId="+cpnId;
+        cfnOpenModalPopup(actionUrl,'CouponCreatePopup');
+    }
+
+    function fnCpnUseDetail(cpnId){
+        var actionUrl = "/marketing/coupon/cpnUseDetail/popup/form?cpnId="+cpnId;
+        cfnOpenModalPopup(actionUrl,'CpnUseDetailPopup');
+    }
+
+    // 쿠폰조회 팝업
+    var fnOpenCouponRetrievePopup = function(strReturnCode, strReturnName) {
+        var oParam = new Object();
+        oParam.returnCode = strReturnCode;
+        oParam.returnName = strReturnName;
+        cfnOpenCouponRetrievePopup($(strReturnName).val(), oParam);
+    }
+
+    /*유효기간구분온체인지이벤트*/
+    function onChangePdGb(val){
+        if(val == "C"){
+            $(".rdcpnGbCpn").show();
+            $(".rdcpnGbPnt").hide();
+        }else{
+            $(".rdcpnGbCpn").hide();
+            $(".rdcpnGbPnt").show();
+        }
+
+    }
+
+    function onChangePrefixGb(val){
+        $("input[name=rdCpnPrefix]").val('');
+        if(val == "S"){
+            $("input[name=rdCpnPrefix]").attr("maxlength", 10);
+            $("input[name=rdCpnPrefix]").attr("data-valid-type", "");
+        }else{
+            $("input[name=rdCpnPrefix]").attr("maxlength", 4);
+        }
+
+    }
+
+    var fnCouponExcelDownLoad = function(){
+        var selectedData = cpnListOpt.api.getSelectedRows();
+
+        if (selectedData.length == 0) {
+            mcxDialog.alert('선택된 행이 없습니다.');
+            return;
+        }
+
+        gagaAgGrid.exportToExcel('쿠폰목록', cpnListOpt, true);
+    }
+
+    /*]]>*/
+</script>
+
+</html>