فهرست منبع

Merge branch 'develop' into card007

card007 4 سال پیش
والد
کامیت
50e2ce113f
50فایلهای تغییر یافته به همراه2397 افزوده شده و 273 حذف شده
  1. 7 0
      src/main/java/com/style24/admin/biz/dao/TsaBusinessDao.java
  2. 26 0
      src/main/java/com/style24/admin/biz/dao/TsaSettleDao.java
  3. 54 0
      src/main/java/com/style24/admin/biz/dao/TsaSocialDao.java
  4. 29 0
      src/main/java/com/style24/admin/biz/dao/TsaWmsWithdrawDao.java
  5. 1 0
      src/main/java/com/style24/admin/biz/service/TsaBusinessService.java
  6. 3 1
      src/main/java/com/style24/admin/biz/service/TsaDisplayService.java
  7. 32 0
      src/main/java/com/style24/admin/biz/service/TsaSettleService.java
  8. 66 4
      src/main/java/com/style24/admin/biz/service/TsaShoplinkerService.java
  9. 44 5
      src/main/java/com/style24/admin/biz/service/TsaSocialService.java
  10. 3 0
      src/main/java/com/style24/admin/biz/service/TsaWithdrawService.java
  11. 17 0
      src/main/java/com/style24/admin/biz/service/TsaWmsWithdrawService.java
  12. 34 0
      src/main/java/com/style24/admin/biz/web/TsaMarketingController.java
  13. 58 0
      src/main/java/com/style24/admin/biz/web/TsaOcmController.java
  14. 60 0
      src/main/java/com/style24/admin/biz/web/TsaOrderChangeController.java
  15. 37 0
      src/main/java/com/style24/admin/biz/web/TsaOrderController.java
  16. 44 0
      src/main/java/com/style24/admin/biz/web/TsaSettleController.java
  17. 63 95
      src/main/java/com/style24/admin/biz/web/TsaShoplinkerController.java
  18. 2 1
      src/main/java/com/style24/persistence/domain/GoodsSettle.java
  19. 61 0
      src/main/java/com/style24/persistence/domain/SettleConfirm.java
  20. 3 0
      src/main/java/com/style24/persistence/domain/Social.java
  21. 1 0
      src/main/java/com/style24/persistence/domain/WithdrawExc.java
  22. 48 7
      src/main/java/com/style24/persistence/mybatis/shop/TsaBusiness.xml
  23. 15 9
      src/main/java/com/style24/persistence/mybatis/shop/TsaDsiplay.xml
  24. 10 0
      src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml
  25. 1 1
      src/main/java/com/style24/persistence/mybatis/shop/TsaPg.xml
  26. 10 6
      src/main/java/com/style24/persistence/mybatis/shop/TsaPlan.xml
  27. 295 2
      src/main/java/com/style24/persistence/mybatis/shop/TsaSettle.xml
  28. 10 7
      src/main/java/com/style24/persistence/mybatis/shop/TsaShoplinker.xml
  29. 372 3
      src/main/java/com/style24/persistence/mybatis/shop/TsaSocial.xml
  30. 2 2
      src/main/java/com/style24/persistence/mybatis/shop/TsaWithdraw.xml
  31. 32 0
      src/main/java/com/style24/persistence/mybatis/wms/TsaWmsWithdraw.xml
  32. 1 1
      src/main/webapp/WEB-INF/views/customer/OneToOneQnaDetailForm.html
  33. 9 0
      src/main/webapp/WEB-INF/views/display/MainContentsPopupForm.html
  34. 8 0
      src/main/webapp/WEB-INF/views/display/MainMultiContentsPopupForm.html
  35. 89 17
      src/main/webapp/WEB-INF/views/goods/GoodsListForm.html
  36. 3 3
      src/main/webapp/WEB-INF/views/goods/GoodsPopupListForm.html
  37. 3 0
      src/main/webapp/WEB-INF/views/goods/GoodsSalfRegisterForm.html
  38. 4 4
      src/main/webapp/WEB-INF/views/marketing/PlanDetailPopupForm.html
  39. 18 0
      src/main/webapp/WEB-INF/views/marketing/PlanTemplatePopupForm.html
  40. 127 19
      src/main/webapp/WEB-INF/views/marketing/SocialShoppingListForm.html
  41. 5 1
      src/main/webapp/WEB-INF/views/ocm/ExtmallOrderRegisterForm.html
  42. 339 0
      src/main/webapp/WEB-INF/views/ocm/ExtmallSettleRegisterForm.html
  43. 7 6
      src/main/webapp/WEB-INF/views/order/CnclReqForm.html
  44. 88 0
      src/main/webapp/WEB-INF/views/order/OrderDetailForm.html
  45. 7 7
      src/main/webapp/WEB-INF/views/order/OrderListForm.html
  46. 57 6
      src/main/webapp/WEB-INF/views/settle/GoodsSettleForm.html
  47. 89 61
      src/main/webapp/WEB-INF/views/settle/SettleConfirmForm.html
  48. 95 1
      src/main/webapp/WEB-INF/views/shoplinker/ShoplinkerOrderForm.html
  49. 5 1
      src/main/webapp/WEB-INF/views/system/MenuForm.html
  50. 3 3
      src/main/webapp/WEB-INF/views/withdraw/WithdrawExceptionListForm.html

+ 7 - 0
src/main/java/com/style24/admin/biz/dao/TsaBusinessDao.java

@@ -367,4 +367,11 @@ public interface TsaBusinessDao {
 	 */
 	void createShotDelvBrand(Brand brand);
 
+	/**
+	 * 브랜드그룹 메인레이아웃 등록
+	 * @param brandGroup
+	 * @author bin2107
+	 * @since 2021. 07. 29
+	 */
+	void createBrandGroupMainLayout(BrandGroup brandGroup);
 }

+ 26 - 0
src/main/java/com/style24/admin/biz/dao/TsaSettleDao.java

@@ -6,6 +6,7 @@ import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.AflinkFee;
 import com.style24.persistence.domain.DelvFeeSettle;
 import com.style24.persistence.domain.GoodsSettle;
+import com.style24.persistence.domain.SettleConfirm;
 
 /**
  * 정산 Dao
@@ -25,6 +26,22 @@ public interface TsaSettleDao {
 	 */
 	Collection<GoodsSettle> getGoodsSettleList(GoodsSettle goodsSettle);
 
+	/**
+	 * 정산확정 데이터 삭제
+	 * @param settleYm - 정산기준월
+	 * @author gagamel
+	 * @since 2021. 7. 30
+	 */
+	void deleteSettleConfirm(String settleYm);
+
+	/**
+	 * 정산확정 데이터 생성
+	 * @param settleConfirm - 정산확정 정보
+	 * @author gagamel
+	 * @since 2021. 7. 30
+	 */
+	void createSettleConfirm(SettleConfirm settleConfirm);
+
 	/**
 	 * 배송비정산 목록
 	 * @param delvFeeSettle - 배송비정산 정보
@@ -34,6 +51,15 @@ public interface TsaSettleDao {
 	 */
 	Collection<DelvFeeSettle> getDeliveryFeeSettleList(DelvFeeSettle delvFeeSettle);
 
+	/**
+	 * 정산확정 목록
+	 * @param settleConfirm - 정산확정 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 7. 26
+	 */
+	Collection<SettleConfirm> getSettleConfirmList(SettleConfirm settleConfirm);
+
 	/**
 	 * 제휴채널정산 목록
 	 * @param afLinkFee - 제휴채널정산 정보

+ 54 - 0
src/main/java/com/style24/admin/biz/dao/TsaSocialDao.java

@@ -95,4 +95,58 @@ public interface TsaSocialDao {
 	 */
 	int getSocialGoodsGoOffCount(Integer socialSq);
 
+	/**
+	 * 진행 중인 핫딜 즉시 종료 : 상품 가격정보 원복
+	 *
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 7. 29
+	 */
+	void updateGoodsBeforePriceInfo(Social social);
+
+	/**
+	 * 진행 중인 핫딜 즉시 종료 : 원복 상품 이력 생성
+	 *
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 7. 29
+	 */
+	void createBeforeGoodsHst(Social social);
+
+	/**
+	 * 진행 중인 핫딜 즉시 종료 : 소셜 종료 처리(상태변경)
+	 *
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 7. 29
+	 */
+	void updateSocialApplyGbtoF(Social social);
+
+	/**
+	 * 즉시적용할 소셜 시작 상품 적용
+	 *
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 7. 30
+	 */
+	void updateGoodsAfterPriceInfo(Social social);
+
+	/**
+	 * 즉시적용할 상품 이력 생성
+	 *
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 7. 30
+	 */
+	void createAfterGoodsHst(Social social);
+
+	/**
+	 * 즉시적용할 소셜 적용 처리(상태변경)
+	 *
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 7. 30
+	 */
+	void updateSocialApplyGbtoA(Social social);
+
 }

+ 29 - 0
src/main/java/com/style24/admin/biz/dao/TsaWmsWithdrawDao.java

@@ -6,6 +6,8 @@ import org.springframework.dao.DataAccessException;
 
 import com.style24.persistence.domain.WmsWithdraw;
 import com.style24.persistence.domain.Withdraw;
+import com.style24.persistence.domain.WithdrawExc;
+
 import com.style24.persistence.domain.Delivery;
 import com.style24.core.support.annotation.WmsDs;
 import org.springframework.stereotype.Repository;
@@ -71,4 +73,31 @@ public interface TsaWmsWithdrawDao {
 	 */
 	void updateReRecallOrder(Withdraw withdraw);
 	
+	/**
+	 * WMS_IF 회수예외 수정 -H
+	 * @param 
+	 * @return Delivery
+	 * @author moon
+	 * @since 2021. 03. 02
+	 */
+	void updateWmsIfWithdrawExcList(WithdrawExc delivery);
+	
+	/**
+	 * WMS_IF 회수예외 수정 -D
+	 * @param 
+	 * @return Delivery
+	 * @author moon
+	 * @since 2021. 03. 02
+	 */
+	void updateWmsIfWithdrawExcItemList(WithdrawExc delivery);
+	
+	/**
+	 * WMS_IF 회수예외 수정 -M
+	 * @param 
+	 * @return Delivery
+	 * @author moon
+	 * @since 2021. 03. 02
+	 */
+	void updateWmsIfWithdrawExcMemoList(WithdrawExc delivery);	
+	
 }

+ 1 - 0
src/main/java/com/style24/admin/biz/service/TsaBusinessService.java

@@ -535,6 +535,7 @@ public class TsaBusinessService {
 
 		if (brandGroup.getMode().equals("N")) { // 신규
 			businessDao.createBrandGroup(brandGroup);
+			businessDao.createBrandGroupMainLayout(brandGroup);
 		} else { // 수정
 			businessDao.updateBrandGroup(brandGroup);
 		}

+ 3 - 1
src/main/java/com/style24/admin/biz/service/TsaDisplayService.java

@@ -730,7 +730,9 @@ public class TsaDisplayService {
 			contents.setContentsLoc(contentsLoc);
 			displayDao.deleteContents(contents);
 			displayDao.saveContents(contents);
-			if ("SMM007".equals(contentsLoc) || "SMM009".equals(contentsLoc)) {
+
+			if ("SMM003".equals(contentsLoc) || "SMM007".equals(contentsLoc) || "SMM009".equals(contentsLoc) || "SBM007".equals(contentsLoc) || "SBM008".equals(contentsLoc) || "SBM009".equals(contentsLoc)
+					|| "SBM017".equals(contentsLoc) || "SBM018".equals(contentsLoc) || "SBM019".equals(contentsLoc) || "SCM002".equals(contentsLoc) || "SCM003".equals(contentsLoc)  || "SOM003".equals(contentsLoc)) {
 				displayDao.deleteContentsGoods(contents);
 				displayDao.saveContentsGoods(contents);
 			}

+ 32 - 0
src/main/java/com/style24/admin/biz/service/TsaSettleService.java

@@ -4,11 +4,14 @@ import java.util.Collection;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import com.style24.admin.biz.dao.TsaSettleDao;
+import com.style24.admin.support.security.session.TsaSession;
 import com.style24.persistence.domain.AflinkFee;
 import com.style24.persistence.domain.DelvFeeSettle;
 import com.style24.persistence.domain.GoodsSettle;
+import com.style24.persistence.domain.SettleConfirm;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -36,6 +39,24 @@ public class TsaSettleService {
 		return settleDao.getGoodsSettleList(goodsSettle);
 	}
 
+	/**
+	 * 정산확정 처리 - 업체별정산데이터 생성
+	 * @param settleYm - 정산기준월
+	 * @author gagamel
+	 * @since 2021. 7. 30
+	 */
+	@Transactional("shopTxnManager")
+	public void saveSettleConfirm(String settleYm) {
+		// 정산데이터 삭제
+		settleDao.deleteSettleConfirm(settleYm);
+
+		// 정산데이터 생성
+		SettleConfirm settleConfirm = new SettleConfirm();
+		settleConfirm.setSettleYm(settleYm);
+		settleConfirm.setRegNo(TsaSession.getInfo().getUserNo());
+		settleDao.createSettleConfirm(settleConfirm);
+	}
+
 	/**
 	 * 배송비정산 목록
 	 * @param delvFeeSettle - 배송비정산 정보
@@ -47,6 +68,17 @@ public class TsaSettleService {
 		return settleDao.getDeliveryFeeSettleList(delvFeeSettle);
 	}
 
+	/**
+	 * 정산확정 목록
+	 * @param settleConfirm - 정산확정 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 7. 26
+	 */
+	public Collection<SettleConfirm> getSettleConfirmList(SettleConfirm settleConfirm) {
+		return settleDao.getSettleConfirmList(settleConfirm);
+	}
+
 	/**
 	 * 제휴채널정산 목록
 	 * @param afLinkFee - 제휴채널수수료 정보

+ 66 - 4
src/main/java/com/style24/admin/biz/service/TsaShoplinkerService.java

@@ -19,6 +19,7 @@ import com.gagaframework.web.util.GagaFileUtil;
 import com.style24.admin.biz.dao.TsaShoplinkerDao;
 import com.style24.admin.support.env.TsaConstants;
 import com.style24.core.biz.dao.TscShoplinkerDao;
+import com.style24.core.biz.service.TscShoplinkerService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.persistence.domain.ExtmallOrder;
@@ -51,6 +52,9 @@ public class TsaShoplinkerService {
 
 	@Autowired
 	private TscShoplinkerDao tscShoplinkerDao;
+	
+	@Autowired
+	private TscShoplinkerService tscShoplinkerService;
 
 	private String fileAddNm; // 유저번호_년월일시분초
 
@@ -1044,11 +1048,11 @@ public class TsaShoplinkerService {
 
 		// 헤더 title 설정
 		String[] listTitles = { "제휴몰주문등록상태", "실패사유", "업로드실패사유", "스타일24 주문번호", "샵링커 주문번호", "쇼핑몰 주문번호", "쇼핑몰 명", "배송상태[발주확인]"
-				,"주문 상품번호", "샵링커 상품번호", "자사 상품코드", "상품명", "주문수량", "주문금액", "판매단가", "공급가", "옵션명", "주문수집일자", "제휴몰등록일"};
+				,"주문 상품번호", "샵링커 상품번호", "자사 상품코드", "상품명", "주문수량", "주문금액", "판매단가", "공급가", "옵션코드", "옵션명", "주문수집일자", "제휴몰등록일"};
 
 		// DB 처리 시 사용되는 파라미터명(셀명) 설정
-		String[] cellNames = {"UPLOAD_STAT", "UPLOAD_FAIL_CD", "UPLOAD_FAIL_REASON", "ORD_NO", "SHOPLINKER_ORDER_ID", "EXTMALL_ORDER_ID", "MALL_NAME", "BAESONG_STATUS"
-				, "ORDER_PRODUCT_ID", "SHOPLINKER_PRODUCT_ID", "PARTNER_PRODUCT_ID", "PRODUCT_NAME", "QUANTITY", "ORDER_PRICE", "SALE_PRICE", "SUPPLY_PRICE", "SKU", "ORDER_REG_DATE", "EXTMALL_REG_DT"};
+		String[] cellNames = {"UPLOAD_STAT", "UPLOAD_FAIL_CD", "UPLOAD_FAIL_REASON", "ORD_NO", "SHOPLINKER_ORDER_ID", "MALL_ORDER_ID", "MALL_NAME", "BAESONG_STATUS"
+				, "ORDER_PRODUCT_ID", "SHOPLINKER_PRODUCT_ID", "PARTNER_PRODUCT_ID", "PRODUCT_NAME", "QUANTITY", "ORDER_PRICE", "SALE_PRICE", "SUPPLY_PRICE", "SKU_MATCH_CODE", "SKU", "ORDER_REG_DATE", "EXTMALL_REG_DT"};
 
 		String[] cellTypes = {
 			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
@@ -1060,7 +1064,7 @@ public class TsaShoplinkerService {
 			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
 			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
 			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
-			GagaExcelConstants.CellType.CHAR_CENTER.name()};
+			GagaExcelConstants.CellType.CHAR_CENTER.name(),  GagaExcelConstants.CellType.CHAR_CENTER.name()};
 
 		Collection<GagaMap> dataList = admShoplinkerDao.getOrderExcelList(shoplinkerOrder);
 
@@ -1073,6 +1077,64 @@ public class TsaShoplinkerService {
 		}
 	}
 
+	/**
+	 * 주문수집-목록 엑셀다운로드(제휴몰 주문업로드 양식)
+	 *
+	 * @param shoplinkerOrder
+	 * @param excelFilenameWithPath - 경로를 포함한 엑셀파일명
+	 * @return
+	 * @author jmh
+	 * @since 2021. 06. 29
+	 */
+	public void getOrderExcelExtmallFormList(ShoplinkerOrder shoplinkerOrder, String excelFilenameWithPath) {
+
+		// 헤더 title 설정
+		String[] listTitles = { "일련번호", "제휴몰ID", "제휴주문번호", "물품주문번호", "제휴상품코드", "자사상품코드", "상품명", "SKUCode"
+				,"판매가", "주문수량", "배송비", "주문자", "주문자-전화", "주문자-휴대폰", "주문자-이메일", "수령자", "수령자-전화", "수령자-휴대폰"
+				, "수령자-우편번호","수령자-도로명주소", "수령자-상세주소", "배송메시지"};
+
+		// DB 처리 시 사용되는 파라미터명(셀명) 설정
+		String[] cellNames = {"NO", "MALL_ID", "MALL_ORDER_ID", "SHOPLINKER_ORDER_ID", "SHOPLINKER_PRODUCT_ID", "PARTNER_PRODUCT_ID", "PRODUCT_NAME", "SKU_MATCH_CODE"
+				, "SALE_PRICE", "QUANTITY", "BAESONG_BI", "ORDER_NAME", "ORDER_TEL", "ORDER_CEL", "ORDER_EMAIL", "RECEIVE", "RECEIVE_TEL", "RECEIVE_CEL"
+				, "RECEIVE_ZIPCODE", "RECEIVE_ADDR", "RECIP_DTL_ADDR", "DELIVERY_MSG"};
+
+		String[] cellTypes = {
+			GagaExcelConstants.CellType.CHAR_LEFT.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
+			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
+			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
+			GagaExcelConstants.CellType.CHAR_LEFT.name(), GagaExcelConstants.CellType.CHAR_LEFT.name(),
+			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
+			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
+			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
+			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
+			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
+			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_LEFT.name(),
+			GagaExcelConstants.CellType.CHAR_LEFT.name(), GagaExcelConstants.CellType.CHAR_LEFT.name()};
+
+		Collection<GagaMap> dataList = admShoplinkerDao.getOrderExcelList(shoplinkerOrder);
+		
+		GagaMap addrMap; 	//주소 분리
+		int cnt = 1;
+		for( GagaMap map : dataList ) {
+			if( !"".equals(map.getString("RECEIVE_ADDR"))) {
+				map.setInt("NO", cnt);
+				cnt ++;
+				
+				addrMap = tscShoplinkerService.returnChangeAddr(map.getString("RECEIVE_ADDR"));
+				map.setString("RECEIVE_ADDR", addrMap.getString("addrBase"));
+				map.setString("RECIP_DTL_ADDR", addrMap.getString("addrDtl"));
+			}
+		}
+		
+		try {
+
+			GagaExcelUtil.createExcel(excelFilenameWithPath, dataList, "샵링커 주문 정보", listTitles, cellNames, cellTypes, TsaConstants.EXCEL_FOOTER_TITLE);
+
+		} catch (Exception e) {
+			throw new IllegalStateException(e);
+		}
+	}
+
 	/**
 	 * 송장전송-전송 (엑셀용)
 	 *

+ 44 - 5
src/main/java/com/style24/admin/biz/service/TsaSocialService.java

@@ -99,9 +99,9 @@ public class TsaSocialService {
 		Integer userNo = TsaSession.getInfo().getUserNo();
 		Integer socialSq = paramList.iterator().next().getSocialSq();
 
-		if (socialDao.getSocialGoodsGoOffCount(socialSq) > 0){
-			throw new IllegalStateException("해당 핫딜은 진행중이므로 수정하실 수 없습니다.");
-		}
+//		if (socialDao.getSocialGoodsGoOffCount(socialSq) > 0){
+//			throw new IllegalStateException("해당 핫딜은 진행중이므로 수정하실 수 없습니다.");
+//		}
 
 		for (Social social : paramList) {
 			social.setRegNo(userNo);
@@ -147,6 +147,45 @@ public class TsaSocialService {
 			socialDao.deleteSocialGoods(socialInfo);
 		}
 	}
-	
-	
+
+	/**
+	 * 진행 중인 핫딜 즉시 종료
+	 *
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 7. 29
+	 */
+	@Transactional("shopTxnManager")
+	public void saveSocialEnd(Social social){
+		// 1. 소셜 종료 상품 원복
+		socialDao.updateGoodsBeforePriceInfo(social);
+		// 2. 원복 상품 이력 생성
+		socialDao.createBeforeGoodsHst(social);
+		// 3. 소셜 종료 처리(상태변경)
+		socialDao.updateSocialApplyGbtoF(social);
+	}
+
+	/**
+	 * 진행 중인 핫딜 즉시 종료
+	 *
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 7. 29
+	 */
+	@Transactional("shopTxnManager")
+	public void saveSocialApply(Social social){
+		// 1. 진행중인 소셜 종료 상품 원복
+		socialDao.updateGoodsBeforePriceInfo(social);
+		// 2. 진행중인 소셜 원복 상품 이력 생성
+		socialDao.createBeforeGoodsHst(social);
+		// 3. 진행중인 소셜 종료 처리(상태변경)
+		socialDao.updateSocialApplyGbtoF(social);
+
+		// 4. 즉시적용할 소셜 시작 상품 적용
+		socialDao.updateGoodsAfterPriceInfo(social);
+		// 5. 즉시적용할 상품 이력 생성
+		socialDao.createAfterGoodsHst(social);
+		// 6. 즉시적용할 소셜 적용 처리(상태변경)
+		socialDao.updateSocialApplyGbtoA(social);
+	}
 }

+ 3 - 0
src/main/java/com/style24/admin/biz/service/TsaWithdrawService.java

@@ -138,6 +138,9 @@ public class TsaWithdrawService {
 		withdrawExc.setRecallStat("S");
 		withdrawDao.updateWithdrawException(withdrawExc);
 		
+		wmsWithdrawService.updateTbIfRecallExceptionRslt(withdrawExc);
+		
+		
 	}
 	
 	/**

+ 17 - 0
src/main/java/com/style24/admin/biz/service/TsaWmsWithdrawService.java

@@ -9,6 +9,8 @@ import lombok.extern.slf4j.Slf4j;
 import com.style24.admin.biz.dao.TsaWmsWithdrawDao;
 import com.style24.persistence.domain.WmsWithdraw;
 import com.style24.persistence.domain.Withdraw;
+import com.style24.persistence.domain.WithdrawExc;
+
 import com.style24.persistence.domain.Delivery;
 import com.style24.core.support.message.TscMessageByLocale;
 
@@ -92,5 +94,20 @@ public class TsaWmsWithdrawService {
 		wmsWithdrawDao.updateReRecallOrder(withdraw);
 	}
 	
+	/**
+	 * WMS_IF 회수예외 처리결과 등록 
+	 * @param 
+	 * @return Delivery
+	 * @author moon
+	 * @since  2021. 03. 02
+	 */
+	@Transactional("wmsTxnManager")
+	public void updateTbIfRecallExceptionRslt(WithdrawExc excData) {
+
+			excData.setIfstat("2");
+			wmsWithdrawDao.updateWmsIfWithdrawExcList(excData);
+			wmsWithdrawDao.updateWmsIfWithdrawExcItemList(excData);
+			wmsWithdrawDao.updateWmsIfWithdrawExcMemoList(excData);
+	}	
 	
 }

+ 34 - 0
src/main/java/com/style24/admin/biz/web/TsaMarketingController.java

@@ -2748,4 +2748,38 @@ public class TsaMarketingController extends TsaBaseController {
 		planService.deleteShotBrandGoods(paramList);
 		return super.ok(message.getMessage("SUCC_0003"));
 	}
+
+	/**
+	 * 진행 중인 핫딜 즉시 종료
+	 *
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 7. 29
+	 */
+	@PostMapping("/social/end/save")
+	@ResponseBody
+	public GagaResponse saveSocialEnd(@RequestBody Social social) {
+		Integer userNo = TsaSession.getInfo().getUserNo();
+		social.setRegNo(userNo);
+		social.setUpdNo(userNo);
+		socialService.saveSocialEnd(social);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 *  진행중인 핫딜 종료후 해당 핫딜 즉시적용
+	 *
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 7. 30
+	 */
+	@PostMapping("/social/apply/save")
+	@ResponseBody
+	public GagaResponse saveSocialApply(@RequestBody Social social) {
+		Integer userNo = TsaSession.getInfo().getUserNo();
+		social.setRegNo(userNo);
+		social.setUpdNo(userNo);
+		socialService.saveSocialApply(social);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
 }

+ 58 - 0
src/main/java/com/style24/admin/biz/web/TsaOcmController.java

@@ -29,6 +29,7 @@ import com.style24.persistence.domain.ExtmallNoti;
 import com.style24.persistence.domain.ExtmallOrder;
 import com.style24.persistence.domain.ExtmallOrigin;
 import com.style24.persistence.domain.ExtmallPriceSync;
+import com.style24.persistence.domain.ShoplinkerInvoice;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -354,5 +355,62 @@ public class TsaOcmController extends TsaBaseController {
 		return orderOcmService.getExtmallOrderUploadSecondList(extmallOrder);
 	}
 
+	/**
+	 * 제휴몰정산가격업로드 화면
+	 * @param
+	 * @return
+	 * @author jmh
+	 * @since 2021. 08. 02
+	 */
+	@GetMapping("/extmall/settle/upload/form")
+	public ModelAndView extmallSettleUploadForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 제휴몰벤더
+		mav.addObject("vendorList", rendererService.getCommonCodeList("G003", "Y", TsaSession.getInfo().getSupplyCompCd()));
 
+		// 제휴몰
+		Extmall extmall = new Extmall();
+		extmall.setVendorId(TscConstants.VendorId.SHOPLINKER.value()); // 샵링커
+		mav.addObject("extmallList", ocmService.getExtmallList(extmall));
+		
+		// 공급업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd()));
+
+		// 유통구분
+		mav.addObject("distributionGbList", rendererService.getCommonCodeList("G065"));
+		
+		mav.setViewName("ocm/ExtmallSettleRegisterForm");
+
+		return mav;
+	}
+
+	/**
+	 * 제휴몰정산가격업로드 - 목록조회
+	 *
+	 * @param 
+	 * @return GagaMap
+	 * @author jmh
+	 * @since 2021. 08. 02
+	 */
+	@PostMapping("/extmall/settle/list")
+	@ResponseBody
+	public GagaMap getExtmallSettleList(@RequestBody ShoplinkerInvoice shoplinkerInvoice) {
+
+		GagaMap result = new GagaMap();
+
+		// multi row 검색관련 처리
+		/*		if (!StringUtils.isBlank(shoplinkerInvoice.getCondition())) {
+			shoplinkerInvoice.setConditionList(shoplinkerInvoice.getCondition().replaceAll("\r", "").trim().split("\n"));
+		}
+
+		shoplinkerInvoice.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
+		shoplinkerInvoice.setPageable(new TscPageRequest(shoplinkerInvoice.getPageNo() - 1, shoplinkerInvoice.getPageSize()));
+		shoplinkerInvoice.getPageable().setTotalCount(admShoplinkerService.getSendInvoiceListCount(shoplinkerInvoice));
+
+		result.set("pageing", shoplinkerInvoice);
+		result.set("invoiceList", admShoplinkerService.getSendInvoiceList(shoplinkerInvoice));
+*/
+		return result;
+	}
 }

