Prechádzať zdrojové kódy

회원상세 - 쿠폰발급 개발 중

jsshin 5 rokov pred
rodič
commit
0ffe9324a5
27 zmenil súbory, kde vykonal 810 pridanie a 628 odobranie
  1. 36 0
      src/main/java/com/style24/admin/biz/dao/TsaCardPromotionDao.java
  2. 0 6
      src/main/java/com/style24/admin/biz/dao/TsaExchDao.java
  3. 0 6
      src/main/java/com/style24/admin/biz/dao/TsaPgDao.java
  4. 0 6
      src/main/java/com/style24/admin/biz/dao/TsaRefundDao.java
  5. 0 6
      src/main/java/com/style24/admin/biz/dao/TsaReturnDao.java
  6. 49 0
      src/main/java/com/style24/admin/biz/service/TsaCardPromotionService.java
  7. 3 2
      src/main/java/com/style24/admin/biz/service/TsaCouponService.java
  8. 2 2
      src/main/java/com/style24/admin/biz/web/TsaCustomerController.java
  9. 70 13
      src/main/java/com/style24/admin/biz/web/TsaMarketingController.java
  10. 1 20
      src/main/java/com/style24/admin/biz/web/TsaOrderChangeController.java
  11. 0 31
      src/main/java/com/style24/admin/support/env/TsaConstants.java
  12. 38 0
      src/main/java/com/style24/persistence/domain/CardPromotion.java
  13. 26 0
      src/main/java/com/style24/persistence/domain/CardPromotionCondition.java
  14. 20 0
      src/main/java/com/style24/persistence/domain/CardPromotionTarget.java
  15. 3 3
      src/main/java/com/style24/persistence/domain/Coupon.java
  16. 0 405
      src/main/java/com/style24/persistence/domain/Order.java
  17. 76 0
      src/main/java/com/style24/persistence/mybatis/shop/TsaCardPromotion.xml
  18. 20 40
      src/main/java/com/style24/persistence/mybatis/shop/TsaCoupon.xml
  19. 319 0
      src/main/webapp/WEB-INF/views/marketing/CardInterestForm.html
  20. 3 3
      src/main/webapp/WEB-INF/views/marketing/CouponListForm.html
  21. 78 35
      src/main/webapp/WEB-INF/views/marketing/CouponPopupForm.html
  22. 1 1
      src/main/webapp/WEB-INF/views/marketing/FreeGoodsPromotionForm.html
  23. 5 5
      src/main/webapp/WEB-INF/views/marketing/FreeGoodsPromotionRegiForm.html
  24. 39 22
      src/main/webapp/WEB-INF/views/marketing/MorebetterPopupForm.html
  25. 15 16
      src/main/webapp/WEB-INF/views/order/ExchangeRequestForm.html
  26. 5 5
      src/main/webapp/WEB-INF/views/order/OrderDetailForm.html
  27. 1 1
      src/main/webapp/ux/js/admin.popup.js

+ 36 - 0
src/main/java/com/style24/admin/biz/dao/TsaCardPromotionDao.java

@@ -0,0 +1,36 @@
+package com.style24.admin.biz.dao;
+
+import java.util.Collection;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.CardPromotion;
+
+/**
+ * 카드프로모션 Dao
+ *
+ * @author eskim
+ * @since 2021. 01. 29
+ */
+@ShopDs
+public interface TsaCardPromotionDao {
+
+	/**
+	 * 카드무이자할부 목록  건수
+	 * @param cardPromotion
+	 * @return
+	 * @author eskim
+	 * @since 2021. 1. 29
+	 */
+	int getCardInterestListCount(CardPromotion cardPromotion);
+
+	/**
+	 * 카드무이자할부 목록
+	 * @param cardPromotion
+	 * @return
+	 * @author eskim
+	 * @since 2021. 1. 29
+	 */
+	Collection<CardPromotion> getCardInterestList(CardPromotion cardPromotion);
+
+
+}

+ 0 - 6
src/main/java/com/style24/admin/biz/dao/TsaExchDao.java

@@ -1,12 +1,6 @@
 package com.style24.admin.biz.dao;
 
-import java.util.Collection;
-
-import org.apache.ibatis.session.ResultHandler;
-
 import com.style24.core.support.annotation.ShopDs;
-import com.style24.persistence.domain.Order;
-import com.style24.persistence.domain.OrderChange;
 
 /**
  * 교환관리 Dao

+ 0 - 6
src/main/java/com/style24/admin/biz/dao/TsaPgDao.java

@@ -1,12 +1,6 @@
 package com.style24.admin.biz.dao;
 
-import java.util.Collection;
-
-import org.apache.ibatis.session.ResultHandler;
-
 import com.style24.core.support.annotation.ShopDs;
-import com.style24.persistence.domain.Order;
-import com.style24.persistence.domain.OrderChange;
 
 /**
  * 주문관리 Dao

+ 0 - 6
src/main/java/com/style24/admin/biz/dao/TsaRefundDao.java

@@ -1,12 +1,6 @@
 package com.style24.admin.biz.dao;
 
-import java.util.Collection;
-
-import org.apache.ibatis.session.ResultHandler;
-
 import com.style24.core.support.annotation.ShopDs;
-import com.style24.persistence.domain.Order;
-import com.style24.persistence.domain.OrderChange;
 
 /**
  * 주문관리 Dao

+ 0 - 6
src/main/java/com/style24/admin/biz/dao/TsaReturnDao.java

@@ -1,12 +1,6 @@
 package com.style24.admin.biz.dao;
 
-import java.util.Collection;
-
-import org.apache.ibatis.session.ResultHandler;
-
 import com.style24.core.support.annotation.ShopDs;
-import com.style24.persistence.domain.Order;
-import com.style24.persistence.domain.OrderChange;
 
 /**
  * 반품관리 Dao

+ 49 - 0
src/main/java/com/style24/admin/biz/service/TsaCardPromotionService.java

@@ -0,0 +1,49 @@
+package com.style24.admin.biz.service;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.style24.admin.biz.dao.TsaCardPromotionDao;
+import com.style24.persistence.domain.CardPromotion;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 카드프로모션 Service
+ *
+ * @author eskim
+ * @since 2021. 01. 29
+ */
+@Service
+@Slf4j
+public class TsaCardPromotionService {
+
+	@Autowired
+	private TsaCardPromotionDao cardPromotionDao;
+
+	/**
+	 * 카드무이자할부 목록 건ㄴ수
+	 * @param cardPromotion
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 29
+	 */
+	public int getCardInterestListCount(CardPromotion cardPromotion) {
+		return cardPromotionDao.getCardInterestListCount(cardPromotion);
+	}
+
+	/**
+	 * 카드무이자할부 목록
+	 * @param cardPromotion
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 29
+	 */
+	public Collection<CardPromotion> getCardInterestList(CardPromotion cardPromotion) {
+		return cardPromotionDao.getCardInterestList(cardPromotion);
+	}
+
+
+}

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

@@ -5,6 +5,7 @@ import com.google.gson.reflect.TypeToken;
 import com.style24.admin.biz.dao.TsaCouponDao;
 import com.style24.admin.support.env.TsaConstants;
 import com.style24.admin.support.security.session.TsaSession;
+import com.style24.core.support.env.TscConstants;
 import com.style24.persistence.domain.*;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -166,7 +167,7 @@ public class TsaCouponService {
 		}
 
 		// 시리얼 쿠폰 생성(최초 쿠폰 생성일 경우에만)
