Kaynağa Gözat

Merge branch 'develop' into card007

card007 5 yıl önce
ebeveyn
işleme
bbf90d3c15
67 değiştirilmiş dosya ile 1701 ekleme ve 526 silme
  1. 22 0
      src/main/java/com/style24/front/biz/dao/TsfCommonDao.java
  2. 10 0
      src/main/java/com/style24/front/biz/dao/TsfGoodsDao.java
  3. 25 0
      src/main/java/com/style24/front/biz/service/TsfCommonService.java
  4. 27 31
      src/main/java/com/style24/front/biz/service/TsfCounselService.java
  5. 11 6
      src/main/java/com/style24/front/biz/service/TsfCustomerService.java
  6. 54 1
      src/main/java/com/style24/front/biz/service/TsfGoodsService.java
  7. 1 1
      src/main/java/com/style24/front/biz/service/TsfPlanningService.java
  8. 18 0
      src/main/java/com/style24/front/biz/thirdparty/SearchEngineDiquest.java
  9. 142 5
      src/main/java/com/style24/front/biz/web/TsfCustomerController.java
  10. 9 0
      src/main/java/com/style24/front/biz/web/TsfDisplayController.java
  11. 0 10
      src/main/java/com/style24/front/biz/web/TsfIndexController.java
  12. 1 2
      src/main/java/com/style24/persistence/domain/Goods.java
  13. 4 3
      src/main/java/com/style24/persistence/domain/GoodsStock.java
  14. 3 1
      src/main/java/com/style24/persistence/domain/Poll.java
  15. 27 0
      src/main/java/com/style24/persistence/domain/SupplyCompany.java
  16. 1 0
      src/main/java/com/style24/persistence/domain/searchengine/PlanningResponse.java
  17. 28 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfCommon.xml
  18. 1 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfCustomer.xml
  19. 1 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfFaq.xml
  20. 36 17
      src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml
  21. 14 9
      src/main/java/com/style24/persistence/mybatis/shop/TsfPlanning.xml
  22. 5 3
      src/main/java/com/style24/persistence/mybatis/shop/TsfPoint.xml
  23. 6 1
      src/main/java/com/style24/persistence/mybatis/shop/TsfReview.xml
  24. 7 2
      src/main/webapp/WEB-INF/views/mob/SigninFormMob.html
  25. 24 9
      src/main/webapp/WEB-INF/views/mob/SnsCallBackFormMob.html
  26. 12 3
      src/main/webapp/WEB-INF/views/mob/callcenter/GoodsQnaFormMob.html
  27. 12 3
      src/main/webapp/WEB-INF/views/mob/callcenter/OneToOneQnaFormMob.html
  28. 8 2
      src/main/webapp/WEB-INF/views/mob/customer/ConsentUseInfoFormMob.html
  29. 26 5
      src/main/webapp/WEB-INF/views/mob/customer/JoinFormMob.html
  30. 1 1
      src/main/webapp/WEB-INF/views/mob/customer/PrivacyPolicyLayerFormMob.html
  31. 343 0
      src/main/webapp/WEB-INF/views/mob/customer/SnsJoinFormMob.html
  32. 102 0
      src/main/webapp/WEB-INF/views/mob/customer/SupplyCompanyLayerFormMob.html
  33. 4 1
      src/main/webapp/WEB-INF/views/mob/goods/CardPrmtFormMob.html
  34. 1 1
      src/main/webapp/WEB-INF/views/mob/goods/GoodsDealDescFormMob.html
  35. 27 10
      src/main/webapp/WEB-INF/views/mob/goods/GoodsDealDetailFormMob.html
  36. 5 5
      src/main/webapp/WEB-INF/views/mob/goods/GoodsDetailFormMob.html
  37. 0 1
      src/main/webapp/WEB-INF/views/mob/mypage/MypageGiftcardFormMob.html
  38. 2 2
      src/main/webapp/WEB-INF/views/mob/mypage/MypagePointFormMob.html
  39. 4 2
      src/main/webapp/WEB-INF/views/mob/mypage/MypageReviewFormMob.html
  40. 28 5
      src/main/webapp/WEB-INF/views/mob/order/OrderAddPaymentFormMob.html
  41. 1 1
      src/main/webapp/WEB-INF/views/mob/order/OrderCompleteMob.html
  42. 31 29
      src/main/webapp/WEB-INF/views/mob/order/OrderFormMob.html
  43. 1 1
      src/main/webapp/WEB-INF/views/mob/planning/PlanningEventAttendFormMob.html
  44. 23 13
      src/main/webapp/WEB-INF/views/mob/planning/PlanningEventPollFormMob.html
  45. 6 0
      src/main/webapp/WEB-INF/views/mob/popup/DelvAddrAddPopMob.html
  46. 12 1
      src/main/webapp/WEB-INF/views/mob/popup/DelvAddrModifyPopMob.html
  47. 13 8
      src/main/webapp/WEB-INF/views/web/SigninFormWeb.html
  48. 12 3
      src/main/webapp/WEB-INF/views/web/callcenter/GoodsQnaFormWeb.html
  49. 11 2
      src/main/webapp/WEB-INF/views/web/callcenter/OneToOneQnaFormWeb.html
  50. 8 2
      src/main/webapp/WEB-INF/views/web/customer/ConsentUseInfoFormWeb.html
  51. 26 6
      src/main/webapp/WEB-INF/views/web/customer/JoinFormWeb.html
  52. 13 8
      src/main/webapp/WEB-INF/views/web/customer/JoinTypeFormWeb.html
  53. 51 238
      src/main/webapp/WEB-INF/views/web/customer/PrivacyPolicyFormWeb.html
  54. 245 0
      src/main/webapp/WEB-INF/views/web/customer/SnsJoinFormWeb.html
  55. 101 0
      src/main/webapp/WEB-INF/views/web/customer/SupplyCompanyLayerFormWeb.html
  56. 8 4
      src/main/webapp/WEB-INF/views/web/display/SearchGoodsListFormWeb.html
  57. 2 2
      src/main/webapp/WEB-INF/views/web/goods/GoodsDealDetailFormWeb.html
  58. 6 2
      src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html
  59. 1 1
      src/main/webapp/WEB-INF/views/web/goods/GoodsReviewDetailFormWeb.html
  60. 1 1
      src/main/webapp/WEB-INF/views/web/mypage/MypageCustModifyFormWeb.html
  61. 32 43
      src/main/webapp/WEB-INF/views/web/order/OrderFormWeb.html
  62. 3 3
      src/main/webapp/WEB-INF/views/web/planning/PlanningEventAttendFormWeb.html
  63. 10 10
      src/main/webapp/WEB-INF/views/web/planning/PlanningEventPollFormWeb.html
  64. 5 0
      src/main/webapp/WEB-INF/views/web/popup/DelvAddrAddPopWeb.html
  65. 4 0
      src/main/webapp/WEB-INF/views/web/popup/DelvAddrModifyPopWeb.html
  66. 14 0
      src/main/webapp/biz/customer.js
  67. 9 6
      src/main/webapp/ux/style24_link.js

+ 22 - 0
src/main/java/com/style24/front/biz/dao/TsfCommonDao.java

@@ -1,11 +1,14 @@
 package com.style24.front.biz.dao;
 
+import com.style24.persistence.domain.SupplyCompany;
 import org.springframework.stereotype.Repository;
 
 import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.InflowHst;
 import com.style24.persistence.domain.Order;
 
+import java.util.Collection;
+
 /**
  * 공통 Dao
  *
@@ -91,4 +94,23 @@ public interface TsfCommonDao {
 	 */
 	String getSearchEngineSyncYn();
 
+	/**
+	 * 공급업체 총 건수
+	 *
+	 * @return int - 건수
+	 * @author jsshin
+	 * @since 2021. 06. 10
+	 */
+	int getSupplyCompanyCount();
+
+	/**
+	 * 공급업체 목록
+	 *
+	 * @param supplyCompany - 페이징 정보
+	 * @return Collection<SupplyCompany> - 목록
+	 * @author jsshin
+	 * @since 2021. 06. 10
+	 */
+	Collection<SupplyCompany> getSupplyCompanyList(SupplyCompany supplyCompany);
+
 }

+ 10 - 0
src/main/java/com/style24/front/biz/dao/TsfGoodsDao.java

@@ -248,6 +248,16 @@ public interface TsfGoodsDao {
 	 */
 	Delivery getGoodsDeliveryInfo(String goodsCd);
 
+	/**
+	 * 상품 다다익선 시퀀스 목록
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @date 2021. 6. 10
+	 */
+	Collection<Tmtb> getTmtbSqList(Goods goods);
+	
 	/**
 	 * 상품 다다익선 목록
 	 *

+ 25 - 0
src/main/java/com/style24/front/biz/service/TsfCommonService.java

@@ -1,5 +1,6 @@
 package com.style24.front.biz.service;
 
+import com.style24.persistence.domain.SupplyCompany;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
@@ -14,6 +15,8 @@ import com.style24.persistence.domain.Order;
 
 import lombok.extern.slf4j.Slf4j;
 
+import java.util.Collection;
+
 /**
  * 공통 Service
  *
@@ -121,4 +124,26 @@ public class TsfCommonService {
 		return commonDao.getSearchEngineSyncYn();
 	}
 
+	/**
+	 * 공급업체 총 건수
+	 *
+	 * @return int - 건수
+	 * @author jsshin
+	 * @since 2021. 06. 10
+	 */
+	public int getSupplyCompanyCount() {
+		return commonDao.getSupplyCompanyCount();
+	}
+
+	/**
+	 * 공급업체 목록
+	 *
+	 * @param supplyCompany - 페이징 정보
+	 * @return Collection<SupplyCompany> - 목록
+	 * @author jsshin
+	 * @since 2021. 06. 10
+	 */
+	public Collection<SupplyCompany> getSupplyCompanyList(SupplyCompany supplyCompany) {
+		return commonDao.getSupplyCompanyList(supplyCompany);
+	}
 }

+ 27 - 31
src/main/java/com/style24/front/biz/service/TsfCounselService.java

@@ -59,41 +59,37 @@ public class TsfCounselService {
 			String[] sysItem = counsel.getSysFileNmArr();
 			
 			for (int i = 0; i < orgItem.length; i++) {
-				String imgInd = String.valueOf(ind);
-				if (ind < 10) {
-					imgInd = "0" + imgInd;
+				if (orgItem[i] != "") {
+					String imgInd = String.valueOf(ind);
+					if (ind < 10) {
+						imgInd = "0" + imgInd;
+					}
+					String planUploadPath = env.getProperty("upload.default.target.path");
+					String yearMonth = GagaDateUtil.getToday().substring(0, 6);
+					planUploadPath = GagaFileUtil.getConcatenationPath(planUploadPath, "/counsel");
+					File newFile = new File(GagaFileUtil.getConcatenationPath(planUploadPath, sysItem[i]));
+					planUploadPath = GagaFileUtil.getConcatenationPath(planUploadPath, yearMonth);
+					String newFilename = "COUNSEL_" + GagaDateUtil.getTodayDateTime() + "_" + imgInd + "." + org.springframework.util.StringUtils.getFilenameExtension(sysItem[i]);
+					File uniqueFile = GagaFileUtil.getUniqueFile(new File(GagaFileUtil.getConcatenationPath(planUploadPath, newFilename)));
+					// Rename a file
+					File path = new File(planUploadPath);
+					if (!path.exists()) {
+						path.mkdir();
+					}
+					newFile.renameTo(uniqueFile);
+					
+					if (i == 0) {
+						counsel.setOrgFileNm1(orgItem[i]);
+						counsel.setSysFileNm1("/counsel/" + yearMonth + "/" + newFilename);
+					}else {
+						counsel.setOrgFileNm2(orgItem[i]);
+						counsel.setSysFileNm2("/counsel/" + yearMonth + "/" + newFilename);
+					}
+					ind++;
 				}
-				String planUploadPath = env.getProperty("upload.default.target.path");
-				String yearMonth = GagaDateUtil.getToday().substring(0, 6);
-				planUploadPath = GagaFileUtil.getConcatenationPath(planUploadPath, "/counsel");
-				File newFile = new File(GagaFileUtil.getConcatenationPath(planUploadPath, sysItem[i]));
-				planUploadPath = GagaFileUtil.getConcatenationPath(planUploadPath, yearMonth);
-				String newFilename = "COUNSEL_" + GagaDateUtil.getTodayDateTime() + "_" + imgInd + "." + org.springframework.util.StringUtils.getFilenameExtension(sysItem[i]);
-				File uniqueFile = GagaFileUtil.getUniqueFile(new File(GagaFileUtil.getConcatenationPath(planUploadPath, newFilename)));
-				// Rename a file
-				File path = new File(planUploadPath);
-				if (!path.exists()) {
-					path.mkdir();
-				}
-				newFile.renameTo(uniqueFile);
-				
-				if (i == 0) {
-					counsel.setOrgFileNm1(orgItem[i]);
-					counsel.setSysFileNm1("/counsel/" + yearMonth + "/" + newFilename);
-				}else {
-					counsel.setOrgFileNm2(orgItem[i]);
-					counsel.setSysFileNm2("/counsel/" + yearMonth + "/" + newFilename);
-				}
-				
-				ind++;
 			}
-			
 			counselDao.updateOneToOneQna(counsel);
 		}
-		
-
-		
-		
 	}
 
 	/**

+ 11 - 6
src/main/java/com/style24/front/biz/service/TsfCustomerService.java

@@ -406,7 +406,8 @@ public class TsfCustomerService {
 		}
 
 		if (StringUtils.isBlank(custSnsInfo.getCi())) {
-			throw new IllegalStateException("연계정보 값이 없습니다. 고객센터에 문의하시기 바랍니다.");
+			resultMap.setString("custStat","EMPTY_CI_CUST");
+			return resultMap;
 		}
 
 		// 2. CI(연계정보)로 가입 되어져 있는 고객이 확인
@@ -425,10 +426,6 @@ public class TsfCustomerService {
 			}
 
 			if (TscConstants.CustStat.ACTIVE.value().equals(custInfo.getCustStat())) {
-				if (StringUtils.isBlank(custSnsInfo.getCellPhnno())) { // 휴대폰 정보가 없음 - 회원가입 페이지 이동(ID/PW 제외)
-					resultMap.setString("custStat", "EMPTY_PHONE_CUST");
-					return resultMap;
-				}
 				custInfo.setSnsId(custSnsInfo.getSnsId());
 				custInfo.setSnsType(custSnsInfo.getSnsType());
 				customerDao.createCustomerSns(custInfo);
@@ -526,9 +523,17 @@ public class TsfCustomerService {
 	public GagaMap generalCustomerValidation(Customer customer) {
 		GagaMap resultMap = new GagaMap();
 		String maskingCustId;
+		String custId;
+
+		if (StringUtils.isNotBlank(customer.getSnsType()) && StringUtils.isNotBlank(customer.getSnsId())) {
+			String snsId = customer.getSnsType().equals(TscConstants.SnsType.YES24.value()) ? customer.getMemNo() : customer.getSnsId();
+			custId = customer.getSnsType() + "_" + snsId;
+		} else {
+			custId = customer.getCustId();
+		}
 
 		// 1. 아이디 확인
-		boolean boolCustId = getCustomerFindByCustIdCount(customer.getCustId());
+		boolean boolCustId = getCustomerFindByCustIdCount(custId);
 		if (boolCustId) {
 			maskingCustId = getMaxCustIdById(customer.getCustId());
 			resultMap.setBoolean("isPossibe", false);

+ 54 - 1
src/main/java/com/style24/front/biz/service/TsfGoodsService.java

@@ -572,7 +572,60 @@ public class TsfGoodsService {
 	 * @date 2021. 3. 8
 	 */
 	public Collection<Goods> getTmtbGoodsList(Goods goods) {
-		return goodsDao.getTmtbGoodsList(goods);
+		goods.setArrTmtbSq(null);		// 배열 사용하여 진행시에 IN절에 걸려 query timeout 걸려 null처리
+		Collection<Goods> result = new ArrayList<Goods>();
+			
+		Collection<Tmtb> tmtbSqList = goodsDao.getTmtbSqList(goods);
+		if (tmtbSqList == null || tmtbSqList.isEmpty()) {
+			return result;
+		}
+		log.info("[tmtbSqList]={}",tmtbSqList);
+		log.info("[goods]={}",goods);
+		int rCount = 0;	//다다익선 조회수
+		int tCount = goods.getMaxRownum();	//리턴 잔여수
+		if (tCount == 0) tCount = 20;
+		
+		for (Tmtb tmtb: tmtbSqList) {
+			
+			goods.setTmtbSq(tmtb.getTmtbSq());
+			Collection<Goods> tmtbGoodsList = goodsDao.getTmtbGoodsList(goods);
+			if (tmtbGoodsList == null || tmtbGoodsList.isEmpty()) {
+				continue;
+			}
+			
+			if (tCount <= 0) { //잔여수가 없으면 종료
+				break;
+			}
+			
+			//다다익선 조회 상품 수
+			rCount = tmtbGoodsList.size();
+			
+			if (tCount > rCount) { 	//조회수보다 잔여수가 클경우
+				result.addAll(tmtbGoodsList);
+				tCount = tCount - rCount; //남은 잔여수 계산
+			}else {
+				if (tCount == rCount) {	//잔여 수량과 조회수가 같은면 종료
+					result.addAll(tmtbGoodsList);
+					break;
+				}else {
+					
+					for (int i=0; i<tCount; i++) {  //잔여수량만큼 loop
+						int tmtbGoodsListCnt = 0;
+						for(Goods tmtbGoods: tmtbGoodsList) {
+							if (i == tmtbGoodsListCnt) {
+								result.add(tmtbGoods);
+								tCount --;
+								break;
+							}
+							tmtbGoodsListCnt ++;
+						}
+					}
+				}
+				
+			}
+		}
+		
+		return result;
 	}
 
 	/**

+ 1 - 1
src/main/java/com/style24/front/biz/service/TsfPlanningService.java

@@ -530,7 +530,7 @@ public class TsfPlanningService {
 		int custNo = TsfSession.getInfo().getCustNo();
 		plan.setCustNo(custNo);
 		plan.setEntryCustNo(custNo);
-		plan.setEntryVal1("Y");
+		plan.setEntryVal2("Y");
 		planningDao.saveAttendEntry(plan);
 	}
 

+ 18 - 0
src/main/java/com/style24/front/biz/thirdparty/SearchEngineDiquest.java

@@ -4,9 +4,12 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.List;
+import java.util.Arrays;
 
 import javax.annotation.PostConstruct;
 
+import com.gagaframework.web.parameter.GagaMap;
 import org.json.simple.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
@@ -210,6 +213,12 @@ public class SearchEngineDiquest {
 		paramMap.put("adminPort", port);
 		paramMap.put("pageNumber", String.valueOf(params.getPageNo()));
 		paramMap.put("rowsPerPage", String.valueOf(params.getPageSize()));
+		paramMap.put("brandGroupArr", getStringArray(params.getBrandGroupArr()));
+		paramMap.put("sizeArr", getStringArray(params.getSizeArr()));
+		paramMap.put("ageArr", getStringArray(params.getAgeArr()));
+		paramMap.put("seasonArr", getStringArray(params.getSeasonArr()));
+		paramMap.put("colorArr", getStringArray(params.getColorArr()));
+		paramMap.put("benefitArr", getStringArray(params.getBenefitArr()));
 		log.info("///[getGoodsList] paramMap: {}", paramMap);
 
 		try {
@@ -228,6 +237,15 @@ public class SearchEngineDiquest {
 		return result;
 	}
 
+	private String[] getStringArray (String[] arr){
+		String[] arry = null;
+		if(arr != null){
+			List<String> lst = new ArrayList<String>(Arrays.asList(arr));
+			arry = lst.toArray(new String[lst.size()]);
+		}
+		return arry;
+	}
+
 	/**
 	 * 기획전 목록
 	 * @param keyword - 검색어

+ 142 - 5
src/main/java/com/style24/front/biz/web/TsfCustomerController.java

@@ -4,8 +4,12 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
 
 import com.style24.core.biz.service.TscMailService;
+import com.style24.front.biz.service.TsfCommonService;
 import com.style24.front.biz.service.TsfCouponService;
+import com.style24.persistence.TscPageRequest;
+import com.style24.persistence.domain.Clause;
 import com.style24.persistence.domain.Coupon;
+import com.style24.persistence.domain.SupplyCompany;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -67,6 +71,9 @@ public class TsfCustomerController extends TsfBaseController {
 	@Autowired
 	private Yes24Login yes24Login;
 
+	@Autowired
+	private TsfCommonService commonService;
+
 	/**
 	 * 아이디 찾기 화면
 	 *
@@ -351,7 +358,9 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 02. 05
 	 */
 	@RequestMapping("/join/form")