+ 60 - 0
src/main/java/com/style24/admin/biz/web/TsaOrderChangeController.java

@@ -6,6 +6,7 @@ import java.util.List;
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -78,6 +79,9 @@ public class TsaOrderChangeController extends TsaBaseController {
 
 	@Autowired
 	private TscMailService coreMailService;
+
+	@Autowired
+	private Environment env;
 	
 	/**
 	 * 취소요청, 취소완료 통합 화면 (관리자)
@@ -258,6 +262,56 @@ public class TsaOrderChangeController extends TsaBaseController {
 		// 취소완료
 		else {
 			result = coreOrderChangeService.partialCancel(map, userNo);
+			
+			String pgGb = map.getString("pgGb");
+			
+			if (TscConstants.PgGb.NAVER_ORDER.value().equals(pgGb)) {
+				List<Order> cancelOrderRefundList 	= (List<Order>) map.get("cancelOrderRefundList");
+
+				for(Order vo : cancelOrderRefundList) {
+					
+					try {
+						// 2021.07.30 수정
+						if (vo.getOrdCanChgQty() > 0) {
+							Order order = coreNaverPayService.getOrderDetailInfoFromOrdDtlNo(vo);
+							
+							if ("O".equals(order.getOrdExchGb())) {
+								// 취소 완료
+								if ("scm".equals(env.getProperty("server.site.name"))) {
+									order.setRegNo(userNo);
+									coreNaverPayService.sendNaverPayOrderCancelConfirm(order);        // 취소 완료 데이터 송부
+								} else {
+									String addUrl = "/naverpay/send/cancel/complete?ordNo=" + order.getOrdNo() + "&ordDtlNo=" + order.getOrdDtlNo() + "&npayOrdDtlNo=" + order.getNpayOrdDtlNo() + "&userNo=" + userNo;
+									coreNaverPayService.sendScmServerForNaverpay(addUrl);        // 취소 완료 데이터 송부
+								}
+							} else {
+								// 반품 품절 취소
+								if ("scm".equals(env.getProperty("server.site.name"))) {
+									coreNaverPayService.sendNaverPayRejectExchange(order, userNo);			// 교환반려
+									coreNaverPayService.sendNaverPaySoldoutReturnReq(order, userNo);		// 품절반품접수
+									coreNaverPayService.sendNaverPayReturnComplete(order, userNo);			// 반품완료
+								} else {
+									String addUrl = "";
+									// 네이버페이는 SCM을 통해서 송부
+									// coreNaverPayService.sendNaverPayRejectExchange(exception, userNo);        // 교환반려
+									addUrl = "/naverpay/send/reject/exchange?ordDtlNo=" + order.getOrdDtlNo() + "&userNo=" + userNo;
+									coreNaverPayService.sendScmServerForNaverpay(addUrl);                        // 교환 반려
+	
+									// coreNaverPayService.sendNaverPaySoldoutReturnReq(param, userNo);				// 품절반품접수
+									addUrl = "/naverpay/send/soldout/return/req?ordDtlNo=" + order.getOrdDtlNo() + "&userNo=" + userNo;
+									coreNaverPayService.sendScmServerForNaverpay(addUrl);                            // 품절반품접수
+	
+									// coreNaverPayService.sendNaverPayReturnComplete(exception, userNo);		// 반품완료
+									addUrl = "/naverpay/send/return/complete?ordDtlNo=" + order.getOrdDtlNo() + "&userNo=" + userNo;
+									coreNaverPayService.sendScmServerForNaverpay(addUrl);                        // 반품완료
+								}
+							}
+						}
+					} catch (Exception e) {
+						e.printStackTrace();
+					}
+				}
+			}
 		}
 		
 		// 2021.06.21 교환TO취소 교환배송비 취소처리
@@ -518,6 +572,12 @@ public class TsaOrderChangeController extends TsaBaseController {
 		int ordChgSq = result.getInt("ordChgSq");
 
 		if (ordChgSq > 0) {
+			String pgGb = refundPreInfo.getString("pgGb");
+			if(TscConstants.PgGb.NAVER_ORDER.value().equals(pgGb)) {
+				// 네이버페이 주문형 알림톡, 메일 송부 X
+				return super.ok("성공");
+			}
+
 			// 반품 알림톡 관련 정보 조회
 			OrderChange orderChange = coreOrderChangeService.getKakaoOrderReturnInfo(ordChgSq);
 

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

@@ -224,6 +224,43 @@ public class TsaOrderController extends TsaBaseController {
 		
 		// 2021.05.11 배송비수정여부추가
 		Collection<Order> orderDetailList = orderService.getOrderDetailList(order);
+		
+		/*
+		// 2021.07.29 결제금액관련정보
+		int listSumAmt 			= 0; // 상품금액합계(정상가)
+		int goodsSumAmt 		= 0; // 상품금액합계(판매가)
+		int goodsDcSumAmt		= 0; // 상품할인금액(정상가 - 판매가)
+		int delvFeeSumAmt 		= 0; // 배송비합계
+		int realDelvSumAmt		= 0; // 실제배송비합계
+		int cpn11DcSumAmt 		= 0; // 즉시할인합계(실결제금액계산용)
+		int tmtbSumAmt 			= 0; // 다다익선합계
+		int cpnDcSumAmt 		= 0; // 쿠폰할인합계
+		int prePntDcSumAmt 		= 0; // 선포인트할인합계
+		int pntDcSumAmt 		= 0; // 포인트사용합계
+		int gfcdUseSumAmt 		= 0; // 상품권사용합계
+		int mileageDcAmt 		= 0; // 마일리지사용합계
+		int allianceDcAmt 		= 0; // 제휴할인합계
+		int savePntSumAmt 		= 0; // 적립예정포인트합계
+		
+		int listPriceSum 		= 0; 	// 총상품금액 (정상가)
+		int currPriceSum		= 0;	// 상품할인금액 (
+		int tmtbDcAmtSum 		= 0; 	// 다다익선할인금액
+		int prePntDcAmtSum 		= 0; 	// 선포인트할인금액
+		int cpn1DcAmtSum		= 0;	// 즉시할인쿠폰금액
+		int goodspCnDcAmtSum	= 0;	// 상품쿠폰할인금액
+		int cartpCnDcAmtSum		= 0;	// 장바구니쿠폰할인금액
+		int delvFeeSum			= 0;	// 배송비
+		int delvCpnDcAmtSum		= 0;	// 배송비쿠폰할인금액
+		
+		int totalAmtSum			= 0;	// 총매출액 (실결제액 + 제휴할인결제액 + 포인트결제액 + 상품권결제액)
+		int realOrdAmtSum		= 0;	// 실결제액 ((실결제액 + 배송비합계) - 제휴할인결제액)
+		int pgCpnAmtSum			= 0;	// 제휴쿠폰 할인금액 (PG)
+		int npayPntAmt			= 0;	// 마일리지 할인금액 (네이버)
+		int pntDcAmtSum			= 0;	// 포인트결제액
+		int gfcdUseAmtSum		= 0;	// 상품권결제액
+		int savePntAmtSum		= 0;	// 적립금액
+		*/
+		
 		String allCanYn = "Y";
 		for (Order orderDetail : orderDetailList) {
 			if ("Y".equals(allCanYn)

+ 44 - 0
src/main/java/com/style24/admin/biz/web/TsaSettleController.java

@@ -6,6 +6,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -17,12 +18,16 @@ import com.style24.admin.biz.service.TsaRendererService;
 import com.style24.admin.biz.service.TsaSettleService;
 import com.style24.admin.support.controller.TsaBaseController;
 import com.style24.admin.support.security.session.TsaSession;
+import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.persistence.domain.AflinkFee;
 import com.style24.persistence.domain.DelvFeeSettle;
 import com.style24.persistence.domain.GoodsSettle;
+import com.style24.persistence.domain.SettleConfirm;
 
 import lombok.extern.slf4j.Slf4j;
 
+import com.gagaframework.web.rest.server.GagaResponse;
+
 /**
  * 정산 Controller
  *
@@ -43,6 +48,9 @@ public class TsaSettleController extends TsaBaseController {
 	@Autowired
 	private ObjectMapper mapper;
 
+	@Autowired
+	private TscMessageByLocale message;
+
 	/**
 	 * 상품정산 화면
 	 * @return
@@ -101,6 +109,20 @@ public class TsaSettleController extends TsaBaseController {
 		return settleService.getGoodsSettleList(goodsSettle);
 	}
 
+	/**
+	 * 정산확정 처리 - 업체별정산데이터 생성
+	 * @param settleYm - 정산기준월
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 7. 30
+	 */
+	@PostMapping("/confirm/save/{settleYm}")
+	@ResponseBody
+	public GagaResponse saveSettleConfirm(@PathVariable String settleYm) {
+		settleService.saveSettleConfirm(settleYm);
+		return super.ok(message.getMessage("SUCC_0004"));
+	}
+
 	/**
 	 * 배송비정산 화면
 	 * @return
@@ -179,6 +201,28 @@ public class TsaSettleController extends TsaBaseController {
 		return mav;
 	}
 
+	/**
+	 * 정산확정 목록
+	 * @param settleConfirm - 정산확정 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 7. 26
+	 */
+	@PostMapping("/confirm/list")
+	@ResponseBody
+	public Collection<SettleConfirm> getSettleConfirmList(@RequestBody SettleConfirm settleConfirm) {
+		if (!StringUtils.isBlank(settleConfirm.getSupplyCompList())) {
+			try {
+				String[] arrSupplyComp = mapper.readValue(settleConfirm.getSupplyCompList(), String[].class);
+				settleConfirm.setMultiSupplyComp(arrSupplyComp);
+			} catch (Exception e) {
+				throw new IllegalStateException("업체코드 검색중 오류로 인해 조회되지 않았습니다.");
+			}
+		}
+
+		return settleService.getSettleConfirmList(settleConfirm);
+	}
+
 	/**
 	 * 업체별정산내역 화면
 	 * @return

+ 63 - 95
src/main/java/com/style24/admin/biz/web/TsaShoplinkerController.java

@@ -5,6 +5,7 @@ import java.net.URLEncoder;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
 
@@ -545,7 +546,26 @@ log.info(" #### SHOPLINKER CHKE 1 - "+runMap.getRunCnt()+" | "+runMap.getSidOver
 			}
 		}
 	}
-
+	
+	 
+	/**
+	 * 샵링커주문수집-가용재고로 인한 실패 건, 실패사유플래그 변경(엑셀에서 재주문 가능하도록)
+	 * 
+	 * @param ShoplinkerOrder
+	 * @author jmh
+	 * @throws Exception
+	 * @since 2021. 7. 28
+	 */
+	@PostMapping("/order/change/saveFailFlag")
+	@ResponseBody
+	public GagaResponse orderChangeSaveFailFlag(@RequestBody Collection<ShoplinkerOrder> orderList) throws Exception {
+		// ※ 샵링커 주문수집시, 재고로인한 실패건은 고객에게 알림이 발송된다. 이 경우 제휴몰 엑셀업로드시 주문등록이 되지 않도록 처리했음.(고객에게 알림이 발송된건 이므로)
+		//   그런데 이 경우도 cs팀에서 엑셀주문등록이 가능하도록 해달라고 요청 함. => 플래그 변경으로 주문등록이 가능한 상태로 만들도록 처리 
+		
+		tscShoplinkerService.updateOrderFailFlag(orderList);
+		return super.ok(message.getMessage("SUCC_0002"));
+	}
+	
 	/**
 	 * 주문수집관리-엑셀다운로드
 	 *
@@ -559,6 +579,10 @@ log.info(" #### SHOPLINKER CHKE 1 - "+runMap.getRunCnt()+" | "+runMap.getSidOver
 		String excelfileName = "샵링커_주문_" + GagaDateUtil.getTodayDateTime() + ".xlsx";
 		String excelFilenameWithPath = GagaFileUtil.getConcatenationPath(env.getProperty("download.path"), "excel", excelfileName);
 
+		// multi row 검색관련 처리
+		if (!StringUtils.isBlank(shoplinkerOrder.getCondition())) {
+			shoplinkerOrder.setConditionList(shoplinkerOrder.getCondition().replaceAll("\r", "").trim().split("\n"));
+		}
 		shoplinkerOrder.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
 		shoplinkerOrder.setPageable(new TscPageRequest(shoplinkerOrder.getPageNo() - 1, shoplinkerOrder.getPageSize()));
 		shoplinkerOrder.getPageable().setTotalCount(admShoplinkerService.getShoplinkerOrderListCount(shoplinkerOrder));
@@ -568,6 +592,32 @@ log.info(" #### SHOPLINKER CHKE 1 - "+runMap.getRunCnt()+" | "+runMap.getSidOver
 		return GagaFileUtil.writeFile(request, excelFilenameWithPath);
 	}
 
+	/**
+	 * 주문수집관리-엑셀다운로드 (제휴몰 주문업로드 양식)
+	 *
+	 * @param shoplinkerOrder
+	 * @return
+	 * @author jmh
+	 * @since 2021. 06. 29
+	 */
+	@GetMapping("/order/excel/extmall_form_list")
+	public ResponseEntity<InputStreamResource> downloadOrderInfoExcelExtmallFormList(HttpServletRequest request, ShoplinkerOrder shoplinkerOrder) throws Exception {
+		String excelfileName = "샵링커_주문(제휴몰양식)_" + GagaDateUtil.getTodayDateTime() + ".xlsx";
+		String excelFilenameWithPath = GagaFileUtil.getConcatenationPath(env.getProperty("download.path"), "excel", excelfileName);
+
+		// multi row 검색관련 처리
+		if (!StringUtils.isBlank(shoplinkerOrder.getCondition())) {
+			shoplinkerOrder.setConditionList(shoplinkerOrder.getCondition().replaceAll("\r", "").trim().split("\n"));
+		}
+		shoplinkerOrder.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
+		shoplinkerOrder.setPageable(new TscPageRequest(shoplinkerOrder.getPageNo() - 1, shoplinkerOrder.getPageSize()));
+		shoplinkerOrder.getPageable().setTotalCount(admShoplinkerService.getShoplinkerOrderListCount(shoplinkerOrder));
+
+		admShoplinkerService.getOrderExcelExtmallFormList(shoplinkerOrder, excelFilenameWithPath);
+
+		return GagaFileUtil.writeFile(request, excelFilenameWithPath);
+	}
+
 
 	/**
 	 * 송장전송관리-화면
@@ -701,8 +751,10 @@ log.info(" #### SHOPLINKER CHKE 1 - "+runMap.getRunCnt()+" | "+runMap.getSidOver
 		String excelfileName = "샵링커_송장_" + GagaDateUtil.getTodayDateTime() + ".xlsx";
 		String excelFilenameWithPath = GagaFileUtil.getConcatenationPath(env.getProperty("download.path"), "excel", excelfileName);
 
-
-
+		// multi row 검색관련 처리
+		if (!StringUtils.isBlank(shoplinkerInvoice.getCondition())) {
+			shoplinkerInvoice.setConditionList(shoplinkerInvoice.getCondition().replaceAll("\r", "").trim().split("\n"));
+		}
 		shoplinkerInvoice.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
 		shoplinkerInvoice.setPageable(new TscPageRequest(shoplinkerInvoice.getPageNo() - 1, shoplinkerInvoice.getPageSize()));
 		shoplinkerInvoice.getPageable().setTotalCount(admShoplinkerService.getSendInvoiceListCount(shoplinkerInvoice));
@@ -845,71 +897,9 @@ log.info(" #### SHOPLINKER CHKE 1 - "+runMap.getRunCnt()+" | "+runMap.getSidOver
 			com.gagaframework.shoplinker.domain.goods.result.ResultMessage resultMsg;
 			com.gagaframework.shoplinker.domain.invoice.ObjectFactory obf;
 
-			/**** 송장전송테스트 ************/
-			com.gagaframework.shoplinker.domain.invoice.ResultMessage invoceMsg;
-			responseXmlData = "<?xml version='1.0' encoding='euc-kr'?>\r\n"
-					+ "<ResultMessage>\r\n"
-					+ "<result>false</result>\r\n"
-					+ "<id>123</id>\r\n"
-					+ "<message><![CDATA[택배사 명칭이 일치하지 않거나 코드가 일치하지 않습니다. 재전송 바랍니다.]]></message>\r\n"
-					+ "</ResultMessage>";
-
-
-			//xx invoceMsg = (com.gagaframework.shoplinker.domain.invoice.ResultMessage) shoplinkerUtil.unmarshal(null, responseXmlData);
-			//xx obf = (com.gagaframework.shoplinker.domain.invoice.ObjectFactory) shoplinkerUtil.unmarshal(com.gagaframework.shoplinker.domain.invoice.ObjectFactory.class, responseXmlData);
-
-			//invoceMsg = (com.gagaframework.shoplinker.domain.invoice.ResultMessage) shoplinkerUtil.unmarshal(com.gagaframework.shoplinker.domain.invoice.ResultMessage, responseXmlData);
-
-			/*
-			com.style24.admin.support.util.ResultMessage22 re;
-
-			 JAXBContext jaxbContext = JAXBContext.newInstance(new Class[] {com.style24.admin.support.util.ResultMessage22.class});
-			 Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
-			 System.out.println("####### :: "+unmarshaller.unmarshal((Reader)new StringReader(responseXmlData)));
-			 re = (ResultMessage22) unmarshaller.unmarshal((Reader)new StringReader(responseXmlData));
-System.out.println("####### : "+re.getMessage());
-System.out.println("####### : "+re.getId());
-System.out.println("####### : "+re.getResult());
-*/
-			// System.out.println(" hmj obf :: "+ obf);
-			// invoceMsg = (com.gagaframework.shoplinker.domain.invoice.ResultMessage) unmarshaller.unmarshal((Reader)new StringReader(responseXmlData));
-			// invoceMsg.getId();
-
-		    // invoceMsg =  (ResultMessage) unmarshaller.unmarshal((Reader)new StringReader(responseXmlData));
-
-			//shoplinkerResult = (com.gagaframework.shoplinker.domain.goods.result.Shoplinker)shoplinkerUtil.unmarshal(com.gagaframework.shoplinker.domain.goods.result.Shoplinker.class, responseXmlData);
-			//invoceMsg = shoplinkerResult.getResultMessage();
-			//System.out.println("HMj 2 : ");
-			//invoceMsg = responseXmlData;
-
-		//	System.out.println(" HMJ invoice2 : "+invoceMsg);
-		//	System.out.println(" HMJ invoice3 : "+invoceMsg.getResult());
-		//	System.out.println(" HMJ invoice4 : "+invoceMsg.getMessage());
-		//	System.out.println(" HMJ invoice5 : "+invoceMsg.getId());
-
-			/**** 송장전송테스트 끝 ************/
-
-
 			//1 상품등록 테스트
 			String testXmlUrl;
 
-			/*for( i=2; i< 87; i++) {
-				testXmlUrl = "http://ts5000.ipdisk.co.kr:8999/shoplinker/goods_reg/T142TS200P/option_"+i+".xml";
-				responseXmlData =    shoplinkerUtil.callShoplinkerApiByGet(GagaShoplinkerConstants.API_DOMAIN+"/Product/attribute_insert.php?iteminfo_url="+URLEncoder.encode(testXmlUrl), "" );
-				shoplinkerResult =  (com.gagaframework.shoplinker.domain.goods.result.Shoplinker)shoplinkerUtil.unmarshal(com.gagaframework.shoplinker.domain.goods.result.Shoplinker.class, responseXmlData);
-				resultMsg = shoplinkerResult.getResultMessage();
-				System.out.println(i+"\n### 1.단품 result1 :: "+resultMsg.getResult());
-			  	System.out.println(i+"### 1.단품 result2 :: "+resultMsg.getMessage());
-			}*/
-
-			testXmlUrl = "http://ts5000.ipdisk.co.kr:8999/shoplinker/goods_reg/T142TS200P/product.xml";
-			responseXmlData =   shoplinkerUtil.callShoplinkerApiByGet(GagaShoplinkerConstants.API_DOMAIN+"/Product/attribute_prod_insert.php?iteminfo_url="+URLEncoder.encode(testXmlUrl), "");
-			shoplinkerResult =  (com.gagaframework.shoplinker.domain.goods.result.Shoplinker)shoplinkerUtil.unmarshal(com.gagaframework.shoplinker.domain.goods.result.Shoplinker.class, responseXmlData);
-			resultMsg = shoplinkerResult.getResultMessage();
-			System.out.println("\n\n\n### 2.상품 result1 :: "+resultMsg.getResult());
-			System.out.println(" :: "+responseXmlData);
-			System.out.println("### 2.상품 result2 :: "+resultMsg.getMessage());
-
 	for( i=1; i< 1; i++) {
 
 			testXmlUrl = "http://ts5000.ipdisk.co.kr:8999/shoplinker/goods_reg/option_1.xml";
@@ -918,29 +908,7 @@ System.out.println("####### : "+re.getResult());
 			resultMsg = shoplinkerResult.getResultMessage();
 			System.out.println("\n### 1.단품 result1 :: "+resultMsg.getResult());
 		  	System.out.println("### 1.단품 result2 :: "+resultMsg.getMessage());
-
-
-			testXmlUrl = "http://ts5000.ipdisk.co.kr:8999/shoplinker/goods_reg/option_2.xml";
-			responseXmlData =    shoplinkerUtil.callShoplinkerApiByGet(GagaShoplinkerConstants.API_DOMAIN+"/Product/attribute_insert.php?iteminfo_url="+URLEncoder.encode(testXmlUrl), "" );
-			shoplinkerResult =  (com.gagaframework.shoplinker.domain.goods.result.Shoplinker)shoplinkerUtil.unmarshal(com.gagaframework.shoplinker.domain.goods.result.Shoplinker.class, responseXmlData);
-			resultMsg = shoplinkerResult.getResultMessage();
-			System.out.println("\n### 1.단품 result1 :: "+resultMsg.getResult());
-			System.out.println("### 1.단품 result2 :: "+resultMsg.getMessage());
-
-			testXmlUrl = "http://ts5000.ipdisk.co.kr:8999/shoplinker/goods_reg/option_3.xml";
-			responseXmlData =    shoplinkerUtil.callShoplinkerApiByGet(GagaShoplinkerConstants.API_DOMAIN+"/Product/attribute_insert.php?iteminfo_url="+URLEncoder.encode(testXmlUrl), "" );
-			shoplinkerResult =  (com.gagaframework.shoplinker.domain.goods.result.Shoplinker)shoplinkerUtil.unmarshal(com.gagaframework.shoplinker.domain.goods.result.Shoplinker.class, responseXmlData);
-			resultMsg = shoplinkerResult.getResultMessage();
-			System.out.println("\n### 1.단품 result1 :: "+resultMsg.getResult());
-			System.out.println("### 1.단품 result2 :: "+resultMsg.getMessage());
-
-			testXmlUrl = "http://ts5000.ipdisk.co.kr:8999/shoplinker/goods_reg/option_4.xml";
-			responseXmlData =    shoplinkerUtil.callShoplinkerApiByGet(GagaShoplinkerConstants.API_DOMAIN+"/Product/attribute_insert.php?iteminfo_url="+URLEncoder.encode(testXmlUrl), "" );
-			shoplinkerResult =  (com.gagaframework.shoplinker.domain.goods.result.Shoplinker)shoplinkerUtil.unmarshal(com.gagaframework.shoplinker.domain.goods.result.Shoplinker.class, responseXmlData);
-			resultMsg = shoplinkerResult.getResultMessage();
-			System.out.println("\n### 1.단품 result1 :: "+resultMsg.getResult());
-			System.out.println("### 1.단품 result2 :: "+resultMsg.getMessage());
-
+			
 			testXmlUrl = "http://ts5000.ipdisk.co.kr:8999/shoplinker/goods_reg/product.xml";
 			responseXmlData =   shoplinkerUtil.callShoplinkerApiByGet(GagaShoplinkerConstants.API_DOMAIN+"/Product/attribute_prod_insert.php?iteminfo_url="+URLEncoder.encode(testXmlUrl), "");
 			shoplinkerResult =  (com.gagaframework.shoplinker.domain.goods.result.Shoplinker)shoplinkerUtil.unmarshal(com.gagaframework.shoplinker.domain.goods.result.Shoplinker.class, responseXmlData);
@@ -983,16 +951,16 @@ System.out.println("####### : "+re.getResult());
 */
 
 			//99 주문수집 목록확인
-/*
+
 			List<com.gagaframework.shoplinker.domain.orderlist.Order> rOrdList;
 			com.gagaframework.shoplinker.domain.orderlist.Header rHeader;
 			com.gagaframework.shoplinker.domain.orderlist.Shoplinker shoplinkerOrdResult;
 
-			testXmlUrl = "http://ts5000.ipdisk.co.kr:8999/shoplinker/order/order_time.xml"; // 20210401  143000 ~ 150000
-			//testXmlUrl = "http://ts5000.ipdisk.co.kr:8999/shoplinker/order/0528/order_real_1.xml";	// 28~31일 15시~07시
+			//testXmlUrl = "http://ts5000.ipdisk.co.kr:8999/shoplinker/order/order_time.xml"; // 20210401  143000 ~ 150000
+			testXmlUrl = "http://ts5000.ipdisk.co.kr:8999/shoplinker/order/order.xml";	// 28~31일 15시~07시
 			//testXmlUrl = "http://ts5000.ipdisk.co.kr:8999/shoplinker/order/0528/order_real_28.xml";	// 28 15시~235959  7개
 			//testXmlUrl = "http://ts5000.ipdisk.co.kr:8999/shoplinker/order/0528/order_real_31.xml";	// 31일 000000시~07시  5582개
-			responseXmlData =   shoplinkerUtil.callShoplinkerApiByGet(GagaShoplinkerConstants.API_DOMAIN+"/Order/orderlist.php?iteminfo_url="+testXmlUrl, "");
+		/*	responseXmlData =   shoplinkerUtil.callShoplinkerApiByGet(GagaShoplinkerConstants.API_DOMAIN+"/Order/orderlist.php?iteminfo_url="+testXmlUrl, "");
 
 
 			shoplinkerOrdResult = (com.gagaframework.shoplinker.domain.orderlist.Shoplinker)shoplinkerUtil.unmarshal(com.gagaframework.shoplinker.domain.orderlist.Shoplinker.class, responseXmlData);
@@ -1008,10 +976,10 @@ System.out.println("####### : "+re.getResult());
 				System.out.println("### 주문실패 msg :: "+orderFailResultMsg.getMessage());
 
 			}else {
-				System.out.println("\n\n\n### 7.주문 result1 :: "+responseXmlData);
+				//System.out.println("\n\n\n### 7.주문 result1 :: "+responseXmlData);
 
 				//System.out.println(" url chk:: "+GagaShoplinkerConstants.API_DOMAIN+"/Order/orderlist.php?iteminfo_url="+ testXmlUrl);
-				System.out.println("### 7.주문 result2 :: "+rHeader.toString());
+				//System.out.println("### 7.주문 result2 :: "+rHeader.toString());
 				System.out.println("### 7.주문 result22 :: "+rHeader.getTotalCount()); // 1233
 				System.out.println("### 7.주문 result23 :: "+rHeader.getTotalPage()); //3
 				System.out.println("### 7.주문 result24 :: "+rHeader.getCurrentlyPage()); //1
@@ -1025,7 +993,7 @@ System.out.println("####### : "+re.getResult());
 				//}
 
 			}
-*/
+		*/
 			//99 주문수집 목록확인 끝
 
 		}catch(Exception e) {

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

@@ -40,7 +40,8 @@ public class GoodsSettle extends TscBaseDomain {
 	private String itemCd;				// 단품코드
 	private String optCd1;				// 옵션코드1
 	private String optCd2;				// 옵션코드2
-	private int sellPrice;				// 판매가
+	private int mallPrice;				// 몰판매가
+	private int sellPrice;				// 판매가(정산용)
 	private int sellQty;				// 판매수량
 	private double sellAmt;				// 판매금액(CPN1_DC_AMT가 빠진 금액이 들어가 있음)
 	private double cpn1DcAmt;			// 즉시사용쿠폰금액

+ 61 - 0
src/main/java/com/style24/persistence/domain/SettleConfirm.java

@@ -0,0 +1,61 @@
+package com.style24.persistence.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 정산확정 Domain
+ *
+ * @author gagamel
+ * @since 2021. 7. 26
+ */
+@SuppressWarnings("serial")
+@Data
+public class SettleConfirm extends TscBaseDomain {
+
+	private String usacYm;				// 정산연월
+	private String supplyCompCd;		// 공급업체코드
+	private String supplyCompNm;		// 공급업체명
+	private String econtractYn;			// 전자계약여부
+	private String bizNo;				// 사업자번호
+	private String settleDay;			// 정산일(매월)
+	private String settleDayNm;			// 정산주기명
+	private int sellQty;				// 판매수량
+	private double sellAmt;				// 판매금액(CPN1_DC_AMT가 빠진 금액이 들어가 있음)
+	private double sellFeeAmt;			// 수수료(실판매금액 * 판매수수료율)
+	private double cpnDcAmt;			// 쿠폰할인금액
+	private double selfCpnDcAmt;		// 자사쿠폰분담액
+	private double supplyCompCpnDcAmt;	// 입점쿠폰분담액
+	private double billAmt;				// 계산서발행금액
+	private double supplyAmt;			// 공급금액
+	private double taxAmt;				// 세액
+	private double delvFee;				// 배송비
+	private double etcDeductAmt;		// 기타차감
+	private double giveAmt;				// 지급금액
+	private double receivableAmt;		// 미수금
+	private double totGiveAmt;			// 총지급금액
+	private String settleStat;			// 정산상태
+	private String bankCd;				// 은행코드
+	private String bankNm;				// 은행명
+	private String accountNo;			// 계좌번호
+	private String depositorNm;			// 예금주명
+	private String billEmail;			// 계산서이메일
+
+	// 세금계산서용 엑셀
+	private String ownerNm;				// 대표자명
+	private String bizType;				// 업태
+	private String bizKind;				// 업종
+	private String bizAddr;				// 사업장주소
+	private String settleChargeNm;		// 정산담당자명
+	private String settleChargeTelno;	// 정산담당자연락처
+	private String billType;			// 계산서유형
+
+	// 검색조건
+	private String settleYm;			// 정산연월
+	private String supplyCompList;		// 공급업체코드목록
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiSupplyComp;
+
+}

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

@@ -77,6 +77,9 @@ public class Social extends TscBaseDomain{
 		// 검색
 		private String stDate;	// 시작일시
 		private String edDate;	// 종료일시
+
+		// 핫딜 즉시적용시 사용
+		private String immediatelyApplyYn;
 		
 		
 		// Pagination

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

@@ -71,6 +71,7 @@ public class WithdrawExc extends TscBaseDomain {
 	private String recallStatNm;
 	private String statNm;
 	private String wdBfSendYn;
+	private String Ifstat;
 	
 	private int chargeAmount;          // 요금총액
 	private int exceptionQty;          // 수량

+ 48 - 7
src/main/java/com/style24/persistence/mybatis/shop/TsaBusiness.xml

@@ -1101,8 +1101,15 @@
 	</select>
 	
 	<!-- 브랜드 그룹 등록 -->
-	<insert id="createBrandGroup" parameterType="BrandGroup" >
+	<insert id="createBrandGroup" parameterType="BrandGroup">
 		/* TsaBusiness.createBrandGroup */
+		<selectKey keyProperty="brandGroupNo" resultType="String" order="BEFORE">
+			SELECT CASE WHEN MAX(BRAND_GROUP_NO) IS NULL THEN 30000
+			ELSE (MAX(BRAND_GROUP_NO) + 1) END
+			FROM   TB_BRAND_GROUP Z
+			WHERE  1 = 1
+			AND BRAND_GROUP_NO > 29999
+		</selectKey>
 		INSERT INTO TB_BRAND_GROUP (
 		       BRAND_GROUP_NO
 		     , BRAND_GROUP_ENM
@@ -1119,12 +1126,7 @@
 		     , UPD_DT
 		)
 		VALUES (
-		       (SELECT CASE WHEN MAX(BRAND_GROUP_NO) IS NULL THEN 30000
-		               ELSE (MAX(BRAND_GROUP_NO) + 1) END
-		        FROM   TB_BRAND_GROUP Z
-		        WHERE  1 = 1
-		        AND BRAND_GROUP_NO > 29999
-		       ) 
+		       #{brandGroupNo}
 		     , #{brandGroupEnm}
 		     , #{brandGroupKnm}
 		     , #{dispNmLang}
@@ -1261,4 +1263,43 @@
 		    REG_DT = NOW()
 	</insert>
 
+	<!-- 브랜드그룹 신규생성시 메인레이아웃 등록 -->
+	<insert id="createBrandGroupMainLayout" parameterType="BrandGroup">
+		/*  TsaBusiness.createBrandGroupMainLayout */
+		INSERT INTO  TB_MAIN_LAYOUT (
+		    CATE_NO
+		  , CONTENTS_LOC
+		  , BRAND_GROUP_NO
+		  , DISP_ORD
+		  , CONTENTS_YN
+		  , COL_CNT
+		  , COL_NO
+		  , CONTENTS_TITLE
+		  , REG_NO
+		  , REG_DT
+		  , UPD_NO
+		  , UPD_DT
+		)
+		SELECT '1711' AS CATE_NO
+		     , CD AS CONTENTS_LOC
+		     , #{brandGroupNo} AS BRAND_GROUP_NO
+		     , ROW_NUMBER() OVER () AS DISP_ORD
+		     , CD_DESC AS CONTENTS_YN
+		     , 1 AS COL_CNT
+		     , 1 AS COL_NO
+		     , CASE WHEN CD = 'SBM007' THEN '신상품'
+		            WHEN CD = 'SBM008' THEN '베스트'
+		            WHEN CD = 'SBM009' THEN 'MD추천'
+		            WHEN CD = 'SBM010' THEN '룩북' ELSE '' END CONTENTS_TITLE
+		     , #{regNo} AS REG_NO
+		     , NOW() AS REG_DT
+		     , #{updNo}
+			 , NOW() AS UPD_DT
+		FROM TB_COMMON_CODE
+		WHERE CD_GB = 'G028'
+		  AND USE_YN = 'Y'
+		  AND SUBSTRING(CD,1,3) = 'SBM'
+		  AND CD NOT IN ('SBM014','SBM015','SBM016','SBM017','SBM018','SBM019')
+		ORDER BY DISP_ORD
+	</insert>
 </mapper>

+ 15 - 9
src/main/java/com/style24/persistence/mybatis/shop/TsaDsiplay.xml

@@ -1770,6 +1770,9 @@
 		AND CATE_NO = #{cateNo}
 		</if>
 		AND CONTENTS_LOC = #{contentsLoc}
+		<if test="brandGroupNo != null and brandGroupNo != ''">
+		AND BRAND_GROUP_NO = #{brandGroupNo}
+		</if>
 		AND CONTENTS_SQ = #{contentsSq}
 	</delete>
 
@@ -1900,17 +1903,17 @@
 		              , DISP_STDT
 		              , DISP_EDDT
 		              , CASE WHEN STR_TITLE2 = 1 THEN TITLE END AS GROUP1_TITLE
-		              , CASE WHEN STR_TITLE2 = 1 THEN GROUP_CONCAT(CASE WHEN BRAND_GROUP_NO IS NULL THEN '' ELSE BRAND_GROUP_NO END SEPARATOR ',') END GROUP1_BRAND_CD
-		              , CASE WHEN STR_TITLE2 = 1 THEN GROUP_CONCAT(CASE WHEN BRAND_GROUP_NM IS NULL THEN '' ELSE BRAND_GROUP_NM END SEPARATOR ',') END GROUP1_BRAND_NM
-		              , CASE WHEN STR_TITLE2 = 1 THEN GROUP_CONCAT(CASE WHEN LOGO_FILE_NM IS NULL THEN '' ELSE LOGO_FILE_NM END SEPARATOR ',') END GROUP1_BRAND_IMG
+		              , CASE WHEN STR_TITLE2 = 1 THEN GROUP_CONCAT(CASE WHEN BRAND_GROUP_NO IS NULL THEN '' ELSE BRAND_GROUP_NO END ORDER BY DISP_ORD SEPARATOR ',') END GROUP1_BRAND_CD
+		              , CASE WHEN STR_TITLE2 = 1 THEN GROUP_CONCAT(CASE WHEN BRAND_GROUP_NM IS NULL THEN '' ELSE BRAND_GROUP_NM END ORDER BY DISP_ORD SEPARATOR ',') END GROUP1_BRAND_NM
+		              , CASE WHEN STR_TITLE2 = 1 THEN GROUP_CONCAT(CASE WHEN LOGO_FILE_NM IS NULL THEN '' ELSE LOGO_FILE_NM END ORDER BY DISP_ORD SEPARATOR ',') END GROUP1_BRAND_IMG
 		              , CASE WHEN STR_TITLE2 = 2 THEN TITLE END AS GROUP2_TITLE
-		              , CASE WHEN STR_TITLE2 = 2 THEN GROUP_CONCAT(CASE WHEN BRAND_GROUP_NO IS NULL THEN '' ELSE BRAND_GROUP_NO END SEPARATOR ',') END GROUP2_BRAND_CD
-		              , CASE WHEN STR_TITLE2 = 2 THEN GROUP_CONCAT(CASE WHEN BRAND_GROUP_NM IS NULL THEN '' ELSE BRAND_GROUP_NM END SEPARATOR ',') END GROUP2_BRAND_NM
-		              , CASE WHEN STR_TITLE2 = 2 THEN GROUP_CONCAT(CASE WHEN LOGO_FILE_NM IS NULL THEN '' ELSE LOGO_FILE_NM END SEPARATOR ',') END GROUP2_BRAND_IMG
+		              , CASE WHEN STR_TITLE2 = 2 THEN GROUP_CONCAT(CASE WHEN BRAND_GROUP_NO IS NULL THEN '' ELSE BRAND_GROUP_NO END ORDER BY DISP_ORD SEPARATOR ',') END GROUP2_BRAND_CD
+		              , CASE WHEN STR_TITLE2 = 2 THEN GROUP_CONCAT(CASE WHEN BRAND_GROUP_NM IS NULL THEN '' ELSE BRAND_GROUP_NM END ORDER BY DISP_ORD SEPARATOR ',') END GROUP2_BRAND_NM
+		              , CASE WHEN STR_TITLE2 = 2 THEN GROUP_CONCAT(CASE WHEN LOGO_FILE_NM IS NULL THEN '' ELSE LOGO_FILE_NM END ORDER BY DISP_ORD SEPARATOR ',') END GROUP2_BRAND_IMG
 		              , CASE WHEN STR_TITLE2 = 3 THEN TITLE END AS GROUP3_TITLE
-		              , CASE WHEN STR_TITLE2 = 3 THEN GROUP_CONCAT(CASE WHEN BRAND_GROUP_NO IS NULL THEN '' ELSE BRAND_GROUP_NO END SEPARATOR ',') END GROUP3_BRAND_CD
-		              , CASE WHEN STR_TITLE2 = 3 THEN GROUP_CONCAT(CASE WHEN BRAND_GROUP_NM IS NULL THEN '' ELSE BRAND_GROUP_NM END SEPARATOR ',') END GROUP3_BRAND_NM
-		              , CASE WHEN STR_TITLE2 = 3 THEN GROUP_CONCAT(CASE WHEN LOGO_FILE_NM IS NULL THEN '' ELSE LOGO_FILE_NM END SEPARATOR ',') END GROUP3_BRAND_IMG
+		              , CASE WHEN STR_TITLE2 = 3 THEN GROUP_CONCAT(CASE WHEN BRAND_GROUP_NO IS NULL THEN '' ELSE BRAND_GROUP_NO END ORDER BY DISP_ORD SEPARATOR ',') END GROUP3_BRAND_CD
+		              , CASE WHEN STR_TITLE2 = 3 THEN GROUP_CONCAT(CASE WHEN BRAND_GROUP_NM IS NULL THEN '' ELSE BRAND_GROUP_NM END ORDER BY DISP_ORD SEPARATOR ',') END GROUP3_BRAND_NM
+		              , CASE WHEN STR_TITLE2 = 3 THEN GROUP_CONCAT(CASE WHEN LOGO_FILE_NM IS NULL THEN '' ELSE LOGO_FILE_NM END ORDER BY DISP_ORD SEPARATOR ',') END GROUP3_BRAND_IMG
 		        FROM (
 		            SELECT
 		                  B.STR_TITLE3
@@ -2098,6 +2101,9 @@
 		AND CG.CATE_NO = #{cateNo}
 		</if>
 		AND CG.CONTENTS_LOC = #{contentsLoc}
+		<if test="brandGroupNo != null and brandGroupNo !=''">
+		AND  CG.BRAND_GROUP_NO = #{brandGroupNo}
+		</if>
 		AND CG.CONTENTS_SQ = #{dispOrd}
 		ORDER BY CG.BRAND_GROUP_NO , CG.CATE_NO ,CG.LEAF_CATE_NO ,CG.CONTENTS_LOC ,CG.PRE_CONTENTS_SQ , CG.CONTENTS_SQ , CG.DISP_ORD
 	</select>

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

@@ -1275,6 +1275,16 @@
 		</if>
 		<if test="newCustOrdYn != null and newCustOrdYn != ''" >
 		    , NEW_CUST_ORD_YN = #{newCustOrdYn}
+		    <choose>
+		    <when test='newCustOrdYn == "Y"'> 
+		    , NEW_CUST_ORD_STDT = STR_TO_DATE(#{newCustOrdStdt},'%Y%m%d%H%i%S')
+		    , NEW_CUST_ORD_EDDT = STR_TO_DATE(#{newCustOrdEddt},'%Y%m%d%H%i%S')
+		    </when>
+		    <otherwise>
+		    , NEW_CUST_ORD_STDT = NULL
+		    , NEW_CUST_ORD_EDDT = NULL
+		    </otherwise>
+		    </choose>
 		</if>
 		<if test='procJob == "minOrdAmt"  and minOrdAmt != null and minOrdAmt != ""' >
 		    , MIN_ORD_AMT = #{minOrdAmt}

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

@@ -410,7 +410,7 @@
 		   AND GC.COMPS_GOODS_CD = #{compsGoodsCd}
 		 INNER JOIN TB_OPTION                    OP
 		    ON IFNULL(GC.COMPS_GOODS_CD, G.GOODS_CD) = OP.GOODS_CD
-		   AND OP.OPT_CD2 = #{optCd}
+		   AND OP.OPT_CD = #{optCd}
 		 WHERE OD.ORD_DTL_NO = #{ordDtlNo}
 	</insert>
 	

+ 10 - 6
src/main/java/com/style24/persistence/mybatis/shop/TsaPlan.xml

@@ -192,14 +192,18 @@
 		<if test="planGb != null and planGb != ''">
 		AND    PLAN_GB = #{planGb}
 		</if>
-		<if test="stDate != null and stDate != '' and edDate != null and edDate != ''">
-        AND    DISP_STDT <![CDATA[ >= ]]> DATE_FORMAT(#{stDate},'%Y-%m-%d %H:%i:%S')
-        AND    DISP_STDT <![CDATA[ <= ]]> DATE_FORMAT(#{edDate},'%Y-%m-%d %H:%i:%S')
+		<if test="stDate != null and stDate != ''">
+		AND    DISP_EDDT <![CDATA[ >= ]]> DATE_FORMAT(concat(#{stDate}, ' 00:00:00'),'%Y-%m-%d %H:%i:%S')
 		</if>
-		<if test="popupDispStdt != null and popupDispStdt != '' and popupDispEddt != null and popupDispEddt != ''">
-		AND    DISP_STDT <![CDATA[>=]]> DATE_FORMAT(#{popupDispStdt}, '%Y-%m-%d %H:%i:%S')
-		AND    DISP_STDT <![CDATA[<=]]> DATE_FORMAT(#{popupDispEddt}, '%Y-%m-%d %H:%i:%S')
+		<if test="edDate != null and edDate != ''">
+		AND    DISP_STDT <![CDATA[ <= ]]> DATE_FORMAT(concat(#{edDate}, ' 23:59:59') ,'%Y-%m-%d %H:%i:%S')
 		</if>
+		<if test="popupDispStdt != null and popupDispStdt != ''">
+		AND    DISP_EDDT <![CDATA[ >= ]]> DATE_FORMAT(concat(#{popupDispStdt}, ' 00:00:00'),'%Y-%m-%d %H:%i:%S')
+		</if>
+		<if test="popupDispEddt != null and popupDispEddt != ''">
+		AND    DISP_STDT <![CDATA[ <= ]]> DATE_FORMAT(concat(#{popupDispEddt}, ' 23:59:59') ,'%Y-%m-%d %H:%i:%S')
+		</if>	
 	</sql>
 	
 	<sql id="getListPagingCondition_sql">

+ 295 - 2
src/main/java/com/style24/persistence/mybatis/shop/TsaSettle.xml

@@ -30,6 +30,7 @@
 		     , ODIH.ITEM_CD                                                        /*단품코드*/
 		     , ODIH.OPT_CD1                                                        /*옵션코드1*/
 		     , ODIH.OPT_CD2                                                        /*옵션코드2*/
+		     , ODIH.MALL_PRICE                                                     /*몰판매가*/
 		     , ODIH.SELL_PRICE                                                     /*판매가*/
 		     , ODIH.SELL_QTY                                                       /*판매수량*/
 		     , ODIH.SELL_AMT                                                       /*판매금액(ORD_AMT에는 CPN1_DC_AMT가 빠진 금액이 들어가 있음)*/
@@ -96,7 +97,12 @@
 		             , ODIH.ITEM_CD                                                                       /*단품코드*/
 		             , ODIH.OPT_CD1                                                                       /*옵션코드1*/
 		             , ODIH.OPT_CD2                                                                       /*옵션코드2*/
-		             , ODIH.ITEM_PRICE                                          AS SELL_PRICE             /*판매가*/
+		             , ODIH.ITEM_PRICE                                          AS MALL_PRICE             /*몰판매가*/
+		             , CASE WHEN O.MALL_GB = 'G011_20' /*제휴몰*/ THEN
+		                        IFNULL(EUP.USAC_PRICE,ODIH.ITEM_PRICE)
+		                    ELSE
+		                        ODIH.ITEM_PRICE
+		               END                                                      AS SELL_PRICE             /*판매가(정산용)*/
 		             , (CASE WHEN ODIH.ORD_DTL_STAT = 'G720_20' THEN 1 ELSE -1 END)
 		               *
 		               CAST(CASE WHEN ODIH.ORD_DTL_STAT = 'G720_20'/*판매-배송중*/ THEN
@@ -124,7 +130,7 @@
 		               + (IFNULL(CB2.BURDEN_RATE,0) / 100) * ODIH.GOODS_CPN_DC_AMT
 		               + (IFNULL(CB3.BURDEN_RATE,0) / 100) * ODIH.CART_CPN_DC_AMT         AS SUPPLY_COMP_CPN_DC_AMT /*입점쿠폰분담액*/
 		             , CASE WHEN O.MALL_GB = 'G011_10' /*자사몰*/ THEN
-		                        SC.SELL_FEE_RATE
+		                        OD.SELL_FEE_RATE
 		                    ELSE /*제휴몰*/
 		                        IFNULL(E.SELL_FEE_RATE,0)
 		               END                                                      AS SELL_FEE_RATE          /*판매수수료율*/
@@ -141,6 +147,7 @@
 		                                            AND OD.SUPPLY_COMP_CD = CB1.SUPPLY_COMP_CD
 		        LEFT OUTER JOIN TB_COUPON_BURDEN CB3 ON OD.CART_CPN_SQ = CB1.CPN_ID
 		                                            AND OD.SUPPLY_COMP_CD = CB1.SUPPLY_COMP_CD
+		        LEFT OUTER JOIN TB_EXTMALL_USAC_PRICE EUP ON ODIH.ORD_DTL_ITEM_HST_SQ = EUP.ORD_DTL_ITEM_HST_SQ
 		        WHERE  1 = 1
 		        AND    ODIH.REG_DT <![CDATA[>=]]> STR_TO_DATE(#{salesStdt},'%Y-%m-%d')
 		        AND    ODIH.REG_DT <![CDATA[<]]> DATE_ADD(STR_TO_DATE(#{salesEddt},'%Y-%m-%d'), INTERVAL 1 DAY)
@@ -170,6 +177,198 @@
 		ORDER  BY ODIH.ORD_DTL_ITEM_HST_SQ
 	</select>
 	
+	<!-- 정산확정 데이터 삭제 -->
+	<delete id="deleteSettleConfirm" parameterType="String">
+		/* TsaSettle.deleteSettleConfirm */
+		DELETE FROM TB_USAC
+		WHERE  USAC_YM = REPLACE(#{settleYm},'-','')
+	</delete>
+	
+	<!-- 정산확정 데이터 생성 -->
+	<insert id="createSettleConfirm" parameterType="SettleConfirm">
+		/* TsaSettle.createSettleConfirm */
+		INSERT INTO TB_USAC (
+		       USAC_YM
+		     , SUPPLY_COMP_CD
+		     , ECONTRACT_YN
+		     , DISTRIBUTION_GB
+		     , SETTLE_DAY
+		     , SELL_QTY
+		     , REAL_SELL_AMT
+		     , SELL_FEE_AMT
+		     , CPN_DC_AMT
+		     , SELF_CPN_DC_AMT
+		     , SUPPLY_COMP_CPN_DC_AMT
+		     , TMTB_DC_AMT
+		     , BILL_AMT
+		     , SUPPLY_AMT
+		     , TAX_AMT
+		     , DELV_FEE
+		     , BANK_CD
+		     , ACCOUNT_NO
+		     , DEPOSITOR_NM
+		     , BILL_EMAIL
+		     , REG_NO
+		     , REG_DT
+		)
+		SELECT ODIH.USAC_YM                                                      /*정산연월*/
+		     , ODIH.SUPPLY_COMP_CD                                               /*공급업체코드*/
+		     , SC.ECONTRACT_YN                                                   /*전자계약여부*/
+		     , SC.DISTRIBUTION_GB                                                /*유통구분*/
+		     , SC.SETTLE_DAY                                                     /*정산주기*/
+		     , SUM(ODIH.SELL_QTY)                      AS SELL_QTY               /*판매수량*/
+		     , SUM(ODIH.REAL_SELL_AMT)                 AS REAL_SELL_AMT          /*실판매금액(=상품총액)*/
+		     , SUM(ODIH.SELL_FEE_AMT)                  AS SELL_FEE_AMT           /*수수료*/
+		     , SUM(ODIH.CPN_DC_AMT)                    AS CPN_DC_AMT             /*쿠폰할인금액*/
+		     , SUM(ODIH.SELF_CPN_DC_AMT)               AS SELF_CPN_DC_AMT        /*자사쿠폰분담액*/
+		     , SUM(ODIH.SUPPLY_COMP_CPN_DC_AMT)        AS SUPPLY_COMP_CPN_DC_AMT /*입점쿠폰분담액*/
+		     , SUM(ODIH.TMTB_DC_AMT)                   AS TMTB_DC_AMT            /*다다익선할인금액*/
+		     , SUM(CASE WHEN ODIH.SELL_FEE_AMT - ODIH.SELF_CPN_DC_AMT <![CDATA[<]]> 0 THEN 0
+		                ELSE ODIH.SELL_FEE_AMT - ODIH.SELF_CPN_DC_AMT
+		           END)                                AS BILL_AMT               /*계산서발행금액*/
+		     , TRUNCATE(SUM(CASE WHEN ODIH.SELL_FEE_AMT - ODIH.SELF_CPN_DC_AMT <![CDATA[<]]> 0 THEN 0
+		                         ELSE ODIH.SELL_FEE_AMT - ODIH.SELF_CPN_DC_AMT
+		                    END) / 1.1,0)              AS SUPPLY_AMT             /*공급가액*/
+		     , SUM(CASE WHEN ODIH.SELL_FEE_AMT - ODIH.SELF_CPN_DC_AMT <![CDATA[<]]> 0 THEN 0
+		                ELSE ODIH.SELL_FEE_AMT - ODIH.SELF_CPN_DC_AMT
+		           END) - (TRUNCATE(SUM(CASE WHEN ODIH.SELL_FEE_AMT - ODIH.SELF_CPN_DC_AMT <![CDATA[<]]> 0 THEN 0
+		                                     ELSE ODIH.SELL_FEE_AMT - ODIH.SELF_CPN_DC_AMT
+		                                END) / 1.1,0)) AS TAX_AMT                /*세액*/
+		     , SUM(ODIH.DELV_FEE)                      AS DELV_FEE               /*배송비*/
+		     , SC.BANK_CD                                                        /*은행코드*/
+		     , SC.ACCOUNT_NO                                                     /*계좌번호*/
+		     , SC.DEPOSITOR_NM                                                   /*예금주명*/
+		     , SC.BILL_EMAIL                                                     /*세금계산서이메일*/
+		     , #{regNo}                                AS REG_NO
+		     , NOW()                                   AS REG_DT
+		FROM   (
+		        SELECT DATE_FORMAT(ODIH.OCCUR_DT,'%Y%m')            AS USAC_YM                /*정산연월*/
+		             , ODIH.SUPPLY_COMP_CD                                                    /*공급업체코드*/
+		             , SUM(ODIH.SELL_QTY)                           AS SELL_QTY               /*판매수량*/
+		             , SUM(ODIH.SELL_AMT
+		                   - (ODIH.CPN1_DC_AMT + ODIH.GOODS_CPN_DC_AMT + ODIH.CART_CPN_DC_AMT)
+		                   - ODIH.TMTB_DC_AMT)                      AS REAL_SELL_AMT /*실판매금액(=상품총액. 쿠폰과 다다익선만 차감. 상품권과 포인트는 포함)*/
+		             , ROUND(SUM((ODIH.SELL_AMT
+		                          - (ODIH.CPN1_DC_AMT + ODIH.GOODS_CPN_DC_AMT + ODIH.CART_CPN_DC_AMT)
+		                          - ODIH.TMTB_DC_AMT
+		                         ) * (ODIH.SELL_FEE_RATE / 100)),0) AS SELL_FEE_AMT           /*수수료*/
+		             , SUM(ODIH.CPN1_DC_AMT +
+		                   ODIH.GOODS_CPN_DC_AMT +
+		                   ODIH.CART_CPN_DC_AMT)                    AS CPN_DC_AMT             /*쿠폰할인금액*/
+		             , SUM(ODIH.SELF_CPN_DC_AMT)                    AS SELF_CPN_DC_AMT        /*자사쿠폰분담액*/
+		             , SUM(ODIH.SUPPLY_COMP_CPN_DC_AMT)             AS SUPPLY_COMP_CPN_DC_AMT /*입점쿠폰분담액*/
+		             , SUM(ODIH.TMTB_DC_AMT)                        AS TMTB_DC_AMT            /*다다익선할인금액*/
+		             , 0                                            AS DELV_FEE               /*배송비*/
+		        FROM   (
+		                SELECT ODIH.REG_DT                                                        AS OCCUR_DT               /*발생일시*/
+		                     , OD.SUPPLY_COMP_CD                                                                            /*공급업체코드*/
+		                     , (CASE WHEN ODIH.ORD_DTL_STAT = 'G720_20' THEN 1 ELSE -1 END)
+		                       *
+		                       CAST(CASE WHEN ODIH.ORD_DTL_STAT = 'G720_20'/*판매-배송중*/ THEN
+		                                     ODIH.ORD_QTY - ODIH.CNCL_RTN_QTY
+		                                 ELSE /*환입-반품완료,환입-교환완료*/
+		                                     ODIH.CNCL_RTN_QTY
+		                            END AS SIGNED INT)                                            AS SELL_QTY               /*판매수량*/
+		                     , (CASE WHEN ODIH.ORD_DTL_STAT = 'G720_20' THEN 1 ELSE -1 END)
+		                       *
+		                       CAST(CASE WHEN ODIH.ORD_DTL_STAT = 'G720_20'/*판매-배송중*/ THEN
+		                                     ((ODIH.ORD_QTY - ODIH.CNCL_RTN_QTY) * (CASE WHEN O.MALL_GB = 'G011_20' /*제휴몰*/ THEN
+		                                                                                     IFNULL(EUP.USAC_PRICE,ODIH.ITEM_PRICE)
+		                                                                                 ELSE
+		                                                                                     ODIH.ITEM_PRICE
+		                                                                            END))
+		                                     + ODIH.CPN1_DC_AMT
+		                                 ELSE /*환입-반품완료,환입-교환완료*/
+		                                     (ODIH.CNCL_RTN_QTY * (CASE WHEN O.MALL_GB = 'G011_20' /*제휴몰*/ THEN
+		                                                                    IFNULL(EUP.USAC_PRICE,ODIH.ITEM_PRICE)
+		                                                                ELSE
+		                                                                    ODIH.ITEM_PRICE
+		                                                           END))
+		                                     + ODIH.CPN1_DC_AMT
+		                            END AS SIGNED INT)                                            AS SELL_AMT               /*판매금액(ORD_AMT에는 CPN1_DC_AMT가 빠진 금액이 들어가 있음)*/
+		                     , ODIH.CPN1_DC_AMT                                                                             /*즉시사용쿠폰금액*/
+		                     , ODIH.GOODS_CPN_DC_AMT                                                                        /*상품쿠폰사용금액*/
+		                     , ODIH.CART_CPN_DC_AMT                                                                         /*주문서쿠폰사용금액*/
+		                     , ODIH.PNT_DC_AMT                                                                              /*포인트사용금액*/
+		                     , ODIH.TMTB1_DC_AMT + ODIH.TMTB2_DC_AMT                              AS TMTB_DC_AMT            /*다다익선할인금액*/
+		                     , ((100 - IFNULL(CB1.BURDEN_RATE,0)) / 100) * ODIH.CPN1_DC_AMT
+		                       + ((100 - IFNULL(CB2.BURDEN_RATE,0)) / 100) * ODIH.GOODS_CPN_DC_AMT
+		                       + ((100 - IFNULL(CB3.BURDEN_RATE,0)) / 100) * ODIH.CART_CPN_DC_AMT AS SELF_CPN_DC_AMT        /*자사쿠폰분담액*/
+		                     , (IFNULL(CB1.BURDEN_RATE,0) / 100) * ODIH.CPN1_DC_AMT
+		                       + (IFNULL(CB2.BURDEN_RATE,0) / 100) * ODIH.GOODS_CPN_DC_AMT
+		                       + (IFNULL(CB3.BURDEN_RATE,0) / 100) * ODIH.CART_CPN_DC_AMT         AS SUPPLY_COMP_CPN_DC_AMT /*입점쿠폰분담액*/
+		                     , CASE WHEN O.MALL_GB = 'G011_10' /*자사몰*/ THEN
+		                                OD.SELL_FEE_RATE
+		                            ELSE /*제휴몰*/
+		                                IFNULL(E.SELL_FEE_RATE,0)
+		                       END                                                                AS SELL_FEE_RATE          /*판매수수료율*/
+		                FROM   TB_ORDER_DETAIL_ITEM_HST ODIH
+		                INNER JOIN TB_ORDER_DETAIL OD ON ODIH.ORD_DTL_NO = OD.ORD_DTL_NO
+		                INNER JOIN TB_ORDER O ON ODIH.ORD_NO = O.ORD_NO
+		                LEFT OUTER JOIN TB_EXTMALL E ON OD.EXTMALL_ID = E.EXTMALL_ID
+		                LEFT OUTER JOIN TB_COUPON_BURDEN CB1 ON OD.CPN1_CPN_SQ = CB1.CPN_ID
+		                                                    AND OD.SUPPLY_COMP_CD = CB1.SUPPLY_COMP_CD
+		                LEFT OUTER JOIN TB_COUPON_BURDEN CB2 ON OD.GOODS_CPN_SQ = CB1.CPN_ID
+		                                                    AND OD.SUPPLY_COMP_CD = CB1.SUPPLY_COMP_CD
+		                LEFT OUTER JOIN TB_COUPON_BURDEN CB3 ON OD.CART_CPN_SQ = CB1.CPN_ID
+		                                                    AND OD.SUPPLY_COMP_CD = CB1.SUPPLY_COMP_CD
+		                LEFT OUTER JOIN TB_EXTMALL_USAC_PRICE EUP ON ODIH.ORD_DTL_ITEM_HST_SQ = EUP.ORD_DTL_ITEM_HST_SQ
+		                WHERE  1 = 1
+		                AND    ODIH.REG_DT <![CDATA[>=]]> STR_TO_DATE(CONCAT(#{settleYm},'-01'),'%Y-%m-%d')
+		                AND    ODIH.REG_DT <![CDATA[<]]> DATE_ADD(STR_TO_DATE(CONCAT(#{settleYm},'-01'),'%Y-%m-%d'), INTERVAL 1 MONTH)
+		                AND    ODIH.ORD_DTL_STAT IN ('G720_20','G720_50','G720_60') /*판매-배송중,환입-반품완료,환입-교환완료*/
+		               ) ODIH
+		        GROUP  BY DATE_FORMAT(ODIH.OCCUR_DT,'%Y%m')
+		                , ODIH.SUPPLY_COMP_CD
+		        
+		        UNION ALL
+		        
+		        /*업체별배송비*/
+		        SELECT DATE_FORMAT(OD.OCCUR_DT,'%Y%m') AS USAC_YM                /*정산연월*/
+		             , OD.SUPPLY_COMP_CD                                         /*공급업체코드*/
+		             , 0                               AS SELL_QTY               /*판매수량*/
+		             , 0                               AS REAL_SELL_AMT          /*실판매금액(=상품총액. 쿠폰과 다다익선만 차감. 상품권과 포인트는 포함)*/
+		             , 0                               AS SELL_FEE_AMT           /*수수료*/
+		             , 0                               AS CPN_DC_AMT             /*쿠폰할인금액*/
+		             , 0                               AS SELF_CPN_DC_AMT        /*자사쿠폰분담액*/
+		             , 0                               AS SUPPLY_COMP_CPN_DC_AMT /*입점쿠폰분담액*/
+		             , 0                               AS TMTB_DC_AMT            /*다다익선할인금액*/
+		             , SUM(DF.DELV_FEE)                AS DELV_FEE               /*배송비*/
+		        FROM   (
+		                SELECT DISTINCT
+		                       ODIH.REG_DT       AS OCCUR_DT  /*발생일시*/
+		                     , OD.SUPPLY_COMP_CD              /*공급업체코드*/
+		                     , ODIH.ORD_NO                    /*주문번호*/
+		                     , ODIH.ORD_DTL_STAT AS SETTLE_GB /*정산구분*/
+		                FROM   TB_ORDER_DETAIL_ITEM_HST ODIH
+		                     , TB_ORDER_DETAIL OD
+		                     , TB_GOODS G
+		                WHERE  ODIH.ORD_DTL_NO = OD.ORD_DTL_NO
+		                AND    OD.GOODS_CD = G.GOODS_CD
+		                AND    ODIH.REG_DT <![CDATA[>=]]> STR_TO_DATE(CONCAT(#{settleYm},'-01'),'%Y-%m-%d')
+		                AND    ODIH.REG_DT <![CDATA[<]]> DATE_ADD(STR_TO_DATE(CONCAT(#{settleYm},'-01'),'%Y-%m-%d'), INTERVAL 1 MONTH)
+		                AND    ODIH.ORD_DTL_STAT IN ('G720_20','G720_50','G720_60') /*판매-배송중,환입-반품완료,환입-교환완료*/
+		               ) OD
+		             , TB_DELIVERY_FEE DF
+		        WHERE  OD.SUPPLY_COMP_CD = DF.SUPPLY_COMP_CD
+		        AND    OD.ORD_NO = DF.ORD_NO
+		        AND    OD.OCCUR_DT >= DF.REG_DT /*출고기준의 일자 보다 배송비 발생일자가 적은 넘만*/
+		        GROUP  BY DATE_FORMAT(OD.OCCUR_DT,'%Y%m')
+		                , OD.SUPPLY_COMP_CD
+		       ) ODIH
+		     , TB_SUPPLY_COMPANY SC
+		WHERE  ODIH.SUPPLY_COMP_CD = SC.SUPPLY_COMP_CD
+		GROUP  BY ODIH.USAC_YM
+		     , ODIH.SUPPLY_COMP_CD
+		     , SC.ECONTRACT_YN
+		     , SC.DISTRIBUTION_GB
+		     , SC.SETTLE_DAY
+		     , SC.BANK_CD
+		     , SC.ACCOUNT_NO
+		     , SC.DEPOSITOR_NM
+		     , SC.BILL_EMAIL
+	</insert>
+	
 	<!-- 배송비정산 목록 -->
 	<select id="getDeliveryFeeSettleList" parameterType="DelvFeeSettle" resultType="DelvFeeSettle">
 		/* TsaSettle.getDeliveryFeeSettleList */
@@ -226,6 +425,100 @@
 		ORDER  BY DATE_FORMAT(OD.OCCUR_DT,'%Y-%m-%d'), OD.SUPPLY_COMP_CD, DF.DELV_FEE_GB
 	</select>
 	
+	<!-- 정산확정 목록 -->
+	<select id="getSettleConfirmList" parameterType="SettleConfirm" resultType="SettleConfirm">
+		/* TsaSettle.getSettleConfirmList */
+		SELECT U.USAC_YM                                                                                                 /*정산연월*/
+		     , U.SUPPLY_COMP_CD                                                                                          /*공급업체코드*/
+		     , SC.SUPPLY_COMP_NM                                                                                         /*공급업체명*/
+		     , U.ECONTRACT_YN                                                                                            /*전자계약여부*/
+		     , SV.BIZ_NO                                                                                                 /*사업자번호*/
+		     , U.SETTLE_DAY                                                                                              /*정산주기*/
+		     , FN_GET_CODE_NM('G075',U.SETTLE_DAY)                                                     AS SETTLE_DAY_NM  /*정산주기명*/
+		     , U.SELL_QTY                                                                                                /*판매수량*/
+		     , U.REAL_SELL_AMT                                                                                           /*실판매금액(=상품총액)*/
+		     , U.SELL_FEE_AMT                                                                                            /*수수료*/
+		     , U.CPN_DC_AMT                                                                                              /*쿠폰할인금액*/
+		     , U.SELF_CPN_DC_AMT                                                                                         /*자사쿠폰분담액*/
+		     , U.SUPPLY_COMP_CPN_DC_AMT                                                                                  /*입점쿠폰분담액*/
+		     , U.TMTB_DC_AMT                                                                                             /*다다익선할인금액*/
+		     , U.BILL_AMT                                                                                                /*계산서발행금액*/
+		     , U.SUPPLY_AMT                                                                                              /*공급금액*/
+		     , U.TAX_AMT                                                                                                 /*세액*/
+		     , U.DELV_FEE                                                                                                /*배송비*/
+		     , IFNULL(UR2.ETC_DEDUCT_AMT,0)                                                            AS ETC_DEDUCT_AMT /*기타차감*/
+		     , U.BILL_AMT + U.DELV_FEE - IFNULL(UR2.ETC_DEDUCT_AMT,0)                                  AS GIVE_AMT       /*지급금액*/
+		     , IFNULL(UR1.RECEIVABLE_AMT,0)                                                            AS RECEIVABLE_AMT /*미수금*/
+		     , (U.BILL_AMT + U.DELV_FEE - IFNULL(UR2.ETC_DEDUCT_AMT,0)) - IFNULL(UR1.RECEIVABLE_AMT,0) AS TOT_GIVE_AMT   /*총지급금액*/
+		     , CASE WHEN U.ECONTRACT_YN = 'N' THEN '보류'
+		            ELSE
+		                CASE WHEN (U.BILL_AMT + U.DELV_FEE - IFNULL(UR2.ETC_DEDUCT_AMT,0)) <![CDATA[<]]> 0 THEN
+		                         '미수금'
+		                     ELSE
+		                         '정상'
+		                END
+		       END                                                                                     AS SETTLE_STAT    /*정산상태*/
+		     , U.BANK_CD                                                                                                 /*은행코드*/
+		     , FN_GET_CODE_NM('G940',U.BANK_CD)                                                        AS BANK_NM        /*은행명*/
+		     , U.ACCOUNT_NO                                                                                              /*계좌번호*/
+		     , U.DEPOSITOR_NM                                                                                            /*예금주명*/
+		     , U.BILL_EMAIL                                                                                              /*계산서이메일*/
+		FROM   TB_USAC U
+		INNER JOIN TB_SUPPLY_COMPANY SC ON U.SUPPLY_COMP_CD = SC.SUPPLY_COMP_CD
+		INNER JOIN TB_SUPPLY_VENDOR SV ON SC.SUPPLY_VENDOR_CD = SV.SUPPLY_VENDOR_CD
+		LEFT OUTER JOIN TB_USAC_RECEIVE UR1 ON U.USAC_YM = UR1.USAC_YM
+		                                   AND U.SUPPLY_COMP_CD = UR1.SUPPLY_COMP_CD
+		LEFT OUTER JOIN (
+		                 SELECT OCCUR_YM        AS USAC_YM
+		                      , SUPPLY_COMP_CD
+		                      , SUM(REWARD_AMT) AS ETC_DEDUCT_AMT
+		                 FROM   TB_USAC_REDUCT
+		                 WHERE  OCCUR_YM = REPLACE(#{settleYm},'-','')
+		                 GROUP  BY OCCUR_YM, SUPPLY_COMP_CD
+		                ) UR2 ON U.USAC_YM = UR2.USAC_YM
+		                     AND U.SUPPLY_COMP_CD = UR2.SUPPLY_COMP_CD
+		WHERE  U.USAC_YM = REPLACE(#{settleYm},'-','')
+		<if test="multiSupplyComp != null and multiSupplyComp != ''">
+		AND    U.SUPPLY_COMP_CD IN
+		    <foreach collection="multiSupplyComp" item="item" index="index"  open="(" close=")" separator=",">
+		    #{item}
+		    </foreach>
+		</if>
+	</select>
+	
+	<!-- 세금계산서용 정산 목록 -->
+	<select id="getTaxBillSettleList" parameterType="SettleConfirm" resultType="SettleConfirm">
+		/* TsaSettle.getTaxBillSettleList */
+		SELECT U.USAC_YM                                                            /*정산연월*/
+		     , SV.BIZ_NO                                                            /*사업자번호*/
+		     , U.SUPPLY_COMP_CD                                                     /*공급업체코드*/
+		     , SC.SUPPLY_COMP_NM                                                    /*공급업체명*/
+		     , SV.OWNER_NM                                                          /*대표자명*/
+		     , SV.BIZ_TYPE                                                          /*업태*/
+		     , SV.BIZ_KIND                                                          /*업종*/
+		     , CONCAT(SV.BIZ_BASE_ADDR,' ',IFNULL(SV.BIZ_DTL_ADDR,'')) AS BIZ_ADDR  /*사업장주소*/
+		     , SC.SETTLE_CHARGE_NM                                                  /*정산담당자명*/
+		     , SC.SETTLE_CHARGE_TELNO                                               /*정산담당자연락처*/
+		     , SC.BILL_EMAIL                                                        /*계산서이메일*/
+		     , '상품판매수수료'                                        AS BILL_TYPE /*계산서유형*/
+		     , U.SUPPLY_AMT                                                         /*공급가액*/
+		     , U.TAX_AMT                                                            /*세액*/
+		     , U.BILL_AMT                                                           /*계산서발행금액*/
+		FROM   (
+		        SELECT USAC_YM
+		             , SUPPLY_COMP_CD
+		             , SUM(BILL_AMT)  AS BILL_AMT
+		        FROM   TB_USAC
+		        WHERE  1 = 1
+		        AND    USAC_YM = REPLACE(#{settleYm},'-','')
+		        GROUP  BY USAC_YM, SUPPLY_COMP_CD
+		       ) U
+		     , TB_SUPPLY_VENDOR SV
+		     , TB_SUPPLY_COMPANY SC
+		WHERE  U.SUPPLY_COMP_CD = SC.SUPPLY_COMP_CD
+		AND    SV.SUPPLY_VENDOR_CD = SC.SUPPLY_VENDOR_CD
+	</select>
+	
 	<!-- 제휴채널정산 목록 -->
 	<select id="getAfLinkFeeList" parameterType="AfLinkFee" resultType="AfLinkFee">
 		/* TsaSettle.getAfLinkFeeList */

+ 10 - 7
src/main/java/com/style24/persistence/mybatis/shop/TsaShoplinker.xml

@@ -428,7 +428,8 @@
 		/* TsaShoplinker.getShoplinkerOrderListCount */
 		select count(1) from (
 			SELECT
-				A.*
+				ROW_NUMBER() OVER(PARTITION BY B.VENDOR_ID, B.EXTMALL_ID, B.AGENT_ORDER_ID, B.EXTMALL_ORDER_ID ORDER by B.UPLOAD_GB desc, B.UPLOAD_STAT) AS RANKING
+				, A.*
 				, B.VENDOR_ID
 				, B.EXTMALL_ID
 				, B.EXTMALL_NM
@@ -446,7 +447,7 @@
 			WHERE 1=1
 			<include refid="getSlkOrderListCondition_sql"/>
 		) A
-
+		WHERE RANKING = 1
 	</select>
 
 	<!-- 샵링커주문수집-목록 -->
@@ -455,7 +456,8 @@
 		SELECT * FROM
 		(
 			SELECT
-				A.*
+				ROW_NUMBER() OVER(PARTITION BY B.VENDOR_ID, B.EXTMALL_ID, B.AGENT_ORDER_ID, B.EXTMALL_ORDER_ID ORDER by B.UPLOAD_GB desc, B.UPLOAD_STAT) AS RANKING
+				, A.*
 				, B.VENDOR_ID
 				, B.EXTMALL_ID
 				, B.EXTMALL_NM
@@ -474,7 +476,7 @@
 
 			<include refid="getSlkOrderListCondition_sql"/>
 		) A
-
+		WHERE RANKING = 1
 		ORDER BY EXTMALL_REG_DT, REG_DT DESC
 		LIMIT #{pageable.limitStartRow} ,  #{pageable.pageSize}
 
@@ -571,7 +573,8 @@
 		SELECT * FROM
 		(
 			SELECT
-				A.*
+				ROW_NUMBER() OVER(PARTITION BY B.VENDOR_ID, B.EXTMALL_ID, B.AGENT_ORDER_ID, B.EXTMALL_ORDER_ID ORDER by B.UPLOAD_GB desc, B.UPLOAD_STAT) AS RANKING
+				, A.*
 				, B.VENDOR_ID
 				, B.EXTMALL_ID
 				, B.EXTMALL_NM
@@ -590,7 +593,7 @@
 
 			<include refid="getSlkOrderListCondition_sql"/>
 		) A
-
+		WHERE RANKING = 1
 		ORDER BY EXTMALL_REG_DT, REG_DT DESC
 
 	</select>
@@ -628,7 +631,7 @@
 	              </when>
 
 	              <when test='search != null and search == "mallOrderId"'>
-	              	AND UPPER(B.EXTMALL_ORDER_ID) IN
+	              	AND UPPER(A.MALL_ORDER_ID) IN
 			            <foreach collection="conditionList" item="item" index="index"  open="(" close=")" separator=",">
 			       		UPPER(#{item})
 			            </foreach>

+ 372 - 3
src/main/java/com/style24/persistence/mybatis/shop/TsaSocial.xml

@@ -251,9 +251,11 @@
 		<if test='frontGb != null and frontGb != "" and frontGb != "A"'>
 			AND (FRONT_GB = 'A' OR FRONT_GB = #{frontGb} )
 		</if>
-		<if test="stDate != null and stDate != '' and edDate != null and edDate != ''">
-        AND    SOCIAL_STDT <![CDATA[ >= ]]> DATE_FORMAT(#{stDate},'%Y-%m-%d %H:%i:%S')
-        AND    SOCIAL_EDDT <![CDATA[ <= ]]> DATE_FORMAT(#{stDate},'%Y-%m-%d %H:%i:%S')
+		<if test="stDate != null and stDate != ''">
+		AND    SOCIAL_EDDT <![CDATA[ >= ]]> DATE_FORMAT(concat(#{stDate}, ' 00:00:00'),'%Y-%m-%d %H:%i:%S')
+		</if>
+		<if test="edDate != null and edDate != ''">
+		AND    SOCIAL_STDT <![CDATA[ <= ]]> DATE_FORMAT(concat(#{edDate}, ' 23:59:59') ,'%Y-%m-%d %H:%i:%S')
 		</if>
 	</sql>
 
@@ -271,4 +273,371 @@
 		</choose>
 	</sql>
 
+	<!-- 진행중인 상품 종료처리 : 소셜상품 가격정보 원복(before) 업데이트 -->
+	<update id="updateGoodsBeforePriceInfo" parameterType="Social">
+		/* TsaSocial.updateGoodsBeforePriceInfo */
+		UPDATE TB_GOODS A
+			INNER JOIN TB_SOCIAL_GOODS B ON A.GOODS_CD = B.GOODS_CD
+			INNER JOIN TB_SOCIAL C ON B.SOCIAL_SQ = C.SOCIAL_SQ
+		SET A.GOODS_CD = B.GOODS_CD ,
+			A.CURR_PRICE = B.CURR_BPRICE,
+			A.DC_RATE = B.DC_BRATE,
+			A.UPD_DT = NOW(),
+			A.UPD_NO = #{updNo}
+		WHERE C.USE_YN = 'Y'
+		  AND C.APPLY_GB = 'A'
+		  AND B.DEL_YN = 'N'
+		  <if test="immediatelyApplyYn == null or immediatelyApplyYn == ''">
+		  AND C.SOCIAL_SQ = #{socialSq}
+		  </if>
+	</update>
+
+	<!-- 진행중인 상품 종료처리 : 원복(before) 상품 이력 생성 -->
+	<insert id="createBeforeGoodsHst" parameterType="Social">
+		/* TsaSocial.createBeforeGoodsHst */
+		INSERT INTO TB_GOODS_HST
+		(
+		    GOODS_CD
+		    , BRAND_CD
+		    , ITEMKIND_CD
+		    , GOODS_NM
+		    , GOODS_TNM
+		    , GOODS_SNM
+		    , GOODS_SNM1
+		    , MAIN_COLOR_CD
+		    , STYLE_YEAR
+		    , SEASON_CD
+		    , SEX_GB
+		    , GOODS_NUM
+		    , GOODS_TYPE
+		    , TAG_PRICE
+		    , LIST_PRICE
+		    , CURR_PRICE
+		    , CURR_BPRICE
+		    , PRICE_UPD_DT
+		    , COST_PRICE
+		    , DC_RATE
+		    , GOODS_STAT
+		    , SELL_STDT
+		    , SELL_EDDT
+		    , SELF_MALL_YN
+		    , GOODS_GB
+		    , FOREIGN_BUY_YN
+		    , PARALLEL_IMPORT_YN
+		    , ORDER_MADE_YN
+		    , DISTRIBUTION_GB
+		    , SELF_GOODS_YN
+		    , SUPPLY_COMP_CD
+		    , SUPPLY_GOODS_CD
+		    , AGE_GRP_CD
+		    , DELV_LOC_CD
+		    , DELV_FEE_CD
+		    , DELV_FEE
+		    , MIN_ORD_AMT
+		    , PNT_PRATE
+		    , PNT_MRATE
+		    , SELL_FEE_RATE
+		    , FORMAL_GB
+		    , CHANGEABLE_YN
+		    , RETURNABLE_YN
+		    , CHANGE_FEE_FREE_YN
+		    , RETURN_FEE_FREE_YN
+		    , PRE_PPNT_USABLE_YN
+		    , PRE_MPNT_USABLE_YN
+		    , MIN_ORD_QTY
+		    , MAX_ORD_QTY
+		    , DAY_MAX_ORD_QTY
+		    , GIFT_PACK_YN
+		    , FRST_CFRM_DT
+		    , ORIGIN_CD
+		    , MAKE_YMD
+		    , TAX_GB
+		    , ERP_PRICE_LINK_YN
+		    , ERP_STOCK_LINK_YN
+		    , NEW_CUST_ORD_YN
+		    , NEW_CUST_ORD_STDT
+		    , NEW_CUST_ORD_EDDT
+		    , ADULT_YN
+		    , TOBE_FORM_YN
+		    , REG_NO
+		    , REG_DT
+		    , UPD_NO
+		    , UPD_DT
+		)
+		SELECT GOODS_CD
+		     , BRAND_CD
+		     , ITEMKIND_CD
+		     , GOODS_NM
+		     , GOODS_TNM
+		     , GOODS_SNM
+		     , GOODS_SNM1
+		     , MAIN_COLOR_CD
+		     , STYLE_YEAR
+		     , SEASON_CD
+		     , SEX_GB
+		     , GOODS_NUM
+		     , GOODS_TYPE
+		     , TAG_PRICE
+		     , LIST_PRICE
+		     , CURR_PRICE
+		     , CURR_BPRICE
+		     , PRICE_UPD_DT
+		     , COST_PRICE
+		     , DC_RATE
+		     , GOODS_STAT
+		     , SELL_STDT
+		     , SELL_EDDT
+		     , SELF_MALL_YN
+		     , GOODS_GB
+		     , FOREIGN_BUY_YN
+		     , PARALLEL_IMPORT_YN
+		     , ORDER_MADE_YN
+		     , DISTRIBUTION_GB
+		     , SELF_GOODS_YN
+		     , SUPPLY_COMP_CD
+		     , SUPPLY_GOODS_CD
+		     , AGE_GRP_CD
+		     , DELV_LOC_CD
+		     , DELV_FEE_CD
+		     , DELV_FEE
+		     , MIN_ORD_AMT
+		     , PNT_PRATE
+		     , PNT_MRATE
+		     , SELL_FEE_RATE
+		     , FORMAL_GB
+		     , CHANGEABLE_YN
+		     , RETURNABLE_YN
+		     , CHANGE_FEE_FREE_YN
+		     , RETURN_FEE_FREE_YN
+		     , PRE_PPNT_USABLE_YN
+		     , PRE_MPNT_USABLE_YN
+		     , MIN_ORD_QTY
+		     , MAX_ORD_QTY
+		     , DAY_MAX_ORD_QTY
+		     , GIFT_PACK_YN
+		     , FRST_CFRM_DT
+		     , ORIGIN_CD
+		     , MAKE_YMD
+		     , TAX_GB
+		     , ERP_PRICE_LINK_YN
+		     , ERP_STOCK_LINK_YN
+		     , NEW_CUST_ORD_YN
+		     , NEW_CUST_ORD_STDT
+		     , NEW_CUST_ORD_EDDT
+		     , ADULT_YN
+		     , TOBE_FORM_YN
+		     , #{regNo}
+		     , now()
+		     , #{updNo}
+		     , now()
+		FROM   TB_GOODS
+		WHERE  1 = 1
+		  AND    GOODS_CD IN (
+		                       SELECT B.GOODS_CD
+		                       FROM   TB_SOCIAL A
+		                          , TB_SOCIAL_GOODS B
+		                       WHERE  A.SOCIAL_SQ = B.SOCIAL_SQ
+		                         AND    A.USE_YN   = 'Y'
+		                         AND    A.APPLY_GB = 'A'
+		                         AND    B.DEL_YN   = 'N'
+		                       <if test="immediatelyApplyYn == null or immediatelyApplyYn == ''">
+		                         AND    A.SOCIAL_SQ = #{socialSq}
+		                       </if>
+		                       )
+	</insert>
+
+	<!-- 진행중인 상품 종료처리 : 소셜상품 가격정보 원복(before) 업데이트 -->
+	<update id="updateSocialApplyGbtoF" parameterType="Social">
+		/* TsaSocial.updateSocialApplyGbtoF */
+		UPDATE TB_SOCIAL
+		   SET   APPLY_GB = 'F'	<!-- 종료상태 -->
+		        ,UPD_DT = NOW()
+		        ,UPD_NO = #{updNo}
+		WHERE  APPLY_GB = 'A' 	<!-- 적용상태 -->
+		<if test="immediatelyApplyYn == null or immediatelyApplyYn == ''">
+		  AND    SOCIAL_SQ = #{socialSq}
+		</if>
+	</update>
+
+	<!-- 상품 가격정보 적용(after) -->
+	<update id="updateGoodsAfterPriceInfo" parameterType="Social">
+		/* TsaSocial.updateGoodsAfterPriceInfo */
+		UPDATE TB_GOODS A
+		       INNER JOIN TB_SOCIAL_GOODS B ON A.GOODS_CD = B.GOODS_CD
+		       INNER JOIN TB_SOCIAL C ON B.SOCIAL_SQ = C.SOCIAL_SQ
+		SET A.GOODS_CD = B.GOODS_CD ,
+		    A.CURR_PRICE = B.CURR_BPRICE,
+		    A.DC_RATE = B.DC_BRATE,
+		    A.UPD_DT = NOW(),
+		    A.UPD_NO = #{updNo}
+		WHERE C.USE_YN = 'Y'
+		AND C.APPLY_GB = 'P'
+		AND B.DEL_YN = 'N'
+		AND C.SOCIAL_SQ = #{socialSq}
+	</update>
+
+	<!-- 적용(after) 상품 이력 생성 -->
+	<insert id="createAfterGoodsHst" parameterType="Social">
+		/* TsaSocial.createAfterGoodsHst */
+		INSERT INTO TB_GOODS_HST
+		(
+		      GOODS_CD
+		    , BRAND_CD
+		    , ITEMKIND_CD
+		    , GOODS_NM
+		    , GOODS_TNM
+		    , GOODS_SNM
+		    , GOODS_SNM1
+		    , MAIN_COLOR_CD
+		    , STYLE_YEAR
+		    , SEASON_CD
+		    , SEX_GB
+		    , GOODS_NUM
+		    , GOODS_TYPE
+		    , TAG_PRICE
+		    , LIST_PRICE
+		    , CURR_PRICE
+		    , CURR_BPRICE
+		    , PRICE_UPD_DT
+		    , COST_PRICE
+		    , DC_RATE
+		    , GOODS_STAT
+		    , SELL_STDT
+		    , SELL_EDDT
+		    , SELF_MALL_YN
+		    , GOODS_GB
+		    , FOREIGN_BUY_YN
+		    , PARALLEL_IMPORT_YN
+		    , ORDER_MADE_YN
+		    , DISTRIBUTION_GB
+		    , SELF_GOODS_YN
+		    , SUPPLY_COMP_CD
+		    , SUPPLY_GOODS_CD
+		    , AGE_GRP_CD
+		    , DELV_LOC_CD
+		    , DELV_FEE_CD
+		    , DELV_FEE
+		    , MIN_ORD_AMT
+		    , PNT_PRATE
+		    , PNT_MRATE
+		    , SELL_FEE_RATE
+		    , FORMAL_GB
+		    , CHANGEABLE_YN
+		    , RETURNABLE_YN
+		    , CHANGE_FEE_FREE_YN
+		    , RETURN_FEE_FREE_YN
+		    , PRE_PPNT_USABLE_YN
+		    , PRE_MPNT_USABLE_YN
+		    , MIN_ORD_QTY
+		    , MAX_ORD_QTY
+		    , DAY_MAX_ORD_QTY
+		    , GIFT_PACK_YN
+		    , FRST_CFRM_DT
+		    , ORIGIN_CD
+		    , MAKE_YMD
+		    , TAX_GB
+		    , ERP_PRICE_LINK_YN
+		    , ERP_STOCK_LINK_YN
+		    , NEW_CUST_ORD_YN
+		    , NEW_CUST_ORD_STDT
+		    , NEW_CUST_ORD_EDDT
+		    , ADULT_YN
+		    , TOBE_FORM_YN
+		    , REG_NO
+		    , REG_DT
+		    , UPD_NO
+		    , UPD_DT
+		)
+		SELECT GOODS_CD
+		    , BRAND_CD
+		    , ITEMKIND_CD
+		    , GOODS_NM
+		    , GOODS_TNM
+		    , GOODS_SNM
+		    , GOODS_SNM1
+		    , MAIN_COLOR_CD
+		    , STYLE_YEAR
+		    , SEASON_CD
+		    , SEX_GB
+		    , GOODS_NUM
+		    , GOODS_TYPE
+		    , TAG_PRICE
+		    , LIST_PRICE
+		    , CURR_PRICE
+		    , CURR_BPRICE
+		    , PRICE_UPD_DT
+		    , COST_PRICE
+		    , DC_RATE
+		    , GOODS_STAT
+		    , SELL_STDT
+		    , SELL_EDDT
+		    , SELF_MALL_YN
+		    , GOODS_GB
+		    , FOREIGN_BUY_YN
+		    , PARALLEL_IMPORT_YN
+		    , ORDER_MADE_YN
+		    , DISTRIBUTION_GB
+		    , SELF_GOODS_YN
+		    , SUPPLY_COMP_CD
+		    , SUPPLY_GOODS_CD
+		    , AGE_GRP_CD
+		    , DELV_LOC_CD
+		    , DELV_FEE_CD
+		    , DELV_FEE
+		    , MIN_ORD_AMT
+		    , PNT_PRATE
+		    , PNT_MRATE
+		    , SELL_FEE_RATE
+		    , FORMAL_GB
+		    , CHANGEABLE_YN
+		    , RETURNABLE_YN
+		    , CHANGE_FEE_FREE_YN
+		    , RETURN_FEE_FREE_YN
+		    , PRE_PPNT_USABLE_YN
+		    , PRE_MPNT_USABLE_YN
+		    , MIN_ORD_QTY
+		    , MAX_ORD_QTY
+		    , DAY_MAX_ORD_QTY
+		    , GIFT_PACK_YN
+		    , FRST_CFRM_DT
+		    , ORIGIN_CD
+		    , MAKE_YMD
+		    , TAX_GB
+		    , ERP_PRICE_LINK_YN
+		    , ERP_STOCK_LINK_YN
+		    , NEW_CUST_ORD_YN
+		    , NEW_CUST_ORD_STDT
+		    , NEW_CUST_ORD_EDDT
+		    , ADULT_YN
+		    , TOBE_FORM_YN
+		    , #{regNo}
+		    , now()
+		    , #{updNo}
+		    , now()
+		FROM   TB_GOODS
+		WHERE  1 = 1
+		AND    GOODS_CD IN (
+		                SELECT B.GOODS_CD
+		                FROM   TB_SOCIAL A
+		                , TB_SOCIAL_GOODS B
+		                WHERE  A.SOCIAL_SQ = B.SOCIAL_SQ
+		                AND    A.USE_YN   = 'Y'
+		                AND    A.APPLY_GB = 'P'
+		                AND    B.DEL_YN   = 'N'
+		                AND    A.SOCIAL_SQ = #{socialSq}
+		             )
+	</insert>
+
+	<!-- 소셜 적용 여부 '적용'(대기->적용) 업데이트 -->
+	<update id="updateSocialApplyGbtoA" parameterType="Social">
+		/* TsbSocial.updateSocialApplyGbtoA */
+		UPDATE TB_SOCIAL
+		SET    APPLY_GB = 'A',
+		       UPD_DT = NOW(),
+		       UPD_NO = #{updNo}
+		WHERE  APPLY_GB = 'P'
+		  AND  USE_YN   = 'Y'
+		  AND  SOCIAL_SQ = #{socialSq}
+	</update>
+
 </mapper>

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

@@ -311,7 +311,7 @@
 						  JOIN TB_ORDER_RECALL_EXCEPTION_ITEM B ON A.RECALL_EXCEPTION_NO = B.RECALL_EXCEPTION_NO
 						  LEFT JOIN TB_ORDER O ON O.ORD_NO = A.ORDER_NO 
 						  LEFT JOIN TB_OPTION C ON C.OPT_CD = B.SKU_CODE
-						  LEFT OUTER JOIN TB_ORDER_CHANGE_DETAIL  CD ON B.ORDER_DTL_NO = CD.ORD_DTL_NO AND CD.DEL_YN ='N' AND A.ORDER_EXCEPTION_NO = CD.ORD_CHG_SQ 
+						  LEFT OUTER JOIN TB_ORDER_CHANGE_DETAIL  CD ON B.ORDER_DTL_NO = CD.ORD_DTL_NO AND A.ORDER_EXCEPTION_NO = CD.ORD_CHG_SQ 
 						  LEFT OUTER JOIN TB_ORDER_CHANGE         OC ON CD.ORD_CHG_SQ = OC.ORD_CHG_SQ 						  
 						  WHERE B.REASON_CODE IN('00','02','03','04','05','06','15')
 							<if test='customerName != null and customerName != ""'>
@@ -383,7 +383,7 @@
 						  JOIN TB_ORDER_RECALL_EXCEPTION_ITEM B ON A.RECALL_EXCEPTION_NO = B.RECALL_EXCEPTION_NO
 						  LEFT JOIN TB_ORDER O ON O.ORD_NO = A.ORDER_NO 
 						  LEFT JOIN TB_OPTION C ON C.OPT_CD = B.SKU_CODE
-						  LEFT OUTER JOIN TB_ORDER_CHANGE_DETAIL  CD ON B.ORDER_DTL_NO = CD.ORD_DTL_NO AND CD.DEL_YN ='N' AND A.ORDER_EXCEPTION_NO = CD.ORD_CHG_SQ 
+						  LEFT OUTER JOIN TB_ORDER_CHANGE_DETAIL  CD ON B.ORDER_DTL_NO = CD.ORD_DTL_NO AND A.ORDER_EXCEPTION_NO = CD.ORD_CHG_SQ 
 						  LEFT OUTER JOIN TB_ORDER_CHANGE         OC ON CD.ORD_CHG_SQ = OC.ORD_CHG_SQ 						  
 						  WHERE B.REASON_CODE IN('01')
 							<if test='customerName != null and customerName != ""'>

+ 32 - 0
src/main/java/com/style24/persistence/mybatis/wms/TsaWmsWithdraw.xml

@@ -154,5 +154,37 @@
           		  
 	</insert>	
 	
+	<!-- 회수예외 수정 -H   -->
+	<update id="updateWmsIfWithdrawExcList" parameterType="WithdrawExc" >
+		/*TsbWmsDelivery.updateWmsIfWithdrawExcList*/
+		UPDATE iSTYLE24_WmsIf.DBO.TB_IF_RecallException SET 
+			   IfStat = #{ifstat}
+			 , IfDate = GETDATE()
+			 <if test='ifstat == "2"'>
+			 , CSenCloseFee = #{csAddFee}
+			 , CSMemo       = #{csMemo}
+			 </if>
+		WHERE RecallExceptionNo = #{recallExceptionNo}
+		
+	</update>
+		
+	<!-- 회수예외 수정 -D   -->
+	<update id="updateWmsIfWithdrawExcItemList" parameterType="WithdrawExc" >
+		/*TsbWmsDelivery.updateWmsIfWithdrawExcItemList*/
+		UPDATE iSTYLE24_WmsIf.DBO.TB_IF_RecallExceptionItem SET 
+			   IfStat = #{ifstat}
+			 , IfDate = GETDATE()
+		WHERE RecallExceptionNo = #{recallExceptionNo}
+	</update>
+	
+	<!-- 회수예외 수정 -M   -->
+	<update id="updateWmsIfWithdrawExcMemoList" parameterType="WithdrawExc" >
+		/*TsbWmsDelivery.updateWmsIfWithdrawExcMemoList*/
+		UPDATE iSTYLE24_WmsIf.DBO.TB_IF_RecallExceptionMemo SET 
+			   IfStat = #{ifstat}
+			 , IfDate = GETDATE()
+		WHERE RecallExceptionNo = #{recallExceptionNo}
+	</update>
+		
 	
 </mapper>

+ 1 - 1
src/main/webapp/WEB-INF/views/customer/OneToOneQnaDetailForm.html

@@ -146,7 +146,7 @@
 </div>
 
 <div class="uPopupWrap off" id="layer_review_pic">
-	<div class="area reviewPic" style="width:500px; height:500px;">
+	<div class="area reviewPic" style="width:700px; height:700px;">
 		<ul class="picList" th:object="${counselInfo}">
 			<li><div class="img"></div></li>
 		</ul>

+ 9 - 0
src/main/webapp/WEB-INF/views/display/MainContentsPopupForm.html

@@ -25,6 +25,15 @@
 			<ul class="panelBar">
 				<li class="aL">
 					<span class="cBlue">* 상단으로 드래그&amp;드랍하여 순서 변경 가능합니다.</span>
+					<br th:if="${contentsLoc=='SGNB001' or contentsLoc=='SMM001' or contentsLoc=='SMM005' or contentsLoc=='SMM008' or contentsLoc=='SBM004' or contentsLoc=='SBM006' or contentsLoc=='SBM014' or contentsLoc=='SBM015' or contentsLoc=='SBM016' or contentsLoc=='SCM001' or contentsLoc=='SOM001'}">
+					<span class="cRed" th:if="${contentsLoc=='SGNB001'}">* 띠배너 이미지: 1120 X 185 / 확장형 배너이미지: 1920 X 400 / 확장형 HTML 이미지: 1920 X 700</span>
+					<span class="cRed" th:if="${contentsLoc=='SMM001'}">* PC 이미지: 1080 X 700 / 모바일 이미지: 960 X 960</span>
+					<span class="cRed" th:if="${contentsLoc=='SMM001'}">* PC 이미지: 1080 X 700 / 모바일 이미지: 960 X 960</span>
+					<span class="cRed" th:if="${contentsLoc=='SMM005'}">* 1단 이미지: 1780 X 230(안전영역 810X230 + BG컬러) / 모바일 이미지: 810 X 230</span>
+					<span class="cRed" th:if="${contentsLoc=='SMM008'}">* 이미지: 1920 X 340 </span>
+					<span class="cRed" th:if="${contentsLoc=='SBM004'}">* PC 이미지: 1080 X 700 / 모바일 이미지: 960 X 960</span>
+					<span class="cRed" th:if="${contentsLoc=='SBM006' or contentsLoc=='SBM014' or contentsLoc=='SBM015' or contentsLoc=='SBM016'}">* 이미지: 1780 X 230(안전영역 810X230 + BG컬러)</span>
+					<span class="cRed" th:if="${contentsLoc=='SCM001' or contentsLoc=='SOM001'}">* 이미지: 960 X 960</span>
 				</li>
 				<li class="aR">
 					<button type="button" class="btn btn btn-base btn-sm" id="btnPopAddRow">컨텐츠 추가</button>

+ 8 - 0
src/main/webapp/WEB-INF/views/display/MainMultiContentsPopupForm.html

@@ -24,6 +24,14 @@
 				<ul class="panelBar">
 					<li class="aL">
 						<span class="cBlue">* 상단으로 드래그&amp;드랍하여 순서 변경 가능합니다.</span>
+						<br th:if="${contentsLoc=='SMM003' or contentsLoc=='SMM007' or contentsLoc=='SMM009' or contentsLoc=='SBM007' or contentsLoc=='SBM008' or contentsLoc=='SBM009' or contentsLoc=='SBM017' or contentsLoc=='SBM018' or contentsLoc=='SBM019' or contentsLoc=='SCM002' or contentsLoc=='SCM003' or contentsLoc=='SOM002' or contentsLoc=='SOM003'}">
+						<span class="cRed" th:if="${contentsLoc=='SMM003' or contentsLoc=='SBM007' or contentsLoc=='SCM002'}">* 신상품 최대 20개(수동설정 20개 미만일시, 수동 설정 + 최신 등록 상품)</span>
+						<span class="cRed" th:if="${contentsLoc=='SMM007'}">* 배너 최대 5개(수동설정 + 브랜드 룩북1개 + 진행중인 기획전)</span><br th:if="${contentsLoc=='SMM007'}">
+						<span class="cRed" th:if="${contentsLoc=='SMM007'}">* 상품 최대 3개(수동설정 3개 미만일시, 수동설정 + 브랜드 최신 등록 상품)</span>
+						<span class="cRed" th:if="${contentsLoc=='SMM009'}">* 키워드 최대 5개(수동설정 5개 미만일시, 추천솔루션 데이터 노출(키워드별 상품 7개))</span>
+						<span class="cRed" th:if="${contentsLoc=='SBM008'}">* 상품 최대 10개(수동설정 10개 미만일시, 수동설정 + 추천솔루션 데이터 노출)</span>
+						<span class="cRed" th:if="${contentsLoc=='SBM009' or contentsLoc=='SBM017' or contentsLoc=='SBM018' or contentsLoc=='SBM019' or contentsLoc=='SOM002'}">* 상품 최대 20개(수동설정 20개 미만일시, 수동설정 + 추천솔루션 데이터 노출)</span>
+						<span class="cRed" th:if="${contentsLoc=='SCM003' or contentsLoc=='SOM003'}">* 상품 최대 수동설정한 노출 갯수(수동설정 갯수 미만일시, 수동설정 + 추천솔루션 데이터 노출)</span>
 					</li>
 					<li class="aR">
 						<button type="button" class="btn btn btn-base btn-sm" th:if="${contentsLoc == 'SMM007'}" onclick="fnAddBrand(this);">브랜드 추가</button> <!--id="btnBrandAddRow"-->

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

@@ -244,7 +244,7 @@
 					<div class="tablePaging" id="goodsListPagination"></div>
 				</li>
 			</ul>
-			<ul class="panelBar">
+			<ul class="panelBar off">
 				<li class="right">
 				<th:block th:if="${sessionInfo.roleCd == 'G001_0000' OR sessionInfo.roleCd == 'G001_A000' OR sessionInfo.roleCd == 'G001_A101' OR sessionInfo.roleCd == 'G001_A100' OR sessionInfo.roleCd == 'G001_A001'}">
 					<button type="button" class="btn btn-info btn-sm"  onclick="fnGoodsStatArea();" >상태일괄적용</button>
@@ -254,7 +254,7 @@
 			<label class="off">
 				<a href="javascript:void(0);" id="GoodsExcelList" style="display: none;">상품목록 엑셀다운로드</a>
 			</label>
-			<ul class="boxContent off" id="goodsStatArea">
+			<ul class="boxContent" id="goodsStatArea">
 				<li class="pad20">
 					<table class="frmStyle">
 						<colgroup>
@@ -358,7 +358,7 @@
 								<button type="button" class="btn btn-dark btn-sm" onclick="fnChangeGoodsState('giftPackYn')" >적용</button>
 							</td>
 							<th>배송정책</th>
-							<td colspan="3">
+							<td colspan="5">
 								<input type="text" class="w100" name="statSupplyCompCd" id="statSupplyCompCd" maxlength="20" />
 								<button type="button" class="btn icn" id="btnSearchSupplyCompStat"><i class="fa fa-search"></i></button>
 								<select name="delvFeeCdC" id="delvFeeCdC" >
@@ -366,19 +366,10 @@
 								</select>
 								<button type="button" class="btn btn-dark btn-sm" onclick="fnChangeGoodsState('delvFeeCd')" >적용</button>
 							</td>
-							<th>신규고객 주문가능</th>
-							<td>
-								<select id="newCustOrdYnC" name="newCustOrdYnC">
-									<option value="">[선택]</option>
-									<option value="Y">가능</option>
-									<option value="N">불가</option>
-								</select>
-								<button type="button" class="btn btn-dark btn-sm" onclick="fnChangeGoodsState('newCustOrdYn')" >적용</button>
-							</td>
 						</tr>
 						<tr>
 							<th>판매일시</th>
-							<td colspan="7">
+							<td colspan="3">
 								<input name="sellStYMDC" id="sellStYMDC" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="판매시작일" />
 								<select name="sellStHHC" id="sellStHHC" required="required" data-valid-name="판매 시작시간">
 									<th:block th:each="num, index  : ${#numbers.sequence(0,23)}">
@@ -396,6 +387,18 @@
 								<input name="sellEddtC" id="sellEddtC" type="hidden" />
 								<button type="button" class="btn btn-dark btn-sm" onclick="fnChangeGoodsState('sellDate')" >적용</button>
 							</td>
+							<th>신규고객 주문가능</th>
+							<td colspan="3">
+								<select id="newCustOrdYnC" name="newCustOrdYnC">
+									<option value="">[선택]</option>
+									<option value="Y">가능</option>
+									<option value="N">불가</option>
+								</select>
+								<input name="newCustOrdStdtC" id="newCustOrdStdtC" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="신규고객시작일" />
+								~
+								<input name="newCustOrdEddtC" id="newCustOrdEddtC" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="신규고객종료일" />
+								<button type="button" class="btn btn-dark btn-sm" onclick="fnChangeGoodsState('newCustOrdYn')" >적용</button>
+							</td>
 						</tr>	
 					</table>
 				</li>
@@ -746,6 +749,11 @@
 
 	//상품상태 변경시
 	var fnChangeGoodsState = function(proc){
+		
+		if ('G001_0000' != sessRoleCd && 'G001_A000' != sessRoleCd && 'G001_A101' != sessRoleCd && 'G001_A100' != sessRoleCd  && 'G001_A001' != sessRoleCd  ){
+			mcxDialog.alert('권한이 없습니다.');
+			return;
+		}
 
 		var objId = '#'+proc+"C";
 		if (proc == "goodsTnm"){
@@ -799,7 +807,53 @@
 				});
 				return false;
 			}
-
+		}else if (proc == "newCustOrdYn"){
+			
+			if (gagajf.isNull($(objId).val())){
+				mcxDialog.alertC('적용하실 항목을 선택(입력)해주세요.', {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$(objId).focus();
+					}
+				});
+				return;
+			}
+			
+			if ("Y" == $(objId).val()){
+				
+				if(isNaN(Date.parse($("#searchForm input[name=newCustOrdStdtC]").val()))){
+					mcxDialog.alertC('날짜형식이 아닙니다.', {
+						sureBtnText: "확인",
+						sureBtnClick: function() {
+							$("#searchForm input[name=newCustOrdStdtC]").focus();
+						}
+					});	
+					return false;
+				}
+				
+				if(isNaN(Date.parse($("#searchForm input[name=newCustOrdEddtC]").val()))){
+					mcxDialog.alertC('날짜형식이 아닙니다.', {
+						sureBtnText: "확인",
+						sureBtnClick: function() {
+							$("#searchForm input[name=newCustOrdEddtC]").focus();
+						}
+					});	
+					return false;
+				}
+				
+				var fromDate = $("#searchForm input[name=newCustOrdStdtC]").val().replaceAll('-', '')+ "000000";
+				var toDate = $("#searchForm input[name=newCustOrdEddtC]").val().replaceAll('-', '')+ "235959";
+	
+				if (fromDate > toDate) {
+					mcxDialog.alertC("신규고객기간의 시작일시는 종료일시 보다 클 수 없습니다.", {
+						sureBtnText: "확인",
+						sureBtnClick: function() {
+							$('#searchForm input[name=newCustOrdEddtC]').focus();
+						}
+					});
+					return false;
+				}
+			}
 		}else{
 			if (gagajf.isNull($(objId).val())){
 				mcxDialog.alertC('적용하실 항목을 선택(입력)해주세요.', {
@@ -836,6 +890,8 @@
 		var newCustOrdYnVal = '';
 		var sellStdtVal = '';
 		var sellEddtVal = '';
+		var newCustOrdStdtVal = '';
+		var newCustOrdEddtVal = '';
 
 		if (proc == "goodsStat") {
 			goodsStatVal = $(objId).val();
@@ -912,8 +968,6 @@
 			pntMrateVal = $(objId).val();
 		}else if (proc == "giftPackYn") {
 			giftPackYnVal = $(objId).val();
-		}else if (proc == "newCustOrdYn") {
-			newCustOrdYnVal = $(objId).val();	
 		}else if (proc == "delvFeeCd") {
 		/* 	if (!fnGoodsDelFeeCdCheck(selectedData)){
 				return;
@@ -926,8 +980,9 @@
 				if (item.supplyCompCd != statSupplyCompCd){
 					mcxDialog.alert(item.goodsCd +" 상품은 배송정책의 업체와 상이합니다.");
 					chkFlag = true;
-					 false;
+					return false;
 				}
+				
 			});
 			if (chkFlag){
 				return;
@@ -937,6 +992,10 @@
 		}else if (proc == "sellDate") {
 			sellStdtVal = $("#searchForm input[name=sellStYMDC]").val().replaceAll('-', '')+ $("#searchForm select[name=sellStHHC]").val()+"0000";
 			sellEddtVal = $("#searchForm input[name=sellEdYMDC]").val().replaceAll('-', '')+ $("#searchForm select[name=sellEdHHC]").val()+"5959";
+		}else if (proc == "newCustOrdYn") {
+			newCustOrdYnVal = $(objId).val();	
+			newCustOrdStdtVal = $("#searchForm input[name=newCustOrdStdtC]").val().replaceAll('-', '')+ "000000";
+			newCustOrdEddtVal = $("#searchForm input[name=newCustOrdEddtC]").val().replaceAll('-', '')+ "235959";	
 		}else{
 			return;
 		}
@@ -967,6 +1026,8 @@
 							,giftPackYn : giftPackYnVal
 							,delvFeeCd : delvFeeCdVal
 							,newCustOrdYn : newCustOrdYnVal
+							,newCustOrdStdt : newCustOrdStdtVal
+							,newCustOrdEddt : newCustOrdEddtVal
 							,sellStdt : sellStdtVal
 							,sellEddt : sellEddtVal
 							,procJob : proc
@@ -979,6 +1040,17 @@
 		});
 	}
 	
+	// 신규고객주문가능 업체변경시  eskim
+	
+	// 신규고객 변경시
+	$("#searchForm select[name=newCustOrdYnC]").bind('change', function () {
+		var selectValue = $(this).val();
+		if ("N" == selectValue) {
+			$("#searchForm input[name=newCustOrdStdtC]").val('');
+			$("#searchForm input[name=newCustOrdEddtC]").val('');
+		}
+	});	
+	
 	// 배송비정책 관련 확인
 	var fnGoodsDelFeeCdCheck = function(selectedData){
 		

+ 3 - 3
src/main/webapp/WEB-INF/views/goods/GoodsPopupListForm.html

@@ -60,7 +60,7 @@
 					<td>
 						<select name="goodsType" id="goodsType">
 							<option value="">[전체]</option>
-							<option th:if="${goodsTypeList}" th:each="oneData, status : ${goodsTypeList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							<option th:if="${goodsTypeList}" th:each="oneData, status : ${goodsTypeList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}" th:selected="${oneData.cd == 'G056_N'}"></option>
 						</select>
 					</td>	
 					<th rowspan="4">키워드<em class="required" title="필수"></em></th>
@@ -86,10 +86,10 @@
 					<th>상품상태</th>
 					<td>
 						<div class="multiCheckBox"  style="width:200px">
-							<button type="button" class="sltBtn" data-name="[전체]">[전체]</button>
+							<button type="button" class="sltBtn" data-name="[전체]" th:text="'[G008_90] 승인완료'">[전체]</button>
 							<ul style="overflow:auto; height:170px" id="grpPGoodsStat">
 								<li><label class="chkBox" onclick="uifnAllCheck(this,'grpPGoodsStat')"><input type="checkbox" name="전체선택" >전체선택</label></li>
-								<li th:if="${goodsStatList}" th:each="oneData, status : ${goodsStatList}"><label class="chkBox" data-group="grpPGoodsStat"><input type="checkbox" name="multiGoodsStat" th:id="${'goodsStat' + oneData.cd}" th:value="${oneData.cd}" ><th:block th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></th:block></label></li>
+								<li th:if="${goodsStatList}" th:each="oneData, status : ${goodsStatList}"><label class="chkBox" data-group="grpPGoodsStat"><input type="checkbox" name="multiGoodsStat" th:id="${'goodsStat' + oneData.cd}" th:value="${oneData.cd}" th:checked="${oneData.cd == 'G008_90'}"><th:block th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></th:block></label></li>
 							</ul>
 						</div>
 					</td>

+ 3 - 0
src/main/webapp/WEB-INF/views/goods/GoodsSalfRegisterForm.html

@@ -519,6 +519,9 @@
 	$("#goodsDetailForm input[name=selCertTargetGb]").bind('click', function () {
 		var certTargetGb = $(this).val();
 		if (certTargetGb == "G083_1"){ 
+			$("#goodsDetailForm select[name=certFormGb]").val('');
+			$("#goodsDetailForm select[name=certType]").val('');
+			$("#goodsDetailForm input[name=certNum]").val('');
 			$("#goodsDetailForm select[name=certFormGb]").attr('readonly', false);
 			$("#goodsDetailForm select[name=certType]").attr('readonly', false);
 			$("#goodsDetailForm input[name=certNum]").attr('readonly', false);

+ 4 - 4
src/main/webapp/WEB-INF/views/marketing/PlanDetailPopupForm.html

@@ -948,8 +948,8 @@
 			$('.custJoinDateTr').css('display' , 'none');
 			$('#custJoinStdt').attr('required' , false);
 			$('#custJoinEddt').attr('required' , false);
-			$('#nonCust').prop('checked', true);
-			$('#nonCust').removeAttr('disabled');
+			//$('#nonCust').prop('checked', true);
+			//$('#nonCust').removeAttr('disabled');
 		}
 		
 		if(planInfo.replyLoc == "D"){
@@ -1765,8 +1765,8 @@
 				 $('#nonCust').prop('checked', false);
 				 $('#nonCust').attr('disabled','disabled');
 			 }else{
-			 	 $('#nonCust').prop('checked', true);
-				 $('#nonCust').removeAttr('disabled');
+			 	 //$('#nonCust').prop('checked', true);
+				 //$('#nonCust').removeAttr('disabled');
 			 }
 			 
 			 if(planCateList.length > 0){

+ 18 - 0
src/main/webapp/WEB-INF/views/marketing/PlanTemplatePopupForm.html

@@ -2082,6 +2082,9 @@ $(document).ready(function() {
 				
 				if (reviewList[0].dispYn == 'Y') {
 					$('#planTemplateForm input:checkbox[name="reDispYn"]').prop('checked', true);
+				}else{
+					$('#planTemplateForm input:checkbox[name="reDispYn"]').prop('checked', false);
+					$('#planTemplateForm input:checkbox[name="reDispYn"]').val("N");
 				}
 				
 				if(typeof reviewList[0].reItemVal != 'undefined' && reviewList[0].reItemVal != null){
@@ -2097,6 +2100,9 @@ $(document).ready(function() {
 				$('#planTemplateForm input[name=cuPlanContSq]').val(couponNotice.planContSq);
 				if (couponNotice.dispYn == 'Y') {
 					$('#planTemplateForm input:checkbox[name="cuDispYn"]').prop('checked', true);
+				}else{
+					$('#planTemplateForm input:checkbox[name="cuDispYn"]').prop('checked', false);
+					$('#planTemplateForm input:checkbox[name="cuDispYn"]').val("N");
 				}
 				if (couponNotice.cpnNote0 != null && couponNotice.cpnNote0 != '') {
 					$("#planTemplateForm select[name=couponCnt]").val(1);
@@ -2166,6 +2172,9 @@ $(document).ready(function() {
 				
 				if (fileList[0].dispYn == 'Y') {
 					$('#planTemplateForm input:checkbox[name="fileDispYn"]').prop('checked', true);
+				}else{
+					$('#planTemplateForm input:checkbox[name="fileDispYn"]').prop('checked', false);
+					$('#planTemplateForm input:checkbox[name="fileDispYn"]').val("N");
 				}
 				
 				if(fileList.length > 0 && fileList[0].fileItemVal != null)
@@ -2193,6 +2202,9 @@ $(document).ready(function() {
 				
 				if (noticeList[0].dispYn == 'Y') {
 					$('#planTemplateForm input:checkbox[name="noticeDispYn"]').prop('checked', true);
+				}else{
+					$('#planTemplateForm input:checkbox[name="noticeDispYn"]').prop('checked', false);
+					$('#planTemplateForm input:checkbox[name="noticeDispYn"]').val("N");
 				}
 				
 				if(noticeList.length > 0 && noticeList[0].noticeItemVal != null)
@@ -2212,6 +2224,9 @@ $(document).ready(function() {
 				
 				if (fsrcListBtm[0].dispYn == 'Y') {
 					$('#planTemplateForm input:checkbox[name="btmFsrcDispYn"]').prop('checked', true);
+				}else{
+					$('#planTemplateForm input:checkbox[name="btmFsrcDispYn"]').prop('checked', false);
+					$('#planTemplateForm input:checkbox[name="btmFsrcDispYn"]').val("N");
 				}
 			
 				$('#fsrcPcBtm').summernote('code', fsrcListBtm[0].fsrcPc);
@@ -2226,6 +2241,9 @@ $(document).ready(function() {
 				
 				if (fsrcListTop[0].dispYn == 'Y') {
 					$('#planTemplateForm input:checkbox[name="topFsrcDispYn"]').prop('checked', true);
+				}else{
+					$('#planTemplateForm input:checkbox[name="topFsrcDispYn"]').prop('checked', false);
+					$('#planTemplateForm input:checkbox[name="topFsrcDispYn"]').val("N");
 				}
 			
 				$('#fsrcPcTop').summernote('code', fsrcListTop[0].fsrcPc);

+ 127 - 19
src/main/webapp/WEB-INF/views/marketing/SocialShoppingListForm.html

@@ -130,8 +130,8 @@
 						<!-- 버튼 배치 영역 -->
 						<ul class="panelBar">
 							<li class="right">
-								<button type="button" class="btn btn-info btn-lg" onclick="afreshBtn()">신규</button>
-							<button type="button" class="btn btn-success btn-lg" onclick="fnSocialSaveValid();">저장</button>
+								<button type="button" class="btn btn-info btn-lg" id="regNewBtn" onclick="afreshBtn()">신규</button>
+								<button type="button" class="btn btn-success btn-lg" id="regBtn" onclick="fnSocialSaveValid();">저장</button>
 							</li>
 						</ul>
 						<!-- //버튼 배치 영역 -->
@@ -169,7 +169,7 @@
 									
 									<th>사용여부</th>
 									<td>
-										<select name="useYn" required="required" data-valid-name="사용여부">
+										<select name="useYn" required="required" data-valid-name="사용여부" readonly="readonly" disabled="disabled">
 											<option th:if="${useYnList}" th:each="oneData, status : ${useYnList}" th:value="${oneData.cd}" th:text="|${oneData.cdNm}|"></option>
 										</select>
 									</td>
@@ -231,11 +231,13 @@
 									
 									<th>적용구분</th>
 									<td>
-										<select name="applyGb" required="required" data-valid-name="적용구분">
-											<option value="P">대기</option>
-											<option value="A">적용</option>
-											<option value="F">종료</option>
-										</select>
+<!--										<select name="applyGb" required="required" data-valid-name="적용구분">-->
+<!--											<option value="P">대기</option>-->
+<!--											<option value="A">적용</option>-->
+<!--											<option value="F">종료</option>-->
+<!--										</select>-->
+										<input type="hidden" name="applyGb" value="P"/>
+										<input type="text" name="applyGbName" value="대기" readonly="readonly"/>
 									</td>
 									
 								</tr>
@@ -250,7 +252,7 @@
 			<!-- 소셜 상품 -->
 			<li class="tab" id="tab-2">
 				<div class="panelStyle">	
-						<span class="btnLeft">
+						<span class="btnLeft" id="priceApplyArea">
 							<select name="priceGb" id="priceGb">
 								<option value="">선택</option>
 								<option value="currAprice">판매가</option>
@@ -261,16 +263,18 @@
 							<input type="text" class="w100 aR" id="price" name="price" data-valid-type="numeric"/>
 							<button type="button" class="btn btn-default btn-lg" onclick="fnPriceApply();">일괄적용</button>
 						</span> 
-						<ul class="panelBar">
-							<li>
+						<ul class="panelBar" id="btnArea">
+							<li id="noteArea">
 								<h3><i class="fa fa-info-circle"></i>설정하는 가격과 할인율은 즉시적용 쿠폰을 적용하지 않으며 <font color="red">상품에 있는 판매가로 적용</font>됩니다.</h3>
 							</li>
 							<li class="right">
-								<button type="button" class="btn btn-default btn-lg" onclick="fnOpenGoodsPopup();">상품추가</button>
-								<button type="button" class="btn btn-default btn-lg" onclick="fnDeleteGoods();">상품삭제</button>
-								<button type="button" class="btn btn-default btn-lg" onclick="fnSocialGoodsExcelUpload();">엑셀상품추가</button>
-								<button type="button" class="btn btn-default btn-lg" onclick="cfnDownloadSampleFile('SF011');">엑셀상품추가 양식 다운로드</button>
-								<button type="button" class="btn btn-success btn-lg" onclick="fnSocialGoodsSave();">저장</button>
+								<button type="button" class="btn btn-default btn-lg" id="addGoodsBtn" onclick="fnOpenGoodsPopup();">상품추가</button>
+								<button type="button" class="btn btn-default btn-lg" id="delGoodsBtn" onclick="fnDeleteGoods();">상품삭제</button>
+								<button type="button" class="btn btn-default btn-lg" id="addExcelGoodsBtn" onclick="fnSocialGoodsExcelUpload();">엑셀상품추가</button>
+								<button type="button" class="btn btn-default btn-lg" id="excelDownBtn" onclick="cfnDownloadSampleFile('SF011');">엑셀상품추가 양식 다운로드</button>
+								<button type="button" class="btn btn-success btn-lg" id="regGoodsBtn" onclick="fnSocialGoodsSave();">저장</button>
+								<button type="button" class="btn btn-danger  btn-lg" id="applyBtn" style="display:none;" onclick="fnApplyGoods();">즉시적용</button>
+								<button type="button" class="btn btn-dark btn-lg" id="endBtn" style="display:none;" onclick="fnEndSocial();">종료</button>
 							</li>
 						</ul>
 						<div id="gridSocialGoodsList" style="width: 100%; height: 700px" class="ag-theme-balham lh60"></div>
@@ -360,7 +364,7 @@
 		$(formId + ' input[name=socialTnm]').val(data.socialTnm);
 		$(formId + ' select[name=siteCd]').val(data.siteCd);
 		$(formId + ' select[name=useYn]').val(data.useYn);
-		$(formId + ' select[name=applyGb]').val(data.applyGb);
+		// $(formId + ' select[name=applyGb]').val(data.applyGb);
 		$(formId + ' select[name=frontGb]').val(data.frontGb);
 		$(formId + ' select[name=socialType]').val(data.socialType);
 		$(formId + ' select[name=planSq]').val(data.planSq);
@@ -382,6 +386,66 @@
 		// 진행 종료 기간 설정
 		$(formId + ' input[name=edDate]').val(edDate);
 		$('#edTimeHour').val(edTime.substring(0,2));
+
+		$(formId + ' input[name=applyGb]').val(data.applyGb);
+		if(data.applyGb=='P'){
+			$(formId + ' input[name=applyGbName]').val('대기');
+			$(formId+ " input").prop("disabled", false);
+			$(formId+ " select").prop("disabled", false);
+			$(formId+ " button").show();
+			// 사용여부 활성화
+			$(formId + ' select[name=useYn]').attr('readonly', false);
+			$('#regBtn').show();
+			// noteInfo 영역삭제
+			$("#tab-2 #noteArea #noteInfo").remove();
+			$("#tab-2 #priceApplyArea").show();
+			$("#tab-2 #btnArea").show();
+			$("#tab-2 #addGoodsBtn").show();
+			$("#tab-2 #delGoodsBtn").show();
+			$("#tab-2 #addExcelGoodsBtn").show();
+			$("#tab-2 #excelDownBtn").show();
+			// 버튼영역
+			$("#tab-2 #endBtn").hide();
+			// TODO 7/28: 즉시적용 버튼 추가
+			$("#tab-2 #applyBtn").show();
+		}else if(data.applyGb=='A') {
+			$(formId + ' input[name=applyGbName]').val('적용');
+			$(formId+ " input").prop("disabled", true);
+			$(formId+ " select").prop("disabled", true);
+			$(formId+ " button").hide();
+			// 진행 종료 날짜/시간만 수정가능
+			$(formId + ' input[name=edDate]').attr('readonly', false);
+			$(formId + ' input[name=edDate]').prop('disabled', false);
+			$(formId + ' #edTimeHour').prop('disabled', false);
+			$(formId + ' #edTimeHour').attr('readonly', false);
+			$('#regBtn').show();
+
+			// 소셜상품 탭 버튼 show , [저장]버튼만 노출:노출순서 수정만 가능
+			$("#tab-2 #priceApplyArea").hide();
+			$("#tab-2 #btnArea").show();
+			$("#tab-2 #addGoodsBtn").hide();
+			$("#tab-2 #delGoodsBtn").hide();
+			$("#tab-2 #addExcelGoodsBtn").hide();
+			$("#tab-2 #excelDownBtn").hide();
+			$("#tab-2 #noteArea #noteInfo").remove();
+			var noteHtml = '<br id="noteInfo"><h3 id="noteInfo"><i class="fa fa-info-circle"></i>진행중인 핫딜은 노출 순서만 변경 가능합니다.</h3>';
+			$("#tab-2 #noteArea").append(noteHtml);
+			// TODO 7/28: 종료 버튼 추가
+			$("#tab-2 #endBtn").show();
+			$("#tab-2 #applyBtn").hide();
+		}else{
+			$(formId + ' input[name=applyGbName]').val('종료');
+			$(formId+ " input").prop("disabled", true);
+			$(formId+ " select").prop("disabled", true);
+			$(formId+ " button").hide();
+			$('#regBtn').hide();
+
+			// 소셜상품 탭 버튼 hide
+			$("#tab-2 #priceApplyArea").hide();
+			$("#tab-2 #btnArea").hide();
+			$("#tab-2 #endBtn").hide();
+			$("#tab-2 #applyBtn").hide();
+		}
 	}
 
 	// 초기화 클릭 시
@@ -394,12 +458,19 @@
 		var formId = '#detailForm';
 		
 		$('#detailForm')[0].reset();
+		$(formId+ " input").prop("disabled", false);
+		$(formId+ " select").prop("disabled", false);
+		$(formId+ " button").show();
+		$("#regBtn").show();
+		// 사용여부 활성화
+		$(formId + ' select[name=useYn]').attr('readonly', true);
+		$(formId + ' select[name=useYn]').attr('disabled', true);
 		$('.tabsNav li').eq(1).addClass('off');
 		
 		$(formId + ' select[name=planSq]').removeAttr("disabled");
 		$(formId + ' select[name=socialType]').removeAttr("disabled");
 		$(formId + ' button[id=btnSearchPlan]').removeAttr("style");
-		
+
 	};
 	// 소셜 기본정보 저장
 	var fnSocialSaveValid = function() {
@@ -539,7 +610,7 @@
 		
 		var jsonData = JSON.stringify(params);
 			gagajf.ajaxJsonSubmit(actionUrl, jsonData, function(result) {
-			//gridOptionsGoods.api.setRowData(result);
+			gridOptionsGoods.api.setRowData(result);
 		});
 	}
 	
@@ -826,6 +897,43 @@
 			clearInterval(timer);
 		}
 	}
+
+	// 진행중인 핫딜 종료후 해당 핫딜 즉시적용
+	$("#applyBtn").on("click",function() {
+		var data = {
+			socialSq : $('#detailForm').find('input[name=socialSq]').val()
+			, immediatelyApplyYn : 'Y'
+		}
+		var jsonData = JSON.stringify(data);
+
+		mcxDialog.confirm('진행중인 핫딜 종료 후 해당 핫딜이 즉시 적용됩니다.\n 진행하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				gagajf.ajaxJsonSubmit('/marketing/social/apply/save', jsonData, fnEndSocialCallBack);
+			}
+		});
+	});
+
+	// 진행중인 핫딜 종료처리
+	$("#endBtn").on("click",function() {
+		var data = {
+			socialSq : $('#detailForm').find('input[name=socialSq]').val()
+		}
+		var jsonData = JSON.stringify(data);
+
+		mcxDialog.confirm('진행중인 핫딜이 즉시 종료됩니다. 진행하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				gagajf.ajaxJsonSubmit('/marketing/social/end/save', jsonData, fnEndSocialCallBack);
+			}
+		});
+	});
+
+	var fnEndSocialCallBack = function (result){
+		console.log(result);
+	}
 	
 /*]]>*/
 </script>

+ 5 - 1
src/main/webapp/WEB-INF/views/ocm/ExtmallOrderRegisterForm.html

@@ -95,7 +95,11 @@
 			cellEditor: 'textCellEditor',
 			cellEditorParams: { maxlength: 14, validType: 'numeric'}
 		},
-		{headerName: "주문수량",			field: "ordQty",				width: 100, cellClass: 'text-center'},
+		{headerName: "주문수량", 			field: "ordQty", 				width: 100, cellClass: 'text-center'
+			,valueFormatter: function(params) {return params.value.addComma();},
+			cellEditor: 'textCellEditor',
+			cellEditorParams: { maxlength: 14, validType: 'numeric'}
+		},
 		{headerName: "주문금액", 			field: "ordAmt", 				width: 100, cellClass: 'text-center'
 			,valueFormatter: function(params) {return params.value.addComma();},
 			cellEditor: 'textCellEditor',

+ 339 - 0
src/main/webapp/WEB-INF/views/ocm/ExtmallSettleRegisterForm.html

@@ -0,0 +1,339 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : GoodsSettleForm.html
+ * @desc    : 상품정산 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.10.22   gagamel     최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		
+		<!-- 검색조건 영역 -->
+		<div class="panelStyle">
+			<form id="searchForm" name="searchForm" action="#" th:action="@{'/settle/goods/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+					</colgroup>
+					<tr>
+						<th>매출기간<i class="required" title="필수" aria-hidden="true"></i></th>
+						<td colspan="3" id="terms">
+						</td>
+						<th>유통구분</th>
+						<td>
+							<select name="distributionGb">
+								<option value="">[전체]</option>
+								<option th:if="${distributionGbList}" th:each="oneData, status : ${distributionGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<th>벤더/제휴몰</th>
+						<td>
+							<select name="vendorId" required="required" data-valid-name="벤더">
+								<option th:if="${vendorList}" th:each="oneData, status : ${vendorList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>/
+							<select name="extmallId">
+								<option value="">[전체]</option>
+								<option th:if="${extmallList}" th:each="oneData, status : ${extmallList}" th:value="${oneData.extmallId}" th:text="${'[' + oneData.extmallId + '] ' + oneData.extmallNm}"></option>
+							</select>
+						</td>
+						<th>공급업체</th>
+						<td>
+<!-- 							<select name="supplyCompCd"> -->
+<!-- 								<option value="">[전체]</option> -->
+<!-- 								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option> -->
+<!-- 							</select> -->
+							<input type="text" class="w100" name="supplyCompSearchTxt" id="supplyCompSearchTxt" maxlength="20"/>
+							<button type="button" class="btn icn" onclick="cfnOpenCompanyListPopup('fnSetSupplyCompInfo', 'M');"><i class="fa fa-search"></i></button>
+							<span id="supplyCompTxt"></span>
+							<input type="hidden" name="supplyCompList"/>
+						</td>
+						<th>브랜드</th>
+						<td>
+<!-- 							<select name="brandCd"> -->
+<!-- 								<option value="">[전체]</option> -->
+<!-- 							</select> -->
+							<input type="text" class="w100" name="brandSearchTxt" id="brandSearchTxt" maxlength="20" />
+							<button type="button" class="btn icn" onclick="cfnOpenBrandListPopup('fnSetBrandInfo', 'M');"><i class="fa fa-search"></i></button>
+							<!-- <input type="text" class="w100" name="brandCd" readonly="readonly"/> -->
+							<span id="brandTxt"></span>
+							<input type="hidden" name="brandList"/>
+						</td>
+					</tr>
+				</table>
+				
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
+						<button type="button" class="btn btn-gray btn-lg" id="btnInit">초기화</button>
+					</li>
+				</ul>
+			</form>
+		</div>
+		<!-- 검색조건 영역 -->
+
+		<!-- 리스트 영역 -->
+		<div class="panelStyle">
+			<ul class="panelBar">
+				<li>
+					<button type="button" class="btn btn-default btn-lg" onclick="fnExcelDownLoad();">엑셀다운로드</button>
+				</li>
+				<li class="right">
+					검색결과 : <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: 470px" class="ag-theme-balham"></div>
+
+			<ul class="panelBar">
+				<li class="center">
+					<div class="tablePaging" id="invoiceListPagination"></div>
+				</li>
+			</ul>
+		</div>
+		<!-- //리스트 영역 -->
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let vendorList = gagajf.convertToArray([[${vendorList}]]);
+	let extmallList = gagajf.convertToArray([[${extmallList}]]);
+	let supplyCompList = gagajf.convertToArray([[${supplyCompList}]]);
+	let distributionGbList = gagajf.convertToArray([[${distributionGbList}]]);
+
+	let columnDefs = [
+		{ headerName: "주문번호", field: "ordNo", width: 100, cellClass: 'text-center' },
+		{ headerName: "주문상세번호", field: "ordDtlNo", width: 150, cellClass: 'text-center' },
+		{ headerName: "몰구분", field: "mallGbNm", width: 100, cellClass: 'text-center' },
+		{ headerName: "제휴몰주문번호", field: "extmallOrderId", width: 150, cellClass: 'text-center' },
+		{ headerName: "제휴몰명", field: "extmallNm", width: 150, cellClass: 'text-center' },
+// 		{
+// 			headerName: "공급업체", field: "supplyCompCd", width: 100, cellClass: 'text-center',
+// 			valueGetter: function (params) {
+// 				return gagaAgGrid.lookupValue(supplyCompList, params.data.supplyCompCd);
+// 			}
+// 		},
+		{ headerName: "공급업체", field: "supplyCompNm", width: 150, cellClass: 'text-center' },
+// 		{
+// 			headerName: "유통구분", field: "distributionGb", width: 100, cellClass: 'text-center',
+// 			valueGetter: function (params) {
+// 				return gagaAgGrid.lookupValue(distributionGbList, params.data.distributionGb);
+// 			}
+// 		},
+		{ headerName: "유통구분", field: "distributionGbNm", width: 100, cellClass: 'text-center'},
+		{ headerName: "정산주기", field: "settleDayNm", width: 100, cellClass: 'text-center' },
+		{ headerName: "주문일시", field: "ordDt", width: 150, cellClass: 'text-center' },
+		{ headerName: "정산구분", field: "settleGbNm", width: 100, cellClass: 'text-center' },
+		{ headerName: "발생(출고/회수)일시", field: "occurDt", width: 150, cellClass: 'text-center' },
+		{ headerName: "상품코드", field: "goodsCd", width: 120, cellClass: 'text-center' },
+		{ headerName: "상품명", field: "goodsNm", width: 300 },
+		{ headerName: "브랜드", field: "brandEnm", width: 100, cellClass: 'text-center' },
+		{ headerName: "담당MD", field: "mdNm", width: 100, cellClass: 'text-center' },
+		{ headerName: "단품코드", field: "itemCd", width: 120, cellClass: 'text-center' },
+		{ headerName: "옵션", field: "optCd1", width: 100, cellClass: 'text-center' },
+		{
+			headerName: "판매가", field: "sellPrice", width: 100, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }
+		},
+		{
+			headerName: "판매수량", field: "sellQty", width: 100, cellClass: 'text-center',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); },
+			cellStyle : function(params) { if (Number(params.value) < 0) return { 'color' : 'red' } }
+		},
+		{
+			headerName: "판매총액", field: "sellAmt", width: 100, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); },
+			cellStyle : function(params) { if (Number(params.value) < 0) return { 'color' : 'red' } }
+		},
+		{
+			headerName: "즉시사용쿠폰금액", field: "cpn1DcAmt", width: 120, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }
+		},
+		{
+			headerName: "상품쿠폰사용금액", field: "goodsCpnDcAmt", width: 120, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }
+		},
+		{
+			headerName: "주문서쿠폰사용금액", field: "cartCpnDcAmt", width: 130, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }
+		},
+		{
+			headerName: "포인트사용금액", field: "pntDcAmt", width: 120, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }
+		},
+		{
+			headerName: "다다익선할인금액", field: "tmtbDcAmt", width: 120, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }
+		},
+		{
+			headerName: "상품권사용금액", field: "gfcdUseAmt", width: 120, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }
+		},	
+		{
+			headerName: "자사쿠폰분담액", field: "selfCpnDcAmt", width: 120, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }
+		},
+		{
+			headerName: "입점쿠폰분담액", field: "supplyCompCpnDcAmt", width: 120, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }
+		},
+		{
+			headerName: "실판매가", field: "realSellPrice", width: 100, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }
+		},
+		{
+			headerName: "상품총액", field: "realSellAmt", width: 100, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); },
+			cellStyle : function(params) { if (Number(params.value) < 0) return { 'color' : 'red' } }
+		},
+		{
+			headerName: "판매수수료율(%)", field: "sellFeeRate", width: 120, cellClass: 'text-center',
+			cellRenderer: function (params) { return params.value + '%'; }
+		},
+		{
+			headerName: "수수료", field: "sellFeeAmt", width: 100, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); },
+			cellStyle : function(params) { if (Number(params.value) < 0) return { 'color' : 'red' } }
+		},
+		{
+			headerName: "정산대상액", field: "settleAmt", width: 100, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); },
+			cellStyle : function(params) { if (Number(params.value) < 0) return { 'color' : 'red' } }
+		}
+	];
+
+	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	
+	
+	// 벤더 콤보박스 변경 시
+	$('#searchForm select[name=vendorId]').on('change', function() {
+		$.getJSON('/renderer/vendor/extmall/list/' + $(this).val()
+				, function(result, status) {
+					if (status == 'success') {
+						$('#searchForm select[name=extmallId]').empty().append('<option value="">[전체]</option>');
+						$.each(result, function(idx, data) {
+							var optionHtml = '<option value="' + data.cd + '">[' + data.cd + '] '+ data.cdNm + '</option>\n';
+							$('#searchForm select[name=extmallId]').append(optionHtml);
+						});
+					}
+				});
+	});
+	
+	// 업체 조회 팝업에서 호출
+	var fnSetSupplyCompInfo = function(result) {
+		var arrSupplyComp = [];
+		var supplyCompTxt = "";
+		var sIndex = 0;
+		$('#supplyCompTxt').html('');
+		$('#searchForm input[name=supplyCompSearchTxt]').val('');
+		
+		result.forEach(function(supplyComp) {
+			sIndex++; 
+			arrSupplyComp.push(supplyComp.supplyCompCd);
+		});
+
+		// 조회 값이 하나일 경우 화면에 코드 노출. 그 외는 갯수 처리 
+		if (sIndex == 1) {
+			$('#searchForm input[name=supplyCompSearchTxt]').val(arrSupplyComp[0]);
+		} else {
+			supplyCompTxt = sIndex + " 개";
+			$('#supplyCompTxt').html(supplyCompTxt);
+		}
+		
+		var jsonData = JSON.stringify(arrSupplyComp);
+		$("#searchForm input[name=supplyCompList]").val(jsonData);
+	}
+	
+	// 브랜드 조회 팝업에서 호출
+	var fnSetBrandInfo = function(result) {
+		var arrbrandCd = [];
+		var brandTxt = "";
+		var bIndex = 0;
+		$('#brandTxt').html('');
+		$('#searchForm input[name=brandSearchTxt]').val('');
+		
+		result.forEach(function(brand){
+			bIndex++; 
+			arrbrandCd.push(brand.brandCd);
+		});
+
+		// 조회 값이 하나일 경우 화면에 코드 노출. 그 외는 갯수 처리 
+		if (bIndex == 1) {
+			$('#searchForm input[name=brandSearchTxt]').val(arrbrandCd[0]);
+		} else {
+			brandTxt = bIndex + " 개";
+			$('#searchForm').find('#brandTxt').html(brandTxt);
+		}
+		
+		var jsonData = JSON.stringify(arrbrandCd);
+		$("#searchForm input[name=brandList]").val(jsonData);
+	}
+	
+	// 검색
+	$('#btnSearch').on('click', function() {
+		// 입력 값 체크
+		if (!gagajf.validation($('#searchForm')))
+			return false;
+		
+		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
+	});
+	
+	// 초기화 클릭시
+	$('#btnInit').on('click', function() {
+		$('#searchForm')[0].reset();
+		$('#searchForm input[name=brandList]').val('');
+		$('#searchForm input[name=supplyCompList]').val('');
+		$('#brandTxt').html('');
+		$('#supplyCompTxt').html('');
+	});
+	
+	// 엑셀다운로드
+	$('#btnExcel').on('click', function() {
+		gagaAgGrid.exportToExcel('상품정산 목록', gridOptions);
+	});
+	
+	$(document).ready(function() {
+		cfnCreateCalendar('#terms', 'salesStdt', 'salesEddt', true, '매출');
+		$('.btnToday').trigger('click');
+		
+		$('#extmallVendor').hide();
+		
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+	});
+/*]]>*/
+</script>
+
+</html>

+ 7 - 6
src/main/webapp/WEB-INF/views/order/CnclReqForm.html

@@ -1229,6 +1229,12 @@ $(document).ready(function() {
 	} else {
 		fnBindOrderRfAccountInfo();
 	}
+
+	// 네이버페이 주문형일 경우 취소 접수, 완료 버튼 hide
+	if(pgGb == "NAVER_ORDER") {
+		$("#cnclReqBtn").css("display", "none");
+		$("#cnclCompleteBtn").css("display", "none");
+	}
 	
 	// 5. 취소신청, 취소완료, 취소승인, 취소철회 버튼 제어
 	if (ordChgSq > 0 && chgStat != 'G685_40') {
@@ -1241,14 +1247,9 @@ $(document).ready(function() {
 		// 교환배송미출고대상
 		if (chgStat == 'G685_40') {
 			$("#cnclReqBtn").css("display", "none");
+			$("#cnclCompleteBtn").css("display", "inline-block");		// 교환배송미출고 대상에서 왔을 경우 취소완료버튼 노출(네이버페이도 노출을 위해 추가) - xodud1202 21.07.27
 		}
 	}
-
-	// 네이버페이 주문형일 경우 취소 접수, 완료 버튼 hide
-	if(pgGb == "NAVER_ORDER") {
-		$("#cnclReqBtn").css("display", "none");
-		$("#cnclCompleteBtn").css("display", "none");
-	}
 	
 	// 6. 취소사유 선택
 	if (ordChgSq > 0 && chgStat != 'G685_40') {

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

@@ -13,6 +13,7 @@
  * 1.0  2020.11.16   jsh77b       최초 작성
  *******************************************************************************
  -->
+ 
 <div class="modalPopup" data-width="1500" data-height="700"> <!-- data-width="1500" data-height="870" -->
 	<div class="panelStyle">
 		<div class="panelTitle">
@@ -88,6 +89,93 @@
 					</tbody>
 				</table>
 				<!-- //TABLE -->
+				
+				<!-- 
+				<h4>주문결제내역</h4>
+				<table class="frmStyle">
+					<colgroup>
+						<col width="">
+						<col width="">
+						<col width="">
+						<col width="">
+					</colgroup>
+					<thead>
+						<tr>
+							<th style="height:30px;">구분</th>
+							<th style="height:30px;">항목</th>
+							<th style="height:30px;">합계</th>
+							<th style="height:30px;">내역</th>
+						</tr>
+					</thead>
+					<tbody>
+						<tr>
+							<td style="height:25px;">상품 금액</td>
+							<td>총 상품 금액</td>
+							<td>15,000원</td>
+							<td></td>
+						</tr>
+						<tr>
+							<td rowspan="2">할인 내역</td>
+							<td>상품할인</td>
+							<td>-60,000원</td>
+							<td style="line-height:25px;">
+								<div style="height:25px;"><span>다다익선 할인 : </span><span>-60,000원</span></div>
+								<div style="height:25px;"><span>선포인트 할인 : </span><span>-60,000원</span></div>
+							</td>
+						</tr>
+						<tr>
+							<td>쿠폰할인</td>
+							<td>-60,000원</td>
+							<td style="line-height:25px;">
+								<div style="height:25px;"><span>즉시할인쿠폰 : </span><span>-60,000원</span></div>
+								<div style="height:25px;"><span>주문서상품쿠폰 : </span><span>-60,000원</span></div>
+								<div style="height:25px;"><span>장바구니쿠폰 : </span><span>-60,000원</span></div>
+							</td>
+						</tr>
+						<tr>
+							<td>배송비</td>
+							<td>배송비합계</td>
+							<td>+ 6,000원</td>
+							<td style="line-height:25px;">
+								<div style="height:25px;"><span>배송비 : </span><span>-60,000원</span></div>
+								<div style="height:25px;"><span>배송비쿠폰 : </span><span>-60,000원</span></div>
+							</td>
+						</tr>
+						<tr>
+							<td rowspan="5">총 결제 금액</td>
+							<td style="height:25px;">총 매출액</td>
+							<td>70,000원</td>
+							<td>15,000P 적립</td>
+						</tr>
+						<tr>
+							<td style="height:25px;">실 결제액</td>
+							<td>70,000원</td>
+							<td>신용카드(현대)</td>
+						</tr>
+						<tr>
+							<td style="line-height:25px;">
+								<div style="height:25px;">제휴할인결제액</div>
+								<div style="height:25px;">(KCP쿠폰+포인트)</div>
+							</td>
+							<td>70,000원</td>
+							<td style="line-height:25px;">
+								<div style="height:25px;"><span>제휴쿠폰 : </span><span>-60,000원</span></div>
+								<div style="height:25px;"><span>마일리지 : </span><span>-60,000원</span></div>
+							</td>
+						</tr>
+						<tr>
+							<td style="height:25px;">포인트 결제액</td>
+							<td>70,000P</td>
+							<td></td>
+						</tr>
+						<tr>
+							<td style="height:25px;">상품권 결제액</td>
+							<td>70,000P</td>
+							<td></td>
+						</tr>
+					</tbody>
+				</table>
+				 -->
 									
 				<h4>주문상품정보</h4>
 				<div id="gridOrderGoodsInfo" style="width:100%; height:200px;" class="ag-theme-balham"></div>

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

@@ -173,9 +173,9 @@
 						<td>
 							<input type="text" name="orderNm" placeholder="" maxlength="20"/>
 						</td>
-						<th>고객ID</th>
+						<th>주문자이메일</th>
 						<td>
-							<input type="text" name="custId" placeholder="" maxlength="20"/>
+							<input type="text" name="ordEmail" placeholder="" maxlength="20"/>
 						</td>
 						<th>주문자휴대폰번호</th>
 						<td>
@@ -206,7 +206,6 @@
 							<select name="searchDateGb">
 								<option value="ordDt">주문일자</option>
 								<option value="delvStdt">출고일자</option>
-								<option value="soldoutDt">품절일자</option>
 							</select>
 							<span id="terms"></span>
 						</td>
@@ -556,10 +555,11 @@ var fnExcelUpoadCallback = function (data) {
 // 초기화 클릭시
 $('#btnInit').on('click', function() {
 	$('#searchForm')[0].reset();
-	$("#multiBrand").empty();
-	$("#searchForm #supplyCompText").text("");
-	$("#searchForm #supplyCompText").text();
-	$('#searchForm input[name=brandText]').val('');
+	
+	$("#searchForm #supplyCompSearchTxt").text("");
+	$("#searchForm #brandText").text("");
+	
+	$('#searchForm input[name=brandList]').val('');
 	$('#searchForm input[name=supplyCompList]').val('');
 });
 

+ 57 - 6
src/main/webapp/WEB-INF/views/settle/GoodsSettleForm.html

@@ -100,17 +100,42 @@
 			</form>
 		</div>
 		<!-- 검색조건 영역 -->
-
+		
+		<!-- 정산확정 영역 (정산담당자, 수퍼관리자, 어드민관리자 권한) -->
+		<div class="panelStyle" th:if="${sessionInfo.roleCd == 'G001_A106' or sessionInfo.roleCd == 'G001_0000' or sessionInfo.roleCd == 'G001_A000'}">
+			<ul class="panelBar">
+				<li class="center">
+					<h3><strong>정산기준월</strong> : </h3>
+					<input type="text" class="schMonth w60" name="settleYm" id="settleYm" maxlength="7"/>
+					<button type="button" class="btn icn schBtn" data-id="settleYm"><i class="fa fa-calendar" aria-hidden="true"></i></button>
+					<button type="button" class="btn btn-base btn-lg" id="btnConfirmSettle">정산확정</button>
+					<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>[정산확정] 버튼 클릭 시 해당월의 업체별 정산 데이터가 재확정됩니다.</span>
+				</li>
+			</ul>
+		</div>
+		<!--/// 정산확정 영역 -->
+		
 		<!-- 리스트 영역 -->
 		<div class="panelStyle">
 			<!-- 버튼 배치 영역 -->
 			<ul class="panelBar">
 				<li class="left">
-					<span class="infoTxt cBlue">
-						<i class="fa fa-info-circle" aria-hidden="true"></i><strong>1.상품총액</strong>: 실판매가 * 판매수량<br/>
-						<i class="fa fa-info-circle" aria-hidden="true"></i><strong>2.수수료</strong>: 상품총액(쿠폰할인금액과 다다익선할인금액만 차감. 포인트와 상품권은 포함) * 판매수수료율(%)<br/>
-						<i class="fa fa-info-circle" aria-hidden="true"></i><strong>3.정산대상액</strong>: 상품총액 - 수수료
-					</span>
+					<span class="infoTxt cBlue">* 항목 설명</span>
+					<!-- 아이콘 툴팁 -->
+					<div class="iconTooltip marL10">
+						<i class="fa fa-info" aria-hidden="true"></i>
+						<span class="left" style="width: 600px;">
+							<strong>1.상품총액</strong>: 실판매가 * 판매수량<br/>
+							<strong>2.수수료</strong>: 상품총액(쿠폰할인금액과 다다익선할인금액만 차감. 포인트와 상품권은 포함) * 판매수수료율(%)<br/>
+							<strong>3.정산대상액</strong>: 상품총액 - 수수료
+						</span>
+					</div>
+					<!-- //아이콘 툴팁 -->
+<!-- 					<span class="infoTxt cBlue"> -->
+<!-- 						<i class="fa fa-info-circle" aria-hidden="true"></i><strong>1.상품총액</strong>: 실판매가 * 판매수량<br/> -->
+<!-- 						<i class="fa fa-info-circle" aria-hidden="true"></i><strong>2.수수료</strong>: 상품총액(쿠폰할인금액과 다다익선할인금액만 차감. 포인트와 상품권은 포함) * 판매수수료율(%)<br/> -->
+<!-- 						<i class="fa fa-info-circle" aria-hidden="true"></i><strong>3.정산대상액</strong>: 상품총액 - 수수료 -->
+<!-- 					</span> -->
 				</li>
 				<li class="right">
 					<button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
@@ -158,6 +183,10 @@
 		{ headerName: "담당MD", field: "mdNm", width: 100, cellClass: 'text-center' },
 		{ headerName: "단품코드", field: "itemCd", width: 120, cellClass: 'text-center' },
 		{ headerName: "옵션", field: "optCd1", width: 100, cellClass: 'text-center' },
+		{
+			headerName: "몰판매가", field: "mallPrice", width: 100, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }
+		},
 		{
 			headerName: "판매가", field: "sellPrice", width: 100, cellClass: 'text-right',
 			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }
@@ -326,6 +355,27 @@
 		$('#supplyCompTxt').html('');
 	});
 	
+	// 정산확정
+	$('#btnConfirmSettle').on('click', function() {
+		if (gagajf.isNull($('#settleYm').val())) {
+			mcxDialog.alertC('정산기준월을 입력해 주세요.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$('#settleYm').focus();
+				}
+			});
+			return;
+		}
+		
+		mcxDialog.confirm('정산확정을 하시면 업체별 정산 데이터가 생성됩니다.<br/>' + $('#settleYm').val() + '월의 정산을 확정하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				gagajf.ajaxJsonSubmit('/settle/confirm/save/' + $('#settleYm').val(), null);
+			}
+		});
+	});
+	
 	// 엑셀다운로드
 	$('#btnExcel').on('click', function() {
 		gagaAgGrid.exportToExcel('상품정산 목록', gridOptions);
@@ -334,6 +384,7 @@
 	$(document).ready(function() {
 		cfnCreateCalendar('#terms', 'salesStdt', 'salesEddt', true, '매출');
 		$('.btnToday').trigger('click');
+		$('#settleYm').val((new Date()).before(0, 1, 0).format("YYYY-MM"));
 		
 		$('#extmallVendor').hide();
 		

+ 89 - 61
src/main/webapp/WEB-INF/views/settle/SettleConfirmForm.html

@@ -31,33 +31,22 @@
 				<table class="frmStyle" aria-describedby="검색조건">
 					<colgroup>
 						<col style="width:10%;"/>
-						<col style="width:60%;"/>
+						<col style="width:25%;"/>
 						<col style="width:10%;"/>
 						<col/>
 					</colgroup>
 					<tr>
-						<th>매출기간<i class="required" title="필수" aria-hidden="true"></i></th>
-						<td id="terms">
-						</td>
-						<th>유통구분</th>
+						<th>정산기준월<i class="required" title="필수" aria-hidden="true"></i></th>
 						<td>
-							<select name="distributionGb">
-								<option value="">[전체]</option>
-								<option th:if="${distributionGbList}" th:each="oneData, status : ${distributionGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
+							<input type="text" class="schMonth w60" name="settleYm" id="settleYm" maxlength="7"/>
+							<button type="button" class="btn icn schBtn" data-id="settleYm"><i class="fa fa-calendar" aria-hidden="true"></i></button>
 						</td>
-					</tr>
-					<tr>
-						<th>공급업체/브랜드</th>
-						<td colspan="3">
+						<th>공급업체</th>
+						<td>
 							<select name="supplyCompCd">
 								<option value="">[전체]</option>
 								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 							</select>
-							/
-							<select name="brandCd">
-								<option value="">[전체]</option>
-							</select>
 						</td>
 					</tr>
 				</table>
@@ -90,58 +79,102 @@
 
 <script th:inline="javascript">
 /*<![CDATA[*/
-	let supplyCompList = gagajf.convertToArray([[${supplyCompList}]]);
-	let distributionGbList = gagajf.convertToArray([[${distributionGbList}]]);
-	let bankList = gagajf.convertToArray([[${bankList}]]);
+// 	let supplyCompList = gagajf.convertToArray([[${supplyCompList}]]);
+// 	let distributionGbList = gagajf.convertToArray([[${distributionGbList}]]);
+// 	let bankList = gagajf.convertToArray([[${bankList}]]);
 	
 	let columnDefs = [
-		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+// 		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+// 		{
+// 			headerName: "정산확정", field: "confirmYn", width: 100, cellClass: 'text-center',
+// 			cellRenderer: function(params) {
+// 				if (params.value == 'Y') {
+// 					return '<button type="button" class="btn btn-success btn-sm">확정</button>';
+// 				} else {
+// 					return '<button type="button" class="btn btn-danger btn-sm">해제</button>';
+// 				}
+// 			}
+// 		},
+		{ headerName: "공급업체코드", field: "supplyCompCd", width: 100, cellClass: 'text-center', hide: true },
+		{ headerName: "공급업체", field: "supplyCompNm", width: 200 },
+		{ headerName: "전자계약여부", field: "econtractYn", width: 100, cellClass: 'text-center' },
+		{ headerName: "사업자등록번호", field: "bizNo", width: 120, cellClass: 'text-center' },
+		{ headerName: "정산주기", field: "settleDay", width: 100, cellClass: 'text-center', hide:true },
+		{ headerName: "정산주기", field: "settleDayNm", width: 100, cellClass: 'text-center' },
 		{
-			headerName: "정산확정", field: "confirmYn", width: 100, cellClass: 'text-center',
-			cellRenderer: function(params) {
-				if (params.value == 'Y') {
-					return '<button type="button" class="btn btn-success btn-sm">확정</button>';
-				} else {
-					return '<button type="button" class="btn btn-danger btn-sm">해제</button>';
-				}
-			}
+			headerName: "판매수량", field: "sellQty", width: 100, cellClass: 'text-center',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); },
+			cellStyle : function(params) { if (Number(params.value) < 0) return { 'color' : 'red' } }
 		},
 		{
-			headerName: "공급업체", field: "supplyCompCd", width: 100, cellClass: 'text-center',
-			valueGetter: function (params) {
-				return gagaAgGrid.lookupValue(supplyCompList, params.data.supplyCompCd);
-			}
+			headerName: "판매총액", field: "sellAmt", width: 100, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); },
+			cellStyle : function(params) { if (Number(params.value) < 0) return { 'color' : 'red' } }
+		},
+		{
+			headerName: "수수료", field: "sellFeeAmt", width: 100, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); },
+			cellStyle : function(params) { if (Number(params.value) < 0) return { 'color' : 'red' } }
+		},
+		{
+			headerName: "쿠폰할인금액", field: "cpnDcAmt", width: 100, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); },
+			cellStyle : function(params) { if (Number(params.value) < 0) return { 'color' : 'red' } }
+		},
+		{
+			headerName: "자사쿠폰분담액", field: "selfCpnDcAmt", width: 120, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); },
+			cellStyle : function(params) { if (Number(params.value) < 0) return { 'color' : 'red' } }
+		},
+		{
+			headerName: "입점쿠폰분담액", field: "supplyCompCpnDcAmt", width: 120, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); },
+			cellStyle : function(params) { if (Number(params.value) < 0) return { 'color' : 'red' } }
+		},
+		{
+			headerName: "계산서발행금액", field: "billAmt", width: 120, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); },
+			cellStyle : function(params) { if (Number(params.value) < 0) return { 'color' : 'red' } }
+		},
+		{
+			headerName: "공급가액", field: "supplyAmt", width: 100, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); },
+			cellStyle : function(params) { if (Number(params.value) < 0) return { 'color' : 'red' } }
+		},
+		{
+			headerName: "세액", field: "taxAmt", width: 100, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); },
+			cellStyle : function(params) { if (Number(params.value) < 0) return { 'color' : 'red' } }
+		},
+		{
+			headerName: "배송비", field: "delvFee", width: 100, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); },
+			cellStyle : function(params) { if (Number(params.value) < 0) return { 'color' : 'red' } }
 		},
-		{ headerName: "전자계약여부", field: "econtractYn", width: 100, cellClass: 'text-center' },
-		{ headerName: "사업자등록번호", field: "bizNo", width: 120, cellClass: 'text-center' },
-		{ headerName: "정산주기", field: "settleDay", width: 100, cellClass: 'text-center' },
-		{ headerName: "판매수량", field: "sellQty", width: 100, cellClass: 'text-center' },
-		{ headerName: "판매총액", field: "sellAmt", width: 100, cellClass: 'text-right' },
-		{ headerName: "수수료", field: "sellFeeAmt", width: 100, cellClass: 'text-right' },
-		{ headerName: "쿠폰할인금액", field: "cpnDcAmt", width: 100, cellClass: 'text-right' },
-		{ headerName: "자사쿠폰분담액", field: "selfCpnDcAmt", width: 120, cellClass: 'text-right' },
-		{ headerName: "입점쿠폰분담액", field: "supplyCompCpnDcAmt", width: 120, cellClass: 'text-right' },
-		{ headerName: "계산서발행금액", field: "billAmt", width: 120, cellClass: 'text-right' },
-		{ headerName: "공급가액", field: "supplyAmt", width: 100, cellClass: 'text-right' },
-		{ headerName: "세액", field: "taxAmt", width: 100, cellClass: 'text-right' },
-		{ headerName: "배송비", field: "delvFeeAmt", width: 100, cellClass: 'text-right' },
 		{
 			headerName: "기타차감", field: "etcDeductAmt", width: 100, cellClass: 'text-right',
 			editable: true, cellEditor: 'numericCellEditor', cellEditorParams: { maxlength: 12, validType: 'integer' },
-			cellRenderer: function(params) { return gagajf.isNull(params.value) ? 0 : params.value.addComma(); },
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); },
 			cellStyle: { color: '#fffff', 'background-color': '#aaaaff' }
 		},
-		{ headerName: "지급금액", field: "giveAmt", width: 100, cellClass: 'text-right' },
+		{
+			headerName: "지급금액", field: "giveAmt", width: 100, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); },
+			cellStyle : function(params) { if (Number(params.value) < 0) return { 'color' : 'red' } }
+		},
 		{
 			headerName: "미수금", field: "receivableAmt", width: 100, cellClass: 'text-right',
 			editable: true, cellEditor: 'numericCellEditor', cellEditorParams: { maxlength: 12, validType: 'integer' },
-			cellRenderer: function(params) { return gagajf.isNull(params.value) ? 0 : params.value.addComma(); },
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); },
 			cellStyle: { color: '#fffff', 'background-color': '#aaaaff' }
 		},
-		{ headerName: "총지급금액", field: "totGiveAmt", width: 100, cellClass: 'text-right' },
-		
 		{
-			headerName: "상태", field: "settleStat", width: 100, cellClass: 'text-center',
+			headerName: "총지급금액", field: "totGiveAmt", width: 100, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); },
+			cellStyle : function(params) { if (Number(params.value) < 0) return { 'color' : 'red' } }
+		},
+		{
+			headerName: "상태", field: "settleStat", width: 100, cellClass: 'text-center'/* ,
 			cellRenderer: function (params) {
 				// 전자계약이 안 되어 있으면 "보류"
 				// 전자계약은 되어 있으나 지급금액 < 0 이면 "미수금" 그 외는 "정상"
@@ -154,14 +187,10 @@
 				}
 				
 				return '정상';
-			}
-		},
-		{
-			headerName: "은행", field: "bankCd", width: 100, cellClass: 'text-center',
-			valueGetter: function (params) {
-				return gagaAgGrid.lookupValue(bankList, params.data.bankCd);
-			}
+			} */
 		},
+		{ headerName: "은행코드", field: "bankCd", width: 100, cellClass: 'text-center', hide: true },
+		{ headerName: "은행", field: "bankNm", width: 100, cellClass: 'text-center' },
 		{ headerName: "계좌번호", field: "accountNo", width: 150, cellClass: 'text-center' },
 		{ headerName: "예금주명", field: "depositorNm", width: 100, cellClass: 'text-center' },
 		{ headerName: "계산서이메일", field: "billEmail", width: 100, cellClass: 'text-center' }
@@ -188,8 +217,7 @@
 	});
 	
 	$(document).ready(function() {
-		cfnCreateCalendar('#terms', 'startDt', 'endDt', true, '매출');
-		$('.btnToday').trigger('click');
+		$('#settleYm').val((new Date()).before(0, 1, 0).format("YYYY-MM"));
 		
 		// Create a agGrid
 		gagaAgGrid.createGrid('gridList', gridOptions);

+ 95 - 1
src/main/webapp/WEB-INF/views/shoplinker/ShoplinkerOrderForm.html

@@ -154,7 +154,27 @@
 				<ul class="panelBar">
 					<li>
 						<button type="button" class="btn btn-default btn-lg" onclick="fnExcelDownLoad();">엑셀다운로드</button>
+						<button type="button" class="btn btn-default btn-lg" onclick="fnExcelExtmallUploadForm();">엑셀다운로드(제휴몰주문업로드 폼)</button>
+						<button type="button" class="btn btn-success btn-lg" id="btnSave">실패사유변경</button>
+						
+						&nbsp;&nbsp;&nbsp;가용재고 실패사유&nbsp;
+						<!-- 아이콘 툴팁 -->
+						<div class="iconTooltip">
+							<i class="fa fa-info" aria-hidden="true"></i>
+							<span class="left aL" style="width:430px;">
+								<em>* 실패사유가 "가용재고없음"인 경우 참고내용 *</em><br/><br/>
+								1. 품절입니다<br/>
+								&nbsp;&nbsp;&nbsp;&nbsp;→ 상품상태가 일시품절(G008_70)인 건<br/>
+								2. 판매중인 상품이 아닙니다.<br/>
+								&nbsp;&nbsp;&nbsp;&nbsp;→ 상품상태가 일시품절도 아니고, 승인완료도 아닌건<br/>
+								3. "단품코드" 옵션은 품절입니다<br/>
+								&nbsp;&nbsp;&nbsp;&nbsp;→ tb_option 결품여부가 Y인 경우<br/>
+								4. 옵션의 재고가 충분하지 않습니다.<br/>
+								&nbsp;&nbsp;&nbsp;&nbsp;→ 가용재고가 적을 때 ( ex 주문수량 3개 중 재고가 1개밖에 없을 때)
+							</span>
+						</div>
 					</li>
+
 					<li class="right">
 						검색결과 : <strong><span id="gridRowTotalCount">0</span> 건</strong>&nbsp;
 						쪽번호 <span id="pgNo">0</span>/ <strong id="endPgNo">0</strong>&nbsp;&nbsp;
@@ -198,6 +218,7 @@
 	let uploadFailList = gagajf.convertToArray([[${uploadFailList}]]);
 
 	let 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('searchForm',params.node.rowIndex, 'A');}
 		},
@@ -242,7 +263,7 @@
 				}
 			}
 		},
-		{headerName: "쇼핑몰 주문번호", field: "extmallOrderId", width: 130, cellClass: 'text-center'},
+		{headerName: "쇼핑몰 주문번호", field: "mallOrderId", width: 130, cellClass: 'text-center'},
 		{headerName: "쇼핑몰 명", field: "mallName", width: 130, cellClass: 'text-center'},
 		{headerName: "배송상태[발주확인]", field: "baesongStatus", width: 130, cellClass: 'text-center'},
 		{headerName: "주문 상품번호", field: "orderProductId", width: 130, cellClass: 'text-center'},
@@ -265,6 +286,7 @@
 			cellEditor: 'textCellEditor',
 			cellEditorParams: { maxlength: 14, validType: 'numeric'}
 		},