-		if(cpnId == 0 && params.getCpnType().equals(TsaConstants.CpnType.PAY_CPN.value()) && params.getDcCdGb().equals(TsaConstants.DcCdGb.SERIAL.value())) {
+		if(cpnId == 0 && params.getCpnType().equals(TscConstants밝.CpnType.PAY_CPN.value()) && params.getDcCdGb().equals(TscConstants.DcCdGb.SERIAL.value())) {
 			// 시리얼 쿠폰명이 동일한 쿠폰이 일정 겹치는 부분이 있는지 확인
 			int overlapCheck = couponDao.getSerialOverlapCheck(params);
 			if(overlapCheck < 1) {
@@ -176,7 +177,7 @@ public class TsaCouponService {
 			} else {
 				throw new IllegalStateException("같은 시리얼명이 사용되는 쿠폰이 중복됩니다. 기간을 확인해주세요.");
 			}
-		} else if(cpnId == 0 && params.getCpnType().equals(TsaConstants.CpnType.PAY_CPN.value()) && params.getDcCdGb().equals(TsaConstants.DcCdGb.RANDOM.value())) {
+		} else if(cpnId == 0 && params.getCpnType().equals(TscConstants.CpnType.PAY_CPN.value()) && params.getDcCdGb().equals(TscConstants.DcCdGb.RANDOM.value())) {
 			Random random = new Random();
 			String prefixRandomCpn = "" + params.getCpnId();		// 랜덤 번호는 쿠폰번호 + 랜덤문자 = 12로 처리함
 			// 랜덤 문자 발급 수 만큼 진행

+ 2 - 2
src/main/java/com/style24/admin/biz/web/TsaCustomerController.java

@@ -10,7 +10,6 @@ import com.style24.admin.biz.service.TsaKakaoService;
 import com.style24.admin.biz.service.TsaSystemService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.session.TscSession;
-import com.style24.core.support.util.CryptoUtils;
 import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.CustContactHst;
 import com.style24.persistence.domain.CustGrade;
@@ -18,7 +17,7 @@ import com.style24.persistence.domain.Customer;
 import com.style24.persistence.domain.CustomerSearch;
 import com.style24.persistence.domain.Delivery;
 import com.style24.persistence.domain.GiftCard;
-import com.style24.persistence.domain.Order;
+
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -43,6 +42,7 @@ import com.style24.persistence.domain.Counsel;
 import lombok.extern.slf4j.Slf4j;
 
 import com.gagaframework.web.rest.server.GagaResponse;
+import com.style24.persistence.domain.Order;
 import com.style24.persistence.domain.Point;
 import com.style24.persistence.domain.Review;
 

+ 70 - 13
src/main/java/com/style24/admin/biz/web/TsaMarketingController.java

@@ -21,16 +21,21 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
+import com.style24.admin.biz.service.TsaCardPromotionService;
 import com.style24.admin.biz.service.TsaCommonService;
 import com.style24.admin.biz.service.TsaCouponService;
 import com.style24.admin.biz.service.TsaFreegiftPromotionService;
 import com.style24.admin.biz.service.TsaMorebetterService;
 import com.style24.admin.biz.service.TsaRendererService;
 import com.style24.admin.biz.service.TsaReviewService;
+import com.style24.admin.biz.service.TsaSystemService;
 import com.style24.admin.support.controller.TsaBaseController;
 import com.style24.admin.support.security.session.TsaSession;
+import com.style24.core.biz.service.TscPointService;
+import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.persistence.TscPageRequest;
+import com.style24.persistence.domain.CardPromotion;
 import com.style24.persistence.domain.CommonCode;
 import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.CouponRefval;
@@ -40,12 +45,15 @@ import com.style24.persistence.domain.MoreBetter;
 import com.style24.persistence.domain.MoreBetterBurden;
 import com.style24.persistence.domain.MoreBetterGoods;
 import com.style24.persistence.domain.MoreBetterSection;
+import com.style24.persistence.domain.Point;
 import com.style24.persistence.domain.Review;
+import com.style24.persistence.domain.User;
 
 import lombok.extern.slf4j.Slf4j;
 
 import com.gagaframework.web.parameter.GagaMap;
 import com.gagaframework.web.rest.server.GagaResponse;
+import com.gagaframework.web.util.GagaDateUtil;
 
 /**
  * 마케팅 Controller
@@ -87,6 +95,9 @@ public class TsaMarketingController extends TsaBaseController {
 	@Autowired
 	private TscPointService corePointService;
 
+	@Autowired
+	private TsaCardPromotionService cardPromotionService;
+
 	/**
 	 * 상품평관리 화면
 	 * @return
@@ -120,10 +131,10 @@ public class TsaMarketingController extends TsaBaseController {
 
 //		// 품목
 //		mav.addObject("itemkindList", rendererService.getAllItemkindList());
-//		
+//
 //		// 브랜드그룹
 //		mav.addObject("brandGrpNmList", rendererService.getBrandGroupList());
-//		
+//
 //		// MD
 //		mav.addObject("brandMdList", rendererService.getBrandMdList());
 //
@@ -171,7 +182,7 @@ public class TsaMarketingController extends TsaBaseController {
 	 * @author xodud1202
 	 * @since 2020. 12. 16
 	 */
-	@GetMapping("/freeGoods/promotion/form")
+	@GetMapping("/freegoods/promotion/form")
 	public ModelAndView freeGoodsPromotionForm() {
 		ModelAndView mav = new ModelAndView();
 		mav.setViewName("marketing/FreeGoodsPromotionForm");
@@ -183,7 +194,7 @@ public class TsaMarketingController extends TsaBaseController {
 	 * @author xodud1202
 	 * @since 2020. 12. 16
 	 */
-	@PostMapping("/freeGoodsPromotion/list")
+	@PostMapping("/freegoods/promotion/list")
 	@ResponseBody
 	public GagaMap getFreeGoodsPromotionList(@RequestBody FreeGoodsPromotion param) {
 		GagaMap result = new GagaMap();
@@ -206,7 +217,7 @@ public class TsaMarketingController extends TsaBaseController {
 	 * @since 2020. 12. 23
 	 */
 	@ResponseBody
-	@GetMapping("/freeGoodsRegiPopup/form")
+	@GetMapping("/freegoods/promotion/popup/form")
 	public ModelAndView freeGoodsRegiForm(FreeGoodsPromotion param) {
 		ModelAndView mav = new ModelAndView();
 
@@ -248,11 +259,11 @@ public class TsaMarketingController extends TsaBaseController {
 	}
 
 	/**
-	 * 사은품 프로모션 목록 조회
+	 * 사은품 프로모션 상세 조회
 	 * @author xodud1202
 	 * @since 2021. 01. 28
 	 */
-	@PostMapping("/freeGoodsPromotion/detail")
+	@PostMapping("/freegoods/promotion/detail")
 	@ResponseBody
 	public GagaMap getFreeGoodsPromotionDetail(FreeGoodsPromotion param) {
 		return freegiftService.getFreegiftDetailInfo(param);
@@ -266,7 +277,7 @@ public class TsaMarketingController extends TsaBaseController {
 	 * @since 2021. 01. 14
 	 */
 	@ResponseBody
-	@PostMapping("/freeGoodsPromotion/save")
+	@PostMapping("/freegoods/promotion/save")
 	public GagaResponse freeGoodsPromotionSave(@RequestBody FreeGoodsPromotion param) {
 		try {
 			freegiftService.saveFreegoodsPromotionInfo(param);
@@ -286,7 +297,7 @@ public class TsaMarketingController extends TsaBaseController {
 	 * @since 2021. 01. 14
 	 */
 	@ResponseBody
-	@PostMapping("/freeGoodsPromotion/changeStat")
+	@PostMapping("/freegoods/promotion/change/stat")
 	public GagaResponse freeGoodsPromotionChangeStat(@RequestBody FreeGoodsPromotion param) {
 		try {
 			freegiftService.updateFreegoodsPromotionStat(param);
@@ -674,8 +685,8 @@ public class TsaMarketingController extends TsaBaseController {
 
 			moreBetter1.setEventStdt(new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
 			moreBetter1.setEventEdHH(new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime()));
-			moreBetter1.setEventEdHH("23");
-			moreBetter1.setEventEdMM("59");
+			moreBetter1.setEventEdHH("24");
+			moreBetter1.setEventEdMM("00");
 			mav.addObject("tmtbMstInfo", moreBetter1);
 		}
 
@@ -944,7 +955,6 @@ public class TsaMarketingController extends TsaBaseController {
 		return super.ok(message.getMessage("SUCC_0004"));
 	}
 
-
 	/**
 	 * 쿠폰발급 팝업
 	 * @param elementCustNo - 고객일련번호
@@ -981,7 +991,7 @@ public class TsaMarketingController extends TsaBaseController {
 
 	/**
 	 * 회원상세 - 쿠폰발급
-	 * @param coupon - 쿠폰정보
+	 * @param custCoupon - 쿠폰정보
 	 * @return GagaResponse
 	 * @author jsshin
 	 * @since 2021. 1. 29
@@ -992,4 +1002,51 @@ public class TsaMarketingController extends TsaBaseController {
 		couponService.saveCouponIssue(custCoupon);
 		return super.ok(message.getMessage("SUCC_0006"));
 	}
+
+	/**
+	 *   카드관련 작업 시작 - eskim
+	 */
+
+	/**
+	 * 카드무이자할부 관리
+	 * @param
+	 * @return
+	 * @author eskim
+	 * @since 2021. 1. 29
+	 */
+	@GetMapping("/card/interest/form")
+	@ResponseBody
+	public ModelAndView pointGrantPopupForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.setViewName("marketing/CardInterestForm");
+		return mav;
+	}
+
+	/**
+	 * 카드무이자할부 목록
+	 * @param cardPromotion
+	 * @return
+	 * @author eskim
+	 * @since 2021. 1. 29
+	 */
+	@PostMapping("/card/interest/list")
+	@ResponseBody
+	public GagaMap getCardInterestList(@RequestBody CardPromotion cardPromotion) {
+
+		GagaMap result = new GagaMap();
+
+		cardPromotion.setPageable(new TscPageRequest(cardPromotion.getPageNo() - 1, cardPromotion.getPageSize()));
+		cardPromotion.getPageable().setTotalCount(cardPromotionService.getCardInterestListCount(cardPromotion));
+
+		result.set("pageing", cardPromotion);
+		result.set("cardPromotionList", cardPromotionService.getCardInterestList(cardPromotion));
+
+		return result;
+	}
+
+	/**
+	 *   카드관련 작업 종료 - eskim
+	 */
+
 }

+ 1 - 20
src/main/java/com/style24/admin/biz/web/TsaOrderChangeController.java

@@ -522,26 +522,7 @@ public class TsaOrderChangeController extends TsaBaseController {
 		
 		return result;
 	}
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
+
 	/**
 	 * 취소요청 (ADMIN, NAPY, 외부몰) (배치) (사용안함)
 	 * 

+ 0 - 31
src/main/java/com/style24/admin/support/env/TsaConstants.java

@@ -41,35 +41,4 @@ public class TsaConstants {
 			return value;
 		}
 	}
-
-	// 쿠폰유형
-	public enum CpnType {
-		CATE_CPN("G230_13"),			// 장바구니쿠폰
-		PAY_CPN("G230_20");			// 주문서쿠폰
-
-		private String value;
-
-		private CpnType(String value) {
-			this.value = value;
-		}
-
-		public String value() {
-			return value;
-		}
-	}
-
-	// 할인 코드 유형
-	public enum DcCdGb {
-		NARMAL("G233_00"),			// 일반 쿠폰 유형
-		SERIAL("G233_10"),			// 시리얼 쿠폰 유형
-		RANDOM("G233_20");			// 랜덤 쿠폰 유형
-
-		private String value;
-
-		private DcCdGb(String value) {	this.value = value;	}
-
-		public String value() {
-			return value;
-		}
-	}
 }

+ 38 - 0
src/main/java/com/style24/persistence/domain/CardPromotion.java

@@ -0,0 +1,38 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+import com.style24.persistence.TscPageRequest;
+
+import lombok.Data;
+
+/**
+ * 카드프로모션 Domain
+ *
+ * @author eskim
+ * @since 2021. 01. 29
+ */
+@SuppressWarnings("serial")
+@Data
+public class CardPromotion extends TscBaseDomain {
+
+	private Integer cardPrmtSq;	// 카드프로모션일련번호
+	private String prmtNm;	// 프로모션명
+	private String prmtStd;	// 프로모션시작일
+	private String prmtEdd;	// 프로모션종료일
+	private String prmtGb;	// 프로모션구분(A:할인, B:무이자)
+	private String dcGb;	// 행사구분(프로모션구분이 A:할인인 경우)
+	private String linkUrl;	// 연결URL
+	private String note;	// 안내
+	private String dispYn;	// 표시여부
+
+	// 검색조건
+	private String stDate;
+	private String edDate;
+	private String beforSkipFlag;
+
+	// Pagination
+	private TscPageRequest pageable;
+	private int pageNo = 1;
+	private int pageSize = 50;
+	private int pageUnit = 10;
+}

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

@@ -0,0 +1,26 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 카드프로모션 행사조건 Domain
+ *
+ * @author eskim
+ * @since 2021. 01. 29
+ */
+@SuppressWarnings("serial")
+@Data
+public class CardPromotionCondition extends TscBaseDomain {
+
+	private Integer cardPrmtCdtSq;	// 카드프로모션행사조건일련번호
+	private int cardPrmtSq;	// 카드프로모션일련번호
+	private int minPayAmt;	// 최소결제금액
+	private String dcWay;	// 할인구분할인방식(공통코드G240, 프로모션구분이 A:할인인 경우)
+	private int dcVal;	// 할인값(프로모션구분이 A:할인인 경우, 할인방식이 금액이면 할인금액, 율이면 할인율)
+	private int maxDcAmt;	// 최대할인금액(프로모션구분이 A:할인인 경우)
+	private String minNoItrt;	// 최소무이자월수(프로모션구분이 B:무이자 인경우)
+	private String maxNoItrt;	// 최대무이자월수(프로모션구분이 B:무이자 인경우)
+
+}

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

@@ -0,0 +1,20 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 카드프로모션 대상 Domain
+ *
+ * @author eskim
+ * @since 2021. 01. 29
+ */
+@SuppressWarnings("serial")
+@Data
+public class CardPromotionTarget extends TscBaseDomain {
+
+	private Integer cardPrmtCdtSq;	// 카드프로모션행사조건일련번호
+	private String prmtTargetCd;	// 포로모션대상카드(공통코드G941)
+
+}

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

@@ -45,8 +45,8 @@ public class Coupon extends TscBaseDomain {
     private String reissuance;				// 쿠폰재발급여부(공통코드G231)
     private String cpnStat;				    // 쿠폰상태(공통코드G232)
     private String endAlimYn;				// 만료알림여부
-    private String firstYn;				    // 첫구매여부 (Y:구매이력이없음 | N:구매이력있음)
-    private String downYn;					// 다운로드가능여부(마이페이지, 상품상세) --> EP쿠폰, 난수쿠폰
+    private String firstOrdYn;				// 첫구매여부 (Y:구매이력이없음 | N:구매이력있음)
+    private String downAblYn;				// 다운로드가능여부(마이페이지, 상품상세) --> EP쿠폰, 난수쿠폰
     private String custJoinStdt;			// 회원가입일자(FROM) 20200101 (신규회원여부의 판단을 가입일자로 설정함)
     private String custJoinEddt;			// 회원가입일자(FROM) 20200101 (신규회원여부의 판단을 가입일자로 설정함)
     private String buyStdt;				    // 회원가입일자(FROM) 20200101 (구매기간일자(FROM) (해당기간에 구매이력이 없으면 다운로드 가능))
@@ -54,7 +54,7 @@ public class Coupon extends TscBaseDomain {
     private int    issueCnt;				// 쿠폰발급개수
     private int    useCnt;					// 쿠폰사용개수
     private String payType;                 // 결제수단
-    private String custJoinYn;              // 신규회원여부
+    private String newCustYn;              // 신규회원여부
     private String afChannel;               // 제휴링크
     private String dcCdGb;                  // 할인코드유형 (공통코드G233)
     private String rdCpnNm;                 // 랜덤쿠폰 사용키 (시리얼명 or 난수)

+ 0 - 405
src/main/java/com/style24/persistence/domain/Order.java

@@ -1,405 +0,0 @@
-package com.style24.persistence.domain;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.style24.persistence.TscBaseDomain;
-
-import com.style24.persistence.TscPageRequest;
-import lombok.Data;
-
-/**
- * 주문 Domain
- *
- * @author jsh77b
- * @since 2020. 11. 16
- */
-@SuppressWarnings("serial")
-@Data
-public class Order extends TscBaseDomain {
-	
-	// 주문마스터
-	private int ordNo;
-	private String mallGb;
-	private String mallGbNm;
-	private String ordDt;
-	private String payDt;
-	private int custNo;
-	private String ordNm;
-	private String ordTelno;
-	private String siteCd;
-	private String siteCdNm;
-	private int npayOrdNo;
-	private String frontGb;
-	private String frontGbNm;
-	private String extmallNm;
-
-	// 주문상세
-	private int ordDtlNo;
-	private String ordExchGb;
-	private String ordDtlStat;
-	private int orgOrdDtlNo;
-	private String supplyCompCd;
-	private String goodsCd;
-	private String formalGb;
-	private String formalGbNm;
-	private String goodsType;
-	private int listPrice;
-	private int currPrice;
-	private double dcRate;
-	private int optAddPrice;
-	private int ordQty;
-	private int ordAmt;
-	private int cnclRtnQty;
-	private int cnclRtnAmt;
-	private int cpn1CpnSq;
-	private int cpn1DcAmt;
-	private int tmtb1Sq;
-	private int tmtb1DcAmt;
-	private int tmtb2Sq;
-	private int tmtb2DcAmt;
-	private int goodsCpnSq;
-	private int goodsCpnDcAmt;
-	private int cartCpnSq;
-	private int cartCpnDcAmt;
-	
-	private int pntDcAmt;
-	private int prePntDcAmt;
-	private int savePntAmt;
-	
-	private int realOrdAmt;
-	private String venderId;
-	private String extmallId;
-	private String agentOrderId;
-	private String extmallOrderId;
-	private String changeableYn;
-	private String changeFeeFreeYn;
-	private String returnableYn;
-	private String returnFeeFreeYn;
-	
-	private String soldoutYn;
-	private String soldoutMemo;
-	private String soldoutRegNo;
-	private String soldoutRegDt;
-	private int delvAddrSq;
-	private String shotDelvYn;
-	private String giftPackYn;
-	
-	private String delvLocCd;
-	private String delvAssigngDt;
-	private String delvAddignStat;
-	private String dstrbtMemo;
-	private String delvStdt;
-	private String delvEddt;
-	
-	private String shipCompCd;
-	private String invoiceNo;
-	private String invoiceSendYn;
-	private String sellStoreCd;
-	private double sellFeeRate;
-	
-	private String afLinkCd;
-	private String ithrCd;
-	private String contentsLoc;
-	
-	private int planDtlsq;
-	private int socialSq;
-	
-	private String condition;
-	private String[] conditions = null;
-	
-	private String stDate;
-	private String edDate;
-	private String searchDateGb;
-	private String orderNm;
-	private int custId;
-	private String orderPhnno;
-	private String vendorId;
-	private String sizeCd;
-	private String goodsNm;
-	private String payMeans;
-	private String chgStat;
-	private String recipNm;
-	private String chgGb;
-	private String wdInvoiceSendYn;
-	
-	// 상품정보
-	private String imgPath1;
-	private String sysImgNm;
-	private String brandCd;
-	private String optCd1;
-	private String optCd2;
-	private String goodsTypeNm;
-	private String brandEnm;
-	private String itemCd;
-	private String goodsNum;
-	private String supplyGoodsCd;
-	private String optCd2s;
-	private int currStockQty;
-	private String currStockQtys;
-	
-	private int totDcAmt;
-	private String dateGbn;
-	private String mallCd;
-	private String search;
-	
-	/* Multi CheckBox 항목*/
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] multiBrand;
-
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] multiOrdStat;
-
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] multiOrdDtlStat;
-	
-	private int sumOrdAmt;
-	private int sumOrdCnclAmt;
-	private int sumRealPayAmt;
-	private int ordNoCnt;
-	private int sumOrdQty;
-	private int sumOrdCnclQty;
-	
-	private String excelFileNm;
-	
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private int[] ordNoList;
-	
-	private String delYn;
-	private String recipPhnno;
-	private String recipTelno;
-	private String recipZipcode;
-	private String recipBaseAddr;
-	private String recipDtlAddr;
-	private String ordEmail;
-	private String delvMemo;
-	private String delvAddrEditYn;
-	private String exchGbNm;
-	
-	private String escrowYn;
-	private String payMeansNm;
-	private String cardNm;
-	private String vaBank;
-	private String pgTradeNo;
-	private String payStat;
-	private String payStatNm;
-	private int payAmt;
-	private String vaDeadLine;
-	
-	private String delvFeeGb;
-	private String delvFeeGbNm;
-	private int delvFee;
-	private String delvUsacYn;
-	private String delvUsacDt;
-	private int delvFeeSq;
-	
-	private String coundelClsf;
-	private String relGoodsCd;
-	private String questTitle;
-	private String questDt;
-	private String ansDt;
-	private int andNo;
-	
-	private int ordChgSq;
-	private String chgGbNm;
-	private String chgStatNm;
-	private String chgReason;
-	private String chgReasonNm;
-	private String chgMemo;
-	private String chgerNm;
-	private String chgerPhnno;
-	private String chgerZipcode;
-	private String chgerBaseAddr;
-	private String chgerDtlAddr;
-	private String wdInvoiceNo;
-	
-	private String supplyCompNm;
-	private String brandKnm;
-	private String ordDtlStatNm;	
-	private String ordPhnno;
-	
-	private String custGrade;
-	private String custGradeNm;
-	private String custGb;
-	private String custGbNm;
-	private String managedRsn;
-	private String managedRsnNm;
-	
-	private int itemQty;
-	private int itemPrice;
-	private String itemNm;
-	private int gfcdUseAmt;
-	
-	// Pagination
-	private TscPageRequest pageable;
-	private int pageNo = 1;
-	private int pageSize = 50;
-	private int pageUnit = 10;
-	
-	// 주문문의 1:1 응답 칼럼
-	private String counselClsfNm;
-	private String ansNo;
-	private String ansNm;
-	private String regNm;
-	private String updNm;
-	
-	// 주문메모칼럼
-	private int orderMemoSq;
-	private String memo;
-	private String orgFileNm;
-	private String sysFileNm;
-	
-	// 사은품칼럼
-	private int ordFreegiftSq;
-	private int freegiftSq;
-	private String freegiftNm;
-	private int freegiftValSq;
-	private int usePoint;
-	private int seq;
-	private String userNm;
-	
-	// 환불계좌칼럼
-	private String raBank;
-	private String raBankNm;
-	private String raNo;
-	private String raNm;
-	private String defaultYn;
-	
-	// 주문상세변경내역칼럼
-	private String userId;
-	private String updId;
-	private String shipCompNm;
-	private String shipCompId;
-	
-	// 주문쿠폰
-	private int cpnSq;
-	private int cpnId;
-	private int cpnDcAmt;
-	private String cpnType;
-	private String targetCd1;
-	private String targetCd2;
-	private String cpnNm;
-	private String dcWay;
-	private int dcPval;
-	private int dcMval;
-	private int dcAval;
-	
-	// 주문포인트
-	private int pntPrate;
-	private int pntMrate;
-	private int pntAmt;
-	private String occurGb;
-	private String occurGbNm;
-	private String occurDtlDesc;
-	
-	// 주문상품권
-	private String gfcdNm;
-	private String gfcdNo;
-	private int gfcdAmt;
-	private int chgGfcdAmt;
-	private int usGfcdAmt;
-	private int rmGfcdAmt;
-	
-	// 다다익선
-	private int tmtbSq;
-	private String tmtbNm;
-	private int tmtbDcAmt;
-	
-	// 상태변경
-	private String g20;
-	private String g30;
-	private String g40;
-	private String g50;
-	private String g55;
-	private String g60;
-	
-	// 취소요청
-	private String cncWait;
-	private int ordReqChgQty;
-	private int itemReqChgQty;
-	private int itemOrdPrice;
-	private int minOrdAmt;
-	private int orgDelvFee;
-	private String delvFeeCd;
-	private int ordCanChgQty;
-	private String allCanYn;
-	
-	private String addDelvFeeYn;
-	private int addDelvFee;
-	private int ordDtlItemSq;
-	
-	private int paySq;
-	private int refundAmt;
-	private int rfCpn1Amt;
-	private int rfTmtb1Amt;
-	private int rfTmtb2Amt;
-	private int rfGoodsCpnAmt;
-	private int rfCartCpnAmt;
-	private int rfPntAmt;
-	private int rfPrePntAmt;
-	private int rfGfcdUseAmt;
-
-	private int pgCpnAmt;
-	private int npayPntAmt;
-	private String payGb;
-	private String pgGb;
-	private String pgTid;
-	private String cardType;
-	private String cardKind;
-	private String cardBank;
-	private String cardMips;
-	private String cardPcableYn;
-	private String vaNo;
-	private String vaNm;
-	private String vaDeadline;
-	private String telecom;
-
-	private String accountNo;
-	private String accountNm;
-	private String bankCd;
-	private String bankNm;
-
-	private int realDelvAmt;
-	private int delvCpnSq;
-	private int delvCpnDcAmt;
-
-	private int chgQty;
-	private int rtnDelvFee;
-	private int excDelvFee;
-
-	private String[] ordDtlStatArr;
-	
-	// 교환요청
-	private String ordChgOpt;
-	private String rtnLocZipcode;
-	private String rtnLocBaseAddr;
-	private String rtnLocDtlAddr;
-	private String rtnLocTelno;
-	private String rtnLocNm;
-	private int exchangeOrdDtlNo;
-	private int exchangeOrdDtlItemSq;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

+ 76 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsaCardPromotion.xml

@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.admin.biz.dao.TsaCardPromotionDao">
+
+	<!-- 목록 페이징 정보 -->
+	<sql id="getListPagingCondition_sql">
+		<choose>
+		<when test="pageable != null">
+		    ) A
+		)Z
+		WHERE RNUM BETWEEN  #{pageable.startRow} AND #{pageable.endRow}
+		</when>
+		<otherwise>
+		    ) A
+		)Z
+		</otherwise>
+		</choose>
+	</sql>
+	
+	<!-- 카드무이자할부 목록 건수-->
+	<select id="getCardInterestListCount" parameterType="CardPromotion" resultType="int">
+		/* TsaCardPromotionDao.getCardInterestListCount */
+		SELECT COUNT(1)
+		FROM TB_CARD_PROMOTION 
+		WHERE PRMT_GB = #{prmtGb}
+		<if test="stDate != null and stDate != ''">
+		AND PRMT_EDD >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
+		</if>
+		<if test="edDate != null and edDate != ''">
+		<![CDATA[
+		AND PRMT_STD < DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+		]]>
+		</if>
+		<if test='beforSkipFlag != null and beforSkipFlag == "Y"'>
+		AND PRMT_EDD >= NOW() 
+		</if>
+	</select>
+	
+	<!-- 카드무이자할부 목록 -->
+	<select id="getCardInterestList" parameterType="CardPromotion" resultType="CardPromotion">
+		/* TsaCardPromotionDao.getCardInterestList */
+		SELECT Z.*
+		FROM (
+		    SELECT A.*, @rownum := @rownum + 1 AS RNUM 
+		    FROM (
+		        SELECT CARD_PRMT_SQ
+		             , PRMT_NM
+		             , DATE_FORMAT(PRMT_STD, '%Y%m%d%H%i%S') AS PRMT_STD
+		             , DATE_FORMAT(PRMT_EDD, '%Y%m%d%H%i%S') AS PRMT_EDD
+		             , PRMT_GB
+		             , DC_GB
+		             , LINK_URL
+		             , NOTE
+		             , DISP_YN
+		             , FN_GET_USER_NM(REG_NO) AS REG_NM
+		             , DATE_FORMAT(REG_DT, '%Y%m%d%H%i%S') AS REG_DT
+		             , FN_GET_USER_NM(UPD_NO) AS UPD_NM
+		             , DATE_FORMAT(UPD_DT, '%Y%m%d%H%i%S') AS UPD_DT
+		        FROM TB_CARD_PROMOTION 
+		        WHERE PRMT_GB = #{prmtGb}
+		        <if test="stDate != null and stDate != ''">
+		        AND PRMT_EDD >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
+		        </if>
+		        <if test="edDate != null and edDate != ''">
+		        <![CDATA[
+		        AND PRMT_STD < DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+		        ]]>
+		        </if>
+		        <if test='beforSkipFlag != null and beforSkipFlag == "Y"'>
+		        AND PRMT_EDD >= NOW() 
+		        </if>
+		<include refid="getListPagingCondition_sql"/>
+	</select>
+	
+	
+</mapper>

+ 20 - 40
src/main/java/com/style24/persistence/mybatis/shop/TsaCoupon.xml

@@ -11,7 +11,6 @@
 				SELECT SITE_CD
 					 , CPN_ID
 					 , CPN_NM
-					 , USABLE_CUST_GB
 					 , CPN_TYPE
 					 , DC_WAY
 					 , DC_PVAL
@@ -56,7 +55,6 @@
 		GROUP BY  T.SITE_CD
 				, T.CPN_ID
 				, T.CPN_NM
-				, T.USABLE_CUST_GB
 				, T.CPN_TYPE
 				, T.DC_WAY
 				, T.DC_PVAL
@@ -113,8 +111,6 @@
 		    CPN_NM
 		  , SITE_CD
 		  , AF_LINK_CD
-		  , USABLE_CUST_GB
-		  , USABLE_CUST_GRADE
 		  , CPN_TYPE
 		  , APPLY_SCOPE
 		  , DC_WAY
@@ -142,22 +138,17 @@
 		  , REG_DT
 		  , UPD_NO
 		  , UPD_DT
-		  , FIRST_YN
-		  , DOWN_YN
+		  , FIRST_ORD_YN
+		  , DOWN_ABL_YN
 		  , CUST_JOIN_STDT
 		  , CUST_JOIN_EDDT
 		  , BUY_STDT
 		  , BUY_EDDT
-		  <if test='cpnType != null and cpnType == "G230_20"'>
-		  , PAY_TYPE
-		  </if>
-		  , CUST_JOIN_YN
+		  , NEW_CUST_YN
 		) VALUES (
 		    #{cpnNm}
 		  , #{siteCd}
 		  , #{afLinkCd}
-		  , #{usableCustGb}
-		  , #{usableCustGrade}
 		  , #{cpnType}
 		  , #{applyScope}
 		  , #{dcWay}
@@ -194,38 +185,33 @@
 		  , now()
 		  , #{updNo}
 		  , now()
-		  , #{firstYn}
-		  , #{downYn}
+		  , #{firstOrdYn}
+		  , #{downAblYn}
 		  <choose>
-			  <when test='custJoinYn != null and custJoinYn == "Y"'>
+			  <when test='newCustYn != null and newCustYn == "Y"'>
 		  , DATE_FORMAT(#{custJoinStdt} , '%Y-%m-%d %H:%i:%s')
 		  , DATE_FORMAT(#{custJoinEddt} , '%Y-%m-%d %H:%i:%s')
 			  </when>
-			  <when test='custJoinYn != null and custJoinYn == "N"'>
+			  <when test='newCustYn != null and newCustYn == "N"'>
 		  , null
 		  , null
 			  </when>
 		  </choose>
 		  <choose>
-			  <when test='firstYn != null and firstYn == "Y"'>
+			  <when test='firstOrdYn != null and firstOrdYn == "Y"'>
 		  , DATE_FORMAT(#{buyStdt} , '%Y-%m-%d %H:%i:%s')
 		  , DATE_FORMAT(#{buyEddt} , '%Y-%m-%d %H:%i:%s')
 			  </when>
-			  <when test='firstYn != null and firstYn == "N"'>
+			  <when test='firstOrdYn != null and firstOrdYn == "N"'>
 		  , DATE_FORMAT(#{buyStdt} , '%Y-%m-%d %H:%i:%s')
 		  , DATE_FORMAT(#{buyEddt} , '%Y-%m-%d %H:%i:%s')
 			  </when>
 		  </choose>
-		  <if test='cpnType != null and cpnType == "G230_20"'>
-		  , #{payType}
-		  </if>
-		  , #{custJoinYn}
+		  , #{newCustYn}
 		) ON DUPLICATE KEY UPDATE
 		    CPN_NM = #{cpnNm}
 		  , SITE_CD = #{siteCd}
 		  , AF_LINK_CD = #{afLinkCd}
-		  , USABLE_CUST_GB = #{usableCustGb}
-		  , USABLE_CUST_GRADE = #{usableCustGrade}
 		  , CPN_TYPE = #{cpnType}
 		  , APPLY_SCOPE = #{applyScope}
 		  , DC_WAY = #{dcWay}
@@ -258,32 +244,29 @@
 		  , END_ALIM_YN = #{endAlimYn}
 		  , UPD_NO = #{updNo}
 		  , UPD_DT = now()
-		  , FIRST_YN = #{firstYn}
-		  , DOWN_YN = #{downYn}
+		  , FIRST_ORD_YN = #{firstOrdYn}
+		  , DOWN_ABL_YN = #{downAblYn}
 		<choose>
-			<when test='custJoinYn != null and custJoinYn == "Y"'>
+			<when test='newCustYn != null and newCustYn == "Y"'>
 		  , CUST_JOIN_STDT = DATE_FORMAT(#{custJoinStdt} , '%Y-%m-%d %H:%i:%s')
 		  , CUST_JOIN_EDDT = DATE_FORMAT(#{custJoinEddt} , '%Y-%m-%d %H:%i:%s')
 			</when>
-			<when test='custJoinYn != null and custJoinYn == "N"'>
+			<when test='newCustYn != null and newCustYn == "N"'>
 		  , CUST_JOIN_STDT = null
 		  , CUST_JOIN_EDDT = null
 			</when>
 		</choose>
 		<choose>
-			<when test='firstYn != null and firstYn == "Y"'>
+			<when test='firstOrdYn != null and firstOrdYn == "Y"'>
 		  , BUY_STDT = DATE_FORMAT(#{buyStdt} , '%Y-%m-%d %H:%i:%s')
 		  , BUY_EDDT = DATE_FORMAT(#{buyEddt} , '%Y-%m-%d %H:%i:%s')
 			</when>
-			<when test='firstYn != null and firstYn == "N"'>
+			<when test='firstOrdYn != null and firstOrdYn == "N"'>
 		  , BUY_STDT = null
 		  , BUY_EDDT = null
 			</when>
 		</choose>
-		<if test='cpnType != null and cpnType == "G230_20"'>
-		  , PAY_TYPE = #{payType}
-		</if>
-		  , CUST_JOIN_YN = #{custJoinYn}
+		  , NEW_CUST_YN = #{newCustYn}
 	</insert>
 
 	<!-- 쿠폰조회 목록 -->
@@ -414,8 +397,6 @@
 			 , 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
@@ -438,15 +419,14 @@
 			 , B.REISSUANCE
 			 , B.CPN_STAT
 			 , B.END_ALIM_YN
-			 , B.FIRST_YN
-			 , B.DOWN_YN
+			 , B.FIRST_ORD_YN
+			 , B.DOWN_ABL_YN
 		     , B.DC_CD_GB
 			 , B.CUST_JOIN_STDT
 			 , B.CUST_JOIN_EDDT
 			 , B.BUY_STDT
 			 , B.BUY_EDDT
-			 , B.PAY_TYPE
-			 , B.CUST_JOIN_YN
+			 , B.NEW_CUST_YN
 			 , (SELECT AF_CHANNEL
 			      FROM TB_AF_LINK A
 			     WHERE A.AF_LINK_CD = B.AF_LINK_CD) AS AF_CHANNEL

+ 319 - 0
src/main/webapp/WEB-INF/views/marketing/CardInterestForm.html

@@ -0,0 +1,319 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : CardInterestForm.html
+ * @desc    : 카드무이자할부관리
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.01.29   eskim       최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<form id="cardInterestListForm" name="cardInterestListForm" action="#" th:action="@{'/marketing/card/interest/list'}">
+		<input type="hidden" id="prmtGb" name="prmtGb" value="B" /> <!-- 무이자 -->
+ 		<!-- 패널 영역1 -->
+		<div class="panelStyle" >
+			<div class="panelContent">
+				<table class="frmStyle">
+					<colgroup>
+						<col width="10%"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>구분<em class="required" title="필수"></em></th>
+						<td>
+							<label class="rdoBtn"><input type="radio" name="sizeGb"  value="1"  checked/>프로모션ID</label>
+							<label class="rdoBtn"><input type="radio" name="sizeGb"  value="2"/>프로모션명</label>
+						</td>
+					</tr>
+					<tr>
+						<th>기간<em class="required" title="필수"></em></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 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('cardInterestListForm',params.node.rowIndex, 'A');}
+		},
+		{headerName: "프로모션ID", field: "cardPrmtSq", width: 130, cellClass: 'text-center'},
+		{headerName: "프로모션명", field: "prmtNm", width: 140, cellClass: 'text-center'
+			,cellRenderer: function(params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{headerName: "노출여부", field: "dispYn", width: 180, cellClass: 'text-center'},
+		{headerName: "시작일", field: "prmtStd", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
+			}
+		},
+		{headerName: "종료일", field: "prmtEdd", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
+			}
+		},
+		{headerName: "수정자", field: "updNm" , width: 100, cellClass: 'text-center'},
+		{headerName: "수정일시", field: "updDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
+			}
+		},
+		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+		{headerName: "등록일시", field: "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) {
+		var goodsCd = event.data.goodsCd;
+		if (event.colDef.field == "prmtNm"){
+			
+		}
+	}
+
+	// 초기화 클릭시
+	$('#btnInit').on('click', function() {
+		fnInit();
+	});
+	
+	var fnInit = function(){
+		$('#cardInterestListForm')[0].reset();
+	}
+	
+	// 조회클릭시
+	$('#btnSearch').on('click', function() {
+		$("#cardInterestListForm input[name=pageNo]").val('1');
+		fnCardPromotionListSearch();
+	});
+
+	// 조회
+	var fnCardPromotionListSearch = function() {
+		
+		if(!fnConditionCheck()) return;
+		
+		gagaPaging.init('cardInterestListForm', fnSearchCallBack, 'cardListPagination', $('#cardInterestListForm').find('#pageSize').val());
+		gagaPaging.load($("#cardInterestListForm input[name=pageNo]").val());
+	}
+
+	//검색 조건 확인
+	var fnConditionCheck = function(){
+		var formId = '#cardInterestListForm';
+		var form = document.cardInterestListForm;
+
+		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 = $('#cardInterestListForm input[name=stDate]').val();
+		var toDate = $('#cardInterestListForm input[name=edDate]').val();
+		
+		if (!gagajf.isNull(fromDate) || !gagajf.isNull(toDate)) {
+			
+			if (gagajf.isNull(fromDate) || gagajf.isNull(toDate)) {
+				mcxDialog.alertC("등록일 조회시 시작일자와 종료일자를 입력하세요.", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#cardInterestListForm input[name=stDate]').focus();
+					}
+				});
+				return false;
+			}
+
+			if (fromDate > toDate) {
+				mcxDialog.alert("노출기간 시작일자는 종료일자 보다 클 수 없습니다.", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#cardInterestListForm input[name=stDate]').focus();
+					}
+				});
+				return false;
+			} 
+		}
+
+		return true;
+	}
+	
+	var fnSearchCallBack = function(result){
+
+		$('#cardInterestListForm').find('#gridRowTotalCount').html(result.pageing.pageable.totalCount.addComma());
+		$('#cardInterestListForm').find('#pageNo').val(result.pageing.pageable.pageNo.addComma());
+		$('#cardInterestListForm').find('#pgNo').html(result.pageing.pageable.pageNo.addComma());
+		$('#cardInterestListForm').find('#endPgNo').html(result.pageing.pageable.totalPage.addComma());
+		gridOptions.api.setRowData(result.cardPromotionList);
+		gagaPaging.createPagination(result.pageing.pageable);
+	}
+	
+	//페이징 
+	$('#cardInterestListForm select[name=pageSize]').on('change', function() {
+		$("#cardInterestListForm input[name=pageNo]").val('1');
+		fnCardPromotionListSearch($("#cardInterestListForm input[name=searchGb]").val());
+	});
+	
+	//카드 무이자 팝업
+	$('#btnCardPromotionSave').click(function(e) {
+		var actionUrl = "/marketing/card/interest/popup/form";
+		cfnOpenModalPopup(actionUrl, 'popupCardInterest'); 
+	});
+	
+	//카드 프로모션 삭제
+	$('#btnCardPromotionDelete').click(function(e) {
+		//상품선택여부 확인처리 추가
+		var selectedData = gridOptions.api.getSelectedRows();
+
+		if (selectedData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return false;
+		}
+		
+		var arrGoodsCd = [];
+		var arrGoodsTnmResSq = [];
+		var chkFlag = false;
+		//selectedData = gagaAgGrid.getAllRowData(gridOptions);
+		$.each(selectedData, function(idx, item) {
+			
+			if (gagajf.isNull(item.goodsTnmResSq) || item.goodsTnmResSq == "0"){
+				chkFlag = true;
+				mcxDialog.alert(item.goodsCd +"상품은 상품타이틀이 예약된 상품이 아닙니다.");
+				return false;
+			}
+			
+			var toDateStr = new Date().format("YYYYMMDDHHmmss");
+			if (toDateStr > item.applyEddt){
+				chkFlag = true;
+				mcxDialog.alertC("종료된 예약 상품은 삭제할 수 없습니다.", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#goodsRsvtTnmForm input[name=applyEdYMD]').focus();
+					}
+				});
+				return false;
+			}
+		
+			arrGoodsCd.push(item.goodsCd);
+			arrGoodsTnmResSq.push(item.goodsTnmResSq);
+		});
+
+		if (chkFlag){
+			return;
+		}
+		
+		mcxDialog.confirm('삭제하시겠습니까?',  {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var data = {arrGoodsCd : arrGoodsCd
+						,arrGoodsTnmResSq : arrGoodsTnmResSq
+			};
+			
+			var jsonData = JSON.stringify(data);
+			gagajf.ajaxJsonSubmit('/goods/title/reserve/delete', jsonData, fnCardPromotionDeleteCollBack);
+			}
+		});
+	});
+	
+	var fnCardPromotionDeleteCollBack = function(){
+		//fnCardPromotionListSearch($();
+	}
+	
+	$(document).ready(function() {
+
+		cfnCreateCalendar('#sellTerms', 'stDate', 'edDate', true, '기간');
+		var chkBeforSkipFlag = '&nbsp;&nbsp;<label class="chkBox"><input type="checkbox" name="beforSkipFlag" value="Y" >이전데이터 제외</label>';
+		$("#cardInterestListForm").find('#sellTerms').append(chkBeforSkipFlag);
+		
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+
+	});
+
+/*]]>*/
+</script>
+ 	
+</html>

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

@@ -142,7 +142,7 @@
 		var cpnTypeList = gagajf.convertToArray([[${cpnTypeList}]]);
 		var siteCdList = gagajf.convertToArray([[${siteCdList}]]);
 		var dcWayList = gagajf.convertToArray([[${dcWayList}]]);
-		var usableCustGbList = gagajf.convertToArray([[${usableCustGbList}]]);
+		//var usableCustGbList = gagajf.convertToArray([[${usableCustGbList}]]);
 		var pdGbList = { "P":"기간", "D":"일수" };
 
 		var columnDefs = [];
@@ -157,12 +157,12 @@
 			{headerName: "쿠폰명", field: "cpnNm", width: 140, cellClass: 'text-center' , cellRenderer: function (params) {
 				return "<a href=\"javascript:void(0);\" onclick=\"cfnCouponCreatePopup('" + params.data.cpnId + "');\">" + params.value + "</a>";
 			}},
-			{headerName: "사용가능고객구분", field: "usableCustGb", width: 140, cellClass: 'text-center' ,
+			/*{headerName: "사용가능고객구분", field: "usableCustGb", width: 140, cellClass: 'text-center' ,
 				cellEditor: 'agRichSelectCellEditor',
 				cellEditorParams: { values: gagaAgGrid.extractValues(usableCustGbList) },
 				valueFormatter: function (params) { return gagaAgGrid.lookupValue(usableCustGbList, params.value); },
 				valueParser: function (params) { return gagaAgGrid.lookupKey(usableCustGbList, params.newValue);}
-			},
+			},*/
 			{headerName: "쿠폰유형", field: "cpnType", width: 140, cellClass: 'text-center' ,
 				cellEditor: 'agRichSelectCellEditor',
 				cellEditorParams: { values: gagaAgGrid.extractValues(cpnTypeList) },

+ 78 - 35
src/main/webapp/WEB-INF/views/marketing/CouponPopupForm.html

@@ -46,9 +46,9 @@
 								<table class="frmStyle">
 									<colgroup>
 										<col style="width:10%">
-										<col style="width:40%;">
+										<col style="width:45%;">
 										<col style="width:10%">
-										<col style="width:40%;">
+										<col style="width:35%;">
 									</colgroup>
 									<tbody>
 										<tr th:if="${cpnDetail}">
@@ -94,9 +94,12 @@
 										<tr>
 											<th>사용가능고객구분<em class="required" title="필수"></em></th>
 											<td>
-												<select name="usableCustGb" id="usableCustGb" required="required" data-valid-name="사용가능고객구분">
+												<!--<select name="usableCustGb" id="usableCustGb" required="required" data-valid-name="사용가능고객구분">
 													<option th:if="${usableCustGbList}" th:each="oneData , status : ${usableCustGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-												</select>
+												</select>-->
+												<input type="hidden" name="usableCustGb"/>
+												<label class="chkBox"><input type="checkbox" name="chkUsableCustGb" id="chkUsableCustGb10" value="G100_10">일반회원</label>
+												<label class="chkBox"><input type="checkbox" name="chkUsableCustGb" id="chkUsableCustGb20" value="G100_20">임직원</label>
 											</td>
 											<th>사이트<em class="required" title="필수"></em></th>
 											<td>
@@ -108,10 +111,16 @@
 										<tr>
 											<th>사용고객등급구분<em class="required" title="필수"></em></th>
 											<td>
-												<select name="usableCustGrade" id="usableCustGrade" required="required" data-valid-name="사용고객등급구분">
+												<!--<select name="usableCustGrade" id="usableCustGrade" required="required" data-valid-name="사용고객등급구분">
 													<option value="ALL">[전체]</option>
 													<option th:if="${usableCustGradeList}" th:each="oneData , status : ${usableCustGradeList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-												</select>
+												</select>-->
+												<input type="hidden" name="usableCustGrade"/>
+												<label class="chkBox"><input type="checkbox" name="chkUsableCustGrade" id="chkUsableCustGrade10" value="G110_10">VIP</label>
+												<label class="chkBox"><input type="checkbox" name="chkUsableCustGrade" id="chkUsableCustGrade20" value="G110_20">GOLD</label>
+												<label class="chkBox"><input type="checkbox" name="chkUsableCustGrade" id="chkUsableCustGrade30" value="G110_30">SILVER</label>
+												<label class="chkBox"><input type="checkbox" name="chkUsableCustGrade" id="chkUsableCustGrade40" value="G110_40">BRONZE</label>
+												<label class="chkBox"><input type="checkbox" name="chkUsableCustGrade" id="chkUsableCustGrade50" value="G110_50">WELCOME</label>
 											</td>
 											<th>만료알림여부<em class="required" title="필수"></em></th>
 											<td>
@@ -223,7 +232,7 @@
 										<tr class="firstBuyTr">
 											<th>첫구매여부<em class="required" title="필수"></em></th>
 											<td>
-												<select name="firstYn" id="firstYn" onchange="firstYnChange(this)" required="required" data-valid-name="첫구매여부">
+												<select name="firstOrdYn" id="firstOrdYn" onchange="firstOrdYnChange(this)" required="required" data-valid-name="첫구매여부">
 													<option value="Y">Y</option>
 													<option value="N" selected="selected">N</option>
 												</select>
@@ -255,7 +264,7 @@
 										<tr class="custJoinTr">
 											<th>신규회원여부<em class="required" title="필수"></em></th>
 											<td>
-												<select name="custJoinYn" id="custJoinYn" onchange="custJoinYnChange(this)" required="required" data-valid-name="신규회원여부">
+												<select name="newCustYn" id="newCustYn" onchange="newCustYnChange(this)" required="required" data-valid-name="신규회원여부">
 													<option value="Y">Y</option>
 													<option value="N" selected="selected">N</option>
 												</select>
@@ -303,7 +312,7 @@
 											</td>
 											<th>다운로드가능여부<em class="required" title="필수"></em></th>
 											<td>
-												<select name="downYn" id="downYn" required="required" data-valid-name="다운로드가능여부">
+												<select name="downAblYn" id="downAblYn" required="required" data-valid-name="다운로드가능여부">
 													<option value="Y">Y</option>
 													<option value="Y" selected="selected">N</option>
 												</select>
@@ -323,7 +332,7 @@
 												</select>
 											</td>
 										</tr>-->
-										<tr class="payTypeTr" style="display: none;">
+										<!--<tr class="payTypeTr" style="display: none;">
 											<th>결제수단<em class="required" title="필수"></em></th>
 											<td colspan="5">
 												<select name="payType" id="payType" data-valid-name="결제수단">
@@ -332,6 +341,12 @@
 												</select>
 											</td>
 										</tr>
+										<tr>
+											<th>멀티결제수단</th>
+											<td colspan="5">
+
+											</td>
+										</tr>-->
 										<tr>
 											<th>쿠폰상태<em class="required" title="필수"></em></th>
 											<td>
@@ -659,7 +674,35 @@
 	});
 
 	// 쿠폰 등록 버튼 클릭시
+
 	function fnCouponCreate(){
+		mcxDialog.confirm('저장하시겠습니까?' , {
+			cancelBtnText:"취소",
+			sureBtnText:"확인",
+			sureBtnClick: function () {
+				var chkUsableCustGb = document.getElementsByName("chkUsableCustGb");
+				var chkUsableCustGrade = document.getElementsByName("chkUsableCustGrade");
+				var usableCustGb = "";
+				var usableCustGrade = "";
+
+				for(let i=0; i<chkUsableCustGb.length; i++){
+					if(chkUsableCustGb[i].checked == true){
+						usableCustGb += chkUsableCustGb[i].value+"|";
+					}
+				}
+				for(let i=0; i<chkUsableCustGrade.length; i++){
+					if(chkUsableCustGrade[i].checked == true){
+						usableCustGrade += chkUsableCustGrade[i].value+"|";
+					}
+				}
+
+				$("#CouponForm input[name=usableCustGb]").val(usableCustGb);
+				$("#CouponForm input[name=usableCustGrade]").val(usableCustGrade);
+			}
+		});
+	}
+
+	function fnCouponCreate2(){
 		mcxDialog.confirm('저장하시겠습니까?' , {
 			cancelBtnText:"취소",
 			sureBtnText:"확인",
@@ -719,7 +762,7 @@
 
 	function checkValidation(){
 		//신규가입 지급한다면 validation 체크
-		if( $('#custJoinYn option:selected').val() == "Y" ){
+		if( $('#newCustYn option:selected').val() == "Y" ){
 			var fromDate = $('#CouponForm input[name=custJoinStdt]').val();
 			var toDate = $('#CouponForm input[name=custJoinEddt]').val();
 
@@ -745,7 +788,7 @@
 		}
 
 		// 첫구매 지급하면 validation 체크
-		if( $('#firstYn option:selected').val() == "Y" ){
+		if( $('#firstOrdYn option:selected').val() == "Y" ){
 			var fromDate = $('#CouponForm input[name=buyStdt]').val();
 			var toDate = $('#CouponForm input[name=buyEddt]').val();
 
@@ -880,12 +923,12 @@
 
 		// 주문서 쿠폰 선택시 결제수단 노출
 		if(radioValue == 'G230_20') {
-			$('#CouponForm .payTypeTr').show();
-			$('#CouponForm #payType').attr('required' , true);
+			//$('#CouponForm .payTypeTr').show();
+			//$('#CouponForm #payType').attr('required' , true);
 			$("#CouponForm .dcCdGb").show();		// 할인쿠폰유형 노출
 		} else {
-			$('#CouponForm .payTypeTr').hide();
-			$('#CouponForm #payType').attr('required' , false );
+			//$('#CouponForm .payTypeTr').hide();
+			//$('#CouponForm #payType').attr('required' , false );
 			$("#CouponForm .dcCdGb").hide();		// 할인쿠폰유형 숨김
 			$("#CouponForm input:radio[name='dcCdGb']:radio[value='G233_00']").prop('checked', true);		// 주문서 쿠폰이 아닐 경우 일반 쿠폰으로 설정
 		}
@@ -900,7 +943,7 @@
 			$("#CouponForm .dcCdCheck2").show();
 			$("#CouponForm .serialCpnArea").hide();
 			$("#CouponForm .randomCpnArea").hide();
-			$("#CouponForm #custJoinYn").parent().attr("colspan", "");
+			$("#CouponForm #newCustYn").parent().attr("colspan", "");
 			$("#CouponForm .normalCol").attr("colspan", "5");
 			$('#CouponForm input[name="serialCpnNm"]').attr('required' , false);
 			$('#CouponForm input[name="serialCpnQty"]').attr('required' , false);
@@ -923,7 +966,7 @@
 			}
 			$("#CouponForm .dcCdCheck1").hide();								// 총발행제한수량, 1회발행수량, 1인당발행제한수량 숨김
 			$("#CouponForm .dcCdCheck2").hide();								// 총발행제한수량, 1회발행수량, 1인당발행제한수량 숨김
-			$("#CouponForm #custJoinYn").parent().attr("colspan", "5");		// 총발행제한 수량을 없애면서 신규회원여부 colspan 수정
+			$("#CouponForm #newCustYn").parent().attr("colspan", "5");		// 총발행제한 수량을 없애면서 신규회원여부 colspan 수정
 		}
 	});
 
@@ -1240,12 +1283,12 @@
 	}
 
 	// 첫구매여부 변경시
-	function firstYnChange(pThis){
+	function firstOrdYnChange(pThis){
 		var selectVal = $(pThis).val();
 
 		if(typeof selectVal == "undefined") {
 			if(mode == "U") {
-				selectVal = cpnDetail.firstYn;
+				selectVal = cpnDetail.firstOrdYn;
 			} else {
 				selectVal = "N";
 			}
@@ -1263,12 +1306,12 @@
 	}
 
 	// 신규회원여부 변경시
-	function custJoinYnChange(pThis){
+	function newCustYnChange(pThis){
 		var selectVal = $(pThis).val();
 
 		if(typeof selectVal == "undefined") {
 			if(mode == "U") {
-				selectVal = cpnDetail.custJoinYn;
+				selectVal = cpnDetail.newCustYn;
 			} else {
 				selectVal = "N";
 			}
@@ -1442,16 +1485,16 @@
 			$("#CouponForm #usableCustGb").val(cpnDetail.usableCustGb).prop("selected", true);
 			$("#CouponForm #usableCustGrade").val(cpnDetail.usableCustGrade).prop("selected", true);
 			$("#CouponForm #endAlimYn").val(cpnDetail.endAlimYn).prop("selected", true);
-			$("#CouponForm #firstYn").val(cpnDetail.firstYn).prop("selected", true);
+			$("#CouponForm #firstOrdYn").val(cpnDetail.firstOrdYn).prop("selected", true);
 			$("#CouponForm #reissuance").val(cpnDetail.reissuance).prop("selected", true);
 			$("#CouponForm #dnGb").val(cpnDetail.dnGb).prop("selected", true);
 			$("#CouponForm #cpnStat").val(cpnDetail.cpnStat).prop("selected", true);
-			$("#CouponForm #custJoinYn").val(cpnDetail.custJoinYn).prop("selected", true);
+			$("#CouponForm #newCustYn").val(cpnDetail.newCustYn).prop("selected", true);
 			$("#CouponForm #pdGb").val(cpnDetail.pdGb).prop("selected", true);
 			$("#CouponForm #siteCd").val(cpnDetail.siteCd).prop("selected", true);
 			$("#CouponForm #afChannel").val(cpnDetail.afChannel).prop("selected", true);
 			$("#CouponForm #cpnNm").val(cpnDetail.cpnNm);
-			$("#CouponForm #downYn").val(cpnDetail.downYn);
+			$("#CouponForm #downAblYn").val(cpnDetail.downAblYn);
 			$("#CouponForm #buyLimitAmt").val(cpnDetail.buyLimitAmt);
 			$("#CouponForm #cpnId").val(cpnDetail.cpnId);
 
@@ -1525,18 +1568,18 @@
 				$("#CouponForm #usableCustGrade").attr('disabled', true);
 				$("#CouponForm #endAlimYn").attr('readonly', true);
 				$("#CouponForm #endAlimYn").attr('disabled', true);
-				$("#CouponForm #firstYn").attr('readonly', true);
-				$("#CouponForm #firstYn").attr('disabled', true);
+				$("#CouponForm #firstOrdYn").attr('readonly', true);
+				$("#CouponForm #firstOrdYn").attr('disabled', true);
 				$("#CouponForm #reissuance").attr('readonly', true);
 				$("#CouponForm #reissuance").attr('disabled', true);
 				$("#CouponForm #dnGb").attr('readonly', true);
 				$("#CouponForm #dnGb").attr('disabled', true);
-				$("#CouponForm #custJoinYn").attr('readonly', true);
-				$("#CouponForm #custJoinYn").attr('disabled', true);
+				$("#CouponForm #newCustYn").attr('readonly', true);
+				$("#CouponForm #newCustYn").attr('disabled', true);
 				$("#CouponForm #pdGb").attr('readonly', true);
 				$("#CouponForm #pdGb").attr('disabled', true);
-				$("#CouponForm #downYn").attr('readonly', true);
-				$("#CouponForm #downYn").attr('disabled', true);
+				$("#CouponForm #downAblYn").attr('readonly', true);
+				$("#CouponForm #downAblYn").attr('disabled', true);
 				$("#CouponForm #siteCd").attr('readonly', true);
 				$("#CouponForm #siteCd").attr('disabled', true);
 				$("#CouponForm #cpnNm").attr('readonly', true);
@@ -1594,7 +1637,7 @@
 
 			}
 			// 첫구매여부 적용하는 경우 날짜 세팅
-			if (cpnDetail.firstYn == "Y") {
+			if (cpnDetail.firstOrdYn == "Y") {
 				splitDate("start", cpnDetail.buyStdt, "buy");
 				splitDate("end", cpnDetail.buyEddt, "buy");
 				if(issueCnt > 0) {
@@ -1607,7 +1650,7 @@
 				}
 			}
 			// 신규회원여부 적용하는 경우 날짜 세팅
-			if (cpnDetail.custJoinYn == "Y") {
+			if (cpnDetail.newCustYn == "Y") {
 				splitDate("start", cpnDetail.custJoinStdt, "custJoin");
 				splitDate("end", cpnDetail.custJoinEddt, "custJoin");
 				if(issueCnt > 0) {
@@ -1622,8 +1665,8 @@
 		}
 		// 기본세팅
 		pdGbChange();
-		firstYnChange();
-		custJoinYnChange();
+		firstOrdYnChange();
+		newCustYnChange();
 		fnChangeAfLinkCdList();
 
 		// 제휴채널2뎁스 기본세팅

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

@@ -22,7 +22,7 @@
 		<!-- 메뉴 설명 -->
 		<div class="infoBox menu-desc"></div>
 
-		<form id="searchForm" name="searchForm" action="#" th:action="@{'/marketing/freeGoodsPromotion/list'}">
+		<form id="searchForm" name="searchForm" action="#" th:action="@{'/marketing/freegoods/promotion/list'}">
 			<input type="hidden" id="searchGb" name="searchGb" />
 			<input type="hidden" id="imageViewYn" name="imageViewYn" />
 			<input type="hidden" id="goodsPriceYn" name="goodsPriceYn" value="Y"/> <!-- 즉시할인판매가 조회 -->

+ 5 - 5
src/main/webapp/WEB-INF/views/marketing/FreeGoodsPromotionRegiForm.html

@@ -595,7 +595,7 @@
 		params.gbn = $('#freeGoodsPromotionForm input[name=gbn]').val();
 		params.freegiftSq = $('#freeGoodsPromotionForm input[name=freegiftSq]').val();
 
-		cfnAjaxSubmit("/marketing/freeGoodsPromotion/detail", "json", fnFreeGoodsPromotionSearchCallback, params);
+		cfnAjaxSubmit("/marketing/freegoods/promotion/detail", "json", fnFreeGoodsPromotionSearchCallback, params);
 	}
 
 	$(document).ready(function() {
@@ -887,7 +887,7 @@
 		};
 
 		var jsonData = JSON.stringify(data);
-		gagajf.ajaxJsonSubmit('/marketing/freeGoodsPromotion/save', jsonData, fnFreeGoodsPromotionSaveFin);
+		gagajf.ajaxJsonSubmit('/marketing/freegoods/promotion/save', jsonData, fnFreeGoodsPromotionSaveFin);
 	});
 
 	// 할인방식 변경
@@ -915,7 +915,7 @@
 						, freegiftSq : $("#freeGoodsPromotionForm input[name=freegiftSq]").val()
 					}
 					var jsonData = JSON.stringify(data);
-					gagajf.ajaxJsonSubmit('/marketing/freeGoodsPromotion/changeStat', jsonData, fnFreeGoodsPromotionSaveFin);
+					gagajf.ajaxJsonSubmit('/marketing/freegoods/promotion/change/stat', jsonData, fnFreeGoodsPromotionSaveFin);
 				}
 			}
 		});
@@ -932,7 +932,7 @@
 						, freegiftSq: $("#freeGoodsPromotionForm input[name=freegiftSq]").val()
 					}
 					var jsonData = JSON.stringify(data);
-					gagajf.ajaxJsonSubmit('/marketing/freeGoodsPromotion/changeStat', jsonData, function() {
+					gagajf.ajaxJsonSubmit('/marketing/freegoods/promotion/change/stat', jsonData, function() {
 						uifnPopupClose('popupFreeGoodsPromotionRegi');
 					});
 				}
@@ -951,7 +951,7 @@
 						, freegiftSq: $("#freeGoodsPromotionForm input[name=freegiftSq]").val()
 					}
 					var jsonData = JSON.stringify(data);
-					gagajf.ajaxJsonSubmit('/marketing/freeGoodsPromotion/changeStat', jsonData, fnFreeGoodsPromotionSaveFin);
+					gagajf.ajaxJsonSubmit('/marketing/freegoods/promotion/change/stat', jsonData, fnFreeGoodsPromotionSaveFin);
 				}
 			}
 		});

+ 39 - 22
src/main/webapp/WEB-INF/views/marketing/MorebetterPopupForm.html

@@ -61,12 +61,12 @@
 						<td>
 							<input type="hidden" name="tmtbStdt" id="tmtbStdt" required="required" data-valid-name="다다익선시작일시">
 							<input type="text" class="schDate w100" name="eventStdt" id="eventStdt" maxlength="10" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}"/>
-							<select name="eventStHH" data-valid-name="다다익선시작(시)" style="width: 65px;"> <!--th:disabled="${mode == 'U'}"-->
+							<select name="eventStHH" id="eventStHH" data-valid-name="다다익선시작(시)" style="width: 65px;"> <!--th:disabled="${mode == 'U'}"-->
 								<th:block th:each="num, index : ${#numbers.sequence(0,23)}">
 									<option  th:value="${#numbers.formatInteger(num,2)}" th:text="|${#numbers.formatInteger(num,2)}시|" th:selected="${tmtbMstInfo.eventStHH == #numbers.formatInteger(num,2)}">시간</option>
 								</th:block>
 							</select>
-							<select name="eventStMM" data-valid-name="다다익선시작(분)" style="width: 65px;">
+							<select name="eventStMM" id="eventStMM" data-valid-name="다다익선시작(분)" style="width: 65px;">
 								<th:block th:each="num, index : ${#numbers.sequence(0,59)}">
 									<option  th:value="${#numbers.formatInteger(num,2)}"  th:text="|${#numbers.formatInteger(num,2)}분|" th:selected="${tmtbMstInfo.eventStMM == #numbers.formatInteger(num,2)}">분</option>
 								</th:block>
@@ -76,12 +76,13 @@
 						<td>
 							<input type="hidden" name="tmtbEddt" id="tmtbEddt" required="required" data-valid-name="다다익선종료일시">
 							<input type="text" class="schDate w100" name="eventEddt" id="eventEddt" maxlength="10" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}"/>
-							<select name="eventEdHH" data-valid-name="다다익선종료(시)" style="width: 65px;">
+							<select name="eventEdHH" id="eventEdHH" data-valid-name="다다익선종료(시)" style="width: 65px;">
 								<th:block th:each="num, index : ${#numbers.sequence(0,23)}">
 									<option  th:value="${#numbers.formatInteger(num,2)}" th:text="|${#numbers.formatInteger(num,2)}시|" th:selected="${tmtbMstInfo.eventEdHH == #numbers.formatInteger(num,2)}">시간</option>
 								</th:block>
+								<option th:text="24시" th:value="24"></option>
 							</select>
-							<select name="eventEdMM" data-valid-name="다다익선종료(분)" style="width: 65px;">
+							<select name="eventEdMM" id="eventEdMM" data-valid-name="다다익선종료(분)" style="width: 65px;">
 								<th:block th:each="num, index : ${#numbers.sequence(0,59)}">
 									<option  th:value="${#numbers.formatInteger(num,2)}"  th:text="|${#numbers.formatInteger(num,2)}분|" th:selected="${tmtbMstInfo.eventEdMM == #numbers.formatInteger(num,2)}">분</option>
 								</th:block>
@@ -526,6 +527,15 @@
 			$("input:radio[name='dcWay']:radio[value="+tmtbMstInfo.dcWay+"]").prop('checked', true); // 선택하기
 			$("input:radio[name='multiYn']:radio[value="+tmtbMstInfo.multiYn+"]").prop('checked', true); // 선택하기
 
+			let edDtArr = tmtbMstInfo.tmtbEddt.split(" ");
+			if(edDtArr[1] == "23:59:59") {
+				edHour = "24";
+				edMinute = "00";
+				$('#moreBetterForm #eventEdHH option:last').show().prop("selected", true);
+				$("#moreBetterForm #eventEdMM option").hide();
+				$('#moreBetterForm #eventEdMM option:first').show().prop("selected", true);
+			}
+
 			if(tmtbMstInfo.tmtbStat == "G232_10"){
 				$("#btnMorebetterSave").show();		// 저장버튼
 				$("#btnChangeStatIng").show();		// 진행버튼
@@ -540,11 +550,27 @@
 		if(mode=="N"){
 			$("input:radio[name='disTmtbStat']:radio[value='G232_10']").prop('checked', true); // 선택하기
 			$("#btnMorebetterSave").show();	// 저장버튼
+
+			if(tmtbMstInfo.eventEdHH == "24"){
+				$("#moreBetterForm #eventEdHH option:last").show().prop("selected", true);
+				$("#moreBetterForm #eventEdMM option").hide();
+				$('#moreBetterForm #eventEdMM option:first').show().prop("selected", true);
+			}
 		}
 		//cfnCreateCalendar('#tmtbTerms', 'tmtbStdt', 'tmtbEddt', true, '행사기간', 'X');
 		cfnCreateCalendar('#tmtbTerms', 'eventStdt', 'eventEddt', true, '행사기간', 'X');
 	});
 
+	// 종료시간 클릭 시
+	$("#moreBetterForm #eventEdHH").bind('click change', function () {
+		if(this.value == 24) {
+			$("#moreBetterForm #eventEdMM option").hide();
+			$('#moreBetterForm #eventEdMM option:first').show().prop("selected", true);
+		} else {
+			$("#moreBetterForm #eventEdMM option").show();
+		}
+	});
+
 	var fnGoodsGbCheck = function (){
 		let applyGoodsData = gagaAgGrid.getAllRowData(gridOptionsFGApplyGoodsList);
 		var checkCnt = 0;
@@ -585,14 +611,18 @@
 			$('#moreBetterForm input[name=tmtbStdt]').focus();
 			return false;
 		}
+		var eventStDt = "";
+		var eventEdDt = "";
 
-		var eventStDt = $('#moreBetterForm input[name=eventStdt]').val()+$('#moreBetterForm select[name=eventStHH]').val()+$('#moreBetterForm select[name=eventStMM]').val()+'00';
-		var eventEdDt = $('#moreBetterForm input[name=eventEddt]').val()+$('#moreBetterForm select[name=eventEdHH]').val()+$('#moreBetterForm select[name=eventEdMM]').val()+'59';
+		eventStDt = $('#moreBetterForm input[name=eventStdt]').val()+$('#moreBetterForm select[name=eventStHH]').val()+$('#moreBetterForm select[name=eventStMM]').val()+'00';
+		if($('#moreBetterForm select[name=eventEdHH]').val() == "24"){
+			eventEdDt = $('#moreBetterForm input[name=eventEddt]').val()+'235959';
+		}else{
+			eventEdDt = $('#moreBetterForm input[name=eventEddt]').val()+$('#moreBetterForm select[name=eventEdHH]').val()+$('#moreBetterForm select[name=eventEdMM]').val()+'00';
+		}
 
 		eventStDt = eventStDt.replace(/[^0-9]/g, '');
 		eventEdDt = eventEdDt.replace(/[^0-9]/g, '');
-		console.log('2.eventStDt>>'+eventStDt);
-		console.log('3.eventEdDt>>'+eventEdDt);
 
 		let fromDate = $('#moreBetterForm input[name=tmtbStdt]').val(eventStDt);
 		let toDate = $('#moreBetterForm input[name=tmtbEddt]').val(eventEdDt);
@@ -611,19 +641,6 @@
 		let allApplyBurdenData = gagaAgGrid.getAllRowData(gridOptionsApplyBurdenList);
 		let allSectionGbData = gagaAgGrid.getAllRowData(gridOptionsSectionGbList);
 
-		if(allSupplyCompData.length > 0){
-			if(allBrandData.length < 1){
-				mcxDialog.alert('브랜드를 추가해주세요.');
-				return;
-			}
-		}
-		if(allBrandData.length > 0){
-			if(allSupplyCompData.length < 1){
-				mcxDialog.alert('공급업체를 추가해주세요.');
-				return;
-			}
-		}
-
 		if(allSectionGbData.length < 1){
 			mcxDialog.alert("할인구간을 설정해주세요.");
 			return false;
@@ -681,7 +698,7 @@
 
 		var jsonData = JSON.stringify(data);
 
-		gagajf.ajaxJsonSubmit($('#moreBetterForm').prop('action'), jsonData, fnMorebetterSaveCollback);
+		//gagajf.ajaxJsonSubmit($('#moreBetterForm').prop('action'), jsonData, fnMorebetterSaveCollback);
 	});
 
 	var fnMorebetterSaveCollback = function(result){

+ 15 - 16
src/main/webapp/WEB-INF/views/order/ExchangeRequestForm.html

@@ -90,7 +90,7 @@
 							<th>회수지주소 <i class="star"></i></th>
 							<td colspan="3">
 								<input type="text" name ="chgerZipcode" class="w100" readonly="readonly"/>
-								<button type="button" class="btn btn-info" onclick="fnOpenDaumAddr('delvLoc');">우편번호찾기</button>
+								<button type="button" class="btn btn-info" onclick="fnOpenDaumAddr('withdraw');">우편번호찾기</button>
 								<input type="text" name ="chgerBaseAddr" class="w300"/>
 								<input type="text" name ="chgerDtlAddr" class="w300"/>
 							</td>
@@ -141,7 +141,7 @@
 						<th>교환지주소 <i class="star"></i></th>
 						<td colspan="3">
 							<input type="text" name ="recipZipcode" class="w100" readonly="readonly"/>
-							<button type="button" class="btn btn-info" onclick="fnOpenDaumAddr('delvLoc');">우편번호찾기</button>
+							<button type="button" class="btn btn-info" onclick="fnOpenDaumAddr('exchange');">우편번호찾기</button>
 							<input type="text" name ="recipBaseAddr" class="w300"/>
 							<input type="text" name ="recipDtlAddr" class="w300"/>
 						</td>
@@ -497,8 +497,8 @@ gridOptionsExchangeReqList.rowSelection = 'multiple';
 
 // 3. 배송정보(환불정보)
 var columnDelvCdList = [
-	{headerName: "업체"			, field: "supplyCompNm"		, width: 100	, cellClass: 'text-center', hide: temp2},
-	{headerName: "배송비코드"		, field: "delvFeeCd"		, width: 100	, cellClass: 'text-center', hide: temp2},
+	{headerName: "업체"			, field: "supplyCompNm"		, width: 100	, cellClass: 'text-center'},
+	{headerName: "배송비코드"		, field: "delvFeeCd"		, width: 100	, cellClass: 'text-center'},
 	{
 		headerName		: "추가배송비"
 		, field			: "addDelvFee"
@@ -507,13 +507,12 @@ var columnDelvCdList = [
 		, cellRenderer	: function (params) {
 			return params.value.addComma();
 		}
-		, hide			: temp2
 	},
-	{headerName: "반품지명"		, field: "rtnLocNm"			, width: 100	, cellClass: 'text-center', hide: temp2},
-	{headerName: "반품지전화번호"	, field: "rtnLocTelno"		, width: 100	, cellClass: 'text-center', hide: temp2},
-	{headerName: "반품지우편번호"	, field: "rtnLocZipcode"	, width: 100	, cellClass: 'text-center', hide: temp2},
-	{headerName: "반품지기본주소"	, field: "rtnLocBaseAddr"	, width: 300	, cellClass: 'text-center', hide: temp2},
-	{headerName: "반품지상세주소"	, field: "rtnLocDtlAddr"	, width: 300	, cellClass: 'text-center', hide: temp2},
+	{headerName: "반품지명"		, field: "rtnLocNm"			, width: 100	, cellClass: 'text-center'},
+	{headerName: "반품지전화번호"	, field: "rtnLocTelno"		, width: 100	, cellClass: 'text-center'},
+	{headerName: "반품지우편번호"	, field: "rtnLocZipcode"	, width: 100	, cellClass: 'text-center'},
+	{headerName: "반품지기본주소"	, field: "rtnLocBaseAddr"	, width: 300	, cellClass: 'text-center'},
+	{headerName: "반품지상세주소"	, field: "rtnLocDtlAddr"	, width: 300	, cellClass: 'text-center'},
 ];
 var gridOptionsDelvCdList = gagaAgGrid.getGridOptions(columnDelvCdList);
 </script>
@@ -620,8 +619,8 @@ var fnExchange = function () {
 			mcxDialog.alert("휴대전화를 입력하세요."); return;
 		}
 	
-		var chgerPhnno 		= chgerPhnno1 + chgerPhnno2 + chgerPhnno3;
-		var chgerTelno 		= chgerTelno1 + chgerTelno2 + chgerTelno3;
+		var chgerPhnno 		= chgerPhnno1 + '-' + chgerPhnno2 + '-' + chgerPhnno3;
+		var chgerTelno 		= chgerTelno1 + '-' + chgerTelno2 + '-' + chgerTelno3;
 		var chgerEmail 		= orderInfoList[0].ordEmail;
 	}
 
@@ -659,8 +658,8 @@ var fnExchange = function () {
 		mcxDialog.alert("휴대전화를 입력하세요."); return;
 	}
 	
-	var recipPhnno 		= recipPhnno1 + recipPhnno2 + recipPhnno3;
-	var recipTelno 		= recipTelno1 + recipTelno2 + recipTelno3;
+	var recipPhnno 		= recipPhnno1 + '-' + recipPhnno2 + '-' + recipPhnno3;
+	var recipTelno 		= recipTelno1 + '-' + recipTelno2 + '-' + recipTelno3;
 	var recipEmail 		= orderInfoList[0].ordEmail;
 	
 	var jsonObj = {
@@ -713,6 +712,7 @@ var fnExchange = function () {
 var fnOpenDaumAddr = function(loc) {
 	let daumZip = new daum.Postcode({
 		oncomplete: function(data) {
+			console.log(data);
 			// 우편번호와 주소 정보를 해당 필드에 넣는다.
 			if (loc == 'withdraw') {
 				$('#exchangeRequestFrm input[name=chgerZipcode]').val(data.zonecode);
@@ -873,8 +873,7 @@ var fnAddDelvFee = function (exchangeRequestTargetList) {
 $(document).ready(function() {
 	// 1. 그리드생성
 	gagaAgGrid.createGrid('gridOrderCancelRequestList'		, gridOptionsExchangeReqList);			// 주문정보
-	//gagaAgGrid.createGrid('gridOrderCancelRequestToBeList'	, gridOptionsExchangeReqToBeList);		// 취소정보
-	gagaAgGrid.createGrid('gridDelvCdList'					, gridOptionsDelvCdList);				// 배송비정보
+	gagaAgGrid.createGrid('gridDelvCdList'					, gridOptionsDelvCdList);				// 배송정보
 	gridOptionsExchangeReqList.api.setRowData(cancelRequestTargetList);
 	
 	// 2.1 TOTAL ROWS 없애기

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

@@ -166,6 +166,8 @@ var orderChangeInfo 		= [[${orderChangeInfo}]];				// 취소/반품/교환요청
 var orderRefundInfo 		= [[${orderRefundInfo}]];				// 환불정보
 var orderCounselInfo 		= [[${orderCounselInfo}]];				// 상담내역
 var orderAdminMemoInfo 		= [[${orderAdminMemoInfo}]];			// 관리자메모
+
+var canChgDelvStat			= ['G013_10', 'G013_11', 'G013_17', 'G013_20', 'G013_30', 'G013_40'];
 </script>
 
 <!-- AgGrid 컬럼 세팅 -->
@@ -501,7 +503,6 @@ var gridOptionsOrderFreeGiftInfo = gagaAgGrid.getGridOptions(columnDefsOrderFree
 var columnDefsDeliveryInfo = [
 	{headerName: "배송지번호"		, field: "delvAddrSq"		, width: 80, cellClass: 'text-center'},
 	{headerName: "주문구분"		, field: "exchGbNm"			, width: 80, cellClass: 'text-center'},
-	{headerName: "수정여부"		, field: "delvAddrEditYn"	, width: 80, cellClass: 'text-center', hide: true},
 	{headerName: "받는분"			, field: "recipNm"			, width: 80, cellClass: 'text-left', editable: true},
 	{headerName: "핸드폰번호"		, field: "recipPhnno"		, width: 120, cellClass: 'text-left', editable: true},
 	{headerName: "전화번호"		, field: "recipTelno"		, width: 120, cellClass: 'text-left', editable: true},
@@ -512,10 +513,9 @@ var columnDefsDeliveryInfo = [
 		, cellClass		: 'text-center'
 		, cellRenderer	: function (params) {
 			var rtnStr = ""
-			
-			if (params.data.delvAddrEditYn < 1) {
+			if (canChgDelvStat.includes(params.data.ordDtlStat)) {
 				// 배송지 수정 (주문배송, 교환배송)
-				rtnStr += params.value;			
+				rtnStr += params.value;
 				rtnStr += "<button type=\"button\" style=\"margin-left:10px\" class=\"btn btn-info\" onclick=\"fnOpenDaumAddr('" + params.node.rowIndex + "', 'ADDR');\">POST</button>";
 				rtnStr += "<button type=\"button\" class=\"btn btn-info\" onclick=\"fnUpdateOrderAddr('" + params.node.rowIndex + "');\">저장</button>";
 			} else {
@@ -656,7 +656,7 @@ var columnDefsOrderChangeInfo = [
 			var rtnStr = ""
 			
 			// 회수지수정가능(교환요청, 반품요청)
-			if (params.data.chgStat == 'G685_30' || params.data.chgStat == 'G685_40' ) {
+			if (!params.data.wdGb != 'D' && (params.data.chgStat == 'G685_30' || params.data.chgStat == 'G685_40')) {
 				
 				rtnStr += params.value;			
 				rtnStr += "<button type=\"button\" style=\"margin-left:10px\" class=\"btn btn-info\" onclick=\"fnOpenDaumAddr('" + params.node.rowIndex + "', 'CLAIM');\">POST</button>";

+ 1 - 1
src/main/webapp/ux/js/admin.popup.js

@@ -704,7 +704,7 @@ var cfnOpenBrandListPopup = function(callbackfn, multiGb, searchTxt) {
  * @author : xodud1202
  */
 var cfnOpenFreeGoodsPromotionSetPopup = function(gbn, freegiftSq) {
-	var actionUrl = "/marketing/freeGoodsRegiPopup/form?gbn=" + gbn;
+	var actionUrl = "/marketing/freegoods/promotion/popup/form?gbn=" + gbn;
 	if (typeof(freegiftSq) != 'undefined') actionUrl += "&freegiftSq=" + freegiftSq;
 
 	uifnPopupClose('popupFreeGoodsPromotionRegi');