itn 2023-07-19
등급제 환불관련 로직 추가
@aadc3c1420a4e775f331d0ee9e1b1002db1125d7
src/main/java/itn/let/sym/grd/service/MberGrdService.java
--- src/main/java/itn/let/sym/grd/service/MberGrdService.java
+++ src/main/java/itn/let/sym/grd/service/MberGrdService.java
@@ -46,12 +46,21 @@
 	// 회원별 등급 일괄변경
 	public int updateMberGrdAll(MberGrdVO mberGrdVO) throws Exception;
 	
+	// 회원 등급 변경(환불후) => 기존등급 상관없이 업데이트
+	public int updateMberGrdAfterRefund(MberGrdVO mberGrdVO) throws Exception;
+	
 	// 문자할인, B선라인 대상자 초기화
 	public int updateMberGrdEndBySale(MberGrdVO mberGrdVO) throws Exception;
 	
-	// 회원별 등급 초기화
+	// 전체회원 등급 초기화
 	public int updateMberGrdEndAll(MberGrdVO mberGrdVO) throws Exception;
 
+	// 회원 등급제 종료
+	public int updateMberGrdEndByUser(MberGrdVO mberGrdVO) throws Exception;
+	
+	// 회원 등급제 복원
+	public int updateMberGrdRestoreByUser(MberGrdVO mberGrdVO) throws Exception;
+	
 	// 회원별 등급 적용
 	public void mberGrdSaveByUser(MberGrdVO mberGrdVO) throws Exception;
 	
src/main/java/itn/let/sym/grd/service/impl/MberGrdDAO.java
--- src/main/java/itn/let/sym/grd/service/impl/MberGrdDAO.java
+++ src/main/java/itn/let/sym/grd/service/impl/MberGrdDAO.java
@@ -73,16 +73,31 @@
 		return update("mberGrdDAO.updateMberGrdAll", mberGrdVO);
 	}		
 	
+	// 회원 등급 변경(환불후) => 기존등급 상관없이 업데이트
+	public int updateMberGrdAfterRefund(MberGrdVO mberGrdVO) throws Exception {
+		return update("mberGrdDAO.updateMberGrdAfterRefund", mberGrdVO);
+	}
+	
 	// 문자할인, B선라인 대상자 초기화
 	public int updateMberGrdEndBySale(MberGrdVO mberGrdVO) throws Exception {
 		return update("mberGrdDAO.updateMberGrdEndBySale", mberGrdVO);
 	}		
 	
-	// 회원별 등급 초기화
+	// 전체회원 등급 초기화
 	public int updateMberGrdEndAll(MberGrdVO mberGrdVO) throws Exception {
 		return update("mberGrdDAO.updateMberGrdEndAll", mberGrdVO);
 	}		
 	
+	// 회원 등급제 종료
+	public int updateMberGrdEndByUser(MberGrdVO mberGrdVO) throws Exception {
+		return update("mberGrdDAO.updateMberGrdEndByUser", mberGrdVO);
+	}		
+	
+	// 회원 등급제 복원
+	public int updateMberGrdRestoreByUser(MberGrdVO mberGrdVO) throws Exception {
+		return update("mberGrdDAO.updateMberGrdRestoreByUser", mberGrdVO);
+	}		
+	
 	// 회원별 등급 진행여부
 	public int selectMberGrdPrgCnt(String mberId) throws Exception{
 		return (int) select("mberGrdDAO.selectMberGrdPrgCnt", mberId);
src/main/java/itn/let/sym/grd/service/impl/MberGrdServiceImpl.java
--- src/main/java/itn/let/sym/grd/service/impl/MberGrdServiceImpl.java
+++ src/main/java/itn/let/sym/grd/service/impl/MberGrdServiceImpl.java
@@ -167,16 +167,34 @@
 		return updateCnt1 + updateCnt2;
 	}	
 	
-	// 회원별 등급 초기화
+	// 회원 등급 변경(환불후) => 기존등급 상관없이 업데이트
+	@Override
+	public int updateMberGrdAfterRefund(MberGrdVO mberGrdVO) throws Exception {
+		return mberGrdDAO.updateMberGrdAfterRefund(mberGrdVO);
+	}	
+
+	// 문자할인, B선라인 대상자 초기화
+	@Override
+	public int updateMberGrdEndBySale(MberGrdVO mberGrdVO) throws Exception {
+		return mberGrdDAO.updateMberGrdEndBySale(mberGrdVO);
+	}	
+
+	// 전체회원 등급 초기화
 	@Override
 	public int updateMberGrdEndAll(MberGrdVO mberGrdVO) throws Exception {
 		return mberGrdDAO.updateMberGrdEndAll(mberGrdVO);
 	}	
 	
-	// 문자할인, B선라인 대상자 초기화
+	// 회원 등급제 종료
 	@Override