+		{headerName: "옵션코드", field: "skuMatchCode", width: 130, cellClass: 'text-center'},
 		{headerName: "옵션명", field: "sku", width: 130, cellClass: 'text-center'},
 		{headerName: "주문수집일자", field: "orderRegDate", width: 150, cellClass: 'text-center',
 			cellRenderer: function(params) {
@@ -275,6 +297,9 @@
 	];
 
 	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+	// 중복 선택 가능
+	gridOptions.rowSelection = 'multiple';
+ 	gridOptions.suppressRowClickSelection = true;
 
 	// Cell click
 	gridOptions.onCellClicked = function(event) {
@@ -420,6 +445,75 @@
 	}
 	/**************** 엑셀다운로드 // *****************************************************/
 
+	/**************** 제휴몰 주문업로드 형식 엑셀다운로드 *****************************************************/
+	var fnExcelExtmallUploadForm = function(){
+		var formId = '#searchForm';
+		if (gridOptions.api.getDisplayedRowCount() <= 0){
+			mcxDialog.alert("조회된 데이터가 없습니다.<br/>다시 조회 후 다운로드 받으세요.");
+			return;
+		}
+
+		var fromDate = parseInt($('#searchForm input[name=stDate]').val().replaceAll("-", ""));
+		var toDate =parseInt($('#searchForm input[name=edDate]').val().replaceAll("-", ""));
+		if( 4 < (toDate - fromDate)){
+			mcxDialog.alert("주문수집일자를 3일 이내의 기간으로 설정 후 다운로드해주세요.");
+			return;
+		}
+
+		var params =  $(formId).serialize();
+		$('#ExcelList').attr({ href : '/shoplinker/order/excel/extmall_form_list?' + params }).get(0).click();
+	}
+	/**************** 제휴몰 주문업로드 형식 엑셀다운로드 // *****************************************************/
+
+	/**************** 실패사유변경 *****************************************************/
+	$("#btnSave").on("click", function(){
+		var rowData = gagaAgGrid.getAllRowData(gridOptions);
+		var dataArr = [];
+		var bool = true;
+		
+		var selectedData = gridOptions.api.getSelectedRows();
+
+		if (selectedData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return false;
+		}else if (selectedData.length > 100) {
+			mcxDialog.alert('100개 이하로 선택해주세요.');
+			return false;
+		}
+
+		selectedData.forEach(function(row){
+			
+			if( row.uploadStat == "G021_40" && row.uploadFailCd == "G022_60"){
+				var data = { 
+						 mallId : row.mallId
+						 , shoplinkerOrderId : row.shoplinkerOrderId
+						 , mallOrderId : row.mallOrderId
+				}
+				dataArr.push(data);
+				
+			}else{
+				bool = false;
+			}
+		});
+		
+		if( !bool ){
+			mcxDialog.alert('변경할 수 없는 행이 선택되어있습니다. 해제 후 다시 시도해주세요.<br>(실패사유가 가용재고없음인 경우만 변경가능)');
+			return false;
+		}
+		
+		var msg = "실패사유가 [가용재고없음]인 건은 이미 고객에게 알림톡이 발송된 건으로, <br>제휴몰주문업로드가 불가능한 상태를 가능한 상태로 변경하는 기능입니다.<br>저장 시 실패사유가 변경되고, 해당 샵링커정보로 제휴몰 주문업로드를 할 수 있습니다.";
+		mcxDialog.confirm(msg,{
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var jsonData = JSON.stringify(dataArr);
+				//console.log(jsonData);
+				gagajf.ajaxJsonSubmit('/shoplinker/order/change/saveFailFlag', jsonData, fnGoodsListSearch);
+			}
+		});
+	});
+	/**************** 실패사유변경 저장 // *****************************************************/
+	
 	$(document).ready(function() {
 
 		cfnCreateCalendar('#terms', 'stDate', 'edDate', true, '수집');

+ 5 - 1
src/main/webapp/WEB-INF/views/system/MenuForm.html

@@ -360,7 +360,11 @@
 		// 다중Select에 권한 표시
 		cfnShowMultiSelectedValue($('#detailForm select[name=roleCd]'), rowData.roleCds);
 		
-		$('#detailForm textarea[name=menuDesc]').val(rowData.menuDesc.replaceAll('&lt;','<').replaceAll('&gt;','>'));
+		if (!gagajf.isNull(rowData.menuDesc)) {
+			$('#detailForm textarea[name=menuDesc]').val(rowData.menuDesc.replaceAll('&lt;','<').replaceAll('&gt;','>'));
+		} else {
+			$('#detailForm textarea[name=menuDesc]').val('');
+		}
 		$('#detailForm input[name=menuUrl]').val(rowData.menuUrl);
 		$('#detailForm input[name=dispOrd]').val(rowData.dispOrd);
 		

+ 3 - 3
src/main/webapp/WEB-INF/views/withdraw/WithdrawExceptionListForm.html

@@ -152,7 +152,7 @@
 	var columnDefs = [
 		{headerName: "반품예외처리번호",		field: "recallExceptionNo", width: 50,	cellClass: 'text-center', hide: true},
 		//{headerName: "No.",				field: "rnum",				width: 50,	cellClass: 'text-center'},
-		{headerName: "",			field: "recall",		width: 100,	cellClass: 'text-center',
+		{headerName: "처리완료",			field: "recall",		width: 100,	cellClass: 'text-center',
 			/*
 			rowSpan: params => params.data.rowspanRank === 1 ? params.data.rowspanCnt : 1,  
 		    cellClassRules: {
@@ -455,7 +455,7 @@
 		//if(params.data.chgStat == 'G685_21' || params.data.chgStat == 'G685_51'){
 			
 		
-		if (event.colDef.field == 'recallStatNm'){
+		if (event.colDef.field == 'recall'){
 			if(event.data.chgStat == "G685_21" || event.data.chgStat == "G685_51"){
 				return;
 			}
@@ -475,7 +475,7 @@
 					}
 				});
 			}
-		} else if(event.colDef.field == 'chgReason'){
+		} else if(event.colDef.field == 'chgReason2'){
 			//if(event.data.recallStat == "P" && event.data.rowspanRank == "1" && event.data.chgStat != null){
 			console.log(event.recallStat);
 			console.log(event.data.chgStat);