-	public ModelAndView getJoinForm(@RequestParam(value = "sEncData", required = false) String sEncData, @RequestParam(value = "authMethod", required = false) String authMethod, @RequestParam(value = "custParams", required = false) String custParams) {
+	public ModelAndView getJoinForm(@RequestParam(value = "sEncData", required = false) String sEncData
+			, @RequestParam(value = "authMethod", required = false) String authMethod
+			, @RequestParam(value = "custParams", required = false) String custParams) {
 
 		ModelAndView mav = new ModelAndView();
 
@@ -364,6 +373,37 @@ public class TsfCustomerController extends TsfBaseController {
 		return mav;
 	}
 
+	/**
+	 * SNS 가입 시도시 휴대폰 정보 없을시 호출
+	 *
+	 * @return ModelAndView
+	 * @author jsshin
+	 * @since 2021. 06. 08
+	 */
+	@RequestMapping("/sns/join/form")
+	public ModelAndView getSnsJoinForm(@RequestParam(value = "sEncData", required = false) String sEncData
+			, @RequestParam(value = "authMethod", required = false) String authMethod
+			, @RequestParam(value = "custParams", required = false) String custParams, HttpSession session) {
+		ModelAndView mav = new ModelAndView();
+		CustSnsInfo custSnsInfo = (CustSnsInfo)session.getAttribute("custSnsInfo");
+		session.removeAttribute("custSnsInfo"); //세션 지움
+		if (StringUtils.isBlank(custParams)) {
+			if (custSnsInfo == null) {
+				mav.setViewName("redirect:/customer/join/type/form");
+				return mav;
+			}
+		}
+
+		mav.addObject("sEncData", sEncData);
+		mav.addObject("authMethod", authMethod);
+		mav.addObject("custParams", custParams);
+		mav.addObject("custSnsInfo", custSnsInfo);
+
+		mav.setViewName(super.getDeviceViewName("customer/SnsJoinForm"));
+
+		return mav;
+	}
+
 	/**
 	 * 휴대폰 인증 화면
 	 * @param redirectUrl - 모바일사용
@@ -538,6 +578,12 @@ public class TsfCustomerController extends TsfBaseController {
 		GagaMap result = new GagaMap();
 
 		GagaMap authInfo = niceCertify.getCertifyCellPhoneResultInfo(customer);
+		if (StringUtils.isNotBlank(customer.getCi())) {
+			log.info("ci ====> {}, sCi ======> {}", customer.getCi(), authInfo.getString("sCi"));
+			if (!customer.getCi().equals(authInfo.getString("sCi"))) {
+				throw new IllegalStateException("SNS 연계정보와 본인인증 연계정보가 다릅니다.");
+			}
+		}
 		customer.setCi(authInfo.getString("sCi"));
 		customer.setCellPhnno(authInfo.getString("sMobileNo"));
 
@@ -573,7 +619,7 @@ public class TsfCustomerController extends TsfBaseController {
 	}
 
 	/**
-	 * 가입처리
+	 * 일반 가입처리
 	 *
 	 * @param customer - 고객정보
 	 * @param request - 자동로그인
@@ -628,6 +674,63 @@ public class TsfCustomerController extends TsfBaseController {
 		return result;
 	}
 
+	/**
+	 * SNS 회원 가입처리
+	 * 고객 소셜 로그인 후 휴대전화정보가 없을때 해당 로직 사용됨
+	 *
+	 * @param customer - 고객정보
+	 * @param request - 자동로그인
+	 * @param session - 세션 저장된 내용삭제
+	 * @return GagaMap - 결과정보
+	 * @author jsshin
+	 * @since 2021. 02. 18
+	 */
+	@PostMapping("/sns/join/save")
+	@ResponseBody
+	public GagaMap saveSnsJoinCustomer(@RequestBody Customer customer, HttpServletRequest request, HttpSession session) {
+		GagaMap result = new GagaMap();
+
+		// 1.세션에 인코딩된 데이터를 가져온다.
+		String encData = TsfSession.getAttribute("encData");
+		customer.setEncData(encData);
+		session.removeAttribute("encData");
+
+		GagaMap authInfo = niceCertify.getCertifyCellPhoneResultInfo(customer);
+
+		// 2.인증통해 받은 데이터 매핑
+		customer.setSexGb(authInfo.getString("sGender"));
+		customer.setCustNm(authInfo.getString("sName"));
+		customer.setBirthYmd(authInfo.getString("sBirthDate"));
+		customer.setForeignerYn(authInfo.getString("sforeignerYn"));
+		customer.setCi(authInfo.getString("sCi"));
+
+		customer.setSiteCd(TscConstants.Site.STYLE24.value());
+		customer.setFrontGb(TsfSession.getFrontGb());
+		customer.setAfLinkCd(TsfSession.getAttribute("afLinkCd"));
+
+		// 3. 가입 가능여부
+		GagaMap resultMap = customerService.generalCustomerValidation(customer);
+		boolean isPossible = resultMap.getBoolean("isPossibe");
+
+		// 가능하지 않으면 바로 리턴
+		if (!isPossible) {
+			TsfSession.setAttribute("maskingCustId", resultMap.getString("maskingCustId"));
+			result.setBoolean("isJoin", false);
+			return resultMap;
+		}
+
+		// 4.고객정보 생성, SNS 정보 생성 및 혜택 처리
+		boolean isJoin = customerService.saveJoinCustomerSns(customer);
+
+		if (isJoin) {
+			customerService.getLogin(customer.getCustNo(), request);
+		}
+
+		result.setBoolean("isJoin", isJoin);
+
+		return result;
+	}
+
 	/**
 	 * 가입완료 페이지
 	 *
@@ -842,7 +945,7 @@ public class TsfCustomerController extends TsfBaseController {
 		ModelAndView mav = new ModelAndView(super.getDeviceViewName("customer/PrivacyPolicyForm"));
 
 		mav.addObject("clause", clauseService.getClause(TscConstants.Site.STYLE24.value(), "G057_11"));
-
+		mav.addObject("clauseList", clauseService.getClauseList(TscConstants.Site.STYLE24.value(), "G057_11"));
 		return mav;
 	}
 
@@ -929,6 +1032,19 @@ public class TsfCustomerController extends TsfBaseController {
 		return mav;
 	}
 
+	/**
+	 * 개인정보취급방침 정보
+	 *
+	 * @return Clause
+	 * @author jsshin
+	 * @since 2021. 06. 10
+	 */
+	@GetMapping("/privacy/policy/info/{clauseSq}")
+	@ResponseBody
+	public Clause getPrivacyPolicyInfo(@PathVariable Integer clauseSq) {
+		return clauseService.getPrivacyPolicyInfo(clauseSq);
+	}
+
 	/**
 	 * 공급업체목록 화면
 	 *
@@ -937,12 +1053,33 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 04. 01
 	 */
 	@PostMapping("/supply/company/layer")
-	public ModelAndView getSupplyCompanyLayer() {
+	public ModelAndView getSupplyCompanyLayer(HttpServletRequest request) {
 		ModelAndView mav = new ModelAndView();
-		mav.setViewName(super.getDeviceViewName("customer/SupplyComanyLayerForm"));
+		mav.addObject("mallGb", request.getParameter("mallGb"));
+		mav.setViewName(super.getDeviceViewName("customer/SupplyCompanyLayerForm"));
 		return mav;
 	}
 
+	/**
+	 * 공급업체목록
+	 *
+	 * @param supplyCompany
+	 * @return GagaMap
+	 * @author jsshin
+	 * @since 2021. 06. 10
+	 */
+	@PostMapping("/supply/company/list")
+	@ResponseBody
+	public GagaMap getSupplyCompanyList(@RequestBody SupplyCompany supplyCompany) {
+		GagaMap result = new GagaMap();
+		TscPageRequest pageable = new TscPageRequest((supplyCompany.getPageNo() > 0 ? supplyCompany.getPageNo() - 1 : 0), supplyCompany.getPageSize(), supplyCompany.getPageUnit());
+		pageable.setTotalCount(commonService.getSupplyCompanyCount());
+		supplyCompany.setPageable(pageable);
+		result.set("supplyCompanyList",commonService.getSupplyCompanyList(supplyCompany));
+		result.set("paging", supplyCompany);
+		return result;
+	}
+
 	/**
 	 * 개인정보위탁 화면
 	 *

+ 9 - 0
src/main/java/com/style24/front/biz/web/TsfDisplayController.java

@@ -9,6 +9,7 @@ import java.util.HashMap;
 
 import javax.servlet.http.HttpServletResponse;
 
+import com.style24.persistence.domain.searchengine.PlanningResponse;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.mobile.device.Device;
@@ -1033,6 +1034,7 @@ public class TsfDisplayController extends TsfBaseController {
 		params.setCustGb(TsfSession.getCustGb());
 
 		Collection<SearchEngine> dataList = new ArrayList<SearchEngine>();
+		Collection<SearchEngine> planList = new ArrayList<SearchEngine>();
 
 		log.info("getSearchGoodsList params::{}",params);
 		// 검색엔진 연동 여부
@@ -1041,6 +1043,12 @@ public class TsfDisplayController extends TsfBaseController {
 			GoodsListResponse response = diquest.getGoodsList(params);
 			pageable.setTotalCount(response.getTotalCount());
 			dataList = response.getResponse();
+
+			PlanningResponse responsePlan = diquest.getPlanningList(params.getKeyword(),params.getPageNo(),params.getPageSize());
+//			pageable.setTotalPlanCount(responsePlan.getTotalSize());
+//			planList = responsePlan.getResponse();
+
+			PlanningResponse responseEvent = diquest.getEventList(params.getKeyword(),params.getPageNo(),params.getPageSize());
 		} else { // DB를 통한 상품리스트 조회
 			pageable.setTotalCount(goodsService.getSearchGoodsCount(params));
 			params.setPageable(pageable);
@@ -1049,6 +1057,7 @@ public class TsfDisplayController extends TsfBaseController {
 
 		result.set("paging", pageable);
 		result.set("dataList", dataList);
+		result.set("planList", planList);
 
 		return result;
 	}

+ 0 - 10
src/main/java/com/style24/front/biz/web/TsfIndexController.java

@@ -278,11 +278,6 @@ public class TsfIndexController extends TsfBaseController {
 			}
 		}
 
-		// RememberMe 값이 있고 true이면
-		if (StringUtils.isNotBlank(TsfSession.getAttribute("rememberMe")) && Boolean.valueOf(TsfSession.getAttribute("rememberMe"))) {
-			userInfo.setBoolean("rememberMe", true);
-		}
-
 		mav.addObject("resultMap", resultMap);
 
 		mav.setViewName(super.getDeviceViewName("SnsCallBackForm"));
@@ -334,11 +329,6 @@ public class TsfIndexController extends TsfBaseController {
 			}
 		}
 
-		// RememberMe 값이 있고 true이면
-		if (StringUtils.isNotBlank(TsfSession.getAttribute("rememberMe")) && Boolean.valueOf(TsfSession.getAttribute("rememberMe"))) {
-			userInfo.setBoolean("rememberMe", true);
-		}
-
 		mav.addObject("resultMap", resultMap);
 		mav.setViewName(super.getDeviceViewName("SnsCallBackForm"));
 

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

@@ -1,7 +1,5 @@
 package com.style24.persistence.domain;
 
-import java.util.List;
-
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.style24.persistence.TscBaseDomain;
 
@@ -216,6 +214,7 @@ public class Goods extends TscBaseDomain {
 	private String icon;
 	private String benefits;
 	private String videos;			// 동영상들(,로 연결된 문자열. 동영상구분:미디어컨텐츠 또는 유튜브동영상ID, ...)
+	private int tmtbSq;
 
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] sizeArr;		// 상품사이즈

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

@@ -33,6 +33,7 @@ public class GoodsStock extends TscBaseDomain {
 	private int goodsQty;			// 안전재고
 	private int stockQty;			// 상품 재고
 	private String selfGoodsYn;		// 자사상품구분
+	private String giftPackYn;		// 선문주문가능여부
 	private String optNm;			// 옵션명
 	private String goodsStat;		// 상품상태
 	private int minOrdQty;
@@ -41,8 +42,8 @@ public class GoodsStock extends TscBaseDomain {
 	private String optCd1Nm;		// 옵션1칼라명(입점은 옵션명)
 	private String dispYn;			// 노출 여부
 	private int qty;				// 구성상품의 기본 수량
-	
+
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] arrGoodsOption;				
-	
+	private String[] arrGoodsOption;
+
 }

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

@@ -67,7 +67,9 @@ public class Poll extends TscBaseDomain{
 	private String voteDt;			// 투표일시
 	
 	private Integer custNo;			//고객번호
-	
+	private String mainPimg;
+	private String mainMimg;
+	private Integer planSq;
 	
 	
 	private String pollQsq_10;

+ 27 - 0
src/main/java/com/style24/persistence/domain/SupplyCompany.java

@@ -0,0 +1,27 @@
+package com.style24.persistence.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.style24.persistence.TscBaseDomain;
+
+import com.style24.persistence.TscPageRequest;
+import lombok.Data;
+
+/**
+ * 공급업체 Domain
+ *
+ * @author gagamel
+ * @since 2020. 10. 7
+ */
+@SuppressWarnings("serial")
+@Data
+public class SupplyCompany extends TscBaseDomain {
+
+	private String supplyCompCd;		// 공급업체코드
+	private String supplyCompNm;		// 공급업체명
+	private String ownerNm;
+
+	private TscPageRequest pageable;
+	private int pageNo = 1;
+	private int pageSize = 10;
+	private int pageUnit = 5;
+}

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

@@ -19,5 +19,6 @@ public class PlanningResponse implements Serializable {
 
 	private int totalSize;				// 기획전 전체 개수
 	private Collection<Plan> planList;	// 기획전 목록
+	private Collection<SearchEngine> response;
 
 }

+ 28 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsfCommon.xml

@@ -88,4 +88,32 @@
 		AND    CD = 'SEARCHSYNCYN'
 	</select>
 
+	<select id="getSupplyCompanyCount" resultType="int">
+		/* TsfCommon.getSupplyCompanyCount */
+		SELECT COUNT(*) AS CNT
+		FROM   TB_SUPPLY_COMPANY SC
+		     , TB_SUPPLY_VENDOR SV
+		WHERE  SC.SUPPLY_VENDOR_CD = SV.SUPPLY_VENDOR_CD
+		AND    SC.USE_YN = 'Y'
+	</select>
+
+	<select id="getSupplyCompanyList" parameterType="SupplyCompany" resultType="SupplyCompany">
+		/* TsfCommon.getSupplyCompanyList */
+		SELECT SUPPLY_COMP_CD
+		     , SUPPLY_COMP_NM
+		     , OWNER_NM
+		     , NUMB
+		FROM (
+		      SELECT SC.SUPPLY_COMP_CD       /*공급업체코드*/
+		           , SC.SUPPLY_COMP_NM       /*공급업체명*/
+		           , SV.OWNER_NM             /*대표자명*/
+		           , ROW_NUMBER() OVER(ORDER BY SV.REG_DT DESC)   AS NUMB
+		      FROM   TB_SUPPLY_COMPANY SC
+		           , TB_SUPPLY_VENDOR SV
+		      WHERE  SC.SUPPLY_VENDOR_CD = SV.SUPPLY_VENDOR_CD
+		      AND    SC.USE_YN = 'Y'
+		) ORIGINAL
+		WHERE NUMB BETWEEN #{pageable.startRow} AND #{pageable.endRow}
+	</select>
+
 </mapper>

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

@@ -382,6 +382,7 @@
 
 	<!--SNS 연동 계정 확인-->
 	<select id="getCusomterSnsFind" parameterType="CustSnsInfo" resultType="Customer">
+		/* TsfCustomer.getCusomterSnsFind */
 		SELECT C.CUST_NO
 		     , C.CUST_ID
 		     , C.CUST_NM

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

@@ -28,6 +28,7 @@
 		WHERE  SITE_CD = #{siteCd}
 		AND    USE_YN = 'Y'
 		ORDER  BY DISP_ORD
+		         ,REG_DT DESC
 		LIMIT 10
 	</select>
 	

+ 36 - 17
src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml

@@ -317,6 +317,7 @@
 		         , Y.MIN_ORD_QTY
 		         , Y.SELF_GOODS_YN
 		         , Y.GOODS_TYPE
+		         , Y.GIFT_PACK_YN
 		         , Y.SELL_STDT
 		         , Y.SELL_EDDT
 		    FROM (
@@ -326,6 +327,7 @@
 		              , IFNULL(B.DISP_ORD, 1)                AS DISP_ORD
 		              , IFNULL(B.COMPS_CURR_PRICE, A.CURR_PRICE) AS CURR_PRICE
 		              , A.SELF_GOODS_YN
+		              , A.GIFT_PACK_YN
 		         FROM TB_GOODS A
 		         LEFT OUTER JOIN TB_GOODS_COMPOSE B ON A.GOODS_CD = B.GOODS_CD
 		         WHERE A.GOODS_CD = #{mastrGoodsCd}
@@ -345,6 +347,7 @@
 		     , SOLDOUT_YN
 		     , DISP_ORD
 		     , SELF_GOODS_YN
+		     , GIFT_PACK_YN
 		     , CURR_PRICE
 		FROM (
 		      SELECT O.GOODS_CD
@@ -357,6 +360,7 @@
 		           , O.DISP_ORD
 		           , G.MIN_ORD_QTY
 		           , G.SELF_GOODS_YN
+		           , G.GIFT_PACK_YN
 		           , G.CURR_PRICE
 		      FROM TMP_GOODS G
 		      INNER JOIN TB_OPTION O ON G.GOODS_CD = O.GOODS_CD
@@ -486,6 +490,7 @@
 		     , G.LIST_PRICE
 		     , G.GOODS_STAT
 		     , G.SELF_GOODS_YN
+		     , G.GIFT_PACK_YN
 		     , DATE_FORMAT(G.SELL_STDT ,'%Y%m%d%H%i%S') AS SELL_STDT
 		     , DATE_FORMAT(G.SELL_EDDT ,'%Y%m%d%H%i%S') AS SELL_EDDT
 		     , FN_GET_APPLY_CPN1_PRICE(G.GOODS_CD, #{frontGb})  AS CURR_PRICE
@@ -502,6 +507,8 @@
 		     , GS.GOODS_QNA_CNT
 		FROM TB_GOODS_COMPOSE C
 		INNER JOIN TB_GOODS G ON C.COMPS_GOODS_CD = G.GOODS_CD
+		                      AND NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT	/*판매기간 확인*/
+		                      AND G.SELF_MALL_YN = 'Y' -- 자사몰 노출
 		INNER JOIN TB_GOODS_SUMMARY GS ON G.GOODS_CD = GS.GOODS_CD
 		INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
 		                      AND B.USE_YN = 'Y'
@@ -683,10 +690,9 @@
 		    LEFT OUTER JOIN (
 		                     SELECT GOODS_CD,
 		                            OPT_CD,
-		                            SUM((CASE SELL_GB
-		                                     WHEN '10' THEN 1
-		                                     WHEN '20' THEN -1
-		                                END) * SELL_QTY) AS SELL_QTY
+		                            SUM((CASE SELL_GB WHEN '10' THEN 1
+		                                              WHEN '20' THEN 1
+		                                              ELSE -1 END) * SELL_QTY) AS SELL_QTY
 		                     FROM TB_SELL_QTY
 		                     WHERE GOODS_CD = #{goodsCd}
 		                     AND OPT_CD = #{optCd}
@@ -714,7 +720,7 @@
 		    FROM (
 		             SELECT CASE
 		                        WHEN WMS_STOCK_QTY - SELL_QTY > 0 THEN WMS_STOCK_QTY - SELL_QTY
-		                        ELSE SELL_QTY - WMS_STOCK_QTY END AS WMS_STOCK_QTY
+		                        ELSE 0 END AS WMS_STOCK_QTY
 		                  , CASE
 		                        WHEN SELL_QTY - WMS_STOCK_QTY >= 0
 		                            THEN STORE_STOCK_QTY - (SELL_QTY - WMS_STOCK_QTY)
@@ -733,8 +739,8 @@
 		                                           OPT_CD,
 		                                           SUM((CASE SELL_GB
 		                                                    WHEN '10' THEN 1
-		                                                    WHEN '20' THEN -1
-		                                               END) * SELL_QTY) AS SELL_QTY
+		                                                    WHEN '20' THEN 1
+		                                                    ELSE -1 END) * SELL_QTY) AS SELL_QTY
 		                                    FROM TB_SELL_QTY
 		                                    WHERE GOODS_CD = #{goodsCd}
 		                                    AND OPT_CD = #{optCd}
@@ -819,6 +825,19 @@
 		LIMIT 1
 	</select>
 	
+	<!-- 상품 다다익선 시퀀스 목록 -->
+	<select id="getTmtbSqList" parameterType="Goods" resultType="Tmtb">
+		/* TsfGoods.getTmtbSqList */
+		SELECT A.TMTB_SQ
+		FROM TB_TMTB_APPLY_GOODS A
+		LEFT JOIN TB_TMTB_APPLY_GOODS B ON A.GOODS_CD = B.GOODS_CD
+		                                AND B.DEL_YN = 'N' AND B.GOODS_GB = 'G800_30' -- 제외상품
+		                                AND B.GOODS_CD =  #{goodsCd}
+		WHERE A.GOODS_CD = #{goodsCd}  AND A.DEL_YN = 'N' AND A.GOODS_GB IN ( 'G800_10', 'G800_20')  -- 기본과 적용상품
+		AND B.TMTB_SQ IS NULL
+		ORDER BY A.TMTB_SQ DESC -- 최근 다다익선
+	</select>	
+	
 	<!-- 상품 다다익선 목록 -->
 	<select id="getTmtbGoodsList" parameterType="Goods" resultType="Goods">
 		/* TsfGoods.getTmtbGoodsList */
@@ -868,17 +887,17 @@
 		                                 AND GS.STOCK_QTY > 0
 		    WHERE NOW() BETWEEN A.TMTB_ST_DT AND A.TMTB_ED_DT
 		    AND A.TMTB_STAT ='G232_11'
-		    <if test="arrTmtbSq != null and arrTmtbSq.length > 0">
+		    <choose>
+		    <when test="arrTmtbSq != null and arrTmtbSq.length > 0">
 		    AND A.TMTB_SQ IN
-				<foreach collection="arrTmtbSq" item="item" index="index"  open="(" close=")" separator=",">
-			#{item}
-				</foreach>
-			</if>
-		     <![CDATA[
-		    AND A.TMTB_SQ IN (SELECT TMTB_SQ FROM TB_TMTB_APPLY_GOODS WHERE GOODS_CD = #{goodsCd} AND DEL_YN = 'N' AND GOODS_GB IN ( 'G800_10', 'G800_20')) -- 기본과 적용상품
-		    AND A.TMTB_SQ NOT IN (SELECT TMTB_SQ FROM TB_TMTB_APPLY_GOODS WHERE GOODS_CD = #{goodsCd} AND DEL_YN = 'N' AND GOODS_GB = 'G800_30') -- 제외상품
-		     ]]>
-		    -- ORDER BY A.TMTB_SQ DESC
+		         <foreach collection="arrTmtbSq" item="item" index="index"  open="(" close=")" separator=",">
+		    #{item}
+		         </foreach>
+		    </when>
+		    <otherwise>
+		    AND A.TMTB_SQ = #{tmtbSq}
+		    </otherwise>
+		    </choose>
 		    ) Z
 		WHERE RNUM <![CDATA[<= ]]>#{maxRownum}
 		)

+ 14 - 9
src/main/java/com/style24/persistence/mybatis/shop/TsfPlanning.xml

@@ -1255,6 +1255,8 @@
 		      ,TP.FST_COM_YN 
 		      ,TP.PARTI_CNT 
 		      ,TP.POLL_CONTENT 
+		      ,P.MAIN_PIMG
+		      ,P.MAIN_MIMG
 		FROM TB_PLAN P INNER JOIN TB_POLL TP ON P.POLL_SQ = TP.POLL_SQ 
 		WHERE 1=1
 		  AND P.PLAN_SQ = #{planSq}
@@ -1502,20 +1504,23 @@
 		 AND DATE_FORMAT(ENTRY_DT, '%Y-%m-%d') = DATE_FORMAT(NOW(),'%Y-%m-%d')
 		 </if>
 		 AND ENTRY_CUST_NO = #{custNo}
+		 AND ENTRY_VAL2 = 'Y'
 	</select>
 	
 	<!-- 출석한 리스트 -->
 	<select id="getCustAttendEntryList" resultType="Plan" parameterType="Plan">
 		/* TsfPlanning.getCustAttendEntryList */	
-		SELECT PLAN_ENTRY_SQ 
-		      ,PLAN_SQ 
-		      ,ENTRY_CUST_NO 
-		      ,DATE_FORMAT(ENTRY_DT,'%e') AS ENTRY_DT 
-		FROM TB_PLAN_ENTRY
-		WHERE 1=1 
-		AND DATE_FORMAT(ENTRY_DT,'%Y-%m') IN (SELECT DATE_FORMAT(P.DISP_STDT, '%Y-%m')  FROM TB_PLAN P WHERE PLAN_SQ = #{planSq})
-		AND PLAN_SQ = #{planSq}
-		AND ENTRY_CUST_NO = #{custNo}
+		SELECT  PE.PLAN_ENTRY_SQ 
+		      , P.PLAN_SQ 
+		      , PE.ENTRY_CUST_NO 
+		      , DATE_FORMAT(PE.ENTRY_DT,'%e') AS ENTRY_DT 
+		      , PE.ENTRY_DT 
+		      , PE.ENTRY_VAL2
+		FROM TB_PLAN P INNER JOIN TB_PLAN_ENTRY PE
+		    ON P.PLAN_SQ = PE.PLAN_SQ 
+		WHERE P.PLAN_SQ = #{planSq}
+		AND   PE.ENTRY_CUST_NO = #{custNo}
+		AND   PE.ENTRY_VAL2 = 'Y'
 	</select>
 	
 	<select id="getAttendBenefitList" resultType="Plan" parameterType="Plan">

+ 5 - 3
src/main/java/com/style24/persistence/mybatis/shop/TsfPoint.xml

@@ -41,6 +41,7 @@
 		FROM   TB_CUST_POINT
 		WHERE  CUST_NO = #{custNo}
 		AND    EXP_BE_DT > NOW()
+		AND    GV_PNT_AMT > 0
 		AND    EXP_BE_DT <![CDATA[<]]> DATE_ADD(NOW(),INTERVAL 31 DAY)
 	</select>
 	
@@ -114,7 +115,7 @@
 		                  WHEN 'G069_13' THEN G.GOODS_NM
 		                 END                                          AS  OCCUR_DTL_DESC
 		           , SUM(CPH.PNT_AMT)
-		           , CPH.UPD_DT AS PNT_UPLOAD_DT
+		           , DATE_FORMAT(CPH.UPD_DT, '%Y.%m.%d %H:%i:%S') AS PNT_UPLOAD_DT
 		      FROM TB_CUST_POINT_HST CPH
 		      LEFT JOIN TB_ORDER_DETAIL OD
 		      ON  CPH.ORD_NO = OD.ORD_NO
@@ -210,7 +211,7 @@
 		                  WHEN 'G069_13' THEN G.GOODS_NM
 		                 END                                          AS  OCCUR_DTL_DESC
 		           , SUM(CPH.PNT_AMT)
-		           , CPH.UPD_DT AS PNT_UPLOAD_DT
+		           , DATE_FORMAT(CPH.UPD_DT, '%Y.%m.%d %H:%i:%S') AS PNT_UPLOAD_DT
 		      FROM TB_CUST_POINT_HST CPH
 		      LEFT JOIN TB_ORDER_DETAIL OD
 		      ON  CPH.ORD_NO = OD.ORD_NO
@@ -305,7 +306,7 @@
 		                  WHEN 'G069_13' THEN G.GOODS_NM
 		                 END                                          AS  OCCUR_DTL_DESC
 		           , SUM(CPH.PNT_AMT)
-		           , CPH.UPD_DT AS PNT_UPLOAD_DT
+		           , DATE_FORMAT(CPH.UPD_DT, '%Y.%m.%d %H:%i:%S') AS PNT_UPLOAD_DT
 		      FROM TB_CUST_POINT_HST CPH
 		      LEFT JOIN TB_ORDER_DETAIL OD
 		      ON  CPH.ORD_NO = OD.ORD_NO
@@ -354,6 +355,7 @@
 		               SELECT SUM(RM_PNT_AMT)
 		               FROM   TB_CUST_POINT
 		               WHERE  CUST_NO = C.CUST_NO
+		               AND    GV_PNT_AMT > 0
 		               AND    (EXP_BE_DT <![CDATA[<]]> NOW() OR EXP_CMP_DT IS NOT NULL)
 		               ), 0)                           AS EXPIRE_PNT_AMT -- 소멸포인트
 		     , IFNULL((

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

@@ -422,7 +422,7 @@
 				    ON B.BRAND_CD = G.BRAND_CD
 				 INNER JOIN TB_BRAND_GROUP BG
 		            ON B.BRAND_GROUP_NO = BG.BRAND_GROUP_NO
-				LEFT OUTER JOIN TB_COLOR C ON ODI.OPT_CD1 = C.COLOR_CD
+				 LEFT OUTER JOIN TB_COLOR C ON ODI.OPT_CD1 = C.COLOR_CD
 		                                   AND C.USE_YN = 'Y'
 				  WHERE 1=1
 				-- AND O.ORD_NO NOT IN (SELECT R.ORD_NO FROM TB_REVIEW R WHERE R.DEL_YN = 'N' AND DISP_YN = 'Y')
@@ -937,6 +937,7 @@
 		     , Z.ADM_RPL
 		     , Z.ADM_RPL_REG_NO
 		     , Z.ADM_RPL_DT
+		     , Z.SIZE_GB
 		     , ROW_NUMBER() OVER(ORDER BY Z.ORD_DT DESC) AS RNUM
 		       FROM (    
 		             SELECT O.ORD_NO
@@ -1001,6 +1002,7 @@
 		                   , DATE_FORMAT(R.UPD_DT , '%Y.%m.%d') AS UPD_DT
 		                   , R.ADM_RPL
 		                   , R.ADM_RPL_REG_NO
+		                   , I.SIZE_GB
 		                   , DATE_FORMAT(R.ADM_RPL_DT , '%Y.%m.%d') AS ADM_RPL_DT
 		                   , DATEDIFF( DATE_ADD(O.PAY_DT,INTERVAL   365 /**P*/ DAY),NOW()) AS REMAIN_DT -- 남은시간
 		    FROM TB_ORDER O
@@ -1017,6 +1019,8 @@
 		    INNER JOIN TB_BRAND_GROUP BG
 		      ON B.BRAND_GROUP_NO = BG.BRAND_GROUP_NO
 		   INNER JOIN TB_REVIEW R ON R.ORD_NO = O.ORD_NO 
+		   LEFT JOIN TB_ITEMKIND I 
+				    ON G.ITEMKIND_CD = I.ITEMKIND_CD 
 		  	AND R.ORD_NO = O.ORD_NO
 		  	AND R.ORD_DTL_NO = OD.ORD_DTL_NO 
 		  	AND R.DEL_YN = 'N'
@@ -1067,6 +1071,7 @@
 		            , Z.ADM_RPL
 		            , Z.ADM_RPL_REG_NO
 		            , Z.ADM_RPL_DT
+		            , Z.SIZE_GB
 		ORDER BY Z.ORD_NO DESC
 		<include refid="selectForPagingFooter"/>
 		</select>

+ 7 - 2
src/main/webapp/WEB-INF/views/mob/SigninFormMob.html

@@ -297,7 +297,7 @@
 		}
 		// 4. 휴대전화 정보가 없으면 SNS 가입화면 이동
 		if (userInfo.custStat === 'EMPTY_PHONE_CUST') {
-			cfnGoToPage(_PAGE_CUSTOMER_JOIN);
+			cfnGoToPage(_PAGE_CUSTOMER_SNS_JOIN);
 		}
 		// 5. YES24 첫 로그인 시도 시 정보동의 페이지 이동
 		if (userInfo.custStat === 'NEED_AGREE_CUST') {
@@ -314,7 +314,12 @@
 			mcxDialog.alert("회원가입에 실패 했습니다.<br> 고객센터에 문의 하시기 바랍니다.");
 			return;
 		}
-		// 8. SNS 로그인 연동 성공 및 기존 SNS 연동된 회원 로그인 시도
+		// 8.SNS 정보로 가입 실패시 안내 창 알림
+		if (userInfo.custStat === 'EMPTY_CI_CUST') {
+			mcxDialog.alert("연계정보(CI) 값이 없습니다.<br> 고객센터에 문의 하시기 바랍니다.");
+			return;
+		}
+		// 9. SNS 로그인 연동 성공 및 기존 SNS 연동된 회원 로그인 시도
 		if (userInfo.custStat === 'SUCC_CUST') {
 			let params = {};
 			params.snsType = userInfo.snsType;

+ 24 - 9
src/main/webapp/WEB-INF/views/mob/SnsCallBackFormMob.html

@@ -26,7 +26,7 @@
 
 	// SNS 로그인 콜백함수(네이버, 카카오, YES24)
 	var fnSnsSigninCallback = function(userInfo) {
-		// 1. CI 정보로 사용자가 없어 회원가입 프로세스 처리 중 이메일, 휴대전화 중복
+		// 1.CI 정보로 사용자가 없어 회원가입 처리 중 이메일, 휴대전화 중복
 		if (userInfo.custStat === 'DUP_PHONE_CUST') {
 			mcxDialog.alert("이미 사용 중인 휴대전화번호 입니다.");
 			return;
@@ -35,12 +35,12 @@
 			mcxDialog.alert("이미 사용 중인 이메일 입니다.");
 			return;
 		}
-		// 2. SNS 로그인 정보로 탈퇴확인
+		// 2.SNS 로그인 정보로 탈퇴확인
 		if (userInfo.custStat === 'SECEDE_CUST') {
 			mcxDialog.alert("탈퇴 회원 입니다.");
 			return;
 		}
-		// 3. SNS 로그인 정보로 휴면확인
+		// 3.SNS 로그인 정보로 휴면확인
 		if (userInfo.custStat === 'DORMANT_CUST') {
 			mcxDialog.alertC("휴면 고객님께서는 휴면을<br>해지하신 후 사용하실 수 있습니다.", {
 				sureBtnText: "확인",
@@ -50,26 +50,41 @@
 			});
 			return;
 		}
-		// 4. 휴대전화 정보가 없으면 SNS 가입화면 이동
+		// 4.휴대전화 정보가 없으면 SNS 가입화면 이동
 		if (userInfo.custStat === 'EMPTY_PHONE_CUST') {
-			cfnGoToPage(_PAGE_CUSTOMER_JOIN);
+			cfnGoToPage(_PAGE_CUSTOMER_SNS_JOIN);
 		}
-		// 5. YES24 첫 로그인 시도 시 정보동의 페이지 이동
+		// 5.YES24 첫 로그인 시도 시 정보동의 페이지 이동
 		if (userInfo.custStat === 'NEED_AGREE_CUST') {
 			cfnConsentUseInfo(userInfo.custNm);
 			return;
 		}
-		// 6. SNS 정보로 가입 성공시 가입완료 페이지 이동
+		// 6.SNS 정보로 가입 성공시 가입완료 페이지 이동
 		if (userInfo.custStat === 'NEW_CUST') {
 			cfnGoToPage(_PAGE_CUSTOMER_JOIN_COMPLETE);
 			return;
 		}
 		// 7.SNS 정보로 가입 실패시 안내 창 알림
 		if (userInfo.custStat === 'FAIL_CUST') {
-			mcxDialog.alert("회원가입에 실패 했습니다.<br> 고객센터에 문의 하시기 바랍니다.");
+			mcxDialog.alertC("회원가입에 실패 했습니다.<br> 고객센터에 문의 하시기 바랍니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					cfnGoToPage(_PAGE_CUSTOMER_JOIN_TYPE);
+				}
+			});
+			return;
+		}
+		// 8.CI 정보가 없을때 안내 창 알림
+		if (userInfo.custStat === 'EMPTY_CI_CUST') {
+			mcxDialog.alertC("연계정보(CI) 값이 없습니다.<br> 고객센터에 문의 하시기 바랍니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					cfnGoToPage(_PAGE_CUSTOMER_JOIN_TYPE);
+				}
+			});
 			return;
 		}
-		// 8. SNS 로그인 연동 성공 및 기존 SNS 연동된 회원 로그인 시도
+		// 9.SNS 로그인 연동 성공 및 기존 SNS 연동된 회원 로그인 시도
 		if (userInfo.custStat === 'SUCC_CUST') {
 			let params = {};
 			params.snsType = userInfo.snsType;

+ 12 - 3
src/main/webapp/WEB-INF/views/mob/callcenter/GoodsQnaFormMob.html

@@ -87,6 +87,15 @@
 		gagajf.ajaxFormSubmit($('#qnaForm').prop('action'), '#qnaForm', fnGetListCallback);
 	});
 	
+    var fnReplaceBr = function(obj){
+        let tag = '';
+        if(!gagajf.isNull(obj)){
+            var brText = obj;
+            tag = brText.replace(/(&lt;br\/&gt;)/g, '<br>');
+        }
+        return tag;
+    }
+    
 	// QNA 콜백함수
 	var fnGetListCallback = function(result) {
 		// 목록
@@ -101,7 +110,7 @@
 				tag += '						<span class="fold_state ' + (item.ansStat == "G060_10" ? "doing" : "done") + '"">' + item.ansStatNm + '</span>\n'; //답변완료 : done / 처리중 : doing
 				tag += '						<span class="prod">' + item.goodsNm + ' ' + item.relGoodsCd + '</span>\n';
 				tag += '					</div>\n';
-				tag += '					<div class="lap2"><span>' + item.questContent.escapeHtml() + '</span></div>\n';
+				tag += '					<div class="lap2"><span>' + fnReplaceBr(item.questContent.escapeHtml()) + '</span></div>\n';
 				tag += '				</div>\n';
 				tag += '				<span class="data">' + item.questDt + '</span>\n';
 				tag += '			</div>\n';
@@ -110,14 +119,14 @@
 				tag += '	<div class="fold_cont">\n';
 				tag += '		<div class="fold_detail">\n';
 				tag += '			<div>\n';
-				tag += '				<p>' + item.questContent.escapeHtml() + '</p>\n';
+				tag += '				<p>' + fnReplaceBr(item.questContent.escapeHtml()) + '</p>\n';
 				tag += '			</div>\n';
 				tag += '		</div>\n';
 				
 				if (item.ansStat == 'G060_20') { // 답변완료일 때
 					tag += '		<div class="fold_answer">\n';
 					tag += '			<div>\n';
-					tag += '				<div class="answer_body">' + item.ansContent + '</div>\n';
+					tag += '				<div class="answer_body">' + fnReplaceBr(item.ansContent.escapeHtml()) + '</div>\n';
 					tag += '				<div class="answer_foot">\n';
 					tag += '					<span class="data">' + item.ansDt + '</span>\n';
 					tag += '					<button type="button" class="btn_delete" onclick="fnDeleteQna(' + item.counselSq + ');"><span>삭제</span></button>\n';

+ 12 - 3
src/main/webapp/WEB-INF/views/mob/callcenter/OneToOneQnaFormMob.html

@@ -291,6 +291,15 @@
 		gagajf.ajaxFormSubmit($('#qnaForm').prop('action'), '#qnaForm', fnGetListCallback);
 	});
 	
+	var fnReplaceBr = function(obj){
+        let tag = '';
+        if(!gagajf.isNull(obj)){
+            var brText = obj;
+            tag = brText.replace(/(&lt;br\/&gt;)/g, '<br>');
+        }
+        return tag;
+    }
+	
 	// QNA 콜백함수
 	var fnGetListCallback = function(result) {
 		// 목록
@@ -305,7 +314,7 @@
 				tag += '						<span class="fold_state ' + (item.ansStat == "G060_10" ? "doing" : "done") + '">' + item.ansStatNm + '</span>\n'; //답변완료 : done / 처리중 : doing
 				tag += '						<span class="prod">' + item.counselClsfNm + '</span>\n';
 				tag += '					</div>\n';
-				tag += '					<div class="lap2"><span>' + item.questTitle + '</span></div>\n';
+				tag += '					<div class="lap2"><span>' + item.questTitle.escapeHtml() + '</span></div>\n';
 				tag += '				</div>\n';
 				tag += '				<span class="data">' + item.questDt + '</span>\n';
 				tag += '			</div>\n';
@@ -313,7 +322,7 @@
 				tag += '	</div>\n';
 				tag += '	<div class="fold_cont">\n';
 				tag += '		<div class="fold_detail">\n';
-				tag += '			<div><p>' + item.questContent + '</p></div>\n';
+				tag += '			<div><p>' + fnReplaceBr(item.questContent.escapeHtml()) + '</p></div>\n';
 				
 				if (!gagajf.isNull(item.sysFileNm1) || !gagajf.isNull(item.sysFileNm2)) {
 					tag += '		<p class="img_group">\n';
@@ -340,7 +349,7 @@
 				if (item.ansStat == 'G060_20') { // 답변완료 상태일 때
 					tag += '	<div class="fold_answer">\n';
 					tag += '		<div>\n';
-					tag += '			<div class="answer_body">' + item.ansContent.escapeHtml() + '</div>\n';
+					tag += '			<div class="answer_body">' + fnReplaceBr(item.ansContent.escapeHtml()) + '</div>\n';
 					tag += '			<div class="answer_foot">\n';
 					tag += '				<span class="data">' + item.ansDt + '</span>\n';
 					

+ 8 - 2
src/main/webapp/WEB-INF/views/mob/customer/ConsentUseInfoFormMob.html

@@ -90,7 +90,7 @@
 		}
 		// 4. 휴대전화 정보가 없으면 SNS 가입화면 이동
 		if (userInfo.custStat === 'EMPTY_PHONE_CUST') {
-			cfnGoToPage(_PAGE_CUSTOMER_JOIN);
+			cfnGoToPage(_PAGE_CUSTOMER_SNS_JOIN);
 			$.modal.close();
 			return;
 		}
@@ -106,7 +106,13 @@
 			$.modal.close();
 			return;
 		}
-		// 7. SNS 로그인 연동 성공 및 기존 SNS 연동된 회원 로그인 시도
+		// 7.CI 정보가 없을때 안내 창 알림
+		if (userInfo.custStat === 'EMPTY_CI_CUST') {
+			mcxDialog.alert("연계정보(CI) 값이 없습니다.<br> 고객센터에 문의 하시기 바랍니다.");
+			$.modal.close();
+			return;
+		}
+		// 8. SNS 로그인 연동 성공 및 기존 SNS 연동된 회원 로그인 시도
 		if (userInfo.custStat === 'SUCC_CUST') {
 			let params = {};
 			params.snsType = userInfo.snsType;

+ 26 - 5
src/main/webapp/WEB-INF/views/mob/customer/JoinFormMob.html

@@ -41,12 +41,15 @@
 				<div class="form_field">
 					<label class="input_label sr-only">아이디</label>
 					<div class="input_wrap form_full">
-						<input type="text" id="custId" name="custId" placeholder="아이디" class="form_control" required="required" data-valid-type="alphaNumeric" data-valid-name="아이디" minlength="4" maxlength="12" autocomplete="no"/>
+						<input type="text" id="custId" name="custId" placeholder="아이디" class="form_control" required="required" data-valid-name="아이디" minlength="4" maxlength="12" autocomplete="no"/>
 						<span class="usable" style="display:block;"></span>
 					</div>
 					<div id="dupCustIdDiv" class="help_block hide">
 						<p class="t_err">이미 가입된 아이디입니다.다른 아이디를 입력하여 주세요.</p>
 					</div>
+					<div id="errCustIdDiv" class="help_block hide">
+						<p class="t_err">아이디는 영어와 숫자 조합만 가능합니다.</p>
+					</div>
 				</div>
 				<!-- //아이디 사용가능시 -->
 				<!-- 오류시 부모 div에서 제어 -->
@@ -194,13 +197,31 @@
 	// 아이디 확인
 	$('#custId').on('blur', function () {
 		let custId = $(this).val();
+		const $errCustIdDiv = $('#errCustIdDiv');
+		const $custId = $('#custId');
+
 		if(!gagajf.isNull(custId)) {
 			if (custId.length > 3) {
-				let custInfo = {};
-				custInfo.custId = custId;
-				let jsonData = JSON.stringify(custInfo);
-				gagajf.ajaxJsonSubmit('/customer/join/id/check', jsonData, fnIdConfirmCallBack);
+				if (!fnCheckCustId(custId)) {
+					$custId.addClass('err');
+					$custId.removeClass('usable');
+					$errCustIdDiv.show();
+					return;
+				} else {
+					$custId.removeClass('err');
+					$custId.addClass('usable');
+					$errCustIdDiv.hide();
+					let custInfo = {};
+					custInfo.custId = custId;
+					let jsonData = JSON.stringify(custInfo);
+					gagajf.ajaxJsonSubmit('/customer/join/id/check', jsonData, fnIdConfirmCallBack);
+				}
 			}
+		} else {
+			custIdCheck = false
+			$errCustIdDiv.show();
+			$custId.addClass('err');
+			$custId.removeClass('usable');
 		}
 	});
 

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

@@ -32,7 +32,7 @@
 </div>
 <script th:inline="javascript">
 /*<![CDATA[*/
-	$("#partners").click(function() {
+	$("#partners").on('click', function() {
 		cfnSupplyComanyLayer();
 	});
 	//약관내부링크

+ 343 - 0
src/main/webapp/WEB-INF/views/mob/customer/SnsJoinFormMob.html

@@ -0,0 +1,343 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="mob/common/layout/LoginLayoutMob">
+<!--
+ *******************************************************************************
+ * @source  : SnsJoinFormMob.html
+ * @desc    : 회원정보 입력 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.16   jsshin     최초 작성
+ *******************************************************************************
+ -->
+<body>
+<th:block layout:fragment="content">
+<style>
+	.hide{display:none}
+</style>
+<main class="container mb">
+	<!-- ★ 컨텐츠 시작 -->
+	<section class="content mb_join_2">
+		<div class="inner">
+			<div class="close">
+				<a href="javascript:void(0);" class="btn_close" onclick="cfnGoToPage(_PAGE_CUSTOMER_JOIN_TYPE);"><span></span><span></span></a>
+			</div>
+		</div>
+		<div class="inner">
+			<h2 class="title">회원정보 입력</h2>
+		</div>
+		<div class="inner">
+			<form id="joinForm" name="joinForm" class="form_wrap form_full" role="form">
+				<div class="form_head">
+					<h2 class="title sr-only">회원정보 입력</h2>
+				</div>
+				<!-- 오류시 부모 div에서 제어 -->
+				<div class="form_field">
+					<label class="input_label sr-only">이메일</label>
+					<div class="input_wrap form_full">
+						<input type="text" id="email" name="email" placeholder="이메일" class="form_control" required="required" data-valid-name="이메일" maxlength="30" autocomplete="no" autocapitalize="no"/><!-- 잘못기입된 경우 class "err" 추가 -->
+						<!-- case (이메일 형식이 바르지않을경우,이미 가입되어있는 이메일인경우) -->
+						<div class="help_block">
+							<!-- 이메일 형식이 바르지않을경우 -->
+							<p id="failEmail" class="t_err hide">
+								이메일 형식이 올바르지 않습니다.
+							</p>
+							<!-- //이메일 형식이 바르지않을경우 -->
+							<!-- 이미 가입되어있는 이메일인경우 -->
+							<p id="dupEmail" class="t_err hide">
+								이미 가입된 이메일 주소입니다. 다른 이메일 주소를 입력하여 주세요.
+							</p>
+							<div id="dupEmailDiv" class="mt20 hide">
+								<button type="button" class="btn btn_default btn_sm mini" onclick="cfnGoToPage(_PAGE_LOGIN);">
+									<span>로그인</span>
+								</button>
+								<button type="button" class="btn btn_default btn_sm mini" onclick="cfnGoToPage(_PAGE_CUSTOMER_ID_FIND);">
+									<span>아이디 찾기</span>
+								</button>
+							</div>
+							<!-- //이미 가입되어있는 이메일인경우 -->
+						</div>
+						<!-- //case (이메일 형식이 바르지않을경우,이미 가입되어있는 이메일인경우) -->
+					</div>
+				</div>
+				<!-- 210415_수정 : 휴대폰 인증 수정 -->
+				<div class="form_field">
+					<label class="input_label sr-only">휴대폰번호</label>
+					<!-- 휴대폰 인증 입력 전 -->
+					<div class="input_wrap form_full">
+						<input type="text" id="cellPhnno" name="cellPhnno" placeholder="휴대폰 인증 해주세요." class="form_control" minlength="10" maxlength="11" required="required" data-valid-type="numeric" data-valid-name="휴대폰" readonly="readonly"/>
+						<button type="button" id="btnCellPhoneCertify" class="btn btn_dark btn_hp_certi">
+							<span>본인인증</span>
+						</button>
+					</div>
+					<!-- //휴대폰 인증 입력 전 -->
+
+					<!-- case (휴대폰번호 형식이 맞지 않을경우,이미 가입되어있는 핸드폰번호일경우) -->
+					<div class="help_block">
+						<p id="failPhnno" class="t_err hide">휴대폰번호를 형식에 맞게 정확히 입력해주세요</p>
+						<p id="dupPhnno" class="t_err hide">I***D로 가입된 핸드폰 번호 입니다.</p>
+						<div id="dupPhnnoDiv" class="mt20 hide">
+							<button type="button" class="btn btn_default btn_sm mini" onclick="cfnGoToPage(_PAGE_LOGIN);">
+								<span>로그인</span>
+							</button>
+							<button type="button" class="btn btn_default btn_sm mini" onclick="cfnGoToPage(_PAGE_CUSTOMER_ID_FIND);">
+								<span>아이디 찾기</span>
+							</button>
+						</div>
+					</div>
+				</div>
+				<div class="btn_group_flex">
+					<div>
+						<button type="button" id="btnJoin" class="btn btn_primary btn_block" disabled="disabled">
+							<span>동의하고 가입하기</span>
+						</button>
+					</div>
+				</div>
+				<!-- //210415_수정 : 버튼 형식 변경. -->
+				<div class="desc_wrap t_c mt20">
+					<p>
+						본인은&nbsp;만 14세 이상이며&nbsp;<a href="javascript:void(0)" onclick="cfnUseTermsLayer();">STYLE24이용약관<i class="ico ico_blank ml5"></i></a>,<br>
+						<a href="javascript:void(0)" onclick="cfnPrivacyPolicyLayer('join');">개인정보 수집 및 이용<i class="ico ico_blank ml5"></i></a>,
+						<a href="javascript:void(0)" onclick="cfnPrivacyTrustLayer();">개인정보 취급 위탁<i class="ico ico_blank ml5"></i></a><br>
+						내용을 확인 하였으며,동의합니다.
+					</p>
+				</div>
+				<input type="hidden" name="snsId" value=""/>
+				<input type="hidden" name="snsType" value=""/>
+				<input type="hidden" name="ci" value=""/>
+				<input type="hidden" name="memNo" value=""/>
+			</form>
+		</div>
+	</section>
+	<!-- ★ 컨텐츠 종료 -->
+</main>
+
+<script th:src="@{'/biz/customer.js?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" src="/biz/customer.js"></script>
+<script th:inline="javascript">
+	/*<![CDATA[*/
+	const sEncData = [[${sEncData}]];   //인증 후 해당 페이지로 리다이렉트함
+	const authMethod = [[${authMethod}]]; //인증 후 해당 페이지로 리다이렉트함
+	const custParams = [[${custParams}]];
+	const custSnsInfo = [[${custSnsInfo}]];
+
+	let emailCheck = false;
+	let authCheck = false;
+
+
+	//	이메일 확인
+	$('#email').on('blur', function () {
+		const $failEmail = $('#failEmail');
+		const $dupEmail = $('#dupEmail');
+		const $dupEmailDiv = $('#dupEmailDiv');
+		$failEmail.hide();
+		$dupEmail.hide();
+		$dupEmailDiv.hide();
+
+		let email = $(this).val();
+		let validation;
+
+		if(!gagajf.isNull(email)) {
+			if (!fnCheckValidationEmail(email)) {
+				$failEmail.show();
+				emailCheck = false;
+				validation = false;
+			} else {
+				validation = true;
+				$failEmail.hide();
+			}
+			if (validation) {
+				let custInfo = {};
+				custInfo.email = email;
+				let jsonData = JSON.stringify(custInfo);
+				gagajf.ajaxJsonSubmit('/customer/email/check', jsonData, fnEmailConfirmCallBack);
+			}
+		}
+	});
+
+	// 이메일 확인 결과
+	var fnEmailConfirmCallBack = function (result) {
+		const $dupEmail = $('#dupEmail');
+		const $dupEmailDiv = $('#dupEmailDiv');
+		if (result.isFind) { // 중복된 아이디가 존재
+			$dupEmail.show();
+			$dupEmailDiv.show();
+			emailCheck = false;
+		} else {
+			$dupEmail.hide();
+			$dupEmailDiv.hide();
+			emailCheck = true;
+		}
+		fnPossibleJoin();
+	};
+
+	//휴대폰 인증
+	$('#btnCellPhoneCertify').on('click', function () {
+		let joinForm = $('#joinForm').serializeObject();
+		let custParams = joinForm.email +','+ joinForm.snsId +','+ joinForm.snsType +','+ joinForm.ci +','+ joinForm.memNo;
+		cfnOpenCellphoneCertify(_PAGE_CUSTOMER_SNS_JOIN, custParams);
+	});
+
+	// 나이스 본인인증 후 콜백
+	var fnNiceCallBack = function(encData) {
+		if (!gagajf.isNull(encData)) {
+			let ci = $('#joinForm input[name=ci]').val();
+			let custInfo = {};
+			custInfo.encData = encData;
+			if (!gagajf.isNull(ci)) custInfo.ci = ci;
+			let jsonData = JSON.stringify(custInfo);
+			gagajf.ajaxJsonSubmit('/customer/authentication/check', jsonData, fnInfoConfirmCallBack);
+		}
+	};
+
+	// 본인인증 후 결과
+	var fnInfoConfirmCallBack = function (result) {
+		const $cellPhnno = $('#cellPhnno');
+		const $dupPhnno = $('#dupPhnno');
+		const $dupPhnnoDiv = $('#dupPhnnoDiv');
+		const $btnCellPhoneCertify = $('#btnCellPhoneCertify');
+		$cellPhnno.val(result.cellPhnno);
+
+		if (result.isFind) { // 가입된 고객 정보가 있으면
+			let msg = '';
+			if (result.custStat === 'G104_30') {
+				msg = "탈퇴한 회원입니다. 탈퇴 후 60일 동안 재가입이 불가능합니다.";
+			} else {
+				msg = result.maskingCustId+"로 가입된 이력이 있습니다.";
+			}
+			$dupPhnno.html(msg);
+			$dupPhnno.show();
+			$dupPhnnoDiv.show();
+			authCheck = false;
+		} else {
+			$dupPhnno.hide();
+			$dupPhnnoDiv.hide();
+			authCheck = true;
+		}
+		$btnCellPhoneCertify.find('span').text('인증완료');
+		$btnCellPhoneCertify.attr('disabled', true);
+		fnPossibleJoin();
+	};
+
+	// 저장
+	$('#btnJoin').on('click', function () {
+		mcxDialog.confirm("회원가입을 하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				$('#btnJoin').attr('disabled', true);
+				let jsonData = JSON.stringify($('#joinForm').serializeObject());
+				gagajf.ajaxJsonSubmit('/customer/sns/join/save', jsonData, fnJoinSaveCallback);
+			}
+		});
+	});
+
+	var fnJoinSaveCallback = function (result) {
+		cfnGoToPage(_PAGE_CUSTOMER_JOIN_COMPLETE);
+	};
+
+
+	// 가입 가능한지 확인
+	var fnPossibleJoin = function () {
+		const $btnJoin = $('#btnJoin');
+		if (emailCheck && authCheck ) {
+			$btnJoin.attr('disabled', false);
+		} else {
+			$btnJoin.attr('disabled', true);
+		}
+	};
+
+	// 본인인증 후 데이터 입력 값 셋팅
+	var fnDataSet = function (custParams) {
+		const $email = $('#joinForm input[name=email]');
+		const $snsId = $('#joinForm input[name=snsId]');
+		const $snsType = $('#joinForm input[name=snsType]');
+		const $ci = $('#joinForm input[name=ci]');
+		const $memNo = $('#joinForm input[name=memNo]');
+
+		let arrayParams = custParams.split(',');
+		//[0]이메일/[1]SNS_ID/[2]SNS_TYPE/[3]CI/[4]memNo
+		let email = arrayParams[0];
+		let snsId = arrayParams[1];
+		let snsType = arrayParams[2];
+		let ci = arrayParams[3];
+		let memNo = arrayParams[4];
+
+		// console.log(arrayParams);
+		if (!gagajf.isNull(email)) {
+			$email.val(email);
+		}
+		if (!gagajf.isNull(snsId)) {
+			$snsId.val(snsId);
+		}
+		if (!gagajf.isNull(snsType)) {
+			$snsType.val(snsType);
+		}
+		if (!gagajf.isNull(ci)) {
+			$ci.val(ci);
+		}
+		if (!gagajf.isNull(memNo)) {
+			$memNo.val(memNo);
+		}
+		if (!gagajf.isNull(email)) {
+			$email.val(email);
+			$email.trigger('blur');
+		}
+	};
+
+	var fnDataInit = function (custSnsInfo) {
+		const $email = $('#joinForm input[name=email]');
+		const $snsId = $('#joinForm input[name=snsId]');
+		const $snsType = $('#joinForm input[name=snsType]');
+		const $ci = $('#joinForm input[name=ci]');
+		const $memNo = $('#joinForm input[name=memNo]');
+
+		let email = custSnsInfo.email;
+		let snsId = custSnsInfo.snsId;
+		let snsType = custSnsInfo.snsType;
+		let ci = custSnsInfo.ci;
+		let memNo = custSnsInfo.memNo;
+
+		if (!gagajf.isNull(email)) {
+			$email.val(email);
+		}
+		if (!gagajf.isNull(snsId)) {
+			$snsId.val(snsId);
+		}
+		if (!gagajf.isNull(snsType)) {
+			$snsType.val(snsType);
+		}
+		if (!gagajf.isNull(ci)) {
+			$ci.val(ci);
+		}
+		if (!gagajf.isNull(memNo)) {
+			$memNo.val(memNo);
+		}
+		if (!gagajf.isNull(email)) {
+			$email.val(email);
+			$email.trigger('blur');
+		}
+	}
+
+	$(document).ready(function () {
+		if (!gagajf.isNull(custSnsInfo)) {
+			fnDataInit(custSnsInfo);
+		}
+		if (!gagajf.isNull(custParams)) {
+			fnDataSet(custParams);
+		}
+		if (!gagajf.isNull(sEncData)) {
+			fnNiceCallBack(sEncData, authMethod);
+		}
+	});
+
+	/*]]>*/
+</script>
+</th:block>
+</body>
+</html>

+ 102 - 0
src/main/webapp/WEB-INF/views/mob/customer/SupplyCompanyLayerFormMob.html

@@ -0,0 +1,102 @@
+<!DOCTYPE html>
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : SupplyCompanyLayerFormMob.html
+ * @desc    : 공급업체 리스트 page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.06.09   jsshin       최초 작성
+ *******************************************************************************
+ -->
+<div class="modal-dialog" role="document">
+	<div class="modal-content">
+		<div class="modal-header">
+			<h5 class="modal-title" id="exampleFullLabel">업체 리스트</h5>
+		</div>
+		<div class="modal-body">
+			<div class="pop_cont">
+				<!-- 컨텐츠 시작 -->
+				<div class="ps ptn" >
+					<table>
+						<colgroup>
+							<col width="*">
+							<col width="30%">
+						</colgroup>
+						<thead>
+							<tr>
+								<th>업체명</th>
+								<th>대표자</th>
+							</tr>
+						</thead>
+						<tbody id="supplyCompanyList">
+						</tbody>
+					</table>
+					<div class="paging_wrap">
+						<ul class="pageNav" id="paging">
+						</ul>
+					</div>
+				</div>
+				<!-- 컨텐츠 종료 -->
+			</div>
+		</div>
+	</div>
+</div>
+<form id="supplyCompanyForm" name="supplyCompanyForm" th:action="@{/customer/supply/company/list}" th:method="post">
+	<input type="hidden" name="pageNo" value="1" />
+	<input type="hidden" name="pageSize" value="10" />
+</form>
+<script src="/ux/plugins/gaga/gaga.paging.js"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	var mallGb = [[${mallGb}]];
+	var fnGetSupplyCompanyList = function () {
+		gagaPaging.init('supplyCompanyForm', fnSearchCallback, 'paging', 10);
+		gagaPaging.load(1);
+	}
+
+	var fnSearchCallback = function (result) {
+		$('#supplyCompanyList').html('');
+		let html = '';
+		if (!gagajf.isNull(result) && result.supplyCompanyList.length > 0) {
+			$.each(result.supplyCompanyList, function (idx, item) {
+				html += '<tr>\n';
+				html += '    <td>\n';
+				html += item.supplyCompNm;
+				html += '    </td>\n';
+				html += '    <td>\n';
+				html += item.ownerNm;
+				html += '    </td>\n';
+				html += '</tr>\n';
+			});
+		}
+		$('#supplyCompanyList').html(html);
+
+		gagaPaging.createSinglePagination(result.paging.pageable);
+	}
+
+	$(document).ready(function() {
+		fnGetSupplyCompanyList();
+		$('#supplyCompanyPop .close-modal').on('click', function () {
+			cfnPrivacyPolicyLayer(mallGb);
+		});
+	});
+
+	//약관내부링크
+	$(function(){
+		$(".hook_list ul li a").on("click", function(){
+			var hookHeader = $(".modal-header").outerHeight() + 3000;
+			var hookHref = $(this).attr("href");
+			var hookPot = $(hookHref == "#" || hookHref == "" ? "body" : hookHref);
+			var hookPos = hookPot.offset().top - hookHeader;
+			$("html, body").animate({ scrollTop: hookPos }, 3000);
+		});
+	});
+/*]]>*/
+</script>
+</html>

+ 4 - 1
src/main/webapp/WEB-INF/views/mob/goods/CardPrmtFormMob.html

@@ -41,7 +41,10 @@
 											</th:block>
 											<th:block th:unless="${cardInfo.dcGb == '3'}">
 											<p th:text="${#numbers.formatInteger(cardInfo.dcVal, 0,'COMMA')+ cardInfo.dcWayNm + ' ' + cardInfo.prmtGbNm}">5% 즉시할인</p>
-											<p th:text="${#numbers.formatInteger(cardInfo.minPayAmt, 0,'COMMA')  + '원 이상 구매 시 최대 ' + #numbers.formatInteger(cardInfo.maxDcAmt, 0,'COMMA') + '원 할인 '}">7만원 이상 구매 시 최대 5만원 할인</p>
+											<p>
+											<th:block th:text="${#numbers.formatInteger(cardInfo.minPayAmt, 0,'COMMA')  + '원 이상 구매 시'}"></th:block><br/>
+											<th:block th:text="${'최대 ' + #numbers.formatInteger(cardInfo.maxDcAmt, 0,'COMMA') + '원 할인 '}"></th:block>
+											</p>
 											</th:block>
 											<th:block th:if="${not #strings.isEmpty(cardInfo.linkUrl)}"><a th:href="${cardInfo.linkUrl}" target="_blank" class="link" >자세히보기</a></th:block>
 										</div>

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

@@ -365,7 +365,7 @@
 	
  //상품상세 적용
 	// 입점 html 에 태그가 정상적이지 않아 스크립트로 처리
-	let goodsDesc = [[${goodsInfo.goodsDesc}]];
+	var goodsDesc = [[${goodsInfo.goodsDesc}]];
 	if ("N" == [[${goodsInfo.tobeFormYn}]] && !gagajf.isNull(goodsDesc)){
 		$('#goodsDescHtml').html([[${#strings.unescapeJava(#strings.escapeJava(goodsInfo.goodsDesc))}]]);
 	}

+ 27 - 10
src/main/webapp/WEB-INF/views/mob/goods/GoodsDealDetailFormMob.html

@@ -167,7 +167,7 @@
 		<div>
 			<!-- 구매하기팝업 -->
 			<div class="btPop btPopAuto pd_pop Purchase_pop" id="btPopAuto_back">
-				<a class="btn btPop_close">Close </a>
+				<a href="javascript:void(0);"  class="btn btPop_close">Close </a>
 				<div class="header btPop_head btPopAuto_head">
 					구매하기팝업
 				</div>
@@ -308,13 +308,11 @@
 								총&nbsp;<span id="goodsTotalQty">0</span>개
 							</p>
 							<p class="price">
-								<span>
-									<b id="goodsTotalPrice">0</b><em>원</em>
-								</span>
+								<span><b id="goodsTotalPrice">0</b><em>원</em></span>
 							</p>
 						</div>
 						<div class="btn_box">
-							<button type="button" class="gift" id="btn_gift" onclick="fnAddCart('G','Up');" th:if="${goodsInfo.giftPackYn == 'Y'}">
+							<button type="button" class="gift" id="btnGift" onclick="fnAddCart('G','Up');" style="display:none;">
 								<span><span>선물해보세요!</span></span>
 							</button>
 							<th:block  th:if="${goodsInfo.stockQty > 0 and goodsInfo.goodsStat == 'G008_90'}">
@@ -690,7 +688,7 @@
 					if (item.addPrice > 0){
 						tag2 += '<div class="opt_price">+'+ item.addPrice.addComma() +'원</div>\n';	
 					}
-					tag2 += '<input type="hidden" name="opt2" value="'+ goodsCd +'" currPrice="'+ currPrice+'" addPrice="'+item.addPrice+'"  optCd="'+item.optCd+'"  optCd1="'+item.optCd1+'" optCd1Nm="'+item.optCd1Nm+'"  optCd2="'+item.optCd2+'"  minOrdQty="'+minOrdQty+'"  maxOrdQty="'+maxOrdQty+'" selfGoodsYn="'+selfGoodsYn+'"/>\n';
+					tag2 += '<input type="hidden" name="opt2" value="'+ goodsCd +'" currPrice="'+ currPrice+'" addPrice="'+item.addPrice+'"  optCd="'+item.optCd+'"  optCd1="'+item.optCd1+'" optCd1Nm="'+item.optCd1Nm+'"  optCd2="'+item.optCd2+'"  minOrdQty="'+minOrdQty+'"  maxOrdQty="'+maxOrdQty+'" selfGoodsYn="'+selfGoodsYn+'" giftPackYn="'+item.giftPackYn+'"/>\n';
 					tag2 += '</li>\n';
 					
 					tagUpS += tag1+tagUp+tag2;
@@ -728,6 +726,7 @@
 		let maxOrdQty = $target.attr("maxOrdQty");
 		let addPrice  = $target.attr("addPrice");
 		let selfGoodsYn  = $target.attr("selfGoodsYn");
+		let giftPackYn  = $target.attr("giftPackYn");
 		let optQty = minOrdQty;
 		
 		let params = new Object();
@@ -757,8 +756,8 @@
 			}
 
 			if (minOrdQty > itemCnt) {
-				//alert("무슨작업을 해야할가요?");
-				return false;		 //무슨작업을 해야하나?
+				mcxDialog.alert("주문 가능한 옵션이 아닙니다. 옵션을 다시  선택해 주세요."); 
+				return false;
 			}
 			
 			//상품정보
@@ -779,7 +778,7 @@
 			tag += '	</div>\n';
 			tag += '	<div class="number_count">\n';
 			tag += '		<span class="minus min_val" onclick="fnAdjustOrderEa(this);" adjust="-"><em class="sr-only">감소</em></span>\n';
-			tag += '		<input type="text" name="cea" optCd="'+optCd+'" maxlength="3" style="ime-mode:disabled" value="' +optQty+'" readonly minOrdQty="'+minOrdQty+'" maxOrdQty="'+maxOrdQty+'">\n';
+			tag += '		<input type="text" name="cea" optCd="'+optCd+'" maxlength="3" style="ime-mode:disabled" value="' +optQty+'" readonly minOrdQty="'+minOrdQty+'" maxOrdQty="'+maxOrdQty+'" giftPackYn="'+giftPackYn+'">\n';
 			tag += '		<input type="hidden" name="coption" value="'+optCd+'"  goodsCd="'+goodsCd+'"  price="'+currPrice+'"  addPrice="'+addPrice+'">\n';
 			tag += '		<span class="plus" onclick="fnAdjustOrderEa(this);" adjust="+"><em class="sr-only">추가</em></span>\n';
 			tag += '	</div>\n';
@@ -789,11 +788,13 @@
 			tag += '	<button type="button" class="btn_delete_item" onclick="fnSelectGoodsDel(\''+optCd+'\')"><span>삭제</span></button>\n';
 			tag += '</div>\n';
 			
-			
 			let $objUp = null;
 			$objUp = $('.pd_detail .opt_result'); 
 			$objUp.prepend(tag);
 			
+			//선물 주문관련 처리
+			if ("Y" == giftPackYn) $('#btnGift').show();
+			
 			$('.price_box').show();
 			fnSetTotalPrice();	
 			
@@ -961,6 +962,22 @@
 	var fnSelectGoodsDel = function(optCd){
 		$('.result_'+optCd).remove();
 		fnSetTotalPrice();
+		
+		//선물주문관련 처리
+		let $target = $('#cartForm input[name=cea]');
+		let giftPackFlag = false;
+		$target.each(function() {
+			
+			let giftPackYn = $(this).parent().find('input[name="coption"]').attr('giftPackYn');
+			if ("Y" == giftPackYn ) giftPackFlag = true;
+		});
+		
+		if (giftPackFlag){
+			$('#btnGift').show();
+		}else{
+			$('#btnGift').hide();
+		}
+		
 	}
 	
 	//장바구니담기

+ 5 - 5
src/main/webapp/WEB-INF/views/mob/goods/GoodsDetailFormMob.html

@@ -1476,8 +1476,8 @@
 			}
 
 			if (minOrdQty > itemCnt) {
-				//alert("무슨작업을 해야할가요?");
-				return false;		 //무슨작업을 해야하나?
+				mcxDialog.alert("주문 가능한 옵션이 아닙니다. 옵션을 다시  선택해 주세요."); 
+				return false;
 			}
 			
 			//상품정보
@@ -1597,8 +1597,8 @@
 				}
 	
 				if (minOrdQty > itemCnt) {
-					//alert("무슨작업을 해야할가요?");
-					return false;		 //무슨작업을 해야하나?
+					mcxDialog.alert("주문 가능한 옵션이 아닙니다. 옵션을 다시  선택해 주세요."); 
+					return false;
 				}
 				
 				//상품정보
@@ -2365,7 +2365,7 @@
 		
 		//상품상세 적용
 		// 입점 html 에 태그가 정상적이지 않아 스크립트로 처리
-		let goodsDesc = [[${goodsInfo.goodsDesc}]];
+		var goodsDesc = [[${goodsInfo.goodsDesc}]];
 		if ("N" == [[${goodsInfo.tobeFormYn}]] && !gagajf.isNull(goodsDesc)){
 			$('#goodsDescHtml').html([[${#strings.unescapeJava(#strings.escapeJava(goodsInfo.goodsDesc))}]]);
 		}

+ 0 - 1
src/main/webapp/WEB-INF/views/mob/mypage/MypageGiftcardFormMob.html

@@ -150,7 +150,6 @@ function useGiftcard(result) {
 	let tmtbHtml = '';
 	
 	if (giftcardUseList.length == 0) {
-		console.log("여기 넘어와?");
 		tmtbHtml += '<div class="nodata">';
 		tmtbHtml += '<div class="txt_box">';
 		tmtbHtml += '<p>상품권 사용내역이 없습니다.<br></p>';

+ 2 - 2
src/main/webapp/WEB-INF/views/mob/mypage/MypagePointFormMob.html

@@ -142,8 +142,8 @@ var fnGetPointTableInfo = function(param) {
 	$("#pointAjaxList").html('');
 	let tag = "";
 	if(param != null && param.length > 0){
+		tag += '<ul>';
 		$.each(param, function(idx,item){
-			tag += '<ul>';
 			tag += ' <li>';
 			tag += ' 	<div>';
 			if(item.pntAmt > 0){
@@ -168,8 +168,8 @@ var fnGetPointTableInfo = function(param) {
 			}
 			tag += ' 	</div>';
 			tag += ' </li>';
-			tag += '</ul>';
 		});
+		tag += '</ul>';
 		$("#pointAjaxList").html(tag);
 	}else{
 		$('.nodata').show();

+ 4 - 2
src/main/webapp/WEB-INF/views/mob/mypage/MypageReviewFormMob.html

@@ -44,8 +44,8 @@
 				<div class="inner wide">
 					<div class="tabWrap">
 						<ul class="tabIndex">
-							<li id="completeReview"><a href="javascript:void(0);">작성 가능한 리뷰<span class="count" th:text="${#numbers.formatInteger(completeReviewCount,0,'COMMA')}"></span></a></li>
-							<li id="alreadyReview"><a href="javascript:void(0);" >내가 쓴 리뷰<span class="count" th:text="${#numbers.formatInteger(alreadyReviewCount,0,'COMMA')}" ></span></a></li>
+							<li id="completeReview"><a href="javascript:void(0);">작성 가능한 리뷰<span class="count" id="comReview" th:text="${#numbers.formatInteger(completeReviewCount,0,'COMMA')}"></span></a></li>
+							<li id="alreadyReview"><a href="javascript:void(0);" >내가 쓴 리뷰<span class="count" id="alrReview" th:text="${#numbers.formatInteger(alreadyReviewCount,0,'COMMA')}" ></span></a></li>
 						</ul>
 						<div class="tabContents">
 							<div class="tab_cont active">
@@ -268,6 +268,7 @@
 				}
 				
 			}else{
+				$('#alreadyList').html('');
 				var html = '';
 				html += '<div class="nodata" id="nodata1">\n';
 				html += '	<div class="txt_box">\n';
@@ -333,6 +334,7 @@
 				$('#btnMoreDiv').hide();
 			}
 		}else{
+			$('#completeList').html('');
 			var html = '';
 			html += '<div class="nodata" id="nodata1">\n';
 			html += '	<div class="txt_box">\n';

+ 28 - 5
src/main/webapp/WEB-INF/views/mob/order/OrderAddPaymentFormMob.html

@@ -211,11 +211,12 @@
 								</div>
 							</div>
 						</th:block>
+						
+						<div class="agree_payment">
+							위 주문내역을 확인 하였으며, 회원 본인은 결제에 동의합니다. (전자상거래법 제 8조 제2항)
+						</div>
 					</div>
 					
-					<div class="agree_payment">
-						위 주문내역을 확인 하였으며, 회원 본인은 결제에 동의합니다. (전자상거래법 제 8조 제2항)
-					</div>
 				</div>
 	
 				<!-- //결제 정보 -->
@@ -275,8 +276,9 @@ $("#btn_payment").on("click", function(){
 			} else if (pgGb == "KAKAO") {
 				fnKakaoPaymentReady();
 			} else if (pgGb == "KCP" || pgGb == "PAYCO") {
-				//jsf__pay(document.order_info);
-				$("#order_info input[name=Ret_URL]").val("http:" + _frontUrl + "/order/pay/result/response");
+				// 2021.06.02 태팔요청
+				var protocol = location.protocol;
+				$("#order_info input[name=Ret_URL]").val(protocol + _frontUrl + "/order/addPay/result/response");
 				kcp_AJAX();
 			}
 		}
@@ -284,6 +286,27 @@ $("#btn_payment").on("click", function(){
 });
 </script>
 <script type="text/javascript">
+
+//구매조건 확인 및 결제대행 서비스 약관 동의 클릭시
+$(document).on('click','.area_paymentinfo .payinfo_blk_wrap a',function(e){
+	e.preventDefault();
+	//$(this).parent('.payinfo_blk_wrap').toggleClass('on');
+	$(this).siblings('.payinfo_blk_parent').toggle();
+	$(this).parents('.payinfo_blk').siblings('.payinfo_blk').removeClass('on'); //210428_수정 : 아코디언 추가.
+	var privacyToggle = $(this).find('span');
+	$(privacyToggle).text($(privacyToggle).text() == '보기' ? '닫기' : '보기');
+	return false;
+});
+
+//개인정보동의 열고닫기
+$(document).on('click','.area_paymentinfo .payinfo_blk a',function(e){
+	e.preventDefault();
+	$(this).parents('.payinfo_blk').toggleClass('on');
+	var privacyToggle = $(this).find('span');
+	$(privacyToggle).text($(privacyToggle).text() == '보기' ? '닫기' : '보기');
+	return false;
+});
+
 $(document).ready( function() {
 	// 1. 타이틀설정
 	$("#htopTitle").text("추가결제");

+ 1 - 1
src/main/webapp/WEB-INF/views/mob/order/OrderCompleteMob.html

@@ -84,7 +84,7 @@
 								<a href="javascript:void(0)">
 									<div>
 										<div class="fold_tit">
-											<span th:text="${orderInfo.ordNm}"></span>
+											<span>주문고객</span>
 										</div>
 										<div class="data">
 											<span th:text="${orderInfo.ordNm}"></span>

+ 31 - 29
src/main/webapp/WEB-INF/views/mob/order/OrderFormMob.html

@@ -245,8 +245,8 @@
 				</div>
 				
 				<div class="area_paymentinfo">
-					<!-- @자사만,무통장,실시간있으면 미노출 -->
-					<!-- @입점있으면  -->
+					<!-- @ 2021.06.11 자사만, (무통장, 실시간) 미노출 -->
+					<!-- @ 입점있으면 무조건 노출  -->
 					<div class="paymentinfo">
 						<div class="payinfo_blk_wrap">
 							<a href="javascript:void(0);">구매조건 확인 및 결제대행 서비스 약관 동의<span>보기</span></a>
@@ -842,14 +842,11 @@ var freegiftInfoSet = function() {
 				$("#orderForm .freegiftRdo").each(function(){
 					var usepoint 	= parseInt($(this).attr("usepoint"));
 					var count 		= parseInt($(this).attr("count"));
-					
+
 					// 첫번째 무료 선택 
 					if (usepoint == 0 && count == 1) {
 						$(this).trigger("click");
 						
-						total_gift 		= 0;
-						total_deduct 	= 0;
-						
 						// 2021.04.14 사은품 사용 포인트가 보유포인트보다 작아야 한다.
 						var rmPntAmt 			= parseInt($("#orderForm input[name='rmPntAmt']").val());
 						var freegiftUsePnt 		= parseInt($("#orderAmtForm .freegiftUsePnt").text());
@@ -861,20 +858,15 @@ var freegiftInfoSet = function() {
 							return false;
 						}
 						
-						$("#orderForm .freegiftRdo").each(function(){
-							if ($(this).attr("allYn") == "Y" ) {
+						/*
+						// 라디오버튼 사은품 체크
+						if ($(this).is(":checked")) {
+							// 수령거부가 아닐때 체크
+							if ($(this).val() != "noSel") {
 								total_gift 		+= 1;
+								total_deduct 	+= parseInt($(this).attr("usepoint"));
 							}
-							
-							// 라디오버튼 사은품 체크
-							if ($(this).is(":checked")) {
-								// 수령거부가 아닐때 체크
-								if ($(this).val() != "noSel") {
-									total_gift 		+= 1;
-									total_deduct 	+= parseInt($(this).attr("usepoint"));
-								}
-							}
-						});
+						}
 						
 						$("#orderForm .total_gift").text(total_gift);							// 사은품총선택개수
 						$("#orderForm .total_deduct").text(total_deduct.addComma());			// 사은품총사용포인트
@@ -882,14 +874,17 @@ var freegiftInfoSet = function() {
 						
 						// 포인트초기화기능
 						pntDcAmtReset();
+						*/
 					}
 				});
-
-				total_gift = 0;
 				
-				// 사은품테이블 그리기
-				$("#orderForm .gift_box").each(function(){
-					$(this).find(".freegiftRdo").each(function(){
+				// 2021.06.11 사은품 초기화 작업
+				total_gift = 0;
+				$("#orderForm .freegiftRdo").each(function(){
+					if ($(this).attr("allYn") == "Y" ) {
+						total_gift += 1;
+					} else {
+						// 라디오버튼 사은품 체크
 						if ($(this).is(":checked")) {
 							// 수령거부가 아닐때 체크
 							if ($(this).val() != "noSel") {
@@ -897,10 +892,16 @@ var freegiftInfoSet = function() {
 								total_deduct 	+= parseInt($(this).attr("usepoint"));
 							}
 						}
-						$("#orderForm .total_gift").text(total_gift);						// 사은품총선택개수
-					});
+					}
 				});
 				
+				$("#orderForm .total_gift").text(total_gift);							// 사은품총선택개수
+				$("#orderForm .total_deduct").text(total_deduct.addComma());			// 사은품총사용포인트
+				$("#orderAmtForm .freegiftUsePnt").text(total_deduct);
+				
+				// 포인트초기화기능
+				pntDcAmtReset();
+				
 				// 2021.04.29 사은품동의 체크 기능
 				/*
 				$("#orderForm #chk-agree_gift").on("click", function(){
@@ -982,9 +983,9 @@ var paymentInfoSet = function() {
 						$("#orderForm .area_paymentinfo .agree1").hide();
 						
 						if (delvCnt > 0) {
-							$("#orderForm .area_paymentinfo .paymentinfo.agree2").show();
+							$("#orderForm .area_paymentinfo .paymentinfo").show();
 						} else {
-							$("#orderForm .area_paymentinfo .paymentinfo.agree2").hide();
+							$("#orderForm .area_paymentinfo .paymentinfo").hide();
 						}
 					}
 				});
@@ -992,10 +993,11 @@ var paymentInfoSet = function() {
 				// 2021.05.16 초기값설정
 				$("#orderForm .area_paymethod .agree_insurance").hide();
 				$("#orderForm .area_paymentinfo .agree1").hide();
+				
 				if (delvCnt > 0) {
-					$("#orderForm .area_paymentinfo .paymentinfo.agree2").show();
+					$("#orderForm .area_paymentinfo .paymentinfo").show();
 				} else {
-					$("#orderForm .area_paymentinfo .paymentinfo.agree2").hide();
+					$("#orderForm .area_paymentinfo .paymentinfo").hide();
 				}
 
 				// 결제하기

+ 1 - 1
src/main/webapp/WEB-INF/views/mob/planning/PlanningEventAttendFormMob.html

@@ -283,8 +283,8 @@ var appendHtml = function () {
 		html += '</tr>\n';
 
 		$("#monthTbody").append(html);
+		$('.day').html('<span>' + custAttendList.length + '</span>일');
 		if (cfCheckLogin()) {
-			$('.day').html('<span>' + custAttendList.length + '</span>일');
 			$.each(custAttendList, function(idx1, item1) {
 				if(item1.entryDt == item.sun || item1.entryDt == item.mon || item1.entryDt == item.tue|| item1.entryDt == item.wed
 						|| item1.entryDt == item.thu || item1.entryDt == item.fri || item1.entryDt == item.sat){

+ 23 - 13
src/main/webapp/WEB-INF/views/mob/planning/PlanningEventPollFormMob.html

@@ -46,7 +46,7 @@
 													</th:block>
 													<th:block th:unless="${pollData.pollQval1 != '기타'}">
 														<input type="radio" th:name="${pollData.pollQsq+'_'+(pollStat.index+1)}" th:id="'rdi-1-'+${pollData.pollQsq}" th:value="${pollData.pollQval1}" class="etc"><label th:for="'rdi-1-'+${pollData.pollQsq}"><span th:text="${pollData.pollQval1}"></span></label>
-														<textarea th:name="'etc_input_'+${pollData.pollQsq}" id=""></textarea>
+														<textarea th:name="'etc_input_'+${pollData.pollQsq}" id="" class="etc_input" ></textarea>
 													</th:block>
 												</li>
 												<li th:if="${pollData.pollQval2 != null && pollData.pollQval2 != ''}">
@@ -55,7 +55,7 @@
 													</th:block>
 													<th:block th:unless="${pollData.pollQval2 != '기타'}">
 														<input type="radio" th:name="${pollData.pollQsq+'_'+(pollStat.index+1)}" th:id="'rdi-2-'+${pollData.pollQsq}" th:value="${pollData.pollQval2}" class="etc"><label th:for="'rdi-2-'+${pollData.pollQsq}"><span th:text="${pollData.pollQval2}"></span></label>
-														<textarea th:name="'etc_input_'+${pollData.pollQsq}" id=""></textarea>
+														<textarea th:name="'etc_input_'+${pollData.pollQsq}" id="" class="etc_input" ></textarea>
 													</th:block>
 												</li>
 												<li th:if="${pollData.pollQval3 != null && pollData.pollQval3 != ''}">
@@ -64,7 +64,7 @@
 													</th:block>
 													<th:block th:unless="${pollData.pollQval3 != '기타'}">
 														<input type="radio" th:name="${pollData.pollQsq+'_'+(pollStat.index+1)}" th:id="'rdi-3-'+${pollData.pollQsq}" th:value="${pollData.pollQval3}" class="etc"><label th:for="'rdi-3-'+${pollData.pollQsq}"><span th:text="${pollData.pollQval3}"></span></label>
-														<textarea th:name="'etc_input_'+${pollData.pollQsq}" id=""></textarea>
+														<textarea th:name="'etc_input_'+${pollData.pollQsq}" id="" class="etc_input" ></textarea>
 													</th:block>
 												</li>
 												<li th:if="${pollData.pollQval4 != null && pollData.pollQval4 != ''}">
@@ -73,7 +73,7 @@
 													</th:block>
 													<th:block th:unless="${pollData.pollQval4 != '기타'}">
 														<input type="radio" th:name="${pollData.pollQsq+'_'+(pollStat.index+1)}" th:id="'rdi-4-'+${pollData.pollQsq}" th:value="${pollData.pollQval4}" class="etc"><label th:for="'rdi-4-'+${pollData.pollQsq}"><span th:text="${pollData.pollQval4}"></span></label>
-														<textarea th:name="'etc_input_'+${pollData.pollQsq}" id=""></textarea>
+														<textarea th:name="'etc_input_'+${pollData.pollQsq}" id="" class="etc_input" > </textarea>
 													</th:block>
 												</li>
 												<li th:if="${pollData.pollQval5 != null && pollData.pollQval5 != ''}">
@@ -82,7 +82,7 @@
 													</th:block>
 													<th:block th:unless="${pollData.pollQval5 != '기타'}">
 														<input type="radio" th:name="${pollData.pollQsq+'_'+(pollStat.index+1)}" th:id="'rdi-5-'+${pollData.pollQsq}" th:value="${pollData.pollQval5}" class="etc"><label th:for="'rdi-5-'+${pollData.pollQsq}"><span th:text="${pollData.pollQval5}"></span></label>
-														<textarea th:name="'etc_input_'+${pollData.pollQsq}" id=""></textarea>
+														<textarea th:name="'etc_input_'+${pollData.pollQsq}" id="" class="etc_input" ></textarea>
 													</th:block>
 												</li>
 												<li th:if="${pollData.pollQval6 != null && pollData.pollQval6 != ''}">
@@ -91,7 +91,7 @@
 													</th:block>
 													<th:block th:unless="${pollData.pollQval6 != '기타'}">
 														<input type="radio" th:name="${pollData.pollQsq+'_'+(pollStat.index+1)}" th:id="'rdi-6-'+${pollData.pollQsq}" th:value="${pollData.pollQval6}" class="etc"><label th:for="'rdi-6-'+${pollData.pollQsq}"><span th:text="${pollData.pollQval6}"></span></label>
-														<textarea th:name="'etc_input_'+${pollData.pollQsq}" id=""></textarea>
+														<textarea th:name="'etc_input_'+${pollData.pollQsq}" id="" class="etc_input" ></textarea>
 													</th:block>
 												</li>
 												<li th:if="${pollData.pollQval7 != null && pollData.pollQval7 != ''}">
@@ -100,7 +100,7 @@
 													</th:block>
 													<th:block th:unless="${pollData.pollQval7 != '기타'}">
 														<input type="radio" th:name="${pollData.pollQsq+'_'+(pollStat.index+1)}" th:id="'rdi-7-'+${pollData.pollQsq}" th:value="${pollData.pollQval7}" class="etc"><label th:for="'rdi-7-'+${pollData.pollQsq}"><span th:text="${pollData.pollQval7}"></span></label>
-														<textarea th:name="'etc_input_'+${pollData.pollQsq}" id=""></textarea>
+														<textarea th:name="'etc_input_'+${pollData.pollQsq}" id="" class="etc_input" ></textarea>
 													</th:block>
 												</li>
 												<li th:if="${pollData.pollQval8 != null && pollData.pollQval8 != ''}">
@@ -109,7 +109,7 @@
 													</th:block>
 													<th:block th:unless="${pollData.pollQval8 != '기타'}">
 														<input type="radio" th:name="${pollData.pollQsq+'_'+(pollStat.index+1)}" th:id="'rdi-8-'+${pollData.pollQsq}" th:value="${pollData.pollQval8}" class="etc"><label th:for="'rdi-8-'+${pollData.pollQsq}"><span th:text="${pollData.pollQval8}"></span></label>
-														<textarea th:name="'etc_input_'+${pollData.pollQsq}" id=""></textarea>
+														<textarea th:name="'etc_input_'+${pollData.pollQsq}" id="" class="etc_input" ></textarea>
 													</th:block>
 												</li>
 												<li th:if="${pollData.pollQval9 != null && pollData.pollQval9 != ''}">
@@ -118,7 +118,7 @@
 													</th:block>
 													<th:block th:unless="${pollData.pollQval9 != '기타'}">
 														<input type="radio" th:name="${pollData.pollQsq+'_'+(pollStat.index+1)}" th:id="'rdi-9-'+${pollData.pollQsq}" th:value="${pollData.pollQval9}"class="etc"><label th:for="'rdi-9-'+${pollData.pollQsq}"><span th:text="${pollData.pollQval9}"></span></label>
-														<textarea th:name="'etc_input_'+${pollData.pollQsq}" id=""></textarea>
+														<textarea th:name="'etc_input_'+${pollData.pollQsq}" id="" class="etc_input" ></textarea>
 													</th:block>
 												</li>
 												<li th:if="${pollData.pollQval10 != null && pollData.pollQval10 != ''}">
@@ -127,7 +127,7 @@
 													</th:block>
 													<th:block th:unless="${pollData.pollQval10 != '기타'}">
 														<input type="radio" th:name="${pollData.pollQsq+'_'+(pollStat.index+1)}" th:id="'rdi-10-'+${pollData.pollQsq}" th:value="${pollData.pollQval10}" class="etc"><label th:for="'rdi-10-'+${pollData.pollQsq}"><span th:text="${pollData.pollQval10}"></span></label>
-														<textarea th:name="'etc_input_'+${pollData.pollQsq}" id=""></textarea>
+														<textarea th:name="'etc_input_'+${pollData.pollQsq}" id="" class="etc_input" ></textarea>
 													</th:block>
 												</li>
 											</ul>
@@ -213,15 +213,15 @@
 							th:with="stylelUrl=${@environment.getProperty('domain.front')},  planView=${@environment.getProperty('upload.image.view')}">
 							<span>
 								<button type="button" id="kakao-link-btn" class="kk"
-									th:attr="onclick=|cfnSendToKakaoMob('${stylelUrl+'/planning/detail/form?planSq='+planInfo.planSq}', '${planInfo.planNm}', '${planView+ '/'+planInfo.mainMimg}');|">
+									th:attr="onclick=|cfnSendToKakaoMob('${stylelUrl+'/planning/detail/form?planSq='+pollInfo.planSq}', '${pollInfo.planNm}', '${planView+ '/'+pollInfo.mainMimg}');|">
 									<span>카카오톡</span>
 								</button>
 								<button type="button" class="fb"
-									th:attr="onclick=|sendSns('facebook', '${stylelUrl+'/planning/detail/form?planSq='+planInfo.planSq}', '${planInfo.planNm}', '', '');|">
+									th:attr="onclick=|sendSns('facebook', '${stylelUrl+'/planning/detail/form?planSq='+pollInfo.planSq}', '${pollInfo.planNm}', '', '');|">
 									<span>페이스북</span>
 								</button>
 								<button type="button" class="tw"
-									th:attr="onclick=|sendSns('twitter', '${stylelUrl+'/planning/detail/form?planSq='+planInfo.planSq}',  '${planInfo.planNm+ '#style24몰'}', '', '');|">
+									th:attr="onclick=|sendSns('twitter', '${stylelUrl+'/planning/detail/form?planSq='+pollInfo.planSq}',  '${pollInfo.planNm+ '#style24몰'}', '', '');|">
 									<span>트위터</span>
 								</button>
 								<button type="button" class="url btn_copy">
@@ -359,6 +359,16 @@ $(document).ready(function(){
 		}
 	});
 	
+	$('.ev .survey_wrap .survey_con .survey_row input[type="radio"]').change(function(){
+		if ($('.etc_radio').is(':checked')) {
+			// $('.etc_input').removeAttr('disabled');
+			$('.etc_input').css({'visibility': 'visible'}); 
+		} else {
+			// $('.etc_input').attr('disabled', true);
+			$('.etc_input').css({'visibility': 'hidden'}); 
+		}   
+	});				
+	
 	
 })
 </script>

+ 6 - 0
src/main/webapp/WEB-INF/views/mob/popup/DelvAddrAddPopMob.html

@@ -235,6 +235,12 @@ var deliveryAddFormCheck = function() {
 		$('#deliveryAddForm input[name=recipPhnno]').focus();
 		return false;
 	}
+
+	if ($("#deliveryAddForm input[name=recipPhnno]").val().length < 10) {
+		mcxDialog.alert("휴대폰번호를 정확히 입력해주세요.");
+		$('#deliveryAddForm input[name=recipPhnno]').focus();
+		return false;
+	}
 	
 	if (gagajf.isNull($("#deliveryAddForm input[name=recipZipcode]").val())) {
 		mcxDialog.alert("배송주소를 입력해주세요.");

+ 12 - 1
src/main/webapp/WEB-INF/views/mob/popup/DelvAddrModifyPopMob.html

@@ -258,7 +258,18 @@ var deliveryModifyFormCheck = function() {
 		$('#deliveryModifyForm input[name=custNm]').focus();
 		return false;
 	}
-	
+	if (gagajf.isNull($("#deliveryModifyForm input[name=recipPhnno]").val())) {
+		mcxDialog.alert("휴대폰번호를 입력해주세요.");
+		$('#deliveryAddForm input[name=recipPhnno]').focus();
+		return false;
+	}
+
+	if ($("#deliveryModifyForm input[name=recipPhnno]").val().length < 10) {
+		mcxDialog.alert("휴대폰번호를 정확히 입력해주세요.");
+		$('#deliveryAddForm input[name=recipPhnno]').focus();
+		return false;
+	}
+
 	if (gagajf.isNull($("#deliveryModifyForm input[name=recipZipcode]").val())) {
 		mcxDialog.alert("배송주소를 입력해주세요.");
 		$('#deliveryModifyForm input[name=recipAddr]').focus();

+ 13 - 8
src/main/webapp/WEB-INF/views/web/SigninFormWeb.html

@@ -272,7 +272,7 @@
 
 	// SNS 로그인 콜백함수(네이버, 카카오, YES24)
 	var fnSnsSigninCallback = function(userInfo) {
-		// 1. CI 정보로 사용자가 없어 회원가입 프로세스 처리 중 이메일, 휴대전화 중복
+		// 1.CI 정보로 사용자가 없어 회원가입 처리 중 이메일, 휴대전화 중복
 		if (userInfo.custStat === 'DUP_PHONE_CUST') {
 			mcxDialog.alert("이미 사용 중인 휴대전화번호 입니다.");
 			return;
@@ -281,12 +281,12 @@
 			mcxDialog.alert("이미 사용 중인 이메일 입니다.");
 			return;
 		}
-		// 2. SNS 로그인 정보로 탈퇴확인
+		// 2.SNS 로그인 정보로 탈퇴확인
 		if (userInfo.custStat === 'SECEDE_CUST') {
 			mcxDialog.alert("탈퇴 회원 입니다.");
 			return;
 		}
-		// 3. SNS 로그인 정보로 휴면확인
+		// 3.SNS 로그인 정보로 휴면확인
 		if (userInfo.custStat === 'DORMANT_CUST') {
 			mcxDialog.alertC("휴면 고객님께서는 휴면을<br>해지하신 후 사용하실 수 있습니다.", {
 				sureBtnText: "확인",
@@ -296,16 +296,16 @@
 			});
 			return;
 		}
-		// 4. 휴대전화 정보가 없으면 SNS 가입화면 이동
+		// 4.휴대전화 정보가 없으면 SNS 가입화면 이동
 		if (userInfo.custStat === 'EMPTY_PHONE_CUST') {
-			cfnGoToPage(_PAGE_CUSTOMER_JOIN);
+			cfnGoToPage(_PAGE_CUSTOMER_SNS_JOIN);
 		}
-		// 5. YES24 첫 로그인 시도 시 정보동의 페이지 이동
+		// 5.YES24 첫 로그인 시도 시 정보동의 페이지 이동
 		if (userInfo.custStat === 'NEED_AGREE_CUST') {
 			cfnConsentUseInfo(userInfo.custNm);
 			return;
 		}
-		// 6. SNS 정보로 가입 성공시 가입완료 페이지 이동
+		// 6.SNS 정보로 가입 성공시 가입완료 페이지 이동
 		if (userInfo.custStat === 'NEW_CUST') {
 			cfnGoToPage(_PAGE_CUSTOMER_JOIN_COMPLETE);
 			return;
@@ -315,7 +315,12 @@
 			mcxDialog.alert("회원가입에 실패 했습니다.<br> 고객센터에 문의 하시기 바랍니다.");
 			return;
 		}
-		// 8. SNS 로그인 연동 성공 및 기존 SNS 연동된 회원 로그인 시도
+		// 8.CI 정보가 없을때 안내 창 알림
+		if (userInfo.custStat === 'EMPTY_CI_CUST') {
+			mcxDialog.alert("연계정보(CI) 값이 없습니다.<br> 고객센터에 문의 하시기 바랍니다.");
+			return;
+		}
+		// 9.SNS 로그인 연동 성공 및 기존 SNS 연동된 회원 로그인 시도
 		if (userInfo.custStat === 'SUCC_CUST') {
 			let params = {};
 			params.snsType = userInfo.snsType;

+ 12 - 3
src/main/webapp/WEB-INF/views/web/callcenter/GoodsQnaFormWeb.html

@@ -107,6 +107,15 @@
 		gagaPaging.load(1);
 	}
 	
+	var fnReplaceBr = function(obj){
+        let tag = '';
+        if(!gagajf.isNull(obj)){
+            var brText = obj;
+            tag = brText.replace(/(&lt;br\/&gt;)/g, '<br>');
+        }
+        return tag;
+    }
+	
 	var fnGetListCallback = function(result) {
 		$('#ulQna').html('');
 
@@ -120,7 +129,7 @@
 				tag += '				<span class="fold_state ' + (item.ansStat == "G060_10" ? "doing" : "done") + '">' + item.ansStatNm + '</span>\n'; //답변완료 : done / 처리중 : doing
 				tag += '				<div class="fold_tit">\n';
 				tag += '					<span class="prod">' + item.goodsNm + ' ' + item.relGoodsCd + '</span>\n';
-				tag += '					<span>' + item.questContent.escapeHtml() + '</span>\n';
+				tag += '					<span>' + fnReplaceBr(item.questContent.escapeHtml()) + '</span>\n';
 				tag += '				</div>\n';
 				tag += '				<span class="data">' + item.questDt + '</span>\n';
 				tag += '			</div>\n';
@@ -129,7 +138,7 @@
 				tag += '	<div class="fold_cont" style="display: none;">\n';
 				tag += '		<div class="fold_detail">\n'; //문의 내용
 				tag += '			<div>\n';
-				tag += '				<p>' + item.questContent.escapeHtml() + '</p>\n';
+				tag += '				<p>' + fnReplaceBr(item.questContent.escapeHtml()) + '</p>\n';
 				tag += '			</div>\n';
 				
 				if (item.ansStat == 'G060_20') { // 답변완료일 때
@@ -141,7 +150,7 @@
 				if (item.ansStat == 'G060_20') { // 답변완료 상태일 때
 					tag += '		<div class="fold_answer">\n'; //문의 답변
 					tag += '			<div class="answer_head">답변이 등록되었습니다.</div>\n';
-					tag += '			<div class="answer_body">' + item.ansContent + '</div>\n';
+					tag += '			<div class="answer_body">' + fnReplaceBr(item.ansContent.escapeHtml()) + '</div>\n';
 					tag += '			<span class="data">' + item.ansDt + '</span>\n';
 					tag += '		</div>\n';
 				}

+ 11 - 2
src/main/webapp/WEB-INF/views/web/callcenter/OneToOneQnaFormWeb.html

@@ -170,6 +170,15 @@
 		gagaPaging.load(1);
 	}
 	
+	var fnReplaceBr = function(obj){
+        let tag = '';
+        if(!gagajf.isNull(obj)){
+            var brText = obj;
+            tag = brText.replace(/(&lt;br\/&gt;)/g, '<br>');
+        }
+        return tag;
+    }
+	
 	var fnGetListCallback = function(result) {
 		$('#ulQna').html('');
 
@@ -192,7 +201,7 @@
 				tag += '	<div class="fold_cont" style="display: none;">\n';
 				tag += '		<div class="fold_detail">\n'; //문의 내용
 				tag += '			<div>\n';
-				tag += '				<p>' + item.questContent + '</p>\n';
+				tag += '				<p>' + fnReplaceBr(item.questContent.escapeHtml()) + '</p>\n';
 				
 				if (!gagajf.isNull(item.sysFileNm1) || !gagajf.isNull(item.sysFileNm2)) {
 					tag += '				<p class="img_group">\n';
@@ -223,7 +232,7 @@
 				if (item.ansStat == 'G060_20') { // 답변완료 상태일 때
 					tag += '		<div class="fold_answer">\n'; //문의 답변
 					tag += '			<div class="answer_head">답변이 등록되었습니다.</div>\n';
-					tag += '			<div class="answer_body">' + item.ansContent.escapeHtml() + '</div>\n';
+					tag += '			<div class="answer_body">' + fnReplaceBr(item.ansContent.escapeHtml()) + '</div>\n';
 					tag += '			<span class="data">' + item.ansDt + '</span>\n';
 					tag += '		</div>\n';
 				}

+ 8 - 2
src/main/webapp/WEB-INF/views/web/customer/ConsentUseInfoFormWeb.html

@@ -87,7 +87,7 @@
 		}
 		// 4. 휴대전화 정보가 없으면 SNS 가입화면 이동
 		if (userInfo.custStat === 'EMPTY_PHONE_CUST') {
-			cfnGoToPage(_PAGE_CUSTOMER_JOIN);
+			cfnGoToPage(_PAGE_CUSTOMER_SNS_JOIN);
 			$.modal.close();
 			return;
 		}
@@ -103,7 +103,13 @@
 			$.modal.close();
 			return;
 		}
-		// 7. SNS 로그인 연동 성공 및 기존 SNS 연동된 회원 로그인 시도
+		// 7.CI 정보가 없을때 안내 창 알림
+		if (userInfo.custStat === 'EMPTY_CI_CUST') {
+			mcxDialog.alert("연계정보(CI) 값이 없습니다.<br> 고객센터에 문의 하시기 바랍니다.");
+			$.modal.close();
+			return;
+		}
+		// 8. SNS 로그인 연동 성공 및 기존 SNS 연동된 회원 로그인 시도
 		if (userInfo.custStat === 'SUCC_CUST') {
 			let params = {};
 			params.snsType = userInfo.snsType;

+ 26 - 6
src/main/webapp/WEB-INF/views/web/customer/JoinFormWeb.html

@@ -19,7 +19,6 @@
 <body>
 <th:block layout:fragment="content">
 <style>
-	.show{display:block}
 	.hide{display:none}
 </style>
 <div id="container" class="container mb">
@@ -35,12 +34,15 @@
 					<div class="form_field">
 						<label class="input_label sr-only">아이디</label>
 						<div class="input_wrap form_full">
-							<input type="text" id="custId" name="custId" placeholder="아이디(4~12자)" class="form_control" required="required" data-valid-type="alphaNumeric" data-valid-name="아이디" minlength="4" maxlength="12" autocomplete="no"/>
+							<input type="text" id="custId" name="custId" placeholder="아이디(4~12자)" class="form_control" required="required" data-valid-name="아이디" minlength="4" maxlength="12" autocomplete="no"/>
 							<span class="usable" style="display:block;"></span>
 						</div>
 						<div id="dupCustIdDiv" class="help_block hide">
 							<p class="t_err">이미 가입된 아이디입니다.다른 아이디를 입력하여 주세요.</p>
 						</div>
+						<div id="errCustIdDiv" class="help_block hide">
+							<p class="t_err">아이디는 영어와 숫자 조합만 가능합니다.</p>
+						</div>
 					</div>
 					<!-- //아이디 사용가능시 -->
 					<!-- 오류시 부모 div에서 제어 -->
@@ -186,13 +188,31 @@
 	// 아이디 확인
 	$('#custId').on('blur', function () {
 		let custId = $(this).val();
+		let $errCustIdDiv = $('#errCustIdDiv');
+		const $custId = $('#custId');
+
 		if(!gagajf.isNull(custId)) {
 			if (custId.length > 3) {
-				let custInfo = {};
-				custInfo.custId = custId;
-				let jsonData = JSON.stringify(custInfo);
-				gagajf.ajaxJsonSubmit('/customer/join/id/check', jsonData, fnIdConfirmCallBack);
+				if (!fnCheckCustId(custId)) {
+					$custId.addClass('err');
+					$custId.removeClass('usable');
+					$errCustIdDiv.show();
+					return;
+				} else {
+					$custId.removeClass('err');
+					$custId.addClass('usable');
+					$errCustIdDiv.hide();
+					let custInfo = {};
+					custInfo.custId = custId;
+					let jsonData = JSON.stringify(custInfo);
+					gagajf.ajaxJsonSubmit('/customer/join/id/check', jsonData, fnIdConfirmCallBack);
+				}
 			}
+		} else {
+			custIdCheck = false
+			$errCustIdDiv.show();
+			$custId.addClass('err');
+			$custId.removeClass('usable');
 		}
 	});
 

+ 13 - 8
src/main/webapp/WEB-INF/views/web/customer/JoinTypeFormWeb.html

@@ -69,7 +69,7 @@
 
 	// SNS 로그인 콜백함수(네이버, 카카오, YES24)
 	var fnSnsSigninCallback = function(userInfo) {
-		// 1. CI 정보로 사용자가 없어 회원가입 프로세스 처리 중 이메일, 휴대전화 중복
+		// 1.CI 정보로 사용자가 없어 회원가입 처리 중 이메일, 휴대전화 중복
 		if (userInfo.custStat === 'DUP_PHONE_CUST') {
 			mcxDialog.alert("이미 사용 중인 휴대전화번호 입니다.");
 			return;
@@ -78,12 +78,12 @@
 			mcxDialog.alert("이미 사용 중인 이메일 입니다.");
 			return;
 		}
-		// 2. SNS 로그인 정보로 탈퇴확인
+		// 2.SNS 로그인 정보로 탈퇴확인
 		if (userInfo.custStat === 'SECEDE_CUST') {
 			mcxDialog.alert("탈퇴 회원 입니다.");
 			return;
 		}
-		// 3. SNS 로그인 정보로 휴면확인
+		// 3.SNS 로그인 정보로 휴면확인
 		if (userInfo.custStat === 'DORMANT_CUST') {
 			mcxDialog.alertC("휴면 고객님께서는 휴면을<br>해지하신 후 사용하실 수 있습니다.", {
 				sureBtnText: "확인",
@@ -93,16 +93,16 @@
 			});
 			return;
 		}
-		// 4. 휴대전화 정보가 없으면 SNS 가입화면 이동
+		// 4.휴대전화 정보가 없으면 SNS 가입화면 이동
 		if (userInfo.custStat === 'EMPTY_PHONE_CUST') {
-			cfnGoToPage(_PAGE_CUSTOMER_JOIN);
+			cfnGoToPage(_PAGE_CUSTOMER_SNS_JOIN);
 		}
-		// 5. YES24 첫 로그인 시도 시 정보동의 페이지 이동
+		// 5.YES24 첫 로그인 시도 시 정보동의 페이지 이동
 		if (userInfo.custStat === 'NEED_AGREE_CUST') {
 			cfnConsentUseInfo(userInfo.custNm);
 			return;
 		}
-		// 6. SNS 정보로 가입 성공시 가입완료 페이지 이동
+		// 6.SNS 정보로 가입 성공시 가입완료 페이지 이동
 		if (userInfo.custStat === 'NEW_CUST') {
 			cfnGoToPage(_PAGE_CUSTOMER_JOIN_COMPLETE);
 			return;
@@ -112,7 +112,12 @@
 			mcxDialog.alert("회원가입에 실패 했습니다.<br> 고객센터에 문의 하시기 바랍니다.");
 			return;
 		}
-		// 8. SNS 로그인 연동 성공 및 기존 SNS 연동된 회원 로그인 시도
+		// 8.CI 정보가 없을때 안내 창 알림
+		if (userInfo.custStat === 'EMPTY_CI_CUST') {
+			mcxDialog.alert("연계정보(CI) 값이 없습니다.<br> 고객센터에 문의 하시기 바랍니다.");
+			return;
+		}
+		// 9.SNS 로그인 연동 성공 및 기존 SNS 연동된 회원 로그인 시도
 		if (userInfo.custStat === 'SUCC_CUST') {
 			let params = {};
 			params.snsType = userInfo.snsType;

+ 51 - 238
src/main/webapp/WEB-INF/views/web/customer/PrivacyPolicyFormWeb.html

@@ -35,252 +35,50 @@
 				</div>
 			</div>
 			<div class="cont_body" th:utext="${#strings.replace(#strings.replace(clause,'&amplt;','<'),'&ampgt;','>')}">
-				<!-- <p>
-                        아이스타일이십사 주식회사에서 운영하는 www.istyle24.com은 고객님의 개인정보를 소중히 여기며, 안전한 거래를 위해 관련법령의 규정을 반영하여 준수하고 있습니다.
-                    </p>                    
-                    <div class="hookGrp">
-                        <div class="hook_list">
-                            <ul>
-                                <li>
-                                    <a href="#prvc1"><span>제1조 개인정보의 수집, 이용목적</span></a>
-                                    <a href="#prvc2"><span>제2조 정의</span></a>
-                                    <a href="#prvc3"><span>제3조 약관 등의 명시와 설명 및 개정</span></a>
-                                    <a href="#prvc4"><span>제4조 서비스의 제공 및 변경</span></a>
-                                    <a href="#prvc5"><span>제5조 서비스의 중단</span></a>
-                                    <a href="#prvc6"><span>제6조 회원가입</span></a>
-                                    <a href="#prvc7"><span>제7조 회원 탈퇴 및 자격 상실 등</span></a>
-                                    <a href="#prvc8"><span>제8조 회원에 대한 통지</span></a>
-                                </li>
-                                <li>
-                                    <a href="#prvc9"><span>제9조 구매신청</span></a>
-                                    <a href="#prvc10"><span>제10조 계약의 성립</span></a>
-                                    <a href="#prvc11"><span>제 11조</span></a>
-                                    <a href="#prvc12"><span>제 12조</span></a>
-                                    <a href="#prvc13"><span>제 13조</span></a>
-                                    <a href="#prvc14"><span>제 14조</span></a>
-                                    <a href="#prvc15"><span>제 15조</span></a>
-                                    <a href="#prvc16"><span>제 16조</span></a>
-                                </li>
-                                <li>
-                                    <a href="#prvc17"><span>제 17조</a>
-                                    <a href="#prvc18"><span>제 18조</span></a>
-                                    <a href="#prvc19"><span>제 19조</span></a>
-                                    <a href="#prvc20"><span>제 20조</span></a>
-                                    <a href="#prvc21"><span>제 21조</span></a>
-                                    <a href="#prvc22"><span>제 22조</span></a>
-                                    <a href="#prvc23"><span>제 23조</span></a>
-                                    <a href="#prvc24"><span>제24조 재판권 및 준거법</span></a>
-                                </li>
-                            </ul>
-                            
-                        </div>
-                        <div class="hook_cont"> 
-                            <div id="prvc1">
-                                <h4><span>제1조 개인정보의 수집, 이용목적</span></h4>
-                                <p>
-                                    이 약관은 아이스타일이십사 주식회사가 운영하는 www.istyle24.com(이하 "몰"이라 한다)에서 제공하는 인터넷 관련 서비스 (이하 "서비스"라 한다)를 이용함에 있어 사이버 몰과 이용자의
-                                    권리, 의무 및 책임사항을 규정함을 목적으로 합니다.
-                                </p>
-                                <table>
-                                    <colgroup>
-                                        <col width="300">
-                                        <col width="*">
-                                    </colgroup>   
-                                    <thead>
-                                        <tr>
-                                            <th>구분</th>
-                                            <th>이용목적</th>
-                                        </tr>
-                                    </thead>
-                                    <tbody>
-                                        <tr>
-                                            <td rowspan="5">회원관리</td>
-                                            <td>회원제 서비스 이용에 따른 본인확인, 개인식별</td>
-                                        </tr>
-                                        <tr>
-                                            <td>불량회원의 부정이용 방지와 비인가 사용 방지, 중복가입방지</td>
-                                        </tr>
-                                        <tr>
-                                            <td></td>
-                                        </tr>
-                                        <tr>
-                                            <td></td>
-                                        </tr>
-                                        <tr>
-                                            <td></td>
-                                        </tr>
-                                        <tr>
-                                            <td rowspan="3">서비스 제공에 관한 계약의 이행 및 서비스 제공에 따른 요금정산</td>
-                                            <td>콘텐츠 제공, 이벤트 당첨 결과안내 및 경품배송</td>
-                                        </tr>
-                                        <tr>
-                                            <td>금융거래 본인 인증 및 금융 서비스</td>
-                                        </tr>
-                                        <tr>
-                                            <td>물품 배송, 구매 및 요금 결제</td>
-                                        </tr>
-                                        <tr>
-                                            <td rowspan="7">마케팅 광고에 활용</td>
-                                            <td></td>
-                                        </tr>
-                                        <tr>
-                                            <td></td>
-                                        </tr>
-                                        <tr>
-                                            <td></td>
-                                        </tr>
-                                        <tr>
-                                            <td></td>
-                                        </tr>
-                                        <tr>
-                                            <td></td>
-                                        </tr>
-                                        <tr>
-                                            <td></td>
-                                        </tr>
-                                        <tr>
-                                            <td></td>
-                                        </tr>
-                                    </tbody>
-                                </table>
-                            </div>
-                            <div id="prvc2">
-                                <h4><span>제2조 정의</span></h4>
-                                <p>1. “몰”이란 아이스타일24가 재화 또는 용역(이하 “재화 등”이라 함)을 이용자에게 제공하기 위하여 컴퓨터 등 정보통신설비를 이용하여 재화 등을 거래할 수 있도록 설정한 가상의 영업장을 말하며, 아울러 사이버몰을 운영하는 사업자의 의미로도 사용합니다.</p>
-                                <p>2. '이용자'란 "몰"에 접속하여 이 약관에 따라 "몰"이 제공하는 서비스를 받는 회원 및 비회원을 말합니다.</p>
-                                <p>3. '회원'이라 함은 "몰"에 개인정보를 제공하여 회원등록을 한 자로서, "몰"의 정보를 지속적으로 제공받으며, "몰"이 제공하는 서비스를 계속적으로 이용할 수 있는 자를 말합니다.</p>
-                                <p>4. ‘비회원’이라 함은 회원에 가입하지 않고 몰”이 제공하는 서비스를 이용하는 자를 말합니다.</p>
-                                <p>5. '아이디(ID)'란 이용자가 회원가입 당시 몰에 등록한 사용자 '개인이용문자'를 말합니다.</p>
-                                <p>6. '비밀번호'란 회원의 동일성 확인과 비밀보호를 위하여 회원 스스로가 설정하여 몰에 등록한 '개인이용문자'로 회원으로 로그인을 하기위해 아이디와 같이 사용됩니다.</p>
-                                <p>7. ‘영업일’이란 회사가 정상적으로 서비스를 제공한 날로서 토요일, 일요일 및 법정 공휴일을 제외한 날을 말합니다.</p>
-                                <p>8. ‘아이포인트’란 아이스타일24를 통하여 회원이 상품을 구매할 때, 구매금액의 일정 비율이 적립되는 ‘몰’전용 마일리지로 적립일로부터 3년이 지나면 자동 소멸 됩니다</p>
-                                <p>9. ‘아이머니’란 상품구매 시 현금과 같이 이용할 수 있는 ‘몰’ 전용 사이버머니로, 적립된 아이포인트를 일정한 단위로 환전하여 사용할 수 있습니다.</p>
-                                <p>10. 기타 ‘2조’에서 정의되지 아니한 이 약관상의 용어의 의미는 일반적인 거래관행에 의합니다.</p>
-                            </div>
-                            <div id="prvc3">
-                                <h4><span>제3조 약관 등의 명시와 설명 및 개정</span></h4>
-                                <p>1. "몰"은 이 약관의 내용과 상호 및 대표자 성명, 영업소 소재지 주소(소비자의 불만을 처리할 수 있는 곳의 주소를 포함), 전화번호, 팩스번호, 전자우편주소, 사업자등록번호,
-                                    통신판매업신고번호, 개인정보관리책임자 등을 이용자가 쉽게 알 수 있도록 www.istyle24.com의 초기 서비스화면(전면)에 게시합니다.
-                                    다만, 이용약관의 내용은 이용자가 연결화면을 통하여 볼 수 있도록 할 수 있습니다.</p>
-                                <p>2. "몰"은 이용자가 약관에 동의하기에 앞서 약관에 정하여져 있는 내용 중 청약철회 배송책임 환불조건 등과 같은 중요한 내용을 이용자가 이해할 수 있도록 별도의 연결화면 또는 팝업화면 등을
-                                    제공하여 이용자의 확인을 구하여야 합니다.</p>
-                                <p>3. "몰"은 전자상거래등에서의소비자보호에관한법률, 약관의규제에관한법률, 전자거래기본법, 전자서명법, 정보통신망이용촉진등에관한법률, 방문판매등에관한법률, 소비자보호법 등
-                                    관련법을 위배하지 않는 범위에서 이 약관을 개정할 수 있습니다.</p>
-                                <p>4. "몰"이 약관을 개정할 경우에는 적용일자 및 개정사유를 명시하여 현행약관과 함께 몰의 초기화면에 그 적용일자 7일 이전부터 적용일자 전일까지 공지합니다.
-                                    다만, 이용자에게 불리하게 약관내용을 변경하는 경우에는 최소한 30일 이상의 사전 유예기간을 두고 공지합니다. 이 경우 "몰"은 개정 전 내용과 개정 후 내용을 명확하게 비교하여 이용자가
-                                    알기 쉽도록 표시합니다.</p>
-                                <p>5. "몰"이 약관을 개정할 경우에는 그 개정 약관은 그 적용일자 이후에 체결되는 계약에만 적용되고 그 이전에 이미 체결된 계약에 대해서는 개정전의 약관조항이 그대로 적용됩니다.
-                                    다만 이미 계약을 체결한 이용자가 개정 약관 조항의 적용을 받기를 원하는 뜻을 제3조에 의한 개정약관의 공지기간내에 "몰"에 송신하여 "몰"의 동의를 받은 경우에는 개정약관 조항이
-                                    적용됩니다.</p>
-                                <p>6. 본 약관에서 정하지 아니한 사항과 이 약관의 해석에 관하여는 전자상거래등에서의 소비자보호에관한법률, 약관의규제등에관한법률, 공정거래위원회가 정하는 전자상거래등에서의
-                                    소비자보호지침 및 관계법령 또는 상관례에 따릅니다.</p>
-                            </div>
-                            <div id="prvc4">
-                                <h4><span>제4조 서비스의 제공 및 변경</span></h4>
-                                <p>1. “몰"은 다음과 같은 업무를 수행합니다.</p>
-                                <ol>
-                                    <li>① 재화 또는 용역에 대한 정보 제공 및 구매계약의 체결</li>
-                                    <li>② 구매계약이 체결된 재화 또는 용역의 배송</li>
-                                    <li>③ 기타 “몰”이 정하는 업무</li>
-                                </ol>
-                                <p>2. "몰"은 재화 또는 용역의 품절 또는 기술적 사양의 변경 등의 경우에는 장차 체결되는 계약에 의해 제공할 재화 또는 용역의 내용을 변경할 수 있습니다. 이 경우에는 변경된 재화 또는 용역의
-                                    내용 및 제공일자를 명시하여 현재의 재화 또는 용역의 내용을 게시한 곳에 즉시 공지합니다.단, "몰"이 합리적으로 예측할 수 없는 불가피한 여건이나 사정이 있는 경우, 위 공지를 하지 않을 수
-                                    있습니다.
-                                    </p>
-                                <p>3. "몰"이 제공하기로 이용자와 계약을 체결한 서비스의 내용을 재화등의 품절 또는 기술적 사양의 변경 등의 사유로 변경할 경우에는 그 사유를 이용자에게 통지 합니다.</p>
-                                <p>4. 전항의 경우 "몰"은 이로 인하여 이용자가 입은 손해를 배상합니다. 다만, "몰"이 고의 또는 과실이 없음을 입증하는 경우에는 그러하지 아니합니다.</p>
-                            </div>
-                            <div id="prvc5">
-                                <h4><span>제5조 서비스의 중단</span></h4>
-                                <p>1. "몰"은 컴퓨터 등 정보통신설비의 보수점검·교체 및 고장, 통신의 두절 등의 사유가 발생한 경우에는 서비스의 제공을 일시적으로 중단할 수 있습니다.</p>
-                                <p>2. "몰"은 제1항의 사유로 서비스의 제공이 일시적으로 중단됨으로 인하여 이용자 또는 제3자가 입은 손해에 대하여 배상합니다.단, "몰"에 고의 또는 과실이 없는 경우에는 그러하지
-                                    아니합니다.</p>
-                                <p>3. "사업종목의 전환, 사업의 포기, 업체간의 통합 등의 이유로 서비스를 제공할 수 없게 되는 경우에는 "몰"은 제8조에 정한 방법으로 이용자에게 통지하고 당초 "몰"에서 제시한 조건에 따라
-                                    소비자에게 보상합니다.</p>
-                                <p>4. 다만, "몰"이 보상기준 등을 고지하지 아니한 경우에는 이용자들의 적립금 등을 "몰"에서 통용되는 통화가치에 상응하는 현물 또는 현금으로 이용자에게 지급합니다.</p>
-                            </div>
-                            <div>
-                                <h4  id="prvc6"><span>제6조 회원가입</span></h4>
-                                <p>1. 이용자는 "몰"이 정한 가입 양식에 따라 회원정보를 기입한 후 이 약관에 동의한다는 의사표시를 함으로서 회원가입을 신청합니다.</p>
-                                <p>2. "몰"은 제1항과 같이 회원으로 가입할 것을 신청한 이용자 중 다음 각호에 해당하지 않는 한 회원으로 등록합니다.</p>
-                                <ol>
-                                    <li>① 가입신청자가 이 약관 제7조 제3항에 의하여 이전에 회원자격을 상실한 적이 있는 경우, 다만 제7조 제3항에 의한 회원자격 상실후 3년이 경과한 자로서 "몰"의 회원 재가입 승낙을 얻은
-                                        경우에는 예외로 한다.</li>
-                                    <li>② 등록 내용에 허위, 기재누락, 오기가 있는 경우</li>
-                                    <li>③ 만 14세가 되지 않은 자가 신청하였을 경우</li>
-                                    <li>④기타 회원으로 등록하는 것이 "몰"의 기술상 현저히 지장이 있다고 판단되는 경우</li>
-                                </ol>
-                                <p>3. 회원가입계약의 성립시기는 "몰"의 승낙이 회원에게 도달한 시점으로 합니다.</p>
-                                <p>4. 가입신청자가 "몰"에 회원으로 가입하더라도 로그인하지 않은 상태에서 주문하는 경우는 회원주문이 아니라 비회원주문으로 인정합니다.</p>
-                                <p>5. 회원은 제15조 제1항에 의한 등록사항에 변경이 있는 경우, 즉시 전자우편 기타 방법으로 "몰"에 대하여 그 변경사항을 알려야 합니다.이러한 변경사항의 미 통보로 인해 발생하는 손해는
-                                    회원에게 그 책임이 있습니다.</p>
-                            </div>
-                            <div id="prvc7">
-                                <h4><span>제7조 회원 탈퇴 및 자격 상실 등</span></h4>
-                                <p>1. 회원은 "몰"에 언제든지 탈퇴를 요청할 수 있으며 "몰"은 즉시 회원탈퇴를 처리합니다.</p>
-                                <p>2. 회원이 다음 각호의 사유에 해당하는 경우, "몰"은 회원자격을 제한 및 정지시킬 수 있습니다.</p>
-                                <p>3. "몰"이 회원 자격을 제한 정지 시킨 후, 동일한 행위가 2회 이상 반복되거나 30일 이내에 그 사유가 시정되지 아니하는 경우 "몰"은 회원자격을 상실시킬 수 있습니다.</p>
-                                <p>4. "몰"이 회원자격을 상실시키는 경우에는 회원등록을 말소합니다. 이 경우 회원에게 이를 통지하고, 회원등록 말소 전에 최소한 30일 이상의 기간을 정하여 소명할 기회를 부여합니다.</p>
-                            </div>
-                            <div id="prvc8">
-                                <h4><span>제8조 회원에 대한 통지</span></h4>
-                                <p>1. "몰"이 회원에 대한 통지를 하는 경우, 회원이 "몰"에 제출하여 지정한 전자우편 주소로 할 수 있습니다.</p>
-                                <p>2. "몰"은 불특정다수 회원에 대한 통지의 경우 1주일이상 "몰" 게시판에 게시함으로서 개별 통지에 갈음할 수 있습니다.
-                                    다만, 회원 본인의 거래와 관련하여 중대한 영향을 미치는 사항에 대하여는 개별통지를 합니다.</p>
-                            </div>
-                            <div id="prvc9">
-                                <h4><span>제9조 구매신청</span></h4>
-                                <p>"몰"이용자는 "몰"상에서 다음 또는 이와 유사한 방법에 의하여 구매를 신청하며, "몰"은 이용자가 구매신청을 함에 있어서 다음의 각 내용을 알기 쉽게 제공하여야 합니다.
-                                    단, 회원인 경우 제2호 내지 제4호의 적용을 제외할 수 있습니다.</p>
-                                <p>1. 재화 등의 검색 및 선택</p>
-                                <p>2. 성명, 주소, 전화번호, 전자우편주소(또는 이동전화번호) 등의 입력</p>
-                                <p>3. 약관내용, 청약철회권이 제한되는 서비스, 배송료 설치비 등의 비용부담과 관련한 내용에 대한 확인</p>
-                                <p>4. 이 약관에 동의하고 위 3.호의 사항을 확인하거나 거부하는 표시(예, 마우스 클릭)</p>
-                                <p>5. 재화 등의 구매신청 및 이에 관한 확인 또는 "몰"의 확인에 대한 동의</p>
-                                <p>6. 결제방법의 선택</p>
-                            </div>
-                            <div id="prvc10">
-                                <h4><span>제10조 계약의 성립</span></h4>
-                                <p>1."몰"은 제9조와 같은 구매신청에 대하여 다음 각호에 해당하면 승낙하지 않을 수 있습니다. 다만, 미성년자와 계약을 체결하는 경우에는 법정대리인의 동의를 얻지 못하면 미성년자 본인 또는
-                                    법정대리인이 계약을 취소할 수 있다는 내용을 고지하여야 합니다.</p>
-                                    <ol>
-                                        <li>① 신청 내용에 허위, 기재누락, 오기가 있는 경우</li>
-                                        <li>② 미성년자가 담배, 주류 등 청소년보호법에서 금지하는 재화 및 용역을 구매하는 경우</li>
-                                        <li>③ 기타 구매신청에 승낙하는 것이 "몰" 기술상 현저히 지장이 있다고 판단하는 경우</li>
-                                    </ol>
-                                <p>2. "몰"의 승낙이 제12조 제1항의 수신확인통지형태로 이용자에게 도달한 시점에 계약이 성립한 것으로 봅니다.</p>
-                                <p>3. "몰"의 승낙의 의사표시에는 이용자의 구매 신청에 대한 확인 및 판매가능 여부, 구매신청의 정정 취소 등에 관한 정보 등을 포함하여야 합니다.</p>
-                                <p>4. 이 약관에 동의하고 위 3.호의 사항을 확인하거나 거부하는 표시(예, 마우스 클릭)</p>
-                                <p>5. 재화 등의 구매신청 및 이에 관한 확인 또는 "몰"의 확인에 대한 동의</p>
-                            </div>
-                            <div id="prvc24">
-                                <h4><span>제24조 재판권 및 준거법</span></h4>
-                                <p>1."몰"과 이용자간에 발생한 전자상거래 분쟁에 관한 소송은 제소 당시의 이용자의 주소에 의하고, 주소가 없는 경우에는 거소를 관할하는 지방법원의 전속관할로 합니다.
-                                    다만, 제소 당시 이용자의 주소 또는 거소가 분명하지 않거나 외국 거주자의 경우에는 민사소송법상의 관할법원에 제기합니다.</p>
-                                <p>2. "몰"과 이용자간에 제기된 전자상거래 소송에는 한국법을 적용합니다.</p>
-                            </div>
-                            <div id="prvc">
-                                <h4><span></span></h4>
-                                <p></p>
-                                <p></p>
-                                <p></p>
-                                <p></p>
-                                <p></p>
-                            </div>
-                            
-                            <div>
-                                <p>부칙 : 본 약관은 2016년 01월 04일부터 시행하며, 종전의 약관내용은 본 약관으로 대체합니다.</p>
-                            </div>
 
-                        </div>
-                    </div> -->
 			</div>
+			<div class="cont_foot">
+				<div id="prvc_sel">
+					<form class="form_wrap">
+						<div class="form_field">
+							<div class="select_custom prvs_detail">
+								<div class="combo">
+									<div class="select">개인정보 처리방침 v1.0</div>
+									<ul class="list" style="display: none;">
+										<th:block th:if="${clauseList}" th:each="oneData, status : ${clauseList}">
+											<li th:text="${oneData.clauseTitle}" th:onclick="fnGetCaluseInfo([[${oneData.clauseSq}]]);"></li>
+										</th:block>
+									</ul>
+								</div>
+							</div>
+						</div>
+					</form>
+				</div>
+			</div>
+
 		</div>
 	</div>
 </div>
 
 <script th:inline="javascript">
 /*<![CDATA[*/
+
+	$(document).ready(function() {
+		$(document).on("click","#partners",function(event){
+			cfnSupplyComanyLayer();
+		});
+	});
+
+	var fnGetCaluseInfo = function (clauseSq) {
+		$.get('/customer/privacy/policy/info/' + clauseSq
+			, function (data) {
+			if(!gagajf.isNull(data.clauseContent)) {
+				$('.cont_body').html(data.clauseContent);
+				$("html, body").animate({scrollTop : $("#container").offset().top},100)
+			}
+		});
+	};
+
 	// 약관 내부 링크
 	$(function() {
 		$(".hook_list ul li a").on("click", function() {
@@ -290,6 +88,21 @@
 			var hookPos = hookPot.offset().top - hookHeader;
 			$("html, body").animate({ scrollTop: hookPos }, 300);
 		});
+
+		$(window).scroll(function(){
+			var scroll = $(this).scrollTop();
+			var headerH = $(".header").height();
+			if ($(window).scrollTop() > headerH){
+				$(".header").addClass("minify");
+				return false;
+			}
+			else {
+				$(".header").removeClass("minify");
+				return false;
+			}
+		});
+
+		var prvc_select = new sCombo('.select_custom.prvs_detail');
 	});
 /*]]>*/
 </script>

+ 245 - 0
src/main/webapp/WEB-INF/views/web/customer/SnsJoinFormWeb.html

@@ -0,0 +1,245 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="web/common/layout/DefaultLayoutWeb">
+<!--
+ *******************************************************************************
+ * @source  : SnsJoinFormWeb.html
+ * @desc    : 회원정보 입력 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.05   jsshin     최초 작성
+ *******************************************************************************
+ -->
+<body>
+<th:block layout:fragment="content">
+<style>
+	.hide{display:none}
+</style>
+<div id="container" class="container mb">
+	<div class="wrap">
+		<div class="content join2"> <!-- 페이지특정 클래스 = join1 -->
+			<div class="cont_head">
+				<h4>회원정보 입력</h4>
+			</div>
+			<div class="cont_body">
+				<!-- form start -->
+				<form id="joinForm" name="joinForm" class="form_wrap form_col_c form_full" role="form">
+					<div class="form_field">
+						<label class="input_label sr-only">이메일</label>
+						<div class="input_wrap form_full">
+							<input type="text" id="email" name="email" th:value="${custSnsInfo.email}" placeholder="이메일" class="form_control" required="required" data-valid-name="이메일" maxlength="30" autocomplete="no" autocapitalize="no"/><!-- 잘못기입된 경우 class "err" 추가 -->
+							<!-- case (이메일 형식이 바르지않을경우,이미 가입되어있는 이메일인경우) -->
+							<div class="help_block">
+								<!-- 이메일 형식이 바르지않을경우 -->
+								<p id="failEmail" class="t_err hide">
+									이메일 형식이 올바르지 않습니다.
+								</p>
+								<!-- //이메일 형식이 바르지않을경우 -->
+								<!-- 이미 가입되어있는 이메일인경우 -->
+								<p id="dupEmail" class="t_err hide">
+									이미 가입된 이메일 주소입니다. 다른 이메일 주소를 입력하여 주세요.
+								</p>
+								<div id="dupEmailDiv" class="mt20 hide">
+									<button type="button" class="btn btn_default btn_sm" onclick="cfnGoToPage(_PAGE_LOGIN);">
+										<span>로그인</span>
+									</button>
+									<button type="button" class="btn btn_default btn_sm" onclick="cfnGoToPage(_PAGE_CUSTOMER_ID_FIND);">
+										<span>아이디 찾기</span>
+									</button>
+								</div>
+								<!-- //이미 가입되어있는 이메일인경우 -->
+							</div>
+							<!-- //case (이메일 형식이 바르지않을경우,이미 가입되어있는 이메일인경우) -->
+						</div>
+					</div>
+					<div class="form_field">
+						<label class="input_label sr-only">휴대폰번호</label>
+						<div class="ui_row">
+							<div class="ui_col_9">
+								<div class="input_wrap">
+									<input type="text" id="cellPhnno" name="cellPhnno" placeholder="휴대폰 인증 해주세요." class="form_control" minlength="10" maxlength="11" required="required" data-valid-type="numeric" data-valid-name="휴대폰" readonly="readonly"/>
+								</div>
+							</div>
+							<div class="ui_col_3">
+								<button type="button" id="btnCellPhoneCertify" class="btn btn_dark btn_block">
+									<span>본인인증</span>
+								</button>
+							</div>
+						</div>
+						<!-- case (휴대폰번호 형식이 맞지 않을경우,이미 가입되어있는 핸드폰번호일경우) -->
+						<div class="help_block">
+							<!-- 휴대폰번호 형식이 맞지 않을경우 -->
+							<p id="failPhnno" class="t_err hide">휴대폰번호를 형식에 맞게 정확히 입력해주세요</p>
+							<!-- //휴대폰번호 형식이 맞지 않을경우 -->
+							<!-- 이미 가입되어있는 핸드폰번호일경우 -->
+							<p id="dupPhnno" class="t_err hide">I***D로 가입한 이력이 있습니다.</p>
+							<div id="dupPhnnoDiv" class="mt20 hide">
+								<button type="button" class="btn btn_default btn_sm" onclick="cfnGoToPage(_PAGE_LOGIN);">
+									<span>로그인</span>
+								</button>
+								<button type="button" class="btn btn_default btn_sm" onclick="cfnGoToPage(_PAGE_CUSTOMER_ID_FIND);">
+									<span>아이디 찾기</span>
+								</button>
+							</div>
+							<!-- //이미 가입되어있는 핸드폰번호일경우 -->
+						</div>
+						<!-- //case (휴대폰번호 형식이 맞지 않을경우,이미 가입되어있는 핸드폰번호일경우) -->
+					</div>
+					<div class="mt40">
+						<button type="button" id="btnJoin" class="btn btn_primary btn_block" disabled="disabled">
+							<span>동의하고 가입하기</span>
+						</button>
+					</div>
+					<div class="desc_wrap t_c mt20">
+						<p>
+							본인은&nbsp;만 14세 이상이며&nbsp;<a href="javascript:void(0)" onclick="cfnUseTermsLayer();">STYLE24이용약관<i class="ico ico_blank ml5"></i></a>
+							,&nbsp;<a href="javascript:void(0)" onclick="cfnPrivacyPolicyLayer();">개인정보 수집 및 이용<i class="ico ico_blank ml5"></i></a>,<br>
+							<a href="javascript:void(0)" onclick="cfnPrivacyTrustLayer();">개인정보 취급 위탁<i class="ico ico_blank ml5"></i></a> 내용을 확인 하였으며,동의합니다.
+						</p>
+					</div>
+					<input type="hidden" name="snsId" th:value="${custSnsInfo.snsId}"/>
+					<input type="hidden" name="snsType" th:value="${custSnsInfo.snsType}"/>
+					<input type="hidden" name="ci" th:value="${custSnsInfo.ci}"/>
+					<input type="hidden" name="memNo" th:value="${custSnsInfo.memNo}"/>
+				</form>
+				<!-- form End -->
+			</div>
+		</div>
+	</div>
+</div>
+
+<script th:src="@{'/biz/customer.js?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" src="/biz/customer.js"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let emailCheck = false;
+	let authCheck = false;
+
+	//	이메일 확인
+	$('#email').on('blur', function () {
+		const $failEmail = $('#failEmail');
+		let email = $(this).val();
+		let validation;
+
+		if(!gagajf.isNull(email)) {
+			if (!fnCheckValidationEmail(email)) {
+				$failEmail.show();
+				emailCheck = false;
+				validation = false;
+			} else {
+				validation = true;
+				$failEmail.hide();
+			}
+			if (validation) {
+				let custInfo = {};
+				custInfo.email = email;
+				let jsonData = JSON.stringify(custInfo);
+				gagajf.ajaxJsonSubmit('/customer/email/check', jsonData, fnEmailConfirmCallBack);
+			}
+		}
+	});
+
+	// 이메일 확인 결과
+	var fnEmailConfirmCallBack = function (result) {
+		const $dupEmail = $('#dupEmail');
+		const $dupEmailDiv = $('#dupEmailDiv');
+		if (result.isFind) { // 중복된 아이디가 존재
+			$dupEmail.show();
+			$dupEmailDiv.show();
+			emailCheck = false;
+		} else {
+			$dupEmail.hide();
+			$dupEmailDiv.hide();
+			emailCheck = true;
+		}
+		fnPossibleJoin();
+	};
+
+	//휴대폰 인증
+	$('#btnCellPhoneCertify').on('click', function () {
+		cfnOpenCellphoneCertify();
+	});
+
+	// 나이스 본인인증 후 콜백
+	var fnNiceCallBack = function(encData) {
+		if (!gagajf.isNull(encData)) {
+			let custInfo = {};
+			custInfo.encData = encData;
+			let jsonData = JSON.stringify(custInfo);
+			gagajf.ajaxJsonSubmit('/customer/authentication/check', jsonData, fnInfoConfirmCallBack);
+		}
+	};
+
+	// 본인인증 후 결과
+	var fnInfoConfirmCallBack = function (result) {
+		const $cellPhnno = $('#cellPhnno');
+		const $dupPhnno = $('#dupPhnno');
+		const $dupPhnnoDiv = $('#dupPhnnoDiv');
+		const $btnCellPhoneCertify = $('#btnCellPhoneCertify');
+		$cellPhnno.val(result.cellPhnno);
+
+		if (result.isFind) { // 가입된 고객 정보가 있으면
+			let msg = '';
+			if (result.custStat === 'G104_30') {
+				msg = "탈퇴한 회원입니다. 탈퇴 후 60일 동안 재가입이 불가능합니다.";
+			} else {
+				msg = result.maskingCustId+"로 가입된 이력이 있습니다.";
+			}
+			$dupPhnno.html(msg);
+			$dupPhnno.show();
+			$dupPhnnoDiv.show();
+			authCheck = false;
+		} else {
+			$dupPhnno.hide();
+			$dupPhnnoDiv.hide();
+			authCheck = true;
+		}
+		$btnCellPhoneCertify.find('span').text('인증완료');
+		$btnCellPhoneCertify.attr('disabled', true);
+		fnPossibleJoin();
+	};
+
+	// 저장
+	$('#btnJoin').on('click', function () {
+		mcxDialog.confirm("회원가입을 하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				$('#btnJoin').attr('disabled', true);
+				let jsonData = JSON.stringify($('#joinForm').serializeObject());
+				gagajf.ajaxJsonSubmit('/customer/sns/join/save', jsonData, fnJoinSaveCallback);
+			}
+		});
+	});
+
+	var fnJoinSaveCallback = function (result) {
+		cfnGoToPage(_PAGE_CUSTOMER_JOIN_COMPLETE);
+	};
+
+
+	// 가입 가능한지 확인
+	var fnPossibleJoin = function () {
+		const $btnJoin = $('#btnJoin');
+		if (emailCheck && authCheck ) {
+			$btnJoin.attr('disabled', false);
+		} else {
+			$btnJoin.attr('disabled', true);
+		}
+	};
+
+	$(document).ready(function () {
+		 $('#joinForm input[name=email]').trigger('blur');
+	});
+
+/*]]>*/
+</script>
+
+</th:block>
+
+</body>
+</html>

+ 101 - 0
src/main/webapp/WEB-INF/views/web/customer/SupplyCompanyLayerFormWeb.html

@@ -0,0 +1,101 @@
+<!DOCTYPE html>
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : SupplyCompanyLayerFormWeb.html
+ * @desc    : 공급업체 리스트 page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.06.09   jsshin       최초 작성
+ *******************************************************************************
+ -->
+<div class="modal-dialog" role="document">
+	<div class="modal-content">
+		<div class="modal-header">
+			<h5 class="modal-title" id="psptnLabel">업체 리스트</h5>
+		</div>
+		<div class="modal-body">
+			<div class="pop_cont">
+				<!-- 컨텐츠 시작 -->
+				<div class="ps ptn" >
+					<table>
+						<colgroup>
+							<col width="*">
+							<col width="30%">
+						</colgroup>
+						<thead>
+							<tr>
+								<th>업체명</th>
+								<th>대표자</th>
+							</tr>
+						</thead>
+						<tbody id="supplyCompanyList">
+						</tbody>
+					</table>
+					<div class="paging_wrap">
+						<ul class="pageNav" id="paging">
+						</ul>
+					</div>
+				</div>
+				<!-- 컨텐츠 종료 -->
+			</div>
+		</div>
+		<div class="modal-footer">
+			<a href="#close-modal" rel="modal:close" className="close-modal" class="btn btn_default">닫기</a>
+		</div>
+	</div>
+</div>
+<form id="supplyCompanyForm" name="supplyCompanyForm" th:action="@{/customer/supply/company/list}" th:method="post">
+	<input type="hidden" name="pageNo" value="1" />
+	<input type="hidden" name="pageSize" value="5" />
+</form>
+<script src="/ux/plugins/gaga/gaga.paging.js"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	var fnGetSupplyCompanyList = function () {
+		gagaPaging.init('supplyCompanyForm', fnSearchCallback, 'paging', 10);
+		gagaPaging.load(1);
+	}
+
+	var fnSearchCallback = function (result) {
+		$('#supplyCompanyList').html('');
+		let html = '';
+		if (!gagajf.isNull(result) && result.supplyCompanyList.length > 0) {
+			$.each(result.supplyCompanyList, function (idx, item) {
+				html += '<tr>\n';
+				html += '    <td>\n';
+				html += item.supplyCompNm;
+				html += '    </td>\n';
+				html += '    <td>\n';
+				html += item.ownerNm;
+				html += '    </td>\n';
+				html += '</tr>\n';
+			});
+		}
+		$('#supplyCompanyList').html(html);
+
+		gagaPaging.createPagination(result.paging.pageable);
+	}
+
+	$(document).ready(function() {
+		fnGetSupplyCompanyList();
+	});
+
+	//약관내부링크
+	$(function(){
+		$(".hook_list ul li a").on("click", function(){
+			var hookHeader = $(".modal-header").outerHeight() + 3000;
+			var hookHref = $(this).attr("href");
+			var hookPot = $(hookHref == "#" || hookHref == "" ? "body" : hookHref);
+			var hookPos = hookPot.offset().top - hookHeader;
+			$("html, body").animate({ scrollTop: hookPos }, 3000);
+		});
+	});
+/*]]>*/
+</script>
+</html>

+ 8 - 4
src/main/webapp/WEB-INF/views/web/display/SearchGoodsListFormWeb.html

@@ -93,9 +93,9 @@
 					<div class="taps">
 						<div>
 							<ul>
-								<li class="active"><a href="">상품<span>(123,456)</span></a></li>
-								<li><a href="">기획전<span>(56)</span></a></li>
-								<li><a href="">이벤트<span>(40)</span></a></li>
+								<li class="active"><a href="javascript:void(0);">상품<span id="prodListCnt"></span></a></li>
+								<li><a href="javascript:void(0);">기획전<span id="planListCnt"></span></a></li>
+								<li><a href="javascript:void(0);">이벤트<span id="eventListCnt"></span></a></li>
 							</ul>
 						</div>
 					</div>
@@ -1235,6 +1235,7 @@
 	<script th:src="@{'/biz/search.js?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" src="/biz/search.js"></script>
 
 	<script th:inline="javascript">
+		// var filterPriceList = [[${filterPriceList}]];
 		var fnSearchGoodsListSearch = function (){
 			gagaInfiniteScroll.getHistory();
 		}
@@ -1249,9 +1250,9 @@
 		}
 
 		var fnDrawInfiniteScrollData = function (result){
-			console.log(result);
 			let totalCnt = result.paging.totalCount;
 			$("#totCntId").text(totalCnt.addComma());
+			$("#prodListCnt").text('('+totalCnt.addComma()+')');
 			gagaInfiniteScroll.pageStatus.totalCount = totalCnt;
 			var ithrCd = '';
 			var contentLoc = '';
@@ -1264,6 +1265,9 @@
 				gagaInfiniteScroll.draw(htm);
 				//fnImgOnoff();
 			}
+
+			// let planTotalCnt = result.paging.totalPlanCount;
+			// $("#planListCnt").text('('+planTotalCnt.addComma()+')');
 		}
 
 		$(window).on("pageshow", function(event) {

+ 2 - 2
src/main/webapp/WEB-INF/views/web/goods/GoodsDealDetailFormWeb.html

@@ -790,8 +790,8 @@
 			}
 
 			if (minOrdQty > itemCnt) {
-				//alert("무슨작업을 해야할가요?");
-				return false;		 //무슨작업을 해야하나?
+				mcxDialog.alert("주문 가능한 옵션이 아닙니다. 옵션을 다시  선택해 주세요."); 
+				return false;
 			}
 			
 			//상품정보

+ 6 - 2
src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html

@@ -1451,8 +1451,12 @@
 					maxCnt = itemCnt;
 				}
 				if (minOrdQty > itemCnt) {
-					//alert("무슨작업을 해야할가요?");
-					return false;		 //무슨작업을 해야하나?
+					$("#cartForm  input[name=ordQty]").val(itemCnt);
+					$("#cartForm  input[name=cea]").val(itemCnt);
+					$("#cartForm  input[name=stock]").val(itemCnt);
+					$("#cartForm  input[name=maxOrdQty]").val(itemCnt); 
+					$("#cartForm  input[name=minOrdQty]").val(itemCnt); 
+					return false;		
 				}
 	
 				$("#cartForm  input[name=ordQty]").val(minOrdQty);

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

@@ -85,7 +85,7 @@
 					});	
 				}else{
 				tag +='		<span class="thumb">\n';
-				tag +='			<img src="'+_uploadGoodsUrl +'/'+review.sysImgNm+'?RS=365" alt="" onerror="' + _uximgUrl + '/images/pc/thumb/bg_item_none.png"  />\n';
+				tag +='			<img src="'+_uploadGoodsUrl +'/'+review.sysImgNm+'?RS=545" alt="" onerror="' + _uximgUrl + '/images/pc/thumb/bg_item_none.png"  />\n';
 				tag +='		</span>\n';	
 				}
 				tag +='	</div>\n';

+ 1 - 1
src/main/webapp/WEB-INF/views/web/mypage/MypageCustModifyFormWeb.html

@@ -157,7 +157,7 @@
 															<div class="select">선택</div>
 															<ul class="list">
 																<li id="bankCd_" class="selected">
-																	<div text="선택"></div>
+																	<div>선택</div>
 																	<input type="hidden" name="bankCd" value=""/>
 																</li>
 																<th:block th:if="${bankList}" th:each="oneData, status : ${bankList}">

+ 32 - 43
src/main/webapp/WEB-INF/views/web/order/OrderFormWeb.html

@@ -230,11 +230,11 @@
 							</div>
 							
 							<div class="area_paymentinfo">
-								<!-- @자사만,무통장,실시간있으면 미노출 -->
-								<!-- @입점있으면  -->
+								<!-- @ 2021.06.11 자사만, (무통장, 실시간) 미노출 -->
+								<!-- @ 입점있으면 무조건 노출  -->
 								<div class="paymentinfo">
 									<div class="payinfo_blk">
-										<a href="">개인정보 제공에 대한 동의<span>보기</span></a>
+										<a href="javascript:void(0);">개인정보 제공에 대한 동의<span>보기</span></a>
 										<div class="infotxt">STYLE24는 다음과 같이 회원님의 개인정보를 제3자에게 제공합니다.
 											<table>
 												<colgroup>
@@ -835,14 +835,11 @@ var freegiftInfoSet = function() {
 				$("#orderForm .freegiftRdo").each(function(){
 					var usepoint 	= parseInt($(this).attr("usepoint"));
 					var count 		= parseInt($(this).attr("count"));
-					
+
 					// 첫번째 무료 선택 
 					if (usepoint == 0 && count == 1) {
 						$(this).trigger("click");
 						
-						total_gift 		= 0;
-						total_deduct 	= 0;
-						
 						// 2021.04.14 사은품 사용 포인트가 보유포인트보다 작아야 한다.
 						var rmPntAmt 			= parseInt($("#orderForm input[name='rmPntAmt']").val());
 						var freegiftUsePnt 		= parseInt($("#orderAmtForm .freegiftUsePnt").text());
@@ -853,41 +850,33 @@ var freegiftInfoSet = function() {
 							mcxDialog.alert("보유포인트가 부족합니다.");
 							return false;
 						}
-						
-						$("#orderForm .freegiftRdo").each(function(){
-							if ($(this).attr("allYn") == "Y" ) {
-								total_gift 		+= 1;
-							}
-							
-							// 라디오버튼 사은품 체크
-							if ($(this).is(":checked")) {
-								// 수령거부가 아닐때 체크
-								if ($(this).val() != "noSel") {
-									total_gift 		+= 1;
-									total_deduct 	+= parseInt($(this).attr("usepoint"));
-								}
-							}
-						});
-						
-						$("#orderForm .total_gift").text(total_gift);							// 사은품총선택개수
-						$("#orderForm .total_deduct").text(total_deduct.addComma());			// 사은품총사용포인트
-						$("#orderAmtForm .freegiftUsePnt").text(total_deduct);
-						
-						// 포인트초기화기능
-						pntDcAmtReset();
 					}
 				});
 				
-				// 사은품테이블 그리기
-				$("#orderForm .gift_box").each(function(){
-					$(this).find(".freegiftRdo").each(function(){
-						if ($(this).attr("allYn") == "Y" ) {
-							total_gift += 1;
+				// 2021.06.11 사은품 초기화 작업
+				total_gift = 0;
+				$("#orderForm .freegiftRdo").each(function(){
+					if ($(this).attr("allYn") == "Y" ) {
+						total_gift += 1;
+					} else {
+						// 라디오버튼 사은품 체크
+						if ($(this).is(":checked")) {
+							// 수령거부가 아닐때 체크
+							if ($(this).val() != "noSel") {
+								total_gift 		+= 1;
+								total_deduct 	+= parseInt($(this).attr("usepoint"));
+							}
 						}
-						$("#orderForm .total_gift").text(total_gift);						// 사은품총선택개수
-					});
+					}
 				});
 				
+				$("#orderForm .total_gift").text(total_gift);							// 사은품총선택개수
+				$("#orderForm .total_deduct").text(total_deduct.addComma());			// 사은품총사용포인트
+				$("#orderAmtForm .freegiftUsePnt").text(total_deduct);
+				
+				// 포인트초기화기능
+				pntDcAmtReset();
+				
 				// 2021.04.29 사은품동의 체크 기능
 				/*
 				$("#orderForm #chk-agree_gift").on("click", function(){
@@ -943,9 +932,9 @@ var paymentInfoSet = function() {
 					}
 					
 					if (delvCnt > 0) {
-						$("#orderForm .area_paymentinfo").show();
+						$("#orderForm .area_paymentinfo .paymentinfo").show();
 					} else {
-						$("#orderForm .area_paymentinfo").hide();
+						$("#orderForm .area_paymentinfo .paymentinfo").hide();
 					}
 				});
 				
@@ -956,7 +945,7 @@ var paymentInfoSet = function() {
 					if (payType == "실시간계좌이체" || payType == "무통장입금" ) {
 						if ($(this).is(":checked")) {
 							$("#orderForm .area_paymethod .agree_insurance").show();
-							$("#orderForm .area_paymentinfo").show();
+							$("#orderForm .area_paymentinfo .paymentinfo").show();
 							$("#orderForm .area_paymentinfo .agree1").show();
 						} else {
 							displayTemp = false;
@@ -969,9 +958,9 @@ var paymentInfoSet = function() {
 						$("#orderForm .area_paymentinfo .agree1").hide();
 						
 						if (delvCnt > 0) {
-							$("#orderForm .area_paymentinfo").show();
+							$("#orderForm .area_paymentinfo .paymentinfo").show();
 						} else {
-							$("#orderForm .area_paymentinfo").hide();
+							$("#orderForm .area_paymentinfo .paymentinfo").hide();
 						}
 					}
 				});
@@ -979,9 +968,9 @@ var paymentInfoSet = function() {
 				// 2021.05.16 초기값설정
 				$("#orderForm .area_paymentinfo .agree1").hide();
 				if (delvCnt > 0) {
-					$("#orderForm .area_paymentinfo").show();
+					$("#orderForm .area_paymentinfo .paymentinfo").show();
 				} else {
-					$("#orderForm .area_paymentinfo").hide();
+					$("#orderForm .area_paymentinfo .paymentinfo").hide();
 				}
 				
 				// 결제하기

+ 3 - 3
src/main/webapp/WEB-INF/views/web/planning/PlanningEventAttendFormWeb.html

@@ -314,8 +314,8 @@ var appendHtml = function () {
 
 		$("#monthTbody").append(html);
 		if (cfCheckLogin()) {
+			$('.day').html('<span>' + custAttendList.length + '</span>일');
 			$.each(custAttendList, function(idx1, item1) {
-				$('.day').html('<span>' + custAttendList.length + '</span>일');
 				if(item1.entryDt == item.sun || item1.entryDt == item.mon || item1.entryDt == item.tue|| item1.entryDt == item.wed
 						|| item1.entryDt == item.thu || item1.entryDt == item.fri || item1.entryDt == item.sat){
 					$("#td_"+item1.entryDt).attr("class","complete");
@@ -342,7 +342,7 @@ var fnInfoConfirmCallBack = function(result) {
 	mcxDialog.alert(result.msg);
 	appendHtml();
 	$("#td_"+date).attr("class","complete");
-	$('.day').html('<span>' + (custAttendList.length +1) + '</span>일');
+	$('.day').html('<span>' + result.custAttendList.length + '</span>일');
 	
 };
 
@@ -359,7 +359,7 @@ $(document).ready(function() {
 	if (!cfCheckLogin()) {
 		$(".day").html("<span>0</span>일");
 	}else{
-		$('.day').html('<span>' + (custAttendList.length + 1) + '</span>일');
+		$('.day').html('<span>' + custAttendList.length + '</span>일');
 		$("#td_"+date).attr("class","today");
 		$.each(custAttendList, function(idx, item) {
 			if(item.entryDt == date){

+ 10 - 10
src/main/webapp/WEB-INF/views/web/planning/PlanningEventPollFormWeb.html

@@ -68,7 +68,7 @@
 															</th:block>
 															<th:block th:unless="${pollData.pollQval1 != '기타'}">
 																<input type="radio" th:name="${pollData.pollQsq+'_'+(pollStat.index+1)}" th:id="'rdi-1-'+${pollData.pollQsq}" th:value="${pollData.pollQval1}" class="etc_radio"><label th:for="'rdi-1-'+${pollData.pollQsq}"><span th:text="${pollData.pollQval1}"></span></label>
-																<input type="text" th:name="'etc_input_'+${pollData.pollQsq}" class="etc_input" />
+																<input type="text" th:name="'etc_input_'+${pollData.pollQsq}" class="form_control etc_input" />
 															</th:block>
 														</li>
 														<li th:if="${pollData.pollQval2 != null && pollData.pollQval2 != ''}">
@@ -77,7 +77,7 @@
 															</th:block>
 															<th:block th:unless="${pollData.pollQval2 != '기타'}">
 																<input type="radio" th:name="${pollData.pollQsq+'_'+(pollStat.index+1)}" th:id="'rdi-2-'+${pollData.pollQsq}" th:value="${pollData.pollQval2}" class="etc_radio"><label th:for="'rdi-2-'+${pollData.pollQsq}"><span th:text="${pollData.pollQval2}"></span></label>
-																<input type="text" th:name="'etc_input_'+${pollData.pollQsq}" class="etc_input" />
+																<input type="text" th:name="'etc_input_'+${pollData.pollQsq}" class="form_control etc_input" />
 															</th:block>
 														</li>
 														<li th:if="${pollData.pollQval3 != null && pollData.pollQval3 != ''}">
@@ -86,7 +86,7 @@
 															</th:block>
 															<th:block th:unless="${pollData.pollQval3 != '기타'}">
 																<input type="radio" th:name="${pollData.pollQsq+'_'+(pollStat.index+1)}" th:id="'rdi-3-'+${pollData.pollQsq}" th:value="${pollData.pollQval3}" class="etc_radio"><label th:for="'rdi-3-'+${pollData.pollQsq}"><span th:text="${pollData.pollQval3}"></span></label>
-																<input type="text" th:name="'etc_input_'+${pollData.pollQsq}" class="etc_input" />
+																<input type="text" th:name="'etc_input_'+${pollData.pollQsq}" class="form_control etc_input" />
 															</th:block>
 														</li>
 														<li th:if="${pollData.pollQval4 != null && pollData.pollQval4 != ''}">
@@ -95,7 +95,7 @@
 															</th:block>
 															<th:block th:unless="${pollData.pollQval4 != '기타'}">
 																<input type="radio" th:name="${pollData.pollQsq+'_'+(pollStat.index+1)}" th:id="'rdi-4-'+${pollData.pollQsq}" th:value="${pollData.pollQval4}" class="etc_radio"><label th:for="'rdi-4-'+${pollData.pollQsq}"><span th:text="${pollData.pollQval4}"></span></label>
-																<input type="text" th:name="'etc_input_'+${pollData.pollQsq}" class="etc_input" />
+																<input type="text" th:name="'etc_input_'+${pollData.pollQsq}" class="form_control etc_input" />
 															</th:block>
 														</li>
 														<li th:if="${pollData.pollQval5 != null && pollData.pollQval5 != ''}">
@@ -104,7 +104,7 @@
 															</th:block>
 															<th:block th:unless="${pollData.pollQval5 != '기타'}">
 																<input type="radio" th:name="${pollData.pollQsq+'_'+(pollStat.index+1)}" th:id="'rdi-5-'+${pollData.pollQsq}" th:value="${pollData.pollQval5}" class="etc_radio"><label th:for="'rdi-5-'+${pollData.pollQsq}"><span th:text="${pollData.pollQval5}"></span></label>
-																<input type="text" th:name="'etc_input_'+${pollData.pollQsq}" class="etc_input" />
+																<input type="text" th:name="'etc_input_'+${pollData.pollQsq}" class="form_control etc_input" />
 															</th:block>
 														</li>
 														<li th:if="${pollData.pollQval6 != null && pollData.pollQval6 != ''}">
@@ -113,7 +113,7 @@
 															</th:block>
 															<th:block th:unless="${pollData.pollQval6 != '기타'}">
 																<input type="radio" th:name="${pollData.pollQsq+'_'+(pollStat.index+1)}" th:id="'rdi-6-'+${pollData.pollQsq}" th:value="${pollData.pollQval6}" class="etc_radio"><label th:for="'rdi-6-'+${pollData.pollQsq}"><span th:text="${pollData.pollQval6}"></span></label>
-																<input type="text" th:name="'etc_input_'+${pollData.pollQsq}" class="etc_input" />
+																<input type="text" th:name="'etc_input_'+${pollData.pollQsq}" class="form_control etc_input" />
 															</th:block>
 														</li>
 														<li th:if="${pollData.pollQval7 != null && pollData.pollQval7 != ''}">
@@ -122,7 +122,7 @@
 															</th:block>
 															<th:block th:unless="${pollData.pollQval7 != '기타'}">
 																<input type="radio" th:name="${pollData.pollQsq+'_'+(pollStat.index+1)}" th:id="'rdi-7-'+${pollData.pollQsq}" th:value="${pollData.pollQval7}" class="etc_radio"><label th:for="'rdi-7-'+${pollData.pollQsq}"><span th:text="${pollData.pollQval7}"></span></label>
-																<input type="text" th:name="'etc_input_'+${pollData.pollQsq}" class="etc_input" />
+																<input type="text" th:name="'etc_input_'+${pollData.pollQsq}" class="form_control etc_input" />
 															</th:block>
 														</li>
 														<li th:if="${pollData.pollQval8 != null && pollData.pollQval8 != ''}">
@@ -131,7 +131,7 @@
 															</th:block>
 															<th:block th:unless="${pollData.pollQval8 != '기타'}">
 																<input type="radio" th:name="${pollData.pollQsq+'_'+(pollStat.index+1)}" th:id="'rdi-8-'+${pollData.pollQsq}" th:value="${pollData.pollQval8}" class="etc_radio"><label th:for="'rdi-8-'+${pollData.pollQsq}"><span th:text="${pollData.pollQval8}"></span></label>
-																<input type="text" th:name="'etc_input_'+${pollData.pollQsq}" class="etc_input" />
+																<input type="text" th:name="'etc_input_'+${pollData.pollQsq}" class="form_control etc_input"/>
 															</th:block>
 														</li>
 														<li th:if="${pollData.pollQval9 != null && pollData.pollQval9 != ''}">
@@ -140,7 +140,7 @@
 															</th:block>
 															<th:block th:unless="${pollData.pollQval9 != '기타'}">
 																<input type="radio" th:name="${pollData.pollQsq+'_'+(pollStat.index+1)}" th:id="'rdi-9-'+${pollData.pollQsq}" th:value="${pollData.pollQval9}"class="etc_radio"><label th:for="'rdi-9-'+${pollData.pollQsq}"><span th:text="${pollData.pollQval9}"></span></label>
-																<input type="text" th:name="'etc_input_'+${pollData.pollQsq}" class="etc_input" />
+																<input type="text" th:name="'etc_input_'+${pollData.pollQsq}" class="form_control etc_input" />
 															</th:block>
 														</li>
 														<li th:if="${pollData.pollQval10 != null && pollData.pollQval10 != ''}">
@@ -149,7 +149,7 @@
 															</th:block>
 															<th:block th:unless="${pollData.pollQval10 != '기타'}">
 																<input type="radio" th:name="${pollData.pollQsq+'_'+(pollStat.index+1)}" th:id="'rdi-10-'+${pollData.pollQsq}" th:value="${pollData.pollQval10}" class="etc_radio"><label th:for="'rdi-10-'+${pollData.pollQsq}"><span th:text="${pollData.pollQval10}"></span></label>
-																<input type="text" th:name="'etc_input_'+${pollData.pollQsq}" class="etc_input" />
+																<input type="text" th:name="'etc_input_'+${pollData.pollQsq}" class="form_control etc_input" />
 															</th:block>
 														</li>
 													</ul>

+ 5 - 0
src/main/webapp/WEB-INF/views/web/popup/DelvAddrAddPopWeb.html

@@ -107,6 +107,11 @@ $(document).ready( function() {
 			}
 		});
 	});
+
+	$(document).on('click','#adrsAddPop .close-modal',function(e){
+		$('#adrsAddPop .modal-dialog .modal-content').html('');
+	});
+
 });
 
 // 배송지등록버튼

+ 4 - 0
src/main/webapp/WEB-INF/views/web/popup/DelvAddrModifyPopWeb.html

@@ -138,6 +138,10 @@ $(document).ready( function() {
 			}
 		});
 	});
+
+	$(document).on('click','#adrsModifyPop .close-modal',function(e){
+		$('#adrsModifyPop .modal-dialog .modal-content').html('');
+	});
 });
 
 // 배송지등록버튼

+ 14 - 0
src/main/webapp/biz/customer.js

@@ -182,3 +182,17 @@ var fnValidationPwdSameConfirmPwd = function (password, confirmPassword) {
 
 	return result;
 };
+/**
+ * 확인 고객이디
+ * @param custId - 아이디
+ * @author jsshin
+ * @since 2021. 06. 11
+ */
+var fnCheckCustId = function (custId) {
+	const regexp = /[^a-zA-Z0-9]/gi;
+	let result = true;
+	if (regexp.test(custId)) {
+		result = false;
+	}
+	return result;
+}

+ 9 - 6
src/main/webapp/ux/style24_link.js

@@ -170,7 +170,7 @@ var cfnOpenCellphoneCertify = function (redirectUrl, custParams) {
 		if (!gagajf.isNull(redirectUrl)) {
 			actionUrl = actionUrl + "?redirectUrl=" + redirectUrl;
 			if (!gagajf.isNull(custParams)) {
-				actionUrl = actionUrl + "&custParams=" + custParams;
+				actionUrl = actionUrl + "&custParams=" + encodeURIComponent(custParams);
 			}
 			document.location.href = actionUrl;
 		}
@@ -427,9 +427,9 @@ var cfnLoginKakao = function (requestGb, chkRememberMe) {
 	let popupX = (window.screen.width / 2) - (popupWidth / 2);
 	let popupY = (window.screen.height / 3) - (popupHeight / 3);
 	if ('P' === _frontGb) {
-		//window.open(actionUrl, 'kakaoLogin', 'top=' + popupY + ',left=' + popupX + ',height=' + popupHeight + ',width=' + popupWidth + ', fullscreen=no,menubar=no,status=no,toolbar=no,titlebar=yes,location=no,scrollbars=yes', '');
+		window.open(actionUrl, 'kakaoLogin', 'top=' + popupY + ',left=' + popupX + ',height=' + popupHeight + ',width=' + popupWidth + ', fullscreen=no,menubar=no,status=no,toolbar=no,titlebar=yes,location=no,scrollbars=yes', '');
 	} else {
-		//document.location.href = actionUrl + '&requestGb=' + requestGb;
+		document.location.href = actionUrl + '&requestGb=' + requestGb;
 	}
 };
 
@@ -1014,19 +1014,22 @@ function cfnPrivacyPolicyLayer(mallGb) {
 	cfnOpenLayer(_PAGE_PRIVACY_POLICY_LAYER, 'policiesPrivacyPop', params);
 }
 
-function cfnSupplyComanyLayer() {
+function cfnSupplyComanyLayer(mallGb) {
 	let str;
 	if (_frontGb === 'P') {
-
+		str ='<div class="modal fade pd_pop psptn_pop" id="supplyCompanyPop" tabIndex="-1" role="dialog" aria-labelledby="psptnLabel" aria-hidden="true"></div>'
 	} else {
 		str = '<div class="modal pop_full fade" id="supplyCompanyPop" role="dialog" aria-labelledby="partnersPopFullLabel" aria-hidden="true"></div>';
 	}
-	if($('#partnersPop').length == 0) {
+	if($('#supplyCompanyPop').length == 0) {
 		$('body').append(str);
 	}
+	let params = {}
+	params.mallGb = mallGb;
 	cfnOpenLayer(_PAGE_SUPPLY_COMPANY_LAYER,'supplyCompanyPop');
 }
 
+
 /**
  * @type   : function
  * @access : public