-	public int updateMberGrdEndBySale(MberGrdVO mberGrdVO) throws Exception {
-		return mberGrdDAO.updateMberGrdEndBySale(mberGrdVO);
+	public int updateMberGrdEndByUser(MberGrdVO mberGrdVO) throws Exception {
+		return mberGrdDAO.updateMberGrdEndByUser(mberGrdVO);
+	}	
+	
+	// 회원 등급제 복원
+	@Override
+	public int updateMberGrdRestoreByUser(MberGrdVO mberGrdVO) throws Exception {
+		return mberGrdDAO.updateMberGrdRestoreByUser(mberGrdVO);
 	}	
 	
 	// 회원별 등급 적용
@@ -217,7 +235,7 @@
 						MberGrdVO mberGrdVO4 = new MberGrdVO();
 						mberGrdVO4 = selectMberGrdSettingDetail(mberGrdVO);
 						if (null != mberGrdVO4) {
-							mberGrdVO.setAmt("0");
+							mberGrdVO.setAmt(mberGrdVO.getAmt());
 					    	mberGrdVO.setTotAmt(mberGrdVO.getTotAmt());
 					    	mberGrdVO.setShortPrice(mberGrdVO4.getShortPrice());
 					    	mberGrdVO.setLongPrice(mberGrdVO4.getLongPrice());
@@ -233,8 +251,8 @@
 							MberGrdVO mberGrdVO5 = new MberGrdVO();
 							mberGrdVO5 = selectMberGrdDetail(mberGrdVO);
 							if (null != mberGrdVO5) {
-								// 업데이트 => 현재 등급보다 낮거나 같으면 업데이트 처리
-								if (mberGrdVO5.getGrdSetNo() >= mberGrdVO.getGrdSetNo()) {
+								// 업데이트 => 기존등급보다 상위등급 대상만 업데이트
+								if (mberGrdVO5.getGrdSetNo() > mberGrdVO.getGrdSetNo()) {
 									updateMberGrd(mberGrdVO);
 									
 									// 회원별 등급 히스토리 인서트
src/main/java/itn/let/sym/grd/web/MberGrdMngController.java
--- src/main/java/itn/let/sym/grd/web/MberGrdMngController.java
+++ src/main/java/itn/let/sym/grd/web/MberGrdMngController.java
@@ -147,8 +147,7 @@
         try{
         	
        		// 회원별 등급 적용
-        	mberGrdVO.setAmt("0");			// 결제금액
-        	mberGrdVO.setMberId("nopay");	// 결제자
+        	mberGrdVO.setAmt("0");
        		mberGrdService.mberGrdSaveByUser(mberGrdVO);
        		
 		}
@@ -235,6 +234,108 @@
 		modelAndView.addObject("msg", msg);
 		
 		return modelAndView;
-	}			    
- 
+	}
+	
+	// 회원 등급제 종료
+	@RequestMapping(value = "/sym/grd/mberGrdEndByUserAjax.do")
+	public ModelAndView mberGrdEndByUserAjax(
+			@ModelAttribute("mberGrdVO") MberGrdVO mberGrdVO) throws Exception {
+
+		ModelAndView modelAndView = new ModelAndView();
+		modelAndView.setViewName("jsonView");
+
+		boolean isSuccess = true;
+		String msg = "";
+   		
+    	// 로그인VO에서  사용자 정보 가져오기
+    	LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
+    	String frstRegisterId = loginVO == null ? "" : loginVO.getId();
+    	mberGrdVO.setEditId(frstRegisterId);		// 최초등록자ID
+
+        try{
+        	
+        	// 회원 등급제 종료
+        	mberGrdService.updateMberGrdEndByUser(mberGrdVO);
+       		
+		}
+		catch(Exception e) {
+			isSuccess = false;
+			msg = e.getMessage();
+		}		
+
+		modelAndView.addObject("isSuccess", isSuccess);
+		modelAndView.addObject("msg", msg);
+		
+		return modelAndView;
+	}	
+	
+	// 회원 등급제 복원
+	@RequestMapping(value = "/sym/grd/mberGrdRestoreByUserAjax.do")
+	public ModelAndView mberGrdRestoreByUserAjax(
+			@ModelAttribute("mberGrdVO") MberGrdVO mberGrdVO) throws Exception {
+
+		ModelAndView modelAndView = new ModelAndView();
+		modelAndView.setViewName("jsonView");
+
+		boolean isSuccess = true;
+		String msg = "";
+   		
+    	// 로그인VO에서  사용자 정보 가져오기
+    	LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
+    	String frstRegisterId = loginVO == null ? "" : loginVO.getId();
+    	mberGrdVO.setEditId(frstRegisterId);		// 최초등록자ID
+
+        try{
+        	
+        	// 회원 등급제 복원
+        	mberGrdService.updateMberGrdRestoreByUser(mberGrdVO);
+        	
+        	// 회원 등급 변경(환불후) => 기존등급 상관없이 업데이트
+        	mberGrdService.updateMberGrdAfterRefund(mberGrdVO);
+       		
+		}
+		catch(Exception e) {
+			isSuccess = false;
+			msg = e.getMessage();
+		}		
+
+		modelAndView.addObject("isSuccess", isSuccess);
+		modelAndView.addObject("msg", msg);
+		
+		return modelAndView;
+	}		
+	
+	// 회원 등급제 갱신
+	@RequestMapping(value = "/sym/grd/mberGrdUpdateByUserAjax.do")
+	public ModelAndView mberGrdUpdateByUserAjax(
+			@ModelAttribute("mberGrdVO") MberGrdVO mberGrdVO) throws Exception {
+
+		ModelAndView modelAndView = new ModelAndView();
+		modelAndView.setViewName("jsonView");
+
+		boolean isSuccess = true;
+		String msg = "";
+   		
+    	// 로그인VO에서  사용자 정보 가져오기
+    	LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
+    	String frstRegisterId = loginVO == null ? "" : loginVO.getId();
+    	mberGrdVO.setEditId(frstRegisterId);		// 최초등록자ID
+
+        try{
+        	
+        	// 회원 등급 변경(환불후) => 기존등급 상관없이 업데이트
+        	mberGrdService.updateMberGrdAfterRefund(mberGrdVO);
+       		
+		}
+		catch(Exception e) {
+			isSuccess = false;
+			msg = e.getMessage();
+		}		
+
+		modelAndView.addObject("isSuccess", isSuccess);
+		modelAndView.addObject("msg", msg);
+		
+		return modelAndView;
+	}	
+	
 }
src/main/resources/egovframework/sqlmap/let/sym/grd/MberGrd_SQL_Mysql.xml
--- src/main/resources/egovframework/sqlmap/let/sym/grd/MberGrd_SQL_Mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/sym/grd/MberGrd_SQL_Mysql.xml
@@ -108,14 +108,14 @@
 			, DATE_FORMAT(A.GRD_END_DATE, '%Y-%m-%d')			AS grdEndDate
 			, A.GRD_STATUS				AS grdStatus
 			, CASE
-				WHEN E.EVENT_STATUS = 'Y' AND DATE_FORMAT(NOW(), '%Y-%m-%d') BETWEEN DATE_FORMAT(E.EVENT_START_DATE, '%Y-%m-%d') AND DATE_FORMAT(E.EVENT_END_DATE, '%Y-%m-%d')
+				WHEN A.GRD_STATUS = 'E'
+				THEN '종료'
+				WHEN A.GRD_STATUS = 'N'
+				THEN '대기'
+				WHEN (A.GRD_STATUS = 'Y' AND NOW() BETWEEN A.GRD_START_DATE AND A.GRD_END_DATE) AND (E.EVENT_STATUS = 'Y' AND DATE_FORMAT(NOW(), '%Y-%m-%d') BETWEEN DATE_FORMAT(E.EVENT_START_DATE, '%Y-%m-%d') AND DATE_FORMAT(E.EVENT_END_DATE, '%Y-%m-%d'))
 				THEN '대기'			
 				WHEN A.GRD_STATUS = 'Y' AND NOW() BETWEEN A.GRD_START_DATE AND A.GRD_END_DATE
 				THEN '진행'
-				WHEN A.GRD_STATUS = 'N'
-				THEN '대기'
-				WHEN A.GRD_STATUS = 'E'
-				THEN '종료'
 				ELSE '종료'
 			END	AS grdStatusNm
 			, A.REG_ID					AS regId
@@ -143,40 +143,40 @@
      	    <isNotEmpty property="searchGrdStatus">
                 <isEqual property="searchGrdStatus" compareValue="Y">
 					AND (CASE
-						WHEN E.EVENT_STATUS = 'Y' AND DATE_FORMAT(NOW(), '%Y-%m-%d') BETWEEN DATE_FORMAT(E.EVENT_START_DATE, '%Y-%m-%d') AND DATE_FORMAT(E.EVENT_END_DATE, '%Y-%m-%d')
+						WHEN A.GRD_STATUS = 'E'
+						THEN '종료'
+						WHEN A.GRD_STATUS = 'N'
+						THEN '대기'					
+						WHEN (A.GRD_STATUS = 'Y' AND NOW() BETWEEN A.GRD_START_DATE AND A.GRD_END_DATE) AND (E.EVENT_STATUS = 'Y' AND DATE_FORMAT(NOW(), '%Y-%m-%d') BETWEEN DATE_FORMAT(E.EVENT_START_DATE, '%Y-%m-%d') AND DATE_FORMAT(E.EVENT_END_DATE, '%Y-%m-%d'))
 						THEN '대기'			
 						WHEN A.GRD_STATUS = 'Y' AND NOW() BETWEEN A.GRD_START_DATE AND A.GRD_END_DATE
 						THEN '진행'
-						WHEN A.GRD_STATUS = 'N'
-						THEN '대기'
-						WHEN A.GRD_STATUS = 'E'
-						THEN '종료'
 						ELSE '종료'
 					END) = '진행'
                 </isEqual>     	    
                 <isEqual property="searchGrdStatus" compareValue="N">
 					AND (CASE
-						WHEN E.EVENT_STATUS = 'Y' AND DATE_FORMAT(NOW(), '%Y-%m-%d') BETWEEN DATE_FORMAT(E.EVENT_START_DATE, '%Y-%m-%d') AND DATE_FORMAT(E.EVENT_END_DATE, '%Y-%m-%d')
+						WHEN A.GRD_STATUS = 'E'
+						THEN '종료'
+						WHEN A.GRD_STATUS = 'N'
+						THEN '대기'					
+						WHEN (A.GRD_STATUS = 'Y' AND NOW() BETWEEN A.GRD_START_DATE AND A.GRD_END_DATE) AND (E.EVENT_STATUS = 'Y' AND DATE_FORMAT(NOW(), '%Y-%m-%d') BETWEEN DATE_FORMAT(E.EVENT_START_DATE, '%Y-%m-%d') AND DATE_FORMAT(E.EVENT_END_DATE, '%Y-%m-%d'))
 						THEN '대기'			
 						WHEN A.GRD_STATUS = 'Y' AND NOW() BETWEEN A.GRD_START_DATE AND A.GRD_END_DATE
 						THEN '진행'
-						WHEN A.GRD_STATUS = 'N'
-						THEN '대기'
-						WHEN A.GRD_STATUS = 'E'
-						THEN '종료'
 						ELSE '종료'
 					END) = '대기'
                 </isEqual>     	    
                 <isEqual property="searchGrdStatus" compareValue="E">
 					AND (CASE
-						WHEN E.EVENT_STATUS = 'Y' AND DATE_FORMAT(NOW(), '%Y-%m-%d') BETWEEN DATE_FORMAT(E.EVENT_START_DATE, '%Y-%m-%d') AND DATE_FORMAT(E.EVENT_END_DATE, '%Y-%m-%d')
+						WHEN A.GRD_STATUS = 'E'
+						THEN '종료'
+						WHEN A.GRD_STATUS = 'N'
+						THEN '대기'					
+						WHEN (A.GRD_STATUS = 'Y' AND NOW() BETWEEN A.GRD_START_DATE AND A.GRD_END_DATE) AND (E.EVENT_STATUS = 'Y' AND DATE_FORMAT(NOW(), '%Y-%m-%d') BETWEEN DATE_FORMAT(E.EVENT_START_DATE, '%Y-%m-%d') AND DATE_FORMAT(E.EVENT_END_DATE, '%Y-%m-%d'))
 						THEN '대기'			
 						WHEN A.GRD_STATUS = 'Y' AND NOW() BETWEEN A.GRD_START_DATE AND A.GRD_END_DATE
 						THEN '진행'
-						WHEN A.GRD_STATUS = 'N'
-						THEN '대기'
-						WHEN A.GRD_STATUS = 'E'
-						THEN '종료'
 						ELSE '종료'
 					END) = '종료'
                 </isEqual>     	                    
@@ -295,26 +295,33 @@
 	<![CDATA[
 		SELECT
 			M.USER_ID AS mberId
+			, M.AMT_SUM_ORIGIN AS amtSumOrigin
+			, M.REFUND_SUM AS refundSum
 			, M.AMT_SUM AS totAmt
 			, M.GRD_SET_NO AS grdSetNo 				
 		FROM (
 			SELECT 
 				S.USER_ID
 				, SUM(S.AMT) AS AMT_SUM_ORIGIN
-				, (SUM(S.AMT) - IFNULL(SS.EVENT_FRST_CASH + ROUND(SS.EVENT_FRST_CASH / 10), 0)) AS AMT_SUM
+				, IFNULL(ROUND(SUM(R.TRNSF_CASH)), 0) AS REFUND_SUM
+				, (SUM(S.AMT) - IFNULL(ROUND(SUM(R.TRNSF_CASH)), 0) - IFNULL(SS.EVENT_FRST_CASH + ROUND(SS.EVENT_FRST_CASH / 10), 0)) AS AMT_SUM
 				, (
-					SELECT MIN(S1.GRD_SET_NO) FROM MJ_MBER_GRD_SETTING S1 WHERE S1.STD_AMT <= (SUM(S.AMT) - IFNULL(SS.EVENT_FRST_CASH + ROUND(SS.EVENT_FRST_CASH / 10), 0))
+					SELECT MIN(S1.GRD_SET_NO) FROM MJ_MBER_GRD_SETTING S1 WHERE S1.STD_AMT <= (SUM(S.AMT) - IFNULL(ROUND(SUM(R.TRNSF_CASH)), 0) - IFNULL(SS.EVENT_FRST_CASH + ROUND(SS.EVENT_FRST_CASH / 10), 0))
 				 ) GRD_SET_NO 
 			FROM MJ_PG S 
 			LEFT OUTER JOIN MJ_EVENT_MBER_INFO SS
 				ON S.USER_ID = SS.MBER_ID
+			LEFT OUTER JOIN MJ_REFUND R
+				ON S.USER_ID = R.MBER_ID 
+				AND R.REFUND_STATUS  = '3' 
+				AND R.REFUND_DIVISION = '1'
 			WHERE S.PG_STATUS = '1'	
 				AND S.REG_DATE >= CONCAT(DATE_FORMAT(#grdDate#, '%Y-%m-%d'), ' ', '00:00:00')
 			GROUP BY S.USER_ID
 		) M
 		WHERE M.GRD_SET_NO IS NOT NULL
 			AND M.AMT_SUM > 0
-			AND M.USER_ID = #mberId#
+			AND M.USER_ID = #mberId#	
 	]]>
 	</select>
 	
@@ -380,7 +387,11 @@
 			MBER_ID = #mberId#
 	</update>	
 	
-	<!-- 회원별 등급 일괄변경 -->
+	<!-- 
+		회원별 등급 일괄변경
+		=> 기존등급보다 상위등급 대상만 업데이트 됨.
+		=> 기존등급과 같거나 좋지않은 경우 제외됨.
+	 -->
 	<update id="mberGrdDAO.updateMberGrdAll" parameterClass="mberGrdVO">
 	<![CDATA[
 		UPDATE MJ_MBER_GRD_INFO A
@@ -388,19 +399,25 @@
 			SELECT
 				M.USER_ID
 				, M.AMT_SUM_ORIGIN
+				, M.REFUND_SUM
 				, M.AMT_SUM
 				, M.GRD_SET_NO 				
 			FROM (
 				SELECT 
 					S.USER_ID
 					, SUM(S.AMT) AS AMT_SUM_ORIGIN
-					, (SUM(S.AMT) - IFNULL(SS.EVENT_FRST_CASH + ROUND(SS.EVENT_FRST_CASH / 10), 0)) AS AMT_SUM
+					, IFNULL(ROUND(SUM(R.TRNSF_CASH)), 0) AS REFUND_SUM
+					, (SUM(S.AMT) - IFNULL(ROUND(SUM(R.TRNSF_CASH)), 0) - IFNULL(SS.EVENT_FRST_CASH + ROUND(SS.EVENT_FRST_CASH / 10), 0)) AS AMT_SUM
 					, (
-						SELECT MIN(S1.GRD_SET_NO) FROM MJ_MBER_GRD_SETTING S1 WHERE S1.STD_AMT <= (SUM(S.AMT) - IFNULL(SS.EVENT_FRST_CASH + ROUND(SS.EVENT_FRST_CASH / 10), 0))
+						SELECT MIN(S1.GRD_SET_NO) FROM MJ_MBER_GRD_SETTING S1 WHERE S1.STD_AMT <= (SUM(S.AMT) - IFNULL(ROUND(SUM(R.TRNSF_CASH)), 0) - IFNULL(SS.EVENT_FRST_CASH + ROUND(SS.EVENT_FRST_CASH / 10), 0))
 					 ) GRD_SET_NO 
 				FROM MJ_PG S 
 				LEFT OUTER JOIN MJ_EVENT_MBER_INFO SS
 					ON S.USER_ID = SS.MBER_ID
+				LEFT OUTER JOIN MJ_REFUND R
+					ON S.USER_ID = R.MBER_ID 
+					AND R.REFUND_STATUS  = '3' 
+					AND R.REFUND_DIVISION = '1'					
 				WHERE S.PG_STATUS = '1'	
 					AND S.REG_DATE >= CONCAT(DATE_FORMAT(#grdDate#, '%Y-%m-%d'), ' ', '00:00:00')
 				GROUP BY S.USER_ID
@@ -428,6 +445,64 @@
 	]]>
 	</update>	
 
+	<!-- 
+		회원 등급 변경(환불후)
+		=> 기존등급 상관없이 업데이트 됨.
+	 -->
+	<update id="mberGrdDAO.updateMberGrdAfterRefund" parameterClass="mberGrdVO">
+	<![CDATA[
+		UPDATE MJ_MBER_GRD_INFO A
+		INNER JOIN (
+			SELECT
+				M.USER_ID
+				, M.AMT_SUM_ORIGIN
+				, M.REFUND_SUM
+				, M.AMT_SUM
+				, M.GRD_SET_NO 				
+			FROM (
+				SELECT 
+					S.USER_ID
+					, SUM(S.AMT) AS AMT_SUM_ORIGIN
+					, IFNULL(ROUND(SUM(R.TRNSF_CASH)), 0) AS REFUND_SUM
+					, (SUM(S.AMT) - IFNULL(ROUND(SUM(R.TRNSF_CASH)), 0) - IFNULL(SS.EVENT_FRST_CASH + ROUND(SS.EVENT_FRST_CASH / 10), 0)) AS AMT_SUM
+					, (
+						SELECT MIN(S1.GRD_SET_NO) FROM MJ_MBER_GRD_SETTING S1 WHERE S1.STD_AMT <= (SUM(S.AMT) - IFNULL(ROUND(SUM(R.TRNSF_CASH)), 0) - IFNULL(SS.EVENT_FRST_CASH + ROUND(SS.EVENT_FRST_CASH / 10), 0))
+					 ) GRD_SET_NO 
+				FROM MJ_PG S 
+				LEFT OUTER JOIN MJ_EVENT_MBER_INFO SS
+					ON S.USER_ID = SS.MBER_ID
+				LEFT OUTER JOIN MJ_REFUND R
+					ON S.USER_ID = R.MBER_ID 
+					AND R.REFUND_STATUS  = '3' 
+					AND R.REFUND_DIVISION = '1'					
+				WHERE S.PG_STATUS = '1'	
+					AND S.REG_DATE >= CONCAT(DATE_FORMAT(#grdDate#, '%Y-%m-%d'), ' ', '00:00:00')
+				GROUP BY S.USER_ID
+			) M
+			WHERE M.GRD_SET_NO IS NOT NULL
+				AND M.AMT_SUM > 0
+		) B
+			ON A.MBER_ID = B.USER_ID
+		INNER JOIN MJ_MBER_GRD_SETTING C
+			ON C.GRD_SET_NO = B.GRD_SET_NO
+		SET
+			A.GRD_SET_NO = C.GRD_SET_NO
+			, A.SHORT_PRICE = C.SHORT_PRICE
+			, A.LONG_PRICE = C.LONG_PRICE
+			, A.PICTURE_PRICE = C.PICTURE_PRICE
+			, A.PICTURE2_PRICE = C.PICTURE2_PRICE
+			, A.PICTURE3_PRICE = C.PICTURE3_PRICE
+			, A.TOT_AMT = B.AMT_SUM
+			, A.GRD_DATE = CONCAT(DATE_FORMAT(#grdDate#, '%Y-%m-%d'), ' ', '00:00:00')
+			, A.EDIT_ID	= #editId#
+			, A.EDIT_DATE = NOW()
+		WHERE B.GRD_SET_NO IS NOT NULL
+			AND A.MBER_ID = #mberId#
+			AND A.GRD_STATUS = 'Y'
+			AND NOW() BETWEEN A.GRD_START_DATE AND A.GRD_END_DATE
+	]]>
+	</update>	
+	
 	<!-- 문자할인, B선라인 대상자 초기화 -->
 	<update id="mberGrdDAO.updateMberGrdEndBySale" parameterClass="mberGrdVO">
 	<![CDATA[
@@ -467,7 +542,7 @@
 	]]>
 	</update>	
 	
-	<!-- 회원별 등급 초기화 -->
+	<!-- 전체회원 등급 초기화 -->
 	<update id="mberGrdDAO.updateMberGrdEndAll" parameterClass="mberGrdVO">
 		UPDATE MJ_MBER_GRD_INFO SET
 			GRD_END_DATE			= NOW()
@@ -478,6 +553,31 @@
 			GRD_STATUS != 'E'
 	</update>	
 		
+	<!-- 회원 등급제 종료 -->
+	<update id="mberGrdDAO.updateMberGrdEndByUser" parameterClass="mberGrdVO">
+		UPDATE MJ_MBER_GRD_INFO SET
+			GRD_END_DATE			= NOW()
+			, GRD_STATUS			= 'E'
+			, EDIT_ID				= #editId#
+			, EDIT_DATE				= NOW()
+		WHERE 
+			GRD_STATUS != 'E'
+			AND MBER_ID = #mberId#
+	</update>	
+			
+	<!-- 회원 등급제 복원 -->
+	<update id="mberGrdDAO.updateMberGrdRestoreByUser" parameterClass="mberGrdVO">
+		UPDATE MJ_MBER_GRD_INFO SET
+			GRD_END_DATE			= NOW()
+			, GRD_STATUS			= 'Y'
+			, GRD_END_DATE			= '9999-12-31 23:59:59'
+			, EDIT_ID				= #editId#
+			, EDIT_DATE				= NOW()
+		WHERE 
+			GRD_STATUS != 'Y'
+			AND MBER_ID = #mberId#
+	</update>	
+				
 	<!-- 회원별 등급 진행여부 -->
 	<select id="mberGrdDAO.selectMberGrdPrgCnt" parameterClass="String" resultClass="Integer">
 		SELECT
src/main/webapp/WEB-INF/jsp/sym/grd/mberGrdList.jsp
--- src/main/webapp/WEB-INF/jsp/sym/grd/mberGrdList.jsp
+++ src/main/webapp/WEB-INF/jsp/sym/grd/mberGrdList.jsp
@@ -24,6 +24,7 @@
 <meta http-equiv="Content-Language" content="ko">
 <title>등급제 내역</title>
 <script type="text/javaScript" language="javascript" defer="defer">
+
 $( document ).ready(function(){
 	// change 함수
 	$("#searchGrdStatus").change(function(e){
@@ -37,8 +38,8 @@
 }
 
 function linkPage(pageNo){
-	var listForm = document.listForm ;
-	listForm.pageIndex.value = pageNo ;
+	var listForm = document.listForm;
+	listForm.pageIndex.value = pageNo;
 	listForm.action = "<c:url value='/sym/grd/selectMberGrdList.do'/>";
 	listForm.submit();
 }
@@ -80,6 +81,109 @@
         }
     });				
 }	
+
+// 회원 등급제 종료
+function setMberGrdEndByUser(mberId) {
+	if(confirm("등급제 종료하시겠습니까?")) {
+		$.ajax({
+	        type: "POST",
+	        url: "/sym/grd/mberGrdEndByUserAjax.do",
+	        data: {"mberId" : mberId},
+	        dataType:'json',
+	        async: false,
+	        success: function (data) {
+				if (data.isSuccess) { 
+					linkPage(document.listForm.pageIndex.value);
+				} 
+				else {
+					alert("Msg : " + data.msg);
+				}
+			},
+	        error: function (e) { 
+	        	alert("ERROR : " + JSON.stringify(e)); 
+	        }
+	    });				
+	}
+}	
+
+// 회원 등급제 복원
+function setMberGrdRestoreByUser(mberId, grdDate) {
+	if(confirm("등급제 복원하시겠습니까?\n등급 다시 계산합니다.")) {
+		$.ajax({
+	        type: "POST",
+	        url: "/sym/grd/mberGrdRestoreByUserAjax.do",
+	        data: {"mberId" : mberId, "grdDate" : grdDate},
+	        dataType:'json',
+	        async: false,
+	        success: function (data) {
+				if (data.isSuccess) { 
+					linkPage(document.listForm.pageIndex.value);
+				} 
+				else {
+					alert("Msg : " + data.msg);
+				}
+			},
+	        error: function (e) { 
+	        	alert("ERROR : " + JSON.stringify(e)); 
+	        }
+	    });				
+	}
+}	
+
+//회원 등급제 갱신
+function setMberGrdUpdateByUser(mberId, grdDate) {
+	if(confirm("등급제 갱신하시겠습니까?\n등급 다시 계산합니다.")) {
+		$.ajax({
+	        type: "POST",
+	        url: "/sym/grd/mberGrdUpdateByUserAjax.do",
+	        data: {"mberId" : mberId, "grdDate" : grdDate},
+	        dataType:'json',
+	        async: false,
+	        success: function (data) {
+				if (data.isSuccess) { 
+					linkPage(document.listForm.pageIndex.value);
+				} 
+				else {
+					alert("Msg : " + data.msg);
+				}
+			},
+	        error: function (e) { 
+	        	alert("ERROR : " + JSON.stringify(e)); 
+	        }
+	    });				
+	}
+}	
+
+// 등급제 추가
+function setMberGrdSave() {
+	var mberId = $("input[name='mberId']").val();
+	if (mberId == "") {
+		alert("아이디를 입력해주세요.");
+		return false;			
+	}
+	
+	if(confirm("해당 아이디 등급제 추가하시겠습니까?")) {
+		$.ajax({
+	        type: "POST",
+	        url: "/sym/grd/mberGrdSaveAjax.do",
+	        data: {"mberId" : mberId},
+	        dataType:'json',
+	        async: false,
+	        success: function (data) {
+				if (data.isSuccess) { 
+					linkPage(document.listForm.pageIndex.value);
+				} 
+				else {
+					alert("Msg : " + data.msg);
+				}
+			},
+	        error: function (e) { 
+	        	alert("ERROR : " + JSON.stringify(e)); 
+	        }
+	    });				
+	}
+}			
+
 </script>
 </head>
 <body>
@@ -117,7 +221,7 @@
 			<div class="listTop">
 				<p class="tType5">
 					총 <span class="tType4 c_456ded fwBold"><fmt:formatNumber value="${paginationInfo.totalRecordCount}" pattern="#,###" /></span>건
-					&nbsp;&nbsp;&nbsp; * 누적결제액은 문자할인이벤트 대상 결제금액을 제외한 합계금액입니다.
+					&nbsp;&nbsp;&nbsp; * 누적결제액은 할인이벤트 결제금액, 환불금액을 제외한 합계금액입니다.
 				</p>
 				<div class="rightWrap">
 					<!-- <input type="button" class="printBtn" > -->
@@ -131,16 +235,18 @@
 			<div class="tableWrap">
 				<table class="tbType1">
 					<colgroup>
-						<col style="width: 8%">
+						<col style="width: 5%">
 						<col style="width: auto;">
-						<col style="width: 10%;">
-						<col style="width: 10%;">
+						<col style="width: 8%;">
+						<col style="width: 8%;">
 						<col style="width: 10%">
+						<col style="width: 9%">
+						<col style="width: 8%">
+						<col style="width: 8%">
 						<col style="width: 12%">
 						<col style="width: 12%">
-						<col style="width: 12%">
-						<col style="width: 12%">
-						<col style="width: 6%">
+						<col style="width: 5%">
+						<col style="width: 8%">
 					</colgroup>
 					<thead>
 						<tr>
@@ -153,7 +259,9 @@
 							<th>시작일<input type="button" class="sortBtn sort" id="sort_grdStartDate"></th>
 							<th>종료일 <input type="button" class="sortBtn sort" id="sort_grdEndDate"></th>
 							<th>등록일 <input type="button" class="sortBtn sort" id="sort_regDate"></th>
+							<th>수정일 <input type="button" class="sortBtn sort" id="sort_editDate"></th>
 							<th>상태<input type="button" class="sortBtn sort" id="sort_grdStatusNm"></th>
+							<th>관리</th>
 						</tr>
 					</thead>
 					<tbody>
@@ -179,7 +287,7 @@
 								<c:out value="${result.grdSetNm}"/>(<c:out value="${result.grdSetNo}"/>)
 					    	</td>
 					    	<td nowrap="nowrap" class="right">
-					    		<fmt:formatNumber value="${result.totAmt}" pattern="#,###" />
+					    		<fmt:formatNumber value="${result.totAmt}" pattern="#,###" />&nbsp;&nbsp;
 					    	</td>
 					    	<td nowrap="nowrap">
 								<c:out value="${result.grdDate}"/>
@@ -194,8 +302,22 @@
 					    		<c:out value="${result.regDate}"/>
 					    	</td>					    
 					   		<td nowrap="nowrap">
+					    		<c:out value="${result.editDate}"/>
+					    	</td>					    					    	
+					   		<td nowrap="nowrap">
 					    		<c:out value="${result.grdStatusNm}"/>
 					    	</td>					    					    	
+					   		<td nowrap="nowrap">
+								<c:choose>
+									<c:when test="${result.grdStatusNm eq '종료'}">
+										<input type="button" class="btnType2" onclick="setMberGrdRestoreByUser('${result.mberId}','${result.grdDate}')" value="복원">
+									</c:when>
+									<c:otherwise>
+										<input type="button" class="btnType2" onclick="setMberGrdUpdateByUser('${result.mberId}','${result.grdDate}')" value="갱신">
+										<input type="button" class="btnType1" onclick="setMberGrdEndByUser('${result.mberId}')" value="종료">
+									</c:otherwise>
+								</c:choose>
+					    	</td>					    					    						    	
 			            </tr>
 					</c:forEach>
 					</tbody>
@@ -205,7 +327,8 @@
 				</table>
 			</div>
 			<div class="btnWrap">
-
+				<input type="text" name="mberId" value="" style="height: 50px; width: 120px;" />
+				<input type="button" class="btnType2" value="등급제 적용테스트" onclick="javascript:setMberGrdSave(); return false;">
 			</div>	
 			
 			<c:if test="${!empty resultList}">
src/main/webapp/WEB-INF/jsp/sym/grd/mberGrdSetting.jsp
--- src/main/webapp/WEB-INF/jsp/sym/grd/mberGrdSetting.jsp
+++ src/main/webapp/WEB-INF/jsp/sym/grd/mberGrdSetting.jsp
@@ -84,32 +84,6 @@
 		}
 	}		
 	
-	// 등급제 적용 테스트
-	function setMberGrdSave() {
-		if(confirm("등급제 적용하시겠습니까?")) {
-			$.ajax({
-		        type: "POST",
-		        url: "/sym/grd/mberGrdSaveAjax.do",
-		        data: {},
-		        dataType:'json',
-		        async: false,
-		        success: function (data) {
-					if (data.isSuccess) { 
-						alert("저장 완료했습니다.");
-						location.reload();
-					} 
-					else {
-						alert("Msg : " + data.msg);
-					}
-				},
-		        error: function (e) { 
-		        	alert("ERROR : " + JSON.stringify(e)); 
-		        }
-		    });				
-		}
-	}			
-	
-	
 	</script>
 </head>
 <body>
@@ -198,7 +172,6 @@
 			<br />
 			<div class="btnWrap">
 				<input type="button" class="btnType2" value="모든 고객 등급 초기화" onclick="javascript:setMberGrdEndMassEdit(); return false;">
-				<input type="button" class="btnType2" value="등급제 적용테스트" onclick="javascript:setMberGrdSave(); return false;">
 				<input type="button" class="btnType1" value="취소" onclick="javascript:location.reload(); return false;">
 				<input type="button" class="btnType1" value="수정" onclick="javascript:setMberGrdSettingMassEdit(); return false;">
 			</div>
Add a comment